From c31a46db7f610b2fa4ae9c5fdfff2714a71f745e Mon Sep 17 00:00:00 2001 From: Fsocietyhhh <1211904451@qq.com> Date: Thu, 14 May 2026 14:35:35 -0700 Subject: [PATCH] feat(setup): query Base USDC balance + show OKX fund walkthrough MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After eden's "show what chain to fund + how much" request. The PR #8 wallet-ready box hinted at funding but had no live balance check and no concrete OKX-side steps. Users still asked "do I actually need to fund?" and "where on OKX do I send from?". Changes: - Query Base-chain USDC balance via the existing BalanceMonitor right after OKX login completes (or right after detecting an existing session in the already-signed-in branch). Network/RPC failure is non-fatal — we render "could not query Base RPC" instead of aborting setup. - Add a balance row to the wallet-ready summary box, severity-tagged: empty (< $0.0001) → yellow ⚠ "fund to unlock paid models" low ($0.0001..$1) → yellow ⚠ "recommend $5+" ok (≥ $1) → green ✓ "ready for paid models" - Only render the funding walkthrough when balance is missing/empty/low. Already-funded users see a tight 6-line box; users that need money see the OKX-specific 3-step guide: Fund via OKX (Base network, USDC): 1. Open the OKX app → Wallet 2. Send USDC on Base to the address above 3. ~$5 covers thousands of paid requests Naming OKX explicitly + naming Base explicitly avoids users bridging to a wrong network (the recurring support footgun). - Lazy-import BalanceMonitor so the CLI doesn't pull viem until setup actually needs to query a balance. --- dist/cli.js | 109413 +++++++++++++++++++++++---------------------- dist/cli.js.map | 2 +- src/cli.ts | 110 +- 3 files changed, 55317 insertions(+), 54208 deletions(-) diff --git a/dist/cli.js b/dist/cli.js index 6f58d30..5734b45 100755 --- a/dist/cli.js +++ b/dist/cli.js @@ -985,6 +985,22 @@ var init_exports = __esm({ } }); +// node_modules/viem/_esm/utils/getAction.js +function getAction(client, actionFn, name) { + const action_implicit = client[actionFn.name]; + if (typeof action_implicit === "function") + return action_implicit; + const action_explicit = client[name]; + if (typeof action_explicit === "function") + return action_explicit; + return (params) => actionFn(client, params); +} +var init_getAction = __esm({ + "node_modules/viem/_esm/utils/getAction.js"() { + "use strict"; + } +}); + // node_modules/viem/_esm/utils/abi/formatAbiItem.js function formatAbiItem2(abiItem, { includeName = false } = {}) { if (abiItem.type !== "function" && abiItem.type !== "event" && abiItem.type !== "error") @@ -1448,6 +1464,22 @@ var init_abi = __esm({ } }); +// node_modules/viem/_esm/errors/log.js +var FilterTypeNotSupportedError; +var init_log = __esm({ + "node_modules/viem/_esm/errors/log.js"() { + "use strict"; + init_base(); + FilterTypeNotSupportedError = class extends BaseError2 { + constructor(type) { + super(`Filter type "${type}" is not supported.`, { + name: "FilterTypeNotSupportedError" + }); + } + }; + } +}); + // node_modules/viem/_esm/errors/data.js var SliceOffsetOutOfBoundsError, SizeExceedsPaddingSizeError, InvalidBytesLengthError; var init_data = __esm({ @@ -2845,6 +2877,114 @@ var init_getAbiItem = __esm({ } }); +// node_modules/viem/_esm/utils/abi/encodeEventTopics.js +function encodeEventTopics(parameters) { + const { abi: abi2, eventName, args } = parameters; + let abiItem = abi2[0]; + if (eventName) { + const item = getAbiItem({ abi: abi2, name: eventName }); + if (!item) + throw new AbiEventNotFoundError(eventName, { docsPath }); + abiItem = item; + } + if (abiItem.type !== "event") + throw new AbiEventNotFoundError(void 0, { docsPath }); + const definition = formatAbiItem2(abiItem); + const signature2 = toEventSelector(definition); + let topics = []; + if (args && "inputs" in abiItem) { + const indexedInputs = abiItem.inputs?.filter((param) => "indexed" in param && param.indexed); + const args_ = Array.isArray(args) ? args : Object.values(args).length > 0 ? indexedInputs?.map((x) => args[x.name]) ?? [] : []; + if (args_.length > 0) { + topics = indexedInputs?.map((param, i) => { + if (Array.isArray(args_[i])) + return args_[i].map((_, j) => encodeArg({ param, value: args_[i][j] })); + return typeof args_[i] !== "undefined" && args_[i] !== null ? encodeArg({ param, value: args_[i] }) : null; + }) ?? []; + } + } + return [signature2, ...topics]; +} +function encodeArg({ param, value }) { + if (param.type === "string" || param.type === "bytes") + return keccak256(toBytes(value)); + if (param.type === "tuple" || param.type.match(/^(.*)\[(\d+)?\]$/)) + throw new FilterTypeNotSupportedError(param.type); + return encodeAbiParameters([param], [value]); +} +var docsPath; +var init_encodeEventTopics = __esm({ + "node_modules/viem/_esm/utils/abi/encodeEventTopics.js"() { + "use strict"; + init_abi(); + init_log(); + init_toBytes(); + init_keccak256(); + init_toEventSelector(); + init_encodeAbiParameters(); + init_formatAbiItem2(); + init_getAbiItem(); + docsPath = "/docs/contract/encodeEventTopics"; + } +}); + +// node_modules/viem/_esm/utils/filters/createFilterRequestScope.js +function createFilterRequestScope(client, { method }) { + const requestMap = {}; + if (client.transport.type === "fallback") + client.transport.onResponse?.(({ method: method_, response: id, status, transport }) => { + if (status === "success" && method === method_) + requestMap[id] = transport.request; + }); + return ((id) => requestMap[id] || client.request); +} +var init_createFilterRequestScope = __esm({ + "node_modules/viem/_esm/utils/filters/createFilterRequestScope.js"() { + "use strict"; + } +}); + +// node_modules/viem/_esm/actions/public/createContractEventFilter.js +async function createContractEventFilter(client, parameters) { + const { address: address2, abi: abi2, args, eventName, fromBlock, strict, toBlock } = parameters; + const getRequest = createFilterRequestScope(client, { + method: "eth_newFilter" + }); + const topics = eventName ? encodeEventTopics({ + abi: abi2, + args, + eventName + }) : void 0; + const id = await client.request({ + method: "eth_newFilter", + params: [ + { + address: address2, + fromBlock: typeof fromBlock === "bigint" ? numberToHex(fromBlock) : fromBlock, + toBlock: typeof toBlock === "bigint" ? numberToHex(toBlock) : toBlock, + topics + } + ] + }); + return { + abi: abi2, + args, + eventName, + id, + request: getRequest(id), + strict: Boolean(strict), + type: "event" + }; +} +var init_createContractEventFilter = __esm({ + "node_modules/viem/_esm/actions/public/createContractEventFilter.js"() { + "use strict"; + init_encodeEventTopics(); + init_toHex(); + init_createFilterRequestScope(); + } +}); + // node_modules/viem/_esm/accounts/utils/parseAccount.js function parseAccount(account) { if (typeof account === "string") @@ -4524,6 +4664,46 @@ var init_rpc = __esm({ } }); +// node_modules/viem/_esm/utils/errors/getContractError.js +function getContractError(err, { abi: abi2, address: address2, args, docsPath: docsPath8, functionName, sender }) { + const error = err instanceof RawContractError ? err : err instanceof BaseError2 ? err.walk((err2) => "data" in err2) || err.walk() : {}; + const { code, data, details, message, shortMessage } = error; + const cause = (() => { + if (err instanceof AbiDecodingZeroDataError) + return new ContractFunctionZeroDataError({ functionName, cause: err }); + if ([EXECUTION_REVERTED_ERROR_CODE, InternalRpcError.code].includes(code) && (data || details || message || shortMessage) || code === InvalidInputRpcError.code && details === "execution reverted" && data) { + return new ContractFunctionRevertedError({ + abi: abi2, + data: typeof data === "object" ? data.data : data, + functionName, + message: error instanceof RpcRequestError ? details : shortMessage ?? message, + cause: err + }); + } + return err; + })(); + return new ContractFunctionExecutionError(cause, { + abi: abi2, + args, + contractAddress: address2, + docsPath: docsPath8, + functionName, + sender + }); +} +var EXECUTION_REVERTED_ERROR_CODE; +var init_getContractError = __esm({ + "node_modules/viem/_esm/utils/errors/getContractError.js"() { + "use strict"; + init_abi(); + init_base(); + init_contract(); + init_request(); + init_rpc(); + EXECUTION_REVERTED_ERROR_CODE = 3; + } +}); + // node_modules/viem/_esm/accounts/utils/publicKeyToAddress.js function publicKeyToAddress(publicKey) { const address2 = keccak256(`0x${publicKey.substring(4)}`).substring(26); @@ -7262,6 +7442,58 @@ var init_secp256k1 = __esm({ } }); +// node_modules/viem/_esm/utils/signature/recoverPublicKey.js +async function recoverPublicKey({ hash: hash3, signature: signature2 }) { + const hashHex = isHex(hash3) ? hash3 : toHex(hash3); + const { secp256k1: secp256k14 } = await Promise.resolve().then(() => (init_secp256k1(), secp256k1_exports)); + const signature_ = (() => { + if (typeof signature2 === "object" && "r" in signature2 && "s" in signature2) { + const { r, s: s3, v, yParity } = signature2; + const yParityOrV2 = Number(yParity ?? v); + const recoveryBit2 = toRecoveryBit(yParityOrV2); + return new secp256k14.Signature(hexToBigInt(r), hexToBigInt(s3)).addRecoveryBit(recoveryBit2); + } + const signatureHex = isHex(signature2) ? signature2 : toHex(signature2); + if (size(signatureHex) !== 65) + throw new Error("invalid signature length"); + const yParityOrV = hexToNumber(`0x${signatureHex.slice(130)}`); + const recoveryBit = toRecoveryBit(yParityOrV); + return secp256k14.Signature.fromCompact(signatureHex.substring(2, 130)).addRecoveryBit(recoveryBit); + })(); + const publicKey = signature_.recoverPublicKey(hashHex.substring(2)).toHex(false); + return `0x${publicKey}`; +} +function toRecoveryBit(yParityOrV) { + if (yParityOrV === 0 || yParityOrV === 1) + return yParityOrV; + if (yParityOrV === 27) + return 0; + if (yParityOrV === 28) + return 1; + throw new Error("Invalid yParityOrV value"); +} +var init_recoverPublicKey = __esm({ + "node_modules/viem/_esm/utils/signature/recoverPublicKey.js"() { + "use strict"; + init_isHex(); + init_size(); + init_fromHex(); + init_toHex(); + } +}); + +// node_modules/viem/_esm/utils/signature/recoverAddress.js +async function recoverAddress({ hash: hash3, signature: signature2 }) { + return publicKeyToAddress(await recoverPublicKey({ hash: hash3, signature: signature2 })); +} +var init_recoverAddress = __esm({ + "node_modules/viem/_esm/utils/signature/recoverAddress.js"() { + "use strict"; + init_publicKeyToAddress(); + init_recoverPublicKey(); + } +}); + // node_modules/viem/_esm/utils/encoding/toRlp.js function toRlp(bytes, to = "hex") { const encodable = getEncodable(bytes); @@ -7387,6 +7619,66 @@ var init_hashAuthorization = __esm({ } }); +// node_modules/viem/_esm/utils/authorization/recoverAuthorizationAddress.js +async function recoverAuthorizationAddress(parameters) { + const { authorization, signature: signature2 } = parameters; + return recoverAddress({ + hash: hashAuthorization(authorization), + signature: signature2 ?? authorization + }); +} +var init_recoverAuthorizationAddress = __esm({ + "node_modules/viem/_esm/utils/authorization/recoverAuthorizationAddress.js"() { + "use strict"; + init_recoverAddress(); + init_hashAuthorization(); + } +}); + +// node_modules/viem/_esm/errors/estimateGas.js +var EstimateGasExecutionError; +var init_estimateGas = __esm({ + "node_modules/viem/_esm/errors/estimateGas.js"() { + "use strict"; + init_formatEther(); + init_formatGwei(); + init_base(); + init_transaction(); + EstimateGasExecutionError = class extends BaseError2 { + constructor(cause, { account, docsPath: docsPath8, chain: chain3, data, gas, gasPrice, maxFeePerGas, maxPriorityFeePerGas, nonce, to, value }) { + const prettyArgs = prettyPrint({ + from: account?.address, + to, + value: typeof value !== "undefined" && `${formatEther(value)} ${chain3?.nativeCurrency?.symbol || "ETH"}`, + data, + gas, + gasPrice: typeof gasPrice !== "undefined" && `${formatGwei(gasPrice)} gwei`, + maxFeePerGas: typeof maxFeePerGas !== "undefined" && `${formatGwei(maxFeePerGas)} gwei`, + maxPriorityFeePerGas: typeof maxPriorityFeePerGas !== "undefined" && `${formatGwei(maxPriorityFeePerGas)} gwei`, + nonce + }); + super(cause.shortMessage, { + cause, + docsPath: docsPath8, + metaMessages: [ + ...cause.metaMessages ? [...cause.metaMessages, " "] : [], + "Estimate Gas Arguments:", + prettyArgs + ].filter(Boolean), + name: "EstimateGasExecutionError" + }); + Object.defineProperty(this, "cause", { + enumerable: true, + configurable: true, + writable: true, + value: void 0 + }); + this.cause = cause; + } + }; + } +}); + // node_modules/viem/_esm/errors/node.js var ExecutionRevertedError, FeeCapTooHighError, FeeCapTooLowError, NonceTooHighError, NonceTooLowError, NonceMaxValueError, InsufficientFundsError, IntrinsicGasTooHighError, IntrinsicGasTooLowError, TransactionTypeNotSupportedError, TipAboveFeeCapError, UnknownNodeError; var init_node = __esm({ @@ -7630,6 +7922,28 @@ var init_getNodeError = __esm({ } }); +// node_modules/viem/_esm/utils/errors/getEstimateGasError.js +function getEstimateGasError(err, { docsPath: docsPath8, ...args }) { + const cause = (() => { + const cause2 = getNodeError(err, args); + if (cause2 instanceof UnknownNodeError) + return err; + return cause2; + })(); + return new EstimateGasExecutionError(cause, { + docsPath: docsPath8, + ...args + }); +} +var init_getEstimateGasError = __esm({ + "node_modules/viem/_esm/utils/errors/getEstimateGasError.js"() { + "use strict"; + init_estimateGas(); + init_node(); + init_getNodeError(); + } +}); + // node_modules/viem/_esm/utils/formatters/extract.js function extract(value_, { format }) { if (!format) @@ -7939,6 +8253,322 @@ var init_assertRequest = __esm({ } }); +// node_modules/viem/_esm/errors/fee.js +var BaseFeeScalarError, Eip1559FeesNotSupportedError, MaxFeePerGasTooLowError; +var init_fee = __esm({ + "node_modules/viem/_esm/errors/fee.js"() { + "use strict"; + init_formatGwei(); + init_base(); + BaseFeeScalarError = class extends BaseError2 { + constructor() { + super("`baseFeeMultiplier` must be greater than 1.", { + name: "BaseFeeScalarError" + }); + } + }; + Eip1559FeesNotSupportedError = class extends BaseError2 { + constructor() { + super("Chain does not support EIP-1559 fees.", { + name: "Eip1559FeesNotSupportedError" + }); + } + }; + MaxFeePerGasTooLowError = class extends BaseError2 { + constructor({ maxPriorityFeePerGas }) { + super(`\`maxFeePerGas\` cannot be less than the \`maxPriorityFeePerGas\` (${formatGwei(maxPriorityFeePerGas)} gwei).`, { name: "MaxFeePerGasTooLowError" }); + } + }; + } +}); + +// node_modules/viem/_esm/errors/block.js +var BlockNotFoundError; +var init_block = __esm({ + "node_modules/viem/_esm/errors/block.js"() { + "use strict"; + init_base(); + BlockNotFoundError = class extends BaseError2 { + constructor({ blockHash, blockNumber }) { + let identifier = "Block"; + if (blockHash) + identifier = `Block at hash "${blockHash}"`; + if (blockNumber) + identifier = `Block at number "${blockNumber}"`; + super(`${identifier} could not be found.`, { name: "BlockNotFoundError" }); + } + }; + } +}); + +// node_modules/viem/_esm/utils/formatters/transaction.js +function formatTransaction(transaction, _) { + const transaction_ = { + ...transaction, + blockHash: transaction.blockHash ? transaction.blockHash : null, + blockNumber: transaction.blockNumber ? BigInt(transaction.blockNumber) : null, + chainId: transaction.chainId ? hexToNumber(transaction.chainId) : void 0, + gas: transaction.gas ? BigInt(transaction.gas) : void 0, + gasPrice: transaction.gasPrice ? BigInt(transaction.gasPrice) : void 0, + maxFeePerBlobGas: transaction.maxFeePerBlobGas ? BigInt(transaction.maxFeePerBlobGas) : void 0, + maxFeePerGas: transaction.maxFeePerGas ? BigInt(transaction.maxFeePerGas) : void 0, + maxPriorityFeePerGas: transaction.maxPriorityFeePerGas ? BigInt(transaction.maxPriorityFeePerGas) : void 0, + nonce: transaction.nonce ? hexToNumber(transaction.nonce) : void 0, + to: transaction.to ? transaction.to : null, + transactionIndex: transaction.transactionIndex ? Number(transaction.transactionIndex) : null, + type: transaction.type ? transactionType[transaction.type] : void 0, + typeHex: transaction.type ? transaction.type : void 0, + value: transaction.value ? BigInt(transaction.value) : void 0, + v: transaction.v ? BigInt(transaction.v) : void 0 + }; + if (transaction.authorizationList) + transaction_.authorizationList = formatAuthorizationList2(transaction.authorizationList); + transaction_.yParity = (() => { + if (transaction.yParity) + return Number(transaction.yParity); + if (typeof transaction_.v === "bigint") { + if (transaction_.v === 0n || transaction_.v === 27n) + return 0; + if (transaction_.v === 1n || transaction_.v === 28n) + return 1; + if (transaction_.v >= 35n) + return transaction_.v % 2n === 0n ? 1 : 0; + } + return void 0; + })(); + if (transaction_.type === "legacy") { + delete transaction_.accessList; + delete transaction_.maxFeePerBlobGas; + delete transaction_.maxFeePerGas; + delete transaction_.maxPriorityFeePerGas; + delete transaction_.yParity; + } + if (transaction_.type === "eip2930") { + delete transaction_.maxFeePerBlobGas; + delete transaction_.maxFeePerGas; + delete transaction_.maxPriorityFeePerGas; + } + if (transaction_.type === "eip1559") + delete transaction_.maxFeePerBlobGas; + return transaction_; +} +function formatAuthorizationList2(authorizationList) { + return authorizationList.map((authorization) => ({ + address: authorization.address, + chainId: Number(authorization.chainId), + nonce: Number(authorization.nonce), + r: authorization.r, + s: authorization.s, + yParity: Number(authorization.yParity) + })); +} +var transactionType, defineTransaction; +var init_transaction2 = __esm({ + "node_modules/viem/_esm/utils/formatters/transaction.js"() { + "use strict"; + init_fromHex(); + init_formatter(); + transactionType = { + "0x0": "legacy", + "0x1": "eip2930", + "0x2": "eip1559", + "0x3": "eip4844", + "0x4": "eip7702" + }; + defineTransaction = /* @__PURE__ */ defineFormatter("transaction", formatTransaction); + } +}); + +// node_modules/viem/_esm/utils/formatters/block.js +function formatBlock(block, _) { + const transactions = (block.transactions ?? []).map((transaction) => { + if (typeof transaction === "string") + return transaction; + return formatTransaction(transaction); + }); + return { + ...block, + baseFeePerGas: block.baseFeePerGas ? BigInt(block.baseFeePerGas) : null, + blobGasUsed: block.blobGasUsed ? BigInt(block.blobGasUsed) : void 0, + difficulty: block.difficulty ? BigInt(block.difficulty) : void 0, + excessBlobGas: block.excessBlobGas ? BigInt(block.excessBlobGas) : void 0, + gasLimit: block.gasLimit ? BigInt(block.gasLimit) : void 0, + gasUsed: block.gasUsed ? BigInt(block.gasUsed) : void 0, + hash: block.hash ? block.hash : null, + logsBloom: block.logsBloom ? block.logsBloom : null, + nonce: block.nonce ? block.nonce : null, + number: block.number ? BigInt(block.number) : null, + size: block.size ? BigInt(block.size) : void 0, + timestamp: block.timestamp ? BigInt(block.timestamp) : void 0, + transactions, + totalDifficulty: block.totalDifficulty ? BigInt(block.totalDifficulty) : null + }; +} +var defineBlock; +var init_block2 = __esm({ + "node_modules/viem/_esm/utils/formatters/block.js"() { + "use strict"; + init_formatter(); + init_transaction2(); + defineBlock = /* @__PURE__ */ defineFormatter("block", formatBlock); + } +}); + +// node_modules/viem/_esm/actions/public/getBlock.js +async function getBlock(client, { blockHash, blockNumber, blockTag = client.experimental_blockTag ?? "latest", includeTransactions: includeTransactions_ } = {}) { + const includeTransactions = includeTransactions_ ?? false; + const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; + let block = null; + if (blockHash) { + block = await client.request({ + method: "eth_getBlockByHash", + params: [blockHash, includeTransactions] + }, { dedupe: true }); + } else { + block = await client.request({ + method: "eth_getBlockByNumber", + params: [blockNumberHex || blockTag, includeTransactions] + }, { dedupe: Boolean(blockNumberHex) }); + } + if (!block) + throw new BlockNotFoundError({ blockHash, blockNumber }); + const format = client.chain?.formatters?.block?.format || formatBlock; + return format(block, "getBlock"); +} +var init_getBlock = __esm({ + "node_modules/viem/_esm/actions/public/getBlock.js"() { + "use strict"; + init_block(); + init_toHex(); + init_block2(); + } +}); + +// node_modules/viem/_esm/actions/public/getGasPrice.js +async function getGasPrice(client) { + const gasPrice = await client.request({ + method: "eth_gasPrice" + }); + return BigInt(gasPrice); +} +var init_getGasPrice = __esm({ + "node_modules/viem/_esm/actions/public/getGasPrice.js"() { + "use strict"; + } +}); + +// node_modules/viem/_esm/actions/public/estimateMaxPriorityFeePerGas.js +async function estimateMaxPriorityFeePerGas(client, args) { + return internal_estimateMaxPriorityFeePerGas(client, args); +} +async function internal_estimateMaxPriorityFeePerGas(client, args) { + const { block: block_, chain: chain3 = client.chain, request } = args || {}; + try { + const maxPriorityFeePerGas = chain3?.fees?.maxPriorityFeePerGas ?? chain3?.fees?.defaultPriorityFee; + if (typeof maxPriorityFeePerGas === "function") { + const block = block_ || await getAction(client, getBlock, "getBlock")({}); + const maxPriorityFeePerGas_ = await maxPriorityFeePerGas({ + block, + client, + request + }); + if (maxPriorityFeePerGas_ === null) + throw new Error(); + return maxPriorityFeePerGas_; + } + if (typeof maxPriorityFeePerGas !== "undefined") + return maxPriorityFeePerGas; + const maxPriorityFeePerGasHex = await client.request({ + method: "eth_maxPriorityFeePerGas" + }); + return hexToBigInt(maxPriorityFeePerGasHex); + } catch { + const [block, gasPrice] = await Promise.all([ + block_ ? Promise.resolve(block_) : getAction(client, getBlock, "getBlock")({}), + getAction(client, getGasPrice, "getGasPrice")({}) + ]); + if (typeof block.baseFeePerGas !== "bigint") + throw new Eip1559FeesNotSupportedError(); + const maxPriorityFeePerGas = gasPrice - block.baseFeePerGas; + if (maxPriorityFeePerGas < 0n) + return 0n; + return maxPriorityFeePerGas; + } +} +var init_estimateMaxPriorityFeePerGas = __esm({ + "node_modules/viem/_esm/actions/public/estimateMaxPriorityFeePerGas.js"() { + "use strict"; + init_fee(); + init_fromHex(); + init_getAction(); + init_getBlock(); + init_getGasPrice(); + } +}); + +// node_modules/viem/_esm/actions/public/estimateFeesPerGas.js +async function estimateFeesPerGas(client, args) { + return internal_estimateFeesPerGas(client, args); +} +async function internal_estimateFeesPerGas(client, args) { + const { block: block_, chain: chain3 = client.chain, request, type = "eip1559" } = args || {}; + const baseFeeMultiplier = await (async () => { + if (typeof chain3?.fees?.baseFeeMultiplier === "function") + return chain3.fees.baseFeeMultiplier({ + block: block_, + client, + request + }); + return chain3?.fees?.baseFeeMultiplier ?? 1.2; + })(); + if (baseFeeMultiplier < 1) + throw new BaseFeeScalarError(); + const decimals = baseFeeMultiplier.toString().split(".")[1]?.length ?? 0; + const denominator = 10 ** decimals; + const multiply = (base2) => base2 * BigInt(Math.ceil(baseFeeMultiplier * denominator)) / BigInt(denominator); + const block = block_ ? block_ : await getAction(client, getBlock, "getBlock")({}); + if (typeof chain3?.fees?.estimateFeesPerGas === "function") { + const fees = await chain3.fees.estimateFeesPerGas({ + block: block_, + client, + multiply, + request, + type + }); + if (fees !== null) + return fees; + } + if (type === "eip1559") { + if (typeof block.baseFeePerGas !== "bigint") + throw new Eip1559FeesNotSupportedError(); + const maxPriorityFeePerGas = typeof request?.maxPriorityFeePerGas === "bigint" ? request.maxPriorityFeePerGas : await internal_estimateMaxPriorityFeePerGas(client, { + block, + chain: chain3, + request + }); + const baseFeePerGas = multiply(block.baseFeePerGas); + const maxFeePerGas = request?.maxFeePerGas ?? baseFeePerGas + maxPriorityFeePerGas; + return { + maxFeePerGas, + maxPriorityFeePerGas + }; + } + const gasPrice = request?.gasPrice ?? multiply(await getAction(client, getGasPrice, "getGasPrice")({})); + return { + gasPrice + }; +} +var init_estimateFeesPerGas = __esm({ + "node_modules/viem/_esm/actions/public/estimateFeesPerGas.js"() { + "use strict"; + init_fee(); + init_getAction(); + init_estimateMaxPriorityFeePerGas(); + init_getBlock(); + init_getGasPrice(); + } +}); + // node_modules/viem/_esm/actions/public/getTransactionCount.js async function getTransactionCount(client, { address: address2, blockTag = "latest", blockNumber }) { const count = await client.request({ @@ -8226,812 +8856,1638 @@ var init_getTransactionType = __esm({ } }); -// node_modules/viem/_esm/utils/address/isAddressEqual.js -function isAddressEqual(a, b) { - if (!isAddress(a, { strict: false })) - throw new InvalidAddressError({ address: a }); - if (!isAddress(b, { strict: false })) - throw new InvalidAddressError({ address: b }); - return a.toLowerCase() === b.toLowerCase(); +// node_modules/viem/_esm/utils/errors/getTransactionError.js +function getTransactionError(err, { docsPath: docsPath8, ...args }) { + const cause = (() => { + const cause2 = getNodeError(err, args); + if (cause2 instanceof UnknownNodeError) + return err; + return cause2; + })(); + return new TransactionExecutionError(cause, { + docsPath: docsPath8, + ...args + }); } -var init_isAddressEqual = __esm({ - "node_modules/viem/_esm/utils/address/isAddressEqual.js"() { +var init_getTransactionError = __esm({ + "node_modules/viem/_esm/utils/errors/getTransactionError.js"() { "use strict"; - init_address(); - init_isAddress(); + init_node(); + init_transaction(); + init_getNodeError(); } }); -// node_modules/viem/_esm/utils/abi/decodeFunctionResult.js -function decodeFunctionResult(parameters) { - const { abi: abi2, args, functionName, data } = parameters; - let abiItem = abi2[0]; - if (functionName) { - const item = getAbiItem({ abi: abi2, args, name: functionName }); - if (!item) - throw new AbiFunctionNotFoundError(functionName, { docsPath: docsPath4 }); - abiItem = item; - } - if (abiItem.type !== "function") - throw new AbiFunctionNotFoundError(void 0, { docsPath: docsPath4 }); - if (!abiItem.outputs) - throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath: docsPath4 }); - const values = decodeAbiParameters(abiItem.outputs, data); - if (values && values.length > 1) - return values; - if (values && values.length === 1) - return values[0]; - return void 0; +// node_modules/viem/_esm/actions/public/getChainId.js +async function getChainId(client) { + const chainIdHex = await client.request({ + method: "eth_chainId" + }, { dedupe: true }); + return hexToNumber(chainIdHex); } -var docsPath4; -var init_decodeFunctionResult = __esm({ - "node_modules/viem/_esm/utils/abi/decodeFunctionResult.js"() { +var init_getChainId = __esm({ + "node_modules/viem/_esm/actions/public/getChainId.js"() { "use strict"; - init_abi(); - init_decodeAbiParameters(); - init_getAbiItem(); - docsPath4 = "/docs/contract/decodeFunctionResult"; + init_fromHex(); } }); -// node_modules/ox/node_modules/@noble/curves/esm/abstract/utils.js -function isBytes3(a) { - return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; -} -function abytes3(item) { - if (!isBytes3(item)) - throw new Error("Uint8Array expected"); -} -function abool2(title, value) { - if (typeof value !== "boolean") - throw new Error(title + " boolean expected, got " + value); -} -function numberToHexUnpadded2(num2) { - const hex = num2.toString(16); - return hex.length & 1 ? "0" + hex : hex; -} -function hexToNumber3(hex) { - if (typeof hex !== "string") - throw new Error("hex string expected, got " + typeof hex); - return hex === "" ? _0n7 : BigInt("0x" + hex); -} -function bytesToHex3(bytes) { - abytes3(bytes); - if (hasHexBuiltin2) - return bytes.toHex(); - let hex = ""; - for (let i = 0; i < bytes.length; i++) { - hex += hexes3[bytes[i]]; - } - return hex; -} -function asciiToBase162(ch) { - if (ch >= asciis2._0 && ch <= asciis2._9) - return ch - asciis2._0; - if (ch >= asciis2.A && ch <= asciis2.F) - return ch - (asciis2.A - 10); - if (ch >= asciis2.a && ch <= asciis2.f) - return ch - (asciis2.a - 10); - return; -} -function hexToBytes3(hex) { - if (typeof hex !== "string") - throw new Error("hex string expected, got " + typeof hex); - if (hasHexBuiltin2) - return Uint8Array.fromHex(hex); - const hl = hex.length; - const al = hl / 2; - if (hl % 2) - throw new Error("hex string expected, got unpadded hex of length " + hl); - const array = new Uint8Array(al); - for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) { - const n1 = asciiToBase162(hex.charCodeAt(hi)); - const n2 = asciiToBase162(hex.charCodeAt(hi + 1)); - if (n1 === void 0 || n2 === void 0) { - const char = hex[hi] + hex[hi + 1]; - throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi); - } - array[ai] = n1 * 16 + n2; +// node_modules/viem/_esm/actions/public/fillTransaction.js +async function fillTransaction(client, parameters) { + const { account = client.account, accessList, authorizationList, chain: chain3 = client.chain, blobVersionedHashes, blobs, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, nonce: nonce_, nonceManager, to, type, value, ...rest } = parameters; + const nonce = await (async () => { + if (!account) + return nonce_; + if (!nonceManager) + return nonce_; + if (typeof nonce_ !== "undefined") + return nonce_; + const account_ = parseAccount(account); + const chainId = chain3 ? chain3.id : await getAction(client, getChainId, "getChainId")({}); + return await nonceManager.consume({ + address: account_.address, + chainId, + client + }); + })(); + assertRequest(parameters); + const chainFormat = chain3?.formatters?.transactionRequest?.format; + const format = chainFormat || formatTransactionRequest; + const request = format({ + // Pick out extra data that might exist on the chain's transaction request type. + ...extract(rest, { format: chainFormat }), + account: account ? parseAccount(account) : void 0, + accessList, + authorizationList, + blobs, + blobVersionedHashes, + data, + gas, + gasPrice, + maxFeePerBlobGas, + maxFeePerGas, + maxPriorityFeePerGas, + nonce, + to, + type, + value + }, "fillTransaction"); + try { + const response = await client.request({ + method: "eth_fillTransaction", + params: [request] + }); + const format2 = chain3?.formatters?.transaction?.format || formatTransaction; + const transaction = format2(response.tx); + delete transaction.blockHash; + delete transaction.blockNumber; + delete transaction.r; + delete transaction.s; + delete transaction.transactionIndex; + delete transaction.v; + delete transaction.yParity; + transaction.data = transaction.input; + if (transaction.gas) + transaction.gas = parameters.gas ?? transaction.gas; + if (transaction.gasPrice) + transaction.gasPrice = parameters.gasPrice ?? transaction.gasPrice; + if (transaction.maxFeePerBlobGas) + transaction.maxFeePerBlobGas = parameters.maxFeePerBlobGas ?? transaction.maxFeePerBlobGas; + if (transaction.maxFeePerGas) + transaction.maxFeePerGas = parameters.maxFeePerGas ?? transaction.maxFeePerGas; + if (transaction.maxPriorityFeePerGas) + transaction.maxPriorityFeePerGas = parameters.maxPriorityFeePerGas ?? transaction.maxPriorityFeePerGas; + if (transaction.nonce) + transaction.nonce = parameters.nonce ?? transaction.nonce; + const feeMultiplier = await (async () => { + if (typeof chain3?.fees?.baseFeeMultiplier === "function") { + const block = await getAction(client, getBlock, "getBlock")({}); + return chain3.fees.baseFeeMultiplier({ + block, + client, + request: parameters + }); + } + return chain3?.fees?.baseFeeMultiplier ?? 1.2; + })(); + if (feeMultiplier < 1) + throw new BaseFeeScalarError(); + const decimals = feeMultiplier.toString().split(".")[1]?.length ?? 0; + const denominator = 10 ** decimals; + const multiplyFee = (base2) => base2 * BigInt(Math.ceil(feeMultiplier * denominator)) / BigInt(denominator); + if (transaction.maxFeePerGas && !parameters.maxFeePerGas) + transaction.maxFeePerGas = multiplyFee(transaction.maxFeePerGas); + if (transaction.gasPrice && !parameters.gasPrice) + transaction.gasPrice = multiplyFee(transaction.gasPrice); + return { + raw: response.raw, + transaction: { + from: request.from, + ...transaction + } + }; + } catch (err) { + throw getTransactionError(err, { + ...parameters, + chain: client.chain + }); } - return array; -} -function bytesToNumberBE2(bytes) { - return hexToNumber3(bytesToHex3(bytes)); -} -function bytesToNumberLE2(bytes) { - abytes3(bytes); - return hexToNumber3(bytesToHex3(Uint8Array.from(bytes).reverse())); -} -function numberToBytesBE2(n, len) { - return hexToBytes3(n.toString(16).padStart(len * 2, "0")); -} -function numberToBytesLE2(n, len) { - return numberToBytesBE2(n, len).reverse(); } -function ensureBytes2(title, hex, expectedLength) { - let res; - if (typeof hex === "string") { - try { - res = hexToBytes3(hex); - } catch (e7) { - throw new Error(title + " must be hex string or Uint8Array, cause: " + e7); - } - } else if (isBytes3(hex)) { - res = Uint8Array.from(hex); - } else { - throw new Error(title + " must be hex string or Uint8Array"); +var init_fillTransaction = __esm({ + "node_modules/viem/_esm/actions/public/fillTransaction.js"() { + "use strict"; + init_parseAccount(); + init_fee(); + init_getTransactionError(); + init_extract(); + init_transaction2(); + init_transactionRequest(); + init_getAction(); + init_assertRequest(); + init_getBlock(); + init_getChainId(); } - const len = res.length; - if (typeof expectedLength === "number" && len !== expectedLength) - throw new Error(title + " of length " + expectedLength + " expected, got " + len); - return res; -} -function concatBytes4(...arrays) { - let sum = 0; - for (let i = 0; i < arrays.length; i++) { - const a = arrays[i]; - abytes3(a); - sum += a.length; +}); + +// node_modules/viem/_esm/actions/wallet/prepareTransactionRequest.js +async function prepareTransactionRequest(client, args) { + let request = args; + request.account ??= client.account; + request.parameters ??= defaultParameters; + const { account: account_, chain: chain3 = client.chain, nonceManager, parameters } = request; + const prepareTransactionRequest2 = (() => { + if (typeof chain3?.prepareTransactionRequest === "function") + return { + fn: chain3.prepareTransactionRequest, + runAt: ["beforeFillTransaction"] + }; + if (Array.isArray(chain3?.prepareTransactionRequest)) + return { + fn: chain3.prepareTransactionRequest[0], + runAt: chain3.prepareTransactionRequest[1].runAt + }; + return void 0; + })(); + let chainId; + async function getChainId2() { + if (chainId) + return chainId; + if (typeof request.chainId !== "undefined") + return request.chainId; + if (chain3) + return chain3.id; + const chainId_ = await getAction(client, getChainId, "getChainId")({}); + chainId = chainId_; + return chainId; } - const res = new Uint8Array(sum); - for (let i = 0, pad4 = 0; i < arrays.length; i++) { - const a = arrays[i]; - res.set(a, pad4); - pad4 += a.length; + const account = account_ ? parseAccount(account_) : account_; + let nonce = request.nonce; + if (parameters.includes("nonce") && typeof nonce === "undefined" && account && nonceManager) { + const chainId2 = await getChainId2(); + nonce = await nonceManager.consume({ + address: account.address, + chainId: chainId2, + client + }); } - return res; -} -function inRange2(n, min, max) { - return isPosBig2(n) && isPosBig2(min) && isPosBig2(max) && min <= n && n < max; -} -function aInRange2(title, n, min, max) { - if (!inRange2(n, min, max)) - throw new Error("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n); -} -function bitLen2(n) { - let len; - for (len = 0; n > _0n7; n >>= _1n7, len += 1) - ; - return len; -} -function createHmacDrbg2(hashLen, qByteLen, hmacFn) { - if (typeof hashLen !== "number" || hashLen < 2) - throw new Error("hashLen must be a number"); - if (typeof qByteLen !== "number" || qByteLen < 2) - throw new Error("qByteLen must be a number"); - if (typeof hmacFn !== "function") - throw new Error("hmacFn must be a function"); - let v = u8n2(hashLen); - let k = u8n2(hashLen); - let i = 0; - const reset = () => { - v.fill(1); - k.fill(0); - i = 0; - }; - const h = (...b) => hmacFn(k, v, ...b); - const reseed = (seed = u8n2(0)) => { - k = h(u8fr2([0]), seed); - v = h(); - if (seed.length === 0) - return; - k = h(u8fr2([1]), seed); - v = h(); + if (prepareTransactionRequest2?.fn && prepareTransactionRequest2.runAt?.includes("beforeFillTransaction")) { + request = await prepareTransactionRequest2.fn({ ...request, chain: chain3 }, { + phase: "beforeFillTransaction" + }); + nonce ??= request.nonce; + } + const attemptFill = (() => { + if ((parameters.includes("blobVersionedHashes") || parameters.includes("sidecars")) && request.kzg && request.blobs) + return false; + if (supportsFillTransaction.get(client.uid) === false) + return false; + const shouldAttempt = ["fees", "gas"].some((parameter) => parameters.includes(parameter)); + if (!shouldAttempt) + return false; + if (parameters.includes("chainId") && typeof request.chainId !== "number") + return true; + if (parameters.includes("nonce") && typeof nonce !== "number") + return true; + if (parameters.includes("fees") && typeof request.gasPrice !== "bigint" && (typeof request.maxFeePerGas !== "bigint" || typeof request.maxPriorityFeePerGas !== "bigint")) + return true; + if (parameters.includes("gas") && typeof request.gas !== "bigint") + return true; + return false; + })(); + const fillResult = attemptFill ? await getAction(client, fillTransaction, "fillTransaction")({ ...request, nonce }).then((result) => { + const { chainId: chainId2, from: from14, gas: gas2, gasPrice, nonce: nonce2, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, type: type2, ...rest } = result.transaction; + supportsFillTransaction.set(client.uid, true); + return { + ...request, + ...from14 ? { from: from14 } : {}, + ...type2 && !request.type ? { type: type2 } : {}, + ...typeof chainId2 !== "undefined" ? { chainId: chainId2 } : {}, + ...typeof gas2 !== "undefined" ? { gas: gas2 } : {}, + ...typeof gasPrice !== "undefined" ? { gasPrice } : {}, + ...typeof nonce2 !== "undefined" ? { nonce: nonce2 } : {}, + ...typeof maxFeePerBlobGas !== "undefined" && request.type !== "legacy" && request.type !== "eip2930" ? { maxFeePerBlobGas } : {}, + ...typeof maxFeePerGas !== "undefined" && request.type !== "legacy" && request.type !== "eip2930" ? { maxFeePerGas } : {}, + ...typeof maxPriorityFeePerGas !== "undefined" && request.type !== "legacy" && request.type !== "eip2930" ? { maxPriorityFeePerGas } : {}, + ..."nonceKey" in rest && typeof rest.nonceKey !== "undefined" ? { nonceKey: rest.nonceKey } : {}, + ..."keyAuthorization" in rest && typeof rest.keyAuthorization !== "undefined" && rest.keyAuthorization !== null && !("keyAuthorization" in request) ? { keyAuthorization: rest.keyAuthorization } : {} + }; + }).catch((e7) => { + const error = e7; + if (error.name !== "TransactionExecutionError") + return request; + const executionReverted = error.walk?.((e8) => { + const error2 = e8; + return error2.name === "ExecutionRevertedError"; + }); + if (executionReverted) + throw e7; + const unsupported = error.walk?.((e8) => { + const error2 = e8; + return error2.name === "MethodNotFoundRpcError" || error2.name === "MethodNotSupportedRpcError" || error2.message?.includes("eth_fillTransaction is not available"); + }); + if (unsupported) + supportsFillTransaction.set(client.uid, false); + return request; + }) : request; + nonce ??= fillResult.nonce; + request = { + ...fillResult, + ...account ? { from: account?.address } : {}, + ...nonce ? { nonce } : {} }; - const gen2 = () => { - if (i++ >= 1e3) - throw new Error("drbg: tried 1000 values"); - let len = 0; - const out = []; - while (len < qByteLen) { - v = h(); - const sl = v.slice(); - out.push(sl); - len += v.length; + const { blobs, gas, kzg, type } = request; + if (prepareTransactionRequest2?.fn && prepareTransactionRequest2.runAt?.includes("beforeFillParameters")) { + request = await prepareTransactionRequest2.fn({ ...request, chain: chain3 }, { + phase: "beforeFillParameters" + }); + } + let block; + async function getBlock2() { + if (block) + return block; + block = await getAction(client, getBlock, "getBlock")({ blockTag: "latest" }); + return block; + } + if (parameters.includes("nonce") && typeof nonce === "undefined" && account && !nonceManager) + request.nonce = await getAction(client, getTransactionCount, "getTransactionCount")({ + address: account.address, + blockTag: "pending" + }); + if ((parameters.includes("blobVersionedHashes") || parameters.includes("sidecars")) && blobs && kzg) { + const commitments = blobsToCommitments({ blobs, kzg }); + if (parameters.includes("blobVersionedHashes")) { + const versionedHashes = commitmentsToVersionedHashes({ + commitments, + to: "hex" + }); + request.blobVersionedHashes = versionedHashes; } - return concatBytes4(...out); - }; - const genUntil = (seed, pred) => { - reset(); - reseed(seed); - let res = void 0; - while (!(res = pred(gen2()))) - reseed(); - reset(); - return res; - }; - return genUntil; -} -function validateObject2(object, validators, optValidators = {}) { - const checkField = (fieldName, type, isOptional) => { - const checkVal = validatorFns2[type]; - if (typeof checkVal !== "function") - throw new Error("invalid validator function"); - const val = object[fieldName]; - if (isOptional && val === void 0) - return; - if (!checkVal(val, object)) { - throw new Error("param " + String(fieldName) + " is invalid. Expected " + type + ", got " + val); + if (parameters.includes("sidecars")) { + const proofs = blobsToProofs({ blobs, commitments, kzg }); + const sidecars = toBlobSidecars({ + blobs, + commitments, + proofs, + to: "hex" + }); + request.sidecars = sidecars; } - }; - for (const [fieldName, type] of Object.entries(validators)) - checkField(fieldName, type, false); - for (const [fieldName, type] of Object.entries(optValidators)) - checkField(fieldName, type, true); - return object; + } + if (parameters.includes("chainId")) + request.chainId = await getChainId2(); + if ((parameters.includes("fees") || parameters.includes("type")) && typeof type === "undefined") { + try { + request.type = getTransactionType(request); + } catch { + let isEip1559Network = eip1559NetworkCache.get(client.uid); + if (typeof isEip1559Network === "undefined") { + const block2 = await getBlock2(); + isEip1559Network = typeof block2?.baseFeePerGas === "bigint"; + eip1559NetworkCache.set(client.uid, isEip1559Network); + } + request.type = isEip1559Network ? "eip1559" : "legacy"; + } + } + if (parameters.includes("fees")) { + if (request.type !== "legacy" && request.type !== "eip2930") { + if (typeof request.maxFeePerGas === "undefined" || typeof request.maxPriorityFeePerGas === "undefined") { + const block2 = await getBlock2(); + const { maxFeePerGas, maxPriorityFeePerGas } = await internal_estimateFeesPerGas(client, { + block: block2, + chain: chain3, + request + }); + if (typeof request.maxPriorityFeePerGas === "undefined" && request.maxFeePerGas && request.maxFeePerGas < maxPriorityFeePerGas) + throw new MaxFeePerGasTooLowError({ + maxPriorityFeePerGas + }); + request.maxPriorityFeePerGas = maxPriorityFeePerGas; + request.maxFeePerGas = maxFeePerGas; + } + } else { + if (typeof request.maxFeePerGas !== "undefined" || typeof request.maxPriorityFeePerGas !== "undefined") + throw new Eip1559FeesNotSupportedError(); + if (typeof request.gasPrice === "undefined") { + const block2 = await getBlock2(); + const { gasPrice: gasPrice_ } = await internal_estimateFeesPerGas(client, { + block: block2, + chain: chain3, + request, + type: "legacy" + }); + request.gasPrice = gasPrice_; + } + } + } + if (parameters.includes("gas") && typeof gas === "undefined") + request.gas = await getAction(client, estimateGas, "estimateGas")({ + ...request, + account, + prepare: account?.type === "local" ? [] : ["blobVersionedHashes"] + }); + if (prepareTransactionRequest2?.fn && prepareTransactionRequest2.runAt?.includes("afterFillParameters")) + request = await prepareTransactionRequest2.fn({ ...request, chain: chain3 }, { + phase: "afterFillParameters" + }); + assertRequest(request); + delete request.parameters; + return request; } -function memoized2(fn) { - const map = /* @__PURE__ */ new WeakMap(); - return (arg, ...args) => { - const val = map.get(arg); - if (val !== void 0) - return val; - const computed = fn(arg, ...args); - map.set(arg, computed); - return computed; - }; +var defaultParameters, eip1559NetworkCache, supportsFillTransaction; +var init_prepareTransactionRequest = __esm({ + "node_modules/viem/_esm/actions/wallet/prepareTransactionRequest.js"() { + "use strict"; + init_parseAccount(); + init_estimateFeesPerGas(); + init_estimateGas2(); + init_getBlock(); + init_getTransactionCount(); + init_fee(); + init_blobsToCommitments(); + init_blobsToProofs(); + init_commitmentsToVersionedHashes(); + init_toBlobSidecars(); + init_getAction(); + init_lru(); + init_assertRequest(); + init_getTransactionType(); + init_fillTransaction(); + init_getChainId(); + defaultParameters = [ + "blobVersionedHashes", + "chainId", + "fees", + "gas", + "nonce", + "type" + ]; + eip1559NetworkCache = /* @__PURE__ */ new Map(); + supportsFillTransaction = /* @__PURE__ */ new LruMap(128); + } +}); + +// node_modules/viem/_esm/actions/public/estimateGas.js +async function estimateGas(client, args) { + const { account: account_ = client.account, prepare = true } = args; + const account = account_ ? parseAccount(account_) : void 0; + const parameters = (() => { + if (Array.isArray(prepare)) + return prepare; + if (account?.type !== "local") + return ["blobVersionedHashes"]; + return void 0; + })(); + try { + const to = await (async () => { + if (args.to) + return args.to; + if (args.authorizationList && args.authorizationList.length > 0) + return await recoverAuthorizationAddress({ + authorization: args.authorizationList[0] + }).catch(() => { + throw new BaseError2("`to` is required. Could not infer from `authorizationList`"); + }); + return void 0; + })(); + const { accessList, authorizationList, blobs, blobVersionedHashes, blockNumber, blockTag, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, nonce, value, stateOverride, ...rest } = prepare ? await prepareTransactionRequest(client, { + ...args, + parameters, + to + }) : args; + if (gas && args.gas !== gas) + return gas; + const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; + const block = blockNumberHex || blockTag; + const rpcStateOverride = serializeStateOverride(stateOverride); + assertRequest(args); + const chainFormat = client.chain?.formatters?.transactionRequest?.format; + const format = chainFormat || formatTransactionRequest; + const request = format({ + // Pick out extra data that might exist on the chain's transaction request type. + ...extract(rest, { format: chainFormat }), + account, + accessList, + authorizationList, + blobs, + blobVersionedHashes, + data, + gasPrice, + maxFeePerBlobGas, + maxFeePerGas, + maxPriorityFeePerGas, + nonce, + to, + value + }, "estimateGas"); + return BigInt(await client.request({ + method: "eth_estimateGas", + params: rpcStateOverride ? [ + request, + block ?? client.experimental_blockTag ?? "latest", + rpcStateOverride + ] : block ? [request, block] : [request] + })); + } catch (err) { + throw getEstimateGasError(err, { + ...args, + account, + chain: client.chain + }); + } } -var _0n7, _1n7, hasHexBuiltin2, hexes3, asciis2, isPosBig2, bitMask2, u8n2, u8fr2, validatorFns2; -var init_utils5 = __esm({ - "node_modules/ox/node_modules/@noble/curves/esm/abstract/utils.js"() { +var init_estimateGas2 = __esm({ + "node_modules/viem/_esm/actions/public/estimateGas.js"() { "use strict"; - _0n7 = /* @__PURE__ */ BigInt(0); - _1n7 = /* @__PURE__ */ BigInt(1); - hasHexBuiltin2 = // @ts-ignore - typeof Uint8Array.from([]).toHex === "function" && typeof Uint8Array.fromHex === "function"; - hexes3 = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0")); - asciis2 = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; - isPosBig2 = (n) => typeof n === "bigint" && _0n7 <= n; - bitMask2 = (n) => (_1n7 << BigInt(n)) - _1n7; - u8n2 = (len) => new Uint8Array(len); - u8fr2 = (arr) => Uint8Array.from(arr); - validatorFns2 = { - bigint: (val) => typeof val === "bigint", - function: (val) => typeof val === "function", - boolean: (val) => typeof val === "boolean", - string: (val) => typeof val === "string", - stringOrUint8Array: (val) => typeof val === "string" || isBytes3(val), - isSafeInteger: (val) => Number.isSafeInteger(val), - array: (val) => Array.isArray(val), - field: (val, object) => object.Fp.isValid(val), - hash: (val) => typeof val === "function" && Number.isSafeInteger(val.outputLen) - }; + init_parseAccount(); + init_base(); + init_recoverAuthorizationAddress(); + init_toHex(); + init_getEstimateGasError(); + init_extract(); + init_transactionRequest(); + init_stateOverride2(); + init_assertRequest(); + init_prepareTransactionRequest(); } }); -// node_modules/ox/_esm/core/version.js -var version3; -var init_version3 = __esm({ - "node_modules/ox/_esm/core/version.js"() { +// node_modules/viem/_esm/actions/public/estimateContractGas.js +async function estimateContractGas(client, parameters) { + const { abi: abi2, address: address2, args, functionName, dataSuffix = typeof client.dataSuffix === "string" ? client.dataSuffix : client.dataSuffix?.value, ...request } = parameters; + const data = encodeFunctionData({ + abi: abi2, + args, + functionName + }); + try { + const gas = await getAction(client, estimateGas, "estimateGas")({ + data: `${data}${dataSuffix ? dataSuffix.replace("0x", "") : ""}`, + to: address2, + ...request + }); + return gas; + } catch (error) { + const account = request.account ? parseAccount(request.account) : void 0; + throw getContractError(error, { + abi: abi2, + address: address2, + args, + docsPath: "/docs/contract/estimateContractGas", + functionName, + sender: account?.address + }); + } +} +var init_estimateContractGas = __esm({ + "node_modules/viem/_esm/actions/public/estimateContractGas.js"() { "use strict"; - version3 = "0.1.1"; + init_parseAccount(); + init_encodeFunctionData(); + init_getContractError(); + init_getAction(); + init_estimateGas2(); } }); -// node_modules/ox/_esm/core/internal/errors.js -function getVersion() { - return version3; +// node_modules/viem/_esm/utils/address/isAddressEqual.js +function isAddressEqual(a, b) { + if (!isAddress(a, { strict: false })) + throw new InvalidAddressError({ address: a }); + if (!isAddress(b, { strict: false })) + throw new InvalidAddressError({ address: b }); + return a.toLowerCase() === b.toLowerCase(); } -var init_errors2 = __esm({ - "node_modules/ox/_esm/core/internal/errors.js"() { +var init_isAddressEqual = __esm({ + "node_modules/viem/_esm/utils/address/isAddressEqual.js"() { "use strict"; - init_version3(); + init_address(); + init_isAddress(); } }); -// node_modules/ox/_esm/core/Errors.js -function walk2(err, fn) { - if (fn?.(err)) - return err; - if (err && typeof err === "object" && "cause" in err && err.cause) - return walk2(err.cause, fn); - return fn ? null : err; +// node_modules/viem/_esm/utils/formatters/log.js +function formatLog(log, { args, eventName } = {}) { + return { + ...log, + blockHash: log.blockHash ? log.blockHash : null, + blockNumber: log.blockNumber ? BigInt(log.blockNumber) : null, + blockTimestamp: log.blockTimestamp ? BigInt(log.blockTimestamp) : log.blockTimestamp === null ? null : void 0, + logIndex: log.logIndex ? Number(log.logIndex) : null, + transactionHash: log.transactionHash ? log.transactionHash : null, + transactionIndex: log.transactionIndex ? Number(log.transactionIndex) : null, + ...eventName ? { args, eventName } : {} + }; } -var BaseError3; -var init_Errors = __esm({ - "node_modules/ox/_esm/core/Errors.js"() { +var init_log2 = __esm({ + "node_modules/viem/_esm/utils/formatters/log.js"() { "use strict"; - init_errors2(); - BaseError3 = class _BaseError extends Error { - static setStaticOptions(options) { - _BaseError.prototype.docsOrigin = options.docsOrigin; - _BaseError.prototype.showVersion = options.showVersion; - _BaseError.prototype.version = options.version; - } - constructor(shortMessage, options = {}) { - const details = (() => { - if (options.cause instanceof _BaseError) { - if (options.cause.details) - return options.cause.details; - if (options.cause.shortMessage) - return options.cause.shortMessage; - } - if (options.cause && "details" in options.cause && typeof options.cause.details === "string") - return options.cause.details; - if (options.cause?.message) - return options.cause.message; - return options.details; - })(); - const docsPath8 = (() => { - if (options.cause instanceof _BaseError) - return options.cause.docsPath || options.docsPath; - return options.docsPath; - })(); - const docsBaseUrl = options.docsOrigin ?? _BaseError.prototype.docsOrigin; - const docs = `${docsBaseUrl}${docsPath8 ?? ""}`; - const showVersion = Boolean(options.version ?? _BaseError.prototype.showVersion); - const version4 = options.version ?? _BaseError.prototype.version; - const message = [ - shortMessage || "An error occurred.", - ...options.metaMessages ? ["", ...options.metaMessages] : [], - ...details || docsPath8 || showVersion ? [ - "", - details ? `Details: ${details}` : void 0, - docsPath8 ? `See: ${docs}` : void 0, - showVersion ? `Version: ${version4}` : void 0 - ] : [] - ].filter((x) => typeof x === "string").join("\n"); - super(message, options.cause ? { cause: options.cause } : void 0); - Object.defineProperty(this, "details", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "docs", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "docsOrigin", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "docsPath", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "shortMessage", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "showVersion", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "version", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "cause", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "BaseError" - }); - this.cause = options.cause; - this.details = details; - this.docs = docs; - this.docsOrigin = docsBaseUrl; - this.docsPath = docsPath8; - this.shortMessage = shortMessage; - this.showVersion = showVersion; - this.version = version4; - } - walk(fn) { - return walk2(this, fn); - } - }; - Object.defineProperty(BaseError3, "defaultStaticOptions", { - enumerable: true, - configurable: true, - writable: true, - value: { - docsOrigin: "https://oxlib.sh", - showVersion: false, - version: `ox@${getVersion()}` - } - }); - (() => { - BaseError3.setStaticOptions(BaseError3.defaultStaticOptions); - })(); } }); -// node_modules/ox/_esm/core/internal/bytes.js -function assertSize2(bytes, size_) { - if (size2(bytes) > size_) - throw new SizeOverflowError2({ - givenSize: size2(bytes), - maxSize: size_ - }); -} -function assertStartOffset2(value, start) { - if (typeof start === "number" && start > 0 && start > size2(value) - 1) - throw new SliceOffsetOutOfBoundsError2({ - offset: start, - position: "start", - size: size2(value) - }); -} -function assertEndOffset2(value, start, end) { - if (typeof start === "number" && typeof end === "number" && size2(value) !== end - start) { - throw new SliceOffsetOutOfBoundsError2({ - offset: end, - position: "end", - size: size2(value) +// node_modules/viem/_esm/utils/abi/decodeEventLog.js +function decodeEventLog(parameters) { + const { abi: abi2, data, strict: strict_, topics } = parameters; + const strict = strict_ ?? true; + const [signature2, ...argTopics] = topics; + if (!signature2) + throw new AbiEventSignatureEmptyTopicsError({ docsPath: docsPath3 }); + const abiItem = abi2.find((x) => x.type === "event" && signature2 === toEventSelector(formatAbiItem2(x))); + if (!(abiItem && "name" in abiItem) || abiItem.type !== "event") + throw new AbiEventSignatureNotFoundError(signature2, { docsPath: docsPath3 }); + const { name, inputs } = abiItem; + const isUnnamed = inputs?.some((x) => !("name" in x && x.name)); + const args = isUnnamed ? [] : {}; + const indexedInputs = inputs.map((x, i) => [x, i]).filter(([x]) => "indexed" in x && x.indexed); + const missingIndexedInputs = []; + for (let i = 0; i < indexedInputs.length; i++) { + const [param, argIndex] = indexedInputs[i]; + const topic = argTopics[i]; + if (!topic) { + if (strict) + throw new DecodeLogTopicsMismatch({ + abiItem, + param + }); + missingIndexedInputs.push([param, argIndex]); + continue; + } + args[isUnnamed ? argIndex : param.name || argIndex] = decodeTopic({ + param, + value: topic }); } + const nonIndexedInputs = inputs.filter((x) => !("indexed" in x && x.indexed)); + const inputsToDecode = strict ? nonIndexedInputs : [...missingIndexedInputs.map(([param]) => param), ...nonIndexedInputs]; + if (inputsToDecode.length > 0) { + if (data && data !== "0x") { + try { + const decodedData = decodeAbiParameters(inputsToDecode, data); + if (decodedData) { + let dataIndex = 0; + if (!strict) { + for (const [param, argIndex] of missingIndexedInputs) { + args[isUnnamed ? argIndex : param.name || argIndex] = decodedData[dataIndex++]; + } + } + if (isUnnamed) { + for (let i = 0; i < inputs.length; i++) + if (args[i] === void 0 && dataIndex < decodedData.length) + args[i] = decodedData[dataIndex++]; + } else + for (let i = 0; i < nonIndexedInputs.length; i++) + args[nonIndexedInputs[i].name] = decodedData[dataIndex++]; + } + } catch (err) { + if (strict) { + if (err instanceof AbiDecodingDataSizeTooSmallError || err instanceof PositionOutOfBoundsError) + throw new DecodeLogDataMismatch({ + abiItem, + data, + params: inputsToDecode, + size: size(data) + }); + throw err; + } + } + } else if (strict) { + throw new DecodeLogDataMismatch({ + abiItem, + data: "0x", + params: inputsToDecode, + size: 0 + }); + } + } + return { + eventName: name, + args: Object.values(args).length > 0 ? args : void 0 + }; } -function charCodeToBase162(char) { - if (char >= charCodeMap2.zero && char <= charCodeMap2.nine) - return char - charCodeMap2.zero; - if (char >= charCodeMap2.A && char <= charCodeMap2.F) - return char - (charCodeMap2.A - 10); - if (char >= charCodeMap2.a && char <= charCodeMap2.f) - return char - (charCodeMap2.a - 10); - return void 0; +function decodeTopic({ param, value }) { + if (param.type === "string" || param.type === "bytes" || param.type === "tuple" || param.type.match(/^(.*)\[(\d+)?\]$/)) + return value; + const decodedArg = decodeAbiParameters([param], value) || []; + return decodedArg[0]; } -function pad2(bytes, options = {}) { - const { dir, size: size5 = 32 } = options; - if (size5 === 0) - return bytes; - if (bytes.length > size5) - throw new SizeExceedsPaddingSizeError2({ - size: bytes.length, - targetSize: size5, - type: "Bytes" - }); - const paddedBytes = new Uint8Array(size5); - for (let i = 0; i < size5; i++) { - const padEnd = dir === "right"; - paddedBytes[padEnd ? i : size5 - i - 1] = bytes[padEnd ? i : bytes.length - i - 1]; +var docsPath3; +var init_decodeEventLog = __esm({ + "node_modules/viem/_esm/utils/abi/decodeEventLog.js"() { + "use strict"; + init_abi(); + init_cursor(); + init_size(); + init_toEventSelector(); + init_decodeAbiParameters(); + init_formatAbiItem2(); + docsPath3 = "/docs/contract/decodeEventLog"; } - return paddedBytes; +}); + +// node_modules/viem/_esm/utils/abi/parseEventLogs.js +function parseEventLogs(parameters) { + const { abi: abi2, args, logs, strict = true } = parameters; + const eventName = (() => { + if (!parameters.eventName) + return void 0; + if (Array.isArray(parameters.eventName)) + return parameters.eventName; + return [parameters.eventName]; + })(); + const abiTopics = abi2.filter((abiItem) => abiItem.type === "event").map((abiItem) => ({ + abi: abiItem, + selector: toEventSelector(abiItem) + })); + return logs.map((log) => { + const formattedLog = typeof log.blockNumber === "string" ? formatLog(log) : log; + const abiItems = abiTopics.filter((abiTopic) => formattedLog.topics[0] === abiTopic.selector); + if (abiItems.length === 0) + return null; + let event; + let abiItem; + for (const item of abiItems) { + try { + event = decodeEventLog({ + ...formattedLog, + abi: [item.abi], + strict: true + }); + abiItem = item; + break; + } catch { + } + } + if (!event && !strict) { + abiItem = abiItems[0]; + try { + event = decodeEventLog({ + data: formattedLog.data, + topics: formattedLog.topics, + abi: [abiItem.abi], + strict: false + }); + } catch { + const isUnnamed = abiItem.abi.inputs?.some((x) => !("name" in x && x.name)); + return { + ...formattedLog, + args: isUnnamed ? [] : {}, + eventName: abiItem.abi.name + }; + } + } + if (!event || !abiItem) + return null; + if (eventName && !eventName.includes(event.eventName)) + return null; + if (!includesArgs({ + args: event.args, + inputs: abiItem.abi.inputs, + matchArgs: args + })) + return null; + return { ...event, ...formattedLog }; + }).filter(Boolean); } -function trim2(value, options = {}) { - const { dir = "left" } = options; - let data = value; - let sliceLength = 0; - for (let i = 0; i < data.length - 1; i++) { - if (data[dir === "left" ? i : data.length - i - 1].toString() === "0") - sliceLength++; - else - break; +function includesArgs(parameters) { + const { args, inputs, matchArgs } = parameters; + if (!matchArgs) + return true; + if (!args) + return false; + function isEqual2(input, value, arg) { + try { + if (input.type === "address") + return isAddressEqual(value, arg); + if (input.type === "string" || input.type === "bytes") + return keccak256(toBytes(value)) === arg; + return value === arg; + } catch { + return false; + } } - data = dir === "left" ? data.slice(sliceLength) : data.slice(0, data.length - sliceLength); - return data; + if (Array.isArray(args) && Array.isArray(matchArgs)) { + return matchArgs.every((value, index2) => { + if (value === null || value === void 0) + return true; + const input = inputs[index2]; + if (!input) + return false; + const value_ = Array.isArray(value) ? value : [value]; + return value_.some((value2) => isEqual2(input, value2, args[index2])); + }); + } + if (typeof args === "object" && !Array.isArray(args) && typeof matchArgs === "object" && !Array.isArray(matchArgs)) + return Object.entries(matchArgs).every(([key, value]) => { + if (value === null || value === void 0) + return true; + const input = inputs.find((input2) => input2.name === key); + if (!input) + return false; + const value_ = Array.isArray(value) ? value : [value]; + return value_.some((value2) => isEqual2(input, value2, args[key])); + }); + return false; } -var charCodeMap2; -var init_bytes = __esm({ - "node_modules/ox/_esm/core/internal/bytes.js"() { +var init_parseEventLogs = __esm({ + "node_modules/viem/_esm/utils/abi/parseEventLogs.js"() { "use strict"; - init_Bytes(); - charCodeMap2 = { - zero: 48, - nine: 57, - A: 65, - F: 70, - a: 97, - f: 102 - }; + init_isAddressEqual(); + init_toBytes(); + init_log2(); + init_keccak256(); + init_toEventSelector(); + init_decodeEventLog(); } }); -// node_modules/ox/_esm/core/internal/hex.js -function assertSize3(hex, size_) { - if (size3(hex) > size_) - throw new SizeOverflowError3({ - givenSize: size3(hex), - maxSize: size_ - }); -} -function assertStartOffset3(value, start) { - if (typeof start === "number" && start > 0 && start > size3(value) - 1) - throw new SliceOffsetOutOfBoundsError3({ - offset: start, - position: "start", - size: size3(value) +// node_modules/viem/_esm/actions/public/getLogs.js +async function getLogs(client, { address: address2, blockHash, fromBlock, toBlock, event, events: events_, args, strict: strict_ } = {}) { + const strict = strict_ ?? false; + const events = events_ ?? (event ? [event] : void 0); + let topics = []; + if (events) { + const encoded = events.flatMap((event2) => encodeEventTopics({ + abi: [event2], + eventName: event2.name, + args: events_ ? void 0 : args + })); + topics = [encoded]; + if (event) + topics = topics[0]; + } + let logs; + if (blockHash) { + logs = await client.request({ + method: "eth_getLogs", + params: [{ address: address2, topics, blockHash }] }); -} -function assertEndOffset3(value, start, end) { - if (typeof start === "number" && typeof end === "number" && size3(value) !== end - start) { - throw new SliceOffsetOutOfBoundsError3({ - offset: end, - position: "end", - size: size3(value) + } else { + logs = await client.request({ + method: "eth_getLogs", + params: [ + { + address: address2, + topics, + fromBlock: typeof fromBlock === "bigint" ? numberToHex(fromBlock) : fromBlock, + toBlock: typeof toBlock === "bigint" ? numberToHex(toBlock) : toBlock + } + ] }); } + const formattedLogs = logs.map((log) => formatLog(log)); + if (!events) + return formattedLogs; + return parseEventLogs({ + abi: events, + args, + logs: formattedLogs, + strict + }); } -function pad3(hex_, options = {}) { - const { dir, size: size5 = 32 } = options; - if (size5 === 0) - return hex_; - const hex = hex_.replace("0x", ""); - if (hex.length > size5 * 2) - throw new SizeExceedsPaddingSizeError3({ - size: Math.ceil(hex.length / 2), - targetSize: size5, - type: "Hex" - }); - return `0x${hex[dir === "right" ? "padEnd" : "padStart"](size5 * 2, "0")}`; -} -function trim3(value, options = {}) { - const { dir = "left" } = options; - let data = value.replace("0x", ""); - let sliceLength = 0; - for (let i = 0; i < data.length - 1; i++) { - if (data[dir === "left" ? i : data.length - i - 1].toString() === "0") - sliceLength++; - else - break; +var init_getLogs = __esm({ + "node_modules/viem/_esm/actions/public/getLogs.js"() { + "use strict"; + init_encodeEventTopics(); + init_parseEventLogs(); + init_toHex(); + init_log2(); } - data = dir === "left" ? data.slice(sliceLength) : data.slice(0, data.length - sliceLength); - if (data === "0") - return "0x"; - if (dir === "right" && data.length % 2 === 1) - return `0x${data}0`; - return `0x${data}`; +}); + +// node_modules/viem/_esm/actions/public/getContractEvents.js +async function getContractEvents(client, parameters) { + const { abi: abi2, address: address2, args, blockHash, eventName, fromBlock, toBlock, strict } = parameters; + const event = eventName ? getAbiItem({ abi: abi2, name: eventName }) : void 0; + const events = !event ? abi2.filter((x) => x.type === "event") : void 0; + return getAction(client, getLogs, "getLogs")({ + address: address2, + args, + blockHash, + event, + events, + fromBlock, + toBlock, + strict + }); } -var init_hex = __esm({ - "node_modules/ox/_esm/core/internal/hex.js"() { +var init_getContractEvents = __esm({ + "node_modules/viem/_esm/actions/public/getContractEvents.js"() { "use strict"; - init_Hex(); + init_getAbiItem(); + init_getAction(); + init_getLogs(); } }); -// node_modules/ox/_esm/core/Json.js -function stringify2(value, replacer, space) { - return JSON.stringify(value, (key, value2) => { - if (typeof replacer === "function") - return replacer(key, value2); - if (typeof value2 === "bigint") - return value2.toString() + bigIntSuffix; - return value2; - }, space); +// node_modules/viem/_esm/utils/abi/decodeFunctionResult.js +function decodeFunctionResult(parameters) { + const { abi: abi2, args, functionName, data } = parameters; + let abiItem = abi2[0]; + if (functionName) { + const item = getAbiItem({ abi: abi2, args, name: functionName }); + if (!item) + throw new AbiFunctionNotFoundError(functionName, { docsPath: docsPath4 }); + abiItem = item; + } + if (abiItem.type !== "function") + throw new AbiFunctionNotFoundError(void 0, { docsPath: docsPath4 }); + if (!abiItem.outputs) + throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath: docsPath4 }); + const values = decodeAbiParameters(abiItem.outputs, data); + if (values && values.length > 1) + return values; + if (values && values.length === 1) + return values[0]; + return void 0; } -var bigIntSuffix; -var init_Json = __esm({ - "node_modules/ox/_esm/core/Json.js"() { +var docsPath4; +var init_decodeFunctionResult = __esm({ + "node_modules/viem/_esm/utils/abi/decodeFunctionResult.js"() { "use strict"; - bigIntSuffix = "#__bigint"; + init_abi(); + init_decodeAbiParameters(); + init_getAbiItem(); + docsPath4 = "/docs/contract/decodeFunctionResult"; } }); -// node_modules/ox/_esm/core/Bytes.js -function assert(value) { - if (value instanceof Uint8Array) - return; - if (!value) - throw new InvalidBytesTypeError(value); - if (typeof value !== "object") - throw new InvalidBytesTypeError(value); - if (!("BYTES_PER_ELEMENT" in value)) - throw new InvalidBytesTypeError(value); - if (value.BYTES_PER_ELEMENT !== 1 || value.constructor.name !== "Uint8Array") - throw new InvalidBytesTypeError(value); +// node_modules/ox/node_modules/@noble/curves/esm/abstract/utils.js +function isBytes3(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; } -function from(value) { - if (value instanceof Uint8Array) - return value; - if (typeof value === "string") - return fromHex(value); - return fromArray(value); +function abytes3(item) { + if (!isBytes3(item)) + throw new Error("Uint8Array expected"); } -function fromArray(value) { - return value instanceof Uint8Array ? value : new Uint8Array(value); +function abool2(title, value) { + if (typeof value !== "boolean") + throw new Error(title + " boolean expected, got " + value); } -function fromHex(value, options = {}) { - const { size: size5 } = options; - let hex = value; - if (size5) { - assertSize3(value, size5); - hex = padRight(value, size5); +function numberToHexUnpadded2(num2) { + const hex = num2.toString(16); + return hex.length & 1 ? "0" + hex : hex; +} +function hexToNumber3(hex) { + if (typeof hex !== "string") + throw new Error("hex string expected, got " + typeof hex); + return hex === "" ? _0n7 : BigInt("0x" + hex); +} +function bytesToHex3(bytes) { + abytes3(bytes); + if (hasHexBuiltin2) + return bytes.toHex(); + let hex = ""; + for (let i = 0; i < bytes.length; i++) { + hex += hexes3[bytes[i]]; } - let hexString = hex.slice(2); - if (hexString.length % 2) - hexString = `0${hexString}`; - const length = hexString.length / 2; - const bytes = new Uint8Array(length); - for (let index2 = 0, j = 0; index2 < length; index2++) { - const nibbleLeft = charCodeToBase162(hexString.charCodeAt(j++)); - const nibbleRight = charCodeToBase162(hexString.charCodeAt(j++)); - if (nibbleLeft === void 0 || nibbleRight === void 0) { - throw new BaseError3(`Invalid byte sequence ("${hexString[j - 2]}${hexString[j - 1]}" in "${hexString}").`); + return hex; +} +function asciiToBase162(ch) { + if (ch >= asciis2._0 && ch <= asciis2._9) + return ch - asciis2._0; + if (ch >= asciis2.A && ch <= asciis2.F) + return ch - (asciis2.A - 10); + if (ch >= asciis2.a && ch <= asciis2.f) + return ch - (asciis2.a - 10); + return; +} +function hexToBytes3(hex) { + if (typeof hex !== "string") + throw new Error("hex string expected, got " + typeof hex); + if (hasHexBuiltin2) + return Uint8Array.fromHex(hex); + const hl = hex.length; + const al = hl / 2; + if (hl % 2) + throw new Error("hex string expected, got unpadded hex of length " + hl); + const array = new Uint8Array(al); + for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) { + const n1 = asciiToBase162(hex.charCodeAt(hi)); + const n2 = asciiToBase162(hex.charCodeAt(hi + 1)); + if (n1 === void 0 || n2 === void 0) { + const char = hex[hi] + hex[hi + 1]; + throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi); } - bytes[index2] = nibbleLeft << 4 | nibbleRight; + array[ai] = n1 * 16 + n2; } - return bytes; + return array; } -function fromString(value, options = {}) { - const { size: size5 } = options; - const bytes = encoder3.encode(value); - if (typeof size5 === "number") { - assertSize2(bytes, size5); - return padRight2(bytes, size5); - } - return bytes; +function bytesToNumberBE2(bytes) { + return hexToNumber3(bytesToHex3(bytes)); } -function padRight2(value, size5) { - return pad2(value, { dir: "right", size: size5 }); +function bytesToNumberLE2(bytes) { + abytes3(bytes); + return hexToNumber3(bytesToHex3(Uint8Array.from(bytes).reverse())); } -function size2(value) { - return value.length; +function numberToBytesBE2(n, len) { + return hexToBytes3(n.toString(16).padStart(len * 2, "0")); } -function slice2(value, start, end, options = {}) { - const { strict } = options; - assertStartOffset2(value, start); - const value_ = value.slice(start, end); - if (strict) - assertEndOffset2(value_, start, end); - return value_; +function numberToBytesLE2(n, len) { + return numberToBytesBE2(n, len).reverse(); } -function toBigInt2(bytes, options = {}) { - const { size: size5 } = options; - if (typeof size5 !== "undefined") - assertSize2(bytes, size5); - const hex = fromBytes(bytes, options); - return toBigInt(hex, options); +function ensureBytes2(title, hex, expectedLength) { + let res; + if (typeof hex === "string") { + try { + res = hexToBytes3(hex); + } catch (e7) { + throw new Error(title + " must be hex string or Uint8Array, cause: " + e7); + } + } else if (isBytes3(hex)) { + res = Uint8Array.from(hex); + } else { + throw new Error(title + " must be hex string or Uint8Array"); + } + const len = res.length; + if (typeof expectedLength === "number" && len !== expectedLength) + throw new Error(title + " of length " + expectedLength + " expected, got " + len); + return res; } -function toBoolean(bytes, options = {}) { - const { size: size5 } = options; - let bytes_ = bytes; - if (typeof size5 !== "undefined") { - assertSize2(bytes_, size5); - bytes_ = trimLeft(bytes_); +function concatBytes4(...arrays) { + let sum = 0; + for (let i = 0; i < arrays.length; i++) { + const a = arrays[i]; + abytes3(a); + sum += a.length; } - if (bytes_.length > 1 || bytes_[0] > 1) - throw new InvalidBytesBooleanError2(bytes_); - return Boolean(bytes_[0]); + const res = new Uint8Array(sum); + for (let i = 0, pad4 = 0; i < arrays.length; i++) { + const a = arrays[i]; + res.set(a, pad4); + pad4 += a.length; + } + return res; } -function toNumber2(bytes, options = {}) { - const { size: size5 } = options; - if (typeof size5 !== "undefined") - assertSize2(bytes, size5); - const hex = fromBytes(bytes, options); - return toNumber(hex, options); +function inRange2(n, min, max) { + return isPosBig2(n) && isPosBig2(min) && isPosBig2(max) && min <= n && n < max; } -function toString(bytes, options = {}) { - const { size: size5 } = options; - let bytes_ = bytes; - if (typeof size5 !== "undefined") { - assertSize2(bytes_, size5); - bytes_ = trimRight(bytes_); - } - return decoder.decode(bytes_); +function aInRange2(title, n, min, max) { + if (!inRange2(n, min, max)) + throw new Error("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n); } -function trimLeft(value) { - return trim2(value, { dir: "left" }); +function bitLen2(n) { + let len; + for (len = 0; n > _0n7; n >>= _1n7, len += 1) + ; + return len; } -function trimRight(value) { - return trim2(value, { dir: "right" }); +function createHmacDrbg2(hashLen, qByteLen, hmacFn) { + if (typeof hashLen !== "number" || hashLen < 2) + throw new Error("hashLen must be a number"); + if (typeof qByteLen !== "number" || qByteLen < 2) + throw new Error("qByteLen must be a number"); + if (typeof hmacFn !== "function") + throw new Error("hmacFn must be a function"); + let v = u8n2(hashLen); + let k = u8n2(hashLen); + let i = 0; + const reset = () => { + v.fill(1); + k.fill(0); + i = 0; + }; + const h = (...b) => hmacFn(k, v, ...b); + const reseed = (seed = u8n2(0)) => { + k = h(u8fr2([0]), seed); + v = h(); + if (seed.length === 0) + return; + k = h(u8fr2([1]), seed); + v = h(); + }; + const gen2 = () => { + if (i++ >= 1e3) + throw new Error("drbg: tried 1000 values"); + let len = 0; + const out = []; + while (len < qByteLen) { + v = h(); + const sl = v.slice(); + out.push(sl); + len += v.length; + } + return concatBytes4(...out); + }; + const genUntil = (seed, pred) => { + reset(); + reseed(seed); + let res = void 0; + while (!(res = pred(gen2()))) + reseed(); + reset(); + return res; + }; + return genUntil; } -function validate(value) { - try { - assert(value); - return true; - } catch { - return false; +function validateObject2(object, validators, optValidators = {}) { + const checkField = (fieldName, type, isOptional) => { + const checkVal = validatorFns2[type]; + if (typeof checkVal !== "function") + throw new Error("invalid validator function"); + const val = object[fieldName]; + if (isOptional && val === void 0) + return; + if (!checkVal(val, object)) { + throw new Error("param " + String(fieldName) + " is invalid. Expected " + type + ", got " + val); + } + }; + for (const [fieldName, type] of Object.entries(validators)) + checkField(fieldName, type, false); + for (const [fieldName, type] of Object.entries(optValidators)) + checkField(fieldName, type, true); + return object; +} +function memoized2(fn) { + const map = /* @__PURE__ */ new WeakMap(); + return (arg, ...args) => { + const val = map.get(arg); + if (val !== void 0) + return val; + const computed = fn(arg, ...args); + map.set(arg, computed); + return computed; + }; +} +var _0n7, _1n7, hasHexBuiltin2, hexes3, asciis2, isPosBig2, bitMask2, u8n2, u8fr2, validatorFns2; +var init_utils5 = __esm({ + "node_modules/ox/node_modules/@noble/curves/esm/abstract/utils.js"() { + "use strict"; + _0n7 = /* @__PURE__ */ BigInt(0); + _1n7 = /* @__PURE__ */ BigInt(1); + hasHexBuiltin2 = // @ts-ignore + typeof Uint8Array.from([]).toHex === "function" && typeof Uint8Array.fromHex === "function"; + hexes3 = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0")); + asciis2 = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; + isPosBig2 = (n) => typeof n === "bigint" && _0n7 <= n; + bitMask2 = (n) => (_1n7 << BigInt(n)) - _1n7; + u8n2 = (len) => new Uint8Array(len); + u8fr2 = (arr) => Uint8Array.from(arr); + validatorFns2 = { + bigint: (val) => typeof val === "bigint", + function: (val) => typeof val === "function", + boolean: (val) => typeof val === "boolean", + string: (val) => typeof val === "string", + stringOrUint8Array: (val) => typeof val === "string" || isBytes3(val), + isSafeInteger: (val) => Number.isSafeInteger(val), + array: (val) => Array.isArray(val), + field: (val, object) => object.Fp.isValid(val), + hash: (val) => typeof val === "function" && Number.isSafeInteger(val.outputLen) + }; + } +}); + +// node_modules/ox/_esm/core/version.js +var version3; +var init_version3 = __esm({ + "node_modules/ox/_esm/core/version.js"() { + "use strict"; + version3 = "0.1.1"; } +}); + +// node_modules/ox/_esm/core/internal/errors.js +function getVersion() { + return version3; } -var decoder, encoder3, InvalidBytesBooleanError2, InvalidBytesTypeError, SizeOverflowError2, SliceOffsetOutOfBoundsError2, SizeExceedsPaddingSizeError2; -var init_Bytes = __esm({ - "node_modules/ox/_esm/core/Bytes.js"() { +var init_errors2 = __esm({ + "node_modules/ox/_esm/core/internal/errors.js"() { "use strict"; - init_Errors(); - init_Hex(); - init_bytes(); - init_hex(); - init_Json(); - decoder = /* @__PURE__ */ new TextDecoder(); - encoder3 = /* @__PURE__ */ new TextEncoder(); - InvalidBytesBooleanError2 = class extends BaseError3 { - constructor(bytes) { - super(`Bytes value \`${bytes}\` is not a valid boolean.`, { - metaMessages: [ - "The bytes array must contain a single byte of either a `0` or `1` value." - ] + init_version3(); + } +}); + +// node_modules/ox/_esm/core/Errors.js +function walk2(err, fn) { + if (fn?.(err)) + return err; + if (err && typeof err === "object" && "cause" in err && err.cause) + return walk2(err.cause, fn); + return fn ? null : err; +} +var BaseError3; +var init_Errors = __esm({ + "node_modules/ox/_esm/core/Errors.js"() { + "use strict"; + init_errors2(); + BaseError3 = class _BaseError extends Error { + static setStaticOptions(options) { + _BaseError.prototype.docsOrigin = options.docsOrigin; + _BaseError.prototype.showVersion = options.showVersion; + _BaseError.prototype.version = options.version; + } + constructor(shortMessage, options = {}) { + const details = (() => { + if (options.cause instanceof _BaseError) { + if (options.cause.details) + return options.cause.details; + if (options.cause.shortMessage) + return options.cause.shortMessage; + } + if (options.cause && "details" in options.cause && typeof options.cause.details === "string") + return options.cause.details; + if (options.cause?.message) + return options.cause.message; + return options.details; + })(); + const docsPath8 = (() => { + if (options.cause instanceof _BaseError) + return options.cause.docsPath || options.docsPath; + return options.docsPath; + })(); + const docsBaseUrl = options.docsOrigin ?? _BaseError.prototype.docsOrigin; + const docs = `${docsBaseUrl}${docsPath8 ?? ""}`; + const showVersion = Boolean(options.version ?? _BaseError.prototype.showVersion); + const version4 = options.version ?? _BaseError.prototype.version; + const message = [ + shortMessage || "An error occurred.", + ...options.metaMessages ? ["", ...options.metaMessages] : [], + ...details || docsPath8 || showVersion ? [ + "", + details ? `Details: ${details}` : void 0, + docsPath8 ? `See: ${docs}` : void 0, + showVersion ? `Version: ${version4}` : void 0 + ] : [] + ].filter((x) => typeof x === "string").join("\n"); + super(message, options.cause ? { cause: options.cause } : void 0); + Object.defineProperty(this, "details", { + enumerable: true, + configurable: true, + writable: true, + value: void 0 }); - Object.defineProperty(this, "name", { + Object.defineProperty(this, "docs", { enumerable: true, configurable: true, writable: true, - value: "Bytes.InvalidBytesBooleanError" + value: void 0 }); - } - }; - InvalidBytesTypeError = class extends BaseError3 { - constructor(value) { - super(`Value \`${typeof value === "object" ? stringify2(value) : value}\` of type \`${typeof value}\` is an invalid Bytes value.`, { - metaMessages: ["Bytes values must be of type `Bytes`."] + Object.defineProperty(this, "docsOrigin", { + enumerable: true, + configurable: true, + writable: true, + value: void 0 }); - Object.defineProperty(this, "name", { + Object.defineProperty(this, "docsPath", { enumerable: true, configurable: true, writable: true, - value: "Bytes.InvalidBytesTypeError" + value: void 0 }); - } - }; - SizeOverflowError2 = class extends BaseError3 { - constructor({ givenSize, maxSize }) { - super(`Size cannot exceed \`${maxSize}\` bytes. Given size: \`${givenSize}\` bytes.`); - Object.defineProperty(this, "name", { + Object.defineProperty(this, "shortMessage", { enumerable: true, configurable: true, writable: true, - value: "Bytes.SizeOverflowError" + value: void 0 }); - } - }; - SliceOffsetOutOfBoundsError2 = class extends BaseError3 { - constructor({ offset, position, size: size5 }) { - super(`Slice ${position === "start" ? "starting" : "ending"} at offset \`${offset}\` is out-of-bounds (size: \`${size5}\`).`); - Object.defineProperty(this, "name", { + Object.defineProperty(this, "showVersion", { enumerable: true, configurable: true, writable: true, - value: "Bytes.SliceOffsetOutOfBoundsError" + value: void 0 + }); + Object.defineProperty(this, "version", { + enumerable: true, + configurable: true, + writable: true, + value: void 0 + }); + Object.defineProperty(this, "cause", { + enumerable: true, + configurable: true, + writable: true, + value: void 0 }); - } - }; - SizeExceedsPaddingSizeError2 = class extends BaseError3 { - constructor({ size: size5, targetSize, type }) { - super(`${type.charAt(0).toUpperCase()}${type.slice(1).toLowerCase()} size (\`${size5}\`) exceeds padding size (\`${targetSize}\`).`); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, - value: "Bytes.SizeExceedsPaddingSizeError" + value: "BaseError" }); + this.cause = options.cause; + this.details = details; + this.docs = docs; + this.docsOrigin = docsBaseUrl; + this.docsPath = docsPath8; + this.shortMessage = shortMessage; + this.showVersion = showVersion; + this.version = version4; + } + walk(fn) { + return walk2(this, fn); } }; + Object.defineProperty(BaseError3, "defaultStaticOptions", { + enumerable: true, + configurable: true, + writable: true, + value: { + docsOrigin: "https://oxlib.sh", + showVersion: false, + version: `ox@${getVersion()}` + } + }); + (() => { + BaseError3.setStaticOptions(BaseError3.defaultStaticOptions); + })(); } }); -// node_modules/ox/_esm/core/Hex.js -function assert2(value, options = {}) { - const { strict = false } = options; - if (!value) - throw new InvalidHexTypeError(value); - if (typeof value !== "string") - throw new InvalidHexTypeError(value); - if (strict) { - if (!/^0x[0-9a-fA-F]*$/.test(value)) - throw new InvalidHexValueError(value); - } - if (!value.startsWith("0x")) - throw new InvalidHexValueError(value); +// node_modules/ox/_esm/core/internal/bytes.js +function assertSize2(bytes, size_) { + if (size2(bytes) > size_) + throw new SizeOverflowError2({ + givenSize: size2(bytes), + maxSize: size_ + }); } -function concat2(...values) { - return `0x${values.reduce((acc, x) => acc + x.replace("0x", ""), "")}`; +function assertStartOffset2(value, start) { + if (typeof start === "number" && start > 0 && start > size2(value) - 1) + throw new SliceOffsetOutOfBoundsError2({ + offset: start, + position: "start", + size: size2(value) + }); } -function from2(value) { - if (value instanceof Uint8Array) - return fromBytes(value); - if (Array.isArray(value)) - return fromBytes(new Uint8Array(value)); - return value; +function assertEndOffset2(value, start, end) { + if (typeof start === "number" && typeof end === "number" && size2(value) !== end - start) { + throw new SliceOffsetOutOfBoundsError2({ + offset: end, + position: "end", + size: size2(value) + }); + } } -function fromBoolean(value, options = {}) { - const hex = `0x${Number(value)}`; +function charCodeToBase162(char) { + if (char >= charCodeMap2.zero && char <= charCodeMap2.nine) + return char - charCodeMap2.zero; + if (char >= charCodeMap2.A && char <= charCodeMap2.F) + return char - (charCodeMap2.A - 10); + if (char >= charCodeMap2.a && char <= charCodeMap2.f) + return char - (charCodeMap2.a - 10); + return void 0; +} +function pad2(bytes, options = {}) { + const { dir, size: size5 = 32 } = options; + if (size5 === 0) + return bytes; + if (bytes.length > size5) + throw new SizeExceedsPaddingSizeError2({ + size: bytes.length, + targetSize: size5, + type: "Bytes" + }); + const paddedBytes = new Uint8Array(size5); + for (let i = 0; i < size5; i++) { + const padEnd = dir === "right"; + paddedBytes[padEnd ? i : size5 - i - 1] = bytes[padEnd ? i : bytes.length - i - 1]; + } + return paddedBytes; +} +function trim2(value, options = {}) { + const { dir = "left" } = options; + let data = value; + let sliceLength = 0; + for (let i = 0; i < data.length - 1; i++) { + if (data[dir === "left" ? i : data.length - i - 1].toString() === "0") + sliceLength++; + else + break; + } + data = dir === "left" ? data.slice(sliceLength) : data.slice(0, data.length - sliceLength); + return data; +} +var charCodeMap2; +var init_bytes = __esm({ + "node_modules/ox/_esm/core/internal/bytes.js"() { + "use strict"; + init_Bytes(); + charCodeMap2 = { + zero: 48, + nine: 57, + A: 65, + F: 70, + a: 97, + f: 102 + }; + } +}); + +// node_modules/ox/_esm/core/internal/hex.js +function assertSize3(hex, size_) { + if (size3(hex) > size_) + throw new SizeOverflowError3({ + givenSize: size3(hex), + maxSize: size_ + }); +} +function assertStartOffset3(value, start) { + if (typeof start === "number" && start > 0 && start > size3(value) - 1) + throw new SliceOffsetOutOfBoundsError3({ + offset: start, + position: "start", + size: size3(value) + }); +} +function assertEndOffset3(value, start, end) { + if (typeof start === "number" && typeof end === "number" && size3(value) !== end - start) { + throw new SliceOffsetOutOfBoundsError3({ + offset: end, + position: "end", + size: size3(value) + }); + } +} +function pad3(hex_, options = {}) { + const { dir, size: size5 = 32 } = options; + if (size5 === 0) + return hex_; + const hex = hex_.replace("0x", ""); + if (hex.length > size5 * 2) + throw new SizeExceedsPaddingSizeError3({ + size: Math.ceil(hex.length / 2), + targetSize: size5, + type: "Hex" + }); + return `0x${hex[dir === "right" ? "padEnd" : "padStart"](size5 * 2, "0")}`; +} +function trim3(value, options = {}) { + const { dir = "left" } = options; + let data = value.replace("0x", ""); + let sliceLength = 0; + for (let i = 0; i < data.length - 1; i++) { + if (data[dir === "left" ? i : data.length - i - 1].toString() === "0") + sliceLength++; + else + break; + } + data = dir === "left" ? data.slice(sliceLength) : data.slice(0, data.length - sliceLength); + if (data === "0") + return "0x"; + if (dir === "right" && data.length % 2 === 1) + return `0x${data}0`; + return `0x${data}`; +} +var init_hex = __esm({ + "node_modules/ox/_esm/core/internal/hex.js"() { + "use strict"; + init_Hex(); + } +}); + +// node_modules/ox/_esm/core/Json.js +function stringify2(value, replacer, space) { + return JSON.stringify(value, (key, value2) => { + if (typeof replacer === "function") + return replacer(key, value2); + if (typeof value2 === "bigint") + return value2.toString() + bigIntSuffix; + return value2; + }, space); +} +var bigIntSuffix; +var init_Json = __esm({ + "node_modules/ox/_esm/core/Json.js"() { + "use strict"; + bigIntSuffix = "#__bigint"; + } +}); + +// node_modules/ox/_esm/core/Bytes.js +function assert(value) { + if (value instanceof Uint8Array) + return; + if (!value) + throw new InvalidBytesTypeError(value); + if (typeof value !== "object") + throw new InvalidBytesTypeError(value); + if (!("BYTES_PER_ELEMENT" in value)) + throw new InvalidBytesTypeError(value); + if (value.BYTES_PER_ELEMENT !== 1 || value.constructor.name !== "Uint8Array") + throw new InvalidBytesTypeError(value); +} +function from(value) { + if (value instanceof Uint8Array) + return value; + if (typeof value === "string") + return fromHex(value); + return fromArray(value); +} +function fromArray(value) { + return value instanceof Uint8Array ? value : new Uint8Array(value); +} +function fromHex(value, options = {}) { + const { size: size5 } = options; + let hex = value; + if (size5) { + assertSize3(value, size5); + hex = padRight(value, size5); + } + let hexString = hex.slice(2); + if (hexString.length % 2) + hexString = `0${hexString}`; + const length = hexString.length / 2; + const bytes = new Uint8Array(length); + for (let index2 = 0, j = 0; index2 < length; index2++) { + const nibbleLeft = charCodeToBase162(hexString.charCodeAt(j++)); + const nibbleRight = charCodeToBase162(hexString.charCodeAt(j++)); + if (nibbleLeft === void 0 || nibbleRight === void 0) { + throw new BaseError3(`Invalid byte sequence ("${hexString[j - 2]}${hexString[j - 1]}" in "${hexString}").`); + } + bytes[index2] = nibbleLeft << 4 | nibbleRight; + } + return bytes; +} +function fromString(value, options = {}) { + const { size: size5 } = options; + const bytes = encoder3.encode(value); + if (typeof size5 === "number") { + assertSize2(bytes, size5); + return padRight2(bytes, size5); + } + return bytes; +} +function padRight2(value, size5) { + return pad2(value, { dir: "right", size: size5 }); +} +function size2(value) { + return value.length; +} +function slice2(value, start, end, options = {}) { + const { strict } = options; + assertStartOffset2(value, start); + const value_ = value.slice(start, end); + if (strict) + assertEndOffset2(value_, start, end); + return value_; +} +function toBigInt2(bytes, options = {}) { + const { size: size5 } = options; + if (typeof size5 !== "undefined") + assertSize2(bytes, size5); + const hex = fromBytes(bytes, options); + return toBigInt(hex, options); +} +function toBoolean(bytes, options = {}) { + const { size: size5 } = options; + let bytes_ = bytes; + if (typeof size5 !== "undefined") { + assertSize2(bytes_, size5); + bytes_ = trimLeft(bytes_); + } + if (bytes_.length > 1 || bytes_[0] > 1) + throw new InvalidBytesBooleanError2(bytes_); + return Boolean(bytes_[0]); +} +function toNumber2(bytes, options = {}) { + const { size: size5 } = options; + if (typeof size5 !== "undefined") + assertSize2(bytes, size5); + const hex = fromBytes(bytes, options); + return toNumber(hex, options); +} +function toString(bytes, options = {}) { + const { size: size5 } = options; + let bytes_ = bytes; + if (typeof size5 !== "undefined") { + assertSize2(bytes_, size5); + bytes_ = trimRight(bytes_); + } + return decoder.decode(bytes_); +} +function trimLeft(value) { + return trim2(value, { dir: "left" }); +} +function trimRight(value) { + return trim2(value, { dir: "right" }); +} +function validate(value) { + try { + assert(value); + return true; + } catch { + return false; + } +} +var decoder, encoder3, InvalidBytesBooleanError2, InvalidBytesTypeError, SizeOverflowError2, SliceOffsetOutOfBoundsError2, SizeExceedsPaddingSizeError2; +var init_Bytes = __esm({ + "node_modules/ox/_esm/core/Bytes.js"() { + "use strict"; + init_Errors(); + init_Hex(); + init_bytes(); + init_hex(); + init_Json(); + decoder = /* @__PURE__ */ new TextDecoder(); + encoder3 = /* @__PURE__ */ new TextEncoder(); + InvalidBytesBooleanError2 = class extends BaseError3 { + constructor(bytes) { + super(`Bytes value \`${bytes}\` is not a valid boolean.`, { + metaMessages: [ + "The bytes array must contain a single byte of either a `0` or `1` value." + ] + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Bytes.InvalidBytesBooleanError" + }); + } + }; + InvalidBytesTypeError = class extends BaseError3 { + constructor(value) { + super(`Value \`${typeof value === "object" ? stringify2(value) : value}\` of type \`${typeof value}\` is an invalid Bytes value.`, { + metaMessages: ["Bytes values must be of type `Bytes`."] + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Bytes.InvalidBytesTypeError" + }); + } + }; + SizeOverflowError2 = class extends BaseError3 { + constructor({ givenSize, maxSize }) { + super(`Size cannot exceed \`${maxSize}\` bytes. Given size: \`${givenSize}\` bytes.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Bytes.SizeOverflowError" + }); + } + }; + SliceOffsetOutOfBoundsError2 = class extends BaseError3 { + constructor({ offset, position, size: size5 }) { + super(`Slice ${position === "start" ? "starting" : "ending"} at offset \`${offset}\` is out-of-bounds (size: \`${size5}\`).`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Bytes.SliceOffsetOutOfBoundsError" + }); + } + }; + SizeExceedsPaddingSizeError2 = class extends BaseError3 { + constructor({ size: size5, targetSize, type }) { + super(`${type.charAt(0).toUpperCase()}${type.slice(1).toLowerCase()} size (\`${size5}\`) exceeds padding size (\`${targetSize}\`).`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Bytes.SizeExceedsPaddingSizeError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/core/Hex.js +function assert2(value, options = {}) { + const { strict = false } = options; + if (!value) + throw new InvalidHexTypeError(value); + if (typeof value !== "string") + throw new InvalidHexTypeError(value); + if (strict) { + if (!/^0x[0-9a-fA-F]*$/.test(value)) + throw new InvalidHexValueError(value); + } + if (!value.startsWith("0x")) + throw new InvalidHexValueError(value); +} +function concat2(...values) { + return `0x${values.reduce((acc, x) => acc + x.replace("0x", ""), "")}`; +} +function from2(value) { + if (value instanceof Uint8Array) + return fromBytes(value); + if (Array.isArray(value)) + return fromBytes(new Uint8Array(value)); + return value; +} +function fromBoolean(value, options = {}) { + const hex = `0x${Number(value)}`; if (typeof options.size === "number") { assertSize3(hex, options.size); return padLeft(hex, options.size); @@ -10570,56119 +12026,55771 @@ var init_call = __esm({ } }); -// node_modules/viem/_esm/utils/transaction/assertTransaction.js -function assertTransactionEIP7702(transaction) { - const { authorizationList } = transaction; - if (authorizationList) { - for (const authorization of authorizationList) { - const { chainId } = authorization; - const address2 = authorization.address; - if (!isAddress(address2)) - throw new InvalidAddressError({ address: address2 }); - if (chainId < 0) - throw new InvalidChainIdError({ chainId }); - } - } - assertTransactionEIP1559(transaction); -} -function assertTransactionEIP4844(transaction) { - const { blobVersionedHashes } = transaction; - if (blobVersionedHashes) { - if (blobVersionedHashes.length === 0) - throw new EmptyBlobError(); - for (const hash3 of blobVersionedHashes) { - const size_ = size(hash3); - const version4 = hexToNumber(slice(hash3, 0, 1)); - if (size_ !== 32) - throw new InvalidVersionedHashSizeError({ hash: hash3, size: size_ }); - if (version4 !== versionedHashVersionKzg) - throw new InvalidVersionedHashVersionError({ - hash: hash3, - version: version4 - }); - } +// node_modules/viem/_esm/actions/public/readContract.js +async function readContract(client, parameters) { + const { abi: abi2, address: address2, args, functionName, ...rest } = parameters; + const calldata = encodeFunctionData({ + abi: abi2, + args, + functionName + }); + try { + const { data } = await getAction(client, call, "call")({ + ...rest, + data: calldata, + to: address2 + }); + return decodeFunctionResult({ + abi: abi2, + args, + functionName, + data: data || "0x" + }); + } catch (error) { + throw getContractError(error, { + abi: abi2, + address: address2, + args, + docsPath: "/docs/contract/readContract", + functionName + }); } - assertTransactionEIP1559(transaction); -} -function assertTransactionEIP1559(transaction) { - const { chainId, maxPriorityFeePerGas, maxFeePerGas, to } = transaction; - if (chainId <= 0) - throw new InvalidChainIdError({ chainId }); - if (to && !isAddress(to)) - throw new InvalidAddressError({ address: to }); - if (maxFeePerGas && maxFeePerGas > maxUint256) - throw new FeeCapTooHighError({ maxFeePerGas }); - if (maxPriorityFeePerGas && maxFeePerGas && maxPriorityFeePerGas > maxFeePerGas) - throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas }); -} -function assertTransactionEIP2930(transaction) { - const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } = transaction; - if (chainId <= 0) - throw new InvalidChainIdError({ chainId }); - if (to && !isAddress(to)) - throw new InvalidAddressError({ address: to }); - if (maxPriorityFeePerGas || maxFeePerGas) - throw new BaseError2("`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute."); - if (gasPrice && gasPrice > maxUint256) - throw new FeeCapTooHighError({ maxFeePerGas: gasPrice }); -} -function assertTransactionLegacy(transaction) { - const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } = transaction; - if (to && !isAddress(to)) - throw new InvalidAddressError({ address: to }); - if (typeof chainId !== "undefined" && chainId <= 0) - throw new InvalidChainIdError({ chainId }); - if (maxPriorityFeePerGas || maxFeePerGas) - throw new BaseError2("`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute."); - if (gasPrice && gasPrice > maxUint256) - throw new FeeCapTooHighError({ maxFeePerGas: gasPrice }); } -var init_assertTransaction = __esm({ - "node_modules/viem/_esm/utils/transaction/assertTransaction.js"() { +var init_readContract = __esm({ + "node_modules/viem/_esm/actions/public/readContract.js"() { "use strict"; - init_kzg(); - init_number(); - init_address(); - init_base(); - init_blob2(); - init_chain(); - init_node(); - init_isAddress(); - init_size(); - init_slice(); - init_fromHex(); + init_decodeFunctionResult(); + init_encodeFunctionData(); + init_getContractError(); + init_getAction(); + init_call(); } }); -// node_modules/viem/_esm/utils/transaction/serializeAccessList.js -function serializeAccessList(accessList) { - if (!accessList || accessList.length === 0) - return []; - const serializedAccessList = []; - for (let i = 0; i < accessList.length; i++) { - const { address: address2, storageKeys } = accessList[i]; - for (let j = 0; j < storageKeys.length; j++) { - if (storageKeys[j].length - 2 !== 64) { - throw new InvalidStorageKeySizeError({ storageKey: storageKeys[j] }); +// node_modules/viem/_esm/actions/public/simulateContract.js +async function simulateContract(client, parameters) { + const { abi: abi2, address: address2, args, functionName, dataSuffix = typeof client.dataSuffix === "string" ? client.dataSuffix : client.dataSuffix?.value, ...callRequest } = parameters; + const account = callRequest.account ? parseAccount(callRequest.account) : client.account; + const calldata = encodeFunctionData({ abi: abi2, args, functionName }); + try { + const { data } = await getAction(client, call, "call")({ + batch: false, + data: `${calldata}${dataSuffix ? dataSuffix.replace("0x", "") : ""}`, + to: address2, + ...callRequest, + account + }); + const result = decodeFunctionResult({ + abi: abi2, + args, + functionName, + data: data || "0x" + }); + const minimizedAbi = abi2.filter((abiItem) => "name" in abiItem && abiItem.name === parameters.functionName); + return { + result, + request: { + abi: minimizedAbi, + address: address2, + args, + dataSuffix, + functionName, + ...callRequest, + account } - } - if (!isAddress(address2, { strict: false })) { - throw new InvalidAddressError({ address: address2 }); - } - serializedAccessList.push([address2, storageKeys]); + }; + } catch (error) { + throw getContractError(error, { + abi: abi2, + address: address2, + args, + docsPath: "/docs/contract/simulateContract", + functionName, + sender: account?.address + }); } - return serializedAccessList; } -var init_serializeAccessList = __esm({ - "node_modules/viem/_esm/utils/transaction/serializeAccessList.js"() { +var init_simulateContract = __esm({ + "node_modules/viem/_esm/actions/public/simulateContract.js"() { "use strict"; - init_address(); - init_transaction(); - init_isAddress(); + init_parseAccount(); + init_decodeFunctionResult(); + init_encodeFunctionData(); + init_getContractError(); + init_getAction(); + init_call(); } }); -// node_modules/viem/_esm/utils/transaction/serializeTransaction.js -function serializeTransaction(transaction, signature2) { - const type = getTransactionType(transaction); - if (type === "eip1559") - return serializeTransactionEIP1559(transaction, signature2); - if (type === "eip2930") - return serializeTransactionEIP2930(transaction, signature2); - if (type === "eip4844") - return serializeTransactionEIP4844(transaction, signature2); - if (type === "eip7702") - return serializeTransactionEIP7702(transaction, signature2); - return serializeTransactionLegacy(transaction, signature2); -} -function serializeTransactionEIP7702(transaction, signature2) { - const { authorizationList, chainId, gas, nonce, to, value, maxFeePerGas, maxPriorityFeePerGas, accessList, data } = transaction; - assertTransactionEIP7702(transaction); - const serializedAccessList = serializeAccessList(accessList); - const serializedAuthorizationList = serializeAuthorizationList(authorizationList); - return concatHex([ - "0x04", - toRlp([ - numberToHex(chainId), - nonce ? numberToHex(nonce) : "0x", - maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : "0x", - maxFeePerGas ? numberToHex(maxFeePerGas) : "0x", - gas ? numberToHex(gas) : "0x", - to ?? "0x", - value ? numberToHex(value) : "0x", - data ?? "0x", - serializedAccessList, - serializedAuthorizationList, - ...toYParitySignatureArray(transaction, signature2) - ]) +// node_modules/viem/_esm/utils/observe.js +function observe(observerId, callbacks, fn) { + const callbackId = ++callbackCount; + const getListeners = () => listenersCache.get(observerId) || []; + const unsubscribe = () => { + const listeners2 = getListeners(); + listenersCache.set(observerId, listeners2.filter((cb) => cb.id !== callbackId)); + }; + const unwatch = () => { + const listeners2 = getListeners(); + if (!listeners2.some((cb) => cb.id === callbackId)) + return; + const cleanup2 = cleanupCache.get(observerId); + if (listeners2.length === 1 && cleanup2) { + const p = cleanup2(); + if (p instanceof Promise) + p.catch(() => { + }); + } + unsubscribe(); + }; + const listeners = getListeners(); + listenersCache.set(observerId, [ + ...listeners, + { id: callbackId, fns: callbacks } ]); -} -function serializeTransactionEIP4844(transaction, signature2) { - const { chainId, gas, nonce, to, value, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, accessList, data } = transaction; - assertTransactionEIP4844(transaction); - let blobVersionedHashes = transaction.blobVersionedHashes; - let sidecars = transaction.sidecars; - if (transaction.blobs && (typeof blobVersionedHashes === "undefined" || typeof sidecars === "undefined")) { - const blobs2 = typeof transaction.blobs[0] === "string" ? transaction.blobs : transaction.blobs.map((x) => bytesToHex(x)); - const kzg = transaction.kzg; - const commitments2 = blobsToCommitments({ - blobs: blobs2, - kzg + if (listeners && listeners.length > 0) + return unwatch; + const emit = {}; + for (const key in callbacks) { + emit[key] = ((...args) => { + const listeners2 = getListeners(); + if (listeners2.length === 0) + return; + for (const listener of listeners2) + listener.fns[key]?.(...args); }); - if (typeof blobVersionedHashes === "undefined") - blobVersionedHashes = commitmentsToVersionedHashes({ - commitments: commitments2 - }); - if (typeof sidecars === "undefined") { - const proofs2 = blobsToProofs({ blobs: blobs2, commitments: commitments2, kzg }); - sidecars = toBlobSidecars({ blobs: blobs2, commitments: commitments2, proofs: proofs2 }); - } } - const serializedAccessList = serializeAccessList(accessList); - const serializedTransaction = [ - numberToHex(chainId), - nonce ? numberToHex(nonce) : "0x", - maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : "0x", - maxFeePerGas ? numberToHex(maxFeePerGas) : "0x", - gas ? numberToHex(gas) : "0x", - to ?? "0x", - value ? numberToHex(value) : "0x", - data ?? "0x", - serializedAccessList, - maxFeePerBlobGas ? numberToHex(maxFeePerBlobGas) : "0x", - blobVersionedHashes ?? [], - ...toYParitySignatureArray(transaction, signature2) - ]; - const blobs = []; - const commitments = []; - const proofs = []; - if (sidecars) - for (let i = 0; i < sidecars.length; i++) { - const { blob, commitment, proof } = sidecars[i]; - blobs.push(blob); - commitments.push(commitment); - proofs.push(proof); - } - return concatHex([ - "0x03", - sidecars ? ( - // If sidecars are enabled, envelope turns into a "wrapper": - toRlp([serializedTransaction, blobs, commitments, proofs]) - ) : ( - // If sidecars are disabled, standard envelope is used: - toRlp(serializedTransaction) - ) - ]); -} -function serializeTransactionEIP1559(transaction, signature2) { - const { chainId, gas, nonce, to, value, maxFeePerGas, maxPriorityFeePerGas, accessList, data } = transaction; - assertTransactionEIP1559(transaction); - const serializedAccessList = serializeAccessList(accessList); - const serializedTransaction = [ - numberToHex(chainId), - nonce ? numberToHex(nonce) : "0x", - maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : "0x", - maxFeePerGas ? numberToHex(maxFeePerGas) : "0x", - gas ? numberToHex(gas) : "0x", - to ?? "0x", - value ? numberToHex(value) : "0x", - data ?? "0x", - serializedAccessList, - ...toYParitySignatureArray(transaction, signature2) - ]; - return concatHex([ - "0x02", - toRlp(serializedTransaction) - ]); -} -function serializeTransactionEIP2930(transaction, signature2) { - const { chainId, gas, data, nonce, to, value, accessList, gasPrice } = transaction; - assertTransactionEIP2930(transaction); - const serializedAccessList = serializeAccessList(accessList); - const serializedTransaction = [ - numberToHex(chainId), - nonce ? numberToHex(nonce) : "0x", - gasPrice ? numberToHex(gasPrice) : "0x", - gas ? numberToHex(gas) : "0x", - to ?? "0x", - value ? numberToHex(value) : "0x", - data ?? "0x", - serializedAccessList, - ...toYParitySignatureArray(transaction, signature2) - ]; - return concatHex([ - "0x01", - toRlp(serializedTransaction) - ]); + const cleanup = fn(emit); + if (typeof cleanup === "function") + cleanupCache.set(observerId, cleanup); + return unwatch; } -function serializeTransactionLegacy(transaction, signature2) { - const { chainId = 0, gas, data, nonce, to, value, gasPrice } = transaction; - assertTransactionLegacy(transaction); - let serializedTransaction = [ - nonce ? numberToHex(nonce) : "0x", - gasPrice ? numberToHex(gasPrice) : "0x", - gas ? numberToHex(gas) : "0x", - to ?? "0x", - value ? numberToHex(value) : "0x", - data ?? "0x" - ]; - if (signature2) { - const v = (() => { - if (signature2.v >= 35n) { - const inferredChainId = (signature2.v - 35n) / 2n; - if (inferredChainId > 0) - return signature2.v; - return 27n + (signature2.v === 35n ? 0n : 1n); - } - if (chainId > 0) - return BigInt(chainId * 2) + BigInt(35n + signature2.v - 27n); - const v2 = 27n + (signature2.v === 27n ? 0n : 1n); - if (signature2.v !== v2) - throw new InvalidLegacyVError({ v: signature2.v }); - return v2; - })(); - const r = trim(signature2.r); - const s3 = trim(signature2.s); - serializedTransaction = [ - ...serializedTransaction, - numberToHex(v), - r === "0x00" ? "0x" : r, - s3 === "0x00" ? "0x" : s3 - ]; - } else if (chainId > 0) { - serializedTransaction = [ - ...serializedTransaction, - numberToHex(chainId), - "0x", - "0x" - ]; +var listenersCache, cleanupCache, callbackCount; +var init_observe = __esm({ + "node_modules/viem/_esm/utils/observe.js"() { + "use strict"; + listenersCache = /* @__PURE__ */ new Map(); + cleanupCache = /* @__PURE__ */ new Map(); + callbackCount = 0; } - return toRlp(serializedTransaction); -} -function toYParitySignatureArray(transaction, signature_) { - const signature2 = signature_ ?? transaction; - const { v, yParity } = signature2; - if (typeof signature2.r === "undefined") - return []; - if (typeof signature2.s === "undefined") - return []; - if (typeof v === "undefined" && typeof yParity === "undefined") - return []; - const r = trim(signature2.r); - const s3 = trim(signature2.s); - const yParity_ = (() => { - if (typeof yParity === "number") - return yParity ? numberToHex(1) : "0x"; - if (v === 0n) - return "0x"; - if (v === 1n) - return numberToHex(1); - return v === 27n ? "0x" : numberToHex(1); - })(); - return [yParity_, r === "0x00" ? "0x" : r, s3 === "0x00" ? "0x" : s3]; +}); + +// node_modules/viem/_esm/utils/wait.js +async function wait(time) { + return new Promise((res) => setTimeout(res, time)); } -var init_serializeTransaction = __esm({ - "node_modules/viem/_esm/utils/transaction/serializeTransaction.js"() { +var init_wait = __esm({ + "node_modules/viem/_esm/utils/wait.js"() { "use strict"; - init_transaction(); - init_serializeAuthorizationList(); - init_blobsToCommitments(); - init_blobsToProofs(); - init_commitmentsToVersionedHashes(); - init_toBlobSidecars(); - init_concat(); - init_trim(); - init_toHex(); - init_toRlp(); - init_assertTransaction(); - init_getTransactionType(); - init_serializeAccessList(); } }); -// node_modules/viem/_esm/utils/authorization/serializeAuthorizationList.js -function serializeAuthorizationList(authorizationList) { - if (!authorizationList || authorizationList.length === 0) - return []; - const serializedAuthorizationList = []; - for (const authorization of authorizationList) { - const { chainId, nonce, ...signature2 } = authorization; - const contractAddress = authorization.address; - serializedAuthorizationList.push([ - chainId ? toHex(chainId) : "0x", - contractAddress, - nonce ? toHex(nonce) : "0x", - ...toYParitySignatureArray({}, signature2) - ]); - } - return serializedAuthorizationList; +// node_modules/viem/_esm/utils/poll.js +function poll(fn, { emitOnBegin, initialWaitTime, interval }) { + let active = true; + const unwatch = () => active = false; + const watch = async () => { + let data; + if (emitOnBegin) + data = await fn({ unpoll: unwatch }); + const initialWait = await initialWaitTime?.(data) ?? interval; + await wait(initialWait); + const poll2 = async () => { + if (!active) + return; + await fn({ unpoll: unwatch }); + await wait(interval); + poll2(); + }; + poll2(); + }; + watch(); + return unwatch; } -var init_serializeAuthorizationList = __esm({ - "node_modules/viem/_esm/utils/authorization/serializeAuthorizationList.js"() { +var init_poll = __esm({ + "node_modules/viem/_esm/utils/poll.js"() { "use strict"; - init_toHex(); - init_serializeTransaction(); + init_wait(); } }); -// node_modules/viem/_esm/constants/strings.js -var presignMessagePrefix; -var init_strings = __esm({ - "node_modules/viem/_esm/constants/strings.js"() { +// node_modules/viem/_esm/utils/promise/withCache.js +function getCache(cacheKey2) { + const buildCache = (cacheKey3, cache2) => ({ + clear: () => cache2.delete(cacheKey3), + get: () => cache2.get(cacheKey3), + set: (data) => cache2.set(cacheKey3, data) + }); + const promise = buildCache(cacheKey2, promiseCache); + const response = buildCache(cacheKey2, responseCache); + return { + clear: () => { + promise.clear(); + response.clear(); + }, + promise, + response + }; +} +async function withCache(fn, { cacheKey: cacheKey2, cacheTime = Number.POSITIVE_INFINITY }) { + const cache2 = getCache(cacheKey2); + const response = cache2.response.get(); + if (response && cacheTime > 0) { + const age = Date.now() - response.created.getTime(); + if (age < cacheTime) + return response.data; + } + let promise = cache2.promise.get(); + if (!promise) { + promise = fn(); + cache2.promise.set(promise); + } + try { + const data = await promise; + cache2.response.set({ created: /* @__PURE__ */ new Date(), data }); + return data; + } finally { + cache2.promise.clear(); + } +} +var promiseCache, responseCache; +var init_withCache = __esm({ + "node_modules/viem/_esm/utils/promise/withCache.js"() { "use strict"; - presignMessagePrefix = "Ethereum Signed Message:\n"; + promiseCache = /* @__PURE__ */ new Map(); + responseCache = /* @__PURE__ */ new Map(); } }); -// node_modules/viem/_esm/utils/signature/toPrefixedMessage.js -function toPrefixedMessage(message_) { - const message = (() => { - if (typeof message_ === "string") - return stringToHex(message_); - if (typeof message_.raw === "string") - return message_.raw; - return bytesToHex(message_.raw); - })(); - const prefix = stringToHex(`${presignMessagePrefix}${size(message)}`); - return concat([prefix, message]); +// node_modules/viem/_esm/actions/public/getBlockNumber.js +async function getBlockNumber(client, { cacheTime = client.cacheTime } = {}) { + const blockNumberHex = await withCache(() => client.request({ + method: "eth_blockNumber" + }), { cacheKey: cacheKey(client.uid), cacheTime }); + return BigInt(blockNumberHex); } -var init_toPrefixedMessage = __esm({ - "node_modules/viem/_esm/utils/signature/toPrefixedMessage.js"() { +var cacheKey; +var init_getBlockNumber = __esm({ + "node_modules/viem/_esm/actions/public/getBlockNumber.js"() { "use strict"; - init_strings(); - init_concat(); - init_size(); - init_toHex(); + init_withCache(); + cacheKey = (id) => `blockNumber.${id}`; } }); -// node_modules/viem/_esm/utils/signature/hashMessage.js -function hashMessage(message, to_) { - return keccak256(toPrefixedMessage(message), to_); +// node_modules/viem/_esm/actions/public/getFilterChanges.js +async function getFilterChanges(_client, { filter }) { + const strict = "strict" in filter && filter.strict; + const logs = await filter.request({ + method: "eth_getFilterChanges", + params: [filter.id] + }); + if (typeof logs[0] === "string") + return logs; + const formattedLogs = logs.map((log) => formatLog(log)); + if (!("abi" in filter) || !filter.abi) + return formattedLogs; + return parseEventLogs({ + abi: filter.abi, + logs: formattedLogs, + strict + }); } -var init_hashMessage = __esm({ - "node_modules/viem/_esm/utils/signature/hashMessage.js"() { +var init_getFilterChanges = __esm({ + "node_modules/viem/_esm/actions/public/getFilterChanges.js"() { "use strict"; - init_keccak256(); - init_toPrefixedMessage(); + init_parseEventLogs(); + init_log2(); } }); -// node_modules/viem/_esm/errors/typedData.js -var InvalidDomainError, InvalidPrimaryTypeError, InvalidStructTypeError; -var init_typedData = __esm({ - "node_modules/viem/_esm/errors/typedData.js"() { +// node_modules/viem/_esm/actions/public/uninstallFilter.js +async function uninstallFilter(_client, { filter }) { + return filter.request({ + method: "eth_uninstallFilter", + params: [filter.id] + }); +} +var init_uninstallFilter = __esm({ + "node_modules/viem/_esm/actions/public/uninstallFilter.js"() { "use strict"; - init_stringify(); - init_base(); - InvalidDomainError = class extends BaseError2 { - constructor({ domain }) { - super(`Invalid domain "${stringify(domain)}".`, { - metaMessages: ["Must be a valid EIP-712 domain."] - }); - } - }; - InvalidPrimaryTypeError = class extends BaseError2 { - constructor({ primaryType, types }) { - super(`Invalid primary type \`${primaryType}\` must be one of \`${JSON.stringify(Object.keys(types))}\`.`, { - docsPath: "/api/glossary/Errors#typeddatainvalidprimarytypeerror", - metaMessages: ["Check that the primary type is a key in `types`."] - }); - } - }; - InvalidStructTypeError = class extends BaseError2 { - constructor({ type }) { - super(`Struct type "${type}" is invalid.`, { - metaMessages: ["Struct type must not be a Solidity type."], - name: "InvalidStructTypeError" - }); - } - }; } }); -// node_modules/viem/_esm/utils/typedData.js -function validateTypedData(parameters) { - const { domain, message, primaryType, types } = parameters; - const validateData = (struct, data) => { - for (const param of struct) { - const { name, type } = param; - const value = data[name]; - const integerMatch = type.match(integerRegex2); - if (integerMatch && (typeof value === "number" || typeof value === "bigint")) { - const [_type, base2, size_] = integerMatch; - numberToHex(value, { - signed: base2 === "int", - size: Number.parseInt(size_, 10) / 8 - }); - } - if (type === "address" && typeof value === "string" && !isAddress(value)) - throw new InvalidAddressError({ address: value }); - const bytesMatch = type.match(bytesRegex2); - if (bytesMatch) { - const [_type, size_] = bytesMatch; - if (size_ && size(value) !== Number.parseInt(size_, 10)) - throw new BytesSizeMismatchError({ - expectedSize: Number.parseInt(size_, 10), - givenSize: size(value) +// node_modules/viem/_esm/actions/public/watchContractEvent.js +function watchContractEvent(client, parameters) { + const { abi: abi2, address: address2, args, batch = true, eventName, fromBlock, onError, onLogs, poll: poll_, pollingInterval = client.pollingInterval, strict: strict_ } = parameters; + const enablePolling = (() => { + if (typeof poll_ !== "undefined") + return poll_; + if (typeof fromBlock === "bigint") + return true; + if (client.transport.type === "webSocket" || client.transport.type === "ipc") + return false; + if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) + return false; + return true; + })(); + const pollContractEvent = () => { + const strict = strict_ ?? false; + const observerId = stringify([ + "watchContractEvent", + address2, + args, + batch, + client.uid, + eventName, + pollingInterval, + strict, + fromBlock + ]); + return observe(observerId, { onLogs, onError }, (emit) => { + let previousBlockNumber; + if (fromBlock !== void 0) + previousBlockNumber = fromBlock - 1n; + let filter; + let initialized = false; + const unwatch = poll(async () => { + if (!initialized) { + try { + filter = await getAction(client, createContractEventFilter, "createContractEventFilter")({ + abi: abi2, + address: address2, + args, + eventName, + strict, + fromBlock + }); + } catch { + } + initialized = true; + return; + } + try { + let logs; + if (filter) { + logs = await getAction(client, getFilterChanges, "getFilterChanges")({ filter }); + } else { + const blockNumber = await getAction(client, getBlockNumber, "getBlockNumber")({}); + if (previousBlockNumber && previousBlockNumber < blockNumber) { + logs = await getAction(client, getContractEvents, "getContractEvents")({ + abi: abi2, + address: address2, + args, + eventName, + fromBlock: previousBlockNumber + 1n, + toBlock: blockNumber, + strict + }); + } else { + logs = []; + } + previousBlockNumber = blockNumber; + } + if (logs.length === 0) + return; + if (batch) + emit.onLogs(logs); + else + for (const log of logs) + emit.onLogs([log]); + } catch (err) { + if (filter && err instanceof InvalidInputRpcError) + initialized = false; + emit.onError?.(err); + } + }, { + emitOnBegin: true, + interval: pollingInterval + }); + return async () => { + if (filter) + await getAction(client, uninstallFilter, "uninstallFilter")({ filter }); + unwatch(); + }; + }); + }; + const subscribeContractEvent = () => { + const strict = strict_ ?? false; + const observerId = stringify([ + "watchContractEvent", + address2, + args, + batch, + client.uid, + eventName, + pollingInterval, + strict + ]); + let active = true; + let unsubscribe = () => active = false; + return observe(observerId, { onLogs, onError }, (emit) => { + ; + (async () => { + try { + const transport = (() => { + if (client.transport.type === "fallback") { + const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); + if (!transport2) + return client.transport; + return transport2.value; + } + return client.transport; + })(); + const topics = eventName ? encodeEventTopics({ + abi: abi2, + eventName, + args + }) : []; + const { unsubscribe: unsubscribe_ } = await transport.subscribe({ + params: ["logs", { address: address2, topics }], + onData(data) { + if (!active) + return; + const log = data.result; + try { + const { eventName: eventName2, args: args2 } = decodeEventLog({ + abi: abi2, + data: log.data, + topics: log.topics, + strict: strict_ + }); + const formatted = formatLog(log, { + args: args2, + eventName: eventName2 + }); + emit.onLogs([formatted]); + } catch (err) { + let eventName2; + let isUnnamed; + if (err instanceof DecodeLogDataMismatch || err instanceof DecodeLogTopicsMismatch) { + if (strict_) + return; + eventName2 = err.abiItem.name; + isUnnamed = err.abiItem.inputs?.some((x) => !("name" in x && x.name)); + } + const formatted = formatLog(log, { + args: isUnnamed ? [] : {}, + eventName: eventName2 + }); + emit.onLogs([formatted]); + } + }, + onError(error) { + emit.onError?.(error); + } }); - } - const struct2 = types[type]; - if (struct2) { - validateReference(type); - validateData(struct2, value); - } - } + unsubscribe = unsubscribe_; + if (!active) + unsubscribe(); + } catch (err) { + onError?.(err); + } + })(); + return () => unsubscribe(); + }); }; - if (types.EIP712Domain && domain) { - if (typeof domain !== "object") - throw new InvalidDomainError({ domain }); - validateData(types.EIP712Domain, domain); - } - if (primaryType !== "EIP712Domain") { - if (types[primaryType]) - validateData(types[primaryType], message); - else - throw new InvalidPrimaryTypeError({ primaryType, types }); - } -} -function getTypesForEIP712Domain({ domain }) { - return [ - typeof domain?.name === "string" && { name: "name", type: "string" }, - domain?.version && { name: "version", type: "string" }, - (typeof domain?.chainId === "number" || typeof domain?.chainId === "bigint") && { - name: "chainId", - type: "uint256" - }, - domain?.verifyingContract && { - name: "verifyingContract", - type: "address" - }, - domain?.salt && { name: "salt", type: "bytes32" } - ].filter(Boolean); -} -function validateReference(type) { - if (type === "address" || type === "bool" || type === "string" || type.startsWith("bytes") || type.startsWith("uint") || type.startsWith("int")) - throw new InvalidStructTypeError({ type }); + return enablePolling ? pollContractEvent() : subscribeContractEvent(); } -var init_typedData2 = __esm({ - "node_modules/viem/_esm/utils/typedData.js"() { +var init_watchContractEvent = __esm({ + "node_modules/viem/_esm/actions/public/watchContractEvent.js"() { "use strict"; init_abi(); - init_address(); - init_typedData(); - init_isAddress(); - init_size(); - init_toHex(); - init_regex2(); + init_rpc(); + init_decodeEventLog(); + init_encodeEventTopics(); + init_log2(); + init_getAction(); + init_observe(); + init_poll(); + init_stringify(); + init_createContractEventFilter(); + init_getBlockNumber(); + init_getContractEvents(); + init_getFilterChanges(); + init_uninstallFilter(); } }); -// node_modules/viem/_esm/utils/signature/hashTypedData.js -function hashTypedData(parameters) { - const { domain = {}, message, primaryType } = parameters; - const types = { - EIP712Domain: getTypesForEIP712Domain({ domain }), - ...parameters.types - }; - validateTypedData({ - domain, - message, - primaryType, - types - }); - const parts = ["0x1901"]; - if (domain) - parts.push(hashDomain({ - domain, - types - })); - if (primaryType !== "EIP712Domain") - parts.push(hashStruct({ - data: message, - primaryType, - types - })); - return keccak256(concat(parts)); -} -function hashDomain({ domain, types }) { - return hashStruct({ - data: domain, - primaryType: "EIP712Domain", - types - }); -} -function hashStruct({ data, primaryType, types }) { - const encoded = encodeData({ - data, - primaryType, - types - }); - return keccak256(encoded); -} -function encodeData({ data, primaryType, types }) { - const encodedTypes = [{ type: "bytes32" }]; - const encodedValues = [hashType({ primaryType, types })]; - for (const field of types[primaryType]) { - const [type, value] = encodeField({ - types, - name: field.name, - type: field.type, - value: data[field.name] - }); - encodedTypes.push(type); - encodedValues.push(value); - } - return encodeAbiParameters(encodedTypes, encodedValues); -} -function hashType({ primaryType, types }) { - const encodedHashType = toHex(encodeType({ primaryType, types })); - return keccak256(encodedHashType); -} -function encodeType({ primaryType, types }) { - let result = ""; - const unsortedDeps = findTypeDependencies({ primaryType, types }); - unsortedDeps.delete(primaryType); - const deps = [primaryType, ...Array.from(unsortedDeps).sort()]; - for (const type of deps) { - result += `${type}(${types[type].map(({ name, type: t }) => `${t} ${name}`).join(",")})`; - } - return result; -} -function findTypeDependencies({ primaryType: primaryType_, types }, results = /* @__PURE__ */ new Set()) { - const match = primaryType_.match(/^\w*/u); - const primaryType = match?.[0]; - if (results.has(primaryType) || types[primaryType] === void 0) { - return results; - } - results.add(primaryType); - for (const field of types[primaryType]) { - findTypeDependencies({ primaryType: field.type, types }, results); - } - return results; +// node_modules/viem/_esm/actions/wallet/sendRawTransaction.js +async function sendRawTransaction(client, { serializedTransaction }) { + return client.request({ + method: "eth_sendRawTransaction", + params: [serializedTransaction] + }, { retryCount: 0 }); } -function encodeField({ types, name, type, value }) { - if (types[type] !== void 0) { - return [ - { type: "bytes32" }, - keccak256(encodeData({ data: value, primaryType: type, types })) - ]; - } - if (type === "bytes") - return [{ type: "bytes32" }, keccak256(value)]; - if (type === "string") - return [{ type: "bytes32" }, keccak256(toHex(value))]; - if (type.lastIndexOf("]") === type.length - 1) { - const parsedType = type.slice(0, type.lastIndexOf("[")); - const typeValuePairs = value.map((item) => encodeField({ - name, - type: parsedType, - types, - value: item - })); - return [ - { type: "bytes32" }, - keccak256(encodeAbiParameters(typeValuePairs.map(([t]) => t), typeValuePairs.map(([, v]) => v))) - ]; +var init_sendRawTransaction = __esm({ + "node_modules/viem/_esm/actions/wallet/sendRawTransaction.js"() { + "use strict"; } - return [{ type }, value]; +}); + +// node_modules/viem/_esm/utils/promise/withRetry.js +function withRetry(fn, { delay: delay_ = 100, retryCount = 2, shouldRetry: shouldRetry2 = () => true } = {}) { + return new Promise((resolve, reject) => { + const attemptRetry = async ({ count = 0 } = {}) => { + const retry = async ({ error }) => { + const delay = typeof delay_ === "function" ? delay_({ count, error }) : delay_; + if (delay) + await wait(delay); + attemptRetry({ count: count + 1 }); + }; + try { + const data = await fn(); + resolve(data); + } catch (err) { + if (count < retryCount && await shouldRetry2({ count, error: err })) + return retry({ error: err }); + reject(err); + } + }; + attemptRetry(); + }); } -var init_hashTypedData = __esm({ - "node_modules/viem/_esm/utils/signature/hashTypedData.js"() { +var init_withRetry = __esm({ + "node_modules/viem/_esm/utils/promise/withRetry.js"() { "use strict"; - init_encodeAbiParameters(); - init_concat(); - init_toHex(); - init_keccak256(); - init_typedData2(); + init_wait(); } }); -// node_modules/viem/_esm/utils/signature/serializeSignature.js -function serializeSignature({ r, s: s3, to = "hex", v, yParity }) { - const yParity_ = (() => { - if (yParity === 0 || yParity === 1) - return yParity; - if (v && (v === 27n || v === 28n || v >= 35n)) - return v % 2n === 0n ? 1 : 0; - throw new Error("Invalid `v` or `yParity` value"); - })(); - const signature2 = `0x${new secp256k1.Signature(hexToBigInt(r), hexToBigInt(s3)).toCompactHex()}${yParity_ === 0 ? "1b" : "1c"}`; - if (to === "hex") - return signature2; - return hexToBytes(signature2); +// node_modules/viem/_esm/utils/formatters/transactionReceipt.js +function formatTransactionReceipt(transactionReceipt, _) { + const receipt = { + ...transactionReceipt, + blockNumber: transactionReceipt.blockNumber ? BigInt(transactionReceipt.blockNumber) : null, + contractAddress: transactionReceipt.contractAddress ? transactionReceipt.contractAddress : null, + cumulativeGasUsed: transactionReceipt.cumulativeGasUsed ? BigInt(transactionReceipt.cumulativeGasUsed) : null, + effectiveGasPrice: transactionReceipt.effectiveGasPrice ? BigInt(transactionReceipt.effectiveGasPrice) : null, + gasUsed: transactionReceipt.gasUsed ? BigInt(transactionReceipt.gasUsed) : null, + logs: transactionReceipt.logs ? transactionReceipt.logs.map((log) => formatLog(log)) : null, + to: transactionReceipt.to ? transactionReceipt.to : null, + transactionIndex: transactionReceipt.transactionIndex ? hexToNumber(transactionReceipt.transactionIndex) : null, + status: transactionReceipt.status ? receiptStatuses[transactionReceipt.status] : null, + type: transactionReceipt.type ? transactionType[transactionReceipt.type] || transactionReceipt.type : null + }; + if (transactionReceipt.blobGasPrice) + receipt.blobGasPrice = BigInt(transactionReceipt.blobGasPrice); + if (transactionReceipt.blobGasUsed) + receipt.blobGasUsed = BigInt(transactionReceipt.blobGasUsed); + return receipt; } -var init_serializeSignature = __esm({ - "node_modules/viem/_esm/utils/signature/serializeSignature.js"() { +var receiptStatuses, defineTransactionReceipt; +var init_transactionReceipt = __esm({ + "node_modules/viem/_esm/utils/formatters/transactionReceipt.js"() { "use strict"; - init_secp256k1(); init_fromHex(); - init_toBytes(); + init_formatter(); + init_log2(); + init_transaction2(); + receiptStatuses = { + "0x0": "reverted", + "0x1": "success" + }; + defineTransactionReceipt = /* @__PURE__ */ defineFormatter("transactionReceipt", formatTransactionReceipt); } }); -// node_modules/@scure/base/lib/esm/index.js -function isBytes4(a) { - return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; -} -function isArrayOf(isString, arr) { - if (!Array.isArray(arr)) - return false; - if (arr.length === 0) - return true; - if (isString) { - return arr.every((item) => typeof item === "string"); - } else { - return arr.every((item) => Number.isSafeInteger(item)); - } -} -function afn(input) { - if (typeof input !== "function") - throw new Error("function expected"); - return true; -} -function astr(label, input) { - if (typeof input !== "string") - throw new Error(`${label}: string expected`); - return true; -} -function anumber2(n) { - if (!Number.isSafeInteger(n)) - throw new Error(`invalid integer: ${n}`); -} -function aArr(input) { - if (!Array.isArray(input)) - throw new Error("array expected"); -} -function astrArr(label, input) { - if (!isArrayOf(true, input)) - throw new Error(`${label}: array of strings expected`); -} -function anumArr(label, input) { - if (!isArrayOf(false, input)) - throw new Error(`${label}: array of numbers expected`); -} -// @__NO_SIDE_EFFECTS__ -function chain(...args) { - const id = (a) => a; - const wrap3 = (a, b) => (c2) => a(b(c2)); - const encode4 = args.map((x) => x.encode).reduceRight(wrap3, id); - const decode2 = args.map((x) => x.decode).reduce(wrap3, id); - return { encode: encode4, decode: decode2 }; -} -// @__NO_SIDE_EFFECTS__ -function alphabet(letters) { - const lettersA = typeof letters === "string" ? letters.split("") : letters; - const len = lettersA.length; - astrArr("alphabet", lettersA); - const indexes = new Map(lettersA.map((l2, i) => [l2, i])); - return { - encode: (digits) => { - aArr(digits); - return digits.map((i) => { - if (!Number.isSafeInteger(i) || i < 0 || i >= len) - throw new Error(`alphabet.encode: digit index outside alphabet "${i}". Allowed: ${letters}`); - return lettersA[i]; - }); - }, - decode: (input) => { - aArr(input); - return input.map((letter) => { - astr("alphabet.decode", letter); - const i = indexes.get(letter); - if (i === void 0) - throw new Error(`Unknown letter: "${letter}". Allowed: ${letters}`); - return i; - }); - } - }; -} -// @__NO_SIDE_EFFECTS__ -function join(separator = "") { - astr("join", separator); - return { - encode: (from14) => { - astrArr("join.decode", from14); - return from14.join(separator); - }, - decode: (to) => { - astr("join.decode", to); - return to.split(separator); - } - }; -} -// @__NO_SIDE_EFFECTS__ -function padding(bits, chr = "=") { - anumber2(bits); - astr("padding", chr); - return { - encode(data) { - astrArr("padding.encode", data); - while (data.length * bits % 8) - data.push(chr); - return data; - }, - decode(input) { - astrArr("padding.decode", input); - let end = input.length; - if (end * bits % 8) - throw new Error("padding: invalid, string should have whole number of bytes"); - for (; end > 0 && input[end - 1] === chr; end--) { - const last = end - 1; - const byte = last * bits; - if (byte % 8 === 0) - throw new Error("padding: invalid, string has too much padding"); - } - return input.slice(0, end); - } - }; -} -function convertRadix(data, from14, to) { - if (from14 < 2) - throw new Error(`convertRadix: invalid from=${from14}, base cannot be less than 2`); - if (to < 2) - throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`); - aArr(data); - if (!data.length) - return []; - let pos = 0; - const res = []; - const digits = Array.from(data, (d) => { - anumber2(d); - if (d < 0 || d >= from14) - throw new Error(`invalid integer: ${d}`); - return d; - }); - const dlen = digits.length; - while (true) { - let carry = 0; - let done = true; - for (let i = pos; i < dlen; i++) { - const digit = digits[i]; - const fromCarry = from14 * carry; - const digitBase = fromCarry + digit; - if (!Number.isSafeInteger(digitBase) || fromCarry / from14 !== carry || digitBase - digit !== fromCarry) { - throw new Error("convertRadix: carry overflow"); - } - const div = digitBase / to; - carry = digitBase % to; - const rounded = Math.floor(div); - digits[i] = rounded; - if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase) - throw new Error("convertRadix: carry overflow"); - if (!done) - continue; - else if (!rounded) - pos = i; - else - done = false; +// node_modules/viem/_esm/utils/uid.js +function uid(length = 11) { + if (!buffer || index + length > size4 * 2) { + buffer = ""; + index = 0; + for (let i = 0; i < size4; i++) { + buffer += (256 + Math.random() * 256 | 0).toString(16).substring(1); } - res.push(carry); - if (done) - break; } - for (let i = 0; i < data.length - 1 && data[i] === 0; i++) - res.push(0); - return res.reverse(); + return buffer.substring(index, index++ + length); } -function convertRadix2(data, from14, to, padding2) { - aArr(data); - if (from14 <= 0 || from14 > 32) - throw new Error(`convertRadix2: wrong from=${from14}`); - if (to <= 0 || to > 32) - throw new Error(`convertRadix2: wrong to=${to}`); - if (/* @__PURE__ */ radix2carry(from14, to) > 32) { - throw new Error(`convertRadix2: carry overflow from=${from14} to=${to} carryBits=${/* @__PURE__ */ radix2carry(from14, to)}`); - } - let carry = 0; - let pos = 0; - const max = powers[from14]; - const mask = powers[to] - 1; - const res = []; - for (const n of data) { - anumber2(n); - if (n >= max) - throw new Error(`convertRadix2: invalid data word=${n} from=${from14}`); - carry = carry << from14 | n; - if (pos + from14 > 32) - throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from14}`); - pos += from14; - for (; pos >= to; pos -= to) - res.push((carry >> pos - to & mask) >>> 0); - const pow = powers[pos]; - if (pow === void 0) - throw new Error("invalid carry"); - carry &= pow - 1; +var size4, index, buffer; +var init_uid = __esm({ + "node_modules/viem/_esm/utils/uid.js"() { + "use strict"; + size4 = 256; + index = size4; } - carry = carry << to - pos & mask; - if (!padding2 && pos >= from14) - throw new Error("Excess padding"); - if (!padding2 && carry > 0) - throw new Error(`Non-zero padding: ${carry}`); - if (padding2 && pos > 0) - res.push(carry >>> 0); - return res; -} -// @__NO_SIDE_EFFECTS__ -function radix(num2) { - anumber2(num2); - const _256 = 2 ** 8; - return { - encode: (bytes) => { - if (!isBytes4(bytes)) - throw new Error("radix.encode input should be Uint8Array"); - return convertRadix(Array.from(bytes), _256, num2); - }, - decode: (digits) => { - anumArr("radix.decode", digits); - return Uint8Array.from(convertRadix(digits, num2, _256)); - } - }; -} -// @__NO_SIDE_EFFECTS__ -function radix2(bits, revPadding = false) { - anumber2(bits); - if (bits <= 0 || bits > 32) - throw new Error("radix2: bits should be in (0..32]"); - if (/* @__PURE__ */ radix2carry(8, bits) > 32 || /* @__PURE__ */ radix2carry(bits, 8) > 32) - throw new Error("radix2: carry overflow"); - return { - encode: (bytes) => { - if (!isBytes4(bytes)) - throw new Error("radix2.encode input should be Uint8Array"); - return convertRadix2(Array.from(bytes), 8, bits, !revPadding); - }, - decode: (digits) => { - anumArr("radix2.decode", digits); - return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding)); - } - }; -} -function checksum3(len, fn) { - anumber2(len); - afn(fn); - return { - encode(data) { - if (!isBytes4(data)) - throw new Error("checksum.encode: input should be Uint8Array"); - const sum = fn(data).slice(0, len); - const res = new Uint8Array(data.length + len); - res.set(data); - res.set(sum, data.length); - return res; - }, - decode(data) { - if (!isBytes4(data)) - throw new Error("checksum.decode: input should be Uint8Array"); - const payload = data.slice(0, -len); - const oldChecksum = data.slice(-len); - const newChecksum = fn(payload).slice(0, len); - for (let i = 0; i < len; i++) - if (newChecksum[i] !== oldChecksum[i]) - throw new Error("Invalid checksum"); - return payload; - } +}); + +// node_modules/viem/_esm/clients/createClient.js +function createClient(parameters) { + const { batch, chain: chain3, ccipRead, dataSuffix, key = "base", name = "Base Client", type = "base" } = parameters; + const experimental_blockTag = parameters.experimental_blockTag ?? (typeof chain3?.experimental_preconfirmationTime === "number" ? "pending" : void 0); + const blockTime = chain3?.blockTime ?? 12e3; + const defaultPollingInterval = Math.min(Math.max(Math.floor(blockTime / 2), 500), 4e3); + const pollingInterval = parameters.pollingInterval ?? defaultPollingInterval; + const cacheTime = parameters.cacheTime ?? pollingInterval; + const account = parameters.account ? parseAccount(parameters.account) : void 0; + const { config, request, value } = parameters.transport({ + account, + chain: chain3, + pollingInterval + }); + const transport = { ...config, ...value }; + const client = { + account, + batch, + cacheTime, + ccipRead, + chain: chain3, + dataSuffix, + key, + name, + pollingInterval, + request, + transport, + type, + uid: uid(), + ...experimental_blockTag ? { experimental_blockTag } : {} }; + function extend(base2) { + return (extendFn) => { + const extended = extendFn(base2); + for (const key2 in client) + delete extended[key2]; + const combined = { ...base2, ...extended }; + return Object.assign(combined, { extend: extend(combined) }); + }; + } + return Object.assign(client, { extend: extend(client) }); } -var gcd, radix2carry, powers, utils; -var init_esm = __esm({ - "node_modules/@scure/base/lib/esm/index.js"() { +var init_createClient = __esm({ + "node_modules/viem/_esm/clients/createClient.js"() { "use strict"; - gcd = (a, b) => b === 0 ? a : gcd(b, a % b); - radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from14, to) => from14 + (to - gcd(from14, to)); - powers = /* @__PURE__ */ (() => { - let res = []; - for (let i = 0; i < 40; i++) - res.push(2 ** i); - return res; - })(); - utils = { - alphabet, - chain, - checksum: checksum3, - convertRadix, - convertRadix2, - radix, - radix2, - join, - padding - }; + init_parseAccount(); + init_uid(); } }); -// node_modules/@noble/hashes/esm/pbkdf2.js -function pbkdf2Init(hash3, _password, _salt, _opts) { - ahash(hash3); - const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts); - const { c: c2, dkLen, asyncTick } = opts; - anumber(c2); - anumber(dkLen); - anumber(asyncTick); - if (c2 < 1) - throw new Error("iterations (c) should be >= 1"); - const password = kdfInputToBytes(_password); - const salt = kdfInputToBytes(_salt); - const DK = new Uint8Array(dkLen); - const PRF = hmac.create(hash3, password); - const PRFSalt = PRF._cloneInto().update(salt); - return { c: c2, dkLen, asyncTick, DK, PRF, PRFSalt }; -} -function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) { - PRF.destroy(); - PRFSalt.destroy(); - if (prfW) - prfW.destroy(); - clean(u); - return DK; +// node_modules/viem/_esm/utils/ens/errors.js +function isNullUniversalResolverError(err) { + if (!(err instanceof BaseError2)) + return false; + const cause = err.walk((e7) => e7 instanceof ContractFunctionRevertedError); + if (!(cause instanceof ContractFunctionRevertedError)) + return false; + if (cause.data?.errorName === "HttpError") + return true; + if (cause.data?.errorName === "ResolverError") + return true; + if (cause.data?.errorName === "ResolverNotContract") + return true; + if (cause.data?.errorName === "ResolverNotFound") + return true; + if (cause.data?.errorName === "ReverseAddressMismatch") + return true; + if (cause.data?.errorName === "UnsupportedResolverProfile") + return true; + return false; } -function pbkdf2(hash3, password, salt, opts) { - const { c: c2, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash3, password, salt, opts); - let prfW; - const arr = new Uint8Array(4); - const view = createView(arr); - const u = new Uint8Array(PRF.outputLen); - for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) { - const Ti = DK.subarray(pos, pos + PRF.outputLen); - view.setInt32(0, ti, false); - (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u); - Ti.set(u.subarray(0, Ti.length)); - for (let ui = 1; ui < c2; ui++) { - PRF._cloneInto(prfW).update(u).digestInto(u); - for (let i = 0; i < Ti.length; i++) - Ti[i] ^= u[i]; - } +var init_errors3 = __esm({ + "node_modules/viem/_esm/utils/ens/errors.js"() { + "use strict"; + init_base(); + init_contract(); } - return pbkdf2Output(PRF, PRFSalt, DK, prfW, u); +}); + +// node_modules/viem/_esm/utils/ens/encodedLabelToLabelhash.js +function encodedLabelToLabelhash(label) { + if (label.length !== 66) + return null; + if (label.indexOf("[") !== 0) + return null; + if (label.indexOf("]") !== 65) + return null; + const hash3 = `0x${label.slice(1, 65)}`; + if (!isHex(hash3)) + return null; + return hash3; } -var init_pbkdf2 = __esm({ - "node_modules/@noble/hashes/esm/pbkdf2.js"() { +var init_encodedLabelToLabelhash = __esm({ + "node_modules/viem/_esm/utils/ens/encodedLabelToLabelhash.js"() { "use strict"; - init_hmac(); - init_utils2(); + init_isHex(); } }); -// node_modules/@scure/bip39/esm/index.js -function nfkd(str) { - if (typeof str !== "string") - throw new TypeError("invalid mnemonic type: " + typeof str); - return str.normalize("NFKD"); -} -function normalize(str) { - const norm = nfkd(str); - const words = norm.split(" "); - if (![12, 15, 18, 21, 24].includes(words.length)) - throw new Error("Invalid mnemonic"); - return { nfkd: norm, words }; -} -function aentropy(ent) { - abytes(ent, 16, 20, 24, 28, 32); -} -function generateMnemonic(wordlist2, strength = 128) { - anumber(strength); - if (strength % 32 !== 0 || strength > 256) - throw new TypeError("Invalid entropy"); - return entropyToMnemonic(randomBytes(strength / 8), wordlist2); -} -function getCoder(wordlist2) { - if (!Array.isArray(wordlist2) || wordlist2.length !== 2048 || typeof wordlist2[0] !== "string") - throw new Error("Wordlist: expected array of 2048 strings"); - wordlist2.forEach((i) => { - if (typeof i !== "string") - throw new Error("wordlist: non-string element: " + i); - }); - return utils.chain(utils.checksum(1, calcChecksum), utils.radix2(11, true), utils.alphabet(wordlist2)); -} -function mnemonicToEntropy(mnemonic, wordlist2) { - const { words } = normalize(mnemonic); - const entropy = getCoder(wordlist2).decode(words); - aentropy(entropy); - return entropy; -} -function entropyToMnemonic(entropy, wordlist2) { - aentropy(entropy); - const words = getCoder(wordlist2).encode(entropy); - return words.join(isJapanese(wordlist2) ? "\u3000" : " "); +// node_modules/viem/_esm/utils/ens/namehash.js +function namehash(name) { + let result = new Uint8Array(32).fill(0); + if (!name) + return bytesToHex(result); + const labels = name.split("."); + for (let i = labels.length - 1; i >= 0; i -= 1) { + const hashFromEncodedLabel = encodedLabelToLabelhash(labels[i]); + const hashed = hashFromEncodedLabel ? toBytes(hashFromEncodedLabel) : keccak256(stringToBytes(labels[i]), "bytes"); + result = keccak256(concat([result, hashed]), "bytes"); + } + return bytesToHex(result); } -function validateMnemonic(mnemonic, wordlist2) { - try { - mnemonicToEntropy(mnemonic, wordlist2); - } catch (e7) { - return false; +var init_namehash = __esm({ + "node_modules/viem/_esm/utils/ens/namehash.js"() { + "use strict"; + init_concat(); + init_toBytes(); + init_toHex(); + init_keccak256(); + init_encodedLabelToLabelhash(); } - return true; +}); + +// node_modules/viem/_esm/utils/ens/encodeLabelhash.js +function encodeLabelhash(hash3) { + return `[${hash3.slice(2)}]`; } -function mnemonicToSeedSync(mnemonic, passphrase = "") { - return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 }); +var init_encodeLabelhash = __esm({ + "node_modules/viem/_esm/utils/ens/encodeLabelhash.js"() { + "use strict"; + } +}); + +// node_modules/viem/_esm/utils/ens/labelhash.js +function labelhash(label) { + const result = new Uint8Array(32).fill(0); + if (!label) + return bytesToHex(result); + return encodedLabelToLabelhash(label) || keccak256(stringToBytes(label)); } -var isJapanese, calcChecksum, psalt; -var init_esm2 = __esm({ - "node_modules/@scure/bip39/esm/index.js"() { +var init_labelhash = __esm({ + "node_modules/viem/_esm/utils/ens/labelhash.js"() { "use strict"; - init_pbkdf2(); - init_sha2(); - init_utils2(); - init_esm(); - isJapanese = (wordlist2) => wordlist2[0] === "\u3042\u3044\u3053\u304F\u3057\u3093"; - calcChecksum = (entropy) => { - const bitsLeft = 8 - entropy.length / 4; - return new Uint8Array([sha256(entropy)[0] >> bitsLeft << bitsLeft]); - }; - psalt = (passphrase) => nfkd("mnemonic" + passphrase); + init_toBytes(); + init_toHex(); + init_keccak256(); + init_encodedLabelToLabelhash(); } }); -// node_modules/viem/_esm/accounts/toAccount.js -function toAccount(source) { - if (typeof source === "string") { - if (!isAddress(source, { strict: false })) - throw new InvalidAddressError({ address: source }); - return { - address: source, - type: "json-rpc" - }; +// node_modules/viem/_esm/utils/ens/packetToBytes.js +function packetToBytes(packet) { + const value = packet.replace(/^\.|\.$/gm, ""); + if (value.length === 0) + return new Uint8Array(1); + const bytes = new Uint8Array(stringToBytes(value).byteLength + 2); + let offset = 0; + const list = value.split("."); + for (let i = 0; i < list.length; i++) { + let encoded = stringToBytes(list[i]); + if (encoded.byteLength > 255) + encoded = stringToBytes(encodeLabelhash(labelhash(list[i]))); + bytes[offset] = encoded.length; + bytes.set(encoded, offset + 1); + offset += encoded.length + 1; } - if (!isAddress(source.address, { strict: false })) - throw new InvalidAddressError({ address: source.address }); - return { - address: source.address, - nonceManager: source.nonceManager, - sign: source.sign, - signAuthorization: source.signAuthorization, - signMessage: source.signMessage, - signTransaction: source.signTransaction, - signTypedData: source.signTypedData, - source: "custom", - type: "local" - }; + if (bytes.byteLength !== offset + 1) + return bytes.slice(0, offset + 1); + return bytes; } -var init_toAccount = __esm({ - "node_modules/viem/_esm/accounts/toAccount.js"() { +var init_packetToBytes = __esm({ + "node_modules/viem/_esm/utils/ens/packetToBytes.js"() { "use strict"; - init_address(); - init_isAddress(); + init_toBytes(); + init_encodeLabelhash(); + init_labelhash(); } }); -// node_modules/viem/_esm/accounts/utils/sign.js -async function sign({ hash: hash3, privateKey, to = "object" }) { - const { r, s: s3, recovery } = secp256k1.sign(hash3.slice(2), privateKey.slice(2), { - lowS: true, - extraEntropy: isHex(extraEntropy, { strict: false }) ? hexToBytes(extraEntropy) : extraEntropy - }); - const signature2 = { - r: numberToHex(r, { size: 32 }), - s: numberToHex(s3, { size: 32 }), - v: recovery ? 28n : 27n, - yParity: recovery - }; - return (() => { - if (to === "bytes" || to === "hex") - return serializeSignature({ ...signature2, to }); - return signature2; +// node_modules/viem/_esm/actions/ens/getEnsAddress.js +async function getEnsAddress(client, parameters) { + const { blockNumber, blockTag, coinType, name, gatewayUrls, strict } = parameters; + const { chain: chain3 } = client; + const universalResolverAddress = (() => { + if (parameters.universalResolverAddress) + return parameters.universalResolverAddress; + if (!chain3) + throw new Error("client chain not configured. universalResolverAddress is required."); + return getChainContractAddress({ + blockNumber, + chain: chain3, + contract: "ensUniversalResolver" + }); + })(); + const tlds = chain3?.ensTlds; + if (tlds && !tlds.some((tld) => name.endsWith(tld))) + return null; + const args = (() => { + if (coinType != null) + return [namehash(name), BigInt(coinType)]; + return [namehash(name)]; })(); + try { + const functionData = encodeFunctionData({ + abi: addressResolverAbi, + functionName: "addr", + args + }); + const readContractParameters = { + address: universalResolverAddress, + abi: universalResolverResolveAbi, + functionName: "resolveWithGateways", + args: [ + toHex(packetToBytes(name)), + functionData, + gatewayUrls ?? [localBatchGatewayUrl] + ], + blockNumber, + blockTag + }; + const readContractAction = getAction(client, readContract, "readContract"); + const res = await readContractAction(readContractParameters); + if (res[0] === "0x") + return null; + const address2 = decodeFunctionResult({ + abi: addressResolverAbi, + args, + functionName: "addr", + data: res[0] + }); + if (address2 === "0x") + return null; + if (trim(address2) === "0x00") + return null; + return address2; + } catch (err) { + if (strict) + throw err; + if (isNullUniversalResolverError(err)) + return null; + throw err; + } } -var extraEntropy; -var init_sign = __esm({ - "node_modules/viem/_esm/accounts/utils/sign.js"() { +var init_getEnsAddress = __esm({ + "node_modules/viem/_esm/actions/ens/getEnsAddress.js"() { "use strict"; - init_secp256k1(); - init_isHex(); - init_toBytes(); + init_abis(); + init_decodeFunctionResult(); + init_encodeFunctionData(); + init_getChainContractAddress(); + init_trim(); init_toHex(); - init_serializeSignature(); - extraEntropy = false; + init_errors3(); + init_localBatchGatewayRequest(); + init_namehash(); + init_packetToBytes(); + init_getAction(); + init_readContract(); } }); -// node_modules/viem/_esm/accounts/utils/signAuthorization.js -async function signAuthorization(parameters) { - const { chainId, nonce, privateKey, to = "object" } = parameters; - const address2 = parameters.contractAddress ?? parameters.address; - const signature2 = await sign({ - hash: hashAuthorization({ address: address2, chainId, nonce }), - privateKey, - to - }); - if (to === "object") +// node_modules/viem/_esm/errors/ens.js +var EnsAvatarInvalidMetadataError, EnsAvatarInvalidNftUriError, EnsAvatarUriResolutionError, EnsAvatarUnsupportedNamespaceError; +var init_ens = __esm({ + "node_modules/viem/_esm/errors/ens.js"() { + "use strict"; + init_base(); + EnsAvatarInvalidMetadataError = class extends BaseError2 { + constructor({ data }) { + super("Unable to extract image from metadata. The metadata may be malformed or invalid.", { + metaMessages: [ + "- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.", + "", + `Provided data: ${JSON.stringify(data)}` + ], + name: "EnsAvatarInvalidMetadataError" + }); + } + }; + EnsAvatarInvalidNftUriError = class extends BaseError2 { + constructor({ reason }) { + super(`ENS NFT avatar URI is invalid. ${reason}`, { + name: "EnsAvatarInvalidNftUriError" + }); + } + }; + EnsAvatarUriResolutionError = class extends BaseError2 { + constructor({ uri }) { + super(`Unable to resolve ENS avatar URI "${uri}". The URI may be malformed, invalid, or does not respond with a valid image.`, { name: "EnsAvatarUriResolutionError" }); + } + }; + EnsAvatarUnsupportedNamespaceError = class extends BaseError2 { + constructor({ namespace }) { + super(`ENS NFT avatar namespace "${namespace}" is not supported. Must be "erc721" or "erc1155".`, { name: "EnsAvatarUnsupportedNamespaceError" }); + } + }; + } +}); + +// node_modules/viem/_esm/utils/ens/avatar/utils.js +async function isImageUri(uri) { + try { + const res = await fetch(uri, { method: "HEAD" }); + if (res.status === 200) { + const contentType = res.headers.get("content-type"); + return contentType?.startsWith("image/"); + } + return false; + } catch (error) { + if (typeof error === "object" && typeof error.response !== "undefined") { + return false; + } + if (!Object.hasOwn(globalThis, "Image")) + return false; + return new Promise((resolve) => { + const img = new Image(); + img.onload = () => { + resolve(true); + }; + img.onerror = () => { + resolve(false); + }; + img.src = uri; + }); + } +} +function getGateway(custom2, defaultGateway) { + if (!custom2) + return defaultGateway; + if (custom2.endsWith("/")) + return custom2.slice(0, -1); + return custom2; +} +function resolveAvatarUri({ uri, gatewayUrls }) { + const isEncoded = base64Regex.test(uri); + if (isEncoded) + return { uri, isOnChain: true, isEncoded }; + const ipfsGateway = getGateway(gatewayUrls?.ipfs, "https://ipfs.io"); + const arweaveGateway = getGateway(gatewayUrls?.arweave, "https://arweave.net"); + const networkRegexMatch = uri.match(networkRegex); + const { protocol, subpath, target, subtarget = "" } = networkRegexMatch?.groups || {}; + const isIPNS = protocol === "ipns:/" || subpath === "ipns/"; + const isIPFS = protocol === "ipfs:/" || subpath === "ipfs/" || ipfsHashRegex.test(uri); + if (uri.startsWith("http") && !isIPNS && !isIPFS) { + let replacedUri = uri; + if (gatewayUrls?.arweave) + replacedUri = uri.replace(/https:\/\/arweave.net/g, gatewayUrls?.arweave); + return { uri: replacedUri, isOnChain: false, isEncoded: false }; + } + if ((isIPNS || isIPFS) && target) { return { - address: address2, - chainId, - nonce, - ...signature2 + uri: `${ipfsGateway}/${isIPNS ? "ipns" : "ipfs"}/${target}${subtarget}`, + isOnChain: false, + isEncoded: false }; - return signature2; + } + if (protocol === "ar:/" && target) { + return { + uri: `${arweaveGateway}/${target}${subtarget || ""}`, + isOnChain: false, + isEncoded: false + }; + } + let parsedUri = uri.replace(dataURIRegex, ""); + if (parsedUri.startsWith(" res2.json()); + const image = await parseAvatarUri({ + gatewayUrls, + uri: getJsonImage(res) + }); + return image; + } catch { + throw new EnsAvatarUriResolutionError({ uri }); + } +} +async function parseAvatarUri({ gatewayUrls, uri }) { + const { uri: resolvedURI, isOnChain } = resolveAvatarUri({ uri, gatewayUrls }); + if (isOnChain) + return resolvedURI; + const isImage = await isImageUri(resolvedURI); + if (isImage) + return resolvedURI; + throw new EnsAvatarUriResolutionError({ uri }); +} +function parseNftUri(uri_) { + let uri = uri_; + if (uri.startsWith("did:nft:")) { + uri = uri.replace("did:nft:", "").replace(/_/g, "/"); + } + const [reference, asset_namespace, tokenID] = uri.split("/"); + const [eip_namespace, chainID] = reference.split(":"); + const [erc_namespace, contractAddress] = asset_namespace.split(":"); + if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") + throw new EnsAvatarInvalidNftUriError({ reason: "Only EIP-155 supported" }); + if (!chainID) + throw new EnsAvatarInvalidNftUriError({ reason: "Chain ID not found" }); + if (!contractAddress) + throw new EnsAvatarInvalidNftUriError({ + reason: "Contract address not found" + }); + if (!tokenID) + throw new EnsAvatarInvalidNftUriError({ reason: "Token ID not found" }); + if (!erc_namespace) + throw new EnsAvatarInvalidNftUriError({ reason: "ERC namespace not found" }); + return { + chainID: Number.parseInt(chainID, 10), + namespace: erc_namespace.toLowerCase(), + contractAddress, + tokenID + }; +} +async function getNftTokenUri(client, { nft }) { + if (nft.namespace === "erc721") { + return readContract(client, { + address: nft.contractAddress, + abi: [ + { + name: "tokenURI", + type: "function", + stateMutability: "view", + inputs: [{ name: "tokenId", type: "uint256" }], + outputs: [{ name: "", type: "string" }] + } + ], + functionName: "tokenURI", + args: [BigInt(nft.tokenID)] + }); + } + if (nft.namespace === "erc1155") { + return readContract(client, { + address: nft.contractAddress, + abi: [ + { + name: "uri", + type: "function", + stateMutability: "view", + inputs: [{ name: "_id", type: "uint256" }], + outputs: [{ name: "", type: "string" }] + } + ], + functionName: "uri", + args: [BigInt(nft.tokenID)] + }); + } + throw new EnsAvatarUnsupportedNamespaceError({ namespace: nft.namespace }); +} +var networkRegex, ipfsHashRegex, base64Regex, dataURIRegex; +var init_utils6 = __esm({ + "node_modules/viem/_esm/utils/ens/avatar/utils.js"() { "use strict"; - init_hashAuthorization(); - init_sign(); + init_readContract(); + init_ens(); + networkRegex = /(?https?:\/\/[^/]*|ipfs:\/|ipns:\/|ar:\/)?(?\/)?(?ipfs\/|ipns\/)?(?[\w\-.]+)(?\/.*)?/; + ipfsHashRegex = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\/(?[\w\-.]+))?(?\/.*)?$/; + base64Regex = /^data:([a-zA-Z\-/+]*);base64,([^"].*)/; + dataURIRegex = /^data:([a-zA-Z\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/; } }); -// node_modules/viem/_esm/accounts/utils/signMessage.js -async function signMessage({ message, privateKey }) { - return await sign({ hash: hashMessage(message), privateKey, to: "hex" }); +// node_modules/viem/_esm/utils/ens/avatar/parseAvatarRecord.js +async function parseAvatarRecord(client, { gatewayUrls, record }) { + if (/eip155:/i.test(record)) + return parseNftAvatarUri(client, { gatewayUrls, record }); + return parseAvatarUri({ uri: record, gatewayUrls }); } -var init_signMessage = __esm({ - "node_modules/viem/_esm/accounts/utils/signMessage.js"() { +async function parseNftAvatarUri(client, { gatewayUrls, record }) { + const nft = parseNftUri(record); + const nftUri = await getNftTokenUri(client, { nft }); + const { uri: resolvedNftUri, isOnChain, isEncoded } = resolveAvatarUri({ uri: nftUri, gatewayUrls }); + if (isOnChain && (resolvedNftUri.includes("data:application/json;base64,") || resolvedNftUri.startsWith("{"))) { + const encodedJson = isEncoded ? ( + // if it is encoded, decode it + atob(resolvedNftUri.replace("data:application/json;base64,", "")) + ) : ( + // if it isn't encoded assume it is a JSON string, but it could be anything (it will error if it is) + resolvedNftUri + ); + const decoded = JSON.parse(encodedJson); + return parseAvatarUri({ uri: getJsonImage(decoded), gatewayUrls }); + } + let uriTokenId = nft.tokenID; + if (nft.namespace === "erc1155") + uriTokenId = uriTokenId.replace("0x", "").padStart(64, "0"); + return getMetadataAvatarUri({ + gatewayUrls, + uri: resolvedNftUri.replace(/(?:0x)?{id}/, uriTokenId) + }); +} +var init_parseAvatarRecord = __esm({ + "node_modules/viem/_esm/utils/ens/avatar/parseAvatarRecord.js"() { "use strict"; - init_hashMessage(); - init_sign(); + init_utils6(); } }); -// node_modules/viem/_esm/accounts/utils/signTransaction.js -async function signTransaction(parameters) { - const { privateKey, transaction, serializer = serializeTransaction } = parameters; - const signableTransaction = (() => { - if (transaction.type === "eip4844") - return { - ...transaction, - sidecars: false - }; - return transaction; +// node_modules/viem/_esm/actions/ens/getEnsText.js +async function getEnsText(client, parameters) { + const { blockNumber, blockTag, key, name, gatewayUrls, strict } = parameters; + const { chain: chain3 } = client; + const universalResolverAddress = (() => { + if (parameters.universalResolverAddress) + return parameters.universalResolverAddress; + if (!chain3) + throw new Error("client chain not configured. universalResolverAddress is required."); + return getChainContractAddress({ + blockNumber, + chain: chain3, + contract: "ensUniversalResolver" + }); })(); - const signature2 = await sign({ - hash: keccak256(await serializer(signableTransaction)), - privateKey - }); - return await serializer(transaction, signature2); + const tlds = chain3?.ensTlds; + if (tlds && !tlds.some((tld) => name.endsWith(tld))) + return null; + try { + const readContractParameters = { + address: universalResolverAddress, + abi: universalResolverResolveAbi, + args: [ + toHex(packetToBytes(name)), + encodeFunctionData({ + abi: textResolverAbi, + functionName: "text", + args: [namehash(name), key] + }), + gatewayUrls ?? [localBatchGatewayUrl] + ], + functionName: "resolveWithGateways", + blockNumber, + blockTag + }; + const readContractAction = getAction(client, readContract, "readContract"); + const res = await readContractAction(readContractParameters); + if (res[0] === "0x") + return null; + const record = decodeFunctionResult({ + abi: textResolverAbi, + functionName: "text", + data: res[0] + }); + return record === "" ? null : record; + } catch (err) { + if (strict) + throw err; + if (isNullUniversalResolverError(err)) + return null; + throw err; + } } -var init_signTransaction = __esm({ - "node_modules/viem/_esm/accounts/utils/signTransaction.js"() { +var init_getEnsText = __esm({ + "node_modules/viem/_esm/actions/ens/getEnsText.js"() { "use strict"; - init_keccak256(); - init_serializeTransaction(); - init_sign(); + init_abis(); + init_decodeFunctionResult(); + init_encodeFunctionData(); + init_getChainContractAddress(); + init_toHex(); + init_errors3(); + init_localBatchGatewayRequest(); + init_namehash(); + init_packetToBytes(); + init_getAction(); + init_readContract(); } }); -// node_modules/viem/_esm/accounts/utils/signTypedData.js -async function signTypedData(parameters) { - const { privateKey, ...typedData } = parameters; - return await sign({ - hash: hashTypedData(typedData), - privateKey, - to: "hex" +// node_modules/viem/_esm/actions/ens/getEnsAvatar.js +async function getEnsAvatar(client, { blockNumber, blockTag, assetGatewayUrls, name, gatewayUrls, strict, universalResolverAddress }) { + const record = await getAction(client, getEnsText, "getEnsText")({ + blockNumber, + blockTag, + key: "avatar", + name, + universalResolverAddress, + gatewayUrls, + strict }); + if (!record) + return null; + try { + return await parseAvatarRecord(client, { + record, + gatewayUrls: assetGatewayUrls + }); + } catch { + return null; + } } -var init_signTypedData = __esm({ - "node_modules/viem/_esm/accounts/utils/signTypedData.js"() { +var init_getEnsAvatar = __esm({ + "node_modules/viem/_esm/actions/ens/getEnsAvatar.js"() { "use strict"; - init_hashTypedData(); - init_sign(); + init_parseAvatarRecord(); + init_getAction(); + init_getEnsText(); } }); -// node_modules/viem/_esm/accounts/privateKeyToAccount.js -function privateKeyToAccount(privateKey, options = {}) { - const { nonceManager } = options; - const publicKey = toHex(secp256k1.getPublicKey(privateKey.slice(2), false)); - const address2 = publicKeyToAddress(publicKey); - const account = toAccount({ - address: address2, - nonceManager, - async sign({ hash: hash3 }) { - return sign({ hash: hash3, privateKey, to: "hex" }); - }, - async signAuthorization(authorization) { - return signAuthorization({ ...authorization, privateKey }); - }, - async signMessage({ message }) { - return signMessage({ message, privateKey }); - }, - async signTransaction(transaction, { serializer } = {}) { - return signTransaction({ privateKey, transaction, serializer }); - }, - async signTypedData(typedData) { - return signTypedData({ ...typedData, privateKey }); - } - }); - return { - ...account, - publicKey, - source: "privateKey" - }; -} -var init_privateKeyToAccount = __esm({ - "node_modules/viem/_esm/accounts/privateKeyToAccount.js"() { - "use strict"; - init_secp256k1(); - init_toHex(); - init_toAccount(); - init_publicKeyToAddress(); - init_sign(); - init_signAuthorization(); - init_signMessage(); - init_signTransaction(); - init_signTypedData(); +// node_modules/viem/_esm/actions/ens/getEnsName.js +async function getEnsName(client, parameters) { + const { address: address2, blockNumber, blockTag, coinType = 60n, gatewayUrls, strict } = parameters; + const { chain: chain3 } = client; + const universalResolverAddress = (() => { + if (parameters.universalResolverAddress) + return parameters.universalResolverAddress; + if (!chain3) + throw new Error("client chain not configured. universalResolverAddress is required."); + return getChainContractAddress({ + blockNumber, + chain: chain3, + contract: "ensUniversalResolver" + }); + })(); + try { + const readContractParameters = { + address: universalResolverAddress, + abi: universalResolverReverseAbi, + args: [address2, coinType, gatewayUrls ?? [localBatchGatewayUrl]], + functionName: "reverseWithGateways", + blockNumber, + blockTag + }; + const readContractAction = getAction(client, readContract, "readContract"); + const [name] = await readContractAction(readContractParameters); + return name || null; + } catch (err) { + if (strict) + throw err; + if (isNullUniversalResolverError(err)) + return null; + throw err; + } +} +var init_getEnsName = __esm({ + "node_modules/viem/_esm/actions/ens/getEnsName.js"() { + "use strict"; + init_abis(); + init_getChainContractAddress(); + init_errors3(); + init_localBatchGatewayRequest(); + init_getAction(); + init_readContract(); } }); -// node_modules/@scure/bip39/esm/wordlists/english.js -var wordlist; -var init_english = __esm({ - "node_modules/@scure/bip39/esm/wordlists/english.js"() { +// node_modules/viem/_esm/actions/ens/getEnsResolver.js +async function getEnsResolver(client, parameters) { + const { blockNumber, blockTag, name } = parameters; + const { chain: chain3 } = client; + const universalResolverAddress = (() => { + if (parameters.universalResolverAddress) + return parameters.universalResolverAddress; + if (!chain3) + throw new Error("client chain not configured. universalResolverAddress is required."); + return getChainContractAddress({ + blockNumber, + chain: chain3, + contract: "ensUniversalResolver" + }); + })(); + const tlds = chain3?.ensTlds; + if (tlds && !tlds.some((tld) => name.endsWith(tld))) + throw new Error(`${name} is not a valid ENS TLD (${tlds?.join(", ")}) for chain "${chain3.name}" (id: ${chain3.id}).`); + const [resolverAddress] = await getAction(client, readContract, "readContract")({ + address: universalResolverAddress, + abi: [ + { + inputs: [{ type: "bytes" }], + name: "findResolver", + outputs: [ + { type: "address" }, + { type: "bytes32" }, + { type: "uint256" } + ], + stateMutability: "view", + type: "function" + } + ], + functionName: "findResolver", + args: [toHex(packetToBytes(name))], + blockNumber, + blockTag + }); + return resolverAddress; +} +var init_getEnsResolver = __esm({ + "node_modules/viem/_esm/actions/ens/getEnsResolver.js"() { "use strict"; - wordlist = `abandon -ability -able -about -above -absent -absorb -abstract -absurd -abuse -access -accident -account -accuse -achieve -acid -acoustic -acquire -across -act -action -actor -actress -actual -adapt -add -addict -address -adjust -admit -adult -advance -advice -aerobic -affair -afford -afraid -again -age -agent -agree -ahead -aim -air -airport -aisle -alarm -album -alcohol -alert -alien -all -alley -allow -almost -alone -alpha -already -also -alter -always -amateur -amazing -among -amount -amused -analyst -anchor -ancient -anger -angle -angry -animal -ankle -announce -annual -another -answer -antenna -antique -anxiety -any -apart -apology -appear -apple -approve -april -arch -arctic -area -arena -argue -arm -armed -armor -army -around -arrange -arrest -arrive -arrow -art -artefact -artist -artwork -ask -aspect -assault -asset -assist -assume -asthma -athlete -atom -attack -attend -attitude -attract -auction -audit -august -aunt -author -auto -autumn -average -avocado -avoid -awake -aware -away -awesome -awful -awkward -axis -baby -bachelor -bacon -badge -bag -balance -balcony -ball -bamboo -banana -banner -bar -barely -bargain -barrel -base -basic -basket -battle -beach -bean -beauty -because -become -beef -before -begin -behave -behind -believe -below -belt -bench -benefit -best -betray -better -between -beyond -bicycle -bid -bike -bind -biology -bird -birth -bitter -black -blade -blame -blanket -blast -bleak -bless -blind -blood -blossom -blouse -blue -blur -blush -board -boat -body -boil -bomb -bone -bonus -book -boost -border -boring -borrow -boss -bottom -bounce -box -boy -bracket -brain -brand -brass -brave -bread -breeze -brick -bridge -brief -bright -bring -brisk -broccoli -broken -bronze -broom -brother -brown -brush -bubble -buddy -budget -buffalo -build -bulb -bulk -bullet -bundle -bunker -burden -burger -burst -bus -business -busy -butter -buyer -buzz -cabbage -cabin -cable -cactus -cage -cake -call -calm -camera -camp -can -canal -cancel -candy -cannon -canoe -canvas -canyon -capable -capital -captain -car -carbon -card -cargo -carpet -carry -cart -case -cash -casino -castle -casual -cat -catalog -catch -category -cattle -caught -cause -caution -cave -ceiling -celery -cement -census -century -cereal -certain -chair -chalk -champion -change -chaos -chapter -charge -chase -chat -cheap -check -cheese -chef -cherry -chest -chicken -chief -child -chimney -choice -choose -chronic -chuckle -chunk -churn -cigar -cinnamon -circle -citizen -city -civil -claim -clap -clarify -claw -clay -clean -clerk -clever -click -client -cliff -climb -clinic -clip -clock -clog -close -cloth -cloud -clown -club -clump -cluster -clutch -coach -coast -coconut -code -coffee -coil -coin -collect -color -column -combine -come -comfort -comic -common -company -concert -conduct -confirm -congress -connect -consider -control -convince -cook -cool -copper -copy -coral -core -corn -correct -cost -cotton -couch -country -couple -course -cousin -cover -coyote -crack -cradle -craft -cram -crane -crash -crater -crawl -crazy -cream -credit -creek -crew -cricket -crime -crisp -critic -crop -cross -crouch -crowd -crucial -cruel -cruise -crumble -crunch -crush -cry -crystal -cube -culture -cup -cupboard -curious -current -curtain -curve -cushion -custom -cute -cycle -dad -damage -damp -dance -danger -daring -dash -daughter -dawn -day -deal -debate -debris -decade -december -decide -decline -decorate -decrease -deer -defense -define -defy -degree -delay -deliver -demand -demise -denial -dentist -deny -depart -depend -deposit -depth -deputy -derive -describe -desert -design -desk -despair -destroy -detail -detect -develop -device -devote -diagram -dial -diamond -diary -dice -diesel -diet -differ -digital -dignity -dilemma -dinner -dinosaur -direct -dirt -disagree -discover -disease -dish -dismiss -disorder -display -distance -divert -divide -divorce -dizzy -doctor -document -dog -doll -dolphin -domain -donate -donkey -donor -door -dose -double -dove -draft -dragon -drama -drastic -draw -dream -dress -drift -drill -drink -drip -drive -drop -drum -dry -duck -dumb -dune -during -dust -dutch -duty -dwarf -dynamic -eager -eagle -early -earn -earth -easily -east -easy -echo -ecology -economy -edge -edit -educate -effort -egg -eight -either -elbow -elder -electric -elegant -element -elephant -elevator -elite -else -embark -embody -embrace -emerge -emotion -employ -empower -empty -enable -enact -end -endless -endorse -enemy -energy -enforce -engage -engine -enhance -enjoy -enlist -enough -enrich -enroll -ensure -enter -entire -entry -envelope -episode -equal -equip -era -erase -erode -erosion -error -erupt -escape -essay -essence -estate -eternal -ethics -evidence -evil -evoke -evolve -exact -example -excess -exchange -excite -exclude -excuse -execute -exercise -exhaust -exhibit -exile -exist -exit -exotic -expand -expect -expire -explain -expose -express -extend -extra -eye -eyebrow -fabric -face -faculty -fade -faint -faith -fall -false -fame -family -famous -fan -fancy -fantasy -farm -fashion -fat -fatal -father -fatigue -fault -favorite -feature -february -federal -fee -feed -feel -female -fence -festival -fetch -fever -few -fiber -fiction -field -figure -file -film -filter -final -find -fine -finger -finish -fire -firm -first -fiscal -fish -fit -fitness -fix -flag -flame -flash -flat -flavor -flee -flight -flip -float -flock -floor -flower -fluid -flush -fly -foam -focus -fog -foil -fold -follow -food -foot -force -forest -forget -fork -fortune -forum -forward -fossil -foster -found -fox -fragile -frame -frequent -fresh -friend -fringe -frog -front -frost -frown -frozen -fruit -fuel -fun -funny -furnace -fury -future -gadget -gain -galaxy -gallery -game -gap -garage -garbage -garden -garlic -garment -gas -gasp -gate -gather -gauge -gaze -general -genius -genre -gentle -genuine -gesture -ghost -giant -gift -giggle -ginger -giraffe -girl -give -glad -glance -glare -glass -glide -glimpse -globe -gloom -glory -glove -glow -glue -goat -goddess -gold -good -goose -gorilla -gospel -gossip -govern -gown -grab -grace -grain -grant -grape -grass -gravity -great -green -grid -grief -grit -grocery -group -grow -grunt -guard -guess -guide -guilt -guitar -gun -gym -habit -hair -half -hammer -hamster -hand -happy -harbor -hard -harsh -harvest -hat -have -hawk -hazard -head -health -heart -heavy -hedgehog -height -hello -helmet -help -hen -hero -hidden -high -hill -hint -hip -hire -history -hobby -hockey -hold -hole -holiday -hollow -home -honey -hood -hope -horn -horror -horse -hospital -host -hotel -hour -hover -hub -huge -human -humble -humor -hundred -hungry -hunt -hurdle -hurry -hurt -husband -hybrid -ice -icon -idea -identify -idle -ignore -ill -illegal -illness -image -imitate -immense -immune -impact -impose -improve -impulse -inch -include -income -increase -index -indicate -indoor -industry -infant -inflict -inform -inhale -inherit -initial -inject -injury -inmate -inner -innocent -input -inquiry -insane -insect -inside -inspire -install -intact -interest -into -invest -invite -involve -iron -island -isolate -issue -item -ivory -jacket -jaguar -jar -jazz -jealous -jeans -jelly -jewel -job -join -joke -journey -joy -judge -juice -jump -jungle -junior -junk -just -kangaroo -keen -keep -ketchup -key -kick -kid -kidney -kind -kingdom -kiss -kit -kitchen -kite -kitten -kiwi -knee -knife -knock -know -lab -label -labor -ladder -lady -lake -lamp -language -laptop -large -later -latin -laugh -laundry -lava -law -lawn -lawsuit -layer -lazy -leader -leaf -learn -leave -lecture -left -leg -legal -legend -leisure -lemon -lend -length -lens -leopard -lesson -letter -level -liar -liberty -library -license -life -lift -light -like -limb -limit -link -lion -liquid -list -little -live -lizard -load -loan -lobster -local -lock -logic -lonely -long -loop -lottery -loud -lounge -love -loyal -lucky -luggage -lumber -lunar -lunch -luxury -lyrics -machine -mad -magic -magnet -maid -mail -main -major -make -mammal -man -manage -mandate -mango -mansion -manual -maple -marble -march -margin -marine -market -marriage -mask -mass -master -match -material -math -matrix -matter -maximum -maze -meadow -mean -measure -meat -mechanic -medal -media -melody -melt -member -memory -mention -menu -mercy -merge -merit -merry -mesh -message -metal -method -middle -midnight -milk -million -mimic -mind -minimum -minor -minute -miracle -mirror -misery -miss -mistake -mix -mixed -mixture -mobile -model -modify -mom -moment -monitor -monkey -monster -month -moon -moral -more -morning -mosquito -mother -motion -motor -mountain -mouse -move -movie -much -muffin -mule -multiply -muscle -museum -mushroom -music -must -mutual -myself -mystery -myth -naive -name -napkin -narrow -nasty -nation -nature -near -neck -need -negative -neglect -neither -nephew -nerve -nest -net -network -neutral -never -news -next -nice -night -noble -noise -nominee -noodle -normal -north -nose -notable -note -nothing -notice -novel -now -nuclear -number -nurse -nut -oak -obey -object -oblige -obscure -observe -obtain -obvious -occur -ocean -october -odor -off -offer -office -often -oil -okay -old -olive -olympic -omit -once -one -onion -online -only -open -opera -opinion -oppose -option -orange -orbit -orchard -order -ordinary -organ -orient -original -orphan -ostrich -other -outdoor -outer -output -outside -oval -oven -over -own -owner -oxygen -oyster -ozone -pact -paddle -page -pair -palace -palm -panda -panel -panic -panther -paper -parade -parent -park -parrot -party -pass -patch -path -patient -patrol -pattern -pause -pave -payment -peace -peanut -pear -peasant -pelican -pen -penalty -pencil -people -pepper -perfect -permit -person -pet -phone -photo -phrase -physical -piano -picnic -picture -piece -pig -pigeon -pill -pilot -pink -pioneer -pipe -pistol -pitch -pizza -place -planet -plastic -plate -play -please -pledge -pluck -plug -plunge -poem -poet -point -polar -pole -police -pond -pony -pool -popular -portion -position -possible -post -potato -pottery -poverty -powder -power -practice -praise -predict -prefer -prepare -present -pretty -prevent -price -pride -primary -print -priority -prison -private -prize -problem -process -produce -profit -program -project -promote -proof -property -prosper -protect -proud -provide -public -pudding -pull -pulp -pulse -pumpkin -punch -pupil -puppy -purchase -purity -purpose -purse -push -put -puzzle -pyramid -quality -quantum -quarter -question -quick -quit -quiz -quote -rabbit -raccoon -race -rack -radar -radio -rail -rain -raise -rally -ramp -ranch -random -range -rapid -rare -rate -rather -raven -raw -razor -ready -real -reason -rebel -rebuild -recall -receive -recipe -record -recycle -reduce -reflect -reform -refuse -region -regret -regular -reject -relax -release -relief -rely -remain -remember -remind -remove -render -renew -rent -reopen -repair -repeat -replace -report -require -rescue -resemble -resist -resource -response -result -retire -retreat -return -reunion -reveal -review -reward -rhythm -rib -ribbon -rice -rich -ride -ridge -rifle -right -rigid -ring -riot -ripple -risk -ritual -rival -river -road -roast -robot -robust -rocket -romance -roof -rookie -room -rose -rotate -rough -round -route -royal -rubber -rude -rug -rule -run -runway -rural -sad -saddle -sadness -safe -sail -salad -salmon -salon -salt -salute -same -sample -sand -satisfy -satoshi -sauce -sausage -save -say -scale -scan -scare -scatter -scene -scheme -school -science -scissors -scorpion -scout -scrap -screen -script -scrub -sea -search -season -seat -second -secret -section -security -seed -seek -segment -select -sell -seminar -senior -sense -sentence -series -service -session -settle -setup -seven -shadow -shaft -shallow -share -shed -shell -sheriff -shield -shift -shine -ship -shiver -shock -shoe -shoot -shop -short -shoulder -shove -shrimp -shrug -shuffle -shy -sibling -sick -side -siege -sight -sign -silent -silk -silly -silver -similar -simple -since -sing -siren -sister -situate -six -size -skate -sketch -ski -skill -skin -skirt -skull -slab -slam -sleep -slender -slice -slide -slight -slim -slogan -slot -slow -slush -small -smart -smile -smoke -smooth -snack -snake -snap -sniff -snow -soap -soccer -social -sock -soda -soft -solar -soldier -solid -solution -solve -someone -song -soon -sorry -sort -soul -sound -soup -source -south -space -spare -spatial -spawn -speak -special -speed -spell -spend -sphere -spice -spider -spike -spin -spirit -split -spoil -sponsor -spoon -sport -spot -spray -spread -spring -spy -square -squeeze -squirrel -stable -stadium -staff -stage -stairs -stamp -stand -start -state -stay -steak -steel -stem -step -stereo -stick -still -sting -stock -stomach -stone -stool -story -stove -strategy -street -strike -strong -struggle -student -stuff -stumble -style -subject -submit -subway -success -such -sudden -suffer -sugar -suggest -suit -summer -sun -sunny -sunset -super -supply -supreme -sure -surface -surge -surprise -surround -survey -suspect -sustain -swallow -swamp -swap -swarm -swear -sweet -swift -swim -swing -switch -sword -symbol -symptom -syrup -system -table -tackle -tag -tail -talent -talk -tank -tape -target -task -taste -tattoo -taxi -teach -team -tell -ten -tenant -tennis -tent -term -test -text -thank -that -theme -then -theory -there -they -thing -this -thought -three -thrive -throw -thumb -thunder -ticket -tide -tiger -tilt -timber -time -tiny -tip -tired -tissue -title -toast -tobacco -today -toddler -toe -together -toilet -token -tomato -tomorrow -tone -tongue -tonight -tool -tooth -top -topic -topple -torch -tornado -tortoise -toss -total -tourist -toward -tower -town -toy -track -trade -traffic -tragic -train -transfer -trap -trash -travel -tray -treat -tree -trend -trial -tribe -trick -trigger -trim -trip -trophy -trouble -truck -true -truly -trumpet -trust -truth -try -tube -tuition -tumble -tuna -tunnel -turkey -turn -turtle -twelve -twenty -twice -twin -twist -two -type -typical -ugly -umbrella -unable -unaware -uncle -uncover -under -undo -unfair -unfold -unhappy -uniform -unique -unit -universe -unknown -unlock -until -unusual -unveil -update -upgrade -uphold -upon -upper -upset -urban -urge -usage -use -used -useful -useless -usual -utility -vacant -vacuum -vague -valid -valley -valve -van -vanish -vapor -various -vast -vault -vehicle -velvet -vendor -venture -venue -verb -verify -version -very -vessel -veteran -viable -vibrant -vicious -victory -video -view -village -vintage -violin -virtual -virus -visa -visit -visual -vital -vivid -vocal -voice -void -volcano -volume -vote -voyage -wage -wagon -wait -walk -wall -walnut -want -warfare -warm -warrior -wash -wasp -waste -water -wave -way -wealth -weapon -wear -weasel -weather -web -wedding -weekend -weird -welcome -west -wet -whale -what -wheat -wheel -when -where -whip -whisper -wide -width -wife -wild -will -win -window -wine -wing -wink -winner -winter -wire -wisdom -wise -wish -witness -wolf -woman -wonder -wood -wool -word -work -world -worry -worth -wrap -wreck -wrestle -wrist -write -wrong -yard -year -yellow -you -young -youth -zebra -zero -zone -zoo`.split("\n"); - } -}); - -// node_modules/viem/_esm/accounts/index.js -var init_accounts = __esm({ - "node_modules/viem/_esm/accounts/index.js"() { - "use strict"; - init_privateKeyToAccount(); - } -}); - -// src/fs-read.ts -import { open } from "fs/promises"; -import { openSync, readSync, closeSync, fstatSync } from "fs"; -async function readTextFile(filePath) { - const fh = await open(filePath, "r"); - try { - const size5 = (await fh.stat()).size; - const buf = Buffer.alloc(size5); - let offset = 0; - while (offset < size5) { - const { bytesRead } = await fh.read(buf, offset, size5 - offset, offset); - if (bytesRead === 0) break; - offset += bytesRead; - } - return buf.subarray(0, offset).toString("utf-8"); - } finally { - await fh.close(); - } -} -var init_fs_read = __esm({ - "src/fs-read.ts"() { - "use strict"; - } -}); - -// node_modules/@noble/curves/node_modules/@noble/hashes/utils.js -function isBytes5(a) { - return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; -} -function anumber3(n, title = "") { - if (!Number.isSafeInteger(n) || n < 0) { - const prefix = title && `"${title}" `; - throw new Error(`${prefix}expected integer >= 0, got ${n}`); - } -} -function abytes4(value, length, title = "") { - const bytes = isBytes5(value); - const len = value?.length; - const needsLen = length !== void 0; - if (!bytes || needsLen && len !== length) { - const prefix = title && `"${title}" `; - const ofLen = needsLen ? ` of length ${length}` : ""; - const got = bytes ? `length=${len}` : `type=${typeof value}`; - throw new Error(prefix + "expected Uint8Array" + ofLen + ", got " + got); - } - return value; -} -function ahash2(h) { - if (typeof h !== "function" || typeof h.create !== "function") - throw new Error("Hash must wrapped by utils.createHasher"); - anumber3(h.outputLen); - anumber3(h.blockLen); -} -function aexists2(instance, checkFinished = true) { - if (instance.destroyed) - throw new Error("Hash instance has been destroyed"); - if (checkFinished && instance.finished) - throw new Error("Hash#digest() has already been called"); -} -function aoutput2(out, instance) { - abytes4(out, void 0, "digestInto() output"); - const min = instance.outputLen; - if (out.length < min) { - throw new Error('"digestInto() output" expected to be of length >=' + min); - } -} -function clean2(...arrays) { - for (let i = 0; i < arrays.length; i++) { - arrays[i].fill(0); - } -} -function createView2(arr) { - return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); -} -function rotr2(word, shift) { - return word << 32 - shift | word >>> shift; -} -function bytesToHex4(bytes) { - abytes4(bytes); - if (hasHexBuiltin3) - return bytes.toHex(); - let hex = ""; - for (let i = 0; i < bytes.length; i++) { - hex += hexes5[bytes[i]]; - } - return hex; -} -function asciiToBase163(ch) { - if (ch >= asciis3._0 && ch <= asciis3._9) - return ch - asciis3._0; - if (ch >= asciis3.A && ch <= asciis3.F) - return ch - (asciis3.A - 10); - if (ch >= asciis3.a && ch <= asciis3.f) - return ch - (asciis3.a - 10); - return; -} -function hexToBytes4(hex) { - if (typeof hex !== "string") - throw new Error("hex string expected, got " + typeof hex); - if (hasHexBuiltin3) - return Uint8Array.fromHex(hex); - const hl = hex.length; - const al = hl / 2; - if (hl % 2) - throw new Error("hex string expected, got unpadded hex of length " + hl); - const array = new Uint8Array(al); - for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) { - const n1 = asciiToBase163(hex.charCodeAt(hi)); - const n2 = asciiToBase163(hex.charCodeAt(hi + 1)); - if (n1 === void 0 || n2 === void 0) { - const char = hex[hi] + hex[hi + 1]; - throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi); - } - array[ai] = n1 * 16 + n2; - } - return array; -} -function concatBytes5(...arrays) { - let sum = 0; - for (let i = 0; i < arrays.length; i++) { - const a = arrays[i]; - abytes4(a); - sum += a.length; - } - const res = new Uint8Array(sum); - for (let i = 0, pad4 = 0; i < arrays.length; i++) { - const a = arrays[i]; - res.set(a, pad4); - pad4 += a.length; - } - return res; -} -function createHasher3(hashCons, info = {}) { - const hashC = (msg, opts) => hashCons(opts).update(msg).digest(); - const tmp = hashCons(void 0); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = (opts) => hashCons(opts); - Object.assign(hashC, info); - return Object.freeze(hashC); -} -function randomBytes2(bytesLength = 32) { - const cr = typeof globalThis === "object" ? globalThis.crypto : null; - if (typeof cr?.getRandomValues !== "function") - throw new Error("crypto.getRandomValues must be defined"); - return cr.getRandomValues(new Uint8Array(bytesLength)); -} -var hasHexBuiltin3, hexes5, asciis3, oidNist; -var init_utils6 = __esm({ - "node_modules/@noble/curves/node_modules/@noble/hashes/utils.js"() { - "use strict"; - hasHexBuiltin3 = /* @__PURE__ */ (() => ( - // @ts-ignore - typeof Uint8Array.from([]).toHex === "function" && typeof Uint8Array.fromHex === "function" - ))(); - hexes5 = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0")); - asciis3 = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; - oidNist = (suffix) => ({ - oid: Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2, suffix]) - }); - } -}); - -// node_modules/@noble/curves/node_modules/@noble/hashes/_md.js -function Chi2(a, b, c2) { - return a & b ^ ~a & c2; -} -function Maj2(a, b, c2) { - return a & b ^ a & c2 ^ b & c2; -} -var HashMD2, SHA256_IV2; -var init_md2 = __esm({ - "node_modules/@noble/curves/node_modules/@noble/hashes/_md.js"() { - "use strict"; - init_utils6(); - HashMD2 = class { - blockLen; - outputLen; - padOffset; - isLE; - // For partial updates less than block size - buffer; - view; - finished = false; - length = 0; - pos = 0; - destroyed = false; - constructor(blockLen, outputLen, padOffset, isLE2) { - this.blockLen = blockLen; - this.outputLen = outputLen; - this.padOffset = padOffset; - this.isLE = isLE2; - this.buffer = new Uint8Array(blockLen); - this.view = createView2(this.buffer); - } - update(data) { - aexists2(this); - abytes4(data); - const { view, buffer: buffer2, blockLen } = this; - const len = data.length; - for (let pos = 0; pos < len; ) { - const take = Math.min(blockLen - this.pos, len - pos); - if (take === blockLen) { - const dataView = createView2(data); - for (; blockLen <= len - pos; pos += blockLen) - this.process(dataView, pos); - continue; - } - buffer2.set(data.subarray(pos, pos + take), this.pos); - this.pos += take; - pos += take; - if (this.pos === blockLen) { - this.process(view, 0); - this.pos = 0; - } - } - this.length += data.length; - this.roundClean(); - return this; - } - digestInto(out) { - aexists2(this); - aoutput2(out, this); - this.finished = true; - const { buffer: buffer2, view, blockLen, isLE: isLE2 } = this; - let { pos } = this; - buffer2[pos++] = 128; - clean2(this.buffer.subarray(pos)); - if (this.padOffset > blockLen - pos) { - this.process(view, 0); - pos = 0; - } - for (let i = pos; i < blockLen; i++) - buffer2[i] = 0; - view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE2); - this.process(view, 0); - const oview = createView2(out); - const len = this.outputLen; - if (len % 4) - throw new Error("_sha2: outputLen must be aligned to 32bit"); - const outLen = len / 4; - const state = this.get(); - if (outLen > state.length) - throw new Error("_sha2: outputLen bigger than state"); - for (let i = 0; i < outLen; i++) - oview.setUint32(4 * i, state[i], isLE2); - } - digest() { - const { buffer: buffer2, outputLen } = this; - this.digestInto(buffer2); - const res = buffer2.slice(0, outputLen); - this.destroy(); - return res; - } - _cloneInto(to) { - to ||= new this.constructor(); - to.set(...this.get()); - const { blockLen, buffer: buffer2, length, finished: finished2, destroyed, pos } = this; - to.destroyed = destroyed; - to.finished = finished2; - to.length = length; - to.pos = pos; - if (length % blockLen) - to.buffer.set(buffer2); - return to; - } - clone() { - return this._cloneInto(); - } - }; - SHA256_IV2 = /* @__PURE__ */ Uint32Array.from([ - 1779033703, - 3144134277, - 1013904242, - 2773480762, - 1359893119, - 2600822924, - 528734635, - 1541459225 - ]); - } -}); - -// node_modules/@noble/curves/node_modules/@noble/hashes/sha2.js -var SHA256_K2, SHA256_W2, SHA2_32B, _SHA256, sha2564; -var init_sha22 = __esm({ - "node_modules/@noble/curves/node_modules/@noble/hashes/sha2.js"() { - "use strict"; - init_md2(); - init_utils6(); - SHA256_K2 = /* @__PURE__ */ Uint32Array.from([ - 1116352408, - 1899447441, - 3049323471, - 3921009573, - 961987163, - 1508970993, - 2453635748, - 2870763221, - 3624381080, - 310598401, - 607225278, - 1426881987, - 1925078388, - 2162078206, - 2614888103, - 3248222580, - 3835390401, - 4022224774, - 264347078, - 604807628, - 770255983, - 1249150122, - 1555081692, - 1996064986, - 2554220882, - 2821834349, - 2952996808, - 3210313671, - 3336571891, - 3584528711, - 113926993, - 338241895, - 666307205, - 773529912, - 1294757372, - 1396182291, - 1695183700, - 1986661051, - 2177026350, - 2456956037, - 2730485921, - 2820302411, - 3259730800, - 3345764771, - 3516065817, - 3600352804, - 4094571909, - 275423344, - 430227734, - 506948616, - 659060556, - 883997877, - 958139571, - 1322822218, - 1537002063, - 1747873779, - 1955562222, - 2024104815, - 2227730452, - 2361852424, - 2428436474, - 2756734187, - 3204031479, - 3329325298 - ]); - SHA256_W2 = /* @__PURE__ */ new Uint32Array(64); - SHA2_32B = class extends HashMD2 { - constructor(outputLen) { - super(64, outputLen, 8, false); - } - get() { - const { A, B, C, D: D2, E, F, G, H } = this; - return [A, B, C, D2, E, F, G, H]; - } - // prettier-ignore - set(A, B, C, D2, E, F, G, H) { - this.A = A | 0; - this.B = B | 0; - this.C = C | 0; - this.D = D2 | 0; - this.E = E | 0; - this.F = F | 0; - this.G = G | 0; - this.H = H | 0; - } - process(view, offset) { - for (let i = 0; i < 16; i++, offset += 4) - SHA256_W2[i] = view.getUint32(offset, false); - for (let i = 16; i < 64; i++) { - const W15 = SHA256_W2[i - 15]; - const W2 = SHA256_W2[i - 2]; - const s0 = rotr2(W15, 7) ^ rotr2(W15, 18) ^ W15 >>> 3; - const s1 = rotr2(W2, 17) ^ rotr2(W2, 19) ^ W2 >>> 10; - SHA256_W2[i] = s1 + SHA256_W2[i - 7] + s0 + SHA256_W2[i - 16] | 0; - } - let { A, B, C, D: D2, E, F, G, H } = this; - for (let i = 0; i < 64; i++) { - const sigma1 = rotr2(E, 6) ^ rotr2(E, 11) ^ rotr2(E, 25); - const T1 = H + sigma1 + Chi2(E, F, G) + SHA256_K2[i] + SHA256_W2[i] | 0; - const sigma0 = rotr2(A, 2) ^ rotr2(A, 13) ^ rotr2(A, 22); - const T2 = sigma0 + Maj2(A, B, C) | 0; - H = G; - G = F; - F = E; - E = D2 + T1 | 0; - D2 = C; - C = B; - B = A; - A = T1 + T2 | 0; - } - A = A + this.A | 0; - B = B + this.B | 0; - C = C + this.C | 0; - D2 = D2 + this.D | 0; - E = E + this.E | 0; - F = F + this.F | 0; - G = G + this.G | 0; - H = H + this.H | 0; - this.set(A, B, C, D2, E, F, G, H); - } - roundClean() { - clean2(SHA256_W2); - } - destroy() { - this.set(0, 0, 0, 0, 0, 0, 0, 0); - clean2(this.buffer); - } - }; - _SHA256 = class extends SHA2_32B { - // We cannot use array here since array allows indexing by variable - // which means optimizer/compiler cannot use registers. - A = SHA256_IV2[0] | 0; - B = SHA256_IV2[1] | 0; - C = SHA256_IV2[2] | 0; - D = SHA256_IV2[3] | 0; - E = SHA256_IV2[4] | 0; - F = SHA256_IV2[5] | 0; - G = SHA256_IV2[6] | 0; - H = SHA256_IV2[7] | 0; - constructor() { - super(32); - } - }; - sha2564 = /* @__PURE__ */ createHasher3( - () => new _SHA256(), - /* @__PURE__ */ oidNist(1) - ); - } -}); - -// node_modules/@noble/curves/utils.js -function abool3(value, title = "") { - if (typeof value !== "boolean") { - const prefix = title && `"${title}" `; - throw new Error(prefix + "expected boolean, got type=" + typeof value); - } - return value; -} -function abignumber(n) { - if (typeof n === "bigint") { - if (!isPosBig3(n)) - throw new Error("positive bigint expected, got " + n); - } else - anumber3(n); - return n; -} -function numberToHexUnpadded3(num2) { - const hex = abignumber(num2).toString(16); - return hex.length & 1 ? "0" + hex : hex; -} -function hexToNumber4(hex) { - if (typeof hex !== "string") - throw new Error("hex string expected, got " + typeof hex); - return hex === "" ? _0n12 : BigInt("0x" + hex); -} -function bytesToNumberBE3(bytes) { - return hexToNumber4(bytesToHex4(bytes)); -} -function bytesToNumberLE3(bytes) { - return hexToNumber4(bytesToHex4(copyBytes(abytes4(bytes)).reverse())); -} -function numberToBytesBE3(n, len) { - anumber3(len); - n = abignumber(n); - const res = hexToBytes4(n.toString(16).padStart(len * 2, "0")); - if (res.length !== len) - throw new Error("number too large"); - return res; -} -function numberToBytesLE3(n, len) { - return numberToBytesBE3(n, len).reverse(); -} -function copyBytes(bytes) { - return Uint8Array.from(bytes); -} -function inRange3(n, min, max) { - return isPosBig3(n) && isPosBig3(min) && isPosBig3(max) && min <= n && n < max; -} -function aInRange3(title, n, min, max) { - if (!inRange3(n, min, max)) - throw new Error("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n); -} -function bitLen3(n) { - let len; - for (len = 0; n > _0n12; n >>= _1n12, len += 1) - ; - return len; -} -function createHmacDrbg3(hashLen, qByteLen, hmacFn) { - anumber3(hashLen, "hashLen"); - anumber3(qByteLen, "qByteLen"); - if (typeof hmacFn !== "function") - throw new Error("hmacFn must be a function"); - const u8n3 = (len) => new Uint8Array(len); - const NULL = Uint8Array.of(); - const byte0 = Uint8Array.of(0); - const byte1 = Uint8Array.of(1); - const _maxDrbgIters = 1e3; - let v = u8n3(hashLen); - let k = u8n3(hashLen); - let i = 0; - const reset = () => { - v.fill(1); - k.fill(0); - i = 0; - }; - const h = (...msgs) => hmacFn(k, concatBytes5(v, ...msgs)); - const reseed = (seed = NULL) => { - k = h(byte0, seed); - v = h(); - if (seed.length === 0) - return; - k = h(byte1, seed); - v = h(); - }; - const gen2 = () => { - if (i++ >= _maxDrbgIters) - throw new Error("drbg: tried max amount of iterations"); - let len = 0; - const out = []; - while (len < qByteLen) { - v = h(); - const sl = v.slice(); - out.push(sl); - len += v.length; - } - return concatBytes5(...out); - }; - const genUntil = (seed, pred) => { - reset(); - reseed(seed); - let res = void 0; - while (!(res = pred(gen2()))) - reseed(); - reset(); - return res; - }; - return genUntil; -} -function validateObject3(object, fields = {}, optFields = {}) { - if (!object || typeof object !== "object") - throw new Error("expected valid options object"); - function checkField(fieldName, expectedType, isOpt) { - const val = object[fieldName]; - if (isOpt && val === void 0) - return; - const current = typeof val; - if (current !== expectedType || val === null) - throw new Error(`param "${fieldName}" is invalid: expected ${expectedType}, got ${current}`); - } - const iter = (f, isOpt) => Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt)); - iter(fields, false); - iter(optFields, true); -} -function memoized3(fn) { - const map = /* @__PURE__ */ new WeakMap(); - return (arg, ...args) => { - const val = map.get(arg); - if (val !== void 0) - return val; - const computed = fn(arg, ...args); - map.set(arg, computed); - return computed; - }; -} -var _0n12, _1n12, isPosBig3, bitMask3; -var init_utils7 = __esm({ - "node_modules/@noble/curves/utils.js"() { - "use strict"; - init_utils6(); - init_utils6(); - _0n12 = /* @__PURE__ */ BigInt(0); - _1n12 = /* @__PURE__ */ BigInt(1); - isPosBig3 = (n) => typeof n === "bigint" && _0n12 <= n; - bitMask3 = (n) => (_1n12 << BigInt(n)) - _1n12; - } -}); - -// node_modules/@noble/curves/abstract/modular.js -function mod3(a, b) { - const result = a % b; - return result >= _0n13 ? result : b + result; -} -function pow23(x, power, modulo2) { - let res = x; - while (power-- > _0n13) { - res *= res; - res %= modulo2; - } - return res; -} -function invert3(number, modulo2) { - if (number === _0n13) - throw new Error("invert: expected non-zero number"); - if (modulo2 <= _0n13) - throw new Error("invert: expected positive modulus, got " + modulo2); - let a = mod3(number, modulo2); - let b = modulo2; - let x = _0n13, y = _1n13, u = _1n13, v = _0n13; - while (a !== _0n13) { - const q = b / a; - const r = b % a; - const m = x - u * q; - const n = y - v * q; - b = a, a = r, x = u, y = v, u = m, v = n; - } - const gcd2 = b; - if (gcd2 !== _1n13) - throw new Error("invert: does not exist"); - return mod3(x, modulo2); -} -function assertIsSquare(Fp, root, n) { - if (!Fp.eql(Fp.sqr(root), n)) - throw new Error("Cannot find square root"); -} -function sqrt3mod43(Fp, n) { - const p1div4 = (Fp.ORDER + _1n13) / _4n5; - const root = Fp.pow(n, p1div4); - assertIsSquare(Fp, root, n); - return root; -} -function sqrt5mod83(Fp, n) { - const p5div8 = (Fp.ORDER - _5n3) / _8n3; - const n2 = Fp.mul(n, _2n8); - const v = Fp.pow(n2, p5div8); - const nv = Fp.mul(n, v); - const i = Fp.mul(Fp.mul(nv, _2n8), v); - const root = Fp.mul(nv, Fp.sub(i, Fp.ONE)); - assertIsSquare(Fp, root, n); - return root; -} -function sqrt9mod16(P2) { - const Fp_ = Field3(P2); - const tn = tonelliShanks3(P2); - const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); - const c2 = tn(Fp_, c1); - const c3 = tn(Fp_, Fp_.neg(c1)); - const c4 = (P2 + _7n2) / _16n; - return (Fp, n) => { - let tv1 = Fp.pow(n, c4); - let tv2 = Fp.mul(tv1, c1); - const tv3 = Fp.mul(tv1, c2); - const tv4 = Fp.mul(tv1, c3); - const e1 = Fp.eql(Fp.sqr(tv2), n); - const e22 = Fp.eql(Fp.sqr(tv3), n); - tv1 = Fp.cmov(tv1, tv2, e1); - tv2 = Fp.cmov(tv4, tv3, e22); - const e32 = Fp.eql(Fp.sqr(tv2), n); - const root = Fp.cmov(tv1, tv2, e32); - assertIsSquare(Fp, root, n); - return root; - }; -} -function tonelliShanks3(P2) { - if (P2 < _3n5) - throw new Error("sqrt is not defined for small field"); - let Q = P2 - _1n13; - let S = 0; - while (Q % _2n8 === _0n13) { - Q /= _2n8; - S++; - } - let Z = _2n8; - const _Fp = Field3(P2); - while (FpLegendre3(_Fp, Z) === 1) { - if (Z++ > 1e3) - throw new Error("Cannot find square root: probably non-prime P"); - } - if (S === 1) - return sqrt3mod43; - let cc = _Fp.pow(Z, Q); - const Q1div2 = (Q + _1n13) / _2n8; - return function tonelliSlow(Fp, n) { - if (Fp.is0(n)) - return n; - if (FpLegendre3(Fp, n) !== 1) - throw new Error("Cannot find square root"); - let M = S; - let c2 = Fp.mul(Fp.ONE, cc); - let t = Fp.pow(n, Q); - let R = Fp.pow(n, Q1div2); - while (!Fp.eql(t, Fp.ONE)) { - if (Fp.is0(t)) - return Fp.ZERO; - let i = 1; - let t_tmp = Fp.sqr(t); - while (!Fp.eql(t_tmp, Fp.ONE)) { - i++; - t_tmp = Fp.sqr(t_tmp); - if (i === M) - throw new Error("Cannot find square root"); - } - const exponent = _1n13 << BigInt(M - i - 1); - const b = Fp.pow(c2, exponent); - M = i; - c2 = Fp.sqr(b); - t = Fp.mul(t, c2); - R = Fp.mul(R, b); - } - return R; - }; -} -function FpSqrt3(P2) { - if (P2 % _4n5 === _3n5) - return sqrt3mod43; - if (P2 % _8n3 === _5n3) - return sqrt5mod83; - if (P2 % _16n === _9n) - return sqrt9mod16(P2); - return tonelliShanks3(P2); -} -function validateField3(field) { - const initial = { - ORDER: "bigint", - BYTES: "number", - BITS: "number" - }; - const opts = FIELD_FIELDS3.reduce((map, val) => { - map[val] = "function"; - return map; - }, initial); - validateObject3(field, opts); - return field; -} -function FpPow3(Fp, num2, power) { - if (power < _0n13) - throw new Error("invalid exponent, negatives unsupported"); - if (power === _0n13) - return Fp.ONE; - if (power === _1n13) - return num2; - let p = Fp.ONE; - let d = num2; - while (power > _0n13) { - if (power & _1n13) - p = Fp.mul(p, d); - d = Fp.sqr(d); - power >>= _1n13; - } - return p; -} -function FpInvertBatch3(Fp, nums, passZero = false) { - const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : void 0); - const multipliedAcc = nums.reduce((acc, num2, i) => { - if (Fp.is0(num2)) - return acc; - inverted[i] = acc; - return Fp.mul(acc, num2); - }, Fp.ONE); - const invertedAcc = Fp.inv(multipliedAcc); - nums.reduceRight((acc, num2, i) => { - if (Fp.is0(num2)) - return acc; - inverted[i] = Fp.mul(acc, inverted[i]); - return Fp.mul(acc, num2); - }, invertedAcc); - return inverted; -} -function FpLegendre3(Fp, n) { - const p1mod2 = (Fp.ORDER - _1n13) / _2n8; - const powered = Fp.pow(n, p1mod2); - const yes = Fp.eql(powered, Fp.ONE); - const zero = Fp.eql(powered, Fp.ZERO); - const no = Fp.eql(powered, Fp.neg(Fp.ONE)); - if (!yes && !zero && !no) - throw new Error("invalid Legendre symbol result"); - return yes ? 1 : zero ? 0 : -1; -} -function nLength3(n, nBitLength) { - if (nBitLength !== void 0) - anumber3(nBitLength); - const _nBitLength = nBitLength !== void 0 ? nBitLength : n.toString(2).length; - const nByteLength = Math.ceil(_nBitLength / 8); - return { nBitLength: _nBitLength, nByteLength }; -} -function Field3(ORDER, opts = {}) { - return new _Field(ORDER, opts); -} -function getFieldBytesLength3(fieldOrder) { - if (typeof fieldOrder !== "bigint") - throw new Error("field order must be bigint"); - const bitLength = fieldOrder.toString(2).length; - return Math.ceil(bitLength / 8); -} -function getMinHashLength3(fieldOrder) { - const length = getFieldBytesLength3(fieldOrder); - return length + Math.ceil(length / 2); -} -function mapHashToField3(key, fieldOrder, isLE2 = false) { - abytes4(key); - const len = key.length; - const fieldLen = getFieldBytesLength3(fieldOrder); - const minLen = getMinHashLength3(fieldOrder); - if (len < 16 || len < minLen || len > 1024) - throw new Error("expected " + minLen + "-1024 bytes of input, got " + len); - const num2 = isLE2 ? bytesToNumberLE3(key) : bytesToNumberBE3(key); - const reduced = mod3(num2, fieldOrder - _1n13) + _1n13; - return isLE2 ? numberToBytesLE3(reduced, fieldLen) : numberToBytesBE3(reduced, fieldLen); -} -var _0n13, _1n13, _2n8, _3n5, _4n5, _5n3, _7n2, _8n3, _9n, _16n, FIELD_FIELDS3, _Field; -var init_modular2 = __esm({ - "node_modules/@noble/curves/abstract/modular.js"() { - "use strict"; - init_utils7(); - _0n13 = /* @__PURE__ */ BigInt(0); - _1n13 = /* @__PURE__ */ BigInt(1); - _2n8 = /* @__PURE__ */ BigInt(2); - _3n5 = /* @__PURE__ */ BigInt(3); - _4n5 = /* @__PURE__ */ BigInt(4); - _5n3 = /* @__PURE__ */ BigInt(5); - _7n2 = /* @__PURE__ */ BigInt(7); - _8n3 = /* @__PURE__ */ BigInt(8); - _9n = /* @__PURE__ */ BigInt(9); - _16n = /* @__PURE__ */ BigInt(16); - FIELD_FIELDS3 = [ - "create", - "isValid", - "is0", - "neg", - "inv", - "sqrt", - "sqr", - "eql", - "add", - "sub", - "mul", - "pow", - "div", - "addN", - "subN", - "mulN", - "sqrN" - ]; - _Field = class { - ORDER; - BITS; - BYTES; - isLE; - ZERO = _0n13; - ONE = _1n13; - _lengths; - _sqrt; - // cached sqrt - _mod; - constructor(ORDER, opts = {}) { - if (ORDER <= _0n13) - throw new Error("invalid field: expected ORDER > 0, got " + ORDER); - let _nbitLength = void 0; - this.isLE = false; - if (opts != null && typeof opts === "object") { - if (typeof opts.BITS === "number") - _nbitLength = opts.BITS; - if (typeof opts.sqrt === "function") - this.sqrt = opts.sqrt; - if (typeof opts.isLE === "boolean") - this.isLE = opts.isLE; - if (opts.allowedLengths) - this._lengths = opts.allowedLengths?.slice(); - if (typeof opts.modFromBytes === "boolean") - this._mod = opts.modFromBytes; - } - const { nBitLength, nByteLength } = nLength3(ORDER, _nbitLength); - if (nByteLength > 2048) - throw new Error("invalid field: expected ORDER of <= 2048 bytes"); - this.ORDER = ORDER; - this.BITS = nBitLength; - this.BYTES = nByteLength; - this._sqrt = void 0; - Object.preventExtensions(this); - } - create(num2) { - return mod3(num2, this.ORDER); - } - isValid(num2) { - if (typeof num2 !== "bigint") - throw new Error("invalid field element: expected bigint, got " + typeof num2); - return _0n13 <= num2 && num2 < this.ORDER; - } - is0(num2) { - return num2 === _0n13; - } - // is valid and invertible - isValidNot0(num2) { - return !this.is0(num2) && this.isValid(num2); - } - isOdd(num2) { - return (num2 & _1n13) === _1n13; - } - neg(num2) { - return mod3(-num2, this.ORDER); - } - eql(lhs, rhs) { - return lhs === rhs; - } - sqr(num2) { - return mod3(num2 * num2, this.ORDER); - } - add(lhs, rhs) { - return mod3(lhs + rhs, this.ORDER); - } - sub(lhs, rhs) { - return mod3(lhs - rhs, this.ORDER); - } - mul(lhs, rhs) { - return mod3(lhs * rhs, this.ORDER); - } - pow(num2, power) { - return FpPow3(this, num2, power); - } - div(lhs, rhs) { - return mod3(lhs * invert3(rhs, this.ORDER), this.ORDER); - } - // Same as above, but doesn't normalize - sqrN(num2) { - return num2 * num2; - } - addN(lhs, rhs) { - return lhs + rhs; - } - subN(lhs, rhs) { - return lhs - rhs; - } - mulN(lhs, rhs) { - return lhs * rhs; - } - inv(num2) { - return invert3(num2, this.ORDER); - } - sqrt(num2) { - if (!this._sqrt) - this._sqrt = FpSqrt3(this.ORDER); - return this._sqrt(this, num2); - } - toBytes(num2) { - return this.isLE ? numberToBytesLE3(num2, this.BYTES) : numberToBytesBE3(num2, this.BYTES); - } - fromBytes(bytes, skipValidation = false) { - abytes4(bytes); - const { _lengths: allowedLengths, BYTES, isLE: isLE2, ORDER, _mod: modFromBytes } = this; - if (allowedLengths) { - if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) { - throw new Error("Field.fromBytes: expected " + allowedLengths + " bytes, got " + bytes.length); - } - const padded = new Uint8Array(BYTES); - padded.set(bytes, isLE2 ? 0 : padded.length - bytes.length); - bytes = padded; - } - if (bytes.length !== BYTES) - throw new Error("Field.fromBytes: expected " + BYTES + " bytes, got " + bytes.length); - let scalar = isLE2 ? bytesToNumberLE3(bytes) : bytesToNumberBE3(bytes); - if (modFromBytes) - scalar = mod3(scalar, ORDER); - if (!skipValidation) { - if (!this.isValid(scalar)) - throw new Error("invalid field element: outside of range 0..ORDER"); - } - return scalar; - } - // TODO: we don't need it here, move out to separate fn - invertBatch(lst) { - return FpInvertBatch3(this, lst); - } - // We can't move this out because Fp6, Fp12 implement it - // and it's unclear what to return in there. - cmov(a, b, condition) { - return condition ? b : a; - } - }; - } -}); - -// node_modules/@noble/curves/abstract/curve.js -function negateCt(condition, item) { - const neg = item.negate(); - return condition ? neg : item; -} -function normalizeZ(c2, points) { - const invertedZs = FpInvertBatch3(c2.Fp, points.map((p) => p.Z)); - return points.map((p, i) => c2.fromAffine(p.toAffine(invertedZs[i]))); -} -function validateW3(W, bits) { - if (!Number.isSafeInteger(W) || W <= 0 || W > bits) - throw new Error("invalid window size, expected [1.." + bits + "], got W=" + W); -} -function calcWOpts3(W, scalarBits) { - validateW3(W, scalarBits); - const windows = Math.ceil(scalarBits / W) + 1; - const windowSize = 2 ** (W - 1); - const maxNumber = 2 ** W; - const mask = bitMask3(W); - const shiftBy = BigInt(W); - return { windows, windowSize, mask, maxNumber, shiftBy }; -} -function calcOffsets3(n, window, wOpts) { - const { windowSize, mask, maxNumber, shiftBy } = wOpts; - let wbits = Number(n & mask); - let nextN = n >> shiftBy; - if (wbits > windowSize) { - wbits -= maxNumber; - nextN += _1n14; - } - const offsetStart = window * windowSize; - const offset = offsetStart + Math.abs(wbits) - 1; - const isZero = wbits === 0; - const isNeg = wbits < 0; - const isNegF = window % 2 !== 0; - const offsetF = offsetStart; - return { nextN, offset, isZero, isNeg, isNegF, offsetF }; -} -function getW3(P2) { - return pointWindowSizes3.get(P2) || 1; -} -function assert0(n) { - if (n !== _0n14) - throw new Error("invalid wNAF"); -} -function mulEndoUnsafe(Point3, point, k1, k2) { - let acc = point; - let p1 = Point3.ZERO; - let p2 = Point3.ZERO; - while (k1 > _0n14 || k2 > _0n14) { - if (k1 & _1n14) - p1 = p1.add(acc); - if (k2 & _1n14) - p2 = p2.add(acc); - acc = acc.double(); - k1 >>= _1n14; - k2 >>= _1n14; - } - return { p1, p2 }; -} -function createField(order, field, isLE2) { - if (field) { - if (field.ORDER !== order) - throw new Error("Field.ORDER must match order: Fp == p, Fn == n"); - validateField3(field); - return field; - } else { - return Field3(order, { isLE: isLE2 }); - } -} -function createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) { - if (FpFnLE === void 0) - FpFnLE = type === "edwards"; - if (!CURVE || typeof CURVE !== "object") - throw new Error(`expected valid ${type} CURVE object`); - for (const p of ["p", "n", "h"]) { - const val = CURVE[p]; - if (!(typeof val === "bigint" && val > _0n14)) - throw new Error(`CURVE.${p} must be positive bigint`); - } - const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE); - const Fn2 = createField(CURVE.n, curveOpts.Fn, FpFnLE); - const _b = type === "weierstrass" ? "b" : "d"; - const params = ["Gx", "Gy", "a", _b]; - for (const p of params) { - if (!Fp.isValid(CURVE[p])) - throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`); - } - CURVE = Object.freeze(Object.assign({}, CURVE)); - return { CURVE, Fp, Fn: Fn2 }; -} -function createKeygen(randomSecretKey, getPublicKey) { - return function keygen(seed) { - const secretKey = randomSecretKey(seed); - return { secretKey, publicKey: getPublicKey(secretKey) }; - }; -} -var _0n14, _1n14, pointPrecomputes3, pointWindowSizes3, wNAF3; -var init_curve2 = __esm({ - "node_modules/@noble/curves/abstract/curve.js"() { - "use strict"; - init_utils7(); - init_modular2(); - _0n14 = /* @__PURE__ */ BigInt(0); - _1n14 = /* @__PURE__ */ BigInt(1); - pointPrecomputes3 = /* @__PURE__ */ new WeakMap(); - pointWindowSizes3 = /* @__PURE__ */ new WeakMap(); - wNAF3 = class { - BASE; - ZERO; - Fn; - bits; - // Parametrized with a given Point class (not individual point) - constructor(Point3, bits) { - this.BASE = Point3.BASE; - this.ZERO = Point3.ZERO; - this.Fn = Point3.Fn; - this.bits = bits; - } - // non-const time multiplication ladder - _unsafeLadder(elm, n, p = this.ZERO) { - let d = elm; - while (n > _0n14) { - if (n & _1n14) - p = p.add(d); - d = d.double(); - n >>= _1n14; - } - return p; - } - /** - * Creates a wNAF precomputation window. Used for caching. - * Default window size is set by `utils.precompute()` and is equal to 8. - * Number of precomputed points depends on the curve size: - * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where: - * - 𝑊 is the window size - * - 𝑛 is the bitlength of the curve order. - * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224. - * @param point Point instance - * @param W window size - * @returns precomputed point tables flattened to a single array - */ - precomputeWindow(point, W) { - const { windows, windowSize } = calcWOpts3(W, this.bits); - const points = []; - let p = point; - let base2 = p; - for (let window = 0; window < windows; window++) { - base2 = p; - points.push(base2); - for (let i = 1; i < windowSize; i++) { - base2 = base2.add(p); - points.push(base2); - } - p = base2.double(); - } - return points; - } - /** - * Implements ec multiplication using precomputed tables and w-ary non-adjacent form. - * More compact implementation: - * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541 - * @returns real and fake (for const-time) points - */ - wNAF(W, precomputes, n) { - if (!this.Fn.isValid(n)) - throw new Error("invalid scalar"); - let p = this.ZERO; - let f = this.BASE; - const wo = calcWOpts3(W, this.bits); - for (let window = 0; window < wo.windows; window++) { - const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets3(n, window, wo); - n = nextN; - if (isZero) { - f = f.add(negateCt(isNegF, precomputes[offsetF])); - } else { - p = p.add(negateCt(isNeg, precomputes[offset])); - } - } - assert0(n); - return { p, f }; - } - /** - * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form. - * @param acc accumulator point to add result of multiplication - * @returns point - */ - wNAFUnsafe(W, precomputes, n, acc = this.ZERO) { - const wo = calcWOpts3(W, this.bits); - for (let window = 0; window < wo.windows; window++) { - if (n === _0n14) - break; - const { nextN, offset, isZero, isNeg } = calcOffsets3(n, window, wo); - n = nextN; - if (isZero) { - continue; - } else { - const item = precomputes[offset]; - acc = acc.add(isNeg ? item.negate() : item); - } - } - assert0(n); - return acc; - } - getPrecomputes(W, point, transform) { - let comp = pointPrecomputes3.get(point); - if (!comp) { - comp = this.precomputeWindow(point, W); - if (W !== 1) { - if (typeof transform === "function") - comp = transform(comp); - pointPrecomputes3.set(point, comp); - } - } - return comp; - } - cached(point, scalar, transform) { - const W = getW3(point); - return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar); - } - unsafe(point, scalar, transform, prev) { - const W = getW3(point); - if (W === 1) - return this._unsafeLadder(point, scalar, prev); - return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev); - } - // We calculate precomputes for elliptic curve point multiplication - // using windowed method. This specifies window size and - // stores precomputed values. Usually only base point would be precomputed. - createCache(P2, W) { - validateW3(W, this.bits); - pointWindowSizes3.set(P2, W); - pointPrecomputes3.delete(P2); - } - hasCache(elm) { - return getW3(elm) !== 1; - } - }; - } -}); - -// node_modules/@noble/curves/node_modules/@noble/hashes/hmac.js -var _HMAC, hmac2; -var init_hmac2 = __esm({ - "node_modules/@noble/curves/node_modules/@noble/hashes/hmac.js"() { - "use strict"; - init_utils6(); - _HMAC = class { - oHash; - iHash; - blockLen; - outputLen; - finished = false; - destroyed = false; - constructor(hash3, key) { - ahash2(hash3); - abytes4(key, void 0, "key"); - this.iHash = hash3.create(); - if (typeof this.iHash.update !== "function") - throw new Error("Expected instance of class which extends utils.Hash"); - this.blockLen = this.iHash.blockLen; - this.outputLen = this.iHash.outputLen; - const blockLen = this.blockLen; - const pad4 = new Uint8Array(blockLen); - pad4.set(key.length > blockLen ? hash3.create().update(key).digest() : key); - for (let i = 0; i < pad4.length; i++) - pad4[i] ^= 54; - this.iHash.update(pad4); - this.oHash = hash3.create(); - for (let i = 0; i < pad4.length; i++) - pad4[i] ^= 54 ^ 92; - this.oHash.update(pad4); - clean2(pad4); - } - update(buf) { - aexists2(this); - this.iHash.update(buf); - return this; - } - digestInto(out) { - aexists2(this); - abytes4(out, this.outputLen, "output"); - this.finished = true; - this.iHash.digestInto(out); - this.oHash.update(out); - this.oHash.digestInto(out); - this.destroy(); - } - digest() { - const out = new Uint8Array(this.oHash.outputLen); - this.digestInto(out); - return out; - } - _cloneInto(to) { - to ||= Object.create(Object.getPrototypeOf(this), {}); - const { oHash, iHash, finished: finished2, destroyed, blockLen, outputLen } = this; - to = to; - to.finished = finished2; - to.destroyed = destroyed; - to.blockLen = blockLen; - to.outputLen = outputLen; - to.oHash = oHash._cloneInto(to.oHash); - to.iHash = iHash._cloneInto(to.iHash); - return to; - } - clone() { - return this._cloneInto(); - } - destroy() { - this.destroyed = true; - this.oHash.destroy(); - this.iHash.destroy(); - } - }; - hmac2 = (hash3, key, message) => new _HMAC(hash3, key).update(message).digest(); - hmac2.create = (hash3, key) => new _HMAC(hash3, key); - } -}); - -// node_modules/@noble/curves/abstract/weierstrass.js -function _splitEndoScalar(k, basis, n) { - const [[a1, b1], [a2, b2]] = basis; - const c1 = divNearest3(b2 * k, n); - const c2 = divNearest3(-b1 * k, n); - let k1 = k - c1 * a1 - c2 * a2; - let k2 = -c1 * b1 - c2 * b2; - const k1neg = k1 < _0n15; - const k2neg = k2 < _0n15; - if (k1neg) - k1 = -k1; - if (k2neg) - k2 = -k2; - const MAX_NUM = bitMask3(Math.ceil(bitLen3(n) / 2)) + _1n15; - if (k1 < _0n15 || k1 >= MAX_NUM || k2 < _0n15 || k2 >= MAX_NUM) { - throw new Error("splitScalar (endomorphism): failed, k=" + k); - } - return { k1neg, k1, k2neg, k2 }; -} -function validateSigFormat(format) { - if (!["compact", "recovered", "der"].includes(format)) - throw new Error('Signature format must be "compact", "recovered", or "der"'); - return format; -} -function validateSigOpts(opts, def) { - const optsn = {}; - for (let optName of Object.keys(def)) { - optsn[optName] = opts[optName] === void 0 ? def[optName] : opts[optName]; - } - abool3(optsn.lowS, "lowS"); - abool3(optsn.prehash, "prehash"); - if (optsn.format !== void 0) - validateSigFormat(optsn.format); - return optsn; -} -function weierstrass3(params, extraOpts = {}) { - const validated = createCurveFields("weierstrass", params, extraOpts); - const { Fp, Fn: Fn2 } = validated; - let CURVE = validated.CURVE; - const { h: cofactor, n: CURVE_ORDER } = CURVE; - validateObject3(extraOpts, {}, { - allowInfinityPoint: "boolean", - clearCofactor: "function", - isTorsionFree: "function", - fromBytes: "function", - toBytes: "function", - endo: "object" - }); - const { endo } = extraOpts; - if (endo) { - if (!Fp.is0(CURVE.a) || typeof endo.beta !== "bigint" || !Array.isArray(endo.basises)) { - throw new Error('invalid endo: expected "beta": bigint and "basises": array'); - } - } - const lengths = getWLengths(Fp, Fn2); - function assertCompressionIsSupported() { - if (!Fp.isOdd) - throw new Error("compression is not supported: Field does not have .isOdd()"); - } - function pointToBytes2(_c, point, isCompressed) { - const { x, y } = point.toAffine(); - const bx = Fp.toBytes(x); - abool3(isCompressed, "isCompressed"); - if (isCompressed) { - assertCompressionIsSupported(); - const hasEvenY = !Fp.isOdd(y); - return concatBytes5(pprefix(hasEvenY), bx); - } else { - return concatBytes5(Uint8Array.of(4), bx, Fp.toBytes(y)); - } - } - function pointFromBytes(bytes) { - abytes4(bytes, void 0, "Point"); - const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; - const length = bytes.length; - const head = bytes[0]; - const tail = bytes.subarray(1); - if (length === comp && (head === 2 || head === 3)) { - const x = Fp.fromBytes(tail); - if (!Fp.isValid(x)) - throw new Error("bad point: is not on curve, wrong x"); - const y2 = weierstrassEquation(x); - let y; - try { - y = Fp.sqrt(y2); - } catch (sqrtError) { - const err = sqrtError instanceof Error ? ": " + sqrtError.message : ""; - throw new Error("bad point: is not on curve, sqrt error" + err); - } - assertCompressionIsSupported(); - const evenY = Fp.isOdd(y); - const evenH = (head & 1) === 1; - if (evenH !== evenY) - y = Fp.neg(y); - return { x, y }; - } else if (length === uncomp && head === 4) { - const L = Fp.BYTES; - const x = Fp.fromBytes(tail.subarray(0, L)); - const y = Fp.fromBytes(tail.subarray(L, L * 2)); - if (!isValidXY(x, y)) - throw new Error("bad point: is not on curve"); - return { x, y }; - } else { - throw new Error(`bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`); - } - } - const encodePoint = extraOpts.toBytes || pointToBytes2; - const decodePoint = extraOpts.fromBytes || pointFromBytes; - function weierstrassEquation(x) { - const x2 = Fp.sqr(x); - const x3 = Fp.mul(x2, x); - return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); - } - function isValidXY(x, y) { - const left = Fp.sqr(y); - const right = weierstrassEquation(x); - return Fp.eql(left, right); - } - if (!isValidXY(CURVE.Gx, CURVE.Gy)) - throw new Error("bad curve params: generator point"); - const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n6), _4n6); - const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27)); - if (Fp.is0(Fp.add(_4a3, _27b2))) - throw new Error("bad curve params: a or b"); - function acoord(title, n, banZero = false) { - if (!Fp.isValid(n) || banZero && Fp.is0(n)) - throw new Error(`bad point coordinate ${title}`); - return n; - } - function aprjpoint(other) { - if (!(other instanceof Point3)) - throw new Error("Weierstrass Point expected"); - } - function splitEndoScalarN(k) { - if (!endo || !endo.basises) - throw new Error("no endo"); - return _splitEndoScalar(k, endo.basises, Fn2.ORDER); - } - const toAffineMemo = memoized3((p, iz) => { - const { X, Y, Z } = p; - if (Fp.eql(Z, Fp.ONE)) - return { x: X, y: Y }; - const is0 = p.is0(); - if (iz == null) - iz = is0 ? Fp.ONE : Fp.inv(Z); - const x = Fp.mul(X, iz); - const y = Fp.mul(Y, iz); - const zz = Fp.mul(Z, iz); - if (is0) - return { x: Fp.ZERO, y: Fp.ZERO }; - if (!Fp.eql(zz, Fp.ONE)) - throw new Error("invZ was invalid"); - return { x, y }; - }); - const assertValidMemo = memoized3((p) => { - if (p.is0()) { - if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) - return; - throw new Error("bad point: ZERO"); - } - const { x, y } = p.toAffine(); - if (!Fp.isValid(x) || !Fp.isValid(y)) - throw new Error("bad point: x or y not field elements"); - if (!isValidXY(x, y)) - throw new Error("bad point: equation left != right"); - if (!p.isTorsionFree()) - throw new Error("bad point: not in prime-order subgroup"); - return true; - }); - function finishEndo(endoBeta, k1p, k2p, k1neg, k2neg) { - k2p = new Point3(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z); - k1p = negateCt(k1neg, k1p); - k2p = negateCt(k2neg, k2p); - return k1p.add(k2p); - } - class Point3 { - // base / generator point - static BASE = new Point3(CURVE.Gx, CURVE.Gy, Fp.ONE); - // zero / infinity / identity point - static ZERO = new Point3(Fp.ZERO, Fp.ONE, Fp.ZERO); - // 0, 1, 0 - // math field - static Fp = Fp; - // scalar field - static Fn = Fn2; - X; - Y; - Z; - /** Does NOT validate if the point is valid. Use `.assertValidity()`. */ - constructor(X, Y, Z) { - this.X = acoord("x", X); - this.Y = acoord("y", Y, true); - this.Z = acoord("z", Z); - Object.freeze(this); - } - static CURVE() { - return CURVE; - } - /** Does NOT validate if the point is valid. Use `.assertValidity()`. */ - static fromAffine(p) { - const { x, y } = p || {}; - if (!p || !Fp.isValid(x) || !Fp.isValid(y)) - throw new Error("invalid affine point"); - if (p instanceof Point3) - throw new Error("projective point not allowed"); - if (Fp.is0(x) && Fp.is0(y)) - return Point3.ZERO; - return new Point3(x, y, Fp.ONE); - } - static fromBytes(bytes) { - const P2 = Point3.fromAffine(decodePoint(abytes4(bytes, void 0, "point"))); - P2.assertValidity(); - return P2; - } - static fromHex(hex) { - return Point3.fromBytes(hexToBytes4(hex)); - } - get x() { - return this.toAffine().x; - } - get y() { - return this.toAffine().y; - } - /** - * - * @param windowSize - * @param isLazy true will defer table computation until the first multiplication - * @returns - */ - precompute(windowSize = 8, isLazy = true) { - wnaf.createCache(this, windowSize); - if (!isLazy) - this.multiply(_3n6); - return this; - } - // TODO: return `this` - /** A point on curve is valid if it conforms to equation. */ - assertValidity() { - assertValidMemo(this); - } - hasEvenY() { - const { y } = this.toAffine(); - if (!Fp.isOdd) - throw new Error("Field doesn't support isOdd"); - return !Fp.isOdd(y); - } - /** Compare one point to another. */ - equals(other) { - aprjpoint(other); - const { X: X1, Y: Y1, Z: Z1 } = this; - const { X: X2, Y: Y2, Z: Z2 } = other; - const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1)); - const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1)); - return U1 && U2; - } - /** Flips point to one corresponding to (x, -y) in Affine coordinates. */ - negate() { - return new Point3(this.X, Fp.neg(this.Y), this.Z); - } - // Renes-Costello-Batina exception-free doubling formula. - // There is 30% faster Jacobian formula, but it is not complete. - // https://eprint.iacr.org/2015/1060, algorithm 3 - // Cost: 8M + 3S + 3*a + 2*b3 + 15add. - double() { - const { a, b } = CURVE; - const b3 = Fp.mul(b, _3n6); - const { X: X1, Y: Y1, Z: Z1 } = this; - let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; - let t0 = Fp.mul(X1, X1); - let t1 = Fp.mul(Y1, Y1); - let t2 = Fp.mul(Z1, Z1); - let t3 = Fp.mul(X1, Y1); - t3 = Fp.add(t3, t3); - Z3 = Fp.mul(X1, Z1); - Z3 = Fp.add(Z3, Z3); - X3 = Fp.mul(a, Z3); - Y3 = Fp.mul(b3, t2); - Y3 = Fp.add(X3, Y3); - X3 = Fp.sub(t1, Y3); - Y3 = Fp.add(t1, Y3); - Y3 = Fp.mul(X3, Y3); - X3 = Fp.mul(t3, X3); - Z3 = Fp.mul(b3, Z3); - t2 = Fp.mul(a, t2); - t3 = Fp.sub(t0, t2); - t3 = Fp.mul(a, t3); - t3 = Fp.add(t3, Z3); - Z3 = Fp.add(t0, t0); - t0 = Fp.add(Z3, t0); - t0 = Fp.add(t0, t2); - t0 = Fp.mul(t0, t3); - Y3 = Fp.add(Y3, t0); - t2 = Fp.mul(Y1, Z1); - t2 = Fp.add(t2, t2); - t0 = Fp.mul(t2, t3); - X3 = Fp.sub(X3, t0); - Z3 = Fp.mul(t2, t1); - Z3 = Fp.add(Z3, Z3); - Z3 = Fp.add(Z3, Z3); - return new Point3(X3, Y3, Z3); - } - // Renes-Costello-Batina exception-free addition formula. - // There is 30% faster Jacobian formula, but it is not complete. - // https://eprint.iacr.org/2015/1060, algorithm 1 - // Cost: 12M + 0S + 3*a + 3*b3 + 23add. - add(other) { - aprjpoint(other); - const { X: X1, Y: Y1, Z: Z1 } = this; - const { X: X2, Y: Y2, Z: Z2 } = other; - let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; - const a = CURVE.a; - const b3 = Fp.mul(CURVE.b, _3n6); - let t0 = Fp.mul(X1, X2); - let t1 = Fp.mul(Y1, Y2); - let t2 = Fp.mul(Z1, Z2); - let t3 = Fp.add(X1, Y1); - let t4 = Fp.add(X2, Y2); - t3 = Fp.mul(t3, t4); - t4 = Fp.add(t0, t1); - t3 = Fp.sub(t3, t4); - t4 = Fp.add(X1, Z1); - let t5 = Fp.add(X2, Z2); - t4 = Fp.mul(t4, t5); - t5 = Fp.add(t0, t2); - t4 = Fp.sub(t4, t5); - t5 = Fp.add(Y1, Z1); - X3 = Fp.add(Y2, Z2); - t5 = Fp.mul(t5, X3); - X3 = Fp.add(t1, t2); - t5 = Fp.sub(t5, X3); - Z3 = Fp.mul(a, t4); - X3 = Fp.mul(b3, t2); - Z3 = Fp.add(X3, Z3); - X3 = Fp.sub(t1, Z3); - Z3 = Fp.add(t1, Z3); - Y3 = Fp.mul(X3, Z3); - t1 = Fp.add(t0, t0); - t1 = Fp.add(t1, t0); - t2 = Fp.mul(a, t2); - t4 = Fp.mul(b3, t4); - t1 = Fp.add(t1, t2); - t2 = Fp.sub(t0, t2); - t2 = Fp.mul(a, t2); - t4 = Fp.add(t4, t2); - t0 = Fp.mul(t1, t4); - Y3 = Fp.add(Y3, t0); - t0 = Fp.mul(t5, t4); - X3 = Fp.mul(t3, X3); - X3 = Fp.sub(X3, t0); - t0 = Fp.mul(t3, t1); - Z3 = Fp.mul(t5, Z3); - Z3 = Fp.add(Z3, t0); - return new Point3(X3, Y3, Z3); - } - subtract(other) { - return this.add(other.negate()); - } - is0() { - return this.equals(Point3.ZERO); - } - /** - * Constant time multiplication. - * Uses wNAF method. Windowed method may be 10% faster, - * but takes 2x longer to generate and consumes 2x memory. - * Uses precomputes when available. - * Uses endomorphism for Koblitz curves. - * @param scalar by which the point would be multiplied - * @returns New point - */ - multiply(scalar) { - const { endo: endo2 } = extraOpts; - if (!Fn2.isValidNot0(scalar)) - throw new Error("invalid scalar: out of range"); - let point, fake; - const mul = (n) => wnaf.cached(this, n, (p) => normalizeZ(Point3, p)); - if (endo2) { - const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar); - const { p: k1p, f: k1f } = mul(k1); - const { p: k2p, f: k2f } = mul(k2); - fake = k1f.add(k2f); - point = finishEndo(endo2.beta, k1p, k2p, k1neg, k2neg); - } else { - const { p, f } = mul(scalar); - point = p; - fake = f; - } - return normalizeZ(Point3, [point, fake])[0]; - } - /** - * Non-constant-time multiplication. Uses double-and-add algorithm. - * It's faster, but should only be used when you don't care about - * an exposed secret key e.g. sig verification, which works over *public* keys. - */ - multiplyUnsafe(sc) { - const { endo: endo2 } = extraOpts; - const p = this; - if (!Fn2.isValid(sc)) - throw new Error("invalid scalar: out of range"); - if (sc === _0n15 || p.is0()) - return Point3.ZERO; - if (sc === _1n15) - return p; - if (wnaf.hasCache(this)) - return this.multiply(sc); - if (endo2) { - const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc); - const { p1, p2 } = mulEndoUnsafe(Point3, p, k1, k2); - return finishEndo(endo2.beta, p1, p2, k1neg, k2neg); - } else { - return wnaf.unsafe(p, sc); - } - } - /** - * Converts Projective point to affine (x, y) coordinates. - * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch - */ - toAffine(invertedZ) { - return toAffineMemo(this, invertedZ); - } - /** - * Checks whether Point is free of torsion elements (is in prime subgroup). - * Always torsion-free for cofactor=1 curves. - */ - isTorsionFree() { - const { isTorsionFree } = extraOpts; - if (cofactor === _1n15) - return true; - if (isTorsionFree) - return isTorsionFree(Point3, this); - return wnaf.unsafe(this, CURVE_ORDER).is0(); - } - clearCofactor() { - const { clearCofactor } = extraOpts; - if (cofactor === _1n15) - return this; - if (clearCofactor) - return clearCofactor(Point3, this); - return this.multiplyUnsafe(cofactor); - } - isSmallOrder() { - return this.multiplyUnsafe(cofactor).is0(); - } - toBytes(isCompressed = true) { - abool3(isCompressed, "isCompressed"); - this.assertValidity(); - return encodePoint(Point3, this, isCompressed); - } - toHex(isCompressed = true) { - return bytesToHex4(this.toBytes(isCompressed)); - } - toString() { - return ``; - } - } - const bits = Fn2.BITS; - const wnaf = new wNAF3(Point3, extraOpts.endo ? Math.ceil(bits / 2) : bits); - Point3.BASE.precompute(8); - return Point3; -} -function pprefix(hasEvenY) { - return Uint8Array.of(hasEvenY ? 2 : 3); -} -function getWLengths(Fp, Fn2) { - return { - secretKey: Fn2.BYTES, - publicKey: 1 + Fp.BYTES, - publicKeyUncompressed: 1 + 2 * Fp.BYTES, - publicKeyHasPrefix: true, - signature: 2 * Fn2.BYTES - }; -} -function ecdh(Point3, ecdhOpts = {}) { - const { Fn: Fn2 } = Point3; - const randomBytes_ = ecdhOpts.randomBytes || randomBytes2; - const lengths = Object.assign(getWLengths(Point3.Fp, Fn2), { seed: getMinHashLength3(Fn2.ORDER) }); - function isValidSecretKey(secretKey) { - try { - const num2 = Fn2.fromBytes(secretKey); - return Fn2.isValidNot0(num2); - } catch (error) { - return false; - } - } - function isValidPublicKey(publicKey, isCompressed) { - const { publicKey: comp, publicKeyUncompressed } = lengths; - try { - const l2 = publicKey.length; - if (isCompressed === true && l2 !== comp) - return false; - if (isCompressed === false && l2 !== publicKeyUncompressed) - return false; - return !!Point3.fromBytes(publicKey); - } catch (error) { - return false; - } - } - function randomSecretKey(seed = randomBytes_(lengths.seed)) { - return mapHashToField3(abytes4(seed, lengths.seed, "seed"), Fn2.ORDER); - } - function getPublicKey(secretKey, isCompressed = true) { - return Point3.BASE.multiply(Fn2.fromBytes(secretKey)).toBytes(isCompressed); - } - function isProbPub(item) { - const { secretKey, publicKey, publicKeyUncompressed } = lengths; - if (!isBytes5(item)) - return void 0; - if ("_lengths" in Fn2 && Fn2._lengths || secretKey === publicKey) - return void 0; - const l2 = abytes4(item, void 0, "key").length; - return l2 === publicKey || l2 === publicKeyUncompressed; - } - function getSharedSecret(secretKeyA, publicKeyB, isCompressed = true) { - if (isProbPub(secretKeyA) === true) - throw new Error("first arg must be private key"); - if (isProbPub(publicKeyB) === false) - throw new Error("second arg must be public key"); - const s3 = Fn2.fromBytes(secretKeyA); - const b = Point3.fromBytes(publicKeyB); - return b.multiply(s3).toBytes(isCompressed); - } - const utils2 = { - isValidSecretKey, - isValidPublicKey, - randomSecretKey - }; - const keygen = createKeygen(randomSecretKey, getPublicKey); - return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point: Point3, utils: utils2, lengths }); -} -function ecdsa(Point3, hash3, ecdsaOpts = {}) { - ahash2(hash3); - validateObject3(ecdsaOpts, {}, { - hmac: "function", - lowS: "boolean", - randomBytes: "function", - bits2int: "function", - bits2int_modN: "function" - }); - ecdsaOpts = Object.assign({}, ecdsaOpts); - const randomBytes4 = ecdsaOpts.randomBytes || randomBytes2; - const hmac4 = ecdsaOpts.hmac || ((key, msg) => hmac2(hash3, key, msg)); - const { Fp, Fn: Fn2 } = Point3; - const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn2; - const { keygen, getPublicKey, getSharedSecret, utils: utils2, lengths } = ecdh(Point3, ecdsaOpts); - const defaultSigOpts = { - prehash: true, - lowS: typeof ecdsaOpts.lowS === "boolean" ? ecdsaOpts.lowS : true, - format: "compact", - extraEntropy: false - }; - const hasLargeCofactor = CURVE_ORDER * _2n9 < Fp.ORDER; - function isBiggerThanHalfOrder(number) { - const HALF = CURVE_ORDER >> _1n15; - return number > HALF; - } - function validateRS(title, num2) { - if (!Fn2.isValidNot0(num2)) - throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`); - return num2; - } - function assertSmallCofactor() { - if (hasLargeCofactor) - throw new Error('"recovered" sig type is not supported for cofactor >2 curves'); - } - function validateSigLength(bytes, format) { - validateSigFormat(format); - const size5 = lengths.signature; - const sizer = format === "compact" ? size5 : format === "recovered" ? size5 + 1 : void 0; - return abytes4(bytes, sizer); - } - class Signature { - r; - s; - recovery; - constructor(r, s3, recovery) { - this.r = validateRS("r", r); - this.s = validateRS("s", s3); - if (recovery != null) { - assertSmallCofactor(); - if (![0, 1, 2, 3].includes(recovery)) - throw new Error("invalid recovery id"); - this.recovery = recovery; - } - Object.freeze(this); - } - static fromBytes(bytes, format = defaultSigOpts.format) { - validateSigLength(bytes, format); - let recid; - if (format === "der") { - const { r: r2, s: s4 } = DER3.toSig(abytes4(bytes)); - return new Signature(r2, s4); - } - if (format === "recovered") { - recid = bytes[0]; - format = "compact"; - bytes = bytes.subarray(1); - } - const L = lengths.signature / 2; - const r = bytes.subarray(0, L); - const s3 = bytes.subarray(L, L * 2); - return new Signature(Fn2.fromBytes(r), Fn2.fromBytes(s3), recid); - } - static fromHex(hex, format) { - return this.fromBytes(hexToBytes4(hex), format); - } - assertRecovery() { - const { recovery } = this; - if (recovery == null) - throw new Error("invalid recovery id: must be present"); - return recovery; - } - addRecoveryBit(recovery) { - return new Signature(this.r, this.s, recovery); - } - recoverPublicKey(messageHash) { - const { r, s: s3 } = this; - const recovery = this.assertRecovery(); - const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r; - if (!Fp.isValid(radj)) - throw new Error("invalid recovery id: sig.r+curve.n != R.x"); - const x = Fp.toBytes(radj); - const R = Point3.fromBytes(concatBytes5(pprefix((recovery & 1) === 0), x)); - const ir = Fn2.inv(radj); - const h = bits2int_modN(abytes4(messageHash, void 0, "msgHash")); - const u1 = Fn2.create(-h * ir); - const u2 = Fn2.create(s3 * ir); - const Q = Point3.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2)); - if (Q.is0()) - throw new Error("invalid recovery: point at infinify"); - Q.assertValidity(); - return Q; - } - // Signatures should be low-s, to prevent malleability. - hasHighS() { - return isBiggerThanHalfOrder(this.s); - } - toBytes(format = defaultSigOpts.format) { - validateSigFormat(format); - if (format === "der") - return hexToBytes4(DER3.hexFromSig(this)); - const { r, s: s3 } = this; - const rb = Fn2.toBytes(r); - const sb = Fn2.toBytes(s3); - if (format === "recovered") { - assertSmallCofactor(); - return concatBytes5(Uint8Array.of(this.assertRecovery()), rb, sb); - } - return concatBytes5(rb, sb); - } - toHex(format) { - return bytesToHex4(this.toBytes(format)); - } - } - const bits2int = ecdsaOpts.bits2int || function bits2int_def(bytes) { - if (bytes.length > 8192) - throw new Error("input is too large"); - const num2 = bytesToNumberBE3(bytes); - const delta = bytes.length * 8 - fnBits; - return delta > 0 ? num2 >> BigInt(delta) : num2; - }; - const bits2int_modN = ecdsaOpts.bits2int_modN || function bits2int_modN_def(bytes) { - return Fn2.create(bits2int(bytes)); - }; - const ORDER_MASK = bitMask3(fnBits); - function int2octets(num2) { - aInRange3("num < 2^" + fnBits, num2, _0n15, ORDER_MASK); - return Fn2.toBytes(num2); - } - function validateMsgAndHash(message, prehash) { - abytes4(message, void 0, "message"); - return prehash ? abytes4(hash3(message), void 0, "prehashed message") : message; - } - function prepSig(message, secretKey, opts) { - const { lowS, prehash, extraEntropy: extraEntropy2 } = validateSigOpts(opts, defaultSigOpts); - message = validateMsgAndHash(message, prehash); - const h1int = bits2int_modN(message); - const d = Fn2.fromBytes(secretKey); - if (!Fn2.isValidNot0(d)) - throw new Error("invalid private key"); - const seedArgs = [int2octets(d), int2octets(h1int)]; - if (extraEntropy2 != null && extraEntropy2 !== false) { - const e7 = extraEntropy2 === true ? randomBytes4(lengths.secretKey) : extraEntropy2; - seedArgs.push(abytes4(e7, void 0, "extraEntropy")); - } - const seed = concatBytes5(...seedArgs); - const m = h1int; - function k2sig(kBytes) { - const k = bits2int(kBytes); - if (!Fn2.isValidNot0(k)) - return; - const ik = Fn2.inv(k); - const q = Point3.BASE.multiply(k).toAffine(); - const r = Fn2.create(q.x); - if (r === _0n15) - return; - const s3 = Fn2.create(ik * Fn2.create(m + r * d)); - if (s3 === _0n15) - return; - let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n15); - let normS = s3; - if (lowS && isBiggerThanHalfOrder(s3)) { - normS = Fn2.neg(s3); - recovery ^= 1; - } - return new Signature(r, normS, hasLargeCofactor ? void 0 : recovery); - } - return { seed, k2sig }; - } - function sign2(message, secretKey, opts = {}) { - const { seed, k2sig } = prepSig(message, secretKey, opts); - const drbg = createHmacDrbg3(hash3.outputLen, Fn2.BYTES, hmac4); - const sig = drbg(seed, k2sig); - return sig.toBytes(opts.format); - } - function verify(signature2, message, publicKey, opts = {}) { - const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts); - publicKey = abytes4(publicKey, void 0, "publicKey"); - message = validateMsgAndHash(message, prehash); - if (!isBytes5(signature2)) { - const end = signature2 instanceof Signature ? ", use sig.toBytes()" : ""; - throw new Error("verify expects Uint8Array signature" + end); - } - validateSigLength(signature2, format); - try { - const sig = Signature.fromBytes(signature2, format); - const P2 = Point3.fromBytes(publicKey); - if (lowS && sig.hasHighS()) - return false; - const { r, s: s3 } = sig; - const h = bits2int_modN(message); - const is = Fn2.inv(s3); - const u1 = Fn2.create(h * is); - const u2 = Fn2.create(r * is); - const R = Point3.BASE.multiplyUnsafe(u1).add(P2.multiplyUnsafe(u2)); - if (R.is0()) - return false; - const v = Fn2.create(R.x); - return v === r; - } catch (e7) { - return false; - } - } - function recoverPublicKey3(signature2, message, opts = {}) { - const { prehash } = validateSigOpts(opts, defaultSigOpts); - message = validateMsgAndHash(message, prehash); - return Signature.fromBytes(signature2, "recovered").recoverPublicKey(message).toBytes(); - } - return Object.freeze({ - keygen, - getPublicKey, - getSharedSecret, - utils: utils2, - lengths, - Point: Point3, - sign: sign2, - verify, - recoverPublicKey: recoverPublicKey3, - Signature, - hash: hash3 - }); -} -var divNearest3, DERErr3, DER3, _0n15, _1n15, _2n9, _3n6, _4n6; -var init_weierstrass2 = __esm({ - "node_modules/@noble/curves/abstract/weierstrass.js"() { - "use strict"; - init_hmac2(); - init_utils6(); - init_utils7(); - init_curve2(); - init_modular2(); - divNearest3 = (num2, den) => (num2 + (num2 >= 0 ? den : -den) / _2n9) / den; - DERErr3 = class extends Error { - constructor(m = "") { - super(m); - } - }; - DER3 = { - // asn.1 DER encoding utils - Err: DERErr3, - // Basic building block is TLV (Tag-Length-Value) - _tlv: { - encode: (tag, data) => { - const { Err: E } = DER3; - if (tag < 0 || tag > 256) - throw new E("tlv.encode: wrong tag"); - if (data.length & 1) - throw new E("tlv.encode: unpadded data"); - const dataLen = data.length / 2; - const len = numberToHexUnpadded3(dataLen); - if (len.length / 2 & 128) - throw new E("tlv.encode: long form length too big"); - const lenLen = dataLen > 127 ? numberToHexUnpadded3(len.length / 2 | 128) : ""; - const t = numberToHexUnpadded3(tag); - return t + lenLen + len + data; - }, - // v - value, l - left bytes (unparsed) - decode(tag, data) { - const { Err: E } = DER3; - let pos = 0; - if (tag < 0 || tag > 256) - throw new E("tlv.encode: wrong tag"); - if (data.length < 2 || data[pos++] !== tag) - throw new E("tlv.decode: wrong tlv"); - const first = data[pos++]; - const isLong = !!(first & 128); - let length = 0; - if (!isLong) - length = first; - else { - const lenLen = first & 127; - if (!lenLen) - throw new E("tlv.decode(long): indefinite length not supported"); - if (lenLen > 4) - throw new E("tlv.decode(long): byte length is too big"); - const lengthBytes = data.subarray(pos, pos + lenLen); - if (lengthBytes.length !== lenLen) - throw new E("tlv.decode: length bytes not complete"); - if (lengthBytes[0] === 0) - throw new E("tlv.decode(long): zero leftmost byte"); - for (const b of lengthBytes) - length = length << 8 | b; - pos += lenLen; - if (length < 128) - throw new E("tlv.decode(long): not minimal encoding"); - } - const v = data.subarray(pos, pos + length); - if (v.length !== length) - throw new E("tlv.decode: wrong value length"); - return { v, l: data.subarray(pos + length) }; - } - }, - // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag, - // since we always use positive integers here. It must always be empty: - // - add zero byte if exists - // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding) - _int: { - encode(num2) { - const { Err: E } = DER3; - if (num2 < _0n15) - throw new E("integer: negative integers are not allowed"); - let hex = numberToHexUnpadded3(num2); - if (Number.parseInt(hex[0], 16) & 8) - hex = "00" + hex; - if (hex.length & 1) - throw new E("unexpected DER parsing assertion: unpadded hex"); - return hex; - }, - decode(data) { - const { Err: E } = DER3; - if (data[0] & 128) - throw new E("invalid signature integer: negative"); - if (data[0] === 0 && !(data[1] & 128)) - throw new E("invalid signature integer: unnecessary leading zero"); - return bytesToNumberBE3(data); - } - }, - toSig(bytes) { - const { Err: E, _int: int, _tlv: tlv } = DER3; - const data = abytes4(bytes, void 0, "signature"); - const { v: seqBytes, l: seqLeftBytes } = tlv.decode(48, data); - if (seqLeftBytes.length) - throw new E("invalid signature: left bytes after parsing"); - const { v: rBytes, l: rLeftBytes } = tlv.decode(2, seqBytes); - const { v: sBytes, l: sLeftBytes } = tlv.decode(2, rLeftBytes); - if (sLeftBytes.length) - throw new E("invalid signature: left bytes after parsing"); - return { r: int.decode(rBytes), s: int.decode(sBytes) }; - }, - hexFromSig(sig) { - const { _tlv: tlv, _int: int } = DER3; - const rs = tlv.encode(2, int.encode(sig.r)); - const ss = tlv.encode(2, int.encode(sig.s)); - const seq = rs + ss; - return tlv.encode(48, seq); - } - }; - _0n15 = BigInt(0); - _1n15 = BigInt(1); - _2n9 = BigInt(2); - _3n6 = BigInt(3); - _4n6 = BigInt(4); - } -}); - -// node_modules/@noble/curves/secp256k1.js -function sqrtMod3(y) { - const P2 = secp256k1_CURVE.p; - const _3n7 = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22); - const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88); - const b2 = y * y * y % P2; - const b3 = b2 * b2 * y % P2; - const b6 = pow23(b3, _3n7, P2) * b3 % P2; - const b9 = pow23(b6, _3n7, P2) * b3 % P2; - const b11 = pow23(b9, _2n10, P2) * b2 % P2; - const b22 = pow23(b11, _11n, P2) * b11 % P2; - const b44 = pow23(b22, _22n, P2) * b22 % P2; - const b88 = pow23(b44, _44n, P2) * b44 % P2; - const b176 = pow23(b88, _88n, P2) * b88 % P2; - const b220 = pow23(b176, _44n, P2) * b44 % P2; - const b223 = pow23(b220, _3n7, P2) * b3 % P2; - const t1 = pow23(b223, _23n, P2) * b22 % P2; - const t2 = pow23(t1, _6n, P2) * b2 % P2; - const root = pow23(t2, _2n10, P2); - if (!Fpk13.eql(Fpk13.sqr(root), y)) - throw new Error("Cannot find square root"); - return root; -} -var secp256k1_CURVE, secp256k1_ENDO, _2n10, Fpk13, Pointk1, secp256k13; -var init_secp256k12 = __esm({ - "node_modules/@noble/curves/secp256k1.js"() { - "use strict"; - init_sha22(); - init_modular2(); - init_weierstrass2(); - secp256k1_CURVE = { - p: BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"), - n: BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"), - h: BigInt(1), - a: BigInt(0), - b: BigInt(7), - Gx: BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"), - Gy: BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") - }; - secp256k1_ENDO = { - beta: BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"), - basises: [ - [BigInt("0x3086d221a7d46bcde86c90e49284eb15"), -BigInt("0xe4437ed6010e88286f547fa90abfe4c3")], - [BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"), BigInt("0x3086d221a7d46bcde86c90e49284eb15")] - ] - }; - _2n10 = /* @__PURE__ */ BigInt(2); - Fpk13 = Field3(secp256k1_CURVE.p, { sqrt: sqrtMod3 }); - Pointk1 = /* @__PURE__ */ weierstrass3(secp256k1_CURVE, { - Fp: Fpk13, - endo: secp256k1_ENDO - }); - secp256k13 = /* @__PURE__ */ ecdsa(Pointk1, sha2564); - } -}); - -// node_modules/@scure/bip32/node_modules/@noble/hashes/utils.js -function isBytes6(a) { - return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; -} -function anumber4(n, title = "") { - if (!Number.isSafeInteger(n) || n < 0) { - const prefix = title && `"${title}" `; - throw new Error(`${prefix}expected integer >= 0, got ${n}`); - } -} -function abytes5(value, length, title = "") { - const bytes = isBytes6(value); - const len = value?.length; - const needsLen = length !== void 0; - if (!bytes || needsLen && len !== length) { - const prefix = title && `"${title}" `; - const ofLen = needsLen ? ` of length ${length}` : ""; - const got = bytes ? `length=${len}` : `type=${typeof value}`; - throw new Error(prefix + "expected Uint8Array" + ofLen + ", got " + got); - } - return value; -} -function ahash3(h) { - if (typeof h !== "function" || typeof h.create !== "function") - throw new Error("Hash must wrapped by utils.createHasher"); - anumber4(h.outputLen); - anumber4(h.blockLen); -} -function aexists3(instance, checkFinished = true) { - if (instance.destroyed) - throw new Error("Hash instance has been destroyed"); - if (checkFinished && instance.finished) - throw new Error("Hash#digest() has already been called"); -} -function aoutput3(out, instance) { - abytes5(out, void 0, "digestInto() output"); - const min = instance.outputLen; - if (out.length < min) { - throw new Error('"digestInto() output" expected to be of length >=' + min); - } -} -function clean3(...arrays) { - for (let i = 0; i < arrays.length; i++) { - arrays[i].fill(0); - } -} -function createView3(arr) { - return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); -} -function rotr3(word, shift) { - return word << 32 - shift | word >>> shift; -} -function rotl(word, shift) { - return word << shift | word >>> 32 - shift >>> 0; -} -function concatBytes6(...arrays) { - let sum = 0; - for (let i = 0; i < arrays.length; i++) { - const a = arrays[i]; - abytes5(a); - sum += a.length; - } - const res = new Uint8Array(sum); - for (let i = 0, pad4 = 0; i < arrays.length; i++) { - const a = arrays[i]; - res.set(a, pad4); - pad4 += a.length; - } - return res; -} -function createHasher4(hashCons, info = {}) { - const hashC = (msg, opts) => hashCons(opts).update(msg).digest(); - const tmp = hashCons(void 0); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = (opts) => hashCons(opts); - Object.assign(hashC, info); - return Object.freeze(hashC); -} -var oidNist2; -var init_utils8 = __esm({ - "node_modules/@scure/bip32/node_modules/@noble/hashes/utils.js"() { - "use strict"; - oidNist2 = (suffix) => ({ - oid: Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2, suffix]) - }); - } -}); - -// node_modules/@scure/bip32/node_modules/@noble/hashes/hmac.js -var _HMAC2, hmac3; -var init_hmac3 = __esm({ - "node_modules/@scure/bip32/node_modules/@noble/hashes/hmac.js"() { - "use strict"; - init_utils8(); - _HMAC2 = class { - oHash; - iHash; - blockLen; - outputLen; - finished = false; - destroyed = false; - constructor(hash3, key) { - ahash3(hash3); - abytes5(key, void 0, "key"); - this.iHash = hash3.create(); - if (typeof this.iHash.update !== "function") - throw new Error("Expected instance of class which extends utils.Hash"); - this.blockLen = this.iHash.blockLen; - this.outputLen = this.iHash.outputLen; - const blockLen = this.blockLen; - const pad4 = new Uint8Array(blockLen); - pad4.set(key.length > blockLen ? hash3.create().update(key).digest() : key); - for (let i = 0; i < pad4.length; i++) - pad4[i] ^= 54; - this.iHash.update(pad4); - this.oHash = hash3.create(); - for (let i = 0; i < pad4.length; i++) - pad4[i] ^= 54 ^ 92; - this.oHash.update(pad4); - clean3(pad4); - } - update(buf) { - aexists3(this); - this.iHash.update(buf); - return this; - } - digestInto(out) { - aexists3(this); - abytes5(out, this.outputLen, "output"); - this.finished = true; - this.iHash.digestInto(out); - this.oHash.update(out); - this.oHash.digestInto(out); - this.destroy(); - } - digest() { - const out = new Uint8Array(this.oHash.outputLen); - this.digestInto(out); - return out; - } - _cloneInto(to) { - to ||= Object.create(Object.getPrototypeOf(this), {}); - const { oHash, iHash, finished: finished2, destroyed, blockLen, outputLen } = this; - to = to; - to.finished = finished2; - to.destroyed = destroyed; - to.blockLen = blockLen; - to.outputLen = outputLen; - to.oHash = oHash._cloneInto(to.oHash); - to.iHash = iHash._cloneInto(to.iHash); - return to; - } - clone() { - return this._cloneInto(); - } - destroy() { - this.destroyed = true; - this.oHash.destroy(); - this.iHash.destroy(); - } - }; - hmac3 = (hash3, key, message) => new _HMAC2(hash3, key).update(message).digest(); - hmac3.create = (hash3, key) => new _HMAC2(hash3, key); - } -}); - -// node_modules/@scure/bip32/node_modules/@noble/hashes/_md.js -function Chi3(a, b, c2) { - return a & b ^ ~a & c2; -} -function Maj3(a, b, c2) { - return a & b ^ a & c2 ^ b & c2; -} -var HashMD3, SHA256_IV3, SHA512_IV3; -var init_md3 = __esm({ - "node_modules/@scure/bip32/node_modules/@noble/hashes/_md.js"() { - "use strict"; - init_utils8(); - HashMD3 = class { - blockLen; - outputLen; - padOffset; - isLE; - // For partial updates less than block size - buffer; - view; - finished = false; - length = 0; - pos = 0; - destroyed = false; - constructor(blockLen, outputLen, padOffset, isLE2) { - this.blockLen = blockLen; - this.outputLen = outputLen; - this.padOffset = padOffset; - this.isLE = isLE2; - this.buffer = new Uint8Array(blockLen); - this.view = createView3(this.buffer); - } - update(data) { - aexists3(this); - abytes5(data); - const { view, buffer: buffer2, blockLen } = this; - const len = data.length; - for (let pos = 0; pos < len; ) { - const take = Math.min(blockLen - this.pos, len - pos); - if (take === blockLen) { - const dataView = createView3(data); - for (; blockLen <= len - pos; pos += blockLen) - this.process(dataView, pos); - continue; - } - buffer2.set(data.subarray(pos, pos + take), this.pos); - this.pos += take; - pos += take; - if (this.pos === blockLen) { - this.process(view, 0); - this.pos = 0; - } - } - this.length += data.length; - this.roundClean(); - return this; - } - digestInto(out) { - aexists3(this); - aoutput3(out, this); - this.finished = true; - const { buffer: buffer2, view, blockLen, isLE: isLE2 } = this; - let { pos } = this; - buffer2[pos++] = 128; - clean3(this.buffer.subarray(pos)); - if (this.padOffset > blockLen - pos) { - this.process(view, 0); - pos = 0; - } - for (let i = pos; i < blockLen; i++) - buffer2[i] = 0; - view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE2); - this.process(view, 0); - const oview = createView3(out); - const len = this.outputLen; - if (len % 4) - throw new Error("_sha2: outputLen must be aligned to 32bit"); - const outLen = len / 4; - const state = this.get(); - if (outLen > state.length) - throw new Error("_sha2: outputLen bigger than state"); - for (let i = 0; i < outLen; i++) - oview.setUint32(4 * i, state[i], isLE2); - } - digest() { - const { buffer: buffer2, outputLen } = this; - this.digestInto(buffer2); - const res = buffer2.slice(0, outputLen); - this.destroy(); - return res; - } - _cloneInto(to) { - to ||= new this.constructor(); - to.set(...this.get()); - const { blockLen, buffer: buffer2, length, finished: finished2, destroyed, pos } = this; - to.destroyed = destroyed; - to.finished = finished2; - to.length = length; - to.pos = pos; - if (length % blockLen) - to.buffer.set(buffer2); - return to; - } - clone() { - return this._cloneInto(); - } - }; - SHA256_IV3 = /* @__PURE__ */ Uint32Array.from([ - 1779033703, - 3144134277, - 1013904242, - 2773480762, - 1359893119, - 2600822924, - 528734635, - 1541459225 - ]); - SHA512_IV3 = /* @__PURE__ */ Uint32Array.from([ - 1779033703, - 4089235720, - 3144134277, - 2227873595, - 1013904242, - 4271175723, - 2773480762, - 1595750129, - 1359893119, - 2917565137, - 2600822924, - 725511199, - 528734635, - 4215389547, - 1541459225, - 327033209 - ]); - } -}); - -// node_modules/@scure/bip32/node_modules/@noble/hashes/legacy.js -function ripemd_f(group, x, y, z) { - if (group === 0) - return x ^ y ^ z; - if (group === 1) - return x & y | ~x & z; - if (group === 2) - return (x | ~y) ^ z; - if (group === 3) - return x & z | y & ~z; - return x ^ (y | ~z); -} -var Rho160, Id160, Pi160, idxLR, idxL, idxR, shifts160, shiftsL160, shiftsR160, Kl160, Kr160, BUF_160, _RIPEMD160, ripemd160; -var init_legacy = __esm({ - "node_modules/@scure/bip32/node_modules/@noble/hashes/legacy.js"() { - "use strict"; - init_md3(); - init_utils8(); - Rho160 = /* @__PURE__ */ Uint8Array.from([ - 7, - 4, - 13, - 1, - 10, - 6, - 15, - 3, - 12, - 0, - 9, - 5, - 2, - 14, - 11, - 8 - ]); - Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))(); - Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))(); - idxLR = /* @__PURE__ */ (() => { - const L = [Id160]; - const R = [Pi160]; - const res = [L, R]; - for (let i = 0; i < 4; i++) - for (let j of res) - j.push(j[i].map((k) => Rho160[k])); - return res; - })(); - idxL = /* @__PURE__ */ (() => idxLR[0])(); - idxR = /* @__PURE__ */ (() => idxLR[1])(); - shifts160 = /* @__PURE__ */ [ - [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], - [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7], - [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9], - [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6], - [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5] - ].map((i) => Uint8Array.from(i)); - shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j])); - shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j])); - Kl160 = /* @__PURE__ */ Uint32Array.from([ - 0, - 1518500249, - 1859775393, - 2400959708, - 2840853838 - ]); - Kr160 = /* @__PURE__ */ Uint32Array.from([ - 1352829926, - 1548603684, - 1836072691, - 2053994217, - 0 - ]); - BUF_160 = /* @__PURE__ */ new Uint32Array(16); - _RIPEMD160 = class extends HashMD3 { - h0 = 1732584193 | 0; - h1 = 4023233417 | 0; - h2 = 2562383102 | 0; - h3 = 271733878 | 0; - h4 = 3285377520 | 0; - constructor() { - super(64, 20, 8, true); - } - get() { - const { h0, h1, h2, h3, h4 } = this; - return [h0, h1, h2, h3, h4]; - } - set(h0, h1, h2, h3, h4) { - this.h0 = h0 | 0; - this.h1 = h1 | 0; - this.h2 = h2 | 0; - this.h3 = h3 | 0; - this.h4 = h4 | 0; - } - process(view, offset) { - for (let i = 0; i < 16; i++, offset += 4) - BUF_160[i] = view.getUint32(offset, true); - let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el; - for (let group = 0; group < 5; group++) { - const rGroup = 4 - group; - const hbl = Kl160[group], hbr = Kr160[group]; - const rl = idxL[group], rr = idxR[group]; - const sl = shiftsL160[group], sr = shiftsR160[group]; - for (let i = 0; i < 16; i++) { - const tl = rotl(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el | 0; - al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; - } - for (let i = 0; i < 16; i++) { - const tr = rotl(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er | 0; - ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; - } - } - this.set(this.h1 + cl + dr | 0, this.h2 + dl + er | 0, this.h3 + el + ar | 0, this.h4 + al + br | 0, this.h0 + bl + cr | 0); - } - roundClean() { - clean3(BUF_160); - } - destroy() { - this.destroyed = true; - clean3(this.buffer); - this.set(0, 0, 0, 0, 0); - } - }; - ripemd160 = /* @__PURE__ */ createHasher4(() => new _RIPEMD160()); - } -}); - -// node_modules/@scure/bip32/node_modules/@noble/hashes/_u64.js -function fromBig2(n, le = false) { - if (le) - return { h: Number(n & U32_MASK642), l: Number(n >> _32n2 & U32_MASK642) }; - return { h: Number(n >> _32n2 & U32_MASK642) | 0, l: Number(n & U32_MASK642) | 0 }; -} -function split2(lst, le = false) { - const len = lst.length; - let Ah = new Uint32Array(len); - let Al = new Uint32Array(len); - for (let i = 0; i < len; i++) { - const { h, l: l2 } = fromBig2(lst[i], le); - [Ah[i], Al[i]] = [h, l2]; - } - return [Ah, Al]; -} -function add2(Ah, Al, Bh, Bl) { - const l2 = (Al >>> 0) + (Bl >>> 0); - return { h: Ah + Bh + (l2 / 2 ** 32 | 0) | 0, l: l2 | 0 }; -} -var U32_MASK642, _32n2, shrSH2, shrSL2, rotrSH2, rotrSL2, rotrBH2, rotrBL2, add3L2, add3H2, add4L2, add4H2, add5L2, add5H2; -var init_u642 = __esm({ - "node_modules/@scure/bip32/node_modules/@noble/hashes/_u64.js"() { - "use strict"; - U32_MASK642 = /* @__PURE__ */ BigInt(2 ** 32 - 1); - _32n2 = /* @__PURE__ */ BigInt(32); - shrSH2 = (h, _l, s3) => h >>> s3; - shrSL2 = (h, l2, s3) => h << 32 - s3 | l2 >>> s3; - rotrSH2 = (h, l2, s3) => h >>> s3 | l2 << 32 - s3; - rotrSL2 = (h, l2, s3) => h << 32 - s3 | l2 >>> s3; - rotrBH2 = (h, l2, s3) => h << 64 - s3 | l2 >>> s3 - 32; - rotrBL2 = (h, l2, s3) => h >>> s3 - 32 | l2 << 64 - s3; - add3L2 = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0); - add3H2 = (low, Ah, Bh, Ch) => Ah + Bh + Ch + (low / 2 ** 32 | 0) | 0; - add4L2 = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0); - add4H2 = (low, Ah, Bh, Ch, Dh) => Ah + Bh + Ch + Dh + (low / 2 ** 32 | 0) | 0; - add5L2 = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0); - add5H2 = (low, Ah, Bh, Ch, Dh, Eh) => Ah + Bh + Ch + Dh + Eh + (low / 2 ** 32 | 0) | 0; - } -}); - -// node_modules/@scure/bip32/node_modules/@noble/hashes/sha2.js -var SHA256_K3, SHA256_W3, SHA2_32B2, _SHA2562, K5122, SHA512_Kh2, SHA512_Kl2, SHA512_W_H2, SHA512_W_L2, SHA2_64B, _SHA512, sha2565, sha5122; -var init_sha23 = __esm({ - "node_modules/@scure/bip32/node_modules/@noble/hashes/sha2.js"() { - "use strict"; - init_md3(); - init_u642(); - init_utils8(); - SHA256_K3 = /* @__PURE__ */ Uint32Array.from([ - 1116352408, - 1899447441, - 3049323471, - 3921009573, - 961987163, - 1508970993, - 2453635748, - 2870763221, - 3624381080, - 310598401, - 607225278, - 1426881987, - 1925078388, - 2162078206, - 2614888103, - 3248222580, - 3835390401, - 4022224774, - 264347078, - 604807628, - 770255983, - 1249150122, - 1555081692, - 1996064986, - 2554220882, - 2821834349, - 2952996808, - 3210313671, - 3336571891, - 3584528711, - 113926993, - 338241895, - 666307205, - 773529912, - 1294757372, - 1396182291, - 1695183700, - 1986661051, - 2177026350, - 2456956037, - 2730485921, - 2820302411, - 3259730800, - 3345764771, - 3516065817, - 3600352804, - 4094571909, - 275423344, - 430227734, - 506948616, - 659060556, - 883997877, - 958139571, - 1322822218, - 1537002063, - 1747873779, - 1955562222, - 2024104815, - 2227730452, - 2361852424, - 2428436474, - 2756734187, - 3204031479, - 3329325298 - ]); - SHA256_W3 = /* @__PURE__ */ new Uint32Array(64); - SHA2_32B2 = class extends HashMD3 { - constructor(outputLen) { - super(64, outputLen, 8, false); - } - get() { - const { A, B, C, D: D2, E, F, G, H } = this; - return [A, B, C, D2, E, F, G, H]; - } - // prettier-ignore - set(A, B, C, D2, E, F, G, H) { - this.A = A | 0; - this.B = B | 0; - this.C = C | 0; - this.D = D2 | 0; - this.E = E | 0; - this.F = F | 0; - this.G = G | 0; - this.H = H | 0; - } - process(view, offset) { - for (let i = 0; i < 16; i++, offset += 4) - SHA256_W3[i] = view.getUint32(offset, false); - for (let i = 16; i < 64; i++) { - const W15 = SHA256_W3[i - 15]; - const W2 = SHA256_W3[i - 2]; - const s0 = rotr3(W15, 7) ^ rotr3(W15, 18) ^ W15 >>> 3; - const s1 = rotr3(W2, 17) ^ rotr3(W2, 19) ^ W2 >>> 10; - SHA256_W3[i] = s1 + SHA256_W3[i - 7] + s0 + SHA256_W3[i - 16] | 0; - } - let { A, B, C, D: D2, E, F, G, H } = this; - for (let i = 0; i < 64; i++) { - const sigma1 = rotr3(E, 6) ^ rotr3(E, 11) ^ rotr3(E, 25); - const T1 = H + sigma1 + Chi3(E, F, G) + SHA256_K3[i] + SHA256_W3[i] | 0; - const sigma0 = rotr3(A, 2) ^ rotr3(A, 13) ^ rotr3(A, 22); - const T2 = sigma0 + Maj3(A, B, C) | 0; - H = G; - G = F; - F = E; - E = D2 + T1 | 0; - D2 = C; - C = B; - B = A; - A = T1 + T2 | 0; - } - A = A + this.A | 0; - B = B + this.B | 0; - C = C + this.C | 0; - D2 = D2 + this.D | 0; - E = E + this.E | 0; - F = F + this.F | 0; - G = G + this.G | 0; - H = H + this.H | 0; - this.set(A, B, C, D2, E, F, G, H); - } - roundClean() { - clean3(SHA256_W3); - } - destroy() { - this.set(0, 0, 0, 0, 0, 0, 0, 0); - clean3(this.buffer); - } - }; - _SHA2562 = class extends SHA2_32B2 { - // We cannot use array here since array allows indexing by variable - // which means optimizer/compiler cannot use registers. - A = SHA256_IV3[0] | 0; - B = SHA256_IV3[1] | 0; - C = SHA256_IV3[2] | 0; - D = SHA256_IV3[3] | 0; - E = SHA256_IV3[4] | 0; - F = SHA256_IV3[5] | 0; - G = SHA256_IV3[6] | 0; - H = SHA256_IV3[7] | 0; - constructor() { - super(32); - } - }; - K5122 = /* @__PURE__ */ (() => split2([ - "0x428a2f98d728ae22", - "0x7137449123ef65cd", - "0xb5c0fbcfec4d3b2f", - "0xe9b5dba58189dbbc", - "0x3956c25bf348b538", - "0x59f111f1b605d019", - "0x923f82a4af194f9b", - "0xab1c5ed5da6d8118", - "0xd807aa98a3030242", - "0x12835b0145706fbe", - "0x243185be4ee4b28c", - "0x550c7dc3d5ffb4e2", - "0x72be5d74f27b896f", - "0x80deb1fe3b1696b1", - "0x9bdc06a725c71235", - "0xc19bf174cf692694", - "0xe49b69c19ef14ad2", - "0xefbe4786384f25e3", - "0x0fc19dc68b8cd5b5", - "0x240ca1cc77ac9c65", - "0x2de92c6f592b0275", - "0x4a7484aa6ea6e483", - "0x5cb0a9dcbd41fbd4", - "0x76f988da831153b5", - "0x983e5152ee66dfab", - "0xa831c66d2db43210", - "0xb00327c898fb213f", - "0xbf597fc7beef0ee4", - "0xc6e00bf33da88fc2", - "0xd5a79147930aa725", - "0x06ca6351e003826f", - "0x142929670a0e6e70", - "0x27b70a8546d22ffc", - "0x2e1b21385c26c926", - "0x4d2c6dfc5ac42aed", - "0x53380d139d95b3df", - "0x650a73548baf63de", - "0x766a0abb3c77b2a8", - "0x81c2c92e47edaee6", - "0x92722c851482353b", - "0xa2bfe8a14cf10364", - "0xa81a664bbc423001", - "0xc24b8b70d0f89791", - "0xc76c51a30654be30", - "0xd192e819d6ef5218", - "0xd69906245565a910", - "0xf40e35855771202a", - "0x106aa07032bbd1b8", - "0x19a4c116b8d2d0c8", - "0x1e376c085141ab53", - "0x2748774cdf8eeb99", - "0x34b0bcb5e19b48a8", - "0x391c0cb3c5c95a63", - "0x4ed8aa4ae3418acb", - "0x5b9cca4f7763e373", - "0x682e6ff3d6b2b8a3", - "0x748f82ee5defb2fc", - "0x78a5636f43172f60", - "0x84c87814a1f0ab72", - "0x8cc702081a6439ec", - "0x90befffa23631e28", - "0xa4506cebde82bde9", - "0xbef9a3f7b2c67915", - "0xc67178f2e372532b", - "0xca273eceea26619c", - "0xd186b8c721c0c207", - "0xeada7dd6cde0eb1e", - "0xf57d4f7fee6ed178", - "0x06f067aa72176fba", - "0x0a637dc5a2c898a6", - "0x113f9804bef90dae", - "0x1b710b35131c471b", - "0x28db77f523047d84", - "0x32caab7b40c72493", - "0x3c9ebe0a15c9bebc", - "0x431d67c49c100d4c", - "0x4cc5d4becb3e42b6", - "0x597f299cfc657e2a", - "0x5fcb6fab3ad6faec", - "0x6c44198c4a475817" - ].map((n) => BigInt(n))))(); - SHA512_Kh2 = /* @__PURE__ */ (() => K5122[0])(); - SHA512_Kl2 = /* @__PURE__ */ (() => K5122[1])(); - SHA512_W_H2 = /* @__PURE__ */ new Uint32Array(80); - SHA512_W_L2 = /* @__PURE__ */ new Uint32Array(80); - SHA2_64B = class extends HashMD3 { - constructor(outputLen) { - super(128, outputLen, 16, false); - } - // prettier-ignore - get() { - const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; - return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl]; - } - // prettier-ignore - set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) { - this.Ah = Ah | 0; - this.Al = Al | 0; - this.Bh = Bh | 0; - this.Bl = Bl | 0; - this.Ch = Ch | 0; - this.Cl = Cl | 0; - this.Dh = Dh | 0; - this.Dl = Dl | 0; - this.Eh = Eh | 0; - this.El = El | 0; - this.Fh = Fh | 0; - this.Fl = Fl | 0; - this.Gh = Gh | 0; - this.Gl = Gl | 0; - this.Hh = Hh | 0; - this.Hl = Hl | 0; - } - process(view, offset) { - for (let i = 0; i < 16; i++, offset += 4) { - SHA512_W_H2[i] = view.getUint32(offset); - SHA512_W_L2[i] = view.getUint32(offset += 4); - } - for (let i = 16; i < 80; i++) { - const W15h = SHA512_W_H2[i - 15] | 0; - const W15l = SHA512_W_L2[i - 15] | 0; - const s0h = rotrSH2(W15h, W15l, 1) ^ rotrSH2(W15h, W15l, 8) ^ shrSH2(W15h, W15l, 7); - const s0l = rotrSL2(W15h, W15l, 1) ^ rotrSL2(W15h, W15l, 8) ^ shrSL2(W15h, W15l, 7); - const W2h = SHA512_W_H2[i - 2] | 0; - const W2l = SHA512_W_L2[i - 2] | 0; - const s1h = rotrSH2(W2h, W2l, 19) ^ rotrBH2(W2h, W2l, 61) ^ shrSH2(W2h, W2l, 6); - const s1l = rotrSL2(W2h, W2l, 19) ^ rotrBL2(W2h, W2l, 61) ^ shrSL2(W2h, W2l, 6); - const SUMl = add4L2(s0l, s1l, SHA512_W_L2[i - 7], SHA512_W_L2[i - 16]); - const SUMh = add4H2(SUMl, s0h, s1h, SHA512_W_H2[i - 7], SHA512_W_H2[i - 16]); - SHA512_W_H2[i] = SUMh | 0; - SHA512_W_L2[i] = SUMl | 0; - } - let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; - for (let i = 0; i < 80; i++) { - const sigma1h = rotrSH2(Eh, El, 14) ^ rotrSH2(Eh, El, 18) ^ rotrBH2(Eh, El, 41); - const sigma1l = rotrSL2(Eh, El, 14) ^ rotrSL2(Eh, El, 18) ^ rotrBL2(Eh, El, 41); - const CHIh = Eh & Fh ^ ~Eh & Gh; - const CHIl = El & Fl ^ ~El & Gl; - const T1ll = add5L2(Hl, sigma1l, CHIl, SHA512_Kl2[i], SHA512_W_L2[i]); - const T1h = add5H2(T1ll, Hh, sigma1h, CHIh, SHA512_Kh2[i], SHA512_W_H2[i]); - const T1l = T1ll | 0; - const sigma0h = rotrSH2(Ah, Al, 28) ^ rotrBH2(Ah, Al, 34) ^ rotrBH2(Ah, Al, 39); - const sigma0l = rotrSL2(Ah, Al, 28) ^ rotrBL2(Ah, Al, 34) ^ rotrBL2(Ah, Al, 39); - const MAJh = Ah & Bh ^ Ah & Ch ^ Bh & Ch; - const MAJl = Al & Bl ^ Al & Cl ^ Bl & Cl; - Hh = Gh | 0; - Hl = Gl | 0; - Gh = Fh | 0; - Gl = Fl | 0; - Fh = Eh | 0; - Fl = El | 0; - ({ h: Eh, l: El } = add2(Dh | 0, Dl | 0, T1h | 0, T1l | 0)); - Dh = Ch | 0; - Dl = Cl | 0; - Ch = Bh | 0; - Cl = Bl | 0; - Bh = Ah | 0; - Bl = Al | 0; - const All = add3L2(T1l, sigma0l, MAJl); - Ah = add3H2(All, T1h, sigma0h, MAJh); - Al = All | 0; - } - ({ h: Ah, l: Al } = add2(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0)); - ({ h: Bh, l: Bl } = add2(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0)); - ({ h: Ch, l: Cl } = add2(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0)); - ({ h: Dh, l: Dl } = add2(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0)); - ({ h: Eh, l: El } = add2(this.Eh | 0, this.El | 0, Eh | 0, El | 0)); - ({ h: Fh, l: Fl } = add2(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0)); - ({ h: Gh, l: Gl } = add2(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0)); - ({ h: Hh, l: Hl } = add2(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0)); - this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl); - } - roundClean() { - clean3(SHA512_W_H2, SHA512_W_L2); - } - destroy() { - clean3(this.buffer); - this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - } - }; - _SHA512 = class extends SHA2_64B { - Ah = SHA512_IV3[0] | 0; - Al = SHA512_IV3[1] | 0; - Bh = SHA512_IV3[2] | 0; - Bl = SHA512_IV3[3] | 0; - Ch = SHA512_IV3[4] | 0; - Cl = SHA512_IV3[5] | 0; - Dh = SHA512_IV3[6] | 0; - Dl = SHA512_IV3[7] | 0; - Eh = SHA512_IV3[8] | 0; - El = SHA512_IV3[9] | 0; - Fh = SHA512_IV3[10] | 0; - Fl = SHA512_IV3[11] | 0; - Gh = SHA512_IV3[12] | 0; - Gl = SHA512_IV3[13] | 0; - Hh = SHA512_IV3[14] | 0; - Hl = SHA512_IV3[15] | 0; - constructor() { - super(64); - } - }; - sha2565 = /* @__PURE__ */ createHasher4( - () => new _SHA2562(), - /* @__PURE__ */ oidNist2(1) - ); - sha5122 = /* @__PURE__ */ createHasher4( - () => new _SHA512(), - /* @__PURE__ */ oidNist2(3) - ); - } -}); - -// node_modules/@scure/bip32/node_modules/@scure/base/index.js -function isBytes7(a) { - return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; -} -function isArrayOf2(isString, arr) { - if (!Array.isArray(arr)) - return false; - if (arr.length === 0) - return true; - if (isString) { - return arr.every((item) => typeof item === "string"); - } else { - return arr.every((item) => Number.isSafeInteger(item)); - } -} -function afn2(input) { - if (typeof input !== "function") - throw new Error("function expected"); - return true; -} -function astr2(label, input) { - if (typeof input !== "string") - throw new Error(`${label}: string expected`); - return true; -} -function anumber5(n) { - if (!Number.isSafeInteger(n)) - throw new Error(`invalid integer: ${n}`); -} -function aArr2(input) { - if (!Array.isArray(input)) - throw new Error("array expected"); -} -function astrArr2(label, input) { - if (!isArrayOf2(true, input)) - throw new Error(`${label}: array of strings expected`); -} -function anumArr2(label, input) { - if (!isArrayOf2(false, input)) - throw new Error(`${label}: array of numbers expected`); -} -// @__NO_SIDE_EFFECTS__ -function chain2(...args) { - const id = (a) => a; - const wrap3 = (a, b) => (c2) => a(b(c2)); - const encode4 = args.map((x) => x.encode).reduceRight(wrap3, id); - const decode2 = args.map((x) => x.decode).reduce(wrap3, id); - return { encode: encode4, decode: decode2 }; -} -// @__NO_SIDE_EFFECTS__ -function alphabet2(letters) { - const lettersA = typeof letters === "string" ? letters.split("") : letters; - const len = lettersA.length; - astrArr2("alphabet", lettersA); - const indexes = new Map(lettersA.map((l2, i) => [l2, i])); - return { - encode: (digits) => { - aArr2(digits); - return digits.map((i) => { - if (!Number.isSafeInteger(i) || i < 0 || i >= len) - throw new Error(`alphabet.encode: digit index outside alphabet "${i}". Allowed: ${letters}`); - return lettersA[i]; - }); - }, - decode: (input) => { - aArr2(input); - return input.map((letter) => { - astr2("alphabet.decode", letter); - const i = indexes.get(letter); - if (i === void 0) - throw new Error(`Unknown letter: "${letter}". Allowed: ${letters}`); - return i; - }); - } - }; -} -// @__NO_SIDE_EFFECTS__ -function join5(separator = "") { - astr2("join", separator); - return { - encode: (from14) => { - astrArr2("join.decode", from14); - return from14.join(separator); - }, - decode: (to) => { - astr2("join.decode", to); - return to.split(separator); - } - }; -} -function convertRadix3(data, from14, to) { - if (from14 < 2) - throw new Error(`convertRadix: invalid from=${from14}, base cannot be less than 2`); - if (to < 2) - throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`); - aArr2(data); - if (!data.length) - return []; - let pos = 0; - const res = []; - const digits = Array.from(data, (d) => { - anumber5(d); - if (d < 0 || d >= from14) - throw new Error(`invalid integer: ${d}`); - return d; - }); - const dlen = digits.length; - while (true) { - let carry = 0; - let done = true; - for (let i = pos; i < dlen; i++) { - const digit = digits[i]; - const fromCarry = from14 * carry; - const digitBase = fromCarry + digit; - if (!Number.isSafeInteger(digitBase) || fromCarry / from14 !== carry || digitBase - digit !== fromCarry) { - throw new Error("convertRadix: carry overflow"); - } - const div = digitBase / to; - carry = digitBase % to; - const rounded = Math.floor(div); - digits[i] = rounded; - if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase) - throw new Error("convertRadix: carry overflow"); - if (!done) - continue; - else if (!rounded) - pos = i; - else - done = false; - } - res.push(carry); - if (done) - break; - } - for (let i = 0; i < data.length - 1 && data[i] === 0; i++) - res.push(0); - return res.reverse(); -} -// @__NO_SIDE_EFFECTS__ -function radix3(num2) { - anumber5(num2); - const _256 = 2 ** 8; - return { - encode: (bytes) => { - if (!isBytes7(bytes)) - throw new Error("radix.encode input should be Uint8Array"); - return convertRadix3(Array.from(bytes), _256, num2); - }, - decode: (digits) => { - anumArr2("radix.decode", digits); - return Uint8Array.from(convertRadix3(digits, num2, _256)); - } - }; -} -function checksum4(len, fn) { - anumber5(len); - afn2(fn); - return { - encode(data) { - if (!isBytes7(data)) - throw new Error("checksum.encode: input should be Uint8Array"); - const sum = fn(data).slice(0, len); - const res = new Uint8Array(data.length + len); - res.set(data); - res.set(sum, data.length); - return res; - }, - decode(data) { - if (!isBytes7(data)) - throw new Error("checksum.decode: input should be Uint8Array"); - const payload = data.slice(0, -len); - const oldChecksum = data.slice(-len); - const newChecksum = fn(payload).slice(0, len); - for (let i = 0; i < len; i++) - if (newChecksum[i] !== oldChecksum[i]) - throw new Error("Invalid checksum"); - return payload; - } - }; -} -var genBase58, base58, createBase58check; -var init_base2 = __esm({ - "node_modules/@scure/bip32/node_modules/@scure/base/index.js"() { - "use strict"; - genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc) => /* @__PURE__ */ chain2(/* @__PURE__ */ radix3(58), /* @__PURE__ */ alphabet2(abc), /* @__PURE__ */ join5("")); - base58 = /* @__PURE__ */ genBase58("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"); - createBase58check = (sha2566) => /* @__PURE__ */ chain2(checksum4(4, (data) => sha2566(sha2566(data))), base58); - } -}); - -// node_modules/@scure/bip32/index.js -var Point2, Fn, base58check, MASTER_SECRET, BITCOIN_VERSIONS, HARDENED_OFFSET, hash160, fromU32, toU32, HDKey; -var init_bip32 = __esm({ - "node_modules/@scure/bip32/index.js"() { - "use strict"; - init_secp256k12(); - init_hmac3(); - init_legacy(); - init_sha23(); - init_utils8(); - init_base2(); - Point2 = secp256k13.Point; - ({ Fn } = Point2); - base58check = createBase58check(sha2565); - MASTER_SECRET = Uint8Array.from("Bitcoin seed".split(""), (char) => char.charCodeAt(0)); - BITCOIN_VERSIONS = { private: 76066276, public: 76067358 }; - HARDENED_OFFSET = 2147483648; - hash160 = (data) => ripemd160(sha2565(data)); - fromU32 = (data) => createView3(data).getUint32(0, false); - toU32 = (n) => { - if (!Number.isSafeInteger(n) || n < 0 || n > 2 ** 32 - 1) { - throw new Error("invalid number, should be from 0 to 2**32-1, got " + n); - } - const buf = new Uint8Array(4); - createView3(buf).setUint32(0, n, false); - return buf; - }; - HDKey = class _HDKey { - get fingerprint() { - if (!this.pubHash) { - throw new Error("No publicKey set!"); - } - return fromU32(this.pubHash); - } - get identifier() { - return this.pubHash; - } - get pubKeyHash() { - return this.pubHash; - } - get privateKey() { - return this._privateKey || null; - } - get publicKey() { - return this._publicKey || null; - } - get privateExtendedKey() { - const priv = this._privateKey; - if (!priv) { - throw new Error("No private key"); - } - return base58check.encode(this.serialize(this.versions.private, concatBytes6(Uint8Array.of(0), priv))); - } - get publicExtendedKey() { - if (!this._publicKey) { - throw new Error("No public key"); - } - return base58check.encode(this.serialize(this.versions.public, this._publicKey)); - } - static fromMasterSeed(seed, versions = BITCOIN_VERSIONS) { - abytes5(seed); - if (8 * seed.length < 128 || 8 * seed.length > 512) { - throw new Error("HDKey: seed length must be between 128 and 512 bits; 256 bits is advised, got " + seed.length); - } - const I = hmac3(sha5122, MASTER_SECRET, seed); - const privateKey = I.slice(0, 32); - const chainCode = I.slice(32); - return new _HDKey({ versions, chainCode, privateKey }); - } - static fromExtendedKey(base58key, versions = BITCOIN_VERSIONS) { - const keyBuffer = base58check.decode(base58key); - const keyView = createView3(keyBuffer); - const version4 = keyView.getUint32(0, false); - const opt = { - versions, - depth: keyBuffer[4], - parentFingerprint: keyView.getUint32(5, false), - index: keyView.getUint32(9, false), - chainCode: keyBuffer.slice(13, 45) - }; - const key = keyBuffer.slice(45); - const isPriv = key[0] === 0; - if (version4 !== versions[isPriv ? "private" : "public"]) { - throw new Error("Version mismatch"); - } - if (isPriv) { - return new _HDKey({ ...opt, privateKey: key.slice(1) }); - } else { - return new _HDKey({ ...opt, publicKey: key }); - } - } - static fromJSON(json) { - return _HDKey.fromExtendedKey(json.xpriv); - } - versions; - depth = 0; - index = 0; - chainCode = null; - parentFingerprint = 0; - _privateKey; - _publicKey; - pubHash; - constructor(opt) { - if (!opt || typeof opt !== "object") { - throw new Error("HDKey.constructor must not be called directly"); - } - this.versions = opt.versions || BITCOIN_VERSIONS; - this.depth = opt.depth || 0; - this.chainCode = opt.chainCode || null; - this.index = opt.index || 0; - this.parentFingerprint = opt.parentFingerprint || 0; - if (!this.depth) { - if (this.parentFingerprint || this.index) { - throw new Error("HDKey: zero depth with non-zero index/parent fingerprint"); - } - } - if (this.depth > 255) { - throw new Error("HDKey: depth exceeds the serializable value 255"); - } - if (opt.publicKey && opt.privateKey) { - throw new Error("HDKey: publicKey and privateKey at same time."); - } - if (opt.privateKey) { - if (!secp256k13.utils.isValidSecretKey(opt.privateKey)) - throw new Error("Invalid private key"); - this._privateKey = opt.privateKey; - this._publicKey = secp256k13.getPublicKey(opt.privateKey, true); - } else if (opt.publicKey) { - this._publicKey = Point2.fromBytes(opt.publicKey).toBytes(true); - } else { - throw new Error("HDKey: no public or private key provided"); - } - this.pubHash = hash160(this._publicKey); - } - derive(path) { - if (!/^[mM]'?/.test(path)) { - throw new Error('Path must start with "m" or "M"'); - } - if (/^[mM]'?$/.test(path)) { - return this; - } - const parts = path.replace(/^[mM]'?\//, "").split("/"); - let child = this; - for (const c2 of parts) { - const m = /^(\d+)('?)$/.exec(c2); - const m1 = m && m[1]; - if (!m || m.length !== 3 || typeof m1 !== "string") - throw new Error("invalid child index: " + c2); - let idx = +m1; - if (!Number.isSafeInteger(idx) || idx >= HARDENED_OFFSET) { - throw new Error("Invalid index"); - } - if (m[2] === "'") { - idx += HARDENED_OFFSET; - } - child = child.deriveChild(idx); - } - return child; - } - deriveChild(index2) { - if (!this._publicKey || !this.chainCode) { - throw new Error("No publicKey or chainCode set"); - } - let data = toU32(index2); - if (index2 >= HARDENED_OFFSET) { - const priv = this._privateKey; - if (!priv) { - throw new Error("Could not derive hardened child key"); - } - data = concatBytes6(Uint8Array.of(0), priv, data); - } else { - data = concatBytes6(this._publicKey, data); - } - const I = hmac3(sha5122, this.chainCode, data); - const childTweak = I.slice(0, 32); - const chainCode = I.slice(32); - if (!secp256k13.utils.isValidSecretKey(childTweak)) { - throw new Error("Tweak bigger than curve order"); - } - const opt = { - versions: this.versions, - chainCode, - depth: this.depth + 1, - parentFingerprint: this.fingerprint, - index: index2 - }; - const ctweak = Fn.fromBytes(childTweak); - try { - if (this._privateKey) { - const added = Fn.create(Fn.fromBytes(this._privateKey) + ctweak); - if (!Fn.isValidNot0(added)) { - throw new Error("The tweak was out of range or the resulted private key is invalid"); - } - opt.privateKey = Fn.toBytes(added); - } else { - const added = Point2.fromBytes(this._publicKey).add(Point2.BASE.multiply(ctweak)); - if (added.equals(Point2.ZERO)) { - throw new Error("The tweak was equal to negative P, which made the result key invalid"); - } - opt.publicKey = added.toBytes(true); - } - return new _HDKey(opt); - } catch (err) { - return this.deriveChild(index2 + 1); - } - } - sign(hash3) { - if (!this._privateKey) { - throw new Error("No privateKey set!"); - } - abytes5(hash3, 32); - return secp256k13.sign(hash3, this._privateKey, { prehash: false }); - } - verify(hash3, signature2) { - abytes5(hash3, 32); - abytes5(signature2, 64); - if (!this._publicKey) { - throw new Error("No publicKey set!"); - } - return secp256k13.verify(signature2, hash3, this._publicKey, { prehash: false }); - } - wipePrivateData() { - if (this._privateKey) { - this._privateKey.fill(0); - this._privateKey = void 0; - } - return this; - } - toJSON() { - return { - xpriv: this.privateExtendedKey, - xpub: this.publicExtendedKey - }; - } - serialize(version4, key) { - if (!this.chainCode) { - throw new Error("No chainCode set"); - } - abytes5(key, 33); - return concatBytes6(toU32(version4), new Uint8Array([this.depth]), toU32(this.parentFingerprint), toU32(this.index), this.chainCode, key); - } - }; - } -}); - -// node_modules/@solana/errors/dist/index.node.mjs -function encodeValue(value) { - if (Array.isArray(value)) { - const commaSeparatedValues = value.map(encodeValue).join( - "%2C%20" - /* ", " */ - ); - return "%5B" + commaSeparatedValues + /* "]" */ - "%5D"; - } else if (typeof value === "bigint") { - return `${value}n`; - } else { - return encodeURIComponent( - String( - value != null && Object.getPrototypeOf(value) === null ? ( - // Plain objects with no prototype don't have a `toString` method. - // Convert them before stringifying them. - { ...value } - ) : value - ) - ); - } -} -function encodeObjectContextEntry([key, value]) { - return `${key}=${encodeValue(value)}`; -} -function encodeContextObject(context) { - const searchParamsString = Object.entries(context).map(encodeObjectContextEntry).join("&"); - return Buffer.from(searchParamsString, "utf8").toString("base64"); -} -function getHumanReadableErrorMessage(code, context = {}) { - const messageFormatString = SolanaErrorMessages[code]; - if (messageFormatString.length === 0) { - return ""; - } - let state; - function commitStateUpTo(endIndex) { - if (state[TYPE] === 2) { - const variableName = messageFormatString.slice(state[START_INDEX] + 1, endIndex); - fragments.push( - variableName in context ? ( - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `${context[variableName]}` - ) : `$${variableName}` - ); - } else if (state[TYPE] === 1) { - fragments.push(messageFormatString.slice(state[START_INDEX], endIndex)); - } - } - const fragments = []; - messageFormatString.split("").forEach((char, ii) => { - if (ii === 0) { - state = { - [START_INDEX]: 0, - [TYPE]: messageFormatString[0] === "\\" ? 0 : messageFormatString[0] === "$" ? 2 : 1 - /* Text */ - }; - return; - } - let nextState; - switch (state[TYPE]) { - case 0: - nextState = { - [START_INDEX]: ii, - [TYPE]: 1 - /* Text */ - }; - break; - case 1: - if (char === "\\") { - nextState = { - [START_INDEX]: ii, - [TYPE]: 0 - /* EscapeSequence */ - }; - } else if (char === "$") { - nextState = { - [START_INDEX]: ii, - [TYPE]: 2 - /* Variable */ - }; - } - break; - case 2: - if (char === "\\") { - nextState = { - [START_INDEX]: ii, - [TYPE]: 0 - /* EscapeSequence */ - }; - } else if (char === "$") { - nextState = { - [START_INDEX]: ii, - [TYPE]: 2 - /* Variable */ - }; - } else if (!char.match(/\w/)) { - nextState = { - [START_INDEX]: ii, - [TYPE]: 1 - /* Text */ - }; - } - break; - } - if (nextState) { - if (state !== nextState) { - commitStateUpTo(ii); - } - state = nextState; - } - }); - commitStateUpTo(); - return fragments.join(""); -} -function getErrorMessage(code, context = {}) { - if (process.env.NODE_ENV !== "production") { - return getHumanReadableErrorMessage(code, context); - } else { - let decodingAdviceMessage = `Solana error #${code}; Decode this error by running \`npx @solana/errors decode -- ${code}`; - if (Object.keys(context).length) { - decodingAdviceMessage += ` '${encodeContextObject(context)}'`; - } - return `${decodingAdviceMessage}\``; - } -} -function isSolanaError(e7, code) { - const isSolanaError2 = e7 instanceof Error && e7.name === "SolanaError"; - if (isSolanaError2) { - if (code !== void 0) { - return e7.context.__code === code; - } - return true; - } - return false; -} -function safeCaptureStackTrace(...args) { - if ("captureStackTrace" in Error && typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(...args); - } -} -function getSolanaErrorFromRpcError({ errorCodeBaseOffset, getErrorContext, orderedErrorNames, rpcEnumError }, constructorOpt) { - let rpcErrorName; - let rpcErrorContext; - if (typeof rpcEnumError === "string") { - rpcErrorName = rpcEnumError; - } else { - rpcErrorName = Object.keys(rpcEnumError)[0]; - rpcErrorContext = rpcEnumError[rpcErrorName]; - } - const codeOffset = orderedErrorNames.indexOf(rpcErrorName); - const errorCode = errorCodeBaseOffset + codeOffset; - const errorContext = getErrorContext(errorCode, rpcErrorName, rpcErrorContext); - const err = new SolanaError(errorCode, errorContext); - safeCaptureStackTrace(err, constructorOpt); - return err; -} -function getSolanaErrorFromInstructionError(index2, instructionError) { - const numberIndex = Number(index2); - return getSolanaErrorFromRpcError( - { - errorCodeBaseOffset: 4615001, - getErrorContext(errorCode, rpcErrorName, rpcErrorContext) { - if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN) { - return { - errorName: rpcErrorName, - index: numberIndex, - ...rpcErrorContext !== void 0 ? { instructionErrorContext: rpcErrorContext } : null - }; - } else if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM) { - return { - code: Number(rpcErrorContext), - index: numberIndex - }; - } - return { index: numberIndex }; - }, - orderedErrorNames: ORDERED_ERROR_NAMES, - rpcEnumError: instructionError - }, - getSolanaErrorFromInstructionError - ); -} -function getSolanaErrorFromTransactionError(transactionError) { - if (typeof transactionError === "object" && "InstructionError" in transactionError) { - return getSolanaErrorFromInstructionError( - ...transactionError.InstructionError - ); - } - return getSolanaErrorFromRpcError( - { - errorCodeBaseOffset: 7050001, - getErrorContext(errorCode, rpcErrorName, rpcErrorContext) { - if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN) { - return { - errorName: rpcErrorName, - ...rpcErrorContext !== void 0 ? { transactionErrorContext: rpcErrorContext } : null - }; - } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION) { - return { - index: Number(rpcErrorContext) - }; - } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT || errorCode === SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED) { - return { - accountIndex: Number(rpcErrorContext.account_index) - }; - } - }, - orderedErrorNames: ORDERED_ERROR_NAMES2, - rpcEnumError: transactionError - }, - getSolanaErrorFromTransactionError - ); -} -function getSolanaErrorFromJsonRpcError(putativeErrorResponse) { - let out; - if (isRpcErrorResponse(putativeErrorResponse)) { - const { code: rawCode, data, message } = putativeErrorResponse; - const code = Number(rawCode); - if (code === SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE) { - const { err, ...preflightErrorContext } = data; - const causeObject = err ? { cause: getSolanaErrorFromTransactionError(err) } : null; - out = new SolanaError(SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, { - ...preflightErrorContext, - ...causeObject - }); - } else { - let errorContext; - switch (code) { - case SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR: - case SOLANA_ERROR__JSON_RPC__INVALID_PARAMS: - case SOLANA_ERROR__JSON_RPC__INVALID_REQUEST: - case SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND: - case SOLANA_ERROR__JSON_RPC__PARSE_ERROR: - case SOLANA_ERROR__JSON_RPC__SCAN_ERROR: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE: - case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION: - errorContext = { __serverMessage: message }; - break; - default: - if (typeof data === "object" && !Array.isArray(data)) { - errorContext = data; - } - } - out = new SolanaError(code, errorContext); - } - } else { - const message = typeof putativeErrorResponse === "object" && putativeErrorResponse !== null && "message" in putativeErrorResponse && typeof putativeErrorResponse.message === "string" ? putativeErrorResponse.message : "Malformed JSON-RPC error with no message attribute"; - out = new SolanaError(SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, { error: putativeErrorResponse, message }); - } - safeCaptureStackTrace(out, getSolanaErrorFromJsonRpcError); - return out; -} -function isRpcErrorResponse(value) { - return typeof value === "object" && value !== null && "code" in value && "message" in value && (typeof value.code === "number" || typeof value.code === "bigint") && typeof value.message === "string"; -} -function unwrapSimulationError(error) { - const simulationCodes = [ - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, - SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT - ]; - if (isSolanaError(error) && !!error.cause && simulationCodes.includes(error.context.__code)) { - return error.cause; - } - return error; -} -var SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, SOLANA_ERROR__INVALID_NONCE, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE, SOLANA_ERROR__MALFORMED_BIGINT_STRING, SOLANA_ERROR__MALFORMED_NUMBER_STRING, SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, SOLANA_ERROR__JSON_RPC__PARSE_ERROR, SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR, SOLANA_ERROR__JSON_RPC__INVALID_PARAMS, SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND, SOLANA_ERROR__JSON_RPC__INVALID_REQUEST, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH, SOLANA_ERROR__JSON_RPC__SCAN_ERROR, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS, SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY, SOLANA_ERROR__ADDRESSES__MALFORMED_PDA, SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE, SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED, SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER, SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS, SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT, SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY, SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN, SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL, SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS, SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID, SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED, SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT, SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION, SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID, SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND, SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE, SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT, SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID, SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH, SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT, SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC, SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION, SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE, SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE, SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE, SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE, SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY, SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER, SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW, SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR, SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS, SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS, SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE, SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH, SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO, SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY, SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME, SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME, SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING, SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING, SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING, SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING, SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE, SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES, SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT, SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT, SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE, SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED, SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP, SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX, SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION, SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE, SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS, SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT, SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED, SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED, SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE, SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND, SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH, SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH, SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH, SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_CONSTANT, SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE, SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, SOLANA_ERROR__RPC__INTEGER_OVERFLOW, SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING, SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE, SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING, SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, SolanaErrorMessages, START_INDEX, TYPE, SolanaError, ORDERED_ERROR_NAMES, ORDERED_ERROR_NAMES2; -var init_index_node = __esm({ - "node_modules/@solana/errors/dist/index.node.mjs"() { - "use strict"; - SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED = 1; - SOLANA_ERROR__INVALID_NONCE = 2; - SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND = 3; - SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE = 4; - SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH = 5; - SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE = 6; - SOLANA_ERROR__MALFORMED_BIGINT_STRING = 7; - SOLANA_ERROR__MALFORMED_NUMBER_STRING = 8; - SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE = 9; - SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR = 10; - SOLANA_ERROR__JSON_RPC__PARSE_ERROR = -32700; - SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR = -32603; - SOLANA_ERROR__JSON_RPC__INVALID_PARAMS = -32602; - SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND = -32601; - SOLANA_ERROR__JSON_RPC__INVALID_REQUEST = -32600; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE = -32019; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY = -32018; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE = -32017; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED = -32016; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION = -32015; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET = -32014; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH = -32013; - SOLANA_ERROR__JSON_RPC__SCAN_ERROR = -32012; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE = -32011; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX = -32010; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED = -32009; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT = -32008; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED = -32007; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE = -32006; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY = -32005; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE = -32004; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE = -32003; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE = -32002; - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP = -32001; - SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH = 28e5; - SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE = 2800001; - SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS = 2800002; - SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY = 2800003; - SOLANA_ERROR__ADDRESSES__MALFORMED_PDA = 2800004; - SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE = 2800005; - SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED = 2800006; - SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED = 2800007; - SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE = 2800008; - SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED = 2800009; - SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER = 2800010; - SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS = 2800011; - SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND = 323e4; - SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND = 32300001; - SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT = 3230002; - SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT = 3230003; - SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED = 3230004; - SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT = 361e4; - SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED = 3610001; - SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED = 3610002; - SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED = 3610003; - SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED = 3610004; - SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED = 3610005; - SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED = 3610006; - SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY = 3610007; - SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED = 3611e3; - SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH = 3704e3; - SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH = 3704001; - SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH = 3704002; - SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE = 3704003; - SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY = 3704004; - SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS = 4128e3; - SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA = 4128001; - SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH = 4128002; - SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN = 4615e3; - SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR = 4615001; - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT = 4615002; - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA = 4615003; - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA = 4615004; - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL = 4615005; - SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS = 4615006; - SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID = 4615007; - SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE = 4615008; - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED = 4615009; - SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT = 4615010; - SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION = 4615011; - SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID = 4615012; - SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND = 4615013; - SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED = 4615014; - SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE = 4615015; - SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED = 4615016; - SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX = 4615017; - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED = 4615018; - SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED = 4615019; - SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS = 4615020; - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED = 4615021; - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE = 4615022; - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED = 4615023; - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 4615024; - SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC = 4615025; - SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM = 4615026; - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR = 4615027; - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED = 4615028; - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE = 4615029; - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT = 4615030; - SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID = 4615031; - SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH = 4615032; - SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT = 4615033; - SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED = 4615034; - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED = 4615035; - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS = 4615036; - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC = 4615037; - SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED = 4615038; - SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION = 4615039; - SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE = 4615040; - SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE = 4615041; - SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE = 4615042; - SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE = 4615043; - SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY = 4615044; - SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR = 4615045; - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT = 4615046; - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER = 4615047; - SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW = 4615048; - SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR = 4615049; - SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER = 4615050; - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED = 4615051; - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED = 4615052; - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED = 4615053; - SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS = 4615054; - SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS = 5508e3; - SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER = 5508001; - SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER = 5508002; - SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER = 5508003; - SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER = 5508004; - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER = 5508005; - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER = 5508006; - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER = 5508007; - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER = 5508008; - SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS = 5508009; - SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING = 5508010; - SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED = 5508011; - SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED = 5607e3; - SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE = 5607001; - SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE = 5607002; - SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH = 5607003; - SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH = 5607004; - SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO = 5607005; - SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED = 5607006; - SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH = 5607007; - SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH = 5607008; - SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY = 5607009; - SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO = 5607010; - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING = 5607011; - SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH = 5607012; - SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE = 5607013; - SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION = 5607014; - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED = 5607015; - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE = 5607016; - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE = 5607017; - SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES = 5663e3; - SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE = 5663001; - SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME = 5663002; - SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME = 5663003; - SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE = 5663004; - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING = 5663005; - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE = 5663006; - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND = 5663007; - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING = 5663008; - SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING = 5663009; - SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING = 5663010; - SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING = 5663011; - SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING = 5663012; - SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING = 5663013; - SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE = 5663014; - SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION = 5663015; - SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES = 5663016; - SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH = 5663017; - SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT = 5663018; - SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT = 5663019; - SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT = 5663020; - SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED = 5663021; - SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE = 5663022; - SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN = 705e4; - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE = 7050001; - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE = 7050002; - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND = 7050003; - SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND = 7050004; - SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE = 7050005; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE = 7050006; - SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED = 7050007; - SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND = 7050008; - SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP = 7050009; - SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE = 7050010; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX = 7050011; - SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE = 7050012; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION = 7050013; - SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE = 7050014; - SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE = 7050015; - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 7050016; - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT = 7050017; - SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION = 7050018; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT = 7050019; - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT = 7050020; - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT = 7050021; - SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS = 7050022; - SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND = 7050023; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER = 7050024; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA = 7050025; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX = 7050026; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT = 7050027; - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT = 7050028; - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT = 7050029; - SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION = 7050030; - SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT = 7050031; - SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED = 7050032; - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT = 7050033; - SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED = 7050034; - SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED = 7050035; - SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION = 7050036; - SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN = 7618e3; - SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE = 7618001; - SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN = 7618002; - SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN = 7618003; - SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED = 7618004; - SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND = 7618005; - SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN = 7618006; - SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN = 7618007; - SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT = 7618008; - SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT = 7618009; - SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY = 8078e3; - SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH = 8078001; - SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH = 8078002; - SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH = 8078003; - SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH = 8078004; - SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH = 8078005; - SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH = 8078006; - SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS = 8078007; - SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE = 8078008; - SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT = 8078009; - SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT = 8078010; - SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE = 8078011; - SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE = 8078012; - SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH = 8078013; - SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE = 8078014; - SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT = 8078015; - SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE = 8078016; - SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE = 8078017; - SOLANA_ERROR__CODECS__INVALID_CONSTANT = 8078018; - SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE = 8078019; - SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL = 8078020; - SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES = 8078021; - SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS = 8078022; - SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY = 8078023; - SOLANA_ERROR__RPC__INTEGER_OVERFLOW = 81e5; - SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN = 8100001; - SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR = 8100002; - SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD = 8100003; - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN = 819e4; - SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID = 8190001; - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED = 8190002; - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED = 8190003; - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT = 8190004; - SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING = 99e5; - SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE = 9900001; - SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING = 9900002; - SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE = 9900003; - SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED = 9900004; - SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND = 9900005; - SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND = 9900006; - SolanaErrorMessages = { - [SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND]: "Account not found at address: $address", - [SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED]: "Not all accounts were decoded. Encoded accounts found at addresses: $addresses.", - [SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT]: "Expected decoded account at address: $address", - [SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT]: "Failed to decode account data at address: $address", - [SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND]: "Accounts not found at addresses: $addresses", - [SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED]: "Unable to find a viable program address bump seed.", - [SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS]: "$putativeAddress is not a base58-encoded address.", - [SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH]: "Expected base58 encoded address to decode to a byte array of length 32. Actual length: $actualLength.", - [SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY]: "The `CryptoKey` must be an `Ed25519` public key.", - [SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS]: "$putativeOffCurveAddress is not a base58-encoded off-curve address.", - [SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE]: "Invalid seeds; point must fall off the Ed25519 curve.", - [SOLANA_ERROR__ADDRESSES__MALFORMED_PDA]: "Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].", - [SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]: "A maximum of $maxSeeds seeds, including the bump seed, may be supplied when creating an address. Received: $actual.", - [SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED]: "The seed at index $index with length $actual exceeds the maximum length of $maxSeedLength bytes.", - [SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE]: "Expected program derived address bump to be in the range [0, 255], got: $bump.", - [SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER]: "Program address cannot end with PDA marker.", - [SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded address string of length in the range [32, 44]. Actual length: $actualLength.", - [SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded blockash string of length in the range [32, 44]. Actual length: $actualLength.", - [SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED]: "The network has progressed past the last block for which this transaction could have been committed.", - [SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY]: "Codec [$codecDescription] cannot decode empty byte arrays.", - [SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS]: "Enum codec cannot use lexical values [$stringValues] as discriminators. Either remove all lexical values or set `useValuesAsDiscriminators` to `false`.", - [SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL]: "Sentinel [$hexSentinel] must not be present in encoded bytes [$hexEncodedBytes].", - [SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH]: "Encoder and decoder must have the same fixed size, got [$encoderFixedSize] and [$decoderFixedSize].", - [SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH]: "Encoder and decoder must have the same max size, got [$encoderMaxSize] and [$decoderMaxSize].", - [SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH]: "Encoder and decoder must either both be fixed-size or variable-size.", - [SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE]: "Enum discriminator out of range. Expected a number in [$formattedValidDiscriminators], got $discriminator.", - [SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH]: "Expected a fixed-size codec, got a variable-size one.", - [SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH]: "Codec [$codecDescription] expected a positive byte length, got $bytesLength.", - [SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH]: "Expected a variable-size codec, got a fixed-size one.", - [SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE]: "Codec [$codecDescription] expected zero-value [$hexZeroValue] to have the same size as the provided fixed-size item [$expectedSize bytes].", - [SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH]: "Codec [$codecDescription] expected $expected bytes, got $bytesLength.", - [SOLANA_ERROR__CODECS__INVALID_CONSTANT]: "Expected byte array constant [$hexConstant] to be present in data [$hexData] at offset [$offset].", - [SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT]: "Invalid discriminated union variant. Expected one of [$variants], got $value.", - [SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT]: "Invalid enum variant. Expected one of [$stringValues] or a number in [$formattedNumericalValues], got $variant.", - [SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT]: "Invalid literal union variant. Expected one of [$variants], got $value.", - [SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS]: "Expected [$codecDescription] to have $expected items, got $actual.", - [SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE]: "Invalid value $value for base $base with alphabet $alphabet.", - [SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE]: "Literal union discriminator out of range. Expected a number between $minRange and $maxRange, got $discriminator.", - [SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE]: "Codec [$codecDescription] expected number to be in the range [$min, $max], got $value.", - [SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE]: "Codec [$codecDescription] expected offset to be in the range [0, $bytesLength], got $offset.", - [SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES]: "Expected sentinel [$hexSentinel] to be present in decoded bytes [$hexDecodedBytes].", - [SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE]: "Union variant out of range. Expected an index between $minRange and $maxRange, got $variant.", - [SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY]: "This decoder expected a byte array of exactly $expectedLength bytes, but $numExcessBytes unexpected excess bytes remained after decoding. Are you sure that you have chosen the correct decoder for this data?", - [SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED]: "No random values implementation could be found.", - [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED]: "instruction requires an uninitialized account", - [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED]: "instruction tries to borrow reference for an account which is already borrowed", - [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]: "instruction left account with an outstanding borrowed reference", - [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED]: "program other than the account's owner changed the size of the account data", - [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL]: "account data too small for instruction", - [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE]: "instruction expected an executable account", - [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT]: "An account does not have enough lamports to be rent-exempt", - [SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW]: "Program arithmetic overflowed", - [SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR]: "Failed to serialize or deserialize account data: $encodedData", - [SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS]: "Builtin programs must consume compute units", - [SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH]: "Cross-program invocation call depth too deep", - [SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED]: "Computational budget exceeded", - [SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM]: "custom program error: #$code", - [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX]: "instruction contains duplicate accounts", - [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC]: "instruction modifications of multiply-passed account differ", - [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT]: "executable accounts must be rent exempt", - [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED]: "instruction changed executable accounts data", - [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE]: "instruction changed the balance of an executable account", - [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED]: "instruction changed executable bit of an account", - [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED]: "instruction modified data of an account it does not own", - [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND]: "instruction spent from the balance of an account it does not own", - [SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR]: "generic instruction error", - [SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER]: "Provided owner is not allowed", - [SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE]: "Account is immutable", - [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY]: "Incorrect authority provided", - [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID]: "incorrect program id for instruction", - [SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS]: "insufficient funds for instruction", - [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA]: "invalid account data for instruction", - [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER]: "Invalid account owner", - [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT]: "invalid program argument", - [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR]: "program returned invalid error code", - [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA]: "invalid instruction data", - [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC]: "Failed to reallocate account data", - [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS]: "Provided seeds do not result in a valid address", - [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED]: "Accounts data allocations exceeded the maximum allowed per transaction", - [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED]: "Max accounts exceeded", - [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED]: "Max instruction trace length exceeded", - [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED]: "Length of the seed is too long for address generation", - [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT]: "An account required by the instruction is missing", - [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE]: "missing required signature for instruction", - [SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID]: "instruction illegally modified the program id of an account", - [SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS]: "insufficient account keys for instruction", - [SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION]: "Cross-program invocation with unauthorized signer or writable account", - [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE]: "Failed to create program execution environment", - [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE]: "Program failed to compile", - [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE]: "Program failed to complete", - [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED]: "instruction modified data of a read-only account", - [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE]: "instruction changed the balance of a read-only account", - [SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED]: "Cross-program invocation reentrancy not allowed for this instruction", - [SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED]: "instruction modified rent epoch of an account", - [SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION]: "sum of account balances before and after instruction do not match", - [SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT]: "instruction requires an initialized account", - [SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN]: "", - [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID]: "Unsupported program id", - [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR]: "Unsupported sysvar", - [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND]: "Invalid instruction plan kind: $kind.", - [SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN]: "The provided instruction plan is empty.", - [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND]: "No failed transaction plan result was found in the provided transaction plan result.", - [SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED]: "This transaction plan executor does not support non-divisible sequential plans. To support them, you may create your own executor such that multi-transaction atomicity is preserved \u2014 e.g. by targetting RPCs that support transaction bundles.", - [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN]: "The provided transaction plan failed to execute. See the `transactionPlanResult` attribute for more details. Note that the `cause` property is deprecated, and a future version will not set it.", - [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN]: "The provided message has insufficient capacity to accommodate the next instruction(s) in this plan. Expected at least $numBytesRequired free byte(s), got $numFreeBytes byte(s).", - [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND]: "Invalid transaction plan kind: $kind.", - [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE]: "No more instructions to pack; the message packer has completed the instruction plan.", - [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN]: "Unexpected instruction plan. Expected $expectedKind plan, got $actualKind plan.", - [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN]: "Unexpected transaction plan. Expected $expectedKind plan, got $actualKind plan.", - [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT]: "Unexpected transaction plan result. Expected $expectedKind plan, got $actualKind plan.", - [SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT]: "Expected a successful transaction plan result. I.e. there is at least one failed or cancelled transaction in the plan.", - [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS]: "The instruction does not have any accounts.", - [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA]: "The instruction does not have any data.", - [SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH]: "Expected instruction to have progress address $expectedProgramAddress, got $actualProgramAddress.", - [SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH]: "Expected base58 encoded blockhash to decode to a byte array of length 32. Actual length: $actualLength.", - [SOLANA_ERROR__INVALID_NONCE]: "The nonce `$expectedNonceValue` is no longer valid. It has advanced to `$actualNonceValue`", - [SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING]: "Invariant violation: Found no abortable iterable cache entry for key `$cacheKey`. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", - [SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED]: "Invariant violation: This data publisher does not publish to the channel named `$channelName`. Supported channels include $supportedChannelNames.", - [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE]: "Invariant violation: WebSocket message iterator state is corrupt; iterated without first resolving existing message promise. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", - [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING]: "Invariant violation: WebSocket message iterator is missing state storage. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", - [SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE]: "Invariant violation: Switch statement non-exhaustive. Received unexpected value `$unexpectedValue`. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", - [SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR]: "JSON-RPC error: Internal JSON-RPC error ($__serverMessage)", - [SOLANA_ERROR__JSON_RPC__INVALID_PARAMS]: "JSON-RPC error: Invalid method parameter(s) ($__serverMessage)", - [SOLANA_ERROR__JSON_RPC__INVALID_REQUEST]: "JSON-RPC error: The JSON sent is not a valid `Request` object ($__serverMessage)", - [SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND]: "JSON-RPC error: The method does not exist / is not available ($__serverMessage)", - [SOLANA_ERROR__JSON_RPC__PARSE_ERROR]: "JSON-RPC error: An error occurred on the server while parsing the JSON text ($__serverMessage)", - [SOLANA_ERROR__JSON_RPC__SCAN_ERROR]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE]: "Epoch rewards period still active at slot $slot", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE]: "Failed to query long-term storage; please try again", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED]: "Minimum context slot has not been reached", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY]: "Node is unhealthy; behind by $numSlotsBehind slots", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT]: "No snapshot", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE]: "Transaction simulation failed", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY]: "Rewards cannot be found because slot $slot is not the epoch boundary. This may be due to gap in the queried node's local ledger or long-term storage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE]: "Transaction history is not available from this node", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE]: "$__serverMessage", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH]: "Transaction signature length mismatch", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE]: "Transaction signature verification failure", - [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION]: "$__serverMessage", - [SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH]: "Key pair bytes must be of length 64, got $byteLength.", - [SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH]: "Expected private key bytes with length 32. Actual length: $actualLength.", - [SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH]: "Expected base58-encoded signature to decode to a byte array of length 64. Actual length: $actualLength.", - [SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY]: "The provided private key does not match the provided public key.", - [SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded signature string of length in the range [64, 88]. Actual length: $actualLength.", - [SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE]: "Lamports value must be in the range [0, 2e64-1]", - [SOLANA_ERROR__MALFORMED_BIGINT_STRING]: "`$value` cannot be parsed as a `BigInt`", - [SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: "$message", - [SOLANA_ERROR__MALFORMED_NUMBER_STRING]: "`$value` cannot be parsed as a `Number`", - [SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: "No nonce account could be found at address `$nonceAccountAddress`", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]: "Expected base58 encoded application domain to decode to a byte array of length 32. Actual length: $actualLength.", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE]: "Attempted to sign an offchain message with an address that is not a signer for it", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded application domain string of length in the range [32, 44]. Actual length: $actualLength.", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]: "The signer addresses in this offchain message envelope do not match the list of required signers in the message preamble. These unexpected signers were present in the envelope: `[$unexpectedSigners]`. These required signers were missing from the envelope `[$missingSigners]`.", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]: "The message body provided has a byte-length of $actualBytes. The maximum allowable byte-length is $maxBytes", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]: "Expected message format $expectedMessageFormat, got $actualMessageFormat", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]: "The message length specified in the message preamble is $specifiedLength bytes. The actual length of the message is $actualLength bytes.", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY]: "Offchain message content must be non-empty", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO]: "Offchain message must specify the address of at least one required signer", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO]: "Offchain message envelope must reserve space for at least one signature", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]: "The offchain message preamble specifies $numRequiredSignatures required signature(s), got $signaturesLength.", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED]: "The signatories of this offchain message must be listed in lexicographical order", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE]: "An address must be listed no more than once among the signatories of an offchain message", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]: "Offchain message is missing signatures for addresses: $addresses.", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE]: "Offchain message signature verification failed. Signature mismatch for required signatories [$signatoriesWithInvalidSignatures]. Missing signatures for signatories [$signatoriesWithMissingSignatures]", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE]: "The message body provided contains characters whose codes fall outside the allowed range. In order to ensure clear-signing compatiblity with hardware wallets, the message may only contain line feeds and characters in the range [\\x20-\\x7e].", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION]: "Expected offchain message version $expectedVersion. Got $actualVersion.", - [SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]: "This version of Kit does not support decoding offchain messages with version $unsupportedVersion. The current max supported version is 0.", - [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]: "The notification name must end in 'Notifications' and the API must supply a subscription plan creator function for the notification '$notificationName'.", - [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED]: "WebSocket was closed before payload could be added to the send buffer", - [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED]: "WebSocket connection closed", - [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT]: "WebSocket failed to connect", - [SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID]: "Failed to obtain a subscription id from the server", - [SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD]: "Could not find an API plan for RPC method: `$method`", - [SOLANA_ERROR__RPC__INTEGER_OVERFLOW]: "The $argumentLabel argument to the `$methodName` RPC method$optionalPathLabel was `$value`. This number is unsafe for use with the Solana JSON-RPC because it exceeds `Number.MAX_SAFE_INTEGER`.", - [SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR]: "HTTP error ($statusCode): $message", - [SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN]: "HTTP header(s) forbidden: $headers. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.", - [SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS]: "Multiple distinct signers were identified for address `$address`. Please ensure that you are using the same signer instance for each address.", - [SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER]: "The provided value does not implement the `KeyPairSigner` interface", - [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER]: "The provided value does not implement the `MessageModifyingSigner` interface", - [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER]: "The provided value does not implement the `MessagePartialSigner` interface", - [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER]: "The provided value does not implement any of the `MessageSigner` interfaces", - [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER]: "The provided value does not implement the `TransactionModifyingSigner` interface", - [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER]: "The provided value does not implement the `TransactionPartialSigner` interface", - [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER]: "The provided value does not implement the `TransactionSendingSigner` interface", - [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER]: "The provided value does not implement any of the `TransactionSigner` interfaces", - [SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS]: "More than one `TransactionSendingSigner` was identified.", - [SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING]: "No `TransactionSendingSigner` was identified. Please provide a valid `TransactionWithSingleSendingSigner` transaction.", - [SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED]: "Wallet account signers do not support signing multiple messages/transactions in a single operation", - [SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY]: "Cannot export a non-extractable key.", - [SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED]: "No digest implementation could be found.", - [SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT]: "Cryptographic operations are only allowed in secure browser contexts. Read more here: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts.", - [SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED]: "This runtime does not support the generation of Ed25519 key pairs.\n\nInstall @solana/webcrypto-ed25519-polyfill and call its `install` function before generating keys in environments that do not support Ed25519.\n\nFor a list of runtimes that currently support Ed25519 operations, visit https://github.com/WICG/webcrypto-secure-curves/issues/20.", - [SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED]: "No signature verification implementation could be found.", - [SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED]: "No key generation implementation could be found.", - [SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED]: "No signing implementation could be found.", - [SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED]: "No key export implementation could be found.", - [SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE]: "Timestamp value must be in the range [-(2n ** 63n), (2n ** 63n) - 1]. `$value` given", - [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]: "Transaction processing left an account with an outstanding borrowed reference", - [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE]: "Account in use", - [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE]: "Account loaded twice", - [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND]: "Attempt to debit an account but found no record of a prior credit.", - [SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND]: "Transaction loads an address table account that doesn't exist", - [SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED]: "This transaction has already been processed", - [SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND]: "Blockhash not found", - [SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP]: "Loader call chain is too deep", - [SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE]: "Transactions are currently disabled due to cluster maintenance", - [SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION]: "Transaction contains a duplicate instruction ($index) that is not allowed", - [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE]: "Insufficient funds for fee", - [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT]: "Transaction results in an account ($accountIndex) with insufficient funds for rent", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE]: "This account may not be used to pay transaction fees", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX]: "Transaction contains an invalid account reference", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA]: "Transaction loads an address table account with invalid data", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX]: "Transaction address table lookup uses an invalid index", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER]: "Transaction loads an address table account with an invalid owner", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT]: "LoadedAccountsDataSizeLimit set for transaction must be greater than 0.", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION]: "This program may not be used for executing instructions", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT]: "Transaction leaves an account with a lower balance than rent-exempt minimum", - [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT]: "Transaction loads a writable account that cannot be written", - [SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED]: "Transaction exceeded max loaded accounts data size cap", - [SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE]: "Transaction requires a fee but has no signature present", - [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND]: "Attempt to load a program that does not exist", - [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED]: "Execution of the program referenced by account at index $accountIndex is temporarily restricted.", - [SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED]: "ResanitizationNeeded", - [SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE]: "Transaction failed to sanitize accounts offsets correctly", - [SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE]: "Transaction did not pass signature verification", - [SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS]: "Transaction locked too many accounts", - [SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION]: "Sum of account balances before and after transaction do not match", - [SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN]: "The transaction failed with the error `$errorName`", - [SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION]: "Transaction version is unsupported", - [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT]: "Transaction would exceed account data limit within the block", - [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT]: "Transaction would exceed total account data limit", - [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT]: "Transaction would exceed max account limit within the block", - [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT]: "Transaction would exceed max Block Cost Limit", - [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT]: "Transaction would exceed max Vote Cost Limit", - [SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION]: "Attempted to sign a transaction with an address that is not a signer for it", - [SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING]: "Transaction is missing an address at index: $index.", - [SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES]: "Transaction has no expected signers therefore it cannot be encoded", - [SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT]: "Transaction size $transactionSize exceeds limit of $transactionSizeLimit bytes", - [SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME]: "Transaction does not have a blockhash lifetime", - [SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME]: "Transaction is not a durable nonce transaction", - [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING]: "Contents of these address lookup tables unknown: $lookupTableAddresses", - [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE]: "Lookup of address at index $highestRequestedIndex failed for lookup table `$lookupTableAddress`. Highest known index is $highestKnownIndex. The lookup table may have been extended since its contents were retrieved", - [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING]: "No fee payer set in CompiledTransaction", - [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND]: "Could not find program address at index $index", - [SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT]: "Failed to estimate the compute unit consumption for this transaction message. This is likely because simulating the transaction failed. Inspect the `cause` property of this error to learn more", - [SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT]: "Transaction failed when it was simulated in order to estimate the compute unit consumption. The compute unit estimate provided is for a transaction that failed when simulated and may not be representative of the compute units this transaction would consume if successful. Inspect the `cause` property of this error to learn more", - [SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING]: "Transaction is missing a fee payer.", - [SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING]: "Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer.", - [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE]: "Transaction first instruction is not advance nonce account instruction.", - [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING]: "Transaction with no instructions cannot be durable nonce transaction.", - [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES]: "This transaction includes an address (`$programAddress`) which is both invoked and set as the fee payer. Program addresses may not pay fees", - [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE]: "This transaction includes an address (`$programAddress`) which is both invoked and marked writable. Program addresses may not be writable", - [SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH]: "The transaction message expected the transaction to have $numRequiredSignatures signatures, got $signaturesLength.", - [SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING]: "Transaction is missing signatures for addresses: $addresses.", - [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE]: "Transaction version must be in the range [0, 127]. `$actualVersion` given", - [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED]: "This version of Kit does not support decoding transactions with version $unsupportedVersion. The current max supported version is 0.", - [SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE]: "The transaction has a durable nonce lifetime (with nonce `$nonce`), but the nonce account address is in a lookup table. The lifetime constraint cannot be constructed without fetching the lookup tables for the transaction." - }; - START_INDEX = "i"; - TYPE = "t"; - SolanaError = class extends Error { - /** - * Indicates the root cause of this {@link SolanaError}, if any. - * - * For example, a transaction error might have an instruction error as its root cause. In this - * case, you will be able to access the instruction error on the transaction error as `cause`. - */ - cause = this.cause; - /** - * Contains context that can assist in understanding or recovering from a {@link SolanaError}. - */ - context; - constructor(...[code, contextAndErrorOptions]) { - let context; - let errorOptions; - if (contextAndErrorOptions) { - Object.entries(Object.getOwnPropertyDescriptors(contextAndErrorOptions)).forEach(([name, descriptor]) => { - if (name === "cause") { - errorOptions = { cause: descriptor.value }; - } else { - if (context === void 0) { - context = { - __code: code - }; - } - Object.defineProperty(context, name, descriptor); - } - }); - } - const message = getErrorMessage(code, context); - super(message, errorOptions); - this.context = Object.freeze( - context === void 0 ? { - __code: code - } : context - ); - this.name = "SolanaError"; - } - }; - ORDERED_ERROR_NAMES = [ - // Keep synced with RPC source: https://github.com/anza-xyz/solana-sdk/blob/master/instruction-error/src/lib.rs - // If this list ever gets too large, consider implementing a compression strategy like this: - // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47 - "GenericError", - "InvalidArgument", - "InvalidInstructionData", - "InvalidAccountData", - "AccountDataTooSmall", - "InsufficientFunds", - "IncorrectProgramId", - "MissingRequiredSignature", - "AccountAlreadyInitialized", - "UninitializedAccount", - "UnbalancedInstruction", - "ModifiedProgramId", - "ExternalAccountLamportSpend", - "ExternalAccountDataModified", - "ReadonlyLamportChange", - "ReadonlyDataModified", - "DuplicateAccountIndex", - "ExecutableModified", - "RentEpochModified", - "NotEnoughAccountKeys", - "AccountDataSizeChanged", - "AccountNotExecutable", - "AccountBorrowFailed", - "AccountBorrowOutstanding", - "DuplicateAccountOutOfSync", - "Custom", - "InvalidError", - "ExecutableDataModified", - "ExecutableLamportChange", - "ExecutableAccountNotRentExempt", - "UnsupportedProgramId", - "CallDepth", - "MissingAccount", - "ReentrancyNotAllowed", - "MaxSeedLengthExceeded", - "InvalidSeeds", - "InvalidRealloc", - "ComputationalBudgetExceeded", - "PrivilegeEscalation", - "ProgramEnvironmentSetupFailure", - "ProgramFailedToComplete", - "ProgramFailedToCompile", - "Immutable", - "IncorrectAuthority", - "BorshIoError", - "AccountNotRentExempt", - "InvalidAccountOwner", - "ArithmeticOverflow", - "UnsupportedSysvar", - "IllegalOwner", - "MaxAccountsDataAllocationsExceeded", - "MaxAccountsExceeded", - "MaxInstructionTraceLengthExceeded", - "BuiltinProgramsMustConsumeComputeUnits" - ]; - ORDERED_ERROR_NAMES2 = [ - // Keep synced with RPC source: https://github.com/anza-xyz/agave/blob/master/sdk/src/transaction/error.rs - // If this list ever gets too large, consider implementing a compression strategy like this: - // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47 - "AccountInUse", - "AccountLoadedTwice", - "AccountNotFound", - "ProgramAccountNotFound", - "InsufficientFundsForFee", - "InvalidAccountForFee", - "AlreadyProcessed", - "BlockhashNotFound", - // `InstructionError` intentionally omitted; delegated to `getSolanaErrorFromInstructionError` - "CallChainTooDeep", - "MissingSignatureForFee", - "InvalidAccountIndex", - "SignatureFailure", - "InvalidProgramForExecution", - "SanitizeFailure", - "ClusterMaintenance", - "AccountBorrowOutstanding", - "WouldExceedMaxBlockCostLimit", - "UnsupportedVersion", - "InvalidWritableAccount", - "WouldExceedMaxAccountCostLimit", - "WouldExceedAccountDataBlockLimit", - "TooManyAccountLocks", - "AddressLookupTableNotFound", - "InvalidAddressLookupTableOwner", - "InvalidAddressLookupTableData", - "InvalidAddressLookupTableIndex", - "InvalidRentPayingAccount", - "WouldExceedMaxVoteCostLimit", - "WouldExceedAccountDataTotalLimit", - "DuplicateInstruction", - "InsufficientFundsForRent", - "MaxLoadedAccountsDataSizeExceeded", - "InvalidLoadedAccountsDataSizeLimit", - "ResanitizationNeeded", - "ProgramExecutionTemporarilyRestricted", - "UnbalancedTransaction" - ]; - } -}); - -// node_modules/@solana/codecs-core/dist/index.node.mjs -function padBytes2(bytes, length) { - if (bytes.length >= length) return bytes; - const paddedBytes = new Uint8Array(length).fill(0); - paddedBytes.set(bytes); - return paddedBytes; -} -function containsBytes(data, bytes, offset) { - const slice4 = offset === 0 && data.length === bytes.length ? data : data.slice(offset, offset + bytes.length); - return bytesEqual(slice4, bytes); -} -function bytesEqual(bytes1, bytes2) { - return bytes1.length === bytes2.length && bytes1.every((value, index2) => value === bytes2[index2]); -} -function getEncodedSize(value, encoder5) { - return "fixedSize" in encoder5 ? encoder5.fixedSize : encoder5.getSizeFromValue(value); -} -function createEncoder(encoder5) { - return Object.freeze({ - ...encoder5, - encode: (value) => { - const bytes = new Uint8Array(getEncodedSize(value, encoder5)); - encoder5.write(value, bytes, 0); - return bytes; - } - }); -} -function createDecoder(decoder2) { - return Object.freeze({ - ...decoder2, - decode: (bytes, offset = 0) => decoder2.read(bytes, offset)[0] - }); -} -function createCodec(codec) { - return Object.freeze({ - ...codec, - decode: (bytes, offset = 0) => codec.read(bytes, offset)[0], - encode: (value) => { - const bytes = new Uint8Array(getEncodedSize(value, codec)); - codec.write(value, bytes, 0); - return bytes; - } - }); -} -function isFixedSize(codec) { - return "fixedSize" in codec && typeof codec.fixedSize === "number"; -} -function assertIsFixedSize(codec) { - if (!isFixedSize(codec)) { - throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH); - } -} -function isVariableSize(codec) { - return !isFixedSize(codec); -} -function assertIsVariableSize(codec) { - if (!isVariableSize(codec)) { - throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH); - } -} -function combineCodec(encoder5, decoder2) { - if (isFixedSize(encoder5) !== isFixedSize(decoder2)) { - throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH); - } - if (isFixedSize(encoder5) && isFixedSize(decoder2) && encoder5.fixedSize !== decoder2.fixedSize) { - throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, { - decoderFixedSize: decoder2.fixedSize, - encoderFixedSize: encoder5.fixedSize - }); - } - if (!isFixedSize(encoder5) && !isFixedSize(decoder2) && encoder5.maxSize !== decoder2.maxSize) { - throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, { - decoderMaxSize: decoder2.maxSize, - encoderMaxSize: encoder5.maxSize - }); - } - return { - ...decoder2, - ...encoder5, - decode: decoder2.decode, - encode: encoder5.encode, - read: decoder2.read, - write: encoder5.write - }; -} -function addEncoderSentinel(encoder5, sentinel) { - const write = ((value, bytes, offset) => { - const encoderBytes = encoder5.encode(value); - if (findSentinelIndex(encoderBytes, sentinel) >= 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, { - encodedBytes: encoderBytes, - hexEncodedBytes: hexBytes(encoderBytes), - hexSentinel: hexBytes(sentinel), - sentinel - }); - } - bytes.set(encoderBytes, offset); - offset += encoderBytes.length; - bytes.set(sentinel, offset); - offset += sentinel.length; - return offset; - }); - if (isFixedSize(encoder5)) { - return createEncoder({ ...encoder5, fixedSize: encoder5.fixedSize + sentinel.length, write }); - } - return createEncoder({ - ...encoder5, - ...encoder5.maxSize != null ? { maxSize: encoder5.maxSize + sentinel.length } : {}, - getSizeFromValue: (value) => encoder5.getSizeFromValue(value) + sentinel.length, - write - }); -} -function addDecoderSentinel(decoder2, sentinel) { - const read = ((bytes, offset) => { - const candidateBytes = offset === 0 ? bytes : bytes.slice(offset); - const sentinelIndex = findSentinelIndex(candidateBytes, sentinel); - if (sentinelIndex === -1) { - throw new SolanaError(SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, { - decodedBytes: candidateBytes, - hexDecodedBytes: hexBytes(candidateBytes), - hexSentinel: hexBytes(sentinel), - sentinel - }); - } - const preSentinelBytes = candidateBytes.slice(0, sentinelIndex); - return [decoder2.decode(preSentinelBytes), offset + preSentinelBytes.length + sentinel.length]; - }); - if (isFixedSize(decoder2)) { - return createDecoder({ ...decoder2, fixedSize: decoder2.fixedSize + sentinel.length, read }); - } - return createDecoder({ - ...decoder2, - ...decoder2.maxSize != null ? { maxSize: decoder2.maxSize + sentinel.length } : {}, - read - }); -} -function addCodecSentinel(codec, sentinel) { - return combineCodec(addEncoderSentinel(codec, sentinel), addDecoderSentinel(codec, sentinel)); -} -function findSentinelIndex(bytes, sentinel) { - return bytes.findIndex((byte, index2, arr) => { - if (sentinel.length === 1) return byte === sentinel[0]; - return containsBytes(arr, sentinel, index2); - }); -} -function hexBytes(bytes) { - return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); -} -function assertByteArrayIsNotEmptyForCodec(codecDescription, bytes, offset = 0) { - if (bytes.length - offset <= 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, { - codecDescription - }); - } -} -function assertByteArrayHasEnoughBytesForCodec(codecDescription, expected, bytes, offset = 0) { - const bytesLength = bytes.length - offset; - if (bytesLength < expected) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, { - bytesLength, - codecDescription, - expected - }); - } -} -function assertByteArrayOffsetIsNotOutOfRange(codecDescription, offset, bytesLength) { - if (offset < 0 || offset > bytesLength) { - throw new SolanaError(SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, { - bytesLength, - codecDescription, - offset - }); - } -} -function addEncoderSizePrefix(encoder5, prefix) { - const write = ((value, bytes, offset) => { - const encoderBytes = encoder5.encode(value); - offset = prefix.write(encoderBytes.length, bytes, offset); - bytes.set(encoderBytes, offset); - return offset + encoderBytes.length; - }); - if (isFixedSize(prefix) && isFixedSize(encoder5)) { - return createEncoder({ ...encoder5, fixedSize: prefix.fixedSize + encoder5.fixedSize, write }); - } - const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : prefix.maxSize ?? null; - const encoderMaxSize = isFixedSize(encoder5) ? encoder5.fixedSize : encoder5.maxSize ?? null; - const maxSize = prefixMaxSize !== null && encoderMaxSize !== null ? prefixMaxSize + encoderMaxSize : null; - return createEncoder({ - ...encoder5, - ...maxSize !== null ? { maxSize } : {}, - getSizeFromValue: (value) => { - const encoderSize = getEncodedSize(value, encoder5); - return getEncodedSize(encoderSize, prefix) + encoderSize; - }, - write - }); -} -function addDecoderSizePrefix(decoder2, prefix) { - const read = ((bytes, offset) => { - const [bigintSize, decoderOffset] = prefix.read(bytes, offset); - const size5 = Number(bigintSize); - offset = decoderOffset; - if (offset > 0 || bytes.length > size5) { - bytes = bytes.slice(offset, offset + size5); - } - assertByteArrayHasEnoughBytesForCodec("addDecoderSizePrefix", size5, bytes); - return [decoder2.decode(bytes), offset + size5]; - }); - if (isFixedSize(prefix) && isFixedSize(decoder2)) { - return createDecoder({ ...decoder2, fixedSize: prefix.fixedSize + decoder2.fixedSize, read }); - } - const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : prefix.maxSize ?? null; - const decoderMaxSize = isFixedSize(decoder2) ? decoder2.fixedSize : decoder2.maxSize ?? null; - const maxSize = prefixMaxSize !== null && decoderMaxSize !== null ? prefixMaxSize + decoderMaxSize : null; - return createDecoder({ ...decoder2, ...maxSize !== null ? { maxSize } : {}, read }); -} -function addCodecSizePrefix(codec, prefix) { - return combineCodec(addEncoderSizePrefix(codec, prefix), addDecoderSizePrefix(codec, prefix)); -} -function toArrayBuffer(bytes, offset, length) { - const bytesOffset = bytes.byteOffset + (offset ?? 0); - const bytesLength = length ?? bytes.byteLength; - let buffer2; - if (typeof SharedArrayBuffer === "undefined") { - buffer2 = bytes.buffer; - } else if (bytes.buffer instanceof SharedArrayBuffer) { - buffer2 = new ArrayBuffer(bytes.length); - new Uint8Array(buffer2).set(new Uint8Array(bytes)); - } else { - buffer2 = bytes.buffer; - } - return (bytesOffset === 0 || bytesOffset === -bytes.byteLength) && bytesLength === bytes.byteLength ? buffer2 : buffer2.slice(bytesOffset, bytesOffset + bytesLength); -} -function createDecoderThatConsumesEntireByteArray(decoder2) { - return createDecoder({ - ...decoder2, - read(bytes, offset) { - const [value, newOffset] = decoder2.read(bytes, offset); - if (bytes.length > newOffset) { - throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, { - expectedLength: newOffset, - numExcessBytes: bytes.length - newOffset - }); - } - return [value, newOffset]; - } - }); -} -function fixEncoderSize(encoder5, fixedBytes) { - return createEncoder({ - fixedSize: fixedBytes, - write: (value, bytes, offset) => { - const variableByteArray = encoder5.encode(value); - const fixedByteArray = variableByteArray.length > fixedBytes ? variableByteArray.slice(0, fixedBytes) : variableByteArray; - bytes.set(fixedByteArray, offset); - return offset + fixedBytes; - } - }); -} -function fixDecoderSize(decoder2, fixedBytes) { - return createDecoder({ - fixedSize: fixedBytes, - read: (bytes, offset) => { - assertByteArrayHasEnoughBytesForCodec("fixCodecSize", fixedBytes, bytes, offset); - if (offset > 0 || bytes.length > fixedBytes) { - bytes = bytes.slice(offset, offset + fixedBytes); - } - if (isFixedSize(decoder2)) { - bytes = fixBytes(bytes, decoder2.fixedSize); - } - const [value] = decoder2.read(bytes, 0); - return [value, offset + fixedBytes]; - } - }); -} -function fixCodecSize(codec, fixedBytes) { - return combineCodec(fixEncoderSize(codec, fixedBytes), fixDecoderSize(codec, fixedBytes)); -} -function offsetEncoder(encoder5, config) { - return createEncoder({ - ...encoder5, - write: (value, bytes, preOffset) => { - const wrapBytes = (offset) => modulo(offset, bytes.length); - const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset; - assertByteArrayOffsetIsNotOutOfRange("offsetEncoder", newPreOffset, bytes.length); - const postOffset = encoder5.write(value, bytes, newPreOffset); - const newPostOffset = config.postOffset ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes }) : postOffset; - assertByteArrayOffsetIsNotOutOfRange("offsetEncoder", newPostOffset, bytes.length); - return newPostOffset; - } - }); -} -function offsetDecoder(decoder2, config) { - return createDecoder({ - ...decoder2, - read: (bytes, preOffset) => { - const wrapBytes = (offset) => modulo(offset, bytes.length); - const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset; - assertByteArrayOffsetIsNotOutOfRange("offsetDecoder", newPreOffset, bytes.length); - const [value, postOffset] = decoder2.read(bytes, newPreOffset); - const newPostOffset = config.postOffset ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes }) : postOffset; - assertByteArrayOffsetIsNotOutOfRange("offsetDecoder", newPostOffset, bytes.length); - return [value, newPostOffset]; - } - }); -} -function offsetCodec(codec, config) { - return combineCodec(offsetEncoder(codec, config), offsetDecoder(codec, config)); -} -function modulo(dividend, divisor) { - if (divisor === 0) return 0; - return (dividend % divisor + divisor) % divisor; -} -function resizeEncoder(encoder5, resize) { - if (isFixedSize(encoder5)) { - const fixedSize = resize(encoder5.fixedSize); - if (fixedSize < 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, { - bytesLength: fixedSize, - codecDescription: "resizeEncoder" - }); - } - return createEncoder({ ...encoder5, fixedSize }); - } - return createEncoder({ - ...encoder5, - getSizeFromValue: (value) => { - const newSize = resize(encoder5.getSizeFromValue(value)); - if (newSize < 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, { - bytesLength: newSize, - codecDescription: "resizeEncoder" - }); - } - return newSize; - } - }); -} -function resizeDecoder(decoder2, resize) { - if (isFixedSize(decoder2)) { - const fixedSize = resize(decoder2.fixedSize); - if (fixedSize < 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, { - bytesLength: fixedSize, - codecDescription: "resizeDecoder" - }); - } - return createDecoder({ ...decoder2, fixedSize }); - } - return decoder2; -} -function resizeCodec(codec, resize) { - return combineCodec(resizeEncoder(codec, resize), resizeDecoder(codec, resize)); -} -function padLeftEncoder(encoder5, offset) { - return offsetEncoder( - resizeEncoder(encoder5, (size5) => size5 + offset), - { preOffset: ({ preOffset }) => preOffset + offset } - ); -} -function padRightEncoder(encoder5, offset) { - return offsetEncoder( - resizeEncoder(encoder5, (size5) => size5 + offset), - { postOffset: ({ postOffset }) => postOffset + offset } - ); -} -function padLeftDecoder(decoder2, offset) { - return offsetDecoder( - resizeDecoder(decoder2, (size5) => size5 + offset), - { preOffset: ({ preOffset }) => preOffset + offset } - ); -} -function padRightDecoder(decoder2, offset) { - return offsetDecoder( - resizeDecoder(decoder2, (size5) => size5 + offset), - { postOffset: ({ postOffset }) => postOffset + offset } - ); -} -function padLeftCodec(codec, offset) { - return combineCodec(padLeftEncoder(codec, offset), padLeftDecoder(codec, offset)); -} -function padRightCodec(codec, offset) { - return combineCodec(padRightEncoder(codec, offset), padRightDecoder(codec, offset)); -} -function copySourceToTargetInReverse(source, target_WILL_MUTATE, sourceOffset, sourceLength, targetOffset = 0) { - while (sourceOffset < --sourceLength) { - const leftValue = source[sourceOffset]; - target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceLength]; - target_WILL_MUTATE[sourceLength + targetOffset] = leftValue; - sourceOffset++; - } - if (sourceOffset === sourceLength) { - target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceOffset]; - } -} -function reverseEncoder(encoder5) { - assertIsFixedSize(encoder5); - return createEncoder({ - ...encoder5, - write: (value, bytes, offset) => { - const newOffset = encoder5.write(value, bytes, offset); - copySourceToTargetInReverse( - bytes, - bytes, - offset, - offset + encoder5.fixedSize - ); - return newOffset; - } - }); -} -function reverseDecoder(decoder2) { - assertIsFixedSize(decoder2); - return createDecoder({ - ...decoder2, - read: (bytes, offset) => { - const reversedBytes = bytes.slice(); - copySourceToTargetInReverse( - bytes, - reversedBytes, - offset, - offset + decoder2.fixedSize - ); - return decoder2.read(reversedBytes, offset); - } - }); -} -function reverseCodec(codec) { - return combineCodec(reverseEncoder(codec), reverseDecoder(codec)); -} -function transformEncoder(encoder5, unmap) { - return createEncoder({ - ...isVariableSize(encoder5) ? { ...encoder5, getSizeFromValue: (value) => encoder5.getSizeFromValue(unmap(value)) } : encoder5, - write: (value, bytes, offset) => encoder5.write(unmap(value), bytes, offset) - }); -} -function transformDecoder(decoder2, map) { - return createDecoder({ - ...decoder2, - read: (bytes, offset) => { - const [value, newOffset] = decoder2.read(bytes, offset); - return [map(value, bytes, offset), newOffset]; - } - }); -} -function transformCodec(codec, unmap, map) { - return createCodec({ - ...transformEncoder(codec, unmap), - read: map ? transformDecoder(codec, map).read : codec.read - }); -} -var mergeBytes, fixBytes; -var init_index_node2 = __esm({ - "node_modules/@solana/codecs-core/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - mergeBytes = (byteArrays) => { - const nonEmptyByteArrays = byteArrays.filter((arr) => arr.length); - if (nonEmptyByteArrays.length === 0) { - return byteArrays.length ? byteArrays[0] : new Uint8Array(); - } - if (nonEmptyByteArrays.length === 1) { - return nonEmptyByteArrays[0]; - } - const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0); - const result = new Uint8Array(totalLength); - let offset = 0; - nonEmptyByteArrays.forEach((arr) => { - result.set(arr, offset); - offset += arr.length; - }); - return result; - }; - fixBytes = (bytes, length) => padBytes2(bytes.length <= length ? bytes : bytes.slice(0, length), length); - } -}); - -// node_modules/@solana/codecs-strings/dist/index.node.mjs -function assertValidBaseString(alphabet4, testValue, givenValue = testValue) { - if (!testValue.match(new RegExp(`^[${alphabet4}]*$`))) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { - alphabet: alphabet4, - base: alphabet4.length, - value: givenValue - }); - } -} -function partitionLeadingZeroes(value, zeroCharacter) { - const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`)); - return [leadingZeros, tailChars]; -} -function getBigIntFromBaseX(value, alphabet4) { - const base2 = BigInt(alphabet4.length); - let sum = 0n; - for (const char of value) { - sum *= base2; - sum += BigInt(alphabet4.indexOf(char)); - } - return sum; -} -function getBaseXFromBigInt(value, alphabet4) { - const base2 = BigInt(alphabet4.length); - const tailChars = []; - while (value > 0n) { - tailChars.unshift(alphabet4[Number(value % base2)]); - value /= base2; - } - return tailChars.join(""); -} -function charCodeToBase163(char) { - if (char >= 48 && char <= 57) return char - 48; - if (char >= 65 && char <= 70) return char - (65 - 10); - if (char >= 97 && char <= 102) return char - (97 - 10); -} -function reslice(input, inputBits, outputBits, useRemainder) { - const output = []; - let accumulator = 0; - let bitsInAccumulator = 0; - const mask = (1 << outputBits) - 1; - for (const value of input) { - accumulator = accumulator << inputBits | value; - bitsInAccumulator += inputBits; - while (bitsInAccumulator >= outputBits) { - bitsInAccumulator -= outputBits; - output.push(accumulator >> bitsInAccumulator & mask); - } - } - if (useRemainder && bitsInAccumulator > 0) { - output.push(accumulator << outputBits - bitsInAccumulator & mask); - } - return output; -} -var getBaseXEncoder, getBaseXDecoder, getBaseXCodec, alphabet3, getBase10Encoder, getBase10Decoder, getBase10Codec, INVALID_STRING_ERROR_BASE_CONFIG, getBase16Encoder, getBase16Decoder, getBase16Codec, alphabet22, getBase58Encoder, getBase58Decoder, getBase58Codec, getBaseXResliceEncoder, getBaseXResliceDecoder, getBaseXResliceCodec, alphabet32, getBase64Encoder, getBase64Decoder, getBase64Codec, removeNullCharacters, padNullCharacters, e, o, getUtf8Encoder, getUtf8Decoder, getUtf8Codec; -var init_index_node3 = __esm({ - "node_modules/@solana/codecs-strings/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node2(); - getBaseXEncoder = (alphabet4) => { - return createEncoder({ - getSizeFromValue: (value) => { - const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet4[0]); - if (!tailChars) return value.length; - const base10Number = getBigIntFromBaseX(tailChars, alphabet4); - return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2); - }, - write(value, bytes, offset) { - assertValidBaseString(alphabet4, value); - if (value === "") return offset; - const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet4[0]); - if (!tailChars) { - bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset); - return offset + leadingZeroes.length; - } - let base10Number = getBigIntFromBaseX(tailChars, alphabet4); - const tailBytes = []; - while (base10Number > 0n) { - tailBytes.unshift(Number(base10Number % 256n)); - base10Number /= 256n; - } - const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes]; - bytes.set(bytesToAdd, offset); - return offset + bytesToAdd.length; - } - }); - }; - getBaseXDecoder = (alphabet4) => { - return createDecoder({ - read(rawBytes, offset) { - const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset); - if (bytes.length === 0) return ["", 0]; - let trailIndex = bytes.findIndex((n) => n !== 0); - trailIndex = trailIndex === -1 ? bytes.length : trailIndex; - const leadingZeroes = alphabet4[0].repeat(trailIndex); - if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length]; - const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n); - const tailChars = getBaseXFromBigInt(base10Number, alphabet4); - return [leadingZeroes + tailChars, rawBytes.length]; - } - }); - }; - getBaseXCodec = (alphabet4) => combineCodec(getBaseXEncoder(alphabet4), getBaseXDecoder(alphabet4)); - alphabet3 = "0123456789"; - getBase10Encoder = () => getBaseXEncoder(alphabet3); - getBase10Decoder = () => getBaseXDecoder(alphabet3); - getBase10Codec = () => getBaseXCodec(alphabet3); - INVALID_STRING_ERROR_BASE_CONFIG = { - alphabet: "0123456789abcdef", - base: 16 - }; - getBase16Encoder = () => createEncoder({ - getSizeFromValue: (value) => Math.ceil(value.length / 2), - write(value, bytes, offset) { - const len = value.length; - const al = len / 2; - if (len === 1) { - const c2 = value.charCodeAt(0); - const n = charCodeToBase163(c2); - if (n === void 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { - ...INVALID_STRING_ERROR_BASE_CONFIG, - value - }); - } - bytes.set([n], offset); - return 1 + offset; - } - const hexBytes2 = new Uint8Array(al); - for (let i = 0, j = 0; i < al; i++) { - const c1 = value.charCodeAt(j++); - const c2 = value.charCodeAt(j++); - const n1 = charCodeToBase163(c1); - const n2 = charCodeToBase163(c2); - if (n1 === void 0 || n2 === void 0 && !Number.isNaN(c2)) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { - ...INVALID_STRING_ERROR_BASE_CONFIG, - value - }); - } - hexBytes2[i] = !Number.isNaN(c2) ? n1 << 4 | (n2 ?? 0) : n1; - } - bytes.set(hexBytes2, offset); - return hexBytes2.length + offset; - } - }); - getBase16Decoder = () => createDecoder({ - read(bytes, offset) { - const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); - return [value, bytes.length]; - } - }); - getBase16Codec = () => combineCodec(getBase16Encoder(), getBase16Decoder()); - alphabet22 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - getBase58Encoder = () => getBaseXEncoder(alphabet22); - getBase58Decoder = () => getBaseXDecoder(alphabet22); - getBase58Codec = () => getBaseXCodec(alphabet22); - getBaseXResliceEncoder = (alphabet4, bits) => createEncoder({ - getSizeFromValue: (value) => Math.floor(value.length * bits / 8), - write(value, bytes, offset) { - assertValidBaseString(alphabet4, value); - if (value === "") return offset; - const charIndices = [...value].map((c2) => alphabet4.indexOf(c2)); - const reslicedBytes = reslice(charIndices, bits, 8, false); - bytes.set(reslicedBytes, offset); - return reslicedBytes.length + offset; - } - }); - getBaseXResliceDecoder = (alphabet4, bits) => createDecoder({ - read(rawBytes, offset = 0) { - const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset); - if (bytes.length === 0) return ["", rawBytes.length]; - const charIndices = reslice([...bytes], 8, bits, true); - return [charIndices.map((i) => alphabet4[i]).join(""), rawBytes.length]; - } - }); - getBaseXResliceCodec = (alphabet4, bits) => combineCodec(getBaseXResliceEncoder(alphabet4, bits), getBaseXResliceDecoder(alphabet4, bits)); - alphabet32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - getBase64Encoder = () => { - { - return createEncoder({ - getSizeFromValue: (value) => Buffer.from(value, "base64").length, - write(value, bytes, offset) { - assertValidBaseString(alphabet32, value.replace(/=/g, "")); - const buffer2 = Buffer.from(value, "base64"); - bytes.set(buffer2, offset); - return buffer2.length + offset; - } - }); - } - }; - getBase64Decoder = () => { - { - return createDecoder({ - read: (bytes, offset = 0) => [Buffer.from(toArrayBuffer(bytes), offset).toString("base64"), bytes.length] - }); - } - }; - getBase64Codec = () => combineCodec(getBase64Encoder(), getBase64Decoder()); - removeNullCharacters = (value) => ( - // eslint-disable-next-line no-control-regex - value.replace(/\u0000/g, "") - ); - padNullCharacters = (value, chars) => value.padEnd(chars, "\0"); - e = globalThis.TextDecoder; - o = globalThis.TextEncoder; - getUtf8Encoder = () => { - let textEncoder; - return createEncoder({ - getSizeFromValue: (value) => (textEncoder ||= new o()).encode(value).length, - write: (value, bytes, offset) => { - const bytesToAdd = (textEncoder ||= new o()).encode(value); - bytes.set(bytesToAdd, offset); - return offset + bytesToAdd.length; - } - }); - }; - getUtf8Decoder = () => { - let textDecoder; - return createDecoder({ - read(bytes, offset) { - const value = (textDecoder ||= new e()).decode(bytes.slice(offset)); - return [removeNullCharacters(value), bytes.length]; - } - }); - }; - getUtf8Codec = () => combineCodec(getUtf8Encoder(), getUtf8Decoder()); - } -}); - -// node_modules/@solana/accounts/dist/index.node.mjs -function decodeAccount(encodedAccount, decoder2) { - try { - if ("exists" in encodedAccount && !encodedAccount.exists) { - return encodedAccount; - } - return Object.freeze({ ...encodedAccount, data: decoder2.decode(encodedAccount.data) }); - } catch { - throw new SolanaError(SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, { - address: encodedAccount.address - }); - } -} -function accountExists(account) { - return !("exists" in account) || "exists" in account && account.exists; -} -function assertAccountDecoded(account) { - if (accountExists(account) && account.data instanceof Uint8Array) { - throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, { - address: account.address - }); - } -} -function assertAccountsDecoded(accounts) { - const encoded = accounts.filter((a) => accountExists(a) && a.data instanceof Uint8Array); - if (encoded.length > 0) { - const encodedAddresses = encoded.map((a) => a.address); - throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, { - addresses: encodedAddresses - }); - } -} -function parseBase64RpcAccount(address2, rpcAccount) { - if (!rpcAccount) return Object.freeze({ address: address2, exists: false }); - const data = getBase64Encoder().encode(rpcAccount.data[0]); - return Object.freeze({ ...parseBaseAccount(rpcAccount), address: address2, data, exists: true }); -} -function parseBase58RpcAccount(address2, rpcAccount) { - if (!rpcAccount) return Object.freeze({ address: address2, exists: false }); - const data = getBase58Encoder().encode(typeof rpcAccount.data === "string" ? rpcAccount.data : rpcAccount.data[0]); - return Object.freeze({ ...parseBaseAccount(rpcAccount), address: address2, data, exists: true }); -} -function parseJsonRpcAccount(address2, rpcAccount) { - if (!rpcAccount) return Object.freeze({ address: address2, exists: false }); - const data = rpcAccount.data.parsed.info || {}; - if (rpcAccount.data.program || rpcAccount.data.parsed.type) { - data.parsedAccountMeta = { - program: rpcAccount.data.program, - type: rpcAccount.data.parsed.type - }; - } - return Object.freeze({ ...parseBaseAccount(rpcAccount), address: address2, data, exists: true }); -} -function parseBaseAccount(rpcAccount) { - return Object.freeze({ - executable: rpcAccount.executable, - lamports: rpcAccount.lamports, - programAddress: rpcAccount.owner, - space: rpcAccount.space - }); -} -async function fetchEncodedAccount(rpc, address2, config = {}) { - const { abortSignal, ...rpcConfig } = config; - const response = await rpc.getAccountInfo(address2, { ...rpcConfig, encoding: "base64" }).send({ abortSignal }); - return parseBase64RpcAccount(address2, response.value); -} -async function fetchJsonParsedAccount(rpc, address2, config = {}) { - const { abortSignal, ...rpcConfig } = config; - const { value: account } = await rpc.getAccountInfo(address2, { ...rpcConfig, encoding: "jsonParsed" }).send({ abortSignal }); - return !!account && typeof account === "object" && "parsed" in account.data ? parseJsonRpcAccount(address2, account) : parseBase64RpcAccount(address2, account); -} -async function fetchEncodedAccounts(rpc, addresses, config = {}) { - const { abortSignal, ...rpcConfig } = config; - const response = await rpc.getMultipleAccounts(addresses, { ...rpcConfig, encoding: "base64" }).send({ abortSignal }); - return response.value.map((account, index2) => parseBase64RpcAccount(addresses[index2], account)); -} -async function fetchJsonParsedAccounts(rpc, addresses, config = {}) { - const { abortSignal, ...rpcConfig } = config; - const response = await rpc.getMultipleAccounts(addresses, { ...rpcConfig, encoding: "jsonParsed" }).send({ abortSignal }); - return response.value.map((account, index2) => { - return !!account && typeof account === "object" && "parsed" in account.data ? parseJsonRpcAccount(addresses[index2], account) : parseBase64RpcAccount(addresses[index2], account); - }); -} -function assertAccountExists(account) { - if (!account.exists) { - throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, { address: account.address }); - } -} -function assertAccountsExist(accounts) { - const missingAccounts = accounts.filter((a) => !a.exists); - if (missingAccounts.length > 0) { - const missingAddresses = missingAccounts.map((a) => a.address); - throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, { addresses: missingAddresses }); - } -} -var BASE_ACCOUNT_SIZE; -var init_index_node4 = __esm({ - "node_modules/@solana/accounts/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node3(); - BASE_ACCOUNT_SIZE = 128; - } -}); - -// node_modules/@solana/assertions/dist/index.node.mjs -function assertPRNGIsAvailable() { - if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.getRandomValues !== "function") { - throw new SolanaError(SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED); - } -} -async function isEd25519CurveSupported(subtle) { - if (cachedEd25519Decision === void 0) { - cachedEd25519Decision = new Promise((resolve) => { - subtle.generateKey( - "Ed25519", - /* extractable */ - false, - ["sign", "verify"] - ).then(() => { - resolve(cachedEd25519Decision = true); - }).catch(() => { - resolve(cachedEd25519Decision = false); - }); - }); - } - if (typeof cachedEd25519Decision === "boolean") { - return cachedEd25519Decision; - } else { - return await cachedEd25519Decision; - } -} -function assertDigestCapabilityIsAvailable() { - if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.digest !== "function") { - throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED); - } -} -async function assertKeyGenerationIsAvailable() { - if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.generateKey !== "function") { - throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED); - } - if (!await isEd25519CurveSupported(globalThis.crypto.subtle)) { - throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED); - } -} -function assertKeyExporterIsAvailable() { - if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.exportKey !== "function") { - throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED); - } -} -function assertSigningCapabilityIsAvailable() { - if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.sign !== "function") { - throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED); - } -} -function assertVerificationCapabilityIsAvailable() { - if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.verify !== "function") { - throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED); - } -} -var cachedEd25519Decision; -var init_index_node5 = __esm({ - "node_modules/@solana/assertions/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - } -}); - -// node_modules/@solana/addresses/dist/index.node.mjs -function getMemoizedBase58Encoder() { - if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder(); - return memoizedBase58Encoder; -} -function getMemoizedBase58Decoder() { - if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder(); - return memoizedBase58Decoder; -} -function isAddress2(putativeAddress) { - if ( - // Lowest address (32 bytes of zeroes) - putativeAddress.length < 32 || // Highest address (32 bytes of 255) - putativeAddress.length > 44 - ) { - return false; - } - const base58Encoder2 = getMemoizedBase58Encoder(); - try { - return base58Encoder2.encode(putativeAddress).byteLength === 32; - } catch { - return false; - } -} -function assertIsAddress(putativeAddress) { - if ( - // Lowest address (32 bytes of zeroes) - putativeAddress.length < 32 || // Highest address (32 bytes of 255) - putativeAddress.length > 44 - ) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, { - actualLength: putativeAddress.length - }); - } - const base58Encoder2 = getMemoizedBase58Encoder(); - const bytes = base58Encoder2.encode(putativeAddress); - const numBytes = bytes.byteLength; - if (numBytes !== 32) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, { - actualLength: numBytes - }); - } -} -function address(putativeAddress) { - assertIsAddress(putativeAddress); - return putativeAddress; -} -function getAddressEncoder() { - return transformEncoder( - fixEncoderSize(getMemoizedBase58Encoder(), 32), - (putativeAddress) => address(putativeAddress) - ); -} -function getAddressDecoder() { - return fixDecoderSize(getMemoizedBase58Decoder(), 32); -} -function getAddressCodec() { - return combineCodec(getAddressEncoder(), getAddressDecoder()); -} -function getAddressComparator() { - return new Intl.Collator("en", { - caseFirst: "lower", - ignorePunctuation: false, - localeMatcher: "best fit", - numeric: false, - sensitivity: "variant", - usage: "sort" - }).compare; -} -function mod4(a) { - const r = a % P; - return r >= 0n ? r : P + r; -} -function pow24(x, power) { - let r = x; - while (power-- > 0n) { - r *= r; - r %= P; - } - return r; -} -function pow_2_252_3(x) { - const x2 = x * x % P; - const b2 = x2 * x % P; - const b4 = pow24(b2, 2n) * b2 % P; - const b5 = pow24(b4, 1n) * x % P; - const b10 = pow24(b5, 5n) * b5 % P; - const b20 = pow24(b10, 10n) * b10 % P; - const b40 = pow24(b20, 20n) * b20 % P; - const b80 = pow24(b40, 40n) * b40 % P; - const b160 = pow24(b80, 80n) * b80 % P; - const b240 = pow24(b160, 80n) * b80 % P; - const b250 = pow24(b240, 10n) * b10 % P; - const pow_p_5_8 = pow24(b250, 2n) * x % P; - return pow_p_5_8; -} -function uvRatio(u, v) { - const v3 = mod4(v * v * v); - const v7 = mod4(v3 * v3 * v); - const pow = pow_2_252_3(u * v7); - let x = mod4(u * v3 * pow); - const vx2 = mod4(v * x * x); - const root1 = x; - const root2 = mod4(x * RM1); - const useRoot1 = vx2 === u; - const useRoot2 = vx2 === mod4(-u); - const noRoot = vx2 === mod4(-u * RM1); - if (useRoot1) x = root1; - if (useRoot2 || noRoot) x = root2; - if ((mod4(x) & 1n) === 1n) x = mod4(-x); - if (!useRoot1 && !useRoot2) { - return null; - } - return x; -} -function pointIsOnCurve(y, lastByte) { - const y2 = mod4(y * y); - const u = mod4(y2 - 1n); - const v = mod4(D * y2 + 1n); - const x = uvRatio(u, v); - if (x === null) { - return false; - } - const isLastByteOdd = (lastByte & 128) !== 0; - if (x === 0n && isLastByteOdd) { - return false; - } - return true; -} -function byteToHex(byte) { - const hexString = byte.toString(16); - if (hexString.length === 1) { - return `0${hexString}`; - } else { - return hexString; - } -} -function decompressPointBytes(bytes) { - const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & -129 : byte)}${acc}`, ""); - const integerLiteralString = `0x${hexString}`; - return BigInt(integerLiteralString); -} -function compressedPointBytesAreOnCurve(bytes) { - if (bytes.byteLength !== 32) { - return false; - } - const y = decompressPointBytes(bytes); - return pointIsOnCurve(y, bytes[31]); -} -function isOffCurveAddress(putativeOffCurveAddress) { - const addressBytes = getAddressCodec().encode(putativeOffCurveAddress); - return compressedPointBytesAreOnCurve(addressBytes) === false; -} -function assertIsOffCurveAddress(putativeOffCurveAddress) { - if (!isOffCurveAddress(putativeOffCurveAddress)) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS); - } -} -function offCurveAddress(putativeOffCurveAddress) { - assertIsOffCurveAddress(putativeOffCurveAddress); - return putativeOffCurveAddress; -} -function isProgramDerivedAddress(value) { - return Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "number" && value[1] >= 0 && value[1] <= 255 && isAddress2(value[0]); -} -function assertIsProgramDerivedAddress(value) { - const validFormat = Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "number"; - if (!validFormat) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__MALFORMED_PDA); - } - if (value[1] < 0 || value[1] > 255) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, { - bump: value[1] - }); - } - assertIsAddress(value[0]); -} -async function createProgramDerivedAddress({ programAddress, seeds }) { - assertDigestCapabilityIsAvailable(); - if (seeds.length > MAX_SEEDS) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, { - actual: seeds.length, - maxSeeds: MAX_SEEDS - }); - } - let textEncoder; - const seedBytes = seeds.reduce((acc, seed, ii) => { - const bytes = typeof seed === "string" ? (textEncoder ||= new TextEncoder()).encode(seed) : seed; - if (bytes.byteLength > MAX_SEED_LENGTH) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, { - actual: bytes.byteLength, - index: ii, - maxSeedLength: MAX_SEED_LENGTH - }); - } - acc.push(...bytes); - return acc; - }, []); - const base58EncodedAddressCodec = getAddressCodec(); - const programAddressBytes = base58EncodedAddressCodec.encode(programAddress); - const addressBytesBuffer = await crypto.subtle.digest( - "SHA-256", - new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES]) - ); - const addressBytes = new Uint8Array(addressBytesBuffer); - if (compressedPointBytesAreOnCurve(addressBytes)) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE); - } - return base58EncodedAddressCodec.decode(addressBytes); -} -async function getProgramDerivedAddress({ - programAddress, - seeds -}) { - let bumpSeed = 255; - while (bumpSeed > 0) { - try { - const address2 = await createProgramDerivedAddress({ - programAddress, - seeds: [...seeds, new Uint8Array([bumpSeed])] - }); - return [address2, bumpSeed]; - } catch (e7) { - if (isSolanaError(e7, SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE)) { - bumpSeed--; - } else { - throw e7; - } - } - } - throw new SolanaError(SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED); -} -async function createAddressWithSeed({ baseAddress, programAddress, seed }) { - const { encode: encode4, decode: decode2 } = getAddressCodec(); - const seedBytes = typeof seed === "string" ? new TextEncoder().encode(seed) : seed; - if (seedBytes.byteLength > MAX_SEED_LENGTH) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, { - actual: seedBytes.byteLength, - index: 0, - maxSeedLength: MAX_SEED_LENGTH - }); - } - const programAddressBytes = encode4(programAddress); - if (programAddressBytes.length >= PDA_MARKER_BYTES.length && bytesEqual(programAddressBytes.slice(-PDA_MARKER_BYTES.length), new Uint8Array(PDA_MARKER_BYTES))) { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER); - } - const addressBytesBuffer = await crypto.subtle.digest( - "SHA-256", - new Uint8Array([...encode4(baseAddress), ...seedBytes, ...programAddressBytes]) - ); - const addressBytes = new Uint8Array(addressBytesBuffer); - return decode2(addressBytes); -} -async function getAddressFromPublicKey(publicKey) { - assertKeyExporterIsAvailable(); - if (publicKey.type !== "public" || publicKey.algorithm.name !== "Ed25519") { - throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY); - } - const publicKeyBytes = await crypto.subtle.exportKey("raw", publicKey); - return getAddressDecoder().decode(new Uint8Array(publicKeyBytes)); -} -async function getPublicKeyFromAddress(address2) { - const addressBytes = getAddressEncoder().encode(address2); - return await crypto.subtle.importKey("raw", addressBytes, { name: "Ed25519" }, true, ["verify"]); -} -var memoizedBase58Encoder, memoizedBase58Decoder, D, P, RM1, MAX_SEED_LENGTH, MAX_SEEDS, PDA_MARKER_BYTES; -var init_index_node6 = __esm({ - "node_modules/@solana/addresses/dist/index.node.mjs"() { - "use strict"; - init_index_node2(); - init_index_node3(); - init_index_node(); - init_index_node5(); - D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n; - P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; - RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; - MAX_SEED_LENGTH = 32; - MAX_SEEDS = 16; - PDA_MARKER_BYTES = [ - // The string 'ProgramDerivedAddress' - 80, - 114, - 111, - 103, - 114, - 97, - 109, - 68, - 101, - 114, - 105, - 118, - 101, - 100, - 65, - 100, - 100, - 114, - 101, - 115, - 115 - ]; - } -}); - -// node_modules/@solana/codecs-numbers/dist/index.node.mjs -function assertNumberIsBetweenForCodec(codecDescription, min, max, value) { - if (value < min || value > max) { - throw new SolanaError(SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, { - codecDescription, - max, - min, - value - }); - } -} -function isLittleEndian(config) { - return config?.endian === 1 ? false : true; -} -function numberEncoderFactory(input) { - return createEncoder({ - fixedSize: input.size, - write(value, bytes, offset) { - if (input.range) { - assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value); - } - const arrayBuffer = new ArrayBuffer(input.size); - input.set(new DataView(arrayBuffer), value, isLittleEndian(input.config)); - bytes.set(new Uint8Array(arrayBuffer), offset); - return offset + input.size; - } - }); -} -function numberDecoderFactory(input) { - return createDecoder({ - fixedSize: input.size, - read(bytes, offset = 0) { - assertByteArrayIsNotEmptyForCodec(input.name, bytes, offset); - assertByteArrayHasEnoughBytesForCodec(input.name, input.size, bytes, offset); - const view = new DataView(toArrayBuffer(bytes, offset, input.size)); - return [input.get(view, isLittleEndian(input.config)), offset + input.size]; - } - }); -} -var Endian, getF32Encoder, getF32Decoder, getF32Codec, getF64Encoder, getF64Decoder, getF64Codec, getI128Encoder, getI128Decoder, getI128Codec, getI16Encoder, getI16Decoder, getI16Codec, getI32Encoder, getI32Decoder, getI32Codec, getI64Encoder, getI64Decoder, getI64Codec, getI8Encoder, getI8Decoder, getI8Codec, getShortU16Encoder, getShortU16Decoder, getShortU16Codec, getU128Encoder, getU128Decoder, getU128Codec, getU16Encoder, getU16Decoder, getU16Codec, getU32Encoder, getU32Decoder, getU32Codec, getU64Encoder, getU64Decoder, getU64Codec, getU8Encoder, getU8Decoder, getU8Codec; -var init_index_node7 = __esm({ - "node_modules/@solana/codecs-numbers/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node2(); - Endian = /* @__PURE__ */ ((Endian2) => { - Endian2[Endian2["Little"] = 0] = "Little"; - Endian2[Endian2["Big"] = 1] = "Big"; - return Endian2; - })(Endian || {}); - getF32Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "f32", - set: (view, value, le) => view.setFloat32(0, Number(value), le), - size: 4 - }); - getF32Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getFloat32(0, le), - name: "f32", - size: 4 - }); - getF32Codec = (config = {}) => combineCodec(getF32Encoder(config), getF32Decoder(config)); - getF64Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "f64", - set: (view, value, le) => view.setFloat64(0, Number(value), le), - size: 8 - }); - getF64Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getFloat64(0, le), - name: "f64", - size: 8 - }); - getF64Codec = (config = {}) => combineCodec(getF64Encoder(config), getF64Decoder(config)); - getI128Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "i128", - range: [-BigInt("0x7fffffffffffffffffffffffffffffff") - 1n, BigInt("0x7fffffffffffffffffffffffffffffff")], - set: (view, value, le) => { - const leftOffset = le ? 8 : 0; - const rightOffset = le ? 0 : 8; - const rightMask = 0xffffffffffffffffn; - view.setBigInt64(leftOffset, BigInt(value) >> 64n, le); - view.setBigUint64(rightOffset, BigInt(value) & rightMask, le); - }, - size: 16 - }); - getI128Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => { - const leftOffset = le ? 8 : 0; - const rightOffset = le ? 0 : 8; - const left = view.getBigInt64(leftOffset, le); - const right = view.getBigUint64(rightOffset, le); - return (left << 64n) + right; - }, - name: "i128", - size: 16 - }); - getI128Codec = (config = {}) => combineCodec(getI128Encoder(config), getI128Decoder(config)); - getI16Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "i16", - range: [-Number("0x7fff") - 1, Number("0x7fff")], - set: (view, value, le) => view.setInt16(0, Number(value), le), - size: 2 - }); - getI16Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getInt16(0, le), - name: "i16", - size: 2 - }); - getI16Codec = (config = {}) => combineCodec(getI16Encoder(config), getI16Decoder(config)); - getI32Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "i32", - range: [-Number("0x7fffffff") - 1, Number("0x7fffffff")], - set: (view, value, le) => view.setInt32(0, Number(value), le), - size: 4 - }); - getI32Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getInt32(0, le), - name: "i32", - size: 4 - }); - getI32Codec = (config = {}) => combineCodec(getI32Encoder(config), getI32Decoder(config)); - getI64Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "i64", - range: [-BigInt("0x7fffffffffffffff") - 1n, BigInt("0x7fffffffffffffff")], - set: (view, value, le) => view.setBigInt64(0, BigInt(value), le), - size: 8 - }); - getI64Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getBigInt64(0, le), - name: "i64", - size: 8 - }); - getI64Codec = (config = {}) => combineCodec(getI64Encoder(config), getI64Decoder(config)); - getI8Encoder = () => numberEncoderFactory({ - name: "i8", - range: [-Number("0x7f") - 1, Number("0x7f")], - set: (view, value) => view.setInt8(0, Number(value)), - size: 1 - }); - getI8Decoder = () => numberDecoderFactory({ - get: (view) => view.getInt8(0), - name: "i8", - size: 1 - }); - getI8Codec = () => combineCodec(getI8Encoder(), getI8Decoder()); - getShortU16Encoder = () => createEncoder({ - getSizeFromValue: (value) => { - if (value <= 127) return 1; - if (value <= 16383) return 2; - return 3; - }, - maxSize: 3, - write: (value, bytes, offset) => { - assertNumberIsBetweenForCodec("shortU16", 0, 65535, value); - const shortU16Bytes = [0]; - for (let ii = 0; ; ii += 1) { - const alignedValue = Number(value) >> ii * 7; - if (alignedValue === 0) { - break; - } - const nextSevenBits = 127 & alignedValue; - shortU16Bytes[ii] = nextSevenBits; - if (ii > 0) { - shortU16Bytes[ii - 1] |= 128; - } - } - bytes.set(shortU16Bytes, offset); - return offset + shortU16Bytes.length; - } - }); - getShortU16Decoder = () => createDecoder({ - maxSize: 3, - read: (bytes, offset) => { - let value = 0; - let byteCount = 0; - while (++byteCount) { - const byteIndex = byteCount - 1; - const currentByte = bytes[offset + byteIndex]; - const nextSevenBits = 127 & currentByte; - value |= nextSevenBits << byteIndex * 7; - if ((currentByte & 128) === 0) { - break; - } - } - return [value, offset + byteCount]; - } - }); - getShortU16Codec = () => combineCodec(getShortU16Encoder(), getShortU16Decoder()); - getU128Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "u128", - range: [0n, BigInt("0xffffffffffffffffffffffffffffffff")], - set: (view, value, le) => { - const leftOffset = le ? 8 : 0; - const rightOffset = le ? 0 : 8; - const rightMask = 0xffffffffffffffffn; - view.setBigUint64(leftOffset, BigInt(value) >> 64n, le); - view.setBigUint64(rightOffset, BigInt(value) & rightMask, le); - }, - size: 16 - }); - getU128Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => { - const leftOffset = le ? 8 : 0; - const rightOffset = le ? 0 : 8; - const left = view.getBigUint64(leftOffset, le); - const right = view.getBigUint64(rightOffset, le); - return (left << 64n) + right; - }, - name: "u128", - size: 16 - }); - getU128Codec = (config = {}) => combineCodec(getU128Encoder(config), getU128Decoder(config)); - getU16Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "u16", - range: [0, Number("0xffff")], - set: (view, value, le) => view.setUint16(0, Number(value), le), - size: 2 - }); - getU16Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getUint16(0, le), - name: "u16", - size: 2 - }); - getU16Codec = (config = {}) => combineCodec(getU16Encoder(config), getU16Decoder(config)); - getU32Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "u32", - range: [0, Number("0xffffffff")], - set: (view, value, le) => view.setUint32(0, Number(value), le), - size: 4 - }); - getU32Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getUint32(0, le), - name: "u32", - size: 4 - }); - getU32Codec = (config = {}) => combineCodec(getU32Encoder(config), getU32Decoder(config)); - getU64Encoder = (config = {}) => numberEncoderFactory({ - config, - name: "u64", - range: [0n, BigInt("0xffffffffffffffff")], - set: (view, value, le) => view.setBigUint64(0, BigInt(value), le), - size: 8 - }); - getU64Decoder = (config = {}) => numberDecoderFactory({ - config, - get: (view, le) => view.getBigUint64(0, le), - name: "u64", - size: 8 - }); - getU64Codec = (config = {}) => combineCodec(getU64Encoder(config), getU64Decoder(config)); - getU8Encoder = () => numberEncoderFactory({ - name: "u8", - range: [0, Number("0xff")], - set: (view, value) => view.setUint8(0, Number(value)), - size: 1 - }); - getU8Decoder = () => numberDecoderFactory({ - get: (view) => view.getUint8(0), - name: "u8", - size: 1 - }); - getU8Codec = () => combineCodec(getU8Encoder(), getU8Decoder()); - } -}); - -// node_modules/@solana/codecs-data-structures/dist/index.node.mjs -function assertValidNumberOfItemsForCodec(codecDescription, expected, actual) { - if (expected !== actual) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, { - actual, - codecDescription, - expected - }); - } -} -function maxCodecSizes(sizes) { - return sizes.reduce( - (all, size5) => all === null || size5 === null ? null : Math.max(all, size5), - 0 - ); -} -function sumCodecSizes(sizes) { - return sizes.reduce((all, size5) => all === null || size5 === null ? null : all + size5, 0); -} -function getFixedSize(codec) { - return isFixedSize(codec) ? codec.fixedSize : null; -} -function getMaxSize(codec) { - return isFixedSize(codec) ? codec.fixedSize : codec.maxSize ?? null; -} -function getArrayEncoder(item, config = {}) { - const size5 = config.size ?? getU32Encoder(); - const fixedSize = computeArrayLikeCodecSize(size5, getFixedSize(item)); - const maxSize = computeArrayLikeCodecSize(size5, getMaxSize(item)) ?? void 0; - return createEncoder({ - ...fixedSize !== null ? { fixedSize } : { - getSizeFromValue: (array) => { - const prefixSize = typeof size5 === "object" ? getEncodedSize(array.length, size5) : 0; - return prefixSize + [...array].reduce((all, value) => all + getEncodedSize(value, item), 0); - }, - maxSize - }, - write: (array, bytes, offset) => { - if (typeof size5 === "number") { - assertValidNumberOfItemsForCodec("array", size5, array.length); - } - if (typeof size5 === "object") { - offset = size5.write(array.length, bytes, offset); - } - array.forEach((value) => { - offset = item.write(value, bytes, offset); - }); - return offset; - } - }); -} -function getArrayDecoder(item, config = {}) { - const size5 = config.size ?? getU32Decoder(); - const itemSize = getFixedSize(item); - const fixedSize = computeArrayLikeCodecSize(size5, itemSize); - const maxSize = computeArrayLikeCodecSize(size5, getMaxSize(item)) ?? void 0; - return createDecoder({ - ...fixedSize !== null ? { fixedSize } : { maxSize }, - read: (bytes, offset) => { - const array = []; - if (typeof size5 === "object" && bytes.slice(offset).length === 0) { - return [array, offset]; - } - if (size5 === "remainder") { - while (offset < bytes.length) { - const [value, newOffset2] = item.read(bytes, offset); - offset = newOffset2; - array.push(value); - } - return [array, offset]; - } - const [resolvedSize, newOffset] = typeof size5 === "number" ? [size5, offset] : size5.read(bytes, offset); - offset = newOffset; - for (let i = 0; i < resolvedSize; i += 1) { - const [value, newOffset2] = item.read(bytes, offset); - offset = newOffset2; - array.push(value); - } - return [array, offset]; - } - }); -} -function getArrayCodec(item, config = {}) { - return combineCodec(getArrayEncoder(item, config), getArrayDecoder(item, config)); -} -function computeArrayLikeCodecSize(size5, itemSize) { - if (typeof size5 !== "number") return null; - if (size5 === 0) return 0; - return itemSize === null ? null : itemSize * size5; -} -function getBitArrayEncoder(size5, config = {}) { - const parsedConfig = typeof config === "boolean" ? { backward: config } : config; - const backward = parsedConfig.backward ?? false; - return createEncoder({ - fixedSize: size5, - write(value, bytes, offset) { - const bytesToAdd = []; - for (let i = 0; i < size5; i += 1) { - let byte = 0; - for (let j = 0; j < 8; j += 1) { - const feature = Number(value[i * 8 + j] ?? 0); - byte |= feature << (backward ? j : 7 - j); - } - if (backward) { - bytesToAdd.unshift(byte); - } else { - bytesToAdd.push(byte); - } - } - bytes.set(bytesToAdd, offset); - return size5; - } - }); -} -function getBitArrayDecoder(size5, config = {}) { - const parsedConfig = typeof config === "boolean" ? { backward: config } : config; - const backward = parsedConfig.backward ?? false; - return createDecoder({ - fixedSize: size5, - read(bytes, offset) { - assertByteArrayHasEnoughBytesForCodec("bitArray", size5, bytes, offset); - const booleans = []; - let slice4 = bytes.slice(offset, offset + size5); - slice4 = backward ? slice4.reverse() : slice4; - slice4.forEach((byte) => { - for (let i = 0; i < 8; i += 1) { - if (backward) { - booleans.push(Boolean(byte & 1)); - byte >>= 1; - } else { - booleans.push(Boolean(byte & 128)); - byte <<= 1; - } - } - }); - return [booleans, offset + size5]; - } - }); -} -function getBitArrayCodec(size5, config = {}) { - return combineCodec(getBitArrayEncoder(size5, config), getBitArrayDecoder(size5, config)); -} -function getBooleanEncoder(config = {}) { - return transformEncoder(config.size ?? getU8Encoder(), (value) => value ? 1 : 0); -} -function getBooleanDecoder(config = {}) { - return transformDecoder(config.size ?? getU8Decoder(), (value) => Number(value) === 1); -} -function getBooleanCodec(config = {}) { - return combineCodec(getBooleanEncoder(config), getBooleanDecoder(config)); -} -function getBytesEncoder() { - return createEncoder({ - getSizeFromValue: (value) => value.length, - write: (value, bytes, offset) => { - bytes.set(value, offset); - return offset + value.length; - } - }); -} -function getBytesDecoder() { - return createDecoder({ - read: (bytes, offset) => { - const slice4 = bytes.slice(offset); - return [slice4, offset + slice4.length]; - } - }); -} -function getBytesCodec() { - return combineCodec(getBytesEncoder(), getBytesDecoder()); -} -function getConstantEncoder(constant) { - return createEncoder({ - fixedSize: constant.length, - write: (_, bytes, offset) => { - bytes.set(constant, offset); - return offset + constant.length; - } - }); -} -function getConstantDecoder(constant) { - return createDecoder({ - fixedSize: constant.length, - read: (bytes, offset) => { - const base16 = getBase16Decoder2(); - if (!containsBytes(bytes, constant, offset)) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_CONSTANT, { - constant, - data: bytes, - hexConstant: base16.decode(constant), - hexData: base16.decode(bytes), - offset - }); - } - return [void 0, offset + constant.length]; - } - }); -} -function getConstantCodec(constant) { - return combineCodec(getConstantEncoder(constant), getConstantDecoder(constant)); -} -function getTupleEncoder(items) { - const fixedSize = sumCodecSizes(items.map(getFixedSize)); - const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0; - return createEncoder({ - ...fixedSize === null ? { - getSizeFromValue: (value) => items.map((item, index2) => getEncodedSize(value[index2], item)).reduce((all, one) => all + one, 0), - maxSize - } : { fixedSize }, - write: (value, bytes, offset) => { - assertValidNumberOfItemsForCodec("tuple", items.length, value.length); - items.forEach((item, index2) => { - offset = item.write(value[index2], bytes, offset); - }); - return offset; - } - }); -} -function getTupleDecoder(items) { - const fixedSize = sumCodecSizes(items.map(getFixedSize)); - const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0; - return createDecoder({ - ...fixedSize === null ? { maxSize } : { fixedSize }, - read: (bytes, offset) => { - const values = []; - items.forEach((item) => { - const [newValue, newOffset] = item.read(bytes, offset); - values.push(newValue); - offset = newOffset; - }); - return [values, offset]; - } - }); -} -function getTupleCodec(items) { - return combineCodec( - getTupleEncoder(items), - getTupleDecoder(items) - ); -} -function getUnionEncoder(variants, getIndexFromValue) { - const fixedSize = getUnionFixedSize(variants); - const write = (variant, bytes, offset) => { - const index2 = getIndexFromValue(variant); - assertValidVariantIndex(variants, index2); - return variants[index2].write(variant, bytes, offset); - }; - if (fixedSize !== null) { - return createEncoder({ fixedSize, write }); - } - const maxSize = getUnionMaxSize(variants); - return createEncoder({ - ...maxSize !== null ? { maxSize } : {}, - getSizeFromValue: (variant) => { - const index2 = getIndexFromValue(variant); - assertValidVariantIndex(variants, index2); - return getEncodedSize(variant, variants[index2]); - }, - write - }); -} -function getUnionDecoder(variants, getIndexFromBytes) { - const fixedSize = getUnionFixedSize(variants); - const read = (bytes, offset) => { - const index2 = getIndexFromBytes(bytes, offset); - assertValidVariantIndex(variants, index2); - return variants[index2].read(bytes, offset); - }; - if (fixedSize !== null) { - return createDecoder({ fixedSize, read }); - } - const maxSize = getUnionMaxSize(variants); - return createDecoder({ ...maxSize !== null ? { maxSize } : {}, read }); -} -function getUnionCodec(variants, getIndexFromValue, getIndexFromBytes) { - return combineCodec( - getUnionEncoder(variants, getIndexFromValue), - getUnionDecoder(variants, getIndexFromBytes) - ); -} -function assertValidVariantIndex(variants, index2) { - if (typeof variants[index2] === "undefined") { - throw new SolanaError(SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, { - maxRange: variants.length - 1, - minRange: 0, - variant: index2 - }); - } -} -function getUnionFixedSize(variants) { - if (variants.length === 0) return 0; - if (!isFixedSize(variants[0])) return null; - const variantSize = variants[0].fixedSize; - const sameSizedVariants = variants.every((variant) => isFixedSize(variant) && variant.fixedSize === variantSize); - return sameSizedVariants ? variantSize : null; -} -function getUnionMaxSize(variants) { - return maxCodecSizes(variants.map((variant) => getMaxSize(variant))); -} -function getDiscriminatedUnionEncoder(variants, config = {}) { - const discriminatorProperty = config.discriminator ?? "__kind"; - const prefix = config.size ?? getU8Encoder(); - return getUnionEncoder( - variants.map( - ([, variant], index2) => transformEncoder(getTupleEncoder([prefix, variant]), (value) => [index2, value]) - ), - (value) => getVariantDiscriminator(variants, value[discriminatorProperty]) - ); -} -function getDiscriminatedUnionDecoder(variants, config = {}) { - const discriminatorProperty = config.discriminator ?? "__kind"; - const prefix = config.size ?? getU8Decoder(); - return getUnionDecoder( - variants.map( - ([discriminator, variant]) => transformDecoder(getTupleDecoder([prefix, variant]), ([, value]) => ({ - [discriminatorProperty]: discriminator, - ...value - })) - ), - (bytes, offset) => Number(prefix.read(bytes, offset)[0]) - ); -} -function getDiscriminatedUnionCodec(variants, config = {}) { - return combineCodec( - getDiscriminatedUnionEncoder(variants, config), - getDiscriminatedUnionDecoder(variants, config) - ); -} -function getVariantDiscriminator(variants, discriminatorValue) { - const discriminator = variants.findIndex(([key]) => discriminatorValue === key); - if (discriminator < 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, { - value: discriminatorValue, - variants: variants.map(([key]) => key) - }); - } - return discriminator; -} -function getEnumStats(constructor) { - const numericalValues = [...new Set(Object.values(constructor).filter((v) => typeof v === "number"))].sort(); - const enumRecord = Object.fromEntries(Object.entries(constructor).slice(numericalValues.length)); - const enumKeys = Object.keys(enumRecord); - const enumValues = Object.values(enumRecord); - const stringValues = [ - .../* @__PURE__ */ new Set([...enumKeys, ...enumValues.filter((v) => typeof v === "string")]) - ]; - return { enumKeys, enumRecord, enumValues, numericalValues, stringValues }; -} -function getEnumIndexFromVariant({ - enumKeys, - enumValues, - variant -}) { - const valueIndex = findLastIndex(enumValues, (value) => value === variant); - if (valueIndex >= 0) return valueIndex; - return enumKeys.findIndex((key) => key === variant); -} -function getEnumIndexFromDiscriminator({ - discriminator, - enumKeys, - enumValues, - useValuesAsDiscriminators -}) { - if (!useValuesAsDiscriminators) { - return discriminator >= 0 && discriminator < enumKeys.length ? discriminator : -1; - } - return findLastIndex(enumValues, (value) => value === discriminator); -} -function findLastIndex(array, predicate) { - let l2 = array.length; - while (l2--) { - if (predicate(array[l2], l2, array)) return l2; - } - return -1; -} -function formatNumericalValues(values) { - if (values.length === 0) return ""; - let range = [values[0], values[0]]; - const ranges = []; - for (let index2 = 1; index2 < values.length; index2++) { - const value = values[index2]; - if (range[1] + 1 === value) { - range[1] = value; - } else { - ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`); - range = [value, value]; - } - } - ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`); - return ranges.join(", "); -} -function getEnumEncoder(constructor, config = {}) { - const prefix = config.size ?? getU8Encoder(); - const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false; - const { enumKeys, enumValues, numericalValues, stringValues } = getEnumStats(constructor); - if (useValuesAsDiscriminators && enumValues.some((value) => typeof value === "string")) { - throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, { - stringValues: enumValues.filter((v) => typeof v === "string") - }); - } - return transformEncoder(prefix, (variant) => { - const index2 = getEnumIndexFromVariant({ enumKeys, enumValues, variant }); - if (index2 < 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, { - formattedNumericalValues: formatNumericalValues(numericalValues), - numericalValues, - stringValues, - variant - }); - } - return useValuesAsDiscriminators ? enumValues[index2] : index2; - }); -} -function getEnumDecoder(constructor, config = {}) { - const prefix = config.size ?? getU8Decoder(); - const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false; - const { enumKeys, enumValues, numericalValues } = getEnumStats(constructor); - if (useValuesAsDiscriminators && enumValues.some((value) => typeof value === "string")) { - throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, { - stringValues: enumValues.filter((v) => typeof v === "string") - }); - } - return transformDecoder(prefix, (value) => { - const discriminator = Number(value); - const index2 = getEnumIndexFromDiscriminator({ - discriminator, - enumKeys, - enumValues, - useValuesAsDiscriminators - }); - if (index2 < 0) { - const validDiscriminators = useValuesAsDiscriminators ? numericalValues : [...Array(enumKeys.length).keys()]; - throw new SolanaError(SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, { - discriminator, - formattedValidDiscriminators: formatNumericalValues(validDiscriminators), - validDiscriminators - }); - } - return enumValues[index2]; - }); -} -function getEnumCodec(constructor, config = {}) { - return combineCodec(getEnumEncoder(constructor, config), getEnumDecoder(constructor, config)); -} -function getHiddenPrefixEncoder(encoder5, prefixedEncoders) { - return transformEncoder( - getTupleEncoder([...prefixedEncoders, encoder5]), - (value) => [...prefixedEncoders.map(() => void 0), value] - ); -} -function getHiddenPrefixDecoder(decoder2, prefixedDecoders) { - return transformDecoder( - getTupleDecoder([...prefixedDecoders, decoder2]), - (tuple) => tuple[tuple.length - 1] - ); -} -function getHiddenPrefixCodec(codec, prefixedCodecs) { - return combineCodec(getHiddenPrefixEncoder(codec, prefixedCodecs), getHiddenPrefixDecoder(codec, prefixedCodecs)); -} -function getHiddenSuffixEncoder(encoder5, suffixedEncoders) { - return transformEncoder( - getTupleEncoder([encoder5, ...suffixedEncoders]), - (value) => [value, ...suffixedEncoders.map(() => void 0)] - ); -} -function getHiddenSuffixDecoder(decoder2, suffixedDecoders) { - return transformDecoder( - getTupleDecoder([decoder2, ...suffixedDecoders]), - (tuple) => tuple[0] - ); -} -function getHiddenSuffixCodec(codec, suffixedCodecs) { - return combineCodec(getHiddenSuffixEncoder(codec, suffixedCodecs), getHiddenSuffixDecoder(codec, suffixedCodecs)); -} -function getLiteralUnionEncoder(variants, config = {}) { - const discriminator = config.size ?? getU8Encoder(); - return transformEncoder(discriminator, (variant) => { - const index2 = variants.indexOf(variant); - if (index2 < 0) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, { - value: variant, - variants - }); - } - return index2; - }); -} -function getLiteralUnionDecoder(variants, config = {}) { - const discriminator = config.size ?? getU8Decoder(); - return transformDecoder(discriminator, (index2) => { - if (index2 < 0 || index2 >= variants.length) { - throw new SolanaError(SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, { - discriminator: index2, - maxRange: variants.length - 1, - minRange: 0 - }); - } - return variants[Number(index2)]; - }); -} -function getLiteralUnionCodec(variants, config = {}) { - return combineCodec(getLiteralUnionEncoder(variants, config), getLiteralUnionDecoder(variants, config)); -} -function getMapEncoder(key, value, config = {}) { - return transformEncoder( - getArrayEncoder(getTupleEncoder([key, value]), config), - (map) => [...map.entries()] - ); -} -function getMapDecoder(key, value, config = {}) { - return transformDecoder( - getArrayDecoder(getTupleDecoder([key, value]), config), - (entries) => new Map(entries) - ); -} -function getMapCodec(key, value, config = {}) { - return combineCodec(getMapEncoder(key, value, config), getMapDecoder(key, value, config)); -} -function getUnitEncoder() { - return createEncoder({ - fixedSize: 0, - write: (_value, _bytes, offset) => offset - }); -} -function getUnitDecoder() { - return createDecoder({ - fixedSize: 0, - read: (_bytes, offset) => [void 0, offset] - }); -} -function getUnitCodec() { - return combineCodec(getUnitEncoder(), getUnitDecoder()); -} -function getNullableEncoder(item, config = {}) { - const prefix = (() => { - if (config.prefix === null) { - return transformEncoder(getUnitEncoder(), (_boolean) => void 0); - } - return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() }); - })(); - const noneValue = (() => { - if (config.noneValue === "zeroes") { - assertIsFixedSize(item); - return fixEncoderSize(getUnitEncoder(), item.fixedSize); - } - if (!config.noneValue) { - return getUnitEncoder(); - } - return getConstantEncoder(config.noneValue); - })(); - return getUnionEncoder( - [ - transformEncoder(getTupleEncoder([prefix, noneValue]), (_value) => [ - false, - void 0 - ]), - transformEncoder(getTupleEncoder([prefix, item]), (value) => [true, value]) - ], - (variant) => Number(variant !== null) - ); -} -function getNullableDecoder(item, config = {}) { - const prefix = (() => { - if (config.prefix === null) { - return transformDecoder(getUnitDecoder(), () => false); - } - return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() }); - })(); - const noneValue = (() => { - if (config.noneValue === "zeroes") { - assertIsFixedSize(item); - return fixDecoderSize(getUnitDecoder(), item.fixedSize); - } - if (!config.noneValue) { - return getUnitDecoder(); - } - return getConstantDecoder(config.noneValue); - })(); - return getUnionDecoder( - [ - transformDecoder(getTupleDecoder([prefix, noneValue]), () => null), - transformDecoder(getTupleDecoder([prefix, item]), ([, value]) => value) - ], - (bytes, offset) => { - if (config.prefix === null && !config.noneValue) { - return Number(offset < bytes.length); - } - if (config.prefix === null && config.noneValue != null) { - const zeroValue = config.noneValue === "zeroes" ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue; - return containsBytes(bytes, zeroValue, offset) ? 0 : 1; - } - return Number(prefix.read(bytes, offset)[0]); - } - ); -} -function getNullableCodec(item, config = {}) { - return combineCodec( - getNullableEncoder(item, config), - getNullableDecoder(item, config) - ); -} -function getSetEncoder(item, config = {}) { - return transformEncoder(getArrayEncoder(item, config), (set) => [...set]); -} -function getSetDecoder(item, config = {}) { - return transformDecoder(getArrayDecoder(item, config), (entries) => new Set(entries)); -} -function getSetCodec(item, config = {}) { - return combineCodec(getSetEncoder(item, config), getSetDecoder(item, config)); -} -function getStructEncoder(fields) { - const fieldCodecs = fields.map(([, codec]) => codec); - const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize)); - const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0; - return createEncoder({ - ...fixedSize === null ? { - getSizeFromValue: (value) => fields.map(([key, codec]) => getEncodedSize(value[key], codec)).reduce((all, one) => all + one, 0), - maxSize - } : { fixedSize }, - write: (struct, bytes, offset) => { - fields.forEach(([key, codec]) => { - offset = codec.write(struct[key], bytes, offset); - }); - return offset; - } - }); -} -function getStructDecoder(fields) { - const fieldCodecs = fields.map(([, codec]) => codec); - const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize)); - const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0; - return createDecoder({ - ...fixedSize === null ? { maxSize } : { fixedSize }, - read: (bytes, offset) => { - const struct = {}; - fields.forEach(([key, codec]) => { - const [value, newOffset] = codec.read(bytes, offset); - offset = newOffset; - struct[key] = value; - }); - return [struct, offset]; - } - }); -} -function getStructCodec(fields) { - return combineCodec( - getStructEncoder(fields), - getStructDecoder(fields) - ); -} -var getBase16Decoder2; -var init_index_node8 = __esm({ - "node_modules/@solana/codecs-data-structures/dist/index.node.mjs"() { - "use strict"; - init_index_node2(); - init_index_node7(); - init_index_node(); - getBase16Decoder2 = () => createDecoder({ - read(bytes, offset) { - const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); - return [value, bytes.length]; - } - }); - } -}); - -// node_modules/@solana/options/dist/index.node.mjs -function unwrapOption(option, fallback) { - if (isSome(option)) return option.value; - return fallback ? fallback() : null; -} -function getOptionEncoder(item, config = {}) { - const prefix = (() => { - if (config.prefix === null) { - return transformEncoder(getUnitEncoder(), (_boolean) => void 0); - } - return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() }); - })(); - const noneValue = (() => { - if (config.noneValue === "zeroes") { - assertIsFixedSize(item); - return fixEncoderSize(getUnitEncoder(), item.fixedSize); - } - if (!config.noneValue) { - return getUnitEncoder(); - } - return getConstantEncoder(config.noneValue); - })(); - return getUnionEncoder( - [ - transformEncoder(getTupleEncoder([prefix, noneValue]), (_value) => [ - false, - void 0 - ]), - transformEncoder(getTupleEncoder([prefix, item]), (value) => [ - true, - isOption(value) && isSome(value) ? value.value : value - ]) - ], - (variant) => { - const option = isOption(variant) ? variant : wrapNullable(variant); - return Number(isSome(option)); - } - ); -} -function getOptionDecoder(item, config = {}) { - const prefix = (() => { - if (config.prefix === null) { - return transformDecoder(getUnitDecoder(), () => false); - } - return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() }); - })(); - const noneValue = (() => { - if (config.noneValue === "zeroes") { - assertIsFixedSize(item); - return fixDecoderSize(getUnitDecoder(), item.fixedSize); - } - if (!config.noneValue) { - return getUnitDecoder(); - } - return getConstantDecoder(config.noneValue); - })(); - return getUnionDecoder( - [ - transformDecoder(getTupleDecoder([prefix, noneValue]), () => none()), - transformDecoder(getTupleDecoder([prefix, item]), ([, value]) => some(value)) - ], - (bytes, offset) => { - if (config.prefix === null && !config.noneValue) { - return Number(offset < bytes.length); - } - if (config.prefix === null && config.noneValue != null) { - const zeroValue = config.noneValue === "zeroes" ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue; - return containsBytes(bytes, zeroValue, offset) ? 0 : 1; - } - return Number(prefix.read(bytes, offset)[0]); - } - ); -} -function getOptionCodec(item, config = {}) { - return combineCodec( - getOptionEncoder(item, config), - getOptionDecoder(item, config) - ); -} -function unwrapOptionRecursively(input, fallback) { - if (!input || ArrayBuffer.isView(input)) { - return input; - } - const next = (x) => fallback ? unwrapOptionRecursively(x, fallback) : unwrapOptionRecursively(x); - if (isOption(input)) { - if (isSome(input)) return next(input.value); - return fallback ? fallback() : null; - } - if (Array.isArray(input)) { - return input.map(next); - } - if (typeof input === "object") { - return Object.fromEntries(Object.entries(input).map(([k, v]) => [k, next(v)])); - } - return input; -} -var some, none, isOption, isSome, isNone, wrapNullable; -var init_index_node9 = __esm({ - "node_modules/@solana/options/dist/index.node.mjs"() { - "use strict"; - init_index_node2(); - init_index_node8(); - init_index_node7(); - some = (value) => ({ __option: "Some", value }); - none = () => ({ __option: "None" }); - isOption = (input) => !!(input && typeof input === "object" && "__option" in input && (input.__option === "Some" && "value" in input || input.__option === "None")); - isSome = (option) => option.__option === "Some"; - isNone = (option) => option.__option === "None"; - wrapNullable = (nullable) => nullable !== null ? some(nullable) : none(); - } -}); - -// node_modules/@solana/codecs/dist/index.node.mjs -var init_index_node10 = __esm({ - "node_modules/@solana/codecs/dist/index.node.mjs"() { - "use strict"; - init_index_node2(); - init_index_node8(); - init_index_node7(); - init_index_node3(); - init_index_node9(); - } -}); - -// node_modules/@solana/functional/dist/index.node.mjs -function pipe(init, ...fns) { - return fns.reduce((acc, fn) => fn(acc), init); -} -var init_index_node11 = __esm({ - "node_modules/@solana/functional/dist/index.node.mjs"() { - "use strict"; - } -}); - -// node_modules/@solana/instructions/dist/index.node.mjs -function isInstructionForProgram(instruction, programAddress) { - return instruction.programAddress === programAddress; -} -function assertIsInstructionForProgram(instruction, programAddress) { - if (instruction.programAddress !== programAddress) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, { - actualProgramAddress: instruction.programAddress, - expectedProgramAddress: programAddress - }); - } -} -function isInstructionWithAccounts(instruction) { - return instruction.accounts !== void 0; -} -function assertIsInstructionWithAccounts(instruction) { - if (instruction.accounts === void 0) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, { - data: instruction.data, - programAddress: instruction.programAddress - }); - } -} -function isInstructionWithData(instruction) { - return instruction.data !== void 0; -} -function assertIsInstructionWithData(instruction) { - if (instruction.data === void 0) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, { - accountAddresses: instruction.accounts?.map((a) => a.address), - programAddress: instruction.programAddress - }); - } -} -function downgradeRoleToNonSigner(role) { - return role & ~IS_SIGNER_BITMASK; -} -function downgradeRoleToReadonly(role) { - return role & ~IS_WRITABLE_BITMASK; -} -function isSignerRole(role) { - return role >= 2; -} -function isWritableRole(role) { - return (role & IS_WRITABLE_BITMASK) !== 0; -} -function mergeRoles(roleA, roleB) { - return roleA | roleB; -} -function upgradeRoleToSigner(role) { - return role | IS_SIGNER_BITMASK; -} -function upgradeRoleToWritable(role) { - return role | IS_WRITABLE_BITMASK; -} -var AccountRole, IS_SIGNER_BITMASK, IS_WRITABLE_BITMASK; -var init_index_node12 = __esm({ - "node_modules/@solana/instructions/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - AccountRole = /* @__PURE__ */ ((AccountRole2) => { - AccountRole2[AccountRole2["WRITABLE_SIGNER"] = /* 3 */ - 3] = "WRITABLE_SIGNER"; - AccountRole2[AccountRole2["READONLY_SIGNER"] = /* 2 */ - 2] = "READONLY_SIGNER"; - AccountRole2[AccountRole2["WRITABLE"] = /* 1 */ - 1] = "WRITABLE"; - AccountRole2[AccountRole2["READONLY"] = /* 0 */ - 0] = "READONLY"; - return AccountRole2; - })(AccountRole || {}); - IS_SIGNER_BITMASK = 2; - IS_WRITABLE_BITMASK = 1; - } -}); - -// node_modules/@solana/rpc-types/dist/index.node.mjs -function isBlockhash(putativeBlockhash) { - return isAddress2(putativeBlockhash); -} -function assertIsBlockhash(putativeBlockhash) { - try { - assertIsAddress(putativeBlockhash); - } catch (error) { - if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) { - throw new SolanaError(SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, error.context); - } - if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) { - throw new SolanaError(SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, error.context); - } - throw error; - } -} -function blockhash(putativeBlockhash) { - assertIsBlockhash(putativeBlockhash); - return putativeBlockhash; -} -function getBlockhashEncoder() { - const addressEncoder = getAddressEncoder(); - return createEncoder({ - fixedSize: 32, - write: (value, bytes, offset) => { - assertIsBlockhash(value); - return addressEncoder.write(value, bytes, offset); - } - }); -} -function getBlockhashDecoder() { - return getAddressDecoder(); -} -function getBlockhashCodec() { - return combineCodec(getBlockhashEncoder(), getBlockhashDecoder()); -} -function getBlockhashComparator() { - return new Intl.Collator("en", { - caseFirst: "lower", - ignorePunctuation: false, - localeMatcher: "best fit", - numeric: false, - sensitivity: "variant", - usage: "sort" - }).compare; -} -function mainnet(putativeString) { - return putativeString; -} -function devnet(putativeString) { - return putativeString; -} -function testnet(putativeString) { - return putativeString; -} -function getCommitmentScore(commitment) { - switch (commitment) { - case "finalized": - return 2; - case "confirmed": - return 1; - case "processed": - return 0; - default: - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { - unexpectedValue: commitment - }); - } -} -function commitmentComparator(a, b) { - if (a === b) { - return 0; - } - return getCommitmentScore(a) < getCommitmentScore(b) ? -1 : 1; -} -function getMemoizedU64Encoder() { - if (!memoizedU64Encoder) memoizedU64Encoder = getU64Encoder(); - return memoizedU64Encoder; -} -function getMemoizedU64Decoder() { - if (!memoizedU64Decoder) memoizedU64Decoder = getU64Decoder(); - return memoizedU64Decoder; -} -function isLamports(putativeLamports) { - return putativeLamports >= 0 && putativeLamports <= maxU64Value; -} -function assertIsLamports(putativeLamports) { - if (putativeLamports < 0 || putativeLamports > maxU64Value) { - throw new SolanaError(SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE); - } -} -function lamports(putativeLamports) { - assertIsLamports(putativeLamports); - return putativeLamports; -} -function getDefaultLamportsEncoder() { - return getLamportsEncoder(getMemoizedU64Encoder()); -} -function getLamportsEncoder(innerEncoder) { - return innerEncoder; -} -function getDefaultLamportsDecoder() { - return getLamportsDecoder(getMemoizedU64Decoder()); -} -function getLamportsDecoder(innerDecoder) { - return transformDecoder( - innerDecoder, - (value) => lamports(typeof value === "bigint" ? value : BigInt(value)) - ); -} -function getDefaultLamportsCodec() { - return combineCodec(getDefaultLamportsEncoder(), getDefaultLamportsDecoder()); -} -function getLamportsCodec(innerCodec) { - return combineCodec(getLamportsEncoder(innerCodec), getLamportsDecoder(innerCodec)); -} -function isStringifiedBigInt(putativeBigInt) { - try { - BigInt(putativeBigInt); - return true; - } catch { - return false; - } -} -function assertIsStringifiedBigInt(putativeBigInt) { - try { - BigInt(putativeBigInt); - } catch { - throw new SolanaError(SOLANA_ERROR__MALFORMED_BIGINT_STRING, { - value: putativeBigInt - }); - } -} -function stringifiedBigInt(putativeBigInt) { - assertIsStringifiedBigInt(putativeBigInt); - return putativeBigInt; -} -function isStringifiedNumber(putativeNumber) { - return !Number.isNaN(Number(putativeNumber)); -} -function assertIsStringifiedNumber(putativeNumber) { - if (Number.isNaN(Number(putativeNumber))) { - throw new SolanaError(SOLANA_ERROR__MALFORMED_NUMBER_STRING, { - value: putativeNumber - }); - } -} -function stringifiedNumber(putativeNumber) { - assertIsStringifiedNumber(putativeNumber); - return putativeNumber; -} -function isUnixTimestamp(putativeTimestamp) { - return putativeTimestamp >= minI64Value && putativeTimestamp <= maxI64Value; -} -function assertIsUnixTimestamp(putativeTimestamp) { - if (putativeTimestamp < minI64Value || putativeTimestamp > maxI64Value) { - throw new SolanaError(SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, { - value: putativeTimestamp - }); - } -} -function unixTimestamp(putativeTimestamp) { - assertIsUnixTimestamp(putativeTimestamp); - return putativeTimestamp; -} -var maxU64Value, memoizedU64Encoder, memoizedU64Decoder, maxI64Value, minI64Value; -var init_index_node13 = __esm({ - "node_modules/@solana/rpc-types/dist/index.node.mjs"() { - "use strict"; - init_index_node6(); - init_index_node2(); - init_index_node(); - init_index_node7(); - maxU64Value = 18446744073709551615n; - maxI64Value = 9223372036854775807n; - minI64Value = -9223372036854775808n; - } -}); - -// node_modules/@solana/transaction-messages/dist/index.node.mjs -function isTransactionMessageWithBlockhashLifetime(transactionMessage) { - return "lifetimeConstraint" in transactionMessage && typeof transactionMessage.lifetimeConstraint.blockhash === "string" && typeof transactionMessage.lifetimeConstraint.lastValidBlockHeight === "bigint" && isBlockhash(transactionMessage.lifetimeConstraint.blockhash); -} -function assertIsTransactionMessageWithBlockhashLifetime(transactionMessage) { - if (!isTransactionMessageWithBlockhashLifetime(transactionMessage)) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME); - } -} -function setTransactionMessageLifetimeUsingBlockhash(blockhashLifetimeConstraint, transactionMessage) { - if ("lifetimeConstraint" in transactionMessage && transactionMessage.lifetimeConstraint && "blockhash" in transactionMessage.lifetimeConstraint && transactionMessage.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash && transactionMessage.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight) { - return transactionMessage; - } - return Object.freeze({ - ...transactionMessage, - lifetimeConstraint: Object.freeze(blockhashLifetimeConstraint) - }); -} -function assertValidBaseString2(alphabet4, testValue, givenValue = testValue) { - if (!testValue.match(new RegExp(`^[${alphabet4}]*$`))) { - throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { - alphabet: alphabet4, - base: alphabet4.length, - value: givenValue - }); - } -} -function partitionLeadingZeroes2(value, zeroCharacter) { - const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`)); - return [leadingZeros, tailChars]; -} -function getBigIntFromBaseX2(value, alphabet4) { - const base2 = BigInt(alphabet4.length); - let sum = 0n; - for (const char of value) { - sum *= base2; - sum += BigInt(alphabet4.indexOf(char)); - } - return sum; -} -function getBaseXFromBigInt2(value, alphabet4) { - const base2 = BigInt(alphabet4.length); - const tailChars = []; - while (value > 0n) { - tailChars.unshift(alphabet4[Number(value % base2)]); - value /= base2; - } - return tailChars.join(""); -} -function getAddressTableLookupEncoder() { - if (!memoizedAddressTableLookupEncoder) { - const indexEncoder = getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() }); - memoizedAddressTableLookupEncoder = getStructEncoder([ - ["lookupTableAddress", getAddressEncoder()], - ["writableIndexes", indexEncoder], - ["readonlyIndexes", indexEncoder] - ]); - } - return memoizedAddressTableLookupEncoder; -} -function getAddressTableLookupDecoder() { - if (!memoizedAddressTableLookupDecoder) { - const indexEncoder = getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() }); - memoizedAddressTableLookupDecoder = getStructDecoder([ - ["lookupTableAddress", getAddressDecoder()], - ["writableIndexes", indexEncoder], - ["readonlyIndexes", indexEncoder] - ]); - } - return memoizedAddressTableLookupDecoder; -} -function getMemoizedU8Encoder() { - if (!memoizedU8Encoder) memoizedU8Encoder = getU8Encoder(); - return memoizedU8Encoder; -} -function getMemoizedU8Decoder() { - if (!memoizedU8Decoder) memoizedU8Decoder = getU8Decoder(); - return memoizedU8Decoder; -} -function getMessageHeaderEncoder() { - return getStructEncoder([ - ["numSignerAccounts", getMemoizedU8Encoder()], - ["numReadonlySignerAccounts", getMemoizedU8Encoder()], - ["numReadonlyNonSignerAccounts", getMemoizedU8Encoder()] - ]); -} -function getMessageHeaderDecoder() { - return getStructDecoder([ - ["numSignerAccounts", getMemoizedU8Decoder()], - ["numReadonlySignerAccounts", getMemoizedU8Decoder()], - ["numReadonlyNonSignerAccounts", getMemoizedU8Decoder()] - ]); -} -function getInstructionEncoder() { - if (!memoizedGetInstructionEncoder) { - memoizedGetInstructionEncoder = transformEncoder( - getStructEncoder([ - ["programAddressIndex", getU8Encoder()], - ["accountIndices", getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() })], - ["data", addEncoderSizePrefix(getBytesEncoder(), getShortU16Encoder())] - ]), - // Convert an instruction to have all fields defined - (instruction) => { - if (instruction.accountIndices !== void 0 && instruction.data !== void 0) { - return instruction; - } - return { - ...instruction, - accountIndices: instruction.accountIndices ?? [], - data: instruction.data ?? new Uint8Array(0) - }; - } - ); - } - return memoizedGetInstructionEncoder; -} -function getInstructionDecoder() { - if (!memoizedGetInstructionDecoder) { - memoizedGetInstructionDecoder = transformDecoder( - getStructDecoder([ - ["programAddressIndex", getU8Decoder()], - ["accountIndices", getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() })], - [ - "data", - addDecoderSizePrefix(getBytesDecoder(), getShortU16Decoder()) - ] - ]), - // Convert an instruction to exclude optional fields if they are empty - (instruction) => { - if (instruction.accountIndices.length && instruction.data.byteLength) { - return instruction; - } - const { accountIndices, data, ...rest } = instruction; - return { - ...rest, - ...accountIndices.length ? { accountIndices } : null, - ...data.byteLength ? { data } : null - }; - } - ); - } - return memoizedGetInstructionDecoder; -} -function getTransactionVersionEncoder() { - return createEncoder({ - getSizeFromValue: (value) => value === "legacy" ? 0 : 1, - maxSize: 1, - write: (value, bytes, offset) => { - if (value === "legacy") { - return offset; - } - if (value < 0 || value > 127) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, { - actualVersion: value - }); - } - if (value > MAX_SUPPORTED_TRANSACTION_VERSION) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, { - unsupportedVersion: value - }); - } - bytes.set([value | VERSION_FLAG_MASK], offset); - return offset + 1; - } - }); -} -function getTransactionVersionDecoder() { - return createDecoder({ - maxSize: 1, - read: (bytes, offset) => { - const firstByte = bytes[offset]; - if ((firstByte & VERSION_FLAG_MASK) === 0) { - return ["legacy", offset]; - } else { - const version4 = firstByte ^ VERSION_FLAG_MASK; - if (version4 > MAX_SUPPORTED_TRANSACTION_VERSION) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, { - unsupportedVersion: version4 - }); - } - return [version4, offset + 1]; - } - } - }); -} -function getTransactionVersionCodec() { - return combineCodec(getTransactionVersionEncoder(), getTransactionVersionDecoder()); -} -function getCompiledMessageLegacyEncoder() { - return getStructEncoder(getPreludeStructEncoderTuple()); -} -function getCompiledMessageVersionedEncoder() { - return transformEncoder( - getStructEncoder([ - ...getPreludeStructEncoderTuple(), - ["addressTableLookups", getAddressTableLookupArrayEncoder()] - ]), - (value) => { - if (value.version === "legacy") { - return value; - } - return { - ...value, - addressTableLookups: value.addressTableLookups ?? [] - }; - } - ); -} -function getPreludeStructEncoderTuple() { - const lifetimeTokenEncoder = getUnionEncoder( - [ - // Use a 32-byte constant encoder for a missing lifetime token (index 0). - getConstantEncoder(new Uint8Array(32)), - // Use a 32-byte base58 encoder for a valid lifetime token (index 1). - fixEncoderSize(getBase58Encoder2(), 32) - ], - (value) => value === void 0 ? 0 : 1 - ); - return [ - ["version", getTransactionVersionEncoder()], - ["header", getMessageHeaderEncoder()], - ["staticAccounts", getArrayEncoder(getAddressEncoder(), { size: getShortU16Encoder() })], - ["lifetimeToken", lifetimeTokenEncoder], - ["instructions", getArrayEncoder(getInstructionEncoder(), { size: getShortU16Encoder() })] - ]; -} -function getPreludeStructDecoderTuple() { - return [ - ["version", getTransactionVersionDecoder()], - ["header", getMessageHeaderDecoder()], - ["staticAccounts", getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() })], - ["lifetimeToken", fixDecoderSize(getBase58Decoder2(), 32)], - ["instructions", getArrayDecoder(getInstructionDecoder(), { size: getShortU16Decoder() })], - ["addressTableLookups", getAddressTableLookupArrayDecoder()] - ]; -} -function getAddressTableLookupArrayEncoder() { - return getArrayEncoder(getAddressTableLookupEncoder(), { size: getShortU16Encoder() }); -} -function getAddressTableLookupArrayDecoder() { - return getArrayDecoder(getAddressTableLookupDecoder(), { size: getShortU16Decoder() }); -} -function getCompiledTransactionMessageEncoder() { - return createEncoder({ - getSizeFromValue: (compiledMessage) => { - if (compiledMessage.version === "legacy") { - return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage); - } else { - return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage); - } - }, - write: (compiledMessage, bytes, offset) => { - if (compiledMessage.version === "legacy") { - return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset); - } else { - return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset); - } - } - }); -} -function getCompiledTransactionMessageDecoder() { - return transformDecoder( - getStructDecoder(getPreludeStructDecoderTuple()), - ({ addressTableLookups, ...restOfMessage }) => { - if (restOfMessage.version === "legacy" || !addressTableLookups?.length) { - return restOfMessage; - } - return { ...restOfMessage, addressTableLookups }; - } - ); -} -function getCompiledTransactionMessageCodec() { - return combineCodec(getCompiledTransactionMessageEncoder(), getCompiledTransactionMessageDecoder()); -} -function upsert(addressMap, address2, update) { - addressMap[address2] = update(addressMap[address2] ?? { role: AccountRole.READONLY }); -} -function getAddressMapFromInstructions(feePayer, instructions) { - const addressMap = { - [feePayer]: { [TYPE2]: 0, role: AccountRole.WRITABLE_SIGNER } - }; - const addressesOfInvokedPrograms = /* @__PURE__ */ new Set(); - for (const instruction of instructions) { - upsert(addressMap, instruction.programAddress, (entry) => { - addressesOfInvokedPrograms.add(instruction.programAddress); - if (TYPE2 in entry) { - if (isWritableRole(entry.role)) { - switch (entry[TYPE2]) { - case 0: - throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, { - programAddress: instruction.programAddress - }); - default: - throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, { - programAddress: instruction.programAddress - }); - } - } - if (entry[TYPE2] === 2) { - return entry; - } - } - return { [TYPE2]: 2, role: AccountRole.READONLY }; - }); - let addressComparator; - if (!instruction.accounts) { - continue; - } - for (const account of instruction.accounts) { - upsert(addressMap, account.address, (entry) => { - const { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - address: _, - ...accountMeta - } = account; - if (TYPE2 in entry) { - switch (entry[TYPE2]) { - case 0: - return entry; - case 1: { - const nextRole = mergeRoles(entry.role, accountMeta.role); - if ("lookupTableAddress" in accountMeta) { - const shouldReplaceEntry = ( - // Consider using the new LOOKUP_TABLE if its address is different... - entry.lookupTableAddress !== accountMeta.lookupTableAddress && // ...and sorts before the existing one. - (addressComparator ||= getAddressComparator())( - accountMeta.lookupTableAddress, - entry.lookupTableAddress - ) < 0 - ); - if (shouldReplaceEntry) { - return { - [TYPE2]: 1, - ...accountMeta, - role: nextRole - }; - } - } else if (isSignerRole(accountMeta.role)) { - return { - [TYPE2]: 2, - role: nextRole - }; - } - if (entry.role !== nextRole) { - return { - ...entry, - role: nextRole - }; - } else { - return entry; - } - } - case 2: { - const nextRole = mergeRoles(entry.role, accountMeta.role); - if ( - // Check to see if this address represents a program that is invoked - // in this transaction. - addressesOfInvokedPrograms.has(account.address) - ) { - if (isWritableRole(accountMeta.role)) { - throw new SolanaError( - SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, - { - programAddress: account.address - } - ); - } - if (entry.role !== nextRole) { - return { - ...entry, - role: nextRole - }; - } else { - return entry; - } - } else if ("lookupTableAddress" in accountMeta && // Static accounts can be 'upgraded' to lookup table accounts as - // long as they are not require to sign the transaction. - !isSignerRole(entry.role)) { - return { - ...accountMeta, - [TYPE2]: 1, - role: nextRole - }; - } else { - if (entry.role !== nextRole) { - return { - ...entry, - role: nextRole - }; - } else { - return entry; - } - } - } - } - } - if ("lookupTableAddress" in accountMeta) { - return { - ...accountMeta, - [TYPE2]: 1 - /* LOOKUP_TABLE */ - }; - } else { - return { - ...accountMeta, - [TYPE2]: 2 - /* STATIC */ - }; - } - }); - } - } - return addressMap; -} -function getOrderedAccountsFromAddressMap(addressMap) { - let addressComparator; - const orderedAccounts = Object.entries(addressMap).sort(([leftAddress, leftEntry], [rightAddress, rightEntry]) => { - if (leftEntry[TYPE2] !== rightEntry[TYPE2]) { - if (leftEntry[TYPE2] === 0) { - return -1; - } else if (rightEntry[TYPE2] === 0) { - return 1; - } else if (leftEntry[TYPE2] === 2) { - return -1; - } else if (rightEntry[TYPE2] === 2) { - return 1; - } - } - const leftIsSigner = isSignerRole(leftEntry.role); - if (leftIsSigner !== isSignerRole(rightEntry.role)) { - return leftIsSigner ? -1 : 1; - } - const leftIsWritable = isWritableRole(leftEntry.role); - if (leftIsWritable !== isWritableRole(rightEntry.role)) { - return leftIsWritable ? -1 : 1; - } - addressComparator ||= getAddressComparator(); - if (leftEntry[TYPE2] === 1 && rightEntry[TYPE2] === 1 && leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress) { - return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress); - } else { - return addressComparator(leftAddress, rightAddress); - } - }).map(([address2, addressMeta]) => ({ - address: address2, - ...addressMeta - })); - return orderedAccounts; -} -function getCompiledAddressTableLookups(orderedAccounts) { - const index2 = {}; - for (const account of orderedAccounts) { - if (!("lookupTableAddress" in account)) { - continue; - } - const entry = index2[account.lookupTableAddress] ||= { - readonlyIndexes: [], - writableIndexes: [] - }; - if (account.role === AccountRole.WRITABLE) { - entry.writableIndexes.push(account.addressIndex); - } else { - entry.readonlyIndexes.push(account.addressIndex); - } - } - return Object.keys(index2).sort(getAddressComparator()).map((lookupTableAddress) => ({ - lookupTableAddress, - ...index2[lookupTableAddress] - })); -} -function getCompiledMessageHeader(orderedAccounts) { - let numReadonlyNonSignerAccounts = 0; - let numReadonlySignerAccounts = 0; - let numSignerAccounts = 0; - for (const account of orderedAccounts) { - if ("lookupTableAddress" in account) { - break; - } - const accountIsWritable = isWritableRole(account.role); - if (isSignerRole(account.role)) { - numSignerAccounts++; - if (!accountIsWritable) { - numReadonlySignerAccounts++; - } - } else if (!accountIsWritable) { - numReadonlyNonSignerAccounts++; - } - } - return { - numReadonlyNonSignerAccounts, - numReadonlySignerAccounts, - numSignerAccounts - }; -} -function getAccountIndex(orderedAccounts) { - const out = {}; - for (const [index2, account] of orderedAccounts.entries()) { - out[account.address] = index2; - } - return out; -} -function getCompiledInstructions(instructions, orderedAccounts) { - const accountIndex = getAccountIndex(orderedAccounts); - return instructions.map(({ accounts, data, programAddress }) => { - return { - programAddressIndex: accountIndex[programAddress], - ...accounts ? { accountIndices: accounts.map(({ address: address2 }) => accountIndex[address2]) } : null, - ...data ? { data } : null - }; - }); -} -function getCompiledLifetimeToken(lifetimeConstraint) { - if ("nonce" in lifetimeConstraint) { - return lifetimeConstraint.nonce; - } - return lifetimeConstraint.blockhash; -} -function getCompiledStaticAccounts(orderedAccounts) { - const firstLookupTableAccountIndex = orderedAccounts.findIndex((account) => "lookupTableAddress" in account); - const orderedStaticAccounts = firstLookupTableAccountIndex === -1 ? orderedAccounts : orderedAccounts.slice(0, firstLookupTableAccountIndex); - return orderedStaticAccounts.map(({ address: address2 }) => address2); -} -function compileTransactionMessage(transactionMessage) { - const addressMap = getAddressMapFromInstructions( - transactionMessage.feePayer.address, - transactionMessage.instructions - ); - const orderedAccounts = getOrderedAccountsFromAddressMap(addressMap); - const lifetimeConstraint = transactionMessage.lifetimeConstraint; - return { - ...transactionMessage.version !== "legacy" ? { addressTableLookups: getCompiledAddressTableLookups(orderedAccounts) } : null, - ...lifetimeConstraint ? { lifetimeToken: getCompiledLifetimeToken(lifetimeConstraint) } : null, - header: getCompiledMessageHeader(orderedAccounts), - instructions: getCompiledInstructions(transactionMessage.instructions, orderedAccounts), - staticAccounts: getCompiledStaticAccounts(orderedAccounts), - version: transactionMessage.version - }; -} -function findAddressInLookupTables(address2, role, addressesByLookupTableAddress) { - for (const [lookupTableAddress, addresses] of Object.entries(addressesByLookupTableAddress)) { - for (let i = 0; i < addresses.length; i++) { - if (address2 === addresses[i]) { - return { - address: address2, - addressIndex: i, - lookupTableAddress, - role - }; - } - } - } -} -function compressTransactionMessageUsingAddressLookupTables(transactionMessage, addressesByLookupTableAddress) { - const programAddresses = new Set(transactionMessage.instructions.map((ix) => ix.programAddress)); - const eligibleLookupAddresses = new Set( - Object.values(addressesByLookupTableAddress).flatMap((a) => a).filter((address2) => !programAddresses.has(address2)) - ); - const newInstructions = []; - let updatedAnyInstructions = false; - for (const instruction of transactionMessage.instructions) { - if (!instruction.accounts) { - newInstructions.push(instruction); - continue; - } - const newAccounts = []; - let updatedAnyAccounts = false; - for (const account of instruction.accounts) { - if ("lookupTableAddress" in account || !eligibleLookupAddresses.has(account.address) || isSignerRole(account.role)) { - newAccounts.push(account); - continue; - } - const lookupMetaAccount = findAddressInLookupTables( - account.address, - account.role, - addressesByLookupTableAddress - ); - newAccounts.push(Object.freeze(lookupMetaAccount)); - updatedAnyAccounts = true; - updatedAnyInstructions = true; - } - newInstructions.push( - Object.freeze(updatedAnyAccounts ? { ...instruction, accounts: newAccounts } : instruction) - ); - } - return Object.freeze( - updatedAnyInstructions ? { ...transactionMessage, instructions: newInstructions } : transactionMessage - ); -} -function createTransactionMessage(config) { - return Object.freeze({ - instructions: Object.freeze([]), - version: config.version - }); -} -function createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress) { - return { - accounts: [ - { address: nonceAccountAddress, role: AccountRole.WRITABLE }, - { - address: RECENT_BLOCKHASHES_SYSVAR_ADDRESS, - role: AccountRole.READONLY - }, - { address: nonceAuthorityAddress, role: AccountRole.READONLY_SIGNER } - ], - data: new Uint8Array([4, 0, 0, 0]), - programAddress: SYSTEM_PROGRAM_ADDRESS - }; -} -function isAdvanceNonceAccountInstruction(instruction) { - return instruction.programAddress === SYSTEM_PROGRAM_ADDRESS && // Test for `AdvanceNonceAccount` instruction data - instruction.data != null && isAdvanceNonceAccountInstructionData(instruction.data) && // Test for exactly 3 accounts - instruction.accounts?.length === 3 && // First account is nonce account address - instruction.accounts[0].address != null && instruction.accounts[0].role === AccountRole.WRITABLE && // Second account is recent blockhashes sysvar - instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS && instruction.accounts[1].role === AccountRole.READONLY && // Third account is nonce authority account - instruction.accounts[2].address != null && isSignerRole(instruction.accounts[2].role); -} -function isAdvanceNonceAccountInstructionData(data) { - return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0; -} -function isTransactionMessageWithDurableNonceLifetime(transactionMessage) { - return "lifetimeConstraint" in transactionMessage && typeof transactionMessage.lifetimeConstraint.nonce === "string" && transactionMessage.instructions[0] != null && isAdvanceNonceAccountInstruction(transactionMessage.instructions[0]); -} -function assertIsTransactionMessageWithDurableNonceLifetime(transactionMessage) { - if (!isTransactionMessageWithDurableNonceLifetime(transactionMessage)) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME); - } -} -function isAdvanceNonceAccountInstructionForNonce(instruction, nonceAccountAddress, nonceAuthorityAddress) { - return instruction.accounts[0].address === nonceAccountAddress && instruction.accounts[2].address === nonceAuthorityAddress; -} -function setTransactionMessageLifetimeUsingDurableNonce({ - nonce, - nonceAccountAddress, - nonceAuthorityAddress -}, transactionMessage) { - let newInstructions; - const firstInstruction = transactionMessage.instructions[0]; - if (firstInstruction && isAdvanceNonceAccountInstruction(firstInstruction)) { - if (isAdvanceNonceAccountInstructionForNonce(firstInstruction, nonceAccountAddress, nonceAuthorityAddress)) { - if (isTransactionMessageWithDurableNonceLifetime(transactionMessage) && transactionMessage.lifetimeConstraint.nonce === nonce) { - return transactionMessage; - } else { - newInstructions = [firstInstruction, ...transactionMessage.instructions.slice(1)]; - } - } else { - newInstructions = [ - Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)), - ...transactionMessage.instructions.slice(1) - ]; - } - } else { - newInstructions = [ - Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)), - ...transactionMessage.instructions - ]; - } - return Object.freeze({ - ...transactionMessage, - instructions: Object.freeze(newInstructions), - lifetimeConstraint: Object.freeze({ nonce }) - }); -} -function setTransactionMessageFeePayer(feePayer, transactionMessage) { - if ("feePayer" in transactionMessage && feePayer === transactionMessage.feePayer?.address && isAddressOnlyFeePayer(transactionMessage.feePayer)) { - return transactionMessage; - } - const out = { - ...transactionMessage, - feePayer: Object.freeze({ address: feePayer }) - }; - Object.freeze(out); - return out; -} -function isAddressOnlyFeePayer(feePayer) { - return !!feePayer && "address" in feePayer && typeof feePayer.address === "string" && Object.keys(feePayer).length === 1; -} -function appendTransactionMessageInstruction(instruction, transactionMessage) { - return appendTransactionMessageInstructions([instruction], transactionMessage); -} -function appendTransactionMessageInstructions(instructions, transactionMessage) { - return Object.freeze({ - ...transactionMessage, - instructions: Object.freeze([ - ...transactionMessage.instructions, - ...instructions - ]) - }); -} -function prependTransactionMessageInstruction(instruction, transactionMessage) { - return prependTransactionMessageInstructions([instruction], transactionMessage); -} -function prependTransactionMessageInstructions(instructions, transactionMessage) { - return Object.freeze({ - ...transactionMessage, - instructions: Object.freeze([ - ...instructions, - ...transactionMessage.instructions - ]) - }); -} -function getAccountMetas(message) { - const { header } = message; - const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts; - const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts; - const accountMetas = []; - let accountIndex = 0; - for (let i = 0; i < numWritableSignerAccounts; i++) { - accountMetas.push({ - address: message.staticAccounts[accountIndex], - role: AccountRole.WRITABLE_SIGNER - }); - accountIndex++; - } - for (let i = 0; i < header.numReadonlySignerAccounts; i++) { - accountMetas.push({ - address: message.staticAccounts[accountIndex], - role: AccountRole.READONLY_SIGNER - }); - accountIndex++; - } - for (let i = 0; i < numWritableNonSignerAccounts; i++) { - accountMetas.push({ - address: message.staticAccounts[accountIndex], - role: AccountRole.WRITABLE - }); - accountIndex++; - } - for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) { - accountMetas.push({ - address: message.staticAccounts[accountIndex], - role: AccountRole.READONLY - }); - accountIndex++; - } - return accountMetas; -} -function getAddressLookupMetas(compiledAddressTableLookups, addressesByLookupTableAddress) { - const compiledAddressTableLookupAddresses = compiledAddressTableLookups.map((l2) => l2.lookupTableAddress); - const missing = compiledAddressTableLookupAddresses.filter((a) => addressesByLookupTableAddress[a] === void 0); - if (missing.length > 0) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, { - lookupTableAddresses: missing - }); - } - const readOnlyMetas = []; - const writableMetas = []; - for (const lookup of compiledAddressTableLookups) { - const addresses = addressesByLookupTableAddress[lookup.lookupTableAddress]; - const readonlyIndexes = lookup.readonlyIndexes; - const writableIndexes = lookup.writableIndexes; - const highestIndex = Math.max(...readonlyIndexes, ...writableIndexes); - if (highestIndex >= addresses.length) { - throw new SolanaError( - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE, - { - highestKnownIndex: addresses.length - 1, - highestRequestedIndex: highestIndex, - lookupTableAddress: lookup.lookupTableAddress - } - ); - } - const readOnlyForLookup = readonlyIndexes.map((r) => ({ - address: addresses[r], - addressIndex: r, - lookupTableAddress: lookup.lookupTableAddress, - role: AccountRole.READONLY - })); - readOnlyMetas.push(...readOnlyForLookup); - const writableForLookup = writableIndexes.map((w) => ({ - address: addresses[w], - addressIndex: w, - lookupTableAddress: lookup.lookupTableAddress, - role: AccountRole.WRITABLE - })); - writableMetas.push(...writableForLookup); - } - return [...writableMetas, ...readOnlyMetas]; -} -function convertInstruction(instruction, accountMetas) { - const programAddress = accountMetas[instruction.programAddressIndex]?.address; - if (!programAddress) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, { - index: instruction.programAddressIndex - }); - } - const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]); - const { data } = instruction; - return Object.freeze({ - programAddress, - ...accounts && accounts.length ? { accounts: Object.freeze(accounts) } : {}, - ...data && data.length ? { data } : {} - }); -} -function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) { - if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) { - return { - blockhash: messageLifetimeToken, - lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n - // U64 MAX - }; - } else { - const nonceAccountAddress = firstInstruction.accounts[0].address; - assertIsAddress(nonceAccountAddress); - const nonceAuthorityAddress = firstInstruction.accounts[2].address; - assertIsAddress(nonceAuthorityAddress); - return { - nonce: messageLifetimeToken, - nonceAccountAddress, - nonceAuthorityAddress - }; - } -} -function decompileTransactionMessage(compiledTransactionMessage, config) { - const feePayer = compiledTransactionMessage.staticAccounts[0]; - if (!feePayer) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING); - } - const accountMetas = getAccountMetas(compiledTransactionMessage); - const accountLookupMetas = "addressTableLookups" in compiledTransactionMessage && compiledTransactionMessage.addressTableLookups !== void 0 && compiledTransactionMessage.addressTableLookups.length > 0 ? getAddressLookupMetas( - compiledTransactionMessage.addressTableLookups, - config?.addressesByLookupTableAddress ?? {} - ) : []; - const transactionMetas = [...accountMetas, ...accountLookupMetas]; - const instructions = compiledTransactionMessage.instructions.map( - (compiledInstruction) => convertInstruction(compiledInstruction, transactionMetas) - ); - const firstInstruction = instructions[0]; - const lifetimeConstraint = getLifetimeConstraint( - compiledTransactionMessage.lifetimeToken, - firstInstruction, - config?.lastValidBlockHeight - ); - return pipe( - createTransactionMessage({ version: compiledTransactionMessage.version }), - (m) => setTransactionMessageFeePayer(feePayer, m), - (m) => instructions.reduce( - (acc, instruction) => appendTransactionMessageInstruction(instruction, acc), - m - ), - (m) => "blockhash" in lifetimeConstraint ? setTransactionMessageLifetimeUsingBlockhash(lifetimeConstraint, m) : setTransactionMessageLifetimeUsingDurableNonce(lifetimeConstraint, m) - ); -} -var getBaseXEncoder2, getBaseXDecoder2, alphabet23, getBase58Encoder2, getBase58Decoder2, memoizedAddressTableLookupEncoder, memoizedAddressTableLookupDecoder, memoizedU8Encoder, memoizedU8Decoder, memoizedGetInstructionEncoder, memoizedGetInstructionDecoder, MAX_SUPPORTED_TRANSACTION_VERSION, VERSION_FLAG_MASK, TYPE2, RECENT_BLOCKHASHES_SYSVAR_ADDRESS, SYSTEM_PROGRAM_ADDRESS; -var init_index_node14 = __esm({ - "node_modules/@solana/transaction-messages/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node13(); - init_index_node6(); - init_index_node2(); - init_index_node8(); - init_index_node7(); - init_index_node12(); - init_index_node11(); - getBaseXEncoder2 = (alphabet4) => { - return createEncoder({ - getSizeFromValue: (value) => { - const [leadingZeroes, tailChars] = partitionLeadingZeroes2(value, alphabet4[0]); - if (!tailChars) return value.length; - const base10Number = getBigIntFromBaseX2(tailChars, alphabet4); - return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2); - }, - write(value, bytes, offset) { - assertValidBaseString2(alphabet4, value); - if (value === "") return offset; - const [leadingZeroes, tailChars] = partitionLeadingZeroes2(value, alphabet4[0]); - if (!tailChars) { - bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset); - return offset + leadingZeroes.length; - } - let base10Number = getBigIntFromBaseX2(tailChars, alphabet4); - const tailBytes = []; - while (base10Number > 0n) { - tailBytes.unshift(Number(base10Number % 256n)); - base10Number /= 256n; - } - const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes]; - bytes.set(bytesToAdd, offset); - return offset + bytesToAdd.length; - } - }); - }; - getBaseXDecoder2 = (alphabet4) => { - return createDecoder({ - read(rawBytes, offset) { - const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset); - if (bytes.length === 0) return ["", 0]; - let trailIndex = bytes.findIndex((n) => n !== 0); - trailIndex = trailIndex === -1 ? bytes.length : trailIndex; - const leadingZeroes = alphabet4[0].repeat(trailIndex); - if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length]; - const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n); - const tailChars = getBaseXFromBigInt2(base10Number, alphabet4); - return [leadingZeroes + tailChars, rawBytes.length]; - } - }); - }; - alphabet23 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - getBase58Encoder2 = () => getBaseXEncoder2(alphabet23); - getBase58Decoder2 = () => getBaseXDecoder2(alphabet23); - MAX_SUPPORTED_TRANSACTION_VERSION = 0; - VERSION_FLAG_MASK = 128; - TYPE2 = /* @__PURE__ */ Symbol("AddressMapTypeProperty"); - RECENT_BLOCKHASHES_SYSVAR_ADDRESS = "SysvarRecentB1ockHashes11111111111111111111"; - SYSTEM_PROGRAM_ADDRESS = "11111111111111111111111111111111"; - } -}); - -// node_modules/@solana/keys/dist/index.node.mjs -function addPkcs8Header(bytes) { - return new Uint8Array([ - /** - * PKCS#8 header - */ - 48, - // ASN.1 sequence tag - 46, - // Length of sequence (46 more bytes) - 2, - // ASN.1 integer tag - 1, - // Length of integer - 0, - // Version number - 48, - // ASN.1 sequence tag - 5, - // Length of sequence - 6, - // ASN.1 object identifier tag - 3, - // Length of object identifier - // Edwards curve algorithms identifier https://oid-rep.orange-labs.fr/get/1.3.101.112 - 43, - // iso(1) / identified-organization(3) (The first node is multiplied by the decimal 40 and the result is added to the value of the second node) - 101, - // thawte(101) - // Ed25519 identifier - 112, - // id-Ed25519(112) - /** - * Private key payload - */ - 4, - // ASN.1 octet string tag - 34, - // String length (34 more bytes) - // Private key bytes as octet string - 4, - // ASN.1 octet string tag - 32, - // String length (32 bytes) - ...bytes - ]); -} -async function createPrivateKeyFromBytes(bytes, extractable = false) { - const actualLength = bytes.byteLength; - if (actualLength !== 32) { - throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, { - actualLength - }); - } - const privateKeyBytesPkcs8 = addPkcs8Header(bytes); - return await crypto.subtle.importKey("pkcs8", privateKeyBytesPkcs8, ED25519_ALGORITHM_IDENTIFIER, extractable, [ - "sign" - ]); -} -async function getPublicKeyFromPrivateKey(privateKey, extractable = false) { - assertKeyExporterIsAvailable(); - if (privateKey.extractable === false) { - throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, { key: privateKey }); - } - const jwk = await crypto.subtle.exportKey("jwk", privateKey); - return await crypto.subtle.importKey( - "jwk", - { - crv: "Ed25519", - ext: extractable, - key_ops: ["verify"], - kty: "OKP", - x: jwk.x - }, - "Ed25519", - extractable, - ["verify"] - ); -} -function assertIsSignature(putativeSignature) { - if (!base58Encoder) base58Encoder = getBase58Encoder(); - if ( - // Lowest value (64 bytes of zeroes) - putativeSignature.length < 64 || // Highest value (64 bytes of 255) - putativeSignature.length > 88 - ) { - throw new SolanaError(SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, { - actualLength: putativeSignature.length - }); - } - const bytes = base58Encoder.encode(putativeSignature); - assertIsSignatureBytes(bytes); -} -function assertIsSignatureBytes(putativeSignatureBytes) { - const numBytes = putativeSignatureBytes.byteLength; - if (numBytes !== 64) { - throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, { - actualLength: numBytes - }); - } -} -function isSignature(putativeSignature) { - if (!base58Encoder) base58Encoder = getBase58Encoder(); - if ( - // Lowest value (64 bytes of zeroes) - putativeSignature.length < 64 || // Highest value (64 bytes of 255) - putativeSignature.length > 88 - ) { - return false; - } - const bytes = base58Encoder.encode(putativeSignature); - return isSignatureBytes(bytes); -} -function isSignatureBytes(putativeSignatureBytes) { - return putativeSignatureBytes.byteLength === 64; -} -async function signBytes(key, data) { - assertSigningCapabilityIsAvailable(); - const signedData = await crypto.subtle.sign(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(data)); - return new Uint8Array(signedData); -} -function signature(putativeSignature) { - assertIsSignature(putativeSignature); - return putativeSignature; -} -function signatureBytes(putativeSignatureBytes) { - assertIsSignatureBytes(putativeSignatureBytes); - return putativeSignatureBytes; -} -async function verifySignature(key, signature2, data) { - assertVerificationCapabilityIsAvailable(); - return await crypto.subtle.verify(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(signature2), toArrayBuffer(data)); -} -async function generateKeyPair() { - await assertKeyGenerationIsAvailable(); - const keyPair = await crypto.subtle.generateKey( - /* algorithm */ - ED25519_ALGORITHM_IDENTIFIER, - // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20 - /* extractable */ - false, - // Prevents the bytes of the private key from being visible to JS. - /* allowed uses */ - ["sign", "verify"] - ); - return keyPair; -} -async function createKeyPairFromBytes(bytes, extractable = false) { - assertPRNGIsAvailable(); - if (bytes.byteLength !== 64) { - throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, { byteLength: bytes.byteLength }); - } - const [publicKey, privateKey] = await Promise.all([ - crypto.subtle.importKey( - "raw", - bytes.slice(32), - ED25519_ALGORITHM_IDENTIFIER, - /* extractable */ - true, - [ - "verify" - ] - ), - createPrivateKeyFromBytes(bytes.slice(0, 32), extractable) - ]); - const randomBytes4 = new Uint8Array(32); - crypto.getRandomValues(randomBytes4); - const signedData = await signBytes(privateKey, randomBytes4); - const isValid2 = await verifySignature(publicKey, signedData, randomBytes4); - if (!isValid2) { - throw new SolanaError(SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY); - } - return { privateKey, publicKey }; -} -async function createKeyPairFromPrivateKeyBytes(bytes, extractable = false) { - const privateKeyPromise = createPrivateKeyFromBytes(bytes, extractable); - const [publicKey, privateKey] = await Promise.all([ - // This nested promise makes things efficient by - // creating the public key in parallel with the - // second private key creation, if it is needed. - (extractable ? privateKeyPromise : createPrivateKeyFromBytes( - bytes, - true - /* extractable */ - )).then( - async (privateKey2) => await getPublicKeyFromPrivateKey( - privateKey2, - true - /* extractable */ - ) - ), - privateKeyPromise - ]); - return { privateKey, publicKey }; -} -var ED25519_ALGORITHM_IDENTIFIER, base58Encoder; -var init_index_node15 = __esm({ - "node_modules/@solana/keys/dist/index.node.mjs"() { - "use strict"; - init_index_node5(); - init_index_node(); - init_index_node2(); - init_index_node3(); - ED25519_ALGORITHM_IDENTIFIER = // Resist the temptation to convert this to a simple string; As of version 133.0.3, Firefox - // requires the object form of `AlgorithmIdentifier` and will throw a `DOMException` otherwise. - Object.freeze({ name: "Ed25519" }); - } -}); - -// node_modules/@solana/transactions/dist/index.node.mjs -function getSignaturesToEncode(signaturesMap) { - const signatures = Object.values(signaturesMap); - if (signatures.length === 0) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES); - } - return signatures.map((signature2) => { - if (!signature2) { - return new Uint8Array(64).fill(0); - } - return signature2; - }); -} -function getSignaturesEncoder() { - return transformEncoder( - getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getShortU16Encoder() }), - getSignaturesToEncode - ); -} -function getTransactionEncoder() { - return getStructEncoder([ - ["signatures", getSignaturesEncoder()], - ["messageBytes", getBytesEncoder()] - ]); -} -function getTransactionDecoder() { - return transformDecoder( - getStructDecoder([ - ["signatures", getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getShortU16Decoder() })], - ["messageBytes", getBytesDecoder()] - ]), - decodePartiallyDecodedTransaction - ); -} -function getTransactionCodec() { - return combineCodec(getTransactionEncoder(), getTransactionDecoder()); -} -function decodePartiallyDecodedTransaction(transaction) { - const { messageBytes, signatures } = transaction; - const signerAddressesDecoder = getTupleDecoder([ - // read transaction version - getTransactionVersionDecoder(), - // read first byte of header, `numSignerAccounts` - // padRight to skip the next 2 bytes, `numReadOnlySignedAccounts` and `numReadOnlyUnsignedAccounts` which we don't need - padRightDecoder(getU8Decoder(), 2), - // read static addresses - getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() }) - ]); - const [_txVersion, numRequiredSignatures, staticAddresses] = signerAddressesDecoder.decode(messageBytes); - const signerAddresses = staticAddresses.slice(0, numRequiredSignatures); - if (signerAddresses.length !== signatures.length) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, { - numRequiredSignatures, - signaturesLength: signatures.length, - signerAddresses - }); - } - const signaturesMap = {}; - signerAddresses.forEach((address2, index2) => { - const signatureForAddress = signatures[index2]; - if (signatureForAddress.every((b) => b === 0)) { - signaturesMap[address2] = null; - } else { - signaturesMap[address2] = signatureForAddress; - } - }); - return { - messageBytes, - signatures: Object.freeze(signaturesMap) - }; -} -function compiledInstructionIsAdvanceNonceInstruction(instruction, staticAddresses) { - return staticAddresses[instruction.programAddressIndex] === SYSTEM_PROGRAM_ADDRESS2 && // Test for `AdvanceNonceAccount` instruction data - instruction.data != null && isAdvanceNonceAccountInstructionData2(instruction.data) && // Test for exactly 3 accounts - instruction.accountIndices?.length === 3; -} -function isAdvanceNonceAccountInstructionData2(data) { - return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0; -} -async function getTransactionLifetimeConstraintFromCompiledTransactionMessage(compiledTransactionMessage) { - const firstInstruction = compiledTransactionMessage.instructions[0]; - const { staticAccounts } = compiledTransactionMessage; - if (firstInstruction && compiledInstructionIsAdvanceNonceInstruction(firstInstruction, staticAccounts)) { - const nonceAccountAddress = staticAccounts[firstInstruction.accountIndices[0]]; - if (!nonceAccountAddress) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, { - nonce: compiledTransactionMessage.lifetimeToken - }); - } - return { - nonce: compiledTransactionMessage.lifetimeToken, - nonceAccountAddress - }; - } else { - return { - blockhash: compiledTransactionMessage.lifetimeToken, - // This is not known from the compiled message, so we set it to the maximum possible value - lastValidBlockHeight: 0xffffffffffffffffn - }; - } -} -function isTransactionWithBlockhashLifetime(transaction) { - return "lifetimeConstraint" in transaction && "blockhash" in transaction.lifetimeConstraint && typeof transaction.lifetimeConstraint.blockhash === "string" && typeof transaction.lifetimeConstraint.lastValidBlockHeight === "bigint" && isBlockhash(transaction.lifetimeConstraint.blockhash); -} -function assertIsTransactionWithBlockhashLifetime(transaction) { - if (!isTransactionWithBlockhashLifetime(transaction)) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME); - } -} -function isTransactionWithDurableNonceLifetime(transaction) { - return "lifetimeConstraint" in transaction && "nonce" in transaction.lifetimeConstraint && typeof transaction.lifetimeConstraint.nonce === "string" && typeof transaction.lifetimeConstraint.nonceAccountAddress === "string" && isAddress2(transaction.lifetimeConstraint.nonceAccountAddress); -} -function assertIsTransactionWithDurableNonceLifetime(transaction) { - if (!isTransactionWithDurableNonceLifetime(transaction)) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME); - } -} -function compileTransaction(transactionMessage) { - const compiledMessage = compileTransactionMessage(transactionMessage); - const messageBytes = getCompiledTransactionMessageEncoder().encode(compiledMessage); - const transactionSigners = compiledMessage.staticAccounts.slice(0, compiledMessage.header.numSignerAccounts); - const signatures = {}; - for (const signerAddress of transactionSigners) { - signatures[signerAddress] = null; - } - let lifetimeConstraint; - if (isTransactionMessageWithBlockhashLifetime(transactionMessage)) { - lifetimeConstraint = { - blockhash: transactionMessage.lifetimeConstraint.blockhash, - lastValidBlockHeight: transactionMessage.lifetimeConstraint.lastValidBlockHeight - }; - } else if (isTransactionMessageWithDurableNonceLifetime(transactionMessage)) { - lifetimeConstraint = { - nonce: transactionMessage.lifetimeConstraint.nonce, - nonceAccountAddress: transactionMessage.instructions[0].accounts[0].address - }; - } - return Object.freeze({ - ...lifetimeConstraint ? { lifetimeConstraint } : void 0, - messageBytes, - signatures: Object.freeze(signatures) - }); -} -function getSignatureFromTransaction(transaction) { - if (!base58Decoder) base58Decoder = getBase58Decoder(); - const signatureBytes2 = Object.values(transaction.signatures)[0]; - if (!signatureBytes2) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING); - } - const transactionSignature = base58Decoder.decode(signatureBytes2); - return transactionSignature; -} -async function partiallySignTransaction(keyPairs, transaction) { - let newSignatures; - let unexpectedSigners; - await Promise.all( - keyPairs.map(async (keyPair) => { - const address2 = await getAddressFromPublicKey(keyPair.publicKey); - const existingSignature = transaction.signatures[address2]; - if (existingSignature === void 0) { - unexpectedSigners ||= /* @__PURE__ */ new Set(); - unexpectedSigners.add(address2); - return; - } - if (unexpectedSigners) { - return; - } - const newSignature = await signBytes(keyPair.privateKey, transaction.messageBytes); - if (existingSignature !== null && bytesEqual(newSignature, existingSignature)) { - return; - } - newSignatures ||= {}; - newSignatures[address2] = newSignature; - }) - ); - if (unexpectedSigners && unexpectedSigners.size > 0) { - const expectedSigners = Object.keys(transaction.signatures); - throw new SolanaError(SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, { - expectedAddresses: expectedSigners, - unexpectedAddresses: [...unexpectedSigners] - }); - } - if (!newSignatures) { - return transaction; - } - return Object.freeze({ - ...transaction, - signatures: Object.freeze({ - ...transaction.signatures, - ...newSignatures - }) - }); -} -async function signTransaction2(keyPairs, transaction) { - const out = await partiallySignTransaction(keyPairs, transaction); - assertIsFullySignedTransaction(out); - Object.freeze(out); - return out; -} -function isFullySignedTransaction(transaction) { - return Object.entries(transaction.signatures).every(([_, signatureBytes2]) => !!signatureBytes2); -} -function assertIsFullySignedTransaction(transaction) { - const missingSigs = []; - Object.entries(transaction.signatures).forEach(([address2, signatureBytes2]) => { - if (!signatureBytes2) { - missingSigs.push(address2); - } - }); - if (missingSigs.length > 0) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, { - addresses: missingSigs - }); - } -} -function getBase64EncodedWireTransaction(transaction) { - const wireTransactionBytes = getTransactionEncoder().encode(transaction); - return getBase64Decoder().decode(wireTransactionBytes); -} -function getTransactionSize(transaction) { - return getTransactionEncoder().getSizeFromValue(transaction); -} -function isTransactionWithinSizeLimit(transaction) { - return getTransactionSize(transaction) <= TRANSACTION_SIZE_LIMIT; -} -function assertIsTransactionWithinSizeLimit(transaction) { - const transactionSize = getTransactionSize(transaction); - if (transactionSize > TRANSACTION_SIZE_LIMIT) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, { - transactionSize, - transactionSizeLimit: TRANSACTION_SIZE_LIMIT - }); - } -} -function isSendableTransaction(transaction) { - return isFullySignedTransaction(transaction) && isTransactionWithinSizeLimit(transaction); -} -function assertIsSendableTransaction(transaction) { - assertIsFullySignedTransaction(transaction); - assertIsTransactionWithinSizeLimit(transaction); -} -function getTransactionMessageSize(transactionMessage) { - return getTransactionSize(compileTransaction(transactionMessage)); -} -function isTransactionMessageWithinSizeLimit(transactionMessage) { - return getTransactionMessageSize(transactionMessage) <= TRANSACTION_SIZE_LIMIT; -} -function assertIsTransactionMessageWithinSizeLimit(transactionMessage) { - const transactionSize = getTransactionMessageSize(transactionMessage); - if (transactionSize > TRANSACTION_SIZE_LIMIT) { - throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, { - transactionSize, - transactionSizeLimit: TRANSACTION_SIZE_LIMIT - }); - } -} -var SYSTEM_PROGRAM_ADDRESS2, base58Decoder, TRANSACTION_PACKET_SIZE, TRANSACTION_PACKET_HEADER, TRANSACTION_SIZE_LIMIT; -var init_index_node16 = __esm({ - "node_modules/@solana/transactions/dist/index.node.mjs"() { - "use strict"; - init_index_node6(); - init_index_node2(); - init_index_node8(); - init_index_node7(); - init_index_node(); - init_index_node14(); - init_index_node13(); - init_index_node3(); - init_index_node15(); - SYSTEM_PROGRAM_ADDRESS2 = "11111111111111111111111111111111"; - TRANSACTION_PACKET_SIZE = 1280; - TRANSACTION_PACKET_HEADER = 40 + 8; - TRANSACTION_SIZE_LIMIT = TRANSACTION_PACKET_SIZE - TRANSACTION_PACKET_HEADER; - } -}); - -// node_modules/@solana/promises/dist/index.node.mjs -function isObject(value) { - return value !== null && (typeof value === "object" || typeof value === "function"); -} -function addRaceContender(contender) { - const deferreds = /* @__PURE__ */ new Set(); - const record = { deferreds, settled: false }; - Promise.resolve(contender).then( - (value) => { - for (const { resolve } of deferreds) { - resolve(value); - } - deferreds.clear(); - record.settled = true; - }, - (err) => { - for (const { reject } of deferreds) { - reject(err); - } - deferreds.clear(); - record.settled = true; - } - ); - return record; -} -async function safeRace(contenders) { - let deferred; - const result = new Promise((resolve, reject) => { - deferred = { reject, resolve }; - for (const contender of contenders) { - if (!isObject(contender)) { - Promise.resolve(contender).then(resolve, reject); - continue; - } - let record = wm.get(contender); - if (record === void 0) { - record = addRaceContender(contender); - record.deferreds.add(deferred); - wm.set(contender, record); - } else if (record.settled) { - Promise.resolve(contender).then(resolve, reject); - } else { - record.deferreds.add(deferred); - } - } - }); - return await result.finally(() => { - for (const contender of contenders) { - if (isObject(contender)) { - const record = wm.get(contender); - record.deferreds.delete(deferred); - } - } - }); -} -function getAbortablePromise(promise, abortSignal) { - if (!abortSignal) { - return promise; - } else { - return safeRace([ - // This promise only ever rejects if the signal is aborted. Otherwise it idles forever. - // It's important that this come before the input promise; in the event of an abort, we - // want to throw even if the input promise's result is ready - new Promise((_, reject) => { - if (abortSignal.aborted) { - reject(abortSignal.reason); - } else { - abortSignal.addEventListener("abort", function() { - reject(this.reason); - }); - } - }), - promise - ]); - } -} -var wm; -var init_index_node17 = __esm({ - "node_modules/@solana/promises/dist/index.node.mjs"() { - "use strict"; - wm = /* @__PURE__ */ new WeakMap(); - } -}); - -// node_modules/@solana/instruction-plans/dist/index.node.mjs -function parallelInstructionPlan(plans) { - return Object.freeze({ - kind: "parallel", - plans: parseSingleInstructionPlans(plans) - }); -} -function sequentialInstructionPlan(plans) { - return Object.freeze({ - divisible: true, - kind: "sequential", - plans: parseSingleInstructionPlans(plans) - }); -} -function nonDivisibleSequentialInstructionPlan(plans) { - return Object.freeze({ - divisible: false, - kind: "sequential", - plans: parseSingleInstructionPlans(plans) - }); -} -function singleInstructionPlan(instruction) { - return Object.freeze({ instruction, kind: "single" }); -} -function parseSingleInstructionPlans(plans) { - return plans.map((plan) => "kind" in plan ? plan : singleInstructionPlan(plan)); -} -function isSingleInstructionPlan(plan) { - return plan.kind === "single"; -} -function assertIsSingleInstructionPlan(plan) { - if (!isSingleInstructionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { - actualKind: plan.kind, - expectedKind: "single", - instructionPlan: plan - }); - } -} -function isMessagePackerInstructionPlan(plan) { - return plan.kind === "messagePacker"; -} -function assertIsMessagePackerInstructionPlan(plan) { - if (!isMessagePackerInstructionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { - actualKind: plan.kind, - expectedKind: "messagePacker", - instructionPlan: plan - }); - } -} -function isSequentialInstructionPlan(plan) { - return plan.kind === "sequential"; -} -function assertIsSequentialInstructionPlan(plan) { - if (!isSequentialInstructionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { - actualKind: plan.kind, - expectedKind: "sequential", - instructionPlan: plan - }); - } -} -function isNonDivisibleSequentialInstructionPlan(plan) { - return plan.kind === "sequential" && plan.divisible === false; -} -function assertIsNonDivisibleSequentialInstructionPlan(plan) { - if (!isNonDivisibleSequentialInstructionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { - actualKind: plan.kind === "sequential" ? "divisible sequential" : plan.kind, - expectedKind: "non-divisible sequential", - instructionPlan: plan - }); - } -} -function isParallelInstructionPlan(plan) { - return plan.kind === "parallel"; -} -function assertIsParallelInstructionPlan(plan) { - if (!isParallelInstructionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { - actualKind: plan.kind, - expectedKind: "parallel", - instructionPlan: plan - }); - } -} -function findInstructionPlan(instructionPlan, predicate) { - if (predicate(instructionPlan)) { - return instructionPlan; - } - if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { - return void 0; - } - for (const subPlan of instructionPlan.plans) { - const foundPlan = findInstructionPlan(subPlan, predicate); - if (foundPlan) { - return foundPlan; - } - } - return void 0; -} -function everyInstructionPlan(instructionPlan, predicate) { - if (!predicate(instructionPlan)) { - return false; - } - if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { - return true; - } - return instructionPlan.plans.every((p) => everyInstructionPlan(p, predicate)); -} -function transformInstructionPlan(instructionPlan, fn) { - if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { - return Object.freeze(fn(instructionPlan)); - } - return Object.freeze( - fn( - Object.freeze({ - ...instructionPlan, - plans: instructionPlan.plans.map((p) => transformInstructionPlan(p, fn)) - }) - ) - ); -} -function flattenInstructionPlan(instructionPlan) { - if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { - return [instructionPlan]; - } - return instructionPlan.plans.flatMap(flattenInstructionPlan); -} -function getLinearMessagePackerInstructionPlan({ - getInstruction, - totalLength: totalBytes -}) { - return Object.freeze({ - getMessagePacker: () => { - let offset = 0; - return Object.freeze({ - done: () => offset >= totalBytes, - packMessageToCapacity: (message) => { - if (offset >= totalBytes) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE); - } - const messageSizeWithBaseInstruction = getTransactionMessageSize( - appendTransactionMessageInstruction(getInstruction(offset, 0), message) - ); - const freeSpace = TRANSACTION_SIZE_LIMIT - messageSizeWithBaseInstruction - 1; - if (freeSpace <= 0) { - const messageSize = getTransactionMessageSize(message); - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, { - // (+1) We need to pack at least one byte of data otherwise - // there is no point packing the base instruction alone. - numBytesRequired: messageSizeWithBaseInstruction - messageSize + 1, - // (-1) Leeway for shortU16 numbers in transaction headers. - numFreeBytes: TRANSACTION_SIZE_LIMIT - messageSize - 1 - }); - } - const length = Math.min(totalBytes - offset, freeSpace); - const instruction = getInstruction(offset, length); - offset += length; - return appendTransactionMessageInstruction(instruction, message); - } - }); - }, - kind: "messagePacker" - }); -} -function getMessagePackerInstructionPlanFromInstructions(instructions) { - return Object.freeze({ - getMessagePacker: () => { - let instructionIndex = 0; - return Object.freeze({ - done: () => instructionIndex >= instructions.length, - packMessageToCapacity: (message) => { - if (instructionIndex >= instructions.length) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE); - } - const originalMessageSize = getTransactionMessageSize(message); - for (let index2 = instructionIndex; index2 < instructions.length; index2++) { - message = appendTransactionMessageInstruction(instructions[index2], message); - const messageSize = getTransactionMessageSize(message); - if (messageSize > TRANSACTION_SIZE_LIMIT) { - if (index2 === instructionIndex) { - throw new SolanaError( - SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, - { - numBytesRequired: messageSize - originalMessageSize, - numFreeBytes: TRANSACTION_SIZE_LIMIT - originalMessageSize - } - ); - } - instructionIndex = index2; - return message; - } - } - instructionIndex = instructions.length; - return message; - } - }); - }, - kind: "messagePacker" - }); -} -function getReallocMessagePackerInstructionPlan({ - getInstruction, - totalSize -}) { - const numberOfInstructions = Math.ceil(totalSize / REALLOC_LIMIT); - const lastInstructionSize = totalSize % REALLOC_LIMIT; - const instructions = new Array(numberOfInstructions).fill(0).map((_, i) => getInstruction(i === numberOfInstructions - 1 ? lastInstructionSize : REALLOC_LIMIT)); - return getMessagePackerInstructionPlanFromInstructions(instructions); -} -function appendTransactionMessageInstructionPlan(instructionPlan, transactionMessage) { - const leafInstructionPlans = flattenInstructionPlan(instructionPlan); - return leafInstructionPlans.reduce( - (messageSoFar, plan) => { - const kind = plan.kind; - if (kind === "single") { - return appendTransactionMessageInstruction(plan.instruction, messageSoFar); - } - if (kind === "messagePacker") { - const messagerPacker = plan.getMessagePacker(); - let nextMessage = messageSoFar; - while (!messagerPacker.done()) { - nextMessage = messagerPacker.packMessageToCapacity(nextMessage); - } - return nextMessage; - } - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { - kind - }); - }, - transactionMessage - ); -} -function parallelTransactionPlan(plans) { - return Object.freeze({ kind: "parallel", plans: parseSingleTransactionPlans(plans) }); -} -function sequentialTransactionPlan(plans) { - return Object.freeze({ divisible: true, kind: "sequential", plans: parseSingleTransactionPlans(plans) }); -} -function nonDivisibleSequentialTransactionPlan(plans) { - return Object.freeze({ divisible: false, kind: "sequential", plans: parseSingleTransactionPlans(plans) }); -} -function singleTransactionPlan(transactionMessage) { - return Object.freeze({ kind: "single", message: transactionMessage }); -} -function parseSingleTransactionPlans(plans) { - return plans.map((plan) => "kind" in plan ? plan : singleTransactionPlan(plan)); -} -function isSingleTransactionPlan(plan) { - return plan.kind === "single"; -} -function assertIsSingleTransactionPlan(plan) { - if (!isSingleTransactionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { - actualKind: plan.kind, - expectedKind: "single", - transactionPlan: plan - }); - } -} -function isSequentialTransactionPlan(plan) { - return plan.kind === "sequential"; -} -function assertIsSequentialTransactionPlan(plan) { - if (!isSequentialTransactionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { - actualKind: plan.kind, - expectedKind: "sequential", - transactionPlan: plan - }); - } -} -function isNonDivisibleSequentialTransactionPlan(plan) { - return plan.kind === "sequential" && plan.divisible === false; -} -function assertIsNonDivisibleSequentialTransactionPlan(plan) { - if (!isNonDivisibleSequentialTransactionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { - actualKind: plan.kind === "sequential" ? "divisible sequential" : plan.kind, - expectedKind: "non-divisible sequential", - transactionPlan: plan - }); - } -} -function isParallelTransactionPlan(plan) { - return plan.kind === "parallel"; -} -function assertIsParallelTransactionPlan(plan) { - if (!isParallelTransactionPlan(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { - actualKind: plan.kind, - expectedKind: "parallel", - transactionPlan: plan - }); - } -} -function flattenTransactionPlan(transactionPlan) { - if (transactionPlan.kind === "single") { - return [transactionPlan]; - } - return transactionPlan.plans.flatMap(flattenTransactionPlan); -} -function findTransactionPlan(transactionPlan, predicate) { - if (predicate(transactionPlan)) { - return transactionPlan; - } - if (transactionPlan.kind === "single") { - return void 0; - } - for (const subPlan of transactionPlan.plans) { - const foundPlan = findTransactionPlan(subPlan, predicate); - if (foundPlan) { - return foundPlan; - } - } - return void 0; -} -function everyTransactionPlan(transactionPlan, predicate) { - if (!predicate(transactionPlan)) { - return false; - } - if (transactionPlan.kind === "single") { - return true; - } - return transactionPlan.plans.every((p) => everyTransactionPlan(p, predicate)); -} -function transformTransactionPlan(transactionPlan, fn) { - if (transactionPlan.kind === "single") { - return Object.freeze(fn(transactionPlan)); - } - return Object.freeze( - fn( - Object.freeze({ - ...transactionPlan, - plans: transactionPlan.plans.map((p) => transformTransactionPlan(p, fn)) - }) - ) - ); -} -function sequentialTransactionPlanResult(plans) { - return Object.freeze({ divisible: true, kind: "sequential", plans }); -} -function nonDivisibleSequentialTransactionPlanResult(plans) { - return Object.freeze({ divisible: false, kind: "sequential", plans }); -} -function parallelTransactionPlanResult(plans) { - return Object.freeze({ kind: "parallel", plans }); -} -function successfulSingleTransactionPlanResult(transactionMessage, transaction, context) { - return Object.freeze({ - kind: "single", - message: transactionMessage, - status: Object.freeze({ - context: context ?? {}, - kind: "successful", - signature: getSignatureFromTransaction(transaction), - transaction - }) - }); -} -function successfulSingleTransactionPlanResultFromSignature(transactionMessage, signature2, context) { - return Object.freeze({ - kind: "single", - message: transactionMessage, - status: Object.freeze({ context: context ?? {}, kind: "successful", signature: signature2 }) - }); -} -function failedSingleTransactionPlanResult(transactionMessage, error) { - return Object.freeze({ - kind: "single", - message: transactionMessage, - status: Object.freeze({ error, kind: "failed" }) - }); -} -function canceledSingleTransactionPlanResult(transactionMessage) { - return Object.freeze({ - kind: "single", - message: transactionMessage, - status: Object.freeze({ kind: "canceled" }) - }); -} -function isSingleTransactionPlanResult(plan) { - return plan.kind === "single"; -} -function assertIsSingleTransactionPlanResult(plan) { - if (!isSingleTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { - actualKind: plan.kind, - expectedKind: "single", - transactionPlanResult: plan - }); - } -} -function isSuccessfulSingleTransactionPlanResult(plan) { - return plan.kind === "single" && plan.status.kind === "successful"; -} -function assertIsSuccessfulSingleTransactionPlanResult(plan) { - if (!isSuccessfulSingleTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { - actualKind: plan.kind === "single" ? `${plan.status.kind} single` : plan.kind, - expectedKind: "successful single", - transactionPlanResult: plan - }); - } -} -function isFailedSingleTransactionPlanResult(plan) { - return plan.kind === "single" && plan.status.kind === "failed"; -} -function assertIsFailedSingleTransactionPlanResult(plan) { - if (!isFailedSingleTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { - actualKind: plan.kind === "single" ? `${plan.status.kind} single` : plan.kind, - expectedKind: "failed single", - transactionPlanResult: plan - }); - } -} -function isCanceledSingleTransactionPlanResult(plan) { - return plan.kind === "single" && plan.status.kind === "canceled"; -} -function assertIsCanceledSingleTransactionPlanResult(plan) { - if (!isCanceledSingleTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { - actualKind: plan.kind === "single" ? `${plan.status.kind} single` : plan.kind, - expectedKind: "canceled single", - transactionPlanResult: plan - }); - } -} -function isSequentialTransactionPlanResult(plan) { - return plan.kind === "sequential"; -} -function assertIsSequentialTransactionPlanResult(plan) { - if (!isSequentialTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { - actualKind: plan.kind, - expectedKind: "sequential", - transactionPlanResult: plan - }); - } -} -function isNonDivisibleSequentialTransactionPlanResult(plan) { - return plan.kind === "sequential" && plan.divisible === false; -} -function assertIsNonDivisibleSequentialTransactionPlanResult(plan) { - if (!isNonDivisibleSequentialTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { - actualKind: plan.kind === "sequential" ? "divisible sequential" : plan.kind, - expectedKind: "non-divisible sequential", - transactionPlanResult: plan - }); - } -} -function isParallelTransactionPlanResult(plan) { - return plan.kind === "parallel"; -} -function assertIsParallelTransactionPlanResult(plan) { - if (!isParallelTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { - actualKind: plan.kind, - expectedKind: "parallel", - transactionPlanResult: plan - }); - } -} -function isSuccessfulTransactionPlanResult(plan) { - return everyTransactionPlanResult( - plan, - (r) => !isSingleTransactionPlanResult(r) || isSuccessfulSingleTransactionPlanResult(r) - ); -} -function assertIsSuccessfulTransactionPlanResult(plan) { - if (!isSuccessfulTransactionPlanResult(plan)) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, { - transactionPlanResult: plan - }); - } -} -function findTransactionPlanResult(transactionPlanResult, predicate) { - if (predicate(transactionPlanResult)) { - return transactionPlanResult; - } - if (transactionPlanResult.kind === "single") { - return void 0; - } - for (const subResult of transactionPlanResult.plans) { - const foundResult = findTransactionPlanResult(subResult, predicate); - if (foundResult) { - return foundResult; - } - } - return void 0; -} -function getFirstFailedSingleTransactionPlanResult(transactionPlanResult) { - const result = findTransactionPlanResult( - transactionPlanResult, - (r) => r.kind === "single" && r.status.kind === "failed" - ); - if (!result) { - const context = {}; - Object.defineProperty(context, "transactionPlanResult", { - configurable: false, - enumerable: false, - value: transactionPlanResult, - writable: false - }); - throw new SolanaError( - SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND, - context - ); - } - return result; -} -function everyTransactionPlanResult(transactionPlanResult, predicate) { - if (!predicate(transactionPlanResult)) { - return false; - } - if (transactionPlanResult.kind === "single") { - return true; - } - return transactionPlanResult.plans.every((p) => everyTransactionPlanResult(p, predicate)); -} -function transformTransactionPlanResult(transactionPlanResult, fn) { - if (transactionPlanResult.kind === "single") { - return Object.freeze(fn(transactionPlanResult)); - } - return Object.freeze( - fn( - Object.freeze({ - ...transactionPlanResult, - plans: transactionPlanResult.plans.map((p) => transformTransactionPlanResult(p, fn)) - }) - ) - ); -} -function flattenTransactionPlanResult(result) { - if (result.kind === "single") { - return [result]; - } - return result.plans.flatMap(flattenTransactionPlanResult); -} -function summarizeTransactionPlanResult(result) { - const successfulTransactions = []; - const failedTransactions = []; - const canceledTransactions = []; - const flattenedResults = flattenTransactionPlanResult(result); - for (const singleResult of flattenedResults) { - switch (singleResult.status.kind) { - case "successful": { - successfulTransactions.push(singleResult); - break; - } - case "failed": { - failedTransactions.push(singleResult); - break; - } - case "canceled": { - canceledTransactions.push(singleResult); - break; - } - } - } - return Object.freeze({ - canceledTransactions, - failedTransactions, - successful: failedTransactions.length === 0 && canceledTransactions.length === 0, - successfulTransactions - }); -} -function createTransactionPlanExecutor(config) { - return async (plan, { abortSignal } = {}) => { - const context = { - ...config, - abortSignal, - canceled: abortSignal?.aborted ?? false - }; - assertDivisibleSequentialPlansOnly(plan); - const cancelHandler = () => { - context.canceled = true; - }; - abortSignal?.addEventListener("abort", cancelHandler); - const transactionPlanResult = await traverse(plan, context); - abortSignal?.removeEventListener("abort", cancelHandler); - if (context.canceled) { - const abortReason = abortSignal?.aborted ? abortSignal.reason : void 0; - const context2 = { cause: findErrorFromTransactionPlanResult(transactionPlanResult) ?? abortReason }; - Object.defineProperty(context2, "transactionPlanResult", { - configurable: false, - enumerable: false, - value: transactionPlanResult, - writable: false - }); - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, context2); - } - return transactionPlanResult; - }; -} -async function traverse(transactionPlan, context) { - const kind = transactionPlan.kind; - switch (kind) { - case "sequential": - return await traverseSequential(transactionPlan, context); - case "parallel": - return await traverseParallel(transactionPlan, context); - case "single": - return await traverseSingle(transactionPlan, context); - default: - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind }); - } -} -async function traverseSequential(transactionPlan, context) { - if (!transactionPlan.divisible) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED); - } - const results = []; - for (const subPlan of transactionPlan.plans) { - const result = await traverse(subPlan, context); - results.push(result); - } - return sequentialTransactionPlanResult(results); -} -async function traverseParallel(transactionPlan, context) { - const results = await Promise.all(transactionPlan.plans.map((plan) => traverse(plan, context))); - return parallelTransactionPlanResult(results); -} -async function traverseSingle(transactionPlan, context) { - if (context.canceled) { - return canceledSingleTransactionPlanResult(transactionPlan.message); - } - try { - const result = await getAbortablePromise( - context.executeTransactionMessage(transactionPlan.message, { abortSignal: context.abortSignal }), - context.abortSignal - ); - if ("transaction" in result) { - return successfulSingleTransactionPlanResult(transactionPlan.message, result.transaction, result.context); - } else { - return successfulSingleTransactionPlanResultFromSignature( - transactionPlan.message, - result.signature, - result.context - ); - } - } catch (error) { - context.canceled = true; - return failedSingleTransactionPlanResult(transactionPlan.message, error); - } -} -function findErrorFromTransactionPlanResult(result) { - if (result.kind === "single") { - return result.status.kind === "failed" ? result.status.error : void 0; - } - for (const plan of result.plans) { - const error = findErrorFromTransactionPlanResult(plan); - if (error) { - return error; - } - } -} -function assertDivisibleSequentialPlansOnly(transactionPlan) { - const kind = transactionPlan.kind; - switch (kind) { - case "sequential": - if (!transactionPlan.divisible) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED); - } - for (const subPlan of transactionPlan.plans) { - assertDivisibleSequentialPlansOnly(subPlan); - } - return; - case "parallel": - for (const subPlan of transactionPlan.plans) { - assertDivisibleSequentialPlansOnly(subPlan); - } - return; - case "single": - default: - return; - } -} -async function passthroughFailedTransactionPlanExecution(promise) { - try { - return await promise; - } catch (error) { - if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN)) { - return error.context.transactionPlanResult; - } - throw error; - } -} -function createTransactionPlanner(config) { - return async (instructionPlan, { abortSignal } = {}) => { - const plan = await traverse2(instructionPlan, { - abortSignal, - createTransactionMessage: config.createTransactionMessage, - onTransactionMessageUpdated: config.onTransactionMessageUpdated ?? ((msg) => msg), - parent: null, - parentCandidates: [] - }); - if (!plan) { - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN); - } - return freezeTransactionPlan(plan); - }; -} -async function traverse2(instructionPlan, context) { - context.abortSignal?.throwIfAborted(); - const kind = instructionPlan.kind; - switch (kind) { - case "sequential": - return await traverseSequential2(instructionPlan, context); - case "parallel": - return await traverseParallel2(instructionPlan, context); - case "single": - return await traverseSingle2(instructionPlan, context); - case "messagePacker": - return await traverseMessagePacker(instructionPlan, context); - default: - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind }); - } -} -async function traverseSequential2(instructionPlan, context) { - let candidate = null; - const mustEntirelyFitInParentCandidate = context.parent && (context.parent.kind === "parallel" || !instructionPlan.divisible); - if (mustEntirelyFitInParentCandidate) { - const candidate2 = await selectAndMutateCandidate( - context, - context.parentCandidates, - (message) => fitEntirePlanInsideMessage(instructionPlan, message) - ); - if (candidate2) { - return null; - } - } else { - candidate = context.parentCandidates.length > 0 ? context.parentCandidates[0] : null; - } - const transactionPlans = []; - for (const plan of instructionPlan.plans) { - const transactionPlan = await traverse2(plan, { - ...context, - parent: instructionPlan, - parentCandidates: candidate ? [candidate] : [] - }); - if (transactionPlan) { - candidate = getSequentialCandidate(transactionPlan); - const newPlans = transactionPlan.kind === "sequential" && (transactionPlan.divisible || !instructionPlan.divisible) ? transactionPlan.plans : [transactionPlan]; - transactionPlans.push(...newPlans); - } - } - if (transactionPlans.length === 1) { - return transactionPlans[0]; - } - if (transactionPlans.length === 0) { - return null; - } - return { - divisible: instructionPlan.divisible, - kind: "sequential", - plans: transactionPlans - }; -} -async function traverseParallel2(instructionPlan, context) { - const candidates = [...context.parentCandidates]; - const transactionPlans = []; - const sortedChildren = Array.from(instructionPlan.plans).sort( - (a, b) => Number(a.kind === "messagePacker") - Number(b.kind === "messagePacker") - ); - for (const plan of sortedChildren) { - const transactionPlan = await traverse2(plan, { - ...context, - parent: instructionPlan, - parentCandidates: candidates - }); - if (transactionPlan) { - candidates.push(...getParallelCandidates(transactionPlan)); - const newPlans = transactionPlan.kind === "parallel" ? transactionPlan.plans : [transactionPlan]; - transactionPlans.push(...newPlans); - } - } - if (transactionPlans.length === 1) { - return transactionPlans[0]; - } - if (transactionPlans.length === 0) { - return null; - } - return { kind: "parallel", plans: transactionPlans }; -} -async function traverseSingle2(instructionPlan, context) { - const predicate = (message2) => appendTransactionMessageInstructions([instructionPlan.instruction], message2); - const candidate = await selectAndMutateCandidate(context, context.parentCandidates, predicate); - if (candidate) { - return null; - } - const message = await createNewMessage(context, predicate); - return { kind: "single", message }; -} -async function traverseMessagePacker(instructionPlan, context) { - const messagePacker = instructionPlan.getMessagePacker(); - const transactionPlans = []; - const candidates = [...context.parentCandidates]; - while (!messagePacker.done()) { - const candidate = await selectAndMutateCandidate(context, candidates, messagePacker.packMessageToCapacity); - if (!candidate) { - const message = await createNewMessage(context, messagePacker.packMessageToCapacity); - const newPlan = { kind: "single", message }; - transactionPlans.push(newPlan); - } - } - if (transactionPlans.length === 1) { - return transactionPlans[0]; - } - if (transactionPlans.length === 0) { - return null; - } - if (context.parent?.kind === "parallel") { - return { kind: "parallel", plans: transactionPlans }; - } - return { - divisible: context.parent?.kind === "sequential" ? context.parent.divisible : true, - kind: "sequential", - plans: transactionPlans - }; -} -function getSequentialCandidate(latestPlan) { - if (latestPlan.kind === "single") { - return latestPlan; - } - if (latestPlan.kind === "sequential" && latestPlan.plans.length > 0) { - return getSequentialCandidate(latestPlan.plans[latestPlan.plans.length - 1]); - } - return null; -} -function getParallelCandidates(latestPlan) { - return flattenTransactionPlan(latestPlan); -} -async function selectAndMutateCandidate(context, candidates, predicate) { - for (const candidate of candidates) { - try { - const message = await getAbortablePromise( - Promise.resolve( - context.onTransactionMessageUpdated(predicate(candidate.message), { - abortSignal: context.abortSignal - }) - ), - context.abortSignal - ); - if (getTransactionMessageSize(message) <= TRANSACTION_SIZE_LIMIT) { - candidate.message = message; - return candidate; - } - } catch (error) { - if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN)) ; - else { - throw error; - } - } - } - return null; -} -async function createNewMessage(context, predicate) { - const newMessage = await getAbortablePromise( - Promise.resolve(context.createTransactionMessage({ abortSignal: context.abortSignal })), - context.abortSignal - ); - const updatedMessage = await getAbortablePromise( - Promise.resolve( - context.onTransactionMessageUpdated(predicate(newMessage), { abortSignal: context.abortSignal }) - ), - context.abortSignal - ); - const updatedMessageSize = getTransactionMessageSize(updatedMessage); - if (updatedMessageSize > TRANSACTION_SIZE_LIMIT) { - const newMessageSize = getTransactionMessageSize(newMessage); - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, { - numBytesRequired: updatedMessageSize - newMessageSize, - numFreeBytes: TRANSACTION_SIZE_LIMIT - newMessageSize - }); - } - return updatedMessage; -} -function freezeTransactionPlan(plan) { - const kind = plan.kind; - switch (kind) { - case "single": - return singleTransactionPlan(plan.message); - case "sequential": - return plan.divisible ? sequentialTransactionPlan(plan.plans.map(freezeTransactionPlan)) : nonDivisibleSequentialTransactionPlan(plan.plans.map(freezeTransactionPlan)); - case "parallel": - return parallelTransactionPlan(plan.plans.map(freezeTransactionPlan)); - default: - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind }); - } -} -function fitEntirePlanInsideMessage(instructionPlan, message) { - let newMessage = message; - const kind = instructionPlan.kind; - switch (kind) { - case "sequential": - case "parallel": - for (const plan of instructionPlan.plans) { - newMessage = fitEntirePlanInsideMessage(plan, newMessage); - } - return newMessage; - case "single": - newMessage = appendTransactionMessageInstructions([instructionPlan.instruction], message); - const newMessageSize = getTransactionMessageSize(newMessage); - if (newMessageSize > TRANSACTION_SIZE_LIMIT) { - const baseMessageSize = getTransactionMessageSize(message); - throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, { - numBytesRequired: newMessageSize - baseMessageSize, - numFreeBytes: TRANSACTION_SIZE_LIMIT - baseMessageSize - }); - } - return newMessage; - case "messagePacker": - const messagePacker = instructionPlan.getMessagePacker(); - while (!messagePacker.done()) { - newMessage = messagePacker.packMessageToCapacity(newMessage); - } - return newMessage; - default: - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind }); - } -} -var REALLOC_LIMIT, getAllSingleTransactionPlans; -var init_index_node18 = __esm({ - "node_modules/@solana/instruction-plans/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node14(); - init_index_node16(); - init_index_node17(); - REALLOC_LIMIT = 10240; - getAllSingleTransactionPlans = flattenTransactionPlan; - } -}); - -// node_modules/@solana/offchain-messages/dist/index.node.mjs -function isOffchainMessageApplicationDomain(putativeApplicationDomain) { - return isAddress2(putativeApplicationDomain); -} -function assertIsOffchainMessageApplicationDomain(putativeApplicationDomain) { - try { - assertIsAddress(putativeApplicationDomain); - } catch (error) { - if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) { - throw new SolanaError( - SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE, - error.context - ); - } - if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) { - throw new SolanaError( - SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH, - error.context - ); - } - throw error; - } -} -function offchainMessageApplicationDomain(putativeApplicationDomain) { - assertIsOffchainMessageApplicationDomain(putativeApplicationDomain); - return putativeApplicationDomain; -} -function getOffchainMessageApplicationDomainEncoder() { - return transformEncoder( - getAddressEncoder(), - (putativeApplicationDomain) => offchainMessageApplicationDomain(putativeApplicationDomain) - ); -} -function getOffchainMessageApplicationDomainDecoder() { - return getAddressDecoder(); -} -function getOffchainMessageApplicationDomainCodec() { - return combineCodec(getOffchainMessageApplicationDomainEncoder(), getOffchainMessageApplicationDomainDecoder()); -} -function getOffchainMessageSigningDomainDecoder() { - return getConstantDecoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES); -} -function getOffchainMessageSigningDomainEncoder() { - return getConstantEncoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES); -} -function getSigningDomainPrefixedDecoder(...fields) { - return getHiddenPrefixDecoder(getStructDecoder(fields), [getOffchainMessageSigningDomainDecoder()]); -} -function getSigningDomainPrefixedEncoder(...fields) { - return getHiddenPrefixEncoder(getStructEncoder(fields), [getOffchainMessageSigningDomainEncoder()]); -} -function getVersionTransformer(fixedVersion) { - return (version4) => { - if (version4 > 1) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { - unsupportedVersion: version4 - }); - } - if (fixedVersion != null && version4 !== fixedVersion) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, { - actualVersion: version4, - expectedVersion: fixedVersion - }); - } - return version4; - }; -} -function createOffchainMessagePreambleDecoder(version4, ...fields) { - return getSigningDomainPrefixedDecoder( - ["version", transformDecoder(getU8Decoder(), getVersionTransformer(version4))], - ...fields - ); -} -function createOffchainMessagePreambleEncoder(version4, ...fields) { - return getSigningDomainPrefixedEncoder( - ["version", transformEncoder(getU8Encoder(), getVersionTransformer(version4))], - ...fields - ); -} -function decodeRequiredSignatoryAddresses(bytes) { - const { version: version4, bytesAfterVersion } = getSigningDomainPrefixedDecoder( - ["version", transformDecoder(getU8Decoder(), getVersionTransformer())], - ["bytesAfterVersion", getBytesDecoder()] - ).decode(bytes); - return offsetDecoder( - transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), (signatoryAddresses) => { - if (signatoryAddresses.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); - } - return signatoryAddresses; - }), - { - preOffset: ({ preOffset }) => preOffset + (version4 === 0 ? 32 + 1 : 0) - } - ).decode(bytesAfterVersion); -} -function getSignatoriesComparator() { - return (x, y) => { - if (x.length !== y.length) { - return x.length < y.length ? -1 : 1; - } - for (let ii = 0; ii < x.length; ii++) { - if (x[ii] === y[ii]) { - continue; - } else { - return x[ii] < y[ii] ? -1 : 1; - } - } - return 0; - }; -} -function getSignaturesToEncode2(signaturesMap) { - const signatures = Object.values(signaturesMap); - if (signatures.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO); - } - return signatures.map((signature2) => { - if (!signature2) { - return new Uint8Array(64).fill(0); - } - return signature2; - }); -} -function getSignaturesEncoder2() { - return transformEncoder( - getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getU8Encoder() }), - getSignaturesToEncode2 - ); -} -function getOffchainMessageEnvelopeEncoder() { - return transformEncoder( - getStructEncoder([ - ["signatures", getSignaturesEncoder2()], - ["content", getBytesEncoder()] - ]), - (envelope) => { - const signaturesMapAddresses = Object.keys(envelope.signatures).map(address); - if (signaturesMapAddresses.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO); - } - const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(envelope.content); - const missingRequiredSigners = []; - const unexpectedSigners = []; - for (const address2 of signatoryAddresses) { - if (!signaturesMapAddresses.includes(address2)) { - missingRequiredSigners.push(address2); - } - } - for (const address2 of signaturesMapAddresses) { - if (!signatoryAddresses.includes(address2)) { - unexpectedSigners.push(address2); - } - } - if (missingRequiredSigners.length || unexpectedSigners.length) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, { - missingRequiredSigners, - unexpectedSigners - }); - } - const orderedSignatureMap = {}; - for (const address2 of signatoryAddresses) { - orderedSignatureMap[address2] = envelope.signatures[address2]; - } - return { - ...envelope, - signatures: orderedSignatureMap - }; - } - ); -} -function getOffchainMessageEnvelopeDecoder() { - return transformDecoder( - getStructDecoder([ - ["signatures", getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getU8Decoder() })], - ["content", getBytesDecoder()] - ]), - decodePartiallyDecodedOffchainMessageEnvelope - ); -} -function getOffchainMessageEnvelopeCodec() { - return combineCodec(getOffchainMessageEnvelopeEncoder(), getOffchainMessageEnvelopeDecoder()); -} -function decodePartiallyDecodedOffchainMessageEnvelope(offchainMessageEnvelope) { - const { content, signatures } = offchainMessageEnvelope; - if (signatures.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO); - } - const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(content); - if (signatoryAddresses.length !== signatures.length) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, { - numRequiredSignatures: signatoryAddresses.length, - signatoryAddresses, - signaturesLength: signatures.length - }); - } - const signaturesMap = {}; - signatoryAddresses.forEach((address2, index2) => { - const signatureForAddress = signatures[index2]; - if (signatureForAddress.every((b) => b === 0)) { - signaturesMap[address2] = null; - } else { - signaturesMap[address2] = signatureForAddress; - } - }); - return Object.freeze({ - content, - signatures: Object.freeze(signaturesMap) - }); -} -function decodeAndValidateRequiredSignatoryAddresses(bytes) { - const signatoryAddresses = decodeRequiredSignatoryAddresses(bytes); - if (signatoryAddresses.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); - } - return signatoryAddresses; -} -function assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent) { - if (putativeContent.format !== 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, { - actualMessageFormat: putativeContent.format, - expectedMessageFormat: 0 - /* RESTRICTED_ASCII_1232_BYTES_MAX */ - }); - } - if (putativeContent.text.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); - } - if (isTextRestrictedAscii(putativeContent.text) === false) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE); - } - const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); - if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, { - actualBytes: length, - maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE - }); - } -} -function isOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent) { - if (putativeContent.format !== 0 || putativeContent.text.length === 0 || isTextRestrictedAscii(putativeContent.text) === false) { - return false; - } - const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); - return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE; -} -function offchainMessageContentRestrictedAsciiOf1232BytesMax(text) { - const putativeContent = Object.freeze({ - format: 0, - text - }); - assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent); - return putativeContent; -} -function assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent) { - if (putativeContent.text.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); - } - if (putativeContent.format !== 1) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, { - actualMessageFormat: putativeContent.format, - expectedMessageFormat: 1 - /* UTF8_1232_BYTES_MAX */ - }); - } - const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); - if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, { - actualBytes: length, - maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE - }); - } -} -function isOffchainMessageContentUtf8Of1232BytesMax(putativeContent) { - if (putativeContent.format !== 1 || putativeContent.text.length === 0) { - return false; - } - const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); - return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE; -} -function offchainMessageContentUtf8Of1232BytesMax(text) { - const putativeContent = Object.freeze({ - format: 1, - text - }); - assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent); - return putativeContent; -} -function assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent) { - if (putativeContent.format !== 2) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, { - actualMessageFormat: putativeContent.format, - expectedMessageFormat: 2 - /* UTF8_65535_BYTES_MAX */ - }); - } - if (putativeContent.text.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); - } - const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); - if (length > MAX_BODY_BYTES) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, { - actualBytes: length, - maxBytes: MAX_BODY_BYTES - }); - } -} -function isOffchainMessageContentUtf8Of65535BytesMax(putativeContent) { - if (putativeContent.format !== 2 || putativeContent.text.length === 0) { - return false; - } - const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); - return length <= MAX_BODY_BYTES; -} -function offchainMessageContentUtf8Of65535BytesMax(text) { - const putativeContent = Object.freeze({ - format: 2, - text - }); - assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent); - return putativeContent; -} -function isTextRestrictedAscii(putativeRestrictedAsciiString) { - return /^[\x20-\x7e]+$/.test(putativeRestrictedAsciiString); -} -function assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(putativeMessage) { - assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeMessage.content); -} -function assertIsOffchainMessageUtf8Of1232BytesMax(putativeMessage) { - assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeMessage.content); -} -function assertIsOffchainMessageUtf8Of65535BytesMax(putativeMessage) { - assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeMessage.content); -} -function getOffchainMessageContentFormatDecoder() { - return getEnumDecoder(OffchainMessageContentFormat, { - useValuesAsDiscriminators: true - }); -} -function getOffchainMessageContentFormatEncoder() { - return getEnumEncoder(OffchainMessageContentFormat, { - useValuesAsDiscriminators: true - }); -} -function getOffchainMessageV0PreambleDecoder() { - return createOffchainMessagePreambleDecoder( - /* version */ - 0, - ["applicationDomain", getOffchainMessageApplicationDomainDecoder()], - ["messageFormat", getOffchainMessageContentFormatDecoder()], - [ - "requiredSignatories", - transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), (signatoryAddresses) => { - if (signatoryAddresses.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); - } - return signatoryAddresses.map((address2) => Object.freeze({ address: address2 })); - }) - ], - ["messageLength", getU16Decoder()] - ); -} -function getOffchainMessageV0PreambleEncoder() { - return createOffchainMessagePreambleEncoder( - /* version */ - 0, - ["applicationDomain", getOffchainMessageApplicationDomainEncoder()], - ["messageFormat", getOffchainMessageContentFormatEncoder()], - [ - "requiredSignatories", - transformEncoder( - getArrayEncoder(getAddressEncoder(), { size: getU8Encoder() }), - (signatoryAddresses) => { - if (signatoryAddresses.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); - } - return signatoryAddresses.map(({ address: address2 }) => address2); - } - ) - ], - ["messageLength", getU16Encoder()] - ); -} -function getOffchainMessageV0Decoder() { - return transformDecoder( - getTupleDecoder([getOffchainMessageV0PreambleDecoder(), getUtf8Decoder()]), - ([{ messageLength, messageFormat, requiredSignatories, ...preambleRest }, text]) => { - const actualLength = getUtf8Encoder().getSizeFromValue(text); - if (messageLength !== actualLength) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, { - actualLength, - specifiedLength: messageLength - }); - } - const offchainMessage = Object.freeze({ - ...preambleRest, - content: Object.freeze({ - format: messageFormat, - text - }), - requiredSignatories: Object.freeze(requiredSignatories) - }); - switch (messageFormat) { - case 0: { - assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage); - return offchainMessage; - } - case 1: { - assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage); - return offchainMessage; - } - case 2: { - assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage); - return offchainMessage; - } - default: { - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { - unexpectedValue: messageFormat - }); - } - } - } - ); -} -function getOffchainMessageV0Encoder() { - return transformEncoder( - getTupleEncoder([getOffchainMessageV0PreambleEncoder(), getUtf8Encoder()]), - (offchainMessage) => { - const { content, ...preamble } = offchainMessage; - switch (offchainMessage.content.format) { - case 0: { - assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage); - break; - } - case 1: { - assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage); - break; - } - case 2: { - assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage); - break; - } - default: { - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { - unexpectedValue: offchainMessage.content - }); - } - } - const messageLength = getUtf8Encoder().getSizeFromValue(content.text); - const compiledPreamble = { - ...preamble, - messageFormat: content.format, - messageLength - }; - return [compiledPreamble, content.text]; - } - ); -} -function getOffchainMessageV0Codec() { - return combineCodec(getOffchainMessageV0Encoder(), getOffchainMessageV0Decoder()); -} -function getOffchainMessageV1PreambleDecoder() { - return createOffchainMessagePreambleDecoder( - /* version */ - 1, - [ - "requiredSignatories", - transformDecoder( - getArrayDecoder(fixDecoderSize(getBytesDecoder(), 32), { size: getU8Decoder() }), - (signatoryAddressesBytes) => { - if (signatoryAddressesBytes.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); - } - const comparator = getSignatoriesComparator(); - for (let ii = 0; ii < signatoryAddressesBytes.length - 1; ii++) { - switch (comparator(signatoryAddressesBytes[ii], signatoryAddressesBytes[ii + 1])) { - case 0: - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE); - case 1: - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED); - } - } - const addressDecoder = getAddressDecoder(); - return signatoryAddressesBytes.map( - (addressBytes) => Object.freeze({ - address: addressDecoder.decode(addressBytes) - }) - ); - } - ) - ] - ); -} -function getOffchainMessageV1PreambleEncoder() { - return createOffchainMessagePreambleEncoder( - /* version */ - 1, - [ - "requiredSignatories", - transformEncoder( - transformEncoder( - getArrayEncoder(getBytesEncoder(), { size: getU8Encoder() }), - (signatoryAddressesBytes) => { - return signatoryAddressesBytes.toSorted(getSignatoriesComparator()); - } - ), - (signatoryAddresses) => { - if (signatoryAddresses.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); - } - const seenSignatories = /* @__PURE__ */ new Set(); - for (const { address: address2 } of signatoryAddresses) { - if (seenSignatories.has(address2)) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE); - } - seenSignatories.add(address2); - } - const addressEncoder = getAddressEncoder(); - return signatoryAddresses.map(({ address: address2 }) => addressEncoder.encode(address2)); - } - ) - ] - ); -} -function getOffchainMessageV1Decoder() { - return transformDecoder( - getTupleDecoder([getOffchainMessageV1PreambleDecoder(), getUtf8Decoder()]), - ([{ requiredSignatories, ...preambleRest }, text]) => { - if (text.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); - } - return Object.freeze({ - ...preambleRest, - content: text, - requiredSignatories: Object.freeze(requiredSignatories) - }); - } - ); -} -function getOffchainMessageV1Encoder() { - return transformEncoder( - getTupleEncoder([getOffchainMessageV1PreambleEncoder(), getUtf8Encoder()]), - (offchainMessage) => { - const { content, ...compiledPreamble } = offchainMessage; - if (content.length === 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); - } - return [compiledPreamble, content]; - } - ); -} -function getOffchainMessageV1Codec() { - return combineCodec(getOffchainMessageV1Encoder(), getOffchainMessageV1Decoder()); -} -function getOffchainMessageDecoder() { - return createDecoder({ - read(bytes, offset) { - const version4 = getHiddenPrefixDecoder(getU8Decoder(), [ - // Discard the signing domain - getOffchainMessageSigningDomainDecoder() - ]).decode(bytes, offset); - switch (version4) { - case 0: - return getOffchainMessageV0Decoder().read(bytes, offset); - case 1: - return getOffchainMessageV1Decoder().read(bytes, offset); - default: - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { - unsupportedVersion: version4 - }); - } - } - }); -} -function getOffchainMessageEncoder() { - return createEncoder({ - getSizeFromValue: (offchainMessage) => { - const { version: version4 } = offchainMessage; - switch (version4) { - case 0: - return getOffchainMessageV0Encoder().getSizeFromValue(offchainMessage); - case 1: - return getOffchainMessageV1Encoder().getSizeFromValue(offchainMessage); - default: - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { - unsupportedVersion: version4 - }); - } - }, - write: (offchainMessage, bytes, offset) => { - const { version: version4 } = offchainMessage; - switch (version4) { - case 0: - return getOffchainMessageV0Encoder().write(offchainMessage, bytes, offset); - case 1: - return getOffchainMessageV1Encoder().write(offchainMessage, bytes, offset); - default: - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { - unsupportedVersion: version4 - }); - } - } - }); -} -function getOffchainMessageCodec() { - return combineCodec(getOffchainMessageEncoder(), getOffchainMessageDecoder()); -} -function compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, encoder5) { - const offchainMessageBytes = encoder5.encode(offchainMessage); - const signatures = {}; - for (const { address: address2 } of offchainMessage.requiredSignatories) { - signatures[address2] = null; - } - return Object.freeze({ - content: offchainMessageBytes, - signatures: Object.freeze(signatures) - }); -} -function compileOffchainMessageV0Envelope(offchainMessage) { - return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV0Encoder()); -} -function compileOffchainMessageV1Envelope(offchainMessage) { - return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV1Encoder()); -} -function compileOffchainMessageEnvelope(offchainMessage) { - const { version: version4 } = offchainMessage; - switch (version4) { - case 0: - return compileOffchainMessageV0Envelope(offchainMessage); - case 1: - return compileOffchainMessageV1Envelope(offchainMessage); - default: - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { - unexpectedValue: version4 - }); - } -} -async function partiallySignOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope) { - let newSignatures; - let unexpectedSigners; - const requiredSignatoryAddresses = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content); - await Promise.all( - keyPairs.map(async (keyPair) => { - const address2 = await getAddressFromPublicKey(keyPair.publicKey); - if (!requiredSignatoryAddresses.includes(address2)) { - unexpectedSigners ||= /* @__PURE__ */ new Set(); - unexpectedSigners.add(address2); - return; - } - if (unexpectedSigners) { - return; - } - const existingSignature = offchainMessageEnvelope.signatures[address2]; - const newSignature = await signBytes(keyPair.privateKey, offchainMessageEnvelope.content); - if (existingSignature != null && bytesEqual(newSignature, existingSignature)) { - return; - } - newSignatures ||= {}; - newSignatures[address2] = newSignature; - }) - ); - if (unexpectedSigners && unexpectedSigners.size > 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, { - expectedAddresses: requiredSignatoryAddresses, - unexpectedAddresses: [...unexpectedSigners] - }); - } - if (!newSignatures) { - return offchainMessageEnvelope; - } - return Object.freeze({ - ...offchainMessageEnvelope, - signatures: Object.freeze({ - ...offchainMessageEnvelope.signatures, - ...newSignatures - }) - }); -} -async function signOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope) { - const out = await partiallySignOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope); - assertIsFullySignedOffchainMessageEnvelope(out); - Object.freeze(out); - return out; -} -function isFullySignedOffchainMessageEnvelope(offchainMessage) { - return Object.entries(offchainMessage.signatures).every(([_, signatureBytes2]) => !!signatureBytes2); -} -function assertIsFullySignedOffchainMessageEnvelope(offchainMessage) { - const missingSigs = []; - Object.entries(offchainMessage.signatures).forEach(([address2, signatureBytes2]) => { - if (!signatureBytes2) { - missingSigs.push(address2); - } - }); - if (missingSigs.length > 0) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, { - addresses: missingSigs - }); - } -} -async function verifyOffchainMessageEnvelope(offchainMessageEnvelope) { - let errorContext; - const requiredSignatories = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content); - await Promise.all( - requiredSignatories.map(async (address2) => { - const signature2 = offchainMessageEnvelope.signatures[address2]; - if (signature2 == null) { - errorContext ||= {}; - errorContext.signatoriesWithMissingSignatures ||= []; - errorContext.signatoriesWithMissingSignatures.push(address2); - } else { - const publicKey = await getPublicKeyFromAddress(address2); - if (await verifySignature(publicKey, signature2, offchainMessageEnvelope.content)) { - return true; - } else { - errorContext ||= {}; - errorContext.signatoriesWithInvalidSignatures ||= []; - errorContext.signatoriesWithInvalidSignatures.push(address2); - } - } - }) - ); - if (errorContext) { - throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, errorContext); - } -} -var OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES, MAX_BODY_BYTES, MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE, OffchainMessageContentFormat; -var init_index_node19 = __esm({ - "node_modules/@solana/offchain-messages/dist/index.node.mjs"() { - "use strict"; - init_index_node6(); - init_index_node(); - init_index_node2(); - init_index_node8(); - init_index_node7(); - init_index_node3(); - init_index_node15(); - OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES = new Uint8Array([ - 255, - 115, - 111, - 108, - 97, - 110, - 97, - 32, - 111, - 102, - 102, - 99, - 104, - 97, - 105, - 110 - ]); - MAX_BODY_BYTES = // Largest 16-bit unsigned integer - 65535; - MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE = // Space remaining in the mininum IPv6 MTU after network header overhead - 1232; - OffchainMessageContentFormat = /* @__PURE__ */ ((OffchainMessageContentFormat3) => { - OffchainMessageContentFormat3[OffchainMessageContentFormat3["RESTRICTED_ASCII_1232_BYTES_MAX"] = 0] = "RESTRICTED_ASCII_1232_BYTES_MAX"; - OffchainMessageContentFormat3[OffchainMessageContentFormat3["UTF8_1232_BYTES_MAX"] = 1] = "UTF8_1232_BYTES_MAX"; - OffchainMessageContentFormat3[OffchainMessageContentFormat3["UTF8_65535_BYTES_MAX"] = 2] = "UTF8_65535_BYTES_MAX"; - return OffchainMessageContentFormat3; - })(OffchainMessageContentFormat || {}); - } -}); - -// node_modules/@solana/plugin-core/dist/index.node.mjs -function createEmptyClient() { - return addUse({}); -} -function addUse(value) { - return Object.freeze({ - ...value, - use(plugin) { - const result = plugin(value); - return result instanceof Promise ? createAsyncClient(result) : addUse(result); - } - }); -} -function createAsyncClient(promise) { - return Object.freeze({ - catch(onrejected) { - return promise.then((v) => addUse(v)).catch(onrejected); - }, - finally(onfinally) { - return promise.then((v) => addUse(v)).finally(onfinally); - }, - then(onfulfilled, onrejected) { - return promise.then((v) => addUse(v)).then(onfulfilled, onrejected); - }, - use(plugin) { - return createAsyncClient(promise.then(plugin)); - } - }); -} -var init_index_node20 = __esm({ - "node_modules/@solana/plugin-core/dist/index.node.mjs"() { - "use strict"; - } -}); - -// node_modules/@solana/programs/dist/index.node.mjs -function isProgramError(error, transactionMessage, programAddress, code) { - if (!isSolanaError(error, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM)) { - return false; - } - const instructionProgramAddress = transactionMessage.instructions[error.context.index]?.programAddress; - if (!instructionProgramAddress || instructionProgramAddress !== programAddress) { - return false; - } - return typeof code === "undefined" || error.context.code === code; -} -var init_index_node21 = __esm({ - "node_modules/@solana/programs/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - } -}); - -// node_modules/@solana/rpc-spec-types/dist/index.node.mjs -function parseJsonWithBigInts(json) { - return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => { - return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value; - }); -} -function wrapIntegersInBigIntValueObject(json) { - const out = []; - let inQuote = false; - for (let ii = 0; ii < json.length; ii++) { - let isEscaped = false; - if (json[ii] === "\\") { - out.push(json[ii++]); - isEscaped = !isEscaped; - } - if (json[ii] === '"') { - out.push(json[ii]); - if (!isEscaped) { - inQuote = !inQuote; - } - continue; - } - if (!inQuote) { - const consumedNumber = consumeNumber(json, ii); - if (consumedNumber?.length) { - ii += consumedNumber.length - 1; - if (consumedNumber.match(/\.|[eE]-/)) { - out.push(consumedNumber); - } else { - out.push(wrapBigIntValueObject(consumedNumber)); - } - continue; - } - } - out.push(json[ii]); - } - return out.join(""); -} -function consumeNumber(json, ii) { - const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/; - if (!json[ii]?.match(/[-\d]/)) { - return null; - } - const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX); - return numberMatch ? numberMatch[0] : null; -} -function wrapBigIntValueObject(value) { - return `{"$n":"${value}"}`; -} -function unwrapBigIntValueObject({ $n }) { - if ($n.match(/[eE]/)) { - const [units, exponent] = $n.split(/[eE]/); - return BigInt(units) * BigInt(10) ** BigInt(exponent); - } - return BigInt($n); -} -function isBigIntValueObject(value) { - return !!value && typeof value === "object" && "$n" in value && typeof value.$n === "string"; -} -function getNextMessageId() { - const id = _nextMessageId; - _nextMessageId++; - return id.toString(); -} -function createRpcMessage(request) { - return { - id: getNextMessageId(), - jsonrpc: "2.0", - method: request.methodName, - params: request.params - }; -} -function stringifyJsonWithBigInts(value, space) { - return unwrapBigIntValueObject2( - JSON.stringify(value, (_, v) => typeof v === "bigint" ? wrapBigIntValueObject2(v) : v, space) - ); -} -function wrapBigIntValueObject2(value) { - return { $n: `${value}` }; -} -function unwrapBigIntValueObject2(value) { - return value.replace(/\{\s*"\$n"\s*:\s*"(-?\d+)"\s*\}/g, "$1"); -} -var _nextMessageId; -var init_index_node22 = __esm({ - "node_modules/@solana/rpc-spec-types/dist/index.node.mjs"() { - "use strict"; - _nextMessageId = 0n; - } -}); - -// node_modules/@solana/rpc-spec/dist/index.node.mjs -function createRpc(rpcConfig) { - return makeProxy(rpcConfig); -} -function makeProxy(rpcConfig) { - return new Proxy(rpcConfig.api, { - defineProperty() { - return false; - }, - deleteProperty() { - return false; - }, - get(target, p, receiver) { - if (p === "then") { - return void 0; - } - return function(...rawParams) { - const methodName = p.toString(); - const getApiPlan = Reflect.get(target, methodName, receiver); - if (!getApiPlan) { - throw new SolanaError(SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, { - method: methodName, - params: rawParams - }); - } - const apiPlan = getApiPlan(...rawParams); - return createPendingRpcRequest(rpcConfig, apiPlan); - }; - } - }); -} -function createPendingRpcRequest({ transport }, plan) { - return { - async send(options) { - return await plan.execute({ signal: options?.abortSignal, transport }); - } - }; -} -function createJsonRpcApi(config) { - return new Proxy({}, { - defineProperty() { - return false; - }, - deleteProperty() { - return false; - }, - get(...args) { - const [_, p] = args; - const methodName = p.toString(); - return function(...rawParams) { - const rawRequest = Object.freeze({ methodName, params: rawParams }); - const request = config?.requestTransformer ? config?.requestTransformer(rawRequest) : rawRequest; - return Object.freeze({ - execute: async ({ signal, transport }) => { - const payload = createRpcMessage(request); - const response = await transport({ payload, signal }); - if (!config?.responseTransformer) { - return response; - } - return config.responseTransformer(response, request); - } - }); - }; - } - }); -} -function isJsonRpcPayload(payload) { - if (payload == null || typeof payload !== "object" || Array.isArray(payload)) { - return false; - } - return "jsonrpc" in payload && payload.jsonrpc === "2.0" && "method" in payload && typeof payload.method === "string" && "params" in payload; -} -var init_index_node23 = __esm({ - "node_modules/@solana/rpc-spec/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node22(); - } -}); - -// node_modules/@solana/rpc-transformers/dist/index.node.mjs -function downcastNodeToNumberIfBigint(value) { - return typeof value === "bigint" ? ( - // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana - // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely - // downcasting `bigints` to `numbers`. - Number(value) - ) : value; -} -function getTreeWalker(visitors) { - return function traverse3(node, state) { - if (Array.isArray(node)) { - return node.map((element, ii) => { - const nextState = { - ...state, - keyPath: [...state.keyPath, ii] - }; - return traverse3(element, nextState); - }); - } else if (typeof node === "object" && node !== null) { - const out = {}; - for (const propName in node) { - if (!Object.prototype.hasOwnProperty.call(node, propName)) { - continue; - } - const nextState = { - ...state, - keyPath: [...state.keyPath, propName] - }; - out[propName] = traverse3(node[propName], nextState); - } - return out; - } else { - return visitors.reduce((acc, visitNode) => visitNode(acc, state), node); - } - }; -} -function getTreeWalkerRequestTransformer(visitors, initialState) { - return (request) => { - const traverse3 = getTreeWalker(visitors); - return Object.freeze({ - ...request, - params: traverse3(request.params, initialState) - }); - }; -} -function getTreeWalkerResponseTransformer(visitors, initialState) { - return (json) => getTreeWalker(visitors)(json, initialState); -} -function getBigIntDowncastRequestTransformer() { - return getTreeWalkerRequestTransformer([downcastNodeToNumberIfBigint], { keyPath: [] }); -} -function applyDefaultCommitment({ - commitmentPropertyName, - params, - optionsObjectPositionInParams, - overrideCommitment -}) { - const paramInTargetPosition = params[optionsObjectPositionInParams]; - if ( - // There's no config. - paramInTargetPosition === void 0 || // There is a config object. - paramInTargetPosition && typeof paramInTargetPosition === "object" && !Array.isArray(paramInTargetPosition) - ) { - if ( - // The config object already has a commitment set. - paramInTargetPosition && commitmentPropertyName in paramInTargetPosition - ) { - if (!paramInTargetPosition[commitmentPropertyName] || paramInTargetPosition[commitmentPropertyName] === "finalized") { - const nextParams = [...params]; - const { - [commitmentPropertyName]: _, - // eslint-disable-line @typescript-eslint/no-unused-vars - ...rest - } = paramInTargetPosition; - if (Object.keys(rest).length > 0) { - nextParams[optionsObjectPositionInParams] = rest; - } else { - if (optionsObjectPositionInParams === nextParams.length - 1) { - nextParams.length--; - } else { - nextParams[optionsObjectPositionInParams] = void 0; - } - } - return nextParams; - } - } else if (overrideCommitment !== "finalized") { - const nextParams = [...params]; - nextParams[optionsObjectPositionInParams] = { - ...paramInTargetPosition, - [commitmentPropertyName]: overrideCommitment - }; - return nextParams; - } - } - return params; -} -function getDefaultCommitmentRequestTransformer({ - defaultCommitment, - optionsObjectPositionByMethod -}) { - return (request) => { - const { params, methodName } = request; - if (!Array.isArray(params)) { - return request; - } - const optionsObjectPositionInParams = optionsObjectPositionByMethod[methodName]; - if (optionsObjectPositionInParams == null) { - return request; - } - return Object.freeze({ - methodName, - params: applyDefaultCommitment({ - commitmentPropertyName: methodName === "sendTransaction" ? "preflightCommitment" : "commitment", - optionsObjectPositionInParams, - overrideCommitment: defaultCommitment, - params - }) - }); - }; -} -function getIntegerOverflowNodeVisitor(onIntegerOverflow) { - return (value, { keyPath }) => { - if (typeof value === "bigint") { - if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) { - onIntegerOverflow(keyPath, value); - } - } - return value; - }; -} -function getIntegerOverflowRequestTransformer(onIntegerOverflow) { - return (request) => { - const transformer = getTreeWalkerRequestTransformer( - [getIntegerOverflowNodeVisitor((...args) => onIntegerOverflow(request, ...args))], - { keyPath: [] } - ); - return transformer(request); - }; -} -function getDefaultRequestTransformerForSolanaRpc(config) { - const handleIntegerOverflow = config?.onIntegerOverflow; - return (request) => { - return pipe( - request, - handleIntegerOverflow ? getIntegerOverflowRequestTransformer(handleIntegerOverflow) : (r) => r, - getBigIntDowncastRequestTransformer(), - getDefaultCommitmentRequestTransformer({ - defaultCommitment: config?.defaultCommitment, - optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD - }) - ); - }; -} -function getBigIntUpcastVisitor(allowedNumericKeyPaths) { - return function upcastNodeToBigIntIfNumber(value, { keyPath }) { - const isInteger = typeof value === "number" && Number.isInteger(value) || typeof value === "bigint"; - if (!isInteger) return value; - if (keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) { - return Number(value); - } else { - return BigInt(value); - } - }; -} -function keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths) { - return allowedNumericKeyPaths.some((prohibitedKeyPath) => { - if (prohibitedKeyPath.length !== keyPath.length) { - return false; - } - for (let ii = keyPath.length - 1; ii >= 0; ii--) { - const keyPathPart = keyPath[ii]; - const prohibitedKeyPathPart = prohibitedKeyPath[ii]; - if (prohibitedKeyPathPart !== keyPathPart && (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== "number")) { - return false; - } - } - return true; - }); -} -function getBigIntUpcastResponseTransformer(allowedNumericKeyPaths) { - return getTreeWalkerResponseTransformer([getBigIntUpcastVisitor(allowedNumericKeyPaths)], { keyPath: [] }); -} -function getResultResponseTransformer() { - return (json) => json.result; -} -function getSimulateTransactionAllowedNumericKeypaths() { - return [ - ["loadedAccountsDataSize"], - ...jsonParsedAccountsConfigs.map((c2) => ["accounts", KEYPATH_WILDCARD, ...c2]), - ...innerInstructionsConfigs.map((c2) => ["innerInstructions", KEYPATH_WILDCARD, ...c2]) - ]; -} -function getThrowSolanaErrorResponseTransformer() { - return (json, request) => { - const jsonRpcResponse = json; - if ("error" in jsonRpcResponse) { - const { error } = jsonRpcResponse; - const isSendTransactionPreflightFailure = error && typeof error === "object" && "code" in error && (error.code === -32002 || error.code === -32002n); - if (isSendTransactionPreflightFailure && "data" in error && error.data) { - const treeWalker = getTreeWalkerResponseTransformer( - [getBigIntUpcastVisitor(getSimulateTransactionAllowedNumericKeypaths())], - { keyPath: [] } - ); - const transformedData = treeWalker(error.data, request); - const transformedError = { ...error, data: transformedData }; - throw getSolanaErrorFromJsonRpcError(transformedError); - } - throw getSolanaErrorFromJsonRpcError(jsonRpcResponse.error); - } - return jsonRpcResponse; - }; -} -function getDefaultResponseTransformerForSolanaRpc(config) { - return (response, request) => { - const methodName = request.methodName; - const keyPaths = config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : void 0; - return pipe( - response, - (r) => getThrowSolanaErrorResponseTransformer()(r, request), - (r) => getResultResponseTransformer()(r, request), - (r) => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request) - ); - }; -} -function getDefaultResponseTransformerForSolanaRpcSubscriptions(config) { - return (response, request) => { - const methodName = request.methodName; - const keyPaths = config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : void 0; - return pipe(response, (r) => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request)); - }; -} -var KEYPATH_WILDCARD, OPTIONS_OBJECT_POSITION_BY_METHOD, jsonParsedTokenAccountsConfigs, jsonParsedAccountsConfigs, innerInstructionsConfigs, messageConfig; -var init_index_node24 = __esm({ - "node_modules/@solana/rpc-transformers/dist/index.node.mjs"() { - "use strict"; - init_index_node11(); - init_index_node(); - KEYPATH_WILDCARD = {}; - OPTIONS_OBJECT_POSITION_BY_METHOD = { - accountNotifications: 1, - blockNotifications: 1, - getAccountInfo: 1, - getBalance: 1, - getBlock: 1, - getBlockHeight: 0, - getBlockProduction: 0, - getBlocks: 2, - getBlocksWithLimit: 2, - getEpochInfo: 0, - getFeeForMessage: 1, - getInflationGovernor: 0, - getInflationReward: 1, - getLargestAccounts: 0, - getLatestBlockhash: 0, - getLeaderSchedule: 1, - getMinimumBalanceForRentExemption: 1, - getMultipleAccounts: 1, - getProgramAccounts: 1, - getSignaturesForAddress: 1, - getSlot: 0, - getSlotLeader: 0, - getStakeMinimumDelegation: 0, - getSupply: 0, - getTokenAccountBalance: 1, - getTokenAccountsByDelegate: 2, - getTokenAccountsByOwner: 2, - getTokenLargestAccounts: 1, - getTokenSupply: 1, - getTransaction: 1, - getTransactionCount: 0, - getVoteAccounts: 0, - isBlockhashValid: 1, - logsNotifications: 1, - programNotifications: 1, - requestAirdrop: 2, - sendTransaction: 1, - signatureNotifications: 1, - simulateTransaction: 1 - }; - jsonParsedTokenAccountsConfigs = [ - // parsed Token/Token22 token account - ["data", "parsed", "info", "tokenAmount", "decimals"], - ["data", "parsed", "info", "tokenAmount", "uiAmount"], - ["data", "parsed", "info", "rentExemptReserve", "decimals"], - ["data", "parsed", "info", "rentExemptReserve", "uiAmount"], - ["data", "parsed", "info", "delegatedAmount", "decimals"], - ["data", "parsed", "info", "delegatedAmount", "uiAmount"], - ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "olderTransferFee", "transferFeeBasisPoints"], - ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "newerTransferFee", "transferFeeBasisPoints"], - ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "preUpdateAverageRate"], - ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "currentRate"] - ]; - jsonParsedAccountsConfigs = [ - ...jsonParsedTokenAccountsConfigs, - // parsed AddressTableLookup account - ["data", "parsed", "info", "lastExtendedSlotStartIndex"], - // parsed Config account - ["data", "parsed", "info", "slashPenalty"], - ["data", "parsed", "info", "warmupCooldownRate"], - // parsed Token/Token22 mint account - ["data", "parsed", "info", "decimals"], - // parsed Token/Token22 multisig account - ["data", "parsed", "info", "numRequiredSigners"], - ["data", "parsed", "info", "numValidSigners"], - // parsed Stake account - ["data", "parsed", "info", "stake", "delegation", "warmupCooldownRate"], - // parsed Sysvar rent account - ["data", "parsed", "info", "exemptionThreshold"], - ["data", "parsed", "info", "burnPercent"], - // parsed Vote account - ["data", "parsed", "info", "commission"], - ["data", "parsed", "info", "votes", KEYPATH_WILDCARD, "confirmationCount"] - ]; - innerInstructionsConfigs = [ - ["index"], - ["instructions", KEYPATH_WILDCARD, "accounts", KEYPATH_WILDCARD], - ["instructions", KEYPATH_WILDCARD, "programIdIndex"], - ["instructions", KEYPATH_WILDCARD, "stackHeight"] - ]; - messageConfig = [ - ["addressTableLookups", KEYPATH_WILDCARD, "writableIndexes", KEYPATH_WILDCARD], - ["addressTableLookups", KEYPATH_WILDCARD, "readonlyIndexes", KEYPATH_WILDCARD], - ["header", "numReadonlySignedAccounts"], - ["header", "numReadonlyUnsignedAccounts"], - ["header", "numRequiredSignatures"], - ["instructions", KEYPATH_WILDCARD, "accounts", KEYPATH_WILDCARD], - ["instructions", KEYPATH_WILDCARD, "programIdIndex"], - ["instructions", KEYPATH_WILDCARD, "stackHeight"] - ]; - } -}); - -// node_modules/@solana/rpc-api/dist/index.node.mjs -function createSolanaRpcApi(config) { - return createJsonRpcApi({ - requestTransformer: getDefaultRequestTransformerForSolanaRpc(config), - responseTransformer: getDefaultResponseTransformerForSolanaRpc({ - allowedNumericKeyPaths: getAllowedNumericKeypaths() - }) - }); -} -function getAllowedNumericKeypaths() { - if (!memoizedKeypaths) { - memoizedKeypaths = { - getAccountInfo: jsonParsedAccountsConfigs.map((c2) => ["value", ...c2]), - getBlock: [ - ["transactions", KEYPATH_WILDCARD, "meta", "preTokenBalances", KEYPATH_WILDCARD, "accountIndex"], - [ - "transactions", - KEYPATH_WILDCARD, - "meta", - "preTokenBalances", - KEYPATH_WILDCARD, - "uiTokenAmount", - "decimals" - ], - ["transactions", KEYPATH_WILDCARD, "meta", "postTokenBalances", KEYPATH_WILDCARD, "accountIndex"], - [ - "transactions", - KEYPATH_WILDCARD, - "meta", - "postTokenBalances", - KEYPATH_WILDCARD, - "uiTokenAmount", - "decimals" - ], - ["transactions", KEYPATH_WILDCARD, "meta", "rewards", KEYPATH_WILDCARD, "commission"], - ...innerInstructionsConfigs.map((c2) => [ - "transactions", - KEYPATH_WILDCARD, - "meta", - "innerInstructions", - KEYPATH_WILDCARD, - ...c2 - ]), - ...messageConfig.map((c2) => ["transactions", KEYPATH_WILDCARD, "transaction", "message", ...c2]), - ["rewards", KEYPATH_WILDCARD, "commission"] - ], - getClusterNodes: [ - [KEYPATH_WILDCARD, "featureSet"], - [KEYPATH_WILDCARD, "shredVersion"] - ], - getInflationGovernor: [["initial"], ["foundation"], ["foundationTerm"], ["taper"], ["terminal"]], - getInflationRate: [["foundation"], ["total"], ["validator"]], - getInflationReward: [[KEYPATH_WILDCARD, "commission"]], - getMultipleAccounts: jsonParsedAccountsConfigs.map((c2) => ["value", KEYPATH_WILDCARD, ...c2]), - getProgramAccounts: jsonParsedAccountsConfigs.flatMap((c2) => [ - ["value", KEYPATH_WILDCARD, "account", ...c2], - [KEYPATH_WILDCARD, "account", ...c2] - ]), - getRecentPerformanceSamples: [[KEYPATH_WILDCARD, "samplePeriodSecs"]], - getTokenAccountBalance: [ - ["value", "decimals"], - ["value", "uiAmount"] - ], - getTokenAccountsByDelegate: jsonParsedTokenAccountsConfigs.map((c2) => [ - "value", - KEYPATH_WILDCARD, - "account", - ...c2 - ]), - getTokenAccountsByOwner: jsonParsedTokenAccountsConfigs.map((c2) => [ - "value", - KEYPATH_WILDCARD, - "account", - ...c2 - ]), - getTokenLargestAccounts: [ - ["value", KEYPATH_WILDCARD, "decimals"], - ["value", KEYPATH_WILDCARD, "uiAmount"] - ], - getTokenSupply: [ - ["value", "decimals"], - ["value", "uiAmount"] - ], - getTransaction: [ - ["meta", "preTokenBalances", KEYPATH_WILDCARD, "accountIndex"], - ["meta", "preTokenBalances", KEYPATH_WILDCARD, "uiTokenAmount", "decimals"], - ["meta", "postTokenBalances", KEYPATH_WILDCARD, "accountIndex"], - ["meta", "postTokenBalances", KEYPATH_WILDCARD, "uiTokenAmount", "decimals"], - ["meta", "rewards", KEYPATH_WILDCARD, "commission"], - ...innerInstructionsConfigs.map((c2) => ["meta", "innerInstructions", KEYPATH_WILDCARD, ...c2]), - ...messageConfig.map((c2) => ["transaction", "message", ...c2]) - ], - getVersion: [["feature-set"]], - getVoteAccounts: [ - ["current", KEYPATH_WILDCARD, "commission"], - ["delinquent", KEYPATH_WILDCARD, "commission"] - ], - simulateTransaction: [ - ["value", "loadedAccountsDataSize"], - ...jsonParsedAccountsConfigs.map((c2) => ["value", "accounts", KEYPATH_WILDCARD, ...c2]), - ...innerInstructionsConfigs.map((c2) => ["value", "innerInstructions", KEYPATH_WILDCARD, ...c2]) - ] - }; - } - return memoizedKeypaths; -} -var memoizedKeypaths; -var init_index_node25 = __esm({ - "node_modules/@solana/rpc-api/dist/index.node.mjs"() { - "use strict"; - init_index_node23(); - init_index_node24(); - } -}); - -// node_modules/@solana/rpc-transport-http/dist/index.node.mjs -function assertIsAllowedHttpRequestHeaders(headers) { - const badHeaders = Object.keys(headers).filter((headerName) => { - const lowercaseHeaderName = headerName.toLowerCase(); - return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-"); - }); - if (badHeaders.length > 0) { - throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, { - headers: badHeaders - }); - } -} -function normalizeHeaders(headers) { - const out = {}; - for (const headerName in headers) { - out[headerName.toLowerCase()] = headers[headerName]; - } - return out; -} -function createHttpTransport(config) { - if (process.env.NODE_ENV !== "production" && false) ; - const { fromJson, headers, toJson, url } = config; - if (process.env.NODE_ENV !== "production" && headers) { - assertIsAllowedHttpRequestHeaders(headers); - } - let dispatcherConfig; - if ("dispatcher_NODE_ONLY" in config) { - dispatcherConfig = { dispatcher: config.dispatcher_NODE_ONLY }; - } - const customHeaders = headers && normalizeHeaders(headers); - return async function makeHttpRequest({ - payload, - signal - }) { - const body = toJson ? toJson(payload) : JSON.stringify(payload); - const requestInfo = { - ...dispatcherConfig, - body, - headers: { - ...customHeaders, - // Keep these headers lowercase so they will override any user-supplied headers above. - accept: "application/json", - "content-length": body.length.toString(), - "content-type": "application/json; charset=utf-8" - }, - method: "POST", - signal - }; - const response = await fetch(url, requestInfo); - if (!response.ok) { - throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, { - headers: response.headers, - message: response.statusText, - statusCode: response.status - }); - } - if (fromJson) { - return fromJson(await response.text(), payload); - } - return await response.json(); - }; -} -function isSolanaRequest(payload) { - return isJsonRpcPayload(payload) && SOLANA_RPC_METHODS.includes(payload.method); -} -function createHttpTransportForSolanaRpc(config) { - return createHttpTransport({ - ...config, - fromJson: (rawResponse, payload) => isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse), - toJson: (payload) => isSolanaRequest(payload) ? stringifyJsonWithBigInts(payload) : JSON.stringify(payload) - }); -} -var DISALLOWED_HEADERS, FORBIDDEN_HEADERS, SOLANA_RPC_METHODS; -var init_index_node26 = __esm({ - "node_modules/@solana/rpc-transport-http/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node22(); - init_index_node23(); - DISALLOWED_HEADERS = { - accept: true, - "content-length": true, - "content-type": true - }; - FORBIDDEN_HEADERS = /* @__PURE__ */ Object.assign( - { - "accept-charset": true, - "access-control-request-headers": true, - "access-control-request-method": true, - connection: true, - "content-length": true, - cookie: true, - date: true, - dnt: true, - expect: true, - host: true, - "keep-alive": true, - "permissions-policy": true, - // Prefix matching is implemented in code, below. - // 'proxy-': true, - // 'sec-': true, - referer: true, - te: true, - trailer: true, - "transfer-encoding": true, - upgrade: true, - via: true - }, - void 0, - void 0 - ); - SOLANA_RPC_METHODS = [ - "getAccountInfo", - "getBalance", - "getBlock", - "getBlockCommitment", - "getBlockHeight", - "getBlockProduction", - "getBlocks", - "getBlocksWithLimit", - "getBlockTime", - "getClusterNodes", - "getEpochInfo", - "getEpochSchedule", - "getFeeForMessage", - "getFirstAvailableBlock", - "getGenesisHash", - "getHealth", - "getHighestSnapshotSlot", - "getIdentity", - "getInflationGovernor", - "getInflationRate", - "getInflationReward", - "getLargestAccounts", - "getLatestBlockhash", - "getLeaderSchedule", - "getMaxRetransmitSlot", - "getMaxShredInsertSlot", - "getMinimumBalanceForRentExemption", - "getMultipleAccounts", - "getProgramAccounts", - "getRecentPerformanceSamples", - "getRecentPrioritizationFees", - "getSignaturesForAddress", - "getSignatureStatuses", - "getSlot", - "getSlotLeader", - "getSlotLeaders", - "getStakeMinimumDelegation", - "getSupply", - "getTokenAccountBalance", - "getTokenAccountsByDelegate", - "getTokenAccountsByOwner", - "getTokenLargestAccounts", - "getTokenSupply", - "getTransaction", - "getTransactionCount", - "getVersion", - "getVoteAccounts", - "index", - "isBlockhashValid", - "minimumLedgerSlot", - "requestAirdrop", - "sendTransaction", - "simulateTransaction" - ]; - } -}); - -// node_modules/@solana/fast-stable-stringify/dist/index.node.mjs -function stringify3(val, isArrayProp) { - let i, max, str, keys, key, propVal, toStr; - if (val === true) { - return "true"; - } - if (val === false) { - return "false"; - } - switch (typeof val) { - case "object": - if (val === null) { - return null; - } else if ("toJSON" in val && typeof val.toJSON === "function") { - return stringify3(val.toJSON(), isArrayProp); - } else { - toStr = objToString.call(val); - if (toStr === "[object Array]") { - str = "["; - max = val.length - 1; - for (i = 0; i < max; i++) { - str += stringify3(val[i], true) + ","; - } - if (max > -1) { - str += stringify3(val[i], true); - } - return str + "]"; - } else if (toStr === "[object Object]") { - keys = objKeys(val).sort(); - max = keys.length; - str = ""; - i = 0; - while (i < max) { - key = keys[i]; - propVal = stringify3(val[key], false); - if (propVal !== void 0) { - if (str) { - str += ","; - } - str += JSON.stringify(key) + ":" + propVal; - } - i++; - } - return "{" + str + "}"; - } else { - return JSON.stringify(val); - } - } - case "function": - case "undefined": - return isArrayProp ? null : void 0; - case "bigint": - return `${val.toString()}n`; - case "string": - return JSON.stringify(val); - default: - return isFinite(val) ? val : null; - } -} -function index_default(val) { - const returnVal = stringify3(val, false); - if (returnVal !== void 0) { - return "" + returnVal; - } -} -var objToString, objKeys; -var init_index_node27 = __esm({ - "node_modules/@solana/fast-stable-stringify/dist/index.node.mjs"() { - "use strict"; - objToString = Object.prototype.toString; - objKeys = Object.keys || function(obj) { - const keys = []; - for (const name in obj) { - keys.push(name); - } - return keys; - }; - } -}); - -// node_modules/@solana/rpc/dist/index.node.mjs -import { setMaxListeners } from "events"; -function createSolanaJsonRpcIntegerOverflowError(methodName, keyPath, value) { - let argumentLabel = ""; - if (typeof keyPath[0] === "number") { - const argPosition = keyPath[0] + 1; - const lastDigit = argPosition % 10; - const lastTwoDigits = argPosition % 100; - if (lastDigit == 1 && lastTwoDigits != 11) { - argumentLabel = argPosition + "st"; - } else if (lastDigit == 2 && lastTwoDigits != 12) { - argumentLabel = argPosition + "nd"; - } else if (lastDigit == 3 && lastTwoDigits != 13) { - argumentLabel = argPosition + "rd"; - } else { - argumentLabel = argPosition + "th"; - } - } else { - argumentLabel = `\`${keyPath[0].toString()}\``; - } - const path = keyPath.length > 1 ? keyPath.slice(1).map((pathPart) => typeof pathPart === "number" ? `[${pathPart}]` : pathPart).join(".") : void 0; - const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, { - argumentLabel, - keyPath, - methodName, - optionalPathLabel: path ? ` at path \`${path}\`` : "", - value, - ...path !== void 0 ? { path } : void 0 - }); - safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError); - return error; -} -function createExplicitAbortToken() { - return process.env.NODE_ENV !== "production" ? { - EXPLICIT_ABORT_TOKEN: "This object is thrown from the request that underlies a series of coalesced requests when the last request in that series aborts" - } : {}; -} -function getRpcTransportWithRequestCoalescing(transport, getDeduplicationKey) { - let coalescedRequestsByDeduplicationKey; - return async function makeCoalescedHttpRequest(request) { - const { payload, signal } = request; - const deduplicationKey = getDeduplicationKey(payload); - if (deduplicationKey === void 0) { - return await transport(request); - } - if (!coalescedRequestsByDeduplicationKey) { - queueMicrotask(() => { - coalescedRequestsByDeduplicationKey = void 0; - }); - coalescedRequestsByDeduplicationKey = {}; - } - if (coalescedRequestsByDeduplicationKey[deduplicationKey] == null) { - const abortController = new e2(); - const responsePromise = (async () => { - try { - return await transport({ - ...request, - signal: abortController.signal - }); - } catch (e22) { - if (e22 === (EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken())) { - return; - } - throw e22; - } - })(); - coalescedRequestsByDeduplicationKey[deduplicationKey] = { - abortController, - numConsumers: 0, - responsePromise - }; - } - const coalescedRequest = coalescedRequestsByDeduplicationKey[deduplicationKey]; - coalescedRequest.numConsumers++; - if (signal) { - const responsePromise = coalescedRequest.responsePromise; - return await new Promise((resolve, reject) => { - const handleAbort = (e22) => { - signal.removeEventListener("abort", handleAbort); - coalescedRequest.numConsumers -= 1; - queueMicrotask(() => { - if (coalescedRequest.numConsumers === 0) { - const abortController = coalescedRequest.abortController; - abortController.abort(EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken()); - } - }); - reject(e22.target.reason); - }; - signal.addEventListener("abort", handleAbort); - responsePromise.then(resolve).catch(reject).finally(() => { - signal.removeEventListener("abort", handleAbort); - }); - }); - } else { - return await coalescedRequest.responsePromise; - } - }; -} -function getSolanaRpcPayloadDeduplicationKey(payload) { - return isJsonRpcPayload(payload) ? index_default([payload.method, payload.params]) : void 0; -} -function normalizeHeaders2(headers) { - const out = {}; - for (const headerName in headers) { - out[headerName.toLowerCase()] = headers[headerName]; - } - return out; -} -function createDefaultRpcTransport(config) { - return pipe( - createHttpTransportForSolanaRpc({ - ...config, - headers: { - ...{ - // Keep these headers lowercase so they will be overridden by any user-supplied headers below. - "accept-encoding": ( - // Natively supported by Node LTS v20.18.0 and above. - "br,gzip,deflate" - ) - // Brotli, gzip, and Deflate, in that order. - }, - ...config.headers ? normalizeHeaders2(config.headers) : void 0, - ...{ - // Keep these headers lowercase so they will override any user-supplied headers above. - "solana-client": `js/${"5.5.1"}` - } - } - }), - (transport) => getRpcTransportWithRequestCoalescing(transport, getSolanaRpcPayloadDeduplicationKey) - ); -} -function createSolanaRpc(clusterUrl, config) { - return createSolanaRpcFromTransport(createDefaultRpcTransport({ url: clusterUrl, ...config })); -} -function createSolanaRpcFromTransport(transport) { - return createRpc({ - api: createSolanaRpcApi(DEFAULT_RPC_CONFIG), - transport - }); -} -var DEFAULT_RPC_CONFIG, e2, EXPLICIT_ABORT_TOKEN; -var init_index_node28 = __esm({ - "node_modules/@solana/rpc/dist/index.node.mjs"() { - "use strict"; - init_index_node25(); - init_index_node25(); - init_index_node23(); - init_index_node23(); - init_index_node(); - init_index_node11(); - init_index_node26(); - init_index_node27(); - DEFAULT_RPC_CONFIG = { - defaultCommitment: "confirmed", - onIntegerOverflow(request, keyPath, value) { - throw createSolanaJsonRpcIntegerOverflowError(request.methodName, keyPath, value); - } - }; - e2 = class extends globalThis.AbortController { - constructor(...t) { - super(...t), setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal); - } - }; - } -}); - -// node_modules/@solana/rpc-parsed-types/dist/index.node.mjs -var init_index_node29 = __esm({ - "node_modules/@solana/rpc-parsed-types/dist/index.node.mjs"() { - "use strict"; - } -}); - -// node_modules/@solana/subscribable/dist/index.node.mjs -import { setMaxListeners as setMaxListeners2 } from "events"; -function createExplicitAbortToken2() { - return /* @__PURE__ */ Symbol( - process.env.NODE_ENV !== "production" ? "This symbol is thrown from a socket's iterator when the connection is explicitly aborted by the user" : void 0 - ); -} -function createAsyncIterableFromDataPublisher({ - abortSignal, - dataChannelName, - dataPublisher, - errorChannelName -}) { - const iteratorState = /* @__PURE__ */ new Map(); - function publishErrorToAllIterators(reason) { - for (const [iteratorKey, state] of iteratorState.entries()) { - if (state.__hasPolled) { - iteratorState.delete(iteratorKey); - state.onError(reason); - } else { - state.publishQueue.push({ - __type: 1, - err: reason - }); - } - } - } - const abortController = new e3(); - abortSignal.addEventListener("abort", () => { - abortController.abort(); - publishErrorToAllIterators(EXPLICIT_ABORT_TOKEN2 ||= createExplicitAbortToken2()); - }); - const options = { signal: abortController.signal }; - let firstError = UNINITIALIZED; - dataPublisher.on( - errorChannelName, - (err) => { - if (firstError === UNINITIALIZED) { - firstError = err; - abortController.abort(); - publishErrorToAllIterators(err); - } - }, - options - ); - dataPublisher.on( - dataChannelName, - (data) => { - iteratorState.forEach((state, iteratorKey) => { - if (state.__hasPolled) { - const { onData } = state; - iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] }); - onData(data); - } else { - state.publishQueue.push({ - __type: 0, - data - }); - } - }); - }, - options - ); - return { - async *[Symbol.asyncIterator]() { - if (abortSignal.aborted) { - return; - } - if (firstError !== UNINITIALIZED) { - throw firstError; - } - const iteratorKey = /* @__PURE__ */ Symbol(); - iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] }); - try { - while (true) { - const state = iteratorState.get(iteratorKey); - if (!state) { - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING); - } - if (state.__hasPolled) { - throw new SolanaError( - SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE - ); - } - const publishQueue = state.publishQueue; - try { - if (publishQueue.length) { - state.publishQueue = []; - for (const item of publishQueue) { - if (item.__type === 0) { - yield item.data; - } else { - throw item.err; - } - } - } else { - yield await new Promise((resolve, reject) => { - iteratorState.set(iteratorKey, { - __hasPolled: true, - onData: resolve, - onError: reject - }); - }); - } - } catch (e22) { - if (e22 === (EXPLICIT_ABORT_TOKEN2 ||= createExplicitAbortToken2())) { - return; - } else { - throw e22; - } - } - } - } finally { - iteratorState.delete(iteratorKey); - } - } - }; -} -function getDataPublisherFromEventEmitter(eventEmitter) { - return { - on(channelName, subscriber, options) { - function innerListener(ev) { - if (ev instanceof CustomEvent) { - const data = ev.detail; - subscriber(data); - } else { - subscriber(); - } - } - eventEmitter.addEventListener(channelName, innerListener, options); - return () => { - eventEmitter.removeEventListener(channelName, innerListener); - }; - } - }; -} -function demultiplexDataPublisher(publisher, sourceChannelName, messageTransformer) { - let innerPublisherState; - const eventTarget = new s(); - const demultiplexedDataPublisher = getDataPublisherFromEventEmitter(eventTarget); - return { - ...demultiplexedDataPublisher, - on(channelName, subscriber, options) { - if (!innerPublisherState) { - const innerPublisherUnsubscribe = publisher.on(sourceChannelName, (sourceMessage) => { - const transformResult = messageTransformer(sourceMessage); - if (!transformResult) { - return; - } - const [destinationChannelName, message] = transformResult; - eventTarget.dispatchEvent( - new CustomEvent(destinationChannelName, { - detail: message - }) - ); - }); - innerPublisherState = { - dispose: innerPublisherUnsubscribe, - numSubscribers: 0 - }; - } - innerPublisherState.numSubscribers++; - const unsubscribe = demultiplexedDataPublisher.on(channelName, subscriber, options); - let isActive = true; - function handleUnsubscribe() { - if (!isActive) { - return; - } - isActive = false; - options?.signal.removeEventListener("abort", handleUnsubscribe); - innerPublisherState.numSubscribers--; - if (innerPublisherState.numSubscribers === 0) { - innerPublisherState.dispose(); - innerPublisherState = void 0; - } - unsubscribe(); - } - options?.signal.addEventListener("abort", handleUnsubscribe); - return handleUnsubscribe; - } - }; -} -var e3, s, EXPLICIT_ABORT_TOKEN2, UNINITIALIZED; -var init_index_node30 = __esm({ - "node_modules/@solana/subscribable/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - e3 = class extends globalThis.AbortController { - constructor(...t) { - super(...t), setMaxListeners2(Number.MAX_SAFE_INTEGER, this.signal); - } - }; - s = class extends globalThis.EventTarget { - constructor(...t) { - super(...t), setMaxListeners2(Number.MAX_SAFE_INTEGER, this); - } - }; - UNINITIALIZED = /* @__PURE__ */ Symbol(); - } -}); - -// node_modules/@solana/rpc-subscriptions-spec/dist/index.node.mjs -import { setMaxListeners as setMaxListeners3 } from "events"; -function createSubscriptionRpc(rpcConfig) { - return new Proxy(rpcConfig.api, { - defineProperty() { - return false; - }, - deleteProperty() { - return false; - }, - get(target, p, receiver) { - if (p === "then") { - return void 0; - } - return function(...rawParams) { - const notificationName = p.toString(); - const createRpcSubscriptionPlan = Reflect.get(target, notificationName, receiver); - if (!createRpcSubscriptionPlan) { - throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, { - notificationName - }); - } - const subscriptionPlan = createRpcSubscriptionPlan(...rawParams); - return createPendingRpcSubscription(rpcConfig.transport, subscriptionPlan); - }; - } - }); -} -function createPendingRpcSubscription(transport, subscriptionsPlan) { - return { - async subscribe({ abortSignal }) { - const notificationsDataPublisher = await transport({ - signal: abortSignal, - ...subscriptionsPlan - }); - return createAsyncIterableFromDataPublisher({ - abortSignal, - dataChannelName: "notification", - dataPublisher: notificationsDataPublisher, - errorChannelName: "error" - }); - } - }; -} -function createRpcSubscriptionsApi(config) { - return new Proxy({}, { - defineProperty() { - return false; - }, - deleteProperty() { - return false; - }, - get(...args) { - const [_, p] = args; - const methodName = p.toString(); - return function(...params) { - const rawRequest = { methodName, params }; - const request = config.requestTransformer ? config.requestTransformer(rawRequest) : rawRequest; - return { - execute(planConfig) { - return config.planExecutor({ ...planConfig, request }); - }, - request - }; - }; - } - }); -} -function transformChannelInboundMessages(channel, transform) { - return Object.freeze({ - ...channel, - on(type, subscriber, options) { - if (type !== "message") { - return channel.on( - type, - subscriber, - options - ); - } - return channel.on( - "message", - (message) => subscriber(transform(message)), - options - ); - } - }); -} -function transformChannelOutboundMessages(channel, transform) { - return Object.freeze({ - ...channel, - send: (message) => channel.send(transform(message)) - }); -} -function decrementSubscriberCountAndReturnNewCount(channel, subscriptionId) { - return augmentSubscriberCountAndReturnNewCount(-1, channel, subscriptionId); -} -function incrementSubscriberCount(channel, subscriptionId) { - augmentSubscriberCountAndReturnNewCount(1, channel, subscriptionId); -} -function getSubscriberCountBySubscriptionIdForChannel(channel) { - let subscriberCountBySubscriptionId = subscriberCountBySubscriptionIdByChannel.get(channel); - if (!subscriberCountBySubscriptionId) { - subscriberCountBySubscriptionIdByChannel.set(channel, subscriberCountBySubscriptionId = {}); - } - return subscriberCountBySubscriptionId; -} -function augmentSubscriberCountAndReturnNewCount(amount, channel, subscriptionId) { - if (subscriptionId === void 0) { - return; - } - const subscriberCountBySubscriptionId = getSubscriberCountBySubscriptionIdForChannel(channel); - if (!subscriberCountBySubscriptionId[subscriptionId] && amount > 0) { - subscriberCountBySubscriptionId[subscriptionId] = 0; - } - const newCount = amount + subscriberCountBySubscriptionId[subscriptionId]; - if (newCount <= 0) { - delete subscriberCountBySubscriptionId[subscriptionId]; - } else { - subscriberCountBySubscriptionId[subscriptionId] = newCount; - } - return newCount; -} -function getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer(channel, subscribeRequest, responseTransformer) { - let publisherByResponseTransformer = cache.get(channel); - if (!publisherByResponseTransformer) { - cache.set(channel, publisherByResponseTransformer = /* @__PURE__ */ new WeakMap()); - } - const responseTransformerKey = responseTransformer ?? channel; - let publisher = publisherByResponseTransformer.get(responseTransformerKey); - if (!publisher) { - publisherByResponseTransformer.set( - responseTransformerKey, - publisher = demultiplexDataPublisher(channel, "message", (rawMessage) => { - const message = rawMessage; - if (!("method" in message)) { - return; - } - const transformedNotification = responseTransformer ? responseTransformer(message.params.result, subscribeRequest) : message.params.result; - return [`notification:${message.params.subscription}`, transformedNotification]; - }) - ); - } - return publisher; -} -async function executeRpcPubSubSubscriptionPlan({ - channel, - responseTransformer, - signal, - subscribeRequest, - unsubscribeMethodName -}) { - let subscriptionId; - channel.on( - "error", - () => { - subscriptionId = void 0; - subscriberCountBySubscriptionIdByChannel.delete(channel); - }, - { signal } - ); - const abortPromise = new Promise((_, reject) => { - function handleAbort() { - if (decrementSubscriberCountAndReturnNewCount(channel, subscriptionId) === 0) { - const unsubscribePayload = createRpcMessage({ - methodName: unsubscribeMethodName, - params: [subscriptionId] - }); - subscriptionId = void 0; - channel.send(unsubscribePayload).catch(() => { - }); - } - reject(this.reason); - } - if (signal.aborted) { - handleAbort.call(signal); - } else { - signal.addEventListener("abort", handleAbort); - } - }); - const subscribePayload = createRpcMessage(subscribeRequest); - await channel.send(subscribePayload); - const subscriptionIdPromise = new Promise((resolve, reject) => { - const abortController = new e4(); - signal.addEventListener("abort", abortController.abort.bind(abortController)); - const options = { signal: abortController.signal }; - channel.on( - "error", - (err) => { - abortController.abort(); - reject(err); - }, - options - ); - channel.on( - "message", - (message) => { - if (message && typeof message === "object" && "id" in message && message.id === subscribePayload.id) { - abortController.abort(); - if ("error" in message) { - reject(getSolanaErrorFromJsonRpcError(message.error)); - } else { - resolve(message.result); - } - } - }, - options - ); - }); - subscriptionId = await safeRace([abortPromise, subscriptionIdPromise]); - if (subscriptionId == null) { - throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID); - } - incrementSubscriberCount(channel, subscriptionId); - const notificationPublisher = getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer( - channel, - subscribeRequest, - responseTransformer - ); - const notificationKey = `notification:${subscriptionId}`; - return { - on(type, listener, options) { - switch (type) { - case "notification": - return notificationPublisher.on( - notificationKey, - listener, - options - ); - case "error": - return channel.on( - "error", - listener, - options - ); - default: - throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, { - channelName: type, - supportedChannelNames: ["notification", "error"] - }); - } - } - }; -} -var e4, subscriberCountBySubscriptionIdByChannel, cache; -var init_index_node31 = __esm({ - "node_modules/@solana/rpc-subscriptions-spec/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node30(); - init_index_node17(); - init_index_node22(); - e4 = class extends globalThis.AbortController { - constructor(...t) { - super(...t), setMaxListeners3(Number.MAX_SAFE_INTEGER, this.signal); - } - }; - subscriberCountBySubscriptionIdByChannel = /* @__PURE__ */ new WeakMap(); - cache = /* @__PURE__ */ new WeakMap(); - } -}); - -// node_modules/@solana/rpc-subscriptions-api/dist/index.node.mjs -function createSolanaRpcSubscriptionsApi_INTERNAL(config) { - const requestTransformer = getDefaultRequestTransformerForSolanaRpc(config); - const responseTransformer = getDefaultResponseTransformerForSolanaRpcSubscriptions({ - allowedNumericKeyPaths: getAllowedNumericKeypaths2() - }); - return createRpcSubscriptionsApi({ - planExecutor({ request, ...rest }) { - return executeRpcPubSubSubscriptionPlan({ - ...rest, - responseTransformer, - subscribeRequest: { ...request, methodName: request.methodName.replace(/Notifications$/, "Subscribe") }, - unsubscribeMethodName: request.methodName.replace(/Notifications$/, "Unsubscribe") - }); - }, - requestTransformer - }); -} -function createSolanaRpcSubscriptionsApi(config) { - return createSolanaRpcSubscriptionsApi_INTERNAL(config); -} -function createSolanaRpcSubscriptionsApi_UNSTABLE(config) { - return createSolanaRpcSubscriptionsApi_INTERNAL( - config - ); -} -function getAllowedNumericKeypaths2() { - if (!memoizedKeypaths2) { - memoizedKeypaths2 = { - accountNotifications: jsonParsedAccountsConfigs.map((c2) => ["value", ...c2]), - blockNotifications: [ - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "meta", - "preTokenBalances", - KEYPATH_WILDCARD, - "accountIndex" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "meta", - "preTokenBalances", - KEYPATH_WILDCARD, - "uiTokenAmount", - "decimals" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "meta", - "postTokenBalances", - KEYPATH_WILDCARD, - "accountIndex" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "meta", - "postTokenBalances", - KEYPATH_WILDCARD, - "uiTokenAmount", - "decimals" - ], - ["value", "block", "transactions", KEYPATH_WILDCARD, "meta", "rewards", KEYPATH_WILDCARD, "commission"], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "meta", - "innerInstructions", - KEYPATH_WILDCARD, - "index" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "meta", - "innerInstructions", - KEYPATH_WILDCARD, - "instructions", - KEYPATH_WILDCARD, - "programIdIndex" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "meta", - "innerInstructions", - KEYPATH_WILDCARD, - "instructions", - KEYPATH_WILDCARD, - "accounts", - KEYPATH_WILDCARD - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "transaction", - "message", - "addressTableLookups", - KEYPATH_WILDCARD, - "writableIndexes", - KEYPATH_WILDCARD - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "transaction", - "message", - "addressTableLookups", - KEYPATH_WILDCARD, - "readonlyIndexes", - KEYPATH_WILDCARD - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "transaction", - "message", - "instructions", - KEYPATH_WILDCARD, - "programIdIndex" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "transaction", - "message", - "instructions", - KEYPATH_WILDCARD, - "accounts", - KEYPATH_WILDCARD - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "transaction", - "message", - "header", - "numReadonlySignedAccounts" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "transaction", - "message", - "header", - "numReadonlyUnsignedAccounts" - ], - [ - "value", - "block", - "transactions", - KEYPATH_WILDCARD, - "transaction", - "message", - "header", - "numRequiredSignatures" - ], - ["value", "block", "rewards", KEYPATH_WILDCARD, "commission"] - ], - programNotifications: jsonParsedAccountsConfigs.flatMap((c2) => [ - ["value", KEYPATH_WILDCARD, "account", ...c2], - [KEYPATH_WILDCARD, "account", ...c2] - ]) - }; - } - return memoizedKeypaths2; -} -var memoizedKeypaths2; -var init_index_node32 = __esm({ - "node_modules/@solana/rpc-subscriptions-api/dist/index.node.mjs"() { - "use strict"; - init_index_node31(); - init_index_node24(); - } -}); - -// node_modules/ws/lib/constants.js -var require_constants = __commonJS({ - "node_modules/ws/lib/constants.js"(exports, module) { - "use strict"; - var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"]; - var hasBlob = typeof Blob !== "undefined"; - if (hasBlob) BINARY_TYPES.push("blob"); - module.exports = { - BINARY_TYPES, - CLOSE_TIMEOUT: 3e4, - EMPTY_BUFFER: Buffer.alloc(0), - GUID: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", - hasBlob, - kForOnEventAttribute: /* @__PURE__ */ Symbol("kIsForOnEventAttribute"), - kListener: /* @__PURE__ */ Symbol("kListener"), - kStatusCode: /* @__PURE__ */ Symbol("status-code"), - kWebSocket: /* @__PURE__ */ Symbol("websocket"), - NOOP: () => { - } - }; - } -}); - -// node_modules/ws/lib/buffer-util.js -var require_buffer_util = __commonJS({ - "node_modules/ws/lib/buffer-util.js"(exports, module) { - "use strict"; - var { EMPTY_BUFFER } = require_constants(); - var FastBuffer = Buffer[Symbol.species]; - function concat3(list, totalLength) { - if (list.length === 0) return EMPTY_BUFFER; - if (list.length === 1) return list[0]; - const target = Buffer.allocUnsafe(totalLength); - let offset = 0; - for (let i = 0; i < list.length; i++) { - const buf = list[i]; - target.set(buf, offset); - offset += buf.length; - } - if (offset < totalLength) { - return new FastBuffer(target.buffer, target.byteOffset, offset); - } - return target; - } - function _mask(source, mask, output, offset, length) { - for (let i = 0; i < length; i++) { - output[offset + i] = source[i] ^ mask[i & 3]; - } - } - function _unmask(buffer2, mask) { - for (let i = 0; i < buffer2.length; i++) { - buffer2[i] ^= mask[i & 3]; - } - } - function toArrayBuffer2(buf) { - if (buf.length === buf.buffer.byteLength) { - return buf.buffer; - } - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length); - } - function toBuffer(data) { - toBuffer.readOnly = true; - if (Buffer.isBuffer(data)) return data; - let buf; - if (data instanceof ArrayBuffer) { - buf = new FastBuffer(data); - } else if (ArrayBuffer.isView(data)) { - buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength); - } else { - buf = Buffer.from(data); - toBuffer.readOnly = false; - } - return buf; - } - module.exports = { - concat: concat3, - mask: _mask, - toArrayBuffer: toArrayBuffer2, - toBuffer, - unmask: _unmask - }; - if (!process.env.WS_NO_BUFFER_UTIL) { - try { - const bufferUtil = __require("bufferutil"); - module.exports.mask = function(source, mask, output, offset, length) { - if (length < 48) _mask(source, mask, output, offset, length); - else bufferUtil.mask(source, mask, output, offset, length); - }; - module.exports.unmask = function(buffer2, mask) { - if (buffer2.length < 32) _unmask(buffer2, mask); - else bufferUtil.unmask(buffer2, mask); - }; - } catch (e7) { - } - } - } -}); - -// node_modules/ws/lib/limiter.js -var require_limiter = __commonJS({ - "node_modules/ws/lib/limiter.js"(exports, module) { - "use strict"; - var kDone = /* @__PURE__ */ Symbol("kDone"); - var kRun = /* @__PURE__ */ Symbol("kRun"); - var Limiter = class { - /** - * Creates a new `Limiter`. - * - * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed - * to run concurrently - */ - constructor(concurrency) { - this[kDone] = () => { - this.pending--; - this[kRun](); - }; - this.concurrency = concurrency || Infinity; - this.jobs = []; - this.pending = 0; - } - /** - * Adds a job to the queue. - * - * @param {Function} job The job to run - * @public - */ - add(job) { - this.jobs.push(job); - this[kRun](); - } - /** - * Removes a job from the queue and runs it if possible. - * - * @private - */ - [kRun]() { - if (this.pending === this.concurrency) return; - if (this.jobs.length) { - const job = this.jobs.shift(); - this.pending++; - job(this[kDone]); - } - } - }; - module.exports = Limiter; - } -}); - -// node_modules/ws/lib/permessage-deflate.js -var require_permessage_deflate = __commonJS({ - "node_modules/ws/lib/permessage-deflate.js"(exports, module) { - "use strict"; - var zlib = __require("zlib"); - var bufferUtil = require_buffer_util(); - var Limiter = require_limiter(); - var { kStatusCode } = require_constants(); - var FastBuffer = Buffer[Symbol.species]; - var TRAILER = Buffer.from([0, 0, 255, 255]); - var kPerMessageDeflate = /* @__PURE__ */ Symbol("permessage-deflate"); - var kTotalLength = /* @__PURE__ */ Symbol("total-length"); - var kCallback = /* @__PURE__ */ Symbol("callback"); - var kBuffers = /* @__PURE__ */ Symbol("buffers"); - var kError = /* @__PURE__ */ Symbol("error"); - var zlibLimiter; - var PerMessageDeflate2 = class { - /** - * Creates a PerMessageDeflate instance. - * - * @param {Object} [options] Configuration options - * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support - * for, or request, a custom client window size - * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ - * acknowledge disabling of client context takeover - * @param {Number} [options.concurrencyLimit=10] The number of concurrent - * calls to zlib - * @param {Boolean} [options.isServer=false] Create the instance in either - * server or client mode - * @param {Number} [options.maxPayload=0] The maximum allowed message length - * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the - * use of a custom server window size - * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept - * disabling of server context takeover - * @param {Number} [options.threshold=1024] Size (in bytes) below which - * messages should not be compressed if context takeover is disabled - * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on - * deflate - * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on - * inflate - */ - constructor(options) { - this._options = options || {}; - this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024; - this._maxPayload = this._options.maxPayload | 0; - this._isServer = !!this._options.isServer; - this._deflate = null; - this._inflate = null; - this.params = null; - if (!zlibLimiter) { - const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10; - zlibLimiter = new Limiter(concurrency); - } - } - /** - * @type {String} - */ - static get extensionName() { - return "permessage-deflate"; - } - /** - * Create an extension negotiation offer. - * - * @return {Object} Extension parameters - * @public - */ - offer() { - const params = {}; - if (this._options.serverNoContextTakeover) { - params.server_no_context_takeover = true; - } - if (this._options.clientNoContextTakeover) { - params.client_no_context_takeover = true; - } - if (this._options.serverMaxWindowBits) { - params.server_max_window_bits = this._options.serverMaxWindowBits; - } - if (this._options.clientMaxWindowBits) { - params.client_max_window_bits = this._options.clientMaxWindowBits; - } else if (this._options.clientMaxWindowBits == null) { - params.client_max_window_bits = true; - } - return params; - } - /** - * Accept an extension negotiation offer/response. - * - * @param {Array} configurations The extension negotiation offers/reponse - * @return {Object} Accepted configuration - * @public - */ - accept(configurations) { - configurations = this.normalizeParams(configurations); - this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations); - return this.params; - } - /** - * Releases all resources used by the extension. - * - * @public - */ - cleanup() { - if (this._inflate) { - this._inflate.close(); - this._inflate = null; - } - if (this._deflate) { - const callback = this._deflate[kCallback]; - this._deflate.close(); - this._deflate = null; - if (callback) { - callback( - new Error( - "The deflate stream was closed while data was being processed" - ) - ); - } - } - } - /** - * Accept an extension negotiation offer. - * - * @param {Array} offers The extension negotiation offers - * @return {Object} Accepted configuration - * @private - */ - acceptAsServer(offers) { - const opts = this._options; - const accepted = offers.find((params) => { - if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && !params.client_max_window_bits) { - return false; - } - return true; - }); - if (!accepted) { - throw new Error("None of the extension offers can be accepted"); - } - if (opts.serverNoContextTakeover) { - accepted.server_no_context_takeover = true; - } - if (opts.clientNoContextTakeover) { - accepted.client_no_context_takeover = true; - } - if (typeof opts.serverMaxWindowBits === "number") { - accepted.server_max_window_bits = opts.serverMaxWindowBits; - } - if (typeof opts.clientMaxWindowBits === "number") { - accepted.client_max_window_bits = opts.clientMaxWindowBits; - } else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) { - delete accepted.client_max_window_bits; - } - return accepted; - } - /** - * Accept the extension negotiation response. - * - * @param {Array} response The extension negotiation response - * @return {Object} Accepted configuration - * @private - */ - acceptAsClient(response) { - const params = response[0]; - if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) { - throw new Error('Unexpected parameter "client_no_context_takeover"'); - } - if (!params.client_max_window_bits) { - if (typeof this._options.clientMaxWindowBits === "number") { - params.client_max_window_bits = this._options.clientMaxWindowBits; - } - } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === "number" && params.client_max_window_bits > this._options.clientMaxWindowBits) { - throw new Error( - 'Unexpected or invalid parameter "client_max_window_bits"' - ); - } - return params; - } - /** - * Normalize parameters. - * - * @param {Array} configurations The extension negotiation offers/reponse - * @return {Array} The offers/response with normalized parameters - * @private - */ - normalizeParams(configurations) { - configurations.forEach((params) => { - Object.keys(params).forEach((key) => { - let value = params[key]; - if (value.length > 1) { - throw new Error(`Parameter "${key}" must have only a single value`); - } - value = value[0]; - if (key === "client_max_window_bits") { - if (value !== true) { - const num2 = +value; - if (!Number.isInteger(num2) || num2 < 8 || num2 > 15) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - value = num2; - } else if (!this._isServer) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - } else if (key === "server_max_window_bits") { - const num2 = +value; - if (!Number.isInteger(num2) || num2 < 8 || num2 > 15) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - value = num2; - } else if (key === "client_no_context_takeover" || key === "server_no_context_takeover") { - if (value !== true) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - } else { - throw new Error(`Unknown parameter "${key}"`); - } - params[key] = value; - }); - }); - return configurations; - } - /** - * Decompress data. Concurrency limited. - * - * @param {Buffer} data Compressed data - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @public - */ - decompress(data, fin, callback) { - zlibLimiter.add((done) => { - this._decompress(data, fin, (err, result) => { - done(); - callback(err, result); - }); - }); - } - /** - * Compress data. Concurrency limited. - * - * @param {(Buffer|String)} data Data to compress - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @public - */ - compress(data, fin, callback) { - zlibLimiter.add((done) => { - this._compress(data, fin, (err, result) => { - done(); - callback(err, result); - }); - }); - } - /** - * Decompress data. - * - * @param {Buffer} data Compressed data - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @private - */ - _decompress(data, fin, callback) { - const endpoint = this._isServer ? "client" : "server"; - if (!this._inflate) { - const key = `${endpoint}_max_window_bits`; - const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; - this._inflate = zlib.createInflateRaw({ - ...this._options.zlibInflateOptions, - windowBits - }); - this._inflate[kPerMessageDeflate] = this; - this._inflate[kTotalLength] = 0; - this._inflate[kBuffers] = []; - this._inflate.on("error", inflateOnError); - this._inflate.on("data", inflateOnData); - } - this._inflate[kCallback] = callback; - this._inflate.write(data); - if (fin) this._inflate.write(TRAILER); - this._inflate.flush(() => { - const err = this._inflate[kError]; - if (err) { - this._inflate.close(); - this._inflate = null; - callback(err); - return; - } - const data2 = bufferUtil.concat( - this._inflate[kBuffers], - this._inflate[kTotalLength] - ); - if (this._inflate._readableState.endEmitted) { - this._inflate.close(); - this._inflate = null; - } else { - this._inflate[kTotalLength] = 0; - this._inflate[kBuffers] = []; - if (fin && this.params[`${endpoint}_no_context_takeover`]) { - this._inflate.reset(); - } - } - callback(null, data2); - }); - } - /** - * Compress data. - * - * @param {(Buffer|String)} data Data to compress - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @private - */ - _compress(data, fin, callback) { - const endpoint = this._isServer ? "server" : "client"; - if (!this._deflate) { - const key = `${endpoint}_max_window_bits`; - const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; - this._deflate = zlib.createDeflateRaw({ - ...this._options.zlibDeflateOptions, - windowBits - }); - this._deflate[kTotalLength] = 0; - this._deflate[kBuffers] = []; - this._deflate.on("data", deflateOnData); - } - this._deflate[kCallback] = callback; - this._deflate.write(data); - this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { - if (!this._deflate) { - return; - } - let data2 = bufferUtil.concat( - this._deflate[kBuffers], - this._deflate[kTotalLength] - ); - if (fin) { - data2 = new FastBuffer(data2.buffer, data2.byteOffset, data2.length - 4); - } - this._deflate[kCallback] = null; - this._deflate[kTotalLength] = 0; - this._deflate[kBuffers] = []; - if (fin && this.params[`${endpoint}_no_context_takeover`]) { - this._deflate.reset(); - } - callback(null, data2); - }); - } - }; - module.exports = PerMessageDeflate2; - function deflateOnData(chunk) { - this[kBuffers].push(chunk); - this[kTotalLength] += chunk.length; - } - function inflateOnData(chunk) { - this[kTotalLength] += chunk.length; - if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) { - this[kBuffers].push(chunk); - return; - } - this[kError] = new RangeError("Max payload size exceeded"); - this[kError].code = "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"; - this[kError][kStatusCode] = 1009; - this.removeListener("data", inflateOnData); - this.reset(); - } - function inflateOnError(err) { - this[kPerMessageDeflate]._inflate = null; - if (this[kError]) { - this[kCallback](this[kError]); - return; - } - err[kStatusCode] = 1007; - this[kCallback](err); - } - } -}); - -// node_modules/ws/lib/validation.js -var require_validation = __commonJS({ - "node_modules/ws/lib/validation.js"(exports, module) { - "use strict"; - var { isUtf8 } = __require("buffer"); - var { hasBlob } = require_constants(); - var tokenChars = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 0 - 15 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 16 - 31 - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 0, - // 32 - 47 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - // 48 - 63 - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - // 64 - 79 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - // 80 - 95 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - // 96 - 111 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 0, - 1, - 0 - // 112 - 127 - ]; - function isValidStatusCode(code) { - return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999; - } - function _isValidUTF8(buf) { - const len = buf.length; - let i = 0; - while (i < len) { - if ((buf[i] & 128) === 0) { - i++; - } else if ((buf[i] & 224) === 192) { - if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) { - return false; - } - i += 2; - } else if ((buf[i] & 240) === 224) { - if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || // Overlong - buf[i] === 237 && (buf[i + 1] & 224) === 160) { - return false; - } - i += 3; - } else if ((buf[i] & 248) === 240) { - if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || // Overlong - buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) { - return false; - } - i += 4; - } else { - return false; - } - } - return true; - } - function isBlob(value) { - return hasBlob && typeof value === "object" && typeof value.arrayBuffer === "function" && typeof value.type === "string" && typeof value.stream === "function" && (value[Symbol.toStringTag] === "Blob" || value[Symbol.toStringTag] === "File"); - } - module.exports = { - isBlob, - isValidStatusCode, - isValidUTF8: _isValidUTF8, - tokenChars - }; - if (isUtf8) { - module.exports.isValidUTF8 = function(buf) { - return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf); - }; - } else if (!process.env.WS_NO_UTF_8_VALIDATE) { - try { - const isValidUTF8 = __require("utf-8-validate"); - module.exports.isValidUTF8 = function(buf) { - return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf); - }; - } catch (e7) { - } - } - } -}); - -// node_modules/ws/lib/receiver.js -var require_receiver = __commonJS({ - "node_modules/ws/lib/receiver.js"(exports, module) { - "use strict"; - var { Writable } = __require("stream"); - var PerMessageDeflate2 = require_permessage_deflate(); - var { - BINARY_TYPES, - EMPTY_BUFFER, - kStatusCode, - kWebSocket - } = require_constants(); - var { concat: concat3, toArrayBuffer: toArrayBuffer2, unmask } = require_buffer_util(); - var { isValidStatusCode, isValidUTF8 } = require_validation(); - var FastBuffer = Buffer[Symbol.species]; - var GET_INFO = 0; - var GET_PAYLOAD_LENGTH_16 = 1; - var GET_PAYLOAD_LENGTH_64 = 2; - var GET_MASK = 3; - var GET_DATA = 4; - var INFLATING = 5; - var DEFER_EVENT = 6; - var Receiver2 = class extends Writable { - /** - * Creates a Receiver instance. - * - * @param {Object} [options] Options object - * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether - * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted - * multiple times in the same tick - * @param {String} [options.binaryType=nodebuffer] The type for binary data - * @param {Object} [options.extensions] An object containing the negotiated - * extensions - * @param {Boolean} [options.isServer=false] Specifies whether to operate in - * client or server mode - * @param {Number} [options.maxPayload=0] The maximum allowed message length - * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or - * not to skip UTF-8 validation for text and close messages - */ - constructor(options = {}) { - super(); - this._allowSynchronousEvents = options.allowSynchronousEvents !== void 0 ? options.allowSynchronousEvents : true; - this._binaryType = options.binaryType || BINARY_TYPES[0]; - this._extensions = options.extensions || {}; - this._isServer = !!options.isServer; - this._maxPayload = options.maxPayload | 0; - this._skipUTF8Validation = !!options.skipUTF8Validation; - this[kWebSocket] = void 0; - this._bufferedBytes = 0; - this._buffers = []; - this._compressed = false; - this._payloadLength = 0; - this._mask = void 0; - this._fragmented = 0; - this._masked = false; - this._fin = false; - this._opcode = 0; - this._totalPayloadLength = 0; - this._messageLength = 0; - this._fragments = []; - this._errored = false; - this._loop = false; - this._state = GET_INFO; - } - /** - * Implements `Writable.prototype._write()`. - * - * @param {Buffer} chunk The chunk of data to write - * @param {String} encoding The character encoding of `chunk` - * @param {Function} cb Callback - * @private - */ - _write(chunk, encoding, cb) { - if (this._opcode === 8 && this._state == GET_INFO) return cb(); - this._bufferedBytes += chunk.length; - this._buffers.push(chunk); - this.startLoop(cb); - } - /** - * Consumes `n` bytes from the buffered data. - * - * @param {Number} n The number of bytes to consume - * @return {Buffer} The consumed bytes - * @private - */ - consume(n) { - this._bufferedBytes -= n; - if (n === this._buffers[0].length) return this._buffers.shift(); - if (n < this._buffers[0].length) { - const buf = this._buffers[0]; - this._buffers[0] = new FastBuffer( - buf.buffer, - buf.byteOffset + n, - buf.length - n - ); - return new FastBuffer(buf.buffer, buf.byteOffset, n); - } - const dst = Buffer.allocUnsafe(n); - do { - const buf = this._buffers[0]; - const offset = dst.length - n; - if (n >= buf.length) { - dst.set(this._buffers.shift(), offset); - } else { - dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); - this._buffers[0] = new FastBuffer( - buf.buffer, - buf.byteOffset + n, - buf.length - n - ); - } - n -= buf.length; - } while (n > 0); - return dst; - } - /** - * Starts the parsing loop. - * - * @param {Function} cb Callback - * @private - */ - startLoop(cb) { - this._loop = true; - do { - switch (this._state) { - case GET_INFO: - this.getInfo(cb); - break; - case GET_PAYLOAD_LENGTH_16: - this.getPayloadLength16(cb); - break; - case GET_PAYLOAD_LENGTH_64: - this.getPayloadLength64(cb); - break; - case GET_MASK: - this.getMask(); - break; - case GET_DATA: - this.getData(cb); - break; - case INFLATING: - case DEFER_EVENT: - this._loop = false; - return; - } - } while (this._loop); - if (!this._errored) cb(); - } - /** - * Reads the first two bytes of a frame. - * - * @param {Function} cb Callback - * @private - */ - getInfo(cb) { - if (this._bufferedBytes < 2) { - this._loop = false; - return; - } - const buf = this.consume(2); - if ((buf[0] & 48) !== 0) { - const error = this.createError( - RangeError, - "RSV2 and RSV3 must be clear", - true, - 1002, - "WS_ERR_UNEXPECTED_RSV_2_3" - ); - cb(error); - return; - } - const compressed = (buf[0] & 64) === 64; - if (compressed && !this._extensions[PerMessageDeflate2.extensionName]) { - const error = this.createError( - RangeError, - "RSV1 must be clear", - true, - 1002, - "WS_ERR_UNEXPECTED_RSV_1" - ); - cb(error); - return; - } - this._fin = (buf[0] & 128) === 128; - this._opcode = buf[0] & 15; - this._payloadLength = buf[1] & 127; - if (this._opcode === 0) { - if (compressed) { - const error = this.createError( - RangeError, - "RSV1 must be clear", - true, - 1002, - "WS_ERR_UNEXPECTED_RSV_1" - ); - cb(error); - return; - } - if (!this._fragmented) { - const error = this.createError( - RangeError, - "invalid opcode 0", - true, - 1002, - "WS_ERR_INVALID_OPCODE" - ); - cb(error); - return; - } - this._opcode = this._fragmented; - } else if (this._opcode === 1 || this._opcode === 2) { - if (this._fragmented) { - const error = this.createError( - RangeError, - `invalid opcode ${this._opcode}`, - true, - 1002, - "WS_ERR_INVALID_OPCODE" - ); - cb(error); - return; - } - this._compressed = compressed; - } else if (this._opcode > 7 && this._opcode < 11) { - if (!this._fin) { - const error = this.createError( - RangeError, - "FIN must be set", - true, - 1002, - "WS_ERR_EXPECTED_FIN" - ); - cb(error); - return; - } - if (compressed) { - const error = this.createError( - RangeError, - "RSV1 must be clear", - true, - 1002, - "WS_ERR_UNEXPECTED_RSV_1" - ); - cb(error); - return; - } - if (this._payloadLength > 125 || this._opcode === 8 && this._payloadLength === 1) { - const error = this.createError( - RangeError, - `invalid payload length ${this._payloadLength}`, - true, - 1002, - "WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH" - ); - cb(error); - return; - } - } else { - const error = this.createError( - RangeError, - `invalid opcode ${this._opcode}`, - true, - 1002, - "WS_ERR_INVALID_OPCODE" - ); - cb(error); - return; - } - if (!this._fin && !this._fragmented) this._fragmented = this._opcode; - this._masked = (buf[1] & 128) === 128; - if (this._isServer) { - if (!this._masked) { - const error = this.createError( - RangeError, - "MASK must be set", - true, - 1002, - "WS_ERR_EXPECTED_MASK" - ); - cb(error); - return; - } - } else if (this._masked) { - const error = this.createError( - RangeError, - "MASK must be clear", - true, - 1002, - "WS_ERR_UNEXPECTED_MASK" - ); - cb(error); - return; - } - if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; - else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; - else this.haveLength(cb); - } - /** - * Gets extended payload length (7+16). - * - * @param {Function} cb Callback - * @private - */ - getPayloadLength16(cb) { - if (this._bufferedBytes < 2) { - this._loop = false; - return; - } - this._payloadLength = this.consume(2).readUInt16BE(0); - this.haveLength(cb); - } - /** - * Gets extended payload length (7+64). - * - * @param {Function} cb Callback - * @private - */ - getPayloadLength64(cb) { - if (this._bufferedBytes < 8) { - this._loop = false; - return; - } - const buf = this.consume(8); - const num2 = buf.readUInt32BE(0); - if (num2 > Math.pow(2, 53 - 32) - 1) { - const error = this.createError( - RangeError, - "Unsupported WebSocket frame: payload length > 2^53 - 1", - false, - 1009, - "WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH" - ); - cb(error); - return; - } - this._payloadLength = num2 * Math.pow(2, 32) + buf.readUInt32BE(4); - this.haveLength(cb); - } - /** - * Payload length has been read. - * - * @param {Function} cb Callback - * @private - */ - haveLength(cb) { - if (this._payloadLength && this._opcode < 8) { - this._totalPayloadLength += this._payloadLength; - if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { - const error = this.createError( - RangeError, - "Max payload size exceeded", - false, - 1009, - "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" - ); - cb(error); - return; - } - } - if (this._masked) this._state = GET_MASK; - else this._state = GET_DATA; - } - /** - * Reads mask bytes. - * - * @private - */ - getMask() { - if (this._bufferedBytes < 4) { - this._loop = false; - return; - } - this._mask = this.consume(4); - this._state = GET_DATA; - } - /** - * Reads data bytes. - * - * @param {Function} cb Callback - * @private - */ - getData(cb) { - let data = EMPTY_BUFFER; - if (this._payloadLength) { - if (this._bufferedBytes < this._payloadLength) { - this._loop = false; - return; - } - data = this.consume(this._payloadLength); - if (this._masked && (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0) { - unmask(data, this._mask); - } - } - if (this._opcode > 7) { - this.controlMessage(data, cb); - return; - } - if (this._compressed) { - this._state = INFLATING; - this.decompress(data, cb); - return; - } - if (data.length) { - this._messageLength = this._totalPayloadLength; - this._fragments.push(data); - } - this.dataMessage(cb); - } - /** - * Decompresses data. - * - * @param {Buffer} data Compressed data - * @param {Function} cb Callback - * @private - */ - decompress(data, cb) { - const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName]; - perMessageDeflate.decompress(data, this._fin, (err, buf) => { - if (err) return cb(err); - if (buf.length) { - this._messageLength += buf.length; - if (this._messageLength > this._maxPayload && this._maxPayload > 0) { - const error = this.createError( - RangeError, - "Max payload size exceeded", - false, - 1009, - "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" - ); - cb(error); - return; - } - this._fragments.push(buf); - } - this.dataMessage(cb); - if (this._state === GET_INFO) this.startLoop(cb); - }); - } - /** - * Handles a data message. - * - * @param {Function} cb Callback - * @private - */ - dataMessage(cb) { - if (!this._fin) { - this._state = GET_INFO; - return; - } - const messageLength = this._messageLength; - const fragments = this._fragments; - this._totalPayloadLength = 0; - this._messageLength = 0; - this._fragmented = 0; - this._fragments = []; - if (this._opcode === 2) { - let data; - if (this._binaryType === "nodebuffer") { - data = concat3(fragments, messageLength); - } else if (this._binaryType === "arraybuffer") { - data = toArrayBuffer2(concat3(fragments, messageLength)); - } else if (this._binaryType === "blob") { - data = new Blob(fragments); - } else { - data = fragments; - } - if (this._allowSynchronousEvents) { - this.emit("message", data, true); - this._state = GET_INFO; - } else { - this._state = DEFER_EVENT; - setImmediate(() => { - this.emit("message", data, true); - this._state = GET_INFO; - this.startLoop(cb); - }); - } - } else { - const buf = concat3(fragments, messageLength); - if (!this._skipUTF8Validation && !isValidUTF8(buf)) { - const error = this.createError( - Error, - "invalid UTF-8 sequence", - true, - 1007, - "WS_ERR_INVALID_UTF8" - ); - cb(error); - return; - } - if (this._state === INFLATING || this._allowSynchronousEvents) { - this.emit("message", buf, false); - this._state = GET_INFO; - } else { - this._state = DEFER_EVENT; - setImmediate(() => { - this.emit("message", buf, false); - this._state = GET_INFO; - this.startLoop(cb); - }); - } - } - } - /** - * Handles a control message. - * - * @param {Buffer} data Data to handle - * @return {(Error|RangeError|undefined)} A possible error - * @private - */ - controlMessage(data, cb) { - if (this._opcode === 8) { - if (data.length === 0) { - this._loop = false; - this.emit("conclude", 1005, EMPTY_BUFFER); - this.end(); - } else { - const code = data.readUInt16BE(0); - if (!isValidStatusCode(code)) { - const error = this.createError( - RangeError, - `invalid status code ${code}`, - true, - 1002, - "WS_ERR_INVALID_CLOSE_CODE" - ); - cb(error); - return; - } - const buf = new FastBuffer( - data.buffer, - data.byteOffset + 2, - data.length - 2 - ); - if (!this._skipUTF8Validation && !isValidUTF8(buf)) { - const error = this.createError( - Error, - "invalid UTF-8 sequence", - true, - 1007, - "WS_ERR_INVALID_UTF8" - ); - cb(error); - return; - } - this._loop = false; - this.emit("conclude", code, buf); - this.end(); - } - this._state = GET_INFO; - return; - } - if (this._allowSynchronousEvents) { - this.emit(this._opcode === 9 ? "ping" : "pong", data); - this._state = GET_INFO; - } else { - this._state = DEFER_EVENT; - setImmediate(() => { - this.emit(this._opcode === 9 ? "ping" : "pong", data); - this._state = GET_INFO; - this.startLoop(cb); - }); - } - } - /** - * Builds an error object. - * - * @param {function(new:Error|RangeError)} ErrorCtor The error constructor - * @param {String} message The error message - * @param {Boolean} prefix Specifies whether or not to add a default prefix to - * `message` - * @param {Number} statusCode The status code - * @param {String} errorCode The exposed error code - * @return {(Error|RangeError)} The error - * @private - */ - createError(ErrorCtor, message, prefix, statusCode, errorCode) { - this._loop = false; - this._errored = true; - const err = new ErrorCtor( - prefix ? `Invalid WebSocket frame: ${message}` : message - ); - Error.captureStackTrace(err, this.createError); - err.code = errorCode; - err[kStatusCode] = statusCode; - return err; - } - }; - module.exports = Receiver2; - } -}); - -// node_modules/ws/lib/sender.js -var require_sender = __commonJS({ - "node_modules/ws/lib/sender.js"(exports, module) { - "use strict"; - var { Duplex } = __require("stream"); - var { randomFillSync } = __require("crypto"); - var PerMessageDeflate2 = require_permessage_deflate(); - var { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants(); - var { isBlob, isValidStatusCode } = require_validation(); - var { mask: applyMask, toBuffer } = require_buffer_util(); - var kByteLength = /* @__PURE__ */ Symbol("kByteLength"); - var maskBuffer = Buffer.alloc(4); - var RANDOM_POOL_SIZE = 8 * 1024; - var randomPool; - var randomPoolPointer = RANDOM_POOL_SIZE; - var DEFAULT = 0; - var DEFLATING = 1; - var GET_BLOB_DATA = 2; - var Sender2 = class _Sender { - /** - * Creates a Sender instance. - * - * @param {Duplex} socket The connection socket - * @param {Object} [extensions] An object containing the negotiated extensions - * @param {Function} [generateMask] The function used to generate the masking - * key - */ - constructor(socket, extensions, generateMask) { - this._extensions = extensions || {}; - if (generateMask) { - this._generateMask = generateMask; - this._maskBuffer = Buffer.alloc(4); - } - this._socket = socket; - this._firstFragment = true; - this._compress = false; - this._bufferedBytes = 0; - this._queue = []; - this._state = DEFAULT; - this.onerror = NOOP; - this[kWebSocket] = void 0; - } - /** - * Frames a piece of data according to the HyBi WebSocket protocol. - * - * @param {(Buffer|String)} data The data to frame - * @param {Object} options Options object - * @param {Boolean} [options.fin=false] Specifies whether or not to set the - * FIN bit - * @param {Function} [options.generateMask] The function used to generate the - * masking key - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Buffer} [options.maskBuffer] The buffer used to store the masking - * key - * @param {Number} options.opcode The opcode - * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be - * modified - * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the - * RSV1 bit - * @return {(Buffer|String)[]} The framed data - * @public - */ - static frame(data, options) { - let mask; - let merge = false; - let offset = 2; - let skipMasking = false; - if (options.mask) { - mask = options.maskBuffer || maskBuffer; - if (options.generateMask) { - options.generateMask(mask); - } else { - if (randomPoolPointer === RANDOM_POOL_SIZE) { - if (randomPool === void 0) { - randomPool = Buffer.alloc(RANDOM_POOL_SIZE); - } - randomFillSync(randomPool, 0, RANDOM_POOL_SIZE); - randomPoolPointer = 0; - } - mask[0] = randomPool[randomPoolPointer++]; - mask[1] = randomPool[randomPoolPointer++]; - mask[2] = randomPool[randomPoolPointer++]; - mask[3] = randomPool[randomPoolPointer++]; - } - skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0; - offset = 6; - } - let dataLength; - if (typeof data === "string") { - if ((!options.mask || skipMasking) && options[kByteLength] !== void 0) { - dataLength = options[kByteLength]; - } else { - data = Buffer.from(data); - dataLength = data.length; - } - } else { - dataLength = data.length; - merge = options.mask && options.readOnly && !skipMasking; - } - let payloadLength = dataLength; - if (dataLength >= 65536) { - offset += 8; - payloadLength = 127; - } else if (dataLength > 125) { - offset += 2; - payloadLength = 126; - } - const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset); - target[0] = options.fin ? options.opcode | 128 : options.opcode; - if (options.rsv1) target[0] |= 64; - target[1] = payloadLength; - if (payloadLength === 126) { - target.writeUInt16BE(dataLength, 2); - } else if (payloadLength === 127) { - target[2] = target[3] = 0; - target.writeUIntBE(dataLength, 4, 6); - } - if (!options.mask) return [target, data]; - target[1] |= 128; - target[offset - 4] = mask[0]; - target[offset - 3] = mask[1]; - target[offset - 2] = mask[2]; - target[offset - 1] = mask[3]; - if (skipMasking) return [target, data]; - if (merge) { - applyMask(data, mask, target, offset, dataLength); - return [target]; - } - applyMask(data, mask, data, 0, dataLength); - return [target, data]; - } - /** - * Sends a close message to the other peer. - * - * @param {Number} [code] The status code component of the body - * @param {(String|Buffer)} [data] The message component of the body - * @param {Boolean} [mask=false] Specifies whether or not to mask the message - * @param {Function} [cb] Callback - * @public - */ - close(code, data, mask, cb) { - let buf; - if (code === void 0) { - buf = EMPTY_BUFFER; - } else if (typeof code !== "number" || !isValidStatusCode(code)) { - throw new TypeError("First argument must be a valid error code number"); - } else if (data === void 0 || !data.length) { - buf = Buffer.allocUnsafe(2); - buf.writeUInt16BE(code, 0); - } else { - const length = Buffer.byteLength(data); - if (length > 123) { - throw new RangeError("The message must not be greater than 123 bytes"); - } - buf = Buffer.allocUnsafe(2 + length); - buf.writeUInt16BE(code, 0); - if (typeof data === "string") { - buf.write(data, 2); - } else { - buf.set(data, 2); - } - } - const options = { - [kByteLength]: buf.length, - fin: true, - generateMask: this._generateMask, - mask, - maskBuffer: this._maskBuffer, - opcode: 8, - readOnly: false, - rsv1: false - }; - if (this._state !== DEFAULT) { - this.enqueue([this.dispatch, buf, false, options, cb]); - } else { - this.sendFrame(_Sender.frame(buf, options), cb); - } - } - /** - * Sends a ping message to the other peer. - * - * @param {*} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @public - */ - ping(data, mask, cb) { - let byteLength; - let readOnly; - if (typeof data === "string") { - byteLength = Buffer.byteLength(data); - readOnly = false; - } else if (isBlob(data)) { - byteLength = data.size; - readOnly = false; - } else { - data = toBuffer(data); - byteLength = data.length; - readOnly = toBuffer.readOnly; - } - if (byteLength > 125) { - throw new RangeError("The data size must not be greater than 125 bytes"); - } - const options = { - [kByteLength]: byteLength, - fin: true, - generateMask: this._generateMask, - mask, - maskBuffer: this._maskBuffer, - opcode: 9, - readOnly, - rsv1: false - }; - if (isBlob(data)) { - if (this._state !== DEFAULT) { - this.enqueue([this.getBlobData, data, false, options, cb]); - } else { - this.getBlobData(data, false, options, cb); - } - } else if (this._state !== DEFAULT) { - this.enqueue([this.dispatch, data, false, options, cb]); - } else { - this.sendFrame(_Sender.frame(data, options), cb); - } - } - /** - * Sends a pong message to the other peer. - * - * @param {*} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @public - */ - pong(data, mask, cb) { - let byteLength; - let readOnly; - if (typeof data === "string") { - byteLength = Buffer.byteLength(data); - readOnly = false; - } else if (isBlob(data)) { - byteLength = data.size; - readOnly = false; - } else { - data = toBuffer(data); - byteLength = data.length; - readOnly = toBuffer.readOnly; - } - if (byteLength > 125) { - throw new RangeError("The data size must not be greater than 125 bytes"); - } - const options = { - [kByteLength]: byteLength, - fin: true, - generateMask: this._generateMask, - mask, - maskBuffer: this._maskBuffer, - opcode: 10, - readOnly, - rsv1: false - }; - if (isBlob(data)) { - if (this._state !== DEFAULT) { - this.enqueue([this.getBlobData, data, false, options, cb]); - } else { - this.getBlobData(data, false, options, cb); - } - } else if (this._state !== DEFAULT) { - this.enqueue([this.dispatch, data, false, options, cb]); - } else { - this.sendFrame(_Sender.frame(data, options), cb); - } - } - /** - * Sends a data message to the other peer. - * - * @param {*} data The message to send - * @param {Object} options Options object - * @param {Boolean} [options.binary=false] Specifies whether `data` is binary - * or text - * @param {Boolean} [options.compress=false] Specifies whether or not to - * compress `data` - * @param {Boolean} [options.fin=false] Specifies whether the fragment is the - * last one - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Function} [cb] Callback - * @public - */ - send(data, options, cb) { - const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName]; - let opcode = options.binary ? 2 : 1; - let rsv1 = options.compress; - let byteLength; - let readOnly; - if (typeof data === "string") { - byteLength = Buffer.byteLength(data); - readOnly = false; - } else if (isBlob(data)) { - byteLength = data.size; - readOnly = false; - } else { - data = toBuffer(data); - byteLength = data.length; - readOnly = toBuffer.readOnly; - } - if (this._firstFragment) { - this._firstFragment = false; - if (rsv1 && perMessageDeflate && perMessageDeflate.params[perMessageDeflate._isServer ? "server_no_context_takeover" : "client_no_context_takeover"]) { - rsv1 = byteLength >= perMessageDeflate._threshold; - } - this._compress = rsv1; - } else { - rsv1 = false; - opcode = 0; - } - if (options.fin) this._firstFragment = true; - const opts = { - [kByteLength]: byteLength, - fin: options.fin, - generateMask: this._generateMask, - mask: options.mask, - maskBuffer: this._maskBuffer, - opcode, - readOnly, - rsv1 - }; - if (isBlob(data)) { - if (this._state !== DEFAULT) { - this.enqueue([this.getBlobData, data, this._compress, opts, cb]); - } else { - this.getBlobData(data, this._compress, opts, cb); - } - } else if (this._state !== DEFAULT) { - this.enqueue([this.dispatch, data, this._compress, opts, cb]); - } else { - this.dispatch(data, this._compress, opts, cb); - } - } - /** - * Gets the contents of a blob as binary data. - * - * @param {Blob} blob The blob - * @param {Boolean} [compress=false] Specifies whether or not to compress - * the data - * @param {Object} options Options object - * @param {Boolean} [options.fin=false] Specifies whether or not to set the - * FIN bit - * @param {Function} [options.generateMask] The function used to generate the - * masking key - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Buffer} [options.maskBuffer] The buffer used to store the masking - * key - * @param {Number} options.opcode The opcode - * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be - * modified - * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the - * RSV1 bit - * @param {Function} [cb] Callback - * @private - */ - getBlobData(blob, compress, options, cb) { - this._bufferedBytes += options[kByteLength]; - this._state = GET_BLOB_DATA; - blob.arrayBuffer().then((arrayBuffer) => { - if (this._socket.destroyed) { - const err = new Error( - "The socket was closed while the blob was being read" - ); - process.nextTick(callCallbacks, this, err, cb); - return; - } - this._bufferedBytes -= options[kByteLength]; - const data = toBuffer(arrayBuffer); - if (!compress) { - this._state = DEFAULT; - this.sendFrame(_Sender.frame(data, options), cb); - this.dequeue(); - } else { - this.dispatch(data, compress, options, cb); - } - }).catch((err) => { - process.nextTick(onError, this, err, cb); - }); - } - /** - * Dispatches a message. - * - * @param {(Buffer|String)} data The message to send - * @param {Boolean} [compress=false] Specifies whether or not to compress - * `data` - * @param {Object} options Options object - * @param {Boolean} [options.fin=false] Specifies whether or not to set the - * FIN bit - * @param {Function} [options.generateMask] The function used to generate the - * masking key - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Buffer} [options.maskBuffer] The buffer used to store the masking - * key - * @param {Number} options.opcode The opcode - * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be - * modified - * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the - * RSV1 bit - * @param {Function} [cb] Callback - * @private - */ - dispatch(data, compress, options, cb) { - if (!compress) { - this.sendFrame(_Sender.frame(data, options), cb); - return; - } - const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName]; - this._bufferedBytes += options[kByteLength]; - this._state = DEFLATING; - perMessageDeflate.compress(data, options.fin, (_, buf) => { - if (this._socket.destroyed) { - const err = new Error( - "The socket was closed while data was being compressed" - ); - callCallbacks(this, err, cb); - return; - } - this._bufferedBytes -= options[kByteLength]; - this._state = DEFAULT; - options.readOnly = false; - this.sendFrame(_Sender.frame(buf, options), cb); - this.dequeue(); - }); - } - /** - * Executes queued send operations. - * - * @private - */ - dequeue() { - while (this._state === DEFAULT && this._queue.length) { - const params = this._queue.shift(); - this._bufferedBytes -= params[3][kByteLength]; - Reflect.apply(params[0], this, params.slice(1)); - } - } - /** - * Enqueues a send operation. - * - * @param {Array} params Send operation parameters. - * @private - */ - enqueue(params) { - this._bufferedBytes += params[3][kByteLength]; - this._queue.push(params); - } - /** - * Sends a frame. - * - * @param {(Buffer | String)[]} list The frame to send - * @param {Function} [cb] Callback - * @private - */ - sendFrame(list, cb) { - if (list.length === 2) { - this._socket.cork(); - this._socket.write(list[0]); - this._socket.write(list[1], cb); - this._socket.uncork(); - } else { - this._socket.write(list[0], cb); - } - } - }; - module.exports = Sender2; - function callCallbacks(sender, err, cb) { - if (typeof cb === "function") cb(err); - for (let i = 0; i < sender._queue.length; i++) { - const params = sender._queue[i]; - const callback = params[params.length - 1]; - if (typeof callback === "function") callback(err); - } - } - function onError(sender, err, cb) { - callCallbacks(sender, err, cb); - sender.onerror(err); - } - } -}); - -// node_modules/ws/lib/event-target.js -var require_event_target = __commonJS({ - "node_modules/ws/lib/event-target.js"(exports, module) { - "use strict"; - var { kForOnEventAttribute, kListener } = require_constants(); - var kCode = /* @__PURE__ */ Symbol("kCode"); - var kData = /* @__PURE__ */ Symbol("kData"); - var kError = /* @__PURE__ */ Symbol("kError"); - var kMessage = /* @__PURE__ */ Symbol("kMessage"); - var kReason = /* @__PURE__ */ Symbol("kReason"); - var kTarget = /* @__PURE__ */ Symbol("kTarget"); - var kType = /* @__PURE__ */ Symbol("kType"); - var kWasClean = /* @__PURE__ */ Symbol("kWasClean"); - var Event2 = class { - /** - * Create a new `Event`. - * - * @param {String} type The name of the event - * @throws {TypeError} If the `type` argument is not specified - */ - constructor(type) { - this[kTarget] = null; - this[kType] = type; - } - /** - * @type {*} - */ - get target() { - return this[kTarget]; - } - /** - * @type {String} - */ - get type() { - return this[kType]; - } - }; - Object.defineProperty(Event2.prototype, "target", { enumerable: true }); - Object.defineProperty(Event2.prototype, "type", { enumerable: true }); - var CloseEvent = class extends Event2 { - /** - * Create a new `CloseEvent`. - * - * @param {String} type The name of the event - * @param {Object} [options] A dictionary object that allows for setting - * attributes via object members of the same name - * @param {Number} [options.code=0] The status code explaining why the - * connection was closed - * @param {String} [options.reason=''] A human-readable string explaining why - * the connection was closed - * @param {Boolean} [options.wasClean=false] Indicates whether or not the - * connection was cleanly closed - */ - constructor(type, options = {}) { - super(type); - this[kCode] = options.code === void 0 ? 0 : options.code; - this[kReason] = options.reason === void 0 ? "" : options.reason; - this[kWasClean] = options.wasClean === void 0 ? false : options.wasClean; - } - /** - * @type {Number} - */ - get code() { - return this[kCode]; - } - /** - * @type {String} - */ - get reason() { - return this[kReason]; - } - /** - * @type {Boolean} - */ - get wasClean() { - return this[kWasClean]; - } - }; - Object.defineProperty(CloseEvent.prototype, "code", { enumerable: true }); - Object.defineProperty(CloseEvent.prototype, "reason", { enumerable: true }); - Object.defineProperty(CloseEvent.prototype, "wasClean", { enumerable: true }); - var ErrorEvent = class extends Event2 { - /** - * Create a new `ErrorEvent`. - * - * @param {String} type The name of the event - * @param {Object} [options] A dictionary object that allows for setting - * attributes via object members of the same name - * @param {*} [options.error=null] The error that generated this event - * @param {String} [options.message=''] The error message - */ - constructor(type, options = {}) { - super(type); - this[kError] = options.error === void 0 ? null : options.error; - this[kMessage] = options.message === void 0 ? "" : options.message; - } - /** - * @type {*} - */ - get error() { - return this[kError]; - } - /** - * @type {String} - */ - get message() { - return this[kMessage]; - } - }; - Object.defineProperty(ErrorEvent.prototype, "error", { enumerable: true }); - Object.defineProperty(ErrorEvent.prototype, "message", { enumerable: true }); - var MessageEvent = class extends Event2 { - /** - * Create a new `MessageEvent`. - * - * @param {String} type The name of the event - * @param {Object} [options] A dictionary object that allows for setting - * attributes via object members of the same name - * @param {*} [options.data=null] The message content - */ - constructor(type, options = {}) { - super(type); - this[kData] = options.data === void 0 ? null : options.data; - } - /** - * @type {*} - */ - get data() { - return this[kData]; - } - }; - Object.defineProperty(MessageEvent.prototype, "data", { enumerable: true }); - var EventTarget2 = { - /** - * Register an event listener. - * - * @param {String} type A string representing the event type to listen for - * @param {(Function|Object)} handler The listener to add - * @param {Object} [options] An options object specifies characteristics about - * the event listener - * @param {Boolean} [options.once=false] A `Boolean` indicating that the - * listener should be invoked at most once after being added. If `true`, - * the listener would be automatically removed when invoked. - * @public - */ - addEventListener(type, handler, options = {}) { - for (const listener of this.listeners(type)) { - if (!options[kForOnEventAttribute] && listener[kListener] === handler && !listener[kForOnEventAttribute]) { - return; - } - } - let wrapper; - if (type === "message") { - wrapper = function onMessage(data, isBinary) { - const event = new MessageEvent("message", { - data: isBinary ? data : data.toString() - }); - event[kTarget] = this; - callListener(handler, this, event); - }; - } else if (type === "close") { - wrapper = function onClose(code, message) { - const event = new CloseEvent("close", { - code, - reason: message.toString(), - wasClean: this._closeFrameReceived && this._closeFrameSent - }); - event[kTarget] = this; - callListener(handler, this, event); - }; - } else if (type === "error") { - wrapper = function onError(error) { - const event = new ErrorEvent("error", { - error, - message: error.message - }); - event[kTarget] = this; - callListener(handler, this, event); - }; - } else if (type === "open") { - wrapper = function onOpen() { - const event = new Event2("open"); - event[kTarget] = this; - callListener(handler, this, event); - }; - } else { - return; - } - wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute]; - wrapper[kListener] = handler; - if (options.once) { - this.once(type, wrapper); - } else { - this.on(type, wrapper); - } - }, - /** - * Remove an event listener. - * - * @param {String} type A string representing the event type to remove - * @param {(Function|Object)} handler The listener to remove - * @public - */ - removeEventListener(type, handler) { - for (const listener of this.listeners(type)) { - if (listener[kListener] === handler && !listener[kForOnEventAttribute]) { - this.removeListener(type, listener); - break; - } - } - } - }; - module.exports = { - CloseEvent, - ErrorEvent, - Event: Event2, - EventTarget: EventTarget2, - MessageEvent - }; - function callListener(listener, thisArg, event) { - if (typeof listener === "object" && listener.handleEvent) { - listener.handleEvent.call(listener, event); - } else { - listener.call(thisArg, event); - } - } - } -}); - -// node_modules/ws/lib/extension.js -var require_extension = __commonJS({ - "node_modules/ws/lib/extension.js"(exports, module) { - "use strict"; - var { tokenChars } = require_validation(); - function push(dest, name, elem) { - if (dest[name] === void 0) dest[name] = [elem]; - else dest[name].push(elem); - } - function parse(header) { - const offers = /* @__PURE__ */ Object.create(null); - let params = /* @__PURE__ */ Object.create(null); - let mustUnescape = false; - let isEscaping = false; - let inQuotes = false; - let extensionName; - let paramName; - let start = -1; - let code = -1; - let end = -1; - let i = 0; - for (; i < header.length; i++) { - code = header.charCodeAt(i); - if (extensionName === void 0) { - if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (i !== 0 && (code === 32 || code === 9)) { - if (end === -1 && start !== -1) end = i; - } else if (code === 59 || code === 44) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - if (end === -1) end = i; - const name = header.slice(start, end); - if (code === 44) { - push(offers, name, params); - params = /* @__PURE__ */ Object.create(null); - } else { - extensionName = name; - } - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else if (paramName === void 0) { - if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 32 || code === 9) { - if (end === -1 && start !== -1) end = i; - } else if (code === 59 || code === 44) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - if (end === -1) end = i; - push(params, header.slice(start, end), true); - if (code === 44) { - push(offers, extensionName, params); - params = /* @__PURE__ */ Object.create(null); - extensionName = void 0; - } - start = end = -1; - } else if (code === 61 && start !== -1 && end === -1) { - paramName = header.slice(start, i); - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else { - if (isEscaping) { - if (tokenChars[code] !== 1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - if (start === -1) start = i; - else if (!mustUnescape) mustUnescape = true; - isEscaping = false; - } else if (inQuotes) { - if (tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 34 && start !== -1) { - inQuotes = false; - end = i; - } else if (code === 92) { - isEscaping = true; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else if (code === 34 && header.charCodeAt(i - 1) === 61) { - inQuotes = true; - } else if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (start !== -1 && (code === 32 || code === 9)) { - if (end === -1) end = i; - } else if (code === 59 || code === 44) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - if (end === -1) end = i; - let value = header.slice(start, end); - if (mustUnescape) { - value = value.replace(/\\/g, ""); - mustUnescape = false; - } - push(params, paramName, value); - if (code === 44) { - push(offers, extensionName, params); - params = /* @__PURE__ */ Object.create(null); - extensionName = void 0; - } - paramName = void 0; - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } - } - if (start === -1 || inQuotes || code === 32 || code === 9) { - throw new SyntaxError("Unexpected end of input"); - } - if (end === -1) end = i; - const token = header.slice(start, end); - if (extensionName === void 0) { - push(offers, token, params); - } else { - if (paramName === void 0) { - push(params, token, true); - } else if (mustUnescape) { - push(params, paramName, token.replace(/\\/g, "")); - } else { - push(params, paramName, token); - } - push(offers, extensionName, params); - } - return offers; - } - function format(extensions) { - return Object.keys(extensions).map((extension2) => { - let configurations = extensions[extension2]; - if (!Array.isArray(configurations)) configurations = [configurations]; - return configurations.map((params) => { - return [extension2].concat( - Object.keys(params).map((k) => { - let values = params[k]; - if (!Array.isArray(values)) values = [values]; - return values.map((v) => v === true ? k : `${k}=${v}`).join("; "); - }) - ).join("; "); - }).join(", "); - }).join(", "); - } - module.exports = { format, parse }; - } -}); - -// node_modules/ws/lib/websocket.js -var require_websocket = __commonJS({ - "node_modules/ws/lib/websocket.js"(exports, module) { - "use strict"; - var EventEmitter = __require("events"); - var https = __require("https"); - var http2 = __require("http"); - var net = __require("net"); - var tls = __require("tls"); - var { randomBytes: randomBytes4, createHash: createHash4 } = __require("crypto"); - var { Duplex, Readable } = __require("stream"); - var { URL: URL2 } = __require("url"); - var PerMessageDeflate2 = require_permessage_deflate(); - var Receiver2 = require_receiver(); - var Sender2 = require_sender(); - var { isBlob } = require_validation(); - var { - BINARY_TYPES, - CLOSE_TIMEOUT, - EMPTY_BUFFER, - GUID, - kForOnEventAttribute, - kListener, - kStatusCode, - kWebSocket, - NOOP - } = require_constants(); - var { - EventTarget: { addEventListener, removeEventListener } - } = require_event_target(); - var { format, parse } = require_extension(); - var { toBuffer } = require_buffer_util(); - var kAborted = /* @__PURE__ */ Symbol("kAborted"); - var protocolVersions = [8, 13]; - var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"]; - var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/; - var WebSocket2 = class _WebSocket extends EventEmitter { - /** - * Create a new `WebSocket`. - * - * @param {(String|URL)} address The URL to which to connect - * @param {(String|String[])} [protocols] The subprotocols - * @param {Object} [options] Connection options - */ - constructor(address2, protocols, options) { - super(); - this._binaryType = BINARY_TYPES[0]; - this._closeCode = 1006; - this._closeFrameReceived = false; - this._closeFrameSent = false; - this._closeMessage = EMPTY_BUFFER; - this._closeTimer = null; - this._errorEmitted = false; - this._extensions = {}; - this._paused = false; - this._protocol = ""; - this._readyState = _WebSocket.CONNECTING; - this._receiver = null; - this._sender = null; - this._socket = null; - if (address2 !== null) { - this._bufferedAmount = 0; - this._isServer = false; - this._redirects = 0; - if (protocols === void 0) { - protocols = []; - } else if (!Array.isArray(protocols)) { - if (typeof protocols === "object" && protocols !== null) { - options = protocols; - protocols = []; - } else { - protocols = [protocols]; - } - } - initAsClient(this, address2, protocols, options); - } else { - this._autoPong = options.autoPong; - this._closeTimeout = options.closeTimeout; - this._isServer = true; - } - } - /** - * For historical reasons, the custom "nodebuffer" type is used by the default - * instead of "blob". - * - * @type {String} - */ - get binaryType() { - return this._binaryType; - } - set binaryType(type) { - if (!BINARY_TYPES.includes(type)) return; - this._binaryType = type; - if (this._receiver) this._receiver._binaryType = type; - } - /** - * @type {Number} - */ - get bufferedAmount() { - if (!this._socket) return this._bufferedAmount; - return this._socket._writableState.length + this._sender._bufferedBytes; - } - /** - * @type {String} - */ - get extensions() { - return Object.keys(this._extensions).join(); - } - /** - * @type {Boolean} - */ - get isPaused() { - return this._paused; - } - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onclose() { - return null; - } - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onerror() { - return null; - } - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onopen() { - return null; - } - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onmessage() { - return null; - } - /** - * @type {String} - */ - get protocol() { - return this._protocol; - } - /** - * @type {Number} - */ - get readyState() { - return this._readyState; - } - /** - * @type {String} - */ - get url() { - return this._url; - } - /** - * Set up the socket and the internal resources. - * - * @param {Duplex} socket The network socket between the server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Object} options Options object - * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether - * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted - * multiple times in the same tick - * @param {Function} [options.generateMask] The function used to generate the - * masking key - * @param {Number} [options.maxPayload=0] The maximum allowed message size - * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or - * not to skip UTF-8 validation for text and close messages - * @private - */ - setSocket(socket, head, options) { - const receiver = new Receiver2({ - allowSynchronousEvents: options.allowSynchronousEvents, - binaryType: this.binaryType, - extensions: this._extensions, - isServer: this._isServer, - maxPayload: options.maxPayload, - skipUTF8Validation: options.skipUTF8Validation - }); - const sender = new Sender2(socket, this._extensions, options.generateMask); - this._receiver = receiver; - this._sender = sender; - this._socket = socket; - receiver[kWebSocket] = this; - sender[kWebSocket] = this; - socket[kWebSocket] = this; - receiver.on("conclude", receiverOnConclude); - receiver.on("drain", receiverOnDrain); - receiver.on("error", receiverOnError); - receiver.on("message", receiverOnMessage); - receiver.on("ping", receiverOnPing); - receiver.on("pong", receiverOnPong); - sender.onerror = senderOnError; - if (socket.setTimeout) socket.setTimeout(0); - if (socket.setNoDelay) socket.setNoDelay(); - if (head.length > 0) socket.unshift(head); - socket.on("close", socketOnClose); - socket.on("data", socketOnData); - socket.on("end", socketOnEnd); - socket.on("error", socketOnError); - this._readyState = _WebSocket.OPEN; - this.emit("open"); - } - /** - * Emit the `'close'` event. - * - * @private - */ - emitClose() { - if (!this._socket) { - this._readyState = _WebSocket.CLOSED; - this.emit("close", this._closeCode, this._closeMessage); - return; - } - if (this._extensions[PerMessageDeflate2.extensionName]) { - this._extensions[PerMessageDeflate2.extensionName].cleanup(); - } - this._receiver.removeAllListeners(); - this._readyState = _WebSocket.CLOSED; - this.emit("close", this._closeCode, this._closeMessage); - } - /** - * Start a closing handshake. - * - * +----------+ +-----------+ +----------+ - * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - - * | +----------+ +-----------+ +----------+ | - * +----------+ +-----------+ | - * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING - * +----------+ +-----------+ | - * | | | +---+ | - * +------------------------+-->|fin| - - - - - * | +---+ | +---+ - * - - - - -|fin|<---------------------+ - * +---+ - * - * @param {Number} [code] Status code explaining why the connection is closing - * @param {(String|Buffer)} [data] The reason why the connection is - * closing - * @public - */ - close(code, data) { - if (this.readyState === _WebSocket.CLOSED) return; - if (this.readyState === _WebSocket.CONNECTING) { - const msg = "WebSocket was closed before the connection was established"; - abortHandshake(this, this._req, msg); - return; - } - if (this.readyState === _WebSocket.CLOSING) { - if (this._closeFrameSent && (this._closeFrameReceived || this._receiver._writableState.errorEmitted)) { - this._socket.end(); - } - return; - } - this._readyState = _WebSocket.CLOSING; - this._sender.close(code, data, !this._isServer, (err) => { - if (err) return; - this._closeFrameSent = true; - if (this._closeFrameReceived || this._receiver._writableState.errorEmitted) { - this._socket.end(); - } - }); - setCloseTimer(this); - } - /** - * Pause the socket. - * - * @public - */ - pause() { - if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) { - return; - } - this._paused = true; - this._socket.pause(); - } - /** - * Send a ping. - * - * @param {*} [data] The data to send - * @param {Boolean} [mask] Indicates whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when the ping is sent - * @public - */ - ping(data, mask, cb) { - if (this.readyState === _WebSocket.CONNECTING) { - throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); - } - if (typeof data === "function") { - cb = data; - data = mask = void 0; - } else if (typeof mask === "function") { - cb = mask; - mask = void 0; - } - if (typeof data === "number") data = data.toString(); - if (this.readyState !== _WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - if (mask === void 0) mask = !this._isServer; - this._sender.ping(data || EMPTY_BUFFER, mask, cb); - } - /** - * Send a pong. - * - * @param {*} [data] The data to send - * @param {Boolean} [mask] Indicates whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when the pong is sent - * @public - */ - pong(data, mask, cb) { - if (this.readyState === _WebSocket.CONNECTING) { - throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); - } - if (typeof data === "function") { - cb = data; - data = mask = void 0; - } else if (typeof mask === "function") { - cb = mask; - mask = void 0; - } - if (typeof data === "number") data = data.toString(); - if (this.readyState !== _WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - if (mask === void 0) mask = !this._isServer; - this._sender.pong(data || EMPTY_BUFFER, mask, cb); - } - /** - * Resume the socket. - * - * @public - */ - resume() { - if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) { - return; - } - this._paused = false; - if (!this._receiver._writableState.needDrain) this._socket.resume(); - } - /** - * Send a data message. - * - * @param {*} data The message to send - * @param {Object} [options] Options object - * @param {Boolean} [options.binary] Specifies whether `data` is binary or - * text - * @param {Boolean} [options.compress] Specifies whether or not to compress - * `data` - * @param {Boolean} [options.fin=true] Specifies whether the fragment is the - * last one - * @param {Boolean} [options.mask] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when data is written out - * @public - */ - send(data, options, cb) { - if (this.readyState === _WebSocket.CONNECTING) { - throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); - } - if (typeof options === "function") { - cb = options; - options = {}; - } - if (typeof data === "number") data = data.toString(); - if (this.readyState !== _WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - const opts = { - binary: typeof data !== "string", - mask: !this._isServer, - compress: true, - fin: true, - ...options - }; - if (!this._extensions[PerMessageDeflate2.extensionName]) { - opts.compress = false; - } - this._sender.send(data || EMPTY_BUFFER, opts, cb); - } - /** - * Forcibly close the connection. - * - * @public - */ - terminate() { - if (this.readyState === _WebSocket.CLOSED) return; - if (this.readyState === _WebSocket.CONNECTING) { - const msg = "WebSocket was closed before the connection was established"; - abortHandshake(this, this._req, msg); - return; - } - if (this._socket) { - this._readyState = _WebSocket.CLOSING; - this._socket.destroy(); - } - } - }; - Object.defineProperty(WebSocket2, "CONNECTING", { - enumerable: true, - value: readyStates.indexOf("CONNECTING") - }); - Object.defineProperty(WebSocket2.prototype, "CONNECTING", { - enumerable: true, - value: readyStates.indexOf("CONNECTING") - }); - Object.defineProperty(WebSocket2, "OPEN", { - enumerable: true, - value: readyStates.indexOf("OPEN") - }); - Object.defineProperty(WebSocket2.prototype, "OPEN", { - enumerable: true, - value: readyStates.indexOf("OPEN") - }); - Object.defineProperty(WebSocket2, "CLOSING", { - enumerable: true, - value: readyStates.indexOf("CLOSING") - }); - Object.defineProperty(WebSocket2.prototype, "CLOSING", { - enumerable: true, - value: readyStates.indexOf("CLOSING") - }); - Object.defineProperty(WebSocket2, "CLOSED", { - enumerable: true, - value: readyStates.indexOf("CLOSED") - }); - Object.defineProperty(WebSocket2.prototype, "CLOSED", { - enumerable: true, - value: readyStates.indexOf("CLOSED") - }); - [ - "binaryType", - "bufferedAmount", - "extensions", - "isPaused", - "protocol", - "readyState", - "url" - ].forEach((property) => { - Object.defineProperty(WebSocket2.prototype, property, { enumerable: true }); - }); - ["open", "error", "close", "message"].forEach((method) => { - Object.defineProperty(WebSocket2.prototype, `on${method}`, { - enumerable: true, - get() { - for (const listener of this.listeners(method)) { - if (listener[kForOnEventAttribute]) return listener[kListener]; - } - return null; - }, - set(handler) { - for (const listener of this.listeners(method)) { - if (listener[kForOnEventAttribute]) { - this.removeListener(method, listener); - break; - } - } - if (typeof handler !== "function") return; - this.addEventListener(method, handler, { - [kForOnEventAttribute]: true - }); - } - }); - }); - WebSocket2.prototype.addEventListener = addEventListener; - WebSocket2.prototype.removeEventListener = removeEventListener; - module.exports = WebSocket2; - function initAsClient(websocket, address2, protocols, options) { - const opts = { - allowSynchronousEvents: true, - autoPong: true, - closeTimeout: CLOSE_TIMEOUT, - protocolVersion: protocolVersions[1], - maxPayload: 100 * 1024 * 1024, - skipUTF8Validation: false, - perMessageDeflate: true, - followRedirects: false, - maxRedirects: 10, - ...options, - socketPath: void 0, - hostname: void 0, - protocol: void 0, - timeout: void 0, - method: "GET", - host: void 0, - path: void 0, - port: void 0 - }; - websocket._autoPong = opts.autoPong; - websocket._closeTimeout = opts.closeTimeout; - if (!protocolVersions.includes(opts.protocolVersion)) { - throw new RangeError( - `Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(", ")})` - ); - } - let parsedUrl; - if (address2 instanceof URL2) { - parsedUrl = address2; - } else { - try { - parsedUrl = new URL2(address2); - } catch { - throw new SyntaxError(`Invalid URL: ${address2}`); - } - } - if (parsedUrl.protocol === "http:") { - parsedUrl.protocol = "ws:"; - } else if (parsedUrl.protocol === "https:") { - parsedUrl.protocol = "wss:"; - } - websocket._url = parsedUrl.href; - const isSecure = parsedUrl.protocol === "wss:"; - const isIpcUrl = parsedUrl.protocol === "ws+unix:"; - let invalidUrlMessage; - if (parsedUrl.protocol !== "ws:" && !isSecure && !isIpcUrl) { - invalidUrlMessage = `The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`; - } else if (isIpcUrl && !parsedUrl.pathname) { - invalidUrlMessage = "The URL's pathname is empty"; - } else if (parsedUrl.hash) { - invalidUrlMessage = "The URL contains a fragment identifier"; - } - if (invalidUrlMessage) { - const err = new SyntaxError(invalidUrlMessage); - if (websocket._redirects === 0) { - throw err; - } else { - emitErrorAndClose(websocket, err); - return; - } - } - const defaultPort = isSecure ? 443 : 80; - const key = randomBytes4(16).toString("base64"); - const request = isSecure ? https.request : http2.request; - const protocolSet = /* @__PURE__ */ new Set(); - let perMessageDeflate; - opts.createConnection = opts.createConnection || (isSecure ? tlsConnect : netConnect); - opts.defaultPort = opts.defaultPort || defaultPort; - opts.port = parsedUrl.port || defaultPort; - opts.host = parsedUrl.hostname.startsWith("[") ? parsedUrl.hostname.slice(1, -1) : parsedUrl.hostname; - opts.headers = { - ...opts.headers, - "Sec-WebSocket-Version": opts.protocolVersion, - "Sec-WebSocket-Key": key, - Connection: "Upgrade", - Upgrade: "websocket" - }; - opts.path = parsedUrl.pathname + parsedUrl.search; - opts.timeout = opts.handshakeTimeout; - if (opts.perMessageDeflate) { - perMessageDeflate = new PerMessageDeflate2({ - ...opts.perMessageDeflate, - isServer: false, - maxPayload: opts.maxPayload - }); - opts.headers["Sec-WebSocket-Extensions"] = format({ - [PerMessageDeflate2.extensionName]: perMessageDeflate.offer() - }); - } - if (protocols.length) { - for (const protocol of protocols) { - if (typeof protocol !== "string" || !subprotocolRegex.test(protocol) || protocolSet.has(protocol)) { - throw new SyntaxError( - "An invalid or duplicated subprotocol was specified" - ); - } - protocolSet.add(protocol); - } - opts.headers["Sec-WebSocket-Protocol"] = protocols.join(","); - } - if (opts.origin) { - if (opts.protocolVersion < 13) { - opts.headers["Sec-WebSocket-Origin"] = opts.origin; - } else { - opts.headers.Origin = opts.origin; - } - } - if (parsedUrl.username || parsedUrl.password) { - opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; - } - if (isIpcUrl) { - const parts = opts.path.split(":"); - opts.socketPath = parts[0]; - opts.path = parts[1]; - } - let req; - if (opts.followRedirects) { - if (websocket._redirects === 0) { - websocket._originalIpc = isIpcUrl; - websocket._originalSecure = isSecure; - websocket._originalHostOrSocketPath = isIpcUrl ? opts.socketPath : parsedUrl.host; - const headers = options && options.headers; - options = { ...options, headers: {} }; - if (headers) { - for (const [key2, value] of Object.entries(headers)) { - options.headers[key2.toLowerCase()] = value; - } - } - } else if (websocket.listenerCount("redirect") === 0) { - const isSameHost = isIpcUrl ? websocket._originalIpc ? opts.socketPath === websocket._originalHostOrSocketPath : false : websocket._originalIpc ? false : parsedUrl.host === websocket._originalHostOrSocketPath; - if (!isSameHost || websocket._originalSecure && !isSecure) { - delete opts.headers.authorization; - delete opts.headers.cookie; - if (!isSameHost) delete opts.headers.host; - opts.auth = void 0; - } - } - if (opts.auth && !options.headers.authorization) { - options.headers.authorization = "Basic " + Buffer.from(opts.auth).toString("base64"); - } - req = websocket._req = request(opts); - if (websocket._redirects) { - websocket.emit("redirect", websocket.url, req); - } - } else { - req = websocket._req = request(opts); - } - if (opts.timeout) { - req.on("timeout", () => { - abortHandshake(websocket, req, "Opening handshake has timed out"); - }); - } - req.on("error", (err) => { - if (req === null || req[kAborted]) return; - req = websocket._req = null; - emitErrorAndClose(websocket, err); - }); - req.on("response", (res) => { - const location = res.headers.location; - const statusCode = res.statusCode; - if (location && opts.followRedirects && statusCode >= 300 && statusCode < 400) { - if (++websocket._redirects > opts.maxRedirects) { - abortHandshake(websocket, req, "Maximum redirects exceeded"); - return; - } - req.abort(); - let addr; - try { - addr = new URL2(location, address2); - } catch (e7) { - const err = new SyntaxError(`Invalid URL: ${location}`); - emitErrorAndClose(websocket, err); - return; - } - initAsClient(websocket, addr, protocols, options); - } else if (!websocket.emit("unexpected-response", req, res)) { - abortHandshake( - websocket, - req, - `Unexpected server response: ${res.statusCode}` - ); - } - }); - req.on("upgrade", (res, socket, head) => { - websocket.emit("upgrade", res); - if (websocket.readyState !== WebSocket2.CONNECTING) return; - req = websocket._req = null; - const upgrade = res.headers.upgrade; - if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") { - abortHandshake(websocket, socket, "Invalid Upgrade header"); - return; - } - const digest = createHash4("sha1").update(key + GUID).digest("base64"); - if (res.headers["sec-websocket-accept"] !== digest) { - abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header"); - return; - } - const serverProt = res.headers["sec-websocket-protocol"]; - let protError; - if (serverProt !== void 0) { - if (!protocolSet.size) { - protError = "Server sent a subprotocol but none was requested"; - } else if (!protocolSet.has(serverProt)) { - protError = "Server sent an invalid subprotocol"; - } - } else if (protocolSet.size) { - protError = "Server sent no subprotocol"; - } - if (protError) { - abortHandshake(websocket, socket, protError); - return; - } - if (serverProt) websocket._protocol = serverProt; - const secWebSocketExtensions = res.headers["sec-websocket-extensions"]; - if (secWebSocketExtensions !== void 0) { - if (!perMessageDeflate) { - const message = "Server sent a Sec-WebSocket-Extensions header but no extension was requested"; - abortHandshake(websocket, socket, message); - return; - } - let extensions; - try { - extensions = parse(secWebSocketExtensions); - } catch (err) { - const message = "Invalid Sec-WebSocket-Extensions header"; - abortHandshake(websocket, socket, message); - return; - } - const extensionNames = Object.keys(extensions); - if (extensionNames.length !== 1 || extensionNames[0] !== PerMessageDeflate2.extensionName) { - const message = "Server indicated an extension that was not requested"; - abortHandshake(websocket, socket, message); - return; - } - try { - perMessageDeflate.accept(extensions[PerMessageDeflate2.extensionName]); - } catch (err) { - const message = "Invalid Sec-WebSocket-Extensions header"; - abortHandshake(websocket, socket, message); - return; - } - websocket._extensions[PerMessageDeflate2.extensionName] = perMessageDeflate; - } - websocket.setSocket(socket, head, { - allowSynchronousEvents: opts.allowSynchronousEvents, - generateMask: opts.generateMask, - maxPayload: opts.maxPayload, - skipUTF8Validation: opts.skipUTF8Validation - }); - }); - if (opts.finishRequest) { - opts.finishRequest(req, websocket); - } else { - req.end(); - } - } - function emitErrorAndClose(websocket, err) { - websocket._readyState = WebSocket2.CLOSING; - websocket._errorEmitted = true; - websocket.emit("error", err); - websocket.emitClose(); - } - function netConnect(options) { - options.path = options.socketPath; - return net.connect(options); - } - function tlsConnect(options) { - options.path = void 0; - if (!options.servername && options.servername !== "") { - options.servername = net.isIP(options.host) ? "" : options.host; - } - return tls.connect(options); - } - function abortHandshake(websocket, stream, message) { - websocket._readyState = WebSocket2.CLOSING; - const err = new Error(message); - Error.captureStackTrace(err, abortHandshake); - if (stream.setHeader) { - stream[kAborted] = true; - stream.abort(); - if (stream.socket && !stream.socket.destroyed) { - stream.socket.destroy(); - } - process.nextTick(emitErrorAndClose, websocket, err); - } else { - stream.destroy(err); - stream.once("error", websocket.emit.bind(websocket, "error")); - stream.once("close", websocket.emitClose.bind(websocket)); - } - } - function sendAfterClose(websocket, data, cb) { - if (data) { - const length = isBlob(data) ? data.size : toBuffer(data).length; - if (websocket._socket) websocket._sender._bufferedBytes += length; - else websocket._bufferedAmount += length; - } - if (cb) { - const err = new Error( - `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})` - ); - process.nextTick(cb, err); - } - } - function receiverOnConclude(code, reason) { - const websocket = this[kWebSocket]; - websocket._closeFrameReceived = true; - websocket._closeMessage = reason; - websocket._closeCode = code; - if (websocket._socket[kWebSocket] === void 0) return; - websocket._socket.removeListener("data", socketOnData); - process.nextTick(resume, websocket._socket); - if (code === 1005) websocket.close(); - else websocket.close(code, reason); - } - function receiverOnDrain() { - const websocket = this[kWebSocket]; - if (!websocket.isPaused) websocket._socket.resume(); - } - function receiverOnError(err) { - const websocket = this[kWebSocket]; - if (websocket._socket[kWebSocket] !== void 0) { - websocket._socket.removeListener("data", socketOnData); - process.nextTick(resume, websocket._socket); - websocket.close(err[kStatusCode]); - } - if (!websocket._errorEmitted) { - websocket._errorEmitted = true; - websocket.emit("error", err); - } - } - function receiverOnFinish() { - this[kWebSocket].emitClose(); - } - function receiverOnMessage(data, isBinary) { - this[kWebSocket].emit("message", data, isBinary); - } - function receiverOnPing(data) { - const websocket = this[kWebSocket]; - if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP); - websocket.emit("ping", data); - } - function receiverOnPong(data) { - this[kWebSocket].emit("pong", data); - } - function resume(stream) { - stream.resume(); - } - function senderOnError(err) { - const websocket = this[kWebSocket]; - if (websocket.readyState === WebSocket2.CLOSED) return; - if (websocket.readyState === WebSocket2.OPEN) { - websocket._readyState = WebSocket2.CLOSING; - setCloseTimer(websocket); - } - this._socket.end(); - if (!websocket._errorEmitted) { - websocket._errorEmitted = true; - websocket.emit("error", err); - } - } - function setCloseTimer(websocket) { - websocket._closeTimer = setTimeout( - websocket._socket.destroy.bind(websocket._socket), - websocket._closeTimeout - ); - } - function socketOnClose() { - const websocket = this[kWebSocket]; - this.removeListener("close", socketOnClose); - this.removeListener("data", socketOnData); - this.removeListener("end", socketOnEnd); - websocket._readyState = WebSocket2.CLOSING; - if (!this._readableState.endEmitted && !websocket._closeFrameReceived && !websocket._receiver._writableState.errorEmitted && this._readableState.length !== 0) { - const chunk = this.read(this._readableState.length); - websocket._receiver.write(chunk); - } - websocket._receiver.end(); - this[kWebSocket] = void 0; - clearTimeout(websocket._closeTimer); - if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) { - websocket.emitClose(); - } else { - websocket._receiver.on("error", receiverOnFinish); - websocket._receiver.on("finish", receiverOnFinish); - } - } - function socketOnData(chunk) { - if (!this[kWebSocket]._receiver.write(chunk)) { - this.pause(); - } - } - function socketOnEnd() { - const websocket = this[kWebSocket]; - websocket._readyState = WebSocket2.CLOSING; - websocket._receiver.end(); - this.end(); - } - function socketOnError() { - const websocket = this[kWebSocket]; - this.removeListener("error", socketOnError); - this.on("error", NOOP); - if (websocket) { - websocket._readyState = WebSocket2.CLOSING; - this.destroy(); - } - } - } -}); - -// node_modules/ws/lib/stream.js -var require_stream = __commonJS({ - "node_modules/ws/lib/stream.js"(exports, module) { - "use strict"; - var WebSocket2 = require_websocket(); - var { Duplex } = __require("stream"); - function emitClose(stream) { - stream.emit("close"); - } - function duplexOnEnd() { - if (!this.destroyed && this._writableState.finished) { - this.destroy(); - } - } - function duplexOnError(err) { - this.removeListener("error", duplexOnError); - this.destroy(); - if (this.listenerCount("error") === 0) { - this.emit("error", err); - } - } - function createWebSocketStream2(ws, options) { - let terminateOnDestroy = true; - const duplex = new Duplex({ - ...options, - autoDestroy: false, - emitClose: false, - objectMode: false, - writableObjectMode: false - }); - ws.on("message", function message(msg, isBinary) { - const data = !isBinary && duplex._readableState.objectMode ? msg.toString() : msg; - if (!duplex.push(data)) ws.pause(); - }); - ws.once("error", function error(err) { - if (duplex.destroyed) return; - terminateOnDestroy = false; - duplex.destroy(err); - }); - ws.once("close", function close() { - if (duplex.destroyed) return; - duplex.push(null); - }); - duplex._destroy = function(err, callback) { - if (ws.readyState === ws.CLOSED) { - callback(err); - process.nextTick(emitClose, duplex); - return; - } - let called = false; - ws.once("error", function error(err2) { - called = true; - callback(err2); - }); - ws.once("close", function close() { - if (!called) callback(err); - process.nextTick(emitClose, duplex); - }); - if (terminateOnDestroy) ws.terminate(); - }; - duplex._final = function(callback) { - if (ws.readyState === ws.CONNECTING) { - ws.once("open", function open2() { - duplex._final(callback); - }); - return; - } - if (ws._socket === null) return; - if (ws._socket._writableState.finished) { - callback(); - if (duplex._readableState.endEmitted) duplex.destroy(); - } else { - ws._socket.once("finish", function finish() { - callback(); - }); - ws.close(); - } - }; - duplex._read = function() { - if (ws.isPaused) ws.resume(); - }; - duplex._write = function(chunk, encoding, callback) { - if (ws.readyState === ws.CONNECTING) { - ws.once("open", function open2() { - duplex._write(chunk, encoding, callback); - }); - return; - } - ws.send(chunk, callback); - }; - duplex.on("end", duplexOnEnd); - duplex.on("error", duplexOnError); - return duplex; - } - module.exports = createWebSocketStream2; - } -}); - -// node_modules/ws/lib/subprotocol.js -var require_subprotocol = __commonJS({ - "node_modules/ws/lib/subprotocol.js"(exports, module) { - "use strict"; - var { tokenChars } = require_validation(); - function parse(header) { - const protocols = /* @__PURE__ */ new Set(); - let start = -1; - let end = -1; - let i = 0; - for (i; i < header.length; i++) { - const code = header.charCodeAt(i); - if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (i !== 0 && (code === 32 || code === 9)) { - if (end === -1 && start !== -1) end = i; - } else if (code === 44) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - if (end === -1) end = i; - const protocol2 = header.slice(start, end); - if (protocols.has(protocol2)) { - throw new SyntaxError(`The "${protocol2}" subprotocol is duplicated`); - } - protocols.add(protocol2); - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } - if (start === -1 || end !== -1) { - throw new SyntaxError("Unexpected end of input"); - } - const protocol = header.slice(start, i); - if (protocols.has(protocol)) { - throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`); - } - protocols.add(protocol); - return protocols; - } - module.exports = { parse }; - } -}); - -// node_modules/ws/lib/websocket-server.js -var require_websocket_server = __commonJS({ - "node_modules/ws/lib/websocket-server.js"(exports, module) { - "use strict"; - var EventEmitter = __require("events"); - var http2 = __require("http"); - var { Duplex } = __require("stream"); - var { createHash: createHash4 } = __require("crypto"); - var extension2 = require_extension(); - var PerMessageDeflate2 = require_permessage_deflate(); - var subprotocol2 = require_subprotocol(); - var WebSocket2 = require_websocket(); - var { CLOSE_TIMEOUT, GUID, kWebSocket } = require_constants(); - var keyRegex = /^[+/0-9A-Za-z]{22}==$/; - var RUNNING = 0; - var CLOSING = 1; - var CLOSED = 2; - var WebSocketServer2 = class extends EventEmitter { - /** - * Create a `WebSocketServer` instance. - * - * @param {Object} options Configuration options - * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether - * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted - * multiple times in the same tick - * @param {Boolean} [options.autoPong=true] Specifies whether or not to - * automatically send a pong in response to a ping - * @param {Number} [options.backlog=511] The maximum length of the queue of - * pending connections - * @param {Boolean} [options.clientTracking=true] Specifies whether or not to - * track clients - * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to - * wait for the closing handshake to finish after `websocket.close()` is - * called - * @param {Function} [options.handleProtocols] A hook to handle protocols - * @param {String} [options.host] The hostname where to bind the server - * @param {Number} [options.maxPayload=104857600] The maximum allowed message - * size - * @param {Boolean} [options.noServer=false] Enable no server mode - * @param {String} [options.path] Accept only connections matching this path - * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable - * permessage-deflate - * @param {Number} [options.port] The port where to bind the server - * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S - * server to use - * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or - * not to skip UTF-8 validation for text and close messages - * @param {Function} [options.verifyClient] A hook to reject connections - * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket` - * class to use. It must be the `WebSocket` class or class that extends it - * @param {Function} [callback] A listener for the `listening` event - */ - constructor(options, callback) { - super(); - options = { - allowSynchronousEvents: true, - autoPong: true, - maxPayload: 100 * 1024 * 1024, - skipUTF8Validation: false, - perMessageDeflate: false, - handleProtocols: null, - clientTracking: true, - closeTimeout: CLOSE_TIMEOUT, - verifyClient: null, - noServer: false, - backlog: null, - // use default (511 as implemented in net.js) - server: null, - host: null, - path: null, - port: null, - WebSocket: WebSocket2, - ...options - }; - if (options.port == null && !options.server && !options.noServer || options.port != null && (options.server || options.noServer) || options.server && options.noServer) { - throw new TypeError( - 'One and only one of the "port", "server", or "noServer" options must be specified' - ); - } - if (options.port != null) { - this._server = http2.createServer((req, res) => { - const body = http2.STATUS_CODES[426]; - res.writeHead(426, { - "Content-Length": body.length, - "Content-Type": "text/plain" - }); - res.end(body); - }); - this._server.listen( - options.port, - options.host, - options.backlog, - callback - ); - } else if (options.server) { - this._server = options.server; - } - if (this._server) { - const emitConnection = this.emit.bind(this, "connection"); - this._removeListeners = addListeners(this._server, { - listening: this.emit.bind(this, "listening"), - error: this.emit.bind(this, "error"), - upgrade: (req, socket, head) => { - this.handleUpgrade(req, socket, head, emitConnection); - } - }); - } - if (options.perMessageDeflate === true) options.perMessageDeflate = {}; - if (options.clientTracking) { - this.clients = /* @__PURE__ */ new Set(); - this._shouldEmitClose = false; - } - this.options = options; - this._state = RUNNING; - } - /** - * Returns the bound address, the address family name, and port of the server - * as reported by the operating system if listening on an IP socket. - * If the server is listening on a pipe or UNIX domain socket, the name is - * returned as a string. - * - * @return {(Object|String|null)} The address of the server - * @public - */ - address() { - if (this.options.noServer) { - throw new Error('The server is operating in "noServer" mode'); - } - if (!this._server) return null; - return this._server.address(); - } - /** - * Stop the server from accepting new connections and emit the `'close'` event - * when all existing connections are closed. - * - * @param {Function} [cb] A one-time listener for the `'close'` event - * @public - */ - close(cb) { - if (this._state === CLOSED) { - if (cb) { - this.once("close", () => { - cb(new Error("The server is not running")); - }); - } - process.nextTick(emitClose, this); - return; - } - if (cb) this.once("close", cb); - if (this._state === CLOSING) return; - this._state = CLOSING; - if (this.options.noServer || this.options.server) { - if (this._server) { - this._removeListeners(); - this._removeListeners = this._server = null; - } - if (this.clients) { - if (!this.clients.size) { - process.nextTick(emitClose, this); - } else { - this._shouldEmitClose = true; - } - } else { - process.nextTick(emitClose, this); - } - } else { - const server = this._server; - this._removeListeners(); - this._removeListeners = this._server = null; - server.close(() => { - emitClose(this); - }); - } - } - /** - * See if a given request should be handled by this server instance. - * - * @param {http.IncomingMessage} req Request object to inspect - * @return {Boolean} `true` if the request is valid, else `false` - * @public - */ - shouldHandle(req) { - if (this.options.path) { - const index2 = req.url.indexOf("?"); - const pathname = index2 !== -1 ? req.url.slice(0, index2) : req.url; - if (pathname !== this.options.path) return false; - } - return true; - } - /** - * Handle a HTTP Upgrade request. - * - * @param {http.IncomingMessage} req The request object - * @param {Duplex} socket The network socket between the server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Function} cb Callback - * @public - */ - handleUpgrade(req, socket, head, cb) { - socket.on("error", socketOnError); - const key = req.headers["sec-websocket-key"]; - const upgrade = req.headers.upgrade; - const version4 = +req.headers["sec-websocket-version"]; - if (req.method !== "GET") { - const message = "Invalid HTTP method"; - abortHandshakeOrEmitwsClientError(this, req, socket, 405, message); - return; - } - if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") { - const message = "Invalid Upgrade header"; - abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); - return; - } - if (key === void 0 || !keyRegex.test(key)) { - const message = "Missing or invalid Sec-WebSocket-Key header"; - abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); - return; - } - if (version4 !== 13 && version4 !== 8) { - const message = "Missing or invalid Sec-WebSocket-Version header"; - abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, { - "Sec-WebSocket-Version": "13, 8" - }); - return; - } - if (!this.shouldHandle(req)) { - abortHandshake(socket, 400); - return; - } - const secWebSocketProtocol = req.headers["sec-websocket-protocol"]; - let protocols = /* @__PURE__ */ new Set(); - if (secWebSocketProtocol !== void 0) { - try { - protocols = subprotocol2.parse(secWebSocketProtocol); - } catch (err) { - const message = "Invalid Sec-WebSocket-Protocol header"; - abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); - return; - } - } - const secWebSocketExtensions = req.headers["sec-websocket-extensions"]; - const extensions = {}; - if (this.options.perMessageDeflate && secWebSocketExtensions !== void 0) { - const perMessageDeflate = new PerMessageDeflate2({ - ...this.options.perMessageDeflate, - isServer: true, - maxPayload: this.options.maxPayload - }); - try { - const offers = extension2.parse(secWebSocketExtensions); - if (offers[PerMessageDeflate2.extensionName]) { - perMessageDeflate.accept(offers[PerMessageDeflate2.extensionName]); - extensions[PerMessageDeflate2.extensionName] = perMessageDeflate; - } - } catch (err) { - const message = "Invalid or unacceptable Sec-WebSocket-Extensions header"; - abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); - return; - } - } - if (this.options.verifyClient) { - const info = { - origin: req.headers[`${version4 === 8 ? "sec-websocket-origin" : "origin"}`], - secure: !!(req.socket.authorized || req.socket.encrypted), - req - }; - if (this.options.verifyClient.length === 2) { - this.options.verifyClient(info, (verified, code, message, headers) => { - if (!verified) { - return abortHandshake(socket, code || 401, message, headers); - } - this.completeUpgrade( - extensions, - key, - protocols, - req, - socket, - head, - cb - ); - }); - return; - } - if (!this.options.verifyClient(info)) return abortHandshake(socket, 401); - } - this.completeUpgrade(extensions, key, protocols, req, socket, head, cb); - } - /** - * Upgrade the connection to WebSocket. - * - * @param {Object} extensions The accepted extensions - * @param {String} key The value of the `Sec-WebSocket-Key` header - * @param {Set} protocols The subprotocols - * @param {http.IncomingMessage} req The request object - * @param {Duplex} socket The network socket between the server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Function} cb Callback - * @throws {Error} If called more than once with the same socket - * @private - */ - completeUpgrade(extensions, key, protocols, req, socket, head, cb) { - if (!socket.readable || !socket.writable) return socket.destroy(); - if (socket[kWebSocket]) { - throw new Error( - "server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration" - ); - } - if (this._state > RUNNING) return abortHandshake(socket, 503); - const digest = createHash4("sha1").update(key + GUID).digest("base64"); - const headers = [ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - `Sec-WebSocket-Accept: ${digest}` - ]; - const ws = new this.options.WebSocket(null, void 0, this.options); - if (protocols.size) { - const protocol = this.options.handleProtocols ? this.options.handleProtocols(protocols, req) : protocols.values().next().value; - if (protocol) { - headers.push(`Sec-WebSocket-Protocol: ${protocol}`); - ws._protocol = protocol; - } - } - if (extensions[PerMessageDeflate2.extensionName]) { - const params = extensions[PerMessageDeflate2.extensionName].params; - const value = extension2.format({ - [PerMessageDeflate2.extensionName]: [params] - }); - headers.push(`Sec-WebSocket-Extensions: ${value}`); - ws._extensions = extensions; - } - this.emit("headers", headers, req); - socket.write(headers.concat("\r\n").join("\r\n")); - socket.removeListener("error", socketOnError); - ws.setSocket(socket, head, { - allowSynchronousEvents: this.options.allowSynchronousEvents, - maxPayload: this.options.maxPayload, - skipUTF8Validation: this.options.skipUTF8Validation - }); - if (this.clients) { - this.clients.add(ws); - ws.on("close", () => { - this.clients.delete(ws); - if (this._shouldEmitClose && !this.clients.size) { - process.nextTick(emitClose, this); - } - }); - } - cb(ws, req); - } - }; - module.exports = WebSocketServer2; - function addListeners(server, map) { - for (const event of Object.keys(map)) server.on(event, map[event]); - return function removeListeners() { - for (const event of Object.keys(map)) { - server.removeListener(event, map[event]); - } - }; - } - function emitClose(server) { - server._state = CLOSED; - server.emit("close"); - } - function socketOnError() { - this.destroy(); - } - function abortHandshake(socket, code, message, headers) { - message = message || http2.STATUS_CODES[code]; - headers = { - Connection: "close", - "Content-Type": "text/html", - "Content-Length": Buffer.byteLength(message), - ...headers - }; - socket.once("finish", socket.destroy); - socket.end( - `HTTP/1.1 ${code} ${http2.STATUS_CODES[code]}\r -` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join("\r\n") + "\r\n\r\n" + message - ); - } - function abortHandshakeOrEmitwsClientError(server, req, socket, code, message, headers) { - if (server.listenerCount("wsClientError")) { - const err = new Error(message); - Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError); - server.emit("wsClientError", err, socket, req); - } else { - abortHandshake(socket, code, message, headers); - } - } - } -}); - -// node_modules/ws/wrapper.mjs -var import_stream, import_extension, import_permessage_deflate, import_receiver, import_sender, import_subprotocol, import_websocket, import_websocket_server, wrapper_default; -var init_wrapper = __esm({ - "node_modules/ws/wrapper.mjs"() { - "use strict"; - import_stream = __toESM(require_stream(), 1); - import_extension = __toESM(require_extension(), 1); - import_permessage_deflate = __toESM(require_permessage_deflate(), 1); - import_receiver = __toESM(require_receiver(), 1); - import_sender = __toESM(require_sender(), 1); - import_subprotocol = __toESM(require_subprotocol(), 1); - import_websocket = __toESM(require_websocket(), 1); - import_websocket_server = __toESM(require_websocket_server(), 1); - wrapper_default = import_websocket.default; - } -}); - -// node_modules/@solana/rpc-subscriptions-channel-websocket/dist/index.node.mjs -import { setMaxListeners as setMaxListeners4 } from "events"; -function createWebSocketChannel({ - sendBufferHighWatermark, - signal, - url -}) { - if (signal.aborted) { - return Promise.reject(signal.reason); - } - let bufferDrainWatcher; - let hasConnected = false; - const listenerRemovers = /* @__PURE__ */ new Set(); - function cleanupListeners() { - listenerRemovers.forEach((r) => { - r(); - }); - listenerRemovers.clear(); - } - function handleAbort() { - cleanupListeners(); - if (!hasConnected) { - rejectOpen(signal.reason); - } - if (webSocket.readyState !== l.CLOSED && webSocket.readyState !== l.CLOSING) { - webSocket.close(NORMAL_CLOSURE_CODE); - } - } - function handleClose(ev) { - cleanupListeners(); - bufferDrainWatcher?.onCancel(); - signal.removeEventListener("abort", handleAbort); - webSocket.removeEventListener("close", handleClose); - webSocket.removeEventListener("error", handleError); - webSocket.removeEventListener("message", handleMessage); - webSocket.removeEventListener("open", handleOpen); - if (!signal.aborted && !(ev.wasClean && ev.code === NORMAL_CLOSURE_CODE)) { - eventTarget.dispatchEvent( - new CustomEvent("error", { - detail: new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, { - cause: ev - }) - }) - ); - } - } - function handleError(ev) { - if (signal.aborted) { - return; - } - if (!hasConnected) { - const failedToConnectError = new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, { - errorEvent: ev - }); - rejectOpen(failedToConnectError); - eventTarget.dispatchEvent( - new CustomEvent("error", { - detail: failedToConnectError - }) - ); - } - } - function handleMessage(ev) { - if (signal.aborted) { - return; - } - eventTarget.dispatchEvent(new CustomEvent("message", { detail: ev.data })); - } - const eventTarget = new s2(); - const dataPublisher = getDataPublisherFromEventEmitter(eventTarget); - function handleOpen() { - hasConnected = true; - resolveOpen({ - ...dataPublisher, - async send(message) { - if (webSocket.readyState !== l.OPEN) { - throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED); - } - if (!bufferDrainWatcher && webSocket.bufferedAmount > sendBufferHighWatermark) { - let onCancel; - const promise = new Promise((resolve, reject) => { - const intervalId = setInterval(() => { - if (webSocket.readyState !== l.OPEN || !(webSocket.bufferedAmount > sendBufferHighWatermark)) { - clearInterval(intervalId); - bufferDrainWatcher = void 0; - resolve(); - } - }, 16); - onCancel = () => { - bufferDrainWatcher = void 0; - clearInterval(intervalId); - reject( - new SolanaError( - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED - ) - ); - }; - }); - bufferDrainWatcher = { - onCancel, - promise - }; - } - if (bufferDrainWatcher) { - if (ArrayBuffer.isView(message) && !(message instanceof DataView)) { - const TypedArrayConstructor = message.constructor; - message = new TypedArrayConstructor(message); - } - await bufferDrainWatcher.promise; - } - webSocket.send(message); - } - }); - } - const webSocket = new l(url); - signal.addEventListener("abort", handleAbort); - webSocket.addEventListener("close", handleClose); - webSocket.addEventListener("error", handleError); - webSocket.addEventListener("message", handleMessage); - webSocket.addEventListener("open", handleOpen); - let rejectOpen; - let resolveOpen; - return new Promise((resolve, reject) => { - rejectOpen = reject; - resolveOpen = resolve; - }); -} -var s2, l, NORMAL_CLOSURE_CODE; -var init_index_node33 = __esm({ - "node_modules/@solana/rpc-subscriptions-channel-websocket/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node30(); - init_wrapper(); - s2 = class extends globalThis.EventTarget { - constructor(...t) { - super(...t), setMaxListeners4(Number.MAX_SAFE_INTEGER, this); - } - }; - l = globalThis.WebSocket ? globalThis.WebSocket : wrapper_default; - NORMAL_CLOSURE_CODE = 1e3; - } -}); - -// node_modules/@solana/rpc-subscriptions/dist/index.node.mjs -import { setMaxListeners as setMaxListeners5 } from "events"; -function createSolanaJsonRpcIntegerOverflowError2(methodName, keyPath, value) { - let argumentLabel = ""; - if (typeof keyPath[0] === "number") { - const argPosition = keyPath[0] + 1; - const lastDigit = argPosition % 10; - const lastTwoDigits = argPosition % 100; - if (lastDigit == 1 && lastTwoDigits != 11) { - argumentLabel = argPosition + "st"; - } else if (lastDigit == 2 && lastTwoDigits != 12) { - argumentLabel = argPosition + "nd"; - } else if (lastDigit == 3 && lastTwoDigits != 13) { - argumentLabel = argPosition + "rd"; - } else { - argumentLabel = argPosition + "th"; - } - } else { - argumentLabel = `\`${keyPath[0].toString()}\``; - } - const path = keyPath.length > 1 ? keyPath.slice(1).map((pathPart) => typeof pathPart === "number" ? `[${pathPart}]` : pathPart).join(".") : void 0; - const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, { - argumentLabel, - keyPath, - methodName, - optionalPathLabel: path ? ` at path \`${path}\`` : "", - value, - ...path !== void 0 ? { path } : void 0 - }); - safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError2); - return error; -} -function getRpcSubscriptionsChannelWithAutoping({ - abortSignal: callerAbortSignal, - channel, - intervalMs -}) { - let intervalId; - function sendPing() { - channel.send(PING_PAYLOAD).catch((e22) => { - if (isSolanaError(e22, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED)) { - pingerAbortController.abort(); - } - }); - } - function restartPingTimer() { - clearInterval(intervalId); - intervalId = setInterval(sendPing, intervalMs); - } - const pingerAbortController = new e5(); - pingerAbortController.signal.addEventListener("abort", () => { - clearInterval(intervalId); - }); - callerAbortSignal.addEventListener("abort", () => { - pingerAbortController.abort(); - }); - channel.on( - "error", - () => { - pingerAbortController.abort(); - }, - { signal: pingerAbortController.signal } - ); - channel.on("message", restartPingTimer, { signal: pingerAbortController.signal }); - { - restartPingTimer(); - } - return { - ...channel, - send(...args) { - if (!pingerAbortController.signal.aborted) { - restartPingTimer(); - } - return channel.send(...args); - } - }; -} -function createChannelPool() { - return { - entries: [], - freeChannelIndex: -1 - }; -} -function getChannelPoolingChannelCreator(createChannel, { maxSubscriptionsPerChannel, minChannels }) { - const pool = createChannelPool(); - function recomputeFreeChannelIndex() { - if (pool.entries.length < minChannels) { - pool.freeChannelIndex = -1; - return; - } - let mostFreeChannel; - for (let ii = 0; ii < pool.entries.length; ii++) { - const nextPoolIndex = (pool.freeChannelIndex + ii + 2) % pool.entries.length; - const nextPoolEntry = ( - // Start from the item two positions after the current item. This way, the - // search will finish on the item after the current one. This ensures that, if - // any channels tie for having the most capacity, the one that will be chosen is - // the one immediately to the current one's right (wrapping around). - pool.entries[nextPoolIndex] - ); - if (nextPoolEntry.subscriptionCount < maxSubscriptionsPerChannel && (!mostFreeChannel || mostFreeChannel.subscriptionCount >= nextPoolEntry.subscriptionCount)) { - mostFreeChannel = { - poolIndex: nextPoolIndex, - subscriptionCount: nextPoolEntry.subscriptionCount - }; - } - } - pool.freeChannelIndex = mostFreeChannel?.poolIndex ?? -1; - } - return function getExistingChannelWithMostCapacityOrCreateChannel({ abortSignal }) { - let poolEntry; - function destroyPoolEntry() { - const index2 = pool.entries.findIndex((entry) => entry === poolEntry); - pool.entries.splice(index2, 1); - poolEntry.dispose(); - recomputeFreeChannelIndex(); - } - if (pool.freeChannelIndex === -1) { - const abortController = new e5(); - const newChannelPromise = createChannel({ abortSignal: abortController.signal }); - newChannelPromise.then((newChannel) => { - newChannel.on("error", destroyPoolEntry, { signal: abortController.signal }); - }).catch(destroyPoolEntry); - poolEntry = { - channel: newChannelPromise, - dispose() { - abortController.abort(); - }, - subscriptionCount: 0 - }; - pool.entries.push(poolEntry); - } else { - poolEntry = pool.entries[pool.freeChannelIndex]; - } - poolEntry.subscriptionCount++; - abortSignal.addEventListener("abort", function destroyConsumer() { - poolEntry.subscriptionCount--; - if (poolEntry.subscriptionCount === 0) { - destroyPoolEntry(); - } else if (pool.freeChannelIndex !== -1) { - pool.freeChannelIndex--; - recomputeFreeChannelIndex(); - } - }); - recomputeFreeChannelIndex(); - return poolEntry.channel; - }; -} -function getRpcSubscriptionsChannelWithJSONSerialization(channel) { - return pipe( - channel, - (c2) => transformChannelInboundMessages(c2, JSON.parse), - (c2) => transformChannelOutboundMessages(c2, JSON.stringify) - ); -} -function getRpcSubscriptionsChannelWithBigIntJSONSerialization(channel) { - return pipe( - channel, - (c2) => transformChannelInboundMessages(c2, parseJsonWithBigInts), - (c2) => transformChannelOutboundMessages(c2, stringifyJsonWithBigInts) - ); -} -function createDefaultSolanaRpcSubscriptionsChannelCreator(config) { - return createDefaultRpcSubscriptionsChannelCreatorImpl({ - ...config, - jsonSerializer: getRpcSubscriptionsChannelWithBigIntJSONSerialization - }); -} -function createDefaultRpcSubscriptionsChannelCreator(config) { - return createDefaultRpcSubscriptionsChannelCreatorImpl({ - ...config, - jsonSerializer: getRpcSubscriptionsChannelWithJSONSerialization - }); -} -function createDefaultRpcSubscriptionsChannelCreatorImpl(config) { - if (/^wss?:/i.test(config.url) === false) { - const protocolMatch = config.url.match(/^([^:]+):/); - throw new DOMException( - protocolMatch ? `Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${protocolMatch[1]}:' is not allowed.` : `Failed to construct 'WebSocket': The URL '${config.url}' is invalid.` - ); - } - const { intervalMs, ...rest } = config; - const createDefaultRpcSubscriptionsChannel = (({ abortSignal }) => { - return createWebSocketChannel({ - ...rest, - sendBufferHighWatermark: config.sendBufferHighWatermark ?? // Let 128KB of data into the WebSocket buffer before buffering it in the app. - 131072, - signal: abortSignal - }).then(config.jsonSerializer).then( - (channel) => getRpcSubscriptionsChannelWithAutoping({ - abortSignal, - channel, - intervalMs: intervalMs ?? 5e3 - }) - ); - }); - return getChannelPoolingChannelCreator(createDefaultRpcSubscriptionsChannel, { - maxSubscriptionsPerChannel: config.maxSubscriptionsPerChannel ?? /** - * A note about this default. The idea here is that, because some RPC providers impose - * an upper limit on the number of subscriptions you can make per channel, we must - * choose a number low enough to avoid hitting that limit. Without knowing what provider - * a given person is using, or what their limit is, we have to choose the lowest of all - * known limits. As of this writing (October 2024) that is the public mainnet RPC node - * (api.mainnet-beta.solana.com) at 100 subscriptions. - */ - 100, - minChannels: config.minChannels ?? 1 - }); -} -function getRpcSubscriptionsTransportWithSubscriptionCoalescing(transport) { - const cache2 = /* @__PURE__ */ new Map(); - return function rpcSubscriptionsTransportWithSubscriptionCoalescing(config) { - const { request, signal } = config; - const subscriptionConfigurationHash = index_default([request.methodName, request.params]); - let cachedDataPublisherPromise = cache2.get(subscriptionConfigurationHash); - if (!cachedDataPublisherPromise) { - const abortController = new e5(); - const dataPublisherPromise = transport({ - ...config, - signal: abortController.signal - }); - dataPublisherPromise.then((dataPublisher) => { - dataPublisher.on( - "error", - () => { - cache2.delete(subscriptionConfigurationHash); - abortController.abort(); - }, - { signal: abortController.signal } - ); - }).catch(() => { - }); - cache2.set( - subscriptionConfigurationHash, - cachedDataPublisherPromise = { - abortController, - dataPublisherPromise, - numSubscribers: 0 - } - ); - } - cachedDataPublisherPromise.numSubscribers++; - signal.addEventListener( - "abort", - () => { - cachedDataPublisherPromise.numSubscribers--; - if (cachedDataPublisherPromise.numSubscribers === 0) { - queueMicrotask(() => { - if (cachedDataPublisherPromise.numSubscribers === 0) { - cache2.delete(subscriptionConfigurationHash); - cachedDataPublisherPromise.abortController.abort(); - } - }); - } - }, - { signal: cachedDataPublisherPromise.abortController.signal } - ); - return cachedDataPublisherPromise.dataPublisherPromise; - }; -} -function createDefaultRpcSubscriptionsTransport({ - createChannel -}) { - return pipe( - createRpcSubscriptionsTransportFromChannelCreator( - createChannel - ), - (transport) => getRpcSubscriptionsTransportWithSubscriptionCoalescing(transport) - ); -} -function createRpcSubscriptionsTransportFromChannelCreator(createChannel) { - return (async ({ execute, signal }) => { - const channel = await createChannel({ abortSignal: signal }); - return await execute({ channel, signal }); - }); -} -function createSolanaRpcSubscriptionsImpl(clusterUrl, config) { - const transport = createDefaultRpcSubscriptionsTransport({ - createChannel: createDefaultSolanaRpcSubscriptionsChannelCreator({ ...config, url: clusterUrl }) - }); - return createSolanaRpcSubscriptionsFromTransport(transport); -} -function createSolanaRpcSubscriptions(clusterUrl, config) { - return createSolanaRpcSubscriptionsImpl(clusterUrl, config); -} -function createSolanaRpcSubscriptions_UNSTABLE(clusterUrl, config) { - return createSolanaRpcSubscriptionsImpl( - clusterUrl, - config - ); -} -function createSolanaRpcSubscriptionsFromTransport(transport) { - return createSubscriptionRpc({ - api: createSolanaRpcSubscriptionsApi(DEFAULT_RPC_SUBSCRIPTIONS_CONFIG), - transport - }); -} -var DEFAULT_RPC_SUBSCRIPTIONS_CONFIG, e5, PING_PAYLOAD; -var init_index_node34 = __esm({ - "node_modules/@solana/rpc-subscriptions/dist/index.node.mjs"() { - "use strict"; - init_index_node32(); - init_index_node32(); - init_index_node31(); - init_index_node31(); - init_index_node(); - init_index_node33(); - init_index_node11(); - init_index_node22(); - init_index_node27(); - DEFAULT_RPC_SUBSCRIPTIONS_CONFIG = { - defaultCommitment: "confirmed", - onIntegerOverflow(request, keyPath, value) { - throw createSolanaJsonRpcIntegerOverflowError2(request.methodName, keyPath, value); - } - }; - e5 = class extends globalThis.AbortController { - constructor(...t) { - super(...t), setMaxListeners5(Number.MAX_SAFE_INTEGER, this.signal); - } - }; - PING_PAYLOAD = { - jsonrpc: "2.0", - method: "ping" - }; - } -}); - -// node_modules/@solana/signers/dist/index.node.mjs -function deduplicateSigners(signers) { - const deduplicated = {}; - signers.forEach((signer) => { - if (!deduplicated[signer.address]) { - deduplicated[signer.address] = signer; - } else if (deduplicated[signer.address] !== signer) { - throw new SolanaError(SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, { - address: signer.address - }); - } - }); - return Object.values(deduplicated); -} -function isTransactionModifyingSigner(value) { - return "modifyAndSignTransactions" in value && typeof value.modifyAndSignTransactions === "function"; -} -function assertIsTransactionModifyingSigner(value) { - if (!isTransactionModifyingSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, { - address: value.address - }); - } -} -function isTransactionPartialSigner(value) { - return "signTransactions" in value && typeof value.signTransactions === "function"; -} -function assertIsTransactionPartialSigner(value) { - if (!isTransactionPartialSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, { - address: value.address - }); - } -} -function isTransactionSendingSigner(value) { - return "signAndSendTransactions" in value && typeof value.signAndSendTransactions === "function"; -} -function assertIsTransactionSendingSigner(value) { - if (!isTransactionSendingSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, { - address: value.address - }); - } -} -function isTransactionSigner(value) { - return isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value); -} -function assertIsTransactionSigner(value) { - if (!isTransactionSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, { - address: value.address - }); - } -} -function getSignersFromInstruction(instruction) { - return deduplicateSigners( - (instruction.accounts ?? []).flatMap((account) => "signer" in account ? account.signer : []) - ); -} -function getSignersFromTransactionMessage(transaction) { - return deduplicateSigners([ - ...transaction.feePayer && isTransactionSigner(transaction.feePayer) ? [transaction.feePayer] : [], - ...transaction.instructions.flatMap(getSignersFromInstruction) - ]); -} -function addSignersToInstruction(signers, instruction) { - if (!instruction.accounts || instruction.accounts.length === 0) { - return instruction; - } - const signerByAddress = new Map(deduplicateSigners(signers).map((signer) => [signer.address, signer])); - return Object.freeze({ - ...instruction, - accounts: instruction.accounts.map((account) => { - const signer = signerByAddress.get(account.address); - if (!isSignerRole(account.role) || "signer" in account || !signer) { - return account; - } - return Object.freeze({ ...account, signer }); - }) - }); -} -function addSignersToTransactionMessage(signers, transactionMessage) { - const feePayerSigner = hasAddressOnlyFeePayer(transactionMessage) ? signers.find((signer) => signer.address === transactionMessage.feePayer.address) : void 0; - if (!feePayerSigner && transactionMessage.instructions.length === 0) { - return transactionMessage; - } - return Object.freeze({ - ...transactionMessage, - ...feePayerSigner ? { feePayer: feePayerSigner } : null, - instructions: transactionMessage.instructions.map((instruction) => addSignersToInstruction(signers, instruction)) - }); -} -function hasAddressOnlyFeePayer(message) { - return !!message && "feePayer" in message && !!message.feePayer && typeof message.feePayer.address === "string" && !isTransactionSigner(message.feePayer); -} -function setTransactionMessageFeePayerSigner(feePayer, transactionMessage) { - Object.freeze(feePayer); - const out = { ...transactionMessage, feePayer }; - Object.freeze(out); - return out; -} -function isMessagePartialSigner(value) { - return "signMessages" in value && typeof value.signMessages === "function"; -} -function assertIsMessagePartialSigner(value) { - if (!isMessagePartialSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, { - address: value.address - }); - } -} -function isKeyPairSigner(value) { - return "keyPair" in value && typeof value.keyPair === "object" && isMessagePartialSigner(value) && isTransactionPartialSigner(value); -} -function assertIsKeyPairSigner(value) { - if (!isKeyPairSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, { - address: value.address - }); - } -} -async function createSignerFromKeyPair(keyPair) { - const address2 = await getAddressFromPublicKey(keyPair.publicKey); - const out = { - address: address2, - keyPair, - signMessages: (messages) => Promise.all( - messages.map( - async (message) => Object.freeze({ [address2]: await signBytes(keyPair.privateKey, message.content) }) - ) - ), - signTransactions: (transactions) => Promise.all( - transactions.map(async (transaction) => { - const signedTransaction = await partiallySignTransaction([keyPair], transaction); - return Object.freeze({ [address2]: signedTransaction.signatures[address2] }); - }) - ) - }; - return Object.freeze(out); -} -async function generateKeyPairSigner() { - return await createSignerFromKeyPair(await generateKeyPair()); -} -async function createKeyPairSignerFromBytes(bytes, extractable) { - return await createSignerFromKeyPair(await createKeyPairFromBytes(bytes, extractable)); -} -async function createKeyPairSignerFromPrivateKeyBytes(bytes, extractable) { - return await createSignerFromKeyPair(await createKeyPairFromPrivateKeyBytes(bytes, extractable)); -} -function isMessageModifyingSigner(value) { - return isAddress2(value.address) && "modifyAndSignMessages" in value && typeof value.modifyAndSignMessages === "function"; -} -function assertIsMessageModifyingSigner(value) { - if (!isMessageModifyingSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, { - address: value.address - }); - } -} -function isMessageSigner(value) { - return isMessagePartialSigner(value) || isMessageModifyingSigner(value); -} -function assertIsMessageSigner(value) { - if (!isMessageSigner(value)) { - throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, { - address: value.address - }); - } -} -function createNoopSigner(address2) { - const out = { - address: address2, - signMessages: (messages) => Promise.resolve(messages.map(() => Object.freeze({}))), - signTransactions: (transactions) => Promise.resolve(transactions.map(() => Object.freeze({}))) - }; - return Object.freeze(out); -} -function getSignersFromOffchainMessage({ - requiredSignatories -}) { - const messageSigners = requiredSignatories.filter(isMessageSigner); - return deduplicateSigners(messageSigners); -} -async function partiallySignOffchainMessageWithSigners(offchainMessage, config) { - const { partialSigners, modifyingSigners } = categorizeMessageSigners( - getSignersFromOffchainMessage(offchainMessage) - ); - return await signModifyingAndPartialMessageSigners(offchainMessage, modifyingSigners, partialSigners, config); -} -async function signOffchainMessageWithSigners(offchainMessage, config) { - const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage, config); - assertIsFullySignedOffchainMessageEnvelope(signedOffchainMessageEnvelope); - return signedOffchainMessageEnvelope; -} -function categorizeMessageSigners(signers) { - const modifyingSigners = identifyMessageModifyingSigners(signers); - const partialSigners = signers.filter(isMessagePartialSigner).filter((signer) => !modifyingSigners.includes(signer)); - return Object.freeze({ modifyingSigners, partialSigners }); -} -function identifyMessageModifyingSigners(signers) { - const modifyingSigners = signers.filter(isMessageModifyingSigner); - if (modifyingSigners.length === 0) return []; - const nonPartialSigners = modifyingSigners.filter((signer) => !isMessagePartialSigner(signer)); - if (nonPartialSigners.length > 0) return nonPartialSigners; - return [modifyingSigners[0]]; -} -async function signModifyingAndPartialMessageSigners(offchainMessage, modifyingSigners = [], partialSigners = [], config) { - const offchainMessageEnvelope = compileOffchainMessageEnvelope(offchainMessage); - const modifiedOffchainMessage = await modifyingSigners.reduce(async (offchainMessageEnvelope2, modifyingSigner) => { - config?.abortSignal?.throwIfAborted(); - const [message] = await modifyingSigner.modifyAndSignMessages([await offchainMessageEnvelope2], config); - return Object.freeze(message); - }, Promise.resolve(offchainMessageEnvelope)); - config?.abortSignal?.throwIfAborted(); - const signatureDictionaries = await Promise.all( - partialSigners.map(async (partialSigner) => { - const [signatures] = await partialSigner.signMessages([modifiedOffchainMessage], config); - return signatures; - }) - ); - return Object.freeze({ - ...modifiedOffchainMessage, - signatures: Object.freeze( - signatureDictionaries.reduce((signatures, signatureDictionary) => { - return { ...signatures, ...signatureDictionary }; - }, modifiedOffchainMessage.signatures ?? {}) - ) - }); -} -function isTransactionMessageWithSingleSendingSigner(transaction) { - try { - assertIsTransactionMessageWithSingleSendingSigner(transaction); - return true; - } catch { - return false; - } -} -function assertIsTransactionMessageWithSingleSendingSigner(transaction) { - const signers = getSignersFromTransactionMessage(transaction); - const sendingSigners = signers.filter(isTransactionSendingSigner); - if (sendingSigners.length === 0) { - throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING); - } - const sendingOnlySigners = sendingSigners.filter( - (signer) => !isTransactionPartialSigner(signer) && !isTransactionModifyingSigner(signer) - ); - if (sendingOnlySigners.length > 1) { - throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS); - } -} -async function partiallySignTransactionMessageWithSigners(transactionMessage, config) { - const { partialSigners, modifyingSigners } = categorizeTransactionSigners( - deduplicateSigners(getSignersFromTransactionMessage(transactionMessage).filter(isTransactionSigner)), - { identifySendingSigner: false } - ); - return await signModifyingAndPartialTransactionSigners( - transactionMessage, - modifyingSigners, - partialSigners, - config - ); -} -async function signTransactionMessageWithSigners(transactionMessage, config) { - const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, config); - assertIsFullySignedTransaction(signedTransaction); - return signedTransaction; -} -async function signAndSendTransactionMessageWithSigners(transaction, config) { - assertIsTransactionMessageWithSingleSendingSigner(transaction); - const abortSignal = config?.abortSignal; - const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners( - deduplicateSigners(getSignersFromTransactionMessage(transaction).filter(isTransactionSigner)) - ); - abortSignal?.throwIfAborted(); - const signedTransaction = await signModifyingAndPartialTransactionSigners( - transaction, - modifyingSigners, - partialSigners, - config - ); - if (!sendingSigner) { - throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING); - } - abortSignal?.throwIfAborted(); - const [signature2] = await sendingSigner.signAndSendTransactions([signedTransaction], config); - abortSignal?.throwIfAborted(); - return signature2; -} -function categorizeTransactionSigners(signers, config = {}) { - const identifySendingSigner = config.identifySendingSigner ?? true; - const sendingSigner = identifySendingSigner ? identifyTransactionSendingSigner(signers) : null; - const otherSigners = signers.filter( - (signer) => signer !== sendingSigner && (isTransactionModifyingSigner(signer) || isTransactionPartialSigner(signer)) - ); - const modifyingSigners = identifyTransactionModifyingSigners(otherSigners); - const partialSigners = otherSigners.filter(isTransactionPartialSigner).filter((signer) => !modifyingSigners.includes(signer)); - return Object.freeze({ modifyingSigners, partialSigners, sendingSigner }); -} -function identifyTransactionSendingSigner(signers) { - const sendingSigners = signers.filter(isTransactionSendingSigner); - if (sendingSigners.length === 0) return null; - const sendingOnlySigners = sendingSigners.filter( - (signer) => !isTransactionModifyingSigner(signer) && !isTransactionPartialSigner(signer) - ); - if (sendingOnlySigners.length > 0) { - return sendingOnlySigners[0]; - } - return sendingSigners[0]; -} -function identifyTransactionModifyingSigners(signers) { - const modifyingSigners = signers.filter(isTransactionModifyingSigner); - if (modifyingSigners.length === 0) return []; - const nonPartialSigners = modifyingSigners.filter((signer) => !isTransactionPartialSigner(signer)); - if (nonPartialSigners.length > 0) return nonPartialSigners; - return [modifyingSigners[0]]; -} -async function signModifyingAndPartialTransactionSigners(transactionMessage, modifyingSigners = [], partialSigners = [], config) { - const transaction = compileTransaction(transactionMessage); - const modifiedTransaction = await modifyingSigners.reduce( - async (transaction2, modifyingSigner) => { - config?.abortSignal?.throwIfAborted(); - const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction2], config); - return Object.freeze(tx); - }, - Promise.resolve(transaction) - ); - config?.abortSignal?.throwIfAborted(); - const signatureDictionaries = await Promise.all( - partialSigners.map(async (partialSigner) => { - const [signatures] = await partialSigner.signTransactions([modifiedTransaction], config); - return signatures; - }) - ); - return Object.freeze({ - ...modifiedTransaction, - signatures: Object.freeze( - signatureDictionaries.reduce((signatures, signatureDictionary) => { - return { ...signatures, ...signatureDictionary }; - }, modifiedTransaction.signatures ?? {}) - ) - }); -} -function createSignableMessage(content, signatures = {}) { - return Object.freeze({ - content: typeof content === "string" ? new o2().encode(content) : content, - signatures: Object.freeze({ ...signatures }) - }); -} -var o2; -var init_index_node35 = __esm({ - "node_modules/@solana/signers/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node12(); - init_index_node6(); - init_index_node15(); - init_index_node16(); - init_index_node19(); - o2 = globalThis.TextEncoder; - } -}); - -// node_modules/@solana/transaction-confirmation/dist/index.node.mjs -import { setMaxListeners as setMaxListeners6 } from "events"; -function createBlockHeightExceedencePromiseFactory({ - rpc, - rpcSubscriptions -}) { - return async function getBlockHeightExceedencePromise({ - abortSignal: callerAbortSignal, - commitment, - lastValidBlockHeight - }) { - callerAbortSignal.throwIfAborted(); - const abortController = new e6(); - const handleAbort = () => { - abortController.abort(); - }; - callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); - async function getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() { - const { absoluteSlot, blockHeight } = await rpc.getEpochInfo({ commitment }).send({ abortSignal: abortController.signal }); - return { - blockHeight, - differenceBetweenSlotHeightAndBlockHeight: absoluteSlot - blockHeight - }; - } - try { - const [slotNotifications, { blockHeight: initialBlockHeight, differenceBetweenSlotHeightAndBlockHeight }] = await Promise.all([ - rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal }), - getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() - ]); - callerAbortSignal.throwIfAborted(); - let currentBlockHeight = initialBlockHeight; - if (currentBlockHeight <= lastValidBlockHeight) { - let lastKnownDifferenceBetweenSlotHeightAndBlockHeight = differenceBetweenSlotHeightAndBlockHeight; - for await (const slotNotification of slotNotifications) { - const { slot } = slotNotification; - if (slot - lastKnownDifferenceBetweenSlotHeightAndBlockHeight > lastValidBlockHeight) { - const { - blockHeight: recheckedBlockHeight, - differenceBetweenSlotHeightAndBlockHeight: currentDifferenceBetweenSlotHeightAndBlockHeight - } = await getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight(); - currentBlockHeight = recheckedBlockHeight; - if (currentBlockHeight > lastValidBlockHeight) { - break; - } else { - lastKnownDifferenceBetweenSlotHeightAndBlockHeight = currentDifferenceBetweenSlotHeightAndBlockHeight; - } - } - } - } - callerAbortSignal.throwIfAborted(); - throw new SolanaError(SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, { - currentBlockHeight, - lastValidBlockHeight - }); - } finally { - abortController.abort(); - } - }; -} -function createNonceInvalidationPromiseFactory({ - rpc, - rpcSubscriptions -}) { - return async function getNonceInvalidationPromise({ - abortSignal: callerAbortSignal, - commitment, - currentNonceValue: expectedNonceValue, - nonceAccountAddress - }) { - const abortController = new e6(); - function handleAbort() { - abortController.abort(); - } - callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); - const accountNotifications = await rpcSubscriptions.accountNotifications(nonceAccountAddress, { commitment, encoding: "base64" }).subscribe({ abortSignal: abortController.signal }); - const base58Decoder2 = getBase58Decoder(); - const base64Encoder = getBase64Encoder(); - function getNonceFromAccountData([base64EncodedBytes]) { - const data = base64Encoder.encode(base64EncodedBytes); - const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32); - return base58Decoder2.decode(nonceValueBytes); - } - const nonceAccountDidAdvancePromise = (async () => { - for await (const accountNotification of accountNotifications) { - const nonceValue = getNonceFromAccountData(accountNotification.value.data); - if (nonceValue !== expectedNonceValue) { - throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, { - actualNonceValue: nonceValue, - expectedNonceValue - }); - } - } - })(); - const nonceIsAlreadyInvalidPromise = (async () => { - const { value: nonceAccount } = await rpc.getAccountInfo(nonceAccountAddress, { - commitment, - dataSlice: { length: 32, offset: NONCE_VALUE_OFFSET }, - encoding: "base58" - }).send({ abortSignal: abortController.signal }); - if (!nonceAccount) { - throw new SolanaError(SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, { - nonceAccountAddress - }); - } - const nonceValue = ( - // This works because we asked for the exact slice of data representing the nonce - // value, and furthermore asked for it in `base58` encoding. - nonceAccount.data[0] - ); - if (nonceValue !== expectedNonceValue) { - throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, { - actualNonceValue: nonceValue, - expectedNonceValue - }); - } else { - await new Promise(() => { - }); - } - })(); - try { - return await safeRace([nonceAccountDidAdvancePromise, nonceIsAlreadyInvalidPromise]); - } finally { - abortController.abort(); - } - }; -} -function createRecentSignatureConfirmationPromiseFactory({ - rpc, - rpcSubscriptions -}) { - return async function getRecentSignatureConfirmationPromise({ - abortSignal: callerAbortSignal, - commitment, - signature: signature2 - }) { - const abortController = new e6(); - function handleAbort() { - abortController.abort(); - } - callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); - const signatureStatusNotifications = await rpcSubscriptions.signatureNotifications(signature2, { commitment }).subscribe({ abortSignal: abortController.signal }); - const signatureDidCommitPromise = (async () => { - for await (const signatureStatusNotification of signatureStatusNotifications) { - if (signatureStatusNotification.value.err) { - throw getSolanaErrorFromTransactionError(signatureStatusNotification.value.err); - } else { - return; - } - } - })(); - const signatureStatusLookupPromise = (async () => { - const { value: signatureStatusResults } = await rpc.getSignatureStatuses([signature2]).send({ abortSignal: abortController.signal }); - const signatureStatus = signatureStatusResults[0]; - if (signatureStatus?.err) { - throw getSolanaErrorFromTransactionError(signatureStatus.err); - } else if (signatureStatus?.confirmationStatus && commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0) { - return; - } else { - await new Promise(() => { - }); - } - })(); - try { - return await safeRace([signatureDidCommitPromise, signatureStatusLookupPromise]); - } finally { - abortController.abort(); - } - }; -} -async function getTimeoutPromise({ abortSignal: callerAbortSignal, commitment }) { - return await new Promise((_, reject) => { - const handleAbort = (e22) => { - clearTimeout(timeoutId); - const abortError = new DOMException(e22.target.reason, "AbortError"); - reject(abortError); - }; - callerAbortSignal.addEventListener("abort", handleAbort); - const timeoutMs = commitment === "processed" ? 3e4 : 6e4; - const startMs = performance.now(); - const timeoutId = ( - // We use `setTimeout` instead of `AbortSignal.timeout()` because we want to measure - // elapsed time instead of active time. - // See https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static - setTimeout(() => { - const elapsedMs = performance.now() - startMs; - reject(new DOMException(`Timeout elapsed after ${elapsedMs} ms`, "TimeoutError")); - }, timeoutMs) - ); - }); -} -async function raceStrategies(signature2, config, getSpecificStrategiesForRace) { - const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise } = config; - callerAbortSignal?.throwIfAborted(); - const abortController = new e6(); - if (callerAbortSignal) { - const handleAbort = () => { - abortController.abort(); - }; - callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); - } - try { - const specificStrategies = getSpecificStrategiesForRace({ - ...config, - abortSignal: abortController.signal - }); - return await safeRace([ - getRecentSignatureConfirmationPromise({ - abortSignal: abortController.signal, - commitment, - signature: signature2 - }), - ...specificStrategies - ]); - } finally { - abortController.abort(); - } -} -async function waitForDurableNonceTransactionConfirmation(config) { - await raceStrategies( - getSignatureFromTransaction(config.transaction), - config, - function getSpecificStrategiesForRace({ abortSignal, commitment, getNonceInvalidationPromise, transaction }) { - return [ - getNonceInvalidationPromise({ - abortSignal, - commitment, - currentNonceValue: transaction.lifetimeConstraint.nonce, - nonceAccountAddress: transaction.lifetimeConstraint.nonceAccountAddress - }) - ]; - } - ); -} -async function waitForRecentTransactionConfirmation(config) { - await raceStrategies( - getSignatureFromTransaction(config.transaction), - config, - function getSpecificStrategiesForRace({ - abortSignal, - commitment, - getBlockHeightExceedencePromise, - transaction - }) { - return [ - getBlockHeightExceedencePromise({ - abortSignal, - commitment, - lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight - }) - ]; - } - ); -} -async function waitForRecentTransactionConfirmationUntilTimeout(config) { - await raceStrategies( - config.signature, - config, - function getSpecificStrategiesForRace({ abortSignal, commitment, getTimeoutPromise: getTimeoutPromise2 }) { - return [ - getTimeoutPromise2({ - abortSignal, - commitment - }) - ]; - } - ); -} -var e6, NONCE_VALUE_OFFSET; -var init_index_node36 = __esm({ - "node_modules/@solana/transaction-confirmation/dist/index.node.mjs"() { - "use strict"; - init_index_node(); - init_index_node3(); - init_index_node17(); - init_index_node13(); - init_index_node16(); - e6 = class extends globalThis.AbortController { - constructor(...t) { - super(...t), setMaxListeners6(Number.MAX_SAFE_INTEGER, this.signal); - } - }; - NONCE_VALUE_OFFSET = 4 + // version(u32) - 4 + // state(u32) - 32; - } -}); - -// node_modules/@solana/kit/dist/index.node.mjs -var index_node_exports = {}; -__export(index_node_exports, { - AccountRole: () => AccountRole, - BASE_ACCOUNT_SIZE: () => BASE_ACCOUNT_SIZE, - DEFAULT_RPC_CONFIG: () => DEFAULT_RPC_CONFIG, - DEFAULT_RPC_SUBSCRIPTIONS_CONFIG: () => DEFAULT_RPC_SUBSCRIPTIONS_CONFIG, - Endian: () => Endian, - MAX_SUPPORTED_TRANSACTION_VERSION: () => MAX_SUPPORTED_TRANSACTION_VERSION, - OffchainMessageContentFormat: () => OffchainMessageContentFormat, - SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, - SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED: () => SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, - SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT: () => SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, - SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT: () => SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, - SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND: () => SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, - SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED: () => SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED, - SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS: () => SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS, - SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH: () => SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, - SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY: () => SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY, - SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS: () => SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS, - SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE: () => SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE, - SOLANA_ERROR__ADDRESSES__MALFORMED_PDA: () => SOLANA_ERROR__ADDRESSES__MALFORMED_PDA, - SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED: () => SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, - SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED: () => SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, - SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE: () => SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, - SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER: () => SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER, - SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, - SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, - SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED: () => SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, - SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY: () => SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, - SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS: () => SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, - SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL: () => SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, - SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH: () => SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, - SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH: () => SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, - SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH: () => SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH, - SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, - SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY: () => SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, - SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH: () => SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH, - SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH: () => SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, - SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH: () => SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH, - SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE: () => SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE, - SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH: () => SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, - SOLANA_ERROR__CODECS__INVALID_CONSTANT: () => SOLANA_ERROR__CODECS__INVALID_CONSTANT, - SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT: () => SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, - SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT: () => SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, - SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT: () => SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, - SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS: () => SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, - SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE: () => SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, - SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, - SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, - SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, - SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES: () => SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, - SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, - SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED, - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED, - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED, - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED, - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL, - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE, - SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT, - SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW: () => SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW, - SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR: () => SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR, - SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS: () => SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS, - SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH: () => SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH, - SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED, - SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM: () => SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, - SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX: () => SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX, - SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC: () => SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC, - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT, - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED, - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE, - SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED, - SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED, - SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND, - SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR: () => SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, - SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER: () => SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER, - SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE: () => SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE, - SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY: () => SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY, - SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID: () => SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID, - SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS: () => SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS, - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA, - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER, - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT, - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR, - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA, - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC, - SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS, - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED, - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED, - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED, - SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED, - SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT: () => SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT, - SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE: () => SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE, - SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID: () => SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID, - SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS: () => SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS, - SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION: () => SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION, - SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE: () => SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE, - SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE: () => SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE, - SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE: () => SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE, - SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED, - SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE: () => SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE, - SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED: () => SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED, - SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED, - SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION, - SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT, - SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN, - SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID, - SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR, - SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN, - SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT: () => SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, - SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND: () => SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND, - SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, - SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, - SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE: () => SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE, - SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED: () => SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED, - SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, - SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, - SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT: () => SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, - SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS: () => SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, - SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA: () => SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, - SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH: () => SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, - SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH: () => SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, - SOLANA_ERROR__INVALID_NONCE: () => SOLANA_ERROR__INVALID_NONCE, - SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING: () => SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING, - SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED: () => SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, - SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND: () => SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, - SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND: () => SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, - SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE: () => SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE, - SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING: () => SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING, - SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE: () => SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, - SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR: () => SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR, - SOLANA_ERROR__JSON_RPC__INVALID_PARAMS: () => SOLANA_ERROR__JSON_RPC__INVALID_PARAMS, - SOLANA_ERROR__JSON_RPC__INVALID_REQUEST: () => SOLANA_ERROR__JSON_RPC__INVALID_REQUEST, - SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND: () => SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND, - SOLANA_ERROR__JSON_RPC__PARSE_ERROR: () => SOLANA_ERROR__JSON_RPC__PARSE_ERROR, - SOLANA_ERROR__JSON_RPC__SCAN_ERROR: () => SOLANA_ERROR__JSON_RPC__SCAN_ERROR, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE, - SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION, - SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH: () => SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, - SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH: () => SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, - SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH: () => SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, - SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY: () => SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY, - SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, - SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE: () => SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE, - SOLANA_ERROR__MALFORMED_BIGINT_STRING: () => SOLANA_ERROR__MALFORMED_BIGINT_STRING, - SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR: () => SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, - SOLANA_ERROR__MALFORMED_NUMBER_STRING: () => SOLANA_ERROR__MALFORMED_NUMBER_STRING, - SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, - SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, - SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE, - SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, - SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH, - SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, - SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, - SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, - SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY, - SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO, - SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO, - SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, - SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE, - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED, - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE, - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, - SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, - SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, - SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED, - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, - SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, - SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID, - SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD: () => SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, - SOLANA_ERROR__RPC__INTEGER_OVERFLOW: () => SOLANA_ERROR__RPC__INTEGER_OVERFLOW, - SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR: () => SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, - SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN: () => SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, - SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS: () => SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, - SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, - SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, - SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, - SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, - SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, - SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS: () => SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS, - SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING: () => SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, - SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED: () => SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, - SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY: () => SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, - SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED, - SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT: () => SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT, - SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED, - SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED, - SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED, - SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED, - SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED, - SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE: () => SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE, - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE, - SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND, - SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND, - SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED: () => SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED, - SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND, - SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP: () => SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP, - SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE: () => SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE, - SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION: () => SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION, - SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE: () => SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE, - SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT: () => SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT, - SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT, - SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED: () => SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED, - SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE: () => SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE, - SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND, - SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED: () => SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED, - SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED: () => SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED, - SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE: () => SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE, - SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE: () => SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE, - SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS: () => SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS, - SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION: () => SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION, - SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN: () => SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN, - SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION: () => SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION, - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT, - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT, - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT, - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT, - SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT, - SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION: () => SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, - SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING: () => SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING, - SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES: () => SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES, - SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT: () => SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, - SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME: () => SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME, - SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME: () => SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME, - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE, - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING, - SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, - SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT, - SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT: () => SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT, - SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING: () => SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING, - SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING: () => SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING, - SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE: () => SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE, - SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING: () => SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING, - SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES: () => SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, - SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE: () => SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, - SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH: () => SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, - SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE: () => SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, - SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING: () => SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, - SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED: () => SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, - SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE: () => SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, - SolanaError: () => SolanaError, - TRANSACTION_PACKET_HEADER: () => TRANSACTION_PACKET_HEADER, - TRANSACTION_PACKET_SIZE: () => TRANSACTION_PACKET_SIZE, - TRANSACTION_SIZE_LIMIT: () => TRANSACTION_SIZE_LIMIT, - addCodecSentinel: () => addCodecSentinel, - addCodecSizePrefix: () => addCodecSizePrefix, - addDecoderSentinel: () => addDecoderSentinel, - addDecoderSizePrefix: () => addDecoderSizePrefix, - addEncoderSentinel: () => addEncoderSentinel, - addEncoderSizePrefix: () => addEncoderSizePrefix, - addSignersToInstruction: () => addSignersToInstruction, - addSignersToTransactionMessage: () => addSignersToTransactionMessage, - address: () => address, - airdropFactory: () => airdropFactory, - appendTransactionMessageInstruction: () => appendTransactionMessageInstruction, - appendTransactionMessageInstructionPlan: () => appendTransactionMessageInstructionPlan, - appendTransactionMessageInstructions: () => appendTransactionMessageInstructions, - assertAccountDecoded: () => assertAccountDecoded, - assertAccountExists: () => assertAccountExists, - assertAccountsDecoded: () => assertAccountsDecoded, - assertAccountsExist: () => assertAccountsExist, - assertByteArrayHasEnoughBytesForCodec: () => assertByteArrayHasEnoughBytesForCodec, - assertByteArrayIsNotEmptyForCodec: () => assertByteArrayIsNotEmptyForCodec, - assertByteArrayOffsetIsNotOutOfRange: () => assertByteArrayOffsetIsNotOutOfRange, - assertIsAddress: () => assertIsAddress, - assertIsBlockhash: () => assertIsBlockhash, - assertIsCanceledSingleTransactionPlanResult: () => assertIsCanceledSingleTransactionPlanResult, - assertIsFailedSingleTransactionPlanResult: () => assertIsFailedSingleTransactionPlanResult, - assertIsFixedSize: () => assertIsFixedSize, - assertIsFullySignedOffchainMessageEnvelope: () => assertIsFullySignedOffchainMessageEnvelope, - assertIsFullySignedTransaction: () => assertIsFullySignedTransaction, - assertIsInstructionForProgram: () => assertIsInstructionForProgram, - assertIsInstructionWithAccounts: () => assertIsInstructionWithAccounts, - assertIsInstructionWithData: () => assertIsInstructionWithData, - assertIsKeyPairSigner: () => assertIsKeyPairSigner, - assertIsLamports: () => assertIsLamports, - assertIsMessageModifyingSigner: () => assertIsMessageModifyingSigner, - assertIsMessagePackerInstructionPlan: () => assertIsMessagePackerInstructionPlan, - assertIsMessagePartialSigner: () => assertIsMessagePartialSigner, - assertIsMessageSigner: () => assertIsMessageSigner, - assertIsNonDivisibleSequentialInstructionPlan: () => assertIsNonDivisibleSequentialInstructionPlan, - assertIsNonDivisibleSequentialTransactionPlan: () => assertIsNonDivisibleSequentialTransactionPlan, - assertIsNonDivisibleSequentialTransactionPlanResult: () => assertIsNonDivisibleSequentialTransactionPlanResult, - assertIsOffCurveAddress: () => assertIsOffCurveAddress, - assertIsOffchainMessageApplicationDomain: () => assertIsOffchainMessageApplicationDomain, - assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax: () => assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax, - assertIsOffchainMessageContentUtf8Of1232BytesMax: () => assertIsOffchainMessageContentUtf8Of1232BytesMax, - assertIsOffchainMessageContentUtf8Of65535BytesMax: () => assertIsOffchainMessageContentUtf8Of65535BytesMax, - assertIsOffchainMessageRestrictedAsciiOf1232BytesMax: () => assertIsOffchainMessageRestrictedAsciiOf1232BytesMax, - assertIsOffchainMessageUtf8Of1232BytesMax: () => assertIsOffchainMessageUtf8Of1232BytesMax, - assertIsOffchainMessageUtf8Of65535BytesMax: () => assertIsOffchainMessageUtf8Of65535BytesMax, - assertIsParallelInstructionPlan: () => assertIsParallelInstructionPlan, - assertIsParallelTransactionPlan: () => assertIsParallelTransactionPlan, - assertIsParallelTransactionPlanResult: () => assertIsParallelTransactionPlanResult, - assertIsProgramDerivedAddress: () => assertIsProgramDerivedAddress, - assertIsSendableTransaction: () => assertIsSendableTransaction, - assertIsSequentialInstructionPlan: () => assertIsSequentialInstructionPlan, - assertIsSequentialTransactionPlan: () => assertIsSequentialTransactionPlan, - assertIsSequentialTransactionPlanResult: () => assertIsSequentialTransactionPlanResult, - assertIsSignature: () => assertIsSignature, - assertIsSignatureBytes: () => assertIsSignatureBytes, - assertIsSingleInstructionPlan: () => assertIsSingleInstructionPlan, - assertIsSingleTransactionPlan: () => assertIsSingleTransactionPlan, - assertIsSingleTransactionPlanResult: () => assertIsSingleTransactionPlanResult, - assertIsStringifiedBigInt: () => assertIsStringifiedBigInt, - assertIsStringifiedNumber: () => assertIsStringifiedNumber, - assertIsSuccessfulSingleTransactionPlanResult: () => assertIsSuccessfulSingleTransactionPlanResult, - assertIsSuccessfulTransactionPlanResult: () => assertIsSuccessfulTransactionPlanResult, - assertIsTransactionMessageWithBlockhashLifetime: () => assertIsTransactionMessageWithBlockhashLifetime, - assertIsTransactionMessageWithDurableNonceLifetime: () => assertIsTransactionMessageWithDurableNonceLifetime, - assertIsTransactionMessageWithSingleSendingSigner: () => assertIsTransactionMessageWithSingleSendingSigner, - assertIsTransactionMessageWithinSizeLimit: () => assertIsTransactionMessageWithinSizeLimit, - assertIsTransactionModifyingSigner: () => assertIsTransactionModifyingSigner, - assertIsTransactionPartialSigner: () => assertIsTransactionPartialSigner, - assertIsTransactionSendingSigner: () => assertIsTransactionSendingSigner, - assertIsTransactionSigner: () => assertIsTransactionSigner, - assertIsTransactionWithBlockhashLifetime: () => assertIsTransactionWithBlockhashLifetime, - assertIsTransactionWithDurableNonceLifetime: () => assertIsTransactionWithDurableNonceLifetime, - assertIsTransactionWithinSizeLimit: () => assertIsTransactionWithinSizeLimit, - assertIsUnixTimestamp: () => assertIsUnixTimestamp, - assertIsVariableSize: () => assertIsVariableSize, - assertNumberIsBetweenForCodec: () => assertNumberIsBetweenForCodec, - assertValidBaseString: () => assertValidBaseString, - assertValidNumberOfItemsForCodec: () => assertValidNumberOfItemsForCodec, - blockhash: () => blockhash, - bytesEqual: () => bytesEqual, - canceledSingleTransactionPlanResult: () => canceledSingleTransactionPlanResult, - combineCodec: () => combineCodec, - commitmentComparator: () => commitmentComparator, - compileOffchainMessageEnvelope: () => compileOffchainMessageEnvelope, - compileOffchainMessageV0Envelope: () => compileOffchainMessageV0Envelope, - compileOffchainMessageV1Envelope: () => compileOffchainMessageV1Envelope, - compileTransaction: () => compileTransaction, - compileTransactionMessage: () => compileTransactionMessage, - compressTransactionMessageUsingAddressLookupTables: () => compressTransactionMessageUsingAddressLookupTables, - containsBytes: () => containsBytes, - createAddressWithSeed: () => createAddressWithSeed, - createCodec: () => createCodec, - createDecoder: () => createDecoder, - createDecoderThatConsumesEntireByteArray: () => createDecoderThatConsumesEntireByteArray, - createDefaultRpcSubscriptionsChannelCreator: () => createDefaultRpcSubscriptionsChannelCreator, - createDefaultRpcSubscriptionsTransport: () => createDefaultRpcSubscriptionsTransport, - createDefaultRpcTransport: () => createDefaultRpcTransport, - createDefaultSolanaRpcSubscriptionsChannelCreator: () => createDefaultSolanaRpcSubscriptionsChannelCreator, - createEmptyClient: () => createEmptyClient, - createEncoder: () => createEncoder, - createJsonRpcApi: () => createJsonRpcApi, - createKeyPairFromBytes: () => createKeyPairFromBytes, - createKeyPairFromPrivateKeyBytes: () => createKeyPairFromPrivateKeyBytes, - createKeyPairSignerFromBytes: () => createKeyPairSignerFromBytes, - createKeyPairSignerFromPrivateKeyBytes: () => createKeyPairSignerFromPrivateKeyBytes, - createNoopSigner: () => createNoopSigner, - createPrivateKeyFromBytes: () => createPrivateKeyFromBytes, - createRpc: () => createRpc, - createRpcMessage: () => createRpcMessage, - createRpcSubscriptionsApi: () => createRpcSubscriptionsApi, - createRpcSubscriptionsTransportFromChannelCreator: () => createRpcSubscriptionsTransportFromChannelCreator, - createSignableMessage: () => createSignableMessage, - createSignerFromKeyPair: () => createSignerFromKeyPair, - createSolanaRpc: () => createSolanaRpc, - createSolanaRpcApi: () => createSolanaRpcApi, - createSolanaRpcFromTransport: () => createSolanaRpcFromTransport, - createSolanaRpcSubscriptions: () => createSolanaRpcSubscriptions, - createSolanaRpcSubscriptionsApi: () => createSolanaRpcSubscriptionsApi, - createSolanaRpcSubscriptionsApi_UNSTABLE: () => createSolanaRpcSubscriptionsApi_UNSTABLE, - createSolanaRpcSubscriptionsFromTransport: () => createSolanaRpcSubscriptionsFromTransport, - createSolanaRpcSubscriptions_UNSTABLE: () => createSolanaRpcSubscriptions_UNSTABLE, - createSubscriptionRpc: () => createSubscriptionRpc, - createTransactionMessage: () => createTransactionMessage, - createTransactionPlanExecutor: () => createTransactionPlanExecutor, - createTransactionPlanner: () => createTransactionPlanner, - decodeAccount: () => decodeAccount, - decompileTransactionMessage: () => decompileTransactionMessage, - decompileTransactionMessageFetchingLookupTables: () => decompileTransactionMessageFetchingLookupTables, - devnet: () => devnet, - downgradeRoleToNonSigner: () => downgradeRoleToNonSigner, - downgradeRoleToReadonly: () => downgradeRoleToReadonly, - everyInstructionPlan: () => everyInstructionPlan, - everyTransactionPlan: () => everyTransactionPlan, - everyTransactionPlanResult: () => everyTransactionPlanResult, - executeRpcPubSubSubscriptionPlan: () => executeRpcPubSubSubscriptionPlan, - failedSingleTransactionPlanResult: () => failedSingleTransactionPlanResult, - fetchAddressesForLookupTables: () => fetchAddressesForLookupTables, - fetchEncodedAccount: () => fetchEncodedAccount, - fetchEncodedAccounts: () => fetchEncodedAccounts, - fetchJsonParsedAccount: () => fetchJsonParsedAccount, - fetchJsonParsedAccounts: () => fetchJsonParsedAccounts, - findInstructionPlan: () => findInstructionPlan, - findTransactionPlan: () => findTransactionPlan, - findTransactionPlanResult: () => findTransactionPlanResult, - fixBytes: () => fixBytes, - fixCodecSize: () => fixCodecSize, - fixDecoderSize: () => fixDecoderSize, - fixEncoderSize: () => fixEncoderSize, - flattenInstructionPlan: () => flattenInstructionPlan, - flattenTransactionPlan: () => flattenTransactionPlan, - flattenTransactionPlanResult: () => flattenTransactionPlanResult, - generateKeyPair: () => generateKeyPair, - generateKeyPairSigner: () => generateKeyPairSigner, - getAddressCodec: () => getAddressCodec, - getAddressComparator: () => getAddressComparator, - getAddressDecoder: () => getAddressDecoder, - getAddressEncoder: () => getAddressEncoder, - getAddressFromPublicKey: () => getAddressFromPublicKey, - getAllSingleTransactionPlans: () => getAllSingleTransactionPlans, - getArrayCodec: () => getArrayCodec, - getArrayDecoder: () => getArrayDecoder, - getArrayEncoder: () => getArrayEncoder, - getBase10Codec: () => getBase10Codec, - getBase10Decoder: () => getBase10Decoder, - getBase10Encoder: () => getBase10Encoder, - getBase16Codec: () => getBase16Codec, - getBase16Decoder: () => getBase16Decoder, - getBase16Encoder: () => getBase16Encoder, - getBase58Codec: () => getBase58Codec, - getBase58Decoder: () => getBase58Decoder, - getBase58Encoder: () => getBase58Encoder, - getBase64Codec: () => getBase64Codec, - getBase64Decoder: () => getBase64Decoder, - getBase64EncodedWireTransaction: () => getBase64EncodedWireTransaction, - getBase64Encoder: () => getBase64Encoder, - getBaseXCodec: () => getBaseXCodec, - getBaseXDecoder: () => getBaseXDecoder, - getBaseXEncoder: () => getBaseXEncoder, - getBaseXResliceCodec: () => getBaseXResliceCodec, - getBaseXResliceDecoder: () => getBaseXResliceDecoder, - getBaseXResliceEncoder: () => getBaseXResliceEncoder, - getBitArrayCodec: () => getBitArrayCodec, - getBitArrayDecoder: () => getBitArrayDecoder, - getBitArrayEncoder: () => getBitArrayEncoder, - getBlockhashCodec: () => getBlockhashCodec, - getBlockhashComparator: () => getBlockhashComparator, - getBlockhashDecoder: () => getBlockhashDecoder, - getBlockhashEncoder: () => getBlockhashEncoder, - getBooleanCodec: () => getBooleanCodec, - getBooleanDecoder: () => getBooleanDecoder, - getBooleanEncoder: () => getBooleanEncoder, - getBytesCodec: () => getBytesCodec, - getBytesDecoder: () => getBytesDecoder, - getBytesEncoder: () => getBytesEncoder, - getChannelPoolingChannelCreator: () => getChannelPoolingChannelCreator, - getCompiledTransactionMessageCodec: () => getCompiledTransactionMessageCodec, - getCompiledTransactionMessageDecoder: () => getCompiledTransactionMessageDecoder, - getCompiledTransactionMessageEncoder: () => getCompiledTransactionMessageEncoder, - getConstantCodec: () => getConstantCodec, - getConstantDecoder: () => getConstantDecoder, - getConstantEncoder: () => getConstantEncoder, - getDefaultLamportsCodec: () => getDefaultLamportsCodec, - getDefaultLamportsDecoder: () => getDefaultLamportsDecoder, - getDefaultLamportsEncoder: () => getDefaultLamportsEncoder, - getDiscriminatedUnionCodec: () => getDiscriminatedUnionCodec, - getDiscriminatedUnionDecoder: () => getDiscriminatedUnionDecoder, - getDiscriminatedUnionEncoder: () => getDiscriminatedUnionEncoder, - getEncodedSize: () => getEncodedSize, - getEnumCodec: () => getEnumCodec, - getEnumDecoder: () => getEnumDecoder, - getEnumEncoder: () => getEnumEncoder, - getF32Codec: () => getF32Codec, - getF32Decoder: () => getF32Decoder, - getF32Encoder: () => getF32Encoder, - getF64Codec: () => getF64Codec, - getF64Decoder: () => getF64Decoder, - getF64Encoder: () => getF64Encoder, - getFirstFailedSingleTransactionPlanResult: () => getFirstFailedSingleTransactionPlanResult, - getHiddenPrefixCodec: () => getHiddenPrefixCodec, - getHiddenPrefixDecoder: () => getHiddenPrefixDecoder, - getHiddenPrefixEncoder: () => getHiddenPrefixEncoder, - getHiddenSuffixCodec: () => getHiddenSuffixCodec, - getHiddenSuffixDecoder: () => getHiddenSuffixDecoder, - getHiddenSuffixEncoder: () => getHiddenSuffixEncoder, - getI128Codec: () => getI128Codec, - getI128Decoder: () => getI128Decoder, - getI128Encoder: () => getI128Encoder, - getI16Codec: () => getI16Codec, - getI16Decoder: () => getI16Decoder, - getI16Encoder: () => getI16Encoder, - getI32Codec: () => getI32Codec, - getI32Decoder: () => getI32Decoder, - getI32Encoder: () => getI32Encoder, - getI64Codec: () => getI64Codec, - getI64Decoder: () => getI64Decoder, - getI64Encoder: () => getI64Encoder, - getI8Codec: () => getI8Codec, - getI8Decoder: () => getI8Decoder, - getI8Encoder: () => getI8Encoder, - getLamportsCodec: () => getLamportsCodec, - getLamportsDecoder: () => getLamportsDecoder, - getLamportsEncoder: () => getLamportsEncoder, - getLinearMessagePackerInstructionPlan: () => getLinearMessagePackerInstructionPlan, - getLiteralUnionCodec: () => getLiteralUnionCodec, - getLiteralUnionDecoder: () => getLiteralUnionDecoder, - getLiteralUnionEncoder: () => getLiteralUnionEncoder, - getMapCodec: () => getMapCodec, - getMapDecoder: () => getMapDecoder, - getMapEncoder: () => getMapEncoder, - getMessagePackerInstructionPlanFromInstructions: () => getMessagePackerInstructionPlanFromInstructions, - getMinimumBalanceForRentExemption: () => getMinimumBalanceForRentExemption, - getNullableCodec: () => getNullableCodec, - getNullableDecoder: () => getNullableDecoder, - getNullableEncoder: () => getNullableEncoder, - getOffchainMessageApplicationDomainCodec: () => getOffchainMessageApplicationDomainCodec, - getOffchainMessageApplicationDomainDecoder: () => getOffchainMessageApplicationDomainDecoder, - getOffchainMessageApplicationDomainEncoder: () => getOffchainMessageApplicationDomainEncoder, - getOffchainMessageCodec: () => getOffchainMessageCodec, - getOffchainMessageDecoder: () => getOffchainMessageDecoder, - getOffchainMessageEncoder: () => getOffchainMessageEncoder, - getOffchainMessageEnvelopeCodec: () => getOffchainMessageEnvelopeCodec, - getOffchainMessageEnvelopeDecoder: () => getOffchainMessageEnvelopeDecoder, - getOffchainMessageEnvelopeEncoder: () => getOffchainMessageEnvelopeEncoder, - getOffchainMessageV0Codec: () => getOffchainMessageV0Codec, - getOffchainMessageV0Decoder: () => getOffchainMessageV0Decoder, - getOffchainMessageV0Encoder: () => getOffchainMessageV0Encoder, - getOffchainMessageV1Codec: () => getOffchainMessageV1Codec, - getOffchainMessageV1Decoder: () => getOffchainMessageV1Decoder, - getOffchainMessageV1Encoder: () => getOffchainMessageV1Encoder, - getOptionCodec: () => getOptionCodec, - getOptionDecoder: () => getOptionDecoder, - getOptionEncoder: () => getOptionEncoder, - getProgramDerivedAddress: () => getProgramDerivedAddress, - getPublicKeyFromAddress: () => getPublicKeyFromAddress, - getPublicKeyFromPrivateKey: () => getPublicKeyFromPrivateKey, - getReallocMessagePackerInstructionPlan: () => getReallocMessagePackerInstructionPlan, - getRpcSubscriptionsChannelWithAutoping: () => getRpcSubscriptionsChannelWithAutoping, - getRpcSubscriptionsChannelWithBigIntJSONSerialization: () => getRpcSubscriptionsChannelWithBigIntJSONSerialization, - getRpcSubscriptionsChannelWithJSONSerialization: () => getRpcSubscriptionsChannelWithJSONSerialization, - getRpcSubscriptionsTransportWithSubscriptionCoalescing: () => getRpcSubscriptionsTransportWithSubscriptionCoalescing, - getSetCodec: () => getSetCodec, - getSetDecoder: () => getSetDecoder, - getSetEncoder: () => getSetEncoder, - getShortU16Codec: () => getShortU16Codec, - getShortU16Decoder: () => getShortU16Decoder, - getShortU16Encoder: () => getShortU16Encoder, - getSignatureFromTransaction: () => getSignatureFromTransaction, - getSignersFromInstruction: () => getSignersFromInstruction, - getSignersFromOffchainMessage: () => getSignersFromOffchainMessage, - getSignersFromTransactionMessage: () => getSignersFromTransactionMessage, - getSolanaErrorFromInstructionError: () => getSolanaErrorFromInstructionError, - getSolanaErrorFromJsonRpcError: () => getSolanaErrorFromJsonRpcError, - getSolanaErrorFromTransactionError: () => getSolanaErrorFromTransactionError, - getStructCodec: () => getStructCodec, - getStructDecoder: () => getStructDecoder, - getStructEncoder: () => getStructEncoder, - getTransactionCodec: () => getTransactionCodec, - getTransactionDecoder: () => getTransactionDecoder, - getTransactionEncoder: () => getTransactionEncoder, - getTransactionLifetimeConstraintFromCompiledTransactionMessage: () => getTransactionLifetimeConstraintFromCompiledTransactionMessage, - getTransactionMessageSize: () => getTransactionMessageSize, - getTransactionSize: () => getTransactionSize, - getTransactionVersionCodec: () => getTransactionVersionCodec, - getTransactionVersionDecoder: () => getTransactionVersionDecoder, - getTransactionVersionEncoder: () => getTransactionVersionEncoder, - getTupleCodec: () => getTupleCodec, - getTupleDecoder: () => getTupleDecoder, - getTupleEncoder: () => getTupleEncoder, - getU128Codec: () => getU128Codec, - getU128Decoder: () => getU128Decoder, - getU128Encoder: () => getU128Encoder, - getU16Codec: () => getU16Codec, - getU16Decoder: () => getU16Decoder, - getU16Encoder: () => getU16Encoder, - getU32Codec: () => getU32Codec, - getU32Decoder: () => getU32Decoder, - getU32Encoder: () => getU32Encoder, - getU64Codec: () => getU64Codec, - getU64Decoder: () => getU64Decoder, - getU64Encoder: () => getU64Encoder, - getU8Codec: () => getU8Codec, - getU8Decoder: () => getU8Decoder, - getU8Encoder: () => getU8Encoder, - getUnionCodec: () => getUnionCodec, - getUnionDecoder: () => getUnionDecoder, - getUnionEncoder: () => getUnionEncoder, - getUnitCodec: () => getUnitCodec, - getUnitDecoder: () => getUnitDecoder, - getUnitEncoder: () => getUnitEncoder, - getUtf8Codec: () => getUtf8Codec, - getUtf8Decoder: () => getUtf8Decoder, - getUtf8Encoder: () => getUtf8Encoder, - isAddress: () => isAddress2, - isAdvanceNonceAccountInstruction: () => isAdvanceNonceAccountInstruction, - isBlockhash: () => isBlockhash, - isCanceledSingleTransactionPlanResult: () => isCanceledSingleTransactionPlanResult, - isFailedSingleTransactionPlanResult: () => isFailedSingleTransactionPlanResult, - isFixedSize: () => isFixedSize, - isFullySignedOffchainMessageEnvelope: () => isFullySignedOffchainMessageEnvelope, - isFullySignedTransaction: () => isFullySignedTransaction, - isInstructionForProgram: () => isInstructionForProgram, - isInstructionWithAccounts: () => isInstructionWithAccounts, - isInstructionWithData: () => isInstructionWithData, - isJsonRpcPayload: () => isJsonRpcPayload, - isKeyPairSigner: () => isKeyPairSigner, - isLamports: () => isLamports, - isMessageModifyingSigner: () => isMessageModifyingSigner, - isMessagePackerInstructionPlan: () => isMessagePackerInstructionPlan, - isMessagePartialSigner: () => isMessagePartialSigner, - isMessageSigner: () => isMessageSigner, - isNonDivisibleSequentialInstructionPlan: () => isNonDivisibleSequentialInstructionPlan, - isNonDivisibleSequentialTransactionPlan: () => isNonDivisibleSequentialTransactionPlan, - isNonDivisibleSequentialTransactionPlanResult: () => isNonDivisibleSequentialTransactionPlanResult, - isNone: () => isNone, - isOffCurveAddress: () => isOffCurveAddress, - isOffchainMessageApplicationDomain: () => isOffchainMessageApplicationDomain, - isOffchainMessageContentRestrictedAsciiOf1232BytesMax: () => isOffchainMessageContentRestrictedAsciiOf1232BytesMax, - isOffchainMessageContentUtf8Of1232BytesMax: () => isOffchainMessageContentUtf8Of1232BytesMax, - isOffchainMessageContentUtf8Of65535BytesMax: () => isOffchainMessageContentUtf8Of65535BytesMax, - isOption: () => isOption, - isParallelInstructionPlan: () => isParallelInstructionPlan, - isParallelTransactionPlan: () => isParallelTransactionPlan, - isParallelTransactionPlanResult: () => isParallelTransactionPlanResult, - isProgramDerivedAddress: () => isProgramDerivedAddress, - isProgramError: () => isProgramError, - isSendableTransaction: () => isSendableTransaction, - isSequentialInstructionPlan: () => isSequentialInstructionPlan, - isSequentialTransactionPlan: () => isSequentialTransactionPlan, - isSequentialTransactionPlanResult: () => isSequentialTransactionPlanResult, - isSignature: () => isSignature, - isSignatureBytes: () => isSignatureBytes, - isSignerRole: () => isSignerRole, - isSingleInstructionPlan: () => isSingleInstructionPlan, - isSingleTransactionPlan: () => isSingleTransactionPlan, - isSingleTransactionPlanResult: () => isSingleTransactionPlanResult, - isSolanaError: () => isSolanaError, - isSome: () => isSome, - isStringifiedBigInt: () => isStringifiedBigInt, - isStringifiedNumber: () => isStringifiedNumber, - isSuccessfulSingleTransactionPlanResult: () => isSuccessfulSingleTransactionPlanResult, - isSuccessfulTransactionPlanResult: () => isSuccessfulTransactionPlanResult, - isTransactionMessageWithBlockhashLifetime: () => isTransactionMessageWithBlockhashLifetime, - isTransactionMessageWithDurableNonceLifetime: () => isTransactionMessageWithDurableNonceLifetime, - isTransactionMessageWithSingleSendingSigner: () => isTransactionMessageWithSingleSendingSigner, - isTransactionMessageWithinSizeLimit: () => isTransactionMessageWithinSizeLimit, - isTransactionModifyingSigner: () => isTransactionModifyingSigner, - isTransactionPartialSigner: () => isTransactionPartialSigner, - isTransactionSendingSigner: () => isTransactionSendingSigner, - isTransactionSigner: () => isTransactionSigner, - isTransactionWithBlockhashLifetime: () => isTransactionWithBlockhashLifetime, - isTransactionWithDurableNonceLifetime: () => isTransactionWithDurableNonceLifetime, - isTransactionWithinSizeLimit: () => isTransactionWithinSizeLimit, - isUnixTimestamp: () => isUnixTimestamp, - isVariableSize: () => isVariableSize, - isWritableRole: () => isWritableRole, - lamports: () => lamports, - mainnet: () => mainnet, - mergeBytes: () => mergeBytes, - mergeRoles: () => mergeRoles, - nonDivisibleSequentialInstructionPlan: () => nonDivisibleSequentialInstructionPlan, - nonDivisibleSequentialTransactionPlan: () => nonDivisibleSequentialTransactionPlan, - nonDivisibleSequentialTransactionPlanResult: () => nonDivisibleSequentialTransactionPlanResult, - none: () => none, - offCurveAddress: () => offCurveAddress, - offchainMessageApplicationDomain: () => offchainMessageApplicationDomain, - offchainMessageContentRestrictedAsciiOf1232BytesMax: () => offchainMessageContentRestrictedAsciiOf1232BytesMax, - offchainMessageContentUtf8Of1232BytesMax: () => offchainMessageContentUtf8Of1232BytesMax, - offchainMessageContentUtf8Of65535BytesMax: () => offchainMessageContentUtf8Of65535BytesMax, - offsetCodec: () => offsetCodec, - offsetDecoder: () => offsetDecoder, - offsetEncoder: () => offsetEncoder, - padBytes: () => padBytes2, - padLeftCodec: () => padLeftCodec, - padLeftDecoder: () => padLeftDecoder, - padLeftEncoder: () => padLeftEncoder, - padNullCharacters: () => padNullCharacters, - padRightCodec: () => padRightCodec, - padRightDecoder: () => padRightDecoder, - padRightEncoder: () => padRightEncoder, - parallelInstructionPlan: () => parallelInstructionPlan, - parallelTransactionPlan: () => parallelTransactionPlan, - parallelTransactionPlanResult: () => parallelTransactionPlanResult, - parseBase58RpcAccount: () => parseBase58RpcAccount, - parseBase64RpcAccount: () => parseBase64RpcAccount, - parseJsonRpcAccount: () => parseJsonRpcAccount, - partiallySignOffchainMessageEnvelope: () => partiallySignOffchainMessageEnvelope, - partiallySignOffchainMessageWithSigners: () => partiallySignOffchainMessageWithSigners, - partiallySignTransaction: () => partiallySignTransaction, - partiallySignTransactionMessageWithSigners: () => partiallySignTransactionMessageWithSigners, - passthroughFailedTransactionPlanExecution: () => passthroughFailedTransactionPlanExecution, - pipe: () => pipe, - prependTransactionMessageInstruction: () => prependTransactionMessageInstruction, - prependTransactionMessageInstructions: () => prependTransactionMessageInstructions, - removeNullCharacters: () => removeNullCharacters, - resizeCodec: () => resizeCodec, - resizeDecoder: () => resizeDecoder, - resizeEncoder: () => resizeEncoder, - reverseCodec: () => reverseCodec, - reverseDecoder: () => reverseDecoder, - reverseEncoder: () => reverseEncoder, - safeCaptureStackTrace: () => safeCaptureStackTrace, - sendAndConfirmDurableNonceTransactionFactory: () => sendAndConfirmDurableNonceTransactionFactory, - sendAndConfirmTransactionFactory: () => sendAndConfirmTransactionFactory, - sendTransactionWithoutConfirmingFactory: () => sendTransactionWithoutConfirmingFactory, - sequentialInstructionPlan: () => sequentialInstructionPlan, - sequentialTransactionPlan: () => sequentialTransactionPlan, - sequentialTransactionPlanResult: () => sequentialTransactionPlanResult, - setTransactionMessageFeePayer: () => setTransactionMessageFeePayer, - setTransactionMessageFeePayerSigner: () => setTransactionMessageFeePayerSigner, - setTransactionMessageLifetimeUsingBlockhash: () => setTransactionMessageLifetimeUsingBlockhash, - setTransactionMessageLifetimeUsingDurableNonce: () => setTransactionMessageLifetimeUsingDurableNonce, - signAndSendTransactionMessageWithSigners: () => signAndSendTransactionMessageWithSigners, - signBytes: () => signBytes, - signOffchainMessageEnvelope: () => signOffchainMessageEnvelope, - signOffchainMessageWithSigners: () => signOffchainMessageWithSigners, - signTransaction: () => signTransaction2, - signTransactionMessageWithSigners: () => signTransactionMessageWithSigners, - signature: () => signature, - signatureBytes: () => signatureBytes, - singleInstructionPlan: () => singleInstructionPlan, - singleTransactionPlan: () => singleTransactionPlan, - some: () => some, - stringifiedBigInt: () => stringifiedBigInt, - stringifiedNumber: () => stringifiedNumber, - successfulSingleTransactionPlanResult: () => successfulSingleTransactionPlanResult, - successfulSingleTransactionPlanResultFromSignature: () => successfulSingleTransactionPlanResultFromSignature, - summarizeTransactionPlanResult: () => summarizeTransactionPlanResult, - testnet: () => testnet, - toArrayBuffer: () => toArrayBuffer, - transformChannelInboundMessages: () => transformChannelInboundMessages, - transformChannelOutboundMessages: () => transformChannelOutboundMessages, - transformCodec: () => transformCodec, - transformDecoder: () => transformDecoder, - transformEncoder: () => transformEncoder, - transformInstructionPlan: () => transformInstructionPlan, - transformTransactionPlan: () => transformTransactionPlan, - transformTransactionPlanResult: () => transformTransactionPlanResult, - unixTimestamp: () => unixTimestamp, - unwrapOption: () => unwrapOption, - unwrapOptionRecursively: () => unwrapOptionRecursively, - unwrapSimulationError: () => unwrapSimulationError, - upgradeRoleToSigner: () => upgradeRoleToSigner, - upgradeRoleToWritable: () => upgradeRoleToWritable, - verifyOffchainMessageEnvelope: () => verifyOffchainMessageEnvelope, - verifySignature: () => verifySignature, - wrapNullable: () => wrapNullable + init_getChainContractAddress(); + init_toHex(); + init_packetToBytes(); + init_getAction(); + init_readContract(); + } +}); + +// node_modules/viem/_esm/actions/public/createAccessList.js +async function createAccessList(client, args) { + const { account: account_ = client.account, blockNumber, blockTag = "latest", blobs, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, to, value, ...rest } = args; + const account = account_ ? parseAccount(account_) : void 0; + try { + assertRequest(args); + const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; + const block = blockNumberHex || blockTag; + const chainFormat = client.chain?.formatters?.transactionRequest?.format; + const format = chainFormat || formatTransactionRequest; + const request = format({ + // Pick out extra data that might exist on the chain's transaction request type. + ...extract(rest, { format: chainFormat }), + account, + blobs, + data, + gas, + gasPrice, + maxFeePerBlobGas, + maxFeePerGas, + maxPriorityFeePerGas, + to, + value + }, "createAccessList"); + const response = await client.request({ + method: "eth_createAccessList", + params: [request, block] + }); + return { + accessList: response.accessList, + gasUsed: BigInt(response.gasUsed) + }; + } catch (err) { + throw getCallError(err, { + ...args, + account, + chain: client.chain + }); + } +} +var init_createAccessList = __esm({ + "node_modules/viem/_esm/actions/public/createAccessList.js"() { + "use strict"; + init_parseAccount(); + init_toHex(); + init_getCallError(); + init_extract(); + init_transactionRequest(); + init_assertRequest(); + } +}); + +// node_modules/viem/_esm/actions/public/createBlockFilter.js +async function createBlockFilter(client) { + const getRequest = createFilterRequestScope(client, { + method: "eth_newBlockFilter" + }); + const id = await client.request({ + method: "eth_newBlockFilter" + }); + return { id, request: getRequest(id), type: "block" }; +} +var init_createBlockFilter = __esm({ + "node_modules/viem/_esm/actions/public/createBlockFilter.js"() { + "use strict"; + init_createFilterRequestScope(); + } +}); + +// node_modules/viem/_esm/actions/public/createEventFilter.js +async function createEventFilter(client, { address: address2, args, event, events: events_, fromBlock, strict, toBlock } = {}) { + const events = events_ ?? (event ? [event] : void 0); + const getRequest = createFilterRequestScope(client, { + method: "eth_newFilter" + }); + let topics = []; + if (events) { + const encoded = events.flatMap((event2) => encodeEventTopics({ + abi: [event2], + eventName: event2.name, + args + })); + topics = [encoded]; + if (event) + topics = topics[0]; + } + const id = await client.request({ + method: "eth_newFilter", + params: [ + { + address: address2, + fromBlock: typeof fromBlock === "bigint" ? numberToHex(fromBlock) : fromBlock, + toBlock: typeof toBlock === "bigint" ? numberToHex(toBlock) : toBlock, + ...topics.length ? { topics } : {} + } + ] + }); + return { + abi: events, + args, + eventName: event ? event.name : void 0, + fromBlock, + id, + request: getRequest(id), + strict: Boolean(strict), + toBlock, + type: "event" + }; +} +var init_createEventFilter = __esm({ + "node_modules/viem/_esm/actions/public/createEventFilter.js"() { + "use strict"; + init_encodeEventTopics(); + init_toHex(); + init_createFilterRequestScope(); + } +}); + +// node_modules/viem/_esm/actions/public/createPendingTransactionFilter.js +async function createPendingTransactionFilter(client) { + const getRequest = createFilterRequestScope(client, { + method: "eth_newPendingTransactionFilter" + }); + const id = await client.request({ + method: "eth_newPendingTransactionFilter" + }); + return { id, request: getRequest(id), type: "transaction" }; +} +var init_createPendingTransactionFilter = __esm({ + "node_modules/viem/_esm/actions/public/createPendingTransactionFilter.js"() { + "use strict"; + init_createFilterRequestScope(); + } +}); + +// node_modules/viem/_esm/actions/public/getBalance.js +async function getBalance(client, { address: address2, blockNumber, blockTag = client.experimental_blockTag ?? "latest" }) { + if (client.batch?.multicall && client.chain?.contracts?.multicall3) { + const multicall3Address = client.chain.contracts.multicall3.address; + const calldata = encodeFunctionData({ + abi: multicall3Abi, + functionName: "getEthBalance", + args: [address2] + }); + const { data } = await getAction(client, call, "call")({ + to: multicall3Address, + data: calldata, + blockNumber, + blockTag + }); + return decodeFunctionResult({ + abi: multicall3Abi, + functionName: "getEthBalance", + args: [address2], + data: data || "0x" + }); + } + const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; + const balance = await client.request({ + method: "eth_getBalance", + params: [address2, blockNumberHex || blockTag] + }); + return BigInt(balance); +} +var init_getBalance = __esm({ + "node_modules/viem/_esm/actions/public/getBalance.js"() { + "use strict"; + init_abis(); + init_decodeFunctionResult(); + init_encodeFunctionData(); + init_toHex(); + init_getAction(); + init_call(); + } +}); + +// node_modules/viem/_esm/actions/public/getBlobBaseFee.js +async function getBlobBaseFee(client) { + const baseFee = await client.request({ + method: "eth_blobBaseFee" + }); + return BigInt(baseFee); +} +var init_getBlobBaseFee = __esm({ + "node_modules/viem/_esm/actions/public/getBlobBaseFee.js"() { + "use strict"; + } +}); + +// node_modules/viem/_esm/actions/public/getBlockTransactionCount.js +async function getBlockTransactionCount(client, { blockHash, blockNumber, blockTag = "latest" } = {}) { + const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; + let count; + if (blockHash) { + count = await client.request({ + method: "eth_getBlockTransactionCountByHash", + params: [blockHash] + }, { dedupe: true }); + } else { + count = await client.request({ + method: "eth_getBlockTransactionCountByNumber", + params: [blockNumberHex || blockTag] + }, { dedupe: Boolean(blockNumberHex) }); + } + return hexToNumber(count); +} +var init_getBlockTransactionCount = __esm({ + "node_modules/viem/_esm/actions/public/getBlockTransactionCount.js"() { + "use strict"; + init_fromHex(); + init_toHex(); + } +}); + +// node_modules/viem/_esm/actions/public/getCode.js +async function getCode(client, { address: address2, blockNumber, blockTag = "latest" }) { + const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; + const hex = await client.request({ + method: "eth_getCode", + params: [address2, blockNumberHex || blockTag] + }, { dedupe: Boolean(blockNumberHex) }); + if (hex === "0x") + return void 0; + return hex; +} +var init_getCode = __esm({ + "node_modules/viem/_esm/actions/public/getCode.js"() { + "use strict"; + init_toHex(); + } +}); + +// node_modules/viem/_esm/actions/public/getDelegation.js +async function getDelegation(client, { address: address2, blockNumber, blockTag = "latest" }) { + const code = await getCode(client, { + address: address2, + ...blockNumber !== void 0 ? { blockNumber } : { blockTag } + }); + if (!code) + return void 0; + if (size(code) !== 23) + return void 0; + if (!code.startsWith("0xef0100")) + return void 0; + return getAddress(slice(code, 3, 23)); +} +var init_getDelegation = __esm({ + "node_modules/viem/_esm/actions/public/getDelegation.js"() { + "use strict"; + init_getAddress(); + init_size(); + init_slice(); + init_getCode(); + } +}); + +// node_modules/viem/_esm/errors/eip712.js +var Eip712DomainNotFoundError; +var init_eip712 = __esm({ + "node_modules/viem/_esm/errors/eip712.js"() { + "use strict"; + init_base(); + Eip712DomainNotFoundError = class extends BaseError2 { + constructor({ address: address2 }) { + super(`No EIP-712 domain found on contract "${address2}".`, { + metaMessages: [ + "Ensure that:", + `- The contract is deployed at the address "${address2}".`, + "- `eip712Domain()` function exists on the contract.", + "- `eip712Domain()` function matches signature to ERC-5267 specification." + ], + name: "Eip712DomainNotFoundError" + }); + } + }; + } +}); + +// node_modules/viem/_esm/actions/public/getEip712Domain.js +async function getEip712Domain(client, parameters) { + const { address: address2, factory, factoryData } = parameters; + try { + const [fields, name, version4, chainId, verifyingContract, salt, extensions] = await getAction(client, readContract, "readContract")({ + abi, + address: address2, + functionName: "eip712Domain", + factory, + factoryData + }); + return { + domain: { + name, + version: version4, + chainId: Number(chainId), + verifyingContract, + salt + }, + extensions, + fields + }; + } catch (e7) { + const error = e7; + if (error.name === "ContractFunctionExecutionError" && error.cause.name === "ContractFunctionZeroDataError") { + throw new Eip712DomainNotFoundError({ address: address2 }); + } + throw error; + } +} +var abi; +var init_getEip712Domain = __esm({ + "node_modules/viem/_esm/actions/public/getEip712Domain.js"() { + "use strict"; + init_eip712(); + init_getAction(); + init_readContract(); + abi = [ + { + inputs: [], + name: "eip712Domain", + outputs: [ + { name: "fields", type: "bytes1" }, + { name: "name", type: "string" }, + { name: "version", type: "string" }, + { name: "chainId", type: "uint256" }, + { name: "verifyingContract", type: "address" }, + { name: "salt", type: "bytes32" }, + { name: "extensions", type: "uint256[]" } + ], + stateMutability: "view", + type: "function" + } + ]; + } +}); + +// node_modules/viem/_esm/utils/formatters/feeHistory.js +function formatFeeHistory(feeHistory) { + return { + baseFeePerGas: feeHistory.baseFeePerGas.map((value) => BigInt(value)), + gasUsedRatio: feeHistory.gasUsedRatio, + oldestBlock: BigInt(feeHistory.oldestBlock), + reward: feeHistory.reward?.map((reward) => reward.map((value) => BigInt(value))) + }; +} +var init_feeHistory = __esm({ + "node_modules/viem/_esm/utils/formatters/feeHistory.js"() { + "use strict"; + } +}); + +// node_modules/viem/_esm/actions/public/getFeeHistory.js +async function getFeeHistory(client, { blockCount, blockNumber, blockTag = "latest", rewardPercentiles }) { + const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; + const feeHistory = await client.request({ + method: "eth_feeHistory", + params: [ + numberToHex(blockCount), + blockNumberHex || blockTag, + rewardPercentiles + ] + }, { dedupe: Boolean(blockNumberHex) }); + return formatFeeHistory(feeHistory); +} +var init_getFeeHistory = __esm({ + "node_modules/viem/_esm/actions/public/getFeeHistory.js"() { + "use strict"; + init_toHex(); + init_feeHistory(); + } +}); + +// node_modules/viem/_esm/actions/public/getFilterLogs.js +async function getFilterLogs(_client, { filter }) { + const strict = filter.strict ?? false; + const logs = await filter.request({ + method: "eth_getFilterLogs", + params: [filter.id] + }); + const formattedLogs = logs.map((log) => formatLog(log)); + if (!filter.abi) + return formattedLogs; + return parseEventLogs({ + abi: filter.abi, + logs: formattedLogs, + strict + }); +} +var init_getFilterLogs = __esm({ + "node_modules/viem/_esm/actions/public/getFilterLogs.js"() { + "use strict"; + init_parseEventLogs(); + init_log2(); + } +}); + +// node_modules/viem/_esm/utils/transaction/assertTransaction.js +function assertTransactionEIP7702(transaction) { + const { authorizationList } = transaction; + if (authorizationList) { + for (const authorization of authorizationList) { + const { chainId } = authorization; + const address2 = authorization.address; + if (!isAddress(address2)) + throw new InvalidAddressError({ address: address2 }); + if (chainId < 0) + throw new InvalidChainIdError({ chainId }); + } + } + assertTransactionEIP1559(transaction); +} +function assertTransactionEIP4844(transaction) { + const { blobVersionedHashes } = transaction; + if (blobVersionedHashes) { + if (blobVersionedHashes.length === 0) + throw new EmptyBlobError(); + for (const hash3 of blobVersionedHashes) { + const size_ = size(hash3); + const version4 = hexToNumber(slice(hash3, 0, 1)); + if (size_ !== 32) + throw new InvalidVersionedHashSizeError({ hash: hash3, size: size_ }); + if (version4 !== versionedHashVersionKzg) + throw new InvalidVersionedHashVersionError({ + hash: hash3, + version: version4 + }); + } + } + assertTransactionEIP1559(transaction); +} +function assertTransactionEIP1559(transaction) { + const { chainId, maxPriorityFeePerGas, maxFeePerGas, to } = transaction; + if (chainId <= 0) + throw new InvalidChainIdError({ chainId }); + if (to && !isAddress(to)) + throw new InvalidAddressError({ address: to }); + if (maxFeePerGas && maxFeePerGas > maxUint256) + throw new FeeCapTooHighError({ maxFeePerGas }); + if (maxPriorityFeePerGas && maxFeePerGas && maxPriorityFeePerGas > maxFeePerGas) + throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas }); +} +function assertTransactionEIP2930(transaction) { + const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } = transaction; + if (chainId <= 0) + throw new InvalidChainIdError({ chainId }); + if (to && !isAddress(to)) + throw new InvalidAddressError({ address: to }); + if (maxPriorityFeePerGas || maxFeePerGas) + throw new BaseError2("`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute."); + if (gasPrice && gasPrice > maxUint256) + throw new FeeCapTooHighError({ maxFeePerGas: gasPrice }); +} +function assertTransactionLegacy(transaction) { + const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } = transaction; + if (to && !isAddress(to)) + throw new InvalidAddressError({ address: to }); + if (typeof chainId !== "undefined" && chainId <= 0) + throw new InvalidChainIdError({ chainId }); + if (maxPriorityFeePerGas || maxFeePerGas) + throw new BaseError2("`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute."); + if (gasPrice && gasPrice > maxUint256) + throw new FeeCapTooHighError({ maxFeePerGas: gasPrice }); +} +var init_assertTransaction = __esm({ + "node_modules/viem/_esm/utils/transaction/assertTransaction.js"() { + "use strict"; + init_kzg(); + init_number(); + init_address(); + init_base(); + init_blob2(); + init_chain(); + init_node(); + init_isAddress(); + init_size(); + init_slice(); + init_fromHex(); + } +}); + +// node_modules/viem/_esm/utils/transaction/serializeAccessList.js +function serializeAccessList(accessList) { + if (!accessList || accessList.length === 0) + return []; + const serializedAccessList = []; + for (let i = 0; i < accessList.length; i++) { + const { address: address2, storageKeys } = accessList[i]; + for (let j = 0; j < storageKeys.length; j++) { + if (storageKeys[j].length - 2 !== 64) { + throw new InvalidStorageKeySizeError({ storageKey: storageKeys[j] }); + } + } + if (!isAddress(address2, { strict: false })) { + throw new InvalidAddressError({ address: address2 }); + } + serializedAccessList.push([address2, storageKeys]); + } + return serializedAccessList; +} +var init_serializeAccessList = __esm({ + "node_modules/viem/_esm/utils/transaction/serializeAccessList.js"() { + "use strict"; + init_address(); + init_transaction(); + init_isAddress(); + } +}); + +// node_modules/viem/_esm/utils/transaction/serializeTransaction.js +function serializeTransaction(transaction, signature2) { + const type = getTransactionType(transaction); + if (type === "eip1559") + return serializeTransactionEIP1559(transaction, signature2); + if (type === "eip2930") + return serializeTransactionEIP2930(transaction, signature2); + if (type === "eip4844") + return serializeTransactionEIP4844(transaction, signature2); + if (type === "eip7702") + return serializeTransactionEIP7702(transaction, signature2); + return serializeTransactionLegacy(transaction, signature2); +} +function serializeTransactionEIP7702(transaction, signature2) { + const { authorizationList, chainId, gas, nonce, to, value, maxFeePerGas, maxPriorityFeePerGas, accessList, data } = transaction; + assertTransactionEIP7702(transaction); + const serializedAccessList = serializeAccessList(accessList); + const serializedAuthorizationList = serializeAuthorizationList(authorizationList); + return concatHex([ + "0x04", + toRlp([ + numberToHex(chainId), + nonce ? numberToHex(nonce) : "0x", + maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : "0x", + maxFeePerGas ? numberToHex(maxFeePerGas) : "0x", + gas ? numberToHex(gas) : "0x", + to ?? "0x", + value ? numberToHex(value) : "0x", + data ?? "0x", + serializedAccessList, + serializedAuthorizationList, + ...toYParitySignatureArray(transaction, signature2) + ]) + ]); +} +function serializeTransactionEIP4844(transaction, signature2) { + const { chainId, gas, nonce, to, value, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, accessList, data } = transaction; + assertTransactionEIP4844(transaction); + let blobVersionedHashes = transaction.blobVersionedHashes; + let sidecars = transaction.sidecars; + if (transaction.blobs && (typeof blobVersionedHashes === "undefined" || typeof sidecars === "undefined")) { + const blobs2 = typeof transaction.blobs[0] === "string" ? transaction.blobs : transaction.blobs.map((x) => bytesToHex(x)); + const kzg = transaction.kzg; + const commitments2 = blobsToCommitments({ + blobs: blobs2, + kzg + }); + if (typeof blobVersionedHashes === "undefined") + blobVersionedHashes = commitmentsToVersionedHashes({ + commitments: commitments2 + }); + if (typeof sidecars === "undefined") { + const proofs2 = blobsToProofs({ blobs: blobs2, commitments: commitments2, kzg }); + sidecars = toBlobSidecars({ blobs: blobs2, commitments: commitments2, proofs: proofs2 }); + } + } + const serializedAccessList = serializeAccessList(accessList); + const serializedTransaction = [ + numberToHex(chainId), + nonce ? numberToHex(nonce) : "0x", + maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : "0x", + maxFeePerGas ? numberToHex(maxFeePerGas) : "0x", + gas ? numberToHex(gas) : "0x", + to ?? "0x", + value ? numberToHex(value) : "0x", + data ?? "0x", + serializedAccessList, + maxFeePerBlobGas ? numberToHex(maxFeePerBlobGas) : "0x", + blobVersionedHashes ?? [], + ...toYParitySignatureArray(transaction, signature2) + ]; + const blobs = []; + const commitments = []; + const proofs = []; + if (sidecars) + for (let i = 0; i < sidecars.length; i++) { + const { blob, commitment, proof } = sidecars[i]; + blobs.push(blob); + commitments.push(commitment); + proofs.push(proof); + } + return concatHex([ + "0x03", + sidecars ? ( + // If sidecars are enabled, envelope turns into a "wrapper": + toRlp([serializedTransaction, blobs, commitments, proofs]) + ) : ( + // If sidecars are disabled, standard envelope is used: + toRlp(serializedTransaction) + ) + ]); +} +function serializeTransactionEIP1559(transaction, signature2) { + const { chainId, gas, nonce, to, value, maxFeePerGas, maxPriorityFeePerGas, accessList, data } = transaction; + assertTransactionEIP1559(transaction); + const serializedAccessList = serializeAccessList(accessList); + const serializedTransaction = [ + numberToHex(chainId), + nonce ? numberToHex(nonce) : "0x", + maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : "0x", + maxFeePerGas ? numberToHex(maxFeePerGas) : "0x", + gas ? numberToHex(gas) : "0x", + to ?? "0x", + value ? numberToHex(value) : "0x", + data ?? "0x", + serializedAccessList, + ...toYParitySignatureArray(transaction, signature2) + ]; + return concatHex([ + "0x02", + toRlp(serializedTransaction) + ]); +} +function serializeTransactionEIP2930(transaction, signature2) { + const { chainId, gas, data, nonce, to, value, accessList, gasPrice } = transaction; + assertTransactionEIP2930(transaction); + const serializedAccessList = serializeAccessList(accessList); + const serializedTransaction = [ + numberToHex(chainId), + nonce ? numberToHex(nonce) : "0x", + gasPrice ? numberToHex(gasPrice) : "0x", + gas ? numberToHex(gas) : "0x", + to ?? "0x", + value ? numberToHex(value) : "0x", + data ?? "0x", + serializedAccessList, + ...toYParitySignatureArray(transaction, signature2) + ]; + return concatHex([ + "0x01", + toRlp(serializedTransaction) + ]); +} +function serializeTransactionLegacy(transaction, signature2) { + const { chainId = 0, gas, data, nonce, to, value, gasPrice } = transaction; + assertTransactionLegacy(transaction); + let serializedTransaction = [ + nonce ? numberToHex(nonce) : "0x", + gasPrice ? numberToHex(gasPrice) : "0x", + gas ? numberToHex(gas) : "0x", + to ?? "0x", + value ? numberToHex(value) : "0x", + data ?? "0x" + ]; + if (signature2) { + const v = (() => { + if (signature2.v >= 35n) { + const inferredChainId = (signature2.v - 35n) / 2n; + if (inferredChainId > 0) + return signature2.v; + return 27n + (signature2.v === 35n ? 0n : 1n); + } + if (chainId > 0) + return BigInt(chainId * 2) + BigInt(35n + signature2.v - 27n); + const v2 = 27n + (signature2.v === 27n ? 0n : 1n); + if (signature2.v !== v2) + throw new InvalidLegacyVError({ v: signature2.v }); + return v2; + })(); + const r = trim(signature2.r); + const s3 = trim(signature2.s); + serializedTransaction = [ + ...serializedTransaction, + numberToHex(v), + r === "0x00" ? "0x" : r, + s3 === "0x00" ? "0x" : s3 + ]; + } else if (chainId > 0) { + serializedTransaction = [ + ...serializedTransaction, + numberToHex(chainId), + "0x", + "0x" + ]; + } + return toRlp(serializedTransaction); +} +function toYParitySignatureArray(transaction, signature_) { + const signature2 = signature_ ?? transaction; + const { v, yParity } = signature2; + if (typeof signature2.r === "undefined") + return []; + if (typeof signature2.s === "undefined") + return []; + if (typeof v === "undefined" && typeof yParity === "undefined") + return []; + const r = trim(signature2.r); + const s3 = trim(signature2.s); + const yParity_ = (() => { + if (typeof yParity === "number") + return yParity ? numberToHex(1) : "0x"; + if (v === 0n) + return "0x"; + if (v === 1n) + return numberToHex(1); + return v === 27n ? "0x" : numberToHex(1); + })(); + return [yParity_, r === "0x00" ? "0x" : r, s3 === "0x00" ? "0x" : s3]; +} +var init_serializeTransaction = __esm({ + "node_modules/viem/_esm/utils/transaction/serializeTransaction.js"() { + "use strict"; + init_transaction(); + init_serializeAuthorizationList(); + init_blobsToCommitments(); + init_blobsToProofs(); + init_commitmentsToVersionedHashes(); + init_toBlobSidecars(); + init_concat(); + init_trim(); + init_toHex(); + init_toRlp(); + init_assertTransaction(); + init_getTransactionType(); + init_serializeAccessList(); + } +}); + +// node_modules/viem/_esm/utils/authorization/serializeAuthorizationList.js +function serializeAuthorizationList(authorizationList) { + if (!authorizationList || authorizationList.length === 0) + return []; + const serializedAuthorizationList = []; + for (const authorization of authorizationList) { + const { chainId, nonce, ...signature2 } = authorization; + const contractAddress = authorization.address; + serializedAuthorizationList.push([ + chainId ? toHex(chainId) : "0x", + contractAddress, + nonce ? toHex(nonce) : "0x", + ...toYParitySignatureArray({}, signature2) + ]); + } + return serializedAuthorizationList; +} +var init_serializeAuthorizationList = __esm({ + "node_modules/viem/_esm/utils/authorization/serializeAuthorizationList.js"() { + "use strict"; + init_toHex(); + init_serializeTransaction(); + } +}); + +// node_modules/viem/_esm/utils/authorization/verifyAuthorization.js +async function verifyAuthorization({ address: address2, authorization, signature: signature2 }) { + return isAddressEqual(getAddress(address2), await recoverAuthorizationAddress({ + authorization, + signature: signature2 + })); +} +var init_verifyAuthorization = __esm({ + "node_modules/viem/_esm/utils/authorization/verifyAuthorization.js"() { + "use strict"; + init_getAddress(); + init_isAddressEqual(); + init_recoverAuthorizationAddress(); + } +}); + +// node_modules/viem/_esm/utils/promise/withDedupe.js +function withDedupe(fn, { enabled = true, id }) { + if (!enabled || !id) + return fn(); + if (promiseCache2.get(id)) + return promiseCache2.get(id); + const promise = fn().finally(() => promiseCache2.delete(id)); + promiseCache2.set(id, promise); + return promise; +} +var promiseCache2; +var init_withDedupe = __esm({ + "node_modules/viem/_esm/utils/promise/withDedupe.js"() { + "use strict"; + init_lru(); + promiseCache2 = /* @__PURE__ */ new LruMap(8192); + } +}); + +// node_modules/viem/_esm/utils/buildRequest.js +function buildRequest(request, options = {}) { + return async (args, overrideOptions = {}) => { + const { dedupe = false, methods, retryDelay = 150, retryCount = 3, uid: uid2 } = { + ...options, + ...overrideOptions + }; + const { method } = args; + if (methods?.exclude?.includes(method)) + throw new MethodNotSupportedRpcError(new Error("method not supported"), { + method + }); + if (methods?.include && !methods.include.includes(method)) + throw new MethodNotSupportedRpcError(new Error("method not supported"), { + method + }); + const requestId = dedupe ? stringToHex(`${uid2}.${stringify(args)}`) : void 0; + return withDedupe(() => withRetry(async () => { + try { + return await request(args); + } catch (err_) { + const err = err_; + switch (err.code) { + // -32700 + case ParseRpcError.code: + throw new ParseRpcError(err); + // -32600 + case InvalidRequestRpcError.code: + throw new InvalidRequestRpcError(err); + // -32601 + case MethodNotFoundRpcError.code: + throw new MethodNotFoundRpcError(err, { method: args.method }); + // -32602 + case InvalidParamsRpcError.code: + throw new InvalidParamsRpcError(err); + // -32603 + case InternalRpcError.code: + throw new InternalRpcError(err); + // -32000 + case InvalidInputRpcError.code: + throw new InvalidInputRpcError(err); + // -32001 + case ResourceNotFoundRpcError.code: + throw new ResourceNotFoundRpcError(err); + // -32002 + case ResourceUnavailableRpcError.code: + throw new ResourceUnavailableRpcError(err); + // -32003 + case TransactionRejectedRpcError.code: + throw new TransactionRejectedRpcError(err); + // -32004 + case MethodNotSupportedRpcError.code: + throw new MethodNotSupportedRpcError(err, { + method: args.method + }); + // -32005 + case LimitExceededRpcError.code: + throw new LimitExceededRpcError(err); + // -32006 + case JsonRpcVersionUnsupportedError.code: + throw new JsonRpcVersionUnsupportedError(err); + // 4001 + case UserRejectedRequestError.code: + throw new UserRejectedRequestError(err); + // 4100 + case UnauthorizedProviderError.code: + throw new UnauthorizedProviderError(err); + // 4200 + case UnsupportedProviderMethodError.code: + throw new UnsupportedProviderMethodError(err); + // 4900 + case ProviderDisconnectedError.code: + throw new ProviderDisconnectedError(err); + // 4901 + case ChainDisconnectedError.code: + throw new ChainDisconnectedError(err); + // 4902 + case SwitchChainError.code: + throw new SwitchChainError(err); + // 5700 + case UnsupportedNonOptionalCapabilityError.code: + throw new UnsupportedNonOptionalCapabilityError(err); + // 5710 + case UnsupportedChainIdError.code: + throw new UnsupportedChainIdError(err); + // 5720 + case DuplicateIdError.code: + throw new DuplicateIdError(err); + // 5730 + case UnknownBundleIdError.code: + throw new UnknownBundleIdError(err); + // 5740 + case BundleTooLargeError.code: + throw new BundleTooLargeError(err); + // 5750 + case AtomicReadyWalletRejectedUpgradeError.code: + throw new AtomicReadyWalletRejectedUpgradeError(err); + // 5760 + case AtomicityNotSupportedError.code: + throw new AtomicityNotSupportedError(err); + // CAIP-25: User Rejected Error + // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes#rejected-caip-25 + case 5e3: + throw new UserRejectedRequestError(err); + // WalletConnect: Session Settlement Failed + // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes + case WalletConnectSessionSettlementError.code: + throw new WalletConnectSessionSettlementError(err); + default: + if (err_ instanceof BaseError2) + throw err_; + throw new UnknownRpcError(err); + } + } + }, { + delay: ({ count, error }) => { + if (error && error instanceof HttpRequestError) { + const retryAfter = error?.headers?.get("Retry-After"); + if (retryAfter?.match(/\d/)) + return Number.parseInt(retryAfter, 10) * 1e3; + } + return ~~(1 << count) * retryDelay; + }, + retryCount, + shouldRetry: ({ error }) => shouldRetry(error) + }), { enabled: dedupe, id: requestId }); + }; +} +function shouldRetry(error) { + if ("code" in error && typeof error.code === "number") { + if (error.code === -1) + return true; + if (error.code === LimitExceededRpcError.code) + return true; + if (error.code === InternalRpcError.code) + return true; + return false; + } + if (error instanceof HttpRequestError && error.status) { + if (error.status === 403) + return true; + if (error.status === 408) + return true; + if (error.status === 413) + return true; + if (error.status === 429) + return true; + if (error.status === 500) + return true; + if (error.status === 502) + return true; + if (error.status === 503) + return true; + if (error.status === 504) + return true; + return false; + } + return true; +} +var init_buildRequest = __esm({ + "node_modules/viem/_esm/utils/buildRequest.js"() { + "use strict"; + init_base(); + init_request(); + init_rpc(); + init_toHex(); + init_withDedupe(); + init_withRetry(); + init_stringify(); + } +}); + +// node_modules/viem/_esm/utils/chain/defineChain.js +function defineChain(chain3) { + const chainInstance = { + formatters: void 0, + fees: void 0, + serializers: void 0, + ...chain3 + }; + function extend(base2) { + return (fnOrExtended) => { + const properties = typeof fnOrExtended === "function" ? fnOrExtended(base2) : fnOrExtended; + const combined = { ...base2, ...properties }; + return Object.assign(combined, { extend: extend(combined) }); + }; + } + return Object.assign(chainInstance, { + extend: extend(chainInstance) + }); +} +var init_defineChain = __esm({ + "node_modules/viem/_esm/utils/chain/defineChain.js"() { + "use strict"; + } +}); + +// node_modules/viem/_esm/utils/promise/withTimeout.js +function withTimeout(fn, { errorInstance = new Error("timed out"), timeout, signal }) { + return new Promise((resolve, reject) => { + ; + (async () => { + let timeoutId; + try { + const controller = new AbortController(); + if (timeout > 0) { + timeoutId = setTimeout(() => { + if (signal) { + controller.abort(); + } else { + reject(errorInstance); + } + }, timeout); + } + resolve(await fn({ signal: controller?.signal || null })); + } catch (err) { + if (err?.name === "AbortError") + reject(errorInstance); + reject(err); + } finally { + clearTimeout(timeoutId); + } + })(); + }); +} +var init_withTimeout = __esm({ + "node_modules/viem/_esm/utils/promise/withTimeout.js"() { + "use strict"; + } +}); + +// node_modules/viem/_esm/utils/rpc/id.js +function createIdStore() { + return { + current: 0, + take() { + return this.current++; + }, + reset() { + this.current = 0; + } + }; +} +var idCache; +var init_id = __esm({ + "node_modules/viem/_esm/utils/rpc/id.js"() { + "use strict"; + idCache = /* @__PURE__ */ createIdStore(); + } +}); + +// node_modules/viem/_esm/utils/rpc/http.js +function getHttpRpcClient(url_, options = {}) { + const { url, headers: headers_url } = parseUrl(url_); + return { + async request(params) { + const { body, fetchFn = options.fetchFn ?? fetch, onRequest = options.onRequest, onResponse = options.onResponse, timeout = options.timeout ?? 1e4 } = params; + const fetchOptions = { + ...options.fetchOptions ?? {}, + ...params.fetchOptions ?? {} + }; + const { headers, method, signal: signal_ } = fetchOptions; + try { + const response = await withTimeout(async ({ signal }) => { + const init = { + ...fetchOptions, + body: Array.isArray(body) ? stringify(body.map((body2) => ({ + jsonrpc: "2.0", + id: body2.id ?? idCache.take(), + ...body2 + }))) : stringify({ + jsonrpc: "2.0", + id: body.id ?? idCache.take(), + ...body + }), + headers: { + ...headers_url, + "Content-Type": "application/json", + ...headers + }, + method: method || "POST", + signal: signal_ || (timeout > 0 ? signal : null) + }; + const request = new Request(url, init); + const args = await onRequest?.(request, init) ?? { ...init, url }; + const response2 = await fetchFn(args.url ?? url, args); + return response2; + }, { + errorInstance: new TimeoutError({ body, url }), + timeout, + signal: true + }); + if (onResponse) + await onResponse(response); + let data; + if (response.headers.get("Content-Type")?.startsWith("application/json")) + data = await response.json(); + else { + data = await response.text(); + try { + data = JSON.parse(data || "{}"); + } catch (err) { + if (response.ok) + throw err; + data = { error: data }; + } + } + if (!response.ok) { + if (typeof data.error?.code === "number" && typeof data.error?.message === "string") + return data; + throw new HttpRequestError({ + body, + details: stringify(data.error) || response.statusText, + headers: response.headers, + status: response.status, + url + }); + } + return data; + } catch (err) { + if (err instanceof HttpRequestError) + throw err; + if (err instanceof TimeoutError) + throw err; + throw new HttpRequestError({ + body, + cause: err, + url + }); + } + } + }; +} +function parseUrl(url_) { + try { + const url = new URL(url_); + const result = (() => { + if (url.username) { + const credentials = `${decodeURIComponent(url.username)}:${decodeURIComponent(url.password)}`; + url.username = ""; + url.password = ""; + return { + url: url.toString(), + headers: { Authorization: `Basic ${btoa(credentials)}` } + }; + } + return; + })(); + return { url: url.toString(), ...result }; + } catch { + return { url: url_ }; + } +} +var init_http = __esm({ + "node_modules/viem/_esm/utils/rpc/http.js"() { + "use strict"; + init_request(); + init_withTimeout(); + init_stringify(); + init_id(); + } +}); + +// node_modules/viem/_esm/constants/strings.js +var presignMessagePrefix; +var init_strings = __esm({ + "node_modules/viem/_esm/constants/strings.js"() { + "use strict"; + presignMessagePrefix = "Ethereum Signed Message:\n"; + } +}); + +// node_modules/viem/_esm/utils/signature/toPrefixedMessage.js +function toPrefixedMessage(message_) { + const message = (() => { + if (typeof message_ === "string") + return stringToHex(message_); + if (typeof message_.raw === "string") + return message_.raw; + return bytesToHex(message_.raw); + })(); + const prefix = stringToHex(`${presignMessagePrefix}${size(message)}`); + return concat([prefix, message]); +} +var init_toPrefixedMessage = __esm({ + "node_modules/viem/_esm/utils/signature/toPrefixedMessage.js"() { + "use strict"; + init_strings(); + init_concat(); + init_size(); + init_toHex(); + } +}); + +// node_modules/viem/_esm/utils/signature/hashMessage.js +function hashMessage(message, to_) { + return keccak256(toPrefixedMessage(message), to_); +} +var init_hashMessage = __esm({ + "node_modules/viem/_esm/utils/signature/hashMessage.js"() { + "use strict"; + init_keccak256(); + init_toPrefixedMessage(); + } +}); + +// node_modules/viem/_esm/errors/typedData.js +var InvalidDomainError, InvalidPrimaryTypeError, InvalidStructTypeError; +var init_typedData = __esm({ + "node_modules/viem/_esm/errors/typedData.js"() { + "use strict"; + init_stringify(); + init_base(); + InvalidDomainError = class extends BaseError2 { + constructor({ domain }) { + super(`Invalid domain "${stringify(domain)}".`, { + metaMessages: ["Must be a valid EIP-712 domain."] + }); + } + }; + InvalidPrimaryTypeError = class extends BaseError2 { + constructor({ primaryType, types }) { + super(`Invalid primary type \`${primaryType}\` must be one of \`${JSON.stringify(Object.keys(types))}\`.`, { + docsPath: "/api/glossary/Errors#typeddatainvalidprimarytypeerror", + metaMessages: ["Check that the primary type is a key in `types`."] + }); + } + }; + InvalidStructTypeError = class extends BaseError2 { + constructor({ type }) { + super(`Struct type "${type}" is invalid.`, { + metaMessages: ["Struct type must not be a Solidity type."], + name: "InvalidStructTypeError" + }); + } + }; + } +}); + +// node_modules/viem/_esm/utils/typedData.js +function validateTypedData(parameters) { + const { domain, message, primaryType, types } = parameters; + const validateData = (struct, data) => { + for (const param of struct) { + const { name, type } = param; + const value = data[name]; + const integerMatch = type.match(integerRegex2); + if (integerMatch && (typeof value === "number" || typeof value === "bigint")) { + const [_type, base2, size_] = integerMatch; + numberToHex(value, { + signed: base2 === "int", + size: Number.parseInt(size_, 10) / 8 + }); + } + if (type === "address" && typeof value === "string" && !isAddress(value)) + throw new InvalidAddressError({ address: value }); + const bytesMatch = type.match(bytesRegex2); + if (bytesMatch) { + const [_type, size_] = bytesMatch; + if (size_ && size(value) !== Number.parseInt(size_, 10)) + throw new BytesSizeMismatchError({ + expectedSize: Number.parseInt(size_, 10), + givenSize: size(value) + }); + } + const struct2 = types[type]; + if (struct2) { + validateReference(type); + validateData(struct2, value); + } + } + }; + if (types.EIP712Domain && domain) { + if (typeof domain !== "object") + throw new InvalidDomainError({ domain }); + validateData(types.EIP712Domain, domain); + } + if (primaryType !== "EIP712Domain") { + if (types[primaryType]) + validateData(types[primaryType], message); + else + throw new InvalidPrimaryTypeError({ primaryType, types }); + } +} +function getTypesForEIP712Domain({ domain }) { + return [ + typeof domain?.name === "string" && { name: "name", type: "string" }, + domain?.version && { name: "version", type: "string" }, + (typeof domain?.chainId === "number" || typeof domain?.chainId === "bigint") && { + name: "chainId", + type: "uint256" + }, + domain?.verifyingContract && { + name: "verifyingContract", + type: "address" + }, + domain?.salt && { name: "salt", type: "bytes32" } + ].filter(Boolean); +} +function validateReference(type) { + if (type === "address" || type === "bool" || type === "string" || type.startsWith("bytes") || type.startsWith("uint") || type.startsWith("int")) + throw new InvalidStructTypeError({ type }); +} +var init_typedData2 = __esm({ + "node_modules/viem/_esm/utils/typedData.js"() { + "use strict"; + init_abi(); + init_address(); + init_typedData(); + init_isAddress(); + init_size(); + init_toHex(); + init_regex2(); + } +}); + +// node_modules/viem/_esm/utils/signature/hashTypedData.js +function hashTypedData(parameters) { + const { domain = {}, message, primaryType } = parameters; + const types = { + EIP712Domain: getTypesForEIP712Domain({ domain }), + ...parameters.types + }; + validateTypedData({ + domain, + message, + primaryType, + types + }); + const parts = ["0x1901"]; + if (domain) + parts.push(hashDomain({ + domain, + types + })); + if (primaryType !== "EIP712Domain") + parts.push(hashStruct({ + data: message, + primaryType, + types + })); + return keccak256(concat(parts)); +} +function hashDomain({ domain, types }) { + return hashStruct({ + data: domain, + primaryType: "EIP712Domain", + types + }); +} +function hashStruct({ data, primaryType, types }) { + const encoded = encodeData({ + data, + primaryType, + types + }); + return keccak256(encoded); +} +function encodeData({ data, primaryType, types }) { + const encodedTypes = [{ type: "bytes32" }]; + const encodedValues = [hashType({ primaryType, types })]; + for (const field of types[primaryType]) { + const [type, value] = encodeField({ + types, + name: field.name, + type: field.type, + value: data[field.name] + }); + encodedTypes.push(type); + encodedValues.push(value); + } + return encodeAbiParameters(encodedTypes, encodedValues); +} +function hashType({ primaryType, types }) { + const encodedHashType = toHex(encodeType({ primaryType, types })); + return keccak256(encodedHashType); +} +function encodeType({ primaryType, types }) { + let result = ""; + const unsortedDeps = findTypeDependencies({ primaryType, types }); + unsortedDeps.delete(primaryType); + const deps = [primaryType, ...Array.from(unsortedDeps).sort()]; + for (const type of deps) { + result += `${type}(${types[type].map(({ name, type: t }) => `${t} ${name}`).join(",")})`; + } + return result; +} +function findTypeDependencies({ primaryType: primaryType_, types }, results = /* @__PURE__ */ new Set()) { + const match = primaryType_.match(/^\w*/u); + const primaryType = match?.[0]; + if (results.has(primaryType) || types[primaryType] === void 0) { + return results; + } + results.add(primaryType); + for (const field of types[primaryType]) { + findTypeDependencies({ primaryType: field.type, types }, results); + } + return results; +} +function encodeField({ types, name, type, value }) { + if (types[type] !== void 0) { + return [ + { type: "bytes32" }, + keccak256(encodeData({ data: value, primaryType: type, types })) + ]; + } + if (type === "bytes") + return [{ type: "bytes32" }, keccak256(value)]; + if (type === "string") + return [{ type: "bytes32" }, keccak256(toHex(value))]; + if (type.lastIndexOf("]") === type.length - 1) { + const parsedType = type.slice(0, type.lastIndexOf("[")); + const typeValuePairs = value.map((item) => encodeField({ + name, + type: parsedType, + types, + value: item + })); + return [ + { type: "bytes32" }, + keccak256(encodeAbiParameters(typeValuePairs.map(([t]) => t), typeValuePairs.map(([, v]) => v))) + ]; + } + return [{ type }, value]; +} +var init_hashTypedData = __esm({ + "node_modules/viem/_esm/utils/signature/hashTypedData.js"() { + "use strict"; + init_encodeAbiParameters(); + init_concat(); + init_toHex(); + init_keccak256(); + init_typedData2(); + } +}); + +// node_modules/ox/_esm/core/internal/lru.js +var LruMap2; +var init_lru2 = __esm({ + "node_modules/ox/_esm/core/internal/lru.js"() { + "use strict"; + LruMap2 = class extends Map { + constructor(size5) { + super(); + Object.defineProperty(this, "maxSize", { + enumerable: true, + configurable: true, + writable: true, + value: void 0 + }); + this.maxSize = size5; + } + get(key) { + const value = super.get(key); + if (super.has(key) && value !== void 0) { + this.delete(key); + super.set(key, value); + } + return value; + } + set(key, value) { + super.set(key, value); + if (this.maxSize && this.size > this.maxSize) { + const firstKey = this.keys().next().value; + if (firstKey) + this.delete(firstKey); + } + return this; + } + }; + } +}); + +// node_modules/ox/_esm/core/Caches.js +var caches, checksum; +var init_Caches = __esm({ + "node_modules/ox/_esm/core/Caches.js"() { + "use strict"; + init_lru2(); + caches = { + checksum: /* @__PURE__ */ new LruMap2(8192) + }; + checksum = caches.checksum; + } +}); + +// node_modules/ox/_esm/core/Hash.js +function keccak2562(value, options = {}) { + const { as = typeof value === "string" ? "Hex" : "Bytes" } = options; + const bytes = keccak_256(from(value)); + if (as === "Bytes") + return bytes; + return fromBytes(bytes); +} +var init_Hash = __esm({ + "node_modules/ox/_esm/core/Hash.js"() { + "use strict"; + init_sha3(); + init_Bytes(); + init_Hex(); + } +}); + +// node_modules/ox/_esm/core/PublicKey.js +function assert3(publicKey, options = {}) { + const { compressed } = options; + const { prefix, x, y } = publicKey; + if (compressed === false || typeof x === "bigint" && typeof y === "bigint") { + if (prefix !== 4) + throw new InvalidPrefixError({ + prefix, + cause: new InvalidUncompressedPrefixError() + }); + return; + } + if (compressed === true || typeof x === "bigint" && typeof y === "undefined") { + if (prefix !== 3 && prefix !== 2) + throw new InvalidPrefixError({ + prefix, + cause: new InvalidCompressedPrefixError() + }); + return; + } + throw new InvalidError({ publicKey }); +} +function from3(value) { + const publicKey = (() => { + if (validate2(value)) + return fromHex2(value); + if (validate(value)) + return fromBytes2(value); + const { prefix, x, y } = value; + if (typeof x === "bigint" && typeof y === "bigint") + return { prefix: prefix ?? 4, x, y }; + return { prefix, x }; + })(); + assert3(publicKey); + return publicKey; +} +function fromBytes2(publicKey) { + return fromHex2(fromBytes(publicKey)); +} +function fromHex2(publicKey) { + if (publicKey.length !== 132 && publicKey.length !== 130 && publicKey.length !== 68) + throw new InvalidSerializedSizeError({ publicKey }); + if (publicKey.length === 130) { + const x2 = BigInt(slice3(publicKey, 0, 32)); + const y = BigInt(slice3(publicKey, 32, 64)); + return { + prefix: 4, + x: x2, + y + }; + } + if (publicKey.length === 132) { + const prefix2 = Number(slice3(publicKey, 0, 1)); + const x2 = BigInt(slice3(publicKey, 1, 33)); + const y = BigInt(slice3(publicKey, 33, 65)); + return { + prefix: prefix2, + x: x2, + y + }; + } + const prefix = Number(slice3(publicKey, 0, 1)); + const x = BigInt(slice3(publicKey, 1, 33)); + return { + prefix, + x + }; +} +function toHex2(publicKey, options = {}) { + assert3(publicKey); + const { prefix, x, y } = publicKey; + const { includePrefix = true } = options; + const publicKey_ = concat2( + includePrefix ? fromNumber(prefix, { size: 1 }) : "0x", + fromNumber(x, { size: 32 }), + // If the public key is not compressed, add the y coordinate. + typeof y === "bigint" ? fromNumber(y, { size: 32 }) : "0x" + ); + return publicKey_; +} +var InvalidError, InvalidPrefixError, InvalidCompressedPrefixError, InvalidUncompressedPrefixError, InvalidSerializedSizeError; +var init_PublicKey = __esm({ + "node_modules/ox/_esm/core/PublicKey.js"() { + "use strict"; + init_Bytes(); + init_Errors(); + init_Hex(); + init_Json(); + InvalidError = class extends BaseError3 { + constructor({ publicKey }) { + super(`Value \`${stringify2(publicKey)}\` is not a valid public key.`, { + metaMessages: [ + "Public key must contain:", + "- an `x` and `prefix` value (compressed)", + "- an `x`, `y`, and `prefix` value (uncompressed)" + ] + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "PublicKey.InvalidError" + }); + } + }; + InvalidPrefixError = class extends BaseError3 { + constructor({ prefix, cause }) { + super(`Prefix "${prefix}" is invalid.`, { + cause + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "PublicKey.InvalidPrefixError" + }); + } + }; + InvalidCompressedPrefixError = class extends BaseError3 { + constructor() { + super("Prefix must be 2 or 3 for compressed public keys."); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "PublicKey.InvalidCompressedPrefixError" + }); + } + }; + InvalidUncompressedPrefixError = class extends BaseError3 { + constructor() { + super("Prefix must be 4 for uncompressed public keys."); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "PublicKey.InvalidUncompressedPrefixError" + }); + } + }; + InvalidSerializedSizeError = class extends BaseError3 { + constructor({ publicKey }) { + super(`Value \`${publicKey}\` is an invalid public key size.`, { + metaMessages: [ + "Expected: 33 bytes (compressed + prefix), 64 bytes (uncompressed) or 65 bytes (uncompressed + prefix).", + `Received ${size3(from2(publicKey))} bytes.` + ] + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "PublicKey.InvalidSerializedSizeError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/core/Address.js +function assert4(value, options = {}) { + const { strict = true } = options; + if (!addressRegex2.test(value)) + throw new InvalidAddressError2({ + address: value, + cause: new InvalidInputError() + }); + if (strict) { + if (value.toLowerCase() === value) + return; + if (checksum2(value) !== value) + throw new InvalidAddressError2({ + address: value, + cause: new InvalidChecksumError() + }); + } +} +function checksum2(address2) { + if (checksum.has(address2)) + return checksum.get(address2); + assert4(address2, { strict: false }); + const hexAddress = address2.substring(2).toLowerCase(); + const hash3 = keccak2562(fromString(hexAddress), { as: "Bytes" }); + const characters = hexAddress.split(""); + for (let i = 0; i < 40; i += 2) { + if (hash3[i >> 1] >> 4 >= 8 && characters[i]) { + characters[i] = characters[i].toUpperCase(); + } + if ((hash3[i >> 1] & 15) >= 8 && characters[i + 1]) { + characters[i + 1] = characters[i + 1].toUpperCase(); + } + } + const result = `0x${characters.join("")}`; + checksum.set(address2, result); + return result; +} +function from4(address2, options = {}) { + const { checksum: checksumVal = false } = options; + assert4(address2); + if (checksumVal) + return checksum2(address2); + return address2; +} +function fromPublicKey(publicKey, options = {}) { + const address2 = keccak2562(`0x${toHex2(publicKey).slice(4)}`).substring(26); + return from4(`0x${address2}`, options); +} +function validate3(address2, options = {}) { + const { strict = true } = options ?? {}; + try { + assert4(address2, { strict }); + return true; + } catch { + return false; + } +} +var addressRegex2, InvalidAddressError2, InvalidInputError, InvalidChecksumError; +var init_Address = __esm({ + "node_modules/ox/_esm/core/Address.js"() { + "use strict"; + init_Bytes(); + init_Caches(); + init_Errors(); + init_Hash(); + init_PublicKey(); + addressRegex2 = /^0x[a-fA-F0-9]{40}$/; + InvalidAddressError2 = class extends BaseError3 { + constructor({ address: address2, cause }) { + super(`Address "${address2}" is invalid.`, { + cause + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Address.InvalidAddressError" + }); + } + }; + InvalidInputError = class extends BaseError3 { + constructor() { + super("Address is not a 20 byte (40 hexadecimal character) value."); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Address.InvalidInputError" + }); + } + }; + InvalidChecksumError = class extends BaseError3 { + constructor() { + super("Address does not match its checksum counterpart."); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Address.InvalidChecksumError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/core/Solidity.js +var arrayRegex, bytesRegex3, integerRegex3, maxInt82, maxInt162, maxInt242, maxInt322, maxInt402, maxInt482, maxInt562, maxInt642, maxInt722, maxInt802, maxInt882, maxInt962, maxInt1042, maxInt1122, maxInt1202, maxInt1282, maxInt1362, maxInt1442, maxInt1522, maxInt1602, maxInt1682, maxInt1762, maxInt1842, maxInt1922, maxInt2002, maxInt2082, maxInt2162, maxInt2242, maxInt2322, maxInt2402, maxInt2482, maxInt2562, minInt82, minInt162, minInt242, minInt322, minInt402, minInt482, minInt562, minInt642, minInt722, minInt802, minInt882, minInt962, minInt1042, minInt1122, minInt1202, minInt1282, minInt1362, minInt1442, minInt1522, minInt1602, minInt1682, minInt1762, minInt1842, minInt1922, minInt2002, minInt2082, minInt2162, minInt2242, minInt2322, minInt2402, minInt2482, minInt2562, maxUint82, maxUint162, maxUint242, maxUint322, maxUint402, maxUint482, maxUint562, maxUint642, maxUint722, maxUint802, maxUint882, maxUint962, maxUint1042, maxUint1122, maxUint1202, maxUint1282, maxUint1362, maxUint1442, maxUint1522, maxUint1602, maxUint1682, maxUint1762, maxUint1842, maxUint1922, maxUint2002, maxUint2082, maxUint2162, maxUint2242, maxUint2322, maxUint2402, maxUint2482, maxUint2562; +var init_Solidity = __esm({ + "node_modules/ox/_esm/core/Solidity.js"() { + "use strict"; + arrayRegex = /^(.*)\[([0-9]*)\]$/; + bytesRegex3 = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/; + integerRegex3 = /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/; + maxInt82 = 2n ** (8n - 1n) - 1n; + maxInt162 = 2n ** (16n - 1n) - 1n; + maxInt242 = 2n ** (24n - 1n) - 1n; + maxInt322 = 2n ** (32n - 1n) - 1n; + maxInt402 = 2n ** (40n - 1n) - 1n; + maxInt482 = 2n ** (48n - 1n) - 1n; + maxInt562 = 2n ** (56n - 1n) - 1n; + maxInt642 = 2n ** (64n - 1n) - 1n; + maxInt722 = 2n ** (72n - 1n) - 1n; + maxInt802 = 2n ** (80n - 1n) - 1n; + maxInt882 = 2n ** (88n - 1n) - 1n; + maxInt962 = 2n ** (96n - 1n) - 1n; + maxInt1042 = 2n ** (104n - 1n) - 1n; + maxInt1122 = 2n ** (112n - 1n) - 1n; + maxInt1202 = 2n ** (120n - 1n) - 1n; + maxInt1282 = 2n ** (128n - 1n) - 1n; + maxInt1362 = 2n ** (136n - 1n) - 1n; + maxInt1442 = 2n ** (144n - 1n) - 1n; + maxInt1522 = 2n ** (152n - 1n) - 1n; + maxInt1602 = 2n ** (160n - 1n) - 1n; + maxInt1682 = 2n ** (168n - 1n) - 1n; + maxInt1762 = 2n ** (176n - 1n) - 1n; + maxInt1842 = 2n ** (184n - 1n) - 1n; + maxInt1922 = 2n ** (192n - 1n) - 1n; + maxInt2002 = 2n ** (200n - 1n) - 1n; + maxInt2082 = 2n ** (208n - 1n) - 1n; + maxInt2162 = 2n ** (216n - 1n) - 1n; + maxInt2242 = 2n ** (224n - 1n) - 1n; + maxInt2322 = 2n ** (232n - 1n) - 1n; + maxInt2402 = 2n ** (240n - 1n) - 1n; + maxInt2482 = 2n ** (248n - 1n) - 1n; + maxInt2562 = 2n ** (256n - 1n) - 1n; + minInt82 = -(2n ** (8n - 1n)); + minInt162 = -(2n ** (16n - 1n)); + minInt242 = -(2n ** (24n - 1n)); + minInt322 = -(2n ** (32n - 1n)); + minInt402 = -(2n ** (40n - 1n)); + minInt482 = -(2n ** (48n - 1n)); + minInt562 = -(2n ** (56n - 1n)); + minInt642 = -(2n ** (64n - 1n)); + minInt722 = -(2n ** (72n - 1n)); + minInt802 = -(2n ** (80n - 1n)); + minInt882 = -(2n ** (88n - 1n)); + minInt962 = -(2n ** (96n - 1n)); + minInt1042 = -(2n ** (104n - 1n)); + minInt1122 = -(2n ** (112n - 1n)); + minInt1202 = -(2n ** (120n - 1n)); + minInt1282 = -(2n ** (128n - 1n)); + minInt1362 = -(2n ** (136n - 1n)); + minInt1442 = -(2n ** (144n - 1n)); + minInt1522 = -(2n ** (152n - 1n)); + minInt1602 = -(2n ** (160n - 1n)); + minInt1682 = -(2n ** (168n - 1n)); + minInt1762 = -(2n ** (176n - 1n)); + minInt1842 = -(2n ** (184n - 1n)); + minInt1922 = -(2n ** (192n - 1n)); + minInt2002 = -(2n ** (200n - 1n)); + minInt2082 = -(2n ** (208n - 1n)); + minInt2162 = -(2n ** (216n - 1n)); + minInt2242 = -(2n ** (224n - 1n)); + minInt2322 = -(2n ** (232n - 1n)); + minInt2402 = -(2n ** (240n - 1n)); + minInt2482 = -(2n ** (248n - 1n)); + minInt2562 = -(2n ** (256n - 1n)); + maxUint82 = 2n ** 8n - 1n; + maxUint162 = 2n ** 16n - 1n; + maxUint242 = 2n ** 24n - 1n; + maxUint322 = 2n ** 32n - 1n; + maxUint402 = 2n ** 40n - 1n; + maxUint482 = 2n ** 48n - 1n; + maxUint562 = 2n ** 56n - 1n; + maxUint642 = 2n ** 64n - 1n; + maxUint722 = 2n ** 72n - 1n; + maxUint802 = 2n ** 80n - 1n; + maxUint882 = 2n ** 88n - 1n; + maxUint962 = 2n ** 96n - 1n; + maxUint1042 = 2n ** 104n - 1n; + maxUint1122 = 2n ** 112n - 1n; + maxUint1202 = 2n ** 120n - 1n; + maxUint1282 = 2n ** 128n - 1n; + maxUint1362 = 2n ** 136n - 1n; + maxUint1442 = 2n ** 144n - 1n; + maxUint1522 = 2n ** 152n - 1n; + maxUint1602 = 2n ** 160n - 1n; + maxUint1682 = 2n ** 168n - 1n; + maxUint1762 = 2n ** 176n - 1n; + maxUint1842 = 2n ** 184n - 1n; + maxUint1922 = 2n ** 192n - 1n; + maxUint2002 = 2n ** 200n - 1n; + maxUint2082 = 2n ** 208n - 1n; + maxUint2162 = 2n ** 216n - 1n; + maxUint2242 = 2n ** 224n - 1n; + maxUint2322 = 2n ** 232n - 1n; + maxUint2402 = 2n ** 240n - 1n; + maxUint2482 = 2n ** 248n - 1n; + maxUint2562 = 2n ** 256n - 1n; + } +}); + +// node_modules/ox/_esm/core/internal/abiParameters.js +function decodeParameter2(cursor, param, options) { + const { checksumAddress: checksumAddress2, staticPosition } = options; + const arrayComponents = getArrayComponents2(param.type); + if (arrayComponents) { + const [length, type] = arrayComponents; + return decodeArray2(cursor, { ...param, type }, { checksumAddress: checksumAddress2, length, staticPosition }); + } + if (param.type === "tuple") + return decodeTuple2(cursor, param, { + checksumAddress: checksumAddress2, + staticPosition + }); + if (param.type === "address") + return decodeAddress2(cursor, { checksum: checksumAddress2 }); + if (param.type === "bool") + return decodeBool2(cursor); + if (param.type.startsWith("bytes")) + return decodeBytes2(cursor, param, { staticPosition }); + if (param.type.startsWith("uint") || param.type.startsWith("int")) + return decodeNumber2(cursor, param); + if (param.type === "string") + return decodeString2(cursor, { staticPosition }); + throw new InvalidTypeError(param.type); +} +function decodeAddress2(cursor, options = {}) { + const { checksum: checksum5 = false } = options; + const value = cursor.readBytes(32); + const wrap3 = (address2) => checksum5 ? checksum2(address2) : address2; + return [wrap3(fromBytes(slice2(value, -20))), 32]; +} +function decodeArray2(cursor, param, options) { + const { checksumAddress: checksumAddress2, length, staticPosition } = options; + if (!length) { + const offset = toNumber2(cursor.readBytes(sizeOfOffset2)); + const start = staticPosition + offset; + const startOfData = start + sizeOfLength2; + cursor.setPosition(start); + const length2 = toNumber2(cursor.readBytes(sizeOfLength2)); + const dynamicChild = hasDynamicChild2(param); + let consumed2 = 0; + const value2 = []; + for (let i = 0; i < length2; ++i) { + cursor.setPosition(startOfData + (dynamicChild ? i * 32 : consumed2)); + const [data, consumed_] = decodeParameter2(cursor, param, { + checksumAddress: checksumAddress2, + staticPosition: startOfData + }); + consumed2 += consumed_; + value2.push(data); + } + cursor.setPosition(staticPosition + 32); + return [value2, 32]; + } + if (hasDynamicChild2(param)) { + const offset = toNumber2(cursor.readBytes(sizeOfOffset2)); + const start = staticPosition + offset; + const value2 = []; + for (let i = 0; i < length; ++i) { + cursor.setPosition(start + i * 32); + const [data] = decodeParameter2(cursor, param, { + checksumAddress: checksumAddress2, + staticPosition: start + }); + value2.push(data); + } + cursor.setPosition(staticPosition + 32); + return [value2, 32]; + } + let consumed = 0; + const value = []; + for (let i = 0; i < length; ++i) { + const [data, consumed_] = decodeParameter2(cursor, param, { + checksumAddress: checksumAddress2, + staticPosition: staticPosition + consumed + }); + consumed += consumed_; + value.push(data); + } + return [value, consumed]; +} +function decodeBool2(cursor) { + return [toBoolean(cursor.readBytes(32), { size: 32 }), 32]; +} +function decodeBytes2(cursor, param, { staticPosition }) { + const [_, size5] = param.type.split("bytes"); + if (!size5) { + const offset = toNumber2(cursor.readBytes(32)); + cursor.setPosition(staticPosition + offset); + const length = toNumber2(cursor.readBytes(32)); + if (length === 0) { + cursor.setPosition(staticPosition + 32); + return ["0x", 32]; + } + const data = cursor.readBytes(length); + cursor.setPosition(staticPosition + 32); + return [fromBytes(data), 32]; + } + const value = fromBytes(cursor.readBytes(Number.parseInt(size5, 10), 32)); + return [value, 32]; +} +function decodeNumber2(cursor, param) { + const signed = param.type.startsWith("int"); + const size5 = Number.parseInt(param.type.split("int")[1] || "256", 10); + const value = cursor.readBytes(32); + return [ + size5 > 48 ? toBigInt2(value, { signed }) : toNumber2(value, { signed }), + 32 + ]; +} +function decodeTuple2(cursor, param, options) { + const { checksumAddress: checksumAddress2, staticPosition } = options; + const hasUnnamedChild = param.components.length === 0 || param.components.some(({ name }) => !name); + const value = hasUnnamedChild ? [] : {}; + let consumed = 0; + if (hasDynamicChild2(param)) { + const offset = toNumber2(cursor.readBytes(sizeOfOffset2)); + const start = staticPosition + offset; + for (let i = 0; i < param.components.length; ++i) { + const component = param.components[i]; + cursor.setPosition(start + consumed); + const [data, consumed_] = decodeParameter2(cursor, component, { + checksumAddress: checksumAddress2, + staticPosition: start + }); + consumed += consumed_; + value[hasUnnamedChild ? i : component?.name] = data; + } + cursor.setPosition(staticPosition + 32); + return [value, 32]; + } + for (let i = 0; i < param.components.length; ++i) { + const component = param.components[i]; + const [data, consumed_] = decodeParameter2(cursor, component, { + checksumAddress: checksumAddress2, + staticPosition + }); + value[hasUnnamedChild ? i : component?.name] = data; + consumed += consumed_; + } + return [value, consumed]; +} +function decodeString2(cursor, { staticPosition }) { + const offset = toNumber2(cursor.readBytes(32)); + const start = staticPosition + offset; + cursor.setPosition(start); + const length = toNumber2(cursor.readBytes(32)); + if (length === 0) { + cursor.setPosition(staticPosition + 32); + return ["", 32]; + } + const data = cursor.readBytes(length, 32); + const value = toString(trimLeft(data)); + cursor.setPosition(staticPosition + 32); + return [value, 32]; +} +function prepareParameters({ checksumAddress: checksumAddress2, parameters, values }) { + const preparedParameters = []; + for (let i = 0; i < parameters.length; i++) { + preparedParameters.push(prepareParameter({ + checksumAddress: checksumAddress2, + parameter: parameters[i], + value: values[i] + })); + } + return preparedParameters; +} +function prepareParameter({ checksumAddress: checksumAddress2 = false, parameter: parameter_, value }) { + const parameter = parameter_; + const arrayComponents = getArrayComponents2(parameter.type); + if (arrayComponents) { + const [length, type] = arrayComponents; + return encodeArray2(value, { + checksumAddress: checksumAddress2, + length, + parameter: { + ...parameter, + type + } + }); + } + if (parameter.type === "tuple") { + return encodeTuple2(value, { + checksumAddress: checksumAddress2, + parameter + }); + } + if (parameter.type === "address") { + return encodeAddress2(value, { + checksum: checksumAddress2 + }); + } + if (parameter.type === "bool") { + return encodeBoolean(value); + } + if (parameter.type.startsWith("uint") || parameter.type.startsWith("int")) { + const signed = parameter.type.startsWith("int"); + const [, , size5 = "256"] = integerRegex3.exec(parameter.type) ?? []; + return encodeNumber2(value, { + signed, + size: Number(size5) + }); + } + if (parameter.type.startsWith("bytes")) { + return encodeBytes2(value, { type: parameter.type }); + } + if (parameter.type === "string") { + return encodeString2(value); + } + throw new InvalidTypeError(parameter.type); +} +function encode(preparedParameters) { + let staticSize = 0; + for (let i = 0; i < preparedParameters.length; i++) { + const { dynamic, encoded } = preparedParameters[i]; + if (dynamic) + staticSize += 32; + else + staticSize += size3(encoded); + } + const staticParameters = []; + const dynamicParameters = []; + let dynamicSize = 0; + for (let i = 0; i < preparedParameters.length; i++) { + const { dynamic, encoded } = preparedParameters[i]; + if (dynamic) { + staticParameters.push(fromNumber(staticSize + dynamicSize, { size: 32 })); + dynamicParameters.push(encoded); + dynamicSize += size3(encoded); + } else { + staticParameters.push(encoded); + } + } + return concat2(...staticParameters, ...dynamicParameters); +} +function encodeAddress2(value, options) { + const { checksum: checksum5 = false } = options; + assert4(value, { strict: checksum5 }); + return { + dynamic: false, + encoded: padLeft(value.toLowerCase()) + }; +} +function encodeArray2(value, options) { + const { checksumAddress: checksumAddress2, length, parameter } = options; + const dynamic = length === null; + if (!Array.isArray(value)) + throw new InvalidArrayError2(value); + if (!dynamic && value.length !== length) + throw new ArrayLengthMismatchError({ + expectedLength: length, + givenLength: value.length, + type: `${parameter.type}[${length}]` + }); + let dynamicChild = false; + const preparedParameters = []; + for (let i = 0; i < value.length; i++) { + const preparedParam = prepareParameter({ + checksumAddress: checksumAddress2, + parameter, + value: value[i] + }); + if (preparedParam.dynamic) + dynamicChild = true; + preparedParameters.push(preparedParam); + } + if (dynamic || dynamicChild) { + const data = encode(preparedParameters); + if (dynamic) { + const length2 = fromNumber(preparedParameters.length, { size: 32 }); + return { + dynamic: true, + encoded: preparedParameters.length > 0 ? concat2(length2, data) : length2 + }; + } + if (dynamicChild) + return { dynamic: true, encoded: data }; + } + return { + dynamic: false, + encoded: concat2(...preparedParameters.map(({ encoded }) => encoded)) + }; +} +function encodeBytes2(value, { type }) { + const [, parametersize] = type.split("bytes"); + const bytesSize = size3(value); + if (!parametersize) { + let value_ = value; + if (bytesSize % 32 !== 0) + value_ = padRight(value_, Math.ceil((value.length - 2) / 2 / 32) * 32); + return { + dynamic: true, + encoded: concat2(padLeft(fromNumber(bytesSize, { size: 32 })), value_) + }; + } + if (bytesSize !== Number.parseInt(parametersize, 10)) + throw new BytesSizeMismatchError2({ + expectedSize: Number.parseInt(parametersize, 10), + value + }); + return { dynamic: false, encoded: padRight(value) }; +} +function encodeBoolean(value) { + if (typeof value !== "boolean") + throw new BaseError3(`Invalid boolean value: "${value}" (type: ${typeof value}). Expected: \`true\` or \`false\`.`); + return { dynamic: false, encoded: padLeft(fromBoolean(value)) }; +} +function encodeNumber2(value, { signed, size: size5 }) { + if (typeof size5 === "number") { + const max = 2n ** (BigInt(size5) - (signed ? 1n : 0n)) - 1n; + const min = signed ? -max - 1n : 0n; + if (value > max || value < min) + throw new IntegerOutOfRangeError2({ + max: max.toString(), + min: min.toString(), + signed, + size: size5 / 8, + value: value.toString() + }); + } + return { + dynamic: false, + encoded: fromNumber(value, { + size: 32, + signed + }) + }; +} +function encodeString2(value) { + const hexValue = fromString2(value); + const partsLength = Math.ceil(size3(hexValue) / 32); + const parts = []; + for (let i = 0; i < partsLength; i++) { + parts.push(padRight(slice3(hexValue, i * 32, (i + 1) * 32))); + } + return { + dynamic: true, + encoded: concat2(padRight(fromNumber(size3(hexValue), { size: 32 })), ...parts) + }; +} +function encodeTuple2(value, options) { + const { checksumAddress: checksumAddress2, parameter } = options; + let dynamic = false; + const preparedParameters = []; + for (let i = 0; i < parameter.components.length; i++) { + const param_ = parameter.components[i]; + const index2 = Array.isArray(value) ? i : param_.name; + const preparedParam = prepareParameter({ + checksumAddress: checksumAddress2, + parameter: param_, + value: value[index2] + }); + preparedParameters.push(preparedParam); + if (preparedParam.dynamic) + dynamic = true; + } + return { + dynamic, + encoded: dynamic ? encode(preparedParameters) : concat2(...preparedParameters.map(({ encoded }) => encoded)) + }; +} +function getArrayComponents2(type) { + const matches = type.match(/^(.*)\[(\d+)?\]$/); + return matches ? ( + // Return `null` if the array is dynamic. + [matches[2] ? Number(matches[2]) : null, matches[1]] + ) : void 0; +} +function hasDynamicChild2(param) { + const { type } = param; + if (type === "string") + return true; + if (type === "bytes") + return true; + if (type.endsWith("[]")) + return true; + if (type === "tuple") + return param.components?.some(hasDynamicChild2); + const arrayComponents = getArrayComponents2(param.type); + if (arrayComponents && hasDynamicChild2({ + ...param, + type: arrayComponents[1] + })) + return true; + return false; +} +var sizeOfLength2, sizeOfOffset2; +var init_abiParameters = __esm({ + "node_modules/ox/_esm/core/internal/abiParameters.js"() { + "use strict"; + init_AbiParameters(); + init_Address(); + init_Bytes(); + init_Errors(); + init_Hex(); + init_Solidity(); + sizeOfLength2 = 32; + sizeOfOffset2 = 32; + } +}); + +// node_modules/ox/_esm/core/internal/cursor.js +function create(bytes, { recursiveReadLimit = 8192 } = {}) { + const cursor = Object.create(staticCursor2); + cursor.bytes = bytes; + cursor.dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + cursor.positionReadCount = /* @__PURE__ */ new Map(); + cursor.recursiveReadLimit = recursiveReadLimit; + return cursor; +} +var staticCursor2, NegativeOffsetError2, PositionOutOfBoundsError2, RecursiveReadLimitExceededError2; +var init_cursor3 = __esm({ + "node_modules/ox/_esm/core/internal/cursor.js"() { + "use strict"; + init_Errors(); + staticCursor2 = { + bytes: new Uint8Array(), + dataView: new DataView(new ArrayBuffer(0)), + position: 0, + positionReadCount: /* @__PURE__ */ new Map(), + recursiveReadCount: 0, + recursiveReadLimit: Number.POSITIVE_INFINITY, + assertReadLimit() { + if (this.recursiveReadCount >= this.recursiveReadLimit) + throw new RecursiveReadLimitExceededError2({ + count: this.recursiveReadCount + 1, + limit: this.recursiveReadLimit + }); + }, + assertPosition(position) { + if (position < 0 || position > this.bytes.length - 1) + throw new PositionOutOfBoundsError2({ + length: this.bytes.length, + position + }); + }, + decrementPosition(offset) { + if (offset < 0) + throw new NegativeOffsetError2({ offset }); + const position = this.position - offset; + this.assertPosition(position); + this.position = position; + }, + getReadCount(position) { + return this.positionReadCount.get(position || this.position) || 0; + }, + incrementPosition(offset) { + if (offset < 0) + throw new NegativeOffsetError2({ offset }); + const position = this.position + offset; + this.assertPosition(position); + this.position = position; + }, + inspectByte(position_) { + const position = position_ ?? this.position; + this.assertPosition(position); + return this.bytes[position]; + }, + inspectBytes(length, position_) { + const position = position_ ?? this.position; + this.assertPosition(position + length - 1); + return this.bytes.subarray(position, position + length); + }, + inspectUint8(position_) { + const position = position_ ?? this.position; + this.assertPosition(position); + return this.bytes[position]; + }, + inspectUint16(position_) { + const position = position_ ?? this.position; + this.assertPosition(position + 1); + return this.dataView.getUint16(position); + }, + inspectUint24(position_) { + const position = position_ ?? this.position; + this.assertPosition(position + 2); + return (this.dataView.getUint16(position) << 8) + this.dataView.getUint8(position + 2); + }, + inspectUint32(position_) { + const position = position_ ?? this.position; + this.assertPosition(position + 3); + return this.dataView.getUint32(position); + }, + pushByte(byte) { + this.assertPosition(this.position); + this.bytes[this.position] = byte; + this.position++; + }, + pushBytes(bytes) { + this.assertPosition(this.position + bytes.length - 1); + this.bytes.set(bytes, this.position); + this.position += bytes.length; + }, + pushUint8(value) { + this.assertPosition(this.position); + this.bytes[this.position] = value; + this.position++; + }, + pushUint16(value) { + this.assertPosition(this.position + 1); + this.dataView.setUint16(this.position, value); + this.position += 2; + }, + pushUint24(value) { + this.assertPosition(this.position + 2); + this.dataView.setUint16(this.position, value >> 8); + this.dataView.setUint8(this.position + 2, value & ~4294967040); + this.position += 3; + }, + pushUint32(value) { + this.assertPosition(this.position + 3); + this.dataView.setUint32(this.position, value); + this.position += 4; + }, + readByte() { + this.assertReadLimit(); + this._touch(); + const value = this.inspectByte(); + this.position++; + return value; + }, + readBytes(length, size5) { + this.assertReadLimit(); + this._touch(); + const value = this.inspectBytes(length); + this.position += size5 ?? length; + return value; + }, + readUint8() { + this.assertReadLimit(); + this._touch(); + const value = this.inspectUint8(); + this.position += 1; + return value; + }, + readUint16() { + this.assertReadLimit(); + this._touch(); + const value = this.inspectUint16(); + this.position += 2; + return value; + }, + readUint24() { + this.assertReadLimit(); + this._touch(); + const value = this.inspectUint24(); + this.position += 3; + return value; + }, + readUint32() { + this.assertReadLimit(); + this._touch(); + const value = this.inspectUint32(); + this.position += 4; + return value; + }, + get remaining() { + return this.bytes.length - this.position; + }, + setPosition(position) { + const oldPosition = this.position; + this.assertPosition(position); + this.position = position; + return () => this.position = oldPosition; + }, + _touch() { + if (this.recursiveReadLimit === Number.POSITIVE_INFINITY) + return; + const count = this.getReadCount(); + this.positionReadCount.set(this.position, count + 1); + if (count > 0) + this.recursiveReadCount++; + } + }; + NegativeOffsetError2 = class extends BaseError3 { + constructor({ offset }) { + super(`Offset \`${offset}\` cannot be negative.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Cursor.NegativeOffsetError" + }); + } + }; + PositionOutOfBoundsError2 = class extends BaseError3 { + constructor({ length, position }) { + super(`Position \`${position}\` is out of bounds (\`0 < position < ${length}\`).`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Cursor.PositionOutOfBoundsError" + }); + } + }; + RecursiveReadLimitExceededError2 = class extends BaseError3 { + constructor({ count, limit }) { + super(`Recursive read limit of \`${limit}\` exceeded (recursive read count: \`${count}\`).`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Cursor.RecursiveReadLimitExceededError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/core/AbiParameters.js +function decode(parameters, data, options = {}) { + const { as = "Array", checksumAddress: checksumAddress2 = false } = options; + const bytes = typeof data === "string" ? fromHex(data) : data; + const cursor = create(bytes); + if (size2(bytes) === 0 && parameters.length > 0) + throw new ZeroDataError(); + if (size2(bytes) && size2(bytes) < 32) + throw new DataSizeTooSmallError({ + data: typeof data === "string" ? data : fromBytes(data), + parameters, + size: size2(bytes) + }); + let consumed = 0; + const values = as === "Array" ? [] : {}; + for (let i = 0; i < parameters.length; ++i) { + const param = parameters[i]; + cursor.setPosition(consumed); + const [data2, consumed_] = decodeParameter2(cursor, param, { + checksumAddress: checksumAddress2, + staticPosition: 0 + }); + consumed += consumed_; + if (as === "Array") + values.push(data2); + else + values[param.name ?? i] = data2; + } + return values; +} +function encode2(parameters, values, options) { + const { checksumAddress: checksumAddress2 = false } = options ?? {}; + if (parameters.length !== values.length) + throw new LengthMismatchError({ + expectedLength: parameters.length, + givenLength: values.length + }); + const preparedParameters = prepareParameters({ + checksumAddress: checksumAddress2, + parameters, + values + }); + const data = encode(preparedParameters); + if (data.length === 0) + return "0x"; + return data; +} +function encodePacked(types, values) { + if (types.length !== values.length) + throw new LengthMismatchError({ + expectedLength: types.length, + givenLength: values.length + }); + const data = []; + for (let i = 0; i < types.length; i++) { + const type = types[i]; + const value = values[i]; + data.push(encodePacked.encode(type, value)); + } + return concat2(...data); +} +function from5(parameters) { + if (Array.isArray(parameters) && typeof parameters[0] === "string") + return parseAbiParameters(parameters); + if (typeof parameters === "string") + return parseAbiParameters(parameters); + return parameters; +} +var DataSizeTooSmallError, ZeroDataError, ArrayLengthMismatchError, BytesSizeMismatchError2, LengthMismatchError, InvalidArrayError2, InvalidTypeError; +var init_AbiParameters = __esm({ + "node_modules/ox/_esm/core/AbiParameters.js"() { + "use strict"; + init_exports(); + init_Address(); + init_Bytes(); + init_Errors(); + init_Hex(); + init_abiParameters(); + init_cursor3(); + init_Solidity(); + (function(encodePacked2) { + function encode4(type, value, isArray = false) { + if (type === "address") { + const address2 = value; + assert4(address2); + return padLeft(address2.toLowerCase(), isArray ? 32 : 0); + } + if (type === "string") + return fromString2(value); + if (type === "bytes") + return value; + if (type === "bool") + return padLeft(fromBoolean(value), isArray ? 32 : 1); + const intMatch = type.match(integerRegex3); + if (intMatch) { + const [_type, baseType, bits = "256"] = intMatch; + const size5 = Number.parseInt(bits, 10) / 8; + return fromNumber(value, { + size: isArray ? 32 : size5, + signed: baseType === "int" + }); + } + const bytesMatch = type.match(bytesRegex3); + if (bytesMatch) { + const [_type, size5] = bytesMatch; + if (Number.parseInt(size5, 10) !== (value.length - 2) / 2) + throw new BytesSizeMismatchError2({ + expectedSize: Number.parseInt(size5, 10), + value + }); + return padRight(value, isArray ? 32 : 0); + } + const arrayMatch = type.match(arrayRegex); + if (arrayMatch && Array.isArray(value)) { + const [_type, childType] = arrayMatch; + const data = []; + for (let i = 0; i < value.length; i++) { + data.push(encode4(childType, value[i], true)); + } + if (data.length === 0) + return "0x"; + return concat2(...data); + } + throw new InvalidTypeError(type); + } + encodePacked2.encode = encode4; + })(encodePacked || (encodePacked = {})); + DataSizeTooSmallError = class extends BaseError3 { + constructor({ data, parameters, size: size5 }) { + super(`Data size of ${size5} bytes is too small for given parameters.`, { + metaMessages: [ + `Params: (${formatAbiParameters(parameters)})`, + `Data: ${data} (${size5} bytes)` + ] + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiParameters.DataSizeTooSmallError" + }); + } + }; + ZeroDataError = class extends BaseError3 { + constructor() { + super('Cannot decode zero data ("0x") with ABI parameters.'); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiParameters.ZeroDataError" + }); + } + }; + ArrayLengthMismatchError = class extends BaseError3 { + constructor({ expectedLength, givenLength, type }) { + super(`Array length mismatch for type \`${type}\`. Expected: \`${expectedLength}\`. Given: \`${givenLength}\`.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiParameters.ArrayLengthMismatchError" + }); + } + }; + BytesSizeMismatchError2 = class extends BaseError3 { + constructor({ expectedSize, value }) { + super(`Size of bytes "${value}" (bytes${size3(value)}) does not match expected size (bytes${expectedSize}).`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiParameters.BytesSizeMismatchError" + }); + } + }; + LengthMismatchError = class extends BaseError3 { + constructor({ expectedLength, givenLength }) { + super([ + "ABI encoding parameters/values length mismatch.", + `Expected length (parameters): ${expectedLength}`, + `Given length (values): ${givenLength}` + ].join("\n")); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiParameters.LengthMismatchError" + }); + } + }; + InvalidArrayError2 = class extends BaseError3 { + constructor(value) { + super(`Value \`${value}\` is not a valid array.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiParameters.InvalidArrayError" + }); + } + }; + InvalidTypeError = class extends BaseError3 { + constructor(type) { + super(`Type \`${type}\` is not a valid ABI Type.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiParameters.InvalidTypeError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/core/Rlp.js +function from6(value, options) { + const { as } = options; + const encodable = getEncodable2(value); + const cursor = create(new Uint8Array(encodable.length)); + encodable.encode(cursor); + if (as === "Hex") + return fromBytes(cursor.bytes); + return cursor.bytes; +} +function fromHex3(hex, options = {}) { + const { as = "Hex" } = options; + return from6(hex, { as }); +} +function getEncodable2(bytes) { + if (Array.isArray(bytes)) + return getEncodableList2(bytes.map((x) => getEncodable2(x))); + return getEncodableBytes2(bytes); +} +function getEncodableList2(list) { + const bodyLength = list.reduce((acc, x) => acc + x.length, 0); + const sizeOfBodyLength = getSizeOfLength2(bodyLength); + const length = (() => { + if (bodyLength <= 55) + return 1 + bodyLength; + return 1 + sizeOfBodyLength + bodyLength; + })(); + return { + length, + encode(cursor) { + if (bodyLength <= 55) { + cursor.pushByte(192 + bodyLength); + } else { + cursor.pushByte(192 + 55 + sizeOfBodyLength); + if (sizeOfBodyLength === 1) + cursor.pushUint8(bodyLength); + else if (sizeOfBodyLength === 2) + cursor.pushUint16(bodyLength); + else if (sizeOfBodyLength === 3) + cursor.pushUint24(bodyLength); + else + cursor.pushUint32(bodyLength); + } + for (const { encode: encode4 } of list) { + encode4(cursor); + } + } + }; +} +function getEncodableBytes2(bytesOrHex) { + const bytes = typeof bytesOrHex === "string" ? fromHex(bytesOrHex) : bytesOrHex; + const sizeOfBytesLength = getSizeOfLength2(bytes.length); + const length = (() => { + if (bytes.length === 1 && bytes[0] < 128) + return 1; + if (bytes.length <= 55) + return 1 + bytes.length; + return 1 + sizeOfBytesLength + bytes.length; + })(); + return { + length, + encode(cursor) { + if (bytes.length === 1 && bytes[0] < 128) { + cursor.pushBytes(bytes); + } else if (bytes.length <= 55) { + cursor.pushByte(128 + bytes.length); + cursor.pushBytes(bytes); + } else { + cursor.pushByte(128 + 55 + sizeOfBytesLength); + if (sizeOfBytesLength === 1) + cursor.pushUint8(bytes.length); + else if (sizeOfBytesLength === 2) + cursor.pushUint16(bytes.length); + else if (sizeOfBytesLength === 3) + cursor.pushUint24(bytes.length); + else + cursor.pushUint32(bytes.length); + cursor.pushBytes(bytes); + } + } + }; +} +function getSizeOfLength2(length) { + if (length <= 255) + return 1; + if (length <= 65535) + return 2; + if (length <= 16777215) + return 3; + if (length <= 4294967295) + return 4; + throw new BaseError3("Length is too large."); +} +var init_Rlp = __esm({ + "node_modules/ox/_esm/core/Rlp.js"() { + "use strict"; + init_Bytes(); + init_Errors(); + init_Hex(); + init_cursor3(); + } +}); + +// node_modules/ox/node_modules/@noble/curves/esm/abstract/modular.js +function mod2(a, b) { + const result = a % b; + return result >= _0n8 ? result : b + result; +} +function pow22(x, power, modulo2) { + let res = x; + while (power-- > _0n8) { + res *= res; + res %= modulo2; + } + return res; +} +function invert2(number, modulo2) { + if (number === _0n8) + throw new Error("invert: expected non-zero number"); + if (modulo2 <= _0n8) + throw new Error("invert: expected positive modulus, got " + modulo2); + let a = mod2(number, modulo2); + let b = modulo2; + let x = _0n8, y = _1n8, u = _1n8, v = _0n8; + while (a !== _0n8) { + const q = b / a; + const r = b % a; + const m = x - u * q; + const n = y - v * q; + b = a, a = r, x = u, y = v, u = m, v = n; + } + const gcd2 = b; + if (gcd2 !== _1n8) + throw new Error("invert: does not exist"); + return mod2(x, modulo2); +} +function sqrt3mod42(Fp, n) { + const p1div4 = (Fp.ORDER + _1n8) / _4n3; + const root = Fp.pow(n, p1div4); + if (!Fp.eql(Fp.sqr(root), n)) + throw new Error("Cannot find square root"); + return root; +} +function sqrt5mod82(Fp, n) { + const p5div8 = (Fp.ORDER - _5n2) / _8n2; + const n2 = Fp.mul(n, _2n5); + const v = Fp.pow(n2, p5div8); + const nv = Fp.mul(n, v); + const i = Fp.mul(Fp.mul(nv, _2n5), v); + const root = Fp.mul(nv, Fp.sub(i, Fp.ONE)); + if (!Fp.eql(Fp.sqr(root), n)) + throw new Error("Cannot find square root"); + return root; +} +function tonelliShanks2(P2) { + if (P2 < BigInt(3)) + throw new Error("sqrt is not defined for small field"); + let Q = P2 - _1n8; + let S = 0; + while (Q % _2n5 === _0n8) { + Q /= _2n5; + S++; + } + let Z = _2n5; + const _Fp = Field2(P2); + while (FpLegendre2(_Fp, Z) === 1) { + if (Z++ > 1e3) + throw new Error("Cannot find square root: probably non-prime P"); + } + if (S === 1) + return sqrt3mod42; + let cc = _Fp.pow(Z, Q); + const Q1div2 = (Q + _1n8) / _2n5; + return function tonelliSlow(Fp, n) { + if (Fp.is0(n)) + return n; + if (FpLegendre2(Fp, n) !== 1) + throw new Error("Cannot find square root"); + let M = S; + let c2 = Fp.mul(Fp.ONE, cc); + let t = Fp.pow(n, Q); + let R = Fp.pow(n, Q1div2); + while (!Fp.eql(t, Fp.ONE)) { + if (Fp.is0(t)) + return Fp.ZERO; + let i = 1; + let t_tmp = Fp.sqr(t); + while (!Fp.eql(t_tmp, Fp.ONE)) { + i++; + t_tmp = Fp.sqr(t_tmp); + if (i === M) + throw new Error("Cannot find square root"); + } + const exponent = _1n8 << BigInt(M - i - 1); + const b = Fp.pow(c2, exponent); + M = i; + c2 = Fp.sqr(b); + t = Fp.mul(t, c2); + R = Fp.mul(R, b); + } + return R; + }; +} +function FpSqrt2(P2) { + if (P2 % _4n3 === _3n3) + return sqrt3mod42; + if (P2 % _8n2 === _5n2) + return sqrt5mod82; + return tonelliShanks2(P2); +} +function validateField2(field) { + const initial = { + ORDER: "bigint", + MASK: "bigint", + BYTES: "isSafeInteger", + BITS: "isSafeInteger" + }; + const opts = FIELD_FIELDS2.reduce((map, val) => { + map[val] = "function"; + return map; + }, initial); + return validateObject2(field, opts); +} +function FpPow2(Fp, num2, power) { + if (power < _0n8) + throw new Error("invalid exponent, negatives unsupported"); + if (power === _0n8) + return Fp.ONE; + if (power === _1n8) + return num2; + let p = Fp.ONE; + let d = num2; + while (power > _0n8) { + if (power & _1n8) + p = Fp.mul(p, d); + d = Fp.sqr(d); + power >>= _1n8; + } + return p; +} +function FpInvertBatch2(Fp, nums, passZero = false) { + const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : void 0); + const multipliedAcc = nums.reduce((acc, num2, i) => { + if (Fp.is0(num2)) + return acc; + inverted[i] = acc; + return Fp.mul(acc, num2); + }, Fp.ONE); + const invertedAcc = Fp.inv(multipliedAcc); + nums.reduceRight((acc, num2, i) => { + if (Fp.is0(num2)) + return acc; + inverted[i] = Fp.mul(acc, inverted[i]); + return Fp.mul(acc, num2); + }, invertedAcc); + return inverted; +} +function FpLegendre2(Fp, n) { + const p1mod2 = (Fp.ORDER - _1n8) / _2n5; + const powered = Fp.pow(n, p1mod2); + const yes = Fp.eql(powered, Fp.ONE); + const zero = Fp.eql(powered, Fp.ZERO); + const no = Fp.eql(powered, Fp.neg(Fp.ONE)); + if (!yes && !zero && !no) + throw new Error("invalid Legendre symbol result"); + return yes ? 1 : zero ? 0 : -1; +} +function nLength2(n, nBitLength) { + if (nBitLength !== void 0) + anumber(nBitLength); + const _nBitLength = nBitLength !== void 0 ? nBitLength : n.toString(2).length; + const nByteLength = Math.ceil(_nBitLength / 8); + return { nBitLength: _nBitLength, nByteLength }; +} +function Field2(ORDER, bitLen4, isLE2 = false, redef = {}) { + if (ORDER <= _0n8) + throw new Error("invalid field: expected ORDER > 0, got " + ORDER); + const { nBitLength: BITS, nByteLength: BYTES } = nLength2(ORDER, bitLen4); + if (BYTES > 2048) + throw new Error("invalid field: expected ORDER of <= 2048 bytes"); + let sqrtP; + const f = Object.freeze({ + ORDER, + isLE: isLE2, + BITS, + BYTES, + MASK: bitMask2(BITS), + ZERO: _0n8, + ONE: _1n8, + create: (num2) => mod2(num2, ORDER), + isValid: (num2) => { + if (typeof num2 !== "bigint") + throw new Error("invalid field element: expected bigint, got " + typeof num2); + return _0n8 <= num2 && num2 < ORDER; + }, + is0: (num2) => num2 === _0n8, + isOdd: (num2) => (num2 & _1n8) === _1n8, + neg: (num2) => mod2(-num2, ORDER), + eql: (lhs, rhs) => lhs === rhs, + sqr: (num2) => mod2(num2 * num2, ORDER), + add: (lhs, rhs) => mod2(lhs + rhs, ORDER), + sub: (lhs, rhs) => mod2(lhs - rhs, ORDER), + mul: (lhs, rhs) => mod2(lhs * rhs, ORDER), + pow: (num2, power) => FpPow2(f, num2, power), + div: (lhs, rhs) => mod2(lhs * invert2(rhs, ORDER), ORDER), + // Same as above, but doesn't normalize + sqrN: (num2) => num2 * num2, + addN: (lhs, rhs) => lhs + rhs, + subN: (lhs, rhs) => lhs - rhs, + mulN: (lhs, rhs) => lhs * rhs, + inv: (num2) => invert2(num2, ORDER), + sqrt: redef.sqrt || ((n) => { + if (!sqrtP) + sqrtP = FpSqrt2(ORDER); + return sqrtP(f, n); + }), + toBytes: (num2) => isLE2 ? numberToBytesLE2(num2, BYTES) : numberToBytesBE2(num2, BYTES), + fromBytes: (bytes) => { + if (bytes.length !== BYTES) + throw new Error("Field.fromBytes: expected " + BYTES + " bytes, got " + bytes.length); + return isLE2 ? bytesToNumberLE2(bytes) : bytesToNumberBE2(bytes); + }, + // TODO: we don't need it here, move out to separate fn + invertBatch: (lst) => FpInvertBatch2(f, lst), + // We can't move this out because Fp6, Fp12 implement it + // and it's unclear what to return in there. + cmov: (a, b, c2) => c2 ? b : a + }); + return Object.freeze(f); +} +function getFieldBytesLength2(fieldOrder) { + if (typeof fieldOrder !== "bigint") + throw new Error("field order must be bigint"); + const bitLength = fieldOrder.toString(2).length; + return Math.ceil(bitLength / 8); +} +function getMinHashLength2(fieldOrder) { + const length = getFieldBytesLength2(fieldOrder); + return length + Math.ceil(length / 2); +} +function mapHashToField2(key, fieldOrder, isLE2 = false) { + const len = key.length; + const fieldLen = getFieldBytesLength2(fieldOrder); + const minLen = getMinHashLength2(fieldOrder); + if (len < 16 || len < minLen || len > 1024) + throw new Error("expected " + minLen + "-1024 bytes of input, got " + len); + const num2 = isLE2 ? bytesToNumberLE2(key) : bytesToNumberBE2(key); + const reduced = mod2(num2, fieldOrder - _1n8) + _1n8; + return isLE2 ? numberToBytesLE2(reduced, fieldLen) : numberToBytesBE2(reduced, fieldLen); +} +var _0n8, _1n8, _2n5, _3n3, _4n3, _5n2, _8n2, FIELD_FIELDS2; +var init_modular2 = __esm({ + "node_modules/ox/node_modules/@noble/curves/esm/abstract/modular.js"() { + "use strict"; + init_utils2(); + init_utils5(); + _0n8 = BigInt(0); + _1n8 = BigInt(1); + _2n5 = /* @__PURE__ */ BigInt(2); + _3n3 = /* @__PURE__ */ BigInt(3); + _4n3 = /* @__PURE__ */ BigInt(4); + _5n2 = /* @__PURE__ */ BigInt(5); + _8n2 = /* @__PURE__ */ BigInt(8); + FIELD_FIELDS2 = [ + "create", + "isValid", + "is0", + "neg", + "inv", + "sqrt", + "sqr", + "eql", + "add", + "sub", + "mul", + "pow", + "div", + "addN", + "subN", + "mulN", + "sqrN" + ]; + } +}); + +// node_modules/ox/node_modules/@noble/curves/esm/abstract/curve.js +function constTimeNegate2(condition, item) { + const neg = item.negate(); + return condition ? neg : item; +} +function validateW2(W, bits) { + if (!Number.isSafeInteger(W) || W <= 0 || W > bits) + throw new Error("invalid window size, expected [1.." + bits + "], got W=" + W); +} +function calcWOpts2(W, scalarBits) { + validateW2(W, scalarBits); + const windows = Math.ceil(scalarBits / W) + 1; + const windowSize = 2 ** (W - 1); + const maxNumber = 2 ** W; + const mask = bitMask2(W); + const shiftBy = BigInt(W); + return { windows, windowSize, mask, maxNumber, shiftBy }; +} +function calcOffsets2(n, window, wOpts) { + const { windowSize, mask, maxNumber, shiftBy } = wOpts; + let wbits = Number(n & mask); + let nextN = n >> shiftBy; + if (wbits > windowSize) { + wbits -= maxNumber; + nextN += _1n9; + } + const offsetStart = window * windowSize; + const offset = offsetStart + Math.abs(wbits) - 1; + const isZero = wbits === 0; + const isNeg = wbits < 0; + const isNegF = window % 2 !== 0; + const offsetF = offsetStart; + return { nextN, offset, isZero, isNeg, isNegF, offsetF }; +} +function validateMSMPoints2(points, c2) { + if (!Array.isArray(points)) + throw new Error("array expected"); + points.forEach((p, i) => { + if (!(p instanceof c2)) + throw new Error("invalid point at index " + i); + }); +} +function validateMSMScalars2(scalars, field) { + if (!Array.isArray(scalars)) + throw new Error("array of scalars expected"); + scalars.forEach((s3, i) => { + if (!field.isValid(s3)) + throw new Error("invalid scalar at index " + i); + }); +} +function getW2(P2) { + return pointWindowSizes2.get(P2) || 1; +} +function wNAF2(c2, bits) { + return { + constTimeNegate: constTimeNegate2, + hasPrecomputes(elm) { + return getW2(elm) !== 1; + }, + // non-const time multiplication ladder + unsafeLadder(elm, n, p = c2.ZERO) { + let d = elm; + while (n > _0n9) { + if (n & _1n9) + p = p.add(d); + d = d.double(); + n >>= _1n9; + } + return p; + }, + /** + * Creates a wNAF precomputation window. Used for caching. + * Default window size is set by `utils.precompute()` and is equal to 8. + * Number of precomputed points depends on the curve size: + * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where: + * - 𝑊 is the window size + * - 𝑛 is the bitlength of the curve order. + * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224. + * @param elm Point instance + * @param W window size + * @returns precomputed point tables flattened to a single array + */ + precomputeWindow(elm, W) { + const { windows, windowSize } = calcWOpts2(W, bits); + const points = []; + let p = elm; + let base2 = p; + for (let window = 0; window < windows; window++) { + base2 = p; + points.push(base2); + for (let i = 1; i < windowSize; i++) { + base2 = base2.add(p); + points.push(base2); + } + p = base2.double(); + } + return points; + }, + /** + * Implements ec multiplication using precomputed tables and w-ary non-adjacent form. + * @param W window size + * @param precomputes precomputed tables + * @param n scalar (we don't check here, but should be less than curve order) + * @returns real and fake (for const-time) points + */ + wNAF(W, precomputes, n) { + let p = c2.ZERO; + let f = c2.BASE; + const wo = calcWOpts2(W, bits); + for (let window = 0; window < wo.windows; window++) { + const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets2(n, window, wo); + n = nextN; + if (isZero) { + f = f.add(constTimeNegate2(isNegF, precomputes[offsetF])); + } else { + p = p.add(constTimeNegate2(isNeg, precomputes[offset])); + } + } + return { p, f }; + }, + /** + * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form. + * @param W window size + * @param precomputes precomputed tables + * @param n scalar (we don't check here, but should be less than curve order) + * @param acc accumulator point to add result of multiplication + * @returns point + */ + wNAFUnsafe(W, precomputes, n, acc = c2.ZERO) { + const wo = calcWOpts2(W, bits); + for (let window = 0; window < wo.windows; window++) { + if (n === _0n9) + break; + const { nextN, offset, isZero, isNeg } = calcOffsets2(n, window, wo); + n = nextN; + if (isZero) { + continue; + } else { + const item = precomputes[offset]; + acc = acc.add(isNeg ? item.negate() : item); + } + } + return acc; + }, + getPrecomputes(W, P2, transform) { + let comp = pointPrecomputes2.get(P2); + if (!comp) { + comp = this.precomputeWindow(P2, W); + if (W !== 1) + pointPrecomputes2.set(P2, transform(comp)); + } + return comp; + }, + wNAFCached(P2, n, transform) { + const W = getW2(P2); + return this.wNAF(W, this.getPrecomputes(W, P2, transform), n); + }, + wNAFCachedUnsafe(P2, n, transform, prev) { + const W = getW2(P2); + if (W === 1) + return this.unsafeLadder(P2, n, prev); + return this.wNAFUnsafe(W, this.getPrecomputes(W, P2, transform), n, prev); + }, + // We calculate precomputes for elliptic curve point multiplication + // using windowed method. This specifies window size and + // stores precomputed values. Usually only base point would be precomputed. + setWindowSize(P2, W) { + validateW2(W, bits); + pointWindowSizes2.set(P2, W); + pointPrecomputes2.delete(P2); + } + }; +} +function pippenger2(c2, fieldN, points, scalars) { + validateMSMPoints2(points, c2); + validateMSMScalars2(scalars, fieldN); + const plength = points.length; + const slength = scalars.length; + if (plength !== slength) + throw new Error("arrays of points and scalars must have equal length"); + const zero = c2.ZERO; + const wbits = bitLen2(BigInt(plength)); + let windowSize = 1; + if (wbits > 12) + windowSize = wbits - 3; + else if (wbits > 4) + windowSize = wbits - 2; + else if (wbits > 0) + windowSize = 2; + const MASK = bitMask2(windowSize); + const buckets = new Array(Number(MASK) + 1).fill(zero); + const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize; + let sum = zero; + for (let i = lastBits; i >= 0; i -= windowSize) { + buckets.fill(zero); + for (let j = 0; j < slength; j++) { + const scalar = scalars[j]; + const wbits2 = Number(scalar >> BigInt(i) & MASK); + buckets[wbits2] = buckets[wbits2].add(points[j]); + } + let resI = zero; + for (let j = buckets.length - 1, sumI = zero; j > 0; j--) { + sumI = sumI.add(buckets[j]); + resI = resI.add(sumI); + } + sum = sum.add(resI); + if (i !== 0) + for (let j = 0; j < windowSize; j++) + sum = sum.double(); + } + return sum; +} +function validateBasic2(curve) { + validateField2(curve.Fp); + validateObject2(curve, { + n: "bigint", + h: "bigint", + Gx: "field", + Gy: "field" + }, { + nBitLength: "isSafeInteger", + nByteLength: "isSafeInteger" + }); + return Object.freeze({ + ...nLength2(curve.n, curve.nBitLength), + ...curve, + ...{ p: curve.Fp.ORDER } + }); +} +var _0n9, _1n9, pointPrecomputes2, pointWindowSizes2; +var init_curve2 = __esm({ + "node_modules/ox/node_modules/@noble/curves/esm/abstract/curve.js"() { + "use strict"; + init_modular2(); + init_utils5(); + _0n9 = BigInt(0); + _1n9 = BigInt(1); + pointPrecomputes2 = /* @__PURE__ */ new WeakMap(); + pointWindowSizes2 = /* @__PURE__ */ new WeakMap(); + } +}); + +// node_modules/ox/node_modules/@noble/curves/esm/abstract/weierstrass.js +function validateSigVerOpts2(opts) { + if (opts.lowS !== void 0) + abool2("lowS", opts.lowS); + if (opts.prehash !== void 0) + abool2("prehash", opts.prehash); +} +function validatePointOpts2(curve) { + const opts = validateBasic2(curve); + validateObject2(opts, { + a: "field", + b: "field" + }, { + allowInfinityPoint: "boolean", + allowedPrivateKeyLengths: "array", + clearCofactor: "function", + fromBytes: "function", + isTorsionFree: "function", + toBytes: "function", + wrapPrivateKey: "boolean" + }); + const { endo, Fp, a } = opts; + if (endo) { + if (!Fp.eql(a, Fp.ZERO)) { + throw new Error("invalid endo: CURVE.a must be 0"); + } + if (typeof endo !== "object" || typeof endo.beta !== "bigint" || typeof endo.splitScalar !== "function") { + throw new Error('invalid endo: expected "beta": bigint and "splitScalar": function'); + } + } + return Object.freeze({ ...opts }); +} +function numToSizedHex2(num2, size5) { + return bytesToHex3(numberToBytesBE2(num2, size5)); +} +function weierstrassPoints2(opts) { + const CURVE = validatePointOpts2(opts); + const { Fp } = CURVE; + const Fn2 = Field2(CURVE.n, CURVE.nBitLength); + const toBytes4 = CURVE.toBytes || ((_c, point, _isCompressed) => { + const a = point.toAffine(); + return concatBytes4(Uint8Array.from([4]), Fp.toBytes(a.x), Fp.toBytes(a.y)); + }); + const fromBytes4 = CURVE.fromBytes || ((bytes) => { + const tail = bytes.subarray(1); + const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES)); + const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES)); + return { x, y }; + }); + function weierstrassEquation(x) { + const { a, b } = CURVE; + const x2 = Fp.sqr(x); + const x3 = Fp.mul(x2, x); + return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); + } + function isValidXY(x, y) { + const left = Fp.sqr(y); + const right = weierstrassEquation(x); + return Fp.eql(left, right); + } + if (!isValidXY(CURVE.Gx, CURVE.Gy)) + throw new Error("bad curve params: generator point"); + const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n4), _4n4); + const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27)); + if (Fp.is0(Fp.add(_4a3, _27b2))) + throw new Error("bad curve params: a or b"); + function isWithinCurveOrder(num2) { + return inRange2(num2, _1n10, CURVE.n); + } + function normPrivateKeyToScalar(key) { + const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n: N } = CURVE; + if (lengths && typeof key !== "bigint") { + if (isBytes3(key)) + key = bytesToHex3(key); + if (typeof key !== "string" || !lengths.includes(key.length)) + throw new Error("invalid private key"); + key = key.padStart(nByteLength * 2, "0"); + } + let num2; + try { + num2 = typeof key === "bigint" ? key : bytesToNumberBE2(ensureBytes2("private key", key, nByteLength)); + } catch (error) { + throw new Error("invalid private key, expected hex or " + nByteLength + " bytes, got " + typeof key); + } + if (wrapPrivateKey) + num2 = mod2(num2, N); + aInRange2("private key", num2, _1n10, N); + return num2; + } + function aprjpoint(other) { + if (!(other instanceof Point3)) + throw new Error("ProjectivePoint expected"); + } + const toAffineMemo = memoized2((p, iz) => { + const { px: x, py: y, pz: z } = p; + if (Fp.eql(z, Fp.ONE)) + return { x, y }; + const is0 = p.is0(); + if (iz == null) + iz = is0 ? Fp.ONE : Fp.inv(z); + const ax = Fp.mul(x, iz); + const ay = Fp.mul(y, iz); + const zz = Fp.mul(z, iz); + if (is0) + return { x: Fp.ZERO, y: Fp.ZERO }; + if (!Fp.eql(zz, Fp.ONE)) + throw new Error("invZ was invalid"); + return { x: ax, y: ay }; + }); + const assertValidMemo = memoized2((p) => { + if (p.is0()) { + if (CURVE.allowInfinityPoint && !Fp.is0(p.py)) + return; + throw new Error("bad point: ZERO"); + } + const { x, y } = p.toAffine(); + if (!Fp.isValid(x) || !Fp.isValid(y)) + throw new Error("bad point: x or y not FE"); + if (!isValidXY(x, y)) + throw new Error("bad point: equation left != right"); + if (!p.isTorsionFree()) + throw new Error("bad point: not in prime-order subgroup"); + return true; + }); + class Point3 { + constructor(px, py, pz) { + if (px == null || !Fp.isValid(px)) + throw new Error("x required"); + if (py == null || !Fp.isValid(py) || Fp.is0(py)) + throw new Error("y required"); + if (pz == null || !Fp.isValid(pz)) + throw new Error("z required"); + this.px = px; + this.py = py; + this.pz = pz; + Object.freeze(this); + } + // Does not validate if the point is on-curve. + // Use fromHex instead, or call assertValidity() later. + static fromAffine(p) { + const { x, y } = p || {}; + if (!p || !Fp.isValid(x) || !Fp.isValid(y)) + throw new Error("invalid affine point"); + if (p instanceof Point3) + throw new Error("projective point not allowed"); + const is0 = (i) => Fp.eql(i, Fp.ZERO); + if (is0(x) && is0(y)) + return Point3.ZERO; + return new Point3(x, y, Fp.ONE); + } + get x() { + return this.toAffine().x; + } + get y() { + return this.toAffine().y; + } + /** + * Takes a bunch of Projective Points but executes only one + * inversion on all of them. Inversion is very slow operation, + * so this improves performance massively. + * Optimization: converts a list of projective points to a list of identical points with Z=1. + */ + static normalizeZ(points) { + const toInv = FpInvertBatch2(Fp, points.map((p) => p.pz)); + return points.map((p, i) => p.toAffine(toInv[i])).map(Point3.fromAffine); + } + /** + * Converts hash string or Uint8Array to Point. + * @param hex short/long ECDSA hex + */ + static fromHex(hex) { + const P2 = Point3.fromAffine(fromBytes4(ensureBytes2("pointHex", hex))); + P2.assertValidity(); + return P2; + } + // Multiplies generator point by privateKey. + static fromPrivateKey(privateKey) { + return Point3.BASE.multiply(normPrivateKeyToScalar(privateKey)); + } + // Multiscalar Multiplication + static msm(points, scalars) { + return pippenger2(Point3, Fn2, points, scalars); + } + // "Private method", don't use it directly + _setWindowSize(windowSize) { + wnaf.setWindowSize(this, windowSize); + } + // A point on curve is valid if it conforms to equation. + assertValidity() { + assertValidMemo(this); + } + hasEvenY() { + const { y } = this.toAffine(); + if (Fp.isOdd) + return !Fp.isOdd(y); + throw new Error("Field doesn't support isOdd"); + } + /** + * Compare one point to another. + */ + equals(other) { + aprjpoint(other); + const { px: X1, py: Y1, pz: Z1 } = this; + const { px: X2, py: Y2, pz: Z2 } = other; + const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1)); + const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1)); + return U1 && U2; + } + /** + * Flips point to one corresponding to (x, -y) in Affine coordinates. + */ + negate() { + return new Point3(this.px, Fp.neg(this.py), this.pz); + } + // Renes-Costello-Batina exception-free doubling formula. + // There is 30% faster Jacobian formula, but it is not complete. + // https://eprint.iacr.org/2015/1060, algorithm 3 + // Cost: 8M + 3S + 3*a + 2*b3 + 15add. + double() { + const { a, b } = CURVE; + const b3 = Fp.mul(b, _3n4); + const { px: X1, py: Y1, pz: Z1 } = this; + let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; + let t0 = Fp.mul(X1, X1); + let t1 = Fp.mul(Y1, Y1); + let t2 = Fp.mul(Z1, Z1); + let t3 = Fp.mul(X1, Y1); + t3 = Fp.add(t3, t3); + Z3 = Fp.mul(X1, Z1); + Z3 = Fp.add(Z3, Z3); + X3 = Fp.mul(a, Z3); + Y3 = Fp.mul(b3, t2); + Y3 = Fp.add(X3, Y3); + X3 = Fp.sub(t1, Y3); + Y3 = Fp.add(t1, Y3); + Y3 = Fp.mul(X3, Y3); + X3 = Fp.mul(t3, X3); + Z3 = Fp.mul(b3, Z3); + t2 = Fp.mul(a, t2); + t3 = Fp.sub(t0, t2); + t3 = Fp.mul(a, t3); + t3 = Fp.add(t3, Z3); + Z3 = Fp.add(t0, t0); + t0 = Fp.add(Z3, t0); + t0 = Fp.add(t0, t2); + t0 = Fp.mul(t0, t3); + Y3 = Fp.add(Y3, t0); + t2 = Fp.mul(Y1, Z1); + t2 = Fp.add(t2, t2); + t0 = Fp.mul(t2, t3); + X3 = Fp.sub(X3, t0); + Z3 = Fp.mul(t2, t1); + Z3 = Fp.add(Z3, Z3); + Z3 = Fp.add(Z3, Z3); + return new Point3(X3, Y3, Z3); + } + // Renes-Costello-Batina exception-free addition formula. + // There is 30% faster Jacobian formula, but it is not complete. + // https://eprint.iacr.org/2015/1060, algorithm 1 + // Cost: 12M + 0S + 3*a + 3*b3 + 23add. + add(other) { + aprjpoint(other); + const { px: X1, py: Y1, pz: Z1 } = this; + const { px: X2, py: Y2, pz: Z2 } = other; + let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; + const a = CURVE.a; + const b3 = Fp.mul(CURVE.b, _3n4); + let t0 = Fp.mul(X1, X2); + let t1 = Fp.mul(Y1, Y2); + let t2 = Fp.mul(Z1, Z2); + let t3 = Fp.add(X1, Y1); + let t4 = Fp.add(X2, Y2); + t3 = Fp.mul(t3, t4); + t4 = Fp.add(t0, t1); + t3 = Fp.sub(t3, t4); + t4 = Fp.add(X1, Z1); + let t5 = Fp.add(X2, Z2); + t4 = Fp.mul(t4, t5); + t5 = Fp.add(t0, t2); + t4 = Fp.sub(t4, t5); + t5 = Fp.add(Y1, Z1); + X3 = Fp.add(Y2, Z2); + t5 = Fp.mul(t5, X3); + X3 = Fp.add(t1, t2); + t5 = Fp.sub(t5, X3); + Z3 = Fp.mul(a, t4); + X3 = Fp.mul(b3, t2); + Z3 = Fp.add(X3, Z3); + X3 = Fp.sub(t1, Z3); + Z3 = Fp.add(t1, Z3); + Y3 = Fp.mul(X3, Z3); + t1 = Fp.add(t0, t0); + t1 = Fp.add(t1, t0); + t2 = Fp.mul(a, t2); + t4 = Fp.mul(b3, t4); + t1 = Fp.add(t1, t2); + t2 = Fp.sub(t0, t2); + t2 = Fp.mul(a, t2); + t4 = Fp.add(t4, t2); + t0 = Fp.mul(t1, t4); + Y3 = Fp.add(Y3, t0); + t0 = Fp.mul(t5, t4); + X3 = Fp.mul(t3, X3); + X3 = Fp.sub(X3, t0); + t0 = Fp.mul(t3, t1); + Z3 = Fp.mul(t5, Z3); + Z3 = Fp.add(Z3, t0); + return new Point3(X3, Y3, Z3); + } + subtract(other) { + return this.add(other.negate()); + } + is0() { + return this.equals(Point3.ZERO); + } + wNAF(n) { + return wnaf.wNAFCached(this, n, Point3.normalizeZ); + } + /** + * Non-constant-time multiplication. Uses double-and-add algorithm. + * It's faster, but should only be used when you don't care about + * an exposed private key e.g. sig verification, which works over *public* keys. + */ + multiplyUnsafe(sc) { + const { endo: endo2, n: N } = CURVE; + aInRange2("scalar", sc, _0n10, N); + const I = Point3.ZERO; + if (sc === _0n10) + return I; + if (this.is0() || sc === _1n10) + return this; + if (!endo2 || wnaf.hasPrecomputes(this)) + return wnaf.wNAFCachedUnsafe(this, sc, Point3.normalizeZ); + let { k1neg, k1, k2neg, k2 } = endo2.splitScalar(sc); + let k1p = I; + let k2p = I; + let d = this; + while (k1 > _0n10 || k2 > _0n10) { + if (k1 & _1n10) + k1p = k1p.add(d); + if (k2 & _1n10) + k2p = k2p.add(d); + d = d.double(); + k1 >>= _1n10; + k2 >>= _1n10; + } + if (k1neg) + k1p = k1p.negate(); + if (k2neg) + k2p = k2p.negate(); + k2p = new Point3(Fp.mul(k2p.px, endo2.beta), k2p.py, k2p.pz); + return k1p.add(k2p); + } + /** + * Constant time multiplication. + * Uses wNAF method. Windowed method may be 10% faster, + * but takes 2x longer to generate and consumes 2x memory. + * Uses precomputes when available. + * Uses endomorphism for Koblitz curves. + * @param scalar by which the point would be multiplied + * @returns New point + */ + multiply(scalar) { + const { endo: endo2, n: N } = CURVE; + aInRange2("scalar", scalar, _1n10, N); + let point, fake; + if (endo2) { + const { k1neg, k1, k2neg, k2 } = endo2.splitScalar(scalar); + let { p: k1p, f: f1p } = this.wNAF(k1); + let { p: k2p, f: f2p } = this.wNAF(k2); + k1p = wnaf.constTimeNegate(k1neg, k1p); + k2p = wnaf.constTimeNegate(k2neg, k2p); + k2p = new Point3(Fp.mul(k2p.px, endo2.beta), k2p.py, k2p.pz); + point = k1p.add(k2p); + fake = f1p.add(f2p); + } else { + const { p, f } = this.wNAF(scalar); + point = p; + fake = f; + } + return Point3.normalizeZ([point, fake])[0]; + } + /** + * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly. + * Not using Strauss-Shamir trick: precomputation tables are faster. + * The trick could be useful if both P and Q are not G (not in our case). + * @returns non-zero affine point + */ + multiplyAndAddUnsafe(Q, a, b) { + const G = Point3.BASE; + const mul = (P2, a2) => a2 === _0n10 || a2 === _1n10 || !P2.equals(G) ? P2.multiplyUnsafe(a2) : P2.multiply(a2); + const sum = mul(this, a).add(mul(Q, b)); + return sum.is0() ? void 0 : sum; + } + // Converts Projective point to affine (x, y) coordinates. + // Can accept precomputed Z^-1 - for example, from invertBatch. + // (x, y, z) ∋ (x=x/z, y=y/z) + toAffine(iz) { + return toAffineMemo(this, iz); + } + isTorsionFree() { + const { h: cofactor, isTorsionFree } = CURVE; + if (cofactor === _1n10) + return true; + if (isTorsionFree) + return isTorsionFree(Point3, this); + throw new Error("isTorsionFree() has not been declared for the elliptic curve"); + } + clearCofactor() { + const { h: cofactor, clearCofactor } = CURVE; + if (cofactor === _1n10) + return this; + if (clearCofactor) + return clearCofactor(Point3, this); + return this.multiplyUnsafe(CURVE.h); + } + toRawBytes(isCompressed = true) { + abool2("isCompressed", isCompressed); + this.assertValidity(); + return toBytes4(Point3, this, isCompressed); + } + toHex(isCompressed = true) { + abool2("isCompressed", isCompressed); + return bytesToHex3(this.toRawBytes(isCompressed)); + } + } + Point3.BASE = new Point3(CURVE.Gx, CURVE.Gy, Fp.ONE); + Point3.ZERO = new Point3(Fp.ZERO, Fp.ONE, Fp.ZERO); + const { endo, nBitLength } = CURVE; + const wnaf = wNAF2(Point3, endo ? Math.ceil(nBitLength / 2) : nBitLength); + return { + CURVE, + ProjectivePoint: Point3, + normPrivateKeyToScalar, + weierstrassEquation, + isWithinCurveOrder + }; +} +function validateOpts2(curve) { + const opts = validateBasic2(curve); + validateObject2(opts, { + hash: "hash", + hmac: "function", + randomBytes: "function" + }, { + bits2int: "function", + bits2int_modN: "function", + lowS: "boolean" + }); + return Object.freeze({ lowS: true, ...opts }); +} +function weierstrass2(curveDef) { + const CURVE = validateOpts2(curveDef); + const { Fp, n: CURVE_ORDER, nByteLength, nBitLength } = CURVE; + const compressedLen = Fp.BYTES + 1; + const uncompressedLen = 2 * Fp.BYTES + 1; + function modN2(a) { + return mod2(a, CURVE_ORDER); + } + function invN(a) { + return invert2(a, CURVE_ORDER); + } + const { ProjectivePoint: Point3, normPrivateKeyToScalar, weierstrassEquation, isWithinCurveOrder } = weierstrassPoints2({ + ...CURVE, + toBytes(_c, point, isCompressed) { + const a = point.toAffine(); + const x = Fp.toBytes(a.x); + const cat = concatBytes4; + abool2("isCompressed", isCompressed); + if (isCompressed) { + return cat(Uint8Array.from([point.hasEvenY() ? 2 : 3]), x); + } else { + return cat(Uint8Array.from([4]), x, Fp.toBytes(a.y)); + } + }, + fromBytes(bytes) { + const len = bytes.length; + const head = bytes[0]; + const tail = bytes.subarray(1); + if (len === compressedLen && (head === 2 || head === 3)) { + const x = bytesToNumberBE2(tail); + if (!inRange2(x, _1n10, Fp.ORDER)) + throw new Error("Point is not on curve"); + const y2 = weierstrassEquation(x); + let y; + try { + y = Fp.sqrt(y2); + } catch (sqrtError) { + const suffix = sqrtError instanceof Error ? ": " + sqrtError.message : ""; + throw new Error("Point is not on curve" + suffix); + } + const isYOdd = (y & _1n10) === _1n10; + const isHeadOdd = (head & 1) === 1; + if (isHeadOdd !== isYOdd) + y = Fp.neg(y); + return { x, y }; + } else if (len === uncompressedLen && head === 4) { + const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES)); + const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES)); + return { x, y }; + } else { + const cl = compressedLen; + const ul = uncompressedLen; + throw new Error("invalid Point, expected length of " + cl + ", or uncompressed " + ul + ", got " + len); + } + } + }); + function isBiggerThanHalfOrder(number) { + const HALF = CURVE_ORDER >> _1n10; + return number > HALF; + } + function normalizeS(s3) { + return isBiggerThanHalfOrder(s3) ? modN2(-s3) : s3; + } + const slcNum = (b, from14, to) => bytesToNumberBE2(b.slice(from14, to)); + class Signature { + constructor(r, s3, recovery) { + aInRange2("r", r, _1n10, CURVE_ORDER); + aInRange2("s", s3, _1n10, CURVE_ORDER); + this.r = r; + this.s = s3; + if (recovery != null) + this.recovery = recovery; + Object.freeze(this); + } + // pair (bytes of r, bytes of s) + static fromCompact(hex) { + const l2 = nByteLength; + hex = ensureBytes2("compactSignature", hex, l2 * 2); + return new Signature(slcNum(hex, 0, l2), slcNum(hex, l2, 2 * l2)); + } + // DER encoded ECDSA signature + // https://bitcoin.stackexchange.com/questions/57644/what-are-the-parts-of-a-bitcoin-transaction-input-script + static fromDER(hex) { + const { r, s: s3 } = DER2.toSig(ensureBytes2("DER", hex)); + return new Signature(r, s3); + } + /** + * @todo remove + * @deprecated + */ + assertValidity() { + } + addRecoveryBit(recovery) { + return new Signature(this.r, this.s, recovery); + } + recoverPublicKey(msgHash) { + const { r, s: s3, recovery: rec } = this; + const h = bits2int_modN(ensureBytes2("msgHash", msgHash)); + if (rec == null || ![0, 1, 2, 3].includes(rec)) + throw new Error("recovery id invalid"); + const radj = rec === 2 || rec === 3 ? r + CURVE.n : r; + if (radj >= Fp.ORDER) + throw new Error("recovery id 2 or 3 invalid"); + const prefix = (rec & 1) === 0 ? "02" : "03"; + const R = Point3.fromHex(prefix + numToSizedHex2(radj, Fp.BYTES)); + const ir = invN(radj); + const u1 = modN2(-h * ir); + const u2 = modN2(s3 * ir); + const Q = Point3.BASE.multiplyAndAddUnsafe(R, u1, u2); + if (!Q) + throw new Error("point at infinify"); + Q.assertValidity(); + return Q; + } + // Signatures should be low-s, to prevent malleability. + hasHighS() { + return isBiggerThanHalfOrder(this.s); + } + normalizeS() { + return this.hasHighS() ? new Signature(this.r, modN2(-this.s), this.recovery) : this; + } + // DER-encoded + toDERRawBytes() { + return hexToBytes3(this.toDERHex()); + } + toDERHex() { + return DER2.hexFromSig(this); + } + // padded bytes of r, then padded bytes of s + toCompactRawBytes() { + return hexToBytes3(this.toCompactHex()); + } + toCompactHex() { + const l2 = nByteLength; + return numToSizedHex2(this.r, l2) + numToSizedHex2(this.s, l2); + } + } + const utils2 = { + isValidPrivateKey(privateKey) { + try { + normPrivateKeyToScalar(privateKey); + return true; + } catch (error) { + return false; + } + }, + normPrivateKeyToScalar, + /** + * Produces cryptographically secure private key from random of size + * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible. + */ + randomPrivateKey: () => { + const length = getMinHashLength2(CURVE.n); + return mapHashToField2(CURVE.randomBytes(length), CURVE.n); + }, + /** + * Creates precompute table for an arbitrary EC point. Makes point "cached". + * Allows to massively speed-up `point.multiply(scalar)`. + * @returns cached point + * @example + * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey)); + * fast.multiply(privKey); // much faster ECDH now + */ + precompute(windowSize = 8, point = Point3.BASE) { + point._setWindowSize(windowSize); + point.multiply(BigInt(3)); + return point; + } + }; + function getPublicKey(privateKey, isCompressed = true) { + return Point3.fromPrivateKey(privateKey).toRawBytes(isCompressed); + } + function isProbPub(item) { + if (typeof item === "bigint") + return false; + if (item instanceof Point3) + return true; + const arr = ensureBytes2("key", item); + const len = arr.length; + const fpl = Fp.BYTES; + const compLen = fpl + 1; + const uncompLen = 2 * fpl + 1; + if (CURVE.allowedPrivateKeyLengths || nByteLength === compLen) { + return void 0; + } else { + return len === compLen || len === uncompLen; + } + } + function getSharedSecret(privateA, publicB, isCompressed = true) { + if (isProbPub(privateA) === true) + throw new Error("first arg must be private key"); + if (isProbPub(publicB) === false) + throw new Error("second arg must be public key"); + const b = Point3.fromHex(publicB); + return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed); + } + const bits2int = CURVE.bits2int || function(bytes) { + if (bytes.length > 8192) + throw new Error("input is too large"); + const num2 = bytesToNumberBE2(bytes); + const delta = bytes.length * 8 - nBitLength; + return delta > 0 ? num2 >> BigInt(delta) : num2; + }; + const bits2int_modN = CURVE.bits2int_modN || function(bytes) { + return modN2(bits2int(bytes)); + }; + const ORDER_MASK = bitMask2(nBitLength); + function int2octets(num2) { + aInRange2("num < 2^" + nBitLength, num2, _0n10, ORDER_MASK); + return numberToBytesBE2(num2, nByteLength); + } + function prepSig(msgHash, privateKey, opts = defaultSigOpts) { + if (["recovered", "canonical"].some((k) => k in opts)) + throw new Error("sign() legacy options not supported"); + const { hash: hash3, randomBytes: randomBytes4 } = CURVE; + let { lowS, prehash, extraEntropy: ent } = opts; + if (lowS == null) + lowS = true; + msgHash = ensureBytes2("msgHash", msgHash); + validateSigVerOpts2(opts); + if (prehash) + msgHash = ensureBytes2("prehashed msgHash", hash3(msgHash)); + const h1int = bits2int_modN(msgHash); + const d = normPrivateKeyToScalar(privateKey); + const seedArgs = [int2octets(d), int2octets(h1int)]; + if (ent != null && ent !== false) { + const e7 = ent === true ? randomBytes4(Fp.BYTES) : ent; + seedArgs.push(ensureBytes2("extraEntropy", e7)); + } + const seed = concatBytes4(...seedArgs); + const m = h1int; + function k2sig(kBytes) { + const k = bits2int(kBytes); + if (!isWithinCurveOrder(k)) + return; + const ik = invN(k); + const q = Point3.BASE.multiply(k).toAffine(); + const r = modN2(q.x); + if (r === _0n10) + return; + const s3 = modN2(ik * modN2(m + r * d)); + if (s3 === _0n10) + return; + let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n10); + let normS = s3; + if (lowS && isBiggerThanHalfOrder(s3)) { + normS = normalizeS(s3); + recovery ^= 1; + } + return new Signature(r, normS, recovery); + } + return { seed, k2sig }; + } + const defaultSigOpts = { lowS: CURVE.lowS, prehash: false }; + const defaultVerOpts = { lowS: CURVE.lowS, prehash: false }; + function sign2(msgHash, privKey, opts = defaultSigOpts) { + const { seed, k2sig } = prepSig(msgHash, privKey, opts); + const C = CURVE; + const drbg = createHmacDrbg2(C.hash.outputLen, C.nByteLength, C.hmac); + return drbg(seed, k2sig); + } + Point3.BASE._setWindowSize(8); + function verify(signature2, msgHash, publicKey, opts = defaultVerOpts) { + const sg = signature2; + msgHash = ensureBytes2("msgHash", msgHash); + publicKey = ensureBytes2("publicKey", publicKey); + const { lowS, prehash, format } = opts; + validateSigVerOpts2(opts); + if ("strict" in opts) + throw new Error("options.strict was renamed to lowS"); + if (format !== void 0 && format !== "compact" && format !== "der") + throw new Error("format must be compact or der"); + const isHex2 = typeof sg === "string" || isBytes3(sg); + const isObj = !isHex2 && !format && typeof sg === "object" && sg !== null && typeof sg.r === "bigint" && typeof sg.s === "bigint"; + if (!isHex2 && !isObj) + throw new Error("invalid signature, expected Uint8Array, hex string or Signature instance"); + let _sig = void 0; + let P2; + try { + if (isObj) + _sig = new Signature(sg.r, sg.s); + if (isHex2) { + try { + if (format !== "compact") + _sig = Signature.fromDER(sg); + } catch (derError) { + if (!(derError instanceof DER2.Err)) + throw derError; + } + if (!_sig && format !== "der") + _sig = Signature.fromCompact(sg); + } + P2 = Point3.fromHex(publicKey); + } catch (error) { + return false; + } + if (!_sig) + return false; + if (lowS && _sig.hasHighS()) + return false; + if (prehash) + msgHash = CURVE.hash(msgHash); + const { r, s: s3 } = _sig; + const h = bits2int_modN(msgHash); + const is = invN(s3); + const u1 = modN2(h * is); + const u2 = modN2(r * is); + const R = Point3.BASE.multiplyAndAddUnsafe(P2, u1, u2)?.toAffine(); + if (!R) + return false; + const v = modN2(R.x); + return v === r; + } + return { + CURVE, + getPublicKey, + getSharedSecret, + sign: sign2, + verify, + ProjectivePoint: Point3, + Signature, + utils: utils2 + }; +} +var DERErr2, DER2, _0n10, _1n10, _2n6, _3n4, _4n4; +var init_weierstrass2 = __esm({ + "node_modules/ox/node_modules/@noble/curves/esm/abstract/weierstrass.js"() { + "use strict"; + init_curve2(); + init_modular2(); + init_utils5(); + DERErr2 = class extends Error { + constructor(m = "") { + super(m); + } + }; + DER2 = { + // asn.1 DER encoding utils + Err: DERErr2, + // Basic building block is TLV (Tag-Length-Value) + _tlv: { + encode: (tag, data) => { + const { Err: E } = DER2; + if (tag < 0 || tag > 256) + throw new E("tlv.encode: wrong tag"); + if (data.length & 1) + throw new E("tlv.encode: unpadded data"); + const dataLen = data.length / 2; + const len = numberToHexUnpadded2(dataLen); + if (len.length / 2 & 128) + throw new E("tlv.encode: long form length too big"); + const lenLen = dataLen > 127 ? numberToHexUnpadded2(len.length / 2 | 128) : ""; + const t = numberToHexUnpadded2(tag); + return t + lenLen + len + data; + }, + // v - value, l - left bytes (unparsed) + decode(tag, data) { + const { Err: E } = DER2; + let pos = 0; + if (tag < 0 || tag > 256) + throw new E("tlv.encode: wrong tag"); + if (data.length < 2 || data[pos++] !== tag) + throw new E("tlv.decode: wrong tlv"); + const first = data[pos++]; + const isLong = !!(first & 128); + let length = 0; + if (!isLong) + length = first; + else { + const lenLen = first & 127; + if (!lenLen) + throw new E("tlv.decode(long): indefinite length not supported"); + if (lenLen > 4) + throw new E("tlv.decode(long): byte length is too big"); + const lengthBytes = data.subarray(pos, pos + lenLen); + if (lengthBytes.length !== lenLen) + throw new E("tlv.decode: length bytes not complete"); + if (lengthBytes[0] === 0) + throw new E("tlv.decode(long): zero leftmost byte"); + for (const b of lengthBytes) + length = length << 8 | b; + pos += lenLen; + if (length < 128) + throw new E("tlv.decode(long): not minimal encoding"); + } + const v = data.subarray(pos, pos + length); + if (v.length !== length) + throw new E("tlv.decode: wrong value length"); + return { v, l: data.subarray(pos + length) }; + } + }, + // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag, + // since we always use positive integers here. It must always be empty: + // - add zero byte if exists + // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding) + _int: { + encode(num2) { + const { Err: E } = DER2; + if (num2 < _0n10) + throw new E("integer: negative integers are not allowed"); + let hex = numberToHexUnpadded2(num2); + if (Number.parseInt(hex[0], 16) & 8) + hex = "00" + hex; + if (hex.length & 1) + throw new E("unexpected DER parsing assertion: unpadded hex"); + return hex; + }, + decode(data) { + const { Err: E } = DER2; + if (data[0] & 128) + throw new E("invalid signature integer: negative"); + if (data[0] === 0 && !(data[1] & 128)) + throw new E("invalid signature integer: unnecessary leading zero"); + return bytesToNumberBE2(data); + } + }, + toSig(hex) { + const { Err: E, _int: int, _tlv: tlv } = DER2; + const data = ensureBytes2("signature", hex); + const { v: seqBytes, l: seqLeftBytes } = tlv.decode(48, data); + if (seqLeftBytes.length) + throw new E("invalid signature: left bytes after parsing"); + const { v: rBytes, l: rLeftBytes } = tlv.decode(2, seqBytes); + const { v: sBytes, l: sLeftBytes } = tlv.decode(2, rLeftBytes); + if (sLeftBytes.length) + throw new E("invalid signature: left bytes after parsing"); + return { r: int.decode(rBytes), s: int.decode(sBytes) }; + }, + hexFromSig(sig) { + const { _tlv: tlv, _int: int } = DER2; + const rs = tlv.encode(2, int.encode(sig.r)); + const ss = tlv.encode(2, int.encode(sig.s)); + const seq = rs + ss; + return tlv.encode(48, seq); + } + }; + _0n10 = BigInt(0); + _1n10 = BigInt(1); + _2n6 = BigInt(2); + _3n4 = BigInt(3); + _4n4 = BigInt(4); + } +}); + +// node_modules/ox/node_modules/@noble/curves/esm/_shortw_utils.js +function getHash2(hash3) { + return { + hash: hash3, + hmac: (key, ...msgs) => hmac(hash3, key, concatBytes(...msgs)), + randomBytes + }; +} +function createCurve2(curveDef, defHash) { + const create2 = (hash3) => weierstrass2({ ...curveDef, ...getHash2(hash3) }); + return { ...create2(defHash), create: create2 }; +} +var init_shortw_utils2 = __esm({ + "node_modules/ox/node_modules/@noble/curves/esm/_shortw_utils.js"() { + "use strict"; + init_hmac(); + init_utils2(); + init_weierstrass2(); + } +}); + +// node_modules/ox/node_modules/@noble/curves/esm/secp256k1.js +function sqrtMod2(y) { + const P2 = secp256k1P2; + const _3n7 = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22); + const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88); + const b2 = y * y * y % P2; + const b3 = b2 * b2 * y % P2; + const b6 = pow22(b3, _3n7, P2) * b3 % P2; + const b9 = pow22(b6, _3n7, P2) * b3 % P2; + const b11 = pow22(b9, _2n7, P2) * b2 % P2; + const b22 = pow22(b11, _11n, P2) * b11 % P2; + const b44 = pow22(b22, _22n, P2) * b22 % P2; + const b88 = pow22(b44, _44n, P2) * b44 % P2; + const b176 = pow22(b88, _88n, P2) * b88 % P2; + const b220 = pow22(b176, _44n, P2) * b44 % P2; + const b223 = pow22(b220, _3n7, P2) * b3 % P2; + const t1 = pow22(b223, _23n, P2) * b22 % P2; + const t2 = pow22(t1, _6n, P2) * b2 % P2; + const root = pow22(t2, _2n7, P2); + if (!Fpk12.eql(Fpk12.sqr(root), y)) + throw new Error("Cannot find square root"); + return root; +} +var secp256k1P2, secp256k1N2, _0n11, _1n11, _2n7, divNearest2, Fpk12, secp256k12; +var init_secp256k12 = __esm({ + "node_modules/ox/node_modules/@noble/curves/esm/secp256k1.js"() { + "use strict"; + init_sha2(); + init_shortw_utils2(); + init_modular2(); + secp256k1P2 = BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"); + secp256k1N2 = BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); + _0n11 = BigInt(0); + _1n11 = BigInt(1); + _2n7 = BigInt(2); + divNearest2 = (a, b) => (a + b / _2n7) / b; + Fpk12 = Field2(secp256k1P2, void 0, void 0, { sqrt: sqrtMod2 }); + secp256k12 = createCurve2({ + a: _0n11, + b: BigInt(7), + Fp: Fpk12, + n: secp256k1N2, + Gx: BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"), + Gy: BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"), + h: BigInt(1), + lowS: true, + // Allow only low-S signatures by default in sign() and verify() + endo: { + // Endomorphism, see above + beta: BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"), + splitScalar: (k) => { + const n = secp256k1N2; + const a1 = BigInt("0x3086d221a7d46bcde86c90e49284eb15"); + const b1 = -_1n11 * BigInt("0xe4437ed6010e88286f547fa90abfe4c3"); + const a2 = BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"); + const b2 = a1; + const POW_2_128 = BigInt("0x100000000000000000000000000000000"); + const c1 = divNearest2(b2 * k, n); + const c2 = divNearest2(-b1 * k, n); + let k1 = mod2(k - c1 * a1 - c2 * a2, n); + let k2 = mod2(-c1 * b1 - c2 * b2, n); + const k1neg = k1 > POW_2_128; + const k2neg = k2 > POW_2_128; + if (k1neg) + k1 = n - k1; + if (k2neg) + k2 = n - k2; + if (k1 > POW_2_128 || k2 > POW_2_128) { + throw new Error("splitScalar: Endomorphism failed, k=" + k); + } + return { k1neg, k1, k2neg, k2 }; + } + } + }, sha256); + } +}); + +// node_modules/ox/_esm/core/Signature.js +function assert5(signature2, options = {}) { + const { recovered } = options; + if (typeof signature2.r === "undefined") + throw new MissingPropertiesError({ signature: signature2 }); + if (typeof signature2.s === "undefined") + throw new MissingPropertiesError({ signature: signature2 }); + if (recovered && typeof signature2.yParity === "undefined") + throw new MissingPropertiesError({ signature: signature2 }); + if (signature2.r < 0n || signature2.r > maxUint2562) + throw new InvalidRError({ value: signature2.r }); + if (signature2.s < 0n || signature2.s > maxUint2562) + throw new InvalidSError({ value: signature2.s }); + if (typeof signature2.yParity === "number" && signature2.yParity !== 0 && signature2.yParity !== 1) + throw new InvalidYParityError({ value: signature2.yParity }); +} +function fromBytes3(signature2) { + return fromHex4(fromBytes(signature2)); +} +function fromHex4(signature2) { + if (signature2.length !== 130 && signature2.length !== 132) + throw new InvalidSerializedSizeError2({ signature: signature2 }); + const r = BigInt(slice3(signature2, 0, 32)); + const s3 = BigInt(slice3(signature2, 32, 64)); + const yParity = (() => { + const yParity2 = Number(`0x${signature2.slice(130)}`); + if (Number.isNaN(yParity2)) + return void 0; + try { + return vToYParity(yParity2); + } catch { + throw new InvalidYParityError({ value: yParity2 }); + } + })(); + if (typeof yParity === "undefined") + return { + r, + s: s3 + }; + return { + r, + s: s3, + yParity + }; +} +function extract2(value) { + if (typeof value.r === "undefined") + return void 0; + if (typeof value.s === "undefined") + return void 0; + return from7(value); +} +function from7(signature2) { + const signature_ = (() => { + if (typeof signature2 === "string") + return fromHex4(signature2); + if (signature2 instanceof Uint8Array) + return fromBytes3(signature2); + if (typeof signature2.r === "string") + return fromRpc2(signature2); + if (signature2.v) + return fromLegacy(signature2); + return { + r: signature2.r, + s: signature2.s, + ...typeof signature2.yParity !== "undefined" ? { yParity: signature2.yParity } : {} + }; + })(); + assert5(signature_); + return signature_; +} +function fromLegacy(signature2) { + return { + r: signature2.r, + s: signature2.s, + yParity: vToYParity(signature2.v) + }; +} +function fromRpc2(signature2) { + const yParity = (() => { + const v = signature2.v ? Number(signature2.v) : void 0; + let yParity2 = signature2.yParity ? Number(signature2.yParity) : void 0; + if (typeof v === "number" && typeof yParity2 !== "number") + yParity2 = vToYParity(v); + if (typeof yParity2 !== "number") + throw new InvalidYParityError({ value: signature2.yParity }); + return yParity2; + })(); + return { + r: BigInt(signature2.r), + s: BigInt(signature2.s), + yParity + }; +} +function toTuple(signature2) { + const { r, s: s3, yParity } = signature2; + return [ + yParity ? "0x01" : "0x", + r === 0n ? "0x" : trimLeft2(fromNumber(r)), + s3 === 0n ? "0x" : trimLeft2(fromNumber(s3)) + ]; +} +function vToYParity(v) { + if (v === 0 || v === 27) + return 0; + if (v === 1 || v === 28) + return 1; + if (v >= 35) + return v % 2 === 0 ? 1 : 0; + throw new InvalidVError({ value: v }); +} +var InvalidSerializedSizeError2, MissingPropertiesError, InvalidRError, InvalidSError, InvalidYParityError, InvalidVError; +var init_Signature = __esm({ + "node_modules/ox/_esm/core/Signature.js"() { + "use strict"; + init_Errors(); + init_Hex(); + init_Json(); + init_Solidity(); + InvalidSerializedSizeError2 = class extends BaseError3 { + constructor({ signature: signature2 }) { + super(`Value \`${signature2}\` is an invalid signature size.`, { + metaMessages: [ + "Expected: 64 bytes or 65 bytes.", + `Received ${size3(from2(signature2))} bytes.` + ] + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Signature.InvalidSerializedSizeError" + }); + } + }; + MissingPropertiesError = class extends BaseError3 { + constructor({ signature: signature2 }) { + super(`Signature \`${stringify2(signature2)}\` is missing either an \`r\`, \`s\`, or \`yParity\` property.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Signature.MissingPropertiesError" + }); + } + }; + InvalidRError = class extends BaseError3 { + constructor({ value }) { + super(`Value \`${value}\` is an invalid r value. r must be a positive integer less than 2^256.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Signature.InvalidRError" + }); + } + }; + InvalidSError = class extends BaseError3 { + constructor({ value }) { + super(`Value \`${value}\` is an invalid s value. s must be a positive integer less than 2^256.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Signature.InvalidSError" + }); + } + }; + InvalidYParityError = class extends BaseError3 { + constructor({ value }) { + super(`Value \`${value}\` is an invalid y-parity value. Y-parity must be 0 or 1.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Signature.InvalidYParityError" + }); + } + }; + InvalidVError = class extends BaseError3 { + constructor({ value }) { + super(`Value \`${value}\` is an invalid v value. v must be 27, 28 or >=35.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "Signature.InvalidVError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/core/Authorization.js +function from8(authorization, options = {}) { + if (typeof authorization.chainId === "string") + return fromRpc3(authorization); + return { ...authorization, ...options.signature }; +} +function fromRpc3(authorization) { + const { address: address2, chainId, nonce } = authorization; + const signature2 = extract2(authorization); + return { + address: address2, + chainId: Number(chainId), + nonce: BigInt(nonce), + ...signature2 + }; +} +function getSignPayload(authorization) { + return hash2(authorization, { presign: true }); +} +function hash2(authorization, options = {}) { + const { presign } = options; + return keccak2562(concat2("0x05", fromHex3(toTuple2(presign ? { + address: authorization.address, + chainId: authorization.chainId, + nonce: authorization.nonce + } : authorization)))); +} +function toTuple2(authorization) { + const { address: address2, chainId, nonce } = authorization; + const signature2 = extract2(authorization); + return [ + chainId ? fromNumber(chainId) : "0x", + address2, + nonce ? fromNumber(nonce) : "0x", + ...signature2 ? toTuple(signature2) : [] + ]; +} +var init_Authorization = __esm({ + "node_modules/ox/_esm/core/Authorization.js"() { + "use strict"; + init_Hash(); + init_Hex(); + init_Rlp(); + init_Signature(); + } +}); + +// node_modules/ox/_esm/core/Secp256k1.js +function recoverAddress2(options) { + return fromPublicKey(recoverPublicKey2(options)); +} +function recoverPublicKey2(options) { + const { payload, signature: signature2 } = options; + const { r, s: s3, yParity } = signature2; + const signature_ = new secp256k12.Signature(BigInt(r), BigInt(s3)).addRecoveryBit(yParity); + const point = signature_.recoverPublicKey(from2(payload).substring(2)); + return from3(point); +} +var init_Secp256k1 = __esm({ + "node_modules/ox/_esm/core/Secp256k1.js"() { + "use strict"; + init_secp256k12(); + init_Address(); + init_Hex(); + init_PublicKey(); + } +}); + +// node_modules/ox/_esm/erc8010/SignatureErc8010.js +var SignatureErc8010_exports = {}; +__export(SignatureErc8010_exports, { + InvalidWrappedSignatureError: () => InvalidWrappedSignatureError, + assert: () => assert6, + from: () => from9, + magicBytes: () => magicBytes, + suffixParameters: () => suffixParameters, + unwrap: () => unwrap, + validate: () => validate4, + wrap: () => wrap +}); +function assert6(value) { + if (typeof value === "string") { + if (slice3(value, -32) !== magicBytes) + throw new InvalidWrappedSignatureError(value); + } else + assert5(value.authorization); +} +function from9(value) { + if (typeof value === "string") + return unwrap(value); + return value; +} +function unwrap(wrapped) { + assert6(wrapped); + const suffixLength = toNumber(slice3(wrapped, -64, -32)); + const suffix = slice3(wrapped, -suffixLength - 64, -64); + const signature2 = slice3(wrapped, 0, -suffixLength - 64); + const [auth, to, data] = decode(suffixParameters, suffix); + const authorization = from8({ + address: auth.delegation, + chainId: Number(auth.chainId), + nonce: auth.nonce, + yParity: auth.yParity, + r: auth.r, + s: auth.s + }); + return { + authorization, + signature: signature2, + ...data && data !== "0x" ? { data, to } : {} + }; +} +function wrap(value) { + const { data, signature: signature2 } = value; + assert6(value); + const self = recoverAddress2({ + payload: getSignPayload(value.authorization), + signature: from7(value.authorization) + }); + const suffix = encode2(suffixParameters, [ + { + ...value.authorization, + delegation: value.authorization.address, + chainId: BigInt(value.authorization.chainId) + }, + value.to ?? self, + data ?? "0x" + ]); + const suffixLength = fromNumber(size3(suffix), { size: 32 }); + return concat2(signature2, suffix, suffixLength, magicBytes); +} +function validate4(value) { + try { + assert6(value); + return true; + } catch { + return false; + } +} +var magicBytes, suffixParameters, InvalidWrappedSignatureError; +var init_SignatureErc8010 = __esm({ + "node_modules/ox/_esm/erc8010/SignatureErc8010.js"() { + "use strict"; + init_AbiParameters(); + init_Authorization(); + init_Errors(); + init_Hex(); + init_Secp256k1(); + init_Signature(); + magicBytes = "0x8010801080108010801080108010801080108010801080108010801080108010"; + suffixParameters = from5("(uint256 chainId, address delegation, uint256 nonce, uint8 yParity, uint256 r, uint256 s), address to, bytes data"); + InvalidWrappedSignatureError = class extends BaseError3 { + constructor(wrapped) { + super(`Value \`${wrapped}\` is an invalid ERC-8010 wrapped signature.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "SignatureErc8010.InvalidWrappedSignatureError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/erc8010/index.js +var init_erc8010 = __esm({ + "node_modules/ox/_esm/erc8010/index.js"() { + "use strict"; + init_SignatureErc8010(); + } +}); + +// node_modules/viem/_esm/utils/index.js +var init_utils7 = __esm({ + "node_modules/viem/_esm/utils/index.js"() { + "use strict"; + init_fromHex(); + } +}); + +// node_modules/viem/_esm/utils/formatters/proof.js +function formatStorageProof(storageProof) { + return storageProof.map((proof) => ({ + ...proof, + value: BigInt(proof.value) + })); +} +function formatProof(proof) { + return { + ...proof, + balance: proof.balance ? BigInt(proof.balance) : void 0, + nonce: proof.nonce ? hexToNumber(proof.nonce) : void 0, + storageProof: proof.storageProof ? formatStorageProof(proof.storageProof) : void 0 + }; +} +var init_proof = __esm({ + "node_modules/viem/_esm/utils/formatters/proof.js"() { + "use strict"; + init_utils7(); + } +}); + +// node_modules/viem/_esm/actions/public/getProof.js +async function getProof(client, { address: address2, blockNumber, blockTag: blockTag_, storageKeys }) { + const blockTag = blockTag_ ?? "latest"; + const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; + const proof = await client.request({ + method: "eth_getProof", + params: [address2, storageKeys, blockNumberHex || blockTag] + }); + return formatProof(proof); +} +var init_getProof = __esm({ + "node_modules/viem/_esm/actions/public/getProof.js"() { + "use strict"; + init_toHex(); + init_proof(); + } +}); + +// node_modules/viem/_esm/actions/public/getStorageAt.js +async function getStorageAt(client, { address: address2, blockNumber, blockTag = "latest", slot }) { + const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; + const data = await client.request({ + method: "eth_getStorageAt", + params: [address2, slot, blockNumberHex || blockTag] + }); + return data; +} +var init_getStorageAt = __esm({ + "node_modules/viem/_esm/actions/public/getStorageAt.js"() { + "use strict"; + init_toHex(); + } +}); + +// node_modules/viem/_esm/actions/public/getTransaction.js +async function getTransaction(client, { blockHash, blockNumber, blockTag: blockTag_, hash: hash3, index: index2, sender, nonce }) { + const blockTag = blockTag_ || "latest"; + const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; + let transaction = null; + if (hash3) { + transaction = await client.request({ + method: "eth_getTransactionByHash", + params: [hash3] + }, { dedupe: true }); + } else if (blockHash) { + transaction = await client.request({ + method: "eth_getTransactionByBlockHashAndIndex", + params: [blockHash, numberToHex(index2)] + }, { dedupe: true }); + } else if ((blockNumberHex || blockTag) && typeof index2 === "number") { + transaction = await client.request({ + method: "eth_getTransactionByBlockNumberAndIndex", + params: [blockNumberHex || blockTag, numberToHex(index2)] + }, { dedupe: Boolean(blockNumberHex) }); + } else if (sender && typeof nonce === "number") { + transaction = await client.request({ + method: "eth_getTransactionBySenderAndNonce", + params: [sender, numberToHex(nonce)] + }, { dedupe: true }); + } + if (!transaction) + throw new TransactionNotFoundError({ + blockHash, + blockNumber, + blockTag, + hash: hash3, + index: index2 + }); + const format = client.chain?.formatters?.transaction?.format || formatTransaction; + return format(transaction, "getTransaction"); +} +var init_getTransaction = __esm({ + "node_modules/viem/_esm/actions/public/getTransaction.js"() { + "use strict"; + init_transaction(); + init_toHex(); + init_transaction2(); + } +}); + +// node_modules/viem/_esm/actions/public/getTransactionConfirmations.js +async function getTransactionConfirmations(client, { hash: hash3, transactionReceipt }) { + const [blockNumber, transaction] = await Promise.all([ + getAction(client, getBlockNumber, "getBlockNumber")({}), + hash3 ? getAction(client, getTransaction, "getTransaction")({ hash: hash3 }) : void 0 + ]); + const transactionBlockNumber = transactionReceipt?.blockNumber || transaction?.blockNumber; + if (!transactionBlockNumber) + return 0n; + return blockNumber - transactionBlockNumber + 1n; +} +var init_getTransactionConfirmations = __esm({ + "node_modules/viem/_esm/actions/public/getTransactionConfirmations.js"() { + "use strict"; + init_getAction(); + init_getBlockNumber(); + init_getTransaction(); + } +}); + +// node_modules/viem/_esm/actions/public/getTransactionReceipt.js +async function getTransactionReceipt(client, { hash: hash3 }) { + const receipt = await client.request({ + method: "eth_getTransactionReceipt", + params: [hash3] + }, { dedupe: true }); + if (!receipt) + throw new TransactionReceiptNotFoundError({ hash: hash3 }); + const format = client.chain?.formatters?.transactionReceipt?.format || formatTransactionReceipt; + return format(receipt, "getTransactionReceipt"); +} +var init_getTransactionReceipt = __esm({ + "node_modules/viem/_esm/actions/public/getTransactionReceipt.js"() { + "use strict"; + init_transaction(); + init_transactionReceipt(); + } +}); + +// node_modules/viem/_esm/actions/public/multicall.js +async function multicall(client, parameters) { + const { account, authorizationList, allowFailure = true, blockNumber, blockOverrides, blockTag, stateOverride } = parameters; + const contracts2 = parameters.contracts; + const { batchSize = parameters.batchSize ?? 1024, deployless = parameters.deployless ?? false } = typeof client.batch?.multicall === "object" ? client.batch.multicall : {}; + const multicallAddress = (() => { + if (parameters.multicallAddress) + return parameters.multicallAddress; + if (deployless) + return null; + if (client.chain) { + return getChainContractAddress({ + blockNumber, + chain: client.chain, + contract: "multicall3" + }); + } + throw new Error("client chain not configured. multicallAddress is required."); + })(); + const chunkedCalls = [[]]; + let currentChunk = 0; + let currentChunkSize = 0; + for (let i = 0; i < contracts2.length; i++) { + const { abi: abi2, address: address2, args, functionName } = contracts2[i]; + try { + const callData = encodeFunctionData({ abi: abi2, args, functionName }); + currentChunkSize += (callData.length - 2) / 2; + if ( + // Check if batching is enabled. + batchSize > 0 && // Check if the current size of the batch exceeds the size limit. + currentChunkSize > batchSize && // Check if the current chunk is not already empty. + chunkedCalls[currentChunk].length > 0 + ) { + currentChunk++; + currentChunkSize = (callData.length - 2) / 2; + chunkedCalls[currentChunk] = []; + } + chunkedCalls[currentChunk] = [ + ...chunkedCalls[currentChunk], + { + allowFailure: true, + callData, + target: address2 + } + ]; + } catch (err) { + const error = getContractError(err, { + abi: abi2, + address: address2, + args, + docsPath: "/docs/contract/multicall", + functionName, + sender: account + }); + if (!allowFailure) + throw error; + chunkedCalls[currentChunk] = [ + ...chunkedCalls[currentChunk], + { + allowFailure: true, + callData: "0x", + target: address2 + } + ]; + } + } + const aggregate3Results = await Promise.allSettled(chunkedCalls.map((calls) => getAction(client, readContract, "readContract")({ + ...multicallAddress === null ? { code: multicall3Bytecode } : { address: multicallAddress }, + abi: multicall3Abi, + account, + args: [calls], + authorizationList, + blockNumber, + blockOverrides, + blockTag, + functionName: "aggregate3", + stateOverride + }))); + const results = []; + for (let i = 0; i < aggregate3Results.length; i++) { + const result = aggregate3Results[i]; + if (result.status === "rejected") { + if (!allowFailure) + throw result.reason; + for (let j = 0; j < chunkedCalls[i].length; j++) { + results.push({ + status: "failure", + error: result.reason, + result: void 0 + }); + } + continue; + } + const aggregate3Result = result.value; + for (let j = 0; j < aggregate3Result.length; j++) { + const { returnData, success } = aggregate3Result[j]; + const { callData } = chunkedCalls[i][j]; + const { abi: abi2, address: address2, functionName, args } = contracts2[results.length]; + try { + if (callData === "0x") + throw new AbiDecodingZeroDataError(); + if (!success) + throw new RawContractError({ data: returnData }); + const result2 = decodeFunctionResult({ + abi: abi2, + args, + data: returnData, + functionName + }); + results.push(allowFailure ? { result: result2, status: "success" } : result2); + } catch (err) { + const error = getContractError(err, { + abi: abi2, + address: address2, + args, + docsPath: "/docs/contract/multicall", + functionName + }); + if (!allowFailure) + throw error; + results.push({ error, result: void 0, status: "failure" }); + } + } + } + if (results.length !== contracts2.length) + throw new BaseError2("multicall results mismatch"); + return results; +} +var init_multicall = __esm({ + "node_modules/viem/_esm/actions/public/multicall.js"() { + "use strict"; + init_abis(); + init_contracts(); + init_abi(); + init_base(); + init_contract(); + init_decodeFunctionResult(); + init_encodeFunctionData(); + init_getChainContractAddress(); + init_getContractError(); + init_getAction(); + init_readContract(); + } +}); + +// node_modules/viem/_esm/actions/public/simulateBlocks.js +async function simulateBlocks(client, parameters) { + const { blockNumber, blockTag = client.experimental_blockTag ?? "latest", blocks, returnFullTransactions, traceTransfers, validation } = parameters; + try { + const blockStateCalls = []; + for (const block2 of blocks) { + const blockOverrides = block2.blockOverrides ? toRpc2(block2.blockOverrides) : void 0; + const calls = block2.calls.map((call_) => { + const call2 = call_; + const account = call2.account ? parseAccount(call2.account) : void 0; + const data = call2.abi ? encodeFunctionData(call2) : call2.data; + const request = { + ...call2, + account, + data: call2.dataSuffix ? concat([data || "0x", call2.dataSuffix]) : data, + from: call2.from ?? account?.address + }; + assertRequest(request); + return formatTransactionRequest(request); + }); + const stateOverrides = block2.stateOverrides ? serializeStateOverride(block2.stateOverrides) : void 0; + blockStateCalls.push({ + blockOverrides, + calls, + stateOverrides + }); + } + const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; + const block = blockNumberHex || blockTag; + const result = await client.request({ + method: "eth_simulateV1", + params: [ + { blockStateCalls, returnFullTransactions, traceTransfers, validation }, + block + ] + }); + return result.map((block2, i) => ({ + ...formatBlock(block2), + calls: block2.calls.map((call2, j) => { + const { abi: abi2, args, functionName, to } = blocks[i].calls[j]; + const data = call2.error?.data ?? call2.returnData; + const gasUsed = BigInt(call2.gasUsed); + const logs = call2.logs?.map((log) => formatLog(log)); + const status = call2.status === "0x1" ? "success" : "failure"; + const result2 = abi2 && status === "success" && data !== "0x" ? decodeFunctionResult({ + abi: abi2, + data, + functionName + }) : null; + const error = (() => { + if (status === "success") + return void 0; + let error2; + if (data === "0x") + error2 = new AbiDecodingZeroDataError(); + else if (data) + error2 = new RawContractError({ data }); + if (!error2) + return void 0; + return getContractError(error2, { + abi: abi2 ?? [], + address: to ?? "0x", + args, + functionName: functionName ?? "" + }); + })(); + return { + data, + gasUsed, + logs, + status, + ...status === "success" ? { + result: result2 + } : { + error + } + }; + }) + })); + } catch (e7) { + const cause = e7; + const error = getNodeError(cause, {}); + if (error instanceof UnknownNodeError) + throw cause; + throw error; + } +} +var init_simulateBlocks = __esm({ + "node_modules/viem/_esm/actions/public/simulateBlocks.js"() { + "use strict"; + init_BlockOverrides(); + init_parseAccount(); + init_abi(); + init_contract(); + init_node(); + init_decodeFunctionResult(); + init_encodeFunctionData(); + init_concat(); + init_toHex(); + init_getContractError(); + init_getNodeError(); + init_block2(); + init_log2(); + init_transactionRequest(); + init_stateOverride2(); + init_assertRequest(); + } +}); + +// node_modules/ox/_esm/core/internal/abiItem.js +function normalizeSignature2(signature2) { + let active = true; + let current = ""; + let level = 0; + let result = ""; + let valid = false; + for (let i = 0; i < signature2.length; i++) { + const char = signature2[i]; + if (["(", ")", ","].includes(char)) + active = true; + if (char === "(") + level++; + if (char === ")") + level--; + if (!active) + continue; + if (level === 0) { + if (char === " " && ["event", "function", "error", ""].includes(result)) + result = ""; + else { + result += char; + if (char === ")") { + valid = true; + break; + } + } + continue; + } + if (char === " ") { + if (signature2[i - 1] !== "," && current !== "," && current !== ",(") { + current = ""; + active = false; + } + continue; + } + result += char; + current += char; + } + if (!valid) + throw new BaseError3("Unable to normalize signature."); + return result; +} +function isArgOfType2(arg, abiParameter) { + const argType = typeof arg; + const abiParameterType = abiParameter.type; + switch (abiParameterType) { + case "address": + return validate3(arg, { strict: false }); + case "bool": + return argType === "boolean"; + case "function": + return argType === "string"; + case "string": + return argType === "string"; + default: { + if (abiParameterType === "tuple" && "components" in abiParameter) + return Object.values(abiParameter.components).every((component, index2) => { + return isArgOfType2(Object.values(arg)[index2], component); + }); + if (/^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(abiParameterType)) + return argType === "number" || argType === "bigint"; + if (/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(abiParameterType)) + return argType === "string" || arg instanceof Uint8Array; + if (/[a-z]+[1-9]{0,3}(\[[0-9]{0,}\])+$/.test(abiParameterType)) { + return Array.isArray(arg) && arg.every((x) => isArgOfType2(x, { + ...abiParameter, + // Pop off `[]` or `[M]` from end of type + type: abiParameterType.replace(/(\[[0-9]{0,}\])$/, "") + })); + } + return false; + } + } +} +function getAmbiguousTypes2(sourceParameters, targetParameters, args) { + for (const parameterIndex in sourceParameters) { + const sourceParameter = sourceParameters[parameterIndex]; + const targetParameter = targetParameters[parameterIndex]; + if (sourceParameter.type === "tuple" && targetParameter.type === "tuple" && "components" in sourceParameter && "components" in targetParameter) + return getAmbiguousTypes2(sourceParameter.components, targetParameter.components, args[parameterIndex]); + const types = [sourceParameter.type, targetParameter.type]; + const ambiguous = (() => { + if (types.includes("address") && types.includes("bytes20")) + return true; + if (types.includes("address") && types.includes("string")) + return validate3(args[parameterIndex], { + strict: false + }); + if (types.includes("address") && types.includes("bytes")) + return validate3(args[parameterIndex], { + strict: false + }); + return false; + })(); + if (ambiguous) + return types; + } + return; +} +var init_abiItem2 = __esm({ + "node_modules/ox/_esm/core/internal/abiItem.js"() { + "use strict"; + init_Address(); + init_Errors(); + } +}); + +// node_modules/ox/_esm/core/AbiItem.js +function from10(abiItem, options = {}) { + const { prepare = true } = options; + const item = (() => { + if (Array.isArray(abiItem)) + return parseAbiItem(abiItem); + if (typeof abiItem === "string") + return parseAbiItem(abiItem); + return abiItem; + })(); + return { + ...item, + ...prepare ? { hash: getSignatureHash(item) } : {} + }; +} +function fromAbi(abi2, name, options) { + const { args = [], prepare = true } = options ?? {}; + const isSelector = validate2(name, { strict: false }); + const abiItems = abi2.filter((abiItem2) => { + if (isSelector) { + if (abiItem2.type === "function" || abiItem2.type === "error") + return getSelector(abiItem2) === slice3(name, 0, 4); + if (abiItem2.type === "event") + return getSignatureHash(abiItem2) === name; + return false; + } + return "name" in abiItem2 && abiItem2.name === name; + }); + if (abiItems.length === 0) + throw new NotFoundError({ name }); + if (abiItems.length === 1) + return { + ...abiItems[0], + ...prepare ? { hash: getSignatureHash(abiItems[0]) } : {} + }; + let matchedAbiItem; + for (const abiItem2 of abiItems) { + if (!("inputs" in abiItem2)) + continue; + if (!args || args.length === 0) { + if (!abiItem2.inputs || abiItem2.inputs.length === 0) + return { + ...abiItem2, + ...prepare ? { hash: getSignatureHash(abiItem2) } : {} + }; + continue; + } + if (!abiItem2.inputs) + continue; + if (abiItem2.inputs.length === 0) + continue; + if (abiItem2.inputs.length !== args.length) + continue; + const matched = args.every((arg, index2) => { + const abiParameter = "inputs" in abiItem2 && abiItem2.inputs[index2]; + if (!abiParameter) + return false; + return isArgOfType2(arg, abiParameter); + }); + if (matched) { + if (matchedAbiItem && "inputs" in matchedAbiItem && matchedAbiItem.inputs) { + const ambiguousTypes = getAmbiguousTypes2(abiItem2.inputs, matchedAbiItem.inputs, args); + if (ambiguousTypes) + throw new AmbiguityError({ + abiItem: abiItem2, + type: ambiguousTypes[0] + }, { + abiItem: matchedAbiItem, + type: ambiguousTypes[1] + }); + } + matchedAbiItem = abiItem2; + } + } + const abiItem = (() => { + if (matchedAbiItem) + return matchedAbiItem; + const [abiItem2, ...overloads] = abiItems; + return { ...abiItem2, overloads }; + })(); + if (!abiItem) + throw new NotFoundError({ name }); + return { + ...abiItem, + ...prepare ? { hash: getSignatureHash(abiItem) } : {} + }; +} +function getSelector(...parameters) { + const abiItem = (() => { + if (Array.isArray(parameters[0])) { + const [abi2, name] = parameters; + return fromAbi(abi2, name); + } + return parameters[0]; + })(); + return slice3(getSignatureHash(abiItem), 0, 4); +} +function getSignature(...parameters) { + const abiItem = (() => { + if (Array.isArray(parameters[0])) { + const [abi2, name] = parameters; + return fromAbi(abi2, name); + } + return parameters[0]; + })(); + const signature2 = (() => { + if (typeof abiItem === "string") + return abiItem; + return formatAbiItem(abiItem); + })(); + return normalizeSignature2(signature2); +} +function getSignatureHash(...parameters) { + const abiItem = (() => { + if (Array.isArray(parameters[0])) { + const [abi2, name] = parameters; + return fromAbi(abi2, name); + } + return parameters[0]; + })(); + if (typeof abiItem !== "string" && "hash" in abiItem && abiItem.hash) + return abiItem.hash; + return keccak2562(fromString2(getSignature(abiItem))); +} +var AmbiguityError, NotFoundError; +var init_AbiItem = __esm({ + "node_modules/ox/_esm/core/AbiItem.js"() { + "use strict"; + init_exports(); + init_Errors(); + init_Hash(); + init_Hex(); + init_abiItem2(); + AmbiguityError = class extends BaseError3 { + constructor(x, y) { + super("Found ambiguous types in overloaded ABI Items.", { + metaMessages: [ + // TODO: abitype to add support for signature-formatted ABI items. + `\`${x.type}\` in \`${normalizeSignature2(formatAbiItem(x.abiItem))}\`, and`, + `\`${y.type}\` in \`${normalizeSignature2(formatAbiItem(y.abiItem))}\``, + "", + "These types encode differently and cannot be distinguished at runtime.", + "Remove one of the ambiguous items in the ABI." + ] + }); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiItem.AmbiguityError" + }); + } + }; + NotFoundError = class extends BaseError3 { + constructor({ name, data, type = "item" }) { + const selector = (() => { + if (name) + return ` with name "${name}"`; + if (data) + return ` with data "${data}"`; + return ""; + })(); + super(`ABI ${type}${selector} not found.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "AbiItem.NotFoundError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/core/AbiConstructor.js +function encode3(...parameters) { + const [abiConstructor, options] = (() => { + if (Array.isArray(parameters[0])) { + const [abi2, options2] = parameters; + return [fromAbi2(abi2), options2]; + } + return parameters; + })(); + const { bytecode, args } = options; + return concat2(bytecode, abiConstructor.inputs?.length && args?.length ? encode2(abiConstructor.inputs, args) : "0x"); +} +function from11(abiConstructor) { + return from10(abiConstructor); +} +function fromAbi2(abi2) { + const item = abi2.find((item2) => item2.type === "constructor"); + if (!item) + throw new NotFoundError({ name: "constructor" }); + return item; +} +var init_AbiConstructor = __esm({ + "node_modules/ox/_esm/core/AbiConstructor.js"() { + "use strict"; + init_AbiItem(); + init_AbiParameters(); + init_Hex(); + } +}); + +// node_modules/ox/_esm/core/AbiFunction.js +function encodeData2(...parameters) { + const [abiFunction, args = []] = (() => { + if (Array.isArray(parameters[0])) { + const [abi2, name, args3] = parameters; + return [fromAbi3(abi2, name, { args: args3 }), args3]; + } + const [abiFunction2, args2] = parameters; + return [abiFunction2, args2]; + })(); + const { overloads } = abiFunction; + const item = overloads ? fromAbi3([abiFunction, ...overloads], abiFunction.name, { + args + }) : abiFunction; + const selector = getSelector2(item); + const data = args.length > 0 ? encode2(item.inputs, args) : void 0; + return data ? concat2(selector, data) : selector; +} +function from12(abiFunction, options = {}) { + return from10(abiFunction, options); +} +function fromAbi3(abi2, name, options) { + const item = fromAbi(abi2, name, options); + if (item.type !== "function") + throw new NotFoundError({ name, type: "function" }); + return item; +} +function getSelector2(abiItem) { + return getSelector(abiItem); +} +var init_AbiFunction = __esm({ + "node_modules/ox/_esm/core/AbiFunction.js"() { + "use strict"; + init_AbiItem(); + init_AbiParameters(); + init_Hex(); + } +}); + +// node_modules/viem/_esm/constants/address.js +var ethAddress, zeroAddress; +var init_address2 = __esm({ + "node_modules/viem/_esm/constants/address.js"() { + "use strict"; + ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; + zeroAddress = "0x0000000000000000000000000000000000000000"; + } +}); + +// node_modules/viem/_esm/actions/public/simulateCalls.js +async function simulateCalls(client, parameters) { + const { blockNumber, blockTag, calls, stateOverrides, traceAssetChanges, traceTransfers, validation } = parameters; + const account = parameters.account ? parseAccount(parameters.account) : void 0; + if (traceAssetChanges && !account) + throw new BaseError2("`account` is required when `traceAssetChanges` is true"); + const getBalanceData = account ? encode3(from11("constructor(bytes, bytes)"), { + bytecode: deploylessCallViaBytecodeBytecode, + args: [ + getBalanceCode, + encodeData2(from12("function getBalance(address)"), [account.address]) + ] + }) : void 0; + const assetAddresses = traceAssetChanges ? await Promise.all(parameters.calls.map(async (call2) => { + if (!call2.data && !call2.abi) + return; + const { accessList } = await createAccessList(client, { + account: account.address, + ...call2, + data: call2.abi ? encodeFunctionData(call2) : call2.data + }); + return accessList.map(({ address: address2, storageKeys }) => storageKeys.length > 0 ? address2 : null); + })).then((x) => x.flat().filter(Boolean)) : []; + const blocks = await simulateBlocks(client, { + blockNumber, + blockTag, + blocks: [ + ...traceAssetChanges ? [ + // ETH pre balances + { + calls: [{ data: getBalanceData }], + stateOverrides + }, + // Asset pre balances + { + calls: assetAddresses.map((address2, i) => ({ + abi: [ + from12("function balanceOf(address) returns (uint256)") + ], + functionName: "balanceOf", + args: [account.address], + to: address2, + from: zeroAddress, + nonce: i + })), + stateOverrides: [ + { + address: zeroAddress, + nonce: 0 + } + ] + } + ] : [], + { + calls: [...calls, { to: zeroAddress }].map((call2) => ({ + ...call2, + from: account?.address + })), + stateOverrides + }, + ...traceAssetChanges ? [ + // ETH post balances + { + calls: [{ data: getBalanceData }] + }, + // Asset post balances + { + calls: assetAddresses.map((address2, i) => ({ + abi: [ + from12("function balanceOf(address) returns (uint256)") + ], + functionName: "balanceOf", + args: [account.address], + to: address2, + from: zeroAddress, + nonce: i + })), + stateOverrides: [ + { + address: zeroAddress, + nonce: 0 + } + ] + }, + // Decimals + { + calls: assetAddresses.map((address2, i) => ({ + to: address2, + abi: [ + from12("function decimals() returns (uint256)") + ], + functionName: "decimals", + from: zeroAddress, + nonce: i + })), + stateOverrides: [ + { + address: zeroAddress, + nonce: 0 + } + ] + }, + // Token URI + { + calls: assetAddresses.map((address2, i) => ({ + to: address2, + abi: [ + from12("function tokenURI(uint256) returns (string)") + ], + functionName: "tokenURI", + args: [0n], + from: zeroAddress, + nonce: i + })), + stateOverrides: [ + { + address: zeroAddress, + nonce: 0 + } + ] + }, + // Symbols + { + calls: assetAddresses.map((address2, i) => ({ + to: address2, + abi: [from12("function symbol() returns (string)")], + functionName: "symbol", + from: zeroAddress, + nonce: i + })), + stateOverrides: [ + { + address: zeroAddress, + nonce: 0 + } + ] + } + ] : [] + ], + traceTransfers, + validation + }); + const block_results = traceAssetChanges ? blocks[2] : blocks[0]; + const [block_ethPre, block_assetsPre, , block_ethPost, block_assetsPost, block_decimals, block_tokenURI, block_symbols] = traceAssetChanges ? blocks : []; + const { calls: block_calls, ...block } = block_results; + const results = block_calls.slice(0, -1) ?? []; + const ethPre = block_ethPre?.calls ?? []; + const assetsPre = block_assetsPre?.calls ?? []; + const balancesPre = [...ethPre, ...assetsPre].map((call2) => call2.status === "success" ? hexToBigInt(call2.data) : null); + const ethPost = block_ethPost?.calls ?? []; + const assetsPost = block_assetsPost?.calls ?? []; + const balancesPost = [...ethPost, ...assetsPost].map((call2) => call2.status === "success" ? hexToBigInt(call2.data) : null); + const decimals = (block_decimals?.calls ?? []).map((x) => x.status === "success" ? x.result : null); + const symbols = (block_symbols?.calls ?? []).map((x) => x.status === "success" ? x.result : null); + const tokenURI = (block_tokenURI?.calls ?? []).map((x) => x.status === "success" ? x.result : null); + const changes = []; + for (const [i, balancePost] of balancesPost.entries()) { + const balancePre = balancesPre[i]; + if (typeof balancePost !== "bigint") + continue; + if (typeof balancePre !== "bigint") + continue; + const decimals_ = decimals[i - 1]; + const symbol_ = symbols[i - 1]; + const tokenURI_ = tokenURI[i - 1]; + const token = (() => { + if (i === 0) + return { + address: ethAddress, + decimals: 18, + symbol: "ETH" + }; + return { + address: assetAddresses[i - 1], + decimals: tokenURI_ || decimals_ ? Number(decimals_ ?? 1) : void 0, + symbol: symbol_ ?? void 0 + }; + })(); + if (changes.some((change) => change.token.address === token.address)) + continue; + changes.push({ + token, + value: { + pre: balancePre, + post: balancePost, + diff: balancePost - balancePre + } + }); + } + return { + assetChanges: changes, + block, + results + }; +} +var getBalanceCode; +var init_simulateCalls = __esm({ + "node_modules/viem/_esm/actions/public/simulateCalls.js"() { + "use strict"; + init_AbiConstructor(); + init_AbiFunction(); + init_parseAccount(); + init_address2(); + init_contracts(); + init_base(); + init_encodeFunctionData(); + init_utils7(); + init_createAccessList(); + init_simulateBlocks(); + getBalanceCode = "0x6080604052348015600e575f80fd5b5061016d8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063f8b2cb4f1461002d575b5f80fd5b610047600480360381019061004291906100db565b61005d565b604051610054919061011e565b60405180910390f35b5f8173ffffffffffffffffffffffffffffffffffffffff16319050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100aa82610081565b9050919050565b6100ba816100a0565b81146100c4575f80fd5b50565b5f813590506100d5816100b1565b92915050565b5f602082840312156100f0576100ef61007d565b5b5f6100fd848285016100c7565b91505092915050565b5f819050919050565b61011881610106565b82525050565b5f6020820190506101315f83018461010f565b9291505056fea26469706673582212203b9fe929fe995c7cf9887f0bdba8a36dd78e8b73f149b17d2d9ad7cd09d2dc6264736f6c634300081a0033"; + } +}); + +// node_modules/ox/_esm/erc6492/SignatureErc6492.js +var SignatureErc6492_exports = {}; +__export(SignatureErc6492_exports, { + InvalidWrappedSignatureError: () => InvalidWrappedSignatureError2, + assert: () => assert7, + from: () => from13, + magicBytes: () => magicBytes2, + universalSignatureValidatorAbi: () => universalSignatureValidatorAbi, + universalSignatureValidatorBytecode: () => universalSignatureValidatorBytecode, + unwrap: () => unwrap2, + validate: () => validate5, + wrap: () => wrap2 +}); +function assert7(wrapped) { + if (slice3(wrapped, -32) !== magicBytes2) + throw new InvalidWrappedSignatureError2(wrapped); +} +function from13(wrapped) { + if (typeof wrapped === "string") + return unwrap2(wrapped); + return wrapped; +} +function unwrap2(wrapped) { + assert7(wrapped); + const [to, data, signature2] = decode(from5("address, bytes, bytes"), wrapped); + return { data, signature: signature2, to }; +} +function wrap2(value) { + const { data, signature: signature2, to } = value; + return concat2(encode2(from5("address, bytes, bytes"), [ + to, + data, + signature2 + ]), magicBytes2); +} +function validate5(wrapped) { + try { + assert7(wrapped); + return true; + } catch { + return false; + } +} +var magicBytes2, universalSignatureValidatorBytecode, universalSignatureValidatorAbi, InvalidWrappedSignatureError2; +var init_SignatureErc6492 = __esm({ + "node_modules/ox/_esm/erc6492/SignatureErc6492.js"() { + "use strict"; + init_AbiParameters(); + init_Errors(); + init_Hex(); + magicBytes2 = "0x6492649264926492649264926492649264926492649264926492649264926492"; + universalSignatureValidatorBytecode = "0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572"; + universalSignatureValidatorAbi = [ + { + inputs: [ + { + name: "_signer", + type: "address" + }, + { + name: "_hash", + type: "bytes32" + }, + { + name: "_signature", + type: "bytes" + } + ], + stateMutability: "nonpayable", + type: "constructor" + }, + { + inputs: [ + { + name: "_signer", + type: "address" + }, + { + name: "_hash", + type: "bytes32" + }, + { + name: "_signature", + type: "bytes" + } + ], + outputs: [ + { + type: "bool" + } + ], + stateMutability: "nonpayable", + type: "function", + name: "isValidSig" + } + ]; + InvalidWrappedSignatureError2 = class extends BaseError3 { + constructor(wrapped) { + super(`Value \`${wrapped}\` is an invalid ERC-6492 wrapped signature.`); + Object.defineProperty(this, "name", { + enumerable: true, + configurable: true, + writable: true, + value: "SignatureErc6492.InvalidWrappedSignatureError" + }); + } + }; + } +}); + +// node_modules/ox/_esm/erc6492/index.js +var init_erc6492 = __esm({ + "node_modules/ox/_esm/erc6492/index.js"() { + "use strict"; + init_SignatureErc6492(); + } +}); + +// node_modules/viem/_esm/utils/signature/serializeSignature.js +function serializeSignature({ r, s: s3, to = "hex", v, yParity }) { + const yParity_ = (() => { + if (yParity === 0 || yParity === 1) + return yParity; + if (v && (v === 27n || v === 28n || v >= 35n)) + return v % 2n === 0n ? 1 : 0; + throw new Error("Invalid `v` or `yParity` value"); + })(); + const signature2 = `0x${new secp256k1.Signature(hexToBigInt(r), hexToBigInt(s3)).toCompactHex()}${yParity_ === 0 ? "1b" : "1c"}`; + if (to === "hex") + return signature2; + return hexToBytes(signature2); +} +var init_serializeSignature = __esm({ + "node_modules/viem/_esm/utils/signature/serializeSignature.js"() { + "use strict"; + init_secp256k1(); + init_fromHex(); + init_toBytes(); + } +}); + +// node_modules/viem/_esm/actions/public/verifyHash.js +async function verifyHash(client, parameters) { + const { address: address2, chain: chain3 = client.chain, hash: hash3, erc6492VerifierAddress: verifierAddress = parameters.universalSignatureVerifierAddress ?? chain3?.contracts?.erc6492Verifier?.address, multicallAddress = parameters.multicallAddress ?? chain3?.contracts?.multicall3?.address, mode = "auto" } = parameters; + if (chain3?.verifyHash) + return await chain3.verifyHash(client, parameters); + const signature2 = (() => { + const signature3 = parameters.signature; + if (isHex(signature3)) + return signature3; + if (typeof signature3 === "object" && "r" in signature3 && "s" in signature3) + return serializeSignature(signature3); + return bytesToHex(signature3); + })(); + try { + if (mode === "eoa") { + try { + const verified = isAddressEqual(getAddress(address2), await recoverAddress({ hash: hash3, signature: signature2 })); + if (verified) + return true; + } catch { + } + } + if (SignatureErc8010_exports.validate(signature2)) + return await verifyErc8010(client, { + ...parameters, + multicallAddress, + signature: signature2 + }); + return await verifyErc6492(client, { + ...parameters, + verifierAddress, + signature: signature2 + }); + } catch (error) { + if (mode !== "eoa") { + try { + const verified = isAddressEqual(getAddress(address2), await recoverAddress({ hash: hash3, signature: signature2 })); + if (verified) + return true; + } catch { + } + } + if (error instanceof VerificationError) { + return false; + } + throw error; + } +} +async function verifyErc8010(client, parameters) { + const { address: address2, blockNumber, blockTag, hash: hash3, multicallAddress } = parameters; + const { authorization: authorization_ox, data: initData, signature: signature2, to } = SignatureErc8010_exports.unwrap(parameters.signature); + const code = await getCode(client, { + address: address2, + blockNumber, + blockTag + }); + if (code === concatHex(["0xef0100", authorization_ox.address])) + return await verifyErc1271(client, { + address: address2, + blockNumber, + blockTag, + hash: hash3, + signature: signature2 + }); + const authorization = { + address: authorization_ox.address, + chainId: Number(authorization_ox.chainId), + nonce: Number(authorization_ox.nonce), + r: numberToHex(authorization_ox.r, { size: 32 }), + s: numberToHex(authorization_ox.s, { size: 32 }), + yParity: authorization_ox.yParity + }; + const valid = await verifyAuthorization({ + address: address2, + authorization + }); + if (!valid) + throw new VerificationError(); + const results = await getAction(client, readContract, "readContract")({ + ...multicallAddress ? { address: multicallAddress } : { code: multicall3Bytecode }, + authorizationList: [authorization], + abi: multicall3Abi, + blockNumber, + blockTag: "pending", + functionName: "aggregate3", + args: [ + [ + ...initData ? [ + { + allowFailure: true, + target: to ?? address2, + callData: initData + } + ] : [], + { + allowFailure: true, + target: address2, + callData: encodeFunctionData({ + abi: erc1271Abi, + functionName: "isValidSignature", + args: [hash3, signature2] + }) + } + ] + ] + }); + const data = results[results.length - 1]?.returnData; + if (data?.startsWith("0x1626ba7e")) + return true; + throw new VerificationError(); +} +async function verifyErc6492(client, parameters) { + const { address: address2, factory, factoryData, hash: hash3, signature: signature2, verifierAddress, ...rest } = parameters; + const wrappedSignature = await (async () => { + if (!factory && !factoryData) + return signature2; + if (SignatureErc6492_exports.validate(signature2)) + return signature2; + return SignatureErc6492_exports.wrap({ + data: factoryData, + signature: signature2, + to: factory + }); + })(); + const args = verifierAddress ? { + to: verifierAddress, + data: encodeFunctionData({ + abi: erc6492SignatureValidatorAbi, + functionName: "isValidSig", + args: [address2, hash3, wrappedSignature] + }), + ...rest + } : { + data: encodeDeployData({ + abi: erc6492SignatureValidatorAbi, + args: [address2, hash3, wrappedSignature], + bytecode: erc6492SignatureValidatorByteCode + }), + ...rest + }; + const { data } = await getAction(client, call, "call")(args).catch((error) => { + if (error instanceof CallExecutionError) + throw new VerificationError(); + throw error; + }); + if (hexToBool(data ?? "0x0")) + return true; + throw new VerificationError(); +} +async function verifyErc1271(client, parameters) { + const { address: address2, blockNumber, blockTag, hash: hash3, signature: signature2 } = parameters; + const result = await getAction(client, readContract, "readContract")({ + address: address2, + abi: erc1271Abi, + args: [hash3, signature2], + blockNumber, + blockTag, + functionName: "isValidSignature" + }).catch((error) => { + if (error instanceof ContractFunctionExecutionError) + throw new VerificationError(); + throw error; + }); + if (result.startsWith("0x1626ba7e")) + return true; + throw new VerificationError(); +} +var VerificationError; +var init_verifyHash = __esm({ + "node_modules/viem/_esm/actions/public/verifyHash.js"() { + "use strict"; + init_erc6492(); + init_erc8010(); + init_abis(); + init_contracts(); + init_contract(); + init_encodeDeployData(); + init_encodeFunctionData(); + init_getAddress(); + init_isAddressEqual(); + init_verifyAuthorization(); + init_concat(); + init_isHex(); + init_fromHex(); + init_toHex(); + init_getAction(); + init_recoverAddress(); + init_serializeSignature(); + init_call(); + init_getCode(); + init_readContract(); + VerificationError = class extends Error { + }; + } +}); + +// node_modules/viem/_esm/actions/public/verifyMessage.js +async function verifyMessage(client, { address: address2, message, factory, factoryData, signature: signature2, ...callRequest }) { + const hash3 = hashMessage(message); + return getAction(client, verifyHash, "verifyHash")({ + address: address2, + factory, + factoryData, + hash: hash3, + signature: signature2, + ...callRequest + }); +} +var init_verifyMessage = __esm({ + "node_modules/viem/_esm/actions/public/verifyMessage.js"() { + "use strict"; + init_getAction(); + init_hashMessage(); + init_verifyHash(); + } +}); + +// node_modules/viem/_esm/actions/public/verifyTypedData.js +async function verifyTypedData(client, parameters) { + const { address: address2, factory, factoryData, signature: signature2, message, primaryType, types, domain, ...callRequest } = parameters; + const hash3 = hashTypedData({ message, primaryType, types, domain }); + return getAction(client, verifyHash, "verifyHash")({ + address: address2, + factory, + factoryData, + hash: hash3, + signature: signature2, + ...callRequest + }); +} +var init_verifyTypedData = __esm({ + "node_modules/viem/_esm/actions/public/verifyTypedData.js"() { + "use strict"; + init_getAction(); + init_hashTypedData(); + init_verifyHash(); + } +}); + +// node_modules/viem/_esm/actions/public/watchBlockNumber.js +function watchBlockNumber(client, { emitOnBegin = false, emitMissed = false, onBlockNumber, onError, poll: poll_, pollingInterval = client.pollingInterval }) { + const enablePolling = (() => { + if (typeof poll_ !== "undefined") + return poll_; + if (client.transport.type === "webSocket" || client.transport.type === "ipc") + return false; + if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) + return false; + return true; + })(); + let prevBlockNumber; + const pollBlockNumber = () => { + const observerId = stringify([ + "watchBlockNumber", + client.uid, + emitOnBegin, + emitMissed, + pollingInterval + ]); + return observe(observerId, { onBlockNumber, onError }, (emit) => poll(async () => { + try { + const blockNumber = await getAction(client, getBlockNumber, "getBlockNumber")({ cacheTime: 0 }); + if (prevBlockNumber !== void 0) { + if (blockNumber === prevBlockNumber) + return; + if (blockNumber - prevBlockNumber > 1 && emitMissed) { + for (let i = prevBlockNumber + 1n; i < blockNumber; i++) { + emit.onBlockNumber(i, prevBlockNumber); + prevBlockNumber = i; + } + } + } + if (prevBlockNumber === void 0 || blockNumber > prevBlockNumber) { + emit.onBlockNumber(blockNumber, prevBlockNumber); + prevBlockNumber = blockNumber; + } + } catch (err) { + emit.onError?.(err); + } + }, { + emitOnBegin, + interval: pollingInterval + })); + }; + const subscribeBlockNumber = () => { + const observerId = stringify([ + "watchBlockNumber", + client.uid, + emitOnBegin, + emitMissed + ]); + return observe(observerId, { onBlockNumber, onError }, (emit) => { + let active = true; + let unsubscribe = () => active = false; + (async () => { + try { + const transport = (() => { + if (client.transport.type === "fallback") { + const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); + if (!transport2) + return client.transport; + return transport2.value; + } + return client.transport; + })(); + const { unsubscribe: unsubscribe_ } = await transport.subscribe({ + params: ["newHeads"], + onData(data) { + if (!active) + return; + const blockNumber = hexToBigInt(data.result?.number); + emit.onBlockNumber(blockNumber, prevBlockNumber); + prevBlockNumber = blockNumber; + }, + onError(error) { + emit.onError?.(error); + } + }); + unsubscribe = unsubscribe_; + if (!active) + unsubscribe(); + } catch (err) { + onError?.(err); + } + })(); + return () => unsubscribe(); + }); + }; + return enablePolling ? pollBlockNumber() : subscribeBlockNumber(); +} +var init_watchBlockNumber = __esm({ + "node_modules/viem/_esm/actions/public/watchBlockNumber.js"() { + "use strict"; + init_fromHex(); + init_getAction(); + init_observe(); + init_poll(); + init_stringify(); + init_getBlockNumber(); + } +}); + +// node_modules/viem/_esm/actions/public/waitForTransactionReceipt.js +async function waitForTransactionReceipt(client, parameters) { + const { + checkReplacement = true, + confirmations = 1, + hash: hash3, + onReplaced, + retryCount = 6, + retryDelay = ({ count }) => ~~(1 << count) * 200, + // exponential backoff + timeout = 18e4 + } = parameters; + const observerId = stringify(["waitForTransactionReceipt", client.uid, hash3]); + const pollingInterval = (() => { + if (parameters.pollingInterval) + return parameters.pollingInterval; + if (client.chain?.experimental_preconfirmationTime) + return client.chain.experimental_preconfirmationTime; + return client.pollingInterval; + })(); + let transaction; + let replacedTransaction; + let receipt; + let retrying = false; + let _unobserve; + let _unwatch; + const { promise, resolve, reject } = withResolvers(); + const timer = timeout ? setTimeout(() => { + _unwatch?.(); + _unobserve?.(); + reject(new WaitForTransactionReceiptTimeoutError({ hash: hash3 })); + }, timeout) : void 0; + _unobserve = observe(observerId, { onReplaced, resolve, reject }, async (emit) => { + receipt = await getAction(client, getTransactionReceipt, "getTransactionReceipt")({ hash: hash3 }).catch(() => void 0); + if (receipt && confirmations <= 1) { + clearTimeout(timer); + emit.resolve(receipt); + _unobserve?.(); + return; + } + _unwatch = getAction(client, watchBlockNumber, "watchBlockNumber")({ + emitMissed: true, + emitOnBegin: true, + poll: true, + pollingInterval, + async onBlockNumber(blockNumber_) { + const done = (fn) => { + clearTimeout(timer); + _unwatch?.(); + fn(); + _unobserve?.(); + }; + let blockNumber = blockNumber_; + if (retrying) + return; + try { + if (receipt) { + if (confirmations > 1 && (!receipt.blockNumber || blockNumber - receipt.blockNumber + 1n < confirmations)) + return; + done(() => emit.resolve(receipt)); + return; + } + if (checkReplacement && !transaction) { + retrying = true; + await withRetry(async () => { + transaction = await getAction(client, getTransaction, "getTransaction")({ hash: hash3 }); + if (transaction.blockNumber) + blockNumber = transaction.blockNumber; + }, { + delay: retryDelay, + retryCount + }); + retrying = false; + } + receipt = await getAction(client, getTransactionReceipt, "getTransactionReceipt")({ hash: hash3 }); + if (confirmations > 1 && (!receipt.blockNumber || blockNumber - receipt.blockNumber + 1n < confirmations)) + return; + done(() => emit.resolve(receipt)); + } catch (err) { + if (err instanceof TransactionNotFoundError || err instanceof TransactionReceiptNotFoundError) { + if (!transaction) { + retrying = false; + return; + } + try { + replacedTransaction = transaction; + retrying = true; + const block = await withRetry(() => getAction(client, getBlock, "getBlock")({ + blockNumber, + includeTransactions: true + }), { + delay: retryDelay, + retryCount, + shouldRetry: ({ error }) => error instanceof BlockNotFoundError + }); + retrying = false; + const replacementTransaction = block.transactions.find(({ from: from14, nonce }) => from14 === replacedTransaction.from && nonce === replacedTransaction.nonce); + if (!replacementTransaction) + return; + receipt = await getAction(client, getTransactionReceipt, "getTransactionReceipt")({ + hash: replacementTransaction.hash + }); + if (confirmations > 1 && (!receipt.blockNumber || blockNumber - receipt.blockNumber + 1n < confirmations)) + return; + let reason = "replaced"; + if (replacementTransaction.to === replacedTransaction.to && replacementTransaction.value === replacedTransaction.value && replacementTransaction.input === replacedTransaction.input) { + reason = "repriced"; + } else if (replacementTransaction.from === replacementTransaction.to && replacementTransaction.value === 0n) { + reason = "cancelled"; + } + done(() => { + emit.onReplaced?.({ + reason, + replacedTransaction, + transaction: replacementTransaction, + transactionReceipt: receipt + }); + emit.resolve(receipt); + }); + } catch (err_) { + done(() => emit.reject(err_)); + } + } else { + done(() => emit.reject(err)); + } + } + } + }); + }); + return promise; +} +var init_waitForTransactionReceipt = __esm({ + "node_modules/viem/_esm/actions/public/waitForTransactionReceipt.js"() { + "use strict"; + init_block(); + init_transaction(); + init_getAction(); + init_observe(); + init_withResolvers(); + init_withRetry(); + init_stringify(); + init_getBlock(); + init_getTransaction(); + init_getTransactionReceipt(); + init_watchBlockNumber(); + } +}); + +// node_modules/viem/_esm/actions/public/watchBlocks.js +function watchBlocks(client, { blockTag = client.experimental_blockTag ?? "latest", emitMissed = false, emitOnBegin = false, onBlock, onError, includeTransactions: includeTransactions_, poll: poll_, pollingInterval = client.pollingInterval }) { + const enablePolling = (() => { + if (typeof poll_ !== "undefined") + return poll_; + if (client.transport.type === "webSocket" || client.transport.type === "ipc") + return false; + if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) + return false; + return true; + })(); + const includeTransactions = includeTransactions_ ?? false; + let prevBlock; + const pollBlocks = () => { + const observerId = stringify([ + "watchBlocks", + client.uid, + blockTag, + emitMissed, + emitOnBegin, + includeTransactions, + pollingInterval + ]); + return observe(observerId, { onBlock, onError }, (emit) => poll(async () => { + try { + const block = await getAction(client, getBlock, "getBlock")({ + blockTag, + includeTransactions + }); + if (block.number !== null && prevBlock?.number != null) { + if (block.number === prevBlock.number) + return; + if (block.number - prevBlock.number > 1 && emitMissed) { + for (let i = prevBlock?.number + 1n; i < block.number; i++) { + const block2 = await getAction(client, getBlock, "getBlock")({ + blockNumber: i, + includeTransactions + }); + emit.onBlock(block2, prevBlock); + prevBlock = block2; + } + } + } + if ( + // If no previous block exists, emit. + prevBlock?.number == null || // If the block tag is "pending" with no block number, emit. + blockTag === "pending" && block?.number == null || // If the next block number is greater than the previous block number, emit. + // We don't want to emit blocks in the past. + block.number !== null && block.number > prevBlock.number + ) { + emit.onBlock(block, prevBlock); + prevBlock = block; + } + } catch (err) { + emit.onError?.(err); + } + }, { + emitOnBegin, + interval: pollingInterval + })); + }; + const subscribeBlocks = () => { + let active = true; + let emitFetched = true; + let unsubscribe = () => active = false; + (async () => { + try { + if (emitOnBegin) { + getAction(client, getBlock, "getBlock")({ + blockTag, + includeTransactions + }).then((block) => { + if (!active) + return; + if (!emitFetched) + return; + onBlock(block, void 0); + emitFetched = false; + }).catch(onError); + } + const transport = (() => { + if (client.transport.type === "fallback") { + const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); + if (!transport2) + return client.transport; + return transport2.value; + } + return client.transport; + })(); + const { unsubscribe: unsubscribe_ } = await transport.subscribe({ + params: ["newHeads"], + async onData(data) { + if (!active) + return; + const block = await getAction(client, getBlock, "getBlock")({ + blockNumber: data.result?.number, + includeTransactions + }).catch(() => { + }); + if (!active) + return; + onBlock(block, prevBlock); + emitFetched = false; + prevBlock = block; + }, + onError(error) { + onError?.(error); + } + }); + unsubscribe = unsubscribe_; + if (!active) + unsubscribe(); + } catch (err) { + onError?.(err); + } + })(); + return () => unsubscribe(); + }; + return enablePolling ? pollBlocks() : subscribeBlocks(); +} +var init_watchBlocks = __esm({ + "node_modules/viem/_esm/actions/public/watchBlocks.js"() { + "use strict"; + init_getAction(); + init_observe(); + init_poll(); + init_stringify(); + init_getBlock(); + } +}); + +// node_modules/viem/_esm/actions/public/watchEvent.js +function watchEvent(client, { address: address2, args, batch = true, event, events, fromBlock, onError, onLogs, poll: poll_, pollingInterval = client.pollingInterval, strict: strict_ }) { + const enablePolling = (() => { + if (typeof poll_ !== "undefined") + return poll_; + if (typeof fromBlock === "bigint") + return true; + if (client.transport.type === "webSocket" || client.transport.type === "ipc") + return false; + if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) + return false; + return true; + })(); + const strict = strict_ ?? false; + const pollEvent = () => { + const observerId = stringify([ + "watchEvent", + address2, + args, + batch, + client.uid, + event, + pollingInterval, + fromBlock + ]); + return observe(observerId, { onLogs, onError }, (emit) => { + let previousBlockNumber; + if (fromBlock !== void 0) + previousBlockNumber = fromBlock - 1n; + let filter; + let initialized = false; + const unwatch = poll(async () => { + if (!initialized) { + try { + filter = await getAction(client, createEventFilter, "createEventFilter")({ + address: address2, + args, + event, + events, + strict, + fromBlock + }); + } catch { + } + initialized = true; + return; + } + try { + let logs; + if (filter) { + logs = await getAction(client, getFilterChanges, "getFilterChanges")({ filter }); + } else { + const blockNumber = await getAction(client, getBlockNumber, "getBlockNumber")({}); + if (previousBlockNumber && previousBlockNumber !== blockNumber) { + logs = await getAction(client, getLogs, "getLogs")({ + address: address2, + args, + event, + events, + fromBlock: previousBlockNumber + 1n, + toBlock: blockNumber + }); + } else { + logs = []; + } + previousBlockNumber = blockNumber; + } + if (logs.length === 0) + return; + if (batch) + emit.onLogs(logs); + else + for (const log of logs) + emit.onLogs([log]); + } catch (err) { + if (filter && err instanceof InvalidInputRpcError) + initialized = false; + emit.onError?.(err); + } + }, { + emitOnBegin: true, + interval: pollingInterval + }); + return async () => { + if (filter) + await getAction(client, uninstallFilter, "uninstallFilter")({ filter }); + unwatch(); + }; + }); + }; + const subscribeEvent = () => { + let active = true; + let unsubscribe = () => active = false; + (async () => { + try { + const transport = (() => { + if (client.transport.type === "fallback") { + const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); + if (!transport2) + return client.transport; + return transport2.value; + } + return client.transport; + })(); + const events_ = events ?? (event ? [event] : void 0); + let topics = []; + if (events_) { + const encoded = events_.flatMap((event2) => encodeEventTopics({ + abi: [event2], + eventName: event2.name, + args + })); + topics = [encoded]; + if (event) + topics = topics[0]; + } + const { unsubscribe: unsubscribe_ } = await transport.subscribe({ + params: ["logs", { address: address2, topics }], + onData(data) { + if (!active) + return; + const log = data.result; + try { + const { eventName, args: args2 } = decodeEventLog({ + abi: events_ ?? [], + data: log.data, + topics: log.topics, + strict + }); + const formatted = formatLog(log, { args: args2, eventName }); + onLogs([formatted]); + } catch (err) { + let eventName; + let isUnnamed; + if (err instanceof DecodeLogDataMismatch || err instanceof DecodeLogTopicsMismatch) { + if (strict_) + return; + eventName = err.abiItem.name; + isUnnamed = err.abiItem.inputs?.some((x) => !("name" in x && x.name)); + } + const formatted = formatLog(log, { + args: isUnnamed ? [] : {}, + eventName + }); + onLogs([formatted]); + } + }, + onError(error) { + onError?.(error); + } + }); + unsubscribe = unsubscribe_; + if (!active) + unsubscribe(); + } catch (err) { + onError?.(err); + } + })(); + return () => unsubscribe(); + }; + return enablePolling ? pollEvent() : subscribeEvent(); +} +var init_watchEvent = __esm({ + "node_modules/viem/_esm/actions/public/watchEvent.js"() { + "use strict"; + init_abi(); + init_rpc(); + init_decodeEventLog(); + init_encodeEventTopics(); + init_log2(); + init_getAction(); + init_observe(); + init_poll(); + init_stringify(); + init_createEventFilter(); + init_getBlockNumber(); + init_getFilterChanges(); + init_getLogs(); + init_uninstallFilter(); + } +}); + +// node_modules/viem/_esm/actions/public/watchPendingTransactions.js +function watchPendingTransactions(client, { batch = true, onError, onTransactions, poll: poll_, pollingInterval = client.pollingInterval }) { + const enablePolling = typeof poll_ !== "undefined" ? poll_ : client.transport.type !== "webSocket" && client.transport.type !== "ipc"; + const pollPendingTransactions = () => { + const observerId = stringify([ + "watchPendingTransactions", + client.uid, + batch, + pollingInterval + ]); + return observe(observerId, { onTransactions, onError }, (emit) => { + let filter; + const unwatch = poll(async () => { + try { + if (!filter) { + try { + filter = await getAction(client, createPendingTransactionFilter, "createPendingTransactionFilter")({}); + return; + } catch (err) { + unwatch(); + throw err; + } + } + const hashes = await getAction(client, getFilterChanges, "getFilterChanges")({ filter }); + if (hashes.length === 0) + return; + if (batch) + emit.onTransactions(hashes); + else + for (const hash3 of hashes) + emit.onTransactions([hash3]); + } catch (err) { + emit.onError?.(err); + } + }, { + emitOnBegin: true, + interval: pollingInterval + }); + return async () => { + if (filter) + await getAction(client, uninstallFilter, "uninstallFilter")({ filter }); + unwatch(); + }; + }); + }; + const subscribePendingTransactions = () => { + let active = true; + let unsubscribe = () => active = false; + (async () => { + try { + const { unsubscribe: unsubscribe_ } = await client.transport.subscribe({ + params: ["newPendingTransactions"], + onData(data) { + if (!active) + return; + const transaction = data.result; + onTransactions([transaction]); + }, + onError(error) { + onError?.(error); + } + }); + unsubscribe = unsubscribe_; + if (!active) + unsubscribe(); + } catch (err) { + onError?.(err); + } + })(); + return () => unsubscribe(); + }; + return enablePolling ? pollPendingTransactions() : subscribePendingTransactions(); +} +var init_watchPendingTransactions = __esm({ + "node_modules/viem/_esm/actions/public/watchPendingTransactions.js"() { + "use strict"; + init_getAction(); + init_observe(); + init_poll(); + init_stringify(); + init_createPendingTransactionFilter(); + init_getFilterChanges(); + init_uninstallFilter(); + } +}); + +// node_modules/viem/_esm/utils/siwe/parseSiweMessage.js +function parseSiweMessage(message) { + const { scheme, statement, ...prefix } = message.match(prefixRegex)?.groups ?? {}; + const { chainId, expirationTime, issuedAt, notBefore, requestId, ...suffix } = message.match(suffixRegex)?.groups ?? {}; + const resources = message.split("Resources:")[1]?.split("\n- ").slice(1); + return { + ...prefix, + ...suffix, + ...chainId ? { chainId: Number(chainId) } : {}, + ...expirationTime ? { expirationTime: new Date(expirationTime) } : {}, + ...issuedAt ? { issuedAt: new Date(issuedAt) } : {}, + ...notBefore ? { notBefore: new Date(notBefore) } : {}, + ...requestId ? { requestId } : {}, + ...resources ? { resources } : {}, + ...scheme ? { scheme } : {}, + ...statement ? { statement } : {} + }; +} +var prefixRegex, suffixRegex; +var init_parseSiweMessage = __esm({ + "node_modules/viem/_esm/utils/siwe/parseSiweMessage.js"() { + "use strict"; + prefixRegex = /^(?:(?[a-zA-Z][a-zA-Z0-9+-.]*):\/\/)?(?[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\n)(?
0x[a-fA-F0-9]{40})\n\n(?:(?.*)\n\n)?/; + suffixRegex = /(?:URI: (?.+))\n(?:Version: (?.+))\n(?:Chain ID: (?\d+))\n(?:Nonce: (?[a-zA-Z0-9]+))\n(?:Issued At: (?.+))(?:\nExpiration Time: (?.+))?(?:\nNot Before: (?.+))?(?:\nRequest ID: (?.+))?/; + } +}); + +// node_modules/viem/_esm/utils/siwe/validateSiweMessage.js +function validateSiweMessage(parameters) { + const { address: address2, domain, message, nonce, scheme, time = /* @__PURE__ */ new Date() } = parameters; + if (domain && message.domain !== domain) + return false; + if (nonce && message.nonce !== nonce) + return false; + if (scheme && message.scheme !== scheme) + return false; + if (message.expirationTime && time >= message.expirationTime) + return false; + if (message.notBefore && time < message.notBefore) + return false; + try { + if (!message.address) + return false; + if (!isAddress(message.address, { strict: false })) + return false; + if (address2 && !isAddressEqual(message.address, address2)) + return false; + } catch { + return false; + } + return true; +} +var init_validateSiweMessage = __esm({ + "node_modules/viem/_esm/utils/siwe/validateSiweMessage.js"() { + "use strict"; + init_isAddress(); + init_isAddressEqual(); + } +}); + +// node_modules/viem/_esm/actions/siwe/verifySiweMessage.js +async function verifySiweMessage(client, parameters) { + const { address: address2, domain, message, nonce, scheme, signature: signature2, time = /* @__PURE__ */ new Date(), ...callRequest } = parameters; + const parsed = parseSiweMessage(message); + if (!parsed.address) + return false; + const isValid2 = validateSiweMessage({ + address: address2, + domain, + message: parsed, + nonce, + scheme, + time + }); + if (!isValid2) + return false; + const hash3 = hashMessage(message); + return verifyHash(client, { + address: parsed.address, + hash: hash3, + signature: signature2, + ...callRequest + }); +} +var init_verifySiweMessage = __esm({ + "node_modules/viem/_esm/actions/siwe/verifySiweMessage.js"() { + "use strict"; + init_hashMessage(); + init_parseSiweMessage(); + init_validateSiweMessage(); + init_verifyHash(); + } +}); + +// node_modules/viem/_esm/actions/wallet/sendRawTransactionSync.js +async function sendRawTransactionSync(client, { serializedTransaction, throwOnReceiptRevert, timeout }) { + const receipt = await client.request({ + method: "eth_sendRawTransactionSync", + params: timeout ? [serializedTransaction, timeout] : [serializedTransaction] + }, { retryCount: 0 }); + const format = client.chain?.formatters?.transactionReceipt?.format || formatTransactionReceipt; + const formatted = format(receipt); + if (formatted.status === "reverted" && throwOnReceiptRevert) + throw new TransactionReceiptRevertedError({ receipt: formatted }); + return formatted; +} +var init_sendRawTransactionSync = __esm({ + "node_modules/viem/_esm/actions/wallet/sendRawTransactionSync.js"() { + "use strict"; + init_transaction(); + init_transactionReceipt(); + } +}); + +// node_modules/viem/_esm/clients/decorators/public.js +function publicActions(client) { + return { + call: (args) => call(client, args), + createAccessList: (args) => createAccessList(client, args), + createBlockFilter: () => createBlockFilter(client), + createContractEventFilter: (args) => createContractEventFilter(client, args), + createEventFilter: (args) => createEventFilter(client, args), + createPendingTransactionFilter: () => createPendingTransactionFilter(client), + estimateContractGas: (args) => estimateContractGas(client, args), + estimateGas: (args) => estimateGas(client, args), + getBalance: (args) => getBalance(client, args), + getBlobBaseFee: () => getBlobBaseFee(client), + getBlock: (args) => getBlock(client, args), + getBlockNumber: (args) => getBlockNumber(client, args), + getBlockTransactionCount: (args) => getBlockTransactionCount(client, args), + getBytecode: (args) => getCode(client, args), + getChainId: () => getChainId(client), + getCode: (args) => getCode(client, args), + getContractEvents: (args) => getContractEvents(client, args), + getDelegation: (args) => getDelegation(client, args), + getEip712Domain: (args) => getEip712Domain(client, args), + getEnsAddress: (args) => getEnsAddress(client, args), + getEnsAvatar: (args) => getEnsAvatar(client, args), + getEnsName: (args) => getEnsName(client, args), + getEnsResolver: (args) => getEnsResolver(client, args), + getEnsText: (args) => getEnsText(client, args), + getFeeHistory: (args) => getFeeHistory(client, args), + estimateFeesPerGas: (args) => estimateFeesPerGas(client, args), + getFilterChanges: (args) => getFilterChanges(client, args), + getFilterLogs: (args) => getFilterLogs(client, args), + getGasPrice: () => getGasPrice(client), + getLogs: (args) => getLogs(client, args), + getProof: (args) => getProof(client, args), + estimateMaxPriorityFeePerGas: (args) => estimateMaxPriorityFeePerGas(client, args), + fillTransaction: (args) => fillTransaction(client, args), + getStorageAt: (args) => getStorageAt(client, args), + getTransaction: (args) => getTransaction(client, args), + getTransactionConfirmations: (args) => getTransactionConfirmations(client, args), + getTransactionCount: (args) => getTransactionCount(client, args), + getTransactionReceipt: (args) => getTransactionReceipt(client, args), + multicall: (args) => multicall(client, args), + prepareTransactionRequest: (args) => prepareTransactionRequest(client, args), + readContract: (args) => readContract(client, args), + sendRawTransaction: (args) => sendRawTransaction(client, args), + sendRawTransactionSync: (args) => sendRawTransactionSync(client, args), + simulate: (args) => simulateBlocks(client, args), + simulateBlocks: (args) => simulateBlocks(client, args), + simulateCalls: (args) => simulateCalls(client, args), + simulateContract: (args) => simulateContract(client, args), + verifyHash: (args) => verifyHash(client, args), + verifyMessage: (args) => verifyMessage(client, args), + verifySiweMessage: (args) => verifySiweMessage(client, args), + verifyTypedData: (args) => verifyTypedData(client, args), + uninstallFilter: (args) => uninstallFilter(client, args), + waitForTransactionReceipt: (args) => waitForTransactionReceipt(client, args), + watchBlocks: (args) => watchBlocks(client, args), + watchBlockNumber: (args) => watchBlockNumber(client, args), + watchContractEvent: (args) => watchContractEvent(client, args), + watchEvent: (args) => watchEvent(client, args), + watchPendingTransactions: (args) => watchPendingTransactions(client, args) + }; +} +var init_public = __esm({ + "node_modules/viem/_esm/clients/decorators/public.js"() { + "use strict"; + init_getEnsAddress(); + init_getEnsAvatar(); + init_getEnsName(); + init_getEnsResolver(); + init_getEnsText(); + init_call(); + init_createAccessList(); + init_createBlockFilter(); + init_createContractEventFilter(); + init_createEventFilter(); + init_createPendingTransactionFilter(); + init_estimateContractGas(); + init_estimateFeesPerGas(); + init_estimateGas2(); + init_estimateMaxPriorityFeePerGas(); + init_fillTransaction(); + init_getBalance(); + init_getBlobBaseFee(); + init_getBlock(); + init_getBlockNumber(); + init_getBlockTransactionCount(); + init_getChainId(); + init_getCode(); + init_getContractEvents(); + init_getDelegation(); + init_getEip712Domain(); + init_getFeeHistory(); + init_getFilterChanges(); + init_getFilterLogs(); + init_getGasPrice(); + init_getLogs(); + init_getProof(); + init_getStorageAt(); + init_getTransaction(); + init_getTransactionConfirmations(); + init_getTransactionCount(); + init_getTransactionReceipt(); + init_multicall(); + init_readContract(); + init_simulateBlocks(); + init_simulateCalls(); + init_simulateContract(); + init_uninstallFilter(); + init_verifyHash(); + init_verifyMessage(); + init_verifyTypedData(); + init_waitForTransactionReceipt(); + init_watchBlockNumber(); + init_watchBlocks(); + init_watchContractEvent(); + init_watchEvent(); + init_watchPendingTransactions(); + init_verifySiweMessage(); + init_prepareTransactionRequest(); + init_sendRawTransaction(); + init_sendRawTransactionSync(); + } +}); + +// node_modules/viem/_esm/clients/createPublicClient.js +function createPublicClient(parameters) { + const { key = "public", name = "Public Client" } = parameters; + const client = createClient({ + ...parameters, + key, + name, + type: "publicClient" + }); + return client.extend(publicActions); +} +var init_createPublicClient = __esm({ + "node_modules/viem/_esm/clients/createPublicClient.js"() { + "use strict"; + init_createClient(); + init_public(); + } +}); + +// node_modules/viem/_esm/clients/transports/createTransport.js +function createTransport({ key, methods, name, request, retryCount = 3, retryDelay = 150, timeout, type }, value) { + const uid2 = uid(); + return { + config: { + key, + methods, + name, + request, + retryCount, + retryDelay, + timeout, + type + }, + request: buildRequest(request, { methods, retryCount, retryDelay, uid: uid2 }), + value + }; +} +var init_createTransport = __esm({ + "node_modules/viem/_esm/clients/transports/createTransport.js"() { + "use strict"; + init_buildRequest(); + init_uid(); + } +}); + +// node_modules/viem/_esm/errors/transport.js +var UrlRequiredError; +var init_transport = __esm({ + "node_modules/viem/_esm/errors/transport.js"() { + "use strict"; + init_base(); + UrlRequiredError = class extends BaseError2 { + constructor() { + super("No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.", { + docsPath: "/docs/clients/intro", + name: "UrlRequiredError" + }); + } + }; + } +}); + +// node_modules/viem/_esm/clients/transports/http.js +function http(url, config = {}) { + const { batch, fetchFn, fetchOptions, key = "http", methods, name = "HTTP JSON-RPC", onFetchRequest, onFetchResponse, retryDelay, raw } = config; + return ({ chain: chain3, retryCount: retryCount_, timeout: timeout_ }) => { + const { batchSize = 1e3, wait: wait2 = 0 } = typeof batch === "object" ? batch : {}; + const retryCount = config.retryCount ?? retryCount_; + const timeout = timeout_ ?? config.timeout ?? 1e4; + const url_ = url || chain3?.rpcUrls.default.http[0]; + if (!url_) + throw new UrlRequiredError(); + const rpcClient = getHttpRpcClient(url_, { + fetchFn, + fetchOptions, + onRequest: onFetchRequest, + onResponse: onFetchResponse, + timeout + }); + return createTransport({ + key, + methods, + name, + async request({ method, params }) { + const body = { method, params }; + const { schedule } = createBatchScheduler({ + id: url_, + wait: wait2, + shouldSplitBatch(requests) { + return requests.length > batchSize; + }, + fn: (body2) => rpcClient.request({ + body: body2 + }), + sort: (a, b) => a.id - b.id + }); + const fn = async (body2) => batch ? schedule(body2) : [ + await rpcClient.request({ + body: body2 + }) + ]; + const [{ error, result }] = await fn(body); + if (raw) + return { error, result }; + if (error) + throw new RpcRequestError({ + body, + error, + url: url_ + }); + return result; + }, + retryCount, + retryDelay, + timeout, + type: "http" + }, { + fetchOptions, + url: url_ + }); + }; +} +var init_http2 = __esm({ + "node_modules/viem/_esm/clients/transports/http.js"() { + "use strict"; + init_request(); + init_transport(); + init_createBatchScheduler(); + init_http(); + init_createTransport(); + } +}); + +// node_modules/viem/_esm/index.js +var init_esm = __esm({ + "node_modules/viem/_esm/index.js"() { + "use strict"; + init_createPublicClient(); + init_http2(); + init_abis(); + init_number(); + init_encodeFunctionData(); + init_getAddress(); + init_toHex(); + } +}); + +// node_modules/viem/_esm/op-stack/contracts.js +var contracts; +var init_contracts2 = __esm({ + "node_modules/viem/_esm/op-stack/contracts.js"() { + "use strict"; + contracts = { + gasPriceOracle: { address: "0x420000000000000000000000000000000000000F" }, + l1Block: { address: "0x4200000000000000000000000000000000000015" }, + l2CrossDomainMessenger: { + address: "0x4200000000000000000000000000000000000007" + }, + l2Erc721Bridge: { address: "0x4200000000000000000000000000000000000014" }, + l2StandardBridge: { address: "0x4200000000000000000000000000000000000010" }, + l2ToL1MessagePasser: { + address: "0x4200000000000000000000000000000000000016" + } + }; + } +}); + +// node_modules/viem/_esm/op-stack/formatters.js +var formatters; +var init_formatters = __esm({ + "node_modules/viem/_esm/op-stack/formatters.js"() { + "use strict"; + init_fromHex(); + init_block2(); + init_transaction2(); + init_transactionReceipt(); + formatters = { + block: /* @__PURE__ */ defineBlock({ + format(args) { + const transactions = args.transactions?.map((transaction) => { + if (typeof transaction === "string") + return transaction; + const formatted = formatTransaction(transaction); + if (formatted.typeHex === "0x7e") { + formatted.isSystemTx = transaction.isSystemTx; + formatted.mint = transaction.mint ? hexToBigInt(transaction.mint) : void 0; + formatted.sourceHash = transaction.sourceHash; + formatted.type = "deposit"; + } + return formatted; + }); + return { + transactions, + stateRoot: args.stateRoot + }; + } + }), + transaction: /* @__PURE__ */ defineTransaction({ + format(args) { + const transaction = {}; + if (args.type === "0x7e") { + transaction.isSystemTx = args.isSystemTx; + transaction.mint = args.mint ? hexToBigInt(args.mint) : void 0; + transaction.sourceHash = args.sourceHash; + transaction.type = "deposit"; + } + return transaction; + } + }), + transactionReceipt: /* @__PURE__ */ defineTransactionReceipt({ + format(args) { + return { + l1GasPrice: args.l1GasPrice ? hexToBigInt(args.l1GasPrice) : null, + l1GasUsed: args.l1GasUsed ? hexToBigInt(args.l1GasUsed) : null, + l1Fee: args.l1Fee ? hexToBigInt(args.l1Fee) : null, + l1FeeScalar: args.l1FeeScalar ? Number(args.l1FeeScalar) : null + }; + } + }) + }; + } +}); + +// node_modules/viem/_esm/op-stack/serializers.js +function serializeTransaction2(transaction, signature2) { + if (isDeposit(transaction)) + return serializeTransactionDeposit(transaction); + return serializeTransaction(transaction, signature2); +} +function serializeTransactionDeposit(transaction) { + assertTransactionDeposit(transaction); + const { sourceHash, data, from: from14, gas, isSystemTx, mint, to, value } = transaction; + const serializedTransaction = [ + sourceHash, + from14, + to ?? "0x", + mint ? toHex(mint) : "0x", + value ? toHex(value) : "0x", + gas ? toHex(gas) : "0x", + isSystemTx ? "0x1" : "0x", + data ?? "0x" + ]; + return concatHex([ + "0x7e", + toRlp(serializedTransaction) + ]); +} +function isDeposit(transaction) { + if (transaction.type === "deposit") + return true; + if (typeof transaction.sourceHash !== "undefined") + return true; + return false; +} +function assertTransactionDeposit(transaction) { + const { from: from14, to } = transaction; + if (from14 && !isAddress(from14)) + throw new InvalidAddressError({ address: from14 }); + if (to && !isAddress(to)) + throw new InvalidAddressError({ address: to }); +} +var serializers; +var init_serializers = __esm({ + "node_modules/viem/_esm/op-stack/serializers.js"() { + "use strict"; + init_address(); + init_isAddress(); + init_concat(); + init_toHex(); + init_toRlp(); + init_serializeTransaction(); + serializers = { + transaction: serializeTransaction2 + }; + } +}); + +// node_modules/viem/_esm/op-stack/chainConfig.js +var chainConfig; +var init_chainConfig = __esm({ + "node_modules/viem/_esm/op-stack/chainConfig.js"() { + "use strict"; + init_contracts2(); + init_formatters(); + init_serializers(); + chainConfig = { + blockTime: 2e3, + contracts, + formatters, + serializers + }; + } +}); + +// node_modules/viem/_esm/chains/definitions/base.js +var sourceId, base, basePreconf; +var init_base2 = __esm({ + "node_modules/viem/_esm/chains/definitions/base.js"() { + "use strict"; + init_chainConfig(); + init_defineChain(); + sourceId = 1; + base = /* @__PURE__ */ defineChain({ + ...chainConfig, + id: 8453, + name: "Base", + nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 }, + rpcUrls: { + default: { + http: ["https://mainnet.base.org"] + } + }, + blockExplorers: { + default: { + name: "Basescan", + url: "https://basescan.org", + apiUrl: "https://api.basescan.org/api" + } + }, + contracts: { + ...chainConfig.contracts, + disputeGameFactory: { + [sourceId]: { + address: "0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e" + } + }, + l2OutputOracle: { + [sourceId]: { + address: "0x56315b90c40730925ec5485cf004d835058518A0" + } + }, + multicall3: { + address: "0xca11bde05977b3631167028862be2a173976ca11", + blockCreated: 5022 + }, + portal: { + [sourceId]: { + address: "0x49048044D57e1C92A77f79988d21Fa8fAF74E97e", + blockCreated: 17482143 + } + }, + l1StandardBridge: { + [sourceId]: { + address: "0x3154Cf16ccdb4C6d922629664174b904d80F2C35", + blockCreated: 17482143 + } + } + }, + sourceId + }); + basePreconf = /* @__PURE__ */ defineChain({ + ...base, + experimental_preconfirmationTime: 200, + rpcUrls: { + default: { + http: ["https://mainnet-preconf.base.org"] + } + } + }); + } +}); + +// node_modules/viem/_esm/chains/index.js +var init_chains = __esm({ + "node_modules/viem/_esm/chains/index.js"() { + "use strict"; + init_base2(); + } +}); + +// node_modules/@scure/base/lib/esm/index.js +function isBytes4(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; +} +function isArrayOf(isString, arr) { + if (!Array.isArray(arr)) + return false; + if (arr.length === 0) + return true; + if (isString) { + return arr.every((item) => typeof item === "string"); + } else { + return arr.every((item) => Number.isSafeInteger(item)); + } +} +function afn(input) { + if (typeof input !== "function") + throw new Error("function expected"); + return true; +} +function astr(label, input) { + if (typeof input !== "string") + throw new Error(`${label}: string expected`); + return true; +} +function anumber2(n) { + if (!Number.isSafeInteger(n)) + throw new Error(`invalid integer: ${n}`); +} +function aArr(input) { + if (!Array.isArray(input)) + throw new Error("array expected"); +} +function astrArr(label, input) { + if (!isArrayOf(true, input)) + throw new Error(`${label}: array of strings expected`); +} +function anumArr(label, input) { + if (!isArrayOf(false, input)) + throw new Error(`${label}: array of numbers expected`); +} +// @__NO_SIDE_EFFECTS__ +function chain(...args) { + const id = (a) => a; + const wrap3 = (a, b) => (c2) => a(b(c2)); + const encode4 = args.map((x) => x.encode).reduceRight(wrap3, id); + const decode2 = args.map((x) => x.decode).reduce(wrap3, id); + return { encode: encode4, decode: decode2 }; +} +// @__NO_SIDE_EFFECTS__ +function alphabet(letters) { + const lettersA = typeof letters === "string" ? letters.split("") : letters; + const len = lettersA.length; + astrArr("alphabet", lettersA); + const indexes = new Map(lettersA.map((l2, i) => [l2, i])); + return { + encode: (digits) => { + aArr(digits); + return digits.map((i) => { + if (!Number.isSafeInteger(i) || i < 0 || i >= len) + throw new Error(`alphabet.encode: digit index outside alphabet "${i}". Allowed: ${letters}`); + return lettersA[i]; + }); + }, + decode: (input) => { + aArr(input); + return input.map((letter) => { + astr("alphabet.decode", letter); + const i = indexes.get(letter); + if (i === void 0) + throw new Error(`Unknown letter: "${letter}". Allowed: ${letters}`); + return i; + }); + } + }; +} +// @__NO_SIDE_EFFECTS__ +function join(separator = "") { + astr("join", separator); + return { + encode: (from14) => { + astrArr("join.decode", from14); + return from14.join(separator); + }, + decode: (to) => { + astr("join.decode", to); + return to.split(separator); + } + }; +} +// @__NO_SIDE_EFFECTS__ +function padding(bits, chr = "=") { + anumber2(bits); + astr("padding", chr); + return { + encode(data) { + astrArr("padding.encode", data); + while (data.length * bits % 8) + data.push(chr); + return data; + }, + decode(input) { + astrArr("padding.decode", input); + let end = input.length; + if (end * bits % 8) + throw new Error("padding: invalid, string should have whole number of bytes"); + for (; end > 0 && input[end - 1] === chr; end--) { + const last = end - 1; + const byte = last * bits; + if (byte % 8 === 0) + throw new Error("padding: invalid, string has too much padding"); + } + return input.slice(0, end); + } + }; +} +function convertRadix(data, from14, to) { + if (from14 < 2) + throw new Error(`convertRadix: invalid from=${from14}, base cannot be less than 2`); + if (to < 2) + throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`); + aArr(data); + if (!data.length) + return []; + let pos = 0; + const res = []; + const digits = Array.from(data, (d) => { + anumber2(d); + if (d < 0 || d >= from14) + throw new Error(`invalid integer: ${d}`); + return d; + }); + const dlen = digits.length; + while (true) { + let carry = 0; + let done = true; + for (let i = pos; i < dlen; i++) { + const digit = digits[i]; + const fromCarry = from14 * carry; + const digitBase = fromCarry + digit; + if (!Number.isSafeInteger(digitBase) || fromCarry / from14 !== carry || digitBase - digit !== fromCarry) { + throw new Error("convertRadix: carry overflow"); + } + const div = digitBase / to; + carry = digitBase % to; + const rounded = Math.floor(div); + digits[i] = rounded; + if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase) + throw new Error("convertRadix: carry overflow"); + if (!done) + continue; + else if (!rounded) + pos = i; + else + done = false; + } + res.push(carry); + if (done) + break; + } + for (let i = 0; i < data.length - 1 && data[i] === 0; i++) + res.push(0); + return res.reverse(); +} +function convertRadix2(data, from14, to, padding2) { + aArr(data); + if (from14 <= 0 || from14 > 32) + throw new Error(`convertRadix2: wrong from=${from14}`); + if (to <= 0 || to > 32) + throw new Error(`convertRadix2: wrong to=${to}`); + if (/* @__PURE__ */ radix2carry(from14, to) > 32) { + throw new Error(`convertRadix2: carry overflow from=${from14} to=${to} carryBits=${/* @__PURE__ */ radix2carry(from14, to)}`); + } + let carry = 0; + let pos = 0; + const max = powers[from14]; + const mask = powers[to] - 1; + const res = []; + for (const n of data) { + anumber2(n); + if (n >= max) + throw new Error(`convertRadix2: invalid data word=${n} from=${from14}`); + carry = carry << from14 | n; + if (pos + from14 > 32) + throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from14}`); + pos += from14; + for (; pos >= to; pos -= to) + res.push((carry >> pos - to & mask) >>> 0); + const pow = powers[pos]; + if (pow === void 0) + throw new Error("invalid carry"); + carry &= pow - 1; + } + carry = carry << to - pos & mask; + if (!padding2 && pos >= from14) + throw new Error("Excess padding"); + if (!padding2 && carry > 0) + throw new Error(`Non-zero padding: ${carry}`); + if (padding2 && pos > 0) + res.push(carry >>> 0); + return res; +} +// @__NO_SIDE_EFFECTS__ +function radix(num2) { + anumber2(num2); + const _256 = 2 ** 8; + return { + encode: (bytes) => { + if (!isBytes4(bytes)) + throw new Error("radix.encode input should be Uint8Array"); + return convertRadix(Array.from(bytes), _256, num2); + }, + decode: (digits) => { + anumArr("radix.decode", digits); + return Uint8Array.from(convertRadix(digits, num2, _256)); + } + }; +} +// @__NO_SIDE_EFFECTS__ +function radix2(bits, revPadding = false) { + anumber2(bits); + if (bits <= 0 || bits > 32) + throw new Error("radix2: bits should be in (0..32]"); + if (/* @__PURE__ */ radix2carry(8, bits) > 32 || /* @__PURE__ */ radix2carry(bits, 8) > 32) + throw new Error("radix2: carry overflow"); + return { + encode: (bytes) => { + if (!isBytes4(bytes)) + throw new Error("radix2.encode input should be Uint8Array"); + return convertRadix2(Array.from(bytes), 8, bits, !revPadding); + }, + decode: (digits) => { + anumArr("radix2.decode", digits); + return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding)); + } + }; +} +function checksum3(len, fn) { + anumber2(len); + afn(fn); + return { + encode(data) { + if (!isBytes4(data)) + throw new Error("checksum.encode: input should be Uint8Array"); + const sum = fn(data).slice(0, len); + const res = new Uint8Array(data.length + len); + res.set(data); + res.set(sum, data.length); + return res; + }, + decode(data) { + if (!isBytes4(data)) + throw new Error("checksum.decode: input should be Uint8Array"); + const payload = data.slice(0, -len); + const oldChecksum = data.slice(-len); + const newChecksum = fn(payload).slice(0, len); + for (let i = 0; i < len; i++) + if (newChecksum[i] !== oldChecksum[i]) + throw new Error("Invalid checksum"); + return payload; + } + }; +} +var gcd, radix2carry, powers, utils; +var init_esm2 = __esm({ + "node_modules/@scure/base/lib/esm/index.js"() { + "use strict"; + gcd = (a, b) => b === 0 ? a : gcd(b, a % b); + radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from14, to) => from14 + (to - gcd(from14, to)); + powers = /* @__PURE__ */ (() => { + let res = []; + for (let i = 0; i < 40; i++) + res.push(2 ** i); + return res; + })(); + utils = { + alphabet, + chain, + checksum: checksum3, + convertRadix, + convertRadix2, + radix, + radix2, + join, + padding + }; + } +}); + +// node_modules/@noble/hashes/esm/pbkdf2.js +function pbkdf2Init(hash3, _password, _salt, _opts) { + ahash(hash3); + const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts); + const { c: c2, dkLen, asyncTick } = opts; + anumber(c2); + anumber(dkLen); + anumber(asyncTick); + if (c2 < 1) + throw new Error("iterations (c) should be >= 1"); + const password = kdfInputToBytes(_password); + const salt = kdfInputToBytes(_salt); + const DK = new Uint8Array(dkLen); + const PRF = hmac.create(hash3, password); + const PRFSalt = PRF._cloneInto().update(salt); + return { c: c2, dkLen, asyncTick, DK, PRF, PRFSalt }; +} +function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) { + PRF.destroy(); + PRFSalt.destroy(); + if (prfW) + prfW.destroy(); + clean(u); + return DK; +} +function pbkdf2(hash3, password, salt, opts) { + const { c: c2, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash3, password, salt, opts); + let prfW; + const arr = new Uint8Array(4); + const view = createView(arr); + const u = new Uint8Array(PRF.outputLen); + for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) { + const Ti = DK.subarray(pos, pos + PRF.outputLen); + view.setInt32(0, ti, false); + (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u); + Ti.set(u.subarray(0, Ti.length)); + for (let ui = 1; ui < c2; ui++) { + PRF._cloneInto(prfW).update(u).digestInto(u); + for (let i = 0; i < Ti.length; i++) + Ti[i] ^= u[i]; + } + } + return pbkdf2Output(PRF, PRFSalt, DK, prfW, u); +} +var init_pbkdf2 = __esm({ + "node_modules/@noble/hashes/esm/pbkdf2.js"() { + "use strict"; + init_hmac(); + init_utils2(); + } +}); + +// node_modules/@scure/bip39/esm/index.js +function nfkd(str) { + if (typeof str !== "string") + throw new TypeError("invalid mnemonic type: " + typeof str); + return str.normalize("NFKD"); +} +function normalize(str) { + const norm = nfkd(str); + const words = norm.split(" "); + if (![12, 15, 18, 21, 24].includes(words.length)) + throw new Error("Invalid mnemonic"); + return { nfkd: norm, words }; +} +function aentropy(ent) { + abytes(ent, 16, 20, 24, 28, 32); +} +function generateMnemonic(wordlist2, strength = 128) { + anumber(strength); + if (strength % 32 !== 0 || strength > 256) + throw new TypeError("Invalid entropy"); + return entropyToMnemonic(randomBytes(strength / 8), wordlist2); +} +function getCoder(wordlist2) { + if (!Array.isArray(wordlist2) || wordlist2.length !== 2048 || typeof wordlist2[0] !== "string") + throw new Error("Wordlist: expected array of 2048 strings"); + wordlist2.forEach((i) => { + if (typeof i !== "string") + throw new Error("wordlist: non-string element: " + i); + }); + return utils.chain(utils.checksum(1, calcChecksum), utils.radix2(11, true), utils.alphabet(wordlist2)); +} +function mnemonicToEntropy(mnemonic, wordlist2) { + const { words } = normalize(mnemonic); + const entropy = getCoder(wordlist2).decode(words); + aentropy(entropy); + return entropy; +} +function entropyToMnemonic(entropy, wordlist2) { + aentropy(entropy); + const words = getCoder(wordlist2).encode(entropy); + return words.join(isJapanese(wordlist2) ? "\u3000" : " "); +} +function validateMnemonic(mnemonic, wordlist2) { + try { + mnemonicToEntropy(mnemonic, wordlist2); + } catch (e7) { + return false; + } + return true; +} +function mnemonicToSeedSync(mnemonic, passphrase = "") { + return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 }); +} +var isJapanese, calcChecksum, psalt; +var init_esm3 = __esm({ + "node_modules/@scure/bip39/esm/index.js"() { + "use strict"; + init_pbkdf2(); + init_sha2(); + init_utils2(); + init_esm2(); + isJapanese = (wordlist2) => wordlist2[0] === "\u3042\u3044\u3053\u304F\u3057\u3093"; + calcChecksum = (entropy) => { + const bitsLeft = 8 - entropy.length / 4; + return new Uint8Array([sha256(entropy)[0] >> bitsLeft << bitsLeft]); + }; + psalt = (passphrase) => nfkd("mnemonic" + passphrase); + } +}); + +// node_modules/viem/_esm/accounts/toAccount.js +function toAccount(source) { + if (typeof source === "string") { + if (!isAddress(source, { strict: false })) + throw new InvalidAddressError({ address: source }); + return { + address: source, + type: "json-rpc" + }; + } + if (!isAddress(source.address, { strict: false })) + throw new InvalidAddressError({ address: source.address }); + return { + address: source.address, + nonceManager: source.nonceManager, + sign: source.sign, + signAuthorization: source.signAuthorization, + signMessage: source.signMessage, + signTransaction: source.signTransaction, + signTypedData: source.signTypedData, + source: "custom", + type: "local" + }; +} +var init_toAccount = __esm({ + "node_modules/viem/_esm/accounts/toAccount.js"() { + "use strict"; + init_address(); + init_isAddress(); + } +}); + +// node_modules/viem/_esm/accounts/utils/sign.js +async function sign({ hash: hash3, privateKey, to = "object" }) { + const { r, s: s3, recovery } = secp256k1.sign(hash3.slice(2), privateKey.slice(2), { + lowS: true, + extraEntropy: isHex(extraEntropy, { strict: false }) ? hexToBytes(extraEntropy) : extraEntropy + }); + const signature2 = { + r: numberToHex(r, { size: 32 }), + s: numberToHex(s3, { size: 32 }), + v: recovery ? 28n : 27n, + yParity: recovery + }; + return (() => { + if (to === "bytes" || to === "hex") + return serializeSignature({ ...signature2, to }); + return signature2; + })(); +} +var extraEntropy; +var init_sign = __esm({ + "node_modules/viem/_esm/accounts/utils/sign.js"() { + "use strict"; + init_secp256k1(); + init_isHex(); + init_toBytes(); + init_toHex(); + init_serializeSignature(); + extraEntropy = false; + } +}); + +// node_modules/viem/_esm/accounts/utils/signAuthorization.js +async function signAuthorization(parameters) { + const { chainId, nonce, privateKey, to = "object" } = parameters; + const address2 = parameters.contractAddress ?? parameters.address; + const signature2 = await sign({ + hash: hashAuthorization({ address: address2, chainId, nonce }), + privateKey, + to + }); + if (to === "object") + return { + address: address2, + chainId, + nonce, + ...signature2 + }; + return signature2; +} +var init_signAuthorization = __esm({ + "node_modules/viem/_esm/accounts/utils/signAuthorization.js"() { + "use strict"; + init_hashAuthorization(); + init_sign(); + } +}); + +// node_modules/viem/_esm/accounts/utils/signMessage.js +async function signMessage({ message, privateKey }) { + return await sign({ hash: hashMessage(message), privateKey, to: "hex" }); +} +var init_signMessage = __esm({ + "node_modules/viem/_esm/accounts/utils/signMessage.js"() { + "use strict"; + init_hashMessage(); + init_sign(); + } +}); + +// node_modules/viem/_esm/accounts/utils/signTransaction.js +async function signTransaction(parameters) { + const { privateKey, transaction, serializer = serializeTransaction } = parameters; + const signableTransaction = (() => { + if (transaction.type === "eip4844") + return { + ...transaction, + sidecars: false + }; + return transaction; + })(); + const signature2 = await sign({ + hash: keccak256(await serializer(signableTransaction)), + privateKey + }); + return await serializer(transaction, signature2); +} +var init_signTransaction = __esm({ + "node_modules/viem/_esm/accounts/utils/signTransaction.js"() { + "use strict"; + init_keccak256(); + init_serializeTransaction(); + init_sign(); + } +}); + +// node_modules/viem/_esm/accounts/utils/signTypedData.js +async function signTypedData(parameters) { + const { privateKey, ...typedData } = parameters; + return await sign({ + hash: hashTypedData(typedData), + privateKey, + to: "hex" + }); +} +var init_signTypedData = __esm({ + "node_modules/viem/_esm/accounts/utils/signTypedData.js"() { + "use strict"; + init_hashTypedData(); + init_sign(); + } +}); + +// node_modules/viem/_esm/accounts/privateKeyToAccount.js +function privateKeyToAccount(privateKey, options = {}) { + const { nonceManager } = options; + const publicKey = toHex(secp256k1.getPublicKey(privateKey.slice(2), false)); + const address2 = publicKeyToAddress(publicKey); + const account = toAccount({ + address: address2, + nonceManager, + async sign({ hash: hash3 }) { + return sign({ hash: hash3, privateKey, to: "hex" }); + }, + async signAuthorization(authorization) { + return signAuthorization({ ...authorization, privateKey }); + }, + async signMessage({ message }) { + return signMessage({ message, privateKey }); + }, + async signTransaction(transaction, { serializer } = {}) { + return signTransaction({ privateKey, transaction, serializer }); + }, + async signTypedData(typedData) { + return signTypedData({ ...typedData, privateKey }); + } + }); + return { + ...account, + publicKey, + source: "privateKey" + }; +} +var init_privateKeyToAccount = __esm({ + "node_modules/viem/_esm/accounts/privateKeyToAccount.js"() { + "use strict"; + init_secp256k1(); + init_toHex(); + init_toAccount(); + init_publicKeyToAddress(); + init_sign(); + init_signAuthorization(); + init_signMessage(); + init_signTransaction(); + init_signTypedData(); + } +}); + +// node_modules/@scure/bip39/esm/wordlists/english.js +var wordlist; +var init_english = __esm({ + "node_modules/@scure/bip39/esm/wordlists/english.js"() { + "use strict"; + wordlist = `abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo`.split("\n"); + } }); -async function requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({ - abortSignal, - commitment, - confirmSignatureOnlyTransaction, - lamports: lamports2, - recipientAddress, - rpc -}) { - const airdropTransactionSignature = await rpc.requestAirdrop(recipientAddress, lamports2, { commitment }).send({ abortSignal }); - await confirmSignatureOnlyTransaction({ - abortSignal, - commitment, - signature: airdropTransactionSignature - }); - return airdropTransactionSignature; -} -function airdropFactory({ - rpc, - rpcSubscriptions -}) { - const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({ - rpc, - rpcSubscriptions - }); - async function confirmSignatureOnlyTransaction(config) { - await waitForRecentTransactionConfirmationUntilTimeout({ - ...config, - getRecentSignatureConfirmationPromise, - getTimeoutPromise - }); + +// node_modules/viem/_esm/accounts/index.js +var init_accounts = __esm({ + "node_modules/viem/_esm/accounts/index.js"() { + "use strict"; + init_privateKeyToAccount(); + } +}); + +// src/fs-read.ts +import { open } from "fs/promises"; +import { openSync, readSync, closeSync, fstatSync } from "fs"; +async function readTextFile(filePath) { + const fh = await open(filePath, "r"); + try { + const size5 = (await fh.stat()).size; + const buf = Buffer.alloc(size5); + let offset = 0; + while (offset < size5) { + const { bytesRead } = await fh.read(buf, offset, size5 - offset, offset); + if (bytesRead === 0) break; + offset += bytesRead; + } + return buf.subarray(0, offset).toString("utf-8"); + } finally { + await fh.close(); } - return async function airdrop(config) { - return await requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({ - ...config, - confirmSignatureOnlyTransaction, - rpc - }); - }; } -async function fetchAddressesForLookupTables(lookupTableAddresses, rpc, config) { - if (lookupTableAddresses.length === 0) { - return {}; +var init_fs_read = __esm({ + "src/fs-read.ts"() { + "use strict"; } - const fetchedLookupTables = await fetchJsonParsedAccounts( - rpc, - lookupTableAddresses, - config - ); - assertAccountsDecoded(fetchedLookupTables); - assertAccountsExist(fetchedLookupTables); - return fetchedLookupTables.reduce((acc, lookup) => { - return { - ...acc, - [lookup.address]: lookup.data.addresses +}); + +// src/errors.ts +var RpcError2; +var init_errors4 = __esm({ + "src/errors.ts"() { + "use strict"; + RpcError2 = class extends Error { + code = "RPC_ERROR"; + originalError; + constructor(message, originalError) { + super(`RPC error: ${message}. Check network connectivity.`); + this.name = "RpcError"; + this.originalError = originalError; + } }; - }, {}); + } +}); + +// src/balance.ts +var balance_exports = {}; +__export(balance_exports, { + BALANCE_THRESHOLDS: () => BALANCE_THRESHOLDS, + BalanceMonitor: () => BalanceMonitor +}); +var USDC_BASE, CACHE_TTL_MS, BALANCE_THRESHOLDS, BalanceMonitor; +var init_balance = __esm({ + "src/balance.ts"() { + "use strict"; + init_esm(); + init_chains(); + init_errors4(); + USDC_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; + CACHE_TTL_MS = 3e4; + BALANCE_THRESHOLDS = { + /** Low balance warning threshold: $1.00 */ + LOW_BALANCE_MICROS: 1000000n, + /** Effectively zero threshold: $0.0001 (covers dust/rounding) */ + ZERO_THRESHOLD: 100n + }; + BalanceMonitor = class { + client; + walletAddress; + /** Cached balance (null = not yet fetched) */ + cachedBalance = null; + /** Timestamp when cache was last updated */ + cachedAt = 0; + constructor(walletAddress) { + this.walletAddress = walletAddress; + this.client = createPublicClient({ + chain: base, + transport: http(void 0, { + timeout: 1e4 + // 10 second timeout to prevent hanging on slow RPC + }) + }); + } + /** + * Check current USDC balance. + * Uses cache if valid, otherwise fetches from RPC. + */ + async checkBalance() { + const now = Date.now(); + if (this.cachedBalance !== null && this.cachedBalance > 0n && now - this.cachedAt < CACHE_TTL_MS) { + return this.buildInfo(this.cachedBalance); + } + const balance = await this.fetchBalance(); + if (balance > 0n) { + this.cachedBalance = balance; + this.cachedAt = now; + } + return this.buildInfo(balance); + } + /** + * Check if balance is sufficient for an estimated cost. + * + * @param estimatedCostMicros - Estimated cost in USDC smallest unit (6 decimals) + */ + async checkSufficient(estimatedCostMicros) { + const info = await this.checkBalance(); + if (info.balance >= estimatedCostMicros) { + return { sufficient: true, info }; + } + const shortfall = estimatedCostMicros - info.balance; + return { + sufficient: false, + info, + shortfall: this.formatUSDC(shortfall) + }; + } + /** + * Optimistically deduct estimated cost from cached balance. + * Call this after a successful payment to keep cache accurate. + * + * @param amountMicros - Amount to deduct in USDC smallest unit + */ + deductEstimated(amountMicros) { + if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) { + this.cachedBalance -= amountMicros; + } + } + /** + * Invalidate cache, forcing next checkBalance() to fetch from RPC. + * Call this after a payment failure to get accurate balance. + */ + invalidate() { + this.cachedBalance = null; + this.cachedAt = 0; + } + /** + * Force refresh balance from RPC (ignores cache). + */ + async refresh() { + this.invalidate(); + return this.checkBalance(); + } + /** + * Format USDC amount (in micros) as "$X.XX". + */ + formatUSDC(amountMicros) { + const dollars = Number(amountMicros) / 1e6; + return `$${dollars.toFixed(2)}`; + } + /** + * Get the wallet address being monitored. + */ + getWalletAddress() { + return this.walletAddress; + } + /** Fetch balance from RPC */ + async fetchBalance() { + try { + const balance = await this.client.readContract({ + address: USDC_BASE, + abi: erc20Abi, + functionName: "balanceOf", + args: [this.walletAddress] + }); + return balance; + } catch (error) { + throw new RpcError2(error instanceof Error ? error.message : "Unknown error", error); + } + } + /** Build BalanceInfo from raw balance */ + buildInfo(balance) { + return { + balance, + balanceUSD: this.formatUSDC(balance), + isLow: balance < BALANCE_THRESHOLDS.LOW_BALANCE_MICROS, + isEmpty: balance < BALANCE_THRESHOLDS.ZERO_THRESHOLD, + walletAddress: this.walletAddress + }; + } + }; + } +}); + +// node_modules/@noble/curves/node_modules/@noble/hashes/utils.js +function isBytes5(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; } -async function decompileTransactionMessageFetchingLookupTables(compiledTransactionMessage, rpc, config) { - const lookupTables = "addressTableLookups" in compiledTransactionMessage && compiledTransactionMessage.addressTableLookups !== void 0 && compiledTransactionMessage.addressTableLookups.length > 0 ? compiledTransactionMessage.addressTableLookups : []; - const lookupTableAddresses = lookupTables.map((l2) => l2.lookupTableAddress); - const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {}; - const addressesByLookupTableAddress = lookupTableAddresses.length > 0 ? await fetchAddressesForLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig) : {}; - return decompileTransactionMessage(compiledTransactionMessage, { - addressesByLookupTableAddress, - lastValidBlockHeight - }); +function anumber3(n, title = "") { + if (!Number.isSafeInteger(n) || n < 0) { + const prefix = title && `"${title}" `; + throw new Error(`${prefix}expected integer >= 0, got ${n}`); + } } -function getMinimumBalanceForRentExemption(space) { - const RENT = { - ACCOUNT_STORAGE_OVERHEAD: 128n, - DEFAULT_EXEMPTION_THRESHOLD: 2n, - DEFAULT_LAMPORTS_PER_BYTE_YEAR: 3480n - }; - const requiredLamports = (RENT.ACCOUNT_STORAGE_OVERHEAD + space) * RENT.DEFAULT_LAMPORTS_PER_BYTE_YEAR * RENT.DEFAULT_EXEMPTION_THRESHOLD; - return requiredLamports; +function abytes4(value, length, title = "") { + const bytes = isBytes5(value); + const len = value?.length; + const needsLen = length !== void 0; + if (!bytes || needsLen && len !== length) { + const prefix = title && `"${title}" `; + const ofLen = needsLen ? ` of length ${length}` : ""; + const got = bytes ? `length=${len}` : `type=${typeof value}`; + throw new Error(prefix + "expected Uint8Array" + ofLen + ", got " + got); + } + return value; } -function getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, config) { - if ( - // The developer has supplied no value for `preflightCommitment`. - !config?.preflightCommitment && // The value of `commitment` is lower than the server default of `preflightCommitment`. - commitmentComparator( - commitment, - "finalized" - /* default value of `preflightCommitment` */ - ) < 0 - ) { - return { - ...config, - // In the common case, it is unlikely that you want to simulate a transaction at - // `finalized` commitment when your standard of commitment for confirming the - // transaction is lower. Cap the simulation commitment level to the level of the - // confirmation commitment. - preflightCommitment: commitment - }; +function ahash2(h) { + if (typeof h !== "function" || typeof h.create !== "function") + throw new Error("Hash must wrapped by utils.createHasher"); + anumber3(h.outputLen); + anumber3(h.blockLen); +} +function aexists2(instance, checkFinished = true) { + if (instance.destroyed) + throw new Error("Hash instance has been destroyed"); + if (checkFinished && instance.finished) + throw new Error("Hash#digest() has already been called"); +} +function aoutput2(out, instance) { + abytes4(out, void 0, "digestInto() output"); + const min = instance.outputLen; + if (out.length < min) { + throw new Error('"digestInto() output" expected to be of length >=' + min); + } +} +function clean2(...arrays) { + for (let i = 0; i < arrays.length; i++) { + arrays[i].fill(0); + } +} +function createView2(arr) { + return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); +} +function rotr2(word, shift) { + return word << 32 - shift | word >>> shift; +} +function bytesToHex4(bytes) { + abytes4(bytes); + if (hasHexBuiltin3) + return bytes.toHex(); + let hex = ""; + for (let i = 0; i < bytes.length; i++) { + hex += hexes5[bytes[i]]; + } + return hex; +} +function asciiToBase163(ch) { + if (ch >= asciis3._0 && ch <= asciis3._9) + return ch - asciis3._0; + if (ch >= asciis3.A && ch <= asciis3.F) + return ch - (asciis3.A - 10); + if (ch >= asciis3.a && ch <= asciis3.f) + return ch - (asciis3.a - 10); + return; +} +function hexToBytes4(hex) { + if (typeof hex !== "string") + throw new Error("hex string expected, got " + typeof hex); + if (hasHexBuiltin3) + return Uint8Array.fromHex(hex); + const hl = hex.length; + const al = hl / 2; + if (hl % 2) + throw new Error("hex string expected, got unpadded hex of length " + hl); + const array = new Uint8Array(al); + for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) { + const n1 = asciiToBase163(hex.charCodeAt(hi)); + const n2 = asciiToBase163(hex.charCodeAt(hi + 1)); + if (n1 === void 0 || n2 === void 0) { + const char = hex[hi] + hex[hi + 1]; + throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi); + } + array[ai] = n1 * 16 + n2; + } + return array; +} +function concatBytes5(...arrays) { + let sum = 0; + for (let i = 0; i < arrays.length; i++) { + const a = arrays[i]; + abytes4(a); + sum += a.length; } - return config; + const res = new Uint8Array(sum); + for (let i = 0, pad4 = 0; i < arrays.length; i++) { + const a = arrays[i]; + res.set(a, pad4); + pad4 += a.length; + } + return res; } -async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ - abortSignal, - commitment, - rpc, - transaction, - ...sendTransactionConfig -}) { - const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction); - return await rpc.sendTransaction(base64EncodedWireTransaction, { - ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig), - encoding: "base64" - }).send({ abortSignal }); +function createHasher3(hashCons, info = {}) { + const hashC = (msg, opts) => hashCons(opts).update(msg).digest(); + const tmp = hashCons(void 0); + hashC.outputLen = tmp.outputLen; + hashC.blockLen = tmp.blockLen; + hashC.create = (opts) => hashCons(opts); + Object.assign(hashC, info); + return Object.freeze(hashC); } -async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ - abortSignal, - commitment, - confirmDurableNonceTransaction, - rpc, - transaction, - ...sendTransactionConfig -}) { - const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ - ...sendTransactionConfig, - abortSignal, - commitment, - rpc, - transaction - }); - await confirmDurableNonceTransaction({ - abortSignal, - commitment, - transaction - }); - return transactionSignature; +function randomBytes2(bytesLength = 32) { + const cr = typeof globalThis === "object" ? globalThis.crypto : null; + if (typeof cr?.getRandomValues !== "function") + throw new Error("crypto.getRandomValues must be defined"); + return cr.getRandomValues(new Uint8Array(bytesLength)); } -async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({ - abortSignal, - commitment, - confirmRecentTransaction, - rpc, - transaction, - ...sendTransactionConfig -}) { - const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ - ...sendTransactionConfig, - abortSignal, - commitment, - rpc, - transaction - }); - await confirmRecentTransaction({ - abortSignal, - commitment, - transaction - }); - return transactionSignature; +var hasHexBuiltin3, hexes5, asciis3, oidNist; +var init_utils8 = __esm({ + "node_modules/@noble/curves/node_modules/@noble/hashes/utils.js"() { + "use strict"; + hasHexBuiltin3 = /* @__PURE__ */ (() => ( + // @ts-ignore + typeof Uint8Array.from([]).toHex === "function" && typeof Uint8Array.fromHex === "function" + ))(); + hexes5 = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0")); + asciis3 = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; + oidNist = (suffix) => ({ + oid: Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2, suffix]) + }); + } +}); + +// node_modules/@noble/curves/node_modules/@noble/hashes/_md.js +function Chi2(a, b, c2) { + return a & b ^ ~a & c2; } -function sendAndConfirmDurableNonceTransactionFactory({ - rpc, - rpcSubscriptions -}) { - const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({ rpc, rpcSubscriptions }); - const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({ - rpc, - rpcSubscriptions - }); - function createNonceInvalidationPromiseHandlingRaceCondition(signature2) { - return async function wrappedGetNonceInvalidationPromise(config) { - try { - return await getNonceInvalidationPromise(config); - } catch (e7) { - if (isSolanaError(e7, SOLANA_ERROR__INVALID_NONCE)) { - let status; - try { - const { value: statuses } = await rpc.getSignatureStatuses([signature2]).send({ abortSignal: config.abortSignal }); - status = statuses[0]; - } catch { - throw e7; - } - if (status === null || status === void 0) { - throw e7; +function Maj2(a, b, c2) { + return a & b ^ a & c2 ^ b & c2; +} +var HashMD2, SHA256_IV2; +var init_md2 = __esm({ + "node_modules/@noble/curves/node_modules/@noble/hashes/_md.js"() { + "use strict"; + init_utils8(); + HashMD2 = class { + blockLen; + outputLen; + padOffset; + isLE; + // For partial updates less than block size + buffer; + view; + finished = false; + length = 0; + pos = 0; + destroyed = false; + constructor(blockLen, outputLen, padOffset, isLE2) { + this.blockLen = blockLen; + this.outputLen = outputLen; + this.padOffset = padOffset; + this.isLE = isLE2; + this.buffer = new Uint8Array(blockLen); + this.view = createView2(this.buffer); + } + update(data) { + aexists2(this); + abytes4(data); + const { view, buffer: buffer2, blockLen } = this; + const len = data.length; + for (let pos = 0; pos < len; ) { + const take = Math.min(blockLen - this.pos, len - pos); + if (take === blockLen) { + const dataView = createView2(data); + for (; blockLen <= len - pos; pos += blockLen) + this.process(dataView, pos); + continue; } - if (status.confirmationStatus !== null && commitmentComparator(status.confirmationStatus, config.commitment) >= 0) { - if (status.err !== null) { - throw getSolanaErrorFromTransactionError(status.err); - } - return; + buffer2.set(data.subarray(pos, pos + take), this.pos); + this.pos += take; + pos += take; + if (this.pos === blockLen) { + this.process(view, 0); + this.pos = 0; } - return await new Promise(() => { - }); } - throw e7; + this.length += data.length; + this.roundClean(); + return this; + } + digestInto(out) { + aexists2(this); + aoutput2(out, this); + this.finished = true; + const { buffer: buffer2, view, blockLen, isLE: isLE2 } = this; + let { pos } = this; + buffer2[pos++] = 128; + clean2(this.buffer.subarray(pos)); + if (this.padOffset > blockLen - pos) { + this.process(view, 0); + pos = 0; + } + for (let i = pos; i < blockLen; i++) + buffer2[i] = 0; + view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE2); + this.process(view, 0); + const oview = createView2(out); + const len = this.outputLen; + if (len % 4) + throw new Error("_sha2: outputLen must be aligned to 32bit"); + const outLen = len / 4; + const state = this.get(); + if (outLen > state.length) + throw new Error("_sha2: outputLen bigger than state"); + for (let i = 0; i < outLen; i++) + oview.setUint32(4 * i, state[i], isLE2); + } + digest() { + const { buffer: buffer2, outputLen } = this; + this.digestInto(buffer2); + const res = buffer2.slice(0, outputLen); + this.destroy(); + return res; + } + _cloneInto(to) { + to ||= new this.constructor(); + to.set(...this.get()); + const { blockLen, buffer: buffer2, length, finished: finished2, destroyed, pos } = this; + to.destroyed = destroyed; + to.finished = finished2; + to.length = length; + to.pos = pos; + if (length % blockLen) + to.buffer.set(buffer2); + return to; + } + clone() { + return this._cloneInto(); } }; + SHA256_IV2 = /* @__PURE__ */ Uint32Array.from([ + 1779033703, + 3144134277, + 1013904242, + 2773480762, + 1359893119, + 2600822924, + 528734635, + 1541459225 + ]); } - async function confirmDurableNonceTransaction(config) { - const wrappedGetNonceInvalidationPromise = createNonceInvalidationPromiseHandlingRaceCondition( - getSignatureFromTransaction(config.transaction) +}); + +// node_modules/@noble/curves/node_modules/@noble/hashes/sha2.js +var SHA256_K2, SHA256_W2, SHA2_32B, _SHA256, sha2564; +var init_sha22 = __esm({ + "node_modules/@noble/curves/node_modules/@noble/hashes/sha2.js"() { + "use strict"; + init_md2(); + init_utils8(); + SHA256_K2 = /* @__PURE__ */ Uint32Array.from([ + 1116352408, + 1899447441, + 3049323471, + 3921009573, + 961987163, + 1508970993, + 2453635748, + 2870763221, + 3624381080, + 310598401, + 607225278, + 1426881987, + 1925078388, + 2162078206, + 2614888103, + 3248222580, + 3835390401, + 4022224774, + 264347078, + 604807628, + 770255983, + 1249150122, + 1555081692, + 1996064986, + 2554220882, + 2821834349, + 2952996808, + 3210313671, + 3336571891, + 3584528711, + 113926993, + 338241895, + 666307205, + 773529912, + 1294757372, + 1396182291, + 1695183700, + 1986661051, + 2177026350, + 2456956037, + 2730485921, + 2820302411, + 3259730800, + 3345764771, + 3516065817, + 3600352804, + 4094571909, + 275423344, + 430227734, + 506948616, + 659060556, + 883997877, + 958139571, + 1322822218, + 1537002063, + 1747873779, + 1955562222, + 2024104815, + 2227730452, + 2361852424, + 2428436474, + 2756734187, + 3204031479, + 3329325298 + ]); + SHA256_W2 = /* @__PURE__ */ new Uint32Array(64); + SHA2_32B = class extends HashMD2 { + constructor(outputLen) { + super(64, outputLen, 8, false); + } + get() { + const { A, B, C, D: D2, E, F, G, H } = this; + return [A, B, C, D2, E, F, G, H]; + } + // prettier-ignore + set(A, B, C, D2, E, F, G, H) { + this.A = A | 0; + this.B = B | 0; + this.C = C | 0; + this.D = D2 | 0; + this.E = E | 0; + this.F = F | 0; + this.G = G | 0; + this.H = H | 0; + } + process(view, offset) { + for (let i = 0; i < 16; i++, offset += 4) + SHA256_W2[i] = view.getUint32(offset, false); + for (let i = 16; i < 64; i++) { + const W15 = SHA256_W2[i - 15]; + const W2 = SHA256_W2[i - 2]; + const s0 = rotr2(W15, 7) ^ rotr2(W15, 18) ^ W15 >>> 3; + const s1 = rotr2(W2, 17) ^ rotr2(W2, 19) ^ W2 >>> 10; + SHA256_W2[i] = s1 + SHA256_W2[i - 7] + s0 + SHA256_W2[i - 16] | 0; + } + let { A, B, C, D: D2, E, F, G, H } = this; + for (let i = 0; i < 64; i++) { + const sigma1 = rotr2(E, 6) ^ rotr2(E, 11) ^ rotr2(E, 25); + const T1 = H + sigma1 + Chi2(E, F, G) + SHA256_K2[i] + SHA256_W2[i] | 0; + const sigma0 = rotr2(A, 2) ^ rotr2(A, 13) ^ rotr2(A, 22); + const T2 = sigma0 + Maj2(A, B, C) | 0; + H = G; + G = F; + F = E; + E = D2 + T1 | 0; + D2 = C; + C = B; + B = A; + A = T1 + T2 | 0; + } + A = A + this.A | 0; + B = B + this.B | 0; + C = C + this.C | 0; + D2 = D2 + this.D | 0; + E = E + this.E | 0; + F = F + this.F | 0; + G = G + this.G | 0; + H = H + this.H | 0; + this.set(A, B, C, D2, E, F, G, H); + } + roundClean() { + clean2(SHA256_W2); + } + destroy() { + this.set(0, 0, 0, 0, 0, 0, 0, 0); + clean2(this.buffer); + } + }; + _SHA256 = class extends SHA2_32B { + // We cannot use array here since array allows indexing by variable + // which means optimizer/compiler cannot use registers. + A = SHA256_IV2[0] | 0; + B = SHA256_IV2[1] | 0; + C = SHA256_IV2[2] | 0; + D = SHA256_IV2[3] | 0; + E = SHA256_IV2[4] | 0; + F = SHA256_IV2[5] | 0; + G = SHA256_IV2[6] | 0; + H = SHA256_IV2[7] | 0; + constructor() { + super(32); + } + }; + sha2564 = /* @__PURE__ */ createHasher3( + () => new _SHA256(), + /* @__PURE__ */ oidNist(1) ); - await waitForDurableNonceTransactionConfirmation({ - ...config, - getNonceInvalidationPromise: wrappedGetNonceInvalidationPromise, - getRecentSignatureConfirmationPromise - }); } - return async function sendAndConfirmDurableNonceTransaction(transaction, config) { - await sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ - ...config, - confirmDurableNonceTransaction, - rpc, - transaction - }); +}); + +// node_modules/@noble/curves/utils.js +function abool3(value, title = "") { + if (typeof value !== "boolean") { + const prefix = title && `"${title}" `; + throw new Error(prefix + "expected boolean, got type=" + typeof value); + } + return value; +} +function abignumber(n) { + if (typeof n === "bigint") { + if (!isPosBig3(n)) + throw new Error("positive bigint expected, got " + n); + } else + anumber3(n); + return n; +} +function numberToHexUnpadded3(num2) { + const hex = abignumber(num2).toString(16); + return hex.length & 1 ? "0" + hex : hex; +} +function hexToNumber4(hex) { + if (typeof hex !== "string") + throw new Error("hex string expected, got " + typeof hex); + return hex === "" ? _0n12 : BigInt("0x" + hex); +} +function bytesToNumberBE3(bytes) { + return hexToNumber4(bytesToHex4(bytes)); +} +function bytesToNumberLE3(bytes) { + return hexToNumber4(bytesToHex4(copyBytes(abytes4(bytes)).reverse())); +} +function numberToBytesBE3(n, len) { + anumber3(len); + n = abignumber(n); + const res = hexToBytes4(n.toString(16).padStart(len * 2, "0")); + if (res.length !== len) + throw new Error("number too large"); + return res; +} +function numberToBytesLE3(n, len) { + return numberToBytesBE3(n, len).reverse(); +} +function copyBytes(bytes) { + return Uint8Array.from(bytes); +} +function inRange3(n, min, max) { + return isPosBig3(n) && isPosBig3(min) && isPosBig3(max) && min <= n && n < max; +} +function aInRange3(title, n, min, max) { + if (!inRange3(n, min, max)) + throw new Error("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n); +} +function bitLen3(n) { + let len; + for (len = 0; n > _0n12; n >>= _1n12, len += 1) + ; + return len; +} +function createHmacDrbg3(hashLen, qByteLen, hmacFn) { + anumber3(hashLen, "hashLen"); + anumber3(qByteLen, "qByteLen"); + if (typeof hmacFn !== "function") + throw new Error("hmacFn must be a function"); + const u8n3 = (len) => new Uint8Array(len); + const NULL = Uint8Array.of(); + const byte0 = Uint8Array.of(0); + const byte1 = Uint8Array.of(1); + const _maxDrbgIters = 1e3; + let v = u8n3(hashLen); + let k = u8n3(hashLen); + let i = 0; + const reset = () => { + v.fill(1); + k.fill(0); + i = 0; + }; + const h = (...msgs) => hmacFn(k, concatBytes5(v, ...msgs)); + const reseed = (seed = NULL) => { + k = h(byte0, seed); + v = h(); + if (seed.length === 0) + return; + k = h(byte1, seed); + v = h(); + }; + const gen2 = () => { + if (i++ >= _maxDrbgIters) + throw new Error("drbg: tried max amount of iterations"); + let len = 0; + const out = []; + while (len < qByteLen) { + v = h(); + const sl = v.slice(); + out.push(sl); + len += v.length; + } + return concatBytes5(...out); + }; + const genUntil = (seed, pred) => { + reset(); + reseed(seed); + let res = void 0; + while (!(res = pred(gen2()))) + reseed(); + reset(); + return res; }; + return genUntil; } -function sendAndConfirmTransactionFactory({ - rpc, - rpcSubscriptions -}) { - const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({ - rpc, - rpcSubscriptions - }); - const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({ - rpc, - rpcSubscriptions - }); - async function confirmRecentTransaction(config) { - await waitForRecentTransactionConfirmation({ - ...config, - getBlockHeightExceedencePromise, - getRecentSignatureConfirmationPromise - }); +function validateObject3(object, fields = {}, optFields = {}) { + if (!object || typeof object !== "object") + throw new Error("expected valid options object"); + function checkField(fieldName, expectedType, isOpt) { + const val = object[fieldName]; + if (isOpt && val === void 0) + return; + const current = typeof val; + if (current !== expectedType || val === null) + throw new Error(`param "${fieldName}" is invalid: expected ${expectedType}, got ${current}`); } - return async function sendAndConfirmTransaction(transaction, config) { - await sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({ - ...config, - confirmRecentTransaction, - rpc, - transaction - }); - }; + const iter = (f, isOpt) => Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt)); + iter(fields, false); + iter(optFields, true); } -function sendTransactionWithoutConfirmingFactory({ - rpc -}) { - return async function sendTransactionWithoutConfirming(transaction, config) { - await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ - ...config, - rpc, - transaction - }); +function memoized3(fn) { + const map = /* @__PURE__ */ new WeakMap(); + return (arg, ...args) => { + const val = map.get(arg); + if (val !== void 0) + return val; + const computed = fn(arg, ...args); + map.set(arg, computed); + return computed; }; } -var init_index_node37 = __esm({ - "node_modules/@solana/kit/dist/index.node.mjs"() { +var _0n12, _1n12, isPosBig3, bitMask3; +var init_utils9 = __esm({ + "node_modules/@noble/curves/utils.js"() { "use strict"; - init_index_node4(); - init_index_node4(); - init_index_node6(); - init_index_node10(); - init_index_node(); - init_index_node(); - init_index_node11(); - init_index_node12(); - init_index_node18(); - init_index_node15(); - init_index_node19(); - init_index_node20(); - init_index_node21(); - init_index_node28(); - init_index_node29(); - init_index_node34(); - init_index_node13(); - init_index_node13(); - init_index_node35(); - init_index_node14(); - init_index_node14(); - init_index_node16(); - init_index_node16(); - init_index_node36(); - init_index_node22(); + init_utils8(); + init_utils8(); + _0n12 = /* @__PURE__ */ BigInt(0); + _1n12 = /* @__PURE__ */ BigInt(1); + isPosBig3 = (n) => typeof n === "bigint" && _0n12 <= n; + bitMask3 = (n) => (_1n12 << BigInt(n)) - _1n12; } }); -// src/wallet.ts -var wallet_exports = {}; -__export(wallet_exports, { - deriveAllKeys: () => deriveAllKeys, - deriveEvmKey: () => deriveEvmKey, - deriveSolanaKeyBytes: () => deriveSolanaKeyBytes, - generateWalletMnemonic: () => generateWalletMnemonic, - getSolanaAddress: () => getSolanaAddress, - isValidMnemonic: () => isValidMnemonic -}); -function generateWalletMnemonic() { - return generateMnemonic(wordlist, 256); +// node_modules/@noble/curves/abstract/modular.js +function mod3(a, b) { + const result = a % b; + return result >= _0n13 ? result : b + result; } -function isValidMnemonic(mnemonic) { - return validateMnemonic(mnemonic, wordlist); +function pow23(x, power, modulo2) { + let res = x; + while (power-- > _0n13) { + res *= res; + res %= modulo2; + } + return res; } -function deriveEvmKey(mnemonic) { - const seed = mnemonicToSeedSync(mnemonic); - const hdKey = HDKey.fromMasterSeed(seed); - const derived = hdKey.derive(ETH_DERIVATION_PATH); - if (!derived.privateKey) throw new Error("Failed to derive EVM private key"); - const hex = `0x${Buffer.from(derived.privateKey).toString("hex")}`; - const account = privateKeyToAccount(hex); - return { privateKey: hex, address: account.address }; +function invert3(number, modulo2) { + if (number === _0n13) + throw new Error("invert: expected non-zero number"); + if (modulo2 <= _0n13) + throw new Error("invert: expected positive modulus, got " + modulo2); + let a = mod3(number, modulo2); + let b = modulo2; + let x = _0n13, y = _1n13, u = _1n13, v = _0n13; + while (a !== _0n13) { + const q = b / a; + const r = b % a; + const m = x - u * q; + const n = y - v * q; + b = a, a = r, x = u, y = v, u = m, v = n; + } + const gcd2 = b; + if (gcd2 !== _1n13) + throw new Error("invert: does not exist"); + return mod3(x, modulo2); } -function deriveSolanaKeyBytes(mnemonic) { - const seed = mnemonicToSeedSync(mnemonic); - let I = hmac(sha512, new TextEncoder().encode("ed25519 seed"), seed); - let key = I.slice(0, 32); - let chainCode = I.slice(32); - for (const index2 of SOLANA_HARDENED_INDICES) { - const data = new Uint8Array(37); - data[0] = 0; - data.set(key, 1); - data[33] = index2 >>> 24 & 255; - data[34] = index2 >>> 16 & 255; - data[35] = index2 >>> 8 & 255; - data[36] = index2 & 255; - I = hmac(sha512, chainCode, data); - key = I.slice(0, 32); - chainCode = I.slice(32); +function assertIsSquare(Fp, root, n) { + if (!Fp.eql(Fp.sqr(root), n)) + throw new Error("Cannot find square root"); +} +function sqrt3mod43(Fp, n) { + const p1div4 = (Fp.ORDER + _1n13) / _4n5; + const root = Fp.pow(n, p1div4); + assertIsSquare(Fp, root, n); + return root; +} +function sqrt5mod83(Fp, n) { + const p5div8 = (Fp.ORDER - _5n3) / _8n3; + const n2 = Fp.mul(n, _2n8); + const v = Fp.pow(n2, p5div8); + const nv = Fp.mul(n, v); + const i = Fp.mul(Fp.mul(nv, _2n8), v); + const root = Fp.mul(nv, Fp.sub(i, Fp.ONE)); + assertIsSquare(Fp, root, n); + return root; +} +function sqrt9mod16(P2) { + const Fp_ = Field3(P2); + const tn = tonelliShanks3(P2); + const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); + const c2 = tn(Fp_, c1); + const c3 = tn(Fp_, Fp_.neg(c1)); + const c4 = (P2 + _7n2) / _16n; + return (Fp, n) => { + let tv1 = Fp.pow(n, c4); + let tv2 = Fp.mul(tv1, c1); + const tv3 = Fp.mul(tv1, c2); + const tv4 = Fp.mul(tv1, c3); + const e1 = Fp.eql(Fp.sqr(tv2), n); + const e22 = Fp.eql(Fp.sqr(tv3), n); + tv1 = Fp.cmov(tv1, tv2, e1); + tv2 = Fp.cmov(tv4, tv3, e22); + const e32 = Fp.eql(Fp.sqr(tv2), n); + const root = Fp.cmov(tv1, tv2, e32); + assertIsSquare(Fp, root, n); + return root; + }; +} +function tonelliShanks3(P2) { + if (P2 < _3n5) + throw new Error("sqrt is not defined for small field"); + let Q = P2 - _1n13; + let S = 0; + while (Q % _2n8 === _0n13) { + Q /= _2n8; + S++; } - return new Uint8Array(key); + let Z = _2n8; + const _Fp = Field3(P2); + while (FpLegendre3(_Fp, Z) === 1) { + if (Z++ > 1e3) + throw new Error("Cannot find square root: probably non-prime P"); + } + if (S === 1) + return sqrt3mod43; + let cc = _Fp.pow(Z, Q); + const Q1div2 = (Q + _1n13) / _2n8; + return function tonelliSlow(Fp, n) { + if (Fp.is0(n)) + return n; + if (FpLegendre3(Fp, n) !== 1) + throw new Error("Cannot find square root"); + let M = S; + let c2 = Fp.mul(Fp.ONE, cc); + let t = Fp.pow(n, Q); + let R = Fp.pow(n, Q1div2); + while (!Fp.eql(t, Fp.ONE)) { + if (Fp.is0(t)) + return Fp.ZERO; + let i = 1; + let t_tmp = Fp.sqr(t); + while (!Fp.eql(t_tmp, Fp.ONE)) { + i++; + t_tmp = Fp.sqr(t_tmp); + if (i === M) + throw new Error("Cannot find square root"); + } + const exponent = _1n13 << BigInt(M - i - 1); + const b = Fp.pow(c2, exponent); + M = i; + c2 = Fp.sqr(b); + t = Fp.mul(t, c2); + R = Fp.mul(R, b); + } + return R; + }; } -function deriveAllKeys(mnemonic) { - const { privateKey: evmPrivateKey, address: evmAddress } = deriveEvmKey(mnemonic); - const solanaPrivateKeyBytes = deriveSolanaKeyBytes(mnemonic); - return { mnemonic, evmPrivateKey, evmAddress, solanaPrivateKeyBytes }; +function FpSqrt3(P2) { + if (P2 % _4n5 === _3n5) + return sqrt3mod43; + if (P2 % _8n3 === _5n3) + return sqrt5mod83; + if (P2 % _16n === _9n) + return sqrt9mod16(P2); + return tonelliShanks3(P2); } -async function getSolanaAddress(privateKeyBytes) { - const { createKeyPairSignerFromPrivateKeyBytes: createKeyPairSignerFromPrivateKeyBytes2 } = await Promise.resolve().then(() => (init_index_node37(), index_node_exports)); - const signer = await createKeyPairSignerFromPrivateKeyBytes2(privateKeyBytes); - return signer.address; +function validateField3(field) { + const initial = { + ORDER: "bigint", + BYTES: "number", + BITS: "number" + }; + const opts = FIELD_FIELDS3.reduce((map, val) => { + map[val] = "function"; + return map; + }, initial); + validateObject3(field, opts); + return field; } -var ETH_DERIVATION_PATH, SOLANA_HARDENED_INDICES; -var init_wallet = __esm({ - "src/wallet.ts"() { +function FpPow3(Fp, num2, power) { + if (power < _0n13) + throw new Error("invalid exponent, negatives unsupported"); + if (power === _0n13) + return Fp.ONE; + if (power === _1n13) + return num2; + let p = Fp.ONE; + let d = num2; + while (power > _0n13) { + if (power & _1n13) + p = Fp.mul(p, d); + d = Fp.sqr(d); + power >>= _1n13; + } + return p; +} +function FpInvertBatch3(Fp, nums, passZero = false) { + const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : void 0); + const multipliedAcc = nums.reduce((acc, num2, i) => { + if (Fp.is0(num2)) + return acc; + inverted[i] = acc; + return Fp.mul(acc, num2); + }, Fp.ONE); + const invertedAcc = Fp.inv(multipliedAcc); + nums.reduceRight((acc, num2, i) => { + if (Fp.is0(num2)) + return acc; + inverted[i] = Fp.mul(acc, inverted[i]); + return Fp.mul(acc, num2); + }, invertedAcc); + return inverted; +} +function FpLegendre3(Fp, n) { + const p1mod2 = (Fp.ORDER - _1n13) / _2n8; + const powered = Fp.pow(n, p1mod2); + const yes = Fp.eql(powered, Fp.ONE); + const zero = Fp.eql(powered, Fp.ZERO); + const no = Fp.eql(powered, Fp.neg(Fp.ONE)); + if (!yes && !zero && !no) + throw new Error("invalid Legendre symbol result"); + return yes ? 1 : zero ? 0 : -1; +} +function nLength3(n, nBitLength) { + if (nBitLength !== void 0) + anumber3(nBitLength); + const _nBitLength = nBitLength !== void 0 ? nBitLength : n.toString(2).length; + const nByteLength = Math.ceil(_nBitLength / 8); + return { nBitLength: _nBitLength, nByteLength }; +} +function Field3(ORDER, opts = {}) { + return new _Field(ORDER, opts); +} +function getFieldBytesLength3(fieldOrder) { + if (typeof fieldOrder !== "bigint") + throw new Error("field order must be bigint"); + const bitLength = fieldOrder.toString(2).length; + return Math.ceil(bitLength / 8); +} +function getMinHashLength3(fieldOrder) { + const length = getFieldBytesLength3(fieldOrder); + return length + Math.ceil(length / 2); +} +function mapHashToField3(key, fieldOrder, isLE2 = false) { + abytes4(key); + const len = key.length; + const fieldLen = getFieldBytesLength3(fieldOrder); + const minLen = getMinHashLength3(fieldOrder); + if (len < 16 || len < minLen || len > 1024) + throw new Error("expected " + minLen + "-1024 bytes of input, got " + len); + const num2 = isLE2 ? bytesToNumberLE3(key) : bytesToNumberBE3(key); + const reduced = mod3(num2, fieldOrder - _1n13) + _1n13; + return isLE2 ? numberToBytesLE3(reduced, fieldLen) : numberToBytesBE3(reduced, fieldLen); +} +var _0n13, _1n13, _2n8, _3n5, _4n5, _5n3, _7n2, _8n3, _9n, _16n, FIELD_FIELDS3, _Field; +var init_modular3 = __esm({ + "node_modules/@noble/curves/abstract/modular.js"() { "use strict"; - init_bip32(); - init_esm2(); - init_english(); - init_hmac(); - init_sha2(); - init_accounts(); - ETH_DERIVATION_PATH = "m/44'/60'/0'/0/0"; - SOLANA_HARDENED_INDICES = [44 + 2147483648, 501 + 2147483648, 0 + 2147483648, 0 + 2147483648]; + init_utils9(); + _0n13 = /* @__PURE__ */ BigInt(0); + _1n13 = /* @__PURE__ */ BigInt(1); + _2n8 = /* @__PURE__ */ BigInt(2); + _3n5 = /* @__PURE__ */ BigInt(3); + _4n5 = /* @__PURE__ */ BigInt(4); + _5n3 = /* @__PURE__ */ BigInt(5); + _7n2 = /* @__PURE__ */ BigInt(7); + _8n3 = /* @__PURE__ */ BigInt(8); + _9n = /* @__PURE__ */ BigInt(9); + _16n = /* @__PURE__ */ BigInt(16); + FIELD_FIELDS3 = [ + "create", + "isValid", + "is0", + "neg", + "inv", + "sqrt", + "sqr", + "eql", + "add", + "sub", + "mul", + "pow", + "div", + "addN", + "subN", + "mulN", + "sqrN" + ]; + _Field = class { + ORDER; + BITS; + BYTES; + isLE; + ZERO = _0n13; + ONE = _1n13; + _lengths; + _sqrt; + // cached sqrt + _mod; + constructor(ORDER, opts = {}) { + if (ORDER <= _0n13) + throw new Error("invalid field: expected ORDER > 0, got " + ORDER); + let _nbitLength = void 0; + this.isLE = false; + if (opts != null && typeof opts === "object") { + if (typeof opts.BITS === "number") + _nbitLength = opts.BITS; + if (typeof opts.sqrt === "function") + this.sqrt = opts.sqrt; + if (typeof opts.isLE === "boolean") + this.isLE = opts.isLE; + if (opts.allowedLengths) + this._lengths = opts.allowedLengths?.slice(); + if (typeof opts.modFromBytes === "boolean") + this._mod = opts.modFromBytes; + } + const { nBitLength, nByteLength } = nLength3(ORDER, _nbitLength); + if (nByteLength > 2048) + throw new Error("invalid field: expected ORDER of <= 2048 bytes"); + this.ORDER = ORDER; + this.BITS = nBitLength; + this.BYTES = nByteLength; + this._sqrt = void 0; + Object.preventExtensions(this); + } + create(num2) { + return mod3(num2, this.ORDER); + } + isValid(num2) { + if (typeof num2 !== "bigint") + throw new Error("invalid field element: expected bigint, got " + typeof num2); + return _0n13 <= num2 && num2 < this.ORDER; + } + is0(num2) { + return num2 === _0n13; + } + // is valid and invertible + isValidNot0(num2) { + return !this.is0(num2) && this.isValid(num2); + } + isOdd(num2) { + return (num2 & _1n13) === _1n13; + } + neg(num2) { + return mod3(-num2, this.ORDER); + } + eql(lhs, rhs) { + return lhs === rhs; + } + sqr(num2) { + return mod3(num2 * num2, this.ORDER); + } + add(lhs, rhs) { + return mod3(lhs + rhs, this.ORDER); + } + sub(lhs, rhs) { + return mod3(lhs - rhs, this.ORDER); + } + mul(lhs, rhs) { + return mod3(lhs * rhs, this.ORDER); + } + pow(num2, power) { + return FpPow3(this, num2, power); + } + div(lhs, rhs) { + return mod3(lhs * invert3(rhs, this.ORDER), this.ORDER); + } + // Same as above, but doesn't normalize + sqrN(num2) { + return num2 * num2; + } + addN(lhs, rhs) { + return lhs + rhs; + } + subN(lhs, rhs) { + return lhs - rhs; + } + mulN(lhs, rhs) { + return lhs * rhs; + } + inv(num2) { + return invert3(num2, this.ORDER); + } + sqrt(num2) { + if (!this._sqrt) + this._sqrt = FpSqrt3(this.ORDER); + return this._sqrt(this, num2); + } + toBytes(num2) { + return this.isLE ? numberToBytesLE3(num2, this.BYTES) : numberToBytesBE3(num2, this.BYTES); + } + fromBytes(bytes, skipValidation = false) { + abytes4(bytes); + const { _lengths: allowedLengths, BYTES, isLE: isLE2, ORDER, _mod: modFromBytes } = this; + if (allowedLengths) { + if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) { + throw new Error("Field.fromBytes: expected " + allowedLengths + " bytes, got " + bytes.length); + } + const padded = new Uint8Array(BYTES); + padded.set(bytes, isLE2 ? 0 : padded.length - bytes.length); + bytes = padded; + } + if (bytes.length !== BYTES) + throw new Error("Field.fromBytes: expected " + BYTES + " bytes, got " + bytes.length); + let scalar = isLE2 ? bytesToNumberLE3(bytes) : bytesToNumberBE3(bytes); + if (modFromBytes) + scalar = mod3(scalar, ORDER); + if (!skipValidation) { + if (!this.isValid(scalar)) + throw new Error("invalid field element: outside of range 0..ORDER"); + } + return scalar; + } + // TODO: we don't need it here, move out to separate fn + invertBatch(lst) { + return FpInvertBatch3(this, lst); + } + // We can't move this out because Fp6, Fp12 implement it + // and it's unclear what to return in there. + cmov(a, b, condition) { + return condition ? b : a; + } + }; } }); -// src/onchainos-adapter.ts -import { execFile, execFileSync } from "child_process"; -import { existsSync } from "fs"; -import { homedir as homedir3 } from "os"; -import { promisify } from "util"; -function resolveOnchainosBin(override) { - if (override) return override; - const env = process.env.XCLAWROUTER_ONCHAINOS_BIN ?? process.env.ONCHAINOS_BIN; - if (env) return env; - const fallback = FALLBACK_CANDIDATES.find((candidate) => existsSync(candidate)); - return fallback ?? DEFAULT_BIN; +// node_modules/@noble/curves/abstract/curve.js +function negateCt(condition, item) { + const neg = item.negate(); + return condition ? neg : item; } -async function runCli(bin, args, opts) { - try { - const { stdout } = await execFileAsync(bin, args, { - timeout: opts.timeoutMs, - maxBuffer: 8 * 1024 * 1024 - }); - return stdout; - } catch (err) { - throw wrapCliError(err, bin, args); - } +function normalizeZ(c2, points) { + const invertedZs = FpInvertBatch3(c2.Fp, points.map((p) => p.Z)); + return points.map((p, i) => c2.fromAffine(p.toAffine(invertedZs[i]))); } -function wrapCliError(err, bin, args) { - const e7 = err; - if (e7.code === "ENOENT") { - return new OnchainOsCliError( - `onchainos CLI not found at "${bin}". Install OKX's agentic wallet CLI (https://web3.okx.com/onchainos) and ensure it is on PATH, or set XCLAWROUTER_ONCHAINOS_BIN to the binary location.` - ); - } - return new OnchainOsCliError( - `onchainos ${args.join(" ")} failed: ${e7.message}`, - e7.stderr, - typeof e7.code === "number" ? e7.code : null - ); +function validateW3(W, bits) { + if (!Number.isSafeInteger(W) || W <= 0 || W > bits) + throw new Error("invalid window size, expected [1.." + bits + "], got W=" + W); } -function parseJson(stdout, label) { - const trimmed = stdout.trim(); - if (!trimmed) { - throw new OnchainOsCliError(`onchainos ${label}: empty output`); +function calcWOpts3(W, scalarBits) { + validateW3(W, scalarBits); + const windows = Math.ceil(scalarBits / W) + 1; + const windowSize = 2 ** (W - 1); + const maxNumber = 2 ** W; + const mask = bitMask3(W); + const shiftBy = BigInt(W); + return { windows, windowSize, mask, maxNumber, shiftBy }; +} +function calcOffsets3(n, window, wOpts) { + const { windowSize, mask, maxNumber, shiftBy } = wOpts; + let wbits = Number(n & mask); + let nextN = n >> shiftBy; + if (wbits > windowSize) { + wbits -= maxNumber; + nextN += _1n14; } - try { - return JSON.parse(trimmed); - } catch (err) { - throw new OnchainOsCliError( - `onchainos ${label}: invalid JSON output \u2014 ${err.message} -${trimmed.slice(0, 500)}` - ); + const offsetStart = window * windowSize; + const offset = offsetStart + Math.abs(wbits) - 1; + const isZero = wbits === 0; + const isNeg = wbits < 0; + const isNegF = window % 2 !== 0; + const offsetF = offsetStart; + return { nextN, offset, isZero, isNeg, isNegF, offsetF }; +} +function getW3(P2) { + return pointWindowSizes3.get(P2) || 1; +} +function assert0(n) { + if (n !== _0n14) + throw new Error("invalid wNAF"); +} +function mulEndoUnsafe(Point3, point, k1, k2) { + let acc = point; + let p1 = Point3.ZERO; + let p2 = Point3.ZERO; + while (k1 > _0n14 || k2 > _0n14) { + if (k1 & _1n14) + p1 = p1.add(acc); + if (k2 & _1n14) + p2 = p2.add(acc); + acc = acc.double(); + k1 >>= _1n14; + k2 >>= _1n14; } + return { p1, p2 }; } -function unwrapData(parsed) { - if (parsed && typeof parsed === "object" && "data" in parsed) { - const inner = parsed.data; - if (inner !== void 0 && inner !== null) return inner; +function createField(order, field, isLE2) { + if (field) { + if (field.ORDER !== order) + throw new Error("Field.ORDER must match order: Fp == p, Fn == n"); + validateField3(field); + return field; + } else { + return Field3(order, { isLE: isLE2 }); } - return parsed; } -function pickAddressString(value) { - if (!value) return void 0; - if (typeof value === "string") return value.trim() || void 0; - if (Array.isArray(value)) { - for (const item of value) { - const found = pickAddressString(item); - if (found) return found; - } - return void 0; +function createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) { + if (FpFnLE === void 0) + FpFnLE = type === "edwards"; + if (!CURVE || typeof CURVE !== "object") + throw new Error(`expected valid ${type} CURVE object`); + for (const p of ["p", "n", "h"]) { + const val = CURVE[p]; + if (!(typeof val === "bigint" && val > _0n14)) + throw new Error(`CURVE.${p} must be positive bigint`); } - if (typeof value === "object") { - const obj = value; - for (const key of ["address", "evmAddress", "publicAddress", "value", "addr"]) { - const candidate = obj[key]; - if (typeof candidate === "string" && candidate.trim()) return candidate.trim(); - } + const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE); + const Fn2 = createField(CURVE.n, curveOpts.Fn, FpFnLE); + const _b = type === "weierstrass" ? "b" : "d"; + const params = ["Gx", "Gy", "a", _b]; + for (const p of params) { + if (!Fp.isValid(CURVE[p])) + throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`); } - return void 0; + CURVE = Object.freeze(Object.assign({}, CURVE)); + return { CURVE, Fp, Fn: Fn2 }; } -function pickEvmAddress(value) { - const addr = pickAddressString(value); - if (!addr || !addr.startsWith("0x") || addr.length !== 42) return void 0; - return addr; +function createKeygen(randomSecretKey, getPublicKey) { + return function keygen(seed) { + const secretKey = randomSecretKey(seed); + return { secretKey, publicKey: getPublicKey(secretKey) }; + }; } -var execFileAsync, DEFAULT_BIN, DEFAULT_TIMEOUT_MS, PAYMENT_TIMEOUT_MS, FALLBACK_CANDIDATES, OnchainOsCliError, OnchainOsAdapter; -var init_onchainos_adapter = __esm({ - "src/onchainos-adapter.ts"() { +var _0n14, _1n14, pointPrecomputes3, pointWindowSizes3, wNAF3; +var init_curve3 = __esm({ + "node_modules/@noble/curves/abstract/curve.js"() { "use strict"; - execFileAsync = promisify(execFile); - DEFAULT_BIN = "onchainos"; - DEFAULT_TIMEOUT_MS = 3e4; - PAYMENT_TIMEOUT_MS = 3e4; - FALLBACK_CANDIDATES = [ - `${homedir3()}/.local/bin/onchainos`, - "/opt/homebrew/bin/onchainos", - "/usr/local/bin/onchainos" - ]; - OnchainOsCliError = class extends Error { - constructor(message, stderr, exitCode) { - super(message); - this.stderr = stderr; - this.exitCode = exitCode; - this.name = "OnchainOsCliError"; - } - }; - OnchainOsAdapter = class { - bin; - timeoutMs; - constructor(opts = {}) { - this.bin = resolveOnchainosBin(opts.bin); - this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS; + init_utils9(); + init_modular3(); + _0n14 = /* @__PURE__ */ BigInt(0); + _1n14 = /* @__PURE__ */ BigInt(1); + pointPrecomputes3 = /* @__PURE__ */ new WeakMap(); + pointWindowSizes3 = /* @__PURE__ */ new WeakMap(); + wNAF3 = class { + BASE; + ZERO; + Fn; + bits; + // Parametrized with a given Point class (not individual point) + constructor(Point3, bits) { + this.BASE = Point3.BASE; + this.ZERO = Point3.ZERO; + this.Fn = Point3.Fn; + this.bits = bits; } - /** Quick, synchronous probe — does the binary exist and respond to --version? */ - isInstalled() { - try { - execFileSync(this.bin, ["--version"], { - encoding: "utf-8", - stdio: "pipe", - timeout: 5e3 - }); - return true; - } catch { - return false; + // non-const time multiplication ladder + _unsafeLadder(elm, n, p = this.ZERO) { + let d = elm; + while (n > _0n14) { + if (n & _1n14) + p = p.add(d); + d = d.double(); + n >>= _1n14; } - } - async status() { - const stdout = await runCli(this.bin, ["wallet", "status"], { - timeoutMs: this.timeoutMs - }); - const raw = unwrapData(parseJson(stdout, "wallet status")); - const loggedIn = Boolean(raw.loggedIn ?? raw.connected); - const evmAddress = raw.evmAddress ?? raw.evm; - const solanaAddress = raw.solanaAddress ?? raw.solana; - return { - loggedIn, - email: raw.email, - evmAddress: evmAddress?.startsWith("0x") ? evmAddress : void 0, - solanaAddress - }; + return p; } /** - * Fetch the wallet's addresses across chains. Use this as a fallback when - * `wallet status` doesn't include `evmAddress` — some onchainos builds omit - * the address from status but still expose it via `wallet addresses`. - * - * Tolerates the three shapes onchainos has shipped for each chain entry: - * - bare string: `"0xabc..."` - * - array of strings: `["0xabc...", "0xdef..."]` - * - array of objects: `[{ address: "0xabc...", chain: "base" }, ...]` + * Creates a wNAF precomputation window. Used for caching. + * Default window size is set by `utils.precompute()` and is equal to 8. + * Number of precomputed points depends on the curve size: + * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where: + * - 𝑊 is the window size + * - 𝑛 is the bitlength of the curve order. + * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224. + * @param point Point instance + * @param W window size + * @returns precomputed point tables flattened to a single array */ - async addresses() { - const stdout = await runCli(this.bin, ["wallet", "addresses"], { - timeoutMs: this.timeoutMs - }); - const raw = unwrapData(parseJson(stdout, "wallet addresses")); - return { - evm: pickEvmAddress(raw.evm ?? raw.base), - xlayer: pickEvmAddress(raw.xlayer), - solana: pickAddressString(raw.solana) - }; - } - async login(email) { - if (!email.includes("@")) { - throw new Error(`Invalid email address: ${email}`); + precomputeWindow(point, W) { + const { windows, windowSize } = calcWOpts3(W, this.bits); + const points = []; + let p = point; + let base2 = p; + for (let window = 0; window < windows; window++) { + base2 = p; + points.push(base2); + for (let i = 1; i < windowSize; i++) { + base2 = base2.add(p); + points.push(base2); + } + p = base2.double(); } - await runCli(this.bin, ["wallet", "login", email], { timeoutMs: 5 * 6e4 }); + return points; } - async logout() { - await runCli(this.bin, ["wallet", "logout"], { timeoutMs: this.timeoutMs }); + /** + * Implements ec multiplication using precomputed tables and w-ary non-adjacent form. + * More compact implementation: + * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541 + * @returns real and fake (for const-time) points + */ + wNAF(W, precomputes, n) { + if (!this.Fn.isValid(n)) + throw new Error("invalid scalar"); + let p = this.ZERO; + let f = this.BASE; + const wo = calcWOpts3(W, this.bits); + for (let window = 0; window < wo.windows; window++) { + const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets3(n, window, wo); + n = nextN; + if (isZero) { + f = f.add(negateCt(isNegF, precomputes[offsetF])); + } else { + p = p.add(negateCt(isNeg, precomputes[offset])); + } + } + assert0(n); + return { p, f }; } /** - * Sign an x402 payment via onchainos. Pass through the full `accepts` array - * from the 402 response — onchainos picks the chain/scheme it can satisfy. + * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form. + * @param acc accumulator point to add result of multiplication + * @returns point */ - async signX402Payment(accepts) { - const acceptsJson = JSON.stringify(accepts); - const stdout = await runCli(this.bin, ["payment", "x402-pay", "--accepts", acceptsJson], { - timeoutMs: PAYMENT_TIMEOUT_MS - }); - const parsed = parseJson(stdout, "payment x402-pay"); - const result = unwrapData(parsed); - if (!result.signature || typeof result.signature !== "string") { - throw new OnchainOsCliError( - `onchainos payment x402-pay returned no signature: ${JSON.stringify(parsed).slice(0, 500)}` - ); + wNAFUnsafe(W, precomputes, n, acc = this.ZERO) { + const wo = calcWOpts3(W, this.bits); + for (let window = 0; window < wo.windows; window++) { + if (n === _0n14) + break; + const { nextN, offset, isZero, isNeg } = calcOffsets3(n, window, wo); + n = nextN; + if (isZero) { + continue; + } else { + const item = precomputes[offset]; + acc = acc.add(isNeg ? item.negate() : item); + } } - if (!result.authorization || typeof result.authorization !== "object") { - throw new OnchainOsCliError( - `onchainos payment x402-pay returned no authorization: ${JSON.stringify(parsed).slice(0, 500)}` - ); + assert0(n); + return acc; + } + getPrecomputes(W, point, transform) { + let comp = pointPrecomputes3.get(point); + if (!comp) { + comp = this.precomputeWindow(point, W); + if (W !== 1) { + if (typeof transform === "function") + comp = transform(comp); + pointPrecomputes3.set(point, comp); + } } - return { - signature: result.signature, - authorization: result.authorization, - sessionCert: typeof result.sessionCert === "string" ? result.sessionCert : void 0 - }; + return comp; + } + cached(point, scalar, transform) { + const W = getW3(point); + return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar); + } + unsafe(point, scalar, transform, prev) { + const W = getW3(point); + if (W === 1) + return this._unsafeLadder(point, scalar, prev); + return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev); + } + // We calculate precomputes for elliptic curve point multiplication + // using windowed method. This specifies window size and + // stores precomputed values. Usually only base point would be precomputed. + createCache(P2, W) { + validateW3(W, this.bits); + pointWindowSizes3.set(P2, W); + pointPrecomputes3.delete(P2); + } + hasCache(elm) { + return getW3(elm) !== 1; } }; } }); -// src/auth.ts -var auth_exports = {}; -__export(auth_exports, { - CHAIN_FILE: () => CHAIN_FILE, - MNEMONIC_FILE: () => MNEMONIC_FILE, - ONCHAINOS_DOWNLOAD_URL: () => ONCHAINOS_DOWNLOAD_URL, - ONCHAINOS_INSTALLER_URL: () => ONCHAINOS_INSTALLER_URL, - OnchainOsRequiredError: () => OnchainOsRequiredError, - WALLET_DIR: () => WALLET_DIR, - WALLET_FILE: () => WALLET_FILE, - detectOnchainosWallet: () => detectOnchainosWallet, - envKeyAuth: () => envKeyAuth, - formatAgenticWalletStatus: () => formatAgenticWalletStatus, - loadPaymentChain: () => loadPaymentChain, - recoverWalletFromMnemonic: () => recoverWalletFromMnemonic, - resolveOrGenerateWalletKey: () => resolveOrGenerateWalletKey, - resolvePaymentChain: () => resolvePaymentChain, - savePaymentChain: () => savePaymentChain, - setupSolana: () => setupSolana, - walletKeyAuth: () => walletKeyAuth -}); -import { writeFile, mkdir as mkdir2 } from "fs/promises"; -import { join as join6 } from "path"; -import { homedir as homedir4 } from "os"; -function errorReason(err) { - if (err instanceof Error) return err.message; - return String(err); -} -async function detectOnchainosWallet() { - const adapter = new OnchainOsAdapter(); - if (!adapter.isInstalled()) return { kind: "no-binary" }; - let status; - try { - status = await adapter.status(); - } catch (err) { - return { kind: "status-error", reason: errorReason(err) }; - } - if (!status.loggedIn) return { kind: "not-logged-in" }; - let evmAddress = status.evmAddress; - if (!evmAddress) { - try { - const addresses = await adapter.addresses(); - if (addresses.evm) evmAddress = addresses.evm; - } catch (err) { - return { kind: "addresses-error", reason: errorReason(err) }; - } +// node_modules/@noble/curves/node_modules/@noble/hashes/hmac.js +var _HMAC, hmac2; +var init_hmac2 = __esm({ + "node_modules/@noble/curves/node_modules/@noble/hashes/hmac.js"() { + "use strict"; + init_utils8(); + _HMAC = class { + oHash; + iHash; + blockLen; + outputLen; + finished = false; + destroyed = false; + constructor(hash3, key) { + ahash2(hash3); + abytes4(key, void 0, "key"); + this.iHash = hash3.create(); + if (typeof this.iHash.update !== "function") + throw new Error("Expected instance of class which extends utils.Hash"); + this.blockLen = this.iHash.blockLen; + this.outputLen = this.iHash.outputLen; + const blockLen = this.blockLen; + const pad4 = new Uint8Array(blockLen); + pad4.set(key.length > blockLen ? hash3.create().update(key).digest() : key); + for (let i = 0; i < pad4.length; i++) + pad4[i] ^= 54; + this.iHash.update(pad4); + this.oHash = hash3.create(); + for (let i = 0; i < pad4.length; i++) + pad4[i] ^= 54 ^ 92; + this.oHash.update(pad4); + clean2(pad4); + } + update(buf) { + aexists2(this); + this.iHash.update(buf); + return this; + } + digestInto(out) { + aexists2(this); + abytes4(out, this.outputLen, "output"); + this.finished = true; + this.iHash.digestInto(out); + this.oHash.update(out); + this.oHash.digestInto(out); + this.destroy(); + } + digest() { + const out = new Uint8Array(this.oHash.outputLen); + this.digestInto(out); + return out; + } + _cloneInto(to) { + to ||= Object.create(Object.getPrototypeOf(this), {}); + const { oHash, iHash, finished: finished2, destroyed, blockLen, outputLen } = this; + to = to; + to.finished = finished2; + to.destroyed = destroyed; + to.blockLen = blockLen; + to.outputLen = outputLen; + to.oHash = oHash._cloneInto(to.oHash); + to.iHash = iHash._cloneInto(to.iHash); + return to; + } + clone() { + return this._cloneInto(); + } + destroy() { + this.destroyed = true; + this.oHash.destroy(); + this.iHash.destroy(); + } + }; + hmac2 = (hash3, key, message) => new _HMAC(hash3, key).update(message).digest(); + hmac2.create = (hash3, key) => new _HMAC(hash3, key); } - if (!evmAddress) return { kind: "no-evm-address" }; - return { kind: "ok", address: evmAddress, email: status.email, adapter }; -} -function formatAgenticWalletStatus(detection) { - switch (detection.kind) { - case "ok": - return []; - case "no-binary": - return [ - { level: "warn", text: "\u26A0 OKX Agentic Wallet not installed" }, - { level: "info", text: ` \u2192 Download: ${ONCHAINOS_DOWNLOAD_URL}` }, - { level: "info", text: " \u2192 After install, run: onchainos login" } - ]; - case "not-logged-in": - return [ - { level: "info", text: "\u2713 OKX Agentic Wallet installed" }, - { level: "warn", text: "\u2717 Login status: not logged in" }, - { level: "info", text: " \u2192 Run: onchainos login" } - ]; - case "status-error": - return [ - { level: "info", text: "\u2713 OKX Agentic Wallet installed" }, - { - level: "warn", - text: `\u2717 Login status: unknown \u2014 status check failed: ${detection.reason}` - } - ]; - case "no-evm-address": - return [ - { level: "info", text: "\u2713 OKX Agentic Wallet installed (logged in)" }, - { level: "warn", text: "\u2717 No EVM address found (Solana-only account?)" } - ]; - case "addresses-error": - return [ - { level: "info", text: "\u2713 OKX Agentic Wallet installed (logged in)" }, - { level: "warn", text: `\u2717 Could not read wallet addresses: ${detection.reason}` } - ]; +}); + +// node_modules/@noble/curves/abstract/weierstrass.js +function _splitEndoScalar(k, basis, n) { + const [[a1, b1], [a2, b2]] = basis; + const c1 = divNearest3(b2 * k, n); + const c2 = divNearest3(-b1 * k, n); + let k1 = k - c1 * a1 - c2 * a2; + let k2 = -c1 * b1 - c2 * b2; + const k1neg = k1 < _0n15; + const k2neg = k2 < _0n15; + if (k1neg) + k1 = -k1; + if (k2neg) + k2 = -k2; + const MAX_NUM = bitMask3(Math.ceil(bitLen3(n) / 2)) + _1n15; + if (k1 < _0n15 || k1 >= MAX_NUM || k2 < _0n15 || k2 >= MAX_NUM) { + throw new Error("splitScalar (endomorphism): failed, k=" + k); } + return { k1neg, k1, k2neg, k2 }; } -async function savePaymentChain(chain3) { - await mkdir2(WALLET_DIR, { recursive: true }); - await writeFile(CHAIN_FILE, chain3 + "\n", { mode: 384 }); +function validateSigFormat(format) { + if (!["compact", "recovered", "der"].includes(format)) + throw new Error('Signature format must be "compact", "recovered", or "der"'); + return format; } -async function loadPaymentChain() { - try { - const content = (await readTextFile(CHAIN_FILE)).trim(); - if (content === "solana") return "solana"; - return "base"; - } catch { - return "base"; +function validateSigOpts(opts, def) { + const optsn = {}; + for (let optName of Object.keys(def)) { + optsn[optName] = opts[optName] === void 0 ? def[optName] : opts[optName]; } + abool3(optsn.lowS, "lowS"); + abool3(optsn.prehash, "prehash"); + if (optsn.format !== void 0) + validateSigFormat(optsn.format); + return optsn; } -async function resolvePaymentChain() { - const env = process.env.XCLAWROUTER_PAYMENT_CHAIN ?? process.env.CLAWROUTER_PAYMENT_CHAIN; - if (env === "solana") return "solana"; - if (env === "base") return "base"; - return loadPaymentChain(); -} -async function loadSavedWallet() { - try { - const key = (await readTextFile(WALLET_FILE)).trim(); - if (key.startsWith("0x") && key.length === 66) { - console.log(`[XClawRouter] \u2713 Loaded existing wallet from ${WALLET_FILE}`); - return key; +function weierstrass3(params, extraOpts = {}) { + const validated = createCurveFields("weierstrass", params, extraOpts); + const { Fp, Fn: Fn2 } = validated; + let CURVE = validated.CURVE; + const { h: cofactor, n: CURVE_ORDER } = CURVE; + validateObject3(extraOpts, {}, { + allowInfinityPoint: "boolean", + clearCofactor: "function", + isTorsionFree: "function", + fromBytes: "function", + toBytes: "function", + endo: "object" + }); + const { endo } = extraOpts; + if (endo) { + if (!Fp.is0(CURVE.a) || typeof endo.beta !== "bigint" || !Array.isArray(endo.basises)) { + throw new Error('invalid endo: expected "beta": bigint and "basises": array'); } - console.error(`[XClawRouter] \u2717 CRITICAL: Wallet file exists but has invalid format!`); - console.error(`[XClawRouter] File: ${WALLET_FILE}`); - console.error(`[XClawRouter] Expected: 0x followed by 64 hex characters (66 chars total)`); - throw new Error( - `Wallet file at ${WALLET_FILE} is corrupted or has wrong format. Refusing to auto-generate new wallet to protect existing funds. Restore your backup key or set BLOCKRUN_WALLET_KEY environment variable.` - ); - } catch (err) { - if (err.code !== "ENOENT") { - if (err instanceof Error && err.message.includes("Refusing to auto-generate")) { - throw err; + } + const lengths = getWLengths(Fp, Fn2); + function assertCompressionIsSupported() { + if (!Fp.isOdd) + throw new Error("compression is not supported: Field does not have .isOdd()"); + } + function pointToBytes2(_c, point, isCompressed) { + const { x, y } = point.toAffine(); + const bx = Fp.toBytes(x); + abool3(isCompressed, "isCompressed"); + if (isCompressed) { + assertCompressionIsSupported(); + const hasEvenY = !Fp.isOdd(y); + return concatBytes5(pprefix(hasEvenY), bx); + } else { + return concatBytes5(Uint8Array.of(4), bx, Fp.toBytes(y)); + } + } + function pointFromBytes(bytes) { + abytes4(bytes, void 0, "Point"); + const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; + const length = bytes.length; + const head = bytes[0]; + const tail = bytes.subarray(1); + if (length === comp && (head === 2 || head === 3)) { + const x = Fp.fromBytes(tail); + if (!Fp.isValid(x)) + throw new Error("bad point: is not on curve, wrong x"); + const y2 = weierstrassEquation(x); + let y; + try { + y = Fp.sqrt(y2); + } catch (sqrtError) { + const err = sqrtError instanceof Error ? ": " + sqrtError.message : ""; + throw new Error("bad point: is not on curve, sqrt error" + err); } - throw new Error( - `Cannot read wallet file at ${WALLET_FILE}: ${err instanceof Error ? err.message : String(err)}.`, - { cause: err } - ); + assertCompressionIsSupported(); + const evenY = Fp.isOdd(y); + const evenH = (head & 1) === 1; + if (evenH !== evenY) + y = Fp.neg(y); + return { x, y }; + } else if (length === uncomp && head === 4) { + const L = Fp.BYTES; + const x = Fp.fromBytes(tail.subarray(0, L)); + const y = Fp.fromBytes(tail.subarray(L, L * 2)); + if (!isValidXY(x, y)) + throw new Error("bad point: is not on curve"); + return { x, y }; + } else { + throw new Error(`bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`); + } + } + const encodePoint = extraOpts.toBytes || pointToBytes2; + const decodePoint = extraOpts.fromBytes || pointFromBytes; + function weierstrassEquation(x) { + const x2 = Fp.sqr(x); + const x3 = Fp.mul(x2, x); + return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); + } + function isValidXY(x, y) { + const left = Fp.sqr(y); + const right = weierstrassEquation(x); + return Fp.eql(left, right); + } + if (!isValidXY(CURVE.Gx, CURVE.Gy)) + throw new Error("bad curve params: generator point"); + const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n6), _4n6); + const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27)); + if (Fp.is0(Fp.add(_4a3, _27b2))) + throw new Error("bad curve params: a or b"); + function acoord(title, n, banZero = false) { + if (!Fp.isValid(n) || banZero && Fp.is0(n)) + throw new Error(`bad point coordinate ${title}`); + return n; + } + function aprjpoint(other) { + if (!(other instanceof Point3)) + throw new Error("Weierstrass Point expected"); + } + function splitEndoScalarN(k) { + if (!endo || !endo.basises) + throw new Error("no endo"); + return _splitEndoScalar(k, endo.basises, Fn2.ORDER); + } + const toAffineMemo = memoized3((p, iz) => { + const { X, Y, Z } = p; + if (Fp.eql(Z, Fp.ONE)) + return { x: X, y: Y }; + const is0 = p.is0(); + if (iz == null) + iz = is0 ? Fp.ONE : Fp.inv(Z); + const x = Fp.mul(X, iz); + const y = Fp.mul(Y, iz); + const zz = Fp.mul(Z, iz); + if (is0) + return { x: Fp.ZERO, y: Fp.ZERO }; + if (!Fp.eql(zz, Fp.ONE)) + throw new Error("invZ was invalid"); + return { x, y }; + }); + const assertValidMemo = memoized3((p) => { + if (p.is0()) { + if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) + return; + throw new Error("bad point: ZERO"); + } + const { x, y } = p.toAffine(); + if (!Fp.isValid(x) || !Fp.isValid(y)) + throw new Error("bad point: x or y not field elements"); + if (!isValidXY(x, y)) + throw new Error("bad point: equation left != right"); + if (!p.isTorsionFree()) + throw new Error("bad point: not in prime-order subgroup"); + return true; + }); + function finishEndo(endoBeta, k1p, k2p, k1neg, k2neg) { + k2p = new Point3(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z); + k1p = negateCt(k1neg, k1p); + k2p = negateCt(k2neg, k2p); + return k1p.add(k2p); + } + class Point3 { + // base / generator point + static BASE = new Point3(CURVE.Gx, CURVE.Gy, Fp.ONE); + // zero / infinity / identity point + static ZERO = new Point3(Fp.ZERO, Fp.ONE, Fp.ZERO); + // 0, 1, 0 + // math field + static Fp = Fp; + // scalar field + static Fn = Fn2; + X; + Y; + Z; + /** Does NOT validate if the point is valid. Use `.assertValidity()`. */ + constructor(X, Y, Z) { + this.X = acoord("x", X); + this.Y = acoord("y", Y, true); + this.Z = acoord("z", Z); + Object.freeze(this); + } + static CURVE() { + return CURVE; + } + /** Does NOT validate if the point is valid. Use `.assertValidity()`. */ + static fromAffine(p) { + const { x, y } = p || {}; + if (!p || !Fp.isValid(x) || !Fp.isValid(y)) + throw new Error("invalid affine point"); + if (p instanceof Point3) + throw new Error("projective point not allowed"); + if (Fp.is0(x) && Fp.is0(y)) + return Point3.ZERO; + return new Point3(x, y, Fp.ONE); + } + static fromBytes(bytes) { + const P2 = Point3.fromAffine(decodePoint(abytes4(bytes, void 0, "point"))); + P2.assertValidity(); + return P2; + } + static fromHex(hex) { + return Point3.fromBytes(hexToBytes4(hex)); + } + get x() { + return this.toAffine().x; + } + get y() { + return this.toAffine().y; + } + /** + * + * @param windowSize + * @param isLazy true will defer table computation until the first multiplication + * @returns + */ + precompute(windowSize = 8, isLazy = true) { + wnaf.createCache(this, windowSize); + if (!isLazy) + this.multiply(_3n6); + return this; + } + // TODO: return `this` + /** A point on curve is valid if it conforms to equation. */ + assertValidity() { + assertValidMemo(this); + } + hasEvenY() { + const { y } = this.toAffine(); + if (!Fp.isOdd) + throw new Error("Field doesn't support isOdd"); + return !Fp.isOdd(y); + } + /** Compare one point to another. */ + equals(other) { + aprjpoint(other); + const { X: X1, Y: Y1, Z: Z1 } = this; + const { X: X2, Y: Y2, Z: Z2 } = other; + const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1)); + const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1)); + return U1 && U2; + } + /** Flips point to one corresponding to (x, -y) in Affine coordinates. */ + negate() { + return new Point3(this.X, Fp.neg(this.Y), this.Z); + } + // Renes-Costello-Batina exception-free doubling formula. + // There is 30% faster Jacobian formula, but it is not complete. + // https://eprint.iacr.org/2015/1060, algorithm 3 + // Cost: 8M + 3S + 3*a + 2*b3 + 15add. + double() { + const { a, b } = CURVE; + const b3 = Fp.mul(b, _3n6); + const { X: X1, Y: Y1, Z: Z1 } = this; + let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; + let t0 = Fp.mul(X1, X1); + let t1 = Fp.mul(Y1, Y1); + let t2 = Fp.mul(Z1, Z1); + let t3 = Fp.mul(X1, Y1); + t3 = Fp.add(t3, t3); + Z3 = Fp.mul(X1, Z1); + Z3 = Fp.add(Z3, Z3); + X3 = Fp.mul(a, Z3); + Y3 = Fp.mul(b3, t2); + Y3 = Fp.add(X3, Y3); + X3 = Fp.sub(t1, Y3); + Y3 = Fp.add(t1, Y3); + Y3 = Fp.mul(X3, Y3); + X3 = Fp.mul(t3, X3); + Z3 = Fp.mul(b3, Z3); + t2 = Fp.mul(a, t2); + t3 = Fp.sub(t0, t2); + t3 = Fp.mul(a, t3); + t3 = Fp.add(t3, Z3); + Z3 = Fp.add(t0, t0); + t0 = Fp.add(Z3, t0); + t0 = Fp.add(t0, t2); + t0 = Fp.mul(t0, t3); + Y3 = Fp.add(Y3, t0); + t2 = Fp.mul(Y1, Z1); + t2 = Fp.add(t2, t2); + t0 = Fp.mul(t2, t3); + X3 = Fp.sub(X3, t0); + Z3 = Fp.mul(t2, t1); + Z3 = Fp.add(Z3, Z3); + Z3 = Fp.add(Z3, Z3); + return new Point3(X3, Y3, Z3); + } + // Renes-Costello-Batina exception-free addition formula. + // There is 30% faster Jacobian formula, but it is not complete. + // https://eprint.iacr.org/2015/1060, algorithm 1 + // Cost: 12M + 0S + 3*a + 3*b3 + 23add. + add(other) { + aprjpoint(other); + const { X: X1, Y: Y1, Z: Z1 } = this; + const { X: X2, Y: Y2, Z: Z2 } = other; + let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; + const a = CURVE.a; + const b3 = Fp.mul(CURVE.b, _3n6); + let t0 = Fp.mul(X1, X2); + let t1 = Fp.mul(Y1, Y2); + let t2 = Fp.mul(Z1, Z2); + let t3 = Fp.add(X1, Y1); + let t4 = Fp.add(X2, Y2); + t3 = Fp.mul(t3, t4); + t4 = Fp.add(t0, t1); + t3 = Fp.sub(t3, t4); + t4 = Fp.add(X1, Z1); + let t5 = Fp.add(X2, Z2); + t4 = Fp.mul(t4, t5); + t5 = Fp.add(t0, t2); + t4 = Fp.sub(t4, t5); + t5 = Fp.add(Y1, Z1); + X3 = Fp.add(Y2, Z2); + t5 = Fp.mul(t5, X3); + X3 = Fp.add(t1, t2); + t5 = Fp.sub(t5, X3); + Z3 = Fp.mul(a, t4); + X3 = Fp.mul(b3, t2); + Z3 = Fp.add(X3, Z3); + X3 = Fp.sub(t1, Z3); + Z3 = Fp.add(t1, Z3); + Y3 = Fp.mul(X3, Z3); + t1 = Fp.add(t0, t0); + t1 = Fp.add(t1, t0); + t2 = Fp.mul(a, t2); + t4 = Fp.mul(b3, t4); + t1 = Fp.add(t1, t2); + t2 = Fp.sub(t0, t2); + t2 = Fp.mul(a, t2); + t4 = Fp.add(t4, t2); + t0 = Fp.mul(t1, t4); + Y3 = Fp.add(Y3, t0); + t0 = Fp.mul(t5, t4); + X3 = Fp.mul(t3, X3); + X3 = Fp.sub(X3, t0); + t0 = Fp.mul(t3, t1); + Z3 = Fp.mul(t5, Z3); + Z3 = Fp.add(Z3, t0); + return new Point3(X3, Y3, Z3); + } + subtract(other) { + return this.add(other.negate()); + } + is0() { + return this.equals(Point3.ZERO); + } + /** + * Constant time multiplication. + * Uses wNAF method. Windowed method may be 10% faster, + * but takes 2x longer to generate and consumes 2x memory. + * Uses precomputes when available. + * Uses endomorphism for Koblitz curves. + * @param scalar by which the point would be multiplied + * @returns New point + */ + multiply(scalar) { + const { endo: endo2 } = extraOpts; + if (!Fn2.isValidNot0(scalar)) + throw new Error("invalid scalar: out of range"); + let point, fake; + const mul = (n) => wnaf.cached(this, n, (p) => normalizeZ(Point3, p)); + if (endo2) { + const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar); + const { p: k1p, f: k1f } = mul(k1); + const { p: k2p, f: k2f } = mul(k2); + fake = k1f.add(k2f); + point = finishEndo(endo2.beta, k1p, k2p, k1neg, k2neg); + } else { + const { p, f } = mul(scalar); + point = p; + fake = f; + } + return normalizeZ(Point3, [point, fake])[0]; + } + /** + * Non-constant-time multiplication. Uses double-and-add algorithm. + * It's faster, but should only be used when you don't care about + * an exposed secret key e.g. sig verification, which works over *public* keys. + */ + multiplyUnsafe(sc) { + const { endo: endo2 } = extraOpts; + const p = this; + if (!Fn2.isValid(sc)) + throw new Error("invalid scalar: out of range"); + if (sc === _0n15 || p.is0()) + return Point3.ZERO; + if (sc === _1n15) + return p; + if (wnaf.hasCache(this)) + return this.multiply(sc); + if (endo2) { + const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc); + const { p1, p2 } = mulEndoUnsafe(Point3, p, k1, k2); + return finishEndo(endo2.beta, p1, p2, k1neg, k2neg); + } else { + return wnaf.unsafe(p, sc); + } + } + /** + * Converts Projective point to affine (x, y) coordinates. + * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch + */ + toAffine(invertedZ) { + return toAffineMemo(this, invertedZ); + } + /** + * Checks whether Point is free of torsion elements (is in prime subgroup). + * Always torsion-free for cofactor=1 curves. + */ + isTorsionFree() { + const { isTorsionFree } = extraOpts; + if (cofactor === _1n15) + return true; + if (isTorsionFree) + return isTorsionFree(Point3, this); + return wnaf.unsafe(this, CURVE_ORDER).is0(); + } + clearCofactor() { + const { clearCofactor } = extraOpts; + if (cofactor === _1n15) + return this; + if (clearCofactor) + return clearCofactor(Point3, this); + return this.multiplyUnsafe(cofactor); + } + isSmallOrder() { + return this.multiplyUnsafe(cofactor).is0(); } - } - return void 0; -} -async function loadMnemonic() { - try { - const mnemonic = (await readTextFile(MNEMONIC_FILE)).trim(); - if (mnemonic && isValidMnemonic(mnemonic)) return mnemonic; - console.warn(`[XClawRouter] \u26A0 Mnemonic file exists but has invalid format \u2014 ignoring`); - return void 0; - } catch (err) { - if (err.code !== "ENOENT") { - console.warn(`[XClawRouter] \u26A0 Cannot read mnemonic file \u2014 ignoring`); + toBytes(isCompressed = true) { + abool3(isCompressed, "isCompressed"); + this.assertValidity(); + return encodePoint(Point3, this, isCompressed); + } + toHex(isCompressed = true) { + return bytesToHex4(this.toBytes(isCompressed)); + } + toString() { + return ``; } } - return void 0; + const bits = Fn2.BITS; + const wnaf = new wNAF3(Point3, extraOpts.endo ? Math.ceil(bits / 2) : bits); + Point3.BASE.precompute(8); + return Point3; } -async function saveMnemonic(mnemonic) { - await mkdir2(WALLET_DIR, { recursive: true }); - await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 384 }); +function pprefix(hasEvenY) { + return Uint8Array.of(hasEvenY ? 2 : 3); } -async function generateAndSaveWallet() { - const existingMnemonic = await loadMnemonic(); - if (existingMnemonic) { - throw new Error( - `Mnemonic file exists at ${MNEMONIC_FILE} but wallet.key is missing. -Refusing to generate a new wallet to protect existing funds.` - ); - } - const mnemonic = generateWalletMnemonic(); - const derived = deriveAllKeys(mnemonic); - await mkdir2(WALLET_DIR, { recursive: true }); - await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 384 }); - await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 384 }); - const verification = (await readTextFile(WALLET_FILE)).trim(); - if (verification !== derived.evmPrivateKey) { - throw new Error("Wallet file verification failed - content mismatch"); - } +function getWLengths(Fp, Fn2) { return { - key: derived.evmPrivateKey, - address: derived.evmAddress, - mnemonic, - solanaPrivateKeyBytes: derived.solanaPrivateKeyBytes + secretKey: Fn2.BYTES, + publicKey: 1 + Fp.BYTES, + publicKeyUncompressed: 1 + 2 * Fp.BYTES, + publicKeyHasPrefix: true, + signature: 2 * Fn2.BYTES }; } -async function resolveOrGenerateWalletKey() { - const onchainosDetection = await detectOnchainosWallet(); - if (onchainosDetection.kind === "ok") { - return { - address: onchainosDetection.address, - source: "okx", - onchainos: onchainosDetection.adapter, - email: onchainosDetection.email, - onchainosDetection - }; - } - const saved = await loadSavedWallet(); - if (saved) { - const account = privateKeyToAccount(saved); - const mnemonic = await loadMnemonic(); - if (mnemonic) { - const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); - return { - key: saved, - address: account.address, - source: "saved", - mnemonic, - solanaPrivateKeyBytes: solanaKeyBytes, - onchainosDetection - }; +function ecdh(Point3, ecdhOpts = {}) { + const { Fn: Fn2 } = Point3; + const randomBytes_ = ecdhOpts.randomBytes || randomBytes2; + const lengths = Object.assign(getWLengths(Point3.Fp, Fn2), { seed: getMinHashLength3(Fn2.ORDER) }); + function isValidSecretKey(secretKey) { + try { + const num2 = Fn2.fromBytes(secretKey); + return Fn2.isValidNot0(num2); + } catch (error) { + return false; } - return { key: saved, address: account.address, source: "saved", onchainosDetection }; } - const envKey = process.env.BLOCKRUN_WALLET_KEY; - if (typeof envKey === "string" && envKey.startsWith("0x") && envKey.length === 66) { - const account = privateKeyToAccount(envKey); - const mnemonic = await loadMnemonic(); - if (mnemonic) { - const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); - return { - key: envKey, - address: account.address, - source: "env", - mnemonic, - solanaPrivateKeyBytes: solanaKeyBytes, - onchainosDetection - }; + function isValidPublicKey(publicKey, isCompressed) { + const { publicKey: comp, publicKeyUncompressed } = lengths; + try { + const l2 = publicKey.length; + if (isCompressed === true && l2 !== comp) + return false; + if (isCompressed === false && l2 !== publicKeyUncompressed) + return false; + return !!Point3.fromBytes(publicKey); + } catch (error) { + return false; } - return { key: envKey, address: account.address, source: "env", onchainosDetection }; } - if (process.env.XCLAWROUTER_USE_LOCAL_WALLET !== "1") { - throw new OnchainOsRequiredError(onchainosDetection); + function randomSecretKey(seed = randomBytes_(lengths.seed)) { + return mapHashToField3(abytes4(seed, lengths.seed, "seed"), Fn2.ORDER); } - const result = await generateAndSaveWallet(); - return { - key: result.key, - address: result.address, - source: "generated", - mnemonic: result.mnemonic, - solanaPrivateKeyBytes: result.solanaPrivateKeyBytes, - onchainosDetection + function getPublicKey(secretKey, isCompressed = true) { + return Point3.BASE.multiply(Fn2.fromBytes(secretKey)).toBytes(isCompressed); + } + function isProbPub(item) { + const { secretKey, publicKey, publicKeyUncompressed } = lengths; + if (!isBytes5(item)) + return void 0; + if ("_lengths" in Fn2 && Fn2._lengths || secretKey === publicKey) + return void 0; + const l2 = abytes4(item, void 0, "key").length; + return l2 === publicKey || l2 === publicKeyUncompressed; + } + function getSharedSecret(secretKeyA, publicKeyB, isCompressed = true) { + if (isProbPub(secretKeyA) === true) + throw new Error("first arg must be private key"); + if (isProbPub(publicKeyB) === false) + throw new Error("second arg must be public key"); + const s3 = Fn2.fromBytes(secretKeyA); + const b = Point3.fromBytes(publicKeyB); + return b.multiply(s3).toBytes(isCompressed); + } + const utils2 = { + isValidSecretKey, + isValidPublicKey, + randomSecretKey }; + const keygen = createKeygen(randomSecretKey, getPublicKey); + return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point: Point3, utils: utils2, lengths }); } -async function recoverWalletFromMnemonic() { - const mnemonic = await loadMnemonic(); - if (!mnemonic) { - console.error(`[XClawRouter] No mnemonic found at ${MNEMONIC_FILE}`); - process.exit(1); +function ecdsa(Point3, hash3, ecdsaOpts = {}) { + ahash2(hash3); + validateObject3(ecdsaOpts, {}, { + hmac: "function", + lowS: "boolean", + randomBytes: "function", + bits2int: "function", + bits2int_modN: "function" + }); + ecdsaOpts = Object.assign({}, ecdsaOpts); + const randomBytes4 = ecdsaOpts.randomBytes || randomBytes2; + const hmac4 = ecdsaOpts.hmac || ((key, msg) => hmac2(hash3, key, msg)); + const { Fp, Fn: Fn2 } = Point3; + const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn2; + const { keygen, getPublicKey, getSharedSecret, utils: utils2, lengths } = ecdh(Point3, ecdsaOpts); + const defaultSigOpts = { + prehash: true, + lowS: typeof ecdsaOpts.lowS === "boolean" ? ecdsaOpts.lowS : true, + format: "compact", + extraEntropy: false + }; + const hasLargeCofactor = CURVE_ORDER * _2n9 < Fp.ORDER; + function isBiggerThanHalfOrder(number) { + const HALF = CURVE_ORDER >> _1n15; + return number > HALF; } - const existing = await loadSavedWallet().catch(() => void 0); - if (existing) { - console.error(`[XClawRouter] wallet.key already exists at ${WALLET_FILE}`); - process.exit(1); + function validateRS(title, num2) { + if (!Fn2.isValidNot0(num2)) + throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`); + return num2; } - const derived = deriveAllKeys(mnemonic); - const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); - const solanaAddress = await getSolanaAddress(solanaKeyBytes).catch(() => void 0); - console.log(`[XClawRouter] Derived EVM Address : ${derived.evmAddress}`); - if (solanaAddress) console.log(`[XClawRouter] Derived Solana Address: ${solanaAddress}`); - await mkdir2(WALLET_DIR, { recursive: true }); - await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 384 }); - console.log(`[XClawRouter] \u2713 wallet.key restored at ${WALLET_FILE}`); -} -async function setupSolana() { - const existing = await loadMnemonic(); - if (existing) throw new Error("Solana wallet already set up at " + MNEMONIC_FILE); - const savedKey = await loadSavedWallet(); - if (!savedKey) { - throw new Error( - "No EVM wallet found. Run XClawRouter first to generate a wallet before setting up Solana." - ); + function assertSmallCofactor() { + if (hasLargeCofactor) + throw new Error('"recovered" sig type is not supported for cofactor >2 curves'); } - const mnemonic = generateWalletMnemonic(); - const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); - await saveMnemonic(mnemonic); - return { mnemonic, solanaPrivateKeyBytes: solanaKeyBytes }; -} -var ONCHAINOS_DOWNLOAD_URL, ONCHAINOS_INSTALLER_URL, OnchainOsRequiredError, WALLET_DIR, WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE, walletKeyAuth, envKeyAuth; -var init_auth = __esm({ - "src/auth.ts"() { - "use strict"; - init_fs_read(); - init_accounts(); - init_wallet(); - init_onchainos_adapter(); - ONCHAINOS_DOWNLOAD_URL = "https://web3.okx.com/onchainos"; - ONCHAINOS_INSTALLER_URL = "https://raw.githubusercontent.com/okx/onchainos-skills/main/install.sh"; - OnchainOsRequiredError = class extends Error { - constructor(detection) { - const notInstalled = detection.kind === "no-binary"; - super( - "No wallet available.\n\nXClawRouter uses OKX Agentic Wallet (onchainos). " + (notInstalled ? "onchainos is not installed yet.\n" : "onchainos is installed but you're not logged in yet.\n") + "\nRun this one command to install + log in:\n npx @blockrun/xclawrouter setup\n\nIt will install the onchainos binary (if needed) and prompt you for\nemail + OTP. Then restart the gateway: openclaw gateway restart\n\nOpt-out (legacy local BIP-39 wallet \u2014 you manage backups yourself):\n export XCLAWROUTER_USE_LOCAL_WALLET=1\n openclaw gateway restart\n" - ); - this.detection = detection; - this.name = "OnchainOsRequiredError"; + function validateSigLength(bytes, format) { + validateSigFormat(format); + const size5 = lengths.signature; + const sizer = format === "compact" ? size5 : format === "recovered" ? size5 + 1 : void 0; + return abytes4(bytes, sizer); + } + class Signature { + r; + s; + recovery; + constructor(r, s3, recovery) { + this.r = validateRS("r", r); + this.s = validateRS("s", s3); + if (recovery != null) { + assertSmallCofactor(); + if (![0, 1, 2, 3].includes(recovery)) + throw new Error("invalid recovery id"); + this.recovery = recovery; } - }; - WALLET_DIR = join6(homedir4(), ".openclaw", "blockrun"); - WALLET_FILE = join6(WALLET_DIR, "wallet.key"); - MNEMONIC_FILE = join6(WALLET_DIR, "mnemonic"); - CHAIN_FILE = join6(WALLET_DIR, "payment-chain"); - walletKeyAuth = { - id: "wallet-key", - label: "Wallet Private Key", - hint: "Enter your EVM wallet private key (0x...) for x402 payments", - kind: "api_key", - run: async (ctx) => { - const key = await ctx.prompter.text({ - message: "Enter your wallet private key (0x...)", - validate: (value) => { - const trimmed = value.trim(); - if (!trimmed.startsWith("0x")) return "Key must start with 0x"; - if (trimmed.length !== 66) return "Key must be 66 characters"; - if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed)) return "Key must be valid hex"; - return void 0; - } - }); - if (!key || typeof key !== "string") throw new Error("Wallet key is required"); - return { - profiles: [{ profileId: "default", credential: { apiKey: key.trim() } }], - notes: ["Wallet key stored securely in OpenClaw credentials."] - }; + Object.freeze(this); + } + static fromBytes(bytes, format = defaultSigOpts.format) { + validateSigLength(bytes, format); + let recid; + if (format === "der") { + const { r: r2, s: s4 } = DER3.toSig(abytes4(bytes)); + return new Signature(r2, s4); } - }; - envKeyAuth = { - id: "env-key", - label: "Environment Variable", - hint: "Use BLOCKRUN_WALLET_KEY environment variable", - kind: "api_key", - run: async () => { - const key = process.env.BLOCKRUN_WALLET_KEY; - if (!key) throw new Error("BLOCKRUN_WALLET_KEY environment variable is not set."); - return { - profiles: [{ profileId: "default", credential: { apiKey: key.trim() } }], - notes: ["Using wallet key from BLOCKRUN_WALLET_KEY environment variable."] - }; + if (format === "recovered") { + recid = bytes[0]; + format = "compact"; + bytes = bytes.subarray(1); } - }; + const L = lengths.signature / 2; + const r = bytes.subarray(0, L); + const s3 = bytes.subarray(L, L * 2); + return new Signature(Fn2.fromBytes(r), Fn2.fromBytes(s3), recid); + } + static fromHex(hex, format) { + return this.fromBytes(hexToBytes4(hex), format); + } + assertRecovery() { + const { recovery } = this; + if (recovery == null) + throw new Error("invalid recovery id: must be present"); + return recovery; + } + addRecoveryBit(recovery) { + return new Signature(this.r, this.s, recovery); + } + recoverPublicKey(messageHash) { + const { r, s: s3 } = this; + const recovery = this.assertRecovery(); + const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r; + if (!Fp.isValid(radj)) + throw new Error("invalid recovery id: sig.r+curve.n != R.x"); + const x = Fp.toBytes(radj); + const R = Point3.fromBytes(concatBytes5(pprefix((recovery & 1) === 0), x)); + const ir = Fn2.inv(radj); + const h = bits2int_modN(abytes4(messageHash, void 0, "msgHash")); + const u1 = Fn2.create(-h * ir); + const u2 = Fn2.create(s3 * ir); + const Q = Point3.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2)); + if (Q.is0()) + throw new Error("invalid recovery: point at infinify"); + Q.assertValidity(); + return Q; + } + // Signatures should be low-s, to prevent malleability. + hasHighS() { + return isBiggerThanHalfOrder(this.s); + } + toBytes(format = defaultSigOpts.format) { + validateSigFormat(format); + if (format === "der") + return hexToBytes4(DER3.hexFromSig(this)); + const { r, s: s3 } = this; + const rb = Fn2.toBytes(r); + const sb = Fn2.toBytes(s3); + if (format === "recovered") { + assertSmallCofactor(); + return concatBytes5(Uint8Array.of(this.assertRecovery()), rb, sb); + } + return concatBytes5(rb, sb); + } + toHex(format) { + return bytesToHex4(this.toBytes(format)); + } } -}); - -// node_modules/undici/lib/core/symbols.js -var require_symbols = __commonJS({ - "node_modules/undici/lib/core/symbols.js"(exports, module) { - "use strict"; - module.exports = { - kClose: /* @__PURE__ */ Symbol("close"), - kDestroy: /* @__PURE__ */ Symbol("destroy"), - kDispatch: /* @__PURE__ */ Symbol("dispatch"), - kUrl: /* @__PURE__ */ Symbol("url"), - kWriting: /* @__PURE__ */ Symbol("writing"), - kResuming: /* @__PURE__ */ Symbol("resuming"), - kQueue: /* @__PURE__ */ Symbol("queue"), - kConnect: /* @__PURE__ */ Symbol("connect"), - kConnecting: /* @__PURE__ */ Symbol("connecting"), - kKeepAliveDefaultTimeout: /* @__PURE__ */ Symbol("default keep alive timeout"), - kKeepAliveMaxTimeout: /* @__PURE__ */ Symbol("max keep alive timeout"), - kKeepAliveTimeoutThreshold: /* @__PURE__ */ Symbol("keep alive timeout threshold"), - kKeepAliveTimeoutValue: /* @__PURE__ */ Symbol("keep alive timeout"), - kKeepAlive: /* @__PURE__ */ Symbol("keep alive"), - kHeadersTimeout: /* @__PURE__ */ Symbol("headers timeout"), - kBodyTimeout: /* @__PURE__ */ Symbol("body timeout"), - kServerName: /* @__PURE__ */ Symbol("server name"), - kLocalAddress: /* @__PURE__ */ Symbol("local address"), - kHost: /* @__PURE__ */ Symbol("host"), - kNoRef: /* @__PURE__ */ Symbol("no ref"), - kBodyUsed: /* @__PURE__ */ Symbol("used"), - kBody: /* @__PURE__ */ Symbol("abstracted request body"), - kRunning: /* @__PURE__ */ Symbol("running"), - kBlocking: /* @__PURE__ */ Symbol("blocking"), - kPending: /* @__PURE__ */ Symbol("pending"), - kSize: /* @__PURE__ */ Symbol("size"), - kBusy: /* @__PURE__ */ Symbol("busy"), - kQueued: /* @__PURE__ */ Symbol("queued"), - kFree: /* @__PURE__ */ Symbol("free"), - kConnected: /* @__PURE__ */ Symbol("connected"), - kClosed: /* @__PURE__ */ Symbol("closed"), - kNeedDrain: /* @__PURE__ */ Symbol("need drain"), - kReset: /* @__PURE__ */ Symbol("reset"), - kDestroyed: /* @__PURE__ */ Symbol.for("nodejs.stream.destroyed"), - kResume: /* @__PURE__ */ Symbol("resume"), - kOnError: /* @__PURE__ */ Symbol("on error"), - kMaxHeadersSize: /* @__PURE__ */ Symbol("max headers size"), - kRunningIdx: /* @__PURE__ */ Symbol("running index"), - kPendingIdx: /* @__PURE__ */ Symbol("pending index"), - kError: /* @__PURE__ */ Symbol("error"), - kClients: /* @__PURE__ */ Symbol("clients"), - kClient: /* @__PURE__ */ Symbol("client"), - kParser: /* @__PURE__ */ Symbol("parser"), - kOnDestroyed: /* @__PURE__ */ Symbol("destroy callbacks"), - kPipelining: /* @__PURE__ */ Symbol("pipelining"), - kSocket: /* @__PURE__ */ Symbol("socket"), - kHostHeader: /* @__PURE__ */ Symbol("host header"), - kConnector: /* @__PURE__ */ Symbol("connector"), - kStrictContentLength: /* @__PURE__ */ Symbol("strict content length"), - kMaxRedirections: /* @__PURE__ */ Symbol("maxRedirections"), - kMaxRequests: /* @__PURE__ */ Symbol("maxRequestsPerClient"), - kProxy: /* @__PURE__ */ Symbol("proxy agent options"), - kCounter: /* @__PURE__ */ Symbol("socket request counter"), - kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"), - kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"), - kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"), - kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"), - kConstruct: /* @__PURE__ */ Symbol("constructable"), - kListeners: /* @__PURE__ */ Symbol("listeners"), - kHTTPContext: /* @__PURE__ */ Symbol("http context"), - kMaxConcurrentStreams: /* @__PURE__ */ Symbol("max concurrent streams"), - kHTTP2InitialWindowSize: /* @__PURE__ */ Symbol("http2 initial window size"), - kHTTP2ConnectionWindowSize: /* @__PURE__ */ Symbol("http2 connection window size"), - kEnableConnectProtocol: /* @__PURE__ */ Symbol("http2session connect protocol"), - kRemoteSettings: /* @__PURE__ */ Symbol("http2session remote settings"), - kHTTP2Stream: /* @__PURE__ */ Symbol("http2session client stream"), - kPingInterval: /* @__PURE__ */ Symbol("ping interval"), - kNoProxyAgent: /* @__PURE__ */ Symbol("no proxy agent"), - kHttpProxyAgent: /* @__PURE__ */ Symbol("http proxy agent"), - kHttpsProxyAgent: /* @__PURE__ */ Symbol("https proxy agent"), - kSocks5ProxyAgent: /* @__PURE__ */ Symbol("socks5 proxy agent") - }; + const bits2int = ecdsaOpts.bits2int || function bits2int_def(bytes) { + if (bytes.length > 8192) + throw new Error("input is too large"); + const num2 = bytesToNumberBE3(bytes); + const delta = bytes.length * 8 - fnBits; + return delta > 0 ? num2 >> BigInt(delta) : num2; + }; + const bits2int_modN = ecdsaOpts.bits2int_modN || function bits2int_modN_def(bytes) { + return Fn2.create(bits2int(bytes)); + }; + const ORDER_MASK = bitMask3(fnBits); + function int2octets(num2) { + aInRange3("num < 2^" + fnBits, num2, _0n15, ORDER_MASK); + return Fn2.toBytes(num2); } -}); - -// node_modules/undici/lib/util/timers.js -var require_timers = __commonJS({ - "node_modules/undici/lib/util/timers.js"(exports, module) { - "use strict"; - var fastNow = 0; - var RESOLUTION_MS = 1e3; - var TICK_MS = (RESOLUTION_MS >> 1) - 1; - var fastNowTimeout; - var kFastTimer = /* @__PURE__ */ Symbol("kFastTimer"); - var fastTimers = []; - var NOT_IN_LIST = -2; - var TO_BE_CLEARED = -1; - var PENDING = 0; - var ACTIVE = 1; - function onTick() { - fastNow += TICK_MS; - let idx = 0; - let len = fastTimers.length; - while (idx < len) { - const timer = fastTimers[idx]; - if (timer._state === PENDING) { - timer._idleStart = fastNow - TICK_MS; - timer._state = ACTIVE; - } else if (timer._state === ACTIVE && fastNow >= timer._idleStart + timer._idleTimeout) { - timer._state = TO_BE_CLEARED; - timer._idleStart = -1; - timer._onTimeout(timer._timerArg); - } - if (timer._state === TO_BE_CLEARED) { - timer._state = NOT_IN_LIST; - if (--len !== 0) { - fastTimers[idx] = fastTimers[len]; - } - } else { - ++idx; - } - } - fastTimers.length = len; - if (fastTimers.length !== 0) { - refreshTimeout(); - } + function validateMsgAndHash(message, prehash) { + abytes4(message, void 0, "message"); + return prehash ? abytes4(hash3(message), void 0, "prehashed message") : message; + } + function prepSig(message, secretKey, opts) { + const { lowS, prehash, extraEntropy: extraEntropy2 } = validateSigOpts(opts, defaultSigOpts); + message = validateMsgAndHash(message, prehash); + const h1int = bits2int_modN(message); + const d = Fn2.fromBytes(secretKey); + if (!Fn2.isValidNot0(d)) + throw new Error("invalid private key"); + const seedArgs = [int2octets(d), int2octets(h1int)]; + if (extraEntropy2 != null && extraEntropy2 !== false) { + const e7 = extraEntropy2 === true ? randomBytes4(lengths.secretKey) : extraEntropy2; + seedArgs.push(abytes4(e7, void 0, "extraEntropy")); } - function refreshTimeout() { - if (fastNowTimeout?.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTick, TICK_MS); - fastNowTimeout?.unref(); + const seed = concatBytes5(...seedArgs); + const m = h1int; + function k2sig(kBytes) { + const k = bits2int(kBytes); + if (!Fn2.isValidNot0(k)) + return; + const ik = Fn2.inv(k); + const q = Point3.BASE.multiply(k).toAffine(); + const r = Fn2.create(q.x); + if (r === _0n15) + return; + const s3 = Fn2.create(ik * Fn2.create(m + r * d)); + if (s3 === _0n15) + return; + let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n15); + let normS = s3; + if (lowS && isBiggerThanHalfOrder(s3)) { + normS = Fn2.neg(s3); + recovery ^= 1; } + return new Signature(r, normS, hasLargeCofactor ? void 0 : recovery); } - var FastTimer = class { - [kFastTimer] = true; - /** - * The state of the timer, which can be one of the following: - * - NOT_IN_LIST (-2) - * - TO_BE_CLEARED (-1) - * - PENDING (0) - * - ACTIVE (1) - * - * @type {-2|-1|0|1} - * @private - */ - _state = NOT_IN_LIST; - /** - * The number of milliseconds to wait before calling the callback. - * - * @type {number} - * @private - */ - _idleTimeout = -1; - /** - * The time in milliseconds when the timer was started. This value is used to - * calculate when the timer should expire. - * - * @type {number} - * @default -1 - * @private - */ - _idleStart = -1; - /** - * The function to be executed when the timer expires. - * @type {Function} - * @private - */ - _onTimeout; - /** - * The argument to be passed to the callback when the timer expires. - * - * @type {*} - * @private - */ - _timerArg; - /** - * @constructor - * @param {Function} callback A function to be executed after the timer - * expires. - * @param {number} delay The time, in milliseconds that the timer should wait - * before the specified function or code is executed. - * @param {*} arg - */ - constructor(callback, delay, arg) { - this._onTimeout = callback; - this._idleTimeout = delay; - this._timerArg = arg; - this.refresh(); - } - /** - * Sets the timer's start time to the current time, and reschedules the timer - * to call its callback at the previously specified duration adjusted to the - * current time. - * Using this on a timer that has already called its callback will reactivate - * the timer. - * - * @returns {void} - */ - refresh() { - if (this._state === NOT_IN_LIST) { - fastTimers.push(this); - } - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - this._state = PENDING; - } - /** - * The `clear` method cancels the timer, preventing it from executing. - * - * @returns {void} - * @private - */ - clear() { - this._state = TO_BE_CLEARED; - this._idleStart = -1; + return { seed, k2sig }; + } + function sign2(message, secretKey, opts = {}) { + const { seed, k2sig } = prepSig(message, secretKey, opts); + const drbg = createHmacDrbg3(hash3.outputLen, Fn2.BYTES, hmac4); + const sig = drbg(seed, k2sig); + return sig.toBytes(opts.format); + } + function verify(signature2, message, publicKey, opts = {}) { + const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts); + publicKey = abytes4(publicKey, void 0, "publicKey"); + message = validateMsgAndHash(message, prehash); + if (!isBytes5(signature2)) { + const end = signature2 instanceof Signature ? ", use sig.toBytes()" : ""; + throw new Error("verify expects Uint8Array signature" + end); + } + validateSigLength(signature2, format); + try { + const sig = Signature.fromBytes(signature2, format); + const P2 = Point3.fromBytes(publicKey); + if (lowS && sig.hasHighS()) + return false; + const { r, s: s3 } = sig; + const h = bits2int_modN(message); + const is = Fn2.inv(s3); + const u1 = Fn2.create(h * is); + const u2 = Fn2.create(r * is); + const R = Point3.BASE.multiplyUnsafe(u1).add(P2.multiplyUnsafe(u2)); + if (R.is0()) + return false; + const v = Fn2.create(R.x); + return v === r; + } catch (e7) { + return false; + } + } + function recoverPublicKey3(signature2, message, opts = {}) { + const { prehash } = validateSigOpts(opts, defaultSigOpts); + message = validateMsgAndHash(message, prehash); + return Signature.fromBytes(signature2, "recovered").recoverPublicKey(message).toBytes(); + } + return Object.freeze({ + keygen, + getPublicKey, + getSharedSecret, + utils: utils2, + lengths, + Point: Point3, + sign: sign2, + verify, + recoverPublicKey: recoverPublicKey3, + Signature, + hash: hash3 + }); +} +var divNearest3, DERErr3, DER3, _0n15, _1n15, _2n9, _3n6, _4n6; +var init_weierstrass3 = __esm({ + "node_modules/@noble/curves/abstract/weierstrass.js"() { + "use strict"; + init_hmac2(); + init_utils8(); + init_utils9(); + init_curve3(); + init_modular3(); + divNearest3 = (num2, den) => (num2 + (num2 >= 0 ? den : -den) / _2n9) / den; + DERErr3 = class extends Error { + constructor(m = "") { + super(m); } }; - module.exports = { - /** - * The setTimeout() method sets a timer which executes a function once the - * timer expires. - * @param {Function} callback A function to be executed after the timer - * expires. - * @param {number} delay The time, in milliseconds that the timer should - * wait before the specified function or code is executed. - * @param {*} [arg] An optional argument to be passed to the callback function - * when the timer expires. - * @returns {NodeJS.Timeout|FastTimer} - */ - setTimeout(callback, delay, arg) { - return delay <= RESOLUTION_MS ? setTimeout(callback, delay, arg) : new FastTimer(callback, delay, arg); - }, - /** - * The clearTimeout method cancels an instantiated Timer previously created - * by calling setTimeout. - * - * @param {NodeJS.Timeout|FastTimer} timeout - */ - clearTimeout(timeout) { - if (timeout[kFastTimer]) { - timeout.clear(); - } else { - clearTimeout(timeout); + DER3 = { + // asn.1 DER encoding utils + Err: DERErr3, + // Basic building block is TLV (Tag-Length-Value) + _tlv: { + encode: (tag, data) => { + const { Err: E } = DER3; + if (tag < 0 || tag > 256) + throw new E("tlv.encode: wrong tag"); + if (data.length & 1) + throw new E("tlv.encode: unpadded data"); + const dataLen = data.length / 2; + const len = numberToHexUnpadded3(dataLen); + if (len.length / 2 & 128) + throw new E("tlv.encode: long form length too big"); + const lenLen = dataLen > 127 ? numberToHexUnpadded3(len.length / 2 | 128) : ""; + const t = numberToHexUnpadded3(tag); + return t + lenLen + len + data; + }, + // v - value, l - left bytes (unparsed) + decode(tag, data) { + const { Err: E } = DER3; + let pos = 0; + if (tag < 0 || tag > 256) + throw new E("tlv.encode: wrong tag"); + if (data.length < 2 || data[pos++] !== tag) + throw new E("tlv.decode: wrong tlv"); + const first = data[pos++]; + const isLong = !!(first & 128); + let length = 0; + if (!isLong) + length = first; + else { + const lenLen = first & 127; + if (!lenLen) + throw new E("tlv.decode(long): indefinite length not supported"); + if (lenLen > 4) + throw new E("tlv.decode(long): byte length is too big"); + const lengthBytes = data.subarray(pos, pos + lenLen); + if (lengthBytes.length !== lenLen) + throw new E("tlv.decode: length bytes not complete"); + if (lengthBytes[0] === 0) + throw new E("tlv.decode(long): zero leftmost byte"); + for (const b of lengthBytes) + length = length << 8 | b; + pos += lenLen; + if (length < 128) + throw new E("tlv.decode(long): not minimal encoding"); + } + const v = data.subarray(pos, pos + length); + if (v.length !== length) + throw new E("tlv.decode: wrong value length"); + return { v, l: data.subarray(pos + length) }; } }, - /** - * The setFastTimeout() method sets a fastTimer which executes a function once - * the timer expires. - * @param {Function} callback A function to be executed after the timer - * expires. - * @param {number} delay The time, in milliseconds that the timer should - * wait before the specified function or code is executed. - * @param {*} [arg] An optional argument to be passed to the callback function - * when the timer expires. - * @returns {FastTimer} - */ - setFastTimeout(callback, delay, arg) { - return new FastTimer(callback, delay, arg); - }, - /** - * The clearTimeout method cancels an instantiated FastTimer previously - * created by calling setFastTimeout. - * - * @param {FastTimer} timeout - */ - clearFastTimeout(timeout) { - timeout.clear(); - }, - /** - * The now method returns the value of the internal fast timer clock. - * - * @returns {number} - */ - now() { - return fastNow; - }, - /** - * Trigger the onTick function to process the fastTimers array. - * Exported for testing purposes only. - * Marking as deprecated to discourage any use outside of testing. - * @deprecated - * @param {number} [delay=0] The delay in milliseconds to add to the now value. - */ - tick(delay = 0) { - fastNow += delay - RESOLUTION_MS + 1; - onTick(); - onTick(); + // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag, + // since we always use positive integers here. It must always be empty: + // - add zero byte if exists + // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding) + _int: { + encode(num2) { + const { Err: E } = DER3; + if (num2 < _0n15) + throw new E("integer: negative integers are not allowed"); + let hex = numberToHexUnpadded3(num2); + if (Number.parseInt(hex[0], 16) & 8) + hex = "00" + hex; + if (hex.length & 1) + throw new E("unexpected DER parsing assertion: unpadded hex"); + return hex; + }, + decode(data) { + const { Err: E } = DER3; + if (data[0] & 128) + throw new E("invalid signature integer: negative"); + if (data[0] === 0 && !(data[1] & 128)) + throw new E("invalid signature integer: unnecessary leading zero"); + return bytesToNumberBE3(data); + } }, - /** - * Reset FastTimers. - * Exported for testing purposes only. - * Marking as deprecated to discourage any use outside of testing. - * @deprecated - */ - reset() { - fastNow = 0; - fastTimers.length = 0; - clearTimeout(fastNowTimeout); - fastNowTimeout = null; + toSig(bytes) { + const { Err: E, _int: int, _tlv: tlv } = DER3; + const data = abytes4(bytes, void 0, "signature"); + const { v: seqBytes, l: seqLeftBytes } = tlv.decode(48, data); + if (seqLeftBytes.length) + throw new E("invalid signature: left bytes after parsing"); + const { v: rBytes, l: rLeftBytes } = tlv.decode(2, seqBytes); + const { v: sBytes, l: sLeftBytes } = tlv.decode(2, rLeftBytes); + if (sLeftBytes.length) + throw new E("invalid signature: left bytes after parsing"); + return { r: int.decode(rBytes), s: int.decode(sBytes) }; }, - /** - * Exporting for testing purposes only. - * Marking as deprecated to discourage any use outside of testing. - * @deprecated - */ - kFastTimer + hexFromSig(sig) { + const { _tlv: tlv, _int: int } = DER3; + const rs = tlv.encode(2, int.encode(sig.r)); + const ss = tlv.encode(2, int.encode(sig.s)); + const seq = rs + ss; + return tlv.encode(48, seq); + } }; + _0n15 = BigInt(0); + _1n15 = BigInt(1); + _2n9 = BigInt(2); + _3n6 = BigInt(3); + _4n6 = BigInt(4); } }); -// node_modules/undici/lib/core/errors.js -var require_errors = __commonJS({ - "node_modules/undici/lib/core/errors.js"(exports, module) { +// node_modules/@noble/curves/secp256k1.js +function sqrtMod3(y) { + const P2 = secp256k1_CURVE.p; + const _3n7 = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22); + const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88); + const b2 = y * y * y % P2; + const b3 = b2 * b2 * y % P2; + const b6 = pow23(b3, _3n7, P2) * b3 % P2; + const b9 = pow23(b6, _3n7, P2) * b3 % P2; + const b11 = pow23(b9, _2n10, P2) * b2 % P2; + const b22 = pow23(b11, _11n, P2) * b11 % P2; + const b44 = pow23(b22, _22n, P2) * b22 % P2; + const b88 = pow23(b44, _44n, P2) * b44 % P2; + const b176 = pow23(b88, _88n, P2) * b88 % P2; + const b220 = pow23(b176, _44n, P2) * b44 % P2; + const b223 = pow23(b220, _3n7, P2) * b3 % P2; + const t1 = pow23(b223, _23n, P2) * b22 % P2; + const t2 = pow23(t1, _6n, P2) * b2 % P2; + const root = pow23(t2, _2n10, P2); + if (!Fpk13.eql(Fpk13.sqr(root), y)) + throw new Error("Cannot find square root"); + return root; +} +var secp256k1_CURVE, secp256k1_ENDO, _2n10, Fpk13, Pointk1, secp256k13; +var init_secp256k13 = __esm({ + "node_modules/@noble/curves/secp256k1.js"() { "use strict"; - var kUndiciError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR"); - var UndiciError = class extends Error { - constructor(message, options) { - super(message, options); - this.name = "UndiciError"; - this.code = "UND_ERR"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kUndiciError] === true; - } - get [kUndiciError]() { - return true; - } - }; - var kConnectTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"); - var ConnectTimeoutError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "ConnectTimeoutError"; - this.message = message || "Connect Timeout Error"; - this.code = "UND_ERR_CONNECT_TIMEOUT"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kConnectTimeoutError] === true; - } - get [kConnectTimeoutError]() { - return true; - } - }; - var kHeadersTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"); - var HeadersTimeoutError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "HeadersTimeoutError"; - this.message = message || "Headers Timeout Error"; - this.code = "UND_ERR_HEADERS_TIMEOUT"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kHeadersTimeoutError] === true; - } - get [kHeadersTimeoutError]() { - return true; - } - }; - var kHeadersOverflowError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"); - var HeadersOverflowError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "HeadersOverflowError"; - this.message = message || "Headers Overflow Error"; - this.code = "UND_ERR_HEADERS_OVERFLOW"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kHeadersOverflowError] === true; - } - get [kHeadersOverflowError]() { - return true; - } - }; - var kBodyTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"); - var BodyTimeoutError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "BodyTimeoutError"; - this.message = message || "Body Timeout Error"; - this.code = "UND_ERR_BODY_TIMEOUT"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kBodyTimeoutError] === true; - } - get [kBodyTimeoutError]() { - return true; - } - }; - var kInvalidArgumentError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_ARG"); - var InvalidArgumentError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "InvalidArgumentError"; - this.message = message || "Invalid Argument Error"; - this.code = "UND_ERR_INVALID_ARG"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kInvalidArgumentError] === true; - } - get [kInvalidArgumentError]() { - return true; - } - }; - var kInvalidReturnValueError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_RETURN_VALUE"); - var InvalidReturnValueError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "InvalidReturnValueError"; - this.message = message || "Invalid Return Value Error"; - this.code = "UND_ERR_INVALID_RETURN_VALUE"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kInvalidReturnValueError] === true; - } - get [kInvalidReturnValueError]() { - return true; - } - }; - var kAbortError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORT"); - var AbortError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "AbortError"; - this.message = message || "The operation was aborted"; - this.code = "UND_ERR_ABORT"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kAbortError] === true; - } - get [kAbortError]() { - return true; - } + init_sha22(); + init_modular3(); + init_weierstrass3(); + secp256k1_CURVE = { + p: BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"), + n: BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"), + h: BigInt(1), + a: BigInt(0), + b: BigInt(7), + Gx: BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"), + Gy: BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") }; - var kRequestAbortedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORTED"); - var RequestAbortedError = class extends AbortError { - constructor(message) { - super(message); - this.name = "AbortError"; - this.message = message || "Request aborted"; - this.code = "UND_ERR_ABORTED"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kRequestAbortedError] === true; - } - get [kRequestAbortedError]() { - return true; - } + secp256k1_ENDO = { + beta: BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"), + basises: [ + [BigInt("0x3086d221a7d46bcde86c90e49284eb15"), -BigInt("0xe4437ed6010e88286f547fa90abfe4c3")], + [BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"), BigInt("0x3086d221a7d46bcde86c90e49284eb15")] + ] }; - var kInformationalError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INFO"); - var InformationalError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "InformationalError"; - this.message = message || "Request information"; - this.code = "UND_ERR_INFO"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kInformationalError] === true; - } - get [kInformationalError]() { - return true; + _2n10 = /* @__PURE__ */ BigInt(2); + Fpk13 = Field3(secp256k1_CURVE.p, { sqrt: sqrtMod3 }); + Pointk1 = /* @__PURE__ */ weierstrass3(secp256k1_CURVE, { + Fp: Fpk13, + endo: secp256k1_ENDO + }); + secp256k13 = /* @__PURE__ */ ecdsa(Pointk1, sha2564); + } +}); + +// node_modules/@scure/bip32/node_modules/@noble/hashes/utils.js +function isBytes6(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; +} +function anumber4(n, title = "") { + if (!Number.isSafeInteger(n) || n < 0) { + const prefix = title && `"${title}" `; + throw new Error(`${prefix}expected integer >= 0, got ${n}`); + } +} +function abytes5(value, length, title = "") { + const bytes = isBytes6(value); + const len = value?.length; + const needsLen = length !== void 0; + if (!bytes || needsLen && len !== length) { + const prefix = title && `"${title}" `; + const ofLen = needsLen ? ` of length ${length}` : ""; + const got = bytes ? `length=${len}` : `type=${typeof value}`; + throw new Error(prefix + "expected Uint8Array" + ofLen + ", got " + got); + } + return value; +} +function ahash3(h) { + if (typeof h !== "function" || typeof h.create !== "function") + throw new Error("Hash must wrapped by utils.createHasher"); + anumber4(h.outputLen); + anumber4(h.blockLen); +} +function aexists3(instance, checkFinished = true) { + if (instance.destroyed) + throw new Error("Hash instance has been destroyed"); + if (checkFinished && instance.finished) + throw new Error("Hash#digest() has already been called"); +} +function aoutput3(out, instance) { + abytes5(out, void 0, "digestInto() output"); + const min = instance.outputLen; + if (out.length < min) { + throw new Error('"digestInto() output" expected to be of length >=' + min); + } +} +function clean3(...arrays) { + for (let i = 0; i < arrays.length; i++) { + arrays[i].fill(0); + } +} +function createView3(arr) { + return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); +} +function rotr3(word, shift) { + return word << 32 - shift | word >>> shift; +} +function rotl(word, shift) { + return word << shift | word >>> 32 - shift >>> 0; +} +function concatBytes6(...arrays) { + let sum = 0; + for (let i = 0; i < arrays.length; i++) { + const a = arrays[i]; + abytes5(a); + sum += a.length; + } + const res = new Uint8Array(sum); + for (let i = 0, pad4 = 0; i < arrays.length; i++) { + const a = arrays[i]; + res.set(a, pad4); + pad4 += a.length; + } + return res; +} +function createHasher4(hashCons, info = {}) { + const hashC = (msg, opts) => hashCons(opts).update(msg).digest(); + const tmp = hashCons(void 0); + hashC.outputLen = tmp.outputLen; + hashC.blockLen = tmp.blockLen; + hashC.create = (opts) => hashCons(opts); + Object.assign(hashC, info); + return Object.freeze(hashC); +} +var oidNist2; +var init_utils10 = __esm({ + "node_modules/@scure/bip32/node_modules/@noble/hashes/utils.js"() { + "use strict"; + oidNist2 = (suffix) => ({ + oid: Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2, suffix]) + }); + } +}); + +// node_modules/@scure/bip32/node_modules/@noble/hashes/hmac.js +var _HMAC2, hmac3; +var init_hmac3 = __esm({ + "node_modules/@scure/bip32/node_modules/@noble/hashes/hmac.js"() { + "use strict"; + init_utils10(); + _HMAC2 = class { + oHash; + iHash; + blockLen; + outputLen; + finished = false; + destroyed = false; + constructor(hash3, key) { + ahash3(hash3); + abytes5(key, void 0, "key"); + this.iHash = hash3.create(); + if (typeof this.iHash.update !== "function") + throw new Error("Expected instance of class which extends utils.Hash"); + this.blockLen = this.iHash.blockLen; + this.outputLen = this.iHash.outputLen; + const blockLen = this.blockLen; + const pad4 = new Uint8Array(blockLen); + pad4.set(key.length > blockLen ? hash3.create().update(key).digest() : key); + for (let i = 0; i < pad4.length; i++) + pad4[i] ^= 54; + this.iHash.update(pad4); + this.oHash = hash3.create(); + for (let i = 0; i < pad4.length; i++) + pad4[i] ^= 54 ^ 92; + this.oHash.update(pad4); + clean3(pad4); } - }; - var kRequestContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"); - var RequestContentLengthMismatchError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "RequestContentLengthMismatchError"; - this.message = message || "Request body length does not match content-length header"; - this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; + update(buf) { + aexists3(this); + this.iHash.update(buf); + return this; } - static [Symbol.hasInstance](instance) { - return instance && instance[kRequestContentLengthMismatchError] === true; + digestInto(out) { + aexists3(this); + abytes5(out, this.outputLen, "output"); + this.finished = true; + this.iHash.digestInto(out); + this.oHash.update(out); + this.oHash.digestInto(out); + this.destroy(); } - get [kRequestContentLengthMismatchError]() { - return true; + digest() { + const out = new Uint8Array(this.oHash.outputLen); + this.digestInto(out); + return out; } - }; - var kResponseContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH"); - var ResponseContentLengthMismatchError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "ResponseContentLengthMismatchError"; - this.message = message || "Response body length does not match content-length header"; - this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; + _cloneInto(to) { + to ||= Object.create(Object.getPrototypeOf(this), {}); + const { oHash, iHash, finished: finished2, destroyed, blockLen, outputLen } = this; + to = to; + to.finished = finished2; + to.destroyed = destroyed; + to.blockLen = blockLen; + to.outputLen = outputLen; + to.oHash = oHash._cloneInto(to.oHash); + to.iHash = iHash._cloneInto(to.iHash); + return to; } - static [Symbol.hasInstance](instance) { - return instance && instance[kResponseContentLengthMismatchError] === true; + clone() { + return this._cloneInto(); } - get [kResponseContentLengthMismatchError]() { - return true; + destroy() { + this.destroyed = true; + this.oHash.destroy(); + this.iHash.destroy(); } }; - var kClientDestroyedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_DESTROYED"); - var ClientDestroyedError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "ClientDestroyedError"; - this.message = message || "The client is destroyed"; - this.code = "UND_ERR_DESTROYED"; + hmac3 = (hash3, key, message) => new _HMAC2(hash3, key).update(message).digest(); + hmac3.create = (hash3, key) => new _HMAC2(hash3, key); + } +}); + +// node_modules/@scure/bip32/node_modules/@noble/hashes/_md.js +function Chi3(a, b, c2) { + return a & b ^ ~a & c2; +} +function Maj3(a, b, c2) { + return a & b ^ a & c2 ^ b & c2; +} +var HashMD3, SHA256_IV3, SHA512_IV3; +var init_md3 = __esm({ + "node_modules/@scure/bip32/node_modules/@noble/hashes/_md.js"() { + "use strict"; + init_utils10(); + HashMD3 = class { + blockLen; + outputLen; + padOffset; + isLE; + // For partial updates less than block size + buffer; + view; + finished = false; + length = 0; + pos = 0; + destroyed = false; + constructor(blockLen, outputLen, padOffset, isLE2) { + this.blockLen = blockLen; + this.outputLen = outputLen; + this.padOffset = padOffset; + this.isLE = isLE2; + this.buffer = new Uint8Array(blockLen); + this.view = createView3(this.buffer); } - static [Symbol.hasInstance](instance) { - return instance && instance[kClientDestroyedError] === true; + update(data) { + aexists3(this); + abytes5(data); + const { view, buffer: buffer2, blockLen } = this; + const len = data.length; + for (let pos = 0; pos < len; ) { + const take = Math.min(blockLen - this.pos, len - pos); + if (take === blockLen) { + const dataView = createView3(data); + for (; blockLen <= len - pos; pos += blockLen) + this.process(dataView, pos); + continue; + } + buffer2.set(data.subarray(pos, pos + take), this.pos); + this.pos += take; + pos += take; + if (this.pos === blockLen) { + this.process(view, 0); + this.pos = 0; + } + } + this.length += data.length; + this.roundClean(); + return this; } - get [kClientDestroyedError]() { - return true; + digestInto(out) { + aexists3(this); + aoutput3(out, this); + this.finished = true; + const { buffer: buffer2, view, blockLen, isLE: isLE2 } = this; + let { pos } = this; + buffer2[pos++] = 128; + clean3(this.buffer.subarray(pos)); + if (this.padOffset > blockLen - pos) { + this.process(view, 0); + pos = 0; + } + for (let i = pos; i < blockLen; i++) + buffer2[i] = 0; + view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE2); + this.process(view, 0); + const oview = createView3(out); + const len = this.outputLen; + if (len % 4) + throw new Error("_sha2: outputLen must be aligned to 32bit"); + const outLen = len / 4; + const state = this.get(); + if (outLen > state.length) + throw new Error("_sha2: outputLen bigger than state"); + for (let i = 0; i < outLen; i++) + oview.setUint32(4 * i, state[i], isLE2); } - }; - var kClientClosedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CLOSED"); - var ClientClosedError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "ClientClosedError"; - this.message = message || "The client is closed"; - this.code = "UND_ERR_CLOSED"; + digest() { + const { buffer: buffer2, outputLen } = this; + this.digestInto(buffer2); + const res = buffer2.slice(0, outputLen); + this.destroy(); + return res; } - static [Symbol.hasInstance](instance) { - return instance && instance[kClientClosedError] === true; + _cloneInto(to) { + to ||= new this.constructor(); + to.set(...this.get()); + const { blockLen, buffer: buffer2, length, finished: finished2, destroyed, pos } = this; + to.destroyed = destroyed; + to.finished = finished2; + to.length = length; + to.pos = pos; + if (length % blockLen) + to.buffer.set(buffer2); + return to; } - get [kClientClosedError]() { - return true; + clone() { + return this._cloneInto(); } }; - var kSocketError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_SOCKET"); - var SocketError = class extends UndiciError { - constructor(message, socket) { - super(message); - this.name = "SocketError"; - this.message = message || "Socket error"; - this.code = "UND_ERR_SOCKET"; - this.socket = socket; + SHA256_IV3 = /* @__PURE__ */ Uint32Array.from([ + 1779033703, + 3144134277, + 1013904242, + 2773480762, + 1359893119, + 2600822924, + 528734635, + 1541459225 + ]); + SHA512_IV3 = /* @__PURE__ */ Uint32Array.from([ + 1779033703, + 4089235720, + 3144134277, + 2227873595, + 1013904242, + 4271175723, + 2773480762, + 1595750129, + 1359893119, + 2917565137, + 2600822924, + 725511199, + 528734635, + 4215389547, + 1541459225, + 327033209 + ]); + } +}); + +// node_modules/@scure/bip32/node_modules/@noble/hashes/legacy.js +function ripemd_f(group, x, y, z) { + if (group === 0) + return x ^ y ^ z; + if (group === 1) + return x & y | ~x & z; + if (group === 2) + return (x | ~y) ^ z; + if (group === 3) + return x & z | y & ~z; + return x ^ (y | ~z); +} +var Rho160, Id160, Pi160, idxLR, idxL, idxR, shifts160, shiftsL160, shiftsR160, Kl160, Kr160, BUF_160, _RIPEMD160, ripemd160; +var init_legacy = __esm({ + "node_modules/@scure/bip32/node_modules/@noble/hashes/legacy.js"() { + "use strict"; + init_md3(); + init_utils10(); + Rho160 = /* @__PURE__ */ Uint8Array.from([ + 7, + 4, + 13, + 1, + 10, + 6, + 15, + 3, + 12, + 0, + 9, + 5, + 2, + 14, + 11, + 8 + ]); + Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))(); + Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))(); + idxLR = /* @__PURE__ */ (() => { + const L = [Id160]; + const R = [Pi160]; + const res = [L, R]; + for (let i = 0; i < 4; i++) + for (let j of res) + j.push(j[i].map((k) => Rho160[k])); + return res; + })(); + idxL = /* @__PURE__ */ (() => idxLR[0])(); + idxR = /* @__PURE__ */ (() => idxLR[1])(); + shifts160 = /* @__PURE__ */ [ + [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], + [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7], + [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9], + [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6], + [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5] + ].map((i) => Uint8Array.from(i)); + shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j])); + shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j])); + Kl160 = /* @__PURE__ */ Uint32Array.from([ + 0, + 1518500249, + 1859775393, + 2400959708, + 2840853838 + ]); + Kr160 = /* @__PURE__ */ Uint32Array.from([ + 1352829926, + 1548603684, + 1836072691, + 2053994217, + 0 + ]); + BUF_160 = /* @__PURE__ */ new Uint32Array(16); + _RIPEMD160 = class extends HashMD3 { + h0 = 1732584193 | 0; + h1 = 4023233417 | 0; + h2 = 2562383102 | 0; + h3 = 271733878 | 0; + h4 = 3285377520 | 0; + constructor() { + super(64, 20, 8, true); } - static [Symbol.hasInstance](instance) { - return instance && instance[kSocketError] === true; + get() { + const { h0, h1, h2, h3, h4 } = this; + return [h0, h1, h2, h3, h4]; } - get [kSocketError]() { - return true; + set(h0, h1, h2, h3, h4) { + this.h0 = h0 | 0; + this.h1 = h1 | 0; + this.h2 = h2 | 0; + this.h3 = h3 | 0; + this.h4 = h4 | 0; } - }; - var kNotSupportedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_NOT_SUPPORTED"); - var NotSupportedError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "NotSupportedError"; - this.message = message || "Not supported error"; - this.code = "UND_ERR_NOT_SUPPORTED"; + process(view, offset) { + for (let i = 0; i < 16; i++, offset += 4) + BUF_160[i] = view.getUint32(offset, true); + let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el; + for (let group = 0; group < 5; group++) { + const rGroup = 4 - group; + const hbl = Kl160[group], hbr = Kr160[group]; + const rl = idxL[group], rr = idxR[group]; + const sl = shiftsL160[group], sr = shiftsR160[group]; + for (let i = 0; i < 16; i++) { + const tl = rotl(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el | 0; + al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; + } + for (let i = 0; i < 16; i++) { + const tr = rotl(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er | 0; + ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; + } + } + this.set(this.h1 + cl + dr | 0, this.h2 + dl + er | 0, this.h3 + el + ar | 0, this.h4 + al + br | 0, this.h0 + bl + cr | 0); } - static [Symbol.hasInstance](instance) { - return instance && instance[kNotSupportedError] === true; + roundClean() { + clean3(BUF_160); } - get [kNotSupportedError]() { - return true; + destroy() { + this.destroyed = true; + clean3(this.buffer); + this.set(0, 0, 0, 0, 0); } }; - var kBalancedPoolMissingUpstreamError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BPL_MISSING_UPSTREAM"); - var BalancedPoolMissingUpstreamError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "MissingUpstreamError"; - this.message = message || "No upstream has been added to the BalancedPool"; - this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; + ripemd160 = /* @__PURE__ */ createHasher4(() => new _RIPEMD160()); + } +}); + +// node_modules/@scure/bip32/node_modules/@noble/hashes/_u64.js +function fromBig2(n, le = false) { + if (le) + return { h: Number(n & U32_MASK642), l: Number(n >> _32n2 & U32_MASK642) }; + return { h: Number(n >> _32n2 & U32_MASK642) | 0, l: Number(n & U32_MASK642) | 0 }; +} +function split2(lst, le = false) { + const len = lst.length; + let Ah = new Uint32Array(len); + let Al = new Uint32Array(len); + for (let i = 0; i < len; i++) { + const { h, l: l2 } = fromBig2(lst[i], le); + [Ah[i], Al[i]] = [h, l2]; + } + return [Ah, Al]; +} +function add2(Ah, Al, Bh, Bl) { + const l2 = (Al >>> 0) + (Bl >>> 0); + return { h: Ah + Bh + (l2 / 2 ** 32 | 0) | 0, l: l2 | 0 }; +} +var U32_MASK642, _32n2, shrSH2, shrSL2, rotrSH2, rotrSL2, rotrBH2, rotrBL2, add3L2, add3H2, add4L2, add4H2, add5L2, add5H2; +var init_u642 = __esm({ + "node_modules/@scure/bip32/node_modules/@noble/hashes/_u64.js"() { + "use strict"; + U32_MASK642 = /* @__PURE__ */ BigInt(2 ** 32 - 1); + _32n2 = /* @__PURE__ */ BigInt(32); + shrSH2 = (h, _l, s3) => h >>> s3; + shrSL2 = (h, l2, s3) => h << 32 - s3 | l2 >>> s3; + rotrSH2 = (h, l2, s3) => h >>> s3 | l2 << 32 - s3; + rotrSL2 = (h, l2, s3) => h << 32 - s3 | l2 >>> s3; + rotrBH2 = (h, l2, s3) => h << 64 - s3 | l2 >>> s3 - 32; + rotrBL2 = (h, l2, s3) => h >>> s3 - 32 | l2 << 64 - s3; + add3L2 = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0); + add3H2 = (low, Ah, Bh, Ch) => Ah + Bh + Ch + (low / 2 ** 32 | 0) | 0; + add4L2 = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0); + add4H2 = (low, Ah, Bh, Ch, Dh) => Ah + Bh + Ch + Dh + (low / 2 ** 32 | 0) | 0; + add5L2 = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0); + add5H2 = (low, Ah, Bh, Ch, Dh, Eh) => Ah + Bh + Ch + Dh + Eh + (low / 2 ** 32 | 0) | 0; + } +}); + +// node_modules/@scure/bip32/node_modules/@noble/hashes/sha2.js +var SHA256_K3, SHA256_W3, SHA2_32B2, _SHA2562, K5122, SHA512_Kh2, SHA512_Kl2, SHA512_W_H2, SHA512_W_L2, SHA2_64B, _SHA512, sha2565, sha5122; +var init_sha23 = __esm({ + "node_modules/@scure/bip32/node_modules/@noble/hashes/sha2.js"() { + "use strict"; + init_md3(); + init_u642(); + init_utils10(); + SHA256_K3 = /* @__PURE__ */ Uint32Array.from([ + 1116352408, + 1899447441, + 3049323471, + 3921009573, + 961987163, + 1508970993, + 2453635748, + 2870763221, + 3624381080, + 310598401, + 607225278, + 1426881987, + 1925078388, + 2162078206, + 2614888103, + 3248222580, + 3835390401, + 4022224774, + 264347078, + 604807628, + 770255983, + 1249150122, + 1555081692, + 1996064986, + 2554220882, + 2821834349, + 2952996808, + 3210313671, + 3336571891, + 3584528711, + 113926993, + 338241895, + 666307205, + 773529912, + 1294757372, + 1396182291, + 1695183700, + 1986661051, + 2177026350, + 2456956037, + 2730485921, + 2820302411, + 3259730800, + 3345764771, + 3516065817, + 3600352804, + 4094571909, + 275423344, + 430227734, + 506948616, + 659060556, + 883997877, + 958139571, + 1322822218, + 1537002063, + 1747873779, + 1955562222, + 2024104815, + 2227730452, + 2361852424, + 2428436474, + 2756734187, + 3204031479, + 3329325298 + ]); + SHA256_W3 = /* @__PURE__ */ new Uint32Array(64); + SHA2_32B2 = class extends HashMD3 { + constructor(outputLen) { + super(64, outputLen, 8, false); } - static [Symbol.hasInstance](instance) { - return instance && instance[kBalancedPoolMissingUpstreamError] === true; + get() { + const { A, B, C, D: D2, E, F, G, H } = this; + return [A, B, C, D2, E, F, G, H]; } - get [kBalancedPoolMissingUpstreamError]() { - return true; + // prettier-ignore + set(A, B, C, D2, E, F, G, H) { + this.A = A | 0; + this.B = B | 0; + this.C = C | 0; + this.D = D2 | 0; + this.E = E | 0; + this.F = F | 0; + this.G = G | 0; + this.H = H | 0; } - }; - var kHTTPParserError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HTTP_PARSER"); - var HTTPParserError = class extends Error { - constructor(message, code, data) { - super(message); - this.name = "HTTPParserError"; - this.code = code ? `HPE_${code}` : void 0; - this.data = data ? data.toString() : void 0; + process(view, offset) { + for (let i = 0; i < 16; i++, offset += 4) + SHA256_W3[i] = view.getUint32(offset, false); + for (let i = 16; i < 64; i++) { + const W15 = SHA256_W3[i - 15]; + const W2 = SHA256_W3[i - 2]; + const s0 = rotr3(W15, 7) ^ rotr3(W15, 18) ^ W15 >>> 3; + const s1 = rotr3(W2, 17) ^ rotr3(W2, 19) ^ W2 >>> 10; + SHA256_W3[i] = s1 + SHA256_W3[i - 7] + s0 + SHA256_W3[i - 16] | 0; + } + let { A, B, C, D: D2, E, F, G, H } = this; + for (let i = 0; i < 64; i++) { + const sigma1 = rotr3(E, 6) ^ rotr3(E, 11) ^ rotr3(E, 25); + const T1 = H + sigma1 + Chi3(E, F, G) + SHA256_K3[i] + SHA256_W3[i] | 0; + const sigma0 = rotr3(A, 2) ^ rotr3(A, 13) ^ rotr3(A, 22); + const T2 = sigma0 + Maj3(A, B, C) | 0; + H = G; + G = F; + F = E; + E = D2 + T1 | 0; + D2 = C; + C = B; + B = A; + A = T1 + T2 | 0; + } + A = A + this.A | 0; + B = B + this.B | 0; + C = C + this.C | 0; + D2 = D2 + this.D | 0; + E = E + this.E | 0; + F = F + this.F | 0; + G = G + this.G | 0; + H = H + this.H | 0; + this.set(A, B, C, D2, E, F, G, H); } - static [Symbol.hasInstance](instance) { - return instance && instance[kHTTPParserError] === true; + roundClean() { + clean3(SHA256_W3); } - get [kHTTPParserError]() { - return true; + destroy() { + this.set(0, 0, 0, 0, 0, 0, 0, 0); + clean3(this.buffer); } }; - var kResponseExceededMaxSizeError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE"); - var ResponseExceededMaxSizeError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "ResponseExceededMaxSizeError"; - this.message = message || "Response content exceeded max size"; - this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; + _SHA2562 = class extends SHA2_32B2 { + // We cannot use array here since array allows indexing by variable + // which means optimizer/compiler cannot use registers. + A = SHA256_IV3[0] | 0; + B = SHA256_IV3[1] | 0; + C = SHA256_IV3[2] | 0; + D = SHA256_IV3[3] | 0; + E = SHA256_IV3[4] | 0; + F = SHA256_IV3[5] | 0; + G = SHA256_IV3[6] | 0; + H = SHA256_IV3[7] | 0; + constructor() { + super(32); } - static [Symbol.hasInstance](instance) { - return instance && instance[kResponseExceededMaxSizeError] === true; + }; + K5122 = /* @__PURE__ */ (() => split2([ + "0x428a2f98d728ae22", + "0x7137449123ef65cd", + "0xb5c0fbcfec4d3b2f", + "0xe9b5dba58189dbbc", + "0x3956c25bf348b538", + "0x59f111f1b605d019", + "0x923f82a4af194f9b", + "0xab1c5ed5da6d8118", + "0xd807aa98a3030242", + "0x12835b0145706fbe", + "0x243185be4ee4b28c", + "0x550c7dc3d5ffb4e2", + "0x72be5d74f27b896f", + "0x80deb1fe3b1696b1", + "0x9bdc06a725c71235", + "0xc19bf174cf692694", + "0xe49b69c19ef14ad2", + "0xefbe4786384f25e3", + "0x0fc19dc68b8cd5b5", + "0x240ca1cc77ac9c65", + "0x2de92c6f592b0275", + "0x4a7484aa6ea6e483", + "0x5cb0a9dcbd41fbd4", + "0x76f988da831153b5", + "0x983e5152ee66dfab", + "0xa831c66d2db43210", + "0xb00327c898fb213f", + "0xbf597fc7beef0ee4", + "0xc6e00bf33da88fc2", + "0xd5a79147930aa725", + "0x06ca6351e003826f", + "0x142929670a0e6e70", + "0x27b70a8546d22ffc", + "0x2e1b21385c26c926", + "0x4d2c6dfc5ac42aed", + "0x53380d139d95b3df", + "0x650a73548baf63de", + "0x766a0abb3c77b2a8", + "0x81c2c92e47edaee6", + "0x92722c851482353b", + "0xa2bfe8a14cf10364", + "0xa81a664bbc423001", + "0xc24b8b70d0f89791", + "0xc76c51a30654be30", + "0xd192e819d6ef5218", + "0xd69906245565a910", + "0xf40e35855771202a", + "0x106aa07032bbd1b8", + "0x19a4c116b8d2d0c8", + "0x1e376c085141ab53", + "0x2748774cdf8eeb99", + "0x34b0bcb5e19b48a8", + "0x391c0cb3c5c95a63", + "0x4ed8aa4ae3418acb", + "0x5b9cca4f7763e373", + "0x682e6ff3d6b2b8a3", + "0x748f82ee5defb2fc", + "0x78a5636f43172f60", + "0x84c87814a1f0ab72", + "0x8cc702081a6439ec", + "0x90befffa23631e28", + "0xa4506cebde82bde9", + "0xbef9a3f7b2c67915", + "0xc67178f2e372532b", + "0xca273eceea26619c", + "0xd186b8c721c0c207", + "0xeada7dd6cde0eb1e", + "0xf57d4f7fee6ed178", + "0x06f067aa72176fba", + "0x0a637dc5a2c898a6", + "0x113f9804bef90dae", + "0x1b710b35131c471b", + "0x28db77f523047d84", + "0x32caab7b40c72493", + "0x3c9ebe0a15c9bebc", + "0x431d67c49c100d4c", + "0x4cc5d4becb3e42b6", + "0x597f299cfc657e2a", + "0x5fcb6fab3ad6faec", + "0x6c44198c4a475817" + ].map((n) => BigInt(n))))(); + SHA512_Kh2 = /* @__PURE__ */ (() => K5122[0])(); + SHA512_Kl2 = /* @__PURE__ */ (() => K5122[1])(); + SHA512_W_H2 = /* @__PURE__ */ new Uint32Array(80); + SHA512_W_L2 = /* @__PURE__ */ new Uint32Array(80); + SHA2_64B = class extends HashMD3 { + constructor(outputLen) { + super(128, outputLen, 16, false); } - get [kResponseExceededMaxSizeError]() { - return true; + // prettier-ignore + get() { + const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; + return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl]; } - }; - var kRequestRetryError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_RETRY"); - var RequestRetryError = class extends UndiciError { - constructor(message, code, { headers, data }) { - super(message); - this.name = "RequestRetryError"; - this.message = message || "Request retry error"; - this.code = "UND_ERR_REQ_RETRY"; - this.statusCode = code; - this.data = data; - this.headers = headers; + // prettier-ignore + set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) { + this.Ah = Ah | 0; + this.Al = Al | 0; + this.Bh = Bh | 0; + this.Bl = Bl | 0; + this.Ch = Ch | 0; + this.Cl = Cl | 0; + this.Dh = Dh | 0; + this.Dl = Dl | 0; + this.Eh = Eh | 0; + this.El = El | 0; + this.Fh = Fh | 0; + this.Fl = Fl | 0; + this.Gh = Gh | 0; + this.Gl = Gl | 0; + this.Hh = Hh | 0; + this.Hl = Hl | 0; } - static [Symbol.hasInstance](instance) { - return instance && instance[kRequestRetryError] === true; + process(view, offset) { + for (let i = 0; i < 16; i++, offset += 4) { + SHA512_W_H2[i] = view.getUint32(offset); + SHA512_W_L2[i] = view.getUint32(offset += 4); + } + for (let i = 16; i < 80; i++) { + const W15h = SHA512_W_H2[i - 15] | 0; + const W15l = SHA512_W_L2[i - 15] | 0; + const s0h = rotrSH2(W15h, W15l, 1) ^ rotrSH2(W15h, W15l, 8) ^ shrSH2(W15h, W15l, 7); + const s0l = rotrSL2(W15h, W15l, 1) ^ rotrSL2(W15h, W15l, 8) ^ shrSL2(W15h, W15l, 7); + const W2h = SHA512_W_H2[i - 2] | 0; + const W2l = SHA512_W_L2[i - 2] | 0; + const s1h = rotrSH2(W2h, W2l, 19) ^ rotrBH2(W2h, W2l, 61) ^ shrSH2(W2h, W2l, 6); + const s1l = rotrSL2(W2h, W2l, 19) ^ rotrBL2(W2h, W2l, 61) ^ shrSL2(W2h, W2l, 6); + const SUMl = add4L2(s0l, s1l, SHA512_W_L2[i - 7], SHA512_W_L2[i - 16]); + const SUMh = add4H2(SUMl, s0h, s1h, SHA512_W_H2[i - 7], SHA512_W_H2[i - 16]); + SHA512_W_H2[i] = SUMh | 0; + SHA512_W_L2[i] = SUMl | 0; + } + let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; + for (let i = 0; i < 80; i++) { + const sigma1h = rotrSH2(Eh, El, 14) ^ rotrSH2(Eh, El, 18) ^ rotrBH2(Eh, El, 41); + const sigma1l = rotrSL2(Eh, El, 14) ^ rotrSL2(Eh, El, 18) ^ rotrBL2(Eh, El, 41); + const CHIh = Eh & Fh ^ ~Eh & Gh; + const CHIl = El & Fl ^ ~El & Gl; + const T1ll = add5L2(Hl, sigma1l, CHIl, SHA512_Kl2[i], SHA512_W_L2[i]); + const T1h = add5H2(T1ll, Hh, sigma1h, CHIh, SHA512_Kh2[i], SHA512_W_H2[i]); + const T1l = T1ll | 0; + const sigma0h = rotrSH2(Ah, Al, 28) ^ rotrBH2(Ah, Al, 34) ^ rotrBH2(Ah, Al, 39); + const sigma0l = rotrSL2(Ah, Al, 28) ^ rotrBL2(Ah, Al, 34) ^ rotrBL2(Ah, Al, 39); + const MAJh = Ah & Bh ^ Ah & Ch ^ Bh & Ch; + const MAJl = Al & Bl ^ Al & Cl ^ Bl & Cl; + Hh = Gh | 0; + Hl = Gl | 0; + Gh = Fh | 0; + Gl = Fl | 0; + Fh = Eh | 0; + Fl = El | 0; + ({ h: Eh, l: El } = add2(Dh | 0, Dl | 0, T1h | 0, T1l | 0)); + Dh = Ch | 0; + Dl = Cl | 0; + Ch = Bh | 0; + Cl = Bl | 0; + Bh = Ah | 0; + Bl = Al | 0; + const All = add3L2(T1l, sigma0l, MAJl); + Ah = add3H2(All, T1h, sigma0h, MAJh); + Al = All | 0; + } + ({ h: Ah, l: Al } = add2(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0)); + ({ h: Bh, l: Bl } = add2(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0)); + ({ h: Ch, l: Cl } = add2(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0)); + ({ h: Dh, l: Dl } = add2(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0)); + ({ h: Eh, l: El } = add2(this.Eh | 0, this.El | 0, Eh | 0, El | 0)); + ({ h: Fh, l: Fl } = add2(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0)); + ({ h: Gh, l: Gl } = add2(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0)); + ({ h: Hh, l: Hl } = add2(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0)); + this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl); } - get [kRequestRetryError]() { - return true; + roundClean() { + clean3(SHA512_W_H2, SHA512_W_L2); + } + destroy() { + clean3(this.buffer); + this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } }; - var kResponseError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RESPONSE"); - var ResponseError = class extends UndiciError { - constructor(message, code, { headers, body }) { - super(message); - this.name = "ResponseError"; - this.message = message || "Response error"; - this.code = "UND_ERR_RESPONSE"; - this.statusCode = code; - this.body = body; - this.headers = headers; + _SHA512 = class extends SHA2_64B { + Ah = SHA512_IV3[0] | 0; + Al = SHA512_IV3[1] | 0; + Bh = SHA512_IV3[2] | 0; + Bl = SHA512_IV3[3] | 0; + Ch = SHA512_IV3[4] | 0; + Cl = SHA512_IV3[5] | 0; + Dh = SHA512_IV3[6] | 0; + Dl = SHA512_IV3[7] | 0; + Eh = SHA512_IV3[8] | 0; + El = SHA512_IV3[9] | 0; + Fh = SHA512_IV3[10] | 0; + Fl = SHA512_IV3[11] | 0; + Gh = SHA512_IV3[12] | 0; + Gl = SHA512_IV3[13] | 0; + Hh = SHA512_IV3[14] | 0; + Hl = SHA512_IV3[15] | 0; + constructor() { + super(64); } - static [Symbol.hasInstance](instance) { - return instance && instance[kResponseError] === true; + }; + sha2565 = /* @__PURE__ */ createHasher4( + () => new _SHA2562(), + /* @__PURE__ */ oidNist2(1) + ); + sha5122 = /* @__PURE__ */ createHasher4( + () => new _SHA512(), + /* @__PURE__ */ oidNist2(3) + ); + } +}); + +// node_modules/@scure/bip32/node_modules/@scure/base/index.js +function isBytes7(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; +} +function isArrayOf2(isString, arr) { + if (!Array.isArray(arr)) + return false; + if (arr.length === 0) + return true; + if (isString) { + return arr.every((item) => typeof item === "string"); + } else { + return arr.every((item) => Number.isSafeInteger(item)); + } +} +function afn2(input) { + if (typeof input !== "function") + throw new Error("function expected"); + return true; +} +function astr2(label, input) { + if (typeof input !== "string") + throw new Error(`${label}: string expected`); + return true; +} +function anumber5(n) { + if (!Number.isSafeInteger(n)) + throw new Error(`invalid integer: ${n}`); +} +function aArr2(input) { + if (!Array.isArray(input)) + throw new Error("array expected"); +} +function astrArr2(label, input) { + if (!isArrayOf2(true, input)) + throw new Error(`${label}: array of strings expected`); +} +function anumArr2(label, input) { + if (!isArrayOf2(false, input)) + throw new Error(`${label}: array of numbers expected`); +} +// @__NO_SIDE_EFFECTS__ +function chain2(...args) { + const id = (a) => a; + const wrap3 = (a, b) => (c2) => a(b(c2)); + const encode4 = args.map((x) => x.encode).reduceRight(wrap3, id); + const decode2 = args.map((x) => x.decode).reduce(wrap3, id); + return { encode: encode4, decode: decode2 }; +} +// @__NO_SIDE_EFFECTS__ +function alphabet2(letters) { + const lettersA = typeof letters === "string" ? letters.split("") : letters; + const len = lettersA.length; + astrArr2("alphabet", lettersA); + const indexes = new Map(lettersA.map((l2, i) => [l2, i])); + return { + encode: (digits) => { + aArr2(digits); + return digits.map((i) => { + if (!Number.isSafeInteger(i) || i < 0 || i >= len) + throw new Error(`alphabet.encode: digit index outside alphabet "${i}". Allowed: ${letters}`); + return lettersA[i]; + }); + }, + decode: (input) => { + aArr2(input); + return input.map((letter) => { + astr2("alphabet.decode", letter); + const i = indexes.get(letter); + if (i === void 0) + throw new Error(`Unknown letter: "${letter}". Allowed: ${letters}`); + return i; + }); + } + }; +} +// @__NO_SIDE_EFFECTS__ +function join5(separator = "") { + astr2("join", separator); + return { + encode: (from14) => { + astrArr2("join.decode", from14); + return from14.join(separator); + }, + decode: (to) => { + astr2("join.decode", to); + return to.split(separator); + } + }; +} +function convertRadix3(data, from14, to) { + if (from14 < 2) + throw new Error(`convertRadix: invalid from=${from14}, base cannot be less than 2`); + if (to < 2) + throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`); + aArr2(data); + if (!data.length) + return []; + let pos = 0; + const res = []; + const digits = Array.from(data, (d) => { + anumber5(d); + if (d < 0 || d >= from14) + throw new Error(`invalid integer: ${d}`); + return d; + }); + const dlen = digits.length; + while (true) { + let carry = 0; + let done = true; + for (let i = pos; i < dlen; i++) { + const digit = digits[i]; + const fromCarry = from14 * carry; + const digitBase = fromCarry + digit; + if (!Number.isSafeInteger(digitBase) || fromCarry / from14 !== carry || digitBase - digit !== fromCarry) { + throw new Error("convertRadix: carry overflow"); } - get [kResponseError]() { - return true; + const div = digitBase / to; + carry = digitBase % to; + const rounded = Math.floor(div); + digits[i] = rounded; + if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase) + throw new Error("convertRadix: carry overflow"); + if (!done) + continue; + else if (!rounded) + pos = i; + else + done = false; + } + res.push(carry); + if (done) + break; + } + for (let i = 0; i < data.length - 1 && data[i] === 0; i++) + res.push(0); + return res.reverse(); +} +// @__NO_SIDE_EFFECTS__ +function radix3(num2) { + anumber5(num2); + const _256 = 2 ** 8; + return { + encode: (bytes) => { + if (!isBytes7(bytes)) + throw new Error("radix.encode input should be Uint8Array"); + return convertRadix3(Array.from(bytes), _256, num2); + }, + decode: (digits) => { + anumArr2("radix.decode", digits); + return Uint8Array.from(convertRadix3(digits, num2, _256)); + } + }; +} +function checksum4(len, fn) { + anumber5(len); + afn2(fn); + return { + encode(data) { + if (!isBytes7(data)) + throw new Error("checksum.encode: input should be Uint8Array"); + const sum = fn(data).slice(0, len); + const res = new Uint8Array(data.length + len); + res.set(data); + res.set(sum, data.length); + return res; + }, + decode(data) { + if (!isBytes7(data)) + throw new Error("checksum.decode: input should be Uint8Array"); + const payload = data.slice(0, -len); + const oldChecksum = data.slice(-len); + const newChecksum = fn(payload).slice(0, len); + for (let i = 0; i < len; i++) + if (newChecksum[i] !== oldChecksum[i]) + throw new Error("Invalid checksum"); + return payload; + } + }; +} +var genBase58, base58, createBase58check; +var init_base3 = __esm({ + "node_modules/@scure/bip32/node_modules/@scure/base/index.js"() { + "use strict"; + genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc) => /* @__PURE__ */ chain2(/* @__PURE__ */ radix3(58), /* @__PURE__ */ alphabet2(abc), /* @__PURE__ */ join5("")); + base58 = /* @__PURE__ */ genBase58("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"); + createBase58check = (sha2566) => /* @__PURE__ */ chain2(checksum4(4, (data) => sha2566(sha2566(data))), base58); + } +}); + +// node_modules/@scure/bip32/index.js +var Point2, Fn, base58check, MASTER_SECRET, BITCOIN_VERSIONS, HARDENED_OFFSET, hash160, fromU32, toU32, HDKey; +var init_bip32 = __esm({ + "node_modules/@scure/bip32/index.js"() { + "use strict"; + init_secp256k13(); + init_hmac3(); + init_legacy(); + init_sha23(); + init_utils10(); + init_base3(); + Point2 = secp256k13.Point; + ({ Fn } = Point2); + base58check = createBase58check(sha2565); + MASTER_SECRET = Uint8Array.from("Bitcoin seed".split(""), (char) => char.charCodeAt(0)); + BITCOIN_VERSIONS = { private: 76066276, public: 76067358 }; + HARDENED_OFFSET = 2147483648; + hash160 = (data) => ripemd160(sha2565(data)); + fromU32 = (data) => createView3(data).getUint32(0, false); + toU32 = (n) => { + if (!Number.isSafeInteger(n) || n < 0 || n > 2 ** 32 - 1) { + throw new Error("invalid number, should be from 0 to 2**32-1, got " + n); } + const buf = new Uint8Array(4); + createView3(buf).setUint32(0, n, false); + return buf; }; - var kSecureProxyConnectionError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_PRX_TLS"); - var SecureProxyConnectionError = class extends UndiciError { - constructor(cause, message, options = {}) { - super(message, { cause, ...options }); - this.name = "SecureProxyConnectionError"; - this.message = message || "Secure Proxy Connection failed"; - this.code = "UND_ERR_PRX_TLS"; - this.cause = cause; + HDKey = class _HDKey { + get fingerprint() { + if (!this.pubHash) { + throw new Error("No publicKey set!"); + } + return fromU32(this.pubHash); } - static [Symbol.hasInstance](instance) { - return instance && instance[kSecureProxyConnectionError] === true; + get identifier() { + return this.pubHash; } - get [kSecureProxyConnectionError]() { - return true; + get pubKeyHash() { + return this.pubHash; } - }; - var kMaxOriginsReachedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_MAX_ORIGINS_REACHED"); - var MaxOriginsReachedError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "MaxOriginsReachedError"; - this.message = message || "Maximum allowed origins reached"; - this.code = "UND_ERR_MAX_ORIGINS_REACHED"; + get privateKey() { + return this._privateKey || null; } - static [Symbol.hasInstance](instance) { - return instance && instance[kMaxOriginsReachedError] === true; + get publicKey() { + return this._publicKey || null; } - get [kMaxOriginsReachedError]() { - return true; + get privateExtendedKey() { + const priv = this._privateKey; + if (!priv) { + throw new Error("No private key"); + } + return base58check.encode(this.serialize(this.versions.private, concatBytes6(Uint8Array.of(0), priv))); } - }; - var Socks5ProxyError = class extends UndiciError { - constructor(message, code) { - super(message); - this.name = "Socks5ProxyError"; - this.message = message || "SOCKS5 proxy error"; - this.code = code || "UND_ERR_SOCKS5"; + get publicExtendedKey() { + if (!this._publicKey) { + throw new Error("No public key"); + } + return base58check.encode(this.serialize(this.versions.public, this._publicKey)); } - }; - var kMessageSizeExceededError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED"); - var MessageSizeExceededError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "MessageSizeExceededError"; - this.message = message || "Max decompressed message size exceeded"; - this.code = "UND_ERR_WS_MESSAGE_SIZE_EXCEEDED"; + static fromMasterSeed(seed, versions = BITCOIN_VERSIONS) { + abytes5(seed); + if (8 * seed.length < 128 || 8 * seed.length > 512) { + throw new Error("HDKey: seed length must be between 128 and 512 bits; 256 bits is advised, got " + seed.length); + } + const I = hmac3(sha5122, MASTER_SECRET, seed); + const privateKey = I.slice(0, 32); + const chainCode = I.slice(32); + return new _HDKey({ versions, chainCode, privateKey }); } - static [Symbol.hasInstance](instance) { - return instance && instance[kMessageSizeExceededError] === true; + static fromExtendedKey(base58key, versions = BITCOIN_VERSIONS) { + const keyBuffer = base58check.decode(base58key); + const keyView = createView3(keyBuffer); + const version4 = keyView.getUint32(0, false); + const opt = { + versions, + depth: keyBuffer[4], + parentFingerprint: keyView.getUint32(5, false), + index: keyView.getUint32(9, false), + chainCode: keyBuffer.slice(13, 45) + }; + const key = keyBuffer.slice(45); + const isPriv = key[0] === 0; + if (version4 !== versions[isPriv ? "private" : "public"]) { + throw new Error("Version mismatch"); + } + if (isPriv) { + return new _HDKey({ ...opt, privateKey: key.slice(1) }); + } else { + return new _HDKey({ ...opt, publicKey: key }); + } } - get [kMessageSizeExceededError]() { - return true; + static fromJSON(json) { + return _HDKey.fromExtendedKey(json.xpriv); } - }; - module.exports = { - AbortError, - HTTPParserError, - UndiciError, - HeadersTimeoutError, - HeadersOverflowError, - BodyTimeoutError, - RequestContentLengthMismatchError, - ConnectTimeoutError, - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError, - ClientDestroyedError, - ClientClosedError, - InformationalError, - SocketError, - NotSupportedError, - ResponseContentLengthMismatchError, - BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError, - RequestRetryError, - ResponseError, - SecureProxyConnectionError, - MaxOriginsReachedError, - Socks5ProxyError, - MessageSizeExceededError - }; - } -}); - -// node_modules/undici/lib/core/constants.js -var require_constants2 = __commonJS({ - "node_modules/undici/lib/core/constants.js"(exports, module) { - "use strict"; - var wellknownHeaderNames = ( - /** @type {const} */ - [ - "Accept", - "Accept-Encoding", - "Accept-Language", - "Accept-Ranges", - "Access-Control-Allow-Credentials", - "Access-Control-Allow-Headers", - "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Access-Control-Expose-Headers", - "Access-Control-Max-Age", - "Access-Control-Request-Headers", - "Access-Control-Request-Method", - "Age", - "Allow", - "Alt-Svc", - "Alt-Used", - "Authorization", - "Cache-Control", - "Clear-Site-Data", - "Connection", - "Content-Disposition", - "Content-Encoding", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-Range", - "Content-Security-Policy", - "Content-Security-Policy-Report-Only", - "Content-Type", - "Cookie", - "Cross-Origin-Embedder-Policy", - "Cross-Origin-Opener-Policy", - "Cross-Origin-Resource-Policy", - "Date", - "Device-Memory", - "Downlink", - "ECT", - "ETag", - "Expect", - "Expect-CT", - "Expires", - "Forwarded", - "From", - "Host", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Range", - "If-Unmodified-Since", - "Keep-Alive", - "Last-Modified", - "Link", - "Location", - "Max-Forwards", - "Origin", - "Permissions-Policy", - "Pragma", - "Proxy-Authenticate", - "Proxy-Authorization", - "RTT", - "Range", - "Referer", - "Referrer-Policy", - "Refresh", - "Retry-After", - "Sec-WebSocket-Accept", - "Sec-WebSocket-Extensions", - "Sec-WebSocket-Key", - "Sec-WebSocket-Protocol", - "Sec-WebSocket-Version", - "Server", - "Server-Timing", - "Service-Worker-Allowed", - "Service-Worker-Navigation-Preload", - "Set-Cookie", - "SourceMap", - "Strict-Transport-Security", - "Supports-Loading-Mode", - "TE", - "Timing-Allow-Origin", - "Trailer", - "Transfer-Encoding", - "Upgrade", - "Upgrade-Insecure-Requests", - "User-Agent", - "Vary", - "Via", - "WWW-Authenticate", - "X-Content-Type-Options", - "X-DNS-Prefetch-Control", - "X-Frame-Options", - "X-Permitted-Cross-Domain-Policies", - "X-Powered-By", - "X-Requested-With", - "X-XSS-Protection" - ] - ); - var headerNameLowerCasedRecord = {}; - Object.setPrototypeOf(headerNameLowerCasedRecord, null); - var wellknownHeaderNameBuffers = {}; - Object.setPrototypeOf(wellknownHeaderNameBuffers, null); - function getHeaderNameAsBuffer(header) { - let buffer2 = wellknownHeaderNameBuffers[header]; - if (buffer2 === void 0) { - buffer2 = Buffer.from(header); + versions; + depth = 0; + index = 0; + chainCode = null; + parentFingerprint = 0; + _privateKey; + _publicKey; + pubHash; + constructor(opt) { + if (!opt || typeof opt !== "object") { + throw new Error("HDKey.constructor must not be called directly"); + } + this.versions = opt.versions || BITCOIN_VERSIONS; + this.depth = opt.depth || 0; + this.chainCode = opt.chainCode || null; + this.index = opt.index || 0; + this.parentFingerprint = opt.parentFingerprint || 0; + if (!this.depth) { + if (this.parentFingerprint || this.index) { + throw new Error("HDKey: zero depth with non-zero index/parent fingerprint"); + } + } + if (this.depth > 255) { + throw new Error("HDKey: depth exceeds the serializable value 255"); + } + if (opt.publicKey && opt.privateKey) { + throw new Error("HDKey: publicKey and privateKey at same time."); + } + if (opt.privateKey) { + if (!secp256k13.utils.isValidSecretKey(opt.privateKey)) + throw new Error("Invalid private key"); + this._privateKey = opt.privateKey; + this._publicKey = secp256k13.getPublicKey(opt.privateKey, true); + } else if (opt.publicKey) { + this._publicKey = Point2.fromBytes(opt.publicKey).toBytes(true); + } else { + throw new Error("HDKey: no public or private key provided"); + } + this.pubHash = hash160(this._publicKey); } - return buffer2; - } - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i]; - const lowerCasedKey = key.toLowerCase(); - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; - } - module.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord, - getHeaderNameAsBuffer - }; - } -}); - -// node_modules/undici/lib/core/tree.js -var require_tree = __commonJS({ - "node_modules/undici/lib/core/tree.js"(exports, module) { - "use strict"; - var { - wellknownHeaderNames, - headerNameLowerCasedRecord - } = require_constants2(); - var TstNode = class _TstNode { - /** @type {any} */ - value = null; - /** @type {null | TstNode} */ - left = null; - /** @type {null | TstNode} */ - middle = null; - /** @type {null | TstNode} */ - right = null; - /** @type {number} */ - code; - /** - * @param {string} key - * @param {any} value - * @param {number} index - */ - constructor(key, value, index2) { - if (index2 === void 0 || index2 >= key.length) { - throw new TypeError("Unreachable"); + derive(path) { + if (!/^[mM]'?/.test(path)) { + throw new Error('Path must start with "m" or "M"'); + } + if (/^[mM]'?$/.test(path)) { + return this; + } + const parts = path.replace(/^[mM]'?\//, "").split("/"); + let child = this; + for (const c2 of parts) { + const m = /^(\d+)('?)$/.exec(c2); + const m1 = m && m[1]; + if (!m || m.length !== 3 || typeof m1 !== "string") + throw new Error("invalid child index: " + c2); + let idx = +m1; + if (!Number.isSafeInteger(idx) || idx >= HARDENED_OFFSET) { + throw new Error("Invalid index"); + } + if (m[2] === "'") { + idx += HARDENED_OFFSET; + } + child = child.deriveChild(idx); } - const code = this.code = key.charCodeAt(index2); - if (code > 127) { - throw new TypeError("key must be ascii string"); + return child; + } + deriveChild(index2) { + if (!this._publicKey || !this.chainCode) { + throw new Error("No publicKey or chainCode set"); } - if (key.length !== ++index2) { - this.middle = new _TstNode(key, value, index2); + let data = toU32(index2); + if (index2 >= HARDENED_OFFSET) { + const priv = this._privateKey; + if (!priv) { + throw new Error("Could not derive hardened child key"); + } + data = concatBytes6(Uint8Array.of(0), priv, data); } else { - this.value = value; + data = concatBytes6(this._publicKey, data); } - } - /** - * @param {string} key - * @param {any} value - * @returns {void} - */ - add(key, value) { - const length = key.length; - if (length === 0) { - throw new TypeError("Unreachable"); + const I = hmac3(sha5122, this.chainCode, data); + const childTweak = I.slice(0, 32); + const chainCode = I.slice(32); + if (!secp256k13.utils.isValidSecretKey(childTweak)) { + throw new Error("Tweak bigger than curve order"); } - let index2 = 0; - let node = this; - while (true) { - const code = key.charCodeAt(index2); - if (code > 127) { - throw new TypeError("key must be ascii string"); - } - if (node.code === code) { - if (length === ++index2) { - node.value = value; - break; - } else if (node.middle !== null) { - node = node.middle; - } else { - node.middle = new _TstNode(key, value, index2); - break; - } - } else if (node.code < code) { - if (node.left !== null) { - node = node.left; - } else { - node.left = new _TstNode(key, value, index2); - break; + const opt = { + versions: this.versions, + chainCode, + depth: this.depth + 1, + parentFingerprint: this.fingerprint, + index: index2 + }; + const ctweak = Fn.fromBytes(childTweak); + try { + if (this._privateKey) { + const added = Fn.create(Fn.fromBytes(this._privateKey) + ctweak); + if (!Fn.isValidNot0(added)) { + throw new Error("The tweak was out of range or the resulted private key is invalid"); } - } else if (node.right !== null) { - node = node.right; + opt.privateKey = Fn.toBytes(added); } else { - node.right = new _TstNode(key, value, index2); - break; + const added = Point2.fromBytes(this._publicKey).add(Point2.BASE.multiply(ctweak)); + if (added.equals(Point2.ZERO)) { + throw new Error("The tweak was equal to negative P, which made the result key invalid"); + } + opt.publicKey = added.toBytes(true); } + return new _HDKey(opt); + } catch (err) { + return this.deriveChild(index2 + 1); } } - /** - * @param {Uint8Array} key - * @returns {TstNode | null} - */ - search(key) { - const keylength = key.length; - let index2 = 0; - let node = this; - while (node !== null && index2 < keylength) { - let code = key[index2]; - if (code <= 90 && code >= 65) { - code |= 32; - } - while (node !== null) { - if (code === node.code) { - if (keylength === ++index2) { - return node; - } - node = node.middle; - break; - } - node = node.code < code ? node.left : node.right; - } + sign(hash3) { + if (!this._privateKey) { + throw new Error("No privateKey set!"); } - return null; + abytes5(hash3, 32); + return secp256k13.sign(hash3, this._privateKey, { prehash: false }); + } + verify(hash3, signature2) { + abytes5(hash3, 32); + abytes5(signature2, 64); + if (!this._publicKey) { + throw new Error("No publicKey set!"); + } + return secp256k13.verify(signature2, hash3, this._publicKey, { prehash: false }); + } + wipePrivateData() { + if (this._privateKey) { + this._privateKey.fill(0); + this._privateKey = void 0; + } + return this; + } + toJSON() { + return { + xpriv: this.privateExtendedKey, + xpub: this.publicExtendedKey + }; + } + serialize(version4, key) { + if (!this.chainCode) { + throw new Error("No chainCode set"); + } + abytes5(key, 33); + return concatBytes6(toU32(version4), new Uint8Array([this.depth]), toU32(this.parentFingerprint), toU32(this.index), this.chainCode, key); + } + }; + } +}); + +// node_modules/@solana/errors/dist/index.node.mjs +function encodeValue(value) { + if (Array.isArray(value)) { + const commaSeparatedValues = value.map(encodeValue).join( + "%2C%20" + /* ", " */ + ); + return "%5B" + commaSeparatedValues + /* "]" */ + "%5D"; + } else if (typeof value === "bigint") { + return `${value}n`; + } else { + return encodeURIComponent( + String( + value != null && Object.getPrototypeOf(value) === null ? ( + // Plain objects with no prototype don't have a `toString` method. + // Convert them before stringifying them. + { ...value } + ) : value + ) + ); + } +} +function encodeObjectContextEntry([key, value]) { + return `${key}=${encodeValue(value)}`; +} +function encodeContextObject(context) { + const searchParamsString = Object.entries(context).map(encodeObjectContextEntry).join("&"); + return Buffer.from(searchParamsString, "utf8").toString("base64"); +} +function getHumanReadableErrorMessage(code, context = {}) { + const messageFormatString = SolanaErrorMessages[code]; + if (messageFormatString.length === 0) { + return ""; + } + let state; + function commitStateUpTo(endIndex) { + if (state[TYPE] === 2) { + const variableName = messageFormatString.slice(state[START_INDEX] + 1, endIndex); + fragments.push( + variableName in context ? ( + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `${context[variableName]}` + ) : `$${variableName}` + ); + } else if (state[TYPE] === 1) { + fragments.push(messageFormatString.slice(state[START_INDEX], endIndex)); + } + } + const fragments = []; + messageFormatString.split("").forEach((char, ii) => { + if (ii === 0) { + state = { + [START_INDEX]: 0, + [TYPE]: messageFormatString[0] === "\\" ? 0 : messageFormatString[0] === "$" ? 2 : 1 + /* Text */ + }; + return; + } + let nextState; + switch (state[TYPE]) { + case 0: + nextState = { + [START_INDEX]: ii, + [TYPE]: 1 + /* Text */ + }; + break; + case 1: + if (char === "\\") { + nextState = { + [START_INDEX]: ii, + [TYPE]: 0 + /* EscapeSequence */ + }; + } else if (char === "$") { + nextState = { + [START_INDEX]: ii, + [TYPE]: 2 + /* Variable */ + }; + } + break; + case 2: + if (char === "\\") { + nextState = { + [START_INDEX]: ii, + [TYPE]: 0 + /* EscapeSequence */ + }; + } else if (char === "$") { + nextState = { + [START_INDEX]: ii, + [TYPE]: 2 + /* Variable */ + }; + } else if (!char.match(/\w/)) { + nextState = { + [START_INDEX]: ii, + [TYPE]: 1 + /* Text */ + }; + } + break; + } + if (nextState) { + if (state !== nextState) { + commitStateUpTo(ii); + } + state = nextState; + } + }); + commitStateUpTo(); + return fragments.join(""); +} +function getErrorMessage(code, context = {}) { + if (process.env.NODE_ENV !== "production") { + return getHumanReadableErrorMessage(code, context); + } else { + let decodingAdviceMessage = `Solana error #${code}; Decode this error by running \`npx @solana/errors decode -- ${code}`; + if (Object.keys(context).length) { + decodingAdviceMessage += ` '${encodeContextObject(context)}'`; + } + return `${decodingAdviceMessage}\``; + } +} +function isSolanaError(e7, code) { + const isSolanaError2 = e7 instanceof Error && e7.name === "SolanaError"; + if (isSolanaError2) { + if (code !== void 0) { + return e7.context.__code === code; + } + return true; + } + return false; +} +function safeCaptureStackTrace(...args) { + if ("captureStackTrace" in Error && typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(...args); + } +} +function getSolanaErrorFromRpcError({ errorCodeBaseOffset, getErrorContext, orderedErrorNames, rpcEnumError }, constructorOpt) { + let rpcErrorName; + let rpcErrorContext; + if (typeof rpcEnumError === "string") { + rpcErrorName = rpcEnumError; + } else { + rpcErrorName = Object.keys(rpcEnumError)[0]; + rpcErrorContext = rpcEnumError[rpcErrorName]; + } + const codeOffset = orderedErrorNames.indexOf(rpcErrorName); + const errorCode = errorCodeBaseOffset + codeOffset; + const errorContext = getErrorContext(errorCode, rpcErrorName, rpcErrorContext); + const err = new SolanaError(errorCode, errorContext); + safeCaptureStackTrace(err, constructorOpt); + return err; +} +function getSolanaErrorFromInstructionError(index2, instructionError) { + const numberIndex = Number(index2); + return getSolanaErrorFromRpcError( + { + errorCodeBaseOffset: 4615001, + getErrorContext(errorCode, rpcErrorName, rpcErrorContext) { + if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN) { + return { + errorName: rpcErrorName, + index: numberIndex, + ...rpcErrorContext !== void 0 ? { instructionErrorContext: rpcErrorContext } : null + }; + } else if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM) { + return { + code: Number(rpcErrorContext), + index: numberIndex + }; + } + return { index: numberIndex }; + }, + orderedErrorNames: ORDERED_ERROR_NAMES, + rpcEnumError: instructionError + }, + getSolanaErrorFromInstructionError + ); +} +function getSolanaErrorFromTransactionError(transactionError) { + if (typeof transactionError === "object" && "InstructionError" in transactionError) { + return getSolanaErrorFromInstructionError( + ...transactionError.InstructionError + ); + } + return getSolanaErrorFromRpcError( + { + errorCodeBaseOffset: 7050001, + getErrorContext(errorCode, rpcErrorName, rpcErrorContext) { + if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN) { + return { + errorName: rpcErrorName, + ...rpcErrorContext !== void 0 ? { transactionErrorContext: rpcErrorContext } : null + }; + } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION) { + return { + index: Number(rpcErrorContext) + }; + } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT || errorCode === SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED) { + return { + accountIndex: Number(rpcErrorContext.account_index) + }; + } + }, + orderedErrorNames: ORDERED_ERROR_NAMES2, + rpcEnumError: transactionError + }, + getSolanaErrorFromTransactionError + ); +} +function getSolanaErrorFromJsonRpcError(putativeErrorResponse) { + let out; + if (isRpcErrorResponse(putativeErrorResponse)) { + const { code: rawCode, data, message } = putativeErrorResponse; + const code = Number(rawCode); + if (code === SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE) { + const { err, ...preflightErrorContext } = data; + const causeObject = err ? { cause: getSolanaErrorFromTransactionError(err) } : null; + out = new SolanaError(SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, { + ...preflightErrorContext, + ...causeObject + }); + } else { + let errorContext; + switch (code) { + case SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR: + case SOLANA_ERROR__JSON_RPC__INVALID_PARAMS: + case SOLANA_ERROR__JSON_RPC__INVALID_REQUEST: + case SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND: + case SOLANA_ERROR__JSON_RPC__PARSE_ERROR: + case SOLANA_ERROR__JSON_RPC__SCAN_ERROR: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE: + case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION: + errorContext = { __serverMessage: message }; + break; + default: + if (typeof data === "object" && !Array.isArray(data)) { + errorContext = data; + } } + out = new SolanaError(code, errorContext); + } + } else { + const message = typeof putativeErrorResponse === "object" && putativeErrorResponse !== null && "message" in putativeErrorResponse && typeof putativeErrorResponse.message === "string" ? putativeErrorResponse.message : "Malformed JSON-RPC error with no message attribute"; + out = new SolanaError(SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, { error: putativeErrorResponse, message }); + } + safeCaptureStackTrace(out, getSolanaErrorFromJsonRpcError); + return out; +} +function isRpcErrorResponse(value) { + return typeof value === "object" && value !== null && "code" in value && "message" in value && (typeof value.code === "number" || typeof value.code === "bigint") && typeof value.message === "string"; +} +function unwrapSimulationError(error) { + const simulationCodes = [ + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, + SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT + ]; + if (isSolanaError(error) && !!error.cause && simulationCodes.includes(error.context.__code)) { + return error.cause; + } + return error; +} +var SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, SOLANA_ERROR__INVALID_NONCE, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE, SOLANA_ERROR__MALFORMED_BIGINT_STRING, SOLANA_ERROR__MALFORMED_NUMBER_STRING, SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, SOLANA_ERROR__JSON_RPC__PARSE_ERROR, SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR, SOLANA_ERROR__JSON_RPC__INVALID_PARAMS, SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND, SOLANA_ERROR__JSON_RPC__INVALID_REQUEST, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH, SOLANA_ERROR__JSON_RPC__SCAN_ERROR, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS, SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY, SOLANA_ERROR__ADDRESSES__MALFORMED_PDA, SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE, SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED, SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER, SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS, SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT, SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED, SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY, SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN, SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL, SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS, SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID, SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED, SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT, SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION, SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID, SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND, SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE, SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE, SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT, SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID, SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH, SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT, SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC, SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION, SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE, SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE, SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE, SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE, SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY, SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR, SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT, SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER, SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW, SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR, SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED, SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS, SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS, SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE, SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE, SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH, SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO, SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY, SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME, SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME, SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING, SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING, SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING, SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING, SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE, SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES, SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT, SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT, SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE, SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED, SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP, SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX, SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION, SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE, SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE, SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS, SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT, SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED, SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT, SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED, SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED, SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE, SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND, SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH, SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH, SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH, SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, SOLANA_ERROR__CODECS__INVALID_CONSTANT, SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE, SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, SOLANA_ERROR__RPC__INTEGER_OVERFLOW, SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING, SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE, SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING, SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, SolanaErrorMessages, START_INDEX, TYPE, SolanaError, ORDERED_ERROR_NAMES, ORDERED_ERROR_NAMES2; +var init_index_node = __esm({ + "node_modules/@solana/errors/dist/index.node.mjs"() { + "use strict"; + SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED = 1; + SOLANA_ERROR__INVALID_NONCE = 2; + SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND = 3; + SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE = 4; + SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH = 5; + SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE = 6; + SOLANA_ERROR__MALFORMED_BIGINT_STRING = 7; + SOLANA_ERROR__MALFORMED_NUMBER_STRING = 8; + SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE = 9; + SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR = 10; + SOLANA_ERROR__JSON_RPC__PARSE_ERROR = -32700; + SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR = -32603; + SOLANA_ERROR__JSON_RPC__INVALID_PARAMS = -32602; + SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND = -32601; + SOLANA_ERROR__JSON_RPC__INVALID_REQUEST = -32600; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE = -32019; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY = -32018; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE = -32017; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED = -32016; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION = -32015; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET = -32014; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH = -32013; + SOLANA_ERROR__JSON_RPC__SCAN_ERROR = -32012; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE = -32011; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX = -32010; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED = -32009; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT = -32008; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED = -32007; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE = -32006; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY = -32005; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE = -32004; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE = -32003; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE = -32002; + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP = -32001; + SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH = 28e5; + SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE = 2800001; + SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS = 2800002; + SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY = 2800003; + SOLANA_ERROR__ADDRESSES__MALFORMED_PDA = 2800004; + SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE = 2800005; + SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED = 2800006; + SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED = 2800007; + SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE = 2800008; + SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED = 2800009; + SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER = 2800010; + SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS = 2800011; + SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND = 323e4; + SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND = 32300001; + SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT = 3230002; + SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT = 3230003; + SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED = 3230004; + SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT = 361e4; + SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED = 3610001; + SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED = 3610002; + SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED = 3610003; + SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED = 3610004; + SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED = 3610005; + SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED = 3610006; + SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY = 3610007; + SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED = 3611e3; + SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH = 3704e3; + SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH = 3704001; + SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH = 3704002; + SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE = 3704003; + SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY = 3704004; + SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS = 4128e3; + SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA = 4128001; + SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH = 4128002; + SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN = 4615e3; + SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR = 4615001; + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT = 4615002; + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA = 4615003; + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA = 4615004; + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL = 4615005; + SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS = 4615006; + SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID = 4615007; + SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE = 4615008; + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED = 4615009; + SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT = 4615010; + SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION = 4615011; + SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID = 4615012; + SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND = 4615013; + SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED = 4615014; + SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE = 4615015; + SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED = 4615016; + SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX = 4615017; + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED = 4615018; + SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED = 4615019; + SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS = 4615020; + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED = 4615021; + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE = 4615022; + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED = 4615023; + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 4615024; + SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC = 4615025; + SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM = 4615026; + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR = 4615027; + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED = 4615028; + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE = 4615029; + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT = 4615030; + SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID = 4615031; + SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH = 4615032; + SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT = 4615033; + SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED = 4615034; + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED = 4615035; + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS = 4615036; + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC = 4615037; + SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED = 4615038; + SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION = 4615039; + SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE = 4615040; + SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE = 4615041; + SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE = 4615042; + SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE = 4615043; + SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY = 4615044; + SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR = 4615045; + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT = 4615046; + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER = 4615047; + SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW = 4615048; + SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR = 4615049; + SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER = 4615050; + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED = 4615051; + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED = 4615052; + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED = 4615053; + SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS = 4615054; + SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS = 5508e3; + SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER = 5508001; + SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER = 5508002; + SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER = 5508003; + SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER = 5508004; + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER = 5508005; + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER = 5508006; + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER = 5508007; + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER = 5508008; + SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS = 5508009; + SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING = 5508010; + SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED = 5508011; + SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED = 5607e3; + SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE = 5607001; + SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE = 5607002; + SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH = 5607003; + SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH = 5607004; + SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO = 5607005; + SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED = 5607006; + SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH = 5607007; + SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH = 5607008; + SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY = 5607009; + SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO = 5607010; + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING = 5607011; + SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH = 5607012; + SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE = 5607013; + SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION = 5607014; + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED = 5607015; + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE = 5607016; + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE = 5607017; + SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES = 5663e3; + SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE = 5663001; + SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME = 5663002; + SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME = 5663003; + SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE = 5663004; + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING = 5663005; + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE = 5663006; + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND = 5663007; + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING = 5663008; + SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING = 5663009; + SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING = 5663010; + SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING = 5663011; + SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING = 5663012; + SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING = 5663013; + SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE = 5663014; + SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION = 5663015; + SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES = 5663016; + SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH = 5663017; + SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT = 5663018; + SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT = 5663019; + SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT = 5663020; + SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED = 5663021; + SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE = 5663022; + SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN = 705e4; + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE = 7050001; + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE = 7050002; + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND = 7050003; + SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND = 7050004; + SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE = 7050005; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE = 7050006; + SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED = 7050007; + SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND = 7050008; + SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP = 7050009; + SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE = 7050010; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX = 7050011; + SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE = 7050012; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION = 7050013; + SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE = 7050014; + SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE = 7050015; + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 7050016; + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT = 7050017; + SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION = 7050018; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT = 7050019; + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT = 7050020; + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT = 7050021; + SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS = 7050022; + SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND = 7050023; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER = 7050024; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA = 7050025; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX = 7050026; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT = 7050027; + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT = 7050028; + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT = 7050029; + SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION = 7050030; + SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT = 7050031; + SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED = 7050032; + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT = 7050033; + SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED = 7050034; + SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED = 7050035; + SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION = 7050036; + SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN = 7618e3; + SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE = 7618001; + SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN = 7618002; + SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN = 7618003; + SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED = 7618004; + SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND = 7618005; + SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN = 7618006; + SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN = 7618007; + SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT = 7618008; + SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT = 7618009; + SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY = 8078e3; + SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH = 8078001; + SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH = 8078002; + SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH = 8078003; + SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH = 8078004; + SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH = 8078005; + SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH = 8078006; + SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS = 8078007; + SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE = 8078008; + SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT = 8078009; + SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT = 8078010; + SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE = 8078011; + SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE = 8078012; + SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH = 8078013; + SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE = 8078014; + SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT = 8078015; + SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE = 8078016; + SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE = 8078017; + SOLANA_ERROR__CODECS__INVALID_CONSTANT = 8078018; + SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE = 8078019; + SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL = 8078020; + SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES = 8078021; + SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS = 8078022; + SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY = 8078023; + SOLANA_ERROR__RPC__INTEGER_OVERFLOW = 81e5; + SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN = 8100001; + SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR = 8100002; + SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD = 8100003; + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN = 819e4; + SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID = 8190001; + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED = 8190002; + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED = 8190003; + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT = 8190004; + SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING = 99e5; + SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE = 9900001; + SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING = 9900002; + SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE = 9900003; + SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED = 9900004; + SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND = 9900005; + SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND = 9900006; + SolanaErrorMessages = { + [SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND]: "Account not found at address: $address", + [SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED]: "Not all accounts were decoded. Encoded accounts found at addresses: $addresses.", + [SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT]: "Expected decoded account at address: $address", + [SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT]: "Failed to decode account data at address: $address", + [SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND]: "Accounts not found at addresses: $addresses", + [SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED]: "Unable to find a viable program address bump seed.", + [SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS]: "$putativeAddress is not a base58-encoded address.", + [SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH]: "Expected base58 encoded address to decode to a byte array of length 32. Actual length: $actualLength.", + [SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY]: "The `CryptoKey` must be an `Ed25519` public key.", + [SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS]: "$putativeOffCurveAddress is not a base58-encoded off-curve address.", + [SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE]: "Invalid seeds; point must fall off the Ed25519 curve.", + [SOLANA_ERROR__ADDRESSES__MALFORMED_PDA]: "Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].", + [SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]: "A maximum of $maxSeeds seeds, including the bump seed, may be supplied when creating an address. Received: $actual.", + [SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED]: "The seed at index $index with length $actual exceeds the maximum length of $maxSeedLength bytes.", + [SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE]: "Expected program derived address bump to be in the range [0, 255], got: $bump.", + [SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER]: "Program address cannot end with PDA marker.", + [SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded address string of length in the range [32, 44]. Actual length: $actualLength.", + [SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded blockash string of length in the range [32, 44]. Actual length: $actualLength.", + [SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED]: "The network has progressed past the last block for which this transaction could have been committed.", + [SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY]: "Codec [$codecDescription] cannot decode empty byte arrays.", + [SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS]: "Enum codec cannot use lexical values [$stringValues] as discriminators. Either remove all lexical values or set `useValuesAsDiscriminators` to `false`.", + [SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL]: "Sentinel [$hexSentinel] must not be present in encoded bytes [$hexEncodedBytes].", + [SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH]: "Encoder and decoder must have the same fixed size, got [$encoderFixedSize] and [$decoderFixedSize].", + [SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH]: "Encoder and decoder must have the same max size, got [$encoderMaxSize] and [$decoderMaxSize].", + [SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH]: "Encoder and decoder must either both be fixed-size or variable-size.", + [SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE]: "Enum discriminator out of range. Expected a number in [$formattedValidDiscriminators], got $discriminator.", + [SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH]: "Expected a fixed-size codec, got a variable-size one.", + [SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH]: "Codec [$codecDescription] expected a positive byte length, got $bytesLength.", + [SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH]: "Expected a variable-size codec, got a fixed-size one.", + [SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE]: "Codec [$codecDescription] expected zero-value [$hexZeroValue] to have the same size as the provided fixed-size item [$expectedSize bytes].", + [SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH]: "Codec [$codecDescription] expected $expected bytes, got $bytesLength.", + [SOLANA_ERROR__CODECS__INVALID_CONSTANT]: "Expected byte array constant [$hexConstant] to be present in data [$hexData] at offset [$offset].", + [SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT]: "Invalid discriminated union variant. Expected one of [$variants], got $value.", + [SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT]: "Invalid enum variant. Expected one of [$stringValues] or a number in [$formattedNumericalValues], got $variant.", + [SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT]: "Invalid literal union variant. Expected one of [$variants], got $value.", + [SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS]: "Expected [$codecDescription] to have $expected items, got $actual.", + [SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE]: "Invalid value $value for base $base with alphabet $alphabet.", + [SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE]: "Literal union discriminator out of range. Expected a number between $minRange and $maxRange, got $discriminator.", + [SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE]: "Codec [$codecDescription] expected number to be in the range [$min, $max], got $value.", + [SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE]: "Codec [$codecDescription] expected offset to be in the range [0, $bytesLength], got $offset.", + [SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES]: "Expected sentinel [$hexSentinel] to be present in decoded bytes [$hexDecodedBytes].", + [SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE]: "Union variant out of range. Expected an index between $minRange and $maxRange, got $variant.", + [SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY]: "This decoder expected a byte array of exactly $expectedLength bytes, but $numExcessBytes unexpected excess bytes remained after decoding. Are you sure that you have chosen the correct decoder for this data?", + [SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED]: "No random values implementation could be found.", + [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED]: "instruction requires an uninitialized account", + [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED]: "instruction tries to borrow reference for an account which is already borrowed", + [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]: "instruction left account with an outstanding borrowed reference", + [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED]: "program other than the account's owner changed the size of the account data", + [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL]: "account data too small for instruction", + [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE]: "instruction expected an executable account", + [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT]: "An account does not have enough lamports to be rent-exempt", + [SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW]: "Program arithmetic overflowed", + [SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR]: "Failed to serialize or deserialize account data: $encodedData", + [SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS]: "Builtin programs must consume compute units", + [SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH]: "Cross-program invocation call depth too deep", + [SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED]: "Computational budget exceeded", + [SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM]: "custom program error: #$code", + [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX]: "instruction contains duplicate accounts", + [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC]: "instruction modifications of multiply-passed account differ", + [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT]: "executable accounts must be rent exempt", + [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED]: "instruction changed executable accounts data", + [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE]: "instruction changed the balance of an executable account", + [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED]: "instruction changed executable bit of an account", + [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED]: "instruction modified data of an account it does not own", + [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND]: "instruction spent from the balance of an account it does not own", + [SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR]: "generic instruction error", + [SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER]: "Provided owner is not allowed", + [SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE]: "Account is immutable", + [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY]: "Incorrect authority provided", + [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID]: "incorrect program id for instruction", + [SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS]: "insufficient funds for instruction", + [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA]: "invalid account data for instruction", + [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER]: "Invalid account owner", + [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT]: "invalid program argument", + [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR]: "program returned invalid error code", + [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA]: "invalid instruction data", + [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC]: "Failed to reallocate account data", + [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS]: "Provided seeds do not result in a valid address", + [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED]: "Accounts data allocations exceeded the maximum allowed per transaction", + [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED]: "Max accounts exceeded", + [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED]: "Max instruction trace length exceeded", + [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED]: "Length of the seed is too long for address generation", + [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT]: "An account required by the instruction is missing", + [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE]: "missing required signature for instruction", + [SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID]: "instruction illegally modified the program id of an account", + [SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS]: "insufficient account keys for instruction", + [SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION]: "Cross-program invocation with unauthorized signer or writable account", + [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE]: "Failed to create program execution environment", + [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE]: "Program failed to compile", + [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE]: "Program failed to complete", + [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED]: "instruction modified data of a read-only account", + [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE]: "instruction changed the balance of a read-only account", + [SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED]: "Cross-program invocation reentrancy not allowed for this instruction", + [SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED]: "instruction modified rent epoch of an account", + [SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION]: "sum of account balances before and after instruction do not match", + [SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT]: "instruction requires an initialized account", + [SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN]: "", + [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID]: "Unsupported program id", + [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR]: "Unsupported sysvar", + [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND]: "Invalid instruction plan kind: $kind.", + [SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN]: "The provided instruction plan is empty.", + [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND]: "No failed transaction plan result was found in the provided transaction plan result.", + [SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED]: "This transaction plan executor does not support non-divisible sequential plans. To support them, you may create your own executor such that multi-transaction atomicity is preserved \u2014 e.g. by targetting RPCs that support transaction bundles.", + [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN]: "The provided transaction plan failed to execute. See the `transactionPlanResult` attribute for more details. Note that the `cause` property is deprecated, and a future version will not set it.", + [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN]: "The provided message has insufficient capacity to accommodate the next instruction(s) in this plan. Expected at least $numBytesRequired free byte(s), got $numFreeBytes byte(s).", + [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND]: "Invalid transaction plan kind: $kind.", + [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE]: "No more instructions to pack; the message packer has completed the instruction plan.", + [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN]: "Unexpected instruction plan. Expected $expectedKind plan, got $actualKind plan.", + [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN]: "Unexpected transaction plan. Expected $expectedKind plan, got $actualKind plan.", + [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT]: "Unexpected transaction plan result. Expected $expectedKind plan, got $actualKind plan.", + [SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT]: "Expected a successful transaction plan result. I.e. there is at least one failed or cancelled transaction in the plan.", + [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS]: "The instruction does not have any accounts.", + [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA]: "The instruction does not have any data.", + [SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH]: "Expected instruction to have progress address $expectedProgramAddress, got $actualProgramAddress.", + [SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH]: "Expected base58 encoded blockhash to decode to a byte array of length 32. Actual length: $actualLength.", + [SOLANA_ERROR__INVALID_NONCE]: "The nonce `$expectedNonceValue` is no longer valid. It has advanced to `$actualNonceValue`", + [SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING]: "Invariant violation: Found no abortable iterable cache entry for key `$cacheKey`. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", + [SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED]: "Invariant violation: This data publisher does not publish to the channel named `$channelName`. Supported channels include $supportedChannelNames.", + [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE]: "Invariant violation: WebSocket message iterator state is corrupt; iterated without first resolving existing message promise. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", + [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING]: "Invariant violation: WebSocket message iterator is missing state storage. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", + [SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE]: "Invariant violation: Switch statement non-exhaustive. Received unexpected value `$unexpectedValue`. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant", + [SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR]: "JSON-RPC error: Internal JSON-RPC error ($__serverMessage)", + [SOLANA_ERROR__JSON_RPC__INVALID_PARAMS]: "JSON-RPC error: Invalid method parameter(s) ($__serverMessage)", + [SOLANA_ERROR__JSON_RPC__INVALID_REQUEST]: "JSON-RPC error: The JSON sent is not a valid `Request` object ($__serverMessage)", + [SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND]: "JSON-RPC error: The method does not exist / is not available ($__serverMessage)", + [SOLANA_ERROR__JSON_RPC__PARSE_ERROR]: "JSON-RPC error: An error occurred on the server while parsing the JSON text ($__serverMessage)", + [SOLANA_ERROR__JSON_RPC__SCAN_ERROR]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE]: "Epoch rewards period still active at slot $slot", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE]: "Failed to query long-term storage; please try again", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED]: "Minimum context slot has not been reached", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY]: "Node is unhealthy; behind by $numSlotsBehind slots", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT]: "No snapshot", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE]: "Transaction simulation failed", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY]: "Rewards cannot be found because slot $slot is not the epoch boundary. This may be due to gap in the queried node's local ledger or long-term storage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE]: "Transaction history is not available from this node", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE]: "$__serverMessage", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH]: "Transaction signature length mismatch", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE]: "Transaction signature verification failure", + [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION]: "$__serverMessage", + [SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH]: "Key pair bytes must be of length 64, got $byteLength.", + [SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH]: "Expected private key bytes with length 32. Actual length: $actualLength.", + [SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH]: "Expected base58-encoded signature to decode to a byte array of length 64. Actual length: $actualLength.", + [SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY]: "The provided private key does not match the provided public key.", + [SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded signature string of length in the range [64, 88]. Actual length: $actualLength.", + [SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE]: "Lamports value must be in the range [0, 2e64-1]", + [SOLANA_ERROR__MALFORMED_BIGINT_STRING]: "`$value` cannot be parsed as a `BigInt`", + [SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: "$message", + [SOLANA_ERROR__MALFORMED_NUMBER_STRING]: "`$value` cannot be parsed as a `Number`", + [SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: "No nonce account could be found at address `$nonceAccountAddress`", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]: "Expected base58 encoded application domain to decode to a byte array of length 32. Actual length: $actualLength.", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE]: "Attempted to sign an offchain message with an address that is not a signer for it", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]: "Expected base58-encoded application domain string of length in the range [32, 44]. Actual length: $actualLength.", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]: "The signer addresses in this offchain message envelope do not match the list of required signers in the message preamble. These unexpected signers were present in the envelope: `[$unexpectedSigners]`. These required signers were missing from the envelope `[$missingSigners]`.", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]: "The message body provided has a byte-length of $actualBytes. The maximum allowable byte-length is $maxBytes", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]: "Expected message format $expectedMessageFormat, got $actualMessageFormat", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]: "The message length specified in the message preamble is $specifiedLength bytes. The actual length of the message is $actualLength bytes.", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY]: "Offchain message content must be non-empty", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO]: "Offchain message must specify the address of at least one required signer", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO]: "Offchain message envelope must reserve space for at least one signature", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]: "The offchain message preamble specifies $numRequiredSignatures required signature(s), got $signaturesLength.", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED]: "The signatories of this offchain message must be listed in lexicographical order", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE]: "An address must be listed no more than once among the signatories of an offchain message", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]: "Offchain message is missing signatures for addresses: $addresses.", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE]: "Offchain message signature verification failed. Signature mismatch for required signatories [$signatoriesWithInvalidSignatures]. Missing signatures for signatories [$signatoriesWithMissingSignatures]", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE]: "The message body provided contains characters whose codes fall outside the allowed range. In order to ensure clear-signing compatiblity with hardware wallets, the message may only contain line feeds and characters in the range [\\x20-\\x7e].", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION]: "Expected offchain message version $expectedVersion. Got $actualVersion.", + [SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]: "This version of Kit does not support decoding offchain messages with version $unsupportedVersion. The current max supported version is 0.", + [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]: "The notification name must end in 'Notifications' and the API must supply a subscription plan creator function for the notification '$notificationName'.", + [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED]: "WebSocket was closed before payload could be added to the send buffer", + [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED]: "WebSocket connection closed", + [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT]: "WebSocket failed to connect", + [SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID]: "Failed to obtain a subscription id from the server", + [SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD]: "Could not find an API plan for RPC method: `$method`", + [SOLANA_ERROR__RPC__INTEGER_OVERFLOW]: "The $argumentLabel argument to the `$methodName` RPC method$optionalPathLabel was `$value`. This number is unsafe for use with the Solana JSON-RPC because it exceeds `Number.MAX_SAFE_INTEGER`.", + [SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR]: "HTTP error ($statusCode): $message", + [SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN]: "HTTP header(s) forbidden: $headers. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.", + [SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS]: "Multiple distinct signers were identified for address `$address`. Please ensure that you are using the same signer instance for each address.", + [SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER]: "The provided value does not implement the `KeyPairSigner` interface", + [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER]: "The provided value does not implement the `MessageModifyingSigner` interface", + [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER]: "The provided value does not implement the `MessagePartialSigner` interface", + [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER]: "The provided value does not implement any of the `MessageSigner` interfaces", + [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER]: "The provided value does not implement the `TransactionModifyingSigner` interface", + [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER]: "The provided value does not implement the `TransactionPartialSigner` interface", + [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER]: "The provided value does not implement the `TransactionSendingSigner` interface", + [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER]: "The provided value does not implement any of the `TransactionSigner` interfaces", + [SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS]: "More than one `TransactionSendingSigner` was identified.", + [SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING]: "No `TransactionSendingSigner` was identified. Please provide a valid `TransactionWithSingleSendingSigner` transaction.", + [SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED]: "Wallet account signers do not support signing multiple messages/transactions in a single operation", + [SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY]: "Cannot export a non-extractable key.", + [SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED]: "No digest implementation could be found.", + [SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT]: "Cryptographic operations are only allowed in secure browser contexts. Read more here: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts.", + [SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED]: "This runtime does not support the generation of Ed25519 key pairs.\n\nInstall @solana/webcrypto-ed25519-polyfill and call its `install` function before generating keys in environments that do not support Ed25519.\n\nFor a list of runtimes that currently support Ed25519 operations, visit https://github.com/WICG/webcrypto-secure-curves/issues/20.", + [SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED]: "No signature verification implementation could be found.", + [SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED]: "No key generation implementation could be found.", + [SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED]: "No signing implementation could be found.", + [SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED]: "No key export implementation could be found.", + [SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE]: "Timestamp value must be in the range [-(2n ** 63n), (2n ** 63n) - 1]. `$value` given", + [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]: "Transaction processing left an account with an outstanding borrowed reference", + [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE]: "Account in use", + [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE]: "Account loaded twice", + [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND]: "Attempt to debit an account but found no record of a prior credit.", + [SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND]: "Transaction loads an address table account that doesn't exist", + [SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED]: "This transaction has already been processed", + [SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND]: "Blockhash not found", + [SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP]: "Loader call chain is too deep", + [SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE]: "Transactions are currently disabled due to cluster maintenance", + [SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION]: "Transaction contains a duplicate instruction ($index) that is not allowed", + [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE]: "Insufficient funds for fee", + [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT]: "Transaction results in an account ($accountIndex) with insufficient funds for rent", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE]: "This account may not be used to pay transaction fees", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX]: "Transaction contains an invalid account reference", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA]: "Transaction loads an address table account with invalid data", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX]: "Transaction address table lookup uses an invalid index", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER]: "Transaction loads an address table account with an invalid owner", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT]: "LoadedAccountsDataSizeLimit set for transaction must be greater than 0.", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION]: "This program may not be used for executing instructions", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT]: "Transaction leaves an account with a lower balance than rent-exempt minimum", + [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT]: "Transaction loads a writable account that cannot be written", + [SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED]: "Transaction exceeded max loaded accounts data size cap", + [SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE]: "Transaction requires a fee but has no signature present", + [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND]: "Attempt to load a program that does not exist", + [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED]: "Execution of the program referenced by account at index $accountIndex is temporarily restricted.", + [SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED]: "ResanitizationNeeded", + [SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE]: "Transaction failed to sanitize accounts offsets correctly", + [SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE]: "Transaction did not pass signature verification", + [SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS]: "Transaction locked too many accounts", + [SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION]: "Sum of account balances before and after transaction do not match", + [SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN]: "The transaction failed with the error `$errorName`", + [SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION]: "Transaction version is unsupported", + [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT]: "Transaction would exceed account data limit within the block", + [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT]: "Transaction would exceed total account data limit", + [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT]: "Transaction would exceed max account limit within the block", + [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT]: "Transaction would exceed max Block Cost Limit", + [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT]: "Transaction would exceed max Vote Cost Limit", + [SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION]: "Attempted to sign a transaction with an address that is not a signer for it", + [SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING]: "Transaction is missing an address at index: $index.", + [SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES]: "Transaction has no expected signers therefore it cannot be encoded", + [SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT]: "Transaction size $transactionSize exceeds limit of $transactionSizeLimit bytes", + [SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME]: "Transaction does not have a blockhash lifetime", + [SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME]: "Transaction is not a durable nonce transaction", + [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING]: "Contents of these address lookup tables unknown: $lookupTableAddresses", + [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE]: "Lookup of address at index $highestRequestedIndex failed for lookup table `$lookupTableAddress`. Highest known index is $highestKnownIndex. The lookup table may have been extended since its contents were retrieved", + [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING]: "No fee payer set in CompiledTransaction", + [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND]: "Could not find program address at index $index", + [SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT]: "Failed to estimate the compute unit consumption for this transaction message. This is likely because simulating the transaction failed. Inspect the `cause` property of this error to learn more", + [SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT]: "Transaction failed when it was simulated in order to estimate the compute unit consumption. The compute unit estimate provided is for a transaction that failed when simulated and may not be representative of the compute units this transaction would consume if successful. Inspect the `cause` property of this error to learn more", + [SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING]: "Transaction is missing a fee payer.", + [SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING]: "Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer.", + [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE]: "Transaction first instruction is not advance nonce account instruction.", + [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING]: "Transaction with no instructions cannot be durable nonce transaction.", + [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES]: "This transaction includes an address (`$programAddress`) which is both invoked and set as the fee payer. Program addresses may not pay fees", + [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE]: "This transaction includes an address (`$programAddress`) which is both invoked and marked writable. Program addresses may not be writable", + [SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH]: "The transaction message expected the transaction to have $numRequiredSignatures signatures, got $signaturesLength.", + [SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING]: "Transaction is missing signatures for addresses: $addresses.", + [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE]: "Transaction version must be in the range [0, 127]. `$actualVersion` given", + [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED]: "This version of Kit does not support decoding transactions with version $unsupportedVersion. The current max supported version is 0.", + [SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE]: "The transaction has a durable nonce lifetime (with nonce `$nonce`), but the nonce account address is in a lookup table. The lifetime constraint cannot be constructed without fetching the lookup tables for the transaction." }; - var TernarySearchTree = class { - /** @type {TstNode | null} */ - node = null; - /** - * @param {string} key - * @param {any} value - * @returns {void} - * */ - insert(key, value) { - if (this.node === null) { - this.node = new TstNode(key, value, 0); - } else { - this.node.add(key, value); - } - } + START_INDEX = "i"; + TYPE = "t"; + SolanaError = class extends Error { /** - * @param {Uint8Array} key - * @returns {any} - */ - lookup(key) { - return this.node?.search(key)?.value ?? null; - } - }; - var tree = new TernarySearchTree(); - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; - tree.insert(key, key); - } - module.exports = { - TernarySearchTree, - tree - }; - } -}); - -// node_modules/undici/lib/core/util.js -var require_util = __commonJS({ - "node_modules/undici/lib/core/util.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols(); - var { IncomingMessage } = __require("http"); - var stream = __require("stream"); - var net = __require("net"); - var { stringify: stringify4 } = __require("querystring"); - var { EventEmitter: EE } = __require("events"); - var timers = require_timers(); - var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); - var { headerNameLowerCasedRecord } = require_constants2(); - var { tree } = require_tree(); - var BodyAsyncIterable = class { - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; - } - async *[Symbol.asyncIterator]() { - assert8(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; - } - }; - function noop() { - } - function wrapRequestBody(body) { - if (isStream(body)) { - if (bodyLength(body) === 0) { - body.on("data", function() { - assert8(false); - }); - } - if (typeof body.readableDidRead !== "boolean") { - body[kBodyUsed] = false; - EE.prototype.on.call(body, "data", function() { - this[kBodyUsed] = true; + * Indicates the root cause of this {@link SolanaError}, if any. + * + * For example, a transaction error might have an instruction error as its root cause. In this + * case, you will be able to access the instruction error on the transaction error as `cause`. + */ + cause = this.cause; + /** + * Contains context that can assist in understanding or recovering from a {@link SolanaError}. + */ + context; + constructor(...[code, contextAndErrorOptions]) { + let context; + let errorOptions; + if (contextAndErrorOptions) { + Object.entries(Object.getOwnPropertyDescriptors(contextAndErrorOptions)).forEach(([name, descriptor]) => { + if (name === "cause") { + errorOptions = { cause: descriptor.value }; + } else { + if (context === void 0) { + context = { + __code: code + }; + } + Object.defineProperty(context, name, descriptor); + } }); } - return body; - } else if (body && typeof body.pipeTo === "function") { - return new BodyAsyncIterable(body); - } else if (body && isFormDataLike(body)) { - return body; - } else if (body && typeof body !== "string" && !ArrayBuffer.isView(body) && isIterable(body)) { - return new BodyAsyncIterable(body); - } else { - return body; - } - } - function isStream(obj) { - return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; - } - function isBlobLike(object) { - return object instanceof Blob; - } - function pathHasQueryOrFragment(url) { - return url.includes("?") || url.includes("#"); - } - function serializePathWithQuery(url, queryParams) { - if (pathHasQueryOrFragment(url)) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".'); - } - const stringified = stringify4(queryParams); - if (stringified) { - url += "?" + stringified; - } - return url; - } - function isValidPort(port) { - const value = parseInt(port, 10); - return value === Number(port) && value >= 0 && value <= 65535; - } - function isHttpOrHttpsPrefixed(value) { - return value != null && value[0] === "h" && value[1] === "t" && value[2] === "t" && value[3] === "p" && (value[4] === ":" || value[4] === "s" && value[5] === ":"); - } - function parseURL(url) { - if (typeof url === "string") { - url = new URL(url); - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - return url; - } - if (!url || typeof url !== "object") { - throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); - } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== "" && isValidPort(url.port) === false) { - throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); - } - if (url.path != null && typeof url.path !== "string") { - throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); - } - if (url.pathname != null && typeof url.pathname !== "string") { - throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); - } - if (url.hostname != null && typeof url.hostname !== "string") { - throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); - } - if (url.origin != null && typeof url.origin !== "string") { - throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); - } - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol || ""}//${url.hostname || ""}:${port}`; - let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin[origin.length - 1] === "/") { - origin = origin.slice(0, origin.length - 1); - } - if (path && path[0] !== "/") { - path = `/${path}`; - } - return new URL(`${origin}${path}`); - } - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - return url; - } - function parseOrigin(url) { - url = parseURL(url); - if (url.pathname !== "/" || url.search || url.hash) { - throw new InvalidArgumentError("invalid url"); - } - return url; - } - function getHostname(host) { - if (host[0] === "[") { - const idx2 = host.indexOf("]"); - assert8(idx2 !== -1); - return host.substring(1, idx2); - } - const idx = host.indexOf(":"); - if (idx === -1) return host; - return host.substring(0, idx); - } - function getServerName(host) { - if (!host) { - return null; - } - assert8(typeof host === "string"); - const servername = getHostname(host); - if (net.isIP(servername)) { - return ""; + const message = getErrorMessage(code, context); + super(message, errorOptions); + this.context = Object.freeze( + context === void 0 ? { + __code: code + } : context + ); + this.name = "SolanaError"; } - return servername; - } - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); + }; + ORDERED_ERROR_NAMES = [ + // Keep synced with RPC source: https://github.com/anza-xyz/solana-sdk/blob/master/instruction-error/src/lib.rs + // If this list ever gets too large, consider implementing a compression strategy like this: + // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47 + "GenericError", + "InvalidArgument", + "InvalidInstructionData", + "InvalidAccountData", + "AccountDataTooSmall", + "InsufficientFunds", + "IncorrectProgramId", + "MissingRequiredSignature", + "AccountAlreadyInitialized", + "UninitializedAccount", + "UnbalancedInstruction", + "ModifiedProgramId", + "ExternalAccountLamportSpend", + "ExternalAccountDataModified", + "ReadonlyLamportChange", + "ReadonlyDataModified", + "DuplicateAccountIndex", + "ExecutableModified", + "RentEpochModified", + "NotEnoughAccountKeys", + "AccountDataSizeChanged", + "AccountNotExecutable", + "AccountBorrowFailed", + "AccountBorrowOutstanding", + "DuplicateAccountOutOfSync", + "Custom", + "InvalidError", + "ExecutableDataModified", + "ExecutableLamportChange", + "ExecutableAccountNotRentExempt", + "UnsupportedProgramId", + "CallDepth", + "MissingAccount", + "ReentrancyNotAllowed", + "MaxSeedLengthExceeded", + "InvalidSeeds", + "InvalidRealloc", + "ComputationalBudgetExceeded", + "PrivilegeEscalation", + "ProgramEnvironmentSetupFailure", + "ProgramFailedToComplete", + "ProgramFailedToCompile", + "Immutable", + "IncorrectAuthority", + "BorshIoError", + "AccountNotRentExempt", + "InvalidAccountOwner", + "ArithmeticOverflow", + "UnsupportedSysvar", + "IllegalOwner", + "MaxAccountsDataAllocationsExceeded", + "MaxAccountsExceeded", + "MaxInstructionTraceLengthExceeded", + "BuiltinProgramsMustConsumeComputeUnits" + ]; + ORDERED_ERROR_NAMES2 = [ + // Keep synced with RPC source: https://github.com/anza-xyz/agave/blob/master/sdk/src/transaction/error.rs + // If this list ever gets too large, consider implementing a compression strategy like this: + // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47 + "AccountInUse", + "AccountLoadedTwice", + "AccountNotFound", + "ProgramAccountNotFound", + "InsufficientFundsForFee", + "InvalidAccountForFee", + "AlreadyProcessed", + "BlockhashNotFound", + // `InstructionError` intentionally omitted; delegated to `getSolanaErrorFromInstructionError` + "CallChainTooDeep", + "MissingSignatureForFee", + "InvalidAccountIndex", + "SignatureFailure", + "InvalidProgramForExecution", + "SanitizeFailure", + "ClusterMaintenance", + "AccountBorrowOutstanding", + "WouldExceedMaxBlockCostLimit", + "UnsupportedVersion", + "InvalidWritableAccount", + "WouldExceedMaxAccountCostLimit", + "WouldExceedAccountDataBlockLimit", + "TooManyAccountLocks", + "AddressLookupTableNotFound", + "InvalidAddressLookupTableOwner", + "InvalidAddressLookupTableData", + "InvalidAddressLookupTableIndex", + "InvalidRentPayingAccount", + "WouldExceedMaxVoteCostLimit", + "WouldExceedAccountDataTotalLimit", + "DuplicateInstruction", + "InsufficientFundsForRent", + "MaxLoadedAccountsDataSizeExceeded", + "InvalidLoadedAccountsDataSizeLimit", + "ResanitizationNeeded", + "ProgramExecutionTemporarilyRestricted", + "UnbalancedTransaction" + ]; + } +}); + +// node_modules/@solana/codecs-core/dist/index.node.mjs +function padBytes2(bytes, length) { + if (bytes.length >= length) return bytes; + const paddedBytes = new Uint8Array(length).fill(0); + paddedBytes.set(bytes); + return paddedBytes; +} +function containsBytes(data, bytes, offset) { + const slice4 = offset === 0 && data.length === bytes.length ? data : data.slice(offset, offset + bytes.length); + return bytesEqual(slice4, bytes); +} +function bytesEqual(bytes1, bytes2) { + return bytes1.length === bytes2.length && bytes1.every((value, index2) => value === bytes2[index2]); +} +function getEncodedSize(value, encoder5) { + return "fixedSize" in encoder5 ? encoder5.fixedSize : encoder5.getSizeFromValue(value); +} +function createEncoder(encoder5) { + return Object.freeze({ + ...encoder5, + encode: (value) => { + const bytes = new Uint8Array(getEncodedSize(value, encoder5)); + encoder5.write(value, bytes, 0); + return bytes; } - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + }); +} +function createDecoder(decoder2) { + return Object.freeze({ + ...decoder2, + decode: (bytes, offset = 0) => decoder2.read(bytes, offset)[0] + }); +} +function createCodec(codec) { + return Object.freeze({ + ...codec, + decode: (bytes, offset = 0) => codec.read(bytes, offset)[0], + encode: (value) => { + const bytes = new Uint8Array(getEncodedSize(value, codec)); + codec.write(value, bytes, 0); + return bytes; } - function hasSafeIterator(obj) { - const prototype = Object.getPrototypeOf(obj); - const ownIterator = Object.hasOwn(obj, Symbol.iterator); - return ownIterator || prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === "function"; + }); +} +function isFixedSize(codec) { + return "fixedSize" in codec && typeof codec.fixedSize === "number"; +} +function assertIsFixedSize(codec) { + if (!isFixedSize(codec)) { + throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH); + } +} +function isVariableSize(codec) { + return !isFixedSize(codec); +} +function assertIsVariableSize(codec) { + if (!isVariableSize(codec)) { + throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH); + } +} +function combineCodec(encoder5, decoder2) { + if (isFixedSize(encoder5) !== isFixedSize(decoder2)) { + throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH); + } + if (isFixedSize(encoder5) && isFixedSize(decoder2) && encoder5.fixedSize !== decoder2.fixedSize) { + throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, { + decoderFixedSize: decoder2.fixedSize, + encoderFixedSize: encoder5.fixedSize + }); + } + if (!isFixedSize(encoder5) && !isFixedSize(decoder2) && encoder5.maxSize !== decoder2.maxSize) { + throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, { + decoderMaxSize: decoder2.maxSize, + encoderMaxSize: encoder5.maxSize + }); + } + return { + ...decoder2, + ...encoder5, + decode: decoder2.decode, + encode: encoder5.encode, + read: decoder2.read, + write: encoder5.write + }; +} +function addEncoderSentinel(encoder5, sentinel) { + const write = ((value, bytes, offset) => { + const encoderBytes = encoder5.encode(value); + if (findSentinelIndex(encoderBytes, sentinel) >= 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, { + encodedBytes: encoderBytes, + hexEncodedBytes: hexBytes(encoderBytes), + hexSentinel: hexBytes(sentinel), + sentinel + }); } - function bodyLength(body) { - if (body == null) { - return 0; - } else if (isStream(body)) { - const state = body._readableState; - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null; - } else if (isBuffer(body)) { - return body.byteLength; - } - return null; + bytes.set(encoderBytes, offset); + offset += encoderBytes.length; + bytes.set(sentinel, offset); + offset += sentinel.length; + return offset; + }); + if (isFixedSize(encoder5)) { + return createEncoder({ ...encoder5, fixedSize: encoder5.fixedSize + sentinel.length, write }); + } + return createEncoder({ + ...encoder5, + ...encoder5.maxSize != null ? { maxSize: encoder5.maxSize + sentinel.length } : {}, + getSizeFromValue: (value) => encoder5.getSizeFromValue(value) + sentinel.length, + write + }); +} +function addDecoderSentinel(decoder2, sentinel) { + const read = ((bytes, offset) => { + const candidateBytes = offset === 0 ? bytes : bytes.slice(offset); + const sentinelIndex = findSentinelIndex(candidateBytes, sentinel); + if (sentinelIndex === -1) { + throw new SolanaError(SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, { + decodedBytes: candidateBytes, + hexDecodedBytes: hexBytes(candidateBytes), + hexSentinel: hexBytes(sentinel), + sentinel + }); } - function isDestroyed(body) { - return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body)); + const preSentinelBytes = candidateBytes.slice(0, sentinelIndex); + return [decoder2.decode(preSentinelBytes), offset + preSentinelBytes.length + sentinel.length]; + }); + if (isFixedSize(decoder2)) { + return createDecoder({ ...decoder2, fixedSize: decoder2.fixedSize + sentinel.length, read }); + } + return createDecoder({ + ...decoder2, + ...decoder2.maxSize != null ? { maxSize: decoder2.maxSize + sentinel.length } : {}, + read + }); +} +function addCodecSentinel(codec, sentinel) { + return combineCodec(addEncoderSentinel(codec, sentinel), addDecoderSentinel(codec, sentinel)); +} +function findSentinelIndex(bytes, sentinel) { + return bytes.findIndex((byte, index2, arr) => { + if (sentinel.length === 1) return byte === sentinel[0]; + return containsBytes(arr, sentinel, index2); + }); +} +function hexBytes(bytes) { + return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); +} +function assertByteArrayIsNotEmptyForCodec(codecDescription, bytes, offset = 0) { + if (bytes.length - offset <= 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, { + codecDescription + }); + } +} +function assertByteArrayHasEnoughBytesForCodec(codecDescription, expected, bytes, offset = 0) { + const bytesLength = bytes.length - offset; + if (bytesLength < expected) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, { + bytesLength, + codecDescription, + expected + }); + } +} +function assertByteArrayOffsetIsNotOutOfRange(codecDescription, offset, bytesLength) { + if (offset < 0 || offset > bytesLength) { + throw new SolanaError(SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, { + bytesLength, + codecDescription, + offset + }); + } +} +function addEncoderSizePrefix(encoder5, prefix) { + const write = ((value, bytes, offset) => { + const encoderBytes = encoder5.encode(value); + offset = prefix.write(encoderBytes.length, bytes, offset); + bytes.set(encoderBytes, offset); + return offset + encoderBytes.length; + }); + if (isFixedSize(prefix) && isFixedSize(encoder5)) { + return createEncoder({ ...encoder5, fixedSize: prefix.fixedSize + encoder5.fixedSize, write }); + } + const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : prefix.maxSize ?? null; + const encoderMaxSize = isFixedSize(encoder5) ? encoder5.fixedSize : encoder5.maxSize ?? null; + const maxSize = prefixMaxSize !== null && encoderMaxSize !== null ? prefixMaxSize + encoderMaxSize : null; + return createEncoder({ + ...encoder5, + ...maxSize !== null ? { maxSize } : {}, + getSizeFromValue: (value) => { + const encoderSize = getEncodedSize(value, encoder5); + return getEncodedSize(encoderSize, prefix) + encoderSize; + }, + write + }); +} +function addDecoderSizePrefix(decoder2, prefix) { + const read = ((bytes, offset) => { + const [bigintSize, decoderOffset] = prefix.read(bytes, offset); + const size5 = Number(bigintSize); + offset = decoderOffset; + if (offset > 0 || bytes.length > size5) { + bytes = bytes.slice(offset, offset + size5); } - function destroy(stream2, err) { - if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { - return; - } - if (typeof stream2.destroy === "function") { - if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { - stream2.socket = null; - } - stream2.destroy(err); - } else if (err) { - queueMicrotask(() => { - stream2.emit("error", err); + assertByteArrayHasEnoughBytesForCodec("addDecoderSizePrefix", size5, bytes); + return [decoder2.decode(bytes), offset + size5]; + }); + if (isFixedSize(prefix) && isFixedSize(decoder2)) { + return createDecoder({ ...decoder2, fixedSize: prefix.fixedSize + decoder2.fixedSize, read }); + } + const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : prefix.maxSize ?? null; + const decoderMaxSize = isFixedSize(decoder2) ? decoder2.fixedSize : decoder2.maxSize ?? null; + const maxSize = prefixMaxSize !== null && decoderMaxSize !== null ? prefixMaxSize + decoderMaxSize : null; + return createDecoder({ ...decoder2, ...maxSize !== null ? { maxSize } : {}, read }); +} +function addCodecSizePrefix(codec, prefix) { + return combineCodec(addEncoderSizePrefix(codec, prefix), addDecoderSizePrefix(codec, prefix)); +} +function toArrayBuffer(bytes, offset, length) { + const bytesOffset = bytes.byteOffset + (offset ?? 0); + const bytesLength = length ?? bytes.byteLength; + let buffer2; + if (typeof SharedArrayBuffer === "undefined") { + buffer2 = bytes.buffer; + } else if (bytes.buffer instanceof SharedArrayBuffer) { + buffer2 = new ArrayBuffer(bytes.length); + new Uint8Array(buffer2).set(new Uint8Array(bytes)); + } else { + buffer2 = bytes.buffer; + } + return (bytesOffset === 0 || bytesOffset === -bytes.byteLength) && bytesLength === bytes.byteLength ? buffer2 : buffer2.slice(bytesOffset, bytesOffset + bytesLength); +} +function createDecoderThatConsumesEntireByteArray(decoder2) { + return createDecoder({ + ...decoder2, + read(bytes, offset) { + const [value, newOffset] = decoder2.read(bytes, offset); + if (bytes.length > newOffset) { + throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, { + expectedLength: newOffset, + numExcessBytes: bytes.length - newOffset }); } - if (stream2.destroyed !== true) { - stream2[kDestroyed] = true; + return [value, newOffset]; + } + }); +} +function fixEncoderSize(encoder5, fixedBytes) { + return createEncoder({ + fixedSize: fixedBytes, + write: (value, bytes, offset) => { + const variableByteArray = encoder5.encode(value); + const fixedByteArray = variableByteArray.length > fixedBytes ? variableByteArray.slice(0, fixedBytes) : variableByteArray; + bytes.set(fixedByteArray, offset); + return offset + fixedBytes; + } + }); +} +function fixDecoderSize(decoder2, fixedBytes) { + return createDecoder({ + fixedSize: fixedBytes, + read: (bytes, offset) => { + assertByteArrayHasEnoughBytesForCodec("fixCodecSize", fixedBytes, bytes, offset); + if (offset > 0 || bytes.length > fixedBytes) { + bytes = bytes.slice(offset, offset + fixedBytes); + } + if (isFixedSize(decoder2)) { + bytes = fixBytes(bytes, decoder2.fixedSize); } + const [value] = decoder2.read(bytes, 0); + return [value, offset + fixedBytes]; } - var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; - function parseKeepAliveTimeout(val) { - const m = val.match(KEEPALIVE_TIMEOUT_EXPR); - return m ? parseInt(m[1], 10) * 1e3 : null; + }); +} +function fixCodecSize(codec, fixedBytes) { + return combineCodec(fixEncoderSize(codec, fixedBytes), fixDecoderSize(codec, fixedBytes)); +} +function offsetEncoder(encoder5, config) { + return createEncoder({ + ...encoder5, + write: (value, bytes, preOffset) => { + const wrapBytes = (offset) => modulo(offset, bytes.length); + const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset; + assertByteArrayOffsetIsNotOutOfRange("offsetEncoder", newPreOffset, bytes.length); + const postOffset = encoder5.write(value, bytes, newPreOffset); + const newPostOffset = config.postOffset ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes }) : postOffset; + assertByteArrayOffsetIsNotOutOfRange("offsetEncoder", newPostOffset, bytes.length); + return newPostOffset; } - function headerNameToString(value) { - return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + }); +} +function offsetDecoder(decoder2, config) { + return createDecoder({ + ...decoder2, + read: (bytes, preOffset) => { + const wrapBytes = (offset) => modulo(offset, bytes.length); + const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset; + assertByteArrayOffsetIsNotOutOfRange("offsetDecoder", newPreOffset, bytes.length); + const [value, postOffset] = decoder2.read(bytes, newPreOffset); + const newPostOffset = config.postOffset ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes }) : postOffset; + assertByteArrayOffsetIsNotOutOfRange("offsetDecoder", newPostOffset, bytes.length); + return [value, newPostOffset]; } - function bufferToLowerCasedHeaderName(value) { - return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + }); +} +function offsetCodec(codec, config) { + return combineCodec(offsetEncoder(codec, config), offsetDecoder(codec, config)); +} +function modulo(dividend, divisor) { + if (divisor === 0) return 0; + return (dividend % divisor + divisor) % divisor; +} +function resizeEncoder(encoder5, resize) { + if (isFixedSize(encoder5)) { + const fixedSize = resize(encoder5.fixedSize); + if (fixedSize < 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, { + bytesLength: fixedSize, + codecDescription: "resizeEncoder" + }); } - function parseHeaders(headers, obj) { - if (obj === void 0) obj = {}; - for (let i = 0; i < headers.length; i += 2) { - const key = headerNameToString(headers[i]); - let val = obj[key]; - if (val !== void 0) { - if (!Object.hasOwn(obj, key)) { - const headersValue = typeof headers[i + 1] === "string" ? headers[i + 1] : Array.isArray(headers[i + 1]) ? headers[i + 1].map((x) => x.toString("latin1")) : headers[i + 1].toString("latin1"); - if (key === "__proto__") { - Object.defineProperty(obj, key, { - value: headersValue, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = headersValue; - } - } else { - if (typeof val === "string") { - val = [val]; - obj[key] = val; - } - val.push(headers[i + 1].toString("latin1")); - } - } else { - const headersValue = typeof headers[i + 1] === "string" ? headers[i + 1] : Array.isArray(headers[i + 1]) ? headers[i + 1].map((x) => x.toString("latin1")) : headers[i + 1].toString("latin1"); - obj[key] = headersValue; - } + return createEncoder({ ...encoder5, fixedSize }); + } + return createEncoder({ + ...encoder5, + getSizeFromValue: (value) => { + const newSize = resize(encoder5.getSizeFromValue(value)); + if (newSize < 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, { + bytesLength: newSize, + codecDescription: "resizeEncoder" + }); } - return obj; + return newSize; } - function parseRawHeaders(headers) { - const headersLength = headers.length; - const ret = new Array(headersLength); - let key; - let val; - for (let n = 0; n < headersLength; n += 2) { - key = headers[n]; - val = headers[n + 1]; - typeof key !== "string" && (key = key.toString()); - typeof val !== "string" && (val = val.toString("latin1")); - ret[n] = key; - ret[n + 1] = val; - } - return ret; + }); +} +function resizeDecoder(decoder2, resize) { + if (isFixedSize(decoder2)) { + const fixedSize = resize(decoder2.fixedSize); + if (fixedSize < 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, { + bytesLength: fixedSize, + codecDescription: "resizeDecoder" + }); } - function toRawHeaders(headers) { - const rawHeaders = []; - for (const [name, value] of Object.entries(headers)) { - if (Array.isArray(value)) { - for (const entry of value) { - rawHeaders.push(Buffer.from(name, "latin1"), Buffer.from(`${entry}`, "latin1")); - } - } else { - rawHeaders.push(Buffer.from(name, "latin1"), Buffer.from(`${value}`, "latin1")); - } - } - return rawHeaders; + return createDecoder({ ...decoder2, fixedSize }); + } + return decoder2; +} +function resizeCodec(codec, resize) { + return combineCodec(resizeEncoder(codec, resize), resizeDecoder(codec, resize)); +} +function padLeftEncoder(encoder5, offset) { + return offsetEncoder( + resizeEncoder(encoder5, (size5) => size5 + offset), + { preOffset: ({ preOffset }) => preOffset + offset } + ); +} +function padRightEncoder(encoder5, offset) { + return offsetEncoder( + resizeEncoder(encoder5, (size5) => size5 + offset), + { postOffset: ({ postOffset }) => postOffset + offset } + ); +} +function padLeftDecoder(decoder2, offset) { + return offsetDecoder( + resizeDecoder(decoder2, (size5) => size5 + offset), + { preOffset: ({ preOffset }) => preOffset + offset } + ); +} +function padRightDecoder(decoder2, offset) { + return offsetDecoder( + resizeDecoder(decoder2, (size5) => size5 + offset), + { postOffset: ({ postOffset }) => postOffset + offset } + ); +} +function padLeftCodec(codec, offset) { + return combineCodec(padLeftEncoder(codec, offset), padLeftDecoder(codec, offset)); +} +function padRightCodec(codec, offset) { + return combineCodec(padRightEncoder(codec, offset), padRightDecoder(codec, offset)); +} +function copySourceToTargetInReverse(source, target_WILL_MUTATE, sourceOffset, sourceLength, targetOffset = 0) { + while (sourceOffset < --sourceLength) { + const leftValue = source[sourceOffset]; + target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceLength]; + target_WILL_MUTATE[sourceLength + targetOffset] = leftValue; + sourceOffset++; + } + if (sourceOffset === sourceLength) { + target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceOffset]; + } +} +function reverseEncoder(encoder5) { + assertIsFixedSize(encoder5); + return createEncoder({ + ...encoder5, + write: (value, bytes, offset) => { + const newOffset = encoder5.write(value, bytes, offset); + copySourceToTargetInReverse( + bytes, + bytes, + offset, + offset + encoder5.fixedSize + ); + return newOffset; } - function encodeRawHeaders(headers) { - if (!Array.isArray(headers)) { - throw new TypeError("expected headers to be an array"); - } - return headers.map((x) => Buffer.from(x)); + }); +} +function reverseDecoder(decoder2) { + assertIsFixedSize(decoder2); + return createDecoder({ + ...decoder2, + read: (bytes, offset) => { + const reversedBytes = bytes.slice(); + copySourceToTargetInReverse( + bytes, + reversedBytes, + offset, + offset + decoder2.fixedSize + ); + return decoder2.read(reversedBytes, offset); } - function isBuffer(buffer2) { - return buffer2 instanceof Uint8Array || Buffer.isBuffer(buffer2); + }); +} +function reverseCodec(codec) { + return combineCodec(reverseEncoder(codec), reverseDecoder(codec)); +} +function transformEncoder(encoder5, unmap) { + return createEncoder({ + ...isVariableSize(encoder5) ? { ...encoder5, getSizeFromValue: (value) => encoder5.getSizeFromValue(unmap(value)) } : encoder5, + write: (value, bytes, offset) => encoder5.write(unmap(value), bytes, offset) + }); +} +function transformDecoder(decoder2, map) { + return createDecoder({ + ...decoder2, + read: (bytes, offset) => { + const [value, newOffset] = decoder2.read(bytes, offset); + return [map(value, bytes, offset), newOffset]; } - function assertRequestHandler(handler, method, upgrade) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - if (typeof handler.onRequestStart !== "function") { - throw new InvalidArgumentError("invalid onRequestStart method"); - } - if (typeof handler.onResponseError !== "function") { - throw new InvalidArgumentError("invalid onResponseError method"); - } - if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) { - throw new InvalidArgumentError("invalid onBodySent method"); + }); +} +function transformCodec(codec, unmap, map) { + return createCodec({ + ...transformEncoder(codec, unmap), + read: map ? transformDecoder(codec, map).read : codec.read + }); +} +var mergeBytes, fixBytes; +var init_index_node2 = __esm({ + "node_modules/@solana/codecs-core/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + mergeBytes = (byteArrays) => { + const nonEmptyByteArrays = byteArrays.filter((arr) => arr.length); + if (nonEmptyByteArrays.length === 0) { + return byteArrays.length ? byteArrays[0] : new Uint8Array(); } - if (typeof handler.onRequestSent !== "function" && handler.onRequestSent !== void 0) { - throw new InvalidArgumentError("invalid onRequestSent method"); + if (nonEmptyByteArrays.length === 1) { + return nonEmptyByteArrays[0]; } - if (upgrade || method === "CONNECT") { - if (typeof handler.onRequestUpgrade !== "function") { - throw new InvalidArgumentError("invalid onRequestUpgrade method"); + const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0); + const result = new Uint8Array(totalLength); + let offset = 0; + nonEmptyByteArrays.forEach((arr) => { + result.set(arr, offset); + offset += arr.length; + }); + return result; + }; + fixBytes = (bytes, length) => padBytes2(bytes.length <= length ? bytes : bytes.slice(0, length), length); + } +}); + +// node_modules/@solana/codecs-strings/dist/index.node.mjs +function assertValidBaseString(alphabet4, testValue, givenValue = testValue) { + if (!testValue.match(new RegExp(`^[${alphabet4}]*$`))) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { + alphabet: alphabet4, + base: alphabet4.length, + value: givenValue + }); + } +} +function partitionLeadingZeroes(value, zeroCharacter) { + const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`)); + return [leadingZeros, tailChars]; +} +function getBigIntFromBaseX(value, alphabet4) { + const base2 = BigInt(alphabet4.length); + let sum = 0n; + for (const char of value) { + sum *= base2; + sum += BigInt(alphabet4.indexOf(char)); + } + return sum; +} +function getBaseXFromBigInt(value, alphabet4) { + const base2 = BigInt(alphabet4.length); + const tailChars = []; + while (value > 0n) { + tailChars.unshift(alphabet4[Number(value % base2)]); + value /= base2; + } + return tailChars.join(""); +} +function charCodeToBase163(char) { + if (char >= 48 && char <= 57) return char - 48; + if (char >= 65 && char <= 70) return char - (65 - 10); + if (char >= 97 && char <= 102) return char - (97 - 10); +} +function reslice(input, inputBits, outputBits, useRemainder) { + const output = []; + let accumulator = 0; + let bitsInAccumulator = 0; + const mask = (1 << outputBits) - 1; + for (const value of input) { + accumulator = accumulator << inputBits | value; + bitsInAccumulator += inputBits; + while (bitsInAccumulator >= outputBits) { + bitsInAccumulator -= outputBits; + output.push(accumulator >> bitsInAccumulator & mask); + } + } + if (useRemainder && bitsInAccumulator > 0) { + output.push(accumulator << outputBits - bitsInAccumulator & mask); + } + return output; +} +var getBaseXEncoder, getBaseXDecoder, getBaseXCodec, alphabet3, getBase10Encoder, getBase10Decoder, getBase10Codec, INVALID_STRING_ERROR_BASE_CONFIG, getBase16Encoder, getBase16Decoder, getBase16Codec, alphabet22, getBase58Encoder, getBase58Decoder, getBase58Codec, getBaseXResliceEncoder, getBaseXResliceDecoder, getBaseXResliceCodec, alphabet32, getBase64Encoder, getBase64Decoder, getBase64Codec, removeNullCharacters, padNullCharacters, e, o, getUtf8Encoder, getUtf8Decoder, getUtf8Codec; +var init_index_node3 = __esm({ + "node_modules/@solana/codecs-strings/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node2(); + getBaseXEncoder = (alphabet4) => { + return createEncoder({ + getSizeFromValue: (value) => { + const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet4[0]); + if (!tailChars) return value.length; + const base10Number = getBigIntFromBaseX(tailChars, alphabet4); + return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2); + }, + write(value, bytes, offset) { + assertValidBaseString(alphabet4, value); + if (value === "") return offset; + const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet4[0]); + if (!tailChars) { + bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset); + return offset + leadingZeroes.length; + } + let base10Number = getBigIntFromBaseX(tailChars, alphabet4); + const tailBytes = []; + while (base10Number > 0n) { + tailBytes.unshift(Number(base10Number % 256n)); + base10Number /= 256n; + } + const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes]; + bytes.set(bytesToAdd, offset); + return offset + bytesToAdd.length; } - } else { - if (typeof handler.onResponseStart !== "function") { - throw new InvalidArgumentError("invalid onResponseStart method"); + }); + }; + getBaseXDecoder = (alphabet4) => { + return createDecoder({ + read(rawBytes, offset) { + const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset); + if (bytes.length === 0) return ["", 0]; + let trailIndex = bytes.findIndex((n) => n !== 0); + trailIndex = trailIndex === -1 ? bytes.length : trailIndex; + const leadingZeroes = alphabet4[0].repeat(trailIndex); + if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length]; + const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n); + const tailChars = getBaseXFromBigInt(base10Number, alphabet4); + return [leadingZeroes + tailChars, rawBytes.length]; } - if (typeof handler.onResponseData !== "function") { - throw new InvalidArgumentError("invalid onResponseData method"); + }); + }; + getBaseXCodec = (alphabet4) => combineCodec(getBaseXEncoder(alphabet4), getBaseXDecoder(alphabet4)); + alphabet3 = "0123456789"; + getBase10Encoder = () => getBaseXEncoder(alphabet3); + getBase10Decoder = () => getBaseXDecoder(alphabet3); + getBase10Codec = () => getBaseXCodec(alphabet3); + INVALID_STRING_ERROR_BASE_CONFIG = { + alphabet: "0123456789abcdef", + base: 16 + }; + getBase16Encoder = () => createEncoder({ + getSizeFromValue: (value) => Math.ceil(value.length / 2), + write(value, bytes, offset) { + const len = value.length; + const al = len / 2; + if (len === 1) { + const c2 = value.charCodeAt(0); + const n = charCodeToBase163(c2); + if (n === void 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { + ...INVALID_STRING_ERROR_BASE_CONFIG, + value + }); + } + bytes.set([n], offset); + return 1 + offset; } - if (typeof handler.onResponseEnd !== "function") { - throw new InvalidArgumentError("invalid onResponseEnd method"); + const hexBytes2 = new Uint8Array(al); + for (let i = 0, j = 0; i < al; i++) { + const c1 = value.charCodeAt(j++); + const c2 = value.charCodeAt(j++); + const n1 = charCodeToBase163(c1); + const n2 = charCodeToBase163(c2); + if (n1 === void 0 || n2 === void 0 && !Number.isNaN(c2)) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { + ...INVALID_STRING_ERROR_BASE_CONFIG, + value + }); + } + hexBytes2[i] = !Number.isNaN(c2) ? n1 << 4 | (n2 ?? 0) : n1; } + bytes.set(hexBytes2, offset); + return hexBytes2.length + offset; + } + }); + getBase16Decoder = () => createDecoder({ + read(bytes, offset) { + const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); + return [value, bytes.length]; + } + }); + getBase16Codec = () => combineCodec(getBase16Encoder(), getBase16Decoder()); + alphabet22 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + getBase58Encoder = () => getBaseXEncoder(alphabet22); + getBase58Decoder = () => getBaseXDecoder(alphabet22); + getBase58Codec = () => getBaseXCodec(alphabet22); + getBaseXResliceEncoder = (alphabet4, bits) => createEncoder({ + getSizeFromValue: (value) => Math.floor(value.length * bits / 8), + write(value, bytes, offset) { + assertValidBaseString(alphabet4, value); + if (value === "") return offset; + const charIndices = [...value].map((c2) => alphabet4.indexOf(c2)); + const reslicedBytes = reslice(charIndices, bits, 8, false); + bytes.set(reslicedBytes, offset); + return reslicedBytes.length + offset; + } + }); + getBaseXResliceDecoder = (alphabet4, bits) => createDecoder({ + read(rawBytes, offset = 0) { + const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset); + if (bytes.length === 0) return ["", rawBytes.length]; + const charIndices = reslice([...bytes], 8, bits, true); + return [charIndices.map((i) => alphabet4[i]).join(""), rawBytes.length]; + } + }); + getBaseXResliceCodec = (alphabet4, bits) => combineCodec(getBaseXResliceEncoder(alphabet4, bits), getBaseXResliceDecoder(alphabet4, bits)); + alphabet32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + getBase64Encoder = () => { + { + return createEncoder({ + getSizeFromValue: (value) => Buffer.from(value, "base64").length, + write(value, bytes, offset) { + assertValidBaseString(alphabet32, value.replace(/=/g, "")); + const buffer2 = Buffer.from(value, "base64"); + bytes.set(buffer2, offset); + return buffer2.length + offset; + } + }); } - } - function isDisturbed(body) { - return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])); - } - function getSocketInfo(socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - }; - } - function ReadableStreamFrom(iterable) { - let iterator; - return new ReadableStream( - { - start() { - iterator = iterable[Symbol.asyncIterator](); - }, - pull(controller) { - return iterator.next().then(({ done, value }) => { - if (done) { - return queueMicrotask(() => { - controller.close(); - controller.byobRequest?.respond(0); - }); - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - if (buf.byteLength) { - return controller.enqueue(new Uint8Array(buf)); - } else { - return this.pull(controller); - } - } - }); - }, - cancel() { - return iterator.return(); - }, - type: "bytes" - } - ); - } - function isFormDataLike(object) { - return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; - } - function addAbortListener(signal, listener) { - if ("addEventListener" in signal) { - signal.addEventListener("abort", listener, { once: true }); - return () => signal.removeEventListener("abort", listener); + }; + getBase64Decoder = () => { + { + return createDecoder({ + read: (bytes, offset = 0) => [Buffer.from(toArrayBuffer(bytes), offset).toString("base64"), bytes.length] + }); } - signal.once("abort", listener); - return () => signal.removeListener("abort", listener); + }; + getBase64Codec = () => combineCodec(getBase64Encoder(), getBase64Decoder()); + removeNullCharacters = (value) => ( + // eslint-disable-next-line no-control-regex + value.replace(/\u0000/g, "") + ); + padNullCharacters = (value, chars) => value.padEnd(chars, "\0"); + e = globalThis.TextDecoder; + o = globalThis.TextEncoder; + getUtf8Encoder = () => { + let textEncoder; + return createEncoder({ + getSizeFromValue: (value) => (textEncoder ||= new o()).encode(value).length, + write: (value, bytes, offset) => { + const bytesToAdd = (textEncoder ||= new o()).encode(value); + bytes.set(bytesToAdd, offset); + return offset + bytesToAdd.length; + } + }); + }; + getUtf8Decoder = () => { + let textDecoder; + return createDecoder({ + read(bytes, offset) { + const value = (textDecoder ||= new e()).decode(bytes.slice(offset)); + return [removeNullCharacters(value), bytes.length]; + } + }); + }; + getUtf8Codec = () => combineCodec(getUtf8Encoder(), getUtf8Decoder()); + } +}); + +// node_modules/@solana/accounts/dist/index.node.mjs +function decodeAccount(encodedAccount, decoder2) { + try { + if ("exists" in encodedAccount && !encodedAccount.exists) { + return encodedAccount; } - var validTokenChars = new Uint8Array([ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 0-15 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 16-31 - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 0, - // 32-47 (!"#$%&'()*+,-./) - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - // 48-63 (0-9:;<=>?) - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - // 64-79 (@A-O) - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - // 80-95 (P-Z[\]^_) - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - // 96-111 (`a-o) - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 0, - 1, - 0, - // 112-127 (p-z{|}~) - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 128-143 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 144-159 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 160-175 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 176-191 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 192-207 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 208-223 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - // 224-239 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - // 240-255 - ]); - function isTokenCharCode(c2) { - return validTokenChars[c2] === 1; + return Object.freeze({ ...encodedAccount, data: decoder2.decode(encodedAccount.data) }); + } catch { + throw new SolanaError(SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, { + address: encodedAccount.address + }); + } +} +function accountExists(account) { + return !("exists" in account) || "exists" in account && account.exists; +} +function assertAccountDecoded(account) { + if (accountExists(account) && account.data instanceof Uint8Array) { + throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, { + address: account.address + }); + } +} +function assertAccountsDecoded(accounts) { + const encoded = accounts.filter((a) => accountExists(a) && a.data instanceof Uint8Array); + if (encoded.length > 0) { + const encodedAddresses = encoded.map((a) => a.address); + throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, { + addresses: encodedAddresses + }); + } +} +function parseBase64RpcAccount(address2, rpcAccount) { + if (!rpcAccount) return Object.freeze({ address: address2, exists: false }); + const data = getBase64Encoder().encode(rpcAccount.data[0]); + return Object.freeze({ ...parseBaseAccount(rpcAccount), address: address2, data, exists: true }); +} +function parseBase58RpcAccount(address2, rpcAccount) { + if (!rpcAccount) return Object.freeze({ address: address2, exists: false }); + const data = getBase58Encoder().encode(typeof rpcAccount.data === "string" ? rpcAccount.data : rpcAccount.data[0]); + return Object.freeze({ ...parseBaseAccount(rpcAccount), address: address2, data, exists: true }); +} +function parseJsonRpcAccount(address2, rpcAccount) { + if (!rpcAccount) return Object.freeze({ address: address2, exists: false }); + const data = rpcAccount.data.parsed.info || {}; + if (rpcAccount.data.program || rpcAccount.data.parsed.type) { + data.parsedAccountMeta = { + program: rpcAccount.data.program, + type: rpcAccount.data.parsed.type + }; + } + return Object.freeze({ ...parseBaseAccount(rpcAccount), address: address2, data, exists: true }); +} +function parseBaseAccount(rpcAccount) { + return Object.freeze({ + executable: rpcAccount.executable, + lamports: rpcAccount.lamports, + programAddress: rpcAccount.owner, + space: rpcAccount.space + }); +} +async function fetchEncodedAccount(rpc, address2, config = {}) { + const { abortSignal, ...rpcConfig } = config; + const response = await rpc.getAccountInfo(address2, { ...rpcConfig, encoding: "base64" }).send({ abortSignal }); + return parseBase64RpcAccount(address2, response.value); +} +async function fetchJsonParsedAccount(rpc, address2, config = {}) { + const { abortSignal, ...rpcConfig } = config; + const { value: account } = await rpc.getAccountInfo(address2, { ...rpcConfig, encoding: "jsonParsed" }).send({ abortSignal }); + return !!account && typeof account === "object" && "parsed" in account.data ? parseJsonRpcAccount(address2, account) : parseBase64RpcAccount(address2, account); +} +async function fetchEncodedAccounts(rpc, addresses, config = {}) { + const { abortSignal, ...rpcConfig } = config; + const response = await rpc.getMultipleAccounts(addresses, { ...rpcConfig, encoding: "base64" }).send({ abortSignal }); + return response.value.map((account, index2) => parseBase64RpcAccount(addresses[index2], account)); +} +async function fetchJsonParsedAccounts(rpc, addresses, config = {}) { + const { abortSignal, ...rpcConfig } = config; + const response = await rpc.getMultipleAccounts(addresses, { ...rpcConfig, encoding: "jsonParsed" }).send({ abortSignal }); + return response.value.map((account, index2) => { + return !!account && typeof account === "object" && "parsed" in account.data ? parseJsonRpcAccount(addresses[index2], account) : parseBase64RpcAccount(addresses[index2], account); + }); +} +function assertAccountExists(account) { + if (!account.exists) { + throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, { address: account.address }); + } +} +function assertAccountsExist(accounts) { + const missingAccounts = accounts.filter((a) => !a.exists); + if (missingAccounts.length > 0) { + const missingAddresses = missingAccounts.map((a) => a.address); + throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, { addresses: missingAddresses }); + } +} +var BASE_ACCOUNT_SIZE; +var init_index_node4 = __esm({ + "node_modules/@solana/accounts/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node3(); + BASE_ACCOUNT_SIZE = 128; + } +}); + +// node_modules/@solana/assertions/dist/index.node.mjs +function assertPRNGIsAvailable() { + if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.getRandomValues !== "function") { + throw new SolanaError(SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED); + } +} +async function isEd25519CurveSupported(subtle) { + if (cachedEd25519Decision === void 0) { + cachedEd25519Decision = new Promise((resolve) => { + subtle.generateKey( + "Ed25519", + /* extractable */ + false, + ["sign", "verify"] + ).then(() => { + resolve(cachedEd25519Decision = true); + }).catch(() => { + resolve(cachedEd25519Decision = false); + }); + }); + } + if (typeof cachedEd25519Decision === "boolean") { + return cachedEd25519Decision; + } else { + return await cachedEd25519Decision; + } +} +function assertDigestCapabilityIsAvailable() { + if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.digest !== "function") { + throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED); + } +} +async function assertKeyGenerationIsAvailable() { + if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.generateKey !== "function") { + throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED); + } + if (!await isEd25519CurveSupported(globalThis.crypto.subtle)) { + throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED); + } +} +function assertKeyExporterIsAvailable() { + if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.exportKey !== "function") { + throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED); + } +} +function assertSigningCapabilityIsAvailable() { + if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.sign !== "function") { + throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED); + } +} +function assertVerificationCapabilityIsAvailable() { + if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.verify !== "function") { + throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED); + } +} +var cachedEd25519Decision; +var init_index_node5 = __esm({ + "node_modules/@solana/assertions/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + } +}); + +// node_modules/@solana/addresses/dist/index.node.mjs +function getMemoizedBase58Encoder() { + if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder(); + return memoizedBase58Encoder; +} +function getMemoizedBase58Decoder() { + if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder(); + return memoizedBase58Decoder; +} +function isAddress2(putativeAddress) { + if ( + // Lowest address (32 bytes of zeroes) + putativeAddress.length < 32 || // Highest address (32 bytes of 255) + putativeAddress.length > 44 + ) { + return false; + } + const base58Encoder2 = getMemoizedBase58Encoder(); + try { + return base58Encoder2.encode(putativeAddress).byteLength === 32; + } catch { + return false; + } +} +function assertIsAddress(putativeAddress) { + if ( + // Lowest address (32 bytes of zeroes) + putativeAddress.length < 32 || // Highest address (32 bytes of 255) + putativeAddress.length > 44 + ) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, { + actualLength: putativeAddress.length + }); + } + const base58Encoder2 = getMemoizedBase58Encoder(); + const bytes = base58Encoder2.encode(putativeAddress); + const numBytes = bytes.byteLength; + if (numBytes !== 32) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, { + actualLength: numBytes + }); + } +} +function address(putativeAddress) { + assertIsAddress(putativeAddress); + return putativeAddress; +} +function getAddressEncoder() { + return transformEncoder( + fixEncoderSize(getMemoizedBase58Encoder(), 32), + (putativeAddress) => address(putativeAddress) + ); +} +function getAddressDecoder() { + return fixDecoderSize(getMemoizedBase58Decoder(), 32); +} +function getAddressCodec() { + return combineCodec(getAddressEncoder(), getAddressDecoder()); +} +function getAddressComparator() { + return new Intl.Collator("en", { + caseFirst: "lower", + ignorePunctuation: false, + localeMatcher: "best fit", + numeric: false, + sensitivity: "variant", + usage: "sort" + }).compare; +} +function mod4(a) { + const r = a % P; + return r >= 0n ? r : P + r; +} +function pow24(x, power) { + let r = x; + while (power-- > 0n) { + r *= r; + r %= P; + } + return r; +} +function pow_2_252_3(x) { + const x2 = x * x % P; + const b2 = x2 * x % P; + const b4 = pow24(b2, 2n) * b2 % P; + const b5 = pow24(b4, 1n) * x % P; + const b10 = pow24(b5, 5n) * b5 % P; + const b20 = pow24(b10, 10n) * b10 % P; + const b40 = pow24(b20, 20n) * b20 % P; + const b80 = pow24(b40, 40n) * b40 % P; + const b160 = pow24(b80, 80n) * b80 % P; + const b240 = pow24(b160, 80n) * b80 % P; + const b250 = pow24(b240, 10n) * b10 % P; + const pow_p_5_8 = pow24(b250, 2n) * x % P; + return pow_p_5_8; +} +function uvRatio(u, v) { + const v3 = mod4(v * v * v); + const v7 = mod4(v3 * v3 * v); + const pow = pow_2_252_3(u * v7); + let x = mod4(u * v3 * pow); + const vx2 = mod4(v * x * x); + const root1 = x; + const root2 = mod4(x * RM1); + const useRoot1 = vx2 === u; + const useRoot2 = vx2 === mod4(-u); + const noRoot = vx2 === mod4(-u * RM1); + if (useRoot1) x = root1; + if (useRoot2 || noRoot) x = root2; + if ((mod4(x) & 1n) === 1n) x = mod4(-x); + if (!useRoot1 && !useRoot2) { + return null; + } + return x; +} +function pointIsOnCurve(y, lastByte) { + const y2 = mod4(y * y); + const u = mod4(y2 - 1n); + const v = mod4(D * y2 + 1n); + const x = uvRatio(u, v); + if (x === null) { + return false; + } + const isLastByteOdd = (lastByte & 128) !== 0; + if (x === 0n && isLastByteOdd) { + return false; + } + return true; +} +function byteToHex(byte) { + const hexString = byte.toString(16); + if (hexString.length === 1) { + return `0${hexString}`; + } else { + return hexString; + } +} +function decompressPointBytes(bytes) { + const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & -129 : byte)}${acc}`, ""); + const integerLiteralString = `0x${hexString}`; + return BigInt(integerLiteralString); +} +function compressedPointBytesAreOnCurve(bytes) { + if (bytes.byteLength !== 32) { + return false; + } + const y = decompressPointBytes(bytes); + return pointIsOnCurve(y, bytes[31]); +} +function isOffCurveAddress(putativeOffCurveAddress) { + const addressBytes = getAddressCodec().encode(putativeOffCurveAddress); + return compressedPointBytesAreOnCurve(addressBytes) === false; +} +function assertIsOffCurveAddress(putativeOffCurveAddress) { + if (!isOffCurveAddress(putativeOffCurveAddress)) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS); + } +} +function offCurveAddress(putativeOffCurveAddress) { + assertIsOffCurveAddress(putativeOffCurveAddress); + return putativeOffCurveAddress; +} +function isProgramDerivedAddress(value) { + return Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "number" && value[1] >= 0 && value[1] <= 255 && isAddress2(value[0]); +} +function assertIsProgramDerivedAddress(value) { + const validFormat = Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "number"; + if (!validFormat) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__MALFORMED_PDA); + } + if (value[1] < 0 || value[1] > 255) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, { + bump: value[1] + }); + } + assertIsAddress(value[0]); +} +async function createProgramDerivedAddress({ programAddress, seeds }) { + assertDigestCapabilityIsAvailable(); + if (seeds.length > MAX_SEEDS) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, { + actual: seeds.length, + maxSeeds: MAX_SEEDS + }); + } + let textEncoder; + const seedBytes = seeds.reduce((acc, seed, ii) => { + const bytes = typeof seed === "string" ? (textEncoder ||= new TextEncoder()).encode(seed) : seed; + if (bytes.byteLength > MAX_SEED_LENGTH) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, { + actual: bytes.byteLength, + index: ii, + maxSeedLength: MAX_SEED_LENGTH + }); } - var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; - function isValidHTTPToken(characters) { - if (characters.length >= 12) return tokenRegExp.test(characters); - if (characters.length === 0) return false; - for (let i = 0; i < characters.length; i++) { - if (validTokenChars[characters.charCodeAt(i)] !== 1) { - return false; - } + acc.push(...bytes); + return acc; + }, []); + const base58EncodedAddressCodec = getAddressCodec(); + const programAddressBytes = base58EncodedAddressCodec.encode(programAddress); + const addressBytesBuffer = await crypto.subtle.digest( + "SHA-256", + new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES]) + ); + const addressBytes = new Uint8Array(addressBytesBuffer); + if (compressedPointBytesAreOnCurve(addressBytes)) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE); + } + return base58EncodedAddressCodec.decode(addressBytes); +} +async function getProgramDerivedAddress({ + programAddress, + seeds +}) { + let bumpSeed = 255; + while (bumpSeed > 0) { + try { + const address2 = await createProgramDerivedAddress({ + programAddress, + seeds: [...seeds, new Uint8Array([bumpSeed])] + }); + return [address2, bumpSeed]; + } catch (e7) { + if (isSolanaError(e7, SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE)) { + bumpSeed--; + } else { + throw e7; } - return true; - } - var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - function isValidHeaderValue(characters) { - return !headerCharRegex.test(characters); } - var rangeHeaderRegex = /^bytes (\d+)-(\d+)\/(\d+)?$/; - function parseRangeHeader(range) { - if (range == null || range === "") return { start: 0, end: null, size: null }; - const m = range ? range.match(rangeHeaderRegex) : null; - return m ? { - start: parseInt(m[1]), - end: m[2] ? parseInt(m[2]) : null, - size: m[3] ? parseInt(m[3]) : null - } : null; + } + throw new SolanaError(SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED); +} +async function createAddressWithSeed({ baseAddress, programAddress, seed }) { + const { encode: encode4, decode: decode2 } = getAddressCodec(); + const seedBytes = typeof seed === "string" ? new TextEncoder().encode(seed) : seed; + if (seedBytes.byteLength > MAX_SEED_LENGTH) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, { + actual: seedBytes.byteLength, + index: 0, + maxSeedLength: MAX_SEED_LENGTH + }); + } + const programAddressBytes = encode4(programAddress); + if (programAddressBytes.length >= PDA_MARKER_BYTES.length && bytesEqual(programAddressBytes.slice(-PDA_MARKER_BYTES.length), new Uint8Array(PDA_MARKER_BYTES))) { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER); + } + const addressBytesBuffer = await crypto.subtle.digest( + "SHA-256", + new Uint8Array([...encode4(baseAddress), ...seedBytes, ...programAddressBytes]) + ); + const addressBytes = new Uint8Array(addressBytesBuffer); + return decode2(addressBytes); +} +async function getAddressFromPublicKey(publicKey) { + assertKeyExporterIsAvailable(); + if (publicKey.type !== "public" || publicKey.algorithm.name !== "Ed25519") { + throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY); + } + const publicKeyBytes = await crypto.subtle.exportKey("raw", publicKey); + return getAddressDecoder().decode(new Uint8Array(publicKeyBytes)); +} +async function getPublicKeyFromAddress(address2) { + const addressBytes = getAddressEncoder().encode(address2); + return await crypto.subtle.importKey("raw", addressBytes, { name: "Ed25519" }, true, ["verify"]); +} +var memoizedBase58Encoder, memoizedBase58Decoder, D, P, RM1, MAX_SEED_LENGTH, MAX_SEEDS, PDA_MARKER_BYTES; +var init_index_node6 = __esm({ + "node_modules/@solana/addresses/dist/index.node.mjs"() { + "use strict"; + init_index_node2(); + init_index_node3(); + init_index_node(); + init_index_node5(); + D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n; + P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; + RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; + MAX_SEED_LENGTH = 32; + MAX_SEEDS = 16; + PDA_MARKER_BYTES = [ + // The string 'ProgramDerivedAddress' + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 68, + 101, + 114, + 105, + 118, + 101, + 100, + 65, + 100, + 100, + 114, + 101, + 115, + 115 + ]; + } +}); + +// node_modules/@solana/codecs-numbers/dist/index.node.mjs +function assertNumberIsBetweenForCodec(codecDescription, min, max, value) { + if (value < min || value > max) { + throw new SolanaError(SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, { + codecDescription, + max, + min, + value + }); + } +} +function isLittleEndian(config) { + return config?.endian === 1 ? false : true; +} +function numberEncoderFactory(input) { + return createEncoder({ + fixedSize: input.size, + write(value, bytes, offset) { + if (input.range) { + assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value); + } + const arrayBuffer = new ArrayBuffer(input.size); + input.set(new DataView(arrayBuffer), value, isLittleEndian(input.config)); + bytes.set(new Uint8Array(arrayBuffer), offset); + return offset + input.size; } - function addListener(obj, name, listener) { - const listeners = obj[kListeners] ??= []; - listeners.push([name, listener]); - obj.on(name, listener); - return obj; + }); +} +function numberDecoderFactory(input) { + return createDecoder({ + fixedSize: input.size, + read(bytes, offset = 0) { + assertByteArrayIsNotEmptyForCodec(input.name, bytes, offset); + assertByteArrayHasEnoughBytesForCodec(input.name, input.size, bytes, offset); + const view = new DataView(toArrayBuffer(bytes, offset, input.size)); + return [input.get(view, isLittleEndian(input.config)), offset + input.size]; } - function removeAllListeners(obj) { - if (obj[kListeners] != null) { - for (const [name, listener] of obj[kListeners]) { - obj.removeListener(name, listener); + }); +} +var Endian, getF32Encoder, getF32Decoder, getF32Codec, getF64Encoder, getF64Decoder, getF64Codec, getI128Encoder, getI128Decoder, getI128Codec, getI16Encoder, getI16Decoder, getI16Codec, getI32Encoder, getI32Decoder, getI32Codec, getI64Encoder, getI64Decoder, getI64Codec, getI8Encoder, getI8Decoder, getI8Codec, getShortU16Encoder, getShortU16Decoder, getShortU16Codec, getU128Encoder, getU128Decoder, getU128Codec, getU16Encoder, getU16Decoder, getU16Codec, getU32Encoder, getU32Decoder, getU32Codec, getU64Encoder, getU64Decoder, getU64Codec, getU8Encoder, getU8Decoder, getU8Codec; +var init_index_node7 = __esm({ + "node_modules/@solana/codecs-numbers/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node2(); + Endian = /* @__PURE__ */ ((Endian2) => { + Endian2[Endian2["Little"] = 0] = "Little"; + Endian2[Endian2["Big"] = 1] = "Big"; + return Endian2; + })(Endian || {}); + getF32Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "f32", + set: (view, value, le) => view.setFloat32(0, Number(value), le), + size: 4 + }); + getF32Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getFloat32(0, le), + name: "f32", + size: 4 + }); + getF32Codec = (config = {}) => combineCodec(getF32Encoder(config), getF32Decoder(config)); + getF64Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "f64", + set: (view, value, le) => view.setFloat64(0, Number(value), le), + size: 8 + }); + getF64Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getFloat64(0, le), + name: "f64", + size: 8 + }); + getF64Codec = (config = {}) => combineCodec(getF64Encoder(config), getF64Decoder(config)); + getI128Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "i128", + range: [-BigInt("0x7fffffffffffffffffffffffffffffff") - 1n, BigInt("0x7fffffffffffffffffffffffffffffff")], + set: (view, value, le) => { + const leftOffset = le ? 8 : 0; + const rightOffset = le ? 0 : 8; + const rightMask = 0xffffffffffffffffn; + view.setBigInt64(leftOffset, BigInt(value) >> 64n, le); + view.setBigUint64(rightOffset, BigInt(value) & rightMask, le); + }, + size: 16 + }); + getI128Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => { + const leftOffset = le ? 8 : 0; + const rightOffset = le ? 0 : 8; + const left = view.getBigInt64(leftOffset, le); + const right = view.getBigUint64(rightOffset, le); + return (left << 64n) + right; + }, + name: "i128", + size: 16 + }); + getI128Codec = (config = {}) => combineCodec(getI128Encoder(config), getI128Decoder(config)); + getI16Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "i16", + range: [-Number("0x7fff") - 1, Number("0x7fff")], + set: (view, value, le) => view.setInt16(0, Number(value), le), + size: 2 + }); + getI16Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getInt16(0, le), + name: "i16", + size: 2 + }); + getI16Codec = (config = {}) => combineCodec(getI16Encoder(config), getI16Decoder(config)); + getI32Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "i32", + range: [-Number("0x7fffffff") - 1, Number("0x7fffffff")], + set: (view, value, le) => view.setInt32(0, Number(value), le), + size: 4 + }); + getI32Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getInt32(0, le), + name: "i32", + size: 4 + }); + getI32Codec = (config = {}) => combineCodec(getI32Encoder(config), getI32Decoder(config)); + getI64Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "i64", + range: [-BigInt("0x7fffffffffffffff") - 1n, BigInt("0x7fffffffffffffff")], + set: (view, value, le) => view.setBigInt64(0, BigInt(value), le), + size: 8 + }); + getI64Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getBigInt64(0, le), + name: "i64", + size: 8 + }); + getI64Codec = (config = {}) => combineCodec(getI64Encoder(config), getI64Decoder(config)); + getI8Encoder = () => numberEncoderFactory({ + name: "i8", + range: [-Number("0x7f") - 1, Number("0x7f")], + set: (view, value) => view.setInt8(0, Number(value)), + size: 1 + }); + getI8Decoder = () => numberDecoderFactory({ + get: (view) => view.getInt8(0), + name: "i8", + size: 1 + }); + getI8Codec = () => combineCodec(getI8Encoder(), getI8Decoder()); + getShortU16Encoder = () => createEncoder({ + getSizeFromValue: (value) => { + if (value <= 127) return 1; + if (value <= 16383) return 2; + return 3; + }, + maxSize: 3, + write: (value, bytes, offset) => { + assertNumberIsBetweenForCodec("shortU16", 0, 65535, value); + const shortU16Bytes = [0]; + for (let ii = 0; ; ii += 1) { + const alignedValue = Number(value) >> ii * 7; + if (alignedValue === 0) { + break; + } + const nextSevenBits = 127 & alignedValue; + shortU16Bytes[ii] = nextSevenBits; + if (ii > 0) { + shortU16Bytes[ii - 1] |= 128; + } } - obj[kListeners] = null; - } - return obj; - } - function errorRequest(client, request, err) { - try { - request.onResponseError(err); - assert8(request.aborted); - } catch (err2) { - client.emit("error", err2); - } - } - var setupConnectTimeout = process.platform === "win32" ? (socketWeakRef, opts) => { - if (!opts.timeout) { - return noop; - } - let s1 = null; - let s22 = null; - const fastTimer = timers.setFastTimeout(() => { - s1 = setImmediate(() => { - s22 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)); - }); - }, opts.timeout); - return () => { - timers.clearFastTimeout(fastTimer); - clearImmediate(s1); - clearImmediate(s22); - }; - } : (socketWeakRef, opts) => { - if (!opts.timeout) { - return noop; - } - let s1 = null; - const fastTimer = timers.setFastTimeout(() => { - s1 = setImmediate(() => { - onConnectTimeout(socketWeakRef.deref(), opts); - }); - }, opts.timeout); - return () => { - timers.clearFastTimeout(fastTimer); - clearImmediate(s1); - }; - }; - function onConnectTimeout(socket, opts) { - if (socket == null) { - return; - } - let message = "Connect Timeout Error"; - if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { - message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")},`; - } else { - message += ` (attempted address: ${opts.hostname}:${opts.port},`; + bytes.set(shortU16Bytes, offset); + return offset + shortU16Bytes.length; } - message += ` timeout: ${opts.timeout}ms)`; - destroy(socket, new ConnectTimeoutError(message)); - } - function getProtocolFromUrlString(urlString) { - if (urlString[0] === "h" && urlString[1] === "t" && urlString[2] === "t" && urlString[3] === "p") { - switch (urlString[4]) { - case ":": - return "http:"; - case "s": - if (urlString[5] === ":") { - return "https:"; - } + }); + getShortU16Decoder = () => createDecoder({ + maxSize: 3, + read: (bytes, offset) => { + let value = 0; + let byteCount = 0; + while (++byteCount) { + const byteIndex = byteCount - 1; + const currentByte = bytes[offset + byteIndex]; + const nextSevenBits = 127 & currentByte; + value |= nextSevenBits << byteIndex * 7; + if ((currentByte & 128) === 0) { + break; + } } + return [value, offset + byteCount]; } - return urlString.slice(0, urlString.indexOf(":") + 1); - } - var kEnumerableProperty = /* @__PURE__ */ Object.create(null); - kEnumerableProperty.enumerable = true; - var normalizedMethodRecordsBase = { - delete: "DELETE", - DELETE: "DELETE", - get: "GET", - GET: "GET", - head: "HEAD", - HEAD: "HEAD", - options: "OPTIONS", - OPTIONS: "OPTIONS", - post: "POST", - POST: "POST", - put: "PUT", - PUT: "PUT" - }; - var normalizedMethodRecords = { - ...normalizedMethodRecordsBase, - patch: "patch", - PATCH: "PATCH" - }; - Object.setPrototypeOf(normalizedMethodRecordsBase, null); - Object.setPrototypeOf(normalizedMethodRecords, null); - module.exports = { - kEnumerableProperty, - isDisturbed, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - hasSafeIterator, - isAsyncIterable, - isDestroyed, - headerNameToString, - bufferToLowerCasedHeaderName, - addListener, - removeAllListeners, - errorRequest, - parseRawHeaders, - toRawHeaders, - encodeRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - assertRequestHandler, - getSocketInfo, - isFormDataLike, - pathHasQueryOrFragment, - serializePathWithQuery, - addAbortListener, - isValidHTTPToken, - isValidHeaderValue, - isTokenCharCode, - parseRangeHeader, - normalizedMethodRecordsBase, - normalizedMethodRecords, - isValidPort, - isHttpOrHttpsPrefixed, - safeHTTPMethods: Object.freeze(["GET", "HEAD", "OPTIONS", "TRACE"]), - wrapRequestBody, - setupConnectTimeout, - getProtocolFromUrlString - }; + }); + getShortU16Codec = () => combineCodec(getShortU16Encoder(), getShortU16Decoder()); + getU128Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "u128", + range: [0n, BigInt("0xffffffffffffffffffffffffffffffff")], + set: (view, value, le) => { + const leftOffset = le ? 8 : 0; + const rightOffset = le ? 0 : 8; + const rightMask = 0xffffffffffffffffn; + view.setBigUint64(leftOffset, BigInt(value) >> 64n, le); + view.setBigUint64(rightOffset, BigInt(value) & rightMask, le); + }, + size: 16 + }); + getU128Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => { + const leftOffset = le ? 8 : 0; + const rightOffset = le ? 0 : 8; + const left = view.getBigUint64(leftOffset, le); + const right = view.getBigUint64(rightOffset, le); + return (left << 64n) + right; + }, + name: "u128", + size: 16 + }); + getU128Codec = (config = {}) => combineCodec(getU128Encoder(config), getU128Decoder(config)); + getU16Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "u16", + range: [0, Number("0xffff")], + set: (view, value, le) => view.setUint16(0, Number(value), le), + size: 2 + }); + getU16Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getUint16(0, le), + name: "u16", + size: 2 + }); + getU16Codec = (config = {}) => combineCodec(getU16Encoder(config), getU16Decoder(config)); + getU32Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "u32", + range: [0, Number("0xffffffff")], + set: (view, value, le) => view.setUint32(0, Number(value), le), + size: 4 + }); + getU32Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getUint32(0, le), + name: "u32", + size: 4 + }); + getU32Codec = (config = {}) => combineCodec(getU32Encoder(config), getU32Decoder(config)); + getU64Encoder = (config = {}) => numberEncoderFactory({ + config, + name: "u64", + range: [0n, BigInt("0xffffffffffffffff")], + set: (view, value, le) => view.setBigUint64(0, BigInt(value), le), + size: 8 + }); + getU64Decoder = (config = {}) => numberDecoderFactory({ + config, + get: (view, le) => view.getBigUint64(0, le), + name: "u64", + size: 8 + }); + getU64Codec = (config = {}) => combineCodec(getU64Encoder(config), getU64Decoder(config)); + getU8Encoder = () => numberEncoderFactory({ + name: "u8", + range: [0, Number("0xff")], + set: (view, value) => view.setUint8(0, Number(value)), + size: 1 + }); + getU8Decoder = () => numberDecoderFactory({ + get: (view) => view.getUint8(0), + name: "u8", + size: 1 + }); + getU8Codec = () => combineCodec(getU8Encoder(), getU8Decoder()); } }); -// node_modules/undici/lib/util/stats.js -var require_stats = __commonJS({ - "node_modules/undici/lib/util/stats.js"(exports, module) { - "use strict"; - var { - kConnected, - kPending, - kRunning, - kSize, - kFree, - kQueued - } = require_symbols(); - var ClientStats = class { - constructor(client) { - this.connected = client[kConnected]; - this.pending = client[kPending]; - this.running = client[kRunning]; - this.size = client[kSize]; - } - }; - var PoolStats = class { - constructor(pool) { - this.connected = pool[kConnected]; - this.free = pool[kFree]; - this.pending = pool[kPending]; - this.queued = pool[kQueued]; - this.running = pool[kRunning]; - this.size = pool[kSize]; - } - }; - module.exports = { ClientStats, PoolStats }; +// node_modules/@solana/codecs-data-structures/dist/index.node.mjs +function assertValidNumberOfItemsForCodec(codecDescription, expected, actual) { + if (expected !== actual) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, { + actual, + codecDescription, + expected + }); } -}); - -// node_modules/undici/lib/core/diagnostics.js -var require_diagnostics = __commonJS({ - "node_modules/undici/lib/core/diagnostics.js"(exports, module) { - "use strict"; - var diagnosticsChannel = __require("diagnostics_channel"); - var util2 = __require("util"); - var undiciDebugLog = util2.debuglog("undici"); - var fetchDebuglog = util2.debuglog("fetch"); - var websocketDebuglog = util2.debuglog("websocket"); - var channels = { - // Client - beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), - connected: diagnosticsChannel.channel("undici:client:connected"), - connectError: diagnosticsChannel.channel("undici:client:connectError"), - sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"), - // Request - create: diagnosticsChannel.channel("undici:request:create"), - bodySent: diagnosticsChannel.channel("undici:request:bodySent"), - bodyChunkSent: diagnosticsChannel.channel("undici:request:bodyChunkSent"), - bodyChunkReceived: diagnosticsChannel.channel("undici:request:bodyChunkReceived"), - headers: diagnosticsChannel.channel("undici:request:headers"), - trailers: diagnosticsChannel.channel("undici:request:trailers"), - error: diagnosticsChannel.channel("undici:request:error"), - // WebSocket - open: diagnosticsChannel.channel("undici:websocket:open"), - close: diagnosticsChannel.channel("undici:websocket:close"), - socketError: diagnosticsChannel.channel("undici:websocket:socket_error"), - ping: diagnosticsChannel.channel("undici:websocket:ping"), - pong: diagnosticsChannel.channel("undici:websocket:pong"), - // ProxyAgent - proxyConnected: diagnosticsChannel.channel("undici:proxy:connected") - }; - var isTrackingClientEvents = false; - function trackClientEvents(debugLog = undiciDebugLog) { - if (isTrackingClientEvents) { - return; +} +function maxCodecSizes(sizes) { + return sizes.reduce( + (all, size5) => all === null || size5 === null ? null : Math.max(all, size5), + 0 + ); +} +function sumCodecSizes(sizes) { + return sizes.reduce((all, size5) => all === null || size5 === null ? null : all + size5, 0); +} +function getFixedSize(codec) { + return isFixedSize(codec) ? codec.fixedSize : null; +} +function getMaxSize(codec) { + return isFixedSize(codec) ? codec.fixedSize : codec.maxSize ?? null; +} +function getArrayEncoder(item, config = {}) { + const size5 = config.size ?? getU32Encoder(); + const fixedSize = computeArrayLikeCodecSize(size5, getFixedSize(item)); + const maxSize = computeArrayLikeCodecSize(size5, getMaxSize(item)) ?? void 0; + return createEncoder({ + ...fixedSize !== null ? { fixedSize } : { + getSizeFromValue: (array) => { + const prefixSize = typeof size5 === "object" ? getEncodedSize(array.length, size5) : 0; + return prefixSize + [...array].reduce((all, value) => all + getEncodedSize(value, item), 0); + }, + maxSize + }, + write: (array, bytes, offset) => { + if (typeof size5 === "number") { + assertValidNumberOfItemsForCodec("array", size5, array.length); } - if (channels.beforeConnect.hasSubscribers || channels.connected.hasSubscribers || channels.connectError.hasSubscribers || channels.sendHeaders.hasSubscribers) { - isTrackingClientEvents = true; - return; + if (typeof size5 === "object") { + offset = size5.write(array.length, bytes, offset); } - isTrackingClientEvents = true; - diagnosticsChannel.subscribe( - "undici:client:beforeConnect", - (evt) => { - const { - connectParams: { version: version4, protocol, port, host } - } = evt; - debugLog( - "connecting to %s%s using %s%s", - host, - port ? `:${port}` : "", - protocol, - version4 - ); - } - ); - diagnosticsChannel.subscribe( - "undici:client:connected", - (evt) => { - const { - connectParams: { version: version4, protocol, port, host } - } = evt; - debugLog( - "connected to %s%s using %s%s", - host, - port ? `:${port}` : "", - protocol, - version4 - ); - } - ); - diagnosticsChannel.subscribe( - "undici:client:connectError", - (evt) => { - const { - connectParams: { version: version4, protocol, port, host }, - error - } = evt; - debugLog( - "connection to %s%s using %s%s errored - %s", - host, - port ? `:${port}` : "", - protocol, - version4, - error.message - ); - } - ); - diagnosticsChannel.subscribe( - "undici:client:sendHeaders", - (evt) => { - const { - request: { method, path, origin } - } = evt; - debugLog("sending request to %s %s%s", method, origin, path); - } - ); + array.forEach((value) => { + offset = item.write(value, bytes, offset); + }); + return offset; } - var isTrackingRequestEvents = false; - function trackRequestEvents(debugLog = undiciDebugLog) { - if (isTrackingRequestEvents) { - return; - } - if (channels.headers.hasSubscribers || channels.trailers.hasSubscribers || channels.error.hasSubscribers) { - isTrackingRequestEvents = true; - return; + }); +} +function getArrayDecoder(item, config = {}) { + const size5 = config.size ?? getU32Decoder(); + const itemSize = getFixedSize(item); + const fixedSize = computeArrayLikeCodecSize(size5, itemSize); + const maxSize = computeArrayLikeCodecSize(size5, getMaxSize(item)) ?? void 0; + return createDecoder({ + ...fixedSize !== null ? { fixedSize } : { maxSize }, + read: (bytes, offset) => { + const array = []; + if (typeof size5 === "object" && bytes.slice(offset).length === 0) { + return [array, offset]; } - isTrackingRequestEvents = true; - diagnosticsChannel.subscribe( - "undici:request:headers", - (evt) => { - const { - request: { method, path, origin }, - response: { statusCode } - } = evt; - debugLog( - "received response to %s %s%s - HTTP %d", - method, - origin, - path, - statusCode - ); + if (size5 === "remainder") { + while (offset < bytes.length) { + const [value, newOffset2] = item.read(bytes, offset); + offset = newOffset2; + array.push(value); } - ); - diagnosticsChannel.subscribe( - "undici:request:trailers", - (evt) => { - const { - request: { method, path, origin } - } = evt; - debugLog("trailers received from %s %s%s", method, origin, path); + return [array, offset]; + } + const [resolvedSize, newOffset] = typeof size5 === "number" ? [size5, offset] : size5.read(bytes, offset); + offset = newOffset; + for (let i = 0; i < resolvedSize; i += 1) { + const [value, newOffset2] = item.read(bytes, offset); + offset = newOffset2; + array.push(value); + } + return [array, offset]; + } + }); +} +function getArrayCodec(item, config = {}) { + return combineCodec(getArrayEncoder(item, config), getArrayDecoder(item, config)); +} +function computeArrayLikeCodecSize(size5, itemSize) { + if (typeof size5 !== "number") return null; + if (size5 === 0) return 0; + return itemSize === null ? null : itemSize * size5; +} +function getBitArrayEncoder(size5, config = {}) { + const parsedConfig = typeof config === "boolean" ? { backward: config } : config; + const backward = parsedConfig.backward ?? false; + return createEncoder({ + fixedSize: size5, + write(value, bytes, offset) { + const bytesToAdd = []; + for (let i = 0; i < size5; i += 1) { + let byte = 0; + for (let j = 0; j < 8; j += 1) { + const feature = Number(value[i * 8 + j] ?? 0); + byte |= feature << (backward ? j : 7 - j); } - ); - diagnosticsChannel.subscribe( - "undici:request:error", - (evt) => { - const { - request: { method, path, origin }, - error - } = evt; - debugLog( - "request to %s %s%s errored - %s", - method, - origin, - path, - error.message - ); + if (backward) { + bytesToAdd.unshift(byte); + } else { + bytesToAdd.push(byte); } - ); - } - var isTrackingWebSocketEvents = false; - function trackWebSocketEvents(debugLog = websocketDebuglog) { - if (isTrackingWebSocketEvents) { - return; - } - if (channels.open.hasSubscribers || channels.close.hasSubscribers || channels.socketError.hasSubscribers || channels.ping.hasSubscribers || channels.pong.hasSubscribers) { - isTrackingWebSocketEvents = true; - return; } - isTrackingWebSocketEvents = true; - diagnosticsChannel.subscribe( - "undici:websocket:open", - (evt) => { - if (evt.address != null) { - const { address: address2, port } = evt.address; - debugLog("connection opened %s%s", address2, port ? `:${port}` : ""); + bytes.set(bytesToAdd, offset); + return size5; + } + }); +} +function getBitArrayDecoder(size5, config = {}) { + const parsedConfig = typeof config === "boolean" ? { backward: config } : config; + const backward = parsedConfig.backward ?? false; + return createDecoder({ + fixedSize: size5, + read(bytes, offset) { + assertByteArrayHasEnoughBytesForCodec("bitArray", size5, bytes, offset); + const booleans = []; + let slice4 = bytes.slice(offset, offset + size5); + slice4 = backward ? slice4.reverse() : slice4; + slice4.forEach((byte) => { + for (let i = 0; i < 8; i += 1) { + if (backward) { + booleans.push(Boolean(byte & 1)); + byte >>= 1; } else { - debugLog("connection opened"); + booleans.push(Boolean(byte & 128)); + byte <<= 1; } } - ); - diagnosticsChannel.subscribe( - "undici:websocket:close", - (evt) => { - const { websocket, code, reason } = evt; - debugLog( - "closed connection to %s - %s %s", - websocket.url, - code, - reason - ); - } - ); - diagnosticsChannel.subscribe( - "undici:websocket:socket_error", - (err) => { - debugLog("connection errored - %s", err.message); - } - ); - diagnosticsChannel.subscribe( - "undici:websocket:ping", - (evt) => { - debugLog("ping received"); - } - ); - diagnosticsChannel.subscribe( - "undici:websocket:pong", - (evt) => { - debugLog("pong received"); - } - ); + }); + return [booleans, offset + size5]; + } + }); +} +function getBitArrayCodec(size5, config = {}) { + return combineCodec(getBitArrayEncoder(size5, config), getBitArrayDecoder(size5, config)); +} +function getBooleanEncoder(config = {}) { + return transformEncoder(config.size ?? getU8Encoder(), (value) => value ? 1 : 0); +} +function getBooleanDecoder(config = {}) { + return transformDecoder(config.size ?? getU8Decoder(), (value) => Number(value) === 1); +} +function getBooleanCodec(config = {}) { + return combineCodec(getBooleanEncoder(config), getBooleanDecoder(config)); +} +function getBytesEncoder() { + return createEncoder({ + getSizeFromValue: (value) => value.length, + write: (value, bytes, offset) => { + bytes.set(value, offset); + return offset + value.length; + } + }); +} +function getBytesDecoder() { + return createDecoder({ + read: (bytes, offset) => { + const slice4 = bytes.slice(offset); + return [slice4, offset + slice4.length]; + } + }); +} +function getBytesCodec() { + return combineCodec(getBytesEncoder(), getBytesDecoder()); +} +function getConstantEncoder(constant) { + return createEncoder({ + fixedSize: constant.length, + write: (_, bytes, offset) => { + bytes.set(constant, offset); + return offset + constant.length; + } + }); +} +function getConstantDecoder(constant) { + return createDecoder({ + fixedSize: constant.length, + read: (bytes, offset) => { + const base16 = getBase16Decoder2(); + if (!containsBytes(bytes, constant, offset)) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_CONSTANT, { + constant, + data: bytes, + hexConstant: base16.decode(constant), + hexData: base16.decode(bytes), + offset + }); + } + return [void 0, offset + constant.length]; + } + }); +} +function getConstantCodec(constant) { + return combineCodec(getConstantEncoder(constant), getConstantDecoder(constant)); +} +function getTupleEncoder(items) { + const fixedSize = sumCodecSizes(items.map(getFixedSize)); + const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0; + return createEncoder({ + ...fixedSize === null ? { + getSizeFromValue: (value) => items.map((item, index2) => getEncodedSize(value[index2], item)).reduce((all, one) => all + one, 0), + maxSize + } : { fixedSize }, + write: (value, bytes, offset) => { + assertValidNumberOfItemsForCodec("tuple", items.length, value.length); + items.forEach((item, index2) => { + offset = item.write(value[index2], bytes, offset); + }); + return offset; + } + }); +} +function getTupleDecoder(items) { + const fixedSize = sumCodecSizes(items.map(getFixedSize)); + const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0; + return createDecoder({ + ...fixedSize === null ? { maxSize } : { fixedSize }, + read: (bytes, offset) => { + const values = []; + items.forEach((item) => { + const [newValue, newOffset] = item.read(bytes, offset); + values.push(newValue); + offset = newOffset; + }); + return [values, offset]; + } + }); +} +function getTupleCodec(items) { + return combineCodec( + getTupleEncoder(items), + getTupleDecoder(items) + ); +} +function getUnionEncoder(variants, getIndexFromValue) { + const fixedSize = getUnionFixedSize(variants); + const write = (variant, bytes, offset) => { + const index2 = getIndexFromValue(variant); + assertValidVariantIndex(variants, index2); + return variants[index2].write(variant, bytes, offset); + }; + if (fixedSize !== null) { + return createEncoder({ fixedSize, write }); + } + const maxSize = getUnionMaxSize(variants); + return createEncoder({ + ...maxSize !== null ? { maxSize } : {}, + getSizeFromValue: (variant) => { + const index2 = getIndexFromValue(variant); + assertValidVariantIndex(variants, index2); + return getEncodedSize(variant, variants[index2]); + }, + write + }); +} +function getUnionDecoder(variants, getIndexFromBytes) { + const fixedSize = getUnionFixedSize(variants); + const read = (bytes, offset) => { + const index2 = getIndexFromBytes(bytes, offset); + assertValidVariantIndex(variants, index2); + return variants[index2].read(bytes, offset); + }; + if (fixedSize !== null) { + return createDecoder({ fixedSize, read }); + } + const maxSize = getUnionMaxSize(variants); + return createDecoder({ ...maxSize !== null ? { maxSize } : {}, read }); +} +function getUnionCodec(variants, getIndexFromValue, getIndexFromBytes) { + return combineCodec( + getUnionEncoder(variants, getIndexFromValue), + getUnionDecoder(variants, getIndexFromBytes) + ); +} +function assertValidVariantIndex(variants, index2) { + if (typeof variants[index2] === "undefined") { + throw new SolanaError(SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, { + maxRange: variants.length - 1, + minRange: 0, + variant: index2 + }); + } +} +function getUnionFixedSize(variants) { + if (variants.length === 0) return 0; + if (!isFixedSize(variants[0])) return null; + const variantSize = variants[0].fixedSize; + const sameSizedVariants = variants.every((variant) => isFixedSize(variant) && variant.fixedSize === variantSize); + return sameSizedVariants ? variantSize : null; +} +function getUnionMaxSize(variants) { + return maxCodecSizes(variants.map((variant) => getMaxSize(variant))); +} +function getDiscriminatedUnionEncoder(variants, config = {}) { + const discriminatorProperty = config.discriminator ?? "__kind"; + const prefix = config.size ?? getU8Encoder(); + return getUnionEncoder( + variants.map( + ([, variant], index2) => transformEncoder(getTupleEncoder([prefix, variant]), (value) => [index2, value]) + ), + (value) => getVariantDiscriminator(variants, value[discriminatorProperty]) + ); +} +function getDiscriminatedUnionDecoder(variants, config = {}) { + const discriminatorProperty = config.discriminator ?? "__kind"; + const prefix = config.size ?? getU8Decoder(); + return getUnionDecoder( + variants.map( + ([discriminator, variant]) => transformDecoder(getTupleDecoder([prefix, variant]), ([, value]) => ({ + [discriminatorProperty]: discriminator, + ...value + })) + ), + (bytes, offset) => Number(prefix.read(bytes, offset)[0]) + ); +} +function getDiscriminatedUnionCodec(variants, config = {}) { + return combineCodec( + getDiscriminatedUnionEncoder(variants, config), + getDiscriminatedUnionDecoder(variants, config) + ); +} +function getVariantDiscriminator(variants, discriminatorValue) { + const discriminator = variants.findIndex(([key]) => discriminatorValue === key); + if (discriminator < 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, { + value: discriminatorValue, + variants: variants.map(([key]) => key) + }); + } + return discriminator; +} +function getEnumStats(constructor) { + const numericalValues = [...new Set(Object.values(constructor).filter((v) => typeof v === "number"))].sort(); + const enumRecord = Object.fromEntries(Object.entries(constructor).slice(numericalValues.length)); + const enumKeys = Object.keys(enumRecord); + const enumValues = Object.values(enumRecord); + const stringValues = [ + .../* @__PURE__ */ new Set([...enumKeys, ...enumValues.filter((v) => typeof v === "string")]) + ]; + return { enumKeys, enumRecord, enumValues, numericalValues, stringValues }; +} +function getEnumIndexFromVariant({ + enumKeys, + enumValues, + variant +}) { + const valueIndex = findLastIndex(enumValues, (value) => value === variant); + if (valueIndex >= 0) return valueIndex; + return enumKeys.findIndex((key) => key === variant); +} +function getEnumIndexFromDiscriminator({ + discriminator, + enumKeys, + enumValues, + useValuesAsDiscriminators +}) { + if (!useValuesAsDiscriminators) { + return discriminator >= 0 && discriminator < enumKeys.length ? discriminator : -1; + } + return findLastIndex(enumValues, (value) => value === discriminator); +} +function findLastIndex(array, predicate) { + let l2 = array.length; + while (l2--) { + if (predicate(array[l2], l2, array)) return l2; + } + return -1; +} +function formatNumericalValues(values) { + if (values.length === 0) return ""; + let range = [values[0], values[0]]; + const ranges = []; + for (let index2 = 1; index2 < values.length; index2++) { + const value = values[index2]; + if (range[1] + 1 === value) { + range[1] = value; + } else { + ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`); + range = [value, value]; + } + } + ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`); + return ranges.join(", "); +} +function getEnumEncoder(constructor, config = {}) { + const prefix = config.size ?? getU8Encoder(); + const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false; + const { enumKeys, enumValues, numericalValues, stringValues } = getEnumStats(constructor); + if (useValuesAsDiscriminators && enumValues.some((value) => typeof value === "string")) { + throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, { + stringValues: enumValues.filter((v) => typeof v === "string") + }); + } + return transformEncoder(prefix, (variant) => { + const index2 = getEnumIndexFromVariant({ enumKeys, enumValues, variant }); + if (index2 < 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, { + formattedNumericalValues: formatNumericalValues(numericalValues), + numericalValues, + stringValues, + variant + }); + } + return useValuesAsDiscriminators ? enumValues[index2] : index2; + }); +} +function getEnumDecoder(constructor, config = {}) { + const prefix = config.size ?? getU8Decoder(); + const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false; + const { enumKeys, enumValues, numericalValues } = getEnumStats(constructor); + if (useValuesAsDiscriminators && enumValues.some((value) => typeof value === "string")) { + throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, { + stringValues: enumValues.filter((v) => typeof v === "string") + }); + } + return transformDecoder(prefix, (value) => { + const discriminator = Number(value); + const index2 = getEnumIndexFromDiscriminator({ + discriminator, + enumKeys, + enumValues, + useValuesAsDiscriminators + }); + if (index2 < 0) { + const validDiscriminators = useValuesAsDiscriminators ? numericalValues : [...Array(enumKeys.length).keys()]; + throw new SolanaError(SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, { + discriminator, + formattedValidDiscriminators: formatNumericalValues(validDiscriminators), + validDiscriminators + }); + } + return enumValues[index2]; + }); +} +function getEnumCodec(constructor, config = {}) { + return combineCodec(getEnumEncoder(constructor, config), getEnumDecoder(constructor, config)); +} +function getHiddenPrefixEncoder(encoder5, prefixedEncoders) { + return transformEncoder( + getTupleEncoder([...prefixedEncoders, encoder5]), + (value) => [...prefixedEncoders.map(() => void 0), value] + ); +} +function getHiddenPrefixDecoder(decoder2, prefixedDecoders) { + return transformDecoder( + getTupleDecoder([...prefixedDecoders, decoder2]), + (tuple) => tuple[tuple.length - 1] + ); +} +function getHiddenPrefixCodec(codec, prefixedCodecs) { + return combineCodec(getHiddenPrefixEncoder(codec, prefixedCodecs), getHiddenPrefixDecoder(codec, prefixedCodecs)); +} +function getHiddenSuffixEncoder(encoder5, suffixedEncoders) { + return transformEncoder( + getTupleEncoder([encoder5, ...suffixedEncoders]), + (value) => [value, ...suffixedEncoders.map(() => void 0)] + ); +} +function getHiddenSuffixDecoder(decoder2, suffixedDecoders) { + return transformDecoder( + getTupleDecoder([decoder2, ...suffixedDecoders]), + (tuple) => tuple[0] + ); +} +function getHiddenSuffixCodec(codec, suffixedCodecs) { + return combineCodec(getHiddenSuffixEncoder(codec, suffixedCodecs), getHiddenSuffixDecoder(codec, suffixedCodecs)); +} +function getLiteralUnionEncoder(variants, config = {}) { + const discriminator = config.size ?? getU8Encoder(); + return transformEncoder(discriminator, (variant) => { + const index2 = variants.indexOf(variant); + if (index2 < 0) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, { + value: variant, + variants + }); + } + return index2; + }); +} +function getLiteralUnionDecoder(variants, config = {}) { + const discriminator = config.size ?? getU8Decoder(); + return transformDecoder(discriminator, (index2) => { + if (index2 < 0 || index2 >= variants.length) { + throw new SolanaError(SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, { + discriminator: index2, + maxRange: variants.length - 1, + minRange: 0 + }); + } + return variants[Number(index2)]; + }); +} +function getLiteralUnionCodec(variants, config = {}) { + return combineCodec(getLiteralUnionEncoder(variants, config), getLiteralUnionDecoder(variants, config)); +} +function getMapEncoder(key, value, config = {}) { + return transformEncoder( + getArrayEncoder(getTupleEncoder([key, value]), config), + (map) => [...map.entries()] + ); +} +function getMapDecoder(key, value, config = {}) { + return transformDecoder( + getArrayDecoder(getTupleDecoder([key, value]), config), + (entries) => new Map(entries) + ); +} +function getMapCodec(key, value, config = {}) { + return combineCodec(getMapEncoder(key, value, config), getMapDecoder(key, value, config)); +} +function getUnitEncoder() { + return createEncoder({ + fixedSize: 0, + write: (_value, _bytes, offset) => offset + }); +} +function getUnitDecoder() { + return createDecoder({ + fixedSize: 0, + read: (_bytes, offset) => [void 0, offset] + }); +} +function getUnitCodec() { + return combineCodec(getUnitEncoder(), getUnitDecoder()); +} +function getNullableEncoder(item, config = {}) { + const prefix = (() => { + if (config.prefix === null) { + return transformEncoder(getUnitEncoder(), (_boolean) => void 0); + } + return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() }); + })(); + const noneValue = (() => { + if (config.noneValue === "zeroes") { + assertIsFixedSize(item); + return fixEncoderSize(getUnitEncoder(), item.fixedSize); + } + if (!config.noneValue) { + return getUnitEncoder(); + } + return getConstantEncoder(config.noneValue); + })(); + return getUnionEncoder( + [ + transformEncoder(getTupleEncoder([prefix, noneValue]), (_value) => [ + false, + void 0 + ]), + transformEncoder(getTupleEncoder([prefix, item]), (value) => [true, value]) + ], + (variant) => Number(variant !== null) + ); +} +function getNullableDecoder(item, config = {}) { + const prefix = (() => { + if (config.prefix === null) { + return transformDecoder(getUnitDecoder(), () => false); } - if (undiciDebugLog.enabled || fetchDebuglog.enabled) { - trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog); - trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog); + return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() }); + })(); + const noneValue = (() => { + if (config.noneValue === "zeroes") { + assertIsFixedSize(item); + return fixDecoderSize(getUnitDecoder(), item.fixedSize); } - if (websocketDebuglog.enabled) { - trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog); - trackWebSocketEvents(websocketDebuglog); + if (!config.noneValue) { + return getUnitDecoder(); } - module.exports = { - channels - }; - } -}); - -// node_modules/undici/lib/core/request.js -var require_request = __commonJS({ - "node_modules/undici/lib/core/request.js"(exports, module) { - "use strict"; - var { - InvalidArgumentError, - NotSupportedError - } = require_errors(); - var assert8 = __require("assert"); - var { - isValidHTTPToken, - isValidHeaderValue, - isStream, - destroy, - isBuffer, - isFormDataLike, - isIterable, - hasSafeIterator, - isBlobLike, - serializePathWithQuery, - parseHeaders, - assertRequestHandler, - getServerName, - normalizedMethodRecords, - getProtocolFromUrlString - } = require_util(); - var { channels } = require_diagnostics(); - var { headerNameLowerCasedRecord } = require_constants2(); - var invalidPathRegex = /[^\u0021-\u00ff]/; - var kHandler = /* @__PURE__ */ Symbol("handler"); - var kController = /* @__PURE__ */ Symbol("controller"); - var kResume = /* @__PURE__ */ Symbol("resume"); - var RequestController = class { - #paused = false; - #reason = null; - #aborted = false; - #abort; - [kResume] = null; - rawHeaders = null; - rawTrailers = null; - constructor(abort) { - this.#abort = abort; - } - pause() { - this.#paused = true; - } - resume() { - if (this.#paused) { - this.#paused = false; - this[kResume]?.(); - } - } - abort(reason) { - if (!this.#aborted) { - this.#aborted = true; - this.#reason = reason; - this.#abort(reason); - } - } - get aborted() { - return this.#aborted; - } - get reason() { - return this.#reason; - } - get paused() { - return this.#paused; - } - }; - var Request2 = class { - constructor(origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - expectContinue, - servername, - throwOnError, - maxRedirections, - typeOfService - }, handler) { - if (typeof path !== "string") { - throw new InvalidArgumentError("path must be a string"); - } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { - throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); - } else if (invalidPathRegex.test(path)) { - throw new InvalidArgumentError("invalid request path"); - } - if (typeof method !== "string") { - throw new InvalidArgumentError("method must be a string"); - } else if (normalizedMethodRecords[method] === void 0 && !isValidHTTPToken(method)) { - throw new InvalidArgumentError("invalid request method"); - } - if (upgrade && typeof upgrade !== "string") { - throw new InvalidArgumentError("upgrade must be a string"); - } - if (upgrade && !isValidHeaderValue(upgrade)) { - throw new InvalidArgumentError("invalid upgrade header"); - } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("invalid headersTimeout"); - } - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("invalid bodyTimeout"); - } - if (reset != null && typeof reset !== "boolean") { - throw new InvalidArgumentError("invalid reset"); - } - if (expectContinue != null && typeof expectContinue !== "boolean") { - throw new InvalidArgumentError("invalid expectContinue"); - } - if (throwOnError != null) { - throw new InvalidArgumentError("invalid throwOnError"); - } - if (maxRedirections != null && maxRedirections !== 0) { - throw new InvalidArgumentError("maxRedirections is not supported, use the redirect interceptor"); - } - if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) { - throw new InvalidArgumentError("typeOfService must be an integer between 0 and 255"); - } - this.headersTimeout = headersTimeout; - this.bodyTimeout = bodyTimeout; - this.method = method; - this.typeOfService = typeOfService ?? 0; - this.abort = null; - if (body == null) { - this.body = null; - } else if (isStream(body)) { - this.body = body; - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy() { - destroy(this); - }; - this.body.on("end", this.endHandler); - } - this.errorHandler = (err) => { - if (this.abort) { - this.abort(err); - } else { - this.error = err; - } - }; - this.body.on("error", this.errorHandler); - } else if (isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === "string") { - this.body = body.length ? Buffer.from(body) : null; - } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); - } - this.completed = false; - this.aborted = false; - this.upgrade = upgrade || null; - this.path = query ? serializePathWithQuery(path, query) : path; - this.origin = origin; - this.protocol = getProtocolFromUrlString(origin); - this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking ?? this.method !== "HEAD"; - this.reset = reset == null ? null : reset; - this.host = null; - this.contentLength = null; - this.contentType = null; - this.headers = []; - this.expectContinue = expectContinue != null ? expectContinue : false; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); - } - } else if (headers && typeof headers === "object") { - if (hasSafeIterator(headers)) { - for (const header of headers) { - if (!Array.isArray(header) || header.length !== 2) { - throw new InvalidArgumentError("headers must be in key-value pair format"); - } - processHeader(this, header[0], header[1]); - } - } else { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; ++i) { - processHeader(this, keys[i], headers[keys[i]]); - } - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - assertRequestHandler(handler, method, upgrade); - this.servername = servername || getServerName(this.host) || null; - this[kHandler] = handler; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); - } - } - onBodySent(chunk) { - if (channels.bodyChunkSent.hasSubscribers) { - channels.bodyChunkSent.publish({ request: this, chunk }); - } - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk); - } catch (err) { - this.abort(err); - } - } - } - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); - } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent(); - } catch (err) { - this.abort(err); - } - } - } - onRequestStart(abort, context) { - assert8(!this.aborted); - assert8(!this.completed); - this[kController] = new RequestController(abort); - if (this.error) { - this[kController].abort(this.error); - return; - } - this.abort = abort; - return this[kHandler].onRequestStart(this[kController], context); - } - onResponseStarted() { - return this[kHandler].onResponseStarted?.(); - } - onResponseStart(statusCode, headers, resume, statusText) { - assert8(!this.aborted); - assert8(!this.completed); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); - } - const controller = this[kController]; - if (controller) { - controller[kResume] = resume; - controller.rawHeaders = headers; - } - const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers; - try { - this[kHandler].onResponseStart?.(controller, statusCode, parsedHeaders, statusText); - return !controller?.paused; - } catch (err) { - this.abort(err); - return false; - } - } - onResponseData(chunk) { - assert8(!this.aborted); - assert8(!this.completed); - if (channels.bodyChunkReceived.hasSubscribers) { - channels.bodyChunkReceived.publish({ request: this, chunk }); - } - const controller = this[kController]; - try { - this[kHandler].onResponseData?.(controller, chunk); - return !controller?.paused; - } catch (err) { - this.abort(err); - return false; - } - } - onRequestUpgrade(statusCode, headers, socket) { - assert8(!this.aborted); - assert8(!this.completed); - const controller = this[kController]; - if (controller) { - controller.rawHeaders = headers; - } - const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers; - return this[kHandler].onRequestUpgrade?.(controller, statusCode, parsedHeaders, socket); - } - onResponseEnd(trailers) { - this.onFinally(); - assert8(!this.aborted); - assert8(!this.completed); - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } - const controller = this[kController]; - if (controller) { - controller.rawTrailers = trailers; - } - const parsedTrailers = Array.isArray(trailers) ? parseHeaders(trailers) : trailers; - try { - return this[kHandler].onResponseEnd?.(controller, parsedTrailers); - } catch (err) { - this.onResponseError(err); - } - } - onResponseError(error) { - this.onFinally(); - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); - } - if (this.aborted) { - return; - } - this.aborted = true; - const controller = this[kController]; - return this[kHandler].onResponseError?.(controller, error); + return getConstantDecoder(config.noneValue); + })(); + return getUnionDecoder( + [ + transformDecoder(getTupleDecoder([prefix, noneValue]), () => null), + transformDecoder(getTupleDecoder([prefix, item]), ([, value]) => value) + ], + (bytes, offset) => { + if (config.prefix === null && !config.noneValue) { + return Number(offset < bytes.length); } - onFinally() { - if (this.errorHandler) { - this.body.off("error", this.errorHandler); - this.errorHandler = null; - } - if (this.endHandler) { - this.body.off("end", this.endHandler); - this.endHandler = null; - } + if (config.prefix === null && config.noneValue != null) { + const zeroValue = config.noneValue === "zeroes" ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue; + return containsBytes(bytes, zeroValue, offset) ? 0 : 1; } - addHeader(key, value) { - processHeader(this, key, value); - return this; + return Number(prefix.read(bytes, offset)[0]); + } + ); +} +function getNullableCodec(item, config = {}) { + return combineCodec( + getNullableEncoder(item, config), + getNullableDecoder(item, config) + ); +} +function getSetEncoder(item, config = {}) { + return transformEncoder(getArrayEncoder(item, config), (set) => [...set]); +} +function getSetDecoder(item, config = {}) { + return transformDecoder(getArrayDecoder(item, config), (entries) => new Set(entries)); +} +function getSetCodec(item, config = {}) { + return combineCodec(getSetEncoder(item, config), getSetDecoder(item, config)); +} +function getStructEncoder(fields) { + const fieldCodecs = fields.map(([, codec]) => codec); + const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize)); + const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0; + return createEncoder({ + ...fixedSize === null ? { + getSizeFromValue: (value) => fields.map(([key, codec]) => getEncodedSize(value[key], codec)).reduce((all, one) => all + one, 0), + maxSize + } : { fixedSize }, + write: (struct, bytes, offset) => { + fields.forEach(([key, codec]) => { + offset = codec.write(struct[key], bytes, offset); + }); + return offset; + } + }); +} +function getStructDecoder(fields) { + const fieldCodecs = fields.map(([, codec]) => codec); + const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize)); + const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0; + return createDecoder({ + ...fixedSize === null ? { maxSize } : { fixedSize }, + read: (bytes, offset) => { + const struct = {}; + fields.forEach(([key, codec]) => { + const [value, newOffset] = codec.read(bytes, offset); + offset = newOffset; + struct[key] = value; + }); + return [struct, offset]; + } + }); +} +function getStructCodec(fields) { + return combineCodec( + getStructEncoder(fields), + getStructDecoder(fields) + ); +} +var getBase16Decoder2; +var init_index_node8 = __esm({ + "node_modules/@solana/codecs-data-structures/dist/index.node.mjs"() { + "use strict"; + init_index_node2(); + init_index_node7(); + init_index_node(); + getBase16Decoder2 = () => createDecoder({ + read(bytes, offset) { + const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); + return [value, bytes.length]; } - }; - function processHeader(request, key, val) { - if (val && (typeof val === "object" && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`); - } else if (val === void 0) { - return; + }); + } +}); + +// node_modules/@solana/options/dist/index.node.mjs +function unwrapOption(option, fallback) { + if (isSome(option)) return option.value; + return fallback ? fallback() : null; +} +function getOptionEncoder(item, config = {}) { + const prefix = (() => { + if (config.prefix === null) { + return transformEncoder(getUnitEncoder(), (_boolean) => void 0); + } + return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() }); + })(); + const noneValue = (() => { + if (config.noneValue === "zeroes") { + assertIsFixedSize(item); + return fixEncoderSize(getUnitEncoder(), item.fixedSize); + } + if (!config.noneValue) { + return getUnitEncoder(); + } + return getConstantEncoder(config.noneValue); + })(); + return getUnionEncoder( + [ + transformEncoder(getTupleEncoder([prefix, noneValue]), (_value) => [ + false, + void 0 + ]), + transformEncoder(getTupleEncoder([prefix, item]), (value) => [ + true, + isOption(value) && isSome(value) ? value.value : value + ]) + ], + (variant) => { + const option = isOption(variant) ? variant : wrapNullable(variant); + return Number(isSome(option)); + } + ); +} +function getOptionDecoder(item, config = {}) { + const prefix = (() => { + if (config.prefix === null) { + return transformDecoder(getUnitDecoder(), () => false); + } + return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() }); + })(); + const noneValue = (() => { + if (config.noneValue === "zeroes") { + assertIsFixedSize(item); + return fixDecoderSize(getUnitDecoder(), item.fixedSize); + } + if (!config.noneValue) { + return getUnitDecoder(); + } + return getConstantDecoder(config.noneValue); + })(); + return getUnionDecoder( + [ + transformDecoder(getTupleDecoder([prefix, noneValue]), () => none()), + transformDecoder(getTupleDecoder([prefix, item]), ([, value]) => some(value)) + ], + (bytes, offset) => { + if (config.prefix === null && !config.noneValue) { + return Number(offset < bytes.length); } - let headerName = headerNameLowerCasedRecord[key]; - if (headerName === void 0) { - headerName = key.toLowerCase(); - if (headerNameLowerCasedRecord[headerName] === void 0 && !isValidHTTPToken(headerName)) { - throw new InvalidArgumentError("invalid header key"); - } + if (config.prefix === null && config.noneValue != null) { + const zeroValue = config.noneValue === "zeroes" ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue; + return containsBytes(bytes, zeroValue, offset) ? 0 : 1; } - if (Array.isArray(val)) { - const arr = []; - for (let i = 0; i < val.length; i++) { - if (typeof val[i] === "string") { - if (!isValidHeaderValue(val[i])) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - arr.push(val[i]); - } else if (val[i] === null) { - arr.push(""); - } else if (typeof val[i] === "object") { - throw new InvalidArgumentError(`invalid ${key} header`); - } else { - arr.push(`${val[i]}`); - } - } - val = arr; - } else if (typeof val === "string") { - if (!isValidHeaderValue(val)) { - throw new InvalidArgumentError(`invalid ${key} header`); + return Number(prefix.read(bytes, offset)[0]); + } + ); +} +function getOptionCodec(item, config = {}) { + return combineCodec( + getOptionEncoder(item, config), + getOptionDecoder(item, config) + ); +} +function unwrapOptionRecursively(input, fallback) { + if (!input || ArrayBuffer.isView(input)) { + return input; + } + const next = (x) => fallback ? unwrapOptionRecursively(x, fallback) : unwrapOptionRecursively(x); + if (isOption(input)) { + if (isSome(input)) return next(input.value); + return fallback ? fallback() : null; + } + if (Array.isArray(input)) { + return input.map(next); + } + if (typeof input === "object") { + return Object.fromEntries(Object.entries(input).map(([k, v]) => [k, next(v)])); + } + return input; +} +var some, none, isOption, isSome, isNone, wrapNullable; +var init_index_node9 = __esm({ + "node_modules/@solana/options/dist/index.node.mjs"() { + "use strict"; + init_index_node2(); + init_index_node8(); + init_index_node7(); + some = (value) => ({ __option: "Some", value }); + none = () => ({ __option: "None" }); + isOption = (input) => !!(input && typeof input === "object" && "__option" in input && (input.__option === "Some" && "value" in input || input.__option === "None")); + isSome = (option) => option.__option === "Some"; + isNone = (option) => option.__option === "None"; + wrapNullable = (nullable) => nullable !== null ? some(nullable) : none(); + } +}); + +// node_modules/@solana/codecs/dist/index.node.mjs +var init_index_node10 = __esm({ + "node_modules/@solana/codecs/dist/index.node.mjs"() { + "use strict"; + init_index_node2(); + init_index_node8(); + init_index_node7(); + init_index_node3(); + init_index_node9(); + } +}); + +// node_modules/@solana/functional/dist/index.node.mjs +function pipe(init, ...fns) { + return fns.reduce((acc, fn) => fn(acc), init); +} +var init_index_node11 = __esm({ + "node_modules/@solana/functional/dist/index.node.mjs"() { + "use strict"; + } +}); + +// node_modules/@solana/instructions/dist/index.node.mjs +function isInstructionForProgram(instruction, programAddress) { + return instruction.programAddress === programAddress; +} +function assertIsInstructionForProgram(instruction, programAddress) { + if (instruction.programAddress !== programAddress) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, { + actualProgramAddress: instruction.programAddress, + expectedProgramAddress: programAddress + }); + } +} +function isInstructionWithAccounts(instruction) { + return instruction.accounts !== void 0; +} +function assertIsInstructionWithAccounts(instruction) { + if (instruction.accounts === void 0) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, { + data: instruction.data, + programAddress: instruction.programAddress + }); + } +} +function isInstructionWithData(instruction) { + return instruction.data !== void 0; +} +function assertIsInstructionWithData(instruction) { + if (instruction.data === void 0) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, { + accountAddresses: instruction.accounts?.map((a) => a.address), + programAddress: instruction.programAddress + }); + } +} +function downgradeRoleToNonSigner(role) { + return role & ~IS_SIGNER_BITMASK; +} +function downgradeRoleToReadonly(role) { + return role & ~IS_WRITABLE_BITMASK; +} +function isSignerRole(role) { + return role >= 2; +} +function isWritableRole(role) { + return (role & IS_WRITABLE_BITMASK) !== 0; +} +function mergeRoles(roleA, roleB) { + return roleA | roleB; +} +function upgradeRoleToSigner(role) { + return role | IS_SIGNER_BITMASK; +} +function upgradeRoleToWritable(role) { + return role | IS_WRITABLE_BITMASK; +} +var AccountRole, IS_SIGNER_BITMASK, IS_WRITABLE_BITMASK; +var init_index_node12 = __esm({ + "node_modules/@solana/instructions/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + AccountRole = /* @__PURE__ */ ((AccountRole2) => { + AccountRole2[AccountRole2["WRITABLE_SIGNER"] = /* 3 */ + 3] = "WRITABLE_SIGNER"; + AccountRole2[AccountRole2["READONLY_SIGNER"] = /* 2 */ + 2] = "READONLY_SIGNER"; + AccountRole2[AccountRole2["WRITABLE"] = /* 1 */ + 1] = "WRITABLE"; + AccountRole2[AccountRole2["READONLY"] = /* 0 */ + 0] = "READONLY"; + return AccountRole2; + })(AccountRole || {}); + IS_SIGNER_BITMASK = 2; + IS_WRITABLE_BITMASK = 1; + } +}); + +// node_modules/@solana/rpc-types/dist/index.node.mjs +function isBlockhash(putativeBlockhash) { + return isAddress2(putativeBlockhash); +} +function assertIsBlockhash(putativeBlockhash) { + try { + assertIsAddress(putativeBlockhash); + } catch (error) { + if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) { + throw new SolanaError(SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, error.context); + } + if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) { + throw new SolanaError(SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, error.context); + } + throw error; + } +} +function blockhash(putativeBlockhash) { + assertIsBlockhash(putativeBlockhash); + return putativeBlockhash; +} +function getBlockhashEncoder() { + const addressEncoder = getAddressEncoder(); + return createEncoder({ + fixedSize: 32, + write: (value, bytes, offset) => { + assertIsBlockhash(value); + return addressEncoder.write(value, bytes, offset); + } + }); +} +function getBlockhashDecoder() { + return getAddressDecoder(); +} +function getBlockhashCodec() { + return combineCodec(getBlockhashEncoder(), getBlockhashDecoder()); +} +function getBlockhashComparator() { + return new Intl.Collator("en", { + caseFirst: "lower", + ignorePunctuation: false, + localeMatcher: "best fit", + numeric: false, + sensitivity: "variant", + usage: "sort" + }).compare; +} +function mainnet(putativeString) { + return putativeString; +} +function devnet(putativeString) { + return putativeString; +} +function testnet(putativeString) { + return putativeString; +} +function getCommitmentScore(commitment) { + switch (commitment) { + case "finalized": + return 2; + case "confirmed": + return 1; + case "processed": + return 0; + default: + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { + unexpectedValue: commitment + }); + } +} +function commitmentComparator(a, b) { + if (a === b) { + return 0; + } + return getCommitmentScore(a) < getCommitmentScore(b) ? -1 : 1; +} +function getMemoizedU64Encoder() { + if (!memoizedU64Encoder) memoizedU64Encoder = getU64Encoder(); + return memoizedU64Encoder; +} +function getMemoizedU64Decoder() { + if (!memoizedU64Decoder) memoizedU64Decoder = getU64Decoder(); + return memoizedU64Decoder; +} +function isLamports(putativeLamports) { + return putativeLamports >= 0 && putativeLamports <= maxU64Value; +} +function assertIsLamports(putativeLamports) { + if (putativeLamports < 0 || putativeLamports > maxU64Value) { + throw new SolanaError(SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE); + } +} +function lamports(putativeLamports) { + assertIsLamports(putativeLamports); + return putativeLamports; +} +function getDefaultLamportsEncoder() { + return getLamportsEncoder(getMemoizedU64Encoder()); +} +function getLamportsEncoder(innerEncoder) { + return innerEncoder; +} +function getDefaultLamportsDecoder() { + return getLamportsDecoder(getMemoizedU64Decoder()); +} +function getLamportsDecoder(innerDecoder) { + return transformDecoder( + innerDecoder, + (value) => lamports(typeof value === "bigint" ? value : BigInt(value)) + ); +} +function getDefaultLamportsCodec() { + return combineCodec(getDefaultLamportsEncoder(), getDefaultLamportsDecoder()); +} +function getLamportsCodec(innerCodec) { + return combineCodec(getLamportsEncoder(innerCodec), getLamportsDecoder(innerCodec)); +} +function isStringifiedBigInt(putativeBigInt) { + try { + BigInt(putativeBigInt); + return true; + } catch { + return false; + } +} +function assertIsStringifiedBigInt(putativeBigInt) { + try { + BigInt(putativeBigInt); + } catch { + throw new SolanaError(SOLANA_ERROR__MALFORMED_BIGINT_STRING, { + value: putativeBigInt + }); + } +} +function stringifiedBigInt(putativeBigInt) { + assertIsStringifiedBigInt(putativeBigInt); + return putativeBigInt; +} +function isStringifiedNumber(putativeNumber) { + return !Number.isNaN(Number(putativeNumber)); +} +function assertIsStringifiedNumber(putativeNumber) { + if (Number.isNaN(Number(putativeNumber))) { + throw new SolanaError(SOLANA_ERROR__MALFORMED_NUMBER_STRING, { + value: putativeNumber + }); + } +} +function stringifiedNumber(putativeNumber) { + assertIsStringifiedNumber(putativeNumber); + return putativeNumber; +} +function isUnixTimestamp(putativeTimestamp) { + return putativeTimestamp >= minI64Value && putativeTimestamp <= maxI64Value; +} +function assertIsUnixTimestamp(putativeTimestamp) { + if (putativeTimestamp < minI64Value || putativeTimestamp > maxI64Value) { + throw new SolanaError(SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, { + value: putativeTimestamp + }); + } +} +function unixTimestamp(putativeTimestamp) { + assertIsUnixTimestamp(putativeTimestamp); + return putativeTimestamp; +} +var maxU64Value, memoizedU64Encoder, memoizedU64Decoder, maxI64Value, minI64Value; +var init_index_node13 = __esm({ + "node_modules/@solana/rpc-types/dist/index.node.mjs"() { + "use strict"; + init_index_node6(); + init_index_node2(); + init_index_node(); + init_index_node7(); + maxU64Value = 18446744073709551615n; + maxI64Value = 9223372036854775807n; + minI64Value = -9223372036854775808n; + } +}); + +// node_modules/@solana/transaction-messages/dist/index.node.mjs +function isTransactionMessageWithBlockhashLifetime(transactionMessage) { + return "lifetimeConstraint" in transactionMessage && typeof transactionMessage.lifetimeConstraint.blockhash === "string" && typeof transactionMessage.lifetimeConstraint.lastValidBlockHeight === "bigint" && isBlockhash(transactionMessage.lifetimeConstraint.blockhash); +} +function assertIsTransactionMessageWithBlockhashLifetime(transactionMessage) { + if (!isTransactionMessageWithBlockhashLifetime(transactionMessage)) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME); + } +} +function setTransactionMessageLifetimeUsingBlockhash(blockhashLifetimeConstraint, transactionMessage) { + if ("lifetimeConstraint" in transactionMessage && transactionMessage.lifetimeConstraint && "blockhash" in transactionMessage.lifetimeConstraint && transactionMessage.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash && transactionMessage.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight) { + return transactionMessage; + } + return Object.freeze({ + ...transactionMessage, + lifetimeConstraint: Object.freeze(blockhashLifetimeConstraint) + }); +} +function assertValidBaseString2(alphabet4, testValue, givenValue = testValue) { + if (!testValue.match(new RegExp(`^[${alphabet4}]*$`))) { + throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, { + alphabet: alphabet4, + base: alphabet4.length, + value: givenValue + }); + } +} +function partitionLeadingZeroes2(value, zeroCharacter) { + const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`)); + return [leadingZeros, tailChars]; +} +function getBigIntFromBaseX2(value, alphabet4) { + const base2 = BigInt(alphabet4.length); + let sum = 0n; + for (const char of value) { + sum *= base2; + sum += BigInt(alphabet4.indexOf(char)); + } + return sum; +} +function getBaseXFromBigInt2(value, alphabet4) { + const base2 = BigInt(alphabet4.length); + const tailChars = []; + while (value > 0n) { + tailChars.unshift(alphabet4[Number(value % base2)]); + value /= base2; + } + return tailChars.join(""); +} +function getAddressTableLookupEncoder() { + if (!memoizedAddressTableLookupEncoder) { + const indexEncoder = getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() }); + memoizedAddressTableLookupEncoder = getStructEncoder([ + ["lookupTableAddress", getAddressEncoder()], + ["writableIndexes", indexEncoder], + ["readonlyIndexes", indexEncoder] + ]); + } + return memoizedAddressTableLookupEncoder; +} +function getAddressTableLookupDecoder() { + if (!memoizedAddressTableLookupDecoder) { + const indexEncoder = getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() }); + memoizedAddressTableLookupDecoder = getStructDecoder([ + ["lookupTableAddress", getAddressDecoder()], + ["writableIndexes", indexEncoder], + ["readonlyIndexes", indexEncoder] + ]); + } + return memoizedAddressTableLookupDecoder; +} +function getMemoizedU8Encoder() { + if (!memoizedU8Encoder) memoizedU8Encoder = getU8Encoder(); + return memoizedU8Encoder; +} +function getMemoizedU8Decoder() { + if (!memoizedU8Decoder) memoizedU8Decoder = getU8Decoder(); + return memoizedU8Decoder; +} +function getMessageHeaderEncoder() { + return getStructEncoder([ + ["numSignerAccounts", getMemoizedU8Encoder()], + ["numReadonlySignerAccounts", getMemoizedU8Encoder()], + ["numReadonlyNonSignerAccounts", getMemoizedU8Encoder()] + ]); +} +function getMessageHeaderDecoder() { + return getStructDecoder([ + ["numSignerAccounts", getMemoizedU8Decoder()], + ["numReadonlySignerAccounts", getMemoizedU8Decoder()], + ["numReadonlyNonSignerAccounts", getMemoizedU8Decoder()] + ]); +} +function getInstructionEncoder() { + if (!memoizedGetInstructionEncoder) { + memoizedGetInstructionEncoder = transformEncoder( + getStructEncoder([ + ["programAddressIndex", getU8Encoder()], + ["accountIndices", getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() })], + ["data", addEncoderSizePrefix(getBytesEncoder(), getShortU16Encoder())] + ]), + // Convert an instruction to have all fields defined + (instruction) => { + if (instruction.accountIndices !== void 0 && instruction.data !== void 0) { + return instruction; } - } else if (val === null) { - val = ""; - } else { - val = `${val}`; + return { + ...instruction, + accountIndices: instruction.accountIndices ?? [], + data: instruction.data ?? new Uint8Array(0) + }; } - if (headerName === "host") { - if (request.host !== null) { - throw new InvalidArgumentError("duplicate host header"); - } - if (typeof val !== "string") { - throw new InvalidArgumentError("invalid host header"); - } - request.host = val; - } else if (headerName === "content-length") { - if (request.contentLength !== null) { - throw new InvalidArgumentError("duplicate content-length header"); - } - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError("invalid content-length header"); - } - } else if (request.contentType === null && headerName === "content-type") { - request.contentType = val; - request.headers.push(key, val); - } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") { - throw new InvalidArgumentError(`invalid ${headerName} header`); - } else if (headerName === "connection") { - const value = typeof val === "string" ? val : null; - if (value === null) { - throw new InvalidArgumentError("invalid connection header"); - } - for (const token of value.toLowerCase().split(",")) { - const trimmed = token.trim(); - if (!isValidHTTPToken(trimmed)) { - throw new InvalidArgumentError("invalid connection header"); - } - if (trimmed === "close") { - request.reset = true; - } + ); + } + return memoizedGetInstructionEncoder; +} +function getInstructionDecoder() { + if (!memoizedGetInstructionDecoder) { + memoizedGetInstructionDecoder = transformDecoder( + getStructDecoder([ + ["programAddressIndex", getU8Decoder()], + ["accountIndices", getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() })], + [ + "data", + addDecoderSizePrefix(getBytesDecoder(), getShortU16Decoder()) + ] + ]), + // Convert an instruction to exclude optional fields if they are empty + (instruction) => { + if (instruction.accountIndices.length && instruction.data.byteLength) { + return instruction; } - } else if (headerName === "expect") { - throw new NotSupportedError("expect header not supported"); - } else { - request.headers.push(key, val); + const { accountIndices, data, ...rest } = instruction; + return { + ...rest, + ...accountIndices.length ? { accountIndices } : null, + ...data.byteLength ? { data } : null + }; } - } - module.exports = Request2; + ); } -}); - -// node_modules/undici/lib/dispatcher/dispatcher.js -var require_dispatcher = __commonJS({ - "node_modules/undici/lib/dispatcher/dispatcher.js"(exports, module) { - "use strict"; - var EventEmitter = __require("events"); - var Dispatcher = class extends EventEmitter { - dispatch() { - throw new Error("not implemented"); + return memoizedGetInstructionDecoder; +} +function getTransactionVersionEncoder() { + return createEncoder({ + getSizeFromValue: (value) => value === "legacy" ? 0 : 1, + maxSize: 1, + write: (value, bytes, offset) => { + if (value === "legacy") { + return offset; } - close() { - throw new Error("not implemented"); + if (value < 0 || value > 127) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, { + actualVersion: value + }); } - destroy() { - throw new Error("not implemented"); + if (value > MAX_SUPPORTED_TRANSACTION_VERSION) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, { + unsupportedVersion: value + }); } - compose(...args) { - const interceptors = Array.isArray(args[0]) ? args[0] : args; - let dispatch = this.dispatch.bind(this); - for (const interceptor of interceptors) { - if (interceptor == null) { - continue; - } - if (typeof interceptor !== "function") { - throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`); - } - dispatch = interceptor(dispatch); - if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) { - throw new TypeError("invalid interceptor"); - } + bytes.set([value | VERSION_FLAG_MASK], offset); + return offset + 1; + } + }); +} +function getTransactionVersionDecoder() { + return createDecoder({ + maxSize: 1, + read: (bytes, offset) => { + const firstByte = bytes[offset]; + if ((firstByte & VERSION_FLAG_MASK) === 0) { + return ["legacy", offset]; + } else { + const version4 = firstByte ^ VERSION_FLAG_MASK; + if (version4 > MAX_SUPPORTED_TRANSACTION_VERSION) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, { + unsupportedVersion: version4 + }); } - return new Proxy(this, { - get: (target, key) => key === "dispatch" ? dispatch : target[key] - }); + return [version4, offset + 1]; } - }; - module.exports = Dispatcher; - } -}); - -// node_modules/undici/lib/dispatcher/dispatcher-base.js -var require_dispatcher_base = __commonJS({ - "node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports, module) { - "use strict"; - var Dispatcher = require_dispatcher(); - var { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = require_errors(); - var { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require_symbols(); - var kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed"); - var kOnClosed = /* @__PURE__ */ Symbol("onClosed"); - var kWebSocketOptions = /* @__PURE__ */ Symbol("webSocketOptions"); - var DispatcherBase = class extends Dispatcher { - /** @type {boolean} */ - [kDestroyed] = false; - /** @type {Array|null} */ - [kOnClosed] = null; - /** - * @param {import('../../types/dispatcher').DispatcherOptions} [opts] - */ - constructor(opts) { - super(); - this[kWebSocketOptions] = opts?.webSocket ?? {}; + } + }); +} +function getTransactionVersionCodec() { + return combineCodec(getTransactionVersionEncoder(), getTransactionVersionDecoder()); +} +function getCompiledMessageLegacyEncoder() { + return getStructEncoder(getPreludeStructEncoderTuple()); +} +function getCompiledMessageVersionedEncoder() { + return transformEncoder( + getStructEncoder([ + ...getPreludeStructEncoderTuple(), + ["addressTableLookups", getAddressTableLookupArrayEncoder()] + ]), + (value) => { + if (value.version === "legacy") { + return value; } - /** - * @returns {import('../../types/dispatcher').WebSocketOptions} - */ - get webSocketOptions() { - return { - maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 - // 128 MB default - }; + return { + ...value, + addressTableLookups: value.addressTableLookups ?? [] + }; + } + ); +} +function getPreludeStructEncoderTuple() { + const lifetimeTokenEncoder = getUnionEncoder( + [ + // Use a 32-byte constant encoder for a missing lifetime token (index 0). + getConstantEncoder(new Uint8Array(32)), + // Use a 32-byte base58 encoder for a valid lifetime token (index 1). + fixEncoderSize(getBase58Encoder2(), 32) + ], + (value) => value === void 0 ? 0 : 1 + ); + return [ + ["version", getTransactionVersionEncoder()], + ["header", getMessageHeaderEncoder()], + ["staticAccounts", getArrayEncoder(getAddressEncoder(), { size: getShortU16Encoder() })], + ["lifetimeToken", lifetimeTokenEncoder], + ["instructions", getArrayEncoder(getInstructionEncoder(), { size: getShortU16Encoder() })] + ]; +} +function getPreludeStructDecoderTuple() { + return [ + ["version", getTransactionVersionDecoder()], + ["header", getMessageHeaderDecoder()], + ["staticAccounts", getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() })], + ["lifetimeToken", fixDecoderSize(getBase58Decoder2(), 32)], + ["instructions", getArrayDecoder(getInstructionDecoder(), { size: getShortU16Decoder() })], + ["addressTableLookups", getAddressTableLookupArrayDecoder()] + ]; +} +function getAddressTableLookupArrayEncoder() { + return getArrayEncoder(getAddressTableLookupEncoder(), { size: getShortU16Encoder() }); +} +function getAddressTableLookupArrayDecoder() { + return getArrayDecoder(getAddressTableLookupDecoder(), { size: getShortU16Decoder() }); +} +function getCompiledTransactionMessageEncoder() { + return createEncoder({ + getSizeFromValue: (compiledMessage) => { + if (compiledMessage.version === "legacy") { + return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage); + } else { + return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage); } - /** @returns {boolean} */ - get destroyed() { - return this[kDestroyed]; + }, + write: (compiledMessage, bytes, offset) => { + if (compiledMessage.version === "legacy") { + return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset); + } else { + return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset); } - /** @returns {boolean} */ - get closed() { - return this[kClosed]; + } + }); +} +function getCompiledTransactionMessageDecoder() { + return transformDecoder( + getStructDecoder(getPreludeStructDecoderTuple()), + ({ addressTableLookups, ...restOfMessage }) => { + if (restOfMessage.version === "legacy" || !addressTableLookups?.length) { + return restOfMessage; } - close(callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); + return { ...restOfMessage, addressTableLookups }; + } + ); +} +function getCompiledTransactionMessageCodec() { + return combineCodec(getCompiledTransactionMessageEncoder(), getCompiledTransactionMessageDecoder()); +} +function upsert(addressMap, address2, update) { + addressMap[address2] = update(addressMap[address2] ?? { role: AccountRole.READONLY }); +} +function getAddressMapFromInstructions(feePayer, instructions) { + const addressMap = { + [feePayer]: { [TYPE2]: 0, role: AccountRole.WRITABLE_SIGNER } + }; + const addressesOfInvokedPrograms = /* @__PURE__ */ new Set(); + for (const instruction of instructions) { + upsert(addressMap, instruction.programAddress, (entry) => { + addressesOfInvokedPrograms.add(instruction.programAddress); + if (TYPE2 in entry) { + if (isWritableRole(entry.role)) { + switch (entry[TYPE2]) { + case 0: + throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, { + programAddress: instruction.programAddress + }); + default: + throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, { + programAddress: instruction.programAddress + }); + } } - if (this[kDestroyed]) { - const err = new ClientDestroyedError(); - queueMicrotask(() => callback(err, null)); - return; + if (entry[TYPE2] === 2) { + return entry; } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); + } + return { [TYPE2]: 2, role: AccountRole.READONLY }; + }); + let addressComparator; + if (!instruction.accounts) { + continue; + } + for (const account of instruction.accounts) { + upsert(addressMap, account.address, (entry) => { + const { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + address: _, + ...accountMeta + } = account; + if (TYPE2 in entry) { + switch (entry[TYPE2]) { + case 0: + return entry; + case 1: { + const nextRole = mergeRoles(entry.role, accountMeta.role); + if ("lookupTableAddress" in accountMeta) { + const shouldReplaceEntry = ( + // Consider using the new LOOKUP_TABLE if its address is different... + entry.lookupTableAddress !== accountMeta.lookupTableAddress && // ...and sorts before the existing one. + (addressComparator ||= getAddressComparator())( + accountMeta.lookupTableAddress, + entry.lookupTableAddress + ) < 0 + ); + if (shouldReplaceEntry) { + return { + [TYPE2]: 1, + ...accountMeta, + role: nextRole + }; + } + } else if (isSignerRole(accountMeta.role)) { + return { + [TYPE2]: 2, + role: nextRole + }; + } + if (entry.role !== nextRole) { + return { + ...entry, + role: nextRole + }; + } else { + return entry; + } + } + case 2: { + const nextRole = mergeRoles(entry.role, accountMeta.role); + if ( + // Check to see if this address represents a program that is invoked + // in this transaction. + addressesOfInvokedPrograms.has(account.address) + ) { + if (isWritableRole(accountMeta.role)) { + throw new SolanaError( + SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, + { + programAddress: account.address + } + ); + } + if (entry.role !== nextRole) { + return { + ...entry, + role: nextRole + }; + } else { + return entry; + } + } else if ("lookupTableAddress" in accountMeta && // Static accounts can be 'upgraded' to lookup table accounts as + // long as they are not require to sign the transaction. + !isSignerRole(entry.role)) { + return { + ...accountMeta, + [TYPE2]: 1, + role: nextRole + }; + } else { + if (entry.role !== nextRole) { + return { + ...entry, + role: nextRole + }; + } else { + return entry; + } + } + } } - return; } - this[kClosed] = true; - this[kOnClosed] ??= []; - this[kOnClosed].push(callback); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } + if ("lookupTableAddress" in accountMeta) { + return { + ...accountMeta, + [TYPE2]: 1 + /* LOOKUP_TABLE */ + }; + } else { + return { + ...accountMeta, + [TYPE2]: 2 + /* STATIC */ + }; + } + }); + } + } + return addressMap; +} +function getOrderedAccountsFromAddressMap(addressMap) { + let addressComparator; + const orderedAccounts = Object.entries(addressMap).sort(([leftAddress, leftEntry], [rightAddress, rightEntry]) => { + if (leftEntry[TYPE2] !== rightEntry[TYPE2]) { + if (leftEntry[TYPE2] === 0) { + return -1; + } else if (rightEntry[TYPE2] === 0) { + return 1; + } else if (leftEntry[TYPE2] === 2) { + return -1; + } else if (rightEntry[TYPE2] === 2) { + return 1; + } + } + const leftIsSigner = isSignerRole(leftEntry.role); + if (leftIsSigner !== isSignerRole(rightEntry.role)) { + return leftIsSigner ? -1 : 1; + } + const leftIsWritable = isWritableRole(leftEntry.role); + if (leftIsWritable !== isWritableRole(rightEntry.role)) { + return leftIsWritable ? -1 : 1; + } + addressComparator ||= getAddressComparator(); + if (leftEntry[TYPE2] === 1 && rightEntry[TYPE2] === 1 && leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress) { + return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress); + } else { + return addressComparator(leftAddress, rightAddress); + } + }).map(([address2, addressMeta]) => ({ + address: address2, + ...addressMeta + })); + return orderedAccounts; +} +function getCompiledAddressTableLookups(orderedAccounts) { + const index2 = {}; + for (const account of orderedAccounts) { + if (!("lookupTableAddress" in account)) { + continue; + } + const entry = index2[account.lookupTableAddress] ||= { + readonlyIndexes: [], + writableIndexes: [] + }; + if (account.role === AccountRole.WRITABLE) { + entry.writableIndexes.push(account.addressIndex); + } else { + entry.readonlyIndexes.push(account.addressIndex); + } + } + return Object.keys(index2).sort(getAddressComparator()).map((lookupTableAddress) => ({ + lookupTableAddress, + ...index2[lookupTableAddress] + })); +} +function getCompiledMessageHeader(orderedAccounts) { + let numReadonlyNonSignerAccounts = 0; + let numReadonlySignerAccounts = 0; + let numSignerAccounts = 0; + for (const account of orderedAccounts) { + if ("lookupTableAddress" in account) { + break; + } + const accountIsWritable = isWritableRole(account.role); + if (isSignerRole(account.role)) { + numSignerAccounts++; + if (!accountIsWritable) { + numReadonlySignerAccounts++; + } + } else if (!accountIsWritable) { + numReadonlyNonSignerAccounts++; + } + } + return { + numReadonlyNonSignerAccounts, + numReadonlySignerAccounts, + numSignerAccounts + }; +} +function getAccountIndex(orderedAccounts) { + const out = {}; + for (const [index2, account] of orderedAccounts.entries()) { + out[account.address] = index2; + } + return out; +} +function getCompiledInstructions(instructions, orderedAccounts) { + const accountIndex = getAccountIndex(orderedAccounts); + return instructions.map(({ accounts, data, programAddress }) => { + return { + programAddressIndex: accountIndex[programAddress], + ...accounts ? { accountIndices: accounts.map(({ address: address2 }) => accountIndex[address2]) } : null, + ...data ? { data } : null + }; + }); +} +function getCompiledLifetimeToken(lifetimeConstraint) { + if ("nonce" in lifetimeConstraint) { + return lifetimeConstraint.nonce; + } + return lifetimeConstraint.blockhash; +} +function getCompiledStaticAccounts(orderedAccounts) { + const firstLookupTableAccountIndex = orderedAccounts.findIndex((account) => "lookupTableAddress" in account); + const orderedStaticAccounts = firstLookupTableAccountIndex === -1 ? orderedAccounts : orderedAccounts.slice(0, firstLookupTableAccountIndex); + return orderedStaticAccounts.map(({ address: address2 }) => address2); +} +function compileTransactionMessage(transactionMessage) { + const addressMap = getAddressMapFromInstructions( + transactionMessage.feePayer.address, + transactionMessage.instructions + ); + const orderedAccounts = getOrderedAccountsFromAddressMap(addressMap); + const lifetimeConstraint = transactionMessage.lifetimeConstraint; + return { + ...transactionMessage.version !== "legacy" ? { addressTableLookups: getCompiledAddressTableLookups(orderedAccounts) } : null, + ...lifetimeConstraint ? { lifetimeToken: getCompiledLifetimeToken(lifetimeConstraint) } : null, + header: getCompiledMessageHeader(orderedAccounts), + instructions: getCompiledInstructions(transactionMessage.instructions, orderedAccounts), + staticAccounts: getCompiledStaticAccounts(orderedAccounts), + version: transactionMessage.version + }; +} +function findAddressInLookupTables(address2, role, addressesByLookupTableAddress) { + for (const [lookupTableAddress, addresses] of Object.entries(addressesByLookupTableAddress)) { + for (let i = 0; i < addresses.length; i++) { + if (address2 === addresses[i]) { + return { + address: address2, + addressIndex: i, + lookupTableAddress, + role }; - this[kClose]().then(() => this.destroy()).then(() => queueMicrotask(onClosed)); } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? reject(err2) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - if (!err) { - err = new ClientDestroyedError(); - } - this[kDestroyed] = true; - this[kOnDestroyed] ??= []; - this[kOnDestroyed].push(callback); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kDestroy](err).then(() => queueMicrotask(onDestroyed)); + } + } +} +function compressTransactionMessageUsingAddressLookupTables(transactionMessage, addressesByLookupTableAddress) { + const programAddresses = new Set(transactionMessage.instructions.map((ix) => ix.programAddress)); + const eligibleLookupAddresses = new Set( + Object.values(addressesByLookupTableAddress).flatMap((a) => a).filter((address2) => !programAddresses.has(address2)) + ); + const newInstructions = []; + let updatedAnyInstructions = false; + for (const instruction of transactionMessage.instructions) { + if (!instruction.accounts) { + newInstructions.push(instruction); + continue; + } + const newAccounts = []; + let updatedAnyAccounts = false; + for (const account of instruction.accounts) { + if ("lookupTableAddress" in account || !eligibleLookupAddresses.has(account.address) || isSignerRole(account.role)) { + newAccounts.push(account); + continue; } - dispatch(opts, handler) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); - } - if (opts.dispatcher) { - throw new InvalidArgumentError("opts.dispatcher is not supported by instance methods. Pass opts.dispatcher to the top-level undici functions or call the dispatcher instance method directly."); - } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError(); - } - if (this[kClosed]) { - throw new ClientClosedError(); - } - return this[kDispatch](opts, handler); - } catch (err) { - if (typeof handler.onResponseError !== "function") { - throw err; - } - handler.onResponseError(null, err); - return false; - } + const lookupMetaAccount = findAddressInLookupTables( + account.address, + account.role, + addressesByLookupTableAddress + ); + newAccounts.push(Object.freeze(lookupMetaAccount)); + updatedAnyAccounts = true; + updatedAnyInstructions = true; + } + newInstructions.push( + Object.freeze(updatedAnyAccounts ? { ...instruction, accounts: newAccounts } : instruction) + ); + } + return Object.freeze( + updatedAnyInstructions ? { ...transactionMessage, instructions: newInstructions } : transactionMessage + ); +} +function createTransactionMessage(config) { + return Object.freeze({ + instructions: Object.freeze([]), + version: config.version + }); +} +function createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress) { + return { + accounts: [ + { address: nonceAccountAddress, role: AccountRole.WRITABLE }, + { + address: RECENT_BLOCKHASHES_SYSVAR_ADDRESS, + role: AccountRole.READONLY + }, + { address: nonceAuthorityAddress, role: AccountRole.READONLY_SIGNER } + ], + data: new Uint8Array([4, 0, 0, 0]), + programAddress: SYSTEM_PROGRAM_ADDRESS + }; +} +function isAdvanceNonceAccountInstruction(instruction) { + return instruction.programAddress === SYSTEM_PROGRAM_ADDRESS && // Test for `AdvanceNonceAccount` instruction data + instruction.data != null && isAdvanceNonceAccountInstructionData(instruction.data) && // Test for exactly 3 accounts + instruction.accounts?.length === 3 && // First account is nonce account address + instruction.accounts[0].address != null && instruction.accounts[0].role === AccountRole.WRITABLE && // Second account is recent blockhashes sysvar + instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS && instruction.accounts[1].role === AccountRole.READONLY && // Third account is nonce authority account + instruction.accounts[2].address != null && isSignerRole(instruction.accounts[2].role); +} +function isAdvanceNonceAccountInstructionData(data) { + return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0; +} +function isTransactionMessageWithDurableNonceLifetime(transactionMessage) { + return "lifetimeConstraint" in transactionMessage && typeof transactionMessage.lifetimeConstraint.nonce === "string" && transactionMessage.instructions[0] != null && isAdvanceNonceAccountInstruction(transactionMessage.instructions[0]); +} +function assertIsTransactionMessageWithDurableNonceLifetime(transactionMessage) { + if (!isTransactionMessageWithDurableNonceLifetime(transactionMessage)) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME); + } +} +function isAdvanceNonceAccountInstructionForNonce(instruction, nonceAccountAddress, nonceAuthorityAddress) { + return instruction.accounts[0].address === nonceAccountAddress && instruction.accounts[2].address === nonceAuthorityAddress; +} +function setTransactionMessageLifetimeUsingDurableNonce({ + nonce, + nonceAccountAddress, + nonceAuthorityAddress +}, transactionMessage) { + let newInstructions; + const firstInstruction = transactionMessage.instructions[0]; + if (firstInstruction && isAdvanceNonceAccountInstruction(firstInstruction)) { + if (isAdvanceNonceAccountInstructionForNonce(firstInstruction, nonceAccountAddress, nonceAuthorityAddress)) { + if (isTransactionMessageWithDurableNonceLifetime(transactionMessage) && transactionMessage.lifetimeConstraint.nonce === nonce) { + return transactionMessage; + } else { + newInstructions = [firstInstruction, ...transactionMessage.instructions.slice(1)]; } + } else { + newInstructions = [ + Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)), + ...transactionMessage.instructions.slice(1) + ]; + } + } else { + newInstructions = [ + Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)), + ...transactionMessage.instructions + ]; + } + return Object.freeze({ + ...transactionMessage, + instructions: Object.freeze(newInstructions), + lifetimeConstraint: Object.freeze({ nonce }) + }); +} +function setTransactionMessageFeePayer(feePayer, transactionMessage) { + if ("feePayer" in transactionMessage && feePayer === transactionMessage.feePayer?.address && isAddressOnlyFeePayer(transactionMessage.feePayer)) { + return transactionMessage; + } + const out = { + ...transactionMessage, + feePayer: Object.freeze({ address: feePayer }) + }; + Object.freeze(out); + return out; +} +function isAddressOnlyFeePayer(feePayer) { + return !!feePayer && "address" in feePayer && typeof feePayer.address === "string" && Object.keys(feePayer).length === 1; +} +function appendTransactionMessageInstruction(instruction, transactionMessage) { + return appendTransactionMessageInstructions([instruction], transactionMessage); +} +function appendTransactionMessageInstructions(instructions, transactionMessage) { + return Object.freeze({ + ...transactionMessage, + instructions: Object.freeze([ + ...transactionMessage.instructions, + ...instructions + ]) + }); +} +function prependTransactionMessageInstruction(instruction, transactionMessage) { + return prependTransactionMessageInstructions([instruction], transactionMessage); +} +function prependTransactionMessageInstructions(instructions, transactionMessage) { + return Object.freeze({ + ...transactionMessage, + instructions: Object.freeze([ + ...instructions, + ...transactionMessage.instructions + ]) + }); +} +function getAccountMetas(message) { + const { header } = message; + const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts; + const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts; + const accountMetas = []; + let accountIndex = 0; + for (let i = 0; i < numWritableSignerAccounts; i++) { + accountMetas.push({ + address: message.staticAccounts[accountIndex], + role: AccountRole.WRITABLE_SIGNER + }); + accountIndex++; + } + for (let i = 0; i < header.numReadonlySignerAccounts; i++) { + accountMetas.push({ + address: message.staticAccounts[accountIndex], + role: AccountRole.READONLY_SIGNER + }); + accountIndex++; + } + for (let i = 0; i < numWritableNonSignerAccounts; i++) { + accountMetas.push({ + address: message.staticAccounts[accountIndex], + role: AccountRole.WRITABLE + }); + accountIndex++; + } + for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) { + accountMetas.push({ + address: message.staticAccounts[accountIndex], + role: AccountRole.READONLY + }); + accountIndex++; + } + return accountMetas; +} +function getAddressLookupMetas(compiledAddressTableLookups, addressesByLookupTableAddress) { + const compiledAddressTableLookupAddresses = compiledAddressTableLookups.map((l2) => l2.lookupTableAddress); + const missing = compiledAddressTableLookupAddresses.filter((a) => addressesByLookupTableAddress[a] === void 0); + if (missing.length > 0) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, { + lookupTableAddresses: missing + }); + } + const readOnlyMetas = []; + const writableMetas = []; + for (const lookup of compiledAddressTableLookups) { + const addresses = addressesByLookupTableAddress[lookup.lookupTableAddress]; + const readonlyIndexes = lookup.readonlyIndexes; + const writableIndexes = lookup.writableIndexes; + const highestIndex = Math.max(...readonlyIndexes, ...writableIndexes); + if (highestIndex >= addresses.length) { + throw new SolanaError( + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE, + { + highestKnownIndex: addresses.length - 1, + highestRequestedIndex: highestIndex, + lookupTableAddress: lookup.lookupTableAddress + } + ); + } + const readOnlyForLookup = readonlyIndexes.map((r) => ({ + address: addresses[r], + addressIndex: r, + lookupTableAddress: lookup.lookupTableAddress, + role: AccountRole.READONLY + })); + readOnlyMetas.push(...readOnlyForLookup); + const writableForLookup = writableIndexes.map((w) => ({ + address: addresses[w], + addressIndex: w, + lookupTableAddress: lookup.lookupTableAddress, + role: AccountRole.WRITABLE + })); + writableMetas.push(...writableForLookup); + } + return [...writableMetas, ...readOnlyMetas]; +} +function convertInstruction(instruction, accountMetas) { + const programAddress = accountMetas[instruction.programAddressIndex]?.address; + if (!programAddress) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, { + index: instruction.programAddressIndex + }); + } + const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]); + const { data } = instruction; + return Object.freeze({ + programAddress, + ...accounts && accounts.length ? { accounts: Object.freeze(accounts) } : {}, + ...data && data.length ? { data } : {} + }); +} +function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) { + if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) { + return { + blockhash: messageLifetimeToken, + lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n + // U64 MAX + }; + } else { + const nonceAccountAddress = firstInstruction.accounts[0].address; + assertIsAddress(nonceAccountAddress); + const nonceAuthorityAddress = firstInstruction.accounts[2].address; + assertIsAddress(nonceAuthorityAddress); + return { + nonce: messageLifetimeToken, + nonceAccountAddress, + nonceAuthorityAddress }; - module.exports = DispatcherBase; } -}); - -// node_modules/undici/lib/core/connect.js -var require_connect = __commonJS({ - "node_modules/undici/lib/core/connect.js"(exports, module) { +} +function decompileTransactionMessage(compiledTransactionMessage, config) { + const feePayer = compiledTransactionMessage.staticAccounts[0]; + if (!feePayer) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING); + } + const accountMetas = getAccountMetas(compiledTransactionMessage); + const accountLookupMetas = "addressTableLookups" in compiledTransactionMessage && compiledTransactionMessage.addressTableLookups !== void 0 && compiledTransactionMessage.addressTableLookups.length > 0 ? getAddressLookupMetas( + compiledTransactionMessage.addressTableLookups, + config?.addressesByLookupTableAddress ?? {} + ) : []; + const transactionMetas = [...accountMetas, ...accountLookupMetas]; + const instructions = compiledTransactionMessage.instructions.map( + (compiledInstruction) => convertInstruction(compiledInstruction, transactionMetas) + ); + const firstInstruction = instructions[0]; + const lifetimeConstraint = getLifetimeConstraint( + compiledTransactionMessage.lifetimeToken, + firstInstruction, + config?.lastValidBlockHeight + ); + return pipe( + createTransactionMessage({ version: compiledTransactionMessage.version }), + (m) => setTransactionMessageFeePayer(feePayer, m), + (m) => instructions.reduce( + (acc, instruction) => appendTransactionMessageInstruction(instruction, acc), + m + ), + (m) => "blockhash" in lifetimeConstraint ? setTransactionMessageLifetimeUsingBlockhash(lifetimeConstraint, m) : setTransactionMessageLifetimeUsingDurableNonce(lifetimeConstraint, m) + ); +} +var getBaseXEncoder2, getBaseXDecoder2, alphabet23, getBase58Encoder2, getBase58Decoder2, memoizedAddressTableLookupEncoder, memoizedAddressTableLookupDecoder, memoizedU8Encoder, memoizedU8Decoder, memoizedGetInstructionEncoder, memoizedGetInstructionDecoder, MAX_SUPPORTED_TRANSACTION_VERSION, VERSION_FLAG_MASK, TYPE2, RECENT_BLOCKHASHES_SYSVAR_ADDRESS, SYSTEM_PROGRAM_ADDRESS; +var init_index_node14 = __esm({ + "node_modules/@solana/transaction-messages/dist/index.node.mjs"() { "use strict"; - var net = __require("net"); - var assert8 = __require("assert"); - var util2 = require_util(); - var { InvalidArgumentError } = require_errors(); - var tls; - var SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - this._sessionRegistry = new FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return; + init_index_node(); + init_index_node13(); + init_index_node6(); + init_index_node2(); + init_index_node8(); + init_index_node7(); + init_index_node12(); + init_index_node11(); + getBaseXEncoder2 = (alphabet4) => { + return createEncoder({ + getSizeFromValue: (value) => { + const [leadingZeroes, tailChars] = partitionLeadingZeroes2(value, alphabet4[0]); + if (!tailChars) return value.length; + const base10Number = getBigIntFromBaseX2(tailChars, alphabet4); + return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2); + }, + write(value, bytes, offset) { + assertValidBaseString2(alphabet4, value); + if (value === "") return offset; + const [leadingZeroes, tailChars] = partitionLeadingZeroes2(value, alphabet4[0]); + if (!tailChars) { + bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset); + return offset + leadingZeroes.length; } - const ref = this._sessionCache.get(key); - if (ref !== void 0 && ref.deref() === void 0) { - this._sessionCache.delete(key); + let base10Number = getBigIntFromBaseX2(tailChars, alphabet4); + const tailBytes = []; + while (base10Number > 0n) { + tailBytes.unshift(Number(base10Number % 256n)); + base10Number /= 256n; } - }); - } - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null; - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; + const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes]; + bytes.set(bytesToAdd, offset); + return offset + bytesToAdd.length; } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } + }); }; - function buildConnector({ allowH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); - } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 1e4 : timeout; - allowH2 = allowH2 != null ? allowH2 : true; - return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === "https:") { - if (!tls) { - tls = __require("tls"); - } - servername = servername || options.servername || util2.getServerName(host) || null; - const sessionKey = servername || hostname; - assert8(sessionKey); - const session = customSession || sessionCache.get(sessionKey) || null; - port = port || 443; - socket = tls.connect({ - highWaterMark: 16384, - // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], - socket: httpSocket, - // upgrade socket connection - port, - host: hostname - }); - socket.on("session", function(session2) { - sessionCache.set(sessionKey, session2); - }); - } else { - assert8(!httpSocket, "httpSocket can only be sent on TLS update"); - port = port || 80; - socket = net.connect({ - highWaterMark: 64 * 1024, - // Same as nodejs fs streams. - ...options, - localAddress, - port, - host: hostname - }); - if (useH2c === true) { - socket.alpnProtocol = "h2"; - } - } - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); - } - const clearConnectTimeout = util2.setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }); - socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { - queueMicrotask(clearConnectTimeout); - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }).on("error", function(err) { - queueMicrotask(clearConnectTimeout); - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); - return socket; - }; - } - module.exports = buildConnector; + getBaseXDecoder2 = (alphabet4) => { + return createDecoder({ + read(rawBytes, offset) { + const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset); + if (bytes.length === 0) return ["", 0]; + let trailIndex = bytes.findIndex((n) => n !== 0); + trailIndex = trailIndex === -1 ? bytes.length : trailIndex; + const leadingZeroes = alphabet4[0].repeat(trailIndex); + if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length]; + const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n); + const tailChars = getBaseXFromBigInt2(base10Number, alphabet4); + return [leadingZeroes + tailChars, rawBytes.length]; + } + }); + }; + alphabet23 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + getBase58Encoder2 = () => getBaseXEncoder2(alphabet23); + getBase58Decoder2 = () => getBaseXDecoder2(alphabet23); + MAX_SUPPORTED_TRANSACTION_VERSION = 0; + VERSION_FLAG_MASK = 128; + TYPE2 = /* @__PURE__ */ Symbol("AddressMapTypeProperty"); + RECENT_BLOCKHASHES_SYSVAR_ADDRESS = "SysvarRecentB1ockHashes11111111111111111111"; + SYSTEM_PROGRAM_ADDRESS = "11111111111111111111111111111111"; } }); -// node_modules/undici/lib/llhttp/utils.js -var require_utils = __commonJS({ - "node_modules/undici/lib/llhttp/utils.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.enumToMap = enumToMap; - function enumToMap(obj, filter = [], exceptions = []) { - const emptyFilter = (filter?.length ?? 0) === 0; - const emptyExceptions = (exceptions?.length ?? 0) === 0; - return Object.fromEntries(Object.entries(obj).filter(([, value]) => { - return typeof value === "number" && (emptyFilter || filter.includes(value)) && (emptyExceptions || !exceptions.includes(value)); - })); - } +// node_modules/@solana/keys/dist/index.node.mjs +function addPkcs8Header(bytes) { + return new Uint8Array([ + /** + * PKCS#8 header + */ + 48, + // ASN.1 sequence tag + 46, + // Length of sequence (46 more bytes) + 2, + // ASN.1 integer tag + 1, + // Length of integer + 0, + // Version number + 48, + // ASN.1 sequence tag + 5, + // Length of sequence + 6, + // ASN.1 object identifier tag + 3, + // Length of object identifier + // Edwards curve algorithms identifier https://oid-rep.orange-labs.fr/get/1.3.101.112 + 43, + // iso(1) / identified-organization(3) (The first node is multiplied by the decimal 40 and the result is added to the value of the second node) + 101, + // thawte(101) + // Ed25519 identifier + 112, + // id-Ed25519(112) + /** + * Private key payload + */ + 4, + // ASN.1 octet string tag + 34, + // String length (34 more bytes) + // Private key bytes as octet string + 4, + // ASN.1 octet string tag + 32, + // String length (32 bytes) + ...bytes + ]); +} +async function createPrivateKeyFromBytes(bytes, extractable = false) { + const actualLength = bytes.byteLength; + if (actualLength !== 32) { + throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, { + actualLength + }); } -}); - -// node_modules/undici/lib/llhttp/constants.js -var require_constants3 = __commonJS({ - "node_modules/undici/lib/llhttp/constants.js"(exports) { + const privateKeyBytesPkcs8 = addPkcs8Header(bytes); + return await crypto.subtle.importKey("pkcs8", privateKeyBytesPkcs8, ED25519_ALGORITHM_IDENTIFIER, extractable, [ + "sign" + ]); +} +async function getPublicKeyFromPrivateKey(privateKey, extractable = false) { + assertKeyExporterIsAvailable(); + if (privateKey.extractable === false) { + throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, { key: privateKey }); + } + const jwk = await crypto.subtle.exportKey("jwk", privateKey); + return await crypto.subtle.importKey( + "jwk", + { + crv: "Ed25519", + ext: extractable, + key_ops: ["verify"], + kty: "OKP", + x: jwk.x + }, + "Ed25519", + extractable, + ["verify"] + ); +} +function assertIsSignature(putativeSignature) { + if (!base58Encoder) base58Encoder = getBase58Encoder(); + if ( + // Lowest value (64 bytes of zeroes) + putativeSignature.length < 64 || // Highest value (64 bytes of 255) + putativeSignature.length > 88 + ) { + throw new SolanaError(SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, { + actualLength: putativeSignature.length + }); + } + const bytes = base58Encoder.encode(putativeSignature); + assertIsSignatureBytes(bytes); +} +function assertIsSignatureBytes(putativeSignatureBytes) { + const numBytes = putativeSignatureBytes.byteLength; + if (numBytes !== 64) { + throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, { + actualLength: numBytes + }); + } +} +function isSignature(putativeSignature) { + if (!base58Encoder) base58Encoder = getBase58Encoder(); + if ( + // Lowest value (64 bytes of zeroes) + putativeSignature.length < 64 || // Highest value (64 bytes of 255) + putativeSignature.length > 88 + ) { + return false; + } + const bytes = base58Encoder.encode(putativeSignature); + return isSignatureBytes(bytes); +} +function isSignatureBytes(putativeSignatureBytes) { + return putativeSignatureBytes.byteLength === 64; +} +async function signBytes(key, data) { + assertSigningCapabilityIsAvailable(); + const signedData = await crypto.subtle.sign(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(data)); + return new Uint8Array(signedData); +} +function signature(putativeSignature) { + assertIsSignature(putativeSignature); + return putativeSignature; +} +function signatureBytes(putativeSignatureBytes) { + assertIsSignatureBytes(putativeSignatureBytes); + return putativeSignatureBytes; +} +async function verifySignature(key, signature2, data) { + assertVerificationCapabilityIsAvailable(); + return await crypto.subtle.verify(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(signature2), toArrayBuffer(data)); +} +async function generateKeyPair() { + await assertKeyGenerationIsAvailable(); + const keyPair = await crypto.subtle.generateKey( + /* algorithm */ + ED25519_ALGORITHM_IDENTIFIER, + // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20 + /* extractable */ + false, + // Prevents the bytes of the private key from being visible to JS. + /* allowed uses */ + ["sign", "verify"] + ); + return keyPair; +} +async function createKeyPairFromBytes(bytes, extractable = false) { + assertPRNGIsAvailable(); + if (bytes.byteLength !== 64) { + throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, { byteLength: bytes.byteLength }); + } + const [publicKey, privateKey] = await Promise.all([ + crypto.subtle.importKey( + "raw", + bytes.slice(32), + ED25519_ALGORITHM_IDENTIFIER, + /* extractable */ + true, + [ + "verify" + ] + ), + createPrivateKeyFromBytes(bytes.slice(0, 32), extractable) + ]); + const randomBytes4 = new Uint8Array(32); + crypto.getRandomValues(randomBytes4); + const signedData = await signBytes(privateKey, randomBytes4); + const isValid2 = await verifySignature(publicKey, signedData, randomBytes4); + if (!isValid2) { + throw new SolanaError(SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY); + } + return { privateKey, publicKey }; +} +async function createKeyPairFromPrivateKeyBytes(bytes, extractable = false) { + const privateKeyPromise = createPrivateKeyFromBytes(bytes, extractable); + const [publicKey, privateKey] = await Promise.all([ + // This nested promise makes things efficient by + // creating the public key in parallel with the + // second private key creation, if it is needed. + (extractable ? privateKeyPromise : createPrivateKeyFromBytes( + bytes, + true + /* extractable */ + )).then( + async (privateKey2) => await getPublicKeyFromPrivateKey( + privateKey2, + true + /* extractable */ + ) + ), + privateKeyPromise + ]); + return { privateKey, publicKey }; +} +var ED25519_ALGORITHM_IDENTIFIER, base58Encoder; +var init_index_node15 = __esm({ + "node_modules/@solana/keys/dist/index.node.mjs"() { "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.SPECIAL_HEADERS = exports.MINOR = exports.MAJOR = exports.HTAB_SP_VCHAR_OBS_TEXT = exports.QUOTED_STRING = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.HEX = exports.URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.STATUSES_HTTP = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.HEADER_STATE = exports.FINISH = exports.STATUSES = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; - var utils_1 = require_utils(); - exports.ERROR = { - OK: 0, - INTERNAL: 1, - STRICT: 2, - CR_EXPECTED: 25, - LF_EXPECTED: 3, - UNEXPECTED_CONTENT_LENGTH: 4, - UNEXPECTED_SPACE: 30, - CLOSED_CONNECTION: 5, - INVALID_METHOD: 6, - INVALID_URL: 7, - INVALID_CONSTANT: 8, - INVALID_VERSION: 9, - INVALID_HEADER_TOKEN: 10, - INVALID_CONTENT_LENGTH: 11, - INVALID_CHUNK_SIZE: 12, - INVALID_STATUS: 13, - INVALID_EOF_STATE: 14, - INVALID_TRANSFER_ENCODING: 15, - CB_MESSAGE_BEGIN: 16, - CB_HEADERS_COMPLETE: 17, - CB_MESSAGE_COMPLETE: 18, - CB_CHUNK_HEADER: 19, - CB_CHUNK_COMPLETE: 20, - PAUSED: 21, - PAUSED_UPGRADE: 22, - PAUSED_H2_UPGRADE: 23, - USER: 24, - CB_URL_COMPLETE: 26, - CB_STATUS_COMPLETE: 27, - CB_METHOD_COMPLETE: 32, - CB_VERSION_COMPLETE: 33, - CB_HEADER_FIELD_COMPLETE: 28, - CB_HEADER_VALUE_COMPLETE: 29, - CB_CHUNK_EXTENSION_NAME_COMPLETE: 34, - CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35, - CB_RESET: 31, - CB_PROTOCOL_COMPLETE: 38 - }; - exports.TYPE = { - BOTH: 0, - // default - REQUEST: 1, - RESPONSE: 2 - }; - exports.FLAGS = { - CONNECTION_KEEP_ALIVE: 1 << 0, - CONNECTION_CLOSE: 1 << 1, - CONNECTION_UPGRADE: 1 << 2, - CHUNKED: 1 << 3, - UPGRADE: 1 << 4, - CONTENT_LENGTH: 1 << 5, - SKIPBODY: 1 << 6, - TRAILING: 1 << 7, - // 1 << 8 is unused - TRANSFER_ENCODING: 1 << 9 - }; - exports.LENIENT_FLAGS = { - HEADERS: 1 << 0, - CHUNKED_LENGTH: 1 << 1, - KEEP_ALIVE: 1 << 2, - TRANSFER_ENCODING: 1 << 3, - VERSION: 1 << 4, - DATA_AFTER_CLOSE: 1 << 5, - OPTIONAL_LF_AFTER_CR: 1 << 6, - OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7, - OPTIONAL_CR_BEFORE_LF: 1 << 8, - SPACES_AFTER_CHUNK_SIZE: 1 << 9 - }; - exports.METHODS = { - "DELETE": 0, - "GET": 1, - "HEAD": 2, - "POST": 3, - "PUT": 4, - /* pathological */ - "CONNECT": 5, - "OPTIONS": 6, - "TRACE": 7, - /* WebDAV */ - "COPY": 8, - "LOCK": 9, - "MKCOL": 10, - "MOVE": 11, - "PROPFIND": 12, - "PROPPATCH": 13, - "SEARCH": 14, - "UNLOCK": 15, - "BIND": 16, - "REBIND": 17, - "UNBIND": 18, - "ACL": 19, - /* subversion */ - "REPORT": 20, - "MKACTIVITY": 21, - "CHECKOUT": 22, - "MERGE": 23, - /* upnp */ - "M-SEARCH": 24, - "NOTIFY": 25, - "SUBSCRIBE": 26, - "UNSUBSCRIBE": 27, - /* RFC-5789 */ - "PATCH": 28, - "PURGE": 29, - /* CalDAV */ - "MKCALENDAR": 30, - /* RFC-2068, section 19.6.1.2 */ - "LINK": 31, - "UNLINK": 32, - /* icecast */ - "SOURCE": 33, - /* RFC-7540, section 11.6 */ - "PRI": 34, - /* RFC-2326 RTSP */ - "DESCRIBE": 35, - "ANNOUNCE": 36, - "SETUP": 37, - "PLAY": 38, - "PAUSE": 39, - "TEARDOWN": 40, - "GET_PARAMETER": 41, - "SET_PARAMETER": 42, - "REDIRECT": 43, - "RECORD": 44, - /* RAOP */ - "FLUSH": 45, - /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */ - "QUERY": 46 - }; - exports.STATUSES = { - CONTINUE: 100, - SWITCHING_PROTOCOLS: 101, - PROCESSING: 102, - EARLY_HINTS: 103, - RESPONSE_IS_STALE: 110, - // Unofficial - REVALIDATION_FAILED: 111, - // Unofficial - DISCONNECTED_OPERATION: 112, - // Unofficial - HEURISTIC_EXPIRATION: 113, - // Unofficial - MISCELLANEOUS_WARNING: 199, - // Unofficial - OK: 200, - CREATED: 201, - ACCEPTED: 202, - NON_AUTHORITATIVE_INFORMATION: 203, - NO_CONTENT: 204, - RESET_CONTENT: 205, - PARTIAL_CONTENT: 206, - MULTI_STATUS: 207, - ALREADY_REPORTED: 208, - TRANSFORMATION_APPLIED: 214, - // Unofficial - IM_USED: 226, - MISCELLANEOUS_PERSISTENT_WARNING: 299, - // Unofficial - MULTIPLE_CHOICES: 300, - MOVED_PERMANENTLY: 301, - FOUND: 302, - SEE_OTHER: 303, - NOT_MODIFIED: 304, - USE_PROXY: 305, - SWITCH_PROXY: 306, - // No longer used - TEMPORARY_REDIRECT: 307, - PERMANENT_REDIRECT: 308, - BAD_REQUEST: 400, - UNAUTHORIZED: 401, - PAYMENT_REQUIRED: 402, - FORBIDDEN: 403, - NOT_FOUND: 404, - METHOD_NOT_ALLOWED: 405, - NOT_ACCEPTABLE: 406, - PROXY_AUTHENTICATION_REQUIRED: 407, - REQUEST_TIMEOUT: 408, - CONFLICT: 409, - GONE: 410, - LENGTH_REQUIRED: 411, - PRECONDITION_FAILED: 412, - PAYLOAD_TOO_LARGE: 413, - URI_TOO_LONG: 414, - UNSUPPORTED_MEDIA_TYPE: 415, - RANGE_NOT_SATISFIABLE: 416, - EXPECTATION_FAILED: 417, - IM_A_TEAPOT: 418, - PAGE_EXPIRED: 419, - // Unofficial - ENHANCE_YOUR_CALM: 420, - // Unofficial - MISDIRECTED_REQUEST: 421, - UNPROCESSABLE_ENTITY: 422, - LOCKED: 423, - FAILED_DEPENDENCY: 424, - TOO_EARLY: 425, - UPGRADE_REQUIRED: 426, - PRECONDITION_REQUIRED: 428, - TOO_MANY_REQUESTS: 429, - REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, - // Unofficial - REQUEST_HEADER_FIELDS_TOO_LARGE: 431, - LOGIN_TIMEOUT: 440, - // Unofficial - NO_RESPONSE: 444, - // Unofficial - RETRY_WITH: 449, - // Unofficial - BLOCKED_BY_PARENTAL_CONTROL: 450, - // Unofficial - UNAVAILABLE_FOR_LEGAL_REASONS: 451, - CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, - // Unofficial - INVALID_X_FORWARDED_FOR: 463, - // Unofficial - REQUEST_HEADER_TOO_LARGE: 494, - // Unofficial - SSL_CERTIFICATE_ERROR: 495, - // Unofficial - SSL_CERTIFICATE_REQUIRED: 496, - // Unofficial - HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, - // Unofficial - INVALID_TOKEN: 498, - // Unofficial - CLIENT_CLOSED_REQUEST: 499, - // Unofficial - INTERNAL_SERVER_ERROR: 500, - NOT_IMPLEMENTED: 501, - BAD_GATEWAY: 502, - SERVICE_UNAVAILABLE: 503, - GATEWAY_TIMEOUT: 504, - HTTP_VERSION_NOT_SUPPORTED: 505, - VARIANT_ALSO_NEGOTIATES: 506, - INSUFFICIENT_STORAGE: 507, - LOOP_DETECTED: 508, - BANDWIDTH_LIMIT_EXCEEDED: 509, - NOT_EXTENDED: 510, - NETWORK_AUTHENTICATION_REQUIRED: 511, - WEB_SERVER_UNKNOWN_ERROR: 520, - // Unofficial - WEB_SERVER_IS_DOWN: 521, - // Unofficial - CONNECTION_TIMEOUT: 522, - // Unofficial - ORIGIN_IS_UNREACHABLE: 523, - // Unofficial - TIMEOUT_OCCURED: 524, - // Unofficial - SSL_HANDSHAKE_FAILED: 525, - // Unofficial - INVALID_SSL_CERTIFICATE: 526, - // Unofficial - RAILGUN_ERROR: 527, - // Unofficial - SITE_IS_OVERLOADED: 529, - // Unofficial - SITE_IS_FROZEN: 530, - // Unofficial - IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, - // Unofficial - NETWORK_READ_TIMEOUT: 598, - // Unofficial - NETWORK_CONNECT_TIMEOUT: 599 - // Unofficial - }; - exports.FINISH = { - SAFE: 0, - SAFE_WITH_CB: 1, - UNSAFE: 2 + init_index_node5(); + init_index_node(); + init_index_node2(); + init_index_node3(); + ED25519_ALGORITHM_IDENTIFIER = // Resist the temptation to convert this to a simple string; As of version 133.0.3, Firefox + // requires the object form of `AlgorithmIdentifier` and will throw a `DOMException` otherwise. + Object.freeze({ name: "Ed25519" }); + } +}); + +// node_modules/@solana/transactions/dist/index.node.mjs +function getSignaturesToEncode(signaturesMap) { + const signatures = Object.values(signaturesMap); + if (signatures.length === 0) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES); + } + return signatures.map((signature2) => { + if (!signature2) { + return new Uint8Array(64).fill(0); + } + return signature2; + }); +} +function getSignaturesEncoder() { + return transformEncoder( + getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getShortU16Encoder() }), + getSignaturesToEncode + ); +} +function getTransactionEncoder() { + return getStructEncoder([ + ["signatures", getSignaturesEncoder()], + ["messageBytes", getBytesEncoder()] + ]); +} +function getTransactionDecoder() { + return transformDecoder( + getStructDecoder([ + ["signatures", getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getShortU16Decoder() })], + ["messageBytes", getBytesDecoder()] + ]), + decodePartiallyDecodedTransaction + ); +} +function getTransactionCodec() { + return combineCodec(getTransactionEncoder(), getTransactionDecoder()); +} +function decodePartiallyDecodedTransaction(transaction) { + const { messageBytes, signatures } = transaction; + const signerAddressesDecoder = getTupleDecoder([ + // read transaction version + getTransactionVersionDecoder(), + // read first byte of header, `numSignerAccounts` + // padRight to skip the next 2 bytes, `numReadOnlySignedAccounts` and `numReadOnlyUnsignedAccounts` which we don't need + padRightDecoder(getU8Decoder(), 2), + // read static addresses + getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() }) + ]); + const [_txVersion, numRequiredSignatures, staticAddresses] = signerAddressesDecoder.decode(messageBytes); + const signerAddresses = staticAddresses.slice(0, numRequiredSignatures); + if (signerAddresses.length !== signatures.length) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, { + numRequiredSignatures, + signaturesLength: signatures.length, + signerAddresses + }); + } + const signaturesMap = {}; + signerAddresses.forEach((address2, index2) => { + const signatureForAddress = signatures[index2]; + if (signatureForAddress.every((b) => b === 0)) { + signaturesMap[address2] = null; + } else { + signaturesMap[address2] = signatureForAddress; + } + }); + return { + messageBytes, + signatures: Object.freeze(signaturesMap) + }; +} +function compiledInstructionIsAdvanceNonceInstruction(instruction, staticAddresses) { + return staticAddresses[instruction.programAddressIndex] === SYSTEM_PROGRAM_ADDRESS2 && // Test for `AdvanceNonceAccount` instruction data + instruction.data != null && isAdvanceNonceAccountInstructionData2(instruction.data) && // Test for exactly 3 accounts + instruction.accountIndices?.length === 3; +} +function isAdvanceNonceAccountInstructionData2(data) { + return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0; +} +async function getTransactionLifetimeConstraintFromCompiledTransactionMessage(compiledTransactionMessage) { + const firstInstruction = compiledTransactionMessage.instructions[0]; + const { staticAccounts } = compiledTransactionMessage; + if (firstInstruction && compiledInstructionIsAdvanceNonceInstruction(firstInstruction, staticAccounts)) { + const nonceAccountAddress = staticAccounts[firstInstruction.accountIndices[0]]; + if (!nonceAccountAddress) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, { + nonce: compiledTransactionMessage.lifetimeToken + }); + } + return { + nonce: compiledTransactionMessage.lifetimeToken, + nonceAccountAddress }; - exports.HEADER_STATE = { - GENERAL: 0, - CONNECTION: 1, - CONTENT_LENGTH: 2, - TRANSFER_ENCODING: 3, - UPGRADE: 4, - CONNECTION_KEEP_ALIVE: 5, - CONNECTION_CLOSE: 6, - CONNECTION_UPGRADE: 7, - TRANSFER_ENCODING_CHUNKED: 8 + } else { + return { + blockhash: compiledTransactionMessage.lifetimeToken, + // This is not known from the compiled message, so we set it to the maximum possible value + lastValidBlockHeight: 0xffffffffffffffffn }; - exports.METHODS_HTTP = [ - exports.METHODS.DELETE, - exports.METHODS.GET, - exports.METHODS.HEAD, - exports.METHODS.POST, - exports.METHODS.PUT, - exports.METHODS.CONNECT, - exports.METHODS.OPTIONS, - exports.METHODS.TRACE, - exports.METHODS.COPY, - exports.METHODS.LOCK, - exports.METHODS.MKCOL, - exports.METHODS.MOVE, - exports.METHODS.PROPFIND, - exports.METHODS.PROPPATCH, - exports.METHODS.SEARCH, - exports.METHODS.UNLOCK, - exports.METHODS.BIND, - exports.METHODS.REBIND, - exports.METHODS.UNBIND, - exports.METHODS.ACL, - exports.METHODS.REPORT, - exports.METHODS.MKACTIVITY, - exports.METHODS.CHECKOUT, - exports.METHODS.MERGE, - exports.METHODS["M-SEARCH"], - exports.METHODS.NOTIFY, - exports.METHODS.SUBSCRIBE, - exports.METHODS.UNSUBSCRIBE, - exports.METHODS.PATCH, - exports.METHODS.PURGE, - exports.METHODS.MKCALENDAR, - exports.METHODS.LINK, - exports.METHODS.UNLINK, - exports.METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - exports.METHODS.SOURCE, - exports.METHODS.QUERY - ]; - exports.METHODS_ICE = [ - exports.METHODS.SOURCE - ]; - exports.METHODS_RTSP = [ - exports.METHODS.OPTIONS, - exports.METHODS.DESCRIBE, - exports.METHODS.ANNOUNCE, - exports.METHODS.SETUP, - exports.METHODS.PLAY, - exports.METHODS.PAUSE, - exports.METHODS.TEARDOWN, - exports.METHODS.GET_PARAMETER, - exports.METHODS.SET_PARAMETER, - exports.METHODS.REDIRECT, - exports.METHODS.RECORD, - exports.METHODS.FLUSH, - // For AirPlay - exports.METHODS.GET, - exports.METHODS.POST - ]; - exports.METHOD_MAP = (0, utils_1.enumToMap)(exports.METHODS); - exports.H_METHOD_MAP = Object.fromEntries(Object.entries(exports.METHODS).filter(([k]) => k.startsWith("H"))); - exports.STATUSES_HTTP = [ - exports.STATUSES.CONTINUE, - exports.STATUSES.SWITCHING_PROTOCOLS, - exports.STATUSES.PROCESSING, - exports.STATUSES.EARLY_HINTS, - exports.STATUSES.RESPONSE_IS_STALE, - exports.STATUSES.REVALIDATION_FAILED, - exports.STATUSES.DISCONNECTED_OPERATION, - exports.STATUSES.HEURISTIC_EXPIRATION, - exports.STATUSES.MISCELLANEOUS_WARNING, - exports.STATUSES.OK, - exports.STATUSES.CREATED, - exports.STATUSES.ACCEPTED, - exports.STATUSES.NON_AUTHORITATIVE_INFORMATION, - exports.STATUSES.NO_CONTENT, - exports.STATUSES.RESET_CONTENT, - exports.STATUSES.PARTIAL_CONTENT, - exports.STATUSES.MULTI_STATUS, - exports.STATUSES.ALREADY_REPORTED, - exports.STATUSES.TRANSFORMATION_APPLIED, - exports.STATUSES.IM_USED, - exports.STATUSES.MISCELLANEOUS_PERSISTENT_WARNING, - exports.STATUSES.MULTIPLE_CHOICES, - exports.STATUSES.MOVED_PERMANENTLY, - exports.STATUSES.FOUND, - exports.STATUSES.SEE_OTHER, - exports.STATUSES.NOT_MODIFIED, - exports.STATUSES.USE_PROXY, - exports.STATUSES.SWITCH_PROXY, - exports.STATUSES.TEMPORARY_REDIRECT, - exports.STATUSES.PERMANENT_REDIRECT, - exports.STATUSES.BAD_REQUEST, - exports.STATUSES.UNAUTHORIZED, - exports.STATUSES.PAYMENT_REQUIRED, - exports.STATUSES.FORBIDDEN, - exports.STATUSES.NOT_FOUND, - exports.STATUSES.METHOD_NOT_ALLOWED, - exports.STATUSES.NOT_ACCEPTABLE, - exports.STATUSES.PROXY_AUTHENTICATION_REQUIRED, - exports.STATUSES.REQUEST_TIMEOUT, - exports.STATUSES.CONFLICT, - exports.STATUSES.GONE, - exports.STATUSES.LENGTH_REQUIRED, - exports.STATUSES.PRECONDITION_FAILED, - exports.STATUSES.PAYLOAD_TOO_LARGE, - exports.STATUSES.URI_TOO_LONG, - exports.STATUSES.UNSUPPORTED_MEDIA_TYPE, - exports.STATUSES.RANGE_NOT_SATISFIABLE, - exports.STATUSES.EXPECTATION_FAILED, - exports.STATUSES.IM_A_TEAPOT, - exports.STATUSES.PAGE_EXPIRED, - exports.STATUSES.ENHANCE_YOUR_CALM, - exports.STATUSES.MISDIRECTED_REQUEST, - exports.STATUSES.UNPROCESSABLE_ENTITY, - exports.STATUSES.LOCKED, - exports.STATUSES.FAILED_DEPENDENCY, - exports.STATUSES.TOO_EARLY, - exports.STATUSES.UPGRADE_REQUIRED, - exports.STATUSES.PRECONDITION_REQUIRED, - exports.STATUSES.TOO_MANY_REQUESTS, - exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL, - exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE, - exports.STATUSES.LOGIN_TIMEOUT, - exports.STATUSES.NO_RESPONSE, - exports.STATUSES.RETRY_WITH, - exports.STATUSES.BLOCKED_BY_PARENTAL_CONTROL, - exports.STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS, - exports.STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST, - exports.STATUSES.INVALID_X_FORWARDED_FOR, - exports.STATUSES.REQUEST_HEADER_TOO_LARGE, - exports.STATUSES.SSL_CERTIFICATE_ERROR, - exports.STATUSES.SSL_CERTIFICATE_REQUIRED, - exports.STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT, - exports.STATUSES.INVALID_TOKEN, - exports.STATUSES.CLIENT_CLOSED_REQUEST, - exports.STATUSES.INTERNAL_SERVER_ERROR, - exports.STATUSES.NOT_IMPLEMENTED, - exports.STATUSES.BAD_GATEWAY, - exports.STATUSES.SERVICE_UNAVAILABLE, - exports.STATUSES.GATEWAY_TIMEOUT, - exports.STATUSES.HTTP_VERSION_NOT_SUPPORTED, - exports.STATUSES.VARIANT_ALSO_NEGOTIATES, - exports.STATUSES.INSUFFICIENT_STORAGE, - exports.STATUSES.LOOP_DETECTED, - exports.STATUSES.BANDWIDTH_LIMIT_EXCEEDED, - exports.STATUSES.NOT_EXTENDED, - exports.STATUSES.NETWORK_AUTHENTICATION_REQUIRED, - exports.STATUSES.WEB_SERVER_UNKNOWN_ERROR, - exports.STATUSES.WEB_SERVER_IS_DOWN, - exports.STATUSES.CONNECTION_TIMEOUT, - exports.STATUSES.ORIGIN_IS_UNREACHABLE, - exports.STATUSES.TIMEOUT_OCCURED, - exports.STATUSES.SSL_HANDSHAKE_FAILED, - exports.STATUSES.INVALID_SSL_CERTIFICATE, - exports.STATUSES.RAILGUN_ERROR, - exports.STATUSES.SITE_IS_OVERLOADED, - exports.STATUSES.SITE_IS_FROZEN, - exports.STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR, - exports.STATUSES.NETWORK_READ_TIMEOUT, - exports.STATUSES.NETWORK_CONNECT_TIMEOUT - ]; - exports.ALPHA = []; - for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { - exports.ALPHA.push(String.fromCharCode(i)); - exports.ALPHA.push(String.fromCharCode(i + 32)); - } - exports.NUM_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9 + } +} +function isTransactionWithBlockhashLifetime(transaction) { + return "lifetimeConstraint" in transaction && "blockhash" in transaction.lifetimeConstraint && typeof transaction.lifetimeConstraint.blockhash === "string" && typeof transaction.lifetimeConstraint.lastValidBlockHeight === "bigint" && isBlockhash(transaction.lifetimeConstraint.blockhash); +} +function assertIsTransactionWithBlockhashLifetime(transaction) { + if (!isTransactionWithBlockhashLifetime(transaction)) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME); + } +} +function isTransactionWithDurableNonceLifetime(transaction) { + return "lifetimeConstraint" in transaction && "nonce" in transaction.lifetimeConstraint && typeof transaction.lifetimeConstraint.nonce === "string" && typeof transaction.lifetimeConstraint.nonceAccountAddress === "string" && isAddress2(transaction.lifetimeConstraint.nonceAccountAddress); +} +function assertIsTransactionWithDurableNonceLifetime(transaction) { + if (!isTransactionWithDurableNonceLifetime(transaction)) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME); + } +} +function compileTransaction(transactionMessage) { + const compiledMessage = compileTransactionMessage(transactionMessage); + const messageBytes = getCompiledTransactionMessageEncoder().encode(compiledMessage); + const transactionSigners = compiledMessage.staticAccounts.slice(0, compiledMessage.header.numSignerAccounts); + const signatures = {}; + for (const signerAddress of transactionSigners) { + signatures[signerAddress] = null; + } + let lifetimeConstraint; + if (isTransactionMessageWithBlockhashLifetime(transactionMessage)) { + lifetimeConstraint = { + blockhash: transactionMessage.lifetimeConstraint.blockhash, + lastValidBlockHeight: transactionMessage.lifetimeConstraint.lastValidBlockHeight }; - exports.HEX_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - A: 10, - B: 11, - C: 12, - D: 13, - E: 14, - F: 15, - a: 10, - b: 11, - c: 12, - d: 13, - e: 14, - f: 15 + } else if (isTransactionMessageWithDurableNonceLifetime(transactionMessage)) { + lifetimeConstraint = { + nonce: transactionMessage.lifetimeConstraint.nonce, + nonceAccountAddress: transactionMessage.instructions[0].accounts[0].address }; - exports.NUM = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); - exports.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; - exports.USERINFO_CHARS = exports.ALPHANUM.concat(exports.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports.URL_CHAR = [ - "!", - '"', - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ":", - ";", - "<", - "=", - ">", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "{", - "|", - "}", - "~" - ].concat(exports.ALPHANUM); - exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports.TOKEN = [ - "!", - "#", - "$", - "%", - "&", - "'", - "*", - "+", - "-", - ".", - "^", - "_", - "`", - "|", - "~" - ].concat(exports.ALPHANUM); - exports.HEADER_CHARS = [" "]; - for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports.HEADER_CHARS.push(i); + } + return Object.freeze({ + ...lifetimeConstraint ? { lifetimeConstraint } : void 0, + messageBytes, + signatures: Object.freeze(signatures) + }); +} +function getSignatureFromTransaction(transaction) { + if (!base58Decoder) base58Decoder = getBase58Decoder(); + const signatureBytes2 = Object.values(transaction.signatures)[0]; + if (!signatureBytes2) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING); + } + const transactionSignature = base58Decoder.decode(signatureBytes2); + return transactionSignature; +} +async function partiallySignTransaction(keyPairs, transaction) { + let newSignatures; + let unexpectedSigners; + await Promise.all( + keyPairs.map(async (keyPair) => { + const address2 = await getAddressFromPublicKey(keyPair.publicKey); + const existingSignature = transaction.signatures[address2]; + if (existingSignature === void 0) { + unexpectedSigners ||= /* @__PURE__ */ new Set(); + unexpectedSigners.add(address2); + return; + } + if (unexpectedSigners) { + return; + } + const newSignature = await signBytes(keyPair.privateKey, transaction.messageBytes); + if (existingSignature !== null && bytesEqual(newSignature, existingSignature)) { + return; + } + newSignatures ||= {}; + newSignatures[address2] = newSignature; + }) + ); + if (unexpectedSigners && unexpectedSigners.size > 0) { + const expectedSigners = Object.keys(transaction.signatures); + throw new SolanaError(SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, { + expectedAddresses: expectedSigners, + unexpectedAddresses: [...unexpectedSigners] + }); + } + if (!newSignatures) { + return transaction; + } + return Object.freeze({ + ...transaction, + signatures: Object.freeze({ + ...transaction.signatures, + ...newSignatures + }) + }); +} +async function signTransaction2(keyPairs, transaction) { + const out = await partiallySignTransaction(keyPairs, transaction); + assertIsFullySignedTransaction(out); + Object.freeze(out); + return out; +} +function isFullySignedTransaction(transaction) { + return Object.entries(transaction.signatures).every(([_, signatureBytes2]) => !!signatureBytes2); +} +function assertIsFullySignedTransaction(transaction) { + const missingSigs = []; + Object.entries(transaction.signatures).forEach(([address2, signatureBytes2]) => { + if (!signatureBytes2) { + missingSigs.push(address2); + } + }); + if (missingSigs.length > 0) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, { + addresses: missingSigs + }); + } +} +function getBase64EncodedWireTransaction(transaction) { + const wireTransactionBytes = getTransactionEncoder().encode(transaction); + return getBase64Decoder().decode(wireTransactionBytes); +} +function getTransactionSize(transaction) { + return getTransactionEncoder().getSizeFromValue(transaction); +} +function isTransactionWithinSizeLimit(transaction) { + return getTransactionSize(transaction) <= TRANSACTION_SIZE_LIMIT; +} +function assertIsTransactionWithinSizeLimit(transaction) { + const transactionSize = getTransactionSize(transaction); + if (transactionSize > TRANSACTION_SIZE_LIMIT) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, { + transactionSize, + transactionSizeLimit: TRANSACTION_SIZE_LIMIT + }); + } +} +function isSendableTransaction(transaction) { + return isFullySignedTransaction(transaction) && isTransactionWithinSizeLimit(transaction); +} +function assertIsSendableTransaction(transaction) { + assertIsFullySignedTransaction(transaction); + assertIsTransactionWithinSizeLimit(transaction); +} +function getTransactionMessageSize(transactionMessage) { + return getTransactionSize(compileTransaction(transactionMessage)); +} +function isTransactionMessageWithinSizeLimit(transactionMessage) { + return getTransactionMessageSize(transactionMessage) <= TRANSACTION_SIZE_LIMIT; +} +function assertIsTransactionMessageWithinSizeLimit(transactionMessage) { + const transactionSize = getTransactionMessageSize(transactionMessage); + if (transactionSize > TRANSACTION_SIZE_LIMIT) { + throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, { + transactionSize, + transactionSizeLimit: TRANSACTION_SIZE_LIMIT + }); + } +} +var SYSTEM_PROGRAM_ADDRESS2, base58Decoder, TRANSACTION_PACKET_SIZE, TRANSACTION_PACKET_HEADER, TRANSACTION_SIZE_LIMIT; +var init_index_node16 = __esm({ + "node_modules/@solana/transactions/dist/index.node.mjs"() { + "use strict"; + init_index_node6(); + init_index_node2(); + init_index_node8(); + init_index_node7(); + init_index_node(); + init_index_node14(); + init_index_node13(); + init_index_node3(); + init_index_node15(); + SYSTEM_PROGRAM_ADDRESS2 = "11111111111111111111111111111111"; + TRANSACTION_PACKET_SIZE = 1280; + TRANSACTION_PACKET_HEADER = 40 + 8; + TRANSACTION_SIZE_LIMIT = TRANSACTION_PACKET_SIZE - TRANSACTION_PACKET_HEADER; + } +}); + +// node_modules/@solana/promises/dist/index.node.mjs +function isObject(value) { + return value !== null && (typeof value === "object" || typeof value === "function"); +} +function addRaceContender(contender) { + const deferreds = /* @__PURE__ */ new Set(); + const record = { deferreds, settled: false }; + Promise.resolve(contender).then( + (value) => { + for (const { resolve } of deferreds) { + resolve(value); + } + deferreds.clear(); + record.settled = true; + }, + (err) => { + for (const { reject } of deferreds) { + reject(err); } + deferreds.clear(); + record.settled = true; } - exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c2) => c2 !== 44); - exports.QUOTED_STRING = [" ", " "]; - for (let i = 33; i <= 255; i++) { - if (i !== 34 && i !== 92) { - exports.QUOTED_STRING.push(i); + ); + return record; +} +async function safeRace(contenders) { + let deferred; + const result = new Promise((resolve, reject) => { + deferred = { reject, resolve }; + for (const contender of contenders) { + if (!isObject(contender)) { + Promise.resolve(contender).then(resolve, reject); + continue; + } + let record = wm.get(contender); + if (record === void 0) { + record = addRaceContender(contender); + record.deferreds.add(deferred); + wm.set(contender, record); + } else if (record.settled) { + Promise.resolve(contender).then(resolve, reject); + } else { + record.deferreds.add(deferred); } } - exports.HTAB_SP_VCHAR_OBS_TEXT = [" ", " "]; - for (let i = 33; i <= 126; i++) { - exports.HTAB_SP_VCHAR_OBS_TEXT.push(i); + }); + return await result.finally(() => { + for (const contender of contenders) { + if (isObject(contender)) { + const record = wm.get(contender); + record.deferreds.delete(deferred); + } } - for (let i = 128; i <= 255; i++) { - exports.HTAB_SP_VCHAR_OBS_TEXT.push(i); + }); +} +function getAbortablePromise(promise, abortSignal) { + if (!abortSignal) { + return promise; + } else { + return safeRace([ + // This promise only ever rejects if the signal is aborted. Otherwise it idles forever. + // It's important that this come before the input promise; in the event of an abort, we + // want to throw even if the input promise's result is ready + new Promise((_, reject) => { + if (abortSignal.aborted) { + reject(abortSignal.reason); + } else { + abortSignal.addEventListener("abort", function() { + reject(this.reason); + }); + } + }), + promise + ]); + } +} +var wm; +var init_index_node17 = __esm({ + "node_modules/@solana/promises/dist/index.node.mjs"() { + "use strict"; + wm = /* @__PURE__ */ new WeakMap(); + } +}); + +// node_modules/@solana/instruction-plans/dist/index.node.mjs +function parallelInstructionPlan(plans) { + return Object.freeze({ + kind: "parallel", + plans: parseSingleInstructionPlans(plans) + }); +} +function sequentialInstructionPlan(plans) { + return Object.freeze({ + divisible: true, + kind: "sequential", + plans: parseSingleInstructionPlans(plans) + }); +} +function nonDivisibleSequentialInstructionPlan(plans) { + return Object.freeze({ + divisible: false, + kind: "sequential", + plans: parseSingleInstructionPlans(plans) + }); +} +function singleInstructionPlan(instruction) { + return Object.freeze({ instruction, kind: "single" }); +} +function parseSingleInstructionPlans(plans) { + return plans.map((plan) => "kind" in plan ? plan : singleInstructionPlan(plan)); +} +function isSingleInstructionPlan(plan) { + return plan.kind === "single"; +} +function assertIsSingleInstructionPlan(plan) { + if (!isSingleInstructionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { + actualKind: plan.kind, + expectedKind: "single", + instructionPlan: plan + }); + } +} +function isMessagePackerInstructionPlan(plan) { + return plan.kind === "messagePacker"; +} +function assertIsMessagePackerInstructionPlan(plan) { + if (!isMessagePackerInstructionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { + actualKind: plan.kind, + expectedKind: "messagePacker", + instructionPlan: plan + }); + } +} +function isSequentialInstructionPlan(plan) { + return plan.kind === "sequential"; +} +function assertIsSequentialInstructionPlan(plan) { + if (!isSequentialInstructionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { + actualKind: plan.kind, + expectedKind: "sequential", + instructionPlan: plan + }); + } +} +function isNonDivisibleSequentialInstructionPlan(plan) { + return plan.kind === "sequential" && plan.divisible === false; +} +function assertIsNonDivisibleSequentialInstructionPlan(plan) { + if (!isNonDivisibleSequentialInstructionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { + actualKind: plan.kind === "sequential" ? "divisible sequential" : plan.kind, + expectedKind: "non-divisible sequential", + instructionPlan: plan + }); + } +} +function isParallelInstructionPlan(plan) { + return plan.kind === "parallel"; +} +function assertIsParallelInstructionPlan(plan) { + if (!isParallelInstructionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, { + actualKind: plan.kind, + expectedKind: "parallel", + instructionPlan: plan + }); + } +} +function findInstructionPlan(instructionPlan, predicate) { + if (predicate(instructionPlan)) { + return instructionPlan; + } + if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { + return void 0; + } + for (const subPlan of instructionPlan.plans) { + const foundPlan = findInstructionPlan(subPlan, predicate); + if (foundPlan) { + return foundPlan; } - exports.MAJOR = exports.NUM_MAP; - exports.MINOR = exports.MAJOR; - exports.SPECIAL_HEADERS = { - "connection": exports.HEADER_STATE.CONNECTION, - "content-length": exports.HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": exports.HEADER_STATE.CONNECTION, - "transfer-encoding": exports.HEADER_STATE.TRANSFER_ENCODING, - "upgrade": exports.HEADER_STATE.UPGRADE - }; - exports.default = { - ERROR: exports.ERROR, - TYPE: exports.TYPE, - FLAGS: exports.FLAGS, - LENIENT_FLAGS: exports.LENIENT_FLAGS, - METHODS: exports.METHODS, - STATUSES: exports.STATUSES, - FINISH: exports.FINISH, - HEADER_STATE: exports.HEADER_STATE, - ALPHA: exports.ALPHA, - NUM_MAP: exports.NUM_MAP, - HEX_MAP: exports.HEX_MAP, - NUM: exports.NUM, - ALPHANUM: exports.ALPHANUM, - MARK: exports.MARK, - USERINFO_CHARS: exports.USERINFO_CHARS, - URL_CHAR: exports.URL_CHAR, - HEX: exports.HEX, - TOKEN: exports.TOKEN, - HEADER_CHARS: exports.HEADER_CHARS, - CONNECTION_TOKEN_CHARS: exports.CONNECTION_TOKEN_CHARS, - QUOTED_STRING: exports.QUOTED_STRING, - HTAB_SP_VCHAR_OBS_TEXT: exports.HTAB_SP_VCHAR_OBS_TEXT, - MAJOR: exports.MAJOR, - MINOR: exports.MINOR, - SPECIAL_HEADERS: exports.SPECIAL_HEADERS, - METHODS_HTTP: exports.METHODS_HTTP, - METHODS_ICE: exports.METHODS_ICE, - METHODS_RTSP: exports.METHODS_RTSP, - METHOD_MAP: exports.METHOD_MAP, - H_METHOD_MAP: exports.H_METHOD_MAP, - STATUSES_HTTP: exports.STATUSES_HTTP - }; } -}); - -// node_modules/undici/lib/llhttp/llhttp-wasm.js -var require_llhttp_wasm = __commonJS({ - "node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports, module) { - "use strict"; - var { Buffer: Buffer2 } = __require("buffer"); - var wasmBase64 = "AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgL5YUCAgd/A34gASACaiEEAkAgACIDKAIMIgANACADKAIEBEAgAyABNgIECyMAQRBrIgkkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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C0HjAQwHC0HXAQwGC0HYAQwFC0HZAQwEC0HaAQwDC0HbAQwCC0HdAQwBC0HcAQshAgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAg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ogKiAqICogKiAqICogKiAqICogKiAqICogIAogILIAQgAUEBaiIBRw0AC0HJACECDOwCCyABQQFqIQEgA0Evai0AAEEBcQ2lAiADQQA2AhwgAyABNgIUIANBlxA2AhAgA0EKNgIMQQAhAgzrAgsgASAERwRAA0AgAS0AAEEgRw0VIAQgAUEBaiIBRw0AC0H4ACECDOsCC0H4ACECDOoCCyADQQI6ACgMOAtBACECIANBADYCHCADQb8LNgIQIANBAjYCDCADIAFBAWo2AhQM6AILQQAhAgzOAgtBDSECDM0CC0ETIQIMzAILQRUhAgzLAgtBFiECDMoCC0EYIQIMyQILQRkhAgzIAgtBGiECDMcCC0EbIQIMxgILQRwhAgzFAgtBHSECDMQCC0EeIQIMwwILQR8hAgzCAgtBICECDMECC0EiIQIMwAILQSMhAgy/AgtBJSECDL4CC0HlACECDL0CCyADQT02AhwgAyABNgIUIAMgADYCDEEAIQIM1QILIANBGzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDNQCCyADQSA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzTAgsgA0ETNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0gILIANBCzYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNECCyADQRA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzQAgsgA0EgNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzwILIANBCzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM4CCyADQQw2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzNAgtBACECIANBADYCHCADIAE2AhQgA0HdDjYCECADQRI2AgwMzAILAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB/QEhAgzMAgsCQAJAIAMtADZBAUcNAEEAIQACQCADKAI4IgJFDQAgAigCYCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUcNASADQfwBNgIcIAMgATYCFCADQdwZNgIQIANBFTYCDEEAIQIMzQILQdwBIQIMswILIANBADYCHCADIAE2AhQgA0H5CzYCECADQR82AgxBACECDMsCCwJAAkAgAy0AKEEBaw4CBAEAC0HbASECDLICC0HUASECDLECCyADQQI6ADFBACEAAkAgAygCOCICRQ0AIAIoAgAiAkUNACADIAIRAAAhAAsgAEUEQEHdASECDLECCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQbQMNgIQIANBEDYCDEEAIQIMygILIANB+wE2AhwgAyABNgIUIANBgRo2AhAgA0EVNgIMQQAhAgzJAgsgASAERgRAQfoBIQIMyQILIAEtAABByABGDQEgA0EBOgAoC0HAASECDK4CC0HaASECDK0CCyABIARHBEAgA0EMNgIIIAMgATYCBEHZASECDK0CC0H5ASECDMUCCyABIARGBEBB+AEhAgzFAgsgAS0AAEHIAEcNBCABQQFqIQFB2AEhAgyrAgsgASAERgRAQfcBIQIMxAILAkACQCABLQAAQcUAaw4QAAUFBQUFBQUFBQUFBQUFAQULIAFBAWohAUHWASECDKsCCyABQQFqIQFB1wEhAgyqAgtB9gEhAiABIARGDcICIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbrVAGotAABHDQMgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMMCCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIARQRAQeMBIQIMqgILIANB9QE2AhwgAyABNgIUIAMgADYCDEEAIQIMwgILQfQBIQIgASAERg3BAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEG41QBqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzCAgsgA0GBBDsBKCADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIADQMMAgsgA0EANgIAC0EAIQIgA0EANgIcIAMgATYCFCADQeUfNgIQIANBCDYCDAy/AgtB1QEhAgylAgsgA0HzATYCHCADIAE2AhQgAyAANgIMQQAhAgy9AgtBACEAAkAgAygCOCICRQ0AIAIoAkAiAkUNACADIAIRAAAhAAsgAEUNbiAAQRVHBEAgA0EANgIcIAMgATYCFCADQYIPNgIQIANBIDYCDEEAIQIMvQILIANBjwE2AhwgAyABNgIUIANB7Bs2AhAgA0EVNgIMQQAhAgy8AgsgASAERwRAIANBDTYCCCADIAE2AgRB0wEhAgyjAgtB8gEhAgy7AgsgASAERgRAQfEBIQIMuwILAkACQAJAIAEtAABByABrDgsAAQgICAgICAgIAggLIAFBAWohAUHQASECDKMCCyABQQFqIQFB0QEhAgyiAgsgAUEBaiEBQdIBIQIMoQILQfABIQIgASAERg25AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBtdUAai0AAEcNBCAAQQJGDQMgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuQILQe8BIQIgASAERg24AiADKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABBs9UAai0AAEcNAyAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuAILQe4BIQIgASAERg23AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMtwILIAMoAgQhACADQgA3AwAgAyAAIAVBAWoiARArIgBFDQIgA0HsATYCHCADIAE2AhQgAyAANgIMQQAhAgy2AgsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNnAIgA0HtATYCHCADIAE2AhQgAyAANgIMQQAhAgy0AgtBzwEhAgyaAgtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDLQCC0HOASECDJoCCyADQesBNgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMsgILIAEgBEYEQEHrASECDLICCyABLQAAQS9GBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GyODYCECADQQg2AgxBACECDLECC0HNASECDJcCCyABIARHBEAgA0EONgIIIAMgATYCBEHMASECDJcCC0HqASECDK8CCyABIARGBEBB6QEhAgyvAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBywEhAgyWAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZcCIANB6AE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAEgBEYEQEHnASECDK4CCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5gE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILQcoBIQIMlAILIAEgBEYEQEHlASECDK0CC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDQIgA0HiATYCHCADIAE2AhQgAyAANgIMQQAhAgyvAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZoCIANB4wE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ2YAiADQeQBNgIcIAMgATYCFCADIAA2AgwMrQILQckBIQIMkwILQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBpA02AhAgA0EhNgIMQQAhAgytAgtByAEhAgyTAgsgA0HhATYCHCADIAE2AhQgA0HQGjYCECADQRU2AgxBACECDKsCCyABIARGBEBB4QEhAgyrAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANBmRE2AhAgA0EJNgIMQQAhAgyrAgtBxwEhAgyRAgsgASAERgRAQeABIQIMqgILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyrAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqgILQcYBIQIMkAILIAEgBEYEQEHfASECDKkCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqgILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKkCC0HFASECDI8CCyABIARGBEBB3gEhAgyoAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKkCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyoAgtBxAEhAgyOAgsgASAERgRAQd0BIQIMpwILAkACQAJAAkAgAS0AAEEKaw4XAgMDAAMDAwMDAwMDAwMDAwMDAwMDAwEDCyABQQFqDAULIAFBAWohAUHDASECDI8CCyABQQFqIQEgA0Evai0AAEEBcQ0IIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKcCCyADQQA2AhwgAyABNgIUIANBjQs2AhAgA0ENNgIMQQAhAgymAgsgASAERwRAIANBDzYCCCADIAE2AgRBASECDI0CC0HcASECDKUCCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtB2wEhAgymAgsgAygCBCEAIANBADYCBCADIAAgARAtIgBFBEAgAUEBaiEBDAQLIANB2gE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMpQILIAMoAgQhACADQQA2AgQgAyAAIAEQLSIADQEgAUEBagshAUHBASECDIoCCyADQdkBNgIcIAMgADYCDCADIAFBAWo2AhRBACECDKICC0HCASECDIgCCyADQS9qLQAAQQFxDQEgA0EANgIcIAMgATYCFCADQeQcNgIQIANBGTYCDEEAIQIMoAILIAEgBEYEQEHZASEC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IAFBAWohAUGeASECDOQBCyABQQFqIQFBnwEhAgzjAQtBtwEhAiABIARGDfsBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQezUAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPwBCyADQQA2AgAgBkEBaiEBQQ0MKAtBtgEhAiABIARGDfoBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPsBCyADQQA2AgAgBkEBaiEBQQwMJwtBtQEhAiABIARGDfkBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQerUAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPoBCyADQQA2AgAgBkEBaiEBQQMMJgtBtAEhAiABIARGDfgBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQejUAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPkBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQbMBIQIM+AELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBmQEhAgzfAQsgAUEBaiEBQZoBIQIM3gELQbIBIQIgASAERg32ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHm1ABqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz3AQsgA0EANgIAIAZBAWohAUEnDCMLQbEBIQIgASAERg31ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHk1ABqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz2AQsgA0EANgIAIAZBAWohAUEcDCILQbABIQIgASAERg30ASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHe1ABqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz1AQsgA0EANgIAIAZBAWohAUEGDCELQa8BIQIgASAERg3zASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHZ1ABqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz0AQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGuASECDPMBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQY4BIQIM3AELIAFBAWohAUGPASECDNsBCyABQQFqIQFBlAEhAgzaAQsgAUEBaiEBQZUBIQIM2QELQa0BIQIgASAERg3xASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHX1ABqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzyAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGsASECDPEBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGQASECDNgBCyABQQFqIQFBkwEhAgzXAQsgASAERgRAQasBIQIM8AELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQZEBIQIM1wELIAFBAWohAUGSASECDNYBCyABIARGBEBBqgEhAgzvAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GpASECIAEgBEYN7QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABB0dQAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7gELIANBADYCACAGQQFqIQFBHgwaC0GoASECIAEgBEYN7AEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBytQAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7QELIANBADYCACAGQQFqIQFBFQwZC0GnASECIAEgBEYN6wEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBx9QAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7AELIANBADYCACAGQQFqIQFBFwwYC0GmASECIAEgBEYN6gEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBwdQAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6wELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBpQEhAgzqAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYsBIQIM0QELIAFBAWohAUGMASECDNABC0GkASECIAEgBEYN6AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBptUAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6QELIANBADYCACAGQQFqIQFBCQwVC0GjASECIAEgBEYN5wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBpNUAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6AELIANBADYCACAGQQFqIQFBHwwUC0GiASECIAEgBEYN5gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBvtQAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5wELIANBADYCACAGQQFqIQFBAgwTC0GhASECIAEgBEYN5QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQbzUAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOUBCyABIARGBEBBoAEhAgzlAQtBASABLQAAQd8ARw0RGiABQQFqIQFBhwEhAgzLAQsgA0EANgIAIAZBAWohAUGIASECDMoBC0GfASECIAEgBEYN4gEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4wELIANBADYCACAGQQFqIQFBKQwPC0GeASECIAEgBEYN4QEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBuNQAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4gELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBnQEhAgzhAQsgAS0AAEHFAEcNDiABQQFqIQFBhAEhAgzHAQsgASAERgRAQZwBIQIM4AELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFBggEhAgzHAQsgAUEBaiEBQYMBIQIMxgELQZsBIQIgASAERg3eASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGz1ABqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzfAQsgA0EANgIAIAZBAWohAUEjDAsLQZoBIQIgASAERg3dASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGw1ABqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzeAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGZASECDN0BCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQf0AIQIMxAELIAFBAWohAUGAASECDMMBCyABIARGBEBBmAEhAgzcAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB/gAhAgzDAQsgAUEBaiEBQf8AIQIMwgELIAEgBEYEQEGXASECDNsBCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQZYBIQIgASAERg3ZASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEGs1ABqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzaAQsgA0EANgIAIAZBAWohAUEFDAYLQZUBIQIgASAERg3YASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGm1ABqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzZAQsgA0EANgIAIAZBAWohAUEWDAULQZQBIQIgASAERg3XASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzYAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGTASECDNcBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUH5ACECDL4BCyABQQFqIQFB+gAhAgy9AQtBkgEhAiABIARGDdUBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQaDUAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNYBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGRASECDNQBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC4iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB/h82AhAgA0EGNgIMDNEBC0H4ACECDLcBCyADQZABNgIcIAMgATYCFCADIAA2AgxBACECDM8BC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgzOAQtB9wAhAgy0AQsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDMwBCyABIARGBEBBjwEhAgzMAQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GbHzYCECADQQY2AgxBACECDMwBC0ECIQIMsgELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GOASECDMoBCyABIARGBEBBjQEhAgzKAQsCQCABLQAAQQlrDgRKAABKAAtB9QAhAgywAQsgAy0AKUEFRgRAQfYAIQIMsAELQfQAIQIMrwELIAEgBEYEQEGMASECDMgBCyADQRA2AgggAyABNgIEDAoLIAEgBEYEQEGLASECDMcBCwJAIAEtAABBCWsOBEcAAEcAC0HzACECDK0BCyABIARHBEAgA0EQNgIIIAMgATYCBEHxACECDK0BC0GKASECDMUBCwJAIAEgBEcEQANAIAEtAABBoNAAai0AACIAQQNHBEACQCAAQQFrDgJJAAQLQfAAIQIMrwELIAQgAUEBaiIBRw0AC0GIASEC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BCABQQFqIgFHDQALQfsAIQIMpwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMpgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMpQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMpAELIANBADYCHCADIAE2AhQgA0G8CjYCECADQQc2AgxBACECDKMBC0HPACECDIkBC0HRACECDIgBC0HnACECDIcBCyABIARGBEBB+gAhAgygAQsCQCABLQAAQQlrDgQgAAAgAAsgAUEBaiEBQeYAIQIMhgELIAEgBEYEQEH5ACECDJ8BCwJAIAEtAABBCWsOBB8AAB8AC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQRAQeIBIQIMhgELIABBFUcEQCADQQA2AhwgAyABNgIUIANByQ02AhAgA0EaNgIMQQAhAgyfAQsgA0H4ADYCHCADIAE2AhQgA0HqGjYCECADQRU2AgxBACECDJ4BCyABIARHBEAgA0ENNgIIIAMgATYCBEHkACECDIUBC0H3ACECDJ0BCyABIARGBEBB9gAhAgydAQsCQAJAAkAgAS0AAEHIAGsOCwABCwsLCwsLCwsCCwsgAUEBaiEBQd0AIQIMhQELIAFBAWohAUHgACECDIQBCyABQQFqIQFB4wAhAgyDAQtB9QAhAiABIARGDZsBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbXVAGotAABHDQggAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJwBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIABEAgA0H0ADYCHCADIAE2AhQgAyAANgIMQQAhAgycAQtB4gAhAgyCAQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJwBC0HhACECDIIBCyADQfMANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMmgELIAMtACkiAEEja0ELSQ0JAkAgAEEGSw0AQQEgAHRBygBxRQ0ADAoLQQAhAiADQQA2AhwgAyABNgIUIANB7Qk2AhAgA0EINgIMDJkBC0HyACECIAEgBEYNmAEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBs9UAai0AAEcNBSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMmQELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfEANgIcIAMgATYCFCADIAA2AgxBACECDJkBC0HfACECDH8LQQAhAAJAIAMoAjgiAkUNACACKAI0IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANB6g02AhAgA0EmNgIMQQAhAgyZAQtB3gAhAgx/CyADQfAANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMlwELIAMtAClBIUYNBiADQQA2AhwgAyABNgIUIANBkQo2AhAgA0EINgIMQQAhAgyWAQtB7wAhAiABIARGDZUBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDVAGotAABHDQIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJYBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIARQ0CIANB7QA2AhwgAyABNgIUIAMgADYCDEEAIQIMlQELIANBADYCAAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDYABIANB7gA2AhwgAyABNgIUIAMgADYCDEEAIQIMkwELQdwAIQIMeQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJMBC0HbACECDHkLIANB7AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyRAQsgAy0AKSIAQSNJDQAgAEEuRg0AIANBADYCHCADIAE2AhQgA0HJCTYCECADQQg2AgxBACECDJABC0HaACECDHYLIAEgBEYEQEHrACECDI8BCwJAIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMjwELQdkAIQIMdQsgASAERwRAIANBDjYCCCADIAE2AgRB2AAhAgx1C0HqACECDI0BCyABIARGBEBB6QAhAgyNAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1wAhAgx0CyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeiADQegANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyABIARGBEBB5wAhAgyMAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ17IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMjAELQdYAIQIMcgsgASAERgRAQeUAIQIMiwELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDI0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNfSADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeyADQeQANgIcIAMgATYCFCADIAA2AgwMiwELQdQAIQIMcQsgAy0AKUEiRg2GAUHTACECDHALQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALIABFBEBB1QAhAgxwCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQaQNNgIQIANBITYCDEEAIQIMiQELIANB4QA2AhwgAyABNgIUIANB0Bo2AhAgA0EVNgIMQQAhAgyIAQsgASAERgRAQeAAIQIMiAELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HSACECDHALIANBADYCHCADIAE2AhQgA0G2ETYCECADQQk2AgxBACECDIgBCyADQQA2AhwgAyABNgIUIANBthE2AhAgA0EJNgIMQQAhAgyHAQsgASAERgRAQd8AIQIMhwELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBthE2AhAgA0ECNgIMQQAhAgyGAQsgASAERgRAQd0AIQIMhgELIAEtAAAiAkENRgRAIAFBAWohAUHQACECDG0LIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyFAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0HKLTYCECADQQc2AgwMgwELIAEgBEYEQEHbACECDIMBCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc4AIQIMaAsgASAERgRAQdoAIQIMgQELIAEtAABBCWsOBAABAQABC0EAIQIgA0EANgIcIANBmhI2AhAgA0EHNgIMIAMgAUEBajYCFAx/CyADQYASOwEqQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2QA2AhwgAyABNgIUIANB6ho2AhAgA0EVNgIMQQAhAgx+C0HNACECDGQLIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDHwLIAEgBEYEQEHZACECDHwLIAEtAABBIEcNPSABQQFqIQEgAy0ALkEBcQ09IANBADYCHCADIAE2AhQgA0HCHDYCECADQR42AgxBACECDHsLIAEgBEYEQEHYACECDHsLAkACQAJAAkACQCABLQAAIgBBCmsOBAIDAwABCyABQQFqIQFBLCECDGULIABBOkcNASADQQA2AhwgAyABNgIUIANB5xE2AhAgA0EKNgIMQQAhAgx9CyABQQFqIQEgA0Evai0AAEEBcUUNcyADLQAyQYABcUUEQCADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALAkACQCAADhZNTEsBAQEBAQEBAQEBAQEBAQEBAQEAAQsgA0EpNgIcIAMgATYCFCADQawZNgIQIANBFTYCDEEAIQIMfgsg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c3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=="; - var wasmBuffer; - Object.defineProperty(module, "exports", { - get: () => { - return wasmBuffer ? wasmBuffer : wasmBuffer = Buffer2.from(wasmBase64, "base64"); - } + return void 0; +} +function everyInstructionPlan(instructionPlan, predicate) { + if (!predicate(instructionPlan)) { + return false; + } + if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { + return true; + } + return instructionPlan.plans.every((p) => everyInstructionPlan(p, predicate)); +} +function transformInstructionPlan(instructionPlan, fn) { + if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { + return Object.freeze(fn(instructionPlan)); + } + return Object.freeze( + fn( + Object.freeze({ + ...instructionPlan, + plans: instructionPlan.plans.map((p) => transformInstructionPlan(p, fn)) + }) + ) + ); +} +function flattenInstructionPlan(instructionPlan) { + if (instructionPlan.kind === "single" || instructionPlan.kind === "messagePacker") { + return [instructionPlan]; + } + return instructionPlan.plans.flatMap(flattenInstructionPlan); +} +function getLinearMessagePackerInstructionPlan({ + getInstruction, + totalLength: totalBytes +}) { + return Object.freeze({ + getMessagePacker: () => { + let offset = 0; + return Object.freeze({ + done: () => offset >= totalBytes, + packMessageToCapacity: (message) => { + if (offset >= totalBytes) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE); + } + const messageSizeWithBaseInstruction = getTransactionMessageSize( + appendTransactionMessageInstruction(getInstruction(offset, 0), message) + ); + const freeSpace = TRANSACTION_SIZE_LIMIT - messageSizeWithBaseInstruction - 1; + if (freeSpace <= 0) { + const messageSize = getTransactionMessageSize(message); + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, { + // (+1) We need to pack at least one byte of data otherwise + // there is no point packing the base instruction alone. + numBytesRequired: messageSizeWithBaseInstruction - messageSize + 1, + // (-1) Leeway for shortU16 numbers in transaction headers. + numFreeBytes: TRANSACTION_SIZE_LIMIT - messageSize - 1 + }); + } + const length = Math.min(totalBytes - offset, freeSpace); + const instruction = getInstruction(offset, length); + offset += length; + return appendTransactionMessageInstruction(instruction, message); + } + }); + }, + kind: "messagePacker" + }); +} +function getMessagePackerInstructionPlanFromInstructions(instructions) { + return Object.freeze({ + getMessagePacker: () => { + let instructionIndex = 0; + return Object.freeze({ + done: () => instructionIndex >= instructions.length, + packMessageToCapacity: (message) => { + if (instructionIndex >= instructions.length) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE); + } + const originalMessageSize = getTransactionMessageSize(message); + for (let index2 = instructionIndex; index2 < instructions.length; index2++) { + message = appendTransactionMessageInstruction(instructions[index2], message); + const messageSize = getTransactionMessageSize(message); + if (messageSize > TRANSACTION_SIZE_LIMIT) { + if (index2 === instructionIndex) { + throw new SolanaError( + SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, + { + numBytesRequired: messageSize - originalMessageSize, + numFreeBytes: TRANSACTION_SIZE_LIMIT - originalMessageSize + } + ); + } + instructionIndex = index2; + return message; + } + } + instructionIndex = instructions.length; + return message; + } + }); + }, + kind: "messagePacker" + }); +} +function getReallocMessagePackerInstructionPlan({ + getInstruction, + totalSize +}) { + const numberOfInstructions = Math.ceil(totalSize / REALLOC_LIMIT); + const lastInstructionSize = totalSize % REALLOC_LIMIT; + const instructions = new Array(numberOfInstructions).fill(0).map((_, i) => getInstruction(i === numberOfInstructions - 1 ? lastInstructionSize : REALLOC_LIMIT)); + return getMessagePackerInstructionPlanFromInstructions(instructions); +} +function appendTransactionMessageInstructionPlan(instructionPlan, transactionMessage) { + const leafInstructionPlans = flattenInstructionPlan(instructionPlan); + return leafInstructionPlans.reduce( + (messageSoFar, plan) => { + const kind = plan.kind; + if (kind === "single") { + return appendTransactionMessageInstruction(plan.instruction, messageSoFar); + } + if (kind === "messagePacker") { + const messagerPacker = plan.getMessagePacker(); + let nextMessage = messageSoFar; + while (!messagerPacker.done()) { + nextMessage = messagerPacker.packMessageToCapacity(nextMessage); + } + return nextMessage; + } + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { + kind + }); + }, + transactionMessage + ); +} +function parallelTransactionPlan(plans) { + return Object.freeze({ kind: "parallel", plans: parseSingleTransactionPlans(plans) }); +} +function sequentialTransactionPlan(plans) { + return Object.freeze({ divisible: true, kind: "sequential", plans: parseSingleTransactionPlans(plans) }); +} +function nonDivisibleSequentialTransactionPlan(plans) { + return Object.freeze({ divisible: false, kind: "sequential", plans: parseSingleTransactionPlans(plans) }); +} +function singleTransactionPlan(transactionMessage) { + return Object.freeze({ kind: "single", message: transactionMessage }); +} +function parseSingleTransactionPlans(plans) { + return plans.map((plan) => "kind" in plan ? plan : singleTransactionPlan(plan)); +} +function isSingleTransactionPlan(plan) { + return plan.kind === "single"; +} +function assertIsSingleTransactionPlan(plan) { + if (!isSingleTransactionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { + actualKind: plan.kind, + expectedKind: "single", + transactionPlan: plan + }); + } +} +function isSequentialTransactionPlan(plan) { + return plan.kind === "sequential"; +} +function assertIsSequentialTransactionPlan(plan) { + if (!isSequentialTransactionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { + actualKind: plan.kind, + expectedKind: "sequential", + transactionPlan: plan + }); + } +} +function isNonDivisibleSequentialTransactionPlan(plan) { + return plan.kind === "sequential" && plan.divisible === false; +} +function assertIsNonDivisibleSequentialTransactionPlan(plan) { + if (!isNonDivisibleSequentialTransactionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { + actualKind: plan.kind === "sequential" ? "divisible sequential" : plan.kind, + expectedKind: "non-divisible sequential", + transactionPlan: plan + }); + } +} +function isParallelTransactionPlan(plan) { + return plan.kind === "parallel"; +} +function assertIsParallelTransactionPlan(plan) { + if (!isParallelTransactionPlan(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, { + actualKind: plan.kind, + expectedKind: "parallel", + transactionPlan: plan + }); + } +} +function flattenTransactionPlan(transactionPlan) { + if (transactionPlan.kind === "single") { + return [transactionPlan]; + } + return transactionPlan.plans.flatMap(flattenTransactionPlan); +} +function findTransactionPlan(transactionPlan, predicate) { + if (predicate(transactionPlan)) { + return transactionPlan; + } + if (transactionPlan.kind === "single") { + return void 0; + } + for (const subPlan of transactionPlan.plans) { + const foundPlan = findTransactionPlan(subPlan, predicate); + if (foundPlan) { + return foundPlan; + } + } + return void 0; +} +function everyTransactionPlan(transactionPlan, predicate) { + if (!predicate(transactionPlan)) { + return false; + } + if (transactionPlan.kind === "single") { + return true; + } + return transactionPlan.plans.every((p) => everyTransactionPlan(p, predicate)); +} +function transformTransactionPlan(transactionPlan, fn) { + if (transactionPlan.kind === "single") { + return Object.freeze(fn(transactionPlan)); + } + return Object.freeze( + fn( + Object.freeze({ + ...transactionPlan, + plans: transactionPlan.plans.map((p) => transformTransactionPlan(p, fn)) + }) + ) + ); +} +function sequentialTransactionPlanResult(plans) { + return Object.freeze({ divisible: true, kind: "sequential", plans }); +} +function nonDivisibleSequentialTransactionPlanResult(plans) { + return Object.freeze({ divisible: false, kind: "sequential", plans }); +} +function parallelTransactionPlanResult(plans) { + return Object.freeze({ kind: "parallel", plans }); +} +function successfulSingleTransactionPlanResult(transactionMessage, transaction, context) { + return Object.freeze({ + kind: "single", + message: transactionMessage, + status: Object.freeze({ + context: context ?? {}, + kind: "successful", + signature: getSignatureFromTransaction(transaction), + transaction + }) + }); +} +function successfulSingleTransactionPlanResultFromSignature(transactionMessage, signature2, context) { + return Object.freeze({ + kind: "single", + message: transactionMessage, + status: Object.freeze({ context: context ?? {}, kind: "successful", signature: signature2 }) + }); +} +function failedSingleTransactionPlanResult(transactionMessage, error) { + return Object.freeze({ + kind: "single", + message: transactionMessage, + status: Object.freeze({ error, kind: "failed" }) + }); +} +function canceledSingleTransactionPlanResult(transactionMessage) { + return Object.freeze({ + kind: "single", + message: transactionMessage, + status: Object.freeze({ kind: "canceled" }) + }); +} +function isSingleTransactionPlanResult(plan) { + return plan.kind === "single"; +} +function assertIsSingleTransactionPlanResult(plan) { + if (!isSingleTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { + actualKind: plan.kind, + expectedKind: "single", + transactionPlanResult: plan + }); + } +} +function isSuccessfulSingleTransactionPlanResult(plan) { + return plan.kind === "single" && plan.status.kind === "successful"; +} +function assertIsSuccessfulSingleTransactionPlanResult(plan) { + if (!isSuccessfulSingleTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { + actualKind: plan.kind === "single" ? `${plan.status.kind} single` : plan.kind, + expectedKind: "successful single", + transactionPlanResult: plan }); } -}); - -// node_modules/undici/lib/llhttp/llhttp_simd-wasm.js -var require_llhttp_simd_wasm = __commonJS({ - "node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports, module) { - "use strict"; - var { Buffer: Buffer2 } = __require("buffer"); - var wasmBase64 = "AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgLhocCAwd/A34BeyABIAJqIQQCQCAAIgMoAgwiAA0AIAMoAgQEQCADIAE2AgQLIwBBEGsiCSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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DAgLQeMBDAcLQdcBDAYLQdgBDAULQdkBDAQLQdoBDAMLQdsBDAILQd0BDAELQdwBCyECA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAn8CQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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A0EXNgIcIAMgADYCDCADIAFBAWo2AhQM+AILIABBFUYNI0EAIQIgA0EANgIcIAMgATYCFCADQdYMNgIQIANBIzYCDAz3AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQwdCyADQRk2AhwgAyAANgIMIAMgAUEBajYCFAz2AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQzvAgsgA0EaNgIcIAMgADYCDCADIAFBAWo2AhQM9QILIABBFUYNH0EAIQIgA0EANgIcIAMgATYCFCADQdAPNgIQIANBIjYCDAz0AgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDBsLIANBHDYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgzzAgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDOsCCyADQR02AhwgAyAANgIMIAMgAUEBajYCFEEAIQIM8gILIABBO0cNASABQQFqIQELQSYhAgzXAgtBACECIANBADYCHCADIAE2AhQgA0GfFTYCECADQQw2AgwM7wILIAEgBEcEQANAIAEtAABBIEcNhAIgBCABQQFqIgFHDQALQSwhAgzvAgtBLCECDO4CCyABIARGBEBBNCECDO4CCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtBNCECDO8CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNnwIgA0EyNgIcIAMgATYCFCADIAA2AgxBACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUEQCABQQFqIQEMnwILIANBMjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgztAgsgASAERwRAAkADQCABLQAAQTBrIgBB/wFxQQpPBEBBOiECDNcCCyADKQMgIgtCmbPmzJmz5swZVg0BIAMgC0IKfiIKNwMgIAogAK1C/wGDIgtCf4VWDQEgAyAKIAt8NwMgIAQgAUEBaiIBRw0AC0HAACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABQQFqIgEQMSIADRcM4gILQcAAIQIM7AILIAEgBEYEQEHJACECDOwCCwJAA0ACQCABLQAAQQlrDhgAAqICogKpAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAgCiAgsgBCABQQFqIgFHDQALQckAIQIM7AILIAFBAWohASADQS9qLQAAQQFxDaUCIANBADYCHCADIAE2AhQgA0GXEDYCECADQQo2AgxBACECDOsCCyABIARHBEADQCABLQAAQSBHDRUgBCABQQFqIgFHDQALQfgAIQIM6wILQfgAIQIM6gILIANBAjoAKAw4C0EAIQIgA0EANgIcIANBvws2AhAgA0ECNgIMIAMgAUEBajYCFAzoAgtBACECDM4CC0ENIQIMzQILQRMhAgzMAgtBFSECDMsCC0EWIQIMygILQRghAgzJAgtBGSECDMgCC0EaIQIMxwILQRshAgzGAgtBHCECDMUCC0EdIQIMxAILQR4hAgzDAgtBHyECDMICC0EgIQIMwQILQSIhAgzAAgtBIyECDL8CC0ElIQIMvgILQeUAIQIMvQILIANBPTYCHCADIAE2AhQgAyAANgIMQQAhAgzVAgsgA0EbNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIM1AILIANBIDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNMCCyADQRM2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzSAgsgA0ELNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0QILIANBEDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNACCyADQSA2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzPAgsgA0ELNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzgILIANBDDYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM0CC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAzMAgsCQANAAkAgAS0AAEEKaw4EAAICAAILIAQgAUEBaiIBRw0AC0H9ASECDMwCCwJAAkAgAy0ANkEBRw0AQQAhAAJAIAMoAjgiAkUNACACKAJgIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB/AE2AhwgAyABNgIUIANB3Bk2AhAgA0EVNgIMQQAhAgzNAgtB3AEhAgyzAgsgA0EANgIcIAMgATYCFCADQfkLNgIQIANBHzYCDEEAIQIMywILAkACQCADLQAoQQFrDgIEAQALQdsBIQIMsgILQdQBIQIMsQILIANBAjoAMUEAIQACQCADKAI4IgJFDQAgAigCACICRQ0AIAMgAhEAACEACyAARQRAQd0BIQIMsQILIABBFUcEQCADQQA2AhwgAyABNgIUIANBtAw2AhAgA0EQNgIMQQAhAgzKAgsgA0H7ATYCHCADIAE2AhQgA0GBGjYCECADQRU2AgxBACECDMkCCyABIARGBEBB+gEhAgzJAgsgAS0AAEHIAEYNASADQQE6ACgLQcABIQIMrgILQdoBIQIMrQILIAEgBEcEQCADQQw2AgggAyABNgIEQdkBIQIMrQILQfkBIQIMxQILIAEgBEYEQEH4ASECDMUCCyABLQAAQcgARw0EIAFBAWohAUHYASECDKsCCyABIARGBEBB9wEhAgzEAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQdYBIQIMqwILIAFBAWohAUHXASECDKoCC0H2ASECIAEgBEYNwgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABButUAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMwwILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgBFBEBB4wEhAgyqAgsgA0H1ATYCHCADIAE2AhQgAyAANgIMQQAhAgzCAgtB9AEhAiABIARGDcECIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjVAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMICCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB5R82AhAgA0EINgIMDL8CC0HVASECDKUCCyADQfMBNgIcIAMgATYCFCADIAA2AgxBACECDL0CC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ1uIABBFUcEQCADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgy9AgsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDLwCCyABIARHBEAgA0ENNgIIIAMgATYCBEHTASECDKMCC0HyASECDLsCCyABIARGBEBB8QEhAgy7AgsCQAJAAkAgAS0AAEHIAGsOCwABCAgICAgICAgCCAsgAUEBaiEBQdABIQIMowILIAFBAWohAUHRASECDKICCyABQQFqIQFB0gEhAgyhAgtB8AEhAiABIARGDbkCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEG11QBqLQAARw0EIABBAkYNAyAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy5AgtB7wEhAiABIARGDbgCIAMoAgAiACAEIAFraiEGIAEgAGtBAWohBQNAIAEtAAAgAEGz1QBqLQAARw0DIABBAUYNAiAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy4AgtB7gEhAiABIARGDbcCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEGw1QBqLQAARw0CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy3AgsgAygCBCEAIANCADcDACADIAAgBUEBaiIBECsiAEUNAiADQewBNgIcIAMgATYCFCADIAA2AgxBACECDLYCCyADQQA2AgALIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ2cAiADQe0BNgIcIAMgATYCFCADIAA2AgxBACECDLQCC0HPASECDJoCC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMtAILQc4BIQIMmgILIANB6wE2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyyAgsgASAERgRAQesBIQIMsgILIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMsQILQc0BIQIMlwILIAEgBEcEQCADQQ42AgggAyABNgIEQcwBIQIMlwILQeoBIQIMrwILIAEgBEYEQEHpASECDK8CCyABLQAAQTBrIgBB/wFxQQpJBEAgAyAAOgAqIAFBAWohAUHLASECDJYCCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNlwIgA0HoATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgASAERgRAQecBIQIMrgILAkAgAS0AAEEuRgRAIAFBAWohAQwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmAIgA0HmATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgtBygEhAgyUAgsgASAERgRAQeUBIQIMrQILQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDK8CCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmgIgA0HjATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5AE2AhwgAyABNgIUIAMgADYCDAytAgtByQEhAgyTAgtBACEAAkAgAygCOCICRQ0AIAIoAkQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GkDTYCECADQSE2AgxBACECDK0CC0HIASECDJMCCyADQeEBNgIcIAMgATYCFCADQdAaNgIQIANBFTYCDEEAIQIMqwILIAEgBEYEQEHhASECDKsCCwJAIAEtAABBIEYEQCADQQA7ATQgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GZETYCECADQQk2AgxBACECDKsCC0HHASECDJECCyABIARGBEBB4AEhAgyqAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKsCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyqAgtBxgEhAgyQAgsgASAERgRAQd8BIQIMqQILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyqAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqQILQcUBIQIMjwILIAEgBEYEQEHeASECDKgCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqQILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKgCC0HEASECDI4CCyABIARGBEBB3QEhAgynAgsCQAJAAkACQCABLQAAQQprDhcCAwMAAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAFBAWoMBQsgAUEBaiEBQcMBIQIMjwILIAFBAWohASADQS9qLQAAQQFxDQggA0EANgIcIAMgATYCFCADQY0LNgIQIANBDTYCDEEAIQIMpwILIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKYCCyABIARHBEAgA0EPNgIIIAMgATYCBEEBIQIMjQILQdwBIQIMpQILAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0HbASECDKYCCyADKAIEIQAgA0EANgIEIAMgACABEC0iAEUEQCABQQFqIQEMBAsgA0HaATYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgylAgsgAygCBCEAIANBADYCBCADIAAgARAtIgANASABQQFqCyEBQcEBIQIMigILIANB2QE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMogILQcIBIQIMiAILIANBL2otAABBAXENASADQQA2AhwgAyABNgIUIANB5Bw2AhAgA0EZNgIMQQAhAgygAgsgASAERgRAQdkB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CyADIAU2AgAMkAILIANBADYCACAGQQFqIQFBGgw8C0HKASECIAEgBEYNjgIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBjdUAai0AAEcNOyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjwILIANBADYCACAGQQFqIQFBIQw7CyABIARGBEBByQEhAgyOAgsCQAJAIAEtAABBwQBrDhQAPT09PT09PT09PT09PT09PT09AT0LIAFBAWohAUGtASECDPUBCyABQQFqIQFBsAEhAgz0AQsgASAERgRAQcgBIQIMjQILAkACQCABLQAAQdUAaw4LADw8PDw8PDw8PAE8CyABQQFqIQFBrgEhAgz0AQsgAUEBaiEBQa8BIQIM8wELQccBIQIgASAERg2LAiADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw04IABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyMAgsgA0EANgIAIAZBAWohAUEqDDgLIAEgBEYEQEHGASECDIsCCyABLQAAQdAARw04IAFBAWohAUElDDcLQcUBIQIgASAERg2JAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGB1QBqLQAARw02IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyKAgsgA0EANgIAIAZBAWohAUEODDYLIAEgBEYEQEHEASECDIkCCyABLQAAQcUARw02IAFBAWohAUGrASECDO8BCyABIARGBEBBwwEhAgyIAgsCQAJAAkACQCABLQAAQcIAaw4PAAECOTk5OTk5OTk5OTkDOQsgAUEBaiEBQacBIQIM8QELIAFBAWohAUGoASECDPABCyABQQFqIQFBqQEhAgzvAQsgAUEBaiEBQaoBIQIM7gELQcIBIQIgASAERg2GAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH+1ABqLQAARw0zIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyHAgsgA0EANgIAIAZBAWohAUEUDDMLQcEBIQIgASAERg2FAiADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANA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BTYCAAzsAQsgA0EANgIAIAZBAWohAUEXDBgLQaYBIQIgASAERg3qASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHB1ABqLQAARw0XIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzrAQsgA0EANgIAIAZBAWohAUEYDBcLIAEgBEYEQEGlASECDOoBCwJAAkAgAS0AAEHJAGsOBwAZGRkZGQEZCyABQQFqIQFBiwEhAgzRAQsgAUEBaiEBQYwBIQIM0AELQaQBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw0VIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEJDBULQaMBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw0UIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEfDBQLQaIBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEG+1ABqLQAARw0TIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUECDBMLQaEBIQIgASAERg3lASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYDQCABLQAAIABBvNQAai0AAEcNESAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5QELIAEgBEYEQEGgASECDOUBC0EBIAEtAABB3wBHDREaIAFBAWohAUGHASECDMsBCyADQQA2AgAgBkEBaiEBQYgBIQIMygELQZ8BIQIgASAERg3iASADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw0PIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzjAQsgA0EANgIAIAZBAWohAUEpDA8LQZ4BIQIgASAERg3hASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEG41ABqLQAARw0OIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAziAQsgA0EANgIAIAZBAWohAUEtDA4LIAEgBEYEQEGdASECDOEBCyABLQAAQcUARw0OIAFBAWohAUGEASECDMcBCyABIARGBEBBnAEhAgzgAQsCQAJAIAEtAABBzABrDggADw8PDw8PAQ8LIAFBAWohAUGCASECDMcBCyABQQFqIQFBgwEhAgzGAQtBmwEhAiABIARGDd4BIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQbPUAGotAABHDQsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN8BCyADQQA2AgAgBkEBaiEBQSMMCwtBmgEhAiABIARGDd0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDUAGotAABHDQogAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN4BCyADQQA2AgAgBkEBaiEBQQAMCgsgASAERgRAQZkBIQIM3QELAkACQCABLQAAQcgAaw4IAAwMDAwMDAEMCyABQQFqIQFB/QAhAgzEAQsgAUEBaiEBQYABIQIMwwELIAEgBEYEQEGYASECDNwBCwJAAkAgAS0AAEHOAGsOAwALAQsLIAFBAWohAUH+ACECDMMBCyABQQFqIQFB/wAhAgzCAQsgASAERgRAQZcBIQIM2wELIAEtAABB2QBHDQggAUEBaiEBQQgMBwtBlgEhAiABIARGDdkBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazUAGotAABHDQYgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNoBCyADQQA2AgAgBkEBaiEBQQUMBgtBlQEhAiABIARGDdgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQabUAGotAABHDQUgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNkBCyADQQA2AgAgBkEBaiEBQRYMBQtBlAEhAiABIARGDdcBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDQQgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyADQQA2AgAgBkEBaiEBQRAMBAsgASAERgRAQZMBIQIM1wELAkACQCABLQAAQcMAaw4MAAYGBgYGBgYGBgYBBgsgAUEBaiEBQfkAIQIMvgELIAFBAWohAUH6ACECDL0BC0GSASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBoNQAai0AAEcNAiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBJAwCCyADQQA2AgAMAgsgASAERgRAQZEBIQIM1AELIAEtAABBzABHDQEgAUEBaiEBQRMLOgApIAMoAgQhACADQQA2AgQgAyAAIAEQLiIADQIMAQtBACECIANBADYCHCADIAE2AhQgA0H+HzYCECADQQY2AgwM0QELQfgAIQIMtwELIANBkAE2AhwgAyABNgIUIAMgADYCDEEAIQIMzwELQQAhAAJAIAMoAjgiAkUNACACKAJAIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GCDzYCECADQSA2AgxBACECDM4BC0H3ACECDLQBCyADQY8BNgIcIAMgATYCFCADQewbNgIQIANBFTYCDEEAIQIMzAELIAEgBEYEQEGPASECDMwBCwJAIAEtAABBIEYEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQZsfNgIQIANBBjYCDEEAIQIMzAELQQIhAgyyAQsDQCABLQAAQSBHDQIgBCABQQFqIgFHDQALQY4BIQIMygELIAEgBEYEQEGNASECDMoBCwJAIAEtAABBCWsOBEoAAEoAC0H1ACECDLABCyADLQApQQVGBEBB9gAhAgywAQtB9AAhAgyvAQsgASAERgRAQYwBIQIMyAELIANBEDYCCCADIAE2AgQMCgsgASAERgRAQYsBIQIMxwELAkAgAS0AAEEJaw4ERwAARwALQfMAIQIMrQELIAEgBEcEQCADQRA2AgggAyABNgIEQfEAIQIMrQELQYoBIQIMxQELAkAgASAERwRAA0AgAS0AAEGg0ABqLQAAIgBBA0cEQAJAIABBAWsOAkkABAtB8AAhAgyvAQsgBCABQQFqIgFHDQALQYgBIQIMxgELQYgBIQIMxQELIANBADYCHCADIAE2AhQgA0HbIDYCECADQQc2AgxBACECDMQBCyABIARGBEBBiQEhAgzEAQsCQAJAAkAgAS0AAEGg0gBqLQAAQQFrDgNGAgABC0HyACECDKwBCyADQQA2AhwgAyABNgIUIANBtBI2AhAgA0EHNgIMQQAhAgzEAQtB6gAhAgyqAQsgASAERwRAIAFBAWohAUHvACECDKoBC0GHASECDMIBCyAEIAEiAEYEQEGGASECDMIBCyAALQAAIgFBL0YEQCAAQQFqIQFB7gAhAgypAQsgAUEJayICQRdLDQEgACEBQQEgAnRBm4CABHENQQwBCyAEIAEiAEYEQEGFASECDMEBCyAALQAAQS9HDQAgAEEBaiEBDAMLQQAhAiADQQA2AhwgAyAANgIUIANB2yA2AhAgA0EHNgIMDL8BCwJAAkACQAJAAkADQCABLQAAQaDOAGotAAAiAEEFRwRAAkACQCAAQQFrDghHBQYHCAAEAQgLQesAIQIMrQELIAFBAWohAUHtACECDKwBCyAEIAFBAWoiAUcNAAtBhAEhAgzDAQsgAUEBagwUCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDMEBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDMABCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDL8BCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy+AQsgASAERgRAQYMBIQIMvgELAkAgAS0AAEGgzgBqLQAAQQFrDgg+BAUGAAgCAwcLIAFBAWohAQtBAyECDKMBCyABQQFqDA0LQQAhAiADQQA2AhwgA0HREjYCECADQQc2AgwgAyABQQFqNgIUDLoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDLkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDLgBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDLcBCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy2AQtB7AAhAgycAQsgASAERgRAQYIBIQIMtQELIAFBAWoMAgsgASAERgRAQYEBIQIMtAELIAFBAWoMAQsgASAERg0BIAFBAWoLIQFBBCECDJgBC0GAASECDLABCwNAIAEtAABBoMwAai0AACIAQQJHBEAgAEEBRwRAQekAIQIMmQELDDELIAQgAUEBaiIBRw0AC0H/ACECDK8BCyABIARGBEBB/gAhAgyvAQsCQCABLQAAQQlrDjcvAwYvBAYGBgYGBgYGBgYGBgYGBgYGBgUGBgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYABgsgAUEBagshAUEFIQIMlAELIAFBAWoMBgsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgypAQsgA0EANgIcIAMgATYCFCADQY0UNgIQIANBBzYCDEEAIQIMqAELAkACQAJAAkADQCABLQAAQaDKAGotAAAiAEEFRwRAAkAgAEEBaw4GLgMEBQYABgtB6AAhAgyUAQsgBCABQQFqIgFHDQALQf0AIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqAELIANBADYCHCADIAE2AhQgA0HkCDYCECADQQc2AgxBACECDKcBCyABIARGDQEgAUEBagshAUEGIQIMjAELQfwAIQIMpAELAkACQAJAAkADQCABLQAAQaDIAGotAAAiAEEFRwRAIABBAWsOBCkCAwQFCyAEIAFBAWoiAUcNAAtB+wAhAgynAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgymAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgylAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgykAQsgA0EANgIcIAMgATYCFCADQbwKNgIQIANBBzYCDEEAIQIMowELQc8AIQIMiQELQdEAIQIMiAELQecAIQIMhwELIAEgBEYEQEH6ACECDKABCwJAIAEtAABBCWsOBCAAACAACyABQQFqIQFB5gAhAgyGAQsgASAERgRAQfkAIQIMnwELAkAgAS0AAEEJaw4EHwAAHwALQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFBEBB4gEhAgyGAQsgAEEVRwRAIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDJ8BCyADQfgANgIcIAMgATYCFCADQeoaNgIQIANBFTYCDEEAIQIMngELIAEgBEcEQCADQQ02AgggAyABNgIEQeQAIQIMhQELQfcAIQIMnQELIAEgBEYEQEH2ACECDJ0BCwJAAkACQCABLQAAQcgAaw4LAAELCwsLCwsLCwILCyABQQFqIQFB3QAhAgyFAQsgAUEBaiEBQeAAIQIMhAELIAFBAWohAUHjACECDIMBC0H1ACECIAEgBEYNmwEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBtdUAai0AAEcNCCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMnAELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfQANgIcIAMgATYCFCADIAA2AgxBACECDJwBC0HiACECDIIBC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMnAELQeEAIQIMggELIANB8wA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyaAQsgAy0AKSIAQSNrQQtJDQkCQCAAQQZLDQBBASAAdEHKAHFFDQAMCgtBACECIANBADYCHCADIAE2AhQgA0HtCTYCECADQQg2AgwMmQELQfIAIQIgASAERg2YASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGz1QBqLQAARw0FIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAQsgAygCBCEAIANCADcDACADIAAgBkEBaiIBECsiAARAIANB8QA2AhwgAyABNgIUIAMgADYCDEEAIQIMmQELQd8AIQIMfwtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJkBC0HeACECDH8LIANB8AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyXAQsgAy0AKUEhRg0GIANBADYCHCADIAE2AhQgA0GRCjYCECADQQg2AgxBACECDJYBC0HvACECIAEgBEYNlQEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMlgELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgBFDQIgA0HtADYCHCADIAE2AhQgAyAANgIMQQAhAgyVAQsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNgAEgA0HuADYCHCADIAE2AhQgAyAANgIMQQAhAgyTAQtB3AAhAgx5C0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMkwELQdsAIQIMeQsgA0HsADYCHCADIAE2AhQgA0GAGzYCECADQRU2AgxBACECDJEBCyADLQApIgBBI0kNACAAQS5GDQAgA0EANgIcIAMgATYCFCADQckJNgIQIANBCDYCDEEAIQIMkAELQdoAIQIMdgsgASAERgRAQesAIQIMjwELAkAgAS0AAEEvRgRAIAFBAWohAQwBCyAD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ciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=="; - var wasmBuffer; - Object.defineProperty(module, "exports", { - get: () => { - return wasmBuffer ? wasmBuffer : wasmBuffer = Buffer2.from(wasmBase64, "base64"); - } +} +function isFailedSingleTransactionPlanResult(plan) { + return plan.kind === "single" && plan.status.kind === "failed"; +} +function assertIsFailedSingleTransactionPlanResult(plan) { + if (!isFailedSingleTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { + actualKind: plan.kind === "single" ? `${plan.status.kind} single` : plan.kind, + expectedKind: "failed single", + transactionPlanResult: plan }); } -}); - -// node_modules/undici/lib/web/fetch/constants.js -var require_constants4 = __commonJS({ - "node_modules/undici/lib/web/fetch/constants.js"(exports, module) { - "use strict"; - var corsSafeListedMethods = ( - /** @type {const} */ - ["GET", "HEAD", "POST"] - ); - var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - var nullBodyStatus = ( - /** @type {const} */ - [101, 204, 205, 304] - ); - var redirectStatus = ( - /** @type {const} */ - [301, 302, 303, 307, 308] - ); - var redirectStatusSet = new Set(redirectStatus); - var badPorts = ( - /** @type {const} */ - [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "4190", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6679", - "6697", - "10080" - ] - ); - var badPortsSet = new Set(badPorts); - var referrerPolicyTokens = ( - /** @type {const} */ - [ - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ] - ); - var referrerPolicy = ( - /** @type {const} */ - [ - "", - ...referrerPolicyTokens - ] - ); - var referrerPolicyTokensSet = new Set(referrerPolicyTokens); - var requestRedirect = ( - /** @type {const} */ - ["follow", "manual", "error"] - ); - var safeMethods = ( - /** @type {const} */ - ["GET", "HEAD", "OPTIONS", "TRACE"] - ); - var safeMethodsSet = new Set(safeMethods); - var requestMode = ( - /** @type {const} */ - ["navigate", "same-origin", "no-cors", "cors"] - ); - var requestCredentials = ( - /** @type {const} */ - ["omit", "same-origin", "include"] - ); - var requestCache = ( - /** @type {const} */ - [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ] - ); - var requestBodyHeader = ( - /** @type {const} */ - [ - "content-encoding", - "content-language", - "content-location", - "content-type", - // See https://github.com/nodejs/undici/issues/2021 - // 'Content-Length' is a forbidden header name, which is typically - // removed in the Headers implementation. However, undici doesn't - // filter out headers, so we add it here. - "content-length" - ] - ); - var requestDuplex = ( - /** @type {const} */ - [ - "half" - ] - ); - var forbiddenMethods = ( - /** @type {const} */ - ["CONNECT", "TRACE", "TRACK"] - ); - var forbiddenMethodsSet = new Set(forbiddenMethods); - var subresource = ( - /** @type {const} */ - [ - "audio", - "audioworklet", - "font", - "image", - "manifest", - "paintworklet", - "script", - "style", - "track", - "video", - "xslt", - "" - ] - ); - var subresourceSet = new Set(subresource); - module.exports = { - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex, - subresourceSet, - badPortsSet, - redirectStatusSet, - corsSafeListedMethodsSet, - safeMethodsSet, - forbiddenMethodsSet, - referrerPolicyTokens: referrerPolicyTokensSet - }; +} +function isCanceledSingleTransactionPlanResult(plan) { + return plan.kind === "single" && plan.status.kind === "canceled"; +} +function assertIsCanceledSingleTransactionPlanResult(plan) { + if (!isCanceledSingleTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { + actualKind: plan.kind === "single" ? `${plan.status.kind} single` : plan.kind, + expectedKind: "canceled single", + transactionPlanResult: plan + }); } -}); - -// node_modules/undici/lib/web/fetch/global.js -var require_global = __commonJS({ - "node_modules/undici/lib/web/fetch/global.js"(exports, module) { - "use strict"; - var globalOrigin = /* @__PURE__ */ Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; +} +function isSequentialTransactionPlanResult(plan) { + return plan.kind === "sequential"; +} +function assertIsSequentialTransactionPlanResult(plan) { + if (!isSequentialTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { + actualKind: plan.kind, + expectedKind: "sequential", + transactionPlanResult: plan + }); + } +} +function isNonDivisibleSequentialTransactionPlanResult(plan) { + return plan.kind === "sequential" && plan.divisible === false; +} +function assertIsNonDivisibleSequentialTransactionPlanResult(plan) { + if (!isNonDivisibleSequentialTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { + actualKind: plan.kind === "sequential" ? "divisible sequential" : plan.kind, + expectedKind: "non-divisible sequential", + transactionPlanResult: plan + }); + } +} +function isParallelTransactionPlanResult(plan) { + return plan.kind === "parallel"; +} +function assertIsParallelTransactionPlanResult(plan) { + if (!isParallelTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, { + actualKind: plan.kind, + expectedKind: "parallel", + transactionPlanResult: plan + }); + } +} +function isSuccessfulTransactionPlanResult(plan) { + return everyTransactionPlanResult( + plan, + (r) => !isSingleTransactionPlanResult(r) || isSuccessfulSingleTransactionPlanResult(r) + ); +} +function assertIsSuccessfulTransactionPlanResult(plan) { + if (!isSuccessfulTransactionPlanResult(plan)) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, { + transactionPlanResult: plan + }); + } +} +function findTransactionPlanResult(transactionPlanResult, predicate) { + if (predicate(transactionPlanResult)) { + return transactionPlanResult; + } + if (transactionPlanResult.kind === "single") { + return void 0; + } + for (const subResult of transactionPlanResult.plans) { + const foundResult = findTransactionPlanResult(subResult, predicate); + if (foundResult) { + return foundResult; } - function setGlobalOrigin(newOrigin) { - if (newOrigin === void 0) { - Object.defineProperty(globalThis, globalOrigin, { - value: void 0, - writable: true, - enumerable: false, - configurable: false - }); - return; + } + return void 0; +} +function getFirstFailedSingleTransactionPlanResult(transactionPlanResult) { + const result = findTransactionPlanResult( + transactionPlanResult, + (r) => r.kind === "single" && r.status.kind === "failed" + ); + if (!result) { + const context = {}; + Object.defineProperty(context, "transactionPlanResult", { + configurable: false, + enumerable: false, + value: transactionPlanResult, + writable: false + }); + throw new SolanaError( + SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND, + context + ); + } + return result; +} +function everyTransactionPlanResult(transactionPlanResult, predicate) { + if (!predicate(transactionPlanResult)) { + return false; + } + if (transactionPlanResult.kind === "single") { + return true; + } + return transactionPlanResult.plans.every((p) => everyTransactionPlanResult(p, predicate)); +} +function transformTransactionPlanResult(transactionPlanResult, fn) { + if (transactionPlanResult.kind === "single") { + return Object.freeze(fn(transactionPlanResult)); + } + return Object.freeze( + fn( + Object.freeze({ + ...transactionPlanResult, + plans: transactionPlanResult.plans.map((p) => transformTransactionPlanResult(p, fn)) + }) + ) + ); +} +function flattenTransactionPlanResult(result) { + if (result.kind === "single") { + return [result]; + } + return result.plans.flatMap(flattenTransactionPlanResult); +} +function summarizeTransactionPlanResult(result) { + const successfulTransactions = []; + const failedTransactions = []; + const canceledTransactions = []; + const flattenedResults = flattenTransactionPlanResult(result); + for (const singleResult of flattenedResults) { + switch (singleResult.status.kind) { + case "successful": { + successfulTransactions.push(singleResult); + break; } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + case "failed": { + failedTransactions.push(singleResult); + break; } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, + case "canceled": { + canceledTransactions.push(singleResult); + break; + } + } + } + return Object.freeze({ + canceledTransactions, + failedTransactions, + successful: failedTransactions.length === 0 && canceledTransactions.length === 0, + successfulTransactions + }); +} +function createTransactionPlanExecutor(config) { + return async (plan, { abortSignal } = {}) => { + const context = { + ...config, + abortSignal, + canceled: abortSignal?.aborted ?? false + }; + assertDivisibleSequentialPlansOnly(plan); + const cancelHandler = () => { + context.canceled = true; + }; + abortSignal?.addEventListener("abort", cancelHandler); + const transactionPlanResult = await traverse(plan, context); + abortSignal?.removeEventListener("abort", cancelHandler); + if (context.canceled) { + const abortReason = abortSignal?.aborted ? abortSignal.reason : void 0; + const context2 = { cause: findErrorFromTransactionPlanResult(transactionPlanResult) ?? abortReason }; + Object.defineProperty(context2, "transactionPlanResult", { + configurable: false, enumerable: false, - configurable: false + value: transactionPlanResult, + writable: false }); + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, context2); } - module.exports = { - getGlobalOrigin, - setGlobalOrigin - }; + return transactionPlanResult; + }; +} +async function traverse(transactionPlan, context) { + const kind = transactionPlan.kind; + switch (kind) { + case "sequential": + return await traverseSequential(transactionPlan, context); + case "parallel": + return await traverseParallel(transactionPlan, context); + case "single": + return await traverseSingle(transactionPlan, context); + default: + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind }); } -}); - -// node_modules/undici/lib/encoding/index.js -var require_encoding = __commonJS({ - "node_modules/undici/lib/encoding/index.js"(exports, module) { - "use strict"; - var textDecoder = new TextDecoder(); - function utf8DecodeBytes(buffer2) { - if (buffer2.length === 0) { - return ""; - } - if (buffer2[0] === 239 && buffer2[1] === 187 && buffer2[2] === 191) { - buffer2 = buffer2.subarray(3); - } - const output = textDecoder.decode(buffer2); - return output; - } - module.exports = { - utf8DecodeBytes - }; +} +async function traverseSequential(transactionPlan, context) { + if (!transactionPlan.divisible) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED); } -}); - -// node_modules/undici/lib/web/infra/index.js -var require_infra = __commonJS({ - "node_modules/undici/lib/web/infra/index.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { utf8DecodeBytes } = require_encoding(); - function collectASequenceOfCodePoints(condition, input, position) { - let result = ""; - while (position.position < input.length && condition(input[position.position])) { - result += input[position.position]; - position.position++; - } - return result; + const results = []; + for (const subPlan of transactionPlan.plans) { + const result = await traverse(subPlan, context); + results.push(result); + } + return sequentialTransactionPlanResult(results); +} +async function traverseParallel(transactionPlan, context) { + const results = await Promise.all(transactionPlan.plans.map((plan) => traverse(plan, context))); + return parallelTransactionPlanResult(results); +} +async function traverseSingle(transactionPlan, context) { + if (context.canceled) { + return canceledSingleTransactionPlanResult(transactionPlan.message); + } + try { + const result = await getAbortablePromise( + context.executeTransactionMessage(transactionPlan.message, { abortSignal: context.abortSignal }), + context.abortSignal + ); + if ("transaction" in result) { + return successfulSingleTransactionPlanResult(transactionPlan.message, result.transaction, result.context); + } else { + return successfulSingleTransactionPlanResultFromSignature( + transactionPlan.message, + result.signature, + result.context + ); } - function collectASequenceOfCodePointsFast(char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; - if (idx === -1) { - position.position = input.length; - return input.slice(start); - } - position.position = idx; - return input.slice(start, position.position); + } catch (error) { + context.canceled = true; + return failedSingleTransactionPlanResult(transactionPlan.message, error); + } +} +function findErrorFromTransactionPlanResult(result) { + if (result.kind === "single") { + return result.status.kind === "failed" ? result.status.error : void 0; + } + for (const plan of result.plans) { + const error = findErrorFromTransactionPlanResult(plan); + if (error) { + return error; } - var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; - function forgivingBase64(data) { - data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ""); - let dataLength = data.length; - if (dataLength % 4 === 0) { - if (data.charCodeAt(dataLength - 1) === 61) { - --dataLength; - if (data.charCodeAt(dataLength - 1) === 61) { - --dataLength; - } - } - } - if (dataLength % 4 === 1) { - return "failure"; - } - if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { - return "failure"; + } +} +function assertDivisibleSequentialPlansOnly(transactionPlan) { + const kind = transactionPlan.kind; + switch (kind) { + case "sequential": + if (!transactionPlan.divisible) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED); } - const buffer2 = Buffer.from(data, "base64"); - return new Uint8Array(buffer2.buffer, buffer2.byteOffset, buffer2.byteLength); - } - function isASCIIWhitespace(char) { - return char === 9 || // \t - char === 10 || // \n - char === 12 || // \f - char === 13 || // \r - char === 32; - } - function isomorphicDecode(input) { - const length = input.length; - if ((2 << 15) - 1 > length) { - return String.fromCharCode.apply(null, input); + for (const subPlan of transactionPlan.plans) { + assertDivisibleSequentialPlansOnly(subPlan); } - let result = ""; - let i = 0; - let addition = (2 << 15) - 1; - while (i < length) { - if (i + addition > length) { - addition = length - i; - } - result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); + return; + case "parallel": + for (const subPlan of transactionPlan.plans) { + assertDivisibleSequentialPlansOnly(subPlan); } - return result; + return; + case "single": + default: + return; + } +} +async function passthroughFailedTransactionPlanExecution(promise) { + try { + return await promise; + } catch (error) { + if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN)) { + return error.context.transactionPlanResult; } - var invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; - function isomorphicEncode(input) { - assert8(!invalidIsomorphicEncodeValueRegex.test(input)); - return input; + throw error; + } +} +function createTransactionPlanner(config) { + return async (instructionPlan, { abortSignal } = {}) => { + const plan = await traverse2(instructionPlan, { + abortSignal, + createTransactionMessage: config.createTransactionMessage, + onTransactionMessageUpdated: config.onTransactionMessageUpdated ?? ((msg) => msg), + parent: null, + parentCandidates: [] + }); + if (!plan) { + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN); } - function parseJSONFromBytes(bytes) { - return JSON.parse(utf8DecodeBytes(bytes)); + return freezeTransactionPlan(plan); + }; +} +async function traverse2(instructionPlan, context) { + context.abortSignal?.throwIfAborted(); + const kind = instructionPlan.kind; + switch (kind) { + case "sequential": + return await traverseSequential2(instructionPlan, context); + case "parallel": + return await traverseParallel2(instructionPlan, context); + case "single": + return await traverseSingle2(instructionPlan, context); + case "messagePacker": + return await traverseMessagePacker(instructionPlan, context); + default: + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind }); + } +} +async function traverseSequential2(instructionPlan, context) { + let candidate = null; + const mustEntirelyFitInParentCandidate = context.parent && (context.parent.kind === "parallel" || !instructionPlan.divisible); + if (mustEntirelyFitInParentCandidate) { + const candidate2 = await selectAndMutateCandidate( + context, + context.parentCandidates, + (message) => fitEntirePlanInsideMessage(instructionPlan, message) + ); + if (candidate2) { + return null; } - function removeASCIIWhitespace(str, leading = true, trailing = true) { - return removeChars(str, leading, trailing, isASCIIWhitespace); + } else { + candidate = context.parentCandidates.length > 0 ? context.parentCandidates[0] : null; + } + const transactionPlans = []; + for (const plan of instructionPlan.plans) { + const transactionPlan = await traverse2(plan, { + ...context, + parent: instructionPlan, + parentCandidates: candidate ? [candidate] : [] + }); + if (transactionPlan) { + candidate = getSequentialCandidate(transactionPlan); + const newPlans = transactionPlan.kind === "sequential" && (transactionPlan.divisible || !instructionPlan.divisible) ? transactionPlan.plans : [transactionPlan]; + transactionPlans.push(...newPlans); } - function removeChars(str, leading, trailing, predicate) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; - } - if (trailing) { - while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; - } - return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); + } + if (transactionPlans.length === 1) { + return transactionPlans[0]; + } + if (transactionPlans.length === 0) { + return null; + } + return { + divisible: instructionPlan.divisible, + kind: "sequential", + plans: transactionPlans + }; +} +async function traverseParallel2(instructionPlan, context) { + const candidates = [...context.parentCandidates]; + const transactionPlans = []; + const sortedChildren = Array.from(instructionPlan.plans).sort( + (a, b) => Number(a.kind === "messagePacker") - Number(b.kind === "messagePacker") + ); + for (const plan of sortedChildren) { + const transactionPlan = await traverse2(plan, { + ...context, + parent: instructionPlan, + parentCandidates: candidates + }); + if (transactionPlan) { + candidates.push(...getParallelCandidates(transactionPlan)); + const newPlans = transactionPlan.kind === "parallel" ? transactionPlan.plans : [transactionPlan]; + transactionPlans.push(...newPlans); } - function serializeJavascriptValueToJSONString(value) { - const result = JSON.stringify(value); - if (result === void 0) { - throw new TypeError("Value is not JSON serializable"); - } - assert8(typeof result === "string"); - return result; + } + if (transactionPlans.length === 1) { + return transactionPlans[0]; + } + if (transactionPlans.length === 0) { + return null; + } + return { kind: "parallel", plans: transactionPlans }; +} +async function traverseSingle2(instructionPlan, context) { + const predicate = (message2) => appendTransactionMessageInstructions([instructionPlan.instruction], message2); + const candidate = await selectAndMutateCandidate(context, context.parentCandidates, predicate); + if (candidate) { + return null; + } + const message = await createNewMessage(context, predicate); + return { kind: "single", message }; +} +async function traverseMessagePacker(instructionPlan, context) { + const messagePacker = instructionPlan.getMessagePacker(); + const transactionPlans = []; + const candidates = [...context.parentCandidates]; + while (!messagePacker.done()) { + const candidate = await selectAndMutateCandidate(context, candidates, messagePacker.packMessageToCapacity); + if (!candidate) { + const message = await createNewMessage(context, messagePacker.packMessageToCapacity); + const newPlan = { kind: "single", message }; + transactionPlans.push(newPlan); } - module.exports = { - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - forgivingBase64, - isASCIIWhitespace, - isomorphicDecode, - isomorphicEncode, - parseJSONFromBytes, - removeASCIIWhitespace, - removeChars, - serializeJavascriptValueToJSONString - }; } -}); - -// node_modules/undici/lib/web/fetch/data-url.js -var require_data_url = __commonJS({ - "node_modules/undici/lib/web/fetch/data-url.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { forgivingBase64, collectASequenceOfCodePoints, collectASequenceOfCodePointsFast, isomorphicDecode, removeASCIIWhitespace, removeChars } = require_infra(); - var encoder5 = new TextEncoder(); - var HTTP_TOKEN_CODEPOINTS = /^[-!#$%&'*+.^_|~A-Za-z0-9]+$/u; - var HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/u; - var HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/u; - function dataURLProcessor(dataURL) { - assert8(dataURL.protocol === "data:"); - let input = URLSerializer(dataURL, true); - input = input.slice(5); - const position = { position: 0 }; - let mimeType = collectASequenceOfCodePointsFast( - ",", - input, - position + if (transactionPlans.length === 1) { + return transactionPlans[0]; + } + if (transactionPlans.length === 0) { + return null; + } + if (context.parent?.kind === "parallel") { + return { kind: "parallel", plans: transactionPlans }; + } + return { + divisible: context.parent?.kind === "sequential" ? context.parent.divisible : true, + kind: "sequential", + plans: transactionPlans + }; +} +function getSequentialCandidate(latestPlan) { + if (latestPlan.kind === "single") { + return latestPlan; + } + if (latestPlan.kind === "sequential" && latestPlan.plans.length > 0) { + return getSequentialCandidate(latestPlan.plans[latestPlan.plans.length - 1]); + } + return null; +} +function getParallelCandidates(latestPlan) { + return flattenTransactionPlan(latestPlan); +} +async function selectAndMutateCandidate(context, candidates, predicate) { + for (const candidate of candidates) { + try { + const message = await getAbortablePromise( + Promise.resolve( + context.onTransactionMessageUpdated(predicate(candidate.message), { + abortSignal: context.abortSignal + }) + ), + context.abortSignal ); - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); - if (position.position >= input.length) { - return "failure"; - } - position.position++; - const encodedBody = input.slice(mimeTypeLength + 1); - let body = stringPercentDecode(encodedBody); - if (/;(?:\u0020*)base64$/ui.test(mimeType)) { - const stringBody = isomorphicDecode(body); - body = forgivingBase64(stringBody); - if (body === "failure") { - return "failure"; - } - mimeType = mimeType.slice(0, -6); - mimeType = mimeType.replace(/(\u0020+)$/u, ""); - mimeType = mimeType.slice(0, -1); - } - if (mimeType.startsWith(";")) { - mimeType = "text/plain" + mimeType; + if (getTransactionMessageSize(message) <= TRANSACTION_SIZE_LIMIT) { + candidate.message = message; + return candidate; } - let mimeTypeRecord = parseMIMEType(mimeType); - if (mimeTypeRecord === "failure") { - mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + } catch (error) { + if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN)) ; + else { + throw error; } - return { mimeType: mimeTypeRecord, body }; } - function URLSerializer(url, excludeFragment = false) { - if (!excludeFragment) { - return url.href; + } + return null; +} +async function createNewMessage(context, predicate) { + const newMessage = await getAbortablePromise( + Promise.resolve(context.createTransactionMessage({ abortSignal: context.abortSignal })), + context.abortSignal + ); + const updatedMessage = await getAbortablePromise( + Promise.resolve( + context.onTransactionMessageUpdated(predicate(newMessage), { abortSignal: context.abortSignal }) + ), + context.abortSignal + ); + const updatedMessageSize = getTransactionMessageSize(updatedMessage); + if (updatedMessageSize > TRANSACTION_SIZE_LIMIT) { + const newMessageSize = getTransactionMessageSize(newMessage); + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, { + numBytesRequired: updatedMessageSize - newMessageSize, + numFreeBytes: TRANSACTION_SIZE_LIMIT - newMessageSize + }); + } + return updatedMessage; +} +function freezeTransactionPlan(plan) { + const kind = plan.kind; + switch (kind) { + case "single": + return singleTransactionPlan(plan.message); + case "sequential": + return plan.divisible ? sequentialTransactionPlan(plan.plans.map(freezeTransactionPlan)) : nonDivisibleSequentialTransactionPlan(plan.plans.map(freezeTransactionPlan)); + case "parallel": + return parallelTransactionPlan(plan.plans.map(freezeTransactionPlan)); + default: + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind }); + } +} +function fitEntirePlanInsideMessage(instructionPlan, message) { + let newMessage = message; + const kind = instructionPlan.kind; + switch (kind) { + case "sequential": + case "parallel": + for (const plan of instructionPlan.plans) { + newMessage = fitEntirePlanInsideMessage(plan, newMessage); } - const href = url.href; - const hashLength = url.hash.length; - const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); - if (!hashLength && href.endsWith("#")) { - return serialized.slice(0, -1); + return newMessage; + case "single": + newMessage = appendTransactionMessageInstructions([instructionPlan.instruction], message); + const newMessageSize = getTransactionMessageSize(newMessage); + if (newMessageSize > TRANSACTION_SIZE_LIMIT) { + const baseMessageSize = getTransactionMessageSize(message); + throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, { + numBytesRequired: newMessageSize - baseMessageSize, + numFreeBytes: TRANSACTION_SIZE_LIMIT - baseMessageSize + }); } - return serialized; + return newMessage; + case "messagePacker": + const messagePacker = instructionPlan.getMessagePacker(); + while (!messagePacker.done()) { + newMessage = messagePacker.packMessageToCapacity(newMessage); + } + return newMessage; + default: + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind }); + } +} +var REALLOC_LIMIT, getAllSingleTransactionPlans; +var init_index_node18 = __esm({ + "node_modules/@solana/instruction-plans/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node14(); + init_index_node16(); + init_index_node17(); + REALLOC_LIMIT = 10240; + getAllSingleTransactionPlans = flattenTransactionPlan; + } +}); + +// node_modules/@solana/offchain-messages/dist/index.node.mjs +function isOffchainMessageApplicationDomain(putativeApplicationDomain) { + return isAddress2(putativeApplicationDomain); +} +function assertIsOffchainMessageApplicationDomain(putativeApplicationDomain) { + try { + assertIsAddress(putativeApplicationDomain); + } catch (error) { + if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) { + throw new SolanaError( + SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE, + error.context + ); } - function stringPercentDecode(input) { - const bytes = encoder5.encode(input); - return percentDecode(bytes); + if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) { + throw new SolanaError( + SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH, + error.context + ); } - function isHexCharByte(byte) { - return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102; + throw error; + } +} +function offchainMessageApplicationDomain(putativeApplicationDomain) { + assertIsOffchainMessageApplicationDomain(putativeApplicationDomain); + return putativeApplicationDomain; +} +function getOffchainMessageApplicationDomainEncoder() { + return transformEncoder( + getAddressEncoder(), + (putativeApplicationDomain) => offchainMessageApplicationDomain(putativeApplicationDomain) + ); +} +function getOffchainMessageApplicationDomainDecoder() { + return getAddressDecoder(); +} +function getOffchainMessageApplicationDomainCodec() { + return combineCodec(getOffchainMessageApplicationDomainEncoder(), getOffchainMessageApplicationDomainDecoder()); +} +function getOffchainMessageSigningDomainDecoder() { + return getConstantDecoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES); +} +function getOffchainMessageSigningDomainEncoder() { + return getConstantEncoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES); +} +function getSigningDomainPrefixedDecoder(...fields) { + return getHiddenPrefixDecoder(getStructDecoder(fields), [getOffchainMessageSigningDomainDecoder()]); +} +function getSigningDomainPrefixedEncoder(...fields) { + return getHiddenPrefixEncoder(getStructEncoder(fields), [getOffchainMessageSigningDomainEncoder()]); +} +function getVersionTransformer(fixedVersion) { + return (version4) => { + if (version4 > 1) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { + unsupportedVersion: version4 + }); } - function hexByteToNumber(byte) { - return ( - // 0-9 - byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55 - ); + if (fixedVersion != null && version4 !== fixedVersion) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, { + actualVersion: version4, + expectedVersion: fixedVersion + }); } - function percentDecode(input) { - const length = input.length; - const output = new Uint8Array(length); - let j = 0; - let i = 0; - while (i < length) { - const byte = input[i]; - if (byte !== 37) { - output[j++] = byte; - } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) { - output[j++] = 37; - } else { - output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]); - i += 2; - } - ++i; + return version4; + }; +} +function createOffchainMessagePreambleDecoder(version4, ...fields) { + return getSigningDomainPrefixedDecoder( + ["version", transformDecoder(getU8Decoder(), getVersionTransformer(version4))], + ...fields + ); +} +function createOffchainMessagePreambleEncoder(version4, ...fields) { + return getSigningDomainPrefixedEncoder( + ["version", transformEncoder(getU8Encoder(), getVersionTransformer(version4))], + ...fields + ); +} +function decodeRequiredSignatoryAddresses(bytes) { + const { version: version4, bytesAfterVersion } = getSigningDomainPrefixedDecoder( + ["version", transformDecoder(getU8Decoder(), getVersionTransformer())], + ["bytesAfterVersion", getBytesDecoder()] + ).decode(bytes); + return offsetDecoder( + transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), (signatoryAddresses) => { + if (signatoryAddresses.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); } - return length === j ? output : output.subarray(0, j); + return signatoryAddresses; + }), + { + preOffset: ({ preOffset }) => preOffset + (version4 === 0 ? 32 + 1 : 0) } - function parseMIMEType(input) { - input = removeHTTPWhitespace(input, true, true); - const position = { position: 0 }; - const type = collectASequenceOfCodePointsFast( - "/", - input, - position - ); - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return "failure"; - } - if (position.position >= input.length) { - return "failure"; + ).decode(bytesAfterVersion); +} +function getSignatoriesComparator() { + return (x, y) => { + if (x.length !== y.length) { + return x.length < y.length ? -1 : 1; + } + for (let ii = 0; ii < x.length; ii++) { + if (x[ii] === y[ii]) { + continue; + } else { + return x[ii] < y[ii] ? -1 : 1; } - position.position++; - let subtype = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - subtype = removeHTTPWhitespace(subtype, false, true); - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return "failure"; + } + return 0; + }; +} +function getSignaturesToEncode2(signaturesMap) { + const signatures = Object.values(signaturesMap); + if (signatures.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO); + } + return signatures.map((signature2) => { + if (!signature2) { + return new Uint8Array(64).fill(0); + } + return signature2; + }); +} +function getSignaturesEncoder2() { + return transformEncoder( + getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getU8Encoder() }), + getSignaturesToEncode2 + ); +} +function getOffchainMessageEnvelopeEncoder() { + return transformEncoder( + getStructEncoder([ + ["signatures", getSignaturesEncoder2()], + ["content", getBytesEncoder()] + ]), + (envelope) => { + const signaturesMapAddresses = Object.keys(envelope.signatures).map(address); + if (signaturesMapAddresses.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO); } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - /** @type {Map} */ - parameters: /* @__PURE__ */ new Map(), - // https://mimesniff.spec.whatwg.org/#mime-type-essence - essence: `${typeLowercase}/${subtypeLowercase}` - }; - while (position.position < input.length) { - position.position++; - collectASequenceOfCodePoints( - // https://fetch.spec.whatwg.org/#http-whitespace - (char) => HTTP_WHITESPACE_REGEX.test(char), - input, - position - ); - let parameterName = collectASequenceOfCodePoints( - (char) => char !== ";" && char !== "=", - input, - position - ); - parameterName = parameterName.toLowerCase(); - if (position.position < input.length) { - if (input[position.position] === ";") { - continue; - } - position.position++; - } - if (position.position >= input.length) { - break; - } - let parameterValue = null; - if (input[position.position] === '"') { - parameterValue = collectAnHTTPQuotedString(input, position, true); - collectASequenceOfCodePointsFast( - ";", - input, - position - ); - } else { - parameterValue = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - parameterValue = removeHTTPWhitespace(parameterValue, false, true); - if (parameterValue.length === 0) { - continue; - } - } - if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { - mimeType.parameters.set(parameterName, parameterValue); + const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(envelope.content); + const missingRequiredSigners = []; + const unexpectedSigners = []; + for (const address2 of signatoryAddresses) { + if (!signaturesMapAddresses.includes(address2)) { + missingRequiredSigners.push(address2); } } - return mimeType; - } - function collectAnHTTPQuotedString(input, position, extractValue = false) { - const positionStart = position.position; - let value = ""; - assert8(input[position.position] === '"'); - position.position++; - while (true) { - value += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== "\\", - input, - position - ); - if (position.position >= input.length) { - break; - } - const quoteOrBackslash = input[position.position]; - position.position++; - if (quoteOrBackslash === "\\") { - if (position.position >= input.length) { - value += "\\"; - break; - } - value += input[position.position]; - position.position++; - } else { - assert8(quoteOrBackslash === '"'); - break; + for (const address2 of signaturesMapAddresses) { + if (!signatoryAddresses.includes(address2)) { + unexpectedSigners.push(address2); } } - if (extractValue) { - return value; + if (missingRequiredSigners.length || unexpectedSigners.length) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, { + missingRequiredSigners, + unexpectedSigners + }); } - return input.slice(positionStart, position.position); - } - function serializeAMimeType(mimeType) { - assert8(mimeType !== "failure"); - const { parameters, essence } = mimeType; - let serialization = essence; - for (let [name, value] of parameters.entries()) { - serialization += ";"; - serialization += name; - serialization += "="; - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - value = value.replace(/[\\"]/ug, "\\$&"); - value = '"' + value; - value += '"'; - } - serialization += value; + const orderedSignatureMap = {}; + for (const address2 of signatoryAddresses) { + orderedSignatureMap[address2] = envelope.signatures[address2]; } - return serialization; - } - function isHTTPWhiteSpace(char) { - return char === 13 || char === 10 || char === 9 || char === 32; - } - function removeHTTPWhitespace(str, leading = true, trailing = true) { - return removeChars(str, leading, trailing, isHTTPWhiteSpace); + return { + ...envelope, + signatures: orderedSignatureMap + }; } - function minimizeSupportedMimeType(mimeType) { - switch (mimeType.essence) { - case "application/ecmascript": - case "application/javascript": - case "application/x-ecmascript": - case "application/x-javascript": - case "text/ecmascript": - case "text/javascript": - case "text/javascript1.0": - case "text/javascript1.1": - case "text/javascript1.2": - case "text/javascript1.3": - case "text/javascript1.4": - case "text/javascript1.5": - case "text/jscript": - case "text/livescript": - case "text/x-ecmascript": - case "text/x-javascript": - return "text/javascript"; - case "application/json": - case "text/json": - return "application/json"; - case "image/svg+xml": - return "image/svg+xml"; - case "text/xml": - case "application/xml": - return "application/xml"; - } - if (mimeType.subtype.endsWith("+json")) { - return "application/json"; - } - if (mimeType.subtype.endsWith("+xml")) { - return "application/xml"; - } - return ""; + ); +} +function getOffchainMessageEnvelopeDecoder() { + return transformDecoder( + getStructDecoder([ + ["signatures", getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getU8Decoder() })], + ["content", getBytesDecoder()] + ]), + decodePartiallyDecodedOffchainMessageEnvelope + ); +} +function getOffchainMessageEnvelopeCodec() { + return combineCodec(getOffchainMessageEnvelopeEncoder(), getOffchainMessageEnvelopeDecoder()); +} +function decodePartiallyDecodedOffchainMessageEnvelope(offchainMessageEnvelope) { + const { content, signatures } = offchainMessageEnvelope; + if (signatures.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO); + } + const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(content); + if (signatoryAddresses.length !== signatures.length) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, { + numRequiredSignatures: signatoryAddresses.length, + signatoryAddresses, + signaturesLength: signatures.length + }); + } + const signaturesMap = {}; + signatoryAddresses.forEach((address2, index2) => { + const signatureForAddress = signatures[index2]; + if (signatureForAddress.every((b) => b === 0)) { + signaturesMap[address2] = null; + } else { + signaturesMap[address2] = signatureForAddress; } - module.exports = { - dataURLProcessor, - URLSerializer, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType, - removeHTTPWhitespace, - minimizeSupportedMimeType, - HTTP_TOKEN_CODEPOINTS - }; + }); + return Object.freeze({ + content, + signatures: Object.freeze(signaturesMap) + }); +} +function decodeAndValidateRequiredSignatoryAddresses(bytes) { + const signatoryAddresses = decodeRequiredSignatoryAddresses(bytes); + if (signatoryAddresses.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); } -}); - -// node_modules/undici/lib/web/webidl/index.js -var require_webidl = __commonJS({ - "node_modules/undici/lib/web/webidl/index.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { types, inspect } = __require("util"); - var { markAsUncloneable } = __require("worker_threads"); - var UNDEFINED = 1; - var BOOLEAN = 2; - var STRING = 3; - var SYMBOL = 4; - var NUMBER = 5; - var BIGINT = 6; - var NULL = 7; - var OBJECT = 8; - var FunctionPrototypeSymbolHasInstance = Function.call.bind(Function.prototype[Symbol.hasInstance]); - var webidl = { - converters: {}, - util: {}, - errors: {}, - is: {} - }; - webidl.errors.exception = function(message) { - return new TypeError(`${message.header}: ${message.message}`); - }; - webidl.errors.conversionFailed = function(opts) { - const plural = opts.types.length === 1 ? "" : " one of"; - const message = `${opts.argument} could not be converted to${plural}: ${opts.types.join(", ")}.`; - return webidl.errors.exception({ - header: opts.prefix, - message - }); - }; - webidl.errors.invalidArgument = function(context) { - return webidl.errors.exception({ - header: context.prefix, - message: `"${context.value}" is an invalid ${context.type}.` - }); - }; - webidl.brandCheck = function(V, I) { - if (!FunctionPrototypeSymbolHasInstance(I, V)) { - const err = new TypeError("Illegal invocation"); - err.code = "ERR_INVALID_THIS"; - throw err; - } - }; - webidl.brandCheckMultiple = function(List) { - const prototypes = List.map((c2) => webidl.util.MakeTypeAssertion(c2)); - return (V) => { - if (prototypes.every((typeCheck) => !typeCheck(V))) { - const err = new TypeError("Illegal invocation"); - err.code = "ERR_INVALID_THIS"; - throw err; + return signatoryAddresses; +} +function assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent) { + if (putativeContent.format !== 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, { + actualMessageFormat: putativeContent.format, + expectedMessageFormat: 0 + /* RESTRICTED_ASCII_1232_BYTES_MAX */ + }); + } + if (putativeContent.text.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); + } + if (isTextRestrictedAscii(putativeContent.text) === false) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE); + } + const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); + if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, { + actualBytes: length, + maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE + }); + } +} +function isOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent) { + if (putativeContent.format !== 0 || putativeContent.text.length === 0 || isTextRestrictedAscii(putativeContent.text) === false) { + return false; + } + const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); + return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE; +} +function offchainMessageContentRestrictedAsciiOf1232BytesMax(text) { + const putativeContent = Object.freeze({ + format: 0, + text + }); + assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent); + return putativeContent; +} +function assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent) { + if (putativeContent.text.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); + } + if (putativeContent.format !== 1) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, { + actualMessageFormat: putativeContent.format, + expectedMessageFormat: 1 + /* UTF8_1232_BYTES_MAX */ + }); + } + const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); + if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, { + actualBytes: length, + maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE + }); + } +} +function isOffchainMessageContentUtf8Of1232BytesMax(putativeContent) { + if (putativeContent.format !== 1 || putativeContent.text.length === 0) { + return false; + } + const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); + return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE; +} +function offchainMessageContentUtf8Of1232BytesMax(text) { + const putativeContent = Object.freeze({ + format: 1, + text + }); + assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent); + return putativeContent; +} +function assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent) { + if (putativeContent.format !== 2) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, { + actualMessageFormat: putativeContent.format, + expectedMessageFormat: 2 + /* UTF8_65535_BYTES_MAX */ + }); + } + if (putativeContent.text.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); + } + const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); + if (length > MAX_BODY_BYTES) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, { + actualBytes: length, + maxBytes: MAX_BODY_BYTES + }); + } +} +function isOffchainMessageContentUtf8Of65535BytesMax(putativeContent) { + if (putativeContent.format !== 2 || putativeContent.text.length === 0) { + return false; + } + const length = getUtf8Encoder().getSizeFromValue(putativeContent.text); + return length <= MAX_BODY_BYTES; +} +function offchainMessageContentUtf8Of65535BytesMax(text) { + const putativeContent = Object.freeze({ + format: 2, + text + }); + assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent); + return putativeContent; +} +function isTextRestrictedAscii(putativeRestrictedAsciiString) { + return /^[\x20-\x7e]+$/.test(putativeRestrictedAsciiString); +} +function assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(putativeMessage) { + assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeMessage.content); +} +function assertIsOffchainMessageUtf8Of1232BytesMax(putativeMessage) { + assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeMessage.content); +} +function assertIsOffchainMessageUtf8Of65535BytesMax(putativeMessage) { + assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeMessage.content); +} +function getOffchainMessageContentFormatDecoder() { + return getEnumDecoder(OffchainMessageContentFormat, { + useValuesAsDiscriminators: true + }); +} +function getOffchainMessageContentFormatEncoder() { + return getEnumEncoder(OffchainMessageContentFormat, { + useValuesAsDiscriminators: true + }); +} +function getOffchainMessageV0PreambleDecoder() { + return createOffchainMessagePreambleDecoder( + /* version */ + 0, + ["applicationDomain", getOffchainMessageApplicationDomainDecoder()], + ["messageFormat", getOffchainMessageContentFormatDecoder()], + [ + "requiredSignatories", + transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), (signatoryAddresses) => { + if (signatoryAddresses.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); } - }; - }; - webidl.argumentLengthCheck = function({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, - header: ctx + return signatoryAddresses.map((address2) => Object.freeze({ address: address2 })); + }) + ], + ["messageLength", getU16Decoder()] + ); +} +function getOffchainMessageV0PreambleEncoder() { + return createOffchainMessagePreambleEncoder( + /* version */ + 0, + ["applicationDomain", getOffchainMessageApplicationDomainEncoder()], + ["messageFormat", getOffchainMessageContentFormatEncoder()], + [ + "requiredSignatories", + transformEncoder( + getArrayEncoder(getAddressEncoder(), { size: getU8Encoder() }), + (signatoryAddresses) => { + if (signatoryAddresses.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); + } + return signatoryAddresses.map(({ address: address2 }) => address2); + } + ) + ], + ["messageLength", getU16Encoder()] + ); +} +function getOffchainMessageV0Decoder() { + return transformDecoder( + getTupleDecoder([getOffchainMessageV0PreambleDecoder(), getUtf8Decoder()]), + ([{ messageLength, messageFormat, requiredSignatories, ...preambleRest }, text]) => { + const actualLength = getUtf8Encoder().getSizeFromValue(text); + if (messageLength !== actualLength) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, { + actualLength, + specifiedLength: messageLength }); } - }; - webidl.illegalConstructor = function() { - throw webidl.errors.exception({ - header: "TypeError", - message: "Illegal constructor" + const offchainMessage = Object.freeze({ + ...preambleRest, + content: Object.freeze({ + format: messageFormat, + text + }), + requiredSignatories: Object.freeze(requiredSignatories) }); - }; - webidl.util.MakeTypeAssertion = function(I) { - return (O) => FunctionPrototypeSymbolHasInstance(I, O); - }; - webidl.util.Type = function(V) { - switch (typeof V) { - case "undefined": - return UNDEFINED; - case "boolean": - return BOOLEAN; - case "string": - return STRING; - case "symbol": - return SYMBOL; - case "number": - return NUMBER; - case "bigint": - return BIGINT; - case "function": - case "object": { - if (V === null) { - return NULL; - } - return OBJECT; + switch (messageFormat) { + case 0: { + assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage); + return offchainMessage; } - } - }; - webidl.util.Types = { - UNDEFINED, - BOOLEAN, - STRING, - SYMBOL, - NUMBER, - BIGINT, - NULL, - OBJECT - }; - webidl.util.TypeValueToString = function(o3) { - switch (webidl.util.Type(o3)) { - case UNDEFINED: - return "Undefined"; - case BOOLEAN: - return "Boolean"; - case STRING: - return "String"; - case SYMBOL: - return "Symbol"; - case NUMBER: - return "Number"; - case BIGINT: - return "BigInt"; - case NULL: - return "Null"; - case OBJECT: - return "Object"; - } - }; - webidl.util.markAsUncloneable = markAsUncloneable; - webidl.util.ConvertToInt = function(V, bitLength, signedness, flags) { - let upperBound; - let lowerBound; - if (bitLength === 64) { - upperBound = Math.pow(2, 53) - 1; - if (signedness === "unsigned") { - lowerBound = 0; - } else { - lowerBound = Math.pow(-2, 53) + 1; + case 1: { + assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage); + return offchainMessage; } - } else if (signedness === "unsigned") { - lowerBound = 0; - upperBound = Math.pow(2, bitLength) - 1; - } else { - lowerBound = Math.pow(-2, bitLength) - 1; - upperBound = Math.pow(2, bitLength - 1) - 1; - } - let x = Number(V); - if (x === 0) { - x = 0; - } - if (webidl.util.HasFlag(flags, webidl.attributes.EnforceRange)) { - if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` - }); + case 2: { + assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage); + return offchainMessage; } - x = webidl.util.IntegerPart(x); - if (x < lowerBound || x > upperBound) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + default: { + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { + unexpectedValue: messageFormat }); } - return x; - } - if (!Number.isNaN(x) && webidl.util.HasFlag(flags, webidl.attributes.Clamp)) { - x = Math.min(Math.max(x, lowerBound), upperBound); - if (Math.floor(x) % 2 === 0) { - x = Math.floor(x); - } else { - x = Math.ceil(x); - } - return x; - } - if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - return 0; - } - x = webidl.util.IntegerPart(x); - x = x % Math.pow(2, bitLength); - if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { - return x - Math.pow(2, bitLength); - } - return x; - }; - webidl.util.IntegerPart = function(n) { - const r = Math.floor(Math.abs(n)); - if (n < 0) { - return -1 * r; - } - return r; - }; - webidl.util.Stringify = function(V) { - const type = webidl.util.Type(V); - switch (type) { - case SYMBOL: - return `Symbol(${V.description})`; - case OBJECT: - return inspect(V); - case STRING: - return `"${V}"`; - case BIGINT: - return `${V}n`; - default: - return `${V}`; - } - }; - webidl.util.IsResizableArrayBuffer = function(V) { - if (types.isArrayBuffer(V)) { - return V.resizable; - } - if (types.isSharedArrayBuffer(V)) { - return V.growable; } - throw webidl.errors.exception({ - header: "IsResizableArrayBuffer", - message: `"${webidl.util.Stringify(V)}" is not an array buffer.` - }); - }; - webidl.util.HasFlag = function(flags, attributes) { - return typeof flags === "number" && (flags & attributes) === attributes; - }; - webidl.sequenceConverter = function(converter) { - return (V, prefix, argument, Iterable) => { - if (webidl.util.Type(V) !== OBJECT) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` - }); + } + ); +} +function getOffchainMessageV0Encoder() { + return transformEncoder( + getTupleEncoder([getOffchainMessageV0PreambleEncoder(), getUtf8Encoder()]), + (offchainMessage) => { + const { content, ...preamble } = offchainMessage; + switch (offchainMessage.content.format) { + case 0: { + assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage); + break; } - const method = typeof Iterable === "function" ? Iterable() : V?.[Symbol.iterator]?.(); - const seq = []; - let index2 = 0; - if (method === void 0 || typeof method.next !== "function") { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} is not iterable.` - }); + case 1: { + assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage); + break; } - while (true) { - const { done, value } = method.next(); - if (done) { - break; - } - seq.push(converter(value, prefix, `${argument}[${index2++}]`)); + case 2: { + assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage); + break; } - return seq; - }; - }; - webidl.recordConverter = function(keyConverter, valueConverter) { - return (O, prefix, argument) => { - if (webidl.util.Type(O) !== OBJECT) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} ("${webidl.util.TypeValueToString(O)}") is not an Object.` + default: { + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { + unexpectedValue: offchainMessage.content }); } - const result = {}; - if (!types.isProxy(O)) { - const keys2 = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; - for (const key of keys2) { - const keyName = webidl.util.Stringify(key); - const typedKey = keyConverter(key, prefix, `Key ${keyName} in ${argument}`); - const typedValue = valueConverter(O[key], prefix, `${argument}[${keyName}]`); - result[typedKey] = typedValue; + } + const messageLength = getUtf8Encoder().getSizeFromValue(content.text); + const compiledPreamble = { + ...preamble, + messageFormat: content.format, + messageLength + }; + return [compiledPreamble, content.text]; + } + ); +} +function getOffchainMessageV0Codec() { + return combineCodec(getOffchainMessageV0Encoder(), getOffchainMessageV0Decoder()); +} +function getOffchainMessageV1PreambleDecoder() { + return createOffchainMessagePreambleDecoder( + /* version */ + 1, + [ + "requiredSignatories", + transformDecoder( + getArrayDecoder(fixDecoderSize(getBytesDecoder(), 32), { size: getU8Decoder() }), + (signatoryAddressesBytes) => { + if (signatoryAddressesBytes.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); } - return result; - } - const keys = Reflect.ownKeys(O); - for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O, key); - if (desc?.enumerable) { - const typedKey = keyConverter(key, prefix, argument); - const typedValue = valueConverter(O[key], prefix, argument); - result[typedKey] = typedValue; + const comparator = getSignatoriesComparator(); + for (let ii = 0; ii < signatoryAddressesBytes.length - 1; ii++) { + switch (comparator(signatoryAddressesBytes[ii], signatoryAddressesBytes[ii + 1])) { + case 0: + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE); + case 1: + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED); + } } + const addressDecoder = getAddressDecoder(); + return signatoryAddressesBytes.map( + (addressBytes) => Object.freeze({ + address: addressDecoder.decode(addressBytes) + }) + ); } - return result; - }; - }; - webidl.interfaceConverter = function(TypeCheck, name) { - return (V, prefix, argument) => { - if (!TypeCheck(V)) { - throw webidl.errors.exception({ - header: prefix, - message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${name}.` - }); - } - return V; - }; - }; - webidl.dictionaryConverter = function(converters) { - converters.sort((a, b) => (a.key > b.key) - (a.key < b.key)); - return (dictionary, prefix, argument) => { - const dict = {}; - if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) { - throw webidl.errors.exception({ - header: prefix, - message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` - }); - } - for (const options of converters) { - const { key, defaultValue, required, converter } = options; - if (required === true) { - if (dictionary == null || !Object.hasOwn(dictionary, key)) { - throw webidl.errors.exception({ - header: prefix, - message: `Missing required key "${key}".` - }); - } + ) + ] + ); +} +function getOffchainMessageV1PreambleEncoder() { + return createOffchainMessagePreambleEncoder( + /* version */ + 1, + [ + "requiredSignatories", + transformEncoder( + transformEncoder( + getArrayEncoder(getBytesEncoder(), { size: getU8Encoder() }), + (signatoryAddressesBytes) => { + return signatoryAddressesBytes.toSorted(getSignatoriesComparator()); } - let value = dictionary?.[key]; - const hasDefault = defaultValue !== void 0; - if (hasDefault && value === void 0) { - value = defaultValue(); + ), + (signatoryAddresses) => { + if (signatoryAddresses.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO); } - if (required || hasDefault || value !== void 0) { - value = converter(value, prefix, `${argument}.${key}`); - if (options.allowedValues && !options.allowedValues.includes(value)) { - throw webidl.errors.exception({ - header: prefix, - message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` - }); + const seenSignatories = /* @__PURE__ */ new Set(); + for (const { address: address2 } of signatoryAddresses) { + if (seenSignatories.has(address2)) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE); } - dict[key] = value; + seenSignatories.add(address2); } + const addressEncoder = getAddressEncoder(); + return signatoryAddresses.map(({ address: address2 }) => addressEncoder.encode(address2)); } - return dict; - }; - }; - webidl.nullableConverter = function(converter) { - return (V, prefix, argument) => { - if (V === null) { - return V; - } - return converter(V, prefix, argument); - }; - }; - webidl.is.USVString = function(value) { - return typeof value === "string" && value.isWellFormed(); - }; - webidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream); - webidl.is.Blob = webidl.util.MakeTypeAssertion(Blob); - webidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams); - webidl.is.File = webidl.util.MakeTypeAssertion(File); - webidl.is.URL = webidl.util.MakeTypeAssertion(URL); - webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal); - webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort); - webidl.is.BufferSource = function(V) { - return types.isArrayBuffer(V) || ArrayBuffer.isView(V) && types.isArrayBuffer(V.buffer); - }; - webidl.util.getCopyOfBytesHeldByBufferSource = function(bufferSource) { - const jsBufferSource = bufferSource; - let jsArrayBuffer = jsBufferSource; - let offset = 0; - let length = 0; - if (types.isTypedArray(jsBufferSource) || types.isDataView(jsBufferSource)) { - jsArrayBuffer = jsBufferSource.buffer; - offset = jsBufferSource.byteOffset; - length = jsBufferSource.byteLength; - } else { - assert8(types.isAnyArrayBuffer(jsBufferSource)); - length = jsBufferSource.byteLength; + ) + ] + ); +} +function getOffchainMessageV1Decoder() { + return transformDecoder( + getTupleDecoder([getOffchainMessageV1PreambleDecoder(), getUtf8Decoder()]), + ([{ requiredSignatories, ...preambleRest }, text]) => { + if (text.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); } - if (jsArrayBuffer.detached) { - return new Uint8Array(0); + return Object.freeze({ + ...preambleRest, + content: text, + requiredSignatories: Object.freeze(requiredSignatories) + }); + } + ); +} +function getOffchainMessageV1Encoder() { + return transformEncoder( + getTupleEncoder([getOffchainMessageV1PreambleEncoder(), getUtf8Encoder()]), + (offchainMessage) => { + const { content, ...compiledPreamble } = offchainMessage; + if (content.length === 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY); } - const bytes = new Uint8Array(length); - const view = new Uint8Array(jsArrayBuffer, offset, length); - bytes.set(view); - return bytes; - }; - webidl.converters.DOMString = function(V, prefix, argument, flags) { - if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) { - return ""; + return [compiledPreamble, content]; + } + ); +} +function getOffchainMessageV1Codec() { + return combineCodec(getOffchainMessageV1Encoder(), getOffchainMessageV1Decoder()); +} +function getOffchainMessageDecoder() { + return createDecoder({ + read(bytes, offset) { + const version4 = getHiddenPrefixDecoder(getU8Decoder(), [ + // Discard the signing domain + getOffchainMessageSigningDomainDecoder() + ]).decode(bytes, offset); + switch (version4) { + case 0: + return getOffchainMessageV0Decoder().read(bytes, offset); + case 1: + return getOffchainMessageV1Decoder().read(bytes, offset); + default: + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { + unsupportedVersion: version4 + }); } - if (typeof V === "symbol") { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} is a symbol, which cannot be converted to a DOMString.` - }); + } + }); +} +function getOffchainMessageEncoder() { + return createEncoder({ + getSizeFromValue: (offchainMessage) => { + const { version: version4 } = offchainMessage; + switch (version4) { + case 0: + return getOffchainMessageV0Encoder().getSizeFromValue(offchainMessage); + case 1: + return getOffchainMessageV1Encoder().getSizeFromValue(offchainMessage); + default: + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { + unsupportedVersion: version4 + }); } - return String(V); - }; - webidl.converters.ByteString = function(V, prefix, argument) { - if (typeof V === "symbol") { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} is a symbol, which cannot be converted to a ByteString.` - }); + }, + write: (offchainMessage, bytes, offset) => { + const { version: version4 } = offchainMessage; + switch (version4) { + case 0: + return getOffchainMessageV0Encoder().write(offchainMessage, bytes, offset); + case 1: + return getOffchainMessageV1Encoder().write(offchainMessage, bytes, offset); + default: + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, { + unsupportedVersion: version4 + }); } - const x = String(V); - for (let index2 = 0; index2 < x.length; index2++) { - if (x.charCodeAt(index2) > 255) { - throw new TypeError( - `Cannot convert argument to a ByteString because the character at index ${index2} has a value of ${x.charCodeAt(index2)} which is greater than 255.` - ); - } + } + }); +} +function getOffchainMessageCodec() { + return combineCodec(getOffchainMessageEncoder(), getOffchainMessageDecoder()); +} +function compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, encoder5) { + const offchainMessageBytes = encoder5.encode(offchainMessage); + const signatures = {}; + for (const { address: address2 } of offchainMessage.requiredSignatories) { + signatures[address2] = null; + } + return Object.freeze({ + content: offchainMessageBytes, + signatures: Object.freeze(signatures) + }); +} +function compileOffchainMessageV0Envelope(offchainMessage) { + return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV0Encoder()); +} +function compileOffchainMessageV1Envelope(offchainMessage) { + return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV1Encoder()); +} +function compileOffchainMessageEnvelope(offchainMessage) { + const { version: version4 } = offchainMessage; + switch (version4) { + case 0: + return compileOffchainMessageV0Envelope(offchainMessage); + case 1: + return compileOffchainMessageV1Envelope(offchainMessage); + default: + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, { + unexpectedValue: version4 + }); + } +} +async function partiallySignOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope) { + let newSignatures; + let unexpectedSigners; + const requiredSignatoryAddresses = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content); + await Promise.all( + keyPairs.map(async (keyPair) => { + const address2 = await getAddressFromPublicKey(keyPair.publicKey); + if (!requiredSignatoryAddresses.includes(address2)) { + unexpectedSigners ||= /* @__PURE__ */ new Set(); + unexpectedSigners.add(address2); + return; } - return x; - }; - webidl.converters.USVString = function(value) { - if (typeof value === "string") { - return value.toWellFormed(); + if (unexpectedSigners) { + return; } - return `${value}`.toWellFormed(); - }; - webidl.converters.boolean = function(V) { - const x = Boolean(V); - return x; - }; - webidl.converters.any = function(V) { - return V; - }; - webidl.converters["long long"] = function(V, prefix, argument) { - const x = webidl.util.ConvertToInt(V, 64, "signed", 0, prefix, argument); - return x; - }; - webidl.converters["unsigned long long"] = function(V, prefix, argument) { - const x = webidl.util.ConvertToInt(V, 64, "unsigned", 0, prefix, argument); - return x; - }; - webidl.converters["unsigned long"] = function(V, prefix, argument) { - const x = webidl.util.ConvertToInt(V, 32, "unsigned", 0, prefix, argument); - return x; - }; - webidl.converters["unsigned short"] = function(V, prefix, argument, flags) { - const x = webidl.util.ConvertToInt(V, 16, "unsigned", flags, prefix, argument); - return x; - }; - webidl.converters.ArrayBuffer = function(V, prefix, argument, flags) { - if (webidl.util.Type(V) !== OBJECT || !types.isArrayBuffer(V)) { - throw webidl.errors.conversionFailed({ - prefix, - argument: `${argument} ("${webidl.util.Stringify(V)}")`, - types: ["ArrayBuffer"] - }); + const existingSignature = offchainMessageEnvelope.signatures[address2]; + const newSignature = await signBytes(keyPair.privateKey, offchainMessageEnvelope.content); + if (existingSignature != null && bytesEqual(newSignature, existingSignature)) { + return; } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a resizable ArrayBuffer.` - }); + newSignatures ||= {}; + newSignatures[address2] = newSignature; + }) + ); + if (unexpectedSigners && unexpectedSigners.size > 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, { + expectedAddresses: requiredSignatoryAddresses, + unexpectedAddresses: [...unexpectedSigners] + }); + } + if (!newSignatures) { + return offchainMessageEnvelope; + } + return Object.freeze({ + ...offchainMessageEnvelope, + signatures: Object.freeze({ + ...offchainMessageEnvelope.signatures, + ...newSignatures + }) + }); +} +async function signOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope) { + const out = await partiallySignOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope); + assertIsFullySignedOffchainMessageEnvelope(out); + Object.freeze(out); + return out; +} +function isFullySignedOffchainMessageEnvelope(offchainMessage) { + return Object.entries(offchainMessage.signatures).every(([_, signatureBytes2]) => !!signatureBytes2); +} +function assertIsFullySignedOffchainMessageEnvelope(offchainMessage) { + const missingSigs = []; + Object.entries(offchainMessage.signatures).forEach(([address2, signatureBytes2]) => { + if (!signatureBytes2) { + missingSigs.push(address2); + } + }); + if (missingSigs.length > 0) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, { + addresses: missingSigs + }); + } +} +async function verifyOffchainMessageEnvelope(offchainMessageEnvelope) { + let errorContext; + const requiredSignatories = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content); + await Promise.all( + requiredSignatories.map(async (address2) => { + const signature2 = offchainMessageEnvelope.signatures[address2]; + if (signature2 == null) { + errorContext ||= {}; + errorContext.signatoriesWithMissingSignatures ||= []; + errorContext.signatoriesWithMissingSignatures.push(address2); + } else { + const publicKey = await getPublicKeyFromAddress(address2); + if (await verifySignature(publicKey, signature2, offchainMessageEnvelope.content)) { + return true; + } else { + errorContext ||= {}; + errorContext.signatoriesWithInvalidSignatures ||= []; + errorContext.signatoriesWithInvalidSignatures.push(address2); + } } - return V; - }; - webidl.converters.SharedArrayBuffer = function(V, prefix, argument, flags) { - if (webidl.util.Type(V) !== OBJECT || !types.isSharedArrayBuffer(V)) { - throw webidl.errors.conversionFailed({ - prefix, - argument: `${argument} ("${webidl.util.Stringify(V)}")`, - types: ["SharedArrayBuffer"] - }); + }) + ); + if (errorContext) { + throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, errorContext); + } +} +var OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES, MAX_BODY_BYTES, MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE, OffchainMessageContentFormat; +var init_index_node19 = __esm({ + "node_modules/@solana/offchain-messages/dist/index.node.mjs"() { + "use strict"; + init_index_node6(); + init_index_node(); + init_index_node2(); + init_index_node8(); + init_index_node7(); + init_index_node3(); + init_index_node15(); + OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES = new Uint8Array([ + 255, + 115, + 111, + 108, + 97, + 110, + 97, + 32, + 111, + 102, + 102, + 99, + 104, + 97, + 105, + 110 + ]); + MAX_BODY_BYTES = // Largest 16-bit unsigned integer + 65535; + MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE = // Space remaining in the mininum IPv6 MTU after network header overhead + 1232; + OffchainMessageContentFormat = /* @__PURE__ */ ((OffchainMessageContentFormat3) => { + OffchainMessageContentFormat3[OffchainMessageContentFormat3["RESTRICTED_ASCII_1232_BYTES_MAX"] = 0] = "RESTRICTED_ASCII_1232_BYTES_MAX"; + OffchainMessageContentFormat3[OffchainMessageContentFormat3["UTF8_1232_BYTES_MAX"] = 1] = "UTF8_1232_BYTES_MAX"; + OffchainMessageContentFormat3[OffchainMessageContentFormat3["UTF8_65535_BYTES_MAX"] = 2] = "UTF8_65535_BYTES_MAX"; + return OffchainMessageContentFormat3; + })(OffchainMessageContentFormat || {}); + } +}); + +// node_modules/@solana/plugin-core/dist/index.node.mjs +function createEmptyClient() { + return addUse({}); +} +function addUse(value) { + return Object.freeze({ + ...value, + use(plugin) { + const result = plugin(value); + return result instanceof Promise ? createAsyncClient(result) : addUse(result); + } + }); +} +function createAsyncClient(promise) { + return Object.freeze({ + catch(onrejected) { + return promise.then((v) => addUse(v)).catch(onrejected); + }, + finally(onfinally) { + return promise.then((v) => addUse(v)).finally(onfinally); + }, + then(onfulfilled, onrejected) { + return promise.then((v) => addUse(v)).then(onfulfilled, onrejected); + }, + use(plugin) { + return createAsyncClient(promise.then(plugin)); + } + }); +} +var init_index_node20 = __esm({ + "node_modules/@solana/plugin-core/dist/index.node.mjs"() { + "use strict"; + } +}); + +// node_modules/@solana/programs/dist/index.node.mjs +function isProgramError(error, transactionMessage, programAddress, code) { + if (!isSolanaError(error, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM)) { + return false; + } + const instructionProgramAddress = transactionMessage.instructions[error.context.index]?.programAddress; + if (!instructionProgramAddress || instructionProgramAddress !== programAddress) { + return false; + } + return typeof code === "undefined" || error.context.code === code; +} +var init_index_node21 = __esm({ + "node_modules/@solana/programs/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + } +}); + +// node_modules/@solana/rpc-spec-types/dist/index.node.mjs +function parseJsonWithBigInts(json) { + return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => { + return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value; + }); +} +function wrapIntegersInBigIntValueObject(json) { + const out = []; + let inQuote = false; + for (let ii = 0; ii < json.length; ii++) { + let isEscaped = false; + if (json[ii] === "\\") { + out.push(json[ii++]); + isEscaped = !isEscaped; + } + if (json[ii] === '"') { + out.push(json[ii]); + if (!isEscaped) { + inQuote = !inQuote; } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a resizable SharedArrayBuffer.` - }); + continue; + } + if (!inQuote) { + const consumedNumber = consumeNumber(json, ii); + if (consumedNumber?.length) { + ii += consumedNumber.length - 1; + if (consumedNumber.match(/\.|[eE]-/)) { + out.push(consumedNumber); + } else { + out.push(wrapBigIntValueObject(consumedNumber)); + } + continue; } - return V; - }; - webidl.converters.TypedArray = function(V, T, prefix, argument, flags) { - if (webidl.util.Type(V) !== OBJECT || !types.isTypedArray(V) || V.constructor.name !== T.name) { - throw webidl.errors.conversionFailed({ - prefix, - argument: `${argument} ("${webidl.util.Stringify(V)}")`, - types: [T.name] - }); + } + out.push(json[ii]); + } + return out.join(""); +} +function consumeNumber(json, ii) { + const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/; + if (!json[ii]?.match(/[-\d]/)) { + return null; + } + const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX); + return numberMatch ? numberMatch[0] : null; +} +function wrapBigIntValueObject(value) { + return `{"$n":"${value}"}`; +} +function unwrapBigIntValueObject({ $n }) { + if ($n.match(/[eE]/)) { + const [units, exponent] = $n.split(/[eE]/); + return BigInt(units) * BigInt(10) ** BigInt(exponent); + } + return BigInt($n); +} +function isBigIntValueObject(value) { + return !!value && typeof value === "object" && "$n" in value && typeof value.$n === "string"; +} +function getNextMessageId() { + const id = _nextMessageId; + _nextMessageId++; + return id.toString(); +} +function createRpcMessage(request) { + return { + id: getNextMessageId(), + jsonrpc: "2.0", + method: request.methodName, + params: request.params + }; +} +function stringifyJsonWithBigInts(value, space) { + return unwrapBigIntValueObject2( + JSON.stringify(value, (_, v) => typeof v === "bigint" ? wrapBigIntValueObject2(v) : v, space) + ); +} +function wrapBigIntValueObject2(value) { + return { $n: `${value}` }; +} +function unwrapBigIntValueObject2(value) { + return value.replace(/\{\s*"\$n"\s*:\s*"(-?\d+)"\s*\}/g, "$1"); +} +var _nextMessageId; +var init_index_node22 = __esm({ + "node_modules/@solana/rpc-spec-types/dist/index.node.mjs"() { + "use strict"; + _nextMessageId = 0n; + } +}); + +// node_modules/@solana/rpc-spec/dist/index.node.mjs +function createRpc(rpcConfig) { + return makeProxy(rpcConfig); +} +function makeProxy(rpcConfig) { + return new Proxy(rpcConfig.api, { + defineProperty() { + return false; + }, + deleteProperty() { + return false; + }, + get(target, p, receiver) { + if (p === "then") { + return void 0; } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a view on a shared array buffer.` + return function(...rawParams) { + const methodName = p.toString(); + const getApiPlan = Reflect.get(target, methodName, receiver); + if (!getApiPlan) { + throw new SolanaError(SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, { + method: methodName, + params: rawParams + }); + } + const apiPlan = getApiPlan(...rawParams); + return createPendingRpcRequest(rpcConfig, apiPlan); + }; + } + }); +} +function createPendingRpcRequest({ transport }, plan) { + return { + async send(options) { + return await plan.execute({ signal: options?.abortSignal, transport }); + } + }; +} +function createJsonRpcApi(config) { + return new Proxy({}, { + defineProperty() { + return false; + }, + deleteProperty() { + return false; + }, + get(...args) { + const [_, p] = args; + const methodName = p.toString(); + return function(...rawParams) { + const rawRequest = Object.freeze({ methodName, params: rawParams }); + const request = config?.requestTransformer ? config?.requestTransformer(rawRequest) : rawRequest; + return Object.freeze({ + execute: async ({ signal, transport }) => { + const payload = createRpcMessage(request); + const response = await transport({ payload, signal }); + if (!config?.responseTransformer) { + return response; + } + return config.responseTransformer(response, request); + } }); + }; + } + }); +} +function isJsonRpcPayload(payload) { + if (payload == null || typeof payload !== "object" || Array.isArray(payload)) { + return false; + } + return "jsonrpc" in payload && payload.jsonrpc === "2.0" && "method" in payload && typeof payload.method === "string" && "params" in payload; +} +var init_index_node23 = __esm({ + "node_modules/@solana/rpc-spec/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node22(); + } +}); + +// node_modules/@solana/rpc-transformers/dist/index.node.mjs +function downcastNodeToNumberIfBigint(value) { + return typeof value === "bigint" ? ( + // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana + // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely + // downcasting `bigints` to `numbers`. + Number(value) + ) : value; +} +function getTreeWalker(visitors) { + return function traverse3(node, state) { + if (Array.isArray(node)) { + return node.map((element, ii) => { + const nextState = { + ...state, + keyPath: [...state.keyPath, ii] + }; + return traverse3(element, nextState); + }); + } else if (typeof node === "object" && node !== null) { + const out = {}; + for (const propName in node) { + if (!Object.prototype.hasOwnProperty.call(node, propName)) { + continue; + } + const nextState = { + ...state, + keyPath: [...state.keyPath, propName] + }; + out[propName] = traverse3(node[propName], nextState); } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a view on a resizable array buffer.` - }); + return out; + } else { + return visitors.reduce((acc, visitNode) => visitNode(acc, state), node); + } + }; +} +function getTreeWalkerRequestTransformer(visitors, initialState) { + return (request) => { + const traverse3 = getTreeWalker(visitors); + return Object.freeze({ + ...request, + params: traverse3(request.params, initialState) + }); + }; +} +function getTreeWalkerResponseTransformer(visitors, initialState) { + return (json) => getTreeWalker(visitors)(json, initialState); +} +function getBigIntDowncastRequestTransformer() { + return getTreeWalkerRequestTransformer([downcastNodeToNumberIfBigint], { keyPath: [] }); +} +function applyDefaultCommitment({ + commitmentPropertyName, + params, + optionsObjectPositionInParams, + overrideCommitment +}) { + const paramInTargetPosition = params[optionsObjectPositionInParams]; + if ( + // There's no config. + paramInTargetPosition === void 0 || // There is a config object. + paramInTargetPosition && typeof paramInTargetPosition === "object" && !Array.isArray(paramInTargetPosition) + ) { + if ( + // The config object already has a commitment set. + paramInTargetPosition && commitmentPropertyName in paramInTargetPosition + ) { + if (!paramInTargetPosition[commitmentPropertyName] || paramInTargetPosition[commitmentPropertyName] === "finalized") { + const nextParams = [...params]; + const { + [commitmentPropertyName]: _, + // eslint-disable-line @typescript-eslint/no-unused-vars + ...rest + } = paramInTargetPosition; + if (Object.keys(rest).length > 0) { + nextParams[optionsObjectPositionInParams] = rest; + } else { + if (optionsObjectPositionInParams === nextParams.length - 1) { + nextParams.length--; + } else { + nextParams[optionsObjectPositionInParams] = void 0; + } + } + return nextParams; } - return V; - }; - webidl.converters.DataView = function(V, prefix, argument, flags) { - if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) { - throw webidl.errors.conversionFailed({ - prefix, - argument: `${argument} ("${webidl.util.Stringify(V)}")`, - types: ["DataView"] - }); + } else if (overrideCommitment !== "finalized") { + const nextParams = [...params]; + nextParams[optionsObjectPositionInParams] = { + ...paramInTargetPosition, + [commitmentPropertyName]: overrideCommitment + }; + return nextParams; + } + } + return params; +} +function getDefaultCommitmentRequestTransformer({ + defaultCommitment, + optionsObjectPositionByMethod +}) { + return (request) => { + const { params, methodName } = request; + if (!Array.isArray(params)) { + return request; + } + const optionsObjectPositionInParams = optionsObjectPositionByMethod[methodName]; + if (optionsObjectPositionInParams == null) { + return request; + } + return Object.freeze({ + methodName, + params: applyDefaultCommitment({ + commitmentPropertyName: methodName === "sendTransaction" ? "preflightCommitment" : "commitment", + optionsObjectPositionInParams, + overrideCommitment: defaultCommitment, + params + }) + }); + }; +} +function getIntegerOverflowNodeVisitor(onIntegerOverflow) { + return (value, { keyPath }) => { + if (typeof value === "bigint") { + if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) { + onIntegerOverflow(keyPath, value); } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a view on a shared array buffer.` - }); + } + return value; + }; +} +function getIntegerOverflowRequestTransformer(onIntegerOverflow) { + return (request) => { + const transformer = getTreeWalkerRequestTransformer( + [getIntegerOverflowNodeVisitor((...args) => onIntegerOverflow(request, ...args))], + { keyPath: [] } + ); + return transformer(request); + }; +} +function getDefaultRequestTransformerForSolanaRpc(config) { + const handleIntegerOverflow = config?.onIntegerOverflow; + return (request) => { + return pipe( + request, + handleIntegerOverflow ? getIntegerOverflowRequestTransformer(handleIntegerOverflow) : (r) => r, + getBigIntDowncastRequestTransformer(), + getDefaultCommitmentRequestTransformer({ + defaultCommitment: config?.defaultCommitment, + optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD + }) + ); + }; +} +function getBigIntUpcastVisitor(allowedNumericKeyPaths) { + return function upcastNodeToBigIntIfNumber(value, { keyPath }) { + const isInteger = typeof value === "number" && Number.isInteger(value) || typeof value === "bigint"; + if (!isInteger) return value; + if (keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) { + return Number(value); + } else { + return BigInt(value); + } + }; +} +function keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths) { + return allowedNumericKeyPaths.some((prohibitedKeyPath) => { + if (prohibitedKeyPath.length !== keyPath.length) { + return false; + } + for (let ii = keyPath.length - 1; ii >= 0; ii--) { + const keyPathPart = keyPath[ii]; + const prohibitedKeyPathPart = prohibitedKeyPath[ii]; + if (prohibitedKeyPathPart !== keyPathPart && (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== "number")) { + return false; } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a view on a resizable array buffer.` - }); + } + return true; + }); +} +function getBigIntUpcastResponseTransformer(allowedNumericKeyPaths) { + return getTreeWalkerResponseTransformer([getBigIntUpcastVisitor(allowedNumericKeyPaths)], { keyPath: [] }); +} +function getResultResponseTransformer() { + return (json) => json.result; +} +function getSimulateTransactionAllowedNumericKeypaths() { + return [ + ["loadedAccountsDataSize"], + ...jsonParsedAccountsConfigs.map((c2) => ["accounts", KEYPATH_WILDCARD, ...c2]), + ...innerInstructionsConfigs.map((c2) => ["innerInstructions", KEYPATH_WILDCARD, ...c2]) + ]; +} +function getThrowSolanaErrorResponseTransformer() { + return (json, request) => { + const jsonRpcResponse = json; + if ("error" in jsonRpcResponse) { + const { error } = jsonRpcResponse; + const isSendTransactionPreflightFailure = error && typeof error === "object" && "code" in error && (error.code === -32002 || error.code === -32002n); + if (isSendTransactionPreflightFailure && "data" in error && error.data) { + const treeWalker = getTreeWalkerResponseTransformer( + [getBigIntUpcastVisitor(getSimulateTransactionAllowedNumericKeypaths())], + { keyPath: [] } + ); + const transformedData = treeWalker(error.data, request); + const transformedError = { ...error, data: transformedData }; + throw getSolanaErrorFromJsonRpcError(transformedError); } - return V; + throw getSolanaErrorFromJsonRpcError(jsonRpcResponse.error); + } + return jsonRpcResponse; + }; +} +function getDefaultResponseTransformerForSolanaRpc(config) { + return (response, request) => { + const methodName = request.methodName; + const keyPaths = config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : void 0; + return pipe( + response, + (r) => getThrowSolanaErrorResponseTransformer()(r, request), + (r) => getResultResponseTransformer()(r, request), + (r) => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request) + ); + }; +} +function getDefaultResponseTransformerForSolanaRpcSubscriptions(config) { + return (response, request) => { + const methodName = request.methodName; + const keyPaths = config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : void 0; + return pipe(response, (r) => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request)); + }; +} +var KEYPATH_WILDCARD, OPTIONS_OBJECT_POSITION_BY_METHOD, jsonParsedTokenAccountsConfigs, jsonParsedAccountsConfigs, innerInstructionsConfigs, messageConfig; +var init_index_node24 = __esm({ + "node_modules/@solana/rpc-transformers/dist/index.node.mjs"() { + "use strict"; + init_index_node11(); + init_index_node(); + KEYPATH_WILDCARD = {}; + OPTIONS_OBJECT_POSITION_BY_METHOD = { + accountNotifications: 1, + blockNotifications: 1, + getAccountInfo: 1, + getBalance: 1, + getBlock: 1, + getBlockHeight: 0, + getBlockProduction: 0, + getBlocks: 2, + getBlocksWithLimit: 2, + getEpochInfo: 0, + getFeeForMessage: 1, + getInflationGovernor: 0, + getInflationReward: 1, + getLargestAccounts: 0, + getLatestBlockhash: 0, + getLeaderSchedule: 1, + getMinimumBalanceForRentExemption: 1, + getMultipleAccounts: 1, + getProgramAccounts: 1, + getSignaturesForAddress: 1, + getSlot: 0, + getSlotLeader: 0, + getStakeMinimumDelegation: 0, + getSupply: 0, + getTokenAccountBalance: 1, + getTokenAccountsByDelegate: 2, + getTokenAccountsByOwner: 2, + getTokenLargestAccounts: 1, + getTokenSupply: 1, + getTransaction: 1, + getTransactionCount: 0, + getVoteAccounts: 0, + isBlockhashValid: 1, + logsNotifications: 1, + programNotifications: 1, + requestAirdrop: 2, + sendTransaction: 1, + signatureNotifications: 1, + simulateTransaction: 1 }; - webidl.converters.ArrayBufferView = function(V, prefix, argument, flags) { - if (webidl.util.Type(V) !== OBJECT || !types.isArrayBufferView(V)) { - throw webidl.errors.conversionFailed({ - prefix, - argument: `${argument} ("${webidl.util.Stringify(V)}")`, - types: ["ArrayBufferView"] - }); - } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a view on a shared array buffer.` - }); - } - if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a view on a resizable array buffer.` - }); - } - return V; + jsonParsedTokenAccountsConfigs = [ + // parsed Token/Token22 token account + ["data", "parsed", "info", "tokenAmount", "decimals"], + ["data", "parsed", "info", "tokenAmount", "uiAmount"], + ["data", "parsed", "info", "rentExemptReserve", "decimals"], + ["data", "parsed", "info", "rentExemptReserve", "uiAmount"], + ["data", "parsed", "info", "delegatedAmount", "decimals"], + ["data", "parsed", "info", "delegatedAmount", "uiAmount"], + ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "olderTransferFee", "transferFeeBasisPoints"], + ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "newerTransferFee", "transferFeeBasisPoints"], + ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "preUpdateAverageRate"], + ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "currentRate"] + ]; + jsonParsedAccountsConfigs = [ + ...jsonParsedTokenAccountsConfigs, + // parsed AddressTableLookup account + ["data", "parsed", "info", "lastExtendedSlotStartIndex"], + // parsed Config account + ["data", "parsed", "info", "slashPenalty"], + ["data", "parsed", "info", "warmupCooldownRate"], + // parsed Token/Token22 mint account + ["data", "parsed", "info", "decimals"], + // parsed Token/Token22 multisig account + ["data", "parsed", "info", "numRequiredSigners"], + ["data", "parsed", "info", "numValidSigners"], + // parsed Stake account + ["data", "parsed", "info", "stake", "delegation", "warmupCooldownRate"], + // parsed Sysvar rent account + ["data", "parsed", "info", "exemptionThreshold"], + ["data", "parsed", "info", "burnPercent"], + // parsed Vote account + ["data", "parsed", "info", "commission"], + ["data", "parsed", "info", "votes", KEYPATH_WILDCARD, "confirmationCount"] + ]; + innerInstructionsConfigs = [ + ["index"], + ["instructions", KEYPATH_WILDCARD, "accounts", KEYPATH_WILDCARD], + ["instructions", KEYPATH_WILDCARD, "programIdIndex"], + ["instructions", KEYPATH_WILDCARD, "stackHeight"] + ]; + messageConfig = [ + ["addressTableLookups", KEYPATH_WILDCARD, "writableIndexes", KEYPATH_WILDCARD], + ["addressTableLookups", KEYPATH_WILDCARD, "readonlyIndexes", KEYPATH_WILDCARD], + ["header", "numReadonlySignedAccounts"], + ["header", "numReadonlyUnsignedAccounts"], + ["header", "numRequiredSignatures"], + ["instructions", KEYPATH_WILDCARD, "accounts", KEYPATH_WILDCARD], + ["instructions", KEYPATH_WILDCARD, "programIdIndex"], + ["instructions", KEYPATH_WILDCARD, "stackHeight"] + ]; + } +}); + +// node_modules/@solana/rpc-api/dist/index.node.mjs +function createSolanaRpcApi(config) { + return createJsonRpcApi({ + requestTransformer: getDefaultRequestTransformerForSolanaRpc(config), + responseTransformer: getDefaultResponseTransformerForSolanaRpc({ + allowedNumericKeyPaths: getAllowedNumericKeypaths() + }) + }); +} +function getAllowedNumericKeypaths() { + if (!memoizedKeypaths) { + memoizedKeypaths = { + getAccountInfo: jsonParsedAccountsConfigs.map((c2) => ["value", ...c2]), + getBlock: [ + ["transactions", KEYPATH_WILDCARD, "meta", "preTokenBalances", KEYPATH_WILDCARD, "accountIndex"], + [ + "transactions", + KEYPATH_WILDCARD, + "meta", + "preTokenBalances", + KEYPATH_WILDCARD, + "uiTokenAmount", + "decimals" + ], + ["transactions", KEYPATH_WILDCARD, "meta", "postTokenBalances", KEYPATH_WILDCARD, "accountIndex"], + [ + "transactions", + KEYPATH_WILDCARD, + "meta", + "postTokenBalances", + KEYPATH_WILDCARD, + "uiTokenAmount", + "decimals" + ], + ["transactions", KEYPATH_WILDCARD, "meta", "rewards", KEYPATH_WILDCARD, "commission"], + ...innerInstructionsConfigs.map((c2) => [ + "transactions", + KEYPATH_WILDCARD, + "meta", + "innerInstructions", + KEYPATH_WILDCARD, + ...c2 + ]), + ...messageConfig.map((c2) => ["transactions", KEYPATH_WILDCARD, "transaction", "message", ...c2]), + ["rewards", KEYPATH_WILDCARD, "commission"] + ], + getClusterNodes: [ + [KEYPATH_WILDCARD, "featureSet"], + [KEYPATH_WILDCARD, "shredVersion"] + ], + getInflationGovernor: [["initial"], ["foundation"], ["foundationTerm"], ["taper"], ["terminal"]], + getInflationRate: [["foundation"], ["total"], ["validator"]], + getInflationReward: [[KEYPATH_WILDCARD, "commission"]], + getMultipleAccounts: jsonParsedAccountsConfigs.map((c2) => ["value", KEYPATH_WILDCARD, ...c2]), + getProgramAccounts: jsonParsedAccountsConfigs.flatMap((c2) => [ + ["value", KEYPATH_WILDCARD, "account", ...c2], + [KEYPATH_WILDCARD, "account", ...c2] + ]), + getRecentPerformanceSamples: [[KEYPATH_WILDCARD, "samplePeriodSecs"]], + getTokenAccountBalance: [ + ["value", "decimals"], + ["value", "uiAmount"] + ], + getTokenAccountsByDelegate: jsonParsedTokenAccountsConfigs.map((c2) => [ + "value", + KEYPATH_WILDCARD, + "account", + ...c2 + ]), + getTokenAccountsByOwner: jsonParsedTokenAccountsConfigs.map((c2) => [ + "value", + KEYPATH_WILDCARD, + "account", + ...c2 + ]), + getTokenLargestAccounts: [ + ["value", KEYPATH_WILDCARD, "decimals"], + ["value", KEYPATH_WILDCARD, "uiAmount"] + ], + getTokenSupply: [ + ["value", "decimals"], + ["value", "uiAmount"] + ], + getTransaction: [ + ["meta", "preTokenBalances", KEYPATH_WILDCARD, "accountIndex"], + ["meta", "preTokenBalances", KEYPATH_WILDCARD, "uiTokenAmount", "decimals"], + ["meta", "postTokenBalances", KEYPATH_WILDCARD, "accountIndex"], + ["meta", "postTokenBalances", KEYPATH_WILDCARD, "uiTokenAmount", "decimals"], + ["meta", "rewards", KEYPATH_WILDCARD, "commission"], + ...innerInstructionsConfigs.map((c2) => ["meta", "innerInstructions", KEYPATH_WILDCARD, ...c2]), + ...messageConfig.map((c2) => ["transaction", "message", ...c2]) + ], + getVersion: [["feature-set"]], + getVoteAccounts: [ + ["current", KEYPATH_WILDCARD, "commission"], + ["delinquent", KEYPATH_WILDCARD, "commission"] + ], + simulateTransaction: [ + ["value", "loadedAccountsDataSize"], + ...jsonParsedAccountsConfigs.map((c2) => ["value", "accounts", KEYPATH_WILDCARD, ...c2]), + ...innerInstructionsConfigs.map((c2) => ["value", "innerInstructions", KEYPATH_WILDCARD, ...c2]) + ] }; - webidl.converters.BufferSource = function(V, prefix, argument, flags) { - if (types.isArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, prefix, argument, flags); - } - if (types.isArrayBufferView(V)) { - flags &= ~webidl.attributes.AllowShared; - return webidl.converters.ArrayBufferView(V, prefix, argument, flags); - } - if (types.isSharedArrayBuffer(V)) { - throw webidl.errors.exception({ - header: prefix, - message: `${argument} cannot be a SharedArrayBuffer.` - }); - } - throw webidl.errors.conversionFailed({ - prefix, - argument: `${argument} ("${webidl.util.Stringify(V)}")`, - types: ["ArrayBuffer", "ArrayBufferView"] - }); + } + return memoizedKeypaths; +} +var memoizedKeypaths; +var init_index_node25 = __esm({ + "node_modules/@solana/rpc-api/dist/index.node.mjs"() { + "use strict"; + init_index_node23(); + init_index_node24(); + } +}); + +// node_modules/@solana/rpc-transport-http/dist/index.node.mjs +function assertIsAllowedHttpRequestHeaders(headers) { + const badHeaders = Object.keys(headers).filter((headerName) => { + const lowercaseHeaderName = headerName.toLowerCase(); + return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-"); + }); + if (badHeaders.length > 0) { + throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, { + headers: badHeaders + }); + } +} +function normalizeHeaders(headers) { + const out = {}; + for (const headerName in headers) { + out[headerName.toLowerCase()] = headers[headerName]; + } + return out; +} +function createHttpTransport(config) { + if (process.env.NODE_ENV !== "production" && false) ; + const { fromJson, headers, toJson, url } = config; + if (process.env.NODE_ENV !== "production" && headers) { + assertIsAllowedHttpRequestHeaders(headers); + } + let dispatcherConfig; + if ("dispatcher_NODE_ONLY" in config) { + dispatcherConfig = { dispatcher: config.dispatcher_NODE_ONLY }; + } + const customHeaders = headers && normalizeHeaders(headers); + return async function makeHttpRequest({ + payload, + signal + }) { + const body = toJson ? toJson(payload) : JSON.stringify(payload); + const requestInfo = { + ...dispatcherConfig, + body, + headers: { + ...customHeaders, + // Keep these headers lowercase so they will override any user-supplied headers above. + accept: "application/json", + "content-length": body.length.toString(), + "content-type": "application/json; charset=utf-8" + }, + method: "POST", + signal }; - webidl.converters.AllowSharedBufferSource = function(V, prefix, argument, flags) { - if (types.isArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, prefix, argument, flags); - } - if (types.isSharedArrayBuffer(V)) { - return webidl.converters.SharedArrayBuffer(V, prefix, argument, flags); - } - if (types.isArrayBufferView(V)) { - flags |= webidl.attributes.AllowShared; - return webidl.converters.ArrayBufferView(V, prefix, argument, flags); - } - throw webidl.errors.conversionFailed({ - prefix, - argument: `${argument} ("${webidl.util.Stringify(V)}")`, - types: ["ArrayBuffer", "SharedArrayBuffer", "ArrayBufferView"] + const response = await fetch(url, requestInfo); + if (!response.ok) { + throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, { + headers: response.headers, + message: response.statusText, + statusCode: response.status }); + } + if (fromJson) { + return fromJson(await response.text(), payload); + } + return await response.json(); + }; +} +function isSolanaRequest(payload) { + return isJsonRpcPayload(payload) && SOLANA_RPC_METHODS.includes(payload.method); +} +function createHttpTransportForSolanaRpc(config) { + return createHttpTransport({ + ...config, + fromJson: (rawResponse, payload) => isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse), + toJson: (payload) => isSolanaRequest(payload) ? stringifyJsonWithBigInts(payload) : JSON.stringify(payload) + }); +} +var DISALLOWED_HEADERS, FORBIDDEN_HEADERS, SOLANA_RPC_METHODS; +var init_index_node26 = __esm({ + "node_modules/@solana/rpc-transport-http/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node22(); + init_index_node23(); + DISALLOWED_HEADERS = { + accept: true, + "content-length": true, + "content-type": true }; - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.ByteString - ); - webidl.converters["sequence>"] = webidl.sequenceConverter( - webidl.converters["sequence"] - ); - webidl.converters["record"] = webidl.recordConverter( - webidl.converters.ByteString, - webidl.converters.ByteString - ); - webidl.converters.Blob = webidl.interfaceConverter(webidl.is.Blob, "Blob"); - webidl.converters.AbortSignal = webidl.interfaceConverter( - webidl.is.AbortSignal, - "AbortSignal" + FORBIDDEN_HEADERS = /* @__PURE__ */ Object.assign( + { + "accept-charset": true, + "access-control-request-headers": true, + "access-control-request-method": true, + connection: true, + "content-length": true, + cookie: true, + date: true, + dnt: true, + expect: true, + host: true, + "keep-alive": true, + "permissions-policy": true, + // Prefix matching is implemented in code, below. + // 'proxy-': true, + // 'sec-': true, + referer: true, + te: true, + trailer: true, + "transfer-encoding": true, + upgrade: true, + via: true + }, + void 0, + void 0 ); - webidl.converters.EventHandlerNonNull = function(V) { - if (webidl.util.Type(V) !== OBJECT) { - return null; - } - if (typeof V === "function") { - return V; - } - return () => { - }; - }; - webidl.attributes = { - Clamp: 1 << 0, - EnforceRange: 1 << 1, - AllowShared: 1 << 2, - AllowResizable: 1 << 3, - LegacyNullToEmptyString: 1 << 4 - }; - module.exports = { - webidl - }; + SOLANA_RPC_METHODS = [ + "getAccountInfo", + "getBalance", + "getBlock", + "getBlockCommitment", + "getBlockHeight", + "getBlockProduction", + "getBlocks", + "getBlocksWithLimit", + "getBlockTime", + "getClusterNodes", + "getEpochInfo", + "getEpochSchedule", + "getFeeForMessage", + "getFirstAvailableBlock", + "getGenesisHash", + "getHealth", + "getHighestSnapshotSlot", + "getIdentity", + "getInflationGovernor", + "getInflationRate", + "getInflationReward", + "getLargestAccounts", + "getLatestBlockhash", + "getLeaderSchedule", + "getMaxRetransmitSlot", + "getMaxShredInsertSlot", + "getMinimumBalanceForRentExemption", + "getMultipleAccounts", + "getProgramAccounts", + "getRecentPerformanceSamples", + "getRecentPrioritizationFees", + "getSignaturesForAddress", + "getSignatureStatuses", + "getSlot", + "getSlotLeader", + "getSlotLeaders", + "getStakeMinimumDelegation", + "getSupply", + "getTokenAccountBalance", + "getTokenAccountsByDelegate", + "getTokenAccountsByOwner", + "getTokenLargestAccounts", + "getTokenSupply", + "getTransaction", + "getTransactionCount", + "getVersion", + "getVoteAccounts", + "index", + "isBlockhashValid", + "minimumLedgerSlot", + "requestAirdrop", + "sendTransaction", + "simulateTransaction" + ]; } }); -// node_modules/undici/lib/web/fetch/util.js -var require_util2 = __commonJS({ - "node_modules/undici/lib/web/fetch/util.js"(exports, module) { - "use strict"; - var { Transform } = __require("stream"); - var zlib = __require("zlib"); - var { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require_constants4(); - var { getGlobalOrigin } = require_global(); - var { collectAnHTTPQuotedString, parseMIMEType } = require_data_url(); - var { performance: performance2 } = __require("perf_hooks"); - var { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require_util(); - var assert8 = __require("assert"); - var { isUint8Array } = __require("util/types"); - var { webidl } = require_webidl(); - var { isomorphicEncode, collectASequenceOfCodePoints, removeChars } = require_infra(); - function responseURL(response) { - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString(); - } - function responseLocationURL(response, requestFragment) { - if (!redirectStatusSet.has(response.status)) { +// node_modules/@solana/fast-stable-stringify/dist/index.node.mjs +function stringify3(val, isArrayProp) { + let i, max, str, keys, key, propVal, toStr; + if (val === true) { + return "true"; + } + if (val === false) { + return "false"; + } + switch (typeof val) { + case "object": + if (val === null) { return null; - } - let location = response.headersList.get("location", true); - if (location !== null && isValidHeaderValue(location)) { - if (!isValidEncodedURL(location)) { - location = normalizeBinaryStringToUtf8(location); + } else if ("toJSON" in val && typeof val.toJSON === "function") { + return stringify3(val.toJSON(), isArrayProp); + } else { + toStr = objToString.call(val); + if (toStr === "[object Array]") { + str = "["; + max = val.length - 1; + for (i = 0; i < max; i++) { + str += stringify3(val[i], true) + ","; + } + if (max > -1) { + str += stringify3(val[i], true); + } + return str + "]"; + } else if (toStr === "[object Object]") { + keys = objKeys(val).sort(); + max = keys.length; + str = ""; + i = 0; + while (i < max) { + key = keys[i]; + propVal = stringify3(val[key], false); + if (propVal !== void 0) { + if (str) { + str += ","; + } + str += JSON.stringify(key) + ":" + propVal; + } + i++; + } + return "{" + str + "}"; + } else { + return JSON.stringify(val); } - location = new URL(location, responseURL(response)); - } - if (location && !location.hash) { - location.hash = requestFragment; } - return location; - } - function isValidEncodedURL(url) { - for (let i = 0; i < url.length; ++i) { - const code = url.charCodeAt(i); - if (code > 126 || // Non-US-ASCII + DEL - code < 32) { - return false; - } + case "function": + case "undefined": + return isArrayProp ? null : void 0; + case "bigint": + return `${val.toString()}n`; + case "string": + return JSON.stringify(val); + default: + return isFinite(val) ? val : null; + } +} +function index_default(val) { + const returnVal = stringify3(val, false); + if (returnVal !== void 0) { + return "" + returnVal; + } +} +var objToString, objKeys; +var init_index_node27 = __esm({ + "node_modules/@solana/fast-stable-stringify/dist/index.node.mjs"() { + "use strict"; + objToString = Object.prototype.toString; + objKeys = Object.keys || function(obj) { + const keys = []; + for (const name in obj) { + keys.push(name); } - return true; - } - function normalizeBinaryStringToUtf8(value) { - return Buffer.from(value, "binary").toString("utf8"); - } - function requestCurrentURL(request) { - return request.urlList[request.urlList.length - 1]; + return keys; + }; + } +}); + +// node_modules/@solana/rpc/dist/index.node.mjs +import { setMaxListeners } from "events"; +function createSolanaJsonRpcIntegerOverflowError(methodName, keyPath, value) { + let argumentLabel = ""; + if (typeof keyPath[0] === "number") { + const argPosition = keyPath[0] + 1; + const lastDigit = argPosition % 10; + const lastTwoDigits = argPosition % 100; + if (lastDigit == 1 && lastTwoDigits != 11) { + argumentLabel = argPosition + "st"; + } else if (lastDigit == 2 && lastTwoDigits != 12) { + argumentLabel = argPosition + "nd"; + } else if (lastDigit == 3 && lastTwoDigits != 13) { + argumentLabel = argPosition + "rd"; + } else { + argumentLabel = argPosition + "th"; } - function requestBadPort(request) { - const url = requestCurrentURL(request); - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return "blocked"; - } - return "allowed"; + } else { + argumentLabel = `\`${keyPath[0].toString()}\``; + } + const path = keyPath.length > 1 ? keyPath.slice(1).map((pathPart) => typeof pathPart === "number" ? `[${pathPart}]` : pathPart).join(".") : void 0; + const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, { + argumentLabel, + keyPath, + methodName, + optionalPathLabel: path ? ` at path \`${path}\`` : "", + value, + ...path !== void 0 ? { path } : void 0 + }); + safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError); + return error; +} +function createExplicitAbortToken() { + return process.env.NODE_ENV !== "production" ? { + EXPLICIT_ABORT_TOKEN: "This object is thrown from the request that underlies a series of coalesced requests when the last request in that series aborts" + } : {}; +} +function getRpcTransportWithRequestCoalescing(transport, getDeduplicationKey) { + let coalescedRequestsByDeduplicationKey; + return async function makeCoalescedHttpRequest(request) { + const { payload, signal } = request; + const deduplicationKey = getDeduplicationKey(payload); + if (deduplicationKey === void 0) { + return await transport(request); } - function isErrorLike(object) { - return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + if (!coalescedRequestsByDeduplicationKey) { + queueMicrotask(() => { + coalescedRequestsByDeduplicationKey = void 0; + }); + coalescedRequestsByDeduplicationKey = {}; } - function isValidReasonPhrase(statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c2 = statusText.charCodeAt(i); - if (!(c2 === 9 || // HTAB - c2 >= 32 && c2 <= 126 || // SP / VCHAR - c2 >= 128 && c2 <= 255)) { - return false; + if (coalescedRequestsByDeduplicationKey[deduplicationKey] == null) { + const abortController = new e2(); + const responsePromise = (async () => { + try { + return await transport({ + ...request, + signal: abortController.signal + }); + } catch (e22) { + if (e22 === (EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken())) { + return; + } + throw e22; } - } - return true; + })(); + coalescedRequestsByDeduplicationKey[deduplicationKey] = { + abortController, + numConsumers: 0, + responsePromise + }; } - var isValidHeaderName = isValidHTTPToken; - function isValidHeaderValue(potentialValue) { - return (potentialValue[0] === " " || potentialValue[0] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue.includes("\n") || potentialValue.includes("\r") || potentialValue.includes("\0")) === false; + const coalescedRequest = coalescedRequestsByDeduplicationKey[deduplicationKey]; + coalescedRequest.numConsumers++; + if (signal) { + const responsePromise = coalescedRequest.responsePromise; + return await new Promise((resolve, reject) => { + const handleAbort = (e22) => { + signal.removeEventListener("abort", handleAbort); + coalescedRequest.numConsumers -= 1; + queueMicrotask(() => { + if (coalescedRequest.numConsumers === 0) { + const abortController = coalescedRequest.abortController; + abortController.abort(EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken()); + } + }); + reject(e22.target.reason); + }; + signal.addEventListener("abort", handleAbort); + responsePromise.then(resolve).catch(reject).finally(() => { + signal.removeEventListener("abort", handleAbort); + }); + }); + } else { + return await coalescedRequest.responsePromise; } - function parseReferrerPolicy(actualResponse) { - const policyHeader = (actualResponse.headersList.get("referrer-policy", true) ?? "").split(","); - let policy = ""; - if (policyHeader.length) { - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break; - } + }; +} +function getSolanaRpcPayloadDeduplicationKey(payload) { + return isJsonRpcPayload(payload) ? index_default([payload.method, payload.params]) : void 0; +} +function normalizeHeaders2(headers) { + const out = {}; + for (const headerName in headers) { + out[headerName.toLowerCase()] = headers[headerName]; + } + return out; +} +function createDefaultRpcTransport(config) { + return pipe( + createHttpTransportForSolanaRpc({ + ...config, + headers: { + ...{ + // Keep these headers lowercase so they will be overridden by any user-supplied headers below. + "accept-encoding": ( + // Natively supported by Node LTS v20.18.0 and above. + "br,gzip,deflate" + ) + // Brotli, gzip, and Deflate, in that order. + }, + ...config.headers ? normalizeHeaders2(config.headers) : void 0, + ...{ + // Keep these headers lowercase so they will override any user-supplied headers above. + "solana-client": `js/${"5.5.1"}` } } - return policy; - } - function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const policy = parseReferrerPolicy(actualResponse); - if (policy !== "") { - request.referrerPolicy = policy; + }), + (transport) => getRpcTransportWithRequestCoalescing(transport, getSolanaRpcPayloadDeduplicationKey) + ); +} +function createSolanaRpc(clusterUrl, config) { + return createSolanaRpcFromTransport(createDefaultRpcTransport({ url: clusterUrl, ...config })); +} +function createSolanaRpcFromTransport(transport) { + return createRpc({ + api: createSolanaRpcApi(DEFAULT_RPC_CONFIG), + transport + }); +} +var DEFAULT_RPC_CONFIG, e2, EXPLICIT_ABORT_TOKEN; +var init_index_node28 = __esm({ + "node_modules/@solana/rpc/dist/index.node.mjs"() { + "use strict"; + init_index_node25(); + init_index_node25(); + init_index_node23(); + init_index_node23(); + init_index_node(); + init_index_node11(); + init_index_node26(); + init_index_node27(); + DEFAULT_RPC_CONFIG = { + defaultCommitment: "confirmed", + onIntegerOverflow(request, keyPath, value) { + throw createSolanaJsonRpcIntegerOverflowError(request.methodName, keyPath, value); } - } - function crossOriginResourcePolicyCheck() { - return "allowed"; - } - function corsCheck() { - return "success"; - } - function TAOCheck() { - return "success"; - } - function appendFetchMetadata(httpRequest) { - let header = null; - header = httpRequest.mode; - httpRequest.headersList.set("sec-fetch-mode", header, true); - } - function appendRequestOriginHeader(request) { - let serializedOrigin = request.origin; - if (serializedOrigin === "client" || serializedOrigin === void 0) { - return; + }; + e2 = class extends globalThis.AbortController { + constructor(...t) { + super(...t), setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal); } - if (request.responseTainting === "cors" || request.mode === "websocket") { - request.headersList.append("origin", serializedOrigin, true); - } else if (request.method !== "GET" && request.method !== "HEAD") { - switch (request.referrerPolicy) { - case "no-referrer": - serializedOrigin = null; - break; - case "no-referrer-when-downgrade": - case "strict-origin": - case "strict-origin-when-cross-origin": - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - case "same-origin": - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - default: - } - request.headersList.append("origin", serializedOrigin, true); + }; + } +}); + +// node_modules/@solana/rpc-parsed-types/dist/index.node.mjs +var init_index_node29 = __esm({ + "node_modules/@solana/rpc-parsed-types/dist/index.node.mjs"() { + "use strict"; + } +}); + +// node_modules/@solana/subscribable/dist/index.node.mjs +import { setMaxListeners as setMaxListeners2 } from "events"; +function createExplicitAbortToken2() { + return /* @__PURE__ */ Symbol( + process.env.NODE_ENV !== "production" ? "This symbol is thrown from a socket's iterator when the connection is explicitly aborted by the user" : void 0 + ); +} +function createAsyncIterableFromDataPublisher({ + abortSignal, + dataChannelName, + dataPublisher, + errorChannelName +}) { + const iteratorState = /* @__PURE__ */ new Map(); + function publishErrorToAllIterators(reason) { + for (const [iteratorKey, state] of iteratorState.entries()) { + if (state.__hasPolled) { + iteratorState.delete(iteratorKey); + state.onError(reason); + } else { + state.publishQueue.push({ + __type: 1, + err: reason + }); } } - function coarsenTime(timestamp, crossOriginIsolatedCapability) { - return timestamp; - } - function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { - if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { - return { - domainLookupStartTime: defaultStartTime, - domainLookupEndTime: defaultStartTime, - connectionStartTime: defaultStartTime, - connectionEndTime: defaultStartTime, - secureConnectionStartTime: defaultStartTime, - ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol - }; + } + const abortController = new e3(); + abortSignal.addEventListener("abort", () => { + abortController.abort(); + publishErrorToAllIterators(EXPLICIT_ABORT_TOKEN2 ||= createExplicitAbortToken2()); + }); + const options = { signal: abortController.signal }; + let firstError = UNINITIALIZED; + dataPublisher.on( + errorChannelName, + (err) => { + if (firstError === UNINITIALIZED) { + firstError = err; + abortController.abort(); + publishErrorToAllIterators(err); } - return { - domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability), - domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability), - connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability), - connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability), - secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability), - ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol - }; - } - function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { - return coarsenTime(performance2.now(), crossOriginIsolatedCapability); - } - function createOpaqueTimingInfo(timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - }; - } - function makePolicyContainer() { - return { - referrerPolicy: "strict-origin-when-cross-origin" - }; - } - function clonePolicyContainer(policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - }; - } - function determineRequestsReferrer(request) { - const policy = request.referrerPolicy; - assert8(policy); - let referrerSource = null; - if (request.referrer === "client") { - const globalOrigin = getGlobalOrigin(); - if (!globalOrigin || globalOrigin.origin === "null") { - return "no-referrer"; + }, + options + ); + dataPublisher.on( + dataChannelName, + (data) => { + iteratorState.forEach((state, iteratorKey) => { + if (state.__hasPolled) { + const { onData } = state; + iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] }); + onData(data); + } else { + state.publishQueue.push({ + __type: 0, + data + }); } - referrerSource = new URL(globalOrigin); - } else if (webidl.is.URL(request.referrer)) { - referrerSource = request.referrer; + }); + }, + options + ); + return { + async *[Symbol.asyncIterator]() { + if (abortSignal.aborted) { + return; } - let referrerURL = stripURLForReferrer(referrerSource); - const referrerOrigin = stripURLForReferrer(referrerSource, true); - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; + if (firstError !== UNINITIALIZED) { + throw firstError; } - switch (policy) { - case "no-referrer": - return "no-referrer"; - case "origin": - if (referrerOrigin != null) { - return referrerOrigin; - } - return stripURLForReferrer(referrerSource, true); - case "unsafe-url": - return referrerURL; - case "strict-origin": { - const currentURL = requestCurrentURL(request); - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; - } - return referrerOrigin; - } - case "strict-origin-when-cross-origin": { - const currentURL = requestCurrentURL(request); - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL; - } - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; - } - return referrerOrigin; - } - case "same-origin": - if (sameOrigin(request, referrerURL)) { - return referrerURL; + const iteratorKey = /* @__PURE__ */ Symbol(); + iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] }); + try { + while (true) { + const state = iteratorState.get(iteratorKey); + if (!state) { + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING); } - return "no-referrer"; - case "origin-when-cross-origin": - if (sameOrigin(request, referrerURL)) { - return referrerURL; + if (state.__hasPolled) { + throw new SolanaError( + SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE + ); } - return referrerOrigin; - case "no-referrer-when-downgrade": { - const currentURL = requestCurrentURL(request); - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; + const publishQueue = state.publishQueue; + try { + if (publishQueue.length) { + state.publishQueue = []; + for (const item of publishQueue) { + if (item.__type === 0) { + yield item.data; + } else { + throw item.err; + } + } + } else { + yield await new Promise((resolve, reject) => { + iteratorState.set(iteratorKey, { + __hasPolled: true, + onData: resolve, + onError: reject + }); + }); + } + } catch (e22) { + if (e22 === (EXPLICIT_ABORT_TOKEN2 ||= createExplicitAbortToken2())) { + return; + } else { + throw e22; + } } - return referrerURL; } + } finally { + iteratorState.delete(iteratorKey); } } - function stripURLForReferrer(url, originOnly = false) { - assert8(webidl.is.URL(url)); - url = new URL(url); - if (urlIsLocal(url)) { - return "no-referrer"; - } - url.username = ""; - url.password = ""; - url.hash = ""; - if (originOnly === true) { - url.pathname = ""; - url.search = ""; - } - return url; - } - var isPotentialleTrustworthyIPv4 = RegExp.prototype.test.bind(/^127\.(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){2}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$/); - var isPotentiallyTrustworthyIPv6 = RegExp.prototype.test.bind(/^(?:(?:0{1,4}:){7}|(?:0{1,4}:){1,6}:|::)0{0,3}1$/); - function isOriginIPPotentiallyTrustworthy(origin) { - if (origin.includes(":")) { - if (origin[0] === "[" && origin[origin.length - 1] === "]") { - origin = origin.slice(1, -1); + }; +} +function getDataPublisherFromEventEmitter(eventEmitter) { + return { + on(channelName, subscriber, options) { + function innerListener(ev) { + if (ev instanceof CustomEvent) { + const data = ev.detail; + subscriber(data); + } else { + subscriber(); } - return isPotentiallyTrustworthyIPv6(origin); } - return isPotentialleTrustworthyIPv4(origin); + eventEmitter.addEventListener(channelName, innerListener, options); + return () => { + eventEmitter.removeEventListener(channelName, innerListener); + }; } - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") { - return false; - } - origin = new URL(origin); - if (origin.protocol === "https:" || origin.protocol === "wss:") { - return true; - } - if (isOriginIPPotentiallyTrustworthy(origin.hostname)) { - return true; + }; +} +function demultiplexDataPublisher(publisher, sourceChannelName, messageTransformer) { + let innerPublisherState; + const eventTarget = new s(); + const demultiplexedDataPublisher = getDataPublisherFromEventEmitter(eventTarget); + return { + ...demultiplexedDataPublisher, + on(channelName, subscriber, options) { + if (!innerPublisherState) { + const innerPublisherUnsubscribe = publisher.on(sourceChannelName, (sourceMessage) => { + const transformResult = messageTransformer(sourceMessage); + if (!transformResult) { + return; + } + const [destinationChannelName, message] = transformResult; + eventTarget.dispatchEvent( + new CustomEvent(destinationChannelName, { + detail: message + }) + ); + }); + innerPublisherState = { + dispose: innerPublisherUnsubscribe, + numSubscribers: 0 + }; } - if (origin.hostname === "localhost" || origin.hostname === "localhost.") { - return true; + innerPublisherState.numSubscribers++; + const unsubscribe = demultiplexedDataPublisher.on(channelName, subscriber, options); + let isActive = true; + function handleUnsubscribe() { + if (!isActive) { + return; + } + isActive = false; + options?.signal.removeEventListener("abort", handleUnsubscribe); + innerPublisherState.numSubscribers--; + if (innerPublisherState.numSubscribers === 0) { + innerPublisherState.dispose(); + innerPublisherState = void 0; + } + unsubscribe(); } - if (origin.hostname.endsWith(".localhost") || origin.hostname.endsWith(".localhost.")) { - return true; + options?.signal.addEventListener("abort", handleUnsubscribe); + return handleUnsubscribe; + } + }; +} +var e3, s, EXPLICIT_ABORT_TOKEN2, UNINITIALIZED; +var init_index_node30 = __esm({ + "node_modules/@solana/subscribable/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + e3 = class extends globalThis.AbortController { + constructor(...t) { + super(...t), setMaxListeners2(Number.MAX_SAFE_INTEGER, this.signal); } - if (origin.protocol === "file:") { - return true; + }; + s = class extends globalThis.EventTarget { + constructor(...t) { + super(...t), setMaxListeners2(Number.MAX_SAFE_INTEGER, this); } + }; + UNINITIALIZED = /* @__PURE__ */ Symbol(); + } +}); + +// node_modules/@solana/rpc-subscriptions-spec/dist/index.node.mjs +import { setMaxListeners as setMaxListeners3 } from "events"; +function createSubscriptionRpc(rpcConfig) { + return new Proxy(rpcConfig.api, { + defineProperty() { return false; - } - function isURLPotentiallyTrustworthy(url) { - if (!webidl.is.URL(url)) { - return false; - } - if (url.href === "about:blank" || url.href === "about:srcdoc") { - return true; + }, + deleteProperty() { + return false; + }, + get(target, p, receiver) { + if (p === "then") { + return void 0; } - if (url.protocol === "data:") return true; - if (url.protocol === "blob:") return true; - return isOriginPotentiallyTrustworthy(url.origin); + return function(...rawParams) { + const notificationName = p.toString(); + const createRpcSubscriptionPlan = Reflect.get(target, notificationName, receiver); + if (!createRpcSubscriptionPlan) { + throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, { + notificationName + }); + } + const subscriptionPlan = createRpcSubscriptionPlan(...rawParams); + return createPendingRpcSubscription(rpcConfig.transport, subscriptionPlan); + }; } - function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { + }); +} +function createPendingRpcSubscription(transport, subscriptionsPlan) { + return { + async subscribe({ abortSignal }) { + const notificationsDataPublisher = await transport({ + signal: abortSignal, + ...subscriptionsPlan + }); + return createAsyncIterableFromDataPublisher({ + abortSignal, + dataChannelName: "notification", + dataPublisher: notificationsDataPublisher, + errorChannelName: "error" + }); } - function sameOrigin(A, B) { - if (A.origin === B.origin && A.origin === "null") { - return true; - } - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true; + }; +} +function createRpcSubscriptionsApi(config) { + return new Proxy({}, { + defineProperty() { + return false; + }, + deleteProperty() { + return false; + }, + get(...args) { + const [_, p] = args; + const methodName = p.toString(); + return function(...params) { + const rawRequest = { methodName, params }; + const request = config.requestTransformer ? config.requestTransformer(rawRequest) : rawRequest; + return { + execute(planConfig) { + return config.planExecutor({ ...planConfig, request }); + }, + request + }; + }; + } + }); +} +function transformChannelInboundMessages(channel, transform) { + return Object.freeze({ + ...channel, + on(type, subscriber, options) { + if (type !== "message") { + return channel.on( + type, + subscriber, + options + ); } - return false; - } - function isAborted2(fetchParams) { - return fetchParams.controller.state === "aborted"; + return channel.on( + "message", + (message) => subscriber(transform(message)), + options + ); } - function isCancelled(fetchParams) { - return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + }); +} +function transformChannelOutboundMessages(channel, transform) { + return Object.freeze({ + ...channel, + send: (message) => channel.send(transform(message)) + }); +} +function decrementSubscriberCountAndReturnNewCount(channel, subscriptionId) { + return augmentSubscriberCountAndReturnNewCount(-1, channel, subscriptionId); +} +function incrementSubscriberCount(channel, subscriptionId) { + augmentSubscriberCountAndReturnNewCount(1, channel, subscriptionId); +} +function getSubscriberCountBySubscriptionIdForChannel(channel) { + let subscriberCountBySubscriptionId = subscriberCountBySubscriptionIdByChannel.get(channel); + if (!subscriberCountBySubscriptionId) { + subscriberCountBySubscriptionIdByChannel.set(channel, subscriberCountBySubscriptionId = {}); + } + return subscriberCountBySubscriptionId; +} +function augmentSubscriberCountAndReturnNewCount(amount, channel, subscriptionId) { + if (subscriptionId === void 0) { + return; + } + const subscriberCountBySubscriptionId = getSubscriberCountBySubscriptionIdForChannel(channel); + if (!subscriberCountBySubscriptionId[subscriptionId] && amount > 0) { + subscriberCountBySubscriptionId[subscriptionId] = 0; + } + const newCount = amount + subscriberCountBySubscriptionId[subscriptionId]; + if (newCount <= 0) { + delete subscriberCountBySubscriptionId[subscriptionId]; + } else { + subscriberCountBySubscriptionId[subscriptionId] = newCount; + } + return newCount; +} +function getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer(channel, subscribeRequest, responseTransformer) { + let publisherByResponseTransformer = cache.get(channel); + if (!publisherByResponseTransformer) { + cache.set(channel, publisherByResponseTransformer = /* @__PURE__ */ new WeakMap()); + } + const responseTransformerKey = responseTransformer ?? channel; + let publisher = publisherByResponseTransformer.get(responseTransformerKey); + if (!publisher) { + publisherByResponseTransformer.set( + responseTransformerKey, + publisher = demultiplexDataPublisher(channel, "message", (rawMessage) => { + const message = rawMessage; + if (!("method" in message)) { + return; + } + const transformedNotification = responseTransformer ? responseTransformer(message.params.result, subscribeRequest) : message.params.result; + return [`notification:${message.params.subscription}`, transformedNotification]; + }) + ); + } + return publisher; +} +async function executeRpcPubSubSubscriptionPlan({ + channel, + responseTransformer, + signal, + subscribeRequest, + unsubscribeMethodName +}) { + let subscriptionId; + channel.on( + "error", + () => { + subscriptionId = void 0; + subscriberCountBySubscriptionIdByChannel.delete(channel); + }, + { signal } + ); + const abortPromise = new Promise((_, reject) => { + function handleAbort() { + if (decrementSubscriberCountAndReturnNewCount(channel, subscriptionId) === 0) { + const unsubscribePayload = createRpcMessage({ + methodName: unsubscribeMethodName, + params: [subscriptionId] + }); + subscriptionId = void 0; + channel.send(unsubscribePayload).catch(() => { + }); + } + reject(this.reason); } - function normalizeMethod(method) { - return normalizedMethodRecordsBase[method.toLowerCase()] ?? method; + if (signal.aborted) { + handleAbort.call(signal); + } else { + signal.addEventListener("abort", handleAbort); } - var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - function createIterator(name, kInternalIterator, keyIndex = 0, valueIndex = 1) { - class FastIterableIterator { - /** @type {any} */ - #target; - /** @type {'key' | 'value' | 'key+value'} */ - #kind; - /** @type {number} */ - #index; - /** - * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object - * @param {unknown} target - * @param {'key' | 'value' | 'key+value'} kind - */ - constructor(target, kind) { - this.#target = target; - this.#kind = kind; - this.#index = 0; - } - next() { - if (typeof this !== "object" || this === null || !(#target in this)) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ); - } - const index2 = this.#index; - const values = kInternalIterator(this.#target); - const len = values.length; - if (index2 >= len) { - return { - value: void 0, - done: true - }; - } - const { [keyIndex]: key, [valueIndex]: value } = values[index2]; - this.#index = index2 + 1; - let result; - switch (this.#kind) { - case "key": - result = key; - break; - case "value": - result = value; - break; - case "key+value": - result = [key, value]; - break; + }); + const subscribePayload = createRpcMessage(subscribeRequest); + await channel.send(subscribePayload); + const subscriptionIdPromise = new Promise((resolve, reject) => { + const abortController = new e4(); + signal.addEventListener("abort", abortController.abort.bind(abortController)); + const options = { signal: abortController.signal }; + channel.on( + "error", + (err) => { + abortController.abort(); + reject(err); + }, + options + ); + channel.on( + "message", + (message) => { + if (message && typeof message === "object" && "id" in message && message.id === subscribePayload.id) { + abortController.abort(); + if ("error" in message) { + reject(getSolanaErrorFromJsonRpcError(message.error)); + } else { + resolve(message.result); } - return { - value: result, - done: false - }; } + }, + options + ); + }); + subscriptionId = await safeRace([abortPromise, subscriptionIdPromise]); + if (subscriptionId == null) { + throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID); + } + incrementSubscriberCount(channel, subscriptionId); + const notificationPublisher = getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer( + channel, + subscribeRequest, + responseTransformer + ); + const notificationKey = `notification:${subscriptionId}`; + return { + on(type, listener, options) { + switch (type) { + case "notification": + return notificationPublisher.on( + notificationKey, + listener, + options + ); + case "error": + return channel.on( + "error", + listener, + options + ); + default: + throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, { + channelName: type, + supportedChannelNames: ["notification", "error"] + }); } - delete FastIterableIterator.prototype.constructor; - Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); - Object.defineProperties(FastIterableIterator.prototype, { - [Symbol.toStringTag]: { - writable: false, - enumerable: false, - configurable: true, - value: `${name} Iterator` - }, - next: { writable: true, enumerable: true, configurable: true } - }); - return function(target, kind) { - return new FastIterableIterator(target, kind); - }; } - function iteratorMixin(name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { - const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex); - const properties = { - keys: { - writable: true, - enumerable: true, - configurable: true, - value: function keys() { - webidl.brandCheck(this, object); - return makeIterator(this, "key"); - } - }, - values: { - writable: true, - enumerable: true, - configurable: true, - value: function values() { - webidl.brandCheck(this, object); - return makeIterator(this, "value"); - } - }, - entries: { - writable: true, - enumerable: true, - configurable: true, - value: function entries() { - webidl.brandCheck(this, object); - return makeIterator(this, "key+value"); - } - }, - forEach: { - writable: true, - enumerable: true, - configurable: true, - value: function forEach(callbackfn, thisArg = globalThis) { - webidl.brandCheck(this, object); - webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`); - if (typeof callbackfn !== "function") { - throw new TypeError( - `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.` - ); - } - for (const { 0: key, 1: value } of makeIterator(this, "key+value")) { - callbackfn.call(thisArg, value, key, this); - } - } - } - }; - return Object.defineProperties(object.prototype, { - ...properties, - [Symbol.iterator]: { - writable: true, - enumerable: false, - configurable: true, - value: properties.entries.value - } + }; +} +var e4, subscriberCountBySubscriptionIdByChannel, cache; +var init_index_node31 = __esm({ + "node_modules/@solana/rpc-subscriptions-spec/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node30(); + init_index_node17(); + init_index_node22(); + e4 = class extends globalThis.AbortController { + constructor(...t) { + super(...t), setMaxListeners3(Number.MAX_SAFE_INTEGER, this.signal); + } + }; + subscriberCountBySubscriptionIdByChannel = /* @__PURE__ */ new WeakMap(); + cache = /* @__PURE__ */ new WeakMap(); + } +}); + +// node_modules/@solana/rpc-subscriptions-api/dist/index.node.mjs +function createSolanaRpcSubscriptionsApi_INTERNAL(config) { + const requestTransformer = getDefaultRequestTransformerForSolanaRpc(config); + const responseTransformer = getDefaultResponseTransformerForSolanaRpcSubscriptions({ + allowedNumericKeyPaths: getAllowedNumericKeypaths2() + }); + return createRpcSubscriptionsApi({ + planExecutor({ request, ...rest }) { + return executeRpcPubSubSubscriptionPlan({ + ...rest, + responseTransformer, + subscribeRequest: { ...request, methodName: request.methodName.replace(/Notifications$/, "Subscribe") }, + unsubscribeMethodName: request.methodName.replace(/Notifications$/, "Unsubscribe") }); - } - function fullyReadBody(body, processBody, processBodyError) { - const successSteps = processBody; - const errorSteps = processBodyError; - try { - const reader = body.stream.getReader(); - readAllBytes(reader, successSteps, errorSteps); - } catch (e7) { - errorSteps(e7); + }, + requestTransformer + }); +} +function createSolanaRpcSubscriptionsApi(config) { + return createSolanaRpcSubscriptionsApi_INTERNAL(config); +} +function createSolanaRpcSubscriptionsApi_UNSTABLE(config) { + return createSolanaRpcSubscriptionsApi_INTERNAL( + config + ); +} +function getAllowedNumericKeypaths2() { + if (!memoizedKeypaths2) { + memoizedKeypaths2 = { + accountNotifications: jsonParsedAccountsConfigs.map((c2) => ["value", ...c2]), + blockNotifications: [ + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "meta", + "preTokenBalances", + KEYPATH_WILDCARD, + "accountIndex" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "meta", + "preTokenBalances", + KEYPATH_WILDCARD, + "uiTokenAmount", + "decimals" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "meta", + "postTokenBalances", + KEYPATH_WILDCARD, + "accountIndex" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "meta", + "postTokenBalances", + KEYPATH_WILDCARD, + "uiTokenAmount", + "decimals" + ], + ["value", "block", "transactions", KEYPATH_WILDCARD, "meta", "rewards", KEYPATH_WILDCARD, "commission"], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "meta", + "innerInstructions", + KEYPATH_WILDCARD, + "index" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "meta", + "innerInstructions", + KEYPATH_WILDCARD, + "instructions", + KEYPATH_WILDCARD, + "programIdIndex" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "meta", + "innerInstructions", + KEYPATH_WILDCARD, + "instructions", + KEYPATH_WILDCARD, + "accounts", + KEYPATH_WILDCARD + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "transaction", + "message", + "addressTableLookups", + KEYPATH_WILDCARD, + "writableIndexes", + KEYPATH_WILDCARD + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "transaction", + "message", + "addressTableLookups", + KEYPATH_WILDCARD, + "readonlyIndexes", + KEYPATH_WILDCARD + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "transaction", + "message", + "instructions", + KEYPATH_WILDCARD, + "programIdIndex" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "transaction", + "message", + "instructions", + KEYPATH_WILDCARD, + "accounts", + KEYPATH_WILDCARD + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "transaction", + "message", + "header", + "numReadonlySignedAccounts" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "transaction", + "message", + "header", + "numReadonlyUnsignedAccounts" + ], + [ + "value", + "block", + "transactions", + KEYPATH_WILDCARD, + "transaction", + "message", + "header", + "numRequiredSignatures" + ], + ["value", "block", "rewards", KEYPATH_WILDCARD, "commission"] + ], + programNotifications: jsonParsedAccountsConfigs.flatMap((c2) => [ + ["value", KEYPATH_WILDCARD, "account", ...c2], + [KEYPATH_WILDCARD, "account", ...c2] + ]) + }; + } + return memoizedKeypaths2; +} +var memoizedKeypaths2; +var init_index_node32 = __esm({ + "node_modules/@solana/rpc-subscriptions-api/dist/index.node.mjs"() { + "use strict"; + init_index_node31(); + init_index_node24(); + } +}); + +// node_modules/ws/lib/constants.js +var require_constants = __commonJS({ + "node_modules/ws/lib/constants.js"(exports, module) { + "use strict"; + var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"]; + var hasBlob = typeof Blob !== "undefined"; + if (hasBlob) BINARY_TYPES.push("blob"); + module.exports = { + BINARY_TYPES, + CLOSE_TIMEOUT: 3e4, + EMPTY_BUFFER: Buffer.alloc(0), + GUID: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", + hasBlob, + kForOnEventAttribute: /* @__PURE__ */ Symbol("kIsForOnEventAttribute"), + kListener: /* @__PURE__ */ Symbol("kListener"), + kStatusCode: /* @__PURE__ */ Symbol("status-code"), + kWebSocket: /* @__PURE__ */ Symbol("websocket"), + NOOP: () => { } - } - function readableStreamClose(controller) { - try { - controller.close(); - controller.byobRequest?.respond(0); - } catch (err) { - if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) { - throw err; - } + }; + } +}); + +// node_modules/ws/lib/buffer-util.js +var require_buffer_util = __commonJS({ + "node_modules/ws/lib/buffer-util.js"(exports, module) { + "use strict"; + var { EMPTY_BUFFER } = require_constants(); + var FastBuffer = Buffer[Symbol.species]; + function concat3(list, totalLength) { + if (list.length === 0) return EMPTY_BUFFER; + if (list.length === 1) return list[0]; + const target = Buffer.allocUnsafe(totalLength); + let offset = 0; + for (let i = 0; i < list.length; i++) { + const buf = list[i]; + target.set(buf, offset); + offset += buf.length; } - } - async function readAllBytes(reader, successSteps, failureSteps) { - try { - const bytes = []; - let byteLength = 0; - do { - const { done, value: chunk } = await reader.read(); - if (done) { - successSteps(Buffer.concat(bytes, byteLength)); - return; - } - if (!isUint8Array(chunk)) { - failureSteps(new TypeError("Received non-Uint8Array chunk")); - return; - } - bytes.push(chunk); - byteLength += chunk.length; - } while (true); - } catch (e7) { - failureSteps(e7); + if (offset < totalLength) { + return new FastBuffer(target.buffer, target.byteOffset, offset); } + return target; } - function urlIsLocal(url) { - assert8("protocol" in url); - const protocol = url.protocol; - return protocol === "about:" || protocol === "blob:" || protocol === "data:"; - } - function urlHasHttpsScheme(url) { - return typeof url === "string" && url[5] === ":" && url[0] === "h" && url[1] === "t" && url[2] === "t" && url[3] === "p" && url[4] === "s" || url.protocol === "https:"; - } - function urlIsHttpHttpsScheme(url) { - assert8("protocol" in url); - const protocol = url.protocol; - return protocol === "http:" || protocol === "https:"; - } - function simpleRangeHeaderValue(value, allowWhitespace) { - const data = value; - if (!data.startsWith("bytes")) { - return "failure"; - } - const position = { position: 5 }; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - if (data.charCodeAt(position.position) !== 61) { - return "failure"; - } - position.position++; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - const rangeStart = collectASequenceOfCodePoints( - (char) => { - const code = char.charCodeAt(0); - return code >= 48 && code <= 57; - }, - data, - position - ); - const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - if (data.charCodeAt(position.position) !== 45) { - return "failure"; - } - position.position++; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - const rangeEnd = collectASequenceOfCodePoints( - (char) => { - const code = char.charCodeAt(0); - return code >= 48 && code <= 57; - }, - data, - position - ); - const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; - if (position.position < data.length) { - return "failure"; - } - if (rangeEndValue === null && rangeStartValue === null) { - return "failure"; - } - if (rangeStartValue > rangeEndValue) { - return "failure"; + function _mask(source, mask, output, offset, length) { + for (let i = 0; i < length; i++) { + output[offset + i] = source[i] ^ mask[i & 3]; } - return { rangeStartValue, rangeEndValue }; - } - function buildContentRange(rangeStart, rangeEnd, fullLength) { - let contentRange = "bytes "; - contentRange += isomorphicEncode(`${rangeStart}`); - contentRange += "-"; - contentRange += isomorphicEncode(`${rangeEnd}`); - contentRange += "/"; - contentRange += isomorphicEncode(`${fullLength}`); - return contentRange; } - var InflateStream = class extends Transform { - #zlibOptions; - /** @param {zlib.ZlibOptions} [zlibOptions] */ - constructor(zlibOptions) { - super(); - this.#zlibOptions = zlibOptions; - } - _transform(chunk, encoding, callback) { - if (!this._inflateStream) { - if (chunk.length === 0) { - callback(); - return; - } - this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate(this.#zlibOptions) : zlib.createInflateRaw(this.#zlibOptions); - this._inflateStream.on("data", this.push.bind(this)); - this._inflateStream.on("end", () => this.push(null)); - this._inflateStream.on("error", (err) => this.destroy(err)); - } - this._inflateStream.write(chunk, encoding, callback); - } - _final(callback) { - if (this._inflateStream) { - this._inflateStream.end(); - this._inflateStream = null; - } - callback(); + function _unmask(buffer2, mask) { + for (let i = 0; i < buffer2.length; i++) { + buffer2[i] ^= mask[i & 3]; } - }; - function createInflate(zlibOptions) { - return new InflateStream(zlibOptions); } - function extractMimeType(headers) { - let charset = null; - let essence = null; - let mimeType = null; - const values = getDecodeSplit("content-type", headers); - if (values === null) { - return "failure"; - } - for (const value of values) { - const temporaryMimeType = parseMIMEType(value); - if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") { - continue; - } - mimeType = temporaryMimeType; - if (mimeType.essence !== essence) { - charset = null; - if (mimeType.parameters.has("charset")) { - charset = mimeType.parameters.get("charset"); - } - essence = mimeType.essence; - } else if (!mimeType.parameters.has("charset") && charset !== null) { - mimeType.parameters.set("charset", charset); - } - } - if (mimeType == null) { - return "failure"; + function toArrayBuffer2(buf) { + if (buf.length === buf.buffer.byteLength) { + return buf.buffer; } - return mimeType; + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length); } - function gettingDecodingSplitting(value) { - const input = value; - const position = { position: 0 }; - const values = []; - let temporaryValue = ""; - while (position.position < input.length) { - temporaryValue += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== ",", - input, - position - ); - if (position.position < input.length) { - if (input.charCodeAt(position.position) === 34) { - temporaryValue += collectAnHTTPQuotedString( - input, - position - ); - if (position.position < input.length) { - continue; - } - } else { - assert8(input.charCodeAt(position.position) === 44); - position.position++; - } - } - temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32); - values.push(temporaryValue); - temporaryValue = ""; + function toBuffer(data) { + toBuffer.readOnly = true; + if (Buffer.isBuffer(data)) return data; + let buf; + if (data instanceof ArrayBuffer) { + buf = new FastBuffer(data); + } else if (ArrayBuffer.isView(data)) { + buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength); + } else { + buf = Buffer.from(data); + toBuffer.readOnly = false; } - return values; + return buf; } - function getDecodeSplit(name, list) { - const value = list.get(name, true); - if (value === null) { - return null; + module.exports = { + concat: concat3, + mask: _mask, + toArrayBuffer: toArrayBuffer2, + toBuffer, + unmask: _unmask + }; + if (!process.env.WS_NO_BUFFER_UTIL) { + try { + const bufferUtil = __require("bufferutil"); + module.exports.mask = function(source, mask, output, offset, length) { + if (length < 48) _mask(source, mask, output, offset, length); + else bufferUtil.mask(source, mask, output, offset, length); + }; + module.exports.unmask = function(buffer2, mask) { + if (buffer2.length < 32) _unmask(buffer2, mask); + else bufferUtil.unmask(buffer2, mask); + }; + } catch (e7) { } - return gettingDecodingSplitting(value); - } - function hasAuthenticationEntry(request) { - return false; } - function includesCredentials(url) { - return !!(url.username || url.password); - } - function isTraversableNavigable(navigable) { - return navigable != null && navigable !== "client" && navigable !== "no-traversable"; - } - var EnvironmentSettingsObjectBase = class { - get baseUrl() { - return getGlobalOrigin(); + } +}); + +// node_modules/ws/lib/limiter.js +var require_limiter = __commonJS({ + "node_modules/ws/lib/limiter.js"(exports, module) { + "use strict"; + var kDone = /* @__PURE__ */ Symbol("kDone"); + var kRun = /* @__PURE__ */ Symbol("kRun"); + var Limiter = class { + /** + * Creates a new `Limiter`. + * + * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed + * to run concurrently + */ + constructor(concurrency) { + this[kDone] = () => { + this.pending--; + this[kRun](); + }; + this.concurrency = concurrency || Infinity; + this.jobs = []; + this.pending = 0; } - get origin() { - return this.baseUrl?.origin; + /** + * Adds a job to the queue. + * + * @param {Function} job The job to run + * @public + */ + add(job) { + this.jobs.push(job); + this[kRun](); + } + /** + * Removes a job from the queue and runs it if possible. + * + * @private + */ + [kRun]() { + if (this.pending === this.concurrency) return; + if (this.jobs.length) { + const job = this.jobs.shift(); + this.pending++; + job(this[kDone]); + } } - policyContainer = makePolicyContainer(); - }; - var EnvironmentSettingsObject = class { - settingsObject = new EnvironmentSettingsObjectBase(); - }; - var environmentSettingsObject = new EnvironmentSettingsObject(); - module.exports = { - isAborted: isAborted2, - isCancelled, - isValidEncodedURL, - ReadableStreamFrom, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - clampAndCoarsenConnectionTimingInfo, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - iteratorMixin, - createIterator, - isValidHeaderName, - isValidHeaderValue, - isErrorLike, - fullyReadBody, - readableStreamClose, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - simpleRangeHeaderValue, - buildContentRange, - createInflate, - extractMimeType, - getDecodeSplit, - environmentSettingsObject, - isOriginIPPotentiallyTrustworthy, - hasAuthenticationEntry, - includesCredentials, - isTraversableNavigable }; + module.exports = Limiter; } }); -// node_modules/undici/lib/web/fetch/formdata.js -var require_formdata = __commonJS({ - "node_modules/undici/lib/web/fetch/formdata.js"(exports, module) { +// node_modules/ws/lib/permessage-deflate.js +var require_permessage_deflate = __commonJS({ + "node_modules/ws/lib/permessage-deflate.js"(exports, module) { "use strict"; - var { iteratorMixin } = require_util2(); - var { kEnumerableProperty } = require_util(); - var { webidl } = require_webidl(); - var nodeUtil = __require("util"); - var FormData2 = class _FormData { - #state = []; - constructor(form = void 0) { - webidl.util.markAsUncloneable(this); - if (form !== void 0) { - throw webidl.errors.conversionFailed({ - prefix: "FormData constructor", - argument: "Argument 1", - types: ["undefined"] - }); + var zlib = __require("zlib"); + var bufferUtil = require_buffer_util(); + var Limiter = require_limiter(); + var { kStatusCode } = require_constants(); + var FastBuffer = Buffer[Symbol.species]; + var TRAILER = Buffer.from([0, 0, 255, 255]); + var kPerMessageDeflate = /* @__PURE__ */ Symbol("permessage-deflate"); + var kTotalLength = /* @__PURE__ */ Symbol("total-length"); + var kCallback = /* @__PURE__ */ Symbol("callback"); + var kBuffers = /* @__PURE__ */ Symbol("buffers"); + var kError = /* @__PURE__ */ Symbol("error"); + var zlibLimiter; + var PerMessageDeflate2 = class { + /** + * Creates a PerMessageDeflate instance. + * + * @param {Object} [options] Configuration options + * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support + * for, or request, a custom client window size + * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ + * acknowledge disabling of client context takeover + * @param {Number} [options.concurrencyLimit=10] The number of concurrent + * calls to zlib + * @param {Boolean} [options.isServer=false] Create the instance in either + * server or client mode + * @param {Number} [options.maxPayload=0] The maximum allowed message length + * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the + * use of a custom server window size + * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept + * disabling of server context takeover + * @param {Number} [options.threshold=1024] Size (in bytes) below which + * messages should not be compressed if context takeover is disabled + * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on + * deflate + * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on + * inflate + */ + constructor(options) { + this._options = options || {}; + this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024; + this._maxPayload = this._options.maxPayload | 0; + this._isServer = !!this._options.isServer; + this._deflate = null; + this._inflate = null; + this.params = null; + if (!zlibLimiter) { + const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10; + zlibLimiter = new Limiter(concurrency); + } + } + /** + * @type {String} + */ + static get extensionName() { + return "permessage-deflate"; + } + /** + * Create an extension negotiation offer. + * + * @return {Object} Extension parameters + * @public + */ + offer() { + const params = {}; + if (this._options.serverNoContextTakeover) { + params.server_no_context_takeover = true; + } + if (this._options.clientNoContextTakeover) { + params.client_no_context_takeover = true; + } + if (this._options.serverMaxWindowBits) { + params.server_max_window_bits = this._options.serverMaxWindowBits; + } + if (this._options.clientMaxWindowBits) { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } else if (this._options.clientMaxWindowBits == null) { + params.client_max_window_bits = true; } + return params; } - append(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - const prefix = "FormData.append"; - webidl.argumentLengthCheck(arguments, 2, prefix); - name = webidl.converters.USVString(name); - if (arguments.length === 3 || webidl.is.Blob(value)) { - value = webidl.converters.Blob(value, prefix, "value"); - if (filename !== void 0) { - filename = webidl.converters.USVString(filename); + /** + * Accept an extension negotiation offer/response. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Object} Accepted configuration + * @public + */ + accept(configurations) { + configurations = this.normalizeParams(configurations); + this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations); + return this.params; + } + /** + * Releases all resources used by the extension. + * + * @public + */ + cleanup() { + if (this._inflate) { + this._inflate.close(); + this._inflate = null; + } + if (this._deflate) { + const callback = this._deflate[kCallback]; + this._deflate.close(); + this._deflate = null; + if (callback) { + callback( + new Error( + "The deflate stream was closed while data was being processed" + ) + ); } - } else { - value = webidl.converters.USVString(value); } - const entry = makeEntry(name, value, filename); - this.#state.push(entry); - } - delete(name) { - webidl.brandCheck(this, _FormData); - const prefix = "FormData.delete"; - webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); - this.#state = this.#state.filter((entry) => entry.name !== name); } - get(name) { - webidl.brandCheck(this, _FormData); - const prefix = "FormData.get"; - webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); - const idx = this.#state.findIndex((entry) => entry.name === name); - if (idx === -1) { - return null; + /** + * Accept an extension negotiation offer. + * + * @param {Array} offers The extension negotiation offers + * @return {Object} Accepted configuration + * @private + */ + acceptAsServer(offers) { + const opts = this._options; + const accepted = offers.find((params) => { + if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && !params.client_max_window_bits) { + return false; + } + return true; + }); + if (!accepted) { + throw new Error("None of the extension offers can be accepted"); } - return this.#state[idx].value; - } - getAll(name) { - webidl.brandCheck(this, _FormData); - const prefix = "FormData.getAll"; - webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); - return this.#state.filter((entry) => entry.name === name).map((entry) => entry.value); - } - has(name) { - webidl.brandCheck(this, _FormData); - const prefix = "FormData.has"; - webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); - return this.#state.findIndex((entry) => entry.name === name) !== -1; + if (opts.serverNoContextTakeover) { + accepted.server_no_context_takeover = true; + } + if (opts.clientNoContextTakeover) { + accepted.client_no_context_takeover = true; + } + if (typeof opts.serverMaxWindowBits === "number") { + accepted.server_max_window_bits = opts.serverMaxWindowBits; + } + if (typeof opts.clientMaxWindowBits === "number") { + accepted.client_max_window_bits = opts.clientMaxWindowBits; + } else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) { + delete accepted.client_max_window_bits; + } + return accepted; } - set(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - const prefix = "FormData.set"; - webidl.argumentLengthCheck(arguments, 2, prefix); - name = webidl.converters.USVString(name); - if (arguments.length === 3 || webidl.is.Blob(value)) { - value = webidl.converters.Blob(value, prefix, "value"); - if (filename !== void 0) { - filename = webidl.converters.USVString(filename); - } - } else { - value = webidl.converters.USVString(value); + /** + * Accept the extension negotiation response. + * + * @param {Array} response The extension negotiation response + * @return {Object} Accepted configuration + * @private + */ + acceptAsClient(response) { + const params = response[0]; + if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) { + throw new Error('Unexpected parameter "client_no_context_takeover"'); } - const entry = makeEntry(name, value, filename); - const idx = this.#state.findIndex((entry2) => entry2.name === name); - if (idx !== -1) { - this.#state = [ - ...this.#state.slice(0, idx), - entry, - ...this.#state.slice(idx + 1).filter((entry2) => entry2.name !== name) - ]; - } else { - this.#state.push(entry); + if (!params.client_max_window_bits) { + if (typeof this._options.clientMaxWindowBits === "number") { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } + } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === "number" && params.client_max_window_bits > this._options.clientMaxWindowBits) { + throw new Error( + 'Unexpected or invalid parameter "client_max_window_bits"' + ); } + return params; } - [nodeUtil.inspect.custom](depth, options) { - const state = this.#state.reduce((a, b) => { - if (a[b.name]) { - if (Array.isArray(a[b.name])) { - a[b.name].push(b.value); + /** + * Normalize parameters. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Array} The offers/response with normalized parameters + * @private + */ + normalizeParams(configurations) { + configurations.forEach((params) => { + Object.keys(params).forEach((key) => { + let value = params[key]; + if (value.length > 1) { + throw new Error(`Parameter "${key}" must have only a single value`); + } + value = value[0]; + if (key === "client_max_window_bits") { + if (value !== true) { + const num2 = +value; + if (!Number.isInteger(num2) || num2 < 8 || num2 > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num2; + } else if (!this._isServer) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + } else if (key === "server_max_window_bits") { + const num2 = +value; + if (!Number.isInteger(num2) || num2 < 8 || num2 > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num2; + } else if (key === "client_no_context_takeover" || key === "server_no_context_takeover") { + if (value !== true) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } } else { - a[b.name] = [a[b.name], b.value]; + throw new Error(`Unknown parameter "${key}"`); } - } else { - a[b.name] = b.value; - } - return a; - }, { __proto__: null }); - options.depth ??= depth; - options.colors ??= true; - const output = nodeUtil.formatWithOptions(options, state); - return `FormData ${output.slice(output.indexOf("]") + 2)}`; + params[key] = value; + }); + }); + return configurations; } /** - * @param {FormData} formData + * Decompress data. Concurrency limited. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public */ - static getFormDataState(formData) { - return formData.#state; + decompress(data, fin, callback) { + zlibLimiter.add((done) => { + this._decompress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); } /** - * @param {FormData} formData - * @param {any[]} newState + * Compress data. Concurrency limited. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public */ - static setFormDataState(formData, newState) { - formData.#state = newState; - } - }; - var { getFormDataState, setFormDataState } = FormData2; - Reflect.deleteProperty(FormData2, "getFormDataState"); - Reflect.deleteProperty(FormData2, "setFormDataState"); - iteratorMixin("FormData", FormData2, getFormDataState, "name", "value"); - Object.defineProperties(FormData2.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - getAll: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "FormData", - configurable: true + compress(data, fin, callback) { + zlibLimiter.add((done) => { + this._compress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); } - }); - function makeEntry(name, value, filename) { - if (typeof value === "string") { - } else { - if (!webidl.is.File(value)) { - value = new File([value], "blob", { type: value.type }); + /** + * Decompress data. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _decompress(data, fin, callback) { + const endpoint = this._isServer ? "client" : "server"; + if (!this._inflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; + this._inflate = zlib.createInflateRaw({ + ...this._options.zlibInflateOptions, + windowBits + }); + this._inflate[kPerMessageDeflate] = this; + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + this._inflate.on("error", inflateOnError); + this._inflate.on("data", inflateOnData); } - if (filename !== void 0) { - const options = { - type: value.type, - lastModified: value.lastModified - }; - value = new File([value], filename, options); + this._inflate[kCallback] = callback; + this._inflate.write(data); + if (fin) this._inflate.write(TRAILER); + this._inflate.flush(() => { + const err = this._inflate[kError]; + if (err) { + this._inflate.close(); + this._inflate = null; + callback(err); + return; + } + const data2 = bufferUtil.concat( + this._inflate[kBuffers], + this._inflate[kTotalLength] + ); + if (this._inflate._readableState.endEmitted) { + this._inflate.close(); + this._inflate = null; + } else { + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._inflate.reset(); + } + } + callback(null, data2); + }); + } + /** + * Compress data. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _compress(data, fin, callback) { + const endpoint = this._isServer ? "server" : "client"; + if (!this._deflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; + this._deflate = zlib.createDeflateRaw({ + ...this._options.zlibDeflateOptions, + windowBits + }); + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + this._deflate.on("data", deflateOnData); } + this._deflate[kCallback] = callback; + this._deflate.write(data); + this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { + if (!this._deflate) { + return; + } + let data2 = bufferUtil.concat( + this._deflate[kBuffers], + this._deflate[kTotalLength] + ); + if (fin) { + data2 = new FastBuffer(data2.buffer, data2.byteOffset, data2.length - 4); + } + this._deflate[kCallback] = null; + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._deflate.reset(); + } + callback(null, data2); + }); } - return { name, value }; + }; + module.exports = PerMessageDeflate2; + function deflateOnData(chunk) { + this[kBuffers].push(chunk); + this[kTotalLength] += chunk.length; + } + function inflateOnData(chunk) { + this[kTotalLength] += chunk.length; + if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) { + this[kBuffers].push(chunk); + return; + } + this[kError] = new RangeError("Max payload size exceeded"); + this[kError].code = "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"; + this[kError][kStatusCode] = 1009; + this.removeListener("data", inflateOnData); + this.reset(); + } + function inflateOnError(err) { + this[kPerMessageDeflate]._inflate = null; + if (this[kError]) { + this[kCallback](this[kError]); + return; + } + err[kStatusCode] = 1007; + this[kCallback](err); } - webidl.is.FormData = webidl.util.MakeTypeAssertion(FormData2); - module.exports = { FormData: FormData2, makeEntry, setFormDataState }; } }); -// node_modules/undici/lib/web/fetch/formdata-parser.js -var require_formdata_parser = __commonJS({ - "node_modules/undici/lib/web/fetch/formdata-parser.js"(exports, module) { +// node_modules/ws/lib/validation.js +var require_validation = __commonJS({ + "node_modules/ws/lib/validation.js"(exports, module) { "use strict"; - var { bufferToLowerCasedHeaderName } = require_util(); - var { HTTP_TOKEN_CODEPOINTS } = require_data_url(); - var { makeEntry } = require_formdata(); - var { webidl } = require_webidl(); - var assert8 = __require("assert"); - var { isomorphicDecode } = require_infra(); - var dd = Buffer.from("--"); - var decoder2 = new TextDecoder(); - var decoderIgnoreBOM = new TextDecoder("utf-8", { ignoreBOM: true }); - function isAsciiString(chars) { - for (let i = 0; i < chars.length; ++i) { - if ((chars.charCodeAt(i) & ~127) !== 0) { - return false; - } - } - return true; - } - function validateBoundary(boundary) { - const length = boundary.length; - if (length < 27 || length > 70) { - return false; - } - for (let i = 0; i < length; ++i) { - const cp = boundary.charCodeAt(i); - if (!(cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 39 || cp === 45 || cp === 95)) { - return false; - } - } - return true; + var { isUtf8 } = __require("buffer"); + var { hasBlob } = require_constants(); + var tokenChars = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 0 - 15 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 16 - 31 + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + // 32 - 47 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + // 48 - 63 + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 64 - 79 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + // 80 - 95 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 96 - 111 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + // 112 - 127 + ]; + function isValidStatusCode(code) { + return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999; } - function multipartFormDataParser(input, mimeType) { - assert8(mimeType !== "failure" && mimeType.essence === "multipart/form-data"); - const boundaryString = mimeType.parameters.get("boundary"); - if (boundaryString === void 0) { - throw parsingError("missing boundary in content-type header"); - } - const boundary = Buffer.from(`--${boundaryString}`, "utf8"); - const entryList = []; - const position = { position: 0 }; - const firstBoundaryIndex = input.indexOf(boundary); - if (firstBoundaryIndex === -1) { - throw parsingError("no boundary found in multipart body"); - } - position.position = firstBoundaryIndex; - while (true) { - if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { - position.position += boundary.length; - } else { - throw parsingError("expected a value starting with -- and the boundary"); - } - if (bufferStartsWith(input, dd, position)) { - return entryList; - } - if (input[position.position] !== 13 || input[position.position + 1] !== 10) { - throw parsingError("expected CRLF"); - } - position.position += 2; - const result = parseMultipartFormDataHeaders(input, position); - let { name, filename, contentType, encoding } = result; - position.position += 2; - let body; - { - const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); - if (boundaryIndex === -1) { - throw parsingError("expected boundary after body"); + function _isValidUTF8(buf) { + const len = buf.length; + let i = 0; + while (i < len) { + if ((buf[i] & 128) === 0) { + i++; + } else if ((buf[i] & 224) === 192) { + if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) { + return false; } - body = input.subarray(position.position, boundaryIndex - 4); - position.position += body.length; - if (encoding === "base64") { - body = Buffer.from(body.toString(), "base64"); + i += 2; + } else if ((buf[i] & 240) === 224) { + if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || // Overlong + buf[i] === 237 && (buf[i + 1] & 224) === 160) { + return false; } - } - if (input[position.position] !== 13 || input[position.position + 1] !== 10) { - throw parsingError("expected CRLF"); - } else { - position.position += 2; - } - let value; - if (filename !== null) { - contentType ??= "text/plain"; - if (!isAsciiString(contentType)) { - contentType = ""; + i += 3; + } else if ((buf[i] & 248) === 240) { + if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || // Overlong + buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) { + return false; } - value = new File([body], filename, { type: contentType }); + i += 4; } else { - value = decoderIgnoreBOM.decode(Buffer.from(body)); + return false; } - assert8(webidl.is.USVString(name)); - assert8(typeof value === "string" && webidl.is.USVString(value) || webidl.is.File(value)); - entryList.push(makeEntry(name, value, filename)); } + return true; } - function parseContentDispositionAttribute(input, position) { - if (input[position.position] === 59) { - position.position++; - } - collectASequenceOfBytes( - (char) => char === 32 || char === 9, - input, - position - ); - const attributeName = collectASequenceOfBytes( - (char) => isToken(char) && char !== 61 && char !== 42, - // not = or * - input, - position - ); - if (attributeName.length === 0) { - return null; + function isBlob(value) { + return hasBlob && typeof value === "object" && typeof value.arrayBuffer === "function" && typeof value.type === "string" && typeof value.stream === "function" && (value[Symbol.toStringTag] === "Blob" || value[Symbol.toStringTag] === "File"); + } + module.exports = { + isBlob, + isValidStatusCode, + isValidUTF8: _isValidUTF8, + tokenChars + }; + if (isUtf8) { + module.exports.isValidUTF8 = function(buf) { + return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf); + }; + } else if (!process.env.WS_NO_UTF_8_VALIDATE) { + try { + const isValidUTF8 = __require("utf-8-validate"); + module.exports.isValidUTF8 = function(buf) { + return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf); + }; + } catch (e7) { } - const attrNameStr = attributeName.toString("ascii").toLowerCase(); - const isExtended = input[position.position] === 42; - if (isExtended) { - position.position++; + } + } +}); + +// node_modules/ws/lib/receiver.js +var require_receiver = __commonJS({ + "node_modules/ws/lib/receiver.js"(exports, module) { + "use strict"; + var { Writable } = __require("stream"); + var PerMessageDeflate2 = require_permessage_deflate(); + var { + BINARY_TYPES, + EMPTY_BUFFER, + kStatusCode, + kWebSocket + } = require_constants(); + var { concat: concat3, toArrayBuffer: toArrayBuffer2, unmask } = require_buffer_util(); + var { isValidStatusCode, isValidUTF8 } = require_validation(); + var FastBuffer = Buffer[Symbol.species]; + var GET_INFO = 0; + var GET_PAYLOAD_LENGTH_16 = 1; + var GET_PAYLOAD_LENGTH_64 = 2; + var GET_MASK = 3; + var GET_DATA = 4; + var INFLATING = 5; + var DEFER_EVENT = 6; + var Receiver2 = class extends Writable { + /** + * Creates a Receiver instance. + * + * @param {Object} [options] Options object + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {String} [options.binaryType=nodebuffer] The type for binary data + * @param {Object} [options.extensions] An object containing the negotiated + * extensions + * @param {Boolean} [options.isServer=false] Specifies whether to operate in + * client or server mode + * @param {Number} [options.maxPayload=0] The maximum allowed message length + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + */ + constructor(options = {}) { + super(); + this._allowSynchronousEvents = options.allowSynchronousEvents !== void 0 ? options.allowSynchronousEvents : true; + this._binaryType = options.binaryType || BINARY_TYPES[0]; + this._extensions = options.extensions || {}; + this._isServer = !!options.isServer; + this._maxPayload = options.maxPayload | 0; + this._skipUTF8Validation = !!options.skipUTF8Validation; + this[kWebSocket] = void 0; + this._bufferedBytes = 0; + this._buffers = []; + this._compressed = false; + this._payloadLength = 0; + this._mask = void 0; + this._fragmented = 0; + this._masked = false; + this._fin = false; + this._opcode = 0; + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragments = []; + this._errored = false; + this._loop = false; + this._state = GET_INFO; } - if (input[position.position] !== 61) { - return null; + /** + * Implements `Writable.prototype._write()`. + * + * @param {Buffer} chunk The chunk of data to write + * @param {String} encoding The character encoding of `chunk` + * @param {Function} cb Callback + * @private + */ + _write(chunk, encoding, cb) { + if (this._opcode === 8 && this._state == GET_INFO) return cb(); + this._bufferedBytes += chunk.length; + this._buffers.push(chunk); + this.startLoop(cb); } - position.position++; - collectASequenceOfBytes( - (char) => char === 32 || char === 9, - input, - position - ); - let value; - if (isExtended) { - const headerValue = collectASequenceOfBytes( - (char) => char !== 32 && char !== 13 && char !== 10 && char !== 59, - // not space, CRLF, or ; - input, - position - ); - if (headerValue[0] !== 117 && headerValue[0] !== 85 || // u or U - headerValue[1] !== 116 && headerValue[1] !== 84 || // t or T - headerValue[2] !== 102 && headerValue[2] !== 70 || // f or F - headerValue[3] !== 45 || // - - headerValue[4] !== 56) { - throw parsingError("unknown encoding, expected utf-8''"); - } - value = decodeURIComponent(decoder2.decode(headerValue.subarray(7))); - } else if (input[position.position] === 34) { - position.position++; - const quotedValue = collectASequenceOfBytes( - (char) => char !== 10 && char !== 13 && char !== 34, - // not LF, CR, or " - input, - position - ); - if (input[position.position] !== 34) { - throw parsingError("Closing quote not found"); + /** + * Consumes `n` bytes from the buffered data. + * + * @param {Number} n The number of bytes to consume + * @return {Buffer} The consumed bytes + * @private + */ + consume(n) { + this._bufferedBytes -= n; + if (n === this._buffers[0].length) return this._buffers.shift(); + if (n < this._buffers[0].length) { + const buf = this._buffers[0]; + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + return new FastBuffer(buf.buffer, buf.byteOffset, n); } - position.position++; - value = decoder2.decode(quotedValue).replace(/%0A/ig, "\n").replace(/%0D/ig, "\r").replace(/%22/g, '"'); - } else { - const tokenValue = collectASequenceOfBytes( - (char) => isToken(char) && char !== 59, - // not ; - input, - position - ); - value = decoder2.decode(tokenValue); + const dst = Buffer.allocUnsafe(n); + do { + const buf = this._buffers[0]; + const offset = dst.length - n; + if (n >= buf.length) { + dst.set(this._buffers.shift(), offset); + } else { + dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + } + n -= buf.length; + } while (n > 0); + return dst; } - return { name: attrNameStr, value }; - } - function parseMultipartFormDataHeaders(input, position) { - let name = null; - let filename = null; - let contentType = null; - let encoding = null; - while (true) { - if (input[position.position] === 13 && input[position.position + 1] === 10) { - if (name === null) { - throw parsingError("header name is null"); + /** + * Starts the parsing loop. + * + * @param {Function} cb Callback + * @private + */ + startLoop(cb) { + this._loop = true; + do { + switch (this._state) { + case GET_INFO: + this.getInfo(cb); + break; + case GET_PAYLOAD_LENGTH_16: + this.getPayloadLength16(cb); + break; + case GET_PAYLOAD_LENGTH_64: + this.getPayloadLength64(cb); + break; + case GET_MASK: + this.getMask(); + break; + case GET_DATA: + this.getData(cb); + break; + case INFLATING: + case DEFER_EVENT: + this._loop = false; + return; } - return { name, filename, contentType, encoding }; + } while (this._loop); + if (!this._errored) cb(); + } + /** + * Reads the first two bytes of a frame. + * + * @param {Function} cb Callback + * @private + */ + getInfo(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; } - let headerName = collectASequenceOfBytes( - (char) => char !== 10 && char !== 13 && char !== 58, - input, - position - ); - headerName = removeChars(headerName, true, true, (char) => char === 9 || char === 32); - if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { - throw parsingError("header name does not match the field-name token production"); + const buf = this.consume(2); + if ((buf[0] & 48) !== 0) { + const error = this.createError( + RangeError, + "RSV2 and RSV3 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_2_3" + ); + cb(error); + return; } - if (input[position.position] !== 58) { - throw parsingError("expected :"); + const compressed = (buf[0] & 64) === 64; + if (compressed && !this._extensions[PerMessageDeflate2.extensionName]) { + const error = this.createError( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" + ); + cb(error); + return; } - position.position++; - collectASequenceOfBytes( - (char) => char === 32 || char === 9, - input, - position - ); - switch (bufferToLowerCasedHeaderName(headerName)) { - case "content-disposition": { - name = filename = null; - const dispositionType = collectASequenceOfBytes( - (char) => isToken(char), - input, - position + this._fin = (buf[0] & 128) === 128; + this._opcode = buf[0] & 15; + this._payloadLength = buf[1] & 127; + if (this._opcode === 0) { + if (compressed) { + const error = this.createError( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" ); - if (dispositionType.toString("ascii").toLowerCase() !== "form-data") { - throw parsingError("expected form-data for content-disposition header"); - } - while (position.position < input.length && input[position.position] !== 13 && input[position.position + 1] !== 10) { - const attribute = parseContentDispositionAttribute(input, position); - if (!attribute) { - break; - } - if (attribute.name === "name") { - name = attribute.value; - } else if (attribute.name === "filename") { - filename = attribute.value; - } - } - if (name === null) { - throw parsingError("name attribute is required in content-disposition header"); - } - break; + cb(error); + return; } - case "content-type": { - let headerValue = collectASequenceOfBytes( - (char) => char !== 10 && char !== 13, - input, - position + if (!this._fragmented) { + const error = this.createError( + RangeError, + "invalid opcode 0", + true, + 1002, + "WS_ERR_INVALID_OPCODE" ); - headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); - contentType = isomorphicDecode(headerValue); - break; + cb(error); + return; } - case "content-transfer-encoding": { - let headerValue = collectASequenceOfBytes( - (char) => char !== 10 && char !== 13, - input, - position + this._opcode = this._fragmented; + } else if (this._opcode === 1 || this._opcode === 2) { + if (this._fragmented) { + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + cb(error); + return; + } + this._compressed = compressed; + } else if (this._opcode > 7 && this._opcode < 11) { + if (!this._fin) { + const error = this.createError( + RangeError, + "FIN must be set", + true, + 1002, + "WS_ERR_EXPECTED_FIN" + ); + cb(error); + return; + } + if (compressed) { + const error = this.createError( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" ); - headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); - encoding = isomorphicDecode(headerValue); - break; + cb(error); + return; } - default: { - collectASequenceOfBytes( - (char) => char !== 10 && char !== 13, - input, - position + if (this._payloadLength > 125 || this._opcode === 8 && this._payloadLength === 1) { + const error = this.createError( + RangeError, + `invalid payload length ${this._payloadLength}`, + true, + 1002, + "WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH" ); + cb(error); + return; } - } - if (input[position.position] !== 13 && input[position.position + 1] !== 10) { - throw parsingError("expected CRLF"); } else { - position.position += 2; + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + cb(error); + return; } - } - } - function collectASequenceOfBytes(condition, input, position) { - let start = position.position; - while (start < input.length && condition(input[start])) { - ++start; - } - return input.subarray(position.position, position.position = start); - } - function removeChars(buf, leading, trailing, predicate) { - let lead = 0; - let trail = buf.length - 1; - if (leading) { - while (lead < buf.length && predicate(buf[lead])) lead++; - } - if (trailing) { - while (trail > 0 && predicate(buf[trail])) trail--; - } - return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1); - } - function bufferStartsWith(buffer2, start, position) { - if (buffer2.length < start.length) { - return false; - } - for (let i = 0; i < start.length; i++) { - if (start[i] !== buffer2[position.position + i]) { - return false; + if (!this._fin && !this._fragmented) this._fragmented = this._opcode; + this._masked = (buf[1] & 128) === 128; + if (this._isServer) { + if (!this._masked) { + const error = this.createError( + RangeError, + "MASK must be set", + true, + 1002, + "WS_ERR_EXPECTED_MASK" + ); + cb(error); + return; + } + } else if (this._masked) { + const error = this.createError( + RangeError, + "MASK must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_MASK" + ); + cb(error); + return; } + if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; + else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; + else this.haveLength(cb); } - return true; - } - function parsingError(cause) { - return new TypeError("Failed to parse body as FormData.", { cause: new TypeError(cause) }); - } - function isCTL(char) { - return char <= 31 || char === 127; - } - function isTSpecial(char) { - return char === 40 || // ( - char === 41 || // ) - char === 60 || // < - char === 62 || // > - char === 64 || // @ - char === 44 || // , - char === 59 || // ; - char === 58 || // : - char === 92 || // \ - char === 34 || // " - char === 47 || // / - char === 91 || // [ - char === 93 || // ] - char === 63 || // ? - char === 61; - } - function isToken(char) { - return char <= 127 && // ascii - char !== 32 && // space - char !== 9 && !isCTL(char) && !isTSpecial(char); - } - module.exports = { - multipartFormDataParser, - validateBoundary - }; - } -}); - -// node_modules/undici/lib/util/runtime-features.js -var require_runtime_features = __commonJS({ - "node_modules/undici/lib/util/runtime-features.js"(exports, module) { - "use strict"; - var lazyLoaders = { - __proto__: null, - "node:crypto": () => __require("crypto"), - "node:sqlite": () => __require("sqlite") - }; - function detectRuntimeFeatureByNodeModule(moduleName) { - try { - lazyLoaders[moduleName](); - return true; - } catch (err) { - if (err.code !== "ERR_UNKNOWN_BUILTIN_MODULE" && err.code !== "ERR_NO_CRYPTO") { - throw err; + /** + * Gets extended payload length (7+16). + * + * @param {Function} cb Callback + * @private + */ + getPayloadLength16(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; } - return false; - } - } - var runtimeFeaturesAsNodeModule = ( - /** @type {const} */ - ["crypto", "sqlite"] - ); - function detectRuntimeFeature(feature) { - if (runtimeFeaturesAsNodeModule.includes( - /** @type {RuntimeFeatureByNodeModule} */ - feature - )) { - return detectRuntimeFeatureByNodeModule(`node:${feature}`); + this._payloadLength = this.consume(2).readUInt16BE(0); + this.haveLength(cb); } - throw new TypeError(`unknown feature: ${feature}`); - } - var RuntimeFeatures = class { - /** @type {Map} */ - #map = /* @__PURE__ */ new Map(); /** - * Clears all cached feature detections. + * Gets extended payload length (7+64). + * + * @param {Function} cb Callback + * @private */ - clear() { - this.#map.clear(); + getPayloadLength64(cb) { + if (this._bufferedBytes < 8) { + this._loop = false; + return; + } + const buf = this.consume(8); + const num2 = buf.readUInt32BE(0); + if (num2 > Math.pow(2, 53 - 32) - 1) { + const error = this.createError( + RangeError, + "Unsupported WebSocket frame: payload length > 2^53 - 1", + false, + 1009, + "WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH" + ); + cb(error); + return; + } + this._payloadLength = num2 * Math.pow(2, 32) + buf.readUInt32BE(4); + this.haveLength(cb); } /** - * @param {Feature} feature - * @returns {boolean} + * Payload length has been read. + * + * @param {Function} cb Callback + * @private */ - has(feature) { - return this.#map.get(feature) ?? this.#detectRuntimeFeature(feature); + haveLength(cb) { + if (this._payloadLength && this._opcode < 8) { + this._totalPayloadLength += this._payloadLength; + if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + "Max payload size exceeded", + false, + 1009, + "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" + ); + cb(error); + return; + } + } + if (this._masked) this._state = GET_MASK; + else this._state = GET_DATA; } /** - * @param {Feature} feature - * @param {boolean} value + * Reads mask bytes. + * + * @private */ - set(feature, value) { - if (runtimeFeaturesAsNodeModule.includes(feature) === false) { - throw new TypeError(`unknown feature: ${feature}`); + getMask() { + if (this._bufferedBytes < 4) { + this._loop = false; + return; } - this.#map.set(feature, value); + this._mask = this.consume(4); + this._state = GET_DATA; } /** - * @param {Feature} feature - * @returns {boolean} + * Reads data bytes. + * + * @param {Function} cb Callback + * @private */ - #detectRuntimeFeature(feature) { - const result = detectRuntimeFeature(feature); - this.#map.set(feature, result); - return result; - } - }; - var instance = new RuntimeFeatures(); - module.exports.runtimeFeatures = instance; - module.exports.default = instance; - } -}); - -// node_modules/undici/lib/web/fetch/body.js -var require_body = __commonJS({ - "node_modules/undici/lib/web/fetch/body.js"(exports, module) { - "use strict"; - var util2 = require_util(); - var { - ReadableStreamFrom, - readableStreamClose, - fullyReadBody, - extractMimeType - } = require_util2(); - var { FormData: FormData2, setFormDataState } = require_formdata(); - var { webidl } = require_webidl(); - var assert8 = __require("assert"); - var { isErrored, isDisturbed } = __require("stream"); - var { isUint8Array } = __require("util/types"); - var { serializeAMimeType } = require_data_url(); - var { multipartFormDataParser } = require_formdata_parser(); - var { parseJSONFromBytes } = require_infra(); - var { utf8DecodeBytes } = require_encoding(); - var { runtimeFeatures } = require_runtime_features(); - var random = runtimeFeatures.has("crypto") ? __require("crypto").randomInt : (max) => Math.floor(Math.random() * max); - var textEncoder = new TextEncoder(); - function noop() { - } - var streamRegistry = new FinalizationRegistry((weakRef) => { - const stream = weakRef.deref(); - if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { - stream.cancel("Response object has been garbage collected").catch(noop); - } - }); - function extractBody(object, keepalive = false) { - let stream = null; - let controller = null; - if (webidl.is.ReadableStream(object)) { - stream = object; - } else if (webidl.is.Blob(object)) { - stream = object.stream(); - } else { - stream = new ReadableStream({ - pull() { - }, - start(c2) { - controller = c2; - }, - cancel() { - }, - type: "bytes" - }); - } - assert8(webidl.is.ReadableStream(stream)); - let action = null; - let source = null; - let length = null; - let type = null; - if (typeof object === "string") { - source = object; - type = "text/plain;charset=UTF-8"; - } else if (webidl.is.URLSearchParams(object)) { - source = object.toString(); - type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (webidl.is.BufferSource(object)) { - source = webidl.util.getCopyOfBytesHeldByBufferSource(object); - } else if (webidl.is.FormData(object)) { - const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, "0")}`; - const prefix = `--${boundary}\r -Content-Disposition: form-data`; - const formdataEscape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); - const blobParts = []; - const rn = new Uint8Array([13, 10]); - length = 0; - let hasUnknownSizeValue = false; - for (const [name, value] of object) { - if (typeof value === "string") { - const chunk2 = textEncoder.encode(prefix + `; name="${formdataEscape(normalizeLinefeeds(name))}"\r -\r -${normalizeLinefeeds(value)}\r -`); - blobParts.push(chunk2); - length += chunk2.byteLength; - } else { - const chunk2 = textEncoder.encode(`${prefix}; name="${formdataEscape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${formdataEscape(value.name)}"` : "") + `\r -Content-Type: ${value.type || "application/octet-stream"}\r -\r -`); - blobParts.push(chunk2, value, rn); - if (typeof value.size === "number") { - length += chunk2.byteLength + value.size + rn.byteLength; - } else { - hasUnknownSizeValue = true; - } + getData(cb) { + let data = EMPTY_BUFFER; + if (this._payloadLength) { + if (this._bufferedBytes < this._payloadLength) { + this._loop = false; + return; } - } - const chunk = textEncoder.encode(`--${boundary}--\r -`); - blobParts.push(chunk); - length += chunk.byteLength; - if (hasUnknownSizeValue) { - length = null; - } - source = object; - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream(); - } else { - yield part; - } + data = this.consume(this._payloadLength); + if (this._masked && (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0) { + unmask(data, this._mask); } - }; - type = `multipart/form-data; boundary=${boundary}`; - } else if (webidl.is.Blob(object)) { - source = object; - length = object.size; - if (object.type) { - type = object.type; } - } else if (typeof object[Symbol.asyncIterator] === "function") { - if (keepalive) { - throw new TypeError("keepalive"); + if (this._opcode > 7) { + this.controlMessage(data, cb); + return; } - if (util2.isDisturbed(object) || object.locked) { - throw new TypeError( - "Response body object should not be disturbed or locked" - ); + if (this._compressed) { + this._state = INFLATING; + this.decompress(data, cb); + return; } - stream = webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object); - } - if (typeof source === "string" || isUint8Array(source)) { - action = () => { - length = typeof source === "string" ? Buffer.byteLength(source) : source.length; - return source; - }; + if (data.length) { + this._messageLength = this._totalPayloadLength; + this._fragments.push(data); + } + this.dataMessage(cb); } - if (action != null) { - ; - (async () => { - const result = action(); - const iterator = result?.[Symbol.asyncIterator]?.(); - if (iterator) { - for await (const bytes of iterator) { - if (isErrored(stream)) break; - if (bytes.length) { - controller.enqueue(new Uint8Array(bytes)); - } + /** + * Decompresses data. + * + * @param {Buffer} data Compressed data + * @param {Function} cb Callback + * @private + */ + decompress(data, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName]; + perMessageDeflate.decompress(data, this._fin, (err, buf) => { + if (err) return cb(err); + if (buf.length) { + this._messageLength += buf.length; + if (this._messageLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + "Max payload size exceeded", + false, + 1009, + "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" + ); + cb(error); + return; } - } else if (result?.length && !isErrored(stream)) { - controller.enqueue(typeof result === "string" ? textEncoder.encode(result) : new Uint8Array(result)); + this._fragments.push(buf); + } + this.dataMessage(cb); + if (this._state === GET_INFO) this.startLoop(cb); + }); + } + /** + * Handles a data message. + * + * @param {Function} cb Callback + * @private + */ + dataMessage(cb) { + if (!this._fin) { + this._state = GET_INFO; + return; + } + const messageLength = this._messageLength; + const fragments = this._fragments; + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragmented = 0; + this._fragments = []; + if (this._opcode === 2) { + let data; + if (this._binaryType === "nodebuffer") { + data = concat3(fragments, messageLength); + } else if (this._binaryType === "arraybuffer") { + data = toArrayBuffer2(concat3(fragments, messageLength)); + } else if (this._binaryType === "blob") { + data = new Blob(fragments); + } else { + data = fragments; + } + if (this._allowSynchronousEvents) { + this.emit("message", data, true); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit("message", data, true); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } else { + const buf = concat3(fragments, messageLength); + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + "invalid UTF-8 sequence", + true, + 1007, + "WS_ERR_INVALID_UTF8" + ); + cb(error); + return; + } + if (this._state === INFLATING || this._allowSynchronousEvents) { + this.emit("message", buf, false); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit("message", buf, false); + this._state = GET_INFO; + this.startLoop(cb); + }); } - queueMicrotask(() => readableStreamClose(controller)); - })(); - } - const body = { stream, source, length }; - return [body, type]; - } - function safelyExtractBody(object, keepalive = false) { - if (webidl.is.ReadableStream(object)) { - assert8(!util2.isDisturbed(object), "The body has already been consumed."); - assert8(!object.locked, "The stream is locked."); + } } - return extractBody(object, keepalive); - } - function cloneBody(body) { - const { 0: out1, 1: out2 } = body.stream.tee(); - body.stream = out1; - return { - stream: out2, - length: body.length, - source: body.source - }; - } - function bodyMixinMethods(instance, getInternalState) { - const methods = { - blob() { - return consumeBody(this, (bytes) => { - let mimeType = bodyMimeType(getInternalState(this)); - if (mimeType === null) { - mimeType = ""; - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType); - } - return new Blob([bytes], { type: mimeType }); - }, instance, getInternalState); - }, - arrayBuffer() { - return consumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer; - }, instance, getInternalState); - }, - text() { - return consumeBody(this, utf8DecodeBytes, instance, getInternalState); - }, - json() { - return consumeBody(this, parseJSONFromBytes, instance, getInternalState); - }, - formData() { - return consumeBody(this, (value) => { - const mimeType = bodyMimeType(getInternalState(this)); - if (mimeType !== null) { - switch (mimeType.essence) { - case "multipart/form-data": { - const parsed = multipartFormDataParser(value, mimeType); - const fd = new FormData2(); - setFormDataState(fd, parsed); - return fd; - } - case "application/x-www-form-urlencoded": { - const entries = new URLSearchParams(value.toString()); - const fd = new FormData2(); - for (const [name, value2] of entries) { - fd.append(name, value2); - } - return fd; - } - } + /** + * Handles a control message. + * + * @param {Buffer} data Data to handle + * @return {(Error|RangeError|undefined)} A possible error + * @private + */ + controlMessage(data, cb) { + if (this._opcode === 8) { + if (data.length === 0) { + this._loop = false; + this.emit("conclude", 1005, EMPTY_BUFFER); + this.end(); + } else { + const code = data.readUInt16BE(0); + if (!isValidStatusCode(code)) { + const error = this.createError( + RangeError, + `invalid status code ${code}`, + true, + 1002, + "WS_ERR_INVALID_CLOSE_CODE" + ); + cb(error); + return; } - throw new TypeError( - 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' + const buf = new FastBuffer( + data.buffer, + data.byteOffset + 2, + data.length - 2 ); - }, instance, getInternalState); - }, - bytes() { - return consumeBody(this, (bytes) => { - return new Uint8Array(bytes); - }, instance, getInternalState); + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + "invalid UTF-8 sequence", + true, + 1007, + "WS_ERR_INVALID_UTF8" + ); + cb(error); + return; + } + this._loop = false; + this.emit("conclude", code, buf); + this.end(); + } + this._state = GET_INFO; + return; } - }; - return methods; - } - function mixinBody(prototype, getInternalState) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype, getInternalState)); - } - function consumeBody(object, convertBytesToJSValue, instance, getInternalState) { - try { - webidl.brandCheck(object, instance); - } catch (e7) { - return Promise.reject(e7); - } - object = getInternalState(object); - if (bodyUnusable(object)) { - return Promise.reject(new TypeError("Body is unusable: Body has already been read")); - } - const promise = Promise.withResolvers(); - const errorSteps = promise.reject; - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)); - } catch (e7) { - errorSteps(e7); + if (this._allowSynchronousEvents) { + this.emit(this._opcode === 9 ? "ping" : "pong", data); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit(this._opcode === 9 ? "ping" : "pong", data); + this._state = GET_INFO; + this.startLoop(cb); + }); } - }; - if (object.body == null) { - successSteps(Buffer.allocUnsafe(0)); - return promise.promise; } - fullyReadBody(object.body, successSteps, errorSteps); - return promise.promise; - } - function bodyUnusable(object) { - const body = object.body; - return body != null && (body.stream.locked || util2.isDisturbed(body.stream)); - } - function bodyMimeType(requestOrResponse) { - const headers = requestOrResponse.headersList; - const mimeType = extractMimeType(headers); - if (mimeType === "failure") { - return null; + /** + * Builds an error object. + * + * @param {function(new:Error|RangeError)} ErrorCtor The error constructor + * @param {String} message The error message + * @param {Boolean} prefix Specifies whether or not to add a default prefix to + * `message` + * @param {Number} statusCode The status code + * @param {String} errorCode The exposed error code + * @return {(Error|RangeError)} The error + * @private + */ + createError(ErrorCtor, message, prefix, statusCode, errorCode) { + this._loop = false; + this._errored = true; + const err = new ErrorCtor( + prefix ? `Invalid WebSocket frame: ${message}` : message + ); + Error.captureStackTrace(err, this.createError); + err.code = errorCode; + err[kStatusCode] = statusCode; + return err; } - return mimeType; - } - module.exports = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody, - streamRegistry, - bodyUnusable }; + module.exports = Receiver2; } }); -// node_modules/undici/lib/dispatcher/client-h1.js -var require_client_h1 = __commonJS({ - "node_modules/undici/lib/dispatcher/client-h1.js"(exports, module) { +// node_modules/ws/lib/sender.js +var require_sender = __commonJS({ + "node_modules/ws/lib/sender.js"(exports, module) { "use strict"; - var assert8 = __require("assert"); - var util2 = require_util(); - var { channels } = require_diagnostics(); - var timers = require_timers(); - var { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError - } = require_errors(); - var { - kUrl, - kReset, - kClient, - kParser, - kBlocking, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kMaxRequests, - kCounter, - kMaxResponseSize, - kOnError, - kResume, - kHTTPContext, - kClosed - } = require_symbols(); - var constants = require_constants3(); - var EMPTY_BUF = Buffer.alloc(0); - var FastBuffer = Buffer[Symbol.species]; - var removeAllListeners = util2.removeAllListeners; - var extractBody; - function lazyllhttp() { - const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0; - let mod5; - let useWasmSIMD = process.arch !== "ppc64"; - if (process.env.UNDICI_NO_WASM_SIMD === "1") { - useWasmSIMD = true; - } else if (process.env.UNDICI_NO_WASM_SIMD === "0") { - useWasmSIMD = false; - } - if (useWasmSIMD) { - try { - mod5 = new WebAssembly.Module(require_llhttp_simd_wasm()); - } catch { + var { Duplex } = __require("stream"); + var { randomFillSync } = __require("crypto"); + var PerMessageDeflate2 = require_permessage_deflate(); + var { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants(); + var { isBlob, isValidStatusCode } = require_validation(); + var { mask: applyMask, toBuffer } = require_buffer_util(); + var kByteLength = /* @__PURE__ */ Symbol("kByteLength"); + var maskBuffer = Buffer.alloc(4); + var RANDOM_POOL_SIZE = 8 * 1024; + var randomPool; + var randomPoolPointer = RANDOM_POOL_SIZE; + var DEFAULT = 0; + var DEFLATING = 1; + var GET_BLOB_DATA = 2; + var Sender2 = class _Sender { + /** + * Creates a Sender instance. + * + * @param {Duplex} socket The connection socket + * @param {Object} [extensions] An object containing the negotiated extensions + * @param {Function} [generateMask] The function used to generate the masking + * key + */ + constructor(socket, extensions, generateMask) { + this._extensions = extensions || {}; + if (generateMask) { + this._generateMask = generateMask; + this._maskBuffer = Buffer.alloc(4); } + this._socket = socket; + this._firstFragment = true; + this._compress = false; + this._bufferedBytes = 0; + this._queue = []; + this._state = DEFAULT; + this.onerror = NOOP; + this[kWebSocket] = void 0; } - if (!mod5) { - mod5 = new WebAssembly.Module(llhttpWasmData || require_llhttp_wasm()); - } - return new WebAssembly.Instance(mod5, { - env: { - /** - * @param {number} p - * @param {number} at - * @param {number} len - * @returns {number} - */ - wasm_on_url: (p, at, len) => { - return 0; - }, - /** - * @param {number} p - * @param {number} at - * @param {number} len - * @returns {number} - */ - wasm_on_status: (p, at, len) => { - assert8(currentParser.ptr === p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)); - }, - /** - * @param {number} p - * @returns {number} - */ - wasm_on_message_begin: (p) => { - assert8(currentParser.ptr === p); - return currentParser.onMessageBegin(); - }, - /** - * @param {number} p - * @param {number} at - * @param {number} len - * @returns {number} - */ - wasm_on_header_field: (p, at, len) => { - assert8(currentParser.ptr === p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)); - }, - /** - * @param {number} p - * @param {number} at - * @param {number} len - * @returns {number} - */ - wasm_on_header_value: (p, at, len) => { - assert8(currentParser.ptr === p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)); - }, - /** - * @param {number} p - * @param {number} statusCode - * @param {0|1} upgrade - * @param {0|1} shouldKeepAlive - * @returns {number} - */ - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert8(currentParser.ptr === p); - return currentParser.onHeadersComplete(statusCode, upgrade === 1, shouldKeepAlive === 1); - }, - /** - * @param {number} p - * @param {number} at - * @param {number} len - * @returns {number} - */ - wasm_on_body: (p, at, len) => { - assert8(currentParser.ptr === p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)); - }, - /** - * @param {number} p - * @returns {number} - */ - wasm_on_message_complete: (p) => { - assert8(currentParser.ptr === p); - return currentParser.onMessageComplete(); - } - } - }); - } - var llhttpInstance = null; - var currentParser = null; - var currentBufferRef = null; - var currentBufferSize = 0; - var currentBufferPtr = null; - var USE_NATIVE_TIMER = 0; - var USE_FAST_TIMER = 1; - var TIMEOUT_HEADERS = 2 | USE_FAST_TIMER; - var TIMEOUT_BODY = 4 | USE_FAST_TIMER; - var TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER; - var Parser = class { /** - * @param {import('./client.js')} client - * @param {import('net').Socket} socket - * @param {*} llhttp - */ - constructor(client, socket, { exports: exports2 }) { - this.llhttp = exports2; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); - this.client = client; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = 0; - this.statusText = ""; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); - this.bytesRead = 0; - this.keepAlive = ""; - this.contentLength = ""; - this.connection = ""; - this.maxResponseSize = client[kMaxResponseSize]; - } - setTimeout(delay, type) { - if (delay !== this.timeoutValue || type & USE_FAST_TIMER ^ this.timeoutType & USE_FAST_TIMER) { - if (this.timeout) { - timers.clearTimeout(this.timeout); - this.timeout = null; - } - if (delay) { - if (type & USE_FAST_TIMER) { - this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)); - } else { - this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)); - this.timeout?.unref(); + * Frames a piece of data according to the HyBi WebSocket protocol. + * + * @param {(Buffer|String)} data The data to frame + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @return {(Buffer|String)[]} The framed data + * @public + */ + static frame(data, options) { + let mask; + let merge = false; + let offset = 2; + let skipMasking = false; + if (options.mask) { + mask = options.maskBuffer || maskBuffer; + if (options.generateMask) { + options.generateMask(mask); + } else { + if (randomPoolPointer === RANDOM_POOL_SIZE) { + if (randomPool === void 0) { + randomPool = Buffer.alloc(RANDOM_POOL_SIZE); + } + randomFillSync(randomPool, 0, RANDOM_POOL_SIZE); + randomPoolPointer = 0; } + mask[0] = randomPool[randomPoolPointer++]; + mask[1] = randomPool[randomPoolPointer++]; + mask[2] = randomPool[randomPoolPointer++]; + mask[3] = randomPool[randomPoolPointer++]; } - this.timeoutValue = delay; - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); + skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0; + offset = 6; + } + let dataLength; + if (typeof data === "string") { + if ((!options.mask || skipMasking) && options[kByteLength] !== void 0) { + dataLength = options[kByteLength]; + } else { + data = Buffer.from(data); + dataLength = data.length; } + } else { + dataLength = data.length; + merge = options.mask && options.readOnly && !skipMasking; } - this.timeoutType = type; - } - resume() { - if (this.socket.destroyed || !this.paused) { - return; + let payloadLength = dataLength; + if (dataLength >= 65536) { + offset += 8; + payloadLength = 127; + } else if (dataLength > 125) { + offset += 2; + payloadLength = 126; } - assert8(this.ptr != null); - assert8(currentParser === null); - this.llhttp.llhttp_resume(this.ptr); - assert8(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } + const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset); + target[0] = options.fin ? options.opcode | 128 : options.opcode; + if (options.rsv1) target[0] |= 64; + target[1] = payloadLength; + if (payloadLength === 126) { + target.writeUInt16BE(dataLength, 2); + } else if (payloadLength === 127) { + target[2] = target[3] = 0; + target.writeUIntBE(dataLength, 4, 6); } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); - this.readMore(); - } - readMore() { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break; - } - this.execute(chunk); + if (!options.mask) return [target, data]; + target[1] |= 128; + target[offset - 4] = mask[0]; + target[offset - 3] = mask[1]; + target[offset - 2] = mask[2]; + target[offset - 1] = mask[3]; + if (skipMasking) return [target, data]; + if (merge) { + applyMask(data, mask, target, offset, dataLength); + return [target]; } + applyMask(data, mask, data, 0, dataLength); + return [target, data]; } /** - * @param {Buffer} chunk + * Sends a close message to the other peer. + * + * @param {Number} [code] The status code component of the body + * @param {(String|Buffer)} [data] The message component of the body + * @param {Boolean} [mask=false] Specifies whether or not to mask the message + * @param {Function} [cb] Callback + * @public */ - execute(chunk) { - assert8(currentParser === null); - assert8(this.ptr != null); - assert8(!this.paused); - const { socket, llhttp } = this; - if (chunk.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); - } - currentBufferSize = Math.ceil(chunk.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); - } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(chunk); - try { - let ret; - try { - currentBufferRef = chunk; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length); - } finally { - currentParser = null; - currentBufferRef = null; + close(code, data, mask, cb) { + let buf; + if (code === void 0) { + buf = EMPTY_BUFFER; + } else if (typeof code !== "number" || !isValidStatusCode(code)) { + throw new TypeError("First argument must be a valid error code number"); + } else if (data === void 0 || !data.length) { + buf = Buffer.allocUnsafe(2); + buf.writeUInt16BE(code, 0); + } else { + const length = Buffer.byteLength(data); + if (length > 123) { + throw new RangeError("The message must not be greater than 123 bytes"); } - if (ret !== constants.ERROR.OK) { - const data = chunk.subarray(llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr); - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data); - } else { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ""; - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; - } - throw new HTTPParserError(message, constants.ERROR[ret], data); - } + buf = Buffer.allocUnsafe(2 + length); + buf.writeUInt16BE(code, 0); + if (typeof data === "string") { + buf.write(data, 2); + } else { + buf.set(data, 2); } - } catch (err) { - util2.destroy(socket, err); } - } - destroy() { - assert8(currentParser === null); - assert8(this.ptr != null); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; - this.timeout && timers.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.paused = false; - } - /** - * @param {Buffer} buf - * @returns {0} - */ - onStatus(buf) { - this.statusText = buf.toString(); - return 0; + const options = { + [kByteLength]: buf.length, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 8, + readOnly: false, + rsv1: false + }; + if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, buf, false, options, cb]); + } else { + this.sendFrame(_Sender.frame(buf, options), cb); + } } /** - * @returns {0|-1} + * Sends a ping message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public */ - onMessageBegin() { - const { socket, client } = this; - if (socket.destroyed) { - return -1; + ping(data, mask, cb) { + let byteLength; + let readOnly; + if (typeof data === "string") { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; + if (byteLength > 125) { + throw new RangeError("The data size must not be greater than 125 bytes"); } - request.onResponseStarted(); - return 0; - } - /** - * @param {Buffer} buf - * @returns {number} - */ - onHeaderField(buf) { - const len = this.headers.length; - if ((len & 1) === 0) { - this.headers.push(buf); + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 9, + readOnly, + rsv1: false + }; + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + this.sendFrame(_Sender.frame(data, options), cb); } - this.trackHeader(buf.length); - return 0; } /** - * @param {Buffer} buf - * @returns {number} + * Sends a pong message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public */ - onHeaderValue(buf) { - let len = this.headers.length; - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; + pong(data, mask, cb) { + let byteLength; + let readOnly; + if (typeof data === "string") { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; } - const key = this.headers[len - 2]; - if (key.length === 10) { - const headerName = util2.bufferToLowerCasedHeaderName(key); - if (headerName === "keep-alive") { - this.keepAlive += buf.toString(); - } else if (headerName === "connection") { - this.connection += buf.toString(); + if (byteLength > 125) { + throw new RangeError("The data size must not be greater than 125 bytes"); + } + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 10, + readOnly, + rsv1: false + }; + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); } - } else if (key.length === 14 && util2.bufferToLowerCasedHeaderName(key) === "content-length") { - this.contentLength += buf.toString(); + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); + } else { + this.sendFrame(_Sender.frame(data, options), cb); } - this.trackHeader(buf.length); - return 0; } /** - * @param {number} len + * Sends a data message to the other peer. + * + * @param {*} data The message to send + * @param {Object} options Options object + * @param {Boolean} [options.binary=false] Specifies whether `data` is binary + * or text + * @param {Boolean} [options.compress=false] Specifies whether or not to + * compress `data` + * @param {Boolean} [options.fin=false] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Function} [cb] Callback + * @public */ - trackHeader(len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util2.destroy(this.socket, new HeadersOverflowError()); + send(data, options, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName]; + let opcode = options.binary ? 2 : 1; + let rsv1 = options.compress; + let byteLength; + let readOnly; + if (typeof data === "string") { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; } - } - /** - * @param {Buffer} head - */ - onUpgrade(head) { - const { upgrade, client, socket, headers, statusCode } = this; - assert8(upgrade); - assert8(client[kSocket] === socket); - assert8(!socket.destroyed); - assert8(!this.paused); - assert8((headers.length & 1) === 0); - const request = client[kQueue][client[kRunningIdx]]; - assert8(request); - assert8(request.upgrade || request.method === "CONNECT"); - this.statusCode = 0; - this.statusText = ""; - this.shouldKeepAlive = false; - this.headers = []; - this.headersSize = 0; - socket.unshift(head); - socket[kParser].destroy(); - socket[kParser] = null; - socket[kClient] = null; - socket[kError] = null; - removeAllListeners(socket); - client[kSocket] = null; - client[kHTTPContext] = null; - client[kQueue][client[kRunningIdx]++] = null; - client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); - try { - request.onRequestUpgrade(statusCode, headers, socket); - } catch (err) { - util2.destroy(socket, err); + if (this._firstFragment) { + this._firstFragment = false; + if (rsv1 && perMessageDeflate && perMessageDeflate.params[perMessageDeflate._isServer ? "server_no_context_takeover" : "client_no_context_takeover"]) { + rsv1 = byteLength >= perMessageDeflate._threshold; + } + this._compress = rsv1; + } else { + rsv1 = false; + opcode = 0; + } + if (options.fin) this._firstFragment = true; + const opts = { + [kByteLength]: byteLength, + fin: options.fin, + generateMask: this._generateMask, + mask: options.mask, + maskBuffer: this._maskBuffer, + opcode, + readOnly, + rsv1 + }; + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, this._compress, opts, cb]); + } else { + this.getBlobData(data, this._compress, opts, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, this._compress, opts, cb]); + } else { + this.dispatch(data, this._compress, opts, cb); } - client[kResume](); } /** - * @param {number} statusCode - * @param {boolean} upgrade - * @param {boolean} shouldKeepAlive - * @returns {number} + * Gets the contents of a blob as binary data. + * + * @param {Blob} blob The blob + * @param {Boolean} [compress=false] Specifies whether or not to compress + * the data + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private */ - onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; - } - assert8(!this.upgrade); - assert8(this.statusCode < 200); - if (statusCode === 100) { - util2.destroy(socket, new SocketError("bad response", util2.getSocketInfo(socket))); - return -1; - } - if (upgrade && !request.upgrade) { - util2.destroy(socket, new SocketError("bad upgrade", util2.getSocketInfo(socket))); - return -1; - } - assert8(this.timeoutType === TIMEOUT_HEADERS); - this.statusCode = statusCode; - this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. - request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - if (request.method === "CONNECT") { - assert8(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - if (upgrade) { - assert8(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - assert8((this.headers.length & 1) === 0); - this.headers = []; - this.headersSize = 0; - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util2.parseKeepAliveTimeout(this.keepAlive) : null; - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] + getBlobData(blob, compress, options, cb) { + this._bufferedBytes += options[kByteLength]; + this._state = GET_BLOB_DATA; + blob.arrayBuffer().then((arrayBuffer) => { + if (this._socket.destroyed) { + const err = new Error( + "The socket was closed while the blob was being read" ); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client[kKeepAliveTimeoutValue] = timeout; - } + process.nextTick(callCallbacks, this, err, cb); + return; + } + this._bufferedBytes -= options[kByteLength]; + const data = toBuffer(arrayBuffer); + if (!compress) { + this._state = DEFAULT; + this.sendFrame(_Sender.frame(data, options), cb); + this.dequeue(); } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; + this.dispatch(data, compress, options, cb); } - } else { - socket[kReset] = true; - } - const pause = request.onResponseStart(statusCode, headers, this.resume, statusText) === false; - if (request.aborted) { - return -1; - } - if (request.method === "HEAD") { - return 1; - } - if (statusCode < 200) { - return 1; - } - if (socket[kBlocking]) { - socket[kBlocking] = false; - client[kResume](); + }).catch((err) => { + process.nextTick(onError, this, err, cb); + }); + } + /** + * Dispatches a message. + * + * @param {(Buffer|String)} data The message to send + * @param {Boolean} [compress=false] Specifies whether or not to compress + * `data` + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + dispatch(data, compress, options, cb) { + if (!compress) { + this.sendFrame(_Sender.frame(data, options), cb); + return; } - return pause ? constants.ERROR.PAUSED : 0; + const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName]; + this._bufferedBytes += options[kByteLength]; + this._state = DEFLATING; + perMessageDeflate.compress(data, options.fin, (_, buf) => { + if (this._socket.destroyed) { + const err = new Error( + "The socket was closed while data was being compressed" + ); + callCallbacks(this, err, cb); + return; + } + this._bufferedBytes -= options[kByteLength]; + this._state = DEFAULT; + options.readOnly = false; + this.sendFrame(_Sender.frame(buf, options), cb); + this.dequeue(); + }); } /** - * @param {Buffer} buf - * @returns {number} + * Executes queued send operations. + * + * @private */ - onBody(buf) { - const { client, socket, statusCode, maxResponseSize } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - assert8(request); - assert8(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - assert8(statusCode >= 200); - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util2.destroy(socket, new ResponseExceededMaxSizeError()); - return -1; - } - this.bytesRead += buf.length; - if (request.onResponseData(buf) === false) { - return constants.ERROR.PAUSED; + dequeue() { + while (this._state === DEFAULT && this._queue.length) { + const params = this._queue.shift(); + this._bufferedBytes -= params[3][kByteLength]; + Reflect.apply(params[0], this, params.slice(1)); } - return 0; } /** - * @returns {number} + * Enqueues a send operation. + * + * @param {Array} params Send operation parameters. + * @private */ - onMessageComplete() { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1; - } - if (upgrade) { - return 0; - } - assert8(statusCode >= 100); - assert8((this.headers.length & 1) === 0); - const request = client[kQueue][client[kRunningIdx]]; - assert8(request); - this.statusCode = 0; - this.statusText = ""; - this.bytesRead = 0; - this.contentLength = ""; - this.keepAlive = ""; - this.connection = ""; - this.headers = []; - this.headersSize = 0; - if (statusCode < 200) { - return 0; - } - if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util2.destroy(socket, new ResponseContentLengthMismatchError()); - return -1; - } - request.onResponseEnd(headers); - client[kQueue][client[kRunningIdx]++] = null; - if (socket[kWriting]) { - assert8(client[kRunning] === 0); - util2.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (!shouldKeepAlive) { - util2.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (socket[kReset] && client[kRunning] === 0) { - util2.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (client[kPipelining] == null || client[kPipelining] === 1) { - setImmediate(client[kResume]); + enqueue(params) { + this._bufferedBytes += params[3][kByteLength]; + this._queue.push(params); + } + /** + * Sends a frame. + * + * @param {(Buffer | String)[]} list The frame to send + * @param {Function} [cb] Callback + * @private + */ + sendFrame(list, cb) { + if (list.length === 2) { + this._socket.cork(); + this._socket.write(list[0]); + this._socket.write(list[1], cb); + this._socket.uncork(); } else { - client[kResume](); + this._socket.write(list[0], cb); } - return 0; } }; - function onParserTimeout(parserWeakRef) { - const parser = parserWeakRef.deref(); - if (!parser) { - return; - } - const { socket, timeoutType, client, paused } = parser; - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert8(!paused, "cannot be paused while waiting for headers"); - util2.destroy(socket, new HeadersTimeoutError()); - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!paused) { - util2.destroy(socket, new BodyTimeoutError()); - } - } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { - assert8(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); - util2.destroy(socket, new InformationalError("socket idle timeout")); + module.exports = Sender2; + function callCallbacks(sender, err, cb) { + if (typeof cb === "function") cb(err); + for (let i = 0; i < sender._queue.length; i++) { + const params = sender._queue[i]; + const callback = params[params.length - 1]; + if (typeof callback === "function") callback(err); } } - function connectH1(client, socket) { - client[kSocket] = socket; - if (!llhttpInstance) { - llhttpInstance = lazyllhttp(); + function onError(sender, err, cb) { + callCallbacks(sender, err, cb); + sender.onerror(err); + } + } +}); + +// node_modules/ws/lib/event-target.js +var require_event_target = __commonJS({ + "node_modules/ws/lib/event-target.js"(exports, module) { + "use strict"; + var { kForOnEventAttribute, kListener } = require_constants(); + var kCode = /* @__PURE__ */ Symbol("kCode"); + var kData = /* @__PURE__ */ Symbol("kData"); + var kError = /* @__PURE__ */ Symbol("kError"); + var kMessage = /* @__PURE__ */ Symbol("kMessage"); + var kReason = /* @__PURE__ */ Symbol("kReason"); + var kTarget = /* @__PURE__ */ Symbol("kTarget"); + var kType = /* @__PURE__ */ Symbol("kType"); + var kWasClean = /* @__PURE__ */ Symbol("kWasClean"); + var Event2 = class { + /** + * Create a new `Event`. + * + * @param {String} type The name of the event + * @throws {TypeError} If the `type` argument is not specified + */ + constructor(type) { + this[kTarget] = null; + this[kType] = type; } - if (socket.errored) { - throw socket.errored; + /** + * @type {*} + */ + get target() { + return this[kTarget]; } - if (socket.destroyed) { - throw new SocketError("destroyed"); + /** + * @type {String} + */ + get type() { + return this[kType]; } - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); - util2.addListener(socket, "error", onHttpSocketError); - util2.addListener(socket, "readable", onHttpSocketReadable); - util2.addListener(socket, "end", onHttpSocketEnd); - util2.addListener(socket, "close", onHttpSocketClose); - socket[kClosed] = false; - socket.on("close", onSocketClose); - return { - version: "h1", - defaultPipelining: 1, - write(request) { - return writeH1(client, request); - }, - resume() { - resumeH1(client); - }, - /** - * @param {Error|undefined} err - * @param {() => void} callback - */ - destroy(err, callback) { - if (socket[kClosed]) { - queueMicrotask(callback); - } else { - socket.on("close", callback); - socket.destroy(err); - } - }, - /** - * @returns {boolean} - */ - get destroyed() { - return socket.destroyed; - }, - /** - * @param {import('../core/request.js')} request - * @returns {boolean} - */ - busy(request) { - if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return true; - } - if (request) { - if (client[kRunning] > 0 && !request.idempotent) { - return true; - } - if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { - return true; - } - if (client[kRunning] > 0 && util2.bodyLength(request.body) !== 0 && (util2.isStream(request.body) || util2.isAsyncIterable(request.body) || util2.isFormDataLike(request.body))) { - return true; - } - } - return false; - } - }; - } - function onHttpSocketError(err) { - assert8(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - const parser = this[kParser]; - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; + }; + Object.defineProperty(Event2.prototype, "target", { enumerable: true }); + Object.defineProperty(Event2.prototype, "type", { enumerable: true }); + var CloseEvent = class extends Event2 { + /** + * Create a new `CloseEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {Number} [options.code=0] The status code explaining why the + * connection was closed + * @param {String} [options.reason=''] A human-readable string explaining why + * the connection was closed + * @param {Boolean} [options.wasClean=false] Indicates whether or not the + * connection was cleanly closed + */ + constructor(type, options = {}) { + super(type); + this[kCode] = options.code === void 0 ? 0 : options.code; + this[kReason] = options.reason === void 0 ? "" : options.reason; + this[kWasClean] = options.wasClean === void 0 ? false : options.wasClean; } - this[kError] = err; - this[kClient][kOnError](err); - } - function onHttpSocketReadable() { - this[kParser]?.readMore(); - } - function onHttpSocketEnd() { - const parser = this[kParser]; - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; + /** + * @type {Number} + */ + get code() { + return this[kCode]; } - util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); - } - function onHttpSocketClose() { - const parser = this[kParser]; - if (parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - } - this[kParser].destroy(); - this[kParser] = null; + /** + * @type {String} + */ + get reason() { + return this[kReason]; } - const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); - const client = this[kClient]; - client[kSocket] = null; - client[kHTTPContext] = null; - if (client.destroyed) { - assert8(client[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - util2.errorRequest(client, request, err); - } - } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - util2.errorRequest(client, request, err); + /** + * @type {Boolean} + */ + get wasClean() { + return this[kWasClean]; } - client[kPendingIdx] = client[kRunningIdx]; - assert8(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - client[kResume](); - } - function onSocketClose() { - this[kClosed] = true; - } - function resumeH1(client) { - const socket = client[kSocket]; - if (socket && !socket.destroyed) { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request.headersTimeout != null ? request.headersTimeout : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } - } + }; + Object.defineProperty(CloseEvent.prototype, "code", { enumerable: true }); + Object.defineProperty(CloseEvent.prototype, "reason", { enumerable: true }); + Object.defineProperty(CloseEvent.prototype, "wasClean", { enumerable: true }); + var ErrorEvent = class extends Event2 { + /** + * Create a new `ErrorEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.error=null] The error that generated this event + * @param {String} [options.message=''] The error message + */ + constructor(type, options = {}) { + super(type); + this[kError] = options.error === void 0 ? null : options.error; + this[kMessage] = options.message === void 0 ? "" : options.message; } - } - function shouldSendContentLength(method) { - return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; - } - function writeH1(client, request) { - const { method, path, host, upgrade, blocking, reset } = request; - let { body, headers, contentLength } = request; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH" || method === "QUERY" || method === "PROPFIND" || method === "PROPPATCH"; - if (util2.isFormDataLike(body)) { - if (!extractBody) { - extractBody = require_body().extractBody; - } - const [bodyStream, contentType] = extractBody(body); - if (request.contentType == null) { - headers.push("content-type", contentType); - } - body = bodyStream.stream; - contentLength = bodyStream.length; - } else if (util2.isBlobLike(body) && request.contentType == null && body.type) { - headers.push("content-type", body.type); + /** + * @type {*} + */ + get error() { + return this[kError]; } - if (body && typeof body.read === "function") { - body.read(0); + /** + * @type {String} + */ + get message() { + return this[kMessage]; } - const bodyLength = util2.bodyLength(body); - contentLength = bodyLength ?? contentLength; - if (contentLength === null) { - contentLength = request.contentLength; + }; + Object.defineProperty(ErrorEvent.prototype, "error", { enumerable: true }); + Object.defineProperty(ErrorEvent.prototype, "message", { enumerable: true }); + var MessageEvent = class extends Event2 { + /** + * Create a new `MessageEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.data=null] The message content + */ + constructor(type, options = {}) { + super(type); + this[kData] = options.data === void 0 ? null : options.data; } - if (contentLength === 0 && !expectsPayload) { - contentLength = null; + /** + * @type {*} + */ + get data() { + return this[kData]; } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - util2.errorRequest(client, request, new RequestContentLengthMismatchError()); - return false; + }; + Object.defineProperty(MessageEvent.prototype, "data", { enumerable: true }); + var EventTarget2 = { + /** + * Register an event listener. + * + * @param {String} type A string representing the event type to listen for + * @param {(Function|Object)} handler The listener to add + * @param {Object} [options] An options object specifies characteristics about + * the event listener + * @param {Boolean} [options.once=false] A `Boolean` indicating that the + * listener should be invoked at most once after being added. If `true`, + * the listener would be automatically removed when invoked. + * @public + */ + addEventListener(type, handler, options = {}) { + for (const listener of this.listeners(type)) { + if (!options[kForOnEventAttribute] && listener[kListener] === handler && !listener[kForOnEventAttribute]) { + return; + } } - process.emitWarning(new RequestContentLengthMismatchError()); - } - const socket = client[kSocket]; - const abort = (err) => { - if (request.aborted || request.completed) { + let wrapper; + if (type === "message") { + wrapper = function onMessage(data, isBinary) { + const event = new MessageEvent("message", { + data: isBinary ? data : data.toString() + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "close") { + wrapper = function onClose(code, message) { + const event = new CloseEvent("close", { + code, + reason: message.toString(), + wasClean: this._closeFrameReceived && this._closeFrameSent + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "error") { + wrapper = function onError(error) { + const event = new ErrorEvent("error", { + error, + message: error.message + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "open") { + wrapper = function onOpen() { + const event = new Event2("open"); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else { return; } - util2.errorRequest(client, request, err || new RequestAbortedError()); - util2.destroy(body); - util2.destroy(socket, new InformationalError("aborted")); - }; - try { - request.onRequestStart(abort, null); - } catch (err) { - util2.errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - if (method === "HEAD") { - socket[kReset] = true; - } - if (upgrade || method === "CONNECT") { - socket[kReset] = true; - } - if (reset != null) { - socket[kReset] = reset; - } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; - } - if (blocking) { - socket[kBlocking] = true; - } - if (socket.setTypeOfService) { - socket.setTypeOfService(request.typeOfService); - } - let header = `${method} ${path} HTTP/1.1\r -`; - if (typeof host === "string") { - header += `host: ${host}\r -`; - } else { - header += client[kHostHeader]; + wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute]; + wrapper[kListener] = handler; + if (options.once) { + this.once(type, wrapper); + } else { + this.on(type, wrapper); + } + }, + /** + * Remove an event listener. + * + * @param {String} type A string representing the event type to remove + * @param {(Function|Object)} handler The listener to remove + * @public + */ + removeEventListener(type, handler) { + for (const listener of this.listeners(type)) { + if (listener[kListener] === handler && !listener[kForOnEventAttribute]) { + this.removeListener(type, listener); + break; + } + } } - if (upgrade) { - header += `connection: upgrade\r -upgrade: ${upgrade}\r -`; - } else if (client[kPipelining] && !socket[kReset]) { - header += "connection: keep-alive\r\n"; + }; + module.exports = { + CloseEvent, + ErrorEvent, + Event: Event2, + EventTarget: EventTarget2, + MessageEvent + }; + function callListener(listener, thisArg, event) { + if (typeof listener === "object" && listener.handleEvent) { + listener.handleEvent.call(listener, event); } else { - header += "connection: close\r\n"; + listener.call(thisArg, event); } - if (Array.isArray(headers)) { - for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0]; - const val = headers[n + 1]; - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - header += `${key}: ${val[i]}\r -`; + } + } +}); + +// node_modules/ws/lib/extension.js +var require_extension = __commonJS({ + "node_modules/ws/lib/extension.js"(exports, module) { + "use strict"; + var { tokenChars } = require_validation(); + function push(dest, name, elem) { + if (dest[name] === void 0) dest[name] = [elem]; + else dest[name].push(elem); + } + function parse(header) { + const offers = /* @__PURE__ */ Object.create(null); + let params = /* @__PURE__ */ Object.create(null); + let mustUnescape = false; + let isEscaping = false; + let inQuotes = false; + let extensionName; + let paramName; + let start = -1; + let code = -1; + let end = -1; + let i = 0; + for (; i < header.length; i++) { + code = header.charCodeAt(i); + if (extensionName === void 0) { + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (i !== 0 && (code === 32 || code === 9)) { + if (end === -1 && start !== -1) end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) end = i; + const name = header.slice(start, end); + if (code === 44) { + push(offers, name, params); + params = /* @__PURE__ */ Object.create(null); + } else { + extensionName = name; } + start = end = -1; } else { - header += `${key}: ${val}\r -`; + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (paramName === void 0) { + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (code === 32 || code === 9) { + if (end === -1 && start !== -1) end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) end = i; + push(params, header.slice(start, end), true); + if (code === 44) { + push(offers, extensionName, params); + params = /* @__PURE__ */ Object.create(null); + extensionName = void 0; + } + start = end = -1; + } else if (code === 61 && start !== -1 && end === -1) { + paramName = header.slice(start, i); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else { + if (isEscaping) { + if (tokenChars[code] !== 1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (start === -1) start = i; + else if (!mustUnescape) mustUnescape = true; + isEscaping = false; + } else if (inQuotes) { + if (tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (code === 34 && start !== -1) { + inQuotes = false; + end = i; + } else if (code === 92) { + isEscaping = true; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (code === 34 && header.charCodeAt(i - 1) === 61) { + inQuotes = true; + } else if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (start !== -1 && (code === 32 || code === 9)) { + if (end === -1) end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) end = i; + let value = header.slice(start, end); + if (mustUnescape) { + value = value.replace(/\\/g, ""); + mustUnescape = false; + } + push(params, paramName, value); + if (code === 44) { + push(offers, extensionName, params); + params = /* @__PURE__ */ Object.create(null); + extensionName = void 0; + } + paramName = void 0; + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); } } } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); + if (start === -1 || inQuotes || code === 32 || code === 9) { + throw new SyntaxError("Unexpected end of input"); } - if (!body || bodyLength === 0) { - writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload); - } else if (util2.isBuffer(body)) { - writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload); - } else if (util2.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload); + if (end === -1) end = i; + const token = header.slice(start, end); + if (extensionName === void 0) { + push(offers, token, params); + } else { + if (paramName === void 0) { + push(params, token, true); + } else if (mustUnescape) { + push(params, paramName, token.replace(/\\/g, "")); } else { - writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload); + push(params, paramName, token); } - } else if (util2.isStream(body)) { - writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload); - } else if (util2.isIterable(body)) { - writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload); - } else { - assert8(false); + push(offers, extensionName, params); } - return true; + return offers; } - function writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload) { - assert8(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); - let finished2 = false; - const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); - const onData = function(chunk) { - if (finished2) { - return; - } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util2.destroy(this, err); - } - }; - const onDrain = function() { - if (finished2) { - return; - } - if (body.resume) { - body.resume(); - } - }; - const onClose = function() { - queueMicrotask(() => { - body.removeListener("error", onFinished); - }); - if (!finished2) { - const err = new RequestAbortedError(); - queueMicrotask(() => onFinished(err)); - } - }; - const onFinished = function(err) { - if (finished2) { - return; - } - finished2 = true; - assert8(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); - socket.off("drain", onDrain).off("error", onFinished); - body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose); - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; + function format(extensions) { + return Object.keys(extensions).map((extension2) => { + let configurations = extensions[extension2]; + if (!Array.isArray(configurations)) configurations = [configurations]; + return configurations.map((params) => { + return [extension2].concat( + Object.keys(params).map((k) => { + let values = params[k]; + if (!Array.isArray(values)) values = [values]; + return values.map((v) => v === true ? k : `${k}=${v}`).join("; "); + }) + ).join("; "); + }).join(", "); + }).join(", "); + } + module.exports = { format, parse }; + } +}); + +// node_modules/ws/lib/websocket.js +var require_websocket = __commonJS({ + "node_modules/ws/lib/websocket.js"(exports, module) { + "use strict"; + var EventEmitter = __require("events"); + var https = __require("https"); + var http2 = __require("http"); + var net = __require("net"); + var tls = __require("tls"); + var { randomBytes: randomBytes4, createHash: createHash4 } = __require("crypto"); + var { Duplex, Readable } = __require("stream"); + var { URL: URL2 } = __require("url"); + var PerMessageDeflate2 = require_permessage_deflate(); + var Receiver2 = require_receiver(); + var Sender2 = require_sender(); + var { isBlob } = require_validation(); + var { + BINARY_TYPES, + CLOSE_TIMEOUT, + EMPTY_BUFFER, + GUID, + kForOnEventAttribute, + kListener, + kStatusCode, + kWebSocket, + NOOP + } = require_constants(); + var { + EventTarget: { addEventListener, removeEventListener } + } = require_event_target(); + var { format, parse } = require_extension(); + var { toBuffer } = require_buffer_util(); + var kAborted = /* @__PURE__ */ Symbol("kAborted"); + var protocolVersions = [8, 13]; + var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"]; + var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/; + var WebSocket2 = class _WebSocket extends EventEmitter { + /** + * Create a new `WebSocket`. + * + * @param {(String|URL)} address The URL to which to connect + * @param {(String|String[])} [protocols] The subprotocols + * @param {Object} [options] Connection options + */ + constructor(address2, protocols, options) { + super(); + this._binaryType = BINARY_TYPES[0]; + this._closeCode = 1006; + this._closeFrameReceived = false; + this._closeFrameSent = false; + this._closeMessage = EMPTY_BUFFER; + this._closeTimer = null; + this._errorEmitted = false; + this._extensions = {}; + this._paused = false; + this._protocol = ""; + this._readyState = _WebSocket.CONNECTING; + this._receiver = null; + this._sender = null; + this._socket = null; + if (address2 !== null) { + this._bufferedAmount = 0; + this._isServer = false; + this._redirects = 0; + if (protocols === void 0) { + protocols = []; + } else if (!Array.isArray(protocols)) { + if (typeof protocols === "object" && protocols !== null) { + options = protocols; + protocols = []; + } else { + protocols = [protocols]; + } } - } - writer.destroy(err); - if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { - util2.destroy(body, err); + initAsClient(this, address2, protocols, options); } else { - util2.destroy(body); + this._autoPong = options.autoPong; + this._closeTimeout = options.closeTimeout; + this._isServer = true; } - }; - body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onClose); - if (body.resume) { - body.resume(); } - socket.on("drain", onDrain).on("error", onFinished); - if (body.errorEmitted ?? body.errored) { - setImmediate(onFinished, body.errored); - } else if (body.endEmitted ?? body.readableEnded) { - setImmediate(onFinished, null); + /** + * For historical reasons, the custom "nodebuffer" type is used by the default + * instead of "blob". + * + * @type {String} + */ + get binaryType() { + return this._binaryType; } - if (body.closeEmitted ?? body.closed) { - setImmediate(onClose); + set binaryType(type) { + if (!BINARY_TYPES.includes(type)) return; + this._binaryType = type; + if (this._receiver) this._receiver._binaryType = type; } - } - function writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload) { - try { - if (!body) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - assert8(contentLength === null, "no body must not have content length"); - socket.write(`${header}\r -`, "latin1"); - } - } else if (util2.isBuffer(body)) { - assert8(contentLength === body.byteLength, "buffer body must have content length"); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - if (!expectsPayload && request.reset !== false) { - socket[kReset] = true; - } - } - request.onRequestSent(); - client[kResume](); - } catch (err) { - abort(err); + /** + * @type {Number} + */ + get bufferedAmount() { + if (!this._socket) return this._bufferedAmount; + return this._socket._writableState.length + this._sender._bufferedBytes; } - } - async function writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload) { - assert8(contentLength === body.size, "blob body must have content length"); - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError(); - } - const buffer2 = Buffer.from(await body.arrayBuffer()); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(buffer2); - socket.uncork(); - request.onBodySent(buffer2); - request.onRequestSent(); - if (!expectsPayload && request.reset !== false) { - socket[kReset] = true; - } - client[kResume](); - } catch (err) { - abort(err); + /** + * @type {String} + */ + get extensions() { + return Object.keys(this._extensions).join(); } - } - async function writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload) { - assert8(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); - let callback = null; - function onDrain() { - if (callback) { - const cb = callback; - callback = null; - cb(); - } + /** + * @type {Boolean} + */ + get isPaused() { + return this._paused; } - const waitForDrain = () => new Promise((resolve, reject) => { - assert8(callback === null); - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; - } - }); - socket.on("close", onDrain).on("drain", onDrain); - const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - if (!writer.write(chunk)) { - await waitForDrain(); - } - } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket.off("close", onDrain).off("drain", onDrain); + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onclose() { + return null; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onerror() { + return null; } - } - var AsyncWriter = class { /** - * - * @param {object} arg - * @param {AbortCallback} arg.abort - * @param {import('net').Socket} arg.socket - * @param {import('../core/request.js')} arg.request - * @param {number} arg.contentLength - * @param {import('./client.js')} arg.client - * @param {boolean} arg.expectsPayload - * @param {string} arg.header + * @type {Function} */ - constructor({ abort, socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - this.abort = abort; - socket[kWriting] = true; + /* istanbul ignore next */ + get onopen() { + return null; } /** - * @param {Buffer} chunk - * @returns + * @type {Function} */ - write(chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return false; - } - const len = Buffer.byteLength(chunk); - if (!len) { - return true; - } - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } - process.emitWarning(new RequestContentLengthMismatchError()); - } - socket.cork(); - if (bytesWritten === 0) { - if (!expectsPayload && request.reset !== false) { - socket[kReset] = true; - } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r -`, "latin1"); - } else { - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - } - } - if (contentLength === null) { - socket.write(`\r -${len.toString(16)}\r -`, "latin1"); - } - this.bytesWritten += len; - const ret = socket.write(chunk); - socket.uncork(); - request.onBodySent(chunk); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - } - return ret; + /* istanbul ignore next */ + get onmessage() { + return null; } /** - * @returns {void} + * @type {String} */ - end() { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); - socket[kWriting] = false; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return; - } - if (bytesWritten === 0) { - if (expectsPayload) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - socket.write(`${header}\r -`, "latin1"); - } - } else if (contentLength === null) { - socket.write("\r\n0\r\n\r\n", "latin1"); - } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } else { - process.emitWarning(new RequestContentLengthMismatchError()); - } - } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - client[kResume](); + get protocol() { + return this._protocol; } /** - * @param {Error} [err] - * @returns {void} + * @type {Number} */ - destroy(err) { - const { socket, client, abort } = this; - socket[kWriting] = false; - if (err) { - assert8(client[kRunning] <= 1, "pipeline should only contain this request"); - abort(err); - } - } - }; - module.exports = connectH1; - } -}); - -// node_modules/undici/lib/dispatcher/client-h2.js -var require_client_h2 = __commonJS({ - "node_modules/undici/lib/dispatcher/client-h2.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { pipeline } = __require("stream"); - var util2 = require_util(); - var { - RequestContentLengthMismatchError, - RequestAbortedError, - SocketError, - InformationalError, - InvalidArgumentError - } = require_errors(); - var { - kUrl, - kReset, - kClient, - kRunning, - kPending, - kQueue, - kPendingIdx, - kRunningIdx, - kError, - kSocket, - kStrictContentLength, - kOnError, - kMaxConcurrentStreams, - kPingInterval, - kHTTP2Session, - kHTTP2InitialWindowSize, - kHTTP2ConnectionWindowSize, - kResume, - kSize, - kHTTPContext, - kClosed, - kBodyTimeout, - kEnableConnectProtocol, - kRemoteSettings, - kHTTP2Stream, - kHTTP2SessionState - } = require_symbols(); - var { channels } = require_diagnostics(); - var kOpenStreams = /* @__PURE__ */ Symbol("open streams"); - var extractBody; - var http2; - try { - http2 = __require("http2"); - } catch { - http2 = { constants: {} }; - } - var { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS, - HTTP2_HEADER_PROTOCOL, - NGHTTP2_REFUSED_STREAM, - NGHTTP2_CANCEL + get readyState() { + return this._readyState; } - } = http2; - function parseH2Headers(headers) { - const result = []; - for (const [name, value] of Object.entries(headers)) { - if (Array.isArray(value)) { - for (const subvalue of value) { - result.push(Buffer.from(name), Buffer.from(subvalue)); - } - } else { - result.push(Buffer.from(name), Buffer.from(value)); - } + /** + * @type {String} + */ + get url() { + return this._url; } - return result; - } - function connectH2(client, socket) { - client[kSocket] = socket; - const http2InitialWindowSize = client[kHTTP2InitialWindowSize]; - const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize]; - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kMaxConcurrentStreams], - settings: { - // TODO(metcoder95): add support for PUSH - enablePush: false, - ...http2InitialWindowSize != null ? { initialWindowSize: http2InitialWindowSize } : null - } - }); - client[kSocket] = socket; - session[kOpenStreams] = 0; - session[kClient] = client; - session[kSocket] = socket; - session[kHTTP2SessionState] = { - ping: { - interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref() - } - }; - session[kEnableConnectProtocol] = false; - session[kRemoteSettings] = false; - if (http2ConnectionWindowSize) { - util2.addListener(session, "connect", applyConnectionWindowSize.bind(session, http2ConnectionWindowSize)); + /** + * Set up the socket and the internal resources. + * + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Object} options Options object + * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Number} [options.maxPayload=0] The maximum allowed message size + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @private + */ + setSocket(socket, head, options) { + const receiver = new Receiver2({ + allowSynchronousEvents: options.allowSynchronousEvents, + binaryType: this.binaryType, + extensions: this._extensions, + isServer: this._isServer, + maxPayload: options.maxPayload, + skipUTF8Validation: options.skipUTF8Validation + }); + const sender = new Sender2(socket, this._extensions, options.generateMask); + this._receiver = receiver; + this._sender = sender; + this._socket = socket; + receiver[kWebSocket] = this; + sender[kWebSocket] = this; + socket[kWebSocket] = this; + receiver.on("conclude", receiverOnConclude); + receiver.on("drain", receiverOnDrain); + receiver.on("error", receiverOnError); + receiver.on("message", receiverOnMessage); + receiver.on("ping", receiverOnPing); + receiver.on("pong", receiverOnPong); + sender.onerror = senderOnError; + if (socket.setTimeout) socket.setTimeout(0); + if (socket.setNoDelay) socket.setNoDelay(); + if (head.length > 0) socket.unshift(head); + socket.on("close", socketOnClose); + socket.on("data", socketOnData); + socket.on("end", socketOnEnd); + socket.on("error", socketOnError); + this._readyState = _WebSocket.OPEN; + this.emit("open"); } - util2.addListener(session, "error", onHttp2SessionError); - util2.addListener(session, "frameError", onHttp2FrameError); - util2.addListener(session, "end", onHttp2SessionEnd); - util2.addListener(session, "goaway", onHttp2SessionGoAway); - util2.addListener(session, "close", onHttp2SessionClose); - util2.addListener(session, "remoteSettings", onHttp2RemoteSettings); - session.unref(); - client[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - util2.addListener(socket, "error", onHttp2SocketError); - util2.addListener(socket, "end", onHttp2SocketEnd); - util2.addListener(socket, "close", onHttp2SocketClose); - socket[kClosed] = false; - socket.on("close", onSocketClose); - return { - version: "h2", - defaultPipelining: Infinity, - /** - * @param {import('../core/request.js')} request - * @returns {boolean} - */ - write(request) { - return writeH2(client, request); - }, - /** - * @returns {void} - */ - resume() { - resumeH2(client); - }, - /** - * @param {Error | null} err - * @param {() => void} callback - */ - destroy(err, callback) { - if (socket[kClosed]) { - queueMicrotask(callback); - } else { - socket.destroy(err).on("close", callback); - } - }, - /** - * @type {boolean} - */ - get destroyed() { - return socket.destroyed; - }, - /** - * @param {import('../core/request.js')} request - * @returns {boolean} - */ - busy(request) { - if (request != null) { - if (client[kRunning] > 0) { - if (request.idempotent === false) return true; - if ((request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false) return true; - if (util2.bodyLength(request.body) !== 0 && (util2.isStream(request.body) || util2.isAsyncIterable(request.body) || util2.isFormDataLike(request.body))) return true; - } else { - return (request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false; - } - } - return false; + /** + * Emit the `'close'` event. + * + * @private + */ + emitClose() { + if (!this._socket) { + this._readyState = _WebSocket.CLOSED; + this.emit("close", this._closeCode, this._closeMessage); + return; } - }; - } - function resumeH2(client) { - const socket = client[kSocket]; - if (socket?.destroyed === false) { - if (client[kSize] === 0 || client[kMaxConcurrentStreams] === 0) { - socket.unref(); - client[kHTTP2Session].unref(); - } else { - socket.ref(); - client[kHTTP2Session].ref(); + if (this._extensions[PerMessageDeflate2.extensionName]) { + this._extensions[PerMessageDeflate2.extensionName].cleanup(); } + this._receiver.removeAllListeners(); + this._readyState = _WebSocket.CLOSED; + this.emit("close", this._closeCode, this._closeMessage); } - } - function applyConnectionWindowSize(connectionWindowSize) { - try { - if (typeof this.setLocalWindowSize === "function") { - this.setLocalWindowSize(connectionWindowSize); + /** + * Start a closing handshake. + * + * +----------+ +-----------+ +----------+ + * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - + * | +----------+ +-----------+ +----------+ | + * +----------+ +-----------+ | + * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING + * +----------+ +-----------+ | + * | | | +---+ | + * +------------------------+-->|fin| - - - - + * | +---+ | +---+ + * - - - - -|fin|<---------------------+ + * +---+ + * + * @param {Number} [code] Status code explaining why the connection is closing + * @param {(String|Buffer)} [data] The reason why the connection is + * closing + * @public + */ + close(code, data) { + if (this.readyState === _WebSocket.CLOSED) return; + if (this.readyState === _WebSocket.CONNECTING) { + const msg = "WebSocket was closed before the connection was established"; + abortHandshake(this, this._req, msg); + return; } - } catch { - } - } - function onHttp2RemoteSettings(settings) { - this[kClient][kMaxConcurrentStreams] = settings.maxConcurrentStreams ?? this[kClient][kMaxConcurrentStreams]; - if (this[kRemoteSettings] === true && this[kEnableConnectProtocol] === true && settings.enableConnectProtocol === false) { - const err = new InformationalError("HTTP/2: Server disabled extended CONNECT protocol against RFC-8441"); - this[kSocket][kError] = err; - this[kClient][kOnError](err); - return; - } - this[kEnableConnectProtocol] = settings.enableConnectProtocol ?? this[kEnableConnectProtocol]; - this[kRemoteSettings] = true; - this[kClient][kResume](); - } - function onHttp2SendPing(session) { - const state = session[kHTTP2SessionState]; - if ((session.closed || session.destroyed) && state.ping.interval != null) { - clearInterval(state.ping.interval); - state.ping.interval = null; - return; - } - session.ping(onPing.bind(session)); - function onPing(err, duration) { - const client = this[kClient]; - const socket = this[kClient]; - if (err != null) { - const error = new InformationalError(`HTTP/2: "PING" errored - type ${err.message}`); - socket[kError] = error; - client[kOnError](error); - } else { - client.emit("ping", duration); + if (this.readyState === _WebSocket.CLOSING) { + if (this._closeFrameSent && (this._closeFrameReceived || this._receiver._writableState.errorEmitted)) { + this._socket.end(); + } + return; } + this._readyState = _WebSocket.CLOSING; + this._sender.close(code, data, !this._isServer, (err) => { + if (err) return; + this._closeFrameSent = true; + if (this._closeFrameReceived || this._receiver._writableState.errorEmitted) { + this._socket.end(); + } + }); + setCloseTimer(this); } - } - function onHttp2SessionError(err) { - assert8(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - this[kSocket][kError] = err; - this[kClient][kOnError](err); - } - function onHttp2FrameError(type, code, id) { - if (id === 0) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - this[kSocket][kError] = err; - this[kClient][kOnError](err); - } - } - function onHttp2SessionEnd() { - const err = new SocketError("other side closed", util2.getSocketInfo(this[kSocket])); - this.destroy(err); - util2.destroy(this[kSocket], err); - } - function onHttp2SessionGoAway(errorCode) { - const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${errorCode}`, util2.getSocketInfo(this[kSocket])); - const client = this[kClient]; - client[kSocket] = null; - client[kHTTPContext] = null; - this.close(); - this[kHTTP2Session] = null; - util2.destroy(this[kSocket], err); - if (client[kRunningIdx] < client[kQueue].length) { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - util2.errorRequest(client, request, err); - client[kPendingIdx] = client[kRunningIdx]; - } - assert8(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - client.emit("connectionError", client[kUrl], [client], err); - client[kResume](); - } - function onHttp2SessionClose() { - const { [kClient]: client, [kHTTP2SessionState]: state } = this; - const { [kSocket]: socket } = client; - const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util2.getSocketInfo(socket)); - client[kSocket] = null; - client[kHTTPContext] = null; - if (state.ping.interval != null) { - clearInterval(state.ping.interval); - state.ping.interval = null; + /** + * Pause the socket. + * + * @public + */ + pause() { + if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) { + return; + } + this._paused = true; + this._socket.pause(); } - if (client.destroyed) { - assert8(client[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - util2.errorRequest(client, request, err); + /** + * Send a ping. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the ping is sent + * @public + */ + ping(data, mask, cb) { + if (this.readyState === _WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof data === "function") { + cb = data; + data = mask = void 0; + } else if (typeof mask === "function") { + cb = mask; + mask = void 0; + } + if (typeof data === "number") data = data.toString(); + if (this.readyState !== _WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; } + if (mask === void 0) mask = !this._isServer; + this._sender.ping(data || EMPTY_BUFFER, mask, cb); } - } - function onHttp2SocketClose() { - const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); - const client = this[kHTTP2Session][kClient]; - client[kSocket] = null; - client[kHTTPContext] = null; - if (this[kHTTP2Session] !== null) { - this[kHTTP2Session].destroy(err); + /** + * Send a pong. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the pong is sent + * @public + */ + pong(data, mask, cb) { + if (this.readyState === _WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof data === "function") { + cb = data; + data = mask = void 0; + } else if (typeof mask === "function") { + cb = mask; + mask = void 0; + } + if (typeof data === "number") data = data.toString(); + if (this.readyState !== _WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + if (mask === void 0) mask = !this._isServer; + this._sender.pong(data || EMPTY_BUFFER, mask, cb); } - client[kPendingIdx] = client[kRunningIdx]; - assert8(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - client[kResume](); - } - function onHttp2SocketError(err) { - assert8(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - this[kError] = err; - this[kClient][kOnError](err); - } - function onHttp2SocketEnd() { - util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); - } - function onSocketClose() { - this[kClosed] = true; - } - function shouldSendContentLength(method) { - return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; - } - function writeH2(client, request) { - const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]; - const session = client[kHTTP2Session]; - const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request; - let { body } = request; - if (upgrade != null && upgrade !== "websocket") { - util2.errorRequest(client, request, new InvalidArgumentError(`Custom upgrade "${upgrade}" not supported over HTTP/2`)); - return false; + /** + * Resume the socket. + * + * @public + */ + resume() { + if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) { + return; + } + this._paused = false; + if (!this._receiver._writableState.needDrain) this._socket.resume(); } - const headers = {}; - for (let n = 0; n < reqHeaders.length; n += 2) { - const key = reqHeaders[n + 0]; - const val = reqHeaders[n + 1]; - if (key === "cookie") { - if (headers[key] != null) { - headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val]; - } else { - headers[key] = val; - } - continue; + /** + * Send a data message. + * + * @param {*} data The message to send + * @param {Object} [options] Options object + * @param {Boolean} [options.binary] Specifies whether `data` is binary or + * text + * @param {Boolean} [options.compress] Specifies whether or not to compress + * `data` + * @param {Boolean} [options.fin=true] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when data is written out + * @public + */ + send(data, options, cb) { + if (this.readyState === _WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); } - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (headers[key]) { - headers[key] += `, ${val[i]}`; - } else { - headers[key] = val[i]; - } - } - } else if (headers[key]) { - headers[key] += `, ${val}`; - } else { - headers[key] = val; + if (typeof options === "function") { + cb = options; + options = {}; } - } - let stream = null; - const { hostname, port } = client[kUrl]; - headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ""}`; - headers[HTTP2_HEADER_METHOD] = method; - const abort = (err) => { - if (request.aborted || request.completed) { + if (typeof data === "number") data = data.toString(); + if (this.readyState !== _WebSocket.OPEN) { + sendAfterClose(this, data, cb); return; } - err = err || new RequestAbortedError(); - util2.errorRequest(client, request, err); - if (stream != null) { - stream.removeAllListeners("data"); - stream.close(); - client[kOnError](err); - client[kResume](); + const opts = { + binary: typeof data !== "string", + mask: !this._isServer, + compress: true, + fin: true, + ...options + }; + if (!this._extensions[PerMessageDeflate2.extensionName]) { + opts.compress = false; } - util2.destroy(body, err); - }; - try { - request.onRequestStart(abort, null); - } catch (err) { - util2.errorRequest(client, request, err); + this._sender.send(data || EMPTY_BUFFER, opts, cb); } - if (request.aborted) { - return false; + /** + * Forcibly close the connection. + * + * @public + */ + terminate() { + if (this.readyState === _WebSocket.CLOSED) return; + if (this.readyState === _WebSocket.CONNECTING) { + const msg = "WebSocket was closed before the connection was established"; + abortHandshake(this, this._req, msg); + return; + } + if (this._socket) { + this._readyState = _WebSocket.CLOSING; + this._socket.destroy(); + } } - if (upgrade || method === "CONNECT") { - session.ref(); - if (upgrade === "websocket") { - if (session[kEnableConnectProtocol] === false) { - util2.errorRequest(client, request, new InformationalError("HTTP/2: Extended CONNECT protocol not supported by server")); - session.unref(); - return false; - } - headers[HTTP2_HEADER_METHOD] = "CONNECT"; - headers[HTTP2_HEADER_PROTOCOL] = "websocket"; - headers[HTTP2_HEADER_PATH] = path; - if (protocol === "ws:" || protocol === "wss:") { - headers[HTTP2_HEADER_SCHEME] = protocol === "ws:" ? "http" : "https"; - } else { - headers[HTTP2_HEADER_SCHEME] = protocol === "http:" ? "http" : "https"; + }; + Object.defineProperty(WebSocket2, "CONNECTING", { + enumerable: true, + value: readyStates.indexOf("CONNECTING") + }); + Object.defineProperty(WebSocket2.prototype, "CONNECTING", { + enumerable: true, + value: readyStates.indexOf("CONNECTING") + }); + Object.defineProperty(WebSocket2, "OPEN", { + enumerable: true, + value: readyStates.indexOf("OPEN") + }); + Object.defineProperty(WebSocket2.prototype, "OPEN", { + enumerable: true, + value: readyStates.indexOf("OPEN") + }); + Object.defineProperty(WebSocket2, "CLOSING", { + enumerable: true, + value: readyStates.indexOf("CLOSING") + }); + Object.defineProperty(WebSocket2.prototype, "CLOSING", { + enumerable: true, + value: readyStates.indexOf("CLOSING") + }); + Object.defineProperty(WebSocket2, "CLOSED", { + enumerable: true, + value: readyStates.indexOf("CLOSED") + }); + Object.defineProperty(WebSocket2.prototype, "CLOSED", { + enumerable: true, + value: readyStates.indexOf("CLOSED") + }); + [ + "binaryType", + "bufferedAmount", + "extensions", + "isPaused", + "protocol", + "readyState", + "url" + ].forEach((property) => { + Object.defineProperty(WebSocket2.prototype, property, { enumerable: true }); + }); + ["open", "error", "close", "message"].forEach((method) => { + Object.defineProperty(WebSocket2.prototype, `on${method}`, { + enumerable: true, + get() { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) return listener[kListener]; } - stream = session.request(headers, { endStream: false, signal }); - stream[kHTTP2Stream] = true; - stream.once("response", (headers2, _flags) => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; - request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream); - ++session[kOpenStreams]; - client[kQueue][client[kRunningIdx]++] = null; - }); - stream.on("error", () => { - if (stream.rstCode === NGHTTP2_REFUSED_STREAM || stream.rstCode === NGHTTP2_CANCEL) { - abort(new InformationalError(`HTTP/2: "stream error" received - code ${stream.rstCode}`)); + return null; + }, + set(handler) { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) { + this.removeListener(method, listener); + break; } + } + if (typeof handler !== "function") return; + this.addEventListener(method, handler, { + [kForOnEventAttribute]: true }); - stream.once("close", () => { - session[kOpenStreams] -= 1; - if (session[kOpenStreams] === 0) session.unref(); - }); - stream.setTimeout(requestTimeout); - return true; } - stream = session.request(headers, { endStream: false, signal }); - stream[kHTTP2Stream] = true; - stream.on("response", (headers2) => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; - request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream); - ++session[kOpenStreams]; - client[kQueue][client[kRunningIdx]++] = null; - }); - stream.once("close", () => { - session[kOpenStreams] -= 1; - if (session[kOpenStreams] === 0) session.unref(); - }); - stream.setTimeout(requestTimeout); - return true; - } - headers[HTTP2_HEADER_PATH] = path; - headers[HTTP2_HEADER_SCHEME] = protocol === "http:" ? "http" : "https"; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - let contentLength = util2.bodyLength(body); - if (util2.isFormDataLike(body)) { - extractBody ??= require_body().extractBody; - const [bodyStream, contentType] = extractBody(body); - headers["content-type"] = contentType; - body = bodyStream.stream; - contentLength = bodyStream.length; - } - if (contentLength == null) { - contentLength = request.contentLength; - } - if (!expectsPayload) { - contentLength = null; + }); + }); + WebSocket2.prototype.addEventListener = addEventListener; + WebSocket2.prototype.removeEventListener = removeEventListener; + module.exports = WebSocket2; + function initAsClient(websocket, address2, protocols, options) { + const opts = { + allowSynchronousEvents: true, + autoPong: true, + closeTimeout: CLOSE_TIMEOUT, + protocolVersion: protocolVersions[1], + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: true, + followRedirects: false, + maxRedirects: 10, + ...options, + socketPath: void 0, + hostname: void 0, + protocol: void 0, + timeout: void 0, + method: "GET", + host: void 0, + path: void 0, + port: void 0 + }; + websocket._autoPong = opts.autoPong; + websocket._closeTimeout = opts.closeTimeout; + if (!protocolVersions.includes(opts.protocolVersion)) { + throw new RangeError( + `Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(", ")})` + ); } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - util2.errorRequest(client, request, new RequestContentLengthMismatchError()); - return false; + let parsedUrl; + if (address2 instanceof URL2) { + parsedUrl = address2; + } else { + try { + parsedUrl = new URL2(address2); + } catch { + throw new SyntaxError(`Invalid URL: ${address2}`); } - process.emitWarning(new RequestContentLengthMismatchError()); } - if (contentLength != null) { - assert8(body || contentLength === 0, "no body must not have content length"); - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + if (parsedUrl.protocol === "http:") { + parsedUrl.protocol = "ws:"; + } else if (parsedUrl.protocol === "https:") { + parsedUrl.protocol = "wss:"; } - session.ref(); - if (channels.sendHeaders.hasSubscribers) { - let header = ""; - for (const key in headers) { - header += `${key}: ${headers[key]}\r -`; + websocket._url = parsedUrl.href; + const isSecure = parsedUrl.protocol === "wss:"; + const isIpcUrl = parsedUrl.protocol === "ws+unix:"; + let invalidUrlMessage; + if (parsedUrl.protocol !== "ws:" && !isSecure && !isIpcUrl) { + invalidUrlMessage = `The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`; + } else if (isIpcUrl && !parsedUrl.pathname) { + invalidUrlMessage = "The URL's pathname is empty"; + } else if (parsedUrl.hash) { + invalidUrlMessage = "The URL contains a fragment identifier"; + } + if (invalidUrlMessage) { + const err = new SyntaxError(invalidUrlMessage); + if (websocket._redirects === 0) { + throw err; + } else { + emitErrorAndClose(websocket, err); + return; } - channels.sendHeaders.publish({ request, headers: header, socket: session[kSocket] }); } - const shouldEndStream = method === "GET" || method === "HEAD" || body === null; - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = "100-continue"; - stream = session.request(headers, { endStream: shouldEndStream, signal }); - stream[kHTTP2Stream] = true; - stream.once("continue", writeBodyH2); - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal + const defaultPort = isSecure ? 443 : 80; + const key = randomBytes4(16).toString("base64"); + const request = isSecure ? https.request : http2.request; + const protocolSet = /* @__PURE__ */ new Set(); + let perMessageDeflate; + opts.createConnection = opts.createConnection || (isSecure ? tlsConnect : netConnect); + opts.defaultPort = opts.defaultPort || defaultPort; + opts.port = parsedUrl.port || defaultPort; + opts.host = parsedUrl.hostname.startsWith("[") ? parsedUrl.hostname.slice(1, -1) : parsedUrl.hostname; + opts.headers = { + ...opts.headers, + "Sec-WebSocket-Version": opts.protocolVersion, + "Sec-WebSocket-Key": key, + Connection: "Upgrade", + Upgrade: "websocket" + }; + opts.path = parsedUrl.pathname + parsedUrl.search; + opts.timeout = opts.handshakeTimeout; + if (opts.perMessageDeflate) { + perMessageDeflate = new PerMessageDeflate2({ + ...opts.perMessageDeflate, + isServer: false, + maxPayload: opts.maxPayload + }); + opts.headers["Sec-WebSocket-Extensions"] = format({ + [PerMessageDeflate2.extensionName]: perMessageDeflate.offer() }); - stream[kHTTP2Stream] = true; - writeBodyH2(); } - ++session[kOpenStreams]; - stream.setTimeout(requestTimeout); - let responseReceived = false; - stream.once("response", (headers2) => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; - request.onResponseStarted(); - responseReceived = true; - if (request.aborted) { - stream.removeAllListeners("data"); - return; + if (protocols.length) { + for (const protocol of protocols) { + if (typeof protocol !== "string" || !subprotocolRegex.test(protocol) || protocolSet.has(protocol)) { + throw new SyntaxError( + "An invalid or duplicated subprotocol was specified" + ); + } + protocolSet.add(protocol); } - if (request.onResponseStart(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) { - stream.pause(); + opts.headers["Sec-WebSocket-Protocol"] = protocols.join(","); + } + if (opts.origin) { + if (opts.protocolVersion < 13) { + opts.headers["Sec-WebSocket-Origin"] = opts.origin; + } else { + opts.headers.Origin = opts.origin; } - stream.on("data", (chunk) => { - if (request.aborted || request.completed) { - return; + } + if (parsedUrl.username || parsedUrl.password) { + opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; + } + if (isIpcUrl) { + const parts = opts.path.split(":"); + opts.socketPath = parts[0]; + opts.path = parts[1]; + } + let req; + if (opts.followRedirects) { + if (websocket._redirects === 0) { + websocket._originalIpc = isIpcUrl; + websocket._originalSecure = isSecure; + websocket._originalHostOrSocketPath = isIpcUrl ? opts.socketPath : parsedUrl.host; + const headers = options && options.headers; + options = { ...options, headers: {} }; + if (headers) { + for (const [key2, value] of Object.entries(headers)) { + options.headers[key2.toLowerCase()] = value; + } } - if (request.onResponseData(chunk) === false) { - stream.pause(); + } else if (websocket.listenerCount("redirect") === 0) { + const isSameHost = isIpcUrl ? websocket._originalIpc ? opts.socketPath === websocket._originalHostOrSocketPath : false : websocket._originalIpc ? false : parsedUrl.host === websocket._originalHostOrSocketPath; + if (!isSameHost || websocket._originalSecure && !isSecure) { + delete opts.headers.authorization; + delete opts.headers.cookie; + if (!isSameHost) delete opts.headers.host; + opts.auth = void 0; } + } + if (opts.auth && !options.headers.authorization) { + options.headers.authorization = "Basic " + Buffer.from(opts.auth).toString("base64"); + } + req = websocket._req = request(opts); + if (websocket._redirects) { + websocket.emit("redirect", websocket.url, req); + } + } else { + req = websocket._req = request(opts); + } + if (opts.timeout) { + req.on("timeout", () => { + abortHandshake(websocket, req, "Opening handshake has timed out"); }); + } + req.on("error", (err) => { + if (req === null || req[kAborted]) return; + req = websocket._req = null; + emitErrorAndClose(websocket, err); }); - stream.once("end", () => { - stream.removeAllListeners("data"); - if (responseReceived) { - if (!request.aborted && !request.completed) { - request.onResponseEnd({}); + req.on("response", (res) => { + const location = res.headers.location; + const statusCode = res.statusCode; + if (location && opts.followRedirects && statusCode >= 300 && statusCode < 400) { + if (++websocket._redirects > opts.maxRedirects) { + abortHandshake(websocket, req, "Maximum redirects exceeded"); + return; } - client[kQueue][client[kRunningIdx]++] = null; - client[kResume](); - } else { - abort(new InformationalError("HTTP/2: stream half-closed (remote)")); - client[kQueue][client[kRunningIdx]++] = null; - client[kPendingIdx] = client[kRunningIdx]; - client[kResume](); + req.abort(); + let addr; + try { + addr = new URL2(location, address2); + } catch (e7) { + const err = new SyntaxError(`Invalid URL: ${location}`); + emitErrorAndClose(websocket, err); + return; + } + initAsClient(websocket, addr, protocols, options); + } else if (!websocket.emit("unexpected-response", req, res)) { + abortHandshake( + websocket, + req, + `Unexpected server response: ${res.statusCode}` + ); } }); - stream.once("close", () => { - stream.removeAllListeners("data"); - session[kOpenStreams] -= 1; - if (session[kOpenStreams] === 0) { - session.unref(); + req.on("upgrade", (res, socket, head) => { + websocket.emit("upgrade", res); + if (websocket.readyState !== WebSocket2.CONNECTING) return; + req = websocket._req = null; + const upgrade = res.headers.upgrade; + if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") { + abortHandshake(websocket, socket, "Invalid Upgrade header"); + return; } - }); - stream.once("error", function(err) { - stream.removeAllListeners("data"); - abort(err); - }); - stream.once("frameError", (type, code) => { - stream.removeAllListeners("data"); - abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); - }); - stream.on("aborted", () => { - stream.removeAllListeners("data"); - }); - stream.on("timeout", () => { - const err = new InformationalError(`HTTP/2: "stream timeout after ${requestTimeout}"`); - stream.removeAllListeners("data"); - session[kOpenStreams] -= 1; - if (session[kOpenStreams] === 0) { - session.unref(); + const digest = createHash4("sha1").update(key + GUID).digest("base64"); + if (res.headers["sec-websocket-accept"] !== digest) { + abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header"); + return; } - abort(err); - }); - stream.once("trailers", (trailers) => { - if (request.aborted || request.completed) { + const serverProt = res.headers["sec-websocket-protocol"]; + let protError; + if (serverProt !== void 0) { + if (!protocolSet.size) { + protError = "Server sent a subprotocol but none was requested"; + } else if (!protocolSet.has(serverProt)) { + protError = "Server sent an invalid subprotocol"; + } + } else if (protocolSet.size) { + protError = "Server sent no subprotocol"; + } + if (protError) { + abortHandshake(websocket, socket, protError); return; } - request.onResponseEnd(trailers); - }); - return true; - function writeBodyH2() { - if (!body || contentLength === 0) { - writeBuffer( - abort, - stream, - null, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ); - } else if (util2.isBuffer(body)) { - writeBuffer( - abort, - stream, - body, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ); - } else if (util2.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable( - abort, - stream, - body.stream(), - client, - request, - client[kSocket], - contentLength, - expectsPayload - ); - } else { - writeBlob( - abort, - stream, - body, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ); + if (serverProt) websocket._protocol = serverProt; + const secWebSocketExtensions = res.headers["sec-websocket-extensions"]; + if (secWebSocketExtensions !== void 0) { + if (!perMessageDeflate) { + const message = "Server sent a Sec-WebSocket-Extensions header but no extension was requested"; + abortHandshake(websocket, socket, message); + return; } - } else if (util2.isStream(body)) { - writeStream( - abort, - client[kSocket], - expectsPayload, - stream, - body, - client, - request, - contentLength - ); - } else if (util2.isIterable(body)) { - writeIterable( - abort, - stream, - body, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ); - } else { - assert8(false); + let extensions; + try { + extensions = parse(secWebSocketExtensions); + } catch (err) { + const message = "Invalid Sec-WebSocket-Extensions header"; + abortHandshake(websocket, socket, message); + return; + } + const extensionNames = Object.keys(extensions); + if (extensionNames.length !== 1 || extensionNames[0] !== PerMessageDeflate2.extensionName) { + const message = "Server indicated an extension that was not requested"; + abortHandshake(websocket, socket, message); + return; + } + try { + perMessageDeflate.accept(extensions[PerMessageDeflate2.extensionName]); + } catch (err) { + const message = "Invalid Sec-WebSocket-Extensions header"; + abortHandshake(websocket, socket, message); + return; + } + websocket._extensions[PerMessageDeflate2.extensionName] = perMessageDeflate; } + websocket.setSocket(socket, head, { + allowSynchronousEvents: opts.allowSynchronousEvents, + generateMask: opts.generateMask, + maxPayload: opts.maxPayload, + skipUTF8Validation: opts.skipUTF8Validation + }); + }); + if (opts.finishRequest) { + opts.finishRequest(req, websocket); + } else { + req.end(); } } - function writeBuffer(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { - try { - if (body != null && util2.isBuffer(body)) { - assert8(contentLength === body.byteLength, "buffer body must have content length"); - h2stream.cork(); - h2stream.write(body); - h2stream.uncork(); - h2stream.end(); - request.onBodySent(body); - } - if (!expectsPayload) { - socket[kReset] = true; - } - request.onRequestSent(); - client[kResume](); - } catch (error) { - abort(error); + function emitErrorAndClose(websocket, err) { + websocket._readyState = WebSocket2.CLOSING; + websocket._errorEmitted = true; + websocket.emit("error", err); + websocket.emitClose(); + } + function netConnect(options) { + options.path = options.socketPath; + return net.connect(options); + } + function tlsConnect(options) { + options.path = void 0; + if (!options.servername && options.servername !== "") { + options.servername = net.isIP(options.host) ? "" : options.host; } + return tls.connect(options); } - function writeStream(abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { - assert8(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); - const pipe2 = pipeline( - body, - h2stream, - (err) => { - if (err) { - util2.destroy(pipe2, err); - abort(err); - } else { - util2.removeAllListeners(pipe2); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - client[kResume](); - } + function abortHandshake(websocket, stream, message) { + websocket._readyState = WebSocket2.CLOSING; + const err = new Error(message); + Error.captureStackTrace(err, abortHandshake); + if (stream.setHeader) { + stream[kAborted] = true; + stream.abort(); + if (stream.socket && !stream.socket.destroyed) { + stream.socket.destroy(); } + process.nextTick(emitErrorAndClose, websocket, err); + } else { + stream.destroy(err); + stream.once("error", websocket.emit.bind(websocket, "error")); + stream.once("close", websocket.emitClose.bind(websocket)); + } + } + function sendAfterClose(websocket, data, cb) { + if (data) { + const length = isBlob(data) ? data.size : toBuffer(data).length; + if (websocket._socket) websocket._sender._bufferedBytes += length; + else websocket._bufferedAmount += length; + } + if (cb) { + const err = new Error( + `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})` + ); + process.nextTick(cb, err); + } + } + function receiverOnConclude(code, reason) { + const websocket = this[kWebSocket]; + websocket._closeFrameReceived = true; + websocket._closeMessage = reason; + websocket._closeCode = code; + if (websocket._socket[kWebSocket] === void 0) return; + websocket._socket.removeListener("data", socketOnData); + process.nextTick(resume, websocket._socket); + if (code === 1005) websocket.close(); + else websocket.close(code, reason); + } + function receiverOnDrain() { + const websocket = this[kWebSocket]; + if (!websocket.isPaused) websocket._socket.resume(); + } + function receiverOnError(err) { + const websocket = this[kWebSocket]; + if (websocket._socket[kWebSocket] !== void 0) { + websocket._socket.removeListener("data", socketOnData); + process.nextTick(resume, websocket._socket); + websocket.close(err[kStatusCode]); + } + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit("error", err); + } + } + function receiverOnFinish() { + this[kWebSocket].emitClose(); + } + function receiverOnMessage(data, isBinary) { + this[kWebSocket].emit("message", data, isBinary); + } + function receiverOnPing(data) { + const websocket = this[kWebSocket]; + if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP); + websocket.emit("ping", data); + } + function receiverOnPong(data) { + this[kWebSocket].emit("pong", data); + } + function resume(stream) { + stream.resume(); + } + function senderOnError(err) { + const websocket = this[kWebSocket]; + if (websocket.readyState === WebSocket2.CLOSED) return; + if (websocket.readyState === WebSocket2.OPEN) { + websocket._readyState = WebSocket2.CLOSING; + setCloseTimer(websocket); + } + this._socket.end(); + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit("error", err); + } + } + function setCloseTimer(websocket) { + websocket._closeTimer = setTimeout( + websocket._socket.destroy.bind(websocket._socket), + websocket._closeTimeout ); - util2.addListener(pipe2, "data", onPipeData); - function onPipeData(chunk) { - request.onBodySent(chunk); + } + function socketOnClose() { + const websocket = this[kWebSocket]; + this.removeListener("close", socketOnClose); + this.removeListener("data", socketOnData); + this.removeListener("end", socketOnEnd); + websocket._readyState = WebSocket2.CLOSING; + if (!this._readableState.endEmitted && !websocket._closeFrameReceived && !websocket._receiver._writableState.errorEmitted && this._readableState.length !== 0) { + const chunk = this.read(this._readableState.length); + websocket._receiver.write(chunk); + } + websocket._receiver.end(); + this[kWebSocket] = void 0; + clearTimeout(websocket._closeTimer); + if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) { + websocket.emitClose(); + } else { + websocket._receiver.on("error", receiverOnFinish); + websocket._receiver.on("finish", receiverOnFinish); } } - async function writeBlob(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { - assert8(contentLength === body.size, "blob body must have content length"); - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError(); - } - const buffer2 = Buffer.from(await body.arrayBuffer()); - h2stream.cork(); - h2stream.write(buffer2); - h2stream.uncork(); - h2stream.end(); - request.onBodySent(buffer2); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - client[kResume](); - } catch (err) { - abort(err); + function socketOnData(chunk) { + if (!this[kWebSocket]._receiver.write(chunk)) { + this.pause(); } } - async function writeIterable(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { - assert8(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); - let callback = null; - function onDrain() { - if (callback) { - const cb = callback; - callback = null; - cb(); - } + function socketOnEnd() { + const websocket = this[kWebSocket]; + websocket._readyState = WebSocket2.CLOSING; + websocket._receiver.end(); + this.end(); + } + function socketOnError() { + const websocket = this[kWebSocket]; + this.removeListener("error", socketOnError); + this.on("error", NOOP); + if (websocket) { + websocket._readyState = WebSocket2.CLOSING; + this.destroy(); } - const waitForDrain = () => new Promise((resolve, reject) => { - assert8(callback === null); - if (socket[kError]) { - reject(socket[kError]); + } + } +}); + +// node_modules/ws/lib/stream.js +var require_stream = __commonJS({ + "node_modules/ws/lib/stream.js"(exports, module) { + "use strict"; + var WebSocket2 = require_websocket(); + var { Duplex } = __require("stream"); + function emitClose(stream) { + stream.emit("close"); + } + function duplexOnEnd() { + if (!this.destroyed && this._writableState.finished) { + this.destroy(); + } + } + function duplexOnError(err) { + this.removeListener("error", duplexOnError); + this.destroy(); + if (this.listenerCount("error") === 0) { + this.emit("error", err); + } + } + function createWebSocketStream2(ws, options) { + let terminateOnDestroy = true; + const duplex = new Duplex({ + ...options, + autoDestroy: false, + emitClose: false, + objectMode: false, + writableObjectMode: false + }); + ws.on("message", function message(msg, isBinary) { + const data = !isBinary && duplex._readableState.objectMode ? msg.toString() : msg; + if (!duplex.push(data)) ws.pause(); + }); + ws.once("error", function error(err) { + if (duplex.destroyed) return; + terminateOnDestroy = false; + duplex.destroy(err); + }); + ws.once("close", function close() { + if (duplex.destroyed) return; + duplex.push(null); + }); + duplex._destroy = function(err, callback) { + if (ws.readyState === ws.CLOSED) { + callback(err); + process.nextTick(emitClose, duplex); + return; + } + let called = false; + ws.once("error", function error(err2) { + called = true; + callback(err2); + }); + ws.once("close", function close() { + if (!called) callback(err); + process.nextTick(emitClose, duplex); + }); + if (terminateOnDestroy) ws.terminate(); + }; + duplex._final = function(callback) { + if (ws.readyState === ws.CONNECTING) { + ws.once("open", function open2() { + duplex._final(callback); + }); + return; + } + if (ws._socket === null) return; + if (ws._socket._writableState.finished) { + callback(); + if (duplex._readableState.endEmitted) duplex.destroy(); } else { - callback = resolve; + ws._socket.once("finish", function finish() { + callback(); + }); + ws.close(); } - }); - h2stream.on("close", onDrain).on("drain", onDrain); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; + }; + duplex._read = function() { + if (ws.isPaused) ws.resume(); + }; + duplex._write = function(chunk, encoding, callback) { + if (ws.readyState === ws.CONNECTING) { + ws.once("open", function open2() { + duplex._write(chunk, encoding, callback); + }); + return; + } + ws.send(chunk, callback); + }; + duplex.on("end", duplexOnEnd); + duplex.on("error", duplexOnError); + return duplex; + } + module.exports = createWebSocketStream2; + } +}); + +// node_modules/ws/lib/subprotocol.js +var require_subprotocol = __commonJS({ + "node_modules/ws/lib/subprotocol.js"(exports, module) { + "use strict"; + var { tokenChars } = require_validation(); + function parse(header) { + const protocols = /* @__PURE__ */ new Set(); + let start = -1; + let end = -1; + let i = 0; + for (i; i < header.length; i++) { + const code = header.charCodeAt(i); + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (i !== 0 && (code === 32 || code === 9)) { + if (end === -1 && start !== -1) end = i; + } else if (code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); } - const res = h2stream.write(chunk); - request.onBodySent(chunk); - if (!res) { - await waitForDrain(); + if (end === -1) end = i; + const protocol2 = header.slice(start, end); + if (protocols.has(protocol2)) { + throw new SyntaxError(`The "${protocol2}" subprotocol is duplicated`); } + protocols.add(protocol2); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); } - h2stream.end(); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - client[kResume](); - } catch (err) { - abort(err); - } finally { - h2stream.off("close", onDrain).off("drain", onDrain); } + if (start === -1 || end !== -1) { + throw new SyntaxError("Unexpected end of input"); + } + const protocol = header.slice(start, i); + if (protocols.has(protocol)) { + throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`); + } + protocols.add(protocol); + return protocols; } - module.exports = connectH2; + module.exports = { parse }; } }); -// node_modules/undici/lib/dispatcher/client.js -var require_client = __commonJS({ - "node_modules/undici/lib/dispatcher/client.js"(exports, module) { +// node_modules/ws/lib/websocket-server.js +var require_websocket_server = __commonJS({ + "node_modules/ws/lib/websocket-server.js"(exports, module) { "use strict"; - var assert8 = __require("assert"); - var net = __require("net"); + var EventEmitter = __require("events"); var http2 = __require("http"); - var util2 = require_util(); - var { ClientStats } = require_stats(); - var { channels } = require_diagnostics(); - var Request2 = require_request(); - var DispatcherBase = require_dispatcher_base(); - var { - InvalidArgumentError, - InformationalError, - ClientDestroyedError - } = require_errors(); - var buildConnector = require_connect(); - var { - kUrl, - kServerName, - kClient, - kBusy, - kConnect, - kResuming, - kRunning, - kPending, - kSize, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kLocalAddress, - kMaxResponseSize, - kOnError, - kHTTPContext, - kMaxConcurrentStreams, - kHTTP2InitialWindowSize, - kHTTP2ConnectionWindowSize, - kResume, - kPingInterval - } = require_symbols(); - var connectH1 = require_client_h1(); - var connectH2 = require_client_h2(); - var kClosedResolve = /* @__PURE__ */ Symbol("kClosedResolve"); - var getDefaultNodeMaxHeaderSize = http2 && http2.maxHeaderSize && Number.isInteger(http2.maxHeaderSize) && http2.maxHeaderSize > 0 ? () => http2.maxHeaderSize : () => { - throw new InvalidArgumentError("http module not available or http.maxHeaderSize invalid"); - }; - var noop = () => { - }; - function getPipelining(client) { - return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; - } - var Client = class extends DispatcherBase { + var { Duplex } = __require("stream"); + var { createHash: createHash4 } = __require("crypto"); + var extension2 = require_extension(); + var PerMessageDeflate2 = require_permessage_deflate(); + var subprotocol2 = require_subprotocol(); + var WebSocket2 = require_websocket(); + var { CLOSE_TIMEOUT, GUID, kWebSocket } = require_constants(); + var keyRegex = /^[+/0-9A-Za-z]{22}==$/; + var RUNNING = 0; + var CLOSING = 1; + var CLOSED = 2; + var WebSocketServer2 = class extends EventEmitter { /** + * Create a `WebSocketServer` instance. * - * @param {string|URL} url - * @param {import('../../types/client.js').Client.Options} options + * @param {Object} options Configuration options + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Boolean} [options.autoPong=true] Specifies whether or not to + * automatically send a pong in response to a ping + * @param {Number} [options.backlog=511] The maximum length of the queue of + * pending connections + * @param {Boolean} [options.clientTracking=true] Specifies whether or not to + * track clients + * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to + * wait for the closing handshake to finish after `websocket.close()` is + * called + * @param {Function} [options.handleProtocols] A hook to handle protocols + * @param {String} [options.host] The hostname where to bind the server + * @param {Number} [options.maxPayload=104857600] The maximum allowed message + * size + * @param {Boolean} [options.noServer=false] Enable no server mode + * @param {String} [options.path] Accept only connections matching this path + * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable + * permessage-deflate + * @param {Number} [options.port] The port where to bind the server + * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S + * server to use + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @param {Function} [options.verifyClient] A hook to reject connections + * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket` + * class to use. It must be the `WebSocket` class or class that extends it + * @param {Function} [callback] A listener for the `listening` event */ - constructor(url, { - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - connect: connect2, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - maxConcurrentStreams, - allowH2, - useH2c, - initialWindowSize, - connectionWindowSize, - pingInterval, - webSocket - } = {}) { - if (keepAlive !== void 0) { - throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + constructor(options, callback) { + super(); + options = { + allowSynchronousEvents: true, + autoPong: true, + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: false, + handleProtocols: null, + clientTracking: true, + closeTimeout: CLOSE_TIMEOUT, + verifyClient: null, + noServer: false, + backlog: null, + // use default (511 as implemented in net.js) + server: null, + host: null, + path: null, + port: null, + WebSocket: WebSocket2, + ...options + }; + if (options.port == null && !options.server && !options.noServer || options.port != null && (options.server || options.noServer) || options.server && options.noServer) { + throw new TypeError( + 'One and only one of the "port", "server", or "noServer" options must be specified' + ); } - if (socketTimeout !== void 0) { - throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + if (options.port != null) { + this._server = http2.createServer((req, res) => { + const body = http2.STATUS_CODES[426]; + res.writeHead(426, { + "Content-Length": body.length, + "Content-Type": "text/plain" + }); + res.end(body); + }); + this._server.listen( + options.port, + options.host, + options.backlog, + callback + ); + } else if (options.server) { + this._server = options.server; } - if (requestTimeout !== void 0) { - throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + if (this._server) { + const emitConnection = this.emit.bind(this, "connection"); + this._removeListeners = addListeners(this._server, { + listening: this.emit.bind(this, "listening"), + error: this.emit.bind(this, "error"), + upgrade: (req, socket, head) => { + this.handleUpgrade(req, socket, head, emitConnection); + } + }); } - if (idleTimeout !== void 0) { - throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + if (options.perMessageDeflate === true) options.perMessageDeflate = {}; + if (options.clientTracking) { + this.clients = /* @__PURE__ */ new Set(); + this._shouldEmitClose = false; } - if (maxKeepAliveTimeout !== void 0) { - throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + this.options = options; + this._state = RUNNING; + } + /** + * Returns the bound address, the address family name, and port of the server + * as reported by the operating system if listening on an IP socket. + * If the server is listening on a pipe or UNIX domain socket, the name is + * returned as a string. + * + * @return {(Object|String|null)} The address of the server + * @public + */ + address() { + if (this.options.noServer) { + throw new Error('The server is operating in "noServer" mode'); } - if (maxHeaderSize != null) { - if (!Number.isInteger(maxHeaderSize) || maxHeaderSize < 1) { - throw new InvalidArgumentError("invalid maxHeaderSize"); + if (!this._server) return null; + return this._server.address(); + } + /** + * Stop the server from accepting new connections and emit the `'close'` event + * when all existing connections are closed. + * + * @param {Function} [cb] A one-time listener for the `'close'` event + * @public + */ + close(cb) { + if (this._state === CLOSED) { + if (cb) { + this.once("close", () => { + cb(new Error("The server is not running")); + }); } - } else { - maxHeaderSize = getDefaultNodeMaxHeaderSize(); - } - if (socketPath != null && typeof socketPath !== "string") { - throw new InvalidArgumentError("invalid socketPath"); - } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError("invalid connectTimeout"); - } - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveTimeout"); - } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); - } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); - } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); - } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); - } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); - } - if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError("localAddress must be valid string IP address"); - } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError("maxResponseSize must be a positive number"); - } - if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { - throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); - } - if (allowH2 != null && typeof allowH2 !== "boolean") { - throw new InvalidArgumentError("allowH2 must be a valid boolean value"); - } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); - } - if (useH2c != null && typeof useH2c !== "boolean") { - throw new InvalidArgumentError("useH2c must be a valid boolean value"); - } - if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) { - throw new InvalidArgumentError("initialWindowSize must be a positive integer, greater than 0"); - } - if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) { - throw new InvalidArgumentError("connectionWindowSize must be a positive integer, greater than 0"); - } - if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) { - throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0"); + process.nextTick(emitClose, this); + return; } - super({ webSocket }); - if (typeof connect2 !== "function") { - connect2 = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - useH2c, - socketPath, - timeout: connectTimeout, - ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect2 - }); + if (cb) this.once("close", cb); + if (this._state === CLOSING) return; + this._state = CLOSING; + if (this.options.noServer || this.options.server) { + if (this._server) { + this._removeListeners(); + this._removeListeners = this._server = null; + } + if (this.clients) { + if (!this.clients.size) { + process.nextTick(emitClose, this); + } else { + this._shouldEmitClose = true; + } + } else { + process.nextTick(emitClose, this); + } } else { - const customConnect = connect2; - connect2 = (opts, callback) => customConnect({ - ...opts, - ...socketPath != null ? { socketPath } : null, - ...allowH2 != null ? { allowH2 } : null - }, callback); + const server = this._server; + this._removeListeners(); + this._removeListeners = this._server = null; + server.close(() => { + emitClose(this); + }); } - this[kUrl] = util2.parseOrigin(url); - this[kConnector] = connect2; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; - this[kNeedDrain] = 0; - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r -`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPContext] = null; - this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; - this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144; - this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288; - this[kPingInterval] = pingInterval != null ? pingInterval : 6e4; - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; - this[kResume] = (sync) => resume(this, sync); - this[kOnError] = (err) => onError(this, err); } - get pipelining() { - return this[kPipelining]; - } - set pipelining(value) { - this[kPipelining] = value; - this[kResume](true); - } - get stats() { - return new ClientStats(this); - } - get [kPending]() { - return this[kQueue].length - this[kPendingIdx]; - } - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx]; - } - get [kSize]() { - return this[kQueue].length - this[kRunningIdx]; - } - get [kConnected]() { - return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed; - } - get [kBusy]() { - return Boolean( - this[kHTTPContext]?.busy(null) || this[kSize] >= (getPipelining(this) || 1) || this[kPending] > 0 - ); - } - [kConnect](cb) { - connect(this); - this.once("connect", cb); + /** + * See if a given request should be handled by this server instance. + * + * @param {http.IncomingMessage} req Request object to inspect + * @return {Boolean} `true` if the request is valid, else `false` + * @public + */ + shouldHandle(req) { + if (this.options.path) { + const index2 = req.url.indexOf("?"); + const pathname = index2 !== -1 ? req.url.slice(0, index2) : req.url; + if (pathname !== this.options.path) return false; + } + return true; } - [kDispatch](opts, handler) { - const request = new Request2(this[kUrl].origin, opts, handler); - this[kQueue].push(request); - if (this[kResuming]) { - } else if (util2.bodyLength(request.body) == null && util2.isIterable(request.body)) { - this[kResuming] = 1; - queueMicrotask(() => resume(this)); - } else { - this[kResume](true); + /** + * Handle a HTTP Upgrade request. + * + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @public + */ + handleUpgrade(req, socket, head, cb) { + socket.on("error", socketOnError); + const key = req.headers["sec-websocket-key"]; + const upgrade = req.headers.upgrade; + const version4 = +req.headers["sec-websocket-version"]; + if (req.method !== "GET") { + const message = "Invalid HTTP method"; + abortHandshakeOrEmitwsClientError(this, req, socket, 405, message); + return; } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; + if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") { + const message = "Invalid Upgrade header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; } - return this[kNeedDrain] < 2; - } - [kClose]() { - return new Promise((resolve) => { - if (this[kSize]) { - this[kClosedResolve] = resolve; - } else { - resolve(null); - } - }); - } - [kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - util2.errorRequest(this, request, err); + if (key === void 0 || !keyRegex.test(key)) { + const message = "Missing or invalid Sec-WebSocket-Key header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + if (version4 !== 13 && version4 !== 8) { + const message = "Missing or invalid Sec-WebSocket-Version header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, { + "Sec-WebSocket-Version": "13, 8" + }); + return; + } + if (!this.shouldHandle(req)) { + abortHandshake(socket, 400); + return; + } + const secWebSocketProtocol = req.headers["sec-websocket-protocol"]; + let protocols = /* @__PURE__ */ new Set(); + if (secWebSocketProtocol !== void 0) { + try { + protocols = subprotocol2.parse(secWebSocketProtocol); + } catch (err) { + const message = "Invalid Sec-WebSocket-Protocol header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; } - const callback = () => { - if (this[kClosedResolve]) { - this[kClosedResolve](); - this[kClosedResolve] = null; + } + const secWebSocketExtensions = req.headers["sec-websocket-extensions"]; + const extensions = {}; + if (this.options.perMessageDeflate && secWebSocketExtensions !== void 0) { + const perMessageDeflate = new PerMessageDeflate2({ + ...this.options.perMessageDeflate, + isServer: true, + maxPayload: this.options.maxPayload + }); + try { + const offers = extension2.parse(secWebSocketExtensions); + if (offers[PerMessageDeflate2.extensionName]) { + perMessageDeflate.accept(offers[PerMessageDeflate2.extensionName]); + extensions[PerMessageDeflate2.extensionName] = perMessageDeflate; } - resolve(null); + } catch (err) { + const message = "Invalid or unacceptable Sec-WebSocket-Extensions header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + } + if (this.options.verifyClient) { + const info = { + origin: req.headers[`${version4 === 8 ? "sec-websocket-origin" : "origin"}`], + secure: !!(req.socket.authorized || req.socket.encrypted), + req }; - if (this[kHTTPContext]) { - this[kHTTPContext].destroy(err, callback); - this[kHTTPContext] = null; - } else { - queueMicrotask(callback); + if (this.options.verifyClient.length === 2) { + this.options.verifyClient(info, (verified, code, message, headers) => { + if (!verified) { + return abortHandshake(socket, code || 401, message, headers); + } + this.completeUpgrade( + extensions, + key, + protocols, + req, + socket, + head, + cb + ); + }); + return; } - this[kResume](); + if (!this.options.verifyClient(info)) return abortHandshake(socket, 401); + } + this.completeUpgrade(extensions, key, protocols, req, socket, head, cb); + } + /** + * Upgrade the connection to WebSocket. + * + * @param {Object} extensions The accepted extensions + * @param {String} key The value of the `Sec-WebSocket-Key` header + * @param {Set} protocols The subprotocols + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @throws {Error} If called more than once with the same socket + * @private + */ + completeUpgrade(extensions, key, protocols, req, socket, head, cb) { + if (!socket.readable || !socket.writable) return socket.destroy(); + if (socket[kWebSocket]) { + throw new Error( + "server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration" + ); + } + if (this._state > RUNNING) return abortHandshake(socket, 503); + const digest = createHash4("sha1").update(key + GUID).digest("base64"); + const headers = [ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + `Sec-WebSocket-Accept: ${digest}` + ]; + const ws = new this.options.WebSocket(null, void 0, this.options); + if (protocols.size) { + const protocol = this.options.handleProtocols ? this.options.handleProtocols(protocols, req) : protocols.values().next().value; + if (protocol) { + headers.push(`Sec-WebSocket-Protocol: ${protocol}`); + ws._protocol = protocol; + } + } + if (extensions[PerMessageDeflate2.extensionName]) { + const params = extensions[PerMessageDeflate2.extensionName].params; + const value = extension2.format({ + [PerMessageDeflate2.extensionName]: [params] + }); + headers.push(`Sec-WebSocket-Extensions: ${value}`); + ws._extensions = extensions; + } + this.emit("headers", headers, req); + socket.write(headers.concat("\r\n").join("\r\n")); + socket.removeListener("error", socketOnError); + ws.setSocket(socket, head, { + allowSynchronousEvents: this.options.allowSynchronousEvents, + maxPayload: this.options.maxPayload, + skipUTF8Validation: this.options.skipUTF8Validation }); + if (this.clients) { + this.clients.add(ws); + ws.on("close", () => { + this.clients.delete(ws); + if (this._shouldEmitClose && !this.clients.size) { + process.nextTick(emitClose, this); + } + }); + } + cb(ws, req); } }; - function onError(client, err) { - if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { - assert8(client[kPendingIdx] === client[kRunningIdx]); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - util2.errorRequest(client, request, err); + module.exports = WebSocketServer2; + function addListeners(server, map) { + for (const event of Object.keys(map)) server.on(event, map[event]); + return function removeListeners() { + for (const event of Object.keys(map)) { + server.removeListener(event, map[event]); } - assert8(client[kSize] === 0); - } + }; } - function connect(client) { - assert8(!client[kConnecting]); - assert8(!client[kHTTPContext]); - let { host, hostname, protocol, port } = client[kUrl]; - if (hostname[0] === "[") { - const idx = hostname.indexOf("]"); - assert8(idx !== -1); - const ip = hostname.substring(1, idx); - assert8(net.isIPv6(ip)); - hostname = ip; - } - client[kConnecting] = true; - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPContext]?.version, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }); + function emitClose(server) { + server._state = CLOSED; + server.emit("close"); + } + function socketOnError() { + this.destroy(); + } + function abortHandshake(socket, code, message, headers) { + message = message || http2.STATUS_CODES[code]; + headers = { + Connection: "close", + "Content-Type": "text/html", + "Content-Length": Buffer.byteLength(message), + ...headers + }; + socket.once("finish", socket.destroy); + socket.end( + `HTTP/1.1 ${code} ${http2.STATUS_CODES[code]}\r +` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join("\r\n") + "\r\n\r\n" + message + ); + } + function abortHandshakeOrEmitwsClientError(server, req, socket, code, message, headers) { + if (server.listenerCount("wsClientError")) { + const err = new Error(message); + Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError); + server.emit("wsClientError", err, socket, req); + } else { + abortHandshake(socket, code, message, headers); } - try { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket) => { - if (err) { - handleConnectError(client, err, { host, hostname, protocol, port }); - client[kResume](); - return; - } - if (client.destroyed) { - util2.destroy(socket.on("error", noop), new ClientDestroyedError()); - client[kResume](); - return; - } - assert8(socket); - try { - client[kHTTPContext] = socket.alpnProtocol === "h2" ? connectH2(client, socket) : connectH1(client, socket); - } catch (err2) { - socket.destroy().on("error", noop); - handleConnectError(client, err2, { host, hostname, protocol, port }); - client[kResume](); - return; - } - client[kConnecting] = false; - socket[kCounter] = 0; - socket[kMaxRequests] = client[kMaxRequests]; - socket[kClient] = client; - socket[kError] = null; - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPContext]?.version, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }); + } + } +}); + +// node_modules/ws/wrapper.mjs +var import_stream, import_extension, import_permessage_deflate, import_receiver, import_sender, import_subprotocol, import_websocket, import_websocket_server, wrapper_default; +var init_wrapper = __esm({ + "node_modules/ws/wrapper.mjs"() { + "use strict"; + import_stream = __toESM(require_stream(), 1); + import_extension = __toESM(require_extension(), 1); + import_permessage_deflate = __toESM(require_permessage_deflate(), 1); + import_receiver = __toESM(require_receiver(), 1); + import_sender = __toESM(require_sender(), 1); + import_subprotocol = __toESM(require_subprotocol(), 1); + import_websocket = __toESM(require_websocket(), 1); + import_websocket_server = __toESM(require_websocket_server(), 1); + wrapper_default = import_websocket.default; + } +}); + +// node_modules/@solana/rpc-subscriptions-channel-websocket/dist/index.node.mjs +import { setMaxListeners as setMaxListeners4 } from "events"; +function createWebSocketChannel({ + sendBufferHighWatermark, + signal, + url +}) { + if (signal.aborted) { + return Promise.reject(signal.reason); + } + let bufferDrainWatcher; + let hasConnected = false; + const listenerRemovers = /* @__PURE__ */ new Set(); + function cleanupListeners() { + listenerRemovers.forEach((r) => { + r(); + }); + listenerRemovers.clear(); + } + function handleAbort() { + cleanupListeners(); + if (!hasConnected) { + rejectOpen(signal.reason); + } + if (webSocket.readyState !== l.CLOSED && webSocket.readyState !== l.CLOSING) { + webSocket.close(NORMAL_CLOSURE_CODE); + } + } + function handleClose(ev) { + cleanupListeners(); + bufferDrainWatcher?.onCancel(); + signal.removeEventListener("abort", handleAbort); + webSocket.removeEventListener("close", handleClose); + webSocket.removeEventListener("error", handleError); + webSocket.removeEventListener("message", handleMessage); + webSocket.removeEventListener("open", handleOpen); + if (!signal.aborted && !(ev.wasClean && ev.code === NORMAL_CLOSURE_CODE)) { + eventTarget.dispatchEvent( + new CustomEvent("error", { + detail: new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, { + cause: ev + }) + }) + ); + } + } + function handleError(ev) { + if (signal.aborted) { + return; + } + if (!hasConnected) { + const failedToConnectError = new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, { + errorEvent: ev + }); + rejectOpen(failedToConnectError); + eventTarget.dispatchEvent( + new CustomEvent("error", { + detail: failedToConnectError + }) + ); + } + } + function handleMessage(ev) { + if (signal.aborted) { + return; + } + eventTarget.dispatchEvent(new CustomEvent("message", { detail: ev.data })); + } + const eventTarget = new s2(); + const dataPublisher = getDataPublisherFromEventEmitter(eventTarget); + function handleOpen() { + hasConnected = true; + resolveOpen({ + ...dataPublisher, + async send(message) { + if (webSocket.readyState !== l.OPEN) { + throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED); + } + if (!bufferDrainWatcher && webSocket.bufferedAmount > sendBufferHighWatermark) { + let onCancel; + const promise = new Promise((resolve, reject) => { + const intervalId = setInterval(() => { + if (webSocket.readyState !== l.OPEN || !(webSocket.bufferedAmount > sendBufferHighWatermark)) { + clearInterval(intervalId); + bufferDrainWatcher = void 0; + resolve(); + } + }, 16); + onCancel = () => { + bufferDrainWatcher = void 0; + clearInterval(intervalId); + reject( + new SolanaError( + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED + ) + ); + }; + }); + bufferDrainWatcher = { + onCancel, + promise + }; + } + if (bufferDrainWatcher) { + if (ArrayBuffer.isView(message) && !(message instanceof DataView)) { + const TypedArrayConstructor = message.constructor; + message = new TypedArrayConstructor(message); } - client.emit("connect", client[kUrl], [client]); - client[kResume](); - }); - } catch (err) { - handleConnectError(client, err, { host, hostname, protocol, port }); - client[kResume](); + await bufferDrainWatcher.promise; + } + webSocket.send(message); } - } - function handleConnectError(client, err, { host, hostname, protocol, port }) { - if (client.destroyed) { - return; + }); + } + const webSocket = new l(url); + signal.addEventListener("abort", handleAbort); + webSocket.addEventListener("close", handleClose); + webSocket.addEventListener("error", handleError); + webSocket.addEventListener("message", handleMessage); + webSocket.addEventListener("open", handleOpen); + let rejectOpen; + let resolveOpen; + return new Promise((resolve, reject) => { + rejectOpen = reject; + resolveOpen = resolve; + }); +} +var s2, l, NORMAL_CLOSURE_CODE; +var init_index_node33 = __esm({ + "node_modules/@solana/rpc-subscriptions-channel-websocket/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node30(); + init_wrapper(); + s2 = class extends globalThis.EventTarget { + constructor(...t) { + super(...t), setMaxListeners4(Number.MAX_SAFE_INTEGER, this); } - client[kConnecting] = false; - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPContext]?.version, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }); + }; + l = globalThis.WebSocket ? globalThis.WebSocket : wrapper_default; + NORMAL_CLOSURE_CODE = 1e3; + } +}); + +// node_modules/@solana/rpc-subscriptions/dist/index.node.mjs +import { setMaxListeners as setMaxListeners5 } from "events"; +function createSolanaJsonRpcIntegerOverflowError2(methodName, keyPath, value) { + let argumentLabel = ""; + if (typeof keyPath[0] === "number") { + const argPosition = keyPath[0] + 1; + const lastDigit = argPosition % 10; + const lastTwoDigits = argPosition % 100; + if (lastDigit == 1 && lastTwoDigits != 11) { + argumentLabel = argPosition + "st"; + } else if (lastDigit == 2 && lastTwoDigits != 12) { + argumentLabel = argPosition + "nd"; + } else if (lastDigit == 3 && lastTwoDigits != 13) { + argumentLabel = argPosition + "rd"; + } else { + argumentLabel = argPosition + "th"; + } + } else { + argumentLabel = `\`${keyPath[0].toString()}\``; + } + const path = keyPath.length > 1 ? keyPath.slice(1).map((pathPart) => typeof pathPart === "number" ? `[${pathPart}]` : pathPart).join(".") : void 0; + const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, { + argumentLabel, + keyPath, + methodName, + optionalPathLabel: path ? ` at path \`${path}\`` : "", + value, + ...path !== void 0 ? { path } : void 0 + }); + safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError2); + return error; +} +function getRpcSubscriptionsChannelWithAutoping({ + abortSignal: callerAbortSignal, + channel, + intervalMs +}) { + let intervalId; + function sendPing() { + channel.send(PING_PAYLOAD).catch((e22) => { + if (isSolanaError(e22, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED)) { + pingerAbortController.abort(); } - if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { - assert8(client[kRunning] === 0); - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++]; - util2.errorRequest(client, request, err); - } - } else { - onError(client, err); + }); + } + function restartPingTimer() { + clearInterval(intervalId); + intervalId = setInterval(sendPing, intervalMs); + } + const pingerAbortController = new e5(); + pingerAbortController.signal.addEventListener("abort", () => { + clearInterval(intervalId); + }); + callerAbortSignal.addEventListener("abort", () => { + pingerAbortController.abort(); + }); + channel.on( + "error", + () => { + pingerAbortController.abort(); + }, + { signal: pingerAbortController.signal } + ); + channel.on("message", restartPingTimer, { signal: pingerAbortController.signal }); + { + restartPingTimer(); + } + return { + ...channel, + send(...args) { + if (!pingerAbortController.signal.aborted) { + restartPingTimer(); } - client.emit("connectionError", client[kUrl], [client], err); + return channel.send(...args); } - function emitDrain(client) { - client[kNeedDrain] = 0; - client.emit("drain", client[kUrl], [client]); + }; +} +function createChannelPool() { + return { + entries: [], + freeChannelIndex: -1 + }; +} +function getChannelPoolingChannelCreator(createChannel, { maxSubscriptionsPerChannel, minChannels }) { + const pool = createChannelPool(); + function recomputeFreeChannelIndex() { + if (pool.entries.length < minChannels) { + pool.freeChannelIndex = -1; + return; } - function resume(client, sync) { - if (client[kResuming] === 2) { - return; - } - client[kResuming] = 2; - _resume(client, sync); - client[kResuming] = 0; - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]); - client[kPendingIdx] -= client[kRunningIdx]; - client[kRunningIdx] = 0; + let mostFreeChannel; + for (let ii = 0; ii < pool.entries.length; ii++) { + const nextPoolIndex = (pool.freeChannelIndex + ii + 2) % pool.entries.length; + const nextPoolEntry = ( + // Start from the item two positions after the current item. This way, the + // search will finish on the item after the current one. This ensures that, if + // any channels tie for having the most capacity, the one that will be chosen is + // the one immediately to the current one's right (wrapping around). + pool.entries[nextPoolIndex] + ); + if (nextPoolEntry.subscriptionCount < maxSubscriptionsPerChannel && (!mostFreeChannel || mostFreeChannel.subscriptionCount >= nextPoolEntry.subscriptionCount)) { + mostFreeChannel = { + poolIndex: nextPoolIndex, + subscriptionCount: nextPoolEntry.subscriptionCount + }; } } - function _resume(client, sync) { - while (true) { - if (client.destroyed) { - assert8(client[kPending] === 0); - return; - } - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve](); - client[kClosedResolve] = null; - return; - } - if (client[kHTTPContext]) { - client[kHTTPContext].resume(); - } - if (client[kBusy]) { - client[kNeedDrain] = 2; - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1; - queueMicrotask(() => emitDrain(client)); - } else { - emitDrain(client); - } - continue; - } - if (client[kPending] === 0) { - return; - } - if (client[kRunning] >= (getPipelining(client) || 1)) { - return; - } - const request = client[kQueue][client[kPendingIdx]]; - if (request === null) { - return; + pool.freeChannelIndex = mostFreeChannel?.poolIndex ?? -1; + } + return function getExistingChannelWithMostCapacityOrCreateChannel({ abortSignal }) { + let poolEntry; + function destroyPoolEntry() { + const index2 = pool.entries.findIndex((entry) => entry === poolEntry); + pool.entries.splice(index2, 1); + poolEntry.dispose(); + recomputeFreeChannelIndex(); + } + if (pool.freeChannelIndex === -1) { + const abortController = new e5(); + const newChannelPromise = createChannel({ abortSignal: abortController.signal }); + newChannelPromise.then((newChannel) => { + newChannel.on("error", destroyPoolEntry, { signal: abortController.signal }); + }).catch(destroyPoolEntry); + poolEntry = { + channel: newChannelPromise, + dispose() { + abortController.abort(); + }, + subscriptionCount: 0 + }; + pool.entries.push(poolEntry); + } else { + poolEntry = pool.entries[pool.freeChannelIndex]; + } + poolEntry.subscriptionCount++; + abortSignal.addEventListener("abort", function destroyConsumer() { + poolEntry.subscriptionCount--; + if (poolEntry.subscriptionCount === 0) { + destroyPoolEntry(); + } else if (pool.freeChannelIndex !== -1) { + pool.freeChannelIndex--; + recomputeFreeChannelIndex(); + } + }); + recomputeFreeChannelIndex(); + return poolEntry.channel; + }; +} +function getRpcSubscriptionsChannelWithJSONSerialization(channel) { + return pipe( + channel, + (c2) => transformChannelInboundMessages(c2, JSON.parse), + (c2) => transformChannelOutboundMessages(c2, JSON.stringify) + ); +} +function getRpcSubscriptionsChannelWithBigIntJSONSerialization(channel) { + return pipe( + channel, + (c2) => transformChannelInboundMessages(c2, parseJsonWithBigInts), + (c2) => transformChannelOutboundMessages(c2, stringifyJsonWithBigInts) + ); +} +function createDefaultSolanaRpcSubscriptionsChannelCreator(config) { + return createDefaultRpcSubscriptionsChannelCreatorImpl({ + ...config, + jsonSerializer: getRpcSubscriptionsChannelWithBigIntJSONSerialization + }); +} +function createDefaultRpcSubscriptionsChannelCreator(config) { + return createDefaultRpcSubscriptionsChannelCreatorImpl({ + ...config, + jsonSerializer: getRpcSubscriptionsChannelWithJSONSerialization + }); +} +function createDefaultRpcSubscriptionsChannelCreatorImpl(config) { + if (/^wss?:/i.test(config.url) === false) { + const protocolMatch = config.url.match(/^([^:]+):/); + throw new DOMException( + protocolMatch ? `Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${protocolMatch[1]}:' is not allowed.` : `Failed to construct 'WebSocket': The URL '${config.url}' is invalid.` + ); + } + const { intervalMs, ...rest } = config; + const createDefaultRpcSubscriptionsChannel = (({ abortSignal }) => { + return createWebSocketChannel({ + ...rest, + sendBufferHighWatermark: config.sendBufferHighWatermark ?? // Let 128KB of data into the WebSocket buffer before buffering it in the app. + 131072, + signal: abortSignal + }).then(config.jsonSerializer).then( + (channel) => getRpcSubscriptionsChannelWithAutoping({ + abortSignal, + channel, + intervalMs: intervalMs ?? 5e3 + }) + ); + }); + return getChannelPoolingChannelCreator(createDefaultRpcSubscriptionsChannel, { + maxSubscriptionsPerChannel: config.maxSubscriptionsPerChannel ?? /** + * A note about this default. The idea here is that, because some RPC providers impose + * an upper limit on the number of subscriptions you can make per channel, we must + * choose a number low enough to avoid hitting that limit. Without knowing what provider + * a given person is using, or what their limit is, we have to choose the lowest of all + * known limits. As of this writing (October 2024) that is the public mainnet RPC node + * (api.mainnet-beta.solana.com) at 100 subscriptions. + */ + 100, + minChannels: config.minChannels ?? 1 + }); +} +function getRpcSubscriptionsTransportWithSubscriptionCoalescing(transport) { + const cache2 = /* @__PURE__ */ new Map(); + return function rpcSubscriptionsTransportWithSubscriptionCoalescing(config) { + const { request, signal } = config; + const subscriptionConfigurationHash = index_default([request.methodName, request.params]); + let cachedDataPublisherPromise = cache2.get(subscriptionConfigurationHash); + if (!cachedDataPublisherPromise) { + const abortController = new e5(); + const dataPublisherPromise = transport({ + ...config, + signal: abortController.signal + }); + dataPublisherPromise.then((dataPublisher) => { + dataPublisher.on( + "error", + () => { + cache2.delete(subscriptionConfigurationHash); + abortController.abort(); + }, + { signal: abortController.signal } + ); + }).catch(() => { + }); + cache2.set( + subscriptionConfigurationHash, + cachedDataPublisherPromise = { + abortController, + dataPublisherPromise, + numSubscribers: 0 } - if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return; - } - client[kServerName] = request.servername; - client[kHTTPContext]?.destroy(new InformationalError("servername changed"), () => { - client[kHTTPContext] = null; - resume(client); + ); + } + cachedDataPublisherPromise.numSubscribers++; + signal.addEventListener( + "abort", + () => { + cachedDataPublisherPromise.numSubscribers--; + if (cachedDataPublisherPromise.numSubscribers === 0) { + queueMicrotask(() => { + if (cachedDataPublisherPromise.numSubscribers === 0) { + cache2.delete(subscriptionConfigurationHash); + cachedDataPublisherPromise.abortController.abort(); + } }); } - if (client[kConnecting]) { - return; - } - if (!client[kHTTPContext]) { - connect(client); - return; - } - if (client[kHTTPContext].destroyed) { - return; - } - if (client[kHTTPContext].busy(request)) { - return; - } - if (!request.aborted && client[kHTTPContext].write(request)) { - client[kPendingIdx]++; - } else { - client[kQueue].splice(client[kPendingIdx], 1); - } + }, + { signal: cachedDataPublisherPromise.abortController.signal } + ); + return cachedDataPublisherPromise.dataPublisherPromise; + }; +} +function createDefaultRpcSubscriptionsTransport({ + createChannel +}) { + return pipe( + createRpcSubscriptionsTransportFromChannelCreator( + createChannel + ), + (transport) => getRpcSubscriptionsTransportWithSubscriptionCoalescing(transport) + ); +} +function createRpcSubscriptionsTransportFromChannelCreator(createChannel) { + return (async ({ execute, signal }) => { + const channel = await createChannel({ abortSignal: signal }); + return await execute({ channel, signal }); + }); +} +function createSolanaRpcSubscriptionsImpl(clusterUrl, config) { + const transport = createDefaultRpcSubscriptionsTransport({ + createChannel: createDefaultSolanaRpcSubscriptionsChannelCreator({ ...config, url: clusterUrl }) + }); + return createSolanaRpcSubscriptionsFromTransport(transport); +} +function createSolanaRpcSubscriptions(clusterUrl, config) { + return createSolanaRpcSubscriptionsImpl(clusterUrl, config); +} +function createSolanaRpcSubscriptions_UNSTABLE(clusterUrl, config) { + return createSolanaRpcSubscriptionsImpl( + clusterUrl, + config + ); +} +function createSolanaRpcSubscriptionsFromTransport(transport) { + return createSubscriptionRpc({ + api: createSolanaRpcSubscriptionsApi(DEFAULT_RPC_SUBSCRIPTIONS_CONFIG), + transport + }); +} +var DEFAULT_RPC_SUBSCRIPTIONS_CONFIG, e5, PING_PAYLOAD; +var init_index_node34 = __esm({ + "node_modules/@solana/rpc-subscriptions/dist/index.node.mjs"() { + "use strict"; + init_index_node32(); + init_index_node32(); + init_index_node31(); + init_index_node31(); + init_index_node(); + init_index_node33(); + init_index_node11(); + init_index_node22(); + init_index_node27(); + DEFAULT_RPC_SUBSCRIPTIONS_CONFIG = { + defaultCommitment: "confirmed", + onIntegerOverflow(request, keyPath, value) { + throw createSolanaJsonRpcIntegerOverflowError2(request.methodName, keyPath, value); + } + }; + e5 = class extends globalThis.AbortController { + constructor(...t) { + super(...t), setMaxListeners5(Number.MAX_SAFE_INTEGER, this.signal); } + }; + PING_PAYLOAD = { + jsonrpc: "2.0", + method: "ping" + }; + } +}); + +// node_modules/@solana/signers/dist/index.node.mjs +function deduplicateSigners(signers) { + const deduplicated = {}; + signers.forEach((signer) => { + if (!deduplicated[signer.address]) { + deduplicated[signer.address] = signer; + } else if (deduplicated[signer.address] !== signer) { + throw new SolanaError(SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, { + address: signer.address + }); } - module.exports = Client; + }); + return Object.values(deduplicated); +} +function isTransactionModifyingSigner(value) { + return "modifyAndSignTransactions" in value && typeof value.modifyAndSignTransactions === "function"; +} +function assertIsTransactionModifyingSigner(value) { + if (!isTransactionModifyingSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, { + address: value.address + }); + } +} +function isTransactionPartialSigner(value) { + return "signTransactions" in value && typeof value.signTransactions === "function"; +} +function assertIsTransactionPartialSigner(value) { + if (!isTransactionPartialSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, { + address: value.address + }); + } +} +function isTransactionSendingSigner(value) { + return "signAndSendTransactions" in value && typeof value.signAndSendTransactions === "function"; +} +function assertIsTransactionSendingSigner(value) { + if (!isTransactionSendingSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, { + address: value.address + }); + } +} +function isTransactionSigner(value) { + return isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value); +} +function assertIsTransactionSigner(value) { + if (!isTransactionSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, { + address: value.address + }); + } +} +function getSignersFromInstruction(instruction) { + return deduplicateSigners( + (instruction.accounts ?? []).flatMap((account) => "signer" in account ? account.signer : []) + ); +} +function getSignersFromTransactionMessage(transaction) { + return deduplicateSigners([ + ...transaction.feePayer && isTransactionSigner(transaction.feePayer) ? [transaction.feePayer] : [], + ...transaction.instructions.flatMap(getSignersFromInstruction) + ]); +} +function addSignersToInstruction(signers, instruction) { + if (!instruction.accounts || instruction.accounts.length === 0) { + return instruction; + } + const signerByAddress = new Map(deduplicateSigners(signers).map((signer) => [signer.address, signer])); + return Object.freeze({ + ...instruction, + accounts: instruction.accounts.map((account) => { + const signer = signerByAddress.get(account.address); + if (!isSignerRole(account.role) || "signer" in account || !signer) { + return account; + } + return Object.freeze({ ...account, signer }); + }) + }); +} +function addSignersToTransactionMessage(signers, transactionMessage) { + const feePayerSigner = hasAddressOnlyFeePayer(transactionMessage) ? signers.find((signer) => signer.address === transactionMessage.feePayer.address) : void 0; + if (!feePayerSigner && transactionMessage.instructions.length === 0) { + return transactionMessage; + } + return Object.freeze({ + ...transactionMessage, + ...feePayerSigner ? { feePayer: feePayerSigner } : null, + instructions: transactionMessage.instructions.map((instruction) => addSignersToInstruction(signers, instruction)) + }); +} +function hasAddressOnlyFeePayer(message) { + return !!message && "feePayer" in message && !!message.feePayer && typeof message.feePayer.address === "string" && !isTransactionSigner(message.feePayer); +} +function setTransactionMessageFeePayerSigner(feePayer, transactionMessage) { + Object.freeze(feePayer); + const out = { ...transactionMessage, feePayer }; + Object.freeze(out); + return out; +} +function isMessagePartialSigner(value) { + return "signMessages" in value && typeof value.signMessages === "function"; +} +function assertIsMessagePartialSigner(value) { + if (!isMessagePartialSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, { + address: value.address + }); + } +} +function isKeyPairSigner(value) { + return "keyPair" in value && typeof value.keyPair === "object" && isMessagePartialSigner(value) && isTransactionPartialSigner(value); +} +function assertIsKeyPairSigner(value) { + if (!isKeyPairSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, { + address: value.address + }); + } +} +async function createSignerFromKeyPair(keyPair) { + const address2 = await getAddressFromPublicKey(keyPair.publicKey); + const out = { + address: address2, + keyPair, + signMessages: (messages) => Promise.all( + messages.map( + async (message) => Object.freeze({ [address2]: await signBytes(keyPair.privateKey, message.content) }) + ) + ), + signTransactions: (transactions) => Promise.all( + transactions.map(async (transaction) => { + const signedTransaction = await partiallySignTransaction([keyPair], transaction); + return Object.freeze({ [address2]: signedTransaction.signatures[address2] }); + }) + ) + }; + return Object.freeze(out); +} +async function generateKeyPairSigner() { + return await createSignerFromKeyPair(await generateKeyPair()); +} +async function createKeyPairSignerFromBytes(bytes, extractable) { + return await createSignerFromKeyPair(await createKeyPairFromBytes(bytes, extractable)); +} +async function createKeyPairSignerFromPrivateKeyBytes(bytes, extractable) { + return await createSignerFromKeyPair(await createKeyPairFromPrivateKeyBytes(bytes, extractable)); +} +function isMessageModifyingSigner(value) { + return isAddress2(value.address) && "modifyAndSignMessages" in value && typeof value.modifyAndSignMessages === "function"; +} +function assertIsMessageModifyingSigner(value) { + if (!isMessageModifyingSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, { + address: value.address + }); } -}); - -// node_modules/undici/lib/dispatcher/fixed-queue.js -var require_fixed_queue = __commonJS({ - "node_modules/undici/lib/dispatcher/fixed-queue.js"(exports, module) { +} +function isMessageSigner(value) { + return isMessagePartialSigner(value) || isMessageModifyingSigner(value); +} +function assertIsMessageSigner(value) { + if (!isMessageSigner(value)) { + throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, { + address: value.address + }); + } +} +function createNoopSigner(address2) { + const out = { + address: address2, + signMessages: (messages) => Promise.resolve(messages.map(() => Object.freeze({}))), + signTransactions: (transactions) => Promise.resolve(transactions.map(() => Object.freeze({}))) + }; + return Object.freeze(out); +} +function getSignersFromOffchainMessage({ + requiredSignatories +}) { + const messageSigners = requiredSignatories.filter(isMessageSigner); + return deduplicateSigners(messageSigners); +} +async function partiallySignOffchainMessageWithSigners(offchainMessage, config) { + const { partialSigners, modifyingSigners } = categorizeMessageSigners( + getSignersFromOffchainMessage(offchainMessage) + ); + return await signModifyingAndPartialMessageSigners(offchainMessage, modifyingSigners, partialSigners, config); +} +async function signOffchainMessageWithSigners(offchainMessage, config) { + const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage, config); + assertIsFullySignedOffchainMessageEnvelope(signedOffchainMessageEnvelope); + return signedOffchainMessageEnvelope; +} +function categorizeMessageSigners(signers) { + const modifyingSigners = identifyMessageModifyingSigners(signers); + const partialSigners = signers.filter(isMessagePartialSigner).filter((signer) => !modifyingSigners.includes(signer)); + return Object.freeze({ modifyingSigners, partialSigners }); +} +function identifyMessageModifyingSigners(signers) { + const modifyingSigners = signers.filter(isMessageModifyingSigner); + if (modifyingSigners.length === 0) return []; + const nonPartialSigners = modifyingSigners.filter((signer) => !isMessagePartialSigner(signer)); + if (nonPartialSigners.length > 0) return nonPartialSigners; + return [modifyingSigners[0]]; +} +async function signModifyingAndPartialMessageSigners(offchainMessage, modifyingSigners = [], partialSigners = [], config) { + const offchainMessageEnvelope = compileOffchainMessageEnvelope(offchainMessage); + const modifiedOffchainMessage = await modifyingSigners.reduce(async (offchainMessageEnvelope2, modifyingSigner) => { + config?.abortSignal?.throwIfAborted(); + const [message] = await modifyingSigner.modifyAndSignMessages([await offchainMessageEnvelope2], config); + return Object.freeze(message); + }, Promise.resolve(offchainMessageEnvelope)); + config?.abortSignal?.throwIfAborted(); + const signatureDictionaries = await Promise.all( + partialSigners.map(async (partialSigner) => { + const [signatures] = await partialSigner.signMessages([modifiedOffchainMessage], config); + return signatures; + }) + ); + return Object.freeze({ + ...modifiedOffchainMessage, + signatures: Object.freeze( + signatureDictionaries.reduce((signatures, signatureDictionary) => { + return { ...signatures, ...signatureDictionary }; + }, modifiedOffchainMessage.signatures ?? {}) + ) + }); +} +function isTransactionMessageWithSingleSendingSigner(transaction) { + try { + assertIsTransactionMessageWithSingleSendingSigner(transaction); + return true; + } catch { + return false; + } +} +function assertIsTransactionMessageWithSingleSendingSigner(transaction) { + const signers = getSignersFromTransactionMessage(transaction); + const sendingSigners = signers.filter(isTransactionSendingSigner); + if (sendingSigners.length === 0) { + throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING); + } + const sendingOnlySigners = sendingSigners.filter( + (signer) => !isTransactionPartialSigner(signer) && !isTransactionModifyingSigner(signer) + ); + if (sendingOnlySigners.length > 1) { + throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS); + } +} +async function partiallySignTransactionMessageWithSigners(transactionMessage, config) { + const { partialSigners, modifyingSigners } = categorizeTransactionSigners( + deduplicateSigners(getSignersFromTransactionMessage(transactionMessage).filter(isTransactionSigner)), + { identifySendingSigner: false } + ); + return await signModifyingAndPartialTransactionSigners( + transactionMessage, + modifyingSigners, + partialSigners, + config + ); +} +async function signTransactionMessageWithSigners(transactionMessage, config) { + const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, config); + assertIsFullySignedTransaction(signedTransaction); + return signedTransaction; +} +async function signAndSendTransactionMessageWithSigners(transaction, config) { + assertIsTransactionMessageWithSingleSendingSigner(transaction); + const abortSignal = config?.abortSignal; + const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners( + deduplicateSigners(getSignersFromTransactionMessage(transaction).filter(isTransactionSigner)) + ); + abortSignal?.throwIfAborted(); + const signedTransaction = await signModifyingAndPartialTransactionSigners( + transaction, + modifyingSigners, + partialSigners, + config + ); + if (!sendingSigner) { + throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING); + } + abortSignal?.throwIfAborted(); + const [signature2] = await sendingSigner.signAndSendTransactions([signedTransaction], config); + abortSignal?.throwIfAborted(); + return signature2; +} +function categorizeTransactionSigners(signers, config = {}) { + const identifySendingSigner = config.identifySendingSigner ?? true; + const sendingSigner = identifySendingSigner ? identifyTransactionSendingSigner(signers) : null; + const otherSigners = signers.filter( + (signer) => signer !== sendingSigner && (isTransactionModifyingSigner(signer) || isTransactionPartialSigner(signer)) + ); + const modifyingSigners = identifyTransactionModifyingSigners(otherSigners); + const partialSigners = otherSigners.filter(isTransactionPartialSigner).filter((signer) => !modifyingSigners.includes(signer)); + return Object.freeze({ modifyingSigners, partialSigners, sendingSigner }); +} +function identifyTransactionSendingSigner(signers) { + const sendingSigners = signers.filter(isTransactionSendingSigner); + if (sendingSigners.length === 0) return null; + const sendingOnlySigners = sendingSigners.filter( + (signer) => !isTransactionModifyingSigner(signer) && !isTransactionPartialSigner(signer) + ); + if (sendingOnlySigners.length > 0) { + return sendingOnlySigners[0]; + } + return sendingSigners[0]; +} +function identifyTransactionModifyingSigners(signers) { + const modifyingSigners = signers.filter(isTransactionModifyingSigner); + if (modifyingSigners.length === 0) return []; + const nonPartialSigners = modifyingSigners.filter((signer) => !isTransactionPartialSigner(signer)); + if (nonPartialSigners.length > 0) return nonPartialSigners; + return [modifyingSigners[0]]; +} +async function signModifyingAndPartialTransactionSigners(transactionMessage, modifyingSigners = [], partialSigners = [], config) { + const transaction = compileTransaction(transactionMessage); + const modifiedTransaction = await modifyingSigners.reduce( + async (transaction2, modifyingSigner) => { + config?.abortSignal?.throwIfAborted(); + const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction2], config); + return Object.freeze(tx); + }, + Promise.resolve(transaction) + ); + config?.abortSignal?.throwIfAborted(); + const signatureDictionaries = await Promise.all( + partialSigners.map(async (partialSigner) => { + const [signatures] = await partialSigner.signTransactions([modifiedTransaction], config); + return signatures; + }) + ); + return Object.freeze({ + ...modifiedTransaction, + signatures: Object.freeze( + signatureDictionaries.reduce((signatures, signatureDictionary) => { + return { ...signatures, ...signatureDictionary }; + }, modifiedTransaction.signatures ?? {}) + ) + }); +} +function createSignableMessage(content, signatures = {}) { + return Object.freeze({ + content: typeof content === "string" ? new o2().encode(content) : content, + signatures: Object.freeze({ ...signatures }) + }); +} +var o2; +var init_index_node35 = __esm({ + "node_modules/@solana/signers/dist/index.node.mjs"() { "use strict"; - var kSize = 2048; - var kMask = kSize - 1; - var FixedCircularBuffer = class { - /** @type {number} */ - bottom = 0; - /** @type {number} */ - top = 0; - /** @type {Array} */ - list = new Array(kSize).fill(void 0); - /** @type {T|null} */ - next = null; - /** @returns {boolean} */ - isEmpty() { - return this.top === this.bottom; - } - /** @returns {boolean} */ - isFull() { - return (this.top + 1 & kMask) === this.bottom; - } - /** - * @param {T} data - * @returns {void} - */ - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; - } - /** @returns {T|null} */ - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === void 0) { - return null; - } - this.list[this.bottom] = void 0; - this.bottom = this.bottom + 1 & kMask; - return nextItem; - } - }; - module.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } - /** @returns {boolean} */ - isEmpty() { - return this.head.isEmpty(); - } - /** @param {T} data */ - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer(); - } - this.head.push(data); - } - /** @returns {T|null} */ - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; - tail.next = null; - } - return next; - } - }; + init_index_node(); + init_index_node12(); + init_index_node6(); + init_index_node15(); + init_index_node16(); + init_index_node19(); + o2 = globalThis.TextEncoder; } }); -// node_modules/undici/lib/dispatcher/pool-base.js -var require_pool_base = __commonJS({ - "node_modules/undici/lib/dispatcher/pool-base.js"(exports, module) { - "use strict"; - var { PoolStats } = require_stats(); - var DispatcherBase = require_dispatcher_base(); - var FixedQueue = require_fixed_queue(); - var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); - var kClients = /* @__PURE__ */ Symbol("clients"); - var kNeedDrain = /* @__PURE__ */ Symbol("needDrain"); - var kQueue = /* @__PURE__ */ Symbol("queue"); - var kClosedResolve = /* @__PURE__ */ Symbol("closed resolve"); - var kOnDrain = /* @__PURE__ */ Symbol("onDrain"); - var kOnConnect = /* @__PURE__ */ Symbol("onConnect"); - var kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); - var kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); - var kGetDispatcher = /* @__PURE__ */ Symbol("get dispatcher"); - var kAddClient = /* @__PURE__ */ Symbol("add client"); - var kRemoveClient = /* @__PURE__ */ Symbol("remove client"); - var PoolBase = class extends DispatcherBase { - [kQueue] = new FixedQueue(); - [kQueued] = 0; - [kClients] = []; - [kNeedDrain] = false; - [kOnDrain](client, origin, targets) { - const queue = this[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - this[kQueued]--; - needDrain = !client.dispatch(item.opts, item.handler); - } - client[kNeedDrain] = needDrain; - if (!needDrain && this[kNeedDrain]) { - this[kNeedDrain] = false; - this.emit("drain", origin, [this, ...targets]); - } - if (this[kClosedResolve] && queue.isEmpty()) { - const closeAll = []; - for (let i = 0; i < this[kClients].length; i++) { - const client2 = this[kClients][i]; - if (!client2.destroyed) { - closeAll.push(client2.close()); +// node_modules/@solana/transaction-confirmation/dist/index.node.mjs +import { setMaxListeners as setMaxListeners6 } from "events"; +function createBlockHeightExceedencePromiseFactory({ + rpc, + rpcSubscriptions +}) { + return async function getBlockHeightExceedencePromise({ + abortSignal: callerAbortSignal, + commitment, + lastValidBlockHeight + }) { + callerAbortSignal.throwIfAborted(); + const abortController = new e6(); + const handleAbort = () => { + abortController.abort(); + }; + callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); + async function getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() { + const { absoluteSlot, blockHeight } = await rpc.getEpochInfo({ commitment }).send({ abortSignal: abortController.signal }); + return { + blockHeight, + differenceBetweenSlotHeightAndBlockHeight: absoluteSlot - blockHeight + }; + } + try { + const [slotNotifications, { blockHeight: initialBlockHeight, differenceBetweenSlotHeightAndBlockHeight }] = await Promise.all([ + rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal }), + getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() + ]); + callerAbortSignal.throwIfAborted(); + let currentBlockHeight = initialBlockHeight; + if (currentBlockHeight <= lastValidBlockHeight) { + let lastKnownDifferenceBetweenSlotHeightAndBlockHeight = differenceBetweenSlotHeightAndBlockHeight; + for await (const slotNotification of slotNotifications) { + const { slot } = slotNotification; + if (slot - lastKnownDifferenceBetweenSlotHeightAndBlockHeight > lastValidBlockHeight) { + const { + blockHeight: recheckedBlockHeight, + differenceBetweenSlotHeightAndBlockHeight: currentDifferenceBetweenSlotHeightAndBlockHeight + } = await getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight(); + currentBlockHeight = recheckedBlockHeight; + if (currentBlockHeight > lastValidBlockHeight) { + break; + } else { + lastKnownDifferenceBetweenSlotHeightAndBlockHeight = currentDifferenceBetweenSlotHeightAndBlockHeight; } } - return Promise.all(closeAll).then(this[kClosedResolve]); - } - } - [kOnConnect] = (origin, targets) => { - this.emit("connect", origin, [this, ...targets]); - }; - [kOnDisconnect] = (origin, targets, err) => { - this.emit("disconnect", origin, [this, ...targets], err); - }; - [kOnConnectionError] = (origin, targets, err) => { - this.emit("connectionError", origin, [this, ...targets], err); - }; - get [kBusy]() { - return this[kNeedDrain]; - } - get [kConnected]() { - let ret = 0; - for (const { [kConnected]: connected } of this[kClients]) { - ret += connected; - } - return ret; - } - get [kFree]() { - let ret = 0; - for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) { - ret += connected && !needDrain; - } - return ret; - } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; - } - return ret; - } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; - } - return ret; - } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size5 } of this[kClients]) { - ret += size5; } - return ret; - } - get stats() { - return new PoolStats(this); } - [kClose]() { - if (this[kQueue].isEmpty()) { - const closeAll = []; - for (let i = 0; i < this[kClients].length; i++) { - const client = this[kClients][i]; - if (!client.destroyed) { - closeAll.push(client.close()); - } - } - return Promise.all(closeAll); - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; + callerAbortSignal.throwIfAborted(); + throw new SolanaError(SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, { + currentBlockHeight, + lastValidBlockHeight + }); + } finally { + abortController.abort(); + } + }; +} +function createNonceInvalidationPromiseFactory({ + rpc, + rpcSubscriptions +}) { + return async function getNonceInvalidationPromise({ + abortSignal: callerAbortSignal, + commitment, + currentNonceValue: expectedNonceValue, + nonceAccountAddress + }) { + const abortController = new e6(); + function handleAbort() { + abortController.abort(); + } + callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); + const accountNotifications = await rpcSubscriptions.accountNotifications(nonceAccountAddress, { commitment, encoding: "base64" }).subscribe({ abortSignal: abortController.signal }); + const base58Decoder2 = getBase58Decoder(); + const base64Encoder = getBase64Encoder(); + function getNonceFromAccountData([base64EncodedBytes]) { + const data = base64Encoder.encode(base64EncodedBytes); + const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32); + return base58Decoder2.decode(nonceValueBytes); + } + const nonceAccountDidAdvancePromise = (async () => { + for await (const accountNotification of accountNotifications) { + const nonceValue = getNonceFromAccountData(accountNotification.value.data); + if (nonceValue !== expectedNonceValue) { + throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, { + actualNonceValue: nonceValue, + expectedNonceValue }); } } - [kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; - } - item.handler.onResponseError(null, err); - } - const destroyAll = new Array(this[kClients].length); - for (let i = 0; i < this[kClients].length; i++) { - destroyAll[i] = this[kClients][i].destroy(err); - } - return Promise.all(destroyAll); + })(); + const nonceIsAlreadyInvalidPromise = (async () => { + const { value: nonceAccount } = await rpc.getAccountInfo(nonceAccountAddress, { + commitment, + dataSlice: { length: 32, offset: NONCE_VALUE_OFFSET }, + encoding: "base58" + }).send({ abortSignal: abortController.signal }); + if (!nonceAccount) { + throw new SolanaError(SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, { + nonceAccountAddress + }); } - [kDispatch](opts, handler) { - const dispatcher = this[kGetDispatcher](); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); - } - return !this[kNeedDrain]; + const nonceValue = ( + // This works because we asked for the exact slice of data representing the nonce + // value, and furthermore asked for it in `base58` encoding. + nonceAccount.data[0] + ); + if (nonceValue !== expectedNonceValue) { + throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, { + actualNonceValue: nonceValue, + expectedNonceValue + }); + } else { + await new Promise(() => { + }); } - [kAddClient](client) { - client.on("drain", this[kOnDrain].bind(this, client)).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client); - if (this[kNeedDrain]) { - queueMicrotask(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client, client[kUrl], [client, this]); - } - }); + })(); + try { + return await safeRace([nonceAccountDidAdvancePromise, nonceIsAlreadyInvalidPromise]); + } finally { + abortController.abort(); + } + }; +} +function createRecentSignatureConfirmationPromiseFactory({ + rpc, + rpcSubscriptions +}) { + return async function getRecentSignatureConfirmationPromise({ + abortSignal: callerAbortSignal, + commitment, + signature: signature2 + }) { + const abortController = new e6(); + function handleAbort() { + abortController.abort(); + } + callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); + const signatureStatusNotifications = await rpcSubscriptions.signatureNotifications(signature2, { commitment }).subscribe({ abortSignal: abortController.signal }); + const signatureDidCommitPromise = (async () => { + for await (const signatureStatusNotification of signatureStatusNotifications) { + if (signatureStatusNotification.value.err) { + throw getSolanaErrorFromTransactionError(signatureStatusNotification.value.err); + } else { + return; } - return this; } - [kRemoveClient](client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } + })(); + const signatureStatusLookupPromise = (async () => { + const { value: signatureStatusResults } = await rpc.getSignatureStatuses([signature2]).send({ abortSignal: abortController.signal }); + const signatureStatus = signatureStatusResults[0]; + if (signatureStatus?.err) { + throw getSolanaErrorFromTransactionError(signatureStatus.err); + } else if (signatureStatus?.confirmationStatus && commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0) { + return; + } else { + await new Promise(() => { }); - this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); } + })(); + try { + return await safeRace([signatureDidCommitPromise, signatureStatusLookupPromise]); + } finally { + abortController.abort(); + } + }; +} +async function getTimeoutPromise({ abortSignal: callerAbortSignal, commitment }) { + return await new Promise((_, reject) => { + const handleAbort = (e22) => { + clearTimeout(timeoutId); + const abortError = new DOMException(e22.target.reason, "AbortError"); + reject(abortError); }; - module.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher + callerAbortSignal.addEventListener("abort", handleAbort); + const timeoutMs = commitment === "processed" ? 3e4 : 6e4; + const startMs = performance.now(); + const timeoutId = ( + // We use `setTimeout` instead of `AbortSignal.timeout()` because we want to measure + // elapsed time instead of active time. + // See https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static + setTimeout(() => { + const elapsedMs = performance.now() - startMs; + reject(new DOMException(`Timeout elapsed after ${elapsedMs} ms`, "TimeoutError")); + }, timeoutMs) + ); + }); +} +async function raceStrategies(signature2, config, getSpecificStrategiesForRace) { + const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise } = config; + callerAbortSignal?.throwIfAborted(); + const abortController = new e6(); + if (callerAbortSignal) { + const handleAbort = () => { + abortController.abort(); }; + callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal }); } -}); - -// node_modules/undici/lib/dispatcher/pool.js -var require_pool = __commonJS({ - "node_modules/undici/lib/dispatcher/pool.js"(exports, module) { - "use strict"; - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher, - kRemoveClient - } = require_pool_base(); - var Client = require_client(); - var { - InvalidArgumentError - } = require_errors(); - var util2 = require_util(); - var { kUrl } = require_symbols(); - var buildConnector = require_connect(); - var kOptions = /* @__PURE__ */ Symbol("options"); - var kConnections = /* @__PURE__ */ Symbol("connections"); - var kFactory = /* @__PURE__ */ Symbol("factory"); - function defaultFactory(origin, opts) { - return new Client(origin, opts); + try { + const specificStrategies = getSpecificStrategiesForRace({ + ...config, + abortSignal: abortController.signal + }); + return await safeRace([ + getRecentSignatureConfirmationPromise({ + abortSignal: abortController.signal, + commitment, + signature: signature2 + }), + ...specificStrategies + ]); + } finally { + abortController.abort(); + } +} +async function waitForDurableNonceTransactionConfirmation(config) { + await raceStrategies( + getSignatureFromTransaction(config.transaction), + config, + function getSpecificStrategiesForRace({ abortSignal, commitment, getNonceInvalidationPromise, transaction }) { + return [ + getNonceInvalidationPromise({ + abortSignal, + commitment, + currentNonceValue: transaction.lifetimeConstraint.nonce, + nonceAccountAddress: transaction.lifetimeConstraint.nonceAccountAddress + }) + ]; } - var Pool = class extends PoolBase { - constructor(origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - clientTtl, - ...options - } = {}) { - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError("invalid connections"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (typeof connect !== "function") { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect - }); - } - super(options); - this[kConnections] = connections || null; - this[kUrl] = util2.parseOrigin(origin); - this[kOptions] = { ...util2.deepClone(options), connect, allowH2, clientTtl, socketPath }; - this[kFactory] = factory; - this.on("connect", (origin2, targets) => { - if (clientTtl != null && clientTtl > 0) { - for (const target of targets) { - Object.assign(target, { ttl: Date.now() }); - } - } - }); - this.on("connectionError", (origin2, targets, error) => { - for (const target of targets) { - const idx = this[kClients].indexOf(target); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - } - }); - } - [kGetDispatcher]() { - const clientTtlOption = this[kOptions].clientTtl; - for (const client of this[kClients]) { - if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && Date.now() - client.ttl > clientTtlOption) { - this[kRemoveClient](client); - } else if (!client[kNeedDrain]) { - return client; - } - } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - const dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); - return dispatcher; - } + ); +} +async function waitForRecentTransactionConfirmation(config) { + await raceStrategies( + getSignatureFromTransaction(config.transaction), + config, + function getSpecificStrategiesForRace({ + abortSignal, + commitment, + getBlockHeightExceedencePromise, + transaction + }) { + return [ + getBlockHeightExceedencePromise({ + abortSignal, + commitment, + lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight + }) + ]; + } + ); +} +async function waitForRecentTransactionConfirmationUntilTimeout(config) { + await raceStrategies( + config.signature, + config, + function getSpecificStrategiesForRace({ abortSignal, commitment, getTimeoutPromise: getTimeoutPromise2 }) { + return [ + getTimeoutPromise2({ + abortSignal, + commitment + }) + ]; + } + ); +} +var e6, NONCE_VALUE_OFFSET; +var init_index_node36 = __esm({ + "node_modules/@solana/transaction-confirmation/dist/index.node.mjs"() { + "use strict"; + init_index_node(); + init_index_node3(); + init_index_node17(); + init_index_node13(); + init_index_node16(); + e6 = class extends globalThis.AbortController { + constructor(...t) { + super(...t), setMaxListeners6(Number.MAX_SAFE_INTEGER, this.signal); } }; - module.exports = Pool; + NONCE_VALUE_OFFSET = 4 + // version(u32) + 4 + // state(u32) + 32; } }); - -// node_modules/undici/lib/dispatcher/balanced-pool.js -var require_balanced_pool = __commonJS({ - "node_modules/undici/lib/dispatcher/balanced-pool.js"(exports, module) { - "use strict"; - var { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = require_errors(); - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = require_pool_base(); - var Pool = require_pool(); - var { kUrl } = require_symbols(); - var util2 = require_util(); - var kFactory = /* @__PURE__ */ Symbol("factory"); - var kOptions = /* @__PURE__ */ Symbol("options"); - var kGreatestCommonDivisor = /* @__PURE__ */ Symbol("kGreatestCommonDivisor"); - var kCurrentWeight = /* @__PURE__ */ Symbol("kCurrentWeight"); - var kIndex = /* @__PURE__ */ Symbol("kIndex"); - var kWeight = /* @__PURE__ */ Symbol("kWeight"); - var kMaxWeightPerServer = /* @__PURE__ */ Symbol("kMaxWeightPerServer"); - var kErrorPenalty = /* @__PURE__ */ Symbol("kErrorPenalty"); - function getGreatestCommonDivisor(a, b) { - if (a === 0) return b; - while (b !== 0) { - const t = b; - b = a % b; - a = t; - } - return a; - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - var BalancedPool = class extends PoolBase { - constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - super(); - this[kOptions] = { ...util2.deepClone(opts) }; - this[kIndex] = -1; - this[kCurrentWeight] = 0; - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; - this[kErrorPenalty] = this[kOptions].errorPenalty || 15; - if (!Array.isArray(upstreams)) { - upstreams = [upstreams]; - } - this[kFactory] = factory; - for (const upstream of upstreams) { - this.addUpstream(upstream); - } - this._updateBalancedPoolStats(); - } - addUpstream(upstream) { - const upstreamOrigin = util2.parseOrigin(upstream).origin; - if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) { - return this; - } - const pool = this[kFactory](upstreamOrigin, this[kOptions]); - this[kAddClient](pool); - pool.on("connect", () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); - }); - pool.on("connectionError", () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - }); - pool.on("disconnect", (...args) => { - const err = args[2]; - if (err && err.code === "UND_ERR_SOCKET") { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - } - }); - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer]; - } - this._updateBalancedPoolStats(); - return this; - } - _updateBalancedPoolStats() { - let result = 0; - for (let i = 0; i < this[kClients].length; i++) { - result = getGreatestCommonDivisor(this[kClients][i][kWeight], result); - } - this[kGreatestCommonDivisor] = result; - } - removeUpstream(upstream) { - const upstreamOrigin = util2.parseOrigin(upstream).origin; - const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true); - if (pool) { - this[kRemoveClient](pool); - } - return this; - } - getUpstream(upstream) { - const upstreamOrigin = util2.parseOrigin(upstream).origin; - return this[kClients].find((pool) => pool[kUrl].origin === upstreamOrigin && pool.closed !== true && pool.destroyed !== true); - } - get upstreams() { - return this[kClients].filter((dispatcher) => dispatcher.closed !== true && dispatcher.destroyed !== true).map((p) => p[kUrl].origin); - } - [kGetDispatcher]() { - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError(); - } - const dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); - if (!dispatcher) { - return; - } - const allClientsBusy = this[kClients].map((pool) => pool[kNeedDrain]).reduce((a, b) => a && b, true); - if (allClientsBusy) { - return; - } - let counter = 0; - let maxWeightIndex = this[kClients].findIndex((pool) => !pool[kNeedDrain]); - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length; - const pool = this[kClients][this[kIndex]]; - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex]; - } - if (this[kIndex] === 0) { - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer]; - } - } - if (pool[kWeight] >= this[kCurrentWeight] && !pool[kNeedDrain]) { - return pool; - } - } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; - this[kIndex] = maxWeightIndex; - return this[kClients][maxWeightIndex]; - } - }; - module.exports = BalancedPool; + +// node_modules/@solana/kit/dist/index.node.mjs +var index_node_exports = {}; +__export(index_node_exports, { + AccountRole: () => AccountRole, + BASE_ACCOUNT_SIZE: () => BASE_ACCOUNT_SIZE, + DEFAULT_RPC_CONFIG: () => DEFAULT_RPC_CONFIG, + DEFAULT_RPC_SUBSCRIPTIONS_CONFIG: () => DEFAULT_RPC_SUBSCRIPTIONS_CONFIG, + Endian: () => Endian, + MAX_SUPPORTED_TRANSACTION_VERSION: () => MAX_SUPPORTED_TRANSACTION_VERSION, + OffchainMessageContentFormat: () => OffchainMessageContentFormat, + SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, + SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED: () => SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, + SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT: () => SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, + SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT: () => SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, + SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND: () => SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, + SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED: () => SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED, + SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS: () => SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS, + SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH: () => SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, + SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY: () => SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY, + SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS: () => SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS, + SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE: () => SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE, + SOLANA_ERROR__ADDRESSES__MALFORMED_PDA: () => SOLANA_ERROR__ADDRESSES__MALFORMED_PDA, + SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED: () => SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, + SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED: () => SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, + SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE: () => SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, + SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER: () => SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER, + SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, + SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, + SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED: () => SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, + SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY: () => SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, + SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS: () => SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, + SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL: () => SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, + SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH: () => SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, + SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH: () => SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, + SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH: () => SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH, + SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, + SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY: () => SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, + SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH: () => SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH, + SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH: () => SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, + SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH: () => SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH, + SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE: () => SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE, + SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH: () => SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, + SOLANA_ERROR__CODECS__INVALID_CONSTANT: () => SOLANA_ERROR__CODECS__INVALID_CONSTANT, + SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT: () => SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, + SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT: () => SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, + SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT: () => SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, + SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS: () => SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, + SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE: () => SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, + SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, + SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, + SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, + SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES: () => SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, + SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE: () => SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, + SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED, + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED, + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED, + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED, + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL, + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE, + SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT: () => SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT, + SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW: () => SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW, + SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR: () => SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR, + SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS: () => SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS, + SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH: () => SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH, + SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED, + SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM: () => SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, + SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX: () => SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX, + SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC: () => SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC, + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT, + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED, + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE, + SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED, + SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED, + SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND: () => SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND, + SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR: () => SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, + SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER: () => SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER, + SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE: () => SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE, + SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY: () => SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY, + SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID: () => SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID, + SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS: () => SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS, + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA, + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER, + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT, + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR, + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA, + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC, + SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS: () => SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS, + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED, + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED, + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED, + SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED: () => SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED, + SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT: () => SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT, + SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE: () => SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE, + SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID: () => SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID, + SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS: () => SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS, + SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION: () => SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION, + SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE: () => SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE, + SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE: () => SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE, + SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE: () => SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE, + SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED, + SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE: () => SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE, + SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED: () => SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED, + SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED: () => SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED, + SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION, + SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT, + SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN, + SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID, + SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR: () => SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR, + SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN, + SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT: () => SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, + SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND: () => SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND, + SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, + SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, + SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE: () => SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE, + SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED: () => SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED, + SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, + SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN: () => SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, + SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT: () => SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, + SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS: () => SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, + SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA: () => SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, + SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH: () => SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, + SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH: () => SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, + SOLANA_ERROR__INVALID_NONCE: () => SOLANA_ERROR__INVALID_NONCE, + SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING: () => SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING, + SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED: () => SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, + SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND: () => SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, + SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND: () => SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, + SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE: () => SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE, + SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING: () => SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING, + SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE: () => SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, + SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR: () => SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR, + SOLANA_ERROR__JSON_RPC__INVALID_PARAMS: () => SOLANA_ERROR__JSON_RPC__INVALID_PARAMS, + SOLANA_ERROR__JSON_RPC__INVALID_REQUEST: () => SOLANA_ERROR__JSON_RPC__INVALID_REQUEST, + SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND: () => SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND, + SOLANA_ERROR__JSON_RPC__PARSE_ERROR: () => SOLANA_ERROR__JSON_RPC__PARSE_ERROR, + SOLANA_ERROR__JSON_RPC__SCAN_ERROR: () => SOLANA_ERROR__JSON_RPC__SCAN_ERROR, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE, + SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION: () => SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION, + SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH: () => SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, + SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH: () => SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, + SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH: () => SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, + SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY: () => SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY, + SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, + SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE: () => SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE, + SOLANA_ERROR__MALFORMED_BIGINT_STRING: () => SOLANA_ERROR__MALFORMED_BIGINT_STRING, + SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR: () => SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, + SOLANA_ERROR__MALFORMED_NUMBER_STRING: () => SOLANA_ERROR__MALFORMED_NUMBER_STRING, + SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, + SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, + SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE, + SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, + SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH, + SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, + SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, + SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, + SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY, + SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO, + SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO, + SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, + SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE, + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED, + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE, + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, + SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, + SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, + SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED: () => SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED, + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, + SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, + SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID: () => SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID, + SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD: () => SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, + SOLANA_ERROR__RPC__INTEGER_OVERFLOW: () => SOLANA_ERROR__RPC__INTEGER_OVERFLOW, + SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR: () => SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, + SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN: () => SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, + SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS: () => SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, + SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, + SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, + SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, + SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, + SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER: () => SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, + SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS: () => SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS, + SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING: () => SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, + SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED: () => SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, + SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY: () => SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, + SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED, + SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT: () => SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT, + SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED, + SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED, + SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED, + SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED, + SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED: () => SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED, + SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE: () => SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING, + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE, + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE, + SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND, + SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND, + SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED: () => SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED, + SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND, + SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP: () => SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP, + SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE: () => SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE, + SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION: () => SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION, + SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE: () => SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE, + SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT: () => SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT, + SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT: () => SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT, + SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED: () => SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED, + SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE: () => SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE, + SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND, + SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED: () => SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED, + SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED: () => SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED, + SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE: () => SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE, + SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE: () => SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE, + SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS: () => SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS, + SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION: () => SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION, + SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN: () => SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN, + SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION: () => SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION, + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT, + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT, + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT, + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT, + SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT: () => SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT, + SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION: () => SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, + SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING: () => SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING, + SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES: () => SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES, + SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT: () => SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, + SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME: () => SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME, + SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME: () => SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME, + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE, + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING, + SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, + SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT: () => SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT, + SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT: () => SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT, + SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING: () => SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING, + SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING: () => SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING, + SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE: () => SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE, + SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING: () => SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING, + SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES: () => SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, + SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE: () => SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, + SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH: () => SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, + SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE: () => SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, + SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING: () => SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, + SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED: () => SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, + SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE: () => SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, + SolanaError: () => SolanaError, + TRANSACTION_PACKET_HEADER: () => TRANSACTION_PACKET_HEADER, + TRANSACTION_PACKET_SIZE: () => TRANSACTION_PACKET_SIZE, + TRANSACTION_SIZE_LIMIT: () => TRANSACTION_SIZE_LIMIT, + addCodecSentinel: () => addCodecSentinel, + addCodecSizePrefix: () => addCodecSizePrefix, + addDecoderSentinel: () => addDecoderSentinel, + addDecoderSizePrefix: () => addDecoderSizePrefix, + addEncoderSentinel: () => addEncoderSentinel, + addEncoderSizePrefix: () => addEncoderSizePrefix, + addSignersToInstruction: () => addSignersToInstruction, + addSignersToTransactionMessage: () => addSignersToTransactionMessage, + address: () => address, + airdropFactory: () => airdropFactory, + appendTransactionMessageInstruction: () => appendTransactionMessageInstruction, + appendTransactionMessageInstructionPlan: () => appendTransactionMessageInstructionPlan, + appendTransactionMessageInstructions: () => appendTransactionMessageInstructions, + assertAccountDecoded: () => assertAccountDecoded, + assertAccountExists: () => assertAccountExists, + assertAccountsDecoded: () => assertAccountsDecoded, + assertAccountsExist: () => assertAccountsExist, + assertByteArrayHasEnoughBytesForCodec: () => assertByteArrayHasEnoughBytesForCodec, + assertByteArrayIsNotEmptyForCodec: () => assertByteArrayIsNotEmptyForCodec, + assertByteArrayOffsetIsNotOutOfRange: () => assertByteArrayOffsetIsNotOutOfRange, + assertIsAddress: () => assertIsAddress, + assertIsBlockhash: () => assertIsBlockhash, + assertIsCanceledSingleTransactionPlanResult: () => assertIsCanceledSingleTransactionPlanResult, + assertIsFailedSingleTransactionPlanResult: () => assertIsFailedSingleTransactionPlanResult, + assertIsFixedSize: () => assertIsFixedSize, + assertIsFullySignedOffchainMessageEnvelope: () => assertIsFullySignedOffchainMessageEnvelope, + assertIsFullySignedTransaction: () => assertIsFullySignedTransaction, + assertIsInstructionForProgram: () => assertIsInstructionForProgram, + assertIsInstructionWithAccounts: () => assertIsInstructionWithAccounts, + assertIsInstructionWithData: () => assertIsInstructionWithData, + assertIsKeyPairSigner: () => assertIsKeyPairSigner, + assertIsLamports: () => assertIsLamports, + assertIsMessageModifyingSigner: () => assertIsMessageModifyingSigner, + assertIsMessagePackerInstructionPlan: () => assertIsMessagePackerInstructionPlan, + assertIsMessagePartialSigner: () => assertIsMessagePartialSigner, + assertIsMessageSigner: () => assertIsMessageSigner, + assertIsNonDivisibleSequentialInstructionPlan: () => assertIsNonDivisibleSequentialInstructionPlan, + assertIsNonDivisibleSequentialTransactionPlan: () => assertIsNonDivisibleSequentialTransactionPlan, + assertIsNonDivisibleSequentialTransactionPlanResult: () => assertIsNonDivisibleSequentialTransactionPlanResult, + assertIsOffCurveAddress: () => assertIsOffCurveAddress, + assertIsOffchainMessageApplicationDomain: () => assertIsOffchainMessageApplicationDomain, + assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax: () => assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax, + assertIsOffchainMessageContentUtf8Of1232BytesMax: () => assertIsOffchainMessageContentUtf8Of1232BytesMax, + assertIsOffchainMessageContentUtf8Of65535BytesMax: () => assertIsOffchainMessageContentUtf8Of65535BytesMax, + assertIsOffchainMessageRestrictedAsciiOf1232BytesMax: () => assertIsOffchainMessageRestrictedAsciiOf1232BytesMax, + assertIsOffchainMessageUtf8Of1232BytesMax: () => assertIsOffchainMessageUtf8Of1232BytesMax, + assertIsOffchainMessageUtf8Of65535BytesMax: () => assertIsOffchainMessageUtf8Of65535BytesMax, + assertIsParallelInstructionPlan: () => assertIsParallelInstructionPlan, + assertIsParallelTransactionPlan: () => assertIsParallelTransactionPlan, + assertIsParallelTransactionPlanResult: () => assertIsParallelTransactionPlanResult, + assertIsProgramDerivedAddress: () => assertIsProgramDerivedAddress, + assertIsSendableTransaction: () => assertIsSendableTransaction, + assertIsSequentialInstructionPlan: () => assertIsSequentialInstructionPlan, + assertIsSequentialTransactionPlan: () => assertIsSequentialTransactionPlan, + assertIsSequentialTransactionPlanResult: () => assertIsSequentialTransactionPlanResult, + assertIsSignature: () => assertIsSignature, + assertIsSignatureBytes: () => assertIsSignatureBytes, + assertIsSingleInstructionPlan: () => assertIsSingleInstructionPlan, + assertIsSingleTransactionPlan: () => assertIsSingleTransactionPlan, + assertIsSingleTransactionPlanResult: () => assertIsSingleTransactionPlanResult, + assertIsStringifiedBigInt: () => assertIsStringifiedBigInt, + assertIsStringifiedNumber: () => assertIsStringifiedNumber, + assertIsSuccessfulSingleTransactionPlanResult: () => assertIsSuccessfulSingleTransactionPlanResult, + assertIsSuccessfulTransactionPlanResult: () => assertIsSuccessfulTransactionPlanResult, + assertIsTransactionMessageWithBlockhashLifetime: () => assertIsTransactionMessageWithBlockhashLifetime, + assertIsTransactionMessageWithDurableNonceLifetime: () => assertIsTransactionMessageWithDurableNonceLifetime, + assertIsTransactionMessageWithSingleSendingSigner: () => assertIsTransactionMessageWithSingleSendingSigner, + assertIsTransactionMessageWithinSizeLimit: () => assertIsTransactionMessageWithinSizeLimit, + assertIsTransactionModifyingSigner: () => assertIsTransactionModifyingSigner, + assertIsTransactionPartialSigner: () => assertIsTransactionPartialSigner, + assertIsTransactionSendingSigner: () => assertIsTransactionSendingSigner, + assertIsTransactionSigner: () => assertIsTransactionSigner, + assertIsTransactionWithBlockhashLifetime: () => assertIsTransactionWithBlockhashLifetime, + assertIsTransactionWithDurableNonceLifetime: () => assertIsTransactionWithDurableNonceLifetime, + assertIsTransactionWithinSizeLimit: () => assertIsTransactionWithinSizeLimit, + assertIsUnixTimestamp: () => assertIsUnixTimestamp, + assertIsVariableSize: () => assertIsVariableSize, + assertNumberIsBetweenForCodec: () => assertNumberIsBetweenForCodec, + assertValidBaseString: () => assertValidBaseString, + assertValidNumberOfItemsForCodec: () => assertValidNumberOfItemsForCodec, + blockhash: () => blockhash, + bytesEqual: () => bytesEqual, + canceledSingleTransactionPlanResult: () => canceledSingleTransactionPlanResult, + combineCodec: () => combineCodec, + commitmentComparator: () => commitmentComparator, + compileOffchainMessageEnvelope: () => compileOffchainMessageEnvelope, + compileOffchainMessageV0Envelope: () => compileOffchainMessageV0Envelope, + compileOffchainMessageV1Envelope: () => compileOffchainMessageV1Envelope, + compileTransaction: () => compileTransaction, + compileTransactionMessage: () => compileTransactionMessage, + compressTransactionMessageUsingAddressLookupTables: () => compressTransactionMessageUsingAddressLookupTables, + containsBytes: () => containsBytes, + createAddressWithSeed: () => createAddressWithSeed, + createCodec: () => createCodec, + createDecoder: () => createDecoder, + createDecoderThatConsumesEntireByteArray: () => createDecoderThatConsumesEntireByteArray, + createDefaultRpcSubscriptionsChannelCreator: () => createDefaultRpcSubscriptionsChannelCreator, + createDefaultRpcSubscriptionsTransport: () => createDefaultRpcSubscriptionsTransport, + createDefaultRpcTransport: () => createDefaultRpcTransport, + createDefaultSolanaRpcSubscriptionsChannelCreator: () => createDefaultSolanaRpcSubscriptionsChannelCreator, + createEmptyClient: () => createEmptyClient, + createEncoder: () => createEncoder, + createJsonRpcApi: () => createJsonRpcApi, + createKeyPairFromBytes: () => createKeyPairFromBytes, + createKeyPairFromPrivateKeyBytes: () => createKeyPairFromPrivateKeyBytes, + createKeyPairSignerFromBytes: () => createKeyPairSignerFromBytes, + createKeyPairSignerFromPrivateKeyBytes: () => createKeyPairSignerFromPrivateKeyBytes, + createNoopSigner: () => createNoopSigner, + createPrivateKeyFromBytes: () => createPrivateKeyFromBytes, + createRpc: () => createRpc, + createRpcMessage: () => createRpcMessage, + createRpcSubscriptionsApi: () => createRpcSubscriptionsApi, + createRpcSubscriptionsTransportFromChannelCreator: () => createRpcSubscriptionsTransportFromChannelCreator, + createSignableMessage: () => createSignableMessage, + createSignerFromKeyPair: () => createSignerFromKeyPair, + createSolanaRpc: () => createSolanaRpc, + createSolanaRpcApi: () => createSolanaRpcApi, + createSolanaRpcFromTransport: () => createSolanaRpcFromTransport, + createSolanaRpcSubscriptions: () => createSolanaRpcSubscriptions, + createSolanaRpcSubscriptionsApi: () => createSolanaRpcSubscriptionsApi, + createSolanaRpcSubscriptionsApi_UNSTABLE: () => createSolanaRpcSubscriptionsApi_UNSTABLE, + createSolanaRpcSubscriptionsFromTransport: () => createSolanaRpcSubscriptionsFromTransport, + createSolanaRpcSubscriptions_UNSTABLE: () => createSolanaRpcSubscriptions_UNSTABLE, + createSubscriptionRpc: () => createSubscriptionRpc, + createTransactionMessage: () => createTransactionMessage, + createTransactionPlanExecutor: () => createTransactionPlanExecutor, + createTransactionPlanner: () => createTransactionPlanner, + decodeAccount: () => decodeAccount, + decompileTransactionMessage: () => decompileTransactionMessage, + decompileTransactionMessageFetchingLookupTables: () => decompileTransactionMessageFetchingLookupTables, + devnet: () => devnet, + downgradeRoleToNonSigner: () => downgradeRoleToNonSigner, + downgradeRoleToReadonly: () => downgradeRoleToReadonly, + everyInstructionPlan: () => everyInstructionPlan, + everyTransactionPlan: () => everyTransactionPlan, + everyTransactionPlanResult: () => everyTransactionPlanResult, + executeRpcPubSubSubscriptionPlan: () => executeRpcPubSubSubscriptionPlan, + failedSingleTransactionPlanResult: () => failedSingleTransactionPlanResult, + fetchAddressesForLookupTables: () => fetchAddressesForLookupTables, + fetchEncodedAccount: () => fetchEncodedAccount, + fetchEncodedAccounts: () => fetchEncodedAccounts, + fetchJsonParsedAccount: () => fetchJsonParsedAccount, + fetchJsonParsedAccounts: () => fetchJsonParsedAccounts, + findInstructionPlan: () => findInstructionPlan, + findTransactionPlan: () => findTransactionPlan, + findTransactionPlanResult: () => findTransactionPlanResult, + fixBytes: () => fixBytes, + fixCodecSize: () => fixCodecSize, + fixDecoderSize: () => fixDecoderSize, + fixEncoderSize: () => fixEncoderSize, + flattenInstructionPlan: () => flattenInstructionPlan, + flattenTransactionPlan: () => flattenTransactionPlan, + flattenTransactionPlanResult: () => flattenTransactionPlanResult, + generateKeyPair: () => generateKeyPair, + generateKeyPairSigner: () => generateKeyPairSigner, + getAddressCodec: () => getAddressCodec, + getAddressComparator: () => getAddressComparator, + getAddressDecoder: () => getAddressDecoder, + getAddressEncoder: () => getAddressEncoder, + getAddressFromPublicKey: () => getAddressFromPublicKey, + getAllSingleTransactionPlans: () => getAllSingleTransactionPlans, + getArrayCodec: () => getArrayCodec, + getArrayDecoder: () => getArrayDecoder, + getArrayEncoder: () => getArrayEncoder, + getBase10Codec: () => getBase10Codec, + getBase10Decoder: () => getBase10Decoder, + getBase10Encoder: () => getBase10Encoder, + getBase16Codec: () => getBase16Codec, + getBase16Decoder: () => getBase16Decoder, + getBase16Encoder: () => getBase16Encoder, + getBase58Codec: () => getBase58Codec, + getBase58Decoder: () => getBase58Decoder, + getBase58Encoder: () => getBase58Encoder, + getBase64Codec: () => getBase64Codec, + getBase64Decoder: () => getBase64Decoder, + getBase64EncodedWireTransaction: () => getBase64EncodedWireTransaction, + getBase64Encoder: () => getBase64Encoder, + getBaseXCodec: () => getBaseXCodec, + getBaseXDecoder: () => getBaseXDecoder, + getBaseXEncoder: () => getBaseXEncoder, + getBaseXResliceCodec: () => getBaseXResliceCodec, + getBaseXResliceDecoder: () => getBaseXResliceDecoder, + getBaseXResliceEncoder: () => getBaseXResliceEncoder, + getBitArrayCodec: () => getBitArrayCodec, + getBitArrayDecoder: () => getBitArrayDecoder, + getBitArrayEncoder: () => getBitArrayEncoder, + getBlockhashCodec: () => getBlockhashCodec, + getBlockhashComparator: () => getBlockhashComparator, + getBlockhashDecoder: () => getBlockhashDecoder, + getBlockhashEncoder: () => getBlockhashEncoder, + getBooleanCodec: () => getBooleanCodec, + getBooleanDecoder: () => getBooleanDecoder, + getBooleanEncoder: () => getBooleanEncoder, + getBytesCodec: () => getBytesCodec, + getBytesDecoder: () => getBytesDecoder, + getBytesEncoder: () => getBytesEncoder, + getChannelPoolingChannelCreator: () => getChannelPoolingChannelCreator, + getCompiledTransactionMessageCodec: () => getCompiledTransactionMessageCodec, + getCompiledTransactionMessageDecoder: () => getCompiledTransactionMessageDecoder, + getCompiledTransactionMessageEncoder: () => getCompiledTransactionMessageEncoder, + getConstantCodec: () => getConstantCodec, + getConstantDecoder: () => getConstantDecoder, + getConstantEncoder: () => getConstantEncoder, + getDefaultLamportsCodec: () => getDefaultLamportsCodec, + getDefaultLamportsDecoder: () => getDefaultLamportsDecoder, + getDefaultLamportsEncoder: () => getDefaultLamportsEncoder, + getDiscriminatedUnionCodec: () => getDiscriminatedUnionCodec, + getDiscriminatedUnionDecoder: () => getDiscriminatedUnionDecoder, + getDiscriminatedUnionEncoder: () => getDiscriminatedUnionEncoder, + getEncodedSize: () => getEncodedSize, + getEnumCodec: () => getEnumCodec, + getEnumDecoder: () => getEnumDecoder, + getEnumEncoder: () => getEnumEncoder, + getF32Codec: () => getF32Codec, + getF32Decoder: () => getF32Decoder, + getF32Encoder: () => getF32Encoder, + getF64Codec: () => getF64Codec, + getF64Decoder: () => getF64Decoder, + getF64Encoder: () => getF64Encoder, + getFirstFailedSingleTransactionPlanResult: () => getFirstFailedSingleTransactionPlanResult, + getHiddenPrefixCodec: () => getHiddenPrefixCodec, + getHiddenPrefixDecoder: () => getHiddenPrefixDecoder, + getHiddenPrefixEncoder: () => getHiddenPrefixEncoder, + getHiddenSuffixCodec: () => getHiddenSuffixCodec, + getHiddenSuffixDecoder: () => getHiddenSuffixDecoder, + getHiddenSuffixEncoder: () => getHiddenSuffixEncoder, + getI128Codec: () => getI128Codec, + getI128Decoder: () => getI128Decoder, + getI128Encoder: () => getI128Encoder, + getI16Codec: () => getI16Codec, + getI16Decoder: () => getI16Decoder, + getI16Encoder: () => getI16Encoder, + getI32Codec: () => getI32Codec, + getI32Decoder: () => getI32Decoder, + getI32Encoder: () => getI32Encoder, + getI64Codec: () => getI64Codec, + getI64Decoder: () => getI64Decoder, + getI64Encoder: () => getI64Encoder, + getI8Codec: () => getI8Codec, + getI8Decoder: () => getI8Decoder, + getI8Encoder: () => getI8Encoder, + getLamportsCodec: () => getLamportsCodec, + getLamportsDecoder: () => getLamportsDecoder, + getLamportsEncoder: () => getLamportsEncoder, + getLinearMessagePackerInstructionPlan: () => getLinearMessagePackerInstructionPlan, + getLiteralUnionCodec: () => getLiteralUnionCodec, + getLiteralUnionDecoder: () => getLiteralUnionDecoder, + getLiteralUnionEncoder: () => getLiteralUnionEncoder, + getMapCodec: () => getMapCodec, + getMapDecoder: () => getMapDecoder, + getMapEncoder: () => getMapEncoder, + getMessagePackerInstructionPlanFromInstructions: () => getMessagePackerInstructionPlanFromInstructions, + getMinimumBalanceForRentExemption: () => getMinimumBalanceForRentExemption, + getNullableCodec: () => getNullableCodec, + getNullableDecoder: () => getNullableDecoder, + getNullableEncoder: () => getNullableEncoder, + getOffchainMessageApplicationDomainCodec: () => getOffchainMessageApplicationDomainCodec, + getOffchainMessageApplicationDomainDecoder: () => getOffchainMessageApplicationDomainDecoder, + getOffchainMessageApplicationDomainEncoder: () => getOffchainMessageApplicationDomainEncoder, + getOffchainMessageCodec: () => getOffchainMessageCodec, + getOffchainMessageDecoder: () => getOffchainMessageDecoder, + getOffchainMessageEncoder: () => getOffchainMessageEncoder, + getOffchainMessageEnvelopeCodec: () => getOffchainMessageEnvelopeCodec, + getOffchainMessageEnvelopeDecoder: () => getOffchainMessageEnvelopeDecoder, + getOffchainMessageEnvelopeEncoder: () => getOffchainMessageEnvelopeEncoder, + getOffchainMessageV0Codec: () => getOffchainMessageV0Codec, + getOffchainMessageV0Decoder: () => getOffchainMessageV0Decoder, + getOffchainMessageV0Encoder: () => getOffchainMessageV0Encoder, + getOffchainMessageV1Codec: () => getOffchainMessageV1Codec, + getOffchainMessageV1Decoder: () => getOffchainMessageV1Decoder, + getOffchainMessageV1Encoder: () => getOffchainMessageV1Encoder, + getOptionCodec: () => getOptionCodec, + getOptionDecoder: () => getOptionDecoder, + getOptionEncoder: () => getOptionEncoder, + getProgramDerivedAddress: () => getProgramDerivedAddress, + getPublicKeyFromAddress: () => getPublicKeyFromAddress, + getPublicKeyFromPrivateKey: () => getPublicKeyFromPrivateKey, + getReallocMessagePackerInstructionPlan: () => getReallocMessagePackerInstructionPlan, + getRpcSubscriptionsChannelWithAutoping: () => getRpcSubscriptionsChannelWithAutoping, + getRpcSubscriptionsChannelWithBigIntJSONSerialization: () => getRpcSubscriptionsChannelWithBigIntJSONSerialization, + getRpcSubscriptionsChannelWithJSONSerialization: () => getRpcSubscriptionsChannelWithJSONSerialization, + getRpcSubscriptionsTransportWithSubscriptionCoalescing: () => getRpcSubscriptionsTransportWithSubscriptionCoalescing, + getSetCodec: () => getSetCodec, + getSetDecoder: () => getSetDecoder, + getSetEncoder: () => getSetEncoder, + getShortU16Codec: () => getShortU16Codec, + getShortU16Decoder: () => getShortU16Decoder, + getShortU16Encoder: () => getShortU16Encoder, + getSignatureFromTransaction: () => getSignatureFromTransaction, + getSignersFromInstruction: () => getSignersFromInstruction, + getSignersFromOffchainMessage: () => getSignersFromOffchainMessage, + getSignersFromTransactionMessage: () => getSignersFromTransactionMessage, + getSolanaErrorFromInstructionError: () => getSolanaErrorFromInstructionError, + getSolanaErrorFromJsonRpcError: () => getSolanaErrorFromJsonRpcError, + getSolanaErrorFromTransactionError: () => getSolanaErrorFromTransactionError, + getStructCodec: () => getStructCodec, + getStructDecoder: () => getStructDecoder, + getStructEncoder: () => getStructEncoder, + getTransactionCodec: () => getTransactionCodec, + getTransactionDecoder: () => getTransactionDecoder, + getTransactionEncoder: () => getTransactionEncoder, + getTransactionLifetimeConstraintFromCompiledTransactionMessage: () => getTransactionLifetimeConstraintFromCompiledTransactionMessage, + getTransactionMessageSize: () => getTransactionMessageSize, + getTransactionSize: () => getTransactionSize, + getTransactionVersionCodec: () => getTransactionVersionCodec, + getTransactionVersionDecoder: () => getTransactionVersionDecoder, + getTransactionVersionEncoder: () => getTransactionVersionEncoder, + getTupleCodec: () => getTupleCodec, + getTupleDecoder: () => getTupleDecoder, + getTupleEncoder: () => getTupleEncoder, + getU128Codec: () => getU128Codec, + getU128Decoder: () => getU128Decoder, + getU128Encoder: () => getU128Encoder, + getU16Codec: () => getU16Codec, + getU16Decoder: () => getU16Decoder, + getU16Encoder: () => getU16Encoder, + getU32Codec: () => getU32Codec, + getU32Decoder: () => getU32Decoder, + getU32Encoder: () => getU32Encoder, + getU64Codec: () => getU64Codec, + getU64Decoder: () => getU64Decoder, + getU64Encoder: () => getU64Encoder, + getU8Codec: () => getU8Codec, + getU8Decoder: () => getU8Decoder, + getU8Encoder: () => getU8Encoder, + getUnionCodec: () => getUnionCodec, + getUnionDecoder: () => getUnionDecoder, + getUnionEncoder: () => getUnionEncoder, + getUnitCodec: () => getUnitCodec, + getUnitDecoder: () => getUnitDecoder, + getUnitEncoder: () => getUnitEncoder, + getUtf8Codec: () => getUtf8Codec, + getUtf8Decoder: () => getUtf8Decoder, + getUtf8Encoder: () => getUtf8Encoder, + isAddress: () => isAddress2, + isAdvanceNonceAccountInstruction: () => isAdvanceNonceAccountInstruction, + isBlockhash: () => isBlockhash, + isCanceledSingleTransactionPlanResult: () => isCanceledSingleTransactionPlanResult, + isFailedSingleTransactionPlanResult: () => isFailedSingleTransactionPlanResult, + isFixedSize: () => isFixedSize, + isFullySignedOffchainMessageEnvelope: () => isFullySignedOffchainMessageEnvelope, + isFullySignedTransaction: () => isFullySignedTransaction, + isInstructionForProgram: () => isInstructionForProgram, + isInstructionWithAccounts: () => isInstructionWithAccounts, + isInstructionWithData: () => isInstructionWithData, + isJsonRpcPayload: () => isJsonRpcPayload, + isKeyPairSigner: () => isKeyPairSigner, + isLamports: () => isLamports, + isMessageModifyingSigner: () => isMessageModifyingSigner, + isMessagePackerInstructionPlan: () => isMessagePackerInstructionPlan, + isMessagePartialSigner: () => isMessagePartialSigner, + isMessageSigner: () => isMessageSigner, + isNonDivisibleSequentialInstructionPlan: () => isNonDivisibleSequentialInstructionPlan, + isNonDivisibleSequentialTransactionPlan: () => isNonDivisibleSequentialTransactionPlan, + isNonDivisibleSequentialTransactionPlanResult: () => isNonDivisibleSequentialTransactionPlanResult, + isNone: () => isNone, + isOffCurveAddress: () => isOffCurveAddress, + isOffchainMessageApplicationDomain: () => isOffchainMessageApplicationDomain, + isOffchainMessageContentRestrictedAsciiOf1232BytesMax: () => isOffchainMessageContentRestrictedAsciiOf1232BytesMax, + isOffchainMessageContentUtf8Of1232BytesMax: () => isOffchainMessageContentUtf8Of1232BytesMax, + isOffchainMessageContentUtf8Of65535BytesMax: () => isOffchainMessageContentUtf8Of65535BytesMax, + isOption: () => isOption, + isParallelInstructionPlan: () => isParallelInstructionPlan, + isParallelTransactionPlan: () => isParallelTransactionPlan, + isParallelTransactionPlanResult: () => isParallelTransactionPlanResult, + isProgramDerivedAddress: () => isProgramDerivedAddress, + isProgramError: () => isProgramError, + isSendableTransaction: () => isSendableTransaction, + isSequentialInstructionPlan: () => isSequentialInstructionPlan, + isSequentialTransactionPlan: () => isSequentialTransactionPlan, + isSequentialTransactionPlanResult: () => isSequentialTransactionPlanResult, + isSignature: () => isSignature, + isSignatureBytes: () => isSignatureBytes, + isSignerRole: () => isSignerRole, + isSingleInstructionPlan: () => isSingleInstructionPlan, + isSingleTransactionPlan: () => isSingleTransactionPlan, + isSingleTransactionPlanResult: () => isSingleTransactionPlanResult, + isSolanaError: () => isSolanaError, + isSome: () => isSome, + isStringifiedBigInt: () => isStringifiedBigInt, + isStringifiedNumber: () => isStringifiedNumber, + isSuccessfulSingleTransactionPlanResult: () => isSuccessfulSingleTransactionPlanResult, + isSuccessfulTransactionPlanResult: () => isSuccessfulTransactionPlanResult, + isTransactionMessageWithBlockhashLifetime: () => isTransactionMessageWithBlockhashLifetime, + isTransactionMessageWithDurableNonceLifetime: () => isTransactionMessageWithDurableNonceLifetime, + isTransactionMessageWithSingleSendingSigner: () => isTransactionMessageWithSingleSendingSigner, + isTransactionMessageWithinSizeLimit: () => isTransactionMessageWithinSizeLimit, + isTransactionModifyingSigner: () => isTransactionModifyingSigner, + isTransactionPartialSigner: () => isTransactionPartialSigner, + isTransactionSendingSigner: () => isTransactionSendingSigner, + isTransactionSigner: () => isTransactionSigner, + isTransactionWithBlockhashLifetime: () => isTransactionWithBlockhashLifetime, + isTransactionWithDurableNonceLifetime: () => isTransactionWithDurableNonceLifetime, + isTransactionWithinSizeLimit: () => isTransactionWithinSizeLimit, + isUnixTimestamp: () => isUnixTimestamp, + isVariableSize: () => isVariableSize, + isWritableRole: () => isWritableRole, + lamports: () => lamports, + mainnet: () => mainnet, + mergeBytes: () => mergeBytes, + mergeRoles: () => mergeRoles, + nonDivisibleSequentialInstructionPlan: () => nonDivisibleSequentialInstructionPlan, + nonDivisibleSequentialTransactionPlan: () => nonDivisibleSequentialTransactionPlan, + nonDivisibleSequentialTransactionPlanResult: () => nonDivisibleSequentialTransactionPlanResult, + none: () => none, + offCurveAddress: () => offCurveAddress, + offchainMessageApplicationDomain: () => offchainMessageApplicationDomain, + offchainMessageContentRestrictedAsciiOf1232BytesMax: () => offchainMessageContentRestrictedAsciiOf1232BytesMax, + offchainMessageContentUtf8Of1232BytesMax: () => offchainMessageContentUtf8Of1232BytesMax, + offchainMessageContentUtf8Of65535BytesMax: () => offchainMessageContentUtf8Of65535BytesMax, + offsetCodec: () => offsetCodec, + offsetDecoder: () => offsetDecoder, + offsetEncoder: () => offsetEncoder, + padBytes: () => padBytes2, + padLeftCodec: () => padLeftCodec, + padLeftDecoder: () => padLeftDecoder, + padLeftEncoder: () => padLeftEncoder, + padNullCharacters: () => padNullCharacters, + padRightCodec: () => padRightCodec, + padRightDecoder: () => padRightDecoder, + padRightEncoder: () => padRightEncoder, + parallelInstructionPlan: () => parallelInstructionPlan, + parallelTransactionPlan: () => parallelTransactionPlan, + parallelTransactionPlanResult: () => parallelTransactionPlanResult, + parseBase58RpcAccount: () => parseBase58RpcAccount, + parseBase64RpcAccount: () => parseBase64RpcAccount, + parseJsonRpcAccount: () => parseJsonRpcAccount, + partiallySignOffchainMessageEnvelope: () => partiallySignOffchainMessageEnvelope, + partiallySignOffchainMessageWithSigners: () => partiallySignOffchainMessageWithSigners, + partiallySignTransaction: () => partiallySignTransaction, + partiallySignTransactionMessageWithSigners: () => partiallySignTransactionMessageWithSigners, + passthroughFailedTransactionPlanExecution: () => passthroughFailedTransactionPlanExecution, + pipe: () => pipe, + prependTransactionMessageInstruction: () => prependTransactionMessageInstruction, + prependTransactionMessageInstructions: () => prependTransactionMessageInstructions, + removeNullCharacters: () => removeNullCharacters, + resizeCodec: () => resizeCodec, + resizeDecoder: () => resizeDecoder, + resizeEncoder: () => resizeEncoder, + reverseCodec: () => reverseCodec, + reverseDecoder: () => reverseDecoder, + reverseEncoder: () => reverseEncoder, + safeCaptureStackTrace: () => safeCaptureStackTrace, + sendAndConfirmDurableNonceTransactionFactory: () => sendAndConfirmDurableNonceTransactionFactory, + sendAndConfirmTransactionFactory: () => sendAndConfirmTransactionFactory, + sendTransactionWithoutConfirmingFactory: () => sendTransactionWithoutConfirmingFactory, + sequentialInstructionPlan: () => sequentialInstructionPlan, + sequentialTransactionPlan: () => sequentialTransactionPlan, + sequentialTransactionPlanResult: () => sequentialTransactionPlanResult, + setTransactionMessageFeePayer: () => setTransactionMessageFeePayer, + setTransactionMessageFeePayerSigner: () => setTransactionMessageFeePayerSigner, + setTransactionMessageLifetimeUsingBlockhash: () => setTransactionMessageLifetimeUsingBlockhash, + setTransactionMessageLifetimeUsingDurableNonce: () => setTransactionMessageLifetimeUsingDurableNonce, + signAndSendTransactionMessageWithSigners: () => signAndSendTransactionMessageWithSigners, + signBytes: () => signBytes, + signOffchainMessageEnvelope: () => signOffchainMessageEnvelope, + signOffchainMessageWithSigners: () => signOffchainMessageWithSigners, + signTransaction: () => signTransaction2, + signTransactionMessageWithSigners: () => signTransactionMessageWithSigners, + signature: () => signature, + signatureBytes: () => signatureBytes, + singleInstructionPlan: () => singleInstructionPlan, + singleTransactionPlan: () => singleTransactionPlan, + some: () => some, + stringifiedBigInt: () => stringifiedBigInt, + stringifiedNumber: () => stringifiedNumber, + successfulSingleTransactionPlanResult: () => successfulSingleTransactionPlanResult, + successfulSingleTransactionPlanResultFromSignature: () => successfulSingleTransactionPlanResultFromSignature, + summarizeTransactionPlanResult: () => summarizeTransactionPlanResult, + testnet: () => testnet, + toArrayBuffer: () => toArrayBuffer, + transformChannelInboundMessages: () => transformChannelInboundMessages, + transformChannelOutboundMessages: () => transformChannelOutboundMessages, + transformCodec: () => transformCodec, + transformDecoder: () => transformDecoder, + transformEncoder: () => transformEncoder, + transformInstructionPlan: () => transformInstructionPlan, + transformTransactionPlan: () => transformTransactionPlan, + transformTransactionPlanResult: () => transformTransactionPlanResult, + unixTimestamp: () => unixTimestamp, + unwrapOption: () => unwrapOption, + unwrapOptionRecursively: () => unwrapOptionRecursively, + unwrapSimulationError: () => unwrapSimulationError, + upgradeRoleToSigner: () => upgradeRoleToSigner, + upgradeRoleToWritable: () => upgradeRoleToWritable, + verifyOffchainMessageEnvelope: () => verifyOffchainMessageEnvelope, + verifySignature: () => verifySignature, + wrapNullable: () => wrapNullable +}); +async function requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({ + abortSignal, + commitment, + confirmSignatureOnlyTransaction, + lamports: lamports2, + recipientAddress, + rpc +}) { + const airdropTransactionSignature = await rpc.requestAirdrop(recipientAddress, lamports2, { commitment }).send({ abortSignal }); + await confirmSignatureOnlyTransaction({ + abortSignal, + commitment, + signature: airdropTransactionSignature + }); + return airdropTransactionSignature; +} +function airdropFactory({ + rpc, + rpcSubscriptions +}) { + const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({ + rpc, + rpcSubscriptions + }); + async function confirmSignatureOnlyTransaction(config) { + await waitForRecentTransactionConfirmationUntilTimeout({ + ...config, + getRecentSignatureConfirmationPromise, + getTimeoutPromise + }); } -}); - -// node_modules/undici/lib/dispatcher/round-robin-pool.js -var require_round_robin_pool = __commonJS({ - "node_modules/undici/lib/dispatcher/round-robin-pool.js"(exports, module) { - "use strict"; - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher, - kRemoveClient - } = require_pool_base(); - var Client = require_client(); - var { - InvalidArgumentError - } = require_errors(); - var util2 = require_util(); - var { kUrl } = require_symbols(); - var buildConnector = require_connect(); - var kOptions = /* @__PURE__ */ Symbol("options"); - var kConnections = /* @__PURE__ */ Symbol("connections"); - var kFactory = /* @__PURE__ */ Symbol("factory"); - var kIndex = /* @__PURE__ */ Symbol("index"); - function defaultFactory(origin, opts) { - return new Client(origin, opts); - } - var RoundRobinPool = class extends PoolBase { - constructor(origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - clientTtl, - ...options - } = {}) { - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError("invalid connections"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (typeof connect !== "function") { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect - }); - } - super(); - this[kConnections] = connections || null; - this[kUrl] = util2.parseOrigin(origin); - this[kOptions] = { ...util2.deepClone(options), connect, allowH2, clientTtl, socketPath }; - this[kFactory] = factory; - this[kIndex] = -1; - this.on("connect", (origin2, targets) => { - if (clientTtl != null && clientTtl > 0) { - for (const target of targets) { - Object.assign(target, { ttl: Date.now() }); - } - } - }); - this.on("connectionError", (origin2, targets, error) => { - for (const target of targets) { - const idx = this[kClients].indexOf(target); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - } - }); - } - [kGetDispatcher]() { - const clientTtlOption = this[kOptions].clientTtl; - const clientsLength = this[kClients].length; - if (clientsLength === 0) { - const dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); - return dispatcher; - } - let checked = 0; - while (checked < clientsLength) { - this[kIndex] = (this[kIndex] + 1) % clientsLength; - const client = this[kClients][this[kIndex]]; - if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && Date.now() - client.ttl > clientTtlOption) { - this[kRemoveClient](client); - checked++; - continue; - } - if (!client[kNeedDrain]) { - return client; - } - checked++; - } - if (!this[kConnections] || clientsLength < this[kConnections]) { - const dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); - return dispatcher; - } - } + return async function airdrop(config) { + return await requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({ + ...config, + confirmSignatureOnlyTransaction, + rpc + }); + }; +} +async function fetchAddressesForLookupTables(lookupTableAddresses, rpc, config) { + if (lookupTableAddresses.length === 0) { + return {}; + } + const fetchedLookupTables = await fetchJsonParsedAccounts( + rpc, + lookupTableAddresses, + config + ); + assertAccountsDecoded(fetchedLookupTables); + assertAccountsExist(fetchedLookupTables); + return fetchedLookupTables.reduce((acc, lookup) => { + return { + ...acc, + [lookup.address]: lookup.data.addresses + }; + }, {}); +} +async function decompileTransactionMessageFetchingLookupTables(compiledTransactionMessage, rpc, config) { + const lookupTables = "addressTableLookups" in compiledTransactionMessage && compiledTransactionMessage.addressTableLookups !== void 0 && compiledTransactionMessage.addressTableLookups.length > 0 ? compiledTransactionMessage.addressTableLookups : []; + const lookupTableAddresses = lookupTables.map((l2) => l2.lookupTableAddress); + const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {}; + const addressesByLookupTableAddress = lookupTableAddresses.length > 0 ? await fetchAddressesForLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig) : {}; + return decompileTransactionMessage(compiledTransactionMessage, { + addressesByLookupTableAddress, + lastValidBlockHeight + }); +} +function getMinimumBalanceForRentExemption(space) { + const RENT = { + ACCOUNT_STORAGE_OVERHEAD: 128n, + DEFAULT_EXEMPTION_THRESHOLD: 2n, + DEFAULT_LAMPORTS_PER_BYTE_YEAR: 3480n + }; + const requiredLamports = (RENT.ACCOUNT_STORAGE_OVERHEAD + space) * RENT.DEFAULT_LAMPORTS_PER_BYTE_YEAR * RENT.DEFAULT_EXEMPTION_THRESHOLD; + return requiredLamports; +} +function getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, config) { + if ( + // The developer has supplied no value for `preflightCommitment`. + !config?.preflightCommitment && // The value of `commitment` is lower than the server default of `preflightCommitment`. + commitmentComparator( + commitment, + "finalized" + /* default value of `preflightCommitment` */ + ) < 0 + ) { + return { + ...config, + // In the common case, it is unlikely that you want to simulate a transaction at + // `finalized` commitment when your standard of commitment for confirming the + // transaction is lower. Cap the simulation commitment level to the level of the + // confirmation commitment. + preflightCommitment: commitment }; - module.exports = RoundRobinPool; } -}); - -// node_modules/undici/lib/dispatcher/agent.js -var require_agent = __commonJS({ - "node_modules/undici/lib/dispatcher/agent.js"(exports, module) { - "use strict"; - var { InvalidArgumentError, MaxOriginsReachedError } = require_errors(); - var { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = require_symbols(); - var DispatcherBase = require_dispatcher_base(); - var Pool = require_pool(); - var Client = require_client(); - var util2 = require_util(); - var kOnConnect = /* @__PURE__ */ Symbol("onConnect"); - var kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); - var kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); - var kOnDrain = /* @__PURE__ */ Symbol("onDrain"); - var kFactory = /* @__PURE__ */ Symbol("factory"); - var kOptions = /* @__PURE__ */ Symbol("options"); - var kOrigins = /* @__PURE__ */ Symbol("origins"); - function defaultFactory(origin, opts) { - return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); - } - var Agent = class extends DispatcherBase { - constructor({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) { - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (typeof maxOrigins !== "number" || Number.isNaN(maxOrigins) || maxOrigins <= 0) { - throw new InvalidArgumentError("maxOrigins must be a number greater than 0"); - } - super(options); - if (connect && typeof connect !== "function") { - connect = { ...connect }; - } - this[kOptions] = { ...util2.deepClone(options), maxOrigins, connect }; - this[kFactory] = factory; - this[kClients] = /* @__PURE__ */ new Map(); - this[kOrigins] = /* @__PURE__ */ new Set(); - this[kOnDrain] = (origin, targets) => { - this.emit("drain", origin, [this, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - this.emit("connect", origin, [this, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - this.emit("disconnect", origin, [this, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - this.emit("connectionError", origin, [this, ...targets], err); - }; - } - get [kRunning]() { - let ret = 0; - for (const { dispatcher } of this[kClients].values()) { - ret += dispatcher[kRunning]; - } - return ret; - } - [kDispatch](opts, handler) { - let origin; - if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { - origin = String(opts.origin); - } else { - throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); - } - const allowH2 = opts.allowH2 ?? this[kOptions].allowH2; - const key = allowH2 === false ? `${origin}#http1-only` : origin; - if (this[kOrigins].size >= this[kOptions].maxOrigins && !this[kOrigins].has(origin)) { - throw new MaxOriginsReachedError(); - } - const result = this[kClients].get(key); - let dispatcher = result && result.dispatcher; - if (!dispatcher) { - const closeClientIfUnused = (connected) => { - const result2 = this[kClients].get(key); - if (result2) { - if (connected) result2.count -= 1; - if (result2.count <= 0) { - this[kClients].delete(key); - if (!result2.dispatcher.destroyed) { - result2.dispatcher.close(); - } - } - let hasOrigin = false; - for (const entry of this[kClients].values()) { - if (entry.origin === origin) { - hasOrigin = true; - break; - } - } - if (!hasOrigin) { - this[kOrigins].delete(origin); - } - } - }; - dispatcher = this[kFactory](opts.origin, allowH2 === false ? { ...this[kOptions], allowH2: false } : this[kOptions]).on("drain", this[kOnDrain]).on("connect", (origin2, targets) => { - const result2 = this[kClients].get(key); - if (result2) { - result2.count += 1; + return config; +} +async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ + abortSignal, + commitment, + rpc, + transaction, + ...sendTransactionConfig +}) { + const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction); + return await rpc.sendTransaction(base64EncodedWireTransaction, { + ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig), + encoding: "base64" + }).send({ abortSignal }); +} +async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ + abortSignal, + commitment, + confirmDurableNonceTransaction, + rpc, + transaction, + ...sendTransactionConfig +}) { + const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ + ...sendTransactionConfig, + abortSignal, + commitment, + rpc, + transaction + }); + await confirmDurableNonceTransaction({ + abortSignal, + commitment, + transaction + }); + return transactionSignature; +} +async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({ + abortSignal, + commitment, + confirmRecentTransaction, + rpc, + transaction, + ...sendTransactionConfig +}) { + const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ + ...sendTransactionConfig, + abortSignal, + commitment, + rpc, + transaction + }); + await confirmRecentTransaction({ + abortSignal, + commitment, + transaction + }); + return transactionSignature; +} +function sendAndConfirmDurableNonceTransactionFactory({ + rpc, + rpcSubscriptions +}) { + const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({ rpc, rpcSubscriptions }); + const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({ + rpc, + rpcSubscriptions + }); + function createNonceInvalidationPromiseHandlingRaceCondition(signature2) { + return async function wrappedGetNonceInvalidationPromise(config) { + try { + return await getNonceInvalidationPromise(config); + } catch (e7) { + if (isSolanaError(e7, SOLANA_ERROR__INVALID_NONCE)) { + let status; + try { + const { value: statuses } = await rpc.getSignatureStatuses([signature2]).send({ abortSignal: config.abortSignal }); + status = statuses[0]; + } catch { + throw e7; + } + if (status === null || status === void 0) { + throw e7; + } + if (status.confirmationStatus !== null && commitmentComparator(status.confirmationStatus, config.commitment) >= 0) { + if (status.err !== null) { + throw getSolanaErrorFromTransactionError(status.err); } - this[kOnConnect](origin2, targets); - }).on("disconnect", (origin2, targets, err) => { - closeClientIfUnused(true); - this[kOnDisconnect](origin2, targets, err); - }).on("connectionError", (origin2, targets, err) => { - closeClientIfUnused(false); - this[kOnConnectionError](origin2, targets, err); - }); - this[kClients].set(key, { count: 0, dispatcher, origin }); - this[kOrigins].add(origin); - } - return dispatcher.dispatch(opts, handler); - } - [kClose]() { - const closePromises = []; - for (const { dispatcher } of this[kClients].values()) { - closePromises.push(dispatcher.close()); - } - this[kClients].clear(); - return Promise.all(closePromises); - } - [kDestroy](err) { - const destroyPromises = []; - for (const { dispatcher } of this[kClients].values()) { - destroyPromises.push(dispatcher.destroy(err)); - } - this[kClients].clear(); - return Promise.all(destroyPromises); - } - get stats() { - const allClientStats = {}; - for (const { dispatcher } of this[kClients].values()) { - if (dispatcher.stats) { - allClientStats[dispatcher[kUrl].origin] = dispatcher.stats; + return; } + return await new Promise(() => { + }); } - return allClientStats; + throw e7; } }; - module.exports = Agent; + } + async function confirmDurableNonceTransaction(config) { + const wrappedGetNonceInvalidationPromise = createNonceInvalidationPromiseHandlingRaceCondition( + getSignatureFromTransaction(config.transaction) + ); + await waitForDurableNonceTransactionConfirmation({ + ...config, + getNonceInvalidationPromise: wrappedGetNonceInvalidationPromise, + getRecentSignatureConfirmationPromise + }); + } + return async function sendAndConfirmDurableNonceTransaction(transaction, config) { + await sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ + ...config, + confirmDurableNonceTransaction, + rpc, + transaction + }); + }; +} +function sendAndConfirmTransactionFactory({ + rpc, + rpcSubscriptions +}) { + const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({ + rpc, + rpcSubscriptions + }); + const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({ + rpc, + rpcSubscriptions + }); + async function confirmRecentTransaction(config) { + await waitForRecentTransactionConfirmation({ + ...config, + getBlockHeightExceedencePromise, + getRecentSignatureConfirmationPromise + }); + } + return async function sendAndConfirmTransaction(transaction, config) { + await sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({ + ...config, + confirmRecentTransaction, + rpc, + transaction + }); + }; +} +function sendTransactionWithoutConfirmingFactory({ + rpc +}) { + return async function sendTransactionWithoutConfirming(transaction, config) { + await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ + ...config, + rpc, + transaction + }); + }; +} +var init_index_node37 = __esm({ + "node_modules/@solana/kit/dist/index.node.mjs"() { + "use strict"; + init_index_node4(); + init_index_node4(); + init_index_node6(); + init_index_node10(); + init_index_node(); + init_index_node(); + init_index_node11(); + init_index_node12(); + init_index_node18(); + init_index_node15(); + init_index_node19(); + init_index_node20(); + init_index_node21(); + init_index_node28(); + init_index_node29(); + init_index_node34(); + init_index_node13(); + init_index_node13(); + init_index_node35(); + init_index_node14(); + init_index_node14(); + init_index_node16(); + init_index_node16(); + init_index_node36(); + init_index_node22(); } }); -// node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js -var require_dispatcher1_wrapper = __commonJS({ - "node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js"(exports, module) { +// src/wallet.ts +var wallet_exports = {}; +__export(wallet_exports, { + deriveAllKeys: () => deriveAllKeys, + deriveEvmKey: () => deriveEvmKey, + deriveSolanaKeyBytes: () => deriveSolanaKeyBytes, + generateWalletMnemonic: () => generateWalletMnemonic, + getSolanaAddress: () => getSolanaAddress, + isValidMnemonic: () => isValidMnemonic +}); +function generateWalletMnemonic() { + return generateMnemonic(wordlist, 256); +} +function isValidMnemonic(mnemonic) { + return validateMnemonic(mnemonic, wordlist); +} +function deriveEvmKey(mnemonic) { + const seed = mnemonicToSeedSync(mnemonic); + const hdKey = HDKey.fromMasterSeed(seed); + const derived = hdKey.derive(ETH_DERIVATION_PATH); + if (!derived.privateKey) throw new Error("Failed to derive EVM private key"); + const hex = `0x${Buffer.from(derived.privateKey).toString("hex")}`; + const account = privateKeyToAccount(hex); + return { privateKey: hex, address: account.address }; +} +function deriveSolanaKeyBytes(mnemonic) { + const seed = mnemonicToSeedSync(mnemonic); + let I = hmac(sha512, new TextEncoder().encode("ed25519 seed"), seed); + let key = I.slice(0, 32); + let chainCode = I.slice(32); + for (const index2 of SOLANA_HARDENED_INDICES) { + const data = new Uint8Array(37); + data[0] = 0; + data.set(key, 1); + data[33] = index2 >>> 24 & 255; + data[34] = index2 >>> 16 & 255; + data[35] = index2 >>> 8 & 255; + data[36] = index2 & 255; + I = hmac(sha512, chainCode, data); + key = I.slice(0, 32); + chainCode = I.slice(32); + } + return new Uint8Array(key); +} +function deriveAllKeys(mnemonic) { + const { privateKey: evmPrivateKey, address: evmAddress } = deriveEvmKey(mnemonic); + const solanaPrivateKeyBytes = deriveSolanaKeyBytes(mnemonic); + return { mnemonic, evmPrivateKey, evmAddress, solanaPrivateKeyBytes }; +} +async function getSolanaAddress(privateKeyBytes) { + const { createKeyPairSignerFromPrivateKeyBytes: createKeyPairSignerFromPrivateKeyBytes2 } = await Promise.resolve().then(() => (init_index_node37(), index_node_exports)); + const signer = await createKeyPairSignerFromPrivateKeyBytes2(privateKeyBytes); + return signer.address; +} +var ETH_DERIVATION_PATH, SOLANA_HARDENED_INDICES; +var init_wallet = __esm({ + "src/wallet.ts"() { "use strict"; - var Dispatcher = require_dispatcher(); - var { InvalidArgumentError } = require_errors(); - var { toRawHeaders } = require_util(); - var LegacyHandlerWrapper = class { - #handler; - constructor(handler) { - this.#handler = handler; - } - onRequestStart(controller, context) { - this.#handler.onConnect?.((reason) => controller.abort(reason), context); - } - onRequestUpgrade(controller, statusCode, headers, socket) { - const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {}); - this.#handler.onUpgrade?.(statusCode, rawHeaders, socket); - } - onResponseStart(controller, statusCode, headers, statusMessage) { - const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {}); - if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) { - controller.pause(); - } - } - onResponseData(controller, chunk) { - if (this.#handler.onData?.(chunk) === false) { - controller.pause(); - } - } - onResponseEnd(controller, trailers) { - const rawTrailers = controller?.rawTrailers ?? toRawHeaders(trailers ?? {}); - this.#handler.onComplete?.(rawTrailers); - } - onResponseError(_controller, err) { - if (!this.#handler.onError) { - throw err; - } - this.#handler.onError(err); - } - onBodySent(chunk) { - this.#handler.onBodySent?.(chunk); - } - onRequestSent() { - this.#handler.onRequestSent?.(); - } - onResponseStarted() { - this.#handler.onResponseStarted?.(); + init_bip32(); + init_esm3(); + init_english(); + init_hmac(); + init_sha2(); + init_accounts(); + ETH_DERIVATION_PATH = "m/44'/60'/0'/0/0"; + SOLANA_HARDENED_INDICES = [44 + 2147483648, 501 + 2147483648, 0 + 2147483648, 0 + 2147483648]; + } +}); + +// src/onchainos-adapter.ts +import { execFile, execFileSync } from "child_process"; +import { existsSync } from "fs"; +import { homedir as homedir3 } from "os"; +import { promisify } from "util"; +function resolveOnchainosBin(override) { + if (override) return override; + const env = process.env.XCLAWROUTER_ONCHAINOS_BIN ?? process.env.ONCHAINOS_BIN; + if (env) return env; + const fallback = FALLBACK_CANDIDATES.find((candidate) => existsSync(candidate)); + return fallback ?? DEFAULT_BIN; +} +async function runCli(bin, args, opts) { + try { + const { stdout } = await execFileAsync(bin, args, { + timeout: opts.timeoutMs, + maxBuffer: 8 * 1024 * 1024 + }); + return stdout; + } catch (err) { + throw wrapCliError(err, bin, args); + } +} +function wrapCliError(err, bin, args) { + const e7 = err; + if (e7.code === "ENOENT") { + return new OnchainOsCliError( + `onchainos CLI not found at "${bin}". Install OKX's agentic wallet CLI (https://web3.okx.com/onchainos) and ensure it is on PATH, or set XCLAWROUTER_ONCHAINOS_BIN to the binary location.` + ); + } + return new OnchainOsCliError( + `onchainos ${args.join(" ")} failed: ${e7.message}`, + e7.stderr, + typeof e7.code === "number" ? e7.code : null + ); +} +function parseJson(stdout, label) { + const trimmed = stdout.trim(); + if (!trimmed) { + throw new OnchainOsCliError(`onchainos ${label}: empty output`); + } + try { + return JSON.parse(trimmed); + } catch (err) { + throw new OnchainOsCliError( + `onchainos ${label}: invalid JSON output \u2014 ${err.message} +${trimmed.slice(0, 500)}` + ); + } +} +function unwrapData(parsed) { + if (parsed && typeof parsed === "object" && "data" in parsed) { + const inner = parsed.data; + if (inner !== void 0 && inner !== null) return inner; + } + return parsed; +} +function pickAddressString(value) { + if (!value) return void 0; + if (typeof value === "string") return value.trim() || void 0; + if (Array.isArray(value)) { + for (const item of value) { + const found = pickAddressString(item); + if (found) return found; + } + return void 0; + } + if (typeof value === "object") { + const obj = value; + for (const key of ["address", "evmAddress", "publicAddress", "value", "addr"]) { + const candidate = obj[key]; + if (typeof candidate === "string" && candidate.trim()) return candidate.trim(); + } + } + return void 0; +} +function pickEvmAddress(value) { + const addr = pickAddressString(value); + if (!addr || !addr.startsWith("0x") || addr.length !== 42) return void 0; + return addr; +} +var execFileAsync, DEFAULT_BIN, DEFAULT_TIMEOUT_MS, PAYMENT_TIMEOUT_MS, FALLBACK_CANDIDATES, OnchainOsCliError, OnchainOsAdapter; +var init_onchainos_adapter = __esm({ + "src/onchainos-adapter.ts"() { + "use strict"; + execFileAsync = promisify(execFile); + DEFAULT_BIN = "onchainos"; + DEFAULT_TIMEOUT_MS = 3e4; + PAYMENT_TIMEOUT_MS = 3e4; + FALLBACK_CANDIDATES = [ + `${homedir3()}/.local/bin/onchainos`, + "/opt/homebrew/bin/onchainos", + "/usr/local/bin/onchainos" + ]; + OnchainOsCliError = class extends Error { + constructor(message, stderr, exitCode) { + super(message); + this.stderr = stderr; + this.exitCode = exitCode; + this.name = "OnchainOsCliError"; } }; - var Dispatcher1Wrapper = class _Dispatcher1Wrapper extends Dispatcher { - #dispatcher; - constructor(dispatcher) { - super(); - if (!dispatcher || typeof dispatcher.dispatch !== "function") { - throw new InvalidArgumentError("Argument dispatcher must implement dispatch"); - } - this.#dispatcher = dispatcher; - } - static wrapHandler(handler) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - if (typeof handler.onRequestStart === "function") { - return handler; - } - return new LegacyHandlerWrapper(handler); + OnchainOsAdapter = class { + bin; + timeoutMs; + constructor(opts = {}) { + this.bin = resolveOnchainosBin(opts.bin); + this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS; } - dispatch(opts, handler) { - if (opts.allowH2 !== false) { - opts = { ...opts, allowH2: false }; + /** Quick, synchronous probe — does the binary exist and respond to --version? */ + isInstalled() { + try { + execFileSync(this.bin, ["--version"], { + encoding: "utf-8", + stdio: "pipe", + timeout: 5e3 + }); + return true; + } catch { + return false; } - return this.#dispatcher.dispatch(opts, _Dispatcher1Wrapper.wrapHandler(handler)); } - close(...args) { - return this.#dispatcher.close(...args); - } - destroy(...args) { - return this.#dispatcher.destroy(...args); + async status() { + const stdout = await runCli(this.bin, ["wallet", "status"], { + timeoutMs: this.timeoutMs + }); + const raw = unwrapData(parseJson(stdout, "wallet status")); + const loggedIn = Boolean(raw.loggedIn ?? raw.connected); + const evmAddress = raw.evmAddress ?? raw.evm; + const solanaAddress = raw.solanaAddress ?? raw.solana; + return { + loggedIn, + email: raw.email, + evmAddress: evmAddress?.startsWith("0x") ? evmAddress : void 0, + solanaAddress + }; } - }; - module.exports = Dispatcher1Wrapper; - } -}); - -// node_modules/undici/lib/core/socks5-utils.js -var require_socks5_utils = __commonJS({ - "node_modules/undici/lib/core/socks5-utils.js"(exports, module) { - "use strict"; - var { Buffer: Buffer2 } = __require("buffer"); - var net = __require("net"); - var { InvalidArgumentError } = require_errors(); - function parseAddress(address2) { - if (net.isIPv4(address2)) { - const parts = address2.split(".").map(Number); + /** + * Fetch the wallet's addresses across chains. Use this as a fallback when + * `wallet status` doesn't include `evmAddress` — some onchainos builds omit + * the address from status but still expose it via `wallet addresses`. + * + * Tolerates the three shapes onchainos has shipped for each chain entry: + * - bare string: `"0xabc..."` + * - array of strings: `["0xabc...", "0xdef..."]` + * - array of objects: `[{ address: "0xabc...", chain: "base" }, ...]` + */ + async addresses() { + const stdout = await runCli(this.bin, ["wallet", "addresses"], { + timeoutMs: this.timeoutMs + }); + const raw = unwrapData(parseJson(stdout, "wallet addresses")); return { - type: 1, - // IPv4 - buffer: Buffer2.from(parts) + evm: pickEvmAddress(raw.evm ?? raw.base), + xlayer: pickEvmAddress(raw.xlayer), + solana: pickAddressString(raw.solana) }; } - if (net.isIPv6(address2)) { + async login(email) { + if (!email.includes("@")) { + throw new Error(`Invalid email address: ${email}`); + } + await runCli(this.bin, ["wallet", "login", email], { timeoutMs: 5 * 6e4 }); + } + async logout() { + await runCli(this.bin, ["wallet", "logout"], { timeoutMs: this.timeoutMs }); + } + /** + * Sign an x402 payment via onchainos. Pass through the full `accepts` array + * from the 402 response — onchainos picks the chain/scheme it can satisfy. + */ + async signX402Payment(accepts) { + const acceptsJson = JSON.stringify(accepts); + const stdout = await runCli(this.bin, ["payment", "x402-pay", "--accepts", acceptsJson], { + timeoutMs: PAYMENT_TIMEOUT_MS + }); + const parsed = parseJson(stdout, "payment x402-pay"); + const result = unwrapData(parsed); + if (!result.signature || typeof result.signature !== "string") { + throw new OnchainOsCliError( + `onchainos payment x402-pay returned no signature: ${JSON.stringify(parsed).slice(0, 500)}` + ); + } + if (!result.authorization || typeof result.authorization !== "object") { + throw new OnchainOsCliError( + `onchainos payment x402-pay returned no authorization: ${JSON.stringify(parsed).slice(0, 500)}` + ); + } return { - type: 4, - // IPv6 - buffer: parseIPv6(address2) + signature: result.signature, + authorization: result.authorization, + sessionCert: typeof result.sessionCert === "string" ? result.sessionCert : void 0 }; } - const domainBuffer = Buffer2.from(address2, "utf8"); - if (domainBuffer.length > 255) { - throw new InvalidArgumentError("Domain name too long (max 255 bytes)"); - } - return { - type: 3, - // Domain - buffer: Buffer2.concat([Buffer2.from([domainBuffer.length]), domainBuffer]) - }; + }; + } +}); + +// src/auth.ts +var auth_exports = {}; +__export(auth_exports, { + CHAIN_FILE: () => CHAIN_FILE, + MNEMONIC_FILE: () => MNEMONIC_FILE, + ONCHAINOS_DOWNLOAD_URL: () => ONCHAINOS_DOWNLOAD_URL, + ONCHAINOS_INSTALLER_URL: () => ONCHAINOS_INSTALLER_URL, + OnchainOsRequiredError: () => OnchainOsRequiredError, + WALLET_DIR: () => WALLET_DIR, + WALLET_FILE: () => WALLET_FILE, + detectOnchainosWallet: () => detectOnchainosWallet, + envKeyAuth: () => envKeyAuth, + formatAgenticWalletStatus: () => formatAgenticWalletStatus, + loadPaymentChain: () => loadPaymentChain, + recoverWalletFromMnemonic: () => recoverWalletFromMnemonic, + resolveOrGenerateWalletKey: () => resolveOrGenerateWalletKey, + resolvePaymentChain: () => resolvePaymentChain, + savePaymentChain: () => savePaymentChain, + setupSolana: () => setupSolana, + walletKeyAuth: () => walletKeyAuth +}); +import { writeFile, mkdir as mkdir2 } from "fs/promises"; +import { join as join6 } from "path"; +import { homedir as homedir4 } from "os"; +function errorReason(err) { + if (err instanceof Error) return err.message; + return String(err); +} +async function detectOnchainosWallet() { + const adapter = new OnchainOsAdapter(); + if (!adapter.isInstalled()) return { kind: "no-binary" }; + let status; + try { + status = await adapter.status(); + } catch (err) { + return { kind: "status-error", reason: errorReason(err) }; + } + if (!status.loggedIn) return { kind: "not-logged-in" }; + let evmAddress = status.evmAddress; + if (!evmAddress) { + try { + const addresses = await adapter.addresses(); + if (addresses.evm) evmAddress = addresses.evm; + } catch (err) { + return { kind: "addresses-error", reason: errorReason(err) }; } - function parseIPv6(address2) { - const buffer2 = Buffer2.alloc(16); - const parts = address2.split(":"); - let partIndex = 0; - let bufferIndex = 0; - const doubleColonIndex = address2.indexOf("::"); - if (doubleColonIndex !== -1) { - const nonEmptyParts = parts.filter((p) => p.length > 0).length; - const skipParts = 8 - nonEmptyParts; - for (let i = 0; i < parts.length; i++) { - if (parts[i] === "" && i === doubleColonIndex / 3) { - bufferIndex += skipParts * 2; - } else if (parts[i] !== "") { - const value = parseInt(parts[i], 16); - buffer2.writeUInt16BE(value, bufferIndex); - bufferIndex += 2; - } - } - } else { - for (const part of parts) { - if (part === "") continue; - const value = parseInt(part, 16); - buffer2.writeUInt16BE(value, partIndex * 2); - partIndex++; + } + if (!evmAddress) return { kind: "no-evm-address" }; + return { kind: "ok", address: evmAddress, email: status.email, adapter }; +} +function formatAgenticWalletStatus(detection) { + switch (detection.kind) { + case "ok": + return []; + case "no-binary": + return [ + { level: "warn", text: "\u26A0 OKX Agentic Wallet not installed" }, + { level: "info", text: ` \u2192 Download: ${ONCHAINOS_DOWNLOAD_URL}` }, + { level: "info", text: " \u2192 After install, run: onchainos login" } + ]; + case "not-logged-in": + return [ + { level: "info", text: "\u2713 OKX Agentic Wallet installed" }, + { level: "warn", text: "\u2717 Login status: not logged in" }, + { level: "info", text: " \u2192 Run: onchainos login" } + ]; + case "status-error": + return [ + { level: "info", text: "\u2713 OKX Agentic Wallet installed" }, + { + level: "warn", + text: `\u2717 Login status: unknown \u2014 status check failed: ${detection.reason}` } + ]; + case "no-evm-address": + return [ + { level: "info", text: "\u2713 OKX Agentic Wallet installed (logged in)" }, + { level: "warn", text: "\u2717 No EVM address found (Solana-only account?)" } + ]; + case "addresses-error": + return [ + { level: "info", text: "\u2713 OKX Agentic Wallet installed (logged in)" }, + { level: "warn", text: `\u2717 Could not read wallet addresses: ${detection.reason}` } + ]; + } +} +async function savePaymentChain(chain3) { + await mkdir2(WALLET_DIR, { recursive: true }); + await writeFile(CHAIN_FILE, chain3 + "\n", { mode: 384 }); +} +async function loadPaymentChain() { + try { + const content = (await readTextFile(CHAIN_FILE)).trim(); + if (content === "solana") return "solana"; + return "base"; + } catch { + return "base"; + } +} +async function resolvePaymentChain() { + const env = process.env.XCLAWROUTER_PAYMENT_CHAIN ?? process.env.CLAWROUTER_PAYMENT_CHAIN; + if (env === "solana") return "solana"; + if (env === "base") return "base"; + return loadPaymentChain(); +} +async function loadSavedWallet() { + try { + const key = (await readTextFile(WALLET_FILE)).trim(); + if (key.startsWith("0x") && key.length === 66) { + console.log(`[XClawRouter] \u2713 Loaded existing wallet from ${WALLET_FILE}`); + return key; + } + console.error(`[XClawRouter] \u2717 CRITICAL: Wallet file exists but has invalid format!`); + console.error(`[XClawRouter] File: ${WALLET_FILE}`); + console.error(`[XClawRouter] Expected: 0x followed by 64 hex characters (66 chars total)`); + throw new Error( + `Wallet file at ${WALLET_FILE} is corrupted or has wrong format. Refusing to auto-generate new wallet to protect existing funds. Restore your backup key or set BLOCKRUN_WALLET_KEY environment variable.` + ); + } catch (err) { + if (err.code !== "ENOENT") { + if (err instanceof Error && err.message.includes("Refusing to auto-generate")) { + throw err; } - return buffer2; + throw new Error( + `Cannot read wallet file at ${WALLET_FILE}: ${err instanceof Error ? err.message : String(err)}.`, + { cause: err } + ); } - function buildAddressBuffer(type, addressBuffer, port) { - const portBuffer = Buffer2.allocUnsafe(2); - portBuffer.writeUInt16BE(port, 0); - return Buffer2.concat([ - Buffer2.from([type]), - addressBuffer, - portBuffer - ]); + } + return void 0; +} +async function loadMnemonic() { + try { + const mnemonic = (await readTextFile(MNEMONIC_FILE)).trim(); + if (mnemonic && isValidMnemonic(mnemonic)) return mnemonic; + console.warn(`[XClawRouter] \u26A0 Mnemonic file exists but has invalid format \u2014 ignoring`); + return void 0; + } catch (err) { + if (err.code !== "ENOENT") { + console.warn(`[XClawRouter] \u26A0 Cannot read mnemonic file \u2014 ignoring`); } - function parseResponseAddress(buffer2, offset = 0) { - if (buffer2.length < offset + 1) { - throw new InvalidArgumentError("Buffer too small to contain address type"); - } - const addressType = buffer2[offset]; - let address2; - let currentOffset = offset + 1; - switch (addressType) { - case 1: { - if (buffer2.length < currentOffset + 6) { - throw new InvalidArgumentError("Buffer too small for IPv4 address"); - } - address2 = Array.from(buffer2.subarray(currentOffset, currentOffset + 4)).join("."); - currentOffset += 4; - break; - } - case 3: { - if (buffer2.length < currentOffset + 1) { - throw new InvalidArgumentError("Buffer too small for domain length"); - } - const domainLength = buffer2[currentOffset]; - currentOffset += 1; - if (buffer2.length < currentOffset + domainLength + 2) { - throw new InvalidArgumentError("Buffer too small for domain address"); - } - address2 = buffer2.subarray(currentOffset, currentOffset + domainLength).toString("utf8"); - currentOffset += domainLength; - break; - } - case 4: { - if (buffer2.length < currentOffset + 18) { - throw new InvalidArgumentError("Buffer too small for IPv6 address"); - } - const parts = []; - for (let i = 0; i < 8; i++) { - const value = buffer2.readUInt16BE(currentOffset + i * 2); - parts.push(value.toString(16)); - } - address2 = parts.join(":"); - currentOffset += 16; - break; - } - default: - throw new InvalidArgumentError(`Invalid address type: ${addressType}`); - } - if (buffer2.length < currentOffset + 2) { - throw new InvalidArgumentError("Buffer too small for port"); - } - const port = buffer2.readUInt16BE(currentOffset); - currentOffset += 2; + } + return void 0; +} +async function saveMnemonic(mnemonic) { + await mkdir2(WALLET_DIR, { recursive: true }); + await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 384 }); +} +async function generateAndSaveWallet() { + const existingMnemonic = await loadMnemonic(); + if (existingMnemonic) { + throw new Error( + `Mnemonic file exists at ${MNEMONIC_FILE} but wallet.key is missing. +Refusing to generate a new wallet to protect existing funds.` + ); + } + const mnemonic = generateWalletMnemonic(); + const derived = deriveAllKeys(mnemonic); + await mkdir2(WALLET_DIR, { recursive: true }); + await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 384 }); + await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 384 }); + const verification = (await readTextFile(WALLET_FILE)).trim(); + if (verification !== derived.evmPrivateKey) { + throw new Error("Wallet file verification failed - content mismatch"); + } + return { + key: derived.evmPrivateKey, + address: derived.evmAddress, + mnemonic, + solanaPrivateKeyBytes: derived.solanaPrivateKeyBytes + }; +} +async function resolveOrGenerateWalletKey() { + const onchainosDetection = await detectOnchainosWallet(); + if (onchainosDetection.kind === "ok") { + return { + address: onchainosDetection.address, + source: "okx", + onchainos: onchainosDetection.adapter, + email: onchainosDetection.email, + onchainosDetection + }; + } + const saved = await loadSavedWallet(); + if (saved) { + const account = privateKeyToAccount(saved); + const mnemonic = await loadMnemonic(); + if (mnemonic) { + const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); return { - address: address2, - port, - bytesRead: currentOffset - offset + key: saved, + address: account.address, + source: "saved", + mnemonic, + solanaPrivateKeyBytes: solanaKeyBytes, + onchainosDetection }; } - function createReplyError(replyCode) { - const messages = { - 1: "General SOCKS server failure", - 2: "Connection not allowed by ruleset", - 3: "Network unreachable", - 4: "Host unreachable", - 5: "Connection refused", - 6: "TTL expired", - 7: "Command not supported", - 8: "Address type not supported" + return { key: saved, address: account.address, source: "saved", onchainosDetection }; + } + const envKey = process.env.BLOCKRUN_WALLET_KEY; + if (typeof envKey === "string" && envKey.startsWith("0x") && envKey.length === 66) { + const account = privateKeyToAccount(envKey); + const mnemonic = await loadMnemonic(); + if (mnemonic) { + const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); + return { + key: envKey, + address: account.address, + source: "env", + mnemonic, + solanaPrivateKeyBytes: solanaKeyBytes, + onchainosDetection }; - const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`; - const error = new Error(message); - error.code = `SOCKS5_${replyCode}`; - return error; } + return { key: envKey, address: account.address, source: "env", onchainosDetection }; + } + if (process.env.XCLAWROUTER_USE_LOCAL_WALLET !== "1") { + throw new OnchainOsRequiredError(onchainosDetection); + } + const result = await generateAndSaveWallet(); + return { + key: result.key, + address: result.address, + source: "generated", + mnemonic: result.mnemonic, + solanaPrivateKeyBytes: result.solanaPrivateKeyBytes, + onchainosDetection + }; +} +async function recoverWalletFromMnemonic() { + const mnemonic = await loadMnemonic(); + if (!mnemonic) { + console.error(`[XClawRouter] No mnemonic found at ${MNEMONIC_FILE}`); + process.exit(1); + } + const existing = await loadSavedWallet().catch(() => void 0); + if (existing) { + console.error(`[XClawRouter] wallet.key already exists at ${WALLET_FILE}`); + process.exit(1); + } + const derived = deriveAllKeys(mnemonic); + const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); + const solanaAddress = await getSolanaAddress(solanaKeyBytes).catch(() => void 0); + console.log(`[XClawRouter] Derived EVM Address : ${derived.evmAddress}`); + if (solanaAddress) console.log(`[XClawRouter] Derived Solana Address: ${solanaAddress}`); + await mkdir2(WALLET_DIR, { recursive: true }); + await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 384 }); + console.log(`[XClawRouter] \u2713 wallet.key restored at ${WALLET_FILE}`); +} +async function setupSolana() { + const existing = await loadMnemonic(); + if (existing) throw new Error("Solana wallet already set up at " + MNEMONIC_FILE); + const savedKey = await loadSavedWallet(); + if (!savedKey) { + throw new Error( + "No EVM wallet found. Run XClawRouter first to generate a wallet before setting up Solana." + ); + } + const mnemonic = generateWalletMnemonic(); + const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic); + await saveMnemonic(mnemonic); + return { mnemonic, solanaPrivateKeyBytes: solanaKeyBytes }; +} +var ONCHAINOS_DOWNLOAD_URL, ONCHAINOS_INSTALLER_URL, OnchainOsRequiredError, WALLET_DIR, WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE, walletKeyAuth, envKeyAuth; +var init_auth = __esm({ + "src/auth.ts"() { + "use strict"; + init_fs_read(); + init_accounts(); + init_wallet(); + init_onchainos_adapter(); + ONCHAINOS_DOWNLOAD_URL = "https://web3.okx.com/onchainos"; + ONCHAINOS_INSTALLER_URL = "https://raw.githubusercontent.com/okx/onchainos-skills/main/install.sh"; + OnchainOsRequiredError = class extends Error { + constructor(detection) { + const notInstalled = detection.kind === "no-binary"; + super( + "No wallet available.\n\nXClawRouter uses OKX Agentic Wallet (onchainos). " + (notInstalled ? "onchainos is not installed yet.\n" : "onchainos is installed but you're not logged in yet.\n") + "\nRun this one command to install + log in:\n npx @blockrun/xclawrouter setup\n\nIt will install the onchainos binary (if needed) and prompt you for\nemail + OTP. Then restart the gateway: openclaw gateway restart\n\nOpt-out (legacy local BIP-39 wallet \u2014 you manage backups yourself):\n export XCLAWROUTER_USE_LOCAL_WALLET=1\n openclaw gateway restart\n" + ); + this.detection = detection; + this.name = "OnchainOsRequiredError"; + } + }; + WALLET_DIR = join6(homedir4(), ".openclaw", "blockrun"); + WALLET_FILE = join6(WALLET_DIR, "wallet.key"); + MNEMONIC_FILE = join6(WALLET_DIR, "mnemonic"); + CHAIN_FILE = join6(WALLET_DIR, "payment-chain"); + walletKeyAuth = { + id: "wallet-key", + label: "Wallet Private Key", + hint: "Enter your EVM wallet private key (0x...) for x402 payments", + kind: "api_key", + run: async (ctx) => { + const key = await ctx.prompter.text({ + message: "Enter your wallet private key (0x...)", + validate: (value) => { + const trimmed = value.trim(); + if (!trimmed.startsWith("0x")) return "Key must start with 0x"; + if (trimmed.length !== 66) return "Key must be 66 characters"; + if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed)) return "Key must be valid hex"; + return void 0; + } + }); + if (!key || typeof key !== "string") throw new Error("Wallet key is required"); + return { + profiles: [{ profileId: "default", credential: { apiKey: key.trim() } }], + notes: ["Wallet key stored securely in OpenClaw credentials."] + }; + } + }; + envKeyAuth = { + id: "env-key", + label: "Environment Variable", + hint: "Use BLOCKRUN_WALLET_KEY environment variable", + kind: "api_key", + run: async () => { + const key = process.env.BLOCKRUN_WALLET_KEY; + if (!key) throw new Error("BLOCKRUN_WALLET_KEY environment variable is not set."); + return { + profiles: [{ profileId: "default", credential: { apiKey: key.trim() } }], + notes: ["Using wallet key from BLOCKRUN_WALLET_KEY environment variable."] + }; + } + }; + } +}); + +// node_modules/undici/lib/core/symbols.js +var require_symbols = __commonJS({ + "node_modules/undici/lib/core/symbols.js"(exports, module) { + "use strict"; module.exports = { - parseAddress, - parseIPv6, - buildAddressBuffer, - parseResponseAddress, - createReplyError + kClose: /* @__PURE__ */ Symbol("close"), + kDestroy: /* @__PURE__ */ Symbol("destroy"), + kDispatch: /* @__PURE__ */ Symbol("dispatch"), + kUrl: /* @__PURE__ */ Symbol("url"), + kWriting: /* @__PURE__ */ Symbol("writing"), + kResuming: /* @__PURE__ */ Symbol("resuming"), + kQueue: /* @__PURE__ */ Symbol("queue"), + kConnect: /* @__PURE__ */ Symbol("connect"), + kConnecting: /* @__PURE__ */ Symbol("connecting"), + kKeepAliveDefaultTimeout: /* @__PURE__ */ Symbol("default keep alive timeout"), + kKeepAliveMaxTimeout: /* @__PURE__ */ Symbol("max keep alive timeout"), + kKeepAliveTimeoutThreshold: /* @__PURE__ */ Symbol("keep alive timeout threshold"), + kKeepAliveTimeoutValue: /* @__PURE__ */ Symbol("keep alive timeout"), + kKeepAlive: /* @__PURE__ */ Symbol("keep alive"), + kHeadersTimeout: /* @__PURE__ */ Symbol("headers timeout"), + kBodyTimeout: /* @__PURE__ */ Symbol("body timeout"), + kServerName: /* @__PURE__ */ Symbol("server name"), + kLocalAddress: /* @__PURE__ */ Symbol("local address"), + kHost: /* @__PURE__ */ Symbol("host"), + kNoRef: /* @__PURE__ */ Symbol("no ref"), + kBodyUsed: /* @__PURE__ */ Symbol("used"), + kBody: /* @__PURE__ */ Symbol("abstracted request body"), + kRunning: /* @__PURE__ */ Symbol("running"), + kBlocking: /* @__PURE__ */ Symbol("blocking"), + kPending: /* @__PURE__ */ Symbol("pending"), + kSize: /* @__PURE__ */ Symbol("size"), + kBusy: /* @__PURE__ */ Symbol("busy"), + kQueued: /* @__PURE__ */ Symbol("queued"), + kFree: /* @__PURE__ */ Symbol("free"), + kConnected: /* @__PURE__ */ Symbol("connected"), + kClosed: /* @__PURE__ */ Symbol("closed"), + kNeedDrain: /* @__PURE__ */ Symbol("need drain"), + kReset: /* @__PURE__ */ Symbol("reset"), + kDestroyed: /* @__PURE__ */ Symbol.for("nodejs.stream.destroyed"), + kResume: /* @__PURE__ */ Symbol("resume"), + kOnError: /* @__PURE__ */ Symbol("on error"), + kMaxHeadersSize: /* @__PURE__ */ Symbol("max headers size"), + kRunningIdx: /* @__PURE__ */ Symbol("running index"), + kPendingIdx: /* @__PURE__ */ Symbol("pending index"), + kError: /* @__PURE__ */ Symbol("error"), + kClients: /* @__PURE__ */ Symbol("clients"), + kClient: /* @__PURE__ */ Symbol("client"), + kParser: /* @__PURE__ */ Symbol("parser"), + kOnDestroyed: /* @__PURE__ */ Symbol("destroy callbacks"), + kPipelining: /* @__PURE__ */ Symbol("pipelining"), + kSocket: /* @__PURE__ */ Symbol("socket"), + kHostHeader: /* @__PURE__ */ Symbol("host header"), + kConnector: /* @__PURE__ */ Symbol("connector"), + kStrictContentLength: /* @__PURE__ */ Symbol("strict content length"), + kMaxRedirections: /* @__PURE__ */ Symbol("maxRedirections"), + kMaxRequests: /* @__PURE__ */ Symbol("maxRequestsPerClient"), + kProxy: /* @__PURE__ */ Symbol("proxy agent options"), + kCounter: /* @__PURE__ */ Symbol("socket request counter"), + kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"), + kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"), + kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"), + kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"), + kConstruct: /* @__PURE__ */ Symbol("constructable"), + kListeners: /* @__PURE__ */ Symbol("listeners"), + kHTTPContext: /* @__PURE__ */ Symbol("http context"), + kMaxConcurrentStreams: /* @__PURE__ */ Symbol("max concurrent streams"), + kHTTP2InitialWindowSize: /* @__PURE__ */ Symbol("http2 initial window size"), + kHTTP2ConnectionWindowSize: /* @__PURE__ */ Symbol("http2 connection window size"), + kEnableConnectProtocol: /* @__PURE__ */ Symbol("http2session connect protocol"), + kRemoteSettings: /* @__PURE__ */ Symbol("http2session remote settings"), + kHTTP2Stream: /* @__PURE__ */ Symbol("http2session client stream"), + kPingInterval: /* @__PURE__ */ Symbol("ping interval"), + kNoProxyAgent: /* @__PURE__ */ Symbol("no proxy agent"), + kHttpProxyAgent: /* @__PURE__ */ Symbol("http proxy agent"), + kHttpsProxyAgent: /* @__PURE__ */ Symbol("https proxy agent"), + kSocks5ProxyAgent: /* @__PURE__ */ Symbol("socks5 proxy agent") }; } }); -// node_modules/undici/lib/core/socks5-client.js -var require_socks5_client = __commonJS({ - "node_modules/undici/lib/core/socks5-client.js"(exports, module) { +// node_modules/undici/lib/util/timers.js +var require_timers = __commonJS({ + "node_modules/undici/lib/util/timers.js"(exports, module) { "use strict"; - var { EventEmitter } = __require("events"); - var { Buffer: Buffer2 } = __require("buffer"); - var { InvalidArgumentError, Socks5ProxyError } = require_errors(); - var { debuglog } = __require("util"); - var { parseAddress } = require_socks5_utils(); - var debug = debuglog("undici:socks5"); - var SOCKS_VERSION = 5; - var AUTH_METHODS = { - NO_AUTH: 0, - GSSAPI: 1, - USERNAME_PASSWORD: 2, - NO_ACCEPTABLE: 255 - }; - var COMMANDS = { - CONNECT: 1, - BIND: 2, - UDP_ASSOCIATE: 3 - }; - var ADDRESS_TYPES = { - IPV4: 1, - DOMAIN: 3, - IPV6: 4 - }; - var REPLY_CODES = { - SUCCEEDED: 0, - GENERAL_FAILURE: 1, - CONNECTION_NOT_ALLOWED: 2, - NETWORK_UNREACHABLE: 3, - HOST_UNREACHABLE: 4, - CONNECTION_REFUSED: 5, - TTL_EXPIRED: 6, - COMMAND_NOT_SUPPORTED: 7, - ADDRESS_TYPE_NOT_SUPPORTED: 8 - }; - var STATES = { - INITIAL: "initial", - HANDSHAKING: "handshaking", - AUTHENTICATING: "authenticating", - CONNECTING: "connecting", - CONNECTED: "connected", - ERROR: "error", - CLOSED: "closed" - }; - var Socks5Client = class extends EventEmitter { - constructor(socket, options = {}) { - super(); - if (!socket) { - throw new InvalidArgumentError("socket is required"); - } - this.socket = socket; - this.options = options; - this.state = STATES.INITIAL; - this.buffer = Buffer2.alloc(0); - this.authMethods = []; - if (options.username && options.password) { - this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD); + var fastNow = 0; + var RESOLUTION_MS = 1e3; + var TICK_MS = (RESOLUTION_MS >> 1) - 1; + var fastNowTimeout; + var kFastTimer = /* @__PURE__ */ Symbol("kFastTimer"); + var fastTimers = []; + var NOT_IN_LIST = -2; + var TO_BE_CLEARED = -1; + var PENDING = 0; + var ACTIVE = 1; + function onTick() { + fastNow += TICK_MS; + let idx = 0; + let len = fastTimers.length; + while (idx < len) { + const timer = fastTimers[idx]; + if (timer._state === PENDING) { + timer._idleStart = fastNow - TICK_MS; + timer._state = ACTIVE; + } else if (timer._state === ACTIVE && fastNow >= timer._idleStart + timer._idleTimeout) { + timer._state = TO_BE_CLEARED; + timer._idleStart = -1; + timer._onTimeout(timer._timerArg); } - this.authMethods.push(AUTH_METHODS.NO_AUTH); - this.socket.on("data", this.onData.bind(this)); - this.socket.on("error", this.onError.bind(this)); - this.socket.on("close", this.onClose.bind(this)); - } - /** - * Handle incoming data from the socket - */ - onData(data) { - debug("received data", data.length, "bytes in state", this.state); - this.buffer = Buffer2.concat([this.buffer, data]); - try { - switch (this.state) { - case STATES.HANDSHAKING: - this.handleHandshakeResponse(); - break; - case STATES.AUTHENTICATING: - this.handleAuthResponse(); - break; - case STATES.CONNECTING: - this.handleConnectResponse(); - break; + if (timer._state === TO_BE_CLEARED) { + timer._state = NOT_IN_LIST; + if (--len !== 0) { + fastTimers[idx] = fastTimers[len]; } - } catch (err) { - this.onError(err); - } - } - /** - * Handle socket errors - */ - onError(err) { - debug("socket error", err); - this.state = STATES.ERROR; - this.emit("error", err); - this.destroy(); - } - /** - * Handle socket close - */ - onClose() { - debug("socket closed"); - this.state = STATES.CLOSED; - this.emit("close"); - } - /** - * Destroy the client and underlying socket - */ - destroy() { - if (this.socket && !this.socket.destroyed) { - this.socket.destroy(); - } - } - /** - * Start the SOCKS5 handshake - */ - handshake() { - if (this.state !== STATES.INITIAL) { - throw new InvalidArgumentError("Handshake already started"); - } - debug("starting handshake with", this.authMethods.length, "auth methods"); - this.state = STATES.HANDSHAKING; - const request = Buffer2.alloc(2 + this.authMethods.length); - request[0] = SOCKS_VERSION; - request[1] = this.authMethods.length; - this.authMethods.forEach((method, i) => { - request[2 + i] = method; - }); - this.socket.write(request); - } - /** - * Handle handshake response from server - */ - handleHandshakeResponse() { - if (this.buffer.length < 2) { - return; - } - const version4 = this.buffer[0]; - const method = this.buffer[1]; - if (version4 !== SOCKS_VERSION) { - throw new Socks5ProxyError(`Invalid SOCKS version: ${version4}`, "UND_ERR_SOCKS5_VERSION"); - } - if (method === AUTH_METHODS.NO_ACCEPTABLE) { - throw new Socks5ProxyError("No acceptable authentication method", "UND_ERR_SOCKS5_AUTH_REJECTED"); - } - this.buffer = this.buffer.subarray(2); - debug("server selected auth method", method); - if (method === AUTH_METHODS.NO_AUTH) { - this.emit("authenticated"); - } else if (method === AUTH_METHODS.USERNAME_PASSWORD) { - this.state = STATES.AUTHENTICATING; - this.sendAuthRequest(); } else { - throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, "UND_ERR_SOCKS5_AUTH_METHOD"); + ++idx; } } - /** - * Send username/password authentication request - */ - sendAuthRequest() { - const { username, password } = this.options; - if (!username || !password) { - throw new InvalidArgumentError("Username and password required for authentication"); - } - debug("sending username/password auth"); - const usernameBuffer = Buffer2.from(username); - const passwordBuffer = Buffer2.from(password); - if (usernameBuffer.length > 255 || passwordBuffer.length > 255) { - throw new InvalidArgumentError("Username or password too long"); - } - const request = Buffer2.alloc(3 + usernameBuffer.length + passwordBuffer.length); - request[0] = 1; - request[1] = usernameBuffer.length; - usernameBuffer.copy(request, 2); - request[2 + usernameBuffer.length] = passwordBuffer.length; - passwordBuffer.copy(request, 3 + usernameBuffer.length); - this.socket.write(request); + fastTimers.length = len; + if (fastTimers.length !== 0) { + refreshTimeout(); } - /** - * Handle authentication response - */ - handleAuthResponse() { - if (this.buffer.length < 2) { - return; - } - const version4 = this.buffer[0]; - const status = this.buffer[1]; - if (version4 !== 1) { - throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version4}`, "UND_ERR_SOCKS5_AUTH_VERSION"); - } - if (status !== 0) { - throw new Socks5ProxyError("Authentication failed", "UND_ERR_SOCKS5_AUTH_FAILED"); - } - this.buffer = this.buffer.subarray(2); - debug("authentication successful"); - this.emit("authenticated"); + } + function refreshTimeout() { + if (fastNowTimeout?.refresh) { + fastNowTimeout.refresh(); + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTick, TICK_MS); + fastNowTimeout?.unref(); } + } + var FastTimer = class { + [kFastTimer] = true; /** - * Send CONNECT command - * @param {string} address - Target address (IP or domain) - * @param {number} port - Target port + * The state of the timer, which can be one of the following: + * - NOT_IN_LIST (-2) + * - TO_BE_CLEARED (-1) + * - PENDING (0) + * - ACTIVE (1) + * + * @type {-2|-1|0|1} + * @private */ - connect(address2, port) { - if (this.state === STATES.CONNECTED) { - throw new InvalidArgumentError("Already connected"); - } - debug("connecting to", address2, port); - this.state = STATES.CONNECTING; - const request = this.buildConnectRequest(COMMANDS.CONNECT, address2, port); - this.socket.write(request); - } + _state = NOT_IN_LIST; /** - * Build a SOCKS5 request + * The number of milliseconds to wait before calling the callback. + * + * @type {number} + * @private */ - buildConnectRequest(command, address2, port) { - const { type: addressType, buffer: addressBuffer } = parseAddress(address2); - const request = Buffer2.alloc(4 + addressBuffer.length + 2); - request[0] = SOCKS_VERSION; - request[1] = command; - request[2] = 0; - request[3] = addressType; - addressBuffer.copy(request, 4); - request.writeUInt16BE(port, 4 + addressBuffer.length); - return request; - } + _idleTimeout = -1; /** - * Handle CONNECT response + * The time in milliseconds when the timer was started. This value is used to + * calculate when the timer should expire. + * + * @type {number} + * @default -1 + * @private */ - handleConnectResponse() { - if (this.buffer.length < 4) { - return; - } - const version4 = this.buffer[0]; - const reply = this.buffer[1]; - const addressType = this.buffer[3]; - if (version4 !== SOCKS_VERSION) { - throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version4}`, "UND_ERR_SOCKS5_REPLY_VERSION"); - } - let responseLength = 4; - if (addressType === ADDRESS_TYPES.IPV4) { - responseLength += 4 + 2; - } else if (addressType === ADDRESS_TYPES.DOMAIN) { - if (this.buffer.length < 5) { - return; - } - responseLength += 1 + this.buffer[4] + 2; - } else if (addressType === ADDRESS_TYPES.IPV6) { - responseLength += 16 + 2; - } else { - throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, "UND_ERR_SOCKS5_ADDR_TYPE"); - } - if (this.buffer.length < responseLength) { - return; - } - if (reply !== REPLY_CODES.SUCCEEDED) { - const errorMessage = this.getReplyErrorMessage(reply); - throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`); - } - let boundAddress; - let offset = 4; - if (addressType === ADDRESS_TYPES.IPV4) { - boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join("."); - offset += 4; - } else if (addressType === ADDRESS_TYPES.DOMAIN) { - const domainLength = this.buffer[offset]; - offset += 1; - boundAddress = this.buffer.subarray(offset, offset + domainLength).toString(); - offset += domainLength; - } else if (addressType === ADDRESS_TYPES.IPV6) { - const parts = []; - for (let i = 0; i < 8; i++) { - const value = this.buffer.readUInt16BE(offset + i * 2); - parts.push(value.toString(16)); - } - boundAddress = parts.join(":"); - offset += 16; - } - const boundPort = this.buffer.readUInt16BE(offset); - this.buffer = this.buffer.subarray(responseLength); - this.state = STATES.CONNECTED; - debug("connected, bound address:", boundAddress, "port:", boundPort); - this.emit("connected", { address: boundAddress, port: boundPort }); - } + _idleStart = -1; /** - * Get human-readable error message for reply code + * The function to be executed when the timer expires. + * @type {Function} + * @private */ - getReplyErrorMessage(reply) { - switch (reply) { - case REPLY_CODES.GENERAL_FAILURE: - return "General SOCKS server failure"; - case REPLY_CODES.CONNECTION_NOT_ALLOWED: - return "Connection not allowed by ruleset"; - case REPLY_CODES.NETWORK_UNREACHABLE: - return "Network unreachable"; - case REPLY_CODES.HOST_UNREACHABLE: - return "Host unreachable"; - case REPLY_CODES.CONNECTION_REFUSED: - return "Connection refused"; - case REPLY_CODES.TTL_EXPIRED: - return "TTL expired"; - case REPLY_CODES.COMMAND_NOT_SUPPORTED: - return "Command not supported"; - case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED: - return "Address type not supported"; - default: - return `Unknown error code: ${reply}`; - } - } - }; - module.exports = { - Socks5Client, - AUTH_METHODS, - COMMANDS, - ADDRESS_TYPES, - REPLY_CODES, - STATES - }; - } -}); - -// node_modules/undici/lib/dispatcher/socks5-proxy-agent.js -var require_socks5_proxy_agent = __commonJS({ - "node_modules/undici/lib/dispatcher/socks5-proxy-agent.js"(exports, module) { - "use strict"; - var net = __require("net"); - var { URL: URL2 } = __require("url"); - var tls; - var DispatcherBase = require_dispatcher_base(); - var { InvalidArgumentError } = require_errors(); - var { Socks5Client } = require_socks5_client(); - var { kDispatch, kClose, kDestroy } = require_symbols(); - var Pool = require_pool(); - var buildConnector = require_connect(); - var { debuglog } = __require("util"); - var debug = debuglog("undici:socks5-proxy"); - var kProxyUrl = /* @__PURE__ */ Symbol("proxy url"); - var kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); - var kProxyAuth = /* @__PURE__ */ Symbol("proxy auth"); - var kPool = /* @__PURE__ */ Symbol("pool"); - var kConnector = /* @__PURE__ */ Symbol("connector"); - var experimentalWarningEmitted = false; - var Socks5ProxyAgent = class extends DispatcherBase { - constructor(proxyUrl, options = {}) { - super(); - if (!experimentalWarningEmitted) { - process.emitWarning( - "SOCKS5 proxy support is experimental and subject to change", - "ExperimentalWarning" - ); - experimentalWarningEmitted = true; - } - if (!proxyUrl) { - throw new InvalidArgumentError("Proxy URL is mandatory"); - } - const url = typeof proxyUrl === "string" ? new URL2(proxyUrl) : proxyUrl; - if (url.protocol !== "socks5:" && url.protocol !== "socks:") { - throw new InvalidArgumentError("Proxy URL must use socks5:// or socks:// protocol"); - } - this[kProxyUrl] = url; - this[kProxyHeaders] = options.headers || {}; - this[kProxyAuth] = { - username: options.username || (url.username ? decodeURIComponent(url.username) : null), - password: options.password || (url.password ? decodeURIComponent(url.password) : null) - }; - this[kConnector] = options.connect || buildConnector({ - ...options.proxyTls, - servername: options.proxyTls?.servername || url.hostname - }); - this[kPool] = null; - } + _onTimeout; /** - * Create a SOCKS5 connection to the proxy - */ - async createSocks5Connection(targetHost, targetPort) { - const proxyHost = this[kProxyUrl].hostname; - const proxyPort = parseInt(this[kProxyUrl].port) || 1080; - debug("creating SOCKS5 connection to", proxyHost, proxyPort); - const socketReady = Promise.withResolvers(); - const onSocketConnect = () => { - socket.removeListener("error", onSocketError); - socketReady.resolve(socket); - }; - const onSocketError = (err) => { - socket.removeListener("connect", onSocketConnect); - socketReady.reject(err); - }; - const socket = net.connect({ - host: proxyHost, - port: proxyPort - }); - socket.once("connect", onSocketConnect); - socket.once("error", onSocketError); - await socketReady.promise; - const socks5Client = new Socks5Client(socket, this[kProxyAuth]); - socks5Client.on("error", (err) => { - debug("SOCKS5 error:", err); - socket.destroy(); - }); - await socks5Client.handshake(); - const authenticationReady = Promise.withResolvers(); - const authenticationTimeout = setTimeout(() => { - authenticationReady.reject(new Error("SOCKS5 authentication timeout")); - }, 5e3); - const onAuthenticated = () => { - clearTimeout(authenticationTimeout); - socks5Client.removeListener("error", onAuthenticationError); - authenticationReady.resolve(); - }; - const onAuthenticationError = (err) => { - clearTimeout(authenticationTimeout); - socks5Client.removeListener("authenticated", onAuthenticated); - authenticationReady.reject(err); - }; - if (socks5Client.state === "authenticated") { - clearTimeout(authenticationTimeout); - authenticationReady.resolve(); - } else { - socks5Client.once("authenticated", onAuthenticated); - socks5Client.once("error", onAuthenticationError); - } - await authenticationReady.promise; - await socks5Client.connect(targetHost, targetPort); - const connectionReady = Promise.withResolvers(); - const connectionTimeout = setTimeout(() => { - connectionReady.reject(new Error("SOCKS5 connection timeout")); - }, 5e3); - const onConnected = (info) => { - debug("SOCKS5 tunnel established to", targetHost, targetPort, "via", info); - clearTimeout(connectionTimeout); - socks5Client.removeListener("error", onConnectionError); - connectionReady.resolve(); - }; - const onConnectionError = (err) => { - clearTimeout(connectionTimeout); - socks5Client.removeListener("connected", onConnected); - connectionReady.reject(err); - }; - socks5Client.once("connected", onConnected); - socks5Client.once("error", onConnectionError); - await connectionReady.promise; - return socket; + * The argument to be passed to the callback when the timer expires. + * + * @type {*} + * @private + */ + _timerArg; + /** + * @constructor + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should wait + * before the specified function or code is executed. + * @param {*} arg + */ + constructor(callback, delay, arg) { + this._onTimeout = callback; + this._idleTimeout = delay; + this._timerArg = arg; + this.refresh(); } /** - * Dispatch a request through the SOCKS5 proxy + * Sets the timer's start time to the current time, and reschedules the timer + * to call its callback at the previously specified duration adjusted to the + * current time. + * Using this on a timer that has already called its callback will reactivate + * the timer. + * + * @returns {void} */ - async [kDispatch](opts, handler) { - const { origin } = opts; - debug("dispatching request to", origin, "via SOCKS5"); - try { - if (!this[kPool] || this[kPool].destroyed || this[kPool].closed) { - this[kPool] = new Pool(origin, { - pipelining: opts.pipelining, - connections: opts.connections, - connect: async (connectOpts, callback) => { - try { - const url = new URL2(origin); - const targetHost = url.hostname; - const targetPort = parseInt(url.port) || (url.protocol === "https:" ? 443 : 80); - debug("establishing SOCKS5 connection to", targetHost, targetPort); - const socket = await this.createSocks5Connection(targetHost, targetPort); - let finalSocket = socket; - if (url.protocol === "https:") { - if (!tls) { - tls = __require("tls"); - } - debug("upgrading to TLS"); - finalSocket = tls.connect({ - socket, - servername: targetHost, - ...connectOpts.tls || {} - }); - const tlsReady = Promise.withResolvers(); - finalSocket.once("secureConnect", tlsReady.resolve); - finalSocket.once("error", tlsReady.reject); - await tlsReady.promise; - } - callback(null, finalSocket); - } catch (err) { - debug("SOCKS5 connection error:", err); - callback(err); - } - } - }); - } - return this[kPool][kDispatch](opts, handler); - } catch (err) { - debug("dispatch error:", err); - if (typeof handler.onError === "function") { - handler.onError(err); - } else { - throw err; - } + refresh() { + if (this._state === NOT_IN_LIST) { + fastTimers.push(this); } - } - async [kClose]() { - if (this[kPool]) { - await this[kPool].close(); + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); } + this._state = PENDING; } - async [kDestroy](err) { - if (this[kPool]) { - await this[kPool].destroy(err); - } + /** + * The `clear` method cancels the timer, preventing it from executing. + * + * @returns {void} + * @private + */ + clear() { + this._state = TO_BE_CLEARED; + this._idleStart = -1; } }; - module.exports = Socks5ProxyAgent; + module.exports = { + /** + * The setTimeout() method sets a timer which executes a function once the + * timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {NodeJS.Timeout|FastTimer} + */ + setTimeout(callback, delay, arg) { + return delay <= RESOLUTION_MS ? setTimeout(callback, delay, arg) : new FastTimer(callback, delay, arg); + }, + /** + * The clearTimeout method cancels an instantiated Timer previously created + * by calling setTimeout. + * + * @param {NodeJS.Timeout|FastTimer} timeout + */ + clearTimeout(timeout) { + if (timeout[kFastTimer]) { + timeout.clear(); + } else { + clearTimeout(timeout); + } + }, + /** + * The setFastTimeout() method sets a fastTimer which executes a function once + * the timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {FastTimer} + */ + setFastTimeout(callback, delay, arg) { + return new FastTimer(callback, delay, arg); + }, + /** + * The clearTimeout method cancels an instantiated FastTimer previously + * created by calling setFastTimeout. + * + * @param {FastTimer} timeout + */ + clearFastTimeout(timeout) { + timeout.clear(); + }, + /** + * The now method returns the value of the internal fast timer clock. + * + * @returns {number} + */ + now() { + return fastNow; + }, + /** + * Trigger the onTick function to process the fastTimers array. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + * @param {number} [delay=0] The delay in milliseconds to add to the now value. + */ + tick(delay = 0) { + fastNow += delay - RESOLUTION_MS + 1; + onTick(); + onTick(); + }, + /** + * Reset FastTimers. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + reset() { + fastNow = 0; + fastTimers.length = 0; + clearTimeout(fastNowTimeout); + fastNowTimeout = null; + }, + /** + * Exporting for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + kFastTimer + }; } }); -// node_modules/undici/lib/dispatcher/proxy-agent.js -var require_proxy_agent = __commonJS({ - "node_modules/undici/lib/dispatcher/proxy-agent.js"(exports, module) { +// node_modules/undici/lib/core/errors.js +var require_errors = __commonJS({ + "node_modules/undici/lib/core/errors.js"(exports, module) { "use strict"; - var { kProxy, kClose, kDestroy, kDispatch } = require_symbols(); - var Agent = require_agent(); - var Pool = require_pool(); - var DispatcherBase = require_dispatcher_base(); - var { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require_errors(); - var buildConnector = require_connect(); - var Client = require_client(); - var { channels } = require_diagnostics(); - var Socks5ProxyAgent = require_socks5_proxy_agent(); - var kAgent = /* @__PURE__ */ Symbol("proxy agent"); - var kClient = /* @__PURE__ */ Symbol("proxy client"); - var kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); - var kRequestTls = /* @__PURE__ */ Symbol("request tls settings"); - var kProxyTls = /* @__PURE__ */ Symbol("proxy tls settings"); - var kConnectEndpoint = /* @__PURE__ */ Symbol("connect endpoint function"); - var kConnectEndpointHTTP1 = /* @__PURE__ */ Symbol("connect endpoint function (http/1.1 only)"); - var kTunnelProxy = /* @__PURE__ */ Symbol("tunnel proxy"); - function defaultProtocolPort(protocol) { - return protocol === "https:" ? 443 : 80; - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - var noop = () => { + var kUndiciError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR"); + var UndiciError = class extends Error { + constructor(message, options) { + super(message, options); + this.name = "UndiciError"; + this.code = "UND_ERR"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kUndiciError] === true; + } + get [kUndiciError]() { + return true; + } }; - function defaultAgentFactory(origin, opts) { - if (opts.connections === 1) { - return new Client(origin, opts); + var kConnectTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"); + var ConnectTimeoutError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "ConnectTimeoutError"; + this.message = message || "Connect Timeout Error"; + this.code = "UND_ERR_CONNECT_TIMEOUT"; } - return new Pool(origin, opts); - } - var Http1ProxyWrapper = class extends DispatcherBase { - #client; - constructor(proxyUrl, { headers = {}, connect, factory }) { - if (!proxyUrl) { - throw new InvalidArgumentError("Proxy URL is mandatory"); - } - super(); - this[kProxyHeaders] = headers; - if (factory) { - this.#client = factory(proxyUrl, { connect }); - } else { - this.#client = new Client(proxyUrl, { connect }); - } + static [Symbol.hasInstance](instance) { + return instance && instance[kConnectTimeoutError] === true; } - [kDispatch](opts, handler) { - const onResponseStart = handler.onResponseStart; - handler.onResponseStart = function(controller, statusCode, data, statusMessage) { - if (statusCode === 407) { - if (typeof handler.onResponseError === "function") { - handler.onResponseError(controller, new InvalidArgumentError("Proxy Authentication Required (407)")); - } - return; - } - if (onResponseStart) onResponseStart.call(this, controller, statusCode, data, statusMessage); - }; - const { - origin, - path = "/", - headers = {} - } = opts; - opts.path = origin + path; - if (!("host" in headers) && !("Host" in headers)) { - const { host } = new URL(origin); - headers.host = host; - } - opts.headers = { ...this[kProxyHeaders], ...headers }; - return this.#client[kDispatch](opts, handler); + get [kConnectTimeoutError]() { + return true; } - [kClose]() { - return this.#client.close(); + }; + var kHeadersTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"); + var HeadersTimeoutError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "HeadersTimeoutError"; + this.message = message || "Headers Timeout Error"; + this.code = "UND_ERR_HEADERS_TIMEOUT"; } - [kDestroy](err) { - return this.#client.destroy(err); + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersTimeoutError] === true; + } + get [kHeadersTimeoutError]() { + return true; } }; - var ProxyAgent = class extends DispatcherBase { - constructor(opts) { - if (!opts || typeof opts === "object" && !(opts instanceof URL) && !opts.uri) { - throw new InvalidArgumentError("Proxy uri is mandatory"); - } - const { clientFactory = defaultFactory } = opts; - if (typeof clientFactory !== "function") { - throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); - } - const { proxyTunnel = true, connectTimeout } = opts; - super(); - const url = this.#getUrl(opts); - const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; - this[kProxy] = { uri: href, protocol }; - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; - this[kTunnelProxy] = proxyTunnel; - if (opts.auth && opts.token) { - throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); - } else if (opts.auth) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]["proxy-authorization"] = opts.token; - } else if (username && password) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; - } - const connect = buildConnector({ timeout: connectTimeout, ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ timeout: connectTimeout, ...opts.requestTls }); - this[kConnectEndpointHTTP1] = buildConnector({ timeout: connectTimeout, ...opts.requestTls, allowH2: false }); - const agentFactory = opts.factory || defaultAgentFactory; - const factory = (origin2, options) => { - const { protocol: protocol2 } = new URL(origin2); - if (this[kProxy].protocol === "socks5:" || this[kProxy].protocol === "socks:") { - return new Socks5ProxyAgent(this[kProxy].uri, { - headers: this[kProxyHeaders], - connect, - factory: agentFactory, - username: opts.username || username, - password: opts.password || password, - proxyTls: opts.proxyTls - }); - } - if (!this[kTunnelProxy] && protocol2 === "http:" && this[kProxy].protocol === "http:") { - return new Http1ProxyWrapper(this[kProxy].uri, { - headers: this[kProxyHeaders], - connect, - factory: agentFactory - }); - } - return agentFactory(origin2, options); - }; - if (protocol === "socks5:" || protocol === "socks:") { - this[kClient] = null; - } else { - this[kClient] = clientFactory(url, { connect }); - } - this[kAgent] = new Agent({ - ...opts, - factory, - connect: async (opts2, callback) => { - if (!this[kClient]) { - callback(new InvalidArgumentError("Cannot establish tunnel connection without a proxy client")); - return; - } - let requestedPath = opts2.host; - if (!opts2.port) { - requestedPath += `:${defaultProtocolPort(opts2.protocol)}`; - } - try { - const connectParams = { - origin, - port, - path: requestedPath, - signal: opts2.signal, - headers: { - ...this[kProxyHeaders], - host: opts2.host, - ...opts2.connections == null || opts2.connections > 0 ? { "proxy-connection": "keep-alive" } : {} - }, - servername: this[kProxyTls]?.servername || proxyHostname - }; - const { socket, statusCode } = await this[kClient].connect(connectParams); - if (statusCode !== 200) { - socket.on("error", noop).destroy(); - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); - return; - } - if (channels.proxyConnected.hasSubscribers) { - channels.proxyConnected.publish({ - socket, - connectParams - }); - } - if (opts2.protocol !== "https:") { - callback(null, socket); - return; - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts2.servername; - } - const connectEndpoint = opts2.allowH2 === false ? this[kConnectEndpointHTTP1] : this[kConnectEndpoint]; - connectEndpoint({ ...opts2, servername, httpSocket: socket }, callback); - } catch (err) { - if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { - callback(new SecureProxyConnectionError(err)); - } else { - callback(err); - } - } - } - }); + var kHeadersOverflowError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"); + var HeadersOverflowError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "HeadersOverflowError"; + this.message = message || "Headers Overflow Error"; + this.code = "UND_ERR_HEADERS_OVERFLOW"; } - dispatch(opts, handler) { - const headers = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers); - if (headers && !("host" in headers) && !("Host" in headers)) { - const { host } = new URL(opts.origin); - headers.host = host; - } - return this[kAgent].dispatch( - { - ...opts, - headers - }, - handler - ); + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersOverflowError] === true; } - /** - * @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts - * @returns {URL} - */ - #getUrl(opts) { - if (typeof opts === "string") { - return new URL(opts); - } else if (opts instanceof URL) { - return opts; - } else { - return new URL(opts.uri); - } + get [kHeadersOverflowError]() { + return true; } - [kClose]() { - const promises = [this[kAgent].close()]; - if (this[kClient]) { - promises.push(this[kClient].close()); - } - return Promise.all(promises); + }; + var kBodyTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"); + var BodyTimeoutError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "BodyTimeoutError"; + this.message = message || "Body Timeout Error"; + this.code = "UND_ERR_BODY_TIMEOUT"; } - [kDestroy]() { - const promises = [this[kAgent].destroy()]; - if (this[kClient]) { - promises.push(this[kClient].destroy()); - } - return Promise.all(promises); + static [Symbol.hasInstance](instance) { + return instance && instance[kBodyTimeoutError] === true; + } + get [kBodyTimeoutError]() { + return true; + } + }; + var kInvalidArgumentError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_ARG"); + var InvalidArgumentError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "InvalidArgumentError"; + this.message = message || "Invalid Argument Error"; + this.code = "UND_ERR_INVALID_ARG"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidArgumentError] === true; + } + get [kInvalidArgumentError]() { + return true; + } + }; + var kInvalidReturnValueError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_RETURN_VALUE"); + var InvalidReturnValueError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "InvalidReturnValueError"; + this.message = message || "Invalid Return Value Error"; + this.code = "UND_ERR_INVALID_RETURN_VALUE"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidReturnValueError] === true; + } + get [kInvalidReturnValueError]() { + return true; + } + }; + var kAbortError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORT"); + var AbortError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "AbortError"; + this.message = message || "The operation was aborted"; + this.code = "UND_ERR_ABORT"; } - }; - function buildHeaders(headers) { - if (Array.isArray(headers)) { - const headersPair = {}; - for (let i = 0; i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1]; - } - return headersPair; + static [Symbol.hasInstance](instance) { + return instance && instance[kAbortError] === true; } - return headers; - } - function throwIfProxyAuthIsSent(headers) { - const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); - if (existProxyAuth) { - throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + get [kAbortError]() { + return true; } - } - module.exports = ProxyAgent; - } -}); - -// node_modules/undici/lib/dispatcher/env-http-proxy-agent.js -var require_env_http_proxy_agent = __commonJS({ - "node_modules/undici/lib/dispatcher/env-http-proxy-agent.js"(exports, module) { - "use strict"; - var DispatcherBase = require_dispatcher_base(); - var { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = require_symbols(); - var ProxyAgent = require_proxy_agent(); - var Agent = require_agent(); - var DEFAULT_PORTS = { - "http:": 80, - "https:": 443 }; - var EnvHttpProxyAgent = class extends DispatcherBase { - #noProxyValue = null; - #noProxyEntries = null; - #opts = null; - constructor(opts = {}) { - super(); - this.#opts = opts; - const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts; - this[kNoProxyAgent] = new Agent(agentOpts); - const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY; - if (HTTP_PROXY) { - this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }); - } else { - this[kHttpProxyAgent] = this[kNoProxyAgent]; - } - const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY; - if (HTTPS_PROXY) { - this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }); - } else { - this[kHttpsProxyAgent] = this[kHttpProxyAgent]; - } - this.#parseNoProxy(); + var kRequestAbortedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORTED"); + var RequestAbortedError = class extends AbortError { + constructor(message) { + super(message); + this.name = "AbortError"; + this.message = message || "Request aborted"; + this.code = "UND_ERR_ABORTED"; } - [kDispatch](opts, handler) { - const url = new URL(opts.origin); - const agent = this.#getProxyAgentForUrl(url); - return agent.dispatch(opts, handler); + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestAbortedError] === true; } - [kClose]() { - return Promise.all([ - this[kNoProxyAgent].close(), - !this[kHttpProxyAgent][kClosed] && this[kHttpProxyAgent].close(), - !this[kHttpsProxyAgent][kClosed] && this[kHttpsProxyAgent].close() - ]); + get [kRequestAbortedError]() { + return true; } - [kDestroy](err) { - return Promise.all([ - this[kNoProxyAgent].destroy(err), - !this[kHttpProxyAgent][kDestroyed] && this[kHttpProxyAgent].destroy(err), - !this[kHttpsProxyAgent][kDestroyed] && this[kHttpsProxyAgent].destroy(err) - ]); + }; + var kInformationalError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INFO"); + var InformationalError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "InformationalError"; + this.message = message || "Request information"; + this.code = "UND_ERR_INFO"; } - #getProxyAgentForUrl(url) { - let { protocol, host: hostname, port } = url; - hostname = hostname.replace(/:\d*$/, "").toLowerCase(); - port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; - if (!this.#shouldProxy(hostname, port)) { - return this[kNoProxyAgent]; - } - if (protocol === "https:") { - return this[kHttpsProxyAgent]; - } - return this[kHttpProxyAgent]; + static [Symbol.hasInstance](instance) { + return instance && instance[kInformationalError] === true; } - #shouldProxy(hostname, port) { - if (this.#noProxyChanged) { - this.#parseNoProxy(); - } - if (this.#noProxyEntries.length === 0) { - return true; - } - if (this.#noProxyValue === "*") { - return false; - } - for (let i = 0; i < this.#noProxyEntries.length; i++) { - const entry = this.#noProxyEntries[i]; - if (entry.port && entry.port !== port) { - continue; - } - if (hostname === entry.hostname) { - return false; - } - if (hostname.slice(-(entry.hostname.length + 1)) === `.${entry.hostname}`) { - return false; - } - } + get [kInformationalError]() { return true; } - #parseNoProxy() { - const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv; - const noProxySplit = noProxyValue.split(/[,\s]/); - const noProxyEntries = []; - for (let i = 0; i < noProxySplit.length; i++) { - const entry = noProxySplit[i]; - if (!entry) { - continue; - } - const parsed = entry.match(/^(.+):(\d+)$/); - noProxyEntries.push({ - // strip leading dot or asterisk with dot - hostname: (parsed ? parsed[1] : entry).replace(/^\*?\./, "").toLowerCase(), - port: parsed ? Number.parseInt(parsed[2], 10) : 0 - }); - } - this.#noProxyValue = noProxyValue; - this.#noProxyEntries = noProxyEntries; + }; + var kRequestContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"); + var RequestContentLengthMismatchError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "RequestContentLengthMismatchError"; + this.message = message || "Request body length does not match content-length header"; + this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; } - get #noProxyChanged() { - if (this.#opts.noProxy !== void 0) { - return false; - } - return this.#noProxyValue !== this.#noProxyEnv; + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestContentLengthMismatchError] === true; } - get #noProxyEnv() { - return process.env.no_proxy ?? process.env.NO_PROXY ?? ""; + get [kRequestContentLengthMismatchError]() { + return true; } }; - module.exports = EnvHttpProxyAgent; - } -}); - -// node_modules/undici/lib/handler/retry-handler.js -var require_retry_handler = __commonJS({ - "node_modules/undici/lib/handler/retry-handler.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { kRetryHandlerDefaultRetry } = require_symbols(); - var { RequestRetryError } = require_errors(); - var { - isDisturbed, - parseRangeHeader, - wrapRequestBody - } = require_util(); - function calculateRetryAfterHeader(retryAfter) { - const retryTime = new Date(retryAfter).getTime(); - return isNaN(retryTime) ? 0 : retryTime - Date.now(); - } - var RetryHandler = class _RetryHandler { - constructor(opts, { dispatch, handler }) { - const { retryOptions, ...dispatchOpts } = opts; - const { - // Retry scoped - retry: retryFn, - maxRetries, - maxTimeout, - minTimeout, - timeoutFactor, - // Response scoped - methods, - errorCodes, - retryAfter, - statusCodes, - throwOnError - } = retryOptions ?? {}; - this.error = null; - this.dispatch = dispatch; - this.handler = handler; - this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }; - this.retryOpts = { - throwOnError: throwOnError ?? true, - retry: retryFn ?? _RetryHandler[kRetryHandlerDefaultRetry], - retryAfter: retryAfter ?? true, - maxTimeout: maxTimeout ?? 30 * 1e3, - // 30s, - minTimeout: minTimeout ?? 500, - // .5s - timeoutFactor: timeoutFactor ?? 2, - maxRetries: maxRetries ?? 5, - // What errors we should retry - methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], - // Indicates which errors to retry - statusCodes: statusCodes ?? [500, 502, 503, 504, 429], - // List of errors to retry - errorCodes: errorCodes ?? [ - "ECONNRESET", - "ECONNREFUSED", - "ENOTFOUND", - "ENETDOWN", - "ENETUNREACH", - "EHOSTDOWN", - "EHOSTUNREACH", - "EPIPE", - "UND_ERR_SOCKET" - ] - }; - this.retryCount = 0; - this.retryCountCheckpoint = 0; - this.headersSent = false; - this.start = 0; - this.end = null; - this.etag = null; + var kResponseContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH"); + var ResponseContentLengthMismatchError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "ResponseContentLengthMismatchError"; + this.message = message || "Response body length does not match content-length header"; + this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; } - onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err) { - if (this.retryOpts.throwOnError) { - if (this.retryOpts.statusCodes.includes(statusCode) === false) { - this.headersSent = true; - this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); - } else { - this.error = err; - } - return; - } - if (isDisturbed(this.opts.body)) { - this.headersSent = true; - this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); - return; - } - function shouldRetry2(passedErr) { - if (passedErr) { - this.headersSent = true; - this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); - controller.resume(); - return; - } - this.error = err; - controller.resume(); - } - controller.pause(); - this.retryOpts.retry( - err, - { - state: { counter: this.retryCount }, - opts: { retryOptions: this.retryOpts, ...this.opts } - }, - shouldRetry2.bind(this) - ); + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseContentLengthMismatchError] === true; } - onRequestStart(controller, context) { - if (!this.headersSent) { - this.handler.onRequestStart?.(controller, context); - } + get [kResponseContentLengthMismatchError]() { + return true; } - onRequestUpgrade(controller, statusCode, headers, socket) { - this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket); + }; + var kClientDestroyedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_DESTROYED"); + var ClientDestroyedError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "ClientDestroyedError"; + this.message = message || "The client is destroyed"; + this.code = "UND_ERR_DESTROYED"; } - static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { - const { statusCode, code, headers } = err; - const { method, retryOptions } = opts; - const { - maxRetries, - minTimeout, - maxTimeout, - timeoutFactor, - statusCodes, - errorCodes, - methods - } = retryOptions; - const { counter } = state; - if (code && code !== "UND_ERR_REQ_RETRY" && !errorCodes.includes(code)) { - cb(err); - return; - } - if (Array.isArray(methods) && !methods.includes(method)) { - cb(err); - return; - } - if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { - cb(err); - return; - } - if (counter > maxRetries) { - cb(err); - return; - } - let retryAfterHeader = headers?.["retry-after"]; - if (retryAfterHeader) { - retryAfterHeader = Number(retryAfterHeader); - retryAfterHeader = Number.isNaN(retryAfterHeader) ? calculateRetryAfterHeader(headers["retry-after"]) : retryAfterHeader * 1e3; - } - const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); - setTimeout(() => cb(null), retryTimeout); + static [Symbol.hasInstance](instance) { + return instance && instance[kClientDestroyedError] === true; } - onResponseStart(controller, statusCode, headers, statusMessage) { - this.error = null; - this.retryCount += 1; - if (statusCode >= 300) { - const err = new RequestRetryError("Request failed", statusCode, { - headers, - data: { - count: this.retryCount - } - }); - this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err); - return; - } - if (this.headersSent) { - if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { - throw new RequestRetryError("server does not support the range header and the payload was partially consumed", statusCode, { - headers, - data: { count: this.retryCount } - }); - } - const contentRange = parseRangeHeader(headers["content-range"]); - if (!contentRange) { - throw new RequestRetryError("Content-Range mismatch", statusCode, { - headers, - data: { count: this.retryCount } - }); - } - if (this.etag != null && this.etag !== headers.etag) { - throw new RequestRetryError("ETag mismatch", statusCode, { - headers, - data: { count: this.retryCount } - }); - } - const { start, size: size5, end = size5 ? size5 - 1 : null } = contentRange; - assert8(this.start === start, "content-range mismatch"); - assert8(this.end == null || this.end === end, "content-range mismatch"); - return; - } - if (this.end == null) { - if (statusCode === 206) { - const range = parseRangeHeader(headers["content-range"]); - if (range == null) { - this.headersSent = true; - this.handler.onResponseStart?.( - controller, - statusCode, - headers, - statusMessage - ); - return; - } - const { start, size: size5, end = size5 ? size5 - 1 : null } = range; - assert8( - start != null && Number.isFinite(start), - "content-range mismatch" - ); - assert8(end != null && Number.isFinite(end), "invalid content-length"); - this.start = start; - this.end = end; - } - if (this.end == null) { - const contentLength = headers["content-length"]; - this.end = contentLength != null ? Number(contentLength) - 1 : null; - } - assert8(Number.isFinite(this.start)); - assert8( - this.end == null || Number.isFinite(this.end), - "invalid content-length" - ); - this.resume = true; - this.etag = headers.etag != null ? headers.etag : null; - if (this.etag != null && this.etag[0] === "W" && this.etag[1] === "/") { - this.etag = null; - } - this.headersSent = true; - this.handler.onResponseStart?.( - controller, - statusCode, - headers, - statusMessage - ); - } else { - throw new RequestRetryError("Request failed", statusCode, { - headers, - data: { count: this.retryCount } - }); - } + get [kClientDestroyedError]() { + return true; } - onResponseData(controller, chunk) { - if (this.error) { - return; - } - this.start += chunk.length; - this.handler.onResponseData?.(controller, chunk); + }; + var kClientClosedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CLOSED"); + var ClientClosedError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "ClientClosedError"; + this.message = message || "The client is closed"; + this.code = "UND_ERR_CLOSED"; } - onResponseEnd(controller, trailers) { - if (this.error && this.retryOpts.throwOnError) { - throw this.error; - } - if (!this.error) { - this.retryCount = 0; - return this.handler.onResponseEnd?.(controller, trailers); - } - this.retry(controller); + static [Symbol.hasInstance](instance) { + return instance && instance[kClientClosedError] === true; } - retry(controller) { - if (this.start !== 0) { - const headers = { range: `bytes=${this.start}-${this.end ?? ""}` }; - if (this.etag != null) { - headers["if-match"] = this.etag; - } - this.opts = { - ...this.opts, - headers: { - ...this.opts.headers, - ...headers - } - }; - } - try { - this.retryCountCheckpoint = this.retryCount; - this.dispatch(this.opts, this); - } catch (err) { - this.handler.onResponseError?.(controller, err); - } + get [kClientClosedError]() { + return true; } - onResponseError(controller, err) { - if (controller?.aborted || isDisturbed(this.opts.body)) { - this.handler.onResponseError?.(controller, err); - return; - } - function shouldRetry2(returnedErr) { - if (!returnedErr) { - this.retry(controller); - return; - } - this.handler?.onResponseError?.(controller, returnedErr); - } - if (this.retryCount - this.retryCountCheckpoint > 0) { - this.retryCount = this.retryCountCheckpoint + (this.retryCount - this.retryCountCheckpoint); - } else { - this.retryCount += 1; - } - this.retryOpts.retry( - err, - { - state: { counter: this.retryCount }, - opts: { retryOptions: this.retryOpts, ...this.opts } - }, - shouldRetry2.bind(this) - ); + }; + var kSocketError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_SOCKET"); + var SocketError = class extends UndiciError { + constructor(message, socket) { + super(message); + this.name = "SocketError"; + this.message = message || "Socket error"; + this.code = "UND_ERR_SOCKET"; + this.socket = socket; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kSocketError] === true; + } + get [kSocketError]() { + return true; } }; - module.exports = RetryHandler; - } -}); - -// node_modules/undici/lib/dispatcher/retry-agent.js -var require_retry_agent = __commonJS({ - "node_modules/undici/lib/dispatcher/retry-agent.js"(exports, module) { - "use strict"; - var Dispatcher = require_dispatcher(); - var RetryHandler = require_retry_handler(); - var RetryAgent = class extends Dispatcher { - #agent = null; - #options = null; - constructor(agent, options = {}) { - super(options); - this.#agent = agent; - this.#options = options; + var kNotSupportedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_NOT_SUPPORTED"); + var NotSupportedError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "NotSupportedError"; + this.message = message || "Not supported error"; + this.code = "UND_ERR_NOT_SUPPORTED"; } - dispatch(opts, handler) { - const retry = new RetryHandler({ - ...opts, - retryOptions: this.#options - }, { - dispatch: this.#agent.dispatch.bind(this.#agent), - handler - }); - return this.#agent.dispatch(opts, retry); + static [Symbol.hasInstance](instance) { + return instance && instance[kNotSupportedError] === true; } - close() { - return this.#agent.close(); + get [kNotSupportedError]() { + return true; } - destroy() { - return this.#agent.destroy(); + }; + var kBalancedPoolMissingUpstreamError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BPL_MISSING_UPSTREAM"); + var BalancedPoolMissingUpstreamError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "MissingUpstreamError"; + this.message = message || "No upstream has been added to the BalancedPool"; + this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true; + } + get [kBalancedPoolMissingUpstreamError]() { + return true; } }; - module.exports = RetryAgent; - } -}); - -// node_modules/undici/lib/dispatcher/h2c-client.js -var require_h2c_client = __commonJS({ - "node_modules/undici/lib/dispatcher/h2c-client.js"(exports, module) { - "use strict"; - var { InvalidArgumentError } = require_errors(); - var Client = require_client(); - var H2CClient = class extends Client { - constructor(origin, clientOpts) { - if (typeof origin === "string") { - origin = new URL(origin); - } - if (origin.protocol !== "http:") { - throw new InvalidArgumentError( - "h2c-client: Only h2c protocol is supported" - ); - } - const { maxConcurrentStreams, pipelining, ...opts } = clientOpts ?? {}; - let defaultMaxConcurrentStreams = 100; - let defaultPipelining = 100; - if (maxConcurrentStreams != null && Number.isInteger(maxConcurrentStreams) && maxConcurrentStreams > 0) { - defaultMaxConcurrentStreams = maxConcurrentStreams; - } - if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) { - defaultPipelining = pipelining; - } - if (defaultPipelining > defaultMaxConcurrentStreams) { - throw new InvalidArgumentError( - "h2c-client: pipelining cannot be greater than maxConcurrentStreams" - ); - } - super(origin, { - ...opts, - maxConcurrentStreams: defaultMaxConcurrentStreams, - pipelining: defaultPipelining, - allowH2: true, - useH2c: true - }); + var kHTTPParserError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HTTP_PARSER"); + var HTTPParserError = class extends Error { + constructor(message, code, data) { + super(message); + this.name = "HTTPParserError"; + this.code = code ? `HPE_${code}` : void 0; + this.data = data ? data.toString() : void 0; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kHTTPParserError] === true; + } + get [kHTTPParserError]() { + return true; } }; - module.exports = H2CClient; - } -}); - -// node_modules/undici/lib/api/readable.js -var require_readable = __commonJS({ - "node_modules/undici/lib/api/readable.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { Readable } = __require("stream"); - var { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require_errors(); - var util2 = require_util(); - var { ReadableStreamFrom } = require_util(); - var kConsume = /* @__PURE__ */ Symbol("kConsume"); - var kReading = /* @__PURE__ */ Symbol("kReading"); - var kBody = /* @__PURE__ */ Symbol("kBody"); - var kAbort = /* @__PURE__ */ Symbol("kAbort"); - var kContentType = /* @__PURE__ */ Symbol("kContentType"); - var kContentLength = /* @__PURE__ */ Symbol("kContentLength"); - var kUsed = /* @__PURE__ */ Symbol("kUsed"); - var kBytesRead = /* @__PURE__ */ Symbol("kBytesRead"); - var noop = () => { + var kResponseExceededMaxSizeError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE"); + var ResponseExceededMaxSizeError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "ResponseExceededMaxSizeError"; + this.message = message || "Response content exceeded max size"; + this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseExceededMaxSizeError] === true; + } + get [kResponseExceededMaxSizeError]() { + return true; + } }; - var BodyReadable = class extends Readable { - /** - * @param {object} opts - * @param {(this: Readable, size: number) => void} opts.resume - * @param {() => (void | null)} opts.abort - * @param {string} [opts.contentType = ''] - * @param {number} [opts.contentLength] - * @param {number} [opts.highWaterMark = 64 * 1024] - */ - constructor({ - resume, - abort, - contentType = "", - contentLength, - highWaterMark = 64 * 1024 - // Same as nodejs fs streams. - }) { - super({ - autoDestroy: true, - read: resume, - highWaterMark - }); - this._readableState.dataEmitted = false; - this[kAbort] = abort; - this[kConsume] = null; - this[kBytesRead] = 0; - this[kBody] = null; - this[kUsed] = false; - this[kContentType] = contentType; - this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null; - this[kReading] = false; + var kRequestRetryError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_RETRY"); + var RequestRetryError = class extends UndiciError { + constructor(message, code, { headers, data }) { + super(message); + this.name = "RequestRetryError"; + this.message = message || "Request retry error"; + this.code = "UND_ERR_REQ_RETRY"; + this.statusCode = code; + this.data = data; + this.headers = headers; } - /** - * @param {Error|null} err - * @param {(error:(Error|null)) => void} callback - * @returns {void} - */ - _destroy(err, callback) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError(); - } - if (err) { - this[kAbort](); - } - if (!this[kUsed]) { - setImmediate(callback, err); - } else { - callback(err); - } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestRetryError] === true; } - /** - * @param {string|symbol} event - * @param {(...args: any[]) => void} listener - * @returns {this} - */ - on(event, listener) { - if (event === "data" || event === "readable") { - this[kReading] = true; - this[kUsed] = true; - } - return super.on(event, listener); + get [kRequestRetryError]() { + return true; } - /** - * @param {string|symbol} event - * @param {(...args: any[]) => void} listener - * @returns {this} - */ - addListener(event, listener) { - return this.on(event, listener); + }; + var kResponseError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RESPONSE"); + var ResponseError = class extends UndiciError { + constructor(message, code, { headers, body }) { + super(message); + this.name = "ResponseError"; + this.message = message || "Response error"; + this.code = "UND_ERR_RESPONSE"; + this.statusCode = code; + this.body = body; + this.headers = headers; } - /** - * @param {string|symbol} event - * @param {(...args: any[]) => void} listener - * @returns {this} - */ - off(event, listener) { - const ret = super.off(event, listener); - if (event === "data" || event === "readable") { - this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; - } - return ret; + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseError] === true; } - /** - * @param {string|symbol} event - * @param {(...args: any[]) => void} listener - * @returns {this} - */ - removeListener(event, listener) { - return this.off(event, listener); + get [kResponseError]() { + return true; } - /** - * @param {Buffer|null} chunk - * @returns {boolean} - */ - push(chunk) { - if (chunk) { - this[kBytesRead] += chunk.length; - if (this[kConsume]) { - consumePush(this[kConsume], chunk); - return this[kReading] ? super.push(chunk) : true; - } - } - return super.push(chunk); + }; + var kSecureProxyConnectionError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_PRX_TLS"); + var SecureProxyConnectionError = class extends UndiciError { + constructor(cause, message, options = {}) { + super(message, { cause, ...options }); + this.name = "SecureProxyConnectionError"; + this.message = message || "Secure Proxy Connection failed"; + this.code = "UND_ERR_PRX_TLS"; + this.cause = cause; } - /** - * Consumes and returns the body as a string. - * - * @see https://fetch.spec.whatwg.org/#dom-body-text - * @returns {Promise} - */ - text() { - return consume(this, "text"); + static [Symbol.hasInstance](instance) { + return instance && instance[kSecureProxyConnectionError] === true; } - /** - * Consumes and returns the body as a JavaScript Object. - * - * @see https://fetch.spec.whatwg.org/#dom-body-json - * @returns {Promise} - */ - json() { - return consume(this, "json"); + get [kSecureProxyConnectionError]() { + return true; } - /** - * Consumes and returns the body as a Blob - * - * @see https://fetch.spec.whatwg.org/#dom-body-blob - * @returns {Promise} - */ - blob() { - return consume(this, "blob"); + }; + var kMaxOriginsReachedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_MAX_ORIGINS_REACHED"); + var MaxOriginsReachedError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "MaxOriginsReachedError"; + this.message = message || "Maximum allowed origins reached"; + this.code = "UND_ERR_MAX_ORIGINS_REACHED"; } - /** - * Consumes and returns the body as an Uint8Array. - * - * @see https://fetch.spec.whatwg.org/#dom-body-bytes - * @returns {Promise} - */ - bytes() { - return consume(this, "bytes"); + static [Symbol.hasInstance](instance) { + return instance && instance[kMaxOriginsReachedError] === true; } - /** - * Consumes and returns the body as an ArrayBuffer. - * - * @see https://fetch.spec.whatwg.org/#dom-body-arraybuffer - * @returns {Promise} - */ - arrayBuffer() { - return consume(this, "arrayBuffer"); + get [kMaxOriginsReachedError]() { + return true; } - /** - * Not implemented - * - * @see https://fetch.spec.whatwg.org/#dom-body-formdata - * @throws {NotSupportedError} - */ - async formData() { - throw new NotSupportedError(); + }; + var Socks5ProxyError = class extends UndiciError { + constructor(message, code) { + super(message); + this.name = "Socks5ProxyError"; + this.message = message || "SOCKS5 proxy error"; + this.code = code || "UND_ERR_SOCKS5"; } - /** - * Returns true if the body is not null and the body has been consumed. - * Otherwise, returns false. - * - * @see https://fetch.spec.whatwg.org/#dom-body-bodyused - * @readonly - * @returns {boolean} - */ - get bodyUsed() { - return util2.isDisturbed(this); + }; + var kMessageSizeExceededError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED"); + var MessageSizeExceededError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "MessageSizeExceededError"; + this.message = message || "Max decompressed message size exceeded"; + this.code = "UND_ERR_WS_MESSAGE_SIZE_EXCEEDED"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kMessageSizeExceededError] === true; + } + get [kMessageSizeExceededError]() { + return true; + } + }; + module.exports = { + AbortError, + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError, + RequestRetryError, + ResponseError, + SecureProxyConnectionError, + MaxOriginsReachedError, + Socks5ProxyError, + MessageSizeExceededError + }; + } +}); + +// node_modules/undici/lib/core/constants.js +var require_constants2 = __commonJS({ + "node_modules/undici/lib/core/constants.js"(exports, module) { + "use strict"; + var wellknownHeaderNames = ( + /** @type {const} */ + [ + "Accept", + "Accept-Encoding", + "Accept-Language", + "Accept-Ranges", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Age", + "Allow", + "Alt-Svc", + "Alt-Used", + "Authorization", + "Cache-Control", + "Clear-Site-Data", + "Connection", + "Content-Disposition", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-Range", + "Content-Security-Policy", + "Content-Security-Policy-Report-Only", + "Content-Type", + "Cookie", + "Cross-Origin-Embedder-Policy", + "Cross-Origin-Opener-Policy", + "Cross-Origin-Resource-Policy", + "Date", + "Device-Memory", + "Downlink", + "ECT", + "ETag", + "Expect", + "Expect-CT", + "Expires", + "Forwarded", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", + "Keep-Alive", + "Last-Modified", + "Link", + "Location", + "Max-Forwards", + "Origin", + "Permissions-Policy", + "Pragma", + "Proxy-Authenticate", + "Proxy-Authorization", + "RTT", + "Range", + "Referer", + "Referrer-Policy", + "Refresh", + "Retry-After", + "Sec-WebSocket-Accept", + "Sec-WebSocket-Extensions", + "Sec-WebSocket-Key", + "Sec-WebSocket-Protocol", + "Sec-WebSocket-Version", + "Server", + "Server-Timing", + "Service-Worker-Allowed", + "Service-Worker-Navigation-Preload", + "Set-Cookie", + "SourceMap", + "Strict-Transport-Security", + "Supports-Loading-Mode", + "TE", + "Timing-Allow-Origin", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Upgrade-Insecure-Requests", + "User-Agent", + "Vary", + "Via", + "WWW-Authenticate", + "X-Content-Type-Options", + "X-DNS-Prefetch-Control", + "X-Frame-Options", + "X-Permitted-Cross-Domain-Policies", + "X-Powered-By", + "X-Requested-With", + "X-XSS-Protection" + ] + ); + var headerNameLowerCasedRecord = {}; + Object.setPrototypeOf(headerNameLowerCasedRecord, null); + var wellknownHeaderNameBuffers = {}; + Object.setPrototypeOf(wellknownHeaderNameBuffers, null); + function getHeaderNameAsBuffer(header) { + let buffer2 = wellknownHeaderNameBuffers[header]; + if (buffer2 === void 0) { + buffer2 = Buffer.from(header); } + return buffer2; + } + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i]; + const lowerCasedKey = key.toLowerCase(); + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + } + module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord, + getHeaderNameAsBuffer + }; + } +}); + +// node_modules/undici/lib/core/tree.js +var require_tree = __commonJS({ + "node_modules/undici/lib/core/tree.js"(exports, module) { + "use strict"; + var { + wellknownHeaderNames, + headerNameLowerCasedRecord + } = require_constants2(); + var TstNode = class _TstNode { + /** @type {any} */ + value = null; + /** @type {null | TstNode} */ + left = null; + /** @type {null | TstNode} */ + middle = null; + /** @type {null | TstNode} */ + right = null; + /** @type {number} */ + code; /** - * @see https://fetch.spec.whatwg.org/#dom-body-body - * @readonly - * @returns {ReadableStream} + * @param {string} key + * @param {any} value + * @param {number} index */ - get body() { - if (!this[kBody]) { - this[kBody] = ReadableStreamFrom(this); - if (this[kConsume]) { - this[kBody].getReader(); - assert8(this[kBody].locked); - } + constructor(key, value, index2) { + if (index2 === void 0 || index2 >= key.length) { + throw new TypeError("Unreachable"); + } + const code = this.code = key.charCodeAt(index2); + if (code > 127) { + throw new TypeError("key must be ascii string"); + } + if (key.length !== ++index2) { + this.middle = new _TstNode(key, value, index2); + } else { + this.value = value; } - return this[kBody]; } /** - * Dumps the response body by reading `limit` number of bytes. - * @param {object} opts - * @param {number} [opts.limit = 131072] Number of bytes to read. - * @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump. - * @returns {Promise} + * @param {string} key + * @param {any} value + * @returns {void} */ - dump(opts) { - const signal = opts?.signal; - if (signal != null && (typeof signal !== "object" || !("aborted" in signal))) { - return Promise.reject(new InvalidArgumentError("signal must be an AbortSignal")); - } - const limit = opts?.limit && Number.isFinite(opts.limit) ? opts.limit : 128 * 1024; - if (signal?.aborted) { - return Promise.reject(signal.reason ?? new AbortError()); - } - if (this._readableState.closeEmitted) { - return Promise.resolve(null); + add(key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError("Unreachable"); } - return new Promise((resolve, reject) => { - if (this[kContentLength] && this[kContentLength] > limit || this[kBytesRead] > limit) { - this.destroy(new AbortError()); + let index2 = 0; + let node = this; + while (true) { + const code = key.charCodeAt(index2); + if (code > 127) { + throw new TypeError("key must be ascii string"); } - if (signal) { - const onAbort = () => { - this.destroy(signal.reason ?? new AbortError()); - }; - signal.addEventListener("abort", onAbort); - this.on("close", function() { - signal.removeEventListener("abort", onAbort); - if (signal.aborted) { - reject(signal.reason ?? new AbortError()); - } else { - resolve(null); - } - }); + if (node.code === code) { + if (length === ++index2) { + node.value = value; + break; + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new _TstNode(key, value, index2); + break; + } + } else if (node.code < code) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new _TstNode(key, value, index2); + break; + } + } else if (node.right !== null) { + node = node.right; } else { - this.on("close", resolve); + node.right = new _TstNode(key, value, index2); + break; } - this.on("error", noop).on("data", () => { - if (this[kBytesRead] > limit) { - this.destroy(); - } - }).resume(); - }); + } } /** - * @param {BufferEncoding} encoding - * @returns {this} + * @param {Uint8Array} key + * @returns {TstNode | null} */ - setEncoding(encoding) { - if (Buffer.isEncoding(encoding)) { - this._readableState.encoding = encoding; + search(key) { + const keylength = key.length; + let index2 = 0; + let node = this; + while (node !== null && index2 < keylength) { + let code = key[index2]; + if (code <= 90 && code >= 65) { + code |= 32; + } + while (node !== null) { + if (code === node.code) { + if (keylength === ++index2) { + return node; + } + node = node.middle; + break; + } + node = node.code < code ? node.left : node.right; + } } - return this; + return null; } }; - function isLocked(bodyReadable) { - return bodyReadable[kBody]?.locked === true || bodyReadable[kConsume] !== null; - } - function isUnusable(bodyReadable) { - return util2.isDisturbed(bodyReadable) || isLocked(bodyReadable); - } - function consume(stream, type) { - assert8(!stream[kConsume]); - return new Promise((resolve, reject) => { - if (isUnusable(stream)) { - const rState = stream._readableState; - if (rState.destroyed && rState.closeEmitted === false) { - stream.on("error", reject).on("close", () => { - reject(new TypeError("unusable")); - }); - } else { - reject(rState.errored ?? new TypeError("unusable")); - } + var TernarySearchTree = class { + /** @type {TstNode | null} */ + node = null; + /** + * @param {string} key + * @param {any} value + * @returns {void} + * */ + insert(key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); } else { - queueMicrotask(() => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - }; - stream.on("error", function(err) { - consumeFinish(this[kConsume], err); - }).on("close", function() { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError()); - } - }); - consumeStart(stream[kConsume]); - }); + this.node.add(key, value); } - }); - } - function consumeStart(consume2) { - if (consume2.body === null) { - return; } - const { _readableState: state } = consume2.stream; - if (state.bufferIndex) { - const start = state.bufferIndex; - const end = state.buffer.length; - for (let n = start; n < end; n++) { - consumePush(consume2, state.buffer[n]); - } - } else { - for (const chunk of state.buffer) { - consumePush(consume2, chunk); - } + /** + * @param {Uint8Array} key + * @returns {any} + */ + lookup(key) { + return this.node?.search(key)?.value ?? null; } - if (state.endEmitted) { - consumeEnd(this[kConsume], this._readableState.encoding); - } else { - consume2.stream.on("end", function() { - consumeEnd(this[kConsume], this._readableState.encoding); - }); + }; + var tree = new TernarySearchTree(); + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + module.exports = { + TernarySearchTree, + tree + }; + } +}); + +// node_modules/undici/lib/core/util.js +var require_util = __commonJS({ + "node_modules/undici/lib/core/util.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols(); + var { IncomingMessage } = __require("http"); + var stream = __require("stream"); + var net = __require("net"); + var { stringify: stringify4 } = __require("querystring"); + var { EventEmitter: EE } = __require("events"); + var timers = require_timers(); + var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); + var { headerNameLowerCasedRecord } = require_constants2(); + var { tree } = require_tree(); + var BodyAsyncIterable = class { + constructor(body) { + this[kBody] = body; + this[kBodyUsed] = false; } - consume2.stream.resume(); - while (consume2.stream.read() != null) { + async *[Symbol.asyncIterator]() { + assert8(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; } + }; + function noop() { } - function chunksDecode(chunks, length, encoding) { - if (chunks.length === 0 || length === 0) { - return ""; - } - const buffer2 = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); - const bufferLength = buffer2.length; - const start = bufferLength > 2 && buffer2[0] === 239 && buffer2[1] === 187 && buffer2[2] === 191 ? 3 : 0; - if (!encoding || encoding === "utf8" || encoding === "utf-8") { - return buffer2.utf8Slice(start, bufferLength); + function wrapRequestBody(body) { + if (isStream(body)) { + if (bodyLength(body) === 0) { + body.on("data", function() { + assert8(false); + }); + } + if (typeof body.readableDidRead !== "boolean") { + body[kBodyUsed] = false; + EE.prototype.on.call(body, "data", function() { + this[kBodyUsed] = true; + }); + } + return body; + } else if (body && typeof body.pipeTo === "function") { + return new BodyAsyncIterable(body); + } else if (body && isFormDataLike(body)) { + return body; + } else if (body && typeof body !== "string" && !ArrayBuffer.isView(body) && isIterable(body)) { + return new BodyAsyncIterable(body); } else { - return buffer2.subarray(start, bufferLength).toString(encoding); + return body; } } - function chunksConcat(chunks, length) { - if (chunks.length === 0 || length === 0) { - return new Uint8Array(0); - } - if (chunks.length === 1) { - return new Uint8Array(chunks[0]); - } - const buffer2 = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer); - let offset = 0; - for (let i = 0; i < chunks.length; ++i) { - const chunk = chunks[i]; - buffer2.set(chunk, offset); - offset += chunk.length; - } - return buffer2; + function isStream(obj) { + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; } - function consumeEnd(consume2, encoding) { - const { type, body, resolve, stream, length } = consume2; - try { - if (type === "text") { - resolve(chunksDecode(body, length, encoding)); - } else if (type === "json") { - resolve(JSON.parse(chunksDecode(body, length, encoding))); - } else if (type === "arrayBuffer") { - resolve(chunksConcat(body, length).buffer); - } else if (type === "blob") { - resolve(new Blob(body, { type: stream[kContentType] })); - } else if (type === "bytes") { - resolve(chunksConcat(body, length)); - } - consumeFinish(consume2); - } catch (err) { - stream.destroy(err); - } + function isBlobLike(object) { + return object instanceof Blob; } - function consumePush(consume2, chunk) { - consume2.length += chunk.length; - consume2.body.push(chunk); + function pathHasQueryOrFragment(url) { + return url.includes("?") || url.includes("#"); } - function consumeFinish(consume2, err) { - if (consume2.body === null) { - return; + function serializePathWithQuery(url, queryParams) { + if (pathHasQueryOrFragment(url)) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".'); } - if (err) { - consume2.reject(err); - } else { - consume2.resolve(); + const stringified = stringify4(queryParams); + if (stringified) { + url += "?" + stringified; } - consume2.type = null; - consume2.stream = null; - consume2.resolve = null; - consume2.reject = null; - consume2.length = 0; - consume2.body = null; + return url; } - module.exports = { - Readable: BodyReadable, - chunksDecode - }; - } -}); - -// node_modules/undici/lib/api/api-request.js -var require_api_request = __commonJS({ - "node_modules/undici/lib/api/api-request.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { AsyncResource } = __require("async_hooks"); - var { Readable } = require_readable(); - var { InvalidArgumentError, RequestAbortedError } = require_errors(); - var util2 = require_util(); - function noop() { + function isValidPort(port) { + const value = parseInt(port, 10); + return value === Number(port) && value >= 0 && value <= 65535; } - var RequestHandler = class extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); + function isHttpOrHttpsPrefixed(value) { + return value != null && value[0] === "h" && value[1] === "t" && value[2] === "t" && value[3] === "p" && (value[4] === ":" || value[4] === "s" && value[5] === ":"); + } + function parseURL(url) { + if (typeof url === "string") { + url = new URL(url); + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } - const { signal, method, opaque, body, onInfo, responseHeaders, highWaterMark } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { - throw new InvalidArgumentError("invalid highWaterMark"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_REQUEST"); - } catch (err) { - if (util2.isStream(body)) { - util2.destroy(body.on("error", noop), err); - } - throw err; + return url; + } + if (!url || typeof url !== "object") { + throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); + } + if (!(url instanceof URL)) { + if (url.port != null && url.port !== "" && isValidPort(url.port) === false) { + throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); } - this.method = method; - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.res = null; - this.abort = null; - this.body = body; - this.trailers = {}; - this.context = null; - this.controller = null; - this.onInfo = onInfo || null; - this.highWaterMark = highWaterMark; - this.reason = null; - this.removeAbortListener = null; - if (signal?.aborted) { - this.reason = signal.reason ?? new RequestAbortedError(); - } else if (signal) { - this.removeAbortListener = util2.addAbortListener(signal, () => { - this.reason = signal.reason ?? new RequestAbortedError(); - if (this.res) { - util2.destroy(this.res.on("error", noop), this.reason); - } else if (this.abort) { - this.abort(this.reason); - } - }); + if (url.path != null && typeof url.path !== "string") { + throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); + } + if (url.pathname != null && typeof url.pathname !== "string") { + throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); + } + if (url.hostname != null && typeof url.hostname !== "string") { + throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); + } + if (url.origin != null && typeof url.origin !== "string") { + throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); + } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } + const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; + let origin = url.origin != null ? url.origin : `${url.protocol || ""}//${url.hostname || ""}:${port}`; + let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; + if (origin[origin.length - 1] === "/") { + origin = origin.slice(0, origin.length - 1); + } + if (path && path[0] !== "/") { + path = `/${path}`; + } + return new URL(`${origin}${path}`); + } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + return url; + } + function parseOrigin(url) { + url = parseURL(url); + if (url.pathname !== "/" || url.search || url.hash) { + throw new InvalidArgumentError("invalid url"); + } + return url; + } + function getHostname(host) { + if (host[0] === "[") { + const idx2 = host.indexOf("]"); + assert8(idx2 !== -1); + return host.substring(1, idx2); + } + const idx = host.indexOf(":"); + if (idx === -1) return host; + return host.substring(0, idx); + } + function getServerName(host) { + if (!host) { + return null; } - onRequestStart(controller, context) { - if (this.reason) { - controller.abort(this.reason); - return; - } - assert8(this.callback); - this.controller = controller; - this.abort = (reason) => controller.abort(reason); - this.context = context; + assert8(typeof host === "string"); + const servername = getHostname(host); + if (net.isIP(servername)) { + return ""; } - onResponseStart(controller, statusCode, headers, statusText) { - const { callback, opaque, context, responseHeaders, highWaterMark } = this; - const rawHeaders = controller?.rawHeaders; - const responseHeaderData = responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers: responseHeaderData }); - } - return; + return servername; + } + function deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + function isAsyncIterable(obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); + } + function isIterable(obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + } + function hasSafeIterator(obj) { + const prototype = Object.getPrototypeOf(obj); + const ownIterator = Object.hasOwn(obj, Symbol.iterator); + return ownIterator || prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === "function"; + } + function bodyLength(body) { + if (body == null) { + return 0; + } else if (isStream(body)) { + const state = body._readableState; + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null; + } else if (isBuffer(body)) { + return body.byteLength; + } + return null; + } + function isDestroyed(body) { + return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body)); + } + function destroy(stream2, err) { + if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { + return; + } + if (typeof stream2.destroy === "function") { + if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { + stream2.socket = null; } - const parsedHeaders = headers; - const contentType = parsedHeaders?.["content-type"]; - const contentLength = parsedHeaders?.["content-length"]; - const res = new Readable({ - resume: () => controller.resume(), - abort: (reason) => controller.abort(reason), - contentType, - contentLength: this.method !== "HEAD" && contentLength ? Number(contentLength) : null, - highWaterMark + stream2.destroy(err); + } else if (err) { + queueMicrotask(() => { + stream2.emit("error", err); }); - if (this.removeAbortListener) { - res.on("close", this.removeAbortListener); - this.removeAbortListener = null; - } - this.callback = null; - this.res = res; - if (callback !== null) { - try { - this.runInAsyncScope(callback, null, null, { - statusCode, - statusText, - headers: responseHeaderData, - trailers: this.trailers, - opaque, - body: res, - context - }); - } catch (err) { - this.res = null; - util2.destroy(res.on("error", noop), err); - queueMicrotask(() => { - throw err; - }); - } - } } - onResponseData(controller, chunk) { - if (!this.res) { - return; - } - if (this.res.push(chunk) === false) { - controller.pause(); - } + if (stream2.destroyed !== true) { + stream2[kDestroyed] = true; } - onResponseEnd(_controller, trailers) { - if (trailers && typeof trailers === "object") { - for (const key of Object.keys(trailers)) { + } + var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; + function parseKeepAliveTimeout(val) { + const m = val.match(KEEPALIVE_TIMEOUT_EXPR); + return m ? parseInt(m[1], 10) * 1e3 : null; + } + function headerNameToString(value) { + return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + } + function bufferToLowerCasedHeaderName(value) { + return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + } + function parseHeaders(headers, obj) { + if (obj === void 0) obj = {}; + for (let i = 0; i < headers.length; i += 2) { + const key = headerNameToString(headers[i]); + let val = obj[key]; + if (val !== void 0) { + if (!Object.hasOwn(obj, key)) { + const headersValue = typeof headers[i + 1] === "string" ? headers[i + 1] : Array.isArray(headers[i + 1]) ? headers[i + 1].map((x) => x.toString("latin1")) : headers[i + 1].toString("latin1"); if (key === "__proto__") { - Object.defineProperty(this.trailers, key, { - value: trailers[key], + Object.defineProperty(obj, key, { + value: headersValue, enumerable: true, configurable: true, writable: true }); } else { - this.trailers[key] = trailers[key]; + obj[key] = headersValue; + } + } else { + if (typeof val === "string") { + val = [val]; + obj[key] = val; } + val.push(headers[i + 1].toString("latin1")); } + } else { + const headersValue = typeof headers[i + 1] === "string" ? headers[i + 1] : Array.isArray(headers[i + 1]) ? headers[i + 1].map((x) => x.toString("latin1")) : headers[i + 1].toString("latin1"); + obj[key] = headersValue; } - this.res?.push(null); } - onResponseError(_controller, err) { - const { res, callback, body, opaque } = this; - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); + return obj; + } + function parseRawHeaders(headers) { + const headersLength = headers.length; + const ret = new Array(headersLength); + let key; + let val; + for (let n = 0; n < headersLength; n += 2) { + key = headers[n]; + val = headers[n + 1]; + typeof key !== "string" && (key = key.toString()); + typeof val !== "string" && (val = val.toString("latin1")); + ret[n] = key; + ret[n + 1] = val; + } + return ret; + } + function toRawHeaders(headers) { + const rawHeaders = []; + for (const [name, value] of Object.entries(headers)) { + if (Array.isArray(value)) { + for (const entry of value) { + rawHeaders.push(Buffer.from(name, "latin1"), Buffer.from(`${entry}`, "latin1")); + } + } else { + rawHeaders.push(Buffer.from(name, "latin1"), Buffer.from(`${value}`, "latin1")); } - if (res) { - this.res = null; - queueMicrotask(() => { - util2.destroy(res.on("error", noop), err); - }); + } + return rawHeaders; + } + function encodeRawHeaders(headers) { + if (!Array.isArray(headers)) { + throw new TypeError("expected headers to be an array"); + } + return headers.map((x) => Buffer.from(x)); + } + function isBuffer(buffer2) { + return buffer2 instanceof Uint8Array || Buffer.isBuffer(buffer2); + } + function assertRequestHandler(handler, method, upgrade) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + if (typeof handler.onRequestStart !== "function") { + throw new InvalidArgumentError("invalid onRequestStart method"); + } + if (typeof handler.onResponseError !== "function") { + throw new InvalidArgumentError("invalid onResponseError method"); + } + if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) { + throw new InvalidArgumentError("invalid onBodySent method"); + } + if (typeof handler.onRequestSent !== "function" && handler.onRequestSent !== void 0) { + throw new InvalidArgumentError("invalid onRequestSent method"); + } + if (upgrade || method === "CONNECT") { + if (typeof handler.onRequestUpgrade !== "function") { + throw new InvalidArgumentError("invalid onRequestUpgrade method"); } - if (body) { - this.body = null; - if (util2.isStream(body)) { - body.on("error", noop); - util2.destroy(body, err); - } + } else { + if (typeof handler.onResponseStart !== "function") { + throw new InvalidArgumentError("invalid onResponseStart method"); } - if (this.removeAbortListener) { - this.removeAbortListener(); - this.removeAbortListener = null; + if (typeof handler.onResponseData !== "function") { + throw new InvalidArgumentError("invalid onResponseData method"); + } + if (typeof handler.onResponseEnd !== "function") { + throw new InvalidArgumentError("invalid onResponseEnd method"); } } - }; - function request(opts, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const handler = new RequestHandler(opts, callback); - this.dispatch(opts, handler); - } catch (err) { - if (typeof callback !== "function") { - throw err; + } + function isDisturbed(body) { + return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])); + } + function getSocketInfo(socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + }; + } + function ReadableStreamFrom(iterable) { + let iterator; + return new ReadableStream( + { + start() { + iterator = iterable[Symbol.asyncIterator](); + }, + pull(controller) { + return iterator.next().then(({ done, value }) => { + if (done) { + return queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); + if (buf.byteLength) { + return controller.enqueue(new Uint8Array(buf)); + } else { + return this.pull(controller); + } + } + }); + }, + cancel() { + return iterator.return(); + }, + type: "bytes" } - const opaque = opts?.opaque; - queueMicrotask(() => callback(err, { opaque })); + ); + } + function isFormDataLike(object) { + return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; + } + function addAbortListener(signal, listener) { + if ("addEventListener" in signal) { + signal.addEventListener("abort", listener, { once: true }); + return () => signal.removeEventListener("abort", listener); } + signal.once("abort", listener); + return () => signal.removeListener("abort", listener); + } + var validTokenChars = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 0-15 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 16-31 + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + // 32-47 (!"#$%&'()*+,-./) + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + // 48-63 (0-9:;<=>?) + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 64-79 (@A-O) + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + // 80-95 (P-Z[\]^_) + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 96-111 (`a-o) + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + // 112-127 (p-z{|}~) + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 128-143 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 144-159 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 160-175 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 176-191 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 192-207 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 208-223 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 224-239 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + // 240-255 + ]); + function isTokenCharCode(c2) { + return validTokenChars[c2] === 1; } - module.exports = request; - module.exports.RequestHandler = RequestHandler; - } -}); - -// node_modules/undici/lib/api/abort-signal.js -var require_abort_signal = __commonJS({ - "node_modules/undici/lib/api/abort-signal.js"(exports, module) { - "use strict"; - var { addAbortListener } = require_util(); - var { RequestAbortedError } = require_errors(); - var kListener = /* @__PURE__ */ Symbol("kListener"); - var kSignal = /* @__PURE__ */ Symbol("kSignal"); - function abort(self) { - if (self.abort) { - self.abort(self[kSignal]?.reason); - } else { - self.reason = self[kSignal]?.reason ?? new RequestAbortedError(); + var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; + function isValidHTTPToken(characters) { + if (characters.length >= 12) return tokenRegExp.test(characters); + if (characters.length === 0) return false; + for (let i = 0; i < characters.length; i++) { + if (validTokenChars[characters.charCodeAt(i)] !== 1) { + return false; + } } - removeSignal(self); + return true; } - function addSignal(self, signal) { - self.reason = null; - self[kSignal] = null; - self[kListener] = null; - if (!signal) { - return; - } - if (signal.aborted) { - abort(self); - return; - } - self[kSignal] = signal; - self[kListener] = () => { - abort(self); - }; - addAbortListener(self[kSignal], self[kListener]); + var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + function isValidHeaderValue(characters) { + return !headerCharRegex.test(characters); } - function removeSignal(self) { - if (!self[kSignal]) { - return; - } - if ("removeEventListener" in self[kSignal]) { - self[kSignal].removeEventListener("abort", self[kListener]); - } else { - self[kSignal].removeListener("abort", self[kListener]); - } - self[kSignal] = null; - self[kListener] = null; + var rangeHeaderRegex = /^bytes (\d+)-(\d+)\/(\d+)?$/; + function parseRangeHeader(range) { + if (range == null || range === "") return { start: 0, end: null, size: null }; + const m = range ? range.match(rangeHeaderRegex) : null; + return m ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } : null; } - module.exports = { - addSignal, - removeSignal - }; - } -}); - -// node_modules/undici/lib/api/api-stream.js -var require_api_stream = __commonJS({ - "node_modules/undici/lib/api/api-stream.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var { finished: finished2 } = __require("stream"); - var { AsyncResource } = __require("async_hooks"); - var { InvalidArgumentError, InvalidReturnValueError } = require_errors(); - var util2 = require_util(); - var { addSignal, removeSignal } = require_abort_signal(); - function noop() { + function addListener(obj, name, listener) { + const listeners = obj[kListeners] ??= []; + listeners.push([name, listener]); + obj.on(name, listener); + return obj; } - var StreamHandler = class extends AsyncResource { - constructor(opts, factory, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - const { signal, method, opaque, body, onInfo, responseHeaders } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("invalid factory"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_STREAM"); - } catch (err) { - if (util2.isStream(body)) { - util2.destroy(body.on("error", noop), err); - } - throw err; - } - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.factory = factory; - this.callback = callback; - this.res = null; - this.abort = null; - this.context = null; - this.controller = null; - this.trailers = null; - this.body = body; - this.onInfo = onInfo || null; - if (util2.isStream(body)) { - body.on("error", (err) => { - this.onResponseError(this.controller, err); - }); - } - addSignal(this, signal); - } - onRequestStart(controller, context) { - if (this.reason) { - controller.abort(this.reason); - return; - } - assert8(this.callback); - this.controller = controller; - this.abort = (reason) => controller.abort(reason); - this.context = context; - } - onResponseStart(controller, statusCode, headers, _statusMessage) { - const { factory, opaque, context, responseHeaders } = this; - const rawHeaders = controller?.rawHeaders; - const responseHeaderData = responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers: responseHeaderData }); - } - return; - } - this.factory = null; - if (factory === null) { - return; - } - const res = this.runInAsyncScope(factory, null, { - statusCode, - headers: responseHeaderData, - opaque, - context - }); - if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { - throw new InvalidReturnValueError("expected Writable"); - } - finished2(res, { readable: false }, (err) => { - const { callback, res: res2, opaque: opaque2, trailers, abort } = this; - this.res = null; - if (err || !res2?.readable) { - util2.destroy(res2, err); - } - this.callback = null; - this.runInAsyncScope(callback, null, err || null, { opaque: opaque2, trailers }); - if (err) { - abort(); - } - }); - res.on("drain", () => controller.resume()); - this.res = res; - const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState?.needDrain; - if (needDrain === true) { - controller.pause(); - } - } - onResponseData(controller, chunk) { - const { res } = this; - if (!res) { - return; - } - if (res.write(chunk) === false) { - controller.pause(); - } - } - onResponseEnd(_controller, trailers) { - const { res } = this; - removeSignal(this); - if (!res) { - return; - } - if (trailers && typeof trailers === "object") { - this.trailers = trailers; - } - res.end(); - } - onResponseError(_controller, err) { - const { res, callback, opaque, body } = this; - removeSignal(this); - this.factory = null; - if (res) { - this.res = null; - util2.destroy(res, err); - } else if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - if (body) { - this.body = null; - util2.destroy(body, err); + function removeAllListeners(obj) { + if (obj[kListeners] != null) { + for (const [name, listener] of obj[kListeners]) { + obj.removeListener(name, listener); } + obj[kListeners] = null; } - }; - function stream(opts, factory, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } + return obj; + } + function errorRequest(client, request, err) { try { - const handler = new StreamHandler(opts, factory, callback); - this.dispatch(opts, handler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts?.opaque; - queueMicrotask(() => callback(err, { opaque })); + request.onResponseError(err); + assert8(request.aborted); + } catch (err2) { + client.emit("error", err2); } } - module.exports = stream; - } -}); - -// node_modules/undici/lib/api/api-pipeline.js -var require_api_pipeline = __commonJS({ - "node_modules/undici/lib/api/api-pipeline.js"(exports, module) { - "use strict"; - var { - Readable, - Duplex, - PassThrough - } = __require("stream"); - var assert8 = __require("assert"); - var { AsyncResource } = __require("async_hooks"); - var { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = require_errors(); - var util2 = require_util(); - var { addSignal, removeSignal } = require_abort_signal(); - function noop() { - } - var kResume = /* @__PURE__ */ Symbol("resume"); - var PipelineRequest = class extends Readable { - constructor() { - super({ autoDestroy: true }); - this[kResume] = null; - } - _read() { - const { [kResume]: resume } = this; - if (resume) { - this[kResume] = null; - resume(); - } - } - _destroy(err, callback) { - this._read(); - callback(err); - } - }; - var PipelineResponse = class extends Readable { - constructor(resume) { - super({ autoDestroy: true }); - this[kResume] = resume; - } - _read() { - this[kResume](); - } - _destroy(err, callback) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError(); - } - callback(err); - } - }; - var PipelineHandler = class extends AsyncResource { - constructor(opts, handler) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof handler !== "function") { - throw new InvalidArgumentError("invalid handler"); - } - const { signal, method, opaque, onInfo, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_PIPELINE"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.handler = handler; - this.abort = null; - this.context = null; - this.onInfo = onInfo || null; - this.req = new PipelineRequest().on("error", noop); - this.ret = new Duplex({ - readableObjectMode: opts.objectMode, - autoDestroy: true, - read: () => { - const { body } = this; - if (body?.resume) { - body.resume(); - } - }, - write: (chunk, encoding, callback) => { - const { req } = this; - if (req.push(chunk, encoding) || req._readableState.destroyed) { - callback(); - } else { - req[kResume] = callback; - } - }, - destroy: (err, callback) => { - const { body, req, res, ret, abort } = this; - if (!err && !ret._readableState.endEmitted) { - err = new RequestAbortedError(); - } - if (abort && err) { - abort(); - } - util2.destroy(body, err); - util2.destroy(req, err); - util2.destroy(res, err); - removeSignal(this); - callback(err); - } - }).on("prefinish", () => { - const { req } = this; - req.push(null); - }); - this.res = null; - addSignal(this, signal); - } - onRequestStart(controller, context) { - const { res } = this; - if (this.reason) { - controller.abort(this.reason); - return; - } - assert8(!res, "pipeline cannot be retried"); - this.abort = (reason) => controller.abort(reason); - this.context = context; + var setupConnectTimeout = process.platform === "win32" ? (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop; } - onResponseStart(controller, statusCode, headers, _statusMessage) { - const { opaque, handler, context } = this; - if (statusCode < 200) { - if (this.onInfo) { - const rawHeaders = controller?.rawHeaders; - const responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; - this.onInfo({ statusCode, headers: responseHeaders }); - } - return; - } - this.res = new PipelineResponse(() => controller.resume()); - let body; - try { - this.handler = null; - const rawHeaders = controller?.rawHeaders; - const responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; - body = this.runInAsyncScope(handler, null, { - statusCode, - headers: responseHeaders, - opaque, - body: this.res, - context - }); - } catch (err) { - this.res.on("error", noop); - throw err; - } - if (!body || typeof body.on !== "function") { - throw new InvalidReturnValueError("expected Readable"); - } - body.on("data", (chunk) => { - const { ret, body: body2 } = this; - if (!ret.push(chunk) && body2.pause) { - body2.pause(); - } - }).on("error", (err) => { - const { ret } = this; - util2.destroy(ret, err); - }).on("end", () => { - const { ret } = this; - ret.push(null); - }).on("close", () => { - const { ret } = this; - if (!ret._readableState.ended) { - util2.destroy(ret, new RequestAbortedError()); - } + let s1 = null; + let s22 = null; + const fastTimer = timers.setFastTimeout(() => { + s1 = setImmediate(() => { + s22 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)); }); - this.body = body; - } - onResponseData(controller, chunk) { - const { res } = this; - if (res.push(chunk) === false) { - controller.pause(); - } + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + clearImmediate(s22); + }; + } : (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop; } - onResponseEnd(_controller, _trailers) { - const { res } = this; - res.push(null); + let s1 = null; + const fastTimer = timers.setFastTimeout(() => { + s1 = setImmediate(() => { + onConnectTimeout(socketWeakRef.deref(), opts); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + }; + }; + function onConnectTimeout(socket, opts) { + if (socket == null) { + return; } - onResponseError(_controller, err) { - const { ret } = this; - this.handler = null; - util2.destroy(ret, err); + let message = "Connect Timeout Error"; + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")},`; + } else { + message += ` (attempted address: ${opts.hostname}:${opts.port},`; } - }; - function pipeline(opts, handler) { - try { - const pipelineHandler = new PipelineHandler(opts, handler); - this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); - return pipelineHandler.ret; - } catch (err) { - return new PassThrough().destroy(err); + message += ` timeout: ${opts.timeout}ms)`; + destroy(socket, new ConnectTimeoutError(message)); + } + function getProtocolFromUrlString(urlString) { + if (urlString[0] === "h" && urlString[1] === "t" && urlString[2] === "t" && urlString[3] === "p") { + switch (urlString[4]) { + case ":": + return "http:"; + case "s": + if (urlString[5] === ":") { + return "https:"; + } + } } + return urlString.slice(0, urlString.indexOf(":") + 1); } - module.exports = pipeline; + var kEnumerableProperty = /* @__PURE__ */ Object.create(null); + kEnumerableProperty.enumerable = true; + var normalizedMethodRecordsBase = { + delete: "DELETE", + DELETE: "DELETE", + get: "GET", + GET: "GET", + head: "HEAD", + HEAD: "HEAD", + options: "OPTIONS", + OPTIONS: "OPTIONS", + post: "POST", + POST: "POST", + put: "PUT", + PUT: "PUT" + }; + var normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: "patch", + PATCH: "PATCH" + }; + Object.setPrototypeOf(normalizedMethodRecordsBase, null); + Object.setPrototypeOf(normalizedMethodRecords, null); + module.exports = { + kEnumerableProperty, + isDisturbed, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + hasSafeIterator, + isAsyncIterable, + isDestroyed, + headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, + parseRawHeaders, + toRawHeaders, + encodeRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + assertRequestHandler, + getSocketInfo, + isFormDataLike, + pathHasQueryOrFragment, + serializePathWithQuery, + addAbortListener, + isValidHTTPToken, + isValidHeaderValue, + isTokenCharCode, + parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, + safeHTTPMethods: Object.freeze(["GET", "HEAD", "OPTIONS", "TRACE"]), + wrapRequestBody, + setupConnectTimeout, + getProtocolFromUrlString + }; } }); -// node_modules/undici/lib/api/api-upgrade.js -var require_api_upgrade = __commonJS({ - "node_modules/undici/lib/api/api-upgrade.js"(exports, module) { +// node_modules/undici/lib/util/stats.js +var require_stats = __commonJS({ + "node_modules/undici/lib/util/stats.js"(exports, module) { "use strict"; - var { InvalidArgumentError, SocketError } = require_errors(); - var { AsyncResource } = __require("async_hooks"); - var assert8 = __require("assert"); - var util2 = require_util(); - var { kHTTP2Stream } = require_symbols(); - var { addSignal, removeSignal } = require_abort_signal(); - var UpgradeHandler = class extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - super("UNDICI_UPGRADE"); - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.abort = null; - this.context = null; - addSignal(this, signal); - } - onRequestStart(controller, context) { - if (this.reason) { - controller.abort(this.reason); - return; - } - assert8(this.callback); - this.abort = (reason) => controller.abort(reason); - this.context = context; - } - onResponseStart() { - throw new SocketError("bad upgrade", null); - } - onRequestUpgrade(controller, statusCode, headers, socket) { - assert8(socket[kHTTP2Stream] === true ? statusCode === 200 : statusCode === 101); - const { callback, opaque, context } = this; - removeSignal(this); - this.callback = null; - const rawHeaders = controller?.rawHeaders; - const responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; - this.runInAsyncScope(callback, null, null, { - headers: responseHeaders, - socket, - opaque, - context - }); - } - onResponseError(_controller, err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } + var { + kConnected, + kPending, + kRunning, + kSize, + kFree, + kQueued + } = require_symbols(); + var ClientStats = class { + constructor(client) { + this.connected = client[kConnected]; + this.pending = client[kPending]; + this.running = client[kRunning]; + this.size = client[kSize]; } }; - function upgrade(opts, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const upgradeHandler = new UpgradeHandler(opts, callback); - const upgradeOpts = { - ...opts, - method: opts.method || "GET", - upgrade: opts.protocol || "Websocket" - }; - this.dispatch(upgradeOpts, upgradeHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts?.opaque; - queueMicrotask(() => callback(err, { opaque })); + var PoolStats = class { + constructor(pool) { + this.connected = pool[kConnected]; + this.free = pool[kFree]; + this.pending = pool[kPending]; + this.queued = pool[kQueued]; + this.running = pool[kRunning]; + this.size = pool[kSize]; } - } - module.exports = upgrade; + }; + module.exports = { ClientStats, PoolStats }; } }); -// node_modules/undici/lib/api/api-connect.js -var require_api_connect = __commonJS({ - "node_modules/undici/lib/api/api-connect.js"(exports, module) { +// node_modules/undici/lib/core/diagnostics.js +var require_diagnostics = __commonJS({ + "node_modules/undici/lib/core/diagnostics.js"(exports, module) { "use strict"; - var assert8 = __require("assert"); - var { AsyncResource } = __require("async_hooks"); - var { InvalidArgumentError, SocketError } = require_errors(); - var util2 = require_util(); - var { addSignal, removeSignal } = require_abort_signal(); - var ConnectHandler = class extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); + var diagnosticsChannel = __require("diagnostics_channel"); + var util2 = __require("util"); + var undiciDebugLog = util2.debuglog("undici"); + var fetchDebuglog = util2.debuglog("fetch"); + var websocketDebuglog = util2.debuglog("websocket"); + var channels = { + // Client + beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), + connected: diagnosticsChannel.channel("undici:client:connected"), + connectError: diagnosticsChannel.channel("undici:client:connectError"), + sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"), + // Request + create: diagnosticsChannel.channel("undici:request:create"), + bodySent: diagnosticsChannel.channel("undici:request:bodySent"), + bodyChunkSent: diagnosticsChannel.channel("undici:request:bodyChunkSent"), + bodyChunkReceived: diagnosticsChannel.channel("undici:request:bodyChunkReceived"), + headers: diagnosticsChannel.channel("undici:request:headers"), + trailers: diagnosticsChannel.channel("undici:request:trailers"), + error: diagnosticsChannel.channel("undici:request:error"), + // WebSocket + open: diagnosticsChannel.channel("undici:websocket:open"), + close: diagnosticsChannel.channel("undici:websocket:close"), + socketError: diagnosticsChannel.channel("undici:websocket:socket_error"), + ping: diagnosticsChannel.channel("undici:websocket:ping"), + pong: diagnosticsChannel.channel("undici:websocket:pong"), + // ProxyAgent + proxyConnected: diagnosticsChannel.channel("undici:proxy:connected") + }; + var isTrackingClientEvents = false; + function trackClientEvents(debugLog = undiciDebugLog) { + if (isTrackingClientEvents) { + return; + } + if (channels.beforeConnect.hasSubscribers || channels.connected.hasSubscribers || channels.connectError.hasSubscribers || channels.sendHeaders.hasSubscribers) { + isTrackingClientEvents = true; + return; + } + isTrackingClientEvents = true; + diagnosticsChannel.subscribe( + "undici:client:beforeConnect", + (evt) => { + const { + connectParams: { version: version4, protocol, port, host } + } = evt; + debugLog( + "connecting to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version4 + ); } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); + ); + diagnosticsChannel.subscribe( + "undici:client:connected", + (evt) => { + const { + connectParams: { version: version4, protocol, port, host } + } = evt; + debugLog( + "connected to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version4 + ); } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + ); + diagnosticsChannel.subscribe( + "undici:client:connectError", + (evt) => { + const { + connectParams: { version: version4, protocol, port, host }, + error + } = evt; + debugLog( + "connection to %s%s using %s%s errored - %s", + host, + port ? `:${port}` : "", + protocol, + version4, + error.message + ); } - super("UNDICI_CONNECT"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.callback = callback; - this.abort = null; - addSignal(this, signal); - } - onRequestStart(controller, context) { - if (this.reason) { - controller.abort(this.reason); - return; + ); + diagnosticsChannel.subscribe( + "undici:client:sendHeaders", + (evt) => { + const { + request: { method, path, origin } + } = evt; + debugLog("sending request to %s %s%s", method, origin, path); } - assert8(this.callback); - this.abort = (reason) => controller.abort(reason); - this.context = context; + ); + } + var isTrackingRequestEvents = false; + function trackRequestEvents(debugLog = undiciDebugLog) { + if (isTrackingRequestEvents) { + return; } - onResponseStart() { - throw new SocketError("bad connect", null); + if (channels.headers.hasSubscribers || channels.trailers.hasSubscribers || channels.error.hasSubscribers) { + isTrackingRequestEvents = true; + return; } - onRequestUpgrade(controller, statusCode, headers, socket) { - const { callback, opaque, context } = this; - removeSignal(this); - this.callback = null; - let responseHeaders = headers; - const rawHeaders = controller?.rawHeaders; - if (responseHeaders != null) { - responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; + isTrackingRequestEvents = true; + diagnosticsChannel.subscribe( + "undici:request:headers", + (evt) => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt; + debugLog( + "received response to %s %s%s - HTTP %d", + method, + origin, + path, + statusCode + ); } - this.runInAsyncScope(callback, null, null, { - statusCode, - headers: responseHeaders, - socket, - opaque, - context - }); - } - onResponseError(_controller, err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); + ); + diagnosticsChannel.subscribe( + "undici:request:trailers", + (evt) => { + const { + request: { method, path, origin } + } = evt; + debugLog("trailers received from %s %s%s", method, origin, path); + } + ); + diagnosticsChannel.subscribe( + "undici:request:error", + (evt) => { + const { + request: { method, path, origin }, + error + } = evt; + debugLog( + "request to %s %s%s errored - %s", + method, + origin, + path, + error.message + ); } + ); + } + var isTrackingWebSocketEvents = false; + function trackWebSocketEvents(debugLog = websocketDebuglog) { + if (isTrackingWebSocketEvents) { + return; } - }; - function connect(opts, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); + if (channels.open.hasSubscribers || channels.close.hasSubscribers || channels.socketError.hasSubscribers || channels.ping.hasSubscribers || channels.pong.hasSubscribers) { + isTrackingWebSocketEvents = true; + return; } - try { - const connectHandler = new ConnectHandler(opts, callback); - const connectOptions = { ...opts, method: "CONNECT" }; - this.dispatch(connectOptions, connectHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; + isTrackingWebSocketEvents = true; + diagnosticsChannel.subscribe( + "undici:websocket:open", + (evt) => { + if (evt.address != null) { + const { address: address2, port } = evt.address; + debugLog("connection opened %s%s", address2, port ? `:${port}` : ""); + } else { + debugLog("connection opened"); + } } - const opaque = opts?.opaque; - queueMicrotask(() => callback(err, { opaque })); - } + ); + diagnosticsChannel.subscribe( + "undici:websocket:close", + (evt) => { + const { websocket, code, reason } = evt; + debugLog( + "closed connection to %s - %s %s", + websocket.url, + code, + reason + ); + } + ); + diagnosticsChannel.subscribe( + "undici:websocket:socket_error", + (err) => { + debugLog("connection errored - %s", err.message); + } + ); + diagnosticsChannel.subscribe( + "undici:websocket:ping", + (evt) => { + debugLog("ping received"); + } + ); + diagnosticsChannel.subscribe( + "undici:websocket:pong", + (evt) => { + debugLog("pong received"); + } + ); + } + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog); + trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog); + } + if (websocketDebuglog.enabled) { + trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog); + trackWebSocketEvents(websocketDebuglog); } - module.exports = connect; - } -}); - -// node_modules/undici/lib/api/index.js -var require_api = __commonJS({ - "node_modules/undici/lib/api/index.js"(exports, module) { - "use strict"; - module.exports.request = require_api_request(); - module.exports.stream = require_api_stream(); - module.exports.pipeline = require_api_pipeline(); - module.exports.upgrade = require_api_upgrade(); - module.exports.connect = require_api_connect(); - } -}); - -// node_modules/undici/lib/mock/mock-errors.js -var require_mock_errors = __commonJS({ - "node_modules/undici/lib/mock/mock-errors.js"(exports, module) { - "use strict"; - var { UndiciError } = require_errors(); - var kMockNotMatchedError = /* @__PURE__ */ Symbol.for("undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED"); - var MockNotMatchedError = class extends UndiciError { - constructor(message) { - super(message); - this.name = "MockNotMatchedError"; - this.message = message || "The request does not match any registered mock dispatches"; - this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; - } - static [Symbol.hasInstance](instance) { - return instance && instance[kMockNotMatchedError] === true; - } - get [kMockNotMatchedError]() { - return true; - } - }; - module.exports = { - MockNotMatchedError - }; - } -}); - -// node_modules/undici/lib/mock/mock-symbols.js -var require_mock_symbols = __commonJS({ - "node_modules/undici/lib/mock/mock-symbols.js"(exports, module) { - "use strict"; module.exports = { - kAgent: /* @__PURE__ */ Symbol("agent"), - kOptions: /* @__PURE__ */ Symbol("options"), - kFactory: /* @__PURE__ */ Symbol("factory"), - kDispatches: /* @__PURE__ */ Symbol("dispatches"), - kDispatchKey: /* @__PURE__ */ Symbol("dispatch key"), - kDefaultHeaders: /* @__PURE__ */ Symbol("default headers"), - kDefaultTrailers: /* @__PURE__ */ Symbol("default trailers"), - kContentLength: /* @__PURE__ */ Symbol("content length"), - kMockAgent: /* @__PURE__ */ Symbol("mock agent"), - kMockAgentSet: /* @__PURE__ */ Symbol("mock agent set"), - kMockAgentGet: /* @__PURE__ */ Symbol("mock agent get"), - kMockDispatch: /* @__PURE__ */ Symbol("mock dispatch"), - kClose: /* @__PURE__ */ Symbol("close"), - kOriginalClose: /* @__PURE__ */ Symbol("original agent close"), - kOriginalDispatch: /* @__PURE__ */ Symbol("original dispatch"), - kOrigin: /* @__PURE__ */ Symbol("origin"), - kIsMockActive: /* @__PURE__ */ Symbol("is mock active"), - kNetConnect: /* @__PURE__ */ Symbol("net connect"), - kGetNetConnect: /* @__PURE__ */ Symbol("get net connect"), - kConnected: /* @__PURE__ */ Symbol("connected"), - kIgnoreTrailingSlash: /* @__PURE__ */ Symbol("ignore trailing slash"), - kMockAgentMockCallHistoryInstance: /* @__PURE__ */ Symbol("mock agent mock call history name"), - kMockAgentRegisterCallHistory: /* @__PURE__ */ Symbol("mock agent register mock call history"), - kMockAgentAddCallHistoryLog: /* @__PURE__ */ Symbol("mock agent add call history log"), - kMockAgentIsCallHistoryEnabled: /* @__PURE__ */ Symbol("mock agent is call history enabled"), - kMockAgentAcceptsNonStandardSearchParameters: /* @__PURE__ */ Symbol("mock agent accepts non standard search parameters"), - kMockCallHistoryAddLog: /* @__PURE__ */ Symbol("mock call history add log"), - kTotalDispatchCount: /* @__PURE__ */ Symbol("total dispatch count") + channels }; } }); -// node_modules/undici/lib/mock/mock-utils.js -var require_mock_utils = __commonJS({ - "node_modules/undici/lib/mock/mock-utils.js"(exports, module) { +// node_modules/undici/lib/core/request.js +var require_request = __commonJS({ + "node_modules/undici/lib/core/request.js"(exports, module) { "use strict"; - var { MockNotMatchedError } = require_mock_errors(); var { - kDispatches, - kMockAgent, - kOriginalDispatch, - kOrigin, - kGetNetConnect, - kTotalDispatchCount - } = require_mock_symbols(); - var { serializePathWithQuery, parseHeaders } = require_util(); - var { STATUS_CODES } = __require("http"); + InvalidArgumentError, + NotSupportedError + } = require_errors(); + var assert8 = __require("assert"); var { - types: { - isPromise - } - } = __require("util"); - var { InvalidArgumentError } = require_errors(); - function matchValue(match, value) { - if (typeof match === "string") { - return match === value; - } - if (match instanceof RegExp) { - return match.test(value); + isValidHTTPToken, + isValidHeaderValue, + isStream, + destroy, + isBuffer, + isFormDataLike, + isIterable, + hasSafeIterator, + isBlobLike, + serializePathWithQuery, + parseHeaders, + assertRequestHandler, + getServerName, + normalizedMethodRecords, + getProtocolFromUrlString + } = require_util(); + var { channels } = require_diagnostics(); + var { headerNameLowerCasedRecord } = require_constants2(); + var invalidPathRegex = /[^\u0021-\u00ff]/; + var kHandler = /* @__PURE__ */ Symbol("handler"); + var kController = /* @__PURE__ */ Symbol("controller"); + var kResume = /* @__PURE__ */ Symbol("resume"); + var RequestController = class { + #paused = false; + #reason = null; + #aborted = false; + #abort; + [kResume] = null; + rawHeaders = null; + rawTrailers = null; + constructor(abort) { + this.#abort = abort; } - if (typeof match === "function") { - return match(value) === true; + pause() { + this.#paused = true; } - return false; - } - function lowerCaseEntries(headers) { - return Object.fromEntries( - Object.entries(headers).map(([headerName, headerValue]) => { - return [headerName.toLocaleLowerCase(), headerValue]; - }) - ); - } - function getHeaderByName(headers, key) { - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { - return headers[i + 1]; - } + resume() { + if (this.#paused) { + this.#paused = false; + this[kResume]?.(); } - return void 0; - } else if (typeof headers.get === "function") { - return headers.get(key); - } else { - return lowerCaseEntries(headers)[key.toLocaleLowerCase()]; } - } - function buildHeadersFromArray(headers) { - const clone = headers.slice(); - const entries = []; - for (let index2 = 0; index2 < clone.length; index2 += 2) { - entries.push([clone[index2], clone[index2 + 1]]); - } - return Object.fromEntries(entries); - } - function matchHeaders(mockDispatch2, headers) { - if (typeof mockDispatch2.headers === "function") { - if (Array.isArray(headers)) { - headers = buildHeadersFromArray(headers); + abort(reason) { + if (!this.#aborted) { + this.#aborted = true; + this.#reason = reason; + this.#abort(reason); } - return mockDispatch2.headers(headers ? lowerCaseEntries(headers) : {}); - } - if (typeof mockDispatch2.headers === "undefined") { - return true; } - if (typeof headers !== "object" || typeof mockDispatch2.headers !== "object") { - return false; + get aborted() { + return this.#aborted; } - for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { - const headerValue = getHeaderByName(headers, matchHeaderName); - if (!matchValue(matchHeaderValue, headerValue)) { - return false; - } + get reason() { + return this.#reason; } - return true; - } - function normalizeSearchParams(query) { - if (typeof query !== "string") { - return query; + get paused() { + return this.#paused; } - const originalQp = new URLSearchParams(query); - const normalizedQp = new URLSearchParams(); - for (let [key, value] of originalQp.entries()) { - key = key.replace("[]", ""); - const valueRepresentsString = /^(['"]).*\1$/.test(value); - if (valueRepresentsString) { - normalizedQp.append(key, value); - continue; + }; + var Request2 = class { + constructor(origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + expectContinue, + servername, + throwOnError, + maxRedirections, + typeOfService + }, handler) { + if (typeof path !== "string") { + throw new InvalidArgumentError("path must be a string"); + } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { + throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); + } else if (invalidPathRegex.test(path)) { + throw new InvalidArgumentError("invalid request path"); } - if (value.includes(",")) { - const values = value.split(","); - for (const v of values) { - normalizedQp.append(key, v); + if (typeof method !== "string") { + throw new InvalidArgumentError("method must be a string"); + } else if (normalizedMethodRecords[method] === void 0 && !isValidHTTPToken(method)) { + throw new InvalidArgumentError("invalid request method"); + } + if (upgrade && typeof upgrade !== "string") { + throw new InvalidArgumentError("upgrade must be a string"); + } + if (upgrade && !isValidHeaderValue(upgrade)) { + throw new InvalidArgumentError("invalid upgrade header"); + } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("invalid headersTimeout"); + } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("invalid bodyTimeout"); + } + if (reset != null && typeof reset !== "boolean") { + throw new InvalidArgumentError("invalid reset"); + } + if (expectContinue != null && typeof expectContinue !== "boolean") { + throw new InvalidArgumentError("invalid expectContinue"); + } + if (throwOnError != null) { + throw new InvalidArgumentError("invalid throwOnError"); + } + if (maxRedirections != null && maxRedirections !== 0) { + throw new InvalidArgumentError("maxRedirections is not supported, use the redirect interceptor"); + } + if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) { + throw new InvalidArgumentError("typeOfService must be an integer between 0 and 255"); + } + this.headersTimeout = headersTimeout; + this.bodyTimeout = bodyTimeout; + this.method = method; + this.typeOfService = typeOfService ?? 0; + this.abort = null; + if (body == null) { + this.body = null; + } else if (isStream(body)) { + this.body = body; + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy() { + destroy(this); + }; + this.body.on("end", this.endHandler); } - continue; + this.errorHandler = (err) => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on("error", this.errorHandler); + } else if (isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === "string") { + this.body = body.length ? Buffer.from(body) : null; + } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + } + this.completed = false; + this.aborted = false; + this.upgrade = upgrade || null; + this.path = query ? serializePathWithQuery(path, query) : path; + this.origin = origin; + this.protocol = getProtocolFromUrlString(origin); + this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; + this.blocking = blocking ?? this.method !== "HEAD"; + this.reset = reset == null ? null : reset; + this.host = null; + this.contentLength = null; + this.contentType = null; + this.headers = []; + this.expectContinue = expectContinue != null ? expectContinue : false; + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === "object") { + if (hasSafeIterator(headers)) { + for (const header of headers) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError("headers must be in key-value pair format"); + } + processHeader(this, header[0], header[1]); + } + } else { + const keys = Object.keys(headers); + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers[keys[i]]); + } + } + } else if (headers != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + assertRequestHandler(handler, method, upgrade); + this.servername = servername || getServerName(this.host) || null; + this[kHandler] = handler; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); } - normalizedQp.append(key, value); - } - return normalizedQp; - } - function safeUrl(path) { - if (typeof path !== "string") { - return path; - } - const pathSegments = path.split("?", 3); - if (pathSegments.length !== 2) { - return path; } - const qp = new URLSearchParams(pathSegments.pop()); - qp.sort(); - return [...pathSegments, qp.toString()].join("?"); - } - function matchKey(mockDispatch2, { path, method, body, headers }) { - const pathMatch = matchValue(mockDispatch2.path, path); - const methodMatch = matchValue(mockDispatch2.method, method); - const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body) : true; - const headersMatch = matchHeaders(mockDispatch2, headers); - return pathMatch && methodMatch && bodyMatch && headersMatch; - } - function getResponseData(data) { - if (Buffer.isBuffer(data)) { - return data; - } else if (data instanceof Uint8Array) { - return data; - } else if (data instanceof ArrayBuffer) { - return data; - } else if (typeof data === "object") { - return JSON.stringify(data); - } else if (data) { - return data.toString(); - } else { - return ""; + onBodySent(chunk) { + if (channels.bodyChunkSent.hasSubscribers) { + channels.bodyChunkSent.publish({ request: this, chunk }); + } + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk); + } catch (err) { + this.abort(err); + } + } } - } - function getMockDispatch(mockDispatches, key) { - const basePath = key.query ? serializePathWithQuery(key.path, key.query) : key.path; - const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; - const resolvedPathWithoutTrailingSlash = removeTrailingSlash(resolvedPath); - let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path, ignoreTrailingSlash }) => { - return ignoreTrailingSlash ? matchValue(removeTrailingSlash(safeUrl(path)), resolvedPathWithoutTrailingSlash) : matchValue(safeUrl(path), resolvedPath); - }); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); + onRequestSent() { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent(); + } catch (err) { + this.abort(err); + } + } } - matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`); + onRequestStart(abort, context) { + assert8(!this.aborted); + assert8(!this.completed); + this[kController] = new RequestController(abort); + if (this.error) { + this[kController].abort(this.error); + return; + } + this.abort = abort; + return this[kHandler].onRequestStart(this[kController], context); } - matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== "undefined" ? matchValue(body, key.body) : true); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`); + onResponseStarted() { + return this[kHandler].onResponseStarted?.(); } - matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); - if (matchedMockDispatches.length === 0) { - const headers = typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers; - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`); + onResponseStart(statusCode, headers, resume, statusText) { + assert8(!this.aborted); + assert8(!this.completed); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + } + const controller = this[kController]; + if (controller) { + controller[kResume] = resume; + controller.rawHeaders = headers; + } + const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers; + try { + this[kHandler].onResponseStart?.(controller, statusCode, parsedHeaders, statusText); + return !controller?.paused; + } catch (err) { + this.abort(err); + return false; + } } - return matchedMockDispatches[0]; - } - function addMockDispatch(mockDispatches, key, data, opts) { - const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false, ...opts }; - const replyData = typeof data === "function" ? { callback: data } : { ...data }; - const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; - mockDispatches.push(newMockDispatch); - mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1; - return newMockDispatch; - } - function deleteMockDispatch(mockDispatches, key) { - const index2 = mockDispatches.findIndex((dispatch) => { - if (!dispatch.consumed) { + onResponseData(chunk) { + assert8(!this.aborted); + assert8(!this.completed); + if (channels.bodyChunkReceived.hasSubscribers) { + channels.bodyChunkReceived.publish({ request: this, chunk }); + } + const controller = this[kController]; + try { + this[kHandler].onResponseData?.(controller, chunk); + return !controller?.paused; + } catch (err) { + this.abort(err); return false; } - return matchKey(dispatch, key); - }); - if (index2 !== -1) { - mockDispatches.splice(index2, 1); } - } - function removeTrailingSlash(path) { - while (path.endsWith("/")) { - path = path.slice(0, -1); + onRequestUpgrade(statusCode, headers, socket) { + assert8(!this.aborted); + assert8(!this.completed); + const controller = this[kController]; + if (controller) { + controller.rawHeaders = headers; + } + const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers; + return this[kHandler].onRequestUpgrade?.(controller, statusCode, parsedHeaders, socket); + } + onResponseEnd(trailers) { + this.onFinally(); + assert8(!this.aborted); + assert8(!this.completed); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); + } + const controller = this[kController]; + if (controller) { + controller.rawTrailers = trailers; + } + const parsedTrailers = Array.isArray(trailers) ? parseHeaders(trailers) : trailers; + try { + return this[kHandler].onResponseEnd?.(controller, parsedTrailers); + } catch (err) { + this.onResponseError(err); + } } - if (path.length === 0) { - path = "/"; + onResponseError(error) { + this.onFinally(); + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); + } + if (this.aborted) { + return; + } + this.aborted = true; + const controller = this[kController]; + return this[kHandler].onResponseError?.(controller, error); } - return path; - } - function buildKey(opts) { - const { path, method, body, headers, query } = opts; - return { - path, - method, - body, - headers, - query - }; - } - function generateKeyValues(data) { - const keys = Object.keys(data); - const result = []; - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - const value = data[key]; - const name = Buffer.from(`${key}`); - if (Array.isArray(value)) { - for (let j = 0; j < value.length; ++j) { - result.push(name, Buffer.from(`${value[j]}`)); - } - } else { - result.push(name, Buffer.from(`${value}`)); + onFinally() { + if (this.errorHandler) { + this.body.off("error", this.errorHandler); + this.errorHandler = null; + } + if (this.endHandler) { + this.body.off("end", this.endHandler); + this.endHandler = null; } } - return result; - } - function getStatusText(statusCode) { - return STATUS_CODES[statusCode] || "unknown"; - } - async function getResponse(body) { - const buffers = []; - for await (const data of body) { - buffers.push(data); + addHeader(key, value) { + processHeader(this, key, value); + return this; } - return Buffer.concat(buffers).toString("utf8"); - } - function mockDispatch(opts, handler) { - const key = buildKey(opts); - const mockDispatch2 = getMockDispatch(this[kDispatches], key); - mockDispatch2.timesInvoked++; - if (mockDispatch2.data.callback) { - mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; + }; + function processHeader(request, key, val) { + if (val && (typeof val === "object" && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`); + } else if (val === void 0) { + return; } - const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch2; - const { timesInvoked, times } = mockDispatch2; - mockDispatch2.consumed = !persist && timesInvoked >= times; - mockDispatch2.pending = timesInvoked < times; - if (error !== null) { - deleteMockDispatch(this[kDispatches], key); - handler.onResponseError(null, error); - return true; + let headerName = headerNameLowerCasedRecord[key]; + if (headerName === void 0) { + headerName = key.toLowerCase(); + if (headerNameLowerCasedRecord[headerName] === void 0 && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError("invalid header key"); + } } - let aborted = false; - let timer = null; - const controller = { - paused: false, - rawHeaders: null, - rawTrailers: null, - pause() { - this.paused = true; - }, - resume() { - this.paused = false; - }, - abort: (reason) => { - if (aborted) { - return; - } - aborted = true; - if (timer !== null) { - clearTimeout(timer); - timer = null; + if (Array.isArray(val)) { + const arr = []; + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === "string") { + if (!isValidHeaderValue(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + arr.push(val[i]); + } else if (val[i] === null) { + arr.push(""); + } else if (typeof val[i] === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } else { + arr.push(`${val[i]}`); } - handler.onResponseError?.(controller, reason); } - }; - handler.onRequestStart?.(controller, null); - if (typeof delay === "number" && delay > 0) { - timer = setTimeout(() => { - timer = null; - handleReply(this[kDispatches]); - }, delay); + val = arr; + } else if (typeof val === "string") { + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + } else if (val === null) { + val = ""; } else { - handleReply(this[kDispatches]); + val = `${val}`; } - function handleReply(mockDispatches, _data = data) { - if (aborted) { - return; + if (headerName === "host") { + if (request.host !== null) { + throw new InvalidArgumentError("duplicate host header"); } - const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; - const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; - if (isPromise(body)) { - return body.then((newData) => handleReply(mockDispatches, newData)); + if (typeof val !== "string") { + throw new InvalidArgumentError("invalid host header"); } - if (aborted) { - return; + request.host = val; + } else if (headerName === "content-length") { + if (request.contentLength !== null) { + throw new InvalidArgumentError("duplicate content-length header"); } - const responseData = getResponseData(body); - const responseHeaders = generateKeyValues(headers); - const responseTrailers = generateKeyValues(trailers); - controller.rawHeaders = responseHeaders; - controller.rawTrailers = responseTrailers; - handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode)); - handler.onResponseData?.(controller, Buffer.from(responseData)); - handler.onResponseEnd?.(controller, parseHeaders(responseTrailers)); - deleteMockDispatch(mockDispatches, key); - } - return true; - } - function buildMockDispatch() { - const agent = this[kMockAgent]; - const origin = this[kOrigin]; - const originalDispatch = this[kOriginalDispatch]; - return function dispatch(opts, handler) { - if (agent.isMockActive) { - try { - mockDispatch.call(this, opts, handler); - } catch (error) { - if (error.code === "UND_MOCK_ERR_MOCK_NOT_MATCHED") { - const netConnect = agent[kGetNetConnect](); - const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length; - const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length; - const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`; - if (netConnect === false) { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`); - } - if (checkNetConnect(netConnect, origin)) { - originalDispatch.call(this, opts, handler); - } else { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`); - } - } else { - throw error; - } + request.contentLength = parseInt(val, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError("invalid content-length header"); + } + } else if (request.contentType === null && headerName === "content-type") { + request.contentType = val; + request.headers.push(key, val); + } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") { + throw new InvalidArgumentError(`invalid ${headerName} header`); + } else if (headerName === "connection") { + const value = typeof val === "string" ? val : null; + if (value === null) { + throw new InvalidArgumentError("invalid connection header"); + } + for (const token of value.toLowerCase().split(",")) { + const trimmed = token.trim(); + if (!isValidHTTPToken(trimmed)) { + throw new InvalidArgumentError("invalid connection header"); + } + if (trimmed === "close") { + request.reset = true; } - } else { - originalDispatch.call(this, opts, handler); } - }; - } - function checkNetConnect(netConnect, origin) { - const url = new URL(origin); - if (netConnect === true) { - return true; - } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { - return true; + } else if (headerName === "expect") { + throw new NotSupportedError("expect header not supported"); + } else { + request.headers.push(key, val); } - return false; } - function normalizeOrigin(origin) { - if (typeof origin !== "string" && !(origin instanceof URL)) { - return origin; - } - if (origin instanceof URL) { - return origin.origin; + module.exports = Request2; + } +}); + +// node_modules/undici/lib/dispatcher/dispatcher.js +var require_dispatcher = __commonJS({ + "node_modules/undici/lib/dispatcher/dispatcher.js"(exports, module) { + "use strict"; + var EventEmitter = __require("events"); + var Dispatcher = class extends EventEmitter { + dispatch() { + throw new Error("not implemented"); } - return origin.toLowerCase(); - } - function buildAndValidateMockOptions(opts) { - const { agent, ...mockOptions } = opts; - if ("enableCallHistory" in mockOptions && typeof mockOptions.enableCallHistory !== "boolean") { - throw new InvalidArgumentError("options.enableCallHistory must to be a boolean"); + close() { + throw new Error("not implemented"); } - if ("acceptNonStandardSearchParameters" in mockOptions && typeof mockOptions.acceptNonStandardSearchParameters !== "boolean") { - throw new InvalidArgumentError("options.acceptNonStandardSearchParameters must to be a boolean"); + destroy() { + throw new Error("not implemented"); } - if ("ignoreTrailingSlash" in mockOptions && typeof mockOptions.ignoreTrailingSlash !== "boolean") { - throw new InvalidArgumentError("options.ignoreTrailingSlash must to be a boolean"); + compose(...args) { + const interceptors = Array.isArray(args[0]) ? args[0] : args; + let dispatch = this.dispatch.bind(this); + for (const interceptor of interceptors) { + if (interceptor == null) { + continue; + } + if (typeof interceptor !== "function") { + throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`); + } + dispatch = interceptor(dispatch); + if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) { + throw new TypeError("invalid interceptor"); + } + } + return new Proxy(this, { + get: (target, key) => key === "dispatch" ? dispatch : target[key] + }); } - return mockOptions; - } - module.exports = { - getResponseData, - getMockDispatch, - addMockDispatch, - deleteMockDispatch, - buildKey, - generateKeyValues, - matchValue, - getResponse, - getStatusText, - mockDispatch, - buildMockDispatch, - checkNetConnect, - buildAndValidateMockOptions, - getHeaderByName, - buildHeadersFromArray, - normalizeSearchParams, - normalizeOrigin }; + module.exports = Dispatcher; } }); -// node_modules/undici/lib/mock/mock-interceptor.js -var require_mock_interceptor = __commonJS({ - "node_modules/undici/lib/mock/mock-interceptor.js"(exports, module) { +// node_modules/undici/lib/dispatcher/dispatcher-base.js +var require_dispatcher_base = __commonJS({ + "node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports, module) { "use strict"; - var { getResponseData, buildKey, addMockDispatch } = require_mock_utils(); + var Dispatcher = require_dispatcher(); var { - kDispatches, - kDispatchKey, - kDefaultHeaders, - kDefaultTrailers, - kContentLength, - kMockDispatch, - kIgnoreTrailingSlash - } = require_mock_symbols(); - var { InvalidArgumentError } = require_errors(); - var { serializePathWithQuery } = require_util(); - var MockScope = class { - constructor(mockDispatch) { - this[kMockDispatch] = mockDispatch; - } + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = require_errors(); + var { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require_symbols(); + var kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed"); + var kOnClosed = /* @__PURE__ */ Symbol("onClosed"); + var kWebSocketOptions = /* @__PURE__ */ Symbol("webSocketOptions"); + var DispatcherBase = class extends Dispatcher { + /** @type {boolean} */ + [kDestroyed] = false; + /** @type {Array|null} */ + [kOnClosed] = null; /** - * Delay a reply by a set amount in ms. + * @param {import('../../types/dispatcher').DispatcherOptions} [opts] */ - delay(waitInMs) { - if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { - throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); - } - this[kMockDispatch].delay = waitInMs; - return this; + constructor(opts) { + super(); + this[kWebSocketOptions] = opts?.webSocket ?? {}; } /** - * For a defined reply, never mark as consumed. + * @returns {import('../../types/dispatcher').WebSocketOptions} */ - persist() { - this[kMockDispatch].persist = true; - return this; + get webSocketOptions() { + return { + maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 + // 128 MB default + }; } - /** - * Allow one to define a reply for a set amount of matching requests. - */ - times(repeatTimes) { - if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { - throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); - } - this[kMockDispatch].times = repeatTimes; - return this; + /** @returns {boolean} */ + get destroyed() { + return this[kDestroyed]; } - }; - var MockInterceptor = class { - constructor(opts, mockDispatches) { - if (typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object"); + /** @returns {boolean} */ + get closed() { + return this[kClosed]; + } + close(callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); + }); } - if (typeof opts.path === "undefined") { - throw new InvalidArgumentError("opts.path must be defined"); + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - if (typeof opts.method === "undefined") { - opts.method = "GET"; + if (this[kDestroyed]) { + const err = new ClientDestroyedError(); + queueMicrotask(() => callback(err, null)); + return; } - if (typeof opts.path === "string") { - if (opts.query) { - opts.path = serializePathWithQuery(opts.path, opts.query); + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); } else { - const parsedURL = new URL(opts.path, "data://"); - opts.path = parsedURL.pathname + parsedURL.search; + queueMicrotask(() => callback(null, null)); } + return; } - if (typeof opts.method === "string") { - opts.method = opts.method.toUpperCase(); - } - this[kDispatchKey] = buildKey(opts); - this[kDispatches] = mockDispatches; - this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false; - this[kDefaultHeaders] = {}; - this[kDefaultTrailers] = {}; - this[kContentLength] = false; - } - createMockScopeDispatchData({ statusCode, data, responseOptions }) { - const responseData = getResponseData(data); - const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; - const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; - const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; - return { statusCode, data, headers, trailers }; + this[kClosed] = true; + this[kOnClosed] ??= []; + this[kOnClosed].push(callback); + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kClose]().then(() => this.destroy()).then(() => queueMicrotask(onClosed)); } - validateReplyParameters(replyParameters) { - if (typeof replyParameters.statusCode === "undefined") { - throw new InvalidArgumentError("statusCode must be defined"); + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; } - if (typeof replyParameters.responseOptions !== "object" || replyParameters.responseOptions === null) { - throw new InvalidArgumentError("responseOptions must be an object"); + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? reject(err2) : resolve(data); + }); + }); } - } - /** - * Mock an undici request with a defined reply. - */ - reply(replyOptionsCallbackOrStatusCode) { - if (typeof replyOptionsCallbackOrStatusCode === "function") { - const wrappedDefaultsCallback = (opts) => { - const resolvedData = replyOptionsCallbackOrStatusCode(opts); - if (typeof resolvedData !== "object" || resolvedData === null) { - throw new InvalidArgumentError("reply options callback must return an object"); - } - const replyParameters2 = { data: "", responseOptions: {}, ...resolvedData }; - this.validateReplyParameters(replyParameters2); - return { - ...this.createMockScopeDispatchData(replyParameters2) - }; - }; - const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); - return new MockScope(newMockDispatch2); + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - const replyParameters = { - statusCode: replyOptionsCallbackOrStatusCode, - data: arguments[1] === void 0 ? "" : arguments[1], - responseOptions: arguments[2] === void 0 ? {} : arguments[2] + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; + } + if (!err) { + err = new ClientDestroyedError(); + } + this[kDestroyed] = true; + this[kOnDestroyed] ??= []; + this[kOnDestroyed].push(callback); + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } }; - this.validateReplyParameters(replyParameters); - const dispatchData = this.createMockScopeDispatchData(replyParameters); - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); - return new MockScope(newMockDispatch); + this[kDestroy](err).then(() => queueMicrotask(onDestroyed)); } - /** - * Mock an undici request with a defined error. - */ - replyWithError(error) { - if (typeof error === "undefined") { - throw new InvalidArgumentError("error must be defined"); + dispatch(opts, handler) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); } - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); - return new MockScope(newMockDispatch); - } - /** - * Set default reply headers on the interceptor for subsequent replies - */ - defaultReplyHeaders(headers) { - if (typeof headers === "undefined") { - throw new InvalidArgumentError("headers must be defined"); + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); + } + if (opts.dispatcher) { + throw new InvalidArgumentError("opts.dispatcher is not supported by instance methods. Pass opts.dispatcher to the top-level undici functions or call the dispatcher instance method directly."); + } + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError(); + } + if (this[kClosed]) { + throw new ClientClosedError(); + } + return this[kDispatch](opts, handler); + } catch (err) { + if (typeof handler.onResponseError !== "function") { + throw err; + } + handler.onResponseError(null, err); + return false; } - this[kDefaultHeaders] = headers; - return this; } - /** - * Set default reply trailers on the interceptor for subsequent replies - */ - defaultReplyTrailers(trailers) { - if (typeof trailers === "undefined") { - throw new InvalidArgumentError("trailers must be defined"); + }; + module.exports = DispatcherBase; + } +}); + +// node_modules/undici/lib/core/connect.js +var require_connect = __commonJS({ + "node_modules/undici/lib/core/connect.js"(exports, module) { + "use strict"; + var net = __require("net"); + var assert8 = __require("assert"); + var util2 = require_util(); + var { InvalidArgumentError } = require_errors(); + var tls; + var SessionCache = class WeakSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + this._sessionRegistry = new FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return; + } + const ref = this._sessionCache.get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this._sessionCache.delete(key); + } + }); + } + get(sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null; + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; } - this[kDefaultTrailers] = trailers; - return this; + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); } - /** - * Set reply content length header for replies on the interceptor - */ - replyContentLength() { - this[kContentLength] = true; - return this; + }; + function buildConnector({ allowH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); } + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 1e4 : timeout; + allowH2 = allowH2 != null ? allowH2 : true; + return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === "https:") { + if (!tls) { + tls = __require("tls"); + } + servername = servername || options.servername || util2.getServerName(host) || null; + const sessionKey = servername || hostname; + assert8(sessionKey); + const session = customSession || sessionCache.get(sessionKey) || null; + port = port || 443; + socket = tls.connect({ + highWaterMark: 16384, + // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], + socket: httpSocket, + // upgrade socket connection + port, + host: hostname + }); + socket.on("session", function(session2) { + sessionCache.set(sessionKey, session2); + }); + } else { + assert8(!httpSocket, "httpSocket can only be sent on TLS update"); + port = port || 80; + socket = net.connect({ + highWaterMark: 64 * 1024, + // Same as nodejs fs streams. + ...options, + localAddress, + port, + host: hostname + }); + if (useH2c === true) { + socket.alpnProtocol = "h2"; + } + } + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + const clearConnectTimeout = util2.setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }); + socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { + queueMicrotask(clearConnectTimeout); + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }).on("error", function(err) { + queueMicrotask(clearConnectTimeout); + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + return socket; + }; + } + module.exports = buildConnector; + } +}); + +// node_modules/undici/lib/llhttp/utils.js +var require_utils = __commonJS({ + "node_modules/undici/lib/llhttp/utils.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.enumToMap = enumToMap; + function enumToMap(obj, filter = [], exceptions = []) { + const emptyFilter = (filter?.length ?? 0) === 0; + const emptyExceptions = (exceptions?.length ?? 0) === 0; + return Object.fromEntries(Object.entries(obj).filter(([, value]) => { + return typeof value === "number" && (emptyFilter || filter.includes(value)) && (emptyExceptions || !exceptions.includes(value)); + })); + } + } +}); + +// node_modules/undici/lib/llhttp/constants.js +var require_constants3 = __commonJS({ + "node_modules/undici/lib/llhttp/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.SPECIAL_HEADERS = exports.MINOR = exports.MAJOR = exports.HTAB_SP_VCHAR_OBS_TEXT = exports.QUOTED_STRING = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.HEX = exports.URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.STATUSES_HTTP = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.HEADER_STATE = exports.FINISH = exports.STATUSES = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; + var utils_1 = require_utils(); + exports.ERROR = { + OK: 0, + INTERNAL: 1, + STRICT: 2, + CR_EXPECTED: 25, + LF_EXPECTED: 3, + UNEXPECTED_CONTENT_LENGTH: 4, + UNEXPECTED_SPACE: 30, + CLOSED_CONNECTION: 5, + INVALID_METHOD: 6, + INVALID_URL: 7, + INVALID_CONSTANT: 8, + INVALID_VERSION: 9, + INVALID_HEADER_TOKEN: 10, + INVALID_CONTENT_LENGTH: 11, + INVALID_CHUNK_SIZE: 12, + INVALID_STATUS: 13, + INVALID_EOF_STATE: 14, + INVALID_TRANSFER_ENCODING: 15, + CB_MESSAGE_BEGIN: 16, + CB_HEADERS_COMPLETE: 17, + CB_MESSAGE_COMPLETE: 18, + CB_CHUNK_HEADER: 19, + CB_CHUNK_COMPLETE: 20, + PAUSED: 21, + PAUSED_UPGRADE: 22, + PAUSED_H2_UPGRADE: 23, + USER: 24, + CB_URL_COMPLETE: 26, + CB_STATUS_COMPLETE: 27, + CB_METHOD_COMPLETE: 32, + CB_VERSION_COMPLETE: 33, + CB_HEADER_FIELD_COMPLETE: 28, + CB_HEADER_VALUE_COMPLETE: 29, + CB_CHUNK_EXTENSION_NAME_COMPLETE: 34, + CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35, + CB_RESET: 31, + CB_PROTOCOL_COMPLETE: 38 + }; + exports.TYPE = { + BOTH: 0, + // default + REQUEST: 1, + RESPONSE: 2 + }; + exports.FLAGS = { + CONNECTION_KEEP_ALIVE: 1 << 0, + CONNECTION_CLOSE: 1 << 1, + CONNECTION_UPGRADE: 1 << 2, + CHUNKED: 1 << 3, + UPGRADE: 1 << 4, + CONTENT_LENGTH: 1 << 5, + SKIPBODY: 1 << 6, + TRAILING: 1 << 7, + // 1 << 8 is unused + TRANSFER_ENCODING: 1 << 9 + }; + exports.LENIENT_FLAGS = { + HEADERS: 1 << 0, + CHUNKED_LENGTH: 1 << 1, + KEEP_ALIVE: 1 << 2, + TRANSFER_ENCODING: 1 << 3, + VERSION: 1 << 4, + DATA_AFTER_CLOSE: 1 << 5, + OPTIONAL_LF_AFTER_CR: 1 << 6, + OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7, + OPTIONAL_CR_BEFORE_LF: 1 << 8, + SPACES_AFTER_CHUNK_SIZE: 1 << 9 + }; + exports.METHODS = { + "DELETE": 0, + "GET": 1, + "HEAD": 2, + "POST": 3, + "PUT": 4, + /* pathological */ + "CONNECT": 5, + "OPTIONS": 6, + "TRACE": 7, + /* WebDAV */ + "COPY": 8, + "LOCK": 9, + "MKCOL": 10, + "MOVE": 11, + "PROPFIND": 12, + "PROPPATCH": 13, + "SEARCH": 14, + "UNLOCK": 15, + "BIND": 16, + "REBIND": 17, + "UNBIND": 18, + "ACL": 19, + /* subversion */ + "REPORT": 20, + "MKACTIVITY": 21, + "CHECKOUT": 22, + "MERGE": 23, + /* upnp */ + "M-SEARCH": 24, + "NOTIFY": 25, + "SUBSCRIBE": 26, + "UNSUBSCRIBE": 27, + /* RFC-5789 */ + "PATCH": 28, + "PURGE": 29, + /* CalDAV */ + "MKCALENDAR": 30, + /* RFC-2068, section 19.6.1.2 */ + "LINK": 31, + "UNLINK": 32, + /* icecast */ + "SOURCE": 33, + /* RFC-7540, section 11.6 */ + "PRI": 34, + /* RFC-2326 RTSP */ + "DESCRIBE": 35, + "ANNOUNCE": 36, + "SETUP": 37, + "PLAY": 38, + "PAUSE": 39, + "TEARDOWN": 40, + "GET_PARAMETER": 41, + "SET_PARAMETER": 42, + "REDIRECT": 43, + "RECORD": 44, + /* RAOP */ + "FLUSH": 45, + /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */ + "QUERY": 46 + }; + exports.STATUSES = { + CONTINUE: 100, + SWITCHING_PROTOCOLS: 101, + PROCESSING: 102, + EARLY_HINTS: 103, + RESPONSE_IS_STALE: 110, + // Unofficial + REVALIDATION_FAILED: 111, + // Unofficial + DISCONNECTED_OPERATION: 112, + // Unofficial + HEURISTIC_EXPIRATION: 113, + // Unofficial + MISCELLANEOUS_WARNING: 199, + // Unofficial + OK: 200, + CREATED: 201, + ACCEPTED: 202, + NON_AUTHORITATIVE_INFORMATION: 203, + NO_CONTENT: 204, + RESET_CONTENT: 205, + PARTIAL_CONTENT: 206, + MULTI_STATUS: 207, + ALREADY_REPORTED: 208, + TRANSFORMATION_APPLIED: 214, + // Unofficial + IM_USED: 226, + MISCELLANEOUS_PERSISTENT_WARNING: 299, + // Unofficial + MULTIPLE_CHOICES: 300, + MOVED_PERMANENTLY: 301, + FOUND: 302, + SEE_OTHER: 303, + NOT_MODIFIED: 304, + USE_PROXY: 305, + SWITCH_PROXY: 306, + // No longer used + TEMPORARY_REDIRECT: 307, + PERMANENT_REDIRECT: 308, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + PAYMENT_REQUIRED: 402, + FORBIDDEN: 403, + NOT_FOUND: 404, + METHOD_NOT_ALLOWED: 405, + NOT_ACCEPTABLE: 406, + PROXY_AUTHENTICATION_REQUIRED: 407, + REQUEST_TIMEOUT: 408, + CONFLICT: 409, + GONE: 410, + LENGTH_REQUIRED: 411, + PRECONDITION_FAILED: 412, + PAYLOAD_TOO_LARGE: 413, + URI_TOO_LONG: 414, + UNSUPPORTED_MEDIA_TYPE: 415, + RANGE_NOT_SATISFIABLE: 416, + EXPECTATION_FAILED: 417, + IM_A_TEAPOT: 418, + PAGE_EXPIRED: 419, + // Unofficial + ENHANCE_YOUR_CALM: 420, + // Unofficial + MISDIRECTED_REQUEST: 421, + UNPROCESSABLE_ENTITY: 422, + LOCKED: 423, + FAILED_DEPENDENCY: 424, + TOO_EARLY: 425, + UPGRADE_REQUIRED: 426, + PRECONDITION_REQUIRED: 428, + TOO_MANY_REQUESTS: 429, + REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, + // Unofficial + REQUEST_HEADER_FIELDS_TOO_LARGE: 431, + LOGIN_TIMEOUT: 440, + // Unofficial + NO_RESPONSE: 444, + // Unofficial + RETRY_WITH: 449, + // Unofficial + BLOCKED_BY_PARENTAL_CONTROL: 450, + // Unofficial + UNAVAILABLE_FOR_LEGAL_REASONS: 451, + CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, + // Unofficial + INVALID_X_FORWARDED_FOR: 463, + // Unofficial + REQUEST_HEADER_TOO_LARGE: 494, + // Unofficial + SSL_CERTIFICATE_ERROR: 495, + // Unofficial + SSL_CERTIFICATE_REQUIRED: 496, + // Unofficial + HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, + // Unofficial + INVALID_TOKEN: 498, + // Unofficial + CLIENT_CLOSED_REQUEST: 499, + // Unofficial + INTERNAL_SERVER_ERROR: 500, + NOT_IMPLEMENTED: 501, + BAD_GATEWAY: 502, + SERVICE_UNAVAILABLE: 503, + GATEWAY_TIMEOUT: 504, + HTTP_VERSION_NOT_SUPPORTED: 505, + VARIANT_ALSO_NEGOTIATES: 506, + INSUFFICIENT_STORAGE: 507, + LOOP_DETECTED: 508, + BANDWIDTH_LIMIT_EXCEEDED: 509, + NOT_EXTENDED: 510, + NETWORK_AUTHENTICATION_REQUIRED: 511, + WEB_SERVER_UNKNOWN_ERROR: 520, + // Unofficial + WEB_SERVER_IS_DOWN: 521, + // Unofficial + CONNECTION_TIMEOUT: 522, + // Unofficial + ORIGIN_IS_UNREACHABLE: 523, + // Unofficial + TIMEOUT_OCCURED: 524, + // Unofficial + SSL_HANDSHAKE_FAILED: 525, + // Unofficial + INVALID_SSL_CERTIFICATE: 526, + // Unofficial + RAILGUN_ERROR: 527, + // Unofficial + SITE_IS_OVERLOADED: 529, + // Unofficial + SITE_IS_FROZEN: 530, + // Unofficial + IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, + // Unofficial + NETWORK_READ_TIMEOUT: 598, + // Unofficial + NETWORK_CONNECT_TIMEOUT: 599 + // Unofficial + }; + exports.FINISH = { + SAFE: 0, + SAFE_WITH_CB: 1, + UNSAFE: 2 + }; + exports.HEADER_STATE = { + GENERAL: 0, + CONNECTION: 1, + CONTENT_LENGTH: 2, + TRANSFER_ENCODING: 3, + UPGRADE: 4, + CONNECTION_KEEP_ALIVE: 5, + CONNECTION_CLOSE: 6, + CONNECTION_UPGRADE: 7, + TRANSFER_ENCODING_CHUNKED: 8 + }; + exports.METHODS_HTTP = [ + exports.METHODS.DELETE, + exports.METHODS.GET, + exports.METHODS.HEAD, + exports.METHODS.POST, + exports.METHODS.PUT, + exports.METHODS.CONNECT, + exports.METHODS.OPTIONS, + exports.METHODS.TRACE, + exports.METHODS.COPY, + exports.METHODS.LOCK, + exports.METHODS.MKCOL, + exports.METHODS.MOVE, + exports.METHODS.PROPFIND, + exports.METHODS.PROPPATCH, + exports.METHODS.SEARCH, + exports.METHODS.UNLOCK, + exports.METHODS.BIND, + exports.METHODS.REBIND, + exports.METHODS.UNBIND, + exports.METHODS.ACL, + exports.METHODS.REPORT, + exports.METHODS.MKACTIVITY, + exports.METHODS.CHECKOUT, + exports.METHODS.MERGE, + exports.METHODS["M-SEARCH"], + exports.METHODS.NOTIFY, + exports.METHODS.SUBSCRIBE, + exports.METHODS.UNSUBSCRIBE, + exports.METHODS.PATCH, + exports.METHODS.PURGE, + exports.METHODS.MKCALENDAR, + exports.METHODS.LINK, + exports.METHODS.UNLINK, + exports.METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + exports.METHODS.SOURCE, + exports.METHODS.QUERY + ]; + exports.METHODS_ICE = [ + exports.METHODS.SOURCE + ]; + exports.METHODS_RTSP = [ + exports.METHODS.OPTIONS, + exports.METHODS.DESCRIBE, + exports.METHODS.ANNOUNCE, + exports.METHODS.SETUP, + exports.METHODS.PLAY, + exports.METHODS.PAUSE, + exports.METHODS.TEARDOWN, + exports.METHODS.GET_PARAMETER, + exports.METHODS.SET_PARAMETER, + exports.METHODS.REDIRECT, + exports.METHODS.RECORD, + exports.METHODS.FLUSH, + // For AirPlay + exports.METHODS.GET, + exports.METHODS.POST + ]; + exports.METHOD_MAP = (0, utils_1.enumToMap)(exports.METHODS); + exports.H_METHOD_MAP = Object.fromEntries(Object.entries(exports.METHODS).filter(([k]) => k.startsWith("H"))); + exports.STATUSES_HTTP = [ + exports.STATUSES.CONTINUE, + exports.STATUSES.SWITCHING_PROTOCOLS, + exports.STATUSES.PROCESSING, + exports.STATUSES.EARLY_HINTS, + exports.STATUSES.RESPONSE_IS_STALE, + exports.STATUSES.REVALIDATION_FAILED, + exports.STATUSES.DISCONNECTED_OPERATION, + exports.STATUSES.HEURISTIC_EXPIRATION, + exports.STATUSES.MISCELLANEOUS_WARNING, + exports.STATUSES.OK, + exports.STATUSES.CREATED, + exports.STATUSES.ACCEPTED, + exports.STATUSES.NON_AUTHORITATIVE_INFORMATION, + exports.STATUSES.NO_CONTENT, + exports.STATUSES.RESET_CONTENT, + exports.STATUSES.PARTIAL_CONTENT, + exports.STATUSES.MULTI_STATUS, + exports.STATUSES.ALREADY_REPORTED, + exports.STATUSES.TRANSFORMATION_APPLIED, + exports.STATUSES.IM_USED, + exports.STATUSES.MISCELLANEOUS_PERSISTENT_WARNING, + exports.STATUSES.MULTIPLE_CHOICES, + exports.STATUSES.MOVED_PERMANENTLY, + exports.STATUSES.FOUND, + exports.STATUSES.SEE_OTHER, + exports.STATUSES.NOT_MODIFIED, + exports.STATUSES.USE_PROXY, + exports.STATUSES.SWITCH_PROXY, + exports.STATUSES.TEMPORARY_REDIRECT, + exports.STATUSES.PERMANENT_REDIRECT, + exports.STATUSES.BAD_REQUEST, + exports.STATUSES.UNAUTHORIZED, + exports.STATUSES.PAYMENT_REQUIRED, + exports.STATUSES.FORBIDDEN, + exports.STATUSES.NOT_FOUND, + exports.STATUSES.METHOD_NOT_ALLOWED, + exports.STATUSES.NOT_ACCEPTABLE, + exports.STATUSES.PROXY_AUTHENTICATION_REQUIRED, + exports.STATUSES.REQUEST_TIMEOUT, + exports.STATUSES.CONFLICT, + exports.STATUSES.GONE, + exports.STATUSES.LENGTH_REQUIRED, + exports.STATUSES.PRECONDITION_FAILED, + exports.STATUSES.PAYLOAD_TOO_LARGE, + exports.STATUSES.URI_TOO_LONG, + exports.STATUSES.UNSUPPORTED_MEDIA_TYPE, + exports.STATUSES.RANGE_NOT_SATISFIABLE, + exports.STATUSES.EXPECTATION_FAILED, + exports.STATUSES.IM_A_TEAPOT, + exports.STATUSES.PAGE_EXPIRED, + exports.STATUSES.ENHANCE_YOUR_CALM, + exports.STATUSES.MISDIRECTED_REQUEST, + exports.STATUSES.UNPROCESSABLE_ENTITY, + exports.STATUSES.LOCKED, + exports.STATUSES.FAILED_DEPENDENCY, + exports.STATUSES.TOO_EARLY, + exports.STATUSES.UPGRADE_REQUIRED, + exports.STATUSES.PRECONDITION_REQUIRED, + exports.STATUSES.TOO_MANY_REQUESTS, + exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL, + exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE, + exports.STATUSES.LOGIN_TIMEOUT, + exports.STATUSES.NO_RESPONSE, + exports.STATUSES.RETRY_WITH, + exports.STATUSES.BLOCKED_BY_PARENTAL_CONTROL, + exports.STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS, + exports.STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST, + exports.STATUSES.INVALID_X_FORWARDED_FOR, + exports.STATUSES.REQUEST_HEADER_TOO_LARGE, + exports.STATUSES.SSL_CERTIFICATE_ERROR, + exports.STATUSES.SSL_CERTIFICATE_REQUIRED, + exports.STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT, + exports.STATUSES.INVALID_TOKEN, + exports.STATUSES.CLIENT_CLOSED_REQUEST, + exports.STATUSES.INTERNAL_SERVER_ERROR, + exports.STATUSES.NOT_IMPLEMENTED, + exports.STATUSES.BAD_GATEWAY, + exports.STATUSES.SERVICE_UNAVAILABLE, + exports.STATUSES.GATEWAY_TIMEOUT, + exports.STATUSES.HTTP_VERSION_NOT_SUPPORTED, + exports.STATUSES.VARIANT_ALSO_NEGOTIATES, + exports.STATUSES.INSUFFICIENT_STORAGE, + exports.STATUSES.LOOP_DETECTED, + exports.STATUSES.BANDWIDTH_LIMIT_EXCEEDED, + exports.STATUSES.NOT_EXTENDED, + exports.STATUSES.NETWORK_AUTHENTICATION_REQUIRED, + exports.STATUSES.WEB_SERVER_UNKNOWN_ERROR, + exports.STATUSES.WEB_SERVER_IS_DOWN, + exports.STATUSES.CONNECTION_TIMEOUT, + exports.STATUSES.ORIGIN_IS_UNREACHABLE, + exports.STATUSES.TIMEOUT_OCCURED, + exports.STATUSES.SSL_HANDSHAKE_FAILED, + exports.STATUSES.INVALID_SSL_CERTIFICATE, + exports.STATUSES.RAILGUN_ERROR, + exports.STATUSES.SITE_IS_OVERLOADED, + exports.STATUSES.SITE_IS_FROZEN, + exports.STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR, + exports.STATUSES.NETWORK_READ_TIMEOUT, + exports.STATUSES.NETWORK_CONNECT_TIMEOUT + ]; + exports.ALPHA = []; + for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { + exports.ALPHA.push(String.fromCharCode(i)); + exports.ALPHA.push(String.fromCharCode(i + 32)); + } + exports.NUM_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 }; - module.exports.MockInterceptor = MockInterceptor; - module.exports.MockScope = MockScope; - } -}); - -// node_modules/undici/lib/mock/mock-client.js -var require_mock_client = __commonJS({ - "node_modules/undici/lib/mock/mock-client.js"(exports, module) { - "use strict"; - var { promisify: promisify2 } = __require("util"); - var Client = require_client(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected, - kIgnoreTrailingSlash - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - var MockClient = class extends Client { - constructor(origin, opts) { - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - super(origin, opts); - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept(opts) { - return new MockInterceptor( - opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts }, - this[kDispatches] - ); - } - cleanMocks() { - this[kDispatches] = []; - } - async [kClose]() { - await promisify2(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); - } + exports.HEX_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 }; - module.exports = MockClient; - } -}); - -// node_modules/undici/lib/mock/mock-call-history.js -var require_mock_call_history = __commonJS({ - "node_modules/undici/lib/mock/mock-call-history.js"(exports, module) { - "use strict"; - var { kMockCallHistoryAddLog } = require_mock_symbols(); - var { InvalidArgumentError } = require_errors(); - function handleFilterCallsWithOptions(criteria, options, handler, store) { - switch (options.operator) { - case "OR": - store.push(...handler(criteria)); - return store; - case "AND": - return handler.call({ logs: store }, criteria); - default: - throw new InvalidArgumentError("options.operator must to be a case insensitive string equal to 'OR' or 'AND'"); + exports.NUM = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); + exports.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; + exports.USERINFO_CHARS = exports.ALPHANUM.concat(exports.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); + exports.URL_CHAR = [ + "!", + '"', + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + ":", + ";", + "<", + "=", + ">", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "{", + "|", + "}", + "~" + ].concat(exports.ALPHANUM); + exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); + exports.TOKEN = [ + "!", + "#", + "$", + "%", + "&", + "'", + "*", + "+", + "-", + ".", + "^", + "_", + "`", + "|", + "~" + ].concat(exports.ALPHANUM); + exports.HEADER_CHARS = [" "]; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports.HEADER_CHARS.push(i); } } - function buildAndValidateFilterCallsOptions(options = {}) { - const finalOptions = {}; - if ("operator" in options) { - if (typeof options.operator !== "string" || options.operator.toUpperCase() !== "OR" && options.operator.toUpperCase() !== "AND") { - throw new InvalidArgumentError("options.operator must to be a case insensitive string equal to 'OR' or 'AND'"); - } - return { - ...finalOptions, - operator: options.operator.toUpperCase() - }; + exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c2) => c2 !== 44); + exports.QUOTED_STRING = [" ", " "]; + for (let i = 33; i <= 255; i++) { + if (i !== 34 && i !== 92) { + exports.QUOTED_STRING.push(i); } - return finalOptions; } - function makeFilterCalls(parameterName) { - return (parameterValue) => { - if (typeof parameterValue === "string" || parameterValue == null) { - return this.logs.filter((log) => { - return log[parameterName] === parameterValue; - }); - } - if (parameterValue instanceof RegExp) { - return this.logs.filter((log) => { - return parameterValue.test(log[parameterName]); - }); - } - throw new InvalidArgumentError(`${parameterName} parameter should be one of string, regexp, undefined or null`); - }; + exports.HTAB_SP_VCHAR_OBS_TEXT = [" ", " "]; + for (let i = 33; i <= 126; i++) { + exports.HTAB_SP_VCHAR_OBS_TEXT.push(i); } - function computeUrlWithMaybeSearchParameters(requestInit) { - try { - const url = new URL(requestInit.path, requestInit.origin); - if (url.search.length !== 0) { - return url; - } - url.search = new URLSearchParams(requestInit.query).toString(); - return url; - } catch (error) { - throw new InvalidArgumentError("An error occurred when computing MockCallHistoryLog.url", { cause: error }); - } + for (let i = 128; i <= 255; i++) { + exports.HTAB_SP_VCHAR_OBS_TEXT.push(i); } - var MockCallHistoryLog = class { - constructor(requestInit = {}) { - this.body = requestInit.body; - this.headers = requestInit.headers; - this.method = requestInit.method; - const url = computeUrlWithMaybeSearchParameters(requestInit); - this.fullUrl = url.toString(); - this.origin = url.origin; - this.path = url.pathname; - this.searchParams = Object.fromEntries(url.searchParams); - this.protocol = url.protocol; - this.host = url.host; - this.port = url.port; - this.hash = url.hash; - } - toMap() { - return /* @__PURE__ */ new Map( - [ - ["protocol", this.protocol], - ["host", this.host], - ["port", this.port], - ["origin", this.origin], - ["path", this.path], - ["hash", this.hash], - ["searchParams", this.searchParams], - ["fullUrl", this.fullUrl], - ["method", this.method], - ["body", this.body], - ["headers", this.headers] - ] - ); - } - toString() { - const options = { betweenKeyValueSeparator: "->", betweenPairSeparator: "|" }; - let result = ""; - this.toMap().forEach((value, key) => { - if (typeof value === "string" || value === void 0 || value === null) { - result = `${result}${key}${options.betweenKeyValueSeparator}${value}${options.betweenPairSeparator}`; - } - if (typeof value === "object" && value !== null || Array.isArray(value)) { - result = `${result}${key}${options.betweenKeyValueSeparator}${JSON.stringify(value)}${options.betweenPairSeparator}`; - } - }); - return result.slice(0, -1); - } - }; - var MockCallHistory = class { - logs = []; - calls() { - return this.logs; - } - firstCall() { - return this.logs.at(0); - } - lastCall() { - return this.logs.at(-1); - } - nthCall(number) { - if (typeof number !== "number") { - throw new InvalidArgumentError("nthCall must be called with a number"); - } - if (!Number.isInteger(number)) { - throw new InvalidArgumentError("nthCall must be called with an integer"); - } - if (Math.sign(number) !== 1) { - throw new InvalidArgumentError("nthCall must be called with a positive value. use firstCall or lastCall instead"); - } - return this.logs.at(number - 1); - } - filterCalls(criteria, options) { - if (this.logs.length === 0) { - return this.logs; - } - if (typeof criteria === "function") { - return this.logs.filter(criteria); - } - if (criteria instanceof RegExp) { - return this.logs.filter((log) => { - return criteria.test(log.toString()); - }); - } - if (typeof criteria === "object" && criteria !== null) { - if (Object.keys(criteria).length === 0) { - return this.logs; - } - const finalOptions = { operator: "OR", ...buildAndValidateFilterCallsOptions(options) }; - let maybeDuplicatedLogsFiltered = []; - if ("protocol" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered); - } - if ("host" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered); - } - if ("port" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered); - } - if ("origin" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered); - } - if ("path" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered); - } - if ("hash" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered); - } - if ("fullUrl" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered); - } - if ("method" in criteria) { - maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered); - } - const uniqLogsFiltered = [...new Set(maybeDuplicatedLogsFiltered)]; - return uniqLogsFiltered; - } - throw new InvalidArgumentError("criteria parameter should be one of function, regexp, or object"); - } - filterCallsByProtocol = makeFilterCalls.call(this, "protocol"); - filterCallsByHost = makeFilterCalls.call(this, "host"); - filterCallsByPort = makeFilterCalls.call(this, "port"); - filterCallsByOrigin = makeFilterCalls.call(this, "origin"); - filterCallsByPath = makeFilterCalls.call(this, "path"); - filterCallsByHash = makeFilterCalls.call(this, "hash"); - filterCallsByFullUrl = makeFilterCalls.call(this, "fullUrl"); - filterCallsByMethod = makeFilterCalls.call(this, "method"); - clear() { - this.logs = []; - } - [kMockCallHistoryAddLog](requestInit) { - const log = new MockCallHistoryLog(requestInit); - this.logs.push(log); - return log; - } - *[Symbol.iterator]() { - for (const log of this.calls()) { - yield log; - } - } + exports.MAJOR = exports.NUM_MAP; + exports.MINOR = exports.MAJOR; + exports.SPECIAL_HEADERS = { + "connection": exports.HEADER_STATE.CONNECTION, + "content-length": exports.HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": exports.HEADER_STATE.CONNECTION, + "transfer-encoding": exports.HEADER_STATE.TRANSFER_ENCODING, + "upgrade": exports.HEADER_STATE.UPGRADE + }; + exports.default = { + ERROR: exports.ERROR, + TYPE: exports.TYPE, + FLAGS: exports.FLAGS, + LENIENT_FLAGS: exports.LENIENT_FLAGS, + METHODS: exports.METHODS, + STATUSES: exports.STATUSES, + FINISH: exports.FINISH, + HEADER_STATE: exports.HEADER_STATE, + ALPHA: exports.ALPHA, + NUM_MAP: exports.NUM_MAP, + HEX_MAP: exports.HEX_MAP, + NUM: exports.NUM, + ALPHANUM: exports.ALPHANUM, + MARK: exports.MARK, + USERINFO_CHARS: exports.USERINFO_CHARS, + URL_CHAR: exports.URL_CHAR, + HEX: exports.HEX, + TOKEN: exports.TOKEN, + HEADER_CHARS: exports.HEADER_CHARS, + CONNECTION_TOKEN_CHARS: exports.CONNECTION_TOKEN_CHARS, + QUOTED_STRING: exports.QUOTED_STRING, + HTAB_SP_VCHAR_OBS_TEXT: exports.HTAB_SP_VCHAR_OBS_TEXT, + MAJOR: exports.MAJOR, + MINOR: exports.MINOR, + SPECIAL_HEADERS: exports.SPECIAL_HEADERS, + METHODS_HTTP: exports.METHODS_HTTP, + METHODS_ICE: exports.METHODS_ICE, + METHODS_RTSP: exports.METHODS_RTSP, + METHOD_MAP: exports.METHOD_MAP, + H_METHOD_MAP: exports.H_METHOD_MAP, + STATUSES_HTTP: exports.STATUSES_HTTP }; - module.exports.MockCallHistory = MockCallHistory; - module.exports.MockCallHistoryLog = MockCallHistoryLog; } }); -// node_modules/undici/lib/mock/mock-pool.js -var require_mock_pool = __commonJS({ - "node_modules/undici/lib/mock/mock-pool.js"(exports, module) { +// node_modules/undici/lib/llhttp/llhttp-wasm.js +var require_llhttp_wasm = __commonJS({ + "node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports, module) { "use strict"; - var { promisify: promisify2 } = __require("util"); - var Pool = require_pool(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected, - kIgnoreTrailingSlash - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - var MockPool = class extends Pool { - constructor(origin, opts) { - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - super(origin, opts); - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept(opts) { - return new MockInterceptor( - opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts }, - this[kDispatches] - ); - } - cleanMocks() { - this[kDispatches] = []; - } - async [kClose]() { - await promisify2(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + var { Buffer: Buffer2 } = __require("buffer"); + var wasmBase64 = "AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgL5YUCAgd/A34gASACaiEEAkAgACIDKAIMIgANACADKAIEBEAgAyABNgIECyMAQRBrIgkkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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C0HjAQwHC0HXAQwGC0HYAQwFC0HZAQwEC0HaAQwDC0HbAQwCC0HdAQwBC0HcAQshAgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAg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ogKiAqICogKiAqICogKiAqICogKiAqICogIAogILIAQgAUEBaiIBRw0AC0HJACECDOwCCyABQQFqIQEgA0Evai0AAEEBcQ2lAiADQQA2AhwgAyABNgIUIANBlxA2AhAgA0EKNgIMQQAhAgzrAgsgASAERwRAA0AgAS0AAEEgRw0VIAQgAUEBaiIBRw0AC0H4ACECDOsCC0H4ACECDOoCCyADQQI6ACgMOAtBACECIANBADYCHCADQb8LNgIQIANBAjYCDCADIAFBAWo2AhQM6AILQQAhAgzOAgtBDSECDM0CC0ETIQIMzAILQRUhAgzLAgtBFiECDMoCC0EYIQIMyQILQRkhAgzIAgtBGiECDMcCC0EbIQIMxgILQRwhAgzFAgtBHSECDMQCC0EeIQIMwwILQR8hAgzCAgtBICECDMECC0EiIQIMwAILQSMhAgy/AgtBJSECDL4CC0HlACECDL0CCyADQT02AhwgAyABNgIUIAMgADYCDEEAIQIM1QILIANBGzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDNQCCyADQSA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzTAgsgA0ETNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0gILIANBCzYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNECCyADQRA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzQAgsgA0EgNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzwILIANBCzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM4CCyADQQw2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzNAgtBACECIANBADYCHCADIAE2AhQgA0HdDjYCECADQRI2AgwMzAILAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB/QEhAgzMAgsCQAJAIAMtADZBAUcNAEEAIQACQCADKAI4IgJFDQAgAigCYCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUcNASADQfwBNgIcIAMgATYCFCADQdwZNgIQIANBFTYCDEEAIQIMzQILQdwBIQIMswILIANBADYCHCADIAE2AhQgA0H5CzYCECADQR82AgxBACECDMsCCwJAAkAgAy0AKEEBaw4CBAEAC0HbASECDLICC0HUASECDLECCyADQQI6ADFBACEAAkAgAygCOCICRQ0AIAIoAgAiAkUNACADIAIRAAAhAAsgAEUEQEHdASECDLECCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQbQMNgIQIANBEDYCDEEAIQIMygILIANB+wE2AhwgAyABNgIUIANBgRo2AhAgA0EVNgIMQQAhAgzJAgsgASAERgRAQfoBIQIMyQILIAEtAABByABGDQEgA0EBOgAoC0HAASECDK4CC0HaASECDK0CCyABIARHBEAgA0EMNgIIIAMgATYCBEHZASECDK0CC0H5ASECDMUCCyABIARGBEBB+AEhAgzFAgsgAS0AAEHIAEcNBCABQQFqIQFB2AEhAgyrAgsgASAERgRAQfcBIQIMxAILAkACQCABLQAAQcUAaw4QAAUFBQUFBQUFBQUFBQUFAQULIAFBAWohAUHWASECDKsCCyABQQFqIQFB1wEhAgyqAgtB9gEhAiABIARGDcICIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbrVAGotAABHDQMgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMMCCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIARQRAQeMBIQIMqgILIANB9QE2AhwgAyABNgIUIAMgADYCDEEAIQIMwgILQfQBIQIgASAERg3BAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEG41QBqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzCAgsgA0GBBDsBKCADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIADQMMAgsgA0EANgIAC0EAIQIgA0EANgIcIAMgATYCFCADQeUfNgIQIANBCDYCDAy/AgtB1QEhAgylAgsgA0HzATYCHCADIAE2AhQgAyAANgIMQQAhAgy9AgtBACEAAkAgAygCOCICRQ0AIAIoAkAiAkUNACADIAIRAAAhAAsgAEUNbiAAQRVHBEAgA0EANgIcIAMgATYCFCADQYIPNgIQIANBIDYCDEEAIQIMvQILIANBjwE2AhwgAyABNgIUIANB7Bs2AhAgA0EVNgIMQQAhAgy8AgsgASAERwRAIANBDTYCCCADIAE2AgRB0wEhAgyjAgtB8gEhAgy7AgsgASAERgRAQfEBIQIMuwILAkACQAJAIAEtAABByABrDgsAAQgICAgICAgIAggLIAFBAWohAUHQASECDKMCCyABQQFqIQFB0QEhAgyiAgsgAUEBaiEBQdIBIQIMoQILQfABIQIgASAERg25AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBtdUAai0AAEcNBCAAQQJGDQMgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuQILQe8BIQIgASAERg24AiADKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABBs9UAai0AAEcNAyAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuAILQe4BIQIgASAERg23AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMtwILIAMoAgQhACADQgA3AwAgAyAAIAVBAWoiARArIgBFDQIgA0HsATYCHCADIAE2AhQgAyAANgIMQQAhAgy2AgsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNnAIgA0HtATYCHCADIAE2AhQgAyAANgIMQQAhAgy0AgtBzwEhAgyaAgtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDLQCC0HOASECDJoCCyADQesBNgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMsgILIAEgBEYEQEHrASECDLICCyABLQAAQS9GBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GyODYCECADQQg2AgxBACECDLECC0HNASECDJcCCyABIARHBEAgA0EONgIIIAMgATYCBEHMASECDJcCC0HqASECDK8CCyABIARGBEBB6QEhAgyvAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBywEhAgyWAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZcCIANB6AE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAEgBEYEQEHnASECDK4CCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5gE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILQcoBIQIMlAILIAEgBEYEQEHlASECDK0CC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDQIgA0HiATYCHCADIAE2AhQgAyAANgIMQQAhAgyvAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZoCIANB4wE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ2YAiADQeQBNgIcIAMgATYCFCADIAA2AgwMrQILQckBIQIMkwILQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBpA02AhAgA0EhNgIMQQAhAgytAgtByAEhAgyTAgsgA0HhATYCHCADIAE2AhQgA0HQGjYCECADQRU2AgxBACECDKsCCyABIARGBEBB4QEhAgyrAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANBmRE2AhAgA0EJNgIMQQAhAgyrAgtBxwEhAgyRAgsgASAERgRAQeABIQIMqgILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyrAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqgILQcYBIQIMkAILIAEgBEYEQEHfASECDKkCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqgILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKkCC0HFASECDI8CCyABIARGBEBB3gEhAgyoAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKkCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyoAgtBxAEhAgyOAgsgASAERgRAQd0BIQIMpwILAkACQAJAAkAgAS0AAEEKaw4XAgMDAAMDAwMDAwMDAwMDAwMDAwMDAwEDCyABQQFqDAULIAFBAWohAUHDASECDI8CCyABQQFqIQEgA0Evai0AAEEBcQ0IIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKcCCyADQQA2AhwgAyABNgIUIANBjQs2AhAgA0ENNgIMQQAhAgymAgsgASAERwRAIANBDzYCCCADIAE2AgRBASECDI0CC0HcASECDKUCCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtB2wEhAgymAgsgAygCBCEAIANBADYCBCADIAAgARAtIgBFBEAgAUEBaiEBDAQLIANB2gE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMpQILIAMoAgQhACADQQA2AgQgAyAAIAEQLSIADQEgAUEBagshAUHBASECDIoCCyADQdkBNgIcIAMgADYCDCADIAFBAWo2AhRBACECDKICC0HCASECDIgCCyADQS9qLQAAQQFxDQEgA0EANgIcIAMgATYCFCADQeQcNgIQIANBGTYCDEEAIQIMoAILIAEgBEYEQEHZASEC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IAFBAWohAUGeASECDOQBCyABQQFqIQFBnwEhAgzjAQtBtwEhAiABIARGDfsBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQezUAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPwBCyADQQA2AgAgBkEBaiEBQQ0MKAtBtgEhAiABIARGDfoBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPsBCyADQQA2AgAgBkEBaiEBQQwMJwtBtQEhAiABIARGDfkBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQerUAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPoBCyADQQA2AgAgBkEBaiEBQQMMJgtBtAEhAiABIARGDfgBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQejUAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPkBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQbMBIQIM+AELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBmQEhAgzfAQsgAUEBaiEBQZoBIQIM3gELQbIBIQIgASAERg32ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHm1ABqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz3AQsgA0EANgIAIAZBAWohAUEnDCMLQbEBIQIgASAERg31ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHk1ABqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz2AQsgA0EANgIAIAZBAWohAUEcDCILQbABIQIgASAERg30ASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHe1ABqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz1AQsgA0EANgIAIAZBAWohAUEGDCELQa8BIQIgASAERg3zASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHZ1ABqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz0AQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGuASECDPMBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQY4BIQIM3AELIAFBAWohAUGPASECDNsBCyABQQFqIQFBlAEhAgzaAQsgAUEBaiEBQZUBIQIM2QELQa0BIQIgASAERg3xASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHX1ABqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzyAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGsASECDPEBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGQASECDNgBCyABQQFqIQFBkwEhAgzXAQsgASAERgRAQasBIQIM8AELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQZEBIQIM1wELIAFBAWohAUGSASECDNYBCyABIARGBEBBqgEhAgzvAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GpASECIAEgBEYN7QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABB0dQAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7gELIANBADYCACAGQQFqIQFBHgwaC0GoASECIAEgBEYN7AEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBytQAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7QELIANBADYCACAGQQFqIQFBFQwZC0GnASECIAEgBEYN6wEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBx9QAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7AELIANBADYCACAGQQFqIQFBFwwYC0GmASECIAEgBEYN6gEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBwdQAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6wELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBpQEhAgzqAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYsBIQIM0QELIAFBAWohAUGMASECDNABC0GkASECIAEgBEYN6AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBptUAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6QELIANBADYCACAGQQFqIQFBCQwVC0GjASECIAEgBEYN5wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBpNUAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6AELIANBADYCACAGQQFqIQFBHwwUC0GiASECIAEgBEYN5gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBvtQAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5wELIANBADYCACAGQQFqIQFBAgwTC0GhASECIAEgBEYN5QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQbzUAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOUBCyABIARGBEBBoAEhAgzlAQtBASABLQAAQd8ARw0RGiABQQFqIQFBhwEhAgzLAQsgA0EANgIAIAZBAWohAUGIASECDMoBC0GfASECIAEgBEYN4gEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4wELIANBADYCACAGQQFqIQFBKQwPC0GeASECIAEgBEYN4QEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBuNQAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4gELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBnQEhAgzhAQsgAS0AAEHFAEcNDiABQQFqIQFBhAEhAgzHAQsgASAERgRAQZwBIQIM4AELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFBggEhAgzHAQsgAUEBaiEBQYMBIQIMxgELQZsBIQIgASAERg3eASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGz1ABqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzfAQsgA0EANgIAIAZBAWohAUEjDAsLQZoBIQIgASAERg3dASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGw1ABqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzeAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGZASECDN0BCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQf0AIQIMxAELIAFBAWohAUGAASECDMMBCyABIARGBEBBmAEhAgzcAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB/gAhAgzDAQsgAUEBaiEBQf8AIQIMwgELIAEgBEYEQEGXASECDNsBCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQZYBIQIgASAERg3ZASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEGs1ABqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzaAQsgA0EANgIAIAZBAWohAUEFDAYLQZUBIQIgASAERg3YASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGm1ABqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzZAQsgA0EANgIAIAZBAWohAUEWDAULQZQBIQIgASAERg3XASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzYAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGTASECDNcBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUH5ACECDL4BCyABQQFqIQFB+gAhAgy9AQtBkgEhAiABIARGDdUBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQaDUAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNYBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGRASECDNQBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC4iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB/h82AhAgA0EGNgIMDNEBC0H4ACECDLcBCyADQZABNgIcIAMgATYCFCADIAA2AgxBACECDM8BC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgzOAQtB9wAhAgy0AQsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDMwBCyABIARGBEBBjwEhAgzMAQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GbHzYCECADQQY2AgxBACECDMwBC0ECIQIMsgELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GOASECDMoBCyABIARGBEBBjQEhAgzKAQsCQCABLQAAQQlrDgRKAABKAAtB9QAhAgywAQsgAy0AKUEFRgRAQfYAIQIMsAELQfQAIQIMrwELIAEgBEYEQEGMASECDMgBCyADQRA2AgggAyABNgIEDAoLIAEgBEYEQEGLASECDMcBCwJAIAEtAABBCWsOBEcAAEcAC0HzACECDK0BCyABIARHBEAgA0EQNgIIIAMgATYCBEHxACECDK0BC0GKASECDMUBCwJAIAEgBEcEQANAIAEtAABBoNAAai0AACIAQQNHBEACQCAAQQFrDgJJAAQLQfAAIQIMrwELIAQgAUEBaiIBRw0AC0GIASEC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BCABQQFqIgFHDQALQfsAIQIMpwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMpgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMpQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMpAELIANBADYCHCADIAE2AhQgA0G8CjYCECADQQc2AgxBACECDKMBC0HPACECDIkBC0HRACECDIgBC0HnACECDIcBCyABIARGBEBB+gAhAgygAQsCQCABLQAAQQlrDgQgAAAgAAsgAUEBaiEBQeYAIQIMhgELIAEgBEYEQEH5ACECDJ8BCwJAIAEtAABBCWsOBB8AAB8AC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQRAQeIBIQIMhgELIABBFUcEQCADQQA2AhwgAyABNgIUIANByQ02AhAgA0EaNgIMQQAhAgyfAQsgA0H4ADYCHCADIAE2AhQgA0HqGjYCECADQRU2AgxBACECDJ4BCyABIARHBEAgA0ENNgIIIAMgATYCBEHkACECDIUBC0H3ACECDJ0BCyABIARGBEBB9gAhAgydAQsCQAJAAkAgAS0AAEHIAGsOCwABCwsLCwsLCwsCCwsgAUEBaiEBQd0AIQIMhQELIAFBAWohAUHgACECDIQBCyABQQFqIQFB4wAhAgyDAQtB9QAhAiABIARGDZsBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbXVAGotAABHDQggAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJwBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIABEAgA0H0ADYCHCADIAE2AhQgAyAANgIMQQAhAgycAQtB4gAhAgyCAQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJwBC0HhACECDIIBCyADQfMANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMmgELIAMtACkiAEEja0ELSQ0JAkAgAEEGSw0AQQEgAHRBygBxRQ0ADAoLQQAhAiADQQA2AhwgAyABNgIUIANB7Qk2AhAgA0EINgIMDJkBC0HyACECIAEgBEYNmAEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBs9UAai0AAEcNBSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMmQELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfEANgIcIAMgATYCFCADIAA2AgxBACECDJkBC0HfACECDH8LQQAhAAJAIAMoAjgiAkUNACACKAI0IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANB6g02AhAgA0EmNgIMQQAhAgyZAQtB3gAhAgx/CyADQfAANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMlwELIAMtAClBIUYNBiADQQA2AhwgAyABNgIUIANBkQo2AhAgA0EINgIMQQAhAgyWAQtB7wAhAiABIARGDZUBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDVAGotAABHDQIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJYBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIARQ0CIANB7QA2AhwgAyABNgIUIAMgADYCDEEAIQIMlQELIANBADYCAAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDYABIANB7gA2AhwgAyABNgIUIAMgADYCDEEAIQIMkwELQdwAIQIMeQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJMBC0HbACECDHkLIANB7AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyRAQsgAy0AKSIAQSNJDQAgAEEuRg0AIANBADYCHCADIAE2AhQgA0HJCTYCECADQQg2AgxBACECDJABC0HaACECDHYLIAEgBEYEQEHrACECDI8BCwJAIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMjwELQdkAIQIMdQsgASAERwRAIANBDjYCCCADIAE2AgRB2AAhAgx1C0HqACECDI0BCyABIARGBEBB6QAhAgyNAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1wAhAgx0CyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeiADQegANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyABIARGBEBB5wAhAgyMAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ17IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMjAELQdYAIQIMcgsgASAERgRAQeUAIQIMiwELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDI0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNfSADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeyADQeQANgIcIAMgATYCFCADIAA2AgwMiwELQdQAIQIMcQsgAy0AKUEiRg2GAUHTACECDHALQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALIABFBEBB1QAhAgxwCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQaQNNgIQIANBITYCDEEAIQIMiQELIANB4QA2AhwgAyABNgIUIANB0Bo2AhAgA0EVNgIMQQAhAgyIAQsgASAERgRAQeAAIQIMiAELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HSACECDHALIANBADYCHCADIAE2AhQgA0G2ETYCECADQQk2AgxBACECDIgBCyADQQA2AhwgAyABNgIUIANBthE2AhAgA0EJNgIMQQAhAgyHAQsgASAERgRAQd8AIQIMhwELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBthE2AhAgA0ECNgIMQQAhAgyGAQsgASAERgRAQd0AIQIMhgELIAEtAAAiAkENRgRAIAFBAWohAUHQACECDG0LIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyFAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0HKLTYCECADQQc2AgwMgwELIAEgBEYEQEHbACECDIMBCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc4AIQIMaAsgASAERgRAQdoAIQIMgQELIAEtAABBCWsOBAABAQABC0EAIQIgA0EANgIcIANBmhI2AhAgA0EHNgIMIAMgAUEBajYCFAx/CyADQYASOwEqQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2QA2AhwgAyABNgIUIANB6ho2AhAgA0EVNgIMQQAhAgx+C0HNACECDGQLIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDHwLIAEgBEYEQEHZACECDHwLIAEtAABBIEcNPSABQQFqIQEgAy0ALkEBcQ09IANBADYCHCADIAE2AhQgA0HCHDYCECADQR42AgxBACECDHsLIAEgBEYEQEHYACECDHsLAkACQAJAAkACQCABLQAAIgBBCmsOBAIDAwABCyABQQFqIQFBLCECDGULIABBOkcNASADQQA2AhwgAyABNgIUIANB5xE2AhAgA0EKNgIMQQAhAgx9CyABQQFqIQEgA0Evai0AAEEBcUUNcyADLQAyQYABcUUEQCADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALAkACQCAADhZNTEsBAQEBAQEBAQEBAQEBAQEBAQEAAQsgA0EpNgIcIAMgATYCFCADQawZNgIQIANBFTYCDEEAIQIMfgsg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c3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=="; + var wasmBuffer; + Object.defineProperty(module, "exports", { + get: () => { + return wasmBuffer ? wasmBuffer : wasmBuffer = Buffer2.from(wasmBase64, "base64"); } - }; - module.exports = MockPool; + }); } }); -// node_modules/undici/lib/mock/pending-interceptors-formatter.js -var require_pending_interceptors_formatter = __commonJS({ - "node_modules/undici/lib/mock/pending-interceptors-formatter.js"(exports, module) { +// node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +var require_llhttp_simd_wasm = __commonJS({ + "node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports, module) { "use strict"; - var { Transform } = __require("stream"); - var { Console } = __require("console"); - var PERSISTENT = process.versions.icu ? "\u2705" : "Y "; - var NOT_PERSISTENT = process.versions.icu ? "\u274C" : "N "; - module.exports = class PendingInterceptorsFormatter { - constructor({ disableColors } = {}) { - this.transform = new Transform({ - transform(chunk, _enc, cb) { - cb(null, chunk); - } - }); - this.logger = new Console({ - stdout: this.transform, - inspectOptions: { - colors: !disableColors && !process.env.CI - } - }); - } - format(pendingInterceptors) { - const withPrettyHeaders = pendingInterceptors.map( - ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ - Method: method, - Origin: origin, - Path: path, - "Status code": statusCode, - Persistent: persist ? PERSISTENT : NOT_PERSISTENT, - Invocations: timesInvoked, - Remaining: persist ? Infinity : times - timesInvoked - }) - ); - this.logger.table(withPrettyHeaders); - return this.transform.read().toString(); + var { Buffer: Buffer2 } = __require("buffer"); + var wasmBase64 = "AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgLhocCAwd/A34BeyABIAJqIQQCQCAAIgMoAgwiAA0AIAMoAgQEQCADIAE2AgQLIwBBEGsiCSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAIcIgJBAmsO/AEB+QECAwQFBgcICQoLDA0ODxAREvgBE/cBFBX2ARYX9QEYGRobHB0eHyD9AfsBIfQBIiMkJSYnKCkqK/MBLC0uLzAxMvIB8QEzNPAB7wE1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk/6AVBRUlPuAe0BVOwBVesBVldYWVrqAVtcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAekB6AHPAecB0AHmAdEB0gHTAdQB5QHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wEA/AELQQAM4wELQQ4M4gELQQ0M4QELQQ8M4AELQRAM3wELQRMM3gELQRQM3QELQRUM3AELQRYM2wELQRcM2gELQRgM2QELQRkM2AELQRoM1wELQRsM1gELQRwM1QELQR0M1AELQR4M0wELQR8M0gELQSAM0QELQSEM0AELQQgMzwELQSIMzgELQSQMzQELQSMMzAELQQcMywELQSUMygELQSYMyQELQScMyAELQSgMxwELQRIMxgELQREMxQELQSkMxAELQSoMwwELQSsMwgELQSwMwQELQd4BDMABC0EuDL8BC0EvDL4BC0EwDL0BC0ExDLwBC0EyDLsBC0EzDLoBC0E0DLkBC0HfAQy4AQtBNQy3AQtBOQy2AQtBDAy1AQtBNgy0AQtBNwyzAQtBOAyyAQtBPgyxAQtBOgywAQtB4AEMrwELQQsMrgELQT8MrQELQTsMrAELQQoMqwELQTwMqgELQT0MqQELQeEBDKgBC0HBAAynAQtBwAAMpgELQcIADKUBC0EJDKQBC0EtDKMBC0HDAAyiAQtBxAAMoQELQcUADKABC0HGAAyfAQtBxwAMngELQcgADJ0BC0HJAAycAQtBygAMmwELQcsADJoBC0HMAAyZAQtBzQAMmAELQc4ADJcBC0HPAAyWAQtB0AAMlQELQdEADJQBC0HSAAyTAQtB0wAMkgELQdUADJEBC0HUAAyQAQtB1gAMjwELQdcADI4BC0HYAAyNAQtB2QAMjAELQdoADIsBC0HbAAyKAQtB3AAMiQELQd0ADIgBC0HeAAyHAQtB3wAMhgELQeAADIUBC0HhAAyEAQtB4gAMgwELQeMADIIBC0HkAAyBAQtB5QAMgAELQeIBDH8LQeYADH4LQecADH0LQQYMfAtB6AAMewtBBQx6C0HpAAx5C0EEDHgLQeoADHcLQesADHYLQewADHULQe0ADHQLQQMMcwtB7gAMcgtB7wAMcQtB8AAMcAtB8gAMbwtB8QAMbgtB8wAMbQtB9AAMbAtB9QAMawtB9gAMagtBAgxpC0H3AAxoC0H4AAxnC0H5AAxmC0H6AAxlC0H7AAxkC0H8AAxjC0H9AAxiC0H+AAxhC0H/AAxgC0GAAQxfC0GBAQxeC0GCAQxdC0GDAQxcC0GEAQxbC0GFAQxaC0GGAQxZC0GHAQxYC0GIAQxXC0GJAQxWC0GKAQxVC0GLAQxUC0GMAQxTC0GNAQxSC0GOAQxRC0GPAQxQC0GQAQxPC0GRAQxOC0GSAQxNC0GTAQxMC0GUAQxLC0GVAQxKC0GWAQxJC0GXAQxIC0GYAQxHC0GZAQxGC0GaAQxFC0GbAQxEC0GcAQxDC0GdAQxCC0GeAQxBC0GfAQxAC0GgAQw/C0GhAQw+C0GiAQw9C0GjAQw8C0GkAQw7C0GlAQw6C0GmAQw5C0GnAQw4C0GoAQw3C0GpAQw2C0GqAQw1C0GrAQw0C0GsAQwzC0GtAQwyC0GuAQwxC0GvAQwwC0GwAQwvC0GxAQwuC0GyAQwtC0GzAQwsC0G0AQwrC0G1AQwqC0G2AQwpC0G3AQwoC0G4AQwnC0G5AQwmC0G6AQwlC0G7AQwkC0G8AQwjC0G9AQwiC0G+AQwhC0G/AQwgC0HAAQwfC0HBAQweC0HCAQwdC0EBDBwLQcMBDBsLQcQBDBoLQcUBDBkLQcYBDBgLQccBDBcLQcgBDBYLQckBDBULQcoBDBQLQcsBDBMLQcwBDBILQc0BDBELQc4BDBALQc8BDA8LQdABDA4LQdEBDA0LQdIBDAwLQdMBDAsLQdQBDAoLQdUBDAkLQdYBDAgLQeMBDAcLQdcBDAYLQdgBDAULQdkBDAQLQdoBDAMLQdsBDAILQd0BDAELQdwBCyECA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAn8CQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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A0EXNgIcIAMgADYCDCADIAFBAWo2AhQM+AILIABBFUYNI0EAIQIgA0EANgIcIAMgATYCFCADQdYMNgIQIANBIzYCDAz3AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQwdCyADQRk2AhwgAyAANgIMIAMgAUEBajYCFAz2AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQzvAgsgA0EaNgIcIAMgADYCDCADIAFBAWo2AhQM9QILIABBFUYNH0EAIQIgA0EANgIcIAMgATYCFCADQdAPNgIQIANBIjYCDAz0AgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDBsLIANBHDYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgzzAgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDOsCCyADQR02AhwgAyAANgIMIAMgAUEBajYCFEEAIQIM8gILIABBO0cNASABQQFqIQELQSYhAgzXAgtBACECIANBADYCHCADIAE2AhQgA0GfFTYCECADQQw2AgwM7wILIAEgBEcEQANAIAEtAABBIEcNhAIgBCABQQFqIgFHDQALQSwhAgzvAgtBLCECDO4CCyABIARGBEBBNCECDO4CCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtBNCECDO8CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNnwIgA0EyNgIcIAMgATYCFCADIAA2AgxBACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUEQCABQQFqIQEMnwILIANBMjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgztAgsgASAERwRAAkADQCABLQAAQTBrIgBB/wFxQQpPBEBBOiECDNcCCyADKQMgIgtCmbPmzJmz5swZVg0BIAMgC0IKfiIKNwMgIAogAK1C/wGDIgtCf4VWDQEgAyAKIAt8NwMgIAQgAUEBaiIBRw0AC0HAACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABQQFqIgEQMSIADRcM4gILQcAAIQIM7AILIAEgBEYEQEHJACECDOwCCwJAA0ACQCABLQAAQQlrDhgAAqICogKpAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAgCiAgsgBCABQQFqIgFHDQALQckAIQIM7AILIAFBAWohASADQS9qLQAAQQFxDaUCIANBADYCHCADIAE2AhQgA0GXEDYCECADQQo2AgxBACECDOsCCyABIARHBEADQCABLQAAQSBHDRUgBCABQQFqIgFHDQALQfgAIQIM6wILQfgAIQIM6gILIANBAjoAKAw4C0EAIQIgA0EANgIcIANBvws2AhAgA0ECNgIMIAMgAUEBajYCFAzoAgtBACECDM4CC0ENIQIMzQILQRMhAgzMAgtBFSECDMsCC0EWIQIMygILQRghAgzJAgtBGSECDMgCC0EaIQIMxwILQRshAgzGAgtBHCECDMUCC0EdIQIMxAILQR4hAgzDAgtBHyECDMICC0EgIQIMwQILQSIhAgzAAgtBIyECDL8CC0ElIQIMvgILQeUAIQIMvQILIANBPTYCHCADIAE2AhQgAyAANgIMQQAhAgzVAgsgA0EbNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIM1AILIANBIDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNMCCyADQRM2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzSAgsgA0ELNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0QILIANBEDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNACCyADQSA2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzPAgsgA0ELNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzgILIANBDDYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM0CC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAzMAgsCQANAAkAgAS0AAEEKaw4EAAICAAILIAQgAUEBaiIBRw0AC0H9ASECDMwCCwJAAkAgAy0ANkEBRw0AQQAhAAJAIAMoAjgiAkUNACACKAJgIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB/AE2AhwgAyABNgIUIANB3Bk2AhAgA0EVNgIMQQAhAgzNAgtB3AEhAgyzAgsgA0EANgIcIAMgATYCFCADQfkLNgIQIANBHzYCDEEAIQIMywILAkACQCADLQAoQQFrDgIEAQALQdsBIQIMsgILQdQBIQIMsQILIANBAjoAMUEAIQACQCADKAI4IgJFDQAgAigCACICRQ0AIAMgAhEAACEACyAARQRAQd0BIQIMsQILIABBFUcEQCADQQA2AhwgAyABNgIUIANBtAw2AhAgA0EQNgIMQQAhAgzKAgsgA0H7ATYCHCADIAE2AhQgA0GBGjYCECADQRU2AgxBACECDMkCCyABIARGBEBB+gEhAgzJAgsgAS0AAEHIAEYNASADQQE6ACgLQcABIQIMrgILQdoBIQIMrQILIAEgBEcEQCADQQw2AgggAyABNgIEQdkBIQIMrQILQfkBIQIMxQILIAEgBEYEQEH4ASECDMUCCyABLQAAQcgARw0EIAFBAWohAUHYASECDKsCCyABIARGBEBB9wEhAgzEAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQdYBIQIMqwILIAFBAWohAUHXASECDKoCC0H2ASECIAEgBEYNwgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABButUAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMwwILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgBFBEBB4wEhAgyqAgsgA0H1ATYCHCADIAE2AhQgAyAANgIMQQAhAgzCAgtB9AEhAiABIARGDcECIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjVAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMICCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB5R82AhAgA0EINgIMDL8CC0HVASECDKUCCyADQfMBNgIcIAMgATYCFCADIAA2AgxBACECDL0CC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ1uIABBFUcEQCADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgy9AgsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDLwCCyABIARHBEAgA0ENNgIIIAMgATYCBEHTASECDKMCC0HyASECDLsCCyABIARGBEBB8QEhAgy7AgsCQAJAAkAgAS0AAEHIAGsOCwABCAgICAgICAgCCAsgAUEBaiEBQdABIQIMowILIAFBAWohAUHRASECDKICCyABQQFqIQFB0gEhAgyhAgtB8AEhAiABIARGDbkCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEG11QBqLQAARw0EIABBAkYNAyAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy5AgtB7wEhAiABIARGDbgCIAMoAgAiACAEIAFraiEGIAEgAGtBAWohBQNAIAEtAAAgAEGz1QBqLQAARw0DIABBAUYNAiAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy4AgtB7gEhAiABIARGDbcCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEGw1QBqLQAARw0CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy3AgsgAygCBCEAIANCADcDACADIAAgBUEBaiIBECsiAEUNAiADQewBNgIcIAMgATYCFCADIAA2AgxBACECDLYCCyADQQA2AgALIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ2cAiADQe0BNgIcIAMgATYCFCADIAA2AgxBACECDLQCC0HPASECDJoCC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMtAILQc4BIQIMmgILIANB6wE2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyyAgsgASAERgRAQesBIQIMsgILIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMsQILQc0BIQIMlwILIAEgBEcEQCADQQ42AgggAyABNgIEQcwBIQIMlwILQeoBIQIMrwILIAEgBEYEQEHpASECDK8CCyABLQAAQTBrIgBB/wFxQQpJBEAgAyAAOgAqIAFBAWohAUHLASECDJYCCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNlwIgA0HoATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgASAERgRAQecBIQIMrgILAkAgAS0AAEEuRgRAIAFBAWohAQwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmAIgA0HmATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgtBygEhAgyUAgsgASAERgRAQeUBIQIMrQILQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDK8CCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmgIgA0HjATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5AE2AhwgAyABNgIUIAMgADYCDAytAgtByQEhAgyTAgtBACEAAkAgAygCOCICRQ0AIAIoAkQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GkDTYCECADQSE2AgxBACECDK0CC0HIASECDJMCCyADQeEBNgIcIAMgATYCFCADQdAaNgIQIANBFTYCDEEAIQIMqwILIAEgBEYEQEHhASECDKsCCwJAIAEtAABBIEYEQCADQQA7ATQgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GZETYCECADQQk2AgxBACECDKsCC0HHASECDJECCyABIARGBEBB4AEhAgyqAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKsCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyqAgtBxgEhAgyQAgsgASAERgRAQd8BIQIMqQILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyqAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqQILQcUBIQIMjwILIAEgBEYEQEHeASECDKgCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqQILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKgCC0HEASECDI4CCyABIARGBEBB3QEhAgynAgsCQAJAAkACQCABLQAAQQprDhcCAwMAAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAFBAWoMBQsgAUEBaiEBQcMBIQIMjwILIAFBAWohASADQS9qLQAAQQFxDQggA0EANgIcIAMgATYCFCADQY0LNgIQIANBDTYCDEEAIQIMpwILIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKYCCyABIARHBEAgA0EPNgIIIAMgATYCBEEBIQIMjQILQdwBIQIMpQILAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0HbASECDKYCCyADKAIEIQAgA0EANgIEIAMgACABEC0iAEUEQCABQQFqIQEMBAsgA0HaATYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgylAgsgAygCBCEAIANBADYCBCADIAAgARAtIgANASABQQFqCyEBQcEBIQIMigILIANB2QE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMogILQcIBIQIMiAILIANBL2otAABBAXENASADQQA2AhwgAyABNgIUIANB5Bw2AhAgA0EZNgIMQQAhAgygAgsgASAERgRAQdkB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CyADIAU2AgAMkAILIANBADYCACAGQQFqIQFBGgw8C0HKASECIAEgBEYNjgIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBjdUAai0AAEcNOyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjwILIANBADYCACAGQQFqIQFBIQw7CyABIARGBEBByQEhAgyOAgsCQAJAIAEtAABBwQBrDhQAPT09PT09PT09PT09PT09PT09AT0LIAFBAWohAUGtASECDPUBCyABQQFqIQFBsAEhAgz0AQsgASAERgRAQcgBIQIMjQILAkACQCABLQAAQdUAaw4LADw8PDw8PDw8PAE8CyABQQFqIQFBrgEhAgz0AQsgAUEBaiEBQa8BIQIM8wELQccBIQIgASAERg2LAiADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw04IABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyMAgsgA0EANgIAIAZBAWohAUEqDDgLIAEgBEYEQEHGASECDIsCCyABLQAAQdAARw04IAFBAWohAUElDDcLQcUBIQIgASAERg2JAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGB1QBqLQAARw02IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyKAgsgA0EANgIAIAZBAWohAUEODDYLIAEgBEYEQEHEASECDIkCCyABLQAAQcUARw02IAFBAWohAUGrASECDO8BCyABIARGBEBBwwEhAgyIAgsCQAJAAkACQCABLQAAQcIAaw4PAAECOTk5OTk5OTk5OTkDOQsgAUEBaiEBQacBIQIM8QELIAFBAWohAUGoASECDPABCyABQQFqIQFBqQEhAgzvAQsgAUEBaiEBQaoBIQIM7gELQcIBIQIgASAERg2GAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH+1ABqLQAARw0zIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyHAgsgA0EANgIAIAZBAWohAUEUDDMLQcEBIQIgASAERg2FAiADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANA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BTYCAAzsAQsgA0EANgIAIAZBAWohAUEXDBgLQaYBIQIgASAERg3qASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHB1ABqLQAARw0XIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzrAQsgA0EANgIAIAZBAWohAUEYDBcLIAEgBEYEQEGlASECDOoBCwJAAkAgAS0AAEHJAGsOBwAZGRkZGQEZCyABQQFqIQFBiwEhAgzRAQsgAUEBaiEBQYwBIQIM0AELQaQBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw0VIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEJDBULQaMBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw0UIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEfDBQLQaIBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEG+1ABqLQAARw0TIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUECDBMLQaEBIQIgASAERg3lASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYDQCABLQAAIABBvNQAai0AAEcNESAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5QELIAEgBEYEQEGgASECDOUBC0EBIAEtAABB3wBHDREaIAFBAWohAUGHASECDMsBCyADQQA2AgAgBkEBaiEBQYgBIQIMygELQZ8BIQIgASAERg3iASADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw0PIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzjAQsgA0EANgIAIAZBAWohAUEpDA8LQZ4BIQIgASAERg3hASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEG41ABqLQAARw0OIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAziAQsgA0EANgIAIAZBAWohAUEtDA4LIAEgBEYEQEGdASECDOEBCyABLQAAQcUARw0OIAFBAWohAUGEASECDMcBCyABIARGBEBBnAEhAgzgAQsCQAJAIAEtAABBzABrDggADw8PDw8PAQ8LIAFBAWohAUGCASECDMcBCyABQQFqIQFBgwEhAgzGAQtBmwEhAiABIARGDd4BIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQbPUAGotAABHDQsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN8BCyADQQA2AgAgBkEBaiEBQSMMCwtBmgEhAiABIARGDd0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDUAGotAABHDQogAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN4BCyADQQA2AgAgBkEBaiEBQQAMCgsgASAERgRAQZkBIQIM3QELAkACQCABLQAAQcgAaw4IAAwMDAwMDAEMCyABQQFqIQFB/QAhAgzEAQsgAUEBaiEBQYABIQIMwwELIAEgBEYEQEGYASECDNwBCwJAAkAgAS0AAEHOAGsOAwALAQsLIAFBAWohAUH+ACECDMMBCyABQQFqIQFB/wAhAgzCAQsgASAERgRAQZcBIQIM2wELIAEtAABB2QBHDQggAUEBaiEBQQgMBwtBlgEhAiABIARGDdkBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazUAGotAABHDQYgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNoBCyADQQA2AgAgBkEBaiEBQQUMBgtBlQEhAiABIARGDdgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQabUAGotAABHDQUgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNkBCyADQQA2AgAgBkEBaiEBQRYMBQtBlAEhAiABIARGDdcBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDQQgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyADQQA2AgAgBkEBaiEBQRAMBAsgASAERgRAQZMBIQIM1wELAkACQCABLQAAQcMAaw4MAAYGBgYGBgYGBgYBBgsgAUEBaiEBQfkAIQIMvgELIAFBAWohAUH6ACECDL0BC0GSASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBoNQAai0AAEcNAiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBJAwCCyADQQA2AgAMAgsgASAERgRAQZEBIQIM1AELIAEtAABBzABHDQEgAUEBaiEBQRMLOgApIAMoAgQhACADQQA2AgQgAyAAIAEQLiIADQIMAQtBACECIANBADYCHCADIAE2AhQgA0H+HzYCECADQQY2AgwM0QELQfgAIQIMtwELIANBkAE2AhwgAyABNgIUIAMgADYCDEEAIQIMzwELQQAhAAJAIAMoAjgiAkUNACACKAJAIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GCDzYCECADQSA2AgxBACECDM4BC0H3ACECDLQBCyADQY8BNgIcIAMgATYCFCADQewbNgIQIANBFTYCDEEAIQIMzAELIAEgBEYEQEGPASECDMwBCwJAIAEtAABBIEYEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQZsfNgIQIANBBjYCDEEAIQIMzAELQQIhAgyyAQsDQCABLQAAQSBHDQIgBCABQQFqIgFHDQALQY4BIQIMygELIAEgBEYEQEGNASECDMoBCwJAIAEtAABBCWsOBEoAAEoAC0H1ACECDLABCyADLQApQQVGBEBB9gAhAgywAQtB9AAhAgyvAQsgASAERgRAQYwBIQIMyAELIANBEDYCCCADIAE2AgQMCgsgASAERgRAQYsBIQIMxwELAkAgAS0AAEEJaw4ERwAARwALQfMAIQIMrQELIAEgBEcEQCADQRA2AgggAyABNgIEQfEAIQIMrQELQYoBIQIMxQELAkAgASAERwRAA0AgAS0AAEGg0ABqLQAAIgBBA0cEQAJAIABBAWsOAkkABAtB8AAhAgyvAQsgBCABQQFqIgFHDQALQYgBIQIMxgELQYgBIQIMxQELIANBADYCHCADIAE2AhQgA0HbIDYCECADQQc2AgxBACECDMQBCyABIARGBEBBiQEhAgzEAQsCQAJAAkAgAS0AAEGg0gBqLQAAQQFrDgNGAgABC0HyACECDKwBCyADQQA2AhwgAyABNgIUIANBtBI2AhAgA0EHNgIMQQAhAgzEAQtB6gAhAgyqAQsgASAERwRAIAFBAWohAUHvACECDKoBC0GHASECDMIBCyAEIAEiAEYEQEGGASECDMIBCyAALQAAIgFBL0YEQCAAQQFqIQFB7gAhAgypAQsgAUEJayICQRdLDQEgACEBQQEgAnRBm4CABHENQQwBCyAEIAEiAEYEQEGFASECDMEBCyAALQAAQS9HDQAgAEEBaiEBDAMLQQAhAiADQQA2AhwgAyAANgIUIANB2yA2AhAgA0EHNgIMDL8BCwJAAkACQAJAAkADQCABLQAAQaDOAGotAAAiAEEFRwRAAkACQCAAQQFrDghHBQYHCAAEAQgLQesAIQIMrQELIAFBAWohAUHtACECDKwBCyAEIAFBAWoiAUcNAAtBhAEhAgzDAQsgAUEBagwUCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDMEBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDMABCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDL8BCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy+AQsgASAERgRAQYMBIQIMvgELAkAgAS0AAEGgzgBqLQAAQQFrDgg+BAUGAAgCAwcLIAFBAWohAQtBAyECDKMBCyABQQFqDA0LQQAhAiADQQA2AhwgA0HREjYCECADQQc2AgwgAyABQQFqNgIUDLoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDLkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDLgBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDLcBCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy2AQtB7AAhAgycAQsgASAERgRAQYIBIQIMtQELIAFBAWoMAgsgASAERgRAQYEBIQIMtAELIAFBAWoMAQsgASAERg0BIAFBAWoLIQFBBCECDJgBC0GAASECDLABCwNAIAEtAABBoMwAai0AACIAQQJHBEAgAEEBRwRAQekAIQIMmQELDDELIAQgAUEBaiIBRw0AC0H/ACECDK8BCyABIARGBEBB/gAhAgyvAQsCQCABLQAAQQlrDjcvAwYvBAYGBgYGBgYGBgYGBgYGBgYGBgUGBgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYABgsgAUEBagshAUEFIQIMlAELIAFBAWoMBgsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgypAQsgA0EANgIcIAMgATYCFCADQY0UNgIQIANBBzYCDEEAIQIMqAELAkACQAJAAkADQCABLQAAQaDKAGotAAAiAEEFRwRAAkAgAEEBaw4GLgMEBQYABgtB6AAhAgyUAQsgBCABQQFqIgFHDQALQf0AIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqAELIANBADYCHCADIAE2AhQgA0HkCDYCECADQQc2AgxBACECDKcBCyABIARGDQEgAUEBagshAUEGIQIMjAELQfwAIQIMpAELAkACQAJAAkADQCABLQAAQaDIAGotAAAiAEEFRwRAIABBAWsOBCkCAwQFCyAEIAFBAWoiAUcNAAtB+wAhAgynAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgymAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgylAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgykAQsgA0EANgIcIAMgATYCFCADQbwKNgIQIANBBzYCDEEAIQIMowELQc8AIQIMiQELQdEAIQIMiAELQecAIQIMhwELIAEgBEYEQEH6ACECDKABCwJAIAEtAABBCWsOBCAAACAACyABQQFqIQFB5gAhAgyGAQsgASAERgRAQfkAIQIMnwELAkAgAS0AAEEJaw4EHwAAHwALQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFBEBB4gEhAgyGAQsgAEEVRwRAIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDJ8BCyADQfgANgIcIAMgATYCFCADQeoaNgIQIANBFTYCDEEAIQIMngELIAEgBEcEQCADQQ02AgggAyABNgIEQeQAIQIMhQELQfcAIQIMnQELIAEgBEYEQEH2ACECDJ0BCwJAAkACQCABLQAAQcgAaw4LAAELCwsLCwsLCwILCyABQQFqIQFB3QAhAgyFAQsgAUEBaiEBQeAAIQIMhAELIAFBAWohAUHjACECDIMBC0H1ACECIAEgBEYNmwEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBtdUAai0AAEcNCCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMnAELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfQANgIcIAMgATYCFCADIAA2AgxBACECDJwBC0HiACECDIIBC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMnAELQeEAIQIMggELIANB8wA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyaAQsgAy0AKSIAQSNrQQtJDQkCQCAAQQZLDQBBASAAdEHKAHFFDQAMCgtBACECIANBADYCHCADIAE2AhQgA0HtCTYCECADQQg2AgwMmQELQfIAIQIgASAERg2YASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGz1QBqLQAARw0FIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAQsgAygCBCEAIANCADcDACADIAAgBkEBaiIBECsiAARAIANB8QA2AhwgAyABNgIUIAMgADYCDEEAIQIMmQELQd8AIQIMfwtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJkBC0HeACECDH8LIANB8AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyXAQsgAy0AKUEhRg0GIANBADYCHCADIAE2AhQgA0GRCjYCECADQQg2AgxBACECDJYBC0HvACECIAEgBEYNlQEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMlgELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgBFDQIgA0HtADYCHCADIAE2AhQgAyAANgIMQQAhAgyVAQsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNgAEgA0HuADYCHCADIAE2AhQgAyAANgIMQQAhAgyTAQtB3AAhAgx5C0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMkwELQdsAIQIMeQsgA0HsADYCHCADIAE2AhQgA0GAGzYCECADQRU2AgxBACECDJEBCyADLQApIgBBI0kNACAAQS5GDQAgA0EANgIcIAMgATYCFCADQckJNgIQIANBCDYCDEEAIQIMkAELQdoAIQIMdgsgASAERgRAQesAIQIMjwELAkAgAS0AAEEvRgRAIAFBAWohAQwBCyAD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ciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=="; + var wasmBuffer; + Object.defineProperty(module, "exports", { + get: () => { + return wasmBuffer ? wasmBuffer : wasmBuffer = Buffer2.from(wasmBase64, "base64"); } - }; + }); } }); -// node_modules/undici/lib/mock/mock-agent.js -var require_mock_agent = __commonJS({ - "node_modules/undici/lib/mock/mock-agent.js"(exports, module) { +// node_modules/undici/lib/web/fetch/constants.js +var require_constants4 = __commonJS({ + "node_modules/undici/lib/web/fetch/constants.js"(exports, module) { "use strict"; - var { kClients } = require_symbols(); - var Agent = require_agent(); - var { - kAgent, - kMockAgentSet, - kMockAgentGet, - kDispatches, - kIsMockActive, - kNetConnect, - kGetNetConnect, - kOptions, - kFactory, - kMockAgentRegisterCallHistory, - kMockAgentIsCallHistoryEnabled, - kMockAgentAddCallHistoryLog, - kMockAgentMockCallHistoryInstance, - kMockAgentAcceptsNonStandardSearchParameters, - kMockCallHistoryAddLog, - kIgnoreTrailingSlash - } = require_mock_symbols(); - var MockClient = require_mock_client(); - var MockPool = require_mock_pool(); - var { matchValue, normalizeSearchParams, buildAndValidateMockOptions, normalizeOrigin } = require_mock_utils(); - var { InvalidArgumentError, UndiciError } = require_errors(); - var Dispatcher = require_dispatcher(); - var PendingInterceptorsFormatter = require_pending_interceptors_formatter(); - var { MockCallHistory } = require_mock_call_history(); - var MockAgent = class extends Dispatcher { - constructor(opts = {}) { - super(opts); - const mockOptions = buildAndValidateMockOptions(opts); - this[kNetConnect] = true; - this[kIsMockActive] = true; - this[kMockAgentIsCallHistoryEnabled] = mockOptions.enableCallHistory ?? false; - this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions.acceptNonStandardSearchParameters ?? false; - this[kIgnoreTrailingSlash] = mockOptions.ignoreTrailingSlash ?? false; - if (opts?.agent && typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - const agent = opts?.agent ? opts.agent : new Agent(opts); - this[kAgent] = agent; - this[kClients] = agent[kClients]; - this[kOptions] = mockOptions; - if (this[kMockAgentIsCallHistoryEnabled]) { - this[kMockAgentRegisterCallHistory](); - } - } - get(origin) { - const normalizedOrigin = normalizeOrigin(origin); - const originKey = this[kIgnoreTrailingSlash] ? normalizedOrigin.replace(/\/$/, "") : normalizedOrigin; - let dispatcher = this[kMockAgentGet](originKey); - if (!dispatcher) { - dispatcher = this[kFactory](originKey); - this[kMockAgentSet](originKey, dispatcher); - } - return dispatcher; - } - dispatch(opts, handler) { - opts.origin = normalizeOrigin(opts.origin); - this.get(opts.origin); - this[kMockAgentAddCallHistoryLog](opts); - const acceptNonStandardSearchParameters = this[kMockAgentAcceptsNonStandardSearchParameters]; - const dispatchOpts = { ...opts }; - if (acceptNonStandardSearchParameters && dispatchOpts.path) { - const [path, searchParams] = dispatchOpts.path.split("?"); - const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters); - dispatchOpts.path = `${path}?${normalizedSearchParams}`; - } - return this[kAgent].dispatch(dispatchOpts, handler); - } - async close() { - this.clearCallHistory(); - await this[kAgent].close(); - this[kClients].clear(); - } - deactivate() { - this[kIsMockActive] = false; - } - activate() { - this[kIsMockActive] = true; - } - enableNetConnect(matcher) { - if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { - if (Array.isArray(this[kNetConnect])) { - this[kNetConnect].push(matcher); - } else { - this[kNetConnect] = [matcher]; - } - } else if (typeof matcher === "undefined") { - this[kNetConnect] = true; - } else { - throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); - } - } - disableNetConnect() { - this[kNetConnect] = false; - } - enableCallHistory() { - this[kMockAgentIsCallHistoryEnabled] = true; - return this; - } - disableCallHistory() { - this[kMockAgentIsCallHistoryEnabled] = false; - return this; - } - getCallHistory() { - return this[kMockAgentMockCallHistoryInstance]; - } - clearCallHistory() { - if (this[kMockAgentMockCallHistoryInstance] !== void 0) { - this[kMockAgentMockCallHistoryInstance].clear(); - } - } - // This is required to bypass issues caused by using global symbols - see: - // https://github.com/nodejs/undici/issues/1447 - get isMockActive() { - return this[kIsMockActive]; - } - [kMockAgentRegisterCallHistory]() { - if (this[kMockAgentMockCallHistoryInstance] === void 0) { - this[kMockAgentMockCallHistoryInstance] = new MockCallHistory(); - } - } - [kMockAgentAddCallHistoryLog](opts) { - if (this[kMockAgentIsCallHistoryEnabled]) { - this[kMockAgentRegisterCallHistory](); - this[kMockAgentMockCallHistoryInstance][kMockCallHistoryAddLog](opts); - } - } - [kMockAgentSet](origin, dispatcher) { - this[kClients].set(origin, { count: 0, dispatcher }); - } - [kFactory](origin) { - const mockOptions = Object.assign({ agent: this }, this[kOptions]); - return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); - } - [kMockAgentGet](origin) { - const result = this[kClients].get(origin); - if (result?.dispatcher) { - return result.dispatcher; - } - if (typeof origin !== "string") { - const dispatcher = this[kFactory]("http://localhost:9999"); - this[kMockAgentSet](origin, dispatcher); - return dispatcher; - } - for (const [keyMatcher, result2] of Array.from(this[kClients])) { - if (result2 && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { - const dispatcher = this[kFactory](origin); - this[kMockAgentSet](origin, dispatcher); - dispatcher[kDispatches] = result2.dispatcher[kDispatches]; - return dispatcher; - } - } - } - [kGetNetConnect]() { - return this[kNetConnect]; - } - pendingInterceptors() { - const mockAgentClients = this[kClients]; - return Array.from(mockAgentClients.entries()).flatMap(([origin, result]) => result.dispatcher[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); - } - assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { - const pending = this.pendingInterceptors(); - if (pending.length === 0) { - return; - } - throw new UndiciError( - pending.length === 1 ? `1 interceptor is pending: - -${pendingInterceptorsFormatter.format(pending)}`.trim() : `${pending.length} interceptors are pending: - -${pendingInterceptorsFormatter.format(pending)}`.trim() - ); - } + var corsSafeListedMethods = ( + /** @type {const} */ + ["GET", "HEAD", "POST"] + ); + var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); + var nullBodyStatus = ( + /** @type {const} */ + [101, 204, 205, 304] + ); + var redirectStatus = ( + /** @type {const} */ + [301, 302, 303, 307, 308] + ); + var redirectStatusSet = new Set(redirectStatus); + var badPorts = ( + /** @type {const} */ + [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "4190", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6679", + "6697", + "10080" + ] + ); + var badPortsSet = new Set(badPorts); + var referrerPolicyTokens = ( + /** @type {const} */ + [ + "no-referrer", + "no-referrer-when-downgrade", + "same-origin", + "origin", + "strict-origin", + "origin-when-cross-origin", + "strict-origin-when-cross-origin", + "unsafe-url" + ] + ); + var referrerPolicy = ( + /** @type {const} */ + [ + "", + ...referrerPolicyTokens + ] + ); + var referrerPolicyTokensSet = new Set(referrerPolicyTokens); + var requestRedirect = ( + /** @type {const} */ + ["follow", "manual", "error"] + ); + var safeMethods = ( + /** @type {const} */ + ["GET", "HEAD", "OPTIONS", "TRACE"] + ); + var safeMethodsSet = new Set(safeMethods); + var requestMode = ( + /** @type {const} */ + ["navigate", "same-origin", "no-cors", "cors"] + ); + var requestCredentials = ( + /** @type {const} */ + ["omit", "same-origin", "include"] + ); + var requestCache = ( + /** @type {const} */ + [ + "default", + "no-store", + "reload", + "no-cache", + "force-cache", + "only-if-cached" + ] + ); + var requestBodyHeader = ( + /** @type {const} */ + [ + "content-encoding", + "content-language", + "content-location", + "content-type", + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + "content-length" + ] + ); + var requestDuplex = ( + /** @type {const} */ + [ + "half" + ] + ); + var forbiddenMethods = ( + /** @type {const} */ + ["CONNECT", "TRACE", "TRACK"] + ); + var forbiddenMethodsSet = new Set(forbiddenMethods); + var subresource = ( + /** @type {const} */ + [ + "audio", + "audioworklet", + "font", + "image", + "manifest", + "paintworklet", + "script", + "style", + "track", + "video", + "xslt", + "" + ] + ); + var subresourceSet = new Set(subresource); + module.exports = { + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicyTokens: referrerPolicyTokensSet }; - module.exports = MockAgent; } }); -// node_modules/undici/lib/mock/snapshot-utils.js -var require_snapshot_utils = __commonJS({ - "node_modules/undici/lib/mock/snapshot-utils.js"(exports, module) { +// node_modules/undici/lib/web/fetch/global.js +var require_global = __commonJS({ + "node_modules/undici/lib/web/fetch/global.js"(exports, module) { "use strict"; - var { InvalidArgumentError } = require_errors(); - var { runtimeFeatures } = require_runtime_features(); - function createHeaderFilters(matchOptions = {}) { - const { ignoreHeaders = [], excludeHeaders = [], matchHeaders = [], caseSensitive = false } = matchOptions; - return { - ignore: new Set(ignoreHeaders.map((header) => caseSensitive ? header : header.toLowerCase())), - exclude: new Set(excludeHeaders.map((header) => caseSensitive ? header : header.toLowerCase())), - match: new Set(matchHeaders.map((header) => caseSensitive ? header : header.toLowerCase())) - }; - } - var crypto4 = runtimeFeatures.has("crypto") ? __require("crypto") : null; - var hashId = crypto4?.hash ? (value) => crypto4.hash("sha256", value, "base64url") : (value) => Buffer.from(value).toString("base64url"); - function isUndiciHeaders(headers) { - return Array.isArray(headers) && (headers.length & 1) === 0; - } - function isUrlExcludedFactory(excludePatterns = []) { - if (excludePatterns.length === 0) { - return () => false; - } - return function isUrlExcluded(url) { - let urlLowerCased; - for (const pattern of excludePatterns) { - if (typeof pattern === "string") { - if (!urlLowerCased) { - urlLowerCased = url.toLowerCase(); - } - if (urlLowerCased.includes(pattern.toLowerCase())) { - return true; - } - } else if (pattern instanceof RegExp) { - if (pattern.test(url)) { - return true; - } - } - } - return false; - }; + var globalOrigin = /* @__PURE__ */ Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; } - function normalizeHeaders3(headers) { - const normalizedHeaders = {}; - if (!headers) return normalizedHeaders; - if (isUndiciHeaders(headers)) { - for (let i = 0; i < headers.length; i += 2) { - const key = headers[i]; - const value = headers[i + 1]; - if (key && value !== void 0) { - const keyStr = Buffer.isBuffer(key) ? key.toString() : key; - const valueStr = Buffer.isBuffer(value) ? value.toString() : value; - normalizedHeaders[keyStr.toLowerCase()] = valueStr; - } - } - return normalizedHeaders; - } - if (headers && typeof headers === "object") { - for (const [key, value] of Object.entries(headers)) { - if (key && typeof key === "string") { - normalizedHeaders[key.toLowerCase()] = Array.isArray(value) ? value.join(", ") : String(value); - } - } + function setGlobalOrigin(newOrigin) { + if (newOrigin === void 0) { + Object.defineProperty(globalThis, globalOrigin, { + value: void 0, + writable: true, + enumerable: false, + configurable: false + }); + return; } - return normalizedHeaders; - } - var validSnapshotModes = ( - /** @type {const} */ - ["record", "playback", "update"] - ); - function validateSnapshotMode(mode) { - if (!validSnapshotModes.includes(mode)) { - throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(", ")}`); + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); } module.exports = { - createHeaderFilters, - hashId, - isUndiciHeaders, - normalizeHeaders: normalizeHeaders3, - isUrlExcludedFactory, - validateSnapshotMode + getGlobalOrigin, + setGlobalOrigin }; } }); -// node_modules/undici/lib/mock/snapshot-recorder.js -var require_snapshot_recorder = __commonJS({ - "node_modules/undici/lib/mock/snapshot-recorder.js"(exports, module) { +// node_modules/undici/lib/encoding/index.js +var require_encoding = __commonJS({ + "node_modules/undici/lib/encoding/index.js"(exports, module) { "use strict"; - var { writeFile: writeFile3, readFile: readFile2, mkdir: mkdir4 } = __require("fs/promises"); - var { dirname: dirname3, resolve } = __require("path"); - var { setTimeout: setTimeout2, clearTimeout: clearTimeout2 } = __require("timers"); - var { InvalidArgumentError, UndiciError } = require_errors(); - var { hashId, isUrlExcludedFactory, normalizeHeaders: normalizeHeaders3, createHeaderFilters } = require_snapshot_utils(); - function formatRequestKey(opts, headerFilters, matchOptions = {}) { - const url = new URL(opts.path, opts.origin); - const normalized = opts._normalizedHeaders || normalizeHeaders3(opts.headers); - if (!opts._normalizedHeaders) { - opts._normalizedHeaders = normalized; - } - return { - method: opts.method || "GET", - url: matchOptions.matchQuery !== false ? url.toString() : `${url.origin}${url.pathname}`, - headers: filterHeadersForMatching(normalized, headerFilters, matchOptions), - body: matchOptions.matchBody !== false && opts.body ? String(opts.body) : "" - }; - } - function filterHeadersForMatching(headers, headerFilters, matchOptions = {}) { - if (!headers || typeof headers !== "object") return {}; - const { - caseSensitive = false - } = matchOptions; - const filtered = {}; - const { ignore, exclude, match } = headerFilters; - for (const [key, value] of Object.entries(headers)) { - const headerKey = caseSensitive ? key : key.toLowerCase(); - if (exclude.has(headerKey)) continue; - if (ignore.has(headerKey)) continue; - if (match.size !== 0) { - if (!match.has(headerKey)) continue; - } - filtered[headerKey] = value; - } - return filtered; - } - function filterHeadersForStorage(headers, headerFilters, matchOptions = {}) { - if (!headers || typeof headers !== "object") return {}; - const { - caseSensitive = false - } = matchOptions; - const filtered = {}; - const { exclude: excludeSet } = headerFilters; - for (const [key, value] of Object.entries(headers)) { - const headerKey = caseSensitive ? key : key.toLowerCase(); - if (excludeSet.has(headerKey)) continue; - filtered[headerKey] = value; - } - return filtered; - } - function createRequestHash(formattedRequest) { - const parts = [ - formattedRequest.method, - formattedRequest.url - ]; - if (formattedRequest.headers && typeof formattedRequest.headers === "object") { - const headerKeys = Object.keys(formattedRequest.headers).sort(); - for (const key of headerKeys) { - const values = Array.isArray(formattedRequest.headers[key]) ? formattedRequest.headers[key] : [formattedRequest.headers[key]]; - parts.push(key); - for (const value of values.sort()) { - parts.push(String(value)); - } - } - } - parts.push(formattedRequest.body); - const content = parts.join("|"); - return hashId(content); - } - var SnapshotRecorder = class { - /** @type {NodeJS.Timeout | null} */ - #flushTimeout; - /** @type {import('./snapshot-utils').IsUrlExcluded} */ - #isUrlExcluded; - /** @type {Map} */ - #snapshots = /* @__PURE__ */ new Map(); - /** @type {string|undefined} */ - #snapshotPath; - /** @type {number} */ - #maxSnapshots = Infinity; - /** @type {boolean} */ - #autoFlush = false; - /** @type {import('./snapshot-utils').HeaderFilters} */ - #headerFilters; - /** - * Creates a new SnapshotRecorder instance - * @param {SnapshotRecorderOptions&SnapshotRecorderMatchOptions} [options={}] - Configuration options for the recorder - */ - constructor(options = {}) { - this.#snapshotPath = options.snapshotPath; - this.#maxSnapshots = options.maxSnapshots || Infinity; - this.#autoFlush = options.autoFlush || false; - this.flushInterval = options.flushInterval || 3e4; - this._flushTimer = null; - this.matchOptions = { - matchHeaders: options.matchHeaders || [], - // empty means match all headers - ignoreHeaders: options.ignoreHeaders || [], - excludeHeaders: options.excludeHeaders || [], - matchBody: options.matchBody !== false, - // default: true - matchQuery: options.matchQuery !== false, - // default: true - caseSensitive: options.caseSensitive || false - }; - this.#headerFilters = createHeaderFilters(this.matchOptions); - this.shouldRecord = options.shouldRecord || (() => true); - this.shouldPlayback = options.shouldPlayback || (() => true); - this.#isUrlExcluded = isUrlExcludedFactory(options.excludeUrls); - if (this.#autoFlush && this.#snapshotPath) { - this.#startAutoFlush(); - } - } - /** - * Records a request-response interaction - * @param {SnapshotRequestOptions} requestOpts - Request options - * @param {SnapshotEntryResponse} response - Response data to record - * @return {Promise} - Resolves when the recording is complete - */ - async record(requestOpts, response) { - if (!this.shouldRecord(requestOpts)) { - return; - } - if (this.isUrlExcluded(requestOpts)) { - return; - } - const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); - const hash3 = createRequestHash(request); - const normalizedHeaders = normalizeHeaders3(response.headers); - const responseData = { - statusCode: response.statusCode, - headers: filterHeadersForStorage(normalizedHeaders, this.#headerFilters, this.matchOptions), - body: Buffer.isBuffer(response.body) ? response.body.toString("base64") : Buffer.from(String(response.body || "")).toString("base64"), - trailers: response.trailers - }; - if (this.#snapshots.size >= this.#maxSnapshots && !this.#snapshots.has(hash3)) { - const oldestKey = this.#snapshots.keys().next().value; - this.#snapshots.delete(oldestKey); - } - const existingSnapshot = this.#snapshots.get(hash3); - if (existingSnapshot && existingSnapshot.responses) { - existingSnapshot.responses.push(responseData); - existingSnapshot.timestamp = (/* @__PURE__ */ new Date()).toISOString(); - } else { - this.#snapshots.set(hash3, { - request, - responses: [responseData], - // Always store as array for consistency - callCount: 0, - timestamp: (/* @__PURE__ */ new Date()).toISOString() - }); - } - if (this.#autoFlush && this.#snapshotPath) { - this.#scheduleFlush(); - } - } - /** - * Checks if a URL should be excluded from recording/playback - * @param {SnapshotRequestOptions} requestOpts - Request options to check - * @returns {boolean} - True if URL is excluded - */ - isUrlExcluded(requestOpts) { - const url = new URL(requestOpts.path, requestOpts.origin).toString(); - return this.#isUrlExcluded(url); - } - /** - * Finds a matching snapshot for the given request - * Returns the appropriate response based on call count for sequential responses - * - * @param {SnapshotRequestOptions} requestOpts - Request options to match - * @returns {SnapshotEntry&Record<'response', SnapshotEntryResponse>|undefined} - Matching snapshot response or undefined if not found - */ - findSnapshot(requestOpts) { - if (!this.shouldPlayback(requestOpts)) { - return void 0; - } - if (this.isUrlExcluded(requestOpts)) { - return void 0; - } - const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); - const hash3 = createRequestHash(request); - const snapshot = this.#snapshots.get(hash3); - if (!snapshot) return void 0; - const currentCallCount = snapshot.callCount || 0; - const responseIndex = Math.min(currentCallCount, snapshot.responses.length - 1); - snapshot.callCount = currentCallCount + 1; - return { - ...snapshot, - response: snapshot.responses[responseIndex] - }; - } - /** - * Loads snapshots from file - * @param {string} [filePath] - Optional file path to load snapshots from - * @return {Promise} - Resolves when snapshots are loaded - */ - async loadSnapshots(filePath) { - const path = filePath || this.#snapshotPath; - if (!path) { - throw new InvalidArgumentError("Snapshot path is required"); - } - try { - const data = await readFile2(resolve(path), "utf8"); - const parsed = JSON.parse(data); - if (Array.isArray(parsed)) { - this.#snapshots.clear(); - for (const { hash: hash3, snapshot } of parsed) { - this.#snapshots.set(hash3, snapshot); - } - } else { - this.#snapshots = new Map(Object.entries(parsed)); - } - } catch (error) { - if (error.code === "ENOENT") { - this.#snapshots.clear(); - } else { - throw new UndiciError(`Failed to load snapshots from ${path}`, { cause: error }); - } - } - } - /** - * Saves snapshots to file - * - * @param {string} [filePath] - Optional file path to save snapshots - * @returns {Promise} - Resolves when snapshots are saved - */ - async saveSnapshots(filePath) { - const path = filePath || this.#snapshotPath; - if (!path) { - throw new InvalidArgumentError("Snapshot path is required"); - } - const resolvedPath = resolve(path); - await mkdir4(dirname3(resolvedPath), { recursive: true }); - const data = Array.from(this.#snapshots.entries()).map(([hash3, snapshot]) => ({ - hash: hash3, - snapshot - })); - await writeFile3(resolvedPath, JSON.stringify(data, null, 2), { flush: true }); - } - /** - * Clears all recorded snapshots - * @returns {void} - */ - clear() { - this.#snapshots.clear(); - } - /** - * Gets all recorded snapshots - * @return {Array} - Array of all recorded snapshots - */ - getSnapshots() { - return Array.from(this.#snapshots.values()); - } - /** - * Gets snapshot count - * @return {number} - Number of recorded snapshots - */ - size() { - return this.#snapshots.size; - } - /** - * Resets call counts for all snapshots (useful for test cleanup) - * @returns {void} - */ - resetCallCounts() { - for (const snapshot of this.#snapshots.values()) { - snapshot.callCount = 0; - } - } - /** - * Deletes a specific snapshot by request options - * @param {SnapshotRequestOptions} requestOpts - Request options to match - * @returns {boolean} - True if snapshot was deleted, false if not found - */ - deleteSnapshot(requestOpts) { - const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); - const hash3 = createRequestHash(request); - return this.#snapshots.delete(hash3); - } - /** - * Gets information about a specific snapshot - * @param {SnapshotRequestOptions} requestOpts - Request options to match - * @returns {SnapshotInfo|null} - Snapshot information or null if not found - */ - getSnapshotInfo(requestOpts) { - const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); - const hash3 = createRequestHash(request); - const snapshot = this.#snapshots.get(hash3); - if (!snapshot) return null; - return { - hash: hash3, - request: snapshot.request, - responseCount: snapshot.responses ? snapshot.responses.length : snapshot.response ? 1 : 0, - // .response for legacy snapshots - callCount: snapshot.callCount || 0, - timestamp: snapshot.timestamp - }; - } - /** - * Replaces all snapshots with new data (full replacement) - * @param {Array<{hash: string; snapshot: SnapshotEntry}>|Record} snapshotData - New snapshot data to replace existing ones - * @returns {void} - */ - replaceSnapshots(snapshotData) { - this.#snapshots.clear(); - if (Array.isArray(snapshotData)) { - for (const { hash: hash3, snapshot } of snapshotData) { - this.#snapshots.set(hash3, snapshot); - } - } else if (snapshotData && typeof snapshotData === "object") { - this.#snapshots = new Map(Object.entries(snapshotData)); - } - } - /** - * Starts the auto-flush timer - * @returns {void} - */ - #startAutoFlush() { - return this.#scheduleFlush(); - } - /** - * Stops the auto-flush timer - * @returns {void} - */ - #stopAutoFlush() { - if (this.#flushTimeout) { - clearTimeout2(this.#flushTimeout); - this.saveSnapshots().catch(() => { - }); - this.#flushTimeout = null; - } - } - /** - * Schedules a flush (debounced to avoid excessive writes) - */ - #scheduleFlush() { - this.#flushTimeout = setTimeout2(() => { - this.saveSnapshots().catch(() => { - }); - if (this.#autoFlush) { - this.#flushTimeout?.refresh(); - } else { - this.#flushTimeout = null; - } - }, 1e3); - } - /** - * Cleanup method to stop timers - * @returns {void} - */ - destroy() { - this.#stopAutoFlush(); - if (this.#flushTimeout) { - clearTimeout2(this.#flushTimeout); - this.#flushTimeout = null; - } + var textDecoder = new TextDecoder(); + function utf8DecodeBytes(buffer2) { + if (buffer2.length === 0) { + return ""; } - /** - * Async close method that saves all recordings and performs cleanup - * @returns {Promise} - */ - async close() { - if (this.#snapshotPath && this.#snapshots.size !== 0) { - await this.saveSnapshots(); - } - this.destroy(); + if (buffer2[0] === 239 && buffer2[1] === 187 && buffer2[2] === 191) { + buffer2 = buffer2.subarray(3); } + const output = textDecoder.decode(buffer2); + return output; + } + module.exports = { + utf8DecodeBytes }; - module.exports = { SnapshotRecorder, formatRequestKey, createRequestHash, filterHeadersForMatching, filterHeadersForStorage, createHeaderFilters }; } }); -// node_modules/undici/lib/mock/snapshot-agent.js -var require_snapshot_agent = __commonJS({ - "node_modules/undici/lib/mock/snapshot-agent.js"(exports, module) { +// node_modules/undici/lib/web/infra/index.js +var require_infra = __commonJS({ + "node_modules/undici/lib/web/infra/index.js"(exports, module) { "use strict"; - var Agent = require_agent(); - var MockAgent = require_mock_agent(); - var { SnapshotRecorder } = require_snapshot_recorder(); - var { InvalidArgumentError, UndiciError } = require_errors(); - var util2 = require_util(); - var { validateSnapshotMode } = require_snapshot_utils(); - var kSnapshotRecorder = /* @__PURE__ */ Symbol("kSnapshotRecorder"); - var kSnapshotMode = /* @__PURE__ */ Symbol("kSnapshotMode"); - var kSnapshotPath = /* @__PURE__ */ Symbol("kSnapshotPath"); - var kSnapshotLoaded = /* @__PURE__ */ Symbol("kSnapshotLoaded"); - var kRealAgent = /* @__PURE__ */ Symbol("kRealAgent"); - var warningEmitted = false; - var SnapshotAgent = class extends MockAgent { - constructor(opts = {}) { - if (!warningEmitted) { - process.emitWarning( - "SnapshotAgent is experimental and subject to change", - "ExperimentalWarning" - ); - warningEmitted = true; - } - const { - mode = "record", - snapshotPath = null, - ...mockAgentOpts - } = opts; - super(mockAgentOpts); - validateSnapshotMode(mode); - if ((mode === "playback" || mode === "update") && !snapshotPath) { - throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`); - } - this[kSnapshotMode] = mode; - this[kSnapshotPath] = snapshotPath; - this[kSnapshotRecorder] = new SnapshotRecorder({ - snapshotPath: this[kSnapshotPath], - mode: this[kSnapshotMode], - maxSnapshots: opts.maxSnapshots, - autoFlush: opts.autoFlush, - flushInterval: opts.flushInterval, - matchHeaders: opts.matchHeaders, - ignoreHeaders: opts.ignoreHeaders, - excludeHeaders: opts.excludeHeaders, - matchBody: opts.matchBody, - matchQuery: opts.matchQuery, - caseSensitive: opts.caseSensitive, - shouldRecord: opts.shouldRecord, - shouldPlayback: opts.shouldPlayback, - excludeUrls: opts.excludeUrls - }); - this[kSnapshotLoaded] = false; - if (this[kSnapshotMode] === "record" || this[kSnapshotMode] === "update" || this[kSnapshotMode] === "playback" && opts.excludeUrls && opts.excludeUrls.length > 0) { - this[kRealAgent] = new Agent(opts); - } - if ((this[kSnapshotMode] === "playback" || this[kSnapshotMode] === "update") && this[kSnapshotPath]) { - this.loadSnapshots().catch(() => { - }); - } - } - dispatch(opts, handler) { - const mode = this[kSnapshotMode]; - if (this[kSnapshotRecorder].isUrlExcluded(opts)) { - return this[kRealAgent].dispatch(opts, handler); - } - if (mode === "playback" || mode === "update") { - if (!this[kSnapshotLoaded]) { - return this.#asyncDispatch(opts, handler); - } - const snapshot = this[kSnapshotRecorder].findSnapshot(opts); - if (snapshot) { - return this.#replaySnapshot(snapshot, handler); - } else if (mode === "update") { - return this.#recordAndReplay(opts, handler); - } else { - const error = new UndiciError(`No snapshot found for ${opts.method || "GET"} ${opts.path}`); - if (handler.onResponseError) { - handler.onResponseError(null, error); - return; - } - throw error; - } - } else if (mode === "record") { - return this.#recordAndReplay(opts, handler); - } + var assert8 = __require("assert"); + var { utf8DecodeBytes } = require_encoding(); + function collectASequenceOfCodePoints(condition, input, position) { + let result = ""; + while (position.position < input.length && condition(input[position.position])) { + result += input[position.position]; + position.position++; } - /** - * Async version of dispatch for when we need to load snapshots first - */ - async #asyncDispatch(opts, handler) { - await this.loadSnapshots(); - return this.dispatch(opts, handler); + return result; + } + function collectASequenceOfCodePointsFast(char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; + if (idx === -1) { + position.position = input.length; + return input.slice(start); } - /** - * Records a real request and replays the response - */ - #recordAndReplay(opts, handler) { - const responseData = { - statusCode: null, - headers: {}, - trailers: {}, - body: [] - }; - const self = this; - const recordingHandler = { - onRequestStart(controller, context) { - return handler.onRequestStart(controller, { ...context, history: this.history }); - }, - onRequestUpgrade(controller, statusCode, headers, socket) { - return handler.onRequestUpgrade(controller, statusCode, headers, socket); - }, - onResponseStart(controller, statusCode, headers, statusMessage) { - responseData.statusCode = statusCode; - responseData.headers = headers; - return handler.onResponseStart(controller, statusCode, headers, statusMessage); - }, - onResponseData(controller, chunk) { - responseData.body.push(chunk); - return handler.onResponseData(controller, chunk); - }, - onResponseEnd(controller, trailers) { - responseData.trailers = trailers; - const responseBody = Buffer.concat(responseData.body); - self[kSnapshotRecorder].record(opts, { - statusCode: responseData.statusCode, - headers: responseData.headers, - body: responseBody, - trailers: responseData.trailers - }).then(() => handler.onResponseEnd(controller, trailers)).catch((error) => handler.onResponseError(controller, error)); - }, - onResponseError(controller, error) { - return handler.onResponseError(controller, error); + position.position = idx; + return input.slice(start, position.position); + } + var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; + function forgivingBase64(data) { + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ""); + let dataLength = data.length; + if (dataLength % 4 === 0) { + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; } - }; - const agent = this[kRealAgent]; - return agent.dispatch(opts, recordingHandler); - } - /** - * Replays a recorded response - * - * @param {Object} snapshot - The recorded snapshot to replay. - * @param {Object} handler - The handler to call with the response data. - * @returns {void} - */ - #replaySnapshot(snapshot, handler) { - try { - const { response } = snapshot; - const rawHeaders = response.headers ? util2.toRawHeaders(response.headers) : []; - const rawTrailers = response.trailers ? util2.toRawHeaders(response.trailers) : []; - const controller = { - rawHeaders, - rawTrailers, - pause() { - }, - resume() { - }, - abort(reason) { - this.aborted = true; - this.reason = reason; - }, - aborted: false, - paused: false - }; - handler.onRequestStart(controller); - handler.onResponseStart(controller, response.statusCode, response.headers, response.statusMessage); - const body = Buffer.from(response.body, "base64"); - handler.onResponseData(controller, body); - handler.onResponseEnd(controller, response.trailers); - } catch (error) { - handler.onResponseError?.(null, error); - } - } - /** - * Loads snapshots from file - * - * @param {string} [filePath] - Optional file path to load snapshots from. - * @returns {Promise} - Resolves when snapshots are loaded. - */ - async loadSnapshots(filePath) { - await this[kSnapshotRecorder].loadSnapshots(filePath || this[kSnapshotPath]); - this[kSnapshotLoaded] = true; - if (this[kSnapshotMode] === "playback") { - this.#setupMockInterceptors(); - } - } - /** - * Saves snapshots to file - * - * @param {string} [filePath] - Optional file path to save snapshots to. - * @returns {Promise} - Resolves when snapshots are saved. - */ - async saveSnapshots(filePath) { - return this[kSnapshotRecorder].saveSnapshots(filePath || this[kSnapshotPath]); - } - /** - * Sets up MockAgent interceptors based on recorded snapshots. - * - * This method creates MockAgent interceptors for each recorded snapshot, - * allowing the SnapshotAgent to fall back to MockAgent's standard intercept - * mechanism in playback mode. Each interceptor is configured to persist - * (remain active for multiple requests) and responds with the recorded - * response data. - * - * Called automatically when loading snapshots in playback mode. - * - * @returns {void} - */ - #setupMockInterceptors() { - for (const snapshot of this[kSnapshotRecorder].getSnapshots()) { - const { request, responses, response } = snapshot; - const url = new URL(request.url); - const mockPool = this.get(url.origin); - const responseData = responses ? responses[0] : response; - if (!responseData) continue; - mockPool.intercept({ - path: url.pathname + url.search, - method: request.method, - headers: request.headers, - body: request.body - }).reply(responseData.statusCode, responseData.body, { - headers: responseData.headers, - trailers: responseData.trailers - }).persist(); } } - /** - * Gets the snapshot recorder - * @return {SnapshotRecorder} - The snapshot recorder instance - */ - getRecorder() { - return this[kSnapshotRecorder]; - } - /** - * Gets the current mode - * @return {import('./snapshot-utils').SnapshotMode} - The current snapshot mode - */ - getMode() { - return this[kSnapshotMode]; - } - /** - * Clears all snapshots - * @returns {void} - */ - clearSnapshots() { - this[kSnapshotRecorder].clear(); + if (dataLength % 4 === 1) { + return "failure"; } - /** - * Resets call counts for all snapshots (useful for test cleanup) - * @returns {void} - */ - resetCallCounts() { - this[kSnapshotRecorder].resetCallCounts(); + if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { + return "failure"; } - /** - * Deletes a specific snapshot by request options - * @param {import('./snapshot-recorder').SnapshotRequestOptions} requestOpts - Request options to identify the snapshot - * @return {Promise} - Returns true if the snapshot was deleted, false if not found - */ - deleteSnapshot(requestOpts) { - return this[kSnapshotRecorder].deleteSnapshot(requestOpts); + const buffer2 = Buffer.from(data, "base64"); + return new Uint8Array(buffer2.buffer, buffer2.byteOffset, buffer2.byteLength); + } + function isASCIIWhitespace(char) { + return char === 9 || // \t + char === 10 || // \n + char === 12 || // \f + char === 13 || // \r + char === 32; + } + function isomorphicDecode(input) { + const length = input.length; + if ((2 << 15) - 1 > length) { + return String.fromCharCode.apply(null, input); } - /** - * Gets information about a specific snapshot - * @returns {import('./snapshot-recorder').SnapshotInfo|null} - Snapshot information or null if not found - */ - getSnapshotInfo(requestOpts) { - return this[kSnapshotRecorder].getSnapshotInfo(requestOpts); + let result = ""; + let i = 0; + let addition = (2 << 15) - 1; + while (i < length) { + if (i + addition > length) { + addition = length - i; + } + result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); } - /** - * Replaces all snapshots with new data (full replacement) - * @param {Array<{hash: string; snapshot: import('./snapshot-recorder').SnapshotEntryshotEntry}>|Record} snapshotData - New snapshot data to replace existing snapshots - * @returns {void} - */ - replaceSnapshots(snapshotData) { - this[kSnapshotRecorder].replaceSnapshots(snapshotData); + return result; + } + var invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; + function isomorphicEncode(input) { + assert8(!invalidIsomorphicEncodeValueRegex.test(input)); + return input; + } + function parseJSONFromBytes(bytes) { + return JSON.parse(utf8DecodeBytes(bytes)); + } + function removeASCIIWhitespace(str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isASCIIWhitespace); + } + function removeChars(str, leading, trailing, predicate) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; } - /** - * Closes the agent, saving snapshots and cleaning up resources. - * - * @returns {Promise} - */ - async close() { - await this[kSnapshotRecorder].close(); - await this[kRealAgent]?.close(); - await super.close(); + if (trailing) { + while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; } - }; - module.exports = SnapshotAgent; - } -}); - -// node_modules/undici/lib/global.js -var require_global2 = __commonJS({ - "node_modules/undici/lib/global.js"(exports, module) { - "use strict"; - var globalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.2"); - var legacyGlobalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.1"); - var { InvalidArgumentError } = require_errors(); - var Agent = require_agent(); - var Dispatcher1Wrapper = require_dispatcher1_wrapper(); - if (getGlobalDispatcher() === void 0) { - setGlobalDispatcher(new Agent()); + return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); } - function setGlobalDispatcher(agent) { - if (!agent || typeof agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument agent must implement Agent"); + function serializeJavascriptValueToJSONString(value) { + const result = JSON.stringify(value); + if (result === void 0) { + throw new TypeError("Value is not JSON serializable"); } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }); - const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent); - Object.defineProperty(globalThis, legacyGlobalDispatcher, { - value: legacyAgent, - writable: true, - enumerable: false, - configurable: false - }); - } - function getGlobalDispatcher() { - return globalThis[globalDispatcher]; + assert8(typeof result === "string"); + return result; } - var installedExports = ( - /** @type {const} */ - [ - "fetch", - "Headers", - "Response", - "Request", - "FormData", - "WebSocket", - "CloseEvent", - "ErrorEvent", - "MessageEvent", - "EventSource" - ] - ); module.exports = { - setGlobalDispatcher, - getGlobalDispatcher, - installedExports + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + forgivingBase64, + isASCIIWhitespace, + isomorphicDecode, + isomorphicEncode, + parseJSONFromBytes, + removeASCIIWhitespace, + removeChars, + serializeJavascriptValueToJSONString }; } }); -// node_modules/undici/lib/handler/decorator-handler.js -var require_decorator_handler = __commonJS({ - "node_modules/undici/lib/handler/decorator-handler.js"(exports, module) { +// node_modules/undici/lib/web/fetch/data-url.js +var require_data_url = __commonJS({ + "node_modules/undici/lib/web/fetch/data-url.js"(exports, module) { "use strict"; var assert8 = __require("assert"); - module.exports = class DecoratorHandler { - #handler; - #onCompleteCalled = false; - #onErrorCalled = false; - #onResponseStartCalled = false; - constructor(handler) { - if (typeof handler !== "object" || handler === null) { - throw new TypeError("handler must be an object"); - } - this.#handler = handler; - } - onRequestStart(...args) { - this.#handler.onRequestStart?.(...args); - } - onRequestUpgrade(...args) { - assert8(!this.#onCompleteCalled); - assert8(!this.#onErrorCalled); - return this.#handler.onRequestUpgrade?.(...args); + var { forgivingBase64, collectASequenceOfCodePoints, collectASequenceOfCodePointsFast, isomorphicDecode, removeASCIIWhitespace, removeChars } = require_infra(); + var encoder5 = new TextEncoder(); + var HTTP_TOKEN_CODEPOINTS = /^[-!#$%&'*+.^_|~A-Za-z0-9]+$/u; + var HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/u; + var HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/u; + function dataURLProcessor(dataURL) { + assert8(dataURL.protocol === "data:"); + let input = URLSerializer(dataURL, true); + input = input.slice(5); + const position = { position: 0 }; + let mimeType = collectASequenceOfCodePointsFast( + ",", + input, + position + ); + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); + if (position.position >= input.length) { + return "failure"; } - onResponseStart(...args) { - assert8(!this.#onCompleteCalled); - assert8(!this.#onErrorCalled); - assert8(!this.#onResponseStartCalled); - this.#onResponseStartCalled = true; - return this.#handler.onResponseStart?.(...args); + position.position++; + const encodedBody = input.slice(mimeTypeLength + 1); + let body = stringPercentDecode(encodedBody); + if (/;(?:\u0020*)base64$/ui.test(mimeType)) { + const stringBody = isomorphicDecode(body); + body = forgivingBase64(stringBody); + if (body === "failure") { + return "failure"; + } + mimeType = mimeType.slice(0, -6); + mimeType = mimeType.replace(/(\u0020+)$/u, ""); + mimeType = mimeType.slice(0, -1); } - onResponseData(...args) { - assert8(!this.#onCompleteCalled); - assert8(!this.#onErrorCalled); - return this.#handler.onResponseData?.(...args); + if (mimeType.startsWith(";")) { + mimeType = "text/plain" + mimeType; } - onResponseEnd(...args) { - assert8(!this.#onCompleteCalled); - assert8(!this.#onErrorCalled); - this.#onCompleteCalled = true; - return this.#handler.onResponseEnd?.(...args); + let mimeTypeRecord = parseMIMEType(mimeType); + if (mimeTypeRecord === "failure") { + mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); } - onResponseError(...args) { - this.#onErrorCalled = true; - return this.#handler.onResponseError?.(...args); + return { mimeType: mimeTypeRecord, body }; + } + function URLSerializer(url, excludeFragment = false) { + if (!excludeFragment) { + return url.href; } - /** - * @deprecated - */ - onBodySent() { + const href = url.href; + const hashLength = url.hash.length; + const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); + if (!hashLength && href.endsWith("#")) { + return serialized.slice(0, -1); } - }; - } -}); - -// node_modules/undici/lib/handler/redirect-handler.js -var require_redirect_handler = __commonJS({ - "node_modules/undici/lib/handler/redirect-handler.js"(exports, module) { - "use strict"; - var util2 = require_util(); - var assert8 = __require("assert"); - var { InvalidArgumentError } = require_errors(); - var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var noop = () => { - }; - var RedirectHandler = class _RedirectHandler { - static buildDispatch(dispatcher, maxRedirections) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + return serialized; + } + function stringPercentDecode(input) { + const bytes = encoder5.encode(input); + return percentDecode(bytes); + } + function isHexCharByte(byte) { + return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102; + } + function hexByteToNumber(byte) { + return ( + // 0-9 + byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55 + ); + } + function percentDecode(input) { + const length = input.length; + const output = new Uint8Array(length); + let j = 0; + let i = 0; + while (i < length) { + const byte = input[i]; + if (byte !== 37) { + output[j++] = byte; + } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) { + output[j++] = 37; + } else { + output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]); + i += 2; } - const dispatch = dispatcher.dispatch.bind(dispatcher); - return (opts, originalHandler) => dispatch(opts, new _RedirectHandler(dispatch, maxRedirections, opts, originalHandler)); + ++i; } - constructor(dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - this.dispatch = dispatch; - this.location = null; - const { maxRedirections: _, ...cleanOpts } = opts; - this.opts = cleanOpts; - this.opts.body = util2.wrapRequestBody(this.opts.body); - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; + return length === j ? output : output.subarray(0, j); + } + function parseMIMEType(input) { + input = removeHTTPWhitespace(input, true, true); + const position = { position: 0 }; + const type = collectASequenceOfCodePointsFast( + "/", + input, + position + ); + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return "failure"; } - onRequestStart(controller, context) { - this.handler.onRequestStart?.(controller, { ...context, history: this.history }); + if (position.position >= input.length) { + return "failure"; } - onRequestUpgrade(controller, statusCode, headers, socket) { - this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket); + position.position++; + let subtype = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + subtype = removeHTTPWhitespace(subtype, false, true); + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return "failure"; } - onResponseStart(controller, statusCode, headers, statusMessage) { - if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { - throw new Error("max redirects"); - } - if ((statusCode === 301 || statusCode === 302) && this.opts.method === "POST") { - this.opts.method = "GET"; - if (util2.isStream(this.opts.body)) { - util2.destroy(this.opts.body.on("error", noop)); - } - this.opts.body = null; - } - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - if (util2.isStream(this.opts.body)) { - util2.destroy(this.opts.body.on("error", noop)); + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: /* @__PURE__ */ new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; + while (position.position < input.length) { + position.position++; + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + (char) => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ";" && char !== "=", + input, + position + ); + parameterName = parameterName.toLowerCase(); + if (position.position < input.length) { + if (input[position.position] === ";") { + continue; } - this.opts.body = null; - } - this.location = this.history.length >= this.maxRedirections || util2.isDisturbed(this.opts.body) || redirectableStatusCodes.indexOf(statusCode) === -1 ? null : headers.location; - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); + position.position++; } - if (!this.location) { - this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); - return; + if (position.position >= input.length) { + break; } - const { origin, pathname, search } = util2.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; - const redirectUrlString = `${origin}${path}`; - for (const historyUrl of this.history) { - if (historyUrl.toString() === redirectUrlString) { - throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`); + let parameterValue = null; + if (input[position.position] === '"') { + parameterValue = collectAnHTTPQuotedString(input, position, true); + collectASequenceOfCodePointsFast( + ";", + input, + position + ); + } else { + parameterValue = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + if (parameterValue.length === 0) { + continue; } } - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.query = null; - } - onResponseData(controller, chunk) { - if (this.location) { - } else { - this.handler.onResponseData?.(controller, chunk); + if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { + mimeType.parameters.set(parameterName, parameterValue); } } - onResponseEnd(controller, trailers) { - if (this.location) { - this.dispatch(this.opts, this); + return mimeType; + } + function collectAnHTTPQuotedString(input, position, extractValue = false) { + const positionStart = position.position; + let value = ""; + assert8(input[position.position] === '"'); + position.position++; + while (true) { + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== "\\", + input, + position + ); + if (position.position >= input.length) { + break; + } + const quoteOrBackslash = input[position.position]; + position.position++; + if (quoteOrBackslash === "\\") { + if (position.position >= input.length) { + value += "\\"; + break; + } + value += input[position.position]; + position.position++; } else { - this.handler.onResponseEnd(controller, trailers); + assert8(quoteOrBackslash === '"'); + break; } } - onResponseError(controller, error) { - this.handler.onResponseError?.(controller, error); + if (extractValue) { + return value; } - }; - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util2.headerNameToString(header) === "host"; + return input.slice(positionStart, position.position); + } + function serializeAMimeType(mimeType) { + assert8(mimeType !== "failure"); + const { parameters, essence } = mimeType; + let serialization = essence; + for (let [name, value] of parameters.entries()) { + serialization += ";"; + serialization += name; + serialization += "="; + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + value = value.replace(/[\\"]/ug, "\\$&"); + value = '"' + value; + value += '"'; + } + serialization += value; } - if (removeContent && util2.headerNameToString(header).startsWith("content-")) { - return true; + return serialization; + } + function isHTTPWhiteSpace(char) { + return char === 13 || char === 10 || char === 9 || char === 32; + } + function removeHTTPWhitespace(str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isHTTPWhiteSpace); + } + function minimizeSupportedMimeType(mimeType) { + switch (mimeType.essence) { + case "application/ecmascript": + case "application/javascript": + case "application/x-ecmascript": + case "application/x-javascript": + case "text/ecmascript": + case "text/javascript": + case "text/javascript1.0": + case "text/javascript1.1": + case "text/javascript1.2": + case "text/javascript1.3": + case "text/javascript1.4": + case "text/javascript1.5": + case "text/jscript": + case "text/livescript": + case "text/x-ecmascript": + case "text/x-javascript": + return "text/javascript"; + case "application/json": + case "text/json": + return "application/json"; + case "image/svg+xml": + return "image/svg+xml"; + case "text/xml": + case "application/xml": + return "application/xml"; } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util2.headerNameToString(header); - return name === "authorization" || name === "cookie" || name === "proxy-authorization"; + if (mimeType.subtype.endsWith("+json")) { + return "application/json"; } - return false; - } - function cleanRequestHeaders(headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); - } - } - } else if (headers && typeof headers === "object") { - const entries = util2.hasSafeIterator(headers) ? headers : Object.entries(headers); - for (const [key, value] of entries) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, value); - } - } - } else { - assert8(headers == null, "headers must be an object or an array"); + if (mimeType.subtype.endsWith("+xml")) { + return "application/xml"; } - return ret; + return ""; } - module.exports = RedirectHandler; + module.exports = { + dataURLProcessor, + URLSerializer, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType, + removeHTTPWhitespace, + minimizeSupportedMimeType, + HTTP_TOKEN_CODEPOINTS + }; } }); -// node_modules/undici/lib/interceptor/redirect.js -var require_redirect = __commonJS({ - "node_modules/undici/lib/interceptor/redirect.js"(exports, module) { +// node_modules/undici/lib/web/webidl/index.js +var require_webidl = __commonJS({ + "node_modules/undici/lib/web/webidl/index.js"(exports, module) { "use strict"; - var RedirectHandler = require_redirect_handler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections } = {}) { - return (dispatch) => { - return function Intercept(opts, handler) { - const { maxRedirections = defaultMaxRedirections, ...rest } = opts; - if (maxRedirections == null || maxRedirections === 0) { - return dispatch(opts, handler); - } - const dispatchOpts = { ...rest }; - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler); - return dispatch(dispatchOpts, redirectHandler); - }; + var assert8 = __require("assert"); + var { types, inspect } = __require("util"); + var { markAsUncloneable } = __require("worker_threads"); + var UNDEFINED = 1; + var BOOLEAN = 2; + var STRING = 3; + var SYMBOL = 4; + var NUMBER = 5; + var BIGINT = 6; + var NULL = 7; + var OBJECT = 8; + var FunctionPrototypeSymbolHasInstance = Function.call.bind(Function.prototype[Symbol.hasInstance]); + var webidl = { + converters: {}, + util: {}, + errors: {}, + is: {} + }; + webidl.errors.exception = function(message) { + return new TypeError(`${message.header}: ${message.message}`); + }; + webidl.errors.conversionFailed = function(opts) { + const plural = opts.types.length === 1 ? "" : " one of"; + const message = `${opts.argument} could not be converted to${plural}: ${opts.types.join(", ")}.`; + return webidl.errors.exception({ + header: opts.prefix, + message + }); + }; + webidl.errors.invalidArgument = function(context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` + }); + }; + webidl.brandCheck = function(V, I) { + if (!FunctionPrototypeSymbolHasInstance(I, V)) { + const err = new TypeError("Illegal invocation"); + err.code = "ERR_INVALID_THIS"; + throw err; + } + }; + webidl.brandCheckMultiple = function(List) { + const prototypes = List.map((c2) => webidl.util.MakeTypeAssertion(c2)); + return (V) => { + if (prototypes.every((typeCheck) => !typeCheck(V))) { + const err = new TypeError("Illegal invocation"); + err.code = "ERR_INVALID_THIS"; + throw err; + } }; - } - module.exports = createRedirectInterceptor; - } -}); - -// node_modules/undici/lib/interceptor/response-error.js -var require_response_error = __commonJS({ - "node_modules/undici/lib/interceptor/response-error.js"(exports, module) { - "use strict"; - var DecoratorHandler = require_decorator_handler(); - var { ResponseError } = require_errors(); - var ResponseErrorHandler = class extends DecoratorHandler { - #statusCode; - #contentType; - #decoder; - #headers; - #body; - constructor(_opts, { handler }) { - super(handler); + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, + header: ctx + }); } - #checkContentType(contentType) { - return (this.#contentType ?? "").indexOf(contentType) === 0; + }; + webidl.illegalConstructor = function() { + throw webidl.errors.exception({ + header: "TypeError", + message: "Illegal constructor" + }); + }; + webidl.util.MakeTypeAssertion = function(I) { + return (O) => FunctionPrototypeSymbolHasInstance(I, O); + }; + webidl.util.Type = function(V) { + switch (typeof V) { + case "undefined": + return UNDEFINED; + case "boolean": + return BOOLEAN; + case "string": + return STRING; + case "symbol": + return SYMBOL; + case "number": + return NUMBER; + case "bigint": + return BIGINT; + case "function": + case "object": { + if (V === null) { + return NULL; + } + return OBJECT; + } } - onRequestStart(controller, context) { - this.#statusCode = 0; - this.#contentType = null; - this.#decoder = null; - this.#headers = null; - this.#body = ""; - return super.onRequestStart(controller, context); + }; + webidl.util.Types = { + UNDEFINED, + BOOLEAN, + STRING, + SYMBOL, + NUMBER, + BIGINT, + NULL, + OBJECT + }; + webidl.util.TypeValueToString = function(o3) { + switch (webidl.util.Type(o3)) { + case UNDEFINED: + return "Undefined"; + case BOOLEAN: + return "Boolean"; + case STRING: + return "String"; + case SYMBOL: + return "Symbol"; + case NUMBER: + return "Number"; + case BIGINT: + return "BigInt"; + case NULL: + return "Null"; + case OBJECT: + return "Object"; } - onResponseStart(controller, statusCode, headers, statusMessage) { - this.#statusCode = statusCode; - this.#headers = headers; - this.#contentType = headers["content-type"]; - if (this.#statusCode < 400) { - return super.onResponseStart(controller, statusCode, headers, statusMessage); + }; + webidl.util.markAsUncloneable = markAsUncloneable; + webidl.util.ConvertToInt = function(V, bitLength, signedness, flags) { + let upperBound; + let lowerBound; + if (bitLength === 64) { + upperBound = Math.pow(2, 53) - 1; + if (signedness === "unsigned") { + lowerBound = 0; + } else { + lowerBound = Math.pow(-2, 53) + 1; } - if (this.#checkContentType("application/json") || this.#checkContentType("text/plain")) { - this.#decoder = new TextDecoder("utf-8"); + } else if (signedness === "unsigned") { + lowerBound = 0; + upperBound = Math.pow(2, bitLength) - 1; + } else { + lowerBound = Math.pow(-2, bitLength) - 1; + upperBound = Math.pow(2, bitLength - 1) - 1; + } + let x = Number(V); + if (x === 0) { + x = 0; + } + if (webidl.util.HasFlag(flags, webidl.attributes.EnforceRange)) { + if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` + }); } - } - onResponseData(controller, chunk) { - if (this.#statusCode < 400) { - return super.onResponseData(controller, chunk); + x = webidl.util.IntegerPart(x); + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }); } - this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? ""; + return x; } - onResponseEnd(controller, trailers) { - if (this.#statusCode >= 400) { - this.#body += this.#decoder?.decode(void 0, { stream: false }) ?? ""; - if (this.#checkContentType("application/json")) { - try { - this.#body = JSON.parse(this.#body); - } catch { - } - } - let err; - const stackTraceLimit = Error.stackTraceLimit; - Error.stackTraceLimit = 0; - try { - err = new ResponseError("Response Error", this.#statusCode, { - body: this.#body, - headers: this.#headers - }); - } finally { - Error.stackTraceLimit = stackTraceLimit; - } - super.onResponseError(controller, err); + if (!Number.isNaN(x) && webidl.util.HasFlag(flags, webidl.attributes.Clamp)) { + x = Math.min(Math.max(x, lowerBound), upperBound); + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x); } else { - super.onResponseEnd(controller, trailers); + x = Math.ceil(x); } + return x; } - onResponseError(controller, err) { - super.onResponseError(controller, err); + if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + return 0; } + x = webidl.util.IntegerPart(x); + x = x % Math.pow(2, bitLength); + if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength); + } + return x; }; - module.exports = () => { - return (dispatch) => { - return function Intercept(opts, handler) { - return dispatch(opts, new ResponseErrorHandler(opts, { handler })); - }; - }; - }; - } -}); - -// node_modules/undici/lib/interceptor/retry.js -var require_retry = __commonJS({ - "node_modules/undici/lib/interceptor/retry.js"(exports, module) { - "use strict"; - var RetryHandler = require_retry_handler(); - module.exports = (globalOpts) => { - return (dispatch) => { - return function retryInterceptor(opts, handler) { - return dispatch( - opts, - new RetryHandler( - { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } }, - { - handler, - dispatch - } - ) - ); - }; - }; + webidl.util.IntegerPart = function(n) { + const r = Math.floor(Math.abs(n)); + if (n < 0) { + return -1 * r; + } + return r; }; - } -}); - -// node_modules/undici/lib/interceptor/dump.js -var require_dump = __commonJS({ - "node_modules/undici/lib/interceptor/dump.js"(exports, module) { - "use strict"; - var { InvalidArgumentError, RequestAbortedError } = require_errors(); - var DecoratorHandler = require_decorator_handler(); - var DumpHandler = class extends DecoratorHandler { - #maxSize = 1024 * 1024; - #dumped = false; - #size = 0; - #controller = null; - aborted = false; - reason = false; - constructor({ maxSize, signal }, handler) { - if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { - throw new InvalidArgumentError("maxSize must be a number greater than 0"); - } - super(handler); - this.#maxSize = maxSize ?? this.#maxSize; + webidl.util.Stringify = function(V) { + const type = webidl.util.Type(V); + switch (type) { + case SYMBOL: + return `Symbol(${V.description})`; + case OBJECT: + return inspect(V); + case STRING: + return `"${V}"`; + case BIGINT: + return `${V}n`; + default: + return `${V}`; } - #abort(reason) { - this.aborted = true; - this.reason = reason; + }; + webidl.util.IsResizableArrayBuffer = function(V) { + if (types.isArrayBuffer(V)) { + return V.resizable; } - onRequestStart(controller, context) { - controller.abort = this.#abort.bind(this); - this.#controller = controller; - return super.onRequestStart(controller, context); + if (types.isSharedArrayBuffer(V)) { + return V.growable; } - onResponseStart(controller, statusCode, headers, statusMessage) { - const contentLength = headers["content-length"]; - if (contentLength != null && contentLength > this.#maxSize) { - throw new RequestAbortedError( - `Response size (${contentLength}) larger than maxSize (${this.#maxSize})` - ); - } - if (this.aborted === true) { - return true; + throw webidl.errors.exception({ + header: "IsResizableArrayBuffer", + message: `"${webidl.util.Stringify(V)}" is not an array buffer.` + }); + }; + webidl.util.HasFlag = function(flags, attributes) { + return typeof flags === "number" && (flags & attributes) === attributes; + }; + webidl.sequenceConverter = function(converter) { + return (V, prefix, argument, Iterable) => { + if (webidl.util.Type(V) !== OBJECT) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` + }); } - return super.onResponseStart(controller, statusCode, headers, statusMessage); - } - onResponseError(controller, err) { - if (this.#dumped) { - return; + const method = typeof Iterable === "function" ? Iterable() : V?.[Symbol.iterator]?.(); + const seq = []; + let index2 = 0; + if (method === void 0 || typeof method.next !== "function") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is not iterable.` + }); } - err = this.#controller?.reason ?? err; - super.onResponseError(controller, err); - } - onResponseData(controller, chunk) { - this.#size = this.#size + chunk.length; - if (this.#size >= this.#maxSize) { - this.#dumped = true; - if (this.aborted === true) { - super.onResponseError(controller, this.reason); - } else { - super.onResponseEnd(controller, {}); + while (true) { + const { done, value } = method.next(); + if (done) { + break; } + seq.push(converter(value, prefix, `${argument}[${index2++}]`)); } - return true; - } - onResponseEnd(controller, trailers) { - if (this.#dumped) { - return; - } - if (this.#controller.aborted === true) { - super.onResponseError(controller, this.reason); - return; - } - super.onResponseEnd(controller, trailers); - } - }; - function createDumpInterceptor({ maxSize: defaultMaxSize } = { - maxSize: 1024 * 1024 - }) { - return (dispatch) => { - return function Intercept(opts, handler) { - const { dumpMaxSize = defaultMaxSize } = opts; - const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal }, handler); - return dispatch(opts, dumpHandler); - }; + return seq; }; - } - module.exports = createDumpInterceptor; - } -}); - -// node_modules/undici/lib/interceptor/dns.js -var require_dns = __commonJS({ - "node_modules/undici/lib/interceptor/dns.js"(exports, module) { - "use strict"; - var { isIP } = __require("net"); - var { lookup } = __require("dns"); - var DecoratorHandler = require_decorator_handler(); - var { InvalidArgumentError, InformationalError } = require_errors(); - var maxInt = Math.pow(2, 31) - 1; - function hasSafeIterator(headers) { - const prototype = Object.getPrototypeOf(headers); - const ownIterator = Object.hasOwn(headers, Symbol.iterator); - return ownIterator || prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === "function"; - } - function isHostHeader(key) { - return typeof key === "string" && key.toLowerCase() === "host"; - } - function normalizeHeaders3(headers) { - if (headers == null) { - return null; - } - if (Array.isArray(headers)) { - if (headers.length === 0 || !Array.isArray(headers[0])) { - return headers; + }; + webidl.recordConverter = function(keyConverter, valueConverter) { + return (O, prefix, argument) => { + if (webidl.util.Type(O) !== OBJECT) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} ("${webidl.util.TypeValueToString(O)}") is not an Object.` + }); } - const normalized = []; - for (const header of headers) { - if (Array.isArray(header) && header.length === 2) { - normalized.push(header[0], header[1]); - } else { - normalized.push(header); + const result = {}; + if (!types.isProxy(O)) { + const keys2 = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; + for (const key of keys2) { + const keyName = webidl.util.Stringify(key); + const typedKey = keyConverter(key, prefix, `Key ${keyName} in ${argument}`); + const typedValue = valueConverter(O[key], prefix, `${argument}[${keyName}]`); + result[typedKey] = typedValue; } + return result; } - return normalized; - } - if (typeof headers === "object" && hasSafeIterator(headers)) { - const normalized = []; - for (const header of headers) { - if (Array.isArray(header) && header.length === 2) { - normalized.push(header[0], header[1]); - } else { - normalized.push(header); + const keys = Reflect.ownKeys(O); + for (const key of keys) { + const desc = Reflect.getOwnPropertyDescriptor(O, key); + if (desc?.enumerable) { + const typedKey = keyConverter(key, prefix, argument); + const typedValue = valueConverter(O[key], prefix, argument); + result[typedKey] = typedValue; } } - return normalized; - } - return headers; - } - function hasHostHeader(headers) { - if (headers == null) { - return false; - } - if (Array.isArray(headers)) { - if (headers.length === 0) { - return false; + return result; + }; + }; + webidl.interfaceConverter = function(TypeCheck, name) { + return (V, prefix, argument) => { + if (!TypeCheck(V)) { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${name}.` + }); } - for (let i = 0; i < headers.length; i += 2) { - if (isHostHeader(headers[i])) { - return true; - } + return V; + }; + }; + webidl.dictionaryConverter = function(converters) { + converters.sort((a, b) => (a.key > b.key) - (a.key < b.key)); + return (dictionary, prefix, argument) => { + const dict = {}; + if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }); } - return false; - } - if (typeof headers === "object") { - for (const key in headers) { - if (isHostHeader(key)) { - return true; + for (const options of converters) { + const { key, defaultValue, required, converter } = options; + if (required === true) { + if (dictionary == null || !Object.hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: prefix, + message: `Missing required key "${key}".` + }); + } + } + let value = dictionary?.[key]; + const hasDefault = defaultValue !== void 0; + if (hasDefault && value === void 0) { + value = defaultValue(); + } + if (required || hasDefault || value !== void 0) { + value = converter(value, prefix, `${argument}.${key}`); + if (options.allowedValues && !options.allowedValues.includes(value)) { + throw webidl.errors.exception({ + header: prefix, + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` + }); + } + dict[key] = value; } } + return dict; + }; + }; + webidl.nullableConverter = function(converter) { + return (V, prefix, argument) => { + if (V === null) { + return V; + } + return converter(V, prefix, argument); + }; + }; + webidl.is.USVString = function(value) { + return typeof value === "string" && value.isWellFormed(); + }; + webidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream); + webidl.is.Blob = webidl.util.MakeTypeAssertion(Blob); + webidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams); + webidl.is.File = webidl.util.MakeTypeAssertion(File); + webidl.is.URL = webidl.util.MakeTypeAssertion(URL); + webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal); + webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort); + webidl.is.BufferSource = function(V) { + return types.isArrayBuffer(V) || ArrayBuffer.isView(V) && types.isArrayBuffer(V.buffer); + }; + webidl.util.getCopyOfBytesHeldByBufferSource = function(bufferSource) { + const jsBufferSource = bufferSource; + let jsArrayBuffer = jsBufferSource; + let offset = 0; + let length = 0; + if (types.isTypedArray(jsBufferSource) || types.isDataView(jsBufferSource)) { + jsArrayBuffer = jsBufferSource.buffer; + offset = jsBufferSource.byteOffset; + length = jsBufferSource.byteLength; + } else { + assert8(types.isAnyArrayBuffer(jsBufferSource)); + length = jsBufferSource.byteLength; } - return false; - } - function withHostHeader(host, headers) { - const normalizedHeaders = normalizeHeaders3(headers); - if (hasHostHeader(normalizedHeaders)) { - return normalizedHeaders; - } - if (Array.isArray(normalizedHeaders)) { - return ["host", host, ...normalizedHeaders]; - } - if (normalizedHeaders && typeof normalizedHeaders === "object") { - return { - host, - ...normalizedHeaders - }; - } - return { host }; - } - var DNSStorage = class { - #maxItems = 0; - #records = /* @__PURE__ */ new Map(); - constructor(opts) { - this.#maxItems = opts.maxItems; - } - get size() { - return this.#records.size; - } - get(hostname) { - return this.#records.get(hostname) ?? null; - } - set(hostname, records) { - this.#records.set(hostname, records); - } - delete(hostname) { - this.#records.delete(hostname); - } - // Delegate to storage decide can we do more lookups or not - full() { - return this.size >= this.#maxItems; + if (jsArrayBuffer.detached) { + return new Uint8Array(0); } + const bytes = new Uint8Array(length); + const view = new Uint8Array(jsArrayBuffer, offset, length); + bytes.set(view); + return bytes; }; - var DNSInstance = class { - #maxTTL = 0; - #maxItems = 0; - dualStack = true; - affinity = null; - lookup = null; - pick = null; - storage = null; - constructor(opts) { - this.#maxTTL = opts.maxTTL; - this.#maxItems = opts.maxItems; - this.dualStack = opts.dualStack; - this.affinity = opts.affinity; - this.lookup = opts.lookup ?? this.#defaultLookup; - this.pick = opts.pick ?? this.#defaultPick; - this.storage = opts.storage ?? new DNSStorage(opts); - } - runLookup(origin, opts, cb) { - const ips = this.storage.get(origin.hostname); - if (ips == null && this.storage.full()) { - cb(null, origin); - return; - } - const newOpts = { - affinity: this.affinity, - dualStack: this.dualStack, - lookup: this.lookup, - pick: this.pick, - ...opts.dns, - maxTTL: this.#maxTTL, - maxItems: this.#maxItems - }; - if (ips == null) { - this.lookup(origin, newOpts, (err, addresses) => { - if (err || addresses == null || addresses.length === 0) { - cb(err ?? new InformationalError("No DNS entries found")); - return; - } - this.setRecords(origin, addresses); - const records = this.storage.get(origin.hostname); - const ip = this.pick( - origin, - records, - newOpts.affinity - ); - let port; - if (typeof ip.port === "number") { - port = `:${ip.port}`; - } else if (origin.port !== "") { - port = `:${origin.port}`; - } else { - port = ""; - } - cb( - null, - new URL(`${origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`) - ); - }); - } else { - const ip = this.pick( - origin, - ips, - newOpts.affinity - ); - if (ip == null) { - this.storage.delete(origin.hostname); - this.runLookup(origin, opts, cb); - return; - } - let port; - if (typeof ip.port === "number") { - port = `:${ip.port}`; - } else if (origin.port !== "") { - port = `:${origin.port}`; - } else { - port = ""; - } - cb( - null, - new URL(`${origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`) + webidl.converters.DOMString = function(V, prefix, argument, flags) { + if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) { + return ""; + } + if (typeof V === "symbol") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a DOMString.` + }); + } + return String(V); + }; + webidl.converters.ByteString = function(V, prefix, argument) { + if (typeof V === "symbol") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a ByteString.` + }); + } + const x = String(V); + for (let index2 = 0; index2 < x.length; index2++) { + if (x.charCodeAt(index2) > 255) { + throw new TypeError( + `Cannot convert argument to a ByteString because the character at index ${index2} has a value of ${x.charCodeAt(index2)} which is greater than 255.` ); } } - #defaultLookup(origin, opts, cb) { - lookup( - origin.hostname, - { - all: true, - family: this.dualStack === false ? this.affinity : 0, - order: "ipv4first" - }, - (err, addresses) => { - if (err) { - return cb(err); - } - const results = /* @__PURE__ */ new Map(); - for (const addr of addresses) { - results.set(`${addr.address}:${addr.family}`, addr); - } - cb(null, results.values()); - } - ); + return x; + }; + webidl.converters.USVString = function(value) { + if (typeof value === "string") { + return value.toWellFormed(); } - #defaultPick(origin, hostnameRecords, affinity) { - let ip = null; - const { records, offset } = hostnameRecords; - let family; - if (this.dualStack) { - if (affinity == null) { - if (offset == null || offset === maxInt) { - hostnameRecords.offset = 0; - affinity = 4; - } else { - hostnameRecords.offset++; - affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4; - } - } - if (records[affinity] != null && records[affinity].ips.length > 0) { - family = records[affinity]; - } else { - family = records[affinity === 4 ? 6 : 4]; - } - } else { - family = records[affinity]; - } - if (family == null || family.ips.length === 0) { - return ip; - } - if (family.offset == null || family.offset === maxInt) { - family.offset = 0; - } else { - family.offset++; - } - const position = family.offset % family.ips.length; - ip = family.ips[position] ?? null; - if (ip == null) { - return ip; - } - if (Date.now() - ip.timestamp > ip.ttl) { - family.ips.splice(position, 1); - return this.pick(origin, hostnameRecords, affinity); - } - return ip; + return `${value}`.toWellFormed(); + }; + webidl.converters.boolean = function(V) { + const x = Boolean(V); + return x; + }; + webidl.converters.any = function(V) { + return V; + }; + webidl.converters["long long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 64, "signed", 0, prefix, argument); + return x; + }; + webidl.converters["unsigned long long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 64, "unsigned", 0, prefix, argument); + return x; + }; + webidl.converters["unsigned long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 32, "unsigned", 0, prefix, argument); + return x; + }; + webidl.converters["unsigned short"] = function(V, prefix, argument, flags) { + const x = webidl.util.ConvertToInt(V, 16, "unsigned", flags, prefix, argument); + return x; + }; + webidl.converters.ArrayBuffer = function(V, prefix, argument, flags) { + if (webidl.util.Type(V) !== OBJECT || !types.isArrayBuffer(V)) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["ArrayBuffer"] + }); } - pickFamily(origin, ipFamily) { - const records = this.storage.get(origin.hostname)?.records; - if (!records) { - return null; - } - const family = records[ipFamily]; - if (!family) { - return null; - } - if (family.offset == null || family.offset === maxInt) { - family.offset = 0; - } else { - family.offset++; - } - const position = family.offset % family.ips.length; - const ip = family.ips[position] ?? null; - if (ip == null) { - return ip; - } - if (Date.now() - ip.timestamp > ip.ttl) { - family.ips.splice(position, 1); - } - return ip; + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a resizable ArrayBuffer.` + }); } - setRecords(origin, addresses) { - const timestamp = Date.now(); - const records = { records: { 4: null, 6: null } }; - let minTTL = this.#maxTTL; - for (const record of addresses) { - record.timestamp = timestamp; - if (typeof record.ttl === "number") { - record.ttl = Math.min(record.ttl, this.#maxTTL); - minTTL = Math.min(minTTL, record.ttl); - } else { - record.ttl = this.#maxTTL; - } - const familyRecords = records.records[record.family] ?? { ips: [] }; - familyRecords.ips.push(record); - records.records[record.family] = familyRecords; - } - this.storage.set(origin.hostname, records, { ttl: minTTL }); + return V; + }; + webidl.converters.SharedArrayBuffer = function(V, prefix, argument, flags) { + if (webidl.util.Type(V) !== OBJECT || !types.isSharedArrayBuffer(V)) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["SharedArrayBuffer"] + }); } - deleteRecords(origin) { - this.storage.delete(origin.hostname); + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a resizable SharedArrayBuffer.` + }); } - getHandler(meta, opts) { - return new DNSDispatchHandler(this, meta, opts); + return V; + }; + webidl.converters.TypedArray = function(V, T, prefix, argument, flags) { + if (webidl.util.Type(V) !== OBJECT || !types.isTypedArray(V) || V.constructor.name !== T.name) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: [T.name] + }); + } + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a view on a shared array buffer.` + }); + } + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a view on a resizable array buffer.` + }); } + return V; }; - var DNSDispatchHandler = class extends DecoratorHandler { - #state = null; - #opts = null; - #dispatch = null; - #origin = null; - #controller = null; - #newOrigin = null; - #firstTry = true; - constructor(state, { origin, handler, dispatch, newOrigin }, opts) { - super(handler); - this.#origin = origin; - this.#newOrigin = newOrigin; - this.#opts = { ...opts }; - this.#state = state; - this.#dispatch = dispatch; + webidl.converters.DataView = function(V, prefix, argument, flags) { + if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["DataView"] + }); } - onResponseError(controller, err) { - switch (err.code) { - case "ETIMEDOUT": - case "ECONNREFUSED": { - if (this.#state.dualStack) { - if (!this.#firstTry) { - super.onResponseError(controller, err); - return; - } - this.#firstTry = false; - const otherFamily = this.#newOrigin.hostname[0] === "[" ? 4 : 6; - const ip = this.#state.pickFamily(this.#origin, otherFamily); - if (ip == null) { - super.onResponseError(controller, err); - return; - } - let port; - if (typeof ip.port === "number") { - port = `:${ip.port}`; - } else if (this.#origin.port !== "") { - port = `:${this.#origin.port}`; - } else { - port = ""; - } - const dispatchOpts = { - ...this.#opts, - origin: `${this.#origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`, - headers: withHostHeader(this.#origin.host, this.#opts.headers) - }; - this.#dispatch(dispatchOpts, this); - return; - } - super.onResponseError(controller, err); - break; - } - case "ENOTFOUND": - this.#state.deleteRecords(this.#origin); - super.onResponseError(controller, err); - break; - default: - super.onResponseError(controller, err); - break; - } + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a view on a shared array buffer.` + }); + } + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a view on a resizable array buffer.` + }); } + return V; }; - module.exports = (interceptorOpts) => { - if (interceptorOpts?.maxTTL != null && (typeof interceptorOpts?.maxTTL !== "number" || interceptorOpts?.maxTTL < 0)) { - throw new InvalidArgumentError("Invalid maxTTL. Must be a positive number"); + webidl.converters.ArrayBufferView = function(V, prefix, argument, flags) { + if (webidl.util.Type(V) !== OBJECT || !types.isArrayBufferView(V)) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["ArrayBufferView"] + }); } - if (interceptorOpts?.maxItems != null && (typeof interceptorOpts?.maxItems !== "number" || interceptorOpts?.maxItems < 1)) { - throw new InvalidArgumentError( - "Invalid maxItems. Must be a positive number and greater than zero" - ); + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a view on a shared array buffer.` + }); } - if (interceptorOpts?.affinity != null && interceptorOpts?.affinity !== 4 && interceptorOpts?.affinity !== 6) { - throw new InvalidArgumentError("Invalid affinity. Must be either 4 or 6"); + if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a view on a resizable array buffer.` + }); } - if (interceptorOpts?.dualStack != null && typeof interceptorOpts?.dualStack !== "boolean") { - throw new InvalidArgumentError("Invalid dualStack. Must be a boolean"); + return V; + }; + webidl.converters.BufferSource = function(V, prefix, argument, flags) { + if (types.isArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, prefix, argument, flags); } - if (interceptorOpts?.lookup != null && typeof interceptorOpts?.lookup !== "function") { - throw new InvalidArgumentError("Invalid lookup. Must be a function"); + if (types.isArrayBufferView(V)) { + flags &= ~webidl.attributes.AllowShared; + return webidl.converters.ArrayBufferView(V, prefix, argument, flags); } - if (interceptorOpts?.pick != null && typeof interceptorOpts?.pick !== "function") { - throw new InvalidArgumentError("Invalid pick. Must be a function"); + if (types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} cannot be a SharedArrayBuffer.` + }); } - if (interceptorOpts?.storage != null && (typeof interceptorOpts?.storage?.get !== "function" || typeof interceptorOpts?.storage?.set !== "function" || typeof interceptorOpts?.storage?.full !== "function" || typeof interceptorOpts?.storage?.delete !== "function")) { - throw new InvalidArgumentError("Invalid storage. Must be a object with methods: { get, set, full, delete }"); + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["ArrayBuffer", "ArrayBufferView"] + }); + }; + webidl.converters.AllowSharedBufferSource = function(V, prefix, argument, flags) { + if (types.isArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, prefix, argument, flags); } - const dualStack = interceptorOpts?.dualStack ?? true; - let affinity; - if (dualStack) { - affinity = interceptorOpts?.affinity ?? null; - } else { - affinity = interceptorOpts?.affinity ?? 4; + if (types.isSharedArrayBuffer(V)) { + return webidl.converters.SharedArrayBuffer(V, prefix, argument, flags); } - const opts = { - maxTTL: interceptorOpts?.maxTTL ?? 1e4, - // Expressed in ms - lookup: interceptorOpts?.lookup ?? null, - pick: interceptorOpts?.pick ?? null, - dualStack, - affinity, - maxItems: interceptorOpts?.maxItems ?? Infinity, - storage: interceptorOpts?.storage - }; - const instance = new DNSInstance(opts); - return (dispatch) => { - return function dnsInterceptor(origDispatchOpts, handler) { - const origin = origDispatchOpts.origin.constructor === URL ? origDispatchOpts.origin : new URL(origDispatchOpts.origin); - if (isIP(origin.hostname) !== 0) { - return dispatch(origDispatchOpts, handler); - } - instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { - if (err) { - return handler.onResponseError(null, err); - } - const dispatchOpts = { - ...origDispatchOpts, - servername: origin.hostname, - // For SNI on TLS - origin: newOrigin.origin, - headers: withHostHeader(origin.host, origDispatchOpts.headers) - }; - dispatch( - dispatchOpts, - instance.getHandler( - { origin, dispatch, handler, newOrigin }, - origDispatchOpts - ) - ); - }); - return true; - }; + if (types.isArrayBufferView(V)) { + flags |= webidl.attributes.AllowShared; + return webidl.converters.ArrayBufferView(V, prefix, argument, flags); + } + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["ArrayBuffer", "SharedArrayBuffer", "ArrayBufferView"] + }); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.ByteString + ); + webidl.converters["sequence>"] = webidl.sequenceConverter( + webidl.converters["sequence"] + ); + webidl.converters["record"] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString + ); + webidl.converters.Blob = webidl.interfaceConverter(webidl.is.Blob, "Blob"); + webidl.converters.AbortSignal = webidl.interfaceConverter( + webidl.is.AbortSignal, + "AbortSignal" + ); + webidl.converters.EventHandlerNonNull = function(V) { + if (webidl.util.Type(V) !== OBJECT) { + return null; + } + if (typeof V === "function") { + return V; + } + return () => { }; }; + webidl.attributes = { + Clamp: 1 << 0, + EnforceRange: 1 << 1, + AllowShared: 1 << 2, + AllowResizable: 1 << 3, + LegacyNullToEmptyString: 1 << 4 + }; + module.exports = { + webidl + }; } }); -// node_modules/undici/lib/util/cache.js -var require_cache = __commonJS({ - "node_modules/undici/lib/util/cache.js"(exports, module) { +// node_modules/undici/lib/web/fetch/util.js +var require_util2 = __commonJS({ + "node_modules/undici/lib/web/fetch/util.js"(exports, module) { "use strict"; - var { - safeHTTPMethods, - pathHasQueryOrFragment, - hasSafeIterator - } = require_util(); - var { serializePathWithQuery } = require_util(); - function makeCacheKey(opts) { - if (!opts.origin) { - throw new Error("opts.origin is undefined"); - } - let fullPath = opts.path || "/"; - if (opts.query && !pathHasQueryOrFragment(opts.path)) { - fullPath = serializePathWithQuery(fullPath, opts.query); - } - return { - origin: opts.origin.toString(), - method: opts.method, - path: fullPath, - headers: opts.headers - }; + var { Transform } = __require("stream"); + var zlib = __require("zlib"); + var { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require_constants4(); + var { getGlobalOrigin } = require_global(); + var { collectAnHTTPQuotedString, parseMIMEType } = require_data_url(); + var { performance: performance2 } = __require("perf_hooks"); + var { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require_util(); + var assert8 = __require("assert"); + var { isUint8Array } = __require("util/types"); + var { webidl } = require_webidl(); + var { isomorphicEncode, collectASequenceOfCodePoints, removeChars } = require_infra(); + function responseURL(response) { + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString(); } - function normalizeHeaders3(opts) { - let headers; - if (opts.headers == null) { - headers = {}; - } else if (typeof opts.headers === "object") { - headers = {}; - if (hasSafeIterator(opts.headers)) { - for (const x of opts.headers) { - if (!Array.isArray(x)) { - throw new Error("opts.headers is not a valid header map"); - } - const [key, val] = x; - if (typeof key !== "string" || typeof val !== "string") { - throw new Error("opts.headers is not a valid header map"); - } - headers[key.toLowerCase()] = val; - } - } else { - for (const key of Object.keys(opts.headers)) { - headers[key.toLowerCase()] = opts.headers[key]; - } + function responseLocationURL(response, requestFragment) { + if (!redirectStatusSet.has(response.status)) { + return null; + } + let location = response.headersList.get("location", true); + if (location !== null && isValidHeaderValue(location)) { + if (!isValidEncodedURL(location)) { + location = normalizeBinaryStringToUtf8(location); } - } else { - throw new Error("opts.headers is not an object"); + location = new URL(location, responseURL(response)); } - return headers; - } - function assertCacheKey(key) { - if (typeof key !== "object") { - throw new TypeError(`expected key to be object, got ${typeof key}`); + if (location && !location.hash) { + location.hash = requestFragment; } - for (const property of ["origin", "method", "path"]) { - if (typeof key[property] !== "string") { - throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`); + return location; + } + function isValidEncodedURL(url) { + for (let i = 0; i < url.length; ++i) { + const code = url.charCodeAt(i); + if (code > 126 || // Non-US-ASCII + DEL + code < 32) { + return false; } } - if (key.headers !== void 0 && typeof key.headers !== "object") { - throw new TypeError(`expected headers to be object, got ${typeof key}`); - } + return true; } - function assertCacheValue(value) { - if (typeof value !== "object") { - throw new TypeError(`expected value to be object, got ${typeof value}`); + function normalizeBinaryStringToUtf8(value) { + return Buffer.from(value, "binary").toString("utf8"); + } + function requestCurrentURL(request) { + return request.urlList[request.urlList.length - 1]; + } + function requestBadPort(request) { + const url = requestCurrentURL(request); + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return "blocked"; } - for (const property of ["statusCode", "cachedAt", "staleAt", "deleteAt"]) { - if (typeof value[property] !== "number") { - throw new TypeError(`expected value.${property} to be number, got ${typeof value[property]}`); + return "allowed"; + } + function isErrorLike(object) { + return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + } + function isValidReasonPhrase(statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c2 = statusText.charCodeAt(i); + if (!(c2 === 9 || // HTAB + c2 >= 32 && c2 <= 126 || // SP / VCHAR + c2 >= 128 && c2 <= 255)) { + return false; } } - if (typeof value.statusMessage !== "string") { - throw new TypeError(`expected value.statusMessage to be string, got ${typeof value.statusMessage}`); - } - if (value.headers != null && typeof value.headers !== "object") { - throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value.headers}`); - } - if (value.vary !== void 0 && typeof value.vary !== "object") { - throw new TypeError(`expected value.vary to be object, got ${typeof value.vary}`); + return true; + } + var isValidHeaderName = isValidHTTPToken; + function isValidHeaderValue(potentialValue) { + return (potentialValue[0] === " " || potentialValue[0] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue.includes("\n") || potentialValue.includes("\r") || potentialValue.includes("\0")) === false; + } + function parseReferrerPolicy(actualResponse) { + const policyHeader = (actualResponse.headersList.get("referrer-policy", true) ?? "").split(","); + let policy = ""; + if (policyHeader.length) { + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break; + } + } } - if (value.etag !== void 0 && typeof value.etag !== "string") { - throw new TypeError(`expected value.etag to be string, got ${typeof value.etag}`); + return policy; + } + function setRequestReferrerPolicyOnRedirect(request, actualResponse) { + const policy = parseReferrerPolicy(actualResponse); + if (policy !== "") { + request.referrerPolicy = policy; } } - function parseCacheControlHeader(header) { - const output = {}; - let directives; - if (Array.isArray(header)) { - directives = []; - for (const directive of header) { - directives.push(...directive.split(",")); - } - } else { - directives = header.split(","); + function crossOriginResourcePolicyCheck() { + return "allowed"; + } + function corsCheck() { + return "success"; + } + function TAOCheck() { + return "success"; + } + function appendFetchMetadata(httpRequest) { + let header = null; + header = httpRequest.mode; + httpRequest.headersList.set("sec-fetch-mode", header, true); + } + function appendRequestOriginHeader(request) { + let serializedOrigin = request.origin; + if (serializedOrigin === "client" || serializedOrigin === void 0) { + return; } - for (let i = 0; i < directives.length; i++) { - const directive = directives[i].toLowerCase(); - const keyValueDelimiter = directive.indexOf("="); - let key; - let value; - if (keyValueDelimiter !== -1) { - key = directive.substring(0, keyValueDelimiter).trimStart(); - value = directive.substring(keyValueDelimiter + 1); - } else { - key = directive.trim(); - } - switch (key) { - case "min-fresh": - case "max-stale": - case "max-age": - case "s-maxage": - case "stale-while-revalidate": - case "stale-if-error": { - if (value === void 0 || value[0] === " ") { - continue; - } - if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') { - value = value.substring(1, value.length - 1); - } - const parsedValue = parseInt(value, 10); - if (parsedValue !== parsedValue) { - continue; - } - if (key === "max-age" && key in output && output[key] >= parsedValue) { - continue; - } - output[key] = parsedValue; + if (request.responseTainting === "cors" || request.mode === "websocket") { + request.headersList.append("origin", serializedOrigin, true); + } else if (request.method !== "GET" && request.method !== "HEAD") { + switch (request.referrerPolicy) { + case "no-referrer": + serializedOrigin = null; break; - } - case "private": - case "no-cache": { - if (value) { - if (value[0] === '"') { - const headers = [value.substring(1)]; - let foundEndingQuote = value[value.length - 1] === '"'; - if (!foundEndingQuote) { - for (let j = i + 1; j < directives.length; j++) { - const nextPart = directives[j]; - const nextPartLength = nextPart.length; - headers.push(nextPart.trim()); - if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '"') { - foundEndingQuote = true; - break; - } - } - } - if (foundEndingQuote) { - let lastHeader = headers[headers.length - 1]; - if (lastHeader[lastHeader.length - 1] === '"') { - lastHeader = lastHeader.substring(0, lastHeader.length - 1); - headers[headers.length - 1] = lastHeader; - } - if (key in output) { - output[key] = output[key].concat(headers); - } else { - output[key] = headers; - } - } - } else { - if (key in output) { - output[key] = output[key].concat(value); - } else { - output[key] = [value]; - } - } - break; + case "no-referrer-when-downgrade": + case "strict-origin": + case "strict-origin-when-cross-origin": + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; } - } - // eslint-disable-next-line no-fallthrough - case "public": - case "no-store": - case "must-revalidate": - case "proxy-revalidate": - case "immutable": - case "no-transform": - case "must-understand": - case "only-if-cached": - if (value) { - continue; + break; + case "same-origin": + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; } - output[key] = true; break; default: - continue; } + request.headersList.append("origin", serializedOrigin, true); } - return output; } - function parseVaryHeader(varyHeader, headers) { - if (typeof varyHeader === "string" && varyHeader.includes("*")) { - return headers; - } - const output = ( - /** @type {Record} */ - {} - ); - const varyingHeaders = typeof varyHeader === "string" ? varyHeader.split(",") : varyHeader; - for (const header of varyingHeaders) { - const trimmedHeader = header.trim().toLowerCase(); - output[trimmedHeader] = headers[trimmedHeader] ?? null; - } - return output; + function coarsenTime(timestamp, crossOriginIsolatedCapability) { + return timestamp; } - function isEtagUsable(etag) { - if (etag.length <= 2) { - return false; - } - if (etag[0] === '"' && etag[etag.length - 1] === '"') { - return !(etag[1] === '"' || etag.startsWith('"W/')); - } - if (etag.startsWith('W/"') && etag[etag.length - 1] === '"') { - return etag.length !== 4; + function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { + if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { + return { + domainLookupStartTime: defaultStartTime, + domainLookupEndTime: defaultStartTime, + connectionStartTime: defaultStartTime, + connectionEndTime: defaultStartTime, + secureConnectionStartTime: defaultStartTime, + ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol + }; } - return false; + return { + domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability), + domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability), + connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability), + connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability), + secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability), + ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol + }; } - function assertCacheStore(store, name = "CacheStore") { - if (typeof store !== "object" || store === null) { - throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store === null ? "null" : typeof store}`); - } - for (const fn of ["get", "createWriteStream", "delete"]) { - if (typeof store[fn] !== "function") { - throw new TypeError(`${name} needs to have a \`${fn}()\` function`); - } - } + function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { + return coarsenTime(performance2.now(), crossOriginIsolatedCapability); } - function assertCacheMethods(methods, name = "CacheMethods") { - if (!Array.isArray(methods)) { - throw new TypeError(`expected type of ${name} needs to be an array, got ${methods === null ? "null" : typeof methods}`); - } - if (methods.length === 0) { - throw new TypeError(`${name} needs to have at least one method`); - } - for (const method of methods) { - if (!safeHTTPMethods.includes(method)) { - throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`); - } - } + function createOpaqueTimingInfo(timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + }; } - function makeDeduplicationKey(cacheKey2, excludeHeaders) { - const headers = {}; - if (cacheKey2.headers) { - const sortedHeaders = Object.keys(cacheKey2.headers).sort(); - for (const header of sortedHeaders) { - if (excludeHeaders?.has(header.toLowerCase())) { - continue; - } - headers[header] = cacheKey2.headers[header]; - } - } - return JSON.stringify([cacheKey2.origin, cacheKey2.method, cacheKey2.path, headers]); + function makePolicyContainer() { + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; } - module.exports = { - makeCacheKey, - normalizeHeaders: normalizeHeaders3, - assertCacheKey, - assertCacheValue, - parseCacheControlHeader, - parseVaryHeader, - isEtagUsable, - assertCacheMethods, - assertCacheStore, - makeDeduplicationKey - }; - } -}); - -// node_modules/undici/lib/util/date.js -var require_date = __commonJS({ - "node_modules/undici/lib/util/date.js"(exports, module) { - "use strict"; - function parseHttpDate(date) { - switch (date[3]) { - case ",": - return parseImfDate(date); - case " ": - return parseAscTimeDate(date); - default: - return parseRfc850Date(date); - } + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; } - function parseImfDate(date) { - if (date.length !== 29 || date[4] !== " " || date[7] !== " " || date[11] !== " " || date[16] !== " " || date[19] !== ":" || date[22] !== ":" || date[25] !== " " || date[26] !== "G" || date[27] !== "M" || date[28] !== "T") { - return void 0; - } - let weekday = -1; - if (date[0] === "S" && date[1] === "u" && date[2] === "n") { - weekday = 0; - } else if (date[0] === "M" && date[1] === "o" && date[2] === "n") { - weekday = 1; - } else if (date[0] === "T" && date[1] === "u" && date[2] === "e") { - weekday = 2; - } else if (date[0] === "W" && date[1] === "e" && date[2] === "d") { - weekday = 3; - } else if (date[0] === "T" && date[1] === "h" && date[2] === "u") { - weekday = 4; - } else if (date[0] === "F" && date[1] === "r" && date[2] === "i") { - weekday = 5; - } else if (date[0] === "S" && date[1] === "a" && date[2] === "t") { - weekday = 6; - } else { - return void 0; - } - let day = 0; - if (date[5] === "0") { - const code = date.charCodeAt(6); - if (code < 49 || code > 57) { - return void 0; - } - day = code - 48; - } else { - const code1 = date.charCodeAt(5); - if (code1 < 49 || code1 > 51) { - return void 0; - } - const code2 = date.charCodeAt(6); - if (code2 < 48 || code2 > 57) { - return void 0; + function determineRequestsReferrer(request) { + const policy = request.referrerPolicy; + assert8(policy); + let referrerSource = null; + if (request.referrer === "client") { + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; } - day = (code1 - 48) * 10 + (code2 - 48); + referrerSource = new URL(globalOrigin); + } else if (webidl.is.URL(request.referrer)) { + referrerSource = request.referrer; } - let monthIdx = -1; - if (date[8] === "J" && date[9] === "a" && date[10] === "n") { - monthIdx = 0; - } else if (date[8] === "F" && date[9] === "e" && date[10] === "b") { - monthIdx = 1; - } else if (date[8] === "M" && date[9] === "a") { - if (date[10] === "r") { - monthIdx = 2; - } else if (date[10] === "y") { - monthIdx = 4; - } else { - return void 0; + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; + } + switch (policy) { + case "no-referrer": + return "no-referrer"; + case "origin": + if (referrerOrigin != null) { + return referrerOrigin; + } + return stripURLForReferrer(referrerSource, true); + case "unsafe-url": + return referrerURL; + case "strict-origin": { + const currentURL = requestCurrentURL(request); + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; } - } else if (date[8] === "J") { - if (date[9] === "a" && date[10] === "n") { - monthIdx = 0; - } else if (date[9] === "u") { - if (date[10] === "n") { - monthIdx = 5; - } else if (date[10] === "l") { - monthIdx = 6; - } else { - return void 0; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; } - } else { - return void 0; + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; } - } else if (date[8] === "A") { - if (date[9] === "p" && date[10] === "r") { - monthIdx = 3; - } else if (date[9] === "u" && date[10] === "g") { - monthIdx = 7; - } else { - return void 0; + case "same-origin": + if (sameOrigin(request, referrerURL)) { + return referrerURL; + } + return "no-referrer"; + case "origin-when-cross-origin": + if (sameOrigin(request, referrerURL)) { + return referrerURL; + } + return referrerOrigin; + case "no-referrer-when-downgrade": { + const currentURL = requestCurrentURL(request); + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerURL; } - } else if (date[8] === "S" && date[9] === "e" && date[10] === "p") { - monthIdx = 8; - } else if (date[8] === "O" && date[9] === "c" && date[10] === "t") { - monthIdx = 9; - } else if (date[8] === "N" && date[9] === "o" && date[10] === "v") { - monthIdx = 10; - } else if (date[8] === "D" && date[9] === "e" && date[10] === "c") { - monthIdx = 11; - } else { - return void 0; - } - const yearDigit1 = date.charCodeAt(12); - if (yearDigit1 < 48 || yearDigit1 > 57) { - return void 0; - } - const yearDigit2 = date.charCodeAt(13); - if (yearDigit2 < 48 || yearDigit2 > 57) { - return void 0; } - const yearDigit3 = date.charCodeAt(14); - if (yearDigit3 < 48 || yearDigit3 > 57) { - return void 0; + } + function stripURLForReferrer(url, originOnly = false) { + assert8(webidl.is.URL(url)); + url = new URL(url); + if (urlIsLocal(url)) { + return "no-referrer"; } - const yearDigit4 = date.charCodeAt(15); - if (yearDigit4 < 48 || yearDigit4 > 57) { - return void 0; + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly === true) { + url.pathname = ""; + url.search = ""; } - const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48); - let hour = 0; - if (date[17] === "0") { - const code = date.charCodeAt(18); - if (code < 48 || code > 57) { - return void 0; - } - hour = code - 48; - } else { - const code1 = date.charCodeAt(17); - if (code1 < 48 || code1 > 50) { - return void 0; - } - const code2 = date.charCodeAt(18); - if (code2 < 48 || code2 > 57) { - return void 0; - } - if (code1 === 50 && code2 > 51) { - return void 0; + return url; + } + var isPotentialleTrustworthyIPv4 = RegExp.prototype.test.bind(/^127\.(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){2}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$/); + var isPotentiallyTrustworthyIPv6 = RegExp.prototype.test.bind(/^(?:(?:0{1,4}:){7}|(?:0{1,4}:){1,6}:|::)0{0,3}1$/); + function isOriginIPPotentiallyTrustworthy(origin) { + if (origin.includes(":")) { + if (origin[0] === "[" && origin[origin.length - 1] === "]") { + origin = origin.slice(1, -1); } - hour = (code1 - 48) * 10 + (code2 - 48); + return isPotentiallyTrustworthyIPv6(origin); } - let minute = 0; - if (date[20] === "0") { - const code = date.charCodeAt(21); - if (code < 48 || code > 57) { - return void 0; - } - minute = code - 48; - } else { - const code1 = date.charCodeAt(20); - if (code1 < 48 || code1 > 53) { - return void 0; - } - const code2 = date.charCodeAt(21); - if (code2 < 48 || code2 > 57) { - return void 0; - } - minute = (code1 - 48) * 10 + (code2 - 48); + return isPotentialleTrustworthyIPv4(origin); + } + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") { + return false; } - let second = 0; - if (date[23] === "0") { - const code = date.charCodeAt(24); - if (code < 48 || code > 57) { - return void 0; - } - second = code - 48; - } else { - const code1 = date.charCodeAt(23); - if (code1 < 48 || code1 > 53) { - return void 0; - } - const code2 = date.charCodeAt(24); - if (code2 < 48 || code2 > 57) { - return void 0; - } - second = (code1 - 48) * 10 + (code2 - 48); + origin = new URL(origin); + if (origin.protocol === "https:" || origin.protocol === "wss:") { + return true; } - const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); - return result.getUTCDay() === weekday ? result : void 0; + if (isOriginIPPotentiallyTrustworthy(origin.hostname)) { + return true; + } + if (origin.hostname === "localhost" || origin.hostname === "localhost.") { + return true; + } + if (origin.hostname.endsWith(".localhost") || origin.hostname.endsWith(".localhost.")) { + return true; + } + if (origin.protocol === "file:") { + return true; + } + return false; } - function parseAscTimeDate(date) { - if (date.length !== 24 || date[7] !== " " || date[10] !== " " || date[19] !== " ") { - return void 0; + function isURLPotentiallyTrustworthy(url) { + if (!webidl.is.URL(url)) { + return false; } - let weekday = -1; - if (date[0] === "S" && date[1] === "u" && date[2] === "n") { - weekday = 0; - } else if (date[0] === "M" && date[1] === "o" && date[2] === "n") { - weekday = 1; - } else if (date[0] === "T" && date[1] === "u" && date[2] === "e") { - weekday = 2; - } else if (date[0] === "W" && date[1] === "e" && date[2] === "d") { - weekday = 3; - } else if (date[0] === "T" && date[1] === "h" && date[2] === "u") { - weekday = 4; - } else if (date[0] === "F" && date[1] === "r" && date[2] === "i") { - weekday = 5; - } else if (date[0] === "S" && date[1] === "a" && date[2] === "t") { - weekday = 6; - } else { - return void 0; + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; } - let monthIdx = -1; - if (date[4] === "J" && date[5] === "a" && date[6] === "n") { - monthIdx = 0; - } else if (date[4] === "F" && date[5] === "e" && date[6] === "b") { - monthIdx = 1; - } else if (date[4] === "M" && date[5] === "a") { - if (date[6] === "r") { - monthIdx = 2; - } else if (date[6] === "y") { - monthIdx = 4; - } else { - return void 0; + if (url.protocol === "data:") return true; + if (url.protocol === "blob:") return true; + return isOriginPotentiallyTrustworthy(url.origin); + } + function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { + } + function sameOrigin(A, B) { + if (A.origin === B.origin && A.origin === "null") { + return true; + } + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true; + } + return false; + } + function isAborted2(fetchParams) { + return fetchParams.controller.state === "aborted"; + } + function isCancelled(fetchParams) { + return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + } + function normalizeMethod(method) { + return normalizedMethodRecordsBase[method.toLowerCase()] ?? method; + } + var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + function createIterator(name, kInternalIterator, keyIndex = 0, valueIndex = 1) { + class FastIterableIterator { + /** @type {any} */ + #target; + /** @type {'key' | 'value' | 'key+value'} */ + #kind; + /** @type {number} */ + #index; + /** + * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + */ + constructor(target, kind) { + this.#target = target; + this.#kind = kind; + this.#index = 0; } - } else if (date[4] === "J") { - if (date[5] === "a" && date[6] === "n") { - monthIdx = 0; - } else if (date[5] === "u") { - if (date[6] === "n") { - monthIdx = 5; - } else if (date[6] === "l") { - monthIdx = 6; - } else { - return void 0; + next() { + if (typeof this !== "object" || this === null || !(#target in this)) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ); } - } else { - return void 0; - } - } else if (date[4] === "A") { - if (date[5] === "p" && date[6] === "r") { - monthIdx = 3; - } else if (date[5] === "u" && date[6] === "g") { - monthIdx = 7; - } else { - return void 0; + const index2 = this.#index; + const values = kInternalIterator(this.#target); + const len = values.length; + if (index2 >= len) { + return { + value: void 0, + done: true + }; + } + const { [keyIndex]: key, [valueIndex]: value } = values[index2]; + this.#index = index2 + 1; + let result; + switch (this.#kind) { + case "key": + result = key; + break; + case "value": + result = value; + break; + case "key+value": + result = [key, value]; + break; + } + return { + value: result, + done: false + }; } - } else if (date[4] === "S" && date[5] === "e" && date[6] === "p") { - monthIdx = 8; - } else if (date[4] === "O" && date[5] === "c" && date[6] === "t") { - monthIdx = 9; - } else if (date[4] === "N" && date[5] === "o" && date[6] === "v") { - monthIdx = 10; - } else if (date[4] === "D" && date[5] === "e" && date[6] === "c") { - monthIdx = 11; - } else { - return void 0; } - let day = 0; - if (date[8] === " ") { - const code = date.charCodeAt(9); - if (code < 49 || code > 57) { - return void 0; - } - day = code - 48; - } else { - const code1 = date.charCodeAt(8); - if (code1 < 49 || code1 > 51) { - return void 0; + delete FastIterableIterator.prototype.constructor; + Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); + Object.defineProperties(FastIterableIterator.prototype, { + [Symbol.toStringTag]: { + writable: false, + enumerable: false, + configurable: true, + value: `${name} Iterator` + }, + next: { writable: true, enumerable: true, configurable: true } + }); + return function(target, kind) { + return new FastIterableIterator(target, kind); + }; + } + function iteratorMixin(name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { + const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex); + const properties = { + keys: { + writable: true, + enumerable: true, + configurable: true, + value: function keys() { + webidl.brandCheck(this, object); + return makeIterator(this, "key"); + } + }, + values: { + writable: true, + enumerable: true, + configurable: true, + value: function values() { + webidl.brandCheck(this, object); + return makeIterator(this, "value"); + } + }, + entries: { + writable: true, + enumerable: true, + configurable: true, + value: function entries() { + webidl.brandCheck(this, object); + return makeIterator(this, "key+value"); + } + }, + forEach: { + writable: true, + enumerable: true, + configurable: true, + value: function forEach(callbackfn, thisArg = globalThis) { + webidl.brandCheck(this, object); + webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`); + if (typeof callbackfn !== "function") { + throw new TypeError( + `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.` + ); + } + for (const { 0: key, 1: value } of makeIterator(this, "key+value")) { + callbackfn.call(thisArg, value, key, this); + } + } } - const code2 = date.charCodeAt(9); - if (code2 < 48 || code2 > 57) { - return void 0; + }; + return Object.defineProperties(object.prototype, { + ...properties, + [Symbol.iterator]: { + writable: true, + enumerable: false, + configurable: true, + value: properties.entries.value } - day = (code1 - 48) * 10 + (code2 - 48); + }); + } + function fullyReadBody(body, processBody, processBodyError) { + const successSteps = processBody; + const errorSteps = processBodyError; + try { + const reader = body.stream.getReader(); + readAllBytes(reader, successSteps, errorSteps); + } catch (e7) { + errorSteps(e7); } - let hour = 0; - if (date[11] === "0") { - const code = date.charCodeAt(12); - if (code < 48 || code > 57) { - return void 0; - } - hour = code - 48; - } else { - const code1 = date.charCodeAt(11); - if (code1 < 48 || code1 > 50) { - return void 0; - } - const code2 = date.charCodeAt(12); - if (code2 < 48 || code2 > 57) { - return void 0; - } - if (code1 === 50 && code2 > 51) { - return void 0; + } + function readableStreamClose(controller) { + try { + controller.close(); + controller.byobRequest?.respond(0); + } catch (err) { + if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) { + throw err; } - hour = (code1 - 48) * 10 + (code2 - 48); } - let minute = 0; - if (date[14] === "0") { - const code = date.charCodeAt(15); - if (code < 48 || code > 57) { - return void 0; - } - minute = code - 48; - } else { - const code1 = date.charCodeAt(14); - if (code1 < 48 || code1 > 53) { - return void 0; - } - const code2 = date.charCodeAt(15); - if (code2 < 48 || code2 > 57) { - return void 0; - } - minute = (code1 - 48) * 10 + (code2 - 48); + } + async function readAllBytes(reader, successSteps, failureSteps) { + try { + const bytes = []; + let byteLength = 0; + do { + const { done, value: chunk } = await reader.read(); + if (done) { + successSteps(Buffer.concat(bytes, byteLength)); + return; + } + if (!isUint8Array(chunk)) { + failureSteps(new TypeError("Received non-Uint8Array chunk")); + return; + } + bytes.push(chunk); + byteLength += chunk.length; + } while (true); + } catch (e7) { + failureSteps(e7); } - let second = 0; - if (date[17] === "0") { - const code = date.charCodeAt(18); - if (code < 48 || code > 57) { - return void 0; - } - second = code - 48; - } else { - const code1 = date.charCodeAt(17); - if (code1 < 48 || code1 > 53) { - return void 0; - } - const code2 = date.charCodeAt(18); - if (code2 < 48 || code2 > 57) { - return void 0; - } - second = (code1 - 48) * 10 + (code2 - 48); + } + function urlIsLocal(url) { + assert8("protocol" in url); + const protocol = url.protocol; + return protocol === "about:" || protocol === "blob:" || protocol === "data:"; + } + function urlHasHttpsScheme(url) { + return typeof url === "string" && url[5] === ":" && url[0] === "h" && url[1] === "t" && url[2] === "t" && url[3] === "p" && url[4] === "s" || url.protocol === "https:"; + } + function urlIsHttpHttpsScheme(url) { + assert8("protocol" in url); + const protocol = url.protocol; + return protocol === "http:" || protocol === "https:"; + } + function simpleRangeHeaderValue(value, allowWhitespace) { + const data = value; + if (!data.startsWith("bytes")) { + return "failure"; } - const yearDigit1 = date.charCodeAt(20); - if (yearDigit1 < 48 || yearDigit1 > 57) { - return void 0; + const position = { position: 5 }; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); } - const yearDigit2 = date.charCodeAt(21); - if (yearDigit2 < 48 || yearDigit2 > 57) { - return void 0; + if (data.charCodeAt(position.position) !== 61) { + return "failure"; } - const yearDigit3 = date.charCodeAt(22); - if (yearDigit3 < 48 || yearDigit3 > 57) { - return void 0; + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); } - const yearDigit4 = date.charCodeAt(23); - if (yearDigit4 < 48 || yearDigit4 > 57) { - return void 0; + const rangeStart = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + return code >= 48 && code <= 57; + }, + data, + position + ); + const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); } - const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48); - const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); - return result.getUTCDay() === weekday ? result : void 0; - } - function parseRfc850Date(date) { - let commaIndex = -1; - let weekday = -1; - if (date[0] === "S") { - if (date[1] === "u" && date[2] === "n" && date[3] === "d" && date[4] === "a" && date[5] === "y") { - weekday = 0; - commaIndex = 6; - } else if (date[1] === "a" && date[2] === "t" && date[3] === "u" && date[4] === "r" && date[5] === "d" && date[6] === "a" && date[7] === "y") { - weekday = 6; - commaIndex = 8; - } - } else if (date[0] === "M" && date[1] === "o" && date[2] === "n" && date[3] === "d" && date[4] === "a" && date[5] === "y") { - weekday = 1; - commaIndex = 6; - } else if (date[0] === "T") { - if (date[1] === "u" && date[2] === "e" && date[3] === "s" && date[4] === "d" && date[5] === "a" && date[6] === "y") { - weekday = 2; - commaIndex = 7; - } else if (date[1] === "h" && date[2] === "u" && date[3] === "r" && date[4] === "s" && date[5] === "d" && date[6] === "a" && date[7] === "y") { - weekday = 4; - commaIndex = 8; - } - } else if (date[0] === "W" && date[1] === "e" && date[2] === "d" && date[3] === "n" && date[4] === "e" && date[5] === "s" && date[6] === "d" && date[7] === "a" && date[8] === "y") { - weekday = 3; - commaIndex = 9; - } else if (date[0] === "F" && date[1] === "r" && date[2] === "i" && date[3] === "d" && date[4] === "a" && date[5] === "y") { - weekday = 5; - commaIndex = 6; - } else { - return void 0; + if (data.charCodeAt(position.position) !== 45) { + return "failure"; } - if (date[commaIndex] !== "," || date.length - commaIndex - 1 !== 23 || date[commaIndex + 1] !== " " || date[commaIndex + 4] !== "-" || date[commaIndex + 8] !== "-" || date[commaIndex + 11] !== " " || date[commaIndex + 14] !== ":" || date[commaIndex + 17] !== ":" || date[commaIndex + 20] !== " " || date[commaIndex + 21] !== "G" || date[commaIndex + 22] !== "M" || date[commaIndex + 23] !== "T") { - return void 0; + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); } - let day = 0; - if (date[commaIndex + 2] === "0") { - const code = date.charCodeAt(commaIndex + 3); - if (code < 49 || code > 57) { - return void 0; - } - day = code - 48; - } else { - const code1 = date.charCodeAt(commaIndex + 2); - if (code1 < 49 || code1 > 51) { - return void 0; - } - const code2 = date.charCodeAt(commaIndex + 3); - if (code2 < 48 || code2 > 57) { - return void 0; - } - day = (code1 - 48) * 10 + (code2 - 48); + const rangeEnd = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + return code >= 48 && code <= 57; + }, + data, + position + ); + const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; + if (position.position < data.length) { + return "failure"; } - let monthIdx = -1; - if (date[commaIndex + 5] === "J" && date[commaIndex + 6] === "a" && date[commaIndex + 7] === "n") { - monthIdx = 0; - } else if (date[commaIndex + 5] === "F" && date[commaIndex + 6] === "e" && date[commaIndex + 7] === "b") { - monthIdx = 1; - } else if (date[commaIndex + 5] === "M" && date[commaIndex + 6] === "a" && date[commaIndex + 7] === "r") { - monthIdx = 2; - } else if (date[commaIndex + 5] === "A" && date[commaIndex + 6] === "p" && date[commaIndex + 7] === "r") { - monthIdx = 3; - } else if (date[commaIndex + 5] === "M" && date[commaIndex + 6] === "a" && date[commaIndex + 7] === "y") { - monthIdx = 4; - } else if (date[commaIndex + 5] === "J" && date[commaIndex + 6] === "u" && date[commaIndex + 7] === "n") { - monthIdx = 5; - } else if (date[commaIndex + 5] === "J" && date[commaIndex + 6] === "u" && date[commaIndex + 7] === "l") { - monthIdx = 6; - } else if (date[commaIndex + 5] === "A" && date[commaIndex + 6] === "u" && date[commaIndex + 7] === "g") { - monthIdx = 7; - } else if (date[commaIndex + 5] === "S" && date[commaIndex + 6] === "e" && date[commaIndex + 7] === "p") { - monthIdx = 8; - } else if (date[commaIndex + 5] === "O" && date[commaIndex + 6] === "c" && date[commaIndex + 7] === "t") { - monthIdx = 9; - } else if (date[commaIndex + 5] === "N" && date[commaIndex + 6] === "o" && date[commaIndex + 7] === "v") { - monthIdx = 10; - } else if (date[commaIndex + 5] === "D" && date[commaIndex + 6] === "e" && date[commaIndex + 7] === "c") { - monthIdx = 11; - } else { - return void 0; + if (rangeEndValue === null && rangeStartValue === null) { + return "failure"; } - const yearDigit1 = date.charCodeAt(commaIndex + 9); - if (yearDigit1 < 48 || yearDigit1 > 57) { - return void 0; + if (rangeStartValue > rangeEndValue) { + return "failure"; } - const yearDigit2 = date.charCodeAt(commaIndex + 10); - if (yearDigit2 < 48 || yearDigit2 > 57) { - return void 0; + return { rangeStartValue, rangeEndValue }; + } + function buildContentRange(rangeStart, rangeEnd, fullLength) { + let contentRange = "bytes "; + contentRange += isomorphicEncode(`${rangeStart}`); + contentRange += "-"; + contentRange += isomorphicEncode(`${rangeEnd}`); + contentRange += "/"; + contentRange += isomorphicEncode(`${fullLength}`); + return contentRange; + } + var InflateStream = class extends Transform { + #zlibOptions; + /** @param {zlib.ZlibOptions} [zlibOptions] */ + constructor(zlibOptions) { + super(); + this.#zlibOptions = zlibOptions; } - let year = (yearDigit1 - 48) * 10 + (yearDigit2 - 48); - year += year < 70 ? 2e3 : 1900; - let hour = 0; - if (date[commaIndex + 12] === "0") { - const code = date.charCodeAt(commaIndex + 13); - if (code < 48 || code > 57) { - return void 0; - } - hour = code - 48; - } else { - const code1 = date.charCodeAt(commaIndex + 12); - if (code1 < 48 || code1 > 50) { - return void 0; - } - const code2 = date.charCodeAt(commaIndex + 13); - if (code2 < 48 || code2 > 57) { - return void 0; - } - if (code1 === 50 && code2 > 51) { - return void 0; + _transform(chunk, encoding, callback) { + if (!this._inflateStream) { + if (chunk.length === 0) { + callback(); + return; + } + this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate(this.#zlibOptions) : zlib.createInflateRaw(this.#zlibOptions); + this._inflateStream.on("data", this.push.bind(this)); + this._inflateStream.on("end", () => this.push(null)); + this._inflateStream.on("error", (err) => this.destroy(err)); } - hour = (code1 - 48) * 10 + (code2 - 48); + this._inflateStream.write(chunk, encoding, callback); } - let minute = 0; - if (date[commaIndex + 15] === "0") { - const code = date.charCodeAt(commaIndex + 16); - if (code < 48 || code > 57) { - return void 0; - } - minute = code - 48; - } else { - const code1 = date.charCodeAt(commaIndex + 15); - if (code1 < 48 || code1 > 53) { - return void 0; - } - const code2 = date.charCodeAt(commaIndex + 16); - if (code2 < 48 || code2 > 57) { - return void 0; + _final(callback) { + if (this._inflateStream) { + this._inflateStream.end(); + this._inflateStream = null; } - minute = (code1 - 48) * 10 + (code2 - 48); + callback(); } - let second = 0; - if (date[commaIndex + 18] === "0") { - const code = date.charCodeAt(commaIndex + 19); - if (code < 48 || code > 57) { - return void 0; + }; + function createInflate(zlibOptions) { + return new InflateStream(zlibOptions); + } + function extractMimeType(headers) { + let charset = null; + let essence = null; + let mimeType = null; + const values = getDecodeSplit("content-type", headers); + if (values === null) { + return "failure"; + } + for (const value of values) { + const temporaryMimeType = parseMIMEType(value); + if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") { + continue; } - second = code - 48; - } else { - const code1 = date.charCodeAt(commaIndex + 18); - if (code1 < 48 || code1 > 53) { - return void 0; + mimeType = temporaryMimeType; + if (mimeType.essence !== essence) { + charset = null; + if (mimeType.parameters.has("charset")) { + charset = mimeType.parameters.get("charset"); + } + essence = mimeType.essence; + } else if (!mimeType.parameters.has("charset") && charset !== null) { + mimeType.parameters.set("charset", charset); } - const code2 = date.charCodeAt(commaIndex + 19); - if (code2 < 48 || code2 > 57) { - return void 0; + } + if (mimeType == null) { + return "failure"; + } + return mimeType; + } + function gettingDecodingSplitting(value) { + const input = value; + const position = { position: 0 }; + const values = []; + let temporaryValue = ""; + while (position.position < input.length) { + temporaryValue += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== ",", + input, + position + ); + if (position.position < input.length) { + if (input.charCodeAt(position.position) === 34) { + temporaryValue += collectAnHTTPQuotedString( + input, + position + ); + if (position.position < input.length) { + continue; + } + } else { + assert8(input.charCodeAt(position.position) === 44); + position.position++; + } } - second = (code1 - 48) * 10 + (code2 - 48); + temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32); + values.push(temporaryValue); + temporaryValue = ""; } - const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); - return result.getUTCDay() === weekday ? result : void 0; + return values; + } + function getDecodeSplit(name, list) { + const value = list.get(name, true); + if (value === null) { + return null; + } + return gettingDecodingSplitting(value); + } + function hasAuthenticationEntry(request) { + return false; } + function includesCredentials(url) { + return !!(url.username || url.password); + } + function isTraversableNavigable(navigable) { + return navigable != null && navigable !== "client" && navigable !== "no-traversable"; + } + var EnvironmentSettingsObjectBase = class { + get baseUrl() { + return getGlobalOrigin(); + } + get origin() { + return this.baseUrl?.origin; + } + policyContainer = makePolicyContainer(); + }; + var EnvironmentSettingsObject = class { + settingsObject = new EnvironmentSettingsObjectBase(); + }; + var environmentSettingsObject = new EnvironmentSettingsObject(); module.exports = { - parseHttpDate + isAborted: isAborted2, + isCancelled, + isValidEncodedURL, + ReadableStreamFrom, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + clampAndCoarsenConnectionTimingInfo, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + iteratorMixin, + createIterator, + isValidHeaderName, + isValidHeaderValue, + isErrorLike, + fullyReadBody, + readableStreamClose, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + simpleRangeHeaderValue, + buildContentRange, + createInflate, + extractMimeType, + getDecodeSplit, + environmentSettingsObject, + isOriginIPPotentiallyTrustworthy, + hasAuthenticationEntry, + includesCredentials, + isTraversableNavigable }; } }); -// node_modules/undici/lib/handler/cache-handler.js -var require_cache_handler = __commonJS({ - "node_modules/undici/lib/handler/cache-handler.js"(exports, module) { +// node_modules/undici/lib/web/fetch/formdata.js +var require_formdata = __commonJS({ + "node_modules/undici/lib/web/fetch/formdata.js"(exports, module) { "use strict"; - var util2 = require_util(); - var { - parseCacheControlHeader, - parseVaryHeader, - isEtagUsable - } = require_cache(); - var { parseHttpDate } = require_date(); - function noop() { - } - var HEURISTICALLY_CACHEABLE_STATUS_CODES = [ - 200, - 203, - 204, - 206, - 300, - 301, - 308, - 404, - 405, - 410, - 414, - 501 - ]; - var NOT_UNDERSTOOD_STATUS_CODES = [ - 206 - ]; - var MAX_RESPONSE_AGE = 2147483647e3; - var CacheHandler = class { - /** - * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey} - */ - #cacheKey; - /** - * @type {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions['type']} - */ - #cacheType; - /** - * @type {number | undefined} - */ - #cacheByDefault; - /** - * @type {import('../../types/cache-interceptor.d.ts').default.CacheStore} - */ - #store; - /** - * @type {import('../../types/dispatcher.d.ts').default.DispatchHandler} - */ - #handler; - /** - * @type {import('node:stream').Writable | undefined} - */ - #writeStream; - /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey - * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler - */ - constructor({ store, type, cacheByDefault }, cacheKey2, handler) { - this.#store = store; - this.#cacheType = type; - this.#cacheByDefault = cacheByDefault; - this.#cacheKey = cacheKey2; - this.#handler = handler; - } - onRequestStart(controller, context) { - this.#writeStream?.destroy(); - this.#writeStream = void 0; - this.#handler.onRequestStart?.(controller, context); - } - onRequestUpgrade(controller, statusCode, headers, socket) { - this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket); - } - /** - * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller - * @param {number} statusCode - * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders - * @param {string} statusMessage - */ - onResponseStart(controller, statusCode, resHeaders, statusMessage) { - const downstreamOnHeaders = () => this.#handler.onResponseStart?.( - controller, - statusCode, - resHeaders, - statusMessage - ); - const handler = this; - if (!util2.safeHTTPMethods.includes(this.#cacheKey.method) && statusCode >= 200 && statusCode <= 399) { - try { - this.#store.delete(this.#cacheKey)?.catch?.(noop); - } catch { - } - return downstreamOnHeaders(); - } - const cacheControlHeader = resHeaders["cache-control"]; - const heuristicallyCacheable = resHeaders["last-modified"] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode); - if (!cacheControlHeader && !resHeaders["expires"] && !heuristicallyCacheable && !this.#cacheByDefault) { - return downstreamOnHeaders(); - } - const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}; - if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) { - return downstreamOnHeaders(); - } - const now = Date.now(); - const resAge = resHeaders.age ? getAge(resHeaders.age) : void 0; - if (resAge && resAge >= MAX_RESPONSE_AGE) { - return downstreamOnHeaders(); - } - const resDate = typeof resHeaders.date === "string" ? parseHttpDate(resHeaders.date) : void 0; - const staleAt = determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ?? this.#cacheByDefault; - if (staleAt === void 0 || resAge && resAge > staleAt) { - return downstreamOnHeaders(); - } - const baseTime = resDate ? resDate.getTime() : now; - const absoluteStaleAt = staleAt + baseTime; - if (now >= absoluteStaleAt) { - return downstreamOnHeaders(); - } - let varyDirectives; - if (this.#cacheKey.headers && resHeaders.vary) { - varyDirectives = parseVaryHeader(resHeaders.vary, this.#cacheKey.headers); - if (!varyDirectives) { - return downstreamOnHeaders(); - } + var { iteratorMixin } = require_util2(); + var { kEnumerableProperty } = require_util(); + var { webidl } = require_webidl(); + var nodeUtil = __require("util"); + var FormData2 = class _FormData { + #state = []; + constructor(form = void 0) { + webidl.util.markAsUncloneable(this); + if (form !== void 0) { + throw webidl.errors.conversionFailed({ + prefix: "FormData constructor", + argument: "Argument 1", + types: ["undefined"] + }); } - const cachedAt = resAge ? now - resAge : now; - const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt); - const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives); - const value = { - statusCode, - statusMessage, - headers: strippedHeaders, - vary: varyDirectives, - cacheControlDirectives, - cachedAt, - staleAt: absoluteStaleAt, - deleteAt - }; - if (statusCode === 304) { - const handle304 = (cachedValue) => { - if (!cachedValue) { - return downstreamOnHeaders(); - } - value.statusCode = cachedValue.statusCode; - value.statusMessage = cachedValue.statusMessage; - value.etag = cachedValue.etag; - value.headers = { ...cachedValue.headers, ...strippedHeaders }; - downstreamOnHeaders(); - this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value); - if (!this.#writeStream || !cachedValue?.body) { - return; - } - if (typeof cachedValue.body.values === "function") { - const bodyIterator = cachedValue.body.values(); - const streamCachedBody = () => { - for (const chunk of bodyIterator) { - const full = this.#writeStream.write(chunk) === false; - this.#handler.onResponseData?.(controller, chunk); - if (full) { - break; - } - } - }; - this.#writeStream.on("error", function() { - handler.#writeStream = void 0; - handler.#store.delete(handler.#cacheKey); - }).on("drain", () => { - streamCachedBody(); - }).on("close", function() { - if (handler.#writeStream === this) { - handler.#writeStream = void 0; - } - }); - streamCachedBody(); - } else if (typeof cachedValue.body.on === "function") { - cachedValue.body.on("data", (chunk) => { - this.#writeStream.write(chunk); - this.#handler.onResponseData?.(controller, chunk); - }).on("end", () => { - this.#writeStream.end(); - }).on("error", () => { - this.#writeStream = void 0; - this.#store.delete(this.#cacheKey); - }); - this.#writeStream.on("error", function() { - handler.#writeStream = void 0; - handler.#store.delete(handler.#cacheKey); - }).on("close", function() { - if (handler.#writeStream === this) { - handler.#writeStream = void 0; - } - }); - } - }; - const result = this.#store.get(this.#cacheKey); - if (result && typeof result.then === "function") { - result.then(handle304); - } else { - handle304(result); + } + append(name, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.append"; + webidl.argumentLengthCheck(arguments, 2, prefix); + name = webidl.converters.USVString(name); + if (arguments.length === 3 || webidl.is.Blob(value)) { + value = webidl.converters.Blob(value, prefix, "value"); + if (filename !== void 0) { + filename = webidl.converters.USVString(filename); } } else { - if (typeof resHeaders.etag === "string" && isEtagUsable(resHeaders.etag)) { - value.etag = resHeaders.etag; - } - this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value); - if (!this.#writeStream) { - return downstreamOnHeaders(); - } - this.#writeStream.on("drain", () => controller.resume()).on("error", function() { - handler.#writeStream = void 0; - handler.#store.delete(handler.#cacheKey); - }).on("close", function() { - if (handler.#writeStream === this) { - handler.#writeStream = void 0; - } - controller.resume(); - }); - downstreamOnHeaders(); + value = webidl.converters.USVString(value); } + const entry = makeEntry(name, value, filename); + this.#state.push(entry); + } + delete(name) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.delete"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name); + this.#state = this.#state.filter((entry) => entry.name !== name); } - onResponseData(controller, chunk) { - if (this.#writeStream?.write(chunk) === false) { - controller.pause(); + get(name) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.get"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name); + const idx = this.#state.findIndex((entry) => entry.name === name); + if (idx === -1) { + return null; } - this.#handler.onResponseData?.(controller, chunk); + return this.#state[idx].value; } - onResponseEnd(controller, trailers) { - this.#writeStream?.end(); - this.#handler.onResponseEnd?.(controller, trailers); + getAll(name) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.getAll"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name); + return this.#state.filter((entry) => entry.name === name).map((entry) => entry.value); } - onResponseError(controller, err) { - this.#writeStream?.destroy(err); - this.#writeStream = void 0; - this.#handler.onResponseError?.(controller, err); + has(name) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.has"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name); + return this.#state.findIndex((entry) => entry.name === name) !== -1; } - }; - function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) { - if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) { - return false; + set(name, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.set"; + webidl.argumentLengthCheck(arguments, 2, prefix); + name = webidl.converters.USVString(name); + if (arguments.length === 3 || webidl.is.Blob(value)) { + value = webidl.converters.Blob(value, prefix, "value"); + if (filename !== void 0) { + filename = webidl.converters.USVString(filename); + } + } else { + value = webidl.converters.USVString(value); + } + const entry = makeEntry(name, value, filename); + const idx = this.#state.findIndex((entry2) => entry2.name === name); + if (idx !== -1) { + this.#state = [ + ...this.#state.slice(0, idx), + entry, + ...this.#state.slice(idx + 1).filter((entry2) => entry2.name !== name) + ]; + } else { + this.#state.push(entry); + } } - if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders["expires"] && !cacheControlDirectives.public && cacheControlDirectives["max-age"] === void 0 && // RFC 9111: a private response directive, if the cache is not shared - !(cacheControlDirectives.private && cacheType === "private") && !(cacheControlDirectives["s-maxage"] !== void 0 && cacheType === "shared")) { - return false; + [nodeUtil.inspect.custom](depth, options) { + const state = this.#state.reduce((a, b) => { + if (a[b.name]) { + if (Array.isArray(a[b.name])) { + a[b.name].push(b.value); + } else { + a[b.name] = [a[b.name], b.value]; + } + } else { + a[b.name] = b.value; + } + return a; + }, { __proto__: null }); + options.depth ??= depth; + options.colors ??= true; + const output = nodeUtil.formatWithOptions(options, state); + return `FormData ${output.slice(output.indexOf("]") + 2)}`; } - if (cacheControlDirectives["no-store"]) { - return false; + /** + * @param {FormData} formData + */ + static getFormDataState(formData) { + return formData.#state; } - if (cacheType === "shared" && cacheControlDirectives.private === true) { - return false; + /** + * @param {FormData} formData + * @param {any[]} newState + */ + static setFormDataState(formData, newState) { + formData.#state = newState; } - if (resHeaders.vary?.includes("*")) { - return false; + }; + var { getFormDataState, setFormDataState } = FormData2; + Reflect.deleteProperty(FormData2, "getFormDataState"); + Reflect.deleteProperty(FormData2, "setFormDataState"); + iteratorMixin("FormData", FormData2, getFormDataState, "name", "value"); + Object.defineProperties(FormData2.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + getAll: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FormData", + configurable: true } - if (reqHeaders?.authorization) { - if (!cacheControlDirectives.public && !cacheControlDirectives["s-maxage"] && !cacheControlDirectives["must-revalidate"]) { - return false; + }); + function makeEntry(name, value, filename) { + if (typeof value === "string") { + } else { + if (!webidl.is.File(value)) { + value = new File([value], "blob", { type: value.type }); } - if (typeof reqHeaders.authorization !== "string") { - return false; + if (filename !== void 0) { + const options = { + type: value.type, + lastModified: value.lastModified + }; + value = new File([value], filename, options); } - if (Array.isArray(cacheControlDirectives["no-cache"]) && cacheControlDirectives["no-cache"].includes("authorization")) { + } + return { name, value }; + } + webidl.is.FormData = webidl.util.MakeTypeAssertion(FormData2); + module.exports = { FormData: FormData2, makeEntry, setFormDataState }; + } +}); + +// node_modules/undici/lib/web/fetch/formdata-parser.js +var require_formdata_parser = __commonJS({ + "node_modules/undici/lib/web/fetch/formdata-parser.js"(exports, module) { + "use strict"; + var { bufferToLowerCasedHeaderName } = require_util(); + var { HTTP_TOKEN_CODEPOINTS } = require_data_url(); + var { makeEntry } = require_formdata(); + var { webidl } = require_webidl(); + var assert8 = __require("assert"); + var { isomorphicDecode } = require_infra(); + var dd = Buffer.from("--"); + var decoder2 = new TextDecoder(); + var decoderIgnoreBOM = new TextDecoder("utf-8", { ignoreBOM: true }); + function isAsciiString(chars) { + for (let i = 0; i < chars.length; ++i) { + if ((chars.charCodeAt(i) & ~127) !== 0) { return false; } - if (Array.isArray(cacheControlDirectives["private"]) && cacheControlDirectives["private"].includes("authorization")) { + } + return true; + } + function validateBoundary(boundary) { + const length = boundary.length; + if (length < 27 || length > 70) { + return false; + } + for (let i = 0; i < length; ++i) { + const cp = boundary.charCodeAt(i); + if (!(cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 39 || cp === 45 || cp === 95)) { return false; } } return true; } - function getAge(ageHeader) { - const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader); - return isNaN(age) ? void 0 : age * 1e3; - } - function determineStaleAt(cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) { - if (cacheType === "shared") { - const sMaxAge = cacheControlDirectives["s-maxage"]; - if (sMaxAge !== void 0) { - return sMaxAge > 0 ? sMaxAge * 1e3 : void 0; - } + function multipartFormDataParser(input, mimeType) { + assert8(mimeType !== "failure" && mimeType.essence === "multipart/form-data"); + const boundaryString = mimeType.parameters.get("boundary"); + if (boundaryString === void 0) { + throw parsingError("missing boundary in content-type header"); } - const maxAge = cacheControlDirectives["max-age"]; - if (maxAge !== void 0) { - return maxAge > 0 ? maxAge * 1e3 : void 0; + const boundary = Buffer.from(`--${boundaryString}`, "utf8"); + const entryList = []; + const position = { position: 0 }; + const firstBoundaryIndex = input.indexOf(boundary); + if (firstBoundaryIndex === -1) { + throw parsingError("no boundary found in multipart body"); } - if (typeof resHeaders.expires === "string") { - const expiresDate = parseHttpDate(resHeaders.expires); - if (expiresDate) { - if (now >= expiresDate.getTime()) { - return void 0; + position.position = firstBoundaryIndex; + while (true) { + if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { + position.position += boundary.length; + } else { + throw parsingError("expected a value starting with -- and the boundary"); + } + if (bufferStartsWith(input, dd, position)) { + return entryList; + } + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + throw parsingError("expected CRLF"); + } + position.position += 2; + const result = parseMultipartFormDataHeaders(input, position); + let { name, filename, contentType, encoding } = result; + position.position += 2; + let body; + { + const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); + if (boundaryIndex === -1) { + throw parsingError("expected boundary after body"); } - if (responseDate) { - if (responseDate >= expiresDate) { - return void 0; - } - if (age !== void 0 && age > expiresDate - responseDate) { - return void 0; - } + body = input.subarray(position.position, boundaryIndex - 4); + position.position += body.length; + if (encoding === "base64") { + body = Buffer.from(body.toString(), "base64"); } - return expiresDate.getTime() - now; } - } - if (typeof resHeaders["last-modified"] === "string") { - const lastModified = new Date(resHeaders["last-modified"]); - if (isValidDate(lastModified)) { - if (lastModified.getTime() >= now) { - return void 0; + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + throw parsingError("expected CRLF"); + } else { + position.position += 2; + } + let value; + if (filename !== null) { + contentType ??= "text/plain"; + if (!isAsciiString(contentType)) { + contentType = ""; } - const responseAge = now - lastModified.getTime(); - return responseAge * 0.1; + value = new File([body], filename, { type: contentType }); + } else { + value = decoderIgnoreBOM.decode(Buffer.from(body)); } + assert8(webidl.is.USVString(name)); + assert8(typeof value === "string" && webidl.is.USVString(value) || webidl.is.File(value)); + entryList.push(makeEntry(name, value, filename)); } - if (cacheControlDirectives.immutable) { - return 31536e3; - } - return void 0; } - function determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, staleAt) { - let staleWhileRevalidate = -Infinity; - let staleIfError = -Infinity; - let immutable = -Infinity; - if (cacheControlDirectives["stale-while-revalidate"]) { - staleWhileRevalidate = staleAt + cacheControlDirectives["stale-while-revalidate"] * 1e3; + function parseContentDispositionAttribute(input, position) { + if (input[position.position] === 59) { + position.position++; } - if (cacheControlDirectives["stale-if-error"]) { - staleIfError = staleAt + cacheControlDirectives["stale-if-error"] * 1e3; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + position + ); + const attributeName = collectASequenceOfBytes( + (char) => isToken(char) && char !== 61 && char !== 42, + // not = or * + input, + position + ); + if (attributeName.length === 0) { + return null; } - if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) { - immutable = cachedAt + 31536e6; + const attrNameStr = attributeName.toString("ascii").toLowerCase(); + const isExtended = input[position.position] === 42; + if (isExtended) { + position.position++; } - if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) { - const freshnessLifetime = staleAt - baseTime; - const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1e3); - return staleAt + freshnessLifetime + datePrecisionPadding; + if (input[position.position] !== 61) { + return null; } - return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable); - } - function stripNecessaryHeaders(resHeaders, cacheControlDirectives) { - const headersToRemove = [ - "connection", - "proxy-authenticate", - "proxy-authentication-info", - "proxy-authorization", - "proxy-connection", - "te", - "transfer-encoding", - "upgrade", - // We'll add age back when serving it - "age" - ]; - if (resHeaders["connection"]) { - if (Array.isArray(resHeaders["connection"])) { - headersToRemove.push(...resHeaders["connection"].map((header) => header.trim())); - } else { - headersToRemove.push(...resHeaders["connection"].split(",").map((header) => header.trim())); + position.position++; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + position + ); + let value; + if (isExtended) { + const headerValue = collectASequenceOfBytes( + (char) => char !== 32 && char !== 13 && char !== 10 && char !== 59, + // not space, CRLF, or ; + input, + position + ); + if (headerValue[0] !== 117 && headerValue[0] !== 85 || // u or U + headerValue[1] !== 116 && headerValue[1] !== 84 || // t or T + headerValue[2] !== 102 && headerValue[2] !== 70 || // f or F + headerValue[3] !== 45 || // - + headerValue[4] !== 56) { + throw parsingError("unknown encoding, expected utf-8''"); } - } - if (Array.isArray(cacheControlDirectives["no-cache"])) { - headersToRemove.push(...cacheControlDirectives["no-cache"]); - } - if (Array.isArray(cacheControlDirectives["private"])) { - headersToRemove.push(...cacheControlDirectives["private"]); - } - let strippedHeaders; - for (const headerName of headersToRemove) { - if (resHeaders[headerName]) { - strippedHeaders ??= { ...resHeaders }; - delete strippedHeaders[headerName]; + value = decodeURIComponent(decoder2.decode(headerValue.subarray(7))); + } else if (input[position.position] === 34) { + position.position++; + const quotedValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 34, + // not LF, CR, or " + input, + position + ); + if (input[position.position] !== 34) { + throw parsingError("Closing quote not found"); } + position.position++; + value = decoder2.decode(quotedValue).replace(/%0A/ig, "\n").replace(/%0D/ig, "\r").replace(/%22/g, '"'); + } else { + const tokenValue = collectASequenceOfBytes( + (char) => isToken(char) && char !== 59, + // not ; + input, + position + ); + value = decoder2.decode(tokenValue); } - return strippedHeaders ?? resHeaders; - } - function isValidDate(date) { - return date instanceof Date && Number.isFinite(date.valueOf()); + return { name: attrNameStr, value }; } - module.exports = CacheHandler; - } -}); - -// node_modules/undici/lib/cache/memory-cache-store.js -var require_memory_cache_store = __commonJS({ - "node_modules/undici/lib/cache/memory-cache-store.js"(exports, module) { - "use strict"; - var { Writable } = __require("stream"); - var { EventEmitter } = __require("events"); - var { assertCacheKey, assertCacheValue } = require_cache(); - var MemoryCacheStore = class extends EventEmitter { - #maxCount = 1024; - #maxSize = 104857600; - // 100MB - #maxEntrySize = 5242880; - // 5MB - #size = 0; - #count = 0; - #entries = /* @__PURE__ */ new Map(); - #hasEmittedMaxSizeEvent = false; - /** - * @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts] - */ - constructor(opts) { - super(); - if (opts) { - if (typeof opts !== "object") { - throw new TypeError("MemoryCacheStore options must be an object"); - } - if (opts.maxCount !== void 0) { - if (typeof opts.maxCount !== "number" || !Number.isInteger(opts.maxCount) || opts.maxCount < 0) { - throw new TypeError("MemoryCacheStore options.maxCount must be a non-negative integer"); - } - this.#maxCount = opts.maxCount; - } - if (opts.maxSize !== void 0) { - if (typeof opts.maxSize !== "number" || !Number.isInteger(opts.maxSize) || opts.maxSize < 0) { - throw new TypeError("MemoryCacheStore options.maxSize must be a non-negative integer"); - } - this.#maxSize = opts.maxSize; - } - if (opts.maxEntrySize !== void 0) { - if (typeof opts.maxEntrySize !== "number" || !Number.isInteger(opts.maxEntrySize) || opts.maxEntrySize < 0) { - throw new TypeError("MemoryCacheStore options.maxEntrySize must be a non-negative integer"); - } - this.#maxEntrySize = opts.maxEntrySize; + function parseMultipartFormDataHeaders(input, position) { + let name = null; + let filename = null; + let contentType = null; + let encoding = null; + while (true) { + if (input[position.position] === 13 && input[position.position + 1] === 10) { + if (name === null) { + throw parsingError("header name is null"); } + return { name, filename, contentType, encoding }; } - } - /** - * Get the current size of the cache in bytes - * @returns {number} The current size of the cache in bytes - */ - get size() { - return this.#size; - } - /** - * Check if the cache is full (either max size or max count reached) - * @returns {boolean} True if the cache is full, false otherwise - */ - isFull() { - return this.#size >= this.#maxSize || this.#count >= this.#maxCount; - } - /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req - * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} - */ - get(key) { - assertCacheKey(key); - const topLevelKey = `${key.origin}:${key.path}`; - const now = Date.now(); - const entries = this.#entries.get(topLevelKey); - const entry = entries ? findEntry(key, entries, now) : null; - return entry == null ? void 0 : { - statusMessage: entry.statusMessage, - statusCode: entry.statusCode, - headers: entry.headers, - body: entry.body, - vary: entry.vary ? entry.vary : void 0, - etag: entry.etag, - cacheControlDirectives: entry.cacheControlDirectives, - cachedAt: entry.cachedAt, - staleAt: entry.staleAt, - deleteAt: entry.deleteAt - }; - } - /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key - * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} val - * @returns {Writable | undefined} - */ - createWriteStream(key, val) { - assertCacheKey(key); - assertCacheValue(val); - const topLevelKey = `${key.origin}:${key.path}`; - const store = this; - const entry = { ...key, ...val, body: [], size: 0 }; - return new Writable({ - write(chunk, encoding, callback) { - if (typeof chunk === "string") { - chunk = Buffer.from(chunk, encoding); - } - entry.size += chunk.byteLength; - if (entry.size >= store.#maxEntrySize) { - this.destroy(); - } else { - entry.body.push(chunk); - } - callback(null); - }, - final(callback) { - let entries = store.#entries.get(topLevelKey); - if (!entries) { - entries = []; - store.#entries.set(topLevelKey, entries); - } - const previousEntry = findEntry(key, entries, Date.now()); - if (previousEntry) { - const index2 = entries.indexOf(previousEntry); - entries.splice(index2, 1, entry); - store.#size -= previousEntry.size; - } else { - entries.push(entry); - store.#count += 1; + let headerName = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 58, + input, + position + ); + headerName = removeChars(headerName, true, true, (char) => char === 9 || char === 32); + if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { + throw parsingError("header name does not match the field-name token production"); + } + if (input[position.position] !== 58) { + throw parsingError("expected :"); + } + position.position++; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + position + ); + switch (bufferToLowerCasedHeaderName(headerName)) { + case "content-disposition": { + name = filename = null; + const dispositionType = collectASequenceOfBytes( + (char) => isToken(char), + input, + position + ); + if (dispositionType.toString("ascii").toLowerCase() !== "form-data") { + throw parsingError("expected form-data for content-disposition header"); } - store.#size += entry.size; - if (store.#size > store.#maxSize || store.#count > store.#maxCount) { - if (!store.#hasEmittedMaxSizeEvent) { - store.emit("maxSizeExceeded", { - size: store.#size, - maxSize: store.#maxSize, - count: store.#count, - maxCount: store.#maxCount - }); - store.#hasEmittedMaxSizeEvent = true; - } - for (const [key2, entries2] of store.#entries) { - for (const entry2 of entries2.splice(0, entries2.length / 2)) { - store.#size -= entry2.size; - store.#count -= 1; - } - if (entries2.length === 0) { - store.#entries.delete(key2); - } + while (position.position < input.length && input[position.position] !== 13 && input[position.position + 1] !== 10) { + const attribute = parseContentDispositionAttribute(input, position); + if (!attribute) { + break; } - if (store.#size < store.#maxSize && store.#count < store.#maxCount) { - store.#hasEmittedMaxSizeEvent = false; + if (attribute.name === "name") { + name = attribute.value; + } else if (attribute.name === "filename") { + filename = attribute.value; } } - callback(null); + if (name === null) { + throw parsingError("name attribute is required in content-disposition header"); + } + break; + } + case "content-type": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + contentType = isomorphicDecode(headerValue); + break; + } + case "content-transfer-encoding": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + encoding = isomorphicDecode(headerValue); + break; + } + default: { + collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); } - }); - } - /** - * @param {CacheKey} key - */ - delete(key) { - if (typeof key !== "object") { - throw new TypeError(`expected key to be object, got ${typeof key}`); } - const topLevelKey = `${key.origin}:${key.path}`; - for (const entry of this.#entries.get(topLevelKey) ?? []) { - this.#size -= entry.size; - this.#count -= 1; + if (input[position.position] !== 13 && input[position.position + 1] !== 10) { + throw parsingError("expected CRLF"); + } else { + position.position += 2; } - this.#entries.delete(topLevelKey); } - }; - function findEntry(key, entries, now) { - return entries.find((entry) => entry.deleteAt > now && entry.method === key.method && (entry.vary == null || Object.keys(entry.vary).every((headerName) => { - if (entry.vary[headerName] === null) { - return key.headers[headerName] === void 0; - } - return entry.vary[headerName] === key.headers[headerName]; - }))); } - module.exports = MemoryCacheStore; - } -}); - -// node_modules/undici/lib/handler/cache-revalidation-handler.js -var require_cache_revalidation_handler = __commonJS({ - "node_modules/undici/lib/handler/cache-revalidation-handler.js"(exports, module) { - "use strict"; - var assert8 = __require("assert"); - var CacheRevalidationHandler = class { - #successful = false; - /** - * @type {((boolean, any) => void) | null} - */ - #callback; - /** - * @type {(import('../../types/dispatcher.d.ts').default.DispatchHandler)} - */ - #handler; - #context; - /** - * @type {boolean} - */ - #allowErrorStatusCodes; - /** - * @param {(boolean) => void} callback Function to call if the cached value is valid - * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler - * @param {boolean} allowErrorStatusCodes - */ - constructor(callback, handler, allowErrorStatusCodes) { - if (typeof callback !== "function") { - throw new TypeError("callback must be a function"); - } - this.#callback = callback; - this.#handler = handler; - this.#allowErrorStatusCodes = allowErrorStatusCodes; - } - onRequestStart(_, context) { - this.#successful = false; - this.#context = context; - } - onRequestUpgrade(controller, statusCode, headers, socket) { - this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket); + function collectASequenceOfBytes(condition, input, position) { + let start = position.position; + while (start < input.length && condition(input[start])) { + ++start; } - onResponseStart(controller, statusCode, headers, statusMessage) { - assert8(this.#callback != null); - this.#successful = statusCode === 304 || this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504; - this.#callback(this.#successful, this.#context); - this.#callback = null; - if (this.#successful) { - return true; - } - this.#handler.onRequestStart?.(controller, this.#context); - this.#handler.onResponseStart?.( - controller, - statusCode, - headers, - statusMessage - ); + return input.subarray(position.position, position.position = start); + } + function removeChars(buf, leading, trailing, predicate) { + let lead = 0; + let trail = buf.length - 1; + if (leading) { + while (lead < buf.length && predicate(buf[lead])) lead++; } - onResponseData(controller, chunk) { - if (this.#successful) { - return; - } - return this.#handler.onResponseData?.(controller, chunk); + if (trailing) { + while (trail > 0 && predicate(buf[trail])) trail--; } - onResponseEnd(controller, trailers) { - if (this.#successful) { - return; - } - this.#handler.onResponseEnd?.(controller, trailers); + return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1); + } + function bufferStartsWith(buffer2, start, position) { + if (buffer2.length < start.length) { + return false; } - onResponseError(controller, err) { - if (this.#successful) { - return; - } - if (this.#callback) { - this.#callback(false); - this.#callback = null; - } - if (typeof this.#handler.onResponseError === "function") { - this.#handler.onResponseError(controller, err); - } else { - throw err; + for (let i = 0; i < start.length; i++) { + if (start[i] !== buffer2[position.position + i]) { + return false; } } + return true; + } + function parsingError(cause) { + return new TypeError("Failed to parse body as FormData.", { cause: new TypeError(cause) }); + } + function isCTL(char) { + return char <= 31 || char === 127; + } + function isTSpecial(char) { + return char === 40 || // ( + char === 41 || // ) + char === 60 || // < + char === 62 || // > + char === 64 || // @ + char === 44 || // , + char === 59 || // ; + char === 58 || // : + char === 92 || // \ + char === 34 || // " + char === 47 || // / + char === 91 || // [ + char === 93 || // ] + char === 63 || // ? + char === 61; + } + function isToken(char) { + return char <= 127 && // ascii + char !== 32 && // space + char !== 9 && !isCTL(char) && !isTSpecial(char); + } + module.exports = { + multipartFormDataParser, + validateBoundary }; - module.exports = CacheRevalidationHandler; } }); -// node_modules/undici/lib/interceptor/cache.js -var require_cache2 = __commonJS({ - "node_modules/undici/lib/interceptor/cache.js"(exports, module) { +// node_modules/undici/lib/util/runtime-features.js +var require_runtime_features = __commonJS({ + "node_modules/undici/lib/util/runtime-features.js"(exports, module) { "use strict"; - var assert8 = __require("assert"); - var { Readable } = __require("stream"); - var util2 = require_util(); - var CacheHandler = require_cache_handler(); - var MemoryCacheStore = require_memory_cache_store(); - var CacheRevalidationHandler = require_cache_revalidation_handler(); - var { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders: normalizeHeaders3, parseCacheControlHeader } = require_cache(); - var { AbortError } = require_errors(); - function assertCacheOrigins(origins, name) { - if (origins === void 0) return; - if (!Array.isArray(origins)) { - throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`); - } - for (let i = 0; i < origins.length; i++) { - const origin = origins[i]; - if (typeof origin !== "string" && !(origin instanceof RegExp)) { - throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`); + var lazyLoaders = { + __proto__: null, + "node:crypto": () => __require("crypto"), + "node:sqlite": () => __require("sqlite") + }; + function detectRuntimeFeatureByNodeModule(moduleName) { + try { + lazyLoaders[moduleName](); + return true; + } catch (err) { + if (err.code !== "ERR_UNKNOWN_BUILTIN_MODULE" && err.code !== "ERR_NO_CRYPTO") { + throw err; } + return false; } } - var nop = () => { - }; - function needsRevalidation(result, cacheControlDirectives, { headers = {} }) { - if (cacheControlDirectives?.["no-cache"]) { - return true; + var runtimeFeaturesAsNodeModule = ( + /** @type {const} */ + ["crypto", "sqlite"] + ); + function detectRuntimeFeature(feature) { + if (runtimeFeaturesAsNodeModule.includes( + /** @type {RuntimeFeatureByNodeModule} */ + feature + )) { + return detectRuntimeFeatureByNodeModule(`node:${feature}`); } - if (result.cacheControlDirectives?.["no-cache"] && !Array.isArray(result.cacheControlDirectives["no-cache"])) { - return true; + throw new TypeError(`unknown feature: ${feature}`); + } + var RuntimeFeatures = class { + /** @type {Map} */ + #map = /* @__PURE__ */ new Map(); + /** + * Clears all cached feature detections. + */ + clear() { + this.#map.clear(); } - if (headers["if-modified-since"] || headers["if-none-match"]) { - return true; + /** + * @param {Feature} feature + * @returns {boolean} + */ + has(feature) { + return this.#map.get(feature) ?? this.#detectRuntimeFeature(feature); } - return false; - } - function isStale(result, cacheControlDirectives) { - const now = Date.now(); - if (now > result.staleAt) { - if (cacheControlDirectives?.["max-stale"]) { - const gracePeriod = result.staleAt + cacheControlDirectives["max-stale"] * 1e3; - return now > gracePeriod; + /** + * @param {Feature} feature + * @param {boolean} value + */ + set(feature, value) { + if (runtimeFeaturesAsNodeModule.includes(feature) === false) { + throw new TypeError(`unknown feature: ${feature}`); } - return true; + this.#map.set(feature, value); } - if (cacheControlDirectives?.["min-fresh"]) { - const timeLeftTillStale = result.staleAt - now; - const threshold = cacheControlDirectives["min-fresh"] * 1e3; - return timeLeftTillStale <= threshold; + /** + * @param {Feature} feature + * @returns {boolean} + */ + #detectRuntimeFeature(feature) { + const result = detectRuntimeFeature(feature); + this.#map.set(feature, result); + return result; } - return false; + }; + var instance = new RuntimeFeatures(); + module.exports.runtimeFeatures = instance; + module.exports.default = instance; + } +}); + +// node_modules/undici/lib/web/fetch/body.js +var require_body = __commonJS({ + "node_modules/undici/lib/web/fetch/body.js"(exports, module) { + "use strict"; + var util2 = require_util(); + var { + ReadableStreamFrom, + readableStreamClose, + fullyReadBody, + extractMimeType + } = require_util2(); + var { FormData: FormData2, setFormDataState } = require_formdata(); + var { webidl } = require_webidl(); + var assert8 = __require("assert"); + var { isErrored, isDisturbed } = __require("stream"); + var { isUint8Array } = __require("util/types"); + var { serializeAMimeType } = require_data_url(); + var { multipartFormDataParser } = require_formdata_parser(); + var { parseJSONFromBytes } = require_infra(); + var { utf8DecodeBytes } = require_encoding(); + var { runtimeFeatures } = require_runtime_features(); + var random = runtimeFeatures.has("crypto") ? __require("crypto").randomInt : (max) => Math.floor(Math.random() * max); + var textEncoder = new TextEncoder(); + function noop() { } - function withinStaleWhileRevalidateWindow(result) { - const staleWhileRevalidate = result.cacheControlDirectives?.["stale-while-revalidate"]; - if (!staleWhileRevalidate) { - return false; + var streamRegistry = new FinalizationRegistry((weakRef) => { + const stream = weakRef.deref(); + if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { + stream.cancel("Response object has been garbage collected").catch(noop); } - const now = Date.now(); - const staleWhileRevalidateExpiry = result.staleAt + staleWhileRevalidate * 1e3; - return now <= staleWhileRevalidateExpiry; - } - function handleUncachedResponse(dispatch, globalOpts, cacheKey2, handler, opts, reqCacheControl) { - if (reqCacheControl?.["only-if-cached"]) { - let aborted = false; - const controller = { - paused: false, - rawHeaders: [], - rawTrailers: [], - pause() { - this.paused = true; + }); + function extractBody(object, keepalive = false) { + let stream = null; + let controller = null; + if (webidl.is.ReadableStream(object)) { + stream = object; + } else if (webidl.is.Blob(object)) { + stream = object.stream(); + } else { + stream = new ReadableStream({ + pull() { }, - resume() { - this.paused = false; + start(c2) { + controller = c2; }, - abort: (reason) => { - aborted = true; - handler.onResponseError?.(controller, reason ?? new AbortError()); - } - }; - try { - handler.onRequestStart?.(controller, null); - if (aborted) { - return; - } - handler.onResponseStart?.(controller, 504, {}, "Gateway Timeout"); - if (aborted) { - return; - } - handler.onResponseEnd?.(controller, {}); - } catch (err) { - if (typeof handler.onResponseError === "function") { - handler.onResponseError(controller, err); - } - } - return true; + cancel() { + }, + type: "bytes" + }); } - return dispatch(opts, new CacheHandler(globalOpts, cacheKey2, handler)); - } - function sendCachedValue(handler, opts, result, age, context, isStale2) { - const stream = util2.isStream(result.body) ? result.body : Readable.from(result.body ?? []); - assert8(!stream.destroyed, "stream should not be destroyed"); - assert8(!stream.readableDidRead, "stream should not be readableDidRead"); - const controller = { - rawHeaders: [], - rawTrailers: [], - resume() { - stream.resume(); - }, - pause() { - stream.pause(); - }, - get paused() { - return stream.isPaused(); - }, - get aborted() { - return stream.destroyed; - }, - get reason() { - return stream.errored; - }, - abort(reason) { - stream.destroy(reason ?? new AbortError()); - } - }; - stream.on("error", function(err) { - if (!this.readableEnded) { - if (typeof handler.onResponseError === "function") { - handler.onResponseError(controller, err); + assert8(webidl.is.ReadableStream(stream)); + let action = null; + let source = null; + let length = null; + let type = null; + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; + } else if (webidl.is.URLSearchParams(object)) { + source = object.toString(); + type = "application/x-www-form-urlencoded;charset=UTF-8"; + } else if (webidl.is.BufferSource(object)) { + source = webidl.util.getCopyOfBytesHeldByBufferSource(object); + } else if (webidl.is.FormData(object)) { + const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, "0")}`; + const prefix = `--${boundary}\r +Content-Disposition: form-data`; + const formdataEscape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); + const blobParts = []; + const rn = new Uint8Array([13, 10]); + length = 0; + let hasUnknownSizeValue = false; + for (const [name, value] of object) { + if (typeof value === "string") { + const chunk2 = textEncoder.encode(prefix + `; name="${formdataEscape(normalizeLinefeeds(name))}"\r +\r +${normalizeLinefeeds(value)}\r +`); + blobParts.push(chunk2); + length += chunk2.byteLength; } else { - throw err; + const chunk2 = textEncoder.encode(`${prefix}; name="${formdataEscape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${formdataEscape(value.name)}"` : "") + `\r +Content-Type: ${value.type || "application/octet-stream"}\r +\r +`); + blobParts.push(chunk2, value, rn); + if (typeof value.size === "number") { + length += chunk2.byteLength + value.size + rn.byteLength; + } else { + hasUnknownSizeValue = true; + } + } + } + const chunk = textEncoder.encode(`--${boundary}--\r +`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; + } + source = object; + action = async function* () { + for (const part of blobParts) { + if (part.stream) { + yield* part.stream(); + } else { + yield part; + } } + }; + type = `multipart/form-data; boundary=${boundary}`; + } else if (webidl.is.Blob(object)) { + source = object; + length = object.size; + if (object.type) { + type = object.type; } - }).on("close", function() { - if (!this.errored) { - handler.onResponseEnd?.(controller, {}); + } else if (typeof object[Symbol.asyncIterator] === "function") { + if (keepalive) { + throw new TypeError("keepalive"); } - }); - handler.onRequestStart?.(controller, context); - if (stream.destroyed) { - return; + if (util2.isDisturbed(object) || object.locked) { + throw new TypeError( + "Response body object should not be disturbed or locked" + ); + } + stream = webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object); } - const headers = { ...result.headers, age: String(age) }; - if (isStale2) { - headers.warning = '110 - "response is stale"'; + if (typeof source === "string" || isUint8Array(source)) { + action = () => { + length = typeof source === "string" ? Buffer.byteLength(source) : source.length; + return source; + }; } - controller.rawHeaders = util2.toRawHeaders(headers); - handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage); - if (opts.method === "HEAD") { - stream.destroy(); - } else { - stream.on("data", function(chunk) { - handler.onResponseData?.(controller, chunk); - }); + if (action != null) { + ; + (async () => { + const result = action(); + const iterator = result?.[Symbol.asyncIterator]?.(); + if (iterator) { + for await (const bytes of iterator) { + if (isErrored(stream)) break; + if (bytes.length) { + controller.enqueue(new Uint8Array(bytes)); + } + } + } else if (result?.length && !isErrored(stream)) { + controller.enqueue(typeof result === "string" ? textEncoder.encode(result) : new Uint8Array(result)); + } + queueMicrotask(() => readableStreamClose(controller)); + })(); } + const body = { stream, source, length }; + return [body, type]; } - function handleResult2(dispatch, globalOpts, cacheKey2, handler, opts, reqCacheControl, result) { - if (!result) { - return handleUncachedResponse(dispatch, globalOpts, cacheKey2, handler, opts, reqCacheControl); - } - const now = Date.now(); - if (now > result.deleteAt) { - return dispatch(opts, new CacheHandler(globalOpts, cacheKey2, handler)); - } - const age = Math.round((now - result.cachedAt) / 1e3); - if (reqCacheControl?.["max-age"] && age >= reqCacheControl["max-age"]) { - return dispatch(opts, handler); + function safelyExtractBody(object, keepalive = false) { + if (webidl.is.ReadableStream(object)) { + assert8(!util2.isDisturbed(object), "The body has already been consumed."); + assert8(!object.locked, "The stream is locked."); } - const stale = isStale(result, reqCacheControl); - const revalidate = needsRevalidation(result, reqCacheControl, opts); - if (stale || revalidate) { - if (util2.isStream(opts.body) && util2.bodyLength(opts.body) !== 0) { - return dispatch(opts, new CacheHandler(globalOpts, cacheKey2, handler)); - } - if (!revalidate && withinStaleWhileRevalidateWindow(result)) { - sendCachedValue(handler, opts, result, age, null, true); - queueMicrotask(() => { - const headers2 = { - ...opts.headers, - "if-modified-since": new Date(result.cachedAt).toUTCString() - }; - if (result.etag) { - headers2["if-none-match"] = result.etag; + return extractBody(object, keepalive); + } + function cloneBody(body) { + const { 0: out1, 1: out2 } = body.stream.tee(); + body.stream = out1; + return { + stream: out2, + length: body.length, + source: body.source + }; + } + function bodyMixinMethods(instance, getInternalState) { + const methods = { + blob() { + return consumeBody(this, (bytes) => { + let mimeType = bodyMimeType(getInternalState(this)); + if (mimeType === null) { + mimeType = ""; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); } - if (result.vary) { - for (const key in result.vary) { - if (result.vary[key] != null) { - headers2[key] = result.vary[key]; + return new Blob([bytes], { type: mimeType }); + }, instance, getInternalState); + }, + arrayBuffer() { + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer; + }, instance, getInternalState); + }, + text() { + return consumeBody(this, utf8DecodeBytes, instance, getInternalState); + }, + json() { + return consumeBody(this, parseJSONFromBytes, instance, getInternalState); + }, + formData() { + return consumeBody(this, (value) => { + const mimeType = bodyMimeType(getInternalState(this)); + if (mimeType !== null) { + switch (mimeType.essence) { + case "multipart/form-data": { + const parsed = multipartFormDataParser(value, mimeType); + const fd = new FormData2(); + setFormDataState(fd, parsed); + return fd; + } + case "application/x-www-form-urlencoded": { + const entries = new URLSearchParams(value.toString()); + const fd = new FormData2(); + for (const [name, value2] of entries) { + fd.append(name, value2); + } + return fd; } } } - dispatch( - { - ...opts, - headers: headers2 - }, - new CacheHandler(globalOpts, cacheKey2, { - // Silent handler that just updates the cache - onRequestStart() { - }, - onRequestUpgrade() { - }, - onResponseStart() { - }, - onResponseData() { - }, - onResponseEnd() { - }, - onResponseError() { - } - }) + throw new TypeError( + 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' ); - }); - return true; - } - let withinStaleIfErrorThreshold = false; - const staleIfErrorExpiry = result.cacheControlDirectives["stale-if-error"] ?? reqCacheControl?.["stale-if-error"]; - if (staleIfErrorExpiry) { - withinStaleIfErrorThreshold = now < result.staleAt + staleIfErrorExpiry * 1e3; - } - const headers = { - ...opts.headers, - "if-modified-since": new Date(result.cachedAt).toUTCString() - }; - if (result.etag) { - headers["if-none-match"] = result.etag; + }, instance, getInternalState); + }, + bytes() { + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes); + }, instance, getInternalState); } - if (result.vary) { - for (const key in result.vary) { - if (result.vary[key] != null) { - headers[key] = result.vary[key]; - } - } + }; + return methods; + } + function mixinBody(prototype, getInternalState) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype, getInternalState)); + } + function consumeBody(object, convertBytesToJSValue, instance, getInternalState) { + try { + webidl.brandCheck(object, instance); + } catch (e7) { + return Promise.reject(e7); + } + object = getInternalState(object); + if (bodyUnusable(object)) { + return Promise.reject(new TypeError("Body is unusable: Body has already been read")); + } + const promise = Promise.withResolvers(); + const errorSteps = promise.reject; + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e7) { + errorSteps(e7); } - return dispatch( - { - ...opts, - headers - }, - new CacheRevalidationHandler( - (success, context) => { - if (success) { - sendCachedValue(handler, opts, result, age, context, stale); - } else if (util2.isStream(result.body)) { - result.body.on("error", nop).destroy(); - } - }, - new CacheHandler(globalOpts, cacheKey2, handler), - withinStaleIfErrorThreshold - ) - ); + }; + if (object.body == null) { + successSteps(Buffer.allocUnsafe(0)); + return promise.promise; } - if (util2.isStream(opts.body)) { - opts.body.on("error", nop).destroy(); + fullyReadBody(object.body, successSteps, errorSteps); + return promise.promise; + } + function bodyUnusable(object) { + const body = object.body; + return body != null && (body.stream.locked || util2.isDisturbed(body.stream)); + } + function bodyMimeType(requestOrResponse) { + const headers = requestOrResponse.headersList; + const mimeType = extractMimeType(headers); + if (mimeType === "failure") { + return null; } - sendCachedValue(handler, opts, result, age, null, false); + return mimeType; } - module.exports = (opts = {}) => { - const { - store = new MemoryCacheStore(), - methods = ["GET"], - cacheByDefault = void 0, - type = "shared", - origins = void 0 - } = opts; - if (typeof opts !== "object" || opts === null) { - throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? "null" : typeof opts}`); + module.exports = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody, + streamRegistry, + bodyUnusable + }; + } +}); + +// node_modules/undici/lib/dispatcher/client-h1.js +var require_client_h1 = __commonJS({ + "node_modules/undici/lib/dispatcher/client-h1.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var util2 = require_util(); + var { channels } = require_diagnostics(); + var timers = require_timers(); + var { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError + } = require_errors(); + var { + kUrl, + kReset, + kClient, + kParser, + kBlocking, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kMaxRequests, + kCounter, + kMaxResponseSize, + kOnError, + kResume, + kHTTPContext, + kClosed + } = require_symbols(); + var constants = require_constants3(); + var EMPTY_BUF = Buffer.alloc(0); + var FastBuffer = Buffer[Symbol.species]; + var removeAllListeners = util2.removeAllListeners; + var extractBody; + function lazyllhttp() { + const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0; + let mod5; + let useWasmSIMD = process.arch !== "ppc64"; + if (process.env.UNDICI_NO_WASM_SIMD === "1") { + useWasmSIMD = true; + } else if (process.env.UNDICI_NO_WASM_SIMD === "0") { + useWasmSIMD = false; } - assertCacheStore(store, "opts.store"); - assertCacheMethods(methods, "opts.methods"); - assertCacheOrigins(origins, "opts.origins"); - if (typeof cacheByDefault !== "undefined" && typeof cacheByDefault !== "number") { - throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`); + if (useWasmSIMD) { + try { + mod5 = new WebAssembly.Module(require_llhttp_simd_wasm()); + } catch { + } } - if (typeof type !== "undefined" && type !== "shared" && type !== "private") { - throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`); + if (!mod5) { + mod5 = new WebAssembly.Module(llhttpWasmData || require_llhttp_wasm()); } - const globalOpts = { - store, - methods, - cacheByDefault, - type - }; - const safeMethodsToNotCache = util2.safeHTTPMethods.filter((method) => methods.includes(method) === false); - return (dispatch) => { - return (opts2, handler) => { - if (!opts2.origin || safeMethodsToNotCache.includes(opts2.method)) { - return dispatch(opts2, handler); + return new WebAssembly.Instance(mod5, { + env: { + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_url: (p, at, len) => { + return 0; + }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_status: (p, at, len) => { + assert8(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)); + }, + /** + * @param {number} p + * @returns {number} + */ + wasm_on_message_begin: (p) => { + assert8(currentParser.ptr === p); + return currentParser.onMessageBegin(); + }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_header_field: (p, at, len) => { + assert8(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)); + }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_header_value: (p, at, len) => { + assert8(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)); + }, + /** + * @param {number} p + * @param {number} statusCode + * @param {0|1} upgrade + * @param {0|1} shouldKeepAlive + * @returns {number} + */ + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert8(currentParser.ptr === p); + return currentParser.onHeadersComplete(statusCode, upgrade === 1, shouldKeepAlive === 1); + }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_body: (p, at, len) => { + assert8(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)); + }, + /** + * @param {number} p + * @returns {number} + */ + wasm_on_message_complete: (p) => { + assert8(currentParser.ptr === p); + return currentParser.onMessageComplete(); } - if (origins !== void 0) { - const requestOrigin = opts2.origin.toString().toLowerCase(); - let isAllowed = false; - for (let i = 0; i < origins.length; i++) { - const allowed = origins[i]; - if (typeof allowed === "string") { - if (allowed.toLowerCase() === requestOrigin) { - isAllowed = true; - break; - } - } else if (allowed.test(requestOrigin)) { - isAllowed = true; - break; - } - } - if (!isAllowed) { - return dispatch(opts2, handler); - } + } + }); + } + var llhttpInstance = null; + var currentParser = null; + var currentBufferRef = null; + var currentBufferSize = 0; + var currentBufferPtr = null; + var USE_NATIVE_TIMER = 0; + var USE_FAST_TIMER = 1; + var TIMEOUT_HEADERS = 2 | USE_FAST_TIMER; + var TIMEOUT_BODY = 4 | USE_FAST_TIMER; + var TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER; + var Parser = class { + /** + * @param {import('./client.js')} client + * @param {import('net').Socket} socket + * @param {*} llhttp + */ + constructor(client, socket, { exports: exports2 }) { + this.llhttp = exports2; + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + this.client = client; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = 0; + this.statusText = ""; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); + this.bytesRead = 0; + this.keepAlive = ""; + this.contentLength = ""; + this.connection = ""; + this.maxResponseSize = client[kMaxResponseSize]; + } + setTimeout(delay, type) { + if (delay !== this.timeoutValue || type & USE_FAST_TIMER ^ this.timeoutType & USE_FAST_TIMER) { + if (this.timeout) { + timers.clearTimeout(this.timeout); + this.timeout = null; } - opts2 = { - ...opts2, - headers: normalizeHeaders3(opts2) - }; - const reqCacheControl = opts2.headers?.["cache-control"] ? parseCacheControlHeader(opts2.headers["cache-control"]) : void 0; - if (reqCacheControl?.["no-store"]) { - return dispatch(opts2, handler); + if (delay) { + if (type & USE_FAST_TIMER) { + this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)); + } else { + this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)); + this.timeout?.unref(); + } } - const cacheKey2 = makeCacheKey(opts2); - const result = store.get(cacheKey2); - if (result && typeof result.then === "function") { - return result.then((result2) => handleResult2( - dispatch, - globalOpts, - cacheKey2, - handler, - opts2, - reqCacheControl, - result2 - )); - } else { - return handleResult2( - dispatch, - globalOpts, - cacheKey2, - handler, - opts2, - reqCacheControl, - result - ); + this.timeoutValue = delay; + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); } - }; - }; - }; - } -}); - -// node_modules/undici/lib/interceptor/decompress.js -var require_decompress = __commonJS({ - "node_modules/undici/lib/interceptor/decompress.js"(exports, module) { - "use strict"; - var { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = __require("zlib"); - var { pipeline } = __require("stream"); - var DecoratorHandler = require_decorator_handler(); - var supportedEncodings = { - gzip: createGunzip, - "x-gzip": createGunzip, - br: createBrotliDecompress, - deflate: createInflate, - compress: createInflate, - "x-compress": createInflate, - zstd: createZstdDecompress - }; - var defaultSkipStatusCodes = ( - /** @type {const} */ - [204, 304] - ); - var warningEmitted = ( - /** @type {boolean} */ - false - ); - var DecompressHandler = class extends DecoratorHandler { - /** @type {Transform[]} */ - #decompressors = []; - /** @type {Readonly} */ - #skipStatusCodes; - /** @type {boolean} */ - #skipErrorResponses; - constructor(handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) { - super(handler); - this.#skipStatusCodes = skipStatusCodes; - this.#skipErrorResponses = skipErrorResponses; - } - /** - * Determines if decompression should be skipped based on encoding and status code - * @param {string} contentEncoding - Content-Encoding header value - * @param {number} statusCode - HTTP status code of the response - * @returns {boolean} - True if decompression should be skipped - */ - #shouldSkipDecompression(contentEncoding, statusCode) { - if (!contentEncoding || statusCode < 200) return true; - if (this.#skipStatusCodes.includes(statusCode)) return true; - if (this.#skipErrorResponses && statusCode >= 400) return true; - return false; + } + this.timeoutType = type; } - /** - * Creates a chain of decompressors for multiple content encodings - * - * @param {string} encodings - Comma-separated list of content encodings - * @returns {Array} - Array of decompressor streams - * @throws {Error} - If the number of content-encodings exceeds the maximum allowed - */ - #createDecompressionChain(encodings) { - const parts = encodings.split(","); - const maxContentEncodings = 5; - if (parts.length > maxContentEncodings) { - throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`); + resume() { + if (this.socket.destroyed || !this.paused) { + return; } - const decompressors = []; - for (let i = parts.length - 1; i >= 0; i--) { - const encoding = parts[i].trim(); - if (!encoding) continue; - if (!supportedEncodings[encoding]) { - decompressors.length = 0; - return decompressors; + assert8(this.ptr != null); + assert8(currentParser === null); + this.llhttp.llhttp_resume(this.ptr); + assert8(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); } - decompressors.push(supportedEncodings[encoding]()); } - return decompressors; + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); + this.readMore(); } - /** - * Sets up event handlers for a decompressor stream using readable events - * @param {DecompressorStream} decompressor - The decompressor stream - * @param {Controller} controller - The controller to coordinate with - * @returns {void} - */ - #setupDecompressorEvents(decompressor, controller) { - decompressor.on("readable", () => { - let chunk; - while ((chunk = decompressor.read()) !== null) { - const result = super.onResponseData(controller, chunk); - if (result === false) { - break; - } + readMore() { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break; } - }); - decompressor.on("error", (error) => { - super.onResponseError(controller, error); - }); - } - /** - * Sets up event handling for a single decompressor - * @param {Controller} controller - The controller to handle events - * @returns {void} - */ - #setupSingleDecompressor(controller) { - const decompressor = this.#decompressors[0]; - this.#setupDecompressorEvents(decompressor, controller); - decompressor.on("end", () => { - super.onResponseEnd(controller, {}); - }); + this.execute(chunk); + } } /** - * Sets up event handling for multiple chained decompressors using pipeline - * @param {Controller} controller - The controller to handle events - * @returns {void} + * @param {Buffer} chunk */ - #setupMultipleDecompressors(controller) { - const lastDecompressor = this.#decompressors[this.#decompressors.length - 1]; - this.#setupDecompressorEvents(lastDecompressor, controller); - pipeline(this.#decompressors, (err) => { - if (err) { - super.onResponseError(controller, err); - return; + execute(chunk) { + assert8(currentParser === null); + assert8(this.ptr != null); + assert8(!this.paused); + const { socket, llhttp } = this; + if (chunk.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); } - super.onResponseEnd(controller, {}); - }); - } - /** - * Cleans up decompressor references to prevent memory leaks - * @returns {void} - */ - #cleanupDecompressors() { - this.#decompressors.length = 0; - } - /** - * @param {Controller} controller - * @param {number} statusCode - * @param {Record} headers - * @param {string} statusMessage - * @returns {void} - */ - onResponseStart(controller, statusCode, headers, statusMessage) { - const contentEncoding = headers["content-encoding"]; - if (this.#shouldSkipDecompression(contentEncoding, statusCode)) { - return super.onResponseStart(controller, statusCode, headers, statusMessage); - } - const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase()); - if (decompressors.length === 0) { - this.#cleanupDecompressors(); - return super.onResponseStart(controller, statusCode, headers, statusMessage); + currentBufferSize = Math.ceil(chunk.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); } - this.#decompressors = decompressors; - const { "content-encoding": _, "content-length": __, ...newHeaders } = headers; - if (controller?.rawHeaders) { - const rawHeaders = controller.rawHeaders; - if (Array.isArray(rawHeaders)) { - const filteredHeaders = []; - for (let i = 0; i < rawHeaders.length; i += 2) { - const headerName = rawHeaders[i]; - const name = Buffer.isBuffer(headerName) ? headerName.toString("latin1") : `${headerName}`; - const lowerName = name.toLowerCase(); - if (lowerName === "content-encoding" || lowerName === "content-length") { - continue; - } - filteredHeaders.push(rawHeaders[i], rawHeaders[i + 1]); - } - controller.rawHeaders = filteredHeaders; - } else if (typeof rawHeaders === "object") { - for (const name of Object.keys(rawHeaders)) { - const lowerName = name.toLowerCase(); - if (lowerName === "content-encoding" || lowerName === "content-length") { - delete rawHeaders[name]; + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(chunk); + try { + let ret; + try { + currentBufferRef = chunk; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length); + } finally { + currentParser = null; + currentBufferRef = null; + } + if (ret !== constants.ERROR.OK) { + const data = chunk.subarray(llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr); + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data); + } else { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ""; + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; } + throw new HTTPParserError(message, constants.ERROR[ret], data); } } + } catch (err) { + util2.destroy(socket, err); } - if (this.#decompressors.length === 1) { - this.#setupSingleDecompressor(controller); - } else { - this.#setupMultipleDecompressors(controller); - } - return super.onResponseStart(controller, statusCode, newHeaders, statusMessage); + } + destroy() { + assert8(currentParser === null); + assert8(this.ptr != null); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; + this.timeout && timers.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.paused = false; } /** - * @param {Controller} controller - * @param {Buffer} chunk - * @returns {void} + * @param {Buffer} buf + * @returns {0} */ - onResponseData(controller, chunk) { - if (this.#decompressors.length > 0) { - this.#decompressors[0].write(chunk); - return; - } - super.onResponseData(controller, chunk); + onStatus(buf) { + this.statusText = buf.toString(); + return 0; } /** - * @param {Controller} controller - * @param {Record | undefined} trailers - * @returns {void} + * @returns {0|-1} */ - onResponseEnd(controller, trailers) { - if (this.#decompressors.length > 0) { - this.#decompressors[0].end(); - this.#cleanupDecompressors(); - return; + onMessageBegin() { + const { socket, client } = this; + if (socket.destroyed) { + return -1; } - super.onResponseEnd(controller, trailers); + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; + } + request.onResponseStarted(); + return 0; } /** - * @param {Controller} controller - * @param {Error} err - * @returns {void} + * @param {Buffer} buf + * @returns {number} */ - onResponseError(controller, err) { - if (this.#decompressors.length > 0) { - for (const decompressor of this.#decompressors) { - decompressor.destroy(err); - } - this.#cleanupDecompressors(); + onHeaderField(buf) { + const len = this.headers.length; + if ((len & 1) === 0) { + this.headers.push(buf); + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } - super.onResponseError(controller, err); - } - }; - function createDecompressInterceptor(options = {}) { - if (!warningEmitted) { - process.emitWarning( - "DecompressInterceptor is experimental and subject to change", - "ExperimentalWarning" - ); - warningEmitted = true; + this.trackHeader(buf.length); + return 0; } - return (dispatch) => { - return (opts, handler) => { - const decompressHandler = new DecompressHandler(handler, options); - return dispatch(opts, decompressHandler); - }; - }; - } - module.exports = createDecompressInterceptor; - } -}); - -// node_modules/undici/lib/handler/deduplication-handler.js -var require_deduplication_handler = __commonJS({ - "node_modules/undici/lib/handler/deduplication-handler.js"(exports, module) { - "use strict"; - var { RequestAbortedError } = require_errors(); - var DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024; - var DeduplicationHandler = class { - /** - * @type {DispatchHandler} - */ - #primaryHandler; - /** - * @type {WaitingHandler[]} - */ - #waitingHandlers = []; - /** - * @type {number} - */ - #maxBufferSize = DEFAULT_MAX_BUFFER_SIZE; /** - * @type {number} - */ - #statusCode = 0; - /** - * @type {Record} - */ - #headers = {}; - /** - * @type {string} - */ - #statusMessage = ""; - /** - * @type {boolean} - */ - #aborted = false; - /** - * @type {boolean} - */ - #responseStarted = false; - /** - * @type {boolean} - */ - #responseDataStarted = false; - /** - * @type {boolean} - */ - #completed = false; - /** - * @type {import('../../types/dispatcher.d.ts').default.DispatchController | null} - */ - #controller = null; - /** - * @type {(() => void) | null} + * @param {Buffer} buf + * @returns {number} */ - #onComplete = null; + onHeaderValue(buf) { + let len = this.headers.length; + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + const key = this.headers[len - 2]; + if (key.length === 10) { + const headerName = util2.bufferToLowerCasedHeaderName(key); + if (headerName === "keep-alive") { + this.keepAlive += buf.toString(); + } else if (headerName === "connection") { + this.connection += buf.toString(); + } + } else if (key.length === 14 && util2.bufferToLowerCasedHeaderName(key) === "content-length") { + this.contentLength += buf.toString(); + } + this.trackHeader(buf.length); + return 0; + } /** - * @param {DispatchHandler} primaryHandler The primary handler - * @param {() => void} onComplete Callback when request completes - * @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler + * @param {number} len */ - constructor(primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) { - this.#primaryHandler = primaryHandler; - this.#onComplete = onComplete; - this.#maxBufferSize = maxBufferSize; + trackHeader(len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util2.destroy(this.socket, new HeadersOverflowError()); + } } /** - * Add a waiting handler that will receive response events. - * Returns false if deduplication can no longer safely attach this handler. - * - * @param {DispatchHandler} handler - * @returns {boolean} + * @param {Buffer} head */ - addWaitingHandler(handler) { - if (this.#completed || this.#responseDataStarted) { - return false; - } - const waitingHandler = this.#createWaitingHandler(handler); - const waitingController = waitingHandler.controller; - try { - handler.onRequestStart?.(waitingController, null); - if (waitingController.aborted) { - waitingHandler.done = true; - return true; - } - if (this.#responseStarted) { - handler.onResponseStart?.( - waitingController, - this.#statusCode, - this.#headers, - this.#statusMessage - ); - } - } catch { - waitingHandler.done = true; - return true; - } - if (!waitingController.aborted) { - this.#waitingHandlers.push(waitingHandler); + onUpgrade(head) { + const { upgrade, client, socket, headers, statusCode } = this; + assert8(upgrade); + assert8(client[kSocket] === socket); + assert8(!socket.destroyed); + assert8(!this.paused); + assert8((headers.length & 1) === 0); + const request = client[kQueue][client[kRunningIdx]]; + assert8(request); + assert8(request.upgrade || request.method === "CONNECT"); + this.statusCode = 0; + this.statusText = ""; + this.shouldKeepAlive = false; + this.headers = []; + this.headersSize = 0; + socket.unshift(head); + socket[kParser].destroy(); + socket[kParser] = null; + socket[kClient] = null; + socket[kError] = null; + removeAllListeners(socket); + client[kSocket] = null; + client[kHTTPContext] = null; + client[kQueue][client[kRunningIdx]++] = null; + client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); + try { + request.onRequestUpgrade(statusCode, headers, socket); + } catch (err) { + util2.destroy(socket, err); } - return true; - } - /** - * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller - * @param {any} context - */ - onRequestStart(controller, context) { - this.#controller = controller; - this.#primaryHandler.onRequestStart?.(controller, context); - } - /** - * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller - * @param {number} statusCode - * @param {import('../../types/header.d.ts').IncomingHttpHeaders} headers - * @param {Socket} socket - */ - onRequestUpgrade(controller, statusCode, headers, socket) { - this.#primaryHandler.onRequestUpgrade?.(controller, statusCode, headers, socket); + client[kResume](); } /** - * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller * @param {number} statusCode - * @param {Record} headers - * @param {string} statusMessage + * @param {boolean} upgrade + * @param {boolean} shouldKeepAlive + * @returns {number} */ - onResponseStart(controller, statusCode, headers, statusMessage) { - this.#responseStarted = true; - this.#statusCode = statusCode; - this.#headers = headers; - this.#statusMessage = statusMessage; - this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage); - for (const waitingHandler of this.#waitingHandlers) { - const { handler, controller: waitingController } = waitingHandler; - if (waitingHandler.done || waitingController.aborted) { - waitingHandler.done = true; - continue; + onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; + } + assert8(!this.upgrade); + assert8(this.statusCode < 200); + if (statusCode === 100) { + util2.destroy(socket, new SocketError("bad response", util2.getSocketInfo(socket))); + return -1; + } + if (upgrade && !request.upgrade) { + util2.destroy(socket, new SocketError("bad upgrade", util2.getSocketInfo(socket))); + return -1; + } + assert8(this.timeoutType === TIMEOUT_HEADERS); + this.statusCode = statusCode; + this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. + request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); } - try { - handler.onResponseStart?.( - waitingController, - statusCode, - headers, - statusMessage + } + if (request.method === "CONNECT") { + assert8(client[kRunning] === 1); + this.upgrade = true; + return 2; + } + if (upgrade) { + assert8(client[kRunning] === 1); + this.upgrade = true; + return 2; + } + assert8((this.headers.length & 1) === 0); + this.headers = []; + this.headersSize = 0; + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util2.parseKeepAliveTimeout(this.keepAlive) : null; + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] ); - } catch { - } - if (waitingController.aborted) { - waitingHandler.done = true; + if (timeout <= 0) { + socket[kReset] = true; + } else { + client[kKeepAliveTimeoutValue] = timeout; + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; } + } else { + socket[kReset] = true; } - this.#pruneDoneWaitingHandlers(); + const pause = request.onResponseStart(statusCode, headers, this.resume, statusText) === false; + if (request.aborted) { + return -1; + } + if (request.method === "HEAD") { + return 1; + } + if (statusCode < 200) { + return 1; + } + if (socket[kBlocking]) { + socket[kBlocking] = false; + client[kResume](); + } + return pause ? constants.ERROR.PAUSED : 0; } /** - * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller - * @param {Buffer} chunk + * @param {Buffer} buf + * @returns {number} */ - onResponseData(controller, chunk) { - if (this.#aborted || this.#completed) { - return; + onBody(buf) { + const { client, socket, statusCode, maxResponseSize } = this; + if (socket.destroyed) { + return -1; } - this.#responseDataStarted = true; - this.#primaryHandler.onResponseData?.(controller, chunk); - for (const waitingHandler of this.#waitingHandlers) { - const { handler, controller: waitingController } = waitingHandler; - if (waitingHandler.done || waitingController.aborted) { - waitingHandler.done = true; - continue; - } - if (waitingController.paused) { - this.#bufferWaitingChunk(waitingHandler, chunk); - continue; - } - try { - handler.onResponseData?.(waitingController, chunk); - } catch { - } - if (waitingController.aborted) { - waitingHandler.done = true; - waitingHandler.bufferedChunks = []; - waitingHandler.bufferedBytes = 0; + const request = client[kQueue][client[kRunningIdx]]; + assert8(request); + assert8(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); } } - this.#pruneDoneWaitingHandlers(); + assert8(statusCode >= 200); + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util2.destroy(socket, new ResponseExceededMaxSizeError()); + return -1; + } + this.bytesRead += buf.length; + if (request.onResponseData(buf) === false) { + return constants.ERROR.PAUSED; + } + return 0; } /** - * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller - * @param {object} trailers + * @returns {number} */ - onResponseEnd(controller, trailers) { - if (this.#aborted || this.#completed) { - return; + onMessageComplete() { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1; } - this.#completed = true; - this.#primaryHandler.onResponseEnd?.(controller, trailers); - for (const waitingHandler of this.#waitingHandlers) { - if (waitingHandler.done || waitingHandler.controller.aborted) { - waitingHandler.done = true; - continue; - } - this.#flushWaitingHandler(waitingHandler); - if (waitingHandler.done || waitingHandler.controller.aborted) { - waitingHandler.done = true; - continue; - } - if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) { - waitingHandler.pendingTrailers = trailers; - continue; - } - try { - waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers); - } catch { - } - waitingHandler.done = true; + if (upgrade) { + return 0; } - this.#pruneDoneWaitingHandlers(); - this.#onComplete?.(); + assert8(statusCode >= 100); + assert8((this.headers.length & 1) === 0); + const request = client[kQueue][client[kRunningIdx]]; + assert8(request); + this.statusCode = 0; + this.statusText = ""; + this.bytesRead = 0; + this.contentLength = ""; + this.keepAlive = ""; + this.connection = ""; + this.headers = []; + this.headersSize = 0; + if (statusCode < 200) { + return 0; + } + if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util2.destroy(socket, new ResponseContentLengthMismatchError()); + return -1; + } + request.onResponseEnd(headers); + client[kQueue][client[kRunningIdx]++] = null; + if (socket[kWriting]) { + assert8(client[kRunning] === 0); + util2.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (!shouldKeepAlive) { + util2.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (socket[kReset] && client[kRunning] === 0) { + util2.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (client[kPipelining] == null || client[kPipelining] === 1) { + setImmediate(client[kResume]); + } else { + client[kResume](); + } + return 0; } - /** - * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller - * @param {Error} err - */ - onResponseError(controller, err) { - if (this.#completed) { - return; + }; + function onParserTimeout(parserWeakRef) { + const parser = parserWeakRef.deref(); + if (!parser) { + return; + } + const { socket, timeoutType, client, paused } = parser; + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert8(!paused, "cannot be paused while waiting for headers"); + util2.destroy(socket, new HeadersTimeoutError()); } - this.#aborted = true; - this.#completed = true; - this.#primaryHandler.onResponseError?.(controller, err); - for (const waitingHandler of this.#waitingHandlers) { - this.#errorWaitingHandler(waitingHandler, err); + } else if (timeoutType === TIMEOUT_BODY) { + if (!paused) { + util2.destroy(socket, new BodyTimeoutError()); } - this.#waitingHandlers = []; - this.#onComplete?.(); + } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { + assert8(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + util2.destroy(socket, new InformationalError("socket idle timeout")); } - /** - * @param {DispatchHandler} handler - * @returns {WaitingHandler} - */ - #createWaitingHandler(handler) { - const waitingHandler = { - handler, - controller: null, - bufferedChunks: [], - bufferedBytes: 0, - pendingTrailers: null, - done: false - }; - const state = { - aborted: false, - paused: false, - reason: null - }; - waitingHandler.controller = { - resume: () => { - if (state.aborted) { - return; + } + function connectH1(client, socket) { + client[kSocket] = socket; + if (!llhttpInstance) { + llhttpInstance = lazyllhttp(); + } + if (socket.errored) { + throw socket.errored; + } + if (socket.destroyed) { + throw new SocketError("destroyed"); + } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client, socket, llhttpInstance); + util2.addListener(socket, "error", onHttpSocketError); + util2.addListener(socket, "readable", onHttpSocketReadable); + util2.addListener(socket, "end", onHttpSocketEnd); + util2.addListener(socket, "close", onHttpSocketClose); + socket[kClosed] = false; + socket.on("close", onSocketClose); + return { + version: "h1", + defaultPipelining: 1, + write(request) { + return writeH1(client, request); + }, + resume() { + resumeH1(client); + }, + /** + * @param {Error|undefined} err + * @param {() => void} callback + */ + destroy(err, callback) { + if (socket[kClosed]) { + queueMicrotask(callback); + } else { + socket.on("close", callback); + socket.destroy(err); + } + }, + /** + * @returns {boolean} + */ + get destroyed() { + return socket.destroyed; + }, + /** + * @param {import('../core/request.js')} request + * @returns {boolean} + */ + busy(request) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return true; + } + if (request) { + if (client[kRunning] > 0 && !request.idempotent) { + return true; } - state.paused = false; - this.#flushWaitingHandler(waitingHandler); - if (this.#completed && waitingHandler.pendingTrailers && waitingHandler.bufferedChunks.length === 0 && !state.paused && !state.aborted) { - try { - waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers); - } catch { - } - waitingHandler.pendingTrailers = null; - waitingHandler.done = true; + if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { + return true; } - this.#pruneDoneWaitingHandlers(); - }, - pause: () => { - if (!state.aborted) { - state.paused = true; + if (client[kRunning] > 0 && util2.bodyLength(request.body) !== 0 && (util2.isStream(request.body) || util2.isAsyncIterable(request.body) || util2.isFormDataLike(request.body))) { + return true; } - }, - get paused() { - return state.paused; - }, - get aborted() { - return state.aborted; - }, - get reason() { - return state.reason; - }, - abort: (reason) => { - state.aborted = true; - state.reason = reason ?? null; - waitingHandler.done = true; - waitingHandler.pendingTrailers = null; - waitingHandler.bufferedChunks = []; - waitingHandler.bufferedBytes = 0; } - }; - return waitingHandler; + return false; + } + }; + } + function onHttpSocketError(err) { + assert8(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + const parser = this[kParser]; + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; } - /** - * @param {WaitingHandler} waitingHandler - * @param {Buffer} chunk - */ - #bufferWaitingChunk(waitingHandler, chunk) { - if (waitingHandler.done || waitingHandler.controller.aborted) { - waitingHandler.done = true; - waitingHandler.bufferedChunks = []; - waitingHandler.bufferedBytes = 0; - return; + this[kError] = err; + this[kClient][kOnError](err); + } + function onHttpSocketReadable() { + this[kParser]?.readMore(); + } + function onHttpSocketEnd() { + const parser = this[kParser]; + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); + } + function onHttpSocketClose() { + const parser = this[kParser]; + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); } - const bufferedChunk = Buffer.from(chunk); - waitingHandler.bufferedChunks.push(bufferedChunk); - waitingHandler.bufferedBytes += bufferedChunk.length; - if (waitingHandler.bufferedBytes > this.#maxBufferSize) { - const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`); - this.#errorWaitingHandler(waitingHandler, err); + this[kParser].destroy(); + this[kParser] = null; + } + const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); + const client = this[kClient]; + client[kSocket] = null; + client[kHTTPContext] = null; + if (client.destroyed) { + assert8(client[kPending] === 0); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util2.errorRequest(client, request, err); + } + } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util2.errorRequest(client, request, err); + } + client[kPendingIdx] = client[kRunningIdx]; + assert8(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client[kResume](); + } + function onSocketClose() { + this[kClosed] = true; + } + function resumeH1(client) { + const socket = client[kSocket]; + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE); + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request.headersTimeout != null ? request.headersTimeout : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); + } + } + } + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function writeH1(client, request) { + const { method, path, host, upgrade, blocking, reset } = request; + let { body, headers, contentLength } = request; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH" || method === "QUERY" || method === "PROPFIND" || method === "PROPPATCH"; + if (util2.isFormDataLike(body)) { + if (!extractBody) { + extractBody = require_body().extractBody; + } + const [bodyStream, contentType] = extractBody(body); + if (request.contentType == null) { + headers.push("content-type", contentType); } + body = bodyStream.stream; + contentLength = bodyStream.length; + } else if (util2.isBlobLike(body) && request.contentType == null && body.type) { + headers.push("content-type", body.type); + } + if (body && typeof body.read === "function") { + body.read(0); } - /** - * @param {WaitingHandler} waitingHandler - */ - #flushWaitingHandler(waitingHandler) { - const { handler, controller } = waitingHandler; - while (!waitingHandler.done && !controller.aborted && !controller.paused && waitingHandler.bufferedChunks.length > 0) { - const bufferedChunk = waitingHandler.bufferedChunks.shift(); - waitingHandler.bufferedBytes -= bufferedChunk.length; - try { - handler.onResponseData?.(controller, bufferedChunk); - } catch { - } - if (controller.aborted) { - waitingHandler.done = true; - waitingHandler.pendingTrailers = null; - waitingHandler.bufferedChunks = []; - waitingHandler.bufferedBytes = 0; - break; - } + const bodyLength = util2.bodyLength(body); + contentLength = bodyLength ?? contentLength; + if (contentLength === null) { + contentLength = request.contentLength; + } + if (contentLength === 0 && !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util2.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false; } + process.emitWarning(new RequestContentLengthMismatchError()); } - /** - * @param {WaitingHandler} waitingHandler - * @param {Error} err - */ - #errorWaitingHandler(waitingHandler, err) { - if (waitingHandler.done) { + const socket = client[kSocket]; + const abort = (err) => { + if (request.aborted || request.completed) { return; } - waitingHandler.done = true; - waitingHandler.pendingTrailers = null; - waitingHandler.bufferedChunks = []; - waitingHandler.bufferedBytes = 0; - try { - waitingHandler.controller.abort(err); - waitingHandler.handler.onResponseError?.(waitingHandler.controller, err); - } catch { - } + util2.errorRequest(client, request, err || new RequestAbortedError()); + util2.destroy(body); + util2.destroy(socket, new InformationalError("aborted")); + }; + try { + request.onRequestStart(abort, null); + } catch (err) { + util2.errorRequest(client, request, err); } - #pruneDoneWaitingHandlers() { - this.#waitingHandlers = this.#waitingHandlers.filter((waitingHandler) => waitingHandler.done === false); + if (request.aborted) { + return false; } - }; - module.exports = DeduplicationHandler; - } -}); - -// node_modules/undici/lib/interceptor/deduplicate.js -var require_deduplicate = __commonJS({ - "node_modules/undici/lib/interceptor/deduplicate.js"(exports, module) { - "use strict"; - var diagnosticsChannel = __require("diagnostics_channel"); - var util2 = require_util(); - var DeduplicationHandler = require_deduplication_handler(); - var { normalizeHeaders: normalizeHeaders3, makeCacheKey, makeDeduplicationKey } = require_cache(); - var pendingRequestsChannel = diagnosticsChannel.channel("undici:request:pending-requests"); - module.exports = (opts = {}) => { - const { - methods = ["GET"], - skipHeaderNames = [], - excludeHeaderNames = [], - maxBufferSize = 5 * 1024 * 1024 - } = opts; - if (typeof opts !== "object" || opts === null) { - throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? "null" : typeof opts}`); + if (method === "HEAD") { + socket[kReset] = true; } - if (!Array.isArray(methods)) { - throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`); + if (upgrade || method === "CONNECT") { + socket[kReset] = true; } - for (const method of methods) { - if (!util2.safeHTTPMethods.includes(method)) { - throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`); - } + if (reset != null) { + socket[kReset] = reset; } - if (!Array.isArray(skipHeaderNames)) { - throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`); + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; } - if (!Array.isArray(excludeHeaderNames)) { - throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`); + if (blocking) { + socket[kBlocking] = true; } - if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) { - throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`); + if (socket.setTypeOfService) { + socket.setTypeOfService(request.typeOfService); } - const skipHeaderNamesSet = new Set(skipHeaderNames.map((name) => name.toLowerCase())); - const excludeHeaderNamesSet = new Set(excludeHeaderNames.map((name) => name.toLowerCase())); - const pendingRequests = /* @__PURE__ */ new Map(); - return (dispatch) => { - return (opts2, handler) => { - if (!opts2.origin || methods.includes(opts2.method) === false) { - return dispatch(opts2, handler); - } - opts2 = { - ...opts2, - headers: normalizeHeaders3(opts2) - }; - if (skipHeaderNamesSet.size > 0) { - for (const headerName of Object.keys(opts2.headers)) { - if (skipHeaderNamesSet.has(headerName.toLowerCase())) { - return dispatch(opts2, handler); - } - } - } - const cacheKey2 = makeCacheKey(opts2); - const dedupeKey = makeDeduplicationKey(cacheKey2, excludeHeaderNamesSet); - const pendingHandler = pendingRequests.get(dedupeKey); - if (pendingHandler) { - if (pendingHandler.addWaitingHandler(handler)) { - return true; + let header = `${method} ${path} HTTP/1.1\r +`; + if (typeof host === "string") { + header += `host: ${host}\r +`; + } else { + header += client[kHostHeader]; + } + if (upgrade) { + header += `connection: upgrade\r +upgrade: ${upgrade}\r +`; + } else if (client[kPipelining] && !socket[kReset]) { + header += "connection: keep-alive\r\n"; + } else { + header += "connection: close\r\n"; + } + if (Array.isArray(headers)) { + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0]; + const val = headers[n + 1]; + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r +`; } - return dispatch(opts2, handler); + } else { + header += `${key}: ${val}\r +`; } - const deduplicationHandler = new DeduplicationHandler( - handler, - () => { - pendingRequests.delete(dedupeKey); - if (pendingRequestsChannel.hasSubscribers) { - pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: "removed" }); - } - }, - maxBufferSize - ); - pendingRequests.set(dedupeKey, deduplicationHandler); - if (pendingRequestsChannel.hasSubscribers) { - pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: "added" }); + } + } + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } + if (!body || bodyLength === 0) { + writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload); + } else if (util2.isBuffer(body)) { + writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util2.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload); + } else { + writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload); + } + } else if (util2.isStream(body)) { + writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util2.isIterable(body)) { + writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else { + assert8(false); + } + return true; + } + function writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert8(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + let finished2 = false; + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + const onData = function(chunk) { + if (finished2) { + return; + } + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); } - return dispatch(opts2, deduplicationHandler); - }; + } catch (err) { + util2.destroy(this, err); + } }; - }; - } -}); - -// node_modules/undici/lib/cache/sqlite-cache-store.js -var require_sqlite_cache_store = __commonJS({ - "node_modules/undici/lib/cache/sqlite-cache-store.js"(exports, module) { - "use strict"; - var { Writable } = __require("stream"); - var { assertCacheKey, assertCacheValue } = require_cache(); - var DatabaseSync; - var VERSION2 = 3; - var MAX_ENTRY_SIZE = 2 * 1e3 * 1e3 * 1e3; - module.exports = class SqliteCacheStore { - #maxEntrySize = MAX_ENTRY_SIZE; - #maxCount = Infinity; - /** - * @type {import('node:sqlite').DatabaseSync} - */ - #db; - /** - * @type {import('node:sqlite').StatementSync} - */ - #getValuesQuery; - /** - * @type {import('node:sqlite').StatementSync} - */ - #updateValueQuery; - /** - * @type {import('node:sqlite').StatementSync} - */ - #insertValueQuery; - /** - * @type {import('node:sqlite').StatementSync} - */ - #deleteExpiredValuesQuery; - /** - * @type {import('node:sqlite').StatementSync} - */ - #deleteByUrlQuery; - /** - * @type {import('node:sqlite').StatementSync} - */ - #countEntriesQuery; - /** - * @type {import('node:sqlite').StatementSync | null} - */ - #deleteOldValuesQuery; - /** - * @param {import('../../types/cache-interceptor.d.ts').default.SqliteCacheStoreOpts | undefined} opts - */ - constructor(opts) { - if (opts) { - if (typeof opts !== "object") { - throw new TypeError("SqliteCacheStore options must be an object"); - } - if (opts.maxEntrySize !== void 0) { - if (typeof opts.maxEntrySize !== "number" || !Number.isInteger(opts.maxEntrySize) || opts.maxEntrySize < 0) { - throw new TypeError("SqliteCacheStore options.maxEntrySize must be a non-negative integer"); - } - if (opts.maxEntrySize > MAX_ENTRY_SIZE) { - throw new TypeError("SqliteCacheStore options.maxEntrySize must be less than 2gb"); - } - this.#maxEntrySize = opts.maxEntrySize; - } - if (opts.maxCount !== void 0) { - if (typeof opts.maxCount !== "number" || !Number.isInteger(opts.maxCount) || opts.maxCount < 0) { - throw new TypeError("SqliteCacheStore options.maxCount must be a non-negative integer"); - } - this.#maxCount = opts.maxCount; + const onDrain = function() { + if (finished2) { + return; + } + if (body.resume) { + body.resume(); + } + }; + const onClose = function() { + queueMicrotask(() => { + body.removeListener("error", onFinished); + }); + if (!finished2) { + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); + } + }; + const onFinished = function(err) { + if (finished2) { + return; + } + finished2 = true; + assert8(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); + socket.off("drain", onDrain).off("error", onFinished); + body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose); + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; } } - if (!DatabaseSync) { - DatabaseSync = __require("sqlite").DatabaseSync; + writer.destroy(err); + if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { + util2.destroy(body, err); + } else { + util2.destroy(body); } - this.#db = new DatabaseSync(opts?.location ?? ":memory:"); - this.#db.exec(` - PRAGMA journal_mode = WAL; - PRAGMA synchronous = NORMAL; - PRAGMA temp_store = memory; - PRAGMA optimize; - - CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION2} ( - -- Data specific to us - id INTEGER PRIMARY KEY AUTOINCREMENT, - url TEXT NOT NULL, - method TEXT NOT NULL, - - -- Data returned to the interceptor - body BUF NULL, - deleteAt INTEGER NOT NULL, - statusCode INTEGER NOT NULL, - statusMessage TEXT NOT NULL, - headers TEXT NULL, - cacheControlDirectives TEXT NULL, - etag TEXT NULL, - vary TEXT NULL, - cachedAt INTEGER NOT NULL, - staleAt INTEGER NOT NULL - ); - - CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION2}_getValuesQuery ON cacheInterceptorV${VERSION2}(url, method, deleteAt); - CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION2}_deleteByUrlQuery ON cacheInterceptorV${VERSION2}(deleteAt); - `); - this.#getValuesQuery = this.#db.prepare(` - SELECT - id, - body, - deleteAt, - statusCode, - statusMessage, - headers, - etag, - cacheControlDirectives, - vary, - cachedAt, - staleAt - FROM cacheInterceptorV${VERSION2} - WHERE - url = ? - AND method = ? - ORDER BY - deleteAt ASC - `); - this.#updateValueQuery = this.#db.prepare(` - UPDATE cacheInterceptorV${VERSION2} SET - body = ?, - deleteAt = ?, - statusCode = ?, - statusMessage = ?, - headers = ?, - etag = ?, - cacheControlDirectives = ?, - cachedAt = ?, - staleAt = ? - WHERE - id = ? - `); - this.#insertValueQuery = this.#db.prepare(` - INSERT INTO cacheInterceptorV${VERSION2} ( - url, - method, - body, - deleteAt, - statusCode, - statusMessage, - headers, - etag, - cacheControlDirectives, - vary, - cachedAt, - staleAt - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `); - this.#deleteByUrlQuery = this.#db.prepare( - `DELETE FROM cacheInterceptorV${VERSION2} WHERE url = ?` - ); - this.#countEntriesQuery = this.#db.prepare( - `SELECT COUNT(*) AS total FROM cacheInterceptorV${VERSION2}` - ); - this.#deleteExpiredValuesQuery = this.#db.prepare( - `DELETE FROM cacheInterceptorV${VERSION2} WHERE deleteAt <= ?` - ); - this.#deleteOldValuesQuery = this.#maxCount === Infinity ? null : this.#db.prepare(` - DELETE FROM cacheInterceptorV${VERSION2} - WHERE id IN ( - SELECT - id - FROM cacheInterceptorV${VERSION2} - ORDER BY cachedAt DESC - LIMIT ? - ) - `); + }; + body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onClose); + if (body.resume) { + body.resume(); } - close() { - this.#db.close(); + socket.on("drain", onDrain).on("error", onFinished); + if (body.errorEmitted ?? body.errored) { + setImmediate(onFinished, body.errored); + } else if (body.endEmitted ?? body.readableEnded) { + setImmediate(onFinished, null); } - /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key - * @returns {(import('../../types/cache-interceptor.d.ts').default.GetResult & { body?: Buffer }) | undefined} - */ - get(key) { - assertCacheKey(key); - const value = this.#findValue(key); - return value ? { - body: value.body ? Buffer.from(value.body.buffer, value.body.byteOffset, value.body.byteLength) : void 0, - statusCode: value.statusCode, - statusMessage: value.statusMessage, - headers: value.headers ? JSON.parse(value.headers) : void 0, - etag: value.etag ? value.etag : void 0, - vary: value.vary ? JSON.parse(value.vary) : void 0, - cacheControlDirectives: value.cacheControlDirectives ? JSON.parse(value.cacheControlDirectives) : void 0, - cachedAt: value.cachedAt, - staleAt: value.staleAt, - deleteAt: value.deleteAt - } : void 0; + if (body.closeEmitted ?? body.closed) { + setImmediate(onClose); } - /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key - * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue & { body: null | Buffer | Array}} value - */ - set(key, value) { - assertCacheKey(key); - const url = this.#makeValueUrl(key); - const body = Array.isArray(value.body) ? Buffer.concat(value.body) : value.body; - const size5 = body?.byteLength; - if (size5 && size5 > this.#maxEntrySize) { - return; - } - const existingValue = this.#findValue(key, true); - if (existingValue) { - this.#updateValueQuery.run( - body, - value.deleteAt, - value.statusCode, - value.statusMessage, - value.headers ? JSON.stringify(value.headers) : null, - value.etag ? value.etag : null, - value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null, - value.cachedAt, - value.staleAt, - existingValue.id - ); - } else { - this.#prune(); - this.#insertValueQuery.run( - url, - key.method, - body, - value.deleteAt, - value.statusCode, - value.statusMessage, - value.headers ? JSON.stringify(value.headers) : null, - value.etag ? value.etag : null, - value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null, - value.vary ? JSON.stringify(value.vary) : null, - value.cachedAt, - value.staleAt - ); + } + function writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload) { + try { + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + assert8(contentLength === null, "no body must not have content length"); + socket.write(`${header}\r +`, "latin1"); + } + } else if (util2.isBuffer(body)) { + assert8(contentLength === body.byteLength, "buffer body must have content length"); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } } + request.onRequestSent(); + client[kResume](); + } catch (err) { + abort(err); } - /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key - * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} value - * @returns {Writable | undefined} - */ - createWriteStream(key, value) { - assertCacheKey(key); - assertCacheValue(value); - let size5 = 0; - const body = []; - const store = this; - return new Writable({ - decodeStrings: true, - write(chunk, encoding, callback) { - size5 += chunk.byteLength; - if (size5 < store.#maxEntrySize) { - body.push(chunk); - } else { - this.destroy(); - } - callback(); - }, - final(callback) { - store.set(key, { ...value, body }); - callback(); - } - }); + } + async function writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert8(contentLength === body.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError(); + } + const buffer2 = Buffer.from(await body.arrayBuffer()); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(buffer2); + socket.uncork(); + request.onBodySent(buffer2); + request.onRequestSent(); + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + client[kResume](); + } catch (err) { + abort(err); } - /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key - */ - delete(key) { - if (typeof key !== "object") { - throw new TypeError(`expected key to be object, got ${typeof key}`); + } + async function writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert8(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); } - this.#deleteByUrlQuery.run(this.#makeValueUrl(key)); } - #prune() { - if (Number.isFinite(this.#maxCount) && this.size <= this.#maxCount) { - return 0; + const waitForDrain = () => new Promise((resolve, reject) => { + assert8(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; } - { - const removed = this.#deleteExpiredValuesQuery.run(Date.now()).changes; - if (removed) { - return removed; + }); + socket.on("close", onDrain).on("drain", onDrain); + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; } - } - { - const removed = this.#deleteOldValuesQuery?.run(Math.max(Math.floor(this.#maxCount * 0.1), 1)).changes; - if (removed) { - return removed; + if (!writer.write(chunk)) { + await waitForDrain(); } } - return 0; + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket.off("close", onDrain).off("drain", onDrain); } + } + var AsyncWriter = class { /** - * Counts the number of rows in the cache - * @returns {Number} + * + * @param {object} arg + * @param {AbortCallback} arg.abort + * @param {import('net').Socket} arg.socket + * @param {import('../core/request.js')} arg.request + * @param {number} arg.contentLength + * @param {import('./client.js')} arg.client + * @param {boolean} arg.expectsPayload + * @param {string} arg.header */ - get size() { - const { total } = this.#countEntriesQuery.get(); - return total; + constructor({ abort, socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + this.abort = abort; + socket[kWriting] = true; } /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key - * @returns {string} + * @param {Buffer} chunk + * @returns */ - #makeValueUrl(key) { - return `${key.origin}/${key.path}`; + write(chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + if (socket[kError]) { + throw socket[kError]; + } + if (socket.destroyed) { + return false; + } + const len = Buffer.byteLength(chunk); + if (!len) { + return true; + } + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + socket.cork(); + if (bytesWritten === 0) { + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r +`, "latin1"); + } else { + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + } + } + if (contentLength === null) { + socket.write(`\r +${len.toString(16)}\r +`, "latin1"); + } + this.bytesWritten += len; + const ret = socket.write(chunk); + socket.uncork(); + request.onBodySent(chunk); + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + } + return ret; } /** - * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key - * @param {boolean} [canBeExpired=false] - * @returns {SqliteStoreValue | undefined} + * @returns {void} */ - #findValue(key, canBeExpired = false) { - const url = this.#makeValueUrl(key); - const { headers, method } = key; - const values = this.#getValuesQuery.all(url, method); - if (values.length === 0) { - return void 0; + end() { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); + socket[kWriting] = false; + if (socket[kError]) { + throw socket[kError]; } - const now = Date.now(); - for (const value of values) { - if (now >= value.deleteAt && !canBeExpired) { - return void 0; + if (socket.destroyed) { + return; + } + if (bytesWritten === 0) { + if (expectsPayload) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + socket.write(`${header}\r +`, "latin1"); } - let matches = true; - if (value.vary) { - const vary = JSON.parse(value.vary); - for (const header in vary) { - if (!headerValueEquals(headers[header], vary[header])) { - matches = false; - break; - } - } + } else if (contentLength === null) { + socket.write("\r\n0\r\n\r\n", "latin1"); + } + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } else { + process.emitWarning(new RequestContentLengthMismatchError()); } - if (matches) { - return value; + } + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); } } - return void 0; - } - }; - function headerValueEquals(lhs, rhs) { - if (lhs == null && rhs == null) { - return true; - } - if (lhs == null && rhs != null || lhs != null && rhs == null) { - return false; + client[kResume](); } - if (Array.isArray(lhs) && Array.isArray(rhs)) { - if (lhs.length !== rhs.length) { - return false; + /** + * @param {Error} [err] + * @returns {void} + */ + destroy(err) { + const { socket, client, abort } = this; + socket[kWriting] = false; + if (err) { + assert8(client[kRunning] <= 1, "pipeline should only contain this request"); + abort(err); } - return lhs.every((x, i) => x === rhs[i]); } - return lhs === rhs; - } + }; + module.exports = connectH1; } }); -// node_modules/undici/lib/web/fetch/headers.js -var require_headers = __commonJS({ - "node_modules/undici/lib/web/fetch/headers.js"(exports, module) { +// node_modules/undici/lib/dispatcher/client-h2.js +var require_client_h2 = __commonJS({ + "node_modules/undici/lib/dispatcher/client-h2.js"(exports, module) { "use strict"; - var { kConstruct } = require_symbols(); - var { kEnumerableProperty } = require_util(); - var { - iteratorMixin, - isValidHeaderName, - isValidHeaderValue - } = require_util2(); - var { webidl } = require_webidl(); var assert8 = __require("assert"); - var util2 = __require("util"); - function isHTTPWhiteSpaceCharCode(code) { - return code === 10 || code === 13 || code === 9 || code === 32; + var { pipeline } = __require("stream"); + var util2 = require_util(); + var { + RequestContentLengthMismatchError, + RequestAbortedError, + SocketError, + InformationalError, + InvalidArgumentError + } = require_errors(); + var { + kUrl, + kReset, + kClient, + kRunning, + kPending, + kQueue, + kPendingIdx, + kRunningIdx, + kError, + kSocket, + kStrictContentLength, + kOnError, + kMaxConcurrentStreams, + kPingInterval, + kHTTP2Session, + kHTTP2InitialWindowSize, + kHTTP2ConnectionWindowSize, + kResume, + kSize, + kHTTPContext, + kClosed, + kBodyTimeout, + kEnableConnectProtocol, + kRemoteSettings, + kHTTP2Stream, + kHTTP2SessionState + } = require_symbols(); + var { channels } = require_diagnostics(); + var kOpenStreams = /* @__PURE__ */ Symbol("open streams"); + var extractBody; + var http2; + try { + http2 = __require("http2"); + } catch { + http2 = { constants: {} }; } - function headerValueNormalize(potentialValue) { - let i = 0; - let j = potentialValue.length; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i; - return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j); + var { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS, + HTTP2_HEADER_PROTOCOL, + NGHTTP2_REFUSED_STREAM, + NGHTTP2_CANCEL + } + } = http2; + function parseH2Headers(headers) { + const result = []; + for (const [name, value] of Object.entries(headers)) { + if (Array.isArray(value)) { + for (const subvalue of value) { + result.push(Buffer.from(name), Buffer.from(subvalue)); + } + } else { + result.push(Buffer.from(name), Buffer.from(value)); + } + } + return result; } - function fill(headers, object) { - if (Array.isArray(object)) { - for (let i = 0; i < object.length; ++i) { - const header = object[i]; - if (header.length !== 2) { - throw webidl.errors.exception({ - header: "Headers constructor", - message: `expected name/value pair to be length 2, found ${header.length}.` - }); + function connectH2(client, socket) { + client[kSocket] = socket; + const http2InitialWindowSize = client[kHTTP2InitialWindowSize]; + const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize]; + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kMaxConcurrentStreams], + settings: { + // TODO(metcoder95): add support for PUSH + enablePush: false, + ...http2InitialWindowSize != null ? { initialWindowSize: http2InitialWindowSize } : null + } + }); + client[kSocket] = socket; + session[kOpenStreams] = 0; + session[kClient] = client; + session[kSocket] = socket; + session[kHTTP2SessionState] = { + ping: { + interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref() + } + }; + session[kEnableConnectProtocol] = false; + session[kRemoteSettings] = false; + if (http2ConnectionWindowSize) { + util2.addListener(session, "connect", applyConnectionWindowSize.bind(session, http2ConnectionWindowSize)); + } + util2.addListener(session, "error", onHttp2SessionError); + util2.addListener(session, "frameError", onHttp2FrameError); + util2.addListener(session, "end", onHttp2SessionEnd); + util2.addListener(session, "goaway", onHttp2SessionGoAway); + util2.addListener(session, "close", onHttp2SessionClose); + util2.addListener(session, "remoteSettings", onHttp2RemoteSettings); + session.unref(); + client[kHTTP2Session] = session; + socket[kHTTP2Session] = session; + util2.addListener(socket, "error", onHttp2SocketError); + util2.addListener(socket, "end", onHttp2SocketEnd); + util2.addListener(socket, "close", onHttp2SocketClose); + socket[kClosed] = false; + socket.on("close", onSocketClose); + return { + version: "h2", + defaultPipelining: Infinity, + /** + * @param {import('../core/request.js')} request + * @returns {boolean} + */ + write(request) { + return writeH2(client, request); + }, + /** + * @returns {void} + */ + resume() { + resumeH2(client); + }, + /** + * @param {Error | null} err + * @param {() => void} callback + */ + destroy(err, callback) { + if (socket[kClosed]) { + queueMicrotask(callback); + } else { + socket.destroy(err).on("close", callback); } - appendHeader(headers, header[0], header[1]); + }, + /** + * @type {boolean} + */ + get destroyed() { + return socket.destroyed; + }, + /** + * @param {import('../core/request.js')} request + * @returns {boolean} + */ + busy(request) { + if (request != null) { + if (client[kRunning] > 0) { + if (request.idempotent === false) return true; + if ((request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false) return true; + if (util2.bodyLength(request.body) !== 0 && (util2.isStream(request.body) || util2.isAsyncIterable(request.body) || util2.isFormDataLike(request.body))) return true; + } else { + return (request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false; + } + } + return false; } - } else if (typeof object === "object" && object !== null) { - const keys = Object.keys(object); - for (let i = 0; i < keys.length; ++i) { - appendHeader(headers, keys[i], object[keys[i]]); + }; + } + function resumeH2(client) { + const socket = client[kSocket]; + if (socket?.destroyed === false) { + if (client[kSize] === 0 || client[kMaxConcurrentStreams] === 0) { + socket.unref(); + client[kHTTP2Session].unref(); + } else { + socket.ref(); + client[kHTTP2Session].ref(); + } + } + } + function applyConnectionWindowSize(connectionWindowSize) { + try { + if (typeof this.setLocalWindowSize === "function") { + this.setLocalWindowSize(connectionWindowSize); + } + } catch { + } + } + function onHttp2RemoteSettings(settings) { + this[kClient][kMaxConcurrentStreams] = settings.maxConcurrentStreams ?? this[kClient][kMaxConcurrentStreams]; + if (this[kRemoteSettings] === true && this[kEnableConnectProtocol] === true && settings.enableConnectProtocol === false) { + const err = new InformationalError("HTTP/2: Server disabled extended CONNECT protocol against RFC-8441"); + this[kSocket][kError] = err; + this[kClient][kOnError](err); + return; + } + this[kEnableConnectProtocol] = settings.enableConnectProtocol ?? this[kEnableConnectProtocol]; + this[kRemoteSettings] = true; + this[kClient][kResume](); + } + function onHttp2SendPing(session) { + const state = session[kHTTP2SessionState]; + if ((session.closed || session.destroyed) && state.ping.interval != null) { + clearInterval(state.ping.interval); + state.ping.interval = null; + return; + } + session.ping(onPing.bind(session)); + function onPing(err, duration) { + const client = this[kClient]; + const socket = this[kClient]; + if (err != null) { + const error = new InformationalError(`HTTP/2: "PING" errored - type ${err.message}`); + socket[kError] = error; + client[kOnError](error); + } else { + client.emit("ping", duration); } - } else { - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); } } - function appendHeader(headers, name, value) { - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value, - type: "header value" - }); - } - if (getHeadersGuard(headers) === "immutable") { - throw new TypeError("immutable"); - } - return getHeadersList(headers).append(name, value, false); + function onHttp2SessionError(err) { + assert8(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kSocket][kError] = err; + this[kClient][kOnError](err); } - function headersListSortAndCombine(target) { - const headersList = getHeadersList(target); - if (!headersList) { - return []; + function onHttp2FrameError(type, code, id) { + if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + this[kSocket][kError] = err; + this[kClient][kOnError](err); } - if (headersList.sortedMap) { - return headersList.sortedMap; + } + function onHttp2SessionEnd() { + const err = new SocketError("other side closed", util2.getSocketInfo(this[kSocket])); + this.destroy(err); + util2.destroy(this[kSocket], err); + } + function onHttp2SessionGoAway(errorCode) { + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${errorCode}`, util2.getSocketInfo(this[kSocket])); + const client = this[kClient]; + client[kSocket] = null; + client[kHTTPContext] = null; + this.close(); + this[kHTTP2Session] = null; + util2.destroy(this[kSocket], err); + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util2.errorRequest(client, request, err); + client[kPendingIdx] = client[kRunningIdx]; } - const headers = []; - const names = headersList.toSortedArray(); - const cookies = headersList.cookies; - if (cookies === null || cookies.length === 1) { - return headersList.sortedMap = names; + assert8(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client.emit("connectionError", client[kUrl], [client], err); + client[kResume](); + } + function onHttp2SessionClose() { + const { [kClient]: client, [kHTTP2SessionState]: state } = this; + const { [kSocket]: socket } = client; + const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util2.getSocketInfo(socket)); + client[kSocket] = null; + client[kHTTPContext] = null; + if (state.ping.interval != null) { + clearInterval(state.ping.interval); + state.ping.interval = null; } - for (let i = 0; i < names.length; ++i) { - const { 0: name, 1: value } = names[i]; - if (name === "set-cookie") { - for (let j = 0; j < cookies.length; ++j) { - headers.push([name, cookies[j]]); - } - } else { - headers.push([name, value]); + if (client.destroyed) { + assert8(client[kPending] === 0); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util2.errorRequest(client, request, err); } } - return headersList.sortedMap = headers; } - function compareHeaderName(a, b) { - return a[0] < b[0] ? -1 : 1; + function onHttp2SocketClose() { + const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); + const client = this[kHTTP2Session][kClient]; + client[kSocket] = null; + client[kHTTPContext] = null; + if (this[kHTTP2Session] !== null) { + this[kHTTP2Session].destroy(err); + } + client[kPendingIdx] = client[kRunningIdx]; + assert8(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client[kResume](); } - var HeadersList = class _HeadersList { - /** @type {[string, string][]|null} */ - cookies = null; - sortedMap; - headersMap; - constructor(init) { - if (init instanceof _HeadersList) { - this.headersMap = new Map(init.headersMap); - this.sortedMap = init.sortedMap; - this.cookies = init.cookies === null ? null : [...init.cookies]; + function onHttp2SocketError(err) { + assert8(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kError] = err; + this[kClient][kOnError](err); + } + function onHttp2SocketEnd() { + util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); + } + function onSocketClose() { + this[kClosed] = true; + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function writeH2(client, request) { + const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]; + const session = client[kHTTP2Session]; + const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request; + let { body } = request; + if (upgrade != null && upgrade !== "websocket") { + util2.errorRequest(client, request, new InvalidArgumentError(`Custom upgrade "${upgrade}" not supported over HTTP/2`)); + return false; + } + const headers = {}; + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0]; + const val = reqHeaders[n + 1]; + if (key === "cookie") { + if (headers[key] != null) { + headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val]; + } else { + headers[key] = val; + } + continue; + } + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers[key]) { + headers[key] += `, ${val[i]}`; + } else { + headers[key] = val[i]; + } + } + } else if (headers[key]) { + headers[key] += `, ${val}`; } else { - this.headersMap = new Map(init); - this.sortedMap = null; + headers[key] = val; } } - /** - * @see https://fetch.spec.whatwg.org/#header-list-contains - * @param {string} name - * @param {boolean} isLowerCase - */ - contains(name, isLowerCase) { - return this.headersMap.has(isLowerCase ? name : name.toLowerCase()); + let stream = null; + const { hostname, port } = client[kUrl]; + headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ""}`; + headers[HTTP2_HEADER_METHOD] = method; + const abort = (err) => { + if (request.aborted || request.completed) { + return; + } + err = err || new RequestAbortedError(); + util2.errorRequest(client, request, err); + if (stream != null) { + stream.removeAllListeners("data"); + stream.close(); + client[kOnError](err); + client[kResume](); + } + util2.destroy(body, err); + }; + try { + request.onRequestStart(abort, null); + } catch (err) { + util2.errorRequest(client, request, err); } - clear() { - this.headersMap.clear(); - this.sortedMap = null; - this.cookies = null; + if (request.aborted) { + return false; } - /** - * @see https://fetch.spec.whatwg.org/#concept-header-list-append - * @param {string} name - * @param {string} value - * @param {boolean} isLowerCase - */ - append(name, value, isLowerCase) { - this.sortedMap = null; - const lowercaseName = isLowerCase ? name : name.toLowerCase(); - const exists = this.headersMap.get(lowercaseName); - if (exists) { - const delimiter = lowercaseName === "cookie" ? "; " : ", "; - this.headersMap.set(lowercaseName, { - name: exists.name, - value: `${exists.value}${delimiter}${value}` + if (upgrade || method === "CONNECT") { + session.ref(); + if (upgrade === "websocket") { + if (session[kEnableConnectProtocol] === false) { + util2.errorRequest(client, request, new InformationalError("HTTP/2: Extended CONNECT protocol not supported by server")); + session.unref(); + return false; + } + headers[HTTP2_HEADER_METHOD] = "CONNECT"; + headers[HTTP2_HEADER_PROTOCOL] = "websocket"; + headers[HTTP2_HEADER_PATH] = path; + if (protocol === "ws:" || protocol === "wss:") { + headers[HTTP2_HEADER_SCHEME] = protocol === "ws:" ? "http" : "https"; + } else { + headers[HTTP2_HEADER_SCHEME] = protocol === "http:" ? "http" : "https"; + } + stream = session.request(headers, { endStream: false, signal }); + stream[kHTTP2Stream] = true; + stream.once("response", (headers2, _flags) => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; + request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; }); - } else { - this.headersMap.set(lowercaseName, { name, value }); - } - if (lowercaseName === "set-cookie") { - (this.cookies ??= []).push(value); + stream.on("error", () => { + if (stream.rstCode === NGHTTP2_REFUSED_STREAM || stream.rstCode === NGHTTP2_CANCEL) { + abort(new InformationalError(`HTTP/2: "stream error" received - code ${stream.rstCode}`)); + } + }); + stream.once("close", () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) session.unref(); + }); + stream.setTimeout(requestTimeout); + return true; } + stream = session.request(headers, { endStream: false, signal }); + stream[kHTTP2Stream] = true; + stream.on("response", (headers2) => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; + request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; + }); + stream.once("close", () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) session.unref(); + }); + stream.setTimeout(requestTimeout); + return true; } - /** - * @see https://fetch.spec.whatwg.org/#concept-header-list-set - * @param {string} name - * @param {string} value - * @param {boolean} isLowerCase - */ - set(name, value, isLowerCase) { - this.sortedMap = null; - const lowercaseName = isLowerCase ? name : name.toLowerCase(); - if (lowercaseName === "set-cookie") { - this.cookies = [value]; - } - this.headersMap.set(lowercaseName, { name, value }); + headers[HTTP2_HEADER_PATH] = path; + headers[HTTP2_HEADER_SCHEME] = protocol === "http:" ? "http" : "https"; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body && typeof body.read === "function") { + body.read(0); } - /** - * @see https://fetch.spec.whatwg.org/#concept-header-list-delete - * @param {string} name - * @param {boolean} isLowerCase - */ - delete(name, isLowerCase) { - this.sortedMap = null; - if (!isLowerCase) name = name.toLowerCase(); - if (name === "set-cookie") { - this.cookies = null; - } - this.headersMap.delete(name); + let contentLength = util2.bodyLength(body); + if (util2.isFormDataLike(body)) { + extractBody ??= require_body().extractBody; + const [bodyStream, contentType] = extractBody(body); + headers["content-type"] = contentType; + body = bodyStream.stream; + contentLength = bodyStream.length; } - /** - * @see https://fetch.spec.whatwg.org/#concept-header-list-get - * @param {string} name - * @param {boolean} isLowerCase - * @returns {string | null} - */ - get(name, isLowerCase) { - return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null; + if (contentLength == null) { + contentLength = request.contentLength; } - *[Symbol.iterator]() { - for (const { 0: name, 1: { value } } of this.headersMap) { - yield [name, value]; - } + if (!expectsPayload) { + contentLength = null; } - get entries() { - const headers = {}; - if (this.headersMap.size !== 0) { - for (const { name, value } of this.headersMap.values()) { - headers[name] = value; - } + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util2.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false; } - return headers; + process.emitWarning(new RequestContentLengthMismatchError()); } - rawValues() { - return this.headersMap.values(); + if (contentLength != null) { + assert8(body || contentLength === 0, "no body must not have content length"); + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; } - get entriesList() { - const headers = []; - if (this.headersMap.size !== 0) { - for (const { 0: lowerName, 1: { name, value } } of this.headersMap) { - if (lowerName === "set-cookie") { - for (const cookie of this.cookies) { - headers.push([name, cookie]); - } - } else { - headers.push([name, value]); - } - } + session.ref(); + if (channels.sendHeaders.hasSubscribers) { + let header = ""; + for (const key in headers) { + header += `${key}: ${headers[key]}\r +`; } - return headers; + channels.sendHeaders.publish({ request, headers: header, socket: session[kSocket] }); } - // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set - toSortedArray() { - const size5 = this.headersMap.size; - const array = new Array(size5); - if (size5 <= 32) { - if (size5 === 0) { - return array; + const shouldEndStream = method === "GET" || method === "HEAD" || body === null; + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = "100-continue"; + stream = session.request(headers, { endStream: shouldEndStream, signal }); + stream[kHTTP2Stream] = true; + stream.once("continue", writeBodyH2); + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }); + stream[kHTTP2Stream] = true; + writeBodyH2(); + } + ++session[kOpenStreams]; + stream.setTimeout(requestTimeout); + let responseReceived = false; + stream.once("response", (headers2) => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; + request.onResponseStarted(); + responseReceived = true; + if (request.aborted) { + stream.removeAllListeners("data"); + return; + } + if (request.onResponseStart(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) { + stream.pause(); + } + stream.on("data", (chunk) => { + if (request.aborted || request.completed) { + return; } - const iterator = this.headersMap[Symbol.iterator](); - const firstValue = iterator.next().value; - array[0] = [firstValue[0], firstValue[1].value]; - assert8(firstValue[1].value !== null); - for (let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value; i < size5; ++i) { - value = iterator.next().value; - x = array[i] = [value[0], value[1].value]; - assert8(x[1] !== null); - left = 0; - right = i; - while (left < right) { - pivot = left + (right - left >> 1); - if (array[pivot][0] <= x[0]) { - left = pivot + 1; - } else { - right = pivot; - } - } - if (i !== pivot) { - j = i; - while (j > left) { - array[j] = array[--j]; - } - array[left] = x; - } + if (request.onResponseData(chunk) === false) { + stream.pause(); } - if (!iterator.next().done) { - throw new TypeError("Unreachable"); + }); + }); + stream.once("end", () => { + stream.removeAllListeners("data"); + if (responseReceived) { + if (!request.aborted && !request.completed) { + request.onResponseEnd({}); + } + client[kQueue][client[kRunningIdx]++] = null; + client[kResume](); + } else { + abort(new InformationalError("HTTP/2: stream half-closed (remote)")); + client[kQueue][client[kRunningIdx]++] = null; + client[kPendingIdx] = client[kRunningIdx]; + client[kResume](); + } + }); + stream.once("close", () => { + stream.removeAllListeners("data"); + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); + } + }); + stream.once("error", function(err) { + stream.removeAllListeners("data"); + abort(err); + }); + stream.once("frameError", (type, code) => { + stream.removeAllListeners("data"); + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); + }); + stream.on("aborted", () => { + stream.removeAllListeners("data"); + }); + stream.on("timeout", () => { + const err = new InformationalError(`HTTP/2: "stream timeout after ${requestTimeout}"`); + stream.removeAllListeners("data"); + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); + } + abort(err); + }); + stream.once("trailers", (trailers) => { + if (request.aborted || request.completed) { + return; + } + request.onResponseEnd(trailers); + }); + return true; + function writeBodyH2() { + if (!body || contentLength === 0) { + writeBuffer( + abort, + stream, + null, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util2.isBuffer(body)) { + writeBuffer( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util2.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable( + abort, + stream, + body.stream(), + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else { + writeBlob( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } - return array; + } else if (util2.isStream(body)) { + writeStream( + abort, + client[kSocket], + expectsPayload, + stream, + body, + client, + request, + contentLength + ); + } else if (util2.isIterable(body)) { + writeIterable( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } else { - let i = 0; - for (const { 0: name, 1: { value } } of this.headersMap) { - array[i++] = [name, value]; - assert8(value !== null); - } - return array.sort(compareHeaderName); + assert8(false); } } - }; - var Headers2 = class _Headers { - #guard; - /** - * @type {HeadersList} - */ - #headersList; - /** - * @param {HeadersInit|Symbol} [init] - * @returns - */ - constructor(init = void 0) { - webidl.util.markAsUncloneable(this); - if (init === kConstruct) { - return; + } + function writeBuffer(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + try { + if (body != null && util2.isBuffer(body)) { + assert8(contentLength === body.byteLength, "buffer body must have content length"); + h2stream.cork(); + h2stream.write(body); + h2stream.uncork(); + h2stream.end(); + request.onBodySent(body); } - this.#headersList = new HeadersList(); - this.#guard = "none"; - if (init !== void 0) { - init = webidl.converters.HeadersInit(init, "Headers constructor", "init"); - fill(this, init); + if (!expectsPayload) { + socket[kReset] = true; } + request.onRequestSent(); + client[kResume](); + } catch (error) { + abort(error); } - // https://fetch.spec.whatwg.org/#dom-headers-append - append(name, value) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 2, "Headers.append"); - const prefix = "Headers.append"; - name = webidl.converters.ByteString(name, prefix, "name"); - value = webidl.converters.ByteString(value, prefix, "value"); - return appendHeader(this, name, value); - } - // https://fetch.spec.whatwg.org/#dom-headers-delete - delete(name) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 1, "Headers.delete"); - const prefix = "Headers.delete"; - name = webidl.converters.ByteString(name, prefix, "name"); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.delete", - value: name, - type: "header name" - }); - } - if (this.#guard === "immutable") { - throw new TypeError("immutable"); - } - if (!this.#headersList.contains(name, false)) { - return; + } + function writeStream(abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { + assert8(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + const pipe2 = pipeline( + body, + h2stream, + (err) => { + if (err) { + util2.destroy(pipe2, err); + abort(err); + } else { + util2.removeAllListeners(pipe2); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client[kResume](); + } } - this.#headersList.delete(name, false); + ); + util2.addListener(pipe2, "data", onPipeData); + function onPipeData(chunk) { + request.onBodySent(chunk); } - // https://fetch.spec.whatwg.org/#dom-headers-get - get(name) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 1, "Headers.get"); - const prefix = "Headers.get"; - name = webidl.converters.ByteString(name, prefix, "name"); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix, - value: name, - type: "header name" - }); + } + async function writeBlob(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert8(contentLength === body.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError(); } - return this.#headersList.get(name, false); - } - // https://fetch.spec.whatwg.org/#dom-headers-has - has(name) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 1, "Headers.has"); - const prefix = "Headers.has"; - name = webidl.converters.ByteString(name, prefix, "name"); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix, - value: name, - type: "header name" - }); + const buffer2 = Buffer.from(await body.arrayBuffer()); + h2stream.cork(); + h2stream.write(buffer2); + h2stream.uncork(); + h2stream.end(); + request.onBodySent(buffer2); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; } - return this.#headersList.contains(name, false); + client[kResume](); + } catch (err) { + abort(err); } - // https://fetch.spec.whatwg.org/#dom-headers-set - set(name, value) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 2, "Headers.set"); - const prefix = "Headers.set"; - name = webidl.converters.ByteString(name, prefix, "name"); - value = webidl.converters.ByteString(value, prefix, "value"); - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix, - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix, - value, - type: "header value" - }); - } - if (this.#guard === "immutable") { - throw new TypeError("immutable"); + } + async function writeIterable(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert8(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); } - this.#headersList.set(name, value, false); } - // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie - getSetCookie() { - webidl.brandCheck(this, _Headers); - const list = this.#headersList.cookies; - if (list) { - return [...list]; + const waitForDrain = () => new Promise((resolve, reject) => { + assert8(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; } - return []; - } - [util2.inspect.custom](depth, options) { - options.depth ??= depth; - return `Headers ${util2.formatWithOptions(options, this.#headersList.entries)}`; - } - static getHeadersGuard(o3) { - return o3.#guard; - } - static setHeadersGuard(o3, guard) { - o3.#guard = guard; - } - /** - * @param {Headers} o - */ - static getHeadersList(o3) { - return o3.#headersList; - } - /** - * @param {Headers} target - * @param {HeadersList} list - */ - static setHeadersList(target, list) { - target.#headersList = list; - } - }; - var { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers2; - Reflect.deleteProperty(Headers2, "getHeadersGuard"); - Reflect.deleteProperty(Headers2, "setHeadersGuard"); - Reflect.deleteProperty(Headers2, "getHeadersList"); - Reflect.deleteProperty(Headers2, "setHeadersList"); - iteratorMixin("Headers", Headers2, headersListSortAndCombine, 0, 1); - Object.defineProperties(Headers2.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - getSetCookie: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Headers", - configurable: true - }, - [util2.inspect.custom]: { - enumerable: false - } - }); - webidl.converters.HeadersInit = function(V, prefix, argument) { - if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { - const iterator = Reflect.get(V, Symbol.iterator); - if (!util2.types.isProxy(V) && iterator === Headers2.prototype.entries) { - try { - return getHeadersList(V).entriesList; - } catch { + }); + h2stream.on("close", onDrain).on("drain", onDrain); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; + } + const res = h2stream.write(chunk); + request.onBodySent(chunk); + if (!res) { + await waitForDrain(); } } - if (typeof iterator === "function") { - return webidl.converters["sequence>"](V, prefix, argument, iterator.bind(V)); + h2stream.end(); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; } - return webidl.converters["record"](V, prefix, argument); + client[kResume](); + } catch (err) { + abort(err); + } finally { + h2stream.off("close", onDrain).off("drain", onDrain); } - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); - }; - module.exports = { - fill, - // for test. - compareHeaderName, - Headers: Headers2, - HeadersList, - getHeadersGuard, - setHeadersGuard, - setHeadersList, - getHeadersList - }; + } + module.exports = connectH2; } }); -// node_modules/undici/lib/web/fetch/response.js -var require_response = __commonJS({ - "node_modules/undici/lib/web/fetch/response.js"(exports, module) { +// node_modules/undici/lib/dispatcher/client.js +var require_client = __commonJS({ + "node_modules/undici/lib/dispatcher/client.js"(exports, module) { "use strict"; - var { Headers: Headers2, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = require_headers(); - var { extractBody, cloneBody, mixinBody, streamRegistry, bodyUnusable } = require_body(); + var assert8 = __require("assert"); + var net = __require("net"); + var http2 = __require("http"); var util2 = require_util(); - var nodeUtil = __require("util"); - var { kEnumerableProperty } = util2; + var { ClientStats } = require_stats(); + var { channels } = require_diagnostics(); + var Request2 = require_request(); + var DispatcherBase = require_dispatcher_base(); var { - isValidReasonPhrase, - isCancelled, - isAborted: isAborted2, - isErrorLike, - environmentSettingsObject: relevantRealm - } = require_util2(); + InvalidArgumentError, + InformationalError, + ClientDestroyedError + } = require_errors(); + var buildConnector = require_connect(); var { - redirectStatusSet, - nullBodyStatus - } = require_constants4(); - var { webidl } = require_webidl(); - var { URLSerializer } = require_data_url(); - var { kConstruct } = require_symbols(); - var assert8 = __require("assert"); - var { isomorphicEncode, serializeJavascriptValueToJSONString } = require_infra(); - var textEncoder = new TextEncoder("utf-8"); - var Response2 = class _Response { - /** @type {Headers} */ - #headers; - #state; - // Creates network error Response. - static error() { - const responseObject = fromInnerResponse(makeNetworkError(), "immutable"); - return responseObject; - } - // https://fetch.spec.whatwg.org/#dom-response-json - static json(data, init = void 0) { - webidl.argumentLengthCheck(arguments, 1, "Response.json"); - if (init !== null) { - init = webidl.converters.ResponseInit(init); + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kHTTP2InitialWindowSize, + kHTTP2ConnectionWindowSize, + kResume, + kPingInterval + } = require_symbols(); + var connectH1 = require_client_h1(); + var connectH2 = require_client_h2(); + var kClosedResolve = /* @__PURE__ */ Symbol("kClosedResolve"); + var getDefaultNodeMaxHeaderSize = http2 && http2.maxHeaderSize && Number.isInteger(http2.maxHeaderSize) && http2.maxHeaderSize > 0 ? () => http2.maxHeaderSize : () => { + throw new InvalidArgumentError("http module not available or http.maxHeaderSize invalid"); + }; + var noop = () => { + }; + function getPipelining(client) { + return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; + } + var Client = class extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor(url, { + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + connect: connect2, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + maxConcurrentStreams, + allowH2, + useH2c, + initialWindowSize, + connectionWindowSize, + pingInterval, + webSocket + } = {}) { + if (keepAlive !== void 0) { + throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + } + if (socketTimeout !== void 0) { + throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + } + if (requestTimeout !== void 0) { + throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + } + if (idleTimeout !== void 0) { + throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + if (maxKeepAliveTimeout !== void 0) { + throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + } + if (maxHeaderSize != null) { + if (!Number.isInteger(maxHeaderSize) || maxHeaderSize < 1) { + throw new InvalidArgumentError("invalid maxHeaderSize"); + } + } else { + maxHeaderSize = getDefaultNodeMaxHeaderSize(); + } + if (socketPath != null && typeof socketPath !== "string") { + throw new InvalidArgumentError("invalid socketPath"); + } + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError("invalid connectTimeout"); + } + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveTimeout"); + } + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + } + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); + } + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); + } + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); + } + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); } - const bytes = textEncoder.encode( - serializeJavascriptValueToJSONString(data) - ); - const body = extractBody(bytes); - const responseObject = fromInnerResponse(makeResponse({}), "response"); - initializeResponse(responseObject, init, { body: body[0], type: "application/json" }); - return responseObject; - } - // Creates a redirect Response that redirects to url with status status. - static redirect(url, status = 302) { - webidl.argumentLengthCheck(arguments, 1, "Response.redirect"); - url = webidl.converters.USVString(url); - status = webidl.converters["unsigned short"](status); - let parsedURL; - try { - parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl); - } catch (err) { - throw new TypeError(`Failed to parse URL from ${url}`, { cause: err }); + if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError("localAddress must be valid string IP address"); } - if (!redirectStatusSet.has(status)) { - throw new RangeError(`Invalid status code ${status}`); + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError("maxResponseSize must be a positive number"); } - const responseObject = fromInnerResponse(makeResponse({}), "immutable"); - responseObject.#state.status = status; - const value = isomorphicEncode(URLSerializer(parsedURL)); - responseObject.#state.headersList.append("location", value, true); - return responseObject; - } - // https://fetch.spec.whatwg.org/#dom-response - constructor(body = null, init = void 0) { - webidl.util.markAsUncloneable(this); - if (body === kConstruct) { - return; + if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { + throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); } - if (body !== null) { - body = webidl.converters.BodyInit(body, "Response", "body"); + if (allowH2 != null && typeof allowH2 !== "boolean") { + throw new InvalidArgumentError("allowH2 must be a valid boolean value"); } - init = webidl.converters.ResponseInit(init); - this.#state = makeResponse({}); - this.#headers = new Headers2(kConstruct); - setHeadersGuard(this.#headers, "response"); - setHeadersList(this.#headers, this.#state.headersList); - let bodyWithType = null; - if (body != null) { - const [extractedBody, type] = extractBody(body); - bodyWithType = { body: extractedBody, type }; + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); } - initializeResponse(this, init, bodyWithType); + if (useH2c != null && typeof useH2c !== "boolean") { + throw new InvalidArgumentError("useH2c must be a valid boolean value"); + } + if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) { + throw new InvalidArgumentError("initialWindowSize must be a positive integer, greater than 0"); + } + if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) { + throw new InvalidArgumentError("connectionWindowSize must be a positive integer, greater than 0"); + } + if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) { + throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0"); + } + super({ webSocket }); + if (typeof connect2 !== "function") { + connect2 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + useH2c, + socketPath, + timeout: connectTimeout, + ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect2 + }); + } else { + const customConnect = connect2; + connect2 = (opts, callback) => customConnect({ + ...opts, + ...socketPath != null ? { socketPath } : null, + ...allowH2 != null ? { allowH2 } : null + }, callback); + } + this[kUrl] = util2.parseOrigin(url); + this[kConnector] = connect2; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; + this[kNeedDrain] = 0; + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r +`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kHTTPContext] = null; + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; + this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144; + this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288; + this[kPingInterval] = pingInterval != null ? pingInterval : 6e4; + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + this[kResume] = (sync) => resume(this, sync); + this[kOnError] = (err) => onError(this, err); } - // Returns response’s type, e.g., "cors". - get type() { - webidl.brandCheck(this, _Response); - return this.#state.type; + get pipelining() { + return this[kPipelining]; } - // Returns response’s URL, if it has one; otherwise the empty string. - get url() { - webidl.brandCheck(this, _Response); - const urlList = this.#state.urlList; - const url = urlList[urlList.length - 1] ?? null; - if (url === null) { - return ""; - } - return URLSerializer(url, true); + set pipelining(value) { + this[kPipelining] = value; + this[kResume](true); } - // Returns whether response was obtained through a redirect. - get redirected() { - webidl.brandCheck(this, _Response); - return this.#state.urlList.length > 1; + get stats() { + return new ClientStats(this); } - // Returns response’s status. - get status() { - webidl.brandCheck(this, _Response); - return this.#state.status; + get [kPending]() { + return this[kQueue].length - this[kPendingIdx]; } - // Returns whether response’s status is an ok status. - get ok() { - webidl.brandCheck(this, _Response); - return this.#state.status >= 200 && this.#state.status <= 299; + get [kRunning]() { + return this[kPendingIdx] - this[kRunningIdx]; } - // Returns response’s status message. - get statusText() { - webidl.brandCheck(this, _Response); - return this.#state.statusText; + get [kSize]() { + return this[kQueue].length - this[kRunningIdx]; } - // Returns response’s headers as Headers. - get headers() { - webidl.brandCheck(this, _Response); - return this.#headers; + get [kConnected]() { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed; } - get body() { - webidl.brandCheck(this, _Response); - return this.#state.body ? this.#state.body.stream : null; + get [kBusy]() { + return Boolean( + this[kHTTPContext]?.busy(null) || this[kSize] >= (getPipelining(this) || 1) || this[kPending] > 0 + ); } - get bodyUsed() { - webidl.brandCheck(this, _Response); - return !!this.#state.body && util2.isDisturbed(this.#state.body.stream); + [kConnect](cb) { + connect(this); + this.once("connect", cb); } - // Returns a clone of response. - clone() { - webidl.brandCheck(this, _Response); - if (bodyUnusable(this.#state)) { - throw webidl.errors.exception({ - header: "Response.clone", - message: "Body has already been consumed." - }); + [kDispatch](opts, handler) { + const request = new Request2(this[kUrl].origin, opts, handler); + this[kQueue].push(request); + if (this[kResuming]) { + } else if (util2.bodyLength(request.body) == null && util2.isIterable(request.body)) { + this[kResuming] = 1; + queueMicrotask(() => resume(this)); + } else { + this[kResume](true); } - const clonedResponse = cloneResponse(this.#state); - if (this.#state.urlList.length !== 0 && this.#state.body?.stream) { - streamRegistry.register(this, new WeakRef(this.#state.body.stream)); + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; } - return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers)); + return this[kNeedDrain] < 2; } - [nodeUtil.inspect.custom](depth, options) { - if (options.depth === null) { - options.depth = 2; + [kClose]() { + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve; + } else { + resolve(null); + } + }); + } + [kDestroy](err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util2.errorRequest(this, request, err); + } + const callback = () => { + if (this[kClosedResolve]) { + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(null); + }; + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback); + this[kHTTPContext] = null; + } else { + queueMicrotask(callback); + } + this[kResume](); + }); + } + }; + function onError(client, err) { + if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { + assert8(client[kPendingIdx] === client[kRunningIdx]); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util2.errorRequest(client, request, err); } - options.colors ??= true; - const properties = { - status: this.status, - statusText: this.statusText, - headers: this.headers, - body: this.body, - bodyUsed: this.bodyUsed, - ok: this.ok, - redirected: this.redirected, - type: this.type, - url: this.url - }; - return `Response ${nodeUtil.formatWithOptions(options, properties)}`; + assert8(client[kSize] === 0); } - /** - * @param {Response} response - */ - static getResponseHeaders(response) { - return response.#headers; + } + function connect(client) { + assert8(!client[kConnecting]); + assert8(!client[kHTTPContext]); + let { host, hostname, protocol, port } = client[kUrl]; + if (hostname[0] === "[") { + const idx = hostname.indexOf("]"); + assert8(idx !== -1); + const ip = hostname.substring(1, idx); + assert8(net.isIPv6(ip)); + hostname = ip; } - /** - * @param {Response} response - * @param {Headers} newHeaders - */ - static setResponseHeaders(response, newHeaders) { - response.#headers = newHeaders; + client[kConnecting] = true; + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] + }); } - /** - * @param {Response} response - */ - static getResponseState(response) { - return response.#state; + try { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket) => { + if (err) { + handleConnectError(client, err, { host, hostname, protocol, port }); + client[kResume](); + return; + } + if (client.destroyed) { + util2.destroy(socket.on("error", noop), new ClientDestroyedError()); + client[kResume](); + return; + } + assert8(socket); + try { + client[kHTTPContext] = socket.alpnProtocol === "h2" ? connectH2(client, socket) : connectH1(client, socket); + } catch (err2) { + socket.destroy().on("error", noop); + handleConnectError(client, err2, { host, hostname, protocol, port }); + client[kResume](); + return; + } + client[kConnecting] = false; + socket[kCounter] = 0; + socket[kMaxRequests] = client[kMaxRequests]; + socket[kClient] = client; + socket[kError] = null; + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }); + } + client.emit("connect", client[kUrl], [client]); + client[kResume](); + }); + } catch (err) { + handleConnectError(client, err, { host, hostname, protocol, port }); + client[kResume](); } - /** - * @param {Response} response - * @param {any} newState - */ - static setResponseState(response, newState) { - response.#state = newState; + } + function handleConnectError(client, err, { host, hostname, protocol, port }) { + if (client.destroyed) { + return; } - }; - var { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response2; - Reflect.deleteProperty(Response2, "getResponseHeaders"); - Reflect.deleteProperty(Response2, "setResponseHeaders"); - Reflect.deleteProperty(Response2, "getResponseState"); - Reflect.deleteProperty(Response2, "setResponseState"); - mixinBody(Response2, getResponseState); - Object.defineProperties(Response2.prototype, { - type: kEnumerableProperty, - url: kEnumerableProperty, - status: kEnumerableProperty, - ok: kEnumerableProperty, - redirected: kEnumerableProperty, - statusText: kEnumerableProperty, - headers: kEnumerableProperty, - clone: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Response", - configurable: true + client[kConnecting] = false; + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }); + } + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + assert8(client[kRunning] === 0); + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++]; + util2.errorRequest(client, request, err); + } + } else { + onError(client, err); + } + client.emit("connectionError", client[kUrl], [client], err); + } + function emitDrain(client) { + client[kNeedDrain] = 0; + client.emit("drain", client[kUrl], [client]); + } + function resume(client, sync) { + if (client[kResuming] === 2) { + return; + } + client[kResuming] = 2; + _resume(client, sync); + client[kResuming] = 0; + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]); + client[kPendingIdx] -= client[kRunningIdx]; + client[kRunningIdx] = 0; + } + } + function _resume(client, sync) { + while (true) { + if (client.destroyed) { + assert8(client[kPending] === 0); + return; + } + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve](); + client[kClosedResolve] = null; + return; + } + if (client[kHTTPContext]) { + client[kHTTPContext].resume(); + } + if (client[kBusy]) { + client[kNeedDrain] = 2; + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1; + queueMicrotask(() => emitDrain(client)); + } else { + emitDrain(client); + } + continue; + } + if (client[kPending] === 0) { + return; + } + if (client[kRunning] >= (getPipelining(client) || 1)) { + return; + } + const request = client[kQueue][client[kPendingIdx]]; + if (request === null) { + return; + } + if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return; + } + client[kServerName] = request.servername; + client[kHTTPContext]?.destroy(new InformationalError("servername changed"), () => { + client[kHTTPContext] = null; + resume(client); + }); + } + if (client[kConnecting]) { + return; + } + if (!client[kHTTPContext]) { + connect(client); + return; + } + if (client[kHTTPContext].destroyed) { + return; + } + if (client[kHTTPContext].busy(request)) { + return; + } + if (!request.aborted && client[kHTTPContext].write(request)) { + client[kPendingIdx]++; + } else { + client[kQueue].splice(client[kPendingIdx], 1); + } + } + } + module.exports = Client; + } +}); + +// node_modules/undici/lib/dispatcher/fixed-queue.js +var require_fixed_queue = __commonJS({ + "node_modules/undici/lib/dispatcher/fixed-queue.js"(exports, module) { + "use strict"; + var kSize = 2048; + var kMask = kSize - 1; + var FixedCircularBuffer = class { + /** @type {number} */ + bottom = 0; + /** @type {number} */ + top = 0; + /** @type {Array} */ + list = new Array(kSize).fill(void 0); + /** @type {T|null} */ + next = null; + /** @returns {boolean} */ + isEmpty() { + return this.top === this.bottom; } - }); - Object.defineProperties(Response2, { - json: kEnumerableProperty, - redirect: kEnumerableProperty, - error: kEnumerableProperty - }); - function cloneResponse(response) { - if (response.internalResponse) { - return filterResponse( - cloneResponse(response.internalResponse), - response.type - ); + /** @returns {boolean} */ + isFull() { + return (this.top + 1 & kMask) === this.bottom; } - const newResponse = makeResponse({ ...response, body: null }); - if (response.body != null) { - newResponse.body = cloneBody(response.body); + /** + * @param {T} data + * @returns {void} + */ + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; } - return newResponse; - } - function makeResponse(init) { - return { - aborted: false, - rangeRequested: false, - timingAllowPassed: false, - requestIncludesCredentials: false, - type: "default", - status: 200, - timingInfo: null, - cacheState: "", - statusText: "", - ...init, - headersList: init?.headersList ? new HeadersList(init?.headersList) : new HeadersList(), - urlList: init?.urlList ? [...init.urlList] : [] - }; - } - function makeNetworkError(reason) { - const isError = isErrorLike(reason); - return makeResponse({ - type: "error", - status: 0, - error: isError ? reason : new Error(reason ? String(reason) : reason), - aborted: reason && reason.name === "AbortError" - }); - } - function isNetworkError(response) { - return ( - // A network error is a response whose type is "error", - response.type === "error" && // status is 0 - response.status === 0 - ); - } - function makeFilteredResponse(response, state) { - state = { - internalResponse: response, - ...state - }; - return new Proxy(response, { - get(target, p) { - return p in state ? state[p] : target[p]; - }, - set(target, p, value) { - assert8(!(p in state)); - target[p] = value; - return true; + /** @returns {T|null} */ + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === void 0) { + return null; } - }); - } - function filterResponse(response, type) { - if (type === "basic") { - return makeFilteredResponse(response, { - type: "basic", - headersList: response.headersList - }); - } else if (type === "cors") { - return makeFilteredResponse(response, { - type: "cors", - headersList: response.headersList - }); - } else if (type === "opaque") { - return makeFilteredResponse(response, { - type: "opaque", - urlList: [], - status: 0, - statusText: "", - body: null - }); - } else if (type === "opaqueredirect") { - return makeFilteredResponse(response, { - type: "opaqueredirect", - status: 0, - statusText: "", - headersList: [], - body: null - }); - } else { - assert8(false); + this.list[this.bottom] = void 0; + this.bottom = this.bottom + 1 & kMask; + return nextItem; } - } - function makeAppropriateNetworkError(fetchParams, err = null) { - assert8(isCancelled(fetchParams)); - return isAborted2(fetchParams) ? makeNetworkError(Object.assign(new DOMException("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException("Request was cancelled."), { cause: err })); - } - function initializeResponse(response, init, body) { - if (init.status !== null && (init.status < 200 || init.status > 599)) { - throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); + }; + module.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); } - if ("statusText" in init && init.statusText != null) { - if (!isValidReasonPhrase(String(init.statusText))) { - throw new TypeError("Invalid statusText"); + /** @returns {boolean} */ + isEmpty() { + return this.head.isEmpty(); + } + /** @param {T} data */ + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer(); } + this.head.push(data); } - if ("status" in init && init.status != null) { - getResponseState(response).status = init.status; + /** @returns {T|null} */ + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; + tail.next = null; + } + return next; } - if ("statusText" in init && init.statusText != null) { - getResponseState(response).statusText = init.statusText; + }; + } +}); + +// node_modules/undici/lib/dispatcher/pool-base.js +var require_pool_base = __commonJS({ + "node_modules/undici/lib/dispatcher/pool-base.js"(exports, module) { + "use strict"; + var { PoolStats } = require_stats(); + var DispatcherBase = require_dispatcher_base(); + var FixedQueue = require_fixed_queue(); + var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); + var kClients = /* @__PURE__ */ Symbol("clients"); + var kNeedDrain = /* @__PURE__ */ Symbol("needDrain"); + var kQueue = /* @__PURE__ */ Symbol("queue"); + var kClosedResolve = /* @__PURE__ */ Symbol("closed resolve"); + var kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + var kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + var kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + var kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + var kGetDispatcher = /* @__PURE__ */ Symbol("get dispatcher"); + var kAddClient = /* @__PURE__ */ Symbol("add client"); + var kRemoveClient = /* @__PURE__ */ Symbol("remove client"); + var PoolBase = class extends DispatcherBase { + [kQueue] = new FixedQueue(); + [kQueued] = 0; + [kClients] = []; + [kNeedDrain] = false; + [kOnDrain](client, origin, targets) { + const queue = this[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break; + } + this[kQueued]--; + needDrain = !client.dispatch(item.opts, item.handler); + } + client[kNeedDrain] = needDrain; + if (!needDrain && this[kNeedDrain]) { + this[kNeedDrain] = false; + this.emit("drain", origin, [this, ...targets]); + } + if (this[kClosedResolve] && queue.isEmpty()) { + const closeAll = []; + for (let i = 0; i < this[kClients].length; i++) { + const client2 = this[kClients][i]; + if (!client2.destroyed) { + closeAll.push(client2.close()); + } + } + return Promise.all(closeAll).then(this[kClosedResolve]); + } } - if ("headers" in init && init.headers != null) { - fill(getResponseHeaders(response), init.headers); + [kOnConnect] = (origin, targets) => { + this.emit("connect", origin, [this, ...targets]); + }; + [kOnDisconnect] = (origin, targets, err) => { + this.emit("disconnect", origin, [this, ...targets], err); + }; + [kOnConnectionError] = (origin, targets, err) => { + this.emit("connectionError", origin, [this, ...targets], err); + }; + get [kBusy]() { + return this[kNeedDrain]; } - if (body) { - if (nullBodyStatus.includes(response.status)) { - throw webidl.errors.exception({ - header: "Response constructor", - message: `Invalid response status code ${response.status}` - }); + get [kConnected]() { + let ret = 0; + for (const { [kConnected]: connected } of this[kClients]) { + ret += connected; } - getResponseState(response).body = body.body; - if (body.type != null && !getResponseState(response).headersList.contains("content-type", true)) { - getResponseState(response).headersList.append("content-type", body.type, true); + return ret; + } + get [kFree]() { + let ret = 0; + for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) { + ret += connected && !needDrain; } + return ret; } - } - function fromInnerResponse(innerResponse, guard) { - const response = new Response2(kConstruct); - setResponseState(response, innerResponse); - const headers = new Headers2(kConstruct); - setResponseHeaders(response, headers); - setHeadersList(headers, innerResponse.headersList); - setHeadersGuard(headers, guard); - if (innerResponse.urlList.length !== 0 && innerResponse.body?.stream) { - streamRegistry.register(response, new WeakRef(innerResponse.body.stream)); + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; + } + return ret; } - return response; - } - webidl.converters.XMLHttpRequestBodyInit = function(V, prefix, name) { - if (typeof V === "string") { - return webidl.converters.USVString(V, prefix, name); + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret; } - if (webidl.is.Blob(V)) { - return V; + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size5 } of this[kClients]) { + ret += size5; + } + return ret; } - if (webidl.is.BufferSource(V)) { - return V; + get stats() { + return new PoolStats(this); } - if (webidl.is.FormData(V)) { - return V; + [kClose]() { + if (this[kQueue].isEmpty()) { + const closeAll = []; + for (let i = 0; i < this[kClients].length; i++) { + const client = this[kClients][i]; + if (!client.destroyed) { + closeAll.push(client.close()); + } + } + return Promise.all(closeAll); + } else { + return new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); + } } - if (webidl.is.URLSearchParams(V)) { - return V; + [kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; + } + item.handler.onResponseError(null, err); + } + const destroyAll = new Array(this[kClients].length); + for (let i = 0; i < this[kClients].length; i++) { + destroyAll[i] = this[kClients][i].destroy(err); + } + return Promise.all(destroyAll); } - return webidl.converters.DOMString(V, prefix, name); - }; - webidl.converters.BodyInit = function(V, prefix, argument) { - if (webidl.is.ReadableStream(V)) { - return V; + [kDispatch](opts, handler) { + const dispatcher = this[kGetDispatcher](); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); + } + return !this[kNeedDrain]; } - if (V?.[Symbol.asyncIterator]) { - return V; + [kAddClient](client) { + client.on("drain", this[kOnDrain].bind(this, client)).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client); + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client, client[kUrl], [client, this]); + } + }); + } + return this; } - return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument); - }; - webidl.converters.ResponseInit = webidl.dictionaryConverter([ - { - key: "status", - converter: webidl.converters["unsigned short"], - defaultValue: () => 200 - }, - { - key: "statusText", - converter: webidl.converters.ByteString, - defaultValue: () => "" - }, - { - key: "headers", - converter: webidl.converters.HeadersInit + [kRemoveClient](client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); } - ]); - webidl.is.Response = webidl.util.MakeTypeAssertion(Response2); + }; module.exports = { - isNetworkError, - makeNetworkError, - makeResponse, - makeAppropriateNetworkError, - filterResponse, - Response: Response2, - cloneResponse, - fromInnerResponse, - getResponseState + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher }; } }); -// node_modules/undici/lib/web/fetch/request.js -var require_request2 = __commonJS({ - "node_modules/undici/lib/web/fetch/request.js"(exports, module) { +// node_modules/undici/lib/dispatcher/pool.js +var require_pool = __commonJS({ + "node_modules/undici/lib/dispatcher/pool.js"(exports, module) { "use strict"; - var { extractBody, mixinBody, cloneBody, bodyUnusable } = require_body(); - var { Headers: Headers2, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require_headers(); - var util2 = require_util(); - var nodeUtil = __require("util"); var { - isValidHTTPToken, - sameOrigin, - environmentSettingsObject - } = require_util2(); + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher, + kRemoveClient + } = require_pool_base(); + var Client = require_client(); var { - forbiddenMethodsSet, - corsSafeListedMethodsSet, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - requestDuplex - } = require_constants4(); - var { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util2; - var { webidl } = require_webidl(); - var { URLSerializer } = require_data_url(); - var { kConstruct } = require_symbols(); - var assert8 = __require("assert"); - var { getMaxListeners, setMaxListeners: setMaxListeners7, defaultMaxListeners } = __require("events"); - var kAbortController = /* @__PURE__ */ Symbol("abortController"); - var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { - signal.removeEventListener("abort", abort); - }); - var dependentControllerMap = /* @__PURE__ */ new WeakMap(); - var abortSignalHasEventHandlerLeakWarning; - try { - abortSignalHasEventHandlerLeakWarning = getMaxListeners(new AbortController().signal) > 0; - } catch { - abortSignalHasEventHandlerLeakWarning = false; + InvalidArgumentError + } = require_errors(); + var util2 = require_util(); + var { kUrl } = require_symbols(); + var buildConnector = require_connect(); + var kOptions = /* @__PURE__ */ Symbol("options"); + var kConnections = /* @__PURE__ */ Symbol("connections"); + var kFactory = /* @__PURE__ */ Symbol("factory"); + function defaultFactory(origin, opts) { + return new Client(origin, opts); } - function buildAbort(acRef) { - return abort; - function abort() { - const ac = acRef.deref(); - if (ac !== void 0) { - requestFinalizer.unregister(abort); - this.removeEventListener("abort", abort); - ac.abort(this.reason); - const controllerList = dependentControllerMap.get(ac.signal); - if (controllerList !== void 0) { - if (controllerList.size !== 0) { - for (const ref of controllerList) { - const ctrl = ref.deref(); - if (ctrl !== void 0) { - ctrl.abort(this.reason); - } - } - controllerList.clear(); + var Pool = class extends PoolBase { + constructor(origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + clientTtl, + ...options + } = {}) { + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError("invalid connections"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (typeof connect !== "function") { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect + }); + } + super(options); + this[kConnections] = connections || null; + this[kUrl] = util2.parseOrigin(origin); + this[kOptions] = { ...util2.deepClone(options), connect, allowH2, clientTtl, socketPath }; + this[kFactory] = factory; + this.on("connect", (origin2, targets) => { + if (clientTtl != null && clientTtl > 0) { + for (const target of targets) { + Object.assign(target, { ttl: Date.now() }); } - dependentControllerMap.delete(ac.signal); } + }); + this.on("connectionError", (origin2, targets, error) => { + for (const target of targets) { + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); + } + [kGetDispatcher]() { + const clientTtlOption = this[kOptions].clientTtl; + for (const client of this[kClients]) { + if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && Date.now() - client.ttl > clientTtlOption) { + this[kRemoveClient](client); + } else if (!client[kNeedDrain]) { + return client; + } + } + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + return dispatcher; } } + }; + module.exports = Pool; + } +}); + +// node_modules/undici/lib/dispatcher/balanced-pool.js +var require_balanced_pool = __commonJS({ + "node_modules/undici/lib/dispatcher/balanced-pool.js"(exports, module) { + "use strict"; + var { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = require_errors(); + var { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = require_pool_base(); + var Pool = require_pool(); + var { kUrl } = require_symbols(); + var util2 = require_util(); + var kFactory = /* @__PURE__ */ Symbol("factory"); + var kOptions = /* @__PURE__ */ Symbol("options"); + var kGreatestCommonDivisor = /* @__PURE__ */ Symbol("kGreatestCommonDivisor"); + var kCurrentWeight = /* @__PURE__ */ Symbol("kCurrentWeight"); + var kIndex = /* @__PURE__ */ Symbol("kIndex"); + var kWeight = /* @__PURE__ */ Symbol("kWeight"); + var kMaxWeightPerServer = /* @__PURE__ */ Symbol("kMaxWeightPerServer"); + var kErrorPenalty = /* @__PURE__ */ Symbol("kErrorPenalty"); + function getGreatestCommonDivisor(a, b) { + if (a === 0) return b; + while (b !== 0) { + const t = b; + b = a % b; + a = t; + } + return a; } - var patchMethodWarning = false; - var Request2 = class _Request { - /** @type {AbortSignal} */ - #signal; - /** @type {import('../../dispatcher/dispatcher')} */ - #dispatcher; - /** @type {Headers} */ - #headers; - #state; - // https://fetch.spec.whatwg.org/#dom-request - constructor(input, init = void 0) { - webidl.util.markAsUncloneable(this); - if (input === kConstruct) { - return; - } - const prefix = "Request constructor"; - webidl.argumentLengthCheck(arguments, 1, prefix); - input = webidl.converters.RequestInfo(input); - init = webidl.converters.RequestInit(init); - let request = null; - let fallbackMode = null; - const baseUrl = environmentSettingsObject.settingsObject.baseUrl; - let signal = null; - if (typeof input === "string") { - this.#dispatcher = init.dispatcher; - let parsedURL; - try { - parsedURL = new URL(input, baseUrl); - } catch (err) { - throw new TypeError("Failed to parse URL from " + input, { cause: err }); - } - if (parsedURL.username || parsedURL.password) { - throw new TypeError( - "Request cannot be constructed from a URL that includes credentials: " + input - ); - } - request = makeRequest({ urlList: [parsedURL] }); - fallbackMode = "cors"; - } else { - assert8(webidl.is.Request(input)); - request = input.#state; - signal = input.#signal; - this.#dispatcher = init.dispatcher || input.#dispatcher; + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + var BalancedPool = class extends PoolBase { + constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - const origin = environmentSettingsObject.settingsObject.origin; - let window = "client"; - if (request.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request.window, origin)) { - window = request.window; + super(); + this[kOptions] = { ...util2.deepClone(opts) }; + this[kIndex] = -1; + this[kCurrentWeight] = 0; + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; } - if (init.window != null) { - throw new TypeError(`'window' option '${window}' must be null`); + this[kFactory] = factory; + for (const upstream of upstreams) { + this.addUpstream(upstream); } - if ("window" in init) { - window = "no-window"; + this._updateBalancedPoolStats(); + } + addUpstream(upstream) { + const upstreamOrigin = util2.parseOrigin(upstream).origin; + if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) { + return this; } - request = makeRequest({ - // URL request’s URL. - // undici implementation note: this is set as the first item in request's urlList in makeRequest - // method request’s method. - method: request.method, - // header list A copy of request’s header list. - // undici implementation note: headersList is cloned in makeRequest - headersList: request.headersList, - // unsafe-request flag Set. - unsafeRequest: request.unsafeRequest, - // client This’s relevant settings object. - client: environmentSettingsObject.settingsObject, - // window window. - window, - // priority request’s priority. - priority: request.priority, - // origin request’s origin. The propagation of the origin is only significant for navigation requests - // being handled by a service worker. In this scenario a request can have an origin that is different - // from the current client. - origin: request.origin, - // referrer request’s referrer. - referrer: request.referrer, - // referrer policy request’s referrer policy. - referrerPolicy: request.referrerPolicy, - // mode request’s mode. - mode: request.mode, - // credentials mode request’s credentials mode. - credentials: request.credentials, - // cache mode request’s cache mode. - cache: request.cache, - // redirect mode request’s redirect mode. - redirect: request.redirect, - // integrity metadata request’s integrity metadata. - integrity: request.integrity, - // keepalive request’s keepalive. - keepalive: request.keepalive, - // reload-navigation flag request’s reload-navigation flag. - reloadNavigation: request.reloadNavigation, - // history-navigation flag request’s history-navigation flag. - historyNavigation: request.historyNavigation, - // URL list A clone of request’s URL list. - urlList: [...request.urlList] + const pool = this[kFactory](upstreamOrigin, this[kOptions]); + this[kAddClient](pool); + pool.on("connect", () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); }); - const initHasKey = Object.keys(init).length !== 0; - if (initHasKey) { - if (request.mode === "navigate") { - request.mode = "same-origin"; - } - request.reloadNavigation = false; - request.historyNavigation = false; - request.origin = "client"; - request.referrer = "client"; - request.referrerPolicy = ""; - request.url = request.urlList[request.urlList.length - 1]; - request.urlList = [request.url]; - } - if (init.referrer !== void 0) { - const referrer = init.referrer; - if (referrer === "") { - request.referrer = "no-referrer"; - } else { - let parsedReferrer; - try { - parsedReferrer = new URL(referrer, baseUrl); - } catch (err) { - throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); - } - if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl)) { - request.referrer = "client"; - } else { - request.referrer = parsedReferrer; - } + pool.on("connectionError", () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); + pool.on("disconnect", (...args) => { + const err = args[2]; + if (err && err.code === "UND_ERR_SOCKET") { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); } + }); + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer]; } - if (init.referrerPolicy !== void 0) { - request.referrerPolicy = init.referrerPolicy; + this._updateBalancedPoolStats(); + return this; + } + _updateBalancedPoolStats() { + let result = 0; + for (let i = 0; i < this[kClients].length; i++) { + result = getGreatestCommonDivisor(this[kClients][i][kWeight], result); } - let mode; - if (init.mode !== void 0) { - mode = init.mode; - } else { - mode = fallbackMode; + this[kGreatestCommonDivisor] = result; + } + removeUpstream(upstream) { + const upstreamOrigin = util2.parseOrigin(upstream).origin; + const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true); + if (pool) { + this[kRemoveClient](pool); } - if (mode === "navigate") { - throw webidl.errors.exception({ - header: "Request constructor", - message: "invalid request mode navigate." - }); + return this; + } + getUpstream(upstream) { + const upstreamOrigin = util2.parseOrigin(upstream).origin; + return this[kClients].find((pool) => pool[kUrl].origin === upstreamOrigin && pool.closed !== true && pool.destroyed !== true); + } + get upstreams() { + return this[kClients].filter((dispatcher) => dispatcher.closed !== true && dispatcher.destroyed !== true).map((p) => p[kUrl].origin); + } + [kGetDispatcher]() { + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError(); } - if (mode != null) { - request.mode = mode; + const dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); + if (!dispatcher) { + return; } - if (init.credentials !== void 0) { - request.credentials = init.credentials; + const allClientsBusy = this[kClients].map((pool) => pool[kNeedDrain]).reduce((a, b) => a && b, true); + if (allClientsBusy) { + return; } - if (init.cache !== void 0) { - request.cache = init.cache; + let counter = 0; + let maxWeightIndex = this[kClients].findIndex((pool) => !pool[kNeedDrain]); + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool = this[kClients][this[kIndex]]; + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex]; + } + if (this[kIndex] === 0) { + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; + } + } + if (pool[kWeight] >= this[kCurrentWeight] && !pool[kNeedDrain]) { + return pool; + } } - if (request.cache === "only-if-cached" && request.mode !== "same-origin") { - throw new TypeError( - "'only-if-cached' can be set only with 'same-origin' mode" - ); + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex]; + } + }; + module.exports = BalancedPool; + } +}); + +// node_modules/undici/lib/dispatcher/round-robin-pool.js +var require_round_robin_pool = __commonJS({ + "node_modules/undici/lib/dispatcher/round-robin-pool.js"(exports, module) { + "use strict"; + var { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher, + kRemoveClient + } = require_pool_base(); + var Client = require_client(); + var { + InvalidArgumentError + } = require_errors(); + var util2 = require_util(); + var { kUrl } = require_symbols(); + var buildConnector = require_connect(); + var kOptions = /* @__PURE__ */ Symbol("options"); + var kConnections = /* @__PURE__ */ Symbol("connections"); + var kFactory = /* @__PURE__ */ Symbol("factory"); + var kIndex = /* @__PURE__ */ Symbol("index"); + function defaultFactory(origin, opts) { + return new Client(origin, opts); + } + var RoundRobinPool = class extends PoolBase { + constructor(origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + clientTtl, + ...options + } = {}) { + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError("invalid connections"); } - if (init.redirect !== void 0) { - request.redirect = init.redirect; + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - if (init.integrity != null) { - request.integrity = String(init.integrity); + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - if (init.keepalive !== void 0) { - request.keepalive = Boolean(init.keepalive); + if (typeof connect !== "function") { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect + }); } - if (init.method !== void 0) { - let method = init.method; - const mayBeNormalized = normalizedMethodRecords[method]; - if (mayBeNormalized !== void 0) { - request.method = mayBeNormalized; - } else { - if (!isValidHTTPToken(method)) { - throw new TypeError(`'${method}' is not a valid HTTP method.`); + super(); + this[kConnections] = connections || null; + this[kUrl] = util2.parseOrigin(origin); + this[kOptions] = { ...util2.deepClone(options), connect, allowH2, clientTtl, socketPath }; + this[kFactory] = factory; + this[kIndex] = -1; + this.on("connect", (origin2, targets) => { + if (clientTtl != null && clientTtl > 0) { + for (const target of targets) { + Object.assign(target, { ttl: Date.now() }); } - const upperCase = method.toUpperCase(); - if (forbiddenMethodsSet.has(upperCase)) { - throw new TypeError(`'${method}' HTTP method is unsupported.`); + } + }); + this.on("connectionError", (origin2, targets, error) => { + for (const target of targets) { + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); } - method = normalizedMethodRecordsBase[upperCase] ?? method; - request.method = method; } - if (!patchMethodWarning && request.method === "patch") { - process.emitWarning("Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.", { - code: "UNDICI-FETCH-patch" - }); - patchMethodWarning = true; + }); + } + [kGetDispatcher]() { + const clientTtlOption = this[kOptions].clientTtl; + const clientsLength = this[kClients].length; + if (clientsLength === 0) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + return dispatcher; + } + let checked = 0; + while (checked < clientsLength) { + this[kIndex] = (this[kIndex] + 1) % clientsLength; + const client = this[kClients][this[kIndex]]; + if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && Date.now() - client.ttl > clientTtlOption) { + this[kRemoveClient](client); + checked++; + continue; } + if (!client[kNeedDrain]) { + return client; + } + checked++; } - if (init.signal !== void 0) { - signal = init.signal; + if (!this[kConnections] || clientsLength < this[kConnections]) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + return dispatcher; } - this.#state = request; - const ac = new AbortController(); - this.#signal = ac.signal; - if (signal != null) { - if (signal.aborted) { - ac.abort(signal.reason); - } else { - this[kAbortController] = ac; - const acRef = new WeakRef(ac); - const abort = buildAbort(acRef); - if (abortSignalHasEventHandlerLeakWarning && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners7(1500, signal); - } - util2.addAbortListener(signal, abort); - requestFinalizer.register(ac, { signal, abort }, abort); - } + } + }; + module.exports = RoundRobinPool; + } +}); + +// node_modules/undici/lib/dispatcher/agent.js +var require_agent = __commonJS({ + "node_modules/undici/lib/dispatcher/agent.js"(exports, module) { + "use strict"; + var { InvalidArgumentError, MaxOriginsReachedError } = require_errors(); + var { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = require_symbols(); + var DispatcherBase = require_dispatcher_base(); + var Pool = require_pool(); + var Client = require_client(); + var util2 = require_util(); + var kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + var kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + var kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + var kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + var kFactory = /* @__PURE__ */ Symbol("factory"); + var kOptions = /* @__PURE__ */ Symbol("options"); + var kOrigins = /* @__PURE__ */ Symbol("origins"); + function defaultFactory(origin, opts) { + return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); + } + var Agent = class extends DispatcherBase { + constructor({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) { + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - this.#headers = new Headers2(kConstruct); - setHeadersList(this.#headers, request.headersList); - setHeadersGuard(this.#headers, "request"); - if (mode === "no-cors") { - if (!corsSafeListedMethodsSet.has(request.method)) { - throw new TypeError( - `'${request.method} is unsupported in no-cors mode.` - ); - } - setHeadersGuard(this.#headers, "request-no-cors"); + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (typeof maxOrigins !== "number" || Number.isNaN(maxOrigins) || maxOrigins <= 0) { + throw new InvalidArgumentError("maxOrigins must be a number greater than 0"); + } + super(options); + if (connect && typeof connect !== "function") { + connect = { ...connect }; + } + this[kOptions] = { ...util2.deepClone(options), maxOrigins, connect }; + this[kFactory] = factory; + this[kClients] = /* @__PURE__ */ new Map(); + this[kOrigins] = /* @__PURE__ */ new Set(); + this[kOnDrain] = (origin, targets) => { + this.emit("drain", origin, [this, ...targets]); + }; + this[kOnConnect] = (origin, targets) => { + this.emit("connect", origin, [this, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + this.emit("disconnect", origin, [this, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + this.emit("connectionError", origin, [this, ...targets], err); + }; + } + get [kRunning]() { + let ret = 0; + for (const { dispatcher } of this[kClients].values()) { + ret += dispatcher[kRunning]; + } + return ret; + } + [kDispatch](opts, handler) { + let origin; + if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { + origin = String(opts.origin); + } else { + throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); } - if (initHasKey) { - const headersList = getHeadersList(this.#headers); - const headers = init.headers !== void 0 ? init.headers : new HeadersList(headersList); - headersList.clear(); - if (headers instanceof HeadersList) { - for (const { name, value } of headers.rawValues()) { - headersList.append(name, value, false); + const allowH2 = opts.allowH2 ?? this[kOptions].allowH2; + const key = allowH2 === false ? `${origin}#http1-only` : origin; + if (this[kOrigins].size >= this[kOptions].maxOrigins && !this[kOrigins].has(origin)) { + throw new MaxOriginsReachedError(); + } + const result = this[kClients].get(key); + let dispatcher = result && result.dispatcher; + if (!dispatcher) { + const closeClientIfUnused = (connected) => { + const result2 = this[kClients].get(key); + if (result2) { + if (connected) result2.count -= 1; + if (result2.count <= 0) { + this[kClients].delete(key); + if (!result2.dispatcher.destroyed) { + result2.dispatcher.close(); + } + } + let hasOrigin = false; + for (const entry of this[kClients].values()) { + if (entry.origin === origin) { + hasOrigin = true; + break; + } + } + if (!hasOrigin) { + this[kOrigins].delete(origin); + } } - headersList.cookies = headers.cookies; - } else { - fillHeaders(this.#headers, headers); - } + }; + dispatcher = this[kFactory](opts.origin, allowH2 === false ? { ...this[kOptions], allowH2: false } : this[kOptions]).on("drain", this[kOnDrain]).on("connect", (origin2, targets) => { + const result2 = this[kClients].get(key); + if (result2) { + result2.count += 1; + } + this[kOnConnect](origin2, targets); + }).on("disconnect", (origin2, targets, err) => { + closeClientIfUnused(true); + this[kOnDisconnect](origin2, targets, err); + }).on("connectionError", (origin2, targets, err) => { + closeClientIfUnused(false); + this[kOnConnectionError](origin2, targets, err); + }); + this[kClients].set(key, { count: 0, dispatcher, origin }); + this[kOrigins].add(origin); } - const inputBody = webidl.is.Request(input) ? input.#state.body : null; - if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { - throw new TypeError("Request with GET/HEAD method cannot have body."); + return dispatcher.dispatch(opts, handler); + } + [kClose]() { + const closePromises = []; + for (const { dispatcher } of this[kClients].values()) { + closePromises.push(dispatcher.close()); } - let initBody = null; - if (init.body != null) { - const [extractedBody, contentType] = extractBody( - init.body, - request.keepalive - ); - initBody = extractedBody; - if (contentType && !getHeadersList(this.#headers).contains("content-type", true)) { - this.#headers.append("content-type", contentType, true); - } + this[kClients].clear(); + return Promise.all(closePromises); + } + [kDestroy](err) { + const destroyPromises = []; + for (const { dispatcher } of this[kClients].values()) { + destroyPromises.push(dispatcher.destroy(err)); } - const inputOrInitBody = initBody ?? inputBody; - if (inputOrInitBody != null && inputOrInitBody.source == null) { - if (initBody != null && init.duplex == null) { - throw new TypeError("RequestInit: duplex option is required when sending a body."); - } - if (request.mode !== "same-origin" && request.mode !== "cors") { - throw new TypeError( - 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' - ); + this[kClients].clear(); + return Promise.all(destroyPromises); + } + get stats() { + const allClientStats = {}; + for (const { dispatcher } of this[kClients].values()) { + if (dispatcher.stats) { + allClientStats[dispatcher[kUrl].origin] = dispatcher.stats; } - request.useCORSPreflightFlag = true; } - let finalBody = inputOrInitBody; - if (initBody == null && inputBody != null) { - if (bodyUnusable(input.#state)) { - throw new TypeError( - "Cannot construct a Request with a Request object that has already been used." - ); - } - const identityTransform = new TransformStream(); - inputBody.stream.pipeThrough(identityTransform); - finalBody = { - source: inputBody.source, - length: inputBody.length, - stream: identityTransform.readable - }; + return allClientStats; + } + }; + module.exports = Agent; + } +}); + +// node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +var require_dispatcher1_wrapper = __commonJS({ + "node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js"(exports, module) { + "use strict"; + var Dispatcher = require_dispatcher(); + var { InvalidArgumentError } = require_errors(); + var { toRawHeaders } = require_util(); + var LegacyHandlerWrapper = class { + #handler; + constructor(handler) { + this.#handler = handler; + } + onRequestStart(controller, context) { + this.#handler.onConnect?.((reason) => controller.abort(reason), context); + } + onRequestUpgrade(controller, statusCode, headers, socket) { + const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {}); + this.#handler.onUpgrade?.(statusCode, rawHeaders, socket); + } + onResponseStart(controller, statusCode, headers, statusMessage) { + const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {}); + if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) { + controller.pause(); } - this.#state.body = finalBody; } - // Returns request’s HTTP method, which is "GET" by default. - get method() { - webidl.brandCheck(this, _Request); - return this.#state.method; + onResponseData(controller, chunk) { + if (this.#handler.onData?.(chunk) === false) { + controller.pause(); + } } - // Returns the URL of request as a string. - get url() { - webidl.brandCheck(this, _Request); - return URLSerializer(this.#state.url); + onResponseEnd(controller, trailers) { + const rawTrailers = controller?.rawTrailers ?? toRawHeaders(trailers ?? {}); + this.#handler.onComplete?.(rawTrailers); } - // Returns a Headers object consisting of the headers associated with request. - // Note that headers added in the network layer by the user agent will not - // be accounted for in this object, e.g., the "Host" header. - get headers() { - webidl.brandCheck(this, _Request); - return this.#headers; + onResponseError(_controller, err) { + if (!this.#handler.onError) { + throw err; + } + this.#handler.onError(err); } - // Returns the kind of resource requested by request, e.g., "document" - // or "script". - get destination() { - webidl.brandCheck(this, _Request); - return this.#state.destination; + onBodySent(chunk) { + this.#handler.onBodySent?.(chunk); } - // Returns the referrer of request. Its value can be a same-origin URL if - // explicitly set in init, the empty string to indicate no referrer, and - // "about:client" when defaulting to the global’s default. This is used - // during fetching to determine the value of the `Referer` header of the - // request being made. - get referrer() { - webidl.brandCheck(this, _Request); - if (this.#state.referrer === "no-referrer") { - return ""; + onRequestSent() { + this.#handler.onRequestSent?.(); + } + onResponseStarted() { + this.#handler.onResponseStarted?.(); + } + }; + var Dispatcher1Wrapper = class _Dispatcher1Wrapper extends Dispatcher { + #dispatcher; + constructor(dispatcher) { + super(); + if (!dispatcher || typeof dispatcher.dispatch !== "function") { + throw new InvalidArgumentError("Argument dispatcher must implement dispatch"); } - if (this.#state.referrer === "client") { - return "about:client"; + this.#dispatcher = dispatcher; + } + static wrapHandler(handler) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); } - return this.#state.referrer.toString(); + if (typeof handler.onRequestStart === "function") { + return handler; + } + return new LegacyHandlerWrapper(handler); } - // Returns the referrer policy associated with request. - // This is used during fetching to compute the value of the request’s - // referrer. - get referrerPolicy() { - webidl.brandCheck(this, _Request); - return this.#state.referrerPolicy; + dispatch(opts, handler) { + if (opts.allowH2 !== false) { + opts = { ...opts, allowH2: false }; + } + return this.#dispatcher.dispatch(opts, _Dispatcher1Wrapper.wrapHandler(handler)); } - // Returns the mode associated with request, which is a string indicating - // whether the request will use CORS, or will be restricted to same-origin - // URLs. - get mode() { - webidl.brandCheck(this, _Request); - return this.#state.mode; + close(...args) { + return this.#dispatcher.close(...args); } - // Returns the credentials mode associated with request, - // which is a string indicating whether credentials will be sent with the - // request always, never, or only when sent to a same-origin URL. - get credentials() { - webidl.brandCheck(this, _Request); - return this.#state.credentials; + destroy(...args) { + return this.#dispatcher.destroy(...args); } - // Returns the cache mode associated with request, - // which is a string indicating how the request will - // interact with the browser’s cache when fetching. - get cache() { - webidl.brandCheck(this, _Request); - return this.#state.cache; + }; + module.exports = Dispatcher1Wrapper; + } +}); + +// node_modules/undici/lib/core/socks5-utils.js +var require_socks5_utils = __commonJS({ + "node_modules/undici/lib/core/socks5-utils.js"(exports, module) { + "use strict"; + var { Buffer: Buffer2 } = __require("buffer"); + var net = __require("net"); + var { InvalidArgumentError } = require_errors(); + function parseAddress(address2) { + if (net.isIPv4(address2)) { + const parts = address2.split(".").map(Number); + return { + type: 1, + // IPv4 + buffer: Buffer2.from(parts) + }; } - // Returns the redirect mode associated with request, - // which is a string indicating how redirects for the - // request will be handled during fetching. A request - // will follow redirects by default. - get redirect() { - webidl.brandCheck(this, _Request); - return this.#state.redirect; + if (net.isIPv6(address2)) { + return { + type: 4, + // IPv6 + buffer: parseIPv6(address2) + }; } - // Returns request’s subresource integrity metadata, which is a - // cryptographic hash of the resource being fetched. Its value - // consists of multiple hashes separated by whitespace. [SRI] - get integrity() { - webidl.brandCheck(this, _Request); - return this.#state.integrity; + const domainBuffer = Buffer2.from(address2, "utf8"); + if (domainBuffer.length > 255) { + throw new InvalidArgumentError("Domain name too long (max 255 bytes)"); } - // Returns a boolean indicating whether or not request can outlive the - // global in which it was created. - get keepalive() { - webidl.brandCheck(this, _Request); - return this.#state.keepalive; + return { + type: 3, + // Domain + buffer: Buffer2.concat([Buffer2.from([domainBuffer.length]), domainBuffer]) + }; + } + function parseIPv6(address2) { + const buffer2 = Buffer2.alloc(16); + const parts = address2.split(":"); + let partIndex = 0; + let bufferIndex = 0; + const doubleColonIndex = address2.indexOf("::"); + if (doubleColonIndex !== -1) { + const nonEmptyParts = parts.filter((p) => p.length > 0).length; + const skipParts = 8 - nonEmptyParts; + for (let i = 0; i < parts.length; i++) { + if (parts[i] === "" && i === doubleColonIndex / 3) { + bufferIndex += skipParts * 2; + } else if (parts[i] !== "") { + const value = parseInt(parts[i], 16); + buffer2.writeUInt16BE(value, bufferIndex); + bufferIndex += 2; + } + } + } else { + for (const part of parts) { + if (part === "") continue; + const value = parseInt(part, 16); + buffer2.writeUInt16BE(value, partIndex * 2); + partIndex++; + } } - // Returns a boolean indicating whether or not request is for a reload - // navigation. - get isReloadNavigation() { - webidl.brandCheck(this, _Request); - return this.#state.reloadNavigation; + return buffer2; + } + function buildAddressBuffer(type, addressBuffer, port) { + const portBuffer = Buffer2.allocUnsafe(2); + portBuffer.writeUInt16BE(port, 0); + return Buffer2.concat([ + Buffer2.from([type]), + addressBuffer, + portBuffer + ]); + } + function parseResponseAddress(buffer2, offset = 0) { + if (buffer2.length < offset + 1) { + throw new InvalidArgumentError("Buffer too small to contain address type"); } - // Returns a boolean indicating whether or not request is for a history - // navigation (a.k.a. back-forward navigation). - get isHistoryNavigation() { - webidl.brandCheck(this, _Request); - return this.#state.historyNavigation; + const addressType = buffer2[offset]; + let address2; + let currentOffset = offset + 1; + switch (addressType) { + case 1: { + if (buffer2.length < currentOffset + 6) { + throw new InvalidArgumentError("Buffer too small for IPv4 address"); + } + address2 = Array.from(buffer2.subarray(currentOffset, currentOffset + 4)).join("."); + currentOffset += 4; + break; + } + case 3: { + if (buffer2.length < currentOffset + 1) { + throw new InvalidArgumentError("Buffer too small for domain length"); + } + const domainLength = buffer2[currentOffset]; + currentOffset += 1; + if (buffer2.length < currentOffset + domainLength + 2) { + throw new InvalidArgumentError("Buffer too small for domain address"); + } + address2 = buffer2.subarray(currentOffset, currentOffset + domainLength).toString("utf8"); + currentOffset += domainLength; + break; + } + case 4: { + if (buffer2.length < currentOffset + 18) { + throw new InvalidArgumentError("Buffer too small for IPv6 address"); + } + const parts = []; + for (let i = 0; i < 8; i++) { + const value = buffer2.readUInt16BE(currentOffset + i * 2); + parts.push(value.toString(16)); + } + address2 = parts.join(":"); + currentOffset += 16; + break; + } + default: + throw new InvalidArgumentError(`Invalid address type: ${addressType}`); + } + if (buffer2.length < currentOffset + 2) { + throw new InvalidArgumentError("Buffer too small for port"); + } + const port = buffer2.readUInt16BE(currentOffset); + currentOffset += 2; + return { + address: address2, + port, + bytesRead: currentOffset - offset + }; + } + function createReplyError(replyCode) { + const messages = { + 1: "General SOCKS server failure", + 2: "Connection not allowed by ruleset", + 3: "Network unreachable", + 4: "Host unreachable", + 5: "Connection refused", + 6: "TTL expired", + 7: "Command not supported", + 8: "Address type not supported" + }; + const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`; + const error = new Error(message); + error.code = `SOCKS5_${replyCode}`; + return error; + } + module.exports = { + parseAddress, + parseIPv6, + buildAddressBuffer, + parseResponseAddress, + createReplyError + }; + } +}); + +// node_modules/undici/lib/core/socks5-client.js +var require_socks5_client = __commonJS({ + "node_modules/undici/lib/core/socks5-client.js"(exports, module) { + "use strict"; + var { EventEmitter } = __require("events"); + var { Buffer: Buffer2 } = __require("buffer"); + var { InvalidArgumentError, Socks5ProxyError } = require_errors(); + var { debuglog } = __require("util"); + var { parseAddress } = require_socks5_utils(); + var debug = debuglog("undici:socks5"); + var SOCKS_VERSION = 5; + var AUTH_METHODS = { + NO_AUTH: 0, + GSSAPI: 1, + USERNAME_PASSWORD: 2, + NO_ACCEPTABLE: 255 + }; + var COMMANDS = { + CONNECT: 1, + BIND: 2, + UDP_ASSOCIATE: 3 + }; + var ADDRESS_TYPES = { + IPV4: 1, + DOMAIN: 3, + IPV6: 4 + }; + var REPLY_CODES = { + SUCCEEDED: 0, + GENERAL_FAILURE: 1, + CONNECTION_NOT_ALLOWED: 2, + NETWORK_UNREACHABLE: 3, + HOST_UNREACHABLE: 4, + CONNECTION_REFUSED: 5, + TTL_EXPIRED: 6, + COMMAND_NOT_SUPPORTED: 7, + ADDRESS_TYPE_NOT_SUPPORTED: 8 + }; + var STATES = { + INITIAL: "initial", + HANDSHAKING: "handshaking", + AUTHENTICATING: "authenticating", + CONNECTING: "connecting", + CONNECTED: "connected", + ERROR: "error", + CLOSED: "closed" + }; + var Socks5Client = class extends EventEmitter { + constructor(socket, options = {}) { + super(); + if (!socket) { + throw new InvalidArgumentError("socket is required"); + } + this.socket = socket; + this.options = options; + this.state = STATES.INITIAL; + this.buffer = Buffer2.alloc(0); + this.authMethods = []; + if (options.username && options.password) { + this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD); + } + this.authMethods.push(AUTH_METHODS.NO_AUTH); + this.socket.on("data", this.onData.bind(this)); + this.socket.on("error", this.onError.bind(this)); + this.socket.on("close", this.onClose.bind(this)); + } + /** + * Handle incoming data from the socket + */ + onData(data) { + debug("received data", data.length, "bytes in state", this.state); + this.buffer = Buffer2.concat([this.buffer, data]); + try { + switch (this.state) { + case STATES.HANDSHAKING: + this.handleHandshakeResponse(); + break; + case STATES.AUTHENTICATING: + this.handleAuthResponse(); + break; + case STATES.CONNECTING: + this.handleConnectResponse(); + break; + } + } catch (err) { + this.onError(err); + } } - // Returns the signal associated with request, which is an AbortSignal - // object indicating whether or not request has been aborted, and its - // abort event handler. - get signal() { - webidl.brandCheck(this, _Request); - return this.#signal; + /** + * Handle socket errors + */ + onError(err) { + debug("socket error", err); + this.state = STATES.ERROR; + this.emit("error", err); + this.destroy(); } - get body() { - webidl.brandCheck(this, _Request); - return this.#state.body ? this.#state.body.stream : null; + /** + * Handle socket close + */ + onClose() { + debug("socket closed"); + this.state = STATES.CLOSED; + this.emit("close"); } - get bodyUsed() { - webidl.brandCheck(this, _Request); - return !!this.#state.body && util2.isDisturbed(this.#state.body.stream); + /** + * Destroy the client and underlying socket + */ + destroy() { + if (this.socket && !this.socket.destroyed) { + this.socket.destroy(); + } } - get duplex() { - webidl.brandCheck(this, _Request); - return "half"; + /** + * Start the SOCKS5 handshake + */ + handshake() { + if (this.state !== STATES.INITIAL) { + throw new InvalidArgumentError("Handshake already started"); + } + debug("starting handshake with", this.authMethods.length, "auth methods"); + this.state = STATES.HANDSHAKING; + const request = Buffer2.alloc(2 + this.authMethods.length); + request[0] = SOCKS_VERSION; + request[1] = this.authMethods.length; + this.authMethods.forEach((method, i) => { + request[2 + i] = method; + }); + this.socket.write(request); } - // Returns a clone of request. - clone() { - webidl.brandCheck(this, _Request); - if (bodyUnusable(this.#state)) { - throw new TypeError("unusable"); + /** + * Handle handshake response from server + */ + handleHandshakeResponse() { + if (this.buffer.length < 2) { + return; } - const clonedRequest = cloneRequest(this.#state); - const ac = new AbortController(); - if (this.signal.aborted) { - ac.abort(this.signal.reason); - } else { - let list = dependentControllerMap.get(this.signal); - if (list === void 0) { - list = /* @__PURE__ */ new Set(); - dependentControllerMap.set(this.signal, list); - } - const acRef = new WeakRef(ac); - list.add(acRef); - util2.addAbortListener( - ac.signal, - buildAbort(acRef) - ); + const version4 = this.buffer[0]; + const method = this.buffer[1]; + if (version4 !== SOCKS_VERSION) { + throw new Socks5ProxyError(`Invalid SOCKS version: ${version4}`, "UND_ERR_SOCKS5_VERSION"); } - return fromInnerRequest(clonedRequest, this.#dispatcher, ac.signal, getHeadersGuard(this.#headers)); - } - [nodeUtil.inspect.custom](depth, options) { - if (options.depth === null) { - options.depth = 2; + if (method === AUTH_METHODS.NO_ACCEPTABLE) { + throw new Socks5ProxyError("No acceptable authentication method", "UND_ERR_SOCKS5_AUTH_REJECTED"); + } + this.buffer = this.buffer.subarray(2); + debug("server selected auth method", method); + if (method === AUTH_METHODS.NO_AUTH) { + this.emit("authenticated"); + } else if (method === AUTH_METHODS.USERNAME_PASSWORD) { + this.state = STATES.AUTHENTICATING; + this.sendAuthRequest(); + } else { + throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, "UND_ERR_SOCKS5_AUTH_METHOD"); } - options.colors ??= true; - const properties = { - method: this.method, - url: this.url, - headers: this.headers, - destination: this.destination, - referrer: this.referrer, - referrerPolicy: this.referrerPolicy, - mode: this.mode, - credentials: this.credentials, - cache: this.cache, - redirect: this.redirect, - integrity: this.integrity, - keepalive: this.keepalive, - isReloadNavigation: this.isReloadNavigation, - isHistoryNavigation: this.isHistoryNavigation, - signal: this.signal - }; - return `Request ${nodeUtil.formatWithOptions(options, properties)}`; } /** - * @param {Request} request - * @param {AbortSignal} newSignal + * Send username/password authentication request */ - static setRequestSignal(request, newSignal) { - request.#signal = newSignal; - return request; + sendAuthRequest() { + const { username, password } = this.options; + if (!username || !password) { + throw new InvalidArgumentError("Username and password required for authentication"); + } + debug("sending username/password auth"); + const usernameBuffer = Buffer2.from(username); + const passwordBuffer = Buffer2.from(password); + if (usernameBuffer.length > 255 || passwordBuffer.length > 255) { + throw new InvalidArgumentError("Username or password too long"); + } + const request = Buffer2.alloc(3 + usernameBuffer.length + passwordBuffer.length); + request[0] = 1; + request[1] = usernameBuffer.length; + usernameBuffer.copy(request, 2); + request[2 + usernameBuffer.length] = passwordBuffer.length; + passwordBuffer.copy(request, 3 + usernameBuffer.length); + this.socket.write(request); } /** - * @param {Request} request + * Handle authentication response */ - static getRequestDispatcher(request) { - return request.#dispatcher; + handleAuthResponse() { + if (this.buffer.length < 2) { + return; + } + const version4 = this.buffer[0]; + const status = this.buffer[1]; + if (version4 !== 1) { + throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version4}`, "UND_ERR_SOCKS5_AUTH_VERSION"); + } + if (status !== 0) { + throw new Socks5ProxyError("Authentication failed", "UND_ERR_SOCKS5_AUTH_FAILED"); + } + this.buffer = this.buffer.subarray(2); + debug("authentication successful"); + this.emit("authenticated"); } /** - * @param {Request} request - * @param {import('../../dispatcher/dispatcher')} newDispatcher + * Send CONNECT command + * @param {string} address - Target address (IP or domain) + * @param {number} port - Target port */ - static setRequestDispatcher(request, newDispatcher) { - request.#dispatcher = newDispatcher; + connect(address2, port) { + if (this.state === STATES.CONNECTED) { + throw new InvalidArgumentError("Already connected"); + } + debug("connecting to", address2, port); + this.state = STATES.CONNECTING; + const request = this.buildConnectRequest(COMMANDS.CONNECT, address2, port); + this.socket.write(request); } /** - * @param {Request} request - * @param {Headers} newHeaders + * Build a SOCKS5 request */ - static setRequestHeaders(request, newHeaders) { - request.#headers = newHeaders; + buildConnectRequest(command, address2, port) { + const { type: addressType, buffer: addressBuffer } = parseAddress(address2); + const request = Buffer2.alloc(4 + addressBuffer.length + 2); + request[0] = SOCKS_VERSION; + request[1] = command; + request[2] = 0; + request[3] = addressType; + addressBuffer.copy(request, 4); + request.writeUInt16BE(port, 4 + addressBuffer.length); + return request; } /** - * @param {Request} request + * Handle CONNECT response */ - static getRequestState(request) { - return request.#state; + handleConnectResponse() { + if (this.buffer.length < 4) { + return; + } + const version4 = this.buffer[0]; + const reply = this.buffer[1]; + const addressType = this.buffer[3]; + if (version4 !== SOCKS_VERSION) { + throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version4}`, "UND_ERR_SOCKS5_REPLY_VERSION"); + } + let responseLength = 4; + if (addressType === ADDRESS_TYPES.IPV4) { + responseLength += 4 + 2; + } else if (addressType === ADDRESS_TYPES.DOMAIN) { + if (this.buffer.length < 5) { + return; + } + responseLength += 1 + this.buffer[4] + 2; + } else if (addressType === ADDRESS_TYPES.IPV6) { + responseLength += 16 + 2; + } else { + throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, "UND_ERR_SOCKS5_ADDR_TYPE"); + } + if (this.buffer.length < responseLength) { + return; + } + if (reply !== REPLY_CODES.SUCCEEDED) { + const errorMessage = this.getReplyErrorMessage(reply); + throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`); + } + let boundAddress; + let offset = 4; + if (addressType === ADDRESS_TYPES.IPV4) { + boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join("."); + offset += 4; + } else if (addressType === ADDRESS_TYPES.DOMAIN) { + const domainLength = this.buffer[offset]; + offset += 1; + boundAddress = this.buffer.subarray(offset, offset + domainLength).toString(); + offset += domainLength; + } else if (addressType === ADDRESS_TYPES.IPV6) { + const parts = []; + for (let i = 0; i < 8; i++) { + const value = this.buffer.readUInt16BE(offset + i * 2); + parts.push(value.toString(16)); + } + boundAddress = parts.join(":"); + offset += 16; + } + const boundPort = this.buffer.readUInt16BE(offset); + this.buffer = this.buffer.subarray(responseLength); + this.state = STATES.CONNECTED; + debug("connected, bound address:", boundAddress, "port:", boundPort); + this.emit("connected", { address: boundAddress, port: boundPort }); } /** - * @param {Request} request - * @param {any} newState + * Get human-readable error message for reply code */ - static setRequestState(request, newState) { - request.#state = newState; + getReplyErrorMessage(reply) { + switch (reply) { + case REPLY_CODES.GENERAL_FAILURE: + return "General SOCKS server failure"; + case REPLY_CODES.CONNECTION_NOT_ALLOWED: + return "Connection not allowed by ruleset"; + case REPLY_CODES.NETWORK_UNREACHABLE: + return "Network unreachable"; + case REPLY_CODES.HOST_UNREACHABLE: + return "Host unreachable"; + case REPLY_CODES.CONNECTION_REFUSED: + return "Connection refused"; + case REPLY_CODES.TTL_EXPIRED: + return "TTL expired"; + case REPLY_CODES.COMMAND_NOT_SUPPORTED: + return "Command not supported"; + case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED: + return "Address type not supported"; + default: + return `Unknown error code: ${reply}`; + } } }; - var { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request2; - Reflect.deleteProperty(Request2, "setRequestSignal"); - Reflect.deleteProperty(Request2, "getRequestDispatcher"); - Reflect.deleteProperty(Request2, "setRequestDispatcher"); - Reflect.deleteProperty(Request2, "setRequestHeaders"); - Reflect.deleteProperty(Request2, "getRequestState"); - Reflect.deleteProperty(Request2, "setRequestState"); - mixinBody(Request2, getRequestState); - function makeRequest(init) { - return { - method: init.method ?? "GET", - localURLsOnly: init.localURLsOnly ?? false, - unsafeRequest: init.unsafeRequest ?? false, - body: init.body ?? null, - client: init.client ?? null, - reservedClient: init.reservedClient ?? null, - replacesClientId: init.replacesClientId ?? "", - window: init.window ?? "client", - keepalive: init.keepalive ?? false, - serviceWorkers: init.serviceWorkers ?? "all", - initiator: init.initiator ?? "", - destination: init.destination ?? "", - priority: init.priority ?? null, - origin: init.origin ?? "client", - policyContainer: init.policyContainer ?? "client", - referrer: init.referrer ?? "client", - referrerPolicy: init.referrerPolicy ?? "", - mode: init.mode ?? "no-cors", - useCORSPreflightFlag: init.useCORSPreflightFlag ?? false, - credentials: init.credentials ?? "same-origin", - useCredentials: init.useCredentials ?? false, - cache: init.cache ?? "default", - redirect: init.redirect ?? "follow", - integrity: init.integrity ?? "", - cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? "", - parserMetadata: init.parserMetadata ?? "", - reloadNavigation: init.reloadNavigation ?? false, - historyNavigation: init.historyNavigation ?? false, - userActivation: init.userActivation ?? false, - taintedOrigin: init.taintedOrigin ?? false, - redirectCount: init.redirectCount ?? 0, - responseTainting: init.responseTainting ?? "basic", - preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false, - done: init.done ?? false, - timingAllowFailed: init.timingAllowFailed ?? false, - useURLCredentials: init.useURLCredentials ?? void 0, - traversableForUserPrompts: init.traversableForUserPrompts ?? "client", - urlList: init.urlList, - url: init.urlList[0], - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() - }; - } - function cloneRequest(request) { - const newRequest = makeRequest({ ...request, body: null }); - if (request.body != null) { - newRequest.body = cloneBody(request.body); + module.exports = { + Socks5Client, + AUTH_METHODS, + COMMANDS, + ADDRESS_TYPES, + REPLY_CODES, + STATES + }; + } +}); + +// node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +var require_socks5_proxy_agent = __commonJS({ + "node_modules/undici/lib/dispatcher/socks5-proxy-agent.js"(exports, module) { + "use strict"; + var net = __require("net"); + var { URL: URL2 } = __require("url"); + var tls; + var DispatcherBase = require_dispatcher_base(); + var { InvalidArgumentError } = require_errors(); + var { Socks5Client } = require_socks5_client(); + var { kDispatch, kClose, kDestroy } = require_symbols(); + var Pool = require_pool(); + var buildConnector = require_connect(); + var { debuglog } = __require("util"); + var debug = debuglog("undici:socks5-proxy"); + var kProxyUrl = /* @__PURE__ */ Symbol("proxy url"); + var kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); + var kProxyAuth = /* @__PURE__ */ Symbol("proxy auth"); + var kPool = /* @__PURE__ */ Symbol("pool"); + var kConnector = /* @__PURE__ */ Symbol("connector"); + var experimentalWarningEmitted = false; + var Socks5ProxyAgent = class extends DispatcherBase { + constructor(proxyUrl, options = {}) { + super(); + if (!experimentalWarningEmitted) { + process.emitWarning( + "SOCKS5 proxy support is experimental and subject to change", + "ExperimentalWarning" + ); + experimentalWarningEmitted = true; + } + if (!proxyUrl) { + throw new InvalidArgumentError("Proxy URL is mandatory"); + } + const url = typeof proxyUrl === "string" ? new URL2(proxyUrl) : proxyUrl; + if (url.protocol !== "socks5:" && url.protocol !== "socks:") { + throw new InvalidArgumentError("Proxy URL must use socks5:// or socks:// protocol"); + } + this[kProxyUrl] = url; + this[kProxyHeaders] = options.headers || {}; + this[kProxyAuth] = { + username: options.username || (url.username ? decodeURIComponent(url.username) : null), + password: options.password || (url.password ? decodeURIComponent(url.password) : null) + }; + this[kConnector] = options.connect || buildConnector({ + ...options.proxyTls, + servername: options.proxyTls?.servername || url.hostname + }); + this[kPool] = null; } - return newRequest; - } - function fromInnerRequest(innerRequest, dispatcher, signal, guard) { - const request = new Request2(kConstruct); - setRequestState(request, innerRequest); - setRequestDispatcher(request, dispatcher); - setRequestSignal(request, signal); - const headers = new Headers2(kConstruct); - setRequestHeaders(request, headers); - setHeadersList(headers, innerRequest.headersList); - setHeadersGuard(headers, guard); - return request; - } - Object.defineProperties(Request2.prototype, { - method: kEnumerableProperty, - url: kEnumerableProperty, - headers: kEnumerableProperty, - redirect: kEnumerableProperty, - clone: kEnumerableProperty, - signal: kEnumerableProperty, - duplex: kEnumerableProperty, - destination: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - isHistoryNavigation: kEnumerableProperty, - isReloadNavigation: kEnumerableProperty, - keepalive: kEnumerableProperty, - integrity: kEnumerableProperty, - cache: kEnumerableProperty, - credentials: kEnumerableProperty, - attribute: kEnumerableProperty, - referrerPolicy: kEnumerableProperty, - referrer: kEnumerableProperty, - mode: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Request", - configurable: true + /** + * Create a SOCKS5 connection to the proxy + */ + async createSocks5Connection(targetHost, targetPort) { + const proxyHost = this[kProxyUrl].hostname; + const proxyPort = parseInt(this[kProxyUrl].port) || 1080; + debug("creating SOCKS5 connection to", proxyHost, proxyPort); + const socketReady = Promise.withResolvers(); + const onSocketConnect = () => { + socket.removeListener("error", onSocketError); + socketReady.resolve(socket); + }; + const onSocketError = (err) => { + socket.removeListener("connect", onSocketConnect); + socketReady.reject(err); + }; + const socket = net.connect({ + host: proxyHost, + port: proxyPort + }); + socket.once("connect", onSocketConnect); + socket.once("error", onSocketError); + await socketReady.promise; + const socks5Client = new Socks5Client(socket, this[kProxyAuth]); + socks5Client.on("error", (err) => { + debug("SOCKS5 error:", err); + socket.destroy(); + }); + await socks5Client.handshake(); + const authenticationReady = Promise.withResolvers(); + const authenticationTimeout = setTimeout(() => { + authenticationReady.reject(new Error("SOCKS5 authentication timeout")); + }, 5e3); + const onAuthenticated = () => { + clearTimeout(authenticationTimeout); + socks5Client.removeListener("error", onAuthenticationError); + authenticationReady.resolve(); + }; + const onAuthenticationError = (err) => { + clearTimeout(authenticationTimeout); + socks5Client.removeListener("authenticated", onAuthenticated); + authenticationReady.reject(err); + }; + if (socks5Client.state === "authenticated") { + clearTimeout(authenticationTimeout); + authenticationReady.resolve(); + } else { + socks5Client.once("authenticated", onAuthenticated); + socks5Client.once("error", onAuthenticationError); + } + await authenticationReady.promise; + await socks5Client.connect(targetHost, targetPort); + const connectionReady = Promise.withResolvers(); + const connectionTimeout = setTimeout(() => { + connectionReady.reject(new Error("SOCKS5 connection timeout")); + }, 5e3); + const onConnected = (info) => { + debug("SOCKS5 tunnel established to", targetHost, targetPort, "via", info); + clearTimeout(connectionTimeout); + socks5Client.removeListener("error", onConnectionError); + connectionReady.resolve(); + }; + const onConnectionError = (err) => { + clearTimeout(connectionTimeout); + socks5Client.removeListener("connected", onConnected); + connectionReady.reject(err); + }; + socks5Client.once("connected", onConnected); + socks5Client.once("error", onConnectionError); + await connectionReady.promise; + return socket; } - }); - webidl.is.Request = webidl.util.MakeTypeAssertion(Request2); - webidl.converters.RequestInfo = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); + /** + * Dispatch a request through the SOCKS5 proxy + */ + async [kDispatch](opts, handler) { + const { origin } = opts; + debug("dispatching request to", origin, "via SOCKS5"); + try { + if (!this[kPool] || this[kPool].destroyed || this[kPool].closed) { + this[kPool] = new Pool(origin, { + pipelining: opts.pipelining, + connections: opts.connections, + connect: async (connectOpts, callback) => { + try { + const url = new URL2(origin); + const targetHost = url.hostname; + const targetPort = parseInt(url.port) || (url.protocol === "https:" ? 443 : 80); + debug("establishing SOCKS5 connection to", targetHost, targetPort); + const socket = await this.createSocks5Connection(targetHost, targetPort); + let finalSocket = socket; + if (url.protocol === "https:") { + if (!tls) { + tls = __require("tls"); + } + debug("upgrading to TLS"); + finalSocket = tls.connect({ + socket, + servername: targetHost, + ...connectOpts.tls || {} + }); + const tlsReady = Promise.withResolvers(); + finalSocket.once("secureConnect", tlsReady.resolve); + finalSocket.once("error", tlsReady.reject); + await tlsReady.promise; + } + callback(null, finalSocket); + } catch (err) { + debug("SOCKS5 connection error:", err); + callback(err); + } + } + }); + } + return this[kPool][kDispatch](opts, handler); + } catch (err) { + debug("dispatch error:", err); + if (typeof handler.onError === "function") { + handler.onError(err); + } else { + throw err; + } + } } - if (webidl.is.Request(V)) { - return V; + async [kClose]() { + if (this[kPool]) { + await this[kPool].close(); + } } - return webidl.converters.USVString(V); - }; - webidl.converters.RequestInit = webidl.dictionaryConverter([ - { - key: "method", - converter: webidl.converters.ByteString - }, - { - key: "headers", - converter: webidl.converters.HeadersInit - }, - { - key: "body", - converter: webidl.nullableConverter( - webidl.converters.BodyInit - ) - }, - { - key: "referrer", - converter: webidl.converters.USVString - }, - { - key: "referrerPolicy", - converter: webidl.converters.DOMString, - // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy - allowedValues: referrerPolicy - }, - { - key: "mode", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#concept-request-mode - allowedValues: requestMode - }, - { - key: "credentials", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestcredentials - allowedValues: requestCredentials - }, - { - key: "cache", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestcache - allowedValues: requestCache - }, - { - key: "redirect", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestredirect - allowedValues: requestRedirect - }, - { - key: "integrity", - converter: webidl.converters.DOMString - }, - { - key: "keepalive", - converter: webidl.converters.boolean - }, - { - key: "signal", - converter: webidl.nullableConverter( - (signal) => webidl.converters.AbortSignal( - signal, - "RequestInit", - "signal" - ) - ) - }, - { - key: "window", - converter: webidl.converters.any - }, - { - key: "duplex", - converter: webidl.converters.DOMString, - allowedValues: requestDuplex - }, - { - key: "dispatcher", - // undici specific option - converter: webidl.converters.any - }, - { - key: "priority", - converter: webidl.converters.DOMString, - allowedValues: ["high", "low", "auto"], - defaultValue: () => "auto" + async [kDestroy](err) { + if (this[kPool]) { + await this[kPool].destroy(err); + } } - ]); - module.exports = { - Request: Request2, - makeRequest, - fromInnerRequest, - cloneRequest, - getRequestDispatcher, - getRequestState }; + module.exports = Socks5ProxyAgent; } }); -// node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js -var require_subresource_integrity = __commonJS({ - "node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js"(exports, module) { +// node_modules/undici/lib/dispatcher/proxy-agent.js +var require_proxy_agent = __commonJS({ + "node_modules/undici/lib/dispatcher/proxy-agent.js"(exports, module) { "use strict"; - var assert8 = __require("assert"); - var { runtimeFeatures } = require_runtime_features(); - var validSRIHashAlgorithmTokenSet = /* @__PURE__ */ new Map([["sha256", 0], ["sha384", 1], ["sha512", 2]]); - var crypto4; - if (runtimeFeatures.has("crypto")) { - crypto4 = __require("crypto"); - const cryptoHashes = crypto4.getHashes(); - if (cryptoHashes.length === 0) { - validSRIHashAlgorithmTokenSet.clear(); - } - for (const algorithm of validSRIHashAlgorithmTokenSet.keys()) { - if (cryptoHashes.includes(algorithm) === false) { - validSRIHashAlgorithmTokenSet.delete(algorithm); - } - } - } else { - validSRIHashAlgorithmTokenSet.clear(); + var { kProxy, kClose, kDestroy, kDispatch } = require_symbols(); + var Agent = require_agent(); + var Pool = require_pool(); + var DispatcherBase = require_dispatcher_base(); + var { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require_errors(); + var buildConnector = require_connect(); + var Client = require_client(); + var { channels } = require_diagnostics(); + var Socks5ProxyAgent = require_socks5_proxy_agent(); + var kAgent = /* @__PURE__ */ Symbol("proxy agent"); + var kClient = /* @__PURE__ */ Symbol("proxy client"); + var kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); + var kRequestTls = /* @__PURE__ */ Symbol("request tls settings"); + var kProxyTls = /* @__PURE__ */ Symbol("proxy tls settings"); + var kConnectEndpoint = /* @__PURE__ */ Symbol("connect endpoint function"); + var kConnectEndpointHTTP1 = /* @__PURE__ */ Symbol("connect endpoint function (http/1.1 only)"); + var kTunnelProxy = /* @__PURE__ */ Symbol("tunnel proxy"); + function defaultProtocolPort(protocol) { + return protocol === "https:" ? 443 : 80; } - var getSRIHashAlgorithmIndex = ( - /** @type {GetSRIHashAlgorithmIndex} */ - Map.prototype.get.bind( - validSRIHashAlgorithmTokenSet - ) - ); - var isValidSRIHashAlgorithm = ( - /** @type {IsValidSRIHashAlgorithm} */ - Map.prototype.has.bind(validSRIHashAlgorithmTokenSet) - ); - var bytesMatch = runtimeFeatures.has("crypto") === false || validSRIHashAlgorithmTokenSet.size === 0 ? () => true : (bytes, metadataList) => { - const parsedMetadata = parseMetadata(metadataList); - if (parsedMetadata.length === 0) { - return true; - } - const metadata = getStrongestMetadata(parsedMetadata); - for (const item of metadata) { - const algorithm = item.alg; - const expectedValue = item.val; - const actualValue = applyAlgorithmToBytes(algorithm, bytes); - if (caseSensitiveMatch(actualValue, expectedValue)) { - return true; - } - } - return false; + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + var noop = () => { }; - function getStrongestMetadata(metadataList) { - const result = []; - let strongest = null; - for (const item of metadataList) { - assert8(isValidSRIHashAlgorithm(item.alg), "Invalid SRI hash algorithm token"); - if (result.length === 0) { - result.push(item); - strongest = item; - continue; - } - const currentAlgorithm = ( - /** @type {Metadata} */ - strongest.alg - ); - const currentAlgorithmIndex = getSRIHashAlgorithmIndex(currentAlgorithm); - const newAlgorithm = item.alg; - const newAlgorithmIndex = getSRIHashAlgorithmIndex(newAlgorithm); - if (newAlgorithmIndex < currentAlgorithmIndex) { - continue; - } else if (newAlgorithmIndex > currentAlgorithmIndex) { - strongest = item; - result[0] = item; - result.length = 1; - } else { - result.push(item); - } + function defaultAgentFactory(origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts); } - return result; + return new Pool(origin, opts); } - function parseMetadata(metadata) { - const result = []; - for (const item of metadata.split(" ")) { - const expressionAndOptions = item.split("?", 1); - const algorithmExpression = expressionAndOptions[0]; - let base64Value = ""; - const algorithmAndValue = [algorithmExpression.slice(0, 6), algorithmExpression.slice(7)]; - const algorithm = algorithmAndValue[0]; - if (!isValidSRIHashAlgorithm(algorithm)) { - continue; + var Http1ProxyWrapper = class extends DispatcherBase { + #client; + constructor(proxyUrl, { headers = {}, connect, factory }) { + if (!proxyUrl) { + throw new InvalidArgumentError("Proxy URL is mandatory"); } - if (algorithmAndValue[1]) { - base64Value = algorithmAndValue[1]; + super(); + this[kProxyHeaders] = headers; + if (factory) { + this.#client = factory(proxyUrl, { connect }); + } else { + this.#client = new Client(proxyUrl, { connect }); } - const metadata2 = { - alg: algorithm, - val: base64Value - }; - result.push(metadata2); - } - return result; - } - var applyAlgorithmToBytes = (algorithm, bytes) => { - return crypto4.hash(algorithm, bytes, "base64"); - }; - function caseSensitiveMatch(actualValue, expectedValue) { - let actualValueLength = actualValue.length; - if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === "=") { - actualValueLength -= 1; - } - if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === "=") { - actualValueLength -= 1; } - let expectedValueLength = expectedValue.length; - if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === "=") { - expectedValueLength -= 1; - } - if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === "=") { - expectedValueLength -= 1; + [kDispatch](opts, handler) { + const onResponseStart = handler.onResponseStart; + handler.onResponseStart = function(controller, statusCode, data, statusMessage) { + if (statusCode === 407) { + if (typeof handler.onResponseError === "function") { + handler.onResponseError(controller, new InvalidArgumentError("Proxy Authentication Required (407)")); + } + return; + } + if (onResponseStart) onResponseStart.call(this, controller, statusCode, data, statusMessage); + }; + const { + origin, + path = "/", + headers = {} + } = opts; + opts.path = origin + path; + if (!("host" in headers) && !("Host" in headers)) { + const { host } = new URL(origin); + headers.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers }; + return this.#client[kDispatch](opts, handler); } - if (actualValueLength !== expectedValueLength) { - return false; + [kClose]() { + return this.#client.close(); } - for (let i = 0; i < actualValueLength; ++i) { - if (actualValue[i] === expectedValue[i] || actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { - continue; - } - return false; + [kDestroy](err) { + return this.#client.destroy(err); } - return true; - } - module.exports = { - applyAlgorithmToBytes, - bytesMatch, - caseSensitiveMatch, - isValidSRIHashAlgorithm, - getStrongestMetadata, - parseMetadata }; - } -}); - -// node_modules/undici/lib/web/fetch/index.js -var require_fetch = __commonJS({ - "node_modules/undici/lib/web/fetch/index.js"(exports, module) { - "use strict"; - var { - makeNetworkError, - makeAppropriateNetworkError, - filterResponse, - makeResponse, - fromInnerResponse, - getResponseState - } = require_response(); - var { HeadersList } = require_headers(); - var { Request: Request2, cloneRequest, getRequestDispatcher, getRequestState } = require_request2(); - var zlib = __require("zlib"); - var { - makePolicyContainer, - clonePolicyContainer, - requestBadPort, - TAOCheck, - appendRequestOriginHeader, - responseLocationURL, - requestCurrentURL, - setRequestReferrerPolicyOnRedirect, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - createOpaqueTimingInfo, - appendFetchMetadata, - corsCheck, - crossOriginResourcePolicyCheck, - determineRequestsReferrer, - coarsenedSharedCurrentTime, - sameOrigin, - isCancelled, - isAborted: isAborted2, - isErrorLike, - fullyReadBody, - readableStreamClose, - urlIsLocal, - urlIsHttpHttpsScheme, - urlHasHttpsScheme, - clampAndCoarsenConnectionTimingInfo, - simpleRangeHeaderValue, - buildContentRange, - createInflate, - extractMimeType, - hasAuthenticationEntry, - includesCredentials, - isTraversableNavigable - } = require_util2(); - var assert8 = __require("assert"); - var { safelyExtractBody, extractBody } = require_body(); - var { - redirectStatusSet, - nullBodyStatus, - safeMethodsSet, - requestBodyHeader, - subresourceSet - } = require_constants4(); - var EE = __require("events"); - var { Readable, pipeline, finished: finished2, isErrored, isReadable } = __require("stream"); - var { addAbortListener, bufferToLowerCasedHeaderName } = require_util(); - var { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require_data_url(); - var { getGlobalDispatcher } = require_global2(); - var { webidl } = require_webidl(); - var { STATUS_CODES } = __require("http"); - var { bytesMatch } = require_subresource_integrity(); - var { isomorphicEncode } = require_infra(); - var GET_OR_HEAD = ["GET", "HEAD"]; - var defaultUserAgent = typeof __UNDICI_IS_NODE__ !== "undefined" || typeof esbuildDetection !== "undefined" ? "node" : "undici"; - var resolveObjectURL; - var Fetch = class extends EE { - constructor(dispatcher) { + var ProxyAgent = class extends DispatcherBase { + constructor(opts) { + if (!opts || typeof opts === "object" && !(opts instanceof URL) && !opts.uri) { + throw new InvalidArgumentError("Proxy uri is mandatory"); + } + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== "function") { + throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); + } + const { proxyTunnel = true, connectTimeout } = opts; super(); - this.dispatcher = dispatcher; - this.connection = null; - this.dump = false; - this.state = "ongoing"; + const url = this.#getUrl(opts); + const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; + this[kProxy] = { uri: href, protocol }; + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; + if (opts.auth && opts.token) { + throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); + } else if (opts.auth) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]["proxy-authorization"] = opts.token; + } else if (username && password) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; + } + const connect = buildConnector({ timeout: connectTimeout, ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ timeout: connectTimeout, ...opts.requestTls }); + this[kConnectEndpointHTTP1] = buildConnector({ timeout: connectTimeout, ...opts.requestTls, allowH2: false }); + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin2, options) => { + const { protocol: protocol2 } = new URL(origin2); + if (this[kProxy].protocol === "socks5:" || this[kProxy].protocol === "socks:") { + return new Socks5ProxyAgent(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory, + username: opts.username || username, + password: opts.password || password, + proxyTls: opts.proxyTls + }); + } + if (!this[kTunnelProxy] && protocol2 === "http:" && this[kProxy].protocol === "http:") { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory + }); + } + return agentFactory(origin2, options); + }; + if (protocol === "socks5:" || protocol === "socks:") { + this[kClient] = null; + } else { + this[kClient] = clientFactory(url, { connect }); + } + this[kAgent] = new Agent({ + ...opts, + factory, + connect: async (opts2, callback) => { + if (!this[kClient]) { + callback(new InvalidArgumentError("Cannot establish tunnel connection without a proxy client")); + return; + } + let requestedPath = opts2.host; + if (!opts2.port) { + requestedPath += `:${defaultProtocolPort(opts2.protocol)}`; + } + try { + const connectParams = { + origin, + port, + path: requestedPath, + signal: opts2.signal, + headers: { + ...this[kProxyHeaders], + host: opts2.host, + ...opts2.connections == null || opts2.connections > 0 ? { "proxy-connection": "keep-alive" } : {} + }, + servername: this[kProxyTls]?.servername || proxyHostname + }; + const { socket, statusCode } = await this[kClient].connect(connectParams); + if (statusCode !== 200) { + socket.on("error", noop).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); + return; + } + if (channels.proxyConnected.hasSubscribers) { + channels.proxyConnected.publish({ + socket, + connectParams + }); + } + if (opts2.protocol !== "https:") { + callback(null, socket); + return; + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts2.servername; + } + const connectEndpoint = opts2.allowH2 === false ? this[kConnectEndpointHTTP1] : this[kConnectEndpoint]; + connectEndpoint({ ...opts2, servername, httpSocket: socket }, callback); + } catch (err) { + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + callback(new SecureProxyConnectionError(err)); + } else { + callback(err); + } + } + } + }); } - terminate(reason) { - if (this.state !== "ongoing") { - return; + dispatch(opts, handler) { + const headers = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers); + if (headers && !("host" in headers) && !("Host" in headers)) { + const { host } = new URL(opts.origin); + headers.host = host; } - this.state = "terminated"; - this.connection?.destroy(reason); - this.emit("terminated", reason); + return this[kAgent].dispatch( + { + ...opts, + headers + }, + handler + ); } - // https://fetch.spec.whatwg.org/#fetch-controller-abort - abort(error) { - if (this.state !== "ongoing") { - return; - } - this.state = "aborted"; - if (!error) { - error = new DOMException("The operation was aborted.", "AbortError"); + /** + * @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts + * @returns {URL} + */ + #getUrl(opts) { + if (typeof opts === "string") { + return new URL(opts); + } else if (opts instanceof URL) { + return opts; + } else { + return new URL(opts.uri); } - this.serializedAbortReason = error; - this.connection?.destroy(error); - this.emit("terminated", error); - } - }; - function handleFetchDone(response) { - finalizeAndReportTiming(response, "fetch"); - } - function fetch2(input, init = void 0) { - webidl.argumentLengthCheck(arguments, 1, "globalThis.fetch"); - let p = Promise.withResolvers(); - let requestObject; - try { - requestObject = new Request2(input, init); - } catch (e7) { - p.reject(e7); - return p.promise; - } - const request = getRequestState(requestObject); - if (requestObject.signal.aborted) { - abortFetch(p, request, null, requestObject.signal.reason, null); - return p.promise; - } - const globalObject = request.client.globalObject; - if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { - request.serviceWorkers = "none"; } - let responseObject = null; - let locallyAborted = false; - let controller = null; - addAbortListener( - requestObject.signal, - () => { - locallyAborted = true; - assert8(controller != null); - controller.abort(requestObject.signal.reason); - const realResponse = responseObject?.deref(); - abortFetch(p, request, realResponse, requestObject.signal.reason, controller.controller); - } - ); - const processResponse = (response) => { - if (locallyAborted) { - return; - } - if (response.aborted) { - abortFetch(p, request, responseObject, controller.serializedAbortReason, controller.controller); - return; - } - if (response.type === "error") { - p.reject(new TypeError("fetch failed", { cause: response.error })); - return; + [kClose]() { + const promises = [this[kAgent].close()]; + if (this[kClient]) { + promises.push(this[kClient].close()); } - responseObject = new WeakRef(fromInnerResponse(response, "immutable")); - p.resolve(responseObject.deref()); - p = null; - }; - controller = fetching({ - request, - processResponseEndOfBody: handleFetchDone, - processResponse, - dispatcher: getRequestDispatcher(requestObject), - // undici - // Keep requestObject alive to prevent its AbortController from being GC'd - // See https://github.com/nodejs/undici/issues/4627 - requestObject - }); - return p.promise; - } - function finalizeAndReportTiming(response, initiatorType = "other") { - if (response.type === "error" && response.aborted) { - return; - } - if (!response.urlList?.length) { - return; - } - const originalURL = response.urlList[0]; - let timingInfo = response.timingInfo; - let cacheState = response.cacheState; - if (!urlIsHttpHttpsScheme(originalURL)) { - return; + return Promise.all(promises); } - if (timingInfo === null) { - return; + [kDestroy]() { + const promises = [this[kAgent].destroy()]; + if (this[kClient]) { + promises.push(this[kClient].destroy()); + } + return Promise.all(promises); } - if (!response.timingAllowPassed) { - timingInfo = createOpaqueTimingInfo({ - startTime: timingInfo.startTime - }); - cacheState = ""; + }; + function buildHeaders(headers) { + if (Array.isArray(headers)) { + const headersPair = {}; + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1]; + } + return headersPair; } - timingInfo.endTime = coarsenedSharedCurrentTime(); - response.timingInfo = timingInfo; - markResourceTiming( - timingInfo, - originalURL.href, - initiatorType, - globalThis, - cacheState, - "", - // bodyType - response.status - ); + return headers; } - var markResourceTiming = performance.markResourceTiming; - function abortFetch(p, request, responseObject, error, controller) { - if (p) { - p.reject(error); - } - if (request.body?.stream != null && isReadable(request.body.stream)) { - request.body.stream.cancel(error).catch((err) => { - if (err.code === "ERR_INVALID_STATE") { - return; - } - throw err; - }); - } - if (responseObject == null) { - return; - } - const response = getResponseState(responseObject); - if (response.body?.stream != null && isReadable(response.body.stream)) { - controller.error(error); + function throwIfProxyAuthIsSent(headers) { + const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); + if (existProxyAuth) { + throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); } } - function fetching({ - request, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseEndOfBody, - processResponseConsumeBody, - useParallelQueue = false, - dispatcher = getGlobalDispatcher(), - // undici - requestObject = null - // Keep alive to prevent AbortController GC, see #4627 - }) { - assert8(dispatcher); - let taskDestination = null; - let crossOriginIsolatedCapability = false; - if (request.client != null) { - taskDestination = request.client.globalObject; - crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; - } - const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); - const timingInfo = createOpaqueTimingInfo({ - startTime: currentTime - }); - const fetchParams = { - controller: new Fetch(dispatcher), - request, - timingInfo, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseConsumeBody, - processResponseEndOfBody, - taskDestination, - crossOriginIsolatedCapability, - // Keep requestObject alive to prevent its AbortController from being GC'd - requestObject - }; - assert8(!request.body || request.body.stream); - if (request.window === "client") { - request.window = request.client?.globalObject?.constructor?.name === "Window" ? request.client : "no-window"; - } - if (request.origin === "client") { - request.origin = request.client.origin; - } - if (request.policyContainer === "client") { - if (request.client != null) { - request.policyContainer = clonePolicyContainer( - request.client.policyContainer - ); + module.exports = ProxyAgent; + } +}); + +// node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +var require_env_http_proxy_agent = __commonJS({ + "node_modules/undici/lib/dispatcher/env-http-proxy-agent.js"(exports, module) { + "use strict"; + var DispatcherBase = require_dispatcher_base(); + var { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = require_symbols(); + var ProxyAgent = require_proxy_agent(); + var Agent = require_agent(); + var DEFAULT_PORTS = { + "http:": 80, + "https:": 443 + }; + var EnvHttpProxyAgent = class extends DispatcherBase { + #noProxyValue = null; + #noProxyEntries = null; + #opts = null; + constructor(opts = {}) { + super(); + this.#opts = opts; + const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts; + this[kNoProxyAgent] = new Agent(agentOpts); + const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY; + if (HTTP_PROXY) { + this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }); } else { - request.policyContainer = makePolicyContainer(); + this[kHttpProxyAgent] = this[kNoProxyAgent]; + } + const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY; + if (HTTPS_PROXY) { + this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }); + } else { + this[kHttpsProxyAgent] = this[kHttpProxyAgent]; } + this.#parseNoProxy(); } - if (!request.headersList.contains("accept", true)) { - const value = "*/*"; - request.headersList.append("accept", value, true); + [kDispatch](opts, handler) { + const url = new URL(opts.origin); + const agent = this.#getProxyAgentForUrl(url); + return agent.dispatch(opts, handler); } - if (!request.headersList.contains("accept-language", true)) { - request.headersList.append("accept-language", "*", true); + [kClose]() { + return Promise.all([ + this[kNoProxyAgent].close(), + !this[kHttpProxyAgent][kClosed] && this[kHttpProxyAgent].close(), + !this[kHttpsProxyAgent][kClosed] && this[kHttpsProxyAgent].close() + ]); } - if (request.priority === null) { + [kDestroy](err) { + return Promise.all([ + this[kNoProxyAgent].destroy(err), + !this[kHttpProxyAgent][kDestroyed] && this[kHttpProxyAgent].destroy(err), + !this[kHttpsProxyAgent][kDestroyed] && this[kHttpsProxyAgent].destroy(err) + ]); } - if (subresourceSet.has(request.destination)) { + #getProxyAgentForUrl(url) { + let { protocol, host: hostname, port } = url; + hostname = hostname.replace(/:\d*$/, "").toLowerCase(); + port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; + if (!this.#shouldProxy(hostname, port)) { + return this[kNoProxyAgent]; + } + if (protocol === "https:") { + return this[kHttpsProxyAgent]; + } + return this[kHttpProxyAgent]; } - mainFetch(fetchParams, false); - return fetchParams.controller; - } - async function mainFetch(fetchParams, recursive) { - try { - const request = fetchParams.request; - let response = null; - if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { - response = makeNetworkError("local URLs only"); + #shouldProxy(hostname, port) { + if (this.#noProxyChanged) { + this.#parseNoProxy(); } - tryUpgradeRequestToAPotentiallyTrustworthyURL(request); - if (requestBadPort(request) === "blocked") { - response = makeNetworkError("bad port"); + if (this.#noProxyEntries.length === 0) { + return true; } - if (request.referrerPolicy === "") { - request.referrerPolicy = request.policyContainer.referrerPolicy; + if (this.#noProxyValue === "*") { + return false; } - if (request.referrer !== "no-referrer") { - request.referrer = determineRequestsReferrer(request); + for (let i = 0; i < this.#noProxyEntries.length; i++) { + const entry = this.#noProxyEntries[i]; + if (entry.port && entry.port !== port) { + continue; + } + if (hostname === entry.hostname) { + return false; + } + if (hostname.slice(-(entry.hostname.length + 1)) === `.${entry.hostname}`) { + return false; + } } - if (response === null) { - const currentURL = requestCurrentURL(request); - if ( - // - request’s current URL’s origin is same origin with request’s origin, - // and request’s response tainting is "basic" - sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || // request’s current URL’s scheme is "data" - currentURL.protocol === "data:" || // - request’s mode is "navigate" or "websocket" - (request.mode === "navigate" || request.mode === "websocket") - ) { - request.responseTainting = "basic"; - response = await schemeFetch(fetchParams); - } else if (request.mode === "same-origin") { - response = makeNetworkError('request mode cannot be "same-origin"'); - } else if (request.mode === "no-cors") { - if (request.redirect !== "follow") { - response = makeNetworkError( - 'redirect mode cannot be "follow" for "no-cors" request' - ); - } else { - request.responseTainting = "opaque"; - response = await schemeFetch(fetchParams); - } - } else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { - response = makeNetworkError("URL scheme must be a HTTP(S) scheme"); - } else { - request.responseTainting = "cors"; - response = await httpFetch(fetchParams); + return true; + } + #parseNoProxy() { + const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv; + const noProxySplit = noProxyValue.split(/[,\s]/); + const noProxyEntries = []; + for (let i = 0; i < noProxySplit.length; i++) { + const entry = noProxySplit[i]; + if (!entry) { + continue; } + const parsed = entry.match(/^(.+):(\d+)$/); + noProxyEntries.push({ + // strip leading dot or asterisk with dot + hostname: (parsed ? parsed[1] : entry).replace(/^\*?\./, "").toLowerCase(), + port: parsed ? Number.parseInt(parsed[2], 10) : 0 + }); } - if (recursive) { - return response; + this.#noProxyValue = noProxyValue; + this.#noProxyEntries = noProxyEntries; + } + get #noProxyChanged() { + if (this.#opts.noProxy !== void 0) { + return false; } - if (response.status !== 0 && !response.internalResponse) { - if (request.responseTainting === "cors") { - } - if (request.responseTainting === "basic") { - response = filterResponse(response, "basic"); - } else if (request.responseTainting === "cors") { - response = filterResponse(response, "cors"); - } else if (request.responseTainting === "opaque") { - response = filterResponse(response, "opaque"); + return this.#noProxyValue !== this.#noProxyEnv; + } + get #noProxyEnv() { + return process.env.no_proxy ?? process.env.NO_PROXY ?? ""; + } + }; + module.exports = EnvHttpProxyAgent; + } +}); + +// node_modules/undici/lib/handler/retry-handler.js +var require_retry_handler = __commonJS({ + "node_modules/undici/lib/handler/retry-handler.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { kRetryHandlerDefaultRetry } = require_symbols(); + var { RequestRetryError } = require_errors(); + var { + isDisturbed, + parseRangeHeader, + wrapRequestBody + } = require_util(); + function calculateRetryAfterHeader(retryAfter) { + const retryTime = new Date(retryAfter).getTime(); + return isNaN(retryTime) ? 0 : retryTime - Date.now(); + } + var RetryHandler = class _RetryHandler { + constructor(opts, { dispatch, handler }) { + const { retryOptions, ...dispatchOpts } = opts; + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes, + throwOnError + } = retryOptions ?? {}; + this.error = null; + this.dispatch = dispatch; + this.handler = handler; + this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }; + this.retryOpts = { + throwOnError: throwOnError ?? true, + retry: retryFn ?? _RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1e3, + // 30s, + minTimeout: minTimeout ?? 500, + // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + "ECONNRESET", + "ECONNREFUSED", + "ENOTFOUND", + "ENETDOWN", + "ENETUNREACH", + "EHOSTDOWN", + "EHOSTUNREACH", + "EPIPE", + "UND_ERR_SOCKET" + ] + }; + this.retryCount = 0; + this.retryCountCheckpoint = 0; + this.headersSent = false; + this.start = 0; + this.end = null; + this.etag = null; + } + onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err) { + if (this.retryOpts.throwOnError) { + if (this.retryOpts.statusCodes.includes(statusCode) === false) { + this.headersSent = true; + this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); } else { - assert8(false); + this.error = err; + } + return; + } + if (isDisturbed(this.opts.body)) { + this.headersSent = true; + this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); + return; + } + function shouldRetry2(passedErr) { + if (passedErr) { + this.headersSent = true; + this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); + controller.resume(); + return; } + this.error = err; + controller.resume(); } - let internalResponse = response.status === 0 ? response : response.internalResponse; - if (internalResponse.urlList.length === 0) { - internalResponse.urlList.push(...request.urlList); + controller.pause(); + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + shouldRetry2.bind(this) + ); + } + onRequestStart(controller, context) { + if (!this.headersSent) { + this.handler.onRequestStart?.(controller, context); } - if (!request.timingAllowFailed) { - response.timingAllowPassed = true; + } + onRequestUpgrade(controller, statusCode, headers, socket) { + this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket); + } + static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { + const { statusCode, code, headers } = err; + const { method, retryOptions } = opts; + const { + maxRetries, + minTimeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions; + const { counter } = state; + if (code && code !== "UND_ERR_REQ_RETRY" && !errorCodes.includes(code)) { + cb(err); + return; } - if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range", true)) { - response = internalResponse = makeNetworkError(); + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err); + return; } - if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { - internalResponse.body = null; - fetchParams.controller.dump = true; + if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { + cb(err); + return; } - if (request.integrity) { - const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); - if (request.responseTainting === "opaque" || response.body == null) { - processBodyError(response.error); - return; - } - const processBody = (bytes) => { - if (!bytesMatch(bytes, request.integrity)) { - processBodyError("integrity mismatch"); - return; - } - response.body = safelyExtractBody(bytes)[0]; - fetchFinale(fetchParams, response); - }; - fullyReadBody(response.body, processBody, processBodyError); - } else { - fetchFinale(fetchParams, response); + if (counter > maxRetries) { + cb(err); + return; } - } catch (err) { - fetchParams.controller.terminate(err); - } - } - function schemeFetch(fetchParams) { - if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { - return Promise.resolve(makeAppropriateNetworkError(fetchParams)); + let retryAfterHeader = headers?.["retry-after"]; + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader); + retryAfterHeader = Number.isNaN(retryAfterHeader) ? calculateRetryAfterHeader(headers["retry-after"]) : retryAfterHeader * 1e3; + } + const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); + setTimeout(() => cb(null), retryTimeout); } - const { request } = fetchParams; - const { protocol: scheme } = requestCurrentURL(request); - switch (scheme) { - case "about:": { - return Promise.resolve(makeNetworkError("about scheme is not supported")); + onResponseStart(controller, statusCode, headers, statusMessage) { + this.error = null; + this.retryCount += 1; + if (statusCode >= 300) { + const err = new RequestRetryError("Request failed", statusCode, { + headers, + data: { + count: this.retryCount + } + }); + this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err); + return; } - case "blob:": { - if (!resolveObjectURL) { - resolveObjectURL = __require("buffer").resolveObjectURL; + if (this.headersSent) { + if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { + throw new RequestRetryError("server does not support the range header and the payload was partially consumed", statusCode, { + headers, + data: { count: this.retryCount } + }); } - const blobURLEntry = requestCurrentURL(request); - if (blobURLEntry.search.length !== 0) { - return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); + const contentRange = parseRangeHeader(headers["content-range"]); + if (!contentRange) { + throw new RequestRetryError("Content-Range mismatch", statusCode, { + headers, + data: { count: this.retryCount } + }); } - const blob = resolveObjectURL(blobURLEntry.toString()); - if (request.method !== "GET" || !webidl.is.Blob(blob)) { - return Promise.resolve(makeNetworkError("invalid method")); + if (this.etag != null && this.etag !== headers.etag) { + throw new RequestRetryError("ETag mismatch", statusCode, { + headers, + data: { count: this.retryCount } + }); } - const response = makeResponse(); - const fullLength = blob.size; - const serializedFullLength = isomorphicEncode(`${fullLength}`); - const type = blob.type; - if (!request.headersList.contains("range", true)) { - const bodyWithType = extractBody(blob); - response.statusText = "OK"; - response.body = bodyWithType[0]; - response.headersList.set("content-length", serializedFullLength, true); - response.headersList.set("content-type", type, true); - } else { - response.rangeRequested = true; - const rangeHeader = request.headersList.get("range", true); - const rangeValue = simpleRangeHeaderValue(rangeHeader, true); - if (rangeValue === "failure") { - return Promise.resolve(makeNetworkError("failed to fetch the data URL")); - } - let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue; - if (rangeStart === null) { - rangeStart = fullLength - rangeEnd; - rangeEnd = rangeStart + rangeEnd - 1; - } else { - if (rangeStart >= fullLength) { - return Promise.resolve(makeNetworkError("Range start is greater than the blob's size.")); - } - if (rangeEnd === null || rangeEnd >= fullLength) { - rangeEnd = fullLength - 1; - } + const { start, size: size5, end = size5 ? size5 - 1 : null } = contentRange; + assert8(this.start === start, "content-range mismatch"); + assert8(this.end == null || this.end === end, "content-range mismatch"); + return; + } + if (this.end == null) { + if (statusCode === 206) { + const range = parseRangeHeader(headers["content-range"]); + if (range == null) { + this.headersSent = true; + this.handler.onResponseStart?.( + controller, + statusCode, + headers, + statusMessage + ); + return; } - const slicedBlob = blob.slice(rangeStart, rangeEnd + 1, type); - const slicedBodyWithType = extractBody(slicedBlob); - response.body = slicedBodyWithType[0]; - const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`); - const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength); - response.status = 206; - response.statusText = "Partial Content"; - response.headersList.set("content-length", serializedSlicedLength, true); - response.headersList.set("content-type", type, true); - response.headersList.set("content-range", contentRange, true); + const { start, size: size5, end = size5 ? size5 - 1 : null } = range; + assert8( + start != null && Number.isFinite(start), + "content-range mismatch" + ); + assert8(end != null && Number.isFinite(end), "invalid content-length"); + this.start = start; + this.end = end; } - return Promise.resolve(response); - } - case "data:": { - const currentURL = requestCurrentURL(request); - const dataURLStruct = dataURLProcessor(currentURL); - if (dataURLStruct === "failure") { - return Promise.resolve(makeNetworkError("failed to fetch the data URL")); + if (this.end == null) { + const contentLength = headers["content-length"]; + this.end = contentLength != null ? Number(contentLength) - 1 : null; } - const mimeType = serializeAMimeType(dataURLStruct.mimeType); - return Promise.resolve(makeResponse({ - statusText: "OK", - headersList: [ - ["content-type", { name: "Content-Type", value: mimeType }] - ], - body: safelyExtractBody(dataURLStruct.body)[0] - })); + assert8(Number.isFinite(this.start)); + assert8( + this.end == null || Number.isFinite(this.end), + "invalid content-length" + ); + this.resume = true; + this.etag = headers.etag != null ? headers.etag : null; + if (this.etag != null && this.etag[0] === "W" && this.etag[1] === "/") { + this.etag = null; + } + this.headersSent = true; + this.handler.onResponseStart?.( + controller, + statusCode, + headers, + statusMessage + ); + } else { + throw new RequestRetryError("Request failed", statusCode, { + headers, + data: { count: this.retryCount } + }); } - case "file:": { - return Promise.resolve(makeNetworkError("not implemented... yet...")); + } + onResponseData(controller, chunk) { + if (this.error) { + return; } - case "http:": - case "https:": { - return httpFetch(fetchParams).catch((err) => makeNetworkError(err)); + this.start += chunk.length; + this.handler.onResponseData?.(controller, chunk); + } + onResponseEnd(controller, trailers) { + if (this.error && this.retryOpts.throwOnError) { + throw this.error; } - default: { - return Promise.resolve(makeNetworkError("unknown scheme")); + if (!this.error) { + this.retryCount = 0; + return this.handler.onResponseEnd?.(controller, trailers); } + this.retry(controller); } - } - function finalizeResponse(fetchParams, response) { - fetchParams.request.done = true; - if (fetchParams.processResponseDone != null) { - queueMicrotask(() => fetchParams.processResponseDone(response)); + retry(controller) { + if (this.start !== 0) { + const headers = { range: `bytes=${this.start}-${this.end ?? ""}` }; + if (this.etag != null) { + headers["if-match"] = this.etag; + } + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + ...headers + } + }; + } + try { + this.retryCountCheckpoint = this.retryCount; + this.dispatch(this.opts, this); + } catch (err) { + this.handler.onResponseError?.(controller, err); + } } - } - function fetchFinale(fetchParams, response) { - let timingInfo = fetchParams.timingInfo; - const processResponseEndOfBody = () => { - const unsafeEndTime = Date.now(); - if (fetchParams.request.destination === "document") { - fetchParams.controller.fullTimingInfo = timingInfo; + onResponseError(controller, err) { + if (controller?.aborted || isDisturbed(this.opts.body)) { + this.handler.onResponseError?.(controller, err); + return; } - fetchParams.controller.reportTimingSteps = () => { - if (!urlIsHttpHttpsScheme(fetchParams.request.url)) { + function shouldRetry2(returnedErr) { + if (!returnedErr) { + this.retry(controller); return; } - timingInfo.endTime = unsafeEndTime; - let cacheState = response.cacheState; - const bodyInfo = response.bodyInfo; - if (!response.timingAllowPassed) { - timingInfo = createOpaqueTimingInfo(timingInfo); - cacheState = ""; - } - let responseStatus = 0; - if (fetchParams.request.mode !== "navigator" || !response.hasCrossOriginRedirects) { - responseStatus = response.status; - const mimeType = extractMimeType(response.headersList); - if (mimeType !== "failure") { - bodyInfo.contentType = minimizeSupportedMimeType(mimeType); - } - } - if (fetchParams.request.initiatorType != null) { - markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus); - } - }; - const processResponseEndOfBodyTask = () => { - fetchParams.request.done = true; - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); - } - if (fetchParams.request.initiatorType != null) { - fetchParams.controller.reportTimingSteps(); - } - }; - queueMicrotask(() => processResponseEndOfBodyTask()); - }; - if (fetchParams.processResponse != null) { - queueMicrotask(() => { - fetchParams.processResponse(response); - fetchParams.processResponse = null; - }); + this.handler?.onResponseError?.(controller, returnedErr); + } + if (this.retryCount - this.retryCountCheckpoint > 0) { + this.retryCount = this.retryCountCheckpoint + (this.retryCount - this.retryCountCheckpoint); + } else { + this.retryCount += 1; + } + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + shouldRetry2.bind(this) + ); } - const internalResponse = response.type === "error" ? response : response.internalResponse ?? response; - if (internalResponse.body == null) { - processResponseEndOfBody(); - } else { - finished2(internalResponse.body.stream, () => { - processResponseEndOfBody(); + }; + module.exports = RetryHandler; + } +}); + +// node_modules/undici/lib/dispatcher/retry-agent.js +var require_retry_agent = __commonJS({ + "node_modules/undici/lib/dispatcher/retry-agent.js"(exports, module) { + "use strict"; + var Dispatcher = require_dispatcher(); + var RetryHandler = require_retry_handler(); + var RetryAgent = class extends Dispatcher { + #agent = null; + #options = null; + constructor(agent, options = {}) { + super(options); + this.#agent = agent; + this.#options = options; + } + dispatch(opts, handler) { + const retry = new RetryHandler({ + ...opts, + retryOptions: this.#options + }, { + dispatch: this.#agent.dispatch.bind(this.#agent), + handler }); + return this.#agent.dispatch(opts, retry); } - } - async function httpFetch(fetchParams) { - const request = fetchParams.request; - let response = null; - let actualResponse = null; - const timingInfo = fetchParams.timingInfo; - if (request.serviceWorkers === "all") { + close() { + return this.#agent.close(); } - if (response === null) { - if (request.redirect === "follow") { - request.serviceWorkers = "none"; + destroy() { + return this.#agent.destroy(); + } + }; + module.exports = RetryAgent; + } +}); + +// node_modules/undici/lib/dispatcher/h2c-client.js +var require_h2c_client = __commonJS({ + "node_modules/undici/lib/dispatcher/h2c-client.js"(exports, module) { + "use strict"; + var { InvalidArgumentError } = require_errors(); + var Client = require_client(); + var H2CClient = class extends Client { + constructor(origin, clientOpts) { + if (typeof origin === "string") { + origin = new URL(origin); } - actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); - if (request.responseTainting === "cors" && corsCheck(request, response) === "failure") { - return makeNetworkError("cors failure"); + if (origin.protocol !== "http:") { + throw new InvalidArgumentError( + "h2c-client: Only h2c protocol is supported" + ); } - if (TAOCheck(request, response) === "failure") { - request.timingAllowFailed = true; + const { maxConcurrentStreams, pipelining, ...opts } = clientOpts ?? {}; + let defaultMaxConcurrentStreams = 100; + let defaultPipelining = 100; + if (maxConcurrentStreams != null && Number.isInteger(maxConcurrentStreams) && maxConcurrentStreams > 0) { + defaultMaxConcurrentStreams = maxConcurrentStreams; + } + if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) { + defaultPipelining = pipelining; } + if (defaultPipelining > defaultMaxConcurrentStreams) { + throw new InvalidArgumentError( + "h2c-client: pipelining cannot be greater than maxConcurrentStreams" + ); + } + super(origin, { + ...opts, + maxConcurrentStreams: defaultMaxConcurrentStreams, + pipelining: defaultPipelining, + allowH2: true, + useH2c: true + }); } - if ((request.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck( - request.origin, - request.client, - request.destination, - actualResponse - ) === "blocked") { - return makeNetworkError("blocked"); + }; + module.exports = H2CClient; + } +}); + +// node_modules/undici/lib/api/readable.js +var require_readable = __commonJS({ + "node_modules/undici/lib/api/readable.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { Readable } = __require("stream"); + var { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require_errors(); + var util2 = require_util(); + var { ReadableStreamFrom } = require_util(); + var kConsume = /* @__PURE__ */ Symbol("kConsume"); + var kReading = /* @__PURE__ */ Symbol("kReading"); + var kBody = /* @__PURE__ */ Symbol("kBody"); + var kAbort = /* @__PURE__ */ Symbol("kAbort"); + var kContentType = /* @__PURE__ */ Symbol("kContentType"); + var kContentLength = /* @__PURE__ */ Symbol("kContentLength"); + var kUsed = /* @__PURE__ */ Symbol("kUsed"); + var kBytesRead = /* @__PURE__ */ Symbol("kBytesRead"); + var noop = () => { + }; + var BodyReadable = class extends Readable { + /** + * @param {object} opts + * @param {(this: Readable, size: number) => void} opts.resume + * @param {() => (void | null)} opts.abort + * @param {string} [opts.contentType = ''] + * @param {number} [opts.contentLength] + * @param {number} [opts.highWaterMark = 64 * 1024] + */ + constructor({ + resume, + abort, + contentType = "", + contentLength, + highWaterMark = 64 * 1024 + // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }); + this._readableState.dataEmitted = false; + this[kAbort] = abort; + this[kConsume] = null; + this[kBytesRead] = 0; + this[kBody] = null; + this[kUsed] = false; + this[kContentType] = contentType; + this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null; + this[kReading] = false; } - if (redirectStatusSet.has(actualResponse.status)) { - if (request.redirect !== "manual") { - fetchParams.controller.connection.destroy(void 0, false); + /** + * @param {Error|null} err + * @param {(error:(Error|null)) => void} callback + * @returns {void} + */ + _destroy(err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); } - if (request.redirect === "error") { - response = makeNetworkError("unexpected redirect"); - } else if (request.redirect === "manual") { - response = actualResponse; - } else if (request.redirect === "follow") { - response = await httpRedirectFetch(fetchParams, response); + if (err) { + this[kAbort](); + } + if (!this[kUsed]) { + setImmediate(callback, err); } else { - assert8(false); + callback(err); } } - response.timingInfo = timingInfo; - return response; - } - function httpRedirectFetch(fetchParams, response) { - const request = fetchParams.request; - const actualResponse = response.internalResponse ? response.internalResponse : response; - let locationURL; - try { - locationURL = responseLocationURL( - actualResponse, - requestCurrentURL(request).hash - ); - if (locationURL == null) { - return response; + /** + * @param {string|symbol} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + on(event, listener) { + if (event === "data" || event === "readable") { + this[kReading] = true; + this[kUsed] = true; } - } catch (err) { - return Promise.resolve(makeNetworkError(err)); - } - if (!urlIsHttpHttpsScheme(locationURL)) { - return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme")); - } - if (request.redirectCount === 20) { - return Promise.resolve(makeNetworkError("redirect count exceeded")); - } - request.redirectCount += 1; - if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { - return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')); - } - if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { - return Promise.resolve(makeNetworkError( - 'URL cannot contain credentials for request mode "cors"' - )); + return super.on(event, listener); } - if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { - return Promise.resolve(makeNetworkError()); + /** + * @param {string|symbol} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + addListener(event, listener) { + return this.on(event, listener); } - if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request.method)) { - request.method = "GET"; - request.body = null; - for (const headerName of requestBodyHeader) { - request.headersList.delete(headerName); + /** + * @param {string|symbol} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + off(event, listener) { + const ret = super.off(event, listener); + if (event === "data" || event === "readable") { + this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; } + return ret; } - if (!sameOrigin(requestCurrentURL(request), locationURL)) { - request.headersList.delete("authorization", true); - request.headersList.delete("proxy-authorization", true); - request.headersList.delete("cookie", true); - request.headersList.delete("host", true); - } - if (request.body != null) { - assert8(request.body.source != null); - request.body = safelyExtractBody(request.body.source)[0]; - } - const timingInfo = fetchParams.timingInfo; - timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); - if (timingInfo.redirectStartTime === 0) { - timingInfo.redirectStartTime = timingInfo.startTime; + /** + * @param {string|symbol} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + removeListener(event, listener) { + return this.off(event, listener); } - request.urlList.push(locationURL); - setRequestReferrerPolicyOnRedirect(request, actualResponse); - return mainFetch(fetchParams, true); - } - async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { - const request = fetchParams.request; - let httpFetchParams = null; - let httpRequest = null; - let response = null; - const httpCache = null; - const revalidatingFlag = false; - if (request.window === "no-window" && request.redirect === "error") { - httpFetchParams = fetchParams; - httpRequest = request; - } else { - httpRequest = cloneRequest(request); - httpFetchParams = { ...fetchParams }; - httpFetchParams.request = httpRequest; + /** + * @param {Buffer|null} chunk + * @returns {boolean} + */ + push(chunk) { + if (chunk) { + this[kBytesRead] += chunk.length; + if (this[kConsume]) { + consumePush(this[kConsume], chunk); + return this[kReading] ? super.push(chunk) : true; + } + } + return super.push(chunk); } - const includeCredentials = request.credentials === "include" || request.credentials === "same-origin" && request.responseTainting === "basic"; - const contentLength = httpRequest.body ? httpRequest.body.length : null; - let contentLengthHeaderValue = null; - if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { - contentLengthHeaderValue = "0"; + /** + * Consumes and returns the body as a string. + * + * @see https://fetch.spec.whatwg.org/#dom-body-text + * @returns {Promise} + */ + text() { + return consume(this, "text"); } - if (contentLength != null) { - contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); + /** + * Consumes and returns the body as a JavaScript Object. + * + * @see https://fetch.spec.whatwg.org/#dom-body-json + * @returns {Promise} + */ + json() { + return consume(this, "json"); } - if (contentLengthHeaderValue != null) { - httpRequest.headersList.append("content-length", contentLengthHeaderValue, true); + /** + * Consumes and returns the body as a Blob + * + * @see https://fetch.spec.whatwg.org/#dom-body-blob + * @returns {Promise} + */ + blob() { + return consume(this, "blob"); } - if (contentLength != null && httpRequest.keepalive) { + /** + * Consumes and returns the body as an Uint8Array. + * + * @see https://fetch.spec.whatwg.org/#dom-body-bytes + * @returns {Promise} + */ + bytes() { + return consume(this, "bytes"); } - if (webidl.is.URL(httpRequest.referrer)) { - httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href), true); + /** + * Consumes and returns the body as an ArrayBuffer. + * + * @see https://fetch.spec.whatwg.org/#dom-body-arraybuffer + * @returns {Promise} + */ + arrayBuffer() { + return consume(this, "arrayBuffer"); } - appendRequestOriginHeader(httpRequest); - appendFetchMetadata(httpRequest); - if (!httpRequest.headersList.contains("user-agent", true)) { - httpRequest.headersList.append("user-agent", defaultUserAgent, true); + /** + * Not implemented + * + * @see https://fetch.spec.whatwg.org/#dom-body-formdata + * @throws {NotSupportedError} + */ + async formData() { + throw new NotSupportedError(); } - if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since", true) || httpRequest.headersList.contains("if-none-match", true) || httpRequest.headersList.contains("if-unmodified-since", true) || httpRequest.headersList.contains("if-match", true) || httpRequest.headersList.contains("if-range", true))) { - httpRequest.cache = "no-store"; + /** + * Returns true if the body is not null and the body has been consumed. + * Otherwise, returns false. + * + * @see https://fetch.spec.whatwg.org/#dom-body-bodyused + * @readonly + * @returns {boolean} + */ + get bodyUsed() { + return util2.isDisturbed(this); } - if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control", true)) { - httpRequest.headersList.append("cache-control", "max-age=0", true); + /** + * @see https://fetch.spec.whatwg.org/#dom-body-body + * @readonly + * @returns {ReadableStream} + */ + get body() { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this); + if (this[kConsume]) { + this[kBody].getReader(); + assert8(this[kBody].locked); + } + } + return this[kBody]; } - if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { - if (!httpRequest.headersList.contains("pragma", true)) { - httpRequest.headersList.append("pragma", "no-cache", true); + /** + * Dumps the response body by reading `limit` number of bytes. + * @param {object} opts + * @param {number} [opts.limit = 131072] Number of bytes to read. + * @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump. + * @returns {Promise} + */ + dump(opts) { + const signal = opts?.signal; + if (signal != null && (typeof signal !== "object" || !("aborted" in signal))) { + return Promise.reject(new InvalidArgumentError("signal must be an AbortSignal")); } - if (!httpRequest.headersList.contains("cache-control", true)) { - httpRequest.headersList.append("cache-control", "no-cache", true); + const limit = opts?.limit && Number.isFinite(opts.limit) ? opts.limit : 128 * 1024; + if (signal?.aborted) { + return Promise.reject(signal.reason ?? new AbortError()); + } + if (this._readableState.closeEmitted) { + return Promise.resolve(null); } + return new Promise((resolve, reject) => { + if (this[kContentLength] && this[kContentLength] > limit || this[kBytesRead] > limit) { + this.destroy(new AbortError()); + } + if (signal) { + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()); + }; + signal.addEventListener("abort", onAbort); + this.on("close", function() { + signal.removeEventListener("abort", onAbort); + if (signal.aborted) { + reject(signal.reason ?? new AbortError()); + } else { + resolve(null); + } + }); + } else { + this.on("close", resolve); + } + this.on("error", noop).on("data", () => { + if (this[kBytesRead] > limit) { + this.destroy(); + } + }).resume(); + }); } - if (httpRequest.headersList.contains("range", true)) { - httpRequest.headersList.append("accept-encoding", "identity", true); + /** + * @param {BufferEncoding} encoding + * @returns {this} + */ + setEncoding(encoding) { + if (Buffer.isEncoding(encoding)) { + this._readableState.encoding = encoding; + } + return this; } - if (!httpRequest.headersList.contains("accept-encoding", true)) { - if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append("accept-encoding", "br, gzip, deflate", true); + }; + function isLocked(bodyReadable) { + return bodyReadable[kBody]?.locked === true || bodyReadable[kConsume] !== null; + } + function isUnusable(bodyReadable) { + return util2.isDisturbed(bodyReadable) || isLocked(bodyReadable); + } + function consume(stream, type) { + assert8(!stream[kConsume]); + return new Promise((resolve, reject) => { + if (isUnusable(stream)) { + const rState = stream._readableState; + if (rState.destroyed && rState.closeEmitted === false) { + stream.on("error", reject).on("close", () => { + reject(new TypeError("unusable")); + }); + } else { + reject(rState.errored ?? new TypeError("unusable")); + } } else { - httpRequest.headersList.append("accept-encoding", "gzip, deflate", true); + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + stream.on("error", function(err) { + consumeFinish(this[kConsume], err); + }).on("close", function() { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); + consumeStart(stream[kConsume]); + }); } + }); + } + function consumeStart(consume2) { + if (consume2.body === null) { + return; } - httpRequest.headersList.delete("host", true); - if (includeCredentials) { - if (!httpRequest.headersList.contains("authorization", true)) { - let authorizationValue = null; - if (hasAuthenticationEntry(httpRequest) && (httpRequest.useURLCredentials === void 0 || !includesCredentials(requestCurrentURL(httpRequest)))) { - } else if (includesCredentials(requestCurrentURL(httpRequest)) && isAuthenticationFetch) { - const { username, password } = requestCurrentURL(httpRequest); - authorizationValue = `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`; - } - if (authorizationValue !== null) { - httpRequest.headersList.append("Authorization", authorizationValue, false); - } + const { _readableState: state } = consume2.stream; + if (state.bufferIndex) { + const start = state.bufferIndex; + const end = state.buffer.length; + for (let n = start; n < end; n++) { + consumePush(consume2, state.buffer[n]); + } + } else { + for (const chunk of state.buffer) { + consumePush(consume2, chunk); } } - if (httpCache == null) { - httpRequest.cache = "no-store"; + if (state.endEmitted) { + consumeEnd(this[kConsume], this._readableState.encoding); + } else { + consume2.stream.on("end", function() { + consumeEnd(this[kConsume], this._readableState.encoding); + }); } - if (httpRequest.cache !== "no-store" && httpRequest.cache !== "reload") { + consume2.stream.resume(); + while (consume2.stream.read() != null) { } - if (response == null) { - if (httpRequest.cache === "only-if-cached") { - return makeNetworkError("only if cached"); - } - const forwardResponse = await httpNetworkFetch( - httpFetchParams, - includeCredentials, - isNewConnectionFetch - ); - if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { - } - if (revalidatingFlag && forwardResponse.status === 304) { - } - if (response == null) { - response = forwardResponse; - } + } + function chunksDecode(chunks, length, encoding) { + if (chunks.length === 0 || length === 0) { + return ""; } - response.urlList = [...httpRequest.urlList]; - if (httpRequest.headersList.contains("range", true)) { - response.rangeRequested = true; + const buffer2 = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); + const bufferLength = buffer2.length; + const start = bufferLength > 2 && buffer2[0] === 239 && buffer2[1] === 187 && buffer2[2] === 191 ? 3 : 0; + if (!encoding || encoding === "utf8" || encoding === "utf-8") { + return buffer2.utf8Slice(start, bufferLength); + } else { + return buffer2.subarray(start, bufferLength).toString(encoding); } - response.requestIncludesCredentials = includeCredentials; - if (response.status === 401 && httpRequest.responseTainting !== "cors" && includeCredentials && (request.useURLCredentials !== void 0 || isTraversableNavigable(request.traversableForUserPrompts))) { - if (request.body != null) { - if (request.body.source == null) { - return response; - } - request.body = safelyExtractBody(request.body.source)[0]; - } - if (request.useURLCredentials === void 0 || isAuthenticationFetch) { - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - return response; - } - fetchParams.controller.connection.destroy(); - response = await httpNetworkOrCacheFetch(fetchParams, true); + } + function chunksConcat(chunks, length) { + if (chunks.length === 0 || length === 0) { + return new Uint8Array(0); } - if (response.status === 407) { - if (request.window === "no-window") { - return makeNetworkError(); - } - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - return makeNetworkError("proxy authentication required"); + if (chunks.length === 1) { + return new Uint8Array(chunks[0]); } - if ( - // response’s status is 421 - response.status === 421 && // isNewConnectionFetch is false - !isNewConnectionFetch && // request’s body is null, or request’s body is non-null and request’s body’s source is non-null - (request.body == null || request.body.source != null) - ) { - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); + const buffer2 = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer); + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + const chunk = chunks[i]; + buffer2.set(chunk, offset); + offset += chunk.length; + } + return buffer2; + } + function consumeEnd(consume2, encoding) { + const { type, body, resolve, stream, length } = consume2; + try { + if (type === "text") { + resolve(chunksDecode(body, length, encoding)); + } else if (type === "json") { + resolve(JSON.parse(chunksDecode(body, length, encoding))); + } else if (type === "arrayBuffer") { + resolve(chunksConcat(body, length).buffer); + } else if (type === "blob") { + resolve(new Blob(body, { type: stream[kContentType] })); + } else if (type === "bytes") { + resolve(chunksConcat(body, length)); } - fetchParams.controller.connection.destroy(); - response = await httpNetworkOrCacheFetch( - fetchParams, - isAuthenticationFetch, - true - ); + consumeFinish(consume2); + } catch (err) { + stream.destroy(err); } - if (isAuthenticationFetch) { + } + function consumePush(consume2, chunk) { + consume2.length += chunk.length; + consume2.body.push(chunk); + } + function consumeFinish(consume2, err) { + if (consume2.body === null) { + return; } - return response; + if (err) { + consume2.reject(err); + } else { + consume2.resolve(); + } + consume2.type = null; + consume2.stream = null; + consume2.resolve = null; + consume2.reject = null; + consume2.length = 0; + consume2.body = null; } - async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { - assert8(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); - fetchParams.controller.connection = { - abort: null, - destroyed: false, - destroy(err, abort = true) { - if (!this.destroyed) { - this.destroyed = true; - if (abort) { - this.abort?.(err ?? new DOMException("The operation was aborted.", "AbortError")); - } - } + module.exports = { + Readable: BodyReadable, + chunksDecode + }; + } +}); + +// node_modules/undici/lib/api/api-request.js +var require_api_request = __commonJS({ + "node_modules/undici/lib/api/api-request.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { AsyncResource } = __require("async_hooks"); + var { Readable } = require_readable(); + var { InvalidArgumentError, RequestAbortedError } = require_errors(); + var util2 = require_util(); + function noop() { + } + var RequestHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); } - }; - const request = fetchParams.request; - let response = null; - const timingInfo = fetchParams.timingInfo; - const httpCache = null; - if (httpCache == null) { - request.cache = "no-store"; - } - const newConnection = forceNewConnection ? "yes" : "no"; - if (request.mode === "websocket") { - } else { - } - let requestBody = null; - if (request.body == null && fetchParams.processRequestEndOfBody) { - queueMicrotask(() => fetchParams.processRequestEndOfBody()); - } else if (request.body != null) { - const processBodyChunk = async function* (bytes) { - if (isCancelled(fetchParams)) { - return; + const { signal, method, opaque, body, onInfo, responseHeaders, highWaterMark } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - yield bytes; - fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); - }; - const processEndOfBody = () => { - if (isCancelled(fetchParams)) { - return; + if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { + throw new InvalidArgumentError("invalid highWaterMark"); } - if (fetchParams.processRequestEndOfBody) { - fetchParams.processRequestEndOfBody(); + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); } - }; - const processBodyError = (e7) => { - if (isCancelled(fetchParams)) { - return; + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); } - if (e7.name === "AbortError") { - fetchParams.controller.abort(); - } else { - fetchParams.controller.terminate(e7); + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); } - }; - requestBody = (async function* () { - try { - for await (const bytes of request.body.stream) { - yield* processBodyChunk(bytes); - } - processEndOfBody(); - } catch (err) { - processBodyError(err); + super("UNDICI_REQUEST"); + } catch (err) { + if (util2.isStream(body)) { + util2.destroy(body.on("error", noop), err); } - })(); - } - try { - const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }); - if (socket) { - response = makeResponse({ status, statusText, headersList, socket }); - } else { - const iterator = body[Symbol.asyncIterator](); - fetchParams.controller.next = () => iterator.next(); - response = makeResponse({ status, statusText, headersList }); + throw err; } - } catch (err) { - if (err.name === "AbortError") { - fetchParams.controller.connection.destroy(); - return makeAppropriateNetworkError(fetchParams, err); + this.method = method; + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.res = null; + this.abort = null; + this.body = body; + this.trailers = {}; + this.context = null; + this.controller = null; + this.onInfo = onInfo || null; + this.highWaterMark = highWaterMark; + this.reason = null; + this.removeAbortListener = null; + if (signal?.aborted) { + this.reason = signal.reason ?? new RequestAbortedError(); + } else if (signal) { + this.removeAbortListener = util2.addAbortListener(signal, () => { + this.reason = signal.reason ?? new RequestAbortedError(); + if (this.res) { + util2.destroy(this.res.on("error", noop), this.reason); + } else if (this.abort) { + this.abort(this.reason); + } + }); } - return makeNetworkError(err); } - const pullAlgorithm = () => { - return fetchParams.controller.resume(); - }; - const cancelAlgorithm = (reason) => { - if (!isCancelled(fetchParams)) { - fetchParams.controller.abort(reason); - } - }; - const stream = new ReadableStream( - { - start(controller) { - fetchParams.controller.controller = controller; - }, - pull: pullAlgorithm, - cancel: cancelAlgorithm, - type: "bytes" + onRequestStart(controller, context) { + if (this.reason) { + controller.abort(this.reason); + return; } - ); - response.body = { stream, source: null, length: null }; - if (!fetchParams.controller.resume) { - fetchParams.controller.on("terminated", onAborted); + assert8(this.callback); + this.controller = controller; + this.abort = (reason) => controller.abort(reason); + this.context = context; } - fetchParams.controller.resume = async () => { - while (true) { - let bytes; - let isFailure; + onResponseStart(controller, statusCode, headers, statusText) { + const { callback, opaque, context, responseHeaders, highWaterMark } = this; + const rawHeaders = controller?.rawHeaders; + const responseHeaderData = responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers: responseHeaderData }); + } + return; + } + const parsedHeaders = headers; + const contentType = parsedHeaders?.["content-type"]; + const contentLength = parsedHeaders?.["content-length"]; + const res = new Readable({ + resume: () => controller.resume(), + abort: (reason) => controller.abort(reason), + contentType, + contentLength: this.method !== "HEAD" && contentLength ? Number(contentLength) : null, + highWaterMark + }); + if (this.removeAbortListener) { + res.on("close", this.removeAbortListener); + this.removeAbortListener = null; + } + this.callback = null; + this.res = res; + if (callback !== null) { try { - const { done, value } = await fetchParams.controller.next(); - if (isAborted2(fetchParams)) { - break; - } - bytes = done ? void 0 : value; + this.runInAsyncScope(callback, null, null, { + statusCode, + statusText, + headers: responseHeaderData, + trailers: this.trailers, + opaque, + body: res, + context + }); } catch (err) { - if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { - bytes = void 0; + this.res = null; + util2.destroy(res.on("error", noop), err); + queueMicrotask(() => { + throw err; + }); + } + } + } + onResponseData(controller, chunk) { + if (!this.res) { + return; + } + if (this.res.push(chunk) === false) { + controller.pause(); + } + } + onResponseEnd(_controller, trailers) { + if (trailers && typeof trailers === "object") { + for (const key of Object.keys(trailers)) { + if (key === "__proto__") { + Object.defineProperty(this.trailers, key, { + value: trailers[key], + enumerable: true, + configurable: true, + writable: true + }); } else { - bytes = err; - isFailure = true; + this.trailers[key] = trailers[key]; } } - if (bytes === void 0) { - readableStreamClose(fetchParams.controller.controller); - finalizeResponse(fetchParams, response); - return; - } - timingInfo.decodedBodySize += bytes?.byteLength ?? 0; - if (isFailure) { - fetchParams.controller.terminate(bytes); - return; - } - const buffer2 = new Uint8Array(bytes); - if (buffer2.byteLength) { - fetchParams.controller.controller.enqueue(buffer2); - } - if (isErrored(stream)) { - fetchParams.controller.terminate(); - return; - } - if (fetchParams.controller.controller.desiredSize <= 0) { - return; - } } - }; - function onAborted(reason) { - if (isAborted2(fetchParams)) { - response.aborted = true; - if (isReadable(stream)) { - fetchParams.controller.controller.error( - fetchParams.controller.serializedAbortReason - ); - } - } else { - if (isReadable(stream)) { - fetchParams.controller.controller.error(new TypeError("terminated", { - cause: isErrorLike(reason) ? reason : void 0 - })); + this.res?.push(null); + } + onResponseError(_controller, err) { + const { res, callback, body, opaque } = this; + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (res) { + this.res = null; + queueMicrotask(() => { + util2.destroy(res.on("error", noop), err); + }); + } + if (body) { + this.body = null; + if (util2.isStream(body)) { + body.on("error", noop); + util2.destroy(body, err); } } - fetchParams.controller.connection.destroy(); + if (this.removeAbortListener) { + this.removeAbortListener(); + this.removeAbortListener = null; + } } - return response; - function dispatch({ body }) { - const url = requestCurrentURL(request); - const agent = fetchParams.controller.dispatcher; - const path = url.pathname + url.search; - const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === "?"; - return dispatchWithProtocolPreference(body); - function dispatchWithProtocolPreference(body2, allowH2) { - return new Promise((resolve, reject) => agent.dispatch( - { - path: hasTrailingQuestionMark ? `${path}?` : path, - origin: url.origin, - method: request.method, - body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body2, - headers: request.headersList.entries, - maxRedirections: 0, - upgrade: request.mode === "websocket" ? "websocket" : void 0, - ...allowH2 === false ? { allowH2 } : null - }, - { - body: null, - abort: null, - onRequestStart(controller) { - const { connection } = fetchParams.controller; - timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(void 0, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability); - const abort = (reason) => controller.abort(reason); - if (connection.destroyed) { - abort(new DOMException("The operation was aborted.", "AbortError")); - } else { - fetchParams.controller.on("terminated", abort); - this.abort = connection.abort = abort; - } - timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); - }, - onResponseStarted() { - timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); - }, - onResponseStart(controller, status, _headers, statusText) { - if (status < 200) { - return; - } - const rawHeaders = controller?.rawHeaders ?? []; - const headersList = new HeadersList(); - for (let i = 0; i < rawHeaders.length; i += 2) { - const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]); - const value = rawHeaders[i + 1]; - if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) { - for (const val of value) { - headersList.append(nameStr, val.toString("latin1"), true); - } - } else { - headersList.append(nameStr, value.toString("latin1"), true); - } - } - const location = headersList.get("location", true); - this.body = new Readable({ read: () => controller.resume() }); - const willFollow = location && request.redirect === "follow" && redirectStatusSet.has(status); - const decoders = []; - if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { - const contentEncoding = headersList.get("content-encoding", true); - const codings = contentEncoding ? contentEncoding.toLowerCase().split(",") : []; - const maxContentEncodings = 5; - if (codings.length > maxContentEncodings) { - reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)); - return; - } - for (let i = codings.length - 1; i >= 0; --i) { - const coding = codings[i].trim(); - if (coding === "x-gzip" || coding === "gzip") { - decoders.push(zlib.createGunzip({ - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH - })); - } else if (coding === "deflate") { - decoders.push(createInflate({ - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH - })); - } else if (coding === "br") { - decoders.push(zlib.createBrotliDecompress({ - flush: zlib.constants.BROTLI_OPERATION_FLUSH, - finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH - })); - } else if (coding === "zstd") { - decoders.push(zlib.createZstdDecompress({ - flush: zlib.constants.ZSTD_e_continue, - finishFlush: zlib.constants.ZSTD_e_end - })); - } else { - decoders.length = 0; - break; - } - } - } - const onError = (err) => this.onResponseError(controller, err); - resolve({ - status, - statusText, - headersList, - body: decoders.length ? pipeline(this.body, ...decoders, (err) => { - if (err) { - this.onResponseError(controller, err); - } - }).on("error", onError) : this.body.on("error", onError) - }); - }, - onResponseData(controller, chunk) { - if (fetchParams.controller.dump) { - return; - } - const bytes = chunk; - timingInfo.encodedBodySize += bytes.byteLength; - if (this.body.push(bytes) === false) { - controller.pause(); - } - }, - onResponseEnd() { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - fetchParams.controller.ended = true; - this.body?.push(null); - }, - onResponseError(_controller, error) { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - if (request.mode === "websocket" && allowH2 !== false && error?.code === "UND_ERR_INFO" && error?.message === "HTTP/2: Extended CONNECT protocol not supported by server") { - resolve(dispatchWithProtocolPreference(body2, false)); - return; - } - this.body?.destroy(error); - fetchParams.controller.terminate(error); - reject(error); - }, - onRequestUpgrade(controller, status, _headers, socket) { - if (socket.session != null && status !== 200 || socket.session == null && status !== 101) { - return false; - } - const rawHeaders = controller?.rawHeaders ?? []; - const headersList = new HeadersList(); - for (let i = 0; i < rawHeaders.length; i += 2) { - const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]); - const value = rawHeaders[i + 1]; - if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) { - for (const val of value) { - headersList.append(nameStr, val.toString("latin1"), true); - } - } else { - headersList.append(nameStr, value.toString("latin1"), true); - } - } - resolve({ - status, - statusText: STATUS_CODES[status], - headersList, - socket - }); - return true; - } - } - )); + }; + function request(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const handler = new RequestHandler(opts, callback); + this.dispatch(opts, handler); + } catch (err) { + if (typeof callback !== "function") { + throw err; } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); } } - module.exports = { - fetch: fetch2, - Fetch, - fetching, - finalizeAndReportTiming - }; + module.exports = request; + module.exports.RequestHandler = RequestHandler; } }); -// node_modules/undici/lib/web/cache/util.js -var require_util3 = __commonJS({ - "node_modules/undici/lib/web/cache/util.js"(exports, module) { +// node_modules/undici/lib/api/abort-signal.js +var require_abort_signal = __commonJS({ + "node_modules/undici/lib/api/abort-signal.js"(exports, module) { "use strict"; - var assert8 = __require("assert"); - var { URLSerializer } = require_data_url(); - var { isValidHeaderName } = require_util2(); - function urlEquals(A, B, excludeFragment = false) { - const serializedA = URLSerializer(A, excludeFragment); - const serializedB = URLSerializer(B, excludeFragment); - return serializedA === serializedB; + var { addAbortListener } = require_util(); + var { RequestAbortedError } = require_errors(); + var kListener = /* @__PURE__ */ Symbol("kListener"); + var kSignal = /* @__PURE__ */ Symbol("kSignal"); + function abort(self) { + if (self.abort) { + self.abort(self[kSignal]?.reason); + } else { + self.reason = self[kSignal]?.reason ?? new RequestAbortedError(); + } + removeSignal(self); } - function getFieldValues(header) { - assert8(header !== null); - const values = []; - for (let value of header.split(",")) { - value = value.trim(); - if (isValidHeaderName(value)) { - values.push(value); - } + function addSignal(self, signal) { + self.reason = null; + self[kSignal] = null; + self[kListener] = null; + if (!signal) { + return; + } + if (signal.aborted) { + abort(self); + return; + } + self[kSignal] = signal; + self[kListener] = () => { + abort(self); + }; + addAbortListener(self[kSignal], self[kListener]); + } + function removeSignal(self) { + if (!self[kSignal]) { + return; } - return values; + if ("removeEventListener" in self[kSignal]) { + self[kSignal].removeEventListener("abort", self[kListener]); + } else { + self[kSignal].removeListener("abort", self[kListener]); + } + self[kSignal] = null; + self[kListener] = null; } module.exports = { - urlEquals, - getFieldValues + addSignal, + removeSignal }; } }); -// node_modules/undici/lib/web/cache/cache.js -var require_cache3 = __commonJS({ - "node_modules/undici/lib/web/cache/cache.js"(exports, module) { +// node_modules/undici/lib/api/api-stream.js +var require_api_stream = __commonJS({ + "node_modules/undici/lib/api/api-stream.js"(exports, module) { "use strict"; var assert8 = __require("assert"); - var { kConstruct } = require_symbols(); - var { urlEquals, getFieldValues } = require_util3(); - var { kEnumerableProperty, isDisturbed } = require_util(); - var { webidl } = require_webidl(); - var { cloneResponse, fromInnerResponse, getResponseState } = require_response(); - var { Request: Request2, fromInnerRequest, getRequestState } = require_request2(); - var { fetching } = require_fetch(); - var { urlIsHttpHttpsScheme, readAllBytes } = require_util2(); - var Cache = class _Cache { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list - * @type {requestResponseList} - */ - #relevantRequestResponseList; - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor(); - } - webidl.util.markAsUncloneable(this); - this.#relevantRequestResponseList = arguments[1]; - } - async match(request, options = {}) { - webidl.brandCheck(this, _Cache); - const prefix = "Cache.match"; - webidl.argumentLengthCheck(arguments, 1, prefix); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options, prefix, "options"); - const p = this.#internalMatchAll(request, options, 1); - if (p.length === 0) { - return; + var { finished: finished2 } = __require("stream"); + var { AsyncResource } = __require("async_hooks"); + var { InvalidArgumentError, InvalidReturnValueError } = require_errors(); + var util2 = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + function noop() { + } + var StreamHandler = class extends AsyncResource { + constructor(opts, factory, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); } - return p[0]; - } - async matchAll(request = void 0, options = {}) { - webidl.brandCheck(this, _Cache); - const prefix = "Cache.matchAll"; - if (request !== void 0) request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options, prefix, "options"); - return this.#internalMatchAll(request, options); - } - async add(request) { - webidl.brandCheck(this, _Cache); - const prefix = "Cache.add"; - webidl.argumentLengthCheck(arguments, 1, prefix); - request = webidl.converters.RequestInfo(request); - const requests = [request]; - const responseArrayPromise = this.addAll(requests); - return await responseArrayPromise; - } - async addAll(requests) { - webidl.brandCheck(this, _Cache); - const prefix = "Cache.addAll"; - webidl.argumentLengthCheck(arguments, 1, prefix); - const responsePromises = []; - const requestList = []; - for (let request of requests) { - if (request === void 0) { - throw webidl.errors.conversionFailed({ - prefix, - argument: "Argument 1", - types: ["undefined is not allowed"] - }); + const { signal, method, opaque, body, onInfo, responseHeaders } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - request = webidl.converters.RequestInfo(request); - if (typeof request === "string") { - continue; + if (typeof factory !== "function") { + throw new InvalidArgumentError("invalid factory"); } - const r = getRequestState(request); - if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { - throw webidl.errors.exception({ - header: prefix, - message: "Expected http/s scheme when method is not GET." - }); + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); } - } - const fetchControllers = []; - for (const request of requests) { - const r = getRequestState(new Request2(request)); - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: prefix, - message: "Expected http/s scheme." - }); + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); } - r.initiator = "fetch"; - r.destination = "subresource"; - requestList.push(r); - const responsePromise = Promise.withResolvers(); - fetchControllers.push(fetching({ - request: r, - processResponse(response) { - if (response.type === "error" || response.status === 206 || response.status < 200 || response.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "Received an invalid status code or the request failed." - })); - } else if (response.headersList.contains("vary")) { - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "invalid vary field value" - })); - for (const controller of fetchControllers) { - controller.abort(); - } - return; - } - } - } - }, - processResponseEndOfBody(response) { - if (response.aborted) { - responsePromise.reject(new DOMException("aborted", "AbortError")); - return; - } - responsePromise.resolve(response); - } - })); - responsePromises.push(responsePromise.promise); + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_STREAM"); + } catch (err) { + if (util2.isStream(body)) { + util2.destroy(body.on("error", noop), err); + } + throw err; } - const p = Promise.all(responsePromises); - const responses = await p; - const operations = []; - let index2 = 0; - for (const response of responses) { - const operation = { - type: "put", - // 7.3.2 - request: requestList[index2], - // 7.3.3 - response - // 7.3.4 - }; - operations.push(operation); - index2++; + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.factory = factory; + this.callback = callback; + this.res = null; + this.abort = null; + this.context = null; + this.controller = null; + this.trailers = null; + this.body = body; + this.onInfo = onInfo || null; + if (util2.isStream(body)) { + body.on("error", (err) => { + this.onResponseError(this.controller, err); + }); } - const cacheJobPromise = Promise.withResolvers(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e7) { - errorData = e7; + addSignal(this, signal); + } + onRequestStart(controller, context) { + if (this.reason) { + controller.abort(this.reason); + return; } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(void 0); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; + assert8(this.callback); + this.controller = controller; + this.abort = (reason) => controller.abort(reason); + this.context = context; } - async put(request, response) { - webidl.brandCheck(this, _Cache); - const prefix = "Cache.put"; - webidl.argumentLengthCheck(arguments, 2, prefix); - request = webidl.converters.RequestInfo(request); - response = webidl.converters.Response(response, prefix, "response"); - let innerRequest = null; - if (webidl.is.Request(request)) { - innerRequest = getRequestState(request); - } else { - innerRequest = getRequestState(new Request2(request)); + onResponseStart(controller, statusCode, headers, _statusMessage) { + const { factory, opaque, context, responseHeaders } = this; + const rawHeaders = controller?.rawHeaders; + const responseHeaderData = responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers: responseHeaderData }); + } + return; } - if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { - throw webidl.errors.exception({ - header: prefix, - message: "Expected an http/s scheme when method is not GET" - }); + this.factory = null; + if (factory === null) { + return; } - const innerResponse = getResponseState(response); - if (innerResponse.status === 206) { - throw webidl.errors.exception({ - header: prefix, - message: "Got 206 status" - }); + const res = this.runInAsyncScope(factory, null, { + statusCode, + headers: responseHeaderData, + opaque, + context + }); + if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { + throw new InvalidReturnValueError("expected Writable"); } - if (innerResponse.headersList.contains("vary")) { - const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - throw webidl.errors.exception({ - header: prefix, - message: "Got * vary field value" - }); - } + finished2(res, { readable: false }, (err) => { + const { callback, res: res2, opaque: opaque2, trailers, abort } = this; + this.res = null; + if (err || !res2?.readable) { + util2.destroy(res2, err); + } + this.callback = null; + this.runInAsyncScope(callback, null, err || null, { opaque: opaque2, trailers }); + if (err) { + abort(); } + }); + res.on("drain", () => controller.resume()); + this.res = res; + const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState?.needDrain; + if (needDrain === true) { + controller.pause(); } - if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { - throw webidl.errors.exception({ - header: prefix, - message: "Response body is locked or disturbed" - }); + } + onResponseData(controller, chunk) { + const { res } = this; + if (!res) { + return; } - const clonedResponse = cloneResponse(innerResponse); - const bodyReadPromise = Promise.withResolvers(); - if (innerResponse.body != null) { - const stream = innerResponse.body.stream; - const reader = stream.getReader(); - readAllBytes(reader, bodyReadPromise.resolve, bodyReadPromise.reject); - } else { - bodyReadPromise.resolve(void 0); + if (res.write(chunk) === false) { + controller.pause(); } - const operations = []; - const operation = { - type: "put", - // 14. - request: innerRequest, - // 15. - response: clonedResponse - // 16. - }; - operations.push(operation); - const bytes = await bodyReadPromise.promise; - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes; + } + onResponseEnd(_controller, trailers) { + const { res } = this; + removeSignal(this); + if (!res) { + return; } - const cacheJobPromise = Promise.withResolvers(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e7) { - errorData = e7; + if (trailers && typeof trailers === "object") { + this.trailers = trailers; } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; + res.end(); } - async delete(request, options = {}) { - webidl.brandCheck(this, _Cache); - const prefix = "Cache.delete"; - webidl.argumentLengthCheck(arguments, 1, prefix); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options, prefix, "options"); - let r = null; - if (webidl.is.Request(request)) { - r = getRequestState(request); - if (r.method !== "GET" && !options.ignoreMethod) { - return false; - } - } else { - assert8(typeof request === "string"); - r = getRequestState(new Request2(request)); + onResponseError(_controller, err) { + const { res, callback, opaque, body } = this; + removeSignal(this); + this.factory = null; + if (res) { + this.res = null; + util2.destroy(res, err); + } else if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); } - const operations = []; - const operation = { - type: "delete", - request: r, - options - }; - operations.push(operation); - const cacheJobPromise = Promise.withResolvers(); - let errorData = null; - let requestResponses; - try { - requestResponses = this.#batchCacheOperations(operations); - } catch (e7) { - errorData = e7; + if (body) { + this.body = null; + util2.destroy(body, err); } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length); - } else { - cacheJobPromise.reject(errorData); - } + } + }; + function stream(opts, factory, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data); + }); }); - return cacheJobPromise.promise; } - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys - * @param {any} request - * @param {import('../../../types/cache').CacheQueryOptions} options - * @returns {Promise} - */ - async keys(request = void 0, options = {}) { - webidl.brandCheck(this, _Cache); - const prefix = "Cache.keys"; - if (request !== void 0) request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options, prefix, "options"); - let r = null; - if (request !== void 0) { - if (webidl.is.Request(request)) { - r = getRequestState(request); - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = getRequestState(new Request2(request)); - } + try { + const handler = new StreamHandler(opts, factory, callback); + this.dispatch(opts, handler); + } catch (err) { + if (typeof callback !== "function") { + throw err; } - const promise = Promise.withResolvers(); - const requests = []; - if (request === void 0) { - for (const requestResponse of this.#relevantRequestResponseList) { - requests.push(requestResponse[0]); - } - } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - requests.push(requestResponse[0]); - } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module.exports = stream; + } +}); + +// node_modules/undici/lib/api/api-pipeline.js +var require_api_pipeline = __commonJS({ + "node_modules/undici/lib/api/api-pipeline.js"(exports, module) { + "use strict"; + var { + Readable, + Duplex, + PassThrough + } = __require("stream"); + var assert8 = __require("assert"); + var { AsyncResource } = __require("async_hooks"); + var { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = require_errors(); + var util2 = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + function noop() { + } + var kResume = /* @__PURE__ */ Symbol("resume"); + var PipelineRequest = class extends Readable { + constructor() { + super({ autoDestroy: true }); + this[kResume] = null; + } + _read() { + const { [kResume]: resume } = this; + if (resume) { + this[kResume] = null; + resume(); } - queueMicrotask(() => { - const requestList = []; - for (const request2 of requests) { - const requestObject = fromInnerRequest( - request2, - void 0, - new AbortController().signal, - "immutable" - ); - requestList.push(requestObject); - } - promise.resolve(Object.freeze(requestList)); - }); - return promise.promise; } - /** - * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm - * @param {CacheBatchOperation[]} operations - * @returns {requestResponseList} - */ - #batchCacheOperations(operations) { - const cache2 = this.#relevantRequestResponseList; - const backupCache = [...cache2]; - const addedItems = []; - const resultList = []; - try { - for (const operation of operations) { - if (operation.type !== "delete" && operation.type !== "put") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: 'operation type does not match "delete" or "put"' - }); + _destroy(err, callback) { + this._read(); + callback(err); + } + }; + var PipelineResponse = class extends Readable { + constructor(resume) { + super({ autoDestroy: true }); + this[kResume] = resume; + } + _read() { + this[kResume](); + } + _destroy(err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + callback(err); + } + }; + var PipelineHandler = class extends AsyncResource { + constructor(opts, handler) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof handler !== "function") { + throw new InvalidArgumentError("invalid handler"); + } + const { signal, method, opaque, onInfo, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_PIPELINE"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.handler = handler; + this.abort = null; + this.context = null; + this.onInfo = onInfo || null; + this.req = new PipelineRequest().on("error", noop); + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this; + if (body?.resume) { + body.resume(); } - if (operation.type === "delete" && operation.response != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "delete operation should not have an associated response" - }); + }, + write: (chunk, encoding, callback) => { + const { req } = this; + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback(); + } else { + req[kResume] = callback; } - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException("???", "InvalidStateError"); + }, + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this; + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError(); } - let requestResponses; - if (operation.type === "delete") { - requestResponses = this.#queryCache(operation.request, operation.options); - if (requestResponses.length === 0) { - return []; - } - for (const requestResponse of requestResponses) { - const idx = cache2.indexOf(requestResponse); - assert8(idx !== -1); - cache2.splice(idx, 1); - } - } else if (operation.type === "put") { - if (operation.response == null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "put operation should have an associated response" - }); - } - const r = operation.request; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "expected http or https scheme" - }); - } - if (r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "not get method" - }); - } - if (operation.options != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "options must not be defined" - }); - } - requestResponses = this.#queryCache(operation.request); - for (const requestResponse of requestResponses) { - const idx = cache2.indexOf(requestResponse); - assert8(idx !== -1); - cache2.splice(idx, 1); - } - cache2.push([operation.request, operation.response]); - addedItems.push([operation.request, operation.response]); + if (abort && err) { + abort(); } - resultList.push([operation.request, operation.response]); + util2.destroy(body, err); + util2.destroy(req, err); + util2.destroy(res, err); + removeSignal(this); + callback(err); } - return resultList; - } catch (e7) { - this.#relevantRequestResponseList.length = 0; - this.#relevantRequestResponseList = backupCache; - throw e7; - } + }).on("prefinish", () => { + const { req } = this; + req.push(null); + }); + this.res = null; + addSignal(this, signal); } - /** - * @see https://w3c.github.io/ServiceWorker/#query-cache - * @param {any} requestQuery - * @param {import('../../../types/cache').CacheQueryOptions} options - * @param {requestResponseList} targetStorage - * @returns {requestResponseList} - */ - #queryCache(requestQuery, options, targetStorage) { - const resultList = []; - const storage = targetStorage ?? this.#relevantRequestResponseList; - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse; - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { - resultList.push(requestResponse); - } + onRequestStart(controller, context) { + const { res } = this; + if (this.reason) { + controller.abort(this.reason); + return; } - return resultList; + assert8(!res, "pipeline cannot be retried"); + this.abort = (reason) => controller.abort(reason); + this.context = context; } - /** - * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm - * @param {any} requestQuery - * @param {any} request - * @param {any | null} response - * @param {import('../../../types/cache').CacheQueryOptions | undefined} options - * @returns {boolean} - */ - #requestMatchesCachedItem(requestQuery, request, response = null, options) { - const queryURL = new URL(requestQuery.url); - const cachedURL = new URL(request.url); - if (options?.ignoreSearch) { - cachedURL.search = ""; - queryURL.search = ""; + onResponseStart(controller, statusCode, headers, _statusMessage) { + const { opaque, handler, context } = this; + if (statusCode < 200) { + if (this.onInfo) { + const rawHeaders = controller?.rawHeaders; + const responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; + this.onInfo({ statusCode, headers: responseHeaders }); + } + return; } - if (!urlEquals(queryURL, cachedURL, true)) { - return false; + this.res = new PipelineResponse(() => controller.resume()); + let body; + try { + this.handler = null; + const rawHeaders = controller?.rawHeaders; + const responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; + body = this.runInAsyncScope(handler, null, { + statusCode, + headers: responseHeaders, + opaque, + body: this.res, + context + }); + } catch (err) { + this.res.on("error", noop); + throw err; } - if (response == null || options?.ignoreVary || !response.headersList.contains("vary")) { - return true; + if (!body || typeof body.on !== "function") { + throw new InvalidReturnValueError("expected Readable"); } - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - return false; + body.on("data", (chunk) => { + const { ret, body: body2 } = this; + if (!ret.push(chunk) && body2.pause) { + body2.pause(); } - const requestValue = request.headersList.get(fieldValue); - const queryValue = requestQuery.headersList.get(fieldValue); - if (requestValue !== queryValue) { - return false; + }).on("error", (err) => { + const { ret } = this; + util2.destroy(ret, err); + }).on("end", () => { + const { ret } = this; + ret.push(null); + }).on("close", () => { + const { ret } = this; + if (!ret._readableState.ended) { + util2.destroy(ret, new RequestAbortedError()); } + }); + this.body = body; + } + onResponseData(controller, chunk) { + const { res } = this; + if (res.push(chunk) === false) { + controller.pause(); } - return true; } - #internalMatchAll(request, options, maxResponses = Infinity) { - let r = null; - if (request !== void 0) { - if (webidl.is.Request(request)) { - r = getRequestState(request); - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = getRequestState(new Request2(request)); - } + onResponseEnd(_controller, _trailers) { + const { res } = this; + res.push(null); + } + onResponseError(_controller, err) { + const { ret } = this; + this.handler = null; + util2.destroy(ret, err); + } + }; + function pipeline(opts, handler) { + try { + const pipelineHandler = new PipelineHandler(opts, handler); + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); + return pipelineHandler.ret; + } catch (err) { + return new PassThrough().destroy(err); + } + } + module.exports = pipeline; + } +}); + +// node_modules/undici/lib/api/api-upgrade.js +var require_api_upgrade = __commonJS({ + "node_modules/undici/lib/api/api-upgrade.js"(exports, module) { + "use strict"; + var { InvalidArgumentError, SocketError } = require_errors(); + var { AsyncResource } = __require("async_hooks"); + var assert8 = __require("assert"); + var util2 = require_util(); + var { kHTTP2Stream } = require_symbols(); + var { addSignal, removeSignal } = require_abort_signal(); + var UpgradeHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); } - const responses = []; - if (request === void 0) { - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]); - } - } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]); - } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - const responseList = []; - for (const response of responses) { - const responseObject = fromInnerResponse(cloneResponse(response), "immutable"); - responseList.push(responseObject); - if (responseList.length >= maxResponses) { - break; - } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); } - return Object.freeze(responseList); + super("UNDICI_UPGRADE"); + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.abort = null; + this.context = null; + addSignal(this, signal); } - }; - Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: "Cache", - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - var cacheQueryOptionConverters = [ - { - key: "ignoreSearch", - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: "ignoreMethod", - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: "ignoreVary", - converter: webidl.converters.boolean, - defaultValue: () => false + onRequestStart(controller, context) { + if (this.reason) { + controller.abort(this.reason); + return; + } + assert8(this.callback); + this.abort = (reason) => controller.abort(reason); + this.context = context; } - ]; - webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); - webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: "cacheName", - converter: webidl.converters.DOMString + onResponseStart() { + throw new SocketError("bad upgrade", null); + } + onRequestUpgrade(controller, statusCode, headers, socket) { + assert8(socket[kHTTP2Stream] === true ? statusCode === 200 : statusCode === 101); + const { callback, opaque, context } = this; + removeSignal(this); + this.callback = null; + const rawHeaders = controller?.rawHeaders; + const responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; + this.runInAsyncScope(callback, null, null, { + headers: responseHeaders, + socket, + opaque, + context + }); + } + onResponseError(_controller, err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } } - ]); - webidl.converters.Response = webidl.interfaceConverter( - webidl.is.Response, - "Response" - ); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.RequestInfo - ); - module.exports = { - Cache }; + function upgrade(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const upgradeHandler = new UpgradeHandler(opts, callback); + const upgradeOpts = { + ...opts, + method: opts.method || "GET", + upgrade: opts.protocol || "Websocket" + }; + this.dispatch(upgradeOpts, upgradeHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module.exports = upgrade; } }); -// node_modules/undici/lib/web/cache/cachestorage.js -var require_cachestorage = __commonJS({ - "node_modules/undici/lib/web/cache/cachestorage.js"(exports, module) { +// node_modules/undici/lib/api/api-connect.js +var require_api_connect = __commonJS({ + "node_modules/undici/lib/api/api-connect.js"(exports, module) { "use strict"; - var { Cache } = require_cache3(); - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - var { kConstruct } = require_symbols(); - var CacheStorage = class _CacheStorage { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map - * @type {Map controller.abort(reason); + this.context = context; + } + onResponseStart() { + throw new SocketError("bad connect", null); + } + onRequestUpgrade(controller, statusCode, headers, socket) { + const { callback, opaque, context } = this; + removeSignal(this); + this.callback = null; + let responseHeaders = headers; + const rawHeaders = controller?.rawHeaders; + if (responseHeaders != null) { + responseHeaders = this.responseHeaders === "raw" ? Array.isArray(rawHeaders) ? util2.parseRawHeaders(rawHeaders) : [] : headers; + } + this.runInAsyncScope(callback, null, null, { + statusCode, + headers: responseHeaders, + socket, + opaque, + context + }); + } + onResponseError(_controller, err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); } } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-has - * @param {string} cacheName - * @returns {Promise} - */ - async has(cacheName) { - webidl.brandCheck(this, _CacheStorage); - const prefix = "CacheStorage.has"; - webidl.argumentLengthCheck(arguments, 1, prefix); - cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); - return this.#caches.has(cacheName); + }; + function connect(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); } - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open - * @param {string} cacheName - * @returns {Promise} - */ - async open(cacheName) { - webidl.brandCheck(this, _CacheStorage); - const prefix = "CacheStorage.open"; - webidl.argumentLengthCheck(arguments, 1, prefix); - cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); - if (this.#caches.has(cacheName)) { - const cache3 = this.#caches.get(cacheName); - return new Cache(kConstruct, cache3); + try { + const connectHandler = new ConnectHandler(opts, callback); + const connectOptions = { ...opts, method: "CONNECT" }; + this.dispatch(connectOptions, connectHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; } - const cache2 = []; - this.#caches.set(cacheName, cache2); - return new Cache(kConstruct, cache2); + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete - * @param {string} cacheName - * @returns {Promise} - */ - async delete(cacheName) { - webidl.brandCheck(this, _CacheStorage); - const prefix = "CacheStorage.delete"; - webidl.argumentLengthCheck(arguments, 1, prefix); - cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); - return this.#caches.delete(cacheName); + } + module.exports = connect; + } +}); + +// node_modules/undici/lib/api/index.js +var require_api = __commonJS({ + "node_modules/undici/lib/api/index.js"(exports, module) { + "use strict"; + module.exports.request = require_api_request(); + module.exports.stream = require_api_stream(); + module.exports.pipeline = require_api_pipeline(); + module.exports.upgrade = require_api_upgrade(); + module.exports.connect = require_api_connect(); + } +}); + +// node_modules/undici/lib/mock/mock-errors.js +var require_mock_errors = __commonJS({ + "node_modules/undici/lib/mock/mock-errors.js"(exports, module) { + "use strict"; + var { UndiciError } = require_errors(); + var kMockNotMatchedError = /* @__PURE__ */ Symbol.for("undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED"); + var MockNotMatchedError = class extends UndiciError { + constructor(message) { + super(message); + this.name = "MockNotMatchedError"; + this.message = message || "The request does not match any registered mock dispatches"; + this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {Promise} - */ - async keys() { - webidl.brandCheck(this, _CacheStorage); - const keys = this.#caches.keys(); - return [...keys]; + static [Symbol.hasInstance](instance) { + return instance && instance[kMockNotMatchedError] === true; + } + get [kMockNotMatchedError]() { + return true; } }; - Object.defineProperties(CacheStorage.prototype, { - [Symbol.toStringTag]: { - value: "CacheStorage", - configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); module.exports = { - CacheStorage + MockNotMatchedError }; } }); -// node_modules/undici/lib/web/cookies/constants.js -var require_constants5 = __commonJS({ - "node_modules/undici/lib/web/cookies/constants.js"(exports, module) { +// node_modules/undici/lib/mock/mock-symbols.js +var require_mock_symbols = __commonJS({ + "node_modules/undici/lib/mock/mock-symbols.js"(exports, module) { "use strict"; - var maxAttributeValueSize = 1024; - var maxNameValuePairSize = 4096; module.exports = { - maxAttributeValueSize, - maxNameValuePairSize + kAgent: /* @__PURE__ */ Symbol("agent"), + kOptions: /* @__PURE__ */ Symbol("options"), + kFactory: /* @__PURE__ */ Symbol("factory"), + kDispatches: /* @__PURE__ */ Symbol("dispatches"), + kDispatchKey: /* @__PURE__ */ Symbol("dispatch key"), + kDefaultHeaders: /* @__PURE__ */ Symbol("default headers"), + kDefaultTrailers: /* @__PURE__ */ Symbol("default trailers"), + kContentLength: /* @__PURE__ */ Symbol("content length"), + kMockAgent: /* @__PURE__ */ Symbol("mock agent"), + kMockAgentSet: /* @__PURE__ */ Symbol("mock agent set"), + kMockAgentGet: /* @__PURE__ */ Symbol("mock agent get"), + kMockDispatch: /* @__PURE__ */ Symbol("mock dispatch"), + kClose: /* @__PURE__ */ Symbol("close"), + kOriginalClose: /* @__PURE__ */ Symbol("original agent close"), + kOriginalDispatch: /* @__PURE__ */ Symbol("original dispatch"), + kOrigin: /* @__PURE__ */ Symbol("origin"), + kIsMockActive: /* @__PURE__ */ Symbol("is mock active"), + kNetConnect: /* @__PURE__ */ Symbol("net connect"), + kGetNetConnect: /* @__PURE__ */ Symbol("get net connect"), + kConnected: /* @__PURE__ */ Symbol("connected"), + kIgnoreTrailingSlash: /* @__PURE__ */ Symbol("ignore trailing slash"), + kMockAgentMockCallHistoryInstance: /* @__PURE__ */ Symbol("mock agent mock call history name"), + kMockAgentRegisterCallHistory: /* @__PURE__ */ Symbol("mock agent register mock call history"), + kMockAgentAddCallHistoryLog: /* @__PURE__ */ Symbol("mock agent add call history log"), + kMockAgentIsCallHistoryEnabled: /* @__PURE__ */ Symbol("mock agent is call history enabled"), + kMockAgentAcceptsNonStandardSearchParameters: /* @__PURE__ */ Symbol("mock agent accepts non standard search parameters"), + kMockCallHistoryAddLog: /* @__PURE__ */ Symbol("mock call history add log"), + kTotalDispatchCount: /* @__PURE__ */ Symbol("total dispatch count") }; } }); -// node_modules/undici/lib/web/cookies/util.js -var require_util4 = __commonJS({ - "node_modules/undici/lib/web/cookies/util.js"(exports, module) { +// node_modules/undici/lib/mock/mock-utils.js +var require_mock_utils = __commonJS({ + "node_modules/undici/lib/mock/mock-utils.js"(exports, module) { "use strict"; - function isCTLExcludingHtab(value) { - for (let i = 0; i < value.length; ++i) { - const code = value.charCodeAt(i); - if (code >= 0 && code <= 8 || code >= 10 && code <= 31 || code === 127) { - return true; - } + var { MockNotMatchedError } = require_mock_errors(); + var { + kDispatches, + kMockAgent, + kOriginalDispatch, + kOrigin, + kGetNetConnect, + kTotalDispatchCount + } = require_mock_symbols(); + var { serializePathWithQuery, parseHeaders } = require_util(); + var { STATUS_CODES } = __require("http"); + var { + types: { + isPromise + } + } = __require("util"); + var { InvalidArgumentError } = require_errors(); + function matchValue(match, value) { + if (typeof match === "string") { + return match === value; + } + if (match instanceof RegExp) { + return match.test(value); + } + if (typeof match === "function") { + return match(value) === true; } return false; } - function validateCookieName(name) { - for (let i = 0; i < name.length; ++i) { - const code = name.charCodeAt(i); - if (code < 33 || // exclude CTLs (0-31), SP and HT - code > 126 || // exclude non-ascii and DEL - code === 34 || // " - code === 40 || // ( - code === 41 || // ) - code === 60 || // < - code === 62 || // > - code === 64 || // @ - code === 44 || // , - code === 59 || // ; - code === 58 || // : - code === 92 || // \ - code === 47 || // / - code === 91 || // [ - code === 93 || // ] - code === 63 || // ? - code === 61 || // = - code === 123 || // { - code === 125) { - throw new Error("Invalid cookie name"); + function lowerCaseEntries(headers) { + return Object.fromEntries( + Object.entries(headers).map(([headerName, headerValue]) => { + return [headerName.toLocaleLowerCase(), headerValue]; + }) + ); + } + function getHeaderByName(headers, key) { + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { + return headers[i + 1]; + } } + return void 0; + } else if (typeof headers.get === "function") { + return headers.get(key); + } else { + return lowerCaseEntries(headers)[key.toLocaleLowerCase()]; } } - function validateCookieValue(value) { - let len = value.length; - let i = 0; - if (value[0] === '"') { - if (len === 1 || value[len - 1] !== '"') { - throw new Error("Invalid cookie value"); + function buildHeadersFromArray(headers) { + const clone = headers.slice(); + const entries = []; + for (let index2 = 0; index2 < clone.length; index2 += 2) { + entries.push([clone[index2], clone[index2 + 1]]); + } + return Object.fromEntries(entries); + } + function matchHeaders(mockDispatch2, headers) { + if (typeof mockDispatch2.headers === "function") { + if (Array.isArray(headers)) { + headers = buildHeadersFromArray(headers); } - --len; - ++i; + return mockDispatch2.headers(headers ? lowerCaseEntries(headers) : {}); } - while (i < len) { - const code = value.charCodeAt(i++); - if (code < 33 || // exclude CTLs (0-31) - code > 126 || // non-ascii and DEL (127) - code === 34 || // " - code === 44 || // , - code === 59 || // ; - code === 92) { - throw new Error("Invalid cookie value"); + if (typeof mockDispatch2.headers === "undefined") { + return true; + } + if (typeof headers !== "object" || typeof mockDispatch2.headers !== "object") { + return false; + } + for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { + const headerValue = getHeaderByName(headers, matchHeaderName); + if (!matchValue(matchHeaderValue, headerValue)) { + return false; } } + return true; } - function validateCookiePath(path) { - for (let i = 0; i < path.length; ++i) { - const code = path.charCodeAt(i); - if (code < 32 || // exclude CTLs (0-31) - code === 127 || // DEL - code === 59) { - throw new Error("Invalid cookie path"); + function normalizeSearchParams(query) { + if (typeof query !== "string") { + return query; + } + const originalQp = new URLSearchParams(query); + const normalizedQp = new URLSearchParams(); + for (let [key, value] of originalQp.entries()) { + key = key.replace("[]", ""); + const valueRepresentsString = /^(['"]).*\1$/.test(value); + if (valueRepresentsString) { + normalizedQp.append(key, value); + continue; + } + if (value.includes(",")) { + const values = value.split(","); + for (const v of values) { + normalizedQp.append(key, v); + } + continue; + } + normalizedQp.append(key, value); + } + return normalizedQp; + } + function safeUrl(path) { + if (typeof path !== "string") { + return path; + } + const pathSegments = path.split("?", 3); + if (pathSegments.length !== 2) { + return path; + } + const qp = new URLSearchParams(pathSegments.pop()); + qp.sort(); + return [...pathSegments, qp.toString()].join("?"); + } + function matchKey(mockDispatch2, { path, method, body, headers }) { + const pathMatch = matchValue(mockDispatch2.path, path); + const methodMatch = matchValue(mockDispatch2.method, method); + const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body) : true; + const headersMatch = matchHeaders(mockDispatch2, headers); + return pathMatch && methodMatch && bodyMatch && headersMatch; + } + function getResponseData(data) { + if (Buffer.isBuffer(data)) { + return data; + } else if (data instanceof Uint8Array) { + return data; + } else if (data instanceof ArrayBuffer) { + return data; + } else if (typeof data === "object") { + return JSON.stringify(data); + } else if (data) { + return data.toString(); + } else { + return ""; + } + } + function getMockDispatch(mockDispatches, key) { + const basePath = key.query ? serializePathWithQuery(key.path, key.query) : key.path; + const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; + const resolvedPathWithoutTrailingSlash = removeTrailingSlash(resolvedPath); + let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path, ignoreTrailingSlash }) => { + return ignoreTrailingSlash ? matchValue(removeTrailingSlash(safeUrl(path)), resolvedPathWithoutTrailingSlash) : matchValue(safeUrl(path), resolvedPath); + }); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== "undefined" ? matchValue(body, key.body) : true); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`); + } + matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); + if (matchedMockDispatches.length === 0) { + const headers = typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers; + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`); + } + return matchedMockDispatches[0]; + } + function addMockDispatch(mockDispatches, key, data, opts) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false, ...opts }; + const replyData = typeof data === "function" ? { callback: data } : { ...data }; + const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; + mockDispatches.push(newMockDispatch); + mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1; + return newMockDispatch; + } + function deleteMockDispatch(mockDispatches, key) { + const index2 = mockDispatches.findIndex((dispatch) => { + if (!dispatch.consumed) { + return false; + } + return matchKey(dispatch, key); + }); + if (index2 !== -1) { + mockDispatches.splice(index2, 1); + } + } + function removeTrailingSlash(path) { + while (path.endsWith("/")) { + path = path.slice(0, -1); + } + if (path.length === 0) { + path = "/"; + } + return path; + } + function buildKey(opts) { + const { path, method, body, headers, query } = opts; + return { + path, + method, + body, + headers, + query + }; + } + function generateKeyValues(data) { + const keys = Object.keys(data); + const result = []; + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + const value = data[key]; + const name = Buffer.from(`${key}`); + if (Array.isArray(value)) { + for (let j = 0; j < value.length; ++j) { + result.push(name, Buffer.from(`${value[j]}`)); + } + } else { + result.push(name, Buffer.from(`${value}`)); + } + } + return result; + } + function getStatusText(statusCode) { + return STATUS_CODES[statusCode] || "unknown"; + } + async function getResponse(body) { + const buffers = []; + for await (const data of body) { + buffers.push(data); + } + return Buffer.concat(buffers).toString("utf8"); + } + function mockDispatch(opts, handler) { + const key = buildKey(opts); + const mockDispatch2 = getMockDispatch(this[kDispatches], key); + mockDispatch2.timesInvoked++; + if (mockDispatch2.data.callback) { + mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; + } + const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch2; + const { timesInvoked, times } = mockDispatch2; + mockDispatch2.consumed = !persist && timesInvoked >= times; + mockDispatch2.pending = timesInvoked < times; + if (error !== null) { + deleteMockDispatch(this[kDispatches], key); + handler.onResponseError(null, error); + return true; + } + let aborted = false; + let timer = null; + const controller = { + paused: false, + rawHeaders: null, + rawTrailers: null, + pause() { + this.paused = true; + }, + resume() { + this.paused = false; + }, + abort: (reason) => { + if (aborted) { + return; + } + aborted = true; + if (timer !== null) { + clearTimeout(timer); + timer = null; + } + handler.onResponseError?.(controller, reason); + } + }; + handler.onRequestStart?.(controller, null); + if (typeof delay === "number" && delay > 0) { + timer = setTimeout(() => { + timer = null; + handleReply(this[kDispatches]); + }, delay); + } else { + handleReply(this[kDispatches]); + } + function handleReply(mockDispatches, _data = data) { + if (aborted) { + return; + } + const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; + const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; + if (isPromise(body)) { + return body.then((newData) => handleReply(mockDispatches, newData)); + } + if (aborted) { + return; + } + const responseData = getResponseData(body); + const responseHeaders = generateKeyValues(headers); + const responseTrailers = generateKeyValues(trailers); + controller.rawHeaders = responseHeaders; + controller.rawTrailers = responseTrailers; + handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode)); + handler.onResponseData?.(controller, Buffer.from(responseData)); + handler.onResponseEnd?.(controller, parseHeaders(responseTrailers)); + deleteMockDispatch(mockDispatches, key); + } + return true; + } + function buildMockDispatch() { + const agent = this[kMockAgent]; + const origin = this[kOrigin]; + const originalDispatch = this[kOriginalDispatch]; + return function dispatch(opts, handler) { + if (agent.isMockActive) { + try { + mockDispatch.call(this, opts, handler); + } catch (error) { + if (error.code === "UND_MOCK_ERR_MOCK_NOT_MATCHED") { + const netConnect = agent[kGetNetConnect](); + const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length; + const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length; + const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`; + if (netConnect === false) { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`); + } + if (checkNetConnect(netConnect, origin)) { + originalDispatch.call(this, opts, handler); + } else { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`); + } + } else { + throw error; + } + } + } else { + originalDispatch.call(this, opts, handler); } - } + }; } - function validateCookieDomain(domain) { - if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { - throw new Error("Invalid cookie domain"); + function checkNetConnect(netConnect, origin) { + const url = new URL(origin); + if (netConnect === true) { + return true; + } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { + return true; } + return false; } - var IMFDays = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ]; - var IMFMonths = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ]; - var IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, "0")); - function toIMFDate(date) { - if (typeof date === "number") { - date = new Date(date); + function normalizeOrigin(origin) { + if (typeof origin !== "string" && !(origin instanceof URL)) { + return origin; } - return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`; - } - function validateCookieMaxAge(maxAge) { - if (maxAge < 0) { - throw new Error("Invalid cookie max-age"); + if (origin instanceof URL) { + return origin.origin; } + return origin.toLowerCase(); } - function stringify4(cookie) { - if (cookie.name.length === 0) { - return null; - } - validateCookieName(cookie.name); - validateCookieValue(cookie.value); - const out = [`${cookie.name}=${cookie.value}`]; - if (cookie.name.startsWith("__Secure-")) { - cookie.secure = true; - } - if (cookie.name.startsWith("__Host-")) { - cookie.secure = true; - cookie.domain = null; - cookie.path = "/"; - } - if (cookie.secure) { - out.push("Secure"); - } - if (cookie.httpOnly) { - out.push("HttpOnly"); - } - if (typeof cookie.maxAge === "number") { - validateCookieMaxAge(cookie.maxAge); - out.push(`Max-Age=${cookie.maxAge}`); - } - if (cookie.domain) { - validateCookieDomain(cookie.domain); - out.push(`Domain=${cookie.domain}`); - } - if (cookie.path) { - validateCookiePath(cookie.path); - out.push(`Path=${cookie.path}`); - } - if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { - out.push(`Expires=${toIMFDate(cookie.expires)}`); + function buildAndValidateMockOptions(opts) { + const { agent, ...mockOptions } = opts; + if ("enableCallHistory" in mockOptions && typeof mockOptions.enableCallHistory !== "boolean") { + throw new InvalidArgumentError("options.enableCallHistory must to be a boolean"); } - if (cookie.sameSite) { - out.push(`SameSite=${cookie.sameSite}`); + if ("acceptNonStandardSearchParameters" in mockOptions && typeof mockOptions.acceptNonStandardSearchParameters !== "boolean") { + throw new InvalidArgumentError("options.acceptNonStandardSearchParameters must to be a boolean"); } - for (const part of cookie.unparsed) { - if (!part.includes("=")) { - throw new Error("Invalid unparsed"); - } - const [key, ...value] = part.split("="); - out.push(`${key.trim()}=${value.join("=")}`); + if ("ignoreTrailingSlash" in mockOptions && typeof mockOptions.ignoreTrailingSlash !== "boolean") { + throw new InvalidArgumentError("options.ignoreTrailingSlash must to be a boolean"); } - return out.join("; "); + return mockOptions; } module.exports = { - isCTLExcludingHtab, - validateCookieName, - validateCookiePath, - validateCookieValue, - toIMFDate, - stringify: stringify4 + getResponseData, + getMockDispatch, + addMockDispatch, + deleteMockDispatch, + buildKey, + generateKeyValues, + matchValue, + getResponse, + getStatusText, + mockDispatch, + buildMockDispatch, + checkNetConnect, + buildAndValidateMockOptions, + getHeaderByName, + buildHeadersFromArray, + normalizeSearchParams, + normalizeOrigin }; } }); -// node_modules/undici/lib/web/cookies/parse.js -var require_parse = __commonJS({ - "node_modules/undici/lib/web/cookies/parse.js"(exports, module) { +// node_modules/undici/lib/mock/mock-interceptor.js +var require_mock_interceptor = __commonJS({ + "node_modules/undici/lib/mock/mock-interceptor.js"(exports, module) { "use strict"; - var { collectASequenceOfCodePointsFast } = require_infra(); - var { maxNameValuePairSize, maxAttributeValueSize } = require_constants5(); - var { isCTLExcludingHtab } = require_util4(); - var assert8 = __require("assert"); - var { unescape: qsUnescape } = __require("querystring"); - function parseSetCookie(header) { - if (isCTLExcludingHtab(header)) { - return null; - } - let nameValuePair = ""; - let unparsedAttributes = ""; - let name = ""; - let value = ""; - if (header.includes(";")) { - const position = { position: 0 }; - nameValuePair = collectASequenceOfCodePointsFast(";", header, position); - unparsedAttributes = header.slice(position.position); - } else { - nameValuePair = header; - } - if (!nameValuePair.includes("=")) { - value = nameValuePair; - } else { - const position = { position: 0 }; - name = collectASequenceOfCodePointsFast( - "=", - nameValuePair, - position - ); - value = nameValuePair.slice(position.position + 1); - } - name = name.trim(); - value = value.trim(); - if (name.length + value.length > maxNameValuePairSize) { - return null; - } - return { - name, - value: qsUnescape(value), - ...parseUnparsedAttributes(unparsedAttributes) - }; - } - function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { - if (unparsedAttributes.length === 0) { - return cookieAttributeList; - } - assert8(unparsedAttributes[0] === ";"); - unparsedAttributes = unparsedAttributes.slice(1); - let cookieAv = ""; - if (unparsedAttributes.includes(";")) { - cookieAv = collectASequenceOfCodePointsFast( - ";", - unparsedAttributes, - { position: 0 } - ); - unparsedAttributes = unparsedAttributes.slice(cookieAv.length); - } else { - cookieAv = unparsedAttributes; - unparsedAttributes = ""; + var { getResponseData, buildKey, addMockDispatch } = require_mock_utils(); + var { + kDispatches, + kDispatchKey, + kDefaultHeaders, + kDefaultTrailers, + kContentLength, + kMockDispatch, + kIgnoreTrailingSlash + } = require_mock_symbols(); + var { InvalidArgumentError } = require_errors(); + var { serializePathWithQuery } = require_util(); + var MockScope = class { + constructor(mockDispatch) { + this[kMockDispatch] = mockDispatch; } - let attributeName = ""; - let attributeValue = ""; - if (cookieAv.includes("=")) { - const position = { position: 0 }; - attributeName = collectASequenceOfCodePointsFast( - "=", - cookieAv, - position - ); - attributeValue = cookieAv.slice(position.position + 1); - } else { - attributeName = cookieAv; + /** + * Delay a reply by a set amount in ms. + */ + delay(waitInMs) { + if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { + throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); + } + this[kMockDispatch].delay = waitInMs; + return this; } - attributeName = attributeName.trim(); - attributeValue = attributeValue.trim(); - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + /** + * For a defined reply, never mark as consumed. + */ + persist() { + this[kMockDispatch].persist = true; + return this; } - const attributeNameLowercase = attributeName.toLowerCase(); - if (attributeNameLowercase === "expires") { - const expiryTime = new Date(attributeValue); - cookieAttributeList.expires = expiryTime; - } else if (attributeNameLowercase === "max-age") { - const charCode = attributeValue.charCodeAt(0); - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + /** + * Allow one to define a reply for a set amount of matching requests. + */ + times(repeatTimes) { + if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { + throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); } - const deltaSeconds = Number(attributeValue); - cookieAttributeList.maxAge = deltaSeconds; - } else if (attributeNameLowercase === "domain") { - let cookieDomain = attributeValue; - if (cookieDomain[0] === ".") { - cookieDomain = cookieDomain.slice(1); + this[kMockDispatch].times = repeatTimes; + return this; + } + }; + var MockInterceptor = class { + constructor(opts, mockDispatches) { + if (typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object"); } - cookieDomain = cookieDomain.toLowerCase(); - cookieAttributeList.domain = cookieDomain; - } else if (attributeNameLowercase === "path") { - let cookiePath = ""; - if (attributeValue.length === 0 || attributeValue[0] !== "/") { - cookiePath = "/"; - } else { - cookiePath = attributeValue; + if (typeof opts.path === "undefined") { + throw new InvalidArgumentError("opts.path must be defined"); } - cookieAttributeList.path = cookiePath; - } else if (attributeNameLowercase === "secure") { - cookieAttributeList.secure = true; - } else if (attributeNameLowercase === "httponly") { - cookieAttributeList.httpOnly = true; - } else if (attributeNameLowercase === "samesite") { - let enforcement = "Default"; - const attributeValueLowercase = attributeValue.toLowerCase(); - if (attributeValueLowercase.includes("none")) { - enforcement = "None"; + if (typeof opts.method === "undefined") { + opts.method = "GET"; } - if (attributeValueLowercase.includes("strict")) { - enforcement = "Strict"; + if (typeof opts.path === "string") { + if (opts.query) { + opts.path = serializePathWithQuery(opts.path, opts.query); + } else { + const parsedURL = new URL(opts.path, "data://"); + opts.path = parsedURL.pathname + parsedURL.search; + } } - if (attributeValueLowercase.includes("lax")) { - enforcement = "Lax"; + if (typeof opts.method === "string") { + opts.method = opts.method.toUpperCase(); } - cookieAttributeList.sameSite = enforcement; - } else { - cookieAttributeList.unparsed ??= []; - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); - } - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - module.exports = { - parseSetCookie, - parseUnparsedAttributes - }; - } -}); - -// node_modules/undici/lib/web/cookies/index.js -var require_cookies = __commonJS({ - "node_modules/undici/lib/web/cookies/index.js"(exports, module) { - "use strict"; - var { parseSetCookie } = require_parse(); - var { stringify: stringify4 } = require_util4(); - var { webidl } = require_webidl(); - var { Headers: Headers2 } = require_headers(); - var brandChecks = webidl.brandCheckMultiple([Headers2, globalThis.Headers].filter(Boolean)); - function getCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, "getCookies"); - brandChecks(headers); - const cookie = headers.get("cookie"); - const out = {}; - if (!cookie) { - return out; + this[kDispatchKey] = buildKey(opts); + this[kDispatches] = mockDispatches; + this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false; + this[kDefaultHeaders] = {}; + this[kDefaultTrailers] = {}; + this[kContentLength] = false; } - for (const piece of cookie.split(";")) { - const [name, ...value] = piece.split("="); - out[name.trim()] = value.join("="); + createMockScopeDispatchData({ statusCode, data, responseOptions }) { + const responseData = getResponseData(data); + const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; + const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; + const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; + return { statusCode, data, headers, trailers }; } - return out; - } - function deleteCookie(headers, name, attributes) { - brandChecks(headers); - const prefix = "deleteCookie"; - webidl.argumentLengthCheck(arguments, 2, prefix); - name = webidl.converters.DOMString(name, prefix, "name"); - attributes = webidl.converters.DeleteCookieAttributes(attributes); - setCookie(headers, { - name, - value: "", - expires: /* @__PURE__ */ new Date(0), - ...attributes - }); - } - function getSetCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, "getSetCookies"); - brandChecks(headers); - const cookies = headers.getSetCookie(); - if (!cookies) { - return []; + validateReplyParameters(replyParameters) { + if (typeof replyParameters.statusCode === "undefined") { + throw new InvalidArgumentError("statusCode must be defined"); + } + if (typeof replyParameters.responseOptions !== "object" || replyParameters.responseOptions === null) { + throw new InvalidArgumentError("responseOptions must be an object"); + } } - return cookies.map((pair) => parseSetCookie(pair)); - } - function parseCookie(cookie) { - cookie = webidl.converters.DOMString(cookie); - return parseSetCookie(cookie); - } - function setCookie(headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, "setCookie"); - brandChecks(headers); - cookie = webidl.converters.Cookie(cookie); - const str = stringify4(cookie); - if (str) { - headers.append("set-cookie", str, true); + /** + * Mock an undici request with a defined reply. + */ + reply(replyOptionsCallbackOrStatusCode) { + if (typeof replyOptionsCallbackOrStatusCode === "function") { + const wrappedDefaultsCallback = (opts) => { + const resolvedData = replyOptionsCallbackOrStatusCode(opts); + if (typeof resolvedData !== "object" || resolvedData === null) { + throw new InvalidArgumentError("reply options callback must return an object"); + } + const replyParameters2 = { data: "", responseOptions: {}, ...resolvedData }; + this.validateReplyParameters(replyParameters2); + return { + ...this.createMockScopeDispatchData(replyParameters2) + }; + }; + const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); + return new MockScope(newMockDispatch2); + } + const replyParameters = { + statusCode: replyOptionsCallbackOrStatusCode, + data: arguments[1] === void 0 ? "" : arguments[1], + responseOptions: arguments[2] === void 0 ? {} : arguments[2] + }; + this.validateReplyParameters(replyParameters); + const dispatchData = this.createMockScopeDispatchData(replyParameters); + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); + return new MockScope(newMockDispatch); } - } - webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: () => null + /** + * Mock an undici request with a defined error. + */ + replyWithError(error) { + if (typeof error === "undefined") { + throw new InvalidArgumentError("error must be defined"); + } + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); + return new MockScope(newMockDispatch); } - ]); - webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: "name" - }, - { - converter: webidl.converters.DOMString, - key: "value" - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === "number") { - return webidl.converters["unsigned long long"](value); - } - return new Date(value); - }), - key: "expires", - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters["long long"]), - key: "maxAge", - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "secure", - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "httpOnly", - defaultValue: () => null - }, - { - converter: webidl.converters.USVString, - key: "sameSite", - allowedValues: ["Strict", "Lax", "None"] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: "unparsed", - defaultValue: () => [] + /** + * Set default reply headers on the interceptor for subsequent replies + */ + defaultReplyHeaders(headers) { + if (typeof headers === "undefined") { + throw new InvalidArgumentError("headers must be defined"); + } + this[kDefaultHeaders] = headers; + return this; + } + /** + * Set default reply trailers on the interceptor for subsequent replies + */ + defaultReplyTrailers(trailers) { + if (typeof trailers === "undefined") { + throw new InvalidArgumentError("trailers must be defined"); + } + this[kDefaultTrailers] = trailers; + return this; + } + /** + * Set reply content length header for replies on the interceptor + */ + replyContentLength() { + this[kContentLength] = true; + return this; } - ]); - module.exports = { - getCookies, - deleteCookie, - getSetCookies, - setCookie, - parseCookie }; + module.exports.MockInterceptor = MockInterceptor; + module.exports.MockScope = MockScope; } }); -// node_modules/undici/lib/web/websocket/events.js -var require_events = __commonJS({ - "node_modules/undici/lib/web/websocket/events.js"(exports, module) { +// node_modules/undici/lib/mock/mock-client.js +var require_mock_client = __commonJS({ + "node_modules/undici/lib/mock/mock-client.js"(exports, module) { "use strict"; - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - var { kConstruct } = require_symbols(); - var MessageEvent = class _MessageEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - if (type === kConstruct) { - super(arguments[1], arguments[2]); - webidl.util.markAsUncloneable(this); - return; + var { promisify: promisify2 } = __require("util"); + var Client = require_client(); + var { buildMockDispatch } = require_mock_utils(); + var { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected, + kIgnoreTrailingSlash + } = require_mock_symbols(); + var { MockInterceptor } = require_mock_interceptor(); + var Symbols = require_symbols(); + var { InvalidArgumentError } = require_errors(); + var MockClient = class extends Client { + constructor(origin, opts) { + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); } - const prefix = "MessageEvent constructor"; - webidl.argumentLengthCheck(arguments, 1, prefix); - type = webidl.converters.DOMString(type, prefix, "type"); - eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, "eventInitDict"); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - webidl.util.markAsUncloneable(this); + super(origin, opts); + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; } - get data() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.data; + get [Symbols.kConnected]() { + return this[kConnected]; } - get origin() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.origin; + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept(opts) { + return new MockInterceptor( + opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts }, + this[kDispatches] + ); } - get lastEventId() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.lastEventId; + cleanMocks() { + this[kDispatches] = []; } - get source() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.source; + async [kClose]() { + await promisify2(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); } - get ports() { - webidl.brandCheck(this, _MessageEvent); - if (!Object.isFrozen(this.#eventInit.ports)) { - Object.freeze(this.#eventInit.ports); + }; + module.exports = MockClient; + } +}); + +// node_modules/undici/lib/mock/mock-call-history.js +var require_mock_call_history = __commonJS({ + "node_modules/undici/lib/mock/mock-call-history.js"(exports, module) { + "use strict"; + var { kMockCallHistoryAddLog } = require_mock_symbols(); + var { InvalidArgumentError } = require_errors(); + function handleFilterCallsWithOptions(criteria, options, handler, store) { + switch (options.operator) { + case "OR": + store.push(...handler(criteria)); + return store; + case "AND": + return handler.call({ logs: store }, criteria); + default: + throw new InvalidArgumentError("options.operator must to be a case insensitive string equal to 'OR' or 'AND'"); + } + } + function buildAndValidateFilterCallsOptions(options = {}) { + const finalOptions = {}; + if ("operator" in options) { + if (typeof options.operator !== "string" || options.operator.toUpperCase() !== "OR" && options.operator.toUpperCase() !== "AND") { + throw new InvalidArgumentError("options.operator must to be a case insensitive string equal to 'OR' or 'AND'"); } - return this.#eventInit.ports; + return { + ...finalOptions, + operator: options.operator.toUpperCase() + }; } - initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { - webidl.brandCheck(this, _MessageEvent); - webidl.argumentLengthCheck(arguments, 1, "MessageEvent.initMessageEvent"); - return new _MessageEvent(type, { - bubbles, - cancelable, - data, - origin, - lastEventId, - source, - ports - }); + return finalOptions; + } + function makeFilterCalls(parameterName) { + return (parameterValue) => { + if (typeof parameterValue === "string" || parameterValue == null) { + return this.logs.filter((log) => { + return log[parameterName] === parameterValue; + }); + } + if (parameterValue instanceof RegExp) { + return this.logs.filter((log) => { + return parameterValue.test(log[parameterName]); + }); + } + throw new InvalidArgumentError(`${parameterName} parameter should be one of string, regexp, undefined or null`); + }; + } + function computeUrlWithMaybeSearchParameters(requestInit) { + try { + const url = new URL(requestInit.path, requestInit.origin); + if (url.search.length !== 0) { + return url; + } + url.search = new URLSearchParams(requestInit.query).toString(); + return url; + } catch (error) { + throw new InvalidArgumentError("An error occurred when computing MockCallHistoryLog.url", { cause: error }); } - static createFastMessageEvent(type, init) { - const messageEvent = new _MessageEvent(kConstruct, type, init); - messageEvent.#eventInit = init; - messageEvent.#eventInit.data ??= null; - messageEvent.#eventInit.origin ??= ""; - messageEvent.#eventInit.lastEventId ??= ""; - messageEvent.#eventInit.source ??= null; - messageEvent.#eventInit.ports ??= []; - return messageEvent; + } + var MockCallHistoryLog = class { + constructor(requestInit = {}) { + this.body = requestInit.body; + this.headers = requestInit.headers; + this.method = requestInit.method; + const url = computeUrlWithMaybeSearchParameters(requestInit); + this.fullUrl = url.toString(); + this.origin = url.origin; + this.path = url.pathname; + this.searchParams = Object.fromEntries(url.searchParams); + this.protocol = url.protocol; + this.host = url.host; + this.port = url.port; + this.hash = url.hash; } - }; - var { createFastMessageEvent } = MessageEvent; - delete MessageEvent.createFastMessageEvent; - var CloseEvent = class _CloseEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - const prefix = "CloseEvent constructor"; - webidl.argumentLengthCheck(arguments, 1, prefix); - type = webidl.converters.DOMString(type, prefix, "type"); - eventInitDict = webidl.converters.CloseEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - webidl.util.markAsUncloneable(this); + toMap() { + return /* @__PURE__ */ new Map( + [ + ["protocol", this.protocol], + ["host", this.host], + ["port", this.port], + ["origin", this.origin], + ["path", this.path], + ["hash", this.hash], + ["searchParams", this.searchParams], + ["fullUrl", this.fullUrl], + ["method", this.method], + ["body", this.body], + ["headers", this.headers] + ] + ); } - get wasClean() { - webidl.brandCheck(this, _CloseEvent); - return this.#eventInit.wasClean; + toString() { + const options = { betweenKeyValueSeparator: "->", betweenPairSeparator: "|" }; + let result = ""; + this.toMap().forEach((value, key) => { + if (typeof value === "string" || value === void 0 || value === null) { + result = `${result}${key}${options.betweenKeyValueSeparator}${value}${options.betweenPairSeparator}`; + } + if (typeof value === "object" && value !== null || Array.isArray(value)) { + result = `${result}${key}${options.betweenKeyValueSeparator}${JSON.stringify(value)}${options.betweenPairSeparator}`; + } + }); + return result.slice(0, -1); } - get code() { - webidl.brandCheck(this, _CloseEvent); - return this.#eventInit.code; + }; + var MockCallHistory = class { + logs = []; + calls() { + return this.logs; } - get reason() { - webidl.brandCheck(this, _CloseEvent); - return this.#eventInit.reason; + firstCall() { + return this.logs.at(0); } - }; - var ErrorEvent = class _ErrorEvent extends Event { - #eventInit; - constructor(type, eventInitDict) { - const prefix = "ErrorEvent constructor"; - webidl.argumentLengthCheck(arguments, 1, prefix); - super(type, eventInitDict); - webidl.util.markAsUncloneable(this); - type = webidl.converters.DOMString(type, prefix, "type"); - eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); - this.#eventInit = eventInitDict; + lastCall() { + return this.logs.at(-1); } - get message() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.message; + nthCall(number) { + if (typeof number !== "number") { + throw new InvalidArgumentError("nthCall must be called with a number"); + } + if (!Number.isInteger(number)) { + throw new InvalidArgumentError("nthCall must be called with an integer"); + } + if (Math.sign(number) !== 1) { + throw new InvalidArgumentError("nthCall must be called with a positive value. use firstCall or lastCall instead"); + } + return this.logs.at(number - 1); } - get filename() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.filename; + filterCalls(criteria, options) { + if (this.logs.length === 0) { + return this.logs; + } + if (typeof criteria === "function") { + return this.logs.filter(criteria); + } + if (criteria instanceof RegExp) { + return this.logs.filter((log) => { + return criteria.test(log.toString()); + }); + } + if (typeof criteria === "object" && criteria !== null) { + if (Object.keys(criteria).length === 0) { + return this.logs; + } + const finalOptions = { operator: "OR", ...buildAndValidateFilterCallsOptions(options) }; + let maybeDuplicatedLogsFiltered = []; + if ("protocol" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered); + } + if ("host" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered); + } + if ("port" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered); + } + if ("origin" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered); + } + if ("path" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered); + } + if ("hash" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered); + } + if ("fullUrl" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered); + } + if ("method" in criteria) { + maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered); + } + const uniqLogsFiltered = [...new Set(maybeDuplicatedLogsFiltered)]; + return uniqLogsFiltered; + } + throw new InvalidArgumentError("criteria parameter should be one of function, regexp, or object"); } - get lineno() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.lineno; + filterCallsByProtocol = makeFilterCalls.call(this, "protocol"); + filterCallsByHost = makeFilterCalls.call(this, "host"); + filterCallsByPort = makeFilterCalls.call(this, "port"); + filterCallsByOrigin = makeFilterCalls.call(this, "origin"); + filterCallsByPath = makeFilterCalls.call(this, "path"); + filterCallsByHash = makeFilterCalls.call(this, "hash"); + filterCallsByFullUrl = makeFilterCalls.call(this, "fullUrl"); + filterCallsByMethod = makeFilterCalls.call(this, "method"); + clear() { + this.logs = []; } - get colno() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.colno; + [kMockCallHistoryAddLog](requestInit) { + const log = new MockCallHistoryLog(requestInit); + this.logs.push(log); + return log; } - get error() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.error; + *[Symbol.iterator]() { + for (const log of this.calls()) { + yield log; + } } }; - Object.defineProperties(MessageEvent.prototype, { - [Symbol.toStringTag]: { - value: "MessageEvent", - configurable: true - }, - data: kEnumerableProperty, - origin: kEnumerableProperty, - lastEventId: kEnumerableProperty, - source: kEnumerableProperty, - ports: kEnumerableProperty, - initMessageEvent: kEnumerableProperty - }); - Object.defineProperties(CloseEvent.prototype, { - [Symbol.toStringTag]: { - value: "CloseEvent", - configurable: true - }, - reason: kEnumerableProperty, - code: kEnumerableProperty, - wasClean: kEnumerableProperty - }); - Object.defineProperties(ErrorEvent.prototype, { - [Symbol.toStringTag]: { - value: "ErrorEvent", - configurable: true - }, - message: kEnumerableProperty, - filename: kEnumerableProperty, - lineno: kEnumerableProperty, - colno: kEnumerableProperty, - error: kEnumerableProperty - }); - webidl.converters.MessagePort = webidl.interfaceConverter( - webidl.is.MessagePort, - "MessagePort" - ); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.MessagePort - ); - var eventInit = [ - { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: () => false - } - ]; - webidl.converters.MessageEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "data", - converter: webidl.converters.any, - defaultValue: () => null - }, - { - key: "origin", - converter: webidl.converters.USVString, - defaultValue: () => "" - }, - { - key: "lastEventId", - converter: webidl.converters.DOMString, - defaultValue: () => "" - }, - { - key: "source", - // Node doesn't implement WindowProxy or ServiceWorker, so the only - // valid value for source is a MessagePort. - converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: () => null - }, - { - key: "ports", - converter: webidl.converters["sequence"], - defaultValue: () => [] + module.exports.MockCallHistory = MockCallHistory; + module.exports.MockCallHistoryLog = MockCallHistoryLog; + } +}); + +// node_modules/undici/lib/mock/mock-pool.js +var require_mock_pool = __commonJS({ + "node_modules/undici/lib/mock/mock-pool.js"(exports, module) { + "use strict"; + var { promisify: promisify2 } = __require("util"); + var Pool = require_pool(); + var { buildMockDispatch } = require_mock_utils(); + var { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected, + kIgnoreTrailingSlash + } = require_mock_symbols(); + var { MockInterceptor } = require_mock_interceptor(); + var Symbols = require_symbols(); + var { InvalidArgumentError } = require_errors(); + var MockPool = class extends Pool { + constructor(origin, opts) { + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + super(origin, opts); + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; } - ]); - webidl.converters.CloseEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "wasClean", - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: "code", - converter: webidl.converters["unsigned short"], - defaultValue: () => 0 - }, - { - key: "reason", - converter: webidl.converters.USVString, - defaultValue: () => "" + get [Symbols.kConnected]() { + return this[kConnected]; } - ]); - webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "message", - converter: webidl.converters.DOMString, - defaultValue: () => "" - }, - { - key: "filename", - converter: webidl.converters.USVString, - defaultValue: () => "" - }, - { - key: "lineno", - converter: webidl.converters["unsigned long"], - defaultValue: () => 0 - }, - { - key: "colno", - converter: webidl.converters["unsigned long"], - defaultValue: () => 0 - }, - { - key: "error", - converter: webidl.converters.any + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept(opts) { + return new MockInterceptor( + opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts }, + this[kDispatches] + ); + } + cleanMocks() { + this[kDispatches] = []; + } + async [kClose]() { + await promisify2(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); } - ]); - module.exports = { - MessageEvent, - CloseEvent, - ErrorEvent, - createFastMessageEvent }; + module.exports = MockPool; } }); -// node_modules/undici/lib/web/websocket/constants.js -var require_constants6 = __commonJS({ - "node_modules/undici/lib/web/websocket/constants.js"(exports, module) { +// node_modules/undici/lib/mock/pending-interceptors-formatter.js +var require_pending_interceptors_formatter = __commonJS({ + "node_modules/undici/lib/mock/pending-interceptors-formatter.js"(exports, module) { "use strict"; - var uid2 = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - var staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - var states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 - }; - var sentCloseFrameState = { - SENT: 1, - RECEIVED: 2 - }; - var opcodes = { - CONTINUATION: 0, - TEXT: 1, - BINARY: 2, - CLOSE: 8, - PING: 9, - PONG: 10 - }; - var maxUnsigned16Bit = 65535; - var parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 - }; - var emptyBuffer = Buffer.allocUnsafe(0); - var sendHints = { - text: 1, - typedArray: 2, - arrayBuffer: 3, - blob: 4 - }; - module.exports = { - uid: uid2, - sentCloseFrameState, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer, - sendHints + var { Transform } = __require("stream"); + var { Console } = __require("console"); + var PERSISTENT = process.versions.icu ? "\u2705" : "Y "; + var NOT_PERSISTENT = process.versions.icu ? "\u274C" : "N "; + module.exports = class PendingInterceptorsFormatter { + constructor({ disableColors } = {}) { + this.transform = new Transform({ + transform(chunk, _enc, cb) { + cb(null, chunk); + } + }); + this.logger = new Console({ + stdout: this.transform, + inspectOptions: { + colors: !disableColors && !process.env.CI + } + }); + } + format(pendingInterceptors) { + const withPrettyHeaders = pendingInterceptors.map( + ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ + Method: method, + Origin: origin, + Path: path, + "Status code": statusCode, + Persistent: persist ? PERSISTENT : NOT_PERSISTENT, + Invocations: timesInvoked, + Remaining: persist ? Infinity : times - timesInvoked + }) + ); + this.logger.table(withPrettyHeaders); + return this.transform.read().toString(); + } }; } }); -// node_modules/undici/lib/web/websocket/util.js -var require_util5 = __commonJS({ - "node_modules/undici/lib/web/websocket/util.js"(exports, module) { +// node_modules/undici/lib/mock/mock-agent.js +var require_mock_agent = __commonJS({ + "node_modules/undici/lib/mock/mock-agent.js"(exports, module) { "use strict"; - var { states, opcodes } = require_constants6(); - var { isUtf8 } = __require("buffer"); - var { removeHTTPWhitespace } = require_data_url(); - var { collectASequenceOfCodePointsFast } = require_infra(); - function isConnecting(readyState) { - return readyState === states.CONNECTING; - } - function isEstablished(readyState) { - return readyState === states.OPEN; - } - function isClosing(readyState) { - return readyState === states.CLOSING; - } - function isClosed(readyState) { - return readyState === states.CLOSED; - } - function fireEvent(e7, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { - const event = eventFactory(e7, eventInitDict); - target.dispatchEvent(event); - } - function websocketMessageReceived(handler, type, data) { - handler.onMessage(type, data); - } - function toArrayBuffer2(buffer2) { - if (buffer2.byteLength === buffer2.buffer.byteLength) { - return buffer2.buffer; + var { kClients } = require_symbols(); + var Agent = require_agent(); + var { + kAgent, + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory, + kMockAgentRegisterCallHistory, + kMockAgentIsCallHistoryEnabled, + kMockAgentAddCallHistoryLog, + kMockAgentMockCallHistoryInstance, + kMockAgentAcceptsNonStandardSearchParameters, + kMockCallHistoryAddLog, + kIgnoreTrailingSlash + } = require_mock_symbols(); + var MockClient = require_mock_client(); + var MockPool = require_mock_pool(); + var { matchValue, normalizeSearchParams, buildAndValidateMockOptions, normalizeOrigin } = require_mock_utils(); + var { InvalidArgumentError, UndiciError } = require_errors(); + var Dispatcher = require_dispatcher(); + var PendingInterceptorsFormatter = require_pending_interceptors_formatter(); + var { MockCallHistory } = require_mock_call_history(); + var MockAgent = class extends Dispatcher { + constructor(opts = {}) { + super(opts); + const mockOptions = buildAndValidateMockOptions(opts); + this[kNetConnect] = true; + this[kIsMockActive] = true; + this[kMockAgentIsCallHistoryEnabled] = mockOptions.enableCallHistory ?? false; + this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions.acceptNonStandardSearchParameters ?? false; + this[kIgnoreTrailingSlash] = mockOptions.ignoreTrailingSlash ?? false; + if (opts?.agent && typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + const agent = opts?.agent ? opts.agent : new Agent(opts); + this[kAgent] = agent; + this[kClients] = agent[kClients]; + this[kOptions] = mockOptions; + if (this[kMockAgentIsCallHistoryEnabled]) { + this[kMockAgentRegisterCallHistory](); + } } - return new Uint8Array(buffer2).buffer; - } - function isValidSubprotocol(protocol) { - if (protocol.length === 0) { - return false; + get(origin) { + const normalizedOrigin = normalizeOrigin(origin); + const originKey = this[kIgnoreTrailingSlash] ? normalizedOrigin.replace(/\/$/, "") : normalizedOrigin; + let dispatcher = this[kMockAgentGet](originKey); + if (!dispatcher) { + dispatcher = this[kFactory](originKey); + this[kMockAgentSet](originKey, dispatcher); + } + return dispatcher; } - for (let i = 0; i < protocol.length; ++i) { - const code = protocol.charCodeAt(i); - if (code < 33 || // CTL, contains SP (0x20) and HT (0x09) - code > 126 || code === 34 || // " - code === 40 || // ( - code === 41 || // ) - code === 44 || // , - code === 47 || // / - code === 58 || // : - code === 59 || // ; - code === 60 || // < - code === 61 || // = - code === 62 || // > - code === 63 || // ? - code === 64 || // @ - code === 91 || // [ - code === 92 || // \ - code === 93 || // ] - code === 123 || // { - code === 125) { - return false; + dispatch(opts, handler) { + opts.origin = normalizeOrigin(opts.origin); + this.get(opts.origin); + this[kMockAgentAddCallHistoryLog](opts); + const acceptNonStandardSearchParameters = this[kMockAgentAcceptsNonStandardSearchParameters]; + const dispatchOpts = { ...opts }; + if (acceptNonStandardSearchParameters && dispatchOpts.path) { + const [path, searchParams] = dispatchOpts.path.split("?"); + const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters); + dispatchOpts.path = `${path}?${normalizedSearchParams}`; } + return this[kAgent].dispatch(dispatchOpts, handler); } - return true; - } - function isValidStatusCode(code) { - if (code >= 1e3 && code < 1015) { - return code !== 1004 && // reserved - code !== 1005 && // "MUST NOT be set as a status code" - code !== 1006; + async close() { + this.clearCallHistory(); + await this[kAgent].close(); + this[kClients].clear(); } - return code >= 3e3 && code <= 4999; - } - function isControlFrame(opcode) { - return opcode === opcodes.CLOSE || opcode === opcodes.PING || opcode === opcodes.PONG; - } - function isContinuationFrame(opcode) { - return opcode === opcodes.CONTINUATION; - } - function isTextBinaryFrame(opcode) { - return opcode === opcodes.TEXT || opcode === opcodes.BINARY; - } - function isValidOpcode(opcode) { - return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode); - } - function parseExtensions(extensions) { - const position = { position: 0 }; - const extensionList = /* @__PURE__ */ new Map(); - while (position.position < extensions.length) { - const pair = collectASequenceOfCodePointsFast(";", extensions, position); - const [name, value = ""] = pair.split("=", 2); - extensionList.set( - removeHTTPWhitespace(name, true, false), - removeHTTPWhitespace(value, false, true) - ); - position.position++; + deactivate() { + this[kIsMockActive] = false; } - return extensionList; - } - function isValidClientWindowBits(value) { - if (value.length === 0) { - return false; + activate() { + this[kIsMockActive] = true; } - for (let i = 0; i < value.length; i++) { - const byte = value.charCodeAt(i); - if (byte < 48 || byte > 57) { - return false; + enableNetConnect(matcher) { + if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { + if (Array.isArray(this[kNetConnect])) { + this[kNetConnect].push(matcher); + } else { + this[kNetConnect] = [matcher]; + } + } else if (typeof matcher === "undefined") { + this[kNetConnect] = true; + } else { + throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); } } - const num2 = Number.parseInt(value, 10); - return num2 >= 8 && num2 <= 15; - } - function getURLRecord(url, baseURL) { - let urlRecord; - try { - urlRecord = new URL(url, baseURL); - } catch (e7) { - throw new DOMException(e7, "SyntaxError"); + disableNetConnect() { + this[kNetConnect] = false; } - if (urlRecord.protocol === "http:") { - urlRecord.protocol = "ws:"; - } else if (urlRecord.protocol === "https:") { - urlRecord.protocol = "wss:"; + enableCallHistory() { + this[kMockAgentIsCallHistoryEnabled] = true; + return this; } - if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { - throw new DOMException("expected a ws: or wss: url", "SyntaxError"); + disableCallHistory() { + this[kMockAgentIsCallHistoryEnabled] = false; + return this; } - if (urlRecord.hash.length || urlRecord.href.endsWith("#")) { - throw new DOMException("hash", "SyntaxError"); + getCallHistory() { + return this[kMockAgentMockCallHistoryInstance]; } - return urlRecord; - } - function validateCloseCodeAndReason(code, reason) { - if (code !== null) { - if (code !== 1e3 && (code < 3e3 || code > 4999)) { - throw new DOMException("invalid code", "InvalidAccessError"); + clearCallHistory() { + if (this[kMockAgentMockCallHistoryInstance] !== void 0) { + this[kMockAgentMockCallHistoryInstance].clear(); } } - if (reason !== null) { - const reasonBytesLength = Buffer.byteLength(reason); - if (reasonBytesLength > 123) { - throw new DOMException(`Reason must be less than 123 bytes; received ${reasonBytesLength}`, "SyntaxError"); + // This is required to bypass issues caused by using global symbols - see: + // https://github.com/nodejs/undici/issues/1447 + get isMockActive() { + return this[kIsMockActive]; + } + [kMockAgentRegisterCallHistory]() { + if (this[kMockAgentMockCallHistoryInstance] === void 0) { + this[kMockAgentMockCallHistoryInstance] = new MockCallHistory(); + } + } + [kMockAgentAddCallHistoryLog](opts) { + if (this[kMockAgentIsCallHistoryEnabled]) { + this[kMockAgentRegisterCallHistory](); + this[kMockAgentMockCallHistoryInstance][kMockCallHistoryAddLog](opts); + } + } + [kMockAgentSet](origin, dispatcher) { + this[kClients].set(origin, { count: 0, dispatcher }); + } + [kFactory](origin) { + const mockOptions = Object.assign({ agent: this }, this[kOptions]); + return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); + } + [kMockAgentGet](origin) { + const result = this[kClients].get(origin); + if (result?.dispatcher) { + return result.dispatcher; + } + if (typeof origin !== "string") { + const dispatcher = this[kFactory]("http://localhost:9999"); + this[kMockAgentSet](origin, dispatcher); + return dispatcher; + } + for (const [keyMatcher, result2] of Array.from(this[kClients])) { + if (result2 && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { + const dispatcher = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher); + dispatcher[kDispatches] = result2.dispatcher[kDispatches]; + return dispatcher; + } + } + } + [kGetNetConnect]() { + return this[kNetConnect]; + } + pendingInterceptors() { + const mockAgentClients = this[kClients]; + return Array.from(mockAgentClients.entries()).flatMap(([origin, result]) => result.dispatcher[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); + } + assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { + const pending = this.pendingInterceptors(); + if (pending.length === 0) { + return; } + throw new UndiciError( + pending.length === 1 ? `1 interceptor is pending: + +${pendingInterceptorsFormatter.format(pending)}`.trim() : `${pending.length} interceptors are pending: + +${pendingInterceptorsFormatter.format(pending)}`.trim() + ); } + }; + module.exports = MockAgent; + } +}); + +// node_modules/undici/lib/mock/snapshot-utils.js +var require_snapshot_utils = __commonJS({ + "node_modules/undici/lib/mock/snapshot-utils.js"(exports, module) { + "use strict"; + var { InvalidArgumentError } = require_errors(); + var { runtimeFeatures } = require_runtime_features(); + function createHeaderFilters(matchOptions = {}) { + const { ignoreHeaders = [], excludeHeaders = [], matchHeaders = [], caseSensitive = false } = matchOptions; + return { + ignore: new Set(ignoreHeaders.map((header) => caseSensitive ? header : header.toLowerCase())), + exclude: new Set(excludeHeaders.map((header) => caseSensitive ? header : header.toLowerCase())), + match: new Set(matchHeaders.map((header) => caseSensitive ? header : header.toLowerCase())) + }; } - var utf8Decode = (() => { - if (typeof process.versions.icu === "string") { - const fatalDecoder = new TextDecoder("utf-8", { fatal: true }); - return fatalDecoder.decode.bind(fatalDecoder); + var crypto4 = runtimeFeatures.has("crypto") ? __require("crypto") : null; + var hashId = crypto4?.hash ? (value) => crypto4.hash("sha256", value, "base64url") : (value) => Buffer.from(value).toString("base64url"); + function isUndiciHeaders(headers) { + return Array.isArray(headers) && (headers.length & 1) === 0; + } + function isUrlExcludedFactory(excludePatterns = []) { + if (excludePatterns.length === 0) { + return () => false; } - return function(buffer2) { - if (isUtf8(buffer2)) { - return buffer2.toString("utf-8"); + return function isUrlExcluded(url) { + let urlLowerCased; + for (const pattern of excludePatterns) { + if (typeof pattern === "string") { + if (!urlLowerCased) { + urlLowerCased = url.toLowerCase(); + } + if (urlLowerCased.includes(pattern.toLowerCase())) { + return true; + } + } else if (pattern instanceof RegExp) { + if (pattern.test(url)) { + return true; + } + } } - throw new TypeError("Invalid utf-8 received."); + return false; }; - })(); - module.exports = { - isConnecting, - isEstablished, - isClosing, - isClosed, - fireEvent, - isValidSubprotocol, - isValidStatusCode, - websocketMessageReceived, - utf8Decode, - isControlFrame, - isContinuationFrame, - isTextBinaryFrame, - isValidOpcode, - parseExtensions, - isValidClientWindowBits, - toArrayBuffer: toArrayBuffer2, - getURLRecord, - validateCloseCodeAndReason + } + function normalizeHeaders3(headers) { + const normalizedHeaders = {}; + if (!headers) return normalizedHeaders; + if (isUndiciHeaders(headers)) { + for (let i = 0; i < headers.length; i += 2) { + const key = headers[i]; + const value = headers[i + 1]; + if (key && value !== void 0) { + const keyStr = Buffer.isBuffer(key) ? key.toString() : key; + const valueStr = Buffer.isBuffer(value) ? value.toString() : value; + normalizedHeaders[keyStr.toLowerCase()] = valueStr; + } + } + return normalizedHeaders; + } + if (headers && typeof headers === "object") { + for (const [key, value] of Object.entries(headers)) { + if (key && typeof key === "string") { + normalizedHeaders[key.toLowerCase()] = Array.isArray(value) ? value.join(", ") : String(value); + } + } + } + return normalizedHeaders; + } + var validSnapshotModes = ( + /** @type {const} */ + ["record", "playback", "update"] + ); + function validateSnapshotMode(mode) { + if (!validSnapshotModes.includes(mode)) { + throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(", ")}`); + } + } + module.exports = { + createHeaderFilters, + hashId, + isUndiciHeaders, + normalizeHeaders: normalizeHeaders3, + isUrlExcludedFactory, + validateSnapshotMode }; } }); -// node_modules/undici/lib/web/websocket/frame.js -var require_frame = __commonJS({ - "node_modules/undici/lib/web/websocket/frame.js"(exports, module) { +// node_modules/undici/lib/mock/snapshot-recorder.js +var require_snapshot_recorder = __commonJS({ + "node_modules/undici/lib/mock/snapshot-recorder.js"(exports, module) { "use strict"; - var { runtimeFeatures } = require_runtime_features(); - var { maxUnsigned16Bit, opcodes } = require_constants6(); - var BUFFER_SIZE = 8 * 1024; - var buffer2 = null; - var bufIdx = BUFFER_SIZE; - var randomFillSync = runtimeFeatures.has("crypto") ? __require("crypto").randomFillSync : function randomFillSync2(buffer3, _offset, _size) { - for (let i = 0; i < buffer3.length; ++i) { - buffer3[i] = Math.random() * 255 | 0; + var { writeFile: writeFile3, readFile: readFile2, mkdir: mkdir4 } = __require("fs/promises"); + var { dirname: dirname3, resolve } = __require("path"); + var { setTimeout: setTimeout2, clearTimeout: clearTimeout2 } = __require("timers"); + var { InvalidArgumentError, UndiciError } = require_errors(); + var { hashId, isUrlExcludedFactory, normalizeHeaders: normalizeHeaders3, createHeaderFilters } = require_snapshot_utils(); + function formatRequestKey(opts, headerFilters, matchOptions = {}) { + const url = new URL(opts.path, opts.origin); + const normalized = opts._normalizedHeaders || normalizeHeaders3(opts.headers); + if (!opts._normalizedHeaders) { + opts._normalizedHeaders = normalized; } - return buffer3; - }; - function generateMask() { - if (bufIdx === BUFFER_SIZE) { - bufIdx = 0; - randomFillSync(buffer2 ??= Buffer.allocUnsafeSlow(BUFFER_SIZE), 0, BUFFER_SIZE); + return { + method: opts.method || "GET", + url: matchOptions.matchQuery !== false ? url.toString() : `${url.origin}${url.pathname}`, + headers: filterHeadersForMatching(normalized, headerFilters, matchOptions), + body: matchOptions.matchBody !== false && opts.body ? String(opts.body) : "" + }; + } + function filterHeadersForMatching(headers, headerFilters, matchOptions = {}) { + if (!headers || typeof headers !== "object") return {}; + const { + caseSensitive = false + } = matchOptions; + const filtered = {}; + const { ignore, exclude, match } = headerFilters; + for (const [key, value] of Object.entries(headers)) { + const headerKey = caseSensitive ? key : key.toLowerCase(); + if (exclude.has(headerKey)) continue; + if (ignore.has(headerKey)) continue; + if (match.size !== 0) { + if (!match.has(headerKey)) continue; + } + filtered[headerKey] = value; } - return [buffer2[bufIdx++], buffer2[bufIdx++], buffer2[bufIdx++], buffer2[bufIdx++]]; + return filtered; } - var WebsocketFrameSend = class { - /** - * @param {Buffer|undefined} data - */ - constructor(data) { - this.frameData = data; + function filterHeadersForStorage(headers, headerFilters, matchOptions = {}) { + if (!headers || typeof headers !== "object") return {}; + const { + caseSensitive = false + } = matchOptions; + const filtered = {}; + const { exclude: excludeSet } = headerFilters; + for (const [key, value] of Object.entries(headers)) { + const headerKey = caseSensitive ? key : key.toLowerCase(); + if (excludeSet.has(headerKey)) continue; + filtered[headerKey] = value; } - createFrame(opcode) { - const frameData = this.frameData; - const maskKey = generateMask(); - const bodyLength = frameData?.byteLength ?? 0; - let payloadLength = bodyLength; - let offset = 6; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; - payloadLength = 126; - } - const buffer3 = Buffer.allocUnsafe(bodyLength + offset); - buffer3[0] = buffer3[1] = 0; - buffer3[0] |= 128; - buffer3[0] = (buffer3[0] & 240) + opcode; - buffer3[offset - 4] = maskKey[0]; - buffer3[offset - 3] = maskKey[1]; - buffer3[offset - 2] = maskKey[2]; - buffer3[offset - 1] = maskKey[3]; - buffer3[1] = payloadLength; - if (payloadLength === 126) { - buffer3.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - buffer3[2] = buffer3[3] = 0; - buffer3.writeUIntBE(bodyLength, 4, 6); + return filtered; + } + function createRequestHash(formattedRequest) { + const parts = [ + formattedRequest.method, + formattedRequest.url + ]; + if (formattedRequest.headers && typeof formattedRequest.headers === "object") { + const headerKeys = Object.keys(formattedRequest.headers).sort(); + for (const key of headerKeys) { + const values = Array.isArray(formattedRequest.headers[key]) ? formattedRequest.headers[key] : [formattedRequest.headers[key]]; + parts.push(key); + for (const value of values.sort()) { + parts.push(String(value)); + } } - buffer3[1] |= 128; - for (let i = 0; i < bodyLength; ++i) { - buffer3[offset + i] = frameData[i] ^ maskKey[i & 3]; + } + parts.push(formattedRequest.body); + const content = parts.join("|"); + return hashId(content); + } + var SnapshotRecorder = class { + /** @type {NodeJS.Timeout | null} */ + #flushTimeout; + /** @type {import('./snapshot-utils').IsUrlExcluded} */ + #isUrlExcluded; + /** @type {Map} */ + #snapshots = /* @__PURE__ */ new Map(); + /** @type {string|undefined} */ + #snapshotPath; + /** @type {number} */ + #maxSnapshots = Infinity; + /** @type {boolean} */ + #autoFlush = false; + /** @type {import('./snapshot-utils').HeaderFilters} */ + #headerFilters; + /** + * Creates a new SnapshotRecorder instance + * @param {SnapshotRecorderOptions&SnapshotRecorderMatchOptions} [options={}] - Configuration options for the recorder + */ + constructor(options = {}) { + this.#snapshotPath = options.snapshotPath; + this.#maxSnapshots = options.maxSnapshots || Infinity; + this.#autoFlush = options.autoFlush || false; + this.flushInterval = options.flushInterval || 3e4; + this._flushTimer = null; + this.matchOptions = { + matchHeaders: options.matchHeaders || [], + // empty means match all headers + ignoreHeaders: options.ignoreHeaders || [], + excludeHeaders: options.excludeHeaders || [], + matchBody: options.matchBody !== false, + // default: true + matchQuery: options.matchQuery !== false, + // default: true + caseSensitive: options.caseSensitive || false + }; + this.#headerFilters = createHeaderFilters(this.matchOptions); + this.shouldRecord = options.shouldRecord || (() => true); + this.shouldPlayback = options.shouldPlayback || (() => true); + this.#isUrlExcluded = isUrlExcludedFactory(options.excludeUrls); + if (this.#autoFlush && this.#snapshotPath) { + this.#startAutoFlush(); } - return buffer3; } /** - * @param {Uint8Array} buffer + * Records a request-response interaction + * @param {SnapshotRequestOptions} requestOpts - Request options + * @param {SnapshotEntryResponse} response - Response data to record + * @return {Promise} - Resolves when the recording is complete */ - static createFastTextFrame(buffer3) { - const maskKey = generateMask(); - const bodyLength = buffer3.length; - for (let i = 0; i < bodyLength; ++i) { - buffer3[i] ^= maskKey[i & 3]; + async record(requestOpts, response) { + if (!this.shouldRecord(requestOpts)) { + return; } - let payloadLength = bodyLength; - let offset = 6; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; - payloadLength = 126; + if (this.isUrlExcluded(requestOpts)) { + return; } - const head = Buffer.allocUnsafeSlow(offset); - head[0] = 128 | opcodes.TEXT; - head[1] = payloadLength | 128; - head[offset - 4] = maskKey[0]; - head[offset - 3] = maskKey[1]; - head[offset - 2] = maskKey[2]; - head[offset - 1] = maskKey[3]; - if (payloadLength === 126) { - head.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - head[2] = head[3] = 0; - head.writeUIntBE(bodyLength, 4, 6); + const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); + const hash3 = createRequestHash(request); + const normalizedHeaders = normalizeHeaders3(response.headers); + const responseData = { + statusCode: response.statusCode, + headers: filterHeadersForStorage(normalizedHeaders, this.#headerFilters, this.matchOptions), + body: Buffer.isBuffer(response.body) ? response.body.toString("base64") : Buffer.from(String(response.body || "")).toString("base64"), + trailers: response.trailers + }; + if (this.#snapshots.size >= this.#maxSnapshots && !this.#snapshots.has(hash3)) { + const oldestKey = this.#snapshots.keys().next().value; + this.#snapshots.delete(oldestKey); + } + const existingSnapshot = this.#snapshots.get(hash3); + if (existingSnapshot && existingSnapshot.responses) { + existingSnapshot.responses.push(responseData); + existingSnapshot.timestamp = (/* @__PURE__ */ new Date()).toISOString(); + } else { + this.#snapshots.set(hash3, { + request, + responses: [responseData], + // Always store as array for consistency + callCount: 0, + timestamp: (/* @__PURE__ */ new Date()).toISOString() + }); + } + if (this.#autoFlush && this.#snapshotPath) { + this.#scheduleFlush(); } - return [head, buffer3]; } - }; - module.exports = { - WebsocketFrameSend, - generateMask - // for benchmark - }; - } -}); - -// node_modules/undici/lib/web/websocket/connection.js -var require_connection = __commonJS({ - "node_modules/undici/lib/web/websocket/connection.js"(exports, module) { - "use strict"; - var { uid: uid2, states, sentCloseFrameState, emptyBuffer, opcodes } = require_constants6(); - var { parseExtensions, isClosed, isClosing, isEstablished, isConnecting, validateCloseCodeAndReason } = require_util5(); - var { makeRequest } = require_request2(); - var { fetching } = require_fetch(); - var { Headers: Headers2, getHeadersList } = require_headers(); - var { getDecodeSplit } = require_util2(); - var { WebsocketFrameSend } = require_frame(); - var assert8 = __require("assert"); - var { runtimeFeatures } = require_runtime_features(); - var crypto4 = runtimeFeatures.has("crypto") ? __require("crypto") : null; - var warningEmitted = false; - function establishWebSocketConnection(url, protocols, client, handler, options) { - const requestURL = url; - requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; - const request = makeRequest({ - urlList: [requestURL], - client, - serviceWorkers: "none", - referrer: "no-referrer", - mode: "websocket", - credentials: "include", - cache: "no-store", - redirect: "error", - useURLCredentials: true - }); - if (options.headers) { - const headersList = getHeadersList(new Headers2(options.headers)); - request.headersList = headersList; + /** + * Checks if a URL should be excluded from recording/playback + * @param {SnapshotRequestOptions} requestOpts - Request options to check + * @returns {boolean} - True if URL is excluded + */ + isUrlExcluded(requestOpts) { + const url = new URL(requestOpts.path, requestOpts.origin).toString(); + return this.#isUrlExcluded(url); } - const keyValue = crypto4.randomBytes(16).toString("base64"); - request.headersList.append("sec-websocket-key", keyValue, true); - request.headersList.append("sec-websocket-version", "13", true); - for (const protocol of protocols) { - request.headersList.append("sec-websocket-protocol", protocol, true); + /** + * Finds a matching snapshot for the given request + * Returns the appropriate response based on call count for sequential responses + * + * @param {SnapshotRequestOptions} requestOpts - Request options to match + * @returns {SnapshotEntry&Record<'response', SnapshotEntryResponse>|undefined} - Matching snapshot response or undefined if not found + */ + findSnapshot(requestOpts) { + if (!this.shouldPlayback(requestOpts)) { + return void 0; + } + if (this.isUrlExcluded(requestOpts)) { + return void 0; + } + const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); + const hash3 = createRequestHash(request); + const snapshot = this.#snapshots.get(hash3); + if (!snapshot) return void 0; + const currentCallCount = snapshot.callCount || 0; + const responseIndex = Math.min(currentCallCount, snapshot.responses.length - 1); + snapshot.callCount = currentCallCount + 1; + return { + ...snapshot, + response: snapshot.responses[responseIndex] + }; } - const permessageDeflate = "permessage-deflate; client_max_window_bits"; - request.headersList.append("sec-websocket-extensions", permessageDeflate, true); - const controller = fetching({ - request, - useParallelQueue: true, - dispatcher: options.dispatcher, - processResponse(response) { - if (response.type === "error" || response.status !== 101) { - if (response.socket?.session == null) { - failWebsocketConnection(handler, 1002, "Received network error or non-101 status code.", response.error); - return; - } - if (response.status !== 200) { - failWebsocketConnection(handler, 1002, "Received network error or non-200 status code.", response.error); - return; - } - } - if (warningEmitted === false && response.socket?.session != null) { - process.emitWarning("WebSocket over HTTP2 is experimental, and subject to change.", "ExperimentalWarning"); - warningEmitted = true; - } - if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(handler, 1002, "Server did not respond with sent protocols."); - return; - } - if (response.socket.session == null && response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { - failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to "websocket".'); - return; - } - if (response.socket.session == null && response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { - failWebsocketConnection(handler, 1002, 'Server did not set Connection header to "upgrade".'); - return; - } - const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); - const digest = crypto4.hash("sha1", keyValue + uid2, "base64"); - if (secWSAccept !== digest) { - failWebsocketConnection(handler, 1002, "Incorrect hash received in Sec-WebSocket-Accept header."); - return; - } - const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); - let extensions; - if (secExtension !== null) { - extensions = parseExtensions(secExtension); - if (!extensions.has("permessage-deflate")) { - failWebsocketConnection(handler, 1002, "Sec-WebSocket-Extensions header does not match."); - return; + /** + * Loads snapshots from file + * @param {string} [filePath] - Optional file path to load snapshots from + * @return {Promise} - Resolves when snapshots are loaded + */ + async loadSnapshots(filePath) { + const path = filePath || this.#snapshotPath; + if (!path) { + throw new InvalidArgumentError("Snapshot path is required"); + } + try { + const data = await readFile2(resolve(path), "utf8"); + const parsed = JSON.parse(data); + if (Array.isArray(parsed)) { + this.#snapshots.clear(); + for (const { hash: hash3, snapshot } of parsed) { + this.#snapshots.set(hash3, snapshot); } + } else { + this.#snapshots = new Map(Object.entries(parsed)); } - const secProtocol = response.headersList.get("Sec-WebSocket-Protocol"); - if (secProtocol !== null) { - const requestProtocols = getDecodeSplit("sec-websocket-protocol", request.headersList); - if (!requestProtocols.includes(secProtocol)) { - failWebsocketConnection(handler, 1002, "Protocol was not set in the opening handshake."); - return; - } + } catch (error) { + if (error.code === "ENOENT") { + this.#snapshots.clear(); + } else { + throw new UndiciError(`Failed to load snapshots from ${path}`, { cause: error }); } - response.socket.on("data", handler.onSocketData); - response.socket.on("close", handler.onSocketClose); - response.socket.on("error", handler.onSocketError); - handler.wasEverConnected = true; - handler.onConnectionEstablished(response, extensions); } - }); - return controller; - } - function closeWebSocketConnection(object, code, reason, validate6 = false) { - code ??= null; - reason ??= ""; - if (validate6) validateCloseCodeAndReason(code, reason); - if (isClosed(object.readyState) || isClosing(object.readyState)) { - } else if (!isEstablished(object.readyState)) { - failWebsocketConnection(object); - object.readyState = states.CLOSING; - } else if (!object.closeState.has(sentCloseFrameState.SENT) && !object.closeState.has(sentCloseFrameState.RECEIVED)) { - const frame = new WebsocketFrameSend(); - if (reason.length !== 0 && code === null) { - code = 1e3; + } + /** + * Saves snapshots to file + * + * @param {string} [filePath] - Optional file path to save snapshots + * @returns {Promise} - Resolves when snapshots are saved + */ + async saveSnapshots(filePath) { + const path = filePath || this.#snapshotPath; + if (!path) { + throw new InvalidArgumentError("Snapshot path is required"); } - assert8(code === null || Number.isInteger(code)); - if (code === null && reason.length === 0) { - frame.frameData = emptyBuffer; - } else if (code !== null && reason === null) { - frame.frameData = Buffer.allocUnsafe(2); - frame.frameData.writeUInt16BE(code, 0); - } else if (code !== null && reason !== null) { - frame.frameData = Buffer.allocUnsafe(2 + Buffer.byteLength(reason)); - frame.frameData.writeUInt16BE(code, 0); - frame.frameData.write(reason, 2, "utf-8"); - } else { - frame.frameData = emptyBuffer; + const resolvedPath = resolve(path); + await mkdir4(dirname3(resolvedPath), { recursive: true }); + const data = Array.from(this.#snapshots.entries()).map(([hash3, snapshot]) => ({ + hash: hash3, + snapshot + })); + await writeFile3(resolvedPath, JSON.stringify(data, null, 2), { flush: true }); + } + /** + * Clears all recorded snapshots + * @returns {void} + */ + clear() { + this.#snapshots.clear(); + } + /** + * Gets all recorded snapshots + * @return {Array} - Array of all recorded snapshots + */ + getSnapshots() { + return Array.from(this.#snapshots.values()); + } + /** + * Gets snapshot count + * @return {number} - Number of recorded snapshots + */ + size() { + return this.#snapshots.size; + } + /** + * Resets call counts for all snapshots (useful for test cleanup) + * @returns {void} + */ + resetCallCounts() { + for (const snapshot of this.#snapshots.values()) { + snapshot.callCount = 0; } - object.socket.write(frame.createFrame(opcodes.CLOSE)); - object.closeState.add(sentCloseFrameState.SENT); - object.readyState = states.CLOSING; - } else { - object.readyState = states.CLOSING; } - } - function failWebsocketConnection(handler, code, reason, cause) { - if (isEstablished(handler.readyState)) { - closeWebSocketConnection(handler, code, reason, false); + /** + * Deletes a specific snapshot by request options + * @param {SnapshotRequestOptions} requestOpts - Request options to match + * @returns {boolean} - True if snapshot was deleted, false if not found + */ + deleteSnapshot(requestOpts) { + const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); + const hash3 = createRequestHash(request); + return this.#snapshots.delete(hash3); + } + /** + * Gets information about a specific snapshot + * @param {SnapshotRequestOptions} requestOpts - Request options to match + * @returns {SnapshotInfo|null} - Snapshot information or null if not found + */ + getSnapshotInfo(requestOpts) { + const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions); + const hash3 = createRequestHash(request); + const snapshot = this.#snapshots.get(hash3); + if (!snapshot) return null; + return { + hash: hash3, + request: snapshot.request, + responseCount: snapshot.responses ? snapshot.responses.length : snapshot.response ? 1 : 0, + // .response for legacy snapshots + callCount: snapshot.callCount || 0, + timestamp: snapshot.timestamp + }; } - handler.controller.abort(); - if (isConnecting(handler.readyState)) { - handler.onSocketClose(); - } else if (handler.socket?.destroyed === false) { - handler.socket.destroy(); + /** + * Replaces all snapshots with new data (full replacement) + * @param {Array<{hash: string; snapshot: SnapshotEntry}>|Record} snapshotData - New snapshot data to replace existing ones + * @returns {void} + */ + replaceSnapshots(snapshotData) { + this.#snapshots.clear(); + if (Array.isArray(snapshotData)) { + for (const { hash: hash3, snapshot } of snapshotData) { + this.#snapshots.set(hash3, snapshot); + } + } else if (snapshotData && typeof snapshotData === "object") { + this.#snapshots = new Map(Object.entries(snapshotData)); + } } - } - module.exports = { - establishWebSocketConnection, - failWebsocketConnection, - closeWebSocketConnection - }; - } -}); - -// node_modules/undici/lib/web/websocket/permessage-deflate.js -var require_permessage_deflate2 = __commonJS({ - "node_modules/undici/lib/web/websocket/permessage-deflate.js"(exports, module) { - "use strict"; - var { createInflateRaw, Z_DEFAULT_WINDOWBITS } = __require("zlib"); - var { isValidClientWindowBits } = require_util5(); - var { MessageSizeExceededError } = require_errors(); - var tail = Buffer.from([0, 0, 255, 255]); - var kBuffer = /* @__PURE__ */ Symbol("kBuffer"); - var kLength = /* @__PURE__ */ Symbol("kLength"); - var PerMessageDeflate2 = class { - /** @type {import('node:zlib').InflateRaw} */ - #inflate; - #options = {}; - #maxPayloadSize = 0; /** - * @param {Map} extensions + * Starts the auto-flush timer + * @returns {void} */ - constructor(extensions, options) { - this.#options.serverNoContextTakeover = extensions.has("server_no_context_takeover"); - this.#options.serverMaxWindowBits = extensions.get("server_max_window_bits"); - this.#maxPayloadSize = options.maxPayloadSize; + #startAutoFlush() { + return this.#scheduleFlush(); } /** - * Decompress a compressed payload. - * @param {Buffer} chunk Compressed data - * @param {boolean} fin Final fragment flag - * @param {Function} callback Callback function + * Stops the auto-flush timer + * @returns {void} */ - decompress(chunk, fin, callback) { - if (!this.#inflate) { - let windowBits = Z_DEFAULT_WINDOWBITS; - if (this.#options.serverMaxWindowBits) { - if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) { - callback(new Error("Invalid server_max_window_bits")); - return; - } - windowBits = Number.parseInt(this.#options.serverMaxWindowBits); - } - try { - this.#inflate = createInflateRaw({ windowBits }); - } catch (err) { - callback(err); - return; - } - this.#inflate[kBuffer] = []; - this.#inflate[kLength] = 0; - this.#inflate.on("data", (data) => { - this.#inflate[kLength] += data.length; - if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) { - callback(new MessageSizeExceededError()); - this.#inflate.removeAllListeners(); - this.#inflate = null; - return; - } - this.#inflate[kBuffer].push(data); + #stopAutoFlush() { + if (this.#flushTimeout) { + clearTimeout2(this.#flushTimeout); + this.saveSnapshots().catch(() => { }); - this.#inflate.on("error", (err) => { - this.#inflate = null; - callback(err); + this.#flushTimeout = null; + } + } + /** + * Schedules a flush (debounced to avoid excessive writes) + */ + #scheduleFlush() { + this.#flushTimeout = setTimeout2(() => { + this.saveSnapshots().catch(() => { }); + if (this.#autoFlush) { + this.#flushTimeout?.refresh(); + } else { + this.#flushTimeout = null; + } + }, 1e3); + } + /** + * Cleanup method to stop timers + * @returns {void} + */ + destroy() { + this.#stopAutoFlush(); + if (this.#flushTimeout) { + clearTimeout2(this.#flushTimeout); + this.#flushTimeout = null; } - this.#inflate.write(chunk); - if (fin) { - this.#inflate.write(tail); + } + /** + * Async close method that saves all recordings and performs cleanup + * @returns {Promise} + */ + async close() { + if (this.#snapshotPath && this.#snapshots.size !== 0) { + await this.saveSnapshots(); } - this.#inflate.flush(() => { - if (!this.#inflate) { - return; - } - const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]); - this.#inflate[kBuffer].length = 0; - this.#inflate[kLength] = 0; - callback(null, full); - }); + this.destroy(); } }; - module.exports = { PerMessageDeflate: PerMessageDeflate2 }; + module.exports = { SnapshotRecorder, formatRequestKey, createRequestHash, filterHeadersForMatching, filterHeadersForStorage, createHeaderFilters }; } }); -// node_modules/undici/lib/web/websocket/receiver.js -var require_receiver2 = __commonJS({ - "node_modules/undici/lib/web/websocket/receiver.js"(exports, module) { +// node_modules/undici/lib/mock/snapshot-agent.js +var require_snapshot_agent = __commonJS({ + "node_modules/undici/lib/mock/snapshot-agent.js"(exports, module) { "use strict"; - var { Writable } = __require("stream"); - var assert8 = __require("assert"); - var { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require_constants6(); - var { - isValidStatusCode, - isValidOpcode, - websocketMessageReceived, - utf8Decode, - isControlFrame, - isTextBinaryFrame, - isContinuationFrame - } = require_util5(); - var { failWebsocketConnection } = require_connection(); - var { WebsocketFrameSend } = require_frame(); - var { PerMessageDeflate: PerMessageDeflate2 } = require_permessage_deflate2(); - var { MessageSizeExceededError } = require_errors(); - var ByteParser = class extends Writable { - #buffers = []; - #fragmentsBytes = 0; - #byteOffset = 0; - #loop = false; - #state = parserStates.INFO; - #info = {}; - #fragments = []; - /** @type {Map} */ - #extensions; - /** @type {import('./websocket').Handler} */ - #handler; - /** @type {number} */ - #maxPayloadSize; - /** - * @param {import('./websocket').Handler} handler - * @param {Map|null} extensions - * @param {{ maxPayloadSize?: number }} [options] - */ - constructor(handler, extensions, options = {}) { - super(); - this.#handler = handler; - this.#extensions = extensions == null ? /* @__PURE__ */ new Map() : extensions; - this.#maxPayloadSize = options.maxPayloadSize ?? 0; - if (this.#extensions.has("permessage-deflate")) { - this.#extensions.set("permessage-deflate", new PerMessageDeflate2(extensions, options)); + var Agent = require_agent(); + var MockAgent = require_mock_agent(); + var { SnapshotRecorder } = require_snapshot_recorder(); + var { InvalidArgumentError, UndiciError } = require_errors(); + var util2 = require_util(); + var { validateSnapshotMode } = require_snapshot_utils(); + var kSnapshotRecorder = /* @__PURE__ */ Symbol("kSnapshotRecorder"); + var kSnapshotMode = /* @__PURE__ */ Symbol("kSnapshotMode"); + var kSnapshotPath = /* @__PURE__ */ Symbol("kSnapshotPath"); + var kSnapshotLoaded = /* @__PURE__ */ Symbol("kSnapshotLoaded"); + var kRealAgent = /* @__PURE__ */ Symbol("kRealAgent"); + var warningEmitted = false; + var SnapshotAgent = class extends MockAgent { + constructor(opts = {}) { + if (!warningEmitted) { + process.emitWarning( + "SnapshotAgent is experimental and subject to change", + "ExperimentalWarning" + ); + warningEmitted = true; + } + const { + mode = "record", + snapshotPath = null, + ...mockAgentOpts + } = opts; + super(mockAgentOpts); + validateSnapshotMode(mode); + if ((mode === "playback" || mode === "update") && !snapshotPath) { + throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`); + } + this[kSnapshotMode] = mode; + this[kSnapshotPath] = snapshotPath; + this[kSnapshotRecorder] = new SnapshotRecorder({ + snapshotPath: this[kSnapshotPath], + mode: this[kSnapshotMode], + maxSnapshots: opts.maxSnapshots, + autoFlush: opts.autoFlush, + flushInterval: opts.flushInterval, + matchHeaders: opts.matchHeaders, + ignoreHeaders: opts.ignoreHeaders, + excludeHeaders: opts.excludeHeaders, + matchBody: opts.matchBody, + matchQuery: opts.matchQuery, + caseSensitive: opts.caseSensitive, + shouldRecord: opts.shouldRecord, + shouldPlayback: opts.shouldPlayback, + excludeUrls: opts.excludeUrls + }); + this[kSnapshotLoaded] = false; + if (this[kSnapshotMode] === "record" || this[kSnapshotMode] === "update" || this[kSnapshotMode] === "playback" && opts.excludeUrls && opts.excludeUrls.length > 0) { + this[kRealAgent] = new Agent(opts); + } + if ((this[kSnapshotMode] === "playback" || this[kSnapshotMode] === "update") && this[kSnapshotPath]) { + this.loadSnapshots().catch(() => { + }); + } + } + dispatch(opts, handler) { + const mode = this[kSnapshotMode]; + if (this[kSnapshotRecorder].isUrlExcluded(opts)) { + return this[kRealAgent].dispatch(opts, handler); + } + if (mode === "playback" || mode === "update") { + if (!this[kSnapshotLoaded]) { + return this.#asyncDispatch(opts, handler); + } + const snapshot = this[kSnapshotRecorder].findSnapshot(opts); + if (snapshot) { + return this.#replaySnapshot(snapshot, handler); + } else if (mode === "update") { + return this.#recordAndReplay(opts, handler); + } else { + const error = new UndiciError(`No snapshot found for ${opts.method || "GET"} ${opts.path}`); + if (handler.onResponseError) { + handler.onResponseError(null, error); + return; + } + throw error; + } + } else if (mode === "record") { + return this.#recordAndReplay(opts, handler); } } /** - * @param {Buffer} chunk - * @param {() => void} callback + * Async version of dispatch for when we need to load snapshots first */ - _write(chunk, _, callback) { - this.#buffers.push(chunk); - this.#byteOffset += chunk.length; - this.#loop = true; - this.run(callback); - } - #validatePayloadLength() { - if (this.#maxPayloadSize > 0 && !isControlFrame(this.#info.opcode) && this.#info.payloadLength > this.#maxPayloadSize) { - failWebsocketConnection(this.#handler, 1009, "Payload size exceeds maximum allowed size"); - return false; - } - return true; + async #asyncDispatch(opts, handler) { + await this.loadSnapshots(); + return this.dispatch(opts, handler); } /** - * Runs whenever a new chunk is received. - * Callback is called whenever there are no more chunks buffering, - * or not enough bytes are buffered to parse. + * Records a real request and replays the response */ - run(callback) { - while (this.#loop) { - if (this.#state === parserStates.INFO) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer2 = this.consume(2); - const fin = (buffer2[0] & 128) !== 0; - const opcode = buffer2[0] & 15; - const masked = (buffer2[1] & 128) === 128; - const fragmented = !fin && opcode !== opcodes.CONTINUATION; - const payloadLength = buffer2[1] & 127; - const rsv1 = buffer2[0] & 64; - const rsv2 = buffer2[0] & 32; - const rsv3 = buffer2[0] & 16; - if (!isValidOpcode(opcode)) { - failWebsocketConnection(this.#handler, 1002, "Invalid opcode received"); - return callback(); - } - if (masked) { - failWebsocketConnection(this.#handler, 1002, "Frame cannot be masked"); - return callback(); - } - if (rsv1 !== 0 && !this.#extensions.has("permessage-deflate")) { - failWebsocketConnection(this.#handler, 1002, "Expected RSV1 to be clear."); - return; - } - if (rsv2 !== 0 || rsv3 !== 0) { - failWebsocketConnection(this.#handler, 1002, "RSV1, RSV2, RSV3 must be clear"); - return; - } - if (fragmented && !isTextBinaryFrame(opcode)) { - failWebsocketConnection(this.#handler, 1002, "Invalid frame type was fragmented."); - return; - } - if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { - failWebsocketConnection(this.#handler, 1002, "Expected continuation frame"); - return; - } - if (this.#info.fragmented && fragmented) { - failWebsocketConnection(this.#handler, 1002, "Fragmented frame exceeded 125 bytes."); - return; - } - if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { - failWebsocketConnection(this.#handler, 1002, "Control frame either too large or fragmented"); - return; - } - if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { - failWebsocketConnection(this.#handler, 1002, "Unexpected continuation frame"); - return; - } - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength; - this.#state = parserStates.READ_DATA; - if (!this.#validatePayloadLength()) { - return; - } - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16; - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64; - } - if (isTextBinaryFrame(opcode)) { - this.#info.binaryType = opcode; - this.#info.compressed = rsv1 !== 0; - } - this.#info.opcode = opcode; - this.#info.masked = masked; - this.#info.fin = fin; - this.#info.fragmented = fragmented; - } else if (this.#state === parserStates.PAYLOADLENGTH_16) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer2 = this.consume(2); - this.#info.payloadLength = buffer2.readUInt16BE(0); - this.#state = parserStates.READ_DATA; - if (!this.#validatePayloadLength()) { - return; - } - } else if (this.#state === parserStates.PAYLOADLENGTH_64) { - if (this.#byteOffset < 8) { - return callback(); - } - const buffer2 = this.consume(8); - const upper = buffer2.readUInt32BE(0); - const lower = buffer2.readUInt32BE(4); - if (upper !== 0 || lower > 2 ** 31 - 1) { - failWebsocketConnection(this.#handler, 1009, "Received payload length > 2^31 bytes."); - return; - } - this.#info.payloadLength = lower; - this.#state = parserStates.READ_DATA; - if (!this.#validatePayloadLength()) { - return; - } - } else if (this.#state === parserStates.READ_DATA) { - if (this.#byteOffset < this.#info.payloadLength) { - return callback(); - } - const body = this.consume(this.#info.payloadLength); - if (isControlFrame(this.#info.opcode)) { - this.#loop = this.parseControlFrame(body); - this.#state = parserStates.INFO; - } else { - if (!this.#info.compressed) { - this.writeFragments(body); - if (!this.#info.fragmented && this.#info.fin) { - websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments()); - } - this.#state = parserStates.INFO; - } else { - this.#extensions.get("permessage-deflate").decompress( - body, - this.#info.fin, - (error, data) => { - if (error) { - const code = error instanceof MessageSizeExceededError ? 1009 : 1007; - failWebsocketConnection(this.#handler, code, error.message); - return; - } - this.writeFragments(data); - if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { - failWebsocketConnection(this.#handler, 1009, new MessageSizeExceededError().message); - return; - } - if (!this.#info.fin) { - this.#state = parserStates.INFO; - this.#loop = true; - this.run(callback); - return; - } - websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments()); - this.#loop = true; - this.#state = parserStates.INFO; - this.run(callback); - }, - this.#fragmentsBytes - ); - this.#loop = false; - break; - } - } + #recordAndReplay(opts, handler) { + const responseData = { + statusCode: null, + headers: {}, + trailers: {}, + body: [] + }; + const self = this; + const recordingHandler = { + onRequestStart(controller, context) { + return handler.onRequestStart(controller, { ...context, history: this.history }); + }, + onRequestUpgrade(controller, statusCode, headers, socket) { + return handler.onRequestUpgrade(controller, statusCode, headers, socket); + }, + onResponseStart(controller, statusCode, headers, statusMessage) { + responseData.statusCode = statusCode; + responseData.headers = headers; + return handler.onResponseStart(controller, statusCode, headers, statusMessage); + }, + onResponseData(controller, chunk) { + responseData.body.push(chunk); + return handler.onResponseData(controller, chunk); + }, + onResponseEnd(controller, trailers) { + responseData.trailers = trailers; + const responseBody = Buffer.concat(responseData.body); + self[kSnapshotRecorder].record(opts, { + statusCode: responseData.statusCode, + headers: responseData.headers, + body: responseBody, + trailers: responseData.trailers + }).then(() => handler.onResponseEnd(controller, trailers)).catch((error) => handler.onResponseError(controller, error)); + }, + onResponseError(controller, error) { + return handler.onResponseError(controller, error); } + }; + const agent = this[kRealAgent]; + return agent.dispatch(opts, recordingHandler); + } + /** + * Replays a recorded response + * + * @param {Object} snapshot - The recorded snapshot to replay. + * @param {Object} handler - The handler to call with the response data. + * @returns {void} + */ + #replaySnapshot(snapshot, handler) { + try { + const { response } = snapshot; + const rawHeaders = response.headers ? util2.toRawHeaders(response.headers) : []; + const rawTrailers = response.trailers ? util2.toRawHeaders(response.trailers) : []; + const controller = { + rawHeaders, + rawTrailers, + pause() { + }, + resume() { + }, + abort(reason) { + this.aborted = true; + this.reason = reason; + }, + aborted: false, + paused: false + }; + handler.onRequestStart(controller); + handler.onResponseStart(controller, response.statusCode, response.headers, response.statusMessage); + const body = Buffer.from(response.body, "base64"); + handler.onResponseData(controller, body); + handler.onResponseEnd(controller, response.trailers); + } catch (error) { + handler.onResponseError?.(null, error); } } /** - * Take n bytes from the buffered Buffers - * @param {number} n - * @returns {Buffer} + * Loads snapshots from file + * + * @param {string} [filePath] - Optional file path to load snapshots from. + * @returns {Promise} - Resolves when snapshots are loaded. */ - consume(n) { - if (n > this.#byteOffset) { - throw new Error("Called consume() before buffers satiated."); - } else if (n === 0) { - return emptyBuffer; - } - this.#byteOffset -= n; - const first = this.#buffers[0]; - if (first.length > n) { - this.#buffers[0] = first.subarray(n, first.length); - return first.subarray(0, n); - } else if (first.length === n) { - return this.#buffers.shift(); - } else { - let offset = 0; - const buffer2 = Buffer.allocUnsafeSlow(n); - while (offset !== n) { - const next = this.#buffers[0]; - const length = next.length; - if (length + offset === n) { - buffer2.set(this.#buffers.shift(), offset); - break; - } else if (length + offset > n) { - buffer2.set(next.subarray(0, n - offset), offset); - this.#buffers[0] = next.subarray(n - offset); - break; - } else { - buffer2.set(this.#buffers.shift(), offset); - offset += length; - } - } - return buffer2; + async loadSnapshots(filePath) { + await this[kSnapshotRecorder].loadSnapshots(filePath || this[kSnapshotPath]); + this[kSnapshotLoaded] = true; + if (this[kSnapshotMode] === "playback") { + this.#setupMockInterceptors(); } } - writeFragments(fragment) { - this.#fragmentsBytes += fragment.length; - this.#fragments.push(fragment); + /** + * Saves snapshots to file + * + * @param {string} [filePath] - Optional file path to save snapshots to. + * @returns {Promise} - Resolves when snapshots are saved. + */ + async saveSnapshots(filePath) { + return this[kSnapshotRecorder].saveSnapshots(filePath || this[kSnapshotPath]); } - consumeFragments() { - const fragments = this.#fragments; - if (fragments.length === 1) { - this.#fragmentsBytes = 0; - return fragments.shift(); - } - let offset = 0; - const output = Buffer.allocUnsafeSlow(this.#fragmentsBytes); - for (let i = 0; i < fragments.length; ++i) { - const buffer2 = fragments[i]; - output.set(buffer2, offset); - offset += buffer2.length; + /** + * Sets up MockAgent interceptors based on recorded snapshots. + * + * This method creates MockAgent interceptors for each recorded snapshot, + * allowing the SnapshotAgent to fall back to MockAgent's standard intercept + * mechanism in playback mode. Each interceptor is configured to persist + * (remain active for multiple requests) and responds with the recorded + * response data. + * + * Called automatically when loading snapshots in playback mode. + * + * @returns {void} + */ + #setupMockInterceptors() { + for (const snapshot of this[kSnapshotRecorder].getSnapshots()) { + const { request, responses, response } = snapshot; + const url = new URL(request.url); + const mockPool = this.get(url.origin); + const responseData = responses ? responses[0] : response; + if (!responseData) continue; + mockPool.intercept({ + path: url.pathname + url.search, + method: request.method, + headers: request.headers, + body: request.body + }).reply(responseData.statusCode, responseData.body, { + headers: responseData.headers, + trailers: responseData.trailers + }).persist(); } - this.#fragments = []; - this.#fragmentsBytes = 0; - return output; } - parseCloseBody(data) { - assert8(data.length !== 1); - let code; - if (data.length >= 2) { - code = data.readUInt16BE(0); - } - if (code !== void 0 && !isValidStatusCode(code)) { - return { code: 1002, reason: "Invalid status code", error: true }; - } - let reason = data.subarray(2); - if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { - reason = reason.subarray(3); - } - try { - reason = utf8Decode(reason); - } catch { - return { code: 1007, reason: "Invalid UTF-8", error: true }; - } - return { code, reason, error: false }; + /** + * Gets the snapshot recorder + * @return {SnapshotRecorder} - The snapshot recorder instance + */ + getRecorder() { + return this[kSnapshotRecorder]; } /** - * Parses control frames. - * @param {Buffer} body + * Gets the current mode + * @return {import('./snapshot-utils').SnapshotMode} - The current snapshot mode */ - parseControlFrame(body) { - const { opcode, payloadLength } = this.#info; - if (opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.#handler, 1002, "Received close frame with a 1-byte body."); - return false; - } - this.#info.closeInfo = this.parseCloseBody(body); - if (this.#info.closeInfo.error) { - const { code, reason } = this.#info.closeInfo; - failWebsocketConnection(this.#handler, code, reason); - return false; - } - if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { - let body2 = emptyBuffer; - if (this.#info.closeInfo.code) { - body2 = Buffer.allocUnsafe(2); - body2.writeUInt16BE(this.#info.closeInfo.code, 0); - } - const closeFrame = new WebsocketFrameSend(body2); - this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE)); - this.#handler.closeState.add(sentCloseFrameState.SENT); - } - this.#handler.readyState = states.CLOSING; - this.#handler.closeState.add(sentCloseFrameState.RECEIVED); - return false; - } else if (opcode === opcodes.PING) { - if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { - const frame = new WebsocketFrameSend(body); - this.#handler.socket.write(frame.createFrame(opcodes.PONG)); - this.#handler.onPing(body); - } - } else if (opcode === opcodes.PONG) { - this.#handler.onPong(body); - } - return true; + getMode() { + return this[kSnapshotMode]; } - get closingInfo() { - return this.#info.closeInfo; + /** + * Clears all snapshots + * @returns {void} + */ + clearSnapshots() { + this[kSnapshotRecorder].clear(); } - }; - module.exports = { - ByteParser - }; - } -}); - -// node_modules/undici/lib/web/websocket/sender.js -var require_sender2 = __commonJS({ - "node_modules/undici/lib/web/websocket/sender.js"(exports, module) { - "use strict"; - var { WebsocketFrameSend } = require_frame(); - var { opcodes, sendHints } = require_constants6(); - var FixedQueue = require_fixed_queue(); - var SendQueue = class { /** - * @type {FixedQueue} + * Resets call counts for all snapshots (useful for test cleanup) + * @returns {void} */ - #queue = new FixedQueue(); + resetCallCounts() { + this[kSnapshotRecorder].resetCallCounts(); + } /** - * @type {boolean} + * Deletes a specific snapshot by request options + * @param {import('./snapshot-recorder').SnapshotRequestOptions} requestOpts - Request options to identify the snapshot + * @return {Promise} - Returns true if the snapshot was deleted, false if not found */ - #running = false; - /** @type {import('node:net').Socket} */ - #socket; - constructor(socket) { - this.#socket = socket; + deleteSnapshot(requestOpts) { + return this[kSnapshotRecorder].deleteSnapshot(requestOpts); } - add(item, cb, hint) { - if (hint !== sendHints.blob) { - if (!this.#running) { - if (hint === sendHints.text) { - const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item); - this.#socket.cork(); - this.#socket.write(head); - this.#socket.write(body, cb); - this.#socket.uncork(); - } else { - this.#socket.write(createFrame(item, hint), cb); - } - } else { - const node2 = { - promise: null, - callback: cb, - frame: createFrame(item, hint) - }; - this.#queue.push(node2); - } - return; - } - const node = { - promise: item.arrayBuffer().then((ab) => { - node.promise = null; - node.frame = createFrame(ab, hint); - }), - callback: cb, - frame: null - }; - this.#queue.push(node); - if (!this.#running) { - this.#run(); - } + /** + * Gets information about a specific snapshot + * @returns {import('./snapshot-recorder').SnapshotInfo|null} - Snapshot information or null if not found + */ + getSnapshotInfo(requestOpts) { + return this[kSnapshotRecorder].getSnapshotInfo(requestOpts); } - async #run() { - this.#running = true; - const queue = this.#queue; - while (!queue.isEmpty()) { - const node = queue.shift(); - if (node.promise !== null) { - await node.promise; - } - this.#socket.write(node.frame, node.callback); - node.callback = node.frame = null; - } - this.#running = false; + /** + * Replaces all snapshots with new data (full replacement) + * @param {Array<{hash: string; snapshot: import('./snapshot-recorder').SnapshotEntryshotEntry}>|Record} snapshotData - New snapshot data to replace existing snapshots + * @returns {void} + */ + replaceSnapshots(snapshotData) { + this[kSnapshotRecorder].replaceSnapshots(snapshotData); } - }; - function createFrame(data, hint) { - return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY); - } - function toBuffer(data, hint) { - switch (hint) { - case sendHints.text: - case sendHints.typedArray: - return new Uint8Array(data.buffer, data.byteOffset, data.byteLength); - case sendHints.arrayBuffer: - case sendHints.blob: - return new Uint8Array(data); + /** + * Closes the agent, saving snapshots and cleaning up resources. + * + * @returns {Promise} + */ + async close() { + await this[kSnapshotRecorder].close(); + await this[kRealAgent]?.close(); + await super.close(); } - } - module.exports = { SendQueue }; + }; + module.exports = SnapshotAgent; } }); -// node_modules/undici/lib/web/websocket/websocket.js -var require_websocket2 = __commonJS({ - "node_modules/undici/lib/web/websocket/websocket.js"(exports, module) { +// node_modules/undici/lib/global.js +var require_global2 = __commonJS({ + "node_modules/undici/lib/global.js"(exports, module) { "use strict"; - var { isArrayBuffer } = __require("util/types"); - var { webidl } = require_webidl(); - var { URLSerializer } = require_data_url(); - var { environmentSettingsObject } = require_util2(); - var { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = require_constants6(); - var { - isConnecting, - isEstablished, - isClosing, - isClosed, - isValidSubprotocol, - fireEvent, - utf8Decode, - toArrayBuffer: toArrayBuffer2, - getURLRecord - } = require_util5(); - var { establishWebSocketConnection, closeWebSocketConnection, failWebsocketConnection } = require_connection(); - var { ByteParser } = require_receiver2(); - var { kEnumerableProperty } = require_util(); - var { getGlobalDispatcher } = require_global2(); - var { ErrorEvent, CloseEvent, createFastMessageEvent } = require_events(); - var { SendQueue } = require_sender2(); - var { WebsocketFrameSend } = require_frame(); - var { channels } = require_diagnostics(); - function getSocketAddress(socket) { - if (typeof socket?.address === "function") { - return socket.address(); - } - if (typeof socket?.session?.socket?.address === "function") { - return socket.session.socket.address(); - } - return null; + var globalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.2"); + var legacyGlobalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.1"); + var { InvalidArgumentError } = require_errors(); + var Agent = require_agent(); + var Dispatcher1Wrapper = require_dispatcher1_wrapper(); + if (getGlobalDispatcher() === void 0) { + setGlobalDispatcher(new Agent()); } - var WebSocket2 = class _WebSocket extends EventTarget { - #events = { - open: null, - error: null, - close: null, - message: null - }; - #bufferedAmount = 0; - #protocol = ""; - #extensions = ""; - /** @type {SendQueue} */ - #sendQueue; - /** @type {Handler} */ - #handler = { - onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions), - onMessage: (opcode, data) => this.#onMessage(opcode, data), - onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message), - onParserDrain: () => this.#onParserDrain(), - onSocketData: (chunk) => { - if (!this.#parser.write(chunk)) { - this.#handler.socket.pause(); - } - }, - onSocketError: (err) => { - this.#handler.readyState = states.CLOSING; - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(err); - } - this.#handler.socket.destroy(); - }, - onSocketClose: () => this.#onSocketClose(), - onPing: (body) => { - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body, - websocket: this - }); - } - }, - onPong: (body) => { - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body, - websocket: this - }); - } - }, - readyState: states.CONNECTING, - socket: null, - closeState: /* @__PURE__ */ new Set(), - controller: null, - wasEverConnected: false - }; - #url; - #binaryType; - /** @type {import('./receiver').ByteParser} */ - #parser; - /** - * @param {string} url - * @param {string|string[]} protocols - */ - constructor(url, protocols = []) { - super(); - webidl.util.markAsUncloneable(this); - const prefix = "WebSocket constructor"; - webidl.argumentLengthCheck(arguments, 1, prefix); - const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols, prefix, "options"); - url = webidl.converters.USVString(url); - protocols = options.protocols; - const baseURL = environmentSettingsObject.settingsObject.baseUrl; - const urlRecord = getURLRecord(url, baseURL); - if (typeof protocols === "string") { - protocols = [protocols]; - } - if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { - throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { - throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - this.#url = new URL(urlRecord.href); - const client = environmentSettingsObject.settingsObject; - this.#handler.controller = establishWebSocketConnection( - urlRecord, - protocols, - client, - this.#handler, - options - ); - this.#handler.readyState = _WebSocket.CONNECTING; - this.#binaryType = "blob"; - } - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-close - * @param {number|undefined} code - * @param {string|undefined} reason - */ - close(code = void 0, reason = void 0) { - webidl.brandCheck(this, _WebSocket); - const prefix = "WebSocket.close"; - if (code !== void 0) { - code = webidl.converters["unsigned short"](code, prefix, "code", webidl.attributes.Clamp); - } - if (reason !== void 0) { - reason = webidl.converters.USVString(reason); - } - code ??= null; - reason ??= ""; - closeWebSocketConnection(this.#handler, code, reason, true); + function setGlobalDispatcher(agent) { + if (!agent || typeof agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument agent must implement Agent"); } - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-send - * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data - */ - send(data) { - webidl.brandCheck(this, _WebSocket); - const prefix = "WebSocket.send"; - webidl.argumentLengthCheck(arguments, 1, prefix); - data = webidl.converters.WebSocketSendData(data, prefix, "data"); - if (isConnecting(this.#handler.readyState)) { - throw new DOMException("Sent before connected.", "InvalidStateError"); - } - if (!isEstablished(this.#handler.readyState) || isClosing(this.#handler.readyState)) { - return; - } - if (typeof data === "string") { - const buffer2 = Buffer.from(data); - this.#bufferedAmount += buffer2.byteLength; - this.#sendQueue.add(buffer2, () => { - this.#bufferedAmount -= buffer2.byteLength; - }, sendHints.text); - } else if (isArrayBuffer(data)) { - this.#bufferedAmount += data.byteLength; - this.#sendQueue.add(data, () => { - this.#bufferedAmount -= data.byteLength; - }, sendHints.arrayBuffer); - } else if (ArrayBuffer.isView(data)) { - this.#bufferedAmount += data.byteLength; - this.#sendQueue.add(data, () => { - this.#bufferedAmount -= data.byteLength; - }, sendHints.typedArray); - } else if (webidl.is.Blob(data)) { - this.#bufferedAmount += data.size; - this.#sendQueue.add(data, () => { - this.#bufferedAmount -= data.size; - }, sendHints.blob); + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }); + const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent); + Object.defineProperty(globalThis, legacyGlobalDispatcher, { + value: legacyAgent, + writable: true, + enumerable: false, + configurable: false + }); + } + function getGlobalDispatcher() { + return globalThis[globalDispatcher]; + } + var installedExports = ( + /** @type {const} */ + [ + "fetch", + "Headers", + "Response", + "Request", + "FormData", + "WebSocket", + "CloseEvent", + "ErrorEvent", + "MessageEvent", + "EventSource" + ] + ); + module.exports = { + setGlobalDispatcher, + getGlobalDispatcher, + installedExports + }; + } +}); + +// node_modules/undici/lib/handler/decorator-handler.js +var require_decorator_handler = __commonJS({ + "node_modules/undici/lib/handler/decorator-handler.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + module.exports = class DecoratorHandler { + #handler; + #onCompleteCalled = false; + #onErrorCalled = false; + #onResponseStartCalled = false; + constructor(handler) { + if (typeof handler !== "object" || handler === null) { + throw new TypeError("handler must be an object"); } + this.#handler = handler; } - get readyState() { - webidl.brandCheck(this, _WebSocket); - return this.#handler.readyState; - } - get bufferedAmount() { - webidl.brandCheck(this, _WebSocket); - return this.#bufferedAmount; + onRequestStart(...args) { + this.#handler.onRequestStart?.(...args); } - get url() { - webidl.brandCheck(this, _WebSocket); - return URLSerializer(this.#url); + onRequestUpgrade(...args) { + assert8(!this.#onCompleteCalled); + assert8(!this.#onErrorCalled); + return this.#handler.onRequestUpgrade?.(...args); } - get extensions() { - webidl.brandCheck(this, _WebSocket); - return this.#extensions; + onResponseStart(...args) { + assert8(!this.#onCompleteCalled); + assert8(!this.#onErrorCalled); + assert8(!this.#onResponseStartCalled); + this.#onResponseStartCalled = true; + return this.#handler.onResponseStart?.(...args); } - get protocol() { - webidl.brandCheck(this, _WebSocket); - return this.#protocol; + onResponseData(...args) { + assert8(!this.#onCompleteCalled); + assert8(!this.#onErrorCalled); + return this.#handler.onResponseData?.(...args); } - get onopen() { - webidl.brandCheck(this, _WebSocket); - return this.#events.open; + onResponseEnd(...args) { + assert8(!this.#onCompleteCalled); + assert8(!this.#onErrorCalled); + this.#onCompleteCalled = true; + return this.#handler.onResponseEnd?.(...args); } - set onopen(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.open) { - this.removeEventListener("open", this.#events.open); - } - const listener = webidl.converters.EventHandlerNonNull(fn); - if (listener !== null) { - this.addEventListener("open", listener); - this.#events.open = fn; - } else { - this.#events.open = null; - } + onResponseError(...args) { + this.#onErrorCalled = true; + return this.#handler.onResponseError?.(...args); } - get onerror() { - webidl.brandCheck(this, _WebSocket); - return this.#events.error; + /** + * @deprecated + */ + onBodySent() { } - set onerror(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.error) { - this.removeEventListener("error", this.#events.error); - } - const listener = webidl.converters.EventHandlerNonNull(fn); - if (listener !== null) { - this.addEventListener("error", listener); - this.#events.error = fn; - } else { - this.#events.error = null; + }; + } +}); + +// node_modules/undici/lib/handler/redirect-handler.js +var require_redirect_handler = __commonJS({ + "node_modules/undici/lib/handler/redirect-handler.js"(exports, module) { + "use strict"; + var util2 = require_util(); + var assert8 = __require("assert"); + var { InvalidArgumentError } = require_errors(); + var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + var noop = () => { + }; + var RedirectHandler = class _RedirectHandler { + static buildDispatch(dispatcher, maxRedirections) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } + const dispatch = dispatcher.dispatch.bind(dispatcher); + return (opts, originalHandler) => dispatch(opts, new _RedirectHandler(dispatch, maxRedirections, opts, originalHandler)); } - get onclose() { - webidl.brandCheck(this, _WebSocket); - return this.#events.close; - } - set onclose(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.close) { - this.removeEventListener("close", this.#events.close); - } - const listener = webidl.converters.EventHandlerNonNull(fn); - if (listener !== null) { - this.addEventListener("close", listener); - this.#events.close = fn; - } else { - this.#events.close = null; + constructor(dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } + this.dispatch = dispatch; + this.location = null; + const { maxRedirections: _, ...cleanOpts } = opts; + this.opts = cleanOpts; + this.opts.body = util2.wrapRequestBody(this.opts.body); + this.maxRedirections = maxRedirections; + this.handler = handler; + this.history = []; } - get onmessage() { - webidl.brandCheck(this, _WebSocket); - return this.#events.message; - } - set onmessage(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.message) { - this.removeEventListener("message", this.#events.message); - } - const listener = webidl.converters.EventHandlerNonNull(fn); - if (listener !== null) { - this.addEventListener("message", listener); - this.#events.message = fn; - } else { - this.#events.message = null; - } + onRequestStart(controller, context) { + this.handler.onRequestStart?.(controller, { ...context, history: this.history }); } - get binaryType() { - webidl.brandCheck(this, _WebSocket); - return this.#binaryType; + onRequestUpgrade(controller, statusCode, headers, socket) { + this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket); } - set binaryType(type) { - webidl.brandCheck(this, _WebSocket); - if (type !== "blob" && type !== "arraybuffer") { - this.#binaryType = "blob"; - } else { - this.#binaryType = type; + onResponseStart(controller, statusCode, headers, statusMessage) { + if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { + throw new Error("max redirects"); } - } - /** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - */ - #onConnectionEstablished(response, parsedExtensions) { - this.#handler.socket = response.socket; - const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize; - const parser = new ByteParser(this.#handler, parsedExtensions, { - maxPayloadSize - }); - parser.on("drain", () => this.#handler.onParserDrain()); - parser.on("error", (err) => this.#handler.onParserError(err)); - this.#parser = parser; - this.#sendQueue = new SendQueue(response.socket); - this.#handler.readyState = states.OPEN; - const extensions = response.headersList.get("sec-websocket-extensions"); - if (extensions !== null) { - this.#extensions = extensions; + if ((statusCode === 301 || statusCode === 302) && this.opts.method === "POST") { + this.opts.method = "GET"; + if (util2.isStream(this.opts.body)) { + util2.destroy(this.opts.body.on("error", noop)); + } + this.opts.body = null; } - const protocol = response.headersList.get("sec-websocket-protocol"); - if (protocol !== null) { - this.#protocol = protocol; + if (statusCode === 303 && this.opts.method !== "HEAD") { + this.opts.method = "GET"; + if (util2.isStream(this.opts.body)) { + util2.destroy(this.opts.body.on("error", noop)); + } + this.opts.body = null; } - fireEvent("open", this); - if (channels.open.hasSubscribers) { - const headers = response.headersList.entries; - channels.open.publish({ - address: getSocketAddress(response.socket), - protocol: this.#protocol, - extensions: this.#extensions, - websocket: this, - handshakeResponse: { - status: response.status, - statusText: response.statusText, - headers - } - }); + this.location = this.history.length >= this.maxRedirections || util2.isDisturbed(this.opts.body) || redirectableStatusCodes.indexOf(statusCode) === -1 ? null : headers.location; + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); } - } - #onMessage(type, data) { - if (this.#handler.readyState !== states.OPEN) { + if (!this.location) { + this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage); return; } - let dataForEvent; - if (type === opcodes.TEXT) { - try { - dataForEvent = utf8Decode(data); - } catch { - failWebsocketConnection(this.#handler, 1007, "Received invalid UTF-8 in text frame."); - return; - } - } else if (type === opcodes.BINARY) { - if (this.#binaryType === "blob") { - dataForEvent = new Blob([data]); - } else { - dataForEvent = toArrayBuffer2(data); + const { origin, pathname, search } = util2.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; + const redirectUrlString = `${origin}${path}`; + for (const historyUrl of this.history) { + if (historyUrl.toString() === redirectUrlString) { + throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`); } } - fireEvent("message", this, createFastMessageEvent, { - origin: this.#url.origin, - data: dataForEvent - }); - } - #onParserDrain() { - this.#handler.socket.resume(); + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.query = null; } - /** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 - */ - #onSocketClose() { - const wasClean = this.#handler.closeState.has(sentCloseFrameState.SENT) && this.#handler.closeState.has(sentCloseFrameState.RECEIVED); - let code = 1005; - let reason = ""; - const result = this.#parser?.closingInfo; - if (result && !result.error) { - code = result.code ?? 1005; - reason = result.reason; - } - this.#handler.readyState = states.CLOSED; - if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { - code = 1006; - fireEvent("error", this, (type, init) => new ErrorEvent(type, init), { - error: new TypeError(reason) - }); + onResponseData(controller, chunk) { + if (this.location) { + } else { + this.handler.onResponseData?.(controller, chunk); } - fireEvent("close", this, (type, init) => new CloseEvent(type, init), { - wasClean, - code, - reason - }); - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: this, - code, - reason - }); + } + onResponseEnd(controller, trailers) { + if (this.location) { + this.dispatch(this.opts, this); + } else { + this.handler.onResponseEnd(controller, trailers); } } - /** - * @param {WebSocket} ws - * @param {Buffer|undefined} buffer - */ - static ping(ws, buffer2) { - if (Buffer.isBuffer(buffer2)) { - if (buffer2.length > 125) { - throw new TypeError("A PING frame cannot have a body larger than 125 bytes."); + onResponseError(controller, error) { + this.handler.onResponseError?.(controller, error); + } + }; + function shouldRemoveHeader(header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util2.headerNameToString(header) === "host"; + } + if (removeContent && util2.headerNameToString(header).startsWith("content-")) { + return true; + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util2.headerNameToString(header); + return name === "authorization" || name === "cookie" || name === "proxy-authorization"; + } + return false; + } + function cleanRequestHeaders(headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); } - } else if (buffer2 !== void 0) { - throw new TypeError("Expected buffer payload"); } - const readyState = ws.#handler.readyState; - if (isEstablished(readyState) && !isClosing(readyState) && !isClosed(readyState)) { - const frame = new WebsocketFrameSend(buffer2); - ws.#handler.socket.write(frame.createFrame(opcodes.PING)); + } else if (headers && typeof headers === "object") { + const entries = util2.hasSafeIterator(headers) ? headers : Object.entries(headers); + for (const [key, value] of entries) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, value); + } } + } else { + assert8(headers == null, "headers must be an object or an array"); } - }; - var { ping } = WebSocket2; - Reflect.deleteProperty(WebSocket2, "ping"); - WebSocket2.CONNECTING = WebSocket2.prototype.CONNECTING = states.CONNECTING; - WebSocket2.OPEN = WebSocket2.prototype.OPEN = states.OPEN; - WebSocket2.CLOSING = WebSocket2.prototype.CLOSING = states.CLOSING; - WebSocket2.CLOSED = WebSocket2.prototype.CLOSED = states.CLOSED; - Object.defineProperties(WebSocket2.prototype, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors, - url: kEnumerableProperty, - readyState: kEnumerableProperty, - bufferedAmount: kEnumerableProperty, - onopen: kEnumerableProperty, - onerror: kEnumerableProperty, - onclose: kEnumerableProperty, - close: kEnumerableProperty, - onmessage: kEnumerableProperty, - binaryType: kEnumerableProperty, - send: kEnumerableProperty, - extensions: kEnumerableProperty, - protocol: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "WebSocket", - writable: false, - enumerable: false, - configurable: true + return ret; + } + module.exports = RedirectHandler; + } +}); + +// node_modules/undici/lib/interceptor/redirect.js +var require_redirect = __commonJS({ + "node_modules/undici/lib/interceptor/redirect.js"(exports, module) { + "use strict"; + var RedirectHandler = require_redirect_handler(); + function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections } = {}) { + return (dispatch) => { + return function Intercept(opts, handler) { + const { maxRedirections = defaultMaxRedirections, ...rest } = opts; + if (maxRedirections == null || maxRedirections === 0) { + return dispatch(opts, handler); + } + const dispatchOpts = { ...rest }; + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler); + return dispatch(dispatchOpts, redirectHandler); + }; + }; + } + module.exports = createRedirectInterceptor; + } +}); + +// node_modules/undici/lib/interceptor/response-error.js +var require_response_error = __commonJS({ + "node_modules/undici/lib/interceptor/response-error.js"(exports, module) { + "use strict"; + var DecoratorHandler = require_decorator_handler(); + var { ResponseError } = require_errors(); + var ResponseErrorHandler = class extends DecoratorHandler { + #statusCode; + #contentType; + #decoder; + #headers; + #body; + constructor(_opts, { handler }) { + super(handler); } - }); - Object.defineProperties(WebSocket2, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors - }); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.DOMString - ); - webidl.converters["DOMString or sequence"] = function(V, prefix, argument) { - if (webidl.util.Type(V) === webidl.util.Types.OBJECT && Symbol.iterator in V) { - return webidl.converters["sequence"](V); + #checkContentType(contentType) { + return (this.#contentType ?? "").indexOf(contentType) === 0; } - return webidl.converters.DOMString(V, prefix, argument); - }; - webidl.converters.WebSocketInit = webidl.dictionaryConverter([ - { - key: "protocols", - converter: webidl.converters["DOMString or sequence"], - defaultValue: () => [] - }, - { - key: "dispatcher", - converter: webidl.converters.any, - defaultValue: () => getGlobalDispatcher() - }, - { - key: "headers", - converter: webidl.nullableConverter(webidl.converters.HeadersInit) + onRequestStart(controller, context) { + this.#statusCode = 0; + this.#contentType = null; + this.#decoder = null; + this.#headers = null; + this.#body = ""; + return super.onRequestStart(controller, context); } - ]); - webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { - if (webidl.util.Type(V) === webidl.util.Types.OBJECT && !(Symbol.iterator in V)) { - return webidl.converters.WebSocketInit(V); + onResponseStart(controller, statusCode, headers, statusMessage) { + this.#statusCode = statusCode; + this.#headers = headers; + this.#contentType = headers["content-type"]; + if (this.#statusCode < 400) { + return super.onResponseStart(controller, statusCode, headers, statusMessage); + } + if (this.#checkContentType("application/json") || this.#checkContentType("text/plain")) { + this.#decoder = new TextDecoder("utf-8"); + } } - return { protocols: webidl.converters["DOMString or sequence"](V) }; - }; - webidl.converters.WebSocketSendData = function(V) { - if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { - if (webidl.is.Blob(V)) { - return V; + onResponseData(controller, chunk) { + if (this.#statusCode < 400) { + return super.onResponseData(controller, chunk); } - if (webidl.is.BufferSource(V)) { - return V; + this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? ""; + } + onResponseEnd(controller, trailers) { + if (this.#statusCode >= 400) { + this.#body += this.#decoder?.decode(void 0, { stream: false }) ?? ""; + if (this.#checkContentType("application/json")) { + try { + this.#body = JSON.parse(this.#body); + } catch { + } + } + let err; + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + try { + err = new ResponseError("Response Error", this.#statusCode, { + body: this.#body, + headers: this.#headers + }); + } finally { + Error.stackTraceLimit = stackTraceLimit; + } + super.onResponseError(controller, err); + } else { + super.onResponseEnd(controller, trailers); } } - return webidl.converters.USVString(V); + onResponseError(controller, err) { + super.onResponseError(controller, err); + } }; - module.exports = { - WebSocket: WebSocket2, - ping + module.exports = () => { + return (dispatch) => { + return function Intercept(opts, handler) { + return dispatch(opts, new ResponseErrorHandler(opts, { handler })); + }; + }; }; } }); -// node_modules/undici/lib/web/websocket/stream/websocketerror.js -var require_websocketerror = __commonJS({ - "node_modules/undici/lib/web/websocket/stream/websocketerror.js"(exports, module) { +// node_modules/undici/lib/interceptor/retry.js +var require_retry = __commonJS({ + "node_modules/undici/lib/interceptor/retry.js"(exports, module) { "use strict"; - var { webidl } = require_webidl(); - var { validateCloseCodeAndReason } = require_util5(); - var { kConstruct } = require_symbols(); - var { kEnumerableProperty } = require_util(); - function createInheritableDOMException() { - class Test extends DOMException { - get reason() { - return ""; + var RetryHandler = require_retry_handler(); + module.exports = (globalOpts) => { + return (dispatch) => { + return function retryInterceptor(opts, handler) { + return dispatch( + opts, + new RetryHandler( + { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } }, + { + handler, + dispatch + } + ) + ); + }; + }; + }; + } +}); + +// node_modules/undici/lib/interceptor/dump.js +var require_dump = __commonJS({ + "node_modules/undici/lib/interceptor/dump.js"(exports, module) { + "use strict"; + var { InvalidArgumentError, RequestAbortedError } = require_errors(); + var DecoratorHandler = require_decorator_handler(); + var DumpHandler = class extends DecoratorHandler { + #maxSize = 1024 * 1024; + #dumped = false; + #size = 0; + #controller = null; + aborted = false; + reason = false; + constructor({ maxSize, signal }, handler) { + if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { + throw new InvalidArgumentError("maxSize must be a number greater than 0"); } + super(handler); + this.#maxSize = maxSize ?? this.#maxSize; } - if (new Test().reason !== void 0) { - return DOMException; + #abort(reason) { + this.aborted = true; + this.reason = reason; } - return new Proxy(DOMException, { - construct(target, args, newTarget) { - const instance = Reflect.construct(target, args, target); - Object.setPrototypeOf(instance, newTarget.prototype); - return instance; - } - }); - } - var WebSocketError = class _WebSocketError extends createInheritableDOMException() { - #closeCode; - #reason; - constructor(message = "", init = void 0) { - message = webidl.converters.DOMString(message, "WebSocketError", "message"); - super(message, "WebSocketError"); - if (init === kConstruct) { - return; - } else if (init !== null) { - init = webidl.converters.WebSocketCloseInfo(init); + onRequestStart(controller, context) { + controller.abort = this.#abort.bind(this); + this.#controller = controller; + return super.onRequestStart(controller, context); + } + onResponseStart(controller, statusCode, headers, statusMessage) { + const contentLength = headers["content-length"]; + if (contentLength != null && contentLength > this.#maxSize) { + throw new RequestAbortedError( + `Response size (${contentLength}) larger than maxSize (${this.#maxSize})` + ); } - let code = init.closeCode ?? null; - const reason = init.reason ?? ""; - validateCloseCodeAndReason(code, reason); - if (reason.length !== 0 && code === null) { - code = 1e3; + if (this.aborted === true) { + return true; } - this.#closeCode = code; - this.#reason = reason; + return super.onResponseStart(controller, statusCode, headers, statusMessage); } - get closeCode() { - return this.#closeCode; + onResponseError(controller, err) { + if (this.#dumped) { + return; + } + err = this.#controller?.reason ?? err; + super.onResponseError(controller, err); } - get reason() { - return this.#reason; + onResponseData(controller, chunk) { + this.#size = this.#size + chunk.length; + if (this.#size >= this.#maxSize) { + this.#dumped = true; + if (this.aborted === true) { + super.onResponseError(controller, this.reason); + } else { + super.onResponseEnd(controller, {}); + } + } + return true; } - /** - * @param {string} message - * @param {number|null} code - * @param {string} reason - */ - static createUnvalidatedWebSocketError(message, code, reason) { - const error = new _WebSocketError(message, kConstruct); - error.#closeCode = code; - error.#reason = reason; - return error; + onResponseEnd(controller, trailers) { + if (this.#dumped) { + return; + } + if (this.#controller.aborted === true) { + super.onResponseError(controller, this.reason); + return; + } + super.onResponseEnd(controller, trailers); } }; - var { createUnvalidatedWebSocketError } = WebSocketError; - delete WebSocketError.createUnvalidatedWebSocketError; - Object.defineProperties(WebSocketError.prototype, { - closeCode: kEnumerableProperty, - reason: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "WebSocketError", - writable: false, - enumerable: false, - configurable: true - } - }); - webidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError); - module.exports = { WebSocketError, createUnvalidatedWebSocketError }; + function createDumpInterceptor({ maxSize: defaultMaxSize } = { + maxSize: 1024 * 1024 + }) { + return (dispatch) => { + return function Intercept(opts, handler) { + const { dumpMaxSize = defaultMaxSize } = opts; + const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal }, handler); + return dispatch(opts, dumpHandler); + }; + }; + } + module.exports = createDumpInterceptor; } }); -// node_modules/undici/lib/web/websocket/stream/websocketstream.js -var require_websocketstream = __commonJS({ - "node_modules/undici/lib/web/websocket/stream/websocketstream.js"(exports, module) { +// node_modules/undici/lib/interceptor/dns.js +var require_dns = __commonJS({ + "node_modules/undici/lib/interceptor/dns.js"(exports, module) { "use strict"; - var { environmentSettingsObject } = require_util2(); - var { states, opcodes, sentCloseFrameState } = require_constants6(); - var { webidl } = require_webidl(); - var { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = require_util5(); - var { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = require_connection(); - var { channels } = require_diagnostics(); - var { WebsocketFrameSend } = require_frame(); - var { ByteParser } = require_receiver2(); - var { WebSocketError, createUnvalidatedWebSocketError } = require_websocketerror(); - var { kEnumerableProperty } = require_util(); - var { utf8DecodeBytes } = require_encoding(); - var emittedExperimentalWarning = false; - var WebSocketStream = class { - // Each WebSocketStream object has an associated url , which is a URL record . - /** @type {URL} */ - #url; - // Each WebSocketStream object has an associated opened promise , which is a promise. - /** @type {ReturnType} */ - #openedPromise; - // Each WebSocketStream object has an associated closed promise , which is a promise. - /** @type {ReturnType} */ - #closedPromise; - // Each WebSocketStream object has an associated readable stream , which is a ReadableStream . - /** @type {ReadableStream} */ - #readableStream; - /** @type {ReadableStreamDefaultController} */ - #readableStreamController; - // Each WebSocketStream object has an associated writable stream , which is a WritableStream . - /** @type {WritableStream} */ - #writableStream; - // Each WebSocketStream object has an associated boolean handshake aborted , which is initially false. - #handshakeAborted = false; - /** @type {import('../websocket').Handler} */ - #handler = { - // https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol - onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions), - onMessage: (opcode, data) => this.#onMessage(opcode, data), - onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message), - onParserDrain: () => this.#handler.socket.resume(), - onSocketData: (chunk) => { - if (!this.#parser.write(chunk)) { - this.#handler.socket.pause(); - } - }, - onSocketError: (err) => { - this.#handler.readyState = states.CLOSING; - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(err); - } - this.#handler.socket.destroy(); - }, - onSocketClose: () => this.#onSocketClose(), - onPing: () => { - }, - onPong: () => { - }, - readyState: states.CONNECTING, - socket: null, - closeState: /* @__PURE__ */ new Set(), - controller: null, - wasEverConnected: false - }; - /** @type {import('../receiver').ByteParser} */ - #parser; - constructor(url, options = void 0) { - if (!emittedExperimentalWarning) { - process.emitWarning("WebSocketStream is experimental! Expect it to change at any time.", { - code: "UNDICI-WSS" - }); - emittedExperimentalWarning = true; - } - webidl.argumentLengthCheck(arguments, 1, "WebSocket"); - url = webidl.converters.USVString(url); - if (options !== null) { - options = webidl.converters.WebSocketStreamOptions(options); - } - const baseURL = environmentSettingsObject.settingsObject.baseUrl; - const urlRecord = getURLRecord(url, baseURL); - const protocols = options.protocols; - if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { - throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { - throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + var { isIP } = __require("net"); + var { lookup } = __require("dns"); + var DecoratorHandler = require_decorator_handler(); + var { InvalidArgumentError, InformationalError } = require_errors(); + var maxInt = Math.pow(2, 31) - 1; + function hasSafeIterator(headers) { + const prototype = Object.getPrototypeOf(headers); + const ownIterator = Object.hasOwn(headers, Symbol.iterator); + return ownIterator || prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === "function"; + } + function isHostHeader(key) { + return typeof key === "string" && key.toLowerCase() === "host"; + } + function normalizeHeaders3(headers) { + if (headers == null) { + return null; + } + if (Array.isArray(headers)) { + if (headers.length === 0 || !Array.isArray(headers[0])) { + return headers; } - this.#url = urlRecord.toString(); - this.#openedPromise = Promise.withResolvers(); - this.#closedPromise = Promise.withResolvers(); - if (options.signal != null) { - const signal = options.signal; - if (signal.aborted) { - this.#openedPromise.reject(signal.reason); - this.#closedPromise.reject(signal.reason); - return; + const normalized = []; + for (const header of headers) { + if (Array.isArray(header) && header.length === 2) { + normalized.push(header[0], header[1]); + } else { + normalized.push(header); } - signal.addEventListener("abort", () => { - if (!isEstablished(this.#handler.readyState)) { - failWebsocketConnection(this.#handler); - this.#handler.readyState = states.CLOSING; - this.#openedPromise.reject(signal.reason); - this.#closedPromise.reject(signal.reason); - this.#handshakeAborted = true; - } - }, { once: true }); - } - const client = environmentSettingsObject.settingsObject; - this.#handler.controller = establishWebSocketConnection( - urlRecord, - protocols, - client, - this.#handler, - options - ); - } - // The url getter steps are to return this 's url , serialized . - get url() { - return this.#url.toString(); - } - // The opened getter steps are to return this 's opened promise . - get opened() { - return this.#openedPromise.promise; - } - // The closed getter steps are to return this 's closed promise . - get closed() { - return this.#closedPromise.promise; - } - // The close( closeInfo ) method steps are: - close(closeInfo = void 0) { - if (closeInfo !== null) { - closeInfo = webidl.converters.WebSocketCloseInfo(closeInfo); } - const code = closeInfo.closeCode ?? null; - const reason = closeInfo.reason; - closeWebSocketConnection(this.#handler, code, reason, true); + return normalized; } - #write(chunk) { - chunk = webidl.converters.WebSocketStreamWrite(chunk); - const promise = Promise.withResolvers(); - let data = null; - let opcode = null; - if (webidl.is.BufferSource(chunk)) { - data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk.slice()); - opcode = opcodes.BINARY; - } else { - let string; - try { - string = webidl.converters.DOMString(chunk); - } catch (e7) { - promise.reject(e7); - return promise.promise; + if (typeof headers === "object" && hasSafeIterator(headers)) { + const normalized = []; + for (const header of headers) { + if (Array.isArray(header) && header.length === 2) { + normalized.push(header[0], header[1]); + } else { + normalized.push(header); } - data = new TextEncoder().encode(string); - opcode = opcodes.TEXT; - } - if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { - const frame = new WebsocketFrameSend(data); - this.#handler.socket.write(frame.createFrame(opcode), () => { - promise.resolve(void 0); - }); } - return promise.promise; + return normalized; } - /** @type {import('../websocket').Handler['onConnectionEstablished']} */ - #onConnectionEstablished(response, parsedExtensions) { - this.#handler.socket = response.socket; - const parser = new ByteParser(this.#handler, parsedExtensions); - parser.on("drain", () => this.#handler.onParserDrain()); - parser.on("error", (err) => this.#handler.onParserError(err)); - this.#parser = parser; - this.#handler.readyState = states.OPEN; - const extensions = parsedExtensions ?? ""; - const protocol = response.headersList.get("sec-websocket-protocol") ?? ""; - const readable = new ReadableStream({ - start: (controller) => { - this.#readableStreamController = controller; - }, - cancel: (reason) => this.#cancel(reason) - }); - const writable = new WritableStream({ - write: (chunk) => this.#write(chunk), - close: () => closeWebSocketConnection(this.#handler, null, null), - abort: (reason) => this.#closeUsingReason(reason) - }); - this.#readableStream = readable; - this.#writableStream = writable; - this.#openedPromise.resolve({ - extensions, - protocol, - readable, - writable - }); + return headers; + } + function hasHostHeader(headers) { + if (headers == null) { + return false; } - /** @type {import('../websocket').Handler['onMessage']} */ - #onMessage(type, data) { - if (this.#handler.readyState !== states.OPEN) { - return; + if (Array.isArray(headers)) { + if (headers.length === 0) { + return false; } - let chunk; - if (type === opcodes.TEXT) { - try { - chunk = utf8Decode(data); - } catch { - failWebsocketConnection(this.#handler, "Received invalid UTF-8 in text frame."); - return; + for (let i = 0; i < headers.length; i += 2) { + if (isHostHeader(headers[i])) { + return true; } - } else if (type === opcodes.BINARY) { - chunk = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); } - this.#readableStreamController.enqueue(chunk); + return false; } - /** @type {import('../websocket').Handler['onSocketClose']} */ - #onSocketClose() { - const wasClean = this.#handler.closeState.has(sentCloseFrameState.SENT) && this.#handler.closeState.has(sentCloseFrameState.RECEIVED); - this.#handler.readyState = states.CLOSED; - if (this.#handshakeAborted) { - return; - } - if (!this.#handler.wasEverConnected) { - this.#openedPromise.reject(new WebSocketError("Socket never opened")); - } - const result = this.#parser?.closingInfo; - let code = result?.code ?? 1005; - if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { - code = 1006; - } - const reason = result?.reason == null ? "" : utf8DecodeBytes(Buffer.from(result.reason)); - if (wasClean) { - this.#readableStreamController.close(); - if (!this.#writableStream.locked) { - this.#writableStream.abort(new DOMException("A closed WebSocketStream cannot be written to", "InvalidStateError")); + if (typeof headers === "object") { + for (const key in headers) { + if (isHostHeader(key)) { + return true; } - this.#closedPromise.resolve({ - closeCode: code, - reason - }); - } else { - const error = createUnvalidatedWebSocketError("unclean close", code, reason); - this.#readableStreamController?.error(error); - this.#writableStream?.abort(error); - this.#closedPromise.reject(error); } } - #closeUsingReason(reason) { - let code = null; - let reasonString = ""; - if (webidl.is.WebSocketError(reason)) { - code = reason.closeCode; - reasonString = reason.reason; - } - closeWebSocketConnection(this.#handler, code, reasonString); + return false; + } + function withHostHeader(host, headers) { + const normalizedHeaders = normalizeHeaders3(headers); + if (hasHostHeader(normalizedHeaders)) { + return normalizedHeaders; } - // To cancel a WebSocketStream stream given reason , close using reason giving stream and reason . - #cancel(reason) { - this.#closeUsingReason(reason); + if (Array.isArray(normalizedHeaders)) { + return ["host", host, ...normalizedHeaders]; } - }; - Object.defineProperties(WebSocketStream.prototype, { - url: kEnumerableProperty, - opened: kEnumerableProperty, - closed: kEnumerableProperty, - close: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "WebSocketStream", - writable: false, - enumerable: false, - configurable: true + if (normalizedHeaders && typeof normalizedHeaders === "object") { + return { + host, + ...normalizedHeaders + }; } - }); - webidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([ - { - key: "protocols", - converter: webidl.sequenceConverter(webidl.converters.USVString), - defaultValue: () => [] - }, - { - key: "signal", - converter: webidl.nullableConverter(webidl.converters.AbortSignal), - defaultValue: () => null + return { host }; + } + var DNSStorage = class { + #maxItems = 0; + #records = /* @__PURE__ */ new Map(); + constructor(opts) { + this.#maxItems = opts.maxItems; + } + get size() { + return this.#records.size; } - ]); - webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([ - { - key: "closeCode", - converter: (V) => webidl.converters["unsigned short"](V, webidl.attributes.EnforceRange) - }, - { - key: "reason", - converter: webidl.converters.USVString, - defaultValue: () => "" + get(hostname) { + return this.#records.get(hostname) ?? null; } - ]); - webidl.converters.WebSocketStreamWrite = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); + set(hostname, records) { + this.#records.set(hostname, records); } - return webidl.converters.BufferSource(V); - }; - module.exports = { WebSocketStream }; - } -}); - -// node_modules/undici/lib/web/eventsource/util.js -var require_util6 = __commonJS({ - "node_modules/undici/lib/web/eventsource/util.js"(exports, module) { - "use strict"; - function isValidLastEventId(value) { - return value.indexOf("\0") === -1; - } - function isASCIINumber(value) { - if (value.length === 0) return false; - for (let i = 0; i < value.length; i++) { - if (value.charCodeAt(i) < 48 || value.charCodeAt(i) > 57) return false; + delete(hostname) { + this.#records.delete(hostname); + } + // Delegate to storage decide can we do more lookups or not + full() { + return this.size >= this.#maxItems; } - return true; - } - module.exports = { - isValidLastEventId, - isASCIINumber }; - } -}); - -// node_modules/undici/lib/web/eventsource/eventsource-stream.js -var require_eventsource_stream = __commonJS({ - "node_modules/undici/lib/web/eventsource/eventsource-stream.js"(exports, module) { - "use strict"; - var { Transform } = __require("stream"); - var { isASCIINumber, isValidLastEventId } = require_util6(); - var BOM = [239, 187, 191]; - var LF = 10; - var CR = 13; - var COLON = 58; - var SPACE = 32; - var EventSourceStream = class extends Transform { - /** - * @type {eventSourceSettings} - */ - state; - /** - * Leading byte-order-mark check. - * @type {boolean} - */ - checkBOM = true; - /** - * @type {boolean} - */ - crlfCheck = false; - /** - * @type {boolean} - */ - eventEndCheck = false; - /** - * @type {Buffer|null} - */ - buffer = null; - pos = 0; - event = { - data: void 0, - event: void 0, - id: void 0, - retry: void 0 - }; - /** - * @param {object} options - * @param {boolean} [options.readableObjectMode] - * @param {eventSourceSettings} [options.eventSourceSettings] - * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push] - */ - constructor(options = {}) { - options.readableObjectMode = true; - super(options); - this.state = options.eventSourceSettings || {}; - if (options.push) { - this.push = options.push; - } + var DNSInstance = class { + #maxTTL = 0; + #maxItems = 0; + dualStack = true; + affinity = null; + lookup = null; + pick = null; + storage = null; + constructor(opts) { + this.#maxTTL = opts.maxTTL; + this.#maxItems = opts.maxItems; + this.dualStack = opts.dualStack; + this.affinity = opts.affinity; + this.lookup = opts.lookup ?? this.#defaultLookup; + this.pick = opts.pick ?? this.#defaultPick; + this.storage = opts.storage ?? new DNSStorage(opts); } - /** - * @param {Buffer} chunk - * @param {string} _encoding - * @param {Function} callback - * @returns {void} - */ - _transform(chunk, _encoding, callback) { - if (chunk.length === 0) { - callback(); + runLookup(origin, opts, cb) { + const ips = this.storage.get(origin.hostname); + if (ips == null && this.storage.full()) { + cb(null, origin); return; } - if (this.buffer) { - this.buffer = Buffer.concat([this.buffer, chunk]); - } else { - this.buffer = chunk; - } - if (this.checkBOM) { - switch (this.buffer.length) { - case 1: - if (this.buffer[0] === BOM[0]) { - callback(); - return; - } - this.checkBOM = false; - callback(); + const newOpts = { + affinity: this.affinity, + dualStack: this.dualStack, + lookup: this.lookup, + pick: this.pick, + ...opts.dns, + maxTTL: this.#maxTTL, + maxItems: this.#maxItems + }; + if (ips == null) { + this.lookup(origin, newOpts, (err, addresses) => { + if (err || addresses == null || addresses.length === 0) { + cb(err ?? new InformationalError("No DNS entries found")); return; - case 2: - if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1]) { - callback(); - return; - } - this.checkBOM = false; - break; - case 3: - if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1] && this.buffer[2] === BOM[2]) { - this.buffer = Buffer.alloc(0); - this.checkBOM = false; - callback(); - return; - } - this.checkBOM = false; - break; - default: - if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1] && this.buffer[2] === BOM[2]) { - this.buffer = this.buffer.subarray(3); - } - this.checkBOM = false; - break; + } + this.setRecords(origin, addresses); + const records = this.storage.get(origin.hostname); + const ip = this.pick( + origin, + records, + newOpts.affinity + ); + let port; + if (typeof ip.port === "number") { + port = `:${ip.port}`; + } else if (origin.port !== "") { + port = `:${origin.port}`; + } else { + port = ""; + } + cb( + null, + new URL(`${origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`) + ); + }); + } else { + const ip = this.pick( + origin, + ips, + newOpts.affinity + ); + if (ip == null) { + this.storage.delete(origin.hostname); + this.runLookup(origin, opts, cb); + return; + } + let port; + if (typeof ip.port === "number") { + port = `:${ip.port}`; + } else if (origin.port !== "") { + port = `:${origin.port}`; + } else { + port = ""; } + cb( + null, + new URL(`${origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`) + ); } - while (this.pos < this.buffer.length) { - if (this.eventEndCheck) { - if (this.crlfCheck) { - if (this.buffer[this.pos] === LF) { - this.buffer = this.buffer.subarray(this.pos + 1); - this.pos = 0; - this.crlfCheck = false; - continue; - } - this.crlfCheck = false; + } + #defaultLookup(origin, opts, cb) { + lookup( + origin.hostname, + { + all: true, + family: this.dualStack === false ? this.affinity : 0, + order: "ipv4first" + }, + (err, addresses) => { + if (err) { + return cb(err); } - if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { - if (this.buffer[this.pos] === CR) { - this.crlfCheck = true; - } - this.buffer = this.buffer.subarray(this.pos + 1); - this.pos = 0; - if (this.event.data !== void 0 || this.event.event || this.event.id !== void 0 || this.event.retry) { - this.processEvent(this.event); - } - this.clearEvent(); - continue; + const results = /* @__PURE__ */ new Map(); + for (const addr of addresses) { + results.set(`${addr.address}:${addr.family}`, addr); } - this.eventEndCheck = false; - continue; + cb(null, results.values()); } - if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { - if (this.buffer[this.pos] === CR) { - this.crlfCheck = true; + ); + } + #defaultPick(origin, hostnameRecords, affinity) { + let ip = null; + const { records, offset } = hostnameRecords; + let family; + if (this.dualStack) { + if (affinity == null) { + if (offset == null || offset === maxInt) { + hostnameRecords.offset = 0; + affinity = 4; + } else { + hostnameRecords.offset++; + affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4; } - this.parseLine(this.buffer.subarray(0, this.pos), this.event); - this.buffer = this.buffer.subarray(this.pos + 1); - this.pos = 0; - this.eventEndCheck = true; - continue; } - this.pos++; - } - callback(); - } - /** - * @param {Buffer} line - * @param {EventSourceStreamEvent} event - */ - parseLine(line, event) { - if (line.length === 0) { - return; - } - const colonPosition = line.indexOf(COLON); - if (colonPosition === 0) { - return; - } - let field = ""; - let value = ""; - if (colonPosition !== -1) { - field = line.subarray(0, colonPosition).toString("utf8"); - let valueStart = colonPosition + 1; - if (line[valueStart] === SPACE) { - ++valueStart; + if (records[affinity] != null && records[affinity].ips.length > 0) { + family = records[affinity]; + } else { + family = records[affinity === 4 ? 6 : 4]; } - value = line.subarray(valueStart).toString("utf8"); } else { - field = line.toString("utf8"); - value = ""; + family = records[affinity]; } - switch (field) { - case "data": - if (event[field] === void 0) { - event[field] = value; - } else { - event[field] += ` -${value}`; - } - break; - case "retry": - if (isASCIINumber(value)) { - event[field] = value; - } - break; - case "id": - if (isValidLastEventId(value)) { - event[field] = value; - } - break; - case "event": - if (value.length > 0) { - event[field] = value; - } - break; + if (family == null || family.ips.length === 0) { + return ip; } - } - /** - * @param {EventSourceStreamEvent} event - */ - processEvent(event) { - if (event.retry && isASCIINumber(event.retry)) { - this.state.reconnectionTime = parseInt(event.retry, 10); + if (family.offset == null || family.offset === maxInt) { + family.offset = 0; + } else { + family.offset++; } - if (event.id !== void 0 && isValidLastEventId(event.id)) { - this.state.lastEventId = event.id; + const position = family.offset % family.ips.length; + ip = family.ips[position] ?? null; + if (ip == null) { + return ip; } - if (event.data !== void 0) { - this.push({ - type: event.event || "message", - options: { - data: event.data, - lastEventId: this.state.lastEventId, - origin: this.state.origin - } - }); + if (Date.now() - ip.timestamp > ip.ttl) { + family.ips.splice(position, 1); + return this.pick(origin, hostnameRecords, affinity); } + return ip; } - clearEvent() { - this.event = { - data: void 0, - event: void 0, - id: void 0, - retry: void 0 - }; - } - }; - module.exports = { - EventSourceStream - }; - } -}); - -// node_modules/undici/lib/web/eventsource/eventsource.js -var require_eventsource = __commonJS({ - "node_modules/undici/lib/web/eventsource/eventsource.js"(exports, module) { - "use strict"; - var { pipeline } = __require("stream"); - var { fetching } = require_fetch(); - var { makeRequest } = require_request2(); - var { webidl } = require_webidl(); - var { EventSourceStream } = require_eventsource_stream(); - var { parseMIMEType } = require_data_url(); - var { createFastMessageEvent } = require_events(); - var { isNetworkError } = require_response(); - var { kEnumerableProperty } = require_util(); - var { environmentSettingsObject } = require_util2(); - var experimentalWarned = false; - var defaultReconnectionTime = 3e3; - var CONNECTING = 0; - var OPEN = 1; - var CLOSED = 2; - var ANONYMOUS = "anonymous"; - var USE_CREDENTIALS = "use-credentials"; - var EventSource = class _EventSource extends EventTarget { - #events = { - open: null, - error: null, - message: null - }; - #url; - #withCredentials = false; - /** - * @type {ReadyState} - */ - #readyState = CONNECTING; - #request = null; - #controller = null; - #dispatcher; - /** - * @type {import('./eventsource-stream').eventSourceSettings} - */ - #state; - /** - * Creates a new EventSource object. - * @param {string} url - * @param {EventSourceInit} [eventSourceInitDict={}] - * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface - */ - constructor(url, eventSourceInitDict = {}) { - super(); - webidl.util.markAsUncloneable(this); - const prefix = "EventSource constructor"; - webidl.argumentLengthCheck(arguments, 1, prefix); - if (!experimentalWarned) { - experimentalWarned = true; - process.emitWarning("EventSource is experimental, expect them to change at any time.", { - code: "UNDICI-ES" - }); + pickFamily(origin, ipFamily) { + const records = this.storage.get(origin.hostname)?.records; + if (!records) { + return null; } - url = webidl.converters.USVString(url); - eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, "eventSourceInitDict"); - this.#dispatcher = eventSourceInitDict.node.dispatcher || eventSourceInitDict.dispatcher; - this.#state = { - lastEventId: "", - reconnectionTime: eventSourceInitDict.node.reconnectionTime - }; - const settings = environmentSettingsObject; - let urlRecord; - try { - urlRecord = new URL(url, settings.settingsObject.baseUrl); - this.#state.origin = urlRecord.origin; - } catch (e7) { - throw new DOMException(e7, "SyntaxError"); + const family = records[ipFamily]; + if (!family) { + return null; } - this.#url = urlRecord.href; - let corsAttributeState = ANONYMOUS; - if (eventSourceInitDict.withCredentials === true) { - corsAttributeState = USE_CREDENTIALS; - this.#withCredentials = true; + if (family.offset == null || family.offset === maxInt) { + family.offset = 0; + } else { + family.offset++; } - const initRequest = { - redirect: "follow", - keepalive: true, - // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes - mode: "cors", - credentials: corsAttributeState === "anonymous" ? "same-origin" : "omit", - referrer: "no-referrer" - }; - initRequest.client = environmentSettingsObject.settingsObject; - initRequest.headersList = [["accept", { name: "accept", value: "text/event-stream" }]]; - initRequest.cache = "no-store"; - initRequest.initiator = "other"; - initRequest.urlList = [new URL(this.#url)]; - this.#request = makeRequest(initRequest); - this.#connect(); + const position = family.offset % family.ips.length; + const ip = family.ips[position] ?? null; + if (ip == null) { + return ip; + } + if (Date.now() - ip.timestamp > ip.ttl) { + family.ips.splice(position, 1); + } + return ip; + } + setRecords(origin, addresses) { + const timestamp = Date.now(); + const records = { records: { 4: null, 6: null } }; + let minTTL = this.#maxTTL; + for (const record of addresses) { + record.timestamp = timestamp; + if (typeof record.ttl === "number") { + record.ttl = Math.min(record.ttl, this.#maxTTL); + minTTL = Math.min(minTTL, record.ttl); + } else { + record.ttl = this.#maxTTL; + } + const familyRecords = records.records[record.family] ?? { ips: [] }; + familyRecords.ips.push(record); + records.records[record.family] = familyRecords; + } + this.storage.set(origin.hostname, records, { ttl: minTTL }); } - /** - * Returns the state of this EventSource object's connection. It can have the - * values described below. - * @returns {ReadyState} - * @readonly - */ - get readyState() { - return this.#readyState; + deleteRecords(origin) { + this.storage.delete(origin.hostname); } - /** - * Returns the URL providing the event stream. - * @readonly - * @returns {string} - */ - get url() { - return this.#url; + getHandler(meta, opts) { + return new DNSDispatchHandler(this, meta, opts); } - /** - * Returns a boolean indicating whether the EventSource object was - * instantiated with CORS credentials set (true), or not (false, the default). - */ - get withCredentials() { - return this.#withCredentials; + }; + var DNSDispatchHandler = class extends DecoratorHandler { + #state = null; + #opts = null; + #dispatch = null; + #origin = null; + #controller = null; + #newOrigin = null; + #firstTry = true; + constructor(state, { origin, handler, dispatch, newOrigin }, opts) { + super(handler); + this.#origin = origin; + this.#newOrigin = newOrigin; + this.#opts = { ...opts }; + this.#state = state; + this.#dispatch = dispatch; } - #connect() { - if (this.#readyState === CLOSED) return; - this.#readyState = CONNECTING; - const fetchParams = { - request: this.#request, - dispatcher: this.#dispatcher - }; - const processEventSourceEndOfBody = (response) => { - if (!isNetworkError(response)) { - return this.#reconnect(); - } - }; - fetchParams.processResponseEndOfBody = processEventSourceEndOfBody; - fetchParams.processResponse = (response) => { - if (isNetworkError(response)) { - if (response.aborted) { - this.close(); - this.dispatchEvent(new Event("error")); - return; - } else { - this.#reconnect(); - return; - } - } - const contentType = response.headersList.get("content-type", true); - const mimeType = contentType !== null ? parseMIMEType(contentType) : "failure"; - const contentTypeValid = mimeType !== "failure" && mimeType.essence === "text/event-stream"; - if (response.status !== 200 || contentTypeValid === false) { - this.close(); - this.dispatchEvent(new Event("error")); - return; - } - this.#readyState = OPEN; - this.dispatchEvent(new Event("open")); - this.#state.origin = response.urlList[response.urlList.length - 1].origin; - const eventSourceStream = new EventSourceStream({ - eventSourceSettings: this.#state, - push: (event) => { - this.dispatchEvent(createFastMessageEvent( - event.type, - event.options - )); - } - }); - pipeline( - response.body.stream, - eventSourceStream, - (error) => { - if (error?.aborted === false) { - this.close(); - this.dispatchEvent(new Event("error")); + onResponseError(controller, err) { + switch (err.code) { + case "ETIMEDOUT": + case "ECONNREFUSED": { + if (this.#state.dualStack) { + if (!this.#firstTry) { + super.onResponseError(controller, err); + return; + } + this.#firstTry = false; + const otherFamily = this.#newOrigin.hostname[0] === "[" ? 4 : 6; + const ip = this.#state.pickFamily(this.#origin, otherFamily); + if (ip == null) { + super.onResponseError(controller, err); + return; + } + let port; + if (typeof ip.port === "number") { + port = `:${ip.port}`; + } else if (this.#origin.port !== "") { + port = `:${this.#origin.port}`; + } else { + port = ""; } + const dispatchOpts = { + ...this.#opts, + origin: `${this.#origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`, + headers: withHostHeader(this.#origin.host, this.#opts.headers) + }; + this.#dispatch(dispatchOpts, this); + return; } - ); - }; - this.#controller = fetching(fetchParams); - } - /** - * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model - * @returns {void} - */ - #reconnect() { - if (this.#readyState === CLOSED) return; - this.#readyState = CONNECTING; - this.dispatchEvent(new Event("error")); - setTimeout(() => { - if (this.#readyState !== CONNECTING) return; - if (this.#state.lastEventId.length) { - this.#request.headersList.set("last-event-id", this.#state.lastEventId, true); + super.onResponseError(controller, err); + break; } - this.#connect(); - }, this.#state.reconnectionTime)?.unref(); + case "ENOTFOUND": + this.#state.deleteRecords(this.#origin); + super.onResponseError(controller, err); + break; + default: + super.onResponseError(controller, err); + break; + } } - /** - * Closes the connection, if any, and sets the readyState attribute to - * CLOSED. - */ - close() { - webidl.brandCheck(this, _EventSource); - if (this.#readyState === CLOSED) return; - this.#readyState = CLOSED; - this.#controller.abort(); - this.#request = null; + }; + module.exports = (interceptorOpts) => { + if (interceptorOpts?.maxTTL != null && (typeof interceptorOpts?.maxTTL !== "number" || interceptorOpts?.maxTTL < 0)) { + throw new InvalidArgumentError("Invalid maxTTL. Must be a positive number"); } - get onopen() { - return this.#events.open; + if (interceptorOpts?.maxItems != null && (typeof interceptorOpts?.maxItems !== "number" || interceptorOpts?.maxItems < 1)) { + throw new InvalidArgumentError( + "Invalid maxItems. Must be a positive number and greater than zero" + ); } - set onopen(fn) { - if (this.#events.open) { - this.removeEventListener("open", this.#events.open); - } - const listener = webidl.converters.EventHandlerNonNull(fn); - if (listener !== null) { - this.addEventListener("open", listener); - this.#events.open = fn; - } else { - this.#events.open = null; - } + if (interceptorOpts?.affinity != null && interceptorOpts?.affinity !== 4 && interceptorOpts?.affinity !== 6) { + throw new InvalidArgumentError("Invalid affinity. Must be either 4 or 6"); } - get onmessage() { - return this.#events.message; + if (interceptorOpts?.dualStack != null && typeof interceptorOpts?.dualStack !== "boolean") { + throw new InvalidArgumentError("Invalid dualStack. Must be a boolean"); } - set onmessage(fn) { - if (this.#events.message) { - this.removeEventListener("message", this.#events.message); - } - const listener = webidl.converters.EventHandlerNonNull(fn); - if (listener !== null) { - this.addEventListener("message", listener); - this.#events.message = fn; - } else { - this.#events.message = null; - } + if (interceptorOpts?.lookup != null && typeof interceptorOpts?.lookup !== "function") { + throw new InvalidArgumentError("Invalid lookup. Must be a function"); } - get onerror() { - return this.#events.error; + if (interceptorOpts?.pick != null && typeof interceptorOpts?.pick !== "function") { + throw new InvalidArgumentError("Invalid pick. Must be a function"); } - set onerror(fn) { - if (this.#events.error) { - this.removeEventListener("error", this.#events.error); - } - const listener = webidl.converters.EventHandlerNonNull(fn); - if (listener !== null) { - this.addEventListener("error", listener); - this.#events.error = fn; - } else { - this.#events.error = null; - } + if (interceptorOpts?.storage != null && (typeof interceptorOpts?.storage?.get !== "function" || typeof interceptorOpts?.storage?.set !== "function" || typeof interceptorOpts?.storage?.full !== "function" || typeof interceptorOpts?.storage?.delete !== "function")) { + throw new InvalidArgumentError("Invalid storage. Must be a object with methods: { get, set, full, delete }"); } - }; - var constantsPropertyDescriptors = { - CONNECTING: { - __proto__: null, - configurable: false, - enumerable: true, - value: CONNECTING, - writable: false - }, - OPEN: { - __proto__: null, - configurable: false, - enumerable: true, - value: OPEN, - writable: false - }, - CLOSED: { - __proto__: null, - configurable: false, - enumerable: true, - value: CLOSED, - writable: false + const dualStack = interceptorOpts?.dualStack ?? true; + let affinity; + if (dualStack) { + affinity = interceptorOpts?.affinity ?? null; + } else { + affinity = interceptorOpts?.affinity ?? 4; } - }; - Object.defineProperties(EventSource, constantsPropertyDescriptors); - Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors); - Object.defineProperties(EventSource.prototype, { - close: kEnumerableProperty, - onerror: kEnumerableProperty, - onmessage: kEnumerableProperty, - onopen: kEnumerableProperty, - readyState: kEnumerableProperty, - url: kEnumerableProperty, - withCredentials: kEnumerableProperty - }); - webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ - { - key: "withCredentials", - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: "dispatcher", - // undici only - converter: webidl.converters.any - }, - { - key: "node", - // undici only - converter: webidl.dictionaryConverter([ - { - key: "reconnectionTime", - converter: webidl.converters["unsigned long"], - defaultValue: () => defaultReconnectionTime - }, - { - key: "dispatcher", - converter: webidl.converters.any + const opts = { + maxTTL: interceptorOpts?.maxTTL ?? 1e4, + // Expressed in ms + lookup: interceptorOpts?.lookup ?? null, + pick: interceptorOpts?.pick ?? null, + dualStack, + affinity, + maxItems: interceptorOpts?.maxItems ?? Infinity, + storage: interceptorOpts?.storage + }; + const instance = new DNSInstance(opts); + return (dispatch) => { + return function dnsInterceptor(origDispatchOpts, handler) { + const origin = origDispatchOpts.origin.constructor === URL ? origDispatchOpts.origin : new URL(origDispatchOpts.origin); + if (isIP(origin.hostname) !== 0) { + return dispatch(origDispatchOpts, handler); } - ]), - defaultValue: () => ({}) - } - ]); - module.exports = { - EventSource, - defaultReconnectionTime + instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { + if (err) { + return handler.onResponseError(null, err); + } + const dispatchOpts = { + ...origDispatchOpts, + servername: origin.hostname, + // For SNI on TLS + origin: newOrigin.origin, + headers: withHostHeader(origin.host, origDispatchOpts.headers) + }; + dispatch( + dispatchOpts, + instance.getHandler( + { origin, dispatch, handler, newOrigin }, + origDispatchOpts + ) + ); + }); + return true; + }; + }; }; } }); -// node_modules/undici/index.js -var require_undici = __commonJS({ - "node_modules/undici/index.js"(exports, module) { +// node_modules/undici/lib/util/cache.js +var require_cache = __commonJS({ + "node_modules/undici/lib/util/cache.js"(exports, module) { "use strict"; - var Client = require_client(); - var Dispatcher = require_dispatcher(); - var Pool = require_pool(); - var BalancedPool = require_balanced_pool(); - var RoundRobinPool = require_round_robin_pool(); - var Agent = require_agent(); - var Dispatcher1Wrapper = require_dispatcher1_wrapper(); - var ProxyAgent = require_proxy_agent(); - var Socks5ProxyAgent = require_socks5_proxy_agent(); - var EnvHttpProxyAgent = require_env_http_proxy_agent(); - var RetryAgent = require_retry_agent(); - var H2CClient = require_h2c_client(); - var errors = require_errors(); - var util2 = require_util(); - var { InvalidArgumentError } = errors; - var api = require_api(); - var buildConnector = require_connect(); - var MockClient = require_mock_client(); - var { MockCallHistory, MockCallHistoryLog } = require_mock_call_history(); - var MockAgent = require_mock_agent(); - var MockPool = require_mock_pool(); - var SnapshotAgent = require_snapshot_agent(); - var mockErrors = require_mock_errors(); - var RetryHandler = require_retry_handler(); - var { getGlobalDispatcher, setGlobalDispatcher } = require_global2(); - var DecoratorHandler = require_decorator_handler(); - var RedirectHandler = require_redirect_handler(); - Object.assign(Dispatcher.prototype, api); - module.exports.Dispatcher = Dispatcher; - module.exports.Client = Client; - module.exports.Pool = Pool; - module.exports.BalancedPool = BalancedPool; - module.exports.RoundRobinPool = RoundRobinPool; - module.exports.Agent = Agent; - module.exports.Dispatcher1Wrapper = Dispatcher1Wrapper; - module.exports.ProxyAgent = ProxyAgent; - module.exports.Socks5ProxyAgent = Socks5ProxyAgent; - module.exports.EnvHttpProxyAgent = EnvHttpProxyAgent; - module.exports.RetryAgent = RetryAgent; - module.exports.H2CClient = H2CClient; - module.exports.RetryHandler = RetryHandler; - module.exports.DecoratorHandler = DecoratorHandler; - module.exports.RedirectHandler = RedirectHandler; - module.exports.interceptors = { - redirect: require_redirect(), - responseError: require_response_error(), - retry: require_retry(), - dump: require_dump(), - dns: require_dns(), - cache: require_cache2(), - decompress: require_decompress(), - deduplicate: require_deduplicate() - }; - module.exports.cacheStores = { - MemoryCacheStore: require_memory_cache_store() - }; - var SqliteCacheStore = require_sqlite_cache_store(); - module.exports.cacheStores.SqliteCacheStore = SqliteCacheStore; - module.exports.buildConnector = buildConnector; - module.exports.errors = errors; - module.exports.util = { - parseHeaders: util2.parseHeaders, - headerNameToString: util2.headerNameToString - }; - function makeDispatcher(fn) { - return (url, opts, handler) => { - if (typeof opts === "function") { - handler = opts; - opts = null; + var { + safeHTTPMethods, + pathHasQueryOrFragment, + hasSafeIterator + } = require_util(); + var { serializePathWithQuery } = require_util(); + function makeCacheKey(opts) { + if (!opts.origin) { + throw new Error("opts.origin is undefined"); + } + let fullPath = opts.path || "/"; + if (opts.query && !pathHasQueryOrFragment(opts.path)) { + fullPath = serializePathWithQuery(fullPath, opts.query); + } + return { + origin: opts.origin.toString(), + method: opts.method, + path: fullPath, + headers: opts.headers + }; + } + function normalizeHeaders3(opts) { + let headers; + if (opts.headers == null) { + headers = {}; + } else if (typeof opts.headers === "object") { + headers = {}; + if (hasSafeIterator(opts.headers)) { + for (const x of opts.headers) { + if (!Array.isArray(x)) { + throw new Error("opts.headers is not a valid header map"); + } + const [key, val] = x; + if (typeof key !== "string" || typeof val !== "string") { + throw new Error("opts.headers is not a valid header map"); + } + headers[key.toLowerCase()] = val; + } + } else { + for (const key of Object.keys(opts.headers)) { + headers[key.toLowerCase()] = opts.headers[key]; + } } - if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { - throw new InvalidArgumentError("invalid url"); + } else { + throw new Error("opts.headers is not an object"); + } + return headers; + } + function assertCacheKey(key) { + if (typeof key !== "object") { + throw new TypeError(`expected key to be object, got ${typeof key}`); + } + for (const property of ["origin", "method", "path"]) { + if (typeof key[property] !== "string") { + throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`); } - if (opts != null && typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); + } + if (key.headers !== void 0 && typeof key.headers !== "object") { + throw new TypeError(`expected headers to be object, got ${typeof key}`); + } + } + function assertCacheValue(value) { + if (typeof value !== "object") { + throw new TypeError(`expected value to be object, got ${typeof value}`); + } + for (const property of ["statusCode", "cachedAt", "staleAt", "deleteAt"]) { + if (typeof value[property] !== "number") { + throw new TypeError(`expected value.${property} to be number, got ${typeof value[property]}`); } - if (opts && opts.path != null) { - if (typeof opts.path !== "string") { - throw new InvalidArgumentError("invalid opts.path"); - } - let path = opts.path; - if (!opts.path.startsWith("/")) { - path = `/${path}`; - } - url = new URL(util2.parseOrigin(url).origin + path); + } + if (typeof value.statusMessage !== "string") { + throw new TypeError(`expected value.statusMessage to be string, got ${typeof value.statusMessage}`); + } + if (value.headers != null && typeof value.headers !== "object") { + throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value.headers}`); + } + if (value.vary !== void 0 && typeof value.vary !== "object") { + throw new TypeError(`expected value.vary to be object, got ${typeof value.vary}`); + } + if (value.etag !== void 0 && typeof value.etag !== "string") { + throw new TypeError(`expected value.etag to be string, got ${typeof value.etag}`); + } + } + function parseCacheControlHeader(header) { + const output = {}; + let directives; + if (Array.isArray(header)) { + directives = []; + for (const directive of header) { + directives.push(...directive.split(",")); + } + } else { + directives = header.split(","); + } + for (let i = 0; i < directives.length; i++) { + const directive = directives[i].toLowerCase(); + const keyValueDelimiter = directive.indexOf("="); + let key; + let value; + if (keyValueDelimiter !== -1) { + key = directive.substring(0, keyValueDelimiter).trimStart(); + value = directive.substring(keyValueDelimiter + 1); } else { - if (!opts) { - opts = typeof url === "object" ? url : {}; + key = directive.trim(); + } + switch (key) { + case "min-fresh": + case "max-stale": + case "max-age": + case "s-maxage": + case "stale-while-revalidate": + case "stale-if-error": { + if (value === void 0 || value[0] === " ") { + continue; + } + if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') { + value = value.substring(1, value.length - 1); + } + const parsedValue = parseInt(value, 10); + if (parsedValue !== parsedValue) { + continue; + } + if (key === "max-age" && key in output && output[key] >= parsedValue) { + continue; + } + output[key] = parsedValue; + break; } - url = util2.parseURL(url); + case "private": + case "no-cache": { + if (value) { + if (value[0] === '"') { + const headers = [value.substring(1)]; + let foundEndingQuote = value[value.length - 1] === '"'; + if (!foundEndingQuote) { + for (let j = i + 1; j < directives.length; j++) { + const nextPart = directives[j]; + const nextPartLength = nextPart.length; + headers.push(nextPart.trim()); + if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '"') { + foundEndingQuote = true; + break; + } + } + } + if (foundEndingQuote) { + let lastHeader = headers[headers.length - 1]; + if (lastHeader[lastHeader.length - 1] === '"') { + lastHeader = lastHeader.substring(0, lastHeader.length - 1); + headers[headers.length - 1] = lastHeader; + } + if (key in output) { + output[key] = output[key].concat(headers); + } else { + output[key] = headers; + } + } + } else { + if (key in output) { + output[key] = output[key].concat(value); + } else { + output[key] = [value]; + } + } + break; + } + } + // eslint-disable-next-line no-fallthrough + case "public": + case "no-store": + case "must-revalidate": + case "proxy-revalidate": + case "immutable": + case "no-transform": + case "must-understand": + case "only-if-cached": + if (value) { + continue; + } + output[key] = true; + break; + default: + continue; } - const { agent, dispatcher = getGlobalDispatcher(), ...restOpts } = opts; - if (agent) { - throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); + } + return output; + } + function parseVaryHeader(varyHeader, headers) { + if (typeof varyHeader === "string" && varyHeader.includes("*")) { + return headers; + } + const output = ( + /** @type {Record} */ + {} + ); + const varyingHeaders = typeof varyHeader === "string" ? varyHeader.split(",") : varyHeader; + for (const header of varyingHeaders) { + const trimmedHeader = header.trim().toLowerCase(); + output[trimmedHeader] = headers[trimmedHeader] ?? null; + } + return output; + } + function isEtagUsable(etag) { + if (etag.length <= 2) { + return false; + } + if (etag[0] === '"' && etag[etag.length - 1] === '"') { + return !(etag[1] === '"' || etag.startsWith('"W/')); + } + if (etag.startsWith('W/"') && etag[etag.length - 1] === '"') { + return etag.length !== 4; + } + return false; + } + function assertCacheStore(store, name = "CacheStore") { + if (typeof store !== "object" || store === null) { + throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store === null ? "null" : typeof store}`); + } + for (const fn of ["get", "createWriteStream", "delete"]) { + if (typeof store[fn] !== "function") { + throw new TypeError(`${name} needs to have a \`${fn}()\` function`); } - return fn.call(dispatcher, { - ...restOpts, - origin: url.origin, - path: url.search ? `${url.pathname}${url.search}` : url.pathname, - method: opts.method || (opts.body ? "PUT" : "GET") - }, handler); - }; + } } - module.exports.setGlobalDispatcher = setGlobalDispatcher; - module.exports.getGlobalDispatcher = getGlobalDispatcher; - var fetchImpl = require_fetch().fetch; - var currentFilename = typeof __filename !== "undefined" ? __filename : void 0; - function appendFetchStackTrace(err, filename) { - if (!err || typeof err !== "object") { - return; + function assertCacheMethods(methods, name = "CacheMethods") { + if (!Array.isArray(methods)) { + throw new TypeError(`expected type of ${name} needs to be an array, got ${methods === null ? "null" : typeof methods}`); } - const stack = typeof err.stack === "string" ? err.stack : ""; - const normalizedFilename = filename.replace(/\\/g, "/"); - if (stack && (stack.includes(filename) || stack.includes(normalizedFilename))) { - return; + if (methods.length === 0) { + throw new TypeError(`${name} needs to have at least one method`); } - const capture = {}; - Error.captureStackTrace(capture, appendFetchStackTrace); - if (!capture.stack) { - return; + for (const method of methods) { + if (!safeHTTPMethods.includes(method)) { + throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`); + } } - const captureLines = capture.stack.split("\n").slice(1).join("\n"); - err.stack = stack ? `${stack} -${captureLines}` : capture.stack; } - module.exports.fetch = function fetch2(init, options = void 0) { - return fetchImpl(init, options).catch((err) => { - if (currentFilename) { - appendFetchStackTrace(err, currentFilename); - } else if (err && typeof err === "object") { - Error.captureStackTrace(err, module.exports.fetch); + function makeDeduplicationKey(cacheKey2, excludeHeaders) { + const headers = {}; + if (cacheKey2.headers) { + const sortedHeaders = Object.keys(cacheKey2.headers).sort(); + for (const header of sortedHeaders) { + if (excludeHeaders?.has(header.toLowerCase())) { + continue; + } + headers[header] = cacheKey2.headers[header]; } - throw err; - }); - }; - module.exports.Headers = require_headers().Headers; - module.exports.Response = require_response().Response; - module.exports.Request = require_request2().Request; - module.exports.FormData = require_formdata().FormData; - var { setGlobalOrigin, getGlobalOrigin } = require_global(); - module.exports.setGlobalOrigin = setGlobalOrigin; - module.exports.getGlobalOrigin = getGlobalOrigin; - var { CacheStorage } = require_cachestorage(); - var { kConstruct } = require_symbols(); - module.exports.caches = new CacheStorage(kConstruct); - var { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = require_cookies(); - module.exports.deleteCookie = deleteCookie; - module.exports.getCookies = getCookies; - module.exports.getSetCookies = getSetCookies; - module.exports.setCookie = setCookie; - module.exports.parseCookie = parseCookie; - var { parseMIMEType, serializeAMimeType } = require_data_url(); - module.exports.parseMIMEType = parseMIMEType; - module.exports.serializeAMimeType = serializeAMimeType; - var { CloseEvent, ErrorEvent, MessageEvent } = require_events(); - var { WebSocket: WebSocket2, ping } = require_websocket2(); - module.exports.WebSocket = WebSocket2; - module.exports.CloseEvent = CloseEvent; - module.exports.ErrorEvent = ErrorEvent; - module.exports.MessageEvent = MessageEvent; - module.exports.ping = ping; - module.exports.WebSocketStream = require_websocketstream().WebSocketStream; - module.exports.WebSocketError = require_websocketerror().WebSocketError; - module.exports.request = makeDispatcher(api.request); - module.exports.stream = makeDispatcher(api.stream); - module.exports.pipeline = makeDispatcher(api.pipeline); - module.exports.connect = makeDispatcher(api.connect); - module.exports.upgrade = makeDispatcher(api.upgrade); - module.exports.MockClient = MockClient; - module.exports.MockCallHistory = MockCallHistory; - module.exports.MockCallHistoryLog = MockCallHistoryLog; - module.exports.MockPool = MockPool; - module.exports.MockAgent = MockAgent; - module.exports.SnapshotAgent = SnapshotAgent; - module.exports.mockErrors = mockErrors; - var { EventSource } = require_eventsource(); - module.exports.EventSource = EventSource; - function install() { - globalThis.fetch = module.exports.fetch; - globalThis.Headers = module.exports.Headers; - globalThis.Response = module.exports.Response; - globalThis.Request = module.exports.Request; - globalThis.FormData = module.exports.FormData; - globalThis.WebSocket = module.exports.WebSocket; - globalThis.CloseEvent = module.exports.CloseEvent; - globalThis.ErrorEvent = module.exports.ErrorEvent; - globalThis.MessageEvent = module.exports.MessageEvent; - globalThis.EventSource = module.exports.EventSource; + } + return JSON.stringify([cacheKey2.origin, cacheKey2.method, cacheKey2.path, headers]); } - module.exports.install = install; + module.exports = { + makeCacheKey, + normalizeHeaders: normalizeHeaders3, + assertCacheKey, + assertCacheValue, + parseCacheControlHeader, + parseVaryHeader, + isEtagUsable, + assertCacheMethods, + assertCacheStore, + makeDeduplicationKey + }; } }); -// src/solana-balance.ts -var solana_balance_exports = {}; -__export(solana_balance_exports, { - SolanaBalanceMonitor: () => SolanaBalanceMonitor -}); -var SOLANA_USDC_MINT, SOLANA_DEFAULT_RPC, BALANCE_TIMEOUT_MS, CACHE_TTL_MS2, SolanaBalanceMonitor; -var init_solana_balance = __esm({ - "src/solana-balance.ts"() { +// node_modules/undici/lib/util/date.js +var require_date = __commonJS({ + "node_modules/undici/lib/util/date.js"(exports, module) { "use strict"; - init_index_node37(); - SOLANA_USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; - SOLANA_DEFAULT_RPC = "https://api.mainnet-beta.solana.com"; - BALANCE_TIMEOUT_MS = 1e4; - CACHE_TTL_MS2 = 3e4; - SolanaBalanceMonitor = class { - rpc; - walletAddress; - cachedBalance = null; - cachedAt = 0; - constructor(walletAddress, rpcUrl) { - this.walletAddress = walletAddress; - const url = rpcUrl || process["env"].CLAWROUTER_SOLANA_RPC_URL || SOLANA_DEFAULT_RPC; - this.rpc = createSolanaRpc(url); + function parseHttpDate(date) { + switch (date[3]) { + case ",": + return parseImfDate(date); + case " ": + return parseAscTimeDate(date); + default: + return parseRfc850Date(date); } - async checkBalance() { - const now = Date.now(); - if (this.cachedBalance !== null && this.cachedBalance > 0n && now - this.cachedAt < CACHE_TTL_MS2) { - return this.buildInfo(this.cachedBalance); + } + function parseImfDate(date) { + if (date.length !== 29 || date[4] !== " " || date[7] !== " " || date[11] !== " " || date[16] !== " " || date[19] !== ":" || date[22] !== ":" || date[25] !== " " || date[26] !== "G" || date[27] !== "M" || date[28] !== "T") { + return void 0; + } + let weekday = -1; + if (date[0] === "S" && date[1] === "u" && date[2] === "n") { + weekday = 0; + } else if (date[0] === "M" && date[1] === "o" && date[2] === "n") { + weekday = 1; + } else if (date[0] === "T" && date[1] === "u" && date[2] === "e") { + weekday = 2; + } else if (date[0] === "W" && date[1] === "e" && date[2] === "d") { + weekday = 3; + } else if (date[0] === "T" && date[1] === "h" && date[2] === "u") { + weekday = 4; + } else if (date[0] === "F" && date[1] === "r" && date[2] === "i") { + weekday = 5; + } else if (date[0] === "S" && date[1] === "a" && date[2] === "t") { + weekday = 6; + } else { + return void 0; + } + let day = 0; + if (date[5] === "0") { + const code = date.charCodeAt(6); + if (code < 49 || code > 57) { + return void 0; } - const balance = await this.fetchBalance(); - if (balance > 0n) { - this.cachedBalance = balance; - this.cachedAt = now; + day = code - 48; + } else { + const code1 = date.charCodeAt(5); + if (code1 < 49 || code1 > 51) { + return void 0; } - return this.buildInfo(balance); - } - deductEstimated(amountMicros) { - if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) { - this.cachedBalance -= amountMicros; + const code2 = date.charCodeAt(6); + if (code2 < 48 || code2 > 57) { + return void 0; } + day = (code1 - 48) * 10 + (code2 - 48); } - invalidate() { - this.cachedBalance = null; - this.cachedAt = 0; + let monthIdx = -1; + if (date[8] === "J" && date[9] === "a" && date[10] === "n") { + monthIdx = 0; + } else if (date[8] === "F" && date[9] === "e" && date[10] === "b") { + monthIdx = 1; + } else if (date[8] === "M" && date[9] === "a") { + if (date[10] === "r") { + monthIdx = 2; + } else if (date[10] === "y") { + monthIdx = 4; + } else { + return void 0; + } + } else if (date[8] === "J") { + if (date[9] === "a" && date[10] === "n") { + monthIdx = 0; + } else if (date[9] === "u") { + if (date[10] === "n") { + monthIdx = 5; + } else if (date[10] === "l") { + monthIdx = 6; + } else { + return void 0; + } + } else { + return void 0; + } + } else if (date[8] === "A") { + if (date[9] === "p" && date[10] === "r") { + monthIdx = 3; + } else if (date[9] === "u" && date[10] === "g") { + monthIdx = 7; + } else { + return void 0; + } + } else if (date[8] === "S" && date[9] === "e" && date[10] === "p") { + monthIdx = 8; + } else if (date[8] === "O" && date[9] === "c" && date[10] === "t") { + monthIdx = 9; + } else if (date[8] === "N" && date[9] === "o" && date[10] === "v") { + monthIdx = 10; + } else if (date[8] === "D" && date[9] === "e" && date[10] === "c") { + monthIdx = 11; + } else { + return void 0; } - async refresh() { - this.invalidate(); - return this.checkBalance(); + const yearDigit1 = date.charCodeAt(12); + if (yearDigit1 < 48 || yearDigit1 > 57) { + return void 0; } - /** - * Check if balance is sufficient for an estimated cost. - */ - async checkSufficient(estimatedCostMicros) { - const info = await this.checkBalance(); - if (info.balance >= estimatedCostMicros) { - return { sufficient: true, info }; - } - const shortfall = estimatedCostMicros - info.balance; - return { - sufficient: false, - info, - shortfall: this.formatUSDC(shortfall) - }; + const yearDigit2 = date.charCodeAt(13); + if (yearDigit2 < 48 || yearDigit2 > 57) { + return void 0; } - /** - * Format USDC amount (in micros) as "$X.XX". - */ - formatUSDC(amountMicros) { - const dollars = Number(amountMicros) / 1e6; - return `$${dollars.toFixed(2)}`; + const yearDigit3 = date.charCodeAt(14); + if (yearDigit3 < 48 || yearDigit3 > 57) { + return void 0; } - getWalletAddress() { - return this.walletAddress; + const yearDigit4 = date.charCodeAt(15); + if (yearDigit4 < 48 || yearDigit4 > 57) { + return void 0; } - /** - * Check native SOL balance (in lamports). Useful for detecting users who - * funded with SOL instead of USDC. - */ - async checkSolBalance() { - const controller = new AbortController(); - const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS); - try { - const owner = address(this.walletAddress); - const response = await this.rpc.getBalance(owner).send({ abortSignal: controller.signal }); - return BigInt(response.value); - } catch { - return 0n; - } finally { - clearTimeout(timer); + const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48); + let hour = 0; + if (date[17] === "0") { + const code = date.charCodeAt(18); + if (code < 48 || code > 57) { + return void 0; + } + hour = code - 48; + } else { + const code1 = date.charCodeAt(17); + if (code1 < 48 || code1 > 50) { + return void 0; + } + const code2 = date.charCodeAt(18); + if (code2 < 48 || code2 > 57) { + return void 0; + } + if (code1 === 50 && code2 > 51) { + return void 0; } + hour = (code1 - 48) * 10 + (code2 - 48); } - async fetchBalance() { - const owner = address(this.walletAddress); - const mint = address(SOLANA_USDC_MINT); - const MAX_ATTEMPTS = 3; - let lastError; - for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { - try { - const result = await this.fetchBalanceOnce(owner, mint); - if (result > 0n) return result; - if (attempt < MAX_ATTEMPTS - 1) { - await new Promise((r) => setTimeout(r, 1500 * (attempt + 1))); - } - } catch (err) { - lastError = err; - if (attempt < MAX_ATTEMPTS - 1) { - await new Promise((r) => setTimeout(r, 1500 * (attempt + 1))); - } - } + let minute = 0; + if (date[20] === "0") { + const code = date.charCodeAt(21); + if (code < 48 || code > 57) { + return void 0; } - if (lastError !== void 0) throw lastError; - return 0n; + minute = code - 48; + } else { + const code1 = date.charCodeAt(20); + if (code1 < 48 || code1 > 53) { + return void 0; + } + const code2 = date.charCodeAt(21); + if (code2 < 48 || code2 > 57) { + return void 0; + } + minute = (code1 - 48) * 10 + (code2 - 48); } - async fetchBalanceOnce(owner, mint) { - const controller = new AbortController(); - const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS); - try { - const response = await this.rpc.getTokenAccountsByOwner(owner, { mint }, { encoding: "jsonParsed" }).send({ abortSignal: controller.signal }); - if (response.value.length === 0) return 0n; - let total = 0n; - for (const account of response.value) { - const parsed = account.account.data; - total += BigInt(parsed.parsed.info.tokenAmount.amount); - } - return total; - } catch (err) { - throw new Error( - `Failed to fetch Solana USDC balance: ${err instanceof Error ? err.message : String(err)}`, - { cause: err } - ); - } finally { - clearTimeout(timer); + let second = 0; + if (date[23] === "0") { + const code = date.charCodeAt(24); + if (code < 48 || code > 57) { + return void 0; + } + second = code - 48; + } else { + const code1 = date.charCodeAt(23); + if (code1 < 48 || code1 > 53) { + return void 0; } + const code2 = date.charCodeAt(24); + if (code2 < 48 || code2 > 57) { + return void 0; + } + second = (code1 - 48) * 10 + (code2 - 48); } - buildInfo(balance) { - const dollars = Number(balance) / 1e6; - return { - balance, - balanceUSD: `$${dollars.toFixed(2)}`, - isLow: balance < 1000000n, - isEmpty: balance < 100n, - walletAddress: this.walletAddress - }; - } - }; - } -}); - -// node_modules/@x402/svm/node_modules/@solana-program/token/dist/src/index.mjs -var TOKEN_PROGRAM_ADDRESS, ASSOCIATED_TOKEN_ERROR__INVALID_OWNER, associatedTokenErrorMessages, TOKEN_ERROR__NOT_RENT_EXEMPT, TOKEN_ERROR__INSUFFICIENT_FUNDS, TOKEN_ERROR__INVALID_MINT, TOKEN_ERROR__MINT_MISMATCH, TOKEN_ERROR__OWNER_MISMATCH, TOKEN_ERROR__FIXED_SUPPLY, TOKEN_ERROR__ALREADY_IN_USE, TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS, TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS, TOKEN_ERROR__UNINITIALIZED_STATE, TOKEN_ERROR__NATIVE_NOT_SUPPORTED, TOKEN_ERROR__NON_NATIVE_HAS_BALANCE, TOKEN_ERROR__INVALID_INSTRUCTION, TOKEN_ERROR__INVALID_STATE, TOKEN_ERROR__OVERFLOW, TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED, TOKEN_ERROR__MINT_CANNOT_FREEZE, TOKEN_ERROR__ACCOUNT_FROZEN, TOKEN_ERROR__MINT_DECIMALS_MISMATCH, TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED, tokenErrorMessages; -var init_src = __esm({ - "node_modules/@x402/svm/node_modules/@solana-program/token/dist/src/index.mjs"() { - "use strict"; - TOKEN_PROGRAM_ADDRESS = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; - ASSOCIATED_TOKEN_ERROR__INVALID_OWNER = 0; - if (process.env.NODE_ENV !== "production") { - associatedTokenErrorMessages = { - [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER]: `Associated token account owner does not match address derivation` - }; - } - TOKEN_ERROR__NOT_RENT_EXEMPT = 0; - TOKEN_ERROR__INSUFFICIENT_FUNDS = 1; - TOKEN_ERROR__INVALID_MINT = 2; - TOKEN_ERROR__MINT_MISMATCH = 3; - TOKEN_ERROR__OWNER_MISMATCH = 4; - TOKEN_ERROR__FIXED_SUPPLY = 5; - TOKEN_ERROR__ALREADY_IN_USE = 6; - TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 7; - TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 8; - TOKEN_ERROR__UNINITIALIZED_STATE = 9; - TOKEN_ERROR__NATIVE_NOT_SUPPORTED = 10; - TOKEN_ERROR__NON_NATIVE_HAS_BALANCE = 11; - TOKEN_ERROR__INVALID_INSTRUCTION = 12; - TOKEN_ERROR__INVALID_STATE = 13; - TOKEN_ERROR__OVERFLOW = 14; - TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 15; - TOKEN_ERROR__MINT_CANNOT_FREEZE = 16; - TOKEN_ERROR__ACCOUNT_FROZEN = 17; - TOKEN_ERROR__MINT_DECIMALS_MISMATCH = 18; - TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED = 19; - if (process.env.NODE_ENV !== "production") { - tokenErrorMessages = { - [TOKEN_ERROR__ACCOUNT_FROZEN]: `Account is frozen`, - [TOKEN_ERROR__ALREADY_IN_USE]: `Already in use`, - [TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`, - [TOKEN_ERROR__FIXED_SUPPLY]: `Fixed supply`, - [TOKEN_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`, - [TOKEN_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`, - [TOKEN_ERROR__INVALID_MINT]: `Invalid Mint`, - [TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`, - [TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`, - [TOKEN_ERROR__INVALID_STATE]: `State is invalid for requested operation`, - [TOKEN_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`, - [TOKEN_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`, - [TOKEN_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`, - [TOKEN_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`, - [TOKEN_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`, - [TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`, - [TOKEN_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`, - [TOKEN_ERROR__OVERFLOW]: `Operation overflowed`, - [TOKEN_ERROR__OWNER_MISMATCH]: `Owner does not match`, - [TOKEN_ERROR__UNINITIALIZED_STATE]: `State is unititialized` - }; + const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); + return result.getUTCDay() === weekday ? result : void 0; } - if (process.env.NODE_ENV !== "production") ; - } -}); - -// node_modules/@x402/svm/node_modules/@solana-program/token-2022/dist/src/index.mjs -function getAccountStateDecoder() { - return getEnumDecoder(AccountState); -} -function getDecryptableBalanceDecoder() { - return fixDecoderSize(getBytesDecoder(), 36); -} -function getEncryptedBalanceDecoder() { - return fixDecoderSize(getBytesDecoder(), 64); -} -function getExtensionDecoder() { - return getDiscriminatedUnionDecoder( - [ - ["Uninitialized", getUnitDecoder()], - [ - "TransferFeeConfig", - addDecoderSizePrefix( - getStructDecoder([ - ["transferFeeConfigAuthority", getAddressDecoder()], - ["withdrawWithheldAuthority", getAddressDecoder()], - ["withheldAmount", getU64Decoder()], - ["olderTransferFee", getTransferFeeDecoder()], - ["newerTransferFee", getTransferFeeDecoder()] - ]), - getU16Decoder() - ) - ], - [ - "TransferFeeAmount", - addDecoderSizePrefix( - getStructDecoder([["withheldAmount", getU64Decoder()]]), - getU16Decoder() - ) - ], - [ - "MintCloseAuthority", - addDecoderSizePrefix( - getStructDecoder([["closeAuthority", getAddressDecoder()]]), - getU16Decoder() - ) - ], - [ - "ConfidentialTransferMint", - addDecoderSizePrefix( - getStructDecoder([ - [ - "authority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - ["autoApproveNewAccounts", getBooleanDecoder()], - [ - "auditorElgamalPubkey", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ] - ]), - getU16Decoder() - ) - ], - [ - "ConfidentialTransferAccount", - addDecoderSizePrefix( - getStructDecoder([ - ["approved", getBooleanDecoder()], - ["elgamalPubkey", getAddressDecoder()], - ["pendingBalanceLow", getEncryptedBalanceDecoder()], - ["pendingBalanceHigh", getEncryptedBalanceDecoder()], - ["availableBalance", getEncryptedBalanceDecoder()], - ["decryptableAvailableBalance", getDecryptableBalanceDecoder()], - ["allowConfidentialCredits", getBooleanDecoder()], - ["allowNonConfidentialCredits", getBooleanDecoder()], - ["pendingBalanceCreditCounter", getU64Decoder()], - ["maximumPendingBalanceCreditCounter", getU64Decoder()], - ["expectedPendingBalanceCreditCounter", getU64Decoder()], - ["actualPendingBalanceCreditCounter", getU64Decoder()] - ]), - getU16Decoder() - ) - ], - [ - "DefaultAccountState", - addDecoderSizePrefix( - getStructDecoder([["state", getAccountStateDecoder()]]), - getU16Decoder() - ) - ], - [ - "ImmutableOwner", - addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()) - ], - [ - "MemoTransfer", - addDecoderSizePrefix( - getStructDecoder([ - ["requireIncomingTransferMemos", getBooleanDecoder()] - ]), - getU16Decoder() - ) - ], - [ - "NonTransferable", - addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()) - ], - [ - "InterestBearingConfig", - addDecoderSizePrefix( - getStructDecoder([ - ["rateAuthority", getAddressDecoder()], - ["initializationTimestamp", getU64Decoder()], - ["preUpdateAverageRate", getI16Decoder()], - ["lastUpdateTimestamp", getU64Decoder()], - ["currentRate", getI16Decoder()] - ]), - getU16Decoder() - ) - ], - [ - "CpiGuard", - addDecoderSizePrefix( - getStructDecoder([["lockCpi", getBooleanDecoder()]]), - getU16Decoder() - ) - ], - [ - "PermanentDelegate", - addDecoderSizePrefix( - getStructDecoder([["delegate", getAddressDecoder()]]), - getU16Decoder() - ) - ], - [ - "NonTransferableAccount", - addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()) - ], - [ - "TransferHook", - addDecoderSizePrefix( - getStructDecoder([ - ["authority", getAddressDecoder()], - ["programId", getAddressDecoder()] - ]), - getU16Decoder() - ) - ], - [ - "TransferHookAccount", - addDecoderSizePrefix( - getStructDecoder([["transferring", getBooleanDecoder()]]), - getU16Decoder() - ) - ], - [ - "ConfidentialTransferFee", - addDecoderSizePrefix( - getStructDecoder([ - [ - "authority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - ["elgamalPubkey", getAddressDecoder()], - ["harvestToMintEnabled", getBooleanDecoder()], - ["withheldAmount", getEncryptedBalanceDecoder()] - ]), - getU16Decoder() - ) - ], - [ - "ConfidentialTransferFeeAmount", - addDecoderSizePrefix( - getStructDecoder([["withheldAmount", getEncryptedBalanceDecoder()]]), - getU16Decoder() - ) - ], - [ - "MetadataPointer", - addDecoderSizePrefix( - getStructDecoder([ - [ - "authority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - [ - "metadataAddress", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ] - ]), - getU16Decoder() - ) - ], - [ - "TokenMetadata", - addDecoderSizePrefix( - getStructDecoder([ - [ - "updateAuthority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - ["mint", getAddressDecoder()], - ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["symbol", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["uri", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - [ - "additionalMetadata", - getMapDecoder( - addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()), - addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()) - ) - ] - ]), - getU16Decoder() - ) - ], - [ - "GroupPointer", - addDecoderSizePrefix( - getStructDecoder([ - [ - "authority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - [ - "groupAddress", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ] - ]), - getU16Decoder() - ) - ], - [ - "TokenGroup", - addDecoderSizePrefix( - getStructDecoder([ - [ - "updateAuthority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - ["mint", getAddressDecoder()], - ["size", getU64Decoder()], - ["maxSize", getU64Decoder()] - ]), - getU16Decoder() - ) - ], - [ - "GroupMemberPointer", - addDecoderSizePrefix( - getStructDecoder([ - [ - "authority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - [ - "memberAddress", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ] - ]), - getU16Decoder() - ) - ], - [ - "TokenGroupMember", - addDecoderSizePrefix( - getStructDecoder([ - ["mint", getAddressDecoder()], - ["group", getAddressDecoder()], - ["memberNumber", getU64Decoder()] - ]), - getU16Decoder() - ) - ], - ["ConfidentialMintBurn", getUnitDecoder()], - [ - "ScaledUiAmountConfig", - addDecoderSizePrefix( - getStructDecoder([ - ["authority", getAddressDecoder()], - ["multiplier", getF64Decoder()], - ["newMultiplierEffectiveTimestamp", getU64Decoder()], - ["newMultiplier", getF64Decoder()] - ]), - getU16Decoder() - ) - ], - [ - "PausableConfig", - addDecoderSizePrefix( - getStructDecoder([ - [ - "authority", - getOptionDecoder(getAddressDecoder(), { - prefix: null, - noneValue: "zeroes" - }) - ], - ["paused", getBooleanDecoder()] - ]), - getU16Decoder() - ) - ], - ["PausableAccount", getUnitDecoder()] - ], - { size: getU16Decoder() } - ); -} -function getTransferFeeDecoder() { - return getStructDecoder([ - ["epoch", getU64Decoder()], - ["maximumFee", getU64Decoder()], - ["transferFeeBasisPoints", getU16Decoder()] - ]); -} -function getMintDecoder() { - return getStructDecoder([ - [ - "mintAuthority", - getOptionDecoder(getAddressDecoder(), { - prefix: getU32Decoder(), - noneValue: "zeroes" - }) - ], - ["supply", getU64Decoder()], - ["decimals", getU8Decoder()], - ["isInitialized", getBooleanDecoder()], - [ - "freezeAuthority", - getOptionDecoder(getAddressDecoder(), { - prefix: getU32Decoder(), - noneValue: "zeroes" - }) - ], - [ - "extensions", - getOptionDecoder( - getHiddenPrefixDecoder( - getArrayDecoder(getExtensionDecoder(), { size: "remainder" }), - [getConstantDecoder(padLeftEncoder(getU8Encoder(), 83).encode(1))] - ), - { prefix: null } - ) - ] - ]); -} -function decodeMint(encodedAccount) { - return decodeAccount( - encodedAccount, - getMintDecoder() - ); -} -async function fetchMint(rpc, address2, config) { - const maybeAccount = await fetchMaybeMint(rpc, address2, config); - assertAccountExists(maybeAccount); - return maybeAccount; -} -async function fetchMaybeMint(rpc, address2, config) { - const maybeAccount = await fetchEncodedAccount(rpc, address2, config); - return decodeMint(maybeAccount); -} -function expectAddress(value) { - if (!value) { - throw new Error("Expected a Address."); - } - if (typeof value === "object" && "address" in value) { - return value.address; - } - if (Array.isArray(value)) { - return value[0]; - } - return value; -} -function getAccountMetaFactory(programAddress, optionalAccountStrategy) { - return (account) => { - if (!account.value) { - return Object.freeze({ - address: programAddress, - role: AccountRole.READONLY - }); + function parseAscTimeDate(date) { + if (date.length !== 24 || date[7] !== " " || date[10] !== " " || date[19] !== " ") { + return void 0; + } + let weekday = -1; + if (date[0] === "S" && date[1] === "u" && date[2] === "n") { + weekday = 0; + } else if (date[0] === "M" && date[1] === "o" && date[2] === "n") { + weekday = 1; + } else if (date[0] === "T" && date[1] === "u" && date[2] === "e") { + weekday = 2; + } else if (date[0] === "W" && date[1] === "e" && date[2] === "d") { + weekday = 3; + } else if (date[0] === "T" && date[1] === "h" && date[2] === "u") { + weekday = 4; + } else if (date[0] === "F" && date[1] === "r" && date[2] === "i") { + weekday = 5; + } else if (date[0] === "S" && date[1] === "a" && date[2] === "t") { + weekday = 6; + } else { + return void 0; + } + let monthIdx = -1; + if (date[4] === "J" && date[5] === "a" && date[6] === "n") { + monthIdx = 0; + } else if (date[4] === "F" && date[5] === "e" && date[6] === "b") { + monthIdx = 1; + } else if (date[4] === "M" && date[5] === "a") { + if (date[6] === "r") { + monthIdx = 2; + } else if (date[6] === "y") { + monthIdx = 4; + } else { + return void 0; + } + } else if (date[4] === "J") { + if (date[5] === "a" && date[6] === "n") { + monthIdx = 0; + } else if (date[5] === "u") { + if (date[6] === "n") { + monthIdx = 5; + } else if (date[6] === "l") { + monthIdx = 6; + } else { + return void 0; + } + } else { + return void 0; + } + } else if (date[4] === "A") { + if (date[5] === "p" && date[6] === "r") { + monthIdx = 3; + } else if (date[5] === "u" && date[6] === "g") { + monthIdx = 7; + } else { + return void 0; + } + } else if (date[4] === "S" && date[5] === "e" && date[6] === "p") { + monthIdx = 8; + } else if (date[4] === "O" && date[5] === "c" && date[6] === "t") { + monthIdx = 9; + } else if (date[4] === "N" && date[5] === "o" && date[6] === "v") { + monthIdx = 10; + } else if (date[4] === "D" && date[5] === "e" && date[6] === "c") { + monthIdx = 11; + } else { + return void 0; + } + let day = 0; + if (date[8] === " ") { + const code = date.charCodeAt(9); + if (code < 49 || code > 57) { + return void 0; + } + day = code - 48; + } else { + const code1 = date.charCodeAt(8); + if (code1 < 49 || code1 > 51) { + return void 0; + } + const code2 = date.charCodeAt(9); + if (code2 < 48 || code2 > 57) { + return void 0; + } + day = (code1 - 48) * 10 + (code2 - 48); + } + let hour = 0; + if (date[11] === "0") { + const code = date.charCodeAt(12); + if (code < 48 || code > 57) { + return void 0; + } + hour = code - 48; + } else { + const code1 = date.charCodeAt(11); + if (code1 < 48 || code1 > 50) { + return void 0; + } + const code2 = date.charCodeAt(12); + if (code2 < 48 || code2 > 57) { + return void 0; + } + if (code1 === 50 && code2 > 51) { + return void 0; + } + hour = (code1 - 48) * 10 + (code2 - 48); + } + let minute = 0; + if (date[14] === "0") { + const code = date.charCodeAt(15); + if (code < 48 || code > 57) { + return void 0; + } + minute = code - 48; + } else { + const code1 = date.charCodeAt(14); + if (code1 < 48 || code1 > 53) { + return void 0; + } + const code2 = date.charCodeAt(15); + if (code2 < 48 || code2 > 57) { + return void 0; + } + minute = (code1 - 48) * 10 + (code2 - 48); + } + let second = 0; + if (date[17] === "0") { + const code = date.charCodeAt(18); + if (code < 48 || code > 57) { + return void 0; + } + second = code - 48; + } else { + const code1 = date.charCodeAt(17); + if (code1 < 48 || code1 > 53) { + return void 0; + } + const code2 = date.charCodeAt(18); + if (code2 < 48 || code2 > 57) { + return void 0; + } + second = (code1 - 48) * 10 + (code2 - 48); + } + const yearDigit1 = date.charCodeAt(20); + if (yearDigit1 < 48 || yearDigit1 > 57) { + return void 0; + } + const yearDigit2 = date.charCodeAt(21); + if (yearDigit2 < 48 || yearDigit2 > 57) { + return void 0; + } + const yearDigit3 = date.charCodeAt(22); + if (yearDigit3 < 48 || yearDigit3 > 57) { + return void 0; + } + const yearDigit4 = date.charCodeAt(23); + if (yearDigit4 < 48 || yearDigit4 > 57) { + return void 0; + } + const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48); + const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); + return result.getUTCDay() === weekday ? result : void 0; } - const writableRole = account.isWritable ? AccountRole.WRITABLE : AccountRole.READONLY; - return Object.freeze({ - address: expectAddress(account.value), - role: isTransactionSigner2(account.value) ? upgradeRoleToSigner(writableRole) : writableRole, - ...isTransactionSigner2(account.value) ? { signer: account.value } : {} - }); - }; -} -function isTransactionSigner2(value) { - return !!value && typeof value === "object" && "address" in value && isTransactionSigner(value); -} -async function findAssociatedTokenPda(seeds, config = {}) { - const { - programAddress = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" - } = config; - return await getProgramDerivedAddress({ - programAddress, - seeds: [ - getAddressEncoder().encode(seeds.owner), - getAddressEncoder().encode(seeds.tokenProgram), - getAddressEncoder().encode(seeds.mint) - ] - }); -} -function getTransferCheckedInstructionDataEncoder() { - return transformEncoder( - getStructEncoder([ - ["discriminator", getU8Encoder()], - ["amount", getU64Encoder()], - ["decimals", getU8Encoder()] - ]), - (value) => ({ ...value, discriminator: TRANSFER_CHECKED_DISCRIMINATOR }) - ); -} -function getTransferCheckedInstruction(input, config) { - const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS; - const originalAccounts = { - source: { value: input.source ?? null, isWritable: true }, - mint: { value: input.mint ?? null, isWritable: false }, - destination: { value: input.destination ?? null, isWritable: true }, - authority: { value: input.authority ?? null, isWritable: false } - }; - const accounts = originalAccounts; - const args = { ...input }; - const remainingAccounts = (args.multiSigners ?? []).map( - (signer) => ({ - address: signer.address, - role: AccountRole.READONLY_SIGNER, - signer - }) - ); - const getAccountMeta = getAccountMetaFactory(programAddress); - return Object.freeze({ - accounts: [ - getAccountMeta(accounts.source), - getAccountMeta(accounts.mint), - getAccountMeta(accounts.destination), - getAccountMeta(accounts.authority), - ...remainingAccounts - ], - data: getTransferCheckedInstructionDataEncoder().encode( - args - ), - programAddress - }); -} -var AccountState, TOKEN_2022_PROGRAM_ADDRESS, ASSOCIATED_TOKEN_ERROR__INVALID_OWNER2, associatedTokenErrorMessages2, TOKEN_2022_ERROR__NOT_RENT_EXEMPT, TOKEN_2022_ERROR__INSUFFICIENT_FUNDS, TOKEN_2022_ERROR__INVALID_MINT, TOKEN_2022_ERROR__MINT_MISMATCH, TOKEN_2022_ERROR__OWNER_MISMATCH, TOKEN_2022_ERROR__FIXED_SUPPLY, TOKEN_2022_ERROR__ALREADY_IN_USE, TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS, TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS, TOKEN_2022_ERROR__UNINITIALIZED_STATE, TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED, TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE, TOKEN_2022_ERROR__INVALID_INSTRUCTION, TOKEN_2022_ERROR__INVALID_STATE, TOKEN_2022_ERROR__OVERFLOW, TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED, TOKEN_2022_ERROR__MINT_CANNOT_FREEZE, TOKEN_2022_ERROR__ACCOUNT_FROZEN, TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH, TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED, token2022ErrorMessages, EMIT_TOKEN_METADATA_DISCRIMINATOR, INITIALIZE_TOKEN_GROUP_DISCRIMINATOR, INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR, INITIALIZE_TOKEN_METADATA_DISCRIMINATOR, REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR, TRANSFER_CHECKED_DISCRIMINATOR, UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR, UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR, UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR, UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR, SECONDS_PER_YEAR; -var init_src2 = __esm({ - "node_modules/@x402/svm/node_modules/@solana-program/token-2022/dist/src/index.mjs"() { + function parseRfc850Date(date) { + let commaIndex = -1; + let weekday = -1; + if (date[0] === "S") { + if (date[1] === "u" && date[2] === "n" && date[3] === "d" && date[4] === "a" && date[5] === "y") { + weekday = 0; + commaIndex = 6; + } else if (date[1] === "a" && date[2] === "t" && date[3] === "u" && date[4] === "r" && date[5] === "d" && date[6] === "a" && date[7] === "y") { + weekday = 6; + commaIndex = 8; + } + } else if (date[0] === "M" && date[1] === "o" && date[2] === "n" && date[3] === "d" && date[4] === "a" && date[5] === "y") { + weekday = 1; + commaIndex = 6; + } else if (date[0] === "T") { + if (date[1] === "u" && date[2] === "e" && date[3] === "s" && date[4] === "d" && date[5] === "a" && date[6] === "y") { + weekday = 2; + commaIndex = 7; + } else if (date[1] === "h" && date[2] === "u" && date[3] === "r" && date[4] === "s" && date[5] === "d" && date[6] === "a" && date[7] === "y") { + weekday = 4; + commaIndex = 8; + } + } else if (date[0] === "W" && date[1] === "e" && date[2] === "d" && date[3] === "n" && date[4] === "e" && date[5] === "s" && date[6] === "d" && date[7] === "a" && date[8] === "y") { + weekday = 3; + commaIndex = 9; + } else if (date[0] === "F" && date[1] === "r" && date[2] === "i" && date[3] === "d" && date[4] === "a" && date[5] === "y") { + weekday = 5; + commaIndex = 6; + } else { + return void 0; + } + if (date[commaIndex] !== "," || date.length - commaIndex - 1 !== 23 || date[commaIndex + 1] !== " " || date[commaIndex + 4] !== "-" || date[commaIndex + 8] !== "-" || date[commaIndex + 11] !== " " || date[commaIndex + 14] !== ":" || date[commaIndex + 17] !== ":" || date[commaIndex + 20] !== " " || date[commaIndex + 21] !== "G" || date[commaIndex + 22] !== "M" || date[commaIndex + 23] !== "T") { + return void 0; + } + let day = 0; + if (date[commaIndex + 2] === "0") { + const code = date.charCodeAt(commaIndex + 3); + if (code < 49 || code > 57) { + return void 0; + } + day = code - 48; + } else { + const code1 = date.charCodeAt(commaIndex + 2); + if (code1 < 49 || code1 > 51) { + return void 0; + } + const code2 = date.charCodeAt(commaIndex + 3); + if (code2 < 48 || code2 > 57) { + return void 0; + } + day = (code1 - 48) * 10 + (code2 - 48); + } + let monthIdx = -1; + if (date[commaIndex + 5] === "J" && date[commaIndex + 6] === "a" && date[commaIndex + 7] === "n") { + monthIdx = 0; + } else if (date[commaIndex + 5] === "F" && date[commaIndex + 6] === "e" && date[commaIndex + 7] === "b") { + monthIdx = 1; + } else if (date[commaIndex + 5] === "M" && date[commaIndex + 6] === "a" && date[commaIndex + 7] === "r") { + monthIdx = 2; + } else if (date[commaIndex + 5] === "A" && date[commaIndex + 6] === "p" && date[commaIndex + 7] === "r") { + monthIdx = 3; + } else if (date[commaIndex + 5] === "M" && date[commaIndex + 6] === "a" && date[commaIndex + 7] === "y") { + monthIdx = 4; + } else if (date[commaIndex + 5] === "J" && date[commaIndex + 6] === "u" && date[commaIndex + 7] === "n") { + monthIdx = 5; + } else if (date[commaIndex + 5] === "J" && date[commaIndex + 6] === "u" && date[commaIndex + 7] === "l") { + monthIdx = 6; + } else if (date[commaIndex + 5] === "A" && date[commaIndex + 6] === "u" && date[commaIndex + 7] === "g") { + monthIdx = 7; + } else if (date[commaIndex + 5] === "S" && date[commaIndex + 6] === "e" && date[commaIndex + 7] === "p") { + monthIdx = 8; + } else if (date[commaIndex + 5] === "O" && date[commaIndex + 6] === "c" && date[commaIndex + 7] === "t") { + monthIdx = 9; + } else if (date[commaIndex + 5] === "N" && date[commaIndex + 6] === "o" && date[commaIndex + 7] === "v") { + monthIdx = 10; + } else if (date[commaIndex + 5] === "D" && date[commaIndex + 6] === "e" && date[commaIndex + 7] === "c") { + monthIdx = 11; + } else { + return void 0; + } + const yearDigit1 = date.charCodeAt(commaIndex + 9); + if (yearDigit1 < 48 || yearDigit1 > 57) { + return void 0; + } + const yearDigit2 = date.charCodeAt(commaIndex + 10); + if (yearDigit2 < 48 || yearDigit2 > 57) { + return void 0; + } + let year = (yearDigit1 - 48) * 10 + (yearDigit2 - 48); + year += year < 70 ? 2e3 : 1900; + let hour = 0; + if (date[commaIndex + 12] === "0") { + const code = date.charCodeAt(commaIndex + 13); + if (code < 48 || code > 57) { + return void 0; + } + hour = code - 48; + } else { + const code1 = date.charCodeAt(commaIndex + 12); + if (code1 < 48 || code1 > 50) { + return void 0; + } + const code2 = date.charCodeAt(commaIndex + 13); + if (code2 < 48 || code2 > 57) { + return void 0; + } + if (code1 === 50 && code2 > 51) { + return void 0; + } + hour = (code1 - 48) * 10 + (code2 - 48); + } + let minute = 0; + if (date[commaIndex + 15] === "0") { + const code = date.charCodeAt(commaIndex + 16); + if (code < 48 || code > 57) { + return void 0; + } + minute = code - 48; + } else { + const code1 = date.charCodeAt(commaIndex + 15); + if (code1 < 48 || code1 > 53) { + return void 0; + } + const code2 = date.charCodeAt(commaIndex + 16); + if (code2 < 48 || code2 > 57) { + return void 0; + } + minute = (code1 - 48) * 10 + (code2 - 48); + } + let second = 0; + if (date[commaIndex + 18] === "0") { + const code = date.charCodeAt(commaIndex + 19); + if (code < 48 || code > 57) { + return void 0; + } + second = code - 48; + } else { + const code1 = date.charCodeAt(commaIndex + 18); + if (code1 < 48 || code1 > 53) { + return void 0; + } + const code2 = date.charCodeAt(commaIndex + 19); + if (code2 < 48 || code2 > 57) { + return void 0; + } + second = (code1 - 48) * 10 + (code2 - 48); + } + const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); + return result.getUTCDay() === weekday ? result : void 0; + } + module.exports = { + parseHttpDate + }; + } +}); + +// node_modules/undici/lib/handler/cache-handler.js +var require_cache_handler = __commonJS({ + "node_modules/undici/lib/handler/cache-handler.js"(exports, module) { "use strict"; - init_index_node37(); - AccountState = /* @__PURE__ */ ((AccountState2) => { - AccountState2[AccountState2["Uninitialized"] = 0] = "Uninitialized"; - AccountState2[AccountState2["Initialized"] = 1] = "Initialized"; - AccountState2[AccountState2["Frozen"] = 2] = "Frozen"; - return AccountState2; - })(AccountState || {}); - TOKEN_2022_PROGRAM_ADDRESS = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"; - ASSOCIATED_TOKEN_ERROR__INVALID_OWNER2 = 0; - if (process.env.NODE_ENV !== "production") { - associatedTokenErrorMessages2 = { - [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER2]: `Associated token account owner does not match address derivation` - }; + var util2 = require_util(); + var { + parseCacheControlHeader, + parseVaryHeader, + isEtagUsable + } = require_cache(); + var { parseHttpDate } = require_date(); + function noop() { + } + var HEURISTICALLY_CACHEABLE_STATUS_CODES = [ + 200, + 203, + 204, + 206, + 300, + 301, + 308, + 404, + 405, + 410, + 414, + 501 + ]; + var NOT_UNDERSTOOD_STATUS_CODES = [ + 206 + ]; + var MAX_RESPONSE_AGE = 2147483647e3; + var CacheHandler = class { + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey} + */ + #cacheKey; + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions['type']} + */ + #cacheType; + /** + * @type {number | undefined} + */ + #cacheByDefault; + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheStore} + */ + #store; + /** + * @type {import('../../types/dispatcher.d.ts').default.DispatchHandler} + */ + #handler; + /** + * @type {import('node:stream').Writable | undefined} + */ + #writeStream; + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey + * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler + */ + constructor({ store, type, cacheByDefault }, cacheKey2, handler) { + this.#store = store; + this.#cacheType = type; + this.#cacheByDefault = cacheByDefault; + this.#cacheKey = cacheKey2; + this.#handler = handler; + } + onRequestStart(controller, context) { + this.#writeStream?.destroy(); + this.#writeStream = void 0; + this.#handler.onRequestStart?.(controller, context); + } + onRequestUpgrade(controller, statusCode, headers, socket) { + this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket); + } + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {number} statusCode + * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders + * @param {string} statusMessage + */ + onResponseStart(controller, statusCode, resHeaders, statusMessage) { + const downstreamOnHeaders = () => this.#handler.onResponseStart?.( + controller, + statusCode, + resHeaders, + statusMessage + ); + const handler = this; + if (!util2.safeHTTPMethods.includes(this.#cacheKey.method) && statusCode >= 200 && statusCode <= 399) { + try { + this.#store.delete(this.#cacheKey)?.catch?.(noop); + } catch { + } + return downstreamOnHeaders(); + } + const cacheControlHeader = resHeaders["cache-control"]; + const heuristicallyCacheable = resHeaders["last-modified"] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode); + if (!cacheControlHeader && !resHeaders["expires"] && !heuristicallyCacheable && !this.#cacheByDefault) { + return downstreamOnHeaders(); + } + const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}; + if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) { + return downstreamOnHeaders(); + } + const now = Date.now(); + const resAge = resHeaders.age ? getAge(resHeaders.age) : void 0; + if (resAge && resAge >= MAX_RESPONSE_AGE) { + return downstreamOnHeaders(); + } + const resDate = typeof resHeaders.date === "string" ? parseHttpDate(resHeaders.date) : void 0; + const staleAt = determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ?? this.#cacheByDefault; + if (staleAt === void 0 || resAge && resAge > staleAt) { + return downstreamOnHeaders(); + } + const baseTime = resDate ? resDate.getTime() : now; + const absoluteStaleAt = staleAt + baseTime; + if (now >= absoluteStaleAt) { + return downstreamOnHeaders(); + } + let varyDirectives; + if (this.#cacheKey.headers && resHeaders.vary) { + varyDirectives = parseVaryHeader(resHeaders.vary, this.#cacheKey.headers); + if (!varyDirectives) { + return downstreamOnHeaders(); + } + } + const cachedAt = resAge ? now - resAge : now; + const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt); + const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives); + const value = { + statusCode, + statusMessage, + headers: strippedHeaders, + vary: varyDirectives, + cacheControlDirectives, + cachedAt, + staleAt: absoluteStaleAt, + deleteAt + }; + if (statusCode === 304) { + const handle304 = (cachedValue) => { + if (!cachedValue) { + return downstreamOnHeaders(); + } + value.statusCode = cachedValue.statusCode; + value.statusMessage = cachedValue.statusMessage; + value.etag = cachedValue.etag; + value.headers = { ...cachedValue.headers, ...strippedHeaders }; + downstreamOnHeaders(); + this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value); + if (!this.#writeStream || !cachedValue?.body) { + return; + } + if (typeof cachedValue.body.values === "function") { + const bodyIterator = cachedValue.body.values(); + const streamCachedBody = () => { + for (const chunk of bodyIterator) { + const full = this.#writeStream.write(chunk) === false; + this.#handler.onResponseData?.(controller, chunk); + if (full) { + break; + } + } + }; + this.#writeStream.on("error", function() { + handler.#writeStream = void 0; + handler.#store.delete(handler.#cacheKey); + }).on("drain", () => { + streamCachedBody(); + }).on("close", function() { + if (handler.#writeStream === this) { + handler.#writeStream = void 0; + } + }); + streamCachedBody(); + } else if (typeof cachedValue.body.on === "function") { + cachedValue.body.on("data", (chunk) => { + this.#writeStream.write(chunk); + this.#handler.onResponseData?.(controller, chunk); + }).on("end", () => { + this.#writeStream.end(); + }).on("error", () => { + this.#writeStream = void 0; + this.#store.delete(this.#cacheKey); + }); + this.#writeStream.on("error", function() { + handler.#writeStream = void 0; + handler.#store.delete(handler.#cacheKey); + }).on("close", function() { + if (handler.#writeStream === this) { + handler.#writeStream = void 0; + } + }); + } + }; + const result = this.#store.get(this.#cacheKey); + if (result && typeof result.then === "function") { + result.then(handle304); + } else { + handle304(result); + } + } else { + if (typeof resHeaders.etag === "string" && isEtagUsable(resHeaders.etag)) { + value.etag = resHeaders.etag; + } + this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value); + if (!this.#writeStream) { + return downstreamOnHeaders(); + } + this.#writeStream.on("drain", () => controller.resume()).on("error", function() { + handler.#writeStream = void 0; + handler.#store.delete(handler.#cacheKey); + }).on("close", function() { + if (handler.#writeStream === this) { + handler.#writeStream = void 0; + } + controller.resume(); + }); + downstreamOnHeaders(); + } + } + onResponseData(controller, chunk) { + if (this.#writeStream?.write(chunk) === false) { + controller.pause(); + } + this.#handler.onResponseData?.(controller, chunk); + } + onResponseEnd(controller, trailers) { + this.#writeStream?.end(); + this.#handler.onResponseEnd?.(controller, trailers); + } + onResponseError(controller, err) { + this.#writeStream?.destroy(err); + this.#writeStream = void 0; + this.#handler.onResponseError?.(controller, err); + } + }; + function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) { + if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) { + return false; + } + if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders["expires"] && !cacheControlDirectives.public && cacheControlDirectives["max-age"] === void 0 && // RFC 9111: a private response directive, if the cache is not shared + !(cacheControlDirectives.private && cacheType === "private") && !(cacheControlDirectives["s-maxage"] !== void 0 && cacheType === "shared")) { + return false; + } + if (cacheControlDirectives["no-store"]) { + return false; + } + if (cacheType === "shared" && cacheControlDirectives.private === true) { + return false; + } + if (resHeaders.vary?.includes("*")) { + return false; + } + if (reqHeaders?.authorization) { + if (!cacheControlDirectives.public && !cacheControlDirectives["s-maxage"] && !cacheControlDirectives["must-revalidate"]) { + return false; + } + if (typeof reqHeaders.authorization !== "string") { + return false; + } + if (Array.isArray(cacheControlDirectives["no-cache"]) && cacheControlDirectives["no-cache"].includes("authorization")) { + return false; + } + if (Array.isArray(cacheControlDirectives["private"]) && cacheControlDirectives["private"].includes("authorization")) { + return false; + } + } + return true; } - TOKEN_2022_ERROR__NOT_RENT_EXEMPT = 0; - TOKEN_2022_ERROR__INSUFFICIENT_FUNDS = 1; - TOKEN_2022_ERROR__INVALID_MINT = 2; - TOKEN_2022_ERROR__MINT_MISMATCH = 3; - TOKEN_2022_ERROR__OWNER_MISMATCH = 4; - TOKEN_2022_ERROR__FIXED_SUPPLY = 5; - TOKEN_2022_ERROR__ALREADY_IN_USE = 6; - TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 7; - TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 8; - TOKEN_2022_ERROR__UNINITIALIZED_STATE = 9; - TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED = 10; - TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE = 11; - TOKEN_2022_ERROR__INVALID_INSTRUCTION = 12; - TOKEN_2022_ERROR__INVALID_STATE = 13; - TOKEN_2022_ERROR__OVERFLOW = 14; - TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 15; - TOKEN_2022_ERROR__MINT_CANNOT_FREEZE = 16; - TOKEN_2022_ERROR__ACCOUNT_FROZEN = 17; - TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH = 18; - TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED = 19; - if (process.env.NODE_ENV !== "production") { - token2022ErrorMessages = { - [TOKEN_2022_ERROR__ACCOUNT_FROZEN]: `Account is frozen`, - [TOKEN_2022_ERROR__ALREADY_IN_USE]: `Already in use`, - [TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`, - [TOKEN_2022_ERROR__FIXED_SUPPLY]: `Fixed supply`, - [TOKEN_2022_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`, - [TOKEN_2022_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`, - [TOKEN_2022_ERROR__INVALID_MINT]: `Invalid Mint`, - [TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`, - [TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`, - [TOKEN_2022_ERROR__INVALID_STATE]: `State is invalid for requested operation`, - [TOKEN_2022_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`, - [TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`, - [TOKEN_2022_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`, - [TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`, - [TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`, - [TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`, - [TOKEN_2022_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`, - [TOKEN_2022_ERROR__OVERFLOW]: `Operation overflowed`, - [TOKEN_2022_ERROR__OWNER_MISMATCH]: `Owner does not match`, - [TOKEN_2022_ERROR__UNINITIALIZED_STATE]: `State is unititialized` - }; + function getAge(ageHeader) { + const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader); + return isNaN(age) ? void 0 : age * 1e3; } - EMIT_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([ - 250, - 166, - 180, - 250, - 13, - 12, - 184, - 70 - ]); - INITIALIZE_TOKEN_GROUP_DISCRIMINATOR = new Uint8Array([ - 121, - 113, - 108, - 39, - 54, - 51, - 0, - 4 - ]); - INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR = new Uint8Array([ - 152, - 32, - 222, - 176, - 223, - 237, - 116, - 134 - ]); - INITIALIZE_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([ - 210, - 225, - 30, - 162, - 88, - 184, - 77, - 141 - ]); - REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR = new Uint8Array([ - 234, - 18, - 32, - 56, - 89, - 141, - 37, - 181 - ]); - TRANSFER_CHECKED_DISCRIMINATOR = 12; - UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR = new Uint8Array([ - 108, - 37, - 171, - 143, - 248, - 30, - 18, - 110 - ]); - UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR = new Uint8Array( - [161, 105, 88, 1, 237, 221, 216, 203] - ); - UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR = new Uint8Array([ - 221, - 233, - 49, - 45, - 181, - 202, - 220, - 200 - ]); - UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR = new Uint8Array([215, 228, 166, 228, 84, 100, 86, 123]); - SECONDS_PER_YEAR = 60 * 60 * 24 * 365.24; - } -}); - -// node_modules/@x402/svm/dist/esm/chunk-HEVXVNO4.mjs -function normalizeNetwork(network) { - if (network.includes(":")) { - const supported = [SOLANA_MAINNET_CAIP2, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2]; - if (!supported.includes(network)) { - throw new Error(`Unsupported SVM network: ${network}`); + function determineStaleAt(cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) { + if (cacheType === "shared") { + const sMaxAge = cacheControlDirectives["s-maxage"]; + if (sMaxAge !== void 0) { + return sMaxAge > 0 ? sMaxAge * 1e3 : void 0; + } + } + const maxAge = cacheControlDirectives["max-age"]; + if (maxAge !== void 0) { + return maxAge > 0 ? maxAge * 1e3 : void 0; + } + if (typeof resHeaders.expires === "string") { + const expiresDate = parseHttpDate(resHeaders.expires); + if (expiresDate) { + if (now >= expiresDate.getTime()) { + return void 0; + } + if (responseDate) { + if (responseDate >= expiresDate) { + return void 0; + } + if (age !== void 0 && age > expiresDate - responseDate) { + return void 0; + } + } + return expiresDate.getTime() - now; + } + } + if (typeof resHeaders["last-modified"] === "string") { + const lastModified = new Date(resHeaders["last-modified"]); + if (isValidDate(lastModified)) { + if (lastModified.getTime() >= now) { + return void 0; + } + const responseAge = now - lastModified.getTime(); + return responseAge * 0.1; + } + } + if (cacheControlDirectives.immutable) { + return 31536e3; + } + return void 0; } - return network; - } - const caip2Network = V1_TO_V2_NETWORK_MAP[network]; - if (!caip2Network) { - throw new Error(`Unsupported SVM network: ${network}`); - } - return caip2Network; -} -function createRpcClient(network, customRpcUrl) { - const caip2Network = normalizeNetwork(network); - switch (caip2Network) { - case SOLANA_DEVNET_CAIP2: { - const url = customRpcUrl || DEVNET_RPC_URL; - return createSolanaRpc(devnet(url)); + function determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, staleAt) { + let staleWhileRevalidate = -Infinity; + let staleIfError = -Infinity; + let immutable = -Infinity; + if (cacheControlDirectives["stale-while-revalidate"]) { + staleWhileRevalidate = staleAt + cacheControlDirectives["stale-while-revalidate"] * 1e3; + } + if (cacheControlDirectives["stale-if-error"]) { + staleIfError = staleAt + cacheControlDirectives["stale-if-error"] * 1e3; + } + if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) { + immutable = cachedAt + 31536e6; + } + if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) { + const freshnessLifetime = staleAt - baseTime; + const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1e3); + return staleAt + freshnessLifetime + datePrecisionPadding; + } + return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable); } - case SOLANA_TESTNET_CAIP2: { - const url = customRpcUrl || TESTNET_RPC_URL; - return createSolanaRpc(testnet(url)); + function stripNecessaryHeaders(resHeaders, cacheControlDirectives) { + const headersToRemove = [ + "connection", + "proxy-authenticate", + "proxy-authentication-info", + "proxy-authorization", + "proxy-connection", + "te", + "transfer-encoding", + "upgrade", + // We'll add age back when serving it + "age" + ]; + if (resHeaders["connection"]) { + if (Array.isArray(resHeaders["connection"])) { + headersToRemove.push(...resHeaders["connection"].map((header) => header.trim())); + } else { + headersToRemove.push(...resHeaders["connection"].split(",").map((header) => header.trim())); + } + } + if (Array.isArray(cacheControlDirectives["no-cache"])) { + headersToRemove.push(...cacheControlDirectives["no-cache"]); + } + if (Array.isArray(cacheControlDirectives["private"])) { + headersToRemove.push(...cacheControlDirectives["private"]); + } + let strippedHeaders; + for (const headerName of headersToRemove) { + if (resHeaders[headerName]) { + strippedHeaders ??= { ...resHeaders }; + delete strippedHeaders[headerName]; + } + } + return strippedHeaders ?? resHeaders; } - case SOLANA_MAINNET_CAIP2: { - const url = customRpcUrl || MAINNET_RPC_URL; - return createSolanaRpc(mainnet(url)); + function isValidDate(date) { + return date instanceof Date && Number.isFinite(date.valueOf()); } - default: - throw new Error(`Unsupported network: ${network}`); + module.exports = CacheHandler; } -} -var MEMO_PROGRAM_ADDRESS, DEVNET_RPC_URL, TESTNET_RPC_URL, MAINNET_RPC_URL, DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, DEFAULT_COMPUTE_UNIT_LIMIT, SOLANA_MAINNET_CAIP2, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2, V1_TO_V2_NETWORK_MAP; -var init_chunk_HEVXVNO4 = __esm({ - "node_modules/@x402/svm/dist/esm/chunk-HEVXVNO4.mjs"() { +}); + +// node_modules/undici/lib/cache/memory-cache-store.js +var require_memory_cache_store = __commonJS({ + "node_modules/undici/lib/cache/memory-cache-store.js"(exports, module) { "use strict"; - init_index_node37(); - MEMO_PROGRAM_ADDRESS = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"; - DEVNET_RPC_URL = "https://api.devnet.solana.com"; - TESTNET_RPC_URL = "https://api.testnet.solana.com"; - MAINNET_RPC_URL = "https://api.mainnet-beta.solana.com"; - DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1; - DEFAULT_COMPUTE_UNIT_LIMIT = 2e4; - SOLANA_MAINNET_CAIP2 = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"; - SOLANA_DEVNET_CAIP2 = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"; - SOLANA_TESTNET_CAIP2 = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"; - V1_TO_V2_NETWORK_MAP = { - solana: SOLANA_MAINNET_CAIP2, - "solana-devnet": SOLANA_DEVNET_CAIP2, - "solana-testnet": SOLANA_TESTNET_CAIP2 + var { Writable } = __require("stream"); + var { EventEmitter } = __require("events"); + var { assertCacheKey, assertCacheValue } = require_cache(); + var MemoryCacheStore = class extends EventEmitter { + #maxCount = 1024; + #maxSize = 104857600; + // 100MB + #maxEntrySize = 5242880; + // 5MB + #size = 0; + #count = 0; + #entries = /* @__PURE__ */ new Map(); + #hasEmittedMaxSizeEvent = false; + /** + * @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts] + */ + constructor(opts) { + super(); + if (opts) { + if (typeof opts !== "object") { + throw new TypeError("MemoryCacheStore options must be an object"); + } + if (opts.maxCount !== void 0) { + if (typeof opts.maxCount !== "number" || !Number.isInteger(opts.maxCount) || opts.maxCount < 0) { + throw new TypeError("MemoryCacheStore options.maxCount must be a non-negative integer"); + } + this.#maxCount = opts.maxCount; + } + if (opts.maxSize !== void 0) { + if (typeof opts.maxSize !== "number" || !Number.isInteger(opts.maxSize) || opts.maxSize < 0) { + throw new TypeError("MemoryCacheStore options.maxSize must be a non-negative integer"); + } + this.#maxSize = opts.maxSize; + } + if (opts.maxEntrySize !== void 0) { + if (typeof opts.maxEntrySize !== "number" || !Number.isInteger(opts.maxEntrySize) || opts.maxEntrySize < 0) { + throw new TypeError("MemoryCacheStore options.maxEntrySize must be a non-negative integer"); + } + this.#maxEntrySize = opts.maxEntrySize; + } + } + } + /** + * Get the current size of the cache in bytes + * @returns {number} The current size of the cache in bytes + */ + get size() { + return this.#size; + } + /** + * Check if the cache is full (either max size or max count reached) + * @returns {boolean} True if the cache is full, false otherwise + */ + isFull() { + return this.#size >= this.#maxSize || this.#count >= this.#maxCount; + } + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req + * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} + */ + get(key) { + assertCacheKey(key); + const topLevelKey = `${key.origin}:${key.path}`; + const now = Date.now(); + const entries = this.#entries.get(topLevelKey); + const entry = entries ? findEntry(key, entries, now) : null; + return entry == null ? void 0 : { + statusMessage: entry.statusMessage, + statusCode: entry.statusCode, + headers: entry.headers, + body: entry.body, + vary: entry.vary ? entry.vary : void 0, + etag: entry.etag, + cacheControlDirectives: entry.cacheControlDirectives, + cachedAt: entry.cachedAt, + staleAt: entry.staleAt, + deleteAt: entry.deleteAt + }; + } + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} val + * @returns {Writable | undefined} + */ + createWriteStream(key, val) { + assertCacheKey(key); + assertCacheValue(val); + const topLevelKey = `${key.origin}:${key.path}`; + const store = this; + const entry = { ...key, ...val, body: [], size: 0 }; + return new Writable({ + write(chunk, encoding, callback) { + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, encoding); + } + entry.size += chunk.byteLength; + if (entry.size >= store.#maxEntrySize) { + this.destroy(); + } else { + entry.body.push(chunk); + } + callback(null); + }, + final(callback) { + let entries = store.#entries.get(topLevelKey); + if (!entries) { + entries = []; + store.#entries.set(topLevelKey, entries); + } + const previousEntry = findEntry(key, entries, Date.now()); + if (previousEntry) { + const index2 = entries.indexOf(previousEntry); + entries.splice(index2, 1, entry); + store.#size -= previousEntry.size; + } else { + entries.push(entry); + store.#count += 1; + } + store.#size += entry.size; + if (store.#size > store.#maxSize || store.#count > store.#maxCount) { + if (!store.#hasEmittedMaxSizeEvent) { + store.emit("maxSizeExceeded", { + size: store.#size, + maxSize: store.#maxSize, + count: store.#count, + maxCount: store.#maxCount + }); + store.#hasEmittedMaxSizeEvent = true; + } + for (const [key2, entries2] of store.#entries) { + for (const entry2 of entries2.splice(0, entries2.length / 2)) { + store.#size -= entry2.size; + store.#count -= 1; + } + if (entries2.length === 0) { + store.#entries.delete(key2); + } + } + if (store.#size < store.#maxSize && store.#count < store.#maxCount) { + store.#hasEmittedMaxSizeEvent = false; + } + } + callback(null); + } + }); + } + /** + * @param {CacheKey} key + */ + delete(key) { + if (typeof key !== "object") { + throw new TypeError(`expected key to be object, got ${typeof key}`); + } + const topLevelKey = `${key.origin}:${key.path}`; + for (const entry of this.#entries.get(topLevelKey) ?? []) { + this.#size -= entry.size; + this.#count -= 1; + } + this.#entries.delete(topLevelKey); + } }; + function findEntry(key, entries, now) { + return entries.find((entry) => entry.deleteAt > now && entry.method === key.method && (entry.vary == null || Object.keys(entry.vary).every((headerName) => { + if (entry.vary[headerName] === null) { + return key.headers[headerName] === void 0; + } + return entry.vary[headerName] === key.headers[headerName]; + }))); + } + module.exports = MemoryCacheStore; } }); -// node_modules/@x402/svm/node_modules/@solana-program/compute-budget/dist/src/index.mjs -function getSetComputeUnitLimitInstructionDataEncoder() { - return transformEncoder( - getStructEncoder([ - ["discriminator", getU8Encoder()], - ["units", getU32Encoder()] - ]), - (value) => ({ - ...value, - discriminator: SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR - }) - ); -} -function getSetComputeUnitLimitInstruction(input, config) { - const programAddress = config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS; - const args = { ...input }; - return Object.freeze({ - data: getSetComputeUnitLimitInstructionDataEncoder().encode( - args - ), - programAddress - }); -} -function getSetComputeUnitPriceInstructionDataEncoder() { - return transformEncoder( - getStructEncoder([ - ["discriminator", getU8Encoder()], - ["microLamports", getU64Encoder()] - ]), - (value) => ({ - ...value, - discriminator: SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR - }) - ); -} -function getSetComputeUnitPriceInstruction(input, config) { - const programAddress = config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS; - const args = { ...input }; - return Object.freeze({ - data: getSetComputeUnitPriceInstructionDataEncoder().encode( - args - ), - programAddress - }); -} -function setTransactionMessageComputeUnitPrice(microLamports, transactionMessage) { - return appendTransactionMessageInstruction( - getSetComputeUnitPriceInstruction({ microLamports }), - transactionMessage - ); -} -var COMPUTE_BUDGET_PROGRAM_ADDRESS, SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR, SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR; -var init_src3 = __esm({ - "node_modules/@x402/svm/node_modules/@solana-program/compute-budget/dist/src/index.mjs"() { - "use strict"; - init_index_node37(); - COMPUTE_BUDGET_PROGRAM_ADDRESS = "ComputeBudget111111111111111111111111111111"; - SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR = 2; - SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR = 3; - } -}); - -// node_modules/@x402/svm/dist/esm/chunk-6GZCHEXV.mjs -var ExactSvmScheme; -var init_chunk_6GZCHEXV = __esm({ - "node_modules/@x402/svm/dist/esm/chunk-6GZCHEXV.mjs"() { +// node_modules/undici/lib/handler/cache-revalidation-handler.js +var require_cache_revalidation_handler = __commonJS({ + "node_modules/undici/lib/handler/cache-revalidation-handler.js"(exports, module) { "use strict"; - init_chunk_HEVXVNO4(); - init_src3(); - init_src(); - init_src2(); - init_index_node37(); - ExactSvmScheme = class { + var assert8 = __require("assert"); + var CacheRevalidationHandler = class { + #successful = false; /** - * Creates a new ExactSvmClient instance. - * - * @param signer - The SVM signer for client operations - * @param config - Optional configuration with custom RPC URL - * @returns ExactSvmClient instance + * @type {((boolean, any) => void) | null} */ - constructor(signer, config) { - this.signer = signer; - this.config = config; - this.scheme = "exact"; - } + #callback; /** - * Creates a payment payload for the Exact scheme. - * - * @param x402Version - The x402 protocol version - * @param paymentRequirements - The payment requirements - * @returns Promise resolving to a payment payload + * @type {(import('../../types/dispatcher.d.ts').default.DispatchHandler)} */ - async createPaymentPayload(x402Version2, paymentRequirements) { - const rpc = createRpcClient(paymentRequirements.network, this.config?.rpcUrl); - const tokenMint = await fetchMint(rpc, paymentRequirements.asset); - const tokenProgramAddress = tokenMint.programAddress; - if (tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() && tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()) { - throw new Error("Asset was not created by a known token program"); + #handler; + #context; + /** + * @type {boolean} + */ + #allowErrorStatusCodes; + /** + * @param {(boolean) => void} callback Function to call if the cached value is valid + * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler + * @param {boolean} allowErrorStatusCodes + */ + constructor(callback, handler, allowErrorStatusCodes) { + if (typeof callback !== "function") { + throw new TypeError("callback must be a function"); } - const [sourceATA] = await findAssociatedTokenPda({ - mint: paymentRequirements.asset, - owner: this.signer.address, - tokenProgram: tokenProgramAddress - }); - const [destinationATA] = await findAssociatedTokenPda({ - mint: paymentRequirements.asset, - owner: paymentRequirements.payTo, - tokenProgram: tokenProgramAddress - }); - const transferIx = getTransferCheckedInstruction( - { - source: sourceATA, - mint: paymentRequirements.asset, - destination: destinationATA, - authority: this.signer, - amount: BigInt(paymentRequirements.amount), - decimals: tokenMint.data.decimals - }, - { programAddress: tokenProgramAddress } - ); - const feePayer = paymentRequirements.extra?.feePayer; - if (!feePayer) { - throw new Error("feePayer is required in paymentRequirements.extra for SVM transactions"); + this.#callback = callback; + this.#handler = handler; + this.#allowErrorStatusCodes = allowErrorStatusCodes; + } + onRequestStart(_, context) { + this.#successful = false; + this.#context = context; + } + onRequestUpgrade(controller, statusCode, headers, socket) { + this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket); + } + onResponseStart(controller, statusCode, headers, statusMessage) { + assert8(this.#callback != null); + this.#successful = statusCode === 304 || this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504; + this.#callback(this.#successful, this.#context); + this.#callback = null; + if (this.#successful) { + return true; } - const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); - const nonce = crypto.getRandomValues(new Uint8Array(16)); - const memoIx = { - programAddress: MEMO_PROGRAM_ADDRESS, - accounts: [], - data: new TextEncoder().encode( - Array.from(nonce).map((b) => b.toString(16).padStart(2, "0")).join("") - ) - }; - const tx = pipe( - createTransactionMessage({ version: 0 }), - (tx2) => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx2), - (tx2) => setTransactionMessageFeePayer(feePayer, tx2), - (tx2) => prependTransactionMessageInstruction( - getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }), - tx2 - ), - (tx2) => appendTransactionMessageInstructions([transferIx, memoIx], tx2), - (tx2) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx2) + this.#handler.onRequestStart?.(controller, this.#context); + this.#handler.onResponseStart?.( + controller, + statusCode, + headers, + statusMessage ); - const signedTransaction = await partiallySignTransactionMessageWithSigners(tx); - const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction); - const payload = { - transaction: base64EncodedWireTransaction + } + onResponseData(controller, chunk) { + if (this.#successful) { + return; + } + return this.#handler.onResponseData?.(controller, chunk); + } + onResponseEnd(controller, trailers) { + if (this.#successful) { + return; + } + this.#handler.onResponseEnd?.(controller, trailers); + } + onResponseError(controller, err) { + if (this.#successful) { + return; + } + if (this.#callback) { + this.#callback(false); + this.#callback = null; + } + if (typeof this.#handler.onResponseError === "function") { + this.#handler.onResponseError(controller, err); + } else { + throw err; + } + } + }; + module.exports = CacheRevalidationHandler; + } +}); + +// node_modules/undici/lib/interceptor/cache.js +var require_cache2 = __commonJS({ + "node_modules/undici/lib/interceptor/cache.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { Readable } = __require("stream"); + var util2 = require_util(); + var CacheHandler = require_cache_handler(); + var MemoryCacheStore = require_memory_cache_store(); + var CacheRevalidationHandler = require_cache_revalidation_handler(); + var { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders: normalizeHeaders3, parseCacheControlHeader } = require_cache(); + var { AbortError } = require_errors(); + function assertCacheOrigins(origins, name) { + if (origins === void 0) return; + if (!Array.isArray(origins)) { + throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`); + } + for (let i = 0; i < origins.length; i++) { + const origin = origins[i]; + if (typeof origin !== "string" && !(origin instanceof RegExp)) { + throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`); + } + } + } + var nop = () => { + }; + function needsRevalidation(result, cacheControlDirectives, { headers = {} }) { + if (cacheControlDirectives?.["no-cache"]) { + return true; + } + if (result.cacheControlDirectives?.["no-cache"] && !Array.isArray(result.cacheControlDirectives["no-cache"])) { + return true; + } + if (headers["if-modified-since"] || headers["if-none-match"]) { + return true; + } + return false; + } + function isStale(result, cacheControlDirectives) { + const now = Date.now(); + if (now > result.staleAt) { + if (cacheControlDirectives?.["max-stale"]) { + const gracePeriod = result.staleAt + cacheControlDirectives["max-stale"] * 1e3; + return now > gracePeriod; + } + return true; + } + if (cacheControlDirectives?.["min-fresh"]) { + const timeLeftTillStale = result.staleAt - now; + const threshold = cacheControlDirectives["min-fresh"] * 1e3; + return timeLeftTillStale <= threshold; + } + return false; + } + function withinStaleWhileRevalidateWindow(result) { + const staleWhileRevalidate = result.cacheControlDirectives?.["stale-while-revalidate"]; + if (!staleWhileRevalidate) { + return false; + } + const now = Date.now(); + const staleWhileRevalidateExpiry = result.staleAt + staleWhileRevalidate * 1e3; + return now <= staleWhileRevalidateExpiry; + } + function handleUncachedResponse(dispatch, globalOpts, cacheKey2, handler, opts, reqCacheControl) { + if (reqCacheControl?.["only-if-cached"]) { + let aborted = false; + const controller = { + paused: false, + rawHeaders: [], + rawTrailers: [], + pause() { + this.paused = true; + }, + resume() { + this.paused = false; + }, + abort: (reason) => { + aborted = true; + handler.onResponseError?.(controller, reason ?? new AbortError()); + } }; - return { - x402Version: x402Version2, - payload + try { + handler.onRequestStart?.(controller, null); + if (aborted) { + return; + } + handler.onResponseStart?.(controller, 504, {}, "Gateway Timeout"); + if (aborted) { + return; + } + handler.onResponseEnd?.(controller, {}); + } catch (err) { + if (typeof handler.onResponseError === "function") { + handler.onResponseError(controller, err); + } + } + return true; + } + return dispatch(opts, new CacheHandler(globalOpts, cacheKey2, handler)); + } + function sendCachedValue(handler, opts, result, age, context, isStale2) { + const stream = util2.isStream(result.body) ? result.body : Readable.from(result.body ?? []); + assert8(!stream.destroyed, "stream should not be destroyed"); + assert8(!stream.readableDidRead, "stream should not be readableDidRead"); + const controller = { + rawHeaders: [], + rawTrailers: [], + resume() { + stream.resume(); + }, + pause() { + stream.pause(); + }, + get paused() { + return stream.isPaused(); + }, + get aborted() { + return stream.destroyed; + }, + get reason() { + return stream.errored; + }, + abort(reason) { + stream.destroy(reason ?? new AbortError()); + } + }; + stream.on("error", function(err) { + if (!this.readableEnded) { + if (typeof handler.onResponseError === "function") { + handler.onResponseError(controller, err); + } else { + throw err; + } + } + }).on("close", function() { + if (!this.errored) { + handler.onResponseEnd?.(controller, {}); + } + }); + handler.onRequestStart?.(controller, context); + if (stream.destroyed) { + return; + } + const headers = { ...result.headers, age: String(age) }; + if (isStale2) { + headers.warning = '110 - "response is stale"'; + } + controller.rawHeaders = util2.toRawHeaders(headers); + handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage); + if (opts.method === "HEAD") { + stream.destroy(); + } else { + stream.on("data", function(chunk) { + handler.onResponseData?.(controller, chunk); + }); + } + } + function handleResult2(dispatch, globalOpts, cacheKey2, handler, opts, reqCacheControl, result) { + if (!result) { + return handleUncachedResponse(dispatch, globalOpts, cacheKey2, handler, opts, reqCacheControl); + } + const now = Date.now(); + if (now > result.deleteAt) { + return dispatch(opts, new CacheHandler(globalOpts, cacheKey2, handler)); + } + const age = Math.round((now - result.cachedAt) / 1e3); + if (reqCacheControl?.["max-age"] && age >= reqCacheControl["max-age"]) { + return dispatch(opts, handler); + } + const stale = isStale(result, reqCacheControl); + const revalidate = needsRevalidation(result, reqCacheControl, opts); + if (stale || revalidate) { + if (util2.isStream(opts.body) && util2.bodyLength(opts.body) !== 0) { + return dispatch(opts, new CacheHandler(globalOpts, cacheKey2, handler)); + } + if (!revalidate && withinStaleWhileRevalidateWindow(result)) { + sendCachedValue(handler, opts, result, age, null, true); + queueMicrotask(() => { + const headers2 = { + ...opts.headers, + "if-modified-since": new Date(result.cachedAt).toUTCString() + }; + if (result.etag) { + headers2["if-none-match"] = result.etag; + } + if (result.vary) { + for (const key in result.vary) { + if (result.vary[key] != null) { + headers2[key] = result.vary[key]; + } + } + } + dispatch( + { + ...opts, + headers: headers2 + }, + new CacheHandler(globalOpts, cacheKey2, { + // Silent handler that just updates the cache + onRequestStart() { + }, + onRequestUpgrade() { + }, + onResponseStart() { + }, + onResponseData() { + }, + onResponseEnd() { + }, + onResponseError() { + } + }) + ); + }); + return true; + } + let withinStaleIfErrorThreshold = false; + const staleIfErrorExpiry = result.cacheControlDirectives["stale-if-error"] ?? reqCacheControl?.["stale-if-error"]; + if (staleIfErrorExpiry) { + withinStaleIfErrorThreshold = now < result.staleAt + staleIfErrorExpiry * 1e3; + } + const headers = { + ...opts.headers, + "if-modified-since": new Date(result.cachedAt).toUTCString() }; - } - }; - } -}); - -// node_modules/@x402/svm/dist/esm/chunk-WWACQNRQ.mjs -var NETWORKS2; -var init_chunk_WWACQNRQ = __esm({ - "node_modules/@x402/svm/dist/esm/chunk-WWACQNRQ.mjs"() { - "use strict"; - NETWORKS2 = ["solana", "solana-devnet", "solana-testnet"]; - } -}); - -// node_modules/@x402/svm/dist/esm/chunk-EO43QE5K.mjs -var ExactSvmSchemeV1; -var init_chunk_EO43QE5K = __esm({ - "node_modules/@x402/svm/dist/esm/chunk-EO43QE5K.mjs"() { - "use strict"; - init_chunk_HEVXVNO4(); - init_src3(); - init_src(); - init_src2(); - init_index_node37(); - ExactSvmSchemeV1 = class { - /** - * Creates a new ExactSvmClientV1 instance. - * - * @param signer - The SVM signer for client operations - * @param config - Optional configuration with custom RPC URL - * @returns ExactSvmClientV1 instance - */ - constructor(signer, config) { - this.signer = signer; - this.config = config; - this.scheme = "exact"; - } - /** - * Creates a payment payload for the Exact scheme (V1). - * - * @param x402Version - The x402 protocol version - * @param paymentRequirements - The payment requirements - * @returns Promise resolving to a payment payload - */ - async createPaymentPayload(x402Version2, paymentRequirements) { - const selectedV1 = paymentRequirements; - const rpc = createRpcClient(selectedV1.network, this.config?.rpcUrl); - const tokenMint = await fetchMint(rpc, selectedV1.asset); - const tokenProgramAddress = tokenMint.programAddress; - if (tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() && tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()) { - throw new Error("Asset was not created by a known token program"); + if (result.etag) { + headers["if-none-match"] = result.etag; } - const [sourceATA] = await findAssociatedTokenPda({ - mint: selectedV1.asset, - owner: this.signer.address, - tokenProgram: tokenProgramAddress - }); - const [destinationATA] = await findAssociatedTokenPda({ - mint: selectedV1.asset, - owner: selectedV1.payTo, - tokenProgram: tokenProgramAddress - }); - const transferIx = getTransferCheckedInstruction( + if (result.vary) { + for (const key in result.vary) { + if (result.vary[key] != null) { + headers[key] = result.vary[key]; + } + } + } + return dispatch( { - source: sourceATA, - mint: selectedV1.asset, - destination: destinationATA, - authority: this.signer, - amount: BigInt(selectedV1.maxAmountRequired), - decimals: tokenMint.data.decimals + ...opts, + headers }, - { programAddress: tokenProgramAddress } - ); - const feePayer = selectedV1.extra?.feePayer; - if (!feePayer) { - throw new Error("feePayer is required in paymentRequirements.extra for SVM transactions"); - } - const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); - const nonce = crypto.getRandomValues(new Uint8Array(16)); - const memoIx = { - programAddress: MEMO_PROGRAM_ADDRESS, - accounts: [], - data: new TextEncoder().encode( - Array.from(nonce).map((b) => b.toString(16).padStart(2, "0")).join("") + new CacheRevalidationHandler( + (success, context) => { + if (success) { + sendCachedValue(handler, opts, result, age, context, stale); + } else if (util2.isStream(result.body)) { + result.body.on("error", nop).destroy(); + } + }, + new CacheHandler(globalOpts, cacheKey2, handler), + withinStaleIfErrorThreshold ) - }; - const tx = pipe( - createTransactionMessage({ version: 0 }), - (tx2) => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx2), - (tx2) => setTransactionMessageFeePayer(feePayer, tx2), - (tx2) => prependTransactionMessageInstruction( - getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }), - tx2 - ), - (tx2) => appendTransactionMessageInstructions([transferIx, memoIx], tx2), - (tx2) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx2) ); - const signedTransaction = await partiallySignTransactionMessageWithSigners(tx); - const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction); - const payload = { - transaction: base64EncodedWireTransaction - }; - return { - x402Version: x402Version2, - scheme: selectedV1.scheme, - network: selectedV1.network, - payload - }; } - }; - } -}); - -// node_modules/@x402/svm/dist/esm/chunk-KCM7FK7D.mjs -var init_chunk_KCM7FK7D = __esm({ - "node_modules/@x402/svm/dist/esm/chunk-KCM7FK7D.mjs"() { - "use strict"; - init_chunk_HEVXVNO4(); - } -}); - -// node_modules/@x402/svm/dist/esm/chunk-GOPQSG4N.mjs -var init_chunk_GOPQSG4N = __esm({ - "node_modules/@x402/svm/dist/esm/chunk-GOPQSG4N.mjs"() { - "use strict"; - init_chunk_KCM7FK7D(); - init_chunk_HEVXVNO4(); - } -}); - -// node_modules/@x402/svm/dist/esm/exact/client/index.mjs -var client_exports = {}; -__export(client_exports, { - ExactSvmScheme: () => ExactSvmScheme, - registerExactSvmScheme: () => registerExactSvmScheme -}); -function registerExactSvmScheme(client, config) { - if (config.networks && config.networks.length > 0) { - config.networks.forEach((network) => { - client.register(network, new ExactSvmScheme(config.signer)); - }); - } else { - client.register("solana:*", new ExactSvmScheme(config.signer)); - } - NETWORKS2.forEach((network) => { - client.registerV1(network, new ExactSvmSchemeV1(config.signer)); - }); - if (config.policies) { - config.policies.forEach((policy) => { - client.registerPolicy(policy); - }); - } - return client; -} -var init_client = __esm({ - "node_modules/@x402/svm/dist/esm/exact/client/index.mjs"() { - "use strict"; - init_chunk_6GZCHEXV(); - init_chunk_WWACQNRQ(); - init_chunk_EO43QE5K(); - init_chunk_GOPQSG4N(); - init_chunk_KCM7FK7D(); - init_chunk_HEVXVNO4(); - } -}); - -// src/proxy.ts -import { AsyncLocalStorage } from "async_hooks"; -import { createServer } from "http"; -import { finished } from "stream"; -import { homedir as homedir6 } from "os"; -import { join as join8 } from "path"; -import { mkdir as mkdir3, writeFile as writeFile2, readFile, stat as fsStat } from "fs/promises"; -import { readFileSync as readFileSync2, existsSync as existsSync2 } from "fs"; - -// node_modules/viem/_esm/utils/getAction.js -function getAction(client, actionFn, name) { - const action_implicit = client[actionFn.name]; - if (typeof action_implicit === "function") - return action_implicit; - const action_explicit = client[name]; - if (typeof action_explicit === "function") - return action_explicit; - return (params) => actionFn(client, params); -} - -// node_modules/viem/_esm/utils/abi/encodeEventTopics.js -init_abi(); - -// node_modules/viem/_esm/errors/log.js -init_base(); -var FilterTypeNotSupportedError = class extends BaseError2 { - constructor(type) { - super(`Filter type "${type}" is not supported.`, { - name: "FilterTypeNotSupportedError" - }); - } -}; - -// node_modules/viem/_esm/utils/abi/encodeEventTopics.js -init_toBytes(); -init_keccak256(); -init_toEventSelector(); -init_encodeAbiParameters(); -init_formatAbiItem2(); -init_getAbiItem(); -var docsPath = "/docs/contract/encodeEventTopics"; -function encodeEventTopics(parameters) { - const { abi: abi2, eventName, args } = parameters; - let abiItem = abi2[0]; - if (eventName) { - const item = getAbiItem({ abi: abi2, name: eventName }); - if (!item) - throw new AbiEventNotFoundError(eventName, { docsPath }); - abiItem = item; - } - if (abiItem.type !== "event") - throw new AbiEventNotFoundError(void 0, { docsPath }); - const definition = formatAbiItem2(abiItem); - const signature2 = toEventSelector(definition); - let topics = []; - if (args && "inputs" in abiItem) { - const indexedInputs = abiItem.inputs?.filter((param) => "indexed" in param && param.indexed); - const args_ = Array.isArray(args) ? args : Object.values(args).length > 0 ? indexedInputs?.map((x) => args[x.name]) ?? [] : []; - if (args_.length > 0) { - topics = indexedInputs?.map((param, i) => { - if (Array.isArray(args_[i])) - return args_[i].map((_, j) => encodeArg({ param, value: args_[i][j] })); - return typeof args_[i] !== "undefined" && args_[i] !== null ? encodeArg({ param, value: args_[i] }) : null; - }) ?? []; - } - } - return [signature2, ...topics]; -} -function encodeArg({ param, value }) { - if (param.type === "string" || param.type === "bytes") - return keccak256(toBytes(value)); - if (param.type === "tuple" || param.type.match(/^(.*)\[(\d+)?\]$/)) - throw new FilterTypeNotSupportedError(param.type); - return encodeAbiParameters([param], [value]); -} - -// node_modules/viem/_esm/actions/public/createContractEventFilter.js -init_toHex(); - -// node_modules/viem/_esm/utils/filters/createFilterRequestScope.js -function createFilterRequestScope(client, { method }) { - const requestMap = {}; - if (client.transport.type === "fallback") - client.transport.onResponse?.(({ method: method_, response: id, status, transport }) => { - if (status === "success" && method === method_) - requestMap[id] = transport.request; - }); - return ((id) => requestMap[id] || client.request); -} - -// node_modules/viem/_esm/actions/public/createContractEventFilter.js -async function createContractEventFilter(client, parameters) { - const { address: address2, abi: abi2, args, eventName, fromBlock, strict, toBlock } = parameters; - const getRequest = createFilterRequestScope(client, { - method: "eth_newFilter" - }); - const topics = eventName ? encodeEventTopics({ - abi: abi2, - args, - eventName - }) : void 0; - const id = await client.request({ - method: "eth_newFilter", - params: [ - { - address: address2, - fromBlock: typeof fromBlock === "bigint" ? numberToHex(fromBlock) : fromBlock, - toBlock: typeof toBlock === "bigint" ? numberToHex(toBlock) : toBlock, - topics + if (util2.isStream(opts.body)) { + opts.body.on("error", nop).destroy(); } - ] - }); - return { - abi: abi2, - args, - eventName, - id, - request: getRequest(id), - strict: Boolean(strict), - type: "event" - }; -} - -// node_modules/viem/_esm/actions/public/estimateContractGas.js -init_parseAccount(); -init_encodeFunctionData(); - -// node_modules/viem/_esm/utils/errors/getContractError.js -init_abi(); -init_base(); -init_contract(); -init_request(); -init_rpc(); -var EXECUTION_REVERTED_ERROR_CODE = 3; -function getContractError(err, { abi: abi2, address: address2, args, docsPath: docsPath8, functionName, sender }) { - const error = err instanceof RawContractError ? err : err instanceof BaseError2 ? err.walk((err2) => "data" in err2) || err.walk() : {}; - const { code, data, details, message, shortMessage } = error; - const cause = (() => { - if (err instanceof AbiDecodingZeroDataError) - return new ContractFunctionZeroDataError({ functionName, cause: err }); - if ([EXECUTION_REVERTED_ERROR_CODE, InternalRpcError.code].includes(code) && (data || details || message || shortMessage) || code === InvalidInputRpcError.code && details === "execution reverted" && data) { - return new ContractFunctionRevertedError({ - abi: abi2, - data: typeof data === "object" ? data.data : data, - functionName, - message: error instanceof RpcRequestError ? details : shortMessage ?? message, - cause: err - }); - } - return err; - })(); - return new ContractFunctionExecutionError(cause, { - abi: abi2, - args, - contractAddress: address2, - docsPath: docsPath8, - functionName, - sender - }); -} - -// node_modules/viem/_esm/actions/public/estimateGas.js -init_parseAccount(); -init_base(); - -// node_modules/viem/_esm/utils/signature/recoverAddress.js -init_publicKeyToAddress(); - -// node_modules/viem/_esm/utils/signature/recoverPublicKey.js -init_isHex(); -init_size(); -init_fromHex(); -init_toHex(); -async function recoverPublicKey({ hash: hash3, signature: signature2 }) { - const hashHex = isHex(hash3) ? hash3 : toHex(hash3); - const { secp256k1: secp256k14 } = await Promise.resolve().then(() => (init_secp256k1(), secp256k1_exports)); - const signature_ = (() => { - if (typeof signature2 === "object" && "r" in signature2 && "s" in signature2) { - const { r, s: s3, v, yParity } = signature2; - const yParityOrV2 = Number(yParity ?? v); - const recoveryBit2 = toRecoveryBit(yParityOrV2); - return new secp256k14.Signature(hexToBigInt(r), hexToBigInt(s3)).addRecoveryBit(recoveryBit2); - } - const signatureHex = isHex(signature2) ? signature2 : toHex(signature2); - if (size(signatureHex) !== 65) - throw new Error("invalid signature length"); - const yParityOrV = hexToNumber(`0x${signatureHex.slice(130)}`); - const recoveryBit = toRecoveryBit(yParityOrV); - return secp256k14.Signature.fromCompact(signatureHex.substring(2, 130)).addRecoveryBit(recoveryBit); - })(); - const publicKey = signature_.recoverPublicKey(hashHex.substring(2)).toHex(false); - return `0x${publicKey}`; -} -function toRecoveryBit(yParityOrV) { - if (yParityOrV === 0 || yParityOrV === 1) - return yParityOrV; - if (yParityOrV === 27) - return 0; - if (yParityOrV === 28) - return 1; - throw new Error("Invalid yParityOrV value"); -} - -// node_modules/viem/_esm/utils/signature/recoverAddress.js -async function recoverAddress({ hash: hash3, signature: signature2 }) { - return publicKeyToAddress(await recoverPublicKey({ hash: hash3, signature: signature2 })); -} - -// node_modules/viem/_esm/utils/authorization/recoverAuthorizationAddress.js -init_hashAuthorization(); -async function recoverAuthorizationAddress(parameters) { - const { authorization, signature: signature2 } = parameters; - return recoverAddress({ - hash: hashAuthorization(authorization), - signature: signature2 ?? authorization - }); -} - -// node_modules/viem/_esm/actions/public/estimateGas.js -init_toHex(); - -// node_modules/viem/_esm/errors/estimateGas.js -init_formatEther(); -init_formatGwei(); -init_base(); -init_transaction(); -var EstimateGasExecutionError = class extends BaseError2 { - constructor(cause, { account, docsPath: docsPath8, chain: chain3, data, gas, gasPrice, maxFeePerGas, maxPriorityFeePerGas, nonce, to, value }) { - const prettyArgs = prettyPrint({ - from: account?.address, - to, - value: typeof value !== "undefined" && `${formatEther(value)} ${chain3?.nativeCurrency?.symbol || "ETH"}`, - data, - gas, - gasPrice: typeof gasPrice !== "undefined" && `${formatGwei(gasPrice)} gwei`, - maxFeePerGas: typeof maxFeePerGas !== "undefined" && `${formatGwei(maxFeePerGas)} gwei`, - maxPriorityFeePerGas: typeof maxPriorityFeePerGas !== "undefined" && `${formatGwei(maxPriorityFeePerGas)} gwei`, - nonce - }); - super(cause.shortMessage, { - cause, - docsPath: docsPath8, - metaMessages: [ - ...cause.metaMessages ? [...cause.metaMessages, " "] : [], - "Estimate Gas Arguments:", - prettyArgs - ].filter(Boolean), - name: "EstimateGasExecutionError" - }); - Object.defineProperty(this, "cause", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - this.cause = cause; - } -}; - -// node_modules/viem/_esm/utils/errors/getEstimateGasError.js -init_node(); -init_getNodeError(); -function getEstimateGasError(err, { docsPath: docsPath8, ...args }) { - const cause = (() => { - const cause2 = getNodeError(err, args); - if (cause2 instanceof UnknownNodeError) - return err; - return cause2; - })(); - return new EstimateGasExecutionError(cause, { - docsPath: docsPath8, - ...args - }); -} - -// node_modules/viem/_esm/actions/public/estimateGas.js -init_extract(); -init_transactionRequest(); -init_stateOverride2(); -init_assertRequest(); - -// node_modules/viem/_esm/actions/wallet/prepareTransactionRequest.js -init_parseAccount(); - -// node_modules/viem/_esm/errors/fee.js -init_formatGwei(); -init_base(); -var BaseFeeScalarError = class extends BaseError2 { - constructor() { - super("`baseFeeMultiplier` must be greater than 1.", { - name: "BaseFeeScalarError" - }); - } -}; -var Eip1559FeesNotSupportedError = class extends BaseError2 { - constructor() { - super("Chain does not support EIP-1559 fees.", { - name: "Eip1559FeesNotSupportedError" - }); - } -}; -var MaxFeePerGasTooLowError = class extends BaseError2 { - constructor({ maxPriorityFeePerGas }) { - super(`\`maxFeePerGas\` cannot be less than the \`maxPriorityFeePerGas\` (${formatGwei(maxPriorityFeePerGas)} gwei).`, { name: "MaxFeePerGasTooLowError" }); - } -}; - -// node_modules/viem/_esm/actions/public/estimateMaxPriorityFeePerGas.js -init_fromHex(); - -// node_modules/viem/_esm/errors/block.js -init_base(); -var BlockNotFoundError = class extends BaseError2 { - constructor({ blockHash, blockNumber }) { - let identifier = "Block"; - if (blockHash) - identifier = `Block at hash "${blockHash}"`; - if (blockNumber) - identifier = `Block at number "${blockNumber}"`; - super(`${identifier} could not be found.`, { name: "BlockNotFoundError" }); - } -}; - -// node_modules/viem/_esm/actions/public/getBlock.js -init_toHex(); - -// node_modules/viem/_esm/utils/formatters/block.js -init_formatter(); - -// node_modules/viem/_esm/utils/formatters/transaction.js -init_fromHex(); -init_formatter(); -var transactionType = { - "0x0": "legacy", - "0x1": "eip2930", - "0x2": "eip1559", - "0x3": "eip4844", - "0x4": "eip7702" -}; -function formatTransaction(transaction, _) { - const transaction_ = { - ...transaction, - blockHash: transaction.blockHash ? transaction.blockHash : null, - blockNumber: transaction.blockNumber ? BigInt(transaction.blockNumber) : null, - chainId: transaction.chainId ? hexToNumber(transaction.chainId) : void 0, - gas: transaction.gas ? BigInt(transaction.gas) : void 0, - gasPrice: transaction.gasPrice ? BigInt(transaction.gasPrice) : void 0, - maxFeePerBlobGas: transaction.maxFeePerBlobGas ? BigInt(transaction.maxFeePerBlobGas) : void 0, - maxFeePerGas: transaction.maxFeePerGas ? BigInt(transaction.maxFeePerGas) : void 0, - maxPriorityFeePerGas: transaction.maxPriorityFeePerGas ? BigInt(transaction.maxPriorityFeePerGas) : void 0, - nonce: transaction.nonce ? hexToNumber(transaction.nonce) : void 0, - to: transaction.to ? transaction.to : null, - transactionIndex: transaction.transactionIndex ? Number(transaction.transactionIndex) : null, - type: transaction.type ? transactionType[transaction.type] : void 0, - typeHex: transaction.type ? transaction.type : void 0, - value: transaction.value ? BigInt(transaction.value) : void 0, - v: transaction.v ? BigInt(transaction.v) : void 0 - }; - if (transaction.authorizationList) - transaction_.authorizationList = formatAuthorizationList2(transaction.authorizationList); - transaction_.yParity = (() => { - if (transaction.yParity) - return Number(transaction.yParity); - if (typeof transaction_.v === "bigint") { - if (transaction_.v === 0n || transaction_.v === 27n) - return 0; - if (transaction_.v === 1n || transaction_.v === 28n) - return 1; - if (transaction_.v >= 35n) - return transaction_.v % 2n === 0n ? 1 : 0; + sendCachedValue(handler, opts, result, age, null, false); } - return void 0; - })(); - if (transaction_.type === "legacy") { - delete transaction_.accessList; - delete transaction_.maxFeePerBlobGas; - delete transaction_.maxFeePerGas; - delete transaction_.maxPriorityFeePerGas; - delete transaction_.yParity; - } - if (transaction_.type === "eip2930") { - delete transaction_.maxFeePerBlobGas; - delete transaction_.maxFeePerGas; - delete transaction_.maxPriorityFeePerGas; + module.exports = (opts = {}) => { + const { + store = new MemoryCacheStore(), + methods = ["GET"], + cacheByDefault = void 0, + type = "shared", + origins = void 0 + } = opts; + if (typeof opts !== "object" || opts === null) { + throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? "null" : typeof opts}`); + } + assertCacheStore(store, "opts.store"); + assertCacheMethods(methods, "opts.methods"); + assertCacheOrigins(origins, "opts.origins"); + if (typeof cacheByDefault !== "undefined" && typeof cacheByDefault !== "number") { + throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`); + } + if (typeof type !== "undefined" && type !== "shared" && type !== "private") { + throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`); + } + const globalOpts = { + store, + methods, + cacheByDefault, + type + }; + const safeMethodsToNotCache = util2.safeHTTPMethods.filter((method) => methods.includes(method) === false); + return (dispatch) => { + return (opts2, handler) => { + if (!opts2.origin || safeMethodsToNotCache.includes(opts2.method)) { + return dispatch(opts2, handler); + } + if (origins !== void 0) { + const requestOrigin = opts2.origin.toString().toLowerCase(); + let isAllowed = false; + for (let i = 0; i < origins.length; i++) { + const allowed = origins[i]; + if (typeof allowed === "string") { + if (allowed.toLowerCase() === requestOrigin) { + isAllowed = true; + break; + } + } else if (allowed.test(requestOrigin)) { + isAllowed = true; + break; + } + } + if (!isAllowed) { + return dispatch(opts2, handler); + } + } + opts2 = { + ...opts2, + headers: normalizeHeaders3(opts2) + }; + const reqCacheControl = opts2.headers?.["cache-control"] ? parseCacheControlHeader(opts2.headers["cache-control"]) : void 0; + if (reqCacheControl?.["no-store"]) { + return dispatch(opts2, handler); + } + const cacheKey2 = makeCacheKey(opts2); + const result = store.get(cacheKey2); + if (result && typeof result.then === "function") { + return result.then((result2) => handleResult2( + dispatch, + globalOpts, + cacheKey2, + handler, + opts2, + reqCacheControl, + result2 + )); + } else { + return handleResult2( + dispatch, + globalOpts, + cacheKey2, + handler, + opts2, + reqCacheControl, + result + ); + } + }; + }; + }; } - if (transaction_.type === "eip1559") - delete transaction_.maxFeePerBlobGas; - return transaction_; -} -var defineTransaction = /* @__PURE__ */ defineFormatter("transaction", formatTransaction); -function formatAuthorizationList2(authorizationList) { - return authorizationList.map((authorization) => ({ - address: authorization.address, - chainId: Number(authorization.chainId), - nonce: Number(authorization.nonce), - r: authorization.r, - s: authorization.s, - yParity: Number(authorization.yParity) - })); -} - -// node_modules/viem/_esm/utils/formatters/block.js -function formatBlock(block, _) { - const transactions = (block.transactions ?? []).map((transaction) => { - if (typeof transaction === "string") - return transaction; - return formatTransaction(transaction); - }); - return { - ...block, - baseFeePerGas: block.baseFeePerGas ? BigInt(block.baseFeePerGas) : null, - blobGasUsed: block.blobGasUsed ? BigInt(block.blobGasUsed) : void 0, - difficulty: block.difficulty ? BigInt(block.difficulty) : void 0, - excessBlobGas: block.excessBlobGas ? BigInt(block.excessBlobGas) : void 0, - gasLimit: block.gasLimit ? BigInt(block.gasLimit) : void 0, - gasUsed: block.gasUsed ? BigInt(block.gasUsed) : void 0, - hash: block.hash ? block.hash : null, - logsBloom: block.logsBloom ? block.logsBloom : null, - nonce: block.nonce ? block.nonce : null, - number: block.number ? BigInt(block.number) : null, - size: block.size ? BigInt(block.size) : void 0, - timestamp: block.timestamp ? BigInt(block.timestamp) : void 0, - transactions, - totalDifficulty: block.totalDifficulty ? BigInt(block.totalDifficulty) : null - }; -} -var defineBlock = /* @__PURE__ */ defineFormatter("block", formatBlock); +}); -// node_modules/viem/_esm/actions/public/getBlock.js -async function getBlock(client, { blockHash, blockNumber, blockTag = client.experimental_blockTag ?? "latest", includeTransactions: includeTransactions_ } = {}) { - const includeTransactions = includeTransactions_ ?? false; - const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; - let block = null; - if (blockHash) { - block = await client.request({ - method: "eth_getBlockByHash", - params: [blockHash, includeTransactions] - }, { dedupe: true }); - } else { - block = await client.request({ - method: "eth_getBlockByNumber", - params: [blockNumberHex || blockTag, includeTransactions] - }, { dedupe: Boolean(blockNumberHex) }); +// node_modules/undici/lib/interceptor/decompress.js +var require_decompress = __commonJS({ + "node_modules/undici/lib/interceptor/decompress.js"(exports, module) { + "use strict"; + var { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = __require("zlib"); + var { pipeline } = __require("stream"); + var DecoratorHandler = require_decorator_handler(); + var supportedEncodings = { + gzip: createGunzip, + "x-gzip": createGunzip, + br: createBrotliDecompress, + deflate: createInflate, + compress: createInflate, + "x-compress": createInflate, + zstd: createZstdDecompress + }; + var defaultSkipStatusCodes = ( + /** @type {const} */ + [204, 304] + ); + var warningEmitted = ( + /** @type {boolean} */ + false + ); + var DecompressHandler = class extends DecoratorHandler { + /** @type {Transform[]} */ + #decompressors = []; + /** @type {Readonly} */ + #skipStatusCodes; + /** @type {boolean} */ + #skipErrorResponses; + constructor(handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) { + super(handler); + this.#skipStatusCodes = skipStatusCodes; + this.#skipErrorResponses = skipErrorResponses; + } + /** + * Determines if decompression should be skipped based on encoding and status code + * @param {string} contentEncoding - Content-Encoding header value + * @param {number} statusCode - HTTP status code of the response + * @returns {boolean} - True if decompression should be skipped + */ + #shouldSkipDecompression(contentEncoding, statusCode) { + if (!contentEncoding || statusCode < 200) return true; + if (this.#skipStatusCodes.includes(statusCode)) return true; + if (this.#skipErrorResponses && statusCode >= 400) return true; + return false; + } + /** + * Creates a chain of decompressors for multiple content encodings + * + * @param {string} encodings - Comma-separated list of content encodings + * @returns {Array} - Array of decompressor streams + * @throws {Error} - If the number of content-encodings exceeds the maximum allowed + */ + #createDecompressionChain(encodings) { + const parts = encodings.split(","); + const maxContentEncodings = 5; + if (parts.length > maxContentEncodings) { + throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`); + } + const decompressors = []; + for (let i = parts.length - 1; i >= 0; i--) { + const encoding = parts[i].trim(); + if (!encoding) continue; + if (!supportedEncodings[encoding]) { + decompressors.length = 0; + return decompressors; + } + decompressors.push(supportedEncodings[encoding]()); + } + return decompressors; + } + /** + * Sets up event handlers for a decompressor stream using readable events + * @param {DecompressorStream} decompressor - The decompressor stream + * @param {Controller} controller - The controller to coordinate with + * @returns {void} + */ + #setupDecompressorEvents(decompressor, controller) { + decompressor.on("readable", () => { + let chunk; + while ((chunk = decompressor.read()) !== null) { + const result = super.onResponseData(controller, chunk); + if (result === false) { + break; + } + } + }); + decompressor.on("error", (error) => { + super.onResponseError(controller, error); + }); + } + /** + * Sets up event handling for a single decompressor + * @param {Controller} controller - The controller to handle events + * @returns {void} + */ + #setupSingleDecompressor(controller) { + const decompressor = this.#decompressors[0]; + this.#setupDecompressorEvents(decompressor, controller); + decompressor.on("end", () => { + super.onResponseEnd(controller, {}); + }); + } + /** + * Sets up event handling for multiple chained decompressors using pipeline + * @param {Controller} controller - The controller to handle events + * @returns {void} + */ + #setupMultipleDecompressors(controller) { + const lastDecompressor = this.#decompressors[this.#decompressors.length - 1]; + this.#setupDecompressorEvents(lastDecompressor, controller); + pipeline(this.#decompressors, (err) => { + if (err) { + super.onResponseError(controller, err); + return; + } + super.onResponseEnd(controller, {}); + }); + } + /** + * Cleans up decompressor references to prevent memory leaks + * @returns {void} + */ + #cleanupDecompressors() { + this.#decompressors.length = 0; + } + /** + * @param {Controller} controller + * @param {number} statusCode + * @param {Record} headers + * @param {string} statusMessage + * @returns {void} + */ + onResponseStart(controller, statusCode, headers, statusMessage) { + const contentEncoding = headers["content-encoding"]; + if (this.#shouldSkipDecompression(contentEncoding, statusCode)) { + return super.onResponseStart(controller, statusCode, headers, statusMessage); + } + const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase()); + if (decompressors.length === 0) { + this.#cleanupDecompressors(); + return super.onResponseStart(controller, statusCode, headers, statusMessage); + } + this.#decompressors = decompressors; + const { "content-encoding": _, "content-length": __, ...newHeaders } = headers; + if (controller?.rawHeaders) { + const rawHeaders = controller.rawHeaders; + if (Array.isArray(rawHeaders)) { + const filteredHeaders = []; + for (let i = 0; i < rawHeaders.length; i += 2) { + const headerName = rawHeaders[i]; + const name = Buffer.isBuffer(headerName) ? headerName.toString("latin1") : `${headerName}`; + const lowerName = name.toLowerCase(); + if (lowerName === "content-encoding" || lowerName === "content-length") { + continue; + } + filteredHeaders.push(rawHeaders[i], rawHeaders[i + 1]); + } + controller.rawHeaders = filteredHeaders; + } else if (typeof rawHeaders === "object") { + for (const name of Object.keys(rawHeaders)) { + const lowerName = name.toLowerCase(); + if (lowerName === "content-encoding" || lowerName === "content-length") { + delete rawHeaders[name]; + } + } + } + } + if (this.#decompressors.length === 1) { + this.#setupSingleDecompressor(controller); + } else { + this.#setupMultipleDecompressors(controller); + } + return super.onResponseStart(controller, statusCode, newHeaders, statusMessage); + } + /** + * @param {Controller} controller + * @param {Buffer} chunk + * @returns {void} + */ + onResponseData(controller, chunk) { + if (this.#decompressors.length > 0) { + this.#decompressors[0].write(chunk); + return; + } + super.onResponseData(controller, chunk); + } + /** + * @param {Controller} controller + * @param {Record | undefined} trailers + * @returns {void} + */ + onResponseEnd(controller, trailers) { + if (this.#decompressors.length > 0) { + this.#decompressors[0].end(); + this.#cleanupDecompressors(); + return; + } + super.onResponseEnd(controller, trailers); + } + /** + * @param {Controller} controller + * @param {Error} err + * @returns {void} + */ + onResponseError(controller, err) { + if (this.#decompressors.length > 0) { + for (const decompressor of this.#decompressors) { + decompressor.destroy(err); + } + this.#cleanupDecompressors(); + } + super.onResponseError(controller, err); + } + }; + function createDecompressInterceptor(options = {}) { + if (!warningEmitted) { + process.emitWarning( + "DecompressInterceptor is experimental and subject to change", + "ExperimentalWarning" + ); + warningEmitted = true; + } + return (dispatch) => { + return (opts, handler) => { + const decompressHandler = new DecompressHandler(handler, options); + return dispatch(opts, decompressHandler); + }; + }; + } + module.exports = createDecompressInterceptor; } - if (!block) - throw new BlockNotFoundError({ blockHash, blockNumber }); - const format = client.chain?.formatters?.block?.format || formatBlock; - return format(block, "getBlock"); -} - -// node_modules/viem/_esm/actions/public/getGasPrice.js -async function getGasPrice(client) { - const gasPrice = await client.request({ - method: "eth_gasPrice" - }); - return BigInt(gasPrice); -} +}); -// node_modules/viem/_esm/actions/public/estimateMaxPriorityFeePerGas.js -async function estimateMaxPriorityFeePerGas(client, args) { - return internal_estimateMaxPriorityFeePerGas(client, args); -} -async function internal_estimateMaxPriorityFeePerGas(client, args) { - const { block: block_, chain: chain3 = client.chain, request } = args || {}; - try { - const maxPriorityFeePerGas = chain3?.fees?.maxPriorityFeePerGas ?? chain3?.fees?.defaultPriorityFee; - if (typeof maxPriorityFeePerGas === "function") { - const block = block_ || await getAction(client, getBlock, "getBlock")({}); - const maxPriorityFeePerGas_ = await maxPriorityFeePerGas({ - block, - client, - request - }); - if (maxPriorityFeePerGas_ === null) - throw new Error(); - return maxPriorityFeePerGas_; - } - if (typeof maxPriorityFeePerGas !== "undefined") - return maxPriorityFeePerGas; - const maxPriorityFeePerGasHex = await client.request({ - method: "eth_maxPriorityFeePerGas" - }); - return hexToBigInt(maxPriorityFeePerGasHex); - } catch { - const [block, gasPrice] = await Promise.all([ - block_ ? Promise.resolve(block_) : getAction(client, getBlock, "getBlock")({}), - getAction(client, getGasPrice, "getGasPrice")({}) - ]); - if (typeof block.baseFeePerGas !== "bigint") - throw new Eip1559FeesNotSupportedError(); - const maxPriorityFeePerGas = gasPrice - block.baseFeePerGas; - if (maxPriorityFeePerGas < 0n) - return 0n; - return maxPriorityFeePerGas; +// node_modules/undici/lib/handler/deduplication-handler.js +var require_deduplication_handler = __commonJS({ + "node_modules/undici/lib/handler/deduplication-handler.js"(exports, module) { + "use strict"; + var { RequestAbortedError } = require_errors(); + var DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024; + var DeduplicationHandler = class { + /** + * @type {DispatchHandler} + */ + #primaryHandler; + /** + * @type {WaitingHandler[]} + */ + #waitingHandlers = []; + /** + * @type {number} + */ + #maxBufferSize = DEFAULT_MAX_BUFFER_SIZE; + /** + * @type {number} + */ + #statusCode = 0; + /** + * @type {Record} + */ + #headers = {}; + /** + * @type {string} + */ + #statusMessage = ""; + /** + * @type {boolean} + */ + #aborted = false; + /** + * @type {boolean} + */ + #responseStarted = false; + /** + * @type {boolean} + */ + #responseDataStarted = false; + /** + * @type {boolean} + */ + #completed = false; + /** + * @type {import('../../types/dispatcher.d.ts').default.DispatchController | null} + */ + #controller = null; + /** + * @type {(() => void) | null} + */ + #onComplete = null; + /** + * @param {DispatchHandler} primaryHandler The primary handler + * @param {() => void} onComplete Callback when request completes + * @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler + */ + constructor(primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) { + this.#primaryHandler = primaryHandler; + this.#onComplete = onComplete; + this.#maxBufferSize = maxBufferSize; + } + /** + * Add a waiting handler that will receive response events. + * Returns false if deduplication can no longer safely attach this handler. + * + * @param {DispatchHandler} handler + * @returns {boolean} + */ + addWaitingHandler(handler) { + if (this.#completed || this.#responseDataStarted) { + return false; + } + const waitingHandler = this.#createWaitingHandler(handler); + const waitingController = waitingHandler.controller; + try { + handler.onRequestStart?.(waitingController, null); + if (waitingController.aborted) { + waitingHandler.done = true; + return true; + } + if (this.#responseStarted) { + handler.onResponseStart?.( + waitingController, + this.#statusCode, + this.#headers, + this.#statusMessage + ); + } + } catch { + waitingHandler.done = true; + return true; + } + if (!waitingController.aborted) { + this.#waitingHandlers.push(waitingHandler); + } + return true; + } + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {any} context + */ + onRequestStart(controller, context) { + this.#controller = controller; + this.#primaryHandler.onRequestStart?.(controller, context); + } + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {number} statusCode + * @param {import('../../types/header.d.ts').IncomingHttpHeaders} headers + * @param {Socket} socket + */ + onRequestUpgrade(controller, statusCode, headers, socket) { + this.#primaryHandler.onRequestUpgrade?.(controller, statusCode, headers, socket); + } + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {number} statusCode + * @param {Record} headers + * @param {string} statusMessage + */ + onResponseStart(controller, statusCode, headers, statusMessage) { + this.#responseStarted = true; + this.#statusCode = statusCode; + this.#headers = headers; + this.#statusMessage = statusMessage; + this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage); + for (const waitingHandler of this.#waitingHandlers) { + const { handler, controller: waitingController } = waitingHandler; + if (waitingHandler.done || waitingController.aborted) { + waitingHandler.done = true; + continue; + } + try { + handler.onResponseStart?.( + waitingController, + statusCode, + headers, + statusMessage + ); + } catch { + } + if (waitingController.aborted) { + waitingHandler.done = true; + } + } + this.#pruneDoneWaitingHandlers(); + } + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {Buffer} chunk + */ + onResponseData(controller, chunk) { + if (this.#aborted || this.#completed) { + return; + } + this.#responseDataStarted = true; + this.#primaryHandler.onResponseData?.(controller, chunk); + for (const waitingHandler of this.#waitingHandlers) { + const { handler, controller: waitingController } = waitingHandler; + if (waitingHandler.done || waitingController.aborted) { + waitingHandler.done = true; + continue; + } + if (waitingController.paused) { + this.#bufferWaitingChunk(waitingHandler, chunk); + continue; + } + try { + handler.onResponseData?.(waitingController, chunk); + } catch { + } + if (waitingController.aborted) { + waitingHandler.done = true; + waitingHandler.bufferedChunks = []; + waitingHandler.bufferedBytes = 0; + } + } + this.#pruneDoneWaitingHandlers(); + } + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {object} trailers + */ + onResponseEnd(controller, trailers) { + if (this.#aborted || this.#completed) { + return; + } + this.#completed = true; + this.#primaryHandler.onResponseEnd?.(controller, trailers); + for (const waitingHandler of this.#waitingHandlers) { + if (waitingHandler.done || waitingHandler.controller.aborted) { + waitingHandler.done = true; + continue; + } + this.#flushWaitingHandler(waitingHandler); + if (waitingHandler.done || waitingHandler.controller.aborted) { + waitingHandler.done = true; + continue; + } + if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) { + waitingHandler.pendingTrailers = trailers; + continue; + } + try { + waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers); + } catch { + } + waitingHandler.done = true; + } + this.#pruneDoneWaitingHandlers(); + this.#onComplete?.(); + } + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {Error} err + */ + onResponseError(controller, err) { + if (this.#completed) { + return; + } + this.#aborted = true; + this.#completed = true; + this.#primaryHandler.onResponseError?.(controller, err); + for (const waitingHandler of this.#waitingHandlers) { + this.#errorWaitingHandler(waitingHandler, err); + } + this.#waitingHandlers = []; + this.#onComplete?.(); + } + /** + * @param {DispatchHandler} handler + * @returns {WaitingHandler} + */ + #createWaitingHandler(handler) { + const waitingHandler = { + handler, + controller: null, + bufferedChunks: [], + bufferedBytes: 0, + pendingTrailers: null, + done: false + }; + const state = { + aborted: false, + paused: false, + reason: null + }; + waitingHandler.controller = { + resume: () => { + if (state.aborted) { + return; + } + state.paused = false; + this.#flushWaitingHandler(waitingHandler); + if (this.#completed && waitingHandler.pendingTrailers && waitingHandler.bufferedChunks.length === 0 && !state.paused && !state.aborted) { + try { + waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers); + } catch { + } + waitingHandler.pendingTrailers = null; + waitingHandler.done = true; + } + this.#pruneDoneWaitingHandlers(); + }, + pause: () => { + if (!state.aborted) { + state.paused = true; + } + }, + get paused() { + return state.paused; + }, + get aborted() { + return state.aborted; + }, + get reason() { + return state.reason; + }, + abort: (reason) => { + state.aborted = true; + state.reason = reason ?? null; + waitingHandler.done = true; + waitingHandler.pendingTrailers = null; + waitingHandler.bufferedChunks = []; + waitingHandler.bufferedBytes = 0; + } + }; + return waitingHandler; + } + /** + * @param {WaitingHandler} waitingHandler + * @param {Buffer} chunk + */ + #bufferWaitingChunk(waitingHandler, chunk) { + if (waitingHandler.done || waitingHandler.controller.aborted) { + waitingHandler.done = true; + waitingHandler.bufferedChunks = []; + waitingHandler.bufferedBytes = 0; + return; + } + const bufferedChunk = Buffer.from(chunk); + waitingHandler.bufferedChunks.push(bufferedChunk); + waitingHandler.bufferedBytes += bufferedChunk.length; + if (waitingHandler.bufferedBytes > this.#maxBufferSize) { + const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`); + this.#errorWaitingHandler(waitingHandler, err); + } + } + /** + * @param {WaitingHandler} waitingHandler + */ + #flushWaitingHandler(waitingHandler) { + const { handler, controller } = waitingHandler; + while (!waitingHandler.done && !controller.aborted && !controller.paused && waitingHandler.bufferedChunks.length > 0) { + const bufferedChunk = waitingHandler.bufferedChunks.shift(); + waitingHandler.bufferedBytes -= bufferedChunk.length; + try { + handler.onResponseData?.(controller, bufferedChunk); + } catch { + } + if (controller.aborted) { + waitingHandler.done = true; + waitingHandler.pendingTrailers = null; + waitingHandler.bufferedChunks = []; + waitingHandler.bufferedBytes = 0; + break; + } + } + } + /** + * @param {WaitingHandler} waitingHandler + * @param {Error} err + */ + #errorWaitingHandler(waitingHandler, err) { + if (waitingHandler.done) { + return; + } + waitingHandler.done = true; + waitingHandler.pendingTrailers = null; + waitingHandler.bufferedChunks = []; + waitingHandler.bufferedBytes = 0; + try { + waitingHandler.controller.abort(err); + waitingHandler.handler.onResponseError?.(waitingHandler.controller, err); + } catch { + } + } + #pruneDoneWaitingHandlers() { + this.#waitingHandlers = this.#waitingHandlers.filter((waitingHandler) => waitingHandler.done === false); + } + }; + module.exports = DeduplicationHandler; } -} +}); -// node_modules/viem/_esm/actions/public/estimateFeesPerGas.js -async function estimateFeesPerGas(client, args) { - return internal_estimateFeesPerGas(client, args); -} -async function internal_estimateFeesPerGas(client, args) { - const { block: block_, chain: chain3 = client.chain, request, type = "eip1559" } = args || {}; - const baseFeeMultiplier = await (async () => { - if (typeof chain3?.fees?.baseFeeMultiplier === "function") - return chain3.fees.baseFeeMultiplier({ - block: block_, - client, - request - }); - return chain3?.fees?.baseFeeMultiplier ?? 1.2; - })(); - if (baseFeeMultiplier < 1) - throw new BaseFeeScalarError(); - const decimals = baseFeeMultiplier.toString().split(".")[1]?.length ?? 0; - const denominator = 10 ** decimals; - const multiply = (base2) => base2 * BigInt(Math.ceil(baseFeeMultiplier * denominator)) / BigInt(denominator); - const block = block_ ? block_ : await getAction(client, getBlock, "getBlock")({}); - if (typeof chain3?.fees?.estimateFeesPerGas === "function") { - const fees = await chain3.fees.estimateFeesPerGas({ - block: block_, - client, - multiply, - request, - type - }); - if (fees !== null) - return fees; - } - if (type === "eip1559") { - if (typeof block.baseFeePerGas !== "bigint") - throw new Eip1559FeesNotSupportedError(); - const maxPriorityFeePerGas = typeof request?.maxPriorityFeePerGas === "bigint" ? request.maxPriorityFeePerGas : await internal_estimateMaxPriorityFeePerGas(client, { - block, - chain: chain3, - request - }); - const baseFeePerGas = multiply(block.baseFeePerGas); - const maxFeePerGas = request?.maxFeePerGas ?? baseFeePerGas + maxPriorityFeePerGas; - return { - maxFeePerGas, - maxPriorityFeePerGas +// node_modules/undici/lib/interceptor/deduplicate.js +var require_deduplicate = __commonJS({ + "node_modules/undici/lib/interceptor/deduplicate.js"(exports, module) { + "use strict"; + var diagnosticsChannel = __require("diagnostics_channel"); + var util2 = require_util(); + var DeduplicationHandler = require_deduplication_handler(); + var { normalizeHeaders: normalizeHeaders3, makeCacheKey, makeDeduplicationKey } = require_cache(); + var pendingRequestsChannel = diagnosticsChannel.channel("undici:request:pending-requests"); + module.exports = (opts = {}) => { + const { + methods = ["GET"], + skipHeaderNames = [], + excludeHeaderNames = [], + maxBufferSize = 5 * 1024 * 1024 + } = opts; + if (typeof opts !== "object" || opts === null) { + throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? "null" : typeof opts}`); + } + if (!Array.isArray(methods)) { + throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`); + } + for (const method of methods) { + if (!util2.safeHTTPMethods.includes(method)) { + throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`); + } + } + if (!Array.isArray(skipHeaderNames)) { + throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`); + } + if (!Array.isArray(excludeHeaderNames)) { + throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`); + } + if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) { + throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`); + } + const skipHeaderNamesSet = new Set(skipHeaderNames.map((name) => name.toLowerCase())); + const excludeHeaderNamesSet = new Set(excludeHeaderNames.map((name) => name.toLowerCase())); + const pendingRequests = /* @__PURE__ */ new Map(); + return (dispatch) => { + return (opts2, handler) => { + if (!opts2.origin || methods.includes(opts2.method) === false) { + return dispatch(opts2, handler); + } + opts2 = { + ...opts2, + headers: normalizeHeaders3(opts2) + }; + if (skipHeaderNamesSet.size > 0) { + for (const headerName of Object.keys(opts2.headers)) { + if (skipHeaderNamesSet.has(headerName.toLowerCase())) { + return dispatch(opts2, handler); + } + } + } + const cacheKey2 = makeCacheKey(opts2); + const dedupeKey = makeDeduplicationKey(cacheKey2, excludeHeaderNamesSet); + const pendingHandler = pendingRequests.get(dedupeKey); + if (pendingHandler) { + if (pendingHandler.addWaitingHandler(handler)) { + return true; + } + return dispatch(opts2, handler); + } + const deduplicationHandler = new DeduplicationHandler( + handler, + () => { + pendingRequests.delete(dedupeKey); + if (pendingRequestsChannel.hasSubscribers) { + pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: "removed" }); + } + }, + maxBufferSize + ); + pendingRequests.set(dedupeKey, deduplicationHandler); + if (pendingRequestsChannel.hasSubscribers) { + pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: "added" }); + } + return dispatch(opts2, deduplicationHandler); + }; + }; }; } - const gasPrice = request?.gasPrice ?? multiply(await getAction(client, getGasPrice, "getGasPrice")({})); - return { - gasPrice - }; -} - -// node_modules/viem/_esm/actions/wallet/prepareTransactionRequest.js -init_getTransactionCount(); -init_blobsToCommitments(); -init_blobsToProofs(); -init_commitmentsToVersionedHashes(); -init_toBlobSidecars(); -init_lru(); -init_assertRequest(); -init_getTransactionType(); - -// node_modules/viem/_esm/actions/public/fillTransaction.js -init_parseAccount(); - -// node_modules/viem/_esm/utils/errors/getTransactionError.js -init_node(); -init_transaction(); -init_getNodeError(); -function getTransactionError(err, { docsPath: docsPath8, ...args }) { - const cause = (() => { - const cause2 = getNodeError(err, args); - if (cause2 instanceof UnknownNodeError) - return err; - return cause2; - })(); - return new TransactionExecutionError(cause, { - docsPath: docsPath8, - ...args - }); -} - -// node_modules/viem/_esm/actions/public/fillTransaction.js -init_extract(); -init_transactionRequest(); -init_assertRequest(); - -// node_modules/viem/_esm/actions/public/getChainId.js -init_fromHex(); -async function getChainId(client) { - const chainIdHex = await client.request({ - method: "eth_chainId" - }, { dedupe: true }); - return hexToNumber(chainIdHex); -} +}); -// node_modules/viem/_esm/actions/public/fillTransaction.js -async function fillTransaction(client, parameters) { - const { account = client.account, accessList, authorizationList, chain: chain3 = client.chain, blobVersionedHashes, blobs, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, nonce: nonce_, nonceManager, to, type, value, ...rest } = parameters; - const nonce = await (async () => { - if (!account) - return nonce_; - if (!nonceManager) - return nonce_; - if (typeof nonce_ !== "undefined") - return nonce_; - const account_ = parseAccount(account); - const chainId = chain3 ? chain3.id : await getAction(client, getChainId, "getChainId")({}); - return await nonceManager.consume({ - address: account_.address, - chainId, - client - }); - })(); - assertRequest(parameters); - const chainFormat = chain3?.formatters?.transactionRequest?.format; - const format = chainFormat || formatTransactionRequest; - const request = format({ - // Pick out extra data that might exist on the chain's transaction request type. - ...extract(rest, { format: chainFormat }), - account: account ? parseAccount(account) : void 0, - accessList, - authorizationList, - blobs, - blobVersionedHashes, - data, - gas, - gasPrice, - maxFeePerBlobGas, - maxFeePerGas, - maxPriorityFeePerGas, - nonce, - to, - type, - value - }, "fillTransaction"); - try { - const response = await client.request({ - method: "eth_fillTransaction", - params: [request] - }); - const format2 = chain3?.formatters?.transaction?.format || formatTransaction; - const transaction = format2(response.tx); - delete transaction.blockHash; - delete transaction.blockNumber; - delete transaction.r; - delete transaction.s; - delete transaction.transactionIndex; - delete transaction.v; - delete transaction.yParity; - transaction.data = transaction.input; - if (transaction.gas) - transaction.gas = parameters.gas ?? transaction.gas; - if (transaction.gasPrice) - transaction.gasPrice = parameters.gasPrice ?? transaction.gasPrice; - if (transaction.maxFeePerBlobGas) - transaction.maxFeePerBlobGas = parameters.maxFeePerBlobGas ?? transaction.maxFeePerBlobGas; - if (transaction.maxFeePerGas) - transaction.maxFeePerGas = parameters.maxFeePerGas ?? transaction.maxFeePerGas; - if (transaction.maxPriorityFeePerGas) - transaction.maxPriorityFeePerGas = parameters.maxPriorityFeePerGas ?? transaction.maxPriorityFeePerGas; - if (transaction.nonce) - transaction.nonce = parameters.nonce ?? transaction.nonce; - const feeMultiplier = await (async () => { - if (typeof chain3?.fees?.baseFeeMultiplier === "function") { - const block = await getAction(client, getBlock, "getBlock")({}); - return chain3.fees.baseFeeMultiplier({ - block, - client, - request: parameters +// node_modules/undici/lib/cache/sqlite-cache-store.js +var require_sqlite_cache_store = __commonJS({ + "node_modules/undici/lib/cache/sqlite-cache-store.js"(exports, module) { + "use strict"; + var { Writable } = __require("stream"); + var { assertCacheKey, assertCacheValue } = require_cache(); + var DatabaseSync; + var VERSION2 = 3; + var MAX_ENTRY_SIZE = 2 * 1e3 * 1e3 * 1e3; + module.exports = class SqliteCacheStore { + #maxEntrySize = MAX_ENTRY_SIZE; + #maxCount = Infinity; + /** + * @type {import('node:sqlite').DatabaseSync} + */ + #db; + /** + * @type {import('node:sqlite').StatementSync} + */ + #getValuesQuery; + /** + * @type {import('node:sqlite').StatementSync} + */ + #updateValueQuery; + /** + * @type {import('node:sqlite').StatementSync} + */ + #insertValueQuery; + /** + * @type {import('node:sqlite').StatementSync} + */ + #deleteExpiredValuesQuery; + /** + * @type {import('node:sqlite').StatementSync} + */ + #deleteByUrlQuery; + /** + * @type {import('node:sqlite').StatementSync} + */ + #countEntriesQuery; + /** + * @type {import('node:sqlite').StatementSync | null} + */ + #deleteOldValuesQuery; + /** + * @param {import('../../types/cache-interceptor.d.ts').default.SqliteCacheStoreOpts | undefined} opts + */ + constructor(opts) { + if (opts) { + if (typeof opts !== "object") { + throw new TypeError("SqliteCacheStore options must be an object"); + } + if (opts.maxEntrySize !== void 0) { + if (typeof opts.maxEntrySize !== "number" || !Number.isInteger(opts.maxEntrySize) || opts.maxEntrySize < 0) { + throw new TypeError("SqliteCacheStore options.maxEntrySize must be a non-negative integer"); + } + if (opts.maxEntrySize > MAX_ENTRY_SIZE) { + throw new TypeError("SqliteCacheStore options.maxEntrySize must be less than 2gb"); + } + this.#maxEntrySize = opts.maxEntrySize; + } + if (opts.maxCount !== void 0) { + if (typeof opts.maxCount !== "number" || !Number.isInteger(opts.maxCount) || opts.maxCount < 0) { + throw new TypeError("SqliteCacheStore options.maxCount must be a non-negative integer"); + } + this.#maxCount = opts.maxCount; + } + } + if (!DatabaseSync) { + DatabaseSync = __require("sqlite").DatabaseSync; + } + this.#db = new DatabaseSync(opts?.location ?? ":memory:"); + this.#db.exec(` + PRAGMA journal_mode = WAL; + PRAGMA synchronous = NORMAL; + PRAGMA temp_store = memory; + PRAGMA optimize; + + CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION2} ( + -- Data specific to us + id INTEGER PRIMARY KEY AUTOINCREMENT, + url TEXT NOT NULL, + method TEXT NOT NULL, + + -- Data returned to the interceptor + body BUF NULL, + deleteAt INTEGER NOT NULL, + statusCode INTEGER NOT NULL, + statusMessage TEXT NOT NULL, + headers TEXT NULL, + cacheControlDirectives TEXT NULL, + etag TEXT NULL, + vary TEXT NULL, + cachedAt INTEGER NOT NULL, + staleAt INTEGER NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION2}_getValuesQuery ON cacheInterceptorV${VERSION2}(url, method, deleteAt); + CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION2}_deleteByUrlQuery ON cacheInterceptorV${VERSION2}(deleteAt); + `); + this.#getValuesQuery = this.#db.prepare(` + SELECT + id, + body, + deleteAt, + statusCode, + statusMessage, + headers, + etag, + cacheControlDirectives, + vary, + cachedAt, + staleAt + FROM cacheInterceptorV${VERSION2} + WHERE + url = ? + AND method = ? + ORDER BY + deleteAt ASC + `); + this.#updateValueQuery = this.#db.prepare(` + UPDATE cacheInterceptorV${VERSION2} SET + body = ?, + deleteAt = ?, + statusCode = ?, + statusMessage = ?, + headers = ?, + etag = ?, + cacheControlDirectives = ?, + cachedAt = ?, + staleAt = ? + WHERE + id = ? + `); + this.#insertValueQuery = this.#db.prepare(` + INSERT INTO cacheInterceptorV${VERSION2} ( + url, + method, + body, + deleteAt, + statusCode, + statusMessage, + headers, + etag, + cacheControlDirectives, + vary, + cachedAt, + staleAt + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + this.#deleteByUrlQuery = this.#db.prepare( + `DELETE FROM cacheInterceptorV${VERSION2} WHERE url = ?` + ); + this.#countEntriesQuery = this.#db.prepare( + `SELECT COUNT(*) AS total FROM cacheInterceptorV${VERSION2}` + ); + this.#deleteExpiredValuesQuery = this.#db.prepare( + `DELETE FROM cacheInterceptorV${VERSION2} WHERE deleteAt <= ?` + ); + this.#deleteOldValuesQuery = this.#maxCount === Infinity ? null : this.#db.prepare(` + DELETE FROM cacheInterceptorV${VERSION2} + WHERE id IN ( + SELECT + id + FROM cacheInterceptorV${VERSION2} + ORDER BY cachedAt DESC + LIMIT ? + ) + `); + } + close() { + this.#db.close(); + } + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @returns {(import('../../types/cache-interceptor.d.ts').default.GetResult & { body?: Buffer }) | undefined} + */ + get(key) { + assertCacheKey(key); + const value = this.#findValue(key); + return value ? { + body: value.body ? Buffer.from(value.body.buffer, value.body.byteOffset, value.body.byteLength) : void 0, + statusCode: value.statusCode, + statusMessage: value.statusMessage, + headers: value.headers ? JSON.parse(value.headers) : void 0, + etag: value.etag ? value.etag : void 0, + vary: value.vary ? JSON.parse(value.vary) : void 0, + cacheControlDirectives: value.cacheControlDirectives ? JSON.parse(value.cacheControlDirectives) : void 0, + cachedAt: value.cachedAt, + staleAt: value.staleAt, + deleteAt: value.deleteAt + } : void 0; + } + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue & { body: null | Buffer | Array}} value + */ + set(key, value) { + assertCacheKey(key); + const url = this.#makeValueUrl(key); + const body = Array.isArray(value.body) ? Buffer.concat(value.body) : value.body; + const size5 = body?.byteLength; + if (size5 && size5 > this.#maxEntrySize) { + return; + } + const existingValue = this.#findValue(key, true); + if (existingValue) { + this.#updateValueQuery.run( + body, + value.deleteAt, + value.statusCode, + value.statusMessage, + value.headers ? JSON.stringify(value.headers) : null, + value.etag ? value.etag : null, + value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null, + value.cachedAt, + value.staleAt, + existingValue.id + ); + } else { + this.#prune(); + this.#insertValueQuery.run( + url, + key.method, + body, + value.deleteAt, + value.statusCode, + value.statusMessage, + value.headers ? JSON.stringify(value.headers) : null, + value.etag ? value.etag : null, + value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null, + value.vary ? JSON.stringify(value.vary) : null, + value.cachedAt, + value.staleAt + ); + } + } + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} value + * @returns {Writable | undefined} + */ + createWriteStream(key, value) { + assertCacheKey(key); + assertCacheValue(value); + let size5 = 0; + const body = []; + const store = this; + return new Writable({ + decodeStrings: true, + write(chunk, encoding, callback) { + size5 += chunk.byteLength; + if (size5 < store.#maxEntrySize) { + body.push(chunk); + } else { + this.destroy(); + } + callback(); + }, + final(callback) { + store.set(key, { ...value, body }); + callback(); + } }); } - return chain3?.fees?.baseFeeMultiplier ?? 1.2; - })(); - if (feeMultiplier < 1) - throw new BaseFeeScalarError(); - const decimals = feeMultiplier.toString().split(".")[1]?.length ?? 0; - const denominator = 10 ** decimals; - const multiplyFee = (base2) => base2 * BigInt(Math.ceil(feeMultiplier * denominator)) / BigInt(denominator); - if (transaction.maxFeePerGas && !parameters.maxFeePerGas) - transaction.maxFeePerGas = multiplyFee(transaction.maxFeePerGas); - if (transaction.gasPrice && !parameters.gasPrice) - transaction.gasPrice = multiplyFee(transaction.gasPrice); - return { - raw: response.raw, - transaction: { - from: request.from, - ...transaction + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + */ + delete(key) { + if (typeof key !== "object") { + throw new TypeError(`expected key to be object, got ${typeof key}`); + } + this.#deleteByUrlQuery.run(this.#makeValueUrl(key)); + } + #prune() { + if (Number.isFinite(this.#maxCount) && this.size <= this.#maxCount) { + return 0; + } + { + const removed = this.#deleteExpiredValuesQuery.run(Date.now()).changes; + if (removed) { + return removed; + } + } + { + const removed = this.#deleteOldValuesQuery?.run(Math.max(Math.floor(this.#maxCount * 0.1), 1)).changes; + if (removed) { + return removed; + } + } + return 0; + } + /** + * Counts the number of rows in the cache + * @returns {Number} + */ + get size() { + const { total } = this.#countEntriesQuery.get(); + return total; + } + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @returns {string} + */ + #makeValueUrl(key) { + return `${key.origin}/${key.path}`; + } + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @param {boolean} [canBeExpired=false] + * @returns {SqliteStoreValue | undefined} + */ + #findValue(key, canBeExpired = false) { + const url = this.#makeValueUrl(key); + const { headers, method } = key; + const values = this.#getValuesQuery.all(url, method); + if (values.length === 0) { + return void 0; + } + const now = Date.now(); + for (const value of values) { + if (now >= value.deleteAt && !canBeExpired) { + return void 0; + } + let matches = true; + if (value.vary) { + const vary = JSON.parse(value.vary); + for (const header in vary) { + if (!headerValueEquals(headers[header], vary[header])) { + matches = false; + break; + } + } + } + if (matches) { + return value; + } + } + return void 0; } }; - } catch (err) { - throw getTransactionError(err, { - ...parameters, - chain: client.chain - }); - } -} - -// node_modules/viem/_esm/actions/wallet/prepareTransactionRequest.js -var defaultParameters = [ - "blobVersionedHashes", - "chainId", - "fees", - "gas", - "nonce", - "type" -]; -var eip1559NetworkCache = /* @__PURE__ */ new Map(); -var supportsFillTransaction = /* @__PURE__ */ new LruMap(128); -async function prepareTransactionRequest(client, args) { - let request = args; - request.account ??= client.account; - request.parameters ??= defaultParameters; - const { account: account_, chain: chain3 = client.chain, nonceManager, parameters } = request; - const prepareTransactionRequest2 = (() => { - if (typeof chain3?.prepareTransactionRequest === "function") - return { - fn: chain3.prepareTransactionRequest, - runAt: ["beforeFillTransaction"] - }; - if (Array.isArray(chain3?.prepareTransactionRequest)) - return { - fn: chain3.prepareTransactionRequest[0], - runAt: chain3.prepareTransactionRequest[1].runAt - }; - return void 0; - })(); - let chainId; - async function getChainId2() { - if (chainId) - return chainId; - if (typeof request.chainId !== "undefined") - return request.chainId; - if (chain3) - return chain3.id; - const chainId_ = await getAction(client, getChainId, "getChainId")({}); - chainId = chainId_; - return chainId; - } - const account = account_ ? parseAccount(account_) : account_; - let nonce = request.nonce; - if (parameters.includes("nonce") && typeof nonce === "undefined" && account && nonceManager) { - const chainId2 = await getChainId2(); - nonce = await nonceManager.consume({ - address: account.address, - chainId: chainId2, - client - }); - } - if (prepareTransactionRequest2?.fn && prepareTransactionRequest2.runAt?.includes("beforeFillTransaction")) { - request = await prepareTransactionRequest2.fn({ ...request, chain: chain3 }, { - phase: "beforeFillTransaction" - }); - nonce ??= request.nonce; - } - const attemptFill = (() => { - if ((parameters.includes("blobVersionedHashes") || parameters.includes("sidecars")) && request.kzg && request.blobs) - return false; - if (supportsFillTransaction.get(client.uid) === false) - return false; - const shouldAttempt = ["fees", "gas"].some((parameter) => parameters.includes(parameter)); - if (!shouldAttempt) - return false; - if (parameters.includes("chainId") && typeof request.chainId !== "number") - return true; - if (parameters.includes("nonce") && typeof nonce !== "number") - return true; - if (parameters.includes("fees") && typeof request.gasPrice !== "bigint" && (typeof request.maxFeePerGas !== "bigint" || typeof request.maxPriorityFeePerGas !== "bigint")) - return true; - if (parameters.includes("gas") && typeof request.gas !== "bigint") - return true; - return false; - })(); - const fillResult = attemptFill ? await getAction(client, fillTransaction, "fillTransaction")({ ...request, nonce }).then((result) => { - const { chainId: chainId2, from: from14, gas: gas2, gasPrice, nonce: nonce2, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, type: type2, ...rest } = result.transaction; - supportsFillTransaction.set(client.uid, true); - return { - ...request, - ...from14 ? { from: from14 } : {}, - ...type2 && !request.type ? { type: type2 } : {}, - ...typeof chainId2 !== "undefined" ? { chainId: chainId2 } : {}, - ...typeof gas2 !== "undefined" ? { gas: gas2 } : {}, - ...typeof gasPrice !== "undefined" ? { gasPrice } : {}, - ...typeof nonce2 !== "undefined" ? { nonce: nonce2 } : {}, - ...typeof maxFeePerBlobGas !== "undefined" && request.type !== "legacy" && request.type !== "eip2930" ? { maxFeePerBlobGas } : {}, - ...typeof maxFeePerGas !== "undefined" && request.type !== "legacy" && request.type !== "eip2930" ? { maxFeePerGas } : {}, - ...typeof maxPriorityFeePerGas !== "undefined" && request.type !== "legacy" && request.type !== "eip2930" ? { maxPriorityFeePerGas } : {}, - ..."nonceKey" in rest && typeof rest.nonceKey !== "undefined" ? { nonceKey: rest.nonceKey } : {}, - ..."keyAuthorization" in rest && typeof rest.keyAuthorization !== "undefined" && rest.keyAuthorization !== null && !("keyAuthorization" in request) ? { keyAuthorization: rest.keyAuthorization } : {} - }; - }).catch((e7) => { - const error = e7; - if (error.name !== "TransactionExecutionError") - return request; - const executionReverted = error.walk?.((e8) => { - const error2 = e8; - return error2.name === "ExecutionRevertedError"; - }); - if (executionReverted) - throw e7; - const unsupported = error.walk?.((e8) => { - const error2 = e8; - return error2.name === "MethodNotFoundRpcError" || error2.name === "MethodNotSupportedRpcError" || error2.message?.includes("eth_fillTransaction is not available"); - }); - if (unsupported) - supportsFillTransaction.set(client.uid, false); - return request; - }) : request; - nonce ??= fillResult.nonce; - request = { - ...fillResult, - ...account ? { from: account?.address } : {}, - ...nonce ? { nonce } : {} - }; - const { blobs, gas, kzg, type } = request; - if (prepareTransactionRequest2?.fn && prepareTransactionRequest2.runAt?.includes("beforeFillParameters")) { - request = await prepareTransactionRequest2.fn({ ...request, chain: chain3 }, { - phase: "beforeFillParameters" - }); - } - let block; - async function getBlock2() { - if (block) - return block; - block = await getAction(client, getBlock, "getBlock")({ blockTag: "latest" }); - return block; - } - if (parameters.includes("nonce") && typeof nonce === "undefined" && account && !nonceManager) - request.nonce = await getAction(client, getTransactionCount, "getTransactionCount")({ - address: account.address, - blockTag: "pending" - }); - if ((parameters.includes("blobVersionedHashes") || parameters.includes("sidecars")) && blobs && kzg) { - const commitments = blobsToCommitments({ blobs, kzg }); - if (parameters.includes("blobVersionedHashes")) { - const versionedHashes = commitmentsToVersionedHashes({ - commitments, - to: "hex" - }); - request.blobVersionedHashes = versionedHashes; - } - if (parameters.includes("sidecars")) { - const proofs = blobsToProofs({ blobs, commitments, kzg }); - const sidecars = toBlobSidecars({ - blobs, - commitments, - proofs, - to: "hex" - }); - request.sidecars = sidecars; - } - } - if (parameters.includes("chainId")) - request.chainId = await getChainId2(); - if ((parameters.includes("fees") || parameters.includes("type")) && typeof type === "undefined") { - try { - request.type = getTransactionType(request); - } catch { - let isEip1559Network = eip1559NetworkCache.get(client.uid); - if (typeof isEip1559Network === "undefined") { - const block2 = await getBlock2(); - isEip1559Network = typeof block2?.baseFeePerGas === "bigint"; - eip1559NetworkCache.set(client.uid, isEip1559Network); + function headerValueEquals(lhs, rhs) { + if (lhs == null && rhs == null) { + return true; } - request.type = isEip1559Network ? "eip1559" : "legacy"; - } - } - if (parameters.includes("fees")) { - if (request.type !== "legacy" && request.type !== "eip2930") { - if (typeof request.maxFeePerGas === "undefined" || typeof request.maxPriorityFeePerGas === "undefined") { - const block2 = await getBlock2(); - const { maxFeePerGas, maxPriorityFeePerGas } = await internal_estimateFeesPerGas(client, { - block: block2, - chain: chain3, - request - }); - if (typeof request.maxPriorityFeePerGas === "undefined" && request.maxFeePerGas && request.maxFeePerGas < maxPriorityFeePerGas) - throw new MaxFeePerGasTooLowError({ - maxPriorityFeePerGas - }); - request.maxPriorityFeePerGas = maxPriorityFeePerGas; - request.maxFeePerGas = maxFeePerGas; + if (lhs == null && rhs != null || lhs != null && rhs == null) { + return false; } - } else { - if (typeof request.maxFeePerGas !== "undefined" || typeof request.maxPriorityFeePerGas !== "undefined") - throw new Eip1559FeesNotSupportedError(); - if (typeof request.gasPrice === "undefined") { - const block2 = await getBlock2(); - const { gasPrice: gasPrice_ } = await internal_estimateFeesPerGas(client, { - block: block2, - chain: chain3, - request, - type: "legacy" - }); - request.gasPrice = gasPrice_; + if (Array.isArray(lhs) && Array.isArray(rhs)) { + if (lhs.length !== rhs.length) { + return false; + } + return lhs.every((x, i) => x === rhs[i]); } + return lhs === rhs; } } - if (parameters.includes("gas") && typeof gas === "undefined") - request.gas = await getAction(client, estimateGas, "estimateGas")({ - ...request, - account, - prepare: account?.type === "local" ? [] : ["blobVersionedHashes"] - }); - if (prepareTransactionRequest2?.fn && prepareTransactionRequest2.runAt?.includes("afterFillParameters")) - request = await prepareTransactionRequest2.fn({ ...request, chain: chain3 }, { - phase: "afterFillParameters" - }); - assertRequest(request); - delete request.parameters; - return request; -} +}); -// node_modules/viem/_esm/actions/public/estimateGas.js -async function estimateGas(client, args) { - const { account: account_ = client.account, prepare = true } = args; - const account = account_ ? parseAccount(account_) : void 0; - const parameters = (() => { - if (Array.isArray(prepare)) - return prepare; - if (account?.type !== "local") - return ["blobVersionedHashes"]; - return void 0; - })(); - try { - const to = await (async () => { - if (args.to) - return args.to; - if (args.authorizationList && args.authorizationList.length > 0) - return await recoverAuthorizationAddress({ - authorization: args.authorizationList[0] - }).catch(() => { - throw new BaseError2("`to` is required. Could not infer from `authorizationList`"); +// node_modules/undici/lib/web/fetch/headers.js +var require_headers = __commonJS({ + "node_modules/undici/lib/web/fetch/headers.js"(exports, module) { + "use strict"; + var { kConstruct } = require_symbols(); + var { kEnumerableProperty } = require_util(); + var { + iteratorMixin, + isValidHeaderName, + isValidHeaderValue + } = require_util2(); + var { webidl } = require_webidl(); + var assert8 = __require("assert"); + var util2 = __require("util"); + function isHTTPWhiteSpaceCharCode(code) { + return code === 10 || code === 13 || code === 9 || code === 32; + } + function headerValueNormalize(potentialValue) { + let i = 0; + let j = potentialValue.length; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i; + return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j); + } + function fill(headers, object) { + if (Array.isArray(object)) { + for (let i = 0; i < object.length; ++i) { + const header = object[i]; + if (header.length !== 2) { + throw webidl.errors.exception({ + header: "Headers constructor", + message: `expected name/value pair to be length 2, found ${header.length}.` + }); + } + appendHeader(headers, header[0], header[1]); + } + } else if (typeof object === "object" && object !== null) { + const keys = Object.keys(object); + for (let i = 0; i < keys.length; ++i) { + appendHeader(headers, keys[i], object[keys[i]]); + } + } else { + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] }); - return void 0; - })(); - const { accessList, authorizationList, blobs, blobVersionedHashes, blockNumber, blockTag, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, nonce, value, stateOverride, ...rest } = prepare ? await prepareTransactionRequest(client, { - ...args, - parameters, - to - }) : args; - if (gas && args.gas !== gas) - return gas; - const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; - const block = blockNumberHex || blockTag; - const rpcStateOverride = serializeStateOverride(stateOverride); - assertRequest(args); - const chainFormat = client.chain?.formatters?.transactionRequest?.format; - const format = chainFormat || formatTransactionRequest; - const request = format({ - // Pick out extra data that might exist on the chain's transaction request type. - ...extract(rest, { format: chainFormat }), - account, - accessList, - authorizationList, - blobs, - blobVersionedHashes, - data, - gasPrice, - maxFeePerBlobGas, - maxFeePerGas, - maxPriorityFeePerGas, - nonce, - to, - value - }, "estimateGas"); - return BigInt(await client.request({ - method: "eth_estimateGas", - params: rpcStateOverride ? [ - request, - block ?? client.experimental_blockTag ?? "latest", - rpcStateOverride - ] : block ? [request, block] : [request] - })); - } catch (err) { - throw getEstimateGasError(err, { - ...args, - account, - chain: client.chain - }); - } -} - -// node_modules/viem/_esm/actions/public/estimateContractGas.js -async function estimateContractGas(client, parameters) { - const { abi: abi2, address: address2, args, functionName, dataSuffix = typeof client.dataSuffix === "string" ? client.dataSuffix : client.dataSuffix?.value, ...request } = parameters; - const data = encodeFunctionData({ - abi: abi2, - args, - functionName - }); - try { - const gas = await getAction(client, estimateGas, "estimateGas")({ - data: `${data}${dataSuffix ? dataSuffix.replace("0x", "") : ""}`, - to: address2, - ...request - }); - return gas; - } catch (error) { - const account = request.account ? parseAccount(request.account) : void 0; - throw getContractError(error, { - abi: abi2, - address: address2, - args, - docsPath: "/docs/contract/estimateContractGas", - functionName, - sender: account?.address - }); - } -} - -// node_modules/viem/_esm/actions/public/getContractEvents.js -init_getAbiItem(); - -// node_modules/viem/_esm/utils/abi/parseEventLogs.js -init_isAddressEqual(); -init_toBytes(); - -// node_modules/viem/_esm/utils/formatters/log.js -function formatLog(log, { args, eventName } = {}) { - return { - ...log, - blockHash: log.blockHash ? log.blockHash : null, - blockNumber: log.blockNumber ? BigInt(log.blockNumber) : null, - blockTimestamp: log.blockTimestamp ? BigInt(log.blockTimestamp) : log.blockTimestamp === null ? null : void 0, - logIndex: log.logIndex ? Number(log.logIndex) : null, - transactionHash: log.transactionHash ? log.transactionHash : null, - transactionIndex: log.transactionIndex ? Number(log.transactionIndex) : null, - ...eventName ? { args, eventName } : {} - }; -} - -// node_modules/viem/_esm/utils/abi/parseEventLogs.js -init_keccak256(); -init_toEventSelector(); - -// node_modules/viem/_esm/utils/abi/decodeEventLog.js -init_abi(); -init_cursor(); -init_size(); -init_toEventSelector(); -init_decodeAbiParameters(); -init_formatAbiItem2(); -var docsPath3 = "/docs/contract/decodeEventLog"; -function decodeEventLog(parameters) { - const { abi: abi2, data, strict: strict_, topics } = parameters; - const strict = strict_ ?? true; - const [signature2, ...argTopics] = topics; - if (!signature2) - throw new AbiEventSignatureEmptyTopicsError({ docsPath: docsPath3 }); - const abiItem = abi2.find((x) => x.type === "event" && signature2 === toEventSelector(formatAbiItem2(x))); - if (!(abiItem && "name" in abiItem) || abiItem.type !== "event") - throw new AbiEventSignatureNotFoundError(signature2, { docsPath: docsPath3 }); - const { name, inputs } = abiItem; - const isUnnamed = inputs?.some((x) => !("name" in x && x.name)); - const args = isUnnamed ? [] : {}; - const indexedInputs = inputs.map((x, i) => [x, i]).filter(([x]) => "indexed" in x && x.indexed); - const missingIndexedInputs = []; - for (let i = 0; i < indexedInputs.length; i++) { - const [param, argIndex] = indexedInputs[i]; - const topic = argTopics[i]; - if (!topic) { - if (strict) - throw new DecodeLogTopicsMismatch({ - abiItem, - param + } + } + function appendHeader(headers, name, value) { + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value: name, + type: "header name" }); - missingIndexedInputs.push([param, argIndex]); - continue; + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value, + type: "header value" + }); + } + if (getHeadersGuard(headers) === "immutable") { + throw new TypeError("immutable"); + } + return getHeadersList(headers).append(name, value, false); } - args[isUnnamed ? argIndex : param.name || argIndex] = decodeTopic({ - param, - value: topic - }); - } - const nonIndexedInputs = inputs.filter((x) => !("indexed" in x && x.indexed)); - const inputsToDecode = strict ? nonIndexedInputs : [...missingIndexedInputs.map(([param]) => param), ...nonIndexedInputs]; - if (inputsToDecode.length > 0) { - if (data && data !== "0x") { - try { - const decodedData = decodeAbiParameters(inputsToDecode, data); - if (decodedData) { - let dataIndex = 0; - if (!strict) { - for (const [param, argIndex] of missingIndexedInputs) { - args[isUnnamed ? argIndex : param.name || argIndex] = decodedData[dataIndex++]; + function headersListSortAndCombine(target) { + const headersList = getHeadersList(target); + if (!headersList) { + return []; + } + if (headersList.sortedMap) { + return headersList.sortedMap; + } + const headers = []; + const names = headersList.toSortedArray(); + const cookies = headersList.cookies; + if (cookies === null || cookies.length === 1) { + return headersList.sortedMap = names; + } + for (let i = 0; i < names.length; ++i) { + const { 0: name, 1: value } = names[i]; + if (name === "set-cookie") { + for (let j = 0; j < cookies.length; ++j) { + headers.push([name, cookies[j]]); + } + } else { + headers.push([name, value]); + } + } + return headersList.sortedMap = headers; + } + function compareHeaderName(a, b) { + return a[0] < b[0] ? -1 : 1; + } + var HeadersList = class _HeadersList { + /** @type {[string, string][]|null} */ + cookies = null; + sortedMap; + headersMap; + constructor(init) { + if (init instanceof _HeadersList) { + this.headersMap = new Map(init.headersMap); + this.sortedMap = init.sortedMap; + this.cookies = init.cookies === null ? null : [...init.cookies]; + } else { + this.headersMap = new Map(init); + this.sortedMap = null; + } + } + /** + * @see https://fetch.spec.whatwg.org/#header-list-contains + * @param {string} name + * @param {boolean} isLowerCase + */ + contains(name, isLowerCase) { + return this.headersMap.has(isLowerCase ? name : name.toLowerCase()); + } + clear() { + this.headersMap.clear(); + this.sortedMap = null; + this.cookies = null; + } + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-append + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + append(name, value, isLowerCase) { + this.sortedMap = null; + const lowercaseName = isLowerCase ? name : name.toLowerCase(); + const exists = this.headersMap.get(lowercaseName); + if (exists) { + const delimiter = lowercaseName === "cookie" ? "; " : ", "; + this.headersMap.set(lowercaseName, { + name: exists.name, + value: `${exists.value}${delimiter}${value}` + }); + } else { + this.headersMap.set(lowercaseName, { name, value }); + } + if (lowercaseName === "set-cookie") { + (this.cookies ??= []).push(value); + } + } + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-set + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + set(name, value, isLowerCase) { + this.sortedMap = null; + const lowercaseName = isLowerCase ? name : name.toLowerCase(); + if (lowercaseName === "set-cookie") { + this.cookies = [value]; + } + this.headersMap.set(lowercaseName, { name, value }); + } + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-delete + * @param {string} name + * @param {boolean} isLowerCase + */ + delete(name, isLowerCase) { + this.sortedMap = null; + if (!isLowerCase) name = name.toLowerCase(); + if (name === "set-cookie") { + this.cookies = null; + } + this.headersMap.delete(name); + } + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get + * @param {string} name + * @param {boolean} isLowerCase + * @returns {string | null} + */ + get(name, isLowerCase) { + return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null; + } + *[Symbol.iterator]() { + for (const { 0: name, 1: { value } } of this.headersMap) { + yield [name, value]; + } + } + get entries() { + const headers = {}; + if (this.headersMap.size !== 0) { + for (const { name, value } of this.headersMap.values()) { + headers[name] = value; + } + } + return headers; + } + rawValues() { + return this.headersMap.values(); + } + get entriesList() { + const headers = []; + if (this.headersMap.size !== 0) { + for (const { 0: lowerName, 1: { name, value } } of this.headersMap) { + if (lowerName === "set-cookie") { + for (const cookie of this.cookies) { + headers.push([name, cookie]); + } + } else { + headers.push([name, value]); } } - if (isUnnamed) { - for (let i = 0; i < inputs.length; i++) - if (args[i] === void 0 && dataIndex < decodedData.length) - args[i] = decodedData[dataIndex++]; - } else - for (let i = 0; i < nonIndexedInputs.length; i++) - args[nonIndexedInputs[i].name] = decodedData[dataIndex++]; } - } catch (err) { - if (strict) { - if (err instanceof AbiDecodingDataSizeTooSmallError || err instanceof PositionOutOfBoundsError) - throw new DecodeLogDataMismatch({ - abiItem, - data, - params: inputsToDecode, - size: size(data) - }); - throw err; + return headers; + } + // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set + toSortedArray() { + const size5 = this.headersMap.size; + const array = new Array(size5); + if (size5 <= 32) { + if (size5 === 0) { + return array; + } + const iterator = this.headersMap[Symbol.iterator](); + const firstValue = iterator.next().value; + array[0] = [firstValue[0], firstValue[1].value]; + assert8(firstValue[1].value !== null); + for (let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value; i < size5; ++i) { + value = iterator.next().value; + x = array[i] = [value[0], value[1].value]; + assert8(x[1] !== null); + left = 0; + right = i; + while (left < right) { + pivot = left + (right - left >> 1); + if (array[pivot][0] <= x[0]) { + left = pivot + 1; + } else { + right = pivot; + } + } + if (i !== pivot) { + j = i; + while (j > left) { + array[j] = array[--j]; + } + array[left] = x; + } + } + if (!iterator.next().done) { + throw new TypeError("Unreachable"); + } + return array; + } else { + let i = 0; + for (const { 0: name, 1: { value } } of this.headersMap) { + array[i++] = [name, value]; + assert8(value !== null); + } + return array.sort(compareHeaderName); + } + } + }; + var Headers2 = class _Headers { + #guard; + /** + * @type {HeadersList} + */ + #headersList; + /** + * @param {HeadersInit|Symbol} [init] + * @returns + */ + constructor(init = void 0) { + webidl.util.markAsUncloneable(this); + if (init === kConstruct) { + return; + } + this.#headersList = new HeadersList(); + this.#guard = "none"; + if (init !== void 0) { + init = webidl.converters.HeadersInit(init, "Headers constructor", "init"); + fill(this, init); + } + } + // https://fetch.spec.whatwg.org/#dom-headers-append + append(name, value) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 2, "Headers.append"); + const prefix = "Headers.append"; + name = webidl.converters.ByteString(name, prefix, "name"); + value = webidl.converters.ByteString(value, prefix, "value"); + return appendHeader(this, name, value); + } + // https://fetch.spec.whatwg.org/#dom-headers-delete + delete(name) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 1, "Headers.delete"); + const prefix = "Headers.delete"; + name = webidl.converters.ByteString(name, prefix, "name"); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.delete", + value: name, + type: "header name" + }); + } + if (this.#guard === "immutable") { + throw new TypeError("immutable"); + } + if (!this.#headersList.contains(name, false)) { + return; + } + this.#headersList.delete(name, false); + } + // https://fetch.spec.whatwg.org/#dom-headers-get + get(name) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 1, "Headers.get"); + const prefix = "Headers.get"; + name = webidl.converters.ByteString(name, prefix, "name"); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix, + value: name, + type: "header name" + }); } + return this.#headersList.get(name, false); } - } else if (strict) { - throw new DecodeLogDataMismatch({ - abiItem, - data: "0x", - params: inputsToDecode, - size: 0 - }); - } - } - return { - eventName: name, - args: Object.values(args).length > 0 ? args : void 0 - }; -} -function decodeTopic({ param, value }) { - if (param.type === "string" || param.type === "bytes" || param.type === "tuple" || param.type.match(/^(.*)\[(\d+)?\]$/)) - return value; - const decodedArg = decodeAbiParameters([param], value) || []; - return decodedArg[0]; -} - -// node_modules/viem/_esm/utils/abi/parseEventLogs.js -function parseEventLogs(parameters) { - const { abi: abi2, args, logs, strict = true } = parameters; - const eventName = (() => { - if (!parameters.eventName) - return void 0; - if (Array.isArray(parameters.eventName)) - return parameters.eventName; - return [parameters.eventName]; - })(); - const abiTopics = abi2.filter((abiItem) => abiItem.type === "event").map((abiItem) => ({ - abi: abiItem, - selector: toEventSelector(abiItem) - })); - return logs.map((log) => { - const formattedLog = typeof log.blockNumber === "string" ? formatLog(log) : log; - const abiItems = abiTopics.filter((abiTopic) => formattedLog.topics[0] === abiTopic.selector); - if (abiItems.length === 0) - return null; - let event; - let abiItem; - for (const item of abiItems) { - try { - event = decodeEventLog({ - ...formattedLog, - abi: [item.abi], - strict: true - }); - abiItem = item; - break; - } catch { + // https://fetch.spec.whatwg.org/#dom-headers-has + has(name) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 1, "Headers.has"); + const prefix = "Headers.has"; + name = webidl.converters.ByteString(name, prefix, "name"); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix, + value: name, + type: "header name" + }); + } + return this.#headersList.contains(name, false); } - } - if (!event && !strict) { - abiItem = abiItems[0]; - try { - event = decodeEventLog({ - data: formattedLog.data, - topics: formattedLog.topics, - abi: [abiItem.abi], - strict: false - }); - } catch { - const isUnnamed = abiItem.abi.inputs?.some((x) => !("name" in x && x.name)); - return { - ...formattedLog, - args: isUnnamed ? [] : {}, - eventName: abiItem.abi.name - }; + // https://fetch.spec.whatwg.org/#dom-headers-set + set(name, value) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 2, "Headers.set"); + const prefix = "Headers.set"; + name = webidl.converters.ByteString(name, prefix, "name"); + value = webidl.converters.ByteString(value, prefix, "value"); + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix, + value: name, + type: "header name" + }); + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix, + value, + type: "header value" + }); + } + if (this.#guard === "immutable") { + throw new TypeError("immutable"); + } + this.#headersList.set(name, value, false); } - } - if (!event || !abiItem) - return null; - if (eventName && !eventName.includes(event.eventName)) - return null; - if (!includesArgs({ - args: event.args, - inputs: abiItem.abi.inputs, - matchArgs: args - })) - return null; - return { ...event, ...formattedLog }; - }).filter(Boolean); -} -function includesArgs(parameters) { - const { args, inputs, matchArgs } = parameters; - if (!matchArgs) - return true; - if (!args) - return false; - function isEqual2(input, value, arg) { - try { - if (input.type === "address") - return isAddressEqual(value, arg); - if (input.type === "string" || input.type === "bytes") - return keccak256(toBytes(value)) === arg; - return value === arg; - } catch { - return false; - } - } - if (Array.isArray(args) && Array.isArray(matchArgs)) { - return matchArgs.every((value, index2) => { - if (value === null || value === void 0) - return true; - const input = inputs[index2]; - if (!input) - return false; - const value_ = Array.isArray(value) ? value : [value]; - return value_.some((value2) => isEqual2(input, value2, args[index2])); - }); - } - if (typeof args === "object" && !Array.isArray(args) && typeof matchArgs === "object" && !Array.isArray(matchArgs)) - return Object.entries(matchArgs).every(([key, value]) => { - if (value === null || value === void 0) - return true; - const input = inputs.find((input2) => input2.name === key); - if (!input) - return false; - const value_ = Array.isArray(value) ? value : [value]; - return value_.some((value2) => isEqual2(input, value2, args[key])); - }); - return false; -} - -// node_modules/viem/_esm/actions/public/getLogs.js -init_toHex(); -async function getLogs(client, { address: address2, blockHash, fromBlock, toBlock, event, events: events_, args, strict: strict_ } = {}) { - const strict = strict_ ?? false; - const events = events_ ?? (event ? [event] : void 0); - let topics = []; - if (events) { - const encoded = events.flatMap((event2) => encodeEventTopics({ - abi: [event2], - eventName: event2.name, - args: events_ ? void 0 : args - })); - topics = [encoded]; - if (event) - topics = topics[0]; - } - let logs; - if (blockHash) { - logs = await client.request({ - method: "eth_getLogs", - params: [{ address: address2, topics, blockHash }] - }); - } else { - logs = await client.request({ - method: "eth_getLogs", - params: [ - { - address: address2, - topics, - fromBlock: typeof fromBlock === "bigint" ? numberToHex(fromBlock) : fromBlock, - toBlock: typeof toBlock === "bigint" ? numberToHex(toBlock) : toBlock + // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie + getSetCookie() { + webidl.brandCheck(this, _Headers); + const list = this.#headersList.cookies; + if (list) { + return [...list]; } - ] - }); - } - const formattedLogs = logs.map((log) => formatLog(log)); - if (!events) - return formattedLogs; - return parseEventLogs({ - abi: events, - args, - logs: formattedLogs, - strict - }); -} - -// node_modules/viem/_esm/actions/public/getContractEvents.js -async function getContractEvents(client, parameters) { - const { abi: abi2, address: address2, args, blockHash, eventName, fromBlock, toBlock, strict } = parameters; - const event = eventName ? getAbiItem({ abi: abi2, name: eventName }) : void 0; - const events = !event ? abi2.filter((x) => x.type === "event") : void 0; - return getAction(client, getLogs, "getLogs")({ - address: address2, - args, - blockHash, - event, - events, - fromBlock, - toBlock, - strict - }); -} - -// node_modules/viem/_esm/actions/public/readContract.js -init_decodeFunctionResult(); -init_encodeFunctionData(); -init_call(); -async function readContract(client, parameters) { - const { abi: abi2, address: address2, args, functionName, ...rest } = parameters; - const calldata = encodeFunctionData({ - abi: abi2, - args, - functionName - }); - try { - const { data } = await getAction(client, call, "call")({ - ...rest, - data: calldata, - to: address2 - }); - return decodeFunctionResult({ - abi: abi2, - args, - functionName, - data: data || "0x" - }); - } catch (error) { - throw getContractError(error, { - abi: abi2, - address: address2, - args, - docsPath: "/docs/contract/readContract", - functionName - }); - } -} - -// node_modules/viem/_esm/actions/public/simulateContract.js -init_parseAccount(); -init_decodeFunctionResult(); -init_encodeFunctionData(); -init_call(); -async function simulateContract(client, parameters) { - const { abi: abi2, address: address2, args, functionName, dataSuffix = typeof client.dataSuffix === "string" ? client.dataSuffix : client.dataSuffix?.value, ...callRequest } = parameters; - const account = callRequest.account ? parseAccount(callRequest.account) : client.account; - const calldata = encodeFunctionData({ abi: abi2, args, functionName }); - try { - const { data } = await getAction(client, call, "call")({ - batch: false, - data: `${calldata}${dataSuffix ? dataSuffix.replace("0x", "") : ""}`, - to: address2, - ...callRequest, - account - }); - const result = decodeFunctionResult({ - abi: abi2, - args, - functionName, - data: data || "0x" - }); - const minimizedAbi = abi2.filter((abiItem) => "name" in abiItem && abiItem.name === parameters.functionName); - return { - result, - request: { - abi: minimizedAbi, - address: address2, - args, - dataSuffix, - functionName, - ...callRequest, - account + return []; } - }; - } catch (error) { - throw getContractError(error, { - abi: abi2, - address: address2, - args, - docsPath: "/docs/contract/simulateContract", - functionName, - sender: account?.address - }); - } -} - -// node_modules/viem/_esm/actions/public/watchContractEvent.js -init_abi(); -init_rpc(); - -// node_modules/viem/_esm/utils/observe.js -var listenersCache = /* @__PURE__ */ new Map(); -var cleanupCache = /* @__PURE__ */ new Map(); -var callbackCount = 0; -function observe(observerId, callbacks, fn) { - const callbackId = ++callbackCount; - const getListeners = () => listenersCache.get(observerId) || []; - const unsubscribe = () => { - const listeners2 = getListeners(); - listenersCache.set(observerId, listeners2.filter((cb) => cb.id !== callbackId)); - }; - const unwatch = () => { - const listeners2 = getListeners(); - if (!listeners2.some((cb) => cb.id === callbackId)) - return; - const cleanup2 = cleanupCache.get(observerId); - if (listeners2.length === 1 && cleanup2) { - const p = cleanup2(); - if (p instanceof Promise) - p.catch(() => { - }); - } - unsubscribe(); - }; - const listeners = getListeners(); - listenersCache.set(observerId, [ - ...listeners, - { id: callbackId, fns: callbacks } - ]); - if (listeners && listeners.length > 0) - return unwatch; - const emit = {}; - for (const key in callbacks) { - emit[key] = ((...args) => { - const listeners2 = getListeners(); - if (listeners2.length === 0) - return; - for (const listener of listeners2) - listener.fns[key]?.(...args); - }); - } - const cleanup = fn(emit); - if (typeof cleanup === "function") - cleanupCache.set(observerId, cleanup); - return unwatch; -} - -// node_modules/viem/_esm/utils/wait.js -async function wait(time) { - return new Promise((res) => setTimeout(res, time)); -} - -// node_modules/viem/_esm/utils/poll.js -function poll(fn, { emitOnBegin, initialWaitTime, interval }) { - let active = true; - const unwatch = () => active = false; - const watch = async () => { - let data; - if (emitOnBegin) - data = await fn({ unpoll: unwatch }); - const initialWait = await initialWaitTime?.(data) ?? interval; - await wait(initialWait); - const poll2 = async () => { - if (!active) - return; - await fn({ unpoll: unwatch }); - await wait(interval); - poll2(); - }; - poll2(); - }; - watch(); - return unwatch; -} - -// node_modules/viem/_esm/actions/public/watchContractEvent.js -init_stringify(); - -// node_modules/viem/_esm/utils/promise/withCache.js -var promiseCache = /* @__PURE__ */ new Map(); -var responseCache = /* @__PURE__ */ new Map(); -function getCache(cacheKey2) { - const buildCache = (cacheKey3, cache2) => ({ - clear: () => cache2.delete(cacheKey3), - get: () => cache2.get(cacheKey3), - set: (data) => cache2.set(cacheKey3, data) - }); - const promise = buildCache(cacheKey2, promiseCache); - const response = buildCache(cacheKey2, responseCache); - return { - clear: () => { - promise.clear(); - response.clear(); - }, - promise, - response - }; -} -async function withCache(fn, { cacheKey: cacheKey2, cacheTime = Number.POSITIVE_INFINITY }) { - const cache2 = getCache(cacheKey2); - const response = cache2.response.get(); - if (response && cacheTime > 0) { - const age = Date.now() - response.created.getTime(); - if (age < cacheTime) - return response.data; - } - let promise = cache2.promise.get(); - if (!promise) { - promise = fn(); - cache2.promise.set(promise); - } - try { - const data = await promise; - cache2.response.set({ created: /* @__PURE__ */ new Date(), data }); - return data; - } finally { - cache2.promise.clear(); - } -} - -// node_modules/viem/_esm/actions/public/getBlockNumber.js -var cacheKey = (id) => `blockNumber.${id}`; -async function getBlockNumber(client, { cacheTime = client.cacheTime } = {}) { - const blockNumberHex = await withCache(() => client.request({ - method: "eth_blockNumber" - }), { cacheKey: cacheKey(client.uid), cacheTime }); - return BigInt(blockNumberHex); -} - -// node_modules/viem/_esm/actions/public/getFilterChanges.js -async function getFilterChanges(_client, { filter }) { - const strict = "strict" in filter && filter.strict; - const logs = await filter.request({ - method: "eth_getFilterChanges", - params: [filter.id] - }); - if (typeof logs[0] === "string") - return logs; - const formattedLogs = logs.map((log) => formatLog(log)); - if (!("abi" in filter) || !filter.abi) - return formattedLogs; - return parseEventLogs({ - abi: filter.abi, - logs: formattedLogs, - strict - }); -} - -// node_modules/viem/_esm/actions/public/uninstallFilter.js -async function uninstallFilter(_client, { filter }) { - return filter.request({ - method: "eth_uninstallFilter", - params: [filter.id] - }); -} - -// node_modules/viem/_esm/actions/public/watchContractEvent.js -function watchContractEvent(client, parameters) { - const { abi: abi2, address: address2, args, batch = true, eventName, fromBlock, onError, onLogs, poll: poll_, pollingInterval = client.pollingInterval, strict: strict_ } = parameters; - const enablePolling = (() => { - if (typeof poll_ !== "undefined") - return poll_; - if (typeof fromBlock === "bigint") - return true; - if (client.transport.type === "webSocket" || client.transport.type === "ipc") - return false; - if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) - return false; - return true; - })(); - const pollContractEvent = () => { - const strict = strict_ ?? false; - const observerId = stringify([ - "watchContractEvent", - address2, - args, - batch, - client.uid, - eventName, - pollingInterval, - strict, - fromBlock - ]); - return observe(observerId, { onLogs, onError }, (emit) => { - let previousBlockNumber; - if (fromBlock !== void 0) - previousBlockNumber = fromBlock - 1n; - let filter; - let initialized = false; - const unwatch = poll(async () => { - if (!initialized) { + [util2.inspect.custom](depth, options) { + options.depth ??= depth; + return `Headers ${util2.formatWithOptions(options, this.#headersList.entries)}`; + } + static getHeadersGuard(o3) { + return o3.#guard; + } + static setHeadersGuard(o3, guard) { + o3.#guard = guard; + } + /** + * @param {Headers} o + */ + static getHeadersList(o3) { + return o3.#headersList; + } + /** + * @param {Headers} target + * @param {HeadersList} list + */ + static setHeadersList(target, list) { + target.#headersList = list; + } + }; + var { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers2; + Reflect.deleteProperty(Headers2, "getHeadersGuard"); + Reflect.deleteProperty(Headers2, "setHeadersGuard"); + Reflect.deleteProperty(Headers2, "getHeadersList"); + Reflect.deleteProperty(Headers2, "setHeadersList"); + iteratorMixin("Headers", Headers2, headersListSortAndCombine, 0, 1); + Object.defineProperties(Headers2.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + getSetCookie: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Headers", + configurable: true + }, + [util2.inspect.custom]: { + enumerable: false + } + }); + webidl.converters.HeadersInit = function(V, prefix, argument) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { + const iterator = Reflect.get(V, Symbol.iterator); + if (!util2.types.isProxy(V) && iterator === Headers2.prototype.entries) { try { - filter = await getAction(client, createContractEventFilter, "createContractEventFilter")({ - abi: abi2, - address: address2, - args, - eventName, - strict, - fromBlock - }); + return getHeadersList(V).entriesList; } catch { } - initialized = true; - return; - } - try { - let logs; - if (filter) { - logs = await getAction(client, getFilterChanges, "getFilterChanges")({ filter }); - } else { - const blockNumber = await getAction(client, getBlockNumber, "getBlockNumber")({}); - if (previousBlockNumber && previousBlockNumber < blockNumber) { - logs = await getAction(client, getContractEvents, "getContractEvents")({ - abi: abi2, - address: address2, - args, - eventName, - fromBlock: previousBlockNumber + 1n, - toBlock: blockNumber, - strict - }); - } else { - logs = []; - } - previousBlockNumber = blockNumber; - } - if (logs.length === 0) - return; - if (batch) - emit.onLogs(logs); - else - for (const log of logs) - emit.onLogs([log]); - } catch (err) { - if (filter && err instanceof InvalidInputRpcError) - initialized = false; - emit.onError?.(err); } - }, { - emitOnBegin: true, - interval: pollingInterval - }); - return async () => { - if (filter) - await getAction(client, uninstallFilter, "uninstallFilter")({ filter }); - unwatch(); - }; - }); - }; - const subscribeContractEvent = () => { - const strict = strict_ ?? false; - const observerId = stringify([ - "watchContractEvent", - address2, - args, - batch, - client.uid, - eventName, - pollingInterval, - strict - ]); - let active = true; - let unsubscribe = () => active = false; - return observe(observerId, { onLogs, onError }, (emit) => { - ; - (async () => { - try { - const transport = (() => { - if (client.transport.type === "fallback") { - const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); - if (!transport2) - return client.transport; - return transport2.value; - } - return client.transport; - })(); - const topics = eventName ? encodeEventTopics({ - abi: abi2, - eventName, - args - }) : []; - const { unsubscribe: unsubscribe_ } = await transport.subscribe({ - params: ["logs", { address: address2, topics }], - onData(data) { - if (!active) - return; - const log = data.result; - try { - const { eventName: eventName2, args: args2 } = decodeEventLog({ - abi: abi2, - data: log.data, - topics: log.topics, - strict: strict_ - }); - const formatted = formatLog(log, { - args: args2, - eventName: eventName2 - }); - emit.onLogs([formatted]); - } catch (err) { - let eventName2; - let isUnnamed; - if (err instanceof DecodeLogDataMismatch || err instanceof DecodeLogTopicsMismatch) { - if (strict_) - return; - eventName2 = err.abiItem.name; - isUnnamed = err.abiItem.inputs?.some((x) => !("name" in x && x.name)); - } - const formatted = formatLog(log, { - args: isUnnamed ? [] : {}, - eventName: eventName2 - }); - emit.onLogs([formatted]); - } - }, - onError(error) { - emit.onError?.(error); - } - }); - unsubscribe = unsubscribe_; - if (!active) - unsubscribe(); - } catch (err) { - onError?.(err); + if (typeof iterator === "function") { + return webidl.converters["sequence>"](V, prefix, argument, iterator.bind(V)); } - })(); - return () => unsubscribe(); - }); - }; - return enablePolling ? pollContractEvent() : subscribeContractEvent(); -} - -// node_modules/viem/_esm/actions/wallet/sendRawTransaction.js -async function sendRawTransaction(client, { serializedTransaction }) { - return client.request({ - method: "eth_sendRawTransaction", - params: [serializedTransaction] - }, { retryCount: 0 }); -} - -// node_modules/viem/_esm/utils/promise/withRetry.js -function withRetry(fn, { delay: delay_ = 100, retryCount = 2, shouldRetry: shouldRetry2 = () => true } = {}) { - return new Promise((resolve, reject) => { - const attemptRetry = async ({ count = 0 } = {}) => { - const retry = async ({ error }) => { - const delay = typeof delay_ === "function" ? delay_({ count, error }) : delay_; - if (delay) - await wait(delay); - attemptRetry({ count: count + 1 }); - }; - try { - const data = await fn(); - resolve(data); - } catch (err) { - if (count < retryCount && await shouldRetry2({ count, error: err })) - return retry({ error: err }); - reject(err); + return webidl.converters["record"](V, prefix, argument); } + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] + }); }; - attemptRetry(); - }); -} - -// node_modules/viem/_esm/utils/formatters/transactionReceipt.js -init_fromHex(); -init_formatter(); -var receiptStatuses = { - "0x0": "reverted", - "0x1": "success" -}; -function formatTransactionReceipt(transactionReceipt, _) { - const receipt = { - ...transactionReceipt, - blockNumber: transactionReceipt.blockNumber ? BigInt(transactionReceipt.blockNumber) : null, - contractAddress: transactionReceipt.contractAddress ? transactionReceipt.contractAddress : null, - cumulativeGasUsed: transactionReceipt.cumulativeGasUsed ? BigInt(transactionReceipt.cumulativeGasUsed) : null, - effectiveGasPrice: transactionReceipt.effectiveGasPrice ? BigInt(transactionReceipt.effectiveGasPrice) : null, - gasUsed: transactionReceipt.gasUsed ? BigInt(transactionReceipt.gasUsed) : null, - logs: transactionReceipt.logs ? transactionReceipt.logs.map((log) => formatLog(log)) : null, - to: transactionReceipt.to ? transactionReceipt.to : null, - transactionIndex: transactionReceipt.transactionIndex ? hexToNumber(transactionReceipt.transactionIndex) : null, - status: transactionReceipt.status ? receiptStatuses[transactionReceipt.status] : null, - type: transactionReceipt.type ? transactionType[transactionReceipt.type] || transactionReceipt.type : null - }; - if (transactionReceipt.blobGasPrice) - receipt.blobGasPrice = BigInt(transactionReceipt.blobGasPrice); - if (transactionReceipt.blobGasUsed) - receipt.blobGasUsed = BigInt(transactionReceipt.blobGasUsed); - return receipt; -} -var defineTransactionReceipt = /* @__PURE__ */ defineFormatter("transactionReceipt", formatTransactionReceipt); - -// node_modules/viem/_esm/clients/createClient.js -init_parseAccount(); - -// node_modules/viem/_esm/utils/uid.js -var size4 = 256; -var index = size4; -var buffer; -function uid(length = 11) { - if (!buffer || index + length > size4 * 2) { - buffer = ""; - index = 0; - for (let i = 0; i < size4; i++) { - buffer += (256 + Math.random() * 256 | 0).toString(16).substring(1); - } - } - return buffer.substring(index, index++ + length); -} - -// node_modules/viem/_esm/clients/createClient.js -function createClient(parameters) { - const { batch, chain: chain3, ccipRead, dataSuffix, key = "base", name = "Base Client", type = "base" } = parameters; - const experimental_blockTag = parameters.experimental_blockTag ?? (typeof chain3?.experimental_preconfirmationTime === "number" ? "pending" : void 0); - const blockTime = chain3?.blockTime ?? 12e3; - const defaultPollingInterval = Math.min(Math.max(Math.floor(blockTime / 2), 500), 4e3); - const pollingInterval = parameters.pollingInterval ?? defaultPollingInterval; - const cacheTime = parameters.cacheTime ?? pollingInterval; - const account = parameters.account ? parseAccount(parameters.account) : void 0; - const { config, request, value } = parameters.transport({ - account, - chain: chain3, - pollingInterval - }); - const transport = { ...config, ...value }; - const client = { - account, - batch, - cacheTime, - ccipRead, - chain: chain3, - dataSuffix, - key, - name, - pollingInterval, - request, - transport, - type, - uid: uid(), - ...experimental_blockTag ? { experimental_blockTag } : {} - }; - function extend(base2) { - return (extendFn) => { - const extended = extendFn(base2); - for (const key2 in client) - delete extended[key2]; - const combined = { ...base2, ...extended }; - return Object.assign(combined, { extend: extend(combined) }); - }; - } - return Object.assign(client, { extend: extend(client) }); -} - -// node_modules/viem/_esm/actions/ens/getEnsAddress.js -init_abis(); -init_decodeFunctionResult(); -init_encodeFunctionData(); -init_getChainContractAddress(); -init_trim(); -init_toHex(); - -// node_modules/viem/_esm/utils/ens/errors.js -init_base(); -init_contract(); -function isNullUniversalResolverError(err) { - if (!(err instanceof BaseError2)) - return false; - const cause = err.walk((e7) => e7 instanceof ContractFunctionRevertedError); - if (!(cause instanceof ContractFunctionRevertedError)) - return false; - if (cause.data?.errorName === "HttpError") - return true; - if (cause.data?.errorName === "ResolverError") - return true; - if (cause.data?.errorName === "ResolverNotContract") - return true; - if (cause.data?.errorName === "ResolverNotFound") - return true; - if (cause.data?.errorName === "ReverseAddressMismatch") - return true; - if (cause.data?.errorName === "UnsupportedResolverProfile") - return true; - return false; -} - -// node_modules/viem/_esm/actions/ens/getEnsAddress.js -init_localBatchGatewayRequest(); - -// node_modules/viem/_esm/utils/ens/namehash.js -init_concat(); -init_toBytes(); -init_toHex(); -init_keccak256(); - -// node_modules/viem/_esm/utils/ens/encodedLabelToLabelhash.js -init_isHex(); -function encodedLabelToLabelhash(label) { - if (label.length !== 66) - return null; - if (label.indexOf("[") !== 0) - return null; - if (label.indexOf("]") !== 65) - return null; - const hash3 = `0x${label.slice(1, 65)}`; - if (!isHex(hash3)) - return null; - return hash3; -} - -// node_modules/viem/_esm/utils/ens/namehash.js -function namehash(name) { - let result = new Uint8Array(32).fill(0); - if (!name) - return bytesToHex(result); - const labels = name.split("."); - for (let i = labels.length - 1; i >= 0; i -= 1) { - const hashFromEncodedLabel = encodedLabelToLabelhash(labels[i]); - const hashed = hashFromEncodedLabel ? toBytes(hashFromEncodedLabel) : keccak256(stringToBytes(labels[i]), "bytes"); - result = keccak256(concat([result, hashed]), "bytes"); - } - return bytesToHex(result); -} - -// node_modules/viem/_esm/utils/ens/packetToBytes.js -init_toBytes(); - -// node_modules/viem/_esm/utils/ens/encodeLabelhash.js -function encodeLabelhash(hash3) { - return `[${hash3.slice(2)}]`; -} - -// node_modules/viem/_esm/utils/ens/labelhash.js -init_toBytes(); -init_toHex(); -init_keccak256(); -function labelhash(label) { - const result = new Uint8Array(32).fill(0); - if (!label) - return bytesToHex(result); - return encodedLabelToLabelhash(label) || keccak256(stringToBytes(label)); -} - -// node_modules/viem/_esm/utils/ens/packetToBytes.js -function packetToBytes(packet) { - const value = packet.replace(/^\.|\.$/gm, ""); - if (value.length === 0) - return new Uint8Array(1); - const bytes = new Uint8Array(stringToBytes(value).byteLength + 2); - let offset = 0; - const list = value.split("."); - for (let i = 0; i < list.length; i++) { - let encoded = stringToBytes(list[i]); - if (encoded.byteLength > 255) - encoded = stringToBytes(encodeLabelhash(labelhash(list[i]))); - bytes[offset] = encoded.length; - bytes.set(encoded, offset + 1); - offset += encoded.length + 1; - } - if (bytes.byteLength !== offset + 1) - return bytes.slice(0, offset + 1); - return bytes; -} - -// node_modules/viem/_esm/actions/ens/getEnsAddress.js -async function getEnsAddress(client, parameters) { - const { blockNumber, blockTag, coinType, name, gatewayUrls, strict } = parameters; - const { chain: chain3 } = client; - const universalResolverAddress = (() => { - if (parameters.universalResolverAddress) - return parameters.universalResolverAddress; - if (!chain3) - throw new Error("client chain not configured. universalResolverAddress is required."); - return getChainContractAddress({ - blockNumber, - chain: chain3, - contract: "ensUniversalResolver" - }); - })(); - const tlds = chain3?.ensTlds; - if (tlds && !tlds.some((tld) => name.endsWith(tld))) - return null; - const args = (() => { - if (coinType != null) - return [namehash(name), BigInt(coinType)]; - return [namehash(name)]; - })(); - try { - const functionData = encodeFunctionData({ - abi: addressResolverAbi, - functionName: "addr", - args - }); - const readContractParameters = { - address: universalResolverAddress, - abi: universalResolverResolveAbi, - functionName: "resolveWithGateways", - args: [ - toHex(packetToBytes(name)), - functionData, - gatewayUrls ?? [localBatchGatewayUrl] - ], - blockNumber, - blockTag - }; - const readContractAction = getAction(client, readContract, "readContract"); - const res = await readContractAction(readContractParameters); - if (res[0] === "0x") - return null; - const address2 = decodeFunctionResult({ - abi: addressResolverAbi, - args, - functionName: "addr", - data: res[0] - }); - if (address2 === "0x") - return null; - if (trim(address2) === "0x00") - return null; - return address2; - } catch (err) { - if (strict) - throw err; - if (isNullUniversalResolverError(err)) - return null; - throw err; - } -} - -// node_modules/viem/_esm/errors/ens.js -init_base(); -var EnsAvatarInvalidMetadataError = class extends BaseError2 { - constructor({ data }) { - super("Unable to extract image from metadata. The metadata may be malformed or invalid.", { - metaMessages: [ - "- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.", - "", - `Provided data: ${JSON.stringify(data)}` - ], - name: "EnsAvatarInvalidMetadataError" - }); - } -}; -var EnsAvatarInvalidNftUriError = class extends BaseError2 { - constructor({ reason }) { - super(`ENS NFT avatar URI is invalid. ${reason}`, { - name: "EnsAvatarInvalidNftUriError" - }); - } -}; -var EnsAvatarUriResolutionError = class extends BaseError2 { - constructor({ uri }) { - super(`Unable to resolve ENS avatar URI "${uri}". The URI may be malformed, invalid, or does not respond with a valid image.`, { name: "EnsAvatarUriResolutionError" }); - } -}; -var EnsAvatarUnsupportedNamespaceError = class extends BaseError2 { - constructor({ namespace }) { - super(`ENS NFT avatar namespace "${namespace}" is not supported. Must be "erc721" or "erc1155".`, { name: "EnsAvatarUnsupportedNamespaceError" }); - } -}; - -// node_modules/viem/_esm/utils/ens/avatar/utils.js -var networkRegex = /(?https?:\/\/[^/]*|ipfs:\/|ipns:\/|ar:\/)?(?\/)?(?ipfs\/|ipns\/)?(?[\w\-.]+)(?\/.*)?/; -var ipfsHashRegex = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\/(?[\w\-.]+))?(?\/.*)?$/; -var base64Regex = /^data:([a-zA-Z\-/+]*);base64,([^"].*)/; -var dataURIRegex = /^data:([a-zA-Z\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/; -async function isImageUri(uri) { - try { - const res = await fetch(uri, { method: "HEAD" }); - if (res.status === 200) { - const contentType = res.headers.get("content-type"); - return contentType?.startsWith("image/"); - } - return false; - } catch (error) { - if (typeof error === "object" && typeof error.response !== "undefined") { - return false; - } - if (!Object.hasOwn(globalThis, "Image")) - return false; - return new Promise((resolve) => { - const img = new Image(); - img.onload = () => { - resolve(true); - }; - img.onerror = () => { - resolve(false); - }; - img.src = uri; - }); - } -} -function getGateway(custom2, defaultGateway) { - if (!custom2) - return defaultGateway; - if (custom2.endsWith("/")) - return custom2.slice(0, -1); - return custom2; -} -function resolveAvatarUri({ uri, gatewayUrls }) { - const isEncoded = base64Regex.test(uri); - if (isEncoded) - return { uri, isOnChain: true, isEncoded }; - const ipfsGateway = getGateway(gatewayUrls?.ipfs, "https://ipfs.io"); - const arweaveGateway = getGateway(gatewayUrls?.arweave, "https://arweave.net"); - const networkRegexMatch = uri.match(networkRegex); - const { protocol, subpath, target, subtarget = "" } = networkRegexMatch?.groups || {}; - const isIPNS = protocol === "ipns:/" || subpath === "ipns/"; - const isIPFS = protocol === "ipfs:/" || subpath === "ipfs/" || ipfsHashRegex.test(uri); - if (uri.startsWith("http") && !isIPNS && !isIPFS) { - let replacedUri = uri; - if (gatewayUrls?.arweave) - replacedUri = uri.replace(/https:\/\/arweave.net/g, gatewayUrls?.arweave); - return { uri: replacedUri, isOnChain: false, isEncoded: false }; - } - if ((isIPNS || isIPFS) && target) { - return { - uri: `${ipfsGateway}/${isIPNS ? "ipns" : "ipfs"}/${target}${subtarget}`, - isOnChain: false, - isEncoded: false - }; - } - if (protocol === "ar:/" && target) { - return { - uri: `${arweaveGateway}/${target}${subtarget || ""}`, - isOnChain: false, - isEncoded: false + module.exports = { + fill, + // for test. + compareHeaderName, + Headers: Headers2, + HeadersList, + getHeadersGuard, + setHeadersGuard, + setHeadersList, + getHeadersList }; } - let parsedUri = uri.replace(dataURIRegex, ""); - if (parsedUri.startsWith(" 1; + } + // Returns response’s status. + get status() { + webidl.brandCheck(this, _Response); + return this.#state.status; + } + // Returns whether response’s status is an ok status. + get ok() { + webidl.brandCheck(this, _Response); + return this.#state.status >= 200 && this.#state.status <= 299; + } + // Returns response’s status message. + get statusText() { + webidl.brandCheck(this, _Response); + return this.#state.statusText; + } + // Returns response’s headers as Headers. + get headers() { + webidl.brandCheck(this, _Response); + return this.#headers; + } + get body() { + webidl.brandCheck(this, _Response); + return this.#state.body ? this.#state.body.stream : null; + } + get bodyUsed() { + webidl.brandCheck(this, _Response); + return !!this.#state.body && util2.isDisturbed(this.#state.body.stream); + } + // Returns a clone of response. + clone() { + webidl.brandCheck(this, _Response); + if (bodyUnusable(this.#state)) { + throw webidl.errors.exception({ + header: "Response.clone", + message: "Body has already been consumed." + }); + } + const clonedResponse = cloneResponse(this.#state); + if (this.#state.urlList.length !== 0 && this.#state.body?.stream) { + streamRegistry.register(this, new WeakRef(this.#state.body.stream)); + } + return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers)); + } + [nodeUtil.inspect.custom](depth, options) { + if (options.depth === null) { + options.depth = 2; + } + options.colors ??= true; + const properties = { + status: this.status, + statusText: this.statusText, + headers: this.headers, + body: this.body, + bodyUsed: this.bodyUsed, + ok: this.ok, + redirected: this.redirected, + type: this.type, + url: this.url + }; + return `Response ${nodeUtil.formatWithOptions(options, properties)}`; + } + /** + * @param {Response} response + */ + static getResponseHeaders(response) { + return response.#headers; + } + /** + * @param {Response} response + * @param {Headers} newHeaders + */ + static setResponseHeaders(response, newHeaders) { + response.#headers = newHeaders; + } + /** + * @param {Response} response + */ + static getResponseState(response) { + return response.#state; + } + /** + * @param {Response} response + * @param {any} newState + */ + static setResponseState(response, newState) { + response.#state = newState; + } }; - } - throw new EnsAvatarUriResolutionError({ uri }); -} -function getJsonImage(data) { - if (typeof data !== "object" || !("image" in data) && !("image_url" in data) && !("image_data" in data)) { - throw new EnsAvatarInvalidMetadataError({ data }); - } - return data.image || data.image_url || data.image_data; -} -async function getMetadataAvatarUri({ gatewayUrls, uri }) { - try { - const res = await fetch(uri).then((res2) => res2.json()); - const image = await parseAvatarUri({ - gatewayUrls, - uri: getJsonImage(res) + var { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response2; + Reflect.deleteProperty(Response2, "getResponseHeaders"); + Reflect.deleteProperty(Response2, "setResponseHeaders"); + Reflect.deleteProperty(Response2, "getResponseState"); + Reflect.deleteProperty(Response2, "setResponseState"); + mixinBody(Response2, getResponseState); + Object.defineProperties(Response2.prototype, { + type: kEnumerableProperty, + url: kEnumerableProperty, + status: kEnumerableProperty, + ok: kEnumerableProperty, + redirected: kEnumerableProperty, + statusText: kEnumerableProperty, + headers: kEnumerableProperty, + clone: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Response", + configurable: true + } }); - return image; - } catch { - throw new EnsAvatarUriResolutionError({ uri }); - } -} -async function parseAvatarUri({ gatewayUrls, uri }) { - const { uri: resolvedURI, isOnChain } = resolveAvatarUri({ uri, gatewayUrls }); - if (isOnChain) - return resolvedURI; - const isImage = await isImageUri(resolvedURI); - if (isImage) - return resolvedURI; - throw new EnsAvatarUriResolutionError({ uri }); -} -function parseNftUri(uri_) { - let uri = uri_; - if (uri.startsWith("did:nft:")) { - uri = uri.replace("did:nft:", "").replace(/_/g, "/"); - } - const [reference, asset_namespace, tokenID] = uri.split("/"); - const [eip_namespace, chainID] = reference.split(":"); - const [erc_namespace, contractAddress] = asset_namespace.split(":"); - if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") - throw new EnsAvatarInvalidNftUriError({ reason: "Only EIP-155 supported" }); - if (!chainID) - throw new EnsAvatarInvalidNftUriError({ reason: "Chain ID not found" }); - if (!contractAddress) - throw new EnsAvatarInvalidNftUriError({ - reason: "Contract address not found" + Object.defineProperties(Response2, { + json: kEnumerableProperty, + redirect: kEnumerableProperty, + error: kEnumerableProperty }); - if (!tokenID) - throw new EnsAvatarInvalidNftUriError({ reason: "Token ID not found" }); - if (!erc_namespace) - throw new EnsAvatarInvalidNftUriError({ reason: "ERC namespace not found" }); - return { - chainID: Number.parseInt(chainID, 10), - namespace: erc_namespace.toLowerCase(), - contractAddress, - tokenID - }; -} -async function getNftTokenUri(client, { nft }) { - if (nft.namespace === "erc721") { - return readContract(client, { - address: nft.contractAddress, - abi: [ - { - name: "tokenURI", - type: "function", - stateMutability: "view", - inputs: [{ name: "tokenId", type: "uint256" }], - outputs: [{ name: "", type: "string" }] + function cloneResponse(response) { + if (response.internalResponse) { + return filterResponse( + cloneResponse(response.internalResponse), + response.type + ); + } + const newResponse = makeResponse({ ...response, body: null }); + if (response.body != null) { + newResponse.body = cloneBody(response.body); + } + return newResponse; + } + function makeResponse(init) { + return { + aborted: false, + rangeRequested: false, + timingAllowPassed: false, + requestIncludesCredentials: false, + type: "default", + status: 200, + timingInfo: null, + cacheState: "", + statusText: "", + ...init, + headersList: init?.headersList ? new HeadersList(init?.headersList) : new HeadersList(), + urlList: init?.urlList ? [...init.urlList] : [] + }; + } + function makeNetworkError(reason) { + const isError = isErrorLike(reason); + return makeResponse({ + type: "error", + status: 0, + error: isError ? reason : new Error(reason ? String(reason) : reason), + aborted: reason && reason.name === "AbortError" + }); + } + function isNetworkError(response) { + return ( + // A network error is a response whose type is "error", + response.type === "error" && // status is 0 + response.status === 0 + ); + } + function makeFilteredResponse(response, state) { + state = { + internalResponse: response, + ...state + }; + return new Proxy(response, { + get(target, p) { + return p in state ? state[p] : target[p]; + }, + set(target, p, value) { + assert8(!(p in state)); + target[p] = value; + return true; } - ], - functionName: "tokenURI", - args: [BigInt(nft.tokenID)] - }); - } - if (nft.namespace === "erc1155") { - return readContract(client, { - address: nft.contractAddress, - abi: [ - { - name: "uri", - type: "function", - stateMutability: "view", - inputs: [{ name: "_id", type: "uint256" }], - outputs: [{ name: "", type: "string" }] + }); + } + function filterResponse(response, type) { + if (type === "basic") { + return makeFilteredResponse(response, { + type: "basic", + headersList: response.headersList + }); + } else if (type === "cors") { + return makeFilteredResponse(response, { + type: "cors", + headersList: response.headersList + }); + } else if (type === "opaque") { + return makeFilteredResponse(response, { + type: "opaque", + urlList: [], + status: 0, + statusText: "", + body: null + }); + } else if (type === "opaqueredirect") { + return makeFilteredResponse(response, { + type: "opaqueredirect", + status: 0, + statusText: "", + headersList: [], + body: null + }); + } else { + assert8(false); + } + } + function makeAppropriateNetworkError(fetchParams, err = null) { + assert8(isCancelled(fetchParams)); + return isAborted2(fetchParams) ? makeNetworkError(Object.assign(new DOMException("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException("Request was cancelled."), { cause: err })); + } + function initializeResponse(response, init, body) { + if (init.status !== null && (init.status < 200 || init.status > 599)) { + throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); + } + if ("statusText" in init && init.statusText != null) { + if (!isValidReasonPhrase(String(init.statusText))) { + throw new TypeError("Invalid statusText"); } - ], - functionName: "uri", - args: [BigInt(nft.tokenID)] - }); - } - throw new EnsAvatarUnsupportedNamespaceError({ namespace: nft.namespace }); -} - -// node_modules/viem/_esm/utils/ens/avatar/parseAvatarRecord.js -async function parseAvatarRecord(client, { gatewayUrls, record }) { - if (/eip155:/i.test(record)) - return parseNftAvatarUri(client, { gatewayUrls, record }); - return parseAvatarUri({ uri: record, gatewayUrls }); -} -async function parseNftAvatarUri(client, { gatewayUrls, record }) { - const nft = parseNftUri(record); - const nftUri = await getNftTokenUri(client, { nft }); - const { uri: resolvedNftUri, isOnChain, isEncoded } = resolveAvatarUri({ uri: nftUri, gatewayUrls }); - if (isOnChain && (resolvedNftUri.includes("data:application/json;base64,") || resolvedNftUri.startsWith("{"))) { - const encodedJson = isEncoded ? ( - // if it is encoded, decode it - atob(resolvedNftUri.replace("data:application/json;base64,", "")) - ) : ( - // if it isn't encoded assume it is a JSON string, but it could be anything (it will error if it is) - resolvedNftUri - ); - const decoded = JSON.parse(encodedJson); - return parseAvatarUri({ uri: getJsonImage(decoded), gatewayUrls }); - } - let uriTokenId = nft.tokenID; - if (nft.namespace === "erc1155") - uriTokenId = uriTokenId.replace("0x", "").padStart(64, "0"); - return getMetadataAvatarUri({ - gatewayUrls, - uri: resolvedNftUri.replace(/(?:0x)?{id}/, uriTokenId) - }); -} - -// node_modules/viem/_esm/actions/ens/getEnsText.js -init_abis(); -init_decodeFunctionResult(); -init_encodeFunctionData(); -init_getChainContractAddress(); -init_toHex(); -init_localBatchGatewayRequest(); -async function getEnsText(client, parameters) { - const { blockNumber, blockTag, key, name, gatewayUrls, strict } = parameters; - const { chain: chain3 } = client; - const universalResolverAddress = (() => { - if (parameters.universalResolverAddress) - return parameters.universalResolverAddress; - if (!chain3) - throw new Error("client chain not configured. universalResolverAddress is required."); - return getChainContractAddress({ - blockNumber, - chain: chain3, - contract: "ensUniversalResolver" - }); - })(); - const tlds = chain3?.ensTlds; - if (tlds && !tlds.some((tld) => name.endsWith(tld))) - return null; - try { - const readContractParameters = { - address: universalResolverAddress, - abi: universalResolverResolveAbi, - args: [ - toHex(packetToBytes(name)), - encodeFunctionData({ - abi: textResolverAbi, - functionName: "text", - args: [namehash(name), key] - }), - gatewayUrls ?? [localBatchGatewayUrl] - ], - functionName: "resolveWithGateways", - blockNumber, - blockTag + } + if ("status" in init && init.status != null) { + getResponseState(response).status = init.status; + } + if ("statusText" in init && init.statusText != null) { + getResponseState(response).statusText = init.statusText; + } + if ("headers" in init && init.headers != null) { + fill(getResponseHeaders(response), init.headers); + } + if (body) { + if (nullBodyStatus.includes(response.status)) { + throw webidl.errors.exception({ + header: "Response constructor", + message: `Invalid response status code ${response.status}` + }); + } + getResponseState(response).body = body.body; + if (body.type != null && !getResponseState(response).headersList.contains("content-type", true)) { + getResponseState(response).headersList.append("content-type", body.type, true); + } + } + } + function fromInnerResponse(innerResponse, guard) { + const response = new Response2(kConstruct); + setResponseState(response, innerResponse); + const headers = new Headers2(kConstruct); + setResponseHeaders(response, headers); + setHeadersList(headers, innerResponse.headersList); + setHeadersGuard(headers, guard); + if (innerResponse.urlList.length !== 0 && innerResponse.body?.stream) { + streamRegistry.register(response, new WeakRef(innerResponse.body.stream)); + } + return response; + } + webidl.converters.XMLHttpRequestBodyInit = function(V, prefix, name) { + if (typeof V === "string") { + return webidl.converters.USVString(V, prefix, name); + } + if (webidl.is.Blob(V)) { + return V; + } + if (webidl.is.BufferSource(V)) { + return V; + } + if (webidl.is.FormData(V)) { + return V; + } + if (webidl.is.URLSearchParams(V)) { + return V; + } + return webidl.converters.DOMString(V, prefix, name); }; - const readContractAction = getAction(client, readContract, "readContract"); - const res = await readContractAction(readContractParameters); - if (res[0] === "0x") - return null; - const record = decodeFunctionResult({ - abi: textResolverAbi, - functionName: "text", - data: res[0] - }); - return record === "" ? null : record; - } catch (err) { - if (strict) - throw err; - if (isNullUniversalResolverError(err)) - return null; - throw err; - } -} - -// node_modules/viem/_esm/actions/ens/getEnsAvatar.js -async function getEnsAvatar(client, { blockNumber, blockTag, assetGatewayUrls, name, gatewayUrls, strict, universalResolverAddress }) { - const record = await getAction(client, getEnsText, "getEnsText")({ - blockNumber, - blockTag, - key: "avatar", - name, - universalResolverAddress, - gatewayUrls, - strict - }); - if (!record) - return null; - try { - return await parseAvatarRecord(client, { - record, - gatewayUrls: assetGatewayUrls - }); - } catch { - return null; - } -} - -// node_modules/viem/_esm/actions/ens/getEnsName.js -init_abis(); -init_getChainContractAddress(); -init_localBatchGatewayRequest(); -async function getEnsName(client, parameters) { - const { address: address2, blockNumber, blockTag, coinType = 60n, gatewayUrls, strict } = parameters; - const { chain: chain3 } = client; - const universalResolverAddress = (() => { - if (parameters.universalResolverAddress) - return parameters.universalResolverAddress; - if (!chain3) - throw new Error("client chain not configured. universalResolverAddress is required."); - return getChainContractAddress({ - blockNumber, - chain: chain3, - contract: "ensUniversalResolver" - }); - })(); - try { - const readContractParameters = { - address: universalResolverAddress, - abi: universalResolverReverseAbi, - args: [address2, coinType, gatewayUrls ?? [localBatchGatewayUrl]], - functionName: "reverseWithGateways", - blockNumber, - blockTag + webidl.converters.BodyInit = function(V, prefix, argument) { + if (webidl.is.ReadableStream(V)) { + return V; + } + if (V?.[Symbol.asyncIterator]) { + return V; + } + return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument); + }; + webidl.converters.ResponseInit = webidl.dictionaryConverter([ + { + key: "status", + converter: webidl.converters["unsigned short"], + defaultValue: () => 200 + }, + { + key: "statusText", + converter: webidl.converters.ByteString, + defaultValue: () => "" + }, + { + key: "headers", + converter: webidl.converters.HeadersInit + } + ]); + webidl.is.Response = webidl.util.MakeTypeAssertion(Response2); + module.exports = { + isNetworkError, + makeNetworkError, + makeResponse, + makeAppropriateNetworkError, + filterResponse, + Response: Response2, + cloneResponse, + fromInnerResponse, + getResponseState }; - const readContractAction = getAction(client, readContract, "readContract"); - const [name] = await readContractAction(readContractParameters); - return name || null; - } catch (err) { - if (strict) - throw err; - if (isNullUniversalResolverError(err)) - return null; - throw err; } -} +}); -// node_modules/viem/_esm/actions/ens/getEnsResolver.js -init_getChainContractAddress(); -init_toHex(); -async function getEnsResolver(client, parameters) { - const { blockNumber, blockTag, name } = parameters; - const { chain: chain3 } = client; - const universalResolverAddress = (() => { - if (parameters.universalResolverAddress) - return parameters.universalResolverAddress; - if (!chain3) - throw new Error("client chain not configured. universalResolverAddress is required."); - return getChainContractAddress({ - blockNumber, - chain: chain3, - contract: "ensUniversalResolver" +// node_modules/undici/lib/web/fetch/request.js +var require_request2 = __commonJS({ + "node_modules/undici/lib/web/fetch/request.js"(exports, module) { + "use strict"; + var { extractBody, mixinBody, cloneBody, bodyUnusable } = require_body(); + var { Headers: Headers2, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require_headers(); + var util2 = require_util(); + var nodeUtil = __require("util"); + var { + isValidHTTPToken, + sameOrigin, + environmentSettingsObject + } = require_util2(); + var { + forbiddenMethodsSet, + corsSafeListedMethodsSet, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + requestDuplex + } = require_constants4(); + var { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util2; + var { webidl } = require_webidl(); + var { URLSerializer } = require_data_url(); + var { kConstruct } = require_symbols(); + var assert8 = __require("assert"); + var { getMaxListeners, setMaxListeners: setMaxListeners7, defaultMaxListeners } = __require("events"); + var kAbortController = /* @__PURE__ */ Symbol("abortController"); + var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { + signal.removeEventListener("abort", abort); }); - })(); - const tlds = chain3?.ensTlds; - if (tlds && !tlds.some((tld) => name.endsWith(tld))) - throw new Error(`${name} is not a valid ENS TLD (${tlds?.join(", ")}) for chain "${chain3.name}" (id: ${chain3.id}).`); - const [resolverAddress] = await getAction(client, readContract, "readContract")({ - address: universalResolverAddress, - abi: [ - { - inputs: [{ type: "bytes" }], - name: "findResolver", - outputs: [ - { type: "address" }, - { type: "bytes32" }, - { type: "uint256" } - ], - stateMutability: "view", - type: "function" + var dependentControllerMap = /* @__PURE__ */ new WeakMap(); + var abortSignalHasEventHandlerLeakWarning; + try { + abortSignalHasEventHandlerLeakWarning = getMaxListeners(new AbortController().signal) > 0; + } catch { + abortSignalHasEventHandlerLeakWarning = false; + } + function buildAbort(acRef) { + return abort; + function abort() { + const ac = acRef.deref(); + if (ac !== void 0) { + requestFinalizer.unregister(abort); + this.removeEventListener("abort", abort); + ac.abort(this.reason); + const controllerList = dependentControllerMap.get(ac.signal); + if (controllerList !== void 0) { + if (controllerList.size !== 0) { + for (const ref of controllerList) { + const ctrl = ref.deref(); + if (ctrl !== void 0) { + ctrl.abort(this.reason); + } + } + controllerList.clear(); + } + dependentControllerMap.delete(ac.signal); + } + } + } + } + var patchMethodWarning = false; + var Request2 = class _Request { + /** @type {AbortSignal} */ + #signal; + /** @type {import('../../dispatcher/dispatcher')} */ + #dispatcher; + /** @type {Headers} */ + #headers; + #state; + // https://fetch.spec.whatwg.org/#dom-request + constructor(input, init = void 0) { + webidl.util.markAsUncloneable(this); + if (input === kConstruct) { + return; + } + const prefix = "Request constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + input = webidl.converters.RequestInfo(input); + init = webidl.converters.RequestInit(init); + let request = null; + let fallbackMode = null; + const baseUrl = environmentSettingsObject.settingsObject.baseUrl; + let signal = null; + if (typeof input === "string") { + this.#dispatcher = init.dispatcher; + let parsedURL; + try { + parsedURL = new URL(input, baseUrl); + } catch (err) { + throw new TypeError("Failed to parse URL from " + input, { cause: err }); + } + if (parsedURL.username || parsedURL.password) { + throw new TypeError( + "Request cannot be constructed from a URL that includes credentials: " + input + ); + } + request = makeRequest({ urlList: [parsedURL] }); + fallbackMode = "cors"; + } else { + assert8(webidl.is.Request(input)); + request = input.#state; + signal = input.#signal; + this.#dispatcher = init.dispatcher || input.#dispatcher; + } + const origin = environmentSettingsObject.settingsObject.origin; + let window = "client"; + if (request.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request.window, origin)) { + window = request.window; + } + if (init.window != null) { + throw new TypeError(`'window' option '${window}' must be null`); + } + if ("window" in init) { + window = "no-window"; + } + request = makeRequest({ + // URL request’s URL. + // undici implementation note: this is set as the first item in request's urlList in makeRequest + // method request’s method. + method: request.method, + // header list A copy of request’s header list. + // undici implementation note: headersList is cloned in makeRequest + headersList: request.headersList, + // unsafe-request flag Set. + unsafeRequest: request.unsafeRequest, + // client This’s relevant settings object. + client: environmentSettingsObject.settingsObject, + // window window. + window, + // priority request’s priority. + priority: request.priority, + // origin request’s origin. The propagation of the origin is only significant for navigation requests + // being handled by a service worker. In this scenario a request can have an origin that is different + // from the current client. + origin: request.origin, + // referrer request’s referrer. + referrer: request.referrer, + // referrer policy request’s referrer policy. + referrerPolicy: request.referrerPolicy, + // mode request’s mode. + mode: request.mode, + // credentials mode request’s credentials mode. + credentials: request.credentials, + // cache mode request’s cache mode. + cache: request.cache, + // redirect mode request’s redirect mode. + redirect: request.redirect, + // integrity metadata request’s integrity metadata. + integrity: request.integrity, + // keepalive request’s keepalive. + keepalive: request.keepalive, + // reload-navigation flag request’s reload-navigation flag. + reloadNavigation: request.reloadNavigation, + // history-navigation flag request’s history-navigation flag. + historyNavigation: request.historyNavigation, + // URL list A clone of request’s URL list. + urlList: [...request.urlList] + }); + const initHasKey = Object.keys(init).length !== 0; + if (initHasKey) { + if (request.mode === "navigate") { + request.mode = "same-origin"; + } + request.reloadNavigation = false; + request.historyNavigation = false; + request.origin = "client"; + request.referrer = "client"; + request.referrerPolicy = ""; + request.url = request.urlList[request.urlList.length - 1]; + request.urlList = [request.url]; + } + if (init.referrer !== void 0) { + const referrer = init.referrer; + if (referrer === "") { + request.referrer = "no-referrer"; + } else { + let parsedReferrer; + try { + parsedReferrer = new URL(referrer, baseUrl); + } catch (err) { + throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); + } + if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl)) { + request.referrer = "client"; + } else { + request.referrer = parsedReferrer; + } + } + } + if (init.referrerPolicy !== void 0) { + request.referrerPolicy = init.referrerPolicy; + } + let mode; + if (init.mode !== void 0) { + mode = init.mode; + } else { + mode = fallbackMode; + } + if (mode === "navigate") { + throw webidl.errors.exception({ + header: "Request constructor", + message: "invalid request mode navigate." + }); + } + if (mode != null) { + request.mode = mode; + } + if (init.credentials !== void 0) { + request.credentials = init.credentials; + } + if (init.cache !== void 0) { + request.cache = init.cache; + } + if (request.cache === "only-if-cached" && request.mode !== "same-origin") { + throw new TypeError( + "'only-if-cached' can be set only with 'same-origin' mode" + ); + } + if (init.redirect !== void 0) { + request.redirect = init.redirect; + } + if (init.integrity != null) { + request.integrity = String(init.integrity); + } + if (init.keepalive !== void 0) { + request.keepalive = Boolean(init.keepalive); + } + if (init.method !== void 0) { + let method = init.method; + const mayBeNormalized = normalizedMethodRecords[method]; + if (mayBeNormalized !== void 0) { + request.method = mayBeNormalized; + } else { + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`); + } + const upperCase = method.toUpperCase(); + if (forbiddenMethodsSet.has(upperCase)) { + throw new TypeError(`'${method}' HTTP method is unsupported.`); + } + method = normalizedMethodRecordsBase[upperCase] ?? method; + request.method = method; + } + if (!patchMethodWarning && request.method === "patch") { + process.emitWarning("Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.", { + code: "UNDICI-FETCH-patch" + }); + patchMethodWarning = true; + } + } + if (init.signal !== void 0) { + signal = init.signal; + } + this.#state = request; + const ac = new AbortController(); + this.#signal = ac.signal; + if (signal != null) { + if (signal.aborted) { + ac.abort(signal.reason); + } else { + this[kAbortController] = ac; + const acRef = new WeakRef(ac); + const abort = buildAbort(acRef); + if (abortSignalHasEventHandlerLeakWarning && getMaxListeners(signal) === defaultMaxListeners) { + setMaxListeners7(1500, signal); + } + util2.addAbortListener(signal, abort); + requestFinalizer.register(ac, { signal, abort }, abort); + } + } + this.#headers = new Headers2(kConstruct); + setHeadersList(this.#headers, request.headersList); + setHeadersGuard(this.#headers, "request"); + if (mode === "no-cors") { + if (!corsSafeListedMethodsSet.has(request.method)) { + throw new TypeError( + `'${request.method} is unsupported in no-cors mode.` + ); + } + setHeadersGuard(this.#headers, "request-no-cors"); + } + if (initHasKey) { + const headersList = getHeadersList(this.#headers); + const headers = init.headers !== void 0 ? init.headers : new HeadersList(headersList); + headersList.clear(); + if (headers instanceof HeadersList) { + for (const { name, value } of headers.rawValues()) { + headersList.append(name, value, false); + } + headersList.cookies = headers.cookies; + } else { + fillHeaders(this.#headers, headers); + } + } + const inputBody = webidl.is.Request(input) ? input.#state.body : null; + if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { + throw new TypeError("Request with GET/HEAD method cannot have body."); + } + let initBody = null; + if (init.body != null) { + const [extractedBody, contentType] = extractBody( + init.body, + request.keepalive + ); + initBody = extractedBody; + if (contentType && !getHeadersList(this.#headers).contains("content-type", true)) { + this.#headers.append("content-type", contentType, true); + } + } + const inputOrInitBody = initBody ?? inputBody; + if (inputOrInitBody != null && inputOrInitBody.source == null) { + if (initBody != null && init.duplex == null) { + throw new TypeError("RequestInit: duplex option is required when sending a body."); + } + if (request.mode !== "same-origin" && request.mode !== "cors") { + throw new TypeError( + 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' + ); + } + request.useCORSPreflightFlag = true; + } + let finalBody = inputOrInitBody; + if (initBody == null && inputBody != null) { + if (bodyUnusable(input.#state)) { + throw new TypeError( + "Cannot construct a Request with a Request object that has already been used." + ); + } + const identityTransform = new TransformStream(); + inputBody.stream.pipeThrough(identityTransform); + finalBody = { + source: inputBody.source, + length: inputBody.length, + stream: identityTransform.readable + }; + } + this.#state.body = finalBody; + } + // Returns request’s HTTP method, which is "GET" by default. + get method() { + webidl.brandCheck(this, _Request); + return this.#state.method; + } + // Returns the URL of request as a string. + get url() { + webidl.brandCheck(this, _Request); + return URLSerializer(this.#state.url); + } + // Returns a Headers object consisting of the headers associated with request. + // Note that headers added in the network layer by the user agent will not + // be accounted for in this object, e.g., the "Host" header. + get headers() { + webidl.brandCheck(this, _Request); + return this.#headers; + } + // Returns the kind of resource requested by request, e.g., "document" + // or "script". + get destination() { + webidl.brandCheck(this, _Request); + return this.#state.destination; + } + // Returns the referrer of request. Its value can be a same-origin URL if + // explicitly set in init, the empty string to indicate no referrer, and + // "about:client" when defaulting to the global’s default. This is used + // during fetching to determine the value of the `Referer` header of the + // request being made. + get referrer() { + webidl.brandCheck(this, _Request); + if (this.#state.referrer === "no-referrer") { + return ""; + } + if (this.#state.referrer === "client") { + return "about:client"; + } + return this.#state.referrer.toString(); + } + // Returns the referrer policy associated with request. + // This is used during fetching to compute the value of the request’s + // referrer. + get referrerPolicy() { + webidl.brandCheck(this, _Request); + return this.#state.referrerPolicy; + } + // Returns the mode associated with request, which is a string indicating + // whether the request will use CORS, or will be restricted to same-origin + // URLs. + get mode() { + webidl.brandCheck(this, _Request); + return this.#state.mode; + } + // Returns the credentials mode associated with request, + // which is a string indicating whether credentials will be sent with the + // request always, never, or only when sent to a same-origin URL. + get credentials() { + webidl.brandCheck(this, _Request); + return this.#state.credentials; + } + // Returns the cache mode associated with request, + // which is a string indicating how the request will + // interact with the browser’s cache when fetching. + get cache() { + webidl.brandCheck(this, _Request); + return this.#state.cache; + } + // Returns the redirect mode associated with request, + // which is a string indicating how redirects for the + // request will be handled during fetching. A request + // will follow redirects by default. + get redirect() { + webidl.brandCheck(this, _Request); + return this.#state.redirect; + } + // Returns request’s subresource integrity metadata, which is a + // cryptographic hash of the resource being fetched. Its value + // consists of multiple hashes separated by whitespace. [SRI] + get integrity() { + webidl.brandCheck(this, _Request); + return this.#state.integrity; + } + // Returns a boolean indicating whether or not request can outlive the + // global in which it was created. + get keepalive() { + webidl.brandCheck(this, _Request); + return this.#state.keepalive; + } + // Returns a boolean indicating whether or not request is for a reload + // navigation. + get isReloadNavigation() { + webidl.brandCheck(this, _Request); + return this.#state.reloadNavigation; + } + // Returns a boolean indicating whether or not request is for a history + // navigation (a.k.a. back-forward navigation). + get isHistoryNavigation() { + webidl.brandCheck(this, _Request); + return this.#state.historyNavigation; + } + // Returns the signal associated with request, which is an AbortSignal + // object indicating whether or not request has been aborted, and its + // abort event handler. + get signal() { + webidl.brandCheck(this, _Request); + return this.#signal; + } + get body() { + webidl.brandCheck(this, _Request); + return this.#state.body ? this.#state.body.stream : null; + } + get bodyUsed() { + webidl.brandCheck(this, _Request); + return !!this.#state.body && util2.isDisturbed(this.#state.body.stream); + } + get duplex() { + webidl.brandCheck(this, _Request); + return "half"; + } + // Returns a clone of request. + clone() { + webidl.brandCheck(this, _Request); + if (bodyUnusable(this.#state)) { + throw new TypeError("unusable"); + } + const clonedRequest = cloneRequest(this.#state); + const ac = new AbortController(); + if (this.signal.aborted) { + ac.abort(this.signal.reason); + } else { + let list = dependentControllerMap.get(this.signal); + if (list === void 0) { + list = /* @__PURE__ */ new Set(); + dependentControllerMap.set(this.signal, list); + } + const acRef = new WeakRef(ac); + list.add(acRef); + util2.addAbortListener( + ac.signal, + buildAbort(acRef) + ); + } + return fromInnerRequest(clonedRequest, this.#dispatcher, ac.signal, getHeadersGuard(this.#headers)); + } + [nodeUtil.inspect.custom](depth, options) { + if (options.depth === null) { + options.depth = 2; + } + options.colors ??= true; + const properties = { + method: this.method, + url: this.url, + headers: this.headers, + destination: this.destination, + referrer: this.referrer, + referrerPolicy: this.referrerPolicy, + mode: this.mode, + credentials: this.credentials, + cache: this.cache, + redirect: this.redirect, + integrity: this.integrity, + keepalive: this.keepalive, + isReloadNavigation: this.isReloadNavigation, + isHistoryNavigation: this.isHistoryNavigation, + signal: this.signal + }; + return `Request ${nodeUtil.formatWithOptions(options, properties)}`; + } + /** + * @param {Request} request + * @param {AbortSignal} newSignal + */ + static setRequestSignal(request, newSignal) { + request.#signal = newSignal; + return request; + } + /** + * @param {Request} request + */ + static getRequestDispatcher(request) { + return request.#dispatcher; + } + /** + * @param {Request} request + * @param {import('../../dispatcher/dispatcher')} newDispatcher + */ + static setRequestDispatcher(request, newDispatcher) { + request.#dispatcher = newDispatcher; + } + /** + * @param {Request} request + * @param {Headers} newHeaders + */ + static setRequestHeaders(request, newHeaders) { + request.#headers = newHeaders; + } + /** + * @param {Request} request + */ + static getRequestState(request) { + return request.#state; + } + /** + * @param {Request} request + * @param {any} newState + */ + static setRequestState(request, newState) { + request.#state = newState; } - ], - functionName: "findResolver", - args: [toHex(packetToBytes(name))], - blockNumber, - blockTag - }); - return resolverAddress; -} - -// node_modules/viem/_esm/clients/decorators/public.js -init_call(); - -// node_modules/viem/_esm/actions/public/createAccessList.js -init_parseAccount(); -init_toHex(); -init_getCallError(); -init_extract(); -init_transactionRequest(); -init_assertRequest(); -async function createAccessList(client, args) { - const { account: account_ = client.account, blockNumber, blockTag = "latest", blobs, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, to, value, ...rest } = args; - const account = account_ ? parseAccount(account_) : void 0; - try { - assertRequest(args); - const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; - const block = blockNumberHex || blockTag; - const chainFormat = client.chain?.formatters?.transactionRequest?.format; - const format = chainFormat || formatTransactionRequest; - const request = format({ - // Pick out extra data that might exist on the chain's transaction request type. - ...extract(rest, { format: chainFormat }), - account, - blobs, - data, - gas, - gasPrice, - maxFeePerBlobGas, - maxFeePerGas, - maxPriorityFeePerGas, - to, - value - }, "createAccessList"); - const response = await client.request({ - method: "eth_createAccessList", - params: [request, block] - }); - return { - accessList: response.accessList, - gasUsed: BigInt(response.gasUsed) }; - } catch (err) { - throw getCallError(err, { - ...args, - account, - chain: client.chain - }); - } -} - -// node_modules/viem/_esm/actions/public/createBlockFilter.js -async function createBlockFilter(client) { - const getRequest = createFilterRequestScope(client, { - method: "eth_newBlockFilter" - }); - const id = await client.request({ - method: "eth_newBlockFilter" - }); - return { id, request: getRequest(id), type: "block" }; -} - -// node_modules/viem/_esm/actions/public/createEventFilter.js -init_toHex(); -async function createEventFilter(client, { address: address2, args, event, events: events_, fromBlock, strict, toBlock } = {}) { - const events = events_ ?? (event ? [event] : void 0); - const getRequest = createFilterRequestScope(client, { - method: "eth_newFilter" - }); - let topics = []; - if (events) { - const encoded = events.flatMap((event2) => encodeEventTopics({ - abi: [event2], - eventName: event2.name, - args - })); - topics = [encoded]; - if (event) - topics = topics[0]; - } - const id = await client.request({ - method: "eth_newFilter", - params: [ - { - address: address2, - fromBlock: typeof fromBlock === "bigint" ? numberToHex(fromBlock) : fromBlock, - toBlock: typeof toBlock === "bigint" ? numberToHex(toBlock) : toBlock, - ...topics.length ? { topics } : {} + var { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request2; + Reflect.deleteProperty(Request2, "setRequestSignal"); + Reflect.deleteProperty(Request2, "getRequestDispatcher"); + Reflect.deleteProperty(Request2, "setRequestDispatcher"); + Reflect.deleteProperty(Request2, "setRequestHeaders"); + Reflect.deleteProperty(Request2, "getRequestState"); + Reflect.deleteProperty(Request2, "setRequestState"); + mixinBody(Request2, getRequestState); + function makeRequest(init) { + return { + method: init.method ?? "GET", + localURLsOnly: init.localURLsOnly ?? false, + unsafeRequest: init.unsafeRequest ?? false, + body: init.body ?? null, + client: init.client ?? null, + reservedClient: init.reservedClient ?? null, + replacesClientId: init.replacesClientId ?? "", + window: init.window ?? "client", + keepalive: init.keepalive ?? false, + serviceWorkers: init.serviceWorkers ?? "all", + initiator: init.initiator ?? "", + destination: init.destination ?? "", + priority: init.priority ?? null, + origin: init.origin ?? "client", + policyContainer: init.policyContainer ?? "client", + referrer: init.referrer ?? "client", + referrerPolicy: init.referrerPolicy ?? "", + mode: init.mode ?? "no-cors", + useCORSPreflightFlag: init.useCORSPreflightFlag ?? false, + credentials: init.credentials ?? "same-origin", + useCredentials: init.useCredentials ?? false, + cache: init.cache ?? "default", + redirect: init.redirect ?? "follow", + integrity: init.integrity ?? "", + cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? "", + parserMetadata: init.parserMetadata ?? "", + reloadNavigation: init.reloadNavigation ?? false, + historyNavigation: init.historyNavigation ?? false, + userActivation: init.userActivation ?? false, + taintedOrigin: init.taintedOrigin ?? false, + redirectCount: init.redirectCount ?? 0, + responseTainting: init.responseTainting ?? "basic", + preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false, + done: init.done ?? false, + timingAllowFailed: init.timingAllowFailed ?? false, + useURLCredentials: init.useURLCredentials ?? void 0, + traversableForUserPrompts: init.traversableForUserPrompts ?? "client", + urlList: init.urlList, + url: init.urlList[0], + headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() + }; + } + function cloneRequest(request) { + const newRequest = makeRequest({ ...request, body: null }); + if (request.body != null) { + newRequest.body = cloneBody(request.body); + } + return newRequest; + } + function fromInnerRequest(innerRequest, dispatcher, signal, guard) { + const request = new Request2(kConstruct); + setRequestState(request, innerRequest); + setRequestDispatcher(request, dispatcher); + setRequestSignal(request, signal); + const headers = new Headers2(kConstruct); + setRequestHeaders(request, headers); + setHeadersList(headers, innerRequest.headersList); + setHeadersGuard(headers, guard); + return request; + } + Object.defineProperties(Request2.prototype, { + method: kEnumerableProperty, + url: kEnumerableProperty, + headers: kEnumerableProperty, + redirect: kEnumerableProperty, + clone: kEnumerableProperty, + signal: kEnumerableProperty, + duplex: kEnumerableProperty, + destination: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + isHistoryNavigation: kEnumerableProperty, + isReloadNavigation: kEnumerableProperty, + keepalive: kEnumerableProperty, + integrity: kEnumerableProperty, + cache: kEnumerableProperty, + credentials: kEnumerableProperty, + attribute: kEnumerableProperty, + referrerPolicy: kEnumerableProperty, + referrer: kEnumerableProperty, + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Request", + configurable: true } - ] - }); - return { - abi: events, - args, - eventName: event ? event.name : void 0, - fromBlock, - id, - request: getRequest(id), - strict: Boolean(strict), - toBlock, - type: "event" - }; -} - -// node_modules/viem/_esm/actions/public/createPendingTransactionFilter.js -async function createPendingTransactionFilter(client) { - const getRequest = createFilterRequestScope(client, { - method: "eth_newPendingTransactionFilter" - }); - const id = await client.request({ - method: "eth_newPendingTransactionFilter" - }); - return { id, request: getRequest(id), type: "transaction" }; -} - -// node_modules/viem/_esm/actions/public/getBalance.js -init_abis(); -init_decodeFunctionResult(); -init_encodeFunctionData(); -init_toHex(); -init_call(); -async function getBalance(client, { address: address2, blockNumber, blockTag = client.experimental_blockTag ?? "latest" }) { - if (client.batch?.multicall && client.chain?.contracts?.multicall3) { - const multicall3Address = client.chain.contracts.multicall3.address; - const calldata = encodeFunctionData({ - abi: multicall3Abi, - functionName: "getEthBalance", - args: [address2] - }); - const { data } = await getAction(client, call, "call")({ - to: multicall3Address, - data: calldata, - blockNumber, - blockTag - }); - return decodeFunctionResult({ - abi: multicall3Abi, - functionName: "getEthBalance", - args: [address2], - data: data || "0x" - }); - } - const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; - const balance = await client.request({ - method: "eth_getBalance", - params: [address2, blockNumberHex || blockTag] - }); - return BigInt(balance); -} - -// node_modules/viem/_esm/actions/public/getBlobBaseFee.js -async function getBlobBaseFee(client) { - const baseFee = await client.request({ - method: "eth_blobBaseFee" - }); - return BigInt(baseFee); -} - -// node_modules/viem/_esm/actions/public/getBlockTransactionCount.js -init_fromHex(); -init_toHex(); -async function getBlockTransactionCount(client, { blockHash, blockNumber, blockTag = "latest" } = {}) { - const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; - let count; - if (blockHash) { - count = await client.request({ - method: "eth_getBlockTransactionCountByHash", - params: [blockHash] - }, { dedupe: true }); - } else { - count = await client.request({ - method: "eth_getBlockTransactionCountByNumber", - params: [blockNumberHex || blockTag] - }, { dedupe: Boolean(blockNumberHex) }); - } - return hexToNumber(count); -} - -// node_modules/viem/_esm/actions/public/getCode.js -init_toHex(); -async function getCode(client, { address: address2, blockNumber, blockTag = "latest" }) { - const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; - const hex = await client.request({ - method: "eth_getCode", - params: [address2, blockNumberHex || blockTag] - }, { dedupe: Boolean(blockNumberHex) }); - if (hex === "0x") - return void 0; - return hex; -} - -// node_modules/viem/_esm/actions/public/getDelegation.js -init_getAddress(); -init_size(); -init_slice(); -async function getDelegation(client, { address: address2, blockNumber, blockTag = "latest" }) { - const code = await getCode(client, { - address: address2, - ...blockNumber !== void 0 ? { blockNumber } : { blockTag } - }); - if (!code) - return void 0; - if (size(code) !== 23) - return void 0; - if (!code.startsWith("0xef0100")) - return void 0; - return getAddress(slice(code, 3, 23)); -} - -// node_modules/viem/_esm/errors/eip712.js -init_base(); -var Eip712DomainNotFoundError = class extends BaseError2 { - constructor({ address: address2 }) { - super(`No EIP-712 domain found on contract "${address2}".`, { - metaMessages: [ - "Ensure that:", - `- The contract is deployed at the address "${address2}".`, - "- `eip712Domain()` function exists on the contract.", - "- `eip712Domain()` function matches signature to ERC-5267 specification." - ], - name: "Eip712DomainNotFoundError" }); + webidl.is.Request = webidl.util.MakeTypeAssertion(Request2); + webidl.converters.RequestInfo = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); + } + if (webidl.is.Request(V)) { + return V; + } + return webidl.converters.USVString(V); + }; + webidl.converters.RequestInit = webidl.dictionaryConverter([ + { + key: "method", + converter: webidl.converters.ByteString + }, + { + key: "headers", + converter: webidl.converters.HeadersInit + }, + { + key: "body", + converter: webidl.nullableConverter( + webidl.converters.BodyInit + ) + }, + { + key: "referrer", + converter: webidl.converters.USVString + }, + { + key: "referrerPolicy", + converter: webidl.converters.DOMString, + // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy + allowedValues: referrerPolicy + }, + { + key: "mode", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#concept-request-mode + allowedValues: requestMode + }, + { + key: "credentials", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcredentials + allowedValues: requestCredentials + }, + { + key: "cache", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcache + allowedValues: requestCache + }, + { + key: "redirect", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestredirect + allowedValues: requestRedirect + }, + { + key: "integrity", + converter: webidl.converters.DOMString + }, + { + key: "keepalive", + converter: webidl.converters.boolean + }, + { + key: "signal", + converter: webidl.nullableConverter( + (signal) => webidl.converters.AbortSignal( + signal, + "RequestInit", + "signal" + ) + ) + }, + { + key: "window", + converter: webidl.converters.any + }, + { + key: "duplex", + converter: webidl.converters.DOMString, + allowedValues: requestDuplex + }, + { + key: "dispatcher", + // undici specific option + converter: webidl.converters.any + }, + { + key: "priority", + converter: webidl.converters.DOMString, + allowedValues: ["high", "low", "auto"], + defaultValue: () => "auto" + } + ]); + module.exports = { + Request: Request2, + makeRequest, + fromInnerRequest, + cloneRequest, + getRequestDispatcher, + getRequestState + }; } -}; +}); -// node_modules/viem/_esm/actions/public/getEip712Domain.js -async function getEip712Domain(client, parameters) { - const { address: address2, factory, factoryData } = parameters; - try { - const [fields, name, version4, chainId, verifyingContract, salt, extensions] = await getAction(client, readContract, "readContract")({ - abi, - address: address2, - functionName: "eip712Domain", - factory, - factoryData - }); - return { - domain: { - name, - version: version4, - chainId: Number(chainId), - verifyingContract, - salt - }, - extensions, - fields +// node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +var require_subresource_integrity = __commonJS({ + "node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { runtimeFeatures } = require_runtime_features(); + var validSRIHashAlgorithmTokenSet = /* @__PURE__ */ new Map([["sha256", 0], ["sha384", 1], ["sha512", 2]]); + var crypto4; + if (runtimeFeatures.has("crypto")) { + crypto4 = __require("crypto"); + const cryptoHashes = crypto4.getHashes(); + if (cryptoHashes.length === 0) { + validSRIHashAlgorithmTokenSet.clear(); + } + for (const algorithm of validSRIHashAlgorithmTokenSet.keys()) { + if (cryptoHashes.includes(algorithm) === false) { + validSRIHashAlgorithmTokenSet.delete(algorithm); + } + } + } else { + validSRIHashAlgorithmTokenSet.clear(); + } + var getSRIHashAlgorithmIndex = ( + /** @type {GetSRIHashAlgorithmIndex} */ + Map.prototype.get.bind( + validSRIHashAlgorithmTokenSet + ) + ); + var isValidSRIHashAlgorithm = ( + /** @type {IsValidSRIHashAlgorithm} */ + Map.prototype.has.bind(validSRIHashAlgorithmTokenSet) + ); + var bytesMatch = runtimeFeatures.has("crypto") === false || validSRIHashAlgorithmTokenSet.size === 0 ? () => true : (bytes, metadataList) => { + const parsedMetadata = parseMetadata(metadataList); + if (parsedMetadata.length === 0) { + return true; + } + const metadata = getStrongestMetadata(parsedMetadata); + for (const item of metadata) { + const algorithm = item.alg; + const expectedValue = item.val; + const actualValue = applyAlgorithmToBytes(algorithm, bytes); + if (caseSensitiveMatch(actualValue, expectedValue)) { + return true; + } + } + return false; }; - } catch (e7) { - const error = e7; - if (error.name === "ContractFunctionExecutionError" && error.cause.name === "ContractFunctionZeroDataError") { - throw new Eip712DomainNotFoundError({ address: address2 }); + function getStrongestMetadata(metadataList) { + const result = []; + let strongest = null; + for (const item of metadataList) { + assert8(isValidSRIHashAlgorithm(item.alg), "Invalid SRI hash algorithm token"); + if (result.length === 0) { + result.push(item); + strongest = item; + continue; + } + const currentAlgorithm = ( + /** @type {Metadata} */ + strongest.alg + ); + const currentAlgorithmIndex = getSRIHashAlgorithmIndex(currentAlgorithm); + const newAlgorithm = item.alg; + const newAlgorithmIndex = getSRIHashAlgorithmIndex(newAlgorithm); + if (newAlgorithmIndex < currentAlgorithmIndex) { + continue; + } else if (newAlgorithmIndex > currentAlgorithmIndex) { + strongest = item; + result[0] = item; + result.length = 1; + } else { + result.push(item); + } + } + return result; } - throw error; - } -} -var abi = [ - { - inputs: [], - name: "eip712Domain", - outputs: [ - { name: "fields", type: "bytes1" }, - { name: "name", type: "string" }, - { name: "version", type: "string" }, - { name: "chainId", type: "uint256" }, - { name: "verifyingContract", type: "address" }, - { name: "salt", type: "bytes32" }, - { name: "extensions", type: "uint256[]" } - ], - stateMutability: "view", - type: "function" + function parseMetadata(metadata) { + const result = []; + for (const item of metadata.split(" ")) { + const expressionAndOptions = item.split("?", 1); + const algorithmExpression = expressionAndOptions[0]; + let base64Value = ""; + const algorithmAndValue = [algorithmExpression.slice(0, 6), algorithmExpression.slice(7)]; + const algorithm = algorithmAndValue[0]; + if (!isValidSRIHashAlgorithm(algorithm)) { + continue; + } + if (algorithmAndValue[1]) { + base64Value = algorithmAndValue[1]; + } + const metadata2 = { + alg: algorithm, + val: base64Value + }; + result.push(metadata2); + } + return result; + } + var applyAlgorithmToBytes = (algorithm, bytes) => { + return crypto4.hash(algorithm, bytes, "base64"); + }; + function caseSensitiveMatch(actualValue, expectedValue) { + let actualValueLength = actualValue.length; + if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === "=") { + actualValueLength -= 1; + } + if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === "=") { + actualValueLength -= 1; + } + let expectedValueLength = expectedValue.length; + if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === "=") { + expectedValueLength -= 1; + } + if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === "=") { + expectedValueLength -= 1; + } + if (actualValueLength !== expectedValueLength) { + return false; + } + for (let i = 0; i < actualValueLength; ++i) { + if (actualValue[i] === expectedValue[i] || actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { + continue; + } + return false; + } + return true; + } + module.exports = { + applyAlgorithmToBytes, + bytesMatch, + caseSensitiveMatch, + isValidSRIHashAlgorithm, + getStrongestMetadata, + parseMetadata + }; } -]; - -// node_modules/viem/_esm/actions/public/getFeeHistory.js -init_toHex(); - -// node_modules/viem/_esm/utils/formatters/feeHistory.js -function formatFeeHistory(feeHistory) { - return { - baseFeePerGas: feeHistory.baseFeePerGas.map((value) => BigInt(value)), - gasUsedRatio: feeHistory.gasUsedRatio, - oldestBlock: BigInt(feeHistory.oldestBlock), - reward: feeHistory.reward?.map((reward) => reward.map((value) => BigInt(value))) - }; -} - -// node_modules/viem/_esm/actions/public/getFeeHistory.js -async function getFeeHistory(client, { blockCount, blockNumber, blockTag = "latest", rewardPercentiles }) { - const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; - const feeHistory = await client.request({ - method: "eth_feeHistory", - params: [ - numberToHex(blockCount), - blockNumberHex || blockTag, - rewardPercentiles - ] - }, { dedupe: Boolean(blockNumberHex) }); - return formatFeeHistory(feeHistory); -} - -// node_modules/viem/_esm/actions/public/getFilterLogs.js -async function getFilterLogs(_client, { filter }) { - const strict = filter.strict ?? false; - const logs = await filter.request({ - method: "eth_getFilterLogs", - params: [filter.id] - }); - const formattedLogs = logs.map((log) => formatLog(log)); - if (!filter.abi) - return formattedLogs; - return parseEventLogs({ - abi: filter.abi, - logs: formattedLogs, - strict - }); -} - -// node_modules/viem/_esm/actions/public/getProof.js -init_toHex(); - -// node_modules/viem/_esm/utils/authorization/verifyAuthorization.js -init_getAddress(); -init_isAddressEqual(); -async function verifyAuthorization({ address: address2, authorization, signature: signature2 }) { - return isAddressEqual(getAddress(address2), await recoverAuthorizationAddress({ - authorization, - signature: signature2 - })); -} - -// node_modules/viem/_esm/utils/buildRequest.js -init_base(); -init_request(); -init_rpc(); -init_toHex(); - -// node_modules/viem/_esm/utils/promise/withDedupe.js -init_lru(); -var promiseCache2 = /* @__PURE__ */ new LruMap(8192); -function withDedupe(fn, { enabled = true, id }) { - if (!enabled || !id) - return fn(); - if (promiseCache2.get(id)) - return promiseCache2.get(id); - const promise = fn().finally(() => promiseCache2.delete(id)); - promiseCache2.set(id, promise); - return promise; -} +}); -// node_modules/viem/_esm/utils/buildRequest.js -init_stringify(); -function buildRequest(request, options = {}) { - return async (args, overrideOptions = {}) => { - const { dedupe = false, methods, retryDelay = 150, retryCount = 3, uid: uid2 } = { - ...options, - ...overrideOptions +// node_modules/undici/lib/web/fetch/index.js +var require_fetch = __commonJS({ + "node_modules/undici/lib/web/fetch/index.js"(exports, module) { + "use strict"; + var { + makeNetworkError, + makeAppropriateNetworkError, + filterResponse, + makeResponse, + fromInnerResponse, + getResponseState + } = require_response(); + var { HeadersList } = require_headers(); + var { Request: Request2, cloneRequest, getRequestDispatcher, getRequestState } = require_request2(); + var zlib = __require("zlib"); + var { + makePolicyContainer, + clonePolicyContainer, + requestBadPort, + TAOCheck, + appendRequestOriginHeader, + responseLocationURL, + requestCurrentURL, + setRequestReferrerPolicyOnRedirect, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + createOpaqueTimingInfo, + appendFetchMetadata, + corsCheck, + crossOriginResourcePolicyCheck, + determineRequestsReferrer, + coarsenedSharedCurrentTime, + sameOrigin, + isCancelled, + isAborted: isAborted2, + isErrorLike, + fullyReadBody, + readableStreamClose, + urlIsLocal, + urlIsHttpHttpsScheme, + urlHasHttpsScheme, + clampAndCoarsenConnectionTimingInfo, + simpleRangeHeaderValue, + buildContentRange, + createInflate, + extractMimeType, + hasAuthenticationEntry, + includesCredentials, + isTraversableNavigable + } = require_util2(); + var assert8 = __require("assert"); + var { safelyExtractBody, extractBody } = require_body(); + var { + redirectStatusSet, + nullBodyStatus, + safeMethodsSet, + requestBodyHeader, + subresourceSet + } = require_constants4(); + var EE = __require("events"); + var { Readable, pipeline, finished: finished2, isErrored, isReadable } = __require("stream"); + var { addAbortListener, bufferToLowerCasedHeaderName } = require_util(); + var { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require_data_url(); + var { getGlobalDispatcher } = require_global2(); + var { webidl } = require_webidl(); + var { STATUS_CODES } = __require("http"); + var { bytesMatch } = require_subresource_integrity(); + var { isomorphicEncode } = require_infra(); + var GET_OR_HEAD = ["GET", "HEAD"]; + var defaultUserAgent = typeof __UNDICI_IS_NODE__ !== "undefined" || typeof esbuildDetection !== "undefined" ? "node" : "undici"; + var resolveObjectURL; + var Fetch = class extends EE { + constructor(dispatcher) { + super(); + this.dispatcher = dispatcher; + this.connection = null; + this.dump = false; + this.state = "ongoing"; + } + terminate(reason) { + if (this.state !== "ongoing") { + return; + } + this.state = "terminated"; + this.connection?.destroy(reason); + this.emit("terminated", reason); + } + // https://fetch.spec.whatwg.org/#fetch-controller-abort + abort(error) { + if (this.state !== "ongoing") { + return; + } + this.state = "aborted"; + if (!error) { + error = new DOMException("The operation was aborted.", "AbortError"); + } + this.serializedAbortReason = error; + this.connection?.destroy(error); + this.emit("terminated", error); + } }; - const { method } = args; - if (methods?.exclude?.includes(method)) - throw new MethodNotSupportedRpcError(new Error("method not supported"), { - method + function handleFetchDone(response) { + finalizeAndReportTiming(response, "fetch"); + } + function fetch2(input, init = void 0) { + webidl.argumentLengthCheck(arguments, 1, "globalThis.fetch"); + let p = Promise.withResolvers(); + let requestObject; + try { + requestObject = new Request2(input, init); + } catch (e7) { + p.reject(e7); + return p.promise; + } + const request = getRequestState(requestObject); + if (requestObject.signal.aborted) { + abortFetch(p, request, null, requestObject.signal.reason, null); + return p.promise; + } + const globalObject = request.client.globalObject; + if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { + request.serviceWorkers = "none"; + } + let responseObject = null; + let locallyAborted = false; + let controller = null; + addAbortListener( + requestObject.signal, + () => { + locallyAborted = true; + assert8(controller != null); + controller.abort(requestObject.signal.reason); + const realResponse = responseObject?.deref(); + abortFetch(p, request, realResponse, requestObject.signal.reason, controller.controller); + } + ); + const processResponse = (response) => { + if (locallyAborted) { + return; + } + if (response.aborted) { + abortFetch(p, request, responseObject, controller.serializedAbortReason, controller.controller); + return; + } + if (response.type === "error") { + p.reject(new TypeError("fetch failed", { cause: response.error })); + return; + } + responseObject = new WeakRef(fromInnerResponse(response, "immutable")); + p.resolve(responseObject.deref()); + p = null; + }; + controller = fetching({ + request, + processResponseEndOfBody: handleFetchDone, + processResponse, + dispatcher: getRequestDispatcher(requestObject), + // undici + // Keep requestObject alive to prevent its AbortController from being GC'd + // See https://github.com/nodejs/undici/issues/4627 + requestObject }); - if (methods?.include && !methods.include.includes(method)) - throw new MethodNotSupportedRpcError(new Error("method not supported"), { - method + return p.promise; + } + function finalizeAndReportTiming(response, initiatorType = "other") { + if (response.type === "error" && response.aborted) { + return; + } + if (!response.urlList?.length) { + return; + } + const originalURL = response.urlList[0]; + let timingInfo = response.timingInfo; + let cacheState = response.cacheState; + if (!urlIsHttpHttpsScheme(originalURL)) { + return; + } + if (timingInfo === null) { + return; + } + if (!response.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo({ + startTime: timingInfo.startTime + }); + cacheState = ""; + } + timingInfo.endTime = coarsenedSharedCurrentTime(); + response.timingInfo = timingInfo; + markResourceTiming( + timingInfo, + originalURL.href, + initiatorType, + globalThis, + cacheState, + "", + // bodyType + response.status + ); + } + var markResourceTiming = performance.markResourceTiming; + function abortFetch(p, request, responseObject, error, controller) { + if (p) { + p.reject(error); + } + if (request.body?.stream != null && isReadable(request.body.stream)) { + request.body.stream.cancel(error).catch((err) => { + if (err.code === "ERR_INVALID_STATE") { + return; + } + throw err; + }); + } + if (responseObject == null) { + return; + } + const response = getResponseState(responseObject); + if (response.body?.stream != null && isReadable(response.body.stream)) { + controller.error(error); + } + } + function fetching({ + request, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseEndOfBody, + processResponseConsumeBody, + useParallelQueue = false, + dispatcher = getGlobalDispatcher(), + // undici + requestObject = null + // Keep alive to prevent AbortController GC, see #4627 + }) { + assert8(dispatcher); + let taskDestination = null; + let crossOriginIsolatedCapability = false; + if (request.client != null) { + taskDestination = request.client.globalObject; + crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; + } + const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const timingInfo = createOpaqueTimingInfo({ + startTime: currentTime }); - const requestId = dedupe ? stringToHex(`${uid2}.${stringify(args)}`) : void 0; - return withDedupe(() => withRetry(async () => { + const fetchParams = { + controller: new Fetch(dispatcher), + request, + timingInfo, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseConsumeBody, + processResponseEndOfBody, + taskDestination, + crossOriginIsolatedCapability, + // Keep requestObject alive to prevent its AbortController from being GC'd + requestObject + }; + assert8(!request.body || request.body.stream); + if (request.window === "client") { + request.window = request.client?.globalObject?.constructor?.name === "Window" ? request.client : "no-window"; + } + if (request.origin === "client") { + request.origin = request.client.origin; + } + if (request.policyContainer === "client") { + if (request.client != null) { + request.policyContainer = clonePolicyContainer( + request.client.policyContainer + ); + } else { + request.policyContainer = makePolicyContainer(); + } + } + if (!request.headersList.contains("accept", true)) { + const value = "*/*"; + request.headersList.append("accept", value, true); + } + if (!request.headersList.contains("accept-language", true)) { + request.headersList.append("accept-language", "*", true); + } + if (request.priority === null) { + } + if (subresourceSet.has(request.destination)) { + } + mainFetch(fetchParams, false); + return fetchParams.controller; + } + async function mainFetch(fetchParams, recursive) { try { - return await request(args); - } catch (err_) { - const err = err_; - switch (err.code) { - // -32700 - case ParseRpcError.code: - throw new ParseRpcError(err); - // -32600 - case InvalidRequestRpcError.code: - throw new InvalidRequestRpcError(err); - // -32601 - case MethodNotFoundRpcError.code: - throw new MethodNotFoundRpcError(err, { method: args.method }); - // -32602 - case InvalidParamsRpcError.code: - throw new InvalidParamsRpcError(err); - // -32603 - case InternalRpcError.code: - throw new InternalRpcError(err); - // -32000 - case InvalidInputRpcError.code: - throw new InvalidInputRpcError(err); - // -32001 - case ResourceNotFoundRpcError.code: - throw new ResourceNotFoundRpcError(err); - // -32002 - case ResourceUnavailableRpcError.code: - throw new ResourceUnavailableRpcError(err); - // -32003 - case TransactionRejectedRpcError.code: - throw new TransactionRejectedRpcError(err); - // -32004 - case MethodNotSupportedRpcError.code: - throw new MethodNotSupportedRpcError(err, { - method: args.method - }); - // -32005 - case LimitExceededRpcError.code: - throw new LimitExceededRpcError(err); - // -32006 - case JsonRpcVersionUnsupportedError.code: - throw new JsonRpcVersionUnsupportedError(err); - // 4001 - case UserRejectedRequestError.code: - throw new UserRejectedRequestError(err); - // 4100 - case UnauthorizedProviderError.code: - throw new UnauthorizedProviderError(err); - // 4200 - case UnsupportedProviderMethodError.code: - throw new UnsupportedProviderMethodError(err); - // 4900 - case ProviderDisconnectedError.code: - throw new ProviderDisconnectedError(err); - // 4901 - case ChainDisconnectedError.code: - throw new ChainDisconnectedError(err); - // 4902 - case SwitchChainError.code: - throw new SwitchChainError(err); - // 5700 - case UnsupportedNonOptionalCapabilityError.code: - throw new UnsupportedNonOptionalCapabilityError(err); - // 5710 - case UnsupportedChainIdError.code: - throw new UnsupportedChainIdError(err); - // 5720 - case DuplicateIdError.code: - throw new DuplicateIdError(err); - // 5730 - case UnknownBundleIdError.code: - throw new UnknownBundleIdError(err); - // 5740 - case BundleTooLargeError.code: - throw new BundleTooLargeError(err); - // 5750 - case AtomicReadyWalletRejectedUpgradeError.code: - throw new AtomicReadyWalletRejectedUpgradeError(err); - // 5760 - case AtomicityNotSupportedError.code: - throw new AtomicityNotSupportedError(err); - // CAIP-25: User Rejected Error - // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes#rejected-caip-25 - case 5e3: - throw new UserRejectedRequestError(err); - // WalletConnect: Session Settlement Failed - // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes - case WalletConnectSessionSettlementError.code: - throw new WalletConnectSessionSettlementError(err); - default: - if (err_ instanceof BaseError2) - throw err_; - throw new UnknownRpcError(err); + const request = fetchParams.request; + let response = null; + if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { + response = makeNetworkError("local URLs only"); + } + tryUpgradeRequestToAPotentiallyTrustworthyURL(request); + if (requestBadPort(request) === "blocked") { + response = makeNetworkError("bad port"); + } + if (request.referrerPolicy === "") { + request.referrerPolicy = request.policyContainer.referrerPolicy; + } + if (request.referrer !== "no-referrer") { + request.referrer = determineRequestsReferrer(request); + } + if (response === null) { + const currentURL = requestCurrentURL(request); + if ( + // - request’s current URL’s origin is same origin with request’s origin, + // and request’s response tainting is "basic" + sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || // request’s current URL’s scheme is "data" + currentURL.protocol === "data:" || // - request’s mode is "navigate" or "websocket" + (request.mode === "navigate" || request.mode === "websocket") + ) { + request.responseTainting = "basic"; + response = await schemeFetch(fetchParams); + } else if (request.mode === "same-origin") { + response = makeNetworkError('request mode cannot be "same-origin"'); + } else if (request.mode === "no-cors") { + if (request.redirect !== "follow") { + response = makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ); + } else { + request.responseTainting = "opaque"; + response = await schemeFetch(fetchParams); + } + } else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + response = makeNetworkError("URL scheme must be a HTTP(S) scheme"); + } else { + request.responseTainting = "cors"; + response = await httpFetch(fetchParams); + } + } + if (recursive) { + return response; + } + if (response.status !== 0 && !response.internalResponse) { + if (request.responseTainting === "cors") { + } + if (request.responseTainting === "basic") { + response = filterResponse(response, "basic"); + } else if (request.responseTainting === "cors") { + response = filterResponse(response, "cors"); + } else if (request.responseTainting === "opaque") { + response = filterResponse(response, "opaque"); + } else { + assert8(false); + } + } + let internalResponse = response.status === 0 ? response : response.internalResponse; + if (internalResponse.urlList.length === 0) { + internalResponse.urlList.push(...request.urlList); + } + if (!request.timingAllowFailed) { + response.timingAllowPassed = true; + } + if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range", true)) { + response = internalResponse = makeNetworkError(); + } + if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { + internalResponse.body = null; + fetchParams.controller.dump = true; + } + if (request.integrity) { + const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); + if (request.responseTainting === "opaque" || response.body == null) { + processBodyError(response.error); + return; + } + const processBody = (bytes) => { + if (!bytesMatch(bytes, request.integrity)) { + processBodyError("integrity mismatch"); + return; + } + response.body = safelyExtractBody(bytes)[0]; + fetchFinale(fetchParams, response); + }; + fullyReadBody(response.body, processBody, processBodyError); + } else { + fetchFinale(fetchParams, response); } + } catch (err) { + fetchParams.controller.terminate(err); } - }, { - delay: ({ count, error }) => { - if (error && error instanceof HttpRequestError) { - const retryAfter = error?.headers?.get("Retry-After"); - if (retryAfter?.match(/\d/)) - return Number.parseInt(retryAfter, 10) * 1e3; + } + function schemeFetch(fetchParams) { + if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { + return Promise.resolve(makeAppropriateNetworkError(fetchParams)); + } + const { request } = fetchParams; + const { protocol: scheme } = requestCurrentURL(request); + switch (scheme) { + case "about:": { + return Promise.resolve(makeNetworkError("about scheme is not supported")); + } + case "blob:": { + if (!resolveObjectURL) { + resolveObjectURL = __require("buffer").resolveObjectURL; + } + const blobURLEntry = requestCurrentURL(request); + if (blobURLEntry.search.length !== 0) { + return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); + } + const blob = resolveObjectURL(blobURLEntry.toString()); + if (request.method !== "GET" || !webidl.is.Blob(blob)) { + return Promise.resolve(makeNetworkError("invalid method")); + } + const response = makeResponse(); + const fullLength = blob.size; + const serializedFullLength = isomorphicEncode(`${fullLength}`); + const type = blob.type; + if (!request.headersList.contains("range", true)) { + const bodyWithType = extractBody(blob); + response.statusText = "OK"; + response.body = bodyWithType[0]; + response.headersList.set("content-length", serializedFullLength, true); + response.headersList.set("content-type", type, true); + } else { + response.rangeRequested = true; + const rangeHeader = request.headersList.get("range", true); + const rangeValue = simpleRangeHeaderValue(rangeHeader, true); + if (rangeValue === "failure") { + return Promise.resolve(makeNetworkError("failed to fetch the data URL")); + } + let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue; + if (rangeStart === null) { + rangeStart = fullLength - rangeEnd; + rangeEnd = rangeStart + rangeEnd - 1; + } else { + if (rangeStart >= fullLength) { + return Promise.resolve(makeNetworkError("Range start is greater than the blob's size.")); + } + if (rangeEnd === null || rangeEnd >= fullLength) { + rangeEnd = fullLength - 1; + } + } + const slicedBlob = blob.slice(rangeStart, rangeEnd + 1, type); + const slicedBodyWithType = extractBody(slicedBlob); + response.body = slicedBodyWithType[0]; + const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`); + const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength); + response.status = 206; + response.statusText = "Partial Content"; + response.headersList.set("content-length", serializedSlicedLength, true); + response.headersList.set("content-type", type, true); + response.headersList.set("content-range", contentRange, true); + } + return Promise.resolve(response); + } + case "data:": { + const currentURL = requestCurrentURL(request); + const dataURLStruct = dataURLProcessor(currentURL); + if (dataURLStruct === "failure") { + return Promise.resolve(makeNetworkError("failed to fetch the data URL")); + } + const mimeType = serializeAMimeType(dataURLStruct.mimeType); + return Promise.resolve(makeResponse({ + statusText: "OK", + headersList: [ + ["content-type", { name: "Content-Type", value: mimeType }] + ], + body: safelyExtractBody(dataURLStruct.body)[0] + })); + } + case "file:": { + return Promise.resolve(makeNetworkError("not implemented... yet...")); + } + case "http:": + case "https:": { + return httpFetch(fetchParams).catch((err) => makeNetworkError(err)); + } + default: { + return Promise.resolve(makeNetworkError("unknown scheme")); + } + } + } + function finalizeResponse(fetchParams, response) { + fetchParams.request.done = true; + if (fetchParams.processResponseDone != null) { + queueMicrotask(() => fetchParams.processResponseDone(response)); + } + } + function fetchFinale(fetchParams, response) { + let timingInfo = fetchParams.timingInfo; + const processResponseEndOfBody = () => { + const unsafeEndTime = Date.now(); + if (fetchParams.request.destination === "document") { + fetchParams.controller.fullTimingInfo = timingInfo; + } + fetchParams.controller.reportTimingSteps = () => { + if (!urlIsHttpHttpsScheme(fetchParams.request.url)) { + return; + } + timingInfo.endTime = unsafeEndTime; + let cacheState = response.cacheState; + const bodyInfo = response.bodyInfo; + if (!response.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo(timingInfo); + cacheState = ""; + } + let responseStatus = 0; + if (fetchParams.request.mode !== "navigator" || !response.hasCrossOriginRedirects) { + responseStatus = response.status; + const mimeType = extractMimeType(response.headersList); + if (mimeType !== "failure") { + bodyInfo.contentType = minimizeSupportedMimeType(mimeType); + } + } + if (fetchParams.request.initiatorType != null) { + markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus); + } + }; + const processResponseEndOfBodyTask = () => { + fetchParams.request.done = true; + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); + } + if (fetchParams.request.initiatorType != null) { + fetchParams.controller.reportTimingSteps(); + } + }; + queueMicrotask(() => processResponseEndOfBodyTask()); + }; + if (fetchParams.processResponse != null) { + queueMicrotask(() => { + fetchParams.processResponse(response); + fetchParams.processResponse = null; + }); + } + const internalResponse = response.type === "error" ? response : response.internalResponse ?? response; + if (internalResponse.body == null) { + processResponseEndOfBody(); + } else { + finished2(internalResponse.body.stream, () => { + processResponseEndOfBody(); + }); + } + } + async function httpFetch(fetchParams) { + const request = fetchParams.request; + let response = null; + let actualResponse = null; + const timingInfo = fetchParams.timingInfo; + if (request.serviceWorkers === "all") { + } + if (response === null) { + if (request.redirect === "follow") { + request.serviceWorkers = "none"; + } + actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); + if (request.responseTainting === "cors" && corsCheck(request, response) === "failure") { + return makeNetworkError("cors failure"); + } + if (TAOCheck(request, response) === "failure") { + request.timingAllowFailed = true; + } + } + if ((request.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck( + request.origin, + request.client, + request.destination, + actualResponse + ) === "blocked") { + return makeNetworkError("blocked"); + } + if (redirectStatusSet.has(actualResponse.status)) { + if (request.redirect !== "manual") { + fetchParams.controller.connection.destroy(void 0, false); + } + if (request.redirect === "error") { + response = makeNetworkError("unexpected redirect"); + } else if (request.redirect === "manual") { + response = actualResponse; + } else if (request.redirect === "follow") { + response = await httpRedirectFetch(fetchParams, response); + } else { + assert8(false); } - return ~~(1 << count) * retryDelay; - }, - retryCount, - shouldRetry: ({ error }) => shouldRetry(error) - }), { enabled: dedupe, id: requestId }); - }; -} -function shouldRetry(error) { - if ("code" in error && typeof error.code === "number") { - if (error.code === -1) - return true; - if (error.code === LimitExceededRpcError.code) - return true; - if (error.code === InternalRpcError.code) - return true; - return false; - } - if (error instanceof HttpRequestError && error.status) { - if (error.status === 403) - return true; - if (error.status === 408) - return true; - if (error.status === 413) - return true; - if (error.status === 429) - return true; - if (error.status === 500) - return true; - if (error.status === 502) - return true; - if (error.status === 503) - return true; - if (error.status === 504) - return true; - return false; - } - return true; -} - -// node_modules/viem/_esm/utils/chain/defineChain.js -function defineChain(chain3) { - const chainInstance = { - formatters: void 0, - fees: void 0, - serializers: void 0, - ...chain3 - }; - function extend(base2) { - return (fnOrExtended) => { - const properties = typeof fnOrExtended === "function" ? fnOrExtended(base2) : fnOrExtended; - const combined = { ...base2, ...properties }; - return Object.assign(combined, { extend: extend(combined) }); - }; - } - return Object.assign(chainInstance, { - extend: extend(chainInstance) - }); -} - -// node_modules/viem/_esm/utils/index.js -init_fromHex(); - -// node_modules/viem/_esm/utils/rpc/http.js -init_request(); - -// node_modules/viem/_esm/utils/promise/withTimeout.js -function withTimeout(fn, { errorInstance = new Error("timed out"), timeout, signal }) { - return new Promise((resolve, reject) => { - ; - (async () => { - let timeoutId; + } + response.timingInfo = timingInfo; + return response; + } + function httpRedirectFetch(fetchParams, response) { + const request = fetchParams.request; + const actualResponse = response.internalResponse ? response.internalResponse : response; + let locationURL; try { - const controller = new AbortController(); - if (timeout > 0) { - timeoutId = setTimeout(() => { - if (signal) { - controller.abort(); - } else { - reject(errorInstance); - } - }, timeout); + locationURL = responseLocationURL( + actualResponse, + requestCurrentURL(request).hash + ); + if (locationURL == null) { + return response; } - resolve(await fn({ signal: controller?.signal || null })); } catch (err) { - if (err?.name === "AbortError") - reject(errorInstance); - reject(err); - } finally { - clearTimeout(timeoutId); + return Promise.resolve(makeNetworkError(err)); } - })(); - }); -} - -// node_modules/viem/_esm/utils/rpc/http.js -init_stringify(); - -// node_modules/viem/_esm/utils/rpc/id.js -function createIdStore() { - return { - current: 0, - take() { - return this.current++; - }, - reset() { - this.current = 0; + if (!urlIsHttpHttpsScheme(locationURL)) { + return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme")); + } + if (request.redirectCount === 20) { + return Promise.resolve(makeNetworkError("redirect count exceeded")); + } + request.redirectCount += 1; + if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { + return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')); + } + if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { + return Promise.resolve(makeNetworkError( + 'URL cannot contain credentials for request mode "cors"' + )); + } + if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { + return Promise.resolve(makeNetworkError()); + } + if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request.method)) { + request.method = "GET"; + request.body = null; + for (const headerName of requestBodyHeader) { + request.headersList.delete(headerName); + } + } + if (!sameOrigin(requestCurrentURL(request), locationURL)) { + request.headersList.delete("authorization", true); + request.headersList.delete("proxy-authorization", true); + request.headersList.delete("cookie", true); + request.headersList.delete("host", true); + } + if (request.body != null) { + assert8(request.body.source != null); + request.body = safelyExtractBody(request.body.source)[0]; + } + const timingInfo = fetchParams.timingInfo; + timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + if (timingInfo.redirectStartTime === 0) { + timingInfo.redirectStartTime = timingInfo.startTime; + } + request.urlList.push(locationURL); + setRequestReferrerPolicyOnRedirect(request, actualResponse); + return mainFetch(fetchParams, true); } - }; -} -var idCache = /* @__PURE__ */ createIdStore(); - -// node_modules/viem/_esm/utils/rpc/http.js -function getHttpRpcClient(url_, options = {}) { - const { url, headers: headers_url } = parseUrl(url_); - return { - async request(params) { - const { body, fetchFn = options.fetchFn ?? fetch, onRequest = options.onRequest, onResponse = options.onResponse, timeout = options.timeout ?? 1e4 } = params; - const fetchOptions = { - ...options.fetchOptions ?? {}, - ...params.fetchOptions ?? {} + async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { + const request = fetchParams.request; + let httpFetchParams = null; + let httpRequest = null; + let response = null; + const httpCache = null; + const revalidatingFlag = false; + if (request.window === "no-window" && request.redirect === "error") { + httpFetchParams = fetchParams; + httpRequest = request; + } else { + httpRequest = cloneRequest(request); + httpFetchParams = { ...fetchParams }; + httpFetchParams.request = httpRequest; + } + const includeCredentials = request.credentials === "include" || request.credentials === "same-origin" && request.responseTainting === "basic"; + const contentLength = httpRequest.body ? httpRequest.body.length : null; + let contentLengthHeaderValue = null; + if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { + contentLengthHeaderValue = "0"; + } + if (contentLength != null) { + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); + } + if (contentLengthHeaderValue != null) { + httpRequest.headersList.append("content-length", contentLengthHeaderValue, true); + } + if (contentLength != null && httpRequest.keepalive) { + } + if (webidl.is.URL(httpRequest.referrer)) { + httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href), true); + } + appendRequestOriginHeader(httpRequest); + appendFetchMetadata(httpRequest); + if (!httpRequest.headersList.contains("user-agent", true)) { + httpRequest.headersList.append("user-agent", defaultUserAgent, true); + } + if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since", true) || httpRequest.headersList.contains("if-none-match", true) || httpRequest.headersList.contains("if-unmodified-since", true) || httpRequest.headersList.contains("if-match", true) || httpRequest.headersList.contains("if-range", true))) { + httpRequest.cache = "no-store"; + } + if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control", true)) { + httpRequest.headersList.append("cache-control", "max-age=0", true); + } + if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { + if (!httpRequest.headersList.contains("pragma", true)) { + httpRequest.headersList.append("pragma", "no-cache", true); + } + if (!httpRequest.headersList.contains("cache-control", true)) { + httpRequest.headersList.append("cache-control", "no-cache", true); + } + } + if (httpRequest.headersList.contains("range", true)) { + httpRequest.headersList.append("accept-encoding", "identity", true); + } + if (!httpRequest.headersList.contains("accept-encoding", true)) { + if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { + httpRequest.headersList.append("accept-encoding", "br, gzip, deflate", true); + } else { + httpRequest.headersList.append("accept-encoding", "gzip, deflate", true); + } + } + httpRequest.headersList.delete("host", true); + if (includeCredentials) { + if (!httpRequest.headersList.contains("authorization", true)) { + let authorizationValue = null; + if (hasAuthenticationEntry(httpRequest) && (httpRequest.useURLCredentials === void 0 || !includesCredentials(requestCurrentURL(httpRequest)))) { + } else if (includesCredentials(requestCurrentURL(httpRequest)) && isAuthenticationFetch) { + const { username, password } = requestCurrentURL(httpRequest); + authorizationValue = `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`; + } + if (authorizationValue !== null) { + httpRequest.headersList.append("Authorization", authorizationValue, false); + } + } + } + if (httpCache == null) { + httpRequest.cache = "no-store"; + } + if (httpRequest.cache !== "no-store" && httpRequest.cache !== "reload") { + } + if (response == null) { + if (httpRequest.cache === "only-if-cached") { + return makeNetworkError("only if cached"); + } + const forwardResponse = await httpNetworkFetch( + httpFetchParams, + includeCredentials, + isNewConnectionFetch + ); + if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { + } + if (revalidatingFlag && forwardResponse.status === 304) { + } + if (response == null) { + response = forwardResponse; + } + } + response.urlList = [...httpRequest.urlList]; + if (httpRequest.headersList.contains("range", true)) { + response.rangeRequested = true; + } + response.requestIncludesCredentials = includeCredentials; + if (response.status === 401 && httpRequest.responseTainting !== "cors" && includeCredentials && (request.useURLCredentials !== void 0 || isTraversableNavigable(request.traversableForUserPrompts))) { + if (request.body != null) { + if (request.body.source == null) { + return response; + } + request.body = safelyExtractBody(request.body.source)[0]; + } + if (request.useURLCredentials === void 0 || isAuthenticationFetch) { + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + return response; + } + fetchParams.controller.connection.destroy(); + response = await httpNetworkOrCacheFetch(fetchParams, true); + } + if (response.status === 407) { + if (request.window === "no-window") { + return makeNetworkError(); + } + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + return makeNetworkError("proxy authentication required"); + } + if ( + // response’s status is 421 + response.status === 421 && // isNewConnectionFetch is false + !isNewConnectionFetch && // request’s body is null, or request’s body is non-null and request’s body’s source is non-null + (request.body == null || request.body.source != null) + ) { + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + fetchParams.controller.connection.destroy(); + response = await httpNetworkOrCacheFetch( + fetchParams, + isAuthenticationFetch, + true + ); + } + if (isAuthenticationFetch) { + } + return response; + } + async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { + assert8(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); + fetchParams.controller.connection = { + abort: null, + destroyed: false, + destroy(err, abort = true) { + if (!this.destroyed) { + this.destroyed = true; + if (abort) { + this.abort?.(err ?? new DOMException("The operation was aborted.", "AbortError")); + } + } + } }; - const { headers, method, signal: signal_ } = fetchOptions; + const request = fetchParams.request; + let response = null; + const timingInfo = fetchParams.timingInfo; + const httpCache = null; + if (httpCache == null) { + request.cache = "no-store"; + } + const newConnection = forceNewConnection ? "yes" : "no"; + if (request.mode === "websocket") { + } else { + } + let requestBody = null; + if (request.body == null && fetchParams.processRequestEndOfBody) { + queueMicrotask(() => fetchParams.processRequestEndOfBody()); + } else if (request.body != null) { + const processBodyChunk = async function* (bytes) { + if (isCancelled(fetchParams)) { + return; + } + yield bytes; + fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); + }; + const processEndOfBody = () => { + if (isCancelled(fetchParams)) { + return; + } + if (fetchParams.processRequestEndOfBody) { + fetchParams.processRequestEndOfBody(); + } + }; + const processBodyError = (e7) => { + if (isCancelled(fetchParams)) { + return; + } + if (e7.name === "AbortError") { + fetchParams.controller.abort(); + } else { + fetchParams.controller.terminate(e7); + } + }; + requestBody = (async function* () { + try { + for await (const bytes of request.body.stream) { + yield* processBodyChunk(bytes); + } + processEndOfBody(); + } catch (err) { + processBodyError(err); + } + })(); + } try { - const response = await withTimeout(async ({ signal }) => { - const init = { - ...fetchOptions, - body: Array.isArray(body) ? stringify(body.map((body2) => ({ - jsonrpc: "2.0", - id: body2.id ?? idCache.take(), - ...body2 - }))) : stringify({ - jsonrpc: "2.0", - id: body.id ?? idCache.take(), - ...body - }), - headers: { - ...headers_url, - "Content-Type": "application/json", - ...headers - }, - method: method || "POST", - signal: signal_ || (timeout > 0 ? signal : null) - }; - const request = new Request(url, init); - const args = await onRequest?.(request, init) ?? { ...init, url }; - const response2 = await fetchFn(args.url ?? url, args); - return response2; - }, { - errorInstance: new TimeoutError({ body, url }), - timeout, - signal: true - }); - if (onResponse) - await onResponse(response); - let data; - if (response.headers.get("Content-Type")?.startsWith("application/json")) - data = await response.json(); - else { - data = await response.text(); + const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }); + if (socket) { + response = makeResponse({ status, statusText, headersList, socket }); + } else { + const iterator = body[Symbol.asyncIterator](); + fetchParams.controller.next = () => iterator.next(); + response = makeResponse({ status, statusText, headersList }); + } + } catch (err) { + if (err.name === "AbortError") { + fetchParams.controller.connection.destroy(); + return makeAppropriateNetworkError(fetchParams, err); + } + return makeNetworkError(err); + } + const pullAlgorithm = () => { + return fetchParams.controller.resume(); + }; + const cancelAlgorithm = (reason) => { + if (!isCancelled(fetchParams)) { + fetchParams.controller.abort(reason); + } + }; + const stream = new ReadableStream( + { + start(controller) { + fetchParams.controller.controller = controller; + }, + pull: pullAlgorithm, + cancel: cancelAlgorithm, + type: "bytes" + } + ); + response.body = { stream, source: null, length: null }; + if (!fetchParams.controller.resume) { + fetchParams.controller.on("terminated", onAborted); + } + fetchParams.controller.resume = async () => { + while (true) { + let bytes; + let isFailure; try { - data = JSON.parse(data || "{}"); + const { done, value } = await fetchParams.controller.next(); + if (isAborted2(fetchParams)) { + break; + } + bytes = done ? void 0 : value; } catch (err) { - if (response.ok) - throw err; - data = { error: data }; + if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { + bytes = void 0; + } else { + bytes = err; + isFailure = true; + } + } + if (bytes === void 0) { + readableStreamClose(fetchParams.controller.controller); + finalizeResponse(fetchParams, response); + return; + } + timingInfo.decodedBodySize += bytes?.byteLength ?? 0; + if (isFailure) { + fetchParams.controller.terminate(bytes); + return; + } + const buffer2 = new Uint8Array(bytes); + if (buffer2.byteLength) { + fetchParams.controller.controller.enqueue(buffer2); + } + if (isErrored(stream)) { + fetchParams.controller.terminate(); + return; + } + if (fetchParams.controller.controller.desiredSize <= 0) { + return; + } + } + }; + function onAborted(reason) { + if (isAborted2(fetchParams)) { + response.aborted = true; + if (isReadable(stream)) { + fetchParams.controller.controller.error( + fetchParams.controller.serializedAbortReason + ); + } + } else { + if (isReadable(stream)) { + fetchParams.controller.controller.error(new TypeError("terminated", { + cause: isErrorLike(reason) ? reason : void 0 + })); } } - if (!response.ok) { - if (typeof data.error?.code === "number" && typeof data.error?.message === "string") - return data; - throw new HttpRequestError({ - body, - details: stringify(data.error) || response.statusText, - headers: response.headers, - status: response.status, - url - }); - } - return data; - } catch (err) { - if (err instanceof HttpRequestError) - throw err; - if (err instanceof TimeoutError) - throw err; - throw new HttpRequestError({ - body, - cause: err, - url - }); - } - } - }; -} -function parseUrl(url_) { - try { - const url = new URL(url_); - const result = (() => { - if (url.username) { - const credentials = `${decodeURIComponent(url.username)}:${decodeURIComponent(url.password)}`; - url.username = ""; - url.password = ""; - return { - url: url.toString(), - headers: { Authorization: `Basic ${btoa(credentials)}` } - }; + fetchParams.controller.connection.destroy(); + } + return response; + function dispatch({ body }) { + const url = requestCurrentURL(request); + const agent = fetchParams.controller.dispatcher; + const path = url.pathname + url.search; + const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === "?"; + return dispatchWithProtocolPreference(body); + function dispatchWithProtocolPreference(body2, allowH2) { + return new Promise((resolve, reject) => agent.dispatch( + { + path: hasTrailingQuestionMark ? `${path}?` : path, + origin: url.origin, + method: request.method, + body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body2, + headers: request.headersList.entries, + maxRedirections: 0, + upgrade: request.mode === "websocket" ? "websocket" : void 0, + ...allowH2 === false ? { allowH2 } : null + }, + { + body: null, + abort: null, + onRequestStart(controller) { + const { connection } = fetchParams.controller; + timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(void 0, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability); + const abort = (reason) => controller.abort(reason); + if (connection.destroyed) { + abort(new DOMException("The operation was aborted.", "AbortError")); + } else { + fetchParams.controller.on("terminated", abort); + this.abort = connection.abort = abort; + } + timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + }, + onResponseStarted() { + timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + }, + onResponseStart(controller, status, _headers, statusText) { + if (status < 200) { + return; + } + const rawHeaders = controller?.rawHeaders ?? []; + const headersList = new HeadersList(); + for (let i = 0; i < rawHeaders.length; i += 2) { + const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]); + const value = rawHeaders[i + 1]; + if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) { + for (const val of value) { + headersList.append(nameStr, val.toString("latin1"), true); + } + } else { + headersList.append(nameStr, value.toString("latin1"), true); + } + } + const location = headersList.get("location", true); + this.body = new Readable({ read: () => controller.resume() }); + const willFollow = location && request.redirect === "follow" && redirectStatusSet.has(status); + const decoders = []; + if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { + const contentEncoding = headersList.get("content-encoding", true); + const codings = contentEncoding ? contentEncoding.toLowerCase().split(",") : []; + const maxContentEncodings = 5; + if (codings.length > maxContentEncodings) { + reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)); + return; + } + for (let i = codings.length - 1; i >= 0; --i) { + const coding = codings[i].trim(); + if (coding === "x-gzip" || coding === "gzip") { + decoders.push(zlib.createGunzip({ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); + } else if (coding === "deflate") { + decoders.push(createInflate({ + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); + } else if (coding === "br") { + decoders.push(zlib.createBrotliDecompress({ + flush: zlib.constants.BROTLI_OPERATION_FLUSH, + finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH + })); + } else if (coding === "zstd") { + decoders.push(zlib.createZstdDecompress({ + flush: zlib.constants.ZSTD_e_continue, + finishFlush: zlib.constants.ZSTD_e_end + })); + } else { + decoders.length = 0; + break; + } + } + } + const onError = (err) => this.onResponseError(controller, err); + resolve({ + status, + statusText, + headersList, + body: decoders.length ? pipeline(this.body, ...decoders, (err) => { + if (err) { + this.onResponseError(controller, err); + } + }).on("error", onError) : this.body.on("error", onError) + }); + }, + onResponseData(controller, chunk) { + if (fetchParams.controller.dump) { + return; + } + const bytes = chunk; + timingInfo.encodedBodySize += bytes.byteLength; + if (this.body.push(bytes) === false) { + controller.pause(); + } + }, + onResponseEnd() { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + fetchParams.controller.ended = true; + this.body?.push(null); + }, + onResponseError(_controller, error) { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + if (request.mode === "websocket" && allowH2 !== false && error?.code === "UND_ERR_INFO" && error?.message === "HTTP/2: Extended CONNECT protocol not supported by server") { + resolve(dispatchWithProtocolPreference(body2, false)); + return; + } + this.body?.destroy(error); + fetchParams.controller.terminate(error); + reject(error); + }, + onRequestUpgrade(controller, status, _headers, socket) { + if (socket.session != null && status !== 200 || socket.session == null && status !== 101) { + return false; + } + const rawHeaders = controller?.rawHeaders ?? []; + const headersList = new HeadersList(); + for (let i = 0; i < rawHeaders.length; i += 2) { + const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]); + const value = rawHeaders[i + 1]; + if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) { + for (const val of value) { + headersList.append(nameStr, val.toString("latin1"), true); + } + } else { + headersList.append(nameStr, value.toString("latin1"), true); + } + } + resolve({ + status, + statusText: STATUS_CODES[status], + headersList, + socket + }); + return true; + } + } + )); + } } - return; - })(); - return { url: url.toString(), ...result }; - } catch { - return { url: url_ }; - } -} - -// node_modules/ox/_esm/erc8010/SignatureErc8010.js -var SignatureErc8010_exports = {}; -__export(SignatureErc8010_exports, { - InvalidWrappedSignatureError: () => InvalidWrappedSignatureError, - assert: () => assert6, - from: () => from9, - magicBytes: () => magicBytes, - suffixParameters: () => suffixParameters, - unwrap: () => unwrap, - validate: () => validate4, - wrap: () => wrap -}); - -// node_modules/ox/_esm/core/AbiParameters.js -init_exports(); - -// node_modules/ox/_esm/core/Address.js -init_Bytes(); - -// node_modules/ox/_esm/core/internal/lru.js -var LruMap2 = class extends Map { - constructor(size5) { - super(); - Object.defineProperty(this, "maxSize", { - enumerable: true, - configurable: true, - writable: true, - value: void 0 - }); - this.maxSize = size5; - } - get(key) { - const value = super.get(key); - if (super.has(key) && value !== void 0) { - this.delete(key); - super.set(key, value); - } - return value; - } - set(key, value) { - super.set(key, value); - if (this.maxSize && this.size > this.maxSize) { - const firstKey = this.keys().next().value; - if (firstKey) - this.delete(firstKey); - } - return this; - } -}; - -// node_modules/ox/_esm/core/Caches.js -var caches = { - checksum: /* @__PURE__ */ new LruMap2(8192) -}; -var checksum = caches.checksum; - -// node_modules/ox/_esm/core/Address.js -init_Errors(); - -// node_modules/ox/_esm/core/Hash.js -init_sha3(); -init_Bytes(); -init_Hex(); -function keccak2562(value, options = {}) { - const { as = typeof value === "string" ? "Hex" : "Bytes" } = options; - const bytes = keccak_256(from(value)); - if (as === "Bytes") - return bytes; - return fromBytes(bytes); -} - -// node_modules/ox/_esm/core/PublicKey.js -init_Bytes(); -init_Errors(); -init_Hex(); -init_Json(); -function assert3(publicKey, options = {}) { - const { compressed } = options; - const { prefix, x, y } = publicKey; - if (compressed === false || typeof x === "bigint" && typeof y === "bigint") { - if (prefix !== 4) - throw new InvalidPrefixError({ - prefix, - cause: new InvalidUncompressedPrefixError() - }); - return; - } - if (compressed === true || typeof x === "bigint" && typeof y === "undefined") { - if (prefix !== 3 && prefix !== 2) - throw new InvalidPrefixError({ - prefix, - cause: new InvalidCompressedPrefixError() - }); - return; - } - throw new InvalidError({ publicKey }); -} -function from3(value) { - const publicKey = (() => { - if (validate2(value)) - return fromHex2(value); - if (validate(value)) - return fromBytes2(value); - const { prefix, x, y } = value; - if (typeof x === "bigint" && typeof y === "bigint") - return { prefix: prefix ?? 4, x, y }; - return { prefix, x }; - })(); - assert3(publicKey); - return publicKey; -} -function fromBytes2(publicKey) { - return fromHex2(fromBytes(publicKey)); -} -function fromHex2(publicKey) { - if (publicKey.length !== 132 && publicKey.length !== 130 && publicKey.length !== 68) - throw new InvalidSerializedSizeError({ publicKey }); - if (publicKey.length === 130) { - const x2 = BigInt(slice3(publicKey, 0, 32)); - const y = BigInt(slice3(publicKey, 32, 64)); - return { - prefix: 4, - x: x2, - y - }; - } - if (publicKey.length === 132) { - const prefix2 = Number(slice3(publicKey, 0, 1)); - const x2 = BigInt(slice3(publicKey, 1, 33)); - const y = BigInt(slice3(publicKey, 33, 65)); - return { - prefix: prefix2, - x: x2, - y - }; - } - const prefix = Number(slice3(publicKey, 0, 1)); - const x = BigInt(slice3(publicKey, 1, 33)); - return { - prefix, - x - }; -} -function toHex2(publicKey, options = {}) { - assert3(publicKey); - const { prefix, x, y } = publicKey; - const { includePrefix = true } = options; - const publicKey_ = concat2( - includePrefix ? fromNumber(prefix, { size: 1 }) : "0x", - fromNumber(x, { size: 32 }), - // If the public key is not compressed, add the y coordinate. - typeof y === "bigint" ? fromNumber(y, { size: 32 }) : "0x" - ); - return publicKey_; -} -var InvalidError = class extends BaseError3 { - constructor({ publicKey }) { - super(`Value \`${stringify2(publicKey)}\` is not a valid public key.`, { - metaMessages: [ - "Public key must contain:", - "- an `x` and `prefix` value (compressed)", - "- an `x`, `y`, and `prefix` value (uncompressed)" - ] - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "PublicKey.InvalidError" - }); - } -}; -var InvalidPrefixError = class extends BaseError3 { - constructor({ prefix, cause }) { - super(`Prefix "${prefix}" is invalid.`, { - cause - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "PublicKey.InvalidPrefixError" - }); - } -}; -var InvalidCompressedPrefixError = class extends BaseError3 { - constructor() { - super("Prefix must be 2 or 3 for compressed public keys."); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "PublicKey.InvalidCompressedPrefixError" - }); - } -}; -var InvalidUncompressedPrefixError = class extends BaseError3 { - constructor() { - super("Prefix must be 4 for uncompressed public keys."); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "PublicKey.InvalidUncompressedPrefixError" - }); - } -}; -var InvalidSerializedSizeError = class extends BaseError3 { - constructor({ publicKey }) { - super(`Value \`${publicKey}\` is an invalid public key size.`, { - metaMessages: [ - "Expected: 33 bytes (compressed + prefix), 64 bytes (uncompressed) or 65 bytes (uncompressed + prefix).", - `Received ${size3(from2(publicKey))} bytes.` - ] - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "PublicKey.InvalidSerializedSizeError" - }); - } -}; - -// node_modules/ox/_esm/core/Address.js -var addressRegex2 = /^0x[a-fA-F0-9]{40}$/; -function assert4(value, options = {}) { - const { strict = true } = options; - if (!addressRegex2.test(value)) - throw new InvalidAddressError2({ - address: value, - cause: new InvalidInputError() - }); - if (strict) { - if (value.toLowerCase() === value) - return; - if (checksum2(value) !== value) - throw new InvalidAddressError2({ - address: value, - cause: new InvalidChecksumError() - }); - } -} -function checksum2(address2) { - if (checksum.has(address2)) - return checksum.get(address2); - assert4(address2, { strict: false }); - const hexAddress = address2.substring(2).toLowerCase(); - const hash3 = keccak2562(fromString(hexAddress), { as: "Bytes" }); - const characters = hexAddress.split(""); - for (let i = 0; i < 40; i += 2) { - if (hash3[i >> 1] >> 4 >= 8 && characters[i]) { - characters[i] = characters[i].toUpperCase(); - } - if ((hash3[i >> 1] & 15) >= 8 && characters[i + 1]) { - characters[i + 1] = characters[i + 1].toUpperCase(); - } - } - const result = `0x${characters.join("")}`; - checksum.set(address2, result); - return result; -} -function from4(address2, options = {}) { - const { checksum: checksumVal = false } = options; - assert4(address2); - if (checksumVal) - return checksum2(address2); - return address2; -} -function fromPublicKey(publicKey, options = {}) { - const address2 = keccak2562(`0x${toHex2(publicKey).slice(4)}`).substring(26); - return from4(`0x${address2}`, options); -} -function validate3(address2, options = {}) { - const { strict = true } = options ?? {}; - try { - assert4(address2, { strict }); - return true; - } catch { - return false; - } -} -var InvalidAddressError2 = class extends BaseError3 { - constructor({ address: address2, cause }) { - super(`Address "${address2}" is invalid.`, { - cause - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Address.InvalidAddressError" - }); - } -}; -var InvalidInputError = class extends BaseError3 { - constructor() { - super("Address is not a 20 byte (40 hexadecimal character) value."); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Address.InvalidInputError" - }); - } -}; -var InvalidChecksumError = class extends BaseError3 { - constructor() { - super("Address does not match its checksum counterpart."); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Address.InvalidChecksumError" - }); - } -}; - -// node_modules/ox/_esm/core/AbiParameters.js -init_Bytes(); -init_Errors(); -init_Hex(); - -// node_modules/ox/_esm/core/internal/abiParameters.js -init_Bytes(); -init_Errors(); -init_Hex(); - -// node_modules/ox/_esm/core/Solidity.js -var arrayRegex = /^(.*)\[([0-9]*)\]$/; -var bytesRegex3 = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/; -var integerRegex3 = /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/; -var maxInt82 = 2n ** (8n - 1n) - 1n; -var maxInt162 = 2n ** (16n - 1n) - 1n; -var maxInt242 = 2n ** (24n - 1n) - 1n; -var maxInt322 = 2n ** (32n - 1n) - 1n; -var maxInt402 = 2n ** (40n - 1n) - 1n; -var maxInt482 = 2n ** (48n - 1n) - 1n; -var maxInt562 = 2n ** (56n - 1n) - 1n; -var maxInt642 = 2n ** (64n - 1n) - 1n; -var maxInt722 = 2n ** (72n - 1n) - 1n; -var maxInt802 = 2n ** (80n - 1n) - 1n; -var maxInt882 = 2n ** (88n - 1n) - 1n; -var maxInt962 = 2n ** (96n - 1n) - 1n; -var maxInt1042 = 2n ** (104n - 1n) - 1n; -var maxInt1122 = 2n ** (112n - 1n) - 1n; -var maxInt1202 = 2n ** (120n - 1n) - 1n; -var maxInt1282 = 2n ** (128n - 1n) - 1n; -var maxInt1362 = 2n ** (136n - 1n) - 1n; -var maxInt1442 = 2n ** (144n - 1n) - 1n; -var maxInt1522 = 2n ** (152n - 1n) - 1n; -var maxInt1602 = 2n ** (160n - 1n) - 1n; -var maxInt1682 = 2n ** (168n - 1n) - 1n; -var maxInt1762 = 2n ** (176n - 1n) - 1n; -var maxInt1842 = 2n ** (184n - 1n) - 1n; -var maxInt1922 = 2n ** (192n - 1n) - 1n; -var maxInt2002 = 2n ** (200n - 1n) - 1n; -var maxInt2082 = 2n ** (208n - 1n) - 1n; -var maxInt2162 = 2n ** (216n - 1n) - 1n; -var maxInt2242 = 2n ** (224n - 1n) - 1n; -var maxInt2322 = 2n ** (232n - 1n) - 1n; -var maxInt2402 = 2n ** (240n - 1n) - 1n; -var maxInt2482 = 2n ** (248n - 1n) - 1n; -var maxInt2562 = 2n ** (256n - 1n) - 1n; -var minInt82 = -(2n ** (8n - 1n)); -var minInt162 = -(2n ** (16n - 1n)); -var minInt242 = -(2n ** (24n - 1n)); -var minInt322 = -(2n ** (32n - 1n)); -var minInt402 = -(2n ** (40n - 1n)); -var minInt482 = -(2n ** (48n - 1n)); -var minInt562 = -(2n ** (56n - 1n)); -var minInt642 = -(2n ** (64n - 1n)); -var minInt722 = -(2n ** (72n - 1n)); -var minInt802 = -(2n ** (80n - 1n)); -var minInt882 = -(2n ** (88n - 1n)); -var minInt962 = -(2n ** (96n - 1n)); -var minInt1042 = -(2n ** (104n - 1n)); -var minInt1122 = -(2n ** (112n - 1n)); -var minInt1202 = -(2n ** (120n - 1n)); -var minInt1282 = -(2n ** (128n - 1n)); -var minInt1362 = -(2n ** (136n - 1n)); -var minInt1442 = -(2n ** (144n - 1n)); -var minInt1522 = -(2n ** (152n - 1n)); -var minInt1602 = -(2n ** (160n - 1n)); -var minInt1682 = -(2n ** (168n - 1n)); -var minInt1762 = -(2n ** (176n - 1n)); -var minInt1842 = -(2n ** (184n - 1n)); -var minInt1922 = -(2n ** (192n - 1n)); -var minInt2002 = -(2n ** (200n - 1n)); -var minInt2082 = -(2n ** (208n - 1n)); -var minInt2162 = -(2n ** (216n - 1n)); -var minInt2242 = -(2n ** (224n - 1n)); -var minInt2322 = -(2n ** (232n - 1n)); -var minInt2402 = -(2n ** (240n - 1n)); -var minInt2482 = -(2n ** (248n - 1n)); -var minInt2562 = -(2n ** (256n - 1n)); -var maxUint82 = 2n ** 8n - 1n; -var maxUint162 = 2n ** 16n - 1n; -var maxUint242 = 2n ** 24n - 1n; -var maxUint322 = 2n ** 32n - 1n; -var maxUint402 = 2n ** 40n - 1n; -var maxUint482 = 2n ** 48n - 1n; -var maxUint562 = 2n ** 56n - 1n; -var maxUint642 = 2n ** 64n - 1n; -var maxUint722 = 2n ** 72n - 1n; -var maxUint802 = 2n ** 80n - 1n; -var maxUint882 = 2n ** 88n - 1n; -var maxUint962 = 2n ** 96n - 1n; -var maxUint1042 = 2n ** 104n - 1n; -var maxUint1122 = 2n ** 112n - 1n; -var maxUint1202 = 2n ** 120n - 1n; -var maxUint1282 = 2n ** 128n - 1n; -var maxUint1362 = 2n ** 136n - 1n; -var maxUint1442 = 2n ** 144n - 1n; -var maxUint1522 = 2n ** 152n - 1n; -var maxUint1602 = 2n ** 160n - 1n; -var maxUint1682 = 2n ** 168n - 1n; -var maxUint1762 = 2n ** 176n - 1n; -var maxUint1842 = 2n ** 184n - 1n; -var maxUint1922 = 2n ** 192n - 1n; -var maxUint2002 = 2n ** 200n - 1n; -var maxUint2082 = 2n ** 208n - 1n; -var maxUint2162 = 2n ** 216n - 1n; -var maxUint2242 = 2n ** 224n - 1n; -var maxUint2322 = 2n ** 232n - 1n; -var maxUint2402 = 2n ** 240n - 1n; -var maxUint2482 = 2n ** 248n - 1n; -var maxUint2562 = 2n ** 256n - 1n; - -// node_modules/ox/_esm/core/internal/abiParameters.js -function decodeParameter2(cursor, param, options) { - const { checksumAddress: checksumAddress2, staticPosition } = options; - const arrayComponents = getArrayComponents2(param.type); - if (arrayComponents) { - const [length, type] = arrayComponents; - return decodeArray2(cursor, { ...param, type }, { checksumAddress: checksumAddress2, length, staticPosition }); - } - if (param.type === "tuple") - return decodeTuple2(cursor, param, { - checksumAddress: checksumAddress2, - staticPosition - }); - if (param.type === "address") - return decodeAddress2(cursor, { checksum: checksumAddress2 }); - if (param.type === "bool") - return decodeBool2(cursor); - if (param.type.startsWith("bytes")) - return decodeBytes2(cursor, param, { staticPosition }); - if (param.type.startsWith("uint") || param.type.startsWith("int")) - return decodeNumber2(cursor, param); - if (param.type === "string") - return decodeString2(cursor, { staticPosition }); - throw new InvalidTypeError(param.type); -} -var sizeOfLength2 = 32; -var sizeOfOffset2 = 32; -function decodeAddress2(cursor, options = {}) { - const { checksum: checksum5 = false } = options; - const value = cursor.readBytes(32); - const wrap3 = (address2) => checksum5 ? checksum2(address2) : address2; - return [wrap3(fromBytes(slice2(value, -20))), 32]; -} -function decodeArray2(cursor, param, options) { - const { checksumAddress: checksumAddress2, length, staticPosition } = options; - if (!length) { - const offset = toNumber2(cursor.readBytes(sizeOfOffset2)); - const start = staticPosition + offset; - const startOfData = start + sizeOfLength2; - cursor.setPosition(start); - const length2 = toNumber2(cursor.readBytes(sizeOfLength2)); - const dynamicChild = hasDynamicChild2(param); - let consumed2 = 0; - const value2 = []; - for (let i = 0; i < length2; ++i) { - cursor.setPosition(startOfData + (dynamicChild ? i * 32 : consumed2)); - const [data, consumed_] = decodeParameter2(cursor, param, { - checksumAddress: checksumAddress2, - staticPosition: startOfData - }); - consumed2 += consumed_; - value2.push(data); - } - cursor.setPosition(staticPosition + 32); - return [value2, 32]; - } - if (hasDynamicChild2(param)) { - const offset = toNumber2(cursor.readBytes(sizeOfOffset2)); - const start = staticPosition + offset; - const value2 = []; - for (let i = 0; i < length; ++i) { - cursor.setPosition(start + i * 32); - const [data] = decodeParameter2(cursor, param, { - checksumAddress: checksumAddress2, - staticPosition: start - }); - value2.push(data); - } - cursor.setPosition(staticPosition + 32); - return [value2, 32]; - } - let consumed = 0; - const value = []; - for (let i = 0; i < length; ++i) { - const [data, consumed_] = decodeParameter2(cursor, param, { - checksumAddress: checksumAddress2, - staticPosition: staticPosition + consumed - }); - consumed += consumed_; - value.push(data); - } - return [value, consumed]; -} -function decodeBool2(cursor) { - return [toBoolean(cursor.readBytes(32), { size: 32 }), 32]; -} -function decodeBytes2(cursor, param, { staticPosition }) { - const [_, size5] = param.type.split("bytes"); - if (!size5) { - const offset = toNumber2(cursor.readBytes(32)); - cursor.setPosition(staticPosition + offset); - const length = toNumber2(cursor.readBytes(32)); - if (length === 0) { - cursor.setPosition(staticPosition + 32); - return ["0x", 32]; } - const data = cursor.readBytes(length); - cursor.setPosition(staticPosition + 32); - return [fromBytes(data), 32]; + module.exports = { + fetch: fetch2, + Fetch, + fetching, + finalizeAndReportTiming + }; } - const value = fromBytes(cursor.readBytes(Number.parseInt(size5, 10), 32)); - return [value, 32]; -} -function decodeNumber2(cursor, param) { - const signed = param.type.startsWith("int"); - const size5 = Number.parseInt(param.type.split("int")[1] || "256", 10); - const value = cursor.readBytes(32); - return [ - size5 > 48 ? toBigInt2(value, { signed }) : toNumber2(value, { signed }), - 32 - ]; -} -function decodeTuple2(cursor, param, options) { - const { checksumAddress: checksumAddress2, staticPosition } = options; - const hasUnnamedChild = param.components.length === 0 || param.components.some(({ name }) => !name); - const value = hasUnnamedChild ? [] : {}; - let consumed = 0; - if (hasDynamicChild2(param)) { - const offset = toNumber2(cursor.readBytes(sizeOfOffset2)); - const start = staticPosition + offset; - for (let i = 0; i < param.components.length; ++i) { - const component = param.components[i]; - cursor.setPosition(start + consumed); - const [data, consumed_] = decodeParameter2(cursor, component, { - checksumAddress: checksumAddress2, - staticPosition: start - }); - consumed += consumed_; - value[hasUnnamedChild ? i : component?.name] = data; +}); + +// node_modules/undici/lib/web/cache/util.js +var require_util3 = __commonJS({ + "node_modules/undici/lib/web/cache/util.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { URLSerializer } = require_data_url(); + var { isValidHeaderName } = require_util2(); + function urlEquals(A, B, excludeFragment = false) { + const serializedA = URLSerializer(A, excludeFragment); + const serializedB = URLSerializer(B, excludeFragment); + return serializedA === serializedB; } - cursor.setPosition(staticPosition + 32); - return [value, 32]; - } - for (let i = 0; i < param.components.length; ++i) { - const component = param.components[i]; - const [data, consumed_] = decodeParameter2(cursor, component, { - checksumAddress: checksumAddress2, - staticPosition - }); - value[hasUnnamedChild ? i : component?.name] = data; - consumed += consumed_; - } - return [value, consumed]; -} -function decodeString2(cursor, { staticPosition }) { - const offset = toNumber2(cursor.readBytes(32)); - const start = staticPosition + offset; - cursor.setPosition(start); - const length = toNumber2(cursor.readBytes(32)); - if (length === 0) { - cursor.setPosition(staticPosition + 32); - return ["", 32]; - } - const data = cursor.readBytes(length, 32); - const value = toString(trimLeft(data)); - cursor.setPosition(staticPosition + 32); - return [value, 32]; -} -function prepareParameters({ checksumAddress: checksumAddress2, parameters, values }) { - const preparedParameters = []; - for (let i = 0; i < parameters.length; i++) { - preparedParameters.push(prepareParameter({ - checksumAddress: checksumAddress2, - parameter: parameters[i], - value: values[i] - })); - } - return preparedParameters; -} -function prepareParameter({ checksumAddress: checksumAddress2 = false, parameter: parameter_, value }) { - const parameter = parameter_; - const arrayComponents = getArrayComponents2(parameter.type); - if (arrayComponents) { - const [length, type] = arrayComponents; - return encodeArray2(value, { - checksumAddress: checksumAddress2, - length, - parameter: { - ...parameter, - type + function getFieldValues(header) { + assert8(header !== null); + const values = []; + for (let value of header.split(",")) { + value = value.trim(); + if (isValidHeaderName(value)) { + values.push(value); + } } - }); - } - if (parameter.type === "tuple") { - return encodeTuple2(value, { - checksumAddress: checksumAddress2, - parameter - }); - } - if (parameter.type === "address") { - return encodeAddress2(value, { - checksum: checksumAddress2 - }); - } - if (parameter.type === "bool") { - return encodeBoolean(value); - } - if (parameter.type.startsWith("uint") || parameter.type.startsWith("int")) { - const signed = parameter.type.startsWith("int"); - const [, , size5 = "256"] = integerRegex3.exec(parameter.type) ?? []; - return encodeNumber2(value, { - signed, - size: Number(size5) - }); - } - if (parameter.type.startsWith("bytes")) { - return encodeBytes2(value, { type: parameter.type }); - } - if (parameter.type === "string") { - return encodeString2(value); - } - throw new InvalidTypeError(parameter.type); -} -function encode(preparedParameters) { - let staticSize = 0; - for (let i = 0; i < preparedParameters.length; i++) { - const { dynamic, encoded } = preparedParameters[i]; - if (dynamic) - staticSize += 32; - else - staticSize += size3(encoded); - } - const staticParameters = []; - const dynamicParameters = []; - let dynamicSize = 0; - for (let i = 0; i < preparedParameters.length; i++) { - const { dynamic, encoded } = preparedParameters[i]; - if (dynamic) { - staticParameters.push(fromNumber(staticSize + dynamicSize, { size: 32 })); - dynamicParameters.push(encoded); - dynamicSize += size3(encoded); - } else { - staticParameters.push(encoded); - } - } - return concat2(...staticParameters, ...dynamicParameters); -} -function encodeAddress2(value, options) { - const { checksum: checksum5 = false } = options; - assert4(value, { strict: checksum5 }); - return { - dynamic: false, - encoded: padLeft(value.toLowerCase()) - }; -} -function encodeArray2(value, options) { - const { checksumAddress: checksumAddress2, length, parameter } = options; - const dynamic = length === null; - if (!Array.isArray(value)) - throw new InvalidArrayError2(value); - if (!dynamic && value.length !== length) - throw new ArrayLengthMismatchError({ - expectedLength: length, - givenLength: value.length, - type: `${parameter.type}[${length}]` - }); - let dynamicChild = false; - const preparedParameters = []; - for (let i = 0; i < value.length; i++) { - const preparedParam = prepareParameter({ - checksumAddress: checksumAddress2, - parameter, - value: value[i] - }); - if (preparedParam.dynamic) - dynamicChild = true; - preparedParameters.push(preparedParam); - } - if (dynamic || dynamicChild) { - const data = encode(preparedParameters); - if (dynamic) { - const length2 = fromNumber(preparedParameters.length, { size: 32 }); - return { - dynamic: true, - encoded: preparedParameters.length > 0 ? concat2(length2, data) : length2 - }; + return values; } - if (dynamicChild) - return { dynamic: true, encoded: data }; - } - return { - dynamic: false, - encoded: concat2(...preparedParameters.map(({ encoded }) => encoded)) - }; -} -function encodeBytes2(value, { type }) { - const [, parametersize] = type.split("bytes"); - const bytesSize = size3(value); - if (!parametersize) { - let value_ = value; - if (bytesSize % 32 !== 0) - value_ = padRight(value_, Math.ceil((value.length - 2) / 2 / 32) * 32); - return { - dynamic: true, - encoded: concat2(padLeft(fromNumber(bytesSize, { size: 32 })), value_) + module.exports = { + urlEquals, + getFieldValues }; } - if (bytesSize !== Number.parseInt(parametersize, 10)) - throw new BytesSizeMismatchError2({ - expectedSize: Number.parseInt(parametersize, 10), - value - }); - return { dynamic: false, encoded: padRight(value) }; -} -function encodeBoolean(value) { - if (typeof value !== "boolean") - throw new BaseError3(`Invalid boolean value: "${value}" (type: ${typeof value}). Expected: \`true\` or \`false\`.`); - return { dynamic: false, encoded: padLeft(fromBoolean(value)) }; -} -function encodeNumber2(value, { signed, size: size5 }) { - if (typeof size5 === "number") { - const max = 2n ** (BigInt(size5) - (signed ? 1n : 0n)) - 1n; - const min = signed ? -max - 1n : 0n; - if (value > max || value < min) - throw new IntegerOutOfRangeError2({ - max: max.toString(), - min: min.toString(), - signed, - size: size5 / 8, - value: value.toString() - }); - } - return { - dynamic: false, - encoded: fromNumber(value, { - size: 32, - signed - }) - }; -} -function encodeString2(value) { - const hexValue = fromString2(value); - const partsLength = Math.ceil(size3(hexValue) / 32); - const parts = []; - for (let i = 0; i < partsLength; i++) { - parts.push(padRight(slice3(hexValue, i * 32, (i + 1) * 32))); - } - return { - dynamic: true, - encoded: concat2(padRight(fromNumber(size3(hexValue), { size: 32 })), ...parts) - }; -} -function encodeTuple2(value, options) { - const { checksumAddress: checksumAddress2, parameter } = options; - let dynamic = false; - const preparedParameters = []; - for (let i = 0; i < parameter.components.length; i++) { - const param_ = parameter.components[i]; - const index2 = Array.isArray(value) ? i : param_.name; - const preparedParam = prepareParameter({ - checksumAddress: checksumAddress2, - parameter: param_, - value: value[index2] - }); - preparedParameters.push(preparedParam); - if (preparedParam.dynamic) - dynamic = true; - } - return { - dynamic, - encoded: dynamic ? encode(preparedParameters) : concat2(...preparedParameters.map(({ encoded }) => encoded)) - }; -} -function getArrayComponents2(type) { - const matches = type.match(/^(.*)\[(\d+)?\]$/); - return matches ? ( - // Return `null` if the array is dynamic. - [matches[2] ? Number(matches[2]) : null, matches[1]] - ) : void 0; -} -function hasDynamicChild2(param) { - const { type } = param; - if (type === "string") - return true; - if (type === "bytes") - return true; - if (type.endsWith("[]")) - return true; - if (type === "tuple") - return param.components?.some(hasDynamicChild2); - const arrayComponents = getArrayComponents2(param.type); - if (arrayComponents && hasDynamicChild2({ - ...param, - type: arrayComponents[1] - })) - return true; - return false; -} - -// node_modules/ox/_esm/core/internal/cursor.js -init_Errors(); -var staticCursor2 = { - bytes: new Uint8Array(), - dataView: new DataView(new ArrayBuffer(0)), - position: 0, - positionReadCount: /* @__PURE__ */ new Map(), - recursiveReadCount: 0, - recursiveReadLimit: Number.POSITIVE_INFINITY, - assertReadLimit() { - if (this.recursiveReadCount >= this.recursiveReadLimit) - throw new RecursiveReadLimitExceededError2({ - count: this.recursiveReadCount + 1, - limit: this.recursiveReadLimit - }); - }, - assertPosition(position) { - if (position < 0 || position > this.bytes.length - 1) - throw new PositionOutOfBoundsError2({ - length: this.bytes.length, - position - }); - }, - decrementPosition(offset) { - if (offset < 0) - throw new NegativeOffsetError2({ offset }); - const position = this.position - offset; - this.assertPosition(position); - this.position = position; - }, - getReadCount(position) { - return this.positionReadCount.get(position || this.position) || 0; - }, - incrementPosition(offset) { - if (offset < 0) - throw new NegativeOffsetError2({ offset }); - const position = this.position + offset; - this.assertPosition(position); - this.position = position; - }, - inspectByte(position_) { - const position = position_ ?? this.position; - this.assertPosition(position); - return this.bytes[position]; - }, - inspectBytes(length, position_) { - const position = position_ ?? this.position; - this.assertPosition(position + length - 1); - return this.bytes.subarray(position, position + length); - }, - inspectUint8(position_) { - const position = position_ ?? this.position; - this.assertPosition(position); - return this.bytes[position]; - }, - inspectUint16(position_) { - const position = position_ ?? this.position; - this.assertPosition(position + 1); - return this.dataView.getUint16(position); - }, - inspectUint24(position_) { - const position = position_ ?? this.position; - this.assertPosition(position + 2); - return (this.dataView.getUint16(position) << 8) + this.dataView.getUint8(position + 2); - }, - inspectUint32(position_) { - const position = position_ ?? this.position; - this.assertPosition(position + 3); - return this.dataView.getUint32(position); - }, - pushByte(byte) { - this.assertPosition(this.position); - this.bytes[this.position] = byte; - this.position++; - }, - pushBytes(bytes) { - this.assertPosition(this.position + bytes.length - 1); - this.bytes.set(bytes, this.position); - this.position += bytes.length; - }, - pushUint8(value) { - this.assertPosition(this.position); - this.bytes[this.position] = value; - this.position++; - }, - pushUint16(value) { - this.assertPosition(this.position + 1); - this.dataView.setUint16(this.position, value); - this.position += 2; - }, - pushUint24(value) { - this.assertPosition(this.position + 2); - this.dataView.setUint16(this.position, value >> 8); - this.dataView.setUint8(this.position + 2, value & ~4294967040); - this.position += 3; - }, - pushUint32(value) { - this.assertPosition(this.position + 3); - this.dataView.setUint32(this.position, value); - this.position += 4; - }, - readByte() { - this.assertReadLimit(); - this._touch(); - const value = this.inspectByte(); - this.position++; - return value; - }, - readBytes(length, size5) { - this.assertReadLimit(); - this._touch(); - const value = this.inspectBytes(length); - this.position += size5 ?? length; - return value; - }, - readUint8() { - this.assertReadLimit(); - this._touch(); - const value = this.inspectUint8(); - this.position += 1; - return value; - }, - readUint16() { - this.assertReadLimit(); - this._touch(); - const value = this.inspectUint16(); - this.position += 2; - return value; - }, - readUint24() { - this.assertReadLimit(); - this._touch(); - const value = this.inspectUint24(); - this.position += 3; - return value; - }, - readUint32() { - this.assertReadLimit(); - this._touch(); - const value = this.inspectUint32(); - this.position += 4; - return value; - }, - get remaining() { - return this.bytes.length - this.position; - }, - setPosition(position) { - const oldPosition = this.position; - this.assertPosition(position); - this.position = position; - return () => this.position = oldPosition; - }, - _touch() { - if (this.recursiveReadLimit === Number.POSITIVE_INFINITY) - return; - const count = this.getReadCount(); - this.positionReadCount.set(this.position, count + 1); - if (count > 0) - this.recursiveReadCount++; - } -}; -function create(bytes, { recursiveReadLimit = 8192 } = {}) { - const cursor = Object.create(staticCursor2); - cursor.bytes = bytes; - cursor.dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); - cursor.positionReadCount = /* @__PURE__ */ new Map(); - cursor.recursiveReadLimit = recursiveReadLimit; - return cursor; -} -var NegativeOffsetError2 = class extends BaseError3 { - constructor({ offset }) { - super(`Offset \`${offset}\` cannot be negative.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Cursor.NegativeOffsetError" - }); - } -}; -var PositionOutOfBoundsError2 = class extends BaseError3 { - constructor({ length, position }) { - super(`Position \`${position}\` is out of bounds (\`0 < position < ${length}\`).`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Cursor.PositionOutOfBoundsError" - }); - } -}; -var RecursiveReadLimitExceededError2 = class extends BaseError3 { - constructor({ count, limit }) { - super(`Recursive read limit of \`${limit}\` exceeded (recursive read count: \`${count}\`).`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Cursor.RecursiveReadLimitExceededError" - }); - } -}; +}); -// node_modules/ox/_esm/core/AbiParameters.js -function decode(parameters, data, options = {}) { - const { as = "Array", checksumAddress: checksumAddress2 = false } = options; - const bytes = typeof data === "string" ? fromHex(data) : data; - const cursor = create(bytes); - if (size2(bytes) === 0 && parameters.length > 0) - throw new ZeroDataError(); - if (size2(bytes) && size2(bytes) < 32) - throw new DataSizeTooSmallError({ - data: typeof data === "string" ? data : fromBytes(data), - parameters, - size: size2(bytes) - }); - let consumed = 0; - const values = as === "Array" ? [] : {}; - for (let i = 0; i < parameters.length; ++i) { - const param = parameters[i]; - cursor.setPosition(consumed); - const [data2, consumed_] = decodeParameter2(cursor, param, { - checksumAddress: checksumAddress2, - staticPosition: 0 - }); - consumed += consumed_; - if (as === "Array") - values.push(data2); - else - values[param.name ?? i] = data2; - } - return values; -} -function encode2(parameters, values, options) { - const { checksumAddress: checksumAddress2 = false } = options ?? {}; - if (parameters.length !== values.length) - throw new LengthMismatchError({ - expectedLength: parameters.length, - givenLength: values.length - }); - const preparedParameters = prepareParameters({ - checksumAddress: checksumAddress2, - parameters, - values - }); - const data = encode(preparedParameters); - if (data.length === 0) - return "0x"; - return data; -} -function encodePacked(types, values) { - if (types.length !== values.length) - throw new LengthMismatchError({ - expectedLength: types.length, - givenLength: values.length - }); - const data = []; - for (let i = 0; i < types.length; i++) { - const type = types[i]; - const value = values[i]; - data.push(encodePacked.encode(type, value)); - } - return concat2(...data); -} -(function(encodePacked2) { - function encode4(type, value, isArray = false) { - if (type === "address") { - const address2 = value; - assert4(address2); - return padLeft(address2.toLowerCase(), isArray ? 32 : 0); - } - if (type === "string") - return fromString2(value); - if (type === "bytes") - return value; - if (type === "bool") - return padLeft(fromBoolean(value), isArray ? 32 : 1); - const intMatch = type.match(integerRegex3); - if (intMatch) { - const [_type, baseType, bits = "256"] = intMatch; - const size5 = Number.parseInt(bits, 10) / 8; - return fromNumber(value, { - size: isArray ? 32 : size5, - signed: baseType === "int" - }); - } - const bytesMatch = type.match(bytesRegex3); - if (bytesMatch) { - const [_type, size5] = bytesMatch; - if (Number.parseInt(size5, 10) !== (value.length - 2) / 2) - throw new BytesSizeMismatchError2({ - expectedSize: Number.parseInt(size5, 10), - value +// node_modules/undici/lib/web/cache/cache.js +var require_cache3 = __commonJS({ + "node_modules/undici/lib/web/cache/cache.js"(exports, module) { + "use strict"; + var assert8 = __require("assert"); + var { kConstruct } = require_symbols(); + var { urlEquals, getFieldValues } = require_util3(); + var { kEnumerableProperty, isDisturbed } = require_util(); + var { webidl } = require_webidl(); + var { cloneResponse, fromInnerResponse, getResponseState } = require_response(); + var { Request: Request2, fromInnerRequest, getRequestState } = require_request2(); + var { fetching } = require_fetch(); + var { urlIsHttpHttpsScheme, readAllBytes } = require_util2(); + var Cache = class _Cache { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list + * @type {requestResponseList} + */ + #relevantRequestResponseList; + constructor() { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor(); + } + webidl.util.markAsUncloneable(this); + this.#relevantRequestResponseList = arguments[1]; + } + async match(request, options = {}) { + webidl.brandCheck(this, _Cache); + const prefix = "Cache.match"; + webidl.argumentLengthCheck(arguments, 1, prefix); + request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + const p = this.#internalMatchAll(request, options, 1); + if (p.length === 0) { + return; + } + return p[0]; + } + async matchAll(request = void 0, options = {}) { + webidl.brandCheck(this, _Cache); + const prefix = "Cache.matchAll"; + if (request !== void 0) request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + return this.#internalMatchAll(request, options); + } + async add(request) { + webidl.brandCheck(this, _Cache); + const prefix = "Cache.add"; + webidl.argumentLengthCheck(arguments, 1, prefix); + request = webidl.converters.RequestInfo(request); + const requests = [request]; + const responseArrayPromise = this.addAll(requests); + return await responseArrayPromise; + } + async addAll(requests) { + webidl.brandCheck(this, _Cache); + const prefix = "Cache.addAll"; + webidl.argumentLengthCheck(arguments, 1, prefix); + const responsePromises = []; + const requestList = []; + for (let request of requests) { + if (request === void 0) { + throw webidl.errors.conversionFailed({ + prefix, + argument: "Argument 1", + types: ["undefined is not allowed"] + }); + } + request = webidl.converters.RequestInfo(request); + if (typeof request === "string") { + continue; + } + const r = getRequestState(request); + if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { + throw webidl.errors.exception({ + header: prefix, + message: "Expected http/s scheme when method is not GET." + }); + } + } + const fetchControllers = []; + for (const request of requests) { + const r = getRequestState(new Request2(request)); + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: prefix, + message: "Expected http/s scheme." + }); + } + r.initiator = "fetch"; + r.destination = "subresource"; + requestList.push(r); + const responsePromise = Promise.withResolvers(); + fetchControllers.push(fetching({ + request: r, + processResponse(response) { + if (response.type === "error" || response.status === 206 || response.status < 200 || response.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "Received an invalid status code or the request failed." + })); + } else if (response.headersList.contains("vary")) { + const fieldValues = getFieldValues(response.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "invalid vary field value" + })); + for (const controller of fetchControllers) { + controller.abort(); + } + return; + } + } + } + }, + processResponseEndOfBody(response) { + if (response.aborted) { + responsePromise.reject(new DOMException("aborted", "AbortError")); + return; + } + responsePromise.resolve(response); + } + })); + responsePromises.push(responsePromise.promise); + } + const p = Promise.all(responsePromises); + const responses = await p; + const operations = []; + let index2 = 0; + for (const response of responses) { + const operation = { + type: "put", + // 7.3.2 + request: requestList[index2], + // 7.3.3 + response + // 7.3.4 + }; + operations.push(operation); + index2++; + } + const cacheJobPromise = Promise.withResolvers(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e7) { + errorData = e7; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(void 0); + } else { + cacheJobPromise.reject(errorData); + } }); - return padRight(value, isArray ? 32 : 0); - } - const arrayMatch = type.match(arrayRegex); - if (arrayMatch && Array.isArray(value)) { - const [_type, childType] = arrayMatch; - const data = []; - for (let i = 0; i < value.length; i++) { - data.push(encode4(childType, value[i], true)); + return cacheJobPromise.promise; } - if (data.length === 0) - return "0x"; - return concat2(...data); - } - throw new InvalidTypeError(type); - } - encodePacked2.encode = encode4; -})(encodePacked || (encodePacked = {})); -function from5(parameters) { - if (Array.isArray(parameters) && typeof parameters[0] === "string") - return parseAbiParameters(parameters); - if (typeof parameters === "string") - return parseAbiParameters(parameters); - return parameters; -} -var DataSizeTooSmallError = class extends BaseError3 { - constructor({ data, parameters, size: size5 }) { - super(`Data size of ${size5} bytes is too small for given parameters.`, { - metaMessages: [ - `Params: (${formatAbiParameters(parameters)})`, - `Data: ${data} (${size5} bytes)` - ] - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiParameters.DataSizeTooSmallError" - }); - } -}; -var ZeroDataError = class extends BaseError3 { - constructor() { - super('Cannot decode zero data ("0x") with ABI parameters.'); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiParameters.ZeroDataError" - }); - } -}; -var ArrayLengthMismatchError = class extends BaseError3 { - constructor({ expectedLength, givenLength, type }) { - super(`Array length mismatch for type \`${type}\`. Expected: \`${expectedLength}\`. Given: \`${givenLength}\`.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiParameters.ArrayLengthMismatchError" - }); - } -}; -var BytesSizeMismatchError2 = class extends BaseError3 { - constructor({ expectedSize, value }) { - super(`Size of bytes "${value}" (bytes${size3(value)}) does not match expected size (bytes${expectedSize}).`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiParameters.BytesSizeMismatchError" - }); - } -}; -var LengthMismatchError = class extends BaseError3 { - constructor({ expectedLength, givenLength }) { - super([ - "ABI encoding parameters/values length mismatch.", - `Expected length (parameters): ${expectedLength}`, - `Given length (values): ${givenLength}` - ].join("\n")); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiParameters.LengthMismatchError" - }); - } -}; -var InvalidArrayError2 = class extends BaseError3 { - constructor(value) { - super(`Value \`${value}\` is not a valid array.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiParameters.InvalidArrayError" - }); - } -}; -var InvalidTypeError = class extends BaseError3 { - constructor(type) { - super(`Type \`${type}\` is not a valid ABI Type.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiParameters.InvalidTypeError" + async put(request, response) { + webidl.brandCheck(this, _Cache); + const prefix = "Cache.put"; + webidl.argumentLengthCheck(arguments, 2, prefix); + request = webidl.converters.RequestInfo(request); + response = webidl.converters.Response(response, prefix, "response"); + let innerRequest = null; + if (webidl.is.Request(request)) { + innerRequest = getRequestState(request); + } else { + innerRequest = getRequestState(new Request2(request)); + } + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { + throw webidl.errors.exception({ + header: prefix, + message: "Expected an http/s scheme when method is not GET" + }); + } + const innerResponse = getResponseState(response); + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: prefix, + message: "Got 206 status" + }); + } + if (innerResponse.headersList.contains("vary")) { + const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + throw webidl.errors.exception({ + header: prefix, + message: "Got * vary field value" + }); + } + } + } + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: prefix, + message: "Response body is locked or disturbed" + }); + } + const clonedResponse = cloneResponse(innerResponse); + const bodyReadPromise = Promise.withResolvers(); + if (innerResponse.body != null) { + const stream = innerResponse.body.stream; + const reader = stream.getReader(); + readAllBytes(reader, bodyReadPromise.resolve, bodyReadPromise.reject); + } else { + bodyReadPromise.resolve(void 0); + } + const operations = []; + const operation = { + type: "put", + // 14. + request: innerRequest, + // 15. + response: clonedResponse + // 16. + }; + operations.push(operation); + const bytes = await bodyReadPromise.promise; + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes; + } + const cacheJobPromise = Promise.withResolvers(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e7) { + errorData = e7; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async delete(request, options = {}) { + webidl.brandCheck(this, _Cache); + const prefix = "Cache.delete"; + webidl.argumentLengthCheck(arguments, 1, prefix); + request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + let r = null; + if (webidl.is.Request(request)) { + r = getRequestState(request); + if (r.method !== "GET" && !options.ignoreMethod) { + return false; + } + } else { + assert8(typeof request === "string"); + r = getRequestState(new Request2(request)); + } + const operations = []; + const operation = { + type: "delete", + request: r, + options + }; + operations.push(operation); + const cacheJobPromise = Promise.withResolvers(); + let errorData = null; + let requestResponses; + try { + requestResponses = this.#batchCacheOperations(operations); + } catch (e7) { + errorData = e7; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys + * @param {any} request + * @param {import('../../../types/cache').CacheQueryOptions} options + * @returns {Promise} + */ + async keys(request = void 0, options = {}) { + webidl.brandCheck(this, _Cache); + const prefix = "Cache.keys"; + if (request !== void 0) request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + let r = null; + if (request !== void 0) { + if (webidl.is.Request(request)) { + r = getRequestState(request); + if (r.method !== "GET" && !options.ignoreMethod) { + return []; + } + } else if (typeof request === "string") { + r = getRequestState(new Request2(request)); + } + } + const promise = Promise.withResolvers(); + const requests = []; + if (request === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + requests.push(requestResponse[0]); + } + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + requests.push(requestResponse[0]); + } + } + queueMicrotask(() => { + const requestList = []; + for (const request2 of requests) { + const requestObject = fromInnerRequest( + request2, + void 0, + new AbortController().signal, + "immutable" + ); + requestList.push(requestObject); + } + promise.resolve(Object.freeze(requestList)); + }); + return promise.promise; + } + /** + * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm + * @param {CacheBatchOperation[]} operations + * @returns {requestResponseList} + */ + #batchCacheOperations(operations) { + const cache2 = this.#relevantRequestResponseList; + const backupCache = [...cache2]; + const addedItems = []; + const resultList = []; + try { + for (const operation of operations) { + if (operation.type !== "delete" && operation.type !== "put") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: 'operation type does not match "delete" or "put"' + }); + } + if (operation.type === "delete" && operation.response != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "delete operation should not have an associated response" + }); + } + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException("???", "InvalidStateError"); + } + let requestResponses; + if (operation.type === "delete") { + requestResponses = this.#queryCache(operation.request, operation.options); + if (requestResponses.length === 0) { + return []; + } + for (const requestResponse of requestResponses) { + const idx = cache2.indexOf(requestResponse); + assert8(idx !== -1); + cache2.splice(idx, 1); + } + } else if (operation.type === "put") { + if (operation.response == null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "put operation should have an associated response" + }); + } + const r = operation.request; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "expected http or https scheme" + }); + } + if (r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "not get method" + }); + } + if (operation.options != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "options must not be defined" + }); + } + requestResponses = this.#queryCache(operation.request); + for (const requestResponse of requestResponses) { + const idx = cache2.indexOf(requestResponse); + assert8(idx !== -1); + cache2.splice(idx, 1); + } + cache2.push([operation.request, operation.response]); + addedItems.push([operation.request, operation.response]); + } + resultList.push([operation.request, operation.response]); + } + return resultList; + } catch (e7) { + this.#relevantRequestResponseList.length = 0; + this.#relevantRequestResponseList = backupCache; + throw e7; + } + } + /** + * @see https://w3c.github.io/ServiceWorker/#query-cache + * @param {any} requestQuery + * @param {import('../../../types/cache').CacheQueryOptions} options + * @param {requestResponseList} targetStorage + * @returns {requestResponseList} + */ + #queryCache(requestQuery, options, targetStorage) { + const resultList = []; + const storage = targetStorage ?? this.#relevantRequestResponseList; + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse; + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { + resultList.push(requestResponse); + } + } + return resultList; + } + /** + * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm + * @param {any} requestQuery + * @param {any} request + * @param {any | null} response + * @param {import('../../../types/cache').CacheQueryOptions | undefined} options + * @returns {boolean} + */ + #requestMatchesCachedItem(requestQuery, request, response = null, options) { + const queryURL = new URL(requestQuery.url); + const cachedURL = new URL(request.url); + if (options?.ignoreSearch) { + cachedURL.search = ""; + queryURL.search = ""; + } + if (!urlEquals(queryURL, cachedURL, true)) { + return false; + } + if (response == null || options?.ignoreVary || !response.headersList.contains("vary")) { + return true; + } + const fieldValues = getFieldValues(response.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + return false; + } + const requestValue = request.headersList.get(fieldValue); + const queryValue = requestQuery.headersList.get(fieldValue); + if (requestValue !== queryValue) { + return false; + } + } + return true; + } + #internalMatchAll(request, options, maxResponses = Infinity) { + let r = null; + if (request !== void 0) { + if (webidl.is.Request(request)) { + r = getRequestState(request); + if (r.method !== "GET" && !options.ignoreMethod) { + return []; + } + } else if (typeof request === "string") { + r = getRequestState(new Request2(request)); + } + } + const responses = []; + if (request === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } + } + const responseList = []; + for (const response of responses) { + const responseObject = fromInnerResponse(cloneResponse(response), "immutable"); + responseList.push(responseObject); + if (responseList.length >= maxResponses) { + break; + } + } + return Object.freeze(responseList); + } + }; + Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: "Cache", + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty }); + var cacheQueryOptionConverters = [ + { + key: "ignoreSearch", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "ignoreMethod", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "ignoreVary", + converter: webidl.converters.boolean, + defaultValue: () => false + } + ]; + webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); + webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: "cacheName", + converter: webidl.converters.DOMString + } + ]); + webidl.converters.Response = webidl.interfaceConverter( + webidl.is.Response, + "Response" + ); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.RequestInfo + ); + module.exports = { + Cache + }; } -}; - -// node_modules/ox/_esm/core/Authorization.js -init_Hex(); +}); -// node_modules/ox/_esm/core/Rlp.js -init_Bytes(); -init_Errors(); -init_Hex(); -function from6(value, options) { - const { as } = options; - const encodable = getEncodable2(value); - const cursor = create(new Uint8Array(encodable.length)); - encodable.encode(cursor); - if (as === "Hex") - return fromBytes(cursor.bytes); - return cursor.bytes; -} -function fromHex3(hex, options = {}) { - const { as = "Hex" } = options; - return from6(hex, { as }); -} -function getEncodable2(bytes) { - if (Array.isArray(bytes)) - return getEncodableList2(bytes.map((x) => getEncodable2(x))); - return getEncodableBytes2(bytes); -} -function getEncodableList2(list) { - const bodyLength = list.reduce((acc, x) => acc + x.length, 0); - const sizeOfBodyLength = getSizeOfLength2(bodyLength); - const length = (() => { - if (bodyLength <= 55) - return 1 + bodyLength; - return 1 + sizeOfBodyLength + bodyLength; - })(); - return { - length, - encode(cursor) { - if (bodyLength <= 55) { - cursor.pushByte(192 + bodyLength); - } else { - cursor.pushByte(192 + 55 + sizeOfBodyLength); - if (sizeOfBodyLength === 1) - cursor.pushUint8(bodyLength); - else if (sizeOfBodyLength === 2) - cursor.pushUint16(bodyLength); - else if (sizeOfBodyLength === 3) - cursor.pushUint24(bodyLength); - else - cursor.pushUint32(bodyLength); +// node_modules/undici/lib/web/cache/cachestorage.js +var require_cachestorage = __commonJS({ + "node_modules/undici/lib/web/cache/cachestorage.js"(exports, module) { + "use strict"; + var { Cache } = require_cache3(); + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util(); + var { kConstruct } = require_symbols(); + var CacheStorage = class _CacheStorage { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map + * @type {Map { - if (bytes.length === 1 && bytes[0] < 128) - return 1; - if (bytes.length <= 55) - return 1 + bytes.length; - return 1 + sizeOfBytesLength + bytes.length; - })(); - return { - length, - encode(cursor) { - if (bytes.length === 1 && bytes[0] < 128) { - cursor.pushBytes(bytes); - } else if (bytes.length <= 55) { - cursor.pushByte(128 + bytes.length); - cursor.pushBytes(bytes); - } else { - cursor.pushByte(128 + 55 + sizeOfBytesLength); - if (sizeOfBytesLength === 1) - cursor.pushUint8(bytes.length); - else if (sizeOfBytesLength === 2) - cursor.pushUint16(bytes.length); - else if (sizeOfBytesLength === 3) - cursor.pushUint24(bytes.length); - else - cursor.pushUint32(bytes.length); - cursor.pushBytes(bytes); + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-has + * @param {string} cacheName + * @returns {Promise} + */ + async has(cacheName) { + webidl.brandCheck(this, _CacheStorage); + const prefix = "CacheStorage.has"; + webidl.argumentLengthCheck(arguments, 1, prefix); + cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); + return this.#caches.has(cacheName); } - } - }; -} -function getSizeOfLength2(length) { - if (length <= 255) - return 1; - if (length <= 65535) - return 2; - if (length <= 16777215) - return 3; - if (length <= 4294967295) - return 4; - throw new BaseError3("Length is too large."); -} - -// node_modules/ox/node_modules/@noble/curves/esm/secp256k1.js -init_sha2(); - -// node_modules/ox/node_modules/@noble/curves/esm/_shortw_utils.js -init_hmac(); -init_utils2(); - -// node_modules/ox/node_modules/@noble/curves/esm/abstract/modular.js -init_utils2(); -init_utils5(); -var _0n8 = BigInt(0); -var _1n8 = BigInt(1); -var _2n5 = /* @__PURE__ */ BigInt(2); -var _3n3 = /* @__PURE__ */ BigInt(3); -var _4n3 = /* @__PURE__ */ BigInt(4); -var _5n2 = /* @__PURE__ */ BigInt(5); -var _8n2 = /* @__PURE__ */ BigInt(8); -function mod2(a, b) { - const result = a % b; - return result >= _0n8 ? result : b + result; -} -function pow22(x, power, modulo2) { - let res = x; - while (power-- > _0n8) { - res *= res; - res %= modulo2; - } - return res; -} -function invert2(number, modulo2) { - if (number === _0n8) - throw new Error("invert: expected non-zero number"); - if (modulo2 <= _0n8) - throw new Error("invert: expected positive modulus, got " + modulo2); - let a = mod2(number, modulo2); - let b = modulo2; - let x = _0n8, y = _1n8, u = _1n8, v = _0n8; - while (a !== _0n8) { - const q = b / a; - const r = b % a; - const m = x - u * q; - const n = y - v * q; - b = a, a = r, x = u, y = v, u = m, v = n; - } - const gcd2 = b; - if (gcd2 !== _1n8) - throw new Error("invert: does not exist"); - return mod2(x, modulo2); -} -function sqrt3mod42(Fp, n) { - const p1div4 = (Fp.ORDER + _1n8) / _4n3; - const root = Fp.pow(n, p1div4); - if (!Fp.eql(Fp.sqr(root), n)) - throw new Error("Cannot find square root"); - return root; -} -function sqrt5mod82(Fp, n) { - const p5div8 = (Fp.ORDER - _5n2) / _8n2; - const n2 = Fp.mul(n, _2n5); - const v = Fp.pow(n2, p5div8); - const nv = Fp.mul(n, v); - const i = Fp.mul(Fp.mul(nv, _2n5), v); - const root = Fp.mul(nv, Fp.sub(i, Fp.ONE)); - if (!Fp.eql(Fp.sqr(root), n)) - throw new Error("Cannot find square root"); - return root; -} -function tonelliShanks2(P2) { - if (P2 < BigInt(3)) - throw new Error("sqrt is not defined for small field"); - let Q = P2 - _1n8; - let S = 0; - while (Q % _2n5 === _0n8) { - Q /= _2n5; - S++; - } - let Z = _2n5; - const _Fp = Field2(P2); - while (FpLegendre2(_Fp, Z) === 1) { - if (Z++ > 1e3) - throw new Error("Cannot find square root: probably non-prime P"); - } - if (S === 1) - return sqrt3mod42; - let cc = _Fp.pow(Z, Q); - const Q1div2 = (Q + _1n8) / _2n5; - return function tonelliSlow(Fp, n) { - if (Fp.is0(n)) - return n; - if (FpLegendre2(Fp, n) !== 1) - throw new Error("Cannot find square root"); - let M = S; - let c2 = Fp.mul(Fp.ONE, cc); - let t = Fp.pow(n, Q); - let R = Fp.pow(n, Q1div2); - while (!Fp.eql(t, Fp.ONE)) { - if (Fp.is0(t)) - return Fp.ZERO; - let i = 1; - let t_tmp = Fp.sqr(t); - while (!Fp.eql(t_tmp, Fp.ONE)) { - i++; - t_tmp = Fp.sqr(t_tmp); - if (i === M) - throw new Error("Cannot find square root"); + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open + * @param {string} cacheName + * @returns {Promise} + */ + async open(cacheName) { + webidl.brandCheck(this, _CacheStorage); + const prefix = "CacheStorage.open"; + webidl.argumentLengthCheck(arguments, 1, prefix); + cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); + if (this.#caches.has(cacheName)) { + const cache3 = this.#caches.get(cacheName); + return new Cache(kConstruct, cache3); + } + const cache2 = []; + this.#caches.set(cacheName, cache2); + return new Cache(kConstruct, cache2); } - const exponent = _1n8 << BigInt(M - i - 1); - const b = Fp.pow(c2, exponent); - M = i; - c2 = Fp.sqr(b); - t = Fp.mul(t, c2); - R = Fp.mul(R, b); - } - return R; - }; -} -function FpSqrt2(P2) { - if (P2 % _4n3 === _3n3) - return sqrt3mod42; - if (P2 % _8n2 === _5n2) - return sqrt5mod82; - return tonelliShanks2(P2); -} -var FIELD_FIELDS2 = [ - "create", - "isValid", - "is0", - "neg", - "inv", - "sqrt", - "sqr", - "eql", - "add", - "sub", - "mul", - "pow", - "div", - "addN", - "subN", - "mulN", - "sqrN" -]; -function validateField2(field) { - const initial = { - ORDER: "bigint", - MASK: "bigint", - BYTES: "isSafeInteger", - BITS: "isSafeInteger" - }; - const opts = FIELD_FIELDS2.reduce((map, val) => { - map[val] = "function"; - return map; - }, initial); - return validateObject2(field, opts); -} -function FpPow2(Fp, num2, power) { - if (power < _0n8) - throw new Error("invalid exponent, negatives unsupported"); - if (power === _0n8) - return Fp.ONE; - if (power === _1n8) - return num2; - let p = Fp.ONE; - let d = num2; - while (power > _0n8) { - if (power & _1n8) - p = Fp.mul(p, d); - d = Fp.sqr(d); - power >>= _1n8; - } - return p; -} -function FpInvertBatch2(Fp, nums, passZero = false) { - const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : void 0); - const multipliedAcc = nums.reduce((acc, num2, i) => { - if (Fp.is0(num2)) - return acc; - inverted[i] = acc; - return Fp.mul(acc, num2); - }, Fp.ONE); - const invertedAcc = Fp.inv(multipliedAcc); - nums.reduceRight((acc, num2, i) => { - if (Fp.is0(num2)) - return acc; - inverted[i] = Fp.mul(acc, inverted[i]); - return Fp.mul(acc, num2); - }, invertedAcc); - return inverted; -} -function FpLegendre2(Fp, n) { - const p1mod2 = (Fp.ORDER - _1n8) / _2n5; - const powered = Fp.pow(n, p1mod2); - const yes = Fp.eql(powered, Fp.ONE); - const zero = Fp.eql(powered, Fp.ZERO); - const no = Fp.eql(powered, Fp.neg(Fp.ONE)); - if (!yes && !zero && !no) - throw new Error("invalid Legendre symbol result"); - return yes ? 1 : zero ? 0 : -1; -} -function nLength2(n, nBitLength) { - if (nBitLength !== void 0) - anumber(nBitLength); - const _nBitLength = nBitLength !== void 0 ? nBitLength : n.toString(2).length; - const nByteLength = Math.ceil(_nBitLength / 8); - return { nBitLength: _nBitLength, nByteLength }; -} -function Field2(ORDER, bitLen4, isLE2 = false, redef = {}) { - if (ORDER <= _0n8) - throw new Error("invalid field: expected ORDER > 0, got " + ORDER); - const { nBitLength: BITS, nByteLength: BYTES } = nLength2(ORDER, bitLen4); - if (BYTES > 2048) - throw new Error("invalid field: expected ORDER of <= 2048 bytes"); - let sqrtP; - const f = Object.freeze({ - ORDER, - isLE: isLE2, - BITS, - BYTES, - MASK: bitMask2(BITS), - ZERO: _0n8, - ONE: _1n8, - create: (num2) => mod2(num2, ORDER), - isValid: (num2) => { - if (typeof num2 !== "bigint") - throw new Error("invalid field element: expected bigint, got " + typeof num2); - return _0n8 <= num2 && num2 < ORDER; - }, - is0: (num2) => num2 === _0n8, - isOdd: (num2) => (num2 & _1n8) === _1n8, - neg: (num2) => mod2(-num2, ORDER), - eql: (lhs, rhs) => lhs === rhs, - sqr: (num2) => mod2(num2 * num2, ORDER), - add: (lhs, rhs) => mod2(lhs + rhs, ORDER), - sub: (lhs, rhs) => mod2(lhs - rhs, ORDER), - mul: (lhs, rhs) => mod2(lhs * rhs, ORDER), - pow: (num2, power) => FpPow2(f, num2, power), - div: (lhs, rhs) => mod2(lhs * invert2(rhs, ORDER), ORDER), - // Same as above, but doesn't normalize - sqrN: (num2) => num2 * num2, - addN: (lhs, rhs) => lhs + rhs, - subN: (lhs, rhs) => lhs - rhs, - mulN: (lhs, rhs) => lhs * rhs, - inv: (num2) => invert2(num2, ORDER), - sqrt: redef.sqrt || ((n) => { - if (!sqrtP) - sqrtP = FpSqrt2(ORDER); - return sqrtP(f, n); - }), - toBytes: (num2) => isLE2 ? numberToBytesLE2(num2, BYTES) : numberToBytesBE2(num2, BYTES), - fromBytes: (bytes) => { - if (bytes.length !== BYTES) - throw new Error("Field.fromBytes: expected " + BYTES + " bytes, got " + bytes.length); - return isLE2 ? bytesToNumberLE2(bytes) : bytesToNumberBE2(bytes); - }, - // TODO: we don't need it here, move out to separate fn - invertBatch: (lst) => FpInvertBatch2(f, lst), - // We can't move this out because Fp6, Fp12 implement it - // and it's unclear what to return in there. - cmov: (a, b, c2) => c2 ? b : a - }); - return Object.freeze(f); -} -function getFieldBytesLength2(fieldOrder) { - if (typeof fieldOrder !== "bigint") - throw new Error("field order must be bigint"); - const bitLength = fieldOrder.toString(2).length; - return Math.ceil(bitLength / 8); -} -function getMinHashLength2(fieldOrder) { - const length = getFieldBytesLength2(fieldOrder); - return length + Math.ceil(length / 2); -} -function mapHashToField2(key, fieldOrder, isLE2 = false) { - const len = key.length; - const fieldLen = getFieldBytesLength2(fieldOrder); - const minLen = getMinHashLength2(fieldOrder); - if (len < 16 || len < minLen || len > 1024) - throw new Error("expected " + minLen + "-1024 bytes of input, got " + len); - const num2 = isLE2 ? bytesToNumberLE2(key) : bytesToNumberBE2(key); - const reduced = mod2(num2, fieldOrder - _1n8) + _1n8; - return isLE2 ? numberToBytesLE2(reduced, fieldLen) : numberToBytesBE2(reduced, fieldLen); -} + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete + * @param {string} cacheName + * @returns {Promise} + */ + async delete(cacheName) { + webidl.brandCheck(this, _CacheStorage); + const prefix = "CacheStorage.delete"; + webidl.argumentLengthCheck(arguments, 1, prefix); + cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); + return this.#caches.delete(cacheName); + } + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys + * @returns {Promise} + */ + async keys() { + webidl.brandCheck(this, _CacheStorage); + const keys = this.#caches.keys(); + return [...keys]; + } + }; + Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: "CacheStorage", + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + module.exports = { + CacheStorage + }; + } +}); -// node_modules/ox/node_modules/@noble/curves/esm/abstract/curve.js -init_utils5(); -var _0n9 = BigInt(0); -var _1n9 = BigInt(1); -function constTimeNegate2(condition, item) { - const neg = item.negate(); - return condition ? neg : item; -} -function validateW2(W, bits) { - if (!Number.isSafeInteger(W) || W <= 0 || W > bits) - throw new Error("invalid window size, expected [1.." + bits + "], got W=" + W); -} -function calcWOpts2(W, scalarBits) { - validateW2(W, scalarBits); - const windows = Math.ceil(scalarBits / W) + 1; - const windowSize = 2 ** (W - 1); - const maxNumber = 2 ** W; - const mask = bitMask2(W); - const shiftBy = BigInt(W); - return { windows, windowSize, mask, maxNumber, shiftBy }; -} -function calcOffsets2(n, window, wOpts) { - const { windowSize, mask, maxNumber, shiftBy } = wOpts; - let wbits = Number(n & mask); - let nextN = n >> shiftBy; - if (wbits > windowSize) { - wbits -= maxNumber; - nextN += _1n9; +// node_modules/undici/lib/web/cookies/constants.js +var require_constants5 = __commonJS({ + "node_modules/undici/lib/web/cookies/constants.js"(exports, module) { + "use strict"; + var maxAttributeValueSize = 1024; + var maxNameValuePairSize = 4096; + module.exports = { + maxAttributeValueSize, + maxNameValuePairSize + }; } - const offsetStart = window * windowSize; - const offset = offsetStart + Math.abs(wbits) - 1; - const isZero = wbits === 0; - const isNeg = wbits < 0; - const isNegF = window % 2 !== 0; - const offsetF = offsetStart; - return { nextN, offset, isZero, isNeg, isNegF, offsetF }; -} -function validateMSMPoints2(points, c2) { - if (!Array.isArray(points)) - throw new Error("array expected"); - points.forEach((p, i) => { - if (!(p instanceof c2)) - throw new Error("invalid point at index " + i); - }); -} -function validateMSMScalars2(scalars, field) { - if (!Array.isArray(scalars)) - throw new Error("array of scalars expected"); - scalars.forEach((s3, i) => { - if (!field.isValid(s3)) - throw new Error("invalid scalar at index " + i); - }); -} -var pointPrecomputes2 = /* @__PURE__ */ new WeakMap(); -var pointWindowSizes2 = /* @__PURE__ */ new WeakMap(); -function getW2(P2) { - return pointWindowSizes2.get(P2) || 1; -} -function wNAF2(c2, bits) { - return { - constTimeNegate: constTimeNegate2, - hasPrecomputes(elm) { - return getW2(elm) !== 1; - }, - // non-const time multiplication ladder - unsafeLadder(elm, n, p = c2.ZERO) { - let d = elm; - while (n > _0n9) { - if (n & _1n9) - p = p.add(d); - d = d.double(); - n >>= _1n9; +}); + +// node_modules/undici/lib/web/cookies/util.js +var require_util4 = __commonJS({ + "node_modules/undici/lib/web/cookies/util.js"(exports, module) { + "use strict"; + function isCTLExcludingHtab(value) { + for (let i = 0; i < value.length; ++i) { + const code = value.charCodeAt(i); + if (code >= 0 && code <= 8 || code >= 10 && code <= 31 || code === 127) { + return true; + } } - return p; - }, - /** - * Creates a wNAF precomputation window. Used for caching. - * Default window size is set by `utils.precompute()` and is equal to 8. - * Number of precomputed points depends on the curve size: - * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where: - * - 𝑊 is the window size - * - 𝑛 is the bitlength of the curve order. - * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224. - * @param elm Point instance - * @param W window size - * @returns precomputed point tables flattened to a single array - */ - precomputeWindow(elm, W) { - const { windows, windowSize } = calcWOpts2(W, bits); - const points = []; - let p = elm; - let base2 = p; - for (let window = 0; window < windows; window++) { - base2 = p; - points.push(base2); - for (let i = 1; i < windowSize; i++) { - base2 = base2.add(p); - points.push(base2); + return false; + } + function validateCookieName(name) { + for (let i = 0; i < name.length; ++i) { + const code = name.charCodeAt(i); + if (code < 33 || // exclude CTLs (0-31), SP and HT + code > 126 || // exclude non-ascii and DEL + code === 34 || // " + code === 40 || // ( + code === 41 || // ) + code === 60 || // < + code === 62 || // > + code === 64 || // @ + code === 44 || // , + code === 59 || // ; + code === 58 || // : + code === 92 || // \ + code === 47 || // / + code === 91 || // [ + code === 93 || // ] + code === 63 || // ? + code === 61 || // = + code === 123 || // { + code === 125) { + throw new Error("Invalid cookie name"); } - p = base2.double(); } - return points; - }, - /** - * Implements ec multiplication using precomputed tables and w-ary non-adjacent form. - * @param W window size - * @param precomputes precomputed tables - * @param n scalar (we don't check here, but should be less than curve order) - * @returns real and fake (for const-time) points - */ - wNAF(W, precomputes, n) { - let p = c2.ZERO; - let f = c2.BASE; - const wo = calcWOpts2(W, bits); - for (let window = 0; window < wo.windows; window++) { - const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets2(n, window, wo); - n = nextN; - if (isZero) { - f = f.add(constTimeNegate2(isNegF, precomputes[offsetF])); - } else { - p = p.add(constTimeNegate2(isNeg, precomputes[offset])); + } + function validateCookieValue(value) { + let len = value.length; + let i = 0; + if (value[0] === '"') { + if (len === 1 || value[len - 1] !== '"') { + throw new Error("Invalid cookie value"); } + --len; + ++i; } - return { p, f }; - }, - /** - * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form. - * @param W window size - * @param precomputes precomputed tables - * @param n scalar (we don't check here, but should be less than curve order) - * @param acc accumulator point to add result of multiplication - * @returns point - */ - wNAFUnsafe(W, precomputes, n, acc = c2.ZERO) { - const wo = calcWOpts2(W, bits); - for (let window = 0; window < wo.windows; window++) { - if (n === _0n9) - break; - const { nextN, offset, isZero, isNeg } = calcOffsets2(n, window, wo); - n = nextN; - if (isZero) { - continue; - } else { - const item = precomputes[offset]; - acc = acc.add(isNeg ? item.negate() : item); + while (i < len) { + const code = value.charCodeAt(i++); + if (code < 33 || // exclude CTLs (0-31) + code > 126 || // non-ascii and DEL (127) + code === 34 || // " + code === 44 || // , + code === 59 || // ; + code === 92) { + throw new Error("Invalid cookie value"); } } - return acc; - }, - getPrecomputes(W, P2, transform) { - let comp = pointPrecomputes2.get(P2); - if (!comp) { - comp = this.precomputeWindow(P2, W); - if (W !== 1) - pointPrecomputes2.set(P2, transform(comp)); + } + function validateCookiePath(path) { + for (let i = 0; i < path.length; ++i) { + const code = path.charCodeAt(i); + if (code < 32 || // exclude CTLs (0-31) + code === 127 || // DEL + code === 59) { + throw new Error("Invalid cookie path"); + } } - return comp; - }, - wNAFCached(P2, n, transform) { - const W = getW2(P2); - return this.wNAF(W, this.getPrecomputes(W, P2, transform), n); - }, - wNAFCachedUnsafe(P2, n, transform, prev) { - const W = getW2(P2); - if (W === 1) - return this.unsafeLadder(P2, n, prev); - return this.wNAFUnsafe(W, this.getPrecomputes(W, P2, transform), n, prev); - }, - // We calculate precomputes for elliptic curve point multiplication - // using windowed method. This specifies window size and - // stores precomputed values. Usually only base point would be precomputed. - setWindowSize(P2, W) { - validateW2(W, bits); - pointWindowSizes2.set(P2, W); - pointPrecomputes2.delete(P2); } - }; -} -function pippenger2(c2, fieldN, points, scalars) { - validateMSMPoints2(points, c2); - validateMSMScalars2(scalars, fieldN); - const plength = points.length; - const slength = scalars.length; - if (plength !== slength) - throw new Error("arrays of points and scalars must have equal length"); - const zero = c2.ZERO; - const wbits = bitLen2(BigInt(plength)); - let windowSize = 1; - if (wbits > 12) - windowSize = wbits - 3; - else if (wbits > 4) - windowSize = wbits - 2; - else if (wbits > 0) - windowSize = 2; - const MASK = bitMask2(windowSize); - const buckets = new Array(Number(MASK) + 1).fill(zero); - const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize; - let sum = zero; - for (let i = lastBits; i >= 0; i -= windowSize) { - buckets.fill(zero); - for (let j = 0; j < slength; j++) { - const scalar = scalars[j]; - const wbits2 = Number(scalar >> BigInt(i) & MASK); - buckets[wbits2] = buckets[wbits2].add(points[j]); + function validateCookieDomain(domain) { + if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { + throw new Error("Invalid cookie domain"); + } } - let resI = zero; - for (let j = buckets.length - 1, sumI = zero; j > 0; j--) { - sumI = sumI.add(buckets[j]); - resI = resI.add(sumI); + var IMFDays = [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ]; + var IMFMonths = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + var IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, "0")); + function toIMFDate(date) { + if (typeof date === "number") { + date = new Date(date); + } + return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`; } - sum = sum.add(resI); - if (i !== 0) - for (let j = 0; j < windowSize; j++) - sum = sum.double(); + function validateCookieMaxAge(maxAge) { + if (maxAge < 0) { + throw new Error("Invalid cookie max-age"); + } + } + function stringify4(cookie) { + if (cookie.name.length === 0) { + return null; + } + validateCookieName(cookie.name); + validateCookieValue(cookie.value); + const out = [`${cookie.name}=${cookie.value}`]; + if (cookie.name.startsWith("__Secure-")) { + cookie.secure = true; + } + if (cookie.name.startsWith("__Host-")) { + cookie.secure = true; + cookie.domain = null; + cookie.path = "/"; + } + if (cookie.secure) { + out.push("Secure"); + } + if (cookie.httpOnly) { + out.push("HttpOnly"); + } + if (typeof cookie.maxAge === "number") { + validateCookieMaxAge(cookie.maxAge); + out.push(`Max-Age=${cookie.maxAge}`); + } + if (cookie.domain) { + validateCookieDomain(cookie.domain); + out.push(`Domain=${cookie.domain}`); + } + if (cookie.path) { + validateCookiePath(cookie.path); + out.push(`Path=${cookie.path}`); + } + if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { + out.push(`Expires=${toIMFDate(cookie.expires)}`); + } + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`); + } + for (const part of cookie.unparsed) { + if (!part.includes("=")) { + throw new Error("Invalid unparsed"); + } + const [key, ...value] = part.split("="); + out.push(`${key.trim()}=${value.join("=")}`); + } + return out.join("; "); + } + module.exports = { + isCTLExcludingHtab, + validateCookieName, + validateCookiePath, + validateCookieValue, + toIMFDate, + stringify: stringify4 + }; + } +}); + +// node_modules/undici/lib/web/cookies/parse.js +var require_parse = __commonJS({ + "node_modules/undici/lib/web/cookies/parse.js"(exports, module) { + "use strict"; + var { collectASequenceOfCodePointsFast } = require_infra(); + var { maxNameValuePairSize, maxAttributeValueSize } = require_constants5(); + var { isCTLExcludingHtab } = require_util4(); + var assert8 = __require("assert"); + var { unescape: qsUnescape } = __require("querystring"); + function parseSetCookie(header) { + if (isCTLExcludingHtab(header)) { + return null; + } + let nameValuePair = ""; + let unparsedAttributes = ""; + let name = ""; + let value = ""; + if (header.includes(";")) { + const position = { position: 0 }; + nameValuePair = collectASequenceOfCodePointsFast(";", header, position); + unparsedAttributes = header.slice(position.position); + } else { + nameValuePair = header; + } + if (!nameValuePair.includes("=")) { + value = nameValuePair; + } else { + const position = { position: 0 }; + name = collectASequenceOfCodePointsFast( + "=", + nameValuePair, + position + ); + value = nameValuePair.slice(position.position + 1); + } + name = name.trim(); + value = value.trim(); + if (name.length + value.length > maxNameValuePairSize) { + return null; + } + return { + name, + value: qsUnescape(value), + ...parseUnparsedAttributes(unparsedAttributes) + }; + } + function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { + if (unparsedAttributes.length === 0) { + return cookieAttributeList; + } + assert8(unparsedAttributes[0] === ";"); + unparsedAttributes = unparsedAttributes.slice(1); + let cookieAv = ""; + if (unparsedAttributes.includes(";")) { + cookieAv = collectASequenceOfCodePointsFast( + ";", + unparsedAttributes, + { position: 0 } + ); + unparsedAttributes = unparsedAttributes.slice(cookieAv.length); + } else { + cookieAv = unparsedAttributes; + unparsedAttributes = ""; + } + let attributeName = ""; + let attributeValue = ""; + if (cookieAv.includes("=")) { + const position = { position: 0 }; + attributeName = collectASequenceOfCodePointsFast( + "=", + cookieAv, + position + ); + attributeValue = cookieAv.slice(position.position + 1); + } else { + attributeName = cookieAv; + } + attributeName = attributeName.trim(); + attributeValue = attributeValue.trim(); + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const attributeNameLowercase = attributeName.toLowerCase(); + if (attributeNameLowercase === "expires") { + const expiryTime = new Date(attributeValue); + cookieAttributeList.expires = expiryTime; + } else if (attributeNameLowercase === "max-age") { + const charCode = attributeValue.charCodeAt(0); + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const deltaSeconds = Number(attributeValue); + cookieAttributeList.maxAge = deltaSeconds; + } else if (attributeNameLowercase === "domain") { + let cookieDomain = attributeValue; + if (cookieDomain[0] === ".") { + cookieDomain = cookieDomain.slice(1); + } + cookieDomain = cookieDomain.toLowerCase(); + cookieAttributeList.domain = cookieDomain; + } else if (attributeNameLowercase === "path") { + let cookiePath = ""; + if (attributeValue.length === 0 || attributeValue[0] !== "/") { + cookiePath = "/"; + } else { + cookiePath = attributeValue; + } + cookieAttributeList.path = cookiePath; + } else if (attributeNameLowercase === "secure") { + cookieAttributeList.secure = true; + } else if (attributeNameLowercase === "httponly") { + cookieAttributeList.httpOnly = true; + } else if (attributeNameLowercase === "samesite") { + let enforcement = "Default"; + const attributeValueLowercase = attributeValue.toLowerCase(); + if (attributeValueLowercase.includes("none")) { + enforcement = "None"; + } + if (attributeValueLowercase.includes("strict")) { + enforcement = "Strict"; + } + if (attributeValueLowercase.includes("lax")) { + enforcement = "Lax"; + } + cookieAttributeList.sameSite = enforcement; + } else { + cookieAttributeList.unparsed ??= []; + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); + } + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + module.exports = { + parseSetCookie, + parseUnparsedAttributes + }; } - return sum; -} -function validateBasic2(curve) { - validateField2(curve.Fp); - validateObject2(curve, { - n: "bigint", - h: "bigint", - Gx: "field", - Gy: "field" - }, { - nBitLength: "isSafeInteger", - nByteLength: "isSafeInteger" - }); - return Object.freeze({ - ...nLength2(curve.n, curve.nBitLength), - ...curve, - ...{ p: curve.Fp.ORDER } - }); -} +}); -// node_modules/ox/node_modules/@noble/curves/esm/abstract/weierstrass.js -init_utils5(); -function validateSigVerOpts2(opts) { - if (opts.lowS !== void 0) - abool2("lowS", opts.lowS); - if (opts.prehash !== void 0) - abool2("prehash", opts.prehash); -} -function validatePointOpts2(curve) { - const opts = validateBasic2(curve); - validateObject2(opts, { - a: "field", - b: "field" - }, { - allowInfinityPoint: "boolean", - allowedPrivateKeyLengths: "array", - clearCofactor: "function", - fromBytes: "function", - isTorsionFree: "function", - toBytes: "function", - wrapPrivateKey: "boolean" - }); - const { endo, Fp, a } = opts; - if (endo) { - if (!Fp.eql(a, Fp.ZERO)) { - throw new Error("invalid endo: CURVE.a must be 0"); - } - if (typeof endo !== "object" || typeof endo.beta !== "bigint" || typeof endo.splitScalar !== "function") { - throw new Error('invalid endo: expected "beta": bigint and "splitScalar": function'); +// node_modules/undici/lib/web/cookies/index.js +var require_cookies = __commonJS({ + "node_modules/undici/lib/web/cookies/index.js"(exports, module) { + "use strict"; + var { parseSetCookie } = require_parse(); + var { stringify: stringify4 } = require_util4(); + var { webidl } = require_webidl(); + var { Headers: Headers2 } = require_headers(); + var brandChecks = webidl.brandCheckMultiple([Headers2, globalThis.Headers].filter(Boolean)); + function getCookies(headers) { + webidl.argumentLengthCheck(arguments, 1, "getCookies"); + brandChecks(headers); + const cookie = headers.get("cookie"); + const out = {}; + if (!cookie) { + return out; + } + for (const piece of cookie.split(";")) { + const [name, ...value] = piece.split("="); + out[name.trim()] = value.join("="); + } + return out; } - } - return Object.freeze({ ...opts }); -} -var DERErr2 = class extends Error { - constructor(m = "") { - super(m); - } -}; -var DER2 = { - // asn.1 DER encoding utils - Err: DERErr2, - // Basic building block is TLV (Tag-Length-Value) - _tlv: { - encode: (tag, data) => { - const { Err: E } = DER2; - if (tag < 0 || tag > 256) - throw new E("tlv.encode: wrong tag"); - if (data.length & 1) - throw new E("tlv.encode: unpadded data"); - const dataLen = data.length / 2; - const len = numberToHexUnpadded2(dataLen); - if (len.length / 2 & 128) - throw new E("tlv.encode: long form length too big"); - const lenLen = dataLen > 127 ? numberToHexUnpadded2(len.length / 2 | 128) : ""; - const t = numberToHexUnpadded2(tag); - return t + lenLen + len + data; - }, - // v - value, l - left bytes (unparsed) - decode(tag, data) { - const { Err: E } = DER2; - let pos = 0; - if (tag < 0 || tag > 256) - throw new E("tlv.encode: wrong tag"); - if (data.length < 2 || data[pos++] !== tag) - throw new E("tlv.decode: wrong tlv"); - const first = data[pos++]; - const isLong = !!(first & 128); - let length = 0; - if (!isLong) - length = first; - else { - const lenLen = first & 127; - if (!lenLen) - throw new E("tlv.decode(long): indefinite length not supported"); - if (lenLen > 4) - throw new E("tlv.decode(long): byte length is too big"); - const lengthBytes = data.subarray(pos, pos + lenLen); - if (lengthBytes.length !== lenLen) - throw new E("tlv.decode: length bytes not complete"); - if (lengthBytes[0] === 0) - throw new E("tlv.decode(long): zero leftmost byte"); - for (const b of lengthBytes) - length = length << 8 | b; - pos += lenLen; - if (length < 128) - throw new E("tlv.decode(long): not minimal encoding"); - } - const v = data.subarray(pos, pos + length); - if (v.length !== length) - throw new E("tlv.decode: wrong value length"); - return { v, l: data.subarray(pos + length) }; + function deleteCookie(headers, name, attributes) { + brandChecks(headers); + const prefix = "deleteCookie"; + webidl.argumentLengthCheck(arguments, 2, prefix); + name = webidl.converters.DOMString(name, prefix, "name"); + attributes = webidl.converters.DeleteCookieAttributes(attributes); + setCookie(headers, { + name, + value: "", + expires: /* @__PURE__ */ new Date(0), + ...attributes + }); } - }, - // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag, - // since we always use positive integers here. It must always be empty: - // - add zero byte if exists - // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding) - _int: { - encode(num2) { - const { Err: E } = DER2; - if (num2 < _0n10) - throw new E("integer: negative integers are not allowed"); - let hex = numberToHexUnpadded2(num2); - if (Number.parseInt(hex[0], 16) & 8) - hex = "00" + hex; - if (hex.length & 1) - throw new E("unexpected DER parsing assertion: unpadded hex"); - return hex; - }, - decode(data) { - const { Err: E } = DER2; - if (data[0] & 128) - throw new E("invalid signature integer: negative"); - if (data[0] === 0 && !(data[1] & 128)) - throw new E("invalid signature integer: unnecessary leading zero"); - return bytesToNumberBE2(data); + function getSetCookies(headers) { + webidl.argumentLengthCheck(arguments, 1, "getSetCookies"); + brandChecks(headers); + const cookies = headers.getSetCookie(); + if (!cookies) { + return []; + } + return cookies.map((pair) => parseSetCookie(pair)); } - }, - toSig(hex) { - const { Err: E, _int: int, _tlv: tlv } = DER2; - const data = ensureBytes2("signature", hex); - const { v: seqBytes, l: seqLeftBytes } = tlv.decode(48, data); - if (seqLeftBytes.length) - throw new E("invalid signature: left bytes after parsing"); - const { v: rBytes, l: rLeftBytes } = tlv.decode(2, seqBytes); - const { v: sBytes, l: sLeftBytes } = tlv.decode(2, rLeftBytes); - if (sLeftBytes.length) - throw new E("invalid signature: left bytes after parsing"); - return { r: int.decode(rBytes), s: int.decode(sBytes) }; - }, - hexFromSig(sig) { - const { _tlv: tlv, _int: int } = DER2; - const rs = tlv.encode(2, int.encode(sig.r)); - const ss = tlv.encode(2, int.encode(sig.s)); - const seq = rs + ss; - return tlv.encode(48, seq); - } -}; -function numToSizedHex2(num2, size5) { - return bytesToHex3(numberToBytesBE2(num2, size5)); -} -var _0n10 = BigInt(0); -var _1n10 = BigInt(1); -var _2n6 = BigInt(2); -var _3n4 = BigInt(3); -var _4n4 = BigInt(4); -function weierstrassPoints2(opts) { - const CURVE = validatePointOpts2(opts); - const { Fp } = CURVE; - const Fn2 = Field2(CURVE.n, CURVE.nBitLength); - const toBytes4 = CURVE.toBytes || ((_c, point, _isCompressed) => { - const a = point.toAffine(); - return concatBytes4(Uint8Array.from([4]), Fp.toBytes(a.x), Fp.toBytes(a.y)); - }); - const fromBytes4 = CURVE.fromBytes || ((bytes) => { - const tail = bytes.subarray(1); - const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES)); - const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES)); - return { x, y }; - }); - function weierstrassEquation(x) { - const { a, b } = CURVE; - const x2 = Fp.sqr(x); - const x3 = Fp.mul(x2, x); - return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); - } - function isValidXY(x, y) { - const left = Fp.sqr(y); - const right = weierstrassEquation(x); - return Fp.eql(left, right); - } - if (!isValidXY(CURVE.Gx, CURVE.Gy)) - throw new Error("bad curve params: generator point"); - const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n4), _4n4); - const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27)); - if (Fp.is0(Fp.add(_4a3, _27b2))) - throw new Error("bad curve params: a or b"); - function isWithinCurveOrder(num2) { - return inRange2(num2, _1n10, CURVE.n); - } - function normPrivateKeyToScalar(key) { - const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n: N } = CURVE; - if (lengths && typeof key !== "bigint") { - if (isBytes3(key)) - key = bytesToHex3(key); - if (typeof key !== "string" || !lengths.includes(key.length)) - throw new Error("invalid private key"); - key = key.padStart(nByteLength * 2, "0"); + function parseCookie(cookie) { + cookie = webidl.converters.DOMString(cookie); + return parseSetCookie(cookie); } - let num2; - try { - num2 = typeof key === "bigint" ? key : bytesToNumberBE2(ensureBytes2("private key", key, nByteLength)); - } catch (error) { - throw new Error("invalid private key, expected hex or " + nByteLength + " bytes, got " + typeof key); + function setCookie(headers, cookie) { + webidl.argumentLengthCheck(arguments, 2, "setCookie"); + brandChecks(headers); + cookie = webidl.converters.Cookie(cookie); + const str = stringify4(cookie); + if (str) { + headers.append("set-cookie", str, true); + } } - if (wrapPrivateKey) - num2 = mod2(num2, N); - aInRange2("private key", num2, _1n10, N); - return num2; + webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: () => null + } + ]); + webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: "name" + }, + { + converter: webidl.converters.DOMString, + key: "value" + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === "number") { + return webidl.converters["unsigned long long"](value); + } + return new Date(value); + }), + key: "expires", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters["long long"]), + key: "maxAge", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "secure", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "httpOnly", + defaultValue: () => null + }, + { + converter: webidl.converters.USVString, + key: "sameSite", + allowedValues: ["Strict", "Lax", "None"] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: "unparsed", + defaultValue: () => [] + } + ]); + module.exports = { + getCookies, + deleteCookie, + getSetCookies, + setCookie, + parseCookie + }; + } +}); + +// node_modules/undici/lib/web/websocket/events.js +var require_events = __commonJS({ + "node_modules/undici/lib/web/websocket/events.js"(exports, module) { + "use strict"; + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util(); + var { kConstruct } = require_symbols(); + var MessageEvent = class _MessageEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + if (type === kConstruct) { + super(arguments[1], arguments[2]); + webidl.util.markAsUncloneable(this); + return; + } + const prefix = "MessageEvent constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + type = webidl.converters.DOMString(type, prefix, "type"); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, "eventInitDict"); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); + } + get data() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.data; + } + get origin() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.origin; + } + get lastEventId() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.lastEventId; + } + get source() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.source; + } + get ports() { + webidl.brandCheck(this, _MessageEvent); + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports); + } + return this.#eventInit.ports; + } + initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { + webidl.brandCheck(this, _MessageEvent); + webidl.argumentLengthCheck(arguments, 1, "MessageEvent.initMessageEvent"); + return new _MessageEvent(type, { + bubbles, + cancelable, + data, + origin, + lastEventId, + source, + ports + }); + } + static createFastMessageEvent(type, init) { + const messageEvent = new _MessageEvent(kConstruct, type, init); + messageEvent.#eventInit = init; + messageEvent.#eventInit.data ??= null; + messageEvent.#eventInit.origin ??= ""; + messageEvent.#eventInit.lastEventId ??= ""; + messageEvent.#eventInit.source ??= null; + messageEvent.#eventInit.ports ??= []; + return messageEvent; + } + }; + var { createFastMessageEvent } = MessageEvent; + delete MessageEvent.createFastMessageEvent; + var CloseEvent = class _CloseEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + const prefix = "CloseEvent constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + type = webidl.converters.DOMString(type, prefix, "type"); + eventInitDict = webidl.converters.CloseEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); + } + get wasClean() { + webidl.brandCheck(this, _CloseEvent); + return this.#eventInit.wasClean; + } + get code() { + webidl.brandCheck(this, _CloseEvent); + return this.#eventInit.code; + } + get reason() { + webidl.brandCheck(this, _CloseEvent); + return this.#eventInit.reason; + } + }; + var ErrorEvent = class _ErrorEvent extends Event { + #eventInit; + constructor(type, eventInitDict) { + const prefix = "ErrorEvent constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + super(type, eventInitDict); + webidl.util.markAsUncloneable(this); + type = webidl.converters.DOMString(type, prefix, "type"); + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); + this.#eventInit = eventInitDict; + } + get message() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.message; + } + get filename() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.filename; + } + get lineno() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.lineno; + } + get colno() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.colno; + } + get error() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.error; + } + }; + Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: "MessageEvent", + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty + }); + Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: "CloseEvent", + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty + }); + Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: "ErrorEvent", + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty + }); + webidl.converters.MessagePort = webidl.interfaceConverter( + webidl.is.MessagePort, + "MessagePort" + ); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.MessagePort + ); + var eventInit = [ + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: () => false + } + ]; + webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "data", + converter: webidl.converters.any, + defaultValue: () => null + }, + { + key: "origin", + converter: webidl.converters.USVString, + defaultValue: () => "" + }, + { + key: "lastEventId", + converter: webidl.converters.DOMString, + defaultValue: () => "" + }, + { + key: "source", + // Node doesn't implement WindowProxy or ServiceWorker, so the only + // valid value for source is a MessagePort. + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: () => null + }, + { + key: "ports", + converter: webidl.converters["sequence"], + defaultValue: () => [] + } + ]); + webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "wasClean", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "code", + converter: webidl.converters["unsigned short"], + defaultValue: () => 0 + }, + { + key: "reason", + converter: webidl.converters.USVString, + defaultValue: () => "" + } + ]); + webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "message", + converter: webidl.converters.DOMString, + defaultValue: () => "" + }, + { + key: "filename", + converter: webidl.converters.USVString, + defaultValue: () => "" + }, + { + key: "lineno", + converter: webidl.converters["unsigned long"], + defaultValue: () => 0 + }, + { + key: "colno", + converter: webidl.converters["unsigned long"], + defaultValue: () => 0 + }, + { + key: "error", + converter: webidl.converters.any + } + ]); + module.exports = { + MessageEvent, + CloseEvent, + ErrorEvent, + createFastMessageEvent + }; } - function aprjpoint(other) { - if (!(other instanceof Point3)) - throw new Error("ProjectivePoint expected"); +}); + +// node_modules/undici/lib/web/websocket/constants.js +var require_constants6 = __commonJS({ + "node_modules/undici/lib/web/websocket/constants.js"(exports, module) { + "use strict"; + var uid2 = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + var staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + var states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; + var sentCloseFrameState = { + SENT: 1, + RECEIVED: 2 + }; + var opcodes = { + CONTINUATION: 0, + TEXT: 1, + BINARY: 2, + CLOSE: 8, + PING: 9, + PONG: 10 + }; + var maxUnsigned16Bit = 65535; + var parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; + var emptyBuffer = Buffer.allocUnsafe(0); + var sendHints = { + text: 1, + typedArray: 2, + arrayBuffer: 3, + blob: 4 + }; + module.exports = { + uid: uid2, + sentCloseFrameState, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer, + sendHints + }; } - const toAffineMemo = memoized2((p, iz) => { - const { px: x, py: y, pz: z } = p; - if (Fp.eql(z, Fp.ONE)) - return { x, y }; - const is0 = p.is0(); - if (iz == null) - iz = is0 ? Fp.ONE : Fp.inv(z); - const ax = Fp.mul(x, iz); - const ay = Fp.mul(y, iz); - const zz = Fp.mul(z, iz); - if (is0) - return { x: Fp.ZERO, y: Fp.ZERO }; - if (!Fp.eql(zz, Fp.ONE)) - throw new Error("invZ was invalid"); - return { x: ax, y: ay }; - }); - const assertValidMemo = memoized2((p) => { - if (p.is0()) { - if (CURVE.allowInfinityPoint && !Fp.is0(p.py)) - return; - throw new Error("bad point: ZERO"); - } - const { x, y } = p.toAffine(); - if (!Fp.isValid(x) || !Fp.isValid(y)) - throw new Error("bad point: x or y not FE"); - if (!isValidXY(x, y)) - throw new Error("bad point: equation left != right"); - if (!p.isTorsionFree()) - throw new Error("bad point: not in prime-order subgroup"); - return true; - }); - class Point3 { - constructor(px, py, pz) { - if (px == null || !Fp.isValid(px)) - throw new Error("x required"); - if (py == null || !Fp.isValid(py) || Fp.is0(py)) - throw new Error("y required"); - if (pz == null || !Fp.isValid(pz)) - throw new Error("z required"); - this.px = px; - this.py = py; - this.pz = pz; - Object.freeze(this); +}); + +// node_modules/undici/lib/web/websocket/util.js +var require_util5 = __commonJS({ + "node_modules/undici/lib/web/websocket/util.js"(exports, module) { + "use strict"; + var { states, opcodes } = require_constants6(); + var { isUtf8 } = __require("buffer"); + var { removeHTTPWhitespace } = require_data_url(); + var { collectASequenceOfCodePointsFast } = require_infra(); + function isConnecting(readyState) { + return readyState === states.CONNECTING; } - // Does not validate if the point is on-curve. - // Use fromHex instead, or call assertValidity() later. - static fromAffine(p) { - const { x, y } = p || {}; - if (!p || !Fp.isValid(x) || !Fp.isValid(y)) - throw new Error("invalid affine point"); - if (p instanceof Point3) - throw new Error("projective point not allowed"); - const is0 = (i) => Fp.eql(i, Fp.ZERO); - if (is0(x) && is0(y)) - return Point3.ZERO; - return new Point3(x, y, Fp.ONE); + function isEstablished(readyState) { + return readyState === states.OPEN; } - get x() { - return this.toAffine().x; + function isClosing(readyState) { + return readyState === states.CLOSING; } - get y() { - return this.toAffine().y; + function isClosed(readyState) { + return readyState === states.CLOSED; } - /** - * Takes a bunch of Projective Points but executes only one - * inversion on all of them. Inversion is very slow operation, - * so this improves performance massively. - * Optimization: converts a list of projective points to a list of identical points with Z=1. - */ - static normalizeZ(points) { - const toInv = FpInvertBatch2(Fp, points.map((p) => p.pz)); - return points.map((p, i) => p.toAffine(toInv[i])).map(Point3.fromAffine); + function fireEvent(e7, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { + const event = eventFactory(e7, eventInitDict); + target.dispatchEvent(event); } - /** - * Converts hash string or Uint8Array to Point. - * @param hex short/long ECDSA hex - */ - static fromHex(hex) { - const P2 = Point3.fromAffine(fromBytes4(ensureBytes2("pointHex", hex))); - P2.assertValidity(); - return P2; + function websocketMessageReceived(handler, type, data) { + handler.onMessage(type, data); } - // Multiplies generator point by privateKey. - static fromPrivateKey(privateKey) { - return Point3.BASE.multiply(normPrivateKeyToScalar(privateKey)); + function toArrayBuffer2(buffer2) { + if (buffer2.byteLength === buffer2.buffer.byteLength) { + return buffer2.buffer; + } + return new Uint8Array(buffer2).buffer; } - // Multiscalar Multiplication - static msm(points, scalars) { - return pippenger2(Point3, Fn2, points, scalars); + function isValidSubprotocol(protocol) { + if (protocol.length === 0) { + return false; + } + for (let i = 0; i < protocol.length; ++i) { + const code = protocol.charCodeAt(i); + if (code < 33 || // CTL, contains SP (0x20) and HT (0x09) + code > 126 || code === 34 || // " + code === 40 || // ( + code === 41 || // ) + code === 44 || // , + code === 47 || // / + code === 58 || // : + code === 59 || // ; + code === 60 || // < + code === 61 || // = + code === 62 || // > + code === 63 || // ? + code === 64 || // @ + code === 91 || // [ + code === 92 || // \ + code === 93 || // ] + code === 123 || // { + code === 125) { + return false; + } + } + return true; } - // "Private method", don't use it directly - _setWindowSize(windowSize) { - wnaf.setWindowSize(this, windowSize); + function isValidStatusCode(code) { + if (code >= 1e3 && code < 1015) { + return code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006; + } + return code >= 3e3 && code <= 4999; } - // A point on curve is valid if it conforms to equation. - assertValidity() { - assertValidMemo(this); + function isControlFrame(opcode) { + return opcode === opcodes.CLOSE || opcode === opcodes.PING || opcode === opcodes.PONG; } - hasEvenY() { - const { y } = this.toAffine(); - if (Fp.isOdd) - return !Fp.isOdd(y); - throw new Error("Field doesn't support isOdd"); + function isContinuationFrame(opcode) { + return opcode === opcodes.CONTINUATION; } - /** - * Compare one point to another. - */ - equals(other) { - aprjpoint(other); - const { px: X1, py: Y1, pz: Z1 } = this; - const { px: X2, py: Y2, pz: Z2 } = other; - const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1)); - const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1)); - return U1 && U2; + function isTextBinaryFrame(opcode) { + return opcode === opcodes.TEXT || opcode === opcodes.BINARY; } - /** - * Flips point to one corresponding to (x, -y) in Affine coordinates. - */ - negate() { - return new Point3(this.px, Fp.neg(this.py), this.pz); + function isValidOpcode(opcode) { + return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode); } - // Renes-Costello-Batina exception-free doubling formula. - // There is 30% faster Jacobian formula, but it is not complete. - // https://eprint.iacr.org/2015/1060, algorithm 3 - // Cost: 8M + 3S + 3*a + 2*b3 + 15add. - double() { - const { a, b } = CURVE; - const b3 = Fp.mul(b, _3n4); - const { px: X1, py: Y1, pz: Z1 } = this; - let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; - let t0 = Fp.mul(X1, X1); - let t1 = Fp.mul(Y1, Y1); - let t2 = Fp.mul(Z1, Z1); - let t3 = Fp.mul(X1, Y1); - t3 = Fp.add(t3, t3); - Z3 = Fp.mul(X1, Z1); - Z3 = Fp.add(Z3, Z3); - X3 = Fp.mul(a, Z3); - Y3 = Fp.mul(b3, t2); - Y3 = Fp.add(X3, Y3); - X3 = Fp.sub(t1, Y3); - Y3 = Fp.add(t1, Y3); - Y3 = Fp.mul(X3, Y3); - X3 = Fp.mul(t3, X3); - Z3 = Fp.mul(b3, Z3); - t2 = Fp.mul(a, t2); - t3 = Fp.sub(t0, t2); - t3 = Fp.mul(a, t3); - t3 = Fp.add(t3, Z3); - Z3 = Fp.add(t0, t0); - t0 = Fp.add(Z3, t0); - t0 = Fp.add(t0, t2); - t0 = Fp.mul(t0, t3); - Y3 = Fp.add(Y3, t0); - t2 = Fp.mul(Y1, Z1); - t2 = Fp.add(t2, t2); - t0 = Fp.mul(t2, t3); - X3 = Fp.sub(X3, t0); - Z3 = Fp.mul(t2, t1); - Z3 = Fp.add(Z3, Z3); - Z3 = Fp.add(Z3, Z3); - return new Point3(X3, Y3, Z3); + function parseExtensions(extensions) { + const position = { position: 0 }; + const extensionList = /* @__PURE__ */ new Map(); + while (position.position < extensions.length) { + const pair = collectASequenceOfCodePointsFast(";", extensions, position); + const [name, value = ""] = pair.split("=", 2); + extensionList.set( + removeHTTPWhitespace(name, true, false), + removeHTTPWhitespace(value, false, true) + ); + position.position++; + } + return extensionList; } - // Renes-Costello-Batina exception-free addition formula. - // There is 30% faster Jacobian formula, but it is not complete. - // https://eprint.iacr.org/2015/1060, algorithm 1 - // Cost: 12M + 0S + 3*a + 3*b3 + 23add. - add(other) { - aprjpoint(other); - const { px: X1, py: Y1, pz: Z1 } = this; - const { px: X2, py: Y2, pz: Z2 } = other; - let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; - const a = CURVE.a; - const b3 = Fp.mul(CURVE.b, _3n4); - let t0 = Fp.mul(X1, X2); - let t1 = Fp.mul(Y1, Y2); - let t2 = Fp.mul(Z1, Z2); - let t3 = Fp.add(X1, Y1); - let t4 = Fp.add(X2, Y2); - t3 = Fp.mul(t3, t4); - t4 = Fp.add(t0, t1); - t3 = Fp.sub(t3, t4); - t4 = Fp.add(X1, Z1); - let t5 = Fp.add(X2, Z2); - t4 = Fp.mul(t4, t5); - t5 = Fp.add(t0, t2); - t4 = Fp.sub(t4, t5); - t5 = Fp.add(Y1, Z1); - X3 = Fp.add(Y2, Z2); - t5 = Fp.mul(t5, X3); - X3 = Fp.add(t1, t2); - t5 = Fp.sub(t5, X3); - Z3 = Fp.mul(a, t4); - X3 = Fp.mul(b3, t2); - Z3 = Fp.add(X3, Z3); - X3 = Fp.sub(t1, Z3); - Z3 = Fp.add(t1, Z3); - Y3 = Fp.mul(X3, Z3); - t1 = Fp.add(t0, t0); - t1 = Fp.add(t1, t0); - t2 = Fp.mul(a, t2); - t4 = Fp.mul(b3, t4); - t1 = Fp.add(t1, t2); - t2 = Fp.sub(t0, t2); - t2 = Fp.mul(a, t2); - t4 = Fp.add(t4, t2); - t0 = Fp.mul(t1, t4); - Y3 = Fp.add(Y3, t0); - t0 = Fp.mul(t5, t4); - X3 = Fp.mul(t3, X3); - X3 = Fp.sub(X3, t0); - t0 = Fp.mul(t3, t1); - Z3 = Fp.mul(t5, Z3); - Z3 = Fp.add(Z3, t0); - return new Point3(X3, Y3, Z3); + function isValidClientWindowBits(value) { + if (value.length === 0) { + return false; + } + for (let i = 0; i < value.length; i++) { + const byte = value.charCodeAt(i); + if (byte < 48 || byte > 57) { + return false; + } + } + const num2 = Number.parseInt(value, 10); + return num2 >= 8 && num2 <= 15; } - subtract(other) { - return this.add(other.negate()); + function getURLRecord(url, baseURL) { + let urlRecord; + try { + urlRecord = new URL(url, baseURL); + } catch (e7) { + throw new DOMException(e7, "SyntaxError"); + } + if (urlRecord.protocol === "http:") { + urlRecord.protocol = "ws:"; + } else if (urlRecord.protocol === "https:") { + urlRecord.protocol = "wss:"; + } + if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { + throw new DOMException("expected a ws: or wss: url", "SyntaxError"); + } + if (urlRecord.hash.length || urlRecord.href.endsWith("#")) { + throw new DOMException("hash", "SyntaxError"); + } + return urlRecord; } - is0() { - return this.equals(Point3.ZERO); + function validateCloseCodeAndReason(code, reason) { + if (code !== null) { + if (code !== 1e3 && (code < 3e3 || code > 4999)) { + throw new DOMException("invalid code", "InvalidAccessError"); + } + } + if (reason !== null) { + const reasonBytesLength = Buffer.byteLength(reason); + if (reasonBytesLength > 123) { + throw new DOMException(`Reason must be less than 123 bytes; received ${reasonBytesLength}`, "SyntaxError"); + } + } } - wNAF(n) { - return wnaf.wNAFCached(this, n, Point3.normalizeZ); + var utf8Decode = (() => { + if (typeof process.versions.icu === "string") { + const fatalDecoder = new TextDecoder("utf-8", { fatal: true }); + return fatalDecoder.decode.bind(fatalDecoder); + } + return function(buffer2) { + if (isUtf8(buffer2)) { + return buffer2.toString("utf-8"); + } + throw new TypeError("Invalid utf-8 received."); + }; + })(); + module.exports = { + isConnecting, + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isContinuationFrame, + isTextBinaryFrame, + isValidOpcode, + parseExtensions, + isValidClientWindowBits, + toArrayBuffer: toArrayBuffer2, + getURLRecord, + validateCloseCodeAndReason + }; + } +}); + +// node_modules/undici/lib/web/websocket/frame.js +var require_frame = __commonJS({ + "node_modules/undici/lib/web/websocket/frame.js"(exports, module) { + "use strict"; + var { runtimeFeatures } = require_runtime_features(); + var { maxUnsigned16Bit, opcodes } = require_constants6(); + var BUFFER_SIZE = 8 * 1024; + var buffer2 = null; + var bufIdx = BUFFER_SIZE; + var randomFillSync = runtimeFeatures.has("crypto") ? __require("crypto").randomFillSync : function randomFillSync2(buffer3, _offset, _size) { + for (let i = 0; i < buffer3.length; ++i) { + buffer3[i] = Math.random() * 255 | 0; + } + return buffer3; + }; + function generateMask() { + if (bufIdx === BUFFER_SIZE) { + bufIdx = 0; + randomFillSync(buffer2 ??= Buffer.allocUnsafeSlow(BUFFER_SIZE), 0, BUFFER_SIZE); + } + return [buffer2[bufIdx++], buffer2[bufIdx++], buffer2[bufIdx++], buffer2[bufIdx++]]; } - /** - * Non-constant-time multiplication. Uses double-and-add algorithm. - * It's faster, but should only be used when you don't care about - * an exposed private key e.g. sig verification, which works over *public* keys. - */ - multiplyUnsafe(sc) { - const { endo: endo2, n: N } = CURVE; - aInRange2("scalar", sc, _0n10, N); - const I = Point3.ZERO; - if (sc === _0n10) - return I; - if (this.is0() || sc === _1n10) - return this; - if (!endo2 || wnaf.hasPrecomputes(this)) - return wnaf.wNAFCachedUnsafe(this, sc, Point3.normalizeZ); - let { k1neg, k1, k2neg, k2 } = endo2.splitScalar(sc); - let k1p = I; - let k2p = I; - let d = this; - while (k1 > _0n10 || k2 > _0n10) { - if (k1 & _1n10) - k1p = k1p.add(d); - if (k2 & _1n10) - k2p = k2p.add(d); - d = d.double(); - k1 >>= _1n10; - k2 >>= _1n10; + var WebsocketFrameSend = class { + /** + * @param {Buffer|undefined} data + */ + constructor(data) { + this.frameData = data; + } + createFrame(opcode) { + const frameData = this.frameData; + const maskKey = generateMask(); + const bodyLength = frameData?.byteLength ?? 0; + let payloadLength = bodyLength; + let offset = 6; + if (bodyLength > maxUnsigned16Bit) { + offset += 8; + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; + payloadLength = 126; + } + const buffer3 = Buffer.allocUnsafe(bodyLength + offset); + buffer3[0] = buffer3[1] = 0; + buffer3[0] |= 128; + buffer3[0] = (buffer3[0] & 240) + opcode; + buffer3[offset - 4] = maskKey[0]; + buffer3[offset - 3] = maskKey[1]; + buffer3[offset - 2] = maskKey[2]; + buffer3[offset - 1] = maskKey[3]; + buffer3[1] = payloadLength; + if (payloadLength === 126) { + buffer3.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + buffer3[2] = buffer3[3] = 0; + buffer3.writeUIntBE(bodyLength, 4, 6); + } + buffer3[1] |= 128; + for (let i = 0; i < bodyLength; ++i) { + buffer3[offset + i] = frameData[i] ^ maskKey[i & 3]; + } + return buffer3; } - if (k1neg) - k1p = k1p.negate(); - if (k2neg) - k2p = k2p.negate(); - k2p = new Point3(Fp.mul(k2p.px, endo2.beta), k2p.py, k2p.pz); - return k1p.add(k2p); + /** + * @param {Uint8Array} buffer + */ + static createFastTextFrame(buffer3) { + const maskKey = generateMask(); + const bodyLength = buffer3.length; + for (let i = 0; i < bodyLength; ++i) { + buffer3[i] ^= maskKey[i & 3]; + } + let payloadLength = bodyLength; + let offset = 6; + if (bodyLength > maxUnsigned16Bit) { + offset += 8; + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; + payloadLength = 126; + } + const head = Buffer.allocUnsafeSlow(offset); + head[0] = 128 | opcodes.TEXT; + head[1] = payloadLength | 128; + head[offset - 4] = maskKey[0]; + head[offset - 3] = maskKey[1]; + head[offset - 2] = maskKey[2]; + head[offset - 1] = maskKey[3]; + if (payloadLength === 126) { + head.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + head[2] = head[3] = 0; + head.writeUIntBE(bodyLength, 4, 6); + } + return [head, buffer3]; + } + }; + module.exports = { + WebsocketFrameSend, + generateMask + // for benchmark + }; + } +}); + +// node_modules/undici/lib/web/websocket/connection.js +var require_connection = __commonJS({ + "node_modules/undici/lib/web/websocket/connection.js"(exports, module) { + "use strict"; + var { uid: uid2, states, sentCloseFrameState, emptyBuffer, opcodes } = require_constants6(); + var { parseExtensions, isClosed, isClosing, isEstablished, isConnecting, validateCloseCodeAndReason } = require_util5(); + var { makeRequest } = require_request2(); + var { fetching } = require_fetch(); + var { Headers: Headers2, getHeadersList } = require_headers(); + var { getDecodeSplit } = require_util2(); + var { WebsocketFrameSend } = require_frame(); + var assert8 = __require("assert"); + var { runtimeFeatures } = require_runtime_features(); + var crypto4 = runtimeFeatures.has("crypto") ? __require("crypto") : null; + var warningEmitted = false; + function establishWebSocketConnection(url, protocols, client, handler, options) { + const requestURL = url; + requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; + const request = makeRequest({ + urlList: [requestURL], + client, + serviceWorkers: "none", + referrer: "no-referrer", + mode: "websocket", + credentials: "include", + cache: "no-store", + redirect: "error", + useURLCredentials: true + }); + if (options.headers) { + const headersList = getHeadersList(new Headers2(options.headers)); + request.headersList = headersList; + } + const keyValue = crypto4.randomBytes(16).toString("base64"); + request.headersList.append("sec-websocket-key", keyValue, true); + request.headersList.append("sec-websocket-version", "13", true); + for (const protocol of protocols) { + request.headersList.append("sec-websocket-protocol", protocol, true); + } + const permessageDeflate = "permessage-deflate; client_max_window_bits"; + request.headersList.append("sec-websocket-extensions", permessageDeflate, true); + const controller = fetching({ + request, + useParallelQueue: true, + dispatcher: options.dispatcher, + processResponse(response) { + if (response.type === "error" || response.status !== 101) { + if (response.socket?.session == null) { + failWebsocketConnection(handler, 1002, "Received network error or non-101 status code.", response.error); + return; + } + if (response.status !== 200) { + failWebsocketConnection(handler, 1002, "Received network error or non-200 status code.", response.error); + return; + } + } + if (warningEmitted === false && response.socket?.session != null) { + process.emitWarning("WebSocket over HTTP2 is experimental, and subject to change.", "ExperimentalWarning"); + warningEmitted = true; + } + if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(handler, 1002, "Server did not respond with sent protocols."); + return; + } + if (response.socket.session == null && response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { + failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to "websocket".'); + return; + } + if (response.socket.session == null && response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { + failWebsocketConnection(handler, 1002, 'Server did not set Connection header to "upgrade".'); + return; + } + const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); + const digest = crypto4.hash("sha1", keyValue + uid2, "base64"); + if (secWSAccept !== digest) { + failWebsocketConnection(handler, 1002, "Incorrect hash received in Sec-WebSocket-Accept header."); + return; + } + const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); + let extensions; + if (secExtension !== null) { + extensions = parseExtensions(secExtension); + if (!extensions.has("permessage-deflate")) { + failWebsocketConnection(handler, 1002, "Sec-WebSocket-Extensions header does not match."); + return; + } + } + const secProtocol = response.headersList.get("Sec-WebSocket-Protocol"); + if (secProtocol !== null) { + const requestProtocols = getDecodeSplit("sec-websocket-protocol", request.headersList); + if (!requestProtocols.includes(secProtocol)) { + failWebsocketConnection(handler, 1002, "Protocol was not set in the opening handshake."); + return; + } + } + response.socket.on("data", handler.onSocketData); + response.socket.on("close", handler.onSocketClose); + response.socket.on("error", handler.onSocketError); + handler.wasEverConnected = true; + handler.onConnectionEstablished(response, extensions); + } + }); + return controller; } - /** - * Constant time multiplication. - * Uses wNAF method. Windowed method may be 10% faster, - * but takes 2x longer to generate and consumes 2x memory. - * Uses precomputes when available. - * Uses endomorphism for Koblitz curves. - * @param scalar by which the point would be multiplied - * @returns New point - */ - multiply(scalar) { - const { endo: endo2, n: N } = CURVE; - aInRange2("scalar", scalar, _1n10, N); - let point, fake; - if (endo2) { - const { k1neg, k1, k2neg, k2 } = endo2.splitScalar(scalar); - let { p: k1p, f: f1p } = this.wNAF(k1); - let { p: k2p, f: f2p } = this.wNAF(k2); - k1p = wnaf.constTimeNegate(k1neg, k1p); - k2p = wnaf.constTimeNegate(k2neg, k2p); - k2p = new Point3(Fp.mul(k2p.px, endo2.beta), k2p.py, k2p.pz); - point = k1p.add(k2p); - fake = f1p.add(f2p); + function closeWebSocketConnection(object, code, reason, validate6 = false) { + code ??= null; + reason ??= ""; + if (validate6) validateCloseCodeAndReason(code, reason); + if (isClosed(object.readyState) || isClosing(object.readyState)) { + } else if (!isEstablished(object.readyState)) { + failWebsocketConnection(object); + object.readyState = states.CLOSING; + } else if (!object.closeState.has(sentCloseFrameState.SENT) && !object.closeState.has(sentCloseFrameState.RECEIVED)) { + const frame = new WebsocketFrameSend(); + if (reason.length !== 0 && code === null) { + code = 1e3; + } + assert8(code === null || Number.isInteger(code)); + if (code === null && reason.length === 0) { + frame.frameData = emptyBuffer; + } else if (code !== null && reason === null) { + frame.frameData = Buffer.allocUnsafe(2); + frame.frameData.writeUInt16BE(code, 0); + } else if (code !== null && reason !== null) { + frame.frameData = Buffer.allocUnsafe(2 + Buffer.byteLength(reason)); + frame.frameData.writeUInt16BE(code, 0); + frame.frameData.write(reason, 2, "utf-8"); + } else { + frame.frameData = emptyBuffer; + } + object.socket.write(frame.createFrame(opcodes.CLOSE)); + object.closeState.add(sentCloseFrameState.SENT); + object.readyState = states.CLOSING; } else { - const { p, f } = this.wNAF(scalar); - point = p; - fake = f; + object.readyState = states.CLOSING; } - return Point3.normalizeZ([point, fake])[0]; - } - /** - * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly. - * Not using Strauss-Shamir trick: precomputation tables are faster. - * The trick could be useful if both P and Q are not G (not in our case). - * @returns non-zero affine point - */ - multiplyAndAddUnsafe(Q, a, b) { - const G = Point3.BASE; - const mul = (P2, a2) => a2 === _0n10 || a2 === _1n10 || !P2.equals(G) ? P2.multiplyUnsafe(a2) : P2.multiply(a2); - const sum = mul(this, a).add(mul(Q, b)); - return sum.is0() ? void 0 : sum; - } - // Converts Projective point to affine (x, y) coordinates. - // Can accept precomputed Z^-1 - for example, from invertBatch. - // (x, y, z) ∋ (x=x/z, y=y/z) - toAffine(iz) { - return toAffineMemo(this, iz); - } - isTorsionFree() { - const { h: cofactor, isTorsionFree } = CURVE; - if (cofactor === _1n10) - return true; - if (isTorsionFree) - return isTorsionFree(Point3, this); - throw new Error("isTorsionFree() has not been declared for the elliptic curve"); - } - clearCofactor() { - const { h: cofactor, clearCofactor } = CURVE; - if (cofactor === _1n10) - return this; - if (clearCofactor) - return clearCofactor(Point3, this); - return this.multiplyUnsafe(CURVE.h); - } - toRawBytes(isCompressed = true) { - abool2("isCompressed", isCompressed); - this.assertValidity(); - return toBytes4(Point3, this, isCompressed); } - toHex(isCompressed = true) { - abool2("isCompressed", isCompressed); - return bytesToHex3(this.toRawBytes(isCompressed)); + function failWebsocketConnection(handler, code, reason, cause) { + if (isEstablished(handler.readyState)) { + closeWebSocketConnection(handler, code, reason, false); + } + handler.controller.abort(); + if (isConnecting(handler.readyState)) { + handler.onSocketClose(); + } else if (handler.socket?.destroyed === false) { + handler.socket.destroy(); + } } + module.exports = { + establishWebSocketConnection, + failWebsocketConnection, + closeWebSocketConnection + }; } - Point3.BASE = new Point3(CURVE.Gx, CURVE.Gy, Fp.ONE); - Point3.ZERO = new Point3(Fp.ZERO, Fp.ONE, Fp.ZERO); - const { endo, nBitLength } = CURVE; - const wnaf = wNAF2(Point3, endo ? Math.ceil(nBitLength / 2) : nBitLength); - return { - CURVE, - ProjectivePoint: Point3, - normPrivateKeyToScalar, - weierstrassEquation, - isWithinCurveOrder - }; -} -function validateOpts2(curve) { - const opts = validateBasic2(curve); - validateObject2(opts, { - hash: "hash", - hmac: "function", - randomBytes: "function" - }, { - bits2int: "function", - bits2int_modN: "function", - lowS: "boolean" - }); - return Object.freeze({ lowS: true, ...opts }); -} -function weierstrass2(curveDef) { - const CURVE = validateOpts2(curveDef); - const { Fp, n: CURVE_ORDER, nByteLength, nBitLength } = CURVE; - const compressedLen = Fp.BYTES + 1; - const uncompressedLen = 2 * Fp.BYTES + 1; - function modN2(a) { - return mod2(a, CURVE_ORDER); - } - function invN(a) { - return invert2(a, CURVE_ORDER); +}); + +// node_modules/undici/lib/web/websocket/permessage-deflate.js +var require_permessage_deflate2 = __commonJS({ + "node_modules/undici/lib/web/websocket/permessage-deflate.js"(exports, module) { + "use strict"; + var { createInflateRaw, Z_DEFAULT_WINDOWBITS } = __require("zlib"); + var { isValidClientWindowBits } = require_util5(); + var { MessageSizeExceededError } = require_errors(); + var tail = Buffer.from([0, 0, 255, 255]); + var kBuffer = /* @__PURE__ */ Symbol("kBuffer"); + var kLength = /* @__PURE__ */ Symbol("kLength"); + var PerMessageDeflate2 = class { + /** @type {import('node:zlib').InflateRaw} */ + #inflate; + #options = {}; + #maxPayloadSize = 0; + /** + * @param {Map} extensions + */ + constructor(extensions, options) { + this.#options.serverNoContextTakeover = extensions.has("server_no_context_takeover"); + this.#options.serverMaxWindowBits = extensions.get("server_max_window_bits"); + this.#maxPayloadSize = options.maxPayloadSize; + } + /** + * Decompress a compressed payload. + * @param {Buffer} chunk Compressed data + * @param {boolean} fin Final fragment flag + * @param {Function} callback Callback function + */ + decompress(chunk, fin, callback) { + if (!this.#inflate) { + let windowBits = Z_DEFAULT_WINDOWBITS; + if (this.#options.serverMaxWindowBits) { + if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) { + callback(new Error("Invalid server_max_window_bits")); + return; + } + windowBits = Number.parseInt(this.#options.serverMaxWindowBits); + } + try { + this.#inflate = createInflateRaw({ windowBits }); + } catch (err) { + callback(err); + return; + } + this.#inflate[kBuffer] = []; + this.#inflate[kLength] = 0; + this.#inflate.on("data", (data) => { + this.#inflate[kLength] += data.length; + if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) { + callback(new MessageSizeExceededError()); + this.#inflate.removeAllListeners(); + this.#inflate = null; + return; + } + this.#inflate[kBuffer].push(data); + }); + this.#inflate.on("error", (err) => { + this.#inflate = null; + callback(err); + }); + } + this.#inflate.write(chunk); + if (fin) { + this.#inflate.write(tail); + } + this.#inflate.flush(() => { + if (!this.#inflate) { + return; + } + const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]); + this.#inflate[kBuffer].length = 0; + this.#inflate[kLength] = 0; + callback(null, full); + }); + } + }; + module.exports = { PerMessageDeflate: PerMessageDeflate2 }; } - const { ProjectivePoint: Point3, normPrivateKeyToScalar, weierstrassEquation, isWithinCurveOrder } = weierstrassPoints2({ - ...CURVE, - toBytes(_c, point, isCompressed) { - const a = point.toAffine(); - const x = Fp.toBytes(a.x); - const cat = concatBytes4; - abool2("isCompressed", isCompressed); - if (isCompressed) { - return cat(Uint8Array.from([point.hasEvenY() ? 2 : 3]), x); - } else { - return cat(Uint8Array.from([4]), x, Fp.toBytes(a.y)); +}); + +// node_modules/undici/lib/web/websocket/receiver.js +var require_receiver2 = __commonJS({ + "node_modules/undici/lib/web/websocket/receiver.js"(exports, module) { + "use strict"; + var { Writable } = __require("stream"); + var assert8 = __require("assert"); + var { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require_constants6(); + var { + isValidStatusCode, + isValidOpcode, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isTextBinaryFrame, + isContinuationFrame + } = require_util5(); + var { failWebsocketConnection } = require_connection(); + var { WebsocketFrameSend } = require_frame(); + var { PerMessageDeflate: PerMessageDeflate2 } = require_permessage_deflate2(); + var { MessageSizeExceededError } = require_errors(); + var ByteParser = class extends Writable { + #buffers = []; + #fragmentsBytes = 0; + #byteOffset = 0; + #loop = false; + #state = parserStates.INFO; + #info = {}; + #fragments = []; + /** @type {Map} */ + #extensions; + /** @type {import('./websocket').Handler} */ + #handler; + /** @type {number} */ + #maxPayloadSize; + /** + * @param {import('./websocket').Handler} handler + * @param {Map|null} extensions + * @param {{ maxPayloadSize?: number }} [options] + */ + constructor(handler, extensions, options = {}) { + super(); + this.#handler = handler; + this.#extensions = extensions == null ? /* @__PURE__ */ new Map() : extensions; + this.#maxPayloadSize = options.maxPayloadSize ?? 0; + if (this.#extensions.has("permessage-deflate")) { + this.#extensions.set("permessage-deflate", new PerMessageDeflate2(extensions, options)); + } + } + /** + * @param {Buffer} chunk + * @param {() => void} callback + */ + _write(chunk, _, callback) { + this.#buffers.push(chunk); + this.#byteOffset += chunk.length; + this.#loop = true; + this.run(callback); + } + #validatePayloadLength() { + if (this.#maxPayloadSize > 0 && !isControlFrame(this.#info.opcode) && this.#info.payloadLength > this.#maxPayloadSize) { + failWebsocketConnection(this.#handler, 1009, "Payload size exceeds maximum allowed size"); + return false; + } + return true; + } + /** + * Runs whenever a new chunk is received. + * Callback is called whenever there are no more chunks buffering, + * or not enough bytes are buffered to parse. + */ + run(callback) { + while (this.#loop) { + if (this.#state === parserStates.INFO) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer2 = this.consume(2); + const fin = (buffer2[0] & 128) !== 0; + const opcode = buffer2[0] & 15; + const masked = (buffer2[1] & 128) === 128; + const fragmented = !fin && opcode !== opcodes.CONTINUATION; + const payloadLength = buffer2[1] & 127; + const rsv1 = buffer2[0] & 64; + const rsv2 = buffer2[0] & 32; + const rsv3 = buffer2[0] & 16; + if (!isValidOpcode(opcode)) { + failWebsocketConnection(this.#handler, 1002, "Invalid opcode received"); + return callback(); + } + if (masked) { + failWebsocketConnection(this.#handler, 1002, "Frame cannot be masked"); + return callback(); + } + if (rsv1 !== 0 && !this.#extensions.has("permessage-deflate")) { + failWebsocketConnection(this.#handler, 1002, "Expected RSV1 to be clear."); + return; + } + if (rsv2 !== 0 || rsv3 !== 0) { + failWebsocketConnection(this.#handler, 1002, "RSV1, RSV2, RSV3 must be clear"); + return; + } + if (fragmented && !isTextBinaryFrame(opcode)) { + failWebsocketConnection(this.#handler, 1002, "Invalid frame type was fragmented."); + return; + } + if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { + failWebsocketConnection(this.#handler, 1002, "Expected continuation frame"); + return; + } + if (this.#info.fragmented && fragmented) { + failWebsocketConnection(this.#handler, 1002, "Fragmented frame exceeded 125 bytes."); + return; + } + if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { + failWebsocketConnection(this.#handler, 1002, "Control frame either too large or fragmented"); + return; + } + if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { + failWebsocketConnection(this.#handler, 1002, "Unexpected continuation frame"); + return; + } + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + if (!this.#validatePayloadLength()) { + return; + } + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; + } + if (isTextBinaryFrame(opcode)) { + this.#info.binaryType = opcode; + this.#info.compressed = rsv1 !== 0; + } + this.#info.opcode = opcode; + this.#info.masked = masked; + this.#info.fin = fin; + this.#info.fragmented = fragmented; + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer2 = this.consume(2); + this.#info.payloadLength = buffer2.readUInt16BE(0); + this.#state = parserStates.READ_DATA; + if (!this.#validatePayloadLength()) { + return; + } + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback(); + } + const buffer2 = this.consume(8); + const upper = buffer2.readUInt32BE(0); + const lower = buffer2.readUInt32BE(4); + if (upper !== 0 || lower > 2 ** 31 - 1) { + failWebsocketConnection(this.#handler, 1009, "Received payload length > 2^31 bytes."); + return; + } + this.#info.payloadLength = lower; + this.#state = parserStates.READ_DATA; + if (!this.#validatePayloadLength()) { + return; + } + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + return callback(); + } + const body = this.consume(this.#info.payloadLength); + if (isControlFrame(this.#info.opcode)) { + this.#loop = this.parseControlFrame(body); + this.#state = parserStates.INFO; + } else { + if (!this.#info.compressed) { + this.writeFragments(body); + if (!this.#info.fragmented && this.#info.fin) { + websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments()); + } + this.#state = parserStates.INFO; + } else { + this.#extensions.get("permessage-deflate").decompress( + body, + this.#info.fin, + (error, data) => { + if (error) { + const code = error instanceof MessageSizeExceededError ? 1009 : 1007; + failWebsocketConnection(this.#handler, code, error.message); + return; + } + this.writeFragments(data); + if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { + failWebsocketConnection(this.#handler, 1009, new MessageSizeExceededError().message); + return; + } + if (!this.#info.fin) { + this.#state = parserStates.INFO; + this.#loop = true; + this.run(callback); + return; + } + websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments()); + this.#loop = true; + this.#state = parserStates.INFO; + this.run(callback); + }, + this.#fragmentsBytes + ); + this.#loop = false; + break; + } + } + } + } } - }, - fromBytes(bytes) { - const len = bytes.length; - const head = bytes[0]; - const tail = bytes.subarray(1); - if (len === compressedLen && (head === 2 || head === 3)) { - const x = bytesToNumberBE2(tail); - if (!inRange2(x, _1n10, Fp.ORDER)) - throw new Error("Point is not on curve"); - const y2 = weierstrassEquation(x); - let y; - try { - y = Fp.sqrt(y2); - } catch (sqrtError) { - const suffix = sqrtError instanceof Error ? ": " + sqrtError.message : ""; - throw new Error("Point is not on curve" + suffix); + /** + * Take n bytes from the buffered Buffers + * @param {number} n + * @returns {Buffer} + */ + consume(n) { + if (n > this.#byteOffset) { + throw new Error("Called consume() before buffers satiated."); + } else if (n === 0) { + return emptyBuffer; + } + this.#byteOffset -= n; + const first = this.#buffers[0]; + if (first.length > n) { + this.#buffers[0] = first.subarray(n, first.length); + return first.subarray(0, n); + } else if (first.length === n) { + return this.#buffers.shift(); + } else { + let offset = 0; + const buffer2 = Buffer.allocUnsafeSlow(n); + while (offset !== n) { + const next = this.#buffers[0]; + const length = next.length; + if (length + offset === n) { + buffer2.set(this.#buffers.shift(), offset); + break; + } else if (length + offset > n) { + buffer2.set(next.subarray(0, n - offset), offset); + this.#buffers[0] = next.subarray(n - offset); + break; + } else { + buffer2.set(this.#buffers.shift(), offset); + offset += length; + } + } + return buffer2; } - const isYOdd = (y & _1n10) === _1n10; - const isHeadOdd = (head & 1) === 1; - if (isHeadOdd !== isYOdd) - y = Fp.neg(y); - return { x, y }; - } else if (len === uncompressedLen && head === 4) { - const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES)); - const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES)); - return { x, y }; - } else { - const cl = compressedLen; - const ul = uncompressedLen; - throw new Error("invalid Point, expected length of " + cl + ", or uncompressed " + ul + ", got " + len); } - } - }); - function isBiggerThanHalfOrder(number) { - const HALF = CURVE_ORDER >> _1n10; - return number > HALF; - } - function normalizeS(s3) { - return isBiggerThanHalfOrder(s3) ? modN2(-s3) : s3; - } - const slcNum = (b, from14, to) => bytesToNumberBE2(b.slice(from14, to)); - class Signature { - constructor(r, s3, recovery) { - aInRange2("r", r, _1n10, CURVE_ORDER); - aInRange2("s", s3, _1n10, CURVE_ORDER); - this.r = r; - this.s = s3; - if (recovery != null) - this.recovery = recovery; - Object.freeze(this); - } - // pair (bytes of r, bytes of s) - static fromCompact(hex) { - const l2 = nByteLength; - hex = ensureBytes2("compactSignature", hex, l2 * 2); - return new Signature(slcNum(hex, 0, l2), slcNum(hex, l2, 2 * l2)); - } - // DER encoded ECDSA signature - // https://bitcoin.stackexchange.com/questions/57644/what-are-the-parts-of-a-bitcoin-transaction-input-script - static fromDER(hex) { - const { r, s: s3 } = DER2.toSig(ensureBytes2("DER", hex)); - return new Signature(r, s3); - } - /** - * @todo remove - * @deprecated - */ - assertValidity() { - } - addRecoveryBit(recovery) { - return new Signature(this.r, this.s, recovery); - } - recoverPublicKey(msgHash) { - const { r, s: s3, recovery: rec } = this; - const h = bits2int_modN(ensureBytes2("msgHash", msgHash)); - if (rec == null || ![0, 1, 2, 3].includes(rec)) - throw new Error("recovery id invalid"); - const radj = rec === 2 || rec === 3 ? r + CURVE.n : r; - if (radj >= Fp.ORDER) - throw new Error("recovery id 2 or 3 invalid"); - const prefix = (rec & 1) === 0 ? "02" : "03"; - const R = Point3.fromHex(prefix + numToSizedHex2(radj, Fp.BYTES)); - const ir = invN(radj); - const u1 = modN2(-h * ir); - const u2 = modN2(s3 * ir); - const Q = Point3.BASE.multiplyAndAddUnsafe(R, u1, u2); - if (!Q) - throw new Error("point at infinify"); - Q.assertValidity(); - return Q; - } - // Signatures should be low-s, to prevent malleability. - hasHighS() { - return isBiggerThanHalfOrder(this.s); - } - normalizeS() { - return this.hasHighS() ? new Signature(this.r, modN2(-this.s), this.recovery) : this; - } - // DER-encoded - toDERRawBytes() { - return hexToBytes3(this.toDERHex()); - } - toDERHex() { - return DER2.hexFromSig(this); - } - // padded bytes of r, then padded bytes of s - toCompactRawBytes() { - return hexToBytes3(this.toCompactHex()); - } - toCompactHex() { - const l2 = nByteLength; - return numToSizedHex2(this.r, l2) + numToSizedHex2(this.s, l2); - } - } - const utils2 = { - isValidPrivateKey(privateKey) { - try { - normPrivateKeyToScalar(privateKey); - return true; - } catch (error) { - return false; + writeFragments(fragment) { + this.#fragmentsBytes += fragment.length; + this.#fragments.push(fragment); } - }, - normPrivateKeyToScalar, - /** - * Produces cryptographically secure private key from random of size - * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible. - */ - randomPrivateKey: () => { - const length = getMinHashLength2(CURVE.n); - return mapHashToField2(CURVE.randomBytes(length), CURVE.n); - }, - /** - * Creates precompute table for an arbitrary EC point. Makes point "cached". - * Allows to massively speed-up `point.multiply(scalar)`. - * @returns cached point - * @example - * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey)); - * fast.multiply(privKey); // much faster ECDH now - */ - precompute(windowSize = 8, point = Point3.BASE) { - point._setWindowSize(windowSize); - point.multiply(BigInt(3)); - return point; - } - }; - function getPublicKey(privateKey, isCompressed = true) { - return Point3.fromPrivateKey(privateKey).toRawBytes(isCompressed); - } - function isProbPub(item) { - if (typeof item === "bigint") - return false; - if (item instanceof Point3) - return true; - const arr = ensureBytes2("key", item); - const len = arr.length; - const fpl = Fp.BYTES; - const compLen = fpl + 1; - const uncompLen = 2 * fpl + 1; - if (CURVE.allowedPrivateKeyLengths || nByteLength === compLen) { - return void 0; - } else { - return len === compLen || len === uncompLen; - } - } - function getSharedSecret(privateA, publicB, isCompressed = true) { - if (isProbPub(privateA) === true) - throw new Error("first arg must be private key"); - if (isProbPub(publicB) === false) - throw new Error("second arg must be public key"); - const b = Point3.fromHex(publicB); - return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed); - } - const bits2int = CURVE.bits2int || function(bytes) { - if (bytes.length > 8192) - throw new Error("input is too large"); - const num2 = bytesToNumberBE2(bytes); - const delta = bytes.length * 8 - nBitLength; - return delta > 0 ? num2 >> BigInt(delta) : num2; - }; - const bits2int_modN = CURVE.bits2int_modN || function(bytes) { - return modN2(bits2int(bytes)); - }; - const ORDER_MASK = bitMask2(nBitLength); - function int2octets(num2) { - aInRange2("num < 2^" + nBitLength, num2, _0n10, ORDER_MASK); - return numberToBytesBE2(num2, nByteLength); - } - function prepSig(msgHash, privateKey, opts = defaultSigOpts) { - if (["recovered", "canonical"].some((k) => k in opts)) - throw new Error("sign() legacy options not supported"); - const { hash: hash3, randomBytes: randomBytes4 } = CURVE; - let { lowS, prehash, extraEntropy: ent } = opts; - if (lowS == null) - lowS = true; - msgHash = ensureBytes2("msgHash", msgHash); - validateSigVerOpts2(opts); - if (prehash) - msgHash = ensureBytes2("prehashed msgHash", hash3(msgHash)); - const h1int = bits2int_modN(msgHash); - const d = normPrivateKeyToScalar(privateKey); - const seedArgs = [int2octets(d), int2octets(h1int)]; - if (ent != null && ent !== false) { - const e7 = ent === true ? randomBytes4(Fp.BYTES) : ent; - seedArgs.push(ensureBytes2("extraEntropy", e7)); - } - const seed = concatBytes4(...seedArgs); - const m = h1int; - function k2sig(kBytes) { - const k = bits2int(kBytes); - if (!isWithinCurveOrder(k)) - return; - const ik = invN(k); - const q = Point3.BASE.multiply(k).toAffine(); - const r = modN2(q.x); - if (r === _0n10) - return; - const s3 = modN2(ik * modN2(m + r * d)); - if (s3 === _0n10) - return; - let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n10); - let normS = s3; - if (lowS && isBiggerThanHalfOrder(s3)) { - normS = normalizeS(s3); - recovery ^= 1; + consumeFragments() { + const fragments = this.#fragments; + if (fragments.length === 1) { + this.#fragmentsBytes = 0; + return fragments.shift(); + } + let offset = 0; + const output = Buffer.allocUnsafeSlow(this.#fragmentsBytes); + for (let i = 0; i < fragments.length; ++i) { + const buffer2 = fragments[i]; + output.set(buffer2, offset); + offset += buffer2.length; + } + this.#fragments = []; + this.#fragmentsBytes = 0; + return output; } - return new Signature(r, normS, recovery); - } - return { seed, k2sig }; - } - const defaultSigOpts = { lowS: CURVE.lowS, prehash: false }; - const defaultVerOpts = { lowS: CURVE.lowS, prehash: false }; - function sign2(msgHash, privKey, opts = defaultSigOpts) { - const { seed, k2sig } = prepSig(msgHash, privKey, opts); - const C = CURVE; - const drbg = createHmacDrbg2(C.hash.outputLen, C.nByteLength, C.hmac); - return drbg(seed, k2sig); - } - Point3.BASE._setWindowSize(8); - function verify(signature2, msgHash, publicKey, opts = defaultVerOpts) { - const sg = signature2; - msgHash = ensureBytes2("msgHash", msgHash); - publicKey = ensureBytes2("publicKey", publicKey); - const { lowS, prehash, format } = opts; - validateSigVerOpts2(opts); - if ("strict" in opts) - throw new Error("options.strict was renamed to lowS"); - if (format !== void 0 && format !== "compact" && format !== "der") - throw new Error("format must be compact or der"); - const isHex2 = typeof sg === "string" || isBytes3(sg); - const isObj = !isHex2 && !format && typeof sg === "object" && sg !== null && typeof sg.r === "bigint" && typeof sg.s === "bigint"; - if (!isHex2 && !isObj) - throw new Error("invalid signature, expected Uint8Array, hex string or Signature instance"); - let _sig = void 0; - let P2; - try { - if (isObj) - _sig = new Signature(sg.r, sg.s); - if (isHex2) { + parseCloseBody(data) { + assert8(data.length !== 1); + let code; + if (data.length >= 2) { + code = data.readUInt16BE(0); + } + if (code !== void 0 && !isValidStatusCode(code)) { + return { code: 1002, reason: "Invalid status code", error: true }; + } + let reason = data.subarray(2); + if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { + reason = reason.subarray(3); + } try { - if (format !== "compact") - _sig = Signature.fromDER(sg); - } catch (derError) { - if (!(derError instanceof DER2.Err)) - throw derError; + reason = utf8Decode(reason); + } catch { + return { code: 1007, reason: "Invalid UTF-8", error: true }; } - if (!_sig && format !== "der") - _sig = Signature.fromCompact(sg); + return { code, reason, error: false }; } - P2 = Point3.fromHex(publicKey); - } catch (error) { - return false; - } - if (!_sig) - return false; - if (lowS && _sig.hasHighS()) - return false; - if (prehash) - msgHash = CURVE.hash(msgHash); - const { r, s: s3 } = _sig; - const h = bits2int_modN(msgHash); - const is = invN(s3); - const u1 = modN2(h * is); - const u2 = modN2(r * is); - const R = Point3.BASE.multiplyAndAddUnsafe(P2, u1, u2)?.toAffine(); - if (!R) - return false; - const v = modN2(R.x); - return v === r; - } - return { - CURVE, - getPublicKey, - getSharedSecret, - sign: sign2, - verify, - ProjectivePoint: Point3, - Signature, - utils: utils2 - }; -} - -// node_modules/ox/node_modules/@noble/curves/esm/_shortw_utils.js -function getHash2(hash3) { - return { - hash: hash3, - hmac: (key, ...msgs) => hmac(hash3, key, concatBytes(...msgs)), - randomBytes - }; -} -function createCurve2(curveDef, defHash) { - const create2 = (hash3) => weierstrass2({ ...curveDef, ...getHash2(hash3) }); - return { ...create2(defHash), create: create2 }; -} - -// node_modules/ox/node_modules/@noble/curves/esm/secp256k1.js -var secp256k1P2 = BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"); -var secp256k1N2 = BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); -var _0n11 = BigInt(0); -var _1n11 = BigInt(1); -var _2n7 = BigInt(2); -var divNearest2 = (a, b) => (a + b / _2n7) / b; -function sqrtMod2(y) { - const P2 = secp256k1P2; - const _3n7 = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22); - const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88); - const b2 = y * y * y % P2; - const b3 = b2 * b2 * y % P2; - const b6 = pow22(b3, _3n7, P2) * b3 % P2; - const b9 = pow22(b6, _3n7, P2) * b3 % P2; - const b11 = pow22(b9, _2n7, P2) * b2 % P2; - const b22 = pow22(b11, _11n, P2) * b11 % P2; - const b44 = pow22(b22, _22n, P2) * b22 % P2; - const b88 = pow22(b44, _44n, P2) * b44 % P2; - const b176 = pow22(b88, _88n, P2) * b88 % P2; - const b220 = pow22(b176, _44n, P2) * b44 % P2; - const b223 = pow22(b220, _3n7, P2) * b3 % P2; - const t1 = pow22(b223, _23n, P2) * b22 % P2; - const t2 = pow22(t1, _6n, P2) * b2 % P2; - const root = pow22(t2, _2n7, P2); - if (!Fpk12.eql(Fpk12.sqr(root), y)) - throw new Error("Cannot find square root"); - return root; -} -var Fpk12 = Field2(secp256k1P2, void 0, void 0, { sqrt: sqrtMod2 }); -var secp256k12 = createCurve2({ - a: _0n11, - b: BigInt(7), - Fp: Fpk12, - n: secp256k1N2, - Gx: BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"), - Gy: BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"), - h: BigInt(1), - lowS: true, - // Allow only low-S signatures by default in sign() and verify() - endo: { - // Endomorphism, see above - beta: BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"), - splitScalar: (k) => { - const n = secp256k1N2; - const a1 = BigInt("0x3086d221a7d46bcde86c90e49284eb15"); - const b1 = -_1n11 * BigInt("0xe4437ed6010e88286f547fa90abfe4c3"); - const a2 = BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"); - const b2 = a1; - const POW_2_128 = BigInt("0x100000000000000000000000000000000"); - const c1 = divNearest2(b2 * k, n); - const c2 = divNearest2(-b1 * k, n); - let k1 = mod2(k - c1 * a1 - c2 * a2, n); - let k2 = mod2(-c1 * b1 - c2 * b2, n); - const k1neg = k1 > POW_2_128; - const k2neg = k2 > POW_2_128; - if (k1neg) - k1 = n - k1; - if (k2neg) - k2 = n - k2; - if (k1 > POW_2_128 || k2 > POW_2_128) { - throw new Error("splitScalar: Endomorphism failed, k=" + k); + /** + * Parses control frames. + * @param {Buffer} body + */ + parseControlFrame(body) { + const { opcode, payloadLength } = this.#info; + if (opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.#handler, 1002, "Received close frame with a 1-byte body."); + return false; + } + this.#info.closeInfo = this.parseCloseBody(body); + if (this.#info.closeInfo.error) { + const { code, reason } = this.#info.closeInfo; + failWebsocketConnection(this.#handler, code, reason); + return false; + } + if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + let body2 = emptyBuffer; + if (this.#info.closeInfo.code) { + body2 = Buffer.allocUnsafe(2); + body2.writeUInt16BE(this.#info.closeInfo.code, 0); + } + const closeFrame = new WebsocketFrameSend(body2); + this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE)); + this.#handler.closeState.add(sentCloseFrameState.SENT); + } + this.#handler.readyState = states.CLOSING; + this.#handler.closeState.add(sentCloseFrameState.RECEIVED); + return false; + } else if (opcode === opcodes.PING) { + if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + const frame = new WebsocketFrameSend(body); + this.#handler.socket.write(frame.createFrame(opcodes.PONG)); + this.#handler.onPing(body); + } + } else if (opcode === opcodes.PONG) { + this.#handler.onPong(body); + } + return true; + } + get closingInfo() { + return this.#info.closeInfo; } - return { k1neg, k1, k2neg, k2 }; - } - } -}, sha256); - -// node_modules/ox/_esm/core/Signature.js -init_Errors(); -init_Hex(); -init_Json(); -function assert5(signature2, options = {}) { - const { recovered } = options; - if (typeof signature2.r === "undefined") - throw new MissingPropertiesError({ signature: signature2 }); - if (typeof signature2.s === "undefined") - throw new MissingPropertiesError({ signature: signature2 }); - if (recovered && typeof signature2.yParity === "undefined") - throw new MissingPropertiesError({ signature: signature2 }); - if (signature2.r < 0n || signature2.r > maxUint2562) - throw new InvalidRError({ value: signature2.r }); - if (signature2.s < 0n || signature2.s > maxUint2562) - throw new InvalidSError({ value: signature2.s }); - if (typeof signature2.yParity === "number" && signature2.yParity !== 0 && signature2.yParity !== 1) - throw new InvalidYParityError({ value: signature2.yParity }); -} -function fromBytes3(signature2) { - return fromHex4(fromBytes(signature2)); -} -function fromHex4(signature2) { - if (signature2.length !== 130 && signature2.length !== 132) - throw new InvalidSerializedSizeError2({ signature: signature2 }); - const r = BigInt(slice3(signature2, 0, 32)); - const s3 = BigInt(slice3(signature2, 32, 64)); - const yParity = (() => { - const yParity2 = Number(`0x${signature2.slice(130)}`); - if (Number.isNaN(yParity2)) - return void 0; - try { - return vToYParity(yParity2); - } catch { - throw new InvalidYParityError({ value: yParity2 }); - } - })(); - if (typeof yParity === "undefined") - return { - r, - s: s3 }; - return { - r, - s: s3, - yParity - }; -} -function extract2(value) { - if (typeof value.r === "undefined") - return void 0; - if (typeof value.s === "undefined") - return void 0; - return from7(value); -} -function from7(signature2) { - const signature_ = (() => { - if (typeof signature2 === "string") - return fromHex4(signature2); - if (signature2 instanceof Uint8Array) - return fromBytes3(signature2); - if (typeof signature2.r === "string") - return fromRpc2(signature2); - if (signature2.v) - return fromLegacy(signature2); - return { - r: signature2.r, - s: signature2.s, - ...typeof signature2.yParity !== "undefined" ? { yParity: signature2.yParity } : {} + module.exports = { + ByteParser }; - })(); - assert5(signature_); - return signature_; -} -function fromLegacy(signature2) { - return { - r: signature2.r, - s: signature2.s, - yParity: vToYParity(signature2.v) - }; -} -function fromRpc2(signature2) { - const yParity = (() => { - const v = signature2.v ? Number(signature2.v) : void 0; - let yParity2 = signature2.yParity ? Number(signature2.yParity) : void 0; - if (typeof v === "number" && typeof yParity2 !== "number") - yParity2 = vToYParity(v); - if (typeof yParity2 !== "number") - throw new InvalidYParityError({ value: signature2.yParity }); - return yParity2; - })(); - return { - r: BigInt(signature2.r), - s: BigInt(signature2.s), - yParity - }; -} -function toTuple(signature2) { - const { r, s: s3, yParity } = signature2; - return [ - yParity ? "0x01" : "0x", - r === 0n ? "0x" : trimLeft2(fromNumber(r)), - s3 === 0n ? "0x" : trimLeft2(fromNumber(s3)) - ]; -} -function vToYParity(v) { - if (v === 0 || v === 27) - return 0; - if (v === 1 || v === 28) - return 1; - if (v >= 35) - return v % 2 === 0 ? 1 : 0; - throw new InvalidVError({ value: v }); -} -var InvalidSerializedSizeError2 = class extends BaseError3 { - constructor({ signature: signature2 }) { - super(`Value \`${signature2}\` is an invalid signature size.`, { - metaMessages: [ - "Expected: 64 bytes or 65 bytes.", - `Received ${size3(from2(signature2))} bytes.` - ] - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Signature.InvalidSerializedSizeError" - }); - } -}; -var MissingPropertiesError = class extends BaseError3 { - constructor({ signature: signature2 }) { - super(`Signature \`${stringify2(signature2)}\` is missing either an \`r\`, \`s\`, or \`yParity\` property.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Signature.MissingPropertiesError" - }); - } -}; -var InvalidRError = class extends BaseError3 { - constructor({ value }) { - super(`Value \`${value}\` is an invalid r value. r must be a positive integer less than 2^256.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Signature.InvalidRError" - }); - } -}; -var InvalidSError = class extends BaseError3 { - constructor({ value }) { - super(`Value \`${value}\` is an invalid s value. s must be a positive integer less than 2^256.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Signature.InvalidSError" - }); - } -}; -var InvalidYParityError = class extends BaseError3 { - constructor({ value }) { - super(`Value \`${value}\` is an invalid y-parity value. Y-parity must be 0 or 1.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Signature.InvalidYParityError" - }); - } -}; -var InvalidVError = class extends BaseError3 { - constructor({ value }) { - super(`Value \`${value}\` is an invalid v value. v must be 27, 28 or >=35.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "Signature.InvalidVError" - }); - } -}; - -// node_modules/ox/_esm/core/Authorization.js -function from8(authorization, options = {}) { - if (typeof authorization.chainId === "string") - return fromRpc3(authorization); - return { ...authorization, ...options.signature }; -} -function fromRpc3(authorization) { - const { address: address2, chainId, nonce } = authorization; - const signature2 = extract2(authorization); - return { - address: address2, - chainId: Number(chainId), - nonce: BigInt(nonce), - ...signature2 - }; -} -function getSignPayload(authorization) { - return hash2(authorization, { presign: true }); -} -function hash2(authorization, options = {}) { - const { presign } = options; - return keccak2562(concat2("0x05", fromHex3(toTuple2(presign ? { - address: authorization.address, - chainId: authorization.chainId, - nonce: authorization.nonce - } : authorization)))); -} -function toTuple2(authorization) { - const { address: address2, chainId, nonce } = authorization; - const signature2 = extract2(authorization); - return [ - chainId ? fromNumber(chainId) : "0x", - address2, - nonce ? fromNumber(nonce) : "0x", - ...signature2 ? toTuple(signature2) : [] - ]; -} - -// node_modules/ox/_esm/erc8010/SignatureErc8010.js -init_Errors(); -init_Hex(); - -// node_modules/ox/_esm/core/Secp256k1.js -init_Hex(); -function recoverAddress2(options) { - return fromPublicKey(recoverPublicKey2(options)); -} -function recoverPublicKey2(options) { - const { payload, signature: signature2 } = options; - const { r, s: s3, yParity } = signature2; - const signature_ = new secp256k12.Signature(BigInt(r), BigInt(s3)).addRecoveryBit(yParity); - const point = signature_.recoverPublicKey(from2(payload).substring(2)); - return from3(point); -} - -// node_modules/ox/_esm/erc8010/SignatureErc8010.js -var magicBytes = "0x8010801080108010801080108010801080108010801080108010801080108010"; -var suffixParameters = from5("(uint256 chainId, address delegation, uint256 nonce, uint8 yParity, uint256 r, uint256 s), address to, bytes data"); -function assert6(value) { - if (typeof value === "string") { - if (slice3(value, -32) !== magicBytes) - throw new InvalidWrappedSignatureError(value); - } else - assert5(value.authorization); -} -function from9(value) { - if (typeof value === "string") - return unwrap(value); - return value; -} -function unwrap(wrapped) { - assert6(wrapped); - const suffixLength = toNumber(slice3(wrapped, -64, -32)); - const suffix = slice3(wrapped, -suffixLength - 64, -64); - const signature2 = slice3(wrapped, 0, -suffixLength - 64); - const [auth, to, data] = decode(suffixParameters, suffix); - const authorization = from8({ - address: auth.delegation, - chainId: Number(auth.chainId), - nonce: auth.nonce, - yParity: auth.yParity, - r: auth.r, - s: auth.s - }); - return { - authorization, - signature: signature2, - ...data && data !== "0x" ? { data, to } : {} - }; -} -function wrap(value) { - const { data, signature: signature2 } = value; - assert6(value); - const self = recoverAddress2({ - payload: getSignPayload(value.authorization), - signature: from7(value.authorization) - }); - const suffix = encode2(suffixParameters, [ - { - ...value.authorization, - delegation: value.authorization.address, - chainId: BigInt(value.authorization.chainId) - }, - value.to ?? self, - data ?? "0x" - ]); - const suffixLength = fromNumber(size3(suffix), { size: 32 }); - return concat2(signature2, suffix, suffixLength, magicBytes); -} -function validate4(value) { - try { - assert6(value); - return true; - } catch { - return false; - } -} -var InvalidWrappedSignatureError = class extends BaseError3 { - constructor(wrapped) { - super(`Value \`${wrapped}\` is an invalid ERC-8010 wrapped signature.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "SignatureErc8010.InvalidWrappedSignatureError" - }); - } -}; - -// node_modules/viem/_esm/utils/formatters/proof.js -function formatStorageProof(storageProof) { - return storageProof.map((proof) => ({ - ...proof, - value: BigInt(proof.value) - })); -} -function formatProof(proof) { - return { - ...proof, - balance: proof.balance ? BigInt(proof.balance) : void 0, - nonce: proof.nonce ? hexToNumber(proof.nonce) : void 0, - storageProof: proof.storageProof ? formatStorageProof(proof.storageProof) : void 0 - }; -} - -// node_modules/viem/_esm/actions/public/getProof.js -async function getProof(client, { address: address2, blockNumber, blockTag: blockTag_, storageKeys }) { - const blockTag = blockTag_ ?? "latest"; - const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; - const proof = await client.request({ - method: "eth_getProof", - params: [address2, storageKeys, blockNumberHex || blockTag] - }); - return formatProof(proof); -} - -// node_modules/viem/_esm/actions/public/getStorageAt.js -init_toHex(); -async function getStorageAt(client, { address: address2, blockNumber, blockTag = "latest", slot }) { - const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; - const data = await client.request({ - method: "eth_getStorageAt", - params: [address2, slot, blockNumberHex || blockTag] - }); - return data; -} - -// node_modules/viem/_esm/actions/public/getTransaction.js -init_transaction(); -init_toHex(); -async function getTransaction(client, { blockHash, blockNumber, blockTag: blockTag_, hash: hash3, index: index2, sender, nonce }) { - const blockTag = blockTag_ || "latest"; - const blockNumberHex = blockNumber !== void 0 ? numberToHex(blockNumber) : void 0; - let transaction = null; - if (hash3) { - transaction = await client.request({ - method: "eth_getTransactionByHash", - params: [hash3] - }, { dedupe: true }); - } else if (blockHash) { - transaction = await client.request({ - method: "eth_getTransactionByBlockHashAndIndex", - params: [blockHash, numberToHex(index2)] - }, { dedupe: true }); - } else if ((blockNumberHex || blockTag) && typeof index2 === "number") { - transaction = await client.request({ - method: "eth_getTransactionByBlockNumberAndIndex", - params: [blockNumberHex || blockTag, numberToHex(index2)] - }, { dedupe: Boolean(blockNumberHex) }); - } else if (sender && typeof nonce === "number") { - transaction = await client.request({ - method: "eth_getTransactionBySenderAndNonce", - params: [sender, numberToHex(nonce)] - }, { dedupe: true }); } - if (!transaction) - throw new TransactionNotFoundError({ - blockHash, - blockNumber, - blockTag, - hash: hash3, - index: index2 - }); - const format = client.chain?.formatters?.transaction?.format || formatTransaction; - return format(transaction, "getTransaction"); -} - -// node_modules/viem/_esm/actions/public/getTransactionConfirmations.js -async function getTransactionConfirmations(client, { hash: hash3, transactionReceipt }) { - const [blockNumber, transaction] = await Promise.all([ - getAction(client, getBlockNumber, "getBlockNumber")({}), - hash3 ? getAction(client, getTransaction, "getTransaction")({ hash: hash3 }) : void 0 - ]); - const transactionBlockNumber = transactionReceipt?.blockNumber || transaction?.blockNumber; - if (!transactionBlockNumber) - return 0n; - return blockNumber - transactionBlockNumber + 1n; -} - -// node_modules/viem/_esm/clients/decorators/public.js -init_getTransactionCount(); - -// node_modules/viem/_esm/actions/public/getTransactionReceipt.js -init_transaction(); -async function getTransactionReceipt(client, { hash: hash3 }) { - const receipt = await client.request({ - method: "eth_getTransactionReceipt", - params: [hash3] - }, { dedupe: true }); - if (!receipt) - throw new TransactionReceiptNotFoundError({ hash: hash3 }); - const format = client.chain?.formatters?.transactionReceipt?.format || formatTransactionReceipt; - return format(receipt, "getTransactionReceipt"); -} +}); -// node_modules/viem/_esm/actions/public/multicall.js -init_abis(); -init_contracts(); -init_abi(); -init_base(); -init_contract(); -init_decodeFunctionResult(); -init_encodeFunctionData(); -init_getChainContractAddress(); -async function multicall(client, parameters) { - const { account, authorizationList, allowFailure = true, blockNumber, blockOverrides, blockTag, stateOverride } = parameters; - const contracts2 = parameters.contracts; - const { batchSize = parameters.batchSize ?? 1024, deployless = parameters.deployless ?? false } = typeof client.batch?.multicall === "object" ? client.batch.multicall : {}; - const multicallAddress = (() => { - if (parameters.multicallAddress) - return parameters.multicallAddress; - if (deployless) - return null; - if (client.chain) { - return getChainContractAddress({ - blockNumber, - chain: client.chain, - contract: "multicall3" - }); - } - throw new Error("client chain not configured. multicallAddress is required."); - })(); - const chunkedCalls = [[]]; - let currentChunk = 0; - let currentChunkSize = 0; - for (let i = 0; i < contracts2.length; i++) { - const { abi: abi2, address: address2, args, functionName } = contracts2[i]; - try { - const callData = encodeFunctionData({ abi: abi2, args, functionName }); - currentChunkSize += (callData.length - 2) / 2; - if ( - // Check if batching is enabled. - batchSize > 0 && // Check if the current size of the batch exceeds the size limit. - currentChunkSize > batchSize && // Check if the current chunk is not already empty. - chunkedCalls[currentChunk].length > 0 - ) { - currentChunk++; - currentChunkSize = (callData.length - 2) / 2; - chunkedCalls[currentChunk] = []; +// node_modules/undici/lib/web/websocket/sender.js +var require_sender2 = __commonJS({ + "node_modules/undici/lib/web/websocket/sender.js"(exports, module) { + "use strict"; + var { WebsocketFrameSend } = require_frame(); + var { opcodes, sendHints } = require_constants6(); + var FixedQueue = require_fixed_queue(); + var SendQueue = class { + /** + * @type {FixedQueue} + */ + #queue = new FixedQueue(); + /** + * @type {boolean} + */ + #running = false; + /** @type {import('node:net').Socket} */ + #socket; + constructor(socket) { + this.#socket = socket; } - chunkedCalls[currentChunk] = [ - ...chunkedCalls[currentChunk], - { - allowFailure: true, - callData, - target: address2 + add(item, cb, hint) { + if (hint !== sendHints.blob) { + if (!this.#running) { + if (hint === sendHints.text) { + const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item); + this.#socket.cork(); + this.#socket.write(head); + this.#socket.write(body, cb); + this.#socket.uncork(); + } else { + this.#socket.write(createFrame(item, hint), cb); + } + } else { + const node2 = { + promise: null, + callback: cb, + frame: createFrame(item, hint) + }; + this.#queue.push(node2); + } + return; } - ]; - } catch (err) { - const error = getContractError(err, { - abi: abi2, - address: address2, - args, - docsPath: "/docs/contract/multicall", - functionName, - sender: account - }); - if (!allowFailure) - throw error; - chunkedCalls[currentChunk] = [ - ...chunkedCalls[currentChunk], - { - allowFailure: true, - callData: "0x", - target: address2 + const node = { + promise: item.arrayBuffer().then((ab) => { + node.promise = null; + node.frame = createFrame(ab, hint); + }), + callback: cb, + frame: null + }; + this.#queue.push(node); + if (!this.#running) { + this.#run(); } - ]; - } - } - const aggregate3Results = await Promise.allSettled(chunkedCalls.map((calls) => getAction(client, readContract, "readContract")({ - ...multicallAddress === null ? { code: multicall3Bytecode } : { address: multicallAddress }, - abi: multicall3Abi, - account, - args: [calls], - authorizationList, - blockNumber, - blockOverrides, - blockTag, - functionName: "aggregate3", - stateOverride - }))); - const results = []; - for (let i = 0; i < aggregate3Results.length; i++) { - const result = aggregate3Results[i]; - if (result.status === "rejected") { - if (!allowFailure) - throw result.reason; - for (let j = 0; j < chunkedCalls[i].length; j++) { - results.push({ - status: "failure", - error: result.reason, - result: void 0 - }); } - continue; + async #run() { + this.#running = true; + const queue = this.#queue; + while (!queue.isEmpty()) { + const node = queue.shift(); + if (node.promise !== null) { + await node.promise; + } + this.#socket.write(node.frame, node.callback); + node.callback = node.frame = null; + } + this.#running = false; + } + }; + function createFrame(data, hint) { + return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY); } - const aggregate3Result = result.value; - for (let j = 0; j < aggregate3Result.length; j++) { - const { returnData, success } = aggregate3Result[j]; - const { callData } = chunkedCalls[i][j]; - const { abi: abi2, address: address2, functionName, args } = contracts2[results.length]; - try { - if (callData === "0x") - throw new AbiDecodingZeroDataError(); - if (!success) - throw new RawContractError({ data: returnData }); - const result2 = decodeFunctionResult({ - abi: abi2, - args, - data: returnData, - functionName - }); - results.push(allowFailure ? { result: result2, status: "success" } : result2); - } catch (err) { - const error = getContractError(err, { - abi: abi2, - address: address2, - args, - docsPath: "/docs/contract/multicall", - functionName - }); - if (!allowFailure) - throw error; - results.push({ error, result: void 0, status: "failure" }); + function toBuffer(data, hint) { + switch (hint) { + case sendHints.text: + case sendHints.typedArray: + return new Uint8Array(data.buffer, data.byteOffset, data.byteLength); + case sendHints.arrayBuffer: + case sendHints.blob: + return new Uint8Array(data); } } + module.exports = { SendQueue }; } - if (results.length !== contracts2.length) - throw new BaseError2("multicall results mismatch"); - return results; -} +}); -// node_modules/viem/_esm/actions/public/simulateBlocks.js -init_BlockOverrides(); -init_parseAccount(); -init_abi(); -init_contract(); -init_node(); -init_decodeFunctionResult(); -init_encodeFunctionData(); -init_concat(); -init_toHex(); -init_getNodeError(); -init_transactionRequest(); -init_stateOverride2(); -init_assertRequest(); -async function simulateBlocks(client, parameters) { - const { blockNumber, blockTag = client.experimental_blockTag ?? "latest", blocks, returnFullTransactions, traceTransfers, validation } = parameters; - try { - const blockStateCalls = []; - for (const block2 of blocks) { - const blockOverrides = block2.blockOverrides ? toRpc2(block2.blockOverrides) : void 0; - const calls = block2.calls.map((call_) => { - const call2 = call_; - const account = call2.account ? parseAccount(call2.account) : void 0; - const data = call2.abi ? encodeFunctionData(call2) : call2.data; - const request = { - ...call2, - account, - data: call2.dataSuffix ? concat([data || "0x", call2.dataSuffix]) : data, - from: call2.from ?? account?.address - }; - assertRequest(request); - return formatTransactionRequest(request); - }); - const stateOverrides = block2.stateOverrides ? serializeStateOverride(block2.stateOverrides) : void 0; - blockStateCalls.push({ - blockOverrides, - calls, - stateOverrides - }); +// node_modules/undici/lib/web/websocket/websocket.js +var require_websocket2 = __commonJS({ + "node_modules/undici/lib/web/websocket/websocket.js"(exports, module) { + "use strict"; + var { isArrayBuffer } = __require("util/types"); + var { webidl } = require_webidl(); + var { URLSerializer } = require_data_url(); + var { environmentSettingsObject } = require_util2(); + var { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = require_constants6(); + var { + isConnecting, + isEstablished, + isClosing, + isClosed, + isValidSubprotocol, + fireEvent, + utf8Decode, + toArrayBuffer: toArrayBuffer2, + getURLRecord + } = require_util5(); + var { establishWebSocketConnection, closeWebSocketConnection, failWebsocketConnection } = require_connection(); + var { ByteParser } = require_receiver2(); + var { kEnumerableProperty } = require_util(); + var { getGlobalDispatcher } = require_global2(); + var { ErrorEvent, CloseEvent, createFastMessageEvent } = require_events(); + var { SendQueue } = require_sender2(); + var { WebsocketFrameSend } = require_frame(); + var { channels } = require_diagnostics(); + function getSocketAddress(socket) { + if (typeof socket?.address === "function") { + return socket.address(); + } + if (typeof socket?.session?.socket?.address === "function") { + return socket.session.socket.address(); + } + return null; } - const blockNumberHex = typeof blockNumber === "bigint" ? numberToHex(blockNumber) : void 0; - const block = blockNumberHex || blockTag; - const result = await client.request({ - method: "eth_simulateV1", - params: [ - { blockStateCalls, returnFullTransactions, traceTransfers, validation }, - block - ] - }); - return result.map((block2, i) => ({ - ...formatBlock(block2), - calls: block2.calls.map((call2, j) => { - const { abi: abi2, args, functionName, to } = blocks[i].calls[j]; - const data = call2.error?.data ?? call2.returnData; - const gasUsed = BigInt(call2.gasUsed); - const logs = call2.logs?.map((log) => formatLog(log)); - const status = call2.status === "0x1" ? "success" : "failure"; - const result2 = abi2 && status === "success" && data !== "0x" ? decodeFunctionResult({ - abi: abi2, - data, - functionName - }) : null; - const error = (() => { - if (status === "success") - return void 0; - let error2; - if (data === "0x") - error2 = new AbiDecodingZeroDataError(); - else if (data) - error2 = new RawContractError({ data }); - if (!error2) - return void 0; - return getContractError(error2, { - abi: abi2 ?? [], - address: to ?? "0x", - args, - functionName: functionName ?? "" - }); - })(); - return { - data, - gasUsed, - logs, - status, - ...status === "success" ? { - result: result2 - } : { - error + var WebSocket2 = class _WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null + }; + #bufferedAmount = 0; + #protocol = ""; + #extensions = ""; + /** @type {SendQueue} */ + #sendQueue; + /** @type {Handler} */ + #handler = { + onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions), + onMessage: (opcode, data) => this.#onMessage(opcode, data), + onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message), + onParserDrain: () => this.#onParserDrain(), + onSocketData: (chunk) => { + if (!this.#parser.write(chunk)) { + this.#handler.socket.pause(); } - }; - }) - })); - } catch (e7) { - const cause = e7; - const error = getNodeError(cause, {}); - if (error instanceof UnknownNodeError) - throw cause; - throw error; - } -} - -// node_modules/ox/_esm/core/AbiItem.js -init_exports(); -init_Errors(); -init_Hex(); - -// node_modules/ox/_esm/core/internal/abiItem.js -init_Errors(); -function normalizeSignature2(signature2) { - let active = true; - let current = ""; - let level = 0; - let result = ""; - let valid = false; - for (let i = 0; i < signature2.length; i++) { - const char = signature2[i]; - if (["(", ")", ","].includes(char)) - active = true; - if (char === "(") - level++; - if (char === ")") - level--; - if (!active) - continue; - if (level === 0) { - if (char === " " && ["event", "function", "error", ""].includes(result)) - result = ""; - else { - result += char; - if (char === ")") { - valid = true; - break; + }, + onSocketError: (err) => { + this.#handler.readyState = states.CLOSING; + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(err); + } + this.#handler.socket.destroy(); + }, + onSocketClose: () => this.#onSocketClose(), + onPing: (body) => { + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body, + websocket: this + }); + } + }, + onPong: (body) => { + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body, + websocket: this + }); + } + }, + readyState: states.CONNECTING, + socket: null, + closeState: /* @__PURE__ */ new Set(), + controller: null, + wasEverConnected: false + }; + #url; + #binaryType; + /** @type {import('./receiver').ByteParser} */ + #parser; + /** + * @param {string} url + * @param {string|string[]} protocols + */ + constructor(url, protocols = []) { + super(); + webidl.util.markAsUncloneable(this); + const prefix = "WebSocket constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols, prefix, "options"); + url = webidl.converters.USVString(url); + protocols = options.protocols; + const baseURL = environmentSettingsObject.settingsObject.baseUrl; + const urlRecord = getURLRecord(url, baseURL); + if (typeof protocols === "string") { + protocols = [protocols]; + } + if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { + throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { + throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + this.#url = new URL(urlRecord.href); + const client = environmentSettingsObject.settingsObject; + this.#handler.controller = establishWebSocketConnection( + urlRecord, + protocols, + client, + this.#handler, + options + ); + this.#handler.readyState = _WebSocket.CONNECTING; + this.#binaryType = "blob"; + } + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-close + * @param {number|undefined} code + * @param {string|undefined} reason + */ + close(code = void 0, reason = void 0) { + webidl.brandCheck(this, _WebSocket); + const prefix = "WebSocket.close"; + if (code !== void 0) { + code = webidl.converters["unsigned short"](code, prefix, "code", webidl.attributes.Clamp); + } + if (reason !== void 0) { + reason = webidl.converters.USVString(reason); + } + code ??= null; + reason ??= ""; + closeWebSocketConnection(this.#handler, code, reason, true); + } + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-send + * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data + */ + send(data) { + webidl.brandCheck(this, _WebSocket); + const prefix = "WebSocket.send"; + webidl.argumentLengthCheck(arguments, 1, prefix); + data = webidl.converters.WebSocketSendData(data, prefix, "data"); + if (isConnecting(this.#handler.readyState)) { + throw new DOMException("Sent before connected.", "InvalidStateError"); + } + if (!isEstablished(this.#handler.readyState) || isClosing(this.#handler.readyState)) { + return; + } + if (typeof data === "string") { + const buffer2 = Buffer.from(data); + this.#bufferedAmount += buffer2.byteLength; + this.#sendQueue.add(buffer2, () => { + this.#bufferedAmount -= buffer2.byteLength; + }, sendHints.text); + } else if (isArrayBuffer(data)) { + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.arrayBuffer); + } else if (ArrayBuffer.isView(data)) { + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.typedArray); + } else if (webidl.is.Blob(data)) { + this.#bufferedAmount += data.size; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.size; + }, sendHints.blob); + } + } + get readyState() { + webidl.brandCheck(this, _WebSocket); + return this.#handler.readyState; + } + get bufferedAmount() { + webidl.brandCheck(this, _WebSocket); + return this.#bufferedAmount; + } + get url() { + webidl.brandCheck(this, _WebSocket); + return URLSerializer(this.#url); + } + get extensions() { + webidl.brandCheck(this, _WebSocket); + return this.#extensions; + } + get protocol() { + webidl.brandCheck(this, _WebSocket); + return this.#protocol; + } + get onopen() { + webidl.brandCheck(this, _WebSocket); + return this.#events.open; + } + set onopen(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.open) { + this.removeEventListener("open", this.#events.open); + } + const listener = webidl.converters.EventHandlerNonNull(fn); + if (listener !== null) { + this.addEventListener("open", listener); + this.#events.open = fn; + } else { + this.#events.open = null; + } + } + get onerror() { + webidl.brandCheck(this, _WebSocket); + return this.#events.error; + } + set onerror(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.error) { + this.removeEventListener("error", this.#events.error); + } + const listener = webidl.converters.EventHandlerNonNull(fn); + if (listener !== null) { + this.addEventListener("error", listener); + this.#events.error = fn; + } else { + this.#events.error = null; + } + } + get onclose() { + webidl.brandCheck(this, _WebSocket); + return this.#events.close; + } + set onclose(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.close) { + this.removeEventListener("close", this.#events.close); + } + const listener = webidl.converters.EventHandlerNonNull(fn); + if (listener !== null) { + this.addEventListener("close", listener); + this.#events.close = fn; + } else { + this.#events.close = null; + } + } + get onmessage() { + webidl.brandCheck(this, _WebSocket); + return this.#events.message; + } + set onmessage(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.message) { + this.removeEventListener("message", this.#events.message); + } + const listener = webidl.converters.EventHandlerNonNull(fn); + if (listener !== null) { + this.addEventListener("message", listener); + this.#events.message = fn; + } else { + this.#events.message = null; + } + } + get binaryType() { + webidl.brandCheck(this, _WebSocket); + return this.#binaryType; + } + set binaryType(type) { + webidl.brandCheck(this, _WebSocket); + if (type !== "blob" && type !== "arraybuffer") { + this.#binaryType = "blob"; + } else { + this.#binaryType = type; + } + } + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + */ + #onConnectionEstablished(response, parsedExtensions) { + this.#handler.socket = response.socket; + const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize; + const parser = new ByteParser(this.#handler, parsedExtensions, { + maxPayloadSize + }); + parser.on("drain", () => this.#handler.onParserDrain()); + parser.on("error", (err) => this.#handler.onParserError(err)); + this.#parser = parser; + this.#sendQueue = new SendQueue(response.socket); + this.#handler.readyState = states.OPEN; + const extensions = response.headersList.get("sec-websocket-extensions"); + if (extensions !== null) { + this.#extensions = extensions; + } + const protocol = response.headersList.get("sec-websocket-protocol"); + if (protocol !== null) { + this.#protocol = protocol; + } + fireEvent("open", this); + if (channels.open.hasSubscribers) { + const headers = response.headersList.entries; + channels.open.publish({ + address: getSocketAddress(response.socket), + protocol: this.#protocol, + extensions: this.#extensions, + websocket: this, + handshakeResponse: { + status: response.status, + statusText: response.statusText, + headers + } + }); } } - continue; - } - if (char === " ") { - if (signature2[i - 1] !== "," && current !== "," && current !== ",(") { - current = ""; - active = false; - } - continue; - } - result += char; - current += char; - } - if (!valid) - throw new BaseError3("Unable to normalize signature."); - return result; -} -function isArgOfType2(arg, abiParameter) { - const argType = typeof arg; - const abiParameterType = abiParameter.type; - switch (abiParameterType) { - case "address": - return validate3(arg, { strict: false }); - case "bool": - return argType === "boolean"; - case "function": - return argType === "string"; - case "string": - return argType === "string"; - default: { - if (abiParameterType === "tuple" && "components" in abiParameter) - return Object.values(abiParameter.components).every((component, index2) => { - return isArgOfType2(Object.values(arg)[index2], component); + #onMessage(type, data) { + if (this.#handler.readyState !== states.OPEN) { + return; + } + let dataForEvent; + if (type === opcodes.TEXT) { + try { + dataForEvent = utf8Decode(data); + } catch { + failWebsocketConnection(this.#handler, 1007, "Received invalid UTF-8 in text frame."); + return; + } + } else if (type === opcodes.BINARY) { + if (this.#binaryType === "blob") { + dataForEvent = new Blob([data]); + } else { + dataForEvent = toArrayBuffer2(data); + } + } + fireEvent("message", this, createFastMessageEvent, { + origin: this.#url.origin, + data: dataForEvent }); - if (/^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(abiParameterType)) - return argType === "number" || argType === "bigint"; - if (/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(abiParameterType)) - return argType === "string" || arg instanceof Uint8Array; - if (/[a-z]+[1-9]{0,3}(\[[0-9]{0,}\])+$/.test(abiParameterType)) { - return Array.isArray(arg) && arg.every((x) => isArgOfType2(x, { - ...abiParameter, - // Pop off `[]` or `[M]` from end of type - type: abiParameterType.replace(/(\[[0-9]{0,}\])$/, "") - })); } - return false; - } - } -} -function getAmbiguousTypes2(sourceParameters, targetParameters, args) { - for (const parameterIndex in sourceParameters) { - const sourceParameter = sourceParameters[parameterIndex]; - const targetParameter = targetParameters[parameterIndex]; - if (sourceParameter.type === "tuple" && targetParameter.type === "tuple" && "components" in sourceParameter && "components" in targetParameter) - return getAmbiguousTypes2(sourceParameter.components, targetParameter.components, args[parameterIndex]); - const types = [sourceParameter.type, targetParameter.type]; - const ambiguous = (() => { - if (types.includes("address") && types.includes("bytes20")) - return true; - if (types.includes("address") && types.includes("string")) - return validate3(args[parameterIndex], { - strict: false - }); - if (types.includes("address") && types.includes("bytes")) - return validate3(args[parameterIndex], { - strict: false - }); - return false; - })(); - if (ambiguous) - return types; - } - return; -} - -// node_modules/ox/_esm/core/AbiItem.js -function from10(abiItem, options = {}) { - const { prepare = true } = options; - const item = (() => { - if (Array.isArray(abiItem)) - return parseAbiItem(abiItem); - if (typeof abiItem === "string") - return parseAbiItem(abiItem); - return abiItem; - })(); - return { - ...item, - ...prepare ? { hash: getSignatureHash(item) } : {} - }; -} -function fromAbi(abi2, name, options) { - const { args = [], prepare = true } = options ?? {}; - const isSelector = validate2(name, { strict: false }); - const abiItems = abi2.filter((abiItem2) => { - if (isSelector) { - if (abiItem2.type === "function" || abiItem2.type === "error") - return getSelector(abiItem2) === slice3(name, 0, 4); - if (abiItem2.type === "event") - return getSignatureHash(abiItem2) === name; - return false; - } - return "name" in abiItem2 && abiItem2.name === name; - }); - if (abiItems.length === 0) - throw new NotFoundError({ name }); - if (abiItems.length === 1) - return { - ...abiItems[0], - ...prepare ? { hash: getSignatureHash(abiItems[0]) } : {} - }; - let matchedAbiItem; - for (const abiItem2 of abiItems) { - if (!("inputs" in abiItem2)) - continue; - if (!args || args.length === 0) { - if (!abiItem2.inputs || abiItem2.inputs.length === 0) - return { - ...abiItem2, - ...prepare ? { hash: getSignatureHash(abiItem2) } : {} - }; - continue; - } - if (!abiItem2.inputs) - continue; - if (abiItem2.inputs.length === 0) - continue; - if (abiItem2.inputs.length !== args.length) - continue; - const matched = args.every((arg, index2) => { - const abiParameter = "inputs" in abiItem2 && abiItem2.inputs[index2]; - if (!abiParameter) - return false; - return isArgOfType2(arg, abiParameter); - }); - if (matched) { - if (matchedAbiItem && "inputs" in matchedAbiItem && matchedAbiItem.inputs) { - const ambiguousTypes = getAmbiguousTypes2(abiItem2.inputs, matchedAbiItem.inputs, args); - if (ambiguousTypes) - throw new AmbiguityError({ - abiItem: abiItem2, - type: ambiguousTypes[0] - }, { - abiItem: matchedAbiItem, - type: ambiguousTypes[1] - }); + #onParserDrain() { + this.#handler.socket.resume(); } - matchedAbiItem = abiItem2; - } - } - const abiItem = (() => { - if (matchedAbiItem) - return matchedAbiItem; - const [abiItem2, ...overloads] = abiItems; - return { ...abiItem2, overloads }; - })(); - if (!abiItem) - throw new NotFoundError({ name }); - return { - ...abiItem, - ...prepare ? { hash: getSignatureHash(abiItem) } : {} - }; -} -function getSelector(...parameters) { - const abiItem = (() => { - if (Array.isArray(parameters[0])) { - const [abi2, name] = parameters; - return fromAbi(abi2, name); - } - return parameters[0]; - })(); - return slice3(getSignatureHash(abiItem), 0, 4); -} -function getSignature(...parameters) { - const abiItem = (() => { - if (Array.isArray(parameters[0])) { - const [abi2, name] = parameters; - return fromAbi(abi2, name); - } - return parameters[0]; - })(); - const signature2 = (() => { - if (typeof abiItem === "string") - return abiItem; - return formatAbiItem(abiItem); - })(); - return normalizeSignature2(signature2); -} -function getSignatureHash(...parameters) { - const abiItem = (() => { - if (Array.isArray(parameters[0])) { - const [abi2, name] = parameters; - return fromAbi(abi2, name); - } - return parameters[0]; - })(); - if (typeof abiItem !== "string" && "hash" in abiItem && abiItem.hash) - return abiItem.hash; - return keccak2562(fromString2(getSignature(abiItem))); -} -var AmbiguityError = class extends BaseError3 { - constructor(x, y) { - super("Found ambiguous types in overloaded ABI Items.", { - metaMessages: [ - // TODO: abitype to add support for signature-formatted ABI items. - `\`${x.type}\` in \`${normalizeSignature2(formatAbiItem(x.abiItem))}\`, and`, - `\`${y.type}\` in \`${normalizeSignature2(formatAbiItem(y.abiItem))}\``, - "", - "These types encode differently and cannot be distinguished at runtime.", - "Remove one of the ambiguous items in the ABI." - ] - }); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiItem.AmbiguityError" - }); - } -}; -var NotFoundError = class extends BaseError3 { - constructor({ name, data, type = "item" }) { - const selector = (() => { - if (name) - return ` with name "${name}"`; - if (data) - return ` with data "${data}"`; - return ""; - })(); - super(`ABI ${type}${selector} not found.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "AbiItem.NotFoundError" - }); - } -}; - -// node_modules/ox/_esm/core/AbiConstructor.js -init_Hex(); -function encode3(...parameters) { - const [abiConstructor, options] = (() => { - if (Array.isArray(parameters[0])) { - const [abi2, options2] = parameters; - return [fromAbi2(abi2), options2]; - } - return parameters; - })(); - const { bytecode, args } = options; - return concat2(bytecode, abiConstructor.inputs?.length && args?.length ? encode2(abiConstructor.inputs, args) : "0x"); -} -function from11(abiConstructor) { - return from10(abiConstructor); -} -function fromAbi2(abi2) { - const item = abi2.find((item2) => item2.type === "constructor"); - if (!item) - throw new NotFoundError({ name: "constructor" }); - return item; -} - -// node_modules/ox/_esm/core/AbiFunction.js -init_Hex(); -function encodeData2(...parameters) { - const [abiFunction, args = []] = (() => { - if (Array.isArray(parameters[0])) { - const [abi2, name, args3] = parameters; - return [fromAbi3(abi2, name, { args: args3 }), args3]; - } - const [abiFunction2, args2] = parameters; - return [abiFunction2, args2]; - })(); - const { overloads } = abiFunction; - const item = overloads ? fromAbi3([abiFunction, ...overloads], abiFunction.name, { - args - }) : abiFunction; - const selector = getSelector2(item); - const data = args.length > 0 ? encode2(item.inputs, args) : void 0; - return data ? concat2(selector, data) : selector; -} -function from12(abiFunction, options = {}) { - return from10(abiFunction, options); -} -function fromAbi3(abi2, name, options) { - const item = fromAbi(abi2, name, options); - if (item.type !== "function") - throw new NotFoundError({ name, type: "function" }); - return item; -} -function getSelector2(abiItem) { - return getSelector(abiItem); -} - -// node_modules/viem/_esm/actions/public/simulateCalls.js -init_parseAccount(); - -// node_modules/viem/_esm/constants/address.js -var ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; -var zeroAddress = "0x0000000000000000000000000000000000000000"; - -// node_modules/viem/_esm/actions/public/simulateCalls.js -init_contracts(); -init_base(); -init_encodeFunctionData(); -var getBalanceCode = "0x6080604052348015600e575f80fd5b5061016d8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063f8b2cb4f1461002d575b5f80fd5b610047600480360381019061004291906100db565b61005d565b604051610054919061011e565b60405180910390f35b5f8173ffffffffffffffffffffffffffffffffffffffff16319050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100aa82610081565b9050919050565b6100ba816100a0565b81146100c4575f80fd5b50565b5f813590506100d5816100b1565b92915050565b5f602082840312156100f0576100ef61007d565b5b5f6100fd848285016100c7565b91505092915050565b5f819050919050565b61011881610106565b82525050565b5f6020820190506101315f83018461010f565b9291505056fea26469706673582212203b9fe929fe995c7cf9887f0bdba8a36dd78e8b73f149b17d2d9ad7cd09d2dc6264736f6c634300081a0033"; -async function simulateCalls(client, parameters) { - const { blockNumber, blockTag, calls, stateOverrides, traceAssetChanges, traceTransfers, validation } = parameters; - const account = parameters.account ? parseAccount(parameters.account) : void 0; - if (traceAssetChanges && !account) - throw new BaseError2("`account` is required when `traceAssetChanges` is true"); - const getBalanceData = account ? encode3(from11("constructor(bytes, bytes)"), { - bytecode: deploylessCallViaBytecodeBytecode, - args: [ - getBalanceCode, - encodeData2(from12("function getBalance(address)"), [account.address]) - ] - }) : void 0; - const assetAddresses = traceAssetChanges ? await Promise.all(parameters.calls.map(async (call2) => { - if (!call2.data && !call2.abi) - return; - const { accessList } = await createAccessList(client, { - account: account.address, - ...call2, - data: call2.abi ? encodeFunctionData(call2) : call2.data - }); - return accessList.map(({ address: address2, storageKeys }) => storageKeys.length > 0 ? address2 : null); - })).then((x) => x.flat().filter(Boolean)) : []; - const blocks = await simulateBlocks(client, { - blockNumber, - blockTag, - blocks: [ - ...traceAssetChanges ? [ - // ETH pre balances - { - calls: [{ data: getBalanceData }], - stateOverrides - }, - // Asset pre balances - { - calls: assetAddresses.map((address2, i) => ({ - abi: [ - from12("function balanceOf(address) returns (uint256)") - ], - functionName: "balanceOf", - args: [account.address], - to: address2, - from: zeroAddress, - nonce: i - })), - stateOverrides: [ - { - address: zeroAddress, - nonce: 0 - } - ] + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 + */ + #onSocketClose() { + const wasClean = this.#handler.closeState.has(sentCloseFrameState.SENT) && this.#handler.closeState.has(sentCloseFrameState.RECEIVED); + let code = 1005; + let reason = ""; + const result = this.#parser?.closingInfo; + if (result && !result.error) { + code = result.code ?? 1005; + reason = result.reason; } - ] : [], - { - calls: [...calls, { to: zeroAddress }].map((call2) => ({ - ...call2, - from: account?.address - })), - stateOverrides - }, - ...traceAssetChanges ? [ - // ETH post balances - { - calls: [{ data: getBalanceData }] - }, - // Asset post balances - { - calls: assetAddresses.map((address2, i) => ({ - abi: [ - from12("function balanceOf(address) returns (uint256)") - ], - functionName: "balanceOf", - args: [account.address], - to: address2, - from: zeroAddress, - nonce: i - })), - stateOverrides: [ - { - address: zeroAddress, - nonce: 0 - } - ] - }, - // Decimals - { - calls: assetAddresses.map((address2, i) => ({ - to: address2, - abi: [ - from12("function decimals() returns (uint256)") - ], - functionName: "decimals", - from: zeroAddress, - nonce: i - })), - stateOverrides: [ - { - address: zeroAddress, - nonce: 0 - } - ] - }, - // Token URI - { - calls: assetAddresses.map((address2, i) => ({ - to: address2, - abi: [ - from12("function tokenURI(uint256) returns (string)") - ], - functionName: "tokenURI", - args: [0n], - from: zeroAddress, - nonce: i - })), - stateOverrides: [ - { - address: zeroAddress, - nonce: 0 - } - ] - }, - // Symbols - { - calls: assetAddresses.map((address2, i) => ({ - to: address2, - abi: [from12("function symbol() returns (string)")], - functionName: "symbol", - from: zeroAddress, - nonce: i - })), - stateOverrides: [ - { - address: zeroAddress, - nonce: 0 - } - ] + this.#handler.readyState = states.CLOSED; + if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + code = 1006; + fireEvent("error", this, (type, init) => new ErrorEvent(type, init), { + error: new TypeError(reason) + }); } - ] : [] - ], - traceTransfers, - validation - }); - const block_results = traceAssetChanges ? blocks[2] : blocks[0]; - const [block_ethPre, block_assetsPre, , block_ethPost, block_assetsPost, block_decimals, block_tokenURI, block_symbols] = traceAssetChanges ? blocks : []; - const { calls: block_calls, ...block } = block_results; - const results = block_calls.slice(0, -1) ?? []; - const ethPre = block_ethPre?.calls ?? []; - const assetsPre = block_assetsPre?.calls ?? []; - const balancesPre = [...ethPre, ...assetsPre].map((call2) => call2.status === "success" ? hexToBigInt(call2.data) : null); - const ethPost = block_ethPost?.calls ?? []; - const assetsPost = block_assetsPost?.calls ?? []; - const balancesPost = [...ethPost, ...assetsPost].map((call2) => call2.status === "success" ? hexToBigInt(call2.data) : null); - const decimals = (block_decimals?.calls ?? []).map((x) => x.status === "success" ? x.result : null); - const symbols = (block_symbols?.calls ?? []).map((x) => x.status === "success" ? x.result : null); - const tokenURI = (block_tokenURI?.calls ?? []).map((x) => x.status === "success" ? x.result : null); - const changes = []; - for (const [i, balancePost] of balancesPost.entries()) { - const balancePre = balancesPre[i]; - if (typeof balancePost !== "bigint") - continue; - if (typeof balancePre !== "bigint") - continue; - const decimals_ = decimals[i - 1]; - const symbol_ = symbols[i - 1]; - const tokenURI_ = tokenURI[i - 1]; - const token = (() => { - if (i === 0) - return { - address: ethAddress, - decimals: 18, - symbol: "ETH" - }; - return { - address: assetAddresses[i - 1], - decimals: tokenURI_ || decimals_ ? Number(decimals_ ?? 1) : void 0, - symbol: symbol_ ?? void 0 - }; - })(); - if (changes.some((change) => change.token.address === token.address)) - continue; - changes.push({ - token, - value: { - pre: balancePre, - post: balancePost, - diff: balancePost - balancePre + fireEvent("close", this, (type, init) => new CloseEvent(type, init), { + wasClean, + code, + reason + }); + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: this, + code, + reason + }); + } + } + /** + * @param {WebSocket} ws + * @param {Buffer|undefined} buffer + */ + static ping(ws, buffer2) { + if (Buffer.isBuffer(buffer2)) { + if (buffer2.length > 125) { + throw new TypeError("A PING frame cannot have a body larger than 125 bytes."); + } + } else if (buffer2 !== void 0) { + throw new TypeError("Expected buffer payload"); + } + const readyState = ws.#handler.readyState; + if (isEstablished(readyState) && !isClosing(readyState) && !isClosed(readyState)) { + const frame = new WebsocketFrameSend(buffer2); + ws.#handler.socket.write(frame.createFrame(opcodes.PING)); + } + } + }; + var { ping } = WebSocket2; + Reflect.deleteProperty(WebSocket2, "ping"); + WebSocket2.CONNECTING = WebSocket2.prototype.CONNECTING = states.CONNECTING; + WebSocket2.OPEN = WebSocket2.prototype.OPEN = states.OPEN; + WebSocket2.CLOSING = WebSocket2.prototype.CLOSING = states.CLOSING; + WebSocket2.CLOSED = WebSocket2.prototype.CLOSED = states.CLOSED; + Object.defineProperties(WebSocket2.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "WebSocket", + writable: false, + enumerable: false, + configurable: true } }); - } - return { - assetChanges: changes, - block, - results - }; -} - -// node_modules/ox/_esm/erc6492/SignatureErc6492.js -var SignatureErc6492_exports = {}; -__export(SignatureErc6492_exports, { - InvalidWrappedSignatureError: () => InvalidWrappedSignatureError2, - assert: () => assert7, - from: () => from13, - magicBytes: () => magicBytes2, - universalSignatureValidatorAbi: () => universalSignatureValidatorAbi, - universalSignatureValidatorBytecode: () => universalSignatureValidatorBytecode, - unwrap: () => unwrap2, - validate: () => validate5, - wrap: () => wrap2 -}); -init_Errors(); -init_Hex(); -var magicBytes2 = "0x6492649264926492649264926492649264926492649264926492649264926492"; -var universalSignatureValidatorBytecode = "0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572"; -var universalSignatureValidatorAbi = [ - { - inputs: [ - { - name: "_signer", - type: "address" - }, - { - name: "_hash", - type: "bytes32" - }, - { - name: "_signature", - type: "bytes" + Object.defineProperties(WebSocket2, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors + }); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.DOMString + ); + webidl.converters["DOMString or sequence"] = function(V, prefix, argument) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT && Symbol.iterator in V) { + return webidl.converters["sequence"](V); } - ], - stateMutability: "nonpayable", - type: "constructor" - }, - { - inputs: [ + return webidl.converters.DOMString(V, prefix, argument); + }; + webidl.converters.WebSocketInit = webidl.dictionaryConverter([ { - name: "_signer", - type: "address" + key: "protocols", + converter: webidl.converters["DOMString or sequence"], + defaultValue: () => [] }, { - name: "_hash", - type: "bytes32" + key: "dispatcher", + converter: webidl.converters.any, + defaultValue: () => getGlobalDispatcher() }, { - name: "_signature", - type: "bytes" + key: "headers", + converter: webidl.nullableConverter(webidl.converters.HeadersInit) } - ], - outputs: [ - { - type: "bool" + ]); + webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V); } - ], - stateMutability: "nonpayable", - type: "function", - name: "isValidSig" + return { protocols: webidl.converters["DOMString or sequence"](V) }; + }; + webidl.converters.WebSocketSendData = function(V) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { + if (webidl.is.Blob(V)) { + return V; + } + if (webidl.is.BufferSource(V)) { + return V; + } + } + return webidl.converters.USVString(V); + }; + module.exports = { + WebSocket: WebSocket2, + ping + }; } -]; -function assert7(wrapped) { - if (slice3(wrapped, -32) !== magicBytes2) - throw new InvalidWrappedSignatureError2(wrapped); -} -function from13(wrapped) { - if (typeof wrapped === "string") - return unwrap2(wrapped); - return wrapped; -} -function unwrap2(wrapped) { - assert7(wrapped); - const [to, data, signature2] = decode(from5("address, bytes, bytes"), wrapped); - return { data, signature: signature2, to }; -} -function wrap2(value) { - const { data, signature: signature2, to } = value; - return concat2(encode2(from5("address, bytes, bytes"), [ - to, - data, - signature2 - ]), magicBytes2); -} -function validate5(wrapped) { - try { - assert7(wrapped); - return true; - } catch { - return false; +}); + +// node_modules/undici/lib/web/websocket/stream/websocketerror.js +var require_websocketerror = __commonJS({ + "node_modules/undici/lib/web/websocket/stream/websocketerror.js"(exports, module) { + "use strict"; + var { webidl } = require_webidl(); + var { validateCloseCodeAndReason } = require_util5(); + var { kConstruct } = require_symbols(); + var { kEnumerableProperty } = require_util(); + function createInheritableDOMException() { + class Test extends DOMException { + get reason() { + return ""; + } + } + if (new Test().reason !== void 0) { + return DOMException; + } + return new Proxy(DOMException, { + construct(target, args, newTarget) { + const instance = Reflect.construct(target, args, target); + Object.setPrototypeOf(instance, newTarget.prototype); + return instance; + } + }); + } + var WebSocketError = class _WebSocketError extends createInheritableDOMException() { + #closeCode; + #reason; + constructor(message = "", init = void 0) { + message = webidl.converters.DOMString(message, "WebSocketError", "message"); + super(message, "WebSocketError"); + if (init === kConstruct) { + return; + } else if (init !== null) { + init = webidl.converters.WebSocketCloseInfo(init); + } + let code = init.closeCode ?? null; + const reason = init.reason ?? ""; + validateCloseCodeAndReason(code, reason); + if (reason.length !== 0 && code === null) { + code = 1e3; + } + this.#closeCode = code; + this.#reason = reason; + } + get closeCode() { + return this.#closeCode; + } + get reason() { + return this.#reason; + } + /** + * @param {string} message + * @param {number|null} code + * @param {string} reason + */ + static createUnvalidatedWebSocketError(message, code, reason) { + const error = new _WebSocketError(message, kConstruct); + error.#closeCode = code; + error.#reason = reason; + return error; + } + }; + var { createUnvalidatedWebSocketError } = WebSocketError; + delete WebSocketError.createUnvalidatedWebSocketError; + Object.defineProperties(WebSocketError.prototype, { + closeCode: kEnumerableProperty, + reason: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "WebSocketError", + writable: false, + enumerable: false, + configurable: true + } + }); + webidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError); + module.exports = { WebSocketError, createUnvalidatedWebSocketError }; } -} -var InvalidWrappedSignatureError2 = class extends BaseError3 { - constructor(wrapped) { - super(`Value \`${wrapped}\` is an invalid ERC-6492 wrapped signature.`); - Object.defineProperty(this, "name", { - enumerable: true, - configurable: true, - writable: true, - value: "SignatureErc6492.InvalidWrappedSignatureError" +}); + +// node_modules/undici/lib/web/websocket/stream/websocketstream.js +var require_websocketstream = __commonJS({ + "node_modules/undici/lib/web/websocket/stream/websocketstream.js"(exports, module) { + "use strict"; + var { environmentSettingsObject } = require_util2(); + var { states, opcodes, sentCloseFrameState } = require_constants6(); + var { webidl } = require_webidl(); + var { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = require_util5(); + var { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = require_connection(); + var { channels } = require_diagnostics(); + var { WebsocketFrameSend } = require_frame(); + var { ByteParser } = require_receiver2(); + var { WebSocketError, createUnvalidatedWebSocketError } = require_websocketerror(); + var { kEnumerableProperty } = require_util(); + var { utf8DecodeBytes } = require_encoding(); + var emittedExperimentalWarning = false; + var WebSocketStream = class { + // Each WebSocketStream object has an associated url , which is a URL record . + /** @type {URL} */ + #url; + // Each WebSocketStream object has an associated opened promise , which is a promise. + /** @type {ReturnType} */ + #openedPromise; + // Each WebSocketStream object has an associated closed promise , which is a promise. + /** @type {ReturnType} */ + #closedPromise; + // Each WebSocketStream object has an associated readable stream , which is a ReadableStream . + /** @type {ReadableStream} */ + #readableStream; + /** @type {ReadableStreamDefaultController} */ + #readableStreamController; + // Each WebSocketStream object has an associated writable stream , which is a WritableStream . + /** @type {WritableStream} */ + #writableStream; + // Each WebSocketStream object has an associated boolean handshake aborted , which is initially false. + #handshakeAborted = false; + /** @type {import('../websocket').Handler} */ + #handler = { + // https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol + onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions), + onMessage: (opcode, data) => this.#onMessage(opcode, data), + onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message), + onParserDrain: () => this.#handler.socket.resume(), + onSocketData: (chunk) => { + if (!this.#parser.write(chunk)) { + this.#handler.socket.pause(); + } + }, + onSocketError: (err) => { + this.#handler.readyState = states.CLOSING; + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(err); + } + this.#handler.socket.destroy(); + }, + onSocketClose: () => this.#onSocketClose(), + onPing: () => { + }, + onPong: () => { + }, + readyState: states.CONNECTING, + socket: null, + closeState: /* @__PURE__ */ new Set(), + controller: null, + wasEverConnected: false + }; + /** @type {import('../receiver').ByteParser} */ + #parser; + constructor(url, options = void 0) { + if (!emittedExperimentalWarning) { + process.emitWarning("WebSocketStream is experimental! Expect it to change at any time.", { + code: "UNDICI-WSS" + }); + emittedExperimentalWarning = true; + } + webidl.argumentLengthCheck(arguments, 1, "WebSocket"); + url = webidl.converters.USVString(url); + if (options !== null) { + options = webidl.converters.WebSocketStreamOptions(options); + } + const baseURL = environmentSettingsObject.settingsObject.baseUrl; + const urlRecord = getURLRecord(url, baseURL); + const protocols = options.protocols; + if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { + throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { + throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + this.#url = urlRecord.toString(); + this.#openedPromise = Promise.withResolvers(); + this.#closedPromise = Promise.withResolvers(); + if (options.signal != null) { + const signal = options.signal; + if (signal.aborted) { + this.#openedPromise.reject(signal.reason); + this.#closedPromise.reject(signal.reason); + return; + } + signal.addEventListener("abort", () => { + if (!isEstablished(this.#handler.readyState)) { + failWebsocketConnection(this.#handler); + this.#handler.readyState = states.CLOSING; + this.#openedPromise.reject(signal.reason); + this.#closedPromise.reject(signal.reason); + this.#handshakeAborted = true; + } + }, { once: true }); + } + const client = environmentSettingsObject.settingsObject; + this.#handler.controller = establishWebSocketConnection( + urlRecord, + protocols, + client, + this.#handler, + options + ); + } + // The url getter steps are to return this 's url , serialized . + get url() { + return this.#url.toString(); + } + // The opened getter steps are to return this 's opened promise . + get opened() { + return this.#openedPromise.promise; + } + // The closed getter steps are to return this 's closed promise . + get closed() { + return this.#closedPromise.promise; + } + // The close( closeInfo ) method steps are: + close(closeInfo = void 0) { + if (closeInfo !== null) { + closeInfo = webidl.converters.WebSocketCloseInfo(closeInfo); + } + const code = closeInfo.closeCode ?? null; + const reason = closeInfo.reason; + closeWebSocketConnection(this.#handler, code, reason, true); + } + #write(chunk) { + chunk = webidl.converters.WebSocketStreamWrite(chunk); + const promise = Promise.withResolvers(); + let data = null; + let opcode = null; + if (webidl.is.BufferSource(chunk)) { + data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk.slice()); + opcode = opcodes.BINARY; + } else { + let string; + try { + string = webidl.converters.DOMString(chunk); + } catch (e7) { + promise.reject(e7); + return promise.promise; + } + data = new TextEncoder().encode(string); + opcode = opcodes.TEXT; + } + if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + const frame = new WebsocketFrameSend(data); + this.#handler.socket.write(frame.createFrame(opcode), () => { + promise.resolve(void 0); + }); + } + return promise.promise; + } + /** @type {import('../websocket').Handler['onConnectionEstablished']} */ + #onConnectionEstablished(response, parsedExtensions) { + this.#handler.socket = response.socket; + const parser = new ByteParser(this.#handler, parsedExtensions); + parser.on("drain", () => this.#handler.onParserDrain()); + parser.on("error", (err) => this.#handler.onParserError(err)); + this.#parser = parser; + this.#handler.readyState = states.OPEN; + const extensions = parsedExtensions ?? ""; + const protocol = response.headersList.get("sec-websocket-protocol") ?? ""; + const readable = new ReadableStream({ + start: (controller) => { + this.#readableStreamController = controller; + }, + cancel: (reason) => this.#cancel(reason) + }); + const writable = new WritableStream({ + write: (chunk) => this.#write(chunk), + close: () => closeWebSocketConnection(this.#handler, null, null), + abort: (reason) => this.#closeUsingReason(reason) + }); + this.#readableStream = readable; + this.#writableStream = writable; + this.#openedPromise.resolve({ + extensions, + protocol, + readable, + writable + }); + } + /** @type {import('../websocket').Handler['onMessage']} */ + #onMessage(type, data) { + if (this.#handler.readyState !== states.OPEN) { + return; + } + let chunk; + if (type === opcodes.TEXT) { + try { + chunk = utf8Decode(data); + } catch { + failWebsocketConnection(this.#handler, "Received invalid UTF-8 in text frame."); + return; + } + } else if (type === opcodes.BINARY) { + chunk = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); + } + this.#readableStreamController.enqueue(chunk); + } + /** @type {import('../websocket').Handler['onSocketClose']} */ + #onSocketClose() { + const wasClean = this.#handler.closeState.has(sentCloseFrameState.SENT) && this.#handler.closeState.has(sentCloseFrameState.RECEIVED); + this.#handler.readyState = states.CLOSED; + if (this.#handshakeAborted) { + return; + } + if (!this.#handler.wasEverConnected) { + this.#openedPromise.reject(new WebSocketError("Socket never opened")); + } + const result = this.#parser?.closingInfo; + let code = result?.code ?? 1005; + if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + code = 1006; + } + const reason = result?.reason == null ? "" : utf8DecodeBytes(Buffer.from(result.reason)); + if (wasClean) { + this.#readableStreamController.close(); + if (!this.#writableStream.locked) { + this.#writableStream.abort(new DOMException("A closed WebSocketStream cannot be written to", "InvalidStateError")); + } + this.#closedPromise.resolve({ + closeCode: code, + reason + }); + } else { + const error = createUnvalidatedWebSocketError("unclean close", code, reason); + this.#readableStreamController?.error(error); + this.#writableStream?.abort(error); + this.#closedPromise.reject(error); + } + } + #closeUsingReason(reason) { + let code = null; + let reasonString = ""; + if (webidl.is.WebSocketError(reason)) { + code = reason.closeCode; + reasonString = reason.reason; + } + closeWebSocketConnection(this.#handler, code, reasonString); + } + // To cancel a WebSocketStream stream given reason , close using reason giving stream and reason . + #cancel(reason) { + this.#closeUsingReason(reason); + } + }; + Object.defineProperties(WebSocketStream.prototype, { + url: kEnumerableProperty, + opened: kEnumerableProperty, + closed: kEnumerableProperty, + close: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "WebSocketStream", + writable: false, + enumerable: false, + configurable: true + } }); + webidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([ + { + key: "protocols", + converter: webidl.sequenceConverter(webidl.converters.USVString), + defaultValue: () => [] + }, + { + key: "signal", + converter: webidl.nullableConverter(webidl.converters.AbortSignal), + defaultValue: () => null + } + ]); + webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([ + { + key: "closeCode", + converter: (V) => webidl.converters["unsigned short"](V, webidl.attributes.EnforceRange) + }, + { + key: "reason", + converter: webidl.converters.USVString, + defaultValue: () => "" + } + ]); + webidl.converters.WebSocketStreamWrite = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); + } + return webidl.converters.BufferSource(V); + }; + module.exports = { WebSocketStream }; } -}; +}); -// node_modules/viem/_esm/actions/public/verifyHash.js -init_abis(); -init_contracts(); -init_contract(); -init_encodeDeployData(); -init_encodeFunctionData(); -init_getAddress(); -init_isAddressEqual(); -init_concat(); -init_isHex(); -init_fromHex(); -init_toHex(); -init_serializeSignature(); -init_call(); -async function verifyHash(client, parameters) { - const { address: address2, chain: chain3 = client.chain, hash: hash3, erc6492VerifierAddress: verifierAddress = parameters.universalSignatureVerifierAddress ?? chain3?.contracts?.erc6492Verifier?.address, multicallAddress = parameters.multicallAddress ?? chain3?.contracts?.multicall3?.address, mode = "auto" } = parameters; - if (chain3?.verifyHash) - return await chain3.verifyHash(client, parameters); - const signature2 = (() => { - const signature3 = parameters.signature; - if (isHex(signature3)) - return signature3; - if (typeof signature3 === "object" && "r" in signature3 && "s" in signature3) - return serializeSignature(signature3); - return bytesToHex(signature3); - })(); - try { - if (mode === "eoa") { - try { - const verified = isAddressEqual(getAddress(address2), await recoverAddress({ hash: hash3, signature: signature2 })); - if (verified) - return true; - } catch { - } +// node_modules/undici/lib/web/eventsource/util.js +var require_util6 = __commonJS({ + "node_modules/undici/lib/web/eventsource/util.js"(exports, module) { + "use strict"; + function isValidLastEventId(value) { + return value.indexOf("\0") === -1; } - if (SignatureErc8010_exports.validate(signature2)) - return await verifyErc8010(client, { - ...parameters, - multicallAddress, - signature: signature2 - }); - return await verifyErc6492(client, { - ...parameters, - verifierAddress, - signature: signature2 - }); - } catch (error) { - if (mode !== "eoa") { - try { - const verified = isAddressEqual(getAddress(address2), await recoverAddress({ hash: hash3, signature: signature2 })); - if (verified) - return true; - } catch { + function isASCIINumber(value) { + if (value.length === 0) return false; + for (let i = 0; i < value.length; i++) { + if (value.charCodeAt(i) < 48 || value.charCodeAt(i) > 57) return false; } + return true; } - if (error instanceof VerificationError) { - return false; - } - throw error; + module.exports = { + isValidLastEventId, + isASCIINumber + }; } -} -async function verifyErc8010(client, parameters) { - const { address: address2, blockNumber, blockTag, hash: hash3, multicallAddress } = parameters; - const { authorization: authorization_ox, data: initData, signature: signature2, to } = SignatureErc8010_exports.unwrap(parameters.signature); - const code = await getCode(client, { - address: address2, - blockNumber, - blockTag - }); - if (code === concatHex(["0xef0100", authorization_ox.address])) - return await verifyErc1271(client, { - address: address2, - blockNumber, - blockTag, - hash: hash3, - signature: signature2 - }); - const authorization = { - address: authorization_ox.address, - chainId: Number(authorization_ox.chainId), - nonce: Number(authorization_ox.nonce), - r: numberToHex(authorization_ox.r, { size: 32 }), - s: numberToHex(authorization_ox.s, { size: 32 }), - yParity: authorization_ox.yParity - }; - const valid = await verifyAuthorization({ - address: address2, - authorization - }); - if (!valid) - throw new VerificationError(); - const results = await getAction(client, readContract, "readContract")({ - ...multicallAddress ? { address: multicallAddress } : { code: multicall3Bytecode }, - authorizationList: [authorization], - abi: multicall3Abi, - blockNumber, - blockTag: "pending", - functionName: "aggregate3", - args: [ - [ - ...initData ? [ - { - allowFailure: true, - target: to ?? address2, - callData: initData +}); + +// node_modules/undici/lib/web/eventsource/eventsource-stream.js +var require_eventsource_stream = __commonJS({ + "node_modules/undici/lib/web/eventsource/eventsource-stream.js"(exports, module) { + "use strict"; + var { Transform } = __require("stream"); + var { isASCIINumber, isValidLastEventId } = require_util6(); + var BOM = [239, 187, 191]; + var LF = 10; + var CR = 13; + var COLON = 58; + var SPACE = 32; + var EventSourceStream = class extends Transform { + /** + * @type {eventSourceSettings} + */ + state; + /** + * Leading byte-order-mark check. + * @type {boolean} + */ + checkBOM = true; + /** + * @type {boolean} + */ + crlfCheck = false; + /** + * @type {boolean} + */ + eventEndCheck = false; + /** + * @type {Buffer|null} + */ + buffer = null; + pos = 0; + event = { + data: void 0, + event: void 0, + id: void 0, + retry: void 0 + }; + /** + * @param {object} options + * @param {boolean} [options.readableObjectMode] + * @param {eventSourceSettings} [options.eventSourceSettings] + * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push] + */ + constructor(options = {}) { + options.readableObjectMode = true; + super(options); + this.state = options.eventSourceSettings || {}; + if (options.push) { + this.push = options.push; + } + } + /** + * @param {Buffer} chunk + * @param {string} _encoding + * @param {Function} callback + * @returns {void} + */ + _transform(chunk, _encoding, callback) { + if (chunk.length === 0) { + callback(); + return; + } + if (this.buffer) { + this.buffer = Buffer.concat([this.buffer, chunk]); + } else { + this.buffer = chunk; + } + if (this.checkBOM) { + switch (this.buffer.length) { + case 1: + if (this.buffer[0] === BOM[0]) { + callback(); + return; + } + this.checkBOM = false; + callback(); + return; + case 2: + if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1]) { + callback(); + return; + } + this.checkBOM = false; + break; + case 3: + if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1] && this.buffer[2] === BOM[2]) { + this.buffer = Buffer.alloc(0); + this.checkBOM = false; + callback(); + return; + } + this.checkBOM = false; + break; + default: + if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1] && this.buffer[2] === BOM[2]) { + this.buffer = this.buffer.subarray(3); + } + this.checkBOM = false; + break; } - ] : [], - { - allowFailure: true, - target: address2, - callData: encodeFunctionData({ - abi: erc1271Abi, - functionName: "isValidSignature", - args: [hash3, signature2] - }) } - ] - ] - }); - const data = results[results.length - 1]?.returnData; - if (data?.startsWith("0x1626ba7e")) - return true; - throw new VerificationError(); -} -async function verifyErc6492(client, parameters) { - const { address: address2, factory, factoryData, hash: hash3, signature: signature2, verifierAddress, ...rest } = parameters; - const wrappedSignature = await (async () => { - if (!factory && !factoryData) - return signature2; - if (SignatureErc6492_exports.validate(signature2)) - return signature2; - return SignatureErc6492_exports.wrap({ - data: factoryData, - signature: signature2, - to: factory - }); - })(); - const args = verifierAddress ? { - to: verifierAddress, - data: encodeFunctionData({ - abi: erc6492SignatureValidatorAbi, - functionName: "isValidSig", - args: [address2, hash3, wrappedSignature] - }), - ...rest - } : { - data: encodeDeployData({ - abi: erc6492SignatureValidatorAbi, - args: [address2, hash3, wrappedSignature], - bytecode: erc6492SignatureValidatorByteCode - }), - ...rest - }; - const { data } = await getAction(client, call, "call")(args).catch((error) => { - if (error instanceof CallExecutionError) - throw new VerificationError(); - throw error; - }); - if (hexToBool(data ?? "0x0")) - return true; - throw new VerificationError(); -} -async function verifyErc1271(client, parameters) { - const { address: address2, blockNumber, blockTag, hash: hash3, signature: signature2 } = parameters; - const result = await getAction(client, readContract, "readContract")({ - address: address2, - abi: erc1271Abi, - args: [hash3, signature2], - blockNumber, - blockTag, - functionName: "isValidSignature" - }).catch((error) => { - if (error instanceof ContractFunctionExecutionError) - throw new VerificationError(); - throw error; - }); - if (result.startsWith("0x1626ba7e")) - return true; - throw new VerificationError(); -} -var VerificationError = class extends Error { -}; - -// node_modules/viem/_esm/actions/public/verifyMessage.js -init_hashMessage(); -async function verifyMessage(client, { address: address2, message, factory, factoryData, signature: signature2, ...callRequest }) { - const hash3 = hashMessage(message); - return getAction(client, verifyHash, "verifyHash")({ - address: address2, - factory, - factoryData, - hash: hash3, - signature: signature2, - ...callRequest - }); -} - -// node_modules/viem/_esm/actions/public/verifyTypedData.js -init_hashTypedData(); -async function verifyTypedData(client, parameters) { - const { address: address2, factory, factoryData, signature: signature2, message, primaryType, types, domain, ...callRequest } = parameters; - const hash3 = hashTypedData({ message, primaryType, types, domain }); - return getAction(client, verifyHash, "verifyHash")({ - address: address2, - factory, - factoryData, - hash: hash3, - signature: signature2, - ...callRequest - }); -} - -// node_modules/viem/_esm/actions/public/waitForTransactionReceipt.js -init_transaction(); -init_withResolvers(); -init_stringify(); - -// node_modules/viem/_esm/actions/public/watchBlockNumber.js -init_fromHex(); -init_stringify(); -function watchBlockNumber(client, { emitOnBegin = false, emitMissed = false, onBlockNumber, onError, poll: poll_, pollingInterval = client.pollingInterval }) { - const enablePolling = (() => { - if (typeof poll_ !== "undefined") - return poll_; - if (client.transport.type === "webSocket" || client.transport.type === "ipc") - return false; - if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) - return false; - return true; - })(); - let prevBlockNumber; - const pollBlockNumber = () => { - const observerId = stringify([ - "watchBlockNumber", - client.uid, - emitOnBegin, - emitMissed, - pollingInterval - ]); - return observe(observerId, { onBlockNumber, onError }, (emit) => poll(async () => { - try { - const blockNumber = await getAction(client, getBlockNumber, "getBlockNumber")({ cacheTime: 0 }); - if (prevBlockNumber !== void 0) { - if (blockNumber === prevBlockNumber) - return; - if (blockNumber - prevBlockNumber > 1 && emitMissed) { - for (let i = prevBlockNumber + 1n; i < blockNumber; i++) { - emit.onBlockNumber(i, prevBlockNumber); - prevBlockNumber = i; + while (this.pos < this.buffer.length) { + if (this.eventEndCheck) { + if (this.crlfCheck) { + if (this.buffer[this.pos] === LF) { + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + this.crlfCheck = false; + continue; + } + this.crlfCheck = false; + } + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + if (this.event.data !== void 0 || this.event.event || this.event.id !== void 0 || this.event.retry) { + this.processEvent(this.event); + } + this.clearEvent(); + continue; } + this.eventEndCheck = false; + continue; } + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + this.parseLine(this.buffer.subarray(0, this.pos), this.event); + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + this.eventEndCheck = true; + continue; + } + this.pos++; } - if (prevBlockNumber === void 0 || blockNumber > prevBlockNumber) { - emit.onBlockNumber(blockNumber, prevBlockNumber); - prevBlockNumber = blockNumber; - } - } catch (err) { - emit.onError?.(err); + callback(); } - }, { - emitOnBegin, - interval: pollingInterval - })); - }; - const subscribeBlockNumber = () => { - const observerId = stringify([ - "watchBlockNumber", - client.uid, - emitOnBegin, - emitMissed - ]); - return observe(observerId, { onBlockNumber, onError }, (emit) => { - let active = true; - let unsubscribe = () => active = false; - (async () => { - try { - const transport = (() => { - if (client.transport.type === "fallback") { - const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); - if (!transport2) - return client.transport; - return transport2.value; + /** + * @param {Buffer} line + * @param {EventSourceStreamEvent} event + */ + parseLine(line, event) { + if (line.length === 0) { + return; + } + const colonPosition = line.indexOf(COLON); + if (colonPosition === 0) { + return; + } + let field = ""; + let value = ""; + if (colonPosition !== -1) { + field = line.subarray(0, colonPosition).toString("utf8"); + let valueStart = colonPosition + 1; + if (line[valueStart] === SPACE) { + ++valueStart; + } + value = line.subarray(valueStart).toString("utf8"); + } else { + field = line.toString("utf8"); + value = ""; + } + switch (field) { + case "data": + if (event[field] === void 0) { + event[field] = value; + } else { + event[field] += ` +${value}`; } - return client.transport; - })(); - const { unsubscribe: unsubscribe_ } = await transport.subscribe({ - params: ["newHeads"], - onData(data) { - if (!active) - return; - const blockNumber = hexToBigInt(data.result?.number); - emit.onBlockNumber(blockNumber, prevBlockNumber); - prevBlockNumber = blockNumber; - }, - onError(error) { - emit.onError?.(error); + break; + case "retry": + if (isASCIINumber(value)) { + event[field] = value; + } + break; + case "id": + if (isValidLastEventId(value)) { + event[field] = value; + } + break; + case "event": + if (value.length > 0) { + event[field] = value; + } + break; + } + } + /** + * @param {EventSourceStreamEvent} event + */ + processEvent(event) { + if (event.retry && isASCIINumber(event.retry)) { + this.state.reconnectionTime = parseInt(event.retry, 10); + } + if (event.id !== void 0 && isValidLastEventId(event.id)) { + this.state.lastEventId = event.id; + } + if (event.data !== void 0) { + this.push({ + type: event.event || "message", + options: { + data: event.data, + lastEventId: this.state.lastEventId, + origin: this.state.origin } }); - unsubscribe = unsubscribe_; - if (!active) - unsubscribe(); - } catch (err) { - onError?.(err); } - })(); - return () => unsubscribe(); - }); - }; - return enablePolling ? pollBlockNumber() : subscribeBlockNumber(); -} + } + clearEvent() { + this.event = { + data: void 0, + event: void 0, + id: void 0, + retry: void 0 + }; + } + }; + module.exports = { + EventSourceStream + }; + } +}); -// node_modules/viem/_esm/actions/public/waitForTransactionReceipt.js -async function waitForTransactionReceipt(client, parameters) { - const { - checkReplacement = true, - confirmations = 1, - hash: hash3, - onReplaced, - retryCount = 6, - retryDelay = ({ count }) => ~~(1 << count) * 200, - // exponential backoff - timeout = 18e4 - } = parameters; - const observerId = stringify(["waitForTransactionReceipt", client.uid, hash3]); - const pollingInterval = (() => { - if (parameters.pollingInterval) - return parameters.pollingInterval; - if (client.chain?.experimental_preconfirmationTime) - return client.chain.experimental_preconfirmationTime; - return client.pollingInterval; - })(); - let transaction; - let replacedTransaction; - let receipt; - let retrying = false; - let _unobserve; - let _unwatch; - const { promise, resolve, reject } = withResolvers(); - const timer = timeout ? setTimeout(() => { - _unwatch?.(); - _unobserve?.(); - reject(new WaitForTransactionReceiptTimeoutError({ hash: hash3 })); - }, timeout) : void 0; - _unobserve = observe(observerId, { onReplaced, resolve, reject }, async (emit) => { - receipt = await getAction(client, getTransactionReceipt, "getTransactionReceipt")({ hash: hash3 }).catch(() => void 0); - if (receipt && confirmations <= 1) { - clearTimeout(timer); - emit.resolve(receipt); - _unobserve?.(); - return; - } - _unwatch = getAction(client, watchBlockNumber, "watchBlockNumber")({ - emitMissed: true, - emitOnBegin: true, - poll: true, - pollingInterval, - async onBlockNumber(blockNumber_) { - const done = (fn) => { - clearTimeout(timer); - _unwatch?.(); - fn(); - _unobserve?.(); +// node_modules/undici/lib/web/eventsource/eventsource.js +var require_eventsource = __commonJS({ + "node_modules/undici/lib/web/eventsource/eventsource.js"(exports, module) { + "use strict"; + var { pipeline } = __require("stream"); + var { fetching } = require_fetch(); + var { makeRequest } = require_request2(); + var { webidl } = require_webidl(); + var { EventSourceStream } = require_eventsource_stream(); + var { parseMIMEType } = require_data_url(); + var { createFastMessageEvent } = require_events(); + var { isNetworkError } = require_response(); + var { kEnumerableProperty } = require_util(); + var { environmentSettingsObject } = require_util2(); + var experimentalWarned = false; + var defaultReconnectionTime = 3e3; + var CONNECTING = 0; + var OPEN = 1; + var CLOSED = 2; + var ANONYMOUS = "anonymous"; + var USE_CREDENTIALS = "use-credentials"; + var EventSource = class _EventSource extends EventTarget { + #events = { + open: null, + error: null, + message: null + }; + #url; + #withCredentials = false; + /** + * @type {ReadyState} + */ + #readyState = CONNECTING; + #request = null; + #controller = null; + #dispatcher; + /** + * @type {import('./eventsource-stream').eventSourceSettings} + */ + #state; + /** + * Creates a new EventSource object. + * @param {string} url + * @param {EventSourceInit} [eventSourceInitDict={}] + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface + */ + constructor(url, eventSourceInitDict = {}) { + super(); + webidl.util.markAsUncloneable(this); + const prefix = "EventSource constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning("EventSource is experimental, expect them to change at any time.", { + code: "UNDICI-ES" + }); + } + url = webidl.converters.USVString(url); + eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, "eventSourceInitDict"); + this.#dispatcher = eventSourceInitDict.node.dispatcher || eventSourceInitDict.dispatcher; + this.#state = { + lastEventId: "", + reconnectionTime: eventSourceInitDict.node.reconnectionTime }; - let blockNumber = blockNumber_; - if (retrying) - return; + const settings = environmentSettingsObject; + let urlRecord; try { - if (receipt) { - if (confirmations > 1 && (!receipt.blockNumber || blockNumber - receipt.blockNumber + 1n < confirmations)) - return; - done(() => emit.resolve(receipt)); - return; + urlRecord = new URL(url, settings.settingsObject.baseUrl); + this.#state.origin = urlRecord.origin; + } catch (e7) { + throw new DOMException(e7, "SyntaxError"); + } + this.#url = urlRecord.href; + let corsAttributeState = ANONYMOUS; + if (eventSourceInitDict.withCredentials === true) { + corsAttributeState = USE_CREDENTIALS; + this.#withCredentials = true; + } + const initRequest = { + redirect: "follow", + keepalive: true, + // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes + mode: "cors", + credentials: corsAttributeState === "anonymous" ? "same-origin" : "omit", + referrer: "no-referrer" + }; + initRequest.client = environmentSettingsObject.settingsObject; + initRequest.headersList = [["accept", { name: "accept", value: "text/event-stream" }]]; + initRequest.cache = "no-store"; + initRequest.initiator = "other"; + initRequest.urlList = [new URL(this.#url)]; + this.#request = makeRequest(initRequest); + this.#connect(); + } + /** + * Returns the state of this EventSource object's connection. It can have the + * values described below. + * @returns {ReadyState} + * @readonly + */ + get readyState() { + return this.#readyState; + } + /** + * Returns the URL providing the event stream. + * @readonly + * @returns {string} + */ + get url() { + return this.#url; + } + /** + * Returns a boolean indicating whether the EventSource object was + * instantiated with CORS credentials set (true), or not (false, the default). + */ + get withCredentials() { + return this.#withCredentials; + } + #connect() { + if (this.#readyState === CLOSED) return; + this.#readyState = CONNECTING; + const fetchParams = { + request: this.#request, + dispatcher: this.#dispatcher + }; + const processEventSourceEndOfBody = (response) => { + if (!isNetworkError(response)) { + return this.#reconnect(); } - if (checkReplacement && !transaction) { - retrying = true; - await withRetry(async () => { - transaction = await getAction(client, getTransaction, "getTransaction")({ hash: hash3 }); - if (transaction.blockNumber) - blockNumber = transaction.blockNumber; - }, { - delay: retryDelay, - retryCount - }); - retrying = false; + }; + fetchParams.processResponseEndOfBody = processEventSourceEndOfBody; + fetchParams.processResponse = (response) => { + if (isNetworkError(response)) { + if (response.aborted) { + this.close(); + this.dispatchEvent(new Event("error")); + return; + } else { + this.#reconnect(); + return; + } } - receipt = await getAction(client, getTransactionReceipt, "getTransactionReceipt")({ hash: hash3 }); - if (confirmations > 1 && (!receipt.blockNumber || blockNumber - receipt.blockNumber + 1n < confirmations)) + const contentType = response.headersList.get("content-type", true); + const mimeType = contentType !== null ? parseMIMEType(contentType) : "failure"; + const contentTypeValid = mimeType !== "failure" && mimeType.essence === "text/event-stream"; + if (response.status !== 200 || contentTypeValid === false) { + this.close(); + this.dispatchEvent(new Event("error")); return; - done(() => emit.resolve(receipt)); - } catch (err) { - if (err instanceof TransactionNotFoundError || err instanceof TransactionReceiptNotFoundError) { - if (!transaction) { - retrying = false; - return; + } + this.#readyState = OPEN; + this.dispatchEvent(new Event("open")); + this.#state.origin = response.urlList[response.urlList.length - 1].origin; + const eventSourceStream = new EventSourceStream({ + eventSourceSettings: this.#state, + push: (event) => { + this.dispatchEvent(createFastMessageEvent( + event.type, + event.options + )); } - try { - replacedTransaction = transaction; - retrying = true; - const block = await withRetry(() => getAction(client, getBlock, "getBlock")({ - blockNumber, - includeTransactions: true - }), { - delay: retryDelay, - retryCount, - shouldRetry: ({ error }) => error instanceof BlockNotFoundError - }); - retrying = false; - const replacementTransaction = block.transactions.find(({ from: from14, nonce }) => from14 === replacedTransaction.from && nonce === replacedTransaction.nonce); - if (!replacementTransaction) - return; - receipt = await getAction(client, getTransactionReceipt, "getTransactionReceipt")({ - hash: replacementTransaction.hash - }); - if (confirmations > 1 && (!receipt.blockNumber || blockNumber - receipt.blockNumber + 1n < confirmations)) - return; - let reason = "replaced"; - if (replacementTransaction.to === replacedTransaction.to && replacementTransaction.value === replacedTransaction.value && replacementTransaction.input === replacedTransaction.input) { - reason = "repriced"; - } else if (replacementTransaction.from === replacementTransaction.to && replacementTransaction.value === 0n) { - reason = "cancelled"; + }); + pipeline( + response.body.stream, + eventSourceStream, + (error) => { + if (error?.aborted === false) { + this.close(); + this.dispatchEvent(new Event("error")); } - done(() => { - emit.onReplaced?.({ - reason, - replacedTransaction, - transaction: replacementTransaction, - transactionReceipt: receipt - }); - emit.resolve(receipt); - }); - } catch (err_) { - done(() => emit.reject(err_)); } - } else { - done(() => emit.reject(err)); + ); + }; + this.#controller = fetching(fetchParams); + } + /** + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + * @returns {void} + */ + #reconnect() { + if (this.#readyState === CLOSED) return; + this.#readyState = CONNECTING; + this.dispatchEvent(new Event("error")); + setTimeout(() => { + if (this.#readyState !== CONNECTING) return; + if (this.#state.lastEventId.length) { + this.#request.headersList.set("last-event-id", this.#state.lastEventId, true); + } + this.#connect(); + }, this.#state.reconnectionTime)?.unref(); + } + /** + * Closes the connection, if any, and sets the readyState attribute to + * CLOSED. + */ + close() { + webidl.brandCheck(this, _EventSource); + if (this.#readyState === CLOSED) return; + this.#readyState = CLOSED; + this.#controller.abort(); + this.#request = null; + } + get onopen() { + return this.#events.open; + } + set onopen(fn) { + if (this.#events.open) { + this.removeEventListener("open", this.#events.open); + } + const listener = webidl.converters.EventHandlerNonNull(fn); + if (listener !== null) { + this.addEventListener("open", listener); + this.#events.open = fn; + } else { + this.#events.open = null; + } + } + get onmessage() { + return this.#events.message; + } + set onmessage(fn) { + if (this.#events.message) { + this.removeEventListener("message", this.#events.message); + } + const listener = webidl.converters.EventHandlerNonNull(fn); + if (listener !== null) { + this.addEventListener("message", listener); + this.#events.message = fn; + } else { + this.#events.message = null; + } + } + get onerror() { + return this.#events.error; + } + set onerror(fn) { + if (this.#events.error) { + this.removeEventListener("error", this.#events.error); + } + const listener = webidl.converters.EventHandlerNonNull(fn); + if (listener !== null) { + this.addEventListener("error", listener); + this.#events.error = fn; + } else { + this.#events.error = null; + } + } + }; + var constantsPropertyDescriptors = { + CONNECTING: { + __proto__: null, + configurable: false, + enumerable: true, + value: CONNECTING, + writable: false + }, + OPEN: { + __proto__: null, + configurable: false, + enumerable: true, + value: OPEN, + writable: false + }, + CLOSED: { + __proto__: null, + configurable: false, + enumerable: true, + value: CLOSED, + writable: false + } + }; + Object.defineProperties(EventSource, constantsPropertyDescriptors); + Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors); + Object.defineProperties(EventSource.prototype, { + close: kEnumerableProperty, + onerror: kEnumerableProperty, + onmessage: kEnumerableProperty, + onopen: kEnumerableProperty, + readyState: kEnumerableProperty, + url: kEnumerableProperty, + withCredentials: kEnumerableProperty + }); + webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ + { + key: "withCredentials", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "dispatcher", + // undici only + converter: webidl.converters.any + }, + { + key: "node", + // undici only + converter: webidl.dictionaryConverter([ + { + key: "reconnectionTime", + converter: webidl.converters["unsigned long"], + defaultValue: () => defaultReconnectionTime + }, + { + key: "dispatcher", + converter: webidl.converters.any + } + ]), + defaultValue: () => ({}) + } + ]); + module.exports = { + EventSource, + defaultReconnectionTime + }; + } +}); + +// node_modules/undici/index.js +var require_undici = __commonJS({ + "node_modules/undici/index.js"(exports, module) { + "use strict"; + var Client = require_client(); + var Dispatcher = require_dispatcher(); + var Pool = require_pool(); + var BalancedPool = require_balanced_pool(); + var RoundRobinPool = require_round_robin_pool(); + var Agent = require_agent(); + var Dispatcher1Wrapper = require_dispatcher1_wrapper(); + var ProxyAgent = require_proxy_agent(); + var Socks5ProxyAgent = require_socks5_proxy_agent(); + var EnvHttpProxyAgent = require_env_http_proxy_agent(); + var RetryAgent = require_retry_agent(); + var H2CClient = require_h2c_client(); + var errors = require_errors(); + var util2 = require_util(); + var { InvalidArgumentError } = errors; + var api = require_api(); + var buildConnector = require_connect(); + var MockClient = require_mock_client(); + var { MockCallHistory, MockCallHistoryLog } = require_mock_call_history(); + var MockAgent = require_mock_agent(); + var MockPool = require_mock_pool(); + var SnapshotAgent = require_snapshot_agent(); + var mockErrors = require_mock_errors(); + var RetryHandler = require_retry_handler(); + var { getGlobalDispatcher, setGlobalDispatcher } = require_global2(); + var DecoratorHandler = require_decorator_handler(); + var RedirectHandler = require_redirect_handler(); + Object.assign(Dispatcher.prototype, api); + module.exports.Dispatcher = Dispatcher; + module.exports.Client = Client; + module.exports.Pool = Pool; + module.exports.BalancedPool = BalancedPool; + module.exports.RoundRobinPool = RoundRobinPool; + module.exports.Agent = Agent; + module.exports.Dispatcher1Wrapper = Dispatcher1Wrapper; + module.exports.ProxyAgent = ProxyAgent; + module.exports.Socks5ProxyAgent = Socks5ProxyAgent; + module.exports.EnvHttpProxyAgent = EnvHttpProxyAgent; + module.exports.RetryAgent = RetryAgent; + module.exports.H2CClient = H2CClient; + module.exports.RetryHandler = RetryHandler; + module.exports.DecoratorHandler = DecoratorHandler; + module.exports.RedirectHandler = RedirectHandler; + module.exports.interceptors = { + redirect: require_redirect(), + responseError: require_response_error(), + retry: require_retry(), + dump: require_dump(), + dns: require_dns(), + cache: require_cache2(), + decompress: require_decompress(), + deduplicate: require_deduplicate() + }; + module.exports.cacheStores = { + MemoryCacheStore: require_memory_cache_store() + }; + var SqliteCacheStore = require_sqlite_cache_store(); + module.exports.cacheStores.SqliteCacheStore = SqliteCacheStore; + module.exports.buildConnector = buildConnector; + module.exports.errors = errors; + module.exports.util = { + parseHeaders: util2.parseHeaders, + headerNameToString: util2.headerNameToString + }; + function makeDispatcher(fn) { + return (url, opts, handler) => { + if (typeof opts === "function") { + handler = opts; + opts = null; + } + if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { + throw new InvalidArgumentError("invalid url"); + } + if (opts != null && typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (opts && opts.path != null) { + if (typeof opts.path !== "string") { + throw new InvalidArgumentError("invalid opts.path"); + } + let path = opts.path; + if (!opts.path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(util2.parseOrigin(url).origin + path); + } else { + if (!opts) { + opts = typeof url === "object" ? url : {}; } + url = util2.parseURL(url); } + const { agent, dispatcher = getGlobalDispatcher(), ...restOpts } = opts; + if (agent) { + throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); + } + return fn.call(dispatcher, { + ...restOpts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? "PUT" : "GET") + }, handler); + }; + } + module.exports.setGlobalDispatcher = setGlobalDispatcher; + module.exports.getGlobalDispatcher = getGlobalDispatcher; + var fetchImpl = require_fetch().fetch; + var currentFilename = typeof __filename !== "undefined" ? __filename : void 0; + function appendFetchStackTrace(err, filename) { + if (!err || typeof err !== "object") { + return; } - }); - }); - return promise; -} + const stack = typeof err.stack === "string" ? err.stack : ""; + const normalizedFilename = filename.replace(/\\/g, "/"); + if (stack && (stack.includes(filename) || stack.includes(normalizedFilename))) { + return; + } + const capture = {}; + Error.captureStackTrace(capture, appendFetchStackTrace); + if (!capture.stack) { + return; + } + const captureLines = capture.stack.split("\n").slice(1).join("\n"); + err.stack = stack ? `${stack} +${captureLines}` : capture.stack; + } + module.exports.fetch = function fetch2(init, options = void 0) { + return fetchImpl(init, options).catch((err) => { + if (currentFilename) { + appendFetchStackTrace(err, currentFilename); + } else if (err && typeof err === "object") { + Error.captureStackTrace(err, module.exports.fetch); + } + throw err; + }); + }; + module.exports.Headers = require_headers().Headers; + module.exports.Response = require_response().Response; + module.exports.Request = require_request2().Request; + module.exports.FormData = require_formdata().FormData; + var { setGlobalOrigin, getGlobalOrigin } = require_global(); + module.exports.setGlobalOrigin = setGlobalOrigin; + module.exports.getGlobalOrigin = getGlobalOrigin; + var { CacheStorage } = require_cachestorage(); + var { kConstruct } = require_symbols(); + module.exports.caches = new CacheStorage(kConstruct); + var { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = require_cookies(); + module.exports.deleteCookie = deleteCookie; + module.exports.getCookies = getCookies; + module.exports.getSetCookies = getSetCookies; + module.exports.setCookie = setCookie; + module.exports.parseCookie = parseCookie; + var { parseMIMEType, serializeAMimeType } = require_data_url(); + module.exports.parseMIMEType = parseMIMEType; + module.exports.serializeAMimeType = serializeAMimeType; + var { CloseEvent, ErrorEvent, MessageEvent } = require_events(); + var { WebSocket: WebSocket2, ping } = require_websocket2(); + module.exports.WebSocket = WebSocket2; + module.exports.CloseEvent = CloseEvent; + module.exports.ErrorEvent = ErrorEvent; + module.exports.MessageEvent = MessageEvent; + module.exports.ping = ping; + module.exports.WebSocketStream = require_websocketstream().WebSocketStream; + module.exports.WebSocketError = require_websocketerror().WebSocketError; + module.exports.request = makeDispatcher(api.request); + module.exports.stream = makeDispatcher(api.stream); + module.exports.pipeline = makeDispatcher(api.pipeline); + module.exports.connect = makeDispatcher(api.connect); + module.exports.upgrade = makeDispatcher(api.upgrade); + module.exports.MockClient = MockClient; + module.exports.MockCallHistory = MockCallHistory; + module.exports.MockCallHistoryLog = MockCallHistoryLog; + module.exports.MockPool = MockPool; + module.exports.MockAgent = MockAgent; + module.exports.SnapshotAgent = SnapshotAgent; + module.exports.mockErrors = mockErrors; + var { EventSource } = require_eventsource(); + module.exports.EventSource = EventSource; + function install() { + globalThis.fetch = module.exports.fetch; + globalThis.Headers = module.exports.Headers; + globalThis.Response = module.exports.Response; + globalThis.Request = module.exports.Request; + globalThis.FormData = module.exports.FormData; + globalThis.WebSocket = module.exports.WebSocket; + globalThis.CloseEvent = module.exports.CloseEvent; + globalThis.ErrorEvent = module.exports.ErrorEvent; + globalThis.MessageEvent = module.exports.MessageEvent; + globalThis.EventSource = module.exports.EventSource; + } + module.exports.install = install; + } +}); -// node_modules/viem/_esm/actions/public/watchBlocks.js -init_stringify(); -function watchBlocks(client, { blockTag = client.experimental_blockTag ?? "latest", emitMissed = false, emitOnBegin = false, onBlock, onError, includeTransactions: includeTransactions_, poll: poll_, pollingInterval = client.pollingInterval }) { - const enablePolling = (() => { - if (typeof poll_ !== "undefined") - return poll_; - if (client.transport.type === "webSocket" || client.transport.type === "ipc") - return false; - if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) - return false; - return true; - })(); - const includeTransactions = includeTransactions_ ?? false; - let prevBlock; - const pollBlocks = () => { - const observerId = stringify([ - "watchBlocks", - client.uid, - blockTag, - emitMissed, - emitOnBegin, - includeTransactions, - pollingInterval - ]); - return observe(observerId, { onBlock, onError }, (emit) => poll(async () => { - try { - const block = await getAction(client, getBlock, "getBlock")({ - blockTag, - includeTransactions - }); - if (block.number !== null && prevBlock?.number != null) { - if (block.number === prevBlock.number) - return; - if (block.number - prevBlock.number > 1 && emitMissed) { - for (let i = prevBlock?.number + 1n; i < block.number; i++) { - const block2 = await getAction(client, getBlock, "getBlock")({ - blockNumber: i, - includeTransactions - }); - emit.onBlock(block2, prevBlock); - prevBlock = block2; - } - } +// src/solana-balance.ts +var solana_balance_exports = {}; +__export(solana_balance_exports, { + SolanaBalanceMonitor: () => SolanaBalanceMonitor +}); +var SOLANA_USDC_MINT, SOLANA_DEFAULT_RPC, BALANCE_TIMEOUT_MS, CACHE_TTL_MS2, SolanaBalanceMonitor; +var init_solana_balance = __esm({ + "src/solana-balance.ts"() { + "use strict"; + init_index_node37(); + SOLANA_USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; + SOLANA_DEFAULT_RPC = "https://api.mainnet-beta.solana.com"; + BALANCE_TIMEOUT_MS = 1e4; + CACHE_TTL_MS2 = 3e4; + SolanaBalanceMonitor = class { + rpc; + walletAddress; + cachedBalance = null; + cachedAt = 0; + constructor(walletAddress, rpcUrl) { + this.walletAddress = walletAddress; + const url = rpcUrl || process["env"].CLAWROUTER_SOLANA_RPC_URL || SOLANA_DEFAULT_RPC; + this.rpc = createSolanaRpc(url); + } + async checkBalance() { + const now = Date.now(); + if (this.cachedBalance !== null && this.cachedBalance > 0n && now - this.cachedAt < CACHE_TTL_MS2) { + return this.buildInfo(this.cachedBalance); } - if ( - // If no previous block exists, emit. - prevBlock?.number == null || // If the block tag is "pending" with no block number, emit. - blockTag === "pending" && block?.number == null || // If the next block number is greater than the previous block number, emit. - // We don't want to emit blocks in the past. - block.number !== null && block.number > prevBlock.number - ) { - emit.onBlock(block, prevBlock); - prevBlock = block; + const balance = await this.fetchBalance(); + if (balance > 0n) { + this.cachedBalance = balance; + this.cachedAt = now; } - } catch (err) { - emit.onError?.(err); + return this.buildInfo(balance); } - }, { - emitOnBegin, - interval: pollingInterval - })); - }; - const subscribeBlocks = () => { - let active = true; - let emitFetched = true; - let unsubscribe = () => active = false; - (async () => { - try { - if (emitOnBegin) { - getAction(client, getBlock, "getBlock")({ - blockTag, - includeTransactions - }).then((block) => { - if (!active) - return; - if (!emitFetched) - return; - onBlock(block, void 0); - emitFetched = false; - }).catch(onError); + deductEstimated(amountMicros) { + if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) { + this.cachedBalance -= amountMicros; } - const transport = (() => { - if (client.transport.type === "fallback") { - const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); - if (!transport2) - return client.transport; - return transport2.value; - } - return client.transport; - })(); - const { unsubscribe: unsubscribe_ } = await transport.subscribe({ - params: ["newHeads"], - async onData(data) { - if (!active) - return; - const block = await getAction(client, getBlock, "getBlock")({ - blockNumber: data.result?.number, - includeTransactions - }).catch(() => { - }); - if (!active) - return; - onBlock(block, prevBlock); - emitFetched = false; - prevBlock = block; - }, - onError(error) { - onError?.(error); - } - }); - unsubscribe = unsubscribe_; - if (!active) - unsubscribe(); - } catch (err) { - onError?.(err); } - })(); - return () => unsubscribe(); - }; - return enablePolling ? pollBlocks() : subscribeBlocks(); -} - -// node_modules/viem/_esm/actions/public/watchEvent.js -init_abi(); -init_rpc(); -init_stringify(); -function watchEvent(client, { address: address2, args, batch = true, event, events, fromBlock, onError, onLogs, poll: poll_, pollingInterval = client.pollingInterval, strict: strict_ }) { - const enablePolling = (() => { - if (typeof poll_ !== "undefined") - return poll_; - if (typeof fromBlock === "bigint") - return true; - if (client.transport.type === "webSocket" || client.transport.type === "ipc") - return false; - if (client.transport.type === "fallback" && (client.transport.transports[0].config.type === "webSocket" || client.transport.transports[0].config.type === "ipc")) - return false; - return true; - })(); - const strict = strict_ ?? false; - const pollEvent = () => { - const observerId = stringify([ - "watchEvent", - address2, - args, - batch, - client.uid, - event, - pollingInterval, - fromBlock - ]); - return observe(observerId, { onLogs, onError }, (emit) => { - let previousBlockNumber; - if (fromBlock !== void 0) - previousBlockNumber = fromBlock - 1n; - let filter; - let initialized = false; - const unwatch = poll(async () => { - if (!initialized) { - try { - filter = await getAction(client, createEventFilter, "createEventFilter")({ - address: address2, - args, - event, - events, - strict, - fromBlock - }); - } catch { - } - initialized = true; - return; + invalidate() { + this.cachedBalance = null; + this.cachedAt = 0; + } + async refresh() { + this.invalidate(); + return this.checkBalance(); + } + /** + * Check if balance is sufficient for an estimated cost. + */ + async checkSufficient(estimatedCostMicros) { + const info = await this.checkBalance(); + if (info.balance >= estimatedCostMicros) { + return { sufficient: true, info }; } + const shortfall = estimatedCostMicros - info.balance; + return { + sufficient: false, + info, + shortfall: this.formatUSDC(shortfall) + }; + } + /** + * Format USDC amount (in micros) as "$X.XX". + */ + formatUSDC(amountMicros) { + const dollars = Number(amountMicros) / 1e6; + return `$${dollars.toFixed(2)}`; + } + getWalletAddress() { + return this.walletAddress; + } + /** + * Check native SOL balance (in lamports). Useful for detecting users who + * funded with SOL instead of USDC. + */ + async checkSolBalance() { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS); try { - let logs; - if (filter) { - logs = await getAction(client, getFilterChanges, "getFilterChanges")({ filter }); - } else { - const blockNumber = await getAction(client, getBlockNumber, "getBlockNumber")({}); - if (previousBlockNumber && previousBlockNumber !== blockNumber) { - logs = await getAction(client, getLogs, "getLogs")({ - address: address2, - args, - event, - events, - fromBlock: previousBlockNumber + 1n, - toBlock: blockNumber - }); - } else { - logs = []; - } - previousBlockNumber = blockNumber; - } - if (logs.length === 0) - return; - if (batch) - emit.onLogs(logs); - else - for (const log of logs) - emit.onLogs([log]); - } catch (err) { - if (filter && err instanceof InvalidInputRpcError) - initialized = false; - emit.onError?.(err); - } - }, { - emitOnBegin: true, - interval: pollingInterval - }); - return async () => { - if (filter) - await getAction(client, uninstallFilter, "uninstallFilter")({ filter }); - unwatch(); - }; - }); - }; - const subscribeEvent = () => { - let active = true; - let unsubscribe = () => active = false; - (async () => { - try { - const transport = (() => { - if (client.transport.type === "fallback") { - const transport2 = client.transport.transports.find((transport3) => transport3.config.type === "webSocket" || transport3.config.type === "ipc"); - if (!transport2) - return client.transport; - return transport2.value; - } - return client.transport; - })(); - const events_ = events ?? (event ? [event] : void 0); - let topics = []; - if (events_) { - const encoded = events_.flatMap((event2) => encodeEventTopics({ - abi: [event2], - eventName: event2.name, - args - })); - topics = [encoded]; - if (event) - topics = topics[0]; + const owner = address(this.walletAddress); + const response = await this.rpc.getBalance(owner).send({ abortSignal: controller.signal }); + return BigInt(response.value); + } catch { + return 0n; + } finally { + clearTimeout(timer); } - const { unsubscribe: unsubscribe_ } = await transport.subscribe({ - params: ["logs", { address: address2, topics }], - onData(data) { - if (!active) - return; - const log = data.result; - try { - const { eventName, args: args2 } = decodeEventLog({ - abi: events_ ?? [], - data: log.data, - topics: log.topics, - strict - }); - const formatted = formatLog(log, { args: args2, eventName }); - onLogs([formatted]); - } catch (err) { - let eventName; - let isUnnamed; - if (err instanceof DecodeLogDataMismatch || err instanceof DecodeLogTopicsMismatch) { - if (strict_) - return; - eventName = err.abiItem.name; - isUnnamed = err.abiItem.inputs?.some((x) => !("name" in x && x.name)); - } - const formatted = formatLog(log, { - args: isUnnamed ? [] : {}, - eventName - }); - onLogs([formatted]); + } + async fetchBalance() { + const owner = address(this.walletAddress); + const mint = address(SOLANA_USDC_MINT); + const MAX_ATTEMPTS = 3; + let lastError; + for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { + try { + const result = await this.fetchBalanceOnce(owner, mint); + if (result > 0n) return result; + if (attempt < MAX_ATTEMPTS - 1) { + await new Promise((r) => setTimeout(r, 1500 * (attempt + 1))); + } + } catch (err) { + lastError = err; + if (attempt < MAX_ATTEMPTS - 1) { + await new Promise((r) => setTimeout(r, 1500 * (attempt + 1))); } - }, - onError(error) { - onError?.(error); } - }); - unsubscribe = unsubscribe_; - if (!active) - unsubscribe(); - } catch (err) { - onError?.(err); + } + if (lastError !== void 0) throw lastError; + return 0n; } - })(); - return () => unsubscribe(); - }; - return enablePolling ? pollEvent() : subscribeEvent(); -} - -// node_modules/viem/_esm/actions/public/watchPendingTransactions.js -init_stringify(); -function watchPendingTransactions(client, { batch = true, onError, onTransactions, poll: poll_, pollingInterval = client.pollingInterval }) { - const enablePolling = typeof poll_ !== "undefined" ? poll_ : client.transport.type !== "webSocket" && client.transport.type !== "ipc"; - const pollPendingTransactions = () => { - const observerId = stringify([ - "watchPendingTransactions", - client.uid, - batch, - pollingInterval - ]); - return observe(observerId, { onTransactions, onError }, (emit) => { - let filter; - const unwatch = poll(async () => { + async fetchBalanceOnce(owner, mint) { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS); try { - if (!filter) { - try { - filter = await getAction(client, createPendingTransactionFilter, "createPendingTransactionFilter")({}); - return; - } catch (err) { - unwatch(); - throw err; - } + const response = await this.rpc.getTokenAccountsByOwner(owner, { mint }, { encoding: "jsonParsed" }).send({ abortSignal: controller.signal }); + if (response.value.length === 0) return 0n; + let total = 0n; + for (const account of response.value) { + const parsed = account.account.data; + total += BigInt(parsed.parsed.info.tokenAmount.amount); } - const hashes = await getAction(client, getFilterChanges, "getFilterChanges")({ filter }); - if (hashes.length === 0) - return; - if (batch) - emit.onTransactions(hashes); - else - for (const hash3 of hashes) - emit.onTransactions([hash3]); + return total; } catch (err) { - emit.onError?.(err); + throw new Error( + `Failed to fetch Solana USDC balance: ${err instanceof Error ? err.message : String(err)}`, + { cause: err } + ); + } finally { + clearTimeout(timer); } - }, { - emitOnBegin: true, - interval: pollingInterval - }); - return async () => { - if (filter) - await getAction(client, uninstallFilter, "uninstallFilter")({ filter }); - unwatch(); - }; - }); - }; - const subscribePendingTransactions = () => { - let active = true; - let unsubscribe = () => active = false; - (async () => { - try { - const { unsubscribe: unsubscribe_ } = await client.transport.subscribe({ - params: ["newPendingTransactions"], - onData(data) { - if (!active) - return; - const transaction = data.result; - onTransactions([transaction]); - }, - onError(error) { - onError?.(error); - } - }); - unsubscribe = unsubscribe_; - if (!active) - unsubscribe(); - } catch (err) { - onError?.(err); } - })(); - return () => unsubscribe(); - }; - return enablePolling ? pollPendingTransactions() : subscribePendingTransactions(); + buildInfo(balance) { + const dollars = Number(balance) / 1e6; + return { + balance, + balanceUSD: `$${dollars.toFixed(2)}`, + isLow: balance < 1000000n, + isEmpty: balance < 100n, + walletAddress: this.walletAddress + }; + } + }; + } +}); + +// node_modules/@x402/svm/node_modules/@solana-program/token/dist/src/index.mjs +var TOKEN_PROGRAM_ADDRESS, ASSOCIATED_TOKEN_ERROR__INVALID_OWNER, associatedTokenErrorMessages, TOKEN_ERROR__NOT_RENT_EXEMPT, TOKEN_ERROR__INSUFFICIENT_FUNDS, TOKEN_ERROR__INVALID_MINT, TOKEN_ERROR__MINT_MISMATCH, TOKEN_ERROR__OWNER_MISMATCH, TOKEN_ERROR__FIXED_SUPPLY, TOKEN_ERROR__ALREADY_IN_USE, TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS, TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS, TOKEN_ERROR__UNINITIALIZED_STATE, TOKEN_ERROR__NATIVE_NOT_SUPPORTED, TOKEN_ERROR__NON_NATIVE_HAS_BALANCE, TOKEN_ERROR__INVALID_INSTRUCTION, TOKEN_ERROR__INVALID_STATE, TOKEN_ERROR__OVERFLOW, TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED, TOKEN_ERROR__MINT_CANNOT_FREEZE, TOKEN_ERROR__ACCOUNT_FROZEN, TOKEN_ERROR__MINT_DECIMALS_MISMATCH, TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED, tokenErrorMessages; +var init_src = __esm({ + "node_modules/@x402/svm/node_modules/@solana-program/token/dist/src/index.mjs"() { + "use strict"; + TOKEN_PROGRAM_ADDRESS = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + ASSOCIATED_TOKEN_ERROR__INVALID_OWNER = 0; + if (process.env.NODE_ENV !== "production") { + associatedTokenErrorMessages = { + [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER]: `Associated token account owner does not match address derivation` + }; + } + TOKEN_ERROR__NOT_RENT_EXEMPT = 0; + TOKEN_ERROR__INSUFFICIENT_FUNDS = 1; + TOKEN_ERROR__INVALID_MINT = 2; + TOKEN_ERROR__MINT_MISMATCH = 3; + TOKEN_ERROR__OWNER_MISMATCH = 4; + TOKEN_ERROR__FIXED_SUPPLY = 5; + TOKEN_ERROR__ALREADY_IN_USE = 6; + TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 7; + TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 8; + TOKEN_ERROR__UNINITIALIZED_STATE = 9; + TOKEN_ERROR__NATIVE_NOT_SUPPORTED = 10; + TOKEN_ERROR__NON_NATIVE_HAS_BALANCE = 11; + TOKEN_ERROR__INVALID_INSTRUCTION = 12; + TOKEN_ERROR__INVALID_STATE = 13; + TOKEN_ERROR__OVERFLOW = 14; + TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 15; + TOKEN_ERROR__MINT_CANNOT_FREEZE = 16; + TOKEN_ERROR__ACCOUNT_FROZEN = 17; + TOKEN_ERROR__MINT_DECIMALS_MISMATCH = 18; + TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED = 19; + if (process.env.NODE_ENV !== "production") { + tokenErrorMessages = { + [TOKEN_ERROR__ACCOUNT_FROZEN]: `Account is frozen`, + [TOKEN_ERROR__ALREADY_IN_USE]: `Already in use`, + [TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`, + [TOKEN_ERROR__FIXED_SUPPLY]: `Fixed supply`, + [TOKEN_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`, + [TOKEN_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`, + [TOKEN_ERROR__INVALID_MINT]: `Invalid Mint`, + [TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`, + [TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`, + [TOKEN_ERROR__INVALID_STATE]: `State is invalid for requested operation`, + [TOKEN_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`, + [TOKEN_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`, + [TOKEN_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`, + [TOKEN_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`, + [TOKEN_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`, + [TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`, + [TOKEN_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`, + [TOKEN_ERROR__OVERFLOW]: `Operation overflowed`, + [TOKEN_ERROR__OWNER_MISMATCH]: `Owner does not match`, + [TOKEN_ERROR__UNINITIALIZED_STATE]: `State is unititialized` + }; + } + if (process.env.NODE_ENV !== "production") ; + } +}); + +// node_modules/@x402/svm/node_modules/@solana-program/token-2022/dist/src/index.mjs +function getAccountStateDecoder() { + return getEnumDecoder(AccountState); +} +function getDecryptableBalanceDecoder() { + return fixDecoderSize(getBytesDecoder(), 36); +} +function getEncryptedBalanceDecoder() { + return fixDecoderSize(getBytesDecoder(), 64); +} +function getExtensionDecoder() { + return getDiscriminatedUnionDecoder( + [ + ["Uninitialized", getUnitDecoder()], + [ + "TransferFeeConfig", + addDecoderSizePrefix( + getStructDecoder([ + ["transferFeeConfigAuthority", getAddressDecoder()], + ["withdrawWithheldAuthority", getAddressDecoder()], + ["withheldAmount", getU64Decoder()], + ["olderTransferFee", getTransferFeeDecoder()], + ["newerTransferFee", getTransferFeeDecoder()] + ]), + getU16Decoder() + ) + ], + [ + "TransferFeeAmount", + addDecoderSizePrefix( + getStructDecoder([["withheldAmount", getU64Decoder()]]), + getU16Decoder() + ) + ], + [ + "MintCloseAuthority", + addDecoderSizePrefix( + getStructDecoder([["closeAuthority", getAddressDecoder()]]), + getU16Decoder() + ) + ], + [ + "ConfidentialTransferMint", + addDecoderSizePrefix( + getStructDecoder([ + [ + "authority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + ["autoApproveNewAccounts", getBooleanDecoder()], + [ + "auditorElgamalPubkey", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ] + ]), + getU16Decoder() + ) + ], + [ + "ConfidentialTransferAccount", + addDecoderSizePrefix( + getStructDecoder([ + ["approved", getBooleanDecoder()], + ["elgamalPubkey", getAddressDecoder()], + ["pendingBalanceLow", getEncryptedBalanceDecoder()], + ["pendingBalanceHigh", getEncryptedBalanceDecoder()], + ["availableBalance", getEncryptedBalanceDecoder()], + ["decryptableAvailableBalance", getDecryptableBalanceDecoder()], + ["allowConfidentialCredits", getBooleanDecoder()], + ["allowNonConfidentialCredits", getBooleanDecoder()], + ["pendingBalanceCreditCounter", getU64Decoder()], + ["maximumPendingBalanceCreditCounter", getU64Decoder()], + ["expectedPendingBalanceCreditCounter", getU64Decoder()], + ["actualPendingBalanceCreditCounter", getU64Decoder()] + ]), + getU16Decoder() + ) + ], + [ + "DefaultAccountState", + addDecoderSizePrefix( + getStructDecoder([["state", getAccountStateDecoder()]]), + getU16Decoder() + ) + ], + [ + "ImmutableOwner", + addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()) + ], + [ + "MemoTransfer", + addDecoderSizePrefix( + getStructDecoder([ + ["requireIncomingTransferMemos", getBooleanDecoder()] + ]), + getU16Decoder() + ) + ], + [ + "NonTransferable", + addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()) + ], + [ + "InterestBearingConfig", + addDecoderSizePrefix( + getStructDecoder([ + ["rateAuthority", getAddressDecoder()], + ["initializationTimestamp", getU64Decoder()], + ["preUpdateAverageRate", getI16Decoder()], + ["lastUpdateTimestamp", getU64Decoder()], + ["currentRate", getI16Decoder()] + ]), + getU16Decoder() + ) + ], + [ + "CpiGuard", + addDecoderSizePrefix( + getStructDecoder([["lockCpi", getBooleanDecoder()]]), + getU16Decoder() + ) + ], + [ + "PermanentDelegate", + addDecoderSizePrefix( + getStructDecoder([["delegate", getAddressDecoder()]]), + getU16Decoder() + ) + ], + [ + "NonTransferableAccount", + addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()) + ], + [ + "TransferHook", + addDecoderSizePrefix( + getStructDecoder([ + ["authority", getAddressDecoder()], + ["programId", getAddressDecoder()] + ]), + getU16Decoder() + ) + ], + [ + "TransferHookAccount", + addDecoderSizePrefix( + getStructDecoder([["transferring", getBooleanDecoder()]]), + getU16Decoder() + ) + ], + [ + "ConfidentialTransferFee", + addDecoderSizePrefix( + getStructDecoder([ + [ + "authority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + ["elgamalPubkey", getAddressDecoder()], + ["harvestToMintEnabled", getBooleanDecoder()], + ["withheldAmount", getEncryptedBalanceDecoder()] + ]), + getU16Decoder() + ) + ], + [ + "ConfidentialTransferFeeAmount", + addDecoderSizePrefix( + getStructDecoder([["withheldAmount", getEncryptedBalanceDecoder()]]), + getU16Decoder() + ) + ], + [ + "MetadataPointer", + addDecoderSizePrefix( + getStructDecoder([ + [ + "authority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + [ + "metadataAddress", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ] + ]), + getU16Decoder() + ) + ], + [ + "TokenMetadata", + addDecoderSizePrefix( + getStructDecoder([ + [ + "updateAuthority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + ["mint", getAddressDecoder()], + ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["symbol", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["uri", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + [ + "additionalMetadata", + getMapDecoder( + addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()), + addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()) + ) + ] + ]), + getU16Decoder() + ) + ], + [ + "GroupPointer", + addDecoderSizePrefix( + getStructDecoder([ + [ + "authority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + [ + "groupAddress", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ] + ]), + getU16Decoder() + ) + ], + [ + "TokenGroup", + addDecoderSizePrefix( + getStructDecoder([ + [ + "updateAuthority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + ["mint", getAddressDecoder()], + ["size", getU64Decoder()], + ["maxSize", getU64Decoder()] + ]), + getU16Decoder() + ) + ], + [ + "GroupMemberPointer", + addDecoderSizePrefix( + getStructDecoder([ + [ + "authority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + [ + "memberAddress", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ] + ]), + getU16Decoder() + ) + ], + [ + "TokenGroupMember", + addDecoderSizePrefix( + getStructDecoder([ + ["mint", getAddressDecoder()], + ["group", getAddressDecoder()], + ["memberNumber", getU64Decoder()] + ]), + getU16Decoder() + ) + ], + ["ConfidentialMintBurn", getUnitDecoder()], + [ + "ScaledUiAmountConfig", + addDecoderSizePrefix( + getStructDecoder([ + ["authority", getAddressDecoder()], + ["multiplier", getF64Decoder()], + ["newMultiplierEffectiveTimestamp", getU64Decoder()], + ["newMultiplier", getF64Decoder()] + ]), + getU16Decoder() + ) + ], + [ + "PausableConfig", + addDecoderSizePrefix( + getStructDecoder([ + [ + "authority", + getOptionDecoder(getAddressDecoder(), { + prefix: null, + noneValue: "zeroes" + }) + ], + ["paused", getBooleanDecoder()] + ]), + getU16Decoder() + ) + ], + ["PausableAccount", getUnitDecoder()] + ], + { size: getU16Decoder() } + ); +} +function getTransferFeeDecoder() { + return getStructDecoder([ + ["epoch", getU64Decoder()], + ["maximumFee", getU64Decoder()], + ["transferFeeBasisPoints", getU16Decoder()] + ]); } - -// node_modules/viem/_esm/actions/siwe/verifySiweMessage.js -init_hashMessage(); - -// node_modules/viem/_esm/utils/siwe/parseSiweMessage.js -function parseSiweMessage(message) { - const { scheme, statement, ...prefix } = message.match(prefixRegex)?.groups ?? {}; - const { chainId, expirationTime, issuedAt, notBefore, requestId, ...suffix } = message.match(suffixRegex)?.groups ?? {}; - const resources = message.split("Resources:")[1]?.split("\n- ").slice(1); - return { - ...prefix, - ...suffix, - ...chainId ? { chainId: Number(chainId) } : {}, - ...expirationTime ? { expirationTime: new Date(expirationTime) } : {}, - ...issuedAt ? { issuedAt: new Date(issuedAt) } : {}, - ...notBefore ? { notBefore: new Date(notBefore) } : {}, - ...requestId ? { requestId } : {}, - ...resources ? { resources } : {}, - ...scheme ? { scheme } : {}, - ...statement ? { statement } : {} - }; +function getMintDecoder() { + return getStructDecoder([ + [ + "mintAuthority", + getOptionDecoder(getAddressDecoder(), { + prefix: getU32Decoder(), + noneValue: "zeroes" + }) + ], + ["supply", getU64Decoder()], + ["decimals", getU8Decoder()], + ["isInitialized", getBooleanDecoder()], + [ + "freezeAuthority", + getOptionDecoder(getAddressDecoder(), { + prefix: getU32Decoder(), + noneValue: "zeroes" + }) + ], + [ + "extensions", + getOptionDecoder( + getHiddenPrefixDecoder( + getArrayDecoder(getExtensionDecoder(), { size: "remainder" }), + [getConstantDecoder(padLeftEncoder(getU8Encoder(), 83).encode(1))] + ), + { prefix: null } + ) + ] + ]); } -var prefixRegex = /^(?:(?[a-zA-Z][a-zA-Z0-9+-.]*):\/\/)?(?[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\n)(?
0x[a-fA-F0-9]{40})\n\n(?:(?.*)\n\n)?/; -var suffixRegex = /(?:URI: (?.+))\n(?:Version: (?.+))\n(?:Chain ID: (?\d+))\n(?:Nonce: (?[a-zA-Z0-9]+))\n(?:Issued At: (?.+))(?:\nExpiration Time: (?.+))?(?:\nNot Before: (?.+))?(?:\nRequest ID: (?.+))?/; - -// node_modules/viem/_esm/utils/siwe/validateSiweMessage.js -init_isAddress(); -init_isAddressEqual(); -function validateSiweMessage(parameters) { - const { address: address2, domain, message, nonce, scheme, time = /* @__PURE__ */ new Date() } = parameters; - if (domain && message.domain !== domain) - return false; - if (nonce && message.nonce !== nonce) - return false; - if (scheme && message.scheme !== scheme) - return false; - if (message.expirationTime && time >= message.expirationTime) - return false; - if (message.notBefore && time < message.notBefore) - return false; - try { - if (!message.address) - return false; - if (!isAddress(message.address, { strict: false })) - return false; - if (address2 && !isAddressEqual(message.address, address2)) - return false; - } catch { - return false; - } - return true; +function decodeMint(encodedAccount) { + return decodeAccount( + encodedAccount, + getMintDecoder() + ); } - -// node_modules/viem/_esm/actions/siwe/verifySiweMessage.js -async function verifySiweMessage(client, parameters) { - const { address: address2, domain, message, nonce, scheme, signature: signature2, time = /* @__PURE__ */ new Date(), ...callRequest } = parameters; - const parsed = parseSiweMessage(message); - if (!parsed.address) - return false; - const isValid2 = validateSiweMessage({ - address: address2, - domain, - message: parsed, - nonce, - scheme, - time - }); - if (!isValid2) - return false; - const hash3 = hashMessage(message); - return verifyHash(client, { - address: parsed.address, - hash: hash3, - signature: signature2, - ...callRequest - }); +async function fetchMint(rpc, address2, config) { + const maybeAccount = await fetchMaybeMint(rpc, address2, config); + assertAccountExists(maybeAccount); + return maybeAccount; } - -// node_modules/viem/_esm/actions/wallet/sendRawTransactionSync.js -init_transaction(); -async function sendRawTransactionSync(client, { serializedTransaction, throwOnReceiptRevert, timeout }) { - const receipt = await client.request({ - method: "eth_sendRawTransactionSync", - params: timeout ? [serializedTransaction, timeout] : [serializedTransaction] - }, { retryCount: 0 }); - const format = client.chain?.formatters?.transactionReceipt?.format || formatTransactionReceipt; - const formatted = format(receipt); - if (formatted.status === "reverted" && throwOnReceiptRevert) - throw new TransactionReceiptRevertedError({ receipt: formatted }); - return formatted; +async function fetchMaybeMint(rpc, address2, config) { + const maybeAccount = await fetchEncodedAccount(rpc, address2, config); + return decodeMint(maybeAccount); } - -// node_modules/viem/_esm/clients/decorators/public.js -function publicActions(client) { - return { - call: (args) => call(client, args), - createAccessList: (args) => createAccessList(client, args), - createBlockFilter: () => createBlockFilter(client), - createContractEventFilter: (args) => createContractEventFilter(client, args), - createEventFilter: (args) => createEventFilter(client, args), - createPendingTransactionFilter: () => createPendingTransactionFilter(client), - estimateContractGas: (args) => estimateContractGas(client, args), - estimateGas: (args) => estimateGas(client, args), - getBalance: (args) => getBalance(client, args), - getBlobBaseFee: () => getBlobBaseFee(client), - getBlock: (args) => getBlock(client, args), - getBlockNumber: (args) => getBlockNumber(client, args), - getBlockTransactionCount: (args) => getBlockTransactionCount(client, args), - getBytecode: (args) => getCode(client, args), - getChainId: () => getChainId(client), - getCode: (args) => getCode(client, args), - getContractEvents: (args) => getContractEvents(client, args), - getDelegation: (args) => getDelegation(client, args), - getEip712Domain: (args) => getEip712Domain(client, args), - getEnsAddress: (args) => getEnsAddress(client, args), - getEnsAvatar: (args) => getEnsAvatar(client, args), - getEnsName: (args) => getEnsName(client, args), - getEnsResolver: (args) => getEnsResolver(client, args), - getEnsText: (args) => getEnsText(client, args), - getFeeHistory: (args) => getFeeHistory(client, args), - estimateFeesPerGas: (args) => estimateFeesPerGas(client, args), - getFilterChanges: (args) => getFilterChanges(client, args), - getFilterLogs: (args) => getFilterLogs(client, args), - getGasPrice: () => getGasPrice(client), - getLogs: (args) => getLogs(client, args), - getProof: (args) => getProof(client, args), - estimateMaxPriorityFeePerGas: (args) => estimateMaxPriorityFeePerGas(client, args), - fillTransaction: (args) => fillTransaction(client, args), - getStorageAt: (args) => getStorageAt(client, args), - getTransaction: (args) => getTransaction(client, args), - getTransactionConfirmations: (args) => getTransactionConfirmations(client, args), - getTransactionCount: (args) => getTransactionCount(client, args), - getTransactionReceipt: (args) => getTransactionReceipt(client, args), - multicall: (args) => multicall(client, args), - prepareTransactionRequest: (args) => prepareTransactionRequest(client, args), - readContract: (args) => readContract(client, args), - sendRawTransaction: (args) => sendRawTransaction(client, args), - sendRawTransactionSync: (args) => sendRawTransactionSync(client, args), - simulate: (args) => simulateBlocks(client, args), - simulateBlocks: (args) => simulateBlocks(client, args), - simulateCalls: (args) => simulateCalls(client, args), - simulateContract: (args) => simulateContract(client, args), - verifyHash: (args) => verifyHash(client, args), - verifyMessage: (args) => verifyMessage(client, args), - verifySiweMessage: (args) => verifySiweMessage(client, args), - verifyTypedData: (args) => verifyTypedData(client, args), - uninstallFilter: (args) => uninstallFilter(client, args), - waitForTransactionReceipt: (args) => waitForTransactionReceipt(client, args), - watchBlocks: (args) => watchBlocks(client, args), - watchBlockNumber: (args) => watchBlockNumber(client, args), - watchContractEvent: (args) => watchContractEvent(client, args), - watchEvent: (args) => watchEvent(client, args), - watchPendingTransactions: (args) => watchPendingTransactions(client, args) +function expectAddress(value) { + if (!value) { + throw new Error("Expected a Address."); + } + if (typeof value === "object" && "address" in value) { + return value.address; + } + if (Array.isArray(value)) { + return value[0]; + } + return value; +} +function getAccountMetaFactory(programAddress, optionalAccountStrategy) { + return (account) => { + if (!account.value) { + return Object.freeze({ + address: programAddress, + role: AccountRole.READONLY + }); + } + const writableRole = account.isWritable ? AccountRole.WRITABLE : AccountRole.READONLY; + return Object.freeze({ + address: expectAddress(account.value), + role: isTransactionSigner2(account.value) ? upgradeRoleToSigner(writableRole) : writableRole, + ...isTransactionSigner2(account.value) ? { signer: account.value } : {} + }); }; } - -// node_modules/viem/_esm/clients/createPublicClient.js -function createPublicClient(parameters) { - const { key = "public", name = "Public Client" } = parameters; - const client = createClient({ - ...parameters, - key, - name, - type: "publicClient" +function isTransactionSigner2(value) { + return !!value && typeof value === "object" && "address" in value && isTransactionSigner(value); +} +async function findAssociatedTokenPda(seeds, config = {}) { + const { + programAddress = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } = config; + return await getProgramDerivedAddress({ + programAddress, + seeds: [ + getAddressEncoder().encode(seeds.owner), + getAddressEncoder().encode(seeds.tokenProgram), + getAddressEncoder().encode(seeds.mint) + ] }); - return client.extend(publicActions); } - -// node_modules/viem/_esm/clients/transports/createTransport.js -function createTransport({ key, methods, name, request, retryCount = 3, retryDelay = 150, timeout, type }, value) { - const uid2 = uid(); - return { - config: { - key, - methods, - name, - request, - retryCount, - retryDelay, - timeout, - type - }, - request: buildRequest(request, { methods, retryCount, retryDelay, uid: uid2 }), - value - }; +function getTransferCheckedInstructionDataEncoder() { + return transformEncoder( + getStructEncoder([ + ["discriminator", getU8Encoder()], + ["amount", getU64Encoder()], + ["decimals", getU8Encoder()] + ]), + (value) => ({ ...value, discriminator: TRANSFER_CHECKED_DISCRIMINATOR }) + ); } - -// node_modules/viem/_esm/clients/transports/http.js -init_request(); - -// node_modules/viem/_esm/errors/transport.js -init_base(); -var UrlRequiredError = class extends BaseError2 { - constructor() { - super("No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.", { - docsPath: "/docs/clients/intro", - name: "UrlRequiredError" - }); - } -}; - -// node_modules/viem/_esm/clients/transports/http.js -init_createBatchScheduler(); -function http(url, config = {}) { - const { batch, fetchFn, fetchOptions, key = "http", methods, name = "HTTP JSON-RPC", onFetchRequest, onFetchResponse, retryDelay, raw } = config; - return ({ chain: chain3, retryCount: retryCount_, timeout: timeout_ }) => { - const { batchSize = 1e3, wait: wait2 = 0 } = typeof batch === "object" ? batch : {}; - const retryCount = config.retryCount ?? retryCount_; - const timeout = timeout_ ?? config.timeout ?? 1e4; - const url_ = url || chain3?.rpcUrls.default.http[0]; - if (!url_) - throw new UrlRequiredError(); - const rpcClient = getHttpRpcClient(url_, { - fetchFn, - fetchOptions, - onRequest: onFetchRequest, - onResponse: onFetchResponse, - timeout - }); - return createTransport({ - key, - methods, - name, - async request({ method, params }) { - const body = { method, params }; - const { schedule } = createBatchScheduler({ - id: url_, - wait: wait2, - shouldSplitBatch(requests) { - return requests.length > batchSize; - }, - fn: (body2) => rpcClient.request({ - body: body2 - }), - sort: (a, b) => a.id - b.id - }); - const fn = async (body2) => batch ? schedule(body2) : [ - await rpcClient.request({ - body: body2 - }) - ]; - const [{ error, result }] = await fn(body); - if (raw) - return { error, result }; - if (error) - throw new RpcRequestError({ - body, - error, - url: url_ - }); - return result; - }, - retryCount, - retryDelay, - timeout, - type: "http" - }, { - fetchOptions, - url: url_ - }); +function getTransferCheckedInstruction(input, config) { + const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS; + const originalAccounts = { + source: { value: input.source ?? null, isWritable: true }, + mint: { value: input.mint ?? null, isWritable: false }, + destination: { value: input.destination ?? null, isWritable: true }, + authority: { value: input.authority ?? null, isWritable: false } }; + const accounts = originalAccounts; + const args = { ...input }; + const remainingAccounts = (args.multiSigners ?? []).map( + (signer) => ({ + address: signer.address, + role: AccountRole.READONLY_SIGNER, + signer + }) + ); + const getAccountMeta = getAccountMetaFactory(programAddress); + return Object.freeze({ + accounts: [ + getAccountMeta(accounts.source), + getAccountMeta(accounts.mint), + getAccountMeta(accounts.destination), + getAccountMeta(accounts.authority), + ...remainingAccounts + ], + data: getTransferCheckedInstructionDataEncoder().encode( + args + ), + programAddress + }); } +var AccountState, TOKEN_2022_PROGRAM_ADDRESS, ASSOCIATED_TOKEN_ERROR__INVALID_OWNER2, associatedTokenErrorMessages2, TOKEN_2022_ERROR__NOT_RENT_EXEMPT, TOKEN_2022_ERROR__INSUFFICIENT_FUNDS, TOKEN_2022_ERROR__INVALID_MINT, TOKEN_2022_ERROR__MINT_MISMATCH, TOKEN_2022_ERROR__OWNER_MISMATCH, TOKEN_2022_ERROR__FIXED_SUPPLY, TOKEN_2022_ERROR__ALREADY_IN_USE, TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS, TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS, TOKEN_2022_ERROR__UNINITIALIZED_STATE, TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED, TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE, TOKEN_2022_ERROR__INVALID_INSTRUCTION, TOKEN_2022_ERROR__INVALID_STATE, TOKEN_2022_ERROR__OVERFLOW, TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED, TOKEN_2022_ERROR__MINT_CANNOT_FREEZE, TOKEN_2022_ERROR__ACCOUNT_FROZEN, TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH, TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED, token2022ErrorMessages, EMIT_TOKEN_METADATA_DISCRIMINATOR, INITIALIZE_TOKEN_GROUP_DISCRIMINATOR, INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR, INITIALIZE_TOKEN_METADATA_DISCRIMINATOR, REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR, TRANSFER_CHECKED_DISCRIMINATOR, UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR, UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR, UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR, UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR, SECONDS_PER_YEAR; +var init_src2 = __esm({ + "node_modules/@x402/svm/node_modules/@solana-program/token-2022/dist/src/index.mjs"() { + "use strict"; + init_index_node37(); + AccountState = /* @__PURE__ */ ((AccountState2) => { + AccountState2[AccountState2["Uninitialized"] = 0] = "Uninitialized"; + AccountState2[AccountState2["Initialized"] = 1] = "Initialized"; + AccountState2[AccountState2["Frozen"] = 2] = "Frozen"; + return AccountState2; + })(AccountState || {}); + TOKEN_2022_PROGRAM_ADDRESS = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"; + ASSOCIATED_TOKEN_ERROR__INVALID_OWNER2 = 0; + if (process.env.NODE_ENV !== "production") { + associatedTokenErrorMessages2 = { + [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER2]: `Associated token account owner does not match address derivation` + }; + } + TOKEN_2022_ERROR__NOT_RENT_EXEMPT = 0; + TOKEN_2022_ERROR__INSUFFICIENT_FUNDS = 1; + TOKEN_2022_ERROR__INVALID_MINT = 2; + TOKEN_2022_ERROR__MINT_MISMATCH = 3; + TOKEN_2022_ERROR__OWNER_MISMATCH = 4; + TOKEN_2022_ERROR__FIXED_SUPPLY = 5; + TOKEN_2022_ERROR__ALREADY_IN_USE = 6; + TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 7; + TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 8; + TOKEN_2022_ERROR__UNINITIALIZED_STATE = 9; + TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED = 10; + TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE = 11; + TOKEN_2022_ERROR__INVALID_INSTRUCTION = 12; + TOKEN_2022_ERROR__INVALID_STATE = 13; + TOKEN_2022_ERROR__OVERFLOW = 14; + TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 15; + TOKEN_2022_ERROR__MINT_CANNOT_FREEZE = 16; + TOKEN_2022_ERROR__ACCOUNT_FROZEN = 17; + TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH = 18; + TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED = 19; + if (process.env.NODE_ENV !== "production") { + token2022ErrorMessages = { + [TOKEN_2022_ERROR__ACCOUNT_FROZEN]: `Account is frozen`, + [TOKEN_2022_ERROR__ALREADY_IN_USE]: `Already in use`, + [TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`, + [TOKEN_2022_ERROR__FIXED_SUPPLY]: `Fixed supply`, + [TOKEN_2022_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`, + [TOKEN_2022_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`, + [TOKEN_2022_ERROR__INVALID_MINT]: `Invalid Mint`, + [TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`, + [TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`, + [TOKEN_2022_ERROR__INVALID_STATE]: `State is invalid for requested operation`, + [TOKEN_2022_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`, + [TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`, + [TOKEN_2022_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`, + [TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`, + [TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`, + [TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`, + [TOKEN_2022_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`, + [TOKEN_2022_ERROR__OVERFLOW]: `Operation overflowed`, + [TOKEN_2022_ERROR__OWNER_MISMATCH]: `Owner does not match`, + [TOKEN_2022_ERROR__UNINITIALIZED_STATE]: `State is unititialized` + }; + } + EMIT_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([ + 250, + 166, + 180, + 250, + 13, + 12, + 184, + 70 + ]); + INITIALIZE_TOKEN_GROUP_DISCRIMINATOR = new Uint8Array([ + 121, + 113, + 108, + 39, + 54, + 51, + 0, + 4 + ]); + INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR = new Uint8Array([ + 152, + 32, + 222, + 176, + 223, + 237, + 116, + 134 + ]); + INITIALIZE_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([ + 210, + 225, + 30, + 162, + 88, + 184, + 77, + 141 + ]); + REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR = new Uint8Array([ + 234, + 18, + 32, + 56, + 89, + 141, + 37, + 181 + ]); + TRANSFER_CHECKED_DISCRIMINATOR = 12; + UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR = new Uint8Array([ + 108, + 37, + 171, + 143, + 248, + 30, + 18, + 110 + ]); + UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR = new Uint8Array( + [161, 105, 88, 1, 237, 221, 216, 203] + ); + UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR = new Uint8Array([ + 221, + 233, + 49, + 45, + 181, + 202, + 220, + 200 + ]); + UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR = new Uint8Array([215, 228, 166, 228, 84, 100, 86, 123]); + SECONDS_PER_YEAR = 60 * 60 * 24 * 365.24; + } +}); -// node_modules/viem/_esm/index.js -init_abis(); -init_number(); -init_encodeFunctionData(); -init_getAddress(); -init_toHex(); - -// node_modules/viem/_esm/op-stack/contracts.js -var contracts = { - gasPriceOracle: { address: "0x420000000000000000000000000000000000000F" }, - l1Block: { address: "0x4200000000000000000000000000000000000015" }, - l2CrossDomainMessenger: { - address: "0x4200000000000000000000000000000000000007" - }, - l2Erc721Bridge: { address: "0x4200000000000000000000000000000000000014" }, - l2StandardBridge: { address: "0x4200000000000000000000000000000000000010" }, - l2ToL1MessagePasser: { - address: "0x4200000000000000000000000000000000000016" +// node_modules/@x402/svm/dist/esm/chunk-HEVXVNO4.mjs +function normalizeNetwork(network) { + if (network.includes(":")) { + const supported = [SOLANA_MAINNET_CAIP2, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2]; + if (!supported.includes(network)) { + throw new Error(`Unsupported SVM network: ${network}`); + } + return network; } -}; - -// node_modules/viem/_esm/op-stack/formatters.js -init_fromHex(); -var formatters = { - block: /* @__PURE__ */ defineBlock({ - format(args) { - const transactions = args.transactions?.map((transaction) => { - if (typeof transaction === "string") - return transaction; - const formatted = formatTransaction(transaction); - if (formatted.typeHex === "0x7e") { - formatted.isSystemTx = transaction.isSystemTx; - formatted.mint = transaction.mint ? hexToBigInt(transaction.mint) : void 0; - formatted.sourceHash = transaction.sourceHash; - formatted.type = "deposit"; - } - return formatted; - }); - return { - transactions, - stateRoot: args.stateRoot - }; + const caip2Network = V1_TO_V2_NETWORK_MAP[network]; + if (!caip2Network) { + throw new Error(`Unsupported SVM network: ${network}`); + } + return caip2Network; +} +function createRpcClient(network, customRpcUrl) { + const caip2Network = normalizeNetwork(network); + switch (caip2Network) { + case SOLANA_DEVNET_CAIP2: { + const url = customRpcUrl || DEVNET_RPC_URL; + return createSolanaRpc(devnet(url)); } - }), - transaction: /* @__PURE__ */ defineTransaction({ - format(args) { - const transaction = {}; - if (args.type === "0x7e") { - transaction.isSystemTx = args.isSystemTx; - transaction.mint = args.mint ? hexToBigInt(args.mint) : void 0; - transaction.sourceHash = args.sourceHash; - transaction.type = "deposit"; - } - return transaction; + case SOLANA_TESTNET_CAIP2: { + const url = customRpcUrl || TESTNET_RPC_URL; + return createSolanaRpc(testnet(url)); } - }), - transactionReceipt: /* @__PURE__ */ defineTransactionReceipt({ - format(args) { - return { - l1GasPrice: args.l1GasPrice ? hexToBigInt(args.l1GasPrice) : null, - l1GasUsed: args.l1GasUsed ? hexToBigInt(args.l1GasUsed) : null, - l1Fee: args.l1Fee ? hexToBigInt(args.l1Fee) : null, - l1FeeScalar: args.l1FeeScalar ? Number(args.l1FeeScalar) : null - }; + case SOLANA_MAINNET_CAIP2: { + const url = customRpcUrl || MAINNET_RPC_URL; + return createSolanaRpc(mainnet(url)); } - }) -}; + default: + throw new Error(`Unsupported network: ${network}`); + } +} +var MEMO_PROGRAM_ADDRESS, DEVNET_RPC_URL, TESTNET_RPC_URL, MAINNET_RPC_URL, DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, DEFAULT_COMPUTE_UNIT_LIMIT, SOLANA_MAINNET_CAIP2, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2, V1_TO_V2_NETWORK_MAP; +var init_chunk_HEVXVNO4 = __esm({ + "node_modules/@x402/svm/dist/esm/chunk-HEVXVNO4.mjs"() { + "use strict"; + init_index_node37(); + MEMO_PROGRAM_ADDRESS = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"; + DEVNET_RPC_URL = "https://api.devnet.solana.com"; + TESTNET_RPC_URL = "https://api.testnet.solana.com"; + MAINNET_RPC_URL = "https://api.mainnet-beta.solana.com"; + DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1; + DEFAULT_COMPUTE_UNIT_LIMIT = 2e4; + SOLANA_MAINNET_CAIP2 = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"; + SOLANA_DEVNET_CAIP2 = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"; + SOLANA_TESTNET_CAIP2 = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"; + V1_TO_V2_NETWORK_MAP = { + solana: SOLANA_MAINNET_CAIP2, + "solana-devnet": SOLANA_DEVNET_CAIP2, + "solana-testnet": SOLANA_TESTNET_CAIP2 + }; + } +}); -// node_modules/viem/_esm/op-stack/serializers.js -init_address(); -init_isAddress(); -init_concat(); -init_toHex(); -init_toRlp(); -init_serializeTransaction(); -function serializeTransaction2(transaction, signature2) { - if (isDeposit(transaction)) - return serializeTransactionDeposit(transaction); - return serializeTransaction(transaction, signature2); +// node_modules/@x402/svm/node_modules/@solana-program/compute-budget/dist/src/index.mjs +function getSetComputeUnitLimitInstructionDataEncoder() { + return transformEncoder( + getStructEncoder([ + ["discriminator", getU8Encoder()], + ["units", getU32Encoder()] + ]), + (value) => ({ + ...value, + discriminator: SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR + }) + ); } -var serializers = { - transaction: serializeTransaction2 -}; -function serializeTransactionDeposit(transaction) { - assertTransactionDeposit(transaction); - const { sourceHash, data, from: from14, gas, isSystemTx, mint, to, value } = transaction; - const serializedTransaction = [ - sourceHash, - from14, - to ?? "0x", - mint ? toHex(mint) : "0x", - value ? toHex(value) : "0x", - gas ? toHex(gas) : "0x", - isSystemTx ? "0x1" : "0x", - data ?? "0x" - ]; - return concatHex([ - "0x7e", - toRlp(serializedTransaction) - ]); +function getSetComputeUnitLimitInstruction(input, config) { + const programAddress = config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS; + const args = { ...input }; + return Object.freeze({ + data: getSetComputeUnitLimitInstructionDataEncoder().encode( + args + ), + programAddress + }); } -function isDeposit(transaction) { - if (transaction.type === "deposit") - return true; - if (typeof transaction.sourceHash !== "undefined") - return true; - return false; +function getSetComputeUnitPriceInstructionDataEncoder() { + return transformEncoder( + getStructEncoder([ + ["discriminator", getU8Encoder()], + ["microLamports", getU64Encoder()] + ]), + (value) => ({ + ...value, + discriminator: SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR + }) + ); } -function assertTransactionDeposit(transaction) { - const { from: from14, to } = transaction; - if (from14 && !isAddress(from14)) - throw new InvalidAddressError({ address: from14 }); - if (to && !isAddress(to)) - throw new InvalidAddressError({ address: to }); +function getSetComputeUnitPriceInstruction(input, config) { + const programAddress = config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS; + const args = { ...input }; + return Object.freeze({ + data: getSetComputeUnitPriceInstructionDataEncoder().encode( + args + ), + programAddress + }); } +function setTransactionMessageComputeUnitPrice(microLamports, transactionMessage) { + return appendTransactionMessageInstruction( + getSetComputeUnitPriceInstruction({ microLamports }), + transactionMessage + ); +} +var COMPUTE_BUDGET_PROGRAM_ADDRESS, SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR, SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR; +var init_src3 = __esm({ + "node_modules/@x402/svm/node_modules/@solana-program/compute-budget/dist/src/index.mjs"() { + "use strict"; + init_index_node37(); + COMPUTE_BUDGET_PROGRAM_ADDRESS = "ComputeBudget111111111111111111111111111111"; + SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR = 2; + SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR = 3; + } +}); -// node_modules/viem/_esm/op-stack/chainConfig.js -var chainConfig = { - blockTime: 2e3, - contracts, - formatters, - serializers -}; - -// node_modules/viem/_esm/chains/definitions/base.js -var sourceId = 1; -var base = /* @__PURE__ */ defineChain({ - ...chainConfig, - id: 8453, - name: "Base", - nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 }, - rpcUrls: { - default: { - http: ["https://mainnet.base.org"] - } - }, - blockExplorers: { - default: { - name: "Basescan", - url: "https://basescan.org", - apiUrl: "https://api.basescan.org/api" - } - }, - contracts: { - ...chainConfig.contracts, - disputeGameFactory: { - [sourceId]: { - address: "0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e" +// node_modules/@x402/svm/dist/esm/chunk-6GZCHEXV.mjs +var ExactSvmScheme; +var init_chunk_6GZCHEXV = __esm({ + "node_modules/@x402/svm/dist/esm/chunk-6GZCHEXV.mjs"() { + "use strict"; + init_chunk_HEVXVNO4(); + init_src3(); + init_src(); + init_src2(); + init_index_node37(); + ExactSvmScheme = class { + /** + * Creates a new ExactSvmClient instance. + * + * @param signer - The SVM signer for client operations + * @param config - Optional configuration with custom RPC URL + * @returns ExactSvmClient instance + */ + constructor(signer, config) { + this.signer = signer; + this.config = config; + this.scheme = "exact"; } - }, - l2OutputOracle: { - [sourceId]: { - address: "0x56315b90c40730925ec5485cf004d835058518A0" + /** + * Creates a payment payload for the Exact scheme. + * + * @param x402Version - The x402 protocol version + * @param paymentRequirements - The payment requirements + * @returns Promise resolving to a payment payload + */ + async createPaymentPayload(x402Version2, paymentRequirements) { + const rpc = createRpcClient(paymentRequirements.network, this.config?.rpcUrl); + const tokenMint = await fetchMint(rpc, paymentRequirements.asset); + const tokenProgramAddress = tokenMint.programAddress; + if (tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() && tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()) { + throw new Error("Asset was not created by a known token program"); + } + const [sourceATA] = await findAssociatedTokenPda({ + mint: paymentRequirements.asset, + owner: this.signer.address, + tokenProgram: tokenProgramAddress + }); + const [destinationATA] = await findAssociatedTokenPda({ + mint: paymentRequirements.asset, + owner: paymentRequirements.payTo, + tokenProgram: tokenProgramAddress + }); + const transferIx = getTransferCheckedInstruction( + { + source: sourceATA, + mint: paymentRequirements.asset, + destination: destinationATA, + authority: this.signer, + amount: BigInt(paymentRequirements.amount), + decimals: tokenMint.data.decimals + }, + { programAddress: tokenProgramAddress } + ); + const feePayer = paymentRequirements.extra?.feePayer; + if (!feePayer) { + throw new Error("feePayer is required in paymentRequirements.extra for SVM transactions"); + } + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + const nonce = crypto.getRandomValues(new Uint8Array(16)); + const memoIx = { + programAddress: MEMO_PROGRAM_ADDRESS, + accounts: [], + data: new TextEncoder().encode( + Array.from(nonce).map((b) => b.toString(16).padStart(2, "0")).join("") + ) + }; + const tx = pipe( + createTransactionMessage({ version: 0 }), + (tx2) => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx2), + (tx2) => setTransactionMessageFeePayer(feePayer, tx2), + (tx2) => prependTransactionMessageInstruction( + getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }), + tx2 + ), + (tx2) => appendTransactionMessageInstructions([transferIx, memoIx], tx2), + (tx2) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx2) + ); + const signedTransaction = await partiallySignTransactionMessageWithSigners(tx); + const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction); + const payload = { + transaction: base64EncodedWireTransaction + }; + return { + x402Version: x402Version2, + payload + }; } - }, - multicall3: { - address: "0xca11bde05977b3631167028862be2a173976ca11", - blockCreated: 5022 - }, - portal: { - [sourceId]: { - address: "0x49048044D57e1C92A77f79988d21Fa8fAF74E97e", - blockCreated: 17482143 + }; + } +}); + +// node_modules/@x402/svm/dist/esm/chunk-WWACQNRQ.mjs +var NETWORKS2; +var init_chunk_WWACQNRQ = __esm({ + "node_modules/@x402/svm/dist/esm/chunk-WWACQNRQ.mjs"() { + "use strict"; + NETWORKS2 = ["solana", "solana-devnet", "solana-testnet"]; + } +}); + +// node_modules/@x402/svm/dist/esm/chunk-EO43QE5K.mjs +var ExactSvmSchemeV1; +var init_chunk_EO43QE5K = __esm({ + "node_modules/@x402/svm/dist/esm/chunk-EO43QE5K.mjs"() { + "use strict"; + init_chunk_HEVXVNO4(); + init_src3(); + init_src(); + init_src2(); + init_index_node37(); + ExactSvmSchemeV1 = class { + /** + * Creates a new ExactSvmClientV1 instance. + * + * @param signer - The SVM signer for client operations + * @param config - Optional configuration with custom RPC URL + * @returns ExactSvmClientV1 instance + */ + constructor(signer, config) { + this.signer = signer; + this.config = config; + this.scheme = "exact"; } - }, - l1StandardBridge: { - [sourceId]: { - address: "0x3154Cf16ccdb4C6d922629664174b904d80F2C35", - blockCreated: 17482143 + /** + * Creates a payment payload for the Exact scheme (V1). + * + * @param x402Version - The x402 protocol version + * @param paymentRequirements - The payment requirements + * @returns Promise resolving to a payment payload + */ + async createPaymentPayload(x402Version2, paymentRequirements) { + const selectedV1 = paymentRequirements; + const rpc = createRpcClient(selectedV1.network, this.config?.rpcUrl); + const tokenMint = await fetchMint(rpc, selectedV1.asset); + const tokenProgramAddress = tokenMint.programAddress; + if (tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() && tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()) { + throw new Error("Asset was not created by a known token program"); + } + const [sourceATA] = await findAssociatedTokenPda({ + mint: selectedV1.asset, + owner: this.signer.address, + tokenProgram: tokenProgramAddress + }); + const [destinationATA] = await findAssociatedTokenPda({ + mint: selectedV1.asset, + owner: selectedV1.payTo, + tokenProgram: tokenProgramAddress + }); + const transferIx = getTransferCheckedInstruction( + { + source: sourceATA, + mint: selectedV1.asset, + destination: destinationATA, + authority: this.signer, + amount: BigInt(selectedV1.maxAmountRequired), + decimals: tokenMint.data.decimals + }, + { programAddress: tokenProgramAddress } + ); + const feePayer = selectedV1.extra?.feePayer; + if (!feePayer) { + throw new Error("feePayer is required in paymentRequirements.extra for SVM transactions"); + } + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + const nonce = crypto.getRandomValues(new Uint8Array(16)); + const memoIx = { + programAddress: MEMO_PROGRAM_ADDRESS, + accounts: [], + data: new TextEncoder().encode( + Array.from(nonce).map((b) => b.toString(16).padStart(2, "0")).join("") + ) + }; + const tx = pipe( + createTransactionMessage({ version: 0 }), + (tx2) => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx2), + (tx2) => setTransactionMessageFeePayer(feePayer, tx2), + (tx2) => prependTransactionMessageInstruction( + getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }), + tx2 + ), + (tx2) => appendTransactionMessageInstructions([transferIx, memoIx], tx2), + (tx2) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx2) + ); + const signedTransaction = await partiallySignTransactionMessageWithSigners(tx); + const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction); + const payload = { + transaction: base64EncodedWireTransaction + }; + return { + x402Version: x402Version2, + scheme: selectedV1.scheme, + network: selectedV1.network, + payload + }; } - } - }, - sourceId + }; + } }); -var basePreconf = /* @__PURE__ */ defineChain({ - ...base, - experimental_preconfirmationTime: 200, - rpcUrls: { - default: { - http: ["https://mainnet-preconf.base.org"] - } + +// node_modules/@x402/svm/dist/esm/chunk-KCM7FK7D.mjs +var init_chunk_KCM7FK7D = __esm({ + "node_modules/@x402/svm/dist/esm/chunk-KCM7FK7D.mjs"() { + "use strict"; + init_chunk_HEVXVNO4(); + } +}); + +// node_modules/@x402/svm/dist/esm/chunk-GOPQSG4N.mjs +var init_chunk_GOPQSG4N = __esm({ + "node_modules/@x402/svm/dist/esm/chunk-GOPQSG4N.mjs"() { + "use strict"; + init_chunk_KCM7FK7D(); + init_chunk_HEVXVNO4(); + } +}); + +// node_modules/@x402/svm/dist/esm/exact/client/index.mjs +var client_exports = {}; +__export(client_exports, { + ExactSvmScheme: () => ExactSvmScheme, + registerExactSvmScheme: () => registerExactSvmScheme +}); +function registerExactSvmScheme(client, config) { + if (config.networks && config.networks.length > 0) { + config.networks.forEach((network) => { + client.register(network, new ExactSvmScheme(config.signer)); + }); + } else { + client.register("solana:*", new ExactSvmScheme(config.signer)); + } + NETWORKS2.forEach((network) => { + client.registerV1(network, new ExactSvmSchemeV1(config.signer)); + }); + if (config.policies) { + config.policies.forEach((policy) => { + client.registerPolicy(policy); + }); + } + return client; +} +var init_client = __esm({ + "node_modules/@x402/svm/dist/esm/exact/client/index.mjs"() { + "use strict"; + init_chunk_6GZCHEXV(); + init_chunk_WWACQNRQ(); + init_chunk_EO43QE5K(); + init_chunk_GOPQSG4N(); + init_chunk_KCM7FK7D(); + init_chunk_HEVXVNO4(); } }); // src/proxy.ts +init_esm(); +init_chains(); init_accounts(); +import { AsyncLocalStorage } from "async_hooks"; +import { createServer } from "http"; +import { finished } from "stream"; +import { homedir as homedir6 } from "os"; +import { join as join8 } from "path"; +import { mkdir as mkdir3, writeFile as writeFile2, readFile, stat as fsStat } from "fs/promises"; +import { readFileSync as readFileSync2, existsSync as existsSync2 } from "fs"; // node_modules/zod/v3/external.js var external_exports = {}; @@ -71442,6 +72550,7 @@ function createPayFetchWithPreAuth(baseFetch, client, ttlMs = DEFAULT_TTL_MS, op } // node_modules/@x402/evm/dist/esm/chunk-C4ZQMS77.mjs +init_esm(); var authorizationTypes = { TransferWithAuthorization: [ { name: "from", type: "address" }, @@ -71543,6 +72652,7 @@ function createPermit2Nonce() { } // node_modules/@x402/evm/dist/esm/chunk-YUJQ7TLD.mjs +init_esm(); var ExactEvmSchemeV1 = class { /** * Creates a new ExactEvmClientV1 instance. @@ -71655,6 +72765,7 @@ function getEvmChainIdV1(network) { } // node_modules/@x402/evm/dist/esm/chunk-CRT6YNY5.mjs +init_esm(); var EIP2612_GAS_SPONSORING_KEY = "eip2612GasSponsoring"; var ERC20_APPROVAL_GAS_SPONSORING_KEY = "erc20ApprovalGasSponsoring"; var ERC20_APPROVAL_GAS_SPONSORING_VERSION = "1"; @@ -71710,6 +72821,10 @@ async function signPermit2Authorization(signer, permit2Authorization, requiremen } // node_modules/@x402/evm/dist/esm/chunk-WKBC5YMI.mjs +init_esm(); +init_esm(); +init_esm(); +init_esm(); var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); async function createPermit2Payload(signer, x402Version2, paymentRequirements) { return createPermit2PayloadForProxy( @@ -71940,6 +73055,7 @@ async function trySignErc20ApprovalExtension(signer, options, requirements, cont } // node_modules/@x402/evm/dist/esm/chunk-RN3WQM6A.mjs +init_esm(); async function createEIP3009Payload(signer, x402Version2, paymentRequirements) { const nonce = createNonce(); const now = Math.floor(Date.now() / 1e3); @@ -75500,142 +76616,8 @@ var ResponseCache = class { } }; -// src/errors.ts -var RpcError2 = class extends Error { - code = "RPC_ERROR"; - originalError; - constructor(message, originalError) { - super(`RPC error: ${message}. Check network connectivity.`); - this.name = "RpcError"; - this.originalError = originalError; - } -}; - -// src/balance.ts -var USDC_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; -var CACHE_TTL_MS = 3e4; -var BALANCE_THRESHOLDS = { - /** Low balance warning threshold: $1.00 */ - LOW_BALANCE_MICROS: 1000000n, - /** Effectively zero threshold: $0.0001 (covers dust/rounding) */ - ZERO_THRESHOLD: 100n -}; -var BalanceMonitor = class { - client; - walletAddress; - /** Cached balance (null = not yet fetched) */ - cachedBalance = null; - /** Timestamp when cache was last updated */ - cachedAt = 0; - constructor(walletAddress) { - this.walletAddress = walletAddress; - this.client = createPublicClient({ - chain: base, - transport: http(void 0, { - timeout: 1e4 - // 10 second timeout to prevent hanging on slow RPC - }) - }); - } - /** - * Check current USDC balance. - * Uses cache if valid, otherwise fetches from RPC. - */ - async checkBalance() { - const now = Date.now(); - if (this.cachedBalance !== null && this.cachedBalance > 0n && now - this.cachedAt < CACHE_TTL_MS) { - return this.buildInfo(this.cachedBalance); - } - const balance = await this.fetchBalance(); - if (balance > 0n) { - this.cachedBalance = balance; - this.cachedAt = now; - } - return this.buildInfo(balance); - } - /** - * Check if balance is sufficient for an estimated cost. - * - * @param estimatedCostMicros - Estimated cost in USDC smallest unit (6 decimals) - */ - async checkSufficient(estimatedCostMicros) { - const info = await this.checkBalance(); - if (info.balance >= estimatedCostMicros) { - return { sufficient: true, info }; - } - const shortfall = estimatedCostMicros - info.balance; - return { - sufficient: false, - info, - shortfall: this.formatUSDC(shortfall) - }; - } - /** - * Optimistically deduct estimated cost from cached balance. - * Call this after a successful payment to keep cache accurate. - * - * @param amountMicros - Amount to deduct in USDC smallest unit - */ - deductEstimated(amountMicros) { - if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) { - this.cachedBalance -= amountMicros; - } - } - /** - * Invalidate cache, forcing next checkBalance() to fetch from RPC. - * Call this after a payment failure to get accurate balance. - */ - invalidate() { - this.cachedBalance = null; - this.cachedAt = 0; - } - /** - * Force refresh balance from RPC (ignores cache). - */ - async refresh() { - this.invalidate(); - return this.checkBalance(); - } - /** - * Format USDC amount (in micros) as "$X.XX". - */ - formatUSDC(amountMicros) { - const dollars = Number(amountMicros) / 1e6; - return `$${dollars.toFixed(2)}`; - } - /** - * Get the wallet address being monitored. - */ - getWalletAddress() { - return this.walletAddress; - } - /** Fetch balance from RPC */ - async fetchBalance() { - try { - const balance = await this.client.readContract({ - address: USDC_BASE, - abi: erc20Abi, - functionName: "balanceOf", - args: [this.walletAddress] - }); - return balance; - } catch (error) { - throw new RpcError2(error instanceof Error ? error.message : "Unknown error", error); - } - } - /** Build BalanceInfo from raw balance */ - buildInfo(balance) { - return { - balance, - balanceUSD: this.formatUSDC(balance), - isLow: balance < BALANCE_THRESHOLDS.LOW_BALANCE_MICROS, - isEmpty: balance < BALANCE_THRESHOLDS.ZERO_THRESHOLD, - walletAddress: this.walletAddress - }; - } -}; - // src/proxy.ts +init_balance(); init_auth(); // src/okx-x402-fetch.ts @@ -80954,11 +81936,14 @@ function capitalize(str) { } // src/doctor.ts -import { platform, arch, freemem, totalmem } from "os"; +init_esm(); +init_chains(); init_accounts(); +import { platform, arch, freemem, totalmem } from "os"; init_auth(); -import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs"; +init_balance(); init_wallet(); +import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs"; function formatBytes(bytes) { const gb = bytes / (1024 * 1024 * 1024); return `${gb.toFixed(1)}GB`; @@ -82065,7 +83050,7 @@ function printSetupHeader() { console.log(" " + c(ANSI.dim, "OKX Agentic Wallet (onchainos)")); console.log(); } -function printSetupSummary(address2, email) { +function printSetupSummary(address2, email, balance) { const lines = [ c(ANSI.bold + ANSI.green, "\u2713 Wallet ready"), "", @@ -82078,12 +83063,33 @@ function printSetupSummary(address2, email) { } lines.push(c(ANSI.dim, "Signing ") + "OKX TEE " + c(ANSI.dim, "(no local private key)")); lines.push(""); - lines.push( - c(ANSI.dim, "Fund ") + "send " + c(ANSI.bold, "USDC on Base") + " to the address above" - ); - lines.push( - c(ANSI.dim, " ") + c(ANSI.dim, "(free models work at $0; $5 unlocks paid tier)") - ); + if (!balance) { + lines.push( + c(ANSI.dim, "Balance ") + c(ANSI.dim, "(could not query Base RPC \u2014 check your network)") + ); + } else if (balance.isEmpty) { + lines.push( + c(ANSI.dim, "Balance ") + c(ANSI.bold, "$0.00 USDC on Base") + " " + c(ANSI.yellow, "\u26A0 empty \u2014 fund to unlock paid models") + ); + } else if (balance.isLow) { + lines.push( + c(ANSI.dim, "Balance ") + c(ANSI.bold, balance.balanceUSD + " USDC on Base") + " " + c(ANSI.yellow, "\u26A0 low (recommend $5+ for stable paid usage)") + ); + } else { + lines.push( + c(ANSI.dim, "Balance ") + c(ANSI.bold, balance.balanceUSD + " USDC on Base") + " " + c(ANSI.green, "\u2713 ready for paid models") + ); + } + const needsFunding = !balance || balance.isEmpty || balance.isLow; + if (needsFunding) { + lines.push(""); + lines.push(c(ANSI.dim, "Fund via OKX (Base network, USDC):")); + lines.push(c(ANSI.dim, " 1. ") + "Open the OKX app \u2192 Wallet"); + lines.push( + c(ANSI.dim, " 2. ") + "Send USDC on " + c(ANSI.bold, "Base") + " to the address above" + ); + lines.push(c(ANSI.dim, " 3. ") + c(ANSI.dim, "~$5 covers thousands of paid requests")); + } const width = Math.max(...lines.map((l2) => stripAnsi(l2).length)); const horiz = "\u2500".repeat(width + 2); console.log(" \u250C" + horiz + "\u2510"); @@ -82093,6 +83099,19 @@ function printSetupSummary(address2, email) { } console.log(" \u2514" + horiz + "\u2518"); } +async function fetchSetupBalanceSnapshot(address2) { + try { + const { BalanceMonitor: BalanceMonitor2 } = await Promise.resolve().then(() => (init_balance(), balance_exports)); + const info = await new BalanceMonitor2(address2).checkBalance(); + return { + balanceUSD: info.balanceUSD, + isLow: info.isLow, + isEmpty: info.isEmpty + }; + } catch { + return void 0; + } +} async function cmdSetup() { printSetupHeader(); const adapter = new OnchainOsAdapter(); @@ -82118,8 +83137,13 @@ async function cmdSetup() { const detection = await detectOnchainosWallet(); if (detection.kind === "ok") { console.log(" " + c(ANSI.green, "\u2713") + " Already signed in"); + process.stdout.write(" " + c(ANSI.yellow, "\u23F3") + " Checking USDC balance on Base\u2026"); + const bal = await fetchSetupBalanceSnapshot(detection.address); + process.stdout.write( + "\r " + c(ANSI.green, "\u2713") + " Balance checked \n" + ); console.log(); - printSetupSummary(detection.address, detection.email); + printSetupSummary(detection.address, detection.email, bal); console.log(); console.log( " " + c(ANSI.cyan, "\u2192") + " Restart OpenClaw: " + c(ANSI.bold, "openclaw gateway restart") @@ -82186,8 +83210,11 @@ async function cmdSetup() { console.error(" Run `onchainos wallet status` to diagnose."); process.exit(1); } + process.stdout.write(" " + c(ANSI.yellow, "\u23F3") + " Checking USDC balance on Base\u2026"); + const balanceAfter = await fetchSetupBalanceSnapshot(after.address); + process.stdout.write("\r " + c(ANSI.green, "\u2713") + " Balance checked \n"); console.log(); - printSetupSummary(after.address, after.email); + printSetupSummary(after.address, after.email, balanceAfter); console.log(); console.log( " " + c(ANSI.cyan, "\u2192") + " Restart OpenClaw: " + c(ANSI.bold, "openclaw gateway restart") @@ -82594,16 +83621,16 @@ main().catch((err) => { @noble/curves/esm/_shortw_utils.js: @noble/curves/esm/secp256k1.js: @noble/curves/esm/abstract/utils.js: -@noble/curves/utils.js: -@noble/curves/abstract/modular.js: -@noble/curves/abstract/curve.js: -@noble/curves/abstract/weierstrass.js: -@noble/curves/secp256k1.js: @noble/curves/esm/abstract/modular.js: @noble/curves/esm/abstract/curve.js: @noble/curves/esm/abstract/weierstrass.js: @noble/curves/esm/_shortw_utils.js: @noble/curves/esm/secp256k1.js: +@noble/curves/utils.js: +@noble/curves/abstract/modular.js: +@noble/curves/abstract/curve.js: +@noble/curves/abstract/weierstrass.js: +@noble/curves/secp256k1.js: (*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) *) @scure/base/lib/esm/index.js: diff --git a/dist/cli.js.map b/dist/cli.js.map index cfe0474..846ede9 100644 --- a/dist/cli.js.map +++ b/dist/cli.js.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/abitype/src/version.ts","../node_modules/abitype/src/errors.ts","../node_modules/abitype/src/regex.ts","../node_modules/abitype/src/human-readable/formatAbiParameter.ts","../node_modules/abitype/src/human-readable/formatAbiParameters.ts","../node_modules/abitype/src/human-readable/formatAbiItem.ts","../node_modules/abitype/src/human-readable/runtime/signatures.ts","../node_modules/abitype/src/human-readable/errors/abiItem.ts","../node_modules/abitype/src/human-readable/errors/abiParameter.ts","../node_modules/abitype/src/human-readable/errors/signature.ts","../node_modules/abitype/src/human-readable/errors/struct.ts","../node_modules/abitype/src/human-readable/errors/splitParameters.ts","../node_modules/abitype/src/human-readable/runtime/cache.ts","../node_modules/abitype/src/human-readable/runtime/utils.ts","../node_modules/abitype/src/human-readable/runtime/structs.ts","../node_modules/abitype/src/human-readable/parseAbi.ts","../node_modules/abitype/src/human-readable/parseAbiItem.ts","../node_modules/abitype/src/human-readable/parseAbiParameters.ts","../node_modules/abitype/src/exports/index.ts","../node_modules/viem/utils/abi/formatAbiItem.ts","../node_modules/viem/utils/data/isHex.ts","../node_modules/viem/utils/data/size.ts","../node_modules/viem/errors/version.ts","../node_modules/viem/errors/base.ts","../node_modules/viem/errors/abi.ts","../node_modules/viem/errors/data.ts","../node_modules/viem/utils/data/pad.ts","../node_modules/viem/errors/encoding.ts","../node_modules/viem/utils/data/trim.ts","../node_modules/viem/utils/encoding/fromHex.ts","../node_modules/viem/utils/encoding/toHex.ts","../node_modules/viem/utils/encoding/toBytes.ts","../node_modules/@noble/hashes/src/_u64.ts","../node_modules/@noble/hashes/src/cryptoNode.ts","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/sha3.ts","../node_modules/viem/utils/hash/keccak256.ts","../node_modules/viem/utils/hash/hashSignature.ts","../node_modules/viem/utils/hash/normalizeSignature.ts","../node_modules/viem/utils/hash/toSignature.ts","../node_modules/viem/utils/hash/toSignatureHash.ts","../node_modules/viem/utils/hash/toEventSelector.ts","../node_modules/viem/errors/address.ts","../node_modules/viem/utils/lru.ts","../node_modules/viem/utils/address/getAddress.ts","../node_modules/viem/utils/address/isAddress.ts","../node_modules/viem/utils/data/concat.ts","../node_modules/viem/utils/data/slice.ts","../node_modules/viem/utils/regex.ts","../node_modules/viem/utils/abi/encodeAbiParameters.ts","../node_modules/viem/utils/hash/toFunctionSelector.ts","../node_modules/viem/utils/abi/getAbiItem.ts","../node_modules/viem/accounts/utils/parseAccount.ts","../node_modules/viem/utils/abi/prepareEncodeFunctionData.ts","../node_modules/viem/utils/abi/encodeFunctionData.ts","../node_modules/viem/constants/solidity.ts","../node_modules/viem/errors/cursor.ts","../node_modules/viem/utils/cursor.ts","../node_modules/viem/utils/encoding/fromBytes.ts","../node_modules/viem/utils/abi/decodeAbiParameters.ts","../node_modules/viem/utils/abi/decodeErrorResult.ts","../node_modules/viem/utils/stringify.ts","../node_modules/viem/utils/abi/formatAbiItemWithArgs.ts","../node_modules/viem/constants/unit.ts","../node_modules/viem/utils/unit/formatUnits.ts","../node_modules/viem/utils/unit/formatEther.ts","../node_modules/viem/utils/unit/formatGwei.ts","../node_modules/viem/errors/stateOverride.ts","../node_modules/viem/errors/transaction.ts","../node_modules/viem/errors/utils.ts","../node_modules/viem/errors/contract.ts","../node_modules/viem/errors/request.ts","../node_modules/viem/errors/rpc.ts","../node_modules/viem/accounts/utils/publicKeyToAddress.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/sha2.ts","../node_modules/@noble/hashes/src/hmac.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/utils.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/modular.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/curve.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/weierstrass.ts","../node_modules/viem/node_modules/@noble/curves/src/_shortw_utils.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/hash-to-curve.ts","../node_modules/viem/node_modules/@noble/curves/src/secp256k1.ts","../node_modules/viem/utils/encoding/toRlp.ts","../node_modules/viem/utils/authorization/hashAuthorization.ts","../node_modules/viem/errors/node.ts","../node_modules/viem/utils/errors/getNodeError.ts","../node_modules/viem/utils/formatters/extract.ts","../node_modules/viem/utils/formatters/formatter.ts","../node_modules/viem/utils/formatters/transactionRequest.ts","../node_modules/viem/utils/stateOverride.ts","../node_modules/viem/constants/number.ts","../node_modules/viem/utils/transaction/assertRequest.ts","../node_modules/viem/actions/public/getTransactionCount.ts","../node_modules/viem/utils/blob/blobsToCommitments.ts","../node_modules/viem/utils/blob/blobsToProofs.ts","../node_modules/@noble/hashes/src/sha256.ts","../node_modules/viem/utils/hash/sha256.ts","../node_modules/viem/utils/blob/commitmentToVersionedHash.ts","../node_modules/viem/utils/blob/commitmentsToVersionedHashes.ts","../node_modules/viem/constants/blob.ts","../node_modules/viem/constants/kzg.ts","../node_modules/viem/errors/blob.ts","../node_modules/viem/utils/blob/toBlobs.ts","../node_modules/viem/utils/blob/toBlobSidecars.ts","../node_modules/viem/utils/transaction/getTransactionType.ts","../node_modules/viem/utils/address/isAddressEqual.ts","../node_modules/viem/utils/abi/decodeFunctionResult.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/utils.ts","../node_modules/ox/core/version.ts","../node_modules/ox/core/internal/errors.ts","../node_modules/ox/core/Errors.ts","../node_modules/ox/core/internal/bytes.ts","../node_modules/ox/core/internal/hex.ts","../node_modules/ox/core/Json.ts","../node_modules/ox/core/Bytes.ts","../node_modules/ox/core/Hex.ts","../node_modules/ox/core/Withdrawal.ts","../node_modules/ox/core/BlockOverrides.ts","../node_modules/viem/constants/abis.ts","../node_modules/viem/constants/contract.ts","../node_modules/viem/constants/contracts.ts","../node_modules/viem/errors/chain.ts","../node_modules/viem/utils/abi/encodeDeployData.ts","../node_modules/viem/utils/chain/getChainContractAddress.ts","../node_modules/viem/utils/errors/getCallError.ts","../node_modules/viem/utils/promise/withResolvers.ts","../node_modules/viem/utils/promise/createBatchScheduler.ts","../node_modules/viem/errors/ccip.ts","../node_modules/viem/utils/abi/decodeFunctionData.ts","../node_modules/viem/utils/abi/encodeErrorResult.ts","../node_modules/viem/utils/abi/encodeFunctionResult.ts","../node_modules/viem/utils/ens/localBatchGatewayRequest.ts","../node_modules/viem/utils/ccip.ts","../node_modules/viem/actions/public/call.ts","../node_modules/viem/utils/transaction/assertTransaction.ts","../node_modules/viem/utils/transaction/serializeAccessList.ts","../node_modules/viem/utils/transaction/serializeTransaction.ts","../node_modules/viem/utils/authorization/serializeAuthorizationList.ts","../node_modules/viem/constants/strings.ts","../node_modules/viem/utils/signature/toPrefixedMessage.ts","../node_modules/viem/utils/signature/hashMessage.ts","../node_modules/viem/errors/typedData.ts","../node_modules/viem/utils/typedData.ts","../node_modules/viem/utils/signature/hashTypedData.ts","../node_modules/viem/utils/signature/serializeSignature.ts","../node_modules/@scure/base/index.ts","../node_modules/@noble/hashes/src/pbkdf2.ts","../node_modules/@scure/bip39/esm/index.js","../node_modules/viem/accounts/toAccount.ts","../node_modules/viem/accounts/utils/sign.ts","../node_modules/viem/accounts/utils/signAuthorization.ts","../node_modules/viem/accounts/utils/signMessage.ts","../node_modules/viem/accounts/utils/signTransaction.ts","../node_modules/viem/accounts/utils/signTypedData.ts","../node_modules/viem/accounts/privateKeyToAccount.ts","../node_modules/@scure/bip39/esm/wordlists/english.js","../node_modules/viem/accounts/index.ts","../src/fs-read.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/sha2.ts","../node_modules/@noble/curves/src/utils.ts","../node_modules/@noble/curves/src/abstract/modular.ts","../node_modules/@noble/curves/src/abstract/curve.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/hmac.ts","../node_modules/@noble/curves/src/abstract/weierstrass.ts","../node_modules/@noble/curves/src/secp256k1.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/utils.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/hmac.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/_md.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/legacy.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/_u64.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/sha2.ts","../node_modules/@scure/bip32/node_modules/@scure/base/index.ts","../node_modules/@scure/bip32/index.ts","../node_modules/@solana/errors/src/codes.ts","../node_modules/@solana/errors/src/context.ts","../node_modules/@solana/errors/src/messages.ts","../node_modules/@solana/errors/src/message-formatter.ts","../node_modules/@solana/errors/src/error.ts","../node_modules/@solana/errors/src/stack-trace.ts","../node_modules/@solana/errors/src/rpc-enum-errors.ts","../node_modules/@solana/errors/src/instruction-error.ts","../node_modules/@solana/errors/src/transaction-error.ts","../node_modules/@solana/errors/src/json-rpc-error.ts","../node_modules/@solana/errors/src/simulation-errors.ts","../node_modules/@solana/codecs-core/src/bytes.ts","../node_modules/@solana/codecs-core/src/codec.ts","../node_modules/@solana/codecs-core/src/combine-codec.ts","../node_modules/@solana/codecs-core/src/add-codec-sentinel.ts","../node_modules/@solana/codecs-core/src/assertions.ts","../node_modules/@solana/codecs-core/src/add-codec-size-prefix.ts","../node_modules/@solana/codecs-core/src/array-buffers.ts","../node_modules/@solana/codecs-core/src/decoder-entire-byte-array.ts","../node_modules/@solana/codecs-core/src/fix-codec-size.ts","../node_modules/@solana/codecs-core/src/offset-codec.ts","../node_modules/@solana/codecs-core/src/resize-codec.ts","../node_modules/@solana/codecs-core/src/pad-codec.ts","../node_modules/@solana/codecs-core/src/reverse-codec.ts","../node_modules/@solana/codecs-core/src/transform-codec.ts","../node_modules/@solana/codecs-strings/src/assertions.ts","../node_modules/@solana/codecs-strings/src/baseX.ts","../node_modules/@solana/codecs-strings/src/base10.ts","../node_modules/@solana/codecs-strings/src/base16.ts","../node_modules/@solana/codecs-strings/src/base58.ts","../node_modules/@solana/codecs-strings/src/baseX-reslice.ts","../node_modules/@solana/codecs-strings/src/base64.ts","../node_modules/@solana/codecs-strings/src/null-characters.ts","../node_modules/@solana/text-encoding-impl/src/index.node.ts","../node_modules/@solana/codecs-strings/src/utf8.ts","../node_modules/@solana/accounts/src/account.ts","../node_modules/@solana/accounts/src/decode-account.ts","../node_modules/@solana/accounts/src/parse-account.ts","../node_modules/@solana/accounts/src/fetch-account.ts","../node_modules/@solana/accounts/src/maybe-account.ts","../node_modules/@solana/assertions/src/crypto.ts","../node_modules/@solana/assertions/src/subtle-crypto.ts","../node_modules/@solana/addresses/src/address.ts","../node_modules/@solana/addresses/src/vendor/noble/ed25519.ts","../node_modules/@solana/addresses/src/curve-internal.ts","../node_modules/@solana/addresses/src/curve.ts","../node_modules/@solana/addresses/src/program-derived-address.ts","../node_modules/@solana/addresses/src/public-key.ts","../node_modules/@solana/codecs-numbers/src/assertions.ts","../node_modules/@solana/codecs-numbers/src/common.ts","../node_modules/@solana/codecs-numbers/src/utils.ts","../node_modules/@solana/codecs-numbers/src/f32.ts","../node_modules/@solana/codecs-numbers/src/f64.ts","../node_modules/@solana/codecs-numbers/src/i128.ts","../node_modules/@solana/codecs-numbers/src/i16.ts","../node_modules/@solana/codecs-numbers/src/i32.ts","../node_modules/@solana/codecs-numbers/src/i64.ts","../node_modules/@solana/codecs-numbers/src/i8.ts","../node_modules/@solana/codecs-numbers/src/short-u16.ts","../node_modules/@solana/codecs-numbers/src/u128.ts","../node_modules/@solana/codecs-numbers/src/u16.ts","../node_modules/@solana/codecs-numbers/src/u32.ts","../node_modules/@solana/codecs-numbers/src/u64.ts","../node_modules/@solana/codecs-numbers/src/u8.ts","../node_modules/@solana/codecs-data-structures/src/assertions.ts","../node_modules/@solana/codecs-data-structures/src/utils.ts","../node_modules/@solana/codecs-data-structures/src/array.ts","../node_modules/@solana/codecs-data-structures/src/bit-array.ts","../node_modules/@solana/codecs-data-structures/src/boolean.ts","../node_modules/@solana/codecs-data-structures/src/bytes.ts","../node_modules/@solana/codecs-strings/src/base16.ts","../node_modules/@solana/codecs-data-structures/src/constant.ts","../node_modules/@solana/codecs-data-structures/src/tuple.ts","../node_modules/@solana/codecs-data-structures/src/union.ts","../node_modules/@solana/codecs-data-structures/src/discriminated-union.ts","../node_modules/@solana/codecs-data-structures/src/enum-helpers.ts","../node_modules/@solana/codecs-data-structures/src/enum.ts","../node_modules/@solana/codecs-data-structures/src/hidden-prefix.ts","../node_modules/@solana/codecs-data-structures/src/hidden-suffix.ts","../node_modules/@solana/codecs-data-structures/src/literal-union.ts","../node_modules/@solana/codecs-data-structures/src/map.ts","../node_modules/@solana/codecs-data-structures/src/unit.ts","../node_modules/@solana/codecs-data-structures/src/nullable.ts","../node_modules/@solana/codecs-data-structures/src/set.ts","../node_modules/@solana/codecs-data-structures/src/struct.ts","../node_modules/@solana/options/src/option.ts","../node_modules/@solana/options/src/unwrap-option.ts","../node_modules/@solana/options/src/option-codec.ts","../node_modules/@solana/options/src/unwrap-option-recursively.ts","../node_modules/@solana/codecs/dist/index.node.mjs","../node_modules/@solana/functional/src/pipe.ts","../node_modules/@solana/instructions/src/instruction.ts","../node_modules/@solana/instructions/src/roles.ts","../node_modules/@solana/rpc-types/src/blockhash.ts","../node_modules/@solana/rpc-types/src/cluster-url.ts","../node_modules/@solana/rpc-types/src/commitment.ts","../node_modules/@solana/rpc-types/src/lamports.ts","../node_modules/@solana/rpc-types/src/stringified-bigint.ts","../node_modules/@solana/rpc-types/src/stringified-number.ts","../node_modules/@solana/rpc-types/src/unix-timestamp.ts","../node_modules/@solana/transaction-messages/src/blockhash.ts","../node_modules/@solana/codecs-strings/src/assertions.ts","../node_modules/@solana/codecs-strings/src/baseX.ts","../node_modules/@solana/codecs-strings/src/base58.ts","../node_modules/@solana/transaction-messages/src/codecs/address-table-lookup.ts","../node_modules/@solana/transaction-messages/src/codecs/header.ts","../node_modules/@solana/transaction-messages/src/codecs/instruction.ts","../node_modules/@solana/transaction-messages/src/transaction-message.ts","../node_modules/@solana/transaction-messages/src/codecs/transaction-version.ts","../node_modules/@solana/transaction-messages/src/codecs/message.ts","../node_modules/@solana/transaction-messages/src/compile/accounts.ts","../node_modules/@solana/transaction-messages/src/compile/address-table-lookups.ts","../node_modules/@solana/transaction-messages/src/compile/header.ts","../node_modules/@solana/transaction-messages/src/compile/instructions.ts","../node_modules/@solana/transaction-messages/src/compile/lifetime-token.ts","../node_modules/@solana/transaction-messages/src/compile/static-accounts.ts","../node_modules/@solana/transaction-messages/src/compile/message.ts","../node_modules/@solana/transaction-messages/src/compress-transaction-message.ts","../node_modules/@solana/transaction-messages/src/create-transaction-message.ts","../node_modules/@solana/transaction-messages/src/durable-nonce-instruction.ts","../node_modules/@solana/transaction-messages/src/durable-nonce.ts","../node_modules/@solana/transaction-messages/src/fee-payer.ts","../node_modules/@solana/transaction-messages/src/instructions.ts","../node_modules/@solana/transaction-messages/src/decompile-message.ts","../node_modules/@solana/keys/src/algorithm.ts","../node_modules/@solana/keys/src/private-key.ts","../node_modules/@solana/keys/src/public-key.ts","../node_modules/@solana/keys/src/signatures.ts","../node_modules/@solana/keys/src/key-pair.ts","../node_modules/@solana/transactions/src/codecs/signatures-encoder.ts","../node_modules/@solana/transactions/src/codecs/transaction-codec.ts","../node_modules/@solana/transactions/src/lifetime.ts","../node_modules/@solana/transactions/src/compile-transaction.ts","../node_modules/@solana/transactions/src/signatures.ts","../node_modules/@solana/transactions/src/wire-transaction.ts","../node_modules/@solana/transactions/src/transaction-size.ts","../node_modules/@solana/transactions/src/sendable-transaction.ts","../node_modules/@solana/transactions/src/transaction-message-size.ts","../node_modules/@solana/promises/src/race.ts","../node_modules/@solana/promises/src/abortable.ts","../node_modules/@solana/instruction-plans/src/instruction-plan.ts","../node_modules/@solana/instruction-plans/src/append-instruction-plan.ts","../node_modules/@solana/instruction-plans/src/transaction-plan.ts","../node_modules/@solana/instruction-plans/src/transaction-plan-result.ts","../node_modules/@solana/instruction-plans/src/transaction-plan-executor.ts","../node_modules/@solana/instruction-plans/src/transaction-planner.ts","../node_modules/@solana/offchain-messages/src/application-domain.ts","../node_modules/@solana/offchain-messages/src/codecs/application-domain.ts","../node_modules/@solana/offchain-messages/src/codecs/signing-domain.ts","../node_modules/@solana/offchain-messages/src/codecs/preamble-common.ts","../node_modules/@solana/offchain-messages/src/codecs/signatures.ts","../node_modules/@solana/offchain-messages/src/codecs/envelope.ts","../node_modules/@solana/offchain-messages/src/content.ts","../node_modules/@solana/offchain-messages/src/message-v0.ts","../node_modules/@solana/offchain-messages/src/codecs/content.ts","../node_modules/@solana/offchain-messages/src/codecs/preamble-v0.ts","../node_modules/@solana/offchain-messages/src/codecs/message-v0.ts","../node_modules/@solana/offchain-messages/src/codecs/preamble-v1.ts","../node_modules/@solana/offchain-messages/src/codecs/message-v1.ts","../node_modules/@solana/offchain-messages/src/codecs/message.ts","../node_modules/@solana/offchain-messages/src/envelope-common.ts","../node_modules/@solana/offchain-messages/src/envelope-v0.ts","../node_modules/@solana/offchain-messages/src/envelope-v1.ts","../node_modules/@solana/offchain-messages/src/envelope.ts","../node_modules/@solana/offchain-messages/src/signatures.ts","../node_modules/@solana/plugin-core/src/client.ts","../node_modules/@solana/programs/src/program-error.ts","../node_modules/@solana/rpc-spec-types/src/parse-json-with-bigints.ts","../node_modules/@solana/rpc-spec-types/src/rpc-message.ts","../node_modules/@solana/rpc-spec-types/src/stringify-json-with-bigints.ts","../node_modules/@solana/rpc-spec/src/rpc.ts","../node_modules/@solana/rpc-spec/src/rpc-api.ts","../node_modules/@solana/rpc-spec/src/rpc-transport.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-bigint-downcast-internal.ts","../node_modules/@solana/rpc-transformers/src/tree-traversal.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-bigint-downcast.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-default-commitment-internal.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-default-commitment.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-integer-overflow-internal.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-integer-overflow.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-options-object-position-config.ts","../node_modules/@solana/rpc-transformers/src/request-transformer.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-bigint-upcast-internal.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-bigint-upcast.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-result.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-allowed-numeric-values.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-throw-solana-error.ts","../node_modules/@solana/rpc-transformers/src/response-transformer.ts","../node_modules/@solana/rpc-api/src/index.ts","../node_modules/@solana/rpc-transport-http/src/http-transport-headers.ts","../node_modules/@solana/rpc-transport-http/src/http-transport.ts","../node_modules/@solana/rpc-transport-http/src/is-solana-request.ts","../node_modules/@solana/rpc-transport-http/src/http-transport-for-solana-rpc.ts","../node_modules/@solana/fast-stable-stringify/src/index.ts","../node_modules/@solana/rpc/src/rpc-integer-overflow-error.ts","../node_modules/@solana/rpc/src/rpc-default-config.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/rpc/src/rpc-request-coalescer.ts","../node_modules/@solana/rpc/src/rpc-request-deduplication.ts","../node_modules/@solana/rpc/src/rpc-transport.ts","../node_modules/@solana/rpc/src/rpc.ts","../node_modules/@solana/rpc-parsed-types/dist/index.node.mjs","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/subscribable/src/async-iterable.ts","../node_modules/@solana/subscribable/src/data-publisher.ts","../node_modules/@solana/subscribable/src/demultiplex.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions-api.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions-channel.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions-pubsub-plan.ts","../node_modules/@solana/rpc-subscriptions-api/src/index.ts","../node_modules/ws/lib/constants.js","../node_modules/ws/lib/buffer-util.js","../node_modules/ws/lib/limiter.js","../node_modules/ws/lib/permessage-deflate.js","../node_modules/ws/lib/validation.js","../node_modules/ws/lib/receiver.js","../node_modules/ws/lib/sender.js","../node_modules/ws/lib/event-target.js","../node_modules/ws/lib/extension.js","../node_modules/ws/lib/websocket.js","../node_modules/ws/lib/stream.js","../node_modules/ws/lib/subprotocol.js","../node_modules/ws/lib/websocket-server.js","../node_modules/ws/wrapper.mjs","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/ws-impl/src/index.node.ts","../node_modules/@solana/rpc-subscriptions-channel-websocket/src/websocket-channel.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-integer-overflow-error.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-default-config.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-autopinger.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-channel-pool-internal.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-channel-pool.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-json.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-json-bigint.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-channel.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-coalescer.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-transport.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions.ts","../node_modules/@solana/signers/src/deduplicate-signers.ts","../node_modules/@solana/signers/src/transaction-modifying-signer.ts","../node_modules/@solana/signers/src/transaction-partial-signer.ts","../node_modules/@solana/signers/src/transaction-sending-signer.ts","../node_modules/@solana/signers/src/transaction-signer.ts","../node_modules/@solana/signers/src/account-signer-meta.ts","../node_modules/@solana/signers/src/add-signers.ts","../node_modules/@solana/signers/src/fee-payer-signer.ts","../node_modules/@solana/signers/src/message-partial-signer.ts","../node_modules/@solana/signers/src/keypair-signer.ts","../node_modules/@solana/signers/src/message-modifying-signer.ts","../node_modules/@solana/signers/src/message-signer.ts","../node_modules/@solana/signers/src/noop-signer.ts","../node_modules/@solana/signers/src/offchain-message-signer.ts","../node_modules/@solana/signers/src/sign-offchain-message.ts","../node_modules/@solana/signers/src/transaction-with-single-sending-signer.ts","../node_modules/@solana/signers/src/sign-transaction.ts","../node_modules/@solana/text-encoding-impl/src/index.node.ts","../node_modules/@solana/signers/src/signable-message.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-blockheight.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-nonce.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-recent-signature.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-timeout.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-racer.ts","../node_modules/@solana/transaction-confirmation/src/waiters.ts","../node_modules/@solana/kit/src/airdrop-internal.ts","../node_modules/@solana/kit/src/airdrop.ts","../node_modules/@solana/kit/src/fetch-lookup-tables.ts","../node_modules/@solana/kit/src/decompile-transaction-message-fetching-lookup-tables.ts","../node_modules/@solana/kit/src/get-minimum-balance-for-rent-exemption.ts","../node_modules/@solana/kit/src/send-transaction-internal.ts","../node_modules/@solana/kit/src/send-and-confirm-durable-nonce-transaction.ts","../node_modules/@solana/kit/src/send-and-confirm-transaction.ts","../node_modules/@solana/kit/src/send-transaction-without-confirming.ts","../src/wallet.ts","../src/onchainos-adapter.ts","../src/auth.ts","../node_modules/undici/lib/core/symbols.js","../node_modules/undici/lib/util/timers.js","../node_modules/undici/lib/core/errors.js","../node_modules/undici/lib/core/constants.js","../node_modules/undici/lib/core/tree.js","../node_modules/undici/lib/core/util.js","../node_modules/undici/lib/util/stats.js","../node_modules/undici/lib/core/diagnostics.js","../node_modules/undici/lib/core/request.js","../node_modules/undici/lib/dispatcher/dispatcher.js","../node_modules/undici/lib/dispatcher/dispatcher-base.js","../node_modules/undici/lib/core/connect.js","../node_modules/undici/lib/llhttp/utils.js","../node_modules/undici/lib/llhttp/constants.js","../node_modules/undici/lib/llhttp/llhttp-wasm.js","../node_modules/undici/lib/llhttp/llhttp_simd-wasm.js","../node_modules/undici/lib/web/fetch/constants.js","../node_modules/undici/lib/web/fetch/global.js","../node_modules/undici/lib/encoding/index.js","../node_modules/undici/lib/web/infra/index.js","../node_modules/undici/lib/web/fetch/data-url.js","../node_modules/undici/lib/web/webidl/index.js","../node_modules/undici/lib/web/fetch/util.js","../node_modules/undici/lib/web/fetch/formdata.js","../node_modules/undici/lib/web/fetch/formdata-parser.js","../node_modules/undici/lib/util/runtime-features.js","../node_modules/undici/lib/web/fetch/body.js","../node_modules/undici/lib/dispatcher/client-h1.js","../node_modules/undici/lib/dispatcher/client-h2.js","../node_modules/undici/lib/dispatcher/client.js","../node_modules/undici/lib/dispatcher/fixed-queue.js","../node_modules/undici/lib/dispatcher/pool-base.js","../node_modules/undici/lib/dispatcher/pool.js","../node_modules/undici/lib/dispatcher/balanced-pool.js","../node_modules/undici/lib/dispatcher/round-robin-pool.js","../node_modules/undici/lib/dispatcher/agent.js","../node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js","../node_modules/undici/lib/core/socks5-utils.js","../node_modules/undici/lib/core/socks5-client.js","../node_modules/undici/lib/dispatcher/socks5-proxy-agent.js","../node_modules/undici/lib/dispatcher/proxy-agent.js","../node_modules/undici/lib/dispatcher/env-http-proxy-agent.js","../node_modules/undici/lib/handler/retry-handler.js","../node_modules/undici/lib/dispatcher/retry-agent.js","../node_modules/undici/lib/dispatcher/h2c-client.js","../node_modules/undici/lib/api/readable.js","../node_modules/undici/lib/api/api-request.js","../node_modules/undici/lib/api/abort-signal.js","../node_modules/undici/lib/api/api-stream.js","../node_modules/undici/lib/api/api-pipeline.js","../node_modules/undici/lib/api/api-upgrade.js","../node_modules/undici/lib/api/api-connect.js","../node_modules/undici/lib/api/index.js","../node_modules/undici/lib/mock/mock-errors.js","../node_modules/undici/lib/mock/mock-symbols.js","../node_modules/undici/lib/mock/mock-utils.js","../node_modules/undici/lib/mock/mock-interceptor.js","../node_modules/undici/lib/mock/mock-client.js","../node_modules/undici/lib/mock/mock-call-history.js","../node_modules/undici/lib/mock/mock-pool.js","../node_modules/undici/lib/mock/pending-interceptors-formatter.js","../node_modules/undici/lib/mock/mock-agent.js","../node_modules/undici/lib/mock/snapshot-utils.js","../node_modules/undici/lib/mock/snapshot-recorder.js","../node_modules/undici/lib/mock/snapshot-agent.js","../node_modules/undici/lib/global.js","../node_modules/undici/lib/handler/decorator-handler.js","../node_modules/undici/lib/handler/redirect-handler.js","../node_modules/undici/lib/interceptor/redirect.js","../node_modules/undici/lib/interceptor/response-error.js","../node_modules/undici/lib/interceptor/retry.js","../node_modules/undici/lib/interceptor/dump.js","../node_modules/undici/lib/interceptor/dns.js","../node_modules/undici/lib/util/cache.js","../node_modules/undici/lib/util/date.js","../node_modules/undici/lib/handler/cache-handler.js","../node_modules/undici/lib/cache/memory-cache-store.js","../node_modules/undici/lib/handler/cache-revalidation-handler.js","../node_modules/undici/lib/interceptor/cache.js","../node_modules/undici/lib/interceptor/decompress.js","../node_modules/undici/lib/handler/deduplication-handler.js","../node_modules/undici/lib/interceptor/deduplicate.js","../node_modules/undici/lib/cache/sqlite-cache-store.js","../node_modules/undici/lib/web/fetch/headers.js","../node_modules/undici/lib/web/fetch/response.js","../node_modules/undici/lib/web/fetch/request.js","../node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js","../node_modules/undici/lib/web/fetch/index.js","../node_modules/undici/lib/web/cache/util.js","../node_modules/undici/lib/web/cache/cache.js","../node_modules/undici/lib/web/cache/cachestorage.js","../node_modules/undici/lib/web/cookies/constants.js","../node_modules/undici/lib/web/cookies/util.js","../node_modules/undici/lib/web/cookies/parse.js","../node_modules/undici/lib/web/cookies/index.js","../node_modules/undici/lib/web/websocket/events.js","../node_modules/undici/lib/web/websocket/constants.js","../node_modules/undici/lib/web/websocket/util.js","../node_modules/undici/lib/web/websocket/frame.js","../node_modules/undici/lib/web/websocket/connection.js","../node_modules/undici/lib/web/websocket/permessage-deflate.js","../node_modules/undici/lib/web/websocket/receiver.js","../node_modules/undici/lib/web/websocket/sender.js","../node_modules/undici/lib/web/websocket/websocket.js","../node_modules/undici/lib/web/websocket/stream/websocketerror.js","../node_modules/undici/lib/web/websocket/stream/websocketstream.js","../node_modules/undici/lib/web/eventsource/util.js","../node_modules/undici/lib/web/eventsource/eventsource-stream.js","../node_modules/undici/lib/web/eventsource/eventsource.js","../node_modules/undici/index.js","../src/solana-balance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/accounts/mint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/accounts/multisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/types/accountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/types/authorityType.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/accounts/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/programs/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/programs/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/errors/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/errors/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/shared/index.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/amountToUiAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/approve.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/approveChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/burn.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/burnChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/closeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/pdas/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/createAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/createAssociatedTokenIdempotent.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/freezeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/getAccountDataSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeAccount2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeAccount3.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeImmutableOwner.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMint2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMultisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMultisig2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/mintTo.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/mintToChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/recoverNestedAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/revoke.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/setAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/syncNative.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/thawAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/transfer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/transferChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/uiAmountToAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/programs/system.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/errors/system.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/shared/index.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/instructions/createAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/createMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/mintToATA.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/transferToATA.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/accountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/authorityType.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/decryptableBalance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/encryptedBalance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/extension.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/extensionType.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/tokenMetadataField.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/transferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/accounts/mint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/accounts/multisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/accounts/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/programs/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/programs/token2022.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/errors/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/errors/token2022.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/shared/index.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/amountToUiAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/applyConfidentialPendingBalance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/approve.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/approveChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/approveConfidentialTransferAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/burn.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/burnChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/closeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialDeposit.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialTransfer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialTransferWithFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialWithdraw.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/configureConfidentialTransferAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/pdas/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/createAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/createAssociatedTokenIdempotent.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/createNativeMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableCpiGuard.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableHarvestToMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableMemoTransfers.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableNonConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/emitTokenMetadata.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/emptyConfidentialTransferAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableCpiGuard.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableHarvestToMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableMemoTransfers.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableNonConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/freezeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/getAccountDataSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/harvestWithheldTokensToMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/harvestWithheldTokensToMintForConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeAccount2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeAccount3.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeConfidentialTransferMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeDefaultAccountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeGroupMemberPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeGroupPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeImmutableOwner.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeInterestBearingMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMetadataPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMint2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMintCloseAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMultisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMultisig2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeNonTransferableMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializePausableConfig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializePermanentDelegate.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeScaledUiAmountMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTokenGroup.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTokenGroupMember.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTokenMetadata.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTransferFeeConfig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTransferHook.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/mintTo.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/mintToChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/pause.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/reallocate.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/recoverNestedAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/removeTokenMetadataKey.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/resume.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/revoke.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/setAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/setTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/syncNative.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/thawAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/transfer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/transferChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/transferCheckedWithFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/uiAmountToAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateConfidentialTransferMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateDefaultAccountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateGroupMemberPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateGroupPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateMetadataPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateMultiplierScaledUiMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateRateInterestBearingMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenGroupMaxSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenGroupUpdateAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenMetadataField.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenMetadataUpdateAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTransferHook.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawExcessLamports.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromAccounts.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromAccountsForConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromMintForConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/amountToUiAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/getInitializeInstructionsForExtensions.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/getTokenSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/getMintSize.ts","../node_modules/@x402/svm/src/constants.ts","../node_modules/@x402/svm/src/utils.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/programs/computeBudget.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/requestHeapFrame.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/requestUnits.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/setComputeUnitLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/setComputeUnitPrice.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/setLoadedAccountsDataSizeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/constants.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/internal.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/setComputeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/estimateAndSetComputeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/estimateComputeLimitInternal.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/estimateComputeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/setComputePrice.ts","../node_modules/@x402/svm/src/exact/client/scheme.ts","../node_modules/@x402/svm/src/v1/index.ts","../node_modules/@x402/svm/src/exact/v1/client/scheme.ts","../node_modules/@x402/svm/src/exact/client/register.ts","../src/proxy.ts","../node_modules/viem/utils/getAction.ts","../node_modules/viem/utils/abi/encodeEventTopics.ts","../node_modules/viem/errors/log.ts","../node_modules/viem/actions/public/createContractEventFilter.ts","../node_modules/viem/utils/filters/createFilterRequestScope.ts","../node_modules/viem/actions/public/estimateContractGas.ts","../node_modules/viem/utils/errors/getContractError.ts","../node_modules/viem/actions/public/estimateGas.ts","../node_modules/viem/utils/signature/recoverAddress.ts","../node_modules/viem/utils/signature/recoverPublicKey.ts","../node_modules/viem/utils/authorization/recoverAuthorizationAddress.ts","../node_modules/viem/errors/estimateGas.ts","../node_modules/viem/utils/errors/getEstimateGasError.ts","../node_modules/viem/actions/wallet/prepareTransactionRequest.ts","../node_modules/viem/errors/fee.ts","../node_modules/viem/actions/public/estimateMaxPriorityFeePerGas.ts","../node_modules/viem/errors/block.ts","../node_modules/viem/actions/public/getBlock.ts","../node_modules/viem/utils/formatters/block.ts","../node_modules/viem/utils/formatters/transaction.ts","../node_modules/viem/actions/public/getGasPrice.ts","../node_modules/viem/actions/public/estimateFeesPerGas.ts","../node_modules/viem/actions/public/fillTransaction.ts","../node_modules/viem/utils/errors/getTransactionError.ts","../node_modules/viem/actions/public/getChainId.ts","../node_modules/viem/actions/public/getContractEvents.ts","../node_modules/viem/utils/abi/parseEventLogs.ts","../node_modules/viem/utils/formatters/log.ts","../node_modules/viem/utils/abi/decodeEventLog.ts","../node_modules/viem/actions/public/getLogs.ts","../node_modules/viem/actions/public/readContract.ts","../node_modules/viem/actions/public/simulateContract.ts","../node_modules/viem/actions/public/watchContractEvent.ts","../node_modules/viem/utils/observe.ts","../node_modules/viem/utils/wait.ts","../node_modules/viem/utils/poll.ts","../node_modules/viem/utils/promise/withCache.ts","../node_modules/viem/actions/public/getBlockNumber.ts","../node_modules/viem/actions/public/getFilterChanges.ts","../node_modules/viem/actions/public/uninstallFilter.ts","../node_modules/viem/actions/wallet/sendRawTransaction.ts","../node_modules/viem/utils/promise/withRetry.ts","../node_modules/viem/utils/formatters/transactionReceipt.ts","../node_modules/viem/clients/createClient.ts","../node_modules/viem/utils/uid.ts","../node_modules/viem/actions/ens/getEnsAddress.ts","../node_modules/viem/utils/ens/errors.ts","../node_modules/viem/utils/ens/namehash.ts","../node_modules/viem/utils/ens/encodedLabelToLabelhash.ts","../node_modules/viem/utils/ens/packetToBytes.ts","../node_modules/viem/utils/ens/encodeLabelhash.ts","../node_modules/viem/utils/ens/labelhash.ts","../node_modules/viem/errors/ens.ts","../node_modules/viem/utils/ens/avatar/utils.ts","../node_modules/viem/utils/ens/avatar/parseAvatarRecord.ts","../node_modules/viem/actions/ens/getEnsText.ts","../node_modules/viem/actions/ens/getEnsAvatar.ts","../node_modules/viem/actions/ens/getEnsName.ts","../node_modules/viem/actions/ens/getEnsResolver.ts","../node_modules/viem/clients/decorators/public.ts","../node_modules/viem/actions/public/createAccessList.ts","../node_modules/viem/actions/public/createBlockFilter.ts","../node_modules/viem/actions/public/createEventFilter.ts","../node_modules/viem/actions/public/createPendingTransactionFilter.ts","../node_modules/viem/actions/public/getBalance.ts","../node_modules/viem/actions/public/getBlobBaseFee.ts","../node_modules/viem/actions/public/getBlockTransactionCount.ts","../node_modules/viem/actions/public/getCode.ts","../node_modules/viem/actions/public/getDelegation.ts","../node_modules/viem/errors/eip712.ts","../node_modules/viem/actions/public/getEip712Domain.ts","../node_modules/viem/actions/public/getFeeHistory.ts","../node_modules/viem/utils/formatters/feeHistory.ts","../node_modules/viem/actions/public/getFilterLogs.ts","../node_modules/viem/actions/public/getProof.ts","../node_modules/viem/utils/authorization/verifyAuthorization.ts","../node_modules/viem/utils/buildRequest.ts","../node_modules/viem/utils/promise/withDedupe.ts","../node_modules/viem/utils/chain/defineChain.ts","../node_modules/viem/utils/index.ts","../node_modules/viem/utils/rpc/http.ts","../node_modules/viem/utils/promise/withTimeout.ts","../node_modules/viem/utils/rpc/id.ts","../node_modules/ox/erc8010/SignatureErc8010.ts","../node_modules/ox/core/AbiParameters.ts","../node_modules/ox/core/Address.ts","../node_modules/ox/core/internal/lru.ts","../node_modules/ox/core/Caches.ts","../node_modules/ox/core/Hash.ts","../node_modules/ox/core/PublicKey.ts","../node_modules/ox/core/internal/abiParameters.ts","../node_modules/ox/core/Solidity.ts","../node_modules/ox/core/internal/cursor.ts","../node_modules/ox/core/Authorization.ts","../node_modules/ox/core/Rlp.ts","../node_modules/ox/node_modules/@noble/curves/src/secp256k1.ts","../node_modules/ox/node_modules/@noble/curves/src/_shortw_utils.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/modular.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/curve.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/weierstrass.ts","../node_modules/ox/core/Signature.ts","../node_modules/ox/core/Secp256k1.ts","../node_modules/viem/utils/formatters/proof.ts","../node_modules/viem/actions/public/getStorageAt.ts","../node_modules/viem/actions/public/getTransaction.ts","../node_modules/viem/actions/public/getTransactionConfirmations.ts","../node_modules/viem/actions/public/getTransactionReceipt.ts","../node_modules/viem/actions/public/multicall.ts","../node_modules/viem/actions/public/simulateBlocks.ts","../node_modules/ox/core/AbiItem.ts","../node_modules/ox/core/internal/abiItem.ts","../node_modules/ox/core/AbiConstructor.ts","../node_modules/ox/core/AbiFunction.ts","../node_modules/viem/actions/public/simulateCalls.ts","../node_modules/viem/constants/address.ts","../node_modules/ox/erc6492/SignatureErc6492.ts","../node_modules/viem/actions/public/verifyHash.ts","../node_modules/viem/actions/public/verifyMessage.ts","../node_modules/viem/actions/public/verifyTypedData.ts","../node_modules/viem/actions/public/waitForTransactionReceipt.ts","../node_modules/viem/actions/public/watchBlockNumber.ts","../node_modules/viem/actions/public/watchBlocks.ts","../node_modules/viem/actions/public/watchEvent.ts","../node_modules/viem/actions/public/watchPendingTransactions.ts","../node_modules/viem/actions/siwe/verifySiweMessage.ts","../node_modules/viem/utils/siwe/parseSiweMessage.ts","../node_modules/viem/utils/siwe/validateSiweMessage.ts","../node_modules/viem/actions/wallet/sendRawTransactionSync.ts","../node_modules/viem/clients/createPublicClient.ts","../node_modules/viem/clients/transports/createTransport.ts","../node_modules/viem/clients/transports/http.ts","../node_modules/viem/errors/transport.ts","../node_modules/viem/index.ts","../node_modules/viem/op-stack/contracts.ts","../node_modules/viem/op-stack/formatters.ts","../node_modules/viem/op-stack/serializers.ts","../node_modules/viem/op-stack/chainConfig.ts","../node_modules/viem/chains/definitions/base.ts","../node_modules/zod/v3/external.js","../node_modules/zod/v3/helpers/util.js","../node_modules/zod/v3/ZodError.js","../node_modules/zod/v3/locales/en.js","../node_modules/zod/v3/errors.js","../node_modules/zod/v3/helpers/parseUtil.js","../node_modules/zod/v3/helpers/errorUtil.js","../node_modules/zod/v3/types.js","../node_modules/@x402/core/src/schemas/index.ts","../node_modules/@x402/core/src/index.ts","../node_modules/@x402/core/src/utils/index.ts","../node_modules/@x402/core/src/http/x402HTTPResourceServer.ts","../node_modules/@x402/core/src/http/httpFacilitatorClient.ts","../node_modules/@x402/core/src/http/x402HTTPClient.ts","../node_modules/@x402/core/src/http/index.ts","../node_modules/@x402/core/src/client/x402Client.ts","../node_modules/@x402/fetch/src/index.ts","../src/payment-preauth.ts","../node_modules/@x402/evm/src/constants.ts","../node_modules/@x402/evm/src/utils.ts","../node_modules/@x402/evm/src/exact/facilitator/errors.ts","../node_modules/@x402/evm/src/multicall.ts","../node_modules/@x402/evm/src/exact/v1/client/scheme.ts","../node_modules/@x402/evm/src/exact/v1/facilitator/scheme.ts","../node_modules/@x402/evm/src/exact/facilitator/eip3009-utils.ts","../node_modules/@x402/evm/src/v1/index.ts","../node_modules/@x402/evm/src/exact/extensions.ts","../node_modules/@x402/evm/src/shared/permit2.ts","../node_modules/@x402/evm/src/shared/erc20approval.ts","../node_modules/@x402/evm/src/upto/facilitator/errors.ts","../node_modules/@x402/evm/src/exact/client/permit2.ts","../node_modules/@x402/evm/src/shared/extensions.ts","../node_modules/@x402/evm/src/exact/client/eip2612.ts","../node_modules/@x402/evm/src/exact/client/erc20approval.ts","../node_modules/@x402/evm/src/shared/rpc.ts","../node_modules/@x402/evm/src/exact/client/eip3009.ts","../node_modules/@x402/evm/src/exact/client/scheme.ts","../node_modules/@x402/evm/src/exact/client/register.ts","../node_modules/@x402/evm/src/signer.ts","../src/router/rules.ts","../src/router/selector.ts","../src/router/strategy.ts","../src/router/config.ts","../src/router/index.ts","../src/models.ts","../src/logger.ts","../src/stats.ts","../src/version.ts","../src/dedup.ts","../src/response-cache.ts","../src/errors.ts","../src/balance.ts","../src/okx-x402-fetch.ts","../src/compression/types.ts","../src/compression/layers/deduplication.ts","../src/compression/layers/whitespace.ts","../src/compression/codebook.ts","../src/compression/layers/dictionary.ts","../src/compression/layers/paths.ts","../src/compression/layers/json-compact.ts","../src/compression/layers/observation.ts","../src/compression/layers/dynamic-codebook.ts","../src/compression/index.ts","../src/session.ts","../src/updater.ts","../src/exclude-models.ts","../src/config.ts","../src/journal.ts","../src/upstream-proxy.ts","../src/textual-tool-calls.ts","../src/cli.ts","../src/report.ts","../src/doctor.ts","../src/partners/registry.ts"],"sourcesContent":["export const version = '1.2.3'\n","import type { OneOf, Pretty } from './types.js'\nimport { version } from './version.js'\n\ntype BaseErrorArgs = Pretty<\n {\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n } & OneOf<{ details?: string | undefined } | { cause?: BaseError | Error }>\n>\n\nexport class BaseError extends Error {\n details: string\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n shortMessage: string\n\n override name = 'AbiTypeError'\n\n constructor(shortMessage: string, args: BaseErrorArgs = {}) {\n const details =\n args.cause instanceof BaseError\n ? args.cause.details\n : args.cause?.message\n ? args.cause.message\n : args.details!\n const docsPath =\n args.cause instanceof BaseError\n ? args.cause.docsPath || args.docsPath\n : args.docsPath\n const message = [\n shortMessage || 'An error occurred.',\n '',\n ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n ...(docsPath ? [`Docs: https://abitype.dev${docsPath}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n `Version: abitype@${version}`,\n ].join('\\n')\n\n super(message)\n\n if (args.cause) this.cause = args.cause\n this.details = details\n this.docsPath = docsPath\n this.metaMessages = args.metaMessages\n this.shortMessage = shortMessage\n }\n}\n","// TODO: This looks cool. Need to check the performance of `new RegExp` versus defined inline though.\n// https://twitter.com/GabrielVergnaud/status/1622906834343366657\nexport function execTyped(regex: RegExp, string: string) {\n const match = regex.exec(string)\n return match?.groups as type | undefined\n}\n\n// `bytes`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/\n\n// `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex =\n /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/\n\nexport const isTupleRegex = /^\\(.+?\\).*?$/\n","import type { AbiEventParameter, AbiParameter } from '../abi.js'\nimport { execTyped } from '../regex.js'\nimport type { IsNarrowable, Join } from '../types.js'\nimport type { AssertName } from './types/signatures.js'\n\n/**\n * Formats {@link AbiParameter} to human-readable ABI parameter.\n *\n * @param abiParameter - ABI parameter\n * @returns Human-readable ABI parameter\n *\n * @example\n * type Result = FormatAbiParameter<{ type: 'address'; name: 'from'; }>\n * // ^? type Result = 'address from'\n */\nexport type FormatAbiParameter<\n abiParameter extends AbiParameter | AbiEventParameter,\n> = abiParameter extends {\n name?: infer name extends string\n type: `tuple${infer array}`\n components: infer components extends readonly AbiParameter[]\n indexed?: infer indexed extends boolean\n}\n ? FormatAbiParameter<\n {\n type: `(${Join<\n {\n [key in keyof components]: FormatAbiParameter<\n {\n type: components[key]['type']\n } & (IsNarrowable extends true\n ? { name: components[key]['name'] }\n : unknown) &\n (components[key] extends { components: readonly AbiParameter[] }\n ? { components: components[key]['components'] }\n : unknown)\n >\n },\n ', '\n >})${array}`\n } & (IsNarrowable extends true ? { name: name } : unknown) &\n (IsNarrowable extends true\n ? { indexed: indexed }\n : unknown)\n >\n : `${abiParameter['type']}${abiParameter extends { indexed: true }\n ? ' indexed'\n : ''}${abiParameter['name'] extends infer name extends string\n ? name extends ''\n ? ''\n : ` ${AssertName}`\n : ''}`\n\n// https://regexr.com/7f7rv\nconst tupleRegex = /^tuple(?(\\[(\\d*)\\])*)$/\n\n/**\n * Formats {@link AbiParameter} to human-readable ABI parameter.\n *\n * @param abiParameter - ABI parameter\n * @returns Human-readable ABI parameter\n *\n * @example\n * const result = formatAbiParameter({ type: 'address', name: 'from' })\n * // ^? const result: 'address from'\n */\nexport function formatAbiParameter<\n const abiParameter extends AbiParameter | AbiEventParameter,\n>(abiParameter: abiParameter): FormatAbiParameter {\n type Result = FormatAbiParameter\n\n let type = abiParameter.type\n if (tupleRegex.test(abiParameter.type) && 'components' in abiParameter) {\n type = '('\n const length = abiParameter.components.length as number\n for (let i = 0; i < length; i++) {\n const component = abiParameter.components[i]!\n type += formatAbiParameter(component)\n if (i < length - 1) type += ', '\n }\n const result = execTyped<{ array?: string }>(tupleRegex, abiParameter.type)\n type += `)${result?.array || ''}`\n return formatAbiParameter({\n ...abiParameter,\n type,\n }) as Result\n }\n // Add `indexed` to type if in `abiParameter`\n if ('indexed' in abiParameter && abiParameter.indexed)\n type = `${type} indexed`\n // Return human-readable ABI parameter\n if (abiParameter.name) return `${type} ${abiParameter.name}` as Result\n return type as Result\n}\n","import type { AbiEventParameter, AbiParameter } from '../abi.js'\nimport type { Join } from '../types.js'\nimport {\n type FormatAbiParameter,\n formatAbiParameter,\n} from './formatAbiParameter.js'\n\n/**\n * Formats {@link AbiParameter}s to human-readable ABI parameter.\n *\n * @param abiParameters - ABI parameters\n * @returns Human-readable ABI parameters\n *\n * @example\n * type Result = FormatAbiParameters<[\n * // ^? type Result = 'address from, uint256 tokenId'\n * { type: 'address'; name: 'from'; },\n * { type: 'uint256'; name: 'tokenId'; },\n * ]>\n */\nexport type FormatAbiParameters<\n abiParameters extends readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ],\n> = Join<\n {\n [key in keyof abiParameters]: FormatAbiParameter\n },\n ', '\n>\n\n/**\n * Formats {@link AbiParameter}s to human-readable ABI parameters.\n *\n * @param abiParameters - ABI parameters\n * @returns Human-readable ABI parameters\n *\n * @example\n * const result = formatAbiParameters([\n * // ^? const result: 'address from, uint256 tokenId'\n * { type: 'address', name: 'from' },\n * { type: 'uint256', name: 'tokenId' },\n * ])\n */\nexport function formatAbiParameters<\n const abiParameters extends readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ],\n>(abiParameters: abiParameters): FormatAbiParameters {\n let params = ''\n const length = abiParameters.length\n for (let i = 0; i < length; i++) {\n const abiParameter = abiParameters[i]!\n params += formatAbiParameter(abiParameter)\n if (i !== length - 1) params += ', '\n }\n return params as FormatAbiParameters\n}\n","import type {\n Abi,\n AbiConstructor,\n AbiError,\n AbiEvent,\n AbiEventParameter,\n AbiFallback,\n AbiFunction,\n AbiParameter,\n AbiReceive,\n AbiStateMutability,\n} from '../abi.js'\nimport {\n type FormatAbiParameters as FormatAbiParameters_,\n formatAbiParameters,\n} from './formatAbiParameters.js'\nimport type { AssertName } from './types/signatures.js'\n\n/**\n * Formats ABI item (e.g. error, event, function) into human-readable ABI item\n *\n * @param abiItem - ABI item\n * @returns Human-readable ABI item\n */\nexport type FormatAbiItem =\n Abi[number] extends abiItem\n ? string\n :\n | (abiItem extends AbiFunction\n ? AbiFunction extends abiItem\n ? string\n : `function ${AssertName}(${FormatAbiParameters<\n abiItem['inputs']\n >})${abiItem['stateMutability'] extends Exclude<\n AbiStateMutability,\n 'nonpayable'\n >\n ? ` ${abiItem['stateMutability']}`\n : ''}${abiItem['outputs']['length'] extends 0\n ? ''\n : ` returns (${FormatAbiParameters})`}`\n : never)\n | (abiItem extends AbiEvent\n ? AbiEvent extends abiItem\n ? string\n : `event ${AssertName}(${FormatAbiParameters<\n abiItem['inputs']\n >})`\n : never)\n | (abiItem extends AbiError\n ? AbiError extends abiItem\n ? string\n : `error ${AssertName}(${FormatAbiParameters<\n abiItem['inputs']\n >})`\n : never)\n | (abiItem extends AbiConstructor\n ? AbiConstructor extends abiItem\n ? string\n : `constructor(${FormatAbiParameters<\n abiItem['inputs']\n >})${abiItem['stateMutability'] extends 'payable'\n ? ' payable'\n : ''}`\n : never)\n | (abiItem extends AbiFallback\n ? AbiFallback extends abiItem\n ? string\n : `fallback() external${abiItem['stateMutability'] extends 'payable'\n ? ' payable'\n : ''}`\n : never)\n | (abiItem extends AbiReceive\n ? AbiReceive extends abiItem\n ? string\n : 'receive() external payable'\n : never)\n\ntype FormatAbiParameters<\n abiParameters extends readonly (AbiParameter | AbiEventParameter)[],\n> = abiParameters['length'] extends 0\n ? ''\n : FormatAbiParameters_<\n abiParameters extends readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ]\n ? abiParameters\n : never\n >\n\n/**\n * Formats ABI item (e.g. error, event, function) into human-readable ABI item\n *\n * @param abiItem - ABI item\n * @returns Human-readable ABI item\n */\nexport function formatAbiItem(\n abiItem: abiItem,\n): FormatAbiItem {\n type Result = FormatAbiItem\n type Params = readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ]\n\n if (abiItem.type === 'function')\n return `function ${abiItem.name}(${formatAbiParameters(\n abiItem.inputs as Params,\n )})${\n abiItem.stateMutability && abiItem.stateMutability !== 'nonpayable'\n ? ` ${abiItem.stateMutability}`\n : ''\n }${\n abiItem.outputs?.length\n ? ` returns (${formatAbiParameters(abiItem.outputs as Params)})`\n : ''\n }`\n if (abiItem.type === 'event')\n return `event ${abiItem.name}(${formatAbiParameters(\n abiItem.inputs as Params,\n )})`\n if (abiItem.type === 'error')\n return `error ${abiItem.name}(${formatAbiParameters(\n abiItem.inputs as Params,\n )})`\n if (abiItem.type === 'constructor')\n return `constructor(${formatAbiParameters(abiItem.inputs as Params)})${\n abiItem.stateMutability === 'payable' ? ' payable' : ''\n }`\n if (abiItem.type === 'fallback')\n return `fallback() external${\n abiItem.stateMutability === 'payable' ? ' payable' : ''\n }` as Result\n return 'receive() external payable' as Result\n}\n","import type { AbiStateMutability } from '../../abi.js'\nimport { execTyped } from '../../regex.js'\nimport type {\n EventModifier,\n FunctionModifier,\n Modifier,\n} from '../types/signatures.js'\n\n// https://regexr.com/7gmok\nconst errorSignatureRegex =\n /^error (?[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?.*?)\\)$/\nexport function isErrorSignature(signature: string) {\n return errorSignatureRegex.test(signature)\n}\nexport function execErrorSignature(signature: string) {\n return execTyped<{ name: string; parameters: string }>(\n errorSignatureRegex,\n signature,\n )\n}\n\n// https://regexr.com/7gmoq\nconst eventSignatureRegex =\n /^event (?[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?.*?)\\)$/\nexport function isEventSignature(signature: string) {\n return eventSignatureRegex.test(signature)\n}\nexport function execEventSignature(signature: string) {\n return execTyped<{ name: string; parameters: string }>(\n eventSignatureRegex,\n signature,\n )\n}\n\n// https://regexr.com/7gmot\nconst functionSignatureRegex =\n /^function (?[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?.*?)\\)(?: (?external|public{1}))?(?: (?pure|view|nonpayable|payable{1}))?(?: returns\\s?\\((?.*?)\\))?$/\nexport function isFunctionSignature(signature: string) {\n return functionSignatureRegex.test(signature)\n}\nexport function execFunctionSignature(signature: string) {\n return execTyped<{\n name: string\n parameters: string\n stateMutability?: AbiStateMutability\n returns?: string\n }>(functionSignatureRegex, signature)\n}\n\n// https://regexr.com/7gmp3\nconst structSignatureRegex =\n /^struct (?[a-zA-Z$_][a-zA-Z0-9$_]*) \\{(?.*?)\\}$/\nexport function isStructSignature(signature: string) {\n return structSignatureRegex.test(signature)\n}\nexport function execStructSignature(signature: string) {\n return execTyped<{ name: string; properties: string }>(\n structSignatureRegex,\n signature,\n )\n}\n\n// https://regexr.com/78u01\nconst constructorSignatureRegex =\n /^constructor\\((?.*?)\\)(?:\\s(?payable{1}))?$/\nexport function isConstructorSignature(signature: string) {\n return constructorSignatureRegex.test(signature)\n}\nexport function execConstructorSignature(signature: string) {\n return execTyped<{\n parameters: string\n stateMutability?: Extract\n }>(constructorSignatureRegex, signature)\n}\n\n// https://regexr.com/7srtn\nconst fallbackSignatureRegex =\n /^fallback\\(\\) external(?:\\s(?payable{1}))?$/\nexport function isFallbackSignature(signature: string) {\n return fallbackSignatureRegex.test(signature)\n}\nexport function execFallbackSignature(signature: string) {\n return execTyped<{\n parameters: string\n stateMutability?: Extract\n }>(fallbackSignatureRegex, signature)\n}\n\n// https://regexr.com/78u1k\nconst receiveSignatureRegex = /^receive\\(\\) external payable$/\nexport function isReceiveSignature(signature: string) {\n return receiveSignatureRegex.test(signature)\n}\n\nexport const modifiers = new Set([\n 'memory',\n 'indexed',\n 'storage',\n 'calldata',\n])\nexport const eventModifiers = new Set(['indexed'])\nexport const functionModifiers = new Set([\n 'calldata',\n 'memory',\n 'storage',\n])\n","import { BaseError } from '../../errors.js'\n\nexport class InvalidAbiItemError extends BaseError {\n override name = 'InvalidAbiItemError'\n\n constructor({ signature }: { signature: string | object }) {\n super('Failed to parse ABI item.', {\n details: `parseAbiItem(${JSON.stringify(signature, null, 2)})`,\n docsPath: '/api/human#parseabiitem-1',\n })\n }\n}\n\nexport class UnknownTypeError extends BaseError {\n override name = 'UnknownTypeError'\n\n constructor({ type }: { type: string }) {\n super('Unknown type.', {\n metaMessages: [\n `Type \"${type}\" is not a valid ABI type. Perhaps you forgot to include a struct signature?`,\n ],\n })\n }\n}\n\nexport class UnknownSolidityTypeError extends BaseError {\n override name = 'UnknownSolidityTypeError'\n\n constructor({ type }: { type: string }) {\n super('Unknown type.', {\n metaMessages: [`Type \"${type}\" is not a valid ABI type.`],\n })\n }\n}\n","import type { AbiItemType, AbiParameter } from '../../abi.js'\nimport { BaseError } from '../../errors.js'\nimport type { Modifier } from '../types/signatures.js'\n\nexport class InvalidAbiParameterError extends BaseError {\n override name = 'InvalidAbiParameterError'\n\n constructor({ param }: { param: string | object }) {\n super('Failed to parse ABI parameter.', {\n details: `parseAbiParameter(${JSON.stringify(param, null, 2)})`,\n docsPath: '/api/human#parseabiparameter-1',\n })\n }\n}\n\nexport class InvalidAbiParametersError extends BaseError {\n override name = 'InvalidAbiParametersError'\n\n constructor({ params }: { params: string | object }) {\n super('Failed to parse ABI parameters.', {\n details: `parseAbiParameters(${JSON.stringify(params, null, 2)})`,\n docsPath: '/api/human#parseabiparameters-1',\n })\n }\n}\n\nexport class InvalidParameterError extends BaseError {\n override name = 'InvalidParameterError'\n\n constructor({ param }: { param: string }) {\n super('Invalid ABI parameter.', {\n details: param,\n })\n }\n}\n\nexport class SolidityProtectedKeywordError extends BaseError {\n override name = 'SolidityProtectedKeywordError'\n\n constructor({ param, name }: { param: string; name: string }) {\n super('Invalid ABI parameter.', {\n details: param,\n metaMessages: [\n `\"${name}\" is a protected Solidity keyword. More info: https://docs.soliditylang.org/en/latest/cheatsheet.html`,\n ],\n })\n }\n}\n\nexport class InvalidModifierError extends BaseError {\n override name = 'InvalidModifierError'\n\n constructor({\n param,\n type,\n modifier,\n }: {\n param: string\n type?: AbiItemType | 'struct' | undefined\n modifier: Modifier\n }) {\n super('Invalid ABI parameter.', {\n details: param,\n metaMessages: [\n `Modifier \"${modifier}\" not allowed${\n type ? ` in \"${type}\" type` : ''\n }.`,\n ],\n })\n }\n}\n\nexport class InvalidFunctionModifierError extends BaseError {\n override name = 'InvalidFunctionModifierError'\n\n constructor({\n param,\n type,\n modifier,\n }: {\n param: string\n type?: AbiItemType | 'struct' | undefined\n modifier: Modifier\n }) {\n super('Invalid ABI parameter.', {\n details: param,\n metaMessages: [\n `Modifier \"${modifier}\" not allowed${\n type ? ` in \"${type}\" type` : ''\n }.`,\n `Data location can only be specified for array, struct, or mapping types, but \"${modifier}\" was given.`,\n ],\n })\n }\n}\n\nexport class InvalidAbiTypeParameterError extends BaseError {\n override name = 'InvalidAbiTypeParameterError'\n\n constructor({\n abiParameter,\n }: {\n abiParameter: AbiParameter & { indexed?: boolean | undefined }\n }) {\n super('Invalid ABI parameter.', {\n details: JSON.stringify(abiParameter, null, 2),\n metaMessages: ['ABI parameter type is invalid.'],\n })\n }\n}\n","import type { AbiItemType } from '../../abi.js'\nimport { BaseError } from '../../errors.js'\n\nexport class InvalidSignatureError extends BaseError {\n override name = 'InvalidSignatureError'\n\n constructor({\n signature,\n type,\n }: {\n signature: string\n type: AbiItemType | 'struct'\n }) {\n super(`Invalid ${type} signature.`, {\n details: signature,\n })\n }\n}\n\nexport class UnknownSignatureError extends BaseError {\n override name = 'UnknownSignatureError'\n\n constructor({ signature }: { signature: string }) {\n super('Unknown signature.', {\n details: signature,\n })\n }\n}\n\nexport class InvalidStructSignatureError extends BaseError {\n override name = 'InvalidStructSignatureError'\n\n constructor({ signature }: { signature: string }) {\n super('Invalid struct signature.', {\n details: signature,\n metaMessages: ['No properties exist.'],\n })\n }\n}\n","import { BaseError } from '../../errors.js'\n\nexport class CircularReferenceError extends BaseError {\n override name = 'CircularReferenceError'\n\n constructor({ type }: { type: string }) {\n super('Circular reference detected.', {\n metaMessages: [`Struct \"${type}\" is a circular reference.`],\n })\n }\n}\n","import { BaseError } from '../../errors.js'\n\nexport class InvalidParenthesisError extends BaseError {\n override name = 'InvalidParenthesisError'\n\n constructor({ current, depth }: { current: string; depth: number }) {\n super('Unbalanced parentheses.', {\n metaMessages: [\n `\"${current.trim()}\" has too many ${\n depth > 0 ? 'opening' : 'closing'\n } parentheses.`,\n ],\n details: `Depth \"${depth}\"`,\n })\n }\n}\n","import type { AbiItemType, AbiParameter } from '../../abi.js'\nimport type { StructLookup } from '../types/structs.js'\n\n/**\n * Gets {@link parameterCache} cache key namespaced by {@link type} and {@link structs}. This prevents parameters from being accessible to types that don't allow them (e.g. `string indexed foo` not allowed outside of `type: 'event'`) and ensures different struct definitions with the same name are cached separately.\n * @param param ABI parameter string\n * @param type ABI parameter type\n * @param structs Struct definitions to include in cache key\n * @returns Cache key for {@link parameterCache}\n */\nexport function getParameterCacheKey(\n param: string,\n type?: AbiItemType | 'struct',\n structs?: StructLookup,\n) {\n let structKey = ''\n if (structs)\n for (const struct of Object.entries(structs)) {\n if (!struct) continue\n let propertyKey = ''\n for (const property of struct[1]) {\n propertyKey += `[${property.type}${property.name ? `:${property.name}` : ''}]`\n }\n structKey += `(${struct[0]}{${propertyKey}})`\n }\n if (type) return `${type}:${param}${structKey}`\n return `${param}${structKey}`\n}\n\n/**\n * Basic cache seeded with common ABI parameter strings.\n *\n * **Note: When seeding more parameters, make sure you benchmark performance. The current number is the ideal balance between performance and having an already existing cache.**\n */\nexport const parameterCache = new Map<\n string,\n AbiParameter & { indexed?: boolean }\n>([\n // Unnamed\n ['address', { type: 'address' }],\n ['bool', { type: 'bool' }],\n ['bytes', { type: 'bytes' }],\n ['bytes32', { type: 'bytes32' }],\n ['int', { type: 'int256' }],\n ['int256', { type: 'int256' }],\n ['string', { type: 'string' }],\n ['uint', { type: 'uint256' }],\n ['uint8', { type: 'uint8' }],\n ['uint16', { type: 'uint16' }],\n ['uint24', { type: 'uint24' }],\n ['uint32', { type: 'uint32' }],\n ['uint64', { type: 'uint64' }],\n ['uint96', { type: 'uint96' }],\n ['uint112', { type: 'uint112' }],\n ['uint160', { type: 'uint160' }],\n ['uint192', { type: 'uint192' }],\n ['uint256', { type: 'uint256' }],\n\n // Named\n ['address owner', { type: 'address', name: 'owner' }],\n ['address to', { type: 'address', name: 'to' }],\n ['bool approved', { type: 'bool', name: 'approved' }],\n ['bytes _data', { type: 'bytes', name: '_data' }],\n ['bytes data', { type: 'bytes', name: 'data' }],\n ['bytes signature', { type: 'bytes', name: 'signature' }],\n ['bytes32 hash', { type: 'bytes32', name: 'hash' }],\n ['bytes32 r', { type: 'bytes32', name: 'r' }],\n ['bytes32 root', { type: 'bytes32', name: 'root' }],\n ['bytes32 s', { type: 'bytes32', name: 's' }],\n ['string name', { type: 'string', name: 'name' }],\n ['string symbol', { type: 'string', name: 'symbol' }],\n ['string tokenURI', { type: 'string', name: 'tokenURI' }],\n ['uint tokenId', { type: 'uint256', name: 'tokenId' }],\n ['uint8 v', { type: 'uint8', name: 'v' }],\n ['uint256 balance', { type: 'uint256', name: 'balance' }],\n ['uint256 tokenId', { type: 'uint256', name: 'tokenId' }],\n ['uint256 value', { type: 'uint256', name: 'value' }],\n\n // Indexed\n [\n 'event:address indexed from',\n { type: 'address', name: 'from', indexed: true },\n ],\n ['event:address indexed to', { type: 'address', name: 'to', indexed: true }],\n [\n 'event:uint indexed tokenId',\n { type: 'uint256', name: 'tokenId', indexed: true },\n ],\n [\n 'event:uint256 indexed tokenId',\n { type: 'uint256', name: 'tokenId', indexed: true },\n ],\n])\n","import type {\n AbiItemType,\n AbiType,\n SolidityArray,\n SolidityBytes,\n SolidityString,\n SolidityTuple,\n} from '../../abi.js'\nimport {\n bytesRegex,\n execTyped,\n integerRegex,\n isTupleRegex,\n} from '../../regex.js'\nimport { UnknownSolidityTypeError } from '../errors/abiItem.js'\nimport {\n InvalidFunctionModifierError,\n InvalidModifierError,\n InvalidParameterError,\n SolidityProtectedKeywordError,\n} from '../errors/abiParameter.js'\nimport {\n InvalidSignatureError,\n UnknownSignatureError,\n} from '../errors/signature.js'\nimport { InvalidParenthesisError } from '../errors/splitParameters.js'\nimport type { FunctionModifier, Modifier } from '../types/signatures.js'\nimport type { StructLookup } from '../types/structs.js'\nimport { getParameterCacheKey, parameterCache } from './cache.js'\nimport {\n eventModifiers,\n execConstructorSignature,\n execErrorSignature,\n execEventSignature,\n execFallbackSignature,\n execFunctionSignature,\n functionModifiers,\n isConstructorSignature,\n isErrorSignature,\n isEventSignature,\n isFallbackSignature,\n isFunctionSignature,\n isReceiveSignature,\n} from './signatures.js'\n\nexport function parseSignature(signature: string, structs: StructLookup = {}) {\n if (isFunctionSignature(signature))\n return parseFunctionSignature(signature, structs)\n\n if (isEventSignature(signature))\n return parseEventSignature(signature, structs)\n\n if (isErrorSignature(signature))\n return parseErrorSignature(signature, structs)\n\n if (isConstructorSignature(signature))\n return parseConstructorSignature(signature, structs)\n\n if (isFallbackSignature(signature)) return parseFallbackSignature(signature)\n\n if (isReceiveSignature(signature))\n return {\n type: 'receive',\n stateMutability: 'payable',\n }\n\n throw new UnknownSignatureError({ signature })\n}\n\nexport function parseFunctionSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execFunctionSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'function' })\n\n const inputParams = splitParameters(match.parameters)\n const inputs = []\n const inputLength = inputParams.length\n for (let i = 0; i < inputLength; i++) {\n inputs.push(\n parseAbiParameter(inputParams[i]!, {\n modifiers: functionModifiers,\n structs,\n type: 'function',\n }),\n )\n }\n\n const outputs = []\n if (match.returns) {\n const outputParams = splitParameters(match.returns)\n const outputLength = outputParams.length\n for (let i = 0; i < outputLength; i++) {\n outputs.push(\n parseAbiParameter(outputParams[i]!, {\n modifiers: functionModifiers,\n structs,\n type: 'function',\n }),\n )\n }\n }\n\n return {\n name: match.name,\n type: 'function',\n stateMutability: match.stateMutability ?? 'nonpayable',\n inputs,\n outputs,\n }\n}\n\nexport function parseEventSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execEventSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'event' })\n\n const params = splitParameters(match.parameters)\n const abiParameters = []\n const length = params.length\n for (let i = 0; i < length; i++)\n abiParameters.push(\n parseAbiParameter(params[i]!, {\n modifiers: eventModifiers,\n structs,\n type: 'event',\n }),\n )\n return { name: match.name, type: 'event', inputs: abiParameters }\n}\n\nexport function parseErrorSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execErrorSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'error' })\n\n const params = splitParameters(match.parameters)\n const abiParameters = []\n const length = params.length\n for (let i = 0; i < length; i++)\n abiParameters.push(\n parseAbiParameter(params[i]!, { structs, type: 'error' }),\n )\n return { name: match.name, type: 'error', inputs: abiParameters }\n}\n\nexport function parseConstructorSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execConstructorSignature(signature)\n if (!match)\n throw new InvalidSignatureError({ signature, type: 'constructor' })\n\n const params = splitParameters(match.parameters)\n const abiParameters = []\n const length = params.length\n for (let i = 0; i < length; i++)\n abiParameters.push(\n parseAbiParameter(params[i]!, { structs, type: 'constructor' }),\n )\n return {\n type: 'constructor',\n stateMutability: match.stateMutability ?? 'nonpayable',\n inputs: abiParameters,\n }\n}\n\nexport function parseFallbackSignature(signature: string) {\n const match = execFallbackSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'fallback' })\n\n return {\n type: 'fallback',\n stateMutability: match.stateMutability ?? 'nonpayable',\n }\n}\n\nconst abiParameterWithoutTupleRegex =\n /^(?[a-zA-Z$_][a-zA-Z0-9$_]*(?:\\spayable)?)(?(?:\\[\\d*?\\])+?)?(?:\\s(?calldata|indexed|memory|storage{1}))?(?:\\s(?[a-zA-Z$_][a-zA-Z0-9$_]*))?$/\nconst abiParameterWithTupleRegex =\n /^\\((?.+?)\\)(?(?:\\[\\d*?\\])+?)?(?:\\s(?calldata|indexed|memory|storage{1}))?(?:\\s(?[a-zA-Z$_][a-zA-Z0-9$_]*))?$/\nconst dynamicIntegerRegex = /^u?int$/\n\ntype ParseOptions = {\n modifiers?: Set\n structs?: StructLookup\n type?: AbiItemType | 'struct'\n}\n\nexport function parseAbiParameter(param: string, options?: ParseOptions) {\n // optional namespace cache by `type`\n const parameterCacheKey = getParameterCacheKey(\n param,\n options?.type,\n options?.structs,\n )\n if (parameterCache.has(parameterCacheKey))\n return parameterCache.get(parameterCacheKey)!\n\n const isTuple = isTupleRegex.test(param)\n const match = execTyped<{\n array?: string\n modifier?: Modifier\n name?: string\n type: string\n }>(\n isTuple ? abiParameterWithTupleRegex : abiParameterWithoutTupleRegex,\n param,\n )\n if (!match) throw new InvalidParameterError({ param })\n\n if (match.name && isSolidityKeyword(match.name))\n throw new SolidityProtectedKeywordError({ param, name: match.name })\n\n const name = match.name ? { name: match.name } : {}\n const indexed = match.modifier === 'indexed' ? { indexed: true } : {}\n const structs = options?.structs ?? {}\n let type: string\n let components = {}\n if (isTuple) {\n type = 'tuple'\n const params = splitParameters(match.type)\n const components_ = []\n const length = params.length\n for (let i = 0; i < length; i++) {\n // remove `modifiers` from `options` to prevent from being added to tuple components\n components_.push(parseAbiParameter(params[i]!, { structs }))\n }\n components = { components: components_ }\n } else if (match.type in structs) {\n type = 'tuple'\n components = { components: structs[match.type] }\n } else if (dynamicIntegerRegex.test(match.type)) {\n type = `${match.type}256`\n } else if (match.type === 'address payable') {\n type = 'address'\n } else {\n type = match.type\n if (!(options?.type === 'struct') && !isSolidityType(type))\n throw new UnknownSolidityTypeError({ type })\n }\n\n if (match.modifier) {\n // Check if modifier exists, but is not allowed (e.g. `indexed` in `functionModifiers`)\n if (!options?.modifiers?.has?.(match.modifier))\n throw new InvalidModifierError({\n param,\n type: options?.type,\n modifier: match.modifier,\n })\n\n // Check if resolved `type` is valid if there is a function modifier\n if (\n functionModifiers.has(match.modifier as FunctionModifier) &&\n !isValidDataLocation(type, !!match.array)\n )\n throw new InvalidFunctionModifierError({\n param,\n type: options?.type,\n modifier: match.modifier,\n })\n }\n\n const abiParameter = {\n type: `${type}${match.array ?? ''}`,\n ...name,\n ...indexed,\n ...components,\n }\n parameterCache.set(parameterCacheKey, abiParameter)\n return abiParameter\n}\n\n// s/o latika for this\nexport function splitParameters(\n params: string,\n result: string[] = [],\n current = '',\n depth = 0,\n): readonly string[] {\n const length = params.trim().length\n // biome-ignore lint/correctness/noUnreachable: recursive\n for (let i = 0; i < length; i++) {\n const char = params[i]\n const tail = params.slice(i + 1)\n switch (char) {\n case ',':\n return depth === 0\n ? splitParameters(tail, [...result, current.trim()])\n : splitParameters(tail, result, `${current}${char}`, depth)\n case '(':\n return splitParameters(tail, result, `${current}${char}`, depth + 1)\n case ')':\n return splitParameters(tail, result, `${current}${char}`, depth - 1)\n default:\n return splitParameters(tail, result, `${current}${char}`, depth)\n }\n }\n\n if (current === '') return result\n if (depth !== 0) throw new InvalidParenthesisError({ current, depth })\n\n result.push(current.trim())\n return result\n}\n\nexport function isSolidityType(\n type: string,\n): type is Exclude {\n return (\n type === 'address' ||\n type === 'bool' ||\n type === 'function' ||\n type === 'string' ||\n bytesRegex.test(type) ||\n integerRegex.test(type)\n )\n}\n\nconst protectedKeywordsRegex =\n /^(?:after|alias|anonymous|apply|auto|byte|calldata|case|catch|constant|copyof|default|defined|error|event|external|false|final|function|immutable|implements|in|indexed|inline|internal|let|mapping|match|memory|mutable|null|of|override|partial|private|promise|public|pure|reference|relocatable|return|returns|sizeof|static|storage|struct|super|supports|switch|this|true|try|typedef|typeof|var|view|virtual)$/\n\n/** @internal */\nexport function isSolidityKeyword(name: string) {\n return (\n name === 'address' ||\n name === 'bool' ||\n name === 'function' ||\n name === 'string' ||\n name === 'tuple' ||\n bytesRegex.test(name) ||\n integerRegex.test(name) ||\n protectedKeywordsRegex.test(name)\n )\n}\n\n/** @internal */\nexport function isValidDataLocation(\n type: string,\n isArray: boolean,\n): type is Exclude<\n AbiType,\n SolidityString | Extract | SolidityArray\n> {\n return isArray || type === 'bytes' || type === 'string' || type === 'tuple'\n}\n","import type { AbiParameter } from '../../abi.js'\nimport { execTyped, isTupleRegex } from '../../regex.js'\nimport { UnknownTypeError } from '../errors/abiItem.js'\nimport { InvalidAbiTypeParameterError } from '../errors/abiParameter.js'\nimport {\n InvalidSignatureError,\n InvalidStructSignatureError,\n} from '../errors/signature.js'\nimport { CircularReferenceError } from '../errors/struct.js'\nimport type { StructLookup } from '../types/structs.js'\nimport { execStructSignature, isStructSignature } from './signatures.js'\nimport { isSolidityType, parseAbiParameter } from './utils.js'\n\nexport function parseStructs(signatures: readonly string[]) {\n // Create \"shallow\" version of each struct (and filter out non-structs or invalid structs)\n const shallowStructs: StructLookup = {}\n const signaturesLength = signatures.length\n for (let i = 0; i < signaturesLength; i++) {\n const signature = signatures[i]!\n if (!isStructSignature(signature)) continue\n\n const match = execStructSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'struct' })\n\n const properties = match.properties.split(';')\n\n const components: AbiParameter[] = []\n const propertiesLength = properties.length\n for (let k = 0; k < propertiesLength; k++) {\n const property = properties[k]!\n const trimmed = property.trim()\n if (!trimmed) continue\n const abiParameter = parseAbiParameter(trimmed, {\n type: 'struct',\n })\n components.push(abiParameter)\n }\n\n if (!components.length) throw new InvalidStructSignatureError({ signature })\n shallowStructs[match.name] = components\n }\n\n // Resolve nested structs inside each parameter\n const resolvedStructs: StructLookup = {}\n const entries = Object.entries(shallowStructs)\n const entriesLength = entries.length\n for (let i = 0; i < entriesLength; i++) {\n const [name, parameters] = entries[i]!\n resolvedStructs[name] = resolveStructs(parameters, shallowStructs)\n }\n\n return resolvedStructs\n}\n\nconst typeWithoutTupleRegex =\n /^(?[a-zA-Z$_][a-zA-Z0-9$_]*)(?(?:\\[\\d*?\\])+?)?$/\n\nfunction resolveStructs(\n abiParameters: readonly (AbiParameter & { indexed?: true })[] = [],\n structs: StructLookup = {},\n ancestors = new Set(),\n) {\n const components: AbiParameter[] = []\n const length = abiParameters.length\n for (let i = 0; i < length; i++) {\n const abiParameter = abiParameters[i]!\n const isTuple = isTupleRegex.test(abiParameter.type)\n if (isTuple) components.push(abiParameter)\n else {\n const match = execTyped<{ array?: string; type: string }>(\n typeWithoutTupleRegex,\n abiParameter.type,\n )\n if (!match?.type) throw new InvalidAbiTypeParameterError({ abiParameter })\n\n const { array, type } = match\n if (type in structs) {\n if (ancestors.has(type)) throw new CircularReferenceError({ type })\n\n components.push({\n ...abiParameter,\n type: `tuple${array ?? ''}`,\n components: resolveStructs(\n structs[type],\n structs,\n new Set([...ancestors, type]),\n ),\n })\n } else {\n if (isSolidityType(type)) components.push(abiParameter)\n else throw new UnknownTypeError({ type })\n }\n }\n }\n\n return components\n}\n","import type { Abi } from '../abi.js'\nimport type { Error, Filter } from '../types.js'\nimport { isStructSignature } from './runtime/signatures.js'\nimport { parseStructs } from './runtime/structs.js'\nimport { parseSignature } from './runtime/utils.js'\nimport type { Signatures } from './types/signatures.js'\nimport type { ParseStructs } from './types/structs.js'\nimport type { ParseSignature } from './types/utils.js'\n\n/**\n * Parses human-readable ABI into JSON {@link Abi}\n *\n * @param signatures - Human-readable ABI\n * @returns Parsed {@link Abi}\n *\n * @example\n * type Result = ParseAbi<\n * // ^? type Result = readonly [{ name: \"balanceOf\"; type: \"function\"; stateMutability:...\n * [\n * 'function balanceOf(address owner) view returns (uint256)',\n * 'event Transfer(address indexed from, address indexed to, uint256 amount)',\n * ]\n * >\n */\nexport type ParseAbi =\n string[] extends signatures\n ? Abi // If `T` was not able to be inferred (e.g. just `string[]`), return `Abi`\n : signatures extends readonly string[]\n ? signatures extends Signatures // Validate signatures\n ? ParseStructs extends infer structs\n ? {\n [key in keyof signatures]: signatures[key] extends string\n ? ParseSignature\n : never\n } extends infer mapped extends readonly unknown[]\n ? Filter extends infer result\n ? result extends readonly []\n ? never\n : result\n : never\n : never\n : never\n : never\n : never\n\n/**\n * Parses human-readable ABI into JSON {@link Abi}\n *\n * @param signatures - Human-Readable ABI\n * @returns Parsed {@link Abi}\n *\n * @example\n * const abi = parseAbi([\n * // ^? const abi: readonly [{ name: \"balanceOf\"; type: \"function\"; stateMutability:...\n * 'function balanceOf(address owner) view returns (uint256)',\n * 'event Transfer(address indexed from, address indexed to, uint256 amount)',\n * ])\n */\nexport function parseAbi(\n signatures: signatures['length'] extends 0\n ? Error<'At least one signature required'>\n : Signatures extends signatures\n ? signatures\n : Signatures,\n): ParseAbi {\n const structs = parseStructs(signatures as readonly string[])\n const abi = []\n const length = signatures.length as number\n for (let i = 0; i < length; i++) {\n const signature = (signatures as readonly string[])[i]!\n if (isStructSignature(signature)) continue\n abi.push(parseSignature(signature, structs))\n }\n return abi as unknown as ParseAbi\n}\n","import type { Abi } from '../abi.js'\nimport type { Narrow } from '../narrow.js'\nimport type { Error, Filter } from '../types.js'\nimport { InvalidAbiItemError } from './errors/abiItem.js'\nimport { isStructSignature } from './runtime/signatures.js'\nimport { parseStructs } from './runtime/structs.js'\nimport { parseSignature } from './runtime/utils.js'\nimport type { Signature, Signatures } from './types/signatures.js'\nimport type { ParseStructs } from './types/structs.js'\nimport type { ParseSignature } from './types/utils.js'\n\n/**\n * Parses human-readable ABI item (e.g. error, event, function) into {@link Abi} item\n *\n * @param signature - Human-readable ABI item\n * @returns Parsed {@link Abi} item\n *\n * @example\n * type Result = ParseAbiItem<'function balanceOf(address owner) view returns (uint256)'>\n * // ^? type Result = { name: \"balanceOf\"; type: \"function\"; stateMutability: \"view\";...\n *\n * @example\n * type Result = ParseAbiItem<\n * // ^? type Result = { name: \"foo\"; type: \"function\"; stateMutability: \"view\"; inputs:...\n * ['function foo(Baz bar) view returns (string)', 'struct Baz { string name; }']\n * >\n */\nexport type ParseAbiItem<\n signature extends string | readonly string[] | readonly unknown[],\n> =\n | (signature extends string\n ? string extends signature\n ? Abi[number]\n : signature extends Signature // Validate signature\n ? ParseSignature\n : never\n : never)\n | (signature extends readonly string[]\n ? string[] extends signature\n ? Abi[number] // Return generic Abi item since type was no inferrable\n : signature extends Signatures // Validate signature\n ? ParseStructs extends infer structs\n ? {\n [key in keyof signature]: ParseSignature<\n signature[key] extends string ? signature[key] : never,\n structs\n >\n } extends infer mapped extends readonly unknown[]\n ? // Filter out `never` since those are structs\n Filter[0] extends infer result\n ? result extends undefined // convert `undefined` to `never` (e.g. `ParseAbiItem<['struct Foo { string name; }']>`)\n ? never\n : result\n : never\n : never\n : never\n : never\n : never)\n\n/**\n * Parses human-readable ABI item (e.g. error, event, function) into {@link Abi} item\n *\n * @param signature - Human-readable ABI item\n * @returns Parsed {@link Abi} item\n *\n * @example\n * const abiItem = parseAbiItem('function balanceOf(address owner) view returns (uint256)')\n * // ^? const abiItem: { name: \"balanceOf\"; type: \"function\"; stateMutability: \"view\";...\n *\n * @example\n * const abiItem = parseAbiItem([\n * // ^? const abiItem: { name: \"foo\"; type: \"function\"; stateMutability: \"view\"; inputs:...\n * 'function foo(Baz bar) view returns (string)',\n * 'struct Baz { string name; }',\n * ])\n */\nexport function parseAbiItem<\n signature extends string | readonly string[] | readonly unknown[],\n>(\n signature: Narrow &\n (\n | (signature extends string\n ? string extends signature\n ? unknown\n : Signature\n : never)\n | (signature extends readonly string[]\n ? signature extends readonly [] // empty array\n ? Error<'At least one signature required.'>\n : string[] extends signature\n ? unknown\n : Signatures\n : never)\n ),\n): ParseAbiItem {\n let abiItem: ParseAbiItem | undefined\n if (typeof signature === 'string')\n abiItem = parseSignature(signature) as ParseAbiItem\n else {\n const structs = parseStructs(signature as readonly string[])\n const length = signature.length as number\n for (let i = 0; i < length; i++) {\n const signature_ = (signature as readonly string[])[i]!\n if (isStructSignature(signature_)) continue\n abiItem = parseSignature(signature_, structs) as ParseAbiItem\n break\n }\n }\n\n if (!abiItem) throw new InvalidAbiItemError({ signature })\n return abiItem as ParseAbiItem\n}\n","import type { AbiParameter } from '../abi.js'\nimport type { Narrow } from '../narrow.js'\nimport type { Error, Filter } from '../types.js'\nimport { InvalidAbiParametersError } from './errors/abiParameter.js'\nimport { isStructSignature, modifiers } from './runtime/signatures.js'\nimport { parseStructs } from './runtime/structs.js'\nimport { splitParameters } from './runtime/utils.js'\nimport { parseAbiParameter as parseAbiParameter_ } from './runtime/utils.js'\nimport type { IsStructSignature, Modifier } from './types/signatures.js'\nimport type { ParseStructs } from './types/structs.js'\nimport type { SplitParameters } from './types/utils.js'\nimport type { ParseAbiParameters as ParseAbiParameters_ } from './types/utils.js'\n\n/**\n * Parses human-readable ABI parameters into {@link AbiParameter}s\n *\n * @param params - Human-readable ABI parameters\n * @returns Parsed {@link AbiParameter}s\n *\n * @example\n * type Result = ParseAbiParameters('address from, address to, uint256 amount')\n * // ^? type Result: [{ type: \"address\"; name: \"from\"; }, { type: \"address\";...\n *\n * @example\n * type Result = ParseAbiParameters<\n * // ^? type Result: [{ type: \"tuple\"; components: [{ type: \"string\"; name:...\n * ['Baz bar', 'struct Baz { string name; }']\n * >\n */\nexport type ParseAbiParameters<\n params extends string | readonly string[] | readonly unknown[],\n> =\n | (params extends string\n ? params extends ''\n ? never\n : string extends params\n ? readonly AbiParameter[]\n : ParseAbiParameters_, { modifier: Modifier }>\n : never)\n | (params extends readonly string[]\n ? string[] extends params\n ? AbiParameter // Return generic AbiParameter item since type was no inferrable\n : ParseStructs extends infer structs\n ? {\n [key in keyof params]: params[key] extends string\n ? IsStructSignature extends true\n ? never\n : ParseAbiParameters_<\n SplitParameters,\n { modifier: Modifier; structs: structs }\n >\n : never\n } extends infer mapped extends readonly unknown[]\n ? Filter extends readonly [...infer content]\n ? content['length'] extends 0\n ? never\n : DeepFlatten\n : never\n : never\n : never\n : never)\n\n/**\n * Flatten all members of {@link T}\n *\n * @param T - List of items to flatten\n * @param Acc - The accumulator used while recursing\n * @returns The flattened array\n *\n * @example\n * type Result = DeepFlatten<[['a', 'b'], [['c']]]>\n * // ^? type Result = ['a', 'b', 'c']\n */\ntype DeepFlatten<\n T extends readonly unknown[],\n Acc extends readonly unknown[] = readonly [],\n> = T extends readonly [infer head, ...infer tail]\n ? tail extends undefined\n ? never\n : head extends readonly unknown[]\n ? DeepFlatten]>\n : DeepFlatten\n : Acc\n\n/**\n * Parses human-readable ABI parameters into {@link AbiParameter}s\n *\n * @param params - Human-readable ABI parameters\n * @returns Parsed {@link AbiParameter}s\n *\n * @example\n * const abiParameters = parseAbiParameters('address from, address to, uint256 amount')\n * // ^? const abiParameters: [{ type: \"address\"; name: \"from\"; }, { type: \"address\";...\n *\n * @example\n * const abiParameters = parseAbiParameters([\n * // ^? const abiParameters: [{ type: \"tuple\"; components: [{ type: \"string\"; name:...\n * 'Baz bar',\n * 'struct Baz { string name; }',\n * ])\n */\nexport function parseAbiParameters<\n params extends string | readonly string[] | readonly unknown[],\n>(\n params: Narrow &\n (\n | (params extends string\n ? params extends ''\n ? Error<'Empty string is not allowed.'>\n : unknown\n : never)\n | (params extends readonly string[]\n ? params extends readonly [] // empty array\n ? Error<'At least one parameter required.'>\n : string[] extends params\n ? unknown\n : unknown // TODO: Validate param string\n : never)\n ),\n): ParseAbiParameters {\n const abiParameters: AbiParameter[] = []\n if (typeof params === 'string') {\n const parameters = splitParameters(params)\n const length = parameters.length\n for (let i = 0; i < length; i++) {\n abiParameters.push(parseAbiParameter_(parameters[i]!, { modifiers }))\n }\n } else {\n const structs = parseStructs(params as readonly string[])\n const length = params.length as number\n for (let i = 0; i < length; i++) {\n const signature = (params as readonly string[])[i]!\n if (isStructSignature(signature)) continue\n const parameters = splitParameters(signature)\n const length = parameters.length\n for (let k = 0; k < length; k++) {\n abiParameters.push(\n parseAbiParameter_(parameters[k]!, { modifiers, structs }),\n )\n }\n }\n }\n\n if (abiParameters.length === 0)\n throw new InvalidAbiParametersError({ params })\n\n return abiParameters as ParseAbiParameters\n}\n","export type {\n Abi,\n AbiConstructor,\n AbiError,\n AbiEvent,\n AbiEventParameter,\n AbiFallback,\n AbiFunction,\n AbiInternalType,\n AbiItemType,\n AbiParameter,\n AbiParameterKind,\n AbiReceive,\n AbiStateMutability,\n AbiType,\n Address,\n SolidityAddress,\n SolidityArray,\n SolidityArrayWithoutTuple,\n SolidityArrayWithTuple,\n SolidityBool,\n SolidityBytes,\n SolidityFixedArrayRange,\n SolidityFixedArraySizeLookup,\n SolidityFunction,\n SolidityInt,\n SolidityString,\n SolidityTuple,\n TypedData,\n TypedDataDomain,\n TypedDataParameter,\n TypedDataType,\n} from '../abi.js'\n\n// biome-ignore lint/performance/noBarrelFile: \nexport { BaseError } from '../errors.js'\n\nexport type { Narrow } from '../narrow.js'\nexport { narrow } from '../narrow.js'\n\nexport type {\n Register,\n DefaultRegister,\n ResolvedRegister,\n} from '../register.js'\n\nexport type {\n AbiParameterToPrimitiveType,\n AbiParametersToPrimitiveTypes,\n AbiTypeToPrimitiveType,\n ExtractAbiError,\n ExtractAbiErrorNames,\n ExtractAbiErrors,\n ExtractAbiEvent,\n ExtractAbiEventNames,\n ExtractAbiEvents,\n ExtractAbiFunction,\n ExtractAbiFunctionNames,\n ExtractAbiFunctions,\n IsAbi,\n IsTypedData,\n TypedDataToPrimitiveTypes,\n} from '../utils.js'\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n// Human-Readable\n\nexport {\n formatAbi,\n type FormatAbi,\n} from '../human-readable/formatAbi.js'\n\nexport {\n formatAbiItem,\n type FormatAbiItem,\n} from '../human-readable/formatAbiItem.js'\n\nexport {\n formatAbiParameter,\n type FormatAbiParameter,\n} from '../human-readable/formatAbiParameter.js'\n\nexport {\n formatAbiParameters,\n type FormatAbiParameters,\n} from '../human-readable/formatAbiParameters.js'\n\nexport { parseAbi, type ParseAbi } from '../human-readable/parseAbi.js'\n\nexport {\n parseAbiItem,\n type ParseAbiItem,\n} from '../human-readable/parseAbiItem.js'\n\nexport {\n parseAbiParameter,\n type ParseAbiParameter,\n} from '../human-readable/parseAbiParameter.js'\n\nexport {\n parseAbiParameters,\n type ParseAbiParameters,\n} from '../human-readable/parseAbiParameters.js'\n\nexport {\n UnknownTypeError,\n InvalidAbiItemError,\n UnknownSolidityTypeError,\n} from '../human-readable/errors/abiItem.js'\n\nexport {\n InvalidAbiTypeParameterError,\n InvalidFunctionModifierError,\n InvalidModifierError,\n SolidityProtectedKeywordError,\n InvalidParameterError,\n InvalidAbiParametersError,\n InvalidAbiParameterError,\n} from '../human-readable/errors/abiParameter.js'\n\nexport {\n InvalidStructSignatureError,\n InvalidSignatureError,\n UnknownSignatureError,\n} from '../human-readable/errors/signature.js'\n\nexport { InvalidParenthesisError } from '../human-readable/errors/splitParameters.js'\n\nexport { CircularReferenceError } from '../human-readable/errors/struct.js'\n","import type { AbiParameter } from 'abitype'\n\nimport {\n InvalidDefinitionTypeError,\n type InvalidDefinitionTypeErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { AbiItem } from '../../types/contract.js'\n\nexport type FormatAbiItemErrorType =\n | FormatAbiParamsErrorType\n | InvalidDefinitionTypeErrorType\n | ErrorType\n\nexport function formatAbiItem(\n abiItem: AbiItem,\n { includeName = false }: { includeName?: boolean | undefined } = {},\n) {\n if (\n abiItem.type !== 'function' &&\n abiItem.type !== 'event' &&\n abiItem.type !== 'error'\n )\n throw new InvalidDefinitionTypeError(abiItem.type)\n\n return `${abiItem.name}(${formatAbiParams(abiItem.inputs, { includeName })})`\n}\n\nexport type FormatAbiParamsErrorType = ErrorType\n\nexport function formatAbiParams(\n params: readonly AbiParameter[] | undefined,\n { includeName = false }: { includeName?: boolean | undefined } = {},\n): string {\n if (!params) return ''\n return params\n .map((param) => formatAbiParam(param, { includeName }))\n .join(includeName ? ', ' : ',')\n}\n\nexport type FormatAbiParamErrorType = ErrorType\n\nfunction formatAbiParam(\n param: AbiParameter,\n { includeName }: { includeName: boolean },\n): string {\n if (param.type.startsWith('tuple')) {\n return `(${formatAbiParams(\n (param as unknown as { components: AbiParameter[] }).components,\n { includeName },\n )})${param.type.slice('tuple'.length)}`\n }\n return param.type + (includeName && param.name ? ` ${param.name}` : '')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\n\nexport type IsHexErrorType = ErrorType\n\nexport function isHex(\n value: unknown,\n { strict = true }: { strict?: boolean | undefined } = {},\n): value is Hex {\n if (!value) return false\n if (typeof value !== 'string') return false\n return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nimport { type IsHexErrorType, isHex } from './isHex.js'\n\nexport type SizeErrorType = IsHexErrorType | ErrorType\n\n/**\n * @description Retrieves the size of the value (in bytes).\n *\n * @param value The value (hex or byte array) to retrieve the size of.\n * @returns The size of the value (in bytes).\n */\nexport function size(value: Hex | ByteArray) {\n if (isHex(value, { strict: false })) return Math.ceil((value.length - 2) / 2)\n return value.length\n}\n","export const version = '2.47.10'\n","import { version } from './version.js'\n\ntype ErrorConfig = {\n getDocsUrl?: ((args: BaseErrorParameters) => string | undefined) | undefined\n version?: string | undefined\n}\n\nlet errorConfig: ErrorConfig = {\n getDocsUrl: ({\n docsBaseUrl,\n docsPath = '',\n docsSlug,\n }: BaseErrorParameters) =>\n docsPath\n ? `${docsBaseUrl ?? 'https://viem.sh'}${docsPath}${\n docsSlug ? `#${docsSlug}` : ''\n }`\n : undefined,\n version: `viem@${version}`,\n}\n\nexport function setErrorConfig(config: ErrorConfig) {\n errorConfig = config\n}\n\ntype BaseErrorParameters = {\n cause?: BaseError | Error | undefined\n details?: string | undefined\n docsBaseUrl?: string | undefined\n docsPath?: string | undefined\n docsSlug?: string | undefined\n metaMessages?: string[] | undefined\n name?: string | undefined\n}\n\nexport type BaseErrorType = BaseError & { name: 'BaseError' }\nexport class BaseError extends Error {\n details: string\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n shortMessage: string\n version: string\n\n override name = 'BaseError'\n\n constructor(shortMessage: string, args: BaseErrorParameters = {}) {\n const details = (() => {\n if (args.cause instanceof BaseError) return args.cause.details\n if (args.cause?.message) return args.cause.message\n return args.details!\n })()\n const docsPath = (() => {\n if (args.cause instanceof BaseError)\n return args.cause.docsPath || args.docsPath\n return args.docsPath\n })()\n const docsUrl = errorConfig.getDocsUrl?.({ ...args, docsPath })\n\n const message = [\n shortMessage || 'An error occurred.',\n '',\n ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n ...(docsUrl ? [`Docs: ${docsUrl}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n ...(errorConfig.version ? [`Version: ${errorConfig.version}`] : []),\n ].join('\\n')\n\n super(message, args.cause ? { cause: args.cause } : undefined)\n\n this.details = details\n this.docsPath = docsPath\n this.metaMessages = args.metaMessages\n this.name = args.name ?? this.name\n this.shortMessage = shortMessage\n this.version = version\n }\n\n walk(): Error\n walk(fn: (err: unknown) => boolean): Error | null\n walk(fn?: any): any {\n return walk(this, fn)\n }\n}\n\nfunction walk(\n err: unknown,\n fn?: ((err: unknown) => boolean) | undefined,\n): unknown {\n if (fn?.(err)) return err\n if (\n err &&\n typeof err === 'object' &&\n 'cause' in err &&\n err.cause !== undefined\n )\n return walk(err.cause, fn)\n return fn ? null : err\n}\n","import type { Abi, AbiEvent, AbiParameter } from 'abitype'\n\nimport type { Hex } from '../types/misc.js'\nimport { formatAbiItem, formatAbiParams } from '../utils/abi/formatAbiItem.js'\nimport { size } from '../utils/data/size.js'\n\nimport { BaseError } from './base.js'\n\nexport type AbiConstructorNotFoundErrorType = AbiConstructorNotFoundError & {\n name: 'AbiConstructorNotFoundError'\n}\nexport class AbiConstructorNotFoundError extends BaseError {\n constructor({ docsPath }: { docsPath: string }) {\n super(\n [\n 'A constructor was not found on the ABI.',\n 'Make sure you are using the correct ABI and that the constructor exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiConstructorNotFoundError',\n },\n )\n }\n}\n\nexport type AbiConstructorParamsNotFoundErrorType =\n AbiConstructorParamsNotFoundError & {\n name: 'AbiConstructorParamsNotFoundError'\n }\n\nexport class AbiConstructorParamsNotFoundError extends BaseError {\n constructor({ docsPath }: { docsPath: string }) {\n super(\n [\n 'Constructor arguments were provided (`args`), but a constructor parameters (`inputs`) were not found on the ABI.',\n 'Make sure you are using the correct ABI, and that the `inputs` attribute on the constructor exists.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiConstructorParamsNotFoundError',\n },\n )\n }\n}\n\nexport type AbiDecodingDataSizeInvalidErrorType =\n AbiDecodingDataSizeInvalidError & {\n name: 'AbiDecodingDataSizeInvalidError'\n }\nexport class AbiDecodingDataSizeInvalidError extends BaseError {\n constructor({ data, size }: { data: Hex; size: number }) {\n super(\n [\n `Data size of ${size} bytes is invalid.`,\n 'Size must be in increments of 32 bytes (size % 32 === 0).',\n ].join('\\n'),\n {\n metaMessages: [`Data: ${data} (${size} bytes)`],\n name: 'AbiDecodingDataSizeInvalidError',\n },\n )\n }\n}\n\nexport type AbiDecodingDataSizeTooSmallErrorType =\n AbiDecodingDataSizeTooSmallError & {\n name: 'AbiDecodingDataSizeTooSmallError'\n }\nexport class AbiDecodingDataSizeTooSmallError extends BaseError {\n data: Hex\n params: readonly AbiParameter[]\n size: number\n\n constructor({\n data,\n params,\n size,\n }: { data: Hex; params: readonly AbiParameter[]; size: number }) {\n super(\n [`Data size of ${size} bytes is too small for given parameters.`].join(\n '\\n',\n ),\n {\n metaMessages: [\n `Params: (${formatAbiParams(params, { includeName: true })})`,\n `Data: ${data} (${size} bytes)`,\n ],\n name: 'AbiDecodingDataSizeTooSmallError',\n },\n )\n\n this.data = data\n this.params = params\n this.size = size\n }\n}\n\nexport type AbiDecodingZeroDataErrorType = AbiDecodingZeroDataError & {\n name: 'AbiDecodingZeroDataError'\n}\nexport class AbiDecodingZeroDataError extends BaseError {\n constructor({ cause }: { cause?: BaseError | Error | undefined } = {}) {\n super('Cannot decode zero data (\"0x\") with ABI parameters.', {\n name: 'AbiDecodingZeroDataError',\n cause,\n })\n }\n}\n\nexport type AbiEncodingArrayLengthMismatchErrorType =\n AbiEncodingArrayLengthMismatchError & {\n name: 'AbiEncodingArrayLengthMismatchError'\n }\nexport class AbiEncodingArrayLengthMismatchError extends BaseError {\n constructor({\n expectedLength,\n givenLength,\n type,\n }: { expectedLength: number; givenLength: number; type: string }) {\n super(\n [\n `ABI encoding array length mismatch for type ${type}.`,\n `Expected length: ${expectedLength}`,\n `Given length: ${givenLength}`,\n ].join('\\n'),\n { name: 'AbiEncodingArrayLengthMismatchError' },\n )\n }\n}\n\nexport type AbiEncodingBytesSizeMismatchErrorType =\n AbiEncodingBytesSizeMismatchError & {\n name: 'AbiEncodingBytesSizeMismatchError'\n }\nexport class AbiEncodingBytesSizeMismatchError extends BaseError {\n constructor({ expectedSize, value }: { expectedSize: number; value: Hex }) {\n super(\n `Size of bytes \"${value}\" (bytes${size(\n value,\n )}) does not match expected size (bytes${expectedSize}).`,\n { name: 'AbiEncodingBytesSizeMismatchError' },\n )\n }\n}\n\nexport type AbiEncodingLengthMismatchErrorType =\n AbiEncodingLengthMismatchError & {\n name: 'AbiEncodingLengthMismatchError'\n }\nexport class AbiEncodingLengthMismatchError extends BaseError {\n constructor({\n expectedLength,\n givenLength,\n }: { expectedLength: number; givenLength: number }) {\n super(\n [\n 'ABI encoding params/values length mismatch.',\n `Expected length (params): ${expectedLength}`,\n `Given length (values): ${givenLength}`,\n ].join('\\n'),\n { name: 'AbiEncodingLengthMismatchError' },\n )\n }\n}\n\nexport type AbiErrorInputsNotFoundErrorType = AbiErrorInputsNotFoundError & {\n name: 'AbiErrorInputsNotFoundError'\n}\nexport class AbiErrorInputsNotFoundError extends BaseError {\n constructor(errorName: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Arguments (\\`args\\`) were provided to \"${errorName}\", but \"${errorName}\" on the ABI does not contain any parameters (\\`inputs\\`).`,\n 'Cannot encode error result without knowing what the parameter types are.',\n 'Make sure you are using the correct ABI and that the inputs exist on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiErrorInputsNotFoundError',\n },\n )\n }\n}\n\nexport type AbiErrorNotFoundErrorType = AbiErrorNotFoundError & {\n name: 'AbiErrorNotFoundError'\n}\nexport class AbiErrorNotFoundError extends BaseError {\n constructor(\n errorName?: string | undefined,\n { docsPath }: { docsPath?: string | undefined } = {},\n ) {\n super(\n [\n `Error ${errorName ? `\"${errorName}\" ` : ''}not found on ABI.`,\n 'Make sure you are using the correct ABI and that the error exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiErrorNotFoundError',\n },\n )\n }\n}\n\nexport type AbiErrorSignatureNotFoundErrorType =\n AbiErrorSignatureNotFoundError & {\n name: 'AbiErrorSignatureNotFoundError'\n }\nexport class AbiErrorSignatureNotFoundError extends BaseError {\n signature: Hex\n\n constructor(\n signature: Hex,\n {\n docsPath,\n cause,\n }: { docsPath: string; cause?: BaseError | Error | undefined },\n ) {\n super(\n [\n `Encoded error signature \"${signature}\" not found on ABI.`,\n 'Make sure you are using the correct ABI and that the error exists on it.',\n `You can look up the decoded signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiErrorSignatureNotFoundError',\n cause,\n },\n )\n this.signature = signature\n }\n}\n\nexport type AbiEventSignatureEmptyTopicsErrorType =\n AbiEventSignatureEmptyTopicsError & {\n name: 'AbiEventSignatureEmptyTopicsError'\n }\nexport class AbiEventSignatureEmptyTopicsError extends BaseError {\n constructor({ docsPath }: { docsPath: string }) {\n super('Cannot extract event signature from empty topics.', {\n docsPath,\n name: 'AbiEventSignatureEmptyTopicsError',\n })\n }\n}\n\nexport type AbiEventSignatureNotFoundErrorType =\n AbiEventSignatureNotFoundError & {\n name: 'AbiEventSignatureNotFoundError'\n }\nexport class AbiEventSignatureNotFoundError extends BaseError {\n constructor(signature: Hex, { docsPath }: { docsPath: string }) {\n super(\n [\n `Encoded event signature \"${signature}\" not found on ABI.`,\n 'Make sure you are using the correct ABI and that the event exists on it.',\n `You can look up the signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiEventSignatureNotFoundError',\n },\n )\n }\n}\n\nexport type AbiEventNotFoundErrorType = AbiEventNotFoundError & {\n name: 'AbiEventNotFoundError'\n}\nexport class AbiEventNotFoundError extends BaseError {\n constructor(\n eventName?: string | undefined,\n { docsPath }: { docsPath?: string | undefined } = {},\n ) {\n super(\n [\n `Event ${eventName ? `\"${eventName}\" ` : ''}not found on ABI.`,\n 'Make sure you are using the correct ABI and that the event exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiEventNotFoundError',\n },\n )\n }\n}\n\nexport type AbiFunctionNotFoundErrorType = AbiFunctionNotFoundError & {\n name: 'AbiFunctionNotFoundError'\n}\nexport class AbiFunctionNotFoundError extends BaseError {\n constructor(\n functionName?: string | undefined,\n { docsPath }: { docsPath?: string | undefined } = {},\n ) {\n super(\n [\n `Function ${functionName ? `\"${functionName}\" ` : ''}not found on ABI.`,\n 'Make sure you are using the correct ABI and that the function exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiFunctionNotFoundError',\n },\n )\n }\n}\n\nexport type AbiFunctionOutputsNotFoundErrorType =\n AbiFunctionOutputsNotFoundError & {\n name: 'AbiFunctionOutputsNotFoundError'\n }\nexport class AbiFunctionOutputsNotFoundError extends BaseError {\n constructor(functionName: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Function \"${functionName}\" does not contain any \\`outputs\\` on ABI.`,\n 'Cannot decode function result without knowing what the parameter types are.',\n 'Make sure you are using the correct ABI and that the function exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiFunctionOutputsNotFoundError',\n },\n )\n }\n}\n\nexport type AbiFunctionSignatureNotFoundErrorType =\n AbiFunctionSignatureNotFoundError & {\n name: 'AbiFunctionSignatureNotFoundError'\n }\nexport class AbiFunctionSignatureNotFoundError extends BaseError {\n constructor(signature: Hex, { docsPath }: { docsPath: string }) {\n super(\n [\n `Encoded function signature \"${signature}\" not found on ABI.`,\n 'Make sure you are using the correct ABI and that the function exists on it.',\n `You can look up the signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiFunctionSignatureNotFoundError',\n },\n )\n }\n}\n\nexport type AbiItemAmbiguityErrorType = AbiItemAmbiguityError & {\n name: 'AbiItemAmbiguityError'\n}\nexport class AbiItemAmbiguityError extends BaseError {\n constructor(\n x: { abiItem: Abi[number]; type: string },\n y: { abiItem: Abi[number]; type: string },\n ) {\n super('Found ambiguous types in overloaded ABI items.', {\n metaMessages: [\n `\\`${x.type}\\` in \\`${formatAbiItem(x.abiItem)}\\`, and`,\n `\\`${y.type}\\` in \\`${formatAbiItem(y.abiItem)}\\``,\n '',\n 'These types encode differently and cannot be distinguished at runtime.',\n 'Remove one of the ambiguous items in the ABI.',\n ],\n name: 'AbiItemAmbiguityError',\n })\n }\n}\n\nexport type BytesSizeMismatchErrorType = BytesSizeMismatchError & {\n name: 'BytesSizeMismatchError'\n}\nexport class BytesSizeMismatchError extends BaseError {\n constructor({\n expectedSize,\n givenSize,\n }: { expectedSize: number; givenSize: number }) {\n super(`Expected bytes${expectedSize}, got bytes${givenSize}.`, {\n name: 'BytesSizeMismatchError',\n })\n }\n}\n\nexport type DecodeLogDataMismatchErrorType = DecodeLogDataMismatch & {\n name: 'DecodeLogDataMismatch'\n}\nexport class DecodeLogDataMismatch extends BaseError {\n abiItem: AbiEvent\n data: Hex\n params: readonly AbiParameter[]\n size: number\n\n constructor({\n abiItem,\n data,\n params,\n size,\n }: {\n abiItem: AbiEvent\n data: Hex\n params: readonly AbiParameter[]\n size: number\n }) {\n super(\n [\n `Data size of ${size} bytes is too small for non-indexed event parameters.`,\n ].join('\\n'),\n {\n metaMessages: [\n `Params: (${formatAbiParams(params, { includeName: true })})`,\n `Data: ${data} (${size} bytes)`,\n ],\n name: 'DecodeLogDataMismatch',\n },\n )\n\n this.abiItem = abiItem\n this.data = data\n this.params = params\n this.size = size\n }\n}\n\nexport type DecodeLogTopicsMismatchErrorType = DecodeLogTopicsMismatch & {\n name: 'DecodeLogTopicsMismatch'\n}\nexport class DecodeLogTopicsMismatch extends BaseError {\n abiItem: AbiEvent\n\n constructor({\n abiItem,\n param,\n }: {\n abiItem: AbiEvent\n param: AbiParameter & { indexed: boolean }\n }) {\n super(\n [\n `Expected a topic for indexed event parameter${\n param.name ? ` \"${param.name}\"` : ''\n } on event \"${formatAbiItem(abiItem, { includeName: true })}\".`,\n ].join('\\n'),\n { name: 'DecodeLogTopicsMismatch' },\n )\n\n this.abiItem = abiItem\n }\n}\n\nexport type InvalidAbiEncodingTypeErrorType = InvalidAbiEncodingTypeError & {\n name: 'InvalidAbiEncodingTypeError'\n}\nexport class InvalidAbiEncodingTypeError extends BaseError {\n constructor(type: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Type \"${type}\" is not a valid encoding type.`,\n 'Please provide a valid ABI type.',\n ].join('\\n'),\n { docsPath, name: 'InvalidAbiEncodingType' },\n )\n }\n}\n\nexport type InvalidAbiDecodingTypeErrorType = InvalidAbiDecodingTypeError & {\n name: 'InvalidAbiDecodingTypeError'\n}\nexport class InvalidAbiDecodingTypeError extends BaseError {\n constructor(type: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Type \"${type}\" is not a valid decoding type.`,\n 'Please provide a valid ABI type.',\n ].join('\\n'),\n { docsPath, name: 'InvalidAbiDecodingType' },\n )\n }\n}\n\nexport type InvalidArrayErrorType = InvalidArrayError & {\n name: 'InvalidArrayError'\n}\nexport class InvalidArrayError extends BaseError {\n constructor(value: unknown) {\n super([`Value \"${value}\" is not a valid array.`].join('\\n'), {\n name: 'InvalidArrayError',\n })\n }\n}\n\nexport type InvalidDefinitionTypeErrorType = InvalidDefinitionTypeError & {\n name: 'InvalidDefinitionTypeError'\n}\nexport class InvalidDefinitionTypeError extends BaseError {\n constructor(type: string) {\n super(\n [\n `\"${type}\" is not a valid definition type.`,\n 'Valid types: \"function\", \"event\", \"error\"',\n ].join('\\n'),\n { name: 'InvalidDefinitionTypeError' },\n )\n }\n}\n\nexport type UnsupportedPackedAbiTypeErrorType = UnsupportedPackedAbiType & {\n name: 'UnsupportedPackedAbiType'\n}\nexport class UnsupportedPackedAbiType extends BaseError {\n constructor(type: unknown) {\n super(`Type \"${type}\" is not supported for packed encoding.`, {\n name: 'UnsupportedPackedAbiType',\n })\n }\n}\n","import { BaseError } from './base.js'\n\nexport type SliceOffsetOutOfBoundsErrorType = SliceOffsetOutOfBoundsError & {\n name: 'SliceOffsetOutOfBoundsError'\n}\nexport class SliceOffsetOutOfBoundsError extends BaseError {\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \"${offset}\" is out-of-bounds (size: ${size}).`,\n { name: 'SliceOffsetOutOfBoundsError' },\n )\n }\n}\n\nexport type SizeExceedsPaddingSizeErrorType = SizeExceedsPaddingSizeError & {\n name: 'SizeExceedsPaddingSizeError'\n}\nexport class SizeExceedsPaddingSizeError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (${size}) exceeds padding size (${targetSize}).`,\n { name: 'SizeExceedsPaddingSizeError' },\n )\n }\n}\n\nexport type InvalidBytesLengthErrorType = InvalidBytesLengthError & {\n name: 'InvalidBytesLengthError'\n}\nexport class InvalidBytesLengthError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} is expected to be ${targetSize} ${type} long, but is ${size} ${type} long.`,\n { name: 'InvalidBytesLengthError' },\n )\n }\n}\n","import {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n} from '../../errors/data.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\ntype PadOptions = {\n dir?: 'left' | 'right' | undefined\n size?: number | null | undefined\n}\nexport type PadReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type PadErrorType = PadHexErrorType | PadBytesErrorType | ErrorType\n\nexport function pad(\n hexOrBytes: value,\n { dir, size = 32 }: PadOptions = {},\n): PadReturnType {\n if (typeof hexOrBytes === 'string')\n return padHex(hexOrBytes, { dir, size }) as PadReturnType\n return padBytes(hexOrBytes, { dir, size }) as PadReturnType\n}\n\nexport type PadHexErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padHex(hex_: Hex, { dir, size = 32 }: PadOptions = {}) {\n if (size === null) return hex_\n const hex = hex_.replace('0x', '')\n if (hex.length > size * 2)\n throw new SizeExceedsPaddingSizeError({\n size: Math.ceil(hex.length / 2),\n targetSize: size,\n type: 'hex',\n })\n\n return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](\n size * 2,\n '0',\n )}` as Hex\n}\n\nexport type PadBytesErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padBytes(\n bytes: ByteArray,\n { dir, size = 32 }: PadOptions = {},\n) {\n if (size === null) return bytes\n if (bytes.length > size)\n throw new SizeExceedsPaddingSizeError({\n size: bytes.length,\n targetSize: size,\n type: 'bytes',\n })\n const paddedBytes = new Uint8Array(size)\n for (let i = 0; i < size; i++) {\n const padEnd = dir === 'right'\n paddedBytes[padEnd ? i : size - i - 1] =\n bytes[padEnd ? i : bytes.length - i - 1]\n }\n return paddedBytes\n}\n","import type { ByteArray, Hex } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type IntegerOutOfRangeErrorType = IntegerOutOfRangeError & {\n name: 'IntegerOutOfRangeError'\n}\nexport class IntegerOutOfRangeError extends BaseError {\n constructor({\n max,\n min,\n signed,\n size,\n value,\n }: {\n max?: string | undefined\n min: string\n signed?: boolean | undefined\n size?: number | undefined\n value: string\n }) {\n super(\n `Number \"${value}\" is not in safe ${\n size ? `${size * 8}-bit ${signed ? 'signed' : 'unsigned'} ` : ''\n }integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`,\n { name: 'IntegerOutOfRangeError' },\n )\n }\n}\n\nexport type InvalidBytesBooleanErrorType = InvalidBytesBooleanError & {\n name: 'InvalidBytesBooleanError'\n}\nexport class InvalidBytesBooleanError extends BaseError {\n constructor(bytes: ByteArray) {\n super(\n `Bytes value \"${bytes}\" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`,\n {\n name: 'InvalidBytesBooleanError',\n },\n )\n }\n}\n\nexport type InvalidHexBooleanErrorType = InvalidHexBooleanError & {\n name: 'InvalidHexBooleanError'\n}\nexport class InvalidHexBooleanError extends BaseError {\n constructor(hex: Hex) {\n super(\n `Hex value \"${hex}\" is not a valid boolean. The hex value must be \"0x0\" (false) or \"0x1\" (true).`,\n { name: 'InvalidHexBooleanError' },\n )\n }\n}\n\nexport type InvalidHexValueErrorType = InvalidHexValueError & {\n name: 'InvalidHexValueError'\n}\nexport class InvalidHexValueError extends BaseError {\n constructor(value: Hex) {\n super(\n `Hex value \"${value}\" is an odd length (${value.length}). It must be an even length.`,\n { name: 'InvalidHexValueError' },\n )\n }\n}\n\nexport type SizeOverflowErrorType = SizeOverflowError & {\n name: 'SizeOverflowError'\n}\nexport class SizeOverflowError extends BaseError {\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed ${maxSize} bytes. Given size: ${givenSize} bytes.`,\n { name: 'SizeOverflowError' },\n )\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\ntype TrimOptions = {\n dir?: 'left' | 'right' | undefined\n}\nexport type TrimReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type TrimErrorType = ErrorType\n\nexport function trim(\n hexOrBytes: value,\n { dir = 'left' }: TrimOptions = {},\n): TrimReturnType {\n let data: any =\n typeof hexOrBytes === 'string' ? hexOrBytes.replace('0x', '') : hexOrBytes\n\n let sliceLength = 0\n for (let i = 0; i < data.length - 1; i++) {\n if (data[dir === 'left' ? i : data.length - i - 1].toString() === '0')\n sliceLength++\n else break\n }\n data =\n dir === 'left'\n ? data.slice(sliceLength)\n : data.slice(0, data.length - sliceLength)\n\n if (typeof hexOrBytes === 'string') {\n if (data.length === 1 && dir === 'right') data = `${data}0`\n return `0x${\n data.length % 2 === 1 ? `0${data}` : data\n }` as TrimReturnType\n }\n return data as TrimReturnType\n}\n","import {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type SizeErrorType, size as size_ } from '../data/size.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\n\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\n\nexport type AssertSizeErrorType =\n | SizeOverflowErrorType\n | SizeErrorType\n | ErrorType\n\nexport function assertSize(\n hexOrBytes: Hex | ByteArray,\n { size }: { size: number },\n): void {\n if (size_(hexOrBytes) > size)\n throw new SizeOverflowError({\n givenSize: size_(hexOrBytes),\n maxSize: size,\n })\n}\n\nexport type FromHexParameters<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n> =\n | to\n | {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n /** Type to convert to. */\n to: to\n }\n\nexport type FromHexReturnType = to extends 'string'\n ? string\n : to extends 'bigint'\n ? bigint\n : to extends 'number'\n ? number\n : to extends 'bytes'\n ? ByteArray\n : to extends 'boolean'\n ? boolean\n : never\n\nexport type FromHexErrorType =\n | HexToNumberErrorType\n | HexToBigIntErrorType\n | HexToBoolErrorType\n | HexToStringErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Decodes a hex string into a string, number, bigint, boolean, or byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex\n * - Example: https://viem.sh/docs/utilities/fromHex#usage\n *\n * @param hex Hex string to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x1a4', 'number')\n * // 420\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c6421', 'string')\n * // 'Hello world'\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * to: 'string'\n * })\n * // 'Hello world'\n */\nexport function fromHex<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n>(hex: Hex, toOrOpts: FromHexParameters): FromHexReturnType {\n const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts\n const to = opts.to\n\n if (to === 'number') return hexToNumber(hex, opts) as FromHexReturnType\n if (to === 'bigint') return hexToBigInt(hex, opts) as FromHexReturnType\n if (to === 'string') return hexToString(hex, opts) as FromHexReturnType\n if (to === 'boolean') return hexToBool(hex, opts) as FromHexReturnType\n return hexToBytes(hex, opts) as FromHexReturnType\n}\n\nexport type HexToBigIntOpts = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBigIntErrorType = AssertSizeErrorType | ErrorType\n\n/**\n * Decodes a hex value into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobigint\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x1a4', { signed: true })\n * // 420n\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420n\n */\nexport function hexToBigInt(hex: Hex, opts: HexToBigIntOpts = {}): bigint {\n const { signed } = opts\n\n if (opts.size) assertSize(hex, { size: opts.size })\n\n const value = BigInt(hex)\n if (!signed) return value\n\n const size = (hex.length - 2) / 2\n const max = (1n << (BigInt(size) * 8n - 1n)) - 1n\n if (value <= max) return value\n\n return value - BigInt(`0x${'f'.padStart(size * 2, 'f')}`) - 1n\n}\n\nexport type HexToBoolOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBoolErrorType =\n | AssertSizeErrorType\n | InvalidHexBooleanErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobool\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x01')\n * // true\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // true\n */\nexport function hexToBool(hex_: Hex, opts: HexToBoolOpts = {}): boolean {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = trim(hex)\n }\n if (trim(hex) === '0x00') return false\n if (trim(hex) === '0x01') return true\n throw new InvalidHexBooleanError(hex)\n}\n\nexport type HexToNumberOpts = HexToBigIntOpts\n\nexport type HexToNumberErrorType =\n | HexToBigIntErrorType\n | IntegerOutOfRangeErrorType\n | ErrorType\n\n/**\n * Decodes a hex string into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextonumber\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToNumber('0x1a4')\n * // 420\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420\n */\nexport function hexToNumber(hex: Hex, opts: HexToNumberOpts = {}): number {\n const value = hexToBigInt(hex, opts)\n const number = Number(value)\n if (!Number.isSafeInteger(number))\n throw new IntegerOutOfRangeError({\n max: `${Number.MAX_SAFE_INTEGER}`,\n min: `${Number.MIN_SAFE_INTEGER}`,\n signed: opts.signed,\n size: opts.size,\n value: `${value}n`,\n })\n return number\n}\n\nexport type HexToStringOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToStringErrorType =\n | AssertSizeErrorType\n | HexToBytesErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextostring\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c6421')\n * // 'Hello world!'\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * })\n * // 'Hello world'\n */\nexport function hexToString(hex: Hex, opts: HexToStringOpts = {}): string {\n let bytes = hexToBytes(hex)\n if (opts.size) {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes, { dir: 'right' })\n }\n return new TextDecoder().decode(bytes)\n}\n","import {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\n\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) =>\n i.toString(16).padStart(2, '0'),\n)\n\nexport type ToHexParameters = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type ToHexErrorType =\n | BoolToHexErrorType\n | BytesToHexErrorType\n | NumberToHexErrorType\n | StringToHexErrorType\n | ErrorType\n\n/**\n * Encodes a string, number, bigint, or ByteArray into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex\n * - Example: https://viem.sh/docs/utilities/toHex#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world')\n * // '0x48656c6c6f20776f726c6421'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex(420)\n * // '0x1a4'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world', { size: 32 })\n * // '0x48656c6c6f20776f726c64210000000000000000000000000000000000000000'\n */\nexport function toHex(\n value: string | number | bigint | boolean | ByteArray,\n opts: ToHexParameters = {},\n): Hex {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToHex(value, opts)\n if (typeof value === 'string') {\n return stringToHex(value, opts)\n }\n if (typeof value === 'boolean') return boolToHex(value, opts)\n return bytesToHex(value, opts)\n}\n\nexport type BoolToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BoolToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a boolean into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#booltohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true)\n * // '0x1'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(false)\n * // '0x0'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true, { size: 32 })\n * // '0x0000000000000000000000000000000000000000000000000000000000000001'\n */\nexport function boolToHex(value: boolean, opts: BoolToHexOpts = {}): Hex {\n const hex: Hex = `0x${Number(value)}`\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { size: opts.size })\n }\n return hex\n}\n\nexport type BytesToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BytesToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a bytes array into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#bytestohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]), { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function bytesToHex(value: ByteArray, opts: BytesToHexOpts = {}): Hex {\n let string = ''\n for (let i = 0; i < value.length; i++) {\n string += hexes[value[i]]\n }\n const hex = `0x${string}` as const\n\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { dir: 'right', size: opts.size })\n }\n return hex\n}\n\nexport type NumberToHexOpts =\n | {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** The size (in bytes) of the output hex value. */\n size: number\n }\n | {\n signed?: undefined\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\nexport type NumberToHexErrorType =\n | IntegerOutOfRangeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a number or bigint into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#numbertohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420)\n * // '0x1a4'\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420, { size: 32 })\n * // '0x00000000000000000000000000000000000000000000000000000000000001a4'\n */\nexport function numberToHex(\n value_: number | bigint,\n opts: NumberToHexOpts = {},\n): Hex {\n const { signed, size } = opts\n\n const value = BigInt(value_)\n\n let maxValue: bigint | number | undefined\n if (size) {\n if (signed) maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n\n else maxValue = 2n ** (BigInt(size) * 8n) - 1n\n } else if (typeof value_ === 'number') {\n maxValue = BigInt(Number.MAX_SAFE_INTEGER)\n }\n\n const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0\n\n if ((maxValue && value > maxValue) || value < minValue) {\n const suffix = typeof value_ === 'bigint' ? 'n' : ''\n throw new IntegerOutOfRangeError({\n max: maxValue ? `${maxValue}${suffix}` : undefined,\n min: `${minValue}${suffix}`,\n signed,\n size,\n value: `${value_}${suffix}`,\n })\n }\n\n const hex = `0x${(\n signed && value < 0 ? (1n << BigInt(size * 8)) + BigInt(value) : value\n ).toString(16)}` as Hex\n if (size) return pad(hex, { size }) as Hex\n return hex\n}\n\nexport type StringToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type StringToHexErrorType = BytesToHexErrorType | ErrorType\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\n/**\n * Encodes a UTF-8 string into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#stringtohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function stringToHex(value_: string, opts: StringToHexOpts = {}): Hex {\n const value = encoder.encode(value_)\n return bytesToHex(value, opts)\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\nimport {\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n} from './toHex.js'\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\nexport type ToBytesParameters = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type ToBytesErrorType =\n | NumberToBytesErrorType\n | BoolToBytesErrorType\n | HexToBytesErrorType\n | StringToBytesErrorType\n | IsHexErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string, hex value, bigint, number or boolean to a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes\n * - Example: https://viem.sh/docs/utilities/toBytes#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes('Hello world')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function toBytes(\n value: string | bigint | number | boolean | Hex,\n opts: ToBytesParameters = {},\n): ByteArray {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToBytes(value, opts)\n if (typeof value === 'boolean') return boolToBytes(value, opts)\n if (isHex(value)) return hexToBytes(value, opts)\n return stringToBytes(value, opts)\n}\n\nexport type BoolToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type BoolToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a boolean into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#booltobytes\n *\n * @param value Boolean value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true)\n * // Uint8Array([1])\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true, { size: 32 })\n * // Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n */\nexport function boolToBytes(value: boolean, opts: BoolToBytesOpts = {}) {\n const bytes = new Uint8Array(1)\n bytes[0] = Number(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { size: opts.size })\n }\n return bytes\n}\n\n// We use very optimized technique to convert hex string to byte array\nconst charCodeMap = {\n zero: 48,\n nine: 57,\n A: 65,\n F: 70,\n a: 97,\n f: 102,\n} as const\n\nfunction charCodeToBase16(char: number) {\n if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n return char - charCodeMap.zero\n if (char >= charCodeMap.A && char <= charCodeMap.F)\n return char - (charCodeMap.A - 10)\n if (char >= charCodeMap.a && char <= charCodeMap.f)\n return char - (charCodeMap.a - 10)\n return undefined\n}\n\nexport type HexToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type HexToBytesErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a hex string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#hextobytes\n *\n * @param hex Hex string to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function hexToBytes(hex_: Hex, opts: HexToBytesOpts = {}): ByteArray {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = pad(hex, { dir: 'right', size: opts.size })\n }\n\n let hexString = hex.slice(2) as string\n if (hexString.length % 2) hexString = `0${hexString}`\n\n const length = hexString.length / 2\n const bytes = new Uint8Array(length)\n for (let index = 0, j = 0; index < length; index++) {\n const nibbleLeft = charCodeToBase16(hexString.charCodeAt(j++))\n const nibbleRight = charCodeToBase16(hexString.charCodeAt(j++))\n if (nibbleLeft === undefined || nibbleRight === undefined) {\n throw new BaseError(\n `Invalid byte sequence (\"${hexString[j - 2]}${\n hexString[j - 1]\n }\" in \"${hexString}\").`,\n )\n }\n bytes[index] = nibbleLeft * 16 + nibbleRight\n }\n return bytes\n}\n\nexport type NumberToBytesErrorType =\n | NumberToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Encodes a number into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#numbertobytes\n *\n * @param value Number to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function numberToBytes(\n value: bigint | number,\n opts?: NumberToHexOpts | undefined,\n) {\n const hex = numberToHex(value, opts)\n return hexToBytes(hex)\n}\n\nexport type StringToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type StringToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#stringtobytes\n *\n * @param value String to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function stringToBytes(\n value: string,\n opts: StringToBytesOpts = {},\n): ByteArray {\n const bytes = encoder.encode(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { dir: 'right', size: opts.size })\n }\n return bytes\n}\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * Internal webcrypto alias.\n * We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.\n * Falls back to Node.js built-in crypto for Node.js <=v14.\n * See utils.ts for details.\n * @module\n */\n// @ts-ignore\nimport * as nc from 'node:crypto';\nexport const crypto: any =\n nc && typeof nc === 'object' && 'webcrypto' in nc\n ? (nc.webcrypto as any)\n : nc && typeof nc === 'object' && 'randomBytes' in nc\n ? nc\n : undefined;\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\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): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be 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);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + 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/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\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 => {};\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 {\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;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\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/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\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): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\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 = {};\nexport function checkOpts(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\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> = Hash & {\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 function */\nexport type CHash = ReturnType;\n/** Hash function with output */\nexport type CHashO = ReturnType;\n/** XOF with output */\nexport type CHashXO = ReturnType;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher>(\n hashCons: () => Hash\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher, T extends Object>(\n hashCons: (opts?: T) => Hash\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer, T extends Object>(\n hashCons: (opts?: T) => HashXOF\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createHasher, createXOFer, Hash,\n swap32IfBE,\n toBytes, u32,\n type CHash, type CHashXO, type HashXOF, type Input\n} from './utils.ts';\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s: Uint32Array, rounds: number = 24): void {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n\n/** Keccak sponge function. */\nexport class Keccak extends Hash implements HashXOF {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n\n public blockLen: number;\n public suffix: number;\n public outputLen: number;\n protected enableXOF = false;\n protected rounds: number;\n\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n blockLen: number,\n suffix: number,\n outputLen: number,\n enableXOF = false,\n rounds: number = 24\n ) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone(): Keccak {\n return this._cloneInto();\n }\n protected keccak(): void {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish(): void {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array): Uint8Array {\n aoutput(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest(): Uint8Array {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n createHasher(() => new Keccak(blockLen, suffix, outputLen));\n\n/** SHA3-224 hash function. */\nexport const sha3_224: CHash = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256: CHash = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nexport const sha3_384: CHash = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nexport const sha3_512: CHash = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n\n/** keccak-224 hash function. */\nexport const keccak_224: CHash = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256: CHash = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nexport const keccak_384: CHash = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nexport const keccak_512: CHash = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n createXOFer, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n );\n\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n","import { keccak_256 } from '@noble/hashes/sha3'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type Keccak256Hash =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type Keccak256ErrorType =\n | IsHexErrorType\n | ToBytesErrorType\n | ToHexErrorType\n | ErrorType\n\nexport function keccak256(\n value: Hex | ByteArray,\n to_?: to | undefined,\n): Keccak256Hash {\n const to = to_ || 'hex'\n const bytes = keccak_256(\n isHex(value, { strict: false }) ? toBytes(value) : value,\n )\n if (to === 'bytes') return bytes as Keccak256Hash\n return toHex(bytes) as Keccak256Hash\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type Keccak256ErrorType, keccak256 } from './keccak256.js'\n\nconst hash = (value: string) => keccak256(toBytes(value))\n\nexport type HashSignatureErrorType =\n | Keccak256ErrorType\n | ToBytesErrorType\n | ErrorType\n\nexport function hashSignature(sig: string) {\n return hash(sig)\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\ntype NormalizeSignatureParameters = string\ntype NormalizeSignatureReturnType = string\nexport type NormalizeSignatureErrorType = ErrorType\n\nexport function normalizeSignature(\n signature: NormalizeSignatureParameters,\n): NormalizeSignatureReturnType {\n let active = true\n let current = ''\n let level = 0\n let result = ''\n let valid = false\n\n for (let i = 0; i < signature.length; i++) {\n const char = signature[i]\n\n // If the character is a separator, we want to reactivate.\n if (['(', ')', ','].includes(char)) active = true\n\n // If the character is a \"level\" token, we want to increment/decrement.\n if (char === '(') level++\n if (char === ')') level--\n\n // If we aren't active, we don't want to mutate the result.\n if (!active) continue\n\n // If level === 0, we are at the definition level.\n if (level === 0) {\n if (char === ' ' && ['event', 'function', ''].includes(result))\n result = ''\n else {\n result += char\n\n // If we are at the end of the definition, we must be finished.\n if (char === ')') {\n valid = true\n break\n }\n }\n\n continue\n }\n\n // Ignore spaces\n if (char === ' ') {\n // If the previous character is a separator, and the current section isn't empty, we want to deactivate.\n if (signature[i - 1] !== ',' && current !== ',' && current !== ',(') {\n current = ''\n active = false\n }\n continue\n }\n\n result += char\n current += char\n }\n\n if (!valid) throw new BaseError('Unable to normalize signature.')\n\n return result\n}\n","import { type AbiEvent, type AbiFunction, formatAbiItem } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport {\n type NormalizeSignatureErrorType,\n normalizeSignature,\n} from './normalizeSignature.js'\n\nexport type ToSignatureErrorType = NormalizeSignatureErrorType | ErrorType\n\n/**\n * Returns the signature for a given function or event definition.\n *\n * @example\n * const signature = toSignature('function ownerOf(uint256 tokenId)')\n * // 'ownerOf(uint256)'\n *\n * @example\n * const signature_3 = toSignature({\n * name: 'ownerOf',\n * type: 'function',\n * inputs: [{ name: 'tokenId', type: 'uint256' }],\n * outputs: [],\n * stateMutability: 'view',\n * })\n * // 'ownerOf(uint256)'\n */\nexport const toSignature = (def: string | AbiFunction | AbiEvent) => {\n const def_ = (() => {\n if (typeof def === 'string') return def\n return formatAbiItem(def)\n })()\n return normalizeSignature(def_)\n}\n","import type { AbiEvent, AbiFunction } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport { type HashSignatureErrorType, hashSignature } from './hashSignature.js'\nimport { type ToSignatureErrorType, toSignature } from './toSignature.js'\n\nexport type ToSignatureHashErrorType =\n | HashSignatureErrorType\n | ToSignatureErrorType\n | ErrorType\n\n/**\n * Returns the hash (of the function/event signature) for a given event or function definition.\n */\nexport function toSignatureHash(fn: string | AbiFunction | AbiEvent) {\n return hashSignature(toSignature(fn))\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport {\n type ToSignatureHashErrorType,\n toSignatureHash,\n} from './toSignatureHash.js'\n\nexport type ToEventSelectorErrorType = ToSignatureHashErrorType | ErrorType\n\n/**\n * Returns the event selector for a given event definition.\n *\n * @example\n * const selector = toEventSelector('Transfer(address indexed from, address indexed to, uint256 amount)')\n * // 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n */\nexport const toEventSelector = toSignatureHash\n","import { BaseError } from './base.js'\n\nexport type InvalidAddressErrorType = InvalidAddressError & {\n name: 'InvalidAddressError'\n}\nexport class InvalidAddressError extends BaseError {\n constructor({ address }: { address: string }) {\n super(`Address \"${address}\" is invalid.`, {\n metaMessages: [\n '- Address must be a hex value of 20 bytes (40 hex characters).',\n '- Address must match its checksum counterpart.',\n ],\n name: 'InvalidAddressError',\n })\n }\n}\n","/**\n * Map with a LRU (Least recently used) policy.\n *\n * @link https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n */\nexport class LruMap extends Map {\n maxSize: number\n\n constructor(size: number) {\n super()\n this.maxSize = size\n }\n\n override get(key: string) {\n const value = super.get(key)\n\n if (super.has(key)) {\n super.delete(key)\n super.set(key, value as value)\n }\n\n return value\n }\n\n override set(key: string, value: value) {\n if (super.has(key)) super.delete(key)\n super.set(key, value)\n if (this.maxSize && this.size > this.maxSize) {\n const firstKey = super.keys().next().value\n if (firstKey !== undefined) super.delete(firstKey)\n }\n return this\n }\n}\n","import type { Address } from 'abitype'\n\nimport { InvalidAddressError } from '../../errors/address.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n} from '../encoding/toBytes.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport { LruMap } from '../lru.js'\nimport { type IsAddressErrorType, isAddress } from './isAddress.js'\n\nconst checksumAddressCache = /*#__PURE__*/ new LruMap
(8192)\n\nexport type ChecksumAddressErrorType =\n | Keccak256ErrorType\n | StringToBytesErrorType\n | ErrorType\n\nexport function checksumAddress(\n address_: Address,\n /**\n * Warning: EIP-1191 checksum addresses are generally not backwards compatible with the\n * wider Ethereum ecosystem, meaning it will break when validated against an application/tool\n * that relies on EIP-55 checksum encoding (checksum without chainId).\n *\n * It is highly recommended to not use this feature unless you\n * know what you are doing.\n *\n * See more: https://github.com/ethereum/EIPs/issues/1121\n */\n chainId?: number | undefined,\n): Address {\n if (checksumAddressCache.has(`${address_}.${chainId}`))\n return checksumAddressCache.get(`${address_}.${chainId}`)!\n\n const hexAddress = chainId\n ? `${chainId}${address_.toLowerCase()}`\n : address_.substring(2).toLowerCase()\n const hash = keccak256(stringToBytes(hexAddress), 'bytes')\n\n const address = (\n chainId ? hexAddress.substring(`${chainId}0x`.length) : hexAddress\n ).split('')\n for (let i = 0; i < 40; i += 2) {\n if (hash[i >> 1] >> 4 >= 8 && address[i]) {\n address[i] = address[i].toUpperCase()\n }\n if ((hash[i >> 1] & 0x0f) >= 8 && address[i + 1]) {\n address[i + 1] = address[i + 1].toUpperCase()\n }\n }\n\n const result = `0x${address.join('')}` as const\n checksumAddressCache.set(`${address_}.${chainId}`, result)\n return result\n}\n\nexport type GetAddressErrorType =\n | ChecksumAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\nexport function getAddress(\n address: string,\n /**\n * Warning: EIP-1191 checksum addresses are generally not backwards compatible with the\n * wider Ethereum ecosystem, meaning it will break when validated against an application/tool\n * that relies on EIP-55 checksum encoding (checksum without chainId).\n *\n * It is highly recommended to not use this feature unless you\n * know what you are doing.\n *\n * See more: https://github.com/ethereum/EIPs/issues/1121\n */\n chainId?: number,\n): Address {\n if (!isAddress(address, { strict: false }))\n throw new InvalidAddressError({ address })\n return checksumAddress(address, chainId)\n}\n","import type { Address } from 'abitype'\nimport type { ErrorType } from '../../errors/utils.js'\nimport { LruMap } from '../lru.js'\nimport { checksumAddress } from './getAddress.js'\n\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/\n\n/** @internal */\nexport const isAddressCache = /*#__PURE__*/ new LruMap(8192)\n\nexport type IsAddressOptions = {\n /**\n * Enables strict mode. Whether or not to compare the address against its checksum.\n *\n * @default true\n */\n strict?: boolean | undefined\n}\n\nexport type IsAddressErrorType = ErrorType\n\nexport function isAddress(\n address: string,\n options?: IsAddressOptions | undefined,\n): address is Address {\n const { strict = true } = options ?? {}\n const cacheKey = `${address}.${strict}`\n\n if (isAddressCache.has(cacheKey)) return isAddressCache.get(cacheKey)!\n\n const result = (() => {\n if (!addressRegex.test(address)) return false\n if (address.toLowerCase() === address) return true\n if (strict) return checksumAddress(address as Address) === address\n return true\n })()\n isAddressCache.set(cacheKey, result)\n return result\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nexport type ConcatReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type ConcatErrorType =\n | ConcatBytesErrorType\n | ConcatHexErrorType\n | ErrorType\n\nexport function concat(\n values: readonly value[],\n): ConcatReturnType {\n if (typeof values[0] === 'string')\n return concatHex(values as readonly Hex[]) as ConcatReturnType\n return concatBytes(values as readonly ByteArray[]) as ConcatReturnType\n}\n\nexport type ConcatBytesErrorType = ErrorType\n\nexport function concatBytes(values: readonly ByteArray[]): ByteArray {\n let length = 0\n for (const arr of values) {\n length += arr.length\n }\n const result = new Uint8Array(length)\n let offset = 0\n for (const arr of values) {\n result.set(arr, offset)\n offset += arr.length\n }\n return result\n}\n\nexport type ConcatHexErrorType = ErrorType\n\nexport function concatHex(values: readonly Hex[]): Hex {\n return `0x${(values as Hex[]).reduce(\n (acc, x) => acc + x.replace('0x', ''),\n '',\n )}`\n}\n","import {\n SliceOffsetOutOfBoundsError,\n type SliceOffsetOutOfBoundsErrorType,\n} from '../../errors/data.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nimport { type IsHexErrorType, isHex } from './isHex.js'\nimport { type SizeErrorType, size } from './size.js'\n\nexport type SliceReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type SliceErrorType =\n | IsHexErrorType\n | SliceBytesErrorType\n | SliceHexErrorType\n | ErrorType\n\n/**\n * @description Returns a section of the hex or byte array given a start/end bytes offset.\n *\n * @param value The hex or byte array to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function slice(\n value: value,\n start?: number | undefined,\n end?: number | undefined,\n { strict }: { strict?: boolean | undefined } = {},\n): SliceReturnType {\n if (isHex(value, { strict: false }))\n return sliceHex(value as Hex, start, end, {\n strict,\n }) as SliceReturnType\n return sliceBytes(value as ByteArray, start, end, {\n strict,\n }) as SliceReturnType\n}\n\nexport type AssertStartOffsetErrorType =\n | SliceOffsetOutOfBoundsErrorType\n | SizeErrorType\n | ErrorType\n\nfunction assertStartOffset(value: Hex | ByteArray, start?: number | undefined) {\n if (typeof start === 'number' && start > 0 && start > size(value) - 1)\n throw new SliceOffsetOutOfBoundsError({\n offset: start,\n position: 'start',\n size: size(value),\n })\n}\n\nexport type AssertEndOffsetErrorType =\n | SliceOffsetOutOfBoundsErrorType\n | SizeErrorType\n | ErrorType\n\nfunction assertEndOffset(\n value: Hex | ByteArray,\n start?: number | undefined,\n end?: number | undefined,\n) {\n if (\n typeof start === 'number' &&\n typeof end === 'number' &&\n size(value) !== end - start\n ) {\n throw new SliceOffsetOutOfBoundsError({\n offset: end,\n position: 'end',\n size: size(value),\n })\n }\n}\n\nexport type SliceBytesErrorType =\n | AssertStartOffsetErrorType\n | AssertEndOffsetErrorType\n | ErrorType\n\n/**\n * @description Returns a section of the byte array given a start/end bytes offset.\n *\n * @param value The byte array to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function sliceBytes(\n value_: ByteArray,\n start?: number | undefined,\n end?: number | undefined,\n { strict }: { strict?: boolean | undefined } = {},\n): ByteArray {\n assertStartOffset(value_, start)\n const value = value_.slice(start, end)\n if (strict) assertEndOffset(value, start, end)\n return value\n}\n\nexport type SliceHexErrorType =\n | AssertStartOffsetErrorType\n | AssertEndOffsetErrorType\n | ErrorType\n\n/**\n * @description Returns a section of the hex value given a start/end bytes offset.\n *\n * @param value The hex value to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function sliceHex(\n value_: Hex,\n start?: number | undefined,\n end?: number | undefined,\n { strict }: { strict?: boolean | undefined } = {},\n): Hex {\n assertStartOffset(value_, start)\n const value = `0x${value_\n .replace('0x', '')\n .slice((start ?? 0) * 2, (end ?? value_.length) * 2)}` as const\n if (strict) assertEndOffset(value, start, end)\n return value\n}\n","export const arrayRegex = /^(.*)\\[([0-9]*)\\]$/\n\n// `bytes`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/\n\n// `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex =\n /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/\n","import type {\n AbiParameter,\n AbiParameterKind,\n AbiParametersToPrimitiveTypes,\n AbiParameterToPrimitiveType,\n} from 'abitype'\n\nimport {\n AbiEncodingArrayLengthMismatchError,\n type AbiEncodingArrayLengthMismatchErrorType,\n AbiEncodingBytesSizeMismatchError,\n type AbiEncodingBytesSizeMismatchErrorType,\n AbiEncodingLengthMismatchError,\n type AbiEncodingLengthMismatchErrorType,\n InvalidAbiEncodingTypeError,\n type InvalidAbiEncodingTypeErrorType,\n InvalidArrayError,\n type InvalidArrayErrorType,\n} from '../../errors/abi.js'\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport { BaseError } from '../../errors/base.js'\nimport { IntegerOutOfRangeError } from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { type ConcatErrorType, concat } from '../data/concat.js'\nimport { type PadHexErrorType, padHex } from '../data/pad.js'\nimport { type SizeErrorType, size } from '../data/size.js'\nimport { type SliceErrorType, slice } from '../data/slice.js'\nimport {\n type BoolToHexErrorType,\n boolToHex,\n type NumberToHexErrorType,\n numberToHex,\n type StringToHexErrorType,\n stringToHex,\n} from '../encoding/toHex.js'\nimport { integerRegex } from '../regex.js'\n\nexport type EncodeAbiParametersReturnType = Hex\n\nexport type EncodeAbiParametersErrorType =\n | AbiEncodingLengthMismatchErrorType\n | PrepareParamsErrorType\n | EncodeParamsErrorType\n | ErrorType\n\n/**\n * @description Encodes a list of primitive values into an ABI-encoded hex value.\n *\n * - Docs: https://viem.sh/docs/abi/encodeAbiParameters#encodeabiparameters\n *\n * Generates ABI encoded data using the [ABI specification](https://docs.soliditylang.org/en/latest/abi-spec), given a set of ABI parameters (inputs/outputs) and their corresponding values.\n *\n * @param params - a set of ABI Parameters (params), that can be in the shape of the inputs or outputs attribute of an ABI Item.\n * @param values - a set of values (values) that correspond to the given params.\n * @example\n * ```typescript\n * import { encodeAbiParameters } from 'viem'\n *\n * const encodedData = encodeAbiParameters(\n * [\n * { name: 'x', type: 'string' },\n * { name: 'y', type: 'uint' },\n * { name: 'z', type: 'bool' }\n * ],\n * ['wagmi', 420n, true]\n * )\n * ```\n *\n * You can also pass in Human Readable parameters with the parseAbiParameters utility.\n *\n * @example\n * ```typescript\n * import { encodeAbiParameters, parseAbiParameters } from 'viem'\n *\n * const encodedData = encodeAbiParameters(\n * parseAbiParameters('string x, uint y, bool z'),\n * ['wagmi', 420n, true]\n * )\n * ```\n */\nexport function encodeAbiParameters<\n const params extends readonly AbiParameter[] | readonly unknown[],\n>(\n params: params,\n values: params extends readonly AbiParameter[]\n ? AbiParametersToPrimitiveTypes\n : never,\n): EncodeAbiParametersReturnType {\n if (params.length !== values.length)\n throw new AbiEncodingLengthMismatchError({\n expectedLength: params.length as number,\n givenLength: values.length as any,\n })\n // Prepare the parameters to determine dynamic types to encode.\n const preparedParams = prepareParams({\n params: params as readonly AbiParameter[],\n values: values as any,\n })\n const data = encodeParams(preparedParams)\n if (data.length === 0) return '0x'\n return data\n}\n\n/////////////////////////////////////////////////////////////////\n\ntype PreparedParam = { dynamic: boolean; encoded: Hex }\n\ntype TupleAbiParameter = AbiParameter & { components: readonly AbiParameter[] }\ntype Tuple = AbiParameterToPrimitiveType\n\ntype PrepareParamsErrorType = PrepareParamErrorType | ErrorType\n\nfunction prepareParams({\n params,\n values,\n}: {\n params: params\n values: AbiParametersToPrimitiveTypes\n}) {\n const preparedParams: PreparedParam[] = []\n for (let i = 0; i < params.length; i++) {\n preparedParams.push(prepareParam({ param: params[i], value: values[i] }))\n }\n return preparedParams\n}\n\ntype PrepareParamErrorType =\n | EncodeAddressErrorType\n | EncodeArrayErrorType\n | EncodeBytesErrorType\n | EncodeBoolErrorType\n | EncodeNumberErrorType\n | EncodeStringErrorType\n | EncodeTupleErrorType\n | GetArrayComponentsErrorType\n | InvalidAbiEncodingTypeErrorType\n | ErrorType\n\nfunction prepareParam({\n param,\n value,\n}: {\n param: param\n value: AbiParameterToPrimitiveType\n}): PreparedParam {\n const arrayComponents = getArrayComponents(param.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return encodeArray(value, { length, param: { ...param, type } })\n }\n if (param.type === 'tuple') {\n return encodeTuple(value as unknown as Tuple, {\n param: param as TupleAbiParameter,\n })\n }\n if (param.type === 'address') {\n return encodeAddress(value as unknown as Hex)\n }\n if (param.type === 'bool') {\n return encodeBool(value as unknown as boolean)\n }\n if (param.type.startsWith('uint') || param.type.startsWith('int')) {\n const signed = param.type.startsWith('int')\n const [, , size = '256'] = integerRegex.exec(param.type) ?? []\n return encodeNumber(value as unknown as number, {\n signed,\n size: Number(size),\n })\n }\n if (param.type.startsWith('bytes')) {\n return encodeBytes(value as unknown as Hex, { param })\n }\n if (param.type === 'string') {\n return encodeString(value as unknown as string)\n }\n throw new InvalidAbiEncodingTypeError(param.type, {\n docsPath: '/docs/contract/encodeAbiParameters',\n })\n}\n\n/////////////////////////////////////////////////////////////////\n\ntype EncodeParamsErrorType = NumberToHexErrorType | SizeErrorType | ErrorType\n\nfunction encodeParams(preparedParams: PreparedParam[]): Hex {\n // 1. Compute the size of the static part of the parameters.\n let staticSize = 0\n for (let i = 0; i < preparedParams.length; i++) {\n const { dynamic, encoded } = preparedParams[i]\n if (dynamic) staticSize += 32\n else staticSize += size(encoded)\n }\n\n // 2. Split the parameters into static and dynamic parts.\n const staticParams: Hex[] = []\n const dynamicParams: Hex[] = []\n let dynamicSize = 0\n for (let i = 0; i < preparedParams.length; i++) {\n const { dynamic, encoded } = preparedParams[i]\n if (dynamic) {\n staticParams.push(numberToHex(staticSize + dynamicSize, { size: 32 }))\n dynamicParams.push(encoded)\n dynamicSize += size(encoded)\n } else {\n staticParams.push(encoded)\n }\n }\n\n // 3. Concatenate static and dynamic parts.\n return concat([...staticParams, ...dynamicParams])\n}\n\n/////////////////////////////////////////////////////////////////\n\ntype EncodeAddressErrorType =\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\nfunction encodeAddress(value: Hex): PreparedParam {\n if (!isAddress(value)) throw new InvalidAddressError({ address: value })\n return { dynamic: false, encoded: padHex(value.toLowerCase() as Hex) }\n}\n\ntype EncodeArrayErrorType =\n | AbiEncodingArrayLengthMismatchErrorType\n | ConcatErrorType\n | EncodeParamsErrorType\n | InvalidArrayErrorType\n | NumberToHexErrorType\n // TODO: Add back once circular type reference is resolved\n // | PrepareParamErrorType\n | ErrorType\n\nfunction encodeArray(\n value: AbiParameterToPrimitiveType,\n {\n length,\n param,\n }: {\n length: number | null\n param: param\n },\n): PreparedParam {\n const dynamic = length === null\n\n if (!Array.isArray(value)) throw new InvalidArrayError(value)\n if (!dynamic && value.length !== length)\n throw new AbiEncodingArrayLengthMismatchError({\n expectedLength: length!,\n givenLength: value.length,\n type: `${param.type}[${length}]`,\n })\n\n let dynamicChild = false\n const preparedParams: PreparedParam[] = []\n for (let i = 0; i < value.length; i++) {\n const preparedParam = prepareParam({ param, value: value[i] })\n if (preparedParam.dynamic) dynamicChild = true\n preparedParams.push(preparedParam)\n }\n\n if (dynamic || dynamicChild) {\n const data = encodeParams(preparedParams)\n if (dynamic) {\n const length = numberToHex(preparedParams.length, { size: 32 })\n return {\n dynamic: true,\n encoded: preparedParams.length > 0 ? concat([length, data]) : length,\n }\n }\n if (dynamicChild) return { dynamic: true, encoded: data }\n }\n return {\n dynamic: false,\n encoded: concat(preparedParams.map(({ encoded }) => encoded)),\n }\n}\n\ntype EncodeBytesErrorType =\n | AbiEncodingBytesSizeMismatchErrorType\n | ConcatErrorType\n | PadHexErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nfunction encodeBytes(\n value: Hex,\n { param }: { param: param },\n): PreparedParam {\n const [, paramSize] = param.type.split('bytes')\n const bytesSize = size(value)\n if (!paramSize) {\n let value_ = value\n // If the size is not divisible by 32 bytes, pad the end\n // with empty bytes to the ceiling 32 bytes.\n if (bytesSize % 32 !== 0)\n value_ = padHex(value_, {\n dir: 'right',\n size: Math.ceil((value.length - 2) / 2 / 32) * 32,\n })\n return {\n dynamic: true,\n encoded: concat([padHex(numberToHex(bytesSize, { size: 32 })), value_]),\n }\n }\n if (bytesSize !== Number.parseInt(paramSize, 10))\n throw new AbiEncodingBytesSizeMismatchError({\n expectedSize: Number.parseInt(paramSize, 10),\n value,\n })\n return { dynamic: false, encoded: padHex(value, { dir: 'right' }) }\n}\n\ntype EncodeBoolErrorType = PadHexErrorType | BoolToHexErrorType | ErrorType\n\nfunction encodeBool(value: boolean): PreparedParam {\n if (typeof value !== 'boolean')\n throw new BaseError(\n `Invalid boolean value: \"${value}\" (type: ${typeof value}). Expected: \\`true\\` or \\`false\\`.`,\n )\n return { dynamic: false, encoded: padHex(boolToHex(value)) }\n}\n\ntype EncodeNumberErrorType = NumberToHexErrorType | ErrorType\n\nfunction encodeNumber(\n value: number,\n { signed, size = 256 }: { signed: boolean; size?: number | undefined },\n): PreparedParam {\n if (typeof size === 'number') {\n const max = 2n ** (BigInt(size) - (signed ? 1n : 0n)) - 1n\n const min = signed ? -max - 1n : 0n\n if (value > max || value < min)\n throw new IntegerOutOfRangeError({\n max: max.toString(),\n min: min.toString(),\n signed,\n size: size / 8,\n value: value.toString(),\n })\n }\n return {\n dynamic: false,\n encoded: numberToHex(value, {\n size: 32,\n signed,\n }),\n }\n}\n\ntype EncodeStringErrorType =\n | ConcatErrorType\n | NumberToHexErrorType\n | PadHexErrorType\n | SizeErrorType\n | SliceErrorType\n | StringToHexErrorType\n | ErrorType\n\nfunction encodeString(value: string): PreparedParam {\n const hexValue = stringToHex(value)\n const partsLength = Math.ceil(size(hexValue) / 32)\n const parts: Hex[] = []\n for (let i = 0; i < partsLength; i++) {\n parts.push(\n padHex(slice(hexValue, i * 32, (i + 1) * 32), {\n dir: 'right',\n }),\n )\n }\n return {\n dynamic: true,\n encoded: concat([\n padHex(numberToHex(size(hexValue), { size: 32 })),\n ...parts,\n ]),\n }\n}\n\ntype EncodeTupleErrorType =\n | ConcatErrorType\n | EncodeParamsErrorType\n // TODO: Add back once circular type reference is resolved\n // | PrepareParamErrorType\n | ErrorType\n\nfunction encodeTuple<\n const param extends AbiParameter & { components: readonly AbiParameter[] },\n>(\n value: AbiParameterToPrimitiveType,\n { param }: { param: param },\n): PreparedParam {\n let dynamic = false\n const preparedParams: PreparedParam[] = []\n for (let i = 0; i < param.components.length; i++) {\n const param_ = param.components[i]\n const index = Array.isArray(value) ? i : param_.name\n const preparedParam = prepareParam({\n param: param_,\n value: (value as any)[index!] as readonly unknown[],\n })\n preparedParams.push(preparedParam)\n if (preparedParam.dynamic) dynamic = true\n }\n return {\n dynamic,\n encoded: dynamic\n ? encodeParams(preparedParams)\n : concat(preparedParams.map(({ encoded }) => encoded)),\n }\n}\n\ntype GetArrayComponentsErrorType = ErrorType\n\nexport function getArrayComponents(\n type: string,\n): [length: number | null, innerType: string] | undefined {\n const matches = type.match(/^(.*)\\[(\\d+)?\\]$/)\n return matches\n ? // Return `null` if the array is dynamic.\n [matches[2] ? Number(matches[2]) : null, matches[1]]\n : undefined\n}\n","import type { AbiFunction } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport { type SliceErrorType, slice } from '../data/slice.js'\nimport {\n type ToSignatureHashErrorType,\n toSignatureHash,\n} from './toSignatureHash.js'\n\nexport type ToFunctionSelectorErrorType =\n | ToSignatureHashErrorType\n | SliceErrorType\n | ErrorType\n\n/**\n * Returns the function selector for a given function definition.\n *\n * @example\n * const selector = toFunctionSelector('function ownerOf(uint256 tokenId)')\n * // 0x6352211e\n */\nexport const toFunctionSelector = (fn: string | AbiFunction) =>\n slice(toSignatureHash(fn), 0, 4)\n","import type { Abi, AbiParameter, Address } from 'abitype'\n\nimport {\n AbiItemAmbiguityError,\n type AbiItemAmbiguityErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n AbiItem,\n AbiItemArgs,\n AbiItemName,\n ExtractAbiItemForArgs,\n Widen,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { UnionEvaluate } from '../../types/utils.js'\nimport { type IsHexErrorType, isHex } from '../../utils/data/isHex.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { toEventSelector } from '../hash/toEventSelector.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\n\nexport type GetAbiItemParameters<\n abi extends Abi | readonly unknown[] = Abi,\n name extends AbiItemName = AbiItemName,\n args extends AbiItemArgs | undefined = AbiItemArgs,\n ///\n allArgs = AbiItemArgs,\n allNames = AbiItemName,\n> = {\n abi: abi\n name:\n | allNames // show all options\n | (name extends allNames ? name : never) // infer value\n | Hex // function selector\n} & UnionEvaluate<\n readonly [] extends allArgs\n ? {\n args?:\n | allArgs // show all options\n // infer value, widen inferred value of `args` conditionally to match `allArgs`\n | (abi extends Abi\n ? args extends allArgs\n ? Widen\n : never\n : never)\n | undefined\n }\n : {\n args?:\n | allArgs // show all options\n | (Widen & (args extends allArgs ? unknown : never)) // infer value, widen inferred value of `args` match `allArgs` (e.g. avoid union `args: readonly [123n] | readonly [bigint]`)\n | undefined\n }\n>\n\nexport type GetAbiItemErrorType =\n | IsArgOfTypeErrorType\n | IsHexErrorType\n | ToFunctionSelectorErrorType\n | AbiItemAmbiguityErrorType\n | ErrorType\n\nexport type GetAbiItemReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n name extends AbiItemName = AbiItemName,\n args extends AbiItemArgs | undefined = AbiItemArgs,\n> = abi extends Abi\n ? Abi extends abi\n ? AbiItem | undefined\n : ExtractAbiItemForArgs<\n abi,\n name,\n args extends AbiItemArgs ? args : AbiItemArgs\n >\n : AbiItem | undefined\n\nexport function getAbiItem<\n const abi extends Abi | readonly unknown[],\n name extends AbiItemName,\n const args extends AbiItemArgs | undefined = undefined,\n>(\n parameters: GetAbiItemParameters,\n): GetAbiItemReturnType {\n const { abi, args = [], name } = parameters as unknown as GetAbiItemParameters\n\n const isSelector = isHex(name, { strict: false })\n const abiItems = (abi as Abi).filter((abiItem) => {\n if (isSelector) {\n if (abiItem.type === 'function')\n return toFunctionSelector(abiItem) === name\n if (abiItem.type === 'event') return toEventSelector(abiItem) === name\n return false\n }\n return 'name' in abiItem && abiItem.name === name\n })\n\n if (abiItems.length === 0)\n return undefined as GetAbiItemReturnType\n if (abiItems.length === 1)\n return abiItems[0] as GetAbiItemReturnType\n\n let matchedAbiItem: AbiItem | undefined\n for (const abiItem of abiItems) {\n if (!('inputs' in abiItem)) continue\n if (!args || args.length === 0) {\n if (!abiItem.inputs || abiItem.inputs.length === 0)\n return abiItem as GetAbiItemReturnType\n continue\n }\n if (!abiItem.inputs) continue\n if (abiItem.inputs.length === 0) continue\n if (abiItem.inputs.length !== args.length) continue\n const matched = args.every((arg, index) => {\n const abiParameter = 'inputs' in abiItem && abiItem.inputs![index]\n if (!abiParameter) return false\n return isArgOfType(arg, abiParameter)\n })\n if (matched) {\n // Check for ambiguity against already matched parameters (e.g. `address` vs `bytes20`).\n if (\n matchedAbiItem &&\n 'inputs' in matchedAbiItem &&\n matchedAbiItem.inputs\n ) {\n const ambiguousTypes = getAmbiguousTypes(\n abiItem.inputs,\n matchedAbiItem.inputs,\n args as readonly unknown[],\n )\n if (ambiguousTypes)\n throw new AbiItemAmbiguityError(\n {\n abiItem,\n type: ambiguousTypes[0],\n },\n {\n abiItem: matchedAbiItem,\n type: ambiguousTypes[1],\n },\n )\n }\n\n matchedAbiItem = abiItem\n }\n }\n\n if (matchedAbiItem)\n return matchedAbiItem as GetAbiItemReturnType\n return abiItems[0] as GetAbiItemReturnType\n}\n\ntype IsArgOfTypeErrorType = IsAddressErrorType | ErrorType\n\n/** @internal */\nexport function isArgOfType(arg: unknown, abiParameter: AbiParameter): boolean {\n const argType = typeof arg\n const abiParameterType = abiParameter.type\n switch (abiParameterType) {\n case 'address':\n return isAddress(arg as Address, { strict: false })\n case 'bool':\n return argType === 'boolean'\n case 'function':\n return argType === 'string'\n case 'string':\n return argType === 'string'\n default: {\n if (abiParameterType === 'tuple' && 'components' in abiParameter)\n return Object.values(abiParameter.components).every(\n (component, index) => {\n return (\n argType === 'object' &&\n isArgOfType(\n Object.values(arg as unknown[] | Record)[\n index\n ],\n component as AbiParameter,\n )\n )\n },\n )\n\n // `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n // https://regexr.com/6v8hp\n if (\n /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(\n abiParameterType,\n )\n )\n return argType === 'number' || argType === 'bigint'\n\n // `bytes`: binary type of `M` bytes, `0 < M <= 32`\n // https://regexr.com/6va55\n if (/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(abiParameterType))\n return argType === 'string' || arg instanceof Uint8Array\n\n // fixed-length (`[M]`) and dynamic (`[]`) arrays\n // https://regexr.com/6va6i\n if (/[a-z]+[1-9]{0,3}(\\[[0-9]{0,}\\])+$/.test(abiParameterType)) {\n return (\n Array.isArray(arg) &&\n arg.every((x: unknown) =>\n isArgOfType(x, {\n ...abiParameter,\n // Pop off `[]` or `[M]` from end of type\n type: abiParameterType.replace(/(\\[[0-9]{0,}\\])$/, ''),\n } as AbiParameter),\n )\n )\n }\n\n return false\n }\n }\n}\n\n/** @internal */\nexport function getAmbiguousTypes(\n sourceParameters: readonly AbiParameter[],\n targetParameters: readonly AbiParameter[],\n args: AbiItemArgs,\n): AbiParameter['type'][] | undefined {\n for (const parameterIndex in sourceParameters) {\n const sourceParameter = sourceParameters[parameterIndex]\n const targetParameter = targetParameters[parameterIndex]\n\n if (\n sourceParameter.type === 'tuple' &&\n targetParameter.type === 'tuple' &&\n 'components' in sourceParameter &&\n 'components' in targetParameter\n )\n return getAmbiguousTypes(\n sourceParameter.components,\n targetParameter.components,\n (args as any)[parameterIndex],\n )\n\n const types = [sourceParameter.type, targetParameter.type]\n\n const ambiguous = (() => {\n if (types.includes('address') && types.includes('bytes20')) return true\n if (types.includes('address') && types.includes('string'))\n return isAddress(args[parameterIndex] as Address, { strict: false })\n if (types.includes('address') && types.includes('bytes'))\n return isAddress(args[parameterIndex] as Address, { strict: false })\n return false\n })()\n\n if (ambiguous) return types\n }\n\n return\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../types.js'\n\nexport type ParseAccountErrorType = ErrorType\n\nexport function parseAccount(\n account: accountOrAddress,\n): accountOrAddress extends Address ? Account : accountOrAddress {\n if (typeof account === 'string')\n return { address: account, type: 'json-rpc' } as any\n return account as any\n}\n","import type {\n Abi,\n AbiStateMutability,\n ExtractAbiFunction,\n ExtractAbiFunctions,\n} from 'abitype'\n\nimport {\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport type { ConcatHexErrorType } from '../data/concat.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeFunctionData'\n\nexport type PrepareEncodeFunctionDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | Hex | undefined }\n : { functionName: functionName | allFunctionNames | Hex }\n : { functionName?: functionName | allFunctionNames | Hex | undefined }\n> &\n UnionEvaluate<{ args?: allArgs | undefined }> &\n (hasFunctions extends true ? unknown : never)\n\nexport type PrepareEncodeFunctionDataReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n> = {\n abi: abi extends Abi\n ? functionName extends ContractFunctionName\n ? [ExtractAbiFunction]\n : abi\n : Abi\n functionName: Hex\n}\n\nexport type PrepareEncodeFunctionDataErrorType =\n | AbiFunctionNotFoundErrorType\n | ConcatHexErrorType\n | FormatAbiItemErrorType\n | GetAbiItemErrorType\n | ToFunctionSelectorErrorType\n | ErrorType\n\nexport function prepareEncodeFunctionData<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n>(\n parameters: PrepareEncodeFunctionDataParameters,\n): PrepareEncodeFunctionDataReturnType {\n const { abi, args, functionName } =\n parameters as PrepareEncodeFunctionDataParameters\n\n let abiItem = abi[0]\n if (functionName) {\n const item = getAbiItem({\n abi,\n args,\n name: functionName,\n })\n if (!item) throw new AbiFunctionNotFoundError(functionName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'function')\n throw new AbiFunctionNotFoundError(undefined, { docsPath })\n\n return {\n abi: [abiItem],\n functionName: toFunctionSelector(formatAbiItem(abiItem)),\n } as unknown as PrepareEncodeFunctionDataReturnType\n}\n","import type { Abi, AbiStateMutability, ExtractAbiFunctions } from 'abitype'\n\nimport type { AbiFunctionNotFoundErrorType } from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport type { ToFunctionSelectorErrorType } from '../hash/toFunctionSelector.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport type { FormatAbiItemErrorType } from './formatAbiItem.js'\nimport type { GetAbiItemErrorType } from './getAbiItem.js'\nimport { prepareEncodeFunctionData } from './prepareEncodeFunctionData.js'\n\nexport type EncodeFunctionDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | Hex\n | undefined = ContractFunctionName,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | Hex | undefined }\n : { functionName: functionName | allFunctionNames | Hex }\n : { functionName?: functionName | allFunctionNames | Hex | undefined }\n> &\n UnionEvaluate<\n readonly [] extends allArgs\n ? { args?: allArgs | undefined }\n : { args: allArgs }\n > &\n (hasFunctions extends true ? unknown : never)\n\nexport type EncodeFunctionDataReturnType = Hex\n\nexport type EncodeFunctionDataErrorType =\n | AbiFunctionNotFoundErrorType\n | ConcatHexErrorType\n | EncodeAbiParametersErrorType\n | FormatAbiItemErrorType\n | GetAbiItemErrorType\n | ToFunctionSelectorErrorType\n | ErrorType\n\nexport function encodeFunctionData<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n>(\n parameters: EncodeFunctionDataParameters,\n): EncodeFunctionDataReturnType {\n const { args } = parameters as EncodeFunctionDataParameters\n\n const { abi, functionName } = (() => {\n if (\n parameters.abi.length === 1 &&\n parameters.functionName?.startsWith('0x')\n )\n return parameters as { abi: Abi; functionName: Hex }\n return prepareEncodeFunctionData(parameters)\n })()\n\n const abiItem = abi[0]\n const signature = functionName\n\n const data =\n 'inputs' in abiItem && abiItem.inputs\n ? encodeAbiParameters(abiItem.inputs, args ?? [])\n : undefined\n return concatHex([signature, data ?? '0x'])\n}\n","import type { AbiError } from 'abitype'\n\n// https://docs.soliditylang.org/en/v0.8.16/control-structures.html#panic-via-assert-and-error-via-require\nexport const panicReasons = {\n 1: 'An `assert` condition failed.',\n 17: 'Arithmetic operation resulted in underflow or overflow.',\n 18: 'Division or modulo by zero (e.g. `5 / 0` or `23 % 0`).',\n 33: 'Attempted to convert to an invalid type.',\n 34: 'Attempted to access a storage byte array that is incorrectly encoded.',\n 49: 'Performed `.pop()` on an empty array',\n 50: 'Array index is out of bounds.',\n 65: 'Allocated too much memory or created an array which is too large.',\n 81: 'Attempted to call a zero-initialized variable of internal function type.',\n} as const\n\nexport const solidityError: AbiError = {\n inputs: [\n {\n name: 'message',\n type: 'string',\n },\n ],\n name: 'Error',\n type: 'error',\n}\nexport const solidityPanic: AbiError = {\n inputs: [\n {\n name: 'reason',\n type: 'uint256',\n },\n ],\n name: 'Panic',\n type: 'error',\n}\n","import { BaseError } from './base.js'\n\nexport type NegativeOffsetErrorType = NegativeOffsetError & {\n name: 'NegativeOffsetError'\n}\nexport class NegativeOffsetError extends BaseError {\n constructor({ offset }: { offset: number }) {\n super(`Offset \\`${offset}\\` cannot be negative.`, {\n name: 'NegativeOffsetError',\n })\n }\n}\n\nexport type PositionOutOfBoundsErrorType = PositionOutOfBoundsError & {\n name: 'PositionOutOfBoundsError'\n}\nexport class PositionOutOfBoundsError extends BaseError {\n constructor({ length, position }: { length: number; position: number }) {\n super(\n `Position \\`${position}\\` is out of bounds (\\`0 < position < ${length}\\`).`,\n { name: 'PositionOutOfBoundsError' },\n )\n }\n}\n\nexport type RecursiveReadLimitExceededErrorType =\n RecursiveReadLimitExceededError & {\n name: 'RecursiveReadLimitExceededError'\n }\nexport class RecursiveReadLimitExceededError extends BaseError {\n constructor({ count, limit }: { count: number; limit: number }) {\n super(\n `Recursive read limit of \\`${limit}\\` exceeded (recursive read count: \\`${count}\\`).`,\n { name: 'RecursiveReadLimitExceededError' },\n )\n }\n}\n","import {\n NegativeOffsetError,\n type NegativeOffsetErrorType,\n PositionOutOfBoundsError,\n type PositionOutOfBoundsErrorType,\n RecursiveReadLimitExceededError,\n type RecursiveReadLimitExceededErrorType,\n} from '../errors/cursor.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { ByteArray } from '../types/misc.js'\n\nexport type Cursor = {\n bytes: ByteArray\n dataView: DataView\n position: number\n positionReadCount: Map\n recursiveReadCount: number\n recursiveReadLimit: number\n remaining: number\n assertReadLimit(position?: number): void\n assertPosition(position: number): void\n decrementPosition(offset: number): void\n getReadCount(position?: number): number\n incrementPosition(offset: number): void\n inspectByte(position?: number): ByteArray[number]\n inspectBytes(length: number, position?: number): ByteArray\n inspectUint8(position?: number): number\n inspectUint16(position?: number): number\n inspectUint24(position?: number): number\n inspectUint32(position?: number): number\n pushByte(byte: ByteArray[number]): void\n pushBytes(bytes: ByteArray): void\n pushUint8(value: number): void\n pushUint16(value: number): void\n pushUint24(value: number): void\n pushUint32(value: number): void\n readByte(): ByteArray[number]\n readBytes(length: number, size?: number): ByteArray\n readUint8(): number\n readUint16(): number\n readUint24(): number\n readUint32(): number\n setPosition(position: number): () => void\n _touch(): void\n}\n\ntype CursorErrorType =\n | CursorAssertPositionErrorType\n | CursorDecrementPositionErrorType\n | CursorIncrementPositionErrorType\n | ErrorType\n\ntype CursorAssertPositionErrorType = PositionOutOfBoundsErrorType | ErrorType\n\ntype CursorDecrementPositionErrorType = NegativeOffsetErrorType | ErrorType\n\ntype CursorIncrementPositionErrorType = NegativeOffsetErrorType | ErrorType\n\ntype StaticCursorErrorType =\n | NegativeOffsetErrorType\n | RecursiveReadLimitExceededErrorType\n\nconst staticCursor: Cursor = {\n bytes: new Uint8Array(),\n dataView: new DataView(new ArrayBuffer(0)),\n position: 0,\n positionReadCount: new Map(),\n recursiveReadCount: 0,\n recursiveReadLimit: Number.POSITIVE_INFINITY,\n assertReadLimit() {\n if (this.recursiveReadCount >= this.recursiveReadLimit)\n throw new RecursiveReadLimitExceededError({\n count: this.recursiveReadCount + 1,\n limit: this.recursiveReadLimit,\n })\n },\n assertPosition(position) {\n if (position < 0 || position > this.bytes.length - 1)\n throw new PositionOutOfBoundsError({\n length: this.bytes.length,\n position,\n })\n },\n decrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position - offset\n this.assertPosition(position)\n this.position = position\n },\n getReadCount(position) {\n return this.positionReadCount.get(position || this.position) || 0\n },\n incrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position + offset\n this.assertPosition(position)\n this.position = position\n },\n inspectByte(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]\n },\n inspectBytes(length, position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + length - 1)\n return this.bytes.subarray(position, position + length)\n },\n inspectUint8(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]\n },\n inspectUint16(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 1)\n return this.dataView.getUint16(position)\n },\n inspectUint24(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 2)\n return (\n (this.dataView.getUint16(position) << 8) +\n this.dataView.getUint8(position + 2)\n )\n },\n inspectUint32(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 3)\n return this.dataView.getUint32(position)\n },\n pushByte(byte: ByteArray[number]) {\n this.assertPosition(this.position)\n this.bytes[this.position] = byte\n this.position++\n },\n pushBytes(bytes: ByteArray) {\n this.assertPosition(this.position + bytes.length - 1)\n this.bytes.set(bytes, this.position)\n this.position += bytes.length\n },\n pushUint8(value: number) {\n this.assertPosition(this.position)\n this.bytes[this.position] = value\n this.position++\n },\n pushUint16(value: number) {\n this.assertPosition(this.position + 1)\n this.dataView.setUint16(this.position, value)\n this.position += 2\n },\n pushUint24(value: number) {\n this.assertPosition(this.position + 2)\n this.dataView.setUint16(this.position, value >> 8)\n this.dataView.setUint8(this.position + 2, value & ~4294967040)\n this.position += 3\n },\n pushUint32(value: number) {\n this.assertPosition(this.position + 3)\n this.dataView.setUint32(this.position, value)\n this.position += 4\n },\n readByte() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectByte()\n this.position++\n return value\n },\n readBytes(length, size) {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectBytes(length)\n this.position += size ?? length\n return value\n },\n readUint8() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint8()\n this.position += 1\n return value\n },\n readUint16() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint16()\n this.position += 2\n return value\n },\n readUint24() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint24()\n this.position += 3\n return value\n },\n readUint32() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint32()\n this.position += 4\n return value\n },\n get remaining() {\n return this.bytes.length - this.position\n },\n setPosition(position) {\n const oldPosition = this.position\n this.assertPosition(position)\n this.position = position\n return () => (this.position = oldPosition)\n },\n _touch() {\n if (this.recursiveReadLimit === Number.POSITIVE_INFINITY) return\n const count = this.getReadCount()\n this.positionReadCount.set(this.position, count + 1)\n if (count > 0) this.recursiveReadCount++\n },\n}\n\ntype CursorConfig = { recursiveReadLimit?: number | undefined }\n\nexport type CreateCursorErrorType =\n | CursorErrorType\n | StaticCursorErrorType\n | ErrorType\n\nexport function createCursor(\n bytes: ByteArray,\n { recursiveReadLimit = 8_192 }: CursorConfig = {},\n): Cursor {\n const cursor: Cursor = Object.create(staticCursor)\n cursor.bytes = bytes\n cursor.dataView = new DataView(\n bytes.buffer ?? bytes,\n bytes.byteOffset,\n bytes.byteLength,\n )\n cursor.positionReadCount = new Map()\n cursor.recursiveReadLimit = recursiveReadLimit\n return cursor\n}\n","import { InvalidBytesBooleanError } from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\n\nimport {\n type AssertSizeErrorType,\n assertSize,\n type HexToBigIntErrorType,\n type HexToNumberErrorType,\n hexToBigInt,\n hexToNumber,\n} from './fromHex.js'\nimport { type BytesToHexErrorType, bytesToHex } from './toHex.js'\n\nexport type FromBytesParameters<\n to extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean',\n> =\n | to\n | {\n /** Size of the bytes. */\n size?: number | undefined\n /** Type to convert to. */\n to: to\n }\n\nexport type FromBytesReturnType = to extends 'string'\n ? string\n : to extends 'hex'\n ? Hex\n : to extends 'bigint'\n ? bigint\n : to extends 'number'\n ? number\n : to extends 'boolean'\n ? boolean\n : never\n\nexport type FromBytesErrorType =\n | BytesToHexErrorType\n | BytesToBigIntErrorType\n | BytesToBoolErrorType\n | BytesToNumberErrorType\n | BytesToStringErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a UTF-8 string, hex value, number, bigint or boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes\n * - Example: https://viem.sh/docs/utilities/fromBytes#usage\n *\n * @param bytes Byte array to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromBytes } from 'viem'\n * const data = fromBytes(new Uint8Array([1, 164]), 'number')\n * // 420\n *\n * @example\n * import { fromBytes } from 'viem'\n * const data = fromBytes(\n * new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]),\n * 'string'\n * )\n * // 'Hello world'\n */\nexport function fromBytes<\n to extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean',\n>(\n bytes: ByteArray,\n toOrOpts: FromBytesParameters,\n): FromBytesReturnType {\n const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts\n const to = opts.to\n\n if (to === 'number')\n return bytesToNumber(bytes, opts) as FromBytesReturnType\n if (to === 'bigint')\n return bytesToBigInt(bytes, opts) as FromBytesReturnType\n if (to === 'boolean')\n return bytesToBool(bytes, opts) as FromBytesReturnType\n if (to === 'string')\n return bytesToString(bytes, opts) as FromBytesReturnType\n return bytesToHex(bytes, opts) as FromBytesReturnType\n}\n\nexport type BytesToBigIntOpts = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size of the bytes. */\n size?: number | undefined\n}\n\nexport type BytesToBigIntErrorType =\n | BytesToHexErrorType\n | HexToBigIntErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestobigint\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { bytesToBigInt } from 'viem'\n * const data = bytesToBigInt(new Uint8Array([1, 164]))\n * // 420n\n */\nexport function bytesToBigInt(\n bytes: ByteArray,\n opts: BytesToBigIntOpts = {},\n): bigint {\n if (typeof opts.size !== 'undefined') assertSize(bytes, { size: opts.size })\n const hex = bytesToHex(bytes, opts)\n return hexToBigInt(hex, opts)\n}\n\nexport type BytesToBoolOpts = {\n /** Size of the bytes. */\n size?: number | undefined\n}\n\nexport type BytesToBoolErrorType =\n | AssertSizeErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestobool\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { bytesToBool } from 'viem'\n * const data = bytesToBool(new Uint8Array([1]))\n * // true\n */\nexport function bytesToBool(\n bytes_: ByteArray,\n opts: BytesToBoolOpts = {},\n): boolean {\n let bytes = bytes_\n if (typeof opts.size !== 'undefined') {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes)\n }\n if (bytes.length > 1 || bytes[0] > 1)\n throw new InvalidBytesBooleanError(bytes)\n return Boolean(bytes[0])\n}\n\nexport type BytesToNumberOpts = BytesToBigIntOpts\n\nexport type BytesToNumberErrorType =\n | BytesToHexErrorType\n | HexToNumberErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestonumber\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { bytesToNumber } from 'viem'\n * const data = bytesToNumber(new Uint8Array([1, 164]))\n * // 420\n */\nexport function bytesToNumber(\n bytes: ByteArray,\n opts: BytesToNumberOpts = {},\n): number {\n if (typeof opts.size !== 'undefined') assertSize(bytes, { size: opts.size })\n const hex = bytesToHex(bytes, opts)\n return hexToNumber(hex, opts)\n}\n\nexport type BytesToStringOpts = {\n /** Size of the bytes. */\n size?: number | undefined\n}\n\nexport type BytesToStringErrorType =\n | AssertSizeErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestostring\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { bytesToString } from 'viem'\n * const data = bytesToString(new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // 'Hello world'\n */\nexport function bytesToString(\n bytes_: ByteArray,\n opts: BytesToStringOpts = {},\n): string {\n let bytes = bytes_\n if (typeof opts.size !== 'undefined') {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes, { dir: 'right' })\n }\n return new TextDecoder().decode(bytes)\n}\n","import type {\n AbiParameter,\n AbiParameterKind,\n AbiParametersToPrimitiveTypes,\n} from 'abitype'\nimport {\n AbiDecodingDataSizeTooSmallError,\n AbiDecodingZeroDataError,\n InvalidAbiDecodingTypeError,\n type InvalidAbiDecodingTypeErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type ChecksumAddressErrorType,\n checksumAddress,\n} from '../address/getAddress.js'\nimport {\n type CreateCursorErrorType,\n type Cursor,\n createCursor,\n} from '../cursor.js'\nimport { type SizeErrorType, size } from '../data/size.js'\nimport { type SliceBytesErrorType, sliceBytes } from '../data/slice.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\nimport {\n type BytesToBigIntErrorType,\n type BytesToBoolErrorType,\n type BytesToNumberErrorType,\n type BytesToStringErrorType,\n bytesToBigInt,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n} from '../encoding/fromBytes.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { getArrayComponents } from './encodeAbiParameters.js'\n\nexport type DecodeAbiParametersReturnType<\n params extends readonly AbiParameter[] = readonly AbiParameter[],\n> = AbiParametersToPrimitiveTypes<\n params extends readonly AbiParameter[] ? params : AbiParameter[],\n AbiParameterKind,\n true\n>\n\nexport type DecodeAbiParametersErrorType =\n | HexToBytesErrorType\n | BytesToHexErrorType\n | DecodeParameterErrorType\n | SizeErrorType\n | CreateCursorErrorType\n | ErrorType\n\nexport function decodeAbiParameters<\n const params extends readonly AbiParameter[],\n>(\n params: params,\n data: ByteArray | Hex,\n): DecodeAbiParametersReturnType {\n const bytes = typeof data === 'string' ? hexToBytes(data) : data\n const cursor = createCursor(bytes)\n\n if (size(bytes) === 0 && params.length > 0)\n throw new AbiDecodingZeroDataError()\n if (size(data) && size(data) < 32)\n throw new AbiDecodingDataSizeTooSmallError({\n data: typeof data === 'string' ? data : bytesToHex(data),\n params: params as readonly AbiParameter[],\n size: size(data),\n })\n\n let consumed = 0\n const values = []\n for (let i = 0; i < params.length; ++i) {\n const param = params[i]\n cursor.setPosition(consumed)\n const [data, consumed_] = decodeParameter(cursor, param, {\n staticPosition: 0,\n })\n consumed += consumed_\n values.push(data)\n }\n return values as never\n}\n\ntype DecodeParameterErrorType =\n | DecodeArrayErrorType\n | DecodeTupleErrorType\n | DecodeAddressErrorType\n | DecodeBoolErrorType\n | DecodeBytesErrorType\n | DecodeNumberErrorType\n | DecodeStringErrorType\n | InvalidAbiDecodingTypeErrorType\n\nfunction decodeParameter(\n cursor: Cursor,\n param: AbiParameter,\n { staticPosition }: { staticPosition: number },\n) {\n const arrayComponents = getArrayComponents(param.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return decodeArray(cursor, { ...param, type }, { length, staticPosition })\n }\n if (param.type === 'tuple')\n return decodeTuple(cursor, param as TupleAbiParameter, { staticPosition })\n\n if (param.type === 'address') return decodeAddress(cursor)\n if (param.type === 'bool') return decodeBool(cursor)\n if (param.type.startsWith('bytes'))\n return decodeBytes(cursor, param, { staticPosition })\n if (param.type.startsWith('uint') || param.type.startsWith('int'))\n return decodeNumber(cursor, param)\n if (param.type === 'string') return decodeString(cursor, { staticPosition })\n throw new InvalidAbiDecodingTypeError(param.type, {\n docsPath: '/docs/contract/decodeAbiParameters',\n })\n}\n\n////////////////////////////////////////////////////////////////////\n// Type Decoders\n\nconst sizeOfLength = 32\nconst sizeOfOffset = 32\n\ntype DecodeAddressErrorType =\n | ChecksumAddressErrorType\n | BytesToHexErrorType\n | SliceBytesErrorType\n | ErrorType\n\nfunction decodeAddress(cursor: Cursor) {\n const value = cursor.readBytes(32)\n return [checksumAddress(bytesToHex(sliceBytes(value, -20))), 32]\n}\n\ntype DecodeArrayErrorType = BytesToNumberErrorType | ErrorType\n\nfunction decodeArray(\n cursor: Cursor,\n param: AbiParameter,\n { length, staticPosition }: { length: number | null; staticPosition: number },\n) {\n // If the length of the array is not known in advance (dynamic array),\n // this means we will need to wonder off to the pointer and decode.\n if (!length) {\n // Dealing with a dynamic type, so get the offset of the array data.\n const offset = bytesToNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n const startOfData = start + sizeOfLength\n\n // Get the length of the array from the offset.\n cursor.setPosition(start)\n const length = bytesToNumber(cursor.readBytes(sizeOfLength))\n\n // Check if the array has any dynamic children.\n const dynamicChild = hasDynamicChild(param)\n\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // If any of the children is dynamic, then all elements will be offset pointer, thus size of one slot (32 bytes).\n // Otherwise, elements will be the size of their encoding (consumed bytes).\n cursor.setPosition(startOfData + (dynamicChild ? i * 32 : consumed))\n const [data, consumed_] = decodeParameter(cursor, param, {\n staticPosition: startOfData,\n })\n consumed += consumed_\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance,\n // and the length of an element deeply nested in the array is not known,\n // we need to decode the offset of the array data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the array data.\n const offset = bytesToNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // Move cursor along to the next slot (next offset pointer).\n cursor.setPosition(start + i * 32)\n const [data] = decodeParameter(cursor, param, {\n staticPosition: start,\n })\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance and the array is deeply static,\n // then we can just decode each element in sequence.\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n const [data, consumed_] = decodeParameter(cursor, param, {\n staticPosition: staticPosition + consumed,\n })\n consumed += consumed_\n value.push(data)\n }\n return [value, consumed]\n}\n\ntype DecodeBoolErrorType = BytesToBoolErrorType | ErrorType\n\nfunction decodeBool(cursor: Cursor) {\n return [bytesToBool(cursor.readBytes(32), { size: 32 }), 32]\n}\n\ntype DecodeBytesErrorType =\n | BytesToNumberErrorType\n | BytesToHexErrorType\n | ErrorType\n\nfunction decodeBytes(\n cursor: Cursor,\n param: AbiParameter,\n { staticPosition }: { staticPosition: number },\n) {\n const [_, size] = param.type.split('bytes')\n if (!size) {\n // Dealing with dynamic types, so get the offset of the bytes data.\n const offset = bytesToNumber(cursor.readBytes(32))\n\n // Set position of the cursor to start of bytes data.\n cursor.setPosition(staticPosition + offset)\n\n const length = bytesToNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data.\n if (length === 0) {\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return ['0x', 32]\n }\n\n const data = cursor.readBytes(length)\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [bytesToHex(data), 32]\n }\n\n const value = bytesToHex(cursor.readBytes(Number.parseInt(size, 10), 32))\n return [value, 32]\n}\n\ntype DecodeNumberErrorType =\n | BytesToNumberErrorType\n | BytesToBigIntErrorType\n | ErrorType\n\nfunction decodeNumber(cursor: Cursor, param: AbiParameter) {\n const signed = param.type.startsWith('int')\n const size = Number.parseInt(param.type.split('int')[1] || '256', 10)\n const value = cursor.readBytes(32)\n return [\n size > 48\n ? bytesToBigInt(value, { signed })\n : bytesToNumber(value, { signed }),\n 32,\n ]\n}\n\ntype TupleAbiParameter = AbiParameter & { components: readonly AbiParameter[] }\n\ntype DecodeTupleErrorType = BytesToNumberErrorType | ErrorType\n\nfunction decodeTuple(\n cursor: Cursor,\n param: TupleAbiParameter,\n { staticPosition }: { staticPosition: number },\n) {\n // Tuples can have unnamed components (i.e. they are arrays), so we must\n // determine whether the tuple is named or unnamed. In the case of a named\n // tuple, the value will be an object where each property is the name of the\n // component. In the case of an unnamed tuple, the value will be an array.\n const hasUnnamedChild =\n param.components.length === 0 || param.components.some(({ name }) => !name)\n\n // Initialize the value to an object or an array, depending on whether the\n // tuple is named or unnamed.\n const value: any = hasUnnamedChild ? [] : {}\n let consumed = 0\n\n // If the tuple has a dynamic child, we must first decode the offset to the\n // tuple data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the tuple data.\n const offset = bytesToNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of referencing slot + offset.\n const start = staticPosition + offset\n\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]\n cursor.setPosition(start + consumed)\n const [data, consumed_] = decodeParameter(cursor, component, {\n staticPosition: start,\n })\n consumed += consumed_\n value[hasUnnamedChild ? i : component?.name!] = data\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the tuple has static children, we can just decode each component\n // in sequence.\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]\n const [data, consumed_] = decodeParameter(cursor, component, {\n staticPosition,\n })\n value[hasUnnamedChild ? i : component?.name!] = data\n consumed += consumed_\n }\n return [value, consumed]\n}\n\ntype DecodeStringErrorType =\n | BytesToNumberErrorType\n | BytesToStringErrorType\n | TrimErrorType\n | ErrorType\n\nfunction decodeString(\n cursor: Cursor,\n { staticPosition }: { staticPosition: number },\n) {\n // Get offset to start of string data.\n const offset = bytesToNumber(cursor.readBytes(32))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n cursor.setPosition(start)\n\n const length = bytesToNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data (empty string).\n if (length === 0) {\n cursor.setPosition(staticPosition + 32)\n return ['', 32]\n }\n\n const data = cursor.readBytes(length, 32)\n const value = bytesToString(trim(data))\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n\n return [value, 32]\n}\n\nfunction hasDynamicChild(param: AbiParameter) {\n const { type } = param\n if (type === 'string') return true\n if (type === 'bytes') return true\n if (type.endsWith('[]')) return true\n\n if (type === 'tuple') return (param as any).components?.some(hasDynamicChild)\n\n const arrayComponents = getArrayComponents(param.type)\n if (\n arrayComponents &&\n hasDynamicChild({ ...param, type: arrayComponents[1] } as AbiParameter)\n )\n return true\n\n return false\n}\n","import type { Abi, ExtractAbiError } from 'abitype'\n\nimport { solidityError, solidityPanic } from '../../constants/solidity.js'\nimport {\n AbiDecodingZeroDataError,\n type AbiDecodingZeroDataErrorType,\n AbiErrorSignatureNotFoundError,\n type AbiErrorSignatureNotFoundErrorType,\n} from '../../errors/abi.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n AbiItem,\n ContractErrorArgs,\n ContractErrorName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { slice } from '../data/slice.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\n\nexport type DecodeErrorResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n> = { abi?: abi | undefined; data: Hex; cause?: BaseError | Error | undefined }\n\nexport type DecodeErrorResultReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n ///\n allErrorNames extends ContractErrorName = ContractErrorName,\n> = IsNarrowable extends true\n ? UnionEvaluate<\n {\n [errorName in allErrorNames]: {\n abiItem: abi extends Abi\n ? Abi extends abi\n ? AbiItem\n : ExtractAbiError\n : AbiItem\n args: ContractErrorArgs\n errorName: errorName\n }\n }[allErrorNames]\n >\n : {\n abiItem: AbiItem\n args: readonly unknown[] | undefined\n errorName: string\n }\n\nexport type DecodeErrorResultErrorType =\n | AbiDecodingZeroDataErrorType\n | AbiErrorSignatureNotFoundErrorType\n | DecodeAbiParametersErrorType\n | FormatAbiItemErrorType\n | ToFunctionSelectorErrorType\n | ErrorType\n\nexport function decodeErrorResult(\n parameters: DecodeErrorResultParameters,\n): DecodeErrorResultReturnType {\n const { abi, data, cause } = parameters as DecodeErrorResultParameters\n\n const signature = slice(data, 0, 4)\n if (signature === '0x') throw new AbiDecodingZeroDataError({ cause })\n\n const abi_ = [...(abi || []), solidityError, solidityPanic]\n const abiItem = abi_.find(\n (x) =>\n x.type === 'error' && signature === toFunctionSelector(formatAbiItem(x)),\n )\n if (!abiItem)\n throw new AbiErrorSignatureNotFoundError(signature, {\n docsPath: '/docs/contract/decodeErrorResult',\n cause,\n })\n return {\n abiItem,\n args:\n 'inputs' in abiItem && abiItem.inputs && abiItem.inputs.length > 0\n ? decodeAbiParameters(abiItem.inputs, slice(data, 4))\n : undefined,\n errorName: (abiItem as { name: string }).name,\n } as DecodeErrorResultReturnType\n}\n","import type { ErrorType } from '../errors/utils.js'\n\nexport type StringifyErrorType = ErrorType\n\nexport const stringify: typeof JSON.stringify = (value, replacer, space) =>\n JSON.stringify(\n value,\n (key, value_) => {\n const value = typeof value_ === 'bigint' ? value_.toString() : value_\n return typeof replacer === 'function' ? replacer(key, value) : value\n },\n space,\n )\n","import type { AbiParameter } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { AbiItem } from '../../types/contract.js'\nimport { stringify } from '../stringify.js'\n\nexport type FormatAbiItemWithArgsErrorType = ErrorType\n\nexport function formatAbiItemWithArgs({\n abiItem,\n args,\n includeFunctionName = true,\n includeName = false,\n}: {\n abiItem: AbiItem\n args: readonly unknown[]\n includeFunctionName?: boolean | undefined\n includeName?: boolean | undefined\n}) {\n if (!('name' in abiItem)) return\n if (!('inputs' in abiItem)) return\n if (!abiItem.inputs) return\n return `${includeFunctionName ? abiItem.name : ''}(${abiItem.inputs\n .map(\n (input: AbiParameter, i: number) =>\n `${includeName && input.name ? `${input.name}: ` : ''}${\n typeof args[i] === 'object' ? stringify(args[i]) : args[i]\n }`,\n )\n .join(', ')})`\n}\n","export const etherUnits = {\n gwei: 9,\n wei: 18,\n}\nexport const gweiUnits = {\n ether: -9,\n wei: 9,\n}\nexport const weiUnits = {\n ether: -18,\n gwei: -9,\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\nexport type FormatUnitsErrorType = ErrorType\n\n/**\n * Divides a number by a given exponent of base 10 (10exponent), and formats it into a string representation of the number..\n *\n * - Docs: https://viem.sh/docs/utilities/formatUnits\n *\n * @example\n * import { formatUnits } from 'viem'\n *\n * formatUnits(420000000000n, 9)\n * // '420'\n */\nexport function formatUnits(value: bigint, decimals: number) {\n let display = value.toString()\n\n const negative = display.startsWith('-')\n if (negative) display = display.slice(1)\n\n display = display.padStart(decimals, '0')\n\n let [integer, fraction] = [\n display.slice(0, display.length - decimals),\n display.slice(display.length - decimals),\n ]\n fraction = fraction.replace(/(0+)$/, '')\n return `${negative ? '-' : ''}${integer || '0'}${\n fraction ? `.${fraction}` : ''\n }`\n}\n","import { etherUnits } from '../../constants/unit.js'\n\nimport { type FormatUnitsErrorType, formatUnits } from './formatUnits.js'\n\nexport type FormatEtherErrorType = FormatUnitsErrorType\n\n/**\n * Converts numerical wei to a string representation of ether.\n *\n * - Docs: https://viem.sh/docs/utilities/formatEther\n *\n * @example\n * import { formatEther } from 'viem'\n *\n * formatEther(1000000000000000000n)\n * // '1'\n */\nexport function formatEther(wei: bigint, unit: 'wei' | 'gwei' = 'wei') {\n return formatUnits(wei, etherUnits[unit])\n}\n","import { gweiUnits } from '../../constants/unit.js'\n\nimport { type FormatUnitsErrorType, formatUnits } from './formatUnits.js'\n\nexport type FormatGweiErrorType = FormatUnitsErrorType\n\n/**\n * Converts numerical wei to a string representation of gwei.\n *\n * - Docs: https://viem.sh/docs/utilities/formatGwei\n *\n * @example\n * import { formatGwei } from 'viem'\n *\n * formatGwei(1000000000n)\n * // '1'\n */\nexport function formatGwei(wei: bigint, unit: 'wei' = 'wei') {\n return formatUnits(wei, gweiUnits[unit])\n}\n","import type { StateMapping, StateOverride } from '../types/stateOverride.js'\nimport { BaseError } from './base.js'\n\nexport type AccountStateConflictErrorType = AccountStateConflictError & {\n name: 'AccountStateConflictError'\n}\n\nexport class AccountStateConflictError extends BaseError {\n constructor({ address }: { address: string }) {\n super(`State for account \"${address}\" is set multiple times.`, {\n name: 'AccountStateConflictError',\n })\n }\n}\n\nexport type StateAssignmentConflictErrorType = StateAssignmentConflictError & {\n name: 'StateAssignmentConflictError'\n}\n\nexport class StateAssignmentConflictError extends BaseError {\n constructor() {\n super('state and stateDiff are set on the same account.', {\n name: 'StateAssignmentConflictError',\n })\n }\n}\n\n/** @internal */\nexport function prettyStateMapping(stateMapping: StateMapping) {\n return stateMapping.reduce((pretty, { slot, value }) => {\n return `${pretty} ${slot}: ${value}\\n`\n }, '')\n}\n\nexport function prettyStateOverride(stateOverride: StateOverride) {\n return stateOverride\n .reduce((pretty, { address, ...state }) => {\n let val = `${pretty} ${address}:\\n`\n if (state.nonce) val += ` nonce: ${state.nonce}\\n`\n if (state.balance) val += ` balance: ${state.balance}\\n`\n if (state.code) val += ` code: ${state.code}\\n`\n if (state.state) {\n val += ' state:\\n'\n val += prettyStateMapping(state.state)\n }\n if (state.stateDiff) {\n val += ' stateDiff:\\n'\n val += prettyStateMapping(state.stateDiff)\n }\n return val\n }, ' State Override:\\n')\n .slice(0, -1)\n}\n","import type { Account } from '../accounts/types.js'\nimport type { SendTransactionParameters } from '../actions/wallet/sendTransaction.js'\nimport type { BlockTag } from '../types/block.js'\nimport type { Chain } from '../types/chain.js'\nimport type { Hash, Hex } from '../types/misc.js'\nimport type {\n TransactionReceipt,\n TransactionType,\n} from '../types/transaction.js'\nimport { formatEther } from '../utils/unit/formatEther.js'\nimport { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { BaseError } from './base.js'\n\nexport function prettyPrint(\n args: Record,\n) {\n const entries = Object.entries(args)\n .map(([key, value]) => {\n if (value === undefined || value === false) return null\n return [key, value]\n })\n .filter(Boolean) as [string, string][]\n const maxLength = entries.reduce((acc, [key]) => Math.max(acc, key.length), 0)\n return entries\n .map(([key, value]) => ` ${`${key}:`.padEnd(maxLength + 1)} ${value}`)\n .join('\\n')\n}\n\nexport type FeeConflictErrorType = FeeConflictError & {\n name: 'FeeConflictError'\n}\nexport class FeeConflictError extends BaseError {\n constructor() {\n super(\n [\n 'Cannot specify both a `gasPrice` and a `maxFeePerGas`/`maxPriorityFeePerGas`.',\n 'Use `maxFeePerGas`/`maxPriorityFeePerGas` for EIP-1559 compatible networks, and `gasPrice` for others.',\n ].join('\\n'),\n { name: 'FeeConflictError' },\n )\n }\n}\n\nexport type InvalidLegacyVErrorType = InvalidLegacyVError & {\n name: 'InvalidLegacyVError'\n}\nexport class InvalidLegacyVError extends BaseError {\n constructor({ v }: { v: bigint }) {\n super(`Invalid \\`v\\` value \"${v}\". Expected 27 or 28.`, {\n name: 'InvalidLegacyVError',\n })\n }\n}\n\nexport type InvalidSerializableTransactionErrorType =\n InvalidSerializableTransactionError & {\n name: 'InvalidSerializableTransactionError'\n }\nexport class InvalidSerializableTransactionError extends BaseError {\n constructor({ transaction }: { transaction: Record }) {\n super('Cannot infer a transaction type from provided transaction.', {\n metaMessages: [\n 'Provided Transaction:',\n '{',\n prettyPrint(transaction),\n '}',\n '',\n 'To infer the type, either provide:',\n '- a `type` to the Transaction, or',\n '- an EIP-1559 Transaction with `maxFeePerGas`, or',\n '- an EIP-2930 Transaction with `gasPrice` & `accessList`, or',\n '- an EIP-4844 Transaction with `blobs`, `blobVersionedHashes`, `sidecars`, or',\n '- an EIP-7702 Transaction with `authorizationList`, or',\n '- a Legacy Transaction with `gasPrice`',\n ],\n name: 'InvalidSerializableTransactionError',\n })\n }\n}\n\nexport type InvalidSerializedTransactionTypeErrorType =\n InvalidSerializedTransactionTypeError & {\n name: 'InvalidSerializedTransactionTypeError'\n }\nexport class InvalidSerializedTransactionTypeError extends BaseError {\n serializedType: Hex\n\n constructor({ serializedType }: { serializedType: Hex }) {\n super(`Serialized transaction type \"${serializedType}\" is invalid.`, {\n name: 'InvalidSerializedTransactionType',\n })\n\n this.serializedType = serializedType\n }\n}\n\nexport type InvalidSerializedTransactionErrorType =\n InvalidSerializedTransactionError & {\n name: 'InvalidSerializedTransactionError'\n }\nexport class InvalidSerializedTransactionError extends BaseError {\n serializedTransaction: Hex\n type: TransactionType\n\n constructor({\n attributes,\n serializedTransaction,\n type,\n }: {\n attributes: Record\n serializedTransaction: Hex\n type: TransactionType\n }) {\n const missing = Object.entries(attributes)\n .map(([key, value]) => (typeof value === 'undefined' ? key : undefined))\n .filter(Boolean)\n super(`Invalid serialized transaction of type \"${type}\" was provided.`, {\n metaMessages: [\n `Serialized Transaction: \"${serializedTransaction}\"`,\n missing.length > 0 ? `Missing Attributes: ${missing.join(', ')}` : '',\n ].filter(Boolean),\n name: 'InvalidSerializedTransactionError',\n })\n\n this.serializedTransaction = serializedTransaction\n this.type = type\n }\n}\n\nexport type InvalidStorageKeySizeErrorType = InvalidStorageKeySizeError & {\n name: 'InvalidStorageKeySizeError'\n}\nexport class InvalidStorageKeySizeError extends BaseError {\n constructor({ storageKey }: { storageKey: Hex }) {\n super(\n `Size for storage key \"${storageKey}\" is invalid. Expected 32 bytes. Got ${Math.floor(\n (storageKey.length - 2) / 2,\n )} bytes.`,\n { name: 'InvalidStorageKeySizeError' },\n )\n }\n}\n\nexport type TransactionExecutionErrorType = TransactionExecutionError & {\n name: 'TransactionExecutionError'\n}\nexport class TransactionExecutionError extends BaseError {\n override cause: BaseError\n\n constructor(\n cause: BaseError,\n {\n account,\n docsPath,\n chain,\n data,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n }: Omit & {\n account: Account | null\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n ) {\n const prettyArgs = prettyPrint({\n chain: chain && `${chain?.name} (id: ${chain?.id})`,\n from: account?.address,\n to,\n value:\n typeof value !== 'undefined' &&\n `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n data,\n gas,\n gasPrice:\n typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n maxFeePerGas:\n typeof maxFeePerGas !== 'undefined' &&\n `${formatGwei(maxFeePerGas)} gwei`,\n maxPriorityFeePerGas:\n typeof maxPriorityFeePerGas !== 'undefined' &&\n `${formatGwei(maxPriorityFeePerGas)} gwei`,\n nonce,\n })\n\n super(cause.shortMessage, {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n 'Request Arguments:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'TransactionExecutionError',\n })\n this.cause = cause\n }\n}\n\nexport type TransactionNotFoundErrorType = TransactionNotFoundError & {\n name: 'TransactionNotFoundError'\n}\nexport class TransactionNotFoundError extends BaseError {\n constructor({\n blockHash,\n blockNumber,\n blockTag,\n hash,\n index,\n }: {\n blockHash?: Hash | undefined\n blockNumber?: bigint | undefined\n blockTag?: BlockTag | undefined\n hash?: Hash | undefined\n index?: number | undefined\n }) {\n let identifier = 'Transaction'\n if (blockTag && index !== undefined)\n identifier = `Transaction at block time \"${blockTag}\" at index \"${index}\"`\n if (blockHash && index !== undefined)\n identifier = `Transaction at block hash \"${blockHash}\" at index \"${index}\"`\n if (blockNumber && index !== undefined)\n identifier = `Transaction at block number \"${blockNumber}\" at index \"${index}\"`\n if (hash) identifier = `Transaction with hash \"${hash}\"`\n super(`${identifier} could not be found.`, {\n name: 'TransactionNotFoundError',\n })\n }\n}\n\nexport type TransactionReceiptNotFoundErrorType =\n TransactionReceiptNotFoundError & {\n name: 'TransactionReceiptNotFoundError'\n }\nexport class TransactionReceiptNotFoundError extends BaseError {\n constructor({ hash }: { hash: Hash }) {\n super(\n `Transaction receipt with hash \"${hash}\" could not be found. The Transaction may not be processed on a block yet.`,\n {\n name: 'TransactionReceiptNotFoundError',\n },\n )\n }\n}\n\nexport type TransactionReceiptRevertedErrorType =\n TransactionReceiptRevertedError & {\n name: 'TransactionReceiptRevertedError'\n }\nexport class TransactionReceiptRevertedError extends BaseError {\n receipt: TransactionReceipt\n\n constructor({ receipt }: { receipt: TransactionReceipt }) {\n super(`Transaction with hash \"${receipt.transactionHash}\" reverted.`, {\n metaMessages: [\n 'The receipt marked the transaction as \"reverted\". This could mean that the function on the contract you are trying to call threw an error.',\n ' ',\n 'You can attempt to extract the revert reason by:',\n '- calling the `simulateContract` or `simulateCalls` Action with the `abi` and `functionName` of the contract',\n '- using the `call` Action with raw `data`',\n ],\n name: 'TransactionReceiptRevertedError',\n })\n\n this.receipt = receipt\n }\n}\n\nexport type WaitForTransactionReceiptTimeoutErrorType =\n WaitForTransactionReceiptTimeoutError & {\n name: 'WaitForTransactionReceiptTimeoutError'\n }\nexport class WaitForTransactionReceiptTimeoutError extends BaseError {\n constructor({ hash }: { hash: Hash }) {\n super(\n `Timed out while waiting for transaction with hash \"${hash}\" to be confirmed.`,\n { name: 'WaitForTransactionReceiptTimeoutError' },\n )\n }\n}\n","import type { Address } from 'abitype'\n\nexport type ErrorType = Error & { name: name }\n\nexport const getContractAddress = (address: Address) => address\nexport const getUrl = (url: string) => url\n","import type { Abi, Address } from 'abitype'\n\nimport { parseAccount } from '../accounts/utils/parseAccount.js'\nimport type { CallParameters } from '../actions/public/call.js'\nimport { panicReasons } from '../constants/solidity.js'\nimport type { Chain } from '../types/chain.js'\nimport type { Hex } from '../types/misc.js'\nimport {\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from '../utils/abi/decodeErrorResult.js'\nimport { formatAbiItem } from '../utils/abi/formatAbiItem.js'\nimport { formatAbiItemWithArgs } from '../utils/abi/formatAbiItemWithArgs.js'\nimport { getAbiItem } from '../utils/abi/getAbiItem.js'\nimport { formatEther } from '../utils/unit/formatEther.js'\nimport { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { AbiErrorSignatureNotFoundError } from './abi.js'\nimport { BaseError } from './base.js'\nimport { prettyStateOverride } from './stateOverride.js'\nimport { prettyPrint } from './transaction.js'\nimport { getContractAddress } from './utils.js'\n\nexport type CallExecutionErrorType = CallExecutionError & {\n name: 'CallExecutionError'\n}\nexport class CallExecutionError extends BaseError {\n override cause: BaseError\n\n constructor(\n cause: BaseError,\n {\n account: account_,\n docsPath,\n chain,\n data,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n stateOverride,\n }: CallParameters & {\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n ) {\n const account = account_ ? parseAccount(account_) : undefined\n let prettyArgs = prettyPrint({\n from: account?.address,\n to,\n value:\n typeof value !== 'undefined' &&\n `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n data,\n gas,\n gasPrice:\n typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n maxFeePerGas:\n typeof maxFeePerGas !== 'undefined' &&\n `${formatGwei(maxFeePerGas)} gwei`,\n maxPriorityFeePerGas:\n typeof maxPriorityFeePerGas !== 'undefined' &&\n `${formatGwei(maxPriorityFeePerGas)} gwei`,\n nonce,\n })\n\n if (stateOverride) {\n prettyArgs += `\\n${prettyStateOverride(stateOverride)}`\n }\n\n super(cause.shortMessage, {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n 'Raw Call Arguments:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'CallExecutionError',\n })\n this.cause = cause\n }\n}\n\nexport type ContractFunctionExecutionErrorType =\n ContractFunctionExecutionError & {\n name: 'ContractFunctionExecutionError'\n }\nexport class ContractFunctionExecutionError extends BaseError {\n abi: Abi\n args?: unknown[] | undefined\n override cause: BaseError\n contractAddress?: Address | undefined\n formattedArgs?: string | undefined\n functionName: string\n sender?: Address | undefined\n\n constructor(\n cause: BaseError,\n {\n abi,\n args,\n contractAddress,\n docsPath,\n functionName,\n sender,\n }: {\n abi: Abi\n args?: any | undefined\n contractAddress?: Address | undefined\n docsPath?: string | undefined\n functionName: string\n sender?: Address | undefined\n },\n ) {\n const abiItem = getAbiItem({ abi, args, name: functionName })\n const formattedArgs = abiItem\n ? formatAbiItemWithArgs({\n abiItem,\n args,\n includeFunctionName: false,\n includeName: false,\n })\n : undefined\n const functionWithParams = abiItem\n ? formatAbiItem(abiItem, { includeName: true })\n : undefined\n\n const prettyArgs = prettyPrint({\n address: contractAddress && getContractAddress(contractAddress),\n function: functionWithParams,\n args:\n formattedArgs &&\n formattedArgs !== '()' &&\n `${[...Array(functionName?.length ?? 0).keys()]\n .map(() => ' ')\n .join('')}${formattedArgs}`,\n sender,\n })\n\n super(\n cause.shortMessage ||\n `An unknown error occurred while executing the contract function \"${functionName}\".`,\n {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n prettyArgs && 'Contract Call:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'ContractFunctionExecutionError',\n },\n )\n this.abi = abi\n this.args = args\n this.cause = cause\n this.contractAddress = contractAddress\n this.functionName = functionName\n this.sender = sender\n }\n}\n\nexport type ContractFunctionRevertedErrorType =\n ContractFunctionRevertedError & {\n name: 'ContractFunctionRevertedError'\n }\nexport class ContractFunctionRevertedError extends BaseError {\n data?: DecodeErrorResultReturnType | undefined\n raw?: Hex | undefined\n reason?: string | undefined\n signature?: Hex | undefined\n\n constructor({\n abi,\n data,\n functionName,\n message,\n cause: error,\n }: {\n abi: Abi\n data?: Hex | undefined\n functionName: string\n message?: string | undefined\n cause?: BaseError | Error | undefined\n }) {\n let cause: Error | undefined\n let decodedData: DecodeErrorResultReturnType | undefined\n let metaMessages: string[] | undefined\n let reason: string | undefined\n if (data && data !== '0x') {\n try {\n decodedData = decodeErrorResult({ abi, data, cause: error })\n const { abiItem, errorName, args: errorArgs } = decodedData\n if (errorName === 'Error') {\n reason = (errorArgs as [string])[0]\n } else if (errorName === 'Panic') {\n const [firstArg] = errorArgs as [number]\n reason = panicReasons[firstArg as keyof typeof panicReasons]\n } else {\n const errorWithParams = abiItem\n ? formatAbiItem(abiItem, { includeName: true })\n : undefined\n const formattedArgs =\n abiItem && errorArgs\n ? formatAbiItemWithArgs({\n abiItem,\n args: errorArgs,\n includeFunctionName: false,\n includeName: false,\n })\n : undefined\n\n metaMessages = [\n errorWithParams ? `Error: ${errorWithParams}` : '',\n formattedArgs && formattedArgs !== '()'\n ? ` ${[...Array(errorName?.length ?? 0).keys()]\n .map(() => ' ')\n .join('')}${formattedArgs}`\n : '',\n ]\n }\n } catch (err) {\n cause = err as Error\n }\n } else if (message) reason = message\n\n let signature: Hex | undefined\n if (cause instanceof AbiErrorSignatureNotFoundError) {\n signature = cause.signature\n metaMessages = [\n `Unable to decode signature \"${signature}\" as it was not found on the provided ABI.`,\n 'Make sure you are using the correct ABI and that the error exists on it.',\n `You can look up the decoded signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ]\n }\n\n super(\n (reason && reason !== 'execution reverted') || signature\n ? [\n `The contract function \"${functionName}\" reverted with the following ${\n signature ? 'signature' : 'reason'\n }:`,\n reason || signature,\n ].join('\\n')\n : `The contract function \"${functionName}\" reverted.`,\n {\n cause: cause ?? error,\n metaMessages,\n name: 'ContractFunctionRevertedError',\n },\n )\n\n this.data = decodedData\n this.raw = data\n this.reason = reason\n this.signature = signature\n }\n}\n\nexport type ContractFunctionZeroDataErrorType =\n ContractFunctionZeroDataError & {\n name: 'ContractFunctionZeroDataError'\n }\nexport class ContractFunctionZeroDataError extends BaseError {\n constructor({\n functionName,\n cause,\n }: {\n functionName: string\n cause?: BaseError | Error | undefined\n }) {\n super(`The contract function \"${functionName}\" returned no data (\"0x\").`, {\n metaMessages: [\n 'This could be due to any of the following:',\n ` - The contract does not have the function \"${functionName}\",`,\n ' - The parameters passed to the contract function may be invalid, or',\n ' - The address is not a contract.',\n ],\n name: 'ContractFunctionZeroDataError',\n cause,\n })\n }\n}\n\nexport type CounterfactualDeploymentFailedErrorType =\n CounterfactualDeploymentFailedError & {\n name: 'CounterfactualDeploymentFailedError'\n }\nexport class CounterfactualDeploymentFailedError extends BaseError {\n constructor({ factory }: { factory?: Address | undefined }) {\n super(\n `Deployment for counterfactual contract call failed${\n factory ? ` for factory \"${factory}\".` : ''\n }`,\n {\n metaMessages: [\n 'Please ensure:',\n '- The `factory` is a valid contract deployment factory (ie. Create2 Factory, ERC-4337 Factory, etc).',\n '- The `factoryData` is a valid encoded function call for contract deployment function on the factory.',\n ],\n name: 'CounterfactualDeploymentFailedError',\n },\n )\n }\n}\n\nexport type RawContractErrorType = RawContractError & {\n name: 'RawContractError'\n}\nexport class RawContractError extends BaseError {\n code = 3\n\n data?: Hex | { data?: Hex | undefined } | undefined\n\n constructor({\n data,\n message,\n }: {\n data?: Hex | { data?: Hex | undefined } | undefined\n message?: string | undefined\n }) {\n super(message || '', { name: 'RawContractError' })\n this.data = data\n }\n}\n","import { stringify } from '../utils/stringify.js'\n\nimport { BaseError } from './base.js'\nimport { getUrl } from './utils.js'\n\nexport type HttpRequestErrorType = HttpRequestError & {\n name: 'HttpRequestError'\n}\nexport class HttpRequestError extends BaseError {\n body?: { [x: string]: unknown } | { [y: string]: unknown }[] | undefined\n headers?: Headers | undefined\n status?: number | undefined\n url: string\n\n constructor({\n body,\n cause,\n details,\n headers,\n status,\n url,\n }: {\n body?: { [x: string]: unknown } | { [y: string]: unknown }[] | undefined\n cause?: Error | undefined\n details?: string | undefined\n headers?: Headers | undefined\n status?: number | undefined\n url: string\n }) {\n super('HTTP request failed.', {\n cause,\n details,\n metaMessages: [\n status && `Status: ${status}`,\n `URL: ${getUrl(url)}`,\n body && `Request body: ${stringify(body)}`,\n ].filter(Boolean) as string[],\n name: 'HttpRequestError',\n })\n this.body = body\n this.headers = headers\n this.status = status\n this.url = url\n }\n}\n\nexport type WebSocketRequestErrorType = WebSocketRequestError & {\n name: 'WebSocketRequestError'\n}\nexport class WebSocketRequestError extends BaseError {\n url: string\n constructor({\n body,\n cause,\n details,\n url,\n }: {\n body?: { [key: string]: unknown } | undefined\n cause?: Error | undefined\n details?: string | undefined\n url: string\n }) {\n super('WebSocket request failed.', {\n cause,\n details,\n metaMessages: [\n `URL: ${getUrl(url)}`,\n body && `Request body: ${stringify(body)}`,\n ].filter(Boolean) as string[],\n name: 'WebSocketRequestError',\n })\n this.url = url\n }\n}\n\nexport type RpcRequestErrorType = RpcRequestError & {\n name: 'RpcRequestError'\n}\nexport class RpcRequestError extends BaseError {\n code: number\n data?: unknown\n url: string\n constructor({\n body,\n error,\n url,\n }: {\n body: { [x: string]: unknown } | { [y: string]: unknown }[]\n error: { code: number; data?: unknown; message: string }\n url: string\n }) {\n super('RPC Request failed.', {\n cause: error as any,\n details: error.message,\n metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],\n name: 'RpcRequestError',\n })\n this.code = error.code\n this.data = error.data\n this.url = url\n }\n}\n\nexport type SocketClosedErrorType = SocketClosedError & {\n name: 'SocketClosedError'\n}\nexport class SocketClosedError extends BaseError {\n url: string | undefined\n constructor({\n url,\n }: {\n url?: string | undefined\n } = {}) {\n super('The socket has been closed.', {\n metaMessages: [url && `URL: ${getUrl(url)}`].filter(Boolean) as string[],\n name: 'SocketClosedError',\n })\n this.url = url\n }\n}\n\nexport type TimeoutErrorType = TimeoutError & {\n name: 'TimeoutError'\n}\nexport class TimeoutError extends BaseError {\n url: string\n constructor({\n body,\n url,\n }: {\n body: { [x: string]: unknown } | { [y: string]: unknown }[]\n url: string\n }) {\n super('The request took too long to respond.', {\n details: 'The request timed out.',\n metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],\n name: 'TimeoutError',\n })\n this.url = url\n }\n}\n","import type { Prettify } from '../types/utils.js'\nimport { BaseError } from './base.js'\nimport { RpcRequestError } from './request.js'\n\nconst unknownErrorCode = -1\n\nexport type RpcErrorCode =\n | -1\n | -32700 // Parse error\n | -32600 // Invalid request\n | -32601 // Method not found\n | -32602 // Invalid params\n | -32603 // Internal error\n | -32000 // Invalid input\n | -32001 // Resource not found\n | -32002 // Resource unavailable\n | -32003 // Transaction rejected\n | -32004 // Method not supported\n | -32005 // Limit exceeded\n | -32006 // JSON-RPC version not supported\n | -32042 // Method not found\n\ntype RpcErrorOptions = {\n code?: code | (number & {}) | undefined\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n name?: string | undefined\n shortMessage: string\n}\n\n/**\n * Error subclass implementing JSON RPC 2.0 errors and Ethereum RPC errors per EIP-1474.\n *\n * - EIP https://eips.ethereum.org/EIPS/eip-1474\n */\nexport type RpcErrorType = RpcError & { name: 'RpcError' }\nexport class RpcError extends BaseError {\n code: code_ | (number & {})\n\n constructor(\n cause: Error,\n {\n code,\n docsPath,\n metaMessages,\n name,\n shortMessage,\n }: RpcErrorOptions,\n ) {\n super(shortMessage, {\n cause,\n docsPath,\n metaMessages:\n metaMessages || (cause as { metaMessages?: string[] })?.metaMessages,\n name: name || 'RpcError',\n })\n this.name = name || cause.name\n this.code = (\n cause instanceof RpcRequestError ? cause.code : (code ?? unknownErrorCode)\n ) as code_\n }\n}\n\nexport type ProviderRpcErrorCode =\n | 4001 // User Rejected Request\n | 4100 // Unauthorized\n | 4200 // Unsupported Method\n | 4900 // Disconnected\n | 4901 // Chain Disconnected\n | 4902 // Chain Not Recognized\n | 5700 // Unsupported non-optional capability\n | 5710 // Unsupported chain id\n | 5720 // Duplicate ID\n | 5730 // Unknown bundle id\n | 5740 // Bundle too large\n | 5750 // Atomic-ready wallet rejected upgrade\n | 5760 // Atomicity not supported\n | 7000 // WalletConnect Session Settlement Failed\n\n/**\n * Error subclass implementing Ethereum Provider errors per EIP-1193.\n *\n * - EIP https://eips.ethereum.org/EIPS/eip-1193\n */\nexport type ProviderRpcErrorType = ProviderRpcError & {\n name: 'ProviderRpcError'\n}\nexport class ProviderRpcError<\n T = undefined,\n> extends RpcError {\n data?: T | undefined\n\n constructor(\n cause: Error,\n options: Prettify<\n RpcErrorOptions & {\n data?: T | undefined\n }\n >,\n ) {\n super(cause, options)\n\n this.data = options.data\n }\n}\n\n/**\n * Subclass for a \"Parse error\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type ParseRpcErrorType = ParseRpcError & {\n code: -32700\n name: 'ParseRpcError'\n}\nexport class ParseRpcError extends RpcError {\n static code = -32700 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ParseRpcError.code,\n name: 'ParseRpcError',\n shortMessage:\n 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.',\n })\n }\n}\n\n/**\n * Subclass for a \"Invalid request\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InvalidRequestRpcErrorType = InvalidRequestRpcError & {\n code: -32600\n name: 'InvalidRequestRpcError'\n}\nexport class InvalidRequestRpcError extends RpcError {\n static code = -32600 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InvalidRequestRpcError.code,\n name: 'InvalidRequestRpcError',\n shortMessage: 'JSON is not a valid request object.',\n })\n }\n}\n\n/**\n * Subclass for a \"Method not found\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type MethodNotFoundRpcErrorType = MethodNotFoundRpcError & {\n code: -32601\n name: 'MethodNotFoundRpcError'\n}\nexport class MethodNotFoundRpcError extends RpcError {\n static code = -32601 as const\n\n constructor(cause: Error, { method }: { method?: string } = {}) {\n super(cause, {\n code: MethodNotFoundRpcError.code,\n name: 'MethodNotFoundRpcError',\n shortMessage: `The method${method ? ` \"${method}\"` : ''} does not exist / is not available.`,\n })\n }\n}\n\n/**\n * Subclass for an \"Invalid params\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InvalidParamsRpcErrorType = InvalidParamsRpcError & {\n code: -32602\n name: 'InvalidParamsRpcError'\n}\nexport class InvalidParamsRpcError extends RpcError {\n static code = -32602 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InvalidParamsRpcError.code,\n name: 'InvalidParamsRpcError',\n shortMessage: [\n 'Invalid parameters were provided to the RPC method.',\n 'Double check you have provided the correct parameters.',\n ].join('\\n'),\n })\n }\n}\n\n/**\n * Subclass for an \"Internal error\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InternalRpcErrorType = InternalRpcError & {\n code: -32603\n name: 'InternalRpcError'\n}\nexport class InternalRpcError extends RpcError {\n static code = -32603 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InternalRpcError.code,\n name: 'InternalRpcError',\n shortMessage: 'An internal error was received.',\n })\n }\n}\n\n/**\n * Subclass for an \"Invalid input\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InvalidInputRpcErrorType = InvalidInputRpcError & {\n code: -32000\n name: 'InvalidInputRpcError'\n}\nexport class InvalidInputRpcError extends RpcError {\n static code = -32000 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InvalidInputRpcError.code,\n name: 'InvalidInputRpcError',\n shortMessage: [\n 'Missing or invalid parameters.',\n 'Double check you have provided the correct parameters.',\n ].join('\\n'),\n })\n }\n}\n\n/**\n * Subclass for a \"Resource not found\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type ResourceNotFoundRpcErrorType = ResourceNotFoundRpcError & {\n code: -32001\n name: 'ResourceNotFoundRpcError'\n}\nexport class ResourceNotFoundRpcError extends RpcError {\n override name = 'ResourceNotFoundRpcError'\n static code = -32001 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ResourceNotFoundRpcError.code,\n name: 'ResourceNotFoundRpcError',\n shortMessage: 'Requested resource not found.',\n })\n }\n}\n\n/**\n * Subclass for a \"Resource unavailable\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type ResourceUnavailableRpcErrorType = ResourceUnavailableRpcError & {\n code: -32002\n name: 'ResourceUnavailableRpcError'\n}\nexport class ResourceUnavailableRpcError extends RpcError {\n static code = -32002 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ResourceUnavailableRpcError.code,\n name: 'ResourceUnavailableRpcError',\n shortMessage: 'Requested resource not available.',\n })\n }\n}\n\n/**\n * Subclass for a \"Transaction rejected\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type TransactionRejectedRpcErrorType = TransactionRejectedRpcError & {\n code: -32003\n name: 'TransactionRejectedRpcError'\n}\nexport class TransactionRejectedRpcError extends RpcError {\n static code = -32003 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: TransactionRejectedRpcError.code,\n name: 'TransactionRejectedRpcError',\n shortMessage: 'Transaction creation failed.',\n })\n }\n}\n\n/**\n * Subclass for a \"Method not supported\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type MethodNotSupportedRpcErrorType = MethodNotSupportedRpcError & {\n code: -32004\n name: 'MethodNotSupportedRpcError'\n}\nexport class MethodNotSupportedRpcError extends RpcError {\n static code = -32004 as const\n\n constructor(cause: Error, { method }: { method?: string } = {}) {\n super(cause, {\n code: MethodNotSupportedRpcError.code,\n name: 'MethodNotSupportedRpcError',\n shortMessage: `Method${method ? ` \"${method}\"` : ''} is not supported.`,\n })\n }\n}\n\n/**\n * Subclass for a \"Limit exceeded\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type LimitExceededRpcErrorType = LimitExceededRpcError & {\n code: -32005\n name: 'LimitExceededRpcError'\n}\nexport class LimitExceededRpcError extends RpcError {\n static code = -32005 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: LimitExceededRpcError.code,\n name: 'LimitExceededRpcError',\n shortMessage: 'Request exceeds defined limit.',\n })\n }\n}\n\n/**\n * Subclass for a \"JSON-RPC version not supported\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type JsonRpcVersionUnsupportedErrorType =\n JsonRpcVersionUnsupportedError & {\n code: -32006\n name: 'JsonRpcVersionUnsupportedError'\n }\nexport class JsonRpcVersionUnsupportedError extends RpcError {\n static code = -32006 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: JsonRpcVersionUnsupportedError.code,\n name: 'JsonRpcVersionUnsupportedError',\n shortMessage: 'Version of JSON-RPC protocol is not supported.',\n })\n }\n}\n\n/**\n * Subclass for a \"User Rejected Request\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type UserRejectedRequestErrorType = UserRejectedRequestError & {\n code: 4001\n name: 'UserRejectedRequestError'\n}\nexport class UserRejectedRequestError extends ProviderRpcError {\n static code = 4001 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UserRejectedRequestError.code,\n name: 'UserRejectedRequestError',\n shortMessage: 'User rejected the request.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unauthorized\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type UnauthorizedProviderErrorType = UnauthorizedProviderError & {\n code: 4100\n name: 'UnauthorizedProviderError'\n}\nexport class UnauthorizedProviderError extends ProviderRpcError {\n static code = 4100 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnauthorizedProviderError.code,\n name: 'UnauthorizedProviderError',\n shortMessage:\n 'The requested method and/or account has not been authorized by the user.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unsupported Method\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type UnsupportedProviderMethodErrorType =\n UnsupportedProviderMethodError & {\n code: 4200\n name: 'UnsupportedProviderMethodError'\n }\nexport class UnsupportedProviderMethodError extends ProviderRpcError {\n static code = 4200 as const\n\n constructor(cause: Error, { method }: { method?: string } = {}) {\n super(cause, {\n code: UnsupportedProviderMethodError.code,\n name: 'UnsupportedProviderMethodError',\n shortMessage: `The Provider does not support the requested method${method ? ` \" ${method}\"` : ''}.`,\n })\n }\n}\n\n/**\n * Subclass for an \"Disconnected\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type ProviderDisconnectedErrorType = ProviderDisconnectedError & {\n code: 4900\n name: 'ProviderDisconnectedError'\n}\nexport class ProviderDisconnectedError extends ProviderRpcError {\n static code = 4900 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ProviderDisconnectedError.code,\n name: 'ProviderDisconnectedError',\n shortMessage: 'The Provider is disconnected from all chains.',\n })\n }\n}\n\n/**\n * Subclass for an \"Chain Disconnected\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type ChainDisconnectedErrorType = ChainDisconnectedError & {\n code: 4901\n name: 'ChainDisconnectedError'\n}\nexport class ChainDisconnectedError extends ProviderRpcError {\n static code = 4901 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ChainDisconnectedError.code,\n name: 'ChainDisconnectedError',\n shortMessage: 'The Provider is not connected to the requested chain.',\n })\n }\n}\n\n/**\n * Subclass for an \"Switch Chain\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type SwitchChainErrorType = SwitchChainError & {\n code: 4902\n name: 'SwitchChainError'\n}\nexport class SwitchChainError extends ProviderRpcError {\n static code = 4902 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: SwitchChainError.code,\n name: 'SwitchChainError',\n shortMessage: 'An error occurred when attempting to switch chain.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unsupported non-optional capability\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type UnsupportedNonOptionalCapabilityErrorType =\n UnsupportedNonOptionalCapabilityError & {\n code: 5700\n name: 'UnsupportedNonOptionalCapabilityError'\n }\nexport class UnsupportedNonOptionalCapabilityError extends ProviderRpcError {\n static code = 5700 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnsupportedNonOptionalCapabilityError.code,\n name: 'UnsupportedNonOptionalCapabilityError',\n shortMessage:\n 'This Wallet does not support a capability that was not marked as optional.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unsupported chain id\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type UnsupportedChainIdErrorType = UnsupportedChainIdError & {\n code: 5710\n name: 'UnsupportedChainIdError'\n}\nexport class UnsupportedChainIdError extends ProviderRpcError {\n static code = 5710 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnsupportedChainIdError.code,\n name: 'UnsupportedChainIdError',\n shortMessage: 'This Wallet does not support the requested chain ID.',\n })\n }\n}\n\n/**\n * Subclass for an \"Duplicate ID\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type DuplicateIdErrorType = DuplicateIdError & {\n code: 5720\n name: 'DuplicateIdError'\n}\nexport class DuplicateIdError extends ProviderRpcError {\n static code = 5720 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: DuplicateIdError.code,\n name: 'DuplicateIdError',\n shortMessage: 'There is already a bundle submitted with this ID.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unknown bundle ID\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type UnknownBundleIdErrorType = UnknownBundleIdError & {\n code: 5730\n name: 'UnknownBundleIdError'\n}\nexport class UnknownBundleIdError extends ProviderRpcError {\n static code = 5730 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnknownBundleIdError.code,\n name: 'UnknownBundleIdError',\n shortMessage: 'This bundle id is unknown / has not been submitted',\n })\n }\n}\n\n/**\n * Subclass for an \"Bundle too large\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type BundleTooLargeErrorType = BundleTooLargeError & {\n code: 5740\n name: 'BundleTooLargeError'\n}\nexport class BundleTooLargeError extends ProviderRpcError {\n static code = 5740 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: BundleTooLargeError.code,\n name: 'BundleTooLargeError',\n shortMessage: 'The call bundle is too large for the Wallet to process.',\n })\n }\n}\n\n/**\n * Subclass for an \"Atomic-ready wallet rejected upgrade\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type AtomicReadyWalletRejectedUpgradeErrorType =\n AtomicReadyWalletRejectedUpgradeError & {\n code: 5750\n name: 'AtomicReadyWalletRejectedUpgradeError'\n }\nexport class AtomicReadyWalletRejectedUpgradeError extends ProviderRpcError {\n static code = 5750 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: AtomicReadyWalletRejectedUpgradeError.code,\n name: 'AtomicReadyWalletRejectedUpgradeError',\n shortMessage:\n 'The Wallet can support atomicity after an upgrade, but the user rejected the upgrade.',\n })\n }\n}\n\n/**\n * Subclass for an \"Atomicity not supported\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type AtomicityNotSupportedErrorType = AtomicityNotSupportedError & {\n code: 5760\n name: 'AtomicityNotSupportedError'\n}\nexport class AtomicityNotSupportedError extends ProviderRpcError {\n static code = 5760 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: AtomicityNotSupportedError.code,\n name: 'AtomicityNotSupportedError',\n shortMessage:\n 'The wallet does not support atomic execution but the request requires it.',\n })\n }\n}\n\n/**\n * Subclass for a \"Session Settlement Failed\" WalletConnect error.\n *\n * WalletConnect https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes\n */\nexport type WalletConnectSessionSettlementErrorType =\n WalletConnectSessionSettlementError & {\n code: 7000\n name: 'WalletConnectSessionSettlementError'\n }\nexport class WalletConnectSessionSettlementError extends ProviderRpcError {\n static code = 7000 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: WalletConnectSessionSettlementError.code,\n name: 'WalletConnectSessionSettlementError',\n shortMessage: 'WalletConnect session settlement failed.',\n })\n }\n}\n\n/**\n * Subclass for an unknown RPC error.\n */\nexport type UnknownRpcErrorType = UnknownRpcError & {\n name: 'UnknownRpcError'\n}\nexport class UnknownRpcError extends RpcError {\n constructor(cause: Error) {\n super(cause, {\n name: 'UnknownRpcError',\n shortMessage: 'An unknown RPC error occurred.',\n })\n }\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport {\n type ChecksumAddressErrorType,\n checksumAddress,\n} from '../../utils/address/getAddress.js'\nimport {\n type Keccak256ErrorType,\n keccak256,\n} from '../../utils/hash/keccak256.js'\n\nexport type PublicKeyToAddressErrorType =\n | ChecksumAddressErrorType\n | Keccak256ErrorType\n | ErrorType\n\n/**\n * @description Converts an ECDSA public key to an address.\n *\n * @param publicKey The public key to convert.\n *\n * @returns The address.\n */\nexport function publicKeyToAddress(publicKey: Hex): Address {\n const address = keccak256(`0x${publicKey.substring(4)}`).substring(26)\n return checksumAddress(`0x${address}`) as Address\n}\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n view: DataView,\n byteOffset: number,\n value: bigint,\n isLE: boolean\n): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\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> extends Hash {\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 super();\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: Input): this {\n aexists(this);\n data = toBytes(data);\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 setBigUint64(view, 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 should be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen should 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;\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://datatracker.ietf.org/doc/html/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, 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);\nexport class SHA256 extends HashMD {\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\n constructor(outputLen: number = 32) {\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\nexport class SHA224 extends SHA256 {\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\nexport class SHA512 extends HashMD {\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 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(outputLen: number = 64) {\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\nexport class SHA384 extends SHA512 {\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\nexport class SHA512_224 extends SHA512 {\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\nexport class SHA512_256 extends SHA512 {\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.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256: CHash = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash = /* @__PURE__ */ createHasher(() => new SHA224());\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash = /* @__PURE__ */ createHasher(() => new SHA384());\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 = /* @__PURE__ */ createHasher(() => new SHA512_256());\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 = /* @__PURE__ */ createHasher(() => new SHA512_224());\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, Hash, toBytes, type CHash, type Input } from './utils.ts';\n\nexport class HMAC> extends Hash> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, _key: Input) {\n super();\n ahash(hash);\n const key = toBytes(_key);\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Input): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: HMAC): HMAC {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): HMAC {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Input, message: Input): Uint8Array;\n create(hash: CHash, key: Input): HMAC;\n} = (hash: CHash, key: Input, message: Input): Uint8Array =>\n new HMAC(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Input) => new HMAC(hash, key);\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// 100 lines of code in the file are duplicated from noble-hashes (utils).\n// This is OK: `abstract` directory does not use noble-hashes.\n// User may opt-in into using different hashing library. This way, noble-hashes\n// won't be included into their bundle.\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n (message: Uint8Array | string): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\nexport function abytes(item: unknown): void {\n if (!isBytes(item)) throw new Error('Uint8Array expected');\n}\n\nexport function abool(title: string, value: boolean): void {\n if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean =\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// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n abytes(bytes);\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'private key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n let res: Uint8Array;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes(hex);\n } catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n } else if (isBytes(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n } else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\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\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n// Global symbols in both browsers and Node.js since v11\n// See https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([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// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\nconst u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\nconst u8fr = (arr: ArrayLike) => Uint8Array.from(arr); // another shortcut\ntype Pred = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred) => T {\n if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8fr([0x00]), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(u8fr([0x01]), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n bigint: (val: any): boolean => typeof val === 'bigint',\n function: (val: any): boolean => typeof val === 'function',\n boolean: (val: any): boolean => typeof val === 'boolean',\n string: (val: any): boolean => typeof val === 'string',\n stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes(val),\n isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n array: (val: any): boolean => Array.isArray(val),\n field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap> = { [K in keyof T]?: Validator };\n// type Record = { [P in K]: T; }\n\nexport function validateObject>(\n object: T,\n validators: ValMap,\n optValidators: ValMap = {}\n): T {\n const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n const val = object[fieldName as keyof typeof object];\n if (isOptional && val === undefined) return;\n if (!checkVal(val, object)) {\n throw new Error(\n 'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n );\n }\n };\n for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n","/**\n * Utils for modular division and finite fields.\n * A finite field over 11 is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { anumber } from '@noble/hashes/utils';\nimport {\n bitMask,\n bytesToNumberBE,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from './utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _8n = /* @__PURE__ */ BigInt(8);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * TODO: remove.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp: IField, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n // Throw if root^2 != n\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\nfunction sqrt5mod8(Fp: IField, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\n// TODO: Commented-out for now. Provide test vectors.\n// Tonelli is too slow for extension fields Fp2.\n// That means we can't use sqrt (c1, c2...) even for initialization constants.\n// if (P % _16n === _9n) return sqrt9mod16;\n// // prettier-ignore\n// function sqrt9mod16(Fp: IField, n: T, p7div16?: bigint) {\n// if (p7div16 === undefined) p7div16 = (Fp.ORDER + BigInt(7)) / _16n;\n// const c1 = Fp.sqrt(Fp.neg(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n// const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n// const c3 = Fp.sqrt(Fp.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n// const c4 = p7div16; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n// let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n// let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1\n// const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1\n// let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1\n// const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n// const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n// tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n// tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n// const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n// return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2\n// }\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): (Fp: IField, n: T) => T {\n // Initialization (precomputation).\n if (P < BigInt(3)) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp: IField, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): (Fp: IField, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) not implemented, see above\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField {\n ORDER: bigint;\n isLE: boolean;\n BYTES: number;\n BITS: number;\n MASK: bigint;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField(field: IField): IField {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'isSafeInteger',\n BITS: 'isSafeInteger',\n } as Record;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n return validateObject(field, opts);\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp: IField, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp: IField, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv(Fp: IField, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp: IField, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp: IField, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\n// CURVE.n lengths\nexport function nLength(\n n: bigint,\n nBitLength?: number\n): {\n nBitLength: number;\n nByteLength: number;\n} {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField & Required, 'isOdd'>>;\n/**\n * Initializes a finite field over prime.\n * Major performance optimizations:\n * * a) denormalized operations like mulN instead of mul\n * * b) same object shape: never add or remove keys\n * * c) Object.freeze\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n * @param ORDER prime positive bigint\n * @param bitLen how many bits the field consumes\n * @param isLE (def: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n ORDER: bigint,\n bitLen?: number,\n isLE = false,\n redef: Partial> = {}\n): Readonly {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen);\n if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP: ReturnType; // cached sqrtP\n const f: Readonly = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n\n inv: (num) => invert(num, ORDER),\n sqrt:\n redef.sqrt ||\n ((n) => {\n if (!sqrtP) sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes) => {\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n } as FpField);\n return Object.freeze(f);\n}\n\nexport function FpSqrtOdd(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n hash: string | Uint8Array,\n groupOrder: bigint,\n isLE = false\n): bigint {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(\n 'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n );\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type IField, nLength, validateField } from './modular.ts';\nimport { bitLen, bitMask, validateObject } from './utils.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint = {\n x: T;\n y: T;\n} & { z?: never; t?: never };\n\nexport interface Group> {\n double(): T;\n negate(): T;\n add(other: T): T;\n subtract(other: T): T;\n equals(other: T): boolean;\n multiply(scalar: bigint): T;\n}\n\nexport type GroupConstructor = {\n BASE: T;\n ZERO: T;\n};\nexport type Mapper = (i: T[]) => T[];\n\nfunction constTimeNegate>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\n\nfunction getW(P: any): number {\n return pointWindowSizes.get(P) || 1;\n}\n\nexport type IWNAF> = {\n constTimeNegate: >(condition: boolean, item: T) => T;\n hasPrecomputes(elm: T): boolean;\n unsafeLadder(elm: T, n: bigint, p?: T): T;\n precomputeWindow(elm: T, W: number): Group[];\n getPrecomputes(W: number, P: T, transform: Mapper): T[];\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T };\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc?: T): T;\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T };\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T;\n setWindowSize(P: T, W: number): void;\n};\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport function wNAF>(c: GroupConstructor, bits: number): IWNAF {\n return {\n constTimeNegate,\n\n hasPrecomputes(elm: T) {\n return getW(elm) !== 1;\n },\n\n // non-const time multiplication ladder\n unsafeLadder(elm: T, n: bigint, p = c.ZERO) {\n let d: T = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n },\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param elm Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(elm: T, W: number): Group[] {\n const { windows, windowSize } = calcWOpts(W, bits);\n const points: T[] = [];\n let p: T = elm;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n },\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @returns real and fake (for const-time) points\n */\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T } {\n // Smaller version:\n // https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n // TODO: check the scalar is less than group order?\n // wNAF behavior is undefined otherwise. But have to carefully remove\n // other checks before wNAF. ORDER == bits here.\n // Accumulators\n let p = c.ZERO;\n let f = c.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(constTimeNegate(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(constTimeNegate(isNeg, precomputes[offset]));\n }\n }\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n },\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc: T = c.ZERO): T {\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n return acc;\n },\n\n getPrecomputes(W: number, P: T, transform: Mapper): T[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(P);\n if (!comp) {\n comp = this.precomputeWindow(P, W) as T[];\n if (W !== 1) pointPrecomputes.set(P, transform(comp));\n }\n return comp;\n },\n\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T } {\n const W = getW(P);\n return this.wNAF(W, this.getPrecomputes(W, P, transform), n);\n },\n\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T {\n const W = getW(P);\n if (W === 1) return this.unsafeLadder(P, n, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, P, transform), n, prev);\n },\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n\n setWindowSize(P: T, W: number) {\n validateW(W, bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n },\n };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka private keys / bigints)\n */\nexport function pippenger>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n scalars: bigint[]\n): T {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as T;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n windowSize: number\n): (scalars: bigint[]) => T {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: T) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): T => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve = {\n Fp: IField; // Field over which we'll do calculations (Fp)\n n: bigint; // Curve order, total count of valid points in the field\n nBitLength?: number; // bit length of curve order\n nByteLength?: number; // byte length of curve order\n h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n hEff?: bigint; // Number to multiply to clear cofactor\n Gx: T; // base point X coordinate\n Gy: T; // base point Y coordinate\n allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\nexport function validateBasic(\n curve: BasicCurve & T\n): Readonly<\n {\n readonly nBitLength: number;\n readonly nByteLength: number;\n } & BasicCurve &\n T & {\n p: bigint;\n }\n> {\n validateField(curve.Fp);\n validateObject(\n curve,\n {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n },\n {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n }\n );\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n } as const);\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Parameters\n *\n * To initialize a weierstrass curve, one needs to pass following params:\n *\n * * a: formula param\n * * b: formula param\n * * Fp: finite field of prime characteristic P; may be complex (Fp2). Arithmetics is done in field\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * Gx: Base point (x, y) aka generator point. Gx = x coordinate\n * * Gy: ...y coordinate\n * * h: cofactor, usually 1. h*n = curve group order (n is only subgroup order)\n * * lowS: whether to enable (default) or disable \"low-s\" non-malleable signatures\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// prettier-ignore\nimport {\n pippenger, validateBasic, wNAF,\n type AffinePoint, type BasicCurve, type Group, type GroupConstructor\n} from './curve.ts';\n// prettier-ignore\nimport {\n Field,\n FpInvertBatch,\n getMinHashLength, invert, mapHashToField, mod, validateField,\n type IField\n} from './modular.ts';\n// prettier-ignore\nimport {\n aInRange, abool,\n bitMask,\n bytesToHex, bytesToNumberBE, concatBytes, createHmacDrbg, ensureBytes, hexToBytes,\n inRange, isBytes, memoized, numberToBytesBE, numberToHexUnpadded, validateObject,\n type CHash, type Hex, type PrivKey\n} from './utils.ts';\n\nexport type { AffinePoint };\ntype HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n splitScalar: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\nexport type BasicWCurve = BasicCurve & {\n // Params: a, b\n a: T;\n b: T;\n\n // Optional params\n allowedPrivateKeyLengths?: readonly number[]; // for P521\n wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n endo?: EndomorphismOpts;\n // When a cofactor != 1, there can be an effective methods to:\n // 1. Determine whether a point is torsion-free\n isTorsionFree?: (c: ProjConstructor, point: ProjPointType) => boolean;\n // 2. Clear torsion component\n clearCofactor?: (c: ProjConstructor, point: ProjPointType) => ProjPointType;\n};\n\nexport type Entropy = Hex | boolean;\nexport type SignOpts = { lowS?: boolean; extraEntropy?: Entropy; prehash?: boolean };\nexport type VerOpts = { lowS?: boolean; prehash?: boolean; format?: 'compact' | 'der' | undefined };\n\nfunction validateSigVerOpts(opts: SignOpts | VerOpts) {\n if (opts.lowS !== undefined) abool('lowS', opts.lowS);\n if (opts.prehash !== undefined) abool('prehash', opts.prehash);\n}\n\n// Instance for 3d XYZ points\nexport interface ProjPointType extends Group> {\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n get x(): T;\n get y(): T;\n toAffine(iz?: T): AffinePoint;\n toHex(isCompressed?: boolean): string;\n toRawBytes(isCompressed?: boolean): Uint8Array;\n\n assertValidity(): void;\n hasEvenY(): boolean;\n multiplyUnsafe(scalar: bigint): ProjPointType;\n multiplyAndAddUnsafe(Q: ProjPointType, a: bigint, b: bigint): ProjPointType | undefined;\n isTorsionFree(): boolean;\n clearCofactor(): ProjPointType;\n _setWindowSize(windowSize: number): void;\n}\n// Static methods for 3d XYZ points\nexport interface ProjConstructor extends GroupConstructor> {\n new (x: T, y: T, z: T): ProjPointType;\n fromAffine(p: AffinePoint): ProjPointType;\n fromHex(hex: Hex): ProjPointType;\n fromPrivateKey(privateKey: PrivKey): ProjPointType;\n normalizeZ(points: ProjPointType[]): ProjPointType[];\n msm(points: ProjPointType[], scalars: bigint[]): ProjPointType;\n}\n\nexport type CurvePointsType = BasicWCurve & {\n // Bytes\n fromBytes?: (bytes: Uint8Array) => AffinePoint;\n toBytes?: (c: ProjConstructor, point: ProjPointType, isCompressed: boolean) => Uint8Array;\n};\n\nexport type CurvePointsTypeWithLength = Readonly<\n CurvePointsType & { nByteLength: number; nBitLength: number }\n>;\n\nfunction validatePointOpts(curve: CurvePointsType): CurvePointsTypeWithLength {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n a: 'field',\n b: 'field',\n },\n {\n allowInfinityPoint: 'boolean',\n allowedPrivateKeyLengths: 'array',\n clearCofactor: 'function',\n fromBytes: 'function',\n isTorsionFree: 'function',\n toBytes: 'function',\n wrapPrivateKey: 'boolean',\n }\n );\n const { endo, Fp, a } = opts;\n if (endo) {\n if (!Fp.eql(a, Fp.ZERO)) {\n throw new Error('invalid endo: CURVE.a must be 0');\n }\n if (\n typeof endo !== 'object' ||\n typeof endo.beta !== 'bigint' ||\n typeof endo.splitScalar !== 'function'\n ) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"splitScalar\": function');\n }\n }\n return Object.freeze({ ...opts } as const);\n}\n\nexport type CurvePointsRes = {\n CURVE: ReturnType>;\n ProjectivePoint: ProjConstructor;\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n weierstrassEquation: (x: T) => T;\n isWithinCurveOrder: (num: bigint) => boolean;\n};\n\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\nfunction numToSizedHex(num: bigint, size: number): string {\n return bytesToHex(numberToBytesBE(num, size));\n}\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function weierstrassPoints(opts: CurvePointsType): CurvePointsRes {\n const CURVE = validatePointOpts(opts);\n const { Fp } = CURVE; // All curves has same field / group length as for now, but they can differ\n const Fn = Field(CURVE.n, CURVE.nBitLength);\n\n const toBytes =\n CURVE.toBytes ||\n ((_c: ProjConstructor, point: ProjPointType, _isCompressed: boolean) => {\n const a = point.toAffine();\n return concatBytes(Uint8Array.from([0x04]), Fp.toBytes(a.x), Fp.toBytes(a.y));\n });\n const fromBytes =\n CURVE.fromBytes ||\n ((bytes: Uint8Array) => {\n // const head = bytes[0];\n const tail = bytes.subarray(1);\n // if (head !== 0x04) throw new Error('Only non-compressed encoding is supported');\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n });\n\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x: T): T {\n const { a, b } = CURVE;\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n // Valid group elements reside in range 1..n-1\n function isWithinCurveOrder(num: bigint): boolean {\n return inRange(num, _1n, CURVE.n);\n }\n // Validates if priv key is valid and converts it to bigint.\n // Supports options allowedPrivateKeyLengths and wrapPrivateKey.\n function normPrivateKeyToScalar(key: PrivKey): bigint {\n const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n: N } = CURVE;\n if (lengths && typeof key !== 'bigint') {\n if (isBytes(key)) key = bytesToHex(key);\n // Normalize to hex string, pad. E.g. P521 would norm 130-132 char hex to 132-char bytes\n if (typeof key !== 'string' || !lengths.includes(key.length))\n throw new Error('invalid private key');\n key = key.padStart(nByteLength * 2, '0');\n }\n let num: bigint;\n try {\n num =\n typeof key === 'bigint'\n ? key\n : bytesToNumberBE(ensureBytes('private key', key, nByteLength));\n } catch (error) {\n throw new Error(\n 'invalid private key, expected hex or ' + nByteLength + ' bytes, got ' + typeof key\n );\n }\n if (wrapPrivateKey) num = mod(num, N); // disabled by default, enabled for BLS\n aInRange('private key', num, _1n, N); // num in range [1..N-1]\n return num;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint => {\n const { px: x, py: y, pz: z } = p;\n // Fast-path for normalized points\n if (Fp.eql(z, Fp.ONE)) return { x, y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(z);\n const ax = Fp.mul(x, iz);\n const ay = Fp.mul(y, iz);\n const zz = Fp.mul(z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x: ax, y: ay };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (CURVE.allowInfinityPoint && !Fp.is0(p.py)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n // Check if x, y are valid field elements\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not FE');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates: (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n * Default Point works in 2d / affine coordinates: (x, y)\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements ProjPointType {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n\n constructor(px: T, py: T, pz: T) {\n if (px == null || !Fp.isValid(px)) throw new Error('x required');\n if (py == null || !Fp.isValid(py) || Fp.is0(py)) throw new Error('y required');\n if (pz == null || !Fp.isValid(pz)) throw new Error('z required');\n this.px = px;\n this.py = py;\n this.pz = pz;\n Object.freeze(this);\n }\n\n // Does not validate if the point is on-curve.\n // Use fromHex instead, or call assertValidity() later.\n static fromAffine(p: AffinePoint): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n const is0 = (i: T) => Fp.eql(i, Fp.ZERO);\n // fromAffine(x:0, y:0) would produce (x:0, y:0, z:1), but we need (x:0, y:1, z:0)\n if (is0(x) && is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\n static normalizeZ(points: Point[]): Point[] {\n const toInv = FpInvertBatch(\n Fp,\n points.map((p) => p.pz)\n );\n return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);\n }\n\n /**\n * Converts hash string or Uint8Array to Point.\n * @param hex short/long ECDSA hex\n */\n static fromHex(hex: Hex): Point {\n const P = Point.fromAffine(fromBytes(ensureBytes('pointHex', hex)));\n P.assertValidity();\n return P;\n }\n\n // Multiplies generator point by privateKey.\n static fromPrivateKey(privateKey: PrivKey) {\n return Point.BASE.multiply(normPrivateKeyToScalar(privateKey));\n }\n\n // Multiscalar Multiplication\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n\n // \"Private method\", don't use it directly\n _setWindowSize(windowSize: number) {\n wnaf.setWindowSize(this, windowSize);\n }\n\n // A point on curve is valid if it conforms to equation.\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (Fp.isOdd) return !Fp.isOdd(y);\n throw new Error(\"Field doesn't support isOdd\");\n }\n\n /**\n * Compare one point to another.\n */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /**\n * Flips point to one corresponding to (x, -y) in Affine coordinates.\n */\n negate(): Point {\n return new Point(this.px, Fp.neg(this.py), this.pz);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { px: X1, py: Y1, pz: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0() {\n return this.equals(Point.ZERO);\n }\n\n private wNAF(n: bigint): { p: Point; f: Point } {\n return wnaf.wNAFCached(this, n, Point.normalizeZ);\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed private key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', sc, _0n, N);\n const I = Point.ZERO;\n if (sc === _0n) return I;\n if (this.is0() || sc === _1n) return this;\n\n // Case a: no endomorphism. Case b: has precomputes.\n if (!endo || wnaf.hasPrecomputes(this))\n return wnaf.wNAFCachedUnsafe(this, sc, Point.normalizeZ);\n\n // Case c: endomorphism\n /** See docs for {@link EndomorphismOpts} */\n let { k1neg, k1, k2neg, k2 } = endo.splitScalar(sc);\n let k1p = I;\n let k2p = I;\n let d: Point = this;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) k1p = k1p.add(d);\n if (k2 & _1n) k2p = k2p.add(d);\n d = d.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n if (k1neg) k1p = k1p.negate();\n if (k2neg) k2p = k2p.negate();\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n return k1p.add(k2p);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', scalar, _1n, N);\n let point: Point, fake: Point; // Fake point is used to const-time mult\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = endo.splitScalar(scalar);\n let { p: k1p, f: f1p } = this.wNAF(k1);\n let { p: k2p, f: f2p } = this.wNAF(k2);\n k1p = wnaf.constTimeNegate(k1neg, k1p);\n k2p = wnaf.constTimeNegate(k2neg, k2p);\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n point = k1p.add(k2p);\n fake = f1p.add(f2p);\n } else {\n const { p, f } = this.wNAF(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return Point.normalizeZ([point, fake])[0];\n }\n\n /**\n * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly.\n * Not using Strauss-Shamir trick: precomputation tables are faster.\n * The trick could be useful if both P and Q are not G (not in our case).\n * @returns non-zero affine point\n */\n multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n const G = Point.BASE; // No Strauss-Shamir trick: we have 10% faster G precomputes\n const mul = (\n P: Point,\n a: bigint // Select faster multiply() method\n ) => (a === _0n || a === _1n || !P.equals(G) ? P.multiplyUnsafe(a) : P.multiply(a));\n const sum = mul(this, a).add(mul(Q, b));\n return sum.is0() ? undefined : sum;\n }\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (x, y, z) ∋ (x=x/z, y=y/z)\n toAffine(iz?: T): AffinePoint {\n return toAffineMemo(this, iz);\n }\n isTorsionFree(): boolean {\n const { h: cofactor, isTorsionFree } = CURVE;\n if (cofactor === _1n) return true; // No subgroups, always torsion-free\n if (isTorsionFree) return isTorsionFree(Point, this);\n throw new Error('isTorsionFree() has not been declared for the elliptic curve');\n }\n clearCofactor(): Point {\n const { h: cofactor, clearCofactor } = CURVE;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(CURVE.h);\n }\n\n toRawBytes(isCompressed = true): Uint8Array {\n abool('isCompressed', isCompressed);\n this.assertValidity();\n return toBytes(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n abool('isCompressed', isCompressed);\n return bytesToHex(this.toRawBytes(isCompressed));\n }\n }\n const { endo, nBitLength } = CURVE;\n const wnaf = wNAF(Point, endo ? Math.ceil(nBitLength / 2) : nBitLength);\n return {\n CURVE,\n ProjectivePoint: Point as ProjConstructor,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n };\n}\n\n// Instance\nexport interface SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n assertValidity(): void;\n addRecoveryBit(recovery: number): RecoveredSignatureType;\n hasHighS(): boolean;\n normalizeS(): SignatureType;\n recoverPublicKey(msgHash: Hex): ProjPointType;\n toCompactRawBytes(): Uint8Array;\n toCompactHex(): string;\n toDERRawBytes(isCompressed?: boolean): Uint8Array;\n toDERHex(isCompressed?: boolean): string;\n}\nexport type RecoveredSignatureType = SignatureType & {\n readonly recovery: number;\n};\n// Static methods\nexport type SignatureConstructor = {\n new (r: bigint, s: bigint): SignatureType;\n fromCompact(hex: Hex): SignatureType;\n fromDER(hex: Hex): SignatureType;\n};\ntype SignatureLike = { r: bigint; s: bigint };\n\nexport type PubKey = Hex | ProjPointType;\n\nexport type CurveType = BasicWCurve & {\n hash: CHash; // CHash not FHash because we need outputLen for DRBG\n hmac: HmacFnSync;\n randomBytes: (bytesLength?: number) => Uint8Array;\n lowS?: boolean;\n bits2int?: (bytes: Uint8Array) => bigint;\n bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\n\nfunction validateOpts(\n curve: CurveType\n): Readonly {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n hash: 'hash',\n hmac: 'function',\n randomBytes: 'function',\n },\n {\n bits2int: 'function',\n bits2int_modN: 'function',\n lowS: 'boolean',\n }\n );\n return Object.freeze({ lowS: true, ...opts } as const);\n}\n\nexport type CurveFn = {\n CURVE: ReturnType;\n getPublicKey: (privateKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (privateA: PrivKey, publicB: Hex, isCompressed?: boolean) => Uint8Array;\n sign: (msgHash: Hex, privKey: PrivKey, opts?: SignOpts) => RecoveredSignatureType;\n verify: (signature: Hex | SignatureLike, msgHash: Hex, publicKey: Hex, opts?: VerOpts) => boolean;\n ProjectivePoint: ProjConstructor;\n Signature: SignatureConstructor;\n utils: {\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n isValidPrivateKey(privateKey: PrivKey): boolean;\n randomPrivateKey: () => Uint8Array;\n precompute: (windowSize?: number, point?: ProjPointType) => ProjPointType;\n };\n};\n\n/**\n * Creates short weierstrass curve and ECDSA signature methods for it.\n * @example\n * import { Field } from '@noble/curves/abstract/modular';\n * // Before that, define BigInt-s: a, b, p, n, Gx, Gy\n * const curve = weierstrass({ a, b, Fp: Field(p), n, Gx, Gy, h: 1n })\n */\nexport function weierstrass(curveDef: CurveType): CurveFn {\n const CURVE = validateOpts(curveDef) as ReturnType;\n const { Fp, n: CURVE_ORDER, nByteLength, nBitLength } = CURVE;\n const compressedLen = Fp.BYTES + 1; // e.g. 33 for 32\n const uncompressedLen = 2 * Fp.BYTES + 1; // e.g. 65 for 32\n\n function modN(a: bigint) {\n return mod(a, CURVE_ORDER);\n }\n function invN(a: bigint) {\n return invert(a, CURVE_ORDER);\n }\n\n const {\n ProjectivePoint: Point,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n } = weierstrassPoints({\n ...CURVE,\n toBytes(_c, point, isCompressed: boolean): Uint8Array {\n const a = point.toAffine();\n const x = Fp.toBytes(a.x);\n const cat = concatBytes;\n abool('isCompressed', isCompressed);\n if (isCompressed) {\n return cat(Uint8Array.from([point.hasEvenY() ? 0x02 : 0x03]), x);\n } else {\n return cat(Uint8Array.from([0x04]), x, Fp.toBytes(a.y));\n }\n },\n fromBytes(bytes: Uint8Array) {\n const len = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // this.assertValidity() is done inside of fromHex\n if (len === compressedLen && (head === 0x02 || head === 0x03)) {\n const x = bytesToNumberBE(tail);\n if (!inRange(x, _1n, Fp.ORDER)) throw new Error('Point is not on curve');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: bigint;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const suffix = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('Point is not on curve' + suffix);\n }\n const isYOdd = (y & _1n) === _1n;\n // ECDSA\n const isHeadOdd = (head & 1) === 1;\n if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n return { x, y };\n } else if (len === uncompressedLen && head === 0x04) {\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n } else {\n const cl = compressedLen;\n const ul = uncompressedLen;\n throw new Error(\n 'invalid Point, expected length of ' + cl + ', or uncompressed ' + ul + ', got ' + len\n );\n }\n },\n });\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n\n function normalizeS(s: bigint) {\n return isBiggerThanHalfOrder(s) ? modN(-s) : s;\n }\n // slice bytes num\n const slcNum = (b: Uint8Array, from: number, to: number) => bytesToNumberBE(b.slice(from, to));\n\n /**\n * ECDSA signature with its (r, s) properties. Supports DER & compact representations.\n */\n class Signature implements SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n constructor(r: bigint, s: bigint, recovery?: number) {\n aInRange('r', r, _1n, CURVE_ORDER); // r in [1..N]\n aInRange('s', s, _1n, CURVE_ORDER); // s in [1..N]\n this.r = r;\n this.s = s;\n if (recovery != null) this.recovery = recovery;\n Object.freeze(this);\n }\n\n // pair (bytes of r, bytes of s)\n static fromCompact(hex: Hex) {\n const l = nByteLength;\n hex = ensureBytes('compactSignature', hex, l * 2);\n return new Signature(slcNum(hex, 0, l), slcNum(hex, l, 2 * l));\n }\n\n // DER encoded ECDSA signature\n // https://bitcoin.stackexchange.com/questions/57644/what-are-the-parts-of-a-bitcoin-transaction-input-script\n static fromDER(hex: Hex) {\n const { r, s } = DER.toSig(ensureBytes('DER', hex));\n return new Signature(r, s);\n }\n\n /**\n * @todo remove\n * @deprecated\n */\n assertValidity(): void {}\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(msgHash: Hex): typeof Point.BASE {\n const { r, s, recovery: rec } = this;\n const h = bits2int_modN(ensureBytes('msgHash', msgHash)); // Truncate hash\n if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n const radj = rec === 2 || rec === 3 ? r + CURVE.n : r;\n if (radj >= Fp.ORDER) throw new Error('recovery id 2 or 3 invalid');\n const prefix = (rec & 1) === 0 ? '02' : '03';\n const R = Point.fromHex(prefix + numToSizedHex(radj, Fp.BYTES));\n const ir = invN(radj); // r^-1\n const u1 = modN(-h * ir); // -hr^-1\n const u2 = modN(s * ir); // sr^-1\n const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2); // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1)\n if (!Q) throw new Error('point at infinify'); // unsafe is fine: no priv data leaked\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, modN(-this.s), this.recovery) : this;\n }\n\n // DER-encoded\n toDERRawBytes() {\n return hexToBytes(this.toDERHex());\n }\n toDERHex() {\n return DER.hexFromSig(this);\n }\n\n // padded bytes of r, then padded bytes of s\n toCompactRawBytes() {\n return hexToBytes(this.toCompactHex());\n }\n toCompactHex() {\n const l = nByteLength;\n return numToSizedHex(this.r, l) + numToSizedHex(this.s, l);\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n const utils = {\n isValidPrivateKey(privateKey: PrivKey) {\n try {\n normPrivateKeyToScalar(privateKey);\n return true;\n } catch (error) {\n return false;\n }\n },\n normPrivateKeyToScalar: normPrivateKeyToScalar,\n\n /**\n * Produces cryptographically secure private key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n randomPrivateKey: (): Uint8Array => {\n const length = getMinHashLength(CURVE.n);\n return mapHashToField(CURVE.randomBytes(length), CURVE.n);\n },\n\n /**\n * Creates precompute table for an arbitrary EC point. Makes point \"cached\".\n * Allows to massively speed-up `point.multiply(scalar)`.\n * @returns cached point\n * @example\n * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey));\n * fast.multiply(privKey); // much faster ECDH now\n */\n precompute(windowSize = 8, point = Point.BASE): typeof Point.BASE {\n point._setWindowSize(windowSize);\n point.multiply(BigInt(3)); // 3 is arbitrary, just need any number here\n return point;\n },\n };\n\n /**\n * Computes public key for a private key. Checks for validity of the private key.\n * @param privateKey private key\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(privateKey: PrivKey, isCompressed = true): Uint8Array {\n return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n if (typeof item === 'bigint') return false;\n if (item instanceof Point) return true;\n const arr = ensureBytes('key', item);\n const len = arr.length;\n const fpl = Fp.BYTES;\n const compLen = fpl + 1; // e.g. 33 for 32\n const uncompLen = 2 * fpl + 1; // e.g. 65 for 32\n if (CURVE.allowedPrivateKeyLengths || nByteLength === compLen) {\n return undefined;\n } else {\n return len === compLen || len === uncompLen;\n }\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from private key and public key.\n * Checks: 1) private key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param privateA private key\n * @param publicB different public key\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(privateA: PrivKey, publicB: Hex, isCompressed = true): Uint8Array {\n if (isProbPub(privateA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicB) === false) throw new Error('second arg must be public key');\n const b = Point.fromHex(publicB); // check for being on-curve\n return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed);\n }\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n CURVE.bits2int ||\n function (bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - nBitLength; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n CURVE.bits2int_modN ||\n function (bytes: Uint8Array): bigint {\n return modN(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // NOTE: pads output with zero as per spec\n const ORDER_MASK = bitMask(nBitLength);\n /**\n * Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`.\n */\n function int2octets(num: bigint): Uint8Array {\n aInRange('num < 2^' + nBitLength, num, _0n, ORDER_MASK);\n // works with order, can have different size than numToField!\n return numberToBytesBE(num, nByteLength);\n }\n\n // Steps A, D of RFC6979 3.2\n // Creates RFC6979 seed; converts msg/privKey to numbers.\n // Used only in sign, not in verify.\n // NOTE: we cannot assume here that msgHash has same amount of bytes as curve order,\n // this will be invalid at least for P521. Also it can be bigger for P224 + SHA256\n function prepSig(msgHash: Hex, privateKey: PrivKey, opts = defaultSigOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { hash, randomBytes } = CURVE;\n let { lowS, prehash, extraEntropy: ent } = opts; // generates low-s sigs by default\n if (lowS == null) lowS = true; // RFC6979 3.2: we skip step A, because we already provide hash\n msgHash = ensureBytes('msgHash', msgHash);\n validateSigVerOpts(opts);\n if (prehash) msgHash = ensureBytes('prehashed msgHash', hash(msgHash));\n\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with nBitLength % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(msgHash);\n const d = normPrivateKeyToScalar(privateKey); // validate private key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (ent != null && ent !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n const e = ent === true ? randomBytes(Fp.BYTES) : ent; // generate random bytes OR pass as-is\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!isWithinCurveOrder(k)) return; // Important: all mod() calls here must be done over N\n const ik = invN(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = Gk\n const r = modN(q.x); // r = q.x mod n\n if (r === _0n) return;\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n const s = modN(ik * modN(m + r * d)); // Not using blinding here\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = normalizeS(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n }\n return { seed, k2sig };\n }\n const defaultSigOpts: SignOpts = { lowS: CURVE.lowS, prehash: false };\n const defaultVerOpts: VerOpts = { lowS: CURVE.lowS, prehash: false };\n\n /**\n * Signs message hash with a private key.\n * ```\n * sign(m, d, k) where\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr)/k mod n\n * ```\n * @param msgHash NOT message. msg needs to be hashed to `msgHash`, or use `prehash`.\n * @param privKey private key\n * @param opts lowS for non-malleable sigs. extraEntropy for mixing randomness into k. prehash will hash first arg.\n * @returns signature with recovery param\n */\n function sign(msgHash: Hex, privKey: PrivKey, opts = defaultSigOpts): RecoveredSignature {\n const { seed, k2sig } = prepSig(msgHash, privKey, opts); // Steps A, D of RFC6979 3.2.\n const C = CURVE;\n const drbg = createHmacDrbg(C.hash.outputLen, C.nByteLength, C.hmac);\n return drbg(seed, k2sig); // Steps B, C, D, E, F, G\n }\n\n // Enable precomputes. Slows down first publicKey computation by 20ms.\n Point.BASE._setWindowSize(8);\n // utils.precompute(8, ProjectivePoint.BASE)\n\n /**\n * Verifies a signature against message hash and public key.\n * Rejects lowS signatures by default: to override,\n * specify option `{lowS: false}`. Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * U1 = hs^-1 mod n\n * U2 = rs^-1 mod n\n * R = U1⋅G - U2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Hex | SignatureLike,\n msgHash: Hex,\n publicKey: Hex,\n opts = defaultVerOpts\n ): boolean {\n const sg = signature;\n msgHash = ensureBytes('msgHash', msgHash);\n publicKey = ensureBytes('publicKey', publicKey);\n const { lowS, prehash, format } = opts;\n\n // Verify opts, deduce signature format\n validateSigVerOpts(opts);\n if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n if (format !== undefined && format !== 'compact' && format !== 'der')\n throw new Error('format must be compact or der');\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj =\n !isHex &&\n !format &&\n typeof sg === 'object' &&\n sg !== null &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n\n let _sig: Signature | undefined = undefined;\n let P: ProjPointType;\n try {\n if (isObj) _sig = new Signature(sg.r, sg.s);\n if (isHex) {\n // Signature can be represented in 2 ways: compact (2*nByteLength) & DER (variable-length).\n // Since DER can also be 2*nByteLength bytes, we check for it first.\n try {\n if (format !== 'compact') _sig = Signature.fromDER(sg);\n } catch (derError) {\n if (!(derError instanceof DER.Err)) throw derError;\n }\n if (!_sig && format !== 'der') _sig = Signature.fromCompact(sg);\n }\n P = Point.fromHex(publicKey);\n } catch (error) {\n return false;\n }\n if (!_sig) return false;\n if (lowS && _sig.hasHighS()) return false;\n if (prehash) msgHash = CURVE.hash(msgHash);\n const { r, s } = _sig;\n const h = bits2int_modN(msgHash); // Cannot use fields methods, since it is group element\n const is = invN(s); // s^-1\n const u1 = modN(h * is); // u1 = hs^-1 mod n\n const u2 = modN(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2)?.toAffine(); // R = u1⋅G + u2⋅P\n if (!R) return false;\n const v = modN(R.x);\n return v === r;\n }\n return {\n CURVE,\n getPublicKey,\n getSharedSecret,\n sign,\n verify,\n ProjectivePoint: Point,\n Signature,\n utils,\n };\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(\n Fp: IField,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(\n Fp: IField,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n if (!Fp.isValid(opts.A) || !Fp.isValid(opts.B) || !Fp.isValid(opts.Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, opts.Z);\n if (!Fp.isOdd) throw new Error('Fp.isOdd is not implemented!');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, opts.Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, opts.B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(opts.Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, opts.A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, opts.A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, opts.B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac } from '@noble/hashes/hmac';\nimport { concatBytes, randomBytes } from '@noble/hashes/utils';\nimport type { CHash } from './abstract/utils.ts';\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): {\n hash: CHash;\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => Uint8Array;\n randomBytes: typeof randomBytes;\n} {\n return {\n hash,\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => hmac(hash, key, concatBytes(...msgs)),\n randomBytes,\n };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, ...getHash(hash) });\n return { ...create(defHash), create };\n}\n","/**\n * hash-to-curve from RFC 9380.\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * https://www.rfc-editor.org/rfc/rfc9380\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport type { AffinePoint, Group, GroupConstructor } from './curve.ts';\nimport { FpInvertBatch, type IField, mod } from './modular.ts';\nimport type { CHash } from './utils.ts';\nimport { abytes, bytesToNumberBE, concatBytes, utf8ToBytes, validateObject } from './utils.ts';\n\nexport type UnicodeOrBytes = string | Uint8Array;\n\n/**\n * * `DST` is a domain separation tag, defined in section 2.2.5\n * * `p` characteristic of F, where F is a finite field of characteristic p and order q = p^m\n * * `m` is extension degree (1 for prime fields)\n * * `k` is the target security target in bits (e.g. 128), from section 5.1\n * * `expand` is `xmd` (SHA2, SHA3, BLAKE) or `xof` (SHAKE, BLAKE-XOF)\n * * `hash` conforming to `utils.CHash` interface, with `outputLen` / `blockLen` props\n */\nexport type Opts = {\n DST: UnicodeOrBytes;\n p: bigint;\n m: number;\n k: number;\n expand: 'xmd' | 'xof';\n hash: CHash;\n};\n\n// Octet Stream to Integer. \"spec\" implementation of os2ip is 2.5x slower vs bytesToNumberBE.\nconst os2ip = bytesToNumberBE;\n\n// Integer to Octet Stream (numberToBytesBE)\nfunction i2osp(value: number, length: number): Uint8Array {\n anum(value);\n anum(length);\n if (value < 0 || value >= 1 << (8 * length)) throw new Error('invalid I2OSP input: ' + value);\n const res = Array.from({ length }).fill(0) as number[];\n for (let i = length - 1; i >= 0; i--) {\n res[i] = value & 0xff;\n value >>>= 8;\n }\n return new Uint8Array(res);\n}\n\nfunction strxor(a: Uint8Array, b: Uint8Array): Uint8Array {\n const arr = new Uint8Array(a.length);\n for (let i = 0; i < a.length; i++) {\n arr[i] = a[i] ^ b[i];\n }\n return arr;\n}\n\nfunction anum(item: unknown): void {\n if (!Number.isSafeInteger(item)) throw new Error('number expected');\n}\n\n/**\n * Produces a uniformly random byte string using a cryptographic hash function H that outputs b bits.\n * [RFC 9380 5.3.1](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.1).\n */\nexport function expand_message_xmd(\n msg: Uint8Array,\n DST: Uint8Array,\n lenInBytes: number,\n H: CHash\n): Uint8Array {\n abytes(msg);\n abytes(DST);\n anum(lenInBytes);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n if (DST.length > 255) DST = H(concatBytes(utf8ToBytes('H2C-OVERSIZE-DST-'), DST));\n const { outputLen: b_in_bytes, blockLen: r_in_bytes } = H;\n const ell = Math.ceil(lenInBytes / b_in_bytes);\n if (lenInBytes > 65535 || ell > 255) throw new Error('expand_message_xmd: invalid lenInBytes');\n const DST_prime = concatBytes(DST, i2osp(DST.length, 1));\n const Z_pad = i2osp(0, r_in_bytes);\n const l_i_b_str = i2osp(lenInBytes, 2); // len_in_bytes_str\n const b = new Array(ell);\n const b_0 = H(concatBytes(Z_pad, msg, l_i_b_str, i2osp(0, 1), DST_prime));\n b[0] = H(concatBytes(b_0, i2osp(1, 1), DST_prime));\n for (let i = 1; i <= ell; i++) {\n const args = [strxor(b_0, b[i - 1]), i2osp(i + 1, 1), DST_prime];\n b[i] = H(concatBytes(...args));\n }\n const pseudo_random_bytes = concatBytes(...b);\n return pseudo_random_bytes.slice(0, lenInBytes);\n}\n\n/**\n * Produces a uniformly random byte string using an extendable-output function (XOF) H.\n * 1. The collision resistance of H MUST be at least k bits.\n * 2. H MUST be an XOF that has been proved indifferentiable from\n * a random oracle under a reasonable cryptographic assumption.\n * [RFC 9380 5.3.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.2).\n */\nexport function expand_message_xof(\n msg: Uint8Array,\n DST: Uint8Array,\n lenInBytes: number,\n k: number,\n H: CHash\n): Uint8Array {\n abytes(msg);\n abytes(DST);\n anum(lenInBytes);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n // DST = H('H2C-OVERSIZE-DST-' || a_very_long_DST, Math.ceil((lenInBytes * k) / 8));\n if (DST.length > 255) {\n const dkLen = Math.ceil((2 * k) / 8);\n DST = H.create({ dkLen }).update(utf8ToBytes('H2C-OVERSIZE-DST-')).update(DST).digest();\n }\n if (lenInBytes > 65535 || DST.length > 255)\n throw new Error('expand_message_xof: invalid lenInBytes');\n return (\n H.create({ dkLen: lenInBytes })\n .update(msg)\n .update(i2osp(lenInBytes, 2))\n // 2. DST_prime = DST || I2OSP(len(DST), 1)\n .update(DST)\n .update(i2osp(DST.length, 1))\n .digest()\n );\n}\n\n/**\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * [RFC 9380 5.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.2).\n * @param msg a byte string containing the message to hash\n * @param count the number of elements of F to output\n * @param options `{DST: string, p: bigint, m: number, k: number, expand: 'xmd' | 'xof', hash: H}`, see above\n * @returns [u_0, ..., u_(count - 1)], a list of field elements.\n */\nexport function hash_to_field(msg: Uint8Array, count: number, options: Opts): bigint[][] {\n validateObject(options, {\n DST: 'stringOrUint8Array',\n p: 'bigint',\n m: 'isSafeInteger',\n k: 'isSafeInteger',\n hash: 'hash',\n });\n const { p, k, m, hash, expand, DST: _DST } = options;\n abytes(msg);\n anum(count);\n const DST = typeof _DST === 'string' ? utf8ToBytes(_DST) : _DST;\n const log2p = p.toString(2).length;\n const L = Math.ceil((log2p + k) / 8); // section 5.1 of ietf draft link above\n const len_in_bytes = count * m * L;\n let prb; // pseudo_random_bytes\n if (expand === 'xmd') {\n prb = expand_message_xmd(msg, DST, len_in_bytes, hash);\n } else if (expand === 'xof') {\n prb = expand_message_xof(msg, DST, len_in_bytes, k, hash);\n } else if (expand === '_internal_pass') {\n // for internal tests only\n prb = msg;\n } else {\n throw new Error('expand must be \"xmd\" or \"xof\"');\n }\n const u = new Array(count);\n for (let i = 0; i < count; i++) {\n const e = new Array(m);\n for (let j = 0; j < m; j++) {\n const elm_offset = L * (j + i * m);\n const tv = prb.subarray(elm_offset, elm_offset + L);\n e[j] = mod(os2ip(tv), p);\n }\n u[i] = e;\n }\n return u;\n}\n\nexport type XY = (x: T, y: T) => { x: T; y: T };\nexport type XYRatio = [T[], T[], T[], T[]]; // xn/xd, yn/yd\nexport function isogenyMap>(field: F, map: XYRatio): XY {\n // Make same order as in spec\n const coeff = map.map((i) => Array.from(i).reverse());\n return (x: T, y: T) => {\n const [xn, xd, yn, yd] = coeff.map((val) =>\n val.reduce((acc, i) => field.add(field.mul(acc, x), i))\n );\n // 6.6.3\n // Exceptional cases of iso_map are inputs that cause the denominator of\n // either rational function to evaluate to zero; such cases MUST return\n // the identity point on E.\n const [xd_inv, yd_inv] = FpInvertBatch(field, [xd, yd], true);\n x = field.mul(xn, xd_inv); // xNum / xDen\n y = field.mul(y, field.mul(yn, yd_inv)); // y * (yNum / yDev)\n return { x, y };\n };\n}\n\n/** Point interface, which curves must implement to work correctly with the module. */\nexport interface H2CPoint extends Group> {\n add(rhs: H2CPoint): H2CPoint;\n toAffine(iz?: bigint): AffinePoint;\n clearCofactor(): H2CPoint;\n assertValidity(): void;\n}\n\nexport interface H2CPointConstructor extends GroupConstructor> {\n fromAffine(ap: AffinePoint): H2CPoint;\n}\n\nexport type MapToCurve = (scalar: bigint[]) => AffinePoint;\n\n// Separated from initialization opts, so users won't accidentally change per-curve parameters\n// (changing DST is ok!)\nexport type htfBasicOpts = { DST: UnicodeOrBytes };\nexport type HTFMethod = (msg: Uint8Array, options?: htfBasicOpts) => H2CPoint;\nexport type MapMethod = (scalars: bigint[]) => H2CPoint;\nexport type Hasher = {\n hashToCurve: HTFMethod;\n encodeToCurve: HTFMethod;\n mapToCurve: MapMethod;\n defaults: Opts & { encodeDST?: UnicodeOrBytes };\n};\n\n/** Creates hash-to-curve methods from EC Point and mapToCurve function. */\nexport function createHasher(\n Point: H2CPointConstructor,\n mapToCurve: MapToCurve,\n defaults: Opts & { encodeDST?: UnicodeOrBytes }\n): Hasher {\n if (typeof mapToCurve !== 'function') throw new Error('mapToCurve() must be defined');\n function map(num: bigint[]) {\n return Point.fromAffine(mapToCurve(num));\n }\n function clear(initial: H2CPoint) {\n const P = initial.clearCofactor();\n if (P.equals(Point.ZERO)) return Point.ZERO; // zero will throw in assert\n P.assertValidity();\n return P;\n }\n\n return {\n defaults,\n\n // Encodes byte string to elliptic curve.\n // hash_to_curve from https://www.rfc-editor.org/rfc/rfc9380#section-3\n hashToCurve(msg: Uint8Array, options?: htfBasicOpts): H2CPoint {\n const u = hash_to_field(msg, 2, { ...defaults, DST: defaults.DST, ...options } as Opts);\n const u0 = map(u[0]);\n const u1 = map(u[1]);\n return clear(u0.add(u1));\n },\n\n // Encodes byte string to elliptic curve.\n // encode_to_curve from https://www.rfc-editor.org/rfc/rfc9380#section-3\n encodeToCurve(msg: Uint8Array, options?: htfBasicOpts): H2CPoint {\n const u = hash_to_field(msg, 1, { ...defaults, DST: defaults.encodeDST, ...options } as Opts);\n return clear(map(u[0]));\n },\n\n // Same as encodeToCurve, but without hash\n mapToCurve(scalars: bigint[]): H2CPoint {\n if (!Array.isArray(scalars)) throw new Error('expected array of bigints');\n for (const i of scalars)\n if (typeof i !== 'bigint') throw new Error('expected array of bigints');\n return clear(map(scalars));\n },\n };\n}\n","/**\n * NIST secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Seems to be rigid (not backdoored)\n * [as per discussion](https://bitcointalk.org/index.php?topic=289795.msg3183975#msg3183975).\n *\n * secp256k1 belongs to Koblitz curves: it has efficiently computable endomorphism.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n * [See explanation](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2';\nimport { randomBytes } from '@noble/hashes/utils';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport { createHasher, type Hasher, type HTFMethod, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mod, pow2 } from './abstract/modular.ts';\nimport type { Hex, PrivKey } from './abstract/utils.ts';\nimport {\n aInRange,\n bytesToNumberBE,\n concatBytes,\n ensureBytes,\n inRange,\n numberToBytesBE,\n} from './abstract/utils.ts';\nimport { mapToCurveSimpleSWU, type ProjPointType as PointType } from './abstract/weierstrass.ts';\n\nconst secp256k1P = BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f');\nconst secp256k1N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst divNearest = (a: bigint, b: bigint) => (a + b / _2n) / b;\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1P;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1P, undefined, undefined, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const priv = secp256k1.utils.randomPrivateKey();\n * const pub = secp256k1.getPublicKey(priv);\n * const msg = new Uint8Array(32).fill(1); // message hash (not message) in ecdsa\n * const sig = secp256k1.sign(msg, priv); // `{prehash: true}` option is available\n * const isValid = secp256k1.verify(sig, msg, pub) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n {\n a: _0n,\n b: BigInt(7),\n Fp: Fpk1,\n n: secp256k1N,\n Gx: BigInt('55066263022277343669578718895168534326250603453777594175500187360389116729240'),\n Gy: BigInt('32670510020758816978083085130507043184471273380659243275938904335757337482424'),\n h: BigInt(1),\n lowS: true, // Allow only low-S signatures by default in sign() and verify()\n endo: {\n // Endomorphism, see above\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n splitScalar: (k: bigint) => {\n const n = secp256k1N;\n const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15');\n const b1 = -_1n * BigInt('0xe4437ed6010e88286f547fa90abfe4c3');\n const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8');\n const b2 = a1;\n const POW_2_128 = BigInt('0x100000000000000000000000000000000'); // (2n**128n).toString(16)\n\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n let k1 = mod(k - c1 * a1 - c2 * a2, n);\n let k2 = mod(-c1 * b1 - c2 * b2, n);\n const k1neg = k1 > POW_2_128;\n const k2neg = k2 > POW_2_128;\n if (k1neg) k1 = n - k1;\n if (k2neg) k2 = n - k2;\n if (k1 > POW_2_128 || k2 > POW_2_128) {\n throw new Error('splitScalar: Endomorphism failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n },\n },\n },\n sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(Uint8Array.from(tag, (c) => c.charCodeAt(0)));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType) => point.toRawBytes(true).slice(1);\nconst numTo32b = (n: bigint) => numberToBytesBE(n, 32);\nconst modP = (x: bigint) => mod(x, secp256k1P);\nconst modN = (x: bigint) => mod(x, secp256k1N);\nconst Point = /* @__PURE__ */ (() => secp256k1.ProjectivePoint)();\nconst GmulAdd = (Q: PointType, a: bigint, b: bigint) =>\n Point.BASE.multiplyAndAddUnsafe(Q, a, b);\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n let d_ = secp256k1.utils.normPrivateKeyToScalar(priv); // same method executed in fromPrivateKey\n let p = Point.fromPrivateKey(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = p.hasEvenY() ? d_ : modN(-d_);\n return { scalar: scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType {\n aInRange('x', x, _1n, secp256k1P); // Fail if x ≥ p.\n const xx = modP(x * x);\n const c = modP(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = sqrtMod(c); // Let y = c^(p+1)/4 mod p.\n if (y % _2n !== _0n) y = modP(-y); // Return the unique point P such that x(P) = x and\n const p = new Point(x, y, _1n); // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return modN(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(privateKey: Hex): Uint8Array {\n return schnorrGetExtPubKey(privateKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Hex,\n privateKey: PrivKey,\n auxRand: Hex = randomBytes(32)\n): Uint8Array {\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(privateKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = numTo32b(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n const k_ = modN(num(rand)); // Let k' = int(rand) mod n\n if (k_ === _0n) throw new Error('sign failed: k is zero'); // Fail if k' = 0.\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(k_); // Let R = k'⋅G.\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(numTo32b(modN(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!inRange(r, _1n, secp256k1P)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!inRange(s, _1n, secp256k1N)) return false;\n const e = challenge(numTo32b(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n const R = GmulAdd(P, s, modN(-e)); // R = s⋅G - e⋅P\n if (!R || !R.hasEvenY() || R.toAffine().x !== r) return false; // -eP == (n-e)P\n return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n utils: {\n randomPrivateKey: () => Uint8Array;\n lift_x: typeof lift_x;\n pointToBytes: (point: PointType) => Uint8Array;\n numberToBytesBE: typeof numberToBytesBE;\n bytesToNumberBE: typeof bytesToNumberBE;\n taggedHash: typeof taggedHash;\n mod: typeof mod;\n };\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const priv = schnorr.utils.randomPrivateKey();\n * const pub = schnorr.getPublicKey(priv);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, priv);\n * const isValid = schnorr.verify(sig, msg, pub);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => ({\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n utils: {\n randomPrivateKey: secp256k1.utils.randomPrivateKey,\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n taggedHash,\n mod,\n },\n}))();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: Hasher = /* @__PURE__ */ (() =>\n createHasher(\n secp256k1.ProjectivePoint,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n } as const\n ))();\n\nexport const hashToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.hashToCurve)();\n\nexport const encodeToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.encodeToCurve)();\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type CreateCursorErrorType,\n type Cursor,\n createCursor,\n} from '../cursor.js'\n\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from './toHex.js'\n\nexport type RecursiveArray = T | readonly RecursiveArray[]\n\ntype To = 'hex' | 'bytes'\n\ntype Encodable = {\n length: number\n encode(cursor: Cursor): void\n}\n\nexport type ToRlpReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type ToRlpErrorType =\n | CreateCursorErrorType\n | BytesToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\nexport function toRlp(\n bytes: RecursiveArray | RecursiveArray,\n to: to | To | undefined = 'hex',\n): ToRlpReturnType {\n const encodable = getEncodable(bytes)\n const cursor = createCursor(new Uint8Array(encodable.length))\n encodable.encode(cursor)\n\n if (to === 'hex') return bytesToHex(cursor.bytes) as ToRlpReturnType\n return cursor.bytes as ToRlpReturnType\n}\n\nexport type BytesToRlpErrorType = ToRlpErrorType | ErrorType\n\nexport function bytesToRlp(\n bytes: RecursiveArray,\n to: to | To | undefined = 'bytes',\n): ToRlpReturnType {\n return toRlp(bytes, to)\n}\n\nexport type HexToRlpErrorType = ToRlpErrorType | ErrorType\n\nexport function hexToRlp(\n hex: RecursiveArray,\n to: to | To | undefined = 'hex',\n): ToRlpReturnType {\n return toRlp(hex, to)\n}\n\nfunction getEncodable(\n bytes: RecursiveArray | RecursiveArray,\n): Encodable {\n if (Array.isArray(bytes))\n return getEncodableList(bytes.map((x) => getEncodable(x)))\n return getEncodableBytes(bytes as any)\n}\n\nfunction getEncodableList(list: Encodable[]): Encodable {\n const bodyLength = list.reduce((acc, x) => acc + x.length, 0)\n\n const sizeOfBodyLength = getSizeOfLength(bodyLength)\n const length = (() => {\n if (bodyLength <= 55) return 1 + bodyLength\n return 1 + sizeOfBodyLength + bodyLength\n })()\n\n return {\n length,\n encode(cursor: Cursor) {\n if (bodyLength <= 55) {\n cursor.pushByte(0xc0 + bodyLength)\n } else {\n cursor.pushByte(0xc0 + 55 + sizeOfBodyLength)\n if (sizeOfBodyLength === 1) cursor.pushUint8(bodyLength)\n else if (sizeOfBodyLength === 2) cursor.pushUint16(bodyLength)\n else if (sizeOfBodyLength === 3) cursor.pushUint24(bodyLength)\n else cursor.pushUint32(bodyLength)\n }\n for (const { encode } of list) {\n encode(cursor)\n }\n },\n }\n}\n\nfunction getEncodableBytes(bytesOrHex: ByteArray | Hex): Encodable {\n const bytes =\n typeof bytesOrHex === 'string' ? hexToBytes(bytesOrHex) : bytesOrHex\n\n const sizeOfBytesLength = getSizeOfLength(bytes.length)\n const length = (() => {\n if (bytes.length === 1 && bytes[0] < 0x80) return 1\n if (bytes.length <= 55) return 1 + bytes.length\n return 1 + sizeOfBytesLength + bytes.length\n })()\n\n return {\n length,\n encode(cursor: Cursor) {\n if (bytes.length === 1 && bytes[0] < 0x80) {\n cursor.pushBytes(bytes)\n } else if (bytes.length <= 55) {\n cursor.pushByte(0x80 + bytes.length)\n cursor.pushBytes(bytes)\n } else {\n cursor.pushByte(0x80 + 55 + sizeOfBytesLength)\n if (sizeOfBytesLength === 1) cursor.pushUint8(bytes.length)\n else if (sizeOfBytesLength === 2) cursor.pushUint16(bytes.length)\n else if (sizeOfBytesLength === 3) cursor.pushUint24(bytes.length)\n else cursor.pushUint32(bytes.length)\n cursor.pushBytes(bytes)\n }\n },\n }\n}\n\nfunction getSizeOfLength(length: number) {\n if (length < 2 ** 8) return 1\n if (length < 2 ** 16) return 2\n if (length < 2 ** 24) return 3\n if (length < 2 ** 32) return 4\n throw new BaseError('Length is too large.')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { AuthorizationRequest } from '../../types/authorization.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type NumberToHexErrorType, numberToHex } from '../encoding/toHex.js'\nimport { type ToRlpErrorType, toRlp } from '../encoding/toRlp.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type HashAuthorizationParameters =\n AuthorizationRequest & {\n /** Output format. @default \"hex\" */\n to?: to | To | undefined\n }\n\nexport type HashAuthorizationReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type HashAuthorizationErrorType =\n | Keccak256ErrorType\n | ConcatHexErrorType\n | ToRlpErrorType\n | NumberToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Computes an Authorization hash in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n */\nexport function hashAuthorization(\n parameters: HashAuthorizationParameters,\n): HashAuthorizationReturnType {\n const { chainId, nonce, to } = parameters\n const address = parameters.contractAddress ?? parameters.address\n const hash = keccak256(\n concatHex([\n '0x05',\n toRlp([\n chainId ? numberToHex(chainId) : '0x',\n address,\n nonce ? numberToHex(nonce) : '0x',\n ]),\n ]),\n )\n if (to === 'bytes') return hexToBytes(hash) as HashAuthorizationReturnType\n return hash as HashAuthorizationReturnType\n}\n","import { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { BaseError } from './base.js'\n\n/**\n * geth: https://github.com/ethereum/go-ethereum/blob/master/core/error.go\n * https://github.com/ethereum/go-ethereum/blob/master/core/types/transaction.go#L34-L41\n *\n * erigon: https://github.com/ledgerwatch/erigon/blob/master/core/error.go\n * https://github.com/ledgerwatch/erigon/blob/master/core/types/transaction.go#L41-L46\n *\n * anvil: https://github.com/foundry-rs/foundry/blob/master/anvil/src/eth/error.rs#L108\n */\nexport type ExecutionRevertedErrorType = ExecutionRevertedError & {\n code: 3\n name: 'ExecutionRevertedError'\n}\nexport class ExecutionRevertedError extends BaseError {\n static code = 3\n static nodeMessage = /execution reverted|gas required exceeds allowance/\n\n constructor({\n cause,\n message,\n }: { cause?: BaseError | undefined; message?: string | undefined } = {}) {\n const reason = message\n ?.replace('execution reverted: ', '')\n ?.replace('execution reverted', '')\n super(\n `Execution reverted ${\n reason ? `with reason: ${reason}` : 'for an unknown reason'\n }.`,\n {\n cause,\n name: 'ExecutionRevertedError',\n },\n )\n }\n}\n\nexport type FeeCapTooHighErrorType = FeeCapTooHighError & {\n name: 'FeeCapTooHighError'\n}\nexport class FeeCapTooHighError extends BaseError {\n static nodeMessage =\n /max fee per gas higher than 2\\^256-1|fee cap higher than 2\\^256-1/\n constructor({\n cause,\n maxFeePerGas,\n }: {\n cause?: BaseError | undefined\n maxFeePerGas?: bigint | undefined\n } = {}) {\n super(\n `The fee cap (\\`maxFeePerGas\\`${\n maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)} gwei` : ''\n }) cannot be higher than the maximum allowed value (2^256-1).`,\n {\n cause,\n name: 'FeeCapTooHighError',\n },\n )\n }\n}\n\nexport type FeeCapTooLowErrorType = FeeCapTooLowError & {\n name: 'FeeCapTooLowError'\n}\nexport class FeeCapTooLowError extends BaseError {\n static nodeMessage =\n /max fee per gas less than block base fee|fee cap less than block base fee|transaction is outdated/\n constructor({\n cause,\n maxFeePerGas,\n }: {\n cause?: BaseError | undefined\n maxFeePerGas?: bigint | undefined\n } = {}) {\n super(\n `The fee cap (\\`maxFeePerGas\\`${\n maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)}` : ''\n } gwei) cannot be lower than the block base fee.`,\n {\n cause,\n name: 'FeeCapTooLowError',\n },\n )\n }\n}\n\nexport type NonceTooHighErrorType = NonceTooHighError & {\n name: 'NonceTooHighError'\n}\nexport class NonceTooHighError extends BaseError {\n static nodeMessage = /nonce too high/\n constructor({\n cause,\n nonce,\n }: { cause?: BaseError | undefined; nonce?: number | undefined } = {}) {\n super(\n `Nonce provided for the transaction ${\n nonce ? `(${nonce}) ` : ''\n }is higher than the next one expected.`,\n { cause, name: 'NonceTooHighError' },\n )\n }\n}\n\nexport type NonceTooLowErrorType = NonceTooLowError & {\n name: 'NonceTooLowError'\n}\nexport class NonceTooLowError extends BaseError {\n static nodeMessage =\n /nonce too low|transaction already imported|already known/\n constructor({\n cause,\n nonce,\n }: { cause?: BaseError | undefined; nonce?: number | undefined } = {}) {\n super(\n [\n `Nonce provided for the transaction ${\n nonce ? `(${nonce}) ` : ''\n }is lower than the current nonce of the account.`,\n 'Try increasing the nonce or find the latest nonce with `getTransactionCount`.',\n ].join('\\n'),\n { cause, name: 'NonceTooLowError' },\n )\n }\n}\n\nexport type NonceMaxValueErrorType = NonceMaxValueError & {\n name: 'NonceMaxValueError'\n}\nexport class NonceMaxValueError extends BaseError {\n static nodeMessage = /nonce has max value/\n constructor({\n cause,\n nonce,\n }: { cause?: BaseError | undefined; nonce?: number | undefined } = {}) {\n super(\n `Nonce provided for the transaction ${\n nonce ? `(${nonce}) ` : ''\n }exceeds the maximum allowed nonce.`,\n { cause, name: 'NonceMaxValueError' },\n )\n }\n}\n\nexport type InsufficientFundsErrorType = InsufficientFundsError & {\n name: 'InsufficientFundsError'\n}\nexport class InsufficientFundsError extends BaseError {\n static nodeMessage =\n /insufficient funds|exceeds transaction sender account balance/\n constructor({ cause }: { cause?: BaseError | undefined } = {}) {\n super(\n [\n 'The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.',\n ].join('\\n'),\n {\n cause,\n metaMessages: [\n 'This error could arise when the account does not have enough funds to:',\n ' - pay for the total gas fee,',\n ' - pay for the value to send.',\n ' ',\n 'The cost of the transaction is calculated as `gas * gas fee + value`, where:',\n ' - `gas` is the amount of gas needed for transaction to execute,',\n ' - `gas fee` is the gas fee,',\n ' - `value` is the amount of ether to send to the recipient.',\n ],\n name: 'InsufficientFundsError',\n },\n )\n }\n}\n\nexport type IntrinsicGasTooHighErrorType = IntrinsicGasTooHighError & {\n name: 'IntrinsicGasTooHighError'\n}\nexport class IntrinsicGasTooHighError extends BaseError {\n static nodeMessage = /intrinsic gas too high|gas limit reached/\n constructor({\n cause,\n gas,\n }: { cause?: BaseError | undefined; gas?: bigint | undefined } = {}) {\n super(\n `The amount of gas ${\n gas ? `(${gas}) ` : ''\n }provided for the transaction exceeds the limit allowed for the block.`,\n {\n cause,\n name: 'IntrinsicGasTooHighError',\n },\n )\n }\n}\n\nexport type IntrinsicGasTooLowErrorType = IntrinsicGasTooLowError & {\n name: 'IntrinsicGasTooLowError'\n}\nexport class IntrinsicGasTooLowError extends BaseError {\n static nodeMessage = /intrinsic gas too low/\n constructor({\n cause,\n gas,\n }: { cause?: BaseError | undefined; gas?: bigint | undefined } = {}) {\n super(\n `The amount of gas ${\n gas ? `(${gas}) ` : ''\n }provided for the transaction is too low.`,\n {\n cause,\n name: 'IntrinsicGasTooLowError',\n },\n )\n }\n}\n\nexport type TransactionTypeNotSupportedErrorType =\n TransactionTypeNotSupportedError & {\n name: 'TransactionTypeNotSupportedError'\n }\nexport class TransactionTypeNotSupportedError extends BaseError {\n static nodeMessage = /transaction type not valid/\n constructor({ cause }: { cause?: BaseError | undefined }) {\n super('The transaction type is not supported for this chain.', {\n cause,\n name: 'TransactionTypeNotSupportedError',\n })\n }\n}\n\nexport type TipAboveFeeCapErrorType = TipAboveFeeCapError & {\n name: 'TipAboveFeeCapError'\n}\nexport class TipAboveFeeCapError extends BaseError {\n static nodeMessage =\n /max priority fee per gas higher than max fee per gas|tip higher than fee cap/\n constructor({\n cause,\n maxPriorityFeePerGas,\n maxFeePerGas,\n }: {\n cause?: BaseError | undefined\n maxPriorityFeePerGas?: bigint | undefined\n maxFeePerGas?: bigint | undefined\n } = {}) {\n super(\n [\n `The provided tip (\\`maxPriorityFeePerGas\\`${\n maxPriorityFeePerGas\n ? ` = ${formatGwei(maxPriorityFeePerGas)} gwei`\n : ''\n }) cannot be higher than the fee cap (\\`maxFeePerGas\\`${\n maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)} gwei` : ''\n }).`,\n ].join('\\n'),\n {\n cause,\n name: 'TipAboveFeeCapError',\n },\n )\n }\n}\n\nexport type UnknownNodeErrorType = UnknownNodeError & {\n name: 'UnknownNodeError'\n}\nexport class UnknownNodeError extends BaseError {\n constructor({ cause }: { cause?: BaseError | undefined }) {\n super(`An error occurred while executing: ${cause?.shortMessage}`, {\n cause,\n name: 'UnknownNodeError',\n })\n }\n}\n","import type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n ExecutionRevertedError,\n type ExecutionRevertedErrorType,\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n FeeCapTooLowError,\n type FeeCapTooLowErrorType,\n InsufficientFundsError,\n type InsufficientFundsErrorType,\n IntrinsicGasTooHighError,\n type IntrinsicGasTooHighErrorType,\n IntrinsicGasTooLowError,\n type IntrinsicGasTooLowErrorType,\n NonceMaxValueError,\n type NonceMaxValueErrorType,\n NonceTooHighError,\n type NonceTooHighErrorType,\n NonceTooLowError,\n type NonceTooLowErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n TransactionTypeNotSupportedError,\n type TransactionTypeNotSupportedErrorType,\n UnknownNodeError,\n type UnknownNodeErrorType,\n} from '../../errors/node.js'\nimport { RpcRequestError } from '../../errors/request.js'\nimport {\n InvalidInputRpcError,\n TransactionRejectedRpcError,\n} from '../../errors/rpc.js'\nimport type { ExactPartial } from '../../types/utils.js'\n\nexport function containsNodeError(err: BaseError) {\n return (\n err instanceof TransactionRejectedRpcError ||\n err instanceof InvalidInputRpcError ||\n (err instanceof RpcRequestError && err.code === ExecutionRevertedError.code)\n )\n}\n\nexport type GetNodeErrorParameters = ExactPartial<\n SendTransactionParameters\n>\n\nexport type GetNodeErrorReturnType =\n | ExecutionRevertedErrorType\n | FeeCapTooHighErrorType\n | FeeCapTooLowErrorType\n | NonceTooHighErrorType\n | NonceTooLowErrorType\n | NonceMaxValueErrorType\n | InsufficientFundsErrorType\n | IntrinsicGasTooHighErrorType\n | IntrinsicGasTooLowErrorType\n | TransactionTypeNotSupportedErrorType\n | TipAboveFeeCapErrorType\n | UnknownNodeErrorType\n\nexport function getNodeError(\n err: BaseError,\n args: GetNodeErrorParameters,\n): GetNodeErrorReturnType {\n const message = (err.details || '').toLowerCase()\n\n const executionRevertedError =\n err instanceof BaseError\n ? err.walk(\n (e) =>\n (e as { code: number } | null | undefined)?.code ===\n ExecutionRevertedError.code,\n )\n : err\n if (executionRevertedError instanceof BaseError)\n return new ExecutionRevertedError({\n cause: err,\n message: executionRevertedError.details,\n }) as any\n if (ExecutionRevertedError.nodeMessage.test(message))\n return new ExecutionRevertedError({\n cause: err,\n message: err.details,\n }) as any\n if (FeeCapTooHighError.nodeMessage.test(message))\n return new FeeCapTooHighError({\n cause: err,\n maxFeePerGas: args?.maxFeePerGas,\n }) as any\n if (FeeCapTooLowError.nodeMessage.test(message))\n return new FeeCapTooLowError({\n cause: err,\n maxFeePerGas: args?.maxFeePerGas,\n }) as any\n if (NonceTooHighError.nodeMessage.test(message))\n return new NonceTooHighError({ cause: err, nonce: args?.nonce }) as any\n if (NonceTooLowError.nodeMessage.test(message))\n return new NonceTooLowError({ cause: err, nonce: args?.nonce }) as any\n if (NonceMaxValueError.nodeMessage.test(message))\n return new NonceMaxValueError({ cause: err, nonce: args?.nonce }) as any\n if (InsufficientFundsError.nodeMessage.test(message))\n return new InsufficientFundsError({ cause: err }) as any\n if (IntrinsicGasTooHighError.nodeMessage.test(message))\n return new IntrinsicGasTooHighError({ cause: err, gas: args?.gas }) as any\n if (IntrinsicGasTooLowError.nodeMessage.test(message))\n return new IntrinsicGasTooLowError({ cause: err, gas: args?.gas }) as any\n if (TransactionTypeNotSupportedError.nodeMessage.test(message))\n return new TransactionTypeNotSupportedError({ cause: err }) as any\n if (TipAboveFeeCapError.nodeMessage.test(message))\n return new TipAboveFeeCapError({\n cause: err,\n maxFeePerGas: args?.maxFeePerGas,\n maxPriorityFeePerGas: args?.maxPriorityFeePerGas,\n }) as any\n return new UnknownNodeError({\n cause: err,\n }) as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ChainFormatter } from '../../types/chain.js'\n\nexport type ExtractErrorType = ErrorType\n\n/**\n * @description Picks out the keys from `value` that exist in the formatter..\n */\nexport function extract(\n value_: Record,\n { format }: { format?: ChainFormatter['format'] | undefined },\n) {\n if (!format) return {}\n\n const value: Record = {}\n function extract_(formatted: Record) {\n const keys = Object.keys(formatted)\n for (const key of keys) {\n if (key in value_) value[key] = value_[key]\n if (\n formatted[key] &&\n typeof formatted[key] === 'object' &&\n !Array.isArray(formatted[key])\n )\n extract_(formatted[key])\n }\n }\n\n const formatted = format(value_ || {})\n extract_(formatted)\n\n return value\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Prettify } from '../../types/utils.js'\n\nexport type DefineFormatterErrorType = ErrorType\n\nexport function defineFormatter(\n type: type,\n format: (args: parameters, action?: string | undefined) => returnType,\n) {\n return <\n parametersOverride,\n returnTypeOverride,\n exclude extends (keyof parameters | keyof parametersOverride)[] = [],\n >({\n exclude,\n format: overrides,\n }: {\n exclude?: exclude | undefined\n format: (\n args: parametersOverride,\n action?: string | undefined,\n ) => returnTypeOverride\n }) => {\n return {\n exclude,\n format: (args: parametersOverride, action?: string | undefined) => {\n const formatted = format(args as any, action)\n if (exclude) {\n for (const key of exclude) {\n delete (formatted as any)[key]\n }\n }\n return {\n ...formatted,\n ...overrides(args, action),\n } as Prettify & {\n [_key in exclude[number]]: never\n }\n },\n type,\n }\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { AuthorizationList } from '../../types/authorization.js'\nimport type {\n Chain,\n ExtractChainFormatterParameters,\n} from '../../types/chain.js'\nimport type { ByteArray } from '../../types/misc.js'\nimport type {\n RpcAuthorizationList,\n RpcTransactionRequest,\n} from '../../types/rpc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { bytesToHex, numberToHex } from '../encoding/toHex.js'\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\n\nexport type FormattedTransactionRequest<\n chain extends Chain | undefined = Chain | undefined,\n> = ExtractChainFormatterParameters<\n chain,\n 'transactionRequest',\n TransactionRequest\n>\n\nexport const rpcTransactionType = {\n legacy: '0x0',\n eip2930: '0x1',\n eip1559: '0x2',\n eip4844: '0x3',\n eip7702: '0x4',\n} as const\n\nexport type FormatTransactionRequestErrorType = ErrorType\n\nexport function formatTransactionRequest(\n request: ExactPartial & { account?: Account | undefined },\n _?: string | undefined,\n) {\n const rpcRequest = {} as RpcTransactionRequest\n\n if (typeof request.authorizationList !== 'undefined')\n rpcRequest.authorizationList = formatAuthorizationList(\n request.authorizationList,\n )\n if (typeof request.accessList !== 'undefined')\n rpcRequest.accessList = request.accessList\n if (typeof request.blobVersionedHashes !== 'undefined')\n rpcRequest.blobVersionedHashes = request.blobVersionedHashes\n if (typeof request.blobs !== 'undefined') {\n if (typeof request.blobs[0] !== 'string')\n rpcRequest.blobs = (request.blobs as ByteArray[]).map((x) =>\n bytesToHex(x),\n )\n else rpcRequest.blobs = request.blobs\n }\n if (typeof request.data !== 'undefined') rpcRequest.data = request.data\n if (request.account) rpcRequest.from = request.account.address\n if (typeof request.from !== 'undefined') rpcRequest.from = request.from\n if (typeof request.gas !== 'undefined')\n rpcRequest.gas = numberToHex(request.gas)\n if (typeof request.gasPrice !== 'undefined')\n rpcRequest.gasPrice = numberToHex(request.gasPrice)\n if (typeof request.maxFeePerBlobGas !== 'undefined')\n rpcRequest.maxFeePerBlobGas = numberToHex(request.maxFeePerBlobGas)\n if (typeof request.maxFeePerGas !== 'undefined')\n rpcRequest.maxFeePerGas = numberToHex(request.maxFeePerGas)\n if (typeof request.maxPriorityFeePerGas !== 'undefined')\n rpcRequest.maxPriorityFeePerGas = numberToHex(request.maxPriorityFeePerGas)\n if (typeof request.nonce !== 'undefined')\n rpcRequest.nonce = numberToHex(request.nonce)\n if (typeof request.to !== 'undefined') rpcRequest.to = request.to\n if (typeof request.type !== 'undefined')\n rpcRequest.type = rpcTransactionType[request.type]\n if (typeof request.value !== 'undefined')\n rpcRequest.value = numberToHex(request.value)\n\n return rpcRequest\n}\n\nexport type DefineTransactionRequestErrorType =\n | DefineFormatterErrorType\n | ErrorType\n\nexport const defineTransactionRequest = /*#__PURE__*/ defineFormatter(\n 'transactionRequest',\n formatTransactionRequest,\n)\n\n//////////////////////////////////////////////////////////////////////////////\n\nfunction formatAuthorizationList(\n authorizationList: AuthorizationList,\n): RpcAuthorizationList {\n return authorizationList.map(\n (authorization) =>\n ({\n address: authorization.address,\n r: authorization.r\n ? numberToHex(BigInt(authorization.r))\n : authorization.r,\n s: authorization.s\n ? numberToHex(BigInt(authorization.s))\n : authorization.s,\n chainId: numberToHex(authorization.chainId),\n nonce: numberToHex(authorization.nonce),\n ...(typeof authorization.yParity !== 'undefined'\n ? { yParity: numberToHex(authorization.yParity) }\n : {}),\n ...(typeof authorization.v !== 'undefined' &&\n typeof authorization.yParity === 'undefined'\n ? { v: numberToHex(authorization.v) }\n : {}),\n }) as any,\n ) as RpcAuthorizationList\n}\n","import {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../errors/address.js'\nimport {\n InvalidBytesLengthError,\n type InvalidBytesLengthErrorType,\n} from '../errors/data.js'\nimport {\n AccountStateConflictError,\n type AccountStateConflictErrorType,\n StateAssignmentConflictError,\n type StateAssignmentConflictErrorType,\n} from '../errors/stateOverride.js'\nimport type {\n RpcAccountStateOverride,\n RpcStateMapping,\n RpcStateOverride,\n} from '../types/rpc.js'\nimport type { StateMapping, StateOverride } from '../types/stateOverride.js'\nimport { isAddress } from './address/isAddress.js'\nimport { type NumberToHexErrorType, numberToHex } from './encoding/toHex.js'\n\ntype SerializeStateMappingParameters = StateMapping | undefined\n\ntype SerializeStateMappingErrorType = InvalidBytesLengthErrorType\n\n/** @internal */\nexport function serializeStateMapping(\n stateMapping: SerializeStateMappingParameters,\n): RpcStateMapping | undefined {\n if (!stateMapping || stateMapping.length === 0) return undefined\n return stateMapping.reduce((acc, { slot, value }) => {\n if (slot.length !== 66)\n throw new InvalidBytesLengthError({\n size: slot.length,\n targetSize: 66,\n type: 'hex',\n })\n if (value.length !== 66)\n throw new InvalidBytesLengthError({\n size: value.length,\n targetSize: 66,\n type: 'hex',\n })\n acc[slot] = value\n return acc\n }, {} as RpcStateMapping)\n}\n\ntype SerializeAccountStateOverrideParameters = Omit<\n StateOverride[number],\n 'address'\n>\n\ntype SerializeAccountStateOverrideErrorType =\n | NumberToHexErrorType\n | StateAssignmentConflictErrorType\n | SerializeStateMappingErrorType\n\n/** @internal */\nexport function serializeAccountStateOverride(\n parameters: SerializeAccountStateOverrideParameters,\n): RpcAccountStateOverride {\n const { balance, nonce, state, stateDiff, code } = parameters\n const rpcAccountStateOverride: RpcAccountStateOverride = {}\n if (code !== undefined) rpcAccountStateOverride.code = code\n if (balance !== undefined)\n rpcAccountStateOverride.balance = numberToHex(balance)\n if (nonce !== undefined) rpcAccountStateOverride.nonce = numberToHex(nonce)\n if (state !== undefined)\n rpcAccountStateOverride.state = serializeStateMapping(state)\n if (stateDiff !== undefined) {\n if (rpcAccountStateOverride.state) throw new StateAssignmentConflictError()\n rpcAccountStateOverride.stateDiff = serializeStateMapping(stateDiff)\n }\n return rpcAccountStateOverride\n}\n\ntype SerializeStateOverrideParameters = StateOverride | undefined\n\nexport type SerializeStateOverrideErrorType =\n | InvalidAddressErrorType\n | AccountStateConflictErrorType\n | SerializeAccountStateOverrideErrorType\n\n/** @internal */\nexport function serializeStateOverride(\n parameters?: SerializeStateOverrideParameters,\n): RpcStateOverride | undefined {\n if (!parameters) return undefined\n const rpcStateOverride: RpcStateOverride = {}\n for (const { address, ...accountState } of parameters) {\n if (!isAddress(address, { strict: false }))\n throw new InvalidAddressError({ address })\n if (rpcStateOverride[address])\n throw new AccountStateConflictError({ address: address })\n rpcStateOverride[address] = serializeAccountStateOverride(accountState)\n }\n return rpcStateOverride\n}\n","export const maxInt8 = 2n ** (8n - 1n) - 1n\nexport const maxInt16 = 2n ** (16n - 1n) - 1n\nexport const maxInt24 = 2n ** (24n - 1n) - 1n\nexport const maxInt32 = 2n ** (32n - 1n) - 1n\nexport const maxInt40 = 2n ** (40n - 1n) - 1n\nexport const maxInt48 = 2n ** (48n - 1n) - 1n\nexport const maxInt56 = 2n ** (56n - 1n) - 1n\nexport const maxInt64 = 2n ** (64n - 1n) - 1n\nexport const maxInt72 = 2n ** (72n - 1n) - 1n\nexport const maxInt80 = 2n ** (80n - 1n) - 1n\nexport const maxInt88 = 2n ** (88n - 1n) - 1n\nexport const maxInt96 = 2n ** (96n - 1n) - 1n\nexport const maxInt104 = 2n ** (104n - 1n) - 1n\nexport const maxInt112 = 2n ** (112n - 1n) - 1n\nexport const maxInt120 = 2n ** (120n - 1n) - 1n\nexport const maxInt128 = 2n ** (128n - 1n) - 1n\nexport const maxInt136 = 2n ** (136n - 1n) - 1n\nexport const maxInt144 = 2n ** (144n - 1n) - 1n\nexport const maxInt152 = 2n ** (152n - 1n) - 1n\nexport const maxInt160 = 2n ** (160n - 1n) - 1n\nexport const maxInt168 = 2n ** (168n - 1n) - 1n\nexport const maxInt176 = 2n ** (176n - 1n) - 1n\nexport const maxInt184 = 2n ** (184n - 1n) - 1n\nexport const maxInt192 = 2n ** (192n - 1n) - 1n\nexport const maxInt200 = 2n ** (200n - 1n) - 1n\nexport const maxInt208 = 2n ** (208n - 1n) - 1n\nexport const maxInt216 = 2n ** (216n - 1n) - 1n\nexport const maxInt224 = 2n ** (224n - 1n) - 1n\nexport const maxInt232 = 2n ** (232n - 1n) - 1n\nexport const maxInt240 = 2n ** (240n - 1n) - 1n\nexport const maxInt248 = 2n ** (248n - 1n) - 1n\nexport const maxInt256 = 2n ** (256n - 1n) - 1n\n\nexport const minInt8 = -(2n ** (8n - 1n))\nexport const minInt16 = -(2n ** (16n - 1n))\nexport const minInt24 = -(2n ** (24n - 1n))\nexport const minInt32 = -(2n ** (32n - 1n))\nexport const minInt40 = -(2n ** (40n - 1n))\nexport const minInt48 = -(2n ** (48n - 1n))\nexport const minInt56 = -(2n ** (56n - 1n))\nexport const minInt64 = -(2n ** (64n - 1n))\nexport const minInt72 = -(2n ** (72n - 1n))\nexport const minInt80 = -(2n ** (80n - 1n))\nexport const minInt88 = -(2n ** (88n - 1n))\nexport const minInt96 = -(2n ** (96n - 1n))\nexport const minInt104 = -(2n ** (104n - 1n))\nexport const minInt112 = -(2n ** (112n - 1n))\nexport const minInt120 = -(2n ** (120n - 1n))\nexport const minInt128 = -(2n ** (128n - 1n))\nexport const minInt136 = -(2n ** (136n - 1n))\nexport const minInt144 = -(2n ** (144n - 1n))\nexport const minInt152 = -(2n ** (152n - 1n))\nexport const minInt160 = -(2n ** (160n - 1n))\nexport const minInt168 = -(2n ** (168n - 1n))\nexport const minInt176 = -(2n ** (176n - 1n))\nexport const minInt184 = -(2n ** (184n - 1n))\nexport const minInt192 = -(2n ** (192n - 1n))\nexport const minInt200 = -(2n ** (200n - 1n))\nexport const minInt208 = -(2n ** (208n - 1n))\nexport const minInt216 = -(2n ** (216n - 1n))\nexport const minInt224 = -(2n ** (224n - 1n))\nexport const minInt232 = -(2n ** (232n - 1n))\nexport const minInt240 = -(2n ** (240n - 1n))\nexport const minInt248 = -(2n ** (248n - 1n))\nexport const minInt256 = -(2n ** (256n - 1n))\n\nexport const maxUint8 = 2n ** 8n - 1n\nexport const maxUint16 = 2n ** 16n - 1n\nexport const maxUint24 = 2n ** 24n - 1n\nexport const maxUint32 = 2n ** 32n - 1n\nexport const maxUint40 = 2n ** 40n - 1n\nexport const maxUint48 = 2n ** 48n - 1n\nexport const maxUint56 = 2n ** 56n - 1n\nexport const maxUint64 = 2n ** 64n - 1n\nexport const maxUint72 = 2n ** 72n - 1n\nexport const maxUint80 = 2n ** 80n - 1n\nexport const maxUint88 = 2n ** 88n - 1n\nexport const maxUint96 = 2n ** 96n - 1n\nexport const maxUint104 = 2n ** 104n - 1n\nexport const maxUint112 = 2n ** 112n - 1n\nexport const maxUint120 = 2n ** 120n - 1n\nexport const maxUint128 = 2n ** 128n - 1n\nexport const maxUint136 = 2n ** 136n - 1n\nexport const maxUint144 = 2n ** 144n - 1n\nexport const maxUint152 = 2n ** 152n - 1n\nexport const maxUint160 = 2n ** 160n - 1n\nexport const maxUint168 = 2n ** 168n - 1n\nexport const maxUint176 = 2n ** 176n - 1n\nexport const maxUint184 = 2n ** 184n - 1n\nexport const maxUint192 = 2n ** 192n - 1n\nexport const maxUint200 = 2n ** 200n - 1n\nexport const maxUint208 = 2n ** 208n - 1n\nexport const maxUint216 = 2n ** 216n - 1n\nexport const maxUint224 = 2n ** 224n - 1n\nexport const maxUint232 = 2n ** 232n - 1n\nexport const maxUint240 = 2n ** 240n - 1n\nexport const maxUint248 = 2n ** 248n - 1n\nexport const maxUint256 = 2n ** 256n - 1n\n","import {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'\nimport { maxUint256 } from '../../constants/number.js'\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport {\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n} from '../../errors/node.js'\nimport type { FeeConflictErrorType } from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { isAddress } from '../address/isAddress.js'\n\nexport type AssertRequestParameters = ExactPartial<\n SendTransactionParameters\n>\n\nexport type AssertRequestErrorType =\n | InvalidAddressErrorType\n | FeeConflictErrorType\n | FeeCapTooHighErrorType\n | ParseAccountErrorType\n | TipAboveFeeCapErrorType\n | ErrorType\n\nexport function assertRequest(args: AssertRequestParameters) {\n const { account: account_, maxFeePerGas, maxPriorityFeePerGas, to } = args\n const account = account_ ? parseAccount(account_) : undefined\n if (account && !isAddress(account.address))\n throw new InvalidAddressError({ address: account.address })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n\n if (maxFeePerGas && maxFeePerGas > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas })\n if (\n maxPriorityFeePerGas &&\n maxFeePerGas &&\n maxPriorityFeePerGas > maxFeePerGas\n )\n throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas })\n}\n","import type { Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetTransactionCountParameters = {\n /** The account address. */\n address: Address\n} & (\n | {\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /** The block tag. Defaults to 'latest'. */\n blockTag?: BlockTag | undefined\n }\n)\nexport type GetTransactionCountReturnType = number\n\nexport type GetTransactionCountErrorType =\n | RequestErrorType\n | NumberToHexErrorType\n | HexToNumberErrorType\n | ErrorType\n\n/**\n * Returns the number of [Transactions](https://viem.sh/docs/glossary/terms#transaction) an Account has sent.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionCount\n * - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionCountParameters}\n * @returns The number of transactions an account has sent. {@link GetTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionCount } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionCount = await getTransactionCount(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function getTransactionCount<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client,\n { address, blockTag = 'latest', blockNumber }: GetTransactionCountParameters,\n): Promise {\n const count = await client.request(\n {\n method: 'eth_getTransactionCount',\n params: [\n address,\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : blockTag,\n ],\n },\n {\n dedupe: Boolean(blockNumber),\n },\n )\n return hexToNumber(count)\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type BlobsToCommitmentsParameters<\n blobs extends readonly ByteArray[] | readonly Hex[] =\n | readonly ByteArray[]\n | readonly Hex[],\n to extends To | undefined = undefined,\n> = {\n /** Blobs to transform into commitments. */\n blobs: blobs | readonly ByteArray[] | readonly Hex[]\n /** KZG implementation. */\n kzg: Pick\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type BlobsToCommitmentsReturnType =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type BlobsToCommitmentsErrorType =\n | HexToBytesErrorType\n | BytesToHexErrorType\n | ErrorType\n\n/**\n * Compute commitments from a list of blobs.\n *\n * @example\n * ```ts\n * import { blobsToCommitments, toBlobs } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * ```\n */\nexport function blobsToCommitments<\n const blobs extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: BlobsToCommitmentsParameters,\n): BlobsToCommitmentsReturnType {\n const { kzg } = parameters\n\n const to =\n parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes')\n const blobs = (\n typeof parameters.blobs[0] === 'string'\n ? parameters.blobs.map((x) => hexToBytes(x as any))\n : parameters.blobs\n ) as ByteArray[]\n\n const commitments: ByteArray[] = []\n for (const blob of blobs)\n commitments.push(Uint8Array.from(kzg.blobToKzgCommitment(blob)))\n\n return (to === 'bytes'\n ? commitments\n : commitments.map((x) =>\n bytesToHex(x),\n )) as {} as BlobsToCommitmentsReturnType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type blobsToProofsParameters<\n blobs extends readonly ByteArray[] | readonly Hex[],\n commitments extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n ///\n _blobsType =\n | (blobs extends readonly Hex[] ? readonly Hex[] : never)\n | (blobs extends readonly ByteArray[] ? readonly ByteArray[] : never),\n> = {\n /** Blobs to transform into proofs. */\n blobs: blobs\n /** Commitments for the blobs. */\n commitments: commitments &\n (commitments extends _blobsType\n ? {}\n : `commitments must be the same type as blobs`)\n /** KZG implementation. */\n kzg: Pick\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type blobsToProofsReturnType =\n | (to extends 'bytes' ? ByteArray[] : never)\n | (to extends 'hex' ? Hex[] : never)\n\nexport type blobsToProofsErrorType =\n | BytesToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Compute the proofs for a list of blobs and their commitments.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n * ```\n */\nexport function blobsToProofs<\n const blobs extends readonly ByteArray[] | readonly Hex[],\n const commitments extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: blobsToProofsParameters,\n): blobsToProofsReturnType {\n const { kzg } = parameters\n\n const to =\n parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes')\n\n const blobs = (\n typeof parameters.blobs[0] === 'string'\n ? parameters.blobs.map((x) => hexToBytes(x as any))\n : parameters.blobs\n ) as ByteArray[]\n const commitments = (\n typeof parameters.commitments[0] === 'string'\n ? parameters.commitments.map((x) => hexToBytes(x as any))\n : parameters.commitments\n ) as ByteArray[]\n\n const proofs: ByteArray[] = []\n for (let i = 0; i < blobs.length; i++) {\n const blob = blobs[i]\n const commitment = commitments[i]\n proofs.push(Uint8Array.from(kzg.computeBlobKzgProof(blob, commitment)))\n }\n\n return (to === 'bytes'\n ? proofs\n : proofs.map((x) => bytesToHex(x))) as {} as blobsToProofsReturnType\n}\n","/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport {\n SHA224 as SHA224n,\n sha224 as sha224n,\n SHA256 as SHA256n,\n sha256 as sha256n,\n} from './sha2.ts';\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256: typeof SHA256n = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256: typeof sha256n = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224: typeof SHA224n = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224: typeof sha224n = sha224n;\n","import { sha256 as noble_sha256 } from '@noble/hashes/sha256'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type Sha256Hash =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type Sha256ErrorType =\n | IsHexErrorType\n | ToBytesErrorType\n | ToHexErrorType\n | ErrorType\n\nexport function sha256(\n value: Hex | ByteArray,\n to_?: to | undefined,\n): Sha256Hash {\n const to = to_ || 'hex'\n const bytes = noble_sha256(\n isHex(value, { strict: false }) ? toBytes(value) : value,\n )\n if (to === 'bytes') return bytes as Sha256Hash\n return toHex(bytes) as Sha256Hash\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { type Sha256ErrorType, sha256 } from '../hash/sha256.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type CommitmentToVersionedHashParameters<\n commitment extends Uint8Array | Hex = Uint8Array | Hex,\n to extends To | undefined = undefined,\n> = {\n /** Commitment from blob. */\n commitment: commitment | Uint8Array | Hex\n /** Return type. */\n to?: to | To | undefined\n /** Version to tag onto the hash. */\n version?: number | undefined\n}\n\nexport type CommitmentToVersionedHashReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type CommitmentToVersionedHashErrorType =\n | Sha256ErrorType\n | BytesToHexErrorType\n | ErrorType\n\n/**\n * Transform a commitment to it's versioned hash.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * commitmentToVersionedHash,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const [commitment] = blobsToCommitments({ blobs, kzg })\n * const versionedHash = commitmentToVersionedHash({ commitment })\n * ```\n */\nexport function commitmentToVersionedHash<\n const commitment extends Hex | ByteArray,\n to extends To =\n | (commitment extends Hex ? 'hex' : never)\n | (commitment extends ByteArray ? 'bytes' : never),\n>(\n parameters: CommitmentToVersionedHashParameters,\n): CommitmentToVersionedHashReturnType {\n const { commitment, version = 1 } = parameters\n const to = parameters.to ?? (typeof commitment === 'string' ? 'hex' : 'bytes')\n\n const versionedHash = sha256(commitment, 'bytes')\n versionedHash.set([version], 0)\n return (\n to === 'bytes' ? versionedHash : bytesToHex(versionedHash)\n ) as CommitmentToVersionedHashReturnType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type CommitmentToVersionedHashErrorType,\n commitmentToVersionedHash,\n} from './commitmentToVersionedHash.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type CommitmentsToVersionedHashesParameters<\n commitments extends readonly Uint8Array[] | readonly Hex[] =\n | readonly Uint8Array[]\n | readonly Hex[],\n to extends To | undefined = undefined,\n> = {\n /** Commitments from blobs. */\n commitments: commitments | readonly Uint8Array[] | readonly Hex[]\n /** Return type. */\n to?: to | To | undefined\n /** Version to tag onto the hashes. */\n version?: number | undefined\n}\n\nexport type CommitmentsToVersionedHashesReturnType =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type CommitmentsToVersionedHashesErrorType =\n | CommitmentToVersionedHashErrorType\n | ErrorType\n\n/**\n * Transform a list of commitments to their versioned hashes.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * commitmentsToVersionedHashes,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const versionedHashes = commitmentsToVersionedHashes({ commitments })\n * ```\n */\nexport function commitmentsToVersionedHashes<\n const commitments extends readonly Uint8Array[] | readonly Hex[],\n to extends To =\n | (commitments extends readonly Hex[] ? 'hex' : never)\n | (commitments extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: CommitmentsToVersionedHashesParameters,\n): CommitmentsToVersionedHashesReturnType {\n const { commitments, version } = parameters\n\n const to =\n parameters.to ?? (typeof commitments[0] === 'string' ? 'hex' : 'bytes')\n\n const hashes: Uint8Array[] | Hex[] = []\n for (const commitment of commitments) {\n hashes.push(\n commitmentToVersionedHash({\n commitment,\n to,\n version,\n }) as any,\n )\n }\n return hashes as any\n}\n","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\n\n/** Blob limit per transaction. */\nconst blobsPerTransaction = 6\n\n/** The number of bytes in a BLS scalar field element. */\nexport const bytesPerFieldElement = 32\n\n/** The number of field elements in a blob. */\nexport const fieldElementsPerBlob = 4096\n\n/** The number of bytes in a blob. */\nexport const bytesPerBlob = bytesPerFieldElement * fieldElementsPerBlob\n\n/** Blob bytes limit per transaction. */\nexport const maxBytesPerTransaction =\n bytesPerBlob * blobsPerTransaction -\n // terminator byte (0x80).\n 1 -\n // zero byte (0x00) appended to each field element.\n 1 * fieldElementsPerBlob * blobsPerTransaction\n","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\n\nexport const versionedHashVersionKzg = 1\n","import { versionedHashVersionKzg } from '../constants/kzg.js'\nimport type { Hash } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type BlobSizeTooLargeErrorType = BlobSizeTooLargeError & {\n name: 'BlobSizeTooLargeError'\n}\nexport class BlobSizeTooLargeError extends BaseError {\n constructor({ maxSize, size }: { maxSize: number; size: number }) {\n super('Blob size is too large.', {\n metaMessages: [`Max: ${maxSize} bytes`, `Given: ${size} bytes`],\n name: 'BlobSizeTooLargeError',\n })\n }\n}\n\nexport type EmptyBlobErrorType = EmptyBlobError & {\n name: 'EmptyBlobError'\n}\nexport class EmptyBlobError extends BaseError {\n constructor() {\n super('Blob data must not be empty.', { name: 'EmptyBlobError' })\n }\n}\n\nexport type InvalidVersionedHashSizeErrorType =\n InvalidVersionedHashSizeError & {\n name: 'InvalidVersionedHashSizeError'\n }\nexport class InvalidVersionedHashSizeError extends BaseError {\n constructor({\n hash,\n size,\n }: {\n hash: Hash\n size: number\n }) {\n super(`Versioned hash \"${hash}\" size is invalid.`, {\n metaMessages: ['Expected: 32', `Received: ${size}`],\n name: 'InvalidVersionedHashSizeError',\n })\n }\n}\n\nexport type InvalidVersionedHashVersionErrorType =\n InvalidVersionedHashVersionError & {\n name: 'InvalidVersionedHashVersionError'\n }\nexport class InvalidVersionedHashVersionError extends BaseError {\n constructor({\n hash,\n version,\n }: {\n hash: Hash\n version: number\n }) {\n super(`Versioned hash \"${hash}\" version is invalid.`, {\n metaMessages: [\n `Expected: ${versionedHashVersionKzg}`,\n `Received: ${version}`,\n ],\n name: 'InvalidVersionedHashVersionError',\n })\n }\n}\n","import {\n bytesPerBlob,\n bytesPerFieldElement,\n fieldElementsPerBlob,\n maxBytesPerTransaction,\n} from '../../constants/blob.js'\nimport {\n BlobSizeTooLargeError,\n type BlobSizeTooLargeErrorType,\n EmptyBlobError,\n type EmptyBlobErrorType,\n} from '../../errors/blob.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type CreateCursorErrorType, createCursor } from '../cursor.js'\nimport { type SizeErrorType, size } from '../data/size.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type ToBlobsParameters<\n data extends Hex | ByteArray = Hex | ByteArray,\n to extends To | undefined = undefined,\n> = {\n /** Data to transform to a blob. */\n data: data | Hex | ByteArray\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type ToBlobsReturnType =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type ToBlobsErrorType =\n | BlobSizeTooLargeErrorType\n | BytesToHexErrorType\n | CreateCursorErrorType\n | EmptyBlobErrorType\n | HexToBytesErrorType\n | SizeErrorType\n | ErrorType\n\n/**\n * Transforms arbitrary data to blobs.\n *\n * @example\n * ```ts\n * import { toBlobs, stringToHex } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * ```\n */\nexport function toBlobs<\n const data extends Hex | ByteArray,\n to extends To =\n | (data extends Hex ? 'hex' : never)\n | (data extends ByteArray ? 'bytes' : never),\n>(parameters: ToBlobsParameters): ToBlobsReturnType {\n const to =\n parameters.to ?? (typeof parameters.data === 'string' ? 'hex' : 'bytes')\n const data = (\n typeof parameters.data === 'string'\n ? hexToBytes(parameters.data)\n : parameters.data\n ) as ByteArray\n\n const size_ = size(data)\n if (!size_) throw new EmptyBlobError()\n if (size_ > maxBytesPerTransaction)\n throw new BlobSizeTooLargeError({\n maxSize: maxBytesPerTransaction,\n size: size_,\n })\n\n const blobs = []\n\n let active = true\n let position = 0\n while (active) {\n const blob = createCursor(new Uint8Array(bytesPerBlob))\n\n let size = 0\n while (size < fieldElementsPerBlob) {\n const bytes = data.slice(position, position + (bytesPerFieldElement - 1))\n\n // Push a zero byte so the field element doesn't overflow the BLS modulus.\n blob.pushByte(0x00)\n\n // Push the current segment of data bytes.\n blob.pushBytes(bytes)\n\n // If we detect that the current segment of data bytes is less than 31 bytes,\n // we can stop processing and push a terminator byte to indicate the end of the blob.\n if (bytes.length < 31) {\n blob.pushByte(0x80)\n active = false\n break\n }\n\n size++\n position += 31\n }\n\n blobs.push(blob)\n }\n\n return (\n to === 'bytes'\n ? blobs.map((x) => x.bytes)\n : blobs.map((x) => bytesToHex(x.bytes))\n ) as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { BlobSidecars } from '../../types/eip4844.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type BlobsToCommitmentsErrorType,\n blobsToCommitments,\n} from './blobsToCommitments.js'\nimport { blobsToProofs, type blobsToProofsErrorType } from './blobsToProofs.js'\nimport { type ToBlobsErrorType, toBlobs } from './toBlobs.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type ToBlobSidecarsParameters<\n data extends Hex | ByteArray | undefined = undefined,\n blobs extends readonly Hex[] | readonly ByteArray[] | undefined = undefined,\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n ///\n _blobsType =\n | (blobs extends readonly Hex[] ? readonly Hex[] : never)\n | (blobs extends readonly ByteArray[] ? readonly ByteArray[] : never),\n> = {\n /** Return type. */\n to?: to | To | undefined\n} & OneOf<\n | {\n /** Data to transform into blobs. */\n data: data | Hex | ByteArray\n /** KZG implementation. */\n kzg: Kzg\n }\n | {\n /** Blobs. */\n blobs: blobs | readonly Hex[] | readonly ByteArray[]\n /** Commitment for each blob. */\n commitments: _blobsType | readonly Hex[] | readonly ByteArray[]\n /** Proof for each blob. */\n proofs: _blobsType | readonly Hex[] | readonly ByteArray[]\n }\n>\n\nexport type ToBlobSidecarsReturnType =\n | (to extends 'bytes' ? BlobSidecars : never)\n | (to extends 'hex' ? BlobSidecars : never)\n\nexport type ToBlobSidecarsErrorType =\n | BlobsToCommitmentsErrorType\n | ToBlobsErrorType\n | blobsToProofsErrorType\n | ErrorType\n\n/**\n * Transforms arbitrary data (or blobs, commitments, & proofs) into a sidecar array.\n *\n * @example\n * ```ts\n * import { toBlobSidecars, stringToHex } from 'viem'\n *\n * const sidecars = toBlobSidecars({ data: stringToHex('hello world') })\n * ```\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * toBlobs,\n * blobsToProofs,\n * toBlobSidecars,\n * stringToHex\n * } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n *\n * const sidecars = toBlobSidecars({ blobs, commitments, proofs })\n * ```\n */\nexport function toBlobSidecars<\n const data extends Hex | ByteArray | undefined = undefined,\n const blobs extends\n | readonly Hex[]\n | readonly ByteArray[]\n | undefined = undefined,\n to extends To =\n | (data extends Hex ? 'hex' : never)\n | (data extends ByteArray ? 'bytes' : never)\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: ToBlobSidecarsParameters,\n): ToBlobSidecarsReturnType {\n const { data, kzg, to } = parameters\n const blobs = parameters.blobs ?? toBlobs({ data: data!, to })\n const commitments =\n parameters.commitments ?? blobsToCommitments({ blobs, kzg: kzg!, to })\n const proofs =\n parameters.proofs ?? blobsToProofs({ blobs, commitments, kzg: kzg!, to })\n\n const sidecars: BlobSidecars = []\n for (let i = 0; i < blobs.length; i++)\n sidecars.push({\n blob: blobs[i],\n commitment: commitments[i],\n proof: proofs[i],\n })\n\n return sidecars as ToBlobSidecarsReturnType\n}\n","import {\n InvalidSerializableTransactionError,\n type InvalidSerializableTransactionErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n FeeValuesEIP1559,\n FeeValuesEIP4844,\n FeeValuesLegacy,\n} from '../../index.js'\nimport type {\n TransactionRequestGeneric,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n} from '../../types/transaction.js'\nimport type { Assign, ExactPartial, IsNever, OneOf } from '../../types/utils.js'\n\nexport type GetTransactionType<\n transaction extends OneOf<\n TransactionSerializableGeneric | TransactionRequestGeneric\n > = TransactionSerializableGeneric,\n result =\n | (transaction extends LegacyProperties ? 'legacy' : never)\n | (transaction extends EIP1559Properties ? 'eip1559' : never)\n | (transaction extends EIP2930Properties ? 'eip2930' : never)\n | (transaction extends EIP4844Properties ? 'eip4844' : never)\n | (transaction extends EIP7702Properties ? 'eip7702' : never)\n | (transaction['type'] extends TransactionSerializableGeneric['type']\n ? Extract\n : never),\n> = IsNever extends true\n ? string\n : IsNever extends false\n ? result\n : string\n\nexport type GetTransactionTypeErrorType =\n | InvalidSerializableTransactionErrorType\n | ErrorType\n\nexport function getTransactionType<\n const transaction extends OneOf<\n TransactionSerializableGeneric | TransactionRequestGeneric\n >,\n>(transaction: transaction): GetTransactionType {\n if (transaction.type)\n return transaction.type as GetTransactionType\n\n if (typeof transaction.authorizationList !== 'undefined')\n return 'eip7702' as any\n\n if (\n typeof transaction.blobs !== 'undefined' ||\n typeof transaction.blobVersionedHashes !== 'undefined' ||\n typeof transaction.maxFeePerBlobGas !== 'undefined' ||\n typeof transaction.sidecars !== 'undefined'\n )\n return 'eip4844' as any\n\n if (\n typeof transaction.maxFeePerGas !== 'undefined' ||\n typeof transaction.maxPriorityFeePerGas !== 'undefined'\n ) {\n return 'eip1559' as any\n }\n\n if (typeof transaction.gasPrice !== 'undefined') {\n if (typeof transaction.accessList !== 'undefined') return 'eip2930' as any\n return 'legacy' as any\n }\n\n throw new InvalidSerializableTransactionError({ transaction })\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// Types\n\ntype BaseProperties = {\n accessList?: undefined\n authorizationList?: undefined\n blobs?: undefined\n blobVersionedHashes?: undefined\n gasPrice?: undefined\n maxFeePerBlobGas?: undefined\n maxFeePerGas?: undefined\n maxPriorityFeePerGas?: undefined\n sidecars?: undefined\n}\n\ntype LegacyProperties = Assign\ntype EIP1559Properties = Assign<\n BaseProperties,\n OneOf<\n | {\n maxFeePerGas: FeeValuesEIP1559['maxFeePerGas']\n }\n | {\n maxPriorityFeePerGas: FeeValuesEIP1559['maxPriorityFeePerGas']\n },\n FeeValuesEIP1559\n > & {\n accessList?: TransactionSerializableEIP2930['accessList'] | undefined\n }\n>\ntype EIP2930Properties = Assign<\n ExactPartial,\n {\n accessList: TransactionSerializableEIP2930['accessList']\n }\n>\ntype EIP4844Properties = Assign<\n ExactPartial,\n ExactPartial &\n OneOf<\n | {\n blobs: TransactionSerializableEIP4844['blobs']\n }\n | {\n blobVersionedHashes: TransactionSerializableEIP4844['blobVersionedHashes']\n }\n | {\n sidecars: TransactionSerializableEIP4844['sidecars']\n },\n TransactionSerializableEIP4844\n >\n>\ntype EIP7702Properties = Assign<\n ExactPartial,\n {\n authorizationList: TransactionSerializableEIP7702['authorizationList']\n }\n>\n","import type { Address } from 'abitype'\n\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport { isAddress } from './isAddress.js'\n\nexport type IsAddressEqualReturnType = boolean\nexport type IsAddressEqualErrorType = InvalidAddressErrorType | ErrorType\n\nexport function isAddressEqual(a: Address, b: Address) {\n if (!isAddress(a, { strict: false }))\n throw new InvalidAddressError({ address: a })\n if (!isAddress(b, { strict: false }))\n throw new InvalidAddressError({ address: b })\n return a.toLowerCase() === b.toLowerCase()\n}\n","import type { Abi, AbiStateMutability, ExtractAbiFunctions } from 'abitype'\n\nimport {\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n AbiFunctionOutputsNotFoundError,\n type AbiFunctionOutputsNotFoundErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionReturnType,\n Widen,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/decodeFunctionResult'\n\nexport type DecodeFunctionResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n > = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n data: Hex\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | undefined }\n : { functionName: functionName | allFunctionNames }\n : { functionName?: functionName | allFunctionNames | undefined }\n> &\n UnionEvaluate<\n readonly [] extends allArgs\n ? {\n args?:\n | allArgs // show all options\n // infer value, widen inferred value of `args` conditionally to match `allArgs`\n | (abi extends Abi\n ? args extends allArgs\n ? Widen\n : never\n : never)\n | undefined\n }\n : {\n args?:\n | allArgs // show all options\n | (Widen & (args extends allArgs ? unknown : never)) // infer value, widen inferred value of `args` match `allArgs` (e.g. avoid union `args: readonly [123n] | readonly [bigint]`)\n | undefined\n }\n > &\n (hasFunctions extends true ? unknown : never)\n\nexport type DecodeFunctionResultReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n > = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n> = ContractFunctionReturnType<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName,\n args\n>\n\nexport type DecodeFunctionResultErrorType =\n | AbiFunctionNotFoundErrorType\n | AbiFunctionOutputsNotFoundErrorType\n | DecodeAbiParametersErrorType\n | GetAbiItemErrorType\n | ErrorType\n\nexport function decodeFunctionResult<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n const args extends ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n > = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n>(\n parameters: DecodeFunctionResultParameters,\n): DecodeFunctionResultReturnType {\n const { abi, args, functionName, data } =\n parameters as DecodeFunctionResultParameters\n\n let abiItem = abi[0]\n if (functionName) {\n const item = getAbiItem({ abi, args, name: functionName })\n if (!item) throw new AbiFunctionNotFoundError(functionName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'function')\n throw new AbiFunctionNotFoundError(undefined, { docsPath })\n if (!abiItem.outputs)\n throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath })\n\n const values = decodeAbiParameters(abiItem.outputs, data)\n if (values && values.length > 1)\n return values as DecodeFunctionResultReturnType\n if (values && values.length === 1)\n return values[0] as DecodeFunctionResultReturnType\n return undefined as DecodeFunctionResultReturnType\n}\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// 100 lines of code in the file are duplicated from noble-hashes (utils).\n// This is OK: `abstract` directory does not use noble-hashes.\n// User may opt-in into using different hashing library. This way, noble-hashes\n// won't be included into their bundle.\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n (message: Uint8Array | string): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\nexport function abytes(item: unknown): void {\n if (!isBytes(item)) throw new Error('Uint8Array expected');\n}\n\nexport function abool(title: string, value: boolean): void {\n if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean =\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// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n abytes(bytes);\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'private key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n let res: Uint8Array;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes(hex);\n } catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n } else if (isBytes(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n } else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\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\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n// Global symbols in both browsers and Node.js since v11\n// See https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([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// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\nconst u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\nconst u8fr = (arr: ArrayLike) => Uint8Array.from(arr); // another shortcut\ntype Pred = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred) => T {\n if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8fr([0x00]), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(u8fr([0x01]), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n bigint: (val: any): boolean => typeof val === 'bigint',\n function: (val: any): boolean => typeof val === 'function',\n boolean: (val: any): boolean => typeof val === 'boolean',\n string: (val: any): boolean => typeof val === 'string',\n stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes(val),\n isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n array: (val: any): boolean => Array.isArray(val),\n field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap> = { [K in keyof T]?: Validator };\n// type Record = { [P in K]: T; }\n\nexport function validateObject>(\n object: T,\n validators: ValMap,\n optValidators: ValMap = {}\n): T {\n const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n const val = object[fieldName as keyof typeof object];\n if (isOptional && val === undefined) return;\n if (!checkVal(val, object)) {\n throw new Error(\n 'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n );\n }\n };\n for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n","/** @internal */\nexport const version = '0.1.1'\n","import { version } from '../version.js'\n\n/** @internal */\nexport function getUrl(url: string) {\n return url\n}\n\n/** @internal */\nexport function getVersion() {\n return version\n}\n\n/** @internal */\nexport function prettyPrint(args: unknown) {\n if (!args) return ''\n const entries = Object.entries(args)\n .map(([key, value]) => {\n if (value === undefined || value === false) return null\n return [key, value]\n })\n .filter(Boolean) as [string, string][]\n const maxLength = entries.reduce((acc, [key]) => Math.max(acc, key.length), 0)\n return entries\n .map(([key, value]) => ` ${`${key}:`.padEnd(maxLength + 1)} ${value}`)\n .join('\\n')\n}\n","import { getVersion } from './internal/errors.js'\n\nexport type GlobalErrorType = Error & {\n name: name\n}\n\n/**\n * Base error class inherited by all errors thrown by ox.\n *\n * @example\n * ```ts\n * import { Errors } from 'ox'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nexport class BaseError<\n cause extends Error | undefined = undefined,\n> extends Error {\n details: string\n docs?: string | undefined\n docsOrigin?: string | undefined\n docsPath?: string | undefined\n shortMessage: string\n showVersion?: boolean | undefined\n version?: string | undefined\n\n override cause: cause\n override name = 'BaseError'\n\n static defaultStaticOptions = {\n docsOrigin: 'https://oxlib.sh',\n showVersion: false,\n version: `ox@${getVersion()}`,\n } satisfies BaseError.GlobalOptions\n\n static setStaticOptions(options: BaseError.GlobalOptions) {\n BaseError.prototype.docsOrigin = options.docsOrigin\n BaseError.prototype.showVersion = options.showVersion\n BaseError.prototype.version = options.version\n }\n\n static {\n BaseError.setStaticOptions(BaseError.defaultStaticOptions)\n }\n\n constructor(shortMessage: string, options: BaseError.Options = {}) {\n const details = (() => {\n if (options.cause instanceof BaseError) {\n if (options.cause.details) return options.cause.details\n if (options.cause.shortMessage) return options.cause.shortMessage\n }\n if (\n options.cause &&\n 'details' in options.cause &&\n typeof options.cause.details === 'string'\n )\n return options.cause.details\n if (options.cause?.message) return options.cause.message\n return options.details!\n })()\n const docsPath = (() => {\n if (options.cause instanceof BaseError)\n return options.cause.docsPath || options.docsPath\n return options.docsPath\n })()\n\n const docsBaseUrl = options.docsOrigin ?? BaseError.prototype.docsOrigin\n const docs = `${docsBaseUrl}${docsPath ?? ''}`\n const showVersion = Boolean(\n options.version ?? BaseError.prototype.showVersion,\n )\n const version = options.version ?? BaseError.prototype.version\n\n const message = [\n shortMessage || 'An error occurred.',\n ...(options.metaMessages ? ['', ...options.metaMessages] : []),\n ...(details || docsPath || showVersion\n ? [\n '',\n details ? `Details: ${details}` : undefined,\n docsPath ? `See: ${docs}` : undefined,\n showVersion ? `Version: ${version}` : undefined,\n ]\n : []),\n ]\n .filter((x) => typeof x === 'string')\n .join('\\n')\n\n super(message, options.cause ? { cause: options.cause } : undefined)\n\n this.cause = options.cause as any\n this.details = details\n this.docs = docs\n this.docsOrigin = docsBaseUrl\n this.docsPath = docsPath\n this.shortMessage = shortMessage\n this.showVersion = showVersion\n this.version = version\n }\n\n walk(): Error\n walk(fn: (err: unknown) => boolean): Error | null\n walk(fn?: any): any {\n return walk(this, fn)\n }\n}\n\nexport declare namespace BaseError {\n type Options = {\n /** Cause of the error. */\n cause?: cause | undefined\n /** Details of the error. */\n details?: string | undefined\n /** Origin of the docs. */\n docsOrigin?: string | undefined\n /** Path of the docs. */\n docsPath?: string | undefined\n /** Meta messages to add to the error. */\n metaMessages?: (string | undefined)[] | undefined\n /** Version of the library to attribute the error to. */\n version?: string | undefined\n }\n\n type GlobalOptions = {\n /** Origin of the docs. */\n docsOrigin?: string | undefined\n /** Whether to show the version of the library in the error message. */\n showVersion?: boolean | undefined\n /** Version of the library to attribute the error to. */\n version?: string | undefined\n }\n}\n\n/** @internal */\nfunction walk(\n err: unknown,\n fn?: ((err: unknown) => boolean) | undefined,\n): unknown {\n if (fn?.(err)) return err\n if (err && typeof err === 'object' && 'cause' in err && err.cause)\n return walk(err.cause, fn)\n return fn ? null : err\n}\n","import * as Bytes from '../Bytes.js'\nimport type * as Errors from '../Errors.js'\n\n/** @internal */\nexport function assertSize(bytes: Bytes.Bytes, size_: number): void {\n if (Bytes.size(bytes) > size_)\n throw new Bytes.SizeOverflowError({\n givenSize: Bytes.size(bytes),\n maxSize: size_,\n })\n}\n\n/** @internal */\nexport declare namespace assertSize {\n type ErrorType =\n | Bytes.size.ErrorType\n | Bytes.SizeOverflowError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertStartOffset(\n value: Bytes.Bytes,\n start?: number | undefined,\n) {\n if (typeof start === 'number' && start > 0 && start > Bytes.size(value) - 1)\n throw new Bytes.SliceOffsetOutOfBoundsError({\n offset: start,\n position: 'start',\n size: Bytes.size(value),\n })\n}\n\nexport declare namespace assertStartOffset {\n export type ErrorType =\n | Bytes.SliceOffsetOutOfBoundsError\n | Bytes.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertEndOffset(\n value: Bytes.Bytes,\n start?: number | undefined,\n end?: number | undefined,\n) {\n if (\n typeof start === 'number' &&\n typeof end === 'number' &&\n Bytes.size(value) !== end - start\n ) {\n throw new Bytes.SliceOffsetOutOfBoundsError({\n offset: end,\n position: 'end',\n size: Bytes.size(value),\n })\n }\n}\n\n/** @internal */\nexport declare namespace assertEndOffset {\n type ErrorType =\n | Bytes.SliceOffsetOutOfBoundsError\n | Bytes.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport const charCodeMap = {\n zero: 48,\n nine: 57,\n A: 65,\n F: 70,\n a: 97,\n f: 102,\n} as const\n\n/** @internal */\nexport function charCodeToBase16(char: number) {\n if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n return char - charCodeMap.zero\n if (char >= charCodeMap.A && char <= charCodeMap.F)\n return char - (charCodeMap.A - 10)\n if (char >= charCodeMap.a && char <= charCodeMap.f)\n return char - (charCodeMap.a - 10)\n return undefined\n}\n\n/** @internal */\nexport function pad(bytes: Bytes.Bytes, options: pad.Options = {}) {\n const { dir, size = 32 } = options\n if (size === 0) return bytes\n if (bytes.length > size)\n throw new Bytes.SizeExceedsPaddingSizeError({\n size: bytes.length,\n targetSize: size,\n type: 'Bytes',\n })\n const paddedBytes = new Uint8Array(size)\n for (let i = 0; i < size; i++) {\n const padEnd = dir === 'right'\n paddedBytes[padEnd ? i : size - i - 1] =\n bytes[padEnd ? i : bytes.length - i - 1]!\n }\n return paddedBytes\n}\n\n/** @internal */\nexport declare namespace pad {\n type Options = {\n dir?: 'left' | 'right' | undefined\n size?: number | undefined\n }\n\n type ReturnType = Bytes.Bytes\n\n type ErrorType = Bytes.SizeExceedsPaddingSizeError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function trim(\n value: Bytes.Bytes,\n options: trim.Options = {},\n): trim.ReturnType {\n const { dir = 'left' } = options\n\n let data = value\n\n let sliceLength = 0\n for (let i = 0; i < data.length - 1; i++) {\n if (data[dir === 'left' ? i : data.length - i - 1]!.toString() === '0')\n sliceLength++\n else break\n }\n data =\n dir === 'left'\n ? data.slice(sliceLength)\n : data.slice(0, data.length - sliceLength)\n\n return data as trim.ReturnType\n}\n\n/** @internal */\nexport declare namespace trim {\n type Options = {\n dir?: 'left' | 'right' | undefined\n }\n\n type ReturnType = Bytes.Bytes\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import type * as Errors from '../Errors.js'\nimport * as Hex from '../Hex.js'\n\n/** @internal */\nexport function assertSize(hex: Hex.Hex, size_: number): void {\n if (Hex.size(hex) > size_)\n throw new Hex.SizeOverflowError({\n givenSize: Hex.size(hex),\n maxSize: size_,\n })\n}\n\n/** @internal */\nexport declare namespace assertSize {\n type ErrorType =\n | Hex.size.ErrorType\n | Hex.SizeOverflowError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertStartOffset(value: Hex.Hex, start?: number | undefined) {\n if (typeof start === 'number' && start > 0 && start > Hex.size(value) - 1)\n throw new Hex.SliceOffsetOutOfBoundsError({\n offset: start,\n position: 'start',\n size: Hex.size(value),\n })\n}\n\nexport declare namespace assertStartOffset {\n type ErrorType =\n | Hex.SliceOffsetOutOfBoundsError\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertEndOffset(\n value: Hex.Hex,\n start?: number | undefined,\n end?: number | undefined,\n) {\n if (\n typeof start === 'number' &&\n typeof end === 'number' &&\n Hex.size(value) !== end - start\n ) {\n throw new Hex.SliceOffsetOutOfBoundsError({\n offset: end,\n position: 'end',\n size: Hex.size(value),\n })\n }\n}\n\nexport declare namespace assertEndOffset {\n type ErrorType =\n | Hex.SliceOffsetOutOfBoundsError\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function pad(hex_: Hex.Hex, options: pad.Options = {}) {\n const { dir, size = 32 } = options\n\n if (size === 0) return hex_\n\n const hex = hex_.replace('0x', '')\n if (hex.length > size * 2)\n throw new Hex.SizeExceedsPaddingSizeError({\n size: Math.ceil(hex.length / 2),\n targetSize: size,\n type: 'Hex',\n })\n\n return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](size * 2, '0')}` as Hex.Hex\n}\n\n/** @internal */\nexport declare namespace pad {\n type Options = {\n dir?: 'left' | 'right' | undefined\n size?: number | undefined\n }\n type ErrorType = Hex.SizeExceedsPaddingSizeError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function trim(\n value: Hex.Hex,\n options: trim.Options = {},\n): trim.ReturnType {\n const { dir = 'left' } = options\n\n let data = value.replace('0x', '')\n\n let sliceLength = 0\n for (let i = 0; i < data.length - 1; i++) {\n if (data[dir === 'left' ? i : data.length - i - 1]!.toString() === '0')\n sliceLength++\n else break\n }\n data =\n dir === 'left'\n ? data.slice(sliceLength)\n : data.slice(0, data.length - sliceLength)\n\n if (data === '0') return '0x'\n if (dir === 'right' && data.length % 2 === 1) return `0x${data}0`\n return `0x${data}` as trim.ReturnType\n}\n\n/** @internal */\nexport declare namespace trim {\n type Options = {\n dir?: 'left' | 'right' | undefined\n }\n\n type ReturnType = Hex.Hex\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import type * as Errors from './Errors.js'\n\nconst bigIntSuffix = '#__bigint'\n\n/**\n * Serializes a value to a canonical JSON string as defined by\n * [RFC 8785 (JSON Canonicalization Scheme)](https://www.rfc-editor.org/rfc/rfc8785).\n *\n * - Object keys are sorted recursively by UTF-16 code unit comparison.\n * - Primitives are serialized per ECMAScript rules (no trailing zeros on numbers, etc.).\n * - No whitespace is inserted.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.canonicalize({ b: 2, a: 1 })\n * // @log: '{\"a\":1,\"b\":2}'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.canonicalize({ z: [3, { y: 1, x: 2 }], a: 'hello' })\n * // @log: '{\"a\":\"hello\",\"z\":[3,{\"x\":2,\"y\":1}]}'\n * ```\n *\n * @param value - The value to canonicalize.\n * @returns The canonical JSON string.\n */\nexport function canonicalize(value: unknown): string {\n if (value === null || typeof value === 'boolean' || typeof value === 'string')\n return JSON.stringify(value)\n if (typeof value === 'number') {\n if (!Number.isFinite(value))\n throw new TypeError('Cannot canonicalize non-finite number')\n return Object.is(value, -0) ? '0' : JSON.stringify(value)\n }\n if (typeof value === 'bigint')\n throw new TypeError('Cannot canonicalize bigint')\n if (Array.isArray(value))\n return `[${value.map((item) => canonicalize(item)).join(',')}]`\n if (typeof value === 'object') {\n const entries = Object.keys(value as Record)\n .sort()\n .reduce((acc, key) => {\n const v = (value as Record)[key]\n if (v !== undefined)\n acc.push(`${JSON.stringify(key)}:${canonicalize(v)}`)\n return acc\n }, [])\n return `{${entries.join(',')}}`\n }\n return undefined as never\n}\n\nexport declare namespace canonicalize {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses a JSON string, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.parse('{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}')\n * // @log: {\n * // @log: foo: 'bar',\n * // @log: baz: 69420694206942069420694206942069420694206942069420n\n * // @log: }\n * ```\n *\n * @param string - The value to parse.\n * @param reviver - A function that transforms the results.\n * @returns The parsed value.\n */\nexport function parse(\n string: string,\n reviver?: ((this: any, key: string, value: any) => any) | undefined,\n) {\n return JSON.parse(string, (key, value_) => {\n const value = value_\n if (typeof value === 'string' && value.endsWith(bigIntSuffix))\n return BigInt(value.slice(0, -bigIntSuffix.length))\n return typeof reviver === 'function' ? reviver(key, value) : value\n })\n}\n\nexport declare namespace parse {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Stringifies a value to its JSON representation, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.stringify({\n * foo: 'bar',\n * baz: 69420694206942069420694206942069420694206942069420n,\n * })\n * // @log: '{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}'\n * ```\n *\n * @param value - The value to stringify.\n * @param replacer - A function that transforms the results. It is passed the key and value of the property, and must return the value to be used in the JSON string. If this function returns `undefined`, the property is not included in the resulting JSON string.\n * @param space - A string or number that determines the indentation of the JSON string. If it is a number, it indicates the number of spaces to use as indentation; if it is a string (e.g. `'\\t'`), it uses the string as the indentation character.\n * @returns The JSON string.\n */\nexport function stringify(\n value: any,\n replacer?: ((this: any, key: string, value: any) => any) | null | undefined,\n space?: string | number | undefined,\n) {\n return JSON.stringify(\n value,\n (key, value) => {\n if (typeof replacer === 'function') return replacer(key, value)\n if (typeof value === 'bigint') return value.toString() + bigIntSuffix\n return value\n },\n space,\n )\n}\n\nexport declare namespace stringify {\n type ErrorType = Errors.GlobalErrorType\n}\n","import { equalBytes } from '@noble/curves/abstract/utils'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as internal from './internal/bytes.js'\nimport * as internal_hex from './internal/hex.js'\nimport * as Json from './Json.js'\n\nconst decoder = /*#__PURE__*/ new TextDecoder()\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\n/** Root type for a Bytes array. */\nexport type Bytes = Uint8Array\n\n/**\n * Asserts if the given value is {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.assert('abc')\n * // @error: Bytes.InvalidBytesTypeError:\n * // @error: Value `\"abc\"` of type `string` is an invalid Bytes value.\n * // @error: Bytes values must be of type `Uint8Array`.\n * ```\n *\n * @param value - Value to assert.\n */\nexport function assert(value: unknown): asserts value is Bytes {\n if (value instanceof Uint8Array) return\n if (!value) throw new InvalidBytesTypeError(value)\n if (typeof value !== 'object') throw new InvalidBytesTypeError(value)\n if (!('BYTES_PER_ELEMENT' in value)) throw new InvalidBytesTypeError(value)\n if (value.BYTES_PER_ELEMENT !== 1 || value.constructor.name !== 'Uint8Array')\n throw new InvalidBytesTypeError(value)\n}\n\nexport declare namespace assert {\n type ErrorType = InvalidBytesTypeError | Errors.GlobalErrorType\n}\n\n/**\n * Concatenates two or more {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const bytes = Bytes.concat(\n * Bytes.from([1]),\n * Bytes.from([69]),\n * Bytes.from([420, 69]),\n * )\n * // @log: Uint8Array [ 1, 69, 420, 69 ]\n * ```\n *\n * @param values - Values to concatenate.\n * @returns Concatenated {@link ox#Bytes.Bytes}.\n */\nexport function concat(...values: readonly Bytes[]): Bytes {\n let length = 0\n for (const arr of values) {\n length += arr.length\n }\n const result = new Uint8Array(length)\n for (let i = 0, index = 0; i < values.length; i++) {\n const arr = values[i]\n result.set(arr!, index)\n index += arr!.length\n }\n return result\n}\n\nexport declare namespace concat {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a {@link ox#Bytes.Bytes} value from a `Uint8Array`, a hex string, or an array of unsigned 8-bit integers.\n *\n * :::tip\n *\n * To instantiate from a **Boolean**, **String**, or **Number**, use one of the following:\n *\n * - `Bytes.fromBoolean`\n *\n * - `Bytes.fromString`\n *\n * - `Bytes.fromNumber`\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.from([255, 124, 5, 4])\n * // @log: Uint8Array([255, 124, 5, 4])\n *\n * const data = Bytes.from('0xdeadbeef')\n * // @log: Uint8Array([222, 173, 190, 239])\n * ```\n *\n * @param value - Value to convert.\n * @returns A {@link ox#Bytes.Bytes} instance.\n */\nexport function from(value: Hex.Hex | Bytes | readonly number[]): Bytes {\n if (value instanceof Uint8Array) return value\n if (typeof value === 'string') return fromHex(value)\n return fromArray(value)\n}\n\nexport declare namespace from {\n type ErrorType =\n | fromHex.ErrorType\n | fromArray.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts an array of unsigned 8-bit integers into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromArray([255, 124, 5, 4])\n * // @log: Uint8Array([255, 124, 5, 4])\n * ```\n *\n * @param value - Value to convert.\n * @returns A {@link ox#Bytes.Bytes} instance.\n */\nexport function fromArray(value: readonly number[] | Uint8Array): Bytes {\n return value instanceof Uint8Array ? value : new Uint8Array(value)\n}\n\nexport declare namespace fromArray {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Encodes a boolean value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromBoolean(true)\n * // @log: Uint8Array([1])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromBoolean(true, { size: 32 })\n * // @log: Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n * ```\n *\n * @param value - Boolean value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromBoolean(value: boolean, options: fromBoolean.Options = {}) {\n const { size } = options\n const bytes = new Uint8Array(1)\n bytes[0] = Number(value)\n if (typeof size === 'number') {\n internal.assertSize(bytes, size)\n return padLeft(bytes, size)\n }\n return bytes\n}\n\nexport declare namespace fromBoolean {\n type Options = {\n /** Size of the output bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Hex.Hex} value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromHex('0x48656c6c6f20776f726c6421')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromHex('0x48656c6c6f20776f726c6421', { size: 32 })\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n * ```\n *\n * @param value - {@link ox#Hex.Hex} value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromHex(value: Hex.Hex, options: fromHex.Options = {}): Bytes {\n const { size } = options\n\n let hex = value\n if (size) {\n internal_hex.assertSize(value, size)\n hex = Hex.padRight(value, size)\n }\n\n let hexString = hex.slice(2) as string\n if (hexString.length % 2) hexString = `0${hexString}`\n\n const length = hexString.length / 2\n const bytes = new Uint8Array(length)\n for (let index = 0, j = 0; index < length; index++) {\n const nibbleLeft = internal.charCodeToBase16(hexString.charCodeAt(j++))\n const nibbleRight = internal.charCodeToBase16(hexString.charCodeAt(j++))\n if (nibbleLeft === undefined || nibbleRight === undefined) {\n throw new Errors.BaseError(\n `Invalid byte sequence (\"${hexString[j - 2]}${hexString[j - 1]}\" in \"${hexString}\").`,\n )\n }\n bytes[index] = (nibbleLeft << 4) | nibbleRight\n }\n return bytes\n}\n\nexport declare namespace fromHex {\n type Options = {\n /** Size of the output bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal_hex.assertSize.ErrorType\n | Hex.padRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a number value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromNumber(420)\n * // @log: Uint8Array([1, 164])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromNumber(420, { size: 4 })\n * // @log: Uint8Array([0, 0, 1, 164])\n * ```\n *\n * @param value - Number value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromNumber(\n value: bigint | number,\n options?: fromNumber.Options | undefined,\n) {\n const hex = Hex.fromNumber(value, options)\n return fromHex(hex)\n}\n\nexport declare namespace fromNumber {\n export type Options = Hex.fromNumber.Options\n\n export type ErrorType =\n | Hex.fromNumber.ErrorType\n | fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a string into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromString('Hello world!')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromString('Hello world!', { size: 32 })\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n * ```\n *\n * @param value - String to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromString(\n value: string,\n options: fromString.Options = {},\n): Bytes {\n const { size } = options\n\n const bytes = encoder.encode(value)\n if (typeof size === 'number') {\n internal.assertSize(bytes, size)\n return padRight(bytes, size)\n }\n return bytes\n}\n\nexport declare namespace fromString {\n type Options = {\n /** Size of the output bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if two {@link ox#Bytes.Bytes} values are equal.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.isEqual(Bytes.from([1]), Bytes.from([1]))\n * // @log: true\n *\n * Bytes.isEqual(Bytes.from([1]), Bytes.from([2]))\n * // @log: false\n * ```\n *\n * @param bytesA - First {@link ox#Bytes.Bytes} value.\n * @param bytesB - Second {@link ox#Bytes.Bytes} value.\n * @returns `true` if the two values are equal, otherwise `false`.\n */\nexport function isEqual(bytesA: Bytes, bytesB: Bytes) {\n return equalBytes(bytesA, bytesB)\n}\n\nexport declare namespace isEqual {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Bytes.Bytes} value to the left with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padLeft(Bytes.from([1]), 4)\n * // @log: Uint8Array([0, 0, 0, 1])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value to pad.\n * @param size - Size to pad the {@link ox#Bytes.Bytes} value to.\n * @returns Padded {@link ox#Bytes.Bytes} value.\n */\nexport function padLeft(\n value: Bytes,\n size?: number | undefined,\n): padLeft.ReturnType {\n return internal.pad(value, { dir: 'left', size })\n}\n\nexport declare namespace padLeft {\n type ReturnType = internal.pad.ReturnType\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Bytes.Bytes} value to the right with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padRight(Bytes.from([1]), 4)\n * // @log: Uint8Array([1, 0, 0, 0])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value to pad.\n * @param size - Size to pad the {@link ox#Bytes.Bytes} value to.\n * @returns Padded {@link ox#Bytes.Bytes} value.\n */\nexport function padRight(\n value: Bytes,\n size?: number | undefined,\n): padRight.ReturnType {\n return internal.pad(value, { dir: 'right', size })\n}\n\nexport declare namespace padRight {\n type ReturnType = internal.pad.ReturnType\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Generates random {@link ox#Bytes.Bytes} of the specified length.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const bytes = Bytes.random(32)\n * // @log: Uint8Array([... x32])\n * ```\n *\n * @param length - Length of the random {@link ox#Bytes.Bytes} to generate.\n * @returns Random {@link ox#Bytes.Bytes} of the specified length.\n */\nexport function random(length: number): Bytes {\n return crypto.getRandomValues(new Uint8Array(length))\n}\n\nexport declare namespace random {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Retrieves the size of a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.size(Bytes.from([1, 2, 3, 4]))\n * // @log: 4\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Size of the {@link ox#Bytes.Bytes} value.\n */\nexport function size(value: Bytes): number {\n return value.length\n}\n\nexport declare namespace size {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Returns a section of a {@link ox#Bytes.Bytes} value given a start/end bytes offset.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.slice(\n * Bytes.from([1, 2, 3, 4, 5, 6, 7, 8, 9]),\n * 1,\n * 4,\n * )\n * // @log: Uint8Array([2, 3, 4])\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value.\n * @param start - Start offset.\n * @param end - End offset.\n * @param options - Slice options.\n * @returns Sliced {@link ox#Bytes.Bytes} value.\n */\nexport function slice(\n value: Bytes,\n start?: number | undefined,\n end?: number | undefined,\n options: slice.Options = {},\n): Bytes {\n const { strict } = options\n internal.assertStartOffset(value, start)\n const value_ = value.slice(start, end)\n if (strict) internal.assertEndOffset(value_, start, end)\n return value_\n}\n\nexport declare namespace slice {\n type Options = {\n /** Asserts that the sliced value is the same size as the given start/end offsets. */\n strict?: boolean | undefined\n }\n\n export type ErrorType =\n | internal.assertStartOffset.ErrorType\n | internal.assertEndOffset.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a bigint.\n *\n * @example\n * ```ts\n * import { Bytes } from 'ox'\n *\n * Bytes.toBigInt(Bytes.from([1, 164]))\n * // @log: 420n\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Decoding options.\n * @returns Decoded bigint.\n */\nexport function toBigInt(bytes: Bytes, options: toBigInt.Options = {}): bigint {\n const { size } = options\n if (typeof size !== 'undefined') internal.assertSize(bytes, size)\n const hex = Hex.fromBytes(bytes, options)\n return Hex.toBigInt(hex, options)\n}\n\nexport declare namespace toBigInt {\n type Options = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Hex.toBigInt.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a boolean.\n *\n * @example\n * ```ts\n * import { Bytes } from 'ox'\n *\n * Bytes.toBoolean(Bytes.from([1]))\n * // @log: true\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Decoding options.\n * @returns Decoded boolean.\n */\nexport function toBoolean(\n bytes: Bytes,\n options: toBoolean.Options = {},\n): boolean {\n const { size } = options\n let bytes_ = bytes\n if (typeof size !== 'undefined') {\n internal.assertSize(bytes_, size)\n bytes_ = trimLeft(bytes_)\n }\n if (bytes_.length > 1 || bytes_[0]! > 1)\n throw new InvalidBytesBooleanError(bytes_)\n return Boolean(bytes_[0])\n}\n\nexport declare namespace toBoolean {\n type Options = {\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | trimLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toHex(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Options.\n * @returns Decoded {@link ox#Hex.Hex} value.\n */\nexport function toHex(value: Bytes, options: toHex.Options = {}): Hex.Hex {\n return Hex.fromBytes(value, options)\n}\n\nexport declare namespace toHex {\n type Options = {\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType = Hex.fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a number.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toNumber(Bytes.from([1, 164]))\n * // @log: 420\n * ```\n */\nexport function toNumber(bytes: Bytes, options: toNumber.Options = {}): number {\n const { size } = options\n if (typeof size !== 'undefined') internal.assertSize(bytes, size)\n const hex = Hex.fromBytes(bytes, options)\n return Hex.toNumber(hex, options)\n}\n\nexport declare namespace toNumber {\n type Options = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Hex.toNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a string.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.toString(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: 'Hello world'\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Options.\n * @returns Decoded string.\n */\nexport function toString(bytes: Bytes, options: toString.Options = {}): string {\n const { size } = options\n\n let bytes_ = bytes\n if (typeof size !== 'undefined') {\n internal.assertSize(bytes_, size)\n bytes_ = trimRight(bytes_)\n }\n return decoder.decode(bytes_)\n}\n\nexport declare namespace toString {\n export type Options = {\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n export type ErrorType =\n | internal.assertSize.ErrorType\n | trimRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Trims leading zeros from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.trimLeft(Bytes.from([0, 0, 0, 0, 1, 2, 3]))\n * // @log: Uint8Array([1, 2, 3])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Trimmed {@link ox#Bytes.Bytes} value.\n */\nexport function trimLeft(value: Bytes): Bytes {\n return internal.trim(value, { dir: 'left' })\n}\n\nexport declare namespace trimLeft {\n type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Trims trailing zeros from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.trimRight(Bytes.from([1, 2, 3, 0, 0, 0, 0]))\n * // @log: Uint8Array([1, 2, 3])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Trimmed {@link ox#Bytes.Bytes} value.\n */\nexport function trimRight(value: Bytes): Bytes {\n return internal.trim(value, { dir: 'right' })\n}\n\nexport declare namespace trimRight {\n export type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Checks if the given value is {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.validate('0x')\n * // @log: false\n *\n * Bytes.validate(Bytes.from([1, 2, 3]))\n * // @log: true\n * ```\n *\n * @param value - Value to check.\n * @returns `true` if the value is {@link ox#Bytes.Bytes}, otherwise `false`.\n */\nexport function validate(value: unknown): value is Bytes {\n try {\n assert(value)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Thrown when the bytes value cannot be represented as a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toBoolean(Bytes.from([5]))\n * // @error: Bytes.InvalidBytesBooleanError: Bytes value `[5]` is not a valid boolean.\n * // @error: The bytes array must contain a single byte of either a `0` or `1` value.\n * ```\n */\nexport class InvalidBytesBooleanError extends Errors.BaseError {\n override readonly name = 'Bytes.InvalidBytesBooleanError'\n\n constructor(bytes: Bytes) {\n super(`Bytes value \\`${bytes}\\` is not a valid boolean.`, {\n metaMessages: [\n 'The bytes array must contain a single byte of either a `0` or `1` value.',\n ],\n })\n }\n}\n\n/**\n * Thrown when a value cannot be converted to bytes.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Bytes } from 'ox'\n *\n * Bytes.from('foo')\n * // @error: Bytes.InvalidBytesTypeError: Value `foo` of type `string` is an invalid Bytes value.\n * ```\n */\nexport class InvalidBytesTypeError extends Errors.BaseError {\n override readonly name = 'Bytes.InvalidBytesTypeError'\n\n constructor(value: unknown) {\n super(\n `Value \\`${typeof value === 'object' ? Json.stringify(value) : value}\\` of type \\`${typeof value}\\` is an invalid Bytes value.`,\n {\n metaMessages: ['Bytes values must be of type `Bytes`.'],\n },\n )\n }\n}\n\n/**\n * Thrown when a size exceeds the maximum allowed size.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.fromString('Hello World!', { size: 8 })\n * // @error: Bytes.SizeOverflowError: Size cannot exceed `8` bytes. Given size: `12` bytes.\n * ```\n */\nexport class SizeOverflowError extends Errors.BaseError {\n override readonly name = 'Bytes.SizeOverflowError'\n\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed \\`${maxSize}\\` bytes. Given size: \\`${givenSize}\\` bytes.`,\n )\n }\n}\n\n/**\n * Thrown when a slice offset is out-of-bounds.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.slice(Bytes.from([1, 2, 3]), 4)\n * // @error: Bytes.SliceOffsetOutOfBoundsError: Slice starting at offset `4` is out-of-bounds (size: `3`).\n * ```\n */\nexport class SliceOffsetOutOfBoundsError extends Errors.BaseError {\n override readonly name = 'Bytes.SliceOffsetOutOfBoundsError'\n\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \\`${offset}\\` is out-of-bounds (size: \\`${size}\\`).`,\n )\n }\n}\n\n/**\n * Thrown when a the padding size exceeds the maximum allowed size.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padLeft(Bytes.fromString('Hello World!'), 8)\n * // @error: [Bytes.SizeExceedsPaddingSizeError: Bytes size (`12`) exceeds padding size (`8`).\n * ```\n */\nexport class SizeExceedsPaddingSizeError extends Errors.BaseError {\n override readonly name = 'Bytes.SizeExceedsPaddingSizeError'\n\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'Hex' | 'Bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (\\`${size}\\`) exceeds padding size (\\`${targetSize}\\`).`,\n )\n }\n}\n","import { equalBytes } from '@noble/curves/abstract/utils'\nimport * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as internal_bytes from './internal/bytes.js'\nimport * as internal from './internal/hex.js'\nimport * as Json from './Json.js'\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) =>\n i.toString(16).padStart(2, '0'),\n)\n\n/** Root type for a Hex string. */\nexport type Hex = `0x${string}`\n\n/**\n * Asserts if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('abc')\n * // @error: InvalidHexValueTypeError:\n * // @error: Value `\"abc\"` of type `string` is an invalid hex type.\n * // @error: Hex types must be represented as `\"0x\\${string}\"`.\n * ```\n *\n * @param value - The value to assert.\n * @param options - Options.\n */\nexport function assert(\n value: unknown,\n options: assert.Options = {},\n): asserts value is Hex {\n const { strict = false } = options\n if (!value) throw new InvalidHexTypeError(value)\n if (typeof value !== 'string') throw new InvalidHexTypeError(value)\n if (strict) {\n if (!/^0x[0-9a-fA-F]*$/.test(value)) throw new InvalidHexValueError(value)\n }\n if (!value.startsWith('0x')) throw new InvalidHexValueError(value)\n}\n\nexport declare namespace assert {\n type Options = {\n /** Checks if the {@link ox#Hex.Hex} value contains invalid hexadecimal characters. @default false */\n strict?: boolean | undefined\n }\n\n type ErrorType =\n | InvalidHexTypeError\n | InvalidHexValueError\n | Errors.GlobalErrorType\n}\n\n/**\n * Concatenates two or more {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.concat('0x123', '0x456')\n * // @log: '0x123456'\n * ```\n *\n * @param values - The {@link ox#Hex.Hex} values to concatenate.\n * @returns The concatenated {@link ox#Hex.Hex} value.\n */\nexport function concat(...values: readonly Hex[]): Hex {\n return `0x${(values as Hex[]).reduce((acc, x) => acc + x.replace('0x', ''), '')}`\n}\n\nexport declare namespace concat {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a {@link ox#Hex.Hex} value from a hex string or {@link ox#Bytes.Bytes} value.\n *\n * :::tip\n *\n * To instantiate from a **Boolean**, **String**, or **Number**, use one of the following:\n *\n * - `Hex.fromBoolean`\n *\n * - `Hex.fromString`\n *\n * - `Hex.fromNumber`\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.from('0x48656c6c6f20576f726c6421')\n * // @log: '0x48656c6c6f20576f726c6421'\n *\n * Hex.from(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function from(value: Hex | Bytes.Bytes | readonly number[]): Hex {\n if (value instanceof Uint8Array) return fromBytes(value)\n if (Array.isArray(value)) return fromBytes(new Uint8Array(value))\n return value as never\n}\n\nexport declare namespace from {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType = fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a boolean into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromBoolean(true)\n * // @log: '0x1'\n *\n * Hex.fromBoolean(false)\n * // @log: '0x0'\n *\n * Hex.fromBoolean(true, { size: 32 })\n * // @log: '0x0000000000000000000000000000000000000000000000000000000000000001'\n * ```\n *\n * @param value - The boolean value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromBoolean(\n value: boolean,\n options: fromBoolean.Options = {},\n): Hex {\n const hex: Hex = `0x${Number(value)}`\n if (typeof options.size === 'number') {\n internal.assertSize(hex, options.size)\n return padLeft(hex, options.size)\n }\n return hex\n}\n\nexport declare namespace fromBoolean {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.fromBytes(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromBytes(\n value: Bytes.Bytes,\n options: fromBytes.Options = {},\n): Hex {\n let string = ''\n for (let i = 0; i < value.length; i++) string += hexes[value[i]!]\n const hex = `0x${string}` as const\n\n if (typeof options.size === 'number') {\n internal.assertSize(hex, options.size)\n return padRight(hex, options.size)\n }\n return hex\n}\n\nexport declare namespace fromBytes {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a number or bigint into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420)\n * // @log: '0x1a4'\n *\n * Hex.fromNumber(420, { size: 32 })\n * // @log: '0x00000000000000000000000000000000000000000000000000000000000001a4'\n * ```\n *\n * @param value - The number or bigint value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromNumber(\n value: number | bigint,\n options: fromNumber.Options = {},\n): Hex {\n const { signed, size } = options\n\n const value_ = BigInt(value)\n\n let maxValue: bigint | number | undefined\n if (size) {\n if (signed) maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n\n else maxValue = 2n ** (BigInt(size) * 8n) - 1n\n } else if (typeof value === 'number') {\n maxValue = BigInt(Number.MAX_SAFE_INTEGER)\n }\n\n const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0\n\n if ((maxValue && value_ > maxValue) || value_ < minValue) {\n const suffix = typeof value === 'bigint' ? 'n' : ''\n throw new IntegerOutOfRangeError({\n max: maxValue ? `${maxValue}${suffix}` : undefined,\n min: `${minValue}${suffix}`,\n signed,\n size,\n value: `${value}${suffix}`,\n })\n }\n\n const stringValue = (\n signed && value_ < 0 ? BigInt.asUintN(size * 8, BigInt(value_)) : value_\n ).toString(16)\n\n const hex = `0x${stringValue}` as Hex\n if (size) return padLeft(hex, size) as Hex\n return hex\n}\n\nexport declare namespace fromNumber {\n type Options =\n | {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** The size (in bytes) of the output hex value. */\n size: number\n }\n | {\n signed?: undefined\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | IntegerOutOfRangeError\n | padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a string into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n * Hex.fromString('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * Hex.fromString('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n * ```\n *\n * @param value - The string value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromString(\n value: string,\n options: fromString.Options = {},\n): Hex {\n return fromBytes(encoder.encode(value), options)\n}\n\nexport declare namespace fromString {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType = fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Checks if two {@link ox#Hex.Hex} values are equal.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.isEqual('0xdeadbeef', '0xdeadbeef')\n * // @log: true\n *\n * Hex.isEqual('0xda', '0xba')\n * // @log: false\n * ```\n *\n * @param hexA - The first {@link ox#Hex.Hex} value.\n * @param hexB - The second {@link ox#Hex.Hex} value.\n * @returns `true` if the two {@link ox#Hex.Hex} values are equal, `false` otherwise.\n */\nexport function isEqual(hexA: Hex, hexB: Hex) {\n return equalBytes(Bytes.fromHex(hexA), Bytes.fromHex(hexB))\n}\n\nexport declare namespace isEqual {\n type ErrorType = Bytes.fromHex.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Hex.Hex} value to the left with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1234', 4)\n * // @log: '0x00001234'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nexport function padLeft(\n value: Hex,\n size?: number | undefined,\n): padLeft.ReturnType {\n return internal.pad(value, { dir: 'left', size })\n}\n\nexport declare namespace padLeft {\n type ReturnType = Hex\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Hex.Hex} value to the right with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts\n * import { Hex } from 'ox'\n *\n * Hex.padRight('0x1234', 4)\n * // @log: '0x12340000'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nexport function padRight(\n value: Hex,\n size?: number | undefined,\n): padRight.ReturnType {\n return internal.pad(value, { dir: 'right', size })\n}\n\nexport declare namespace padRight {\n type ReturnType = Hex\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Generates a random {@link ox#Hex.Hex} value of the specified length.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const hex = Hex.random(32)\n * // @log: '0x...'\n * ```\n *\n * @returns Random {@link ox#Hex.Hex} value.\n */\nexport function random(length: number): Hex {\n return fromBytes(Bytes.random(length))\n}\n\nexport declare namespace random {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Returns a section of a {@link ox#Bytes.Bytes} value given a start/end bytes offset.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 1, 4)\n * // @log: '0x234567'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to slice.\n * @param start - The start offset (in bytes).\n * @param end - The end offset (in bytes).\n * @param options - Options.\n * @returns The sliced {@link ox#Hex.Hex} value.\n */\nexport function slice(\n value: Hex,\n start?: number | undefined,\n end?: number | undefined,\n options: slice.Options = {},\n): Hex {\n const { strict } = options\n internal.assertStartOffset(value, start)\n const value_ = `0x${value\n .replace('0x', '')\n .slice((start ?? 0) * 2, (end ?? value.length) * 2)}` as const\n if (strict) internal.assertEndOffset(value_, start, end)\n return value_\n}\n\nexport declare namespace slice {\n type Options = {\n /** Asserts that the sliced value is the same size as the given start/end offsets. */\n strict?: boolean | undefined\n }\n\n type ErrorType =\n | internal.assertStartOffset.ErrorType\n | internal.assertEndOffset.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Retrieves the size of a {@link ox#Hex.Hex} value (in bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.size('0xdeadbeef')\n * // @log: 4\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to get the size of.\n * @returns The size of the {@link ox#Hex.Hex} value (in bytes).\n */\nexport function size(value: Hex): number {\n return Math.ceil((value.length - 2) / 2)\n}\n\nexport declare namespace size {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Trims leading zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimLeft('0x00000000deadbeef')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nexport function trimLeft(value: Hex): trimLeft.ReturnType {\n return internal.trim(value, { dir: 'left' })\n}\n\nexport declare namespace trimLeft {\n type ReturnType = Hex\n\n type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Trims trailing zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimRight('0xdeadbeef00000000')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nexport function trimRight(value: Hex): trimRight.ReturnType {\n return internal.trim(value, { dir: 'right' })\n}\n\nexport declare namespace trimRight {\n type ReturnType = Hex\n\n type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a BigInt.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBigInt('0x1a4')\n * // @log: 420n\n *\n * Hex.toBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420n\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded BigInt.\n */\nexport function toBigInt(hex: Hex, options: toBigInt.Options = {}): bigint {\n const { signed } = options\n\n if (options.size) internal.assertSize(hex, options.size)\n\n const value = BigInt(hex)\n if (!signed) return value\n\n const size = (hex.length - 2) / 2\n\n const max_unsigned = (1n << (BigInt(size) * 8n)) - 1n\n const max_signed = max_unsigned >> 1n\n\n if (value <= max_signed) return value\n return value - max_unsigned - 1n\n}\n\nexport declare namespace toBigInt {\n type Options = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType = internal.assertSize.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0x01')\n * // @log: true\n *\n * Hex.toBoolean('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // @log: true\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded boolean.\n */\nexport function toBoolean(hex: Hex, options: toBoolean.Options = {}): boolean {\n if (options.size) internal.assertSize(hex, options.size)\n const hex_ = trimLeft(hex)\n if (hex_ === '0x') return false\n if (hex_ === '0x1') return true\n throw new InvalidHexBooleanError(hex)\n}\n\nexport declare namespace toBoolean {\n type Options = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | trimLeft.ErrorType\n | InvalidHexBooleanError\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const data = Hex.toBytes('0x48656c6c6f20776f726c6421')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded {@link ox#Bytes.Bytes}.\n */\nexport function toBytes(hex: Hex, options: toBytes.Options = {}): Bytes.Bytes {\n return Bytes.fromHex(hex, options)\n}\n\nexport declare namespace toBytes {\n type Options = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType = Bytes.fromHex.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a number.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toNumber('0x1a4')\n * // @log: 420\n *\n * Hex.toNumber('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded number.\n */\nexport function toNumber(hex: Hex, options: toNumber.Options = {}): number {\n const { signed, size } = options\n if (!signed && !size) return Number(hex)\n return Number(toBigInt(hex, options))\n}\n\nexport declare namespace toNumber {\n type Options = toBigInt.Options\n\n type ErrorType = toBigInt.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a string.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toString('0x48656c6c6f20576f726c6421')\n * // @log: 'Hello world!'\n *\n * Hex.toString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * })\n * // @log: 'Hello world'\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded string.\n */\nexport function toString(hex: Hex, options: toString.Options = {}): string {\n const { size } = options\n\n let bytes = Bytes.fromHex(hex)\n if (size) {\n internal_bytes.assertSize(bytes, size)\n bytes = Bytes.trimRight(bytes)\n }\n return new TextDecoder().decode(bytes)\n}\n\nexport declare namespace toString {\n type Options = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal_bytes.assertSize.ErrorType\n | Bytes.fromHex.ErrorType\n | Bytes.trimRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.validate('0xdeadbeef')\n * // @log: true\n *\n * Hex.validate(Bytes.from([1, 2, 3]))\n * // @log: false\n * ```\n *\n * @param value - The value to check.\n * @param options - Options.\n * @returns `true` if the value is a {@link ox#Hex.Hex}, `false` otherwise.\n */\nexport function validate(\n value: unknown,\n options: validate.Options = {},\n): value is Hex {\n const { strict = false } = options\n try {\n assert(value, { strict })\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /** Checks if the {@link ox#Hex.Hex} value contains invalid hexadecimal characters. @default false */\n strict?: boolean | undefined\n }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Thrown when the provided integer is out of range, and cannot be represented as a hex value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420182738912731283712937129)\n * // @error: Hex.IntegerOutOfRangeError: Number \\`4.2018273891273126e+26\\` is not in safe unsigned integer range (`0` to `9007199254740991`)\n * ```\n */\nexport class IntegerOutOfRangeError extends Errors.BaseError {\n override readonly name = 'Hex.IntegerOutOfRangeError'\n\n constructor({\n max,\n min,\n signed,\n size,\n value,\n }: {\n max?: string | undefined\n min: string\n signed?: boolean | undefined\n size?: number | undefined\n value: string\n }) {\n super(\n `Number \\`${value}\\` is not in safe${\n size ? ` ${size * 8}-bit` : ''\n }${signed ? ' signed' : ' unsigned'} integer range ${max ? `(\\`${min}\\` to \\`${max}\\`)` : `(above \\`${min}\\`)`}`,\n )\n }\n}\n\n/**\n * Thrown when the provided hex value cannot be represented as a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0xa')\n * // @error: Hex.InvalidHexBooleanError: Hex value `\"0xa\"` is not a valid boolean.\n * // @error: The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).\n * ```\n */\nexport class InvalidHexBooleanError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidHexBooleanError'\n\n constructor(hex: Hex) {\n super(`Hex value \\`\"${hex}\"\\` is not a valid boolean.`, {\n metaMessages: [\n 'The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).',\n ],\n })\n }\n}\n\n/**\n * Thrown when the provided value is not a valid hex type.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert(1)\n * // @error: Hex.InvalidHexTypeError: Value `1` of type `number` is an invalid hex type.\n * ```\n */\nexport class InvalidHexTypeError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidHexTypeError'\n\n constructor(value: unknown) {\n super(\n `Value \\`${typeof value === 'object' ? Json.stringify(value) : value}\\` of type \\`${typeof value}\\` is an invalid hex type.`,\n {\n metaMessages: ['Hex types must be represented as `\"0x${string}\"`.'],\n },\n )\n }\n}\n\n/**\n * Thrown when the provided hex value is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('0x0123456789abcdefg')\n * // @error: Hex.InvalidHexValueError: Value `0x0123456789abcdefg` is an invalid hex value.\n * // @error: Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).\n * ```\n */\nexport class InvalidHexValueError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidHexValueError'\n\n constructor(value: unknown) {\n super(`Value \\`${value}\\` is an invalid hex value.`, {\n metaMessages: [\n 'Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).',\n ],\n })\n }\n}\n\n/**\n * Thrown when the provided hex value is an odd length.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.fromHex('0xabcde')\n * // @error: Hex.InvalidLengthError: Hex value `\"0xabcde\"` is an odd length (5 nibbles).\n * ```\n */\nexport class InvalidLengthError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidLengthError'\n\n constructor(value: Hex) {\n super(\n `Hex value \\`\"${value}\"\\` is an odd length (${value.length - 2} nibbles).`,\n {\n metaMessages: ['It must be an even length.'],\n },\n )\n }\n}\n\n/**\n * Thrown when the size of the value exceeds the expected max size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromString('Hello World!', { size: 8 })\n * // @error: Hex.SizeOverflowError: Size cannot exceed `8` bytes. Given size: `12` bytes.\n * ```\n */\nexport class SizeOverflowError extends Errors.BaseError {\n override readonly name = 'Hex.SizeOverflowError'\n\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed \\`${maxSize}\\` bytes. Given size: \\`${givenSize}\\` bytes.`,\n )\n }\n}\n\n/**\n * Thrown when the slice offset exceeds the bounds of the value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 6)\n * // @error: Hex.SliceOffsetOutOfBoundsError: Slice starting at offset `6` is out-of-bounds (size: `5`).\n * ```\n */\nexport class SliceOffsetOutOfBoundsError extends Errors.BaseError {\n override readonly name = 'Hex.SliceOffsetOutOfBoundsError'\n\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \\`${offset}\\` is out-of-bounds (size: \\`${size}\\`).`,\n )\n }\n}\n\n/**\n * Thrown when the size of the value exceeds the pad size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1a4e12a45a21323123aaa87a897a897a898a6567a578a867a98778a667a85a875a87a6a787a65a675a6a9', 32)\n * // @error: Hex.SizeExceedsPaddingSizeError: Hex size (`43`) exceeds padding size (`32`).\n * ```\n */\nexport class SizeExceedsPaddingSizeError extends Errors.BaseError {\n override readonly name = 'Hex.SizeExceedsPaddingSizeError'\n\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'Hex' | 'Bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (\\`${size}\\`) exceeds padding size (\\`${targetSize}\\`).`,\n )\n }\n}\n","import type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\n\n/** A Withdrawal as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/withdrawal.yaml). */\nexport type Withdrawal = {\n address: Hex.Hex\n amount: bigintType\n index: numberType\n validatorIndex: numberType\n}\n\n/** An RPC Withdrawal as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/withdrawal.yaml). */\nexport type Rpc = Withdrawal\n\n/**\n * Converts a {@link ox#Withdrawal.Rpc} to an {@link ox#Withdrawal.Withdrawal}.\n *\n * @example\n * ```ts twoslash\n * import { Withdrawal } from 'ox'\n *\n * const withdrawal = Withdrawal.fromRpc({\n * address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * amount: '0x620323',\n * index: '0x0',\n * validatorIndex: '0x1',\n * })\n * // @log: {\n * // @log: address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * // @log: amount: 6423331n,\n * // @log: index: 0,\n * // @log: validatorIndex: 1\n * // @log: }\n * ```\n *\n * @param withdrawal - The RPC withdrawal to convert.\n * @returns An instantiated {@link ox#Withdrawal.Withdrawal}.\n */\nexport function fromRpc(withdrawal: Rpc): Withdrawal {\n return {\n ...withdrawal,\n amount: BigInt(withdrawal.amount),\n index: Number(withdrawal.index),\n validatorIndex: Number(withdrawal.validatorIndex),\n }\n}\n\nexport declare namespace fromRpc {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Withdrawal.Withdrawal} to an {@link ox#Withdrawal.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Withdrawal } from 'ox'\n *\n * const withdrawal = Withdrawal.toRpc({\n * address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * amount: 6423331n,\n * index: 0,\n * validatorIndex: 1,\n * })\n * // @log: {\n * // @log: address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * // @log: amount: '0x620323',\n * // @log: index: '0x0',\n * // @log: validatorIndex: '0x1',\n * // @log: }\n * ```\n *\n * @param withdrawal - The Withdrawal to convert.\n * @returns An RPC Withdrawal.\n */\nexport function toRpc(withdrawal: Withdrawal): Rpc {\n return {\n address: withdrawal.address,\n amount: Hex.fromNumber(withdrawal.amount),\n index: Hex.fromNumber(withdrawal.index),\n validatorIndex: Hex.fromNumber(withdrawal.validatorIndex),\n }\n}\n\nexport declare namespace toRpc {\n export type ErrorType = Errors.GlobalErrorType\n}\n","import type * as Address from './Address.js'\nimport * as Hex from './Hex.js'\nimport * as Withdrawal from './Withdrawal.js'\n\n/**\n * Block overrides.\n */\nexport type BlockOverrides = {\n /** Base fee per gas. */\n baseFeePerGas?: bigintType | undefined\n /** Blob base fee. */\n blobBaseFee?: bigintType | undefined\n /** Fee recipient (also known as coinbase). */\n feeRecipient?: Address.Address | undefined\n /** Gas limit. */\n gasLimit?: bigintType | undefined\n /** Block number. */\n number?: bigintType | undefined\n /** The previous value of randomness beacon. */\n prevRandao?: bigintType | undefined\n /** Block timestamp. */\n time?: bigintType | undefined\n /** Withdrawals made by validators. */\n withdrawals?: Withdrawal.Withdrawal[] | undefined\n}\n\n/**\n * RPC block overrides.\n */\nexport type Rpc = BlockOverrides\n\n/**\n * Converts an {@link ox#BlockOverrides.Rpc} to an {@link ox#BlockOverrides.BlockOverrides}.\n *\n * @example\n * ```ts twoslash\n * import { BlockOverrides } from 'ox'\n *\n * const blockOverrides = BlockOverrides.fromRpc({\n * baseFeePerGas: '0x1',\n * blobBaseFee: '0x2',\n * feeRecipient: '0x0000000000000000000000000000000000000000',\n * gasLimit: '0x4',\n * number: '0x5',\n * prevRandao: '0x6',\n * time: '0x1234567890',\n * withdrawals: [\n * {\n * address: '0x0000000000000000000000000000000000000000',\n * amount: '0x1',\n * index: '0x0',\n * validatorIndex: '0x1',\n * },\n * ],\n * })\n * ```\n *\n * @param rpcBlockOverrides - The RPC block overrides to convert.\n * @returns An instantiated {@link ox#BlockOverrides.BlockOverrides}.\n */\nexport function fromRpc(rpcBlockOverrides: Rpc): BlockOverrides {\n return {\n ...(rpcBlockOverrides.baseFeePerGas && {\n baseFeePerGas: BigInt(rpcBlockOverrides.baseFeePerGas),\n }),\n ...(rpcBlockOverrides.blobBaseFee && {\n blobBaseFee: BigInt(rpcBlockOverrides.blobBaseFee),\n }),\n ...(rpcBlockOverrides.feeRecipient && {\n feeRecipient: rpcBlockOverrides.feeRecipient,\n }),\n ...(rpcBlockOverrides.gasLimit && {\n gasLimit: BigInt(rpcBlockOverrides.gasLimit),\n }),\n ...(rpcBlockOverrides.number && {\n number: BigInt(rpcBlockOverrides.number),\n }),\n ...(rpcBlockOverrides.prevRandao && {\n prevRandao: BigInt(rpcBlockOverrides.prevRandao),\n }),\n ...(rpcBlockOverrides.time && {\n time: BigInt(rpcBlockOverrides.time),\n }),\n ...(rpcBlockOverrides.withdrawals && {\n withdrawals: rpcBlockOverrides.withdrawals.map(Withdrawal.fromRpc),\n }),\n }\n}\n\n/**\n * Converts an {@link ox#BlockOverrides.BlockOverrides} to an {@link ox#BlockOverrides.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { BlockOverrides } from 'ox'\n *\n * const blockOverrides = BlockOverrides.toRpc({\n * baseFeePerGas: 1n,\n * blobBaseFee: 2n,\n * feeRecipient: '0x0000000000000000000000000000000000000000',\n * gasLimit: 4n,\n * number: 5n,\n * prevRandao: 6n,\n * time: 78187493520n,\n * withdrawals: [\n * {\n * address: '0x0000000000000000000000000000000000000000',\n * amount: 1n,\n * index: 0,\n * validatorIndex: 1,\n * },\n * ],\n * })\n * ```\n *\n * @param blockOverrides - The block overrides to convert.\n * @returns An instantiated {@link ox#BlockOverrides.Rpc}.\n */\nexport function toRpc(blockOverrides: BlockOverrides): Rpc {\n return {\n ...(typeof blockOverrides.baseFeePerGas === 'bigint' && {\n baseFeePerGas: Hex.fromNumber(blockOverrides.baseFeePerGas),\n }),\n ...(typeof blockOverrides.blobBaseFee === 'bigint' && {\n blobBaseFee: Hex.fromNumber(blockOverrides.blobBaseFee),\n }),\n ...(typeof blockOverrides.feeRecipient === 'string' && {\n feeRecipient: blockOverrides.feeRecipient,\n }),\n ...(typeof blockOverrides.gasLimit === 'bigint' && {\n gasLimit: Hex.fromNumber(blockOverrides.gasLimit),\n }),\n ...(typeof blockOverrides.number === 'bigint' && {\n number: Hex.fromNumber(blockOverrides.number),\n }),\n ...(typeof blockOverrides.prevRandao === 'bigint' && {\n prevRandao: Hex.fromNumber(blockOverrides.prevRandao),\n }),\n ...(typeof blockOverrides.time === 'bigint' && {\n time: Hex.fromNumber(blockOverrides.time),\n }),\n ...(blockOverrides.withdrawals && {\n withdrawals: blockOverrides.withdrawals.map(Withdrawal.toRpc),\n }),\n }\n}\n","/* [Multicall3](https://github.com/mds1/multicall) */\nexport const multicall3Abi = [\n {\n inputs: [\n {\n components: [\n {\n name: 'target',\n type: 'address',\n },\n {\n name: 'allowFailure',\n type: 'bool',\n },\n {\n name: 'callData',\n type: 'bytes',\n },\n ],\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate3',\n outputs: [\n {\n components: [\n {\n name: 'success',\n type: 'bool',\n },\n {\n name: 'returnData',\n type: 'bytes',\n },\n ],\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'addr',\n type: 'address',\n },\n ],\n name: 'getEthBalance',\n outputs: [\n {\n name: 'balance',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockTimestamp',\n outputs: [\n {\n internalType: 'uint256',\n name: 'timestamp',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n\nexport const batchGatewayAbi = [\n {\n name: 'query',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n {\n type: 'tuple[]',\n name: 'queries',\n components: [\n {\n type: 'address',\n name: 'sender',\n },\n {\n type: 'string[]',\n name: 'urls',\n },\n {\n type: 'bytes',\n name: 'data',\n },\n ],\n },\n ],\n outputs: [\n {\n type: 'bool[]',\n name: 'failures',\n },\n {\n type: 'bytes[]',\n name: 'responses',\n },\n ],\n },\n {\n name: 'HttpError',\n type: 'error',\n inputs: [\n {\n type: 'uint16',\n name: 'status',\n },\n {\n type: 'string',\n name: 'message',\n },\n ],\n },\n] as const\n\nconst universalResolverErrors = [\n {\n inputs: [\n {\n name: 'dns',\n type: 'bytes',\n },\n ],\n name: 'DNSDecodingFailed',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'ens',\n type: 'string',\n },\n ],\n name: 'DNSEncodingFailed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'EmptyAddress',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'status',\n type: 'uint16',\n },\n {\n name: 'message',\n type: 'string',\n },\n ],\n name: 'HttpError',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidBatchGatewayResponse',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'errorData',\n type: 'bytes',\n },\n ],\n name: 'ResolverError',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'name',\n type: 'bytes',\n },\n {\n name: 'resolver',\n type: 'address',\n },\n ],\n name: 'ResolverNotContract',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'name',\n type: 'bytes',\n },\n ],\n name: 'ResolverNotFound',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'primary',\n type: 'string',\n },\n {\n name: 'primaryAddress',\n type: 'bytes',\n },\n ],\n name: 'ReverseAddressMismatch',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'selector',\n type: 'bytes4',\n },\n ],\n name: 'UnsupportedResolverProfile',\n type: 'error',\n },\n] as const\n\nexport const universalResolverResolveAbi = [\n ...universalResolverErrors,\n {\n name: 'resolveWithGateways',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'name', type: 'bytes' },\n { name: 'data', type: 'bytes' },\n { name: 'gateways', type: 'string[]' },\n ],\n outputs: [\n { name: '', type: 'bytes' },\n { name: 'address', type: 'address' },\n ],\n },\n] as const\n\nexport const universalResolverReverseAbi = [\n ...universalResolverErrors,\n {\n name: 'reverseWithGateways',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'bytes', name: 'reverseName' },\n { type: 'uint256', name: 'coinType' },\n { type: 'string[]', name: 'gateways' },\n ],\n outputs: [\n { type: 'string', name: 'resolvedName' },\n { type: 'address', name: 'resolver' },\n { type: 'address', name: 'reverseResolver' },\n ],\n },\n] as const\n\nexport const textResolverAbi = [\n {\n name: 'text',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'name', type: 'bytes32' },\n { name: 'key', type: 'string' },\n ],\n outputs: [{ name: '', type: 'string' }],\n },\n] as const\n\nexport const addressResolverAbi = [\n {\n name: 'addr',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'name', type: 'bytes32' }],\n outputs: [{ name: '', type: 'address' }],\n },\n {\n name: 'addr',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'name', type: 'bytes32' },\n { name: 'coinType', type: 'uint256' },\n ],\n outputs: [{ name: '', type: 'bytes' }],\n },\n] as const\n\n// ERC-1271\n// isValidSignature(bytes32 hash, bytes signature) → bytes4 magicValue\n/** @internal */\nexport const erc1271Abi = [\n {\n name: 'isValidSignature',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'hash', type: 'bytes32' },\n { name: 'signature', type: 'bytes' },\n ],\n outputs: [{ name: '', type: 'bytes4' }],\n },\n] as const\n\n// ERC-6492 - universal deployless signature validator contract\n// constructor(address _signer, bytes32 _hash, bytes _signature) → bytes4 returnValue\n// returnValue is either 0x1 (valid) or 0x0 (invalid)\nexport const erc6492SignatureValidatorAbi = [\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n name: 'isValidSig',\n },\n] as const\n\n/** [ERC-20 Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-20) */\nexport const erc20Abi = [\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'allowance',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'decimals',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint8',\n },\n ],\n },\n {\n type: 'function',\n name: 'name',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'symbol',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'totalSupply',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'transfer',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'transferFrom',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n] as const\n\n/**\n * [bytes32-flavored ERC-20](https://docs.makerdao.com/smart-contract-modules/mkr-module#4.-gotchas-potential-source-of-user-error)\n * for tokens (ie. Maker) that use bytes32 instead of string.\n */\nexport const erc20Abi_bytes32 = [\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'allowance',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'decimals',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint8',\n },\n ],\n },\n {\n type: 'function',\n name: 'name',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'bytes32',\n },\n ],\n },\n {\n type: 'function',\n name: 'symbol',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'bytes32',\n },\n ],\n },\n {\n type: 'function',\n name: 'totalSupply',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'transfer',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'transferFrom',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n] as const\n\n/** [ERC-1155 Multi Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-1155) */\nexport const erc1155Abi = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'balance',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'needed',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n name: 'ERC1155InsufficientBalance',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'approver',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidApprover',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'idsLength',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'valuesLength',\n type: 'uint256',\n },\n ],\n name: 'ERC1155InvalidArrayLength',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidOperator',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidReceiver',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidSender',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'ERC1155MissingApprovalForAll',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'bool',\n name: 'approved',\n type: 'bool',\n },\n ],\n name: 'ApprovalForAll',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256[]',\n name: 'ids',\n type: 'uint256[]',\n },\n {\n indexed: false,\n internalType: 'uint256[]',\n name: 'values',\n type: 'uint256[]',\n },\n ],\n name: 'TransferBatch',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'TransferSingle',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'string',\n name: 'value',\n type: 'string',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n ],\n name: 'URI',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n ],\n name: 'balanceOf',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address[]',\n name: 'accounts',\n type: 'address[]',\n },\n {\n internalType: 'uint256[]',\n name: 'ids',\n type: 'uint256[]',\n },\n ],\n name: 'balanceOfBatch',\n outputs: [\n {\n internalType: 'uint256[]',\n name: '',\n type: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n ],\n name: 'isApprovedForAll',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n internalType: 'uint256[]',\n name: 'ids',\n type: 'uint256[]',\n },\n {\n internalType: 'uint256[]',\n name: 'values',\n type: 'uint256[]',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'safeBatchTransferFrom',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'safeTransferFrom',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n internalType: 'bool',\n name: 'approved',\n type: 'bool',\n },\n ],\n name: 'setApprovalForAll',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'interfaceId',\n type: 'bytes4',\n },\n ],\n name: 'supportsInterface',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n name: 'uri',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n\n/** [ERC-721 Non-Fungible Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-721) */\nexport const erc721Abi = [\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: true,\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'event',\n name: 'ApprovalForAll',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'operator',\n type: 'address',\n },\n {\n indexed: false,\n name: 'approved',\n type: 'bool',\n },\n ],\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: true,\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'getApproved',\n stateMutability: 'view',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'address',\n },\n ],\n },\n {\n type: 'function',\n name: 'isApprovedForAll',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'operator',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'name',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'ownerOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'owner',\n type: 'address',\n },\n ],\n },\n {\n type: 'function',\n name: 'safeTransferFrom',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'from',\n type: 'address',\n },\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'safeTransferFrom',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'from',\n type: 'address',\n },\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'id',\n type: 'uint256',\n },\n {\n name: 'data',\n type: 'bytes',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'setApprovalForAll',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'operator',\n type: 'address',\n },\n {\n name: 'approved',\n type: 'bool',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'symbol',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'tokenByIndex',\n stateMutability: 'view',\n inputs: [\n {\n name: 'index',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'tokenByIndex',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'index',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'tokenURI',\n stateMutability: 'view',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'totalSupply',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'transferFrom',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [],\n },\n] as const\n\n/** [ERC-4626 Tokenized Vaults Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626) */\nexport const erc4626Abi = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Approval',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'sender',\n type: 'address',\n },\n {\n indexed: true,\n name: 'receiver',\n type: 'address',\n },\n {\n indexed: false,\n name: 'assets',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'Deposit',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'sender',\n type: 'address',\n },\n {\n indexed: true,\n name: 'receiver',\n type: 'address',\n },\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: false,\n name: 'assets',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'Withdraw',\n type: 'event',\n },\n {\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n },\n ],\n name: 'allowance',\n outputs: [\n {\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'approve',\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'asset',\n outputs: [\n {\n name: 'assetTokenAddress',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n name: 'balanceOf',\n outputs: [\n {\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'convertToAssets',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'convertToShares',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'deposit',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'caller',\n type: 'address',\n },\n ],\n name: 'maxDeposit',\n outputs: [\n {\n name: 'maxAssets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'caller',\n type: 'address',\n },\n ],\n name: 'maxMint',\n outputs: [\n {\n name: 'maxShares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'maxRedeem',\n outputs: [\n {\n name: 'maxShares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'maxWithdraw',\n outputs: [\n {\n name: 'maxAssets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'mint',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'previewDeposit',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'previewMint',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'previewRedeem',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'previewWithdraw',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'redeem',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalAssets',\n outputs: [\n {\n name: 'totalManagedAssets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalSupply',\n outputs: [\n {\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'transfer',\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'from',\n type: 'address',\n },\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'transferFrom',\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'withdraw',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const\n","export const aggregate3Signature = '0x82ad56cb'\n","export const deploylessCallViaBytecodeBytecode =\n '0x608060405234801561001057600080fd5b5060405161018e38038061018e83398101604081905261002f91610124565b6000808351602085016000f59050803b61004857600080fd5b6000808351602085016000855af16040513d6000823e81610067573d81fd5b3d81f35b634e487b7160e01b600052604160045260246000fd5b600082601f83011261009257600080fd5b81516001600160401b038111156100ab576100ab61006b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d9576100d961006b565b6040528181528382016020018510156100f157600080fd5b60005b82811015610110576020818601810151838301820152016100f4565b506000918101602001919091529392505050565b6000806040838503121561013757600080fd5b82516001600160401b0381111561014d57600080fd5b61015985828601610081565b602085015190935090506001600160401b0381111561017757600080fd5b61018385828601610081565b915050925092905056fe'\n\nexport const deploylessCallViaFactoryBytecode =\n '0x608060405234801561001057600080fd5b506040516102c03803806102c083398101604081905261002f916101e6565b836001600160a01b03163b6000036100e457600080836001600160a01b03168360405161005c9190610270565b6000604051808303816000865af19150503d8060008114610099576040519150601f19603f3d011682016040523d82523d6000602084013e61009e565b606091505b50915091508115806100b857506001600160a01b0386163b155b156100e1578060405163101bb98d60e01b81526004016100d8919061028c565b60405180910390fd5b50505b6000808451602086016000885af16040513d6000823e81610103573d81fd5b3d81f35b80516001600160a01b038116811461011e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561015457818101518382015260200161013c565b50506000910152565b600082601f83011261016e57600080fd5b81516001600160401b0381111561018757610187610123565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101b5576101b5610123565b6040528181528382016020018510156101cd57600080fd5b6101de826020830160208701610139565b949350505050565b600080600080608085870312156101fc57600080fd5b61020585610107565b60208601519094506001600160401b0381111561022157600080fd5b61022d8782880161015d565b93505061023c60408601610107565b60608601519092506001600160401b0381111561025857600080fd5b6102648782880161015d565b91505092959194509250565b60008251610282818460208701610139565b9190910192915050565b60208152600082518060208401526102ab816040850160208701610139565b601f01601f1916919091016040019291505056fe'\n\nexport const erc6492SignatureValidatorByteCode =\n '0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572'\n\nexport const multicall3Bytecode =\n '0x608060405234801561001057600080fd5b506115b9806100206000396000f3fe6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e14610325578063bce38bd714610350578063c3077fa914610380578063ee82ac5e146103b2576100f3565b80634d2301cc1461026257806372425d9d1461029f57806382ad56cb146102ca57806386d516e8146102fa576100f3565b80633408e470116100c65780633408e470146101af578063399542e9146101da5780633e64a6961461020c57806342cbb15c14610237576100f3565b80630f28c97d146100f8578063174dea7114610123578063252dba421461015357806327e86d6e14610184575b600080fd5b34801561010457600080fd5b5061010d6103ef565b60405161011a9190610c0a565b60405180910390f35b61013d60048036038101906101389190610c94565b6103f7565b60405161014a9190610e94565b60405180910390f35b61016d60048036038101906101689190610f0c565b610615565b60405161017b92919061101b565b60405180910390f35b34801561019057600080fd5b506101996107ab565b6040516101a69190611064565b60405180910390f35b3480156101bb57600080fd5b506101c46107b7565b6040516101d19190610c0a565b60405180910390f35b6101f460048036038101906101ef91906110ab565b6107bf565b6040516102039392919061110b565b60405180910390f35b34801561021857600080fd5b506102216107e1565b60405161022e9190610c0a565b60405180910390f35b34801561024357600080fd5b5061024c6107e9565b6040516102599190610c0a565b60405180910390f35b34801561026e57600080fd5b50610289600480360381019061028491906111a7565b6107f1565b6040516102969190610c0a565b60405180910390f35b3480156102ab57600080fd5b506102b4610812565b6040516102c19190610c0a565b60405180910390f35b6102e460048036038101906102df919061122a565b61081a565b6040516102f19190610e94565b60405180910390f35b34801561030657600080fd5b5061030f6109e4565b60405161031c9190610c0a565b60405180910390f35b34801561033157600080fd5b5061033a6109ec565b6040516103479190611286565b60405180910390f35b61036a600480360381019061036591906110ab565b6109f4565b6040516103779190610e94565b60405180910390f35b61039a60048036038101906103959190610f0c565b610ba6565b6040516103a99392919061110b565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906112cd565b610bca565b6040516103e69190611064565b60405180910390f35b600042905090565b60606000808484905090508067ffffffffffffffff81111561041c5761041b6112fa565b5b60405190808252806020026020018201604052801561045557816020015b610442610bd5565b81526020019060019003908161043a5790505b5092503660005b828110156105c957600085828151811061047957610478611329565b5b6020026020010151905087878381811061049657610495611329565b5b90506020028101906104a89190611367565b925060008360400135905080860195508360000160208101906104cb91906111a7565b73ffffffffffffffffffffffffffffffffffffffff16818580606001906104f2919061138f565b604051610500929190611431565b60006040518083038185875af1925050503d806000811461053d576040519150601f19603f3d011682016040523d82523d6000602084013e610542565b606091505b5083600001846020018290528215151515815250505081516020850135176105bc577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b826001019250505061045c565b5082341461060c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610603906114a7565b60405180910390fd5b50505092915050565b6000606043915060008484905090508067ffffffffffffffff81111561063e5761063d6112fa565b5b60405190808252806020026020018201604052801561067157816020015b606081526020019060019003908161065c5790505b5091503660005b828110156107a157600087878381811061069557610694611329565b5b90506020028101906106a791906114c7565b92508260000160208101906106bc91906111a7565b73ffffffffffffffffffffffffffffffffffffffff168380602001906106e2919061138f565b6040516106f0929190611431565b6000604051808303816000865af19150503d806000811461072d576040519150601f19603f3d011682016040523d82523d6000602084013e610732565b606091505b5086848151811061074657610745611329565b5b60200260200101819052819250505080610795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078c9061153b565b60405180910390fd5b81600101915050610678565b5050509250929050565b60006001430340905090565b600046905090565b6000806060439250434091506107d68686866109f4565b905093509350939050565b600048905090565b600043905090565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b600044905090565b606060008383905090508067ffffffffffffffff81111561083e5761083d6112fa565b5b60405190808252806020026020018201604052801561087757816020015b610864610bd5565b81526020019060019003908161085c5790505b5091503660005b828110156109db57600084828151811061089b5761089a611329565b5b602002602001015190508686838181106108b8576108b7611329565b5b90506020028101906108ca919061155b565b92508260000160208101906108df91906111a7565b73ffffffffffffffffffffffffffffffffffffffff16838060400190610905919061138f565b604051610913929190611431565b6000604051808303816000865af19150503d8060008114610950576040519150601f19603f3d011682016040523d82523d6000602084013e610955565b606091505b5082600001836020018290528215151515815250505080516020840135176109cf577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b8160010191505061087e565b50505092915050565b600045905090565b600041905090565b606060008383905090508067ffffffffffffffff811115610a1857610a176112fa565b5b604051908082528060200260200182016040528015610a5157816020015b610a3e610bd5565b815260200190600190039081610a365790505b5091503660005b82811015610b9c576000848281518110610a7557610a74611329565b5b60200260200101519050868683818110610a9257610a91611329565b5b9050602002810190610aa491906114c7565b9250826000016020810190610ab991906111a7565b73ffffffffffffffffffffffffffffffffffffffff16838060200190610adf919061138f565b604051610aed929190611431565b6000604051808303816000865af19150503d8060008114610b2a576040519150601f19603f3d011682016040523d82523d6000602084013e610b2f565b606091505b508260000183602001829052821515151581525050508715610b90578060000151610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061153b565b60405180910390fd5b5b81600101915050610a58565b5050509392505050565b6000806060610bb7600186866107bf565b8093508194508295505050509250925092565b600081409050919050565b6040518060400160405280600015158152602001606081525090565b6000819050919050565b610c0481610bf1565b82525050565b6000602082019050610c1f6000830184610bfb565b92915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112610c5457610c53610c2f565b5b8235905067ffffffffffffffff811115610c7157610c70610c34565b5b602083019150836020820283011115610c8d57610c8c610c39565b5b9250929050565b60008060208385031215610cab57610caa610c25565b5b600083013567ffffffffffffffff811115610cc957610cc8610c2a565b5b610cd585828601610c3e565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60008115159050919050565b610d2281610d0d565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610d62578082015181840152602081019050610d47565b83811115610d71576000848401525b50505050565b6000601f19601f8301169050919050565b6000610d9382610d28565b610d9d8185610d33565b9350610dad818560208601610d44565b610db681610d77565b840191505092915050565b6000604083016000830151610dd96000860182610d19565b5060208301518482036020860152610df18282610d88565b9150508091505092915050565b6000610e0a8383610dc1565b905092915050565b6000602082019050919050565b6000610e2a82610ce1565b610e348185610cec565b935083602082028501610e4685610cfd565b8060005b85811015610e825784840389528151610e638582610dfe565b9450610e6e83610e12565b925060208a01995050600181019050610e4a565b50829750879550505050505092915050565b60006020820190508181036000830152610eae8184610e1f565b905092915050565b60008083601f840112610ecc57610ecb610c2f565b5b8235905067ffffffffffffffff811115610ee957610ee8610c34565b5b602083019150836020820283011115610f0557610f04610c39565b5b9250929050565b60008060208385031215610f2357610f22610c25565b5b600083013567ffffffffffffffff811115610f4157610f40610c2a565b5b610f4d85828601610eb6565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610f918383610d88565b905092915050565b6000602082019050919050565b6000610fb182610f59565b610fbb8185610f64565b935083602082028501610fcd85610f75565b8060005b858110156110095784840389528151610fea8582610f85565b9450610ff583610f99565b925060208a01995050600181019050610fd1565b50829750879550505050505092915050565b60006040820190506110306000830185610bfb565b81810360208301526110428184610fa6565b90509392505050565b6000819050919050565b61105e8161104b565b82525050565b60006020820190506110796000830184611055565b92915050565b61108881610d0d565b811461109357600080fd5b50565b6000813590506110a58161107f565b92915050565b6000806000604084860312156110c4576110c3610c25565b5b60006110d286828701611096565b935050602084013567ffffffffffffffff8111156110f3576110f2610c2a565b5b6110ff86828701610eb6565b92509250509250925092565b60006060820190506111206000830186610bfb565b61112d6020830185611055565b818103604083015261113f8184610e1f565b9050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061117482611149565b9050919050565b61118481611169565b811461118f57600080fd5b50565b6000813590506111a18161117b565b92915050565b6000602082840312156111bd576111bc610c25565b5b60006111cb84828501611192565b91505092915050565b60008083601f8401126111ea576111e9610c2f565b5b8235905067ffffffffffffffff81111561120757611206610c34565b5b60208301915083602082028301111561122357611222610c39565b5b9250929050565b6000806020838503121561124157611240610c25565b5b600083013567ffffffffffffffff81111561125f5761125e610c2a565b5b61126b858286016111d4565b92509250509250929050565b61128081611169565b82525050565b600060208201905061129b6000830184611277565b92915050565b6112aa81610bf1565b81146112b557600080fd5b50565b6000813590506112c7816112a1565b92915050565b6000602082840312156112e3576112e2610c25565b5b60006112f1848285016112b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008235600160800383360303811261138357611382611358565b5b80830191505092915050565b600080833560016020038436030381126113ac576113ab611358565b5b80840192508235915067ffffffffffffffff8211156113ce576113cd61135d565b5b6020830192506001820236038313156113ea576113e9611362565b5b509250929050565b600081905092915050565b82818337600083830152505050565b600061141883856113f2565b93506114258385846113fd565b82840190509392505050565b600061143e82848661140c565b91508190509392505050565b600082825260208201905092915050565b7f4d756c746963616c6c333a2076616c7565206d69736d61746368000000000000600082015250565b6000611491601a8361144a565b915061149c8261145b565b602082019050919050565b600060208201905081810360008301526114c081611484565b9050919050565b6000823560016040038336030381126114e3576114e2611358565b5b80830191505092915050565b7f4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000600082015250565b600061152560178361144a565b9150611530826114ef565b602082019050919050565b6000602082019050818103600083015261155481611518565b9050919050565b60008235600160600383360303811261157757611576611358565b5b8083019150509291505056fea264697066735822122020c1bc9aacf8e4a6507193432a895a8e77094f45a1395583f07b24e860ef06cd64736f6c634300080c0033'\n","import type { Chain } from '../types/chain.js'\n\nimport { BaseError } from './base.js'\n\nexport type ChainDoesNotSupportContractErrorType =\n ChainDoesNotSupportContract & {\n name: 'ChainDoesNotSupportContract'\n }\nexport class ChainDoesNotSupportContract extends BaseError {\n constructor({\n blockNumber,\n chain,\n contract,\n }: {\n blockNumber?: bigint | undefined\n chain: Chain\n contract: { name: string; blockCreated?: number | undefined }\n }) {\n super(\n `Chain \"${chain.name}\" does not support contract \"${contract.name}\".`,\n {\n metaMessages: [\n 'This could be due to any of the following:',\n ...(blockNumber &&\n contract.blockCreated &&\n contract.blockCreated > blockNumber\n ? [\n `- The contract \"${contract.name}\" was not deployed until block ${contract.blockCreated} (current block ${blockNumber}).`,\n ]\n : [\n `- The chain does not have the contract \"${contract.name}\" configured.`,\n ]),\n ],\n name: 'ChainDoesNotSupportContract',\n },\n )\n }\n}\n\nexport type ChainMismatchErrorType = ChainMismatchError & {\n name: 'ChainMismatchError'\n}\nexport class ChainMismatchError extends BaseError {\n constructor({\n chain,\n currentChainId,\n }: {\n chain: Chain\n currentChainId: number\n }) {\n super(\n `The current chain of the wallet (id: ${currentChainId}) does not match the target chain for the transaction (id: ${chain.id} – ${chain.name}).`,\n {\n metaMessages: [\n `Current Chain ID: ${currentChainId}`,\n `Expected Chain ID: ${chain.id} – ${chain.name}`,\n ],\n name: 'ChainMismatchError',\n },\n )\n }\n}\n\nexport type ChainNotFoundErrorType = ChainNotFoundError & {\n name: 'ChainNotFoundError'\n}\nexport class ChainNotFoundError extends BaseError {\n constructor() {\n super(\n [\n 'No chain was provided to the request.',\n 'Please provide a chain with the `chain` argument on the Action, or by supplying a `chain` to WalletClient.',\n ].join('\\n'),\n {\n name: 'ChainNotFoundError',\n },\n )\n }\n}\n\nexport type ClientChainNotConfiguredErrorType =\n ClientChainNotConfiguredError & {\n name: 'ClientChainNotConfiguredError'\n }\nexport class ClientChainNotConfiguredError extends BaseError {\n constructor() {\n super('No chain was provided to the Client.', {\n name: 'ClientChainNotConfiguredError',\n })\n }\n}\n\nexport type InvalidChainIdErrorType = InvalidChainIdError & {\n name: 'InvalidChainIdError'\n}\nexport class InvalidChainIdError extends BaseError {\n constructor({ chainId }: { chainId?: number | undefined }) {\n super(\n typeof chainId === 'number'\n ? `Chain ID \"${chainId}\" is invalid.`\n : 'Chain ID is invalid.',\n { name: 'InvalidChainIdError' },\n )\n }\n}\n","import type { Abi } from 'abitype'\n\nimport {\n AbiConstructorNotFoundError,\n type AbiConstructorNotFoundErrorType,\n AbiConstructorParamsNotFoundError,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ContractConstructorArgs } from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { UnionEvaluate } from '../../types/utils.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\n\nconst docsPath = '/docs/contract/encodeDeployData'\n\nexport type EncodeDeployDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n ///\n hasConstructor = abi extends Abi\n ? Abi extends abi\n ? true\n : [Extract] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractConstructorArgs,\n> = {\n abi: abi\n bytecode: Hex\n} & UnionEvaluate<\n hasConstructor extends false\n ? { args?: undefined }\n : readonly [] extends allArgs\n ? { args?: allArgs | undefined }\n : { args: allArgs }\n>\n\nexport type EncodeDeployDataReturnType = Hex\n\nexport type EncodeDeployDataErrorType =\n | AbiConstructorNotFoundErrorType\n | ConcatHexErrorType\n | EncodeAbiParametersErrorType\n | ErrorType\n\nexport function encodeDeployData(\n parameters: EncodeDeployDataParameters,\n): EncodeDeployDataReturnType {\n const { abi, args, bytecode } = parameters as EncodeDeployDataParameters\n if (!args || args.length === 0) return bytecode\n\n const description = abi.find((x) => 'type' in x && x.type === 'constructor')\n if (!description) throw new AbiConstructorNotFoundError({ docsPath })\n if (!('inputs' in description))\n throw new AbiConstructorParamsNotFoundError({ docsPath })\n if (!description.inputs || description.inputs.length === 0)\n throw new AbiConstructorParamsNotFoundError({ docsPath })\n\n const data = encodeAbiParameters(description.inputs, args)\n return concatHex([bytecode, data!])\n}\n","import {\n ChainDoesNotSupportContract,\n type ChainDoesNotSupportContractErrorType,\n} from '../../errors/chain.js'\nimport type { Chain, ChainContract } from '../../types/chain.js'\n\nexport type GetChainContractAddressErrorType =\n ChainDoesNotSupportContractErrorType\n\nexport function getChainContractAddress({\n blockNumber,\n chain,\n contract: name,\n}: {\n blockNumber?: bigint | undefined\n chain: Chain\n contract: string\n}) {\n const contract = (chain?.contracts as Record)?.[name]\n if (!contract)\n throw new ChainDoesNotSupportContract({\n chain,\n contract: { name },\n })\n\n if (\n blockNumber &&\n contract.blockCreated &&\n contract.blockCreated > blockNumber\n )\n throw new ChainDoesNotSupportContract({\n blockNumber,\n chain,\n contract: {\n name,\n blockCreated: contract.blockCreated,\n },\n })\n\n return contract.address\n}\n","import type { CallParameters } from '../../actions/public/call.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n CallExecutionError,\n type CallExecutionErrorType,\n} from '../../errors/contract.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetCallErrorReturnType = Omit<\n CallExecutionErrorType,\n 'cause'\n> & {\n cause: cause | GetNodeErrorReturnType\n}\n\nexport function getCallError>(\n err: err,\n {\n docsPath,\n ...args\n }: CallParameters & {\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n): GetCallErrorReturnType {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new CallExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetCallErrorReturnType\n}\n","/** @internal */\nexport type PromiseWithResolvers = {\n promise: Promise\n resolve: (value: type | PromiseLike) => void\n reject: (reason?: unknown) => void\n}\n\n/** @internal */\nexport function withResolvers(): PromiseWithResolvers {\n let resolve: PromiseWithResolvers['resolve'] = () => undefined\n let reject: PromiseWithResolvers['reject'] = () => undefined\n\n const promise = new Promise((resolve_, reject_) => {\n resolve = resolve_\n reject = reject_\n })\n\n return { promise, resolve, reject }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport { type PromiseWithResolvers, withResolvers } from './withResolvers.js'\n\ntype Resolved = [\n result: returnType[number],\n results: returnType,\n]\n\ntype SchedulerItem = {\n args: unknown\n resolve: PromiseWithResolvers['resolve']\n reject: PromiseWithResolvers['reject']\n}\n\ntype BatchResultsCompareFn = (a: result, b: result) => number\n\ntype CreateBatchSchedulerArguments<\n parameters = unknown,\n returnType extends readonly unknown[] = readonly unknown[],\n> = {\n fn: (args: parameters[]) => Promise\n id: number | string\n shouldSplitBatch?: ((args: parameters[]) => boolean) | undefined\n wait?: number | undefined\n sort?: BatchResultsCompareFn | undefined\n}\n\ntype CreateBatchSchedulerReturnType<\n parameters = unknown,\n returnType extends readonly unknown[] = readonly unknown[],\n> = {\n flush: () => void\n schedule: parameters extends undefined\n ? (args?: parameters | undefined) => Promise>\n : (args: parameters) => Promise>\n}\n\nexport type CreateBatchSchedulerErrorType = ErrorType\n\nconst schedulerCache = /*#__PURE__*/ new Map()\n\n/** @internal */\nexport function createBatchScheduler<\n parameters,\n returnType extends readonly unknown[],\n>({\n fn,\n id,\n shouldSplitBatch,\n wait = 0,\n sort,\n}: CreateBatchSchedulerArguments<\n parameters,\n returnType\n>): CreateBatchSchedulerReturnType {\n const exec = async () => {\n const scheduler = getScheduler()\n flush()\n\n const args = scheduler.map(({ args }) => args)\n\n if (args.length === 0) return\n\n fn(args as parameters[])\n .then((data) => {\n if (sort && Array.isArray(data)) data.sort(sort)\n for (let i = 0; i < scheduler.length; i++) {\n const { resolve } = scheduler[i]\n resolve?.([data[i], data])\n }\n })\n .catch((err) => {\n for (let i = 0; i < scheduler.length; i++) {\n const { reject } = scheduler[i]\n reject?.(err)\n }\n })\n }\n\n const flush = () => schedulerCache.delete(id)\n\n const getBatchedArgs = () =>\n getScheduler().map(({ args }) => args) as parameters[]\n\n const getScheduler = () => schedulerCache.get(id) || []\n\n const setScheduler = (item: SchedulerItem) =>\n schedulerCache.set(id, [...getScheduler(), item])\n\n return {\n flush,\n async schedule(args: parameters) {\n const { promise, resolve, reject } = withResolvers()\n\n const split = shouldSplitBatch?.([...getBatchedArgs(), args])\n\n if (split) exec()\n\n const hasActiveScheduler = getScheduler().length > 0\n if (hasActiveScheduler) {\n setScheduler({ args, resolve, reject })\n return promise\n }\n\n setScheduler({ args, resolve, reject })\n setTimeout(exec, wait)\n return promise\n },\n } as unknown as CreateBatchSchedulerReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { Hex } from '../types/misc.js'\nimport { stringify } from '../utils/stringify.js'\n\nimport { BaseError } from './base.js'\nimport { getUrl } from './utils.js'\n\nexport type OffchainLookupErrorType = OffchainLookupError & {\n name: 'OffchainLookupError'\n}\nexport class OffchainLookupError extends BaseError {\n constructor({\n callbackSelector,\n cause,\n data,\n extraData,\n sender,\n urls,\n }: {\n callbackSelector: Hex\n cause: BaseError\n data: Hex\n extraData: Hex\n sender: Address\n urls: readonly string[]\n }) {\n super(\n cause.shortMessage ||\n 'An error occurred while fetching for an offchain result.',\n {\n cause,\n metaMessages: [\n ...(cause.metaMessages || []),\n cause.metaMessages?.length ? '' : [],\n 'Offchain Gateway Call:',\n urls && [\n ' Gateway URL(s):',\n ...urls.map((url) => ` ${getUrl(url)}`),\n ],\n ` Sender: ${sender}`,\n ` Data: ${data}`,\n ` Callback selector: ${callbackSelector}`,\n ` Extra data: ${extraData}`,\n ].flat(),\n name: 'OffchainLookupError',\n },\n )\n }\n}\n\nexport type OffchainLookupResponseMalformedErrorType =\n OffchainLookupResponseMalformedError & {\n name: 'OffchainLookupResponseMalformedError'\n }\nexport class OffchainLookupResponseMalformedError extends BaseError {\n constructor({ result, url }: { result: any; url: string }) {\n super(\n 'Offchain gateway response is malformed. Response data must be a hex value.',\n {\n metaMessages: [\n `Gateway URL: ${getUrl(url)}`,\n `Response: ${stringify(result)}`,\n ],\n name: 'OffchainLookupResponseMalformedError',\n },\n )\n }\n}\n\n/** @internal */\nexport type OffchainLookupSenderMismatchErrorType =\n OffchainLookupSenderMismatchError & {\n name: 'OffchainLookupSenderMismatchError'\n }\nexport class OffchainLookupSenderMismatchError extends BaseError {\n constructor({ sender, to }: { sender: Address; to: Address }) {\n super(\n 'Reverted sender address does not match target contract address (`to`).',\n {\n metaMessages: [\n `Contract address: ${to}`,\n `OffchainLookup sender address: ${sender}`,\n ],\n name: 'OffchainLookupSenderMismatchError',\n },\n )\n }\n}\n","import type { Abi, AbiStateMutability } from 'abitype'\n\nimport { AbiFunctionSignatureNotFoundError } from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type SliceErrorType, slice } from '../data/slice.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\n\nexport type DecodeFunctionDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n> = {\n abi: abi\n data: Hex\n}\n\nexport type DecodeFunctionDataReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n ///\n allFunctionNames extends\n ContractFunctionName = ContractFunctionName,\n> = IsNarrowable extends true\n ? UnionEvaluate<\n {\n [functionName in allFunctionNames]: {\n args: ContractFunctionArgs\n functionName: functionName\n }\n }[allFunctionNames]\n >\n : {\n args: readonly unknown[] | undefined\n functionName: string\n }\n\nexport type DecodeFunctionDataErrorType =\n | AbiFunctionSignatureNotFoundError\n | DecodeAbiParametersErrorType\n | FormatAbiItemErrorType\n | ToFunctionSelectorErrorType\n | SliceErrorType\n | ErrorType\n\nexport function decodeFunctionData(\n parameters: DecodeFunctionDataParameters,\n) {\n const { abi, data } = parameters as DecodeFunctionDataParameters\n const signature = slice(data, 0, 4)\n const description = abi.find(\n (x) =>\n x.type === 'function' &&\n signature === toFunctionSelector(formatAbiItem(x)),\n )\n if (!description)\n throw new AbiFunctionSignatureNotFoundError(signature, {\n docsPath: '/docs/contract/decodeFunctionData',\n })\n return {\n functionName: (description as { name: string }).name,\n args: ('inputs' in description &&\n description.inputs &&\n description.inputs.length > 0\n ? decodeAbiParameters(description.inputs, slice(data, 4))\n : undefined) as readonly unknown[] | undefined,\n } as DecodeFunctionDataReturnType\n}\n","import type { Abi, ExtractAbiErrors } from 'abitype'\n\nimport {\n AbiErrorInputsNotFoundError,\n AbiErrorNotFoundError,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractErrorArgs,\n ContractErrorName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeErrorResult'\n\nexport type EncodeErrorResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n errorName extends ContractErrorName | undefined = ContractErrorName,\n ///\n hasErrors = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiErrors] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractErrorArgs<\n abi,\n errorName extends ContractErrorName\n ? errorName\n : ContractErrorName\n >,\n allErrorNames = ContractErrorName,\n> = {\n abi: abi\n args?: allArgs | undefined\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { errorName?: errorName | allErrorNames | undefined }\n : { errorName: errorName | allErrorNames }\n : { errorName?: errorName | allErrorNames | undefined }\n> &\n (hasErrors extends true ? unknown : never)\n\nexport type EncodeErrorResultReturnType = Hex\n\nexport type EncodeErrorResultErrorType =\n | GetAbiItemErrorType\n | FormatAbiItemErrorType\n | ToFunctionSelectorErrorType\n | EncodeAbiParametersErrorType\n | ConcatHexErrorType\n | ErrorType\n\nexport function encodeErrorResult<\n const abi extends Abi | readonly unknown[],\n errorName extends ContractErrorName | undefined = undefined,\n>(\n parameters: EncodeErrorResultParameters,\n): EncodeErrorResultReturnType {\n const { abi, errorName, args } = parameters as EncodeErrorResultParameters\n\n let abiItem = abi[0]\n if (errorName) {\n const item = getAbiItem({ abi, args, name: errorName })\n if (!item) throw new AbiErrorNotFoundError(errorName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'error')\n throw new AbiErrorNotFoundError(undefined, { docsPath })\n\n const definition = formatAbiItem(abiItem)\n const signature = toFunctionSelector(definition)\n\n let data: Hex = '0x'\n if (args && args.length > 0) {\n if (!abiItem.inputs)\n throw new AbiErrorInputsNotFoundError(abiItem.name, { docsPath })\n data = encodeAbiParameters(abiItem.inputs, args)\n }\n return concatHex([signature, data])\n}\n","import type { Abi, AbiStateMutability, ExtractAbiFunctions } from 'abitype'\n\nimport {\n AbiFunctionNotFoundError,\n AbiFunctionOutputsNotFoundError,\n InvalidArrayError,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionName,\n ContractFunctionReturnType,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeFunctionResult'\n\nexport type EncodeFunctionResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n result?:\n | ContractFunctionReturnType<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName,\n never // allow all args. required for overloads to work.\n >\n | undefined\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | undefined }\n : { functionName: functionName | allFunctionNames }\n : { functionName?: functionName | allFunctionNames | undefined }\n> &\n (hasFunctions extends true ? unknown : never)\n\nexport type EncodeFunctionResultReturnType = Hex\n\nexport type EncodeFunctionResultErrorType =\n | AbiFunctionOutputsNotFoundError\n | AbiFunctionNotFoundError\n | EncodeAbiParametersErrorType\n | GetAbiItemErrorType\n | ErrorType\n\nexport function encodeFunctionResult<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n>(\n parameters: EncodeFunctionResultParameters,\n): EncodeFunctionResultReturnType {\n const { abi, functionName, result } =\n parameters as EncodeFunctionResultParameters\n\n let abiItem = abi[0]\n if (functionName) {\n const item = getAbiItem({ abi, name: functionName })\n if (!item) throw new AbiFunctionNotFoundError(functionName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'function')\n throw new AbiFunctionNotFoundError(undefined, { docsPath })\n\n if (!abiItem.outputs)\n throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath })\n\n const values = (() => {\n if (abiItem.outputs.length === 0) return []\n if (abiItem.outputs.length === 1) return [result]\n if (Array.isArray(result)) return result\n throw new InvalidArrayError(result)\n })()\n\n return encodeAbiParameters(abiItem.outputs, values)\n}\n","import { batchGatewayAbi } from '../../constants/abis.js'\nimport { solidityError } from '../../constants/solidity.js'\nimport type { Hex } from '../../types/misc.js'\nimport { decodeFunctionData } from '../abi/decodeFunctionData.js'\nimport { encodeErrorResult } from '../abi/encodeErrorResult.js'\nimport { encodeFunctionResult } from '../abi/encodeFunctionResult.js'\nimport type {\n CcipRequestErrorType,\n CcipRequestParameters,\n CcipRequestReturnType,\n} from '../ccip.js'\n\nexport const localBatchGatewayUrl = 'x-batch-gateway:true'\n\nexport async function localBatchGatewayRequest(parameters: {\n data: Hex\n ccipRequest: (\n parameters: CcipRequestParameters,\n ) => Promise\n}): Promise {\n const { data, ccipRequest } = parameters\n\n const {\n args: [queries],\n } = decodeFunctionData({ abi: batchGatewayAbi, data })\n\n const failures: boolean[] = []\n const responses: Hex[] = []\n await Promise.all(\n queries.map(async (query, i) => {\n try {\n responses[i] = query.urls.includes(localBatchGatewayUrl)\n ? await localBatchGatewayRequest({ data: query.data, ccipRequest })\n : await ccipRequest(query)\n failures[i] = false\n } catch (err) {\n failures[i] = true\n responses[i] = encodeError(err as CcipRequestErrorType)\n }\n }),\n )\n\n return encodeFunctionResult({\n abi: batchGatewayAbi,\n functionName: 'query',\n result: [failures, responses],\n })\n}\n\nfunction encodeError(error: CcipRequestErrorType): Hex {\n if (error.name === 'HttpRequestError' && error.status)\n return encodeErrorResult({\n abi: batchGatewayAbi,\n errorName: 'HttpError',\n args: [error.status, error.shortMessage],\n })\n return encodeErrorResult({\n abi: [solidityError],\n errorName: 'Error',\n args: ['shortMessage' in error ? error.shortMessage : error.message],\n })\n}\n","import type { Abi, Address } from 'abitype'\n\nimport { type CallParameters, call } from '../actions/public/call.js'\nimport type { Client } from '../clients/createClient.js'\nimport type { Transport } from '../clients/transports/createTransport.js'\nimport type { BaseError } from '../errors/base.js'\nimport {\n OffchainLookupError,\n type OffchainLookupErrorType as OffchainLookupErrorType_,\n OffchainLookupResponseMalformedError,\n type OffchainLookupResponseMalformedErrorType,\n OffchainLookupSenderMismatchError,\n} from '../errors/ccip.js'\nimport {\n HttpRequestError,\n type HttpRequestErrorType,\n} from '../errors/request.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Chain } from '../types/chain.js'\nimport type { Hex } from '../types/misc.js'\nimport { decodeErrorResult } from './abi/decodeErrorResult.js'\nimport { encodeAbiParameters } from './abi/encodeAbiParameters.js'\nimport { isAddressEqual } from './address/isAddressEqual.js'\nimport { concat } from './data/concat.js'\nimport { isHex } from './data/isHex.js'\nimport {\n localBatchGatewayRequest,\n localBatchGatewayUrl,\n} from './ens/localBatchGatewayRequest.js'\nimport { stringify } from './stringify.js'\n\nexport const offchainLookupSignature = '0x556f1830'\nexport const offchainLookupAbiItem = {\n name: 'OffchainLookup',\n type: 'error',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'urls',\n type: 'string[]',\n },\n {\n name: 'callData',\n type: 'bytes',\n },\n {\n name: 'callbackFunction',\n type: 'bytes4',\n },\n {\n name: 'extraData',\n type: 'bytes',\n },\n ],\n} as const satisfies Abi[number]\n\nexport type OffchainLookupErrorType = OffchainLookupErrorType_ | ErrorType\n\nexport async function offchainLookup(\n client: Client,\n {\n blockNumber,\n blockTag,\n data,\n to,\n }: Pick & {\n data: Hex\n to: Address\n },\n): Promise {\n const { args } = decodeErrorResult({\n data,\n abi: [offchainLookupAbiItem],\n })\n const [sender, urls, callData, callbackSelector, extraData] = args\n\n const { ccipRead } = client\n const ccipRequest_ =\n ccipRead && typeof ccipRead?.request === 'function'\n ? ccipRead.request\n : ccipRequest\n\n try {\n if (!isAddressEqual(to, sender))\n throw new OffchainLookupSenderMismatchError({ sender, to })\n\n const result = urls.includes(localBatchGatewayUrl)\n ? await localBatchGatewayRequest({\n data: callData,\n ccipRequest: ccipRequest_,\n })\n : await ccipRequest_({ data: callData, sender, urls })\n\n const { data: data_ } = await call(client, {\n blockNumber,\n blockTag,\n data: concat([\n callbackSelector,\n encodeAbiParameters(\n [{ type: 'bytes' }, { type: 'bytes' }],\n [result, extraData],\n ),\n ]),\n to,\n } as CallParameters)\n\n return data_!\n } catch (err) {\n throw new OffchainLookupError({\n callbackSelector,\n cause: err as BaseError,\n data,\n extraData,\n sender,\n urls,\n })\n }\n}\n\nexport type CcipRequestParameters = {\n data: Hex\n sender: Address\n urls: readonly string[]\n}\n\nexport type CcipRequestReturnType = Hex\n\nexport type CcipRequestErrorType =\n | HttpRequestErrorType\n | OffchainLookupResponseMalformedErrorType\n | ErrorType\n\nexport async function ccipRequest({\n data,\n sender,\n urls,\n}: CcipRequestParameters): Promise {\n let error = new Error('An unknown error occurred.')\n\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i]\n const method = url.includes('{data}') ? 'GET' : 'POST'\n const body = method === 'POST' ? { data, sender } : undefined\n const headers: HeadersInit =\n method === 'POST' ? { 'Content-Type': 'application/json' } : {}\n\n try {\n const response = await fetch(\n url.replace('{sender}', sender.toLowerCase()).replace('{data}', data),\n {\n body: JSON.stringify(body),\n headers,\n method,\n },\n )\n\n let result: any\n if (\n response.headers.get('Content-Type')?.startsWith('application/json')\n ) {\n result = (await response.json()).data\n } else {\n result = (await response.text()) as any\n }\n\n if (!response.ok) {\n error = new HttpRequestError({\n body,\n details: result?.error\n ? stringify(result.error)\n : response.statusText,\n headers: response.headers,\n status: response.status,\n url,\n })\n continue\n }\n\n if (!isHex(result)) {\n error = new OffchainLookupResponseMalformedError({\n result,\n url,\n })\n continue\n }\n\n return result\n } catch (err) {\n error = new HttpRequestError({\n body,\n details: (err as Error).message,\n url,\n })\n }\n }\n\n throw error\n}\n","import { type Address, parseAbi } from 'abitype'\nimport * as BlockOverrides from 'ox/BlockOverrides'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { multicall3Abi } from '../../constants/abis.js'\nimport { aggregate3Signature } from '../../constants/contract.js'\nimport {\n deploylessCallViaBytecodeBytecode,\n deploylessCallViaFactoryBytecode,\n multicall3Bytecode,\n} from '../../constants/contracts.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n ChainDoesNotSupportContract,\n ClientChainNotConfiguredError,\n} from '../../errors/chain.js'\nimport {\n CounterfactualDeploymentFailedError,\n RawContractError,\n type RawContractErrorType,\n} from '../../errors/contract.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RpcTransactionRequest } from '../../types/rpc.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial, UnionOmit } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeDeployDataErrorType,\n encodeDeployData,\n} from '../../utils/abi/encodeDeployData.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type GetCallErrorReturnType,\n getCallError,\n} from '../../utils/errors/getCallError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport {\n type CreateBatchSchedulerErrorType,\n createBatchScheduler,\n} from '../../utils/promise/createBatchScheduler.js'\nimport {\n type SerializeStateOverrideErrorType,\n serializeStateOverride,\n} from '../../utils/stateOverride.js'\nimport type {\n AssertRequestErrorType,\n AssertRequestParameters,\n} from '../../utils/transaction/assertRequest.js'\nimport { assertRequest } from '../../utils/transaction/assertRequest.js'\n\nexport type CallParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = UnionOmit, 'from'> & {\n /** Account attached to the call (msg.sender). */\n account?: Account | Address | undefined\n /** Whether or not to enable multicall batching on this call. */\n batch?: boolean | undefined\n /** Block overrides for the call. */\n blockOverrides?: BlockOverrides.BlockOverrides | undefined\n /** Bytecode to perform the call on. */\n code?: Hex | undefined\n /** Contract deployment factory address (ie. Create2 factory, Smart Account factory, etc). */\n factory?: Address | undefined\n /** Calldata to execute on the factory to deploy the contract. */\n factoryData?: Hex | undefined\n /** State overrides for the call. */\n stateOverride?: StateOverride | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n )\ntype FormattedCall =\n FormattedTransactionRequest\n\nexport type CallReturnType = { data: Hex | undefined }\n\nexport type CallErrorType = GetCallErrorReturnType<\n | ParseAccountErrorType\n | SerializeStateOverrideErrorType\n | AssertRequestErrorType\n | NumberToHexErrorType\n | FormatTransactionRequestErrorType\n | ScheduleMulticallErrorType\n | RequestErrorType\n | ToDeploylessCallViaBytecodeDataErrorType\n | ToDeploylessCallViaFactoryDataErrorType\n>\n\n/**\n * Executes a new message call immediately without submitting a transaction to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/call\n * - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call)\n *\n * @param client - Client to use\n * @param parameters - {@link CallParameters}\n * @returns The call data. {@link CallReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { call } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const data = await call(client, {\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\nexport async function call(\n client: Client,\n args: CallParameters,\n): Promise {\n const {\n account: account_ = client.account,\n authorizationList,\n batch = Boolean(client.batch?.multicall),\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n accessList,\n blobs,\n blockOverrides,\n code,\n data: data_,\n factory,\n factoryData,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n stateOverride,\n ...rest\n } = args\n const account = account_ ? parseAccount(account_) : undefined\n\n if (code && (factory || factoryData))\n throw new BaseError(\n 'Cannot provide both `code` & `factory`/`factoryData` as parameters.',\n )\n if (code && to)\n throw new BaseError('Cannot provide both `code` & `to` as parameters.')\n\n // Check if the call is deployless via bytecode.\n const deploylessCallViaBytecode = code && data_\n // Check if the call is deployless via a factory.\n const deploylessCallViaFactory = factory && factoryData && to && data_\n const deploylessCall = deploylessCallViaBytecode || deploylessCallViaFactory\n\n const data = (() => {\n if (deploylessCallViaBytecode)\n return toDeploylessCallViaBytecodeData({\n code,\n data: data_,\n })\n if (deploylessCallViaFactory)\n return toDeploylessCallViaFactoryData({\n data: data_,\n factory,\n factoryData,\n to,\n })\n return data_\n })()\n\n try {\n assertRequest(args as AssertRequestParameters)\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const rpcBlockOverrides = blockOverrides\n ? BlockOverrides.toRpc(blockOverrides)\n : undefined\n const rpcStateOverride = serializeStateOverride(stateOverride)\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n accessList,\n account,\n authorizationList,\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to: deploylessCall ? undefined : to,\n value,\n } as TransactionRequest,\n 'call',\n ) as TransactionRequest\n\n if (\n batch &&\n shouldPerformMulticall({ request }) &&\n !rpcStateOverride &&\n !rpcBlockOverrides\n ) {\n try {\n return await scheduleMulticall(client, {\n ...request,\n blockNumber,\n blockTag,\n } as unknown as ScheduleMulticallParameters)\n } catch (err) {\n if (\n !(err instanceof ClientChainNotConfiguredError) &&\n !(err instanceof ChainDoesNotSupportContract)\n )\n throw err\n }\n }\n\n const params = (() => {\n const base = [\n request as ExactPartial,\n block,\n ] as const\n if (rpcStateOverride && rpcBlockOverrides)\n return [...base, rpcStateOverride, rpcBlockOverrides] as const\n if (rpcStateOverride) return [...base, rpcStateOverride] as const\n if (rpcBlockOverrides) return [...base, {}, rpcBlockOverrides] as const\n return base\n })()\n\n const response = await client.request({\n method: 'eth_call',\n params,\n })\n if (response === '0x') return { data: undefined }\n return { data: response }\n } catch (err) {\n const data = getRevertErrorData(err)\n\n // Check for CCIP-Read offchain lookup signature.\n const { offchainLookup, offchainLookupSignature } = await import(\n '../../utils/ccip.js'\n )\n if (\n client.ccipRead !== false &&\n data?.slice(0, 10) === offchainLookupSignature &&\n to\n )\n return { data: await offchainLookup(client, { data, to }) }\n\n // Check for counterfactual deployment error.\n if (deploylessCall && data?.slice(0, 10) === '0x101bb98d')\n throw new CounterfactualDeploymentFailedError({ factory })\n\n throw getCallError(err as ErrorType, {\n ...args,\n account,\n chain: client.chain,\n })\n }\n}\n\n// We only want to perform a scheduled multicall if:\n// - The request has calldata,\n// - The request has a target address,\n// - The target address is not already the aggregate3 signature,\n// - The request has no other properties (`nonce`, `gas`, etc cannot be sent with a multicall).\nfunction shouldPerformMulticall({ request }: { request: TransactionRequest }) {\n const { data, to, ...request_ } = request\n if (!data) return false\n if (data.startsWith(aggregate3Signature)) return false\n if (!to) return false\n if (\n Object.values(request_).filter((x) => typeof x !== 'undefined').length > 0\n )\n return false\n return true\n}\n\ntype ScheduleMulticallParameters = Pick<\n CallParameters,\n 'blockNumber' | 'blockTag'\n> & {\n data: Hex\n multicallAddress?: Address | undefined\n to: Address\n}\n\ntype ScheduleMulticallErrorType =\n | GetChainContractAddressErrorType\n | NumberToHexErrorType\n | CreateBatchSchedulerErrorType\n | EncodeFunctionDataErrorType\n | DecodeFunctionResultErrorType\n | RawContractErrorType\n | ErrorType\n\nasync function scheduleMulticall(\n client: Client,\n args: ScheduleMulticallParameters,\n) {\n const {\n batchSize = 1024,\n deployless = false,\n wait = 0,\n } = typeof client.batch?.multicall === 'object' ? client.batch.multicall : {}\n const {\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n data,\n to,\n } = args\n\n const multicallAddress = (() => {\n if (deployless) return null\n if (args.multicallAddress) return args.multicallAddress\n if (client.chain) {\n return getChainContractAddress({\n blockNumber,\n chain: client.chain,\n contract: 'multicall3',\n })\n }\n throw new ClientChainNotConfiguredError()\n })()\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const { schedule } = createBatchScheduler({\n id: `${client.uid}.${block}`,\n wait,\n shouldSplitBatch(args) {\n const size = args.reduce((size, { data }) => size + (data.length - 2), 0)\n return size > batchSize * 2\n },\n fn: async (\n requests: {\n data: Hex\n to: Address\n }[],\n ) => {\n const calls = requests.map((request) => ({\n allowFailure: true,\n callData: request.data,\n target: request.to,\n }))\n\n const calldata = encodeFunctionData({\n abi: multicall3Abi,\n args: [calls],\n functionName: 'aggregate3',\n })\n\n const data = await client.request({\n method: 'eth_call',\n params: [\n {\n ...(multicallAddress === null\n ? {\n data: toDeploylessCallViaBytecodeData({\n code: multicall3Bytecode,\n data: calldata,\n }),\n }\n : { to: multicallAddress, data: calldata }),\n },\n block,\n ],\n })\n\n return decodeFunctionResult({\n abi: multicall3Abi,\n args: [calls],\n functionName: 'aggregate3',\n data: data || '0x',\n })\n },\n })\n\n const [{ returnData, success }] = await schedule({ data, to })\n\n if (!success) throw new RawContractError({ data: returnData })\n if (returnData === '0x') return { data: undefined }\n return { data: returnData }\n}\n\ntype ToDeploylessCallViaBytecodeDataErrorType =\n | EncodeDeployDataErrorType\n | ErrorType\n\nfunction toDeploylessCallViaBytecodeData(parameters: { code: Hex; data: Hex }) {\n const { code, data } = parameters\n return encodeDeployData({\n abi: parseAbi(['constructor(bytes, bytes)']),\n bytecode: deploylessCallViaBytecodeBytecode,\n args: [code, data],\n })\n}\n\ntype ToDeploylessCallViaFactoryDataErrorType =\n | EncodeDeployDataErrorType\n | ErrorType\n\nfunction toDeploylessCallViaFactoryData(parameters: {\n data: Hex\n factory: Address\n factoryData: Hex\n to: Address\n}) {\n const { data, factory, factoryData, to } = parameters\n return encodeDeployData({\n abi: parseAbi(['constructor(address, bytes, address, bytes)']),\n bytecode: deploylessCallViaFactoryBytecode,\n args: [to, data, factory, factoryData],\n })\n}\n\n/** @internal */\nexport type GetRevertErrorDataErrorType = ErrorType\n\n/** @internal */\nexport function getRevertErrorData(err: unknown) {\n if (!(err instanceof BaseError)) return undefined\n const error = err.walk() as RawContractError\n return typeof error?.data === 'object' ? error.data?.data : error.data\n}\n","import { versionedHashVersionKzg } from '../../constants/kzg.js'\nimport { maxUint256 } from '../../constants/number.js'\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport { BaseError, type BaseErrorType } from '../../errors/base.js'\nimport {\n EmptyBlobError,\n type EmptyBlobErrorType,\n InvalidVersionedHashSizeError,\n type InvalidVersionedHashSizeErrorType,\n InvalidVersionedHashVersionError,\n type InvalidVersionedHashVersionErrorType,\n} from '../../errors/blob.js'\nimport {\n InvalidChainIdError,\n type InvalidChainIdErrorType,\n} from '../../errors/chain.js'\nimport {\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n} from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableLegacy,\n} from '../../types/transaction.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { size } from '../data/size.js'\nimport { slice } from '../data/slice.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\n\nexport type AssertTransactionEIP7702ErrorType =\n | AssertTransactionEIP1559ErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | ErrorType\n\nexport function assertTransactionEIP7702(\n transaction: TransactionSerializableEIP7702,\n) {\n const { authorizationList } = transaction\n if (authorizationList) {\n for (const authorization of authorizationList) {\n const { chainId } = authorization\n const address = authorization.address\n if (!isAddress(address)) throw new InvalidAddressError({ address })\n if (chainId < 0) throw new InvalidChainIdError({ chainId })\n }\n }\n assertTransactionEIP1559(transaction as {} as TransactionSerializableEIP1559)\n}\n\nexport type AssertTransactionEIP4844ErrorType =\n | AssertTransactionEIP1559ErrorType\n | EmptyBlobErrorType\n | InvalidVersionedHashSizeErrorType\n | InvalidVersionedHashVersionErrorType\n | ErrorType\n\nexport function assertTransactionEIP4844(\n transaction: TransactionSerializableEIP4844,\n) {\n const { blobVersionedHashes } = transaction\n if (blobVersionedHashes) {\n if (blobVersionedHashes.length === 0) throw new EmptyBlobError()\n for (const hash of blobVersionedHashes) {\n const size_ = size(hash)\n const version = hexToNumber(slice(hash, 0, 1))\n if (size_ !== 32)\n throw new InvalidVersionedHashSizeError({ hash, size: size_ })\n if (version !== versionedHashVersionKzg)\n throw new InvalidVersionedHashVersionError({\n hash,\n version,\n })\n }\n }\n assertTransactionEIP1559(transaction as {} as TransactionSerializableEIP1559)\n}\n\nexport type AssertTransactionEIP1559ErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | TipAboveFeeCapErrorType\n | ErrorType\n\nexport function assertTransactionEIP1559(\n transaction: TransactionSerializableEIP1559,\n) {\n const { chainId, maxPriorityFeePerGas, maxFeePerGas, to } = transaction\n if (chainId <= 0) throw new InvalidChainIdError({ chainId })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (maxFeePerGas && maxFeePerGas > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas })\n if (\n maxPriorityFeePerGas &&\n maxFeePerGas &&\n maxPriorityFeePerGas > maxFeePerGas\n )\n throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas })\n}\n\nexport type AssertTransactionEIP2930ErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | ErrorType\n\nexport function assertTransactionEIP2930(\n transaction: TransactionSerializableEIP2930,\n) {\n const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =\n transaction\n if (chainId <= 0) throw new InvalidChainIdError({ chainId })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (maxPriorityFeePerGas || maxFeePerGas)\n throw new BaseError(\n '`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute.',\n )\n if (gasPrice && gasPrice > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })\n}\n\nexport type AssertTransactionLegacyErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | ErrorType\n\nexport function assertTransactionLegacy(\n transaction: TransactionSerializableLegacy,\n) {\n const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =\n transaction\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (typeof chainId !== 'undefined' && chainId <= 0)\n throw new InvalidChainIdError({ chainId })\n if (maxPriorityFeePerGas || maxFeePerGas)\n throw new BaseError(\n '`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute.',\n )\n if (gasPrice && gasPrice > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })\n}\n","import {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport {\n InvalidStorageKeySizeError,\n type InvalidStorageKeySizeErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { AccessList } from '../../types/transaction.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport type { RecursiveArray } from '../encoding/toRlp.js'\n\nexport type SerializeAccessListErrorType =\n | InvalidStorageKeySizeErrorType\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\n/*\n * Serialize an EIP-2930 access list\n * @remarks\n * Use to create a transaction serializer with support for EIP-2930 access lists\n *\n * @param accessList - Array of objects of address and arrays of Storage Keys\n * @throws InvalidAddressError, InvalidStorageKeySizeError\n * @returns Array of hex strings\n */\nexport function serializeAccessList(\n accessList?: AccessList | undefined,\n): RecursiveArray {\n if (!accessList || accessList.length === 0) return []\n\n const serializedAccessList = []\n for (let i = 0; i < accessList.length; i++) {\n const { address, storageKeys } = accessList[i]\n\n for (let j = 0; j < storageKeys.length; j++) {\n if (storageKeys[j].length - 2 !== 64) {\n throw new InvalidStorageKeySizeError({ storageKey: storageKeys[j] })\n }\n }\n\n if (!isAddress(address, { strict: false })) {\n throw new InvalidAddressError({ address })\n }\n\n serializedAccessList.push([address, storageKeys])\n }\n return serializedAccessList\n}\n","import {\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ByteArray,\n Hex,\n Signature,\n SignatureLegacy,\n} from '../../types/misc.js'\nimport type {\n TransactionSerializable,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedLegacy,\n TransactionType,\n} from '../../types/transaction.js'\nimport type { MaybePromise, OneOf } from '../../types/utils.js'\nimport {\n type SerializeAuthorizationListErrorType,\n serializeAuthorizationList,\n} from '../authorization/serializeAuthorizationList.js'\nimport {\n type BlobsToCommitmentsErrorType,\n blobsToCommitments,\n} from '../blob/blobsToCommitments.js'\nimport {\n blobsToProofs,\n type blobsToProofsErrorType,\n} from '../blob/blobsToProofs.js'\nimport {\n type CommitmentsToVersionedHashesErrorType,\n commitmentsToVersionedHashes,\n} from '../blob/commitmentsToVersionedHashes.js'\nimport {\n type ToBlobSidecarsErrorType,\n toBlobSidecars,\n} from '../blob/toBlobSidecars.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport { trim } from '../data/trim.js'\nimport {\n bytesToHex,\n type NumberToHexErrorType,\n numberToHex,\n} from '../encoding/toHex.js'\nimport { type ToRlpErrorType, toRlp } from '../encoding/toRlp.js'\n\nimport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionEIP4844ErrorType,\n type AssertTransactionEIP7702ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionEIP4844,\n assertTransactionEIP7702,\n assertTransactionLegacy,\n} from './assertTransaction.js'\nimport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './getTransactionType.js'\nimport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './serializeAccessList.js'\n\nexport type SerializedTransactionReturnType<\n transaction extends TransactionSerializable = TransactionSerializable,\n ///\n _transactionType extends TransactionType = GetTransactionType,\n> = TransactionSerialized<_transactionType>\n\nexport type SerializeTransactionFn<\n transaction extends TransactionSerializableGeneric = TransactionSerializable,\n ///\n _transactionType extends TransactionType = never,\n> = (\n transaction: OneOf,\n signature?: Signature | undefined,\n) => MaybePromise<\n SerializedTransactionReturnType<\n OneOf,\n _transactionType\n >\n>\n\nexport type SerializeTransactionErrorType =\n | GetTransactionTypeErrorType\n | SerializeTransactionEIP1559ErrorType\n | SerializeTransactionEIP2930ErrorType\n | SerializeTransactionEIP4844ErrorType\n | SerializeTransactionEIP7702ErrorType\n | SerializeTransactionLegacyErrorType\n | ErrorType\n\nexport function serializeTransaction<\n const transaction extends TransactionSerializable,\n ///\n _transactionType extends TransactionType = GetTransactionType,\n>(\n transaction: transaction,\n signature?: Signature | undefined,\n): SerializedTransactionReturnType {\n const type = getTransactionType(transaction) as GetTransactionType\n\n if (type === 'eip1559')\n return serializeTransactionEIP1559(\n transaction as TransactionSerializableEIP1559,\n signature,\n ) as SerializedTransactionReturnType\n\n if (type === 'eip2930')\n return serializeTransactionEIP2930(\n transaction as TransactionSerializableEIP2930,\n signature,\n ) as SerializedTransactionReturnType\n\n if (type === 'eip4844')\n return serializeTransactionEIP4844(\n transaction as TransactionSerializableEIP4844,\n signature,\n ) as SerializedTransactionReturnType\n\n if (type === 'eip7702')\n return serializeTransactionEIP7702(\n transaction as TransactionSerializableEIP7702,\n signature,\n ) as SerializedTransactionReturnType\n\n return serializeTransactionLegacy(\n transaction as TransactionSerializableLegacy,\n signature as SignatureLegacy,\n ) as SerializedTransactionReturnType\n}\n\ntype SerializeTransactionEIP7702ErrorType =\n | AssertTransactionEIP7702ErrorType\n | SerializeAuthorizationListErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP7702(\n transaction: TransactionSerializableEIP7702,\n signature?: Signature | undefined,\n): TransactionSerializedEIP7702 {\n const {\n authorizationList,\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP7702(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n const serializedAuthorizationList =\n serializeAuthorizationList(authorizationList)\n\n return concatHex([\n '0x04',\n toRlp([\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n serializedAuthorizationList,\n ...toYParitySignatureArray(transaction, signature),\n ]),\n ]) as TransactionSerializedEIP7702\n}\n\ntype SerializeTransactionEIP4844ErrorType =\n | AssertTransactionEIP4844ErrorType\n | BlobsToCommitmentsErrorType\n | CommitmentsToVersionedHashesErrorType\n | blobsToProofsErrorType\n | ToBlobSidecarsErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP4844(\n transaction: TransactionSerializableEIP4844,\n signature?: Signature | undefined,\n): TransactionSerializedEIP4844 {\n const {\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP4844(transaction)\n\n let blobVersionedHashes = transaction.blobVersionedHashes\n let sidecars = transaction.sidecars\n // If `blobs` are passed, we will need to compute the KZG commitments & proofs.\n if (\n transaction.blobs &&\n (typeof blobVersionedHashes === 'undefined' ||\n typeof sidecars === 'undefined')\n ) {\n const blobs = (\n typeof transaction.blobs[0] === 'string'\n ? transaction.blobs\n : (transaction.blobs as ByteArray[]).map((x) => bytesToHex(x))\n ) as Hex[]\n const kzg = transaction.kzg!\n const commitments = blobsToCommitments({\n blobs,\n kzg,\n })\n\n if (typeof blobVersionedHashes === 'undefined')\n blobVersionedHashes = commitmentsToVersionedHashes({\n commitments,\n })\n if (typeof sidecars === 'undefined') {\n const proofs = blobsToProofs({ blobs, commitments, kzg })\n sidecars = toBlobSidecars({ blobs, commitments, proofs })\n }\n }\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n maxFeePerBlobGas ? numberToHex(maxFeePerBlobGas) : '0x',\n blobVersionedHashes ?? [],\n ...toYParitySignatureArray(transaction, signature),\n ] as const\n\n const blobs: Hex[] = []\n const commitments: Hex[] = []\n const proofs: Hex[] = []\n if (sidecars)\n for (let i = 0; i < sidecars.length; i++) {\n const { blob, commitment, proof } = sidecars[i]\n blobs.push(blob)\n commitments.push(commitment)\n proofs.push(proof)\n }\n\n return concatHex([\n '0x03',\n sidecars\n ? // If sidecars are enabled, envelope turns into a \"wrapper\":\n toRlp([serializedTransaction, blobs, commitments, proofs])\n : // If sidecars are disabled, standard envelope is used:\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP4844\n}\n\ntype SerializeTransactionEIP1559ErrorType =\n | AssertTransactionEIP1559ErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP1559(\n transaction: TransactionSerializableEIP1559,\n signature?: Signature | undefined,\n): TransactionSerializedEIP1559 {\n const {\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP1559(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n ...toYParitySignatureArray(transaction, signature),\n ]\n\n return concatHex([\n '0x02',\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP1559\n}\n\ntype SerializeTransactionEIP2930ErrorType =\n | AssertTransactionEIP2930ErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP2930(\n transaction: TransactionSerializableEIP2930,\n signature?: Signature | undefined,\n): TransactionSerializedEIP2930 {\n const { chainId, gas, data, nonce, to, value, accessList, gasPrice } =\n transaction\n\n assertTransactionEIP2930(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n gasPrice ? numberToHex(gasPrice) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n ...toYParitySignatureArray(transaction, signature),\n ]\n\n return concatHex([\n '0x01',\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP2930\n}\n\ntype SerializeTransactionLegacyErrorType =\n | AssertTransactionLegacyErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | ErrorType\n\nfunction serializeTransactionLegacy(\n transaction: TransactionSerializableLegacy,\n signature?: SignatureLegacy | undefined,\n): TransactionSerializedLegacy {\n const { chainId = 0, gas, data, nonce, to, value, gasPrice } = transaction\n\n assertTransactionLegacy(transaction)\n\n let serializedTransaction = [\n nonce ? numberToHex(nonce) : '0x',\n gasPrice ? numberToHex(gasPrice) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n ]\n\n if (signature) {\n const v = (() => {\n // EIP-155 (inferred chainId)\n if (signature.v >= 35n) {\n const inferredChainId = (signature.v - 35n) / 2n\n if (inferredChainId > 0) return signature.v\n return 27n + (signature.v === 35n ? 0n : 1n)\n }\n\n // EIP-155 (explicit chainId)\n if (chainId > 0)\n return BigInt(chainId * 2) + BigInt(35n + signature.v - 27n)\n\n // Pre-EIP-155 (no chainId)\n const v = 27n + (signature.v === 27n ? 0n : 1n)\n if (signature.v !== v) throw new InvalidLegacyVError({ v: signature.v })\n return v\n })()\n\n const r = trim(signature.r)\n const s = trim(signature.s)\n\n serializedTransaction = [\n ...serializedTransaction,\n numberToHex(v),\n r === '0x00' ? '0x' : r,\n s === '0x00' ? '0x' : s,\n ]\n } else if (chainId > 0) {\n serializedTransaction = [\n ...serializedTransaction,\n numberToHex(chainId),\n '0x',\n '0x',\n ]\n }\n\n return toRlp(serializedTransaction) as TransactionSerializedLegacy\n}\n\nexport function toYParitySignatureArray(\n transaction: TransactionSerializableGeneric,\n signature_?: Signature | undefined,\n) {\n const signature = signature_ ?? transaction\n const { v, yParity } = signature\n\n if (typeof signature.r === 'undefined') return []\n if (typeof signature.s === 'undefined') return []\n if (typeof v === 'undefined' && typeof yParity === 'undefined') return []\n\n const r = trim(signature.r)\n const s = trim(signature.s)\n\n const yParity_ = (() => {\n if (typeof yParity === 'number') return yParity ? numberToHex(1) : '0x'\n if (v === 0n) return '0x'\n if (v === 1n) return numberToHex(1)\n\n return v === 27n ? '0x' : numberToHex(1)\n })()\n\n return [yParity_, r === '0x00' ? '0x' : r, s === '0x00' ? '0x' : s]\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n AuthorizationList,\n SerializedAuthorizationList,\n} from '../../types/authorization.js'\nimport { toHex } from '../encoding/toHex.js'\nimport { toYParitySignatureArray } from '../transaction/serializeTransaction.js'\n\nexport type SerializeAuthorizationListReturnType = SerializedAuthorizationList\n\nexport type SerializeAuthorizationListErrorType = ErrorType\n\n/*\n * Serializes an EIP-7702 authorization list.\n */\nexport function serializeAuthorizationList(\n authorizationList?: AuthorizationList | undefined,\n): SerializeAuthorizationListReturnType {\n if (!authorizationList || authorizationList.length === 0) return []\n\n const serializedAuthorizationList = []\n for (const authorization of authorizationList) {\n const { chainId, nonce, ...signature } = authorization\n const contractAddress = authorization.address\n serializedAuthorizationList.push([\n chainId ? toHex(chainId) : '0x',\n contractAddress,\n nonce ? toHex(nonce) : '0x',\n ...toYParitySignatureArray({}, signature),\n ])\n }\n\n return serializedAuthorizationList as {} as SerializeAuthorizationListReturnType\n}\n","export const presignMessagePrefix = '\\x19Ethereum Signed Message:\\n'\n","import { presignMessagePrefix } from '../../constants/strings.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex, SignableMessage } from '../../types/misc.js'\nimport { type ConcatErrorType, concat } from '../data/concat.js'\nimport { size } from '../data/size.js'\nimport {\n type BytesToHexErrorType,\n bytesToHex,\n type StringToHexErrorType,\n stringToHex,\n} from '../encoding/toHex.js'\n\nexport type ToPrefixedMessageErrorType =\n | ConcatErrorType\n | StringToHexErrorType\n | BytesToHexErrorType\n | ErrorType\n\nexport function toPrefixedMessage(message_: SignableMessage): Hex {\n const message = (() => {\n if (typeof message_ === 'string') return stringToHex(message_)\n if (typeof message_.raw === 'string') return message_.raw\n return bytesToHex(message_.raw)\n })()\n const prefix = stringToHex(`${presignMessagePrefix}${size(message)}`)\n return concat([prefix, message])\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, SignableMessage } from '../../types/misc.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport { toPrefixedMessage } from './toPrefixedMessage.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type HashMessageReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type HashMessageErrorType = Keccak256ErrorType | ErrorType\n\nexport function hashMessage(\n message: SignableMessage,\n to_?: to | undefined,\n): HashMessageReturnType {\n return keccak256(toPrefixedMessage(message), to_)\n}\n","import type { TypedData } from 'abitype'\n\nimport { stringify } from '../utils/stringify.js'\nimport { BaseError } from './base.js'\n\nexport type InvalidDomainErrorType = InvalidDomainError & {\n name: 'InvalidDomainError'\n}\nexport class InvalidDomainError extends BaseError {\n constructor({ domain }: { domain: unknown }) {\n super(`Invalid domain \"${stringify(domain)}\".`, {\n metaMessages: ['Must be a valid EIP-712 domain.'],\n })\n }\n}\n\nexport type InvalidPrimaryTypeErrorType = InvalidPrimaryTypeError & {\n name: 'InvalidPrimaryTypeError'\n}\nexport class InvalidPrimaryTypeError extends BaseError {\n constructor({\n primaryType,\n types,\n }: { primaryType: string; types: TypedData | Record }) {\n super(\n `Invalid primary type \\`${primaryType}\\` must be one of \\`${JSON.stringify(Object.keys(types))}\\`.`,\n {\n docsPath: '/api/glossary/Errors#typeddatainvalidprimarytypeerror',\n metaMessages: ['Check that the primary type is a key in `types`.'],\n },\n )\n }\n}\n\nexport type InvalidStructTypeErrorType = InvalidStructTypeError & {\n name: 'InvalidStructTypeError'\n}\nexport class InvalidStructTypeError extends BaseError {\n constructor({ type }: { type: string }) {\n super(`Struct type \"${type}\" is invalid.`, {\n metaMessages: ['Struct type must not be a Solidity type.'],\n name: 'InvalidStructTypeError',\n })\n }\n}\n","import type { TypedData, TypedDataDomain, TypedDataParameter } from 'abitype'\n\nimport { BytesSizeMismatchError } from '../errors/abi.js'\nimport { InvalidAddressError } from '../errors/address.js'\nimport {\n InvalidDomainError,\n InvalidPrimaryTypeError,\n InvalidStructTypeError,\n} from '../errors/typedData.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Hex } from '../types/misc.js'\nimport type { TypedDataDefinition } from '../types/typedData.js'\nimport { type IsAddressErrorType, isAddress } from './address/isAddress.js'\nimport { type SizeErrorType, size } from './data/size.js'\nimport { type NumberToHexErrorType, numberToHex } from './encoding/toHex.js'\nimport { bytesRegex, integerRegex } from './regex.js'\nimport {\n type HashDomainErrorType,\n hashDomain,\n} from './signature/hashTypedData.js'\nimport { stringify } from './stringify.js'\n\nexport type SerializeTypedDataErrorType =\n | HashDomainErrorType\n | IsAddressErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nexport function serializeTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(parameters: TypedDataDefinition) {\n const {\n domain: domain_,\n message: message_,\n primaryType,\n types,\n } = parameters as unknown as TypedDataDefinition\n\n const normalizeData = (\n struct: readonly TypedDataParameter[],\n data_: Record,\n ) => {\n const data = { ...data_ }\n for (const param of struct) {\n const { name, type } = param\n if (type === 'address') data[name] = (data[name] as string).toLowerCase()\n }\n return data\n }\n\n const domain = (() => {\n if (!types.EIP712Domain) return {}\n if (!domain_) return {}\n return normalizeData(types.EIP712Domain, domain_)\n })()\n\n const message = (() => {\n if (primaryType === 'EIP712Domain') return undefined\n return normalizeData(types[primaryType], message_)\n })()\n\n return stringify({ domain, message, primaryType, types })\n}\n\nexport type ValidateTypedDataErrorType =\n | HashDomainErrorType\n | IsAddressErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nexport function validateTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(parameters: TypedDataDefinition) {\n const { domain, message, primaryType, types } =\n parameters as unknown as TypedDataDefinition\n\n const validateData = (\n struct: readonly TypedDataParameter[],\n data: Record,\n ) => {\n for (const param of struct) {\n const { name, type } = param\n const value = data[name]\n\n const integerMatch = type.match(integerRegex)\n if (\n integerMatch &&\n (typeof value === 'number' || typeof value === 'bigint')\n ) {\n const [_type, base, size_] = integerMatch\n // If number cannot be cast to a sized hex value, it is out of range\n // and will throw.\n numberToHex(value, {\n signed: base === 'int',\n size: Number.parseInt(size_, 10) / 8,\n })\n }\n\n if (type === 'address' && typeof value === 'string' && !isAddress(value))\n throw new InvalidAddressError({ address: value })\n\n const bytesMatch = type.match(bytesRegex)\n if (bytesMatch) {\n const [_type, size_] = bytesMatch\n if (size_ && size(value as Hex) !== Number.parseInt(size_, 10))\n throw new BytesSizeMismatchError({\n expectedSize: Number.parseInt(size_, 10),\n givenSize: size(value as Hex),\n })\n }\n\n const struct = types[type]\n if (struct) {\n validateReference(type)\n validateData(struct, value as Record)\n }\n }\n }\n\n // Validate domain types.\n if (types.EIP712Domain && domain) {\n if (typeof domain !== 'object') throw new InvalidDomainError({ domain })\n validateData(types.EIP712Domain, domain)\n }\n\n // Validate message types.\n if (primaryType !== 'EIP712Domain') {\n if (types[primaryType]) validateData(types[primaryType], message)\n else throw new InvalidPrimaryTypeError({ primaryType, types })\n }\n}\n\nexport type GetTypesForEIP712DomainErrorType = ErrorType\n\nexport function getTypesForEIP712Domain({\n domain,\n}: {\n domain?: TypedDataDomain | undefined\n}): TypedDataParameter[] {\n return [\n typeof domain?.name === 'string' && { name: 'name', type: 'string' },\n domain?.version && { name: 'version', type: 'string' },\n (typeof domain?.chainId === 'number' ||\n typeof domain?.chainId === 'bigint') && {\n name: 'chainId',\n type: 'uint256',\n },\n domain?.verifyingContract && {\n name: 'verifyingContract',\n type: 'address',\n },\n domain?.salt && { name: 'salt', type: 'bytes32' },\n ].filter(Boolean) as TypedDataParameter[]\n}\n\nexport type DomainSeparatorErrorType =\n | GetTypesForEIP712DomainErrorType\n | HashDomainErrorType\n | ErrorType\n\nexport function domainSeparator({ domain }: { domain: TypedDataDomain }): Hex {\n return hashDomain({\n domain: domain as never,\n types: {\n EIP712Domain: getTypesForEIP712Domain({ domain }),\n },\n })\n}\n\n/** @internal */\nfunction validateReference(type: string) {\n // Struct type must not be a Solidity type.\n if (\n type === 'address' ||\n type === 'bool' ||\n type === 'string' ||\n type.startsWith('bytes') ||\n type.startsWith('uint') ||\n type.startsWith('int')\n )\n throw new InvalidStructTypeError({ type })\n}\n","// Implementation forked and adapted from https://github.com/MetaMask/eth-sig-util/blob/main/src/sign-typed-data.ts\n\nimport type { AbiParameter, TypedData } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n EIP712DomainDefinition,\n MessageDefinition,\n TypedDataDefinition,\n} from '../../types/typedData.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from '../abi/encodeAbiParameters.js'\nimport { concat } from '../data/concat.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type GetTypesForEIP712DomainErrorType,\n getTypesForEIP712Domain,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from '../typedData.js'\n\ntype MessageTypeProperty = {\n name: string\n type: string\n}\n\nexport type HashTypedDataParameters<\n typedData extends TypedData | Record = TypedData,\n primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n> = TypedDataDefinition\n\nexport type HashTypedDataReturnType = Hex\n\nexport type HashTypedDataErrorType =\n | GetTypesForEIP712DomainErrorType\n | HashDomainErrorType\n | HashStructErrorType\n | ValidateTypedDataErrorType\n | ErrorType\n\nexport function hashTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(\n parameters: HashTypedDataParameters,\n): HashTypedDataReturnType {\n const {\n domain = {},\n message,\n primaryType,\n } = parameters as HashTypedDataParameters\n const types = {\n EIP712Domain: getTypesForEIP712Domain({ domain }),\n ...parameters.types,\n }\n\n // Need to do a runtime validation check on addresses, byte ranges, integer ranges, etc\n // as we can't statically check this with TypeScript.\n validateTypedData({\n domain,\n message,\n primaryType,\n types,\n })\n\n const parts: Hex[] = ['0x1901']\n if (domain)\n parts.push(\n hashDomain({\n domain,\n types: types as Record,\n }),\n )\n\n if (primaryType !== 'EIP712Domain')\n parts.push(\n hashStruct({\n data: message,\n primaryType,\n types: types as Record,\n }),\n )\n\n return keccak256(concat(parts))\n}\n\nexport type HashDomainErrorType = HashStructErrorType | ErrorType\n\nexport function hashDomain<\n const typedData extends TypedData | Record = TypedData,\n>({\n domain,\n types,\n}: UnionOmit, 'primaryType'>) {\n return hashStruct({\n data: domain as Record,\n primaryType: 'EIP712Domain',\n types: types as Record,\n })\n}\n\nexport type HashStructErrorType =\n | EncodeDataErrorType\n | Keccak256ErrorType\n | ErrorType\n\nexport function hashStruct<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>({\n data,\n primaryType,\n types,\n}: MessageDefinition) {\n const encoded = encodeData({\n data: data as Record,\n primaryType,\n types: types as Record,\n })\n return keccak256(encoded)\n}\n\ntype EncodeDataErrorType =\n | EncodeAbiParametersErrorType\n | EncodeFieldErrorType\n | HashTypeErrorType\n | ErrorType\n\nfunction encodeData({\n data,\n primaryType,\n types,\n}: {\n data: Record\n primaryType: string\n types: Record\n}) {\n const encodedTypes: AbiParameter[] = [{ type: 'bytes32' }]\n const encodedValues: unknown[] = [hashType({ primaryType, types })]\n\n for (const field of types[primaryType]) {\n const [type, value] = encodeField({\n types,\n name: field.name,\n type: field.type,\n value: data[field.name],\n })\n encodedTypes.push(type)\n encodedValues.push(value)\n }\n\n return encodeAbiParameters(encodedTypes, encodedValues)\n}\n\ntype HashTypeErrorType =\n | ToHexErrorType\n | EncodeTypeErrorType\n | Keccak256ErrorType\n | ErrorType\n\nfunction hashType({\n primaryType,\n types,\n}: {\n primaryType: string\n types: Record\n}) {\n const encodedHashType = toHex(encodeType({ primaryType, types }))\n return keccak256(encodedHashType)\n}\n\ntype EncodeTypeErrorType = FindTypeDependenciesErrorType\n\nexport function encodeType({\n primaryType,\n types,\n}: {\n primaryType: string\n types: Record\n}) {\n let result = ''\n const unsortedDeps = findTypeDependencies({ primaryType, types })\n unsortedDeps.delete(primaryType)\n\n const deps = [primaryType, ...Array.from(unsortedDeps).sort()]\n for (const type of deps) {\n result += `${type}(${types[type]\n .map(({ name, type: t }) => `${t} ${name}`)\n .join(',')})`\n }\n\n return result\n}\n\ntype FindTypeDependenciesErrorType = ErrorType\n\nfunction findTypeDependencies(\n {\n primaryType: primaryType_,\n types,\n }: {\n primaryType: string\n types: Record\n },\n results: Set = new Set(),\n): Set {\n const match = primaryType_.match(/^\\w*/u)\n const primaryType = match?.[0]!\n if (results.has(primaryType) || types[primaryType] === undefined) {\n return results\n }\n\n results.add(primaryType)\n\n for (const field of types[primaryType]) {\n findTypeDependencies({ primaryType: field.type, types }, results)\n }\n return results\n}\n\ntype EncodeFieldErrorType =\n | Keccak256ErrorType\n | EncodeAbiParametersErrorType\n | ToHexErrorType\n | ErrorType\n\nfunction encodeField({\n types,\n name,\n type,\n value,\n}: {\n types: Record\n name: string\n type: string\n value: any\n}): [type: AbiParameter, value: any] {\n if (types[type] !== undefined) {\n return [\n { type: 'bytes32' },\n keccak256(encodeData({ data: value, primaryType: type, types })),\n ]\n }\n\n if (type === 'bytes') return [{ type: 'bytes32' }, keccak256(value)]\n\n if (type === 'string') return [{ type: 'bytes32' }, keccak256(toHex(value))]\n\n if (type.lastIndexOf(']') === type.length - 1) {\n const parsedType = type.slice(0, type.lastIndexOf('['))\n const typeValuePairs = (value as [AbiParameter, any][]).map((item) =>\n encodeField({\n name,\n type: parsedType,\n types,\n value: item,\n }),\n )\n return [\n { type: 'bytes32' },\n keccak256(\n encodeAbiParameters(\n typeValuePairs.map(([t]) => t),\n typeValuePairs.map(([, v]) => v),\n ),\n ),\n ]\n }\n\n return [{ type }, value]\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type HexToBigIntErrorType, hexToBigInt } from '../encoding/fromHex.js'\nimport { hexToBytes } from '../encoding/toBytes.js'\nimport type { ToHexErrorType } from '../encoding/toHex.js'\n\ntype To = 'bytes' | 'hex'\n\nexport type SerializeSignatureParameters = Signature & {\n to?: to | To | undefined\n}\n\nexport type SerializeSignatureReturnType =\n | (to extends 'hex' ? Hex : never)\n | (to extends 'bytes' ? ByteArray : never)\n\nexport type SerializeSignatureErrorType =\n | HexToBigIntErrorType\n | ToHexErrorType\n | ErrorType\n\n/**\n * @description Converts a signature into hex format.\n *\n * @param signature The signature to convert.\n * @returns The signature in hex format.\n *\n * @example\n * serializeSignature({\n * r: '0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf',\n * s: '0x4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db8',\n * yParity: 1\n * })\n * // \"0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c\"\n */\nexport function serializeSignature({\n r,\n s,\n to = 'hex',\n v,\n yParity,\n}: SerializeSignatureParameters): SerializeSignatureReturnType {\n const yParity_ = (() => {\n if (yParity === 0 || yParity === 1) return yParity\n if (v && (v === 27n || v === 28n || v >= 35n)) return v % 2n === 0n ? 1 : 0\n throw new Error('Invalid `v` or `yParity` value')\n })()\n const signature = `0x${new secp256k1.Signature(\n hexToBigInt(r),\n hexToBigInt(s),\n ).toCompactHex()}${yParity_ === 0 ? '1b' : '1c'}` as const\n\n if (to === 'hex') return signature as SerializeSignatureReturnType\n return hexToBytes(signature) as SerializeSignatureReturnType\n}\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\n// no abytes: seems to have 10% slowdown. Why?!\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like , , \ntype Chain = [Coder, ...Coder[]];\n// Extract info from Coder type\ntype Input = F extends Coder ? T : never;\ntype Output = F extends Coder ? T : never;\n// Generic function for arrays\ntype First = T extends [infer U, ...any[]] ? U : never;\ntype Last = T extends [...any[], infer U] ? U : never;\ntype Tail = T extends [any, ...infer U] ? U : never;\n\ntype AsChain> = {\n // C[K] = Coder, Input>\n [K in keyof C]: Coder, Input>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain>(...args: T): Coder>, Output>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn: (val: T) => T): Coder {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes): ReturnType | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase}1${string}`;\n decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase}1${string}`;\n }\n\n function decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","/**\n * PBKDF (RFC 2898). Can be used to create a key from password and salt.\n * @module\n */\nimport { hmac } from './hmac.ts';\n// prettier-ignore\nimport {\n ahash, anumber,\n asyncLoop, checkOpts, clean, createView, Hash, kdfInputToBytes,\n type CHash,\n type KDFInput\n} from './utils.ts';\n\nexport type Pbkdf2Opt = {\n c: number; // Iterations\n dkLen?: number; // Desired key length in bytes (Intended output length in octets of the derived key\n asyncTick?: number; // Maximum time in ms for which async function can block execution\n};\n// Common prologue and epilogue for sync/async functions\nfunction pbkdf2Init(hash: CHash, _password: KDFInput, _salt: KDFInput, _opts: Pbkdf2Opt) {\n ahash(hash);\n const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n anumber(c);\n anumber(dkLen);\n anumber(asyncTick);\n if (c < 1) throw new Error('iterations (c) should be >= 1');\n const password = kdfInputToBytes(_password);\n const salt = kdfInputToBytes(_salt);\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\n\nfunction pbkdf2Output>(\n PRF: Hash,\n PRFSalt: Hash,\n DK: Uint8Array,\n prfW: Hash,\n u: Uint8Array\n) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW) prfW.destroy();\n clean(u);\n return DK;\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n * @example\n * const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });\n */\nexport function pbkdf2(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Uint8Array {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function. Async version.\n * @example\n * await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });\n */\nexport async function pbkdf2Async(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Promise {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await asyncLoop(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n","/**\n * Audited & minimal JS implementation of\n * [BIP39 mnemonic phrases](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).\n * @module\n * @example\n```js\nimport * as bip39 from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nconst mn = bip39.generateMnemonic(wordlist);\nconsole.log(mn);\nconst ent = bip39.mnemonicToEntropy(mn, wordlist)\nbip39.entropyToMnemonic(ent, wordlist);\nbip39.validateMnemonic(mn, wordlist);\nawait bip39.mnemonicToSeed(mn, 'password');\nbip39.mnemonicToSeedSync(mn, 'password');\n\n// Wordlists\nimport { wordlist as czech } from '@scure/bip39/wordlists/czech';\nimport { wordlist as english } from '@scure/bip39/wordlists/english';\nimport { wordlist as french } from '@scure/bip39/wordlists/french';\nimport { wordlist as italian } from '@scure/bip39/wordlists/italian';\nimport { wordlist as japanese } from '@scure/bip39/wordlists/japanese';\nimport { wordlist as korean } from '@scure/bip39/wordlists/korean';\nimport { wordlist as portuguese } from '@scure/bip39/wordlists/portuguese';\nimport { wordlist as simplifiedChinese } from '@scure/bip39/wordlists/simplified-chinese';\nimport { wordlist as spanish } from '@scure/bip39/wordlists/spanish';\nimport { wordlist as traditionalChinese } from '@scure/bip39/wordlists/traditional-chinese';\n```\n */\n/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2';\nimport { sha256, sha512 } from '@noble/hashes/sha2';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent, 16, 20, 24, 28, 32);\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","// TODO(v3): Rename to `toLocalAccount` + add `source` property to define source (privateKey, mnemonic, hdKey, etc).\n\nimport type { Address } from 'abitype'\n\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../errors/address.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport {\n type IsAddressErrorType,\n isAddress,\n} from '../utils/address/isAddress.js'\nimport type {\n AccountSource,\n CustomSource,\n JsonRpcAccount,\n LocalAccount,\n} from './types.js'\n\ntype GetAccountReturnType =\n | (accountSource extends Address ? JsonRpcAccount : never)\n | (accountSource extends CustomSource ? LocalAccount : never)\n\nexport type ToAccountErrorType =\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\n/**\n * @description Creates an Account from a custom signing implementation.\n *\n * @returns A Local Account.\n */\nexport function toAccount(\n source: accountSource,\n): GetAccountReturnType {\n if (typeof source === 'string') {\n if (!isAddress(source, { strict: false }))\n throw new InvalidAddressError({ address: source })\n return {\n address: source,\n type: 'json-rpc',\n } as GetAccountReturnType\n }\n\n if (!isAddress(source.address, { strict: false }))\n throw new InvalidAddressError({ address: source.address })\n return {\n address: source.address,\n nonceManager: source.nonceManager,\n sign: source.sign,\n signAuthorization: source.signAuthorization,\n signMessage: source.signMessage,\n signTransaction: source.signTransaction,\n signTypedData: source.signTypedData,\n source: 'custom',\n type: 'local',\n } as GetAccountReturnType\n}\n","// TODO(v3): Convert to sync.\n\nimport { secp256k1 } from '@noble/curves/secp256k1'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../../utils/data/isHex.js'\nimport {\n type HexToBytesErrorType,\n hexToBytes,\n} from '../../utils/encoding/toBytes.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { serializeSignature } from '../../utils/signature/serializeSignature.js'\n\ntype To = 'object' | 'bytes' | 'hex'\n\nexport type SignParameters = {\n hash: Hex\n privateKey: Hex\n to?: to | To | undefined\n}\n\nexport type SignReturnType =\n | (to extends 'object' ? Signature : never)\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type SignErrorType =\n | HexToBytesErrorType\n | IsHexErrorType\n | NumberToHexErrorType\n | ErrorType\n\nlet extraEntropy: Hex | boolean = false\n\n/**\n * Sets extra entropy for signing functions.\n */\nexport function setSignEntropy(entropy: true | Hex) {\n if (!entropy) throw new Error('must be a `true` or a hex value.')\n extraEntropy = entropy\n}\n\n/**\n * @description Signs a hash with a given private key.\n *\n * @param hash The hash to sign.\n * @param privateKey The private key to sign with.\n *\n * @returns The signature.\n */\nexport async function sign({\n hash,\n privateKey,\n to = 'object',\n}: SignParameters): Promise> {\n const { r, s, recovery } = secp256k1.sign(\n hash.slice(2),\n privateKey.slice(2),\n {\n lowS: true,\n extraEntropy: isHex(extraEntropy, { strict: false })\n ? hexToBytes(extraEntropy)\n : extraEntropy,\n },\n )\n const signature = {\n r: numberToHex(r, { size: 32 }),\n s: numberToHex(s, { size: 32 }),\n v: recovery ? 28n : 27n,\n yParity: recovery,\n }\n return (() => {\n if (to === 'bytes' || to === 'hex')\n return serializeSignature({ ...signature, to })\n return signature\n })() as SignReturnType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n AuthorizationRequest,\n SignedAuthorization,\n} from '../../types/authorization.js'\nimport type { Hex, Signature } from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type HashAuthorizationErrorType,\n hashAuthorization,\n} from '../../utils/authorization/hashAuthorization.js'\nimport {\n type SignErrorType,\n type SignParameters,\n type SignReturnType,\n sign,\n} from './sign.js'\n\ntype To = 'object' | 'bytes' | 'hex'\n\nexport type SignAuthorizationParameters =\n AuthorizationRequest & {\n /** The private key to sign with. */\n privateKey: Hex\n to?: SignParameters['to'] | undefined\n }\n\nexport type SignAuthorizationReturnType = Prettify<\n to extends 'object' ? SignedAuthorization : SignReturnType\n>\n\nexport type SignAuthorizationErrorType =\n | SignErrorType\n | HashAuthorizationErrorType\n | ErrorType\n\n/**\n * Signs an Authorization hash in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n */\nexport async function signAuthorization(\n parameters: SignAuthorizationParameters,\n): Promise> {\n const { chainId, nonce, privateKey, to = 'object' } = parameters\n const address = parameters.contractAddress ?? parameters.address\n const signature = await sign({\n hash: hashAuthorization({ address, chainId, nonce }),\n privateKey,\n to,\n })\n if (to === 'object')\n return {\n address,\n chainId,\n nonce,\n ...(signature as Signature),\n } as any\n return signature as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex, SignableMessage } from '../../types/misc.js'\nimport {\n type HashMessageErrorType,\n hashMessage,\n} from '../../utils/signature/hashMessage.js'\n\nimport { type SignErrorType, sign } from './sign.js'\n\nexport type SignMessageParameters = {\n /** The message to sign. */\n message: SignableMessage\n /** The private key to sign with. */\n privateKey: Hex\n}\n\nexport type SignMessageReturnType = Hex\n\nexport type SignMessageErrorType =\n | SignErrorType\n | HashMessageErrorType\n | ErrorType\n\n/**\n * @description Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191):\n * `keccak256(\"\\x19Ethereum Signed Message:\\n\" + len(message) + message))`.\n *\n * @returns The signature.\n */\nexport async function signMessage({\n message,\n privateKey,\n}: SignMessageParameters): Promise {\n return await sign({ hash: hashMessage(message), privateKey, to: 'hex' })\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n TransactionSerializable,\n TransactionSerialized,\n} from '../../types/transaction.js'\nimport {\n type Keccak256ErrorType,\n keccak256,\n} from '../../utils/hash/keccak256.js'\nimport type { GetTransactionType } from '../../utils/transaction/getTransactionType.js'\nimport {\n type SerializeTransactionFn,\n serializeTransaction,\n} from '../../utils/transaction/serializeTransaction.js'\n\nimport { type SignErrorType, sign } from './sign.js'\n\nexport type SignTransactionParameters<\n serializer extends\n SerializeTransactionFn = SerializeTransactionFn,\n transaction extends Parameters[0] = Parameters[0],\n> = {\n privateKey: Hex\n transaction: transaction\n serializer?: serializer | undefined\n}\n\nexport type SignTransactionReturnType<\n serializer extends\n SerializeTransactionFn = SerializeTransactionFn,\n transaction extends Parameters[0] = Parameters[0],\n> = TransactionSerialized>\n\nexport type SignTransactionErrorType =\n | Keccak256ErrorType\n | SignErrorType\n | ErrorType\n\nexport async function signTransaction<\n serializer extends\n SerializeTransactionFn = SerializeTransactionFn,\n transaction extends Parameters[0] = Parameters[0],\n>(\n parameters: SignTransactionParameters,\n): Promise> {\n const {\n privateKey,\n transaction,\n serializer = serializeTransaction,\n } = parameters\n\n const signableTransaction = (() => {\n // For EIP-4844 Transactions, we want to sign the transaction payload body (tx_payload_body) without the sidecars (ie. without the network wrapper).\n // See: https://github.com/ethereum/EIPs/blob/e00f4daa66bd56e2dbd5f1d36d09fd613811a48b/EIPS/eip-4844.md#networking\n if (transaction.type === 'eip4844')\n return {\n ...transaction,\n sidecars: false,\n }\n return transaction\n })()\n\n const signature = await sign({\n hash: keccak256(await serializer(signableTransaction)),\n privateKey,\n })\n return (await serializer(\n transaction,\n signature,\n )) as SignTransactionReturnType\n}\n","import type { TypedData } from 'abitype'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TypedDataDefinition } from '../../types/typedData.js'\nimport {\n type HashTypedDataErrorType,\n hashTypedData,\n} from '../../utils/signature/hashTypedData.js'\nimport { type SignErrorType, sign } from './sign.js'\n\nexport type SignTypedDataParameters<\n typedData extends TypedData | Record = TypedData,\n primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n> = TypedDataDefinition & {\n /** The private key to sign with. */\n privateKey: Hex\n}\n\nexport type SignTypedDataReturnType = Hex\n\nexport type SignTypedDataErrorType =\n | HashTypedDataErrorType\n | SignErrorType\n | ErrorType\n\n/**\n * @description Signs typed data and calculates an Ethereum-specific signature in [https://eips.ethereum.org/EIPS/eip-712](https://eips.ethereum.org/EIPS/eip-712):\n * `sign(keccak256(\"\\x19\\x01\" ‖ domainSeparator ‖ hashStruct(message)))`.\n *\n * @returns The signature.\n */\nexport async function signTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(\n parameters: SignTypedDataParameters,\n): Promise {\n const { privateKey, ...typedData } =\n parameters as unknown as SignTypedDataParameters\n return await sign({\n hash: hashTypedData(typedData),\n privateKey,\n to: 'hex',\n })\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Hex } from '../types/misc.js'\nimport { type ToHexErrorType, toHex } from '../utils/encoding/toHex.js'\nimport type { NonceManager } from '../utils/nonceManager.js'\nimport { type ToAccountErrorType, toAccount } from './toAccount.js'\nimport type { PrivateKeyAccount } from './types.js'\nimport {\n type PublicKeyToAddressErrorType,\n publicKeyToAddress,\n} from './utils/publicKeyToAddress.js'\nimport { type SignErrorType, sign } from './utils/sign.js'\nimport { signAuthorization } from './utils/signAuthorization.js'\nimport { type SignMessageErrorType, signMessage } from './utils/signMessage.js'\nimport {\n type SignTransactionErrorType,\n signTransaction,\n} from './utils/signTransaction.js'\nimport {\n type SignTypedDataErrorType,\n signTypedData,\n} from './utils/signTypedData.js'\n\nexport type PrivateKeyToAccountOptions = {\n nonceManager?: NonceManager | undefined\n}\n\nexport type PrivateKeyToAccountErrorType =\n | ToAccountErrorType\n | ToHexErrorType\n | PublicKeyToAddressErrorType\n | SignErrorType\n | SignMessageErrorType\n | SignTransactionErrorType\n | SignTypedDataErrorType\n | ErrorType\n\n/**\n * @description Creates an Account from a private key.\n *\n * @returns A Private Key Account.\n */\nexport function privateKeyToAccount(\n privateKey: Hex,\n options: PrivateKeyToAccountOptions = {},\n): PrivateKeyAccount {\n const { nonceManager } = options\n const publicKey = toHex(secp256k1.getPublicKey(privateKey.slice(2), false))\n const address = publicKeyToAddress(publicKey)\n\n const account = toAccount({\n address,\n nonceManager,\n async sign({ hash }) {\n return sign({ hash, privateKey, to: 'hex' })\n },\n async signAuthorization(authorization) {\n return signAuthorization({ ...authorization, privateKey })\n },\n async signMessage({ message }) {\n return signMessage({ message, privateKey })\n },\n async signTransaction(transaction, { serializer } = {}) {\n return signTransaction({ privateKey, transaction, serializer })\n },\n async signTypedData(typedData) {\n return signTypedData({ ...typedData, privateKey } as any)\n },\n })\n\n return {\n ...account,\n publicKey,\n source: 'privateKey',\n } as PrivateKeyAccount\n}\n","export const wordlist = `abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo`.split('\\n');\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport { HDKey } from '@scure/bip32'\nexport type { Address } from 'abitype'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from '../utils/nonceManager.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeSignatureErrorType as SignatureToHexErrorType,\n type SerializeSignatureErrorType,\n /** @deprecated Use `serializeSignature` instead. */\n serializeSignature as signatureToHex,\n serializeSignature,\n} from '../utils/signature/serializeSignature.js'\nexport {\n type GenerateMnemonicErrorType,\n generateMnemonic,\n} from './generateMnemonic.js'\nexport {\n type GeneratePrivateKeyErrorType,\n generatePrivateKey,\n} from './generatePrivateKey.js'\nexport {\n type HDKeyToAccountErrorType,\n type HDKeyToAccountOptions,\n hdKeyToAccount,\n} from './hdKeyToAccount.js'\nexport {\n type MnemonicToAccountErrorType,\n type MnemonicToAccountOptions,\n mnemonicToAccount,\n} from './mnemonicToAccount.js'\nexport {\n type PrivateKeyToAccountErrorType,\n type PrivateKeyToAccountOptions,\n privateKeyToAccount,\n} from './privateKeyToAccount.js'\nexport { type ToAccountErrorType, toAccount } from './toAccount.js'\nexport type {\n Account,\n AccountSource,\n CustomSource,\n HDAccount,\n HDOptions,\n JsonRpcAccount,\n LocalAccount,\n PrivateKeyAccount,\n} from './types.js'\nexport {\n type ParseAccountErrorType,\n parseAccount,\n} from './utils/parseAccount.js'\nexport {\n type PrivateKeyToAddressErrorType,\n privateKeyToAddress,\n} from './utils/privateKeyToAddress.js'\nexport {\n type PublicKeyToAddressErrorType,\n publicKeyToAddress,\n} from './utils/publicKeyToAddress.js'\nexport {\n type SignErrorType,\n type SignParameters,\n type SignReturnType,\n setSignEntropy,\n sign,\n} from './utils/sign.js'\nexport {\n type SignAuthorizationErrorType,\n type SignAuthorizationParameters,\n type SignAuthorizationReturnType,\n signAuthorization,\n} from './utils/signAuthorization.js'\nexport {\n type SignMessageErrorType,\n type SignMessageParameters,\n type SignMessageReturnType,\n signMessage,\n} from './utils/signMessage.js'\nexport {\n type SignTransactionErrorType,\n type SignTransactionParameters,\n type SignTransactionReturnType,\n signTransaction,\n} from './utils/signTransaction.js'\nexport {\n type SignTypedDataErrorType,\n type SignTypedDataParameters,\n type SignTypedDataReturnType,\n signTypedData,\n} from './utils/signTypedData.js'\nexport {\n czech,\n english,\n french,\n italian,\n japanese,\n korean,\n portuguese,\n simplifiedChinese,\n spanish,\n traditionalChinese,\n} from './wordlists.js'\n","/**\n * Scanner-safe file reading utilities.\n *\n * Uses open() + read() to avoid false positives from openclaw's\n * potential-exfiltration heuristic in bundled output.\n */\n\nimport { open } from \"node:fs/promises\";\nimport { openSync, readSync, closeSync, fstatSync } from \"node:fs\";\n\n/** Read file contents as UTF-8 string (async). */\nexport async function readTextFile(filePath: string): Promise {\n const fh = await open(filePath, \"r\");\n try {\n const size = (await fh.stat()).size;\n const buf = Buffer.alloc(size);\n let offset = 0;\n while (offset < size) {\n const { bytesRead } = await fh.read(buf, offset, size - offset, offset);\n if (bytesRead === 0) break;\n offset += bytesRead;\n }\n return buf.subarray(0, offset).toString(\"utf-8\");\n } finally {\n await fh.close();\n }\n}\n\n/** Read file contents as UTF-8 string (sync). */\nexport function readTextFileSync(filePath: string): string {\n const fd = openSync(filePath, \"r\");\n try {\n const size = fstatSync(fd).size;\n const buf = Buffer.alloc(size);\n let offset = 0;\n while (offset < size) {\n const bytesRead = readSync(fd, buf, offset, size - offset, offset);\n if (bytesRead === 0) break;\n offset += bytesRead;\n }\n return buf.subarray(0, offset).toString(\"utf-8\");\n } finally {\n closeSync(fd);\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 => {};\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 {\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(\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 {\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> = Hash & {\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 = 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 = Hash, 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 = HashXOF, Opts = undefined> = CHash;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher, Opts = undefined>(\n hashCons: HasherCons,\n info: HashInfo = {}\n): CHash {\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 => ({\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> implements Hash {\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> extends HashMD {\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> extends HashMD {\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","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n anumber,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type CHash = {\n (message: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array) => Uint8Array;\nexport function abool(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// Used in weierstrass, der\nfunction abignumber(n: number | bigint) {\n if (typeof n === 'bigint') {\n if (!isPosBig(n)) throw new Error('positive bigint expected, got ' + n);\n } else anumber(n);\n return n;\n}\n\nexport function asafenumber(value: number, title: string = ''): void {\n if (!Number.isSafeInteger(value)) {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected safe integer, got type=' + typeof value);\n }\n}\n\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = abignumber(num).toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(copyBytes(abytes_(bytes)).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n anumber(len);\n n = abignumber(n);\n const res = hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n if (res.length !== len) throw new Error('number too large');\n return res;\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(abignumber(n)));\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as `TextEncoder` for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, message: Uint8Array) => Uint8Array\n): (seed: Uint8Array, predicate: Pred) => T {\n anumber(hashLen, 'hashLen');\n anumber(qByteLen, 'qByteLen');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n const u8n = (len: number): Uint8Array => new Uint8Array(len); // creates Uint8Array\n const NULL = Uint8Array.of();\n const byte0 = Uint8Array.of(0x00);\n const byte1 = Uint8Array.of(0x01);\n const _maxDrbgIters = 1000;\n\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...msgs: Uint8Array[]) => hmacFn(k, concatBytes_(v, ...msgs)); // hmac(k)(v, ...values)\n const reseed = (seed: Uint8Array = NULL) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(byte0, seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(byte1, seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= _maxDrbgIters) throw new Error('drbg: tried max amount of iterations');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\nexport function validateObject(\n object: Record,\n fields: Record = {},\n optFields: Record = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f: typeof fields, isOpt: boolean) =>\n Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n\nexport interface CryptoKeys {\n lengths: { seed?: number; public?: number; secret?: number };\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n}\n\n/** Generic interface for signatures. Has keygen, sign and verify. */\nexport interface Signer extends CryptoKeys {\n // Interfaces are fun. We cannot just add new fields without copying old ones.\n lengths: {\n seed?: number;\n public?: number;\n secret?: number;\n signRand?: number;\n signature?: number;\n };\n sign: (msg: Uint8Array, secretKey: Uint8Array) => Uint8Array;\n verify: (sig: Uint8Array, msg: Uint8Array, publicKey: Uint8Array) => boolean;\n}\n","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes,\n anumber,\n bytesToNumberBE,\n bytesToNumberLE,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from '../utils.ts';\n\n// Numbers aren't used in x25519 / x448 builds\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = /* @__PURE__ */ BigInt(1), _2n = /* @__PURE__ */ BigInt(2);\n// prettier-ignore\nconst _3n = /* @__PURE__ */ BigInt(3), _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);\n// prettier-ignore\nconst _7n = /* @__PURE__ */ BigInt(7), _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9);\nconst _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare(Fp: IField, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp: IField, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8(Fp: IField, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): (Fp: IField, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return (Fp: IField, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): (Fp: IField, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp: IField, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): (Fp: IField, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField {\n ORDER: bigint;\n BYTES: number;\n BITS: number;\n isLE: boolean;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField(field: IField): IField {\n const initial = {\n ORDER: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp: IField, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp: IField, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv(Fp: IField, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp: IField, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp: IField, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField & Required, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n isLE: boolean;\n BITS: number;\n sqrt: SqrtFn;\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n}>;\nclass _Field implements IField {\n readonly ORDER: bigint;\n readonly BITS: number;\n readonly BYTES: number;\n readonly isLE: boolean;\n readonly ZERO = _0n;\n readonly ONE = _1n;\n readonly _lengths?: number[];\n private _sqrt: ReturnType | undefined; // cached sqrt\n private readonly _mod?: boolean;\n constructor(ORDER: bigint, opts: FieldOpts = {}) {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n this.isLE = false;\n if (opts != null && typeof opts === 'object') {\n if (typeof opts.BITS === 'number') _nbitLength = opts.BITS;\n if (typeof opts.sqrt === 'function') this.sqrt = opts.sqrt;\n if (typeof opts.isLE === 'boolean') this.isLE = opts.isLE;\n if (opts.allowedLengths) this._lengths = opts.allowedLengths?.slice();\n if (typeof opts.modFromBytes === 'boolean') this._mod = opts.modFromBytes;\n }\n const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength);\n if (nByteLength > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n this.ORDER = ORDER;\n this.BITS = nBitLength;\n this.BYTES = nByteLength;\n this._sqrt = undefined;\n Object.preventExtensions(this);\n }\n\n create(num: bigint) {\n return mod(num, this.ORDER);\n }\n isValid(num: bigint) {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < this.ORDER; // 0 is valid element, but it's not invertible\n }\n is0(num: bigint) {\n return num === _0n;\n }\n // is valid and invertible\n isValidNot0(num: bigint) {\n return !this.is0(num) && this.isValid(num);\n }\n isOdd(num: bigint) {\n return (num & _1n) === _1n;\n }\n neg(num: bigint) {\n return mod(-num, this.ORDER);\n }\n eql(lhs: bigint, rhs: bigint) {\n return lhs === rhs;\n }\n\n sqr(num: bigint) {\n return mod(num * num, this.ORDER);\n }\n add(lhs: bigint, rhs: bigint) {\n return mod(lhs + rhs, this.ORDER);\n }\n sub(lhs: bigint, rhs: bigint) {\n return mod(lhs - rhs, this.ORDER);\n }\n mul(lhs: bigint, rhs: bigint) {\n return mod(lhs * rhs, this.ORDER);\n }\n pow(num: bigint, power: bigint): bigint {\n return FpPow(this, num, power);\n }\n div(lhs: bigint, rhs: bigint) {\n return mod(lhs * invert(rhs, this.ORDER), this.ORDER);\n }\n\n // Same as above, but doesn't normalize\n sqrN(num: bigint) {\n return num * num;\n }\n addN(lhs: bigint, rhs: bigint) {\n return lhs + rhs;\n }\n subN(lhs: bigint, rhs: bigint) {\n return lhs - rhs;\n }\n mulN(lhs: bigint, rhs: bigint) {\n return lhs * rhs;\n }\n\n inv(num: bigint) {\n return invert(num, this.ORDER);\n }\n sqrt(num: bigint): bigint {\n // Caching _sqrt speeds up sqrt9mod16 by 5x and tonneli-shanks by 10%\n if (!this._sqrt) this._sqrt = FpSqrt(this.ORDER);\n return this._sqrt(this, num);\n }\n toBytes(num: bigint) {\n return this.isLE ? numberToBytesLE(num, this.BYTES) : numberToBytesBE(num, this.BYTES);\n }\n fromBytes(bytes: Uint8Array, skipValidation = false) {\n abytes(bytes);\n const { _lengths: allowedLengths, BYTES, isLE, ORDER, _mod: modFromBytes } = this;\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!this.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n }\n // TODO: we don't need it here, move out to separate fn\n invertBatch(lst: bigint[]): bigint[] {\n return FpInvertBatch(this, lst);\n }\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov(a: bigint, b: bigint, condition: boolean) {\n return condition ? b : a;\n }\n}\n\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER: bigint, opts: FieldOpts = {}): Readonly {\n return new _Field(ORDER, opts);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.Point.Fn.ORDER)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n abytes(key);\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, type Signer } from '../utils.ts';\nimport { Field, FpInvertBatch, validateField, type IField } from './modular.ts';\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type AffinePoint = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons

> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint': it won't be accesible for arguments/return types\n// * `CurvePointCons

>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint.\n// this means we need to do stuff like\n// `function test

, PC extends CurvePointCons

>(`\n// if we want type safety around P, otherwise PC_P will be any\n\n/** Returns Fp type from Point (P_F

== P.F) */\nexport type P_F

> = P extends CurvePoint ? F : never;\n/** Returns Fp type from PointCons (PC_F == PC.P.F) */\nexport type PC_F>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P == PC.P) */\nexport type PC_P>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons>`, will return `any` after 1 operation\n// * `CurvePointCons: WeierstrassPointCons extends CurvePointCons = false`\n// * `P extends CurvePoint, PC extends CurvePointCons

`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\n\nexport type Mapper = (i: T[]) => T[];\n\nexport function negateCt T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ

, PC extends CurvePointCons

>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\ntype WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF {\n private readonly BASE: PC_P;\n private readonly ZERO: PC_P;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P, n: bigint, p: PC_P = this.ZERO): PC_P {\n let d: PC_P = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P, W: number): PC_P[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P[] = [];\n let p: PC_P = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P[], n: bigint): { p: PC_P; f: PC_P } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P[],\n n: bigint,\n acc: PC_P = this.ZERO\n ): PC_P {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P, transform?: Mapper>): PC_P[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P,\n scalar: bigint,\n transform?: Mapper>\n ): { p: PC_P; f: PC_P } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P, scalar: bigint, transform?: Mapper>, prev?: PC_P): PC_P {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe

, PC extends CurvePointCons

>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger

, PC extends CurvePointCons

>(\n c: PC,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n const fieldN = c.Fn;\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe

, PC extends CurvePointCons

>(\n c: PC,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n const fieldN = c.Fn;\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\nexport type ValidCurveParams = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField(order: bigint, field?: IField, isLE?: boolean): IField {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField;\n }\n}\nexport type FpFn = { Fp: IField; Fn: IField };\n\n/** Validates CURVE opts and creates fields */\nexport function createCurveFields(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams,\n curveOpts: Partial> = {},\n FpFnLE?: boolean\n): FpFn & { CURVE: ValidCurveParams } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n\ntype KeygenFn = (\n seed?: Uint8Array,\n isCompressed?: boolean\n) => { secretKey: Uint8Array; publicKey: Uint8Array };\nexport function createKeygen(\n randomSecretKey: Function,\n getPublicKey: Signer['getPublicKey']\n): KeygenFn {\n return function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n };\n}\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC> implements Hash<_HMAC> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC): _HMAC {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC(hash, key);\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils.js';\nimport {\n abool,\n abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n hexToBytes,\n isBytes,\n memoized,\n numberToHexUnpadded,\n validateObject,\n randomBytes as wcRandomBytes,\n type CHash,\n type Signer,\n} from '../utils.ts';\nimport {\n createCurveFields,\n createKeygen,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n wNAF,\n type AffinePoint,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n validateField,\n type IField,\n} from './modular.ts';\n\nexport type { AffinePoint };\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\n/**\n * Option to enable hedged signatures with improved security.\n *\n * * Randomly generated k is bad, because broken CSPRNG would leak private keys.\n * * Deterministic k (RFC6979) is better; but is suspectible to fault attacks.\n *\n * We allow using technique described in RFC6979 3.6: additional k', a.k.a. adding randomness\n * to deterministic sig. If CSPRNG is broken & randomness is weak, it would STILL be as secure\n * as ordinary sig without ExtraEntropy.\n *\n * * `true` means \"fetch data, from CSPRNG, incorporate it into k generation\"\n * * `false` means \"disable extra entropy, use purely deterministic k\"\n * * `Uint8Array` passed means \"incorporate following data into k generation\"\n *\n * https://paulmillr.com/posts/deterministic-signatures/\n */\nexport type ECDSAExtraEntropy = boolean | Uint8Array;\n/**\n * - `compact` is the default format\n * - `recovered` is the same as compact, but with an extra byte indicating recovery byte\n * - `der` is ASN.1 DER encoding\n */\nexport type ECDSASignatureFormat = 'compact' | 'recovered' | 'der';\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n */\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n */\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n * - `extraEntropy`: (default: false) creates sigs with increased security, see {@link ECDSAExtraEntropy}\n */\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n extraEntropy?: ECDSAExtraEntropy;\n};\n\nfunction validateSigFormat(format: string): ECDSASignatureFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASignatureFormat;\n}\n\nfunction validateSigOpts>(\n opts: T,\n def: D\n): Required {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint extends CurvePoint> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons extends CurvePointCons> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint;\n CURVE(): WeierstrassOpts;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\nexport type WeierstrassExtraOpts = Partial<{\n Fp: IField;\n Fn: IField;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons, point: WeierstrassPoint) => boolean;\n clearCofactor: (c: WeierstrassPointCons, point: WeierstrassPoint) => WeierstrassPoint;\n fromBytes: (bytes: Uint8Array) => AffinePoint;\n toBytes: (\n c: WeierstrassPointCons,\n point: WeierstrassPoint,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: (key: Uint8Array, message: Uint8Array) => Uint8Array;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed?: boolean\n ) => Uint8Array;\n Point: WeierstrassPointCons;\n utils: {\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Uint8Array, secretKey: Uint8Array, opts?: ECDSASignOpts) => Uint8Array;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(bytes: Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = abytes(bytes, undefined, 'signature');\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * See {@link WeierstrassOpts}.\n *\n * @example\n```js\nconst opts = {\n p: 0xfffffffffffffffffffffffffffffffeffffac73n,\n n: 0x100000000000000000001b8fa16dfab9aca16b6b3n,\n h: 1n,\n a: 0n,\n b: 7n,\n Gx: 0x3b4c382ce37aa192a4019e763036f4f5dd4d7ebbn,\n Gy: 0x938cf935318fdced6bc28286531733c3f03c4feen,\n};\nconst secp160k1_Point = weierstrass(opts);\n```\n */\nexport function weierstrass(\n params: WeierstrassOpts,\n extraOpts: WeierstrassExtraOpts = {}\n): WeierstrassPointCons {\n const validated = createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons,\n point: WeierstrassPoint,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const evenY = Fp.isOdd!(y);\n const evenH = (head & 1) === 1; // ECDSA-specific\n if (evenH !== evenY) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('Weierstrass Point expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n\n static fromHex(hex: string): Point {\n return Point.fromBytes(hexToBytes(hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO; // 0\n if (sc === _1n) return p; // 1\n if (wnaf.hasCache(this)) return this.multiply(sc); // precomputes\n // We don't have method for double scalar multiplication (aP + bQ):\n // Even with using Strauss-Shamir trick, it's 35% slower than naïve mul+add.\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return ``;\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASignature & { readonly recovery: number };\n hasHighS(): boolean;\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n}\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASignatureFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASignatureFormat): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(\n Fp: IField,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(\n Fp: IField,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths(Fp: IField, Fn: IField) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || wcRandomBytes;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: Uint8Array) {\n try {\n const num = Fn.fromBytes(secretKey);\n return Fn.isValidNot0(num);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: Uint8Array, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(Fn.fromBytes(secretKey)).toBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: Uint8Array): boolean | undefined {\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (!isBytes(item)) return undefined;\n if (('_lengths' in Fn && Fn._lengths) || secretKey === publicKey) return undefined;\n const l = abytes(item, undefined, 'key').length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed = true\n ): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = Fn.fromBytes(secretKeyA);\n const b = Point.fromBytes(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n };\n const keygen = createKeygen(randomSecretKey, getPublicKey);\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n *\n * @param Point created using {@link weierstrass} function\n * @param hash used for 1) message prehash-ing 2) k generation in `sign`, using hmac_drbg(hash)\n * @param ecdsaOpts rarely needed, see {@link ECDSAOpts}\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n ecdsaOpts = Object.assign({}, ecdsaOpts);\n const randomBytes = ecdsaOpts.randomBytes || wcRandomBytes;\n const hmac = ecdsaOpts.hmac || ((key, msg) => nobleHmac(hash, key, msg));\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required = {\n prehash: true,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : true,\n format: 'compact' as ECDSASignatureFormat,\n extraEntropy: false,\n };\n const hasLargeCofactor = CURVE_ORDER * _2n < Fp.ORDER; // Won't CURVE().h > 2n be more effective?\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function assertSmallCofactor(): void {\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n if (hasLargeCofactor)\n throw new Error('\"recovered\" sig type is not supported for cofactor >2 curves');\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASignatureFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) {\n assertSmallCofactor();\n if (![0, 1, 2, 3].includes(recovery)) throw new Error('invalid recovery id');\n this.recovery = recovery;\n }\n Object.freeze(this);\n }\n\n static fromBytes(\n bytes: Uint8Array,\n format: ECDSASignatureFormat = defaultSigOpts.format\n ): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = lengths.signature! / 2;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASignatureFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n private assertRecovery(): number {\n const { recovery } = this;\n if (recovery == null) throw new Error('invalid recovery id: must be present');\n return recovery;\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint {\n const { r, s } = this;\n const recovery = this.assertRecovery();\n const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('invalid recovery id: sig.r+curve.n != R.x');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((recovery & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(abytes(messageHash, undefined, 'msgHash')); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('invalid recovery: point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASignatureFormat = defaultSigOpts.format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const { r, s } = this;\n const rb = Fn.toBytes(r);\n const sb = Fn.toBytes(s);\n if (format === 'recovered') {\n assertSmallCofactor();\n return concatBytes(Uint8Array.of(this.assertRecovery()), rb, sb);\n }\n return concatBytes(rb, sb);\n }\n\n toHex(format?: ECDSASignatureFormat) {\n return bytesToHex(this.toBytes(format));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts) {\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = Fn.fromBytes(secretKey); // validate secret key, convert to bigint\n if (!Fn.isValidNot0(d)) throw new Error('invalid private key');\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(abytes(e, undefined, 'extraEntropy')); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): Signature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // s = k^-1(m + rd) mod n\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3 when q.x>n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always in the bottom half of N\n recovery ^= 1;\n }\n return new Signature(r, normS, hasLargeCofactor ? undefined : recovery);\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts = {}): Uint8Array {\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig.toBytes(opts.format);\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = abytes(publicKey, undefined, 'publicKey');\n message = validateMsgAndHash(message, prehash);\n if (!isBytes(signature as any)) {\n const end = signature instanceof Signature ? ', use sig.toBytes()' : '';\n throw new Error('verify expects Uint8Array signature' + end);\n }\n validateSigLength(signature, format); // execute this twice because we want loud error\n try {\n const sig = Signature.fromBytes(signature, format);\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n }) satisfies Signer;\n}\n","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createKeygen, type CurveLengths } from './abstract/curve.ts';\nimport { createHasher, type H2CHasher, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, pow2 } from './abstract/modular.ts';\nimport {\n type ECDSA,\n ecdsa,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n weierstrass,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport { abytes, asciiToBytes, bytesToNumberBE, concatBytes } from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Pointk1.BASE.multiply(Pointk1.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\nconst Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {\n Fp: Fpk1,\n endo: secp256k1_ENDO,\n});\n\n/**\n * secp256k1 curve: ECDSA and ECDH methods.\n *\n * Uses sha256 to hash messages. To use a different hash,\n * pass `{ prehash: false }` to sign / verify.\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * // const publicKey = secp256k1.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey);\n * // const sigKeccak = secp256k1.sign(keccak256(msg), secretKey, { prehash: false });\n * ```\n */\nexport const secp256k1: ECDSA = /* @__PURE__ */ ecdsa(Pointk1, sha256);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(asciiToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType) => point.toBytes(true).slice(1);\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: Uint8Array) {\n const { Fn, BASE } = Pointk1;\n const d_ = Fn.fromBytes(priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Uint8Array): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Uint8Array,\n secretKey: Uint8Array,\n auxRand: Uint8Array = randomBytes(32)\n): Uint8Array {\n const { Fn } = Pointk1;\n const m = abytes(message, undefined, 'message');\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = abytes(auxRand, 32, 'auxRand'); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): boolean {\n const { Fp, Fn, BASE } = Pointk1;\n const sig = abytes(signature, 64, 'signature');\n const m = abytes(message, undefined, 'message');\n const pub = abytes(publicKey, 32, 'publicKey');\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!Fp.isValidNot0(r)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!Fn.isValidNot0(s)) return false;\n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n return {\n keygen: createKeygen(randomSecretKey, schnorrGetPublicKey),\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey,\n taggedHash,\n lift_x,\n pointToBytes,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher> = /* @__PURE__ */ (() =>\n createHasher(\n Pointk1,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\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 => {};\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 {\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(\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 {\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> = Hash & {\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 = 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 = Hash, 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 = HashXOF, Opts = undefined> = CHash;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher, Opts = undefined>(\n hashCons: HasherCons,\n info: HashInfo = {}\n): CHash {\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 => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC> implements Hash<_HMAC> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC): _HMAC {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC(hash, key);\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> implements Hash {\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\nSHA1 (RFC 3174), MD5 (RFC 1321) and RIPEMD160 (RFC 2286) legacy, weak hash functions.\nDon't use them in a new protocol. What \"weak\" means:\n\n- Collisions can be made with 2^18 effort in MD5, 2^60 in SHA1, 2^80 in RIPEMD160.\n- No practical pre-image attacks (only theoretical, 2^123.4)\n- HMAC seems kinda ok: https://www.rfc-editor.org/rfc/rfc6151\n * @module\n */\nimport { Chi, HashMD, Maj } from './_md.ts';\nimport { type CHash, clean, createHasher, rotl } from './utils.ts';\n\n/** Initial SHA1 state */\nconst SHA1_IV = /* @__PURE__ */ Uint32Array.from([\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0,\n]);\n\n// Reusable temporary buffer\nconst SHA1_W = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal SHA1 legacy hash class. */\nexport class _SHA1 extends HashMD<_SHA1> {\n private A = SHA1_IV[0] | 0;\n private B = SHA1_IV[1] | 0;\n private C = SHA1_IV[2] | 0;\n private D = SHA1_IV[3] | 0;\n private E = SHA1_IV[4] | 0;\n\n constructor() {\n super(64, 20, 8, false);\n }\n protected get(): [number, number, number, number, number] {\n const { A, B, C, D, E } = this;\n return [A, B, C, D, E];\n }\n protected set(A: number, B: number, C: number, D: number, E: number): 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 }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) SHA1_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 80; i++)\n SHA1_W[i] = rotl(SHA1_W[i - 3] ^ SHA1_W[i - 8] ^ SHA1_W[i - 14] ^ SHA1_W[i - 16], 1);\n // Compression function main loop, 80 rounds\n let { A, B, C, D, E } = this;\n for (let i = 0; i < 80; i++) {\n let F, K;\n if (i < 20) {\n F = Chi(B, C, D);\n K = 0x5a827999;\n } else if (i < 40) {\n F = B ^ C ^ D;\n K = 0x6ed9eba1;\n } else if (i < 60) {\n F = Maj(B, C, D);\n K = 0x8f1bbcdc;\n } else {\n F = B ^ C ^ D;\n K = 0xca62c1d6;\n }\n const T = (rotl(A, 5) + F + E + K + SHA1_W[i]) | 0;\n E = D;\n D = C;\n C = rotl(B, 30);\n B = A;\n A = T;\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 this.set(A, B, C, D, E);\n }\n protected roundClean(): void {\n clean(SHA1_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** SHA1 (RFC 3174) legacy hash function. It was cryptographically broken. */\nexport const sha1: CHash = /* @__PURE__ */ createHasher(() => new _SHA1());\n\n/** Per-round constants */\nconst p32 = /* @__PURE__ */ Math.pow(2, 32);\nconst K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i) =>\n Math.floor(p32 * Math.abs(Math.sin(i + 1)))\n);\n\n/** md5 initial state: same as sha1, but 4 u32 instead of 5. */\nconst MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);\n\n// Reusable temporary buffer\nconst MD5_W = /* @__PURE__ */ new Uint32Array(16);\n/** Internal MD5 legacy hash class. */\nexport class _MD5 extends HashMD<_MD5> {\n private A = MD5_IV[0] | 0;\n private B = MD5_IV[1] | 0;\n private C = MD5_IV[2] | 0;\n private D = MD5_IV[3] | 0;\n\n constructor() {\n super(64, 16, 8, true);\n }\n protected get(): [number, number, number, number] {\n const { A, B, C, D } = this;\n return [A, B, C, D];\n }\n protected set(A: number, B: number, C: number, D: number): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) MD5_W[i] = view.getUint32(offset, true);\n // Compression function main loop, 64 rounds\n let { A, B, C, D } = this;\n for (let i = 0; i < 64; i++) {\n let F, g, s;\n if (i < 16) {\n F = Chi(B, C, D);\n g = i;\n s = [7, 12, 17, 22];\n } else if (i < 32) {\n F = Chi(D, B, C);\n g = (5 * i + 1) % 16;\n s = [5, 9, 14, 20];\n } else if (i < 48) {\n F = B ^ C ^ D;\n g = (3 * i + 5) % 16;\n s = [4, 11, 16, 23];\n } else {\n F = C ^ (B | ~D);\n g = (7 * i) % 16;\n s = [6, 10, 15, 21];\n }\n F = F + A + K[i] + MD5_W[g];\n A = D;\n D = C;\n C = B;\n B = B + rotl(F, s[i % 4]);\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 this.set(A, B, C, D);\n }\n protected roundClean(): void {\n clean(MD5_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/**\n * MD5 (RFC 1321) legacy hash function. It was cryptographically broken.\n * MD5 architecture is similar to SHA1, with some differences:\n * - Reduced output length: 16 bytes (128 bit) instead of 20\n * - 64 rounds, instead of 80\n * - Little-endian: could be faster, but will require more code\n * - Non-linear index selection: huge speed-up for unroll\n * - Per round constants: more memory accesses, additional speed-up for unroll\n */\nexport const md5: CHash = /* @__PURE__ */ createHasher(() => new _MD5());\n\n// RIPEMD-160\n\nconst Rho160 = /* @__PURE__ */ Uint8Array.from([\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n]);\nconst Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))();\nconst Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))();\nconst idxLR = /* @__PURE__ */ (() => {\n const L = [Id160];\n const R = [Pi160];\n const res = [L, R];\n for (let i = 0; i < 4; i++) for (let j of res) j.push(j[i].map((k) => Rho160[k]));\n return res;\n})();\nconst idxL = /* @__PURE__ */ (() => idxLR[0])();\nconst idxR = /* @__PURE__ */ (() => idxLR[1])();\n// const [idxL, idxR] = idxLR;\n\nconst shifts160 = /* @__PURE__ */ [\n [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],\n [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7],\n [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9],\n [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6],\n [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5],\n].map((i) => Uint8Array.from(i));\nconst shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst Kl160 = /* @__PURE__ */ Uint32Array.from([\n 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e,\n]);\nconst Kr160 = /* @__PURE__ */ Uint32Array.from([\n 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000,\n]);\n// It's called f() in spec.\nfunction ripemd_f(group: number, x: number, y: number, z: number): number {\n if (group === 0) return x ^ y ^ z;\n if (group === 1) return (x & y) | (~x & z);\n if (group === 2) return (x | ~y) ^ z;\n if (group === 3) return (x & z) | (y & ~z);\n return x ^ (y | ~z);\n}\n// Reusable temporary buffer\nconst BUF_160 = /* @__PURE__ */ new Uint32Array(16);\nexport class _RIPEMD160 extends HashMD<_RIPEMD160> {\n private h0 = 0x67452301 | 0;\n private h1 = 0xefcdab89 | 0;\n private h2 = 0x98badcfe | 0;\n private h3 = 0x10325476 | 0;\n private h4 = 0xc3d2e1f0 | 0;\n\n constructor() {\n super(64, 20, 8, true);\n }\n protected get(): [number, number, number, number, number] {\n const { h0, h1, h2, h3, h4 } = this;\n return [h0, h1, h2, h3, h4];\n }\n protected set(h0: number, h1: number, h2: number, h3: number, h4: number): void {\n this.h0 = h0 | 0;\n this.h1 = h1 | 0;\n this.h2 = h2 | 0;\n this.h3 = h3 | 0;\n this.h4 = h4 | 0;\n }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) BUF_160[i] = view.getUint32(offset, true);\n // prettier-ignore\n let al = this.h0 | 0, ar = al,\n bl = this.h1 | 0, br = bl,\n cl = this.h2 | 0, cr = cl,\n dl = this.h3 | 0, dr = dl,\n el = this.h4 | 0, er = el;\n\n // Instead of iterating 0 to 80, we split it into 5 groups\n // And use the groups in constants, functions, etc. Much simpler\n for (let group = 0; group < 5; group++) {\n const rGroup = 4 - group;\n const hbl = Kl160[group], hbr = Kr160[group]; // prettier-ignore\n const rl = idxL[group], rr = idxR[group]; // prettier-ignore\n const sl = shiftsL160[group], sr = shiftsR160[group]; // prettier-ignore\n for (let i = 0; i < 16; i++) {\n const tl = (rotl(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el) | 0;\n al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore\n }\n // 2 loops are 10% faster\n for (let i = 0; i < 16; i++) {\n const tr = (rotl(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er) | 0;\n ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; // prettier-ignore\n }\n }\n // Add the compressed chunk to the current hash value\n this.set(\n (this.h1 + cl + dr) | 0,\n (this.h2 + dl + er) | 0,\n (this.h3 + el + ar) | 0,\n (this.h4 + al + br) | 0,\n (this.h0 + bl + cr) | 0\n );\n }\n protected roundClean(): void {\n clean(BUF_160);\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0);\n }\n}\n\n/**\n * RIPEMD-160 - a legacy hash function from 1990s.\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160.html\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf\n */\nexport const ripemd160: CHash = /* @__PURE__ */ createHasher(() => new _RIPEMD160());\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\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> extends HashMD {\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> extends HashMD {\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","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like , , \ntype Chain = [Coder, ...Coder[]];\n// Extract info from Coder type\ntype Input = F extends Coder ? T : never;\ntype Output = F extends Coder ? T : never;\n// Generic function for arrays\ntype First = T extends [infer U, ...any[]] ? U : never;\ntype Last = T extends [...any[], infer U] ? U : never;\ntype Tail = T extends [any, ...infer U] ? U : never;\n\ntype AsChain> = {\n // C[K] = Coder, Input>\n [K in keyof C]: Coder, Input>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain>(...args: T): Coder>, Output>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn: (val: T) => T): Coder {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes): ReturnType | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase}1${string}`;\n decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase}1${string}`;\n }\n\n function decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","/**\n * BIP32 hierarchical deterministic (HD) wallets over secp256k1.\n * @module\n * @example\n * ```js\n * import { HDKey } from \"@scure/bip32\";\n * const hdkey1 = HDKey.fromMasterSeed(seed);\n * const hdkey2 = HDKey.fromExtendedKey(base58key);\n * const hdkey3 = HDKey.fromJSON({ xpriv: string });\n *\n * // props\n * [hdkey1.depth, hdkey1.index, hdkey1.chainCode];\n * console.log(hdkey2.privateKey, hdkey2.publicKey);\n * console.log(hdkey3.derive(\"m/0/2147483647'/1\"));\n * const sig = hdkey3.sign(hash);\n * hdkey3.verify(hash, sig);\n * ```\n */\n/*! scure-bip32 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { secp256k1 as secp } from '@noble/curves/secp256k1.js';\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { ripemd160 } from '@noble/hashes/legacy.js';\nimport { sha256, sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, concatBytes, createView } from '@noble/hashes/utils.js';\nimport { createBase58check } from '@scure/base';\n\nconst Point = secp.Point;\nconst { Fn } = Point;\nconst base58check = createBase58check(sha256);\n\nconst MASTER_SECRET = Uint8Array.from('Bitcoin seed'.split(''), (char) => char.charCodeAt(0));\n\n/** Network-specific versioning. */\nexport interface Versions {\n private: number;\n public: number;\n}\n\nconst BITCOIN_VERSIONS: Versions = { private: 0x0488ade4, public: 0x0488b21e };\n/** Hardened offset from Bitcoin, default */\nexport const HARDENED_OFFSET: number = 0x80000000;\n\nconst hash160 = (data: Uint8Array) => ripemd160(sha256(data));\nconst fromU32 = (data: Uint8Array) => createView(data).getUint32(0, false);\nconst toU32 = (n: number): Uint8Array => {\n if (!Number.isSafeInteger(n) || n < 0 || n > 2 ** 32 - 1) {\n throw new Error('invalid number, should be from 0 to 2**32-1, got ' + n);\n }\n const buf = new Uint8Array(4);\n createView(buf).setUint32(0, n, false);\n return buf;\n};\n\ninterface HDKeyOpt {\n versions?: Versions;\n depth?: number;\n index?: number;\n parentFingerprint?: number;\n chainCode?: Uint8Array;\n publicKey?: Uint8Array;\n privateKey?: Uint8Array;\n}\n\n/**\n * HDKey from BIP32\n * @example\n```js\nconst hdkey1 = HDKey.fromMasterSeed(seed);\nconst hdkey2 = HDKey.fromExtendedKey(base58key);\nconst hdkey3 = HDKey.fromJSON({ xpriv: string });\n```\n */\nexport class HDKey {\n get fingerprint(): number {\n if (!this.pubHash) {\n throw new Error('No publicKey set!');\n }\n return fromU32(this.pubHash);\n }\n get identifier(): Uint8Array | undefined {\n return this.pubHash;\n }\n get pubKeyHash(): Uint8Array | undefined {\n return this.pubHash;\n }\n get privateKey(): Uint8Array | null {\n return this._privateKey || null;\n }\n get publicKey(): Uint8Array | null {\n return this._publicKey || null;\n }\n get privateExtendedKey(): string {\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('No private key');\n }\n return base58check.encode(\n this.serialize(this.versions.private, concatBytes(Uint8Array.of(0), priv))\n );\n }\n get publicExtendedKey(): string {\n if (!this._publicKey) {\n throw new Error('No public key');\n }\n return base58check.encode(this.serialize(this.versions.public, this._publicKey));\n }\n\n static fromMasterSeed(seed: Uint8Array, versions: Versions = BITCOIN_VERSIONS): HDKey {\n abytes(seed);\n if (8 * seed.length < 128 || 8 * seed.length > 512) {\n throw new Error(\n 'HDKey: seed length must be between 128 and 512 bits; 256 bits is advised, got ' +\n seed.length\n );\n }\n const I = hmac(sha512, MASTER_SECRET, seed);\n const privateKey = I.slice(0, 32);\n const chainCode = I.slice(32);\n return new HDKey({ versions, chainCode, privateKey });\n }\n\n static fromExtendedKey(base58key: string, versions: Versions = BITCOIN_VERSIONS): HDKey {\n // => version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n const keyBuffer: Uint8Array = base58check.decode(base58key);\n const keyView = createView(keyBuffer);\n const version = keyView.getUint32(0, false);\n const opt = {\n versions,\n depth: keyBuffer[4],\n parentFingerprint: keyView.getUint32(5, false),\n index: keyView.getUint32(9, false),\n chainCode: keyBuffer.slice(13, 45),\n };\n const key = keyBuffer.slice(45);\n const isPriv = key[0] === 0;\n if (version !== versions[isPriv ? 'private' : 'public']) {\n throw new Error('Version mismatch');\n }\n if (isPriv) {\n return new HDKey({ ...opt, privateKey: key.slice(1) });\n } else {\n return new HDKey({ ...opt, publicKey: key });\n }\n }\n\n public static fromJSON(json: { xpriv: string }): HDKey {\n return HDKey.fromExtendedKey(json.xpriv);\n }\n readonly versions: Versions;\n readonly depth: number = 0;\n readonly index: number = 0;\n readonly chainCode: Uint8Array | null = null;\n readonly parentFingerprint: number = 0;\n private _privateKey?: Uint8Array;\n private _publicKey?: Uint8Array;\n private pubHash: Uint8Array | undefined;\n\n constructor(opt: HDKeyOpt) {\n if (!opt || typeof opt !== 'object') {\n throw new Error('HDKey.constructor must not be called directly');\n }\n this.versions = opt.versions || BITCOIN_VERSIONS;\n this.depth = opt.depth || 0;\n this.chainCode = opt.chainCode || null;\n this.index = opt.index || 0;\n this.parentFingerprint = opt.parentFingerprint || 0;\n if (!this.depth) {\n if (this.parentFingerprint || this.index) {\n throw new Error('HDKey: zero depth with non-zero index/parent fingerprint');\n }\n }\n if (this.depth > 255) {\n throw new Error('HDKey: depth exceeds the serializable value 255');\n }\n if (opt.publicKey && opt.privateKey) {\n throw new Error('HDKey: publicKey and privateKey at same time.');\n }\n if (opt.privateKey) {\n if (!secp.utils.isValidSecretKey(opt.privateKey)) throw new Error('Invalid private key');\n this._privateKey = opt.privateKey;\n this._publicKey = secp.getPublicKey(opt.privateKey, true);\n } else if (opt.publicKey) {\n this._publicKey = Point.fromBytes(opt.publicKey).toBytes(true); // force compressed point\n } else {\n throw new Error('HDKey: no public or private key provided');\n }\n this.pubHash = hash160(this._publicKey);\n }\n\n derive(path: string): HDKey {\n if (!/^[mM]'?/.test(path)) {\n throw new Error('Path must start with \"m\" or \"M\"');\n }\n if (/^[mM]'?$/.test(path)) {\n return this;\n }\n const parts = path.replace(/^[mM]'?\\//, '').split('/');\n // tslint:disable-next-line\n let child: HDKey = this;\n for (const c of parts) {\n const m = /^(\\d+)('?)$/.exec(c);\n const m1 = m && m[1];\n if (!m || m.length !== 3 || typeof m1 !== 'string')\n throw new Error('invalid child index: ' + c);\n let idx = +m1;\n if (!Number.isSafeInteger(idx) || idx >= HARDENED_OFFSET) {\n throw new Error('Invalid index');\n }\n // hardened key\n if (m[2] === \"'\") {\n idx += HARDENED_OFFSET;\n }\n child = child.deriveChild(idx);\n }\n return child;\n }\n\n deriveChild(index: number): HDKey {\n if (!this._publicKey || !this.chainCode) {\n throw new Error('No publicKey or chainCode set');\n }\n let data = toU32(index);\n if (index >= HARDENED_OFFSET) {\n // Hardened\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('Could not derive hardened child key');\n }\n // Hardened child: 0x00 || ser256(kpar) || ser32(index)\n data = concatBytes(Uint8Array.of(0), priv, data);\n } else {\n // Normal child: serP(point(kpar)) || ser32(index)\n data = concatBytes(this._publicKey, data);\n }\n const I = hmac(sha512, this.chainCode, data);\n const childTweak = I.slice(0, 32);\n const chainCode = I.slice(32);\n if (!secp.utils.isValidSecretKey(childTweak)) {\n throw new Error('Tweak bigger than curve order');\n }\n const opt: HDKeyOpt = {\n versions: this.versions,\n chainCode,\n depth: this.depth + 1,\n parentFingerprint: this.fingerprint,\n index,\n };\n const ctweak = Fn.fromBytes(childTweak);\n try {\n // Private parent key -> private child key\n if (this._privateKey) {\n const added = Fn.create(Fn.fromBytes(this._privateKey) + ctweak);\n if (!Fn.isValidNot0(added)) {\n throw new Error('The tweak was out of range or the resulted private key is invalid');\n }\n opt.privateKey = Fn.toBytes(added);\n } else {\n const added = Point.fromBytes(this._publicKey).add(Point.BASE.multiply(ctweak));\n // Cryptographically impossible: hmac-sha512 preimage would need to be found\n if (added.equals(Point.ZERO)) {\n throw new Error('The tweak was equal to negative P, which made the result key invalid');\n }\n opt.publicKey = added.toBytes(true);\n }\n return new HDKey(opt);\n } catch (err) {\n return this.deriveChild(index + 1);\n }\n }\n\n sign(hash: Uint8Array): Uint8Array {\n if (!this._privateKey) {\n throw new Error('No privateKey set!');\n }\n abytes(hash, 32);\n return secp.sign(hash, this._privateKey, { prehash: false });\n }\n\n verify(hash: Uint8Array, signature: Uint8Array): boolean {\n abytes(hash, 32);\n abytes(signature, 64);\n if (!this._publicKey) {\n throw new Error('No publicKey set!');\n }\n return secp.verify(signature, hash, this._publicKey, { prehash: false });\n }\n\n wipePrivateData(): this {\n if (this._privateKey) {\n this._privateKey.fill(0);\n this._privateKey = undefined;\n }\n return this;\n }\n toJSON(): { xpriv: string; xpub: string } {\n return {\n xpriv: this.privateExtendedKey,\n xpub: this.publicExtendedKey,\n };\n }\n\n private serialize(version: number, key: Uint8Array) {\n if (!this.chainCode) {\n throw new Error('No chainCode set');\n }\n abytes(key, 33);\n // version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n return concatBytes(\n toU32(version),\n new Uint8Array([this.depth]),\n toU32(this.parentFingerprint),\n toU32(this.index),\n this.chainCode,\n key\n );\n }\n}\n","/**\n * To add a new error, follow the instructions at\n * https://github.com/anza-xyz/kit/tree/main/packages/errors/#adding-a-new-error\n *\n * @module\n * @privateRemarks\n * WARNING:\n * - Don't remove error codes\n * - Don't change or reorder error codes.\n *\n * Good naming conventions:\n * - Prefixing common errors — e.g. under the same package — can be a good way to namespace them. E.g. All codec-related errors start with `SOLANA_ERROR__CODECS__`.\n * - Use consistent names — e.g. choose `PDA` or `PROGRAM_DERIVED_ADDRESS` and stick with it. Ensure your names are consistent with existing error codes. The decision might have been made for you.\n * - Recommended prefixes and suffixes:\n * - `MALFORMED_`: Some input was not constructed properly. E.g. `MALFORMED_BASE58_ENCODED_ADDRESS`.\n * - `INVALID_`: Some input is invalid (other than because it was MALFORMED). E.g. `INVALID_NUMBER_OF_BYTES`.\n * - `EXPECTED_`: Some input was different than expected, no need to specify the \"GOT\" part unless necessary. E.g. `EXPECTED_DECODED_ACCOUNT`.\n * - `_CANNOT_`: Some operation cannot be performed or some input cannot be used due to some condition. E.g. `CANNOT_DECODE_EMPTY_BYTE_ARRAY` or `PDA_CANNOT_END_WITH_PDA_MARKER`.\n * - `_MUST_BE_`: Some condition must be true. E.g. `NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE`.\n * - `_FAILED_TO_`: Tried to perform some operation and failed. E.g. `FAILED_TO_DECODE_ACCOUNT`.\n * - `_NOT_FOUND`: Some operation lead to not finding something. E.g. `ACCOUNT_NOT_FOUND`.\n * - `_OUT_OF_RANGE`: Some value is out of range. E.g. `ENUM_DISCRIMINATOR_OUT_OF_RANGE`.\n * - `_EXCEEDED`: Some limit was exceeded. E.g. `PDA_MAX_SEED_LENGTH_EXCEEDED`.\n * - `_MISMATCH`: Some elements do not match. E.g. `ENCODER_DECODER_FIXED_SIZE_MISMATCH`.\n * - `_MISSING`: Some required input is missing. E.g. `TRANSACTION_FEE_PAYER_MISSING`.\n * - `_UNIMPLEMENTED`: Some required component is not available in the environment. E.g. `SUBTLE_CRYPTO_VERIFY_FUNCTION_UNIMPLEMENTED`.\n */\nexport const SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED = 1;\nexport const SOLANA_ERROR__INVALID_NONCE = 2;\nexport const SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND = 3;\nexport const SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE = 4;\nexport const SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH = 5;\nexport const SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE = 6;\nexport const SOLANA_ERROR__MALFORMED_BIGINT_STRING = 7;\nexport const SOLANA_ERROR__MALFORMED_NUMBER_STRING = 8;\nexport const SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE = 9;\nexport const SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR = 10;\n\n// JSON-RPC-related errors.\n// Reserve error codes in the range [-32768, -32000]\n// Keep in sync with https://github.com/anza-xyz/agave/blob/master/rpc-client-api/src/custom_error.rs\nexport const SOLANA_ERROR__JSON_RPC__PARSE_ERROR = -32700;\nexport const SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR = -32603;\nexport const SOLANA_ERROR__JSON_RPC__INVALID_PARAMS = -32602;\nexport const SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND = -32601;\nexport const SOLANA_ERROR__JSON_RPC__INVALID_REQUEST = -32600;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE = -32019;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY = -32018;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE = -32017;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED = -32016;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION = -32015;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET = -32014;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH = -32013;\nexport const SOLANA_ERROR__JSON_RPC__SCAN_ERROR = -32012;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE = -32011;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX = -32010;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED = -32009;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT = -32008;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED = -32007;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE = -32006;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY = -32005;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE = -32004;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE = -32003;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE = -32002;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP = -32001;\n\n// Addresses-related errors.\n// Reserve error codes in the range [2800000-2800999].\nexport const SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH = 2800000;\nexport const SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE = 2800001;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS = 2800002;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY = 2800003;\nexport const SOLANA_ERROR__ADDRESSES__MALFORMED_PDA = 2800004;\nexport const SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE = 2800005;\nexport const SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED = 2800006;\nexport const SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED = 2800007;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE = 2800008;\nexport const SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED = 2800009;\nexport const SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER = 2800010;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS = 2800011;\n\n// Account-related errors.\n// Reserve error codes in the range [3230000-3230999].\nexport const SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND = 3230000;\nexport const SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND = 32300001;\nexport const SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT = 3230002;\nexport const SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT = 3230003;\nexport const SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED = 3230004;\n\n// Subtle-Crypto-related errors.\n// Reserve error codes in the range [3610000-3610999].\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT = 3610000;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED = 3610001;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED = 3610002;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED = 3610003;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED = 3610004;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED = 3610005;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED = 3610006;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY = 3610007;\n\n// Crypto-related errors.\n// Reserve error codes in the range [3611000-3611050].\nexport const SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED = 3611000;\n\n// Key-related errors.\n// Reserve error codes in the range [3704000-3704999].\nexport const SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH = 3704000;\nexport const SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH = 3704001;\nexport const SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH = 3704002;\nexport const SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE = 3704003;\nexport const SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY = 3704004;\n\n// Instruction-related errors.\n// Reserve error codes in the range [4128000-4128999].\nexport const SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS = 4128000;\nexport const SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA = 4128001;\nexport const SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH = 4128002;\n\n// Instruction errors.\n// Reserve error codes starting with [4615000-4615999] for the Rust enum `InstructionError`.\n// Error names here are dictated by the RPC (see ./instruction-error.ts).\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN = 4615000;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR = 4615001;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT = 4615002;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA = 4615003;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA = 4615004;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL = 4615005;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS = 4615006;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID = 4615007;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE = 4615008;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED = 4615009;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT = 4615010;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION = 4615011;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID = 4615012;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND = 4615013;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED = 4615014;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE = 4615015;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED = 4615016;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX = 4615017;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED = 4615018;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED = 4615019;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS = 4615020;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED = 4615021;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE = 4615022;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED = 4615023;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 4615024;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC = 4615025;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM = 4615026;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR = 4615027;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED = 4615028;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE = 4615029;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT = 4615030;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID = 4615031;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH = 4615032;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT = 4615033;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED = 4615034;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED = 4615035;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS = 4615036;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC = 4615037;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED = 4615038;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION = 4615039;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE = 4615040;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE = 4615041;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE = 4615042;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE = 4615043;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY = 4615044;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR = 4615045;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT = 4615046;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER = 4615047;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW = 4615048;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR = 4615049;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER = 4615050;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED = 4615051;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED = 4615052;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED = 4615053;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS = 4615054;\n\n// Signer-related errors.\n// Reserve error codes in the range [5508000-5508999].\nexport const SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS = 5508000;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER = 5508001;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER = 5508002;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER = 5508003;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER = 5508004;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER = 5508005;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER = 5508006;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER = 5508007;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER = 5508008;\nexport const SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS = 5508009;\nexport const SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING = 5508010;\nexport const SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED = 5508011;\n\n// Offchain-message-related errors.\n// Reserve error codes in the range [5607000-5607999].\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED = 5607000;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE = 5607001;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE = 5607002;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH = 5607003;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH = 5607004;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO = 5607005;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED = 5607006;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH = 5607007;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH = 5607008;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY = 5607009;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO = 5607010;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING = 5607011;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH = 5607012;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE = 5607013;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION = 5607014;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED = 5607015;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE = 5607016;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE = 5607017;\n\n// Transaction-related errors.\n// Reserve error codes in the range [5663000-5663999].\nexport const SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES = 5663000;\nexport const SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE = 5663001;\nexport const SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME = 5663002;\nexport const SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME = 5663003;\nexport const SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE = 5663004;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING = 5663005;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE = 5663006;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND = 5663007;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING = 5663008;\nexport const SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING = 5663009;\nexport const SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING = 5663010;\nexport const SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING = 5663011;\nexport const SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING = 5663012;\nexport const SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING = 5663013;\nexport const SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE = 5663014;\nexport const SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION = 5663015;\nexport const SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES = 5663016;\nexport const SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH = 5663017;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT = 5663018;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT = 5663019;\nexport const SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT = 5663020;\nexport const SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED = 5663021;\nexport const SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE = 5663022;\n\n// Transaction errors.\n// Reserve error codes starting with [7050000-7050999] for the Rust enum `TransactionError`.\n// Error names here are dictated by the RPC (see ./transaction-error.ts).\nexport const SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN = 7050000;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE = 7050001;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE = 7050002;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND = 7050003;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND = 7050004;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE = 7050005;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE = 7050006;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED = 7050007;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND = 7050008;\n// `InstructionError` intentionally omitted.\nexport const SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP = 7050009;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE = 7050010;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX = 7050011;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE = 7050012;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION = 7050013;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE = 7050014;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE = 7050015;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 7050016;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT = 7050017;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION = 7050018;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT = 7050019;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT = 7050020;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT = 7050021;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS = 7050022;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND = 7050023;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER = 7050024;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA = 7050025;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX = 7050026;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT = 7050027;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT = 7050028;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT = 7050029;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION = 7050030;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT = 7050031;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED = 7050032;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT = 7050033;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED = 7050034;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED = 7050035;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION = 7050036;\n\n// Instruction plan related errors.\n// Reserve error codes in the range [7618000-7618999].\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN = 7618000;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE = 7618001;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN = 7618002;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN = 7618003;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED = 7618004;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND = 7618005;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN = 7618006;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN = 7618007;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT = 7618008;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT = 7618009;\n\n// Codec-related errors.\n// Reserve error codes in the range [8078000-8078999].\nexport const SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY = 8078000;\nexport const SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH = 8078001;\nexport const SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH = 8078002;\nexport const SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH = 8078003;\nexport const SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH = 8078004;\nexport const SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH = 8078005;\nexport const SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH = 8078006;\nexport const SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS = 8078007;\nexport const SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE = 8078008;\nexport const SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT = 8078009;\nexport const SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT = 8078010;\nexport const SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE = 8078011;\nexport const SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE = 8078012;\nexport const SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH = 8078013;\nexport const SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE = 8078014;\nexport const SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT = 8078015;\nexport const SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE = 8078016;\nexport const SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE = 8078017;\nexport const SOLANA_ERROR__CODECS__INVALID_CONSTANT = 8078018;\nexport const SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE = 8078019;\nexport const SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL = 8078020;\nexport const SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES = 8078021;\nexport const SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS = 8078022;\nexport const SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY = 8078023;\n\n// RPC-related errors.\n// Reserve error codes in the range [8100000-8100999].\nexport const SOLANA_ERROR__RPC__INTEGER_OVERFLOW = 8100000;\nexport const SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN = 8100001;\nexport const SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR = 8100002;\nexport const SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD = 8100003;\n\n// RPC-Subscriptions-related errors.\n// Reserve error codes in the range [8190000-8190999].\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN = 8190000;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID = 8190001;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED = 8190002;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED = 8190003;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT = 8190004;\n\n// Invariant violation errors.\n// Reserve error codes in the range [9900000-9900999].\n// These errors should only be thrown when there is a bug with the\n// library itself and should, in theory, never reach the end user.\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING = 9900000;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE = 9900001;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING = 9900002;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE = 9900003;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED = 9900004;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND = 9900005;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND = 9900006;\n\n/**\n * A union of every Solana error code\n *\n * @privateRemarks\n * You might be wondering why this is not a TypeScript enum or const enum.\n *\n * One of the goals of this library is to enable people to use some or none of it without having to\n * bundle all of it.\n *\n * If we made the set of error codes an enum then anyone who imported it (even if to only use a\n * single error code) would be forced to bundle every code and its label.\n *\n * Const enums appear to solve this problem by letting the compiler inline only the codes that are\n * actually used. Unfortunately exporting ambient (const) enums from a library like `@solana/errors`\n * is not safe, for a variety of reasons covered here: https://stackoverflow.com/a/28818850\n */\nexport type SolanaErrorCode =\n | typeof SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED\n | typeof SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT\n | typeof SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT\n | typeof SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND\n | typeof SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE\n | typeof SOLANA_ERROR__ADDRESSES__MALFORMED_PDA\n | typeof SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED\n | typeof SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE\n | typeof SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER\n | typeof SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED\n | typeof SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY\n | typeof SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS\n | typeof SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL\n | typeof SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH\n | typeof SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH\n | typeof SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH\n | typeof SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY\n | typeof SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH\n | typeof SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH\n | typeof SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH\n | typeof SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE\n | typeof SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH\n | typeof SOLANA_ERROR__CODECS__INVALID_CONSTANT\n | typeof SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT\n | typeof SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT\n | typeof SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT\n | typeof SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS\n | typeof SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE\n | typeof SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES\n | typeof SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS\n | typeof SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA\n | typeof SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT\n | typeof SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH\n | typeof SOLANA_ERROR__INVALID_NONCE\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE\n | typeof SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR\n | typeof SOLANA_ERROR__JSON_RPC__INVALID_PARAMS\n | typeof SOLANA_ERROR__JSON_RPC__INVALID_REQUEST\n | typeof SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND\n | typeof SOLANA_ERROR__JSON_RPC__PARSE_ERROR\n | typeof SOLANA_ERROR__JSON_RPC__SCAN_ERROR\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION\n | typeof SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH\n | typeof SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH\n | typeof SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH\n | typeof SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY\n | typeof SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE\n | typeof SOLANA_ERROR__MALFORMED_BIGINT_STRING\n | typeof SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR\n | typeof SOLANA_ERROR__MALFORMED_NUMBER_STRING\n | typeof SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED\n | typeof SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD\n | typeof SOLANA_ERROR__RPC__INTEGER_OVERFLOW\n | typeof SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR\n | typeof SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID\n | typeof SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER\n | typeof SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS\n | typeof SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING\n | typeof SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE\n | typeof SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION\n | typeof SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES\n | typeof SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME\n | typeof SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE\n | typeof SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES\n | typeof SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE\n | typeof SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH\n | typeof SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE\n | typeof SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED\n | typeof SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT;\n\n/**\n * Errors of this type are understood to have an optional {@link SolanaError} nested inside as\n * `cause`.\n */\nexport type SolanaErrorCodeWithCause = typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE;\n\n/**\n * Errors of this type have a deprecated `cause` property. Consumers should use the error's\n * `context` instead to access relevant error information.\n */\nexport type SolanaErrorCodeWithDeprecatedCause =\n typeof SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN;\n","/**\n * To add a new error, follow the instructions at\n * https://github.com/anza-xyz/kit/tree/main/packages/errors/#adding-a-new-error\n *\n * @privateRemarks\n * WARNING:\n * - Don't change or remove members of an error's context.\n */\nimport {\n SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND,\n SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS,\n SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE,\n SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__INVALID_CONSTANT,\n SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS,\n SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE,\n SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES,\n SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA,\n SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW,\n SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS,\n SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH,\n SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND,\n SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS,\n SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED,\n SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR,\n SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH,\n SOLANA_ERROR__INVALID_NONCE,\n SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING,\n SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE,\n SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR,\n SOLANA_ERROR__JSON_RPC__INVALID_PARAMS,\n SOLANA_ERROR__JSON_RPC__INVALID_REQUEST,\n SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND,\n SOLANA_ERROR__JSON_RPC__PARSE_ERROR,\n SOLANA_ERROR__JSON_RPC__SCAN_ERROR,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION,\n SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__MALFORMED_BIGINT_STRING,\n SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,\n SOLANA_ERROR__MALFORMED_NUMBER_STRING,\n SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD,\n SOLANA_ERROR__RPC__INTEGER_OVERFLOW,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS,\n SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER,\n SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY,\n SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING,\n SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION,\n SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH,\n SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE,\n SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED,\n SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN,\n SolanaErrorCode,\n} from './codes';\nimport { RpcSimulateTransactionResult } from './json-rpc-error';\n\ntype BasicInstructionErrorContext = { [P in T]: { index: number } };\n\ntype DefaultUnspecifiedErrorContextToUndefined = {\n [P in SolanaErrorCode]: P extends keyof T ? T[P] : undefined;\n};\n\ntype ReadonlyContextValue = {\n [P in keyof T]: Readonly;\n};\n\ntype TypedArrayMutableProperties = 'copyWithin' | 'fill' | 'reverse' | 'set' | 'sort';\ninterface ReadonlyUint8Array extends Omit {\n readonly [n: number]: number;\n}\n\n/** A amount of bytes. */\ntype Bytes = number;\n\n/**\n * A map of every {@link SolanaError} code to the type of its `context` property.\n */\nexport type SolanaErrorContext = ReadonlyContextValue<\n DefaultUnspecifiedErrorContextToUndefined<\n BasicInstructionErrorContext<\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR\n > & {\n [SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND]: {\n address: string;\n };\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT]: {\n address: string;\n };\n [SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT]: {\n address: string;\n };\n [SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS]: {\n putativeAddress: string;\n };\n [SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]: {\n actual: number;\n maxSeeds: number;\n };\n [SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED]: {\n actual: number;\n index: number;\n maxSeedLength: number;\n };\n [SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE]: {\n bump: number;\n };\n [SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED]: {\n currentBlockHeight: bigint;\n lastValidBlockHeight: bigint;\n };\n [SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY]: {\n codecDescription: string;\n };\n [SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS]: {\n stringValues: readonly string[];\n };\n [SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL]: {\n encodedBytes: ReadonlyUint8Array;\n hexEncodedBytes: string;\n hexSentinel: string;\n sentinel: ReadonlyUint8Array;\n };\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH]: {\n decoderFixedSize: number;\n encoderFixedSize: number;\n };\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH]: {\n decoderMaxSize: number | undefined;\n encoderMaxSize: number | undefined;\n };\n [SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE]: {\n discriminator: bigint | number;\n formattedValidDiscriminators: string;\n validDiscriminators: readonly number[];\n };\n [SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY]: {\n expectedLength: number;\n numExcessBytes: number;\n };\n [SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH]: {\n bytesLength: number;\n codecDescription: string;\n };\n [SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE]: {\n codecDescription: string;\n expectedSize: number;\n hexZeroValue: string;\n zeroValue: ReadonlyUint8Array;\n };\n [SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH]: {\n bytesLength: number;\n codecDescription: string;\n expected: number;\n };\n [SOLANA_ERROR__CODECS__INVALID_CONSTANT]: {\n constant: ReadonlyUint8Array;\n data: ReadonlyUint8Array;\n hexConstant: string;\n hexData: string;\n offset: number;\n };\n [SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT]: {\n value: bigint | boolean | number | string | null | undefined;\n variants: readonly (bigint | boolean | number | string | null | undefined)[];\n };\n [SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT]: {\n formattedNumericalValues: string;\n numericalValues: readonly number[];\n stringValues: readonly string[];\n variant: number | string | symbol;\n };\n [SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT]: {\n value: bigint | boolean | number | string | null | undefined;\n variants: readonly (bigint | boolean | number | string | null | undefined)[];\n };\n [SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS]: {\n actual: bigint | number;\n codecDescription: string;\n expected: bigint | number;\n };\n [SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE]: {\n alphabet: string;\n base: number;\n value: string;\n };\n [SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE]: {\n discriminator: bigint | number;\n maxRange: number;\n minRange: number;\n };\n [SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE]: {\n codecDescription: string;\n max: bigint | number;\n min: bigint | number;\n value: bigint | number;\n };\n [SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE]: {\n bytesLength: number;\n codecDescription: string;\n offset: number;\n };\n [SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES]: {\n decodedBytes: ReadonlyUint8Array;\n hexDecodedBytes: string;\n hexSentinel: string;\n sentinel: ReadonlyUint8Array;\n };\n [SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE]: {\n maxRange: number;\n minRange: number;\n variant: number;\n };\n [SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR]: {\n index: number;\n };\n [SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM]: {\n code: number;\n index: number;\n };\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN]: {\n errorName: string;\n index: number;\n instructionErrorContext?: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT]: {\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND]: {\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN]: {\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN]: {\n numBytesRequired: number;\n numFreeBytes: number;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN]: {\n actualKind: string;\n expectedKind: string;\n instructionPlan: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN]: {\n actualKind: string;\n expectedKind: string;\n transactionPlan: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT]: {\n actualKind: string;\n expectedKind: string;\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS]: {\n data?: ReadonlyUint8Array;\n programAddress: string;\n };\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA]: {\n accountAddresses?: readonly string[];\n programAddress: string;\n };\n [SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH]: {\n actualProgramAddress: string;\n expectedProgramAddress: string;\n };\n [SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__INVALID_NONCE]: {\n actualNonceValue: string;\n expectedNonceValue: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING]: {\n cacheKey: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED]: {\n channelName: string;\n supportedChannelNames: readonly string[];\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND]: {\n kind: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND]: {\n kind: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE]: {\n unexpectedValue: unknown;\n };\n [SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__INVALID_PARAMS]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__INVALID_REQUEST]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__PARSE_ERROR]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SCAN_ERROR]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE]: {\n currentBlockHeight: bigint;\n rewardsCompleteBlockHeight: bigint;\n slot: bigint;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED]: {\n contextSlot: bigint;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY]: {\n numSlotsBehind?: number;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE]: Omit<\n RpcSimulateTransactionResult,\n 'err'\n >;\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY]: {\n slot: bigint;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH]: {\n byteLength: number;\n };\n [SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__MALFORMED_BIGINT_STRING]: {\n value: string;\n };\n [SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: {\n error: unknown;\n message: string;\n };\n [SOLANA_ERROR__MALFORMED_NUMBER_STRING]: {\n value: string;\n };\n [SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: {\n nonceAccountAddress: string;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE]: {\n expectedAddresses: readonly string[];\n unexpectedAddresses: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]: {\n missingRequiredSigners: readonly string[];\n unexpectedSigners: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]: {\n actualBytes: number;\n maxBytes: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]: {\n actualMessageFormat: number;\n expectedMessageFormat: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]: {\n actualLength: number;\n specifiedLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]: {\n numRequiredSignatures: number;\n signatoryAddresses: readonly string[];\n signaturesLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE]: {\n signatoriesWithInvalidSignatures: readonly string[];\n signatoriesWithMissingSignatures: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION]: {\n actualVersion: number;\n expectedVersion: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]: {\n unsupportedVersion: number;\n };\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]: {\n notificationName: string;\n };\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT]: {\n errorEvent: Event;\n };\n [SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD]: {\n method: string;\n params: readonly unknown[];\n };\n [SOLANA_ERROR__RPC__INTEGER_OVERFLOW]: {\n argumentLabel: string;\n keyPath: readonly (number | string | symbol)[];\n methodName: string;\n optionalPathLabel: string;\n path?: string;\n value: bigint;\n };\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR]: {\n headers: Headers;\n message: string;\n statusCode: number;\n };\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN]: {\n headers: readonly string[];\n };\n [SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY]: {\n key: CryptoKey;\n };\n [SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE]: {\n value: bigint;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION]: {\n index: number;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT]: {\n accountIndex: number;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED]: {\n accountIndex: number;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN]: {\n errorName: string;\n transactionErrorContext?: unknown;\n };\n [SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION]: {\n expectedAddresses: readonly string[];\n unexpectedAddresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING]: {\n index: number;\n };\n [SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT]: {\n transactionSize: Bytes;\n transactionSizeLimit: Bytes;\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING]: {\n lookupTableAddresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE]: {\n highestKnownIndex: number;\n highestRequestedIndex: number;\n lookupTableAddress: string;\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND]: {\n index: number;\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT]: {\n unitsConsumed: number;\n };\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES]: {\n programAddress: string;\n };\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE]: {\n programAddress: string;\n };\n [SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH]: {\n numRequiredSignatures: number;\n signaturesLength: number;\n signerAddresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE]: {\n nonce: string;\n };\n [SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED]: {\n unsupportedVersion: number;\n };\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE]: {\n actualVersion: number;\n };\n }\n >\n>;\n\nexport function decodeEncodedContext(encodedContext: string): object {\n const decodedUrlString = __NODEJS__ ? Buffer.from(encodedContext, 'base64').toString('utf8') : atob(encodedContext);\n return Object.fromEntries(new URLSearchParams(decodedUrlString).entries());\n}\n\nfunction encodeValue(value: unknown): string {\n if (Array.isArray(value)) {\n const commaSeparatedValues = value.map(encodeValue).join('%2C%20' /* \", \" */);\n return '%5B' /* \"[\" */ + commaSeparatedValues + /* \"]\" */ '%5D';\n } else if (typeof value === 'bigint') {\n return `${value}n`;\n } else {\n return encodeURIComponent(\n String(\n value != null && Object.getPrototypeOf(value) === null\n ? // Plain objects with no prototype don't have a `toString` method.\n // Convert them before stringifying them.\n { ...(value as object) }\n : value,\n ),\n );\n }\n}\n\nfunction encodeObjectContextEntry([key, value]: [string, unknown]): `${typeof key}=${string}` {\n return `${key}=${encodeValue(value)}`;\n}\n\nexport function encodeContextObject(context: object): string {\n const searchParamsString = Object.entries(context).map(encodeObjectContextEntry).join('&');\n return __NODEJS__ ? Buffer.from(searchParamsString, 'utf8').toString('base64') : btoa(searchParamsString);\n}\n","/* eslint-disable sort-keys-fix/sort-keys-fix */\n/**\n * To add a new error, follow the instructions at\n * https://github.com/anza-xyz/kit/tree/main/packages/errors#adding-a-new-error\n *\n * WARNING:\n * - Don't change the meaning of an error message.\n */\nimport {\n SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND,\n SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED,\n SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY,\n SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS,\n SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE,\n SOLANA_ERROR__ADDRESSES__MALFORMED_PDA,\n SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE,\n SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS,\n SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH,\n SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE,\n SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__INVALID_CONSTANT,\n SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS,\n SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE,\n SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES,\n SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE,\n SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA,\n SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW,\n SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS,\n SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH,\n SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND,\n SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS,\n SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED,\n SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR,\n SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH,\n SOLANA_ERROR__INVALID_NONCE,\n SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING,\n SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE,\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING,\n SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE,\n SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR,\n SOLANA_ERROR__JSON_RPC__INVALID_PARAMS,\n SOLANA_ERROR__JSON_RPC__INVALID_REQUEST,\n SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND,\n SOLANA_ERROR__JSON_RPC__PARSE_ERROR,\n SOLANA_ERROR__JSON_RPC__SCAN_ERROR,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION,\n SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY,\n SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE,\n SOLANA_ERROR__MALFORMED_BIGINT_STRING,\n SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,\n SOLANA_ERROR__MALFORMED_NUMBER_STRING,\n SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD,\n SOLANA_ERROR__RPC__INTEGER_OVERFLOW,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID,\n SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS,\n SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER,\n SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS,\n SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING,\n SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY,\n SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT,\n SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING,\n SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION,\n SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES,\n SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT,\n SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME,\n SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING,\n SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING,\n SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE,\n SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH,\n SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE,\n SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED,\n SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP,\n SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE,\n SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT,\n SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED,\n SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED,\n SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED,\n SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE,\n SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE,\n SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS,\n SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION,\n SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN,\n SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT,\n SolanaErrorCode,\n} from './codes';\n\n/**\n * A map of every {@link SolanaError} code to the error message shown to developers in development\n * mode.\n */\nexport const SolanaErrorMessages: Readonly<{\n // This type makes this data structure exhaustive with respect to `SolanaErrorCode`.\n // TypeScript will fail to build this project if add an error code without a message.\n [P in SolanaErrorCode]: string;\n}> = {\n [SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND]: 'Account not found at address: $address',\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED]:\n 'Not all accounts were decoded. Encoded accounts found at addresses: $addresses.',\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT]: 'Expected decoded account at address: $address',\n [SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT]: 'Failed to decode account data at address: $address',\n [SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND]: 'Accounts not found at addresses: $addresses',\n [SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED]:\n 'Unable to find a viable program address bump seed.',\n [SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS]: '$putativeAddress is not a base58-encoded address.',\n [SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH]:\n 'Expected base58 encoded address to decode to a byte array of length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY]: 'The `CryptoKey` must be an `Ed25519` public key.',\n [SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS]:\n '$putativeOffCurveAddress is not a base58-encoded off-curve address.',\n [SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE]: 'Invalid seeds; point must fall off the Ed25519 curve.',\n [SOLANA_ERROR__ADDRESSES__MALFORMED_PDA]:\n 'Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].',\n [SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]:\n 'A maximum of $maxSeeds seeds, including the bump seed, may be supplied when creating an address. Received: $actual.',\n [SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED]:\n 'The seed at index $index with length $actual exceeds the maximum length of $maxSeedLength bytes.',\n [SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE]:\n 'Expected program derived address bump to be in the range [0, 255], got: $bump.',\n [SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER]: 'Program address cannot end with PDA marker.',\n [SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded address string of length in the range [32, 44]. Actual length: $actualLength.',\n [SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded blockash string of length in the range [32, 44]. Actual length: $actualLength.',\n [SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED]:\n 'The network has progressed past the last block for which this transaction could have been committed.',\n [SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY]:\n 'Codec [$codecDescription] cannot decode empty byte arrays.',\n [SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS]:\n 'Enum codec cannot use lexical values [$stringValues] as discriminators. Either remove all lexical values or set `useValuesAsDiscriminators` to `false`.',\n [SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL]:\n 'Sentinel [$hexSentinel] must not be present in encoded bytes [$hexEncodedBytes].',\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH]:\n 'Encoder and decoder must have the same fixed size, got [$encoderFixedSize] and [$decoderFixedSize].',\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH]:\n 'Encoder and decoder must have the same max size, got [$encoderMaxSize] and [$decoderMaxSize].',\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH]:\n 'Encoder and decoder must either both be fixed-size or variable-size.',\n [SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE]:\n 'Enum discriminator out of range. Expected a number in [$formattedValidDiscriminators], got $discriminator.',\n [SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH]: 'Expected a fixed-size codec, got a variable-size one.',\n [SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH]:\n 'Codec [$codecDescription] expected a positive byte length, got $bytesLength.',\n [SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH]: 'Expected a variable-size codec, got a fixed-size one.',\n [SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE]:\n 'Codec [$codecDescription] expected zero-value [$hexZeroValue] to have the same size as the provided fixed-size item [$expectedSize bytes].',\n [SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH]:\n 'Codec [$codecDescription] expected $expected bytes, got $bytesLength.',\n [SOLANA_ERROR__CODECS__INVALID_CONSTANT]:\n 'Expected byte array constant [$hexConstant] to be present in data [$hexData] at offset [$offset].',\n [SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT]:\n 'Invalid discriminated union variant. Expected one of [$variants], got $value.',\n [SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT]:\n 'Invalid enum variant. Expected one of [$stringValues] or a number in [$formattedNumericalValues], got $variant.',\n [SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT]:\n 'Invalid literal union variant. Expected one of [$variants], got $value.',\n [SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS]:\n 'Expected [$codecDescription] to have $expected items, got $actual.',\n [SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE]: 'Invalid value $value for base $base with alphabet $alphabet.',\n [SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE]:\n 'Literal union discriminator out of range. Expected a number between $minRange and $maxRange, got $discriminator.',\n [SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE]:\n 'Codec [$codecDescription] expected number to be in the range [$min, $max], got $value.',\n [SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE]:\n 'Codec [$codecDescription] expected offset to be in the range [0, $bytesLength], got $offset.',\n [SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES]:\n 'Expected sentinel [$hexSentinel] to be present in decoded bytes [$hexDecodedBytes].',\n [SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE]:\n 'Union variant out of range. Expected an index between $minRange and $maxRange, got $variant.',\n [SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY]:\n 'This decoder expected a byte array of exactly $expectedLength bytes, but $numExcessBytes unexpected excess bytes remained after decoding. Are you sure that you have chosen the correct decoder for this data?',\n [SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED]: 'No random values implementation could be found.',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED]: 'instruction requires an uninitialized account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED]:\n 'instruction tries to borrow reference for an account which is already borrowed',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]:\n 'instruction left account with an outstanding borrowed reference',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED]:\n \"program other than the account's owner changed the size of the account data\",\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL]: 'account data too small for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE]: 'instruction expected an executable account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT]:\n 'An account does not have enough lamports to be rent-exempt',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW]: 'Program arithmetic overflowed',\n [SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR]: 'Failed to serialize or deserialize account data: $encodedData',\n [SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS]:\n 'Builtin programs must consume compute units',\n [SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH]: 'Cross-program invocation call depth too deep',\n [SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED]: 'Computational budget exceeded',\n [SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM]: 'custom program error: #$code',\n [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX]: 'instruction contains duplicate accounts',\n [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC]:\n 'instruction modifications of multiply-passed account differ',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT]: 'executable accounts must be rent exempt',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED]: 'instruction changed executable accounts data',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE]:\n 'instruction changed the balance of an executable account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED]: 'instruction changed executable bit of an account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED]:\n 'instruction modified data of an account it does not own',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND]:\n 'instruction spent from the balance of an account it does not own',\n [SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR]: 'generic instruction error',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER]: 'Provided owner is not allowed',\n [SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE]: 'Account is immutable',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY]: 'Incorrect authority provided',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID]: 'incorrect program id for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS]: 'insufficient funds for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA]: 'invalid account data for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER]: 'Invalid account owner',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT]: 'invalid program argument',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR]: 'program returned invalid error code',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA]: 'invalid instruction data',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC]: 'Failed to reallocate account data',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS]: 'Provided seeds do not result in a valid address',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED]:\n 'Accounts data allocations exceeded the maximum allowed per transaction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED]: 'Max accounts exceeded',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED]: 'Max instruction trace length exceeded',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED]:\n 'Length of the seed is too long for address generation',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT]: 'An account required by the instruction is missing',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE]: 'missing required signature for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID]:\n 'instruction illegally modified the program id of an account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS]: 'insufficient account keys for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION]:\n 'Cross-program invocation with unauthorized signer or writable account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE]:\n 'Failed to create program execution environment',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE]: 'Program failed to compile',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE]: 'Program failed to complete',\n [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED]: 'instruction modified data of a read-only account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE]:\n 'instruction changed the balance of a read-only account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED]:\n 'Cross-program invocation reentrancy not allowed for this instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED]: 'instruction modified rent epoch of an account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION]:\n 'sum of account balances before and after instruction do not match',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT]: 'instruction requires an initialized account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN]: '',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID]: 'Unsupported program id',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR]: 'Unsupported sysvar',\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND]: 'Invalid instruction plan kind: $kind.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN]: 'The provided instruction plan is empty.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND]:\n 'No failed transaction plan result was found in the provided transaction plan result.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED]:\n 'This transaction plan executor does not support non-divisible sequential plans. To support them, you may create your own executor such that multi-transaction atomicity is preserved — e.g. by targetting RPCs that support transaction bundles.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN]:\n 'The provided transaction plan failed to execute. See the `transactionPlanResult` attribute for more details. Note that the `cause` property is deprecated, and a future version will not set it.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN]:\n 'The provided message has insufficient capacity to accommodate the next instruction(s) in this plan. Expected at least $numBytesRequired free byte(s), got $numFreeBytes byte(s).',\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND]: 'Invalid transaction plan kind: $kind.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE]:\n 'No more instructions to pack; the message packer has completed the instruction plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN]:\n 'Unexpected instruction plan. Expected $expectedKind plan, got $actualKind plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN]:\n 'Unexpected transaction plan. Expected $expectedKind plan, got $actualKind plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT]:\n 'Unexpected transaction plan result. Expected $expectedKind plan, got $actualKind plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT]:\n 'Expected a successful transaction plan result. I.e. there is at least one failed or cancelled transaction in the plan.',\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS]: 'The instruction does not have any accounts.',\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA]: 'The instruction does not have any data.',\n [SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH]:\n 'Expected instruction to have progress address $expectedProgramAddress, got $actualProgramAddress.',\n [SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH]:\n 'Expected base58 encoded blockhash to decode to a byte array of length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__INVALID_NONCE]:\n 'The nonce `$expectedNonceValue` is no longer valid. It has advanced to `$actualNonceValue`',\n [SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING]:\n 'Invariant violation: Found no abortable iterable cache entry for key `$cacheKey`. It ' +\n 'should be impossible to hit this error; please file an issue at ' +\n 'https://sola.na/web3invariant',\n [SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED]:\n 'Invariant violation: This data publisher does not publish to the channel named ' +\n '`$channelName`. Supported channels include $supportedChannelNames.',\n [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE]:\n 'Invariant violation: WebSocket message iterator state is corrupt; iterated without first ' +\n 'resolving existing message promise. It should be impossible to hit this error; please ' +\n 'file an issue at https://sola.na/web3invariant',\n [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING]:\n 'Invariant violation: WebSocket message iterator is missing state storage. It should be ' +\n 'impossible to hit this error; please file an issue at https://sola.na/web3invariant',\n [SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE]:\n 'Invariant violation: Switch statement non-exhaustive. Received unexpected value ' +\n '`$unexpectedValue`. It should be impossible to hit this error; please file an issue at ' +\n 'https://sola.na/web3invariant',\n [SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR]: 'JSON-RPC error: Internal JSON-RPC error ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__INVALID_PARAMS]: 'JSON-RPC error: Invalid method parameter(s) ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__INVALID_REQUEST]:\n 'JSON-RPC error: The JSON sent is not a valid `Request` object ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND]:\n 'JSON-RPC error: The method does not exist / is not available ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__PARSE_ERROR]:\n 'JSON-RPC error: An error occurred on the server while parsing the JSON text ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__SCAN_ERROR]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE]:\n 'Epoch rewards period still active at slot $slot',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE]:\n 'Failed to query long-term storage; please try again',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED]: 'Minimum context slot has not been reached',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY]: 'Node is unhealthy; behind by $numSlotsBehind slots',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT]: 'No snapshot',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE]: 'Transaction simulation failed',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY]:\n \"Rewards cannot be found because slot $slot is not the epoch boundary. This may be due to gap in the queried node's local ledger or long-term storage\",\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE]:\n 'Transaction history is not available from this node',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH]: 'Transaction signature length mismatch',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE]:\n 'Transaction signature verification failure',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION]: '$__serverMessage',\n [SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH]: 'Key pair bytes must be of length 64, got $byteLength.',\n [SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH]:\n 'Expected private key bytes with length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH]:\n 'Expected base58-encoded signature to decode to a byte array of length 64. Actual length: $actualLength.',\n [SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY]:\n 'The provided private key does not match the provided public key.',\n [SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded signature string of length in the range [64, 88]. Actual length: $actualLength.',\n [SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE]: 'Lamports value must be in the range [0, 2e64-1]',\n [SOLANA_ERROR__MALFORMED_BIGINT_STRING]: '`$value` cannot be parsed as a `BigInt`',\n [SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: '$message',\n [SOLANA_ERROR__MALFORMED_NUMBER_STRING]: '`$value` cannot be parsed as a `Number`',\n [SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: 'No nonce account could be found at address `$nonceAccountAddress`',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]:\n 'Expected base58 encoded application domain to decode to a byte array of length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE]:\n 'Attempted to sign an offchain message with an address that is not a signer for it',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded application domain string of length in the range [32, 44]. Actual length: $actualLength.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]:\n 'The signer addresses in this offchain message envelope do not match the list of ' +\n 'required signers in the message preamble. These unexpected signers were present in the ' +\n 'envelope: `[$unexpectedSigners]`. These required signers were missing from the envelope ' +\n '`[$missingSigners]`.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]:\n 'The message body provided has a byte-length of $actualBytes. The maximum allowable ' +\n 'byte-length is $maxBytes',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]:\n 'Expected message format $expectedMessageFormat, got $actualMessageFormat',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]:\n 'The message length specified in the message preamble is $specifiedLength bytes. The actual length of the message is $actualLength bytes.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY]: 'Offchain message content must be non-empty',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO]:\n 'Offchain message must specify the address of at least one required signer',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO]:\n 'Offchain message envelope must reserve space for at least one signature',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]:\n 'The offchain message preamble specifies $numRequiredSignatures required signature(s), got $signaturesLength.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED]:\n 'The signatories of this offchain message must be listed in lexicographical order',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE]:\n 'An address must be listed no more than once among the signatories of an offchain message',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]:\n 'Offchain message is missing signatures for addresses: $addresses.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE]:\n 'Offchain message signature verification failed. Signature mismatch for required ' +\n 'signatories [$signatoriesWithInvalidSignatures]. Missing signatures for signatories ' +\n '[$signatoriesWithMissingSignatures]',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE]:\n 'The message body provided contains characters whose codes fall outside the allowed ' +\n 'range. In order to ensure clear-signing compatiblity with hardware wallets, the message ' +\n 'may only contain line feeds and characters in the range [\\\\x20-\\\\x7e].',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION]:\n 'Expected offchain message version $expectedVersion. Got $actualVersion.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]:\n 'This version of Kit does not support decoding offchain messages with version ' +\n '$unsupportedVersion. The current max supported version is 0.',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]:\n \"The notification name must end in 'Notifications' and the API must supply a \" +\n \"subscription plan creator function for the notification '$notificationName'.\",\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED]:\n 'WebSocket was closed before payload could be added to the send buffer',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED]: 'WebSocket connection closed',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT]: 'WebSocket failed to connect',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID]:\n 'Failed to obtain a subscription id from the server',\n [SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD]: 'Could not find an API plan for RPC method: `$method`',\n [SOLANA_ERROR__RPC__INTEGER_OVERFLOW]:\n 'The $argumentLabel argument to the `$methodName` RPC method$optionalPathLabel was ' +\n '`$value`. This number is unsafe for use with the Solana JSON-RPC because it exceeds ' +\n '`Number.MAX_SAFE_INTEGER`.',\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR]: 'HTTP error ($statusCode): $message',\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN]:\n 'HTTP header(s) forbidden: $headers. Learn more at ' +\n 'https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.',\n [SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS]:\n 'Multiple distinct signers were identified for address `$address`. Please ensure that ' +\n 'you are using the same signer instance for each address.',\n [SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER]:\n 'The provided value does not implement the `KeyPairSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER]:\n 'The provided value does not implement the `MessageModifyingSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER]:\n 'The provided value does not implement the `MessagePartialSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER]:\n 'The provided value does not implement any of the `MessageSigner` interfaces',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER]:\n 'The provided value does not implement the `TransactionModifyingSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER]:\n 'The provided value does not implement the `TransactionPartialSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER]:\n 'The provided value does not implement the `TransactionSendingSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER]:\n 'The provided value does not implement any of the `TransactionSigner` interfaces',\n [SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS]:\n 'More than one `TransactionSendingSigner` was identified.',\n [SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING]:\n 'No `TransactionSendingSigner` was identified. Please provide a valid ' +\n '`TransactionWithSingleSendingSigner` transaction.',\n [SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED]:\n 'Wallet account signers do not support signing multiple messages/transactions in a single operation',\n [SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY]: 'Cannot export a non-extractable key.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED]: 'No digest implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT]:\n 'Cryptographic operations are only allowed in secure browser contexts. Read more ' +\n 'here: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED]:\n 'This runtime does not support the generation of Ed25519 key pairs.\\n\\nInstall ' +\n '@solana/webcrypto-ed25519-polyfill and call its `install` function before generating keys in ' +\n 'environments that do not support Ed25519.\\n\\nFor a list of runtimes that ' +\n 'currently support Ed25519 operations, visit ' +\n 'https://github.com/WICG/webcrypto-secure-curves/issues/20.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED]:\n 'No signature verification implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED]: 'No key generation implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED]: 'No signing implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED]: 'No key export implementation could be found.',\n [SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE]:\n 'Timestamp value must be in the range [-(2n ** 63n), (2n ** 63n) - 1]. `$value` given',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]:\n 'Transaction processing left an account with an outstanding borrowed reference',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE]: 'Account in use',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE]: 'Account loaded twice',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND]:\n 'Attempt to debit an account but found no record of a prior credit.',\n [SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND]:\n \"Transaction loads an address table account that doesn't exist\",\n [SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED]: 'This transaction has already been processed',\n [SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND]: 'Blockhash not found',\n [SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP]: 'Loader call chain is too deep',\n [SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE]:\n 'Transactions are currently disabled due to cluster maintenance',\n [SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION]:\n 'Transaction contains a duplicate instruction ($index) that is not allowed',\n [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE]: 'Insufficient funds for fee',\n [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT]:\n 'Transaction results in an account ($accountIndex) with insufficient funds for rent',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE]: 'This account may not be used to pay transaction fees',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX]: 'Transaction contains an invalid account reference',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA]:\n 'Transaction loads an address table account with invalid data',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX]:\n 'Transaction address table lookup uses an invalid index',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER]:\n 'Transaction loads an address table account with an invalid owner',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT]:\n 'LoadedAccountsDataSizeLimit set for transaction must be greater than 0.',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION]:\n 'This program may not be used for executing instructions',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT]:\n 'Transaction leaves an account with a lower balance than rent-exempt minimum',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT]:\n 'Transaction loads a writable account that cannot be written',\n [SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED]:\n 'Transaction exceeded max loaded accounts data size cap',\n [SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE]:\n 'Transaction requires a fee but has no signature present',\n [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND]: 'Attempt to load a program that does not exist',\n [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED]:\n 'Execution of the program referenced by account at index $accountIndex is temporarily restricted.',\n [SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED]: 'ResanitizationNeeded',\n [SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE]: 'Transaction failed to sanitize accounts offsets correctly',\n [SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE]: 'Transaction did not pass signature verification',\n [SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS]: 'Transaction locked too many accounts',\n [SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION]:\n 'Sum of account balances before and after transaction do not match',\n [SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN]: 'The transaction failed with the error `$errorName`',\n [SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION]: 'Transaction version is unsupported',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT]:\n 'Transaction would exceed account data limit within the block',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT]:\n 'Transaction would exceed total account data limit',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT]:\n 'Transaction would exceed max account limit within the block',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT]:\n 'Transaction would exceed max Block Cost Limit',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT]: 'Transaction would exceed max Vote Cost Limit',\n [SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION]:\n 'Attempted to sign a transaction with an address that is not a signer for it',\n [SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING]: 'Transaction is missing an address at index: $index.',\n [SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES]:\n 'Transaction has no expected signers therefore it cannot be encoded',\n [SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT]:\n 'Transaction size $transactionSize exceeds limit of $transactionSizeLimit bytes',\n [SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME]: 'Transaction does not have a blockhash lifetime',\n [SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME]: 'Transaction is not a durable nonce transaction',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING]:\n 'Contents of these address lookup tables unknown: $lookupTableAddresses',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE]:\n 'Lookup of address at index $highestRequestedIndex failed for lookup table ' +\n '`$lookupTableAddress`. Highest known index is $highestKnownIndex. The lookup table ' +\n 'may have been extended since its contents were retrieved',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING]: 'No fee payer set in CompiledTransaction',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND]:\n 'Could not find program address at index $index',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT]:\n 'Failed to estimate the compute unit consumption for this transaction message. This is ' +\n 'likely because simulating the transaction failed. Inspect the `cause` property of this ' +\n 'error to learn more',\n [SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT]:\n 'Transaction failed when it was simulated in order to estimate the compute unit consumption. ' +\n 'The compute unit estimate provided is for a transaction that failed when simulated and may not ' +\n 'be representative of the compute units this transaction would consume if successful. Inspect the ' +\n '`cause` property of this error to learn more',\n [SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING]: 'Transaction is missing a fee payer.',\n [SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING]:\n \"Could not determine this transaction's signature. Make sure that the transaction has \" +\n 'been signed by its fee payer.',\n [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE]:\n 'Transaction first instruction is not advance nonce account instruction.',\n [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING]:\n 'Transaction with no instructions cannot be durable nonce transaction.',\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES]:\n 'This transaction includes an address (`$programAddress`) which is both ' +\n 'invoked and set as the fee payer. Program addresses may not pay fees',\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE]:\n 'This transaction includes an address (`$programAddress`) which is both invoked and ' +\n 'marked writable. Program addresses may not be writable',\n [SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH]:\n 'The transaction message expected the transaction to have $numRequiredSignatures signatures, got $signaturesLength.',\n [SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING]: 'Transaction is missing signatures for addresses: $addresses.',\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE]:\n 'Transaction version must be in the range [0, 127]. `$actualVersion` given',\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED]:\n 'This version of Kit does not support decoding transactions with version $unsupportedVersion. The current max supported version is 0.',\n [SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE]:\n 'The transaction has a durable nonce lifetime (with nonce `$nonce`), but the nonce account address is in a lookup table. The lifetime constraint cannot be constructed without fetching the lookup tables for the transaction.',\n};\n","import { SolanaErrorCode } from './codes';\nimport { encodeContextObject } from './context';\nimport { SolanaErrorMessages } from './messages';\n\nconst enum StateType {\n EscapeSequence,\n Text,\n Variable,\n}\ntype State = Readonly<{\n [START_INDEX]: number;\n [TYPE]: StateType;\n}>;\nconst START_INDEX = 'i';\nconst TYPE = 't';\n\nexport function getHumanReadableErrorMessage(\n code: TErrorCode,\n context: object = {},\n): string {\n const messageFormatString = SolanaErrorMessages[code];\n if (messageFormatString.length === 0) {\n return '';\n }\n let state: State;\n function commitStateUpTo(endIndex?: number) {\n if (state[TYPE] === StateType.Variable) {\n const variableName = messageFormatString.slice(state[START_INDEX] + 1, endIndex);\n\n fragments.push(\n variableName in context\n ? // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `${context[variableName as keyof typeof context]}`\n : `$${variableName}`,\n );\n } else if (state[TYPE] === StateType.Text) {\n fragments.push(messageFormatString.slice(state[START_INDEX], endIndex));\n }\n }\n const fragments: string[] = [];\n messageFormatString.split('').forEach((char, ii) => {\n if (ii === 0) {\n state = {\n [START_INDEX]: 0,\n [TYPE]:\n messageFormatString[0] === '\\\\'\n ? StateType.EscapeSequence\n : messageFormatString[0] === '$'\n ? StateType.Variable\n : StateType.Text,\n };\n return;\n }\n let nextState;\n switch (state[TYPE]) {\n case StateType.EscapeSequence:\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Text };\n break;\n case StateType.Text:\n if (char === '\\\\') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.EscapeSequence };\n } else if (char === '$') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Variable };\n }\n break;\n case StateType.Variable:\n if (char === '\\\\') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.EscapeSequence };\n } else if (char === '$') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Variable };\n } else if (!char.match(/\\w/)) {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Text };\n }\n break;\n }\n if (nextState) {\n if (state !== nextState) {\n commitStateUpTo(ii);\n }\n state = nextState;\n }\n });\n commitStateUpTo();\n return fragments.join('');\n}\n\nexport function getErrorMessage(\n code: TErrorCode,\n context: Record = {},\n): string {\n if (process.env.NODE_ENV !== \"production\") {\n return getHumanReadableErrorMessage(code, context);\n } else {\n let decodingAdviceMessage = `Solana error #${code}; Decode this error by running \\`npx @solana/errors decode -- ${code}`;\n if (Object.keys(context).length) {\n /**\n * DANGER: Be sure that the shell command is escaped in such a way that makes it\n * impossible for someone to craft malicious context values that would result in\n * an exploit against anyone who bindly copy/pastes it into their terminal.\n */\n decodingAdviceMessage += ` '${encodeContextObject(context)}'`;\n }\n return `${decodingAdviceMessage}\\``;\n }\n}\n","import { SolanaErrorCode, SolanaErrorCodeWithCause, SolanaErrorCodeWithDeprecatedCause } from './codes';\nimport { SolanaErrorContext } from './context';\nimport { getErrorMessage } from './message-formatter';\n\n/**\n * A variant of {@link SolanaError} where the `cause` property is deprecated.\n *\n * This type is returned by {@link isSolanaError} when checking for error codes in\n * {@link SolanaErrorCodeWithDeprecatedCause}. Accessing `cause` on these errors will show\n * a deprecation warning in IDEs that support JSDoc `@deprecated` tags.\n */\nexport interface SolanaErrorWithDeprecatedCause<\n TErrorCode extends SolanaErrorCodeWithDeprecatedCause = SolanaErrorCodeWithDeprecatedCause,\n> extends Omit, 'cause'> {\n /**\n * @deprecated The `cause` property is deprecated for this error code.\n * Use the error's `context` property instead to access relevant error information.\n */\n readonly cause?: unknown;\n}\n\n/**\n * A type guard that returns `true` if the input is a {@link SolanaError}, optionally with a\n * particular error code.\n *\n * When the `code` argument is supplied and the input is a {@link SolanaError}, TypeScript will\n * refine the error's {@link SolanaError#context | `context`} property to the type associated with\n * that error code. You can use that context to render useful error messages, or to make\n * context-aware decisions that help your application to recover from the error.\n *\n * @example\n * ```ts\n * import {\n * SOLANA_ERROR__TRANSACTION__MISSING_SIGNATURE,\n * SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING,\n * isSolanaError,\n * } from '@solana/errors';\n * import { assertIsFullySignedTransaction, getSignatureFromTransaction } from '@solana/transactions';\n *\n * try {\n * const transactionSignature = getSignatureFromTransaction(tx);\n * assertIsFullySignedTransaction(tx);\n * /* ... *\\/\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING)) {\n * displayError(\n * \"We can't send this transaction without signatures for these addresses:\\n- %s\",\n * // The type of the `context` object is now refined to contain `addresses`.\n * e.context.addresses.join('\\n- '),\n * );\n * return;\n * } else if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING)) {\n * if (!tx.feePayer) {\n * displayError('Choose a fee payer for this transaction before sending it');\n * } else {\n * displayError('The fee payer still needs to sign for this transaction');\n * }\n * return;\n * }\n * throw e;\n * }\n * ```\n */\nexport function isSolanaError(\n e: unknown,\n code: TErrorCode,\n): e is SolanaErrorWithDeprecatedCause;\nexport function isSolanaError(\n e: unknown,\n code?: TErrorCode,\n): e is SolanaError;\nexport function isSolanaError(\n e: unknown,\n /**\n * When supplied, this function will require that the input is a {@link SolanaError} _and_ that\n * its error code is exactly this value.\n */\n code?: TErrorCode,\n): e is SolanaError {\n const isSolanaError = e instanceof Error && e.name === 'SolanaError';\n if (isSolanaError) {\n if (code !== undefined) {\n return (e as SolanaError).context.__code === code;\n }\n return true;\n }\n return false;\n}\n\ntype SolanaErrorCodedContext = {\n [P in SolanaErrorCode]: Readonly<{\n __code: P;\n }> &\n (SolanaErrorContext[P] extends undefined ? object : SolanaErrorContext[P]);\n};\n\n/**\n * Encapsulates an error's stacktrace, a Solana-specific numeric code that indicates what went\n * wrong, and optional context if the type of error indicated by the code supports it.\n */\nexport class SolanaError extends Error {\n /**\n * Indicates the root cause of this {@link SolanaError}, if any.\n *\n * For example, a transaction error might have an instruction error as its root cause. In this\n * case, you will be able to access the instruction error on the transaction error as `cause`.\n */\n readonly cause?: TErrorCode extends SolanaErrorCodeWithCause ? SolanaError : unknown = this.cause;\n /**\n * Contains context that can assist in understanding or recovering from a {@link SolanaError}.\n */\n readonly context: SolanaErrorCodedContext[TErrorCode];\n constructor(\n ...[code, contextAndErrorOptions]: SolanaErrorContext[TErrorCode] extends undefined\n ? [code: TErrorCode, errorOptions?: ErrorOptions | undefined]\n : [code: TErrorCode, contextAndErrorOptions: SolanaErrorContext[TErrorCode] & (ErrorOptions | undefined)]\n ) {\n let context: SolanaErrorContext[TErrorCode] | undefined;\n let errorOptions: ErrorOptions | undefined;\n if (contextAndErrorOptions) {\n Object.entries(Object.getOwnPropertyDescriptors(contextAndErrorOptions)).forEach(([name, descriptor]) => {\n // If the `ErrorOptions` type ever changes, update this code.\n if (name === 'cause') {\n errorOptions = { cause: descriptor.value };\n } else {\n if (context === undefined) {\n context = {\n __code: code,\n } as unknown as SolanaErrorContext[TErrorCode];\n }\n Object.defineProperty(context, name, descriptor);\n }\n });\n }\n const message = getErrorMessage(code, context);\n super(message, errorOptions);\n this.context = Object.freeze(\n context === undefined\n ? {\n __code: code,\n }\n : context,\n ) as SolanaErrorCodedContext[TErrorCode];\n // This is necessary so that `isSolanaError()` can identify a `SolanaError` without having\n // to import the class for use in an `instanceof` check.\n this.name = 'SolanaError';\n }\n}\n","export function safeCaptureStackTrace(...args: Parameters): void {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n}\n","import { SolanaErrorCode } from './codes';\nimport { SolanaErrorContext } from './context';\nimport { SolanaError } from './error';\nimport { safeCaptureStackTrace } from './stack-trace';\n\ntype Config = Readonly<{\n /**\n * Oh, hello. You might wonder what in tarnation is going on here. Allow us to explain.\n *\n * One of the goals of `@solana/errors` is to allow errors that are not interesting to your\n * application to shake out of your app bundle in production. This means that we must never\n * export large hardcoded maps of error codes/messages.\n *\n * Unfortunately, where instruction and transaction errors from the RPC are concerned, we have\n * no choice but to keep a map between the RPC `rpcEnumError` enum name and its corresponding\n * `SolanaError` code. In the interest of implementing that map in as few bytes of source code\n * as possible, we do the following:\n *\n * 1. Reserve a block of sequential error codes for the enum in question\n * 2. Hardcode the list of enum names in that same order\n * 3. Match the enum error name from the RPC with its index in that list, and reconstruct the\n * `SolanaError` code by adding the `errorCodeBaseOffset` to that index\n */\n errorCodeBaseOffset: number;\n getErrorContext: (\n errorCode: SolanaErrorCode,\n rpcErrorName: string,\n rpcErrorContext?: unknown,\n ) => SolanaErrorContext[SolanaErrorCode];\n orderedErrorNames: string[];\n rpcEnumError: string | { [key: string]: unknown };\n}>;\n\nexport function getSolanaErrorFromRpcError(\n { errorCodeBaseOffset, getErrorContext, orderedErrorNames, rpcEnumError }: Config,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n constructorOpt: Function,\n): SolanaError {\n let rpcErrorName;\n let rpcErrorContext;\n if (typeof rpcEnumError === 'string') {\n rpcErrorName = rpcEnumError;\n } else {\n rpcErrorName = Object.keys(rpcEnumError)[0];\n rpcErrorContext = rpcEnumError[rpcErrorName];\n }\n const codeOffset = orderedErrorNames.indexOf(rpcErrorName);\n const errorCode = (errorCodeBaseOffset + codeOffset) as SolanaErrorCode;\n const errorContext = getErrorContext(errorCode, rpcErrorName, rpcErrorContext);\n const err = new SolanaError(errorCode, errorContext);\n safeCaptureStackTrace(err, constructorOpt);\n return err;\n}\n","import { SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN } from './codes';\nimport { SolanaError } from './error';\nimport { getSolanaErrorFromRpcError } from './rpc-enum-errors';\n\nconst ORDERED_ERROR_NAMES = [\n // Keep synced with RPC source: https://github.com/anza-xyz/solana-sdk/blob/master/instruction-error/src/lib.rs\n // If this list ever gets too large, consider implementing a compression strategy like this:\n // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47\n 'GenericError',\n 'InvalidArgument',\n 'InvalidInstructionData',\n 'InvalidAccountData',\n 'AccountDataTooSmall',\n 'InsufficientFunds',\n 'IncorrectProgramId',\n 'MissingRequiredSignature',\n 'AccountAlreadyInitialized',\n 'UninitializedAccount',\n 'UnbalancedInstruction',\n 'ModifiedProgramId',\n 'ExternalAccountLamportSpend',\n 'ExternalAccountDataModified',\n 'ReadonlyLamportChange',\n 'ReadonlyDataModified',\n 'DuplicateAccountIndex',\n 'ExecutableModified',\n 'RentEpochModified',\n 'NotEnoughAccountKeys',\n 'AccountDataSizeChanged',\n 'AccountNotExecutable',\n 'AccountBorrowFailed',\n 'AccountBorrowOutstanding',\n 'DuplicateAccountOutOfSync',\n 'Custom',\n 'InvalidError',\n 'ExecutableDataModified',\n 'ExecutableLamportChange',\n 'ExecutableAccountNotRentExempt',\n 'UnsupportedProgramId',\n 'CallDepth',\n 'MissingAccount',\n 'ReentrancyNotAllowed',\n 'MaxSeedLengthExceeded',\n 'InvalidSeeds',\n 'InvalidRealloc',\n 'ComputationalBudgetExceeded',\n 'PrivilegeEscalation',\n 'ProgramEnvironmentSetupFailure',\n 'ProgramFailedToComplete',\n 'ProgramFailedToCompile',\n 'Immutable',\n 'IncorrectAuthority',\n 'BorshIoError',\n 'AccountNotRentExempt',\n 'InvalidAccountOwner',\n 'ArithmeticOverflow',\n 'UnsupportedSysvar',\n 'IllegalOwner',\n 'MaxAccountsDataAllocationsExceeded',\n 'MaxAccountsExceeded',\n 'MaxInstructionTraceLengthExceeded',\n 'BuiltinProgramsMustConsumeComputeUnits',\n];\n\nexport function getSolanaErrorFromInstructionError(\n /**\n * The index of the instruction inside the transaction.\n */\n index: bigint | number,\n instructionError: string | { [key: string]: unknown },\n): SolanaError {\n const numberIndex = Number(index);\n return getSolanaErrorFromRpcError(\n {\n errorCodeBaseOffset: 4615001,\n getErrorContext(errorCode, rpcErrorName, rpcErrorContext) {\n if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN) {\n return {\n errorName: rpcErrorName,\n index: numberIndex,\n ...(rpcErrorContext !== undefined ? { instructionErrorContext: rpcErrorContext } : null),\n };\n } else if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM) {\n return {\n code: Number(rpcErrorContext as bigint | number),\n index: numberIndex,\n };\n }\n return { index: numberIndex };\n },\n orderedErrorNames: ORDERED_ERROR_NAMES,\n rpcEnumError: instructionError,\n },\n getSolanaErrorFromInstructionError,\n );\n}\n","import {\n SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED,\n SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN,\n} from './codes';\nimport { SolanaError } from './error';\nimport { getSolanaErrorFromInstructionError } from './instruction-error';\nimport { getSolanaErrorFromRpcError } from './rpc-enum-errors';\n\n/**\n * How to add an error when an entry is added to the RPC `TransactionError` enum:\n *\n * 1. Follow the instructions in `./codes.ts` to add a corresponding Solana error code\n * 2. Add the `TransactionError` enum name in the same order as it appears in `./codes.ts`\n * 3. Add the new error name/code mapping to `./__tests__/transaction-error-test.ts`\n */\nconst ORDERED_ERROR_NAMES = [\n // Keep synced with RPC source: https://github.com/anza-xyz/agave/blob/master/sdk/src/transaction/error.rs\n // If this list ever gets too large, consider implementing a compression strategy like this:\n // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47\n 'AccountInUse',\n 'AccountLoadedTwice',\n 'AccountNotFound',\n 'ProgramAccountNotFound',\n 'InsufficientFundsForFee',\n 'InvalidAccountForFee',\n 'AlreadyProcessed',\n 'BlockhashNotFound',\n // `InstructionError` intentionally omitted; delegated to `getSolanaErrorFromInstructionError`\n 'CallChainTooDeep',\n 'MissingSignatureForFee',\n 'InvalidAccountIndex',\n 'SignatureFailure',\n 'InvalidProgramForExecution',\n 'SanitizeFailure',\n 'ClusterMaintenance',\n 'AccountBorrowOutstanding',\n 'WouldExceedMaxBlockCostLimit',\n 'UnsupportedVersion',\n 'InvalidWritableAccount',\n 'WouldExceedMaxAccountCostLimit',\n 'WouldExceedAccountDataBlockLimit',\n 'TooManyAccountLocks',\n 'AddressLookupTableNotFound',\n 'InvalidAddressLookupTableOwner',\n 'InvalidAddressLookupTableData',\n 'InvalidAddressLookupTableIndex',\n 'InvalidRentPayingAccount',\n 'WouldExceedMaxVoteCostLimit',\n 'WouldExceedAccountDataTotalLimit',\n 'DuplicateInstruction',\n 'InsufficientFundsForRent',\n 'MaxLoadedAccountsDataSizeExceeded',\n 'InvalidLoadedAccountsDataSizeLimit',\n 'ResanitizationNeeded',\n 'ProgramExecutionTemporarilyRestricted',\n 'UnbalancedTransaction',\n];\n\nexport function getSolanaErrorFromTransactionError(transactionError: string | { [key: string]: unknown }): SolanaError {\n if (typeof transactionError === 'object' && 'InstructionError' in transactionError) {\n return getSolanaErrorFromInstructionError(\n ...(transactionError.InstructionError as Parameters),\n );\n }\n return getSolanaErrorFromRpcError(\n {\n errorCodeBaseOffset: 7050001,\n getErrorContext(errorCode, rpcErrorName, rpcErrorContext) {\n if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN) {\n return {\n errorName: rpcErrorName,\n ...(rpcErrorContext !== undefined ? { transactionErrorContext: rpcErrorContext } : null),\n };\n } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION) {\n return {\n index: Number(rpcErrorContext as bigint | number),\n };\n } else if (\n errorCode === SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT ||\n errorCode === SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED\n ) {\n return {\n accountIndex: Number((rpcErrorContext as { account_index: bigint | number }).account_index),\n };\n }\n },\n orderedErrorNames: ORDERED_ERROR_NAMES,\n rpcEnumError: transactionError,\n },\n getSolanaErrorFromTransactionError,\n );\n}\n","import {\n SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR,\n SOLANA_ERROR__JSON_RPC__INVALID_PARAMS,\n SOLANA_ERROR__JSON_RPC__INVALID_REQUEST,\n SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND,\n SOLANA_ERROR__JSON_RPC__PARSE_ERROR,\n SOLANA_ERROR__JSON_RPC__SCAN_ERROR,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION,\n SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,\n SolanaErrorCode,\n} from './codes';\nimport { SolanaErrorContext } from './context';\nimport { SolanaError } from './error';\nimport { safeCaptureStackTrace } from './stack-trace';\nimport { getSolanaErrorFromTransactionError } from './transaction-error';\n\ninterface RpcErrorResponse {\n code: bigint | number;\n data?: unknown;\n message: string;\n}\n\ntype TransactionError = string | { [key: string]: unknown };\n\n/**\n * Keep in sync with https://github.com/anza-xyz/agave/blob/master/rpc-client-types/src/response.rs\n * @hidden\n */\nexport interface RpcSimulateTransactionResult {\n accounts:\n | ({\n data:\n | string // LegacyBinary\n | {\n // Json\n parsed: unknown;\n program: string;\n space: bigint;\n }\n // Binary\n | [encodedBytes: string, encoding: 'base58' | 'base64' | 'base64+zstd' | 'binary' | 'jsonParsed'];\n executable: boolean;\n lamports: bigint;\n owner: string;\n rentEpoch: bigint;\n space?: bigint;\n } | null)[]\n | null;\n err: TransactionError | null;\n // Enabled by `enable_cpi_recording`\n innerInstructions?:\n | {\n index: number;\n instructions: (\n | {\n // Compiled\n accounts: number[];\n data: string;\n programIdIndex: number;\n stackHeight?: number;\n }\n | {\n // Parsed\n parsed: unknown;\n program: string;\n programId: string;\n stackHeight?: number;\n }\n | {\n // PartiallyDecoded\n accounts: string[];\n data: string;\n programId: string;\n stackHeight?: number;\n }\n )[];\n }[]\n | null;\n loadedAccountsDataSize: number | null;\n logs: string[] | null;\n replacementBlockhash: string | null;\n returnData: {\n data: [string, 'base64'];\n programId: string;\n } | null;\n unitsConsumed: bigint | null;\n}\n\nexport function getSolanaErrorFromJsonRpcError(putativeErrorResponse: unknown): SolanaError {\n let out: SolanaError;\n if (isRpcErrorResponse(putativeErrorResponse)) {\n const { code: rawCode, data, message } = putativeErrorResponse;\n const code = Number(rawCode);\n if (code === SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE) {\n const { err, ...preflightErrorContext } = data as RpcSimulateTransactionResult;\n const causeObject = err ? { cause: getSolanaErrorFromTransactionError(err) } : null;\n out = new SolanaError(SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, {\n ...preflightErrorContext,\n ...causeObject,\n });\n } else {\n let errorContext;\n switch (code) {\n case SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR:\n case SOLANA_ERROR__JSON_RPC__INVALID_PARAMS:\n case SOLANA_ERROR__JSON_RPC__INVALID_REQUEST:\n case SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND:\n case SOLANA_ERROR__JSON_RPC__PARSE_ERROR:\n case SOLANA_ERROR__JSON_RPC__SCAN_ERROR:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION:\n // The server supplies no structured data, but rather a pre-formatted message. Put\n // the server message in `context` so as not to completely lose the data. The long\n // term fix for this is to add data to the server responses and modify the\n // messages in `@solana/errors` to be actual format strings.\n errorContext = { __serverMessage: message };\n break;\n default:\n if (typeof data === 'object' && !Array.isArray(data)) {\n errorContext = data;\n }\n }\n out = new SolanaError(code as SolanaErrorCode, errorContext as SolanaErrorContext[SolanaErrorCode]);\n }\n } else {\n const message =\n typeof putativeErrorResponse === 'object' &&\n putativeErrorResponse !== null &&\n 'message' in putativeErrorResponse &&\n typeof putativeErrorResponse.message === 'string'\n ? putativeErrorResponse.message\n : 'Malformed JSON-RPC error with no message attribute';\n out = new SolanaError(SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, { error: putativeErrorResponse, message });\n }\n safeCaptureStackTrace(out, getSolanaErrorFromJsonRpcError);\n return out;\n}\n\nfunction isRpcErrorResponse(value: unknown): value is RpcErrorResponse {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'code' in value &&\n 'message' in value &&\n (typeof value.code === 'number' || typeof value.code === 'bigint') &&\n typeof value.message === 'string'\n );\n}\n","import {\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SolanaErrorCode,\n} from './codes';\nimport { isSolanaError } from './error';\n\n/**\n * Extracts the underlying cause from a simulation-related error.\n *\n * When a transaction simulation fails, the error is often wrapped in a\n * simulation-specific {@link SolanaError}. This function unwraps such errors\n * by returning the `cause` property, giving you access to the actual error\n * that triggered the simulation failure.\n *\n * If the provided error is not a simulation-related error, it is returned unchanged.\n *\n * The following error codes are considered simulation errors:\n * - {@link SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE}\n * - {@link SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT}\n *\n * @param error - The error to unwrap.\n * @return The underlying cause if the error is a simulation error, otherwise the original error.\n *\n * @example\n * Unwrapping a preflight failure to access the root cause.\n * ```ts\n * import { unwrapSimulationError } from '@solana/errors';\n *\n * try {\n * await sendTransaction(signedTransaction);\n * } catch (e) {\n * const cause = unwrapSimulationError(e);\n * console.log('Send transaction failed due to:', cause);\n * }\n * ```\n */\nexport function unwrapSimulationError(error: unknown): unknown {\n const simulationCodes: SolanaErrorCode[] = [\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n ];\n if (isSolanaError(error) && !!error.cause && simulationCodes.includes(error.context.__code)) {\n return error.cause;\n }\n return error;\n}\n","import { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Concatenates an array of `Uint8Array`s into a single `Uint8Array`.\n * Reuses the original byte array when applicable.\n *\n * @param byteArrays - The array of byte arrays to concatenate.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02]);\n * const bytes2 = new Uint8Array([]);\n * const bytes3 = new Uint8Array([0x03, 0x04]);\n * const bytes = mergeBytes([bytes1, bytes2, bytes3]);\n * // ^ [0x01, 0x02, 0x03, 0x04]\n * ```\n */\nexport const mergeBytes = (byteArrays: Uint8Array[]): Uint8Array => {\n const nonEmptyByteArrays = byteArrays.filter(arr => arr.length);\n if (nonEmptyByteArrays.length === 0) {\n return byteArrays.length ? byteArrays[0] : new Uint8Array();\n }\n\n if (nonEmptyByteArrays.length === 1) {\n return nonEmptyByteArrays[0];\n }\n\n const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n nonEmptyByteArrays.forEach(arr => {\n result.set(arr, offset);\n offset += arr.length;\n });\n return result;\n};\n\n/**\n * Pads a `Uint8Array` with zeroes to the specified length.\n * If the array is longer than the specified length, it is returned as-is.\n *\n * @param bytes - The byte array to pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 2);\n * // bytes === paddedBytes\n * ```\n */\nexport function padBytes(bytes: Uint8Array, length: number): Uint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array {\n if (bytes.length >= length) return bytes;\n const paddedBytes = new Uint8Array(length).fill(0);\n paddedBytes.set(bytes);\n return paddedBytes;\n}\n\n/**\n * Fixes a `Uint8Array` to the specified length.\n * If the array is longer than the specified length, it is truncated.\n * If the array is shorter than the specified length, it is padded with zeroes.\n *\n * @param bytes - The byte array to truncate or pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Truncates the byte array to the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // ^ [0x01, 0x02]\n * ```\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // bytes === fixedBytes\n * ```\n */\nexport const fixBytes = (bytes: ReadonlyUint8Array | Uint8Array, length: number): ReadonlyUint8Array | Uint8Array =>\n padBytes(bytes.length <= length ? bytes : bytes.slice(0, length), length);\n\n/**\n * Returns true if and only if the provided `data` byte array contains\n * the provided `bytes` byte array at the specified `offset`.\n *\n * @param data - The byte sequence to search for.\n * @param bytes - The byte array in which to search for `data`.\n * @param offset - The position in `bytes` where the search begins.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const data = new Uint8Array([0x02, 0x03]);\n * containsBytes(bytes, data, 1); // true\n * containsBytes(bytes, data, 2); // false\n * ```\n */\nexport function containsBytes(\n data: ReadonlyUint8Array | Uint8Array,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset: number,\n): boolean {\n const slice = offset === 0 && data.length === bytes.length ? data : data.slice(offset, offset + bytes.length);\n return bytesEqual(slice, bytes);\n}\n\n/**\n * Returns true if and only if the provided `bytes1` and `bytes2` byte arrays are equal.\n *\n * @param bytes1 - The first byte array to compare.\n * @param bytes2 - The second byte array to compare.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const bytes2 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * bytesEqual(bytes1, bytes2); // true\n * ```\n */\nexport function bytesEqual(bytes1: ReadonlyUint8Array | Uint8Array, bytes2: ReadonlyUint8Array | Uint8Array): boolean {\n return bytes1.length === bytes2.length && bytes1.every((value, index) => value === bytes2[index]);\n}\n","import {\n SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH,\n SolanaError,\n} from '@solana/errors';\n\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Defines an offset in bytes.\n */\nexport type Offset = number;\n\n/**\n * An object that can encode a value of type {@link TFrom} into a {@link ReadonlyUint8Array}.\n *\n * This is a common interface for {@link FixedSizeEncoder} and {@link VariableSizeEncoder}.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n *\n * @see {@link FixedSizeEncoder}\n * @see {@link VariableSizeEncoder}\n */\ntype BaseEncoder = {\n /** Encode the provided value and return the encoded bytes directly. */\n readonly encode: (value: TFrom) => ReadonlyUint8Array;\n /**\n * Writes the encoded value into the provided byte array at the given offset.\n * Returns the offset of the next byte after the encoded value.\n */\n readonly write: (value: TFrom, bytes: Uint8Array, offset: Offset) => Offset;\n};\n\n/**\n * An object that can encode a value of type {@link TFrom} into a fixed-size {@link ReadonlyUint8Array}.\n *\n * See {@link Encoder} to learn more about creating and composing encoders.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const encoder: FixedSizeEncoder;\n * const bytes = encoder.encode(42);\n * const size = encoder.fixedSize; // 4\n * ```\n *\n * @see {@link Encoder}\n * @see {@link VariableSizeEncoder}\n */\nexport type FixedSizeEncoder = BaseEncoder & {\n /** The fixed size of the encoded value in bytes. */\n readonly fixedSize: TSize;\n};\n\n/**\n * An object that can encode a value of type {@link TFrom} into a variable-size {@link ReadonlyUint8Array}.\n *\n * See {@link Encoder} to learn more about creating and composing encoders.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n *\n * @example\n * ```ts\n * const encoder: VariableSizeEncoder;\n * const bytes = encoder.encode('hello');\n * const size = encoder.getSizeFromValue('hello');\n * ```\n *\n * @see {@link Encoder}\n * @see {@link FixedSizeEncoder}\n */\nexport type VariableSizeEncoder = BaseEncoder & {\n /** Returns the size of the encoded value in bytes for a given input. */\n readonly getSizeFromValue: (value: TFrom) => number;\n /** The maximum possible size of an encoded value in bytes, if applicable. */\n readonly maxSize?: number;\n};\n\n/**\n * An object that can encode a value of type {@link TFrom} into a {@link ReadonlyUint8Array}.\n *\n * An `Encoder` can be either:\n * - A {@link FixedSizeEncoder}, where all encoded values have the same fixed size.\n * - A {@link VariableSizeEncoder}, where encoded values can vary in size.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @example\n * Encoding a value into a new byte array.\n * ```ts\n * const encoder: Encoder;\n * const bytes = encoder.encode('hello');\n * ```\n *\n * @example\n * Writing the encoded value into an existing byte array.\n * ```ts\n * const encoder: Encoder;\n * const bytes = new Uint8Array(100);\n * const nextOffset = encoder.write('hello', bytes, 20);\n * ```\n *\n * @remarks\n * You may create `Encoders` manually using the {@link createEncoder} function but it is more common\n * to compose multiple `Encoders` together using the various helpers of the `@solana/codecs` package.\n *\n * For instance, here's how you might create an `Encoder` for a `Person` object type that contains\n * a `name` string and an `age` number:\n *\n * ```ts\n * import { getStructEncoder, addEncoderSizePrefix, getUtf8Encoder, getU32Encoder } from '@solana/codecs';\n *\n * type Person = { name: string; age: number };\n * const getPersonEncoder = (): Encoder =>\n * getStructEncoder([\n * ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n * ['age', getU32Encoder()],\n * ]);\n * ```\n *\n * Note that composed `Encoder` types are clever enough to understand whether\n * they are fixed-size or variable-size. In the example above, `getU32Encoder()` is\n * a fixed-size encoder, while `addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())`\n * is a variable-size encoder. This makes the final `Person` encoder a variable-size encoder.\n *\n * @see {@link FixedSizeEncoder}\n * @see {@link VariableSizeEncoder}\n * @see {@link createEncoder}\n */\nexport type Encoder = FixedSizeEncoder | VariableSizeEncoder;\n\n/**\n * An object that can decode a byte array into a value of type {@link TTo}.\n *\n * This is a common interface for {@link FixedSizeDecoder} and {@link VariableSizeDecoder}.\n *\n * @interface\n * @typeParam TTo - The type of the decoded value.\n *\n * @see {@link FixedSizeDecoder}\n * @see {@link VariableSizeDecoder}\n */\ntype BaseDecoder = {\n /** Decodes the provided byte array at the given offset (or zero) and returns the value directly. */\n readonly decode: (bytes: ReadonlyUint8Array | Uint8Array, offset?: Offset) => TTo;\n /**\n * Reads the encoded value from the provided byte array at the given offset.\n * Returns the decoded value and the offset of the next byte after the encoded value.\n */\n readonly read: (bytes: ReadonlyUint8Array | Uint8Array, offset: Offset) => [TTo, Offset];\n};\n\n/**\n * An object that can decode a fixed-size byte array into a value of type {@link TTo}.\n *\n * See {@link Decoder} to learn more about creating and composing decoders.\n *\n * @interface\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const decoder: FixedSizeDecoder;\n * const value = decoder.decode(bytes);\n * const size = decoder.fixedSize; // 4\n * ```\n *\n * @see {@link Decoder}\n * @see {@link VariableSizeDecoder}\n */\nexport type FixedSizeDecoder = BaseDecoder & {\n /** The fixed size of the encoded value in bytes. */\n readonly fixedSize: TSize;\n};\n\n/**\n * An object that can decode a variable-size byte array into a value of type {@link TTo}.\n *\n * See {@link Decoder} to learn more about creating and composing decoders.\n *\n * @interface\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * ```ts\n * const decoder: VariableSizeDecoder;\n * const value = decoder.decode(bytes);\n * ```\n *\n * @see {@link Decoder}\n * @see {@link VariableSizeDecoder}\n */\nexport type VariableSizeDecoder = BaseDecoder & {\n /** The maximum possible size of an encoded value in bytes, if applicable. */\n readonly maxSize?: number;\n};\n\n/**\n * An object that can decode a byte array into a value of type {@link TTo}.\n *\n * An `Decoder` can be either:\n * - A {@link FixedSizeDecoder}, where all byte arrays have the same fixed size.\n * - A {@link VariableSizeDecoder}, where byte arrays can vary in size.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * Getting the decoded value from a byte array.\n * ```ts\n * const decoder: Decoder;\n * const value = decoder.decode(bytes);\n * ```\n *\n * @example\n * Reading the decoded value from a byte array at a specific offset\n * and getting the offset of the next byte to read.\n * ```ts\n * const decoder: Decoder;\n * const [value, nextOffset] = decoder.read('hello', bytes, 20);\n * ```\n *\n * @remarks\n * You may create `Decoders` manually using the {@link createDecoder} function but it is more common\n * to compose multiple `Decoders` together using the various helpers of the `@solana/codecs` package.\n *\n * For instance, here's how you might create an `Decoder` for a `Person` object type that contains\n * a `name` string and an `age` number:\n *\n * ```ts\n * import { getStructDecoder, addDecoderSizePrefix, getUtf8Decoder, getU32Decoder } from '@solana/codecs';\n *\n * type Person = { name: string; age: number };\n * const getPersonDecoder = (): Decoder =>\n * getStructDecoder([\n * ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n * ['age', getU32Decoder()],\n * ]);\n * ```\n *\n * Note that composed `Decoder` types are clever enough to understand whether\n * they are fixed-size or variable-size. In the example above, `getU32Decoder()` is\n * a fixed-size decoder, while `addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())`\n * is a variable-size decoder. This makes the final `Person` decoder a variable-size decoder.\n *\n * @see {@link FixedSizeDecoder}\n * @see {@link VariableSizeDecoder}\n * @see {@link createDecoder}\n */\nexport type Decoder = FixedSizeDecoder | VariableSizeDecoder;\n\n/**\n * An object that can encode and decode a value to and from a fixed-size byte array.\n *\n * See {@link Codec} to learn more about creating and composing codecs.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const codec: FixedSizeCodec;\n * const bytes = codec.encode(42);\n * const value = codec.decode(bytes); // 42n\n * const size = codec.fixedSize; // 8\n * ```\n *\n * @see {@link Codec}\n * @see {@link VariableSizeCodec}\n */\nexport type FixedSizeCodec = FixedSizeDecoder<\n TTo,\n TSize\n> &\n FixedSizeEncoder;\n\n/**\n * An object that can encode and decode a value to and from a variable-size byte array.\n *\n * See {@link Codec} to learn more about creating and composing codecs.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * ```ts\n * const codec: VariableSizeCodec;\n * const bytes = codec.encode(42);\n * const value = codec.decode(bytes); // 42n\n * const size = codec.getSizeFromValue(42);\n * ```\n *\n * @see {@link Codec}\n * @see {@link FixedSizeCodec}\n */\nexport type VariableSizeCodec = VariableSizeDecoder & VariableSizeEncoder;\n\n/**\n * An object that can encode and decode a value to and from a byte array.\n *\n * A `Codec` can be either:\n * - A {@link FixedSizeCodec}, where all encoded values have the same fixed size.\n * - A {@link VariableSizeCodec}, where encoded values can vary in size.\n *\n * @example\n * ```ts\n * const codec: Codec;\n * const bytes = codec.encode('hello');\n * const value = codec.decode(bytes); // 'hello'\n * ```\n *\n * @remarks\n * For convenience, codecs can encode looser types than they decode.\n * That is, type {@link TFrom} can be a superset of type {@link TTo}.\n * For instance, a `Codec` can encode both\n * `bigint` and `number` values, but will always decode to a `bigint`.\n *\n * ```ts\n * const codec: Codec;\n * const bytes = codec.encode(42);\n * const value = codec.decode(bytes); // 42n\n * ```\n *\n * It is worth noting that codecs are the union of encoders and decoders.\n * This means that a `Codec` can be combined from an `Encoder`\n * and a `Decoder` using the {@link combineCodec} function. This is particularly\n * useful for library authors who want to expose all three types of objects to their users.\n *\n * ```ts\n * const encoder: Encoder;\n * const decoder: Decoder;\n * const codec: Codec = combineCodec(encoder, decoder);\n * ```\n *\n * Aside from combining encoders and decoders, codecs can also be created from scratch using\n * the {@link createCodec} function but it is more common to compose multiple codecs together\n * using the various helpers of the `@solana/codecs` package.\n *\n * For instance, here's how you might create a `Codec` for a `Person` object type that contains\n * a `name` string and an `age` number:\n *\n * ```ts\n * import { getStructCodec, addCodecSizePrefix, getUtf8Codec, getU32Codec } from '@solana/codecs';\n *\n * type Person = { name: string; age: number };\n * const getPersonCodec = (): Codec =>\n * getStructCodec([\n * ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],\n * ['age', getU32Codec()],\n * ]);\n * ```\n *\n * Note that composed `Codec` types are clever enough to understand whether\n * they are fixed-size or variable-size. In the example above, `getU32Codec()` is\n * a fixed-size codec, while `addCodecSizePrefix(getUtf8Codec(), getU32Codec())`\n * is a variable-size codec. This makes the final `Person` codec a variable-size codec.\n *\n * @see {@link FixedSizeCodec}\n * @see {@link VariableSizeCodec}\n * @see {@link combineCodec}\n * @see {@link createCodec}\n */\nexport type Codec = FixedSizeCodec | VariableSizeCodec;\n\n/**\n * Gets the encoded size of a given value in bytes using the provided encoder.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @param value - The value to be encoded.\n * @param encoder - The encoder used to determine the encoded size.\n * @returns The size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const fixedSizeEncoder = { fixedSize: 4 };\n * getEncodedSize(123, fixedSizeEncoder); // Returns 4.\n *\n * const variableSizeEncoder = { getSizeFromValue: (value: string) => value.length };\n * getEncodedSize(\"hello\", variableSizeEncoder); // Returns 5.\n * ```\n *\n * @see {@link Encoder}\n */\nexport function getEncodedSize(\n value: TFrom,\n encoder: { fixedSize: number } | { getSizeFromValue: (value: TFrom) => number },\n): number {\n return 'fixedSize' in encoder ? encoder.fixedSize : encoder.getSizeFromValue(value);\n}\n\n/**\n * Creates an `Encoder` by filling in the missing `encode` function using the provided `write` function and\n * either the `fixedSize` property (for {@link FixedSizeEncoder | FixedSizeEncoders}) or\n * the `getSizeFromValue` function (for {@link VariableSizeEncoder | VariableSizeEncoders}).\n *\n * Instead of manually implementing `encode`, this utility leverages the existing `write` function\n * and the size helpers to generate a complete encoder. The provided `encode` method will allocate\n * a new `Uint8Array` of the correct size and use `write` to populate it.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size encoders).\n *\n * @param encoder - An encoder object that implements `write`, but not `encode`.\n * - If the encoder has a `fixedSize` property, it is treated as a {@link FixedSizeEncoder}.\n * - Otherwise, it is treated as a {@link VariableSizeEncoder}.\n *\n * @returns A fully functional `Encoder` with both `write` and `encode` methods.\n *\n * @example\n * Creating a custom fixed-size encoder.\n * ```ts\n * const encoder = createEncoder({\n * fixedSize: 4,\n * write: (value: number, bytes, offset) => {\n * bytes.set(new Uint8Array([value]), offset);\n * return offset + 4;\n * },\n * });\n *\n * const bytes = encoder.encode(42);\n * // 0x2a000000\n * ```\n *\n * @example\n * Creating a custom variable-size encoder:\n * ```ts\n * const encoder = createEncoder({\n * getSizeFromValue: (value: string) => value.length,\n * write: (value: string, bytes, offset) => {\n * const encodedValue = new TextEncoder().encode(value);\n * bytes.set(encodedValue, offset);\n * return offset + encodedValue.length;\n * },\n * });\n *\n * const bytes = encoder.encode(\"hello\");\n * // 0x68656c6c6f\n * ```\n *\n * @remarks\n * Note that, while `createEncoder` is useful for defining more complex encoders, it is more common to compose\n * encoders together using the various helpers and primitives of the `@solana/codecs` package.\n *\n * Here are some alternative examples using codec primitives instead of `createEncoder`.\n *\n * ```ts\n * // Fixed-size encoder for unsigned 32-bit integers.\n * const encoder = getU32Encoder();\n * const bytes = encoder.encode(42);\n * // 0x2a000000\n *\n * // Variable-size encoder for 32-bytes prefixed UTF-8 strings.\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * const bytes = encoder.encode(\"hello\");\n * // 0x0500000068656c6c6f\n *\n * // Variable-size encoder for custom objects.\n * type Person = { name: string; age: number };\n * const encoder: Encoder = getStructEncoder([\n * ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n * ['age', getU32Encoder()],\n * ]);\n * const bytes = encoder.encode({ name: \"Bob\", age: 42 });\n * // 0x03000000426f622a000000\n * ```\n *\n * @see {@link Encoder}\n * @see {@link FixedSizeEncoder}\n * @see {@link VariableSizeEncoder}\n * @see {@link getStructEncoder}\n * @see {@link getU32Encoder}\n * @see {@link getUtf8Encoder}\n * @see {@link addEncoderSizePrefix}\n */\nexport function createEncoder(\n encoder: Omit, 'encode'>,\n): FixedSizeEncoder;\nexport function createEncoder(encoder: Omit, 'encode'>): VariableSizeEncoder;\nexport function createEncoder(\n encoder: Omit, 'encode'> | Omit, 'encode'>,\n): Encoder;\nexport function createEncoder(\n encoder: Omit, 'encode'> | Omit, 'encode'>,\n): Encoder {\n return Object.freeze({\n ...encoder,\n encode: value => {\n const bytes = new Uint8Array(getEncodedSize(value, encoder));\n encoder.write(value, bytes, 0);\n return bytes;\n },\n });\n}\n\n/**\n * Creates a `Decoder` by filling in the missing `decode` function using the provided `read` function.\n *\n * Instead of manually implementing `decode`, this utility leverages the existing `read` function\n * and the size properties to generate a complete decoder. The provided `decode` method will read\n * from a `Uint8Array` at the given offset and return the decoded value.\n *\n * If the `fixedSize` property is provided, a {@link FixedSizeDecoder} will be created, otherwise\n * a {@link VariableSizeDecoder} will be created.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size decoders).\n *\n * @param decoder - A decoder object that implements `read`, but not `decode`.\n * - If the decoder has a `fixedSize` property, it is treated as a {@link FixedSizeDecoder}.\n * - Otherwise, it is treated as a {@link VariableSizeDecoder}.\n *\n * @returns A fully functional `Decoder` with both `read` and `decode` methods.\n *\n * @example\n * Creating a custom fixed-size decoder.\n * ```ts\n * const decoder = createDecoder({\n * fixedSize: 4,\n * read: (bytes, offset) => {\n * const value = bytes[offset];\n * return [value, offset + 4];\n * },\n * });\n *\n * const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));\n * // 42\n * ```\n *\n * @example\n * Creating a custom variable-size decoder:\n * ```ts\n * const decoder = createDecoder({\n * read: (bytes, offset) => {\n * const decodedValue = new TextDecoder().decode(bytes.subarray(offset));\n * return [decodedValue, bytes.length];\n * },\n * });\n *\n * const value = decoder.decode(new Uint8Array([104, 101, 108, 108, 111]));\n * // \"hello\"\n * ```\n *\n * @remarks\n * Note that, while `createDecoder` is useful for defining more complex decoders, it is more common to compose\n * decoders together using the various helpers and primitives of the `@solana/codecs` package.\n *\n * Here are some alternative examples using codec primitives instead of `createDecoder`.\n *\n * ```ts\n * // Fixed-size decoder for unsigned 32-bit integers.\n * const decoder = getU32Decoder();\n * const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));\n * // 42\n *\n * // Variable-size decoder for 32-bytes prefixed UTF-8 strings.\n * const decoder = addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());\n * const value = decoder.decode(new Uint8Array([5, 0, 0, 0, 104, 101, 108, 108, 111]));\n * // \"hello\"\n *\n * // Variable-size decoder for custom objects.\n * type Person = { name: string; age: number };\n * const decoder: Decoder = getStructDecoder([\n * ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n * ['age', getU32Decoder()],\n * ]);\n * const value = decoder.decode(new Uint8Array([3, 0, 0, 0, 66, 111, 98, 42, 0, 0, 0]));\n * // { name: \"Bob\", age: 42 }\n * ```\n *\n * @see {@link Decoder}\n * @see {@link FixedSizeDecoder}\n * @see {@link VariableSizeDecoder}\n * @see {@link getStructDecoder}\n * @see {@link getU32Decoder}\n * @see {@link getUtf8Decoder}\n * @see {@link addDecoderSizePrefix}\n */\nexport function createDecoder(\n decoder: Omit, 'decode'>,\n): FixedSizeDecoder;\nexport function createDecoder(decoder: Omit, 'decode'>): VariableSizeDecoder;\nexport function createDecoder(\n decoder: Omit, 'decode'> | Omit, 'decode'>,\n): Decoder;\nexport function createDecoder(\n decoder: Omit, 'decode'> | Omit, 'decode'>,\n): Decoder {\n return Object.freeze({\n ...decoder,\n decode: (bytes, offset = 0) => decoder.read(bytes, offset)[0],\n });\n}\n\n/**\n * Creates a `Codec` by filling in the missing `encode` and `decode` functions using the provided `write` and `read` functions.\n *\n * This utility combines the behavior of {@link createEncoder} and {@link createDecoder} to produce a fully functional `Codec`.\n * The `encode` method is derived from the `write` function, while the `decode` method is derived from the `read` function.\n *\n * If the `fixedSize` property is provided, a {@link FixedSizeCodec} will be created, otherwise\n * a {@link VariableSizeCodec} will be created.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size codecs).\n *\n * @param codec - A codec object that implements `write` and `read`, but not `encode` or `decode`.\n * - If the codec has a `fixedSize` property, it is treated as a {@link FixedSizeCodec}.\n * - Otherwise, it is treated as a {@link VariableSizeCodec}.\n *\n * @returns A fully functional `Codec` with `write`, `read`, `encode`, and `decode` methods.\n *\n * @example\n * Creating a custom fixed-size codec.\n * ```ts\n * const codec = createCodec({\n * fixedSize: 4,\n * read: (bytes, offset) => {\n * const value = bytes[offset];\n * return [value, offset + 4];\n * },\n * write: (value: number, bytes, offset) => {\n * bytes.set(new Uint8Array([value]), offset);\n * return offset + 4;\n * },\n * });\n *\n * const bytes = codec.encode(42);\n * // 0x2a000000\n * const value = codec.decode(bytes);\n * // 42\n * ```\n *\n * @example\n * Creating a custom variable-size codec:\n * ```ts\n * const codec = createCodec({\n * getSizeFromValue: (value: string) => value.length,\n * read: (bytes, offset) => {\n * const decodedValue = new TextDecoder().decode(bytes.subarray(offset));\n * return [decodedValue, bytes.length];\n * },\n * write: (value: string, bytes, offset) => {\n * const encodedValue = new TextEncoder().encode(value);\n * bytes.set(encodedValue, offset);\n * return offset + encodedValue.length;\n * },\n * });\n *\n * const bytes = codec.encode(\"hello\");\n * // 0x68656c6c6f\n * const value = codec.decode(bytes);\n * // \"hello\"\n * ```\n *\n * @remarks\n * This function effectively combines the behavior of {@link createEncoder} and {@link createDecoder}.\n * If you only need to encode or decode (but not both), consider using those functions instead.\n *\n * Here are some alternative examples using codec primitives instead of `createCodec`.\n *\n * ```ts\n * // Fixed-size codec for unsigned 32-bit integers.\n * const codec = getU32Codec();\n * const bytes = codec.encode(42);\n * // 0x2a000000\n * const value = codec.decode(bytes);\n * // 42\n *\n * // Variable-size codec for 32-bytes prefixed UTF-8 strings.\n * const codec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const bytes = codec.encode(\"hello\");\n * // 0x0500000068656c6c6f\n * const value = codec.decode(bytes);\n * // \"hello\"\n *\n * // Variable-size codec for custom objects.\n * type Person = { name: string; age: number };\n * const codec: Codec = getStructCodec([\n * ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],\n * ['age', getU32Codec()],\n * ]);\n * const bytes = codec.encode({ name: \"Bob\", age: 42 });\n * // 0x03000000426f622a000000\n * const value = codec.decode(bytes);\n * // { name: \"Bob\", age: 42 }\n * ```\n *\n * @see {@link Codec}\n * @see {@link FixedSizeCodec}\n * @see {@link VariableSizeCodec}\n * @see {@link createEncoder}\n * @see {@link createDecoder}\n * @see {@link getStructCodec}\n * @see {@link getU32Codec}\n * @see {@link getUtf8Codec}\n * @see {@link addCodecSizePrefix}\n */\nexport function createCodec(\n codec: Omit, 'decode' | 'encode'>,\n): FixedSizeCodec;\nexport function createCodec(\n codec: Omit, 'decode' | 'encode'>,\n): VariableSizeCodec;\nexport function createCodec(\n codec:\n | Omit, 'decode' | 'encode'>\n | Omit, 'decode' | 'encode'>,\n): Codec;\nexport function createCodec(\n codec:\n | Omit, 'decode' | 'encode'>\n | Omit, 'decode' | 'encode'>,\n): Codec {\n return Object.freeze({\n ...codec,\n decode: (bytes, offset = 0) => codec.read(bytes, offset)[0],\n encode: value => {\n const bytes = new Uint8Array(getEncodedSize(value, codec));\n codec.write(value, bytes, 0);\n return bytes;\n },\n });\n}\n\n/**\n * Determines whether the given codec, encoder, or decoder is fixed-size.\n *\n * A fixed-size object is identified by the presence of a `fixedSize` property.\n * If this property exists, the object is considered a {@link FixedSizeCodec},\n * {@link FixedSizeEncoder}, or {@link FixedSizeDecoder}.\n * Otherwise, it is assumed to be a {@link VariableSizeCodec},\n * {@link VariableSizeEncoder}, or {@link VariableSizeDecoder}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @returns `true` if the object is fixed-size, `false` otherwise.\n *\n * @example\n * Checking a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * isFixedSize(encoder); // true\n * ```\n *\n * @example\n * Checking a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * isFixedSize(encoder); // false\n * ```\n *\n * @remarks\n * This function is commonly used to distinguish between fixed-size and variable-size objects at runtime.\n * If you need to enforce this distinction with type assertions, consider using {@link assertIsFixedSize}.\n *\n * @see {@link assertIsFixedSize}\n */\nexport function isFixedSize(\n encoder: FixedSizeEncoder | VariableSizeEncoder,\n): encoder is FixedSizeEncoder;\nexport function isFixedSize(\n decoder: FixedSizeDecoder | VariableSizeDecoder,\n): decoder is FixedSizeDecoder;\nexport function isFixedSize(\n codec: FixedSizeCodec | VariableSizeCodec,\n): codec is FixedSizeCodec;\nexport function isFixedSize(\n codec: { fixedSize: TSize } | { maxSize?: number },\n): codec is { fixedSize: TSize };\nexport function isFixedSize(codec: { fixedSize: number } | { maxSize?: number }): codec is { fixedSize: number } {\n return 'fixedSize' in codec && typeof codec.fixedSize === 'number';\n}\n\n/**\n * Asserts that the given codec, encoder, or decoder is fixed-size.\n *\n * If the object is not fixed-size (i.e., it lacks a `fixedSize` property),\n * this function throws a {@link SolanaError} with the code `SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH`.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @throws {SolanaError} If the object is not fixed-size.\n *\n * @example\n * Asserting a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * assertIsFixedSize(encoder); // Passes\n * ```\n *\n * @example\n * Attempting to assert a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * assertIsFixedSize(encoder); // Throws SolanaError\n * ```\n *\n * @remarks\n * This function is the assertion-based counterpart of {@link isFixedSize}.\n * If you only need to check whether an object is fixed-size without throwing an error, use {@link isFixedSize} instead.\n *\n * @see {@link isFixedSize}\n */\nexport function assertIsFixedSize(\n encoder: FixedSizeEncoder | VariableSizeEncoder,\n): asserts encoder is FixedSizeEncoder;\nexport function assertIsFixedSize(\n decoder: FixedSizeDecoder | VariableSizeDecoder,\n): asserts decoder is FixedSizeDecoder;\nexport function assertIsFixedSize(\n codec: FixedSizeCodec | VariableSizeCodec,\n): asserts codec is FixedSizeCodec;\nexport function assertIsFixedSize(\n codec: { fixedSize: TSize } | { maxSize?: number },\n): asserts codec is { fixedSize: TSize };\nexport function assertIsFixedSize(\n codec: { fixedSize: number } | { maxSize?: number },\n): asserts codec is { fixedSize: number } {\n if (!isFixedSize(codec)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH);\n }\n}\n\n/**\n * Determines whether the given codec, encoder, or decoder is variable-size.\n *\n * A variable-size object is identified by the absence of a `fixedSize` property.\n * If this property is missing, the object is considered a {@link VariableSizeCodec},\n * {@link VariableSizeEncoder}, or {@link VariableSizeDecoder}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @returns `true` if the object is variable-size, `false` otherwise.\n *\n * @example\n * Checking a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * isVariableSize(encoder); // true\n * ```\n *\n * @example\n * Checking a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * isVariableSize(encoder); // false\n * ```\n *\n * @remarks\n * This function is the inverse of {@link isFixedSize}.\n *\n * @see {@link isFixedSize}\n * @see {@link assertIsVariableSize}\n */\nexport function isVariableSize(encoder: Encoder): encoder is VariableSizeEncoder;\nexport function isVariableSize(decoder: Decoder): decoder is VariableSizeDecoder;\nexport function isVariableSize(\n codec: Codec,\n): codec is VariableSizeCodec;\nexport function isVariableSize(codec: { fixedSize: number } | { maxSize?: number }): codec is { maxSize?: number };\nexport function isVariableSize(codec: { fixedSize: number } | { maxSize?: number }): codec is { maxSize?: number } {\n return !isFixedSize(codec);\n}\n\n/**\n * Asserts that the given codec, encoder, or decoder is variable-size.\n *\n * If the object is not variable-size (i.e., it has a `fixedSize` property),\n * this function throws a {@link SolanaError} with the code `SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH`.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @throws {SolanaError} If the object is not variable-size.\n *\n * @example\n * Asserting a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * assertIsVariableSize(encoder); // Passes\n * ```\n *\n * @example\n * Attempting to assert a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * assertIsVariableSize(encoder); // Throws SolanaError\n * ```\n *\n * @remarks\n * This function is the assertion-based counterpart of {@link isVariableSize}.\n * If you only need to check whether an object is variable-size without throwing an error, use {@link isVariableSize} instead.\n *\n * Also note that this function is the inverse of {@link assertIsFixedSize}.\n *\n * @see {@link isVariableSize}\n * @see {@link assertIsFixedSize}\n */\nexport function assertIsVariableSize(encoder: Encoder): asserts encoder is VariableSizeEncoder;\nexport function assertIsVariableSize(decoder: Decoder): asserts decoder is VariableSizeDecoder;\nexport function assertIsVariableSize(\n codec: Codec,\n): asserts codec is VariableSizeCodec;\nexport function assertIsVariableSize(\n codec: { fixedSize: number } | { maxSize?: number },\n): asserts codec is { maxSize?: number };\nexport function assertIsVariableSize(\n codec: { fixedSize: number } | { maxSize?: number },\n): asserts codec is { maxSize?: number } {\n if (!isVariableSize(codec)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH);\n }\n}\n","import {\n SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH,\n SolanaError,\n} from '@solana/errors';\n\nimport {\n Codec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\n\n/**\n * Combines an `Encoder` and a `Decoder` into a `Codec`.\n *\n * That is, given a `Encoder` and a `Decoder`, this function returns a `Codec`.\n *\n * This allows for modular composition by keeping encoding and decoding logic separate\n * while still offering a convenient way to bundle them into a single `Codec`.\n * This is particularly useful for library maintainers who want to expose `Encoders`,\n * `Decoders`, and `Codecs` separately, enabling tree-shaking of unused logic.\n *\n * The provided `Encoder` and `Decoder` must be compatible in terms of:\n * - **Fixed Size:** If both are fixed-size, they must have the same `fixedSize` value.\n * - **Variable Size:** If either has a `maxSize` attribute, it must match the other.\n *\n * If these conditions are not met, a {@link SolanaError} will be thrown.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size codecs).\n *\n * @param encoder - The `Encoder` to combine.\n * @param decoder - The `Decoder` to combine.\n * @returns A `Codec` that provides both `encode` and `decode` methods.\n *\n * @throws {SolanaError}\n * - `SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH`\n * Thrown if the encoder and decoder have mismatched size types (fixed vs. variable).\n * - `SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH`\n * Thrown if both are fixed-size but have different `fixedSize` values.\n * - `SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH`\n * Thrown if the `maxSize` attributes do not match.\n *\n * @example\n * Creating a fixed-size `Codec` from an encoder and a decoder.\n * ```ts\n * const encoder = getU32Encoder();\n * const decoder = getU32Decoder();\n * const codec = combineCodec(encoder, decoder);\n *\n * const bytes = codec.encode(42); // 0x2a000000\n * const value = codec.decode(bytes); // 42\n * ```\n *\n * @example\n * Creating a variable-size `Codec` from an encoder and a decoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * const decoder = addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());\n * const codec = combineCodec(encoder, decoder);\n *\n * const bytes = codec.encode(\"hello\"); // 0x0500000068656c6c6f\n * const value = codec.decode(bytes); // \"hello\"\n * ```\n *\n * @remarks\n * The recommended pattern for defining codecs in libraries is to expose separate functions for the encoder, decoder, and codec.\n * This allows users to import only what they need, improving tree-shaking efficiency.\n *\n * ```ts\n * type MyType = \\/* ... *\\/;\n * const getMyTypeEncoder = (): Encoder => { \\/* ... *\\/ };\n * const getMyTypeDecoder = (): Decoder => { \\/* ... *\\/ };\n * const getMyTypeCodec = (): Codec =>\n * combineCodec(getMyTypeEncoder(), getMyTypeDecoder());\n * ```\n *\n * @see {@link Codec}\n * @see {@link Encoder}\n * @see {@link Decoder}\n */\nexport function combineCodec(\n encoder: FixedSizeEncoder,\n decoder: FixedSizeDecoder,\n): FixedSizeCodec;\nexport function combineCodec(\n encoder: VariableSizeEncoder,\n decoder: VariableSizeDecoder,\n): VariableSizeCodec;\nexport function combineCodec(\n encoder: Encoder,\n decoder: Decoder,\n): Codec;\nexport function combineCodec(\n encoder: Encoder,\n decoder: Decoder,\n): Codec {\n if (isFixedSize(encoder) !== isFixedSize(decoder)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH);\n }\n\n if (isFixedSize(encoder) && isFixedSize(decoder) && encoder.fixedSize !== decoder.fixedSize) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, {\n decoderFixedSize: decoder.fixedSize,\n encoderFixedSize: encoder.fixedSize,\n });\n }\n\n if (!isFixedSize(encoder) && !isFixedSize(decoder) && encoder.maxSize !== decoder.maxSize) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, {\n decoderMaxSize: decoder.maxSize,\n encoderMaxSize: encoder.maxSize,\n });\n }\n\n return {\n ...decoder,\n ...encoder,\n decode: decoder.decode,\n encode: encoder.encode,\n read: decoder.read,\n write: encoder.write,\n };\n}\n","import {\n SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL,\n SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES,\n SolanaError,\n} from '@solana/errors';\n\nimport { containsBytes } from './bytes';\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\nimport { combineCodec } from './combine-codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Creates an encoder that writes a `Uint8Array` sentinel after the encoded value.\n * This is useful to delimit the encoded value when being read by a decoder.\n *\n * See {@link addCodecSentinel} for more information.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @see {@link addCodecSentinel}\n */\nexport function addEncoderSentinel(\n encoder: FixedSizeEncoder,\n sentinel: ReadonlyUint8Array,\n): FixedSizeEncoder;\nexport function addEncoderSentinel(\n encoder: Encoder,\n sentinel: ReadonlyUint8Array,\n): VariableSizeEncoder;\nexport function addEncoderSentinel(encoder: Encoder, sentinel: ReadonlyUint8Array): Encoder {\n const write = ((value, bytes, offset) => {\n // Here we exceptionally use the `encode` function instead of the `write`\n // function to contain the content of the encoder within its own bounds\n // and to avoid writing the sentinel as part of the encoded value.\n const encoderBytes = encoder.encode(value);\n if (findSentinelIndex(encoderBytes, sentinel) >= 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, {\n encodedBytes: encoderBytes,\n hexEncodedBytes: hexBytes(encoderBytes),\n hexSentinel: hexBytes(sentinel),\n sentinel,\n });\n }\n bytes.set(encoderBytes, offset);\n offset += encoderBytes.length;\n bytes.set(sentinel, offset);\n offset += sentinel.length;\n return offset;\n }) as Encoder['write'];\n\n if (isFixedSize(encoder)) {\n return createEncoder({ ...encoder, fixedSize: encoder.fixedSize + sentinel.length, write });\n }\n\n return createEncoder({\n ...encoder,\n ...(encoder.maxSize != null ? { maxSize: encoder.maxSize + sentinel.length } : {}),\n getSizeFromValue: value => encoder.getSizeFromValue(value) + sentinel.length,\n write,\n });\n}\n\n/**\n * Creates a decoder that continues reading until\n * a given `Uint8Array` sentinel is found.\n *\n * See {@link addCodecSentinel} for more information.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @see {@link addCodecSentinel}\n */\nexport function addDecoderSentinel(\n decoder: FixedSizeDecoder,\n sentinel: ReadonlyUint8Array,\n): FixedSizeDecoder;\nexport function addDecoderSentinel(decoder: Decoder, sentinel: ReadonlyUint8Array): VariableSizeDecoder;\nexport function addDecoderSentinel(decoder: Decoder, sentinel: ReadonlyUint8Array): Decoder {\n const read = ((bytes, offset) => {\n const candidateBytes = offset === 0 ? bytes : bytes.slice(offset);\n const sentinelIndex = findSentinelIndex(candidateBytes, sentinel);\n if (sentinelIndex === -1) {\n throw new SolanaError(SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, {\n decodedBytes: candidateBytes,\n hexDecodedBytes: hexBytes(candidateBytes),\n hexSentinel: hexBytes(sentinel),\n sentinel,\n });\n }\n const preSentinelBytes = candidateBytes.slice(0, sentinelIndex);\n // Here we exceptionally use the `decode` function instead of the `read`\n // function to contain the content of the decoder within its own bounds\n // and ensure that the sentinel is not part of the decoded value.\n return [decoder.decode(preSentinelBytes), offset + preSentinelBytes.length + sentinel.length];\n }) as Decoder['read'];\n\n if (isFixedSize(decoder)) {\n return createDecoder({ ...decoder, fixedSize: decoder.fixedSize + sentinel.length, read });\n }\n\n return createDecoder({\n ...decoder,\n ...(decoder.maxSize != null ? { maxSize: decoder.maxSize + sentinel.length } : {}),\n read,\n });\n}\n\n/**\n * Creates a Codec that writes a given `Uint8Array` sentinel after the encoded\n * value and, when decoding, continues reading until the sentinel is found.\n *\n * This sets a limit on variable-size codecs and tells us when to stop decoding.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * ```ts\n * const codec = addCodecSentinel(getUtf8Codec(), new Uint8Array([255, 255]));\n * codec.encode('hello');\n * // 0x68656c6c6fffff\n * // | └-- Our sentinel.\n * // └-- Our encoded string.\n * ```\n *\n * @remarks\n * Note that the sentinel _must not_ be present in the encoded data and\n * _must_ be present in the decoded data for this to work.\n * If this is not the case, dedicated errors will be thrown.\n *\n * ```ts\n * const sentinel = new Uint8Array([108, 108]); // 'll'\n * const codec = addCodecSentinel(getUtf8Codec(), sentinel);\n *\n * codec.encode('hello'); // Throws: sentinel is in encoded data.\n * codec.decode(new Uint8Array([1, 2, 3])); // Throws: sentinel missing in decoded data.\n * ```\n *\n * Separate {@link addEncoderSentinel} and {@link addDecoderSentinel} functions are also available.\n *\n * ```ts\n * const bytes = addEncoderSentinel(getUtf8Encoder(), sentinel).encode('hello');\n * const value = addDecoderSentinel(getUtf8Decoder(), sentinel).decode(bytes);\n * ```\n *\n * @see {@link addEncoderSentinel}\n * @see {@link addDecoderSentinel}\n */\nexport function addCodecSentinel(\n codec: FixedSizeCodec,\n sentinel: ReadonlyUint8Array,\n): FixedSizeCodec;\nexport function addCodecSentinel(\n codec: Codec,\n sentinel: ReadonlyUint8Array,\n): VariableSizeCodec;\nexport function addCodecSentinel(\n codec: Codec,\n sentinel: ReadonlyUint8Array,\n): Codec {\n return combineCodec(addEncoderSentinel(codec, sentinel), addDecoderSentinel(codec, sentinel));\n}\n\nfunction findSentinelIndex(bytes: ReadonlyUint8Array, sentinel: ReadonlyUint8Array) {\n return bytes.findIndex((byte, index, arr) => {\n if (sentinel.length === 1) return byte === sentinel[0];\n return containsBytes(arr, sentinel, index);\n });\n}\n\nfunction hexBytes(bytes: ReadonlyUint8Array): string {\n return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n","import {\n SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Asserts that a given byte array is not empty (after the optional provided offset).\n *\n * Returns void if the byte array is not empty but throws a {@link SolanaError} otherwise.\n *\n * @param codecDescription - A description of the codec used by the assertion error.\n * @param bytes - The byte array to check.\n * @param offset - The offset from which to start checking the byte array.\n * If provided, the byte array is considered empty if it has no bytes after the offset.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03]);\n * assertByteArrayIsNotEmptyForCodec('myCodec', bytes); // OK\n * assertByteArrayIsNotEmptyForCodec('myCodec', bytes, 1); // OK\n * assertByteArrayIsNotEmptyForCodec('myCodec', bytes, 3); // Throws\n * ```\n */\nexport function assertByteArrayIsNotEmptyForCodec(\n codecDescription: string,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset = 0,\n) {\n if (bytes.length - offset <= 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, {\n codecDescription,\n });\n }\n}\n\n/**\n * Asserts that a given byte array has enough bytes to decode\n * (after the optional provided offset).\n *\n * Returns void if the byte array has at least the expected number\n * of bytes but throws a {@link SolanaError} otherwise.\n *\n * @param codecDescription - A description of the codec used by the assertion error.\n * @param expected - The minimum number of bytes expected in the byte array.\n * @param bytes - The byte array to check.\n * @param offset - The offset from which to start checking the byte array.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03]);\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 3, bytes); // OK\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 4, bytes); // Throws\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 2, bytes, 1); // OK\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 3, bytes, 1); // Throws\n * ```\n */\nexport function assertByteArrayHasEnoughBytesForCodec(\n codecDescription: string,\n expected: number,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset = 0,\n) {\n const bytesLength = bytes.length - offset;\n if (bytesLength < expected) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, {\n bytesLength,\n codecDescription,\n expected,\n });\n }\n}\n\n/**\n * Asserts that a given offset is within the byte array bounds.\n * This range is between 0 and the byte array length and is inclusive.\n * An offset equals to the byte array length is considered a valid offset\n * as it allows the post-offset of codecs to signal the end of the byte array.\n *\n * @param codecDescription - A description of the codec used by the assertion error.\n * @param offset - The offset to check.\n * @param bytesLength - The length of the byte array from which the offset should be within bounds.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03]);\n * assertByteArrayOffsetIsNotOutOfRange('myCodec', 0, bytes.length); // OK\n * assertByteArrayOffsetIsNotOutOfRange('myCodec', 3, bytes.length); // OK\n * assertByteArrayOffsetIsNotOutOfRange('myCodec', 4, bytes.length); // Throws\n * ```\n */\nexport function assertByteArrayOffsetIsNotOutOfRange(codecDescription: string, offset: number, bytesLength: number) {\n if (offset < 0 || offset > bytesLength) {\n throw new SolanaError(SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, {\n bytesLength,\n codecDescription,\n offset,\n });\n }\n}\n","import { assertByteArrayHasEnoughBytesForCodec } from './assertions';\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n isFixedSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\nimport { combineCodec } from './combine-codec';\n\ntype NumberEncoder = Encoder | Encoder;\ntype FixedSizeNumberEncoder =\n | FixedSizeEncoder\n | FixedSizeEncoder;\ntype NumberDecoder = Decoder | Decoder;\ntype FixedSizeNumberDecoder =\n | FixedSizeDecoder\n | FixedSizeDecoder;\ntype NumberCodec = Codec | Codec;\ntype FixedSizeNumberCodec =\n | FixedSizeCodec\n | FixedSizeCodec;\n\n/**\n * Stores the size of the `encoder` in bytes as a prefix using the `prefix` encoder.\n *\n * See {@link addCodecSizePrefix} for more information.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @see {@link addCodecSizePrefix}\n */\nexport function addEncoderSizePrefix(\n encoder: FixedSizeEncoder,\n prefix: FixedSizeNumberEncoder,\n): FixedSizeEncoder;\nexport function addEncoderSizePrefix(encoder: Encoder, prefix: NumberEncoder): VariableSizeEncoder;\nexport function addEncoderSizePrefix(encoder: Encoder, prefix: NumberEncoder): Encoder {\n const write = ((value, bytes, offset) => {\n // Here we exceptionally use the `encode` function instead of the `write`\n // function to contain the content of the encoder within its own bounds.\n const encoderBytes = encoder.encode(value);\n offset = prefix.write(encoderBytes.length, bytes, offset);\n bytes.set(encoderBytes, offset);\n return offset + encoderBytes.length;\n }) as Encoder['write'];\n\n if (isFixedSize(prefix) && isFixedSize(encoder)) {\n return createEncoder({ ...encoder, fixedSize: prefix.fixedSize + encoder.fixedSize, write });\n }\n\n const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : (prefix.maxSize ?? null);\n const encoderMaxSize = isFixedSize(encoder) ? encoder.fixedSize : (encoder.maxSize ?? null);\n const maxSize = prefixMaxSize !== null && encoderMaxSize !== null ? prefixMaxSize + encoderMaxSize : null;\n\n return createEncoder({\n ...encoder,\n ...(maxSize !== null ? { maxSize } : {}),\n getSizeFromValue: value => {\n const encoderSize = getEncodedSize(value, encoder);\n return getEncodedSize(encoderSize, prefix) + encoderSize;\n },\n write,\n });\n}\n\n/**\n * Bounds the size of the nested `decoder` by reading its encoded `prefix`.\n *\n * See {@link addCodecSizePrefix} for more information.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @see {@link addCodecSizePrefix}\n */\nexport function addDecoderSizePrefix(\n decoder: FixedSizeDecoder,\n prefix: FixedSizeNumberDecoder,\n): FixedSizeDecoder;\nexport function addDecoderSizePrefix(decoder: Decoder, prefix: NumberDecoder): VariableSizeDecoder;\nexport function addDecoderSizePrefix(decoder: Decoder, prefix: NumberDecoder): Decoder {\n const read = ((bytes, offset) => {\n const [bigintSize, decoderOffset] = prefix.read(bytes, offset);\n const size = Number(bigintSize);\n offset = decoderOffset;\n // Slice the byte array to the contained size if necessary.\n if (offset > 0 || bytes.length > size) {\n bytes = bytes.slice(offset, offset + size);\n }\n assertByteArrayHasEnoughBytesForCodec('addDecoderSizePrefix', size, bytes);\n // Here we exceptionally use the `decode` function instead of the `read`\n // function to contain the content of the decoder within its own bounds.\n return [decoder.decode(bytes), offset + size];\n }) as Decoder['read'];\n\n if (isFixedSize(prefix) && isFixedSize(decoder)) {\n return createDecoder({ ...decoder, fixedSize: prefix.fixedSize + decoder.fixedSize, read });\n }\n\n const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : (prefix.maxSize ?? null);\n const decoderMaxSize = isFixedSize(decoder) ? decoder.fixedSize : (decoder.maxSize ?? null);\n const maxSize = prefixMaxSize !== null && decoderMaxSize !== null ? prefixMaxSize + decoderMaxSize : null;\n return createDecoder({ ...decoder, ...(maxSize !== null ? { maxSize } : {}), read });\n}\n\n/**\n * Stores the byte size of any given codec as an encoded number prefix.\n *\n * This sets a limit on variable-size codecs and tells us when to stop decoding.\n * When encoding, the size of the encoded data is stored before the encoded data itself.\n * When decoding, the size is read first to know how many bytes to read next.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * For example, say we want to bound a variable-size base-58 string using a `u32` size prefix.\n * Here’s how you can use the `addCodecSizePrefix` function to achieve that.\n *\n * ```ts\n * const getU32Base58Codec = () => addCodecSizePrefix(getBase58Codec(), getU32Codec());\n *\n * getU32Base58Codec().encode('hello world');\n * // 0x0b00000068656c6c6f20776f726c64\n * // | └-- Our encoded base-58 string.\n * // └-- Our encoded u32 size prefix.\n * ```\n *\n * @remarks\n * Separate {@link addEncoderSizePrefix} and {@link addDecoderSizePrefix} functions are also available.\n *\n * ```ts\n * const bytes = addEncoderSizePrefix(getBase58Encoder(), getU32Encoder()).encode('hello');\n * const value = addDecoderSizePrefix(getBase58Decoder(), getU32Decoder()).decode(bytes);\n * ```\n *\n * @see {@link addEncoderSizePrefix}\n * @see {@link addDecoderSizePrefix}\n */\nexport function addCodecSizePrefix(\n codec: FixedSizeCodec,\n prefix: FixedSizeNumberCodec,\n): FixedSizeCodec;\nexport function addCodecSizePrefix(\n codec: Codec,\n prefix: NumberCodec,\n): VariableSizeCodec;\nexport function addCodecSizePrefix(\n codec: Codec,\n prefix: NumberCodec,\n): Codec {\n return combineCodec(addEncoderSizePrefix(codec, prefix), addDecoderSizePrefix(codec, prefix));\n}\n","import { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Converts a `Uint8Array` to an `ArrayBuffer`. If the underlying buffer is a `SharedArrayBuffer`,\n * it will be copied to a non-shared buffer, for safety.\n *\n * @remarks\n * Source: https://stackoverflow.com/questions/37228285/uint8array-to-arraybuffer\n */\nexport function toArrayBuffer(bytes: ReadonlyUint8Array | Uint8Array, offset?: number, length?: number): ArrayBuffer {\n const bytesOffset = bytes.byteOffset + (offset ?? 0);\n const bytesLength = length ?? bytes.byteLength;\n let buffer: ArrayBuffer;\n if (typeof SharedArrayBuffer === 'undefined') {\n buffer = bytes.buffer as ArrayBuffer;\n } else if (bytes.buffer instanceof SharedArrayBuffer) {\n buffer = new ArrayBuffer(bytes.length);\n new Uint8Array(buffer).set(new Uint8Array(bytes));\n } else {\n buffer = bytes.buffer;\n }\n return (bytesOffset === 0 || bytesOffset === -bytes.byteLength) && bytesLength === bytes.byteLength\n ? buffer\n : buffer.slice(bytesOffset, bytesOffset + bytesLength);\n}\n","import { SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, SolanaError } from '@solana/errors';\n\nimport { createDecoder, Decoder } from './codec';\n\n/**\n * Create a {@link Decoder} that asserts that the bytes provided to `decode` or `read` are fully consumed by the inner decoder\n * @param decoder A decoder to wrap\n * @returns A new decoder that will throw if provided with a byte array that it does not fully consume\n *\n * @typeParam T - The type of the decoder\n *\n * @remarks\n * Note that this compares the offset after encoding to the length of the input byte array\n *\n * The `offset` parameter to `decode` and `read` is still considered, and will affect the new offset that is compared to the byte array length\n *\n * The error that is thrown by the returned decoder is a {@link SolanaError} with the code `SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY`\n *\n * @example\n * Create a decoder that decodes a `u32` (4 bytes) and ensures the entire byte array is consumed\n * ```ts\n * const decoder = createDecoderThatUsesExactByteArray(getU32Decoder());\n * decoder.decode(new Uint8Array([0, 0, 0, 0])); // 0\n * decoder.decode(new Uint8Array([0, 0, 0, 0, 0])); // throws\n *\n * // with an offset\n * decoder.decode(new Uint8Array([0, 0, 0, 0, 0]), 1); // 0\n * decoder.decode(new Uint8Array([0, 0, 0, 0, 0, 0]), 1); // throws\n * ```\n */\nexport function createDecoderThatConsumesEntireByteArray(decoder: Decoder): Decoder {\n return createDecoder({\n ...decoder,\n read(bytes, offset) {\n const [value, newOffset] = decoder.read(bytes, offset);\n if (bytes.length > newOffset) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, {\n expectedLength: newOffset,\n numExcessBytes: bytes.length - newOffset,\n });\n }\n return [value, newOffset];\n },\n });\n}\n","import { assertByteArrayHasEnoughBytesForCodec } from './assertions';\nimport { fixBytes } from './bytes';\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n Offset,\n} from './codec';\nimport { combineCodec } from './combine-codec';\n\n/**\n * Creates a fixed-size encoder from a given encoder.\n *\n * The resulting encoder ensures that encoded values always have the specified number of bytes.\n * If the original encoded value is larger than `fixedBytes`, it is truncated.\n * If it is smaller, it is padded with trailing zeroes.\n *\n * For more details, see {@link fixCodecSize}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param encoder - The encoder to wrap into a fixed-size encoder.\n * @param fixedBytes - The fixed number of bytes to write.\n * @returns A `FixedSizeEncoder` that ensures a consistent output size.\n *\n * @example\n * ```ts\n * const encoder = fixEncoderSize(getUtf8Encoder(), 4);\n * encoder.encode(\"Hello\"); // 0x48656c6c (truncated)\n * encoder.encode(\"Hi\"); // 0x48690000 (padded)\n * encoder.encode(\"Hiya\"); // 0x48697961 (same length)\n * ```\n *\n * @remarks\n * If you need a full codec with both encoding and decoding, use {@link fixCodecSize}.\n *\n * @see {@link fixCodecSize}\n * @see {@link fixDecoderSize}\n */\nexport function fixEncoderSize(\n encoder: Encoder,\n fixedBytes: TSize,\n): FixedSizeEncoder {\n return createEncoder({\n fixedSize: fixedBytes,\n write: (value: TFrom, bytes: Uint8Array, offset: Offset) => {\n // Here we exceptionally use the `encode` function instead of the `write`\n // function as using the nested `write` function on a fixed-sized byte\n // array may result in a out-of-bounds error on the nested encoder.\n const variableByteArray = encoder.encode(value);\n const fixedByteArray =\n variableByteArray.length > fixedBytes ? variableByteArray.slice(0, fixedBytes) : variableByteArray;\n bytes.set(fixedByteArray, offset);\n return offset + fixedBytes;\n },\n });\n}\n\n/**\n * Creates a fixed-size decoder from a given decoder.\n *\n * The resulting decoder always reads exactly `fixedBytes` bytes from the input.\n * If the nested decoder is also fixed-size, the bytes are truncated or padded as needed.\n *\n * For more details, see {@link fixCodecSize}.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param decoder - The decoder to wrap into a fixed-size decoder.\n * @param fixedBytes - The fixed number of bytes to read.\n * @returns A `FixedSizeDecoder` that ensures a consistent input size.\n *\n * @example\n * ```ts\n * const decoder = fixDecoderSize(getUtf8Decoder(), 4);\n * decoder.decode(new Uint8Array([72, 101, 108, 108, 111])); // \"Hell\" (truncated)\n * decoder.decode(new Uint8Array([72, 105, 0, 0])); // \"Hi\" (zeroes ignored)\n * decoder.decode(new Uint8Array([72, 105, 121, 97])); // \"Hiya\" (same length)\n * ```\n *\n * @remarks\n * If you need a full codec with both encoding and decoding, use {@link fixCodecSize}.\n *\n * @see {@link fixCodecSize}\n * @see {@link fixEncoderSize}\n */\nexport function fixDecoderSize(\n decoder: Decoder,\n fixedBytes: TSize,\n): FixedSizeDecoder {\n return createDecoder({\n fixedSize: fixedBytes,\n read: (bytes, offset) => {\n assertByteArrayHasEnoughBytesForCodec('fixCodecSize', fixedBytes, bytes, offset);\n // Slice the byte array to the fixed size if necessary.\n if (offset > 0 || bytes.length > fixedBytes) {\n bytes = bytes.slice(offset, offset + fixedBytes);\n }\n // If the nested decoder is fixed-size, pad and truncate the byte array accordingly.\n if (isFixedSize(decoder)) {\n bytes = fixBytes(bytes, decoder.fixedSize);\n }\n // Decode the value using the nested decoder.\n const [value] = decoder.read(bytes, 0);\n return [value, offset + fixedBytes];\n },\n });\n}\n\n/**\n * Creates a fixed-size codec from a given codec.\n *\n * The resulting codec ensures that both encoding and decoding operate on a fixed number of bytes.\n * When encoding:\n * - If the encoded value is larger than `fixedBytes`, it is truncated.\n * - If it is smaller, it is padded with trailing zeroes.\n * - If it is exactly `fixedBytes`, it remains unchanged.\n *\n * When decoding:\n * - Exactly `fixedBytes` bytes are read from the input.\n * - If the nested decoder has a smaller fixed size, bytes are truncated or padded as necessary.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param codec - The codec to wrap into a fixed-size codec.\n * @param fixedBytes - The fixed number of bytes to read/write.\n * @returns A `FixedSizeCodec` that ensures both encoding and decoding conform to a fixed size.\n *\n * @example\n * ```ts\n * const codec = fixCodecSize(getUtf8Codec(), 4);\n *\n * const bytes1 = codec.encode(\"Hello\"); // 0x48656c6c (truncated)\n * const value1 = codec.decode(bytes1); // \"Hell\"\n *\n * const bytes2 = codec.encode(\"Hi\"); // 0x48690000 (padded)\n * const value2 = codec.decode(bytes2); // \"Hi\"\n *\n * const bytes3 = codec.encode(\"Hiya\"); // 0x48697961 (same length)\n * const value3 = codec.decode(bytes3); // \"Hiya\"\n * ```\n *\n * @remarks\n * If you only need to enforce a fixed size for encoding, use {@link fixEncoderSize}.\n * If you only need to enforce a fixed size for decoding, use {@link fixDecoderSize}.\n *\n * ```ts\n * const bytes = fixEncoderSize(getUtf8Encoder(), 4).encode(\"Hiya\");\n * const value = fixDecoderSize(getUtf8Decoder(), 4).decode(bytes);\n * ```\n *\n * @see {@link fixEncoderSize}\n * @see {@link fixDecoderSize}\n */\nexport function fixCodecSize(\n codec: Codec,\n fixedBytes: TSize,\n): FixedSizeCodec {\n return combineCodec(fixEncoderSize(codec, fixedBytes), fixDecoderSize(codec, fixedBytes));\n}\n","import { assertByteArrayOffsetIsNotOutOfRange } from './assertions';\nimport { Codec, createDecoder, createEncoder, Decoder, Encoder, Offset } from './codec';\nimport { combineCodec } from './combine-codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyEncoder = Encoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDecoder = Decoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyCodec = Codec;\n\n/**\n * Configuration object for modifying the offset of an encoder, decoder, or codec.\n *\n * This type defines optional functions for adjusting the **pre-offset** (before encoding/decoding)\n * and the **post-offset** (after encoding/decoding). These functions allow precise control\n * over where data is written or read within a byte array.\n *\n * @property preOffset - A function that modifies the offset before encoding or decoding.\n * @property postOffset - A function that modifies the offset after encoding or decoding.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * };\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes.\n * ```ts\n * const config: OffsetConfig = {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * };\n * ```\n *\n * @example\n * Using both pre-offset and post-offset together.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * postOffset: ({ postOffset }) => postOffset + 4,\n * };\n * ```\n *\n * @see {@link offsetEncoder}\n * @see {@link offsetDecoder}\n * @see {@link offsetCodec}\n */\ntype OffsetConfig = {\n postOffset?: PostOffsetFunction;\n preOffset?: PreOffsetFunction;\n};\n\n/**\n * Scope provided to the `preOffset` and `postOffset` functions,\n * containing contextual information about the current encoding or decoding process.\n *\n * The pre-offset function modifies where encoding or decoding begins,\n * while the post-offset function modifies where the next operation continues.\n *\n * @property bytes - The entire byte array being encoded or decoded.\n * @property preOffset - The original offset before encoding or decoding starts.\n * @property wrapBytes - A helper function that wraps offsets around the byte array length.\n *\n * @example\n * Using `wrapBytes` to wrap a negative offset to the end of the byte array.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves to last 4 bytes\n * };\n * ```\n *\n * @example\n * Adjusting the offset dynamically based on the byte array size.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ bytes }) => bytes.length > 10 ? 4 : 2,\n * };\n * ```\n *\n * @see {@link PreOffsetFunction}\n * @see {@link PostOffsetFunction}\n */\ntype PreOffsetFunctionScope = {\n /** The entire byte array. */\n bytes: ReadonlyUint8Array | Uint8Array;\n /** The original offset prior to encode or decode. */\n preOffset: Offset;\n /** Wraps the offset to the byte array length. */\n wrapBytes: (offset: Offset) => Offset;\n};\n\n/**\n * A function that modifies the pre-offset before encoding or decoding.\n *\n * This function is used to adjust the starting position before writing\n * or reading data in a byte array.\n *\n * @param scope - The current encoding or decoding context.\n * @returns The new offset at which encoding or decoding should start.\n *\n * @example\n * Skipping the first 2 bytes before writing or reading.\n * ```ts\n * const preOffset: PreOffsetFunction = ({ preOffset }) => preOffset + 2;\n * ```\n *\n * @example\n * Wrapping the offset to ensure it stays within bounds.\n * ```ts\n * const preOffset: PreOffsetFunction = ({ wrapBytes, preOffset }) => wrapBytes(preOffset + 10);\n * ```\n *\n * @see {@link OffsetConfig}\n * @see {@link PreOffsetFunctionScope}\n */\ntype PreOffsetFunction = (scope: PreOffsetFunctionScope) => Offset;\n\n/**\n * A function that modifies the post-offset after encoding or decoding.\n *\n * This function adjusts where the next encoder or decoder should start\n * after the current operation has completed.\n *\n * @param scope - The current encoding or decoding context, including the modified pre-offset\n * and the original post-offset.\n * @returns The new offset at which the next operation should begin.\n *\n * @example\n * Moving the post-offset forward by 4 bytes.\n * ```ts\n * const postOffset: PostOffsetFunction = ({ postOffset }) => postOffset + 4;\n * ```\n *\n * @example\n * Wrapping the post-offset within the byte array length.\n * ```ts\n * const postOffset: PostOffsetFunction = ({ wrapBytes, postOffset }) => wrapBytes(postOffset);\n * ```\n *\n * @example\n * Ensuring a minimum spacing of 8 bytes between values.\n * ```ts\n * const postOffset: PostOffsetFunction = ({ postOffset, newPreOffset }) =>\n * Math.max(postOffset, newPreOffset + 8);\n * ```\n *\n * @see {@link OffsetConfig}\n * @see {@link PreOffsetFunctionScope}\n */\ntype PostOffsetFunction = (\n scope: PreOffsetFunctionScope & {\n /** The modified offset used to encode or decode. */\n newPreOffset: Offset;\n /** The original offset returned by the encoder or decoder. */\n postOffset: Offset;\n },\n) => Offset;\n\n/**\n * Moves the offset of a given encoder before and/or after encoding.\n *\n * This function allows an encoder to write its encoded value at a different offset\n * than the one originally provided. It supports both pre-offset adjustments\n * (before encoding) and post-offset adjustments (after encoding).\n *\n * The pre-offset function determines where encoding should start, while the\n * post-offset function adjusts where the next encoder should continue writing.\n *\n * For more details, see {@link offsetCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @param encoder - The encoder to adjust.\n * @param config - An object specifying how the offset should be modified.\n * @returns A new encoder with adjusted offsets.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes.\n * ```ts\n * const encoder = offsetEncoder(getU32Encoder(), {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * encoder.write(42, bytes, 0); // Actually written at offset 2\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes.\n * ```ts\n * const encoder = offsetEncoder(getU32Encoder(), {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * const nextOffset = encoder.write(42, bytes, 0); // Next encoder starts at offset 6 instead of 4\n * ```\n *\n * @example\n * Using `wrapBytes` to ensure an offset wraps around the byte array length.\n * ```ts\n * const encoder = offsetEncoder(getU32Encoder(), {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves offset to last 4 bytes of the array\n * });\n * const bytes = new Uint8Array(10);\n * encoder.write(42, bytes, 0); // Writes at bytes.length - 4\n * ```\n *\n * @remarks\n * If you need both encoding and decoding offsets to be adjusted, use {@link offsetCodec}.\n *\n * @see {@link offsetCodec}\n * @see {@link offsetDecoder}\n */\nexport function offsetEncoder(encoder: TEncoder, config: OffsetConfig): TEncoder {\n return createEncoder({\n ...encoder,\n write: (value, bytes, preOffset) => {\n const wrapBytes = (offset: Offset) => modulo(offset, bytes.length);\n const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetEncoder', newPreOffset, bytes.length);\n const postOffset = encoder.write(value, bytes, newPreOffset);\n const newPostOffset = config.postOffset\n ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes })\n : postOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetEncoder', newPostOffset, bytes.length);\n return newPostOffset;\n },\n }) as TEncoder;\n}\n\n/**\n * Moves the offset of a given decoder before and/or after decoding.\n *\n * This function allows a decoder to read its input from a different offset\n * than the one originally provided. It supports both pre-offset adjustments\n * (before decoding) and post-offset adjustments (after decoding).\n *\n * The pre-offset function determines where decoding should start, while the\n * post-offset function adjusts where the next decoder should continue reading.\n *\n * For more details, see {@link offsetCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @param decoder - The decoder to adjust.\n * @param config - An object specifying how the offset should be modified.\n * @returns A new decoder with adjusted offsets.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes.\n * ```ts\n * const decoder = offsetDecoder(getU32Decoder(), {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * });\n * const bytes = new Uint8Array([0, 0, 42, 0]); // Value starts at offset 2\n * decoder.read(bytes, 0); // Actually reads from offset 2\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes.\n * ```ts\n * const decoder = offsetDecoder(getU32Decoder(), {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * });\n * const bytes = new Uint8Array([42, 0, 0, 0]);\n * const [value, nextOffset] = decoder.read(bytes, 0); // Next decoder starts at offset 6 instead of 4\n * ```\n *\n * @example\n * Using `wrapBytes` to read from the last 4 bytes of an array.\n * ```ts\n * const decoder = offsetDecoder(getU32Decoder(), {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves offset to last 4 bytes of the array\n * });\n * const bytes = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 42]); // Value stored at the last 4 bytes\n * decoder.read(bytes, 0); // Reads from bytes.length - 4\n * ```\n *\n * @remarks\n * If you need both encoding and decoding offsets to be adjusted, use {@link offsetCodec}.\n *\n * @see {@link offsetCodec}\n * @see {@link offsetEncoder}\n */\nexport function offsetDecoder(decoder: TDecoder, config: OffsetConfig): TDecoder {\n return createDecoder({\n ...decoder,\n read: (bytes, preOffset) => {\n const wrapBytes = (offset: Offset) => modulo(offset, bytes.length);\n const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetDecoder', newPreOffset, bytes.length);\n const [value, postOffset] = decoder.read(bytes, newPreOffset);\n const newPostOffset = config.postOffset\n ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes })\n : postOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetDecoder', newPostOffset, bytes.length);\n return [value, newPostOffset];\n },\n }) as TDecoder;\n}\n\n/**\n * Moves the offset of a given codec before and/or after encoding and decoding.\n *\n * This function allows a codec to encode and decode values at custom offsets\n * within a byte array. It modifies both the **pre-offset** (where encoding/decoding starts)\n * and the **post-offset** (where the next operation should continue).\n *\n * This is particularly useful when working with structured binary formats\n * that require skipping reserved bytes, inserting padding, or aligning fields at\n * specific locations.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @param codec - The codec to adjust.\n * @param config - An object specifying how the offset should be modified.\n * @returns A new codec with adjusted offsets.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes when encoding and decoding.\n * ```ts\n * const codec = offsetCodec(getU32Codec(), {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * codec.write(42, bytes, 0); // Actually written at offset 2\n * codec.read(bytes, 0); // Actually read from offset 2\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes when encoding and decoding.\n * ```ts\n * const codec = offsetCodec(getU32Codec(), {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * codec.write(42, bytes, 0);\n * // Next encoding starts at offset 6 instead of 4\n * codec.read(bytes, 0);\n * // Next decoding starts at offset 6 instead of 4\n * ```\n *\n * @example\n * Using `wrapBytes` to loop around negative offsets.\n * ```ts\n * const codec = offsetCodec(getU32Codec(), {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves offset to last 4 bytes\n * });\n * const bytes = new Uint8Array(10);\n * codec.write(42, bytes, 0); // Writes at bytes.length - 4\n * codec.read(bytes, 0); // Reads from bytes.length - 4\n * ```\n *\n * @remarks\n * If you only need to adjust offsets for encoding, use {@link offsetEncoder}.\n * If you only need to adjust offsets for decoding, use {@link offsetDecoder}.\n *\n * ```ts\n * const bytes = new Uint8Array(10);\n * offsetEncoder(getU32Encoder(), { preOffset: ({ preOffset }) => preOffset + 2 }).write(42, bytes, 0);\n * const [value] = offsetDecoder(getU32Decoder(), { preOffset: ({ preOffset }) => preOffset + 2 }).read(bytes, 0);\n * ```\n *\n * @see {@link offsetEncoder}\n * @see {@link offsetDecoder}\n */\nexport function offsetCodec(codec: TCodec, config: OffsetConfig): TCodec {\n return combineCodec(offsetEncoder(codec, config), offsetDecoder(codec, config)) as TCodec;\n}\n\n/** A modulo function that handles negative dividends and zero divisors. */\nfunction modulo(dividend: number, divisor: number) {\n if (divisor === 0) return 0;\n return ((dividend % divisor) + divisor) % divisor;\n}\n","import { SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, SolanaError } from '@solana/errors';\n\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n} from './codec';\nimport { combineCodec } from './combine-codec';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyEncoder = Encoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDecoder = Decoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyCodec = Codec;\n\n/**\n * Updates the size of a given encoder.\n *\n * This function modifies the size of an encoder using a provided transformation function.\n * For fixed-size encoders, it updates the `fixedSize` property, and for variable-size\n * encoders, it adjusts the size calculation based on the encoded value.\n *\n * If the new size is negative, an error will be thrown.\n *\n * For more details, see {@link resizeCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The original fixed size of the encoded value.\n * @typeParam TNewSize - The new fixed size after resizing.\n *\n * @param encoder - The encoder whose size will be updated.\n * @param resize - A function that takes the current size and returns the new size.\n * @returns A new encoder with the updated size.\n *\n * @example\n * Increasing the size of a `u16` encoder by 2 bytes.\n * ```ts\n * const encoder = resizeEncoder(getU16Encoder(), size => size + 2);\n * encoder.encode(0xffff); // 0xffff0000 (two extra bytes added)\n * ```\n *\n * @example\n * Shrinking a `u32` encoder to only use 2 bytes.\n * ```ts\n * const encoder = resizeEncoder(getU32Encoder(), () => 2);\n * encoder.fixedSize; // 2\n * ```\n *\n * @see {@link resizeCodec}\n * @see {@link resizeDecoder}\n */\nexport function resizeEncoder(\n encoder: FixedSizeEncoder,\n resize: (size: TSize) => TNewSize,\n): FixedSizeEncoder;\nexport function resizeEncoder(\n encoder: TEncoder,\n resize: (size: number) => number,\n): TEncoder;\nexport function resizeEncoder(\n encoder: TEncoder,\n resize: (size: number) => number,\n): TEncoder {\n if (isFixedSize(encoder)) {\n const fixedSize = resize(encoder.fixedSize);\n if (fixedSize < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n bytesLength: fixedSize,\n codecDescription: 'resizeEncoder',\n });\n }\n return createEncoder({ ...encoder, fixedSize }) as TEncoder;\n }\n return createEncoder({\n ...encoder,\n getSizeFromValue: value => {\n const newSize = resize(encoder.getSizeFromValue(value));\n if (newSize < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n bytesLength: newSize,\n codecDescription: 'resizeEncoder',\n });\n }\n return newSize;\n },\n }) as TEncoder;\n}\n\n/**\n * Updates the size of a given decoder.\n *\n * This function modifies the size of a decoder using a provided transformation function.\n * For fixed-size decoders, it updates the `fixedSize` property to reflect the new size.\n * Variable-size decoders remain unchanged, as their size is determined dynamically.\n *\n * If the new size is negative, an error will be thrown.\n *\n * For more details, see {@link resizeCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The original fixed size of the decoded value.\n * @typeParam TNewSize - The new fixed size after resizing.\n *\n * @param decoder - The decoder whose size will be updated.\n * @param resize - A function that takes the current size and returns the new size.\n * @returns A new decoder with the updated size.\n *\n * @example\n * Expanding a `u16` decoder to read 4 bytes instead of 2.\n * ```ts\n * const decoder = resizeDecoder(getU16Decoder(), size => size + 2);\n * decoder.fixedSize; // 4\n * ```\n *\n * @example\n * Shrinking a `u32` decoder to only read 2 bytes.\n * ```ts\n * const decoder = resizeDecoder(getU32Decoder(), () => 2);\n * decoder.fixedSize; // 2\n * ```\n *\n * @see {@link resizeCodec}\n * @see {@link resizeEncoder}\n */\nexport function resizeDecoder(\n decoder: FixedSizeDecoder,\n resize: (size: TSize) => TNewSize,\n): FixedSizeDecoder;\nexport function resizeDecoder(\n decoder: TDecoder,\n resize: (size: number) => number,\n): TDecoder;\nexport function resizeDecoder(\n decoder: TDecoder,\n resize: (size: number) => number,\n): TDecoder {\n if (isFixedSize(decoder)) {\n const fixedSize = resize(decoder.fixedSize);\n if (fixedSize < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n bytesLength: fixedSize,\n codecDescription: 'resizeDecoder',\n });\n }\n return createDecoder({ ...decoder, fixedSize }) as TDecoder;\n }\n return decoder;\n}\n\n/**\n * Updates the size of a given codec.\n *\n * This function modifies the size of both the codec using a provided\n * transformation function. It is useful for adjusting the allocated byte size for\n * encoding and decoding without altering the underlying data structure.\n *\n * If the new size is negative, an error will be thrown.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The original fixed size of the encoded/decoded value (for fixed-size codecs).\n * @typeParam TNewSize - The new fixed size after resizing (for fixed-size codecs).\n *\n * @param codec - The codec whose size will be updated.\n * @param resize - A function that takes the current size and returns the new size.\n * @returns A new codec with the updated size.\n *\n * @example\n * Expanding a `u16` codec from 2 to 4 bytes.\n * ```ts\n * const codec = resizeCodec(getU16Codec(), size => size + 2);\n * const bytes = codec.encode(0xffff); // 0xffff0000 (two extra bytes added)\n * const value = codec.decode(bytes); // 0xffff (reads original two bytes)\n * ```\n *\n * @example\n * Shrinking a `u32` codec to only use 2 bytes.\n * ```ts\n * const codec = resizeCodec(getU32Codec(), () => 2);\n * codec.fixedSize; // 2\n * ```\n *\n * @remarks\n * If you only need to resize an encoder, use {@link resizeEncoder}.\n * If you only need to resize a decoder, use {@link resizeDecoder}.\n *\n * ```ts\n * const bytes = resizeEncoder(getU32Encoder(), (size) => size + 2).encode(0xffff);\n * const value = resizeDecoder(getU32Decoder(), (size) => size + 2).decode(bytes);\n * ```\n *\n * @see {@link resizeEncoder}\n * @see {@link resizeDecoder}\n */\nexport function resizeCodec(\n codec: FixedSizeCodec,\n resize: (size: TSize) => TNewSize,\n): FixedSizeCodec;\nexport function resizeCodec(codec: TCodec, resize: (size: number) => number): TCodec;\nexport function resizeCodec(codec: TCodec, resize: (size: number) => number): TCodec {\n return combineCodec(resizeEncoder(codec, resize), resizeDecoder(codec, resize)) as TCodec;\n}\n","import { Codec, Decoder, Encoder, Offset } from './codec';\nimport { combineCodec } from './combine-codec';\nimport { offsetDecoder, offsetEncoder } from './offset-codec';\nimport { resizeDecoder, resizeEncoder } from './resize-codec';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyEncoder = Encoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDecoder = Decoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyCodec = Codec;\n\n/**\n * Adds left padding to the given encoder, shifting the encoded value forward\n * by `offset` bytes whilst increasing the size of the encoder accordingly.\n *\n * For more details, see {@link padLeftCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @param encoder - The encoder to pad.\n * @param offset - The number of padding bytes to add before encoding.\n * @returns A new encoder with left padding applied.\n *\n * @example\n * ```ts\n * const encoder = padLeftEncoder(getU16Encoder(), 2);\n * const bytes = encoder.encode(0xffff); // 0x0000ffff (0xffff written at offset 2)\n * ```\n *\n * @see {@link padLeftCodec}\n * @see {@link padLeftDecoder}\n */\nexport function padLeftEncoder(encoder: TEncoder, offset: Offset): TEncoder {\n return offsetEncoder(\n resizeEncoder(encoder, size => size + offset),\n { preOffset: ({ preOffset }) => preOffset + offset },\n );\n}\n\n/**\n * Adds right padding to the given encoder, extending the encoded value by `offset`\n * bytes whilst increasing the size of the encoder accordingly.\n *\n * For more details, see {@link padRightCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @param encoder - The encoder to pad.\n * @param offset - The number of padding bytes to add after encoding.\n * @returns A new encoder with right padding applied.\n *\n * @example\n * ```ts\n * const encoder = padRightEncoder(getU16Encoder(), 2);\n * const bytes = encoder.encode(0xffff); // 0xffff0000 (two extra bytes added at the end)\n * ```\n *\n * @see {@link padRightCodec}\n * @see {@link padRightDecoder}\n */\nexport function padRightEncoder(encoder: TEncoder, offset: Offset): TEncoder {\n return offsetEncoder(\n resizeEncoder(encoder, size => size + offset),\n { postOffset: ({ postOffset }) => postOffset + offset },\n );\n}\n\n/**\n * Adds left padding to the given decoder, shifting the decoding position forward\n * by `offset` bytes whilst increasing the size of the decoder accordingly.\n *\n * For more details, see {@link padLeftCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @param decoder - The decoder to pad.\n * @param offset - The number of padding bytes to skip before decoding.\n * @returns A new decoder with left padding applied.\n *\n * @example\n * ```ts\n * const decoder = padLeftDecoder(getU16Decoder(), 2);\n * const value = decoder.decode(new Uint8Array([0, 0, 0x12, 0x34])); // 0xffff (reads from offset 2)\n * ```\n *\n * @see {@link padLeftCodec}\n * @see {@link padLeftEncoder}\n */\nexport function padLeftDecoder(decoder: TDecoder, offset: Offset): TDecoder {\n return offsetDecoder(\n resizeDecoder(decoder, size => size + offset),\n { preOffset: ({ preOffset }) => preOffset + offset },\n );\n}\n\n/**\n * Adds right padding to the given decoder, extending the post-offset by `offset`\n * bytes whilst increasing the size of the decoder accordingly.\n *\n * For more details, see {@link padRightCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @param decoder - The decoder to pad.\n * @param offset - The number of padding bytes to skip after decoding.\n * @returns A new decoder with right padding applied.\n *\n * @example\n * ```ts\n * const decoder = padRightDecoder(getU16Decoder(), 2);\n * const value = decoder.decode(new Uint8Array([0x12, 0x34, 0, 0])); // 0xffff (ignores trailing bytes)\n * ```\n *\n * @see {@link padRightCodec}\n * @see {@link padRightEncoder}\n */\nexport function padRightDecoder(decoder: TDecoder, offset: Offset): TDecoder {\n return offsetDecoder(\n resizeDecoder(decoder, size => size + offset),\n { postOffset: ({ postOffset }) => postOffset + offset },\n );\n}\n\n/**\n * Adds left padding to the given codec, shifting the encoding and decoding positions\n * forward by `offset` bytes whilst increasing the size of the codec accordingly.\n *\n * This ensures that values are read and written at a later position in the byte array,\n * while the padding bytes remain unused.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @param codec - The codec to pad.\n * @param offset - The number of padding bytes to add before encoding and decoding.\n * @returns A new codec with left padding applied.\n *\n * @example\n * ```ts\n * const codec = padLeftCodec(getU16Codec(), 2);\n * const bytes = codec.encode(0xffff); // 0x0000ffff (0xffff written at offset 2)\n * const value = codec.decode(bytes); // 0xffff (reads from offset 2)\n * ```\n *\n * @remarks\n * If you only need to apply padding for encoding, use {@link padLeftEncoder}.\n * If you only need to apply padding for decoding, use {@link padLeftDecoder}.\n *\n * ```ts\n * const bytes = padLeftEncoder(getU16Encoder(), 2).encode(0xffff);\n * const value = padLeftDecoder(getU16Decoder(), 2).decode(bytes);\n * ```\n *\n * @see {@link padLeftEncoder}\n * @see {@link padLeftDecoder}\n */\nexport function padLeftCodec(codec: TCodec, offset: Offset): TCodec {\n return combineCodec(padLeftEncoder(codec, offset), padLeftDecoder(codec, offset)) as TCodec;\n}\n\n/**\n * Adds right padding to the given codec, extending the encoded and decoded value\n * by `offset` bytes whilst increasing the size of the codec accordingly.\n *\n * The extra bytes remain unused, ensuring that the next operation starts further\n * along the byte array.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @param codec - The codec to pad.\n * @param offset - The number of padding bytes to add after encoding and decoding.\n * @returns A new codec with right padding applied.\n *\n * @example\n * ```ts\n * const codec = padRightCodec(getU16Codec(), 2);\n * const bytes = codec.encode(0xffff); // 0xffff0000 (two extra bytes added)\n * const value = codec.decode(bytes); // 0xffff (ignores padding bytes)\n * ```\n *\n * @remarks\n * If you only need to apply padding for encoding, use {@link padRightEncoder}.\n * If you only need to apply padding for decoding, use {@link padRightDecoder}.\n *\n * ```ts\n * const bytes = padRightEncoder(getU16Encoder(), 2).encode(0xffff);\n * const value = padRightDecoder(getU16Decoder(), 2).decode(bytes);\n * ```\n *\n * @see {@link padRightEncoder}\n * @see {@link padRightDecoder}\n */\nexport function padRightCodec(codec: TCodec, offset: Offset): TCodec {\n return combineCodec(padRightEncoder(codec, offset), padRightDecoder(codec, offset)) as TCodec;\n}\n","import {\n assertIsFixedSize,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n} from './codec';\nimport { combineCodec } from './combine-codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\nfunction copySourceToTargetInReverse(\n source: ReadonlyUint8Array,\n target_WILL_MUTATE: Uint8Array,\n sourceOffset: number,\n sourceLength: number,\n targetOffset: number = 0,\n) {\n while (sourceOffset < --sourceLength) {\n const leftValue = source[sourceOffset];\n target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceLength];\n target_WILL_MUTATE[sourceLength + targetOffset] = leftValue;\n sourceOffset++;\n }\n if (sourceOffset === sourceLength) {\n target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceOffset];\n }\n}\n\n/**\n * Reverses the bytes of a fixed-size encoder.\n *\n * Given a `FixedSizeEncoder`, this function returns a new `FixedSizeEncoder` that\n * reverses the bytes within the fixed-size byte array when encoding.\n *\n * This can be useful to modify endianness or for other byte-order transformations.\n *\n * For more details, see {@link reverseCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param encoder - The fixed-size encoder to reverse.\n * @returns A new encoder that writes bytes in reverse order.\n *\n * @example\n * Encoding a `u16` value in reverse order.\n * ```ts\n * const encoder = reverseEncoder(getU16Encoder({ endian: Endian.Big }));\n * const bytes = encoder.encode(0x1234); // 0x3412 (bytes are flipped)\n * ```\n *\n * @see {@link reverseCodec}\n * @see {@link reverseDecoder}\n */\nexport function reverseEncoder(\n encoder: FixedSizeEncoder,\n): FixedSizeEncoder {\n assertIsFixedSize(encoder);\n return createEncoder({\n ...encoder,\n write: (value: TFrom, bytes, offset) => {\n const newOffset = encoder.write(value, bytes, offset);\n copySourceToTargetInReverse(\n bytes /* source */,\n bytes /* target_WILL_MUTATE */,\n offset /* sourceOffset */,\n offset + encoder.fixedSize /* sourceLength */,\n );\n return newOffset;\n },\n });\n}\n\n/**\n * Reverses the bytes of a fixed-size decoder.\n *\n * Given a `FixedSizeDecoder`, this function returns a new `FixedSizeDecoder` that\n * reverses the bytes within the fixed-size byte array before decoding.\n *\n * This can be useful to modify endianness or for other byte-order transformations.\n *\n * For more details, see {@link reverseCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the decoded value in bytes.\n *\n * @param decoder - The fixed-size decoder to reverse.\n * @returns A new decoder that reads bytes in reverse order.\n *\n * @example\n * Decoding a reversed `u16` value.\n * ```ts\n * const decoder = reverseDecoder(getU16Decoder({ endian: Endian.Big }));\n * const value = decoder.decode(new Uint8Array([0x34, 0x12])); // 0x1234 (bytes are flipped back)\n * ```\n *\n * @see {@link reverseCodec}\n * @see {@link reverseEncoder}\n */\nexport function reverseDecoder(\n decoder: FixedSizeDecoder,\n): FixedSizeDecoder {\n assertIsFixedSize(decoder);\n return createDecoder({\n ...decoder,\n read: (bytes, offset) => {\n const reversedBytes = bytes.slice();\n copySourceToTargetInReverse(\n bytes /* source */,\n reversedBytes /* target_WILL_MUTATE */,\n offset /* sourceOffset */,\n offset + decoder.fixedSize /* sourceLength */,\n );\n return decoder.read(reversedBytes, offset);\n },\n });\n}\n\n/**\n * Reverses the bytes of a fixed-size codec.\n *\n * Given a `FixedSizeCodec`, this function returns a new `FixedSizeCodec` that\n * reverses the bytes within the fixed-size byte array during encoding and decoding.\n *\n * This can be useful to modify endianness or for other byte-order transformations.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded/decoded value in bytes.\n *\n * @param codec - The fixed-size codec to reverse.\n * @returns A new codec that encodes and decodes bytes in reverse order.\n *\n * @example\n * Reversing a `u16` codec.\n * ```ts\n * const codec = reverseCodec(getU16Codec({ endian: Endian.Big }));\n * const bytes = codec.encode(0x1234); // 0x3412 (bytes are flipped)\n * const value = codec.decode(bytes); // 0x1234 (bytes are flipped back)\n * ```\n *\n * @remarks\n * If you only need to reverse an encoder, use {@link reverseEncoder}.\n * If you only need to reverse a decoder, use {@link reverseDecoder}.\n *\n * ```ts\n * const bytes = reverseEncoder(getU16Encoder()).encode(0x1234);\n * const value = reverseDecoder(getU16Decoder()).decode(bytes);\n * ```\n *\n * @see {@link reverseEncoder}\n * @see {@link reverseDecoder}\n */\nexport function reverseCodec(\n codec: FixedSizeCodec,\n): FixedSizeCodec {\n return combineCodec(reverseEncoder(codec), reverseDecoder(codec));\n}\n","import {\n Codec,\n createCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isVariableSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Transforms an encoder by mapping its input values.\n *\n * This function takes an existing `Encoder` and returns an `Encoder`, allowing values of type `B`\n * to be converted into values of type `A` before encoding. The transformation is applied via the `unmap` function.\n *\n * This is useful for handling type conversions, applying default values, or structuring data before encoding.\n *\n * For more details, see {@link transformCodec}.\n *\n * @typeParam TOldFrom - The original type expected by the encoder.\n * @typeParam TNewFrom - The new type that will be transformed before encoding.\n *\n * @param encoder - The encoder to transform.\n * @param unmap - A function that converts values of `TNewFrom` into `TOldFrom` before encoding.\n * @returns A new encoder that accepts `TNewFrom` values and transforms them before encoding.\n *\n * @example\n * Encoding a string by counting its characters and storing the length as a `u32`.\n * ```ts\n * const encoder = transformEncoder(getU32Encoder(), (value: string) => value.length);\n * encoder.encode(\"hello\"); // 0x05000000 (stores length 5)\n * ```\n *\n * @see {@link transformCodec}\n * @see {@link transformDecoder}\n */\nexport function transformEncoder(\n encoder: FixedSizeEncoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): FixedSizeEncoder;\nexport function transformEncoder(\n encoder: VariableSizeEncoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): VariableSizeEncoder;\nexport function transformEncoder(\n encoder: Encoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): Encoder;\nexport function transformEncoder(\n encoder: Encoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): Encoder {\n return createEncoder({\n ...(isVariableSize(encoder)\n ? { ...encoder, getSizeFromValue: (value: TNewFrom) => encoder.getSizeFromValue(unmap(value)) }\n : encoder),\n write: (value: TNewFrom, bytes, offset) => encoder.write(unmap(value), bytes, offset),\n });\n}\n\n/**\n * Transforms a decoder by mapping its output values.\n *\n * This function takes an existing `Decoder` and returns a `Decoder`, allowing values of type `A`\n * to be converted into values of type `B` after decoding. The transformation is applied via the `map` function.\n *\n * This is useful for post-processing, type conversions, or enriching decoded data.\n *\n * For more details, see {@link transformCodec}.\n *\n * @typeParam TOldTo - The original type returned by the decoder.\n * @typeParam TNewTo - The new type that will be transformed after decoding.\n *\n * @param decoder - The decoder to transform.\n * @param map - A function that converts values of `TOldTo` into `TNewTo` after decoding.\n * @returns A new decoder that decodes into `TNewTo`.\n *\n * @example\n * Decoding a stored `u32` length into a string of `'x'` characters.\n * ```ts\n * const decoder = transformDecoder(getU32Decoder(), (length) => 'x'.repeat(length));\n * decoder.decode(new Uint8Array([0x05, 0x00, 0x00, 0x00])); // \"xxxxx\"\n * ```\n *\n * @see {@link transformCodec}\n * @see {@link transformEncoder}\n */\nexport function transformDecoder(\n decoder: FixedSizeDecoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): FixedSizeDecoder;\nexport function transformDecoder(\n decoder: VariableSizeDecoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): VariableSizeDecoder;\nexport function transformDecoder(\n decoder: Decoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Decoder;\nexport function transformDecoder(\n decoder: Decoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Decoder {\n return createDecoder({\n ...decoder,\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const [value, newOffset] = decoder.read(bytes, offset);\n return [map(value, bytes, offset), newOffset];\n },\n });\n}\n\n/**\n * Transforms a codec by mapping its input and output values.\n *\n * This function takes an existing `Codec` and returns a `Codec`, allowing:\n * - Values of type `C` to be transformed into `A` before encoding.\n * - Values of type `B` to be transformed into `D` after decoding.\n *\n * This is useful for adapting codecs to work with different representations, handling default values, or\n * converting between primitive and structured types.\n *\n * @typeParam TOldFrom - The original type expected by the codec.\n * @typeParam TNewFrom - The new type that will be transformed before encoding.\n * @typeParam TOldTo - The original type returned by the codec.\n * @typeParam TNewTo - The new type that will be transformed after decoding.\n *\n * @param codec - The codec to transform.\n * @param unmap - A function that converts values of `TNewFrom` into `TOldFrom` before encoding.\n * @param map - A function that converts values of `TOldTo` into `TNewTo` after decoding (optional).\n * @returns A new codec that encodes `TNewFrom` and decodes into `TNewTo`.\n *\n * @example\n * Mapping a `u32` codec to encode string lengths and decode them into `'x'` characters.\n * ```ts\n * const codec = transformCodec(\n * getU32Codec(),\n * (value: string) => value.length, // Encode string length\n * (length) => 'x'.repeat(length) // Decode length into a string of 'x's\n * );\n *\n * const bytes = codec.encode(\"hello\"); // 0x05000000 (stores length 5)\n * const value = codec.decode(bytes); // \"xxxxx\"\n * ```\n *\n * @remarks\n * If only input transformation is needed, use {@link transformEncoder}.\n * If only output transformation is needed, use {@link transformDecoder}.\n *\n * ```ts\n * const bytes = transformEncoder(getU32Encoder(), (value: string) => value.length).encode(\"hello\");\n * const value = transformDecoder(getU32Decoder(), (length) => 'x'.repeat(length)).decode(bytes);\n * ```\n *\n * @see {@link transformEncoder}\n * @see {@link transformDecoder}\n */\nexport function transformCodec(\n codec: FixedSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n): FixedSizeCodec;\nexport function transformCodec(\n codec: VariableSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n): VariableSizeCodec;\nexport function transformCodec(\n codec: Codec,\n unmap: (value: TNewFrom) => TOldFrom,\n): Codec;\nexport function transformCodec<\n TOldFrom,\n TNewFrom,\n TOldTo extends TOldFrom,\n TNewTo extends TNewFrom,\n TSize extends number,\n>(\n codec: FixedSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): FixedSizeCodec;\nexport function transformCodec(\n codec: VariableSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): VariableSizeCodec;\nexport function transformCodec(\n codec: Codec,\n unmap: (value: TNewFrom) => TOldFrom,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Codec;\nexport function transformCodec(\n codec: Codec,\n unmap: (value: TNewFrom) => TOldFrom,\n map?: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Codec {\n return createCodec({\n ...transformEncoder(codec, unmap),\n read: map ? transformDecoder(codec, map).read : (codec.read as unknown as Decoder['read']),\n });\n}\n","import { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\n/**\n * Asserts that a given string contains only characters from the specified alphabet.\n *\n * This function validates whether a string consists exclusively of characters\n * from the provided `alphabet`. If the validation fails, it throws an error\n * indicating the invalid base string.\n *\n * @param alphabet - The allowed set of characters for the base encoding.\n * @param testValue - The string to validate against the given alphabet.\n * @param givenValue - The original string provided by the user (defaults to `testValue`).\n *\n * @throws {SolanaError} If `testValue` contains characters not present in `alphabet`.\n *\n * @example\n * Validating a base-8 encoded string.\n * ```ts\n * assertValidBaseString('01234567', '123047'); // Passes\n * assertValidBaseString('01234567', '128'); // Throws error\n * ```\n */\nexport function assertValidBaseString(alphabet: string, testValue: string, givenValue = testValue) {\n if (!testValue.match(new RegExp(`^[${alphabet}]*$`))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: alphabet.length,\n value: givenValue,\n });\n }\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidBaseString } from './assertions';\n\n/**\n * Returns an encoder for base-X encoded strings.\n *\n * This encoder serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process involves converting the input string to a numeric value in base-X, then\n * encoding that value into bytes while preserving leading zeroes.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeEncoder` for encoding base-X strings.\n *\n * @example\n * Encoding a base-X string using a custom alphabet.\n * ```ts\n * const encoder = getBaseXEncoder('0123456789abcdef');\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXEncoder = (alphabet: string): VariableSizeEncoder => {\n return createEncoder({\n getSizeFromValue: (value: string): number => {\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) return value.length;\n\n const base10Number = getBigIntFromBaseX(tailChars, alphabet);\n return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2);\n },\n write(value: string, bytes, offset) {\n // Check if the value is valid.\n assertValidBaseString(alphabet, value);\n if (value === '') return offset;\n\n // Handle leading zeroes.\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) {\n bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset);\n return offset + leadingZeroes.length;\n }\n\n // From baseX to base10.\n let base10Number = getBigIntFromBaseX(tailChars, alphabet);\n\n // From base10 to bytes.\n const tailBytes: number[] = [];\n while (base10Number > 0n) {\n tailBytes.unshift(Number(base10Number % 256n));\n base10Number /= 256n;\n }\n\n const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes];\n bytes.set(bytesToAdd, offset);\n return offset + bytesToAdd.length;\n },\n });\n};\n\n/**\n * Returns a decoder for base-X encoded strings.\n *\n * This decoder deserializes base-X encoded strings from a byte array using a custom alphabet.\n * The decoding process converts the byte array into a numeric value in base-10, then\n * maps that value back to characters in the specified base-X alphabet.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeDecoder` for decoding base-X strings.\n *\n * @example\n * Decoding a base-X string using a custom alphabet.\n * ```ts\n * const decoder = getBaseXDecoder('0123456789abcdef');\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXDecoder = (alphabet: string): VariableSizeDecoder => {\n return createDecoder({\n read(rawBytes, offset): [string, number] {\n const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);\n if (bytes.length === 0) return ['', 0];\n\n // Handle leading zeroes.\n let trailIndex = bytes.findIndex(n => n !== 0);\n trailIndex = trailIndex === -1 ? bytes.length : trailIndex;\n const leadingZeroes = alphabet[0].repeat(trailIndex);\n if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length];\n\n // From bytes to base10.\n const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);\n\n // From base10 to baseX.\n const tailChars = getBaseXFromBigInt(base10Number, alphabet);\n\n return [leadingZeroes + tailChars, rawBytes.length];\n },\n });\n};\n\n/**\n * Returns a codec for encoding and decoding base-X strings.\n *\n * This codec serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process converts the input string into a numeric value in base-X, which is then encoded as bytes.\n * The decoding process reverses this transformation to reconstruct the original string.\n *\n * This codec supports leading zeroes by treating the first character of the alphabet as the zero character.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeCodec` for encoding and decoding base-X strings.\n *\n * @example\n * Encoding and decoding a base-X string using a custom alphabet.\n * ```ts\n * const codec = getBaseXCodec('0123456789abcdef');\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-X codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBaseXCodec('0123456789abcdef'), 8);\n * ```\n *\n * If you need a size-prefixed base-X codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBaseXCodec('0123456789abcdef'), getU32Codec());\n * ```\n *\n * Separate {@link getBaseXEncoder} and {@link getBaseXDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBaseXEncoder('0123456789abcdef').encode('deadface');\n * const value = getBaseXDecoder('0123456789abcdef').decode(bytes);\n * ```\n *\n * @see {@link getBaseXEncoder}\n * @see {@link getBaseXDecoder}\n */\nexport const getBaseXCodec = (alphabet: string): VariableSizeCodec =>\n combineCodec(getBaseXEncoder(alphabet), getBaseXDecoder(alphabet));\n\nfunction partitionLeadingZeroes(\n value: string,\n zeroCharacter: string,\n): [leadingZeros: string, tailChars: string | undefined] {\n const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`));\n return [leadingZeros, tailChars];\n}\n\nfunction getBigIntFromBaseX(value: string, alphabet: string): bigint {\n const base = BigInt(alphabet.length);\n let sum = 0n;\n for (const char of value) {\n sum *= base;\n sum += BigInt(alphabet.indexOf(char));\n }\n return sum;\n}\n\nfunction getBaseXFromBigInt(value: bigint, alphabet: string): string {\n const base = BigInt(alphabet.length);\n const tailChars = [];\n while (value > 0n) {\n tailChars.unshift(alphabet[Number(value % base)]);\n value /= base;\n }\n return tailChars.join('');\n}\n","import { getBaseXCodec, getBaseXDecoder, getBaseXEncoder } from './baseX';\n\nconst alphabet = '0123456789';\n\n/**\n * Returns an encoder for base-10 strings.\n *\n * This encoder serializes strings using a base-10 encoding scheme.\n * The output consists of bytes representing the numerical values of the input string.\n *\n * For more details, see {@link getBase10Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-10 strings.\n *\n * @example\n * Encoding a base-10 string.\n * ```ts\n * const encoder = getBase10Encoder();\n * const bytes = encoder.encode('1024'); // 0x0400\n * ```\n *\n * @see {@link getBase10Codec}\n */\nexport const getBase10Encoder = () => getBaseXEncoder(alphabet);\n\n/**\n * Returns a decoder for base-10 strings.\n *\n * This decoder deserializes base-10 encoded strings from a byte array.\n *\n * For more details, see {@link getBase10Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-10 strings.\n *\n * @example\n * Decoding a base-10 string.\n * ```ts\n * const decoder = getBase10Decoder();\n * const value = decoder.decode(new Uint8Array([0x04, 0x00])); // \"1024\"\n * ```\n *\n * @see {@link getBase10Codec}\n */\nexport const getBase10Decoder = () => getBaseXDecoder(alphabet);\n\n/**\n * Returns a codec for encoding and decoding base-10 strings.\n *\n * This codec serializes strings using a base-10 encoding scheme.\n * The output consists of bytes representing the numerical values of the input string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-10 strings.\n *\n * @example\n * Encoding and decoding a base-10 string.\n * ```ts\n * const codec = getBase10Codec();\n * const bytes = codec.encode('1024'); // 0x0400\n * const value = codec.decode(bytes); // \"1024\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-10 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase10Codec(), 5);\n * ```\n *\n * If you need a size-prefixed base-10 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase10Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase10Encoder} and {@link getBase10Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase10Encoder().encode('1024');\n * const value = getBase10Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase10Encoder}\n * @see {@link getBase10Decoder}\n */\nexport const getBase10Codec = () => getBaseXCodec(alphabet);\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\nconst enum HexC {\n ZERO = 48, // 0\n NINE = 57, // 9\n A_UP = 65, // A\n F_UP = 70, // F\n A_LO = 97, // a\n F_LO = 102, // f\n}\n\nconst INVALID_STRING_ERROR_BASE_CONFIG = {\n alphabet: '0123456789abcdef',\n base: 16,\n} as const;\n\nfunction charCodeToBase16(char: number) {\n if (char >= HexC.ZERO && char <= HexC.NINE) return char - HexC.ZERO;\n if (char >= HexC.A_UP && char <= HexC.F_UP) return char - (HexC.A_UP - 10);\n if (char >= HexC.A_LO && char <= HexC.F_LO) return char - (HexC.A_LO - 10);\n}\n\n/**\n * Returns an encoder for base-16 (hexadecimal) strings.\n *\n * This encoder serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-16 strings.\n *\n * @example\n * Encoding a base-16 string.\n * ```ts\n * const encoder = getBase16Encoder();\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Encoder = (): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: string) => Math.ceil(value.length / 2),\n write(value: string, bytes, offset) {\n const len = value.length;\n const al = len / 2;\n if (len === 1) {\n const c = value.charCodeAt(0);\n const n = charCodeToBase16(c);\n if (n === undefined) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n bytes.set([n], offset);\n return 1 + offset;\n }\n const hexBytes = new Uint8Array(al);\n for (let i = 0, j = 0; i < al; i++) {\n const c1 = value.charCodeAt(j++);\n const c2 = value.charCodeAt(j++);\n\n const n1 = charCodeToBase16(c1);\n const n2 = charCodeToBase16(c2);\n if (n1 === undefined || (n2 === undefined && !Number.isNaN(c2))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n hexBytes[i] = !Number.isNaN(c2) ? (n1 << 4) | (n2 ?? 0) : n1;\n }\n\n bytes.set(hexBytes, offset);\n return hexBytes.length + offset;\n },\n });\n\n/**\n * Returns a decoder for base-16 (hexadecimal) strings.\n *\n * This decoder deserializes base-16 encoded strings from a byte array.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-16 strings.\n *\n * @example\n * Decoding a base-16 string.\n * ```ts\n * const decoder = getBase16Decoder();\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Decoder = (): VariableSizeDecoder =>\n createDecoder({\n read(bytes, offset) {\n const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n return [value, bytes.length];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding base-16 (hexadecimal) strings.\n *\n * This codec serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-16 strings.\n *\n * @example\n * Encoding and decoding a base-16 string.\n * ```ts\n * const codec = getBase16Codec();\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-16 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase16Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-16 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase16Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase16Encoder} and {@link getBase16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase16Encoder().encode('deadface');\n * const value = getBase16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase16Encoder}\n * @see {@link getBase16Decoder}\n */\nexport const getBase16Codec = (): VariableSizeCodec => combineCodec(getBase16Encoder(), getBase16Decoder());\n","import { getBaseXCodec, getBaseXDecoder, getBaseXEncoder } from './baseX';\n\nconst alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Returns an encoder for base-58 strings.\n *\n * This encoder serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-58 strings.\n *\n * @example\n * Encoding a base-58 string.\n * ```ts\n * const encoder = getBase58Encoder();\n * const bytes = encoder.encode('heLLo'); // 0x1b6a3070\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Encoder = () => getBaseXEncoder(alphabet);\n\n/**\n * Returns a decoder for base-58 strings.\n *\n * This decoder deserializes base-58 encoded strings from a byte array.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-58 strings.\n *\n * @example\n * Decoding a base-58 string.\n * ```ts\n * const decoder = getBase58Decoder();\n * const value = decoder.decode(new Uint8Array([0x1b, 0x6a, 0x30, 0x70])); // \"heLLo\"\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Decoder = () => getBaseXDecoder(alphabet);\n\n/**\n * Returns a codec for encoding and decoding base-58 strings.\n *\n * This codec serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-58 strings.\n *\n * @example\n * Encoding and decoding a base-58 string.\n * ```ts\n * const codec = getBase58Codec();\n * const bytes = codec.encode('heLLo'); // 0x1b6a3070\n * const value = codec.decode(bytes); // \"heLLo\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-58 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase58Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-58 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase58Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase58Encoder} and {@link getBase58Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase58Encoder().encode('heLLo');\n * const value = getBase58Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase58Encoder}\n * @see {@link getBase58Decoder}\n */\nexport const getBase58Codec = () => getBaseXCodec(alphabet);\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidBaseString } from './assertions';\n\n/**\n * Returns an encoder for base-X encoded strings using bit re-slicing.\n *\n * This encoder serializes strings by dividing the input into custom-sized bit chunks,\n * mapping them to an alphabet, and encoding the result into a byte array.\n * This approach is commonly used for encoding schemes where the alphabet's length is a power of 2,\n * such as base-16 or base-64.\n *\n * For more details, see {@link getBaseXResliceCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @param bits - The number of bits per encoded chunk, typically `log2(alphabet.length)`.\n * @returns A `VariableSizeEncoder` for encoding base-X strings using bit re-slicing.\n *\n * @example\n * Encoding a base-X string using bit re-slicing.\n * ```ts\n * const encoder = getBaseXResliceEncoder('elho', 2);\n * const bytes = encoder.encode('hellolol'); // 0x4aee\n * ```\n *\n * @see {@link getBaseXResliceCodec}\n */\nexport const getBaseXResliceEncoder = (alphabet: string, bits: number): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: string) => Math.floor((value.length * bits) / 8),\n write(value: string, bytes, offset) {\n assertValidBaseString(alphabet, value);\n if (value === '') return offset;\n const charIndices = [...value].map(c => alphabet.indexOf(c));\n const reslicedBytes = reslice(charIndices, bits, 8, false);\n bytes.set(reslicedBytes, offset);\n return reslicedBytes.length + offset;\n },\n });\n\n/**\n * Returns a decoder for base-X encoded strings using bit re-slicing.\n *\n * This decoder deserializes base-X encoded strings by re-slicing the bits of a byte array into\n * custom-sized chunks and mapping them to a specified alphabet.\n * This is typically used for encoding schemes where the alphabet's length is a power of 2,\n * such as base-16 or base-64.\n *\n * For more details, see {@link getBaseXResliceCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @param bits - The number of bits per encoded chunk, typically `log2(alphabet.length)`.\n * @returns A `VariableSizeDecoder` for decoding base-X strings using bit re-slicing.\n *\n * @example\n * Decoding a base-X string using bit re-slicing.\n * ```ts\n * const decoder = getBaseXResliceDecoder('elho', 2);\n * const value = decoder.decode(new Uint8Array([0x4a, 0xee])); // \"hellolol\"\n * ```\n *\n * @see {@link getBaseXResliceCodec}\n */\nexport const getBaseXResliceDecoder = (alphabet: string, bits: number): VariableSizeDecoder =>\n createDecoder({\n read(rawBytes, offset = 0): [string, number] {\n const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);\n if (bytes.length === 0) return ['', rawBytes.length];\n const charIndices = reslice([...bytes], 8, bits, true);\n return [charIndices.map(i => alphabet[i]).join(''), rawBytes.length];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding base-X strings using bit re-slicing.\n *\n * This codec serializes strings by dividing the input into custom-sized bit chunks,\n * mapping them to a given alphabet, and encoding the result into bytes.\n * It is particularly suited for encoding schemes where the alphabet's length is a power of 2,\n * such as base-16 or base-64.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @param bits - The number of bits per encoded chunk, typically `log2(alphabet.length)`.\n * @returns A `VariableSizeCodec` for encoding and decoding base-X strings using bit re-slicing.\n *\n * @example\n * Encoding and decoding a base-X string using bit re-slicing.\n * ```ts\n * const codec = getBaseXResliceCodec('elho', 2);\n * const bytes = codec.encode('hellolol'); // 0x4aee\n * const value = codec.decode(bytes); // \"hellolol\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-X codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBaseXResliceCodec('elho', 2), 8);\n * ```\n *\n * If you need a size-prefixed base-X codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBaseXResliceCodec('elho', 2), getU32Codec());\n * ```\n *\n * Separate {@link getBaseXResliceEncoder} and {@link getBaseXResliceDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBaseXResliceEncoder('elho', 2).encode('hellolol');\n * const value = getBaseXResliceDecoder('elho', 2).decode(bytes);\n * ```\n *\n * @see {@link getBaseXResliceEncoder}\n * @see {@link getBaseXResliceDecoder}\n */\nexport const getBaseXResliceCodec = (alphabet: string, bits: number): VariableSizeCodec =>\n combineCodec(getBaseXResliceEncoder(alphabet, bits), getBaseXResliceDecoder(alphabet, bits));\n\n/** Helper function to reslice the bits inside bytes. */\nfunction reslice(input: number[], inputBits: number, outputBits: number, useRemainder: boolean): number[] {\n const output = [];\n let accumulator = 0;\n let bitsInAccumulator = 0;\n const mask = (1 << outputBits) - 1;\n for (const value of input) {\n accumulator = (accumulator << inputBits) | value;\n bitsInAccumulator += inputBits;\n while (bitsInAccumulator >= outputBits) {\n bitsInAccumulator -= outputBits;\n output.push((accumulator >> bitsInAccumulator) & mask);\n }\n }\n if (useRemainder && bitsInAccumulator > 0) {\n output.push((accumulator << (outputBits - bitsInAccumulator)) & mask);\n }\n return output;\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n toArrayBuffer,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\nimport { assertValidBaseString } from './assertions';\nimport { getBaseXResliceDecoder, getBaseXResliceEncoder } from './baseX-reslice';\n\nconst alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n/**\n * Returns an encoder for base-64 strings.\n *\n * This encoder serializes strings using a base-64 encoding scheme,\n * commonly used for data encoding in URLs, cryptographic keys, and binary-to-text encoding.\n *\n * For more details, see {@link getBase64Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-64 strings.\n *\n * @example\n * Encoding a base-64 string.\n * ```ts\n * const encoder = getBase64Encoder();\n * const bytes = encoder.encode('hello+world'); // 0x85e965a3ec28ae57\n * ```\n *\n * @see {@link getBase64Codec}\n */\nexport const getBase64Encoder = (): VariableSizeEncoder => {\n if (__BROWSER__) {\n return createEncoder({\n getSizeFromValue: (value: string) => {\n try {\n return (atob as Window['atob'])(value).length;\n } catch {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: 64,\n value,\n });\n }\n },\n write(value: string, bytes, offset) {\n try {\n const bytesToAdd = (atob as Window['atob'])(value)\n .split('')\n .map(c => c.charCodeAt(0));\n bytes.set(bytesToAdd, offset);\n return bytesToAdd.length + offset;\n } catch {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: 64,\n value,\n });\n }\n },\n });\n }\n\n if (__NODEJS__) {\n return createEncoder({\n getSizeFromValue: (value: string) => Buffer.from(value, 'base64').length,\n write(value: string, bytes, offset) {\n assertValidBaseString(alphabet, value.replace(/=/g, ''));\n const buffer = Buffer.from(value, 'base64');\n bytes.set(buffer, offset);\n return buffer.length + offset;\n },\n });\n }\n\n return transformEncoder(getBaseXResliceEncoder(alphabet, 6), (value: string): string => value.replace(/=/g, ''));\n};\n\n/**\n * Returns a decoder for base-64 strings.\n *\n * This decoder deserializes base-64 encoded strings from a byte array.\n *\n * For more details, see {@link getBase64Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-64 strings.\n *\n * @example\n * Decoding a base-64 string.\n * ```ts\n * const decoder = getBase64Decoder();\n * const value = decoder.decode(new Uint8Array([0x85, 0xe9, 0x65, 0xa3, 0xec, 0x28, 0xae, 0x57])); // \"hello+world\"\n * ```\n *\n * @see {@link getBase64Codec}\n */\nexport const getBase64Decoder = (): VariableSizeDecoder => {\n if (__BROWSER__) {\n return createDecoder({\n read(bytes, offset = 0) {\n const slice = bytes.slice(offset);\n const value = (btoa as Window['btoa'])(String.fromCharCode(...slice));\n return [value, bytes.length];\n },\n });\n }\n\n if (__NODEJS__) {\n return createDecoder({\n read: (bytes, offset = 0) => [Buffer.from(toArrayBuffer(bytes), offset).toString('base64'), bytes.length],\n });\n }\n\n return transformDecoder(getBaseXResliceDecoder(alphabet, 6), (value: string): string =>\n value.padEnd(Math.ceil(value.length / 4) * 4, '='),\n );\n};\n\n/**\n * Returns a codec for encoding and decoding base-64 strings.\n *\n * This codec serializes strings using a base-64 encoding scheme,\n * commonly used for data encoding in URLs, cryptographic keys, and binary-to-text encoding.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-64 strings.\n *\n * @example\n * Encoding and decoding a base-64 string.\n * ```ts\n * const codec = getBase64Codec();\n * const bytes = codec.encode('hello+world'); // 0x85e965a3ec28ae57\n * const value = codec.decode(bytes); // \"hello+world\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-64 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase64Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-64 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase64Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase64Encoder} and {@link getBase64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase64Encoder().encode('hello+world');\n * const value = getBase64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase64Encoder}\n * @see {@link getBase64Decoder}\n */\nexport const getBase64Codec = (): VariableSizeCodec => combineCodec(getBase64Encoder(), getBase64Decoder());\n","/**\n * Removes all null characters (`\\u0000`) from a string.\n *\n * This function cleans a string by stripping out any null characters,\n * which are often used as padding in fixed-size string encodings.\n *\n * @param value - The string to process.\n * @returns The input string with all null characters removed.\n *\n * @example\n * Removing null characters from a string.\n * ```ts\n * removeNullCharacters('hello\\u0000\\u0000'); // \"hello\"\n * ```\n */\nexport const removeNullCharacters = (value: string) =>\n // eslint-disable-next-line no-control-regex\n value.replace(/\\u0000/g, '');\n\n/**\n * Pads a string with null characters (`\\u0000`) at the end to reach a fixed length.\n *\n * If the input string is shorter than the specified length, it is padded with null characters\n * until it reaches the desired size. If it is already long enough, it remains unchanged.\n *\n * @param value - The string to pad.\n * @param chars - The total length of the resulting string, including padding.\n * @returns The input string padded with null characters up to the specified length.\n *\n * @example\n * Padding a string with null characters.\n * ```ts\n * padNullCharacters('hello', 8); // \"hello\\u0000\\u0000\\u0000\"\n * ```\n */\nexport const padNullCharacters = (value: string, chars: number) => value.padEnd(chars, '\\u0000');\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { TextDecoder, TextEncoder } from '@solana/text-encoding-impl';\n\nimport { removeNullCharacters } from './null-characters';\n\n/**\n * Returns an encoder for UTF-8 strings.\n *\n * This encoder serializes strings using UTF-8 encoding.\n * The encoded output contains as many bytes as needed to represent the string.\n *\n * For more details, see {@link getUtf8Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding UTF-8 strings.\n *\n * @example\n * Encoding a UTF-8 string.\n * ```ts\n * const encoder = getUtf8Encoder();\n * const bytes = encoder.encode('hello'); // 0x68656c6c6f\n * ```\n *\n * @see {@link getUtf8Codec}\n */\nexport const getUtf8Encoder = (): VariableSizeEncoder => {\n let textEncoder: TextEncoder;\n return createEncoder({\n getSizeFromValue: value => (textEncoder ||= new TextEncoder()).encode(value).length,\n write: (value: string, bytes, offset) => {\n const bytesToAdd = (textEncoder ||= new TextEncoder()).encode(value);\n bytes.set(bytesToAdd, offset);\n return offset + bytesToAdd.length;\n },\n });\n};\n\n/**\n * Returns a decoder for UTF-8 strings.\n *\n * This decoder deserializes UTF-8 encoded strings from a byte array.\n * It reads all available bytes starting from the given offset.\n *\n * For more details, see {@link getUtf8Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding UTF-8 strings.\n *\n * @example\n * Decoding a UTF-8 string.\n * ```ts\n * const decoder = getUtf8Decoder();\n * const value = decoder.decode(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f])); // \"hello\"\n * ```\n *\n * @see {@link getUtf8Codec}\n */\nexport const getUtf8Decoder = (): VariableSizeDecoder => {\n let textDecoder: TextDecoder;\n return createDecoder({\n read(bytes, offset) {\n const value = (textDecoder ||= new TextDecoder()).decode(bytes.slice(offset));\n return [removeNullCharacters(value), bytes.length];\n },\n });\n};\n\n/**\n * Returns a codec for encoding and decoding UTF-8 strings.\n *\n * This codec serializes strings using UTF-8 encoding.\n * The encoded output contains as many bytes as needed to represent the string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding UTF-8 strings.\n *\n * @example\n * Encoding and decoding a UTF-8 string.\n * ```ts\n * const codec = getUtf8Codec();\n * const bytes = codec.encode('hello'); // 0x68656c6c6f\n * const value = codec.decode(bytes); // \"hello\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size UTF-8 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getUtf8Codec(), 5);\n * ```\n *\n * If you need a size-prefixed UTF-8 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getUtf8Encoder} and {@link getUtf8Decoder} functions are available.\n *\n * ```ts\n * const bytes = getUtf8Encoder().encode('hello');\n * const value = getUtf8Decoder().decode(bytes);\n * ```\n *\n * @see {@link getUtf8Encoder}\n * @see {@link getUtf8Decoder}\n */\nexport const getUtf8Codec = (): VariableSizeCodec => combineCodec(getUtf8Encoder(), getUtf8Decoder());\n","import type { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport type { Lamports } from '@solana/rpc-types';\n\n/**\n * The number of bytes required to store the {@link BaseAccount} information without its data.\n *\n * @example\n * ```ts\n * const myTotalAccountSize = myAccountDataSize + BASE_ACCOUNT_SIZE;\n * ```\n */\nexport const BASE_ACCOUNT_SIZE = 128;\n\n/**\n * Defines the attributes common to all Solana accounts. Namely, it contains everything stored\n * on-chain except the account data itself.\n *\n * @interface\n *\n * @example\n * ```ts\n * const BaseAccount: BaseAccount = {\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * };\n * ```\n */\nexport type BaseAccount = {\n readonly executable: boolean;\n readonly lamports: Lamports;\n readonly programAddress: Address;\n readonly space: bigint;\n};\n\n/**\n * Contains all the information relevant to a Solana account. It includes the account's address and\n * data, as well as the properties of {@link BaseAccount}.\n *\n * @interface\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * // Encoded\n * const myEncodedAccount: Account = {\n * address: address('1234..5678'),\n * data: new Uint8Array([1, 2, 3]),\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * };\n *\n * // Decoded\n * type MyAccountData = { name: string; age: number };\n * const myDecodedAccount: Account = {\n * address: address('1234..5678'),\n * data: { name: 'Alice', age: 30 },\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * };\n * ```\n */\nexport type Account = BaseAccount & {\n readonly address: Address;\n readonly data: TData;\n};\n\n/**\n * Represents an encoded account and is equivalent to an {@link Account} with `Uint8Array` account\n * data.\n *\n * @interface\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * {\n * address: address('1234..5678'),\n * data: new Uint8Array([1, 2, 3]),\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * } satisfies EncodedAccount<'1234..5678'>;\n * ```\n */\nexport type EncodedAccount = Account;\n","import type { Decoder, ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT,\n SolanaError,\n} from '@solana/errors';\n\nimport type { Account, EncodedAccount } from './account';\nimport type { MaybeAccount, MaybeEncodedAccount } from './maybe-account';\n\n/**\n * Transforms an {@link EncodedAccount} into an {@link Account} (or a {@link MaybeEncodedAccount}\n * into a {@link MaybeAccount}) by decoding the account data using the provided {@link Decoder}\n * instance.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The type of this account's data.\n *\n * @example\n * ```ts\n * type MyAccountData = { name: string; age: number };\n *\n * const myAccount: EncodedAccount<'1234..5678'>;\n * const myDecoder: Decoder = getStructDecoder([\n * ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n * ['age', getU32Decoder()],\n * ]);\n *\n * const myDecodedAccount = decodeAccount(myAccount, myDecoder);\n * myDecodedAccount satisfies Account;\n * ```\n */\nexport function decodeAccount(\n encodedAccount: EncodedAccount,\n decoder: Decoder,\n): Account;\nexport function decodeAccount(\n encodedAccount: MaybeEncodedAccount,\n decoder: Decoder,\n): MaybeAccount;\nexport function decodeAccount(\n encodedAccount: EncodedAccount | MaybeEncodedAccount,\n decoder: Decoder,\n): Account | MaybeAccount {\n try {\n if ('exists' in encodedAccount && !encodedAccount.exists) {\n return encodedAccount;\n }\n return Object.freeze({ ...encodedAccount, data: decoder.decode(encodedAccount.data) });\n } catch {\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, {\n address: encodedAccount.address,\n });\n }\n}\n\nfunction accountExists(account: Account | MaybeAccount): account is Account {\n return !('exists' in account) || ('exists' in account && account.exists);\n}\n\n/**\n * Asserts that an account stores decoded data, ie. not a `Uint8Array`.\n *\n * Note that it does not check the shape of the data matches the decoded type, only that it is not a\n * `Uint8Array`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The type of this account's data.\n *\n * @example\n * ```ts\n * type MyAccountData = { name: string; age: number };\n *\n * const myAccount: Account;\n * assertAccountDecoded(myAccount);\n *\n * // now the account data can be used as MyAccountData\n * account.data satisfies MyAccountData;\n * ```\n *\n * This is particularly useful for narrowing the result of fetching a JSON parsed account.\n *\n * ```ts\n * const account: MaybeAccount = await fetchJsonParsedAccount(\n * rpc,\n * '1234..5678' as Address,\n * );\n *\n * assertAccountDecoded(account);\n * // now we have a MaybeAccount\n * account satisfies MaybeAccount;\n * ```\n */\nexport function assertAccountDecoded(\n account: Account,\n): asserts account is Account;\nexport function assertAccountDecoded(\n account: MaybeAccount,\n): asserts account is MaybeAccount;\nexport function assertAccountDecoded(\n account: Account | MaybeAccount,\n): asserts account is Account | MaybeAccount {\n if (accountExists(account) && account.data instanceof Uint8Array) {\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, {\n address: account.address,\n });\n }\n}\n\n/**\n * Asserts that all input accounts store decoded data, ie. not a `Uint8Array`.\n *\n * As with {@link assertAccountDecoded} it does not check the shape of the data matches the decoded\n * type, only that it is not a `Uint8Array`.\n *\n * @example\n * ```ts\n * type MyAccountData = { name: string; age: number };\n *\n * const myAccounts: Account[];\n * assertAccountsDecoded(myAccounts);\n *\n * // now the account data can be used as MyAccountData\n * for (const a of account) {\n * account.data satisfies MyAccountData;\n * }\n * ```\n */\nexport function assertAccountsDecoded(\n accounts: Account[],\n): asserts accounts is Account[];\nexport function assertAccountsDecoded(\n accounts: MaybeAccount[],\n): asserts accounts is MaybeAccount[];\nexport function assertAccountsDecoded(\n accounts: (Account | MaybeAccount)[],\n): asserts accounts is (Account | MaybeAccount)[] {\n const encoded = accounts.filter(a => accountExists(a) && a.data instanceof Uint8Array);\n if (encoded.length > 0) {\n const encodedAddresses = encoded.map(a => a.address);\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, {\n addresses: encodedAddresses,\n });\n }\n}\n","import type { Address } from '@solana/addresses';\nimport { getBase58Encoder, getBase64Encoder } from '@solana/codecs-strings';\nimport type {\n AccountInfoBase,\n AccountInfoWithBase58Bytes,\n AccountInfoWithBase58EncodedData,\n AccountInfoWithBase64EncodedData,\n} from '@solana/rpc-types';\n\nimport type { Account, BaseAccount, EncodedAccount } from './account';\nimport type { MaybeAccount, MaybeEncodedAccount } from './maybe-account';\nimport type { JsonParsedDataResponse } from './rpc-api';\n\ntype Base64EncodedRpcAccount = AccountInfoBase & AccountInfoWithBase64EncodedData;\n\n/**\n * Parses a base64-encoded account provided by the RPC client into an {@link EncodedAccount} type or\n * a {@link MaybeEncodedAccount} type if the raw data can be set to `null`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * const myAddress = address('1234..5678');\n * const myRpcAccount = await rpc.getAccountInfo(myAddress, { encoding: 'base64' }).send();\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = parseBase64RpcAccount(myRpcAccount);\n * ```\n */\nexport function parseBase64RpcAccount(\n address: Address,\n rpcAccount: Base64EncodedRpcAccount,\n): EncodedAccount;\nexport function parseBase64RpcAccount(\n address: Address,\n rpcAccount: Base64EncodedRpcAccount | null,\n): MaybeEncodedAccount;\nexport function parseBase64RpcAccount(\n address: Address,\n rpcAccount: Base64EncodedRpcAccount | null,\n): EncodedAccount | MaybeEncodedAccount {\n if (!rpcAccount) return Object.freeze({ address, exists: false });\n const data = getBase64Encoder().encode(rpcAccount.data[0]);\n return Object.freeze({ ...parseBaseAccount(rpcAccount), address, data, exists: true });\n}\n\ntype Base58EncodedRpcAccount = AccountInfoBase & (AccountInfoWithBase58Bytes | AccountInfoWithBase58EncodedData);\n\n/**\n * Parses a base58-encoded account provided by the RPC client into an {@link EncodedAccount} type or\n * a {@link MaybeEncodedAccount} type if the raw data can be set to `null`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * const myAddress = address('1234..5678');\n * const myRpcAccount = await rpc.getAccountInfo(myAddress, { encoding: 'base58' }).send();\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = parseBase58RpcAccount(myRpcAccount);\n * ```\n */\nexport function parseBase58RpcAccount(\n address: Address,\n rpcAccount: Base58EncodedRpcAccount,\n): EncodedAccount;\nexport function parseBase58RpcAccount(\n address: Address,\n rpcAccount: Base58EncodedRpcAccount | null,\n): MaybeEncodedAccount;\nexport function parseBase58RpcAccount(\n address: Address,\n rpcAccount: Base58EncodedRpcAccount | null,\n): EncodedAccount | MaybeEncodedAccount {\n if (!rpcAccount) return Object.freeze({ address, exists: false });\n const data = getBase58Encoder().encode(typeof rpcAccount.data === 'string' ? rpcAccount.data : rpcAccount.data[0]);\n return Object.freeze({ ...parseBaseAccount(rpcAccount), address, data, exists: true });\n}\n\ntype JsonParsedRpcAccount = AccountInfoBase & { readonly data: JsonParsedDataResponse };\ntype ParsedAccountMeta = { program: string; type?: string };\ntype JsonParsedAccountData = TData & { parsedAccountMeta?: ParsedAccountMeta };\n\n/**\n * Parses an arbitrary `jsonParsed` account provided by the RPC client into an {@link Account} type\n * or a {@link MaybeAccount} type if the raw data can be set to `null`.\n *\n * The expected data type should be explicitly provided as the first type parameter.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The expected type of this account's data.\n *\n * @example\n * ```ts\n * const myAccount: Account = parseJsonRpcAccount(myJsonRpcAccount);\n * ```\n */\nexport function parseJsonRpcAccount(\n address: Address,\n rpcAccount: JsonParsedRpcAccount,\n): Account, TAddress>;\nexport function parseJsonRpcAccount(\n address: Address,\n rpcAccount: JsonParsedRpcAccount | null,\n): MaybeAccount, TAddress>;\nexport function parseJsonRpcAccount(\n address: Address,\n rpcAccount: JsonParsedRpcAccount | null,\n): Account, TAddress> | MaybeAccount, TAddress> {\n if (!rpcAccount) return Object.freeze({ address, exists: false });\n const data = (rpcAccount.data.parsed.info || {}) as TData;\n\n if (rpcAccount.data.program || rpcAccount.data.parsed.type) {\n (data as JsonParsedAccountData).parsedAccountMeta = {\n program: rpcAccount.data.program,\n type: rpcAccount.data.parsed.type,\n };\n }\n\n return Object.freeze({ ...parseBaseAccount(rpcAccount), address, data, exists: true });\n}\n\nfunction parseBaseAccount(rpcAccount: AccountInfoBase): BaseAccount {\n return Object.freeze({\n executable: rpcAccount.executable,\n lamports: rpcAccount.lamports,\n programAddress: rpcAccount.owner,\n space: rpcAccount.space,\n });\n}\n","import type { Address } from '@solana/addresses';\nimport type { Rpc } from '@solana/rpc-spec';\nimport type { Commitment, Slot } from '@solana/rpc-types';\n\nimport type { MaybeAccount, MaybeEncodedAccount } from './maybe-account';\nimport { parseBase64RpcAccount, parseJsonRpcAccount } from './parse-account';\nimport type { GetAccountInfoApi, GetMultipleAccountsApi } from './rpc-api';\n\n/**\n * Optional configuration for fetching a singular account.\n *\n * @interface\n */\nexport type FetchAccountConfig = {\n abortSignal?: AbortSignal;\n /**\n * Fetch the details of the account as of the highest slot that has reached this level of\n * commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /**\n * Prevents accessing stale data by enforcing that the RPC node has processed transactions up to\n * this slot\n */\n minContextSlot?: Slot;\n};\n\n/**\n * Fetches a {@link MaybeEncodedAccount} from the provided RPC client and address.\n *\n * It uses the {@link GetAccountInfoApi.getAccountInfo | getAccountInfo} RPC method under the hood\n * with base64 encoding and an additional configuration object can be provided to customize the\n * behavior of the RPC call.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * const myAddress = address('1234..5678');\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = await fetchEncodedAccount(rpc, myAddress);\n *\n * // With custom configuration.\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = await fetchEncodedAccount(rpc, myAddress, {\n * abortSignal: myAbortController.signal,\n * commitment: 'confirmed',\n * });\n * ```\n */\nexport async function fetchEncodedAccount(\n rpc: Rpc,\n address: Address,\n config: FetchAccountConfig = {},\n): Promise> {\n const { abortSignal, ...rpcConfig } = config;\n const response = await rpc.getAccountInfo(address, { ...rpcConfig, encoding: 'base64' }).send({ abortSignal });\n return parseBase64RpcAccount(address, response.value);\n}\n\n/**\n * Fetches a {@link MaybeAccount} from the provided RPC client and address by using\n * {@link GetAccountInfoApi.getAccountInfo | getAccountInfo} under the hood with the `jsonParsed`\n * encoding.\n *\n * It may also return a {@link MaybeEncodedAccount} if the RPC client does not know how to parse the\n * account at the requested address. In any case, the expected data type should be explicitly\n * provided as the first type parameter.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The expected type of this account's data.\n *\n * @example\n * ```ts\n * type TokenData = { mint: Address; owner: Address };\n * const myAccount = await fetchJsonParsedAccount(rpc, myAddress);\n * myAccount satisfies MaybeAccount | MaybeEncodedAccount;\n *\n * // With custom configuration.\n * const myAccount = await fetchJsonParsedAccount(rpc, myAddress, {\n * abortSignal: myAbortController.signal,\n * commitment: 'confirmed',\n * });\n * ```\n */\nexport async function fetchJsonParsedAccount(\n rpc: Rpc,\n address: Address,\n config: FetchAccountConfig = {},\n): Promise<\n | MaybeAccount\n | MaybeEncodedAccount\n> {\n const { abortSignal, ...rpcConfig } = config;\n const { value: account } = await rpc\n .getAccountInfo(address, { ...rpcConfig, encoding: 'jsonParsed' })\n .send({ abortSignal });\n return !!account && typeof account === 'object' && 'parsed' in account.data\n ? parseJsonRpcAccount(address, account as Parameters[1])\n : parseBase64RpcAccount(address, account as Parameters[1]);\n}\n\n/**\n * Optional configuration for fetching multiple accounts.\n *\n * @interface\n */\nexport type FetchAccountsConfig = {\n abortSignal?: AbortSignal;\n /**\n * Fetch the details of the accounts as of the highest slot that has reached this level of\n * commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /**\n * Prevents accessing stale data by enforcing that the RPC node has processed transactions up to\n * this slot\n */\n minContextSlot?: Slot;\n};\n\n/**\n * Fetches an array of {@link MaybeEncodedAccount | MaybeEncodedAccounts} from the provided RPC\n * client and an array of addresses.\n *\n * It uses the {@link GetMultipleAccountsApi#getMultipleAccounts | getMultipleAccounts} RPC method\n * under the hood with base64 encodings and an additional configuration object can be provided to\n * customize the behavior of the RPC call.\n *\n * @typeParam TAddresses - Supply an array of string literals to define accounts having particular\n * addresses.\n *\n * @example\n * ```ts\n * const myAddressA = address('1234..5678');\n * const myAddressB = address('8765..4321');\n * const [myAccountA, myAccountB] = await fetchEncodedAccounts(rpc, [myAddressA, myAddressB]);\n * myAccountA satisfies MaybeEncodedAccount<'1234..5678'>;\n * myAccountB satisfies MaybeEncodedAccount<'8765..4321'>;\n *\n * // With custom configuration.\n * const [myAccountA, myAccountB] = await fetchEncodedAccounts(rpc, [myAddressA, myAddressB], {\n * abortSignal: myAbortController.signal,\n * commitment: 'confirmed',\n * });\n * ```\n */\nexport async function fetchEncodedAccounts<\n TAddresses extends string[] = string[],\n TWrappedAddresses extends { [P in keyof TAddresses]: Address } = {\n [P in keyof TAddresses]: Address;\n },\n>(rpc: Rpc, addresses: TWrappedAddresses, config: FetchAccountsConfig = {}) {\n const { abortSignal, ...rpcConfig } = config;\n const response = await rpc\n .getMultipleAccounts(addresses, { ...rpcConfig, encoding: 'base64' })\n .send({ abortSignal });\n return response.value.map((account, index) => parseBase64RpcAccount(addresses[index], account)) as {\n [P in keyof TAddresses]: MaybeEncodedAccount;\n };\n}\n\n/**\n * Fetches an array of {@link MaybeAccount | MaybeAccounts} from a provided RPC client and an array\n * of addresses.\n *\n * It uses the {@link GetMultipleAccountsApi#getMultipleAccounts | getMultipleAccounts} RPC method\n * under the hood with the `jsonParsed` encoding. It may also return a\n * {@link MaybeEncodedAccount} instead of the expected {@link MaybeAccount} if the RPC client does\n * not know how to parse some of the requested accounts. In any case, the array of expected data\n * types should be explicitly provided as the first type parameter.\n *\n * @typeParam TAddresses - Supply an array of string literals to define accounts having particular\n * addresses.\n * @typeParam TData - The expected types of these accounts' data.\n \n * @example\n * ```ts\n * type TokenData = { mint: Address; owner: Address };\n * type MintData = { supply: bigint };\n * const [myAccountA, myAccountB] = await fetchJsonParsedAccounts<[TokenData, MintData]>(rpc, [myAddressA, myAddressB]);\n * myAccountA satisfies MaybeAccount | MaybeEncodedAccount;\n * myAccountB satisfies MaybeAccount | MaybeEncodedAccount;\n * ```\n */\nexport async function fetchJsonParsedAccounts<\n TData extends object[],\n TAddresses extends string[] = string[],\n TWrappedAddresses extends { [P in keyof TAddresses]: Address } = {\n [P in keyof TAddresses]: Address;\n },\n>(rpc: Rpc, addresses: TWrappedAddresses, config: FetchAccountsConfig = {}) {\n const { abortSignal, ...rpcConfig } = config;\n const response = await rpc\n .getMultipleAccounts(addresses, { ...rpcConfig, encoding: 'jsonParsed' })\n .send({ abortSignal });\n return response.value.map((account, index) => {\n return !!account && typeof account === 'object' && 'parsed' in account.data\n ? parseJsonRpcAccount(addresses[index], account as Parameters[1])\n : parseBase64RpcAccount(addresses[index], account as Parameters[1]);\n }) as {\n [P in keyof TAddresses]:\n | MaybeAccount<\n TData[P & keyof TData] & { parsedAccountMeta?: { program: string; type?: string } },\n TAddresses[P]\n >\n | MaybeEncodedAccount;\n } & {\n [P in keyof TData]:\n | MaybeAccount<\n TData[P] & { parsedAccountMeta?: { program: string; type?: string } },\n TAddresses[P & keyof TAddresses]\n >\n | MaybeEncodedAccount;\n };\n}\n","import { Address } from '@solana/addresses';\nimport {\n SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND,\n SolanaError,\n} from '@solana/errors';\n\nimport { Account } from './account';\n\n/**\n * Represents an account that may or may not exist on-chain.\n *\n * When the account exists, it is represented as an {@link Account} type with an additional `exists`\n * attribute set to `true`. When it does not exist, it is represented by an object containing only\n * the address of the account and an `exists` attribute set to `false`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * // Account exists\n * const myExistingAccount: MaybeAccount = {\n * exists: true,\n * address: address('1234..5678'),\n * data: { name: 'Alice', age: 30 },\n * // ...\n * };\n *\n * // Account does not exist\n * const myMissingAccount: MaybeAccount = {\n * exists: false,\n * address: address('8765..4321'),\n * };\n * ```\n */\nexport type MaybeAccount =\n | { readonly address: Address; readonly exists: false }\n | (Account & { readonly exists: true });\n\n/**\n * Represents an encoded account that may or may not exist on-chain.\n *\n * When the account exists, it is represented as an {@link Account} type having its `TData` type\n * parameter set to `Uint8Array` with an additional `exists` attribute set to `true`. When it does\n * not exist, it is represented by an object containing only the address of the account and an\n * `exists` attribute set to `false`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * // Encoded account exists\n * const myExistingAccount: MaybeEncodedAccount<'1234..5678'> = {\n * exists: true,\n * address: address('1234..5678'),\n * data: new Uint8Array([1, 2, 3]),\n * // ...\n * };\n *\n * // Encoded account does not exist\n * const myMissingAccount: MaybeEncodedAccount<'8765..4321'> = {\n * exists: false,\n * address: address('8765..4321'),\n * };\n * ```\n */\nexport type MaybeEncodedAccount = MaybeAccount;\n\n/**\n * Given a {@link MaybeAccount}, asserts that the account exists and allows it to be used as an\n * {@link Account} type going forward.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * const myAccount: MaybeEncodedAccount<'1234..5678'>;\n * assertAccountExists(myAccount);\n *\n * // Now we can use myAccount as an `EncodedAccount`\n * myAccount satisfies EncodedAccount<'1234..5678'>;\n * ```\n */\nexport function assertAccountExists(\n account: MaybeAccount,\n): asserts account is Account & { exists: true } {\n if (!account.exists) {\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, { address: account.address });\n }\n}\n\n/**\n * Given an array of {@link MaybeAccount | MaybeAccounts}, asserts that all the accounts exist and\n * allows them to be used as an array of {@link Account | Accounts} going forward.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * const myAccounts: MaybeEncodedAccount

[];\n * assertAccountsExist(myAccounts);\n *\n * // Now we can use them as an array of `EncodedAccounts`\n * for (const a of myAccounts) {\n * a satisfies EncodedAccount
;\n * }\n * ```\n */\nexport function assertAccountsExist(\n accounts: MaybeAccount[],\n): asserts accounts is (Account & { exists: true })[] {\n const missingAccounts = accounts.filter(a => !a.exists);\n if (missingAccounts.length > 0) {\n const missingAddresses = missingAccounts.map(a => a.address);\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, { addresses: missingAddresses });\n }\n}\n","import { SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED, SolanaError } from '@solana/errors';\n\n/**\n * Throws an exception unless {@link Crypto#getRandomValues | `crypto.getRandomValues()`} is\n * available in the current JavaScript environment.\n */\nexport function assertPRNGIsAvailable() {\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.getRandomValues !== 'function') {\n throw new SolanaError(SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED);\n }\n}\n","import {\n SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT,\n SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED,\n SolanaError,\n} from '@solana/errors';\n\nfunction assertIsSecureContext() {\n if (__BROWSER__ && !globalThis.isSecureContext) {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT);\n }\n}\n\nlet cachedEd25519Decision: PromiseLike | boolean | undefined;\nasync function isEd25519CurveSupported(subtle: SubtleCrypto): Promise {\n if (cachedEd25519Decision === undefined) {\n cachedEd25519Decision = new Promise(resolve => {\n subtle\n .generateKey('Ed25519', /* extractable */ false, ['sign', 'verify'])\n .then(() => {\n resolve((cachedEd25519Decision = true));\n })\n .catch(() => {\n resolve((cachedEd25519Decision = false));\n });\n });\n }\n if (typeof cachedEd25519Decision === 'boolean') {\n return cachedEd25519Decision;\n } else {\n return await cachedEd25519Decision;\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#digest | `crypto.subtle.digest()`} is available in\n * the current JavaScript environment.\n */\nexport function assertDigestCapabilityIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.digest !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED);\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#generateKey | `crypto.subtle.generateKey()`} is\n * available in the current JavaScript environment and has support for the Ed25519 curve.\n */\nexport async function assertKeyGenerationIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.generateKey !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED);\n }\n if (!(await isEd25519CurveSupported(globalThis.crypto.subtle))) {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED);\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#exportKey | `crypto.subtle.exportKey()`} is\n * available in the current JavaScript environment.\n */\nexport function assertKeyExporterIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.exportKey !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED);\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#sign | `crypto.subtle.sign()`} is available in the\n * current JavaScript environment.\n */\nexport function assertSigningCapabilityIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.sign !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED);\n }\n}\n/**\n * Throws an exception unless {@link SubtleCrypto#verify | `crypto.subtle.verify()`} is available in\n * the current JavaScript environment.\n */\nexport function assertVerificationCapabilityIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.verify !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED);\n }\n}\n","import {\n combineCodec,\n Decoder,\n Encoder,\n fixDecoderSize,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n fixEncoderSize,\n transformEncoder,\n} from '@solana/codecs-core';\nimport { getBase58Decoder, getBase58Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\n/**\n * Represents a string that validates as a Solana address. Functions that require well-formed\n * addresses should specify their inputs in terms of this type.\n *\n * Whenever you need to validate an arbitrary string as a base58-encoded address, use the\n * {@link address}, {@link assertIsAddress}, or {@link isAddress} functions in this package.\n */\nexport type Address = Brand, 'Address'>;\n\nlet memoizedBase58Encoder: Encoder | undefined;\nlet memoizedBase58Decoder: Decoder | undefined;\n\nfunction getMemoizedBase58Encoder(): Encoder {\n if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder();\n return memoizedBase58Encoder;\n}\n\nfunction getMemoizedBase58Decoder(): Decoder {\n if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder();\n return memoizedBase58Decoder;\n}\n\n/**\n * A type guard that returns `true` if the input string conforms to the {@link Address} type, and\n * refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isAddress } from '@solana/addresses';\n *\n * if (isAddress(ownerAddress)) {\n * // At this point, `ownerAddress` has been refined to a\n * // `Address` that can be used with the RPC.\n * const { value: lamports } = await rpc.getBalance(ownerAddress).send();\n * setBalanceLamports(lamports);\n * } else {\n * setError(`${ownerAddress} is not an address`);\n * }\n * ```\n */\nexport function isAddress(putativeAddress: string): putativeAddress is Address {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n try {\n return base58Encoder.encode(putativeAddress).byteLength === 32;\n } catch {\n return false;\n }\n}\n\n/**\n * From time to time you might acquire a string, that you expect to validate as an address or public\n * key, from an untrusted network API or user input. Use this function to assert that such an\n * arbitrary string is a base58-encoded address.\n *\n * @example\n * ```ts\n * import { assertIsAddress } from '@solana/addresses';\n *\n * // Imagine a function that fetches an account's balance when a user submits a form.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const address: string = accountAddressInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `address` to `Address`.\n * assertIsAddress(address);\n * // At this point, `address` is an `Address` that can be used with the RPC.\n * const balanceInLamports = await rpc.getBalance(address).send();\n * } catch (e) {\n * // `address` turned out not to be a base58-encoded address\n * }\n * }\n * ```\n */\nexport function assertIsAddress(putativeAddress: string): asserts putativeAddress is Address {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, {\n actualLength: putativeAddress.length,\n });\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, {\n actualLength: numBytes,\n });\n }\n}\n\n/**\n * Combines _asserting_ that a string is an address with _coercing_ it to the {@link Address} type.\n * It's most useful with untrusted input.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n *\n * await transfer(address(fromAddress), address(toAddress), lamports(100000n));\n * ```\n *\n * > [!TIP]\n * > When starting from a known-good address as a string, it's more efficient to typecast it rather\n * than to use the {@link address} helper, because the helper unconditionally performs validation on\n * its input.\n * >\n * > ```ts\n * > import { Address } from '@solana/addresses';\n * >\n * > const MEMO_PROGRAM_ADDRESS =\n * > 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr' as Address<'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'>;\n * > ```\n */\nexport function address(putativeAddress: TAddress): Address {\n assertIsAddress(putativeAddress);\n return putativeAddress as Address;\n}\n\n/**\n * Returns an encoder that you can use to encode a base58-encoded address to a byte array.\n *\n * @example\n * ```ts\n * import { getAddressEncoder } from '@solana/addresses';\n *\n * const address = 'B9Lf9z5BfNPT4d5KMeaBFx8x1G4CULZYR1jA2kmxRDka' as Address;\n * const addressEncoder = getAddressEncoder();\n * const addressBytes = addressEncoder.encode(address);\n * // Uint8Array(32) [\n * // 150, 183, 190, 48, 171, 8, 39, 156,\n * // 122, 213, 172, 108, 193, 95, 26, 158,\n * // 149, 243, 115, 254, 20, 200, 36, 30,\n * // 248, 179, 178, 232, 220, 89, 53, 127\n * // ]\n * ```\n */\nexport function getAddressEncoder(): FixedSizeEncoder {\n return transformEncoder(fixEncoderSize(getMemoizedBase58Encoder(), 32), putativeAddress =>\n address(putativeAddress),\n );\n}\n\n/**\n * Returns a decoder that you can use to convert an array of 32 bytes representing an address to the\n * base58-encoded representation of that address.\n *\n * @example\n * ```ts\n * import { getAddressDecoder } from '@solana/addresses';\n *\n * const addressBytes = new Uint8Array([\n * 150, 183, 190, 48, 171, 8, 39, 156,\n * 122, 213, 172, 108, 193, 95, 26, 158,\n * 149, 243, 115, 254, 20, 200, 36, 30,\n * 248, 179, 178, 232, 220, 89, 53, 127\n * ]);\n * const addressDecoder = getAddressDecoder();\n * const address = addressDecoder.decode(addressBytes); // B9Lf9z5BfNPT4d5KMeaBFx8x1G4CULZYR1jA2kmxRDka\n * ```\n */\nexport function getAddressDecoder(): FixedSizeDecoder {\n return fixDecoderSize(getMemoizedBase58Decoder(), 32) as FixedSizeDecoder;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a base-58 encoded address.\n *\n * @see {@link getAddressDecoder}\n * @see {@link getAddressEncoder}\n */\nexport function getAddressCodec(): FixedSizeCodec {\n return combineCodec(getAddressEncoder(), getAddressDecoder());\n}\n\nexport function getAddressComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","/**!\n * noble-ed25519\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Paul Miller (https://paulmillr.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the “Software”), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nconst D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n;\nconst P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; // 2n ** 255n - 19n; ed25519 is twisted edwards curve\nconst RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; // √-1\n\n// mod division\nfunction mod(a: bigint): bigint {\n const r = a % P;\n return r >= 0n ? r : P + r;\n}\nfunction pow2(x: bigint, power: bigint): bigint {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n}\nfunction pow_2_252_3(x: bigint): bigint {\n // x^(2^252-3) unrolled util for square root\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return pow_p_5_8;\n}\nfunction uvRatio(u: bigint, v: bigint): bigint | null {\n // for sqrt comp\n const v3 = mod(v * v * v); // v³\n const v7 = mod(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7); // (uv⁷)^(p-5)/8\n let x = mod(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if ((mod(x) & 1n) === 1n) x = mod(-x); // edIsNegative\n if (!useRoot1 && !useRoot2) {\n return null;\n }\n return x;\n}\n// https://datatracker.ietf.org/doc/html/rfc8032#section-5.1.3\nexport function pointIsOnCurve(y: bigint, lastByte: number): boolean {\n const y2 = mod(y * y); // y²\n const u = mod(y2 - 1n); // u=y²-1\n const v = mod(D * y2 + 1n);\n const x = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (x === null) {\n return false;\n }\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (x === 0n && isLastByteOdd) {\n return false;\n }\n return true;\n}\n","import { ReadonlyUint8Array } from '@solana/codecs-core';\n\nimport { pointIsOnCurve } from './vendor/noble/ed25519';\n\nfunction byteToHex(byte: number): string {\n const hexString = byte.toString(16);\n if (hexString.length === 1) {\n return `0${hexString}`;\n } else {\n return hexString;\n }\n}\n\nfunction decompressPointBytes(bytes: ReadonlyUint8Array): bigint {\n const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & ~0x80 : byte)}${acc}`, '');\n const integerLiteralString = `0x${hexString}`;\n return BigInt(integerLiteralString);\n}\n\nexport function compressedPointBytesAreOnCurve(bytes: ReadonlyUint8Array): boolean {\n if (bytes.byteLength !== 32) {\n return false;\n }\n const y = decompressPointBytes(bytes);\n return pointIsOnCurve(y, bytes[31]);\n}\n","import { SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS, SolanaError } from '@solana/errors';\nimport type { AffinePoint } from '@solana/nominal-types';\n\nimport { type Address, getAddressCodec } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve-internal';\n\n/**\n * Represents an {@link Address} that validates as being off-curve. Functions that require off-curve\n * addresses should specify their inputs in terms of this type.\n *\n * Whenever you need to validate an address as being off-curve, use the {@link offCurveAddress},\n * {@link assertIsOffCurveAddress}, or {@link isOffCurveAddress} functions in this package.\n */\nexport type OffCurveAddress = AffinePoint, 'invalid'>;\n\n/**\n * A type guard that returns `true` if the input address conforms to the {@link OffCurveAddress}\n * type, and refines its type for use in your application.\n *\n * @example\n * ```ts\n * import { isOffCurveAddress } from '@solana/addresses';\n *\n * if (isOffCurveAddress(accountAddress)) {\n * // At this point, `accountAddress` has been refined to a\n * // `OffCurveAddress` that can be used within your business logic.\n * const { value: account } = await rpc.getAccountInfo(accountAddress).send();\n * } else {\n * setError(`${accountAddress} is not off-curve`);\n * }\n * ```\n */\nexport function isOffCurveAddress(\n putativeOffCurveAddress: TAddress,\n): putativeOffCurveAddress is OffCurveAddress {\n const addressBytes = getAddressCodec().encode(putativeOffCurveAddress);\n return compressedPointBytesAreOnCurve(addressBytes) === false;\n}\n\n/**\n * From time to time you might acquire an {@link Address}, that you expect to validate as an\n * off-curve address, from an untrusted source. Use this function to assert that such an address is\n * off-curve.\n *\n * @example\n * ```ts\n * import { assertIsOffCurveAddress } from '@solana/addresses';\n *\n * // Imagine a function that fetches an account's balance when a user submits a form.\n * function handleSubmit() {\n * // We know only that the input conforms to the `string` type.\n * const address: string = accountAddressInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `address` to `Address`.\n * assertIsAddress(address);\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `address` to `OffCurveAddress`.\n * assertIsOffCurveAddress(address);\n * // At this point, `address` is an `OffCurveAddress` that can be used with the RPC.\n * const balanceInLamports = await rpc.getBalance(address).send();\n * } catch (e) {\n * // `address` turned out to NOT be a base58-encoded off-curve address\n * }\n * }\n * ```\n */\nexport function assertIsOffCurveAddress(\n putativeOffCurveAddress: TAddress,\n): asserts putativeOffCurveAddress is OffCurveAddress {\n if (!isOffCurveAddress(putativeOffCurveAddress)) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS);\n }\n}\n\n/**\n * Combines _asserting_ that an {@link Address} is off-curve with _coercing_ it to the\n * {@link OffCurveAddress} type. It's most useful with untrusted input.\n */\nexport function offCurveAddress(\n putativeOffCurveAddress: TAddress,\n): OffCurveAddress {\n assertIsOffCurveAddress(putativeOffCurveAddress);\n return putativeOffCurveAddress;\n}\n","import { assertDigestCapabilityIsAvailable } from '@solana/assertions';\nimport { bytesEqual, type ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n isSolanaError,\n SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED,\n SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE,\n SOLANA_ERROR__ADDRESSES__MALFORMED_PDA,\n SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE,\n SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER,\n SolanaError,\n} from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\nimport { Address, assertIsAddress, getAddressCodec, isAddress } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve-internal';\n\n/**\n * A tuple representing a program derived address (derived from the address of some program and a\n * set of seeds) and the associated bump seed used to ensure that the address, as derived, does not\n * fall on the Ed25519 curve.\n *\n * Whenever you need to validate an arbitrary tuple as one that represents a program derived\n * address, use the {@link assertIsProgramDerivedAddress} or {@link isProgramDerivedAddress}\n * functions in this package.\n */\nexport type ProgramDerivedAddress = Readonly<\n [Address, ProgramDerivedAddressBump]\n>;\n\n/**\n * Represents an integer in the range [0,255] used in the derivation of a program derived address to\n * ensure that it does not fall on the Ed25519 curve.\n */\nexport type ProgramDerivedAddressBump = Brand;\n\n/**\n * A type guard that returns `true` if the input tuple conforms to the {@link ProgramDerivedAddress}\n * type, and refines its type for use in your program.\n *\n * @see The {@link isAddress} function for an example of how to use a type guard.\n */\nexport function isProgramDerivedAddress(\n value: unknown,\n): value is ProgramDerivedAddress {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'number' &&\n value[1] >= 0 &&\n value[1] <= 255 &&\n isAddress(value[0])\n );\n}\n\n/**\n * In the event that you receive an address/bump-seed tuple from some untrusted source, use this\n * function to assert that it conforms to the {@link ProgramDerivedAddress} interface.\n *\n * @see The {@link assertIsAddress} function for an example of how to use an assertion function.\n */\nexport function assertIsProgramDerivedAddress(\n value: unknown,\n): asserts value is ProgramDerivedAddress {\n const validFormat =\n Array.isArray(value) && value.length === 2 && typeof value[0] === 'string' && typeof value[1] === 'number';\n if (!validFormat) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MALFORMED_PDA);\n }\n if (value[1] < 0 || value[1] > 255) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, {\n bump: value[1],\n });\n }\n assertIsAddress(value[0]);\n}\n\ntype ProgramDerivedAddressInput = Readonly<{\n programAddress: Address;\n seeds: Seed[];\n}>;\n\ntype SeedInput = Readonly<{\n baseAddress: Address;\n programAddress: Address;\n seed: Seed;\n}>;\n\ntype Seed = ReadonlyUint8Array | string;\n\nconst MAX_SEED_LENGTH = 32;\nconst MAX_SEEDS = 16;\nconst PDA_MARKER_BYTES = [\n // The string 'ProgramDerivedAddress'\n 80, 114, 111, 103, 114, 97, 109, 68, 101, 114, 105, 118, 101, 100, 65, 100, 100, 114, 101, 115, 115,\n] as const;\n\nasync function createProgramDerivedAddress({ programAddress, seeds }: ProgramDerivedAddressInput): Promise
{\n assertDigestCapabilityIsAvailable();\n if (seeds.length > MAX_SEEDS) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {\n actual: seeds.length,\n maxSeeds: MAX_SEEDS,\n });\n }\n let textEncoder: TextEncoder;\n const seedBytes = seeds.reduce((acc, seed, ii) => {\n const bytes = typeof seed === 'string' ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;\n if (bytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: bytes.byteLength,\n index: ii,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n acc.push(...bytes);\n return acc;\n }, [] as number[]);\n const base58EncodedAddressCodec = getAddressCodec();\n const programAddressBytes = base58EncodedAddressCodec.encode(programAddress);\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n if (compressedPointBytesAreOnCurve(addressBytes)) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE);\n }\n return base58EncodedAddressCodec.decode(addressBytes);\n}\n\n/**\n * Given a program's {@link Address} and up to 16 {@link Seed | Seeds}, this method will return the\n * program derived address (PDA) associated with each.\n *\n * @example\n * ```ts\n * import { getAddressEncoder, getProgramDerivedAddress } from '@solana/addresses';\n *\n * const addressEncoder = getAddressEncoder();\n * const [pda, bumpSeed] = await getProgramDerivedAddress({\n * programAddress: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address,\n * seeds: [\n * // Owner\n * addressEncoder.encode('9fYLFVoVqwH37C3dyPi6cpeobfbQ2jtLpN5HgAYDDdkm' as Address),\n * // Token program\n * addressEncoder.encode('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address),\n * // Mint\n * addressEncoder.encode('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as Address),\n * ],\n * });\n * ```\n */\nexport async function getProgramDerivedAddress({\n programAddress,\n seeds,\n}: ProgramDerivedAddressInput): Promise {\n let bumpSeed = 255;\n while (bumpSeed > 0) {\n try {\n const address = await createProgramDerivedAddress({\n programAddress,\n seeds: [...seeds, new Uint8Array([bumpSeed])],\n });\n return [address, bumpSeed as ProgramDerivedAddressBump];\n } catch (e) {\n if (isSolanaError(e, SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE)) {\n bumpSeed--;\n } else {\n throw e;\n }\n }\n }\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED);\n}\n\n/**\n * Returns a base58-encoded address derived from some base address, some program address, and a seed\n * string or byte array.\n *\n * @example\n * ```ts\n * import { createAddressWithSeed } from '@solana/addresses';\n *\n * const derivedAddress = await createAddressWithSeed({\n * // The private key associated with this address will be able to sign for `derivedAddress`.\n * baseAddress: 'B9Lf9z5BfNPT4d5KMeaBFx8x1G4CULZYR1jA2kmxRDka' as Address,\n * // Only this program will be able to write data to this account.\n * programAddress: '445erYq578p2aERrGW9mn9KiYe3fuG6uHdcJ2LPPShGw' as Address,\n * seed: 'data-account',\n * });\n * ```\n */\nexport async function createAddressWithSeed({ baseAddress, programAddress, seed }: SeedInput): Promise
{\n const { encode, decode } = getAddressCodec();\n\n const seedBytes = typeof seed === 'string' ? new TextEncoder().encode(seed) : seed;\n if (seedBytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: seedBytes.byteLength,\n index: 0,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n\n const programAddressBytes = encode(programAddress);\n if (\n programAddressBytes.length >= PDA_MARKER_BYTES.length &&\n bytesEqual(programAddressBytes.slice(-PDA_MARKER_BYTES.length), new Uint8Array(PDA_MARKER_BYTES))\n ) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER);\n }\n\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n\n return decode(addressBytes);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\nimport { SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY, SolanaError } from '@solana/errors';\n\nimport { Address, getAddressDecoder, getAddressEncoder } from './address';\n\n/**\n * Given a public {@link CryptoKey}, this method will return its associated {@link Address}.\n *\n * @example\n * ```ts\n * import { getAddressFromPublicKey } from '@solana/addresses';\n *\n * const address = await getAddressFromPublicKey(publicKey);\n * ```\n */\nexport async function getAddressFromPublicKey(publicKey: CryptoKey): Promise
{\n assertKeyExporterIsAvailable();\n if (publicKey.type !== 'public' || publicKey.algorithm.name !== 'Ed25519') {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY);\n }\n const publicKeyBytes = await crypto.subtle.exportKey('raw', publicKey);\n return getAddressDecoder().decode(new Uint8Array(publicKeyBytes));\n}\n\n/**\n * Given an {@link Address}, return a {@link CryptoKey} that can be used to verify signatures.\n *\n * @example\n * ```ts\n * import { getAddressFromPublicKey } from '@solana/addresses';\n *\n * const publicKey = await getPublicKeyFromAddress(address);\n * ```\n */\nexport async function getPublicKeyFromAddress(address: Address) {\n const addressBytes = getAddressEncoder().encode(address);\n return await crypto.subtle.importKey('raw', addressBytes, { name: 'Ed25519' }, true /* extractable */, ['verify']);\n}\n","import { SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, SolanaError } from '@solana/errors';\n\n/**\n * Ensures that a given number falls within a specified range.\n *\n * If the number is outside the allowed range, an error is thrown.\n * This function is primarily used to validate values before encoding them in a codec.\n *\n * @param codecDescription - A string describing the codec that is performing the validation.\n * @param min - The minimum allowed value (inclusive).\n * @param max - The maximum allowed value (inclusive).\n * @param value - The number to validate.\n *\n * @throws {@link SolanaError} if the value is out of range.\n *\n * @example\n * Validating a number within range.\n * ```ts\n * assertNumberIsBetweenForCodec('u8', 0, 255, 42); // Passes\n * ```\n *\n * @example\n * Throwing an error for an out-of-range value.\n * ```ts\n * assertNumberIsBetweenForCodec('u8', 0, 255, 300); // Throws\n * ```\n */\nexport function assertNumberIsBetweenForCodec(\n codecDescription: string,\n min: bigint | number,\n max: bigint | number,\n value: bigint | number,\n) {\n if (value < min || value > max) {\n throw new SolanaError(SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, {\n codecDescription,\n max,\n min,\n value,\n });\n }\n}\n","import { Codec, Decoder, Encoder, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n/**\n * Represents an encoder for numbers and bigints.\n *\n * This type allows encoding values that are either `number` or `bigint`.\n * Depending on the specific implementation, the encoded output may have a fixed or variable size.\n *\n * @see {@link FixedSizeNumberEncoder}\n */\nexport type NumberEncoder = Encoder;\n\n/**\n * Represents a fixed-size encoder for numbers and bigints.\n *\n * This encoder serializes values using an exact number of bytes, defined by `TSize`.\n *\n * @typeParam TSize - The number of bytes used for encoding.\n *\n * @see {@link NumberEncoder}\n */\nexport type FixedSizeNumberEncoder = FixedSizeEncoder;\n\n/**\n * Represents a decoder for numbers and bigints.\n *\n * This type supports decoding values as either `number` or `bigint`, depending on the implementation.\n *\n * @see {@link FixedSizeNumberDecoder}\n */\nexport type NumberDecoder = Decoder | Decoder;\n\n/**\n * Represents a fixed-size decoder for numbers and bigints.\n *\n * This decoder reads a fixed number of bytes (`TSize`) and converts them into a `number` or `bigint`.\n *\n * @typeParam TSize - The number of bytes expected for decoding.\n *\n * @see {@link NumberDecoder}\n */\nexport type FixedSizeNumberDecoder =\n | FixedSizeDecoder\n | FixedSizeDecoder;\n\n/**\n * Represents a codec for encoding and decoding numbers and bigints.\n *\n * - The encoded value can be either a `number` or a `bigint`.\n * - The decoded value will always be either a `number` or `bigint`, depending on the implementation.\n *\n * @see {@link FixedSizeNumberCodec}\n */\nexport type NumberCodec = Codec | Codec;\n\n/**\n * Represents a fixed-size codec for encoding and decoding numbers and bigints.\n *\n * This codec uses a specific number of bytes (`TSize`) for serialization.\n * The encoded value can be either a `number` or `bigint`, but the decoded value will always be a `number` or `bigint`,\n * depending on the implementation.\n *\n * @typeParam TSize - The number of bytes used for encoding and decoding.\n *\n * @see {@link NumberCodec}\n */\nexport type FixedSizeNumberCodec =\n | FixedSizeCodec\n | FixedSizeCodec;\n\n/**\n * Configuration options for number codecs that use more than one byte.\n *\n * This configuration applies to all number codecs except `u8` and `i8`,\n * allowing the user to specify the endianness of serialization.\n */\nexport type NumberCodecConfig = {\n /**\n * Specifies whether numbers should be encoded in little-endian or big-endian format.\n *\n * @defaultValue `Endian.Little`\n */\n endian?: Endian;\n};\n\n/**\n * Defines the byte order used for number serialization.\n *\n * - `Little`: The least significant byte is stored first.\n * - `Big`: The most significant byte is stored first.\n */\nexport enum Endian {\n Little,\n Big,\n}\n","import {\n assertByteArrayHasEnoughBytesForCodec,\n assertByteArrayIsNotEmptyForCodec,\n createDecoder,\n createEncoder,\n FixedSizeDecoder,\n FixedSizeEncoder,\n Offset,\n toArrayBuffer,\n} from '@solana/codecs-core';\n\nimport { assertNumberIsBetweenForCodec } from './assertions';\nimport { Endian, NumberCodecConfig } from './common';\n\ntype NumberFactorySharedInput = {\n config?: NumberCodecConfig;\n name: string;\n size: TSize;\n};\n\ntype NumberFactoryEncoderInput = NumberFactorySharedInput & {\n range?: [bigint | number, bigint | number];\n set: (view: DataView, value: TFrom, littleEndian?: boolean) => void;\n};\n\ntype NumberFactoryDecoderInput = NumberFactorySharedInput & {\n get: (view: DataView, littleEndian?: boolean) => TTo;\n};\n\nfunction isLittleEndian(config?: NumberCodecConfig): boolean {\n return config?.endian === Endian.Big ? false : true;\n}\n\nexport function numberEncoderFactory(\n input: NumberFactoryEncoderInput,\n): FixedSizeEncoder {\n return createEncoder({\n fixedSize: input.size,\n write(value: TFrom, bytes: Uint8Array, offset: Offset): Offset {\n if (input.range) {\n assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value);\n }\n const arrayBuffer = new ArrayBuffer(input.size);\n input.set(new DataView(arrayBuffer), value, isLittleEndian(input.config));\n bytes.set(new Uint8Array(arrayBuffer), offset);\n return offset + input.size;\n },\n });\n}\n\nexport function numberDecoderFactory(\n input: NumberFactoryDecoderInput,\n): FixedSizeDecoder {\n return createDecoder({\n fixedSize: input.size,\n read(bytes, offset = 0): [TTo, number] {\n assertByteArrayIsNotEmptyForCodec(input.name, bytes, offset);\n assertByteArrayHasEnoughBytesForCodec(input.name, input.size, bytes, offset);\n const view = new DataView(toArrayBuffer(bytes, offset, input.size));\n return [input.get(view, isLittleEndian(input.config)), offset + input.size];\n },\n });\n}\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 32-bit floating-point numbers (`f32`).\n *\n * This encoder serializes `f32` values using 4 bytes.\n * Floating-point values may lose precision when encoded.\n *\n * For more details, see {@link getF32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `f32` values.\n *\n * @example\n * Encoding an `f32` value.\n * ```ts\n * const encoder = getF32Encoder();\n * const bytes = encoder.encode(-1.5); // 0x0000c0bf\n * ```\n *\n * @see {@link getF32Codec}\n */\nexport const getF32Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'f32',\n set: (view, value, le) => view.setFloat32(0, Number(value), le),\n size: 4,\n });\n\n/**\n * Returns a decoder for 32-bit floating-point numbers (`f32`).\n *\n * This decoder deserializes `f32` values from 4 bytes.\n * Some precision may be lost during decoding due to floating-point representation.\n *\n * For more details, see {@link getF32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `f32` values.\n *\n * @example\n * Decoding an `f32` value.\n * ```ts\n * const decoder = getF32Decoder();\n * const value = decoder.decode(new Uint8Array([0x00, 0x00, 0xc0, 0xbf])); // -1.5\n * ```\n *\n * @see {@link getF32Codec}\n */\nexport const getF32Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getFloat32(0, le),\n name: 'f32',\n size: 4,\n });\n\n/**\n * Returns a codec for encoding and decoding 32-bit floating-point numbers (`f32`).\n *\n * This codec serializes `f32` values using 4 bytes.\n * Due to the IEEE 754 floating-point representation, some precision loss may occur.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `f32` values.\n *\n * @example\n * Encoding and decoding an `f32` value.\n * ```ts\n * const codec = getF32Codec();\n * const bytes = codec.encode(-1.5); // 0x0000c0bf\n * const value = codec.decode(bytes); // -1.5\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getF32Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-1.5); // 0xbfc00000\n * ```\n *\n * @remarks\n * `f32` values follow the IEEE 754 single-precision floating-point standard.\n * Precision loss may occur for certain values.\n *\n * - If you need higher precision, consider using {@link getF64Codec}.\n * - If you need integer values, consider using {@link getI32Codec} or {@link getU32Codec}.\n *\n * Separate {@link getF32Encoder} and {@link getF32Decoder} functions are available.\n *\n * ```ts\n * const bytes = getF32Encoder().encode(-1.5);\n * const value = getF32Decoder().decode(bytes);\n * ```\n *\n * @see {@link getF32Encoder}\n * @see {@link getF32Decoder}\n */\nexport const getF32Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getF32Encoder(config), getF32Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 64-bit floating-point numbers (`f64`).\n *\n * This encoder serializes `f64` values using 8 bytes.\n * Floating-point values may lose precision when encoded.\n *\n * For more details, see {@link getF64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `f64` values.\n *\n * @example\n * Encoding an `f64` value.\n * ```ts\n * const encoder = getF64Encoder();\n * const bytes = encoder.encode(-1.5); // 0x000000000000f8bf\n * ```\n *\n * @see {@link getF64Codec}\n */\nexport const getF64Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'f64',\n set: (view, value, le) => view.setFloat64(0, Number(value), le),\n size: 8,\n });\n\n/**\n * Returns a decoder for 64-bit floating-point numbers (`f64`).\n *\n * This decoder deserializes `f64` values from 8 bytes.\n * Some precision may be lost during decoding due to floating-point representation.\n *\n * For more details, see {@link getF64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `f64` values.\n *\n * @example\n * Decoding an `f64` value.\n * ```ts\n * const decoder = getF64Decoder();\n * const value = decoder.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf])); // -1.5\n * ```\n *\n * @see {@link getF64Codec}\n */\nexport const getF64Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getFloat64(0, le),\n name: 'f64',\n size: 8,\n });\n\n/**\n * Returns a codec for encoding and decoding 64-bit floating-point numbers (`f64`).\n *\n * This codec serializes `f64` values using 8 bytes.\n * Due to the IEEE 754 floating-point representation, some precision loss may occur.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `f64` values.\n *\n * @example\n * Encoding and decoding an `f64` value.\n * ```ts\n * const codec = getF64Codec();\n * const bytes = codec.encode(-1.5); // 0x000000000000f8bf\n * const value = codec.decode(bytes); // -1.5\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getF64Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-1.5); // 0xbff8000000000000\n * ```\n *\n * @remarks\n * `f64` values follow the IEEE 754 double-precision floating-point standard.\n * Precision loss may still occur but is significantly lower than `f32`.\n *\n * - If you need smaller floating-point values, consider using {@link getF32Codec}.\n * - If you need integer values, consider using {@link getI64Codec} or {@link getU64Codec}.\n *\n * Separate {@link getF64Encoder} and {@link getF64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getF64Encoder().encode(-1.5);\n * const value = getF64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getF64Encoder}\n * @see {@link getF64Decoder}\n */\nexport const getF64Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getF64Encoder(config), getF64Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 128-bit signed integers (`i128`).\n *\n * This encoder serializes `i128` values using 16 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI128Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i128` values.\n *\n * @example\n * Encoding an `i128` value.\n * ```ts\n * const encoder = getI128Encoder();\n * const bytes = encoder.encode(-42n); // 0xd6ffffffffffffffffffffffffffffff\n * ```\n *\n * @see {@link getI128Codec}\n */\nexport const getI128Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i128',\n range: [-BigInt('0x7fffffffffffffffffffffffffffffff') - 1n, BigInt('0x7fffffffffffffffffffffffffffffff')],\n set: (view, value, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const rightMask = 0xffffffffffffffffn;\n view.setBigInt64(leftOffset, BigInt(value) >> 64n, le);\n view.setBigUint64(rightOffset, BigInt(value) & rightMask, le);\n },\n size: 16,\n });\n\n/**\n * Returns a decoder for 128-bit signed integers (`i128`).\n *\n * This decoder deserializes `i128` values from 16 bytes.\n * The decoded value is always a `bigint`.\n *\n * For more details, see {@link getI128Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i128` values.\n *\n * @example\n * Decoding an `i128` value.\n * ```ts\n * const decoder = getI128Decoder();\n * const value = decoder.decode(new Uint8Array([\n * 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n * 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff\n * ])); // -42n\n * ```\n *\n * @see {@link getI128Codec}\n */\nexport const getI128Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const left = view.getBigInt64(leftOffset, le);\n const right = view.getBigUint64(rightOffset, le);\n return (left << 64n) + right;\n },\n name: 'i128',\n size: 16,\n });\n\n/**\n * Returns a codec for encoding and decoding 128-bit signed integers (`i128`).\n *\n * This codec serializes `i128` values using 16 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i128` values.\n *\n * @example\n * Encoding and decoding an `i128` value.\n * ```ts\n * const codec = getI128Codec();\n * const bytes = codec.encode(-42n); // 0xd6ffffffffffffffffffffffffffffff\n * const value = codec.decode(bytes); // -42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI128Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42n); // 0xffffffffffffffffffffffffffffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^127` and `2^127 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller signed integer, consider using {@link getI64Codec} or {@link getI32Codec}.\n * - If you need a larger signed integer, consider using a custom codec.\n * - If you need unsigned integers, consider using {@link getU128Codec}.\n *\n * Separate {@link getI128Encoder} and {@link getI128Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI128Encoder().encode(-42);\n * const value = getI128Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI128Encoder}\n * @see {@link getI128Decoder}\n */\nexport const getI128Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI128Encoder(config), getI128Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 16-bit signed integers (`i16`).\n *\n * This encoder serializes `i16` values using 2 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI16Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i16` values.\n *\n * @example\n * Encoding an `i16` value.\n * ```ts\n * const encoder = getI16Encoder();\n * const bytes = encoder.encode(-42); // 0xd6ff\n * ```\n *\n * @see {@link getI16Codec}\n */\nexport const getI16Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i16',\n range: [-Number('0x7fff') - 1, Number('0x7fff')],\n set: (view, value, le) => view.setInt16(0, Number(value), le),\n size: 2,\n });\n\n/**\n * Returns a decoder for 16-bit signed integers (`i16`).\n *\n * This decoder deserializes `i16` values from 2 bytes.\n * The decoded value is always a `number`.\n *\n * For more details, see {@link getI16Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i16` values.\n *\n * @example\n * Decoding an `i16` value.\n * ```ts\n * const decoder = getI16Decoder();\n * const value = decoder.decode(new Uint8Array([0xd6, 0xff])); // -42\n * ```\n *\n * @see {@link getI16Codec}\n */\nexport const getI16Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getInt16(0, le),\n name: 'i16',\n size: 2,\n });\n\n/**\n * Returns a codec for encoding and decoding 16-bit signed integers (`i16`).\n *\n * This codec serializes `i16` values using 2 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `number`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i16` values.\n *\n * @example\n * Encoding and decoding an `i16` value.\n * ```ts\n * const codec = getI16Codec();\n * const bytes = codec.encode(-42); // 0xd6ff\n * const value = codec.decode(bytes); // -42\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI16Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42); // 0xffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^15` (`-32,768`) and `2^15 - 1` (`32,767`).\n *\n * - If you need a smaller signed integer, consider using {@link getI8Codec}.\n * - If you need a larger signed integer, consider using {@link getI32Codec}.\n * - If you need unsigned integers, consider using {@link getU16Codec}.\n *\n * Separate {@link getI16Encoder} and {@link getI16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI16Encoder().encode(-42);\n * const value = getI16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI16Encoder}\n * @see {@link getI16Decoder}\n */\nexport const getI16Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI16Encoder(config), getI16Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 32-bit signed integers (`i32`).\n *\n * This encoder serializes `i32` values using 4 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i32` values.\n *\n * @example\n * Encoding an `i32` value.\n * ```ts\n * const encoder = getI32Encoder();\n * const bytes = encoder.encode(-42); // 0xd6ffffff\n * ```\n *\n * @see {@link getI32Codec}\n */\nexport const getI32Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i32',\n range: [-Number('0x7fffffff') - 1, Number('0x7fffffff')],\n set: (view, value, le) => view.setInt32(0, Number(value), le),\n size: 4,\n });\n\n/**\n * Returns a decoder for 32-bit signed integers (`i32`).\n *\n * This decoder deserializes `i32` values from 4 bytes.\n * The decoded value is always a `number`.\n *\n * For more details, see {@link getI32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i32` values.\n *\n * @example\n * Decoding an `i32` value.\n * ```ts\n * const decoder = getI32Decoder();\n * const value = decoder.decode(new Uint8Array([0xd6, 0xff, 0xff, 0xff])); // -42\n * ```\n *\n * @see {@link getI32Codec}\n */\nexport const getI32Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getInt32(0, le),\n name: 'i32',\n size: 4,\n });\n\n/**\n * Returns a codec for encoding and decoding 32-bit signed integers (`i32`).\n *\n * This codec serializes `i32` values using 4 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `number`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i32` values.\n *\n * @example\n * Encoding and decoding an `i32` value.\n * ```ts\n * const codec = getI32Codec();\n * const bytes = codec.encode(-42); // 0xd6ffffff\n * const value = codec.decode(bytes); // -42\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI32Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42); // 0xffffffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^31` (`-2,147,483,648`) and `2^31 - 1` (`2,147,483,647`).\n *\n * - If you need a smaller signed integer, consider using {@link getI16Codec} or {@link getI8Codec}.\n * - If you need a larger signed integer, consider using {@link getI64Codec}.\n * - If you need unsigned integers, consider using {@link getU32Codec}.\n *\n * Separate {@link getI32Encoder} and {@link getI32Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI32Encoder().encode(-42);\n * const value = getI32Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI32Encoder}\n * @see {@link getI32Decoder}\n */\nexport const getI32Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI32Encoder(config), getI32Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 64-bit signed integers (`i64`).\n *\n * This encoder serializes `i64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i64` values.\n *\n * @example\n * Encoding an `i64` value.\n * ```ts\n * const encoder = getI64Encoder();\n * const bytes = encoder.encode(-42n); // 0xd6ffffffffffffff\n * ```\n *\n * @see {@link getI64Codec}\n */\nexport const getI64Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i64',\n range: [-BigInt('0x7fffffffffffffff') - 1n, BigInt('0x7fffffffffffffff')],\n set: (view, value, le) => view.setBigInt64(0, BigInt(value), le),\n size: 8,\n });\n\n/**\n * Returns a decoder for 64-bit signed integers (`i64`).\n *\n * This decoder deserializes `i64` values from 8 bytes.\n * The decoded value is always a `bigint`.\n *\n * For more details, see {@link getI64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i64` values.\n *\n * @example\n * Decoding an `i64` value.\n * ```ts\n * const decoder = getI64Decoder();\n * const value = decoder.decode(new Uint8Array([\n * 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff\n * ])); // -42n\n * ```\n *\n * @see {@link getI64Codec}\n */\nexport const getI64Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getBigInt64(0, le),\n name: 'i64',\n size: 8,\n });\n\n/**\n * Returns a codec for encoding and decoding 64-bit signed integers (`i64`).\n *\n * This codec serializes `i64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i64` values.\n *\n * @example\n * Encoding and decoding an `i64` value.\n * ```ts\n * const codec = getI64Codec();\n * const bytes = codec.encode(-42n); // 0xd6ffffffffffffff\n * const value = codec.decode(bytes); // -42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI64Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42n); // 0xffffffffffffffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^63` and `2^63 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller signed integer, consider using {@link getI32Codec} or {@link getI16Codec}.\n * - If you need a larger signed integer, consider using {@link getI128Codec}.\n * - If you need unsigned integers, consider using {@link getU64Codec}.\n *\n * Separate {@link getI64Encoder} and {@link getI64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI64Encoder().encode(-42);\n * const value = getI64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI64Encoder}\n * @see {@link getI64Decoder}\n */\nexport const getI64Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI64Encoder(config), getI64Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 8-bit signed integers (`i8`).\n *\n * This encoder serializes `i8` values using 1 byte.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI8Codec}.\n *\n * @returns A `FixedSizeEncoder` for encoding `i8` values.\n *\n * @example\n * Encoding an `i8` value.\n * ```ts\n * const encoder = getI8Encoder();\n * const bytes = encoder.encode(-42); // 0xd6\n * ```\n *\n * @see {@link getI8Codec}\n */\nexport const getI8Encoder = (): FixedSizeEncoder =>\n numberEncoderFactory({\n name: 'i8',\n range: [-Number('0x7f') - 1, Number('0x7f')],\n set: (view, value) => view.setInt8(0, Number(value)),\n size: 1,\n });\n\n/**\n * Returns a decoder for 8-bit signed integers (`i8`).\n *\n * This decoder deserializes `i8` values from 1 byte.\n * The decoded value is always a `number`.\n *\n * For more details, see {@link getI8Codec}.\n *\n * @returns A `FixedSizeDecoder` for decoding `i8` values.\n *\n * @example\n * Decoding an `i8` value.\n * ```ts\n * const decoder = getI8Decoder();\n * const value = decoder.decode(new Uint8Array([0xd6])); // -42\n * ```\n *\n * @see {@link getI8Codec}\n */\nexport const getI8Decoder = (): FixedSizeDecoder =>\n numberDecoderFactory({\n get: view => view.getInt8(0),\n name: 'i8',\n size: 1,\n });\n\n/**\n * Returns a codec for encoding and decoding 8-bit signed integers (`i8`).\n *\n * This codec serializes `i8` values using 1 byte.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `number`.\n *\n * @returns A `FixedSizeCodec` for encoding and decoding `i8` values.\n *\n * @example\n * Encoding and decoding an `i8` value.\n * ```ts\n * const codec = getI8Codec();\n * const bytes = codec.encode(-42); // 0xd6\n * const value = codec.decode(bytes); // -42\n * ```\n *\n * @remarks\n * This codec supports values between `-2^7` (`-128`) and `2^7 - 1` (`127`).\n *\n * - If you need a larger signed integer, consider using {@link getI16Codec}.\n * - If you need an unsigned integer, consider using {@link getU8Codec}.\n *\n * Separate {@link getI8Encoder} and {@link getI8Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI8Encoder().encode(-42);\n * const value = getI8Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI8Encoder}\n * @see {@link getI8Decoder}\n */\nexport const getI8Codec = (): FixedSizeCodec =>\n combineCodec(getI8Encoder(), getI8Decoder());\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n Offset,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertNumberIsBetweenForCodec } from './assertions';\n\n/**\n * Returns an encoder for `shortU16` values.\n *\n * This encoder serializes `shortU16` values using **1 to 3 bytes**.\n * Smaller values use fewer bytes, while larger values take up more space.\n *\n * For more details, see {@link getShortU16Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding `shortU16` values.\n *\n * @example\n * Encoding a `shortU16` value.\n * ```ts\n * const encoder = getShortU16Encoder();\n * encoder.encode(42); // 0x2a\n * encoder.encode(128); // 0x8001\n * encoder.encode(16384); // 0x808001\n * ```\n *\n * @see {@link getShortU16Codec}\n */\nexport const getShortU16Encoder = (): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: bigint | number): number => {\n if (value <= 0b01111111) return 1;\n if (value <= 0b0011111111111111) return 2;\n return 3;\n },\n maxSize: 3,\n write: (value: bigint | number, bytes: Uint8Array, offset: Offset): Offset => {\n assertNumberIsBetweenForCodec('shortU16', 0, 65535, value);\n const shortU16Bytes = [0];\n for (let ii = 0; ; ii += 1) {\n // Shift the bits of the value over such that the next 7 bits are at the right edge.\n const alignedValue = Number(value) >> (ii * 7);\n if (alignedValue === 0) {\n // No more bits to consume.\n break;\n }\n // Extract those 7 bits using a mask.\n const nextSevenBits = 0b1111111 & alignedValue;\n shortU16Bytes[ii] = nextSevenBits;\n if (ii > 0) {\n // Set the continuation bit of the previous slice.\n shortU16Bytes[ii - 1] |= 0b10000000;\n }\n }\n bytes.set(shortU16Bytes, offset);\n return offset + shortU16Bytes.length;\n },\n });\n\n/**\n * Returns a decoder for `shortU16` values.\n *\n * This decoder deserializes `shortU16` values from **1 to 3 bytes**.\n * The number of bytes used depends on the encoded value.\n *\n * For more details, see {@link getShortU16Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding `shortU16` values.\n *\n * @example\n * Decoding a `shortU16` value.\n * ```ts\n * const decoder = getShortU16Decoder();\n * decoder.decode(new Uint8Array([0x2a])); // 42\n * decoder.decode(new Uint8Array([0x80, 0x01])); // 128\n * decoder.decode(new Uint8Array([0x80, 0x80, 0x01])); // 16384\n * ```\n *\n * @see {@link getShortU16Codec}\n */\nexport const getShortU16Decoder = (): VariableSizeDecoder =>\n createDecoder({\n maxSize: 3,\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset): [number, Offset] => {\n let value = 0;\n let byteCount = 0;\n while (++byteCount) {\n const byteIndex = byteCount - 1;\n const currentByte = bytes[offset + byteIndex];\n const nextSevenBits = 0b1111111 & currentByte;\n // Insert the next group of seven bits into the correct slot of the output value.\n value |= nextSevenBits << (byteIndex * 7);\n if ((currentByte & 0b10000000) === 0) {\n // This byte does not have its continuation bit set. We're done.\n break;\n }\n }\n return [value, offset + byteCount];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding `shortU16` values.\n *\n * It serializes unsigned integers using **1 to 3 bytes** based on the encoded value.\n * The larger the value, the more bytes it uses.\n *\n * - If the value is `<= 0x7f` (127), it is stored in a **single byte**\n * and the first bit is set to `0` to indicate the end of the value.\n * - Otherwise, the first bit is set to `1` to indicate that the value continues in the next byte, which follows the same pattern.\n * - This process repeats until the value is fully encoded in up to 3 bytes. The third and last byte, if needed, uses all 8 bits to store the remaining value.\n *\n * In other words, the encoding scheme follows this structure:\n *\n * ```txt\n * 0XXXXXXX <- Values 0 to 127 (1 byte)\n * 1XXXXXXX 0XXXXXXX <- Values 128 to 16,383 (2 bytes)\n * 1XXXXXXX 1XXXXXXX XXXXXXXX <- Values 16,384 to 4,194,303 (3 bytes)\n * ```\n *\n * @returns A `VariableSizeCodec` for encoding and decoding `shortU16` values.\n *\n * @example\n * Encoding and decoding `shortU16` values.\n * ```ts\n * const codec = getShortU16Codec();\n * const bytes1 = codec.encode(42); // 0x2a\n * const bytes2 = codec.encode(128); // 0x8001\n * const bytes3 = codec.encode(16384); // 0x808001\n *\n * codec.decode(bytes1); // 42\n * codec.decode(bytes2); // 128\n * codec.decode(bytes3); // 16384\n * ```\n *\n * @remarks\n * This codec efficiently stores small numbers, making it useful for transactions and compact representations.\n *\n * If you need a fixed-size `u16` codec, consider using {@link getU16Codec}.\n *\n * Separate {@link getShortU16Encoder} and {@link getShortU16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getShortU16Encoder().encode(42);\n * const value = getShortU16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getShortU16Encoder}\n * @see {@link getShortU16Decoder}\n */\nexport const getShortU16Codec = (): VariableSizeCodec =>\n combineCodec(getShortU16Encoder(), getShortU16Decoder());\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 128-bit unsigned integers (`u128`).\n *\n * This encoder serializes `u128` values using sixteen bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU128Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeEncoder` for encoding `u128` values.\n *\n * @example\n * Encoding a `u128` value.\n * ```ts\n * const encoder = getU128Encoder();\n * const bytes = encoder.encode(42n); // 0x2a000000000000000000000000000000\n * ```\n *\n * @see {@link getU128Codec}\n */\nexport const getU128Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u128',\n range: [0n, BigInt('0xffffffffffffffffffffffffffffffff')],\n set: (view, value, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const rightMask = 0xffffffffffffffffn;\n view.setBigUint64(leftOffset, BigInt(value) >> 64n, le);\n view.setBigUint64(rightOffset, BigInt(value) & rightMask, le);\n },\n size: 16,\n });\n\n/**\n * Returns a decoder for 128-bit unsigned integers (`u128`).\n *\n * This decoder deserializes `u128` values from sixteen bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU128Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeDecoder` for decoding `u128` values.\n *\n * @example\n * Decoding a `u128` value.\n * ```ts\n * const decoder = getU128Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])); // 42n\n * ```\n *\n * @see {@link getU128Codec}\n */\nexport const getU128Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const left = view.getBigUint64(leftOffset, le);\n const right = view.getBigUint64(rightOffset, le);\n return (left << 64n) + right;\n },\n name: 'u128',\n size: 16,\n });\n\n/**\n * Returns a codec for encoding and decoding 128-bit unsigned integers (`u128`).\n *\n * This codec serializes `u128` values using 16 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `u128` values.\n *\n * @example\n * Encoding and decoding a `u128` value.\n * ```ts\n * const codec = getU128Codec();\n * const bytes = codec.encode(42); // 0x2a000000000000000000000000000000\n * const value = codec.decode(bytes); // 42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getU128Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x0000000000000000000000000000002a\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^128 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller unsigned integer, consider using {@link getU64Codec} or {@link getU32Codec}.\n * - If you need signed integers, consider using {@link getI128Codec}.\n *\n * Separate {@link getU128Encoder} and {@link getU128Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU128Encoder().encode(42);\n * const value = getU128Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU128Encoder}\n * @see {@link getU128Decoder}\n */\nexport const getU128Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU128Encoder(config), getU128Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 16-bit unsigned integers (`u16`).\n *\n * This encoder serializes `u16` values using two bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU16Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeEncoder` for encoding `u16` values.\n *\n * @example\n * Encoding a `u16` value.\n * ```ts\n * const encoder = getU16Encoder();\n * const bytes = encoder.encode(42); // 0x2a00\n * ```\n *\n * @see {@link getU16Codec}\n */\nexport const getU16Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u16',\n range: [0, Number('0xffff')],\n set: (view, value, le) => view.setUint16(0, Number(value), le),\n size: 2,\n });\n\n/**\n * Returns a decoder for 16-bit unsigned integers (`u16`).\n *\n * This decoder deserializes `u16` values from two bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU16Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeDecoder` for decoding `u16` values.\n *\n * @example\n * Decoding a `u16` value.\n * ```ts\n * const decoder = getU16Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00])); // 42\n * ```\n *\n * @see {@link getU16Codec}\n */\nexport const getU16Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getUint16(0, le),\n name: 'u16',\n size: 2,\n });\n\n/**\n * Returns a codec for encoding and decoding 16-bit unsigned integers (`u16`).\n *\n * This codec serializes `u16` values using two bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeCodec` for encoding and decoding `u16` values.\n *\n * @example\n * Encoding and decoding a `u16` value.\n * ```ts\n * const codec = getU16Codec();\n * const bytes = codec.encode(42); // 0x2a00 (little-endian)\n * const value = codec.decode(bytes); // 42\n * ```\n *\n * @example\n * Storing values in big-endian format.\n * ```ts\n * const codec = getU16Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x002a\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^16 - 1`.\n * If you need a larger range, consider using {@link getU32Codec} or {@link getU64Codec}.\n * For signed integers, use {@link getI16Codec}.\n *\n * Separate {@link getU16Encoder} and {@link getU16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU16Encoder().encode(42);\n * const value = getU16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU16Encoder}\n * @see {@link getU16Decoder}\n */\nexport const getU16Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU16Encoder(config), getU16Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 32-bit unsigned integers (`u32`).\n *\n * This encoder serializes `u32` values using four bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU32Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeEncoder` for encoding `u32` values.\n *\n * @example\n * Encoding a `u32` value.\n * ```ts\n * const encoder = getU32Encoder();\n * const bytes = encoder.encode(42); // 0x2a000000\n * ```\n *\n * @see {@link getU32Codec}\n */\nexport const getU32Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u32',\n range: [0, Number('0xffffffff')],\n set: (view, value, le) => view.setUint32(0, Number(value), le),\n size: 4,\n });\n\n/**\n * Returns a decoder for 32-bit unsigned integers (`u32`).\n *\n * This decoder deserializes `u32` values from four bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU32Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeDecoder` for decoding `u32` values.\n *\n * @example\n * Decoding a `u32` value.\n * ```ts\n * const decoder = getU32Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @see {@link getU32Codec}\n */\nexport const getU32Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getUint32(0, le),\n name: 'u32',\n size: 4,\n });\n\n/**\n * Returns a codec for encoding and decoding 32-bit unsigned integers (`u32`).\n *\n * This codec serializes `u32` values using four bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeCodec` for encoding and decoding `u32` values.\n *\n * @example\n * Encoding and decoding a `u32` value.\n * ```ts\n * const codec = getU32Codec();\n * const bytes = codec.encode(42); // 0x2a000000 (little-endian)\n * const value = codec.decode(bytes); // 42\n * ```\n *\n * @example\n * Storing values in big-endian format.\n * ```ts\n * const codec = getU32Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x0000002a\n * ```\n *\n * @remarks\n * This codec only supports values between `0` and `2^32 - 1`.\n * If you need a larger range, consider using {@link getU64Codec} or {@link getU128Codec}.\n * For signed integers, use {@link getI32Codec}.\n *\n * Separate {@link getU32Encoder} and {@link getU32Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU32Encoder().encode(42);\n * const value = getU32Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU32Encoder}\n * @see {@link getU32Decoder}\n */\nexport const getU32Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU32Encoder(config), getU32Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 64-bit unsigned integers (`u64`).\n *\n * This encoder serializes `u64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getU64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `u64` values.\n *\n * @example\n * Encoding a `u64` value.\n * ```ts\n * const encoder = getU64Encoder();\n * const bytes = encoder.encode(42); // 0x2a00000000000000\n * ```\n *\n * @see {@link getU64Codec}\n */\nexport const getU64Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u64',\n range: [0n, BigInt('0xffffffffffffffff')],\n set: (view, value, le) => view.setBigUint64(0, BigInt(value), le),\n size: 8,\n });\n\n/**\n * Returns a decoder for 64-bit unsigned integers (`u64`).\n *\n * This decoder deserializes `u64` values from 8 bytes.\n * The decoded value is always a `bigint`.\n *\n * For more details, see {@link getU64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `u64` values.\n *\n * @example\n * Decoding a `u64` value.\n * ```ts\n * const decoder = getU64Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])); // 42n\n * ```\n *\n * @see {@link getU64Codec}\n */\nexport const getU64Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getBigUint64(0, le),\n name: 'u64',\n size: 8,\n });\n\n/**\n * Returns a codec for encoding and decoding 64-bit unsigned integers (`u64`).\n *\n * This codec serializes `u64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `u64` values.\n *\n * @example\n * Encoding and decoding a `u64` value.\n * ```ts\n * const codec = getU64Codec();\n * const bytes = codec.encode(42); // 0x2a00000000000000\n * const value = codec.decode(bytes); // 42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getU64Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x000000000000002a\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^64 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller unsigned integer, consider using {@link getU32Codec} or {@link getU16Codec}.\n * - If you need a larger unsigned integer, consider using {@link getU128Codec}.\n * - If you need signed integers, consider using {@link getI64Codec}.\n *\n * Separate {@link getU64Encoder} and {@link getU64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU64Encoder().encode(42);\n * const value = getU64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU64Encoder}\n * @see {@link getU64Decoder}\n */\nexport const getU64Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU64Encoder(config), getU64Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 8-bit unsigned integers (`u8`).\n *\n * This encoder serializes `u8` values using a single byte.\n *\n * For more details, see {@link getU8Codec}.\n *\n * @returns A `FixedSizeEncoder` for encoding `u8` values.\n *\n * @example\n * Encoding a `u8` value.\n * ```ts\n * const encoder = getU8Encoder();\n * const bytes = encoder.encode(42); // 0x2a\n * ```\n *\n * @see {@link getU8Codec}\n */\nexport const getU8Encoder = (): FixedSizeEncoder =>\n numberEncoderFactory({\n name: 'u8',\n range: [0, Number('0xff')],\n set: (view, value) => view.setUint8(0, Number(value)),\n size: 1,\n });\n\n/**\n * Returns a decoder for 8-bit unsigned integers (`u8`).\n *\n * This decoder deserializes `u8` values from a single byte.\n *\n * For more details, see {@link getU8Codec}.\n *\n * @returns A `FixedSizeDecoder` for decoding `u8` values.\n *\n * @example\n * Decoding a `u8` value.\n * ```ts\n * const decoder = getU8Decoder();\n * const value = decoder.decode(new Uint8Array([0xff])); // 255\n * ```\n *\n * @see {@link getU8Codec}\n */\nexport const getU8Decoder = (): FixedSizeDecoder =>\n numberDecoderFactory({\n get: view => view.getUint8(0),\n name: 'u8',\n size: 1,\n });\n\n/**\n * Returns a codec for encoding and decoding 8-bit unsigned integers (`u8`).\n *\n * This codec serializes `u8` values using a single byte.\n *\n * @returns A `FixedSizeCodec` for encoding and decoding `u8` values.\n *\n * @example\n * Encoding and decoding a `u8` value.\n * ```ts\n * const codec = getU8Codec();\n * const bytes = codec.encode(255); // 0xff\n * const value = codec.decode(bytes); // 255\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^8 - 1` (0 to 255).\n * If you need larger integers, consider using {@link getU16Codec}, {@link getU32Codec}, or {@link getU64Codec}.\n * For signed integers, use {@link getI8Codec}.\n *\n * Separate {@link getU8Encoder} and {@link getU8Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU8Encoder().encode(42);\n * const value = getU8Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU8Encoder}\n * @see {@link getU8Decoder}\n */\nexport const getU8Codec = (): FixedSizeCodec =>\n combineCodec(getU8Encoder(), getU8Decoder());\n","import { SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, SolanaError } from '@solana/errors';\n\n/** Checks the number of items in an array-like structure is expected. */\nexport function assertValidNumberOfItemsForCodec(\n codecDescription: string,\n expected: bigint | number,\n actual: bigint | number,\n) {\n if (expected !== actual) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, {\n actual,\n codecDescription,\n expected,\n });\n }\n}\n","import { isFixedSize } from '@solana/codecs-core';\n\n/**\n * Functionally, this type helper is equivalent to the identity type — i.e. `type Identity = T`.\n * However, wrapping generic object mappings in this type significantly reduces the number\n * of instantiation expressions processed, which increases TypeScript performance and\n * prevents \"Type instantiation is excessively deep and possibly infinite\" errors.\n *\n * This works because TypeScript doesn't create a new level of nesting when encountering conditional generic types.\n * @see https://github.com/microsoft/TypeScript/issues/34933\n * @see https://github.com/kysely-org/kysely/pull/483\n */\nexport type DrainOuterGeneric = [T] extends [unknown] ? T : never;\n\nexport function maxCodecSizes(sizes: (number | null)[]): number | null {\n return sizes.reduce(\n (all, size) => (all === null || size === null ? null : Math.max(all, size)),\n 0 as number | null,\n );\n}\n\nexport function sumCodecSizes(sizes: (number | null)[]): number | null {\n return sizes.reduce((all, size) => (all === null || size === null ? null : all + size), 0 as number | null);\n}\n\nexport function getFixedSize(codec: { fixedSize: number } | { maxSize?: number }): number | null {\n return isFixedSize(codec) ? codec.fixedSize : null;\n}\n\nexport function getMaxSize(codec: { fixedSize: number } | { maxSize?: number }): number | null {\n return isFixedSize(codec) ? codec.fixedSize : (codec.maxSize ?? null);\n}\n","import {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getU32Decoder, getU32Encoder, NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\n\nimport { assertValidNumberOfItemsForCodec } from './assertions';\nimport { getFixedSize, getMaxSize } from './utils';\n\n/**\n * Defines the possible size strategies for array-like codecs (`array`, `map`, and `set`).\n *\n * The size of the collection can be determined using one of the following approaches:\n * - A {@link NumberCodec}, {@link NumberDecoder}, or {@link NumberEncoder} to store a size prefix.\n * - A fixed `number` of items, enforcing an exact length.\n * - The string `\"remainder\"`, which infers the number of items by consuming the rest of the available bytes.\n * This option is only available when encoding fixed-size items.\n *\n * @typeParam TPrefix - A number codec, decoder, or encoder used for size prefixing.\n */\nexport type ArrayLikeCodecSize =\n | TPrefix\n | number\n | 'remainder';\n\n/**\n * Defines the configuration options for array codecs.\n *\n * @typeParam TPrefix - A number codec, decoder, or encoder used for size prefixing.\n */\nexport type ArrayCodecConfig = {\n /**\n * Specifies how the size of the array is determined.\n *\n * - A {@link NumberCodec}, {@link NumberDecoder}, or {@link NumberEncoder} stores a size prefix before encoding the array.\n * - A `number` enforces a fixed number of elements.\n * - `\"remainder\"` uses all remaining bytes to infer the array length (only for fixed-size items).\n *\n * @defaultValue A `u32` size prefix.\n */\n size?: ArrayLikeCodecSize;\n};\n\n/**\n * Returns an encoder for arrays of values.\n *\n * This encoder serializes arrays by encoding each element using the provided item encoder.\n * By default, a `u32` size prefix is included to indicate the number of items in the array.\n * The `size` option can be used to modify this behaviour.\n *\n * For more details, see {@link getArrayCodec}.\n *\n * @typeParam TFrom - The type of the elements in the array.\n *\n * @param item - The encoder for each item in the array.\n * @param config - Optional configuration for the size encoding strategy.\n * @returns A `VariableSizeEncoder` for encoding arrays.\n *\n * @example\n * Encoding an array of `u8` numbers.\n * ```ts\n * const encoder = getArrayEncoder(getU8Encoder());\n * const bytes = encoder.encode([1, 2, 3]);\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix telling us to read 3 items.\n * ```\n *\n * @see {@link getArrayCodec}\n */\nexport function getArrayEncoder(\n item: Encoder,\n config: ArrayCodecConfig & { size: 0 },\n): FixedSizeEncoder;\nexport function getArrayEncoder(\n item: FixedSizeEncoder,\n config: ArrayCodecConfig & { size: number },\n): FixedSizeEncoder;\nexport function getArrayEncoder(\n item: Encoder,\n config?: ArrayCodecConfig,\n): VariableSizeEncoder;\nexport function getArrayEncoder(\n item: Encoder,\n config: ArrayCodecConfig = {},\n): Encoder {\n const size = config.size ?? getU32Encoder();\n const fixedSize = computeArrayLikeCodecSize(size, getFixedSize(item));\n const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? undefined;\n\n return createEncoder({\n ...(fixedSize !== null\n ? { fixedSize }\n : {\n getSizeFromValue: (array: TFrom[]) => {\n const prefixSize = typeof size === 'object' ? getEncodedSize(array.length, size) : 0;\n return prefixSize + [...array].reduce((all, value) => all + getEncodedSize(value, item), 0);\n },\n maxSize,\n }),\n write: (array: TFrom[], bytes, offset) => {\n if (typeof size === 'number') {\n assertValidNumberOfItemsForCodec('array', size, array.length);\n }\n if (typeof size === 'object') {\n offset = size.write(array.length, bytes, offset);\n }\n array.forEach(value => {\n offset = item.write(value, bytes, offset);\n });\n return offset;\n },\n });\n}\n\n/**\n * Returns a decoder for arrays of values.\n *\n * This decoder deserializes arrays by decoding each element using the provided item decoder.\n * By default, a `u32` size prefix is expected to indicate the number of items in the array.\n * The `size` option can be used to modify this behaviour.\n *\n * For more details, see {@link getArrayCodec}.\n *\n * @typeParam TTo - The type of the decoded elements in the array.\n *\n * @param item - The decoder for each item in the array.\n * @param config - Optional configuration for the size decoding strategy.\n * @returns A `VariableSizeDecoder` for decoding arrays.\n *\n * @example\n * Decoding an array of `u8` numbers.\n * ```ts\n * const decoder = getArrayDecoder(getU8Decoder());\n * const array = decoder.decode(new Uint8Array([0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03]));\n * // [1, 2, 3]\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix telling us to read 3 items.\n * ```\n *\n * @see {@link getArrayCodec}\n */\nexport function getArrayDecoder(\n item: Decoder,\n config: ArrayCodecConfig & { size: 0 },\n): FixedSizeDecoder;\nexport function getArrayDecoder(\n item: FixedSizeDecoder,\n config: ArrayCodecConfig & { size: number },\n): FixedSizeDecoder;\nexport function getArrayDecoder(\n item: Decoder,\n config?: ArrayCodecConfig,\n): VariableSizeDecoder;\nexport function getArrayDecoder(item: Decoder, config: ArrayCodecConfig = {}): Decoder {\n const size = config.size ?? getU32Decoder();\n const itemSize = getFixedSize(item);\n const fixedSize = computeArrayLikeCodecSize(size, itemSize);\n const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? undefined;\n\n return createDecoder({\n ...(fixedSize !== null ? { fixedSize } : { maxSize }),\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const array: TTo[] = [];\n if (typeof size === 'object' && bytes.slice(offset).length === 0) {\n return [array, offset];\n }\n\n if (size === 'remainder') {\n while (offset < bytes.length) {\n const [value, newOffset] = item.read(bytes, offset);\n offset = newOffset;\n array.push(value);\n }\n return [array, offset];\n }\n\n const [resolvedSize, newOffset] = typeof size === 'number' ? [size, offset] : size.read(bytes, offset);\n offset = newOffset;\n for (let i = 0; i < resolvedSize; i += 1) {\n const [value, newOffset] = item.read(bytes, offset);\n offset = newOffset;\n array.push(value);\n }\n return [array, offset];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding arrays of values.\n *\n * This codec serializes arrays by encoding each element using the provided item codec.\n * By default, a `u32` size prefix is included to indicate the number of items in the array.\n * The `size` option can be used to modify this behaviour.\n *\n * @typeParam TFrom - The type of the elements to encode.\n * @typeParam TTo - The type of the decoded elements.\n *\n * @param item - The codec for each item in the array.\n * @param config - Optional configuration for the size encoding/decoding strategy.\n * @returns A `VariableSizeCodec` for encoding and decoding arrays.\n *\n * @example\n * Encoding and decoding an array of `u8` numbers.\n * ```ts\n * const codec = getArrayCodec(getU8Codec());\n * const bytes = codec.encode([1, 2, 3]);\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix telling us to read 3 items.\n *\n * const array = codec.decode(bytes);\n * // [1, 2, 3]\n * ```\n *\n * @example\n * Using a `u16` size prefix instead of `u32`.\n * ```ts\n * const codec = getArrayCodec(getU8Codec(), { size: getU16Codec() });\n * const bytes = codec.encode([1, 2, 3]);\n * // 0x0300010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 2-byte prefix telling us to read 3 items.\n * ```\n *\n * @example\n * Using a fixed-size array of 3 items.\n * ```ts\n * const codec = getArrayCodec(getU8Codec(), { size: 3 });\n * codec.encode([1, 2, 3]);\n * // 0x010203\n * // └-- 3 items of 1 byte each. There must always be 3 items in the array.\n * ```\n *\n * @example\n * Using the `\"remainder\"` size strategy.\n * ```ts\n * const codec = getArrayCodec(getU8Codec(), { size: 'remainder' });\n * codec.encode([1, 2, 3]);\n * // 0x010203\n * // └-- 3 items of 1 byte each. The size is inferred from the remainder of the bytes.\n * ```\n *\n * @remarks\n * The size of the array can be controlled using the `size` option:\n * - A `Codec` (e.g. `getU16Codec()`) stores a size prefix before the array.\n * - A `number` enforces a fixed number of elements.\n * - `\"remainder\"` uses all remaining bytes to infer the array length.\n *\n * Separate {@link getArrayEncoder} and {@link getArrayDecoder} functions are available.\n *\n * ```ts\n * const bytes = getArrayEncoder(getU8Encoder()).encode([1, 2, 3]);\n * const array = getArrayDecoder(getU8Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getArrayEncoder}\n * @see {@link getArrayDecoder}\n */\nexport function getArrayCodec(\n item: Codec,\n config: ArrayCodecConfig & { size: 0 },\n): FixedSizeCodec;\nexport function getArrayCodec(\n item: FixedSizeCodec,\n config: ArrayCodecConfig & { size: number },\n): FixedSizeCodec;\nexport function getArrayCodec(\n item: Codec,\n config?: ArrayCodecConfig,\n): VariableSizeCodec;\nexport function getArrayCodec(\n item: Codec,\n config: ArrayCodecConfig = {},\n): Codec {\n return combineCodec(getArrayEncoder(item, config as object), getArrayDecoder(item, config as object));\n}\n\nfunction computeArrayLikeCodecSize(size: number | object | 'remainder', itemSize: number | null): number | null {\n if (typeof size !== 'number') return null;\n if (size === 0) return 0;\n return itemSize === null ? null : itemSize * size;\n}\n","import {\n assertByteArrayHasEnoughBytesForCodec,\n combineCodec,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n} from '@solana/codecs-core';\n\n/**\n * Defines the configuration options for bit array codecs.\n *\n * A bit array codec encodes an array of booleans into bits, packing them into bytes.\n * This configuration allows adjusting the bit ordering.\n *\n * @see {@link getBitArrayEncoder}\n * @see {@link getBitArrayDecoder}\n * @see {@link getBitArrayCodec}\n */\nexport type BitArrayCodecConfig = {\n /**\n * Determines whether the bits should be read in reverse order.\n *\n * - `false` (default): The first boolean is stored in the most significant bit (MSB-first).\n * - `true`: The first boolean is stored in the least significant bit (LSB-first).\n *\n * @defaultValue `false`\n */\n backward?: boolean;\n};\n\n/**\n * Returns an encoder that packs an array of booleans into bits.\n *\n * This encoder converts a list of `boolean` values into a compact bit representation,\n * storing 8 booleans per byte.\n *\n * The `backward` config option determines whether the bits are stored in MSB-first (`false`)\n * or LSB-first (`true`).\n *\n * For more details, see {@link getBitArrayCodec}.\n *\n * @typeParam TSize - The number of bytes used to store the bit array.\n *\n * @param size - The number of bytes allocated for the bit array (must be sufficient for the expected boolean count).\n * @param config - Configuration options for encoding the bit array.\n * @returns A `FixedSizeEncoder` for encoding bit arrays.\n *\n * @example\n * Encoding a bit array.\n * ```ts\n * const encoder = getBitArrayEncoder(1);\n *\n * encoder.encode([true, false, true, false, false, false, false, false]);\n * // 0xa0 (0b10100000)\n * ```\n *\n * @see {@link getBitArrayCodec}\n */\nexport function getBitArrayEncoder(\n size: TSize,\n config: BitArrayCodecConfig | boolean = {},\n): FixedSizeEncoder {\n const parsedConfig: BitArrayCodecConfig = typeof config === 'boolean' ? { backward: config } : config;\n const backward = parsedConfig.backward ?? false;\n return createEncoder({\n fixedSize: size,\n write(value: boolean[], bytes, offset) {\n const bytesToAdd: number[] = [];\n\n for (let i = 0; i < size; i += 1) {\n let byte = 0;\n for (let j = 0; j < 8; j += 1) {\n const feature = Number(value[i * 8 + j] ?? 0);\n byte |= feature << (backward ? j : 7 - j);\n }\n if (backward) {\n bytesToAdd.unshift(byte);\n } else {\n bytesToAdd.push(byte);\n }\n }\n\n bytes.set(bytesToAdd, offset);\n return size;\n },\n });\n}\n\n/**\n * Returns a decoder that unpacks bits into an array of booleans.\n *\n * This decoder converts a compact bit representation back into a list of `boolean` values.\n * Each byte is expanded into 8 booleans.\n *\n * The `backward` config option determines whether the bits are read in MSB-first (`false`)\n * or LSB-first (`true`).\n *\n * For more details, see {@link getBitArrayCodec}.\n *\n * @typeParam TSize - The number of bytes used to store the bit array.\n *\n * @param size - The number of bytes allocated for the bit array (must be sufficient for the expected boolean count).\n * @param config - Configuration options for decoding the bit array.\n * @returns A `FixedSizeDecoder` for decoding bit arrays.\n *\n * @example\n * Decoding a bit array.\n * ```ts\n * const decoder = getBitArrayDecoder(1);\n *\n * decoder.decode(new Uint8Array([0xa0]));\n * // [true, false, true, false, false, false, false, false]\n * ```\n *\n * @see {@link getBitArrayCodec}\n */\nexport function getBitArrayDecoder(\n size: TSize,\n config: BitArrayCodecConfig | boolean = {},\n): FixedSizeDecoder {\n const parsedConfig: BitArrayCodecConfig = typeof config === 'boolean' ? { backward: config } : config;\n const backward = parsedConfig.backward ?? false;\n return createDecoder({\n fixedSize: size,\n read(bytes, offset) {\n assertByteArrayHasEnoughBytesForCodec('bitArray', size, bytes, offset);\n const booleans: boolean[] = [];\n let slice = bytes.slice(offset, offset + size);\n slice = backward ? slice.reverse() : slice;\n\n slice.forEach(byte => {\n for (let i = 0; i < 8; i += 1) {\n if (backward) {\n booleans.push(Boolean(byte & 1));\n byte >>= 1;\n } else {\n booleans.push(Boolean(byte & 0b1000_0000));\n byte <<= 1;\n }\n }\n });\n\n return [booleans, offset + size];\n },\n });\n}\n\n/**\n * Returns a codec that encodes and decodes boolean arrays as compact bit representations.\n *\n * This codec efficiently stores boolean arrays as bits, packing 8 values per byte.\n * The `backward` config option determines whether bits are stored in MSB-first (`false`)\n * or LSB-first (`true`).\n *\n * @typeParam TSize - The number of bytes used to store the bit array.\n *\n * @param size - The number of bytes allocated for the bit array (must be sufficient for the expected boolean count).\n * @param config - Configuration options for encoding and decoding the bit array.\n * @returns A `FixedSizeCodec` for encoding and decoding bit arrays.\n *\n * @example\n * Encoding and decoding a bit array.\n * ```ts\n * const codec = getBitArrayCodec(1);\n *\n * codec.encode([true, false, true, false, false, false, false, false]);\n * // 0xa0 (0b10100000)\n *\n * codec.decode(new Uint8Array([0xa0]));\n * // [true, false, true, false, false, false, false, false]\n * ```\n *\n * @example\n * Encoding and decoding a bit array backwards.\n * ```ts\n * const codec = getBitArrayCodec(1, { backward: true });\n *\n * codec.encode([true, false, true, false, false, false, false, false]);\n * // 0x05 (0b00000101)\n *\n * codec.decode(new Uint8Array([0x05]));\n * // [true, false, true, false, false, false, false, false]\n * ```\n *\n * @remarks\n * Separate {@link getBitArrayEncoder} and {@link getBitArrayDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBitArrayEncoder(1).encode([true, false, true, false]);\n * const value = getBitArrayDecoder(1).decode(bytes);\n * ```\n *\n * @see {@link getBitArrayEncoder}\n * @see {@link getBitArrayDecoder}\n */\nexport function getBitArrayCodec(\n size: TSize,\n config: BitArrayCodecConfig | boolean = {},\n): FixedSizeCodec {\n return combineCodec(getBitArrayEncoder(size, config), getBitArrayDecoder(size, config));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\n\n/**\n * Defines the configuration options for boolean codecs.\n *\n * A boolean codec encodes `true` as `1` and `false` as `0`.\n * The `size` option allows customizing the number codec used for storage.\n *\n * @typeParam TSize - A number codec, encoder, or decoder used for boolean representation.\n *\n * @see {@link getBooleanEncoder}\n * @see {@link getBooleanDecoder}\n * @see {@link getBooleanCodec}\n */\nexport type BooleanCodecConfig = {\n /**\n * The number codec used to store boolean values.\n *\n * - By default, booleans are stored as a `u8` (`1` for `true`, `0` for `false`).\n * - A custom number codec can be provided to change the storage size.\n *\n * @defaultValue `u8`\n */\n size?: TSize;\n};\n\n/**\n * Returns an encoder for boolean values.\n *\n * This encoder converts `true` into `1` and `false` into `0`.\n * The `size` option allows customizing the number codec used for storage.\n *\n * For more details, see {@link getBooleanCodec}.\n *\n * @param config - Configuration options for encoding booleans.\n * @returns A `FixedSizeEncoder` where `N` is the size of the number codec.\n *\n * @example\n * Encoding booleans.\n * ```ts\n * const encoder = getBooleanEncoder();\n *\n * encoder.encode(false); // 0x00\n * encoder.encode(true); // 0x01\n * ```\n *\n * @see {@link getBooleanCodec}\n */\nexport function getBooleanEncoder(): FixedSizeEncoder;\nexport function getBooleanEncoder(\n config: BooleanCodecConfig & { size: FixedSizeNumberEncoder },\n): FixedSizeEncoder;\nexport function getBooleanEncoder(config: BooleanCodecConfig): VariableSizeEncoder;\nexport function getBooleanEncoder(config: BooleanCodecConfig = {}): Encoder {\n return transformEncoder(config.size ?? getU8Encoder(), (value: boolean) => (value ? 1 : 0));\n}\n\n/**\n * Returns a decoder for boolean values.\n *\n * This decoder reads a number and interprets `1` as `true` and `0` as `false`.\n * The `size` option allows customizing the number codec used for storage.\n *\n * For more details, see {@link getBooleanCodec}.\n *\n * @param config - Configuration options for decoding booleans.\n * @returns A `FixedSizeDecoder` where `N` is the size of the number codec.\n *\n * @example\n * Decoding booleans.\n * ```ts\n * const decoder = getBooleanDecoder();\n *\n * decoder.decode(new Uint8Array([0x00])); // false\n * decoder.decode(new Uint8Array([0x01])); // true\n * ```\n *\n * @see {@link getBooleanCodec}\n */\nexport function getBooleanDecoder(): FixedSizeDecoder;\nexport function getBooleanDecoder(\n config: BooleanCodecConfig & { size: FixedSizeNumberDecoder },\n): FixedSizeDecoder;\nexport function getBooleanDecoder(config: BooleanCodecConfig): VariableSizeDecoder;\nexport function getBooleanDecoder(config: BooleanCodecConfig = {}): Decoder {\n return transformDecoder(config.size ?? getU8Decoder(), (value: bigint | number): boolean => Number(value) === 1);\n}\n\n/**\n * Returns a codec for encoding and decoding boolean values.\n *\n * By default, booleans are stored as a `u8` (`1` for `true`, `0` for `false`).\n * The `size` option allows customizing the number codec used for storage.\n *\n * @param config - Configuration options for encoding and decoding booleans.\n * @returns A `FixedSizeCodec` where `N` is the size of the number codec.\n *\n * @example\n * Encoding and decoding booleans using a `u8` (default).\n * ```ts\n * const codec = getBooleanCodec();\n *\n * codec.encode(false); // 0x00\n * codec.encode(true); // 0x01\n *\n * codec.decode(new Uint8Array([0x00])); // false\n * codec.decode(new Uint8Array([0x01])); // true\n * ```\n *\n * @example\n * Encoding and decoding booleans using a custom number codec.\n * ```ts\n * const codec = getBooleanCodec({ size: getU16Codec() });\n *\n * codec.encode(false); // 0x0000\n * codec.encode(true); // 0x0100\n *\n * codec.decode(new Uint8Array([0x00, 0x00])); // false\n * codec.decode(new Uint8Array([0x01, 0x00])); // true\n * ```\n *\n * @remarks\n * Separate {@link getBooleanEncoder} and {@link getBooleanDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBooleanEncoder().encode(true);\n * const value = getBooleanDecoder().decode(bytes);\n * ```\n *\n * @see {@link getBooleanEncoder}\n * @see {@link getBooleanDecoder}\n */\nexport function getBooleanCodec(): FixedSizeCodec;\nexport function getBooleanCodec(\n config: BooleanCodecConfig & { size: FixedSizeNumberCodec },\n): FixedSizeCodec;\nexport function getBooleanCodec(config: BooleanCodecConfig): VariableSizeCodec;\nexport function getBooleanCodec(config: BooleanCodecConfig = {}): Codec {\n return combineCodec(getBooleanEncoder(config), getBooleanDecoder(config));\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\n/**\n * Returns an encoder for raw byte arrays.\n *\n * This encoder writes byte arrays exactly as provided without modification.\n *\n * The size of the encoded byte array is determined by the length of the input.\n * - To enforce a fixed size, consider using {@link fixEncoderSize}.\n * - To add a size prefix, use {@link addEncoderSizePrefix}.\n * - To add a sentinel value, use {@link addEncoderSentinel}.\n *\n * For more details, see {@link getBytesCodec}.\n *\n * @returns A `VariableSizeEncoder`.\n *\n * @example\n * Encoding a byte array as-is.\n * ```ts\n * const encoder = getBytesEncoder();\n *\n * encoder.encode(new Uint8Array([1, 2, 3])); // 0x010203\n * encoder.encode(new Uint8Array([255, 0, 127])); // 0xff007f\n * ```\n *\n * @see {@link getBytesCodec}\n */\nexport function getBytesEncoder(): VariableSizeEncoder {\n return createEncoder({\n getSizeFromValue: value => value.length,\n write: (value, bytes, offset) => {\n bytes.set(value, offset);\n return offset + value.length;\n },\n });\n}\n\n/**\n * Returns a decoder for raw byte arrays.\n *\n * This decoder reads byte arrays exactly as provided without modification.\n *\n * The decoded byte array extends from the provided offset to the end of the input.\n * - To enforce a fixed size, consider using {@link fixDecoderSize}.\n * - To add a size prefix, use {@link addDecoderSizePrefix}.\n * - To add a sentinel value, use {@link addDecoderSentinel}.\n *\n * For more details, see {@link getBytesCodec}.\n *\n * @returns A `VariableSizeDecoder`.\n *\n * @example\n * Decoding a byte array as-is.\n * ```ts\n * const decoder = getBytesDecoder();\n *\n * decoder.decode(new Uint8Array([1, 2, 3])); // Uint8Array([1, 2, 3])\n * decoder.decode(new Uint8Array([255, 0, 127])); // Uint8Array([255, 0, 127])\n * ```\n *\n * @see {@link getBytesCodec}\n */\nexport function getBytesDecoder(): VariableSizeDecoder {\n return createDecoder({\n read: (bytes, offset) => {\n const slice = bytes.slice(offset);\n return [slice, offset + slice.length];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding raw byte arrays.\n *\n * This codec serializes and deserializes byte arrays without modification.\n *\n * The size of the encoded and decoded byte array is determined dynamically.\n * This means, when reading, the codec will consume all remaining bytes in the input.\n * - To enforce a fixed size, consider using {@link fixCodecSize}.\n * - To add a size prefix, use {@link addCodecSizePrefix}.\n * - To add a sentinel value, use {@link addCodecSentinel}.\n *\n * @returns A `VariableSizeCodec`.\n *\n * @example\n * Encoding and decoding a byte array.\n * ```ts\n * const codec = getBytesCodec();\n *\n * codec.encode(new Uint8Array([1, 2, 3])); // 0x010203\n * codec.decode(new Uint8Array([255, 0, 127])); // Uint8Array([255, 0, 127])\n * ```\n *\n * @remarks\n * Separate {@link getBytesEncoder} and {@link getBytesDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBytesEncoder().encode(new Uint8Array([1, 2, 3]));\n * const value = getBytesDecoder().decode(bytes);\n * ```\n *\n * @see {@link getBytesEncoder}\n * @see {@link getBytesDecoder}\n */\nexport function getBytesCodec(): VariableSizeCodec {\n return combineCodec(getBytesEncoder(), getBytesDecoder());\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\nconst enum HexC {\n ZERO = 48, // 0\n NINE = 57, // 9\n A_UP = 65, // A\n F_UP = 70, // F\n A_LO = 97, // a\n F_LO = 102, // f\n}\n\nconst INVALID_STRING_ERROR_BASE_CONFIG = {\n alphabet: '0123456789abcdef',\n base: 16,\n} as const;\n\nfunction charCodeToBase16(char: number) {\n if (char >= HexC.ZERO && char <= HexC.NINE) return char - HexC.ZERO;\n if (char >= HexC.A_UP && char <= HexC.F_UP) return char - (HexC.A_UP - 10);\n if (char >= HexC.A_LO && char <= HexC.F_LO) return char - (HexC.A_LO - 10);\n}\n\n/**\n * Returns an encoder for base-16 (hexadecimal) strings.\n *\n * This encoder serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-16 strings.\n *\n * @example\n * Encoding a base-16 string.\n * ```ts\n * const encoder = getBase16Encoder();\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Encoder = (): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: string) => Math.ceil(value.length / 2),\n write(value: string, bytes, offset) {\n const len = value.length;\n const al = len / 2;\n if (len === 1) {\n const c = value.charCodeAt(0);\n const n = charCodeToBase16(c);\n if (n === undefined) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n bytes.set([n], offset);\n return 1 + offset;\n }\n const hexBytes = new Uint8Array(al);\n for (let i = 0, j = 0; i < al; i++) {\n const c1 = value.charCodeAt(j++);\n const c2 = value.charCodeAt(j++);\n\n const n1 = charCodeToBase16(c1);\n const n2 = charCodeToBase16(c2);\n if (n1 === undefined || (n2 === undefined && !Number.isNaN(c2))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n hexBytes[i] = !Number.isNaN(c2) ? (n1 << 4) | (n2 ?? 0) : n1;\n }\n\n bytes.set(hexBytes, offset);\n return hexBytes.length + offset;\n },\n });\n\n/**\n * Returns a decoder for base-16 (hexadecimal) strings.\n *\n * This decoder deserializes base-16 encoded strings from a byte array.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-16 strings.\n *\n * @example\n * Decoding a base-16 string.\n * ```ts\n * const decoder = getBase16Decoder();\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Decoder = (): VariableSizeDecoder =>\n createDecoder({\n read(bytes, offset) {\n const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n return [value, bytes.length];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding base-16 (hexadecimal) strings.\n *\n * This codec serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-16 strings.\n *\n * @example\n * Encoding and decoding a base-16 string.\n * ```ts\n * const codec = getBase16Codec();\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-16 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase16Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-16 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase16Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase16Encoder} and {@link getBase16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase16Encoder().encode('deadface');\n * const value = getBase16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase16Encoder}\n * @see {@link getBase16Decoder}\n */\nexport const getBase16Codec = (): VariableSizeCodec => combineCodec(getBase16Encoder(), getBase16Decoder());\n","import {\n combineCodec,\n containsBytes,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\nimport { getBase16Decoder } from '@solana/codecs-strings';\nimport { SOLANA_ERROR__CODECS__INVALID_CONSTANT, SolanaError } from '@solana/errors';\n\n/**\n * Returns an encoder that always writes a predefined constant byte sequence.\n *\n * This encoder ensures that encoding always produces the specified byte array,\n * ignoring any input values.\n *\n * For more details, see {@link getConstantCodec}.\n *\n * @typeParam TConstant - The fixed byte sequence that will be written during encoding.\n *\n * @param constant - The predefined byte array to encode.\n * @returns A `FixedSizeEncoder` where `N` is the length of the constant.\n *\n * @example\n * Encoding a constant magic number.\n * ```ts\n * const encoder = getConstantEncoder(new Uint8Array([1, 2, 3, 4]));\n *\n * const bytes = encoder.encode();\n * // 0x01020304\n * // └──────┘ The predefined 4-byte constant.\n * ```\n *\n * @see {@link getConstantCodec}\n */\nexport function getConstantEncoder(\n constant: TConstant,\n): FixedSizeEncoder {\n return createEncoder({\n fixedSize: constant.length,\n write: (_, bytes, offset) => {\n bytes.set(constant, offset);\n return offset + constant.length;\n },\n });\n}\n\n/**\n * Returns a decoder that verifies a predefined constant byte sequence.\n *\n * This decoder reads the next bytes and checks that they match the provided constant.\n * If the bytes differ, it throws an error.\n *\n * For more details, see {@link getConstantCodec}.\n *\n * @typeParam TConstant - The fixed byte sequence expected during decoding.\n *\n * @param constant - The predefined byte array to verify.\n * @returns A `FixedSizeDecoder` where `N` is the length of the constant.\n *\n * @example\n * Decoding a constant magic number.\n * ```ts\n * const decoder = getConstantDecoder(new Uint8Array([1, 2, 3]));\n *\n * decoder.decode(new Uint8Array([1, 2, 3])); // Passes\n * decoder.decode(new Uint8Array([1, 2, 4])); // Throws an error\n * ```\n *\n * @see {@link getConstantCodec}\n */\nexport function getConstantDecoder(\n constant: TConstant,\n): FixedSizeDecoder {\n return createDecoder({\n fixedSize: constant.length,\n read: (bytes, offset) => {\n const base16 = getBase16Decoder();\n if (!containsBytes(bytes, constant, offset)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_CONSTANT, {\n constant,\n data: bytes,\n hexConstant: base16.decode(constant),\n hexData: base16.decode(bytes),\n offset,\n });\n }\n return [undefined, offset + constant.length];\n },\n });\n}\n\n/**\n * Returns a codec that encodes and decodes a predefined constant byte sequence.\n *\n * - **Encoding:** Always writes the specified byte array.\n * - **Decoding:** Asserts that the next bytes match the constant, throwing an error if they do not.\n *\n * This is useful for encoding fixed byte patterns required in a binary format or to use in\n * conjunction with other codecs such as {@link getHiddenPrefixCodec} or {@link getHiddenSuffixCodec}.\n *\n * @typeParam TConstant - The fixed byte sequence to encode and verify during decoding.\n *\n * @param constant - The predefined byte array to encode and assert during decoding.\n * @returns A `FixedSizeCodec` where `N` is the length of the constant.\n *\n * @example\n * Encoding and decoding a constant magic number.\n * ```ts\n * const codec = getConstantCodec(new Uint8Array([1, 2, 3]));\n *\n * codec.encode(); // 0x010203\n * codec.decode(new Uint8Array([1, 2, 3])); // Passes\n * codec.decode(new Uint8Array([1, 2, 4])); // Throws an error\n * ```\n *\n * @remarks\n * Separate {@link getConstantEncoder} and {@link getConstantDecoder} functions are available.\n *\n * ```ts\n * const bytes = getConstantEncoder(new Uint8Array([1, 2, 3])).encode();\n * getConstantDecoder(new Uint8Array([1, 2, 3])).decode(bytes);\n * ```\n *\n * @see {@link getConstantEncoder}\n * @see {@link getConstantDecoder}\n */\nexport function getConstantCodec(\n constant: TConstant,\n): FixedSizeCodec {\n return combineCodec(getConstantEncoder(constant), getConstantDecoder(constant));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidNumberOfItemsForCodec } from './assertions';\nimport { DrainOuterGeneric, getFixedSize, getMaxSize, sumCodecSizes } from './utils';\n\n/**\n * Infers the TypeScript type for a tuple that can be encoded using a tuple codec.\n *\n * This type maps each provided item encoder to its corresponding value type.\n *\n * @typeParam TItems - An array of encoders, each corresponding to a tuple element.\n */\ntype GetEncoderTypeFromItems[]> = DrainOuterGeneric<{\n [I in keyof TItems]: TItems[I] extends Encoder ? TFrom : never;\n}>;\n\n/**\n * Infers the TypeScript type for a tuple that can be decoded using a tuple codec.\n *\n * This type maps each provided item decoder to its corresponding value type.\n *\n * @typeParam TItems - An array of decoders, each corresponding to a tuple element.\n */\ntype GetDecoderTypeFromItems[]> = DrainOuterGeneric<{\n [I in keyof TItems]: TItems[I] extends Decoder ? TTo : never;\n}>;\n\n/**\n * Returns an encoder for tuples.\n *\n * This encoder serializes a fixed-size array (tuple) by encoding its items\n * sequentially using the provided item encoders.\n *\n * For more details, see {@link getTupleCodec}.\n *\n * @typeParam TItems - An array of encoders, each corresponding to a tuple element.\n *\n * @param items - The encoders for each item in the tuple.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding tuples.\n *\n * @example\n * Encoding a tuple with 2 items.\n * ```ts\n * const encoder = getTupleEncoder([fixCodecSize(getUtf8Encoder(), 5), getU8Encoder()]);\n *\n * const bytes = encoder.encode(['Alice', 42]);\n * // 0x416c6963652a\n * // | └── Second item (42)\n * // └── First item (\"Alice\")\n * ```\n *\n * @see {@link getTupleCodec}\n */\nexport function getTupleEncoder[]>(\n items: TItems,\n): FixedSizeEncoder>;\nexport function getTupleEncoder[]>(\n items: TItems,\n): VariableSizeEncoder>;\nexport function getTupleEncoder[]>(\n items: TItems,\n): Encoder> {\n type TFrom = GetEncoderTypeFromItems;\n const fixedSize = sumCodecSizes(items.map(getFixedSize));\n const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? undefined;\n\n return createEncoder({\n ...(fixedSize === null\n ? {\n getSizeFromValue: (value: TFrom) =>\n items.map((item, index) => getEncodedSize(value[index], item)).reduce((all, one) => all + one, 0),\n maxSize,\n }\n : { fixedSize }),\n write: (value: TFrom, bytes, offset) => {\n assertValidNumberOfItemsForCodec('tuple', items.length, value.length);\n items.forEach((item, index) => {\n offset = item.write(value[index], bytes, offset);\n });\n return offset;\n },\n });\n}\n\n/**\n * Returns a decoder for tuples.\n *\n * This decoder deserializes a fixed-size array (tuple) by decoding its items\n * sequentially using the provided item decoders.\n *\n * For more details, see {@link getTupleCodec}.\n *\n * @typeParam TItems - An array of decoders, each corresponding to a tuple element.\n *\n * @param items - The decoders for each item in the tuple.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding tuples.\n *\n * @example\n * Decoding a tuple with 2 items.\n * ```ts\n * const decoder = getTupleDecoder([fixCodecSize(getUtf8Decoder(), 5), getU8Decoder()]);\n *\n * const tuple = decoder.decode(new Uint8Array([\n * 0x41,0x6c,0x69,0x63,0x65,0x2a\n * ]));\n * // ['Alice', 42]\n * ```\n *\n * @see {@link getTupleCodec}\n */\nexport function getTupleDecoder[]>(\n items: TItems,\n): FixedSizeDecoder>;\nexport function getTupleDecoder[]>(\n items: TItems,\n): VariableSizeDecoder>;\nexport function getTupleDecoder[]>(\n items: TItems,\n): Decoder> {\n type TTo = GetDecoderTypeFromItems;\n const fixedSize = sumCodecSizes(items.map(getFixedSize));\n const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? undefined;\n\n return createDecoder({\n ...(fixedSize === null ? { maxSize } : { fixedSize }),\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const values = [] as Array & TTo;\n items.forEach(item => {\n const [newValue, newOffset] = item.read(bytes, offset);\n values.push(newValue);\n offset = newOffset;\n });\n return [values, offset];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding tuples.\n *\n * This codec serializes tuples by encoding and decoding each item sequentially.\n *\n * Unlike the {@link getArrayCodec} codec, each item in the tuple has its own codec\n * and, therefore, can be of a different type.\n *\n * @typeParam TItems - An array of codecs, each corresponding to a tuple element.\n *\n * @param items - The codecs for each item in the tuple.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding tuples.\n *\n * @example\n * Encoding and decoding a tuple with 2 items.\n * ```ts\n * const codec = getTupleCodec([fixCodecSize(getUtf8Codec(), 5), getU8Codec()]);\n *\n * const bytes = codec.encode(['Alice', 42]);\n * // 0x416c6963652a\n * // | └── Second item (42)\n * // └── First item (\"Alice\")\n *\n * const tuple = codec.decode(bytes);\n * // ['Alice', 42]\n * ```\n *\n * @remarks\n * Separate {@link getTupleEncoder} and {@link getTupleDecoder} functions are available.\n *\n * ```ts\n * const bytes = getTupleEncoder([fixCodecSize(getUtf8Encoder(), 5), getU8Encoder()])\n * .encode(['Alice', 42]);\n *\n * const tuple = getTupleDecoder([fixCodecSize(getUtf8Decoder(), 5), getU8Decoder()])\n * .decode(bytes);\n * ```\n *\n * @see {@link getTupleEncoder}\n * @see {@link getTupleDecoder}\n */\nexport function getTupleCodec[]>(\n items: TItems,\n): FixedSizeCodec, GetDecoderTypeFromItems & GetEncoderTypeFromItems>;\nexport function getTupleCodec[]>(\n items: TItems,\n): VariableSizeCodec<\n GetEncoderTypeFromItems,\n GetDecoderTypeFromItems & GetEncoderTypeFromItems\n>;\nexport function getTupleCodec[]>(\n items: TItems,\n): Codec, GetDecoderTypeFromItems & GetEncoderTypeFromItems> {\n return combineCodec(\n getTupleEncoder(items),\n getTupleDecoder(items) as Decoder & GetEncoderTypeFromItems>,\n );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n isFixedSize,\n Offset,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, SolanaError } from '@solana/errors';\n\nimport { DrainOuterGeneric, getMaxSize, maxCodecSizes } from './utils';\n\n/**\n * Infers the TypeScript type for values that can be encoded using a union codec.\n *\n * This type maps the provided variant encoders to their corresponding value types.\n *\n * @typeParam TVariants - An array of encoders, each corresponding to a union variant.\n */\ntype GetEncoderTypeFromVariants[]> = DrainOuterGeneric<{\n [I in keyof TVariants]: TVariants[I] extends Encoder ? TFrom : never;\n}>[number];\n\n/**\n * Infers the TypeScript type for values that can be decoded using a union codec.\n *\n * This type maps the provided variant decoders to their corresponding value types.\n *\n * @typeParam TVariants - An array of decoders, each corresponding to a union variant.\n */\ntype GetDecoderTypeFromVariants[]> = DrainOuterGeneric<{\n [I in keyof TVariants]: TVariants[I] extends Decoder ? TFrom : never;\n}>[number];\n\ntype UnionEncoder[]> = TVariants extends readonly FixedSizeEncoder[]\n ? FixedSizeEncoder>\n : Encoder>;\n\ntype UnionDecoder[]> = TVariants extends readonly FixedSizeDecoder[]\n ? FixedSizeDecoder>\n : Decoder>;\n\ntype UnionCodec[]> = TVariants extends readonly FixedSizeCodec[]\n ? FixedSizeCodec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants & GetEncoderTypeFromVariants\n >\n : Codec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants & GetEncoderTypeFromVariants\n >;\n\n/**\n * Returns an encoder for union types.\n *\n * This encoder serializes values by selecting the correct variant encoder\n * based on the `getIndexFromValue` function.\n *\n * Unlike other codecs, this encoder does not store the variant index.\n * It is the user's responsibility to manage discriminators separately.\n *\n * For more details, see {@link getUnionCodec}.\n *\n * @typeParam TVariants - An array of encoders, each corresponding to a union variant.\n *\n * @param variants - The encoders for each variant of the union.\n * @param getIndexFromValue - A function that determines the variant index from the provided value.\n * @returns An `Encoder` for encoding union values.\n *\n * @example\n * Encoding a union of numbers and booleans.\n * ```ts\n * const encoder = getUnionEncoder(\n * [getU16Encoder(), getBooleanEncoder()],\n * value => (typeof value === 'number' ? 0 : 1)\n * );\n *\n * encoder.encode(42);\n * // 0x2a00\n * // └── Encoded number (42) as `u16`\n *\n * encoder.encode(true);\n * // 0x01\n * // └── Encoded boolean (`true`) as `u8`\n * ```\n *\n * @see {@link getUnionCodec}\n */\nexport function getUnionEncoder[]>(\n variants: TVariants,\n getIndexFromValue: (value: GetEncoderTypeFromVariants) => number,\n): UnionEncoder {\n type TFrom = GetEncoderTypeFromVariants;\n const fixedSize = getUnionFixedSize(variants);\n const write: Encoder['write'] = (variant, bytes, offset) => {\n const index = getIndexFromValue(variant);\n assertValidVariantIndex(variants, index);\n return variants[index].write(variant, bytes, offset);\n };\n\n if (fixedSize !== null) {\n return createEncoder({ fixedSize, write }) as UnionEncoder;\n }\n\n const maxSize = getUnionMaxSize(variants);\n return createEncoder({\n ...(maxSize !== null ? { maxSize } : {}),\n getSizeFromValue: variant => {\n const index = getIndexFromValue(variant);\n assertValidVariantIndex(variants, index);\n return getEncodedSize(variant, variants[index]);\n },\n write,\n }) as UnionEncoder;\n}\n\n/**\n * Returns a decoder for union types.\n *\n * This decoder deserializes values by selecting the correct variant decoder\n * based on the `getIndexFromBytes` function.\n *\n * Unlike other codecs, this decoder does not assume a stored discriminator.\n * It is the user's responsibility to manage discriminators separately.\n *\n * For more details, see {@link getUnionCodec}.\n *\n * @typeParam TVariants - An array of decoders, each corresponding to a union variant.\n *\n * @param variants - The decoders for each variant of the union.\n * @param getIndexFromBytes - A function that determines the variant index from the byte array.\n * @returns A `Decoder` for decoding union values.\n *\n * @example\n * Decoding a union of numbers and booleans.\n * ```ts\n * const decoder = getUnionDecoder(\n * [getU16Decoder(), getBooleanDecoder()],\n * (bytes, offset) => (bytes.length - offset > 1 ? 0 : 1)\n * );\n *\n * decoder.decode(new Uint8Array([0x2a, 0x00])); // 42\n * decoder.decode(new Uint8Array([0x01])); // true\n * // Type is inferred as `number | boolean`\n * ```\n *\n * @see {@link getUnionCodec}\n */\nexport function getUnionDecoder[]>(\n variants: TVariants,\n getIndexFromBytes: (bytes: ReadonlyUint8Array, offset: Offset) => number,\n): UnionDecoder {\n type TTo = GetDecoderTypeFromVariants;\n const fixedSize = getUnionFixedSize(variants);\n const read: Decoder['read'] = (bytes, offset) => {\n const index = getIndexFromBytes(bytes, offset);\n assertValidVariantIndex(variants, index);\n return variants[index].read(bytes, offset);\n };\n\n if (fixedSize !== null) {\n return createDecoder({ fixedSize, read }) as UnionDecoder;\n }\n\n const maxSize = getUnionMaxSize(variants);\n return createDecoder({ ...(maxSize !== null ? { maxSize } : {}), read }) as UnionDecoder;\n}\n\n/**\n * Returns a codec for encoding and decoding union types.\n *\n * This codec serializes and deserializes union values by selecting the correct variant\n * based on the provided index functions.\n *\n * Unlike the {@link getDiscriminatedUnionCodec}, this codec does not assume a stored\n * discriminator and must be used with an explicit mechanism for managing discriminators.\n *\n * @typeParam TVariants - An array of codecs, each corresponding to a union variant.\n *\n * @param variants - The codecs for each variant of the union.\n * @param getIndexFromValue - A function that determines the variant index from the provided value.\n * @param getIndexFromBytes - A function that determines the variant index from the byte array.\n * @returns A `Codec` for encoding and decoding union values.\n *\n * @example\n * Encoding and decoding a union of numbers and booleans.\n * ```ts\n * const codec = getUnionCodec(\n * [getU16Codec(), getBooleanCodec()],\n * value => (typeof value === 'number' ? 0 : 1),\n * (bytes, offset) => (bytes.length - offset > 1 ? 0 : 1)\n * );\n *\n * const bytes1 = codec.encode(42); // 0x2a00\n * const value1: number | boolean = codec.decode(bytes1); // 42\n *\n * const bytes2 = codec.encode(true); // 0x01\n * const value2: number | boolean = codec.decode(bytes2); // true\n * ```\n *\n * @remarks\n * If you need a codec that includes a stored discriminator,\n * consider using {@link getDiscriminatedUnionCodec}.\n *\n * Separate {@link getUnionEncoder} and {@link getUnionDecoder} functions are also available.\n *\n * ```ts\n * const bytes = getUnionEncoder(variantEncoders, getIndexFromValue).encode(42);\n * const value = getUnionDecoder(variantDecoders, getIndexFromBytes).decode(bytes);\n * ```\n *\n * @see {@link getUnionEncoder}\n * @see {@link getUnionDecoder}\n * @see {@link getDiscriminatedUnionCodec}\n */\nexport function getUnionCodec[]>(\n variants: TVariants,\n getIndexFromValue: (value: GetEncoderTypeFromVariants) => number,\n getIndexFromBytes: (bytes: ReadonlyUint8Array, offset: Offset) => number,\n): UnionCodec {\n return combineCodec(\n getUnionEncoder(variants, getIndexFromValue),\n getUnionDecoder(variants as readonly Decoder[], getIndexFromBytes) as Decoder<\n GetDecoderTypeFromVariants & GetEncoderTypeFromVariants\n >,\n ) as UnionCodec;\n}\n\nfunction assertValidVariantIndex(variants: readonly unknown[], index: number) {\n if (typeof variants[index] === 'undefined') {\n throw new SolanaError(SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, {\n maxRange: variants.length - 1,\n minRange: 0,\n variant: index,\n });\n }\n}\n\nfunction getUnionFixedSize | Encoder)[]>(variants: TVariants) {\n if (variants.length === 0) return 0;\n if (!isFixedSize(variants[0])) return null;\n const variantSize = variants[0].fixedSize;\n const sameSizedVariants = variants.every(variant => isFixedSize(variant) && variant.fixedSize === variantSize);\n return sameSizedVariants ? variantSize : null;\n}\n\nfunction getUnionMaxSize | Encoder)[]>(variants: TVariants) {\n return maxCodecSizes(variants.map(variant => getMaxSize(variant)));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n} from '@solana/codecs-core';\nimport { getU8Decoder, getU8Encoder, NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, SolanaError } from '@solana/errors';\n\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\nimport { getUnionDecoder, getUnionEncoder } from './union';\nimport { DrainOuterGeneric } from './utils';\n\n/**\n * Represents a discriminated union using a specific discriminator property.\n *\n * A discriminated union is a TypeScript-friendly way to represent Rust-like enums.\n * Each variant in the union is distinguished by a shared discriminator property.\n *\n * @typeParam TDiscriminatorProperty - The name of the discriminator property.\n * @typeParam TDiscriminatorValue - The type of the discriminator value.\n *\n * @example\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant\n * | { __kind: 'Write'; fields: [string] } // Tuple variant\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant\n * ```\n */\nexport type DiscriminatedUnion<\n TDiscriminatorProperty extends string = '__kind',\n TDiscriminatorValue extends string = string,\n> = {\n [P in TDiscriminatorProperty]: TDiscriminatorValue;\n};\n\n/**\n * Extracts a variant from a discriminated union based on its discriminator value.\n *\n * @typeParam TUnion - The discriminated union type.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n * @typeParam TDiscriminatorValue - The specific variant to extract.\n *\n * @example\n * ```ts\n * type Message =\n * | { __kind: 'Quit' }\n * | { __kind: 'Write'; fields: [string] }\n * | { __kind: 'Move'; x: number; y: number };\n *\n * type ClickEvent = GetDiscriminatedUnionVariant;\n * // -> { __kind: 'Move'; x: number; y: number }\n * ```\n */\nexport type GetDiscriminatedUnionVariant<\n TUnion extends DiscriminatedUnion,\n TDiscriminatorProperty extends string,\n TDiscriminatorValue extends TUnion[TDiscriminatorProperty],\n> = Extract>;\n\n/**\n * Extracts a variant from a discriminated union without its discriminator property.\n *\n * @typeParam TUnion - The discriminated union type.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n * @typeParam TDiscriminatorValue - The specific variant to extract.\n *\n * @example\n * ```ts\n * type Message =\n * | { __kind: 'Quit' }\n * | { __kind: 'Write'; fields: [string] }\n * | { __kind: 'Move'; x: number; y: number };\n *\n * type MoveContent = GetDiscriminatedUnionVariantContent;\n * // -> { x: number; y: number }\n * ```\n */\nexport type GetDiscriminatedUnionVariantContent<\n TUnion extends DiscriminatedUnion,\n TDiscriminatorProperty extends string,\n TDiscriminatorValue extends TUnion[TDiscriminatorProperty],\n> = Omit, TDiscriminatorProperty>;\n\n/**\n * Defines the configuration for discriminated union codecs.\n *\n * This configuration controls how the discriminator is stored and named.\n *\n * @typeParam TDiscriminatorProperty - The property name of the discriminator.\n * @typeParam TDiscriminatorSize - The codec used for the discriminator prefix.\n */\nexport type DiscriminatedUnionCodecConfig<\n TDiscriminatorProperty extends string = '__kind',\n TDiscriminatorSize = NumberCodec | NumberDecoder | NumberEncoder,\n> = {\n /**\n * The property name of the discriminator.\n * @defaultValue `__kind`\n */\n discriminator?: TDiscriminatorProperty;\n /**\n * The codec used to encode/decode the discriminator prefix.\n * @defaultValue `u8` prefix\n */\n size?: TDiscriminatorSize;\n};\n\ntype DiscriminatorValue = bigint | boolean | number | string | null | undefined;\ntype Variants = readonly (readonly [DiscriminatorValue, T])[];\ntype ArrayIndices = Exclude['length'], T['length']> & number;\n\ntype GetEncoderTypeFromVariants<\n TVariants extends Variants>,\n TDiscriminatorProperty extends string,\n> = DrainOuterGeneric<{\n [I in ArrayIndices]: (TVariants[I][1] extends Encoder\n ? TFrom extends object\n ? TFrom\n : object\n : never) & { [P in TDiscriminatorProperty]: TVariants[I][0] };\n}>[ArrayIndices];\n\ntype GetDecoderTypeFromVariants<\n TVariants extends Variants>,\n TDiscriminatorProperty extends string,\n> = DrainOuterGeneric<{\n [I in ArrayIndices]: (TVariants[I][1] extends Decoder\n ? TTo extends object\n ? TTo\n : object\n : never) & { [P in TDiscriminatorProperty]: TVariants[I][0] };\n}>[ArrayIndices];\n\ntype UnionEncoder>, TDiscriminatorProperty extends string> =\n TVariants extends Variants>\n ? FixedSizeEncoder>\n : Encoder>;\n\ntype UnionDecoder>, TDiscriminatorProperty extends string> =\n TVariants extends Variants>\n ? FixedSizeDecoder>\n : Decoder>;\n\ntype UnionCodec>, TDiscriminatorProperty extends string> =\n TVariants extends Variants>\n ? FixedSizeCodec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants &\n GetEncoderTypeFromVariants\n >\n : Codec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants &\n GetEncoderTypeFromVariants\n >;\n\n/**\n * Returns an encoder for discriminated unions.\n *\n * This encoder serializes objects that follow the discriminated union pattern\n * by prefixing them with a numerical discriminator that represents their variant.\n *\n * Unlike {@link getUnionEncoder}, this encoder automatically extracts and processes\n * the discriminator property (default: `__kind`) from each variant.\n *\n * For more details, see {@link getDiscriminatedUnionCodec}.\n *\n * @typeParam TVariants - The variants of the discriminated union.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n *\n * @param variants - The variant encoders as `[discriminator, encoder]` pairs.\n * @param config - Configuration options for encoding.\n * @returns An `Encoder` for encoding discriminated union objects.\n *\n * @example\n * Encoding a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant.\n * | { __kind: 'Write'; fields: [string] } // Tuple variant.\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant.\n *\n * const messageEncoder = getDiscriminatedUnionEncoder([\n * ['Quit', getUnitEncoder()],\n * ['Write', getStructEncoder([['fields', getTupleEncoder([addCodecSizePrefix(getUtf8Encoder(), getU32Encoder())])]])],\n * ['Move', getStructEncoder([['x', getI32Encoder()], ['y', getI32Encoder()]])]\n * ]);\n *\n * messageEncoder.encode({ __kind: 'Move', x: 5, y: 6 });\n * // 0x020500000006000000\n * // | | └── Field y (6)\n * // | └── Field x (5)\n * // └── 1-byte discriminator (Index 2 — the \"Move\" variant)\n * ```\n *\n * @see {@link getDiscriminatedUnionCodec}\n */\nexport function getDiscriminatedUnionEncoder<\n const TVariants extends Variants>,\n const TDiscriminatorProperty extends string = '__kind',\n>(\n variants: TVariants,\n config: DiscriminatedUnionCodecConfig = {},\n): UnionEncoder {\n type TFrom = GetEncoderTypeFromVariants;\n const discriminatorProperty = (config.discriminator ?? '__kind') as TDiscriminatorProperty;\n const prefix = config.size ?? getU8Encoder();\n return getUnionEncoder(\n variants.map(([, variant], index) =>\n transformEncoder(getTupleEncoder([prefix, variant]), (value: TFrom): [number, TFrom] => [index, value]),\n ),\n value => getVariantDiscriminator(variants, value[discriminatorProperty]),\n ) as UnionEncoder;\n}\n\n/**\n * Returns a decoder for discriminated unions.\n *\n * This decoder deserializes objects that follow the discriminated union pattern\n * by **reading a numerical discriminator** and mapping it to the corresponding variant.\n *\n * Unlike {@link getUnionDecoder}, this decoder automatically inserts the discriminator\n * property (default: `__kind`) into the decoded object.\n *\n * For more details, see {@link getDiscriminatedUnionCodec}.\n *\n * @typeParam TVariants - The variants of the discriminated union.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n *\n * @param variants - The variant decoders as `[discriminator, decoder]` pairs.\n * @param config - Configuration options for decoding.\n * @returns A `Decoder` for decoding discriminated union objects.\n *\n * @example\n * Decoding a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant.\n * | { __kind: 'Write'; fields: [string] } // Tuple variant.\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant.\n *\n * const messageDecoder = getDiscriminatedUnionDecoder([\n * ['Quit', getUnitDecoder()],\n * ['Write', getStructDecoder([['fields', getTupleDecoder([addCodecSizePrefix(getUtf8Decoder(), getU32Decoder())])]])],\n * ['Move', getStructDecoder([['x', getI32Decoder()], ['y', getI32Decoder()]])]\n * ]);\n *\n * messageDecoder.decode(new Uint8Array([0x02,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00]));\n * // { __kind: 'Move', x: 5, y: 6 }\n * ```\n *\n * @see {@link getDiscriminatedUnionCodec}\n */\nexport function getDiscriminatedUnionDecoder<\n const TVariants extends Variants>,\n const TDiscriminatorProperty extends string = '__kind',\n>(\n variants: TVariants,\n config: DiscriminatedUnionCodecConfig = {},\n): UnionDecoder {\n const discriminatorProperty = config.discriminator ?? '__kind';\n const prefix = config.size ?? getU8Decoder();\n return getUnionDecoder(\n variants.map(([discriminator, variant]) =>\n transformDecoder(getTupleDecoder([prefix, variant]), ([, value]) => ({\n [discriminatorProperty]: discriminator,\n ...value,\n })),\n ),\n (bytes, offset) => Number(prefix.read(bytes, offset)[0]),\n ) as UnionDecoder;\n}\n\n/**\n * Returns a codec for encoding and decoding {@link DiscriminatedUnion}.\n *\n * A {@link DiscriminatedUnion} is a TypeScript representation of Rust-like enums, where\n * each variant is distinguished by a discriminator field (default: `__kind`).\n *\n * This codec inserts a numerical prefix to represent the variant index.\n *\n * @typeParam TVariants - The variants of the discriminated union.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n *\n * @param variants - The variant codecs as `[discriminator, codec]` pairs.\n * @param config - Configuration options for encoding/decoding.\n * @returns A `Codec` for encoding and decoding discriminated union objects.\n *\n * @example\n * Encoding and decoding a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant.\n * | { __kind: 'Write'; fields: [string] } // Tuple variant.\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant.\n *\n * const messageCodec = getDiscriminatedUnionCodec([\n * ['Quit', getUnitCodec()],\n * ['Write', getStructCodec([['fields', getTupleCodec([addCodecSizePrefix(getUtf8Codec(), getU32Codec())])]])],\n * ['Move', getStructCodec([['x', getI32Codec()], ['y', getI32Codec()]])]\n * ]);\n *\n * messageCodec.encode({ __kind: 'Move', x: 5, y: 6 });\n * // 0x020500000006000000\n * // | | └── Field y (6)\n * // | └── Field x (5)\n * // └── 1-byte discriminator (Index 2 — the \"Move\" variant)\n *\n * const value = messageCodec.decode(bytes);\n * // { __kind: 'Move', x: 5, y: 6 }\n * ```\n *\n * @example\n * Using a `u32` discriminator instead of `u8`.\n * ```ts\n * const codec = getDiscriminatedUnionCodec([...], { size: getU32Codec() });\n *\n * codec.encode({ __kind: 'Quit' });\n * // 0x00000000\n * // └------┘ 4-byte discriminator (Index 0)\n *\n * codec.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00]));\n * // { __kind: 'Quit' }\n * ```\n *\n * @example\n * Customizing the discriminator property.\n * ```ts\n * const codec = getDiscriminatedUnionCodec([...], { discriminator: 'message' });\n *\n * codec.encode({ message: 'Quit' }); // 0x00\n * codec.decode(new Uint8Array([0x00])); // { message: 'Quit' }\n * ```\n *\n * @remarks\n * Separate `getDiscriminatedUnionEncoder` and `getDiscriminatedUnionDecoder` functions are available.\n *\n * ```ts\n * const bytes = getDiscriminatedUnionEncoder(variantEncoders).encode({ __kind: 'Quit' });\n * const message = getDiscriminatedUnionDecoder(variantDecoders).decode(bytes);\n * ```\n *\n * @see {@link getDiscriminatedUnionEncoder}\n * @see {@link getDiscriminatedUnionDecoder}\n */\nexport function getDiscriminatedUnionCodec<\n const TVariants extends Variants>,\n const TDiscriminatorProperty extends string = '__kind',\n>(\n variants: TVariants,\n config: DiscriminatedUnionCodecConfig = {},\n): UnionCodec {\n return combineCodec(\n getDiscriminatedUnionEncoder(variants, config) as Encoder<\n GetEncoderTypeFromVariants\n >,\n getDiscriminatedUnionDecoder(variants, config) as Decoder<\n GetDecoderTypeFromVariants &\n GetEncoderTypeFromVariants\n >,\n ) as UnionCodec;\n}\n\nfunction getVariantDiscriminator | Encoder>>(\n variants: TVariants,\n discriminatorValue: DiscriminatorValue,\n) {\n const discriminator = variants.findIndex(([key]) => discriminatorValue === key);\n if (discriminator < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, {\n value: discriminatorValue,\n variants: variants.map(([key]) => key),\n });\n }\n return discriminator;\n}\n","/**\n * Defines the \"lookup object\" of an enum.\n *\n * @example\n * ```ts\n * enum Direction { Left, Right };\n * ```\n */\nexport type EnumLookupObject = { [key: string]: number | string };\n\n/**\n * Returns the allowed input for an enum.\n *\n * @example\n * ```ts\n * enum Direction { Left, Right };\n * type DirectionInput = GetEnumFrom; // \"Left\" | \"Right\" | 0 | 1\n * ```\n */\nexport type GetEnumFrom = TEnum[keyof TEnum] | keyof TEnum;\n\n/**\n * Returns all the available variants of an enum.\n *\n * @example\n * ```ts\n * enum Direction { Left, Right };\n * type DirectionOutput = GetEnumTo; // 0 | 1\n * ```\n */\nexport type GetEnumTo = TEnum[keyof TEnum];\n\nexport function getEnumStats(constructor: EnumLookupObject) {\n const numericalValues = [...new Set(Object.values(constructor).filter(v => typeof v === 'number'))].sort();\n const enumRecord = Object.fromEntries(Object.entries(constructor).slice(numericalValues.length)) as Record<\n string,\n number | string\n >;\n const enumKeys = Object.keys(enumRecord);\n const enumValues = Object.values(enumRecord);\n const stringValues: string[] = [\n ...new Set([...enumKeys, ...enumValues.filter((v): v is string => typeof v === 'string')]),\n ];\n\n return { enumKeys, enumRecord, enumValues, numericalValues, stringValues };\n}\n\nexport function getEnumIndexFromVariant({\n enumKeys,\n enumValues,\n variant,\n}: {\n enumKeys: string[];\n enumValues: (number | string)[];\n variant: number | string | symbol;\n}): number {\n const valueIndex = findLastIndex(enumValues, value => value === variant);\n if (valueIndex >= 0) return valueIndex;\n return enumKeys.findIndex(key => key === variant);\n}\n\nexport function getEnumIndexFromDiscriminator({\n discriminator,\n enumKeys,\n enumValues,\n useValuesAsDiscriminators,\n}: {\n discriminator: number;\n enumKeys: string[];\n enumValues: (number | string)[];\n useValuesAsDiscriminators: boolean;\n}): number {\n if (!useValuesAsDiscriminators) {\n return discriminator >= 0 && discriminator < enumKeys.length ? discriminator : -1;\n }\n return findLastIndex(enumValues, value => value === discriminator);\n}\n\nfunction findLastIndex(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): number {\n let l = array.length;\n while (l--) {\n if (predicate(array[l], l, array)) return l;\n }\n return -1;\n}\n\nexport function formatNumericalValues(values: number[]): string {\n if (values.length === 0) return '';\n let range: [number, number] = [values[0], values[0]];\n const ranges: string[] = [];\n for (let index = 1; index < values.length; index++) {\n const value = values[index];\n if (range[1] + 1 === value) {\n range[1] = value;\n } else {\n ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`);\n range = [value, value];\n }\n }\n ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`);\n return ranges.join(', ');\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS,\n SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT,\n SolanaError,\n} from '@solana/errors';\n\nimport {\n EnumLookupObject,\n formatNumericalValues,\n GetEnumFrom,\n getEnumIndexFromDiscriminator,\n getEnumIndexFromVariant,\n getEnumStats,\n GetEnumTo,\n} from './enum-helpers';\n\n/**\n * Defines the configuration options for enum codecs.\n *\n * The `size` option determines the numerical encoding used for the enum's discriminant.\n * By default, enums are stored as a `u8` (1 byte).\n *\n * The `useValuesAsDiscriminators` option allows mapping the actual enum values\n * as discriminators instead of using their positional index.\n *\n * @typeParam TDiscriminator - A number codec, encoder, or decoder used for the discriminant.\n */\nexport type EnumCodecConfig = {\n /**\n * The codec used to encode/decode the enum discriminator.\n * @defaultValue `u8` discriminator.\n */\n size?: TDiscriminator;\n\n /**\n * If set to `true`, the enum values themselves will be used as discriminators.\n * This is only valid for numerical enum values.\n *\n * @defaultValue `false`\n */\n useValuesAsDiscriminators?: boolean;\n};\n\n/**\n * Returns an encoder for enums.\n *\n * This encoder serializes enums as a numerical discriminator.\n * By default, the discriminator is based on the positional index of the enum variants.\n *\n * For more details, see {@link getEnumCodec}.\n *\n * @typeParam TEnum - The TypeScript enum or object mapping enum keys to values.\n *\n * @param constructor - The constructor of the enum.\n * @param config - Configuration options for encoding the enum.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding enums.\n *\n * @example\n * Encoding enum values.\n * ```ts\n * enum Direction { Up, Down, Left, Right }\n * const encoder = getEnumEncoder(Direction);\n *\n * encoder.encode(Direction.Up); // 0x00\n * encoder.encode(Direction.Down); // 0x01\n * encoder.encode(Direction.Left); // 0x02\n * encoder.encode(Direction.Right); // 0x03\n * ```\n *\n * @see {@link getEnumCodec}\n */\nexport function getEnumEncoder(\n constructor: TEnum,\n config?: Omit, 'size'>,\n): FixedSizeEncoder, 1>;\nexport function getEnumEncoder(\n constructor: TEnum,\n config: EnumCodecConfig & { size: FixedSizeNumberEncoder },\n): FixedSizeEncoder, TSize>;\nexport function getEnumEncoder(\n constructor: TEnum,\n config?: EnumCodecConfig,\n): VariableSizeEncoder>;\nexport function getEnumEncoder(\n constructor: TEnum,\n config: EnumCodecConfig = {},\n): Encoder> {\n const prefix = config.size ?? getU8Encoder();\n const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false;\n const { enumKeys, enumValues, numericalValues, stringValues } = getEnumStats(constructor);\n if (useValuesAsDiscriminators && enumValues.some(value => typeof value === 'string')) {\n throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, {\n stringValues: enumValues.filter((v): v is string => typeof v === 'string'),\n });\n }\n return transformEncoder(prefix, (variant: GetEnumFrom): number => {\n const index = getEnumIndexFromVariant({ enumKeys, enumValues, variant });\n if (index < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, {\n formattedNumericalValues: formatNumericalValues(numericalValues),\n numericalValues,\n stringValues,\n variant,\n });\n }\n return useValuesAsDiscriminators ? (enumValues[index] as number) : index;\n });\n}\n\n/**\n * Returns a decoder for enums.\n *\n * This decoder deserializes enums from a numerical discriminator.\n * By default, the discriminator is based on the positional index of the enum variants.\n *\n * For more details, see {@link getEnumCodec}.\n *\n * @typeParam TEnum - The TypeScript enum or object mapping enum keys to values.\n *\n * @param constructor - The constructor of the enum.\n * @param config - Configuration options for decoding the enum.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding enums.\n *\n * @example\n * Decoding enum values.\n * ```ts\n * enum Direction { Up, Down, Left, Right }\n * const decoder = getEnumDecoder(Direction);\n *\n * decoder.decode(new Uint8Array([0x00])); // Direction.Up\n * decoder.decode(new Uint8Array([0x01])); // Direction.Down\n * decoder.decode(new Uint8Array([0x02])); // Direction.Left\n * decoder.decode(new Uint8Array([0x03])); // Direction.Right\n * ```\n *\n * @see {@link getEnumCodec}\n */\nexport function getEnumDecoder(\n constructor: TEnum,\n config?: Omit, 'size'>,\n): FixedSizeDecoder, 1>;\nexport function getEnumDecoder(\n constructor: TEnum,\n config: EnumCodecConfig & { size: FixedSizeNumberDecoder },\n): FixedSizeDecoder, TSize>;\nexport function getEnumDecoder(\n constructor: TEnum,\n config?: EnumCodecConfig,\n): VariableSizeDecoder>;\nexport function getEnumDecoder(\n constructor: TEnum,\n config: EnumCodecConfig = {},\n): Decoder> {\n const prefix = config.size ?? getU8Decoder();\n const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false;\n const { enumKeys, enumValues, numericalValues } = getEnumStats(constructor);\n if (useValuesAsDiscriminators && enumValues.some(value => typeof value === 'string')) {\n throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, {\n stringValues: enumValues.filter((v): v is string => typeof v === 'string'),\n });\n }\n return transformDecoder(prefix, (value: bigint | number): GetEnumTo => {\n const discriminator = Number(value);\n const index = getEnumIndexFromDiscriminator({\n discriminator,\n enumKeys,\n enumValues,\n useValuesAsDiscriminators,\n });\n if (index < 0) {\n const validDiscriminators = useValuesAsDiscriminators\n ? numericalValues\n : [...Array(enumKeys.length).keys()];\n throw new SolanaError(SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, {\n discriminator,\n formattedValidDiscriminators: formatNumericalValues(validDiscriminators),\n validDiscriminators,\n });\n }\n return enumValues[index] as GetEnumTo;\n });\n}\n\n/**\n * Returns a codec for encoding and decoding enums.\n *\n * This codec serializes enums as a numerical discriminator, allowing them\n * to be efficiently stored and reconstructed from binary data.\n *\n * By default, the discriminator is derived from the positional index\n * of the enum variant, but it can be configured to use the enum's numeric values instead.\n *\n * @typeParam TEnum - The TypeScript enum or object mapping enum keys to values.\n *\n * @param constructor - The constructor of the enum.\n * @param config - Configuration options for encoding and decoding the enum.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding enums.\n *\n * @example\n * Encoding and decoding enums using positional indexes.\n * ```ts\n * enum Direction { Up, Down, Left, Right }\n * const codec = getEnumCodec(Direction);\n *\n * codec.encode(Direction.Up); // 0x00\n * codec.encode(Direction.Down); // 0x01\n * codec.encode(Direction.Left); // 0x02\n * codec.encode(Direction.Right); // 0x03\n *\n * codec.decode(new Uint8Array([0x00])); // Direction.Up\n * codec.decode(new Uint8Array([0x01])); // Direction.Down\n * codec.decode(new Uint8Array([0x02])); // Direction.Left\n * codec.decode(new Uint8Array([0x03])); // Direction.Right\n * ```\n *\n * @example\n * Encoding and decoding enums using their numeric values.\n * ```ts\n * enum GameDifficulty { Easy = 1, Normal = 4, Hard = 7, Expert = 9 }\n * const codec = getEnumCodec(GameDifficulty, { useValuesAsDiscriminators: true });\n *\n * codec.encode(GameDifficulty.Easy); // 0x01\n * codec.encode(GameDifficulty.Normal); // 0x04\n * codec.encode(GameDifficulty.Hard); // 0x07\n * codec.encode(GameDifficulty.Expert); // 0x09\n *\n * codec.decode(new Uint8Array([0x01])); // GameDifficulty.Easy\n * codec.decode(new Uint8Array([0x04])); // GameDifficulty.Normal\n * codec.decode(new Uint8Array([0x07])); // GameDifficulty.Hard\n * codec.decode(new Uint8Array([0x09])); // GameDifficulty.Expert\n * ```\n *\n * Note that, when using values as discriminators, the enum values must be numerical.\n * Otherwise, an error will be thrown.\n *\n * ```ts\n * enum GameDifficulty { Easy = 'EASY', Normal = 'NORMAL', Hard = 'HARD' }\n * getEnumCodec(GameDifficulty, { useValuesAsDiscriminators: true }); // Throws an error.\n * ```\n *\n * @example\n * Using a custom discriminator size.\n * ```ts\n * enum Status { Pending, Approved, Rejected }\n * const codec = getEnumCodec(Status, { size: getU16Codec() });\n *\n * codec.encode(Status.Pending); // 0x0000\n * codec.encode(Status.Approved); // 0x0100\n * codec.encode(Status.Rejected); // 0x0200\n *\n * codec.decode(new Uint8Array([0x00, 0x00])); // Status.Pending\n * codec.decode(new Uint8Array([0x01, 0x00])); // Status.Approved\n * codec.decode(new Uint8Array([0x02, 0x00])); // Status.Rejected\n * ```\n *\n * @remarks\n * Separate {@link getEnumEncoder} and {@link getEnumDecoder} functions are available.\n *\n * ```ts\n * const bytes = getEnumEncoder(Direction).encode(Direction.Up);\n * const value = getEnumDecoder(Direction).decode(bytes);\n * ```\n *\n * @see {@link getEnumEncoder}\n * @see {@link getEnumDecoder}\n */\nexport function getEnumCodec(\n constructor: TEnum,\n config?: Omit, 'size'>,\n): FixedSizeCodec, GetEnumTo, 1>;\nexport function getEnumCodec(\n constructor: TEnum,\n config: EnumCodecConfig & { size: FixedSizeNumberCodec },\n): FixedSizeCodec, GetEnumTo, TSize>;\nexport function getEnumCodec(\n constructor: TEnum,\n config?: EnumCodecConfig,\n): VariableSizeCodec, GetEnumTo>;\nexport function getEnumCodec(\n constructor: TEnum,\n config: EnumCodecConfig = {},\n): Codec, GetEnumTo> {\n return combineCodec(getEnumEncoder(constructor, config), getEnumDecoder(constructor, config));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\n\n/**\n * Returns an encoder that prefixes encoded values with hidden data.\n *\n * This encoder applies a list of void encoders before encoding the main value.\n * The prefixed data is encoded before the main value without being exposed to the user.\n *\n * For more details, see {@link getHiddenPrefixCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param encoder - The encoder for the main value.\n * @param prefixedEncoders - A list of void encoders that produce the hidden prefix.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` that encodes the value with a hidden prefix.\n *\n * @example\n * Prefixing a value with constants.\n * ```ts\n * const encoder = getHiddenPrefixEncoder(getUtf8Encoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * encoder.encode('Hello');\n * // 0x01020304050648656c6c6f\n * // | | └-- Our encoded value (\"Hello\").\n * // | └-- Our second hidden prefix.\n * // └-- Our first hidden prefix.\n * ```\n *\n * @see {@link getHiddenPrefixCodec}\n */\nexport function getHiddenPrefixEncoder(\n encoder: FixedSizeEncoder,\n prefixedEncoders: readonly FixedSizeEncoder[],\n): FixedSizeEncoder;\nexport function getHiddenPrefixEncoder(\n encoder: Encoder,\n prefixedEncoders: readonly Encoder[],\n): VariableSizeEncoder;\nexport function getHiddenPrefixEncoder(\n encoder: Encoder,\n prefixedEncoders: readonly Encoder[],\n): Encoder {\n return transformEncoder(\n getTupleEncoder([...prefixedEncoders, encoder]) as Encoder,\n (value: TFrom) => [...prefixedEncoders.map(() => undefined), value] as const,\n );\n}\n\n/**\n * Returns a decoder that skips hidden prefixed data before decoding the main value.\n *\n * This decoder applies a list of void decoders before decoding the main value.\n * The prefixed data is skipped during decoding without being exposed to the user.\n *\n * For more details, see {@link getHiddenPrefixCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param decoder - The decoder for the main value.\n * @param prefixedDecoders - A list of void decoders that produce the hidden prefix.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` that decodes values while ignoring the hidden prefix.\n *\n * @example\n * Decoding a value with prefixed constants.\n * ```ts\n * const decoder = getHiddenPrefixDecoder(getUtf8Decoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * decoder.decode(new Uint8Array([1, 2, 3, 4, 5, 6, 0x48, 0x65, 0x6C, 0x6C, 0x6F]));\n * // 'Hello'\n * ```\n *\n * @see {@link getHiddenPrefixCodec}\n */\nexport function getHiddenPrefixDecoder(\n decoder: FixedSizeDecoder,\n prefixedDecoders: readonly FixedSizeDecoder[],\n): FixedSizeDecoder;\nexport function getHiddenPrefixDecoder(\n decoder: Decoder,\n prefixedDecoders: readonly Decoder[],\n): VariableSizeDecoder;\nexport function getHiddenPrefixDecoder(\n decoder: Decoder,\n prefixedDecoders: readonly Decoder[],\n): Decoder {\n return transformDecoder(\n getTupleDecoder([...prefixedDecoders, decoder]) as Decoder,\n tuple => tuple[tuple.length - 1] as TTo,\n );\n}\n\n/**\n * Returns a codec that encodes and decodes values with a hidden prefix.\n *\n * - **Encoding:** Prefixes the value with hidden data before encoding.\n * - **Decoding:** Skips the hidden prefix before decoding the main value.\n *\n * This is useful for any implicit metadata that should be present in\n * binary formats but omitted from the API.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param codec - The codec for the main value.\n * @param prefixedCodecs - A list of void codecs that produce the hidden prefix.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding values with a hidden prefix.\n *\n * @example\n * Encoding and decoding a value with prefixed constants.\n * ```ts\n * const codec = getHiddenPrefixCodec(getUtf8Codec(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * const bytes = codec.encode('Hello');\n * // 0x01020304050648656c6c6f\n * // | | └-- Our encoded value (\"Hello\").\n * // | └-- Our second hidden prefix.\n * // └-- Our first hidden prefix.\n *\n * codec.decode(bytes);\n * // 'Hello'\n * ```\n *\n * @remarks\n * If all you need is padding zeroes before a value, consider using {@link padLeftCodec} instead.\n *\n * Separate {@link getHiddenPrefixEncoder} and {@link getHiddenPrefixDecoder} functions are available.\n *\n * ```ts\n * const bytes = getHiddenPrefixEncoder(getUtf8Encoder(), [\n * getConstantEncoder(new Uint8Array([1, 2, 3])),\n * getConstantEncoder(new Uint8Array([4, 5, 6])),\n * ]).encode('Hello');\n *\n * const value = getHiddenPrefixDecoder(getUtf8Decoder(), [\n * getConstantDecoder(new Uint8Array([1, 2, 3])),\n * getConstantDecoder(new Uint8Array([4, 5, 6])),\n * ]).decode(bytes);\n * ```\n *\n * @see {@link getHiddenPrefixEncoder}\n * @see {@link getHiddenPrefixDecoder}\n */\nexport function getHiddenPrefixCodec(\n codec: FixedSizeCodec,\n prefixedCodecs: readonly FixedSizeCodec[],\n): FixedSizeCodec;\nexport function getHiddenPrefixCodec(\n codec: Codec,\n prefixedCodecs: readonly Codec[],\n): VariableSizeCodec;\nexport function getHiddenPrefixCodec(\n codec: Codec,\n prefixedCodecs: readonly Codec[],\n): Codec {\n return combineCodec(getHiddenPrefixEncoder(codec, prefixedCodecs), getHiddenPrefixDecoder(codec, prefixedCodecs));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\n\n/**\n * Returns an encoder that appends hidden data after the encoded value.\n *\n * This encoder applies a list of void encoders after encoding the main value.\n * The suffixed data is encoded after the main value without being exposed to the user.\n *\n * For more details, see {@link getHiddenSuffixCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param encoder - The encoder for the main value.\n * @param suffixedEncoders - A list of void encoders that produce the hidden suffix.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` that encodes the value with a hidden suffix.\n *\n * @example\n * Suffixing a value with constants.\n * ```ts\n * const encoder = getHiddenSuffixEncoder(getUtf8Encoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * encoder.encode('Hello');\n * // 0x48656c6c6f010203040506\n * // | | └-- Our second hidden suffix.\n * // | └-- Our first hidden suffix.\n * // └-- Our encoded value (\"Hello\").\n * ```\n *\n * @see {@link getHiddenSuffixCodec}\n */\nexport function getHiddenSuffixEncoder(\n encoder: FixedSizeEncoder,\n suffixedEncoders: readonly FixedSizeEncoder[],\n): FixedSizeEncoder;\nexport function getHiddenSuffixEncoder(\n encoder: Encoder,\n suffixedEncoders: readonly Encoder[],\n): VariableSizeEncoder;\nexport function getHiddenSuffixEncoder(\n encoder: Encoder,\n suffixedEncoders: readonly Encoder[],\n): Encoder {\n return transformEncoder(\n getTupleEncoder([encoder, ...suffixedEncoders]) as Encoder,\n (value: TFrom) => [value, ...suffixedEncoders.map(() => undefined)] as const,\n );\n}\n\n/**\n * Returns a decoder that skips hidden suffixed data after decoding the main value.\n *\n * This decoder applies a list of void decoders after decoding the main value.\n * The suffixed data is skipped during decoding without being exposed to the user.\n *\n * For more details, see {@link getHiddenSuffixCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param decoder - The decoder for the main value.\n * @param suffixedDecoders - A list of void decoders that produce the hidden suffix.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` that decodes values while ignoring the hidden suffix.\n *\n * @example\n * Decoding a value with suffixed constants.\n * ```ts\n * const decoder = getHiddenSuffixDecoder(getUtf8Decoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * decoder.decode(new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F, 1, 2, 3, 4, 5, 6]));\n * // 'Hello'\n * ```\n *\n * @see {@link getHiddenSuffixCodec}\n */\nexport function getHiddenSuffixDecoder(\n decoder: FixedSizeDecoder,\n suffixedDecoders: readonly FixedSizeDecoder[],\n): FixedSizeDecoder;\nexport function getHiddenSuffixDecoder(\n decoder: Decoder,\n suffixedDecoders: readonly Decoder[],\n): VariableSizeDecoder;\nexport function getHiddenSuffixDecoder(\n decoder: Decoder,\n suffixedDecoders: readonly Decoder[],\n): Decoder {\n return transformDecoder(\n getTupleDecoder([decoder, ...suffixedDecoders]) as Decoder,\n tuple => tuple[0],\n );\n}\n\n/**\n * Returns a codec that encodes and decodes values with a hidden suffix.\n *\n * - **Encoding:** Appends hidden data after encoding the main value.\n * - **Decoding:** Skips the hidden suffix after decoding the main value.\n *\n * This is useful for any implicit metadata that should be present in\n * binary formats but omitted from the API.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param codec - The codec for the main value.\n * @param suffixedCodecs - A list of void codecs that produce the hidden suffix.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding values with a hidden suffix.\n *\n * @example\n * Encoding and decoding a value with suffixed constants.\n * ```ts\n * const codec = getHiddenSuffixCodec(getUtf8Codec(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * const bytes = codec.encode('Hello');\n * // 0x48656c6c6f010203040506\n * // | | └-- Our second hidden suffix.\n * // | └-- Our first hidden suffix.\n * // └-- Our encoded value (\"Hello\").\n *\n * codec.decode(bytes);\n * // 'Hello'\n * ```\n *\n * @remarks\n * If all you need is padding zeroes after a value, consider using {@link padRightCodec} instead.\n *\n * Separate {@link getHiddenSuffixEncoder} and {@link getHiddenSuffixDecoder} functions are available.\n *\n * ```ts\n * const bytes = getHiddenSuffixEncoder(getUtf8Encoder(), [\n * getConstantEncoder(new Uint8Array([1, 2, 3])),\n * getConstantEncoder(new Uint8Array([4, 5, 6])),\n * ]).encode('Hello');\n *\n * const value = getHiddenSuffixDecoder(getUtf8Decoder(), [\n * getConstantDecoder(new Uint8Array([1, 2, 3])),\n * getConstantDecoder(new Uint8Array([4, 5, 6])),\n * ]).decode(bytes);\n * ```\n *\n * @see {@link getHiddenSuffixEncoder}\n * @see {@link getHiddenSuffixDecoder}\n */\nexport function getHiddenSuffixCodec(\n codec: FixedSizeCodec,\n suffixedCodecs: readonly FixedSizeCodec[],\n): FixedSizeCodec;\nexport function getHiddenSuffixCodec(\n codec: Codec,\n suffixedCodecs: readonly Codec[],\n): VariableSizeCodec;\nexport function getHiddenSuffixCodec(\n codec: Codec,\n suffixedCodecs: readonly Codec[],\n): Codec {\n return combineCodec(getHiddenSuffixEncoder(codec, suffixedCodecs), getHiddenSuffixDecoder(codec, suffixedCodecs));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT,\n SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\n/**\n * Defines the configuration options for literal union codecs.\n *\n * A literal union codec encodes values from a predefined set of literals.\n * The `size` option determines the numerical encoding used for the discriminant.\n * By default, literals are stored as a `u8` (1 byte).\n *\n * @typeParam TDiscriminator - A number codec, encoder, or decoder used for the discriminant.\n */\nexport type LiteralUnionCodecConfig = {\n /**\n * The codec used to encode/decode the discriminator.\n * @defaultValue `u8` discriminator.\n */\n size?: TDiscriminator;\n};\n\ntype Variant = bigint | boolean | number | string | null | undefined;\ntype GetTypeFromVariants = TVariants[number];\n\n/**\n * Returns an encoder for literal unions.\n *\n * This encoder serializes a value from a predefined set of literals\n * as a numerical index representing its position in the `variants` array.\n *\n * For more details, see {@link getLiteralUnionCodec}.\n *\n * @typeParam TVariants - A tuple of allowed literal values.\n *\n * @param variants - The possible literal values for the union.\n * @param config - Configuration options for encoding the literal union.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding literal unions.\n *\n * @example\n * Encoding a union of string literals.\n * ```ts\n * type Size = 'small' | 'medium' | 'large';\n * const sizeEncoder = getLiteralUnionEncoder(['small', 'medium', 'large']);\n *\n * sizeEncoder.encode('small'); // 0x00\n * sizeEncoder.encode('medium'); // 0x01\n * sizeEncoder.encode('large'); // 0x02\n * ```\n *\n * @see {@link getLiteralUnionCodec}\n */\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n): FixedSizeEncoder, 1>;\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig & { size: FixedSizeNumberEncoder },\n): FixedSizeEncoder, TSize>;\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n config?: LiteralUnionCodecConfig,\n): VariableSizeEncoder>;\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig = {},\n): Encoder> {\n const discriminator = config.size ?? getU8Encoder();\n return transformEncoder(discriminator, variant => {\n const index = variants.indexOf(variant);\n if (index < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, {\n value: variant,\n variants,\n });\n }\n return index;\n });\n}\n\n/**\n * Returns a decoder for literal unions.\n *\n * This decoder deserializes a numerical index into a corresponding\n * value from a predefined set of literals.\n *\n * For more details, see {@link getLiteralUnionCodec}.\n *\n * @typeParam TVariants - A tuple of allowed literal values.\n *\n * @param variants - The possible literal values for the union.\n * @param config - Configuration options for decoding the literal union.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding literal unions.\n *\n * @example\n * Decoding a union of string literals.\n * ```ts\n * type Size = 'small' | 'medium' | 'large';\n * const sizeDecoder = getLiteralUnionDecoder(['small', 'medium', 'large']);\n *\n * sizeDecoder.decode(new Uint8Array([0x00])); // 'small'\n * sizeDecoder.decode(new Uint8Array([0x01])); // 'medium'\n * sizeDecoder.decode(new Uint8Array([0x02])); // 'large'\n * ```\n *\n * @see {@link getLiteralUnionCodec}\n */\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n): FixedSizeDecoder, 1>;\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig & { size: FixedSizeNumberDecoder },\n): FixedSizeDecoder, TSize>;\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n config?: LiteralUnionCodecConfig,\n): VariableSizeDecoder>;\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig = {},\n): Decoder> {\n const discriminator = config.size ?? getU8Decoder();\n return transformDecoder(discriminator, (index: bigint | number) => {\n if (index < 0 || index >= variants.length) {\n throw new SolanaError(SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, {\n discriminator: index,\n maxRange: variants.length - 1,\n minRange: 0,\n });\n }\n return variants[Number(index)];\n });\n}\n\n/**\n * Returns a codec for encoding and decoding literal unions.\n *\n * A literal union codec serializes and deserializes values\n * from a predefined set of literals, using a numerical index\n * to represent each value in the `variants` array.\n *\n * This allows efficient storage and retrieval of common\n * predefined values such as enum-like structures in TypeScript.\n *\n * @typeParam TVariants - A tuple of allowed literal values.\n *\n * @param variants - The possible literal values for the union.\n * @param config - Configuration options for encoding and decoding the literal union.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding literal unions.\n *\n * @example\n * Encoding and decoding a union of string literals.\n * ```ts\n * type Size = 'small' | 'medium' | 'large';\n * const sizeCodec = getLiteralUnionCodec(['small', 'medium', 'large']);\n *\n * sizeCodec.encode('small'); // 0x00\n * sizeCodec.encode('medium'); // 0x01\n * sizeCodec.encode('large'); // 0x02\n *\n * sizeCodec.decode(new Uint8Array([0x00])); // 'small'\n * sizeCodec.decode(new Uint8Array([0x01])); // 'medium'\n * sizeCodec.decode(new Uint8Array([0x02])); // 'large'\n * ```\n *\n * @example\n * Encoding and decoding a union of number literals.\n * ```ts\n * type Level = 10 | 20 | 30;\n * const levelCodec = getLiteralUnionCodec([10, 20, 30]);\n *\n * levelCodec.encode(10); // 0x00\n * levelCodec.encode(20); // 0x01\n * levelCodec.encode(30); // 0x02\n *\n * levelCodec.decode(new Uint8Array([0x00])); // 10\n * levelCodec.decode(new Uint8Array([0x01])); // 20\n * levelCodec.decode(new Uint8Array([0x02])); // 30\n * ```\n *\n * @example\n * Using a custom discriminator size with different variant types.\n * ```ts\n * type MaybeBoolean = false | true | \"either\";\n * const codec = getLiteralUnionCodec([false, true, 'either'], { size: getU16Codec() });\n *\n * codec.encode(false); // 0x0000\n * codec.encode(true); // 0x0100\n * codec.encode('either'); // 0x0200\n *\n * codec.decode(new Uint8Array([0x00, 0x00])); // false\n * codec.decode(new Uint8Array([0x01, 0x00])); // true\n * codec.decode(new Uint8Array([0x02, 0x00])); // 'either'\n * ```\n *\n * @remarks\n * Separate {@link getLiteralUnionEncoder} and {@link getLiteralUnionDecoder} functions are available.\n *\n * ```ts\n * const bytes = getLiteralUnionEncoder(['red', 'green', 'blue']).encode('green');\n * const value = getLiteralUnionDecoder(['red', 'green', 'blue']).decode(bytes);\n * ```\n *\n * @see {@link getLiteralUnionEncoder}\n * @see {@link getLiteralUnionDecoder}\n */\nexport function getLiteralUnionCodec(\n variants: TVariants,\n): FixedSizeCodec, GetTypeFromVariants, 1>;\nexport function getLiteralUnionCodec(\n variants: TVariants,\n config: LiteralUnionCodecConfig & { size: FixedSizeNumberCodec },\n): FixedSizeCodec, GetTypeFromVariants, TSize>;\nexport function getLiteralUnionCodec(\n variants: TVariants,\n config?: LiteralUnionCodecConfig,\n): VariableSizeCodec>;\nexport function getLiteralUnionCodec(\n variants: TVariants,\n config: LiteralUnionCodecConfig = {},\n): Codec> {\n return combineCodec(getLiteralUnionEncoder(variants, config), getLiteralUnionDecoder(variants, config));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\n\nimport { ArrayLikeCodecSize, getArrayDecoder, getArrayEncoder } from './array';\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\n\n/**\n * Defines the configuration options for map codecs.\n *\n * The `size` option determines how the number of entries in the map is stored.\n * It can be:\n * - A {@link NumberCodec} to prefix the map with its size.\n * - A fixed number of entries.\n * - `'remainder'`, which infers the number of entries based on the remaining bytes.\n * This option is only available for fixed-size keys and values.\n *\n * @typeParam TPrefix - A number codec, encoder, or decoder used for the size prefix.\n */\nexport type MapCodecConfig = {\n /**\n * The size of the map.\n * @defaultValue u32 prefix.\n */\n size?: ArrayLikeCodecSize;\n};\n\n/**\n * Returns an encoder for maps.\n *\n * This encoder serializes maps where the keys and values are encoded\n * using the provided key and value encoders. The number of entries\n * is determined by the `size` configuration.\n *\n * For more details, see {@link getMapCodec}.\n *\n * @typeParam TFromKey - The type of the keys before encoding.\n * @typeParam TFromValue - The type of the values before encoding.\n *\n * @param key - The encoder for the map's keys.\n * @param value - The encoder for the map's values.\n * @param config - Configuration options for encoding the map.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding maps.\n *\n * @example\n * Encoding a map with a `u32` size prefix.\n * ```ts\n * const encoder = getMapEncoder(fixCodecSize(getUtf8Encoder(), 5), getU8Encoder());\n * const bytes = encoder.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x02000000616c6963652a626f62000005\n * // | | | | └── Value (5)\n * // | | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | | └── Value (42)\n * // | └── Key (\"alice\", 5 bytes fixed)\n * // └── 4-byte prefix (2 entries)\n * ```\n *\n * @see {@link getMapCodec}\n */\nexport function getMapEncoder(\n key: Encoder,\n value: Encoder,\n config: MapCodecConfig & { size: 0 },\n): FixedSizeEncoder, 0>;\nexport function getMapEncoder(\n key: FixedSizeEncoder,\n value: FixedSizeEncoder,\n config: MapCodecConfig & { size: number },\n): FixedSizeEncoder>;\nexport function getMapEncoder(\n key: Encoder,\n value: Encoder,\n config?: MapCodecConfig,\n): VariableSizeEncoder>;\nexport function getMapEncoder(\n key: Encoder,\n value: Encoder,\n config: MapCodecConfig = {},\n): Encoder> {\n return transformEncoder(\n getArrayEncoder(getTupleEncoder([key, value]), config as object),\n (map: Map): [TFromKey, TFromValue][] => [...map.entries()],\n );\n}\n\n/**\n * Returns a decoder for maps.\n *\n * This decoder deserializes maps where the keys and values are decoded\n * using the provided key and value decoders. The number of entries\n * is determined by the `size` configuration.\n *\n * For more details, see {@link getMapCodec}.\n *\n * @typeParam TToKey - The type of the keys after decoding.\n * @typeParam TToValue - The type of the values after decoding.\n *\n * @param key - The decoder for the map's keys.\n * @param value - The decoder for the map's values.\n * @param config - Configuration options for decoding the map.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding maps.\n *\n * @example\n * Decoding a map with a `u32` size prefix.\n * ```ts\n * const decoder = getMapDecoder(fixCodecSize(getUtf8Decoder(), 5), getU8Decoder());\n * const map = decoder.decode(new Uint8Array([\n * 0x02,0x00,0x00,0x00,0x61,0x6c,0x69,0x63,0x65,0x2a,0x62,0x6f,0x62,0x00,0x00,0x05\n * ]));\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @see {@link getMapCodec}\n */\nexport function getMapDecoder(\n key: Decoder,\n value: Decoder,\n config: MapCodecConfig & { size: 0 },\n): FixedSizeDecoder, 0>;\nexport function getMapDecoder(\n key: FixedSizeDecoder,\n value: FixedSizeDecoder,\n config: MapCodecConfig & { size: number },\n): FixedSizeDecoder>;\nexport function getMapDecoder(\n key: Decoder,\n value: Decoder,\n config?: MapCodecConfig,\n): VariableSizeDecoder>;\nexport function getMapDecoder(\n key: Decoder,\n value: Decoder,\n config: MapCodecConfig = {},\n): Decoder> {\n return transformDecoder(\n getArrayDecoder(getTupleDecoder([key, value]), config as object) as Decoder<[TToKey, TToValue][]>,\n (entries: [TToKey, TToValue][]): Map => new Map(entries),\n );\n}\n\n/**\n * Returns a codec for encoding and decoding maps.\n *\n * This codec serializes maps where the key/value pairs are encoded\n * and decoded one after another using the provided key and value codecs.\n * The number of entries is determined by the `size` configuration and\n * defaults to a `u32` size prefix.\n *\n * @typeParam TFromKey - The type of the keys before encoding.\n * @typeParam TFromValue - The type of the values before encoding.\n * @typeParam TToKey - The type of the keys after decoding.\n * @typeParam TToValue - The type of the values after decoding.\n *\n * @param key - The codec for the map's keys.\n * @param value - The codec for the map's values.\n * @param config - Configuration options for encoding and decoding the map.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding maps.\n *\n * @example\n * Encoding and decoding a map with a `u32` size prefix (default).\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec());\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x02000000616c6963652a626f62000005\n * // | | | | └── Value (5)\n * // | | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | | └── Value (42)\n * // | └── Key (\"alice\", 5 bytes fixed)\n * // └── 4-byte prefix (2 entries)\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @example\n * Encoding and decoding a map with a `u16` size prefix.\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec(), { size: getU16Codec() });\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x0200616c6963652a626f62000005\n * // | | | | └── Value (5)\n * // | | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | | └── Value (42)\n * // | └── Key (\"alice\", 5 bytes fixed)\n * // └── 2-byte prefix (2 entries)\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @example\n * Encoding and decoding a fixed-size map.\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec(), { size: 2 });\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x616c6963652a626f62000005\n * // | | | └── Value (5)\n * // | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | └── Value (42)\n * // └── Key (\"alice\", 5 bytes fixed)\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @example\n * Encoding and decoding a map with remainder size.\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec(), { size: 'remainder' });\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x616c6963652a626f62000005\n * // | | | └── Value (5)\n * // | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | └── Value (42)\n * // └── Key (\"alice\", 5 bytes fixed)\n * // No size prefix, the size is inferred from the remaining bytes.\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @remarks\n * Separate {@link getMapEncoder} and {@link getMapDecoder} functions are available.\n * ```ts\n * const bytes = getMapEncoder(fixCodecSize(getUtf8Encoder(), 5), getU8Encoder()).encode(new Map([['alice', 42]]));\n * const map = getMapDecoder(fixCodecSize(getUtf8Decoder(), 5), getU8Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getMapEncoder}\n * @see {@link getMapDecoder}\n */\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: Codec,\n value: Codec,\n config: MapCodecConfig & { size: 0 },\n): FixedSizeCodec, Map, 0>;\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: FixedSizeCodec,\n value: FixedSizeCodec,\n config: MapCodecConfig & { size: number },\n): FixedSizeCodec, Map>;\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: Codec,\n value: Codec,\n config?: MapCodecConfig,\n): VariableSizeCodec, Map>;\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: Codec,\n value: Codec,\n config: MapCodecConfig = {},\n): Codec, Map> {\n return combineCodec(getMapEncoder(key, value, config as object), getMapDecoder(key, value, config as object));\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\n\n/**\n * Returns an encoder for `void` values.\n *\n * This encoder writes nothing to the byte array and has a fixed size of 0 bytes.\n * It is useful when working with structures that require a no-op encoder,\n * such as empty variants in {@link getDiscriminatedUnionEncoder}.\n *\n * For more details, see {@link getUnitCodec}.\n *\n * @returns A `FixedSizeEncoder`, representing an empty encoder.\n *\n * @example\n * Encoding a `void` value.\n * ```ts\n * getUnitEncoder().encode(undefined); // Produces an empty byte array.\n * ```\n *\n * @see {@link getUnitCodec}\n */\nexport function getUnitEncoder(): FixedSizeEncoder {\n return createEncoder({\n fixedSize: 0,\n write: (_value, _bytes, offset) => offset,\n });\n}\n\n/**\n * Returns a decoder for `void` values.\n *\n * This decoder always returns `undefined` and has a fixed size of 0 bytes.\n * It is useful when working with structures that require a no-op decoder,\n * such as empty variants in {@link getDiscriminatedUnionDecoder}.\n *\n * For more details, see {@link getUnitCodec}.\n *\n * @returns A `FixedSizeDecoder`, representing an empty decoder.\n *\n * @example\n * Decoding a `void` value.\n * ```ts\n * getUnitDecoder().decode(anyBytes); // Returns `undefined`.\n * ```\n *\n * @see {@link getUnitCodec}\n */\nexport function getUnitDecoder(): FixedSizeDecoder {\n return createDecoder({\n fixedSize: 0,\n read: (_bytes: ReadonlyUint8Array | Uint8Array, offset) => [undefined, offset],\n });\n}\n\n/**\n * Returns a codec for `void` values.\n *\n * This codec does nothing when encoding or decoding and has a fixed size of 0 bytes.\n * Namely, it always returns `undefined` when decoding and produces an empty byte array when encoding.\n *\n * This can be useful when working with structures that require a no-op codec,\n * such as empty variants in {@link getDiscriminatedUnionCodec}.\n *\n * @returns A `FixedSizeCodec`, representing an empty codec.\n *\n * @example\n * Encoding and decoding a `void` value.\n * ```ts\n * const codec = getUnitCodec();\n *\n * codec.encode(undefined); // Produces an empty byte array.\n * codec.decode(new Uint8Array([])); // Returns `undefined`.\n * ```\n *\n * @example\n * Using unit codecs as empty variants in a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Enter' }\n * | { __kind: 'Leave' }\n * | { __kind: 'Move'; x: number; y: number };\n *\n * const messageCodec = getDiscriminatedUnionCodec([\n * ['Enter', getUnitCodec()], // <- No-op codec for empty data\n * ['Leave', getUnitCodec()], // <- No-op codec for empty data\n * ['Move', getStructCodec([...])]\n * ]);\n * ```\n *\n * @remarks\n * Separate {@link getUnitEncoder} and {@link getUnitDecoder} functions are available.\n *\n * ```ts\n * const bytes = getUnitEncoder().encode();\n * const value = getUnitDecoder().decode(bytes);\n * ```\n *\n * @see {@link getUnitEncoder}\n * @see {@link getUnitDecoder}\n */\nexport function getUnitCodec(): FixedSizeCodec {\n return combineCodec(getUnitEncoder(), getUnitDecoder());\n}\n","import {\n assertIsFixedSize,\n Codec,\n combineCodec,\n containsBytes,\n Decoder,\n Encoder,\n fixDecoderSize,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n fixEncoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\n\nimport { getBooleanDecoder, getBooleanEncoder } from './boolean';\nimport { getConstantDecoder, getConstantEncoder } from './constant';\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\nimport { getUnionDecoder, getUnionEncoder } from './union';\nimport { getUnitDecoder, getUnitEncoder } from './unit';\n\n/**\n * Defines the configuration options for nullable codecs.\n *\n * This configuration controls how nullable values are encoded and decoded.\n *\n * By default, nullable values are prefixed with a `u8` (0 = `null`, 1 = present).\n * The `noneValue` and `prefix` options allow customizing this behavior.\n *\n * @typeParam TPrefix - A number codec, encoder, or decoder used as the presence prefix.\n *\n * @see {@link getNullableEncoder}\n * @see {@link getNullableDecoder}\n * @see {@link getNullableCodec}\n */\nexport type NullableCodecConfig = {\n /**\n * Specifies how `null` values are represented in the encoded data.\n *\n * - By default, `null` values are omitted from encoding.\n * - `'zeroes'`: The bytes allocated for the value are filled with zeroes. This requires a fixed-size codec.\n * - Custom byte array: `null` values are replaced with a predefined byte sequence. This results in a variable-size codec.\n *\n * @defaultValue No explicit `noneValue` is used; `null` values are omitted.\n */\n noneValue?: ReadonlyUint8Array | 'zeroes';\n\n /**\n * The presence prefix used to distinguish between `null` and present values.\n *\n * - By default, a `u8` prefix is used (`0 = null`, `1 = present`).\n * - Custom number codec: Allows defining a different number size for the prefix.\n * - `null`: No prefix is used; `noneValue` (if provided) determines `null`.\n * If no `noneValue` is set, `null` is identified by the absence of bytes.\n *\n * @defaultValue `u8` prefix.\n */\n prefix?: TPrefix | null;\n};\n\n/**\n * Returns an encoder for optional values, allowing `null` values to be encoded.\n *\n * This encoder serializes an optional value using a configurable approach:\n * - By default, a `u8` prefix is used (0 = `null`, 1 = present). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, `null` values are encoded as zeroes.\n * - If `noneValue` is a byte array, `null` values are replaced with the provided constant.\n *\n * For more details, see {@link getNullableCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param item - The encoder for the value that may be present.\n * @param config - Configuration options for encoding optional values.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding nullable values.\n *\n * @example\n * Encoding an optional number.\n * ```ts\n * const encoder = getNullableEncoder(getU32Encoder());\n *\n * encoder.encode(null); // 0x00\n * encoder.encode(42); // 0x012a000000\n * ```\n *\n * @see {@link getNullableCodec}\n */\nexport function getNullableEncoder(\n item: FixedSizeEncoder,\n config: NullableCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeEncoder;\nexport function getNullableEncoder(\n item: FixedSizeEncoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeEncoder;\nexport function getNullableEncoder(\n item: FixedSizeEncoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeEncoder;\nexport function getNullableEncoder(\n item: Encoder,\n config?: NullableCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeEncoder;\nexport function getNullableEncoder(\n item: Encoder,\n config: NullableCodecConfig = {},\n): Encoder {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformEncoder(getUnitEncoder(), (_boolean: boolean) => undefined);\n }\n return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixEncoderSize(getUnitEncoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitEncoder();\n }\n return getConstantEncoder(config.noneValue);\n })();\n\n return getUnionEncoder(\n [\n transformEncoder(getTupleEncoder([prefix, noneValue]), (_value: null): [boolean, void] => [\n false,\n undefined,\n ]),\n transformEncoder(getTupleEncoder([prefix, item]), (value: TFrom): [boolean, TFrom] => [true, value]),\n ],\n variant => Number(variant !== null),\n );\n}\n\n/**\n * Returns a decoder for optional values, allowing `null` values to be recognized.\n *\n * This decoder deserializes an optional value using a configurable approach:\n * - By default, a `u8` prefix is used (0 = `null`, 1 = present). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, `null` values are identified by zeroes.\n * - If `noneValue` is a byte array, `null` values match the provided constant.\n *\n * For more details, see {@link getNullableCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The decoder for the value that may be present.\n * @param config - Configuration options for decoding optional values.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding nullable values.\n *\n * @example\n * Decoding an optional number.\n * ```ts\n * const decoder = getNullableDecoder(getU32Decoder());\n *\n * decoder.decode(new Uint8Array([0x00])); // null\n * decoder.decode(new Uint8Array([0x01, 0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @see {@link getNullableCodec}\n */\nexport function getNullableDecoder(\n item: FixedSizeDecoder,\n config: NullableCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeDecoder;\nexport function getNullableDecoder(\n item: FixedSizeDecoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeDecoder;\nexport function getNullableDecoder(\n item: FixedSizeDecoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeDecoder;\nexport function getNullableDecoder(\n item: Decoder,\n config?: NullableCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeDecoder;\nexport function getNullableDecoder(\n item: Decoder,\n config: NullableCodecConfig = {},\n): Decoder {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformDecoder(getUnitDecoder(), () => false);\n }\n return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixDecoderSize(getUnitDecoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitDecoder();\n }\n return getConstantDecoder(config.noneValue);\n })();\n\n return getUnionDecoder(\n [\n transformDecoder(getTupleDecoder([prefix, noneValue]), () => null),\n transformDecoder(getTupleDecoder([prefix, item]), ([, value]): TTo => value),\n ],\n (bytes, offset) => {\n if (config.prefix === null && !config.noneValue) {\n return Number(offset < bytes.length);\n }\n if (config.prefix === null && config.noneValue != null) {\n const zeroValue =\n config.noneValue === 'zeroes' ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue;\n return containsBytes(bytes, zeroValue, offset) ? 0 : 1;\n }\n return Number(prefix.read(bytes, offset)[0]);\n },\n );\n}\n\n/**\n * Returns a codec for encoding and decoding optional values, allowing `null` values to be handled.\n *\n * This codec serializes and deserializes optional values using a configurable approach:\n * - By default, a `u8` prefix is used (0 = `null`, 1 = present).\n * This can be customized using a custom number codec or even disabled by setting\n * the `prefix` to `null`.\n * - If `noneValue: 'zeroes'` is set, `null` values are encoded/decoded as zeroes.\n * - If `noneValue` is a byte array, `null` values are represented by the provided constant.\n *\n * For more details on the configuration options, see {@link NullableCodecConfig}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The codec for the value that may be present.\n * @param config - Configuration options for encoding and decoding optional values.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding nullable values.\n *\n * @example\n * Encoding and decoding an optional number using a `u8` prefix (default).\n * ```ts\n * const codec = getNullableCodec(getU32Codec());\n *\n * codec.encode(null); // 0x00\n * codec.encode(42); // 0x012a000000\n *\n * codec.decode(new Uint8Array([0x00])); // null\n * codec.decode(new Uint8Array([0x01, 0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @example\n * Encoding and decoding an optional number using a fixed-size codec, by filling `null` values with zeroes.\n * ```ts\n * const codec = getNullableCodec(getU32Codec(), { noneValue: 'zeroes' });\n *\n * codec.encode(null); // 0x0000000000\n * codec.encode(42); // 0x012a000000\n *\n * codec.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00])); // null\n * codec.decode(new Uint8Array([0x01, 0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @example\n * Encoding and decoding `null` values with zeroes and no prefix.\n * ```ts\n * const codec = getNullableCodec(getU32Codec(), {\n * noneValue: 'zeroes',\n * prefix: null,\n * });\n *\n * codec.encode(null); // 0x00000000\n * codec.encode(42); // 0x2a000000\n *\n * codec.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00])); // null\n * codec.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @example\n * Encoding and decoding `null` values with a custom byte sequence and no prefix.\n * ```ts\n * const codec = getNullableCodec(getU16Codec(), {\n * noneValue: new Uint8Array([0xff, 0xff]),\n * prefix: null,\n * });\n *\n * codec.encode(null); // 0xffff\n * codec.encode(42); // 0x2a00\n *\n * codec.decode(new Uint8Array([0xff, 0xff])); // null\n * codec.decode(new Uint8Array([0x2a, 0x00])); // 42\n * ```\n *\n * @example\n * Identifying `null` values by the absence of bytes.\n * ```ts\n * const codec = getNullableCodec(getU16Codec(), { prefix: null });\n *\n * codec.encode(null); // Empty bytes\n * codec.encode(42); // 0x2a00\n *\n * codec.decode(new Uint8Array([])); // null\n * codec.decode(new Uint8Array([0x2a, 0x00])); // 42\n * ```\n *\n * @remarks\n * Separate {@link getNullableEncoder} and {@link getNullableDecoder} functions are available.\n *\n * ```ts\n * const bytes = getNullableEncoder(getU32Encoder()).encode(42);\n * const value = getNullableDecoder(getU32Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getNullableEncoder}\n * @see {@link getNullableDecoder}\n */\nexport function getNullableCodec(\n item: FixedSizeCodec,\n config: NullableCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeCodec;\nexport function getNullableCodec(\n item: FixedSizeCodec,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeCodec;\nexport function getNullableCodec(\n item: FixedSizeCodec,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeCodec;\nexport function getNullableCodec(\n item: Codec,\n config?: NullableCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeCodec;\nexport function getNullableCodec(\n item: Codec,\n config: NullableCodecConfig = {},\n): Codec {\n type ConfigCast = NullableCodecConfig & { noneValue?: ReadonlyUint8Array };\n return combineCodec(\n getNullableEncoder(item, config as ConfigCast),\n getNullableDecoder(item, config as ConfigCast),\n );\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\n\nimport { ArrayLikeCodecSize, getArrayDecoder, getArrayEncoder } from './array';\n\n/**\n * Defines the configuration options for set codecs.\n *\n * This configuration allows specifying how the size of the set is encoded.\n * The `size` option can be:\n *\n * - A {@link NumberCodec}, {@link NumberEncoder}, or {@link NumberDecoder} to store the size as a prefix.\n * - A fixed number of items, enforcing a strict length.\n * - The string `'remainder'` to infer the set size from the remaining bytes (only for fixed-size items).\n *\n * @typeParam TPrefix - The type used for encoding the size of the set.\n */\nexport type SetCodecConfig = {\n /**\n * The size encoding strategy for the set.\n * @defaultValue Uses a `u32` prefix.\n */\n size?: ArrayLikeCodecSize;\n};\n\n/**\n * Returns an encoder for sets of items.\n *\n * This encoder serializes `Set` values by encoding each item using the provided item encoder.\n * The number of items is stored as a prefix using a `u32` codec by default.\n *\n * For more details, see {@link getSetCodec}.\n *\n * @typeParam TFrom - The type of the items in the set before encoding.\n *\n * @param item - The encoder to use for each set item.\n * @param config - Optional configuration specifying the size strategy.\n * @returns An `Encoder>` for encoding sets of items.\n *\n * @example\n * Encoding a set of `u8` numbers.\n * ```ts\n * const encoder = getSetEncoder(getU8Encoder());\n * const bytes = encoder.encode(new Set([1, 2, 3]));\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix indicating 3 items.\n * ```\n *\n * @see {@link getSetCodec}\n */\nexport function getSetEncoder(\n item: Encoder,\n config: SetCodecConfig & { size: 0 },\n): FixedSizeEncoder, 0>;\nexport function getSetEncoder(\n item: FixedSizeEncoder,\n config: SetCodecConfig & { size: number },\n): FixedSizeEncoder>;\nexport function getSetEncoder(\n item: Encoder,\n config?: SetCodecConfig,\n): VariableSizeEncoder>;\nexport function getSetEncoder(\n item: Encoder,\n config: SetCodecConfig = {},\n): Encoder> {\n return transformEncoder(getArrayEncoder(item, config as object), (set: Set): TFrom[] => [...set]);\n}\n\n/**\n * Returns a decoder for sets of items.\n *\n * This decoder deserializes a `Set` from a byte array by decoding each item using the provided item decoder.\n * The number of items is determined by a `u32` size prefix by default.\n *\n * For more details, see {@link getSetCodec}.\n *\n * @typeParam TTo - The type of the items in the set after decoding.\n *\n * @param item - The decoder to use for each set item.\n * @param config - Optional configuration specifying the size strategy.\n * @returns A `Decoder>` for decoding sets of items.\n *\n * @example\n * Decoding a set of `u8` numbers.\n * ```ts\n * const decoder = getSetDecoder(getU8Decoder());\n * const value = decoder.decode(new Uint8Array([0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03]));\n * // new Set([1, 2, 3])\n * ```\n *\n * @see {@link getSetCodec}\n */\nexport function getSetDecoder(\n item: Decoder,\n config: SetCodecConfig & { size: 0 },\n): FixedSizeDecoder, 0>;\nexport function getSetDecoder(\n item: FixedSizeDecoder,\n config: SetCodecConfig & { size: number },\n): FixedSizeDecoder>;\nexport function getSetDecoder(\n item: Decoder,\n config?: SetCodecConfig,\n): VariableSizeDecoder>;\nexport function getSetDecoder(item: Decoder, config: SetCodecConfig = {}): Decoder> {\n return transformDecoder(getArrayDecoder(item, config as object), (entries: TTo[]): Set => new Set(entries));\n}\n\n/**\n * Returns a codec for encoding and decoding sets of items.\n *\n * This codec serializes `Set` values by encoding each item using the provided item codec.\n * The number of items is stored as a prefix using a `u32` codec by default.\n *\n * @typeParam TFrom - The type of the items in the set before encoding.\n * @typeParam TTo - The type of the items in the set after decoding.\n *\n * @param item - The codec to use for each set item.\n * @param config - Optional configuration specifying the size strategy.\n * @returns A `Codec, Set>` for encoding and decoding sets.\n *\n * @example\n * Encoding and decoding a set of `u8` numbers.\n * ```ts\n * const codec = getSetCodec(getU8Codec());\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix indicating 3 items.\n *\n * const value = codec.decode(bytes);\n * // new Set([1, 2, 3])\n * ```\n *\n * @example\n * Using a `u16` prefix for size.\n * ```ts\n * const codec = getSetCodec(getU8Codec(), { size: getU16Codec() });\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x0300010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 2-byte prefix indicating 3 items.\n * ```\n *\n * @example\n * Using a fixed-size set.\n * ```ts\n * const codec = getSetCodec(getU8Codec(), { size: 3 });\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x010203\n * // └-- Exactly 3 items of 1 byte each.\n * ```\n *\n * @example\n * Using remainder to infer set size.\n * ```ts\n * const codec = getSetCodec(getU8Codec(), { size: 'remainder' });\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x010203\n * // └-- 3 items of 1 byte each. The size is inferred from the remaining bytes.\n * ```\n *\n * @remarks\n * Separate {@link getSetEncoder} and {@link getSetDecoder} functions are available.\n *\n * ```ts\n * const bytes = getSetEncoder(getU8Encoder()).encode(new Set([1, 2, 3]));\n * const value = getSetDecoder(getU8Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getSetEncoder}\n * @see {@link getSetDecoder}\n */\nexport function getSetCodec(\n item: Codec,\n config: SetCodecConfig & { size: 0 },\n): FixedSizeCodec, Set, 0>;\nexport function getSetCodec(\n item: FixedSizeCodec,\n config: SetCodecConfig & { size: number },\n): FixedSizeCodec, Set>;\nexport function getSetCodec(\n item: Codec,\n config?: SetCodecConfig,\n): VariableSizeCodec, Set>;\nexport function getSetCodec(\n item: Codec,\n config: SetCodecConfig = {},\n): Codec, Set> {\n return combineCodec(getSetEncoder(item, config as object), getSetDecoder(item, config as object));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { DrainOuterGeneric, getFixedSize, getMaxSize, sumCodecSizes } from './utils';\n\n/**\n * Represents a collection of named fields used in struct codecs.\n *\n * Each field is defined as a tuple containing:\n * - A string key representing the field name.\n * - A codec used to encode and decode the field's value.\n *\n * @typeParam T - The codec type used for each field.\n */\ntype Fields = readonly (readonly [string, T])[];\n\ntype ArrayIndices = Exclude['length'], T['length']> & number;\n\n/**\n * Infers the TypeScript type for an object that can be encoded using a struct codec.\n *\n * This type maps the provided field encoders to their corresponding values.\n *\n * @typeParam TFields - The fields of the struct, each paired with an encoder.\n */\ntype GetEncoderTypeFromFields>> = DrainOuterGeneric<{\n [I in ArrayIndices as TFields[I][0]]: TFields[I][1] extends Encoder ? TFrom : never;\n}>;\n\n/**\n * Infers the TypeScript type for an object that can be decoded using a struct codec.\n *\n * This type maps the provided field decoders to their corresponding values.\n *\n * @typeParam TFields - The fields of the struct, each paired with a decoder.\n */\ntype GetDecoderTypeFromFields>> = DrainOuterGeneric<{\n [I in ArrayIndices as TFields[I][0]]: TFields[I][1] extends Decoder ? TTo : never;\n}>;\n\n/**\n * Returns an encoder for custom objects.\n *\n * This encoder serializes an object by encoding its fields sequentially,\n * using the provided field encoders.\n *\n * For more details, see {@link getStructCodec}.\n *\n * @typeParam TFields - The fields of the struct, each paired with an encoder.\n *\n * @param fields - The name and encoder of each field.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding custom objects.\n *\n * @example\n * Encoding a custom struct.\n * ```ts\n * const encoder = getStructEncoder([\n * ['name', fixCodecSize(getUtf8Encoder(), 5)],\n * ['age', getU8Encoder()]\n * ]);\n *\n * const bytes = encoder.encode({ name: 'Alice', age: 42 });\n * // 0x416c6963652a\n * // | └── Age (42)\n * // └── Name (\"Alice\")\n * ```\n *\n * @see {@link getStructCodec}\n */\nexport function getStructEncoder>>(\n fields: TFields,\n): FixedSizeEncoder>;\nexport function getStructEncoder>>(\n fields: TFields,\n): VariableSizeEncoder>;\nexport function getStructEncoder>>(\n fields: TFields,\n): Encoder> {\n type TFrom = GetEncoderTypeFromFields;\n const fieldCodecs = fields.map(([, codec]) => codec);\n const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize));\n const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? undefined;\n\n return createEncoder({\n ...(fixedSize === null\n ? {\n getSizeFromValue: (value: TFrom) =>\n fields\n .map(([key, codec]) => getEncodedSize(value[key as keyof TFrom], codec))\n .reduce((all, one) => all + one, 0),\n maxSize,\n }\n : { fixedSize }),\n write: (struct: TFrom, bytes, offset) => {\n fields.forEach(([key, codec]) => {\n offset = codec.write(struct[key as keyof TFrom], bytes, offset);\n });\n return offset;\n },\n });\n}\n\n/**\n * Returns a decoder for custom objects.\n *\n * This decoder deserializes an object by decoding its fields sequentially,\n * using the provided field decoders.\n *\n * For more details, see {@link getStructCodec}.\n *\n * @typeParam TFields - The fields of the struct, each paired with a decoder.\n *\n * @param fields - The name and decoder of each field.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding custom objects.\n *\n * @example\n * Decoding a custom struct.\n * ```ts\n * const decoder = getStructDecoder([\n * ['name', fixCodecSize(getUtf8Decoder(), 5)],\n * ['age', getU8Decoder()]\n * ]);\n *\n * const struct = decoder.decode(new Uint8Array([\n * 0x41,0x6c,0x69,0x63,0x65,0x2a\n * ]));\n * // { name: 'Alice', age: 42 }\n * ```\n *\n * @see {@link getStructCodec}\n */\nexport function getStructDecoder>>(\n fields: TFields,\n): FixedSizeDecoder>;\nexport function getStructDecoder>>(\n fields: TFields,\n): VariableSizeDecoder>;\nexport function getStructDecoder>>(\n fields: TFields,\n): Decoder> {\n type TTo = GetDecoderTypeFromFields;\n const fieldCodecs = fields.map(([, codec]) => codec);\n const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize));\n const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? undefined;\n\n return createDecoder({\n ...(fixedSize === null ? { maxSize } : { fixedSize }),\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const struct = {} as TTo;\n fields.forEach(([key, codec]) => {\n const [value, newOffset] = codec.read(bytes, offset);\n offset = newOffset;\n struct[key as keyof TTo] = value;\n });\n return [struct, offset];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding custom objects.\n *\n * This codec serializes objects by encoding and decoding each field sequentially.\n *\n * @typeParam TFields - The fields of the struct, each paired with a codec.\n *\n * @param fields - The name and codec of each field.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding custom objects.\n *\n * @example\n * Encoding and decoding a custom struct.\n * ```ts\n * const codec = getStructCodec([\n * ['name', fixCodecSize(getUtf8Codec(), 5)],\n * ['age', getU8Codec()]\n * ]);\n *\n * const bytes = codec.encode({ name: 'Alice', age: 42 });\n * // 0x416c6963652a\n * // | └── Age (42)\n * // └── Name (\"Alice\")\n *\n * const struct = codec.decode(bytes);\n * // { name: 'Alice', age: 42 }\n * ```\n *\n * @remarks\n * Separate {@link getStructEncoder} and {@link getStructDecoder} functions are available.\n *\n * ```ts\n * const bytes = getStructEncoder([\n * ['name', fixCodecSize(getUtf8Encoder(), 5)],\n * ['age', getU8Encoder()]\n * ]).encode({ name: 'Alice', age: 42 });\n *\n * const struct = getStructDecoder([\n * ['name', fixCodecSize(getUtf8Decoder(), 5)],\n * ['age', getU8Decoder()]\n * ]).decode(bytes);\n * ```\n *\n * @see {@link getStructEncoder}\n * @see {@link getStructDecoder}\n */\nexport function getStructCodec>>(\n fields: TFields,\n): FixedSizeCodec<\n GetEncoderTypeFromFields,\n GetDecoderTypeFromFields & GetEncoderTypeFromFields\n>;\nexport function getStructCodec>>(\n fields: TFields,\n): VariableSizeCodec<\n GetEncoderTypeFromFields,\n GetDecoderTypeFromFields & GetEncoderTypeFromFields\n>;\nexport function getStructCodec>>(\n fields: TFields,\n): Codec, GetDecoderTypeFromFields & GetEncoderTypeFromFields> {\n return combineCodec(\n getStructEncoder(fields),\n getStructDecoder(fields) as Decoder & GetEncoderTypeFromFields>,\n );\n}\n","/**\n * An implementation of the Rust `Option` type in JavaScript.\n *\n * In Rust, optional values are represented using `Option`, which can be either:\n * - `Some(T)`, indicating a present value.\n * - `None`, indicating the absence of a value.\n *\n * In JavaScript, this is typically represented as `T | null`. However, this approach fails with nested options.\n * For example, `Option>` in Rust would translate to `T | null | null` in JavaScript, which is equivalent to `T | null`.\n * This means there is no way to differentiate between `Some(None)` and `None`, making nested options impossible.\n *\n * This `Option` type helps solve this by mirroring Rust’s `Option` type.\n *\n * ```ts\n * type Option = Some | None;\n * type Some = { __option: 'Some'; value: T };\n * type None = { __option: 'None' };\n * ```\n *\n * @typeParam T - The type of the contained value.\n *\n * @example\n * Here's how you can create `Option` values.\n *\n * To improve developer experience, helper functions are available.\n * TypeScript can infer the type of `T` or it can be explicitly provided.\n *\n * ```ts\n * // Create an option with a value.\n * some('Hello World');\n * some(123);\n *\n * // Create an empty option.\n * none();\n * none();\n * ```\n *\n * @see {@link Some}\n * @see {@link None}\n * @see {@link some}\n * @see {@link none}\n */\nexport type Option = None | Some;\n\n/**\n * A flexible type that allows working with {@link Option} values or nullable values.\n *\n * It defines a looser type that can be used when encoding {@link Option | Options}.\n * This allows us to pass `null` or the nested value directly whilst still\n * supporting the Option type for use-cases that need more type safety.\n *\n * @typeParam T - The type of the contained value.\n *\n * @example\n * Accepting both `Option` and `T | null` as input.\n * ```ts\n * function double(value: OptionOrNullable) {\n * const option = isOption(value) ? value : wrapNullable(value);\n * return isSome(option) ? option.value * 2 : 'No value';\n * }\n *\n * double(42); // 84\n * double(some(21)); // 42\n * double(none()); // \"No value\"\n * double(null); // \"No value\"\n * ```\n *\n * @see {@link Option}\n * @see {@link isOption}\n * @see {@link wrapNullable}\n */\nexport type OptionOrNullable = Option | T | null;\n\n/**\n * Represents an {@link Option} that contains a value.\n *\n * This type mirrors Rust’s `Some(T)`, indicating that a value is present.\n *\n * For more details, see {@link Option}.\n *\n * @typeParam T - The type of the contained value.\n *\n * @example\n * Creating a `Some` value.\n * ```ts\n * const value = some(42);\n * isSome(value); // true\n * isNone(value); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link some}\n * @see {@link isSome}\n */\nexport type Some = Readonly<{ __option: 'Some'; value: T }>;\n\n/**\n * Represents an {@link Option} that contains no value.\n *\n * This type mirrors Rust’s `None`, indicating the absence of a value.\n *\n * For more details, see {@link Option}.\n *\n * @example\n * Creating a `None` value.\n * ```ts\n * const empty = none();\n * isNone(empty); // true\n * isSome(empty); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link none}\n * @see {@link isNone}\n */\nexport type None = Readonly<{ __option: 'None' }>;\n\n/**\n * Creates a new {@link Option} that contains a value.\n *\n * This function explicitly wraps a value in an {@link Option} type.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param value - The value to wrap in an {@link Option}.\n * @returns An {@link Option} containing the provided value.\n *\n * @example\n * Wrapping a value in an `Option`.\n * ```ts\n * const option = some('Hello');\n * option.value; // \"Hello\"\n * isOption(option); // true\n * isSome(option); // true\n * isNone(option); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n */\nexport const some = (value: T): Option => ({ __option: 'Some', value });\n\n/**\n * Creates a new {@link Option} that contains no value.\n *\n * This function explicitly represents an absent value.\n *\n * @typeParam T - The type of the expected absent value.\n *\n * @returns An {@link Option} containing no value.\n *\n * @example\n * Creating an empty `Option`.\n * ```ts\n * const empty = none();\n * isOption(empty); // true\n * isSome(empty); // false\n * isNone(empty); // true\n * ```\n *\n * @see {@link Option}\n * @see {@link None}\n */\nexport const none = (): Option => ({ __option: 'None' });\n\n/**\n * Checks whether the given value is an {@link Option}.\n *\n * This function determines whether an input follows the `Option` structure.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param input - The value to check.\n * @returns `true` if the value is an {@link Option}, `false` otherwise.\n *\n * @example\n * Checking for `Option` values.\n * ```ts\n * isOption(some(42)); // true\n * isOption(none()); // true\n * isOption(42); // false\n * isOption(null); // false\n * isOption(\"anything else\"); // false\n * ```\n *\n * @see {@link Option}\n */\nexport const isOption = (input: unknown): input is Option =>\n !!(\n input &&\n typeof input === 'object' &&\n '__option' in input &&\n ((input.__option === 'Some' && 'value' in input) || input.__option === 'None')\n );\n\n/**\n * Checks whether the given {@link Option} contains a value.\n *\n * This function acts as a type guard, ensuring the value is a {@link Some}.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param option - The {@link Option} to check.\n * @returns `true` if the option is a {@link Some}, `false` otherwise.\n *\n * @example\n * Checking for `Some` values.\n * ```ts\n * isSome(some(42)); // true\n * isSome(none()); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n */\nexport const isSome = (option: Option): option is Some => option.__option === 'Some';\n\n/**\n * Checks whether the given {@link Option} contains no value.\n *\n * This function acts as a type guard, ensuring the value is a {@link None}.\n *\n * @typeParam T - The type of the expected value.\n *\n * @param option - The {@link Option} to check.\n * @returns `true` if the option is a {@link None}, `false` otherwise.\n *\n * @example\n * Checking for `None` values.\n * ```ts\n * isNone(some(42)); // false\n * isNone(none()); // true\n * ```\n *\n * @see {@link Option}\n * @see {@link None}\n */\nexport const isNone = (option: Option): option is None => option.__option === 'None';\n","import { isSome, none, Option, some } from './option';\n\n/**\n * Unwraps the value of an {@link Option}, returning its contained value or a fallback.\n *\n * This function extracts the value `T` from an `Option` type.\n * - If the option is {@link Some}, it returns the contained value `T`.\n * - If the option is {@link None}, it returns the fallback value `U`, which defaults to `null`.\n *\n * @typeParam T - The type of the contained value.\n * @typeParam U - The type of the fallback value (defaults to `null`).\n *\n * @param option - The {@link Option} to unwrap.\n * @param fallback - A function that provides a fallback value if the option is {@link None}.\n * @returns The contained value if {@link Some}, otherwise the fallback value.\n *\n * @example\n * Unwrapping an `Option` with no fallback.\n * ```ts\n * unwrapOption(some('Hello World')); // \"Hello World\"\n * unwrapOption(none()); // null\n * ```\n *\n * @example\n * Providing a custom fallback value.\n * ```ts\n * unwrapOption(some('Hello World'), () => 'Default'); // \"Hello World\"\n * unwrapOption(none(), () => 'Default'); // \"Default\"\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n * @see {@link None}\n */\nexport function unwrapOption(option: Option): T | null;\nexport function unwrapOption(option: Option, fallback: () => U): T | U;\nexport function unwrapOption(option: Option, fallback?: () => U): T | U {\n if (isSome(option)) return option.value;\n return fallback ? fallback() : (null as U);\n}\n\n/**\n * Wraps a nullable value into an {@link Option}.\n *\n * - If the input value is `null`, this function returns {@link None}.\n * - Otherwise, it wraps the value in {@link Some}.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param nullable - The nullable value to wrap.\n * @returns An {@link Option} wrapping the value.\n *\n * @example\n * Wrapping nullable values.\n * ```ts\n * wrapNullable('Hello World'); // Option (Some)\n * wrapNullable(null); // Option (None)\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n * @see {@link None}\n */\nexport const wrapNullable = (nullable: T | null): Option => (nullable !== null ? some(nullable) : none());\n","import {\n assertIsFixedSize,\n Codec,\n combineCodec,\n containsBytes,\n Decoder,\n Encoder,\n fixDecoderSize,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n fixEncoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getBooleanDecoder,\n getBooleanEncoder,\n getConstantDecoder,\n getConstantEncoder,\n getTupleDecoder,\n getTupleEncoder,\n getUnionDecoder,\n getUnionEncoder,\n getUnitDecoder,\n getUnitEncoder,\n} from '@solana/codecs-data-structures';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\n\nimport { isOption, isSome, None, none, Option, OptionOrNullable, Some, some } from './option';\nimport { wrapNullable } from './unwrap-option';\n\n/**\n * Defines the configuration options for {@link Option} codecs.\n *\n * The `getOptionCodec` function behaves similarly to {@link getNullableCodec}\n * but encodes `Option` types instead of `T | null` types.\n *\n * This configuration controls how {@link None} values are encoded and how presence\n * is determined when decoding.\n *\n * @typeParam TPrefix - A number codec, encoder, or decoder used as the presence prefix.\n *\n * @see {@link getOptionEncoder}\n * @see {@link getOptionDecoder}\n * @see {@link getOptionCodec}\n */\nexport type OptionCodecConfig = {\n /**\n * Specifies how {@link None} values are represented in the encoded data.\n *\n * - By default, {@link None} values are omitted from encoding.\n * - `'zeroes'`: The bytes allocated for the value are filled with zeroes. This requires a fixed-size codec for the item.\n * - Custom byte array: {@link None} values are replaced with a predefined byte sequence. This results in a variable-size codec.\n *\n * @defaultValue No explicit `noneValue` is used; {@link None} values are omitted.\n */\n noneValue?: ReadonlyUint8Array | 'zeroes';\n\n /**\n * The presence prefix used to distinguish between {@link None} and present values.\n *\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`).\n * - Custom number codec: Allows defining a different number size for the prefix.\n * - `null`: No prefix is used; `noneValue` (if provided) determines {@link None}.\n * If no `noneValue` is set, {@link None} is identified by the absence of bytes.\n *\n * @defaultValue `u8` prefix.\n */\n prefix?: TPrefix | null;\n};\n\n/**\n * Returns an encoder for optional values using the {@link Option} type.\n *\n * This encoder serializes an {@link OptionOrNullable} value using a configurable approach:\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, {@link None} values are encoded as zeroes.\n * - If `noneValue` is a byte array, {@link None} values are replaced with the provided constant.\n *\n * Unlike {@link getNullableEncoder}, this encoder accepts both {@link Option} and {@link Nullable} values.\n *\n * For more details, see {@link getOptionCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param item - The encoder for the value that may be present.\n * @param config - Configuration options for encoding optional values.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding option values.\n *\n * @example\n * Encoding an optional string.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const encoder = getOptionEncoder(stringCodec);\n *\n * encoder.encode(some('Hi'));\n * encoder.encode('Hi');\n * // 0x01020000004869\n * // | | └-- utf8 string content (\"Hi\").\n * // | └-- u32 string prefix (2 characters).\n * // └-- 1-byte prefix (Some).\n *\n * encoder.encode(none());\n * encoder.encode(null);\n * // 0x00\n * // └-- 1-byte prefix (None).\n * ```\n *\n * @see {@link getOptionCodec}\n */\nexport function getOptionEncoder(\n item: FixedSizeEncoder,\n config: OptionCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeEncoder, TSize>;\nexport function getOptionEncoder(\n item: FixedSizeEncoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeEncoder>;\nexport function getOptionEncoder(\n item: FixedSizeEncoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeEncoder>;\nexport function getOptionEncoder(\n item: Encoder,\n config?: OptionCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeEncoder>;\nexport function getOptionEncoder(\n item: Encoder,\n config: OptionCodecConfig = {},\n): Encoder> {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformEncoder(getUnitEncoder(), (_boolean: boolean) => undefined);\n }\n return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixEncoderSize(getUnitEncoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitEncoder();\n }\n return getConstantEncoder(config.noneValue);\n })();\n\n return getUnionEncoder(\n [\n transformEncoder(getTupleEncoder([prefix, noneValue]), (_value: None | null): [boolean, void] => [\n false,\n undefined,\n ]),\n transformEncoder(getTupleEncoder([prefix, item]), (value: Some | TFrom): [boolean, TFrom] => [\n true,\n isOption(value) && isSome(value) ? value.value : value,\n ]),\n ],\n variant => {\n const option = isOption(variant) ? variant : wrapNullable(variant);\n return Number(isSome(option));\n },\n );\n}\n\n/**\n * Returns a decoder for optional values using the {@link Option} type.\n *\n * This decoder deserializes an `Option` value using a configurable approach:\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, `None` values are identified by zeroes.\n * - If `noneValue` is a byte array, `None` values match the provided constant.\n *\n * Unlike {@link getNullableDecoder}, this decoder always outputs an {@link Option} type.\n *\n * For more details, see {@link getOptionCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The decoder for the value that may be present.\n * @param config - Configuration options for decoding optional values.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding option values.\n *\n * @example\n * Decoding an optional string with a size prefix.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const decoder = getOptionDecoder(stringCodec);\n *\n * decoder.decode(new Uint8Array([0x01, 0x02, 0x00, 0x00, 0x00, 0x48, 0x69]));\n * // some('Hi')\n *\n * decoder.decode(new Uint8Array([0x00]));\n * // none()\n * ```\n *\n * @see {@link getOptionCodec}\n */\nexport function getOptionDecoder(\n item: FixedSizeDecoder,\n config: OptionCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeDecoder, TSize>;\nexport function getOptionDecoder(\n item: FixedSizeDecoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeDecoder>;\nexport function getOptionDecoder(\n item: FixedSizeDecoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeDecoder>;\nexport function getOptionDecoder(\n item: Decoder,\n config?: OptionCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeDecoder>;\nexport function getOptionDecoder(\n item: Decoder,\n config: OptionCodecConfig = {},\n): Decoder> {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformDecoder(getUnitDecoder(), () => false);\n }\n return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixDecoderSize(getUnitDecoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitDecoder();\n }\n return getConstantDecoder(config.noneValue);\n })();\n\n return getUnionDecoder(\n [\n transformDecoder(getTupleDecoder([prefix, noneValue]), () => none()),\n transformDecoder(getTupleDecoder([prefix, item]), ([, value]) => some(value)),\n ],\n (bytes, offset) => {\n if (config.prefix === null && !config.noneValue) {\n return Number(offset < bytes.length);\n }\n if (config.prefix === null && config.noneValue != null) {\n const zeroValue =\n config.noneValue === 'zeroes' ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue;\n return containsBytes(bytes, zeroValue, offset) ? 0 : 1;\n }\n return Number(prefix.read(bytes, offset)[0]);\n },\n );\n}\n\n/**\n * Returns a codec for encoding and decoding optional values using the {@link Option} type.\n *\n * This codec serializes and deserializes `Option` values using a configurable approach:\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`).\n * - If `noneValue: 'zeroes'` is set, `None` values are encoded/decoded as zeroes.\n * - If `noneValue` is a byte array, `None` values are represented by the provided constant.\n * - If `prefix: null` is set, the codec determines `None` values solely from `noneValue` or the presence of bytes.\n *\n * For more details on the configuration options, see {@link OptionCodecConfig}.\n *\n * Note that this behaves similarly to {@link getNullableCodec}, except it\n * encodes {@link OptionOrNullable} values and decodes {@link Option} values.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The codec for the value that may be present.\n * @param config - Configuration options for encoding and decoding option values.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding option values.\n *\n * @example\n * Encoding and decoding an optional string with a size prefix.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const codec = getOptionCodec(stringCodec);\n *\n * const someBytes = codec.encode(some('Hi'));\n * // 0x01020000004869\n * // | | └-- utf8 string content (\"Hi\").\n * // | └-- u32 string prefix (2 characters).\n * // └-- 1-byte prefix (Some).\n *\n * const noneBytes = codec.encode(none());\n * // 0x00\n * // └-- 1-byte prefix (None).\n *\n * codec.decode(someBytes); // some('Hi')\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Encoding nullable values.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const codec = getOptionCodec(stringCodec);\n *\n * const someBytes = codec.encode('Hi'); // 0x01020000004869\n * const noneBytes = codec.encode(null); // 0x00\n *\n * codec.decode(someBytes); // some('Hi')\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Encoding and decoding an optional number with a fixed size.\n * ```ts\n * const codec = getOptionCodec(getU16Codec(), { noneValue: 'zeroes' });\n *\n * const someBytes = codec.encode(some(42)); // 0x012a00\n * const noneBytes = codec.encode(none()); // 0x000000\n *\n * codec.decode(someBytes); // some(42)\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Encoding and decoding {@link None} values with a custom byte sequence and no prefix.\n * ```ts\n * const codec = getOptionCodec(getU16Codec(), {\n * noneValue: new Uint8Array([0xff, 0xff]),\n * prefix: null,\n * });\n *\n * const someBytes = codec.encode(some(42)); // 0x2a00\n * const noneBytes = codec.encode(none()); // 0xffff\n *\n * codec.decode(someBytes); // some(42)\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Identifying {@link None} values by the absence of bytes.\n * ```ts\n * const codec = getOptionCodec(getU16Codec(), { prefix: null });\n *\n * const someBytes = codec.encode(some(42)); // 0x2a00\n * const noneBytes = codec.encode(none()); // new Uint8Array(0)\n *\n * codec.decode(someBytes); // some(42)\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @remarks\n * Separate {@link getOptionEncoder} and {@link getOptionDecoder} functions are available.\n *\n * ```ts\n * const bytes = getOptionEncoder(getU32Encoder()).encode(some(42));\n * const value = getOptionDecoder(getU32Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getOptionEncoder}\n * @see {@link getOptionDecoder}\n */\nexport function getOptionCodec(\n item: FixedSizeCodec,\n config: OptionCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeCodec, Option, TSize>;\nexport function getOptionCodec(\n item: FixedSizeCodec,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeCodec, Option>;\nexport function getOptionCodec(\n item: FixedSizeCodec,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeCodec, Option>;\nexport function getOptionCodec(\n item: Codec,\n config?: OptionCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeCodec, Option>;\nexport function getOptionCodec(\n item: Codec,\n config: OptionCodecConfig = {},\n): Codec, Option> {\n type ConfigCast = OptionCodecConfig & { noneValue?: ReadonlyUint8Array };\n return combineCodec(\n getOptionEncoder(item, config as ConfigCast),\n getOptionDecoder(item, config as ConfigCast),\n );\n}\n","import { isOption, isSome, None, Some } from './option';\n\n/**\n * Defines types that should not be recursively unwrapped.\n *\n * These types are preserved as-is when using {@link unwrapOptionRecursively}.\n *\n * @see {@link unwrapOptionRecursively}\n */\ntype UnUnwrappables =\n | Date\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | bigint\n | boolean\n | number\n | string\n | symbol\n | null\n | undefined;\n\n/**\n * A type that recursively unwraps nested {@link Option} types.\n *\n * This type resolves all nested {@link Option} values, ensuring\n * that deeply wrapped values are properly extracted.\n *\n * - If `T` is an {@link Option}, it resolves to the contained value.\n * - If `T` is a known primitive or immutable type, it remains unchanged.\n * - If `T` is an object or array, it recursively unwraps any options found.\n *\n * The fallback type `U` (default: `null`) is used in place of `None` values.\n *\n * @typeParam T - The type to be unwrapped.\n * @typeParam U - The fallback type for `None` values (defaults to `null`).\n *\n * @example\n * Resolving nested `Option` types.\n * ```ts\n * UnwrappedOption>>; // string\n * UnwrappedOption; // null\n * ```\n *\n * @example\n * Resolving options inside objects and arrays.\n * ```ts\n * UnwrappedOption<{ a: Some; b: None }>; // { a: number; b: null }\n * UnwrappedOption<[Some, None]>; // [number, null]\n * ```\n *\n * @see {@link unwrapOptionRecursively}\n */\nexport type UnwrappedOption =\n T extends Some\n ? UnwrappedOption\n : T extends None\n ? U\n : T extends UnUnwrappables\n ? T\n : T extends object\n ? { [key in keyof T]: UnwrappedOption }\n : T extends Array\n ? Array>\n : T;\n\n/**\n * Recursively unwraps all nested {@link Option} types within a value.\n *\n * This function traverses a given value and removes all instances\n * of {@link Option}, replacing them with their contained values.\n *\n * - If an {@link Option} is encountered, its value is extracted.\n * - If an array or object is encountered, its elements are traversed recursively.\n * - If `None` is encountered, it is replaced with the fallback value (default: `null`).\n *\n * @typeParam T - The type of the input value.\n * @typeParam U - The fallback type for `None` values (defaults to `null`).\n *\n * @param input - The value to unwrap.\n * @param fallback - A function that provides a fallback value for `None` options.\n * @returns The recursively unwrapped value.\n *\n * @example\n * Recursively unwrapping nested options.\n * ```ts\n * unwrapOptionRecursively(some(some('Hello World'))); // \"Hello World\"\n * unwrapOptionRecursively(some(none())); // null\n * ```\n *\n * @example\n * Recursively unwrapping options inside objects and arrays.\n * ```ts\n * unwrapOptionRecursively({\n * a: 'hello',\n * b: none(),\n * c: [{ c1: some(42) }, { c2: none() }],\n * });\n * // { a: \"hello\", b: null, c: [{ c1: 42 }, { c2: null }] }\n * ```\n *\n * @example\n * Using a fallback value for `None` options.\n * ```ts\n * unwrapOptionRecursively(\n * {\n * a: 'hello',\n * b: none(),\n * c: [{ c1: some(42) }, { c2: none() }],\n * },\n * () => 'Default',\n * );\n * // { a: \"hello\", b: \"Default\", c: [{ c1: 42 }, { c2: \"Default\" }] }\n * ```\n *\n * @remarks\n * This function does not mutate objects or arrays.\n *\n * @see {@link Option}\n * @see {@link UnwrappedOption}\n */\nexport function unwrapOptionRecursively(input: T): UnwrappedOption;\nexport function unwrapOptionRecursively(input: T, fallback: () => U): UnwrappedOption;\nexport function unwrapOptionRecursively(input: T, fallback?: () => U): UnwrappedOption {\n // Types to bypass.\n if (!input || ArrayBuffer.isView(input)) {\n return input as UnwrappedOption;\n }\n\n const next = (x: X) =>\n (fallback ? unwrapOptionRecursively(x, fallback) : unwrapOptionRecursively(x)) as UnwrappedOption;\n\n // Handle Option.\n if (isOption(input)) {\n if (isSome(input)) return next(input.value) as UnwrappedOption;\n return (fallback ? fallback() : null) as UnwrappedOption;\n }\n\n // Walk.\n if (Array.isArray(input)) {\n return input.map(next) as UnwrappedOption;\n }\n if (typeof input === 'object') {\n return Object.fromEntries(Object.entries(input).map(([k, v]) => [k, next(v)])) as UnwrappedOption;\n }\n return input as UnwrappedOption;\n}\n","export * from '@solana/codecs-core';\nexport * from '@solana/codecs-data-structures';\nexport * from '@solana/codecs-numbers';\nexport * from '@solana/codecs-strings';\nexport * from '@solana/options';\n//# sourceMappingURL=index.node.mjs.map\n//# sourceMappingURL=index.node.mjs.map","/**\n * A pipeline is a solution that allows you to perform successive transforms of a value using functions. This is useful when building up a transaction message.\n *\n * Until the [pipeline operator](https://github.com/tc39/proposal-pipeline-operator) becomes part of JavaScript you can use this utility to create pipelines.\n *\n * Following common implementations of pipe functions that use TypeScript, this function supports a maximum arity of 10 for type safety.\n *\n * Note you can use nested pipes to extend this limitation, like so:\n * ```ts\n * const myValue = pipe(\n * pipe(\n * 1,\n * (x) => x + 1,\n * (x) => x * 2,\n * (x) => x - 1,\n * ),\n * (y) => y / 3,\n * (y) => y + 1,\n * );\n * ```\n *\n * @see https://github.com/ramda/ramda/blob/master/source/pipe.js\n * @see https://github.com/darky/rocket-pipes/blob/master/index.ts\n *\n * @example Basic\n * ```ts\n * const add = (a, b) => a + b;\n * const add10 = x => add(x, 10);\n * const add100 = x => add(x, 100);\n * const sum = pipe(1, add10, add100);\n * sum === 111; // true\n * ```\n *\n * @example Building a Solana transaction message\n * ```ts\n * const transferTransactionMessage = pipe(\n * // The result of the first expression...\n * createTransactionMessage({ version: 0 }),\n * // ...gets passed as the sole argument to the next function in the pipeline.\n * tx => setTransactionMessageFeePayer(myAddress, tx),\n * // The return value of that function gets passed to the next...\n * tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n * // ...and so on.\n * tx => appendTransactionMessageInstruction(createTransferInstruction(myAddress, toAddress, amountInLamports), tx),\n * );\n * ```\n *\n * @returns The initial value\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n): TInitial;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n): R1;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n): R2;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n): R3;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n): R4;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n): R5;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n): R6;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n): R7;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n /** The function with which to transform the return value of the prior function */\n r7_r8: (r7: R7) => R8,\n): R8;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n /** The function with which to transform the return value of the prior function */\n r7_r8: (r7: R7) => R8,\n /** The function with which to transform the return value of the prior function */\n r8_r9: (r8: R8) => R9,\n): R9;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n /** The function with which to transform the return value of the prior function */\n r7_r8: (r7: R7) => R8,\n /** The function with which to transform the return value of the prior function */\n r8_r9: (r8: R8) => R9,\n /** The function with which to transform the return value of the prior function */\n r9_r10: (r9: R9) => R10,\n): R10;\nexport function pipe(init: TInitial, ...fns: CallableFunction[]) {\n return fns.reduce((acc, fn) => fn(acc), init);\n}\n","import { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA,\n SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH,\n SolanaError,\n} from '@solana/errors';\n\nimport { AccountLookupMeta, AccountMeta } from './accounts';\n\n/**\n * An instruction destined for a given program.\n *\n * @example\n * ```ts\n * type StakeProgramInstruction = Instruction<'StakeConfig11111111111111111111111111111111'>;\n * ```\n */\nexport interface Instruction<\n TProgramAddress extends string = string,\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[] = readonly (AccountLookupMeta | AccountMeta)[],\n> {\n readonly accounts?: TAccounts;\n readonly data?: ReadonlyUint8Array;\n readonly programAddress: Address;\n}\n\n/**\n * An instruction that loads certain accounts.\n *\n * @example\n * ```ts\n * type InstructionWithTwoAccounts = InstructionWithAccounts<\n * [\n * WritableAccount, // First account\n * RentSysvar, // Second account\n * ]\n * >;\n * ```\n */\nexport interface InstructionWithAccounts<\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[],\n> extends Instruction {\n readonly accounts: TAccounts;\n}\n\nexport function isInstructionForProgram(\n instruction: TInstruction,\n programAddress: Address,\n): instruction is TInstruction & { programAddress: Address } {\n return instruction.programAddress === programAddress;\n}\n\nexport function assertIsInstructionForProgram(\n instruction: TInstruction,\n programAddress: Address,\n): asserts instruction is TInstruction & { programAddress: Address } {\n if (instruction.programAddress !== programAddress) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, {\n actualProgramAddress: instruction.programAddress,\n expectedProgramAddress: programAddress,\n });\n }\n}\n\nexport function isInstructionWithAccounts<\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[] = readonly (AccountLookupMeta | AccountMeta)[],\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): instruction is InstructionWithAccounts & TInstruction {\n return instruction.accounts !== undefined;\n}\n\nexport function assertIsInstructionWithAccounts<\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[] = readonly (AccountLookupMeta | AccountMeta)[],\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): asserts instruction is InstructionWithAccounts & TInstruction {\n if (instruction.accounts === undefined) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, {\n data: instruction.data,\n programAddress: instruction.programAddress,\n });\n }\n}\n\n/**\n * An instruction whose data conforms to a certain type.\n *\n * This is most useful when you have a branded `Uint8Array` that represents a particular\n * instruction's data.\n *\n * @example A type for the \\`AdvanceNonce\\` instruction of the System program\n * ```ts\n * type AdvanceNonceAccountInstruction<\n * TNonceAccountAddress extends string = string,\n * TNonceAuthorityAddress extends string = string,\n * > = Instruction<'11111111111111111111111111111111'> &\n * InstructionWithAccounts<\n * [\n * WritableAccount,\n * ReadonlyAccount<'SysvarRecentB1ockHashes11111111111111111111'>,\n * ReadonlySignerAccount,\n * ]\n * > &\n * InstructionWithData;\n * ```\n */\nexport interface InstructionWithData extends Instruction {\n readonly data: TData;\n}\n\nexport function isInstructionWithData<\n TData extends ReadonlyUint8Array = ReadonlyUint8Array,\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): instruction is InstructionWithData & TInstruction {\n return instruction.data !== undefined;\n}\n\nexport function assertIsInstructionWithData<\n TData extends ReadonlyUint8Array = ReadonlyUint8Array,\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): asserts instruction is InstructionWithData & TInstruction {\n if (instruction.data === undefined) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, {\n accountAddresses: instruction.accounts?.map(a => a.address),\n programAddress: instruction.programAddress,\n });\n }\n}\n","/**\n * Describes the purpose for which an account participates in a transaction.\n *\n * Every account that participates in a transaction can be read from, but only ones that you mark as\n * writable may be written to, and only ones that you indicate must sign the transaction will gain\n * the privileges associated with signers at runtime.\n *\n * | | `isSigner` | `isWritable` |\n * | ----------------------------- | ---------- | ------------ |\n * | `AccountRole.READONLY` | ❌ | ❌ |\n * | `AccountRole.WRITABLE` | ❌ | ✅ |\n * | `AccountRole.READONLY_SIGNER` | ✅ | ❌ |\n * | `AccountRole.WRITABLE_SIGNER` | ✅ | ✅ |\n */\nexport enum AccountRole {\n // Bitflag guide: is signer ⌄⌄ is writable\n WRITABLE_SIGNER = /* 3 */ 0b11, // prettier-ignore\n READONLY_SIGNER = /* 2 */ 0b10, // prettier-ignore\n WRITABLE = /* 1 */ 0b01, // prettier-ignore\n READONLY = /* 0 */ 0b00, // prettier-ignore\n}\n\n// Quick primer on bitwise operations: https://stackoverflow.com/a/1436448/802047\nconst IS_SIGNER_BITMASK = 0b10;\nconst IS_WRITABLE_BITMASK = 0b01;\n\n/**\n * @returns An {@link AccountRole} representing the non-signer variant of the supplied role.\n */\nexport function downgradeRoleToNonSigner(role: AccountRole.READONLY_SIGNER): AccountRole.READONLY;\nexport function downgradeRoleToNonSigner(role: AccountRole.WRITABLE_SIGNER): AccountRole.WRITABLE;\nexport function downgradeRoleToNonSigner(role: AccountRole): AccountRole;\nexport function downgradeRoleToNonSigner(role: AccountRole): AccountRole {\n return role & ~IS_SIGNER_BITMASK;\n}\n\n/**\n * @returns An {@link AccountRole} representing the read-only variant of the supplied role.\n */\nexport function downgradeRoleToReadonly(role: AccountRole.WRITABLE): AccountRole.READONLY;\nexport function downgradeRoleToReadonly(role: AccountRole.WRITABLE_SIGNER): AccountRole.READONLY_SIGNER;\nexport function downgradeRoleToReadonly(role: AccountRole): AccountRole;\nexport function downgradeRoleToReadonly(role: AccountRole): AccountRole {\n return role & ~IS_WRITABLE_BITMASK;\n}\n\n/**\n * Returns `true` if the {@link AccountRole} given represents that of a signer. Also refines the\n * TypeScript type of the supplied role.\n */\nexport function isSignerRole(role: AccountRole): role is AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER {\n return role >= AccountRole.READONLY_SIGNER;\n}\n\n/**\n * Returns `true` if the {@link AccountRole} given represents that of a writable account. Also\n * refines the TypeScript type of the supplied role.\n */\nexport function isWritableRole(role: AccountRole): role is AccountRole.WRITABLE | AccountRole.WRITABLE_SIGNER {\n return (role & IS_WRITABLE_BITMASK) !== 0;\n}\n\n/**\n * Given two {@link AccountRole | AccountRoles}, will return the {@link AccountRole} that grants the\n * highest privileges of both.\n *\n * @example\n * ```ts\n * // Returns `AccountRole.WRITABLE_SIGNER`\n * mergeRoles(AccountRole.READONLY_SIGNER, AccountRole.WRITABLE);\n * ```\n */\nexport function mergeRoles(roleA: AccountRole.WRITABLE, roleB: AccountRole.READONLY_SIGNER): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.READONLY_SIGNER, roleB: AccountRole.WRITABLE): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole.WRITABLE_SIGNER): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.WRITABLE_SIGNER, roleB: AccountRole): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole.READONLY_SIGNER): AccountRole.READONLY_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.READONLY_SIGNER, roleB: AccountRole): AccountRole.READONLY_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole.WRITABLE): AccountRole.WRITABLE; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.WRITABLE, roleB: AccountRole): AccountRole.WRITABLE; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.READONLY, roleB: AccountRole.READONLY): AccountRole.READONLY; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole): AccountRole; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole): AccountRole {\n return roleA | roleB;\n}\n\n/**\n * @returns An {@link AccountRole} representing the signer variant of the supplied role.\n */\nexport function upgradeRoleToSigner(role: AccountRole.READONLY): AccountRole.READONLY_SIGNER;\nexport function upgradeRoleToSigner(role: AccountRole.WRITABLE): AccountRole.WRITABLE_SIGNER;\nexport function upgradeRoleToSigner(role: AccountRole): AccountRole;\nexport function upgradeRoleToSigner(role: AccountRole): AccountRole {\n return role | IS_SIGNER_BITMASK;\n}\n\n/**\n * @returns An {@link AccountRole} representing the writable variant of the supplied role.\n */\nexport function upgradeRoleToWritable(role: AccountRole.READONLY): AccountRole.WRITABLE;\nexport function upgradeRoleToWritable(role: AccountRole.READONLY_SIGNER): AccountRole.WRITABLE_SIGNER;\nexport function upgradeRoleToWritable(role: AccountRole): AccountRole;\nexport function upgradeRoleToWritable(role: AccountRole): AccountRole {\n return role | IS_WRITABLE_BITMASK;\n}\n","import { Address, assertIsAddress, getAddressDecoder, getAddressEncoder, isAddress } from '@solana/addresses';\nimport { combineCodec, createEncoder, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\nimport {\n isSolanaError,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\nexport type Blockhash = Brand, 'Blockhash'>;\n\n/**\n * A type guard that returns `true` if the input string conforms to the {@link Blockhash} type, and\n * refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isBlockhash } from '@solana/rpc-types';\n *\n * if (isBlockhash(blockhash)) {\n * // At this point, `blockhash` has been refined to a\n * // `Blockhash` that can be used with the RPC.\n * const { value: isValid } = await rpc.isBlockhashValid(blockhash).send();\n * setBlockhashIsFresh(isValid);\n * } else {\n * setError(`${blockhash} is not a blockhash`);\n * }\n * ```\n */\nexport function isBlockhash(putativeBlockhash: string): putativeBlockhash is Blockhash {\n return isAddress(putativeBlockhash);\n}\n\n/**\n * From time to time you might acquire a string, that you expect to validate as a blockhash, from an\n * untrusted network API or user input. Use this function to assert that such an arbitrary string is\n * a base58-encoded blockhash.\n *\n * @example\n * ```ts\n * import { assertIsBlockhash } from '@solana/rpc-types';\n *\n * // Imagine a function that determines whether a blockhash is fresh when a user submits a form.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const blockhash: string = blockhashInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `blockhash` to `Blockhash`.\n * assertIsBlockhash(blockhash);\n * // At this point, `blockhash` is a `Blockhash` that can be used with the RPC.\n * const { value: isValid } = await rpc.isBlockhashValid(blockhash).send();\n * } catch (e) {\n * // `blockhash` turned out not to be a base58-encoded blockhash\n * }\n * }\n * ```\n */\nexport function assertIsBlockhash(putativeBlockhash: string): asserts putativeBlockhash is Blockhash {\n try {\n assertIsAddress(putativeBlockhash);\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) {\n throw new SolanaError(SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, error.context);\n }\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) {\n throw new SolanaError(SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, error.context);\n }\n throw error;\n }\n}\n\n/**\n * Combines _asserting_ that a string is a blockhash with _coercing_ it to the {@link Blockhash}\n * type. It's most useful with untrusted input.\n *\n * @example\n * ```ts\n * import { blockhash } from '@solana/rpc-types';\n *\n * const { value: isValid } = await rpc.isBlockhashValid(blockhash(blockhashFromUserInput)).send();\n * ```\n *\n * > [!TIP]\n * > When starting from a known-good blockhash as a string, it's more efficient to typecast it\n * rather than to use the {@link blockhash} helper, because the helper unconditionally performs\n * validation on its input.\n * >\n * > ```ts\n * > import { Blockhash } from '@solana/rpc-types';\n * >\n * > const blockhash = 'ABmPH5KDXX99u6woqFS5vfBGSNyKG42SzpvBMWWqAy48' as Blockhash;\n * > ```\n */\nexport function blockhash(putativeBlockhash: string): Blockhash {\n assertIsBlockhash(putativeBlockhash);\n return putativeBlockhash;\n}\n\n/**\n * Returns an encoder that you can use to encode a base58-encoded blockhash to a byte array.\n *\n * @example\n * ```ts\n * import { getBlockhashEncoder } from '@solana/rpc-types';\n *\n * const blockhash = 'ABmPH5KDXX99u6woqFS5vfBGSNyKG42SzpvBMWWqAy48' as Blockhash;\n * const blockhashEncoder = getBlockhashEncoder();\n * const blockhashBytes = blockhashEncoder.encode(blockhash);\n * // Uint8Array(32) [\n * // 136, 123, 44, 249, 43, 19, 60, 14,\n * // 144, 16, 168, 241, 121, 111, 70, 232,\n * // 186, 26, 140, 202, 213, 64, 231, 82,\n * // 179, 66, 103, 237, 52, 117, 217, 93\n * // ]\n * ```\n */\nexport function getBlockhashEncoder(): FixedSizeEncoder {\n const addressEncoder = getAddressEncoder();\n return createEncoder({\n fixedSize: 32,\n write: (value: string, bytes, offset) => {\n assertIsBlockhash(value);\n return addressEncoder.write(value as string as Address, bytes, offset);\n },\n });\n}\n\n/**\n * Returns a decoder that you can use to convert an array of 32 bytes representing a blockhash to\n * the base58-encoded representation of that blockhash.\n *\n * @example\n * ```ts\n * import { getBlockhashDecoder } from '@solana/rpc-types';\n *\n * const blockhashBytes = new Uint8Array([\n * 136, 123, 44, 249, 43, 19, 60, 14,\n * 144, 16, 168, 241, 121, 111, 70, 232,\n * 186, 26, 140, 202, 213, 64, 231, 82,\n * 179, 66, 103, 237, 52, 117, 217, 93\n * ]);\n * const blockhashDecoder = getBlockhashDecoder();\n * const blockhash = blockhashDecoder.decode(blockhashBytes); // ABmPH5KDXX99u6woqFS5vfBGSNyKG42SzpvBMWWqAy48\n * ```\n */\nexport function getBlockhashDecoder(): FixedSizeDecoder {\n return getAddressDecoder() as FixedSizeDecoder as FixedSizeDecoder;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a base-58 encoded blockhash.\n *\n * @see {@link getBlockhashDecoder}\n * @see {@link getBlockhashEncoder}\n */\nexport function getBlockhashCodec(): FixedSizeCodec {\n return combineCodec(getBlockhashEncoder(), getBlockhashDecoder());\n}\n\nexport function getBlockhashComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","export type MainnetUrl = string & { '~cluster': 'mainnet' };\nexport type DevnetUrl = string & { '~cluster': 'devnet' };\nexport type TestnetUrl = string & { '~cluster': 'testnet' };\nexport type ClusterUrl = DevnetUrl | MainnetUrl | TestnetUrl | string;\n\n/** Given a URL casts it to a type that is only accepted where mainnet URLs are expected. */\nexport function mainnet(putativeString: string): MainnetUrl {\n return putativeString as MainnetUrl;\n}\n/** Given a URL casts it to a type that is only accepted where devnet URLs are expected. */\nexport function devnet(putativeString: string): DevnetUrl {\n return putativeString as DevnetUrl;\n}\n/** Given a URL casts it to a type that is only accepted where testnet URLs are expected. */\nexport function testnet(putativeString: string): TestnetUrl {\n return putativeString as TestnetUrl;\n}\n","import { SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, SolanaError } from '@solana/errors';\n\n/**\n * A union of all possible commitment statuses -- each a measure of the network confirmation and\n * stake levels on a particular block.\n *\n * Read more about the statuses themselves, [here](https://docs.solana.com/cluster/commitments).\n */\nexport type Commitment = 'confirmed' | 'finalized' | 'processed';\n\nfunction getCommitmentScore(commitment: Commitment): number {\n switch (commitment) {\n case 'finalized':\n return 2;\n case 'confirmed':\n return 1;\n case 'processed':\n return 0;\n default:\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: commitment satisfies never,\n });\n }\n}\n\nexport function commitmentComparator(a: Commitment, b: Commitment): -1 | 0 | 1 {\n if (a === b) {\n return 0;\n }\n return getCommitmentScore(a) < getCommitmentScore(b) ? -1 : 1;\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n} from '@solana/codecs-core';\nimport { getU64Decoder, getU64Encoder, NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * Represents an integer value denominated in Lamports (ie. $1 \\times 10^{-9}$ ◎).\n *\n * It is represented as a `bigint` in client code and an `u64` in server code.\n */\nexport type Lamports = Brand;\n\n// Largest possible value to be represented by a u64\nconst maxU64Value = 18446744073709551615n; // 2n ** 64n - 1n\n\nlet memoizedU64Encoder: FixedSizeEncoder | undefined;\nlet memoizedU64Decoder: FixedSizeDecoder | undefined;\n\nfunction getMemoizedU64Encoder(): FixedSizeEncoder {\n if (!memoizedU64Encoder) memoizedU64Encoder = getU64Encoder();\n return memoizedU64Encoder;\n}\n\nfunction getMemoizedU64Decoder(): FixedSizeDecoder {\n if (!memoizedU64Decoder) memoizedU64Decoder = getU64Decoder();\n return memoizedU64Decoder;\n}\n\n/**\n * This is a type guard that accepts a `bigint` as input. It will both return `true` if the integer\n * conforms to the {@link Lamports} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isLamports } from '@solana/rpc-types';\n *\n * if (isLamports(lamports)) {\n * // At this point, `lamports` has been refined to a\n * // `Lamports` that can be used anywhere Lamports are expected.\n * await transfer(fromAddress, toAddress, lamports);\n * } else {\n * setError(`${lamports} is not a quantity of Lamports`);\n * }\n * ```\n */\nexport function isLamports(putativeLamports: bigint): putativeLamports is Lamports {\n return putativeLamports >= 0 && putativeLamports <= maxU64Value;\n}\n\n/**\n * Lamport values returned from the RPC API conform to the type {@link Lamports}. You can use a\n * value of that type wherever a quantity of Lamports is expected.\n *\n * @example\n * From time to time you might acquire a number that you expect to be a quantity of Lamports, from\n * an untrusted network API or user input. To assert that such an arbitrary number is usable as a\n * quantity of Lamports, use this function.\n *\n * ```ts\n * import { assertIsLamports } from '@solana/rpc-types';\n *\n * // Imagine a function that creates a transfer instruction when a user submits a form.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `number` type.\n * const lamports: number = parseInt(quantityInput.value, 10);\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `lamports` to `Lamports`.\n * assertIsLamports(lamports);\n * // At this point, `lamports` is a `Lamports` that can be used anywhere Lamports are expected.\n * await transfer(fromAddress, toAddress, lamports);\n * } catch (e) {\n * // `lamports` turned out not to validate as a quantity of Lamports.\n * }\n * }\n * ```\n */\nexport function assertIsLamports(putativeLamports: bigint): asserts putativeLamports is Lamports {\n if (putativeLamports < 0 || putativeLamports > maxU64Value) {\n throw new SolanaError(SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE);\n }\n}\n\n/**\n * This helper combines _asserting_ that a number is a possible number of {@link Lamports} with\n * _coercing_ it to the {@link Lamports} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { lamports } from '@solana/rpc-types';\n *\n * await transfer(address(fromAddress), address(toAddress), lamports(100000n));\n * ```\n */\nexport function lamports(putativeLamports: bigint): Lamports {\n assertIsLamports(putativeLamports);\n return putativeLamports;\n}\n\ntype ExtractAdditionalProps = Omit;\n\n/**\n * Returns an encoder that you can use to encode a 64-bit {@link Lamports} value to 8 bytes in\n * little endian order.\n */\nexport function getDefaultLamportsEncoder(): FixedSizeEncoder {\n return getLamportsEncoder(getMemoizedU64Encoder());\n}\n\n/**\n * Returns an encoder that you can use to encode a {@link Lamports} value to a byte array.\n *\n * You must supply a number decoder that will determine how encode the numeric value.\n *\n * @example\n * ```ts\n * import { getLamportsEncoder } from '@solana/rpc-types';\n * import { getU16Encoder } from '@solana/codecs-numbers';\n *\n * const lamports = lamports(256n);\n * const lamportsEncoder = getLamportsEncoder(getU16Encoder());\n * const lamportsBytes = lamportsEncoder.encode(lamports);\n * // Uint8Array(2) [ 0, 1 ]\n * ```\n */\nexport function getLamportsEncoder(\n innerEncoder: TEncoder,\n): Encoder & ExtractAdditionalProps {\n return innerEncoder;\n}\n\n/**\n * Returns a decoder that you can use to decode a byte array representing a 64-bit little endian\n * number to a {@link Lamports} value.\n */\nexport function getDefaultLamportsDecoder(): FixedSizeDecoder {\n return getLamportsDecoder(getMemoizedU64Decoder());\n}\n\n/**\n * Returns a decoder that you can use to convert an array of bytes representing a number to a\n * {@link Lamports} value.\n *\n * You must supply a number decoder that will determine how many bits to use to decode the numeric\n * value.\n *\n * @example\n * ```ts\n * import { getLamportsDecoder } from '@solana/rpc-types';\n * import { getU16Decoder } from '@solana/codecs-numbers';\n *\n * const lamportsBytes = new Uint8Array([ 0, 1 ]);\n * const lamportsDecoder = getLamportsDecoder(getU16Decoder());\n * const lamports = lamportsDecoder.decode(lamportsBytes); // lamports(256n)\n * ```\n */\nexport function getLamportsDecoder(\n innerDecoder: TDecoder,\n): Decoder & ExtractAdditionalProps {\n return transformDecoder(innerDecoder, value =>\n lamports(typeof value === 'bigint' ? value : BigInt(value)),\n ) as Decoder & ExtractAdditionalProps;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a 64-bit {@link Lamports} value.\n *\n * @see {@link getDefaultLamportsDecoder}\n * @see {@link getDefaultLamportsEncoder}\n */\nexport function getDefaultLamportsCodec(): FixedSizeCodec {\n return combineCodec(getDefaultLamportsEncoder(), getDefaultLamportsDecoder());\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to {@link Lamports} value.\n *\n * @see {@link getLamportsDecoder}\n * @see {@link getLamportsEncoder}\n */\nexport function getLamportsCodec(\n innerCodec: TCodec,\n): Codec & ExtractAdditionalProps {\n return combineCodec(getLamportsEncoder(innerCodec), getLamportsDecoder(innerCodec)) as Codec &\n ExtractAdditionalProps;\n}\n","import { SOLANA_ERROR__MALFORMED_BIGINT_STRING, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * This type represents a `bigint` which has been encoded as a string for transit over a transport\n * that does not support `bigint` values natively. The JSON-RPC is such a transport.\n */\nexport type StringifiedBigInt = Brand;\n\n/**\n * A type guard that returns `true` if the input string parses as a `BigInt`, and refines its type\n * for use in your program.\n *\n * @example\n * ```ts\n * import { isStringifiedBigInt } from '@solana/rpc-types';\n *\n * if (isStringifiedBigInt(bigintString)) {\n * // At this point, `bigintString` has been refined to a `StringifiedBigInt`\n * bigintString satisfies StringifiedBigInt; // OK\n * } else {\n * setError(`${bigintString} does not represent a BigInt`);\n * }\n * ```\n */\nexport function isStringifiedBigInt(putativeBigInt: string): putativeBigInt is StringifiedBigInt {\n try {\n BigInt(putativeBigInt);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * From time to time you might acquire a string, that you expect to parse as a `BigInt`, from an\n * untrusted network API or user input. Use this function to assert that such an arbitrary string\n * will in fact parse as a `BigInt`.\n *\n * @example\n * ```ts\n * import { assertIsStringifiedBigInt } from '@solana/rpc-types';\n *\n * // Imagine having received a value that you presume represents the supply of some token.\n * // At this point we know only that it conforms to the `string` type.\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `supplyString` to `StringifiedBigInt`.\n * assertIsStringifiedBigInt(supplyString);\n * // At this point, `supplyString` is a `StringifiedBigInt`.\n * supplyString satisfies StringifiedBigInt;\n * } catch (e) {\n * // `supplyString` turned out not to parse as a `BigInt`\n * }\n * ```\n */\nexport function assertIsStringifiedBigInt(putativeBigInt: string): asserts putativeBigInt is StringifiedBigInt {\n try {\n BigInt(putativeBigInt);\n } catch {\n throw new SolanaError(SOLANA_ERROR__MALFORMED_BIGINT_STRING, {\n value: putativeBigInt,\n });\n }\n}\n\n/**\n * This helper combines _asserting_ that a string will parse as a `BigInt` with _coercing_ it to the\n * {@link StringifiedBigInt} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { stringifiedBigInt } from '@solana/rpc-types';\n *\n * const supplyString = stringifiedBigInt('1000000000');\n * ```\n */\nexport function stringifiedBigInt(putativeBigInt: string): StringifiedBigInt {\n assertIsStringifiedBigInt(putativeBigInt);\n return putativeBigInt;\n}\n","import { SOLANA_ERROR__MALFORMED_NUMBER_STRING, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * This type represents a number which has been encoded as a string for transit over a transport\n * where loss of precision when using the native number type is a concern. The JSON-RPC is such a\n * transport.\n */\nexport type StringifiedNumber = Brand;\n\n/**\n * A type guard that returns `true` if the input string parses as a `Number`, and refines its type\n * for use in your program.\n *\n * @example\n * ```ts\n * import { isStringifiedNumber } from '@solana/rpc-types';\n *\n * if (isStringifiedNumber(numericString)) {\n * // At this point, `numericString` has been refined to a `StringifiedNumber`\n * numericString satisfies StringifiedNumber; // OK\n * } else {\n * setError(`${numericString} does not represent a number`);\n * }\n * ```\n */\nexport function isStringifiedNumber(putativeNumber: string): putativeNumber is StringifiedNumber {\n return !Number.isNaN(Number(putativeNumber));\n}\n\n/**\n * From time to time you might acquire a string, that you expect to parse as a `Number`, from an\n * untrusted network API or user input. Use this function to assert that such an arbitrary string\n * will in fact parse as a `Number`.\n *\n * @example\n * ```ts\n * import { assertIsStringifiedNumber } from '@solana/rpc-types';\n *\n * // Imagine having received a value that you presume represents some decimal number.\n * // At this point we know only that it conforms to the `string` type.\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `decimalNumberString` to `StringifiedNumber`.\n * assertIsStringifiedNumber(decimalNumberString);\n * // At this point, `decimalNumberString` is a `StringifiedNumber`.\n * decimalNumberString satisfies StringifiedNumber;\n * } catch (e) {\n * // `decimalNumberString` turned out not to parse as a number.\n * }\n * ```\n */\nexport function assertIsStringifiedNumber(putativeNumber: string): asserts putativeNumber is StringifiedNumber {\n if (Number.isNaN(Number(putativeNumber))) {\n throw new SolanaError(SOLANA_ERROR__MALFORMED_NUMBER_STRING, {\n value: putativeNumber,\n });\n }\n}\n\n/**\n * This helper combines _asserting_ that a string will parse as a `Number` with _coercing_ it to the\n * {@link StringifiedNumber} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { stringifiedNumber } from '@solana/rpc-types';\n *\n * const decimalNumberString = stringifiedNumber('-42.1');\n * ```\n */\nexport function stringifiedNumber(putativeNumber: string): StringifiedNumber {\n assertIsStringifiedNumber(putativeNumber);\n return putativeNumber;\n}\n","import { SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * This type represents a Unix timestamp in _seconds_.\n *\n * It is represented as a `bigint` in client code and an `i64` in server code.\n */\nexport type UnixTimestamp = Brand;\n\n// Largest possible value to be represented by an i64\nconst maxI64Value = 9223372036854775807n; // 2n ** 63n - 1n\nconst minI64Value = -9223372036854775808n; // -(2n ** 63n)\n\n/**\n * This is a type guard that accepts a `bigint` as input. It will both return `true` if the integer\n * conforms to the {@link UnixTimestamp} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isUnixTimestamp } from '@solana/rpc-types';\n *\n * if (isUnixTimestamp(timestamp)) {\n * // At this point, `timestamp` has been refined to a\n * // `UnixTimestamp` that can be used anywhere timestamps are expected.\n * timestamp satisfies UnixTimestamp;\n * } else {\n * setError(`${timestamp} is not a Unix timestamp`);\n * }\n * ```\n */\n\nexport function isUnixTimestamp(putativeTimestamp: bigint): putativeTimestamp is UnixTimestamp {\n return putativeTimestamp >= minI64Value && putativeTimestamp <= maxI64Value;\n}\n\n/**\n * Timestamp values returned from the RPC API conform to the type {@link UnixTimestamp}. You can use\n * a value of that type wherever a timestamp is expected.\n *\n * @example\n * From time to time you might acquire a number that you expect to be a timestamp, from an untrusted\n * network API or user input. To assert that such an arbitrary number is usable as a Unix timestamp,\n * use this function.\n *\n * ```ts\n * import { assertIsUnixTimestamp } from '@solana/rpc-types';\n *\n * // Imagine having received a value that you presume represents a timestamp.\n * // At this point we know only that it conforms to the `bigint` type.\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `timestamp` to `UnixTimestamp`.\n * assertIsUnixTimestamp(timestamp);\n * // At this point, `timestamp` is a `UnixTimestamp`.\n * timestamp satisfies UnixTimestamp;\n * } catch (e) {\n * // `timestamp` turned out not to be a valid Unix timestamp\n * }\n * ```\n */\nexport function assertIsUnixTimestamp(putativeTimestamp: bigint): asserts putativeTimestamp is UnixTimestamp {\n if (putativeTimestamp < minI64Value || putativeTimestamp > maxI64Value) {\n throw new SolanaError(SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, {\n value: putativeTimestamp,\n });\n }\n}\n\n/**\n * This helper combines _asserting_ that a `bigint` represents a Unix timestamp with _coercing_ it\n * to the {@link UnixTimestamp} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { unixTimestamp } from '@solana/rpc-types';\n *\n * const timestamp = unixTimestamp(-42n); // Wednesday, December 31, 1969 3:59:18 PM GMT-08:00\n * ```\n */\nexport function unixTimestamp(putativeTimestamp: bigint): UnixTimestamp {\n assertIsUnixTimestamp(putativeTimestamp);\n return putativeTimestamp;\n}\n","import { SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME, SolanaError } from '@solana/errors';\nimport { type Blockhash, isBlockhash } from '@solana/rpc-types';\n\nimport { ExcludeTransactionMessageLifetime, TransactionMessageWithLifetime } from './lifetime';\nimport { TransactionMessage } from './transaction-message';\n\n/**\n * A constraint which, when applied to a transaction message, makes that transaction message\n * eligible to land on the network. The transaction message will continue to be eligible to land\n * until the network considers the `blockhash` to be expired.\n *\n * This can happen when the network proceeds past the `lastValidBlockHeight` for which the blockhash\n * is considered valid, or when the network switches to a fork where that blockhash is not present.\n */\nexport type BlockhashLifetimeConstraint = Readonly<{\n /**\n * A recent blockhash observed by the transaction proposer.\n *\n * The transaction message will be considered eligible to land until the network determines this\n * blockhash to be too old, or has switched to a fork where it is not present.\n */\n blockhash: Blockhash;\n /**\n * This is the block height beyond which the network will consider the blockhash to be too old\n * to make a transaction message eligible to land.\n */\n lastValidBlockHeight: bigint;\n}>;\n\n/**\n * Represents a transaction message whose lifetime is defined by the age of the blockhash it\n * includes.\n *\n * Such a transaction can only be landed on the network if the current block height of the network\n * is less than or equal to the value of\n * `TransactionMessageWithBlockhashLifetime['lifetimeConstraint']['lastValidBlockHeight']`.\n */\nexport interface TransactionMessageWithBlockhashLifetime {\n readonly lifetimeConstraint: BlockhashLifetimeConstraint;\n}\n\n/**\n * A type guard that returns `true` if the transaction message conforms to the\n * {@link TransactionMessageWithBlockhashLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionMessageWithBlockhashLifetime } from '@solana/transaction-messages';\n *\n * if (isTransactionMessageWithBlockhashLifetime(message)) {\n * // At this point, `message` has been refined to a `TransactionMessageWithBlockhashLifetime`.\n * const { blockhash } = message.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * setBlockhashIsValid(blockhashIsValid);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a blockhash-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionMessageWithBlockhashLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithBlockhashLifetime),\n): transactionMessage is TransactionMessage & TransactionMessageWithBlockhashLifetime {\n return (\n 'lifetimeConstraint' in transactionMessage &&\n typeof transactionMessage.lifetimeConstraint.blockhash === 'string' &&\n typeof transactionMessage.lifetimeConstraint.lastValidBlockHeight === 'bigint' &&\n isBlockhash(transactionMessage.lifetimeConstraint.blockhash)\n );\n}\n\n/**\n * From time to time you might acquire a transaction message, that you expect to have a\n * blockhash-based lifetime, from an untrusted network API or user input. Use this function to\n * assert that such a transaction message actually has a blockhash-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionMessageWithBlockhashLifetime } from '@solana/transaction-messages';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `message` to `TransactionMessageWithBlockhashLifetime`.\n * assertIsTransactionMessageWithBlockhashLifetime(message);\n * // At this point, `message` is a `TransactionMessageWithBlockhashLifetime` that can be used\n * // with the RPC.\n * const { blockhash } = message.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * } catch (e) {\n * // `message` turned out not to have a blockhash-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionMessageWithBlockhashLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithBlockhashLifetime),\n): asserts transactionMessage is TransactionMessage & TransactionMessageWithBlockhashLifetime {\n if (!isTransactionMessageWithBlockhashLifetime(transactionMessage)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME);\n }\n}\n\n/**\n * Given a blockhash and the last block height at which that blockhash is considered usable to land\n * transactions, this method will return a new transaction message having the same type as the one\n * supplied plus the `TransactionMessageWithBlockhashLifetime` type.\n *\n * @example\n * ```ts\n * import { setTransactionMessageLifetimeUsingBlockhash } from '@solana/transaction-messages';\n *\n * const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();\n * const txMessageWithBlockhashLifetime = setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, txMessage);\n * ```\n */\nexport function setTransactionMessageLifetimeUsingBlockhash<\n TTransactionMessage extends Partial & TransactionMessage,\n>(\n blockhashLifetimeConstraint: BlockhashLifetimeConstraint,\n transactionMessage: TTransactionMessage,\n): ExcludeTransactionMessageLifetime & TransactionMessageWithBlockhashLifetime {\n type ReturnType = ExcludeTransactionMessageLifetime & TransactionMessageWithBlockhashLifetime;\n\n if (\n 'lifetimeConstraint' in transactionMessage &&\n transactionMessage.lifetimeConstraint &&\n 'blockhash' in transactionMessage.lifetimeConstraint &&\n transactionMessage.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash &&\n transactionMessage.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight\n ) {\n return transactionMessage as ReturnType;\n }\n\n return Object.freeze({\n ...transactionMessage,\n lifetimeConstraint: Object.freeze(blockhashLifetimeConstraint),\n }) as ReturnType;\n}\n","import { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\n/**\n * Asserts that a given string contains only characters from the specified alphabet.\n *\n * This function validates whether a string consists exclusively of characters\n * from the provided `alphabet`. If the validation fails, it throws an error\n * indicating the invalid base string.\n *\n * @param alphabet - The allowed set of characters for the base encoding.\n * @param testValue - The string to validate against the given alphabet.\n * @param givenValue - The original string provided by the user (defaults to `testValue`).\n *\n * @throws {SolanaError} If `testValue` contains characters not present in `alphabet`.\n *\n * @example\n * Validating a base-8 encoded string.\n * ```ts\n * assertValidBaseString('01234567', '123047'); // Passes\n * assertValidBaseString('01234567', '128'); // Throws error\n * ```\n */\nexport function assertValidBaseString(alphabet: string, testValue: string, givenValue = testValue) {\n if (!testValue.match(new RegExp(`^[${alphabet}]*$`))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: alphabet.length,\n value: givenValue,\n });\n }\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidBaseString } from './assertions';\n\n/**\n * Returns an encoder for base-X encoded strings.\n *\n * This encoder serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process involves converting the input string to a numeric value in base-X, then\n * encoding that value into bytes while preserving leading zeroes.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeEncoder` for encoding base-X strings.\n *\n * @example\n * Encoding a base-X string using a custom alphabet.\n * ```ts\n * const encoder = getBaseXEncoder('0123456789abcdef');\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXEncoder = (alphabet: string): VariableSizeEncoder => {\n return createEncoder({\n getSizeFromValue: (value: string): number => {\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) return value.length;\n\n const base10Number = getBigIntFromBaseX(tailChars, alphabet);\n return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2);\n },\n write(value: string, bytes, offset) {\n // Check if the value is valid.\n assertValidBaseString(alphabet, value);\n if (value === '') return offset;\n\n // Handle leading zeroes.\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) {\n bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset);\n return offset + leadingZeroes.length;\n }\n\n // From baseX to base10.\n let base10Number = getBigIntFromBaseX(tailChars, alphabet);\n\n // From base10 to bytes.\n const tailBytes: number[] = [];\n while (base10Number > 0n) {\n tailBytes.unshift(Number(base10Number % 256n));\n base10Number /= 256n;\n }\n\n const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes];\n bytes.set(bytesToAdd, offset);\n return offset + bytesToAdd.length;\n },\n });\n};\n\n/**\n * Returns a decoder for base-X encoded strings.\n *\n * This decoder deserializes base-X encoded strings from a byte array using a custom alphabet.\n * The decoding process converts the byte array into a numeric value in base-10, then\n * maps that value back to characters in the specified base-X alphabet.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeDecoder` for decoding base-X strings.\n *\n * @example\n * Decoding a base-X string using a custom alphabet.\n * ```ts\n * const decoder = getBaseXDecoder('0123456789abcdef');\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXDecoder = (alphabet: string): VariableSizeDecoder => {\n return createDecoder({\n read(rawBytes, offset): [string, number] {\n const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);\n if (bytes.length === 0) return ['', 0];\n\n // Handle leading zeroes.\n let trailIndex = bytes.findIndex(n => n !== 0);\n trailIndex = trailIndex === -1 ? bytes.length : trailIndex;\n const leadingZeroes = alphabet[0].repeat(trailIndex);\n if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length];\n\n // From bytes to base10.\n const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);\n\n // From base10 to baseX.\n const tailChars = getBaseXFromBigInt(base10Number, alphabet);\n\n return [leadingZeroes + tailChars, rawBytes.length];\n },\n });\n};\n\n/**\n * Returns a codec for encoding and decoding base-X strings.\n *\n * This codec serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process converts the input string into a numeric value in base-X, which is then encoded as bytes.\n * The decoding process reverses this transformation to reconstruct the original string.\n *\n * This codec supports leading zeroes by treating the first character of the alphabet as the zero character.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeCodec` for encoding and decoding base-X strings.\n *\n * @example\n * Encoding and decoding a base-X string using a custom alphabet.\n * ```ts\n * const codec = getBaseXCodec('0123456789abcdef');\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-X codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBaseXCodec('0123456789abcdef'), 8);\n * ```\n *\n * If you need a size-prefixed base-X codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBaseXCodec('0123456789abcdef'), getU32Codec());\n * ```\n *\n * Separate {@link getBaseXEncoder} and {@link getBaseXDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBaseXEncoder('0123456789abcdef').encode('deadface');\n * const value = getBaseXDecoder('0123456789abcdef').decode(bytes);\n * ```\n *\n * @see {@link getBaseXEncoder}\n * @see {@link getBaseXDecoder}\n */\nexport const getBaseXCodec = (alphabet: string): VariableSizeCodec =>\n combineCodec(getBaseXEncoder(alphabet), getBaseXDecoder(alphabet));\n\nfunction partitionLeadingZeroes(\n value: string,\n zeroCharacter: string,\n): [leadingZeros: string, tailChars: string | undefined] {\n const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`));\n return [leadingZeros, tailChars];\n}\n\nfunction getBigIntFromBaseX(value: string, alphabet: string): bigint {\n const base = BigInt(alphabet.length);\n let sum = 0n;\n for (const char of value) {\n sum *= base;\n sum += BigInt(alphabet.indexOf(char));\n }\n return sum;\n}\n\nfunction getBaseXFromBigInt(value: bigint, alphabet: string): string {\n const base = BigInt(alphabet.length);\n const tailChars = [];\n while (value > 0n) {\n tailChars.unshift(alphabet[Number(value % base)]);\n value /= base;\n }\n return tailChars.join('');\n}\n","import { getBaseXCodec, getBaseXDecoder, getBaseXEncoder } from './baseX';\n\nconst alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Returns an encoder for base-58 strings.\n *\n * This encoder serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-58 strings.\n *\n * @example\n * Encoding a base-58 string.\n * ```ts\n * const encoder = getBase58Encoder();\n * const bytes = encoder.encode('heLLo'); // 0x1b6a3070\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Encoder = () => getBaseXEncoder(alphabet);\n\n/**\n * Returns a decoder for base-58 strings.\n *\n * This decoder deserializes base-58 encoded strings from a byte array.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-58 strings.\n *\n * @example\n * Decoding a base-58 string.\n * ```ts\n * const decoder = getBase58Decoder();\n * const value = decoder.decode(new Uint8Array([0x1b, 0x6a, 0x30, 0x70])); // \"heLLo\"\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Decoder = () => getBaseXDecoder(alphabet);\n\n/**\n * Returns a codec for encoding and decoding base-58 strings.\n *\n * This codec serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-58 strings.\n *\n * @example\n * Encoding and decoding a base-58 string.\n * ```ts\n * const codec = getBase58Codec();\n * const bytes = codec.encode('heLLo'); // 0x1b6a3070\n * const value = codec.decode(bytes); // \"heLLo\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-58 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase58Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-58 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase58Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase58Encoder} and {@link getBase58Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase58Encoder().encode('heLLo');\n * const value = getBase58Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase58Encoder}\n * @see {@link getBase58Decoder}\n */\nexport const getBase58Codec = () => getBaseXCodec(alphabet);\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n type Encoder,\n type VariableSizeCodec,\n type VariableSizeDecoder,\n type VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getArrayDecoder, getArrayEncoder, getStructDecoder, getStructEncoder } from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getShortU16Encoder, getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\n\nimport type { getCompiledAddressTableLookups } from '../compile/address-table-lookups';\n\ntype AddressTableLookup = ReturnType[number];\n\nlet memoizedAddressTableLookupEncoder: VariableSizeEncoder | undefined;\nexport function getAddressTableLookupEncoder(): VariableSizeEncoder {\n if (!memoizedAddressTableLookupEncoder) {\n const indexEncoder = getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() }) as Encoder<\n readonly number[]\n >;\n memoizedAddressTableLookupEncoder = getStructEncoder([\n ['lookupTableAddress', getAddressEncoder()],\n ['writableIndexes', indexEncoder],\n ['readonlyIndexes', indexEncoder],\n ]);\n }\n\n return memoizedAddressTableLookupEncoder;\n}\n\nlet memoizedAddressTableLookupDecoder: VariableSizeDecoder | undefined;\nexport function getAddressTableLookupDecoder(): VariableSizeDecoder {\n if (!memoizedAddressTableLookupDecoder) {\n const indexEncoder = getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() });\n memoizedAddressTableLookupDecoder = getStructDecoder([\n ['lookupTableAddress', getAddressDecoder()],\n ['writableIndexes', indexEncoder],\n ['readonlyIndexes', indexEncoder],\n ]);\n }\n\n return memoizedAddressTableLookupDecoder;\n}\n\nexport function getAddressTableLookupCodec(): VariableSizeCodec {\n return combineCodec(getAddressTableLookupEncoder(), getAddressTableLookupDecoder());\n}\n","import { FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\nimport { getStructCodec, getStructDecoder, getStructEncoder } from '@solana/codecs-data-structures';\nimport { getU8Codec, getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\n\nimport { getCompiledMessageHeader } from '../compile/header';\n\ntype MessageHeader = ReturnType;\n\nlet memoizedU8Encoder: FixedSizeEncoder | undefined;\nfunction getMemoizedU8Encoder(): FixedSizeEncoder {\n if (!memoizedU8Encoder) memoizedU8Encoder = getU8Encoder();\n return memoizedU8Encoder;\n}\n\nlet memoizedU8Decoder: FixedSizeDecoder | undefined;\nfunction getMemoizedU8Decoder(): FixedSizeDecoder {\n if (!memoizedU8Decoder) memoizedU8Decoder = getU8Decoder();\n return memoizedU8Decoder;\n}\n\nlet memoizedU8Codec: FixedSizeCodec | undefined;\nfunction getMemoizedU8Codec(): FixedSizeCodec {\n if (!memoizedU8Codec) memoizedU8Codec = getU8Codec();\n return memoizedU8Codec;\n}\n\nexport function getMessageHeaderEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['numSignerAccounts', getMemoizedU8Encoder()],\n ['numReadonlySignerAccounts', getMemoizedU8Encoder()],\n ['numReadonlyNonSignerAccounts', getMemoizedU8Encoder()],\n ]) as FixedSizeEncoder;\n}\n\nexport function getMessageHeaderDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['numSignerAccounts', getMemoizedU8Decoder()],\n ['numReadonlySignerAccounts', getMemoizedU8Decoder()],\n ['numReadonlyNonSignerAccounts', getMemoizedU8Decoder()],\n ]) as FixedSizeDecoder;\n}\n\nexport function getMessageHeaderCodec(): FixedSizeCodec {\n return getStructCodec([\n ['numSignerAccounts', getMemoizedU8Codec()],\n ['numReadonlySignerAccounts', getMemoizedU8Codec()],\n ['numReadonlyNonSignerAccounts', getMemoizedU8Codec()],\n ]) as FixedSizeCodec;\n}\n","import {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getArrayEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n} from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getShortU16Encoder, getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\n\nimport { getCompiledInstructions } from '../compile/instructions';\n\ntype Instruction = ReturnType[number];\n\nlet memoizedGetInstructionEncoder: VariableSizeEncoder | undefined;\nexport function getInstructionEncoder(): VariableSizeEncoder {\n if (!memoizedGetInstructionEncoder) {\n memoizedGetInstructionEncoder = transformEncoder, Instruction>(\n getStructEncoder([\n ['programAddressIndex', getU8Encoder()],\n ['accountIndices', getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() })],\n ['data', addEncoderSizePrefix(getBytesEncoder(), getShortU16Encoder())],\n ]),\n // Convert an instruction to have all fields defined\n (instruction: Instruction): Required => {\n if (instruction.accountIndices !== undefined && instruction.data !== undefined) {\n return instruction as Required;\n }\n return {\n ...instruction,\n accountIndices: instruction.accountIndices ?? [],\n data: instruction.data ?? new Uint8Array(0),\n } as Required;\n },\n );\n }\n\n return memoizedGetInstructionEncoder;\n}\n\nlet memoizedGetInstructionDecoder: VariableSizeDecoder | undefined;\nexport function getInstructionDecoder(): VariableSizeDecoder {\n if (!memoizedGetInstructionDecoder) {\n memoizedGetInstructionDecoder = transformDecoder, Instruction>(\n getStructDecoder([\n ['programAddressIndex', getU8Decoder()],\n ['accountIndices', getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() })],\n [\n 'data',\n addDecoderSizePrefix(getBytesDecoder(), getShortU16Decoder()) as VariableSizeDecoder,\n ],\n ]),\n // Convert an instruction to exclude optional fields if they are empty\n (instruction: Required): Instruction => {\n if (instruction.accountIndices.length && instruction.data.byteLength) {\n return instruction;\n }\n const { accountIndices, data, ...rest } = instruction;\n return {\n ...rest,\n ...(accountIndices.length ? { accountIndices } : null),\n ...(data.byteLength ? { data } : null),\n };\n },\n );\n }\n return memoizedGetInstructionDecoder;\n}\n\nexport function getInstructionCodec(): VariableSizeCodec {\n return combineCodec(getInstructionEncoder(), getInstructionDecoder());\n}\n","import { AccountMeta, Instruction } from '@solana/instructions';\n\n/**\n * @deprecated Use `TransactionMessage` instead.\n */\n// TODO(#1147) Stop exporting this in a future major version.\nexport type BaseTransactionMessage<\n TVersion extends TransactionVersion = TransactionVersion,\n TInstruction extends Instruction = Instruction,\n> = Readonly<{\n instructions: readonly TInstruction[];\n version: TVersion;\n}>;\n\nexport const MAX_SUPPORTED_TRANSACTION_VERSION = 0;\n\ntype LegacyInstruction = Instruction;\ntype LegacyTransactionMessage = BaseTransactionMessage<'legacy', LegacyInstruction>;\ntype V0TransactionMessage = BaseTransactionMessage<0, Instruction>;\n\nexport type TransactionMessage = LegacyTransactionMessage | V0TransactionMessage;\nexport type TransactionVersion = 'legacy' | 0;\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\nimport { MAX_SUPPORTED_TRANSACTION_VERSION, TransactionVersion } from '../transaction-message';\n\nconst VERSION_FLAG_MASK = 0x80;\n\n/**\n * Returns an encoder that you can use to encode a {@link TransactionVersion} to a byte array.\n *\n * Legacy messages will produce an empty array and will not advance the offset. Versioned messages\n * will produce an array with a single byte.\n */\nexport function getTransactionVersionEncoder(): VariableSizeEncoder {\n return createEncoder({\n getSizeFromValue: value => (value === 'legacy' ? 0 : 1),\n maxSize: 1,\n write: (value, bytes, offset) => {\n if (value === 'legacy') {\n return offset;\n }\n if (value < 0 || value > 127) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, {\n actualVersion: value,\n });\n }\n\n if (value > MAX_SUPPORTED_TRANSACTION_VERSION) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: value,\n });\n }\n bytes.set([value | VERSION_FLAG_MASK], offset);\n return offset + 1;\n },\n });\n}\n\n/**\n * Returns a decoder that you can use to decode a byte array representing a\n * {@link TransactionVersion}.\n *\n * When the byte at the current offset is determined to represent a legacy transaction, this decoder\n * will return `'legacy'` and will not advance the offset.\n */\nexport function getTransactionVersionDecoder(): VariableSizeDecoder {\n return createDecoder({\n maxSize: 1,\n read: (bytes, offset) => {\n const firstByte = bytes[offset];\n if ((firstByte & VERSION_FLAG_MASK) === 0) {\n // No version flag set; it's a legacy (unversioned) transaction.\n return ['legacy', offset];\n } else {\n const version = firstByte ^ VERSION_FLAG_MASK;\n if (version > MAX_SUPPORTED_TRANSACTION_VERSION) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version,\n });\n }\n return [version as TransactionVersion, offset + 1];\n }\n },\n });\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to {@link TransactionVersion}\n *\n * @see {@link getTransactionVersionDecoder}\n * @see {@link getTransactionVersionEncoder}\n */\nexport function getTransactionVersionCodec(): VariableSizeCodec {\n return combineCodec(getTransactionVersionEncoder(), getTransactionVersionDecoder());\n}\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n createEncoder,\n Decoder,\n fixDecoderSize,\n fixEncoderSize,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getArrayEncoder,\n getConstantEncoder,\n getStructDecoder,\n getStructEncoder,\n getUnionEncoder,\n} from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getShortU16Encoder } from '@solana/codecs-numbers';\nimport { getBase58Decoder, getBase58Encoder } from '@solana/codecs-strings';\n\nimport { getCompiledAddressTableLookups } from '../compile/address-table-lookups';\nimport { CompiledTransactionMessage, CompiledTransactionMessageWithLifetime } from '../compile/message';\nimport { getAddressTableLookupDecoder, getAddressTableLookupEncoder } from './address-table-lookup';\nimport { getMessageHeaderDecoder, getMessageHeaderEncoder } from './header';\nimport { getInstructionDecoder, getInstructionEncoder } from './instruction';\nimport { getTransactionVersionDecoder, getTransactionVersionEncoder } from './transaction-version';\n\nfunction getCompiledMessageLegacyEncoder(): VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n> {\n return getStructEncoder(getPreludeStructEncoderTuple()) as VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n >;\n}\n\nfunction getCompiledMessageVersionedEncoder(): VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n> {\n return transformEncoder(\n getStructEncoder([\n ...getPreludeStructEncoderTuple(),\n ['addressTableLookups', getAddressTableLookupArrayEncoder()],\n ]) as VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n >,\n value => {\n if (value.version === 'legacy') {\n return value;\n }\n return {\n ...value,\n addressTableLookups: value.addressTableLookups ?? [],\n };\n },\n );\n}\n\nfunction getPreludeStructEncoderTuple() {\n const lifetimeTokenEncoder = getUnionEncoder(\n [\n // Use a 32-byte constant encoder for a missing lifetime token (index 0).\n getConstantEncoder(new Uint8Array(32)),\n // Use a 32-byte base58 encoder for a valid lifetime token (index 1).\n fixEncoderSize(getBase58Encoder(), 32),\n ],\n value => (value === undefined ? 0 : 1),\n );\n\n return [\n ['version', getTransactionVersionEncoder()],\n ['header', getMessageHeaderEncoder()],\n ['staticAccounts', getArrayEncoder(getAddressEncoder(), { size: getShortU16Encoder() })],\n ['lifetimeToken', lifetimeTokenEncoder],\n ['instructions', getArrayEncoder(getInstructionEncoder(), { size: getShortU16Encoder() })],\n ] as const;\n}\n\nfunction getPreludeStructDecoderTuple() {\n return [\n ['version', getTransactionVersionDecoder() as Decoder],\n ['header', getMessageHeaderDecoder()],\n ['staticAccounts', getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() })],\n ['lifetimeToken', fixDecoderSize(getBase58Decoder(), 32)],\n ['instructions', getArrayDecoder(getInstructionDecoder(), { size: getShortU16Decoder() })],\n ['addressTableLookups', getAddressTableLookupArrayDecoder()],\n ] as const;\n}\n\nfunction getAddressTableLookupArrayEncoder() {\n return getArrayEncoder(getAddressTableLookupEncoder(), { size: getShortU16Encoder() });\n}\n\nfunction getAddressTableLookupArrayDecoder() {\n return getArrayDecoder(getAddressTableLookupDecoder(), { size: getShortU16Decoder() });\n}\n\n/**\n * Returns an encoder that you can use to encode a {@link CompiledTransactionMessage} to a byte\n * array.\n *\n * The wire format of a Solana transaction consists of signatures followed by a compiled transaction\n * message. The byte array produced by this encoder is the message part.\n */\nexport function getCompiledTransactionMessageEncoder(): VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n> {\n return createEncoder({\n getSizeFromValue: compiledMessage => {\n if (compiledMessage.version === 'legacy') {\n return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage);\n } else {\n return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage);\n }\n },\n write: (compiledMessage, bytes, offset) => {\n if (compiledMessage.version === 'legacy') {\n return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset);\n } else {\n return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset);\n }\n },\n });\n}\n\n/**\n * Returns a decoder that you can use to decode a byte array representing a\n * {@link CompiledTransactionMessage}.\n *\n * The wire format of a Solana transaction consists of signatures followed by a compiled transaction\n * message. You can use this decoder to decode the message part.\n */\nexport function getCompiledTransactionMessageDecoder(): VariableSizeDecoder<\n CompiledTransactionMessage & CompiledTransactionMessageWithLifetime\n> {\n return transformDecoder(\n getStructDecoder(getPreludeStructDecoderTuple()) as VariableSizeDecoder<\n CompiledTransactionMessage &\n CompiledTransactionMessageWithLifetime & {\n addressTableLookups?: ReturnType;\n }\n >,\n ({ addressTableLookups, ...restOfMessage }) => {\n if (restOfMessage.version === 'legacy' || !addressTableLookups?.length) {\n return restOfMessage;\n }\n return { ...restOfMessage, addressTableLookups };\n },\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to {@link CompiledTransactionMessage}\n *\n * @see {@link getCompiledTransactionMessageDecoder}\n * @see {@link getCompiledTransactionMessageEncoder}\n */\nexport function getCompiledTransactionMessageCodec(): VariableSizeCodec<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime),\n CompiledTransactionMessage & CompiledTransactionMessageWithLifetime\n> {\n return combineCodec(getCompiledTransactionMessageEncoder(), getCompiledTransactionMessageDecoder());\n}\n","import { Address, getAddressComparator } from '@solana/addresses';\nimport {\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n SolanaError,\n} from '@solana/errors';\nimport {\n AccountLookupMeta,\n AccountMeta,\n AccountRole,\n Instruction,\n isSignerRole,\n isWritableRole,\n mergeRoles,\n ReadonlyAccount,\n ReadonlyAccountLookup,\n ReadonlySignerAccount,\n WritableAccount,\n WritableAccountLookup,\n WritableSignerAccount,\n} from '@solana/instructions';\nimport { Brand } from '@solana/nominal-types';\n\nexport const enum AddressMapEntryType {\n FEE_PAYER,\n LOOKUP_TABLE,\n STATIC,\n}\n\ntype AddressMap = {\n [address: string]: FeePayerAccountEntry | LookupTableAccountEntry | StaticAccountEntry;\n};\ntype FeePayerAccountEntry = Omit & {\n [TYPE]: AddressMapEntryType.FEE_PAYER;\n};\ntype LookupTableAccountEntry = Omit & {\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE;\n};\nexport type OrderedAccounts = Brand<(AccountLookupMeta | AccountMeta)[], 'OrderedAccounts'>;\ntype StaticAccountEntry = Omit<\n ReadonlyAccount | ReadonlySignerAccount | WritableAccount | WritableSignerAccount,\n 'address'\n> & { [TYPE]: AddressMapEntryType.STATIC };\n\nfunction upsert(\n addressMap: AddressMap,\n address: Address,\n update: (\n entry: FeePayerAccountEntry | LookupTableAccountEntry | Record | StaticAccountEntry,\n ) => AddressMap[Address],\n) {\n addressMap[address] = update(addressMap[address] ?? { role: AccountRole.READONLY });\n}\n\nconst TYPE = Symbol('AddressMapTypeProperty');\nexport const ADDRESS_MAP_TYPE_PROPERTY: typeof TYPE = TYPE;\n\nexport function getAddressMapFromInstructions(feePayer: Address, instructions: readonly Instruction[]): AddressMap {\n const addressMap: AddressMap = {\n [feePayer]: { [TYPE]: AddressMapEntryType.FEE_PAYER, role: AccountRole.WRITABLE_SIGNER },\n };\n const addressesOfInvokedPrograms = new Set
();\n for (const instruction of instructions) {\n upsert(addressMap, instruction.programAddress, entry => {\n addressesOfInvokedPrograms.add(instruction.programAddress);\n if (TYPE in entry) {\n if (isWritableRole(entry.role)) {\n switch (entry[TYPE]) {\n case AddressMapEntryType.FEE_PAYER:\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, {\n programAddress: instruction.programAddress,\n });\n default:\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, {\n programAddress: instruction.programAddress,\n });\n }\n }\n if (entry[TYPE] === AddressMapEntryType.STATIC) {\n return entry;\n }\n }\n return { [TYPE]: AddressMapEntryType.STATIC, role: AccountRole.READONLY };\n });\n let addressComparator: ReturnType;\n if (!instruction.accounts) {\n continue;\n }\n for (const account of instruction.accounts) {\n upsert(addressMap, account.address, entry => {\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n address: _,\n ...accountMeta\n } = account;\n if (TYPE in entry) {\n switch (entry[TYPE]) {\n case AddressMapEntryType.FEE_PAYER:\n // The fee payer already has the highest rank -- it is by definition\n // writable-signer. Return it, no matter how `account` is configured\n return entry;\n case AddressMapEntryType.LOOKUP_TABLE: {\n const nextRole = mergeRoles(entry.role, accountMeta.role);\n if ('lookupTableAddress' in accountMeta) {\n const shouldReplaceEntry =\n // Consider using the new LOOKUP_TABLE if its address is different...\n entry.lookupTableAddress !== accountMeta.lookupTableAddress &&\n // ...and sorts before the existing one.\n (addressComparator ||= getAddressComparator())(\n accountMeta.lookupTableAddress,\n entry.lookupTableAddress,\n ) < 0;\n if (shouldReplaceEntry) {\n return {\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE,\n ...accountMeta,\n role: nextRole,\n } as LookupTableAccountEntry;\n }\n } else if (isSignerRole(accountMeta.role)) {\n // Upgrade this LOOKUP_TABLE entry to a static entry if it must sign.\n return {\n [TYPE]: AddressMapEntryType.STATIC,\n role: nextRole,\n } as StaticAccountEntry;\n }\n if (entry.role !== nextRole) {\n return {\n ...entry,\n role: nextRole,\n } as LookupTableAccountEntry;\n } else {\n return entry;\n }\n }\n case AddressMapEntryType.STATIC: {\n const nextRole = mergeRoles(entry.role, accountMeta.role);\n if (\n // Check to see if this address represents a program that is invoked\n // in this transaction.\n addressesOfInvokedPrograms.has(account.address)\n ) {\n if (isWritableRole(accountMeta.role)) {\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n {\n programAddress: account.address,\n },\n );\n }\n if (entry.role !== nextRole) {\n return {\n ...entry,\n role: nextRole,\n } as StaticAccountEntry;\n } else {\n return entry;\n }\n } else if (\n 'lookupTableAddress' in accountMeta &&\n // Static accounts can be 'upgraded' to lookup table accounts as\n // long as they are not require to sign the transaction.\n !isSignerRole(entry.role)\n ) {\n return {\n ...accountMeta,\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE,\n role: nextRole,\n } as LookupTableAccountEntry;\n } else {\n if (entry.role !== nextRole) {\n // The account's role ranks higher than the current entry's.\n return {\n ...entry,\n role: nextRole,\n } as StaticAccountEntry;\n } else {\n return entry;\n }\n }\n }\n }\n }\n if ('lookupTableAddress' in accountMeta) {\n return {\n ...accountMeta,\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE,\n };\n } else {\n return {\n ...accountMeta,\n [TYPE]: AddressMapEntryType.STATIC,\n };\n }\n });\n }\n }\n return addressMap;\n}\n\nexport function getOrderedAccountsFromAddressMap(addressMap: AddressMap): OrderedAccounts {\n let addressComparator: ReturnType;\n const orderedAccounts: (AccountLookupMeta | AccountMeta)[] = Object.entries(addressMap)\n .sort(([leftAddress, leftEntry], [rightAddress, rightEntry]) => {\n // STEP 1: Rapid precedence check. Fee payer, then static addresses, then lookups.\n if (leftEntry[TYPE] !== rightEntry[TYPE]) {\n if (leftEntry[TYPE] === AddressMapEntryType.FEE_PAYER) {\n return -1;\n } else if (rightEntry[TYPE] === AddressMapEntryType.FEE_PAYER) {\n return 1;\n } else if (leftEntry[TYPE] === AddressMapEntryType.STATIC) {\n return -1;\n } else if (rightEntry[TYPE] === AddressMapEntryType.STATIC) {\n return 1;\n }\n }\n // STEP 2: Sort by signer-writability.\n const leftIsSigner = isSignerRole(leftEntry.role);\n if (leftIsSigner !== isSignerRole(rightEntry.role)) {\n return leftIsSigner ? -1 : 1;\n }\n const leftIsWritable = isWritableRole(leftEntry.role);\n if (leftIsWritable !== isWritableRole(rightEntry.role)) {\n return leftIsWritable ? -1 : 1;\n }\n // STEP 3: Sort by address.\n addressComparator ||= getAddressComparator();\n if (\n leftEntry[TYPE] === AddressMapEntryType.LOOKUP_TABLE &&\n rightEntry[TYPE] === AddressMapEntryType.LOOKUP_TABLE &&\n leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress\n ) {\n return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress);\n } else {\n return addressComparator(leftAddress, rightAddress);\n }\n })\n .map(([address, addressMeta]) => ({\n address: address as Address,\n ...addressMeta,\n }));\n return orderedAccounts as unknown as OrderedAccounts;\n}\n","import { Address, getAddressComparator } from '@solana/addresses';\nimport { AccountRole } from '@solana/instructions';\n\nimport { OrderedAccounts } from '../compile/accounts';\n\ntype AddressTableLookup = Readonly<{\n /** The address of the address lookup table account. */\n lookupTableAddress: Address;\n /** Indexes of accounts in a lookup table to load as read-only. */\n readonlyIndexes: readonly number[];\n /** Indexes of accounts in a lookup table to load as writable. */\n writableIndexes: readonly number[];\n}>;\n\nexport function getCompiledAddressTableLookups(orderedAccounts: OrderedAccounts): AddressTableLookup[] {\n const index: Record<\n Address,\n Readonly<{\n [K in keyof Omit]: number[];\n }>\n > = {};\n for (const account of orderedAccounts) {\n if (!('lookupTableAddress' in account)) {\n continue;\n }\n const entry = (index[account.lookupTableAddress] ||= {\n readonlyIndexes: [],\n writableIndexes: [],\n });\n if (account.role === AccountRole.WRITABLE) {\n entry.writableIndexes.push(account.addressIndex);\n } else {\n entry.readonlyIndexes.push(account.addressIndex);\n }\n }\n return Object.keys(index)\n .sort(getAddressComparator())\n .map(lookupTableAddress => ({\n lookupTableAddress: lookupTableAddress as Address,\n ...index[lookupTableAddress as unknown as Address],\n }));\n}\n","import { isSignerRole, isWritableRole } from '@solana/instructions';\n\nimport { OrderedAccounts } from '../compile/accounts';\n\ntype MessageHeader = Readonly<{\n /**\n * The number of accounts in the static accounts list that are neither writable nor\n * signers.\n *\n * Adding this number to `numSignerAccounts` yields the index of the first read-only non-signer\n * account in the static accounts list.\n */\n numReadonlyNonSignerAccounts: number;\n /**\n * The number of read-only accounts in the static accounts list that must sign this\n * transaction.\n *\n * Subtracting this number from `numSignerAccounts` yields the index of the first read-only\n * signer account in the static accounts list.\n */\n numReadonlySignerAccounts: number;\n /**\n * The number of accounts in the static accounts list that must sign this transaction.\n *\n * Subtracting `numReadonlySignerAccounts` from this number yields the number of\n * writable signer accounts in the static accounts list. Writable signer accounts always\n * begin at index zero in the static accounts list.\n *\n * This number itself is the index of the first non-signer account in the static\n * accounts list.\n */\n numSignerAccounts: number;\n}>;\n\nexport function getCompiledMessageHeader(orderedAccounts: OrderedAccounts): MessageHeader {\n let numReadonlyNonSignerAccounts = 0;\n let numReadonlySignerAccounts = 0;\n let numSignerAccounts = 0;\n for (const account of orderedAccounts) {\n if ('lookupTableAddress' in account) {\n break;\n }\n const accountIsWritable = isWritableRole(account.role);\n if (isSignerRole(account.role)) {\n numSignerAccounts++;\n if (!accountIsWritable) {\n numReadonlySignerAccounts++;\n }\n } else if (!accountIsWritable) {\n numReadonlyNonSignerAccounts++;\n }\n }\n return {\n numReadonlyNonSignerAccounts,\n numReadonlySignerAccounts,\n numSignerAccounts,\n };\n}\n","import { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { Instruction } from '@solana/instructions';\n\nimport { OrderedAccounts } from './accounts';\n\ntype CompiledInstruction = Readonly<{\n /**\n * An ordered list of indices that indicate which accounts in the transaction message's\n * accounts list are loaded by this instruction.\n */\n accountIndices?: number[];\n /** The input to the invoked program */\n data?: ReadonlyUint8Array;\n /**\n * The index of the address in the transaction message's accounts list associated with the\n * program to invoke.\n */\n programAddressIndex: number;\n}>;\n\nfunction getAccountIndex(orderedAccounts: OrderedAccounts) {\n const out: Record = {};\n for (const [index, account] of orderedAccounts.entries()) {\n out[account.address] = index;\n }\n return out;\n}\n\nexport function getCompiledInstructions(\n instructions: readonly Instruction[],\n orderedAccounts: OrderedAccounts,\n): CompiledInstruction[] {\n const accountIndex = getAccountIndex(orderedAccounts);\n return instructions.map(({ accounts, data, programAddress }) => {\n return {\n programAddressIndex: accountIndex[programAddress],\n ...(accounts ? { accountIndices: accounts.map(({ address }) => accountIndex[address]) } : null),\n ...(data ? { data } : null),\n };\n });\n}\n","import { TransactionMessageWithBlockhashLifetime, TransactionMessageWithDurableNonceLifetime } from '../index';\n\nexport function getCompiledLifetimeToken(\n lifetimeConstraint: (\n | TransactionMessageWithBlockhashLifetime\n | TransactionMessageWithDurableNonceLifetime\n )['lifetimeConstraint'],\n): string {\n if ('nonce' in lifetimeConstraint) {\n return lifetimeConstraint.nonce;\n }\n return lifetimeConstraint.blockhash;\n}\n","import { Address } from '@solana/addresses';\n\nimport { OrderedAccounts } from './accounts';\n\nexport function getCompiledStaticAccounts(orderedAccounts: OrderedAccounts): Address[] {\n const firstLookupTableAccountIndex = orderedAccounts.findIndex(account => 'lookupTableAddress' in account);\n const orderedStaticAccounts =\n firstLookupTableAccountIndex === -1 ? orderedAccounts : orderedAccounts.slice(0, firstLookupTableAccountIndex);\n return orderedStaticAccounts.map(({ address }) => address);\n}\n","import { TransactionMessageWithFeePayer } from '../fee-payer';\nimport { TransactionMessageWithLifetime } from '../lifetime';\nimport { BaseTransactionMessage } from '../transaction-message';\nimport { getAddressMapFromInstructions, getOrderedAccountsFromAddressMap } from './accounts';\nimport { getCompiledAddressTableLookups } from './address-table-lookups';\nimport { getCompiledMessageHeader } from './header';\nimport { getCompiledInstructions } from './instructions';\nimport { getCompiledLifetimeToken } from './lifetime-token';\nimport { getCompiledStaticAccounts } from './static-accounts';\n\ntype BaseCompiledTransactionMessage = Readonly<{\n /**\n * Information about the version of the transaction message and the role of the accounts it\n * loads.\n */\n header: ReturnType;\n instructions: ReturnType;\n /** A list of addresses indicating which accounts to load */\n staticAccounts: ReturnType;\n}>;\n\n/**\n * A transaction message in a form suitable for encoding for execution on the network.\n *\n * You can not fully reconstruct a source message from a compiled message without extra information.\n * In particular, supporting details about the lifetime constraint and the concrete addresses of\n * accounts sourced from account lookup tables are lost to compilation.\n */\nexport type CompiledTransactionMessage = LegacyCompiledTransactionMessage | VersionedCompiledTransactionMessage;\n\nexport type CompiledTransactionMessageWithLifetime = Readonly<{\n /**\n * 32 bytes of data observed by the transaction proposed that makes a transaction eligible to\n * land on the network.\n *\n * In the case of a transaction message with a nonce lifetime constraint, this will be the value\n * of the nonce itself. In all other cases this will be a recent blockhash.\n */\n lifetimeToken: ReturnType;\n}>;\n\ntype LegacyCompiledTransactionMessage = BaseCompiledTransactionMessage &\n Readonly<{\n version: 'legacy';\n }>;\n\ntype VersionedCompiledTransactionMessage = BaseCompiledTransactionMessage &\n Readonly<{\n /** A list of address tables and the accounts that this transaction loads from them */\n addressTableLookups?: ReturnType;\n version: 0;\n }>;\n\n/**\n * Converts the type of transaction message data structure that you create in your application to\n * the type of transaction message data structure that can be encoded for execution on the network.\n *\n * This is a lossy process; you can not fully reconstruct a source message from a compiled message\n * without extra information. In particular, supporting details about the lifetime constraint and\n * the concrete addresses of accounts sourced from account lookup tables will be lost to\n * compilation.\n *\n * @see {@link decompileTransactionMessage}\n */\nexport function compileTransactionMessage<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage): CompiledTransactionMessageFromTransactionMessage {\n type ReturnType = CompiledTransactionMessageFromTransactionMessage;\n\n const addressMap = getAddressMapFromInstructions(\n transactionMessage.feePayer.address,\n transactionMessage.instructions,\n );\n const orderedAccounts = getOrderedAccountsFromAddressMap(addressMap);\n const lifetimeConstraint = (transactionMessage as Partial).lifetimeConstraint;\n\n return {\n ...(transactionMessage.version !== 'legacy'\n ? { addressTableLookups: getCompiledAddressTableLookups(orderedAccounts) }\n : null),\n ...(lifetimeConstraint ? { lifetimeToken: getCompiledLifetimeToken(lifetimeConstraint) } : null),\n header: getCompiledMessageHeader(orderedAccounts),\n instructions: getCompiledInstructions(transactionMessage.instructions, orderedAccounts),\n staticAccounts: getCompiledStaticAccounts(orderedAccounts),\n version: transactionMessage.version,\n } as ReturnType;\n}\n\ntype CompiledTransactionMessageFromTransactionMessage =\n ForwardTransactionMessageLifetime, TTransactionMessage>;\n\ntype ForwardTransactionMessageVersion =\n TTransactionMessage extends Readonly<{ version: 'legacy' }>\n ? LegacyCompiledTransactionMessage\n : VersionedCompiledTransactionMessage;\n\ntype ForwardTransactionMessageLifetime<\n TCompiledTransactionMessage extends CompiledTransactionMessage,\n TTransactionMessage extends BaseTransactionMessage,\n> = TTransactionMessage extends TransactionMessageWithLifetime\n ? CompiledTransactionMessageWithLifetime & TCompiledTransactionMessage\n : TCompiledTransactionMessage;\n","import { Address } from '@solana/addresses';\nimport { AccountLookupMeta, AccountMeta, AccountRole, Instruction, isSignerRole } from '@solana/instructions';\n\nimport { AddressesByLookupTableAddress } from './addresses-by-lookup-table-address';\nimport { BaseTransactionMessage, TransactionMessage } from './transaction-message';\n\ntype Mutable = {\n -readonly [P in keyof T]: T[P];\n};\n\n// Look up the address in lookup tables, return a lookup meta if it is found in any of them\nfunction findAddressInLookupTables(\n address: Address,\n role: AccountRole.READONLY | AccountRole.WRITABLE,\n addressesByLookupTableAddress: AddressesByLookupTableAddress,\n): AccountLookupMeta | undefined {\n for (const [lookupTableAddress, addresses] of Object.entries(addressesByLookupTableAddress)) {\n for (let i = 0; i < addresses.length; i++) {\n if (address === addresses[i]) {\n return {\n address,\n addressIndex: i,\n lookupTableAddress: lookupTableAddress as Address,\n role,\n };\n }\n }\n }\n}\n\ntype TransactionMessageNotLegacy = Exclude;\n\n// Each account can be AccountLookupMeta | AccountMeta\ntype WidenInstructionAccounts =\n TInstruction extends Instruction\n ? Instruction<\n TProgramAddress,\n {\n [K in keyof TAccounts]: TAccounts[K] extends AccountMeta\n ? AccountLookupMeta | AccountMeta\n : TAccounts[K];\n }\n >\n : TInstruction;\n\ntype ExtractAdditionalProps = Omit;\n\ntype WidenTransactionMessageInstructions =\n TTransactionMessage extends BaseTransactionMessage\n ? BaseTransactionMessage> &\n ExtractAdditionalProps<\n TTransactionMessage,\n BaseTransactionMessage>\n >\n : TTransactionMessage;\n\n/**\n * Given a transaction message and a mapping of lookup tables to the addresses stored in them, this\n * function will return a new transaction message with the same instructions but with all non-signer\n * accounts that are found in the given lookup tables represented by an {@link AccountLookupMeta}\n * instead of an {@link AccountMeta}.\n *\n * This means that these accounts will take up less space in the compiled transaction message. This\n * size reduction is most significant when the transaction includes many accounts from the same\n * lookup table.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import {\n * AddressesByLookupTableAddress,\n * compressTransactionMessageUsingAddressLookupTables,\n * } from '@solana/transaction-messages';\n * import { fetchAddressLookupTable } from '@solana-program/address-lookup-table';\n *\n * const lookupTableAddress = address('4QwSwNriKPrz8DLW4ju5uxC2TN5cksJx6tPUPj7DGLAW');\n * const {\n * data: { addresses },\n * } = await fetchAddressLookupTable(rpc, lookupTableAddress);\n * const addressesByAddressLookupTable: AddressesByLookupTableAddress = {\n * [lookupTableAddress]: addresses,\n * };\n *\n * const compressedTransactionMessage = compressTransactionMessageUsingAddressLookupTables(\n * transactionMessage,\n * addressesByAddressLookupTable,\n * );\n * ```\n */\nexport function compressTransactionMessageUsingAddressLookupTables<\n TTransactionMessage extends TransactionMessageNotLegacy = TransactionMessageNotLegacy,\n>(\n transactionMessage: TTransactionMessage,\n addressesByLookupTableAddress: AddressesByLookupTableAddress,\n): TTransactionMessage | WidenTransactionMessageInstructions {\n const programAddresses = new Set(transactionMessage.instructions.map(ix => ix.programAddress));\n const eligibleLookupAddresses = new Set(\n Object.values(addressesByLookupTableAddress)\n .flatMap(a => a)\n .filter(address => !programAddresses.has(address)),\n );\n const newInstructions: Instruction[] = [];\n let updatedAnyInstructions = false;\n for (const instruction of transactionMessage.instructions) {\n if (!instruction.accounts) {\n newInstructions.push(instruction);\n continue;\n }\n\n const newAccounts: Mutable> = [];\n let updatedAnyAccounts = false;\n for (const account of instruction.accounts) {\n // If the address is already a lookup, is not in any lookup tables, or is a signer role, return as-is\n if (\n 'lookupTableAddress' in account ||\n !eligibleLookupAddresses.has(account.address) ||\n isSignerRole(account.role)\n ) {\n newAccounts.push(account);\n continue;\n }\n\n // We already checked it's in one of the lookup tables\n const lookupMetaAccount = findAddressInLookupTables(\n account.address,\n account.role,\n addressesByLookupTableAddress,\n )!;\n newAccounts.push(Object.freeze(lookupMetaAccount));\n updatedAnyAccounts = true;\n updatedAnyInstructions = true;\n }\n\n newInstructions.push(\n Object.freeze(updatedAnyAccounts ? { ...instruction, accounts: newAccounts } : instruction),\n );\n }\n\n return Object.freeze(\n updatedAnyInstructions ? { ...transactionMessage, instructions: newInstructions } : transactionMessage,\n );\n}\n","import { TransactionMessage, TransactionVersion } from './transaction-message';\nimport { TransactionMessageWithinSizeLimit } from './transaction-message-size';\n\ntype TransactionConfig = Readonly<{\n version: TVersion;\n}>;\n\ntype EmptyTransactionMessage = Omit<\n Extract,\n 'instructions'\n> &\n TransactionMessageWithinSizeLimit & { instructions: readonly [] };\n\n/**\n * Given a {@link TransactionVersion} this method will return an empty transaction having the\n * capabilities of that version.\n *\n * @example\n * ```ts\n * import { createTransactionMessage } from '@solana/transaction-messages';\n *\n * const message = createTransactionMessage({ version: 0 });\n * ```\n */\nexport function createTransactionMessage(\n config: TransactionConfig,\n): EmptyTransactionMessage {\n return Object.freeze({\n instructions: Object.freeze([]),\n version: config.version,\n }) as EmptyTransactionMessage;\n}\n","import { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n AccountRole,\n Instruction,\n InstructionWithAccounts,\n InstructionWithData,\n isSignerRole,\n ReadonlyAccount,\n ReadonlySignerAccount,\n WritableAccount,\n WritableSignerAccount,\n} from '@solana/instructions';\nimport { Brand } from '@solana/nominal-types';\n\nexport type AdvanceNonceAccountInstruction<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n> = Instruction<'11111111111111111111111111111111'> &\n InstructionWithAccounts<\n readonly [\n WritableAccount,\n ReadonlyAccount<'SysvarRecentB1ockHashes11111111111111111111'>,\n ReadonlySignerAccount | WritableSignerAccount,\n ]\n > &\n InstructionWithData;\n\ntype AdvanceNonceAccountInstructionData = Brand;\n\nconst RECENT_BLOCKHASHES_SYSVAR_ADDRESS =\n 'SysvarRecentB1ockHashes11111111111111111111' as Address<'SysvarRecentB1ockHashes11111111111111111111'>;\nconst SYSTEM_PROGRAM_ADDRESS = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n\n/**\n * Creates an instruction for the System program to advance a nonce.\n *\n * This instruction is a prerequisite for a transaction with a nonce-based lifetime to be landed on\n * the network. In order to be considered valid, the transaction must meet all of these criteria.\n *\n * 1. Its lifetime constraint must be a {@link NonceLifetimeConstraint}.\n * 2. The value contained in the on-chain account at the address `nonceAccountAddress` must be equal\n * to {@link NonceLifetimeConstraint.nonce} at the time the transaction is landed.\n * 3. The first instruction in that transaction message must be the one returned by this function.\n *\n * You could also use the `getAdvanceNonceAccountInstruction` method of `@solana-program/system`.\n */\nexport function createAdvanceNonceAccountInstruction<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n>(\n nonceAccountAddress: Address,\n nonceAuthorityAddress: Address,\n): AdvanceNonceAccountInstruction {\n return {\n accounts: [\n { address: nonceAccountAddress, role: AccountRole.WRITABLE },\n {\n address: RECENT_BLOCKHASHES_SYSVAR_ADDRESS,\n role: AccountRole.READONLY,\n },\n { address: nonceAuthorityAddress, role: AccountRole.READONLY_SIGNER },\n ],\n data: new Uint8Array([4, 0, 0, 0]) as AdvanceNonceAccountInstructionData,\n programAddress: SYSTEM_PROGRAM_ADDRESS,\n };\n}\n\n/**\n * A type guard that returns `true` if the instruction conforms to the\n * {@link AdvanceNonceAccountInstruction} type, and refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isAdvanceNonceAccountInstruction } from '@solana/transaction-messages';\n *\n * if (isAdvanceNonceAccountInstruction(message.instructions[0])) {\n * // At this point, the first instruction in the message has been refined to a\n * // `AdvanceNonceAccountInstruction`.\n * setNonceAccountAddress(message.instructions[0].accounts[0].address);\n * } else {\n * setError('The first instruction is not an `AdvanceNonce` instruction');\n * }\n * ```\n */\nexport function isAdvanceNonceAccountInstruction(\n instruction: Instruction,\n): instruction is AdvanceNonceAccountInstruction {\n return (\n instruction.programAddress === SYSTEM_PROGRAM_ADDRESS &&\n // Test for `AdvanceNonceAccount` instruction data\n instruction.data != null &&\n isAdvanceNonceAccountInstructionData(instruction.data) &&\n // Test for exactly 3 accounts\n instruction.accounts?.length === 3 &&\n // First account is nonce account address\n instruction.accounts[0].address != null &&\n instruction.accounts[0].role === AccountRole.WRITABLE &&\n // Second account is recent blockhashes sysvar\n instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS &&\n instruction.accounts[1].role === AccountRole.READONLY &&\n // Third account is nonce authority account\n instruction.accounts[2].address != null &&\n isSignerRole(instruction.accounts[2].role)\n );\n}\n\nfunction isAdvanceNonceAccountInstructionData(data: ReadonlyUint8Array): data is AdvanceNonceAccountInstructionData {\n // AdvanceNonceAccount is the fifth instruction in the System Program (index 4)\n return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME, SolanaError } from '@solana/errors';\nimport { Instruction } from '@solana/instructions';\nimport { Brand } from '@solana/nominal-types';\n\nimport {\n AdvanceNonceAccountInstruction,\n createAdvanceNonceAccountInstruction,\n isAdvanceNonceAccountInstruction,\n} from './durable-nonce-instruction';\nimport { ExcludeTransactionMessageLifetime } from './lifetime';\nimport { TransactionMessage } from './transaction-message';\nimport { ExcludeTransactionMessageWithinSizeLimit } from './transaction-message-size';\n\ntype DurableNonceConfig<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n> = Readonly<{\n readonly nonce: Nonce;\n readonly nonceAccountAddress: Address;\n readonly nonceAuthorityAddress: Address;\n}>;\n\n/** Represents a string that is particularly known to be the base58-encoded value of a nonce. */\nexport type Nonce = Brand;\n\n/**\n * A constraint which, when applied to a transaction message, makes that transaction message\n * eligible to land on the network.\n *\n * The transaction message will continue to be eligible to land until the network considers the\n * `nonce` to have advanced. This can happen when the nonce account in which this nonce is found is\n * destroyed, or the nonce value within changes.\n */\nexport type NonceLifetimeConstraint = Readonly<{\n /**\n * A value contained in the related nonce account at the time the transaction was prepared.\n *\n * The transaction will be considered eligible to land until the nonce account ceases to exist\n * or contain this value.\n */\n nonce: Nonce;\n}>;\n\n/**\n * Represents a transaction message whose lifetime is defined by the value of a nonce it includes.\n *\n * Such a transaction can only be landed on the network if the nonce is known to the network and has\n * not already been used to land a different transaction.\n */\nexport interface TransactionMessageWithDurableNonceLifetime<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n> {\n readonly instructions: readonly [\n // The first instruction *must* be the system program's `AdvanceNonceAccount` instruction.\n AdvanceNonceAccountInstruction,\n ...Instruction[],\n ];\n readonly lifetimeConstraint: NonceLifetimeConstraint;\n}\n\n/**\n * A helper type to exclude the durable nonce lifetime constraint from a transaction message.\n */\nexport type ExcludeTransactionMessageDurableNonceLifetime =\n TTransactionMessage extends TransactionMessageWithDurableNonceLifetime\n ? ExcludeTransactionMessageLifetime\n : TTransactionMessage;\n\n/**\n * A type guard that returns `true` if the transaction message conforms to the\n * {@link TransactionMessageWithDurableNonceLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionMessageWithDurableNonceLifetime } from '@solana/transaction-messages';\n * import { fetchNonce } from \"@solana-program/system\";\n *\n * if (isTransactionMessageWithDurableNonceLifetime(message)) {\n * // At this point, `message` has been refined to a\n * // `TransactionMessageWithDurableNonceLifetime`.\n * const { nonce, nonceAccountAddress } = message.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * setNonceIsValid(nonce === actualNonce);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a nonce-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionMessageWithDurableNonceLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithDurableNonceLifetime),\n): transactionMessage is TransactionMessage & TransactionMessageWithDurableNonceLifetime {\n return (\n 'lifetimeConstraint' in transactionMessage &&\n typeof transactionMessage.lifetimeConstraint.nonce === 'string' &&\n transactionMessage.instructions[0] != null &&\n isAdvanceNonceAccountInstruction(transactionMessage.instructions[0])\n );\n}\n\n/**\n * From time to time you might acquire a transaction message, that you expect to have a\n * nonce-based lifetime, from an untrusted network API or user input. Use this function to assert\n * that such a transaction message actually has a nonce-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionMessageWithDurableNonceLifetime } from '@solana/transaction-messages';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `message` to `TransactionMessageWithDurableNonceLifetime`.\n * assertIsTransactionMessageWithDurableNonceLifetime(message);\n * // At this point, `message` is a `TransactionMessageWithDurableNonceLifetime` that can be used\n * // with the RPC.\n * const { nonce, nonceAccountAddress } = message.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * } catch (e) {\n * // `message` turned out not to have a nonce-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionMessageWithDurableNonceLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithDurableNonceLifetime),\n): asserts transactionMessage is TransactionMessage & TransactionMessageWithDurableNonceLifetime {\n if (!isTransactionMessageWithDurableNonceLifetime(transactionMessage)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME);\n }\n}\n\nfunction isAdvanceNonceAccountInstructionForNonce<\n TNonceAccountAddress extends Address = Address,\n TNonceAuthorityAddress extends Address = Address,\n>(\n instruction: AdvanceNonceAccountInstruction,\n nonceAccountAddress: TNonceAccountAddress,\n nonceAuthorityAddress: TNonceAuthorityAddress,\n): instruction is AdvanceNonceAccountInstruction {\n return (\n instruction.accounts[0].address === nonceAccountAddress &&\n instruction.accounts[2].address === nonceAuthorityAddress\n );\n}\n\n/**\n * Given a nonce, the account where the value of the nonce is stored, and the address of the account\n * authorized to consume that nonce, this method will return a new transaction having the same type\n * as the one supplied plus the {@link TransactionMessageWithDurableNonceLifetime} type.\n *\n * In particular, this method _prepends_ an instruction to the transaction message designed to\n * consume (or 'advance') the nonce in the same transaction whose lifetime is defined by it.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { Nonce, setTransactionMessageLifetimeUsingDurableNonce } from '@solana/transaction-messages';\n * import { fetchNonce } from '@solana-program/system';\n *\n * const nonceAccountAddress = address('EGtMh4yvXswwHhwVhyPxGrVV2TkLTgUqGodbATEPvojZ');\n * const nonceAuthorityAddress = address('4KD1Rdrd89NG7XbzW3xsX9Aqnx2EExJvExiNme6g9iAT');\n *\n * const {\n * data: { blockhash },\n * } = await fetchNonce(rpc, nonceAccountAddress);\n * const nonce = blockhash as string as Nonce;\n *\n * const durableNonceTransactionMessage = setTransactionMessageLifetimeUsingDurableNonce(\n * { nonce, nonceAccountAddress, nonceAuthorityAddress },\n * tx,\n * );\n * ```\n */\nexport function setTransactionMessageLifetimeUsingDurableNonce<\n TTransactionMessage extends TransactionMessage,\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n>(\n {\n nonce,\n nonceAccountAddress,\n nonceAuthorityAddress,\n }: DurableNonceConfig,\n transactionMessage: TTransactionMessage,\n): SetTransactionMessageWithDurableNonceLifetime<\n TTransactionMessage,\n TNonceAccountAddress,\n TNonceAuthorityAddress,\n TNonceValue\n> {\n type ReturnType = SetTransactionMessageWithDurableNonceLifetime<\n TTransactionMessage,\n TNonceAccountAddress,\n TNonceAuthorityAddress,\n TNonceValue\n >;\n\n let newInstructions: [\n AdvanceNonceAccountInstruction,\n ...Instruction[],\n ];\n\n const firstInstruction = transactionMessage.instructions[0];\n if (firstInstruction && isAdvanceNonceAccountInstruction(firstInstruction)) {\n if (isAdvanceNonceAccountInstructionForNonce(firstInstruction, nonceAccountAddress, nonceAuthorityAddress)) {\n if (\n isTransactionMessageWithDurableNonceLifetime(transactionMessage) &&\n transactionMessage.lifetimeConstraint.nonce === nonce\n ) {\n return transactionMessage as unknown as ReturnType;\n } else {\n // we already have the right first instruction, leave it as-is\n newInstructions = [firstInstruction, ...transactionMessage.instructions.slice(1)];\n }\n } else {\n // we have a different advance nonce instruction as the first instruction, replace it\n newInstructions = [\n Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)),\n ...transactionMessage.instructions.slice(1),\n ];\n }\n } else {\n // we don't have an existing advance nonce instruction as the first instruction, prepend one\n newInstructions = [\n Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)),\n ...transactionMessage.instructions,\n ];\n }\n\n return Object.freeze({\n ...transactionMessage,\n instructions: Object.freeze(newInstructions),\n lifetimeConstraint: Object.freeze({ nonce }),\n }) as unknown as ReturnType;\n}\n\n/**\n * Helper type that transforms a given transaction message type into a new one that has the\n * `AdvanceNonceAccount` instruction as the first instruction and a lifetime constraint\n * representing the nonce value.\n */\ntype SetTransactionMessageWithDurableNonceLifetime<\n TTransactionMessage extends TransactionMessage,\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n> = TTransactionMessage extends unknown\n ? Omit<\n // 1. The transaction message only grows in size if it currently has a different (or no) lifetime.\n TTransactionMessage extends TransactionMessageWithDurableNonceLifetime\n ? TTransactionMessage\n : ExcludeTransactionMessageWithinSizeLimit,\n // 2. Remove the instructions array as we are going to replace it with a new one.\n 'instructions'\n > & {\n // 3. Replace or prepend the first instruction with the advance nonce account instruction.\n readonly instructions: TTransactionMessage['instructions'] extends readonly [\n AdvanceNonceAccountInstruction,\n ...infer TTail extends readonly Instruction[],\n ]\n ? readonly [AdvanceNonceAccountInstruction, ...TTail]\n : readonly [\n AdvanceNonceAccountInstruction,\n ...TTransactionMessage['instructions'],\n ];\n // 4. Set the lifetime constraint to the nonce value.\n readonly lifetimeConstraint: NonceLifetimeConstraint;\n }\n : never;\n","import { Address } from '@solana/addresses';\n\nimport { TransactionMessage } from './transaction-message';\n\n/**\n * Represents a transaction message for which a fee payer has been declared. A transaction must\n * conform to this type to be compiled and landed on the network.\n */\nexport interface TransactionMessageWithFeePayer {\n readonly feePayer: Readonly<{ address: Address }>;\n}\n\n/**\n * A helper type to exclude the fee payer from a transaction message.\n */\ntype ExcludeTransactionMessageFeePayer =\n TTransactionMessage extends unknown ? Omit : never;\n\n/**\n * Given a base58-encoded address of a system account, this method will return a new transaction\n * message having the same type as the one supplied plus the {@link TransactionMessageWithFeePayer}\n * type.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { setTransactionMessageFeePayer } from '@solana/transaction-messages';\n *\n * const myAddress = address('mpngsFd4tmbUfzDYJayjKZwZcaR7aWb2793J6grLsGu');\n * const txPaidByMe = setTransactionMessageFeePayer(myAddress, tx);\n * ```\n */\nexport function setTransactionMessageFeePayer<\n TFeePayerAddress extends string,\n TTransactionMessage extends Partial & TransactionMessage,\n>(\n feePayer: Address,\n transactionMessage: TTransactionMessage,\n): ExcludeTransactionMessageFeePayer & TransactionMessageWithFeePayer {\n if (\n 'feePayer' in transactionMessage &&\n feePayer === transactionMessage.feePayer?.address &&\n isAddressOnlyFeePayer(transactionMessage.feePayer)\n ) {\n return transactionMessage as ExcludeTransactionMessageFeePayer &\n TransactionMessageWithFeePayer;\n }\n const out = {\n ...transactionMessage,\n feePayer: Object.freeze({ address: feePayer }),\n };\n Object.freeze(out);\n return out as ExcludeTransactionMessageFeePayer &\n TransactionMessageWithFeePayer;\n}\n\nfunction isAddressOnlyFeePayer(\n feePayer: Partial['feePayer'],\n): feePayer is { address: Address } {\n return (\n !!feePayer &&\n 'address' in feePayer &&\n typeof feePayer.address === 'string' &&\n Object.keys(feePayer).length === 1\n );\n}\n","import { Instruction } from '@solana/instructions';\n\nimport { ExcludeTransactionMessageDurableNonceLifetime } from './durable-nonce';\nimport { TransactionMessage } from './transaction-message';\nimport { ExcludeTransactionMessageWithinSizeLimit } from './transaction-message-size';\n\n/**\n * A helper type to append instructions to a transaction message\n * without losing type information about the current instructions.\n */\ntype AppendTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n TInstructions extends readonly Instruction[],\n> = TTransactionMessage extends TransactionMessage\n ? Omit, 'instructions'> & {\n readonly instructions: readonly [...TTransactionMessage['instructions'], ...TInstructions];\n }\n : never;\n\n/**\n * A helper type to prepend instructions to a transaction message\n * without losing type information about the current instructions.\n */\ntype PrependTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n TInstructions extends readonly Instruction[],\n> = TTransactionMessage extends TransactionMessage\n ? Omit<\n ExcludeTransactionMessageWithinSizeLimit>,\n 'instructions'\n > & {\n readonly instructions: readonly [...TInstructions, ...TTransactionMessage['instructions']];\n }\n : never;\n\n/**\n * Given an instruction, this method will return a new transaction message with that instruction\n * having been added to the end of the list of existing instructions.\n *\n * @see {@link appendTransactionInstructions} if you need to append multiple instructions to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { getUtf8Encoder } from '@solana/codecs-strings';\n * import { appendTransactionMessageInstruction } from '@solana/transaction-messages';\n *\n * const memoTransactionMessage = appendTransactionMessageInstruction(\n * {\n * data: getUtf8Encoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * transactionMessage,\n * );\n * ```\n */\nexport function appendTransactionMessageInstruction<\n TTransactionMessage extends TransactionMessage,\n TInstruction extends Instruction,\n>(\n instruction: TInstruction,\n transactionMessage: TTransactionMessage,\n): AppendTransactionMessageInstructions {\n return appendTransactionMessageInstructions([instruction], transactionMessage);\n}\n\n/**\n * Given an array of instructions, this method will return a new transaction message with those\n * instructions having been added to the end of the list of existing instructions.\n *\n * @see {@link appendTransactionInstruction} if you only need to append one instruction to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { appendTransactionMessageInstructions } from '@solana/transaction-messages';\n *\n * const memoTransaction = appendTransactionMessageInstructions(\n * [\n * {\n * data: new TextEncoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * {\n * data: new TextEncoder().encode('How are you?'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * ],\n * tx,\n * );\n * ```\n */\nexport function appendTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n const TInstructions extends readonly Instruction[],\n>(\n instructions: TInstructions,\n transactionMessage: TTransactionMessage,\n): AppendTransactionMessageInstructions {\n return Object.freeze({\n ...transactionMessage,\n instructions: Object.freeze([\n ...(transactionMessage.instructions as TTransactionMessage['instructions']),\n ...instructions,\n ] as readonly [...TTransactionMessage['instructions'], ...TInstructions]),\n }) as AppendTransactionMessageInstructions;\n}\n\n/**\n * Given an instruction, this method will return a new transaction message with that instruction\n * having been added to the beginning of the list of existing instructions.\n *\n * @see {@link prependTransactionInstructions} if you need to prepend multiple instructions to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { prependTransactionMessageInstruction } from '@solana/transaction-messages';\n *\n * const memoTransaction = prependTransactionMessageInstruction(\n * {\n * data: new TextEncoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * tx,\n * );\n * ```\n */\nexport function prependTransactionMessageInstruction<\n TTransactionMessage extends TransactionMessage,\n TInstruction extends Instruction,\n>(\n instruction: TInstruction,\n transactionMessage: TTransactionMessage,\n): PrependTransactionMessageInstructions {\n return prependTransactionMessageInstructions([instruction], transactionMessage);\n}\n\n/**\n * Given an array of instructions, this method will return a new transaction message with those\n * instructions having been added to the beginning of the list of existing instructions.\n *\n * @see {@link prependTransactionInstruction} if you only need to prepend one instruction to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { prependTransactionMessageInstructions } from '@solana/transaction-messages';\n *\n * const memoTransaction = prependTransactionMessageInstructions(\n * [\n * {\n * data: new TextEncoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * {\n * data: new TextEncoder().encode('How are you?'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * ],\n * tx,\n * );\n * ```\n */\nexport function prependTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n const TInstructions extends readonly Instruction[],\n>(\n instructions: TInstructions,\n transactionMessage: TTransactionMessage,\n): PrependTransactionMessageInstructions {\n return Object.freeze({\n ...(transactionMessage as ExcludeTransactionMessageDurableNonceLifetime),\n instructions: Object.freeze([\n ...instructions,\n ...(transactionMessage.instructions as TTransactionMessage['instructions']),\n ] as readonly [...TInstructions, ...TTransactionMessage['instructions']]),\n }) as unknown as PrependTransactionMessageInstructions;\n}\n","import { Address, assertIsAddress } from '@solana/addresses';\nimport {\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND,\n SolanaError,\n} from '@solana/errors';\nimport { pipe } from '@solana/functional';\nimport { AccountLookupMeta, AccountMeta, AccountRole, Instruction } from '@solana/instructions';\nimport type { Blockhash } from '@solana/rpc-types';\n\nimport { AddressesByLookupTableAddress } from './addresses-by-lookup-table-address';\nimport { BlockhashLifetimeConstraint, setTransactionMessageLifetimeUsingBlockhash } from './blockhash';\nimport { CompiledTransactionMessage, CompiledTransactionMessageWithLifetime } from './compile';\nimport type { getCompiledAddressTableLookups } from './compile/address-table-lookups';\nimport { createTransactionMessage } from './create-transaction-message';\nimport { Nonce, setTransactionMessageLifetimeUsingDurableNonce } from './durable-nonce';\nimport { isAdvanceNonceAccountInstruction } from './durable-nonce-instruction';\nimport { setTransactionMessageFeePayer, TransactionMessageWithFeePayer } from './fee-payer';\nimport { appendTransactionMessageInstruction } from './instructions';\nimport { TransactionMessageWithLifetime } from './lifetime';\nimport { TransactionMessage, TransactionVersion } from './transaction-message';\n\nfunction getAccountMetas(message: CompiledTransactionMessage): AccountMeta[] {\n const { header } = message;\n const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;\n const numWritableNonSignerAccounts =\n message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;\n\n const accountMetas: AccountMeta[] = [];\n\n let accountIndex = 0;\n for (let i = 0; i < numWritableSignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.WRITABLE_SIGNER,\n });\n accountIndex++;\n }\n\n for (let i = 0; i < header.numReadonlySignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.READONLY_SIGNER,\n });\n accountIndex++;\n }\n\n for (let i = 0; i < numWritableNonSignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.WRITABLE,\n });\n accountIndex++;\n }\n\n for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.READONLY,\n });\n accountIndex++;\n }\n\n return accountMetas;\n}\n\nfunction getAddressLookupMetas(\n compiledAddressTableLookups: ReturnType,\n addressesByLookupTableAddress: AddressesByLookupTableAddress,\n): AccountLookupMeta[] {\n // check that all message lookups are known\n const compiledAddressTableLookupAddresses = compiledAddressTableLookups.map(l => l.lookupTableAddress);\n const missing = compiledAddressTableLookupAddresses.filter(a => addressesByLookupTableAddress[a] === undefined);\n if (missing.length > 0) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, {\n lookupTableAddresses: missing,\n });\n }\n\n const readOnlyMetas: AccountLookupMeta[] = [];\n const writableMetas: AccountLookupMeta[] = [];\n\n // we know that for each lookup, knownLookups[lookup.lookupTableAddress] is defined\n for (const lookup of compiledAddressTableLookups) {\n const addresses = addressesByLookupTableAddress[lookup.lookupTableAddress];\n const readonlyIndexes = lookup.readonlyIndexes;\n const writableIndexes = lookup.writableIndexes;\n\n const highestIndex = Math.max(...readonlyIndexes, ...writableIndexes);\n if (highestIndex >= addresses.length) {\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n {\n highestKnownIndex: addresses.length - 1,\n highestRequestedIndex: highestIndex,\n lookupTableAddress: lookup.lookupTableAddress,\n },\n );\n }\n\n const readOnlyForLookup: AccountLookupMeta[] = readonlyIndexes.map(r => ({\n address: addresses[r],\n addressIndex: r,\n lookupTableAddress: lookup.lookupTableAddress,\n role: AccountRole.READONLY,\n }));\n readOnlyMetas.push(...readOnlyForLookup);\n\n const writableForLookup: AccountLookupMeta[] = writableIndexes.map(w => ({\n address: addresses[w],\n addressIndex: w,\n lookupTableAddress: lookup.lookupTableAddress,\n role: AccountRole.WRITABLE,\n }));\n writableMetas.push(...writableForLookup);\n }\n\n return [...writableMetas, ...readOnlyMetas];\n}\n\nfunction convertInstruction(\n instruction: CompiledTransactionMessage['instructions'][0],\n accountMetas: AccountMeta[],\n): Instruction {\n const programAddress = accountMetas[instruction.programAddressIndex]?.address;\n if (!programAddress) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, {\n index: instruction.programAddressIndex,\n });\n }\n\n const accounts = instruction.accountIndices?.map(accountIndex => accountMetas[accountIndex]);\n const { data } = instruction;\n\n return Object.freeze({\n programAddress,\n ...(accounts && accounts.length ? { accounts: Object.freeze(accounts) } : {}),\n ...(data && data.length ? { data } : {}),\n });\n}\n\ntype LifetimeConstraint =\n | BlockhashLifetimeConstraint\n | {\n nonce: Nonce;\n nonceAccountAddress: Address;\n nonceAuthorityAddress: Address;\n };\n\nfunction getLifetimeConstraint(\n messageLifetimeToken: string,\n firstInstruction?: Instruction,\n lastValidBlockHeight?: bigint,\n): LifetimeConstraint {\n if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {\n // first instruction is not advance durable nonce, so use blockhash lifetime constraint\n return {\n blockhash: messageLifetimeToken as Blockhash,\n lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n, // U64 MAX\n };\n } else {\n // We know these accounts are defined because we checked `isAdvanceNonceAccountInstruction`\n const nonceAccountAddress = firstInstruction.accounts[0].address;\n assertIsAddress(nonceAccountAddress);\n\n const nonceAuthorityAddress = firstInstruction.accounts[2].address;\n assertIsAddress(nonceAuthorityAddress);\n\n return {\n nonce: messageLifetimeToken as Nonce,\n nonceAccountAddress,\n nonceAuthorityAddress,\n };\n }\n}\n\nexport type DecompileTransactionMessageConfig = {\n /**\n * If the compiled message loads addresses from one or more address lookup tables, you will have\n * to supply a map of those tables to an array of the addresses they contained at the time that\n * the transaction message was constructed.\n *\n * @see {@link decompileTransactionMessageFetchingLookupTables} if you do not already have this.\n */\n addressesByLookupTableAddress?: AddressesByLookupTableAddress;\n /**\n * If the compiled message has a blockhash-based lifetime constraint, you will have to supply\n * the block height after which that blockhash is no longer valid for use as a lifetime\n * constraint.\n */\n lastValidBlockHeight?: bigint;\n};\n\n/**\n * Converts the type of transaction message data structure appropriate for execution on the network\n * to the type of transaction message data structure designed for use in your application.\n *\n * Because compilation is a lossy process, you can not fully reconstruct a source message from a\n * compiled message without extra information. In order to faithfully reconstruct the original\n * source message you will need to supply supporting details about the lifetime constraint and the\n * concrete addresses of any accounts sourced from account lookup tables.\n *\n * @see {@link compileTransactionMessage}\n */\nexport function decompileTransactionMessage(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n config?: DecompileTransactionMessageConfig,\n): TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithLifetime {\n const feePayer = compiledTransactionMessage.staticAccounts[0];\n if (!feePayer) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING);\n }\n\n const accountMetas = getAccountMetas(compiledTransactionMessage);\n const accountLookupMetas =\n 'addressTableLookups' in compiledTransactionMessage &&\n compiledTransactionMessage.addressTableLookups !== undefined &&\n compiledTransactionMessage.addressTableLookups.length > 0\n ? getAddressLookupMetas(\n compiledTransactionMessage.addressTableLookups,\n config?.addressesByLookupTableAddress ?? {},\n )\n : [];\n const transactionMetas = [...accountMetas, ...accountLookupMetas];\n\n const instructions: Instruction[] = compiledTransactionMessage.instructions.map(compiledInstruction =>\n convertInstruction(compiledInstruction, transactionMetas),\n );\n\n const firstInstruction = instructions[0];\n const lifetimeConstraint = getLifetimeConstraint(\n compiledTransactionMessage.lifetimeToken,\n firstInstruction,\n config?.lastValidBlockHeight,\n );\n\n return pipe(\n createTransactionMessage({ version: compiledTransactionMessage.version as TransactionVersion }),\n m => setTransactionMessageFeePayer(feePayer, m),\n m =>\n instructions.reduce(\n (acc, instruction) => appendTransactionMessageInstruction(instruction, acc),\n m as TransactionMessage,\n ),\n m =>\n 'blockhash' in lifetimeConstraint\n ? setTransactionMessageLifetimeUsingBlockhash(lifetimeConstraint, m)\n : setTransactionMessageLifetimeUsingDurableNonce(lifetimeConstraint, m),\n ) as TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithLifetime;\n}\n","export const ED25519_ALGORITHM_IDENTIFIER =\n // Resist the temptation to convert this to a simple string; As of version 133.0.3, Firefox\n // requires the object form of `AlgorithmIdentifier` and will throw a `DOMException` otherwise.\n Object.freeze({ name: 'Ed25519' });\n","import { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, SolanaError } from '@solana/errors';\n\nimport { ED25519_ALGORITHM_IDENTIFIER } from './algorithm';\n\nfunction addPkcs8Header(bytes: ReadonlyUint8Array): ReadonlyUint8Array {\n // prettier-ignore\n return new Uint8Array([\n /**\n * PKCS#8 header\n */\n 0x30, // ASN.1 sequence tag\n 0x2e, // Length of sequence (46 more bytes)\n\n 0x02, // ASN.1 integer tag\n 0x01, // Length of integer\n 0x00, // Version number\n\n 0x30, // ASN.1 sequence tag\n 0x05, // Length of sequence\n 0x06, // ASN.1 object identifier tag\n 0x03, // Length of object identifier\n // Edwards curve algorithms identifier https://oid-rep.orange-labs.fr/get/1.3.101.112\n 0x2b, // iso(1) / identified-organization(3) (The first node is multiplied by the decimal 40 and the result is added to the value of the second node)\n 0x65, // thawte(101)\n // Ed25519 identifier\n 0x70, // id-Ed25519(112)\n\n /**\n * Private key payload\n */\n 0x04, // ASN.1 octet string tag\n 0x22, // String length (34 more bytes)\n\n // Private key bytes as octet string\n 0x04, // ASN.1 octet string tag\n 0x20, // String length (32 bytes)\n\n ...bytes\n ]);\n}\n\n/**\n * Given a private key represented as a 32-byte `Uint8Array`, creates an Ed25519 private key for use\n * with other methods in this package that accept\n * [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey) objects.\n *\n * @param bytes 32 bytes that represent the private key\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the private\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import { createPrivateKeyFromBytes } from '@solana/keys';\n *\n * const privateKey = await createPrivateKeyFromBytes(new Uint8Array([...]));\n * const extractablePrivateKey = await createPrivateKeyFromBytes(new Uint8Array([...]), true);\n * ```\n */\nexport async function createPrivateKeyFromBytes(\n bytes: ReadonlyUint8Array,\n extractable: boolean = false,\n): Promise {\n const actualLength = bytes.byteLength;\n if (actualLength !== 32) {\n throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, {\n actualLength,\n });\n }\n const privateKeyBytesPkcs8 = addPkcs8Header(bytes);\n return await crypto.subtle.importKey('pkcs8', privateKeyBytesPkcs8, ED25519_ALGORITHM_IDENTIFIER, extractable, [\n 'sign',\n ]);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\nimport { SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, SolanaError } from '@solana/errors';\n\n/**\n * Given an extractable [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey)\n * private key, gets the corresponding public key as a\n * [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey).\n *\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the public\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import { createPrivateKeyFromBytes, getPublicKeyFromPrivateKey } from '@solana/keys';\n *\n * const privateKey = await createPrivateKeyFromBytes(new Uint8Array([...]), true);\n *\n * const publicKey = await getPublicKeyFromPrivateKey(privateKey);\n * const extractablePublicKey = await getPublicKeyFromPrivateKey(privateKey, true);\n * ```\n */\nexport async function getPublicKeyFromPrivateKey(\n privateKey: CryptoKey,\n extractable: boolean = false,\n): Promise {\n assertKeyExporterIsAvailable();\n\n if (privateKey.extractable === false) {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, { key: privateKey });\n }\n\n // Export private key.\n const jwk = await crypto.subtle.exportKey('jwk', privateKey);\n\n // Import public key.\n return await crypto.subtle.importKey(\n 'jwk',\n {\n crv /* curve */: 'Ed25519',\n ext /* extractable */: extractable,\n key_ops /* key operations */: ['verify'],\n kty /* key type */: 'OKP' /* octet key pair */,\n x /* public key x-coordinate */: jwk.x,\n },\n 'Ed25519',\n extractable,\n ['verify'],\n );\n}\n","import { assertSigningCapabilityIsAvailable, assertVerificationCapabilityIsAvailable } from '@solana/assertions';\nimport { Encoder, ReadonlyUint8Array, toArrayBuffer } from '@solana/codecs-core';\nimport { getBase58Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\nimport { ED25519_ALGORITHM_IDENTIFIER } from './algorithm';\n\n/**\n * A 64-byte Ed25519 signature as a base58-encoded string.\n */\nexport type Signature = Brand, 'Signature'>;\n/**\n * A 64-byte Ed25519 signature.\n *\n * Whenever you need to verify that a particular signature is, in fact, the one that would have been\n * produced by signing some known bytes using the private key associated with some known public key,\n * use the {@link verifySignature} function in this package.\n */\nexport type SignatureBytes = Brand;\n\nlet base58Encoder: Encoder | undefined;\n\n/**\n * Asserts that an arbitrary string is a base58-encoded Ed25519 signature.\n *\n * Useful when you receive a string from user input or an untrusted network API that you expect to\n * represent an Ed25519 signature (eg. of a transaction).\n *\n * @example\n * ```ts\n * import { assertIsSignature } from '@solana/keys';\n *\n * // Imagine a function that asserts whether a user-supplied signature is valid or not.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const signature: string = signatureInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `signature` to `Signature`.\n * assertIsSignature(signature);\n * // At this point, `signature` is a `Signature` that can be used with the RPC.\n * const {\n * value: [status],\n * } = await rpc.getSignatureStatuses([signature]).send();\n * } catch (e) {\n * // `signature` turned out not to be a base58-encoded signature\n * }\n * }\n * ```\n */\nexport function assertIsSignature(putativeSignature: string): asserts putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n throw new SolanaError(SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, {\n actualLength: putativeSignature.length,\n });\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n assertIsSignatureBytes(bytes);\n}\n\n/**\n * Asserts that an arbitrary `ReadonlyUint8Array` is an Ed25519 signature.\n *\n * Useful when you receive a `ReadonlyUint8Array` from an external interface (like the browser wallets' `signMessage` API) that you expect to\n * represent an Ed25519 signature.\n *\n * @example\n * ```ts\n * import { assertIsSignatureBytes } from '@solana/keys';\n *\n * // Imagine a function that verifies a signature.\n * function verifySignature() {\n * // We know only that the input conforms to the `ReadonlyUint8Array` type.\n * const signatureBytes: ReadonlyUint8Array = signatureBytesInput;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `signatureBytes` to `SignatureBytes`.\n * assertIsSignatureBytes(signatureBytes);\n * // At this point, `signatureBytes` is a `SignatureBytes` that can be used with `verifySignature`.\n * if (!(await verifySignature(publicKey, signatureBytes, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * } catch (e) {\n * // `signatureBytes` turned out not to be a 64-byte Ed25519 signature\n * }\n * }\n * ```\n */\nexport function assertIsSignatureBytes(\n putativeSignatureBytes: ReadonlyUint8Array,\n): asserts putativeSignatureBytes is SignatureBytes {\n const numBytes = putativeSignatureBytes.byteLength;\n if (numBytes !== 64) {\n throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, {\n actualLength: numBytes,\n });\n }\n}\n\n/**\n * A type guard that accepts a string as input. It will both return `true` if the string conforms to\n * the {@link Signature} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isSignature } from '@solana/keys';\n *\n * if (isSignature(signature)) {\n * // At this point, `signature` has been refined to a\n * // `Signature` that can be used with the RPC.\n * const {\n * value: [status],\n * } = await rpc.getSignatureStatuses([signature]).send();\n * setSignatureStatus(status);\n * } else {\n * setError(`${signature} is not a transaction signature`);\n * }\n * ```\n */\nexport function isSignature(putativeSignature: string): putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n return isSignatureBytes(bytes);\n}\n\n/**\n * A type guard that accepts a `ReadonlyUint8Array` as input. It will both return `true` if the `ReadonlyUint8Array` conforms to\n * the {@link SignatureBytes} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isSignatureBytes } from '@solana/keys';\n *\n * if (isSignatureBytes(signatureBytes)) {\n * // At this point, `signatureBytes` has been refined to a\n * // `SignatureBytes` that can be used with `verifySignature`.\n * if (!(await verifySignature(publicKey, signatureBytes, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * } else {\n * setError(`${signatureBytes} is not a 64-byte Ed25519 signature`);\n * }\n * ```\n */\nexport function isSignatureBytes(putativeSignatureBytes: ReadonlyUint8Array): putativeSignatureBytes is SignatureBytes {\n return putativeSignatureBytes.byteLength === 64;\n}\n\n/**\n * Given a private [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey) and a\n * `Uint8Array` of bytes, this method will return the 64-byte Ed25519 signature of that data as a\n * `Uint8Array`.\n *\n * @example\n * ```ts\n * import { signBytes } from '@solana/keys';\n *\n * const data = new Uint8Array([1, 2, 3]);\n * const signature = await signBytes(privateKey, data);\n * ```\n */\nexport async function signBytes(key: CryptoKey, data: ReadonlyUint8Array): Promise {\n assertSigningCapabilityIsAvailable();\n const signedData = await crypto.subtle.sign(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(data));\n return new Uint8Array(signedData) as SignatureBytes;\n}\n\n/**\n * This helper combines _asserting_ that a string is an Ed25519 signature with _coercing_ it to the\n * {@link Signature} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { signature } from '@solana/keys';\n *\n * const signature = signature(userSuppliedSignature);\n * const {\n * value: [status],\n * } = await rpc.getSignatureStatuses([signature]).send();\n * ```\n */\nexport function signature(putativeSignature: string): Signature {\n assertIsSignature(putativeSignature);\n return putativeSignature;\n}\n\n/**\n * This helper combines _asserting_ that a `ReadonlyUint8Array` is an Ed25519 signature with _coercing_ it to the\n * {@link SignatureBytes} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { signatureBytes } from '@solana/keys';\n *\n * const signature = signatureBytes(userSuppliedSignatureBytes);\n * if (!(await verifySignature(publicKey, signature, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * ```\n */\nexport function signatureBytes(putativeSignatureBytes: ReadonlyUint8Array): SignatureBytes {\n assertIsSignatureBytes(putativeSignatureBytes);\n return putativeSignatureBytes;\n}\n\n/**\n * Given a public [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey), some\n * {@link SignatureBytes}, and a `Uint8Array` of data, this method will return `true` if the\n * signature was produced by signing the data using the private key associated with the public key,\n * and `false` otherwise.\n *\n * @example\n * ```ts\n * import { verifySignature } from '@solana/keys';\n *\n * const data = new Uint8Array([1, 2, 3]);\n * if (!(await verifySignature(publicKey, signature, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * ```\n */\nexport async function verifySignature(\n key: CryptoKey,\n signature: SignatureBytes,\n data: ReadonlyUint8Array,\n): Promise {\n assertVerificationCapabilityIsAvailable();\n return await crypto.subtle.verify(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(signature), toArrayBuffer(data));\n}\n","import { assertKeyGenerationIsAvailable, assertPRNGIsAvailable } from '@solana/assertions';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY,\n SolanaError,\n} from '@solana/errors';\n\nimport { ED25519_ALGORITHM_IDENTIFIER } from './algorithm';\nimport { createPrivateKeyFromBytes } from './private-key';\nimport { getPublicKeyFromPrivateKey } from './public-key';\nimport { signBytes, verifySignature } from './signatures';\n\n/**\n * Generates an Ed25519 public/private key pair for use with other methods in this package that\n * accept [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey) objects.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n *\n * const { privateKey, publicKey } = await generateKeyPair();\n * ```\n */\nexport async function generateKeyPair(): Promise {\n await assertKeyGenerationIsAvailable();\n const keyPair = await crypto.subtle.generateKey(\n /* algorithm */ ED25519_ALGORITHM_IDENTIFIER, // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20\n /* extractable */ false, // Prevents the bytes of the private key from being visible to JS.\n /* allowed uses */ ['sign', 'verify'],\n );\n return keyPair;\n}\n\n/**\n * Given a 64-byte `Uint8Array` secret key, creates an Ed25519 public/private key pair for use with\n * other methods in this package that accept [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey)\n * objects.\n *\n * @param bytes 64 bytes, the first 32 of which represent the private key and the last 32 of which\n * represent its associated public key\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the private\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import fs from 'fs';\n * import { createKeyPairFromBytes } from '@solana/keys';\n *\n * // Get bytes from local keypair file.\n * const keypairFile = fs.readFileSync('~/.config/solana/id.json');\n * const keypairBytes = new Uint8Array(JSON.parse(keypairFile.toString()));\n *\n * // Create a CryptoKeyPair from the bytes.\n * const { privateKey, publicKey } = await createKeyPairFromBytes(keypairBytes);\n * ```\n */\nexport async function createKeyPairFromBytes(\n bytes: ReadonlyUint8Array,\n extractable: boolean = false,\n): Promise {\n assertPRNGIsAvailable();\n\n if (bytes.byteLength !== 64) {\n throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, { byteLength: bytes.byteLength });\n }\n const [publicKey, privateKey] = await Promise.all([\n crypto.subtle.importKey('raw', bytes.slice(32), ED25519_ALGORITHM_IDENTIFIER, /* extractable */ true, [\n 'verify',\n ]),\n createPrivateKeyFromBytes(bytes.slice(0, 32), extractable),\n ]);\n\n // Verify the key pair\n const randomBytes = new Uint8Array(32);\n crypto.getRandomValues(randomBytes);\n const signedData = await signBytes(privateKey, randomBytes);\n const isValid = await verifySignature(publicKey, signedData, randomBytes);\n if (!isValid) {\n throw new SolanaError(SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY);\n }\n\n return { privateKey, publicKey } as CryptoKeyPair;\n}\n\n/**\n * Given a private key represented as a 32-byte `Uint8Array`, creates an Ed25519 public/private key\n * pair for use with other methods in this package that accept [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey)\n * objects.\n *\n * @param bytes 32 bytes that represent the private key\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the private\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import { createKeyPairFromPrivateKeyBytes } from '@solana/keys';\n *\n * const { privateKey, publicKey } = await createKeyPairFromPrivateKeyBytes(new Uint8Array([...]));\n * ```\n *\n * This can be useful when you have a private key but not the corresponding public key or when you\n * need to derive key pairs from seeds. For instance, the following code snippet derives a key pair\n * from the hash of a message.\n *\n * ```ts\n * import { getUtf8Encoder } from '@solana/codecs-strings';\n * import { createKeyPairFromPrivateKeyBytes } from '@solana/keys';\n *\n * const message = getUtf8Encoder().encode('Hello, World!');\n * const seed = new Uint8Array(await crypto.subtle.digest('SHA-256', message));\n *\n * const derivedKeypair = await createKeyPairFromPrivateKeyBytes(seed);\n * ```\n */\nexport async function createKeyPairFromPrivateKeyBytes(\n bytes: ReadonlyUint8Array,\n extractable: boolean = false,\n): Promise {\n const privateKeyPromise = createPrivateKeyFromBytes(bytes, extractable);\n\n // Here we need the private key to be extractable in order to export\n // it as a public key. Therefore, if the `extractable` parameter\n // is `false`, we need to create two private keys such that:\n // - The extractable one is used to create the public key and\n // - The non-extractable one is the one we will return.\n const [publicKey, privateKey] = await Promise.all([\n // This nested promise makes things efficient by\n // creating the public key in parallel with the\n // second private key creation, if it is needed.\n (extractable ? privateKeyPromise : createPrivateKeyFromBytes(bytes, true /* extractable */)).then(\n async privateKey => await getPublicKeyFromPrivateKey(privateKey, true /* extractable */),\n ),\n privateKeyPromise,\n ]);\n\n return { privateKey, publicKey };\n}\n","import { fixEncoderSize, transformEncoder, VariableSizeEncoder } from '@solana/codecs-core';\nimport { getArrayEncoder, getBytesEncoder } from '@solana/codecs-data-structures';\nimport { getShortU16Encoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { SignaturesMap } from '../transaction';\n\nfunction getSignaturesToEncode(signaturesMap: SignaturesMap): SignatureBytes[] {\n const signatures = Object.values(signaturesMap);\n if (signatures.length === 0) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES);\n }\n\n return signatures.map(signature => {\n if (!signature) {\n return new Uint8Array(64).fill(0) as SignatureBytes;\n }\n return signature;\n });\n}\n\nexport function getSignaturesEncoder(): VariableSizeEncoder {\n return transformEncoder(\n getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getShortU16Encoder() }),\n getSignaturesToEncode,\n );\n}\n","import { getAddressDecoder } from '@solana/addresses';\nimport {\n combineCodec,\n fixDecoderSize,\n padRightDecoder,\n ReadonlyUint8Array,\n transformDecoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getTupleDecoder,\n} from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getU8Decoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getTransactionVersionDecoder } from '@solana/transaction-messages';\n\nimport { SignaturesMap, Transaction, TransactionMessageBytes } from '../transaction';\nimport { getSignaturesEncoder } from './signatures-encoder';\n\n/**\n * Returns an encoder that you can use to encode a {@link Transaction} to a byte array in a wire\n * format appropriate for sending to the Solana network for execution.\n */\nexport function getTransactionEncoder(): VariableSizeEncoder {\n return getStructEncoder([\n ['signatures', getSignaturesEncoder()],\n ['messageBytes', getBytesEncoder()],\n ]);\n}\n\n/**\n * Returns a decoder that you can use to convert a byte array in the Solana transaction wire format\n * to a {@link Transaction} object.\n *\n * @example\n * ```ts\n * import { getTransactionDecoder } from '@solana/transactions';\n *\n * const transactionDecoder = getTransactionDecoder();\n * const transaction = transactionDecoder.decode(wireTransactionBytes);\n * for (const [address, signature] in Object.entries(transaction.signatures)) {\n * console.log(`Signature by ${address}`, signature);\n * }\n * ```\n */\n\nexport function getTransactionDecoder(): VariableSizeDecoder {\n return transformDecoder(\n getStructDecoder([\n ['signatures', getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getShortU16Decoder() })],\n ['messageBytes', getBytesDecoder()],\n ]),\n decodePartiallyDecodedTransaction,\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a {@link Transaction}\n *\n * @see {@link getTransactionDecoder}\n * @see {@link getTransactionEncoder}\n */\nexport function getTransactionCodec(): VariableSizeCodec {\n return combineCodec(getTransactionEncoder(), getTransactionDecoder());\n}\n\ntype PartiallyDecodedTransaction = {\n messageBytes: ReadonlyUint8Array;\n signatures: ReadonlyUint8Array[];\n};\n\nfunction decodePartiallyDecodedTransaction(transaction: PartiallyDecodedTransaction): Transaction {\n const { messageBytes, signatures } = transaction;\n\n /*\n Relevant message structure is at the start:\n - transaction version (0 bytes for legacy transactions, 1 byte for versioned transactions)\n - `numRequiredSignatures` (1 byte, we verify this matches the length of signatures)\n - `numReadOnlySignedAccounts` (1 byte, not used here)\n - `numReadOnlyUnsignedAccounts` (1 byte, not used here)\n - static addresses, with signers first. This is an array of addresses, prefixed with a short-u16 length\n */\n\n const signerAddressesDecoder = getTupleDecoder([\n // read transaction version\n getTransactionVersionDecoder(),\n // read first byte of header, `numSignerAccounts`\n // padRight to skip the next 2 bytes, `numReadOnlySignedAccounts` and `numReadOnlyUnsignedAccounts` which we don't need\n padRightDecoder(getU8Decoder(), 2),\n // read static addresses\n getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() }),\n ]);\n const [_txVersion, numRequiredSignatures, staticAddresses] = signerAddressesDecoder.decode(messageBytes);\n\n const signerAddresses = staticAddresses.slice(0, numRequiredSignatures);\n\n // signer addresses and signatures must be the same length\n // we encode an all-zero signature when the signature is missing\n if (signerAddresses.length !== signatures.length) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, {\n numRequiredSignatures,\n signaturesLength: signatures.length,\n signerAddresses,\n });\n }\n\n // combine the signer addresses + signatures into the signatures map\n const signaturesMap: SignaturesMap = {};\n signerAddresses.forEach((address, index) => {\n const signatureForAddress = signatures[index];\n if (signatureForAddress.every(b => b === 0)) {\n signaturesMap[address] = null;\n } else {\n signaturesMap[address] = signatureForAddress as SignatureBytes;\n }\n });\n\n return {\n messageBytes: messageBytes as TransactionMessageBytes,\n signatures: Object.freeze(signaturesMap),\n };\n}\n","import { type Address, isAddress } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME,\n SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME,\n SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE,\n SolanaError,\n} from '@solana/errors';\nimport { type Blockhash, isBlockhash, type Slot } from '@solana/rpc-types';\nimport type {\n CompiledTransactionMessage,\n CompiledTransactionMessageWithLifetime,\n Nonce,\n TransactionMessage,\n TransactionMessageWithBlockhashLifetime,\n TransactionMessageWithDurableNonceLifetime,\n} from '@solana/transaction-messages';\n\nimport type { Transaction } from './transaction';\n\n/**\n * A constraint which, when applied to a transaction, makes that transaction eligible to land on the\n * network. The transaction will continue to be eligible to land until the network considers the\n * `blockhash` to be expired.\n *\n * This can happen when the network proceeds past the `lastValidBlockHeight` for which the blockhash\n * is considered valid, or when the network switches to a fork where that blockhash is not present.\n */\nexport type TransactionBlockhashLifetime = {\n /**\n * A recent blockhash observed by the transaction proposer.\n *\n * The transaction will be considered eligible to land until the network determines this\n * blockhash to be too old, or has switched to a fork where it is not present.\n */\n blockhash: Blockhash;\n /**\n * This is the block height beyond which the network will consider the blockhash to be too old\n * to make a transaction eligible to land.\n */\n lastValidBlockHeight: Slot;\n};\n\n/**\n * A constraint which, when applied to a transaction, makes that transaction eligible to land on the\n * network.\n *\n * The transaction will continue to be eligible to land until the network considers the `nonce` to\n * have advanced. This can happen when the nonce account in which this nonce is found is destroyed,\n * or the nonce value within changes.\n */\nexport type TransactionDurableNonceLifetime = {\n /**\n * A value contained in the account with address `nonceAccountAddress` at the time the\n * transaction was prepared.\n *\n * The transaction will be considered eligible to land until the nonce account ceases to exist\n * or contain this value.\n */\n nonce: Nonce;\n /** The account that contains the `nonce` value */\n nonceAccountAddress: Address;\n};\n\n/**\n * A transaction whose ability to land on the network is determined by some evanescent criteria.\n *\n * This describes a window of time after which a transaction is constructed and before which it will\n * no longer be accepted by the network.\n *\n * No transaction can land on Solana without having a `lifetimeConstraint` set.\n */\nexport type TransactionWithLifetime = {\n readonly lifetimeConstraint: TransactionBlockhashLifetime | TransactionDurableNonceLifetime;\n};\n\n/**\n * A transaction whose lifetime is determined by the age of a blockhash observed on the network.\n *\n * The transaction will continue to be eligible to land until the network considers the `blockhash`\n * to be expired.\n */\nexport type TransactionWithBlockhashLifetime = {\n readonly lifetimeConstraint: TransactionBlockhashLifetime;\n};\n\n/**\n * A transaction whose lifetime is determined by a nonce.\n *\n * The transaction will continue to be eligible to land until the network considers the `nonce` to\n * have advanced. This can happen when the nonce account in which this nonce is found is destroyed,\n * or the nonce value within changes.\n */\nexport type TransactionWithDurableNonceLifetime = {\n readonly lifetimeConstraint: TransactionDurableNonceLifetime;\n};\n\n/**\n * Helper type that sets the lifetime constraint of a transaction to be the same as the\n * lifetime constraint of the provided transaction message.\n *\n * If the transaction message has no explicit lifetime constraint, neither will the transaction.\n */\nexport type SetTransactionLifetimeFromTransactionMessage<\n TTransaction extends Transaction,\n TTransactionMessage extends TransactionMessage,\n> = TTransactionMessage extends { lifetimeConstraint: unknown }\n ? TTransactionMessage['lifetimeConstraint'] extends TransactionMessageWithBlockhashLifetime['lifetimeConstraint']\n ? TransactionWithBlockhashLifetime & TTransaction\n : TTransactionMessage['lifetimeConstraint'] extends TransactionMessageWithDurableNonceLifetime['lifetimeConstraint']\n ? TransactionWithDurableNonceLifetime & TTransaction\n : TransactionWithLifetime & TTransaction\n : TTransaction;\n\nconst SYSTEM_PROGRAM_ADDRESS = '11111111111111111111111111111111' as Address;\n\nfunction compiledInstructionIsAdvanceNonceInstruction(\n instruction: CompiledTransactionMessage['instructions'][number],\n staticAddresses: Address[],\n): instruction is typeof instruction & { accountIndices: [number, number, number] } {\n return (\n staticAddresses[instruction.programAddressIndex] === SYSTEM_PROGRAM_ADDRESS &&\n // Test for `AdvanceNonceAccount` instruction data\n instruction.data != null &&\n isAdvanceNonceAccountInstructionData(instruction.data) &&\n // Test for exactly 3 accounts\n instruction.accountIndices?.length === 3\n );\n}\n\nfunction isAdvanceNonceAccountInstructionData(data: ReadonlyUint8Array): boolean {\n // AdvanceNonceAccount is the fifth instruction in the System Program (index 4)\n return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;\n}\n\n/**\n * Get the lifetime constraint for a transaction from a compiled transaction message that includes a lifetime token.\n * @param compiledTransactionMessage A compiled transaction message that includes a lifetime token\n * @returns A lifetime constraint for the transaction\n * Note that this is less precise than checking a decompiled instruction, as we can't inspect\n * the address or role of input accounts (which may be in lookup tables). However, this is\n * sufficient for all valid advance durable nonce instructions.\n * Note that the program address must not be in a lookup table, see [this answer on StackExchange](https://solana.stackexchange.com/a/16224/289)\n * @see {@link isAdvanceNonceAccountInstruction}\n * Note that this function is async to allow for future implementations that may fetch `lastValidBlockHeight` using an RPC\n */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function getTransactionLifetimeConstraintFromCompiledTransactionMessage(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n): Promise {\n const firstInstruction = compiledTransactionMessage.instructions[0];\n const { staticAccounts } = compiledTransactionMessage;\n\n // We need to check if the first instruction is an AdvanceNonceAccount instruction\n if (firstInstruction && compiledInstructionIsAdvanceNonceInstruction(firstInstruction, staticAccounts)) {\n const nonceAccountAddress = staticAccounts[firstInstruction.accountIndices[0]];\n if (!nonceAccountAddress) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, {\n nonce: compiledTransactionMessage.lifetimeToken,\n });\n }\n return {\n nonce: compiledTransactionMessage.lifetimeToken as Nonce,\n nonceAccountAddress,\n };\n } else {\n return {\n blockhash: compiledTransactionMessage.lifetimeToken as Blockhash,\n // This is not known from the compiled message, so we set it to the maximum possible value\n lastValidBlockHeight: 0xffffffffffffffffn,\n };\n }\n}\n\n/**\n * A type guard that returns `true` if the transaction conforms to the\n * {@link TransactionWithBlockhashLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionWithBlockhashLifetime } from '@solana/transactions';\n *\n * if (isTransactionWithBlockhashLifetime(transaction)) {\n * // At this point, `transaction` has been refined to a `TransactionWithBlockhashLifetime`.\n * const { blockhash } = transaction.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * setBlockhashIsValid(blockhashIsValid);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a blockhash-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionWithBlockhashLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): transaction is Transaction & TransactionWithBlockhashLifetime {\n return (\n 'lifetimeConstraint' in transaction &&\n 'blockhash' in transaction.lifetimeConstraint &&\n typeof transaction.lifetimeConstraint.blockhash === 'string' &&\n typeof transaction.lifetimeConstraint.lastValidBlockHeight === 'bigint' &&\n isBlockhash(transaction.lifetimeConstraint.blockhash)\n );\n}\n\n/**\n * From time to time you might acquire a transaction, that you expect to have a\n * blockhash-based lifetime, from for example a wallet. Use this function to\n * assert that such a transaction actually has a blockhash-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionWithBlockhashLifetime } from '@solana/transactions';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `transaction` to `TransactionWithBlockhashLifetime`.\n * assertIsTransactionWithBlockhashLifetime(transaction);\n * // At this point, `transaction` is a `TransactionWithBlockhashLifetime` that can be used\n * // with the RPC.\n * const { blockhash } = transaction.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * } catch (e) {\n * // `transaction` turned out not to have a blockhash-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionWithBlockhashLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): asserts transaction is Transaction & TransactionWithBlockhashLifetime {\n if (!isTransactionWithBlockhashLifetime(transaction)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME);\n }\n}\n\n/**\n * A type guard that returns `true` if the transaction conforms to the\n * {@link TransactionWithDurableNonceLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionWithDurableNonceLifetime } from '@solana/transactions';\n * import { fetchNonce } from \"@solana-program/system\";\n *\n * if (isTransactionWithDurableNonceLifetime(transaction)) {\n * // At this point, `transaction` has been refined to a\n * // `TransactionWithDurableNonceLifetime`.\n * const { nonce, nonceAccountAddress } = transaction.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * setNonceIsValid(nonce === actualNonce);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a nonce-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionWithDurableNonceLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): transaction is Transaction & TransactionWithDurableNonceLifetime {\n return (\n 'lifetimeConstraint' in transaction &&\n 'nonce' in transaction.lifetimeConstraint &&\n typeof transaction.lifetimeConstraint.nonce === 'string' &&\n typeof transaction.lifetimeConstraint.nonceAccountAddress === 'string' &&\n isAddress(transaction.lifetimeConstraint.nonceAccountAddress)\n );\n}\n\n/**\n * From time to time you might acquire a transaction, that you expect to have a\n * nonce-based lifetime, from for example a wallet. Use this function to assert\n * that such a transaction actually has a nonce-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionWithDurableNonceLifetime } from '@solana/transactions';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `transaction` to `TransactionWithDurableNonceLifetime`.\n * assertIsTransactionWithDurableNonceLifetime(transaction);\n * // At this point, `transaction` is a `TransactionWithDurableNonceLifetime` that can be used\n * // with the RPC.\n * const { nonce, nonceAccountAddress } = transaction.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * } catch (e) {\n * // `transaction` turned out not to have a nonce-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionWithDurableNonceLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): asserts transaction is Transaction & TransactionWithDurableNonceLifetime {\n if (!isTransactionWithDurableNonceLifetime(transaction)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME);\n }\n}\n","import {\n compileTransactionMessage,\n getCompiledTransactionMessageEncoder,\n isTransactionMessageWithBlockhashLifetime,\n isTransactionMessageWithDurableNonceLifetime,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\n\nimport type { TransactionWithLifetime } from './lifetime';\nimport type { SignaturesMap, TransactionFromTransactionMessage, TransactionMessageBytes } from './transaction';\n\n/**\n * Returns a {@link Transaction} object for a given {@link TransactionMessage}.\n *\n * This includes the compiled bytes of the transaction message, and a map of signatures. This map\n * will have a key for each address that is required to sign the transaction. The transaction will\n * not yet have signatures for any of these addresses.\n *\n * Whether a transaction message is ready to be compiled or not is enforced for you at the type\n * level. In order to be signable, a transaction message must:\n *\n * - have a version and a list of zero or more instructions (ie. conform to\n * {@link TransactionMessage})\n * - have a fee payer set (ie. conform to {@link TransactionMessageWithFeePayer})\n * - have a lifetime specified (ie. conform to {@link TransactionMessageWithBlockhashLifetime} or\n * {@link TransactionMessageWithDurableNonceLifetime})\n */\nexport function compileTransaction(\n transactionMessage: TTransactionMessage,\n): Readonly> {\n type ReturnType = Readonly>;\n\n const compiledMessage = compileTransactionMessage(transactionMessage);\n const messageBytes = getCompiledTransactionMessageEncoder().encode(compiledMessage) as TransactionMessageBytes;\n\n const transactionSigners = compiledMessage.staticAccounts.slice(0, compiledMessage.header.numSignerAccounts);\n const signatures: SignaturesMap = {};\n for (const signerAddress of transactionSigners) {\n signatures[signerAddress] = null;\n }\n\n let lifetimeConstraint: TransactionWithLifetime['lifetimeConstraint'] | undefined;\n if (isTransactionMessageWithBlockhashLifetime(transactionMessage)) {\n lifetimeConstraint = {\n blockhash: transactionMessage.lifetimeConstraint.blockhash,\n lastValidBlockHeight: transactionMessage.lifetimeConstraint.lastValidBlockHeight,\n };\n } else if (isTransactionMessageWithDurableNonceLifetime(transactionMessage)) {\n lifetimeConstraint = {\n nonce: transactionMessage.lifetimeConstraint.nonce,\n nonceAccountAddress: transactionMessage.instructions[0].accounts[0].address,\n };\n }\n\n return Object.freeze({\n ...(lifetimeConstraint ? { lifetimeConstraint } : undefined),\n messageBytes: messageBytes,\n signatures: Object.freeze(signatures),\n }) as ReturnType;\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { bytesEqual, Decoder } from '@solana/codecs-core';\nimport { getBase58Decoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION,\n SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING,\n SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { Signature, SignatureBytes, signBytes } from '@solana/keys';\nimport { NominalType } from '@solana/nominal-types';\n\nimport { Transaction } from './transaction';\n\n/**\n * Represents a transaction that is signed by all of its required signers. Being fully signed is a\n * prerequisite of functions designed to land transactions on the network.\n */\nexport type FullySignedTransaction = NominalType<'transactionSignedness', 'fullySigned'>;\n\nlet base58Decoder: Decoder | undefined;\n\n/**\n * Given a transaction signed by its fee payer, this method will return the {@link Signature} that\n * uniquely identifies it. This string can be used to look up transactions at a later date, for\n * example on a Solana block explorer.\n *\n * @example\n * ```ts\n * import { getSignatureFromTransaction } from '@solana/transactions';\n *\n * const signature = getSignatureFromTransaction(tx);\n * console.debug(`Inspect this transaction at https://explorer.solana.com/tx/${signature}`);\n * ```\n */\nexport function getSignatureFromTransaction(transaction: Transaction): Signature {\n if (!base58Decoder) base58Decoder = getBase58Decoder();\n\n // We have ordered signatures from the compiled message accounts\n // first signature is the fee payer\n const signatureBytes = Object.values(transaction.signatures)[0];\n if (!signatureBytes) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING);\n }\n const transactionSignature = base58Decoder.decode(signatureBytes);\n return transactionSignature as Signature;\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign a transaction, this method will return a new signed transaction of type\n * {@link Transaction}.\n *\n * Though the resulting transaction might have every signature it needs to land on the network, this\n * function will not assert that it does. A partially signed transaction cannot be landed on the\n * network, but can be serialized and deserialized.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { partiallySignTransaction } from '@solana/transactions';\n *\n * const partiallySignedTransaction = await partiallySignTransaction([myPrivateKey], tx);\n * ```\n *\n * @see {@link signTransaction} if you want to assert that the transaction has all of its required\n * signatures after signing.\n */\nexport async function partiallySignTransaction(\n keyPairs: CryptoKeyPair[],\n transaction: TTransaction,\n): Promise {\n let newSignatures: Record | undefined;\n let unexpectedSigners: Set
| undefined;\n\n await Promise.all(\n keyPairs.map(async keyPair => {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n const existingSignature = transaction.signatures[address];\n\n // Check if the address is expected to sign the transaction\n if (existingSignature === undefined) {\n // address is not an expected signer for this transaction\n unexpectedSigners ||= new Set();\n unexpectedSigners.add(address);\n return;\n }\n\n // Return if there are any unexpected signers already since we won't be using signatures\n if (unexpectedSigners) {\n return;\n }\n\n const newSignature = await signBytes(keyPair.privateKey, transaction.messageBytes);\n\n if (existingSignature !== null && bytesEqual(newSignature, existingSignature)) {\n // already have the same signature set\n return;\n }\n\n newSignatures ||= {};\n newSignatures[address] = newSignature;\n }),\n );\n\n if (unexpectedSigners && unexpectedSigners.size > 0) {\n const expectedSigners = Object.keys(transaction.signatures);\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, {\n expectedAddresses: expectedSigners,\n unexpectedAddresses: [...unexpectedSigners],\n });\n }\n\n if (!newSignatures) {\n return transaction;\n }\n\n return Object.freeze({\n ...transaction,\n signatures: Object.freeze({\n ...transaction.signatures,\n ...newSignatures,\n }),\n });\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign a transaction, this method will return a new signed transaction of type\n * {@link FullySignedTransaction}.\n *\n * This function will throw unless the resulting transaction is fully signed.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { signTransaction } from '@solana/transactions';\n *\n * const signedTransaction = await signTransaction([myPrivateKey], tx);\n * ```\n *\n * @see {@link partiallySignTransaction} if you want to sign the transaction without asserting that\n * the resulting transaction is fully signed.\n */\nexport async function signTransaction(\n keyPairs: CryptoKeyPair[],\n transaction: TTransaction,\n): Promise {\n const out = await partiallySignTransaction(keyPairs, transaction);\n assertIsFullySignedTransaction(out);\n Object.freeze(out);\n return out;\n}\n\n/**\n * Checks whether a given {@link Transaction} is fully signed.\n *\n * @example\n * ```ts\n * import { isFullySignedTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * if (isFullySignedTransaction(transaction)) {\n * // At this point we know that the transaction is signed and can be sent to the network.\n * }\n * ```\n */\nexport function isFullySignedTransaction(\n transaction: TTransaction,\n): transaction is FullySignedTransaction & TTransaction {\n return Object.entries(transaction.signatures).every(([_, signatureBytes]) => !!signatureBytes);\n}\n\n/**\n * From time to time you might acquire a {@link Transaction}, that you expect to be fully signed,\n * from an untrusted network API or user input. Use this function to assert that such a transaction\n * is fully signed.\n *\n * @example\n * ```ts\n * import { assertIsFullySignedTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * try {\n * // If this type assertion function doesn't throw, then Typescript will upcast `transaction`\n * // to `FullySignedTransaction`.\n * assertIsFullySignedTransaction(transaction);\n * // At this point we know that the transaction is signed and can be sent to the network.\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch(e) {\n * if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING)) {\n * setError(`Missing signatures for ${e.context.addresses.join(', ')}`);\n * }\n * throw;\n * }\n * ```\n */\nexport function assertIsFullySignedTransaction(\n transaction: TTransaction,\n): asserts transaction is FullySignedTransaction & TTransaction {\n const missingSigs: Address[] = [];\n Object.entries(transaction.signatures).forEach(([address, signatureBytes]) => {\n if (!signatureBytes) {\n missingSigs.push(address as Address);\n }\n });\n\n if (missingSigs.length > 0) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, {\n addresses: missingSigs,\n });\n }\n}\n","import { getBase64Decoder } from '@solana/codecs-strings';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\nimport { getTransactionEncoder } from './codecs';\nimport { Transaction } from './transaction';\n\n/** Represents the wire format of a transaction as a base64-encoded string. */\nexport type Base64EncodedWireTransaction = Brand, 'Base64EncodedWireTransaction'>;\n\n/**\n * Given a signed transaction, this method returns the transaction as a string that conforms to the\n * {@link Base64EncodedWireTransaction} type.\n *\n * @example\n * ```ts\n * import { getBase64EncodedWireTransaction, signTransaction } from '@solana/transactions';\n *\n * const serializedTransaction = getBase64EncodedWireTransaction(signedTransaction);\n * const signature = await rpc.sendTransaction(serializedTransaction, { encoding: 'base64' }).send();\n * ```\n */\nexport function getBase64EncodedWireTransaction(transaction: Transaction): Base64EncodedWireTransaction {\n const wireTransactionBytes = getTransactionEncoder().encode(transaction);\n return getBase64Decoder().decode(wireTransactionBytes) as Base64EncodedWireTransaction;\n}\n","import { SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SolanaError } from '@solana/errors';\nimport type { NominalType } from '@solana/nominal-types';\nimport type { BaseTransactionMessage, TransactionMessageWithinSizeLimit } from '@solana/transaction-messages';\n\nimport { getTransactionEncoder } from './codecs';\nimport { Transaction } from './transaction';\n\n/**\n * The maximum size of a transaction packet in bytes.\n */\nexport const TRANSACTION_PACKET_SIZE = 1280;\n\n/**\n * The size of the transaction packet header in bytes.\n * This includes the IPv6 header and the fragment header.\n */\nexport const TRANSACTION_PACKET_HEADER =\n 40 /* 40 bytes is the size of the IPv6 header. */ + 8; /* 8 bytes is the size of the fragment header. */\n\n/**\n * The maximum size of a transaction in bytes.\n *\n * Note that this excludes the transaction packet header.\n * In other words, this is how much content we can fit in a transaction packet.\n */\nexport const TRANSACTION_SIZE_LIMIT = TRANSACTION_PACKET_SIZE - TRANSACTION_PACKET_HEADER;\n\n/**\n * Gets the size of a given transaction in bytes.\n *\n * @example\n * ```ts\n * const transactionSize = getTransactionSize(transaction);\n * ```\n */\nexport function getTransactionSize(transaction: Transaction): number {\n return getTransactionEncoder().getSizeFromValue(transaction);\n}\n\n/**\n * A type guard that checks if a transaction is within the size limit.\n */\nexport type TransactionWithinSizeLimit = NominalType<'transactionSize', 'withinLimit'>;\n\n/**\n * Helper type that adds the `TransactionWithinSizeLimit` flag to\n * a transaction if and only if the provided transaction message\n * is also within the size limit.\n */\nexport type SetTransactionWithinSizeLimitFromTransactionMessage<\n TTransaction extends Transaction,\n TTransactionMessage extends BaseTransactionMessage,\n> = TTransactionMessage extends TransactionMessageWithinSizeLimit\n ? TransactionWithinSizeLimit & TTransaction\n : TTransaction;\n\n/**\n * Checks if a transaction is within the size limit.\n *\n * @typeParam TTransaction - The type of the given transaction.\n *\n * @example\n * ```ts\n * if (isTransactionWithinSizeLimit(transaction)) {\n * transaction satisfies TransactionWithinSizeLimit;\n * }\n * ```\n */\nexport function isTransactionWithinSizeLimit(\n transaction: TTransaction,\n): transaction is TransactionWithinSizeLimit & TTransaction {\n return getTransactionSize(transaction) <= TRANSACTION_SIZE_LIMIT;\n}\n\n/**\n * Asserts that a given transaction is within the size limit.\n *\n * Throws a {@link SolanaError} of code {@link SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT}\n * if the transaction exceeds the size limit.\n *\n * @typeParam TTransaction - The type of the given transaction.\n *\n * @example\n * ```ts\n * assertIsTransactionWithinSizeLimit(transaction);\n * transaction satisfies TransactionWithinSizeLimit;\n * ```\n */\nexport function assertIsTransactionWithinSizeLimit(\n transaction: TTransaction,\n): asserts transaction is TransactionWithinSizeLimit & TTransaction {\n const transactionSize = getTransactionSize(transaction);\n if (transactionSize > TRANSACTION_SIZE_LIMIT) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, {\n transactionSize,\n transactionSizeLimit: TRANSACTION_SIZE_LIMIT,\n });\n }\n}\n","import { assertIsFullySignedTransaction, FullySignedTransaction, isFullySignedTransaction } from './signatures';\nimport { Transaction } from './transaction';\nimport {\n assertIsTransactionWithinSizeLimit,\n isTransactionWithinSizeLimit,\n TransactionWithinSizeLimit,\n} from './transaction-size';\n\n/**\n * Helper type that includes all transaction types required\n * for the transaction to be sent to the network.\n *\n * @see {@link isSendableTransaction}\n * @see {@link assertIsSendableTransaction}\n */\nexport type SendableTransaction = FullySignedTransaction & TransactionWithinSizeLimit;\n\n/**\n * Checks if a transaction has all the required\n * conditions to be sent to the network.\n *\n * @example\n * ```ts\n * import { isSendableTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * if (isSendableTransaction(transaction)) {\n * // At this point we know that the transaction can be sent to the network.\n * }\n * ```\n *\n * @see {@link assertIsSendableTransaction}\n */\nexport function isSendableTransaction(\n transaction: TTransaction,\n): transaction is SendableTransaction & TTransaction {\n return isFullySignedTransaction(transaction) && isTransactionWithinSizeLimit(transaction);\n}\n\n/**\n * Asserts that a given transaction has all the\n * required conditions to be sent to the network.\n *\n * From time to time you might acquire a {@link Transaction}\n * from an untrusted network API or user input and you are not sure\n * that it has all the required conditions to be sent to the network\n * — such as being fully signed and within the size limit.\n * This function can be used to assert that such a transaction\n * is in fact sendable.\n *\n * @example\n * ```ts\n * import { assertIsSendableTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * try {\n * // If this type assertion function doesn't throw, then Typescript will upcast `transaction`\n * // to `SendableTransaction`.\n * assertIsSendableTransaction(transaction);\n * // At this point we know that the transaction can be sent to the network.\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch(e) {\n * if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING)) {\n * setError(`Missing signatures for ${e.context.addresses.join(', ')}`);\n * } else if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT)) {\n * setError(`Transaction exceeds size limit of ${e.context.transactionSizeLimit} bytes`);\n * }\n * throw;\n * }\n * ```\n */\nexport function assertIsSendableTransaction(\n transaction: TTransaction,\n): asserts transaction is SendableTransaction & TTransaction {\n assertIsFullySignedTransaction(transaction);\n assertIsTransactionWithinSizeLimit(transaction);\n}\n","import { SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SolanaError } from '@solana/errors';\nimport type {\n BaseTransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionMessageWithinSizeLimit,\n} from '@solana/transaction-messages';\n\nimport { compileTransaction } from './compile-transaction';\nimport { getTransactionSize, TRANSACTION_SIZE_LIMIT } from './transaction-size';\n\n/**\n * Gets the compiled transaction size of a given transaction message in bytes.\n *\n * @example\n * ```ts\n * const transactionSize = getTransactionMessageSize(transactionMessage);\n * ```\n */\nexport function getTransactionMessageSize(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer,\n): number {\n return getTransactionSize(compileTransaction(transactionMessage));\n}\n\n/**\n * Checks if a transaction message is within the size limit\n * when compiled into a transaction.\n *\n * @typeParam TTransactionMessage - The type of the given transaction message.\n *\n * @example\n * ```ts\n * if (isTransactionMessageWithinSizeLimit(transactionMessage)) {\n * transactionMessage satisfies TransactionMessageWithinSizeLimit;\n * }\n * ```\n */\nexport function isTransactionMessageWithinSizeLimit<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n): transactionMessage is TransactionMessageWithinSizeLimit & TTransactionMessage {\n return getTransactionMessageSize(transactionMessage) <= TRANSACTION_SIZE_LIMIT;\n}\n\n/**\n * Asserts that a given transaction message is within the size limit\n * when compiled into a transaction.\n *\n * Throws a {@link SolanaError} of code {@link SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT}\n * if the transaction message exceeds the size limit.\n *\n * @typeParam TTransactionMessage - The type of the given transaction message.\n *\n * @example\n * ```ts\n * assertIsTransactionMessageWithinSizeLimit(transactionMessage);\n * transactionMessage satisfies TransactionMessageWithinSizeLimit;\n * ```\n */\nexport function assertIsTransactionMessageWithinSizeLimit<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n): asserts transactionMessage is TransactionMessageWithinSizeLimit & TTransactionMessage {\n const transactionSize = getTransactionMessageSize(transactionMessage);\n if (transactionSize > TRANSACTION_SIZE_LIMIT) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, {\n transactionSize,\n transactionSizeLimit: TRANSACTION_SIZE_LIMIT,\n });\n }\n}\n","/**\n * Forked from https://github.com/digitalloggers/race-as-promised/tree/master\n *\n * Authored by Brian Kim:\n * https://github.com/nodejs/node/issues/17469#issuecomment-685216777\n *\n * Adapted to module structure.\n *\n * This is free and unencumbered software released into the public domain.\n *\n * Anyone is free to copy, modify, publish, use, compile, sell, or\n * distribute this software, either in source code form or as a compiled\n * binary, for any purpose, commercial or non-commercial, and by any\n * means.\n *\n * In jurisdictions that recognize copyright laws, the author or authors\n * of this software dedicate any and all copyright interest in the\n * software to the public domain. We make this dedication for the benefit\n * of the public at large and to the detriment of our heirs and\n * successors. We intend this dedication to be an overt act of\n * relinquishment in perpetuity of all present and future rights to this\n * software under copyright law.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * For more information, please refer to \n */\n\ntype Deferred = Readonly<{\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n}>;\n\nfunction isObject(value: unknown): value is object {\n return value !== null && (typeof value === 'object' || typeof value === 'function');\n}\n\nfunction addRaceContender(contender: object) {\n const deferreds = new Set();\n const record = { deferreds, settled: false };\n\n // This call to `then` happens once for the lifetime of the value.\n Promise.resolve(contender).then(\n value => {\n for (const { resolve } of deferreds) {\n resolve(value);\n }\n\n deferreds.clear();\n record.settled = true;\n },\n err => {\n for (const { reject } of deferreds) {\n reject(err);\n }\n\n deferreds.clear();\n record.settled = true;\n },\n );\n return record;\n}\n\n// Keys are the values passed to race, values are a record of data containing a\n// set of deferreds and whether the value has settled.\nconst wm = new WeakMap; settled: boolean }>();\n/**\n * An implementation of [`Promise.race`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race)\n * that causes all of the losing promises to settle. This allows them to be released and garbage\n * collected, preventing memory leaks.\n *\n * Read more here: https://github.com/nodejs/node/issues/17469\n */\nexport async function safeRace(contenders: T): Promise> {\n let deferred: Deferred;\n const result = new Promise((resolve, reject) => {\n deferred = { reject, resolve };\n for (const contender of contenders) {\n if (!isObject(contender)) {\n // If the contender is a primitive, attempting to use it as a key in the\n // weakmap would throw an error. Luckily, it is safe to call\n // `Promise.resolve(contender).then` on a primitive value multiple times\n // because the promise fulfills immediately.\n Promise.resolve(contender).then(resolve, reject);\n continue;\n }\n\n let record = wm.get(contender);\n if (record === undefined) {\n record = addRaceContender(contender);\n record.deferreds.add(deferred);\n wm.set(contender, record);\n } else if (record.settled) {\n // If the value has settled, it is safe to call\n // `Promise.resolve(contender).then` on it.\n Promise.resolve(contender).then(resolve, reject);\n } else {\n record.deferreds.add(deferred);\n }\n }\n });\n\n // The finally callback executes when any value settles, preventing any of\n // the unresolved values from retaining a reference to the resolved value.\n return await (result.finally(() => {\n for (const contender of contenders) {\n if (isObject(contender)) {\n const record = wm.get(contender)!;\n record.deferreds.delete(deferred);\n }\n }\n }) as Promise>);\n}\n","import { safeRace } from './race';\n\n/**\n * Returns a new promise that will reject if the abort signal fires before the original promise\n * settles. Resolves or rejects with the value of the original promise otherwise.\n *\n * @example\n * ```ts\n * const result = await getAbortablePromise(\n * // Resolves or rejects when `fetch` settles.\n * fetch('https://example.com/json').then(r => r.json()),\n * // ...unless it takes longer than 5 seconds, after which the `AbortSignal` is triggered.\n * AbortSignal.timeout(5000),\n * );\n * ```\n */\nexport function getAbortablePromise(promise: Promise, abortSignal?: AbortSignal): Promise {\n if (!abortSignal) {\n return promise;\n } else {\n return safeRace([\n // This promise only ever rejects if the signal is aborted. Otherwise it idles forever.\n // It's important that this come before the input promise; in the event of an abort, we\n // want to throw even if the input promise's result is ready\n new Promise((_, reject) => {\n if (abortSignal.aborted) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(abortSignal.reason);\n } else {\n abortSignal.addEventListener('abort', function () {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(this.reason);\n });\n }\n }),\n promise,\n ]);\n }\n}\n","import {\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN,\n SolanaError,\n} from '@solana/errors';\nimport { Instruction } from '@solana/instructions';\nimport {\n appendTransactionMessageInstruction,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\nimport { getTransactionMessageSize, TRANSACTION_SIZE_LIMIT } from '@solana/transactions';\n\n/**\n * A set of instructions with constraints on how they can be executed.\n *\n * This is structured as a recursive tree of plans in order to allow for\n * parallel execution, sequential execution and combinations of both.\n *\n * Namely the following plans are supported:\n * - {@link SingleInstructionPlan} - A plan that contains a single instruction.\n * This is a simple instruction wrapper and the simplest leaf in this tree.\n * - {@link ParallelInstructionPlan} - A plan that contains other plans that\n * can be executed in parallel.\n * - {@link SequentialInstructionPlan} - A plan that contains other plans that\n * must be executed sequentially. It also defines whether the plan is divisible\n * meaning that instructions inside it can be split into separate transactions.\n * - {@link MessagePackerInstructionPlan} - A plan that can dynamically pack\n * instructions into transaction messages.\n *\n * Helpers are provided for each of these plans to make it easier to create them.\n *\n * @example\n * ```ts\n * const myInstructionPlan: InstructionPlan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * instructionC,\n * instructionD,\n * ]);\n * ```\n *\n * @see {@link SingleInstructionPlan}\n * @see {@link ParallelInstructionPlan}\n * @see {@link SequentialInstructionPlan}\n * @see {@link MessagePackerInstructionPlan}\n */\nexport type InstructionPlan =\n | MessagePackerInstructionPlan\n | ParallelInstructionPlan\n | SequentialInstructionPlan\n | SingleInstructionPlan;\n\n/**\n * A plan wrapping other plans that must be executed sequentially.\n *\n * It also defines whether nested plans are divisible — meaning that\n * the instructions inside them can be split into separate transactions.\n * When `divisible` is `false`, the instructions inside the plan should\n * all be executed atomically — either in a single transaction or in a\n * transaction bundle.\n *\n * You may use the {@link sequentialInstructionPlan} and {@link nonDivisibleSequentialInstructionPlan}\n * helpers to create objects of this type.\n *\n * @example Simple sequential plan with two instructions.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB]);\n * plan satisfies SequentialInstructionPlan;\n * ```\n *\n * @example Non-divisible sequential plan with two instructions.\n * ```ts\n * const plan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n * plan satisfies SequentialInstructionPlan & { divisible: false };\n * ```\n *\n * @example Sequential plan with nested parallel plans.\n * Here, instructions A and B can be executed in parallel, but they must both be finalized\n * before instructions C and D can be sent — which can also be executed in parallel.\n * ```ts\n * const plan = sequentialInstructionPlan([\n * parallelInstructionPlan([instructionA, instructionB]),\n * parallelInstructionPlan([instructionC, instructionD]),\n * ]);\n * plan satisfies SequentialInstructionPlan & { divisible: false };\n * ```\n *\n * @see {@link sequentialInstructionPlan}\n * @see {@link nonDivisibleSequentialInstructionPlan}\n */\nexport type SequentialInstructionPlan = Readonly<{\n divisible: boolean;\n kind: 'sequential';\n plans: InstructionPlan[];\n}>;\n\n/**\n * A plan wrapping other plans that can be executed in parallel.\n *\n * This means direct children of this plan can be executed in separate\n * parallel transactions without consequence.\n * However, the children themselves can define additional constraints\n * for that specific branch of the tree — such as the {@link SequentialInstructionPlan}.\n *\n * You may use the {@link parallelInstructionPlan} helper to create objects of this type.\n *\n * @example Simple parallel plan with two instructions.\n * ```ts\n * const plan = parallelInstructionPlan([instructionA, instructionB]);\n * plan satisfies ParallelInstructionPlan;\n * ```\n *\n * @example Parallel plan with nested sequential plans.\n * Here, instructions A and B must be executed sequentially and so must instructions C and D,\n * but both pairs can be executed in parallel.\n * ```ts\n * const plan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * sequentialInstructionPlan([instructionC, instructionD]),\n * ]);\n * plan satisfies ParallelInstructionPlan;\n * ```\n *\n * @see {@link parallelInstructionPlan}\n */\nexport type ParallelInstructionPlan = Readonly<{\n kind: 'parallel';\n plans: InstructionPlan[];\n}>;\n\n/**\n * A plan that contains a single instruction.\n *\n * This is a simple instruction wrapper that transforms an instruction into a plan.\n *\n * You may use the {@link singleInstructionPlan} helper to create objects of this type.\n *\n * @example\n * ```ts\n * const plan = singleInstructionPlan(instructionA);\n * plan satisfies SingleInstructionPlan;\n * ```\n *\n * @see {@link singleInstructionPlan}\n */\nexport type SingleInstructionPlan = Readonly<{\n instruction: TInstruction;\n kind: 'single';\n}>;\n\n/**\n * A plan that can dynamically pack instructions into transaction messages.\n *\n * This plan provides a {@link MessagePacker} via the `getMessagePacker`\n * method, which enables instructions to be dynamically packed into the\n * provided transaction message until there are no more instructions to pack.\n * The returned {@link MessagePacker} offers a `packMessageToCapacity(message)`\n * method that packs the provided message — when possible — and a `done()` method\n * that checks whether there are more instructions to pack.\n *\n * Several helper functions are provided to create objects of this type such as\n * {@link getLinearMessagePackerInstructionPlan} or {@link getMessagePackerInstructionPlanFromInstructions}.\n *\n * @example An message packer plan for a write instruction that uses as many bytes as possible.\n * ```ts\n * const plan = getLinearMessagePackerInstructionPlan({\n * totalLength: dataToWrite.length,\n * getInstruction: (offset, length) =>\n * getWriteInstruction({\n * offset,\n * data: dataToWrite.slice(offset, offset + length),\n * }),\n * });\n * plan satisfies MessagePackerInstructionPlan;\n * ```\n *\n * @example A message packer plan for multiple realloc instructions.\n * ```ts\n * const plan = getReallocMessagePackerInstructionPlan({\n * totalSize: additionalDataSize,\n * getInstruction: (size) => getExtendInstruction({ length: size }),\n * });\n * plan satisfies MessagePackerInstructionPlan;\n * ```\n *\n * @example Using a message packer plan.\n * ```ts\n * let plan: MessagePackerInstructionPlan;\n * const messagePacker = plan.getMessagePacker();\n *\n * while (!messagePacker.done()) {\n * try {\n * transactionMessage = messagePacker.packMessageToCapacity(transactionMessage);\n * } catch (error) {\n * // The current transaction message cannot be used to pack this plan.\n * // We should create a new one and try again.\n * }\n * }\n * ```\n *\n * @see {@link getLinearMessagePackerInstructionPlan}\n * @see {@link getMessagePackerInstructionPlanFromInstructions}\n * @see {@link getReallocMessagePackerInstructionPlan}\n */\nexport type MessagePackerInstructionPlan = Readonly<{\n getMessagePacker: () => MessagePacker;\n kind: 'messagePacker';\n}>;\n\n/**\n * The message packer returned by the {@link MessagePackerInstructionPlan}.\n *\n * It offers a `packMessageToCapacity(transactionMessage)` method that packs as many instructions\n * as possible into the provided transaction message, while still being able to fit into the\n * transaction size limit. It returns the updated transaction message with the packed instructions\n * or throws an error if the current transaction message cannot accommodate this plan.\n *\n * The `done()` method checks whether there are more instructions to pack into\n * transaction messages.\n *\n * @example\n * ```ts\n * let plan: MessagePackerInstructionPlan;\n * const messagePacker = plan.getMessagePacker();\n *\n * while (!messagePacker.done()) {\n * try {\n * transactionMessage = messagePacker.packMessageToCapacity(transactionMessage);\n * } catch (error) {\n * // The current transaction message cannot be used to pack this plan.\n * // We should create a new one and try again.\n * }\n * }\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n */\nexport type MessagePacker = Readonly<{\n /** Checks whether the message packer has more instructions to pack into transaction messages. */\n done: () => boolean;\n /**\n * Packs the provided transaction message with instructions or throws if not possible.\n *\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN}\n * if the provided transaction message cannot be used to fill the next instructions.\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE}\n * if the message packer is already done and no more instructions can be packed.\n */\n packMessageToCapacity: (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n ) => TransactionMessage & TransactionMessageWithFeePayer;\n}>;\n\n/**\n * Creates a {@link ParallelInstructionPlan} from an array of nested plans.\n *\n * It can accept {@link Instruction} objects directly, which will be wrapped\n * in {@link SingleInstructionPlan | SingleInstructionPlans} automatically.\n *\n * @example Using explicit {@link SingleInstructionPlan | SingleInstructionPlans}.\n * ```ts\n * const plan = parallelInstructionPlan([\n * singleInstructionPlan(instructionA),\n * singleInstructionPlan(instructionB),\n * ]);\n * ```\n *\n * @example Using {@link Instruction | Instructions} directly.\n * ```ts\n * const plan = parallelInstructionPlan([instructionA, instructionB]);\n * ```\n *\n * @see {@link ParallelInstructionPlan}\n */\nexport function parallelInstructionPlan(plans: (Instruction | InstructionPlan)[]): ParallelInstructionPlan {\n return Object.freeze({\n kind: 'parallel',\n plans: parseSingleInstructionPlans(plans),\n });\n}\n\n/**\n * Creates a divisible {@link SequentialInstructionPlan} from an array of nested plans.\n *\n * It can accept {@link Instruction} objects directly, which will be wrapped\n * in {@link SingleInstructionPlan | SingleInstructionPlans} automatically.\n *\n * @example Using explicit {@link SingleInstructionPlan | SingleInstructionPlans}.\n * ```ts\n * const plan = sequentialInstructionPlan([\n * singleInstructionPlan(instructionA),\n * singleInstructionPlan(instructionB),\n * ]);\n * ```\n *\n * @example Using {@link Instruction | Instructions} directly.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB]);\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n */\nexport function sequentialInstructionPlan(\n plans: (Instruction | InstructionPlan)[],\n): SequentialInstructionPlan & { divisible: true } {\n return Object.freeze({\n divisible: true,\n kind: 'sequential',\n plans: parseSingleInstructionPlans(plans),\n });\n}\n\n/**\n * Creates a non-divisible {@link SequentialInstructionPlan} from an array of nested plans.\n *\n * It can accept {@link Instruction} objects directly, which will be wrapped\n * in {@link SingleInstructionPlan | SingleInstructionPlans} automatically.\n *\n * @example Using explicit {@link SingleInstructionPlan | SingleInstructionPlans}.\n * ```ts\n * const plan = nonDivisibleSequentialInstructionPlan([\n * singleInstructionPlan(instructionA),\n * singleInstructionPlan(instructionB),\n * ]);\n * ```\n *\n * @example Using {@link Instruction | Instructions} directly.\n * ```ts\n * const plan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n */\nexport function nonDivisibleSequentialInstructionPlan(\n plans: (Instruction | InstructionPlan)[],\n): SequentialInstructionPlan & { divisible: false } {\n return Object.freeze({\n divisible: false,\n kind: 'sequential',\n plans: parseSingleInstructionPlans(plans),\n });\n}\n\n/**\n * Creates a {@link SingleInstructionPlan} from an {@link Instruction} object.\n *\n * @example\n * ```ts\n * const plan = singleInstructionPlan(instructionA);\n * ```\n *\n * @see {@link SingleInstructionPlan}\n */\nexport function singleInstructionPlan(instruction: Instruction): SingleInstructionPlan {\n return Object.freeze({ instruction, kind: 'single' });\n}\n\nfunction parseSingleInstructionPlans(plans: (Instruction | InstructionPlan)[]): InstructionPlan[] {\n return plans.map(plan => ('kind' in plan ? plan : singleInstructionPlan(plan)));\n}\n\n/**\n * Checks if the given instruction plan is a {@link SingleInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a single instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = singleInstructionPlan(myInstruction);\n *\n * if (isSingleInstructionPlan(plan)) {\n * console.log(plan.instruction); // TypeScript knows this is a SingleInstructionPlan.\n * }\n * ```\n *\n * @see {@link SingleInstructionPlan}\n * @see {@link assertIsSingleInstructionPlan}\n */\nexport function isSingleInstructionPlan(plan: InstructionPlan): plan is SingleInstructionPlan {\n return plan.kind === 'single';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link SingleInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a single instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = singleInstructionPlan(myInstruction);\n *\n * assertIsSingleInstructionPlan(plan);\n * console.log(plan.instruction); // TypeScript knows this is a SingleInstructionPlan.\n * ```\n *\n * @see {@link SingleInstructionPlan}\n * @see {@link isSingleInstructionPlan}\n */\nexport function assertIsSingleInstructionPlan(plan: InstructionPlan): asserts plan is SingleInstructionPlan {\n if (!isSingleInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'single',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a {@link MessagePackerInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a message packer instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = getLinearMessagePackerInstructionPlan({ /* ... *\\/ });\n *\n * if (isMessagePackerInstructionPlan(plan)) {\n * const packer = plan.getMessagePacker(); // TypeScript knows this is a MessagePackerInstructionPlan.\n * }\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n * @see {@link assertIsMessagePackerInstructionPlan}\n */\nexport function isMessagePackerInstructionPlan(plan: InstructionPlan): plan is MessagePackerInstructionPlan {\n return plan.kind === 'messagePacker';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link MessagePackerInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a message packer instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = getLinearMessagePackerInstructionPlan({ /* ... *\\/ });\n *\n * assertIsMessagePackerInstructionPlan(plan);\n * const packer = plan.getMessagePacker(); // TypeScript knows this is a MessagePackerInstructionPlan.\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n * @see {@link isMessagePackerInstructionPlan}\n */\nexport function assertIsMessagePackerInstructionPlan(\n plan: InstructionPlan,\n): asserts plan is MessagePackerInstructionPlan {\n if (!isMessagePackerInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'messagePacker',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a {@link SequentialInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a sequential instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = sequentialInstructionPlan([instructionA, instructionB]);\n *\n * if (isSequentialInstructionPlan(plan)) {\n * console.log(plan.divisible); // TypeScript knows this is a SequentialInstructionPlan.\n * }\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link assertIsSequentialInstructionPlan}\n */\nexport function isSequentialInstructionPlan(plan: InstructionPlan): plan is SequentialInstructionPlan {\n return plan.kind === 'sequential';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link SequentialInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a sequential instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = sequentialInstructionPlan([instructionA, instructionB]);\n *\n * assertIsSequentialInstructionPlan(plan);\n * console.log(plan.divisible); // TypeScript knows this is a SequentialInstructionPlan.\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link isSequentialInstructionPlan}\n */\nexport function assertIsSequentialInstructionPlan(plan: InstructionPlan): asserts plan is SequentialInstructionPlan {\n if (!isSequentialInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'sequential',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a non-divisible {@link SequentialInstructionPlan}.\n *\n * A non-divisible sequential plan requires all its instructions to be executed\n * atomically — either in a single transaction or in a transaction bundle.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a non-divisible sequential instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n *\n * if (isNonDivisibleSequentialInstructionPlan(plan)) {\n * // All instructions must be executed atomically.\n * }\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link assertIsNonDivisibleSequentialInstructionPlan}\n */\nexport function isNonDivisibleSequentialInstructionPlan(\n plan: InstructionPlan,\n): plan is SequentialInstructionPlan & { divisible: false } {\n return plan.kind === 'sequential' && plan.divisible === false;\n}\n\n/**\n * Asserts that the given instruction plan is a non-divisible {@link SequentialInstructionPlan}.\n *\n * A non-divisible sequential plan requires all its instructions to be executed\n * atomically — either in a single transaction or in a transaction bundle.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a non-divisible sequential instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n *\n * assertIsNonDivisibleSequentialInstructionPlan(plan);\n * // All instructions must be executed atomically.\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link isNonDivisibleSequentialInstructionPlan}\n */\nexport function assertIsNonDivisibleSequentialInstructionPlan(\n plan: InstructionPlan,\n): asserts plan is SequentialInstructionPlan & { divisible: false } {\n if (!isNonDivisibleSequentialInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind === 'sequential' ? 'divisible sequential' : plan.kind,\n expectedKind: 'non-divisible sequential',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a {@link ParallelInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a parallel instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = parallelInstructionPlan([instructionA, instructionB]);\n *\n * if (isParallelInstructionPlan(plan)) {\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelInstructionPlan.\n * }\n * ```\n *\n * @see {@link ParallelInstructionPlan}\n * @see {@link assertIsParallelInstructionPlan}\n */\nexport function isParallelInstructionPlan(plan: InstructionPlan): plan is ParallelInstructionPlan {\n return plan.kind === 'parallel';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link ParallelInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a parallel instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = parallelInstructionPlan([instructionA, instructionB]);\n *\n * assertIsParallelInstructionPlan(plan);\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelInstructionPlan.\n * ```\n *\n * @see {@link ParallelInstructionPlan}\n * @see {@link isParallelInstructionPlan}\n */\nexport function assertIsParallelInstructionPlan(plan: InstructionPlan): asserts plan is ParallelInstructionPlan {\n if (!isParallelInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'parallel',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Finds the first instruction plan in the tree that matches the given predicate.\n *\n * This function performs a depth-first search through the instruction plan tree,\n * returning the first plan that satisfies the predicate. It checks the root plan\n * first, then recursively searches through nested plans.\n *\n * @param instructionPlan - The instruction plan tree to search.\n * @param predicate - A function that returns `true` for the plan to find.\n * @returns The first matching instruction plan, or `undefined` if no match is found.\n *\n * @example\n * Finding a non-divisible sequential plan.\n * ```ts\n * const plan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * nonDivisibleSequentialInstructionPlan([instructionC, instructionD]),\n * ]);\n *\n * const nonDivisible = findInstructionPlan(\n * plan,\n * (p) => p.kind === 'sequential' && !p.divisible,\n * );\n * // Returns the non-divisible sequential plan containing instructionC and instructionD.\n * ```\n *\n * @example\n * Finding a specific single instruction plan.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB, instructionC]);\n *\n * const found = findInstructionPlan(\n * plan,\n * (p) => p.kind === 'single' && p.instruction === instructionB,\n * );\n * // Returns the SingleInstructionPlan wrapping instructionB.\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link everyInstructionPlan}\n * @see {@link transformInstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function findInstructionPlan(\n instructionPlan: InstructionPlan,\n predicate: (plan: InstructionPlan) => boolean,\n): InstructionPlan | undefined {\n if (predicate(instructionPlan)) {\n return instructionPlan;\n }\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return undefined;\n }\n for (const subPlan of instructionPlan.plans) {\n const foundPlan = findInstructionPlan(subPlan, predicate);\n if (foundPlan) {\n return foundPlan;\n }\n }\n return undefined;\n}\n\n/**\n * Checks if every instruction plan in the tree satisfies the given predicate.\n *\n * This function performs a depth-first traversal through the instruction plan tree,\n * returning `true` only if the predicate returns `true` for every plan in the tree\n * (including the root plan and all nested plans).\n *\n * @param instructionPlan - The instruction plan tree to check.\n * @param predicate - A function that returns `true` if the plan satisfies the condition.\n * @return `true` if every plan in the tree satisfies the predicate, `false` otherwise.\n *\n * @example\n * Checking if all plans are divisible.\n * ```ts\n * const plan = sequentialInstructionPlan([\n * parallelInstructionPlan([instructionA, instructionB]),\n * sequentialInstructionPlan([instructionC, instructionD]),\n * ]);\n *\n * const allDivisible = everyInstructionPlan(\n * plan,\n * (p) => p.kind !== 'sequential' || p.divisible,\n * );\n * // Returns true because all sequential plans are divisible.\n * ```\n *\n * @example\n * Checking if all single instructions use a specific program.\n * ```ts\n * const plan = parallelInstructionPlan([instructionA, instructionB, instructionC]);\n *\n * const allUseSameProgram = everyInstructionPlan(\n * plan,\n * (p) => p.kind !== 'single' || p.instruction.programAddress === myProgramAddress,\n * );\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link findInstructionPlan}\n * @see {@link transformInstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function everyInstructionPlan(\n instructionPlan: InstructionPlan,\n predicate: (plan: InstructionPlan) => boolean,\n): boolean {\n if (!predicate(instructionPlan)) {\n return false;\n }\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return true;\n }\n return instructionPlan.plans.every(p => everyInstructionPlan(p, predicate));\n}\n\n/**\n * Transforms an instruction plan tree using a bottom-up approach.\n *\n * This function recursively traverses the instruction plan tree, applying the\n * transformation function to each plan. The transformation is applied bottom-up,\n * meaning nested plans are transformed first, then the parent plans receive\n * the already-transformed children before being transformed themselves.\n *\n * All transformed plans are frozen using `Object.freeze` to ensure immutability.\n *\n * @param instructionPlan - The instruction plan tree to transform.\n * @param fn - A function that transforms each plan and returns a new plan.\n * @return A new transformed instruction plan tree.\n *\n * @example\n * Making all sequential plans non-divisible to ensure atomicity.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB]);\n *\n * const transformed = transformInstructionPlan(plan, (p) => {\n * if (p.kind === 'sequential' && p.divisible) {\n * return nonDivisibleSequentialInstructionPlan(p.plans);\n * }\n * return p;\n * });\n * ```\n *\n * @example\n * Filtering out debug instructions before production execution.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, debugInstruction, instructionB]);\n *\n * const transformed = transformInstructionPlan(plan, (p) => {\n * if (p.kind === 'sequential' || p.kind === 'parallel') {\n * return { ...p, plans: p.plans.filter((p) => !isDebugInstruction(p)) };\n * }\n * return p;\n * });\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link findInstructionPlan}\n * @see {@link everyInstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function transformInstructionPlan(\n instructionPlan: InstructionPlan,\n fn: (plan: InstructionPlan) => InstructionPlan,\n): InstructionPlan {\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return Object.freeze(fn(instructionPlan));\n }\n return Object.freeze(\n fn(\n Object.freeze({\n ...instructionPlan,\n plans: instructionPlan.plans.map(p => transformInstructionPlan(p, fn)),\n }),\n ),\n );\n}\n\n/**\n * Retrieves all individual {@link SingleInstructionPlan} and {@link MessagePackerInstructionPlan}\n * instances from an instruction plan tree.\n *\n * This function recursively traverses any nested structure of instruction plans and extracts\n * all the leaf plans they contain. It's useful when you need to access all the individual\n * instructions or message packers that will be executed, regardless of their organization\n * in the plan tree (parallel or sequential).\n *\n * @param instructionPlan - The instruction plan to extract leaf plans from\n * @returns An array of all single and message packer instruction plans contained in the tree\n *\n * @example\n * ```ts\n * const plan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * nonDivisibleSequentialInstructionPlan([instructionC, instructionD]),\n * instructionE,\n * ]);\n *\n * const leafPlans = flattenInstructionPlan(plan);\n * // Array of `SingleInstructionPlan` containing:\n * // instructionA, instructionB, instructionC, instructionD and instructionE.\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link findInstructionPlan}\n * @see {@link everyInstructionPlan}\n * @see {@link transformInstructionPlan}\n */\nexport function flattenInstructionPlan(\n instructionPlan: InstructionPlan,\n): (MessagePackerInstructionPlan | SingleInstructionPlan)[] {\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return [instructionPlan];\n }\n return instructionPlan.plans.flatMap(flattenInstructionPlan);\n}\n\n/**\n * Creates a {@link MessagePackerInstructionPlan} that packs instructions\n * such that each instruction consumes as many bytes as possible from the given\n * `totalLength` while still being able to fit into the given transaction messages.\n *\n * This is particularly useful for instructions that write data to accounts and must\n * span multiple transactions due to their size limit.\n *\n * This message packer will first call `getInstruction` with a length of zero to\n * determine the base size of the instruction before figuring out how many\n * additional bytes can be packed into the transaction message. That remaining space\n * will then be used to call `getInstruction` again with the appropriate length.\n *\n * @param getInstruction - A function that returns an instruction for a given offset and length.\n * @param totalLength - The total length of the data to write, in bytes.\n *\n * @example\n * ```ts\n * const plan = getLinearMessagePackerInstructionPlan({\n * totalLength: dataToWrite.length,\n * getInstruction: (offset, length) =>\n * getWriteInstruction({\n * offset,\n * data: dataToWrite.slice(offset, offset + length),\n * }),\n * });\n * plan satisfies MessagePackerInstructionPlan;\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n */\nexport function getLinearMessagePackerInstructionPlan({\n getInstruction,\n totalLength: totalBytes,\n}: {\n getInstruction: (offset: number, length: number) => Instruction;\n totalLength: number;\n}): MessagePackerInstructionPlan {\n return Object.freeze({\n getMessagePacker: () => {\n let offset = 0;\n return Object.freeze({\n done: () => offset >= totalBytes,\n packMessageToCapacity: (message: TransactionMessage & TransactionMessageWithFeePayer) => {\n if (offset >= totalBytes) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE);\n }\n\n const messageSizeWithBaseInstruction = getTransactionMessageSize(\n appendTransactionMessageInstruction(getInstruction(offset, 0), message),\n );\n const freeSpace =\n TRANSACTION_SIZE_LIMIT -\n messageSizeWithBaseInstruction /* Includes the base instruction (length: 0). */ -\n 1; /* Leeway for shortU16 numbers in transaction headers. */\n\n if (freeSpace <= 0) {\n const messageSize = getTransactionMessageSize(message);\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, {\n // (+1) We need to pack at least one byte of data otherwise\n // there is no point packing the base instruction alone.\n numBytesRequired: messageSizeWithBaseInstruction - messageSize + 1,\n // (-1) Leeway for shortU16 numbers in transaction headers.\n numFreeBytes: TRANSACTION_SIZE_LIMIT - messageSize - 1,\n });\n }\n\n const length = Math.min(totalBytes - offset, freeSpace);\n const instruction = getInstruction(offset, length);\n offset += length;\n return appendTransactionMessageInstruction(instruction, message);\n },\n });\n },\n kind: 'messagePacker',\n });\n}\n\n/**\n * Creates a {@link MessagePackerInstructionPlan} from a list of instructions.\n *\n * This can be useful to prepare a set of instructions that can be iterated over\n * — e.g. to pack a list of instructions that gradually reallocate the size of an account\n * one `REALLOC_LIMIT` (10'240 bytes) at a time.\n *\n * @example\n * ```ts\n * const plan = getMessagePackerInstructionPlanFromInstructions([\n * instructionA,\n * instructionB,\n * instructionC,\n * ]);\n *\n * const messagePacker = plan.getMessagePacker();\n * firstTransactionMessage = messagePacker.packMessageToCapacity(firstTransactionMessage);\n * // Contains instruction A and instruction B.\n * secondTransactionMessage = messagePacker.packMessageToCapacity(secondTransactionMessage);\n * // Contains instruction C.\n * messagePacker.done(); // true\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n * @see {@link getReallocMessagePackerInstructionPlan}\n */\nexport function getMessagePackerInstructionPlanFromInstructions(\n instructions: TInstruction[],\n): MessagePackerInstructionPlan {\n return Object.freeze({\n getMessagePacker: () => {\n let instructionIndex = 0;\n return Object.freeze({\n done: () => instructionIndex >= instructions.length,\n packMessageToCapacity: (message: TransactionMessage & TransactionMessageWithFeePayer) => {\n if (instructionIndex >= instructions.length) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE);\n }\n\n const originalMessageSize = getTransactionMessageSize(message);\n\n for (let index = instructionIndex; index < instructions.length; index++) {\n message = appendTransactionMessageInstruction(instructions[index], message);\n const messageSize = getTransactionMessageSize(message);\n\n if (messageSize > TRANSACTION_SIZE_LIMIT) {\n if (index === instructionIndex) {\n throw new SolanaError(\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n {\n numBytesRequired: messageSize - originalMessageSize,\n numFreeBytes: TRANSACTION_SIZE_LIMIT - originalMessageSize,\n },\n );\n }\n instructionIndex = index;\n return message;\n }\n }\n\n instructionIndex = instructions.length;\n return message;\n },\n });\n },\n kind: 'messagePacker',\n });\n}\n\nconst REALLOC_LIMIT = 10_240;\n\n/**\n * Creates a {@link MessagePackerInstructionPlan} that packs a list of realloc instructions.\n *\n * That is, it splits instruction by chunks of `REALLOC_LIMIT` (10'240) bytes until\n * the given total size is reached.\n *\n * @example\n * ```ts\n * const plan = getReallocMessagePackerInstructionPlan({\n * totalSize: additionalDataSize,\n * getInstruction: (size) => getExtendInstruction({ length: size }),\n * });\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n */\nexport function getReallocMessagePackerInstructionPlan({\n getInstruction,\n totalSize,\n}: {\n getInstruction: (size: number) => Instruction;\n totalSize: number;\n}): MessagePackerInstructionPlan {\n const numberOfInstructions = Math.ceil(totalSize / REALLOC_LIMIT);\n const lastInstructionSize = totalSize % REALLOC_LIMIT;\n const instructions = new Array(numberOfInstructions)\n .fill(0)\n .map((_, i) => getInstruction(i === numberOfInstructions - 1 ? lastInstructionSize : REALLOC_LIMIT));\n\n return getMessagePackerInstructionPlanFromInstructions(instructions);\n}\n","import { SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, SolanaError } from '@solana/errors';\nimport { type Instruction } from '@solana/instructions';\nimport {\n appendTransactionMessageInstruction,\n appendTransactionMessageInstructions,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\n\nimport { flattenInstructionPlan, InstructionPlan } from './instruction-plan';\n\n/**\n * A helper type to append instructions to a transaction message\n * without losing type information about the current instructions.\n */\n\ntype AppendTransactionMessageInstructions = ReturnType<\n typeof appendTransactionMessageInstructions\n>;\n\n/**\n * Appends all instructions from an instruction plan to a transaction message.\n *\n * This function flattens the instruction plan into its leaf plans and sequentially\n * appends each instruction to the provided transaction message. It handles both\n * single instructions and message packer plans.\n *\n * Note that any {@link MessagePackerInstructionPlan} is assumed to only append\n * instructions. If it modifies other properties of the transaction message, the\n * type of the returned transaction message may not accurately reflect those changes.\n *\n * @typeParam TTransactionMessage - The type of transaction message being modified.\n *\n * @param transactionMessage - The transaction message to append instructions to.\n * @param instructionPlan - The instruction plan containing the instructions to append.\n * @returns The transaction message with all instructions from the plan appended.\n *\n * @example\n * Appending a simple instruction plan to a transaction message.\n * ```ts\n * import { appendTransactionMessageInstructionPlan } from '@solana/instruction-plans';\n * import { createTransactionMessage, setTransactionMessageFeePayer } from '@solana/transaction-messages';\n *\n * const message = setTransactionMessageFeePayer(feePayer, createTransactionMessage({ version: 0 }));\n * const plan = singleInstructionPlan(myInstruction);\n *\n * const messageWithInstructions = appendTransactionMessageInstructionPlan(message, plan);\n * ```\n *\n * @example\n * Appending a sequential instruction plan.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB, instructionC]);\n * const messageWithInstructions = appendTransactionMessageInstructionPlan(message, plan);\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function appendTransactionMessageInstructionPlan<\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer,\n>(\n instructionPlan: InstructionPlan,\n transactionMessage: TTransactionMessage,\n): AppendTransactionMessageInstructions {\n type Out = AppendTransactionMessageInstructions;\n\n const leafInstructionPlans = flattenInstructionPlan(instructionPlan);\n\n return leafInstructionPlans.reduce(\n (messageSoFar, plan) => {\n const kind = plan.kind;\n if (kind === 'single') {\n return appendTransactionMessageInstruction(plan.instruction, messageSoFar) as unknown as Out;\n }\n if (kind === 'messagePacker') {\n const messagerPacker = plan.getMessagePacker();\n let nextMessage: Out = messageSoFar;\n while (!messagerPacker.done()) {\n nextMessage = messagerPacker.packMessageToCapacity(nextMessage) as Out;\n }\n return nextMessage;\n }\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, {\n kind,\n });\n },\n transactionMessage as unknown as Out,\n );\n}\n","import { SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, SolanaError } from '@solana/errors';\nimport { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\n/**\n * A set of transaction messages with constraints on how they can be executed.\n *\n * This is structured as a recursive tree of plans to allow for\n * parallel execution, sequential execution and combinations of both.\n *\n * Namely, the following plans are supported:\n * - {@link SingleTransactionPlan} - A plan that contains a single transaction message.\n * This is the simplest leaf in this tree.\n * - {@link ParallelTransactionPlan} - A plan that contains other plans that\n * can be executed in parallel.\n * - {@link SequentialTransactionPlan} - A plan that contains other plans that\n * must be executed sequentially. It also defines whether the plan is divisible\n * meaning that transaction messages inside it can be split into separate batches.\n *\n * Helpers are provided for each of these plans to make it easier to create them.\n *\n * @example\n * ```ts\n * const myTransactionPlan: TransactionPlan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * messageC,\n * ]);\n * ```\n *\n * @see {@link SingleTransactionPlan}\n * @see {@link ParallelTransactionPlan}\n * @see {@link SequentialTransactionPlan}\n */\nexport type TransactionPlan = ParallelTransactionPlan | SequentialTransactionPlan | SingleTransactionPlan;\n\n/**\n * A plan wrapping other plans that must be executed sequentially.\n *\n * It also defines whether nested plans are divisible — meaning that\n * the transaction messages inside them can be split into separate batches.\n * When `divisible` is `false`, the transaction messages inside the plan should\n * all be executed atomically — usually in a transaction bundle.\n *\n * You may use the {@link sequentialTransactionPlan} and {@link nonDivisibleSequentialTransactionPlan}\n * helpers to create objects of this type.\n *\n * @example\n * Simple sequential plan with two transaction messages.\n * ```ts\n * const plan = sequentialTransactionPlan([messageA, messageB]);\n * plan satisfies SequentialTransactionPlan;\n * ```\n *\n * @example\n * Non-divisible sequential plan with two transaction messages.\n * ```ts\n * const plan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n * plan satisfies SequentialTransactionPlan & { divisible: false };\n * ```\n *\n * @example\n * Sequential plan with nested parallel plans.\n * Here, messages A and B can be executed in parallel, but they must both be finalized\n * before messages C and D can be sent — which can also be executed in parallel.\n * ```ts\n * const plan = sequentialTransactionPlan([\n * parallelTransactionPlan([messageA, messageB]),\n * parallelTransactionPlan([messageC, messageD]),\n * ]);\n * ```\n *\n * @see {@link sequentialTransactionPlan}\n * @see {@link nonDivisibleSequentialTransactionPlan}\n */\nexport type SequentialTransactionPlan = Readonly<{\n divisible: boolean;\n kind: 'sequential';\n plans: TransactionPlan[];\n}>;\n\n/**\n * A plan wrapping other plans that can be executed in parallel.\n *\n * This means direct children of this plan can be executed in separate\n * parallel transactions without causing any side effects.\n * However, the children themselves can define additional constraints\n * for that specific branch of the tree — such as the {@link SequentialTransactionPlan}.\n *\n * You may use the {@link parallelTransactionPlan} helper to create objects of this type.\n *\n * @example\n * Simple parallel plan with two transaction messages.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB]);\n * plan satisfies ParallelTransactionPlan;\n * ```\n *\n * @example\n * Parallel plan with nested sequential plans.\n * Here, messages A and B must be executed sequentially and so must messages C and D,\n * but both pairs can be executed in parallel.\n * ```ts\n * const plan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * sequentialTransactionPlan([messageC, messageD]),\n * ]);\n * plan satisfies ParallelTransactionPlan;\n * ```\n *\n * @see {@link parallelTransactionPlan}\n */\nexport type ParallelTransactionPlan = Readonly<{\n kind: 'parallel';\n plans: TransactionPlan[];\n}>;\n\n/**\n * A plan that contains a single transaction message.\n *\n * This is a simple transaction message wrapper that transforms a message into a plan.\n *\n * You may use the {@link singleTransactionPlan} helper to create objects of this type.\n *\n * @example\n * ```ts\n * const plan = singleTransactionPlan(transactionMessage);\n * plan satisfies SingleTransactionPlan;\n * ```\n *\n * @see {@link singleTransactionPlan}\n */\nexport type SingleTransactionPlan<\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n> = Readonly<{\n kind: 'single';\n message: TTransactionMessage;\n}>;\n\n/**\n * Creates a {@link ParallelTransactionPlan} from an array of nested plans.\n *\n * It can accept {@link TransactionMessage} objects directly, which will be wrapped\n * in {@link SingleTransactionPlan | SingleTransactionPlans} automatically.\n *\n * @example\n * Using explicit {@link SingleTransactionPlan | SingleTransactionPlans}.\n * ```ts\n * const plan = parallelTransactionPlan([\n * singleTransactionPlan(messageA),\n * singleTransactionPlan(messageB),\n * ]);\n * ```\n *\n * @example\n * Using {@link TransactionMessage | TransactionMessages} directly.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB]);\n * ```\n *\n * @see {@link ParallelTransactionPlan}\n */\nexport function parallelTransactionPlan(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): ParallelTransactionPlan {\n return Object.freeze({ kind: 'parallel', plans: parseSingleTransactionPlans(plans) });\n}\n\n/**\n * Creates a divisible {@link SequentialTransactionPlan} from an array of nested plans.\n *\n * It can accept {@link TransactionMessage} objects directly, which will be wrapped\n * in {@link SingleTransactionPlan | SingleTransactionPlans} automatically.\n *\n * @example\n * Using explicit {@link SingleTransactionPlan | SingleTransactionPlans}.\n * ```ts\n * const plan = sequentialTransactionPlan([\n * singleTransactionPlan(messageA),\n * singleTransactionPlan(messageB),\n * ]);\n * ```\n *\n * @example\n * Using {@link TransactionMessage | TransactionMessages} directly.\n * ```ts\n * const plan = sequentialTransactionPlan([messageA, messageB]);\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n */\nexport function sequentialTransactionPlan(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): SequentialTransactionPlan & { divisible: true } {\n return Object.freeze({ divisible: true, kind: 'sequential', plans: parseSingleTransactionPlans(plans) });\n}\n\n/**\n * Creates a non-divisible {@link SequentialTransactionPlan} from an array of nested plans.\n *\n * It can accept {@link TransactionMessage} objects directly, which will be wrapped\n * in {@link SingleTransactionPlan | SingleTransactionPlans} automatically.\n *\n * @example\n * Using explicit {@link SingleTransactionPlan | SingleTransactionPlans}.\n * ```ts\n * const plan = nonDivisibleSequentialTransactionPlan([\n * singleTransactionPlan(messageA),\n * singleTransactionPlan(messageB),\n * ]);\n * ```\n *\n * @example\n * Using {@link TransactionMessage | TransactionMessages} directly.\n * ```ts\n * const plan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n */\nexport function nonDivisibleSequentialTransactionPlan(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): SequentialTransactionPlan & { divisible: false } {\n return Object.freeze({ divisible: false, kind: 'sequential', plans: parseSingleTransactionPlans(plans) });\n}\n\n/**\n * Creates a {@link SingleTransactionPlan} from a {@link TransactionMessage} object.\n *\n * @example\n * ```ts\n * const plan = singleTransactionPlan(transactionMessage);\n * plan satisfies SingleTransactionPlan;\n * ```\n *\n * @see {@link SingleTransactionPlan}\n */\nexport function singleTransactionPlan<\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage): SingleTransactionPlan {\n return Object.freeze({ kind: 'single', message: transactionMessage });\n}\n\nfunction parseSingleTransactionPlans(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): TransactionPlan[] {\n return plans.map(plan => ('kind' in plan ? plan : singleTransactionPlan(plan)));\n}\n\n/**\n * Checks if the given transaction plan is a {@link SingleTransactionPlan}.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a single transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = singleTransactionPlan(transactionMessage);\n *\n * if (isSingleTransactionPlan(plan)) {\n * console.log(plan.message); // TypeScript knows this is a SingleTransactionPlan.\n * }\n * ```\n *\n * @see {@link SingleTransactionPlan}\n * @see {@link assertIsSingleTransactionPlan}\n */\nexport function isSingleTransactionPlan(plan: TransactionPlan): plan is SingleTransactionPlan {\n return plan.kind === 'single';\n}\n\n/**\n * Asserts that the given transaction plan is a {@link SingleTransactionPlan}.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a single transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = singleTransactionPlan(transactionMessage);\n *\n * assertIsSingleTransactionPlan(plan);\n * console.log(plan.message); // TypeScript knows this is a SingleTransactionPlan.\n * ```\n *\n * @see {@link SingleTransactionPlan}\n * @see {@link isSingleTransactionPlan}\n */\nexport function assertIsSingleTransactionPlan(plan: TransactionPlan): asserts plan is SingleTransactionPlan {\n if (!isSingleTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'single',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan is a {@link SequentialTransactionPlan}.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a sequential transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = sequentialTransactionPlan([messageA, messageB]);\n *\n * if (isSequentialTransactionPlan(plan)) {\n * console.log(plan.divisible); // TypeScript knows this is a SequentialTransactionPlan.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link assertIsSequentialTransactionPlan}\n */\nexport function isSequentialTransactionPlan(plan: TransactionPlan): plan is SequentialTransactionPlan {\n return plan.kind === 'sequential';\n}\n\n/**\n * Asserts that the given transaction plan is a {@link SequentialTransactionPlan}.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a sequential transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = sequentialTransactionPlan([messageA, messageB]);\n *\n * assertIsSequentialTransactionPlan(plan);\n * console.log(plan.divisible); // TypeScript knows this is a SequentialTransactionPlan.\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link isSequentialTransactionPlan}\n */\nexport function assertIsSequentialTransactionPlan(plan: TransactionPlan): asserts plan is SequentialTransactionPlan {\n if (!isSequentialTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'sequential',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan is a non-divisible {@link SequentialTransactionPlan}.\n *\n * A non-divisible sequential plan requires all its transaction messages to be executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a non-divisible sequential transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n *\n * if (isNonDivisibleSequentialTransactionPlan(plan)) {\n * // All transaction messages must be executed atomically.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link assertIsNonDivisibleSequentialTransactionPlan}\n */\nexport function isNonDivisibleSequentialTransactionPlan(\n plan: TransactionPlan,\n): plan is SequentialTransactionPlan & { divisible: false } {\n return plan.kind === 'sequential' && plan.divisible === false;\n}\n\n/**\n * Asserts that the given transaction plan is a non-divisible {@link SequentialTransactionPlan}.\n *\n * A non-divisible sequential plan requires all its transaction messages to be executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a non-divisible sequential transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n *\n * assertIsNonDivisibleSequentialTransactionPlan(plan);\n * // All transaction messages must be executed atomically.\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link isNonDivisibleSequentialTransactionPlan}\n */\nexport function assertIsNonDivisibleSequentialTransactionPlan(\n plan: TransactionPlan,\n): asserts plan is SequentialTransactionPlan & { divisible: false } {\n if (!isNonDivisibleSequentialTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind === 'sequential' ? 'divisible sequential' : plan.kind,\n expectedKind: 'non-divisible sequential',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan is a {@link ParallelTransactionPlan}.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a parallel transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = parallelTransactionPlan([messageA, messageB]);\n *\n * if (isParallelTransactionPlan(plan)) {\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelTransactionPlan.\n * }\n * ```\n *\n * @see {@link ParallelTransactionPlan}\n * @see {@link assertIsParallelTransactionPlan}\n */\nexport function isParallelTransactionPlan(plan: TransactionPlan): plan is ParallelTransactionPlan {\n return plan.kind === 'parallel';\n}\n\n/**\n * Asserts that the given transaction plan is a {@link ParallelTransactionPlan}.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a parallel transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = parallelTransactionPlan([messageA, messageB]);\n *\n * assertIsParallelTransactionPlan(plan);\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelTransactionPlan.\n * ```\n *\n * @see {@link ParallelTransactionPlan}\n * @see {@link isParallelTransactionPlan}\n */\nexport function assertIsParallelTransactionPlan(plan: TransactionPlan): asserts plan is ParallelTransactionPlan {\n if (!isParallelTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'parallel',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * @deprecated Use {@link flattenTransactionPlan} instead.\n */\nexport const getAllSingleTransactionPlans = flattenTransactionPlan;\n\n/**\n * Retrieves all individual {@link SingleTransactionPlan} instances from a transaction plan tree.\n *\n * This function recursively traverses any nested structure of transaction plans and extracts\n * all the single transaction plans they contain. It's useful when you need to access all\n * the actual transaction messages that will be executed, regardless of their organization\n * in the plan tree (parallel or sequential).\n *\n * @param transactionPlan - The transaction plan to extract single plans from\n * @returns An array of all single transaction plans contained in the tree\n *\n * @example\n * ```ts\n * const plan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * nonDivisibleSequentialTransactionPlan([messageC, messageD]),\n * messageE,\n * ]);\n *\n * const singlePlans = flattenTransactionPlan(plan);\n * // Array of `SingleTransactionPlan` containing:\n * // messageA, messageB, messageC and messageD.\n *\n * @see {@link TransactionPlan}\n * @see {@link findTransactionPlan}\n * @see {@link everyTransactionPlan}\n * @see {@link transformTransactionPlan}\n * ```\n */\nexport function flattenTransactionPlan(transactionPlan: TransactionPlan): SingleTransactionPlan[] {\n if (transactionPlan.kind === 'single') {\n return [transactionPlan];\n }\n return transactionPlan.plans.flatMap(flattenTransactionPlan);\n}\n\n/**\n * Finds the first transaction plan in the tree that matches the given predicate.\n *\n * This function performs a depth-first search through the transaction plan tree,\n * returning the first plan that satisfies the predicate. It checks the root plan\n * first, then recursively searches through nested plans.\n *\n * @param transactionPlan - The transaction plan tree to search.\n * @param predicate - A function that returns `true` for the plan to find.\n * @return The first matching transaction plan, or `undefined` if no match is found.\n *\n * @example\n * Finding a non-divisible sequential plan.\n * ```ts\n * const plan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * nonDivisibleSequentialTransactionPlan([messageC, messageD]),\n * ]);\n *\n * const nonDivisible = findTransactionPlan(\n * plan,\n * (p) => p.kind === 'sequential' && !p.divisible,\n * );\n * // Returns the non-divisible sequential plan containing messageC and messageD.\n * ```\n *\n * @example\n * Finding a specific single transaction plan.\n * ```ts\n * const plan = sequentialTransactionPlan([messageA, messageB, messageC]);\n *\n * const found = findTransactionPlan(\n * plan,\n * (p) => p.kind === 'single' && p.message === messageB,\n * );\n * // Returns the SingleTransactionPlan wrapping messageB.\n * ```\n *\n * @see {@link TransactionPlan}\n * @see {@link everyTransactionPlan}\n * @see {@link transformTransactionPlan}\n * @see {@link flattenTransactionPlan}\n */\nexport function findTransactionPlan(\n transactionPlan: TransactionPlan,\n predicate: (plan: TransactionPlan) => boolean,\n): TransactionPlan | undefined {\n if (predicate(transactionPlan)) {\n return transactionPlan;\n }\n if (transactionPlan.kind === 'single') {\n return undefined;\n }\n for (const subPlan of transactionPlan.plans) {\n const foundPlan = findTransactionPlan(subPlan, predicate);\n if (foundPlan) {\n return foundPlan;\n }\n }\n return undefined;\n}\n\n/**\n * Checks if every transaction plan in the tree satisfies the given predicate.\n *\n * This function performs a depth-first traversal through the transaction plan tree,\n * returning `true` only if the predicate returns `true` for every plan in the tree\n * (including the root plan and all nested plans).\n *\n * @param transactionPlan - The transaction plan tree to check.\n * @param predicate - A function that returns `true` if the plan satisfies the condition.\n * @return `true` if every plan in the tree satisfies the predicate, `false` otherwise.\n *\n * @example\n * Checking if all plans are divisible.\n * ```ts\n * const plan = sequentialTransactionPlan([\n * parallelTransactionPlan([messageA, messageB]),\n * sequentialTransactionPlan([messageC, messageD]),\n * ]);\n *\n * const allDivisible = everyTransactionPlan(\n * plan,\n * (p) => p.kind !== 'sequential' || p.divisible,\n * );\n * // Returns true because all sequential plans are divisible.\n * ```\n *\n * @example\n * Checking if all single plans have a specific fee payer.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB, messageC]);\n *\n * const allUseSameFeePayer = everyTransactionPlan(\n * plan,\n * (p) => p.kind !== 'single' || p.message.feePayer.address === myFeePayer,\n * );\n * ```\n *\n * @see {@link TransactionPlan}\n * @see {@link findTransactionPlan}\n * @see {@link transformTransactionPlan}\n * @see {@link flattenTransactionPlan}\n */\nexport function everyTransactionPlan(\n transactionPlan: TransactionPlan,\n predicate: (plan: TransactionPlan) => boolean,\n): boolean {\n if (!predicate(transactionPlan)) {\n return false;\n }\n if (transactionPlan.kind === 'single') {\n return true;\n }\n return transactionPlan.plans.every(p => everyTransactionPlan(p, predicate));\n}\n\n/**\n * Transforms a transaction plan tree using a bottom-up approach.\n *\n * This function recursively traverses the transaction plan tree, applying the\n * transformation function to each plan. The transformation is applied bottom-up,\n * meaning nested plans are transformed first, then the parent plans receive\n * the already-transformed children before being transformed themselves.\n *\n * All transformed plans are frozen using `Object.freeze` to ensure immutability.\n *\n * @param transactionPlan - The transaction plan tree to transform.\n * @param fn - A function that transforms each plan and returns a new plan.\n * @return A new transformed transaction plan tree.\n *\n * @example\n * Removing parallelism by converting parallel plans to sequential.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB, messageC]);\n *\n * const transformed = transformTransactionPlan(plan, (p) => {\n * if (p.kind === 'parallel') {\n * return sequentialTransactionPlan(p.plans);\n * }\n * return p;\n * });\n * ```\n *\n * @example\n * Updating the fee payer on all transaction messages.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB]);\n *\n * const transformed = transformTransactionPlan(plan, (p) => {\n * if (p.kind === 'single') {\n * return singleTransactionPlan({ ...p.message, feePayer: newFeePayer });\n * }\n * return p;\n * });\n * ```\n *\n * @see {@link TransactionPlan}\n * @see {@link findTransactionPlan}\n * @see {@link everyTransactionPlan}\n * @see {@link flattenTransactionPlan}\n */\nexport function transformTransactionPlan(\n transactionPlan: TransactionPlan,\n fn: (plan: TransactionPlan) => TransactionPlan,\n): TransactionPlan {\n if (transactionPlan.kind === 'single') {\n return Object.freeze(fn(transactionPlan));\n }\n return Object.freeze(\n fn(\n Object.freeze({\n ...transactionPlan,\n plans: transactionPlan.plans.map(p => transformTransactionPlan(p, fn)),\n }),\n ),\n );\n}\n","import {\n SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT,\n SolanaError,\n} from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\nimport { getSignatureFromTransaction, Transaction } from '@solana/transactions';\n\n/**\n * The result of executing a transaction plan.\n *\n * This is structured as a recursive tree of results that mirrors the structure\n * of the original transaction plan, capturing the execution status at each level.\n *\n * Namely, the following result types are supported:\n * - {@link SingleTransactionPlanResult} - A result for a single transaction message\n * containing its execution status.\n * - {@link ParallelTransactionPlanResult} - A result containing other results that\n * were executed in parallel.\n * - {@link SequentialTransactionPlanResult} - A result containing other results that\n * were executed sequentially. It also retains the divisibility property from the\n * original plan.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TSingle - The type of single transaction plan results in this tree\n *\n * @see {@link SingleTransactionPlanResult}\n * @see {@link ParallelTransactionPlanResult}\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link TransactionPlanResultStatus}\n */\nexport type TransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TSingle extends SingleTransactionPlanResult = SingleTransactionPlanResult,\n> = ParallelTransactionPlanResult | SequentialTransactionPlanResult | TSingle;\n\n/**\n * A {@link TransactionPlanResult} where all single transaction results are successful.\n *\n * This type represents a transaction plan result tree where every\n * {@link SingleTransactionPlanResult} has a 'successful' status. It can be used\n * to ensure that an entire execution completed without any failures or cancellations.\n *\n * Note: This is different from {@link SuccessfulSingleTransactionPlanResult} which\n * represents a single successful transaction, whereas this type represents an entire\n * plan result tree (which may contain parallel/sequential structures) where all\n * leaf nodes are successful.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n *\n * @see {@link isSuccessfulTransactionPlanResult}\n * @see {@link assertIsSuccessfulTransactionPlanResult}\n * @see {@link SuccessfulSingleTransactionPlanResult}\n */\nexport type SuccessfulTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n> = TransactionPlanResult>;\n\n/** A context object that may be passed along with successful results. */\nexport type TransactionPlanResultContext = Record;\n\n/**\n * A result for a sequential transaction plan.\n *\n * This represents the execution result of a {@link SequentialTransactionPlan} and\n * contains child results that were executed sequentially. It also retains the\n * divisibility property from the original plan.\n *\n * You may use the {@link sequentialTransactionPlanResult} and\n * {@link nonDivisibleSequentialTransactionPlanResult} helpers to create objects of this type.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TSingle - The type of single transaction plan results in this tree\n *\n * @example\n * ```ts\n * const result = sequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult;\n * ```\n *\n * @example\n * Non-divisible sequential result.\n * ```ts\n * const result = nonDivisibleSequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult & { divisible: false };\n * ```\n *\n * @see {@link sequentialTransactionPlanResult}\n * @see {@link nonDivisibleSequentialTransactionPlanResult}\n */\nexport type SequentialTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TSingle extends SingleTransactionPlanResult = SingleTransactionPlanResult,\n> = Readonly<{\n divisible: boolean;\n kind: 'sequential';\n plans: TransactionPlanResult[];\n}>;\n\n/**\n * A result for a parallel transaction plan.\n *\n * This represents the execution result of a {@link ParallelTransactionPlan} and\n * contains child results that were executed in parallel.\n *\n * You may use the {@link parallelTransactionPlanResult} helper to create objects of this type.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TSingle - The type of single transaction plan results in this tree\n *\n * @example\n * ```ts\n * const result = parallelTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies ParallelTransactionPlanResult;\n * ```\n *\n * @see {@link parallelTransactionPlanResult}\n */\nexport type ParallelTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TSingle extends SingleTransactionPlanResult = SingleTransactionPlanResult,\n> = Readonly<{\n kind: 'parallel';\n plans: TransactionPlanResult[];\n}>;\n\n/**\n * A result for a single transaction plan.\n *\n * This represents the execution result of a {@link SingleTransactionPlan} and\n * contains the original transaction message along with its execution status.\n *\n * You may use the {@link successfulSingleTransactionPlanResult},\n * {@link failedSingleTransactionPlanResult}, or {@link canceledSingleTransactionPlanResult}\n * helpers to create objects of this type.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TTransactionMessage - The type of the transaction message\n *\n * @example\n * Successful result with a transaction and context.\n * ```ts\n * const result = successfulSingleTransactionPlanResult(\n * transactionMessage,\n * transaction\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @example\n * Failed result with an error.\n * ```ts\n * const result = failedSingleTransactionPlanResult(\n * transactionMessage,\n * new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE),\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @example\n * Canceled result.\n * ```ts\n * const result = canceledSingleTransactionPlanResult(transactionMessage);\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link successfulSingleTransactionPlanResult}\n * @see {@link failedSingleTransactionPlanResult}\n * @see {@link canceledSingleTransactionPlanResult}\n */\nexport type SingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n> = Readonly<{\n kind: 'single';\n message: TTransactionMessage;\n status: TransactionPlanResultStatus;\n}>;\n\n/**\n * The status of a single transaction plan execution.\n *\n * This represents the outcome of executing a single transaction message and can be one of:\n * - `successful` - The transaction was successfully executed. Contains the transaction\n * and an optional context object.\n * - `failed` - The transaction execution failed. Contains the error that caused the failure.\n * - `canceled` - The transaction execution was canceled.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n */\nexport type TransactionPlanResultStatus =\n | Readonly<{ context: TContext; kind: 'successful'; signature: Signature; transaction?: Transaction }>\n | Readonly<{ error: Error; kind: 'failed' }>\n | Readonly<{ kind: 'canceled' }>;\n\n/**\n * Creates a divisible {@link SequentialTransactionPlanResult} from an array of nested results.\n *\n * This function creates a sequential result with the `divisible` property set to `true`,\n * indicating that the nested plans were executed sequentially but could have been\n * split into separate transactions or batches.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @param plans - The child results that were executed sequentially\n *\n * @example\n * ```ts\n * const result = sequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult & { divisible: true };\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n */\nexport function sequentialTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n>(plans: TransactionPlanResult[]): SequentialTransactionPlanResult & { divisible: true } {\n return Object.freeze({ divisible: true, kind: 'sequential', plans });\n}\n\n/**\n * Creates a non-divisible {@link SequentialTransactionPlanResult} from an array of nested results.\n *\n * This function creates a sequential result with the `divisible` property set to `false`,\n * indicating that the nested plans were executed sequentially and could not have been\n * split into separate transactions or batches (e.g., they were executed as a transaction bundle).\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @param plans - The child results that were executed sequentially\n *\n * @example\n * ```ts\n * const result = nonDivisibleSequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult & { divisible: false };\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n */\nexport function nonDivisibleSequentialTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n>(plans: TransactionPlanResult[]): SequentialTransactionPlanResult & { divisible: false } {\n return Object.freeze({ divisible: false, kind: 'sequential', plans });\n}\n\n/**\n * Creates a {@link ParallelTransactionPlanResult} from an array of nested results.\n *\n * This function creates a parallel result indicating that the nested plans\n * were executed in parallel.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @param plans - The child results that were executed in parallel\n *\n * @example\n * ```ts\n * const result = parallelTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies ParallelTransactionPlanResult;\n * ```\n *\n * @see {@link ParallelTransactionPlanResult}\n */\nexport function parallelTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n>(plans: TransactionPlanResult[]): ParallelTransactionPlanResult {\n return Object.freeze({ kind: 'parallel', plans });\n}\n\n/**\n * Creates a successful {@link SingleTransactionPlanResult} from a transaction message and transaction.\n *\n * This function creates a single result with a 'successful' status, indicating that\n * the transaction was successfully executed. It also includes the original transaction\n * message, the executed transaction, and an optional context object.\n *\n * @template TContext - The type of the context object\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n * @param transaction - The successfully executed transaction\n * @param context - Optional context object to be included with the result\n *\n * @example\n * ```ts\n * const result = successfulSingleTransactionPlanResult(\n * transactionMessage,\n * transaction\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function successfulSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n transaction: Transaction,\n context?: TContext,\n): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({\n context: context ?? ({} as TContext),\n kind: 'successful',\n signature: getSignatureFromTransaction(transaction),\n transaction,\n }),\n });\n}\n\n/**\n * Creates a successful {@link SingleTransactionPlanResult} from a transaction message and signature.\n *\n * This function creates a single result with a 'successful' status, indicating that\n * the transaction was successfully executed. It also includes the original transaction\n * message, the signature of the executed transaction, and an optional context object.\n *\n * @template TContext - The type of the context object\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n * @param signature - The signature of the successfully executed transaction\n * @param context - Optional context object to be included with the result\n *\n * @example\n * ```ts\n * const result = successfulSingleTransactionPlanResult(\n * transactionMessage,\n * signature\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function successfulSingleTransactionPlanResultFromSignature<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n signature: Signature,\n context?: TContext,\n): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({ context: context ?? ({} as TContext), kind: 'successful', signature }),\n });\n}\n\n/**\n * Creates a failed {@link SingleTransactionPlanResult} from a transaction message and error.\n *\n * This function creates a single result with a 'failed' status, indicating that\n * the transaction execution failed. It includes the original transaction message\n * and the error that caused the failure.\n *\n * @template TContext - The type of the context object (not used in failed results)\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n * @param error - The error that caused the transaction to fail\n *\n * @example\n * ```ts\n * const result = failedSingleTransactionPlanResult(\n * transactionMessage,\n * new SolanaError({\n * code: 123,\n * message: 'Transaction simulation failed',\n * }),\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function failedSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage, error: Error): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({ error, kind: 'failed' }),\n });\n}\n\n/**\n * Creates a canceled {@link SingleTransactionPlanResult} from a transaction message.\n *\n * This function creates a single result with a 'canceled' status, indicating that\n * the transaction execution was canceled. It includes the original transaction message.\n *\n * @template TContext - The type of the context object (not used in canceled results)\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n *\n * @example\n * ```ts\n * const result = canceledSingleTransactionPlanResult(transactionMessage);\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function canceledSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({ kind: 'canceled' }),\n });\n}\n\n/**\n * Checks if the given transaction plan result is a {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * if (isSingleTransactionPlanResult(result)) {\n * console.log(result.status.kind); // TypeScript knows this is a SingleTransactionPlanResult.\n * }\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n * @see {@link assertIsSingleTransactionPlanResult}\n */\nexport function isSingleTransactionPlanResult(plan: TransactionPlanResult): plan is SingleTransactionPlanResult {\n return plan.kind === 'single';\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * assertIsSingleTransactionPlanResult(result);\n * console.log(result.status.kind); // TypeScript knows this is a SingleTransactionPlanResult.\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n * @see {@link isSingleTransactionPlanResult}\n */\nexport function assertIsSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SingleTransactionPlanResult {\n if (!isSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind,\n expectedKind: 'single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a successful {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a successful single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * if (isSuccessfulSingleTransactionPlanResult(result)) {\n * console.log(result.status.signature); // TypeScript knows this is a successful result.\n * }\n * ```\n *\n * @see {@link SuccessfulSingleTransactionPlanResult}\n * @see {@link assertIsSuccessfulSingleTransactionPlanResult}\n */\nexport function isSuccessfulSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SuccessfulSingleTransactionPlanResult {\n return plan.kind === 'single' && plan.status.kind === 'successful';\n}\n\n/**\n * Asserts that the given transaction plan result is a successful {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a successful single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * assertIsSuccessfulSingleTransactionPlanResult(result);\n * console.log(result.status.signature); // TypeScript knows this is a successful result.\n * ```\n *\n * @see {@link SuccessfulSingleTransactionPlanResult}\n * @see {@link isSuccessfulSingleTransactionPlanResult}\n */\nexport function assertIsSuccessfulSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SuccessfulSingleTransactionPlanResult {\n if (!isSuccessfulSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'single' ? `${plan.status.kind} single` : plan.kind,\n expectedKind: 'successful single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a failed {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a failed single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = failedSingleTransactionPlanResult(message, error);\n *\n * if (isFailedSingleTransactionPlanResult(result)) {\n * console.log(result.status.error); // TypeScript knows this is a failed result.\n * }\n * ```\n *\n * @see {@link FailedSingleTransactionPlanResult}\n * @see {@link assertIsFailedSingleTransactionPlanResult}\n */\nexport function isFailedSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is FailedSingleTransactionPlanResult {\n return plan.kind === 'single' && plan.status.kind === 'failed';\n}\n\n/**\n * Asserts that the given transaction plan result is a failed {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a failed single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = failedSingleTransactionPlanResult(message, error);\n *\n * assertIsFailedSingleTransactionPlanResult(result);\n * console.log(result.status.error); // TypeScript knows this is a failed result.\n * ```\n *\n * @see {@link FailedSingleTransactionPlanResult}\n * @see {@link isFailedSingleTransactionPlanResult}\n */\nexport function assertIsFailedSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is FailedSingleTransactionPlanResult {\n if (!isFailedSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'single' ? `${plan.status.kind} single` : plan.kind,\n expectedKind: 'failed single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a canceled {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a canceled single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = canceledSingleTransactionPlanResult(message);\n *\n * if (isCanceledSingleTransactionPlanResult(result)) {\n * console.log('Transaction was canceled'); // TypeScript knows this is a canceled result.\n * }\n * ```\n *\n * @see {@link CanceledSingleTransactionPlanResult}\n * @see {@link assertIsCanceledSingleTransactionPlanResult}\n */\nexport function isCanceledSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is CanceledSingleTransactionPlanResult {\n return plan.kind === 'single' && plan.status.kind === 'canceled';\n}\n\n/**\n * Asserts that the given transaction plan result is a canceled {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a canceled single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = canceledSingleTransactionPlanResult(message);\n *\n * assertIsCanceledSingleTransactionPlanResult(result);\n * console.log('Transaction was canceled'); // TypeScript knows this is a canceled result.\n * ```\n *\n * @see {@link CanceledSingleTransactionPlanResult}\n * @see {@link isCanceledSingleTransactionPlanResult}\n */\nexport function assertIsCanceledSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is CanceledSingleTransactionPlanResult {\n if (!isCanceledSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'single' ? `${plan.status.kind} single` : plan.kind,\n expectedKind: 'canceled single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a {@link SequentialTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a sequential transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = sequentialTransactionPlanResult([resultA, resultB]);\n *\n * if (isSequentialTransactionPlanResult(result)) {\n * console.log(result.divisible); // TypeScript knows this is a SequentialTransactionPlanResult.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link assertIsSequentialTransactionPlanResult}\n */\nexport function isSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SequentialTransactionPlanResult {\n return plan.kind === 'sequential';\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link SequentialTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a sequential transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = sequentialTransactionPlanResult([resultA, resultB]);\n *\n * assertIsSequentialTransactionPlanResult(result);\n * console.log(result.divisible); // TypeScript knows this is a SequentialTransactionPlanResult.\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link isSequentialTransactionPlanResult}\n */\nexport function assertIsSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SequentialTransactionPlanResult {\n if (!isSequentialTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind,\n expectedKind: 'sequential',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a non-divisible {@link SequentialTransactionPlanResult}.\n *\n * A non-divisible sequential result indicates that the transactions were executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a non-divisible sequential transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = nonDivisibleSequentialTransactionPlanResult([resultA, resultB]);\n *\n * if (isNonDivisibleSequentialTransactionPlanResult(result)) {\n * // Transactions were executed atomically.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link assertIsNonDivisibleSequentialTransactionPlanResult}\n */\nexport function isNonDivisibleSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SequentialTransactionPlanResult & { divisible: false } {\n return plan.kind === 'sequential' && plan.divisible === false;\n}\n\n/**\n * Asserts that the given transaction plan result is a non-divisible {@link SequentialTransactionPlanResult}.\n *\n * A non-divisible sequential result indicates that the transactions were executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a non-divisible sequential transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = nonDivisibleSequentialTransactionPlanResult([resultA, resultB]);\n *\n * assertIsNonDivisibleSequentialTransactionPlanResult(result);\n * // Transactions were executed atomically.\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link isNonDivisibleSequentialTransactionPlanResult}\n */\nexport function assertIsNonDivisibleSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SequentialTransactionPlanResult & { divisible: false } {\n if (!isNonDivisibleSequentialTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'sequential' ? 'divisible sequential' : plan.kind,\n expectedKind: 'non-divisible sequential',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a {@link ParallelTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a parallel transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([resultA, resultB]);\n *\n * if (isParallelTransactionPlanResult(result)) {\n * console.log(result.plans.length); // TypeScript knows this is a ParallelTransactionPlanResult.\n * }\n * ```\n *\n * @see {@link ParallelTransactionPlanResult}\n * @see {@link assertIsParallelTransactionPlanResult}\n */\nexport function isParallelTransactionPlanResult(plan: TransactionPlanResult): plan is ParallelTransactionPlanResult {\n return plan.kind === 'parallel';\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link ParallelTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a parallel transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([resultA, resultB]);\n *\n * assertIsParallelTransactionPlanResult(result);\n * console.log(result.plans.length); // TypeScript knows this is a ParallelTransactionPlanResult.\n * ```\n *\n * @see {@link ParallelTransactionPlanResult}\n * @see {@link isParallelTransactionPlanResult}\n */\nexport function assertIsParallelTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is ParallelTransactionPlanResult {\n if (!isParallelTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind,\n expectedKind: 'parallel',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a {@link SuccessfulTransactionPlanResult}.\n *\n * This function verifies that the entire transaction plan result tree contains only\n * successful single transaction results. It recursively checks all nested results\n * to ensure every {@link SingleTransactionPlanResult} has a 'successful' status.\n *\n * Note: This is different from {@link isSuccessfulSingleTransactionPlanResult} which\n * checks if a single result is successful. This function checks that the entire\n * plan result tree (including all nested parallel/sequential structures) contains\n * only successful transactions.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if all single transaction results in the tree are successful, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * successfulSingleTransactionPlanResult(messageB, transactionB),\n * ]);\n *\n * if (isSuccessfulTransactionPlanResult(result)) {\n * // All transactions were successful.\n * result satisfies SuccessfulTransactionPlanResult;\n * }\n * ```\n *\n * @see {@link SuccessfulTransactionPlanResult}\n * @see {@link assertIsSuccessfulTransactionPlanResult}\n * @see {@link isSuccessfulSingleTransactionPlanResult}\n */\nexport function isSuccessfulTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SuccessfulTransactionPlanResult {\n return everyTransactionPlanResult(\n plan,\n r => !isSingleTransactionPlanResult(r) || isSuccessfulSingleTransactionPlanResult(r),\n );\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link SuccessfulTransactionPlanResult}.\n *\n * This function verifies that the entire transaction plan result tree contains only\n * successful single transaction results. It throws if any {@link SingleTransactionPlanResult}\n * in the tree has a 'failed' or 'canceled' status.\n *\n * Note: This is different from {@link assertIsSuccessfulSingleTransactionPlanResult} which\n * asserts that a single result is successful. This function asserts that the entire\n * plan result tree (including all nested parallel/sequential structures) contains\n * only successful transactions.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT` if\n * any single transaction result in the tree is not successful.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * successfulSingleTransactionPlanResult(messageB, transactionB),\n * ]);\n *\n * assertIsSuccessfulTransactionPlanResult(result);\n * // All transactions were successful.\n * result satisfies SuccessfulTransactionPlanResult;\n * ```\n *\n * @see {@link SuccessfulTransactionPlanResult}\n * @see {@link isSuccessfulTransactionPlanResult}\n * @see {@link assertIsSuccessfulSingleTransactionPlanResult}\n */\nexport function assertIsSuccessfulTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SuccessfulTransactionPlanResult {\n if (!isSuccessfulTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, {\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Finds the first transaction plan result in the tree that matches the given predicate.\n *\n * This function performs a depth-first search through the transaction plan result tree,\n * returning the first result that satisfies the predicate. It checks the root result\n * first, then recursively searches through nested results.\n *\n * @param transactionPlanResult - The transaction plan result tree to search.\n * @param predicate - A function that returns `true` for the result to find.\n * @returns The first matching transaction plan result, or `undefined` if no match is found.\n *\n * @example\n * Finding a failed transaction result.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * failedSingleTransactionPlanResult(messageB, error),\n * ]);\n *\n * const failed = findTransactionPlanResult(\n * result,\n * (r) => r.kind === 'single' && r.status.kind === 'failed',\n * );\n * // Returns the failed single transaction plan result for messageB.\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link everyTransactionPlanResult}\n * @see {@link transformTransactionPlanResult}\n * @see {@link flattenTransactionPlanResult}\n */\nexport function findTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n predicate: (result: TransactionPlanResult) => boolean,\n): TransactionPlanResult | undefined {\n if (predicate(transactionPlanResult)) {\n return transactionPlanResult;\n }\n if (transactionPlanResult.kind === 'single') {\n return undefined;\n }\n for (const subResult of transactionPlanResult.plans) {\n const foundResult = findTransactionPlanResult(subResult, predicate);\n if (foundResult) {\n return foundResult;\n }\n }\n return undefined;\n}\n\n/**\n * Retrieves the first failed transaction plan result from a transaction plan result tree.\n *\n * This function searches the transaction plan result tree using a depth-first traversal\n * and returns the first single transaction result with a 'failed' status. If no failed\n * result is found, it throws a {@link SolanaError}.\n *\n * @param transactionPlanResult - The transaction plan result tree to search.\n * @return The first failed single transaction plan result.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND` if no\n * failed transaction plan result is found. The error context contains a non-enumerable\n * `transactionPlanResult` property for recovery purposes.\n *\n * @example\n * Retrieving the first failed result from a parallel execution.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * failedSingleTransactionPlanResult(messageB, error),\n * failedSingleTransactionPlanResult(messageC, anotherError),\n * ]);\n *\n * const firstFailed = getFirstFailedSingleTransactionPlanResult(result);\n * // Returns the failed result for messageB.\n * ```\n *\n * @see {@link FailedSingleTransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n */\nexport function getFirstFailedSingleTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n): FailedSingleTransactionPlanResult {\n const result = findTransactionPlanResult(\n transactionPlanResult,\n r => r.kind === 'single' && r.status.kind === 'failed',\n );\n\n if (!result) {\n // Here we want the `transactionPlanResult` to be available in the error context\n // so applications can recover but we don't want this object to be\n // serialized with the error. This is why we set it as a non-enumerable property.\n const context = {};\n Object.defineProperty(context, 'transactionPlanResult', {\n configurable: false,\n enumerable: false,\n value: transactionPlanResult,\n writable: false,\n });\n throw new SolanaError(\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n context,\n );\n }\n\n return result as FailedSingleTransactionPlanResult;\n}\n\n/**\n * Checks if every transaction plan result in the tree satisfies the given predicate.\n *\n * This function performs a depth-first traversal through the transaction plan result tree,\n * returning `true` only if the predicate returns `true` for every result in the tree\n * (including the root result and all nested results).\n *\n * @param transactionPlanResult - The transaction plan result tree to check.\n * @param predicate - A function that returns `true` if the result satisfies the condition.\n * @return `true` if every result in the tree satisfies the predicate, `false` otherwise.\n *\n * @example\n * Checking if all transactions were successful.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * successfulSingleTransactionPlanResult(messageB, transactionB),\n * ]);\n *\n * const allSuccessful = everyTransactionPlanResult(\n * result,\n * (r) => r.kind !== 'single' || r.status.kind === 'successful',\n * );\n * // Returns true because all single results are successful.\n * ```\n *\n * @example\n * Checking if no transactions were canceled.\n * ```ts\n * const result = sequentialTransactionPlanResult([resultA, resultB, resultC]);\n *\n * const noCanceled = everyTransactionPlanResult(\n * result,\n * (r) => r.kind !== 'single' || r.status.kind !== 'canceled',\n * );\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n * @see {@link transformTransactionPlanResult}\n * @see {@link flattenTransactionPlanResult}\n */\nexport function everyTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n predicate: (plan: TransactionPlanResult) => boolean,\n): boolean {\n if (!predicate(transactionPlanResult)) {\n return false;\n }\n if (transactionPlanResult.kind === 'single') {\n return true;\n }\n return transactionPlanResult.plans.every(p => everyTransactionPlanResult(p, predicate));\n}\n\n/**\n * Transforms a transaction plan result tree using a bottom-up approach.\n *\n * This function recursively traverses the transaction plan result tree, applying the\n * transformation function to each result. The transformation is applied bottom-up,\n * meaning nested results are transformed first, then the parent results receive\n * the already-transformed children before being transformed themselves.\n *\n * All transformed results are frozen using `Object.freeze` to ensure immutability.\n *\n * @param transactionPlanResult - The transaction plan result tree to transform.\n * @param fn - A function that transforms each result and returns a new result.\n * @return A new transformed transaction plan result tree.\n *\n * @example\n * Converting all canceled results to failed results.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * canceledSingleTransactionPlanResult(messageB),\n * ]);\n *\n * const transformed = transformTransactionPlanResult(result, (r) => {\n * if (r.kind === 'single' && r.status.kind === 'canceled') {\n * return failedSingleTransactionPlanResult(r.message, new Error('Execution canceled'));\n * }\n * return r;\n * });\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n * @see {@link everyTransactionPlanResult}\n * @see {@link flattenTransactionPlanResult}\n */\nexport function transformTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n fn: (plan: TransactionPlanResult) => TransactionPlanResult,\n): TransactionPlanResult {\n if (transactionPlanResult.kind === 'single') {\n return Object.freeze(fn(transactionPlanResult));\n }\n return Object.freeze(\n fn(\n Object.freeze({\n ...transactionPlanResult,\n plans: transactionPlanResult.plans.map(p => transformTransactionPlanResult(p, fn)),\n }),\n ),\n );\n}\n\n/**\n * Retrieves all individual {@link SingleTransactionPlanResult} instances from a transaction plan result tree.\n *\n * This function recursively traverses any nested structure of transaction plan results and extracts\n * all the single results they contain. It's useful when you need to access all the individual\n * transaction results, regardless of their organization in the result tree (parallel or sequential).\n *\n * @param result - The transaction plan result to extract single results from\n * @returns An array of all single transaction plan results contained in the tree\n *\n * @example\n * ```ts\n * const result = parallelTransactionPlanResult([\n * sequentialTransactionPlanResult([resultA, resultB]),\n * nonDivisibleSequentialTransactionPlanResult([resultC, resultD]),\n * resultE,\n * ]);\n *\n * const singleResults = flattenTransactionPlanResult(result);\n * // Array of `SingleTransactionPlanResult` containing:\n * // resultA, resultB, resultC, resultD and resultE.\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n * @see {@link everyTransactionPlanResult}\n * @see {@link transformTransactionPlanResult}\n */\nexport function flattenTransactionPlanResult(result: TransactionPlanResult): SingleTransactionPlanResult[] {\n if (result.kind === 'single') {\n return [result];\n }\n return result.plans.flatMap(flattenTransactionPlanResult);\n}\n\n/**\n * A {@link SingleTransactionPlanResult} with 'successful' status.\n */\nexport type SuccessfulSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n> = SingleTransactionPlanResult & { status: { kind: 'successful' } };\n\n/**\n * A {@link SingleTransactionPlanResult} with 'failed' status.\n */\nexport type FailedSingleTransactionPlanResult = SingleTransactionPlanResult & { status: { kind: 'failed' } };\n\n/**\n * A {@link SingleTransactionPlanResult} with 'canceled' status.\n */\nexport type CanceledSingleTransactionPlanResult = SingleTransactionPlanResult & { status: { kind: 'canceled' } };\n\n/**\n * A summary of a {@link TransactionPlanResult}, categorizing transactions by their execution status.\n * - `successful`: Indicates whether all transactions were successful (i.e., no failed or canceled transactions).\n * - `successfulTransactions`: An array of successful transactions, each including its signature.\n * - `failedTransactions`: An array of failed transactions, each including the error that caused the failure.\n * - `canceledTransactions`: An array of canceled transactions.\n */\nexport type TransactionPlanResultSummary = Readonly<{\n canceledTransactions: CanceledSingleTransactionPlanResult[];\n failedTransactions: FailedSingleTransactionPlanResult[];\n successful: boolean;\n successfulTransactions: SuccessfulSingleTransactionPlanResult[];\n}>;\n\n/**\n * Summarize a {@link TransactionPlanResult} into a {@link TransactionPlanResultSummary}.\n * @param result The transaction plan result to summarize\n * @returns A summary of the transaction plan result\n */\nexport function summarizeTransactionPlanResult(result: TransactionPlanResult): TransactionPlanResultSummary {\n const successfulTransactions: TransactionPlanResultSummary['successfulTransactions'] = [];\n const failedTransactions: TransactionPlanResultSummary['failedTransactions'] = [];\n const canceledTransactions: TransactionPlanResultSummary['canceledTransactions'] = [];\n\n const flattenedResults = flattenTransactionPlanResult(result);\n\n for (const singleResult of flattenedResults) {\n switch (singleResult.status.kind) {\n case 'successful': {\n successfulTransactions.push(singleResult as SuccessfulSingleTransactionPlanResult);\n break;\n }\n case 'failed': {\n failedTransactions.push(singleResult as FailedSingleTransactionPlanResult);\n break;\n }\n case 'canceled': {\n canceledTransactions.push(singleResult as CanceledSingleTransactionPlanResult);\n break;\n }\n }\n }\n\n return Object.freeze({\n canceledTransactions,\n failedTransactions,\n successful: failedTransactions.length === 0 && canceledTransactions.length === 0,\n successfulTransactions,\n });\n}\n","import {\n isSolanaError,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SolanaError,\n} from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\nimport { Transaction } from '@solana/transactions';\n\nimport type {\n ParallelTransactionPlan,\n SequentialTransactionPlan,\n SingleTransactionPlan,\n TransactionPlan,\n} from './transaction-plan';\nimport {\n canceledSingleTransactionPlanResult,\n failedSingleTransactionPlanResult,\n parallelTransactionPlanResult,\n sequentialTransactionPlanResult,\n SingleTransactionPlanResult,\n successfulSingleTransactionPlanResult,\n successfulSingleTransactionPlanResultFromSignature,\n type TransactionPlanResult,\n type TransactionPlanResultContext,\n} from './transaction-plan-result';\n\n/**\n * Executes a transaction plan and returns the execution results.\n *\n * This function traverses the transaction plan tree, executing each transaction\n * message and collecting results that mirror the structure of the original plan.\n *\n * @typeParam TContext - The type of the context object that may be passed along with successful results.\n * @param transactionPlan - The transaction plan to execute.\n * @param config - Optional configuration object that can include an `AbortSignal` to cancel execution.\n * @return A promise that resolves to the execution results.\n *\n * @see {@link TransactionPlan}\n * @see {@link TransactionPlanResult}\n * @see {@link createTransactionPlanExecutor}\n */\nexport type TransactionPlanExecutor = (\n transactionPlan: TransactionPlan,\n config?: { abortSignal?: AbortSignal },\n) => Promise>;\n\ntype ExecuteResult = {\n context?: TContext;\n} & ({ signature: Signature } | { transaction: Transaction });\n\ntype ExecuteTransactionMessage = (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n config?: { abortSignal?: AbortSignal },\n) => Promise>;\n\n/**\n * Configuration object for creating a new transaction plan executor.\n *\n * @see {@link createTransactionPlanExecutor}\n */\nexport type TransactionPlanExecutorConfig = {\n /** Called whenever a transaction message must be sent to the blockchain. */\n executeTransactionMessage: ExecuteTransactionMessage;\n};\n\n/**\n * Creates a new transaction plan executor based on the provided configuration.\n *\n * The executor will traverse the provided `TransactionPlan` sequentially or in parallel,\n * executing each transaction message using the `executeTransactionMessage` function.\n *\n * - If that function is successful, the executor will return a successful `TransactionPlanResult`\n * for that message including the transaction and any custom context.\n * - If that function throws an error, the executor will stop processing and cancel all\n * remaining transaction messages in the plan.\n * - If the `abortSignal` is triggered, the executor will immediately stop processing the plan and\n * return a `TransactionPlanResult` with the status set to `canceled`.\n *\n * @param config - Configuration object containing the transaction message executor function.\n * @return A {@link TransactionPlanExecutor} function that can execute transaction plans.\n *\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN}\n * if any transaction in the plan fails to execute. The error context contains a\n * `transactionPlanResult` property with the partial results up to the point of failure.\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED}\n * if the transaction plan contains non-divisible sequential plans, which are not\n * supported by this executor.\n *\n * @example\n * ```ts\n * const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });\n *\n * const transactionPlanExecutor = createTransactionPlanExecutor({\n * executeTransactionMessage: async (message) => {\n * const transaction = await signTransactionMessageWithSigners(message);\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * return { transaction };\n * }\n * });\n * ```\n *\n * @see {@link TransactionPlanExecutorConfig}\n */\nexport function createTransactionPlanExecutor(config: TransactionPlanExecutorConfig): TransactionPlanExecutor {\n return async (plan, { abortSignal } = {}): Promise => {\n const context: TraverseContext = {\n ...config,\n abortSignal: abortSignal,\n canceled: abortSignal?.aborted ?? false,\n };\n\n // Fail early if there are non-divisible sequential plans in the\n // transaction plan as they are not supported by this executor.\n assertDivisibleSequentialPlansOnly(plan);\n\n const cancelHandler = () => {\n context.canceled = true;\n };\n abortSignal?.addEventListener('abort', cancelHandler);\n const transactionPlanResult = await traverse(plan, context);\n abortSignal?.removeEventListener('abort', cancelHandler);\n\n if (context.canceled) {\n const abortReason = abortSignal?.aborted ? abortSignal.reason : undefined;\n const context = { cause: findErrorFromTransactionPlanResult(transactionPlanResult) ?? abortReason };\n // Here we want the `transactionPlanResult` to be available in the error context\n // so applications can create recovery plans but we don't want this object to be\n // serialized with the error. This is why we set it as a non-enumerable property.\n Object.defineProperty(context, 'transactionPlanResult', {\n configurable: false,\n enumerable: false,\n value: transactionPlanResult,\n writable: false,\n });\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, context);\n }\n\n return transactionPlanResult;\n };\n}\n\ntype TraverseContext = TransactionPlanExecutorConfig & {\n abortSignal?: AbortSignal;\n canceled: boolean;\n};\n\nasync function traverse(transactionPlan: TransactionPlan, context: TraverseContext): Promise {\n const kind = transactionPlan.kind;\n switch (kind) {\n case 'sequential':\n return await traverseSequential(transactionPlan, context);\n case 'parallel':\n return await traverseParallel(transactionPlan, context);\n case 'single':\n return await traverseSingle(transactionPlan, context);\n default:\n transactionPlan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind });\n }\n}\n\nasync function traverseSequential(\n transactionPlan: SequentialTransactionPlan,\n context: TraverseContext,\n): Promise {\n if (!transactionPlan.divisible) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED);\n }\n\n const results: TransactionPlanResult[] = [];\n\n for (const subPlan of transactionPlan.plans) {\n const result = await traverse(subPlan, context);\n results.push(result);\n }\n\n return sequentialTransactionPlanResult(results);\n}\n\nasync function traverseParallel(\n transactionPlan: ParallelTransactionPlan,\n context: TraverseContext,\n): Promise {\n const results = await Promise.all(transactionPlan.plans.map(plan => traverse(plan, context)));\n return parallelTransactionPlanResult(results);\n}\n\nasync function traverseSingle(\n transactionPlan: SingleTransactionPlan,\n context: TraverseContext,\n): Promise {\n if (context.canceled) {\n return canceledSingleTransactionPlanResult(transactionPlan.message);\n }\n\n try {\n const result = await getAbortablePromise(\n context.executeTransactionMessage(transactionPlan.message, { abortSignal: context.abortSignal }),\n context.abortSignal,\n );\n if ('transaction' in result) {\n return successfulSingleTransactionPlanResult(transactionPlan.message, result.transaction, result.context);\n } else {\n return successfulSingleTransactionPlanResultFromSignature(\n transactionPlan.message,\n result.signature,\n result.context,\n );\n }\n } catch (error) {\n context.canceled = true;\n return failedSingleTransactionPlanResult(transactionPlan.message, error as Error);\n }\n}\n\nfunction findErrorFromTransactionPlanResult(result: TransactionPlanResult): Error | undefined {\n if (result.kind === 'single') {\n return result.status.kind === 'failed' ? result.status.error : undefined;\n }\n for (const plan of result.plans) {\n const error = findErrorFromTransactionPlanResult(plan);\n if (error) {\n return error;\n }\n }\n}\n\nfunction assertDivisibleSequentialPlansOnly(transactionPlan: TransactionPlan): void {\n const kind = transactionPlan.kind;\n switch (kind) {\n case 'sequential':\n if (!transactionPlan.divisible) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED);\n }\n for (const subPlan of transactionPlan.plans) {\n assertDivisibleSequentialPlansOnly(subPlan);\n }\n return;\n case 'parallel':\n for (const subPlan of transactionPlan.plans) {\n assertDivisibleSequentialPlansOnly(subPlan);\n }\n return;\n case 'single':\n default:\n return;\n }\n}\n\n/**\n * Wraps a transaction plan execution promise to return a\n * {@link TransactionPlanResult} even on execution failure.\n *\n * When a transaction plan executor throws a\n * {@link SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN}\n * error, this helper catches it and returns the `TransactionPlanResult`\n * from the error context instead of throwing.\n *\n * This allows us to handle the result of an execution in a single unified way\n * instead of using try/catch and examine the `TransactionPlanResult` in both\n * success and failure cases.\n *\n * Any other errors are re-thrown as normal.\n *\n * @param promise - A promise returned by a transaction plan executor.\n * @return A promise that resolves to the transaction plan result, even if some transactions failed.\n *\n * @example\n * Handling failures using a single result object:\n * ```ts\n * const result = await passthroughFailedTransactionPlanExecution(\n * transactionPlanExecutor(transactionPlan)\n * );\n *\n * const summary = summarizeTransactionPlanResult(result);\n * if (summary.successful) {\n * console.log('All transactions executed successfully');\n * } else {\n * console.log(`${summary.successfulTransactions.length} succeeded`);\n * console.log(`${summary.failedTransactions.length} failed`);\n * console.log(`${summary.canceledTransactions.length} canceled`);\n * }\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link createTransactionPlanExecutor}\n * @see {@link summarizeTransactionPlanResult}\n */\nexport async function passthroughFailedTransactionPlanExecution(\n promise: Promise,\n): Promise;\nexport async function passthroughFailedTransactionPlanExecution(\n promise: Promise,\n): Promise;\nexport async function passthroughFailedTransactionPlanExecution(\n promise: Promise,\n): Promise {\n try {\n return await promise;\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN)) {\n return error.context.transactionPlanResult as TransactionPlanResult;\n }\n throw error;\n }\n}\n","import {\n isSolanaError,\n SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SolanaError,\n} from '@solana/errors';\nimport { getAbortablePromise } from '@solana/promises';\nimport {\n appendTransactionMessageInstructions,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\nimport { getTransactionMessageSize, TRANSACTION_SIZE_LIMIT } from '@solana/transactions';\n\nimport {\n InstructionPlan,\n MessagePackerInstructionPlan,\n ParallelInstructionPlan,\n SequentialInstructionPlan,\n SingleInstructionPlan,\n} from './instruction-plan';\nimport {\n flattenTransactionPlan,\n nonDivisibleSequentialTransactionPlan,\n parallelTransactionPlan,\n sequentialTransactionPlan,\n SingleTransactionPlan,\n singleTransactionPlan,\n TransactionPlan,\n} from './transaction-plan';\n\n/**\n * Plans one or more transactions according to the provided instruction plan.\n *\n * @param instructionPlan - The instruction plan to be planned and executed.\n * @param config - Optional configuration object that can include an `AbortSignal` to cancel the planning process.\n *\n * @see {@link InstructionPlan}\n * @see {@link TransactionPlan}\n */\nexport type TransactionPlanner = (\n instructionPlan: InstructionPlan,\n config?: { abortSignal?: AbortSignal },\n) => Promise;\n\ntype Mutable = { -readonly [P in keyof T]: T[P] };\n\ntype CreateTransactionMessage = (config?: {\n abortSignal?: AbortSignal;\n}) =>\n | Promise\n | (TransactionMessage & TransactionMessageWithFeePayer);\n\ntype OnTransactionMessageUpdated = (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n config?: { abortSignal?: AbortSignal },\n) =>\n | Promise\n | (TransactionMessage & TransactionMessageWithFeePayer);\n\n/**\n * Configuration object for creating a new transaction planner.\n *\n * @see {@link createTransactionPlanner}\n */\nexport type TransactionPlannerConfig = {\n /** Called whenever a new transaction message is needed. */\n createTransactionMessage: CreateTransactionMessage;\n /**\n * Called whenever a transaction message is updated — e.g. new instructions were added.\n * This function must return the updated transaction message back — even if no changes were made.\n */\n onTransactionMessageUpdated?: OnTransactionMessageUpdated;\n};\n\n/**\n * Creates a new transaction planner based on the provided configuration.\n *\n * At the very least, the `createTransactionMessage` function must be provided.\n * This function is used to create new transaction messages whenever needed.\n *\n * Additionally, the `onTransactionMessageUpdated` function can be provided\n * to update transaction messages during the planning process. This function will\n * be called whenever a transaction message is updated, e.g. when new instructions\n * are added to a transaction message. It accepts the updated transaction message\n * and must return a transaction message back, even if no changes were made.\n *\n * @example\n * ```ts\n * const transactionPlanner = createTransactionPlanner({\n * createTransactionMessage: () => pipe(\n * createTransactionMessage({ version: 0 }),\n * message => setTransactionMessageFeePayerSigner(mySigner, message),\n * )\n * });\n * ```\n *\n * @see {@link TransactionPlannerConfig}\n */\nexport function createTransactionPlanner(config: TransactionPlannerConfig): TransactionPlanner {\n return async (instructionPlan, { abortSignal } = {}): Promise => {\n const plan = await traverse(instructionPlan, {\n abortSignal,\n createTransactionMessage: config.createTransactionMessage,\n onTransactionMessageUpdated: config.onTransactionMessageUpdated ?? (msg => msg),\n parent: null,\n parentCandidates: [],\n });\n\n if (!plan) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN);\n }\n\n return freezeTransactionPlan(plan);\n };\n}\n\ntype MutableTransactionPlan = Mutable;\ntype MutableSingleTransactionPlan = Mutable;\n\ntype TraverseContext = {\n abortSignal?: AbortSignal;\n createTransactionMessage: CreateTransactionMessage;\n onTransactionMessageUpdated: OnTransactionMessageUpdated;\n parent: InstructionPlan | null;\n parentCandidates: MutableSingleTransactionPlan[];\n};\n\nasync function traverse(\n instructionPlan: InstructionPlan,\n context: TraverseContext,\n): Promise {\n context.abortSignal?.throwIfAborted();\n const kind = instructionPlan.kind;\n switch (kind) {\n case 'sequential':\n return await traverseSequential(instructionPlan, context);\n case 'parallel':\n return await traverseParallel(instructionPlan, context);\n case 'single':\n return await traverseSingle(instructionPlan, context);\n case 'messagePacker':\n return await traverseMessagePacker(instructionPlan, context);\n default:\n instructionPlan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind });\n }\n}\n\nasync function traverseSequential(\n instructionPlan: SequentialInstructionPlan,\n context: TraverseContext,\n): Promise {\n let candidate: MutableSingleTransactionPlan | null = null;\n\n // Check if the sequential plan must fit entirely in its parent candidates\n // due to constraints like being inside a parallel plan or not being divisible.\n const mustEntirelyFitInParentCandidate =\n context.parent && (context.parent.kind === 'parallel' || !instructionPlan.divisible);\n\n // If so, try to fit the entire plan inside one of the parent candidates.\n if (mustEntirelyFitInParentCandidate) {\n const candidate = await selectAndMutateCandidate(context, context.parentCandidates, message =>\n fitEntirePlanInsideMessage(instructionPlan, message),\n );\n // If that's possible, we the candidate is mutated and we can return null.\n // Otherwise, we proceed with the normal traversal and no parent candidate.\n if (candidate) {\n return null;\n }\n } else {\n // Otherwise, we can use the first parent candidate, if any,\n // since we know it must be a divisible sequential plan.\n candidate = context.parentCandidates.length > 0 ? context.parentCandidates[0] : null;\n }\n\n const transactionPlans: TransactionPlan[] = [];\n for (const plan of instructionPlan.plans) {\n const transactionPlan = await traverse(plan, {\n ...context,\n parent: instructionPlan,\n parentCandidates: candidate ? [candidate] : [],\n });\n if (transactionPlan) {\n candidate = getSequentialCandidate(transactionPlan);\n const newPlans =\n transactionPlan.kind === 'sequential' && (transactionPlan.divisible || !instructionPlan.divisible)\n ? transactionPlan.plans\n : [transactionPlan];\n transactionPlans.push(...newPlans);\n }\n }\n\n // Wrap in a sequential plan or simplify.\n if (transactionPlans.length === 1) {\n return transactionPlans[0];\n }\n if (transactionPlans.length === 0) {\n return null;\n }\n return {\n divisible: instructionPlan.divisible,\n kind: 'sequential',\n plans: transactionPlans,\n };\n}\n\nasync function traverseParallel(\n instructionPlan: ParallelInstructionPlan,\n context: TraverseContext,\n): Promise {\n const candidates: MutableSingleTransactionPlan[] = [...context.parentCandidates];\n const transactionPlans: TransactionPlan[] = [];\n\n // Reorder children so message packer plans are last.\n const sortedChildren = Array.from(instructionPlan.plans).sort(\n (a, b) => Number(a.kind === 'messagePacker') - Number(b.kind === 'messagePacker'),\n );\n\n for (const plan of sortedChildren) {\n const transactionPlan = await traverse(plan, {\n ...context,\n parent: instructionPlan,\n parentCandidates: candidates,\n });\n if (transactionPlan) {\n candidates.push(...getParallelCandidates(transactionPlan));\n const newPlans = transactionPlan.kind === 'parallel' ? transactionPlan.plans : [transactionPlan];\n transactionPlans.push(...newPlans);\n }\n }\n\n // Wrap in a parallel plan or simplify.\n if (transactionPlans.length === 1) {\n return transactionPlans[0];\n }\n if (transactionPlans.length === 0) {\n return null;\n }\n return { kind: 'parallel', plans: transactionPlans };\n}\n\nasync function traverseSingle(\n instructionPlan: SingleInstructionPlan,\n context: TraverseContext,\n): Promise {\n const predicate = (message: TransactionMessage & TransactionMessageWithFeePayer) =>\n appendTransactionMessageInstructions([instructionPlan.instruction], message);\n const candidate = await selectAndMutateCandidate(context, context.parentCandidates, predicate);\n if (candidate) {\n return null;\n }\n const message = await createNewMessage(context, predicate);\n return { kind: 'single', message };\n}\n\nasync function traverseMessagePacker(\n instructionPlan: MessagePackerInstructionPlan,\n context: TraverseContext,\n): Promise {\n const messagePacker = instructionPlan.getMessagePacker();\n const transactionPlans: SingleTransactionPlan[] = [];\n const candidates = [...context.parentCandidates];\n\n while (!messagePacker.done()) {\n const candidate = await selectAndMutateCandidate(context, candidates, messagePacker.packMessageToCapacity);\n if (!candidate) {\n const message = await createNewMessage(context, messagePacker.packMessageToCapacity);\n const newPlan: MutableSingleTransactionPlan = { kind: 'single', message };\n transactionPlans.push(newPlan);\n }\n }\n\n if (transactionPlans.length === 1) {\n return transactionPlans[0];\n }\n if (transactionPlans.length === 0) {\n return null;\n }\n if (context.parent?.kind === 'parallel') {\n return { kind: 'parallel', plans: transactionPlans };\n }\n return {\n divisible: context.parent?.kind === 'sequential' ? context.parent.divisible : true,\n kind: 'sequential',\n plans: transactionPlans,\n };\n}\n\nfunction getSequentialCandidate(latestPlan: MutableTransactionPlan): MutableSingleTransactionPlan | null {\n if (latestPlan.kind === 'single') {\n return latestPlan;\n }\n if (latestPlan.kind === 'sequential' && latestPlan.plans.length > 0) {\n return getSequentialCandidate(latestPlan.plans[latestPlan.plans.length - 1]);\n }\n return null;\n}\n\nfunction getParallelCandidates(latestPlan: TransactionPlan): MutableSingleTransactionPlan[] {\n return flattenTransactionPlan(latestPlan);\n}\n\nasync function selectAndMutateCandidate(\n context: Pick,\n candidates: MutableSingleTransactionPlan[],\n predicate: (\n message: TransactionMessage & TransactionMessageWithFeePayer,\n ) => TransactionMessage & TransactionMessageWithFeePayer,\n): Promise {\n for (const candidate of candidates) {\n try {\n const message = await getAbortablePromise(\n Promise.resolve(\n context.onTransactionMessageUpdated(predicate(candidate.message), {\n abortSignal: context.abortSignal,\n }),\n ),\n context.abortSignal,\n );\n if (getTransactionMessageSize(message) <= TRANSACTION_SIZE_LIMIT) {\n candidate.message = message;\n return candidate;\n }\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN)) {\n // Try the next candidate.\n } else {\n throw error;\n }\n }\n }\n return null;\n}\n\nasync function createNewMessage(\n context: Pick,\n predicate: (\n message: TransactionMessage & TransactionMessageWithFeePayer,\n ) => TransactionMessage & TransactionMessageWithFeePayer,\n): Promise {\n const newMessage = await getAbortablePromise(\n Promise.resolve(context.createTransactionMessage({ abortSignal: context.abortSignal })),\n context.abortSignal,\n );\n const updatedMessage = await getAbortablePromise(\n Promise.resolve(\n context.onTransactionMessageUpdated(predicate(newMessage), { abortSignal: context.abortSignal }),\n ),\n context.abortSignal,\n );\n const updatedMessageSize = getTransactionMessageSize(updatedMessage);\n if (updatedMessageSize > TRANSACTION_SIZE_LIMIT) {\n const newMessageSize = getTransactionMessageSize(newMessage);\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, {\n numBytesRequired: updatedMessageSize - newMessageSize,\n numFreeBytes: TRANSACTION_SIZE_LIMIT - newMessageSize,\n });\n }\n return updatedMessage;\n}\n\nfunction freezeTransactionPlan(plan: MutableTransactionPlan): TransactionPlan {\n const kind = plan.kind;\n switch (kind) {\n case 'single':\n return singleTransactionPlan(plan.message);\n case 'sequential':\n return plan.divisible\n ? sequentialTransactionPlan(plan.plans.map(freezeTransactionPlan))\n : nonDivisibleSequentialTransactionPlan(plan.plans.map(freezeTransactionPlan));\n case 'parallel':\n return parallelTransactionPlan(plan.plans.map(freezeTransactionPlan));\n default:\n plan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind });\n }\n}\n\nfunction fitEntirePlanInsideMessage(\n instructionPlan: InstructionPlan,\n message: TransactionMessage & TransactionMessageWithFeePayer,\n): TransactionMessage & TransactionMessageWithFeePayer {\n let newMessage: TransactionMessage & TransactionMessageWithFeePayer = message;\n\n const kind = instructionPlan.kind;\n switch (kind) {\n case 'sequential':\n case 'parallel':\n for (const plan of instructionPlan.plans) {\n newMessage = fitEntirePlanInsideMessage(plan, newMessage);\n }\n return newMessage;\n case 'single':\n newMessage = appendTransactionMessageInstructions([instructionPlan.instruction], message);\n // eslint-disable-next-line no-case-declarations\n const newMessageSize = getTransactionMessageSize(newMessage);\n if (newMessageSize > TRANSACTION_SIZE_LIMIT) {\n const baseMessageSize = getTransactionMessageSize(message);\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, {\n numBytesRequired: newMessageSize - baseMessageSize,\n numFreeBytes: TRANSACTION_SIZE_LIMIT - baseMessageSize,\n });\n }\n return newMessage;\n case 'messagePacker':\n // eslint-disable-next-line no-case-declarations\n const messagePacker = instructionPlan.getMessagePacker();\n while (!messagePacker.done()) {\n newMessage = messagePacker.packMessageToCapacity(newMessage);\n }\n return newMessage;\n default:\n instructionPlan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind });\n }\n}\n","import { assertIsAddress, isAddress } from '@solana/addresses';\nimport {\n isSolanaError,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\n/**\n * A 32-byte array identifying the application requesting off-chain message signing.\n *\n * This may be any arbitrary bytes. For instance the on-chain address of a program, DAO instance,\n * Candy Machine, et cetera.\n *\n * This field SHOULD be displayed to users as a base58-encoded ASCII string rather than interpreted\n * otherwise.\n */\nexport type OffchainMessageApplicationDomain = Brand<\n EncodedString,\n 'OffchainMessageApplicationDomain'\n>;\n\n/**\n * A type guard that returns `true` if the input string conforms to the\n * {@link OffchainMessageApplicationDomain} type, and refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isOffchainMessageApplicationDomain, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * if (isOffchainMessageApplicationDomain(applicationDomain)) {\n * // At this point, `applicationDomain` has been refined to an\n * // `OffchainMessageApplcationDomain` that can be used to craft a message.\n * const offchainMessage: OffchainMessageV0 = {\n * applicationDomain:\n * offchainMessageApplicationDomain('HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx'),\n * // ...\n * };\n * } else {\n * setError(`${applicationDomain} is not a valid application domain for an offchain message`);\n * }\n * ```\n */\nexport function isOffchainMessageApplicationDomain(\n putativeApplicationDomain: string,\n): putativeApplicationDomain is OffchainMessageApplicationDomain {\n return isAddress(putativeApplicationDomain);\n}\n\n/**\n * From time to time you might acquire a string, that you expect to validate as an offchain message\n * application domain, from an untrusted network API or user input. Use this function to assert that\n * such an arbitrary string is a base58-encoded application domain.\n *\n * @example\n * ```ts\n * import { assertIsOffchainMessageApplicationDomain, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * // Imagine a function that determines whether an application domain is valid.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const applicationDomain: string = applicationDomainInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `applicationDomain` to `OffchainMessageApplicationDomain`.\n * assertIsOffchainMessageApplicationDomain(applicationDomain);\n * // At this point, `applicationDomain` is a `OffchainMessageApplicationDomain` that can be\n * // used to craft an offchain message.\n * const offchainMessage: OffchainMessageV0 = {\n * applicationDomain:\n * offchainMessageApplicationDomain('HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx'),\n * // ...\n * };\n * } catch (e) {\n * // `applicationDomain` turned out not to be a base58-encoded application domain\n * }\n * }\n * ```\n */\nexport function assertIsOffchainMessageApplicationDomain(\n putativeApplicationDomain: string,\n): asserts putativeApplicationDomain is OffchainMessageApplicationDomain {\n try {\n assertIsAddress(putativeApplicationDomain);\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) {\n throw new SolanaError(\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n error.context,\n );\n }\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) {\n throw new SolanaError(\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n error.context,\n );\n }\n throw error;\n }\n}\n\n/**\n * Combines _asserting_ that a string is an offchain message application domain with _coercing_ it\n * to the {@link OffchainMessageApplicationDomain} type. It's most useful with untrusted input.\n *\n * @example\n * ```ts\n * import { offchainMessageApplicationDomain, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * const offchainMessage: OffchainMessageV0 = {\n * applicationDomain:\n * offchainMessageApplicationDomain('HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx'),\n * // ...\n * };\n * ```\n *\n * > [!TIP]\n * > When starting from a known-good application domain as a string, it's more efficient to typecast\n * > it rather than to use the {@link offchainMessageApplicationDomain} helper, because the helper\n * > unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageApplicationDomain } from '@solana/offchain-messages';\n * >\n * > const applicationDomain =\n * > 'HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx' as OffchainMessageApplicationDomain;\n * > ```\n */\nexport function offchainMessageApplicationDomain(putativeApplicationDomain: string): OffchainMessageApplicationDomain {\n assertIsOffchainMessageApplicationDomain(putativeApplicationDomain);\n return putativeApplicationDomain;\n}\n","import { Address, getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformEncoder,\n} from '@solana/codecs-core';\n\nimport { OffchainMessageApplicationDomain, offchainMessageApplicationDomain } from '../application-domain';\n\n/**\n * Returns an encoder that you can use to encode a base58-encoded offchain message application\n * domain to a byte array.\n *\n * @example\n * ```ts\n * import { getOffchainMessageApplicationDomainEncoder } from '@solana/offchain-messages';\n *\n * const offchainMessageApplicationDomain =\n * 'HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx' as OffchainMessageApplicationDomain;\n * const offchainMessageApplicationDomainEncoder = getOffchainMessageApplicationDomainEncoder();\n * const offchainMessageApplicationDomainBytes =\n * offchainMessageApplicationDomainEncoder.encode(offchainMessageApplicationDomain);\n * // Uint8Array(32) [\n * // 247, 203, 28, 80, 52, 240, 169, 19,\n * // 21, 103, 107, 119, 91, 235, 13, 48,\n * // 194, 169, 148, 160, 78, 105, 235, 37,\n * // 232, 160, 49, 47, 64, 89, 18, 153,\n * // ]\n * ```\n */\nexport function getOffchainMessageApplicationDomainEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getAddressEncoder(),\n putativeApplicationDomain => offchainMessageApplicationDomain(putativeApplicationDomain) as string as Address,\n );\n}\n\n/**\n * Returns a decoder that you can use to convert an array of 32 bytes representing an offchain\n * message application domain to the base58-encoded representation of that application domain.\n *\n * @example\n * ```ts\n * import { getOffchainMessageApplicationDomainDecoder } from '@solana/offchain-messages';\n *\n * const offchainMessageApplicationDomainBytes = new Uint8Array([\n * 247, 203, 28, 80, 52, 240, 169, 19,\n * 21, 103, 107, 119, 91, 235, 13, 48,\n * 194, 169, 148, 160, 78, 105, 235, 37,\n * 232, 160, 49, 47, 64, 89, 18, 153,\n * ]);\n * const offchainMessageApplicationDomainDecoder = getOffchainMessageApplicationDomainDecoder();\n * const offchainMessageApplicationDomain =\n * offchainMessageApplicationDomainDecoder.decode(offchainMessageApplicationDomainBytes);\n * // HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx\n * ```\n */\nexport function getOffchainMessageApplicationDomainDecoder(): FixedSizeDecoder {\n return getAddressDecoder() as FixedSizeDecoder as FixedSizeDecoder<\n OffchainMessageApplicationDomain,\n 32\n >;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a base-58 encoded offchain message\n * application domain.\n *\n * @see {@link getOffchainMessageApplicationDomainDecoder}\n * @see {@link getOffchainMessageApplicationDomainEncoder}\n */\nexport function getOffchainMessageApplicationDomainCodec(): FixedSizeCodec<\n OffchainMessageApplicationDomain,\n OffchainMessageApplicationDomain,\n 32\n> {\n return combineCodec(getOffchainMessageApplicationDomainEncoder(), getOffchainMessageApplicationDomainDecoder());\n}\n","import {\n combineCodec,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\nimport { getConstantDecoder, getConstantEncoder } from '@solana/codecs-data-structures';\n\n// The string `'\\xffsolana offchain'`\nconst OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES: ReadonlyUint8Array = new Uint8Array([\n 0xff, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x6f, 0x66, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e,\n]);\n\nexport function getOffchainMessageSigningDomainDecoder(): FixedSizeDecoder {\n return getConstantDecoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES) as FixedSizeDecoder;\n}\n\nexport function getOffchainMessageSigningDomainEncoder(): FixedSizeEncoder {\n return getConstantEncoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES) as FixedSizeEncoder;\n}\n\nexport function getOffchainMessageSigningDomainCodec(): FixedSizeCodec {\n return combineCodec(getOffchainMessageSigningDomainEncoder(), getOffchainMessageSigningDomainDecoder());\n}\n","import { Address, getAddressDecoder } from '@solana/addresses';\nimport {\n FixedSizeDecoder,\n FixedSizeEncoder,\n offsetDecoder,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getBytesDecoder,\n getHiddenPrefixDecoder,\n getHiddenPrefixEncoder,\n getStructDecoder,\n getStructEncoder,\n} from '@solana/codecs-data-structures';\nimport { getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,\n SolanaError,\n} from '@solana/errors';\n\nimport { OffchainMessageVersion } from '../version';\nimport { getOffchainMessageSigningDomainDecoder, getOffchainMessageSigningDomainEncoder } from './signing-domain';\n\ntype TDecoderFields = Parameters[0];\ntype TEncoderFields = Parameters[0];\n\nfunction getSigningDomainPrefixedDecoder(...fields: T) {\n return getHiddenPrefixDecoder(getStructDecoder(fields), [getOffchainMessageSigningDomainDecoder()]);\n}\n\nfunction getSigningDomainPrefixedEncoder(...fields: T) {\n return getHiddenPrefixEncoder(getStructEncoder(fields), [getOffchainMessageSigningDomainEncoder()]);\n}\n\nfunction getVersionTransformer(fixedVersion?: OffchainMessageVersion) {\n return (version: number) => {\n if (version > 1) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version,\n });\n }\n if (fixedVersion != null && version !== fixedVersion) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, {\n actualVersion: version,\n expectedVersion: fixedVersion,\n });\n }\n return version;\n };\n}\n\nexport function createOffchainMessagePreambleDecoder<\n const TVersion extends OffchainMessageVersion,\n const TFields extends TDecoderFields,\n>(version: TVersion, ...fields: TFields) {\n return getSigningDomainPrefixedDecoder(\n ['version', transformDecoder(getU8Decoder(), getVersionTransformer(version)) as FixedSizeDecoder],\n ...fields,\n );\n}\n\nexport function createOffchainMessagePreambleEncoder<\n const TVersion extends OffchainMessageVersion,\n const TFields extends TEncoderFields,\n>(version: TVersion, ...fields: TFields) {\n return getSigningDomainPrefixedEncoder(\n ['version', transformEncoder(getU8Encoder(), getVersionTransformer(version)) as FixedSizeEncoder],\n ...fields,\n );\n}\n\nexport function decodeRequiredSignatoryAddresses(bytes: ReadonlyUint8Array): readonly Address[] {\n const { version, bytesAfterVersion } = getSigningDomainPrefixedDecoder(\n ['version', transformDecoder(getU8Decoder(), getVersionTransformer())],\n ['bytesAfterVersion', getBytesDecoder()],\n ).decode(bytes);\n return offsetDecoder(\n transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), signatoryAddresses => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n return signatoryAddresses;\n }),\n {\n preOffset: ({ preOffset }) =>\n preOffset +\n (version === 0\n ? 32 + 1 // skip the application domain and message format of v0 messages\n : 0),\n },\n ).decode(bytesAfterVersion);\n}\n\nexport function getSignatoriesComparator(): (a: ReadonlyUint8Array, b: ReadonlyUint8Array) => -1 | 0 | 1 {\n return (x, y) => {\n if (x.length !== y.length) {\n return x.length < y.length ? -1 : 1;\n }\n for (let ii = 0; ii < x.length; ii++) {\n if (x[ii] === y[ii]) {\n continue;\n } else {\n return x[ii] < y[ii] ? -1 : 1;\n }\n }\n return 0;\n };\n}\n","import { fixEncoderSize, transformEncoder, VariableSizeEncoder } from '@solana/codecs-core';\nimport { getArrayEncoder, getBytesEncoder } from '@solana/codecs-data-structures';\nimport { getU8Encoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { OffchainMessageEnvelope } from '../envelope';\n\nfunction getSignaturesToEncode(signaturesMap: OffchainMessageEnvelope['signatures']): SignatureBytes[] {\n const signatures = Object.values(signaturesMap);\n if (signatures.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO);\n }\n\n return signatures.map(signature => {\n if (!signature) {\n return new Uint8Array(64).fill(0) as SignatureBytes;\n }\n return signature;\n });\n}\n\nexport function getSignaturesEncoder(): VariableSizeEncoder {\n return transformEncoder(\n getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getU8Encoder() }),\n getSignaturesToEncode,\n );\n}\n","import { Address, address } from '@solana/addresses';\nimport {\n combineCodec,\n fixDecoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n} from '@solana/codecs-data-structures';\nimport { getU8Decoder } from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,\n SolanaError,\n} from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { OffchainMessageEnvelope } from '../envelope';\nimport { OffchainMessageBytes } from '../message';\nimport { decodeRequiredSignatoryAddresses } from './preamble-common';\nimport { getSignaturesEncoder } from './signatures';\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessageEnvelope} to a byte array\n * appropriate for sharing with a third party for validation.\n */\nexport function getOffchainMessageEnvelopeEncoder(): VariableSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['signatures', getSignaturesEncoder()],\n ['content', getBytesEncoder()],\n ]),\n envelope => {\n const signaturesMapAddresses = Object.keys(envelope.signatures).map(address);\n if (signaturesMapAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO);\n }\n const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(envelope.content);\n const missingRequiredSigners = [];\n const unexpectedSigners = [];\n for (const address of signatoryAddresses) {\n if (!signaturesMapAddresses.includes(address)) {\n missingRequiredSigners.push(address);\n }\n }\n for (const address of signaturesMapAddresses) {\n if (!signatoryAddresses.includes(address)) {\n unexpectedSigners.push(address);\n }\n }\n if (missingRequiredSigners.length || unexpectedSigners.length) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, {\n missingRequiredSigners,\n unexpectedSigners,\n });\n }\n const orderedSignatureMap: OffchainMessageEnvelope['signatures'] = {};\n for (const address of signatoryAddresses) {\n orderedSignatureMap[address] = envelope.signatures[address];\n }\n return {\n ...envelope,\n signatures: orderedSignatureMap,\n };\n },\n );\n}\n\n/**\n * Returns a decoder that you can use to convert a byte array in the Solana offchain message format\n * to a {@link OffchainMessageEnvelope} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageEnvelopeDecoder } from '@solana/offchain-messages';\n *\n * const offchainMessageEnvelopeDecoder = getOffchainMessageEnvelopeDecoder();\n * const offchainMessageEnvelope = offchainMessageEnvelopeDecoder.decode(offchainMessageEnvelopeBytes);\n * for (const [address, signature] in Object.entries(offchainMessageEnvelope.signatures)) {\n * console.log(`Signature by ${address}`, signature);\n * }\n * ```\n */\nexport function getOffchainMessageEnvelopeDecoder(): VariableSizeDecoder {\n return transformDecoder(\n getStructDecoder([\n ['signatures', getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getU8Decoder() })],\n ['content', getBytesDecoder()],\n ]),\n decodePartiallyDecodedOffchainMessageEnvelope,\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessageEnvelope}\n *\n * @see {@link getOffchainMessageEnvelopeDecoder}\n * @see {@link getOffchainMessageEnvelopeEncoder}\n */\nexport function getOffchainMessageEnvelopeCodec() {\n return combineCodec(getOffchainMessageEnvelopeEncoder(), getOffchainMessageEnvelopeDecoder());\n}\n\ntype PartiallyDecodedOffchainMessageEnvelope = {\n content: ReadonlyUint8Array;\n signatures: ReadonlyUint8Array[];\n};\n\nfunction decodePartiallyDecodedOffchainMessageEnvelope(\n offchainMessageEnvelope: PartiallyDecodedOffchainMessageEnvelope,\n): OffchainMessageEnvelope {\n const { content, signatures } = offchainMessageEnvelope;\n\n if (signatures.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO);\n }\n\n const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(content);\n\n // Signer addresses and signatures must be the same length\n // We encode an all-zero signature when the signature is missing\n if (signatoryAddresses.length !== signatures.length) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, {\n numRequiredSignatures: signatoryAddresses.length,\n signatoryAddresses,\n signaturesLength: signatures.length,\n });\n }\n\n // Combine the signer addresses + signatures into the signatures map\n const signaturesMap: OffchainMessageEnvelope['signatures'] = {};\n signatoryAddresses.forEach((address, index) => {\n const signatureForAddress = signatures[index];\n if (signatureForAddress.every(b => b === 0)) {\n signaturesMap[address] = null;\n } else {\n signaturesMap[address] = signatureForAddress as SignatureBytes;\n }\n });\n\n return Object.freeze({\n content: content as OffchainMessageBytes,\n signatures: Object.freeze(signaturesMap),\n });\n}\n\nfunction decodeAndValidateRequiredSignatoryAddresses(bytes: ReadonlyUint8Array): readonly Address[] {\n const signatoryAddresses = decodeRequiredSignatoryAddresses(bytes);\n\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n\n return signatoryAddresses;\n}\n","import { getUtf8Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\nconst MAX_BODY_BYTES =\n // Largest 16-bit unsigned integer\n 0xffff;\nconst MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE =\n // Space remaining in the mininum IPv6 MTU after network header overhead\n 1232;\n\n/**\n * A restriction on what characters the message text can contain and how long it can be.\n *\n * The aim of this restriction is to make a message more likely to be signable by a hardware wallet\n * that imposes limits on message size. In the case of wanting a message to be clear-signable,\n * restricting the character set to ASCII may ensure that certain models of hardware wallet without\n * extended character sets can display it onscreen.\n *\n * @remarks This only applies to v0 messages.\n */\nexport enum OffchainMessageContentFormat {\n RESTRICTED_ASCII_1232_BYTES_MAX = 0,\n UTF8_1232_BYTES_MAX = 1,\n UTF8_65535_BYTES_MAX = 2,\n}\n\n/**\n * Describes message text that is no more than 1232 bytes long and made up of characters with ASCII\n * character codes in the range [0x20, 0x7e].\n *\n * @remarks This type aims to restrict text to that which can be clear-signed by hardware wallets\n * that can only display ASCII characters onscreen.\n */\nexport type OffchainMessageContentRestrictedAsciiOf1232BytesMax = Readonly<{\n format: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX;\n text: Brand;\n}>;\n\n/**\n * Describes message text that is no more than 1232 bytes long and mdae up of any UTF-8 characters.\n */\nexport type OffchainMessageContentUtf8Of1232BytesMax = Readonly<{\n format: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX;\n text: Brand;\n}>;\n\n/**\n * Describes message text that is no more than 65535 bytes long and mdae up of any UTF-8 characters.\n */\nexport type OffchainMessageContentUtf8Of65535BytesMax = Readonly<{\n format: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX;\n text: Brand;\n}>;\n\nexport type OffchainMessageContent =\n | OffchainMessageContentRestrictedAsciiOf1232BytesMax\n | OffchainMessageContentUtf8Of1232BytesMax\n | OffchainMessageContentUtf8Of65535BytesMax;\n\n/**\n * In the event that you receive content of a v0 offchain message from an untrusted source, use this\n * function to assert that it conforms to the\n * {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type.\n *\n * @see {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): asserts putativeContent is OffchainMessageContentRestrictedAsciiOf1232BytesMax {\n if (putativeContent.format !== OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, {\n actualMessageFormat: putativeContent.format,\n expectedMessageFormat: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX,\n });\n }\n if (putativeContent.text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n if (isTextRestrictedAscii(putativeContent.text) === false) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE);\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, {\n actualBytes: length,\n maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE,\n });\n }\n}\n\n/**\n * A type guard that returns `true` when supplied content of a v0 offchain message that conforms to\n * the {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type, and refines its type for use in your\n * program.\n *\n * @see {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} for more detail.\n */\nexport function isOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): putativeContent is OffchainMessageContentRestrictedAsciiOf1232BytesMax {\n if (\n putativeContent.format !== OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX ||\n putativeContent.text.length === 0 ||\n isTextRestrictedAscii(putativeContent.text) === false\n ) {\n return false;\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE;\n}\n\n/**\n * Combines _asserting_ that the content of a v0 offchain message is restricted ASCII with\n * _coercing_ it to the {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type. It's most\n * useful with untrusted input.\n *\n * @example\n * ```ts\n * import { offchainMessageContentRestrictedAsciiOf1232BytesMax, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const text: string = textInput.value;\n * try {\n * const offchainMessage: OffchainMessageV0 = {\n * content: offchainMessageContentRestrictedAsciiOf1232BytesMax(text),\n * // ...\n * };\n * } catch (e) {\n * // `text` turned out not to conform to\n * // `OffchainMessageContentRestrictedAsciiOf1232BytesMax`\n * }\n * }\n * ```\n *\n * > [!TIP]\n * > When starting from known-good ASCII content as a string, it's more efficient to typecast it\n * > rather than to use the {@link offchainMessageContentRestrictedAsciiOf1232BytesMax} helper,\n * > because the helper unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageContentFormat, OffchainMessageV0 } from '@solana/offchain-messages';\n * >\n * > const offchainMessage: OffchainMessageV0 = {\n * > /* ... *\\/\n * > content: Object.freeze({\n * > format: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX,\n * > text: 'Hello world',\n * > } as OffchainMessageContentRestrictedAsciiOf1232BytesMax<'Hello world'>),\n * > };\n * > ```\n */\nexport function offchainMessageContentRestrictedAsciiOf1232BytesMax(\n text: TText,\n): OffchainMessageContentRestrictedAsciiOf1232BytesMax {\n const putativeContent = Object.freeze({\n format: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX,\n text,\n });\n assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent);\n return putativeContent;\n}\n\n/**\n * In the event that you receive content of a v0 offchain message from an untrusted source, use this\n * function to assert that it conforms to the {@link OffchainMessageContentUtf8Of1232BytesMax} type.\n *\n * @see {@link OffchainMessageContentUtf8Of1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): asserts putativeContent is OffchainMessageContentUtf8Of1232BytesMax {\n if (putativeContent.text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n if (putativeContent.format !== OffchainMessageContentFormat.UTF8_1232_BYTES_MAX) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, {\n actualMessageFormat: putativeContent.format,\n expectedMessageFormat: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX,\n });\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, {\n actualBytes: length,\n maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE,\n });\n }\n}\n\n/**\n * A type guard that returns `true` when supplied content of a v0 offchain message that conforms to\n * the {@link OffchainMessageContentUtf8Of1232BytesMax} type, and refines its type for use in your\n * program.\n *\n * @see {@link OffchainMessageContentUtf8Of1232BytesMax} for more detail.\n */\nexport function isOffchainMessageContentUtf8Of1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): putativeContent is OffchainMessageContentUtf8Of1232BytesMax {\n if (\n putativeContent.format !== OffchainMessageContentFormat.UTF8_1232_BYTES_MAX ||\n putativeContent.text.length === 0\n ) {\n return false;\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE;\n}\n\n/**\n * Combines _asserting_ that the content of a v0 offchain message is UTF-8 of up to 1232 characters\n * with _coercing_ it to the {@link OffchainMessageContentUtf8Of1232BytesMax} type. It's most useful\n * with untrusted input.\n *\n * @example\n * ```ts\n * import { OffchainMessageContentUtf8Of1232BytesMax, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const text: string = textInput.value;\n * try {\n * const offchainMessage: OffchainMessageV0 = {\n * content: OffchainMessageContentUtf8Of1232BytesMax(text),\n * // ...\n * };\n * } catch (e) {\n * // `text` turned out not to conform to\n * // `OffchainMessageContentUtf8Of1232BytesMax`\n * }\n * }\n * ```\n *\n * > [!TIP]\n * > When starting from known-good UTF-8 content as a string up to 1232 bytes, it's more efficient\n * > to typecast it rather than to use the {@link offchainMessageContentUtf8Of1232BytesMax} helper,\n * > because the helper unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageContentFormat, OffchainMessageV0 } from '@solana/offchain-messages';\n * >\n * > const offchainMessage: OffchainMessageV0 = {\n * > /* ... *\\/\n * > content: Object.freeze({\n * > format: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX,\n * > text: '✌🏿cool',\n * > } as OffchainMessageContentUtf8Of1232BytesMax<'✌🏿cool'>),\n * > };\n * > ```\n */\nexport function offchainMessageContentUtf8Of1232BytesMax(\n text: TText,\n): OffchainMessageContentUtf8Of1232BytesMax {\n const putativeContent = Object.freeze({\n format: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX,\n text,\n });\n assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent);\n return putativeContent;\n}\n\n/**\n * In the event that you receive content of a v0 offchain message from an untrusted source, use this\n * function to assert that it conforms to the {@link OffchainMessageContentUtf8Of65535BytesMax}\n * type.\n *\n * @see {@link OffchainMessageContentUtf8Of65535BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): asserts putativeContent is OffchainMessageContentUtf8Of65535BytesMax {\n if (putativeContent.format !== OffchainMessageContentFormat.UTF8_65535_BYTES_MAX) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, {\n actualMessageFormat: putativeContent.format,\n expectedMessageFormat: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX,\n });\n }\n if (putativeContent.text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n if (length > MAX_BODY_BYTES) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, {\n actualBytes: length,\n maxBytes: MAX_BODY_BYTES,\n });\n }\n}\n\n/**\n * A type guard that returns `true` when supplied content of a v0 offchain message that conforms to\n * the {@link OffchainMessageContentUtf8Of65535BytesMax} type, and refines its type for use in your\n * program.\n *\n * @see {@link OffchainMessageContentUtf8Of65535BytesMax} for more detail.\n */\nexport function isOffchainMessageContentUtf8Of65535BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): putativeContent is OffchainMessageContentUtf8Of65535BytesMax {\n if (\n putativeContent.format !== OffchainMessageContentFormat.UTF8_65535_BYTES_MAX ||\n putativeContent.text.length === 0\n ) {\n return false;\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n return length <= MAX_BODY_BYTES;\n}\n\n/**\n * Combines _asserting_ that the content of a v0 offchain message is UTF-8 of up to 65535 characters\n * with _coercing_ it to the {@link OffchainMessageContentUtf8Of65535BytesMax} type. It's most useful\n * with untrusted input.\n *\n * @example\n * ```ts\n * import { OffchainMessageContentUtf8Of65535BytesMax, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const text: string = textInput.value;\n * try {\n * const offchainMessage: OffchainMessageV0 = {\n * content: OffchainMessageContentUtf8Of65535BytesMax(text),\n * // ...\n * };\n * } catch (e) {\n * // `text` turned out not to conform to\n * // `OffchainMessageContentUtf8Of65535BytesMax`\n * }\n * }\n * ```\n *\n * > [!TIP]\n * > When starting from known-good UTF-8 content as a string up to 65535 bytes, it's more efficient\n * > to typecast it rather than to use the {@link OffchainMessageContentUtf8Of65535BytesMax} helper,\n * > because the helper unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageContentFormat, OffchainMessageV0 } from '@solana/offchain-messages';\n * >\n * > const offchainMessage: OffchainMessageV0 = {\n * > /* ... *\\/\n * > content: Object.freeze({\n * > format: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX,\n * > text: '✌🏿cool',\n * > } as OffchainMessageContentUtf8Of65535BytesMax<'✌🏿cool'>),\n * > };\n * > ```\n */\nexport function offchainMessageContentUtf8Of65535BytesMax(\n text: TText,\n): OffchainMessageContentUtf8Of65535BytesMax {\n const putativeContent = Object.freeze({\n format: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX,\n text,\n });\n assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent);\n return putativeContent;\n}\n\nfunction isTextRestrictedAscii(putativeRestrictedAsciiString: string): boolean {\n return /^[\\x20-\\x7e]+$/.test(putativeRestrictedAsciiString);\n}\n","import {\n assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax,\n assertIsOffchainMessageContentUtf8Of1232BytesMax,\n assertIsOffchainMessageContentUtf8Of65535BytesMax,\n OffchainMessageContentFormat,\n OffchainMessageContentRestrictedAsciiOf1232BytesMax,\n OffchainMessageContentUtf8Of1232BytesMax,\n OffchainMessageContentUtf8Of65535BytesMax,\n} from './content';\nimport { OffchainMessagePreambleV0 } from './preamble-v0';\nimport { OffchainMessageWithRequiredSignatories } from './signatures';\n\nexport type BaseOffchainMessageV0 = Omit<\n OffchainMessagePreambleV0,\n 'messageFormat' | 'messageLength' | 'requiredSignatories'\n>;\n\n/**\n * An offchain message whose content conforms to\n * {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax}\n */\nexport interface OffchainMessageWithRestrictedAsciiOf1232BytesMaxContent {\n readonly content: OffchainMessageContentRestrictedAsciiOf1232BytesMax;\n}\n\n/**\n * An offchain message whose content conforms to\n * {@link offchainMessageContentUtf8Of1232BytesMax}\n */\nexport interface OffchainMessageWithUtf8Of1232BytesMaxContent {\n readonly content: OffchainMessageContentUtf8Of1232BytesMax;\n}\n\n/**\n * An offchain message whose content conforms to\n * {@link OffchainMessageContentUtf8Of65535BytesMax}\n */\nexport interface OffchainMessageWithUtf8Of65535BytesMaxContent {\n readonly content: OffchainMessageContentUtf8Of65535BytesMax;\n}\n\n/**\n * A union of the formats a v0 message's contents can take.\n *\n * @remarks From v1 and onward, an offchain message has only one format: UTF-8 text of arbitrary\n * length.\n */\nexport type OffchainMessageWithContent =\n | OffchainMessageWithRestrictedAsciiOf1232BytesMaxContent\n | OffchainMessageWithUtf8Of1232BytesMaxContent\n | OffchainMessageWithUtf8Of65535BytesMaxContent;\n\nexport type OffchainMessageV0 = BaseOffchainMessageV0 &\n OffchainMessageWithContent &\n OffchainMessageWithRequiredSignatories;\n\n/**\n * In the event that you receive a v0 offchain message from an untrusted source, use this function\n * to assert that it is one whose content conforms to the\n * {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type.\n *\n * @see {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(\n putativeMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n }>,\n): asserts putativeMessage is OffchainMessageWithRestrictedAsciiOf1232BytesMaxContent & Omit {\n assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeMessage.content);\n}\n\n/**\n * In the event that you receive a v0 offchain message from an untrusted source, use this function\n * to assert that it is one whose content conforms to the\n * {@link offchainMessageContentUtf8Of1232BytesMax} type.\n *\n * @see {@link offchainMessageContentUtf8Of1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageUtf8Of1232BytesMax(\n putativeMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n version: number;\n }>,\n): asserts putativeMessage is OffchainMessageWithUtf8Of1232BytesMaxContent & Omit {\n assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeMessage.content);\n}\n\n/**\n * In the event that you receive a v0 offchain message from an untrusted source, use this function\n * to assert that it is one whose content conforms to the\n * {@link OffchainMessageContentUtf8Of65535BytesMax} type.\n *\n * @see {@link OffchainMessageContentUtf8Of65535BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageUtf8Of65535BytesMax(\n putativeMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n version: number;\n }>,\n): asserts putativeMessage is OffchainMessageWithUtf8Of65535BytesMaxContent & Omit {\n assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeMessage.content);\n}\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\nimport { getEnumDecoder, getEnumEncoder } from '@solana/codecs-data-structures';\n\nimport { OffchainMessageContentFormat } from '../content';\n\nexport function getOffchainMessageContentFormatDecoder(): FixedSizeDecoder {\n return getEnumDecoder(OffchainMessageContentFormat, {\n useValuesAsDiscriminators: true,\n });\n}\n\nexport function getOffchainMessageContentFormatEncoder(): FixedSizeEncoder {\n return getEnumEncoder(OffchainMessageContentFormat, {\n useValuesAsDiscriminators: true,\n });\n}\n\nexport function getOffchainMessageContentFormatCodec(): FixedSizeCodec<\n OffchainMessageContentFormat,\n OffchainMessageContentFormat,\n 1\n> {\n return combineCodec(getOffchainMessageContentFormatEncoder(), getOffchainMessageContentFormatDecoder());\n}\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getArrayDecoder, getArrayEncoder } from '@solana/codecs-data-structures';\nimport { getU8Decoder, getU8Encoder, getU16Decoder, getU16Encoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO, SolanaError } from '@solana/errors';\n\nimport { OffchainMessagePreambleV0 } from '../preamble-v0';\nimport {\n getOffchainMessageApplicationDomainDecoder,\n getOffchainMessageApplicationDomainEncoder,\n} from './application-domain';\nimport { getOffchainMessageContentFormatDecoder, getOffchainMessageContentFormatEncoder } from './content';\nimport { createOffchainMessagePreambleDecoder, createOffchainMessagePreambleEncoder } from './preamble-common';\n\nexport function getOffchainMessageV0PreambleDecoder(): VariableSizeDecoder {\n return createOffchainMessagePreambleDecoder(\n /* version */ 0,\n ['applicationDomain', getOffchainMessageApplicationDomainDecoder()],\n ['messageFormat', getOffchainMessageContentFormatDecoder()],\n [\n 'requiredSignatories',\n transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), signatoryAddresses => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n return signatoryAddresses.map(address => Object.freeze({ address }));\n }),\n ],\n ['messageLength', getU16Decoder()],\n );\n}\n\nexport function getOffchainMessageV0PreambleEncoder(): VariableSizeEncoder {\n return createOffchainMessagePreambleEncoder(\n /* version */ 0,\n ['applicationDomain', getOffchainMessageApplicationDomainEncoder()],\n ['messageFormat', getOffchainMessageContentFormatEncoder()],\n [\n 'requiredSignatories',\n transformEncoder(\n getArrayEncoder(getAddressEncoder(), { size: getU8Encoder() }),\n (signatoryAddresses: OffchainMessagePreambleV0['requiredSignatories']) => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n return signatoryAddresses.map(({ address }) => address);\n },\n ),\n ],\n ['messageLength', getU16Encoder()],\n );\n}\n\nexport function getOffchainMessageV0PreambleCodec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV0PreambleEncoder(), getOffchainMessageV0PreambleDecoder());\n}\n","import {\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getTupleDecoder, getTupleEncoder } from '@solana/codecs-data-structures';\nimport { getUtf8Decoder, getUtf8Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,\n SolanaError,\n} from '@solana/errors';\n\nimport { OffchainMessageContentFormat } from '../content';\nimport {\n assertIsOffchainMessageRestrictedAsciiOf1232BytesMax,\n assertIsOffchainMessageUtf8Of1232BytesMax,\n assertIsOffchainMessageUtf8Of65535BytesMax,\n OffchainMessageV0,\n} from '../message-v0';\nimport { getOffchainMessageV0PreambleDecoder, getOffchainMessageV0PreambleEncoder } from './preamble-v0';\n\n/**\n * Returns a decoder that you can use to convert a byte array (eg. one that conforms to the\n * {@link OffchainMessageBytes} type) to an {@link OffchainMessageV0} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageV0Decoder } from '@solana/offchain-messages';\n *\n * const offchainMessageDecoder = getOffchainMessageV0Decoder();\n * const offchainMessage = offchainMessageDecoder.decode(\n * offchainMessageEnvelope.content,\n * );\n * console.log(`Decoded a v0 offchain message`);\n * ```\n *\n * Throws in the event that the message bytes represent a message of a version other than 0.\n */\nexport function getOffchainMessageV0Decoder(): VariableSizeDecoder {\n return transformDecoder(\n getTupleDecoder([getOffchainMessageV0PreambleDecoder(), getUtf8Decoder()]),\n ([{ messageLength, messageFormat, requiredSignatories, ...preambleRest }, text]) => {\n const actualLength = getUtf8Encoder().getSizeFromValue(text);\n if (messageLength !== actualLength) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, {\n actualLength: actualLength,\n specifiedLength: messageLength,\n });\n }\n const offchainMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n }> = Object.freeze({\n ...preambleRest,\n content: Object.freeze({\n format: messageFormat,\n text,\n }),\n requiredSignatories: Object.freeze(requiredSignatories),\n });\n switch (messageFormat) {\n case OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX: {\n assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage);\n return offchainMessage;\n }\n case OffchainMessageContentFormat.UTF8_1232_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage);\n return offchainMessage;\n }\n case OffchainMessageContentFormat.UTF8_65535_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage);\n return offchainMessage;\n }\n default: {\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: messageFormat satisfies never,\n });\n }\n }\n },\n );\n}\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessageV0} to a byte array\n * appropriate for inclusion in an {@link OffchainMessageEnvelope}.\n */\nexport function getOffchainMessageV0Encoder(): VariableSizeEncoder {\n return transformEncoder(\n getTupleEncoder([getOffchainMessageV0PreambleEncoder(), getUtf8Encoder()]),\n offchainMessage => {\n const { content, ...preamble } = offchainMessage;\n switch (offchainMessage.content.format) {\n case OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX: {\n assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage);\n break;\n }\n case OffchainMessageContentFormat.UTF8_1232_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage);\n break;\n }\n case OffchainMessageContentFormat.UTF8_65535_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage);\n break;\n }\n default: {\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: offchainMessage.content satisfies never,\n });\n }\n }\n const messageLength = getUtf8Encoder().getSizeFromValue(content.text);\n const compiledPreamble = {\n ...preamble,\n messageFormat: content.format,\n messageLength,\n };\n return [compiledPreamble, content.text] as const;\n },\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessageV0}\n *\n * @see {@link getOffchainMessageV0Decoder}\n * @see {@link getOffchainMessageV0Encoder}\n */\nexport function getOffchainMessageV0Codec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV0Encoder(), getOffchainMessageV0Decoder());\n}\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n fixDecoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getArrayDecoder, getArrayEncoder, getBytesDecoder, getBytesEncoder } from '@solana/codecs-data-structures';\nimport { getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE,\n SolanaError,\n} from '@solana/errors';\n\nimport { OffchainMessagePreambleV1 } from '../preamble-v1';\nimport {\n createOffchainMessagePreambleDecoder,\n createOffchainMessagePreambleEncoder,\n getSignatoriesComparator,\n} from './preamble-common';\n\nexport function getOffchainMessageV1PreambleDecoder(): VariableSizeDecoder {\n return createOffchainMessagePreambleDecoder(/* version */ 1, [\n 'requiredSignatories',\n transformDecoder(\n getArrayDecoder(fixDecoderSize(getBytesDecoder(), 32), { size: getU8Decoder() }),\n signatoryAddressesBytes => {\n if (signatoryAddressesBytes.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n const comparator = getSignatoriesComparator();\n for (let ii = 0; ii < signatoryAddressesBytes.length - 1; ii++) {\n switch (comparator(signatoryAddressesBytes[ii], signatoryAddressesBytes[ii + 1])) {\n case 0:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE);\n case 1:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED);\n }\n }\n const addressDecoder = getAddressDecoder();\n return signatoryAddressesBytes.map(addressBytes =>\n Object.freeze({\n address: addressDecoder.decode(addressBytes),\n }),\n );\n },\n ),\n ]);\n}\n\nexport function getOffchainMessageV1PreambleEncoder(): VariableSizeEncoder {\n return createOffchainMessagePreambleEncoder(/* version */ 1, [\n 'requiredSignatories',\n transformEncoder(\n transformEncoder(\n getArrayEncoder(getBytesEncoder(), { size: getU8Encoder() }),\n (signatoryAddressesBytes: readonly ReadonlyUint8Array[]) => {\n return signatoryAddressesBytes.toSorted(getSignatoriesComparator());\n },\n ),\n (signatoryAddresses: OffchainMessagePreambleV1['requiredSignatories']) => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n const seenSignatories = new Set();\n for (const { address } of signatoryAddresses) {\n if (seenSignatories.has(address)) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE);\n }\n seenSignatories.add(address);\n }\n const addressEncoder = getAddressEncoder();\n return signatoryAddresses.map(({ address }) => addressEncoder.encode(address));\n },\n ),\n ]);\n}\n\nexport function getOffchainMessageV1PreambleCodec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV1PreambleEncoder(), getOffchainMessageV1PreambleDecoder());\n}\n","import {\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getTupleDecoder, getTupleEncoder } from '@solana/codecs-data-structures';\nimport { getUtf8Decoder, getUtf8Encoder } from '@solana/codecs-strings';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY, SolanaError } from '@solana/errors';\n\nimport { OffchainMessageV1 } from '../message-v1';\nimport { getOffchainMessageV1PreambleDecoder, getOffchainMessageV1PreambleEncoder } from './preamble-v1';\n\n/**\n * Returns a decoder that you can use to convert a byte array (eg. one that conforms to the\n * {@link OffchainMessageBytes} type) to an {@link OffchainMessageV1} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageV1Decoder } from '@solana/offchain-messages';\n *\n * const offchainMessageDecoder = getOffchainMessageV1Decoder();\n * const offchainMessage = offchainMessageDecoder.decode(\n * offchainMessageEnvelope.content,\n * );\n * console.log(`Decoded a v1 offchain message`);\n * ```\n *\n * Throws in the event that the message bytes represent a message of a version other than 1.\n */\nexport function getOffchainMessageV1Decoder(): VariableSizeDecoder {\n return transformDecoder(\n getTupleDecoder([getOffchainMessageV1PreambleDecoder(), getUtf8Decoder()]),\n ([{ requiredSignatories, ...preambleRest }, text]) => {\n if (text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n return Object.freeze({\n ...preambleRest,\n content: text,\n requiredSignatories: Object.freeze(requiredSignatories),\n });\n },\n );\n}\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessageV1} to a byte array\n * appropriate for inclusion in an {@link OffchainMessageEnvelope}.\n */\nexport function getOffchainMessageV1Encoder(): VariableSizeEncoder {\n return transformEncoder(\n getTupleEncoder([getOffchainMessageV1PreambleEncoder(), getUtf8Encoder()]),\n offchainMessage => {\n const { content, ...compiledPreamble } = offchainMessage;\n if (content.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n return [compiledPreamble, content] as const;\n },\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessageV1}\n *\n * @see {@link getOffchainMessageV1Decoder}\n * @see {@link getOffchainMessageV1Encoder}\n */\nexport function getOffchainMessageV1Codec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV1Encoder(), getOffchainMessageV1Decoder());\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getHiddenPrefixDecoder } from '@solana/codecs-data-structures';\nimport { getU8Decoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, SolanaError } from '@solana/errors';\n\nimport { OffchainMessage } from '../message';\nimport { getOffchainMessageV0Decoder, getOffchainMessageV0Encoder } from './message-v0';\nimport { getOffchainMessageV1Decoder, getOffchainMessageV1Encoder } from './message-v1';\nimport { getOffchainMessageSigningDomainDecoder } from './signing-domain';\n\n/**\n * Returns a decoder that you can use to convert a byte array (eg. one that conforms to the\n * {@link OffchainMessageBytes} type) to an {@link OffchainMessage} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageDecoder } from '@solana/offchain-messages';\n *\n * const offchainMessageDecoder = getOffchainMessageDecoder();\n * const offchainMessage = offchainMessageDecoder.decode(\n * offchainMessageEnvelope.content,\n * );\n * console.log(`Decoded an offchain message (version: ${offchainMessage.version}`);\n * ```\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the decoders specific to that\n * version so as not to bundle more code than you need.\n */\nexport function getOffchainMessageDecoder(): VariableSizeDecoder {\n return createDecoder({\n read(bytes, offset): [OffchainMessage, number] {\n const version = getHiddenPrefixDecoder(getU8Decoder(), [\n // Discard the signing domain\n getOffchainMessageSigningDomainDecoder(),\n ]).decode(bytes, offset);\n switch (version) {\n case 0:\n return getOffchainMessageV0Decoder().read(bytes, offset);\n case 1:\n return getOffchainMessageV1Decoder().read(bytes, offset);\n default:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version,\n });\n }\n },\n });\n}\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessage} to a byte array\n * appropriate for inclusion in an {@link OffchainMessageEnvelope}.\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the encoders specific to that\n * version so as not to bundle more code than you need.\n */\nexport function getOffchainMessageEncoder(): VariableSizeEncoder {\n return createEncoder({\n getSizeFromValue: offchainMessage => {\n const { version } = offchainMessage;\n switch (version) {\n case 0:\n return getOffchainMessageV0Encoder().getSizeFromValue(offchainMessage);\n case 1:\n return getOffchainMessageV1Encoder().getSizeFromValue(offchainMessage);\n default:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version satisfies never,\n });\n }\n },\n write: (offchainMessage, bytes, offset) => {\n const { version } = offchainMessage;\n switch (version) {\n case 0:\n return getOffchainMessageV0Encoder().write(offchainMessage, bytes, offset);\n case 1:\n return getOffchainMessageV1Encoder().write(offchainMessage, bytes, offset);\n default:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version satisfies never,\n });\n }\n },\n });\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessage}\n *\n * @see {@link getOffchainMessageDecoder}\n * @see {@link getOffchainMessageEncoder}\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the codecs specific to that\n * version so as not to bundle more code than you need.\n */\nexport function getOffchainMessageCodec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageEncoder(), getOffchainMessageDecoder());\n}\n","import { VariableSizeEncoder } from '@solana/codecs-core';\n\nimport { OffchainMessageEnvelope } from './envelope';\nimport { OffchainMessage, OffchainMessageBytes } from './message';\n\nexport function compileOffchainMessageEnvelopeUsingEncoder(\n offchainMessage: T,\n encoder: VariableSizeEncoder,\n) {\n const offchainMessageBytes = encoder.encode(offchainMessage) as OffchainMessageBytes;\n const signatures: OffchainMessageEnvelope['signatures'] = {};\n for (const { address } of offchainMessage.requiredSignatories) {\n signatures[address] = null;\n }\n return Object.freeze({\n content: offchainMessageBytes,\n signatures: Object.freeze(signatures),\n });\n}\n","import { getOffchainMessageV0Encoder } from './codecs/message-v0';\nimport { OffchainMessageEnvelope } from './envelope';\nimport { compileOffchainMessageEnvelopeUsingEncoder } from './envelope-common';\nimport { OffchainMessageV0 } from './message-v0';\n\n/**\n * Returns an {@link OffchainMessageEnvelope} object for a given {@link OffchainMessageV0}.\n *\n * This includes the compiled bytes of the offchain message, and a map of signatures. This map will\n * have a key for each address that is required to sign the message. The message envelope will not\n * yet have signatures for any of these signatories.\n */\nexport function compileOffchainMessageV0Envelope(offchainMessage: OffchainMessageV0): OffchainMessageEnvelope {\n return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV0Encoder());\n}\n","import { getOffchainMessageV1Encoder } from './codecs/message-v1';\nimport { OffchainMessageEnvelope } from './envelope';\nimport { compileOffchainMessageEnvelopeUsingEncoder } from './envelope-common';\nimport { OffchainMessageV1 } from './message-v1';\n\n/**\n * Returns an {@link OffchainMessageEnvelope} object for a given {@link OffchainMessageV1}.\n *\n * This includes the compiled bytes of the offchain message, and a map of signatures. This map will\n * have a key for each address that is required to sign the message. The message envelope will not\n * yet have signatures for any of these signatories.\n */\nexport function compileOffchainMessageV1Envelope(offchainMessage: OffchainMessageV1): OffchainMessageEnvelope {\n return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV1Encoder());\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { compileOffchainMessageV0Envelope } from './envelope-v0';\nimport { compileOffchainMessageV1Envelope } from './envelope-v1';\nimport { OffchainMessage, OffchainMessageBytes } from './message';\n\ntype OrderedMap = Record;\ntype OffchainMessageSignaturesMap = OrderedMap;\n\nexport interface OffchainMessageEnvelope {\n /** The bytes of the combined offchain message preamble and content */\n readonly content: OffchainMessageBytes;\n /**\n * A map between the addresses of an offchain message's signers, and the 64-byte Ed25519\n * signature of the combined message preamble and message content by the private key associated\n * with each.\n */\n readonly signatures: OffchainMessageSignaturesMap;\n}\n\n/**\n * Returns an {@link OffchainMessageEnvelope} object for a given {@link OffchainMessage}.\n *\n * This includes the compiled bytes of the offchain message, and a map of signatures. This map will\n * have a key for each address that is required to sign the message. The message envelope will not\n * yet have signatures for any of these signatories.\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the compile functions\n * specific to that version so as not to bundle more code than you need.\n */\nexport function compileOffchainMessageEnvelope(offchainMessage: OffchainMessage): OffchainMessageEnvelope {\n const { version } = offchainMessage;\n switch (version) {\n case 0:\n return compileOffchainMessageV0Envelope(offchainMessage);\n case 1:\n return compileOffchainMessageV1Envelope(offchainMessage);\n default:\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: version satisfies never,\n });\n }\n}\n","import { Address, getAddressFromPublicKey, getPublicKeyFromAddress } from '@solana/addresses';\nimport { bytesEqual } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { SignatureBytes, signBytes, verifySignature } from '@solana/keys';\nimport { NominalType } from '@solana/nominal-types';\n\nimport { decodeRequiredSignatoryAddresses } from './codecs/preamble-common';\nimport { OffchainMessageEnvelope } from './envelope';\n\n/**\n * Represents an offchain message envelope that is signed by all of its required signers.\n */\nexport type FullySignedOffchainMessageEnvelope = NominalType<'offchainMessageEnvelopeSignedness', 'fullySigned'>;\n\n/**\n * Represents an address that is required to sign an offchain message for it to be valid.\n */\nexport type OffchainMessageSignatory = Readonly<{\n address: Address;\n}>;\n\n/**\n * An offchain message having a list of accounts that must sign it in order for it to be valid.\n */\nexport interface OffchainMessageWithRequiredSignatories<\n TSignatory extends OffchainMessageSignatory = OffchainMessageSignatory,\n> {\n requiredSignatories: readonly TSignatory[];\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign an offchain message, this method will return a new signed offchain message\n * envelope of type {@link OffchainMessageEnvelope}.\n *\n * Though the resulting message might be signed by all required signers, this function will not\n * assert that it is. A partially signed message is not complete, but can be serialized and\n * deserialized.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { partiallySignOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * const partiallySignedOffchainMessage = await partiallySignOffchainMessageEnvelope(\n * [myPrivateKey],\n * offchainMessageEnvelope,\n * );\n * ```\n *\n * @see {@link signOffchainMessageEnvelope} if you want to assert that the message is signed by all\n * its required signers after signing.\n */\nexport async function partiallySignOffchainMessageEnvelope(\n keyPairs: CryptoKeyPair[],\n offchainMessageEnvelope: TOffchainMessageEnvelope,\n): Promise {\n let newSignatures: Record | undefined;\n let unexpectedSigners: Set
| undefined;\n\n const requiredSignatoryAddresses = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content);\n\n await Promise.all(\n keyPairs.map(async keyPair => {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n\n // Check if the address is expected to sign the message\n if (!requiredSignatoryAddresses.includes(address)) {\n // address is not an expected signer for this message\n unexpectedSigners ||= new Set();\n unexpectedSigners.add(address);\n return;\n }\n\n // Return if there are any unexpected signers already since we won't be using signatures\n if (unexpectedSigners) {\n return;\n }\n\n const existingSignature = offchainMessageEnvelope.signatures[address];\n const newSignature = await signBytes(keyPair.privateKey, offchainMessageEnvelope.content);\n\n if (existingSignature != null && bytesEqual(newSignature, existingSignature)) {\n // already have the same signature set\n return;\n }\n\n newSignatures ||= {};\n newSignatures[address] = newSignature;\n }),\n );\n\n if (unexpectedSigners && unexpectedSigners.size > 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, {\n expectedAddresses: requiredSignatoryAddresses,\n unexpectedAddresses: [...unexpectedSigners],\n });\n }\n\n if (!newSignatures) {\n return offchainMessageEnvelope;\n }\n\n return Object.freeze({\n ...offchainMessageEnvelope,\n signatures: Object.freeze({\n ...offchainMessageEnvelope.signatures,\n ...newSignatures,\n }),\n });\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign an offchain message envelope, this method will return a new signed envelope of\n * type {@link FullySignedOffchainMessageEnvelope}.\n *\n * This function will throw unless the resulting message is fully signed.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { signOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * const signedOffchainMessage = await signOffchainMessageEnvelope(\n * [myPrivateKey],\n * offchainMessageEnvelope,\n * );\n * ```\n *\n * @see {@link partiallySignOffchainMessageEnvelope} if you want to sign the message without\n * asserting that the resulting message envelope is fully signed.\n */\nexport async function signOffchainMessageEnvelope(\n keyPairs: CryptoKeyPair[],\n offchainMessageEnvelope: TOffchainMessageEnvelope,\n): Promise {\n const out = await partiallySignOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope);\n assertIsFullySignedOffchainMessageEnvelope(out);\n Object.freeze(out);\n return out;\n}\n\n/**\n * A type guard that returns `true` if the input {@link OffchainMessageEnvelope} is fully signed,\n * and refines its type for use in your program, adding the\n * {@link FullySignedOffchainMessageEnvelope} type.\n *\n * @example\n * ```ts\n * import { isFullySignedOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * const offchainMessageEnvelope = getOffchainMessageDecoder().decode(offchainMessageBytes);\n * if (isFullySignedOffchainMessageEnvelope(offchainMessageEnvelope)) {\n * // At this point we know that the offchain message is fully signed.\n * }\n * ```\n */\nexport function isFullySignedOffchainMessageEnvelope(\n offchainMessage: TEnvelope,\n): offchainMessage is FullySignedOffchainMessageEnvelope & TEnvelope {\n return Object.entries(offchainMessage.signatures).every(([_, signatureBytes]) => !!signatureBytes);\n}\n\n/**\n * From time to time you might acquire a {@link OffchainMessageEnvelope}, that you expect to be\n * fully signed, from an untrusted network API or user input. Use this function to assert that such\n * an offchain message is fully signed.\n *\n * @example\n * ```ts\n * import { assertIsFullySignedOffchainMessage } from '@solana/offchain-messages';\n *\n * const offchainMessageEnvelope = getOffchainMessageDecoder().decode(offchainMessageBytes);\n * try {\n * // If this type assertion function doesn't throw, then Typescript will upcast\n * // `offchainMessageEnvelope` to `FullySignedOffchainMessageEnvelope`.\n * assertIsFullySignedOffchainMessageEnvelope(offchainMessage);\n * // At this point we know that the offchain message is signed by all required signers.\n * } catch(e) {\n * if (isSolanaError(e, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING)) {\n * setError(`Missing signatures for ${e.context.addresses.join(', ')}`);\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function assertIsFullySignedOffchainMessageEnvelope(\n offchainMessage: TEnvelope,\n): asserts offchainMessage is FullySignedOffchainMessageEnvelope & TEnvelope {\n const missingSigs: Address[] = [];\n Object.entries(offchainMessage.signatures).forEach(([address, signatureBytes]) => {\n if (!signatureBytes) {\n missingSigs.push(address as Address);\n }\n });\n\n if (missingSigs.length > 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, {\n addresses: missingSigs,\n });\n }\n}\n\n/**\n * Asserts that there are signatures present for all of an offchain message's required signatories,\n * and that those signatures are valid given the message.\n *\n * @example\n * ```ts\n * import { isSolanaError, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE } from '@solana/errors';\n * import { verifyOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * try {\n * await verifyOffchainMessageEnvelope(offchainMessageEnvelope);\n * // At this point the message is valid and signed by all of the required signatories.\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE)) {\n * if (e.context.signatoriesWithMissingSignatures.length) {\n * console.error(\n * 'Missing signatures for the following addresses',\n * e.context.signatoriesWithMissingSignatures,\n * );\n * }\n * if (e.context.signatoriesWithInvalidSignatures.length) {\n * console.error(\n * 'Signatures for the following addresses are invalid',\n * e.context.signatoriesWithInvalidSignatures,\n * );\n * }\n * }\n * throw e;\n * }\n */\nexport async function verifyOffchainMessageEnvelope(offchainMessageEnvelope: OffchainMessageEnvelope): Promise {\n let errorContext;\n const requiredSignatories = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content);\n await Promise.all(\n requiredSignatories.map(async address => {\n const signature = offchainMessageEnvelope.signatures[address];\n if (signature == null) {\n errorContext ||= {};\n errorContext.signatoriesWithMissingSignatures ||= [];\n errorContext.signatoriesWithMissingSignatures.push(address);\n } else {\n const publicKey = await getPublicKeyFromAddress(address);\n if (await verifySignature(publicKey, signature, offchainMessageEnvelope.content)) {\n return true;\n } else {\n errorContext ||= {};\n errorContext.signatoriesWithInvalidSignatures ||= [];\n errorContext.signatoriesWithInvalidSignatures.push(address);\n }\n }\n }),\n );\n if (errorContext) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, errorContext);\n }\n}\n","/**\n * Defines a plugin that transforms or extends a client with additional functionality.\n *\n * For instance, plugins may add RPC capabilities, wallet integration, transaction building,\n * or other features necessary for interacting with the Solana blockchain.\n *\n * Plugins are functions that take a client object as input and return a new client object\n * or a promise that resolves to a new client object. This allows for both synchronous\n * and asynchronous transformations and extensions of the client.\n *\n * Plugins are usually applied using the `use` method on a {@link Client} or {@link AsyncClient}\n * instance, which {@link createEmptyClient} provides as a starting point.\n *\n * @typeParam TInput - The input client object type that this plugin accepts.\n * @typeParam TOutput - The output type. Either a new client object or a promise resolving to one.\n *\n * @example Basic RPC plugin\n * Given an RPC endpoint, this plugin adds an `rpc` property to the client.\n *\n * ```ts\n * import { createEmptyClient, createSolanaRpc } from '@solana/kit';\n *\n * // Define a simple RPC plugin.\n * function rpcPlugin(endpoint: string) {\n * return (client: T) => ({...client, rpc: createSolanaRpc(endpoint) });\n * }\n *\n * // Use the plugin.\n * const client = createEmptyClient().use(rpcPlugin('https://api.mainnet-beta.solana.com'));\n * await client.rpc.getLatestBlockhash().send();\n * ```\n *\n * @example Async plugin that generates a payer wallet\n * The following plugin shows how to create an asynchronous plugin that generates a new keypair signer.\n *\n * ```ts\n * import { createEmptyClient, generateKeypairSigner } from '@solana/kit';\n *\n * // Define a plugin that generates a new keypair signer.\n * function generatedPayerPlugin() {\n * return async (client: T) => ({...client, payer: await generateKeypairSigner() });\n * }\n *\n * // Use the plugin.\n * const client = await createEmptyClient().use(generatedPayerPlugin());\n * console.log(client.payer.address);\n * ```\n *\n * @example Plugins with input requirements\n * A plugin can specify required properties on the input client. The example below requires the\n * client to already have a `payer` signer attached to the client in order to perform an airdrop.\n *\n * ```ts\n * import { createEmptyClient, TransactionSigner, Lamports, lamports } from '@solana/kit';\n *\n * // Define a plugin that airdrops lamports to the payer set on the client.\n * function airdropPayerPlugin(lamports: Lamports) {\n * return async (client: T) => {\n * await myAirdropFunction(client.payer, lamports);\n * return client;\n * };\n * }\n *\n * // Use the plugins.\n * const client = await createEmptyClient()\n * .use(generatedPayerPlugin()) // This is required before using the airdrop plugin.\n * .use(airdropPayerPlugin(lamports(1_000_000_000n)));\n * ```\n *\n * @example Chaining plugins\n * Multiple plugins — asynchronous or not — can be chained together to build up complex clients.\n * The example below demonstrates how to gradually build a client with multiple plugins.\n * Notice how, despite having multiple asynchronous plugins, we only need to `await` the final result.\n * This is because the `use` method on `AsyncClient` returns another `AsyncClient`, allowing for seamless chaining.\n *\n * ```ts\n * import { createEmptyClient, createSolanaRpc, createSolanaRpcSubscriptions, generateKeypairSigner } from '@solana/kit';\n *\n * // Define multiple plugins.\n * function rpcPlugin(endpoint: string) {\n * return (client: T) => ({...client, rpc: createSolanaRpc(endpoint) });\n * }\n * function rpcSubscriptionsPlugin(endpoint: string) {\n * return (client: T) => ({...client, rpc: createSolanaRpcSubscriptions(endpoint) });\n * }\n * function generatedPayerPlugin() {\n * return async (client: T) => ({...client, payer: await generateKeypairSigner() });\n * }\n * function generatedAuthorityPlugin() {\n * return async (client: T) => ({...client, authority: await generateKeypairSigner() });\n * }\n *\n * // Chain plugins together.\n * const client = await createEmptyClient()\n * .use(rpcPlugin('https://api.mainnet-beta.solana.com'))\n * .use(rpcSubscriptionsPlugin('wss://api.mainnet-beta.solana.com'))\n * .use(generatedPayerPlugin())\n * .use(generatedAuthorityPlugin());\n * ```\n */\nexport type ClientPlugin | object> = (input: TInput) => TOutput;\n\n/**\n * A client that can be extended with plugins.\n *\n * The `Client` type represents a client object that can be built up through\n * the application of one or more plugins. It provides a `use` method to\n * apply plugins, either synchronously (returning a new `Client`) or\n * asynchronously (returning an {@link AsyncClient}).\n *\n * @typeParam TSelf - The current shape of the client object including all applied plugins.\n */\nexport type Client = TSelf & {\n /**\n * Applies a plugin to extend or transform the client.\n *\n * @param plugin The plugin function to apply to this client.\n * @returns Either a new `Client` (for sync plugins) or {@link AsyncClient} (for async plugins).\n */\n readonly use: | object>(\n plugin: ClientPlugin,\n ) => TOutput extends Promise ? AsyncClient : Client;\n};\n\n/**\n * An asynchronous wrapper that represents a promise of a client.\n *\n * The `AsyncClient` type is returned when an async plugin is applied to a client.\n * It behaves like a `Promise>` but with an additional `use` method\n * that allows chaining more plugins before the promise resolves.\n *\n * This enables fluent chaining of both synchronous and asynchronous plugins\n * without having to await intermediate promises.\n *\n * @typeParam TSelf - The shape of the client object that this async client will resolve to.\n */\nexport type AsyncClient = Promise> & {\n /**\n * Applies a plugin to the client once it resolves.\n *\n * @param plugin The plugin function to apply to the resolved client.\n * @returns A new `AsyncClient` representing the result of applying the plugin.\n */\n readonly use: | object>(\n plugin: ClientPlugin,\n ) => AsyncClient ? (U extends object ? U : never) : TOutput>;\n};\n\n// TODO(loris): Add examples in this docblock using real plugins once they have been published.\n\n/**\n * Creates a new empty client that can be extended with plugins.\n *\n * This serves as an entry point for building Solana clients.\n * Start with an empty client and chain the `.use()` method\n * to apply plugins that add various functionalities such as RPC\n * connectivity, wallet integration, transaction building, and more.\n *\n * See {@link ClientPlugin} for detailed examples on creating and using plugins.\n *\n * @returns An empty client object with only the `use` method available.\n *\n * @example Basic client setup\n * ```ts\n * import { createEmptyClient } from '@solana/client';\n *\n * const client = createEmptyClient()\n * .use(myRpcPlugin('https://api.mainnet-beta.solana.com'))\n * .use(myWalletPlugin());\n * ```\n */\nexport function createEmptyClient(): Client {\n return addUse({});\n}\n\nfunction addUse(value: TSelf): Client {\n return Object.freeze({\n ...value,\n use | object>(plugin: ClientPlugin) {\n const result = plugin(value);\n return result instanceof Promise ? createAsyncClient(result) : addUse(result);\n },\n } as Client);\n}\n\nfunction createAsyncClient(promise: Promise): AsyncClient {\n return Object.freeze({\n catch(onrejected) {\n return promise.then(v => addUse(v)).catch(onrejected);\n },\n finally(onfinally) {\n return promise.then(v => addUse(v)).finally(onfinally);\n },\n then(onfulfilled, onrejected) {\n return promise.then(v => addUse(v)).then(onfulfilled, onrejected);\n },\n use | object>(plugin: ClientPlugin) {\n return createAsyncClient(promise.then(plugin));\n },\n } as AsyncClient);\n}\n","import type { Address } from '@solana/addresses';\nimport { isSolanaError, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, SolanaError } from '@solana/errors';\n\n/**\n * Identifies whether an error -- typically caused by a transaction failure -- is a custom program\n * error from the provided program address.\n *\n * @param transactionMessage The transaction message that failed to execute. Since the RPC response\n * only provides the index of the failed instruction, the transaction message is required to\n * determine its program address\n * @param programAddress The address of the program from which the error is expected to have\n * originated\n * @param code The expected error code of the custom program error. When provided, the function will\n * check that the custom program error code matches the given value.\n *\n * @example\n * ```ts\n * try {\n * // Send and confirm your transaction.\n * } catch (error) {\n * if (isProgramError(error, transactionMessage, myProgramAddress, 42)) {\n * // Handle custom program error 42 from this program.\n * } else if (isProgramError(error, transactionMessage, myProgramAddress)) {\n * // Handle all other custom program errors from this program.\n * } else {\n * throw error;\n * }\n * }\n * ```\n */\nexport function isProgramError(\n error: unknown,\n transactionMessage: { instructions: Record },\n programAddress: Address,\n code?: TProgramErrorCode,\n): error is Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> &\n SolanaError {\n if (!isSolanaError(error, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM)) {\n return false;\n }\n const instructionProgramAddress = transactionMessage.instructions[error.context.index]?.programAddress;\n if (!instructionProgramAddress || instructionProgramAddress !== programAddress) {\n return false;\n }\n return typeof code === 'undefined' || error.context.code === code;\n}\n","/**\n * This function is a replacement for `JSON.parse` that can handle large\n * unsafe integers by parsing them as BigInts. It transforms every\n * numerical value into a BigInt without loss of precision.\n */\nexport function parseJsonWithBigInts(json: string): unknown {\n return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => {\n return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value;\n });\n}\n\nfunction wrapIntegersInBigIntValueObject(json: string): string {\n const out = [];\n let inQuote = false;\n for (let ii = 0; ii < json.length; ii++) {\n let isEscaped = false;\n if (json[ii] === '\\\\') {\n out.push(json[ii++]);\n isEscaped = !isEscaped;\n }\n if (json[ii] === '\"') {\n out.push(json[ii]);\n if (!isEscaped) {\n inQuote = !inQuote;\n }\n continue;\n }\n if (!inQuote) {\n const consumedNumber = consumeNumber(json, ii);\n if (consumedNumber?.length) {\n ii += consumedNumber.length - 1;\n // Don't wrap numbers that contain a decimal point or a negative exponent.\n if (consumedNumber.match(/\\.|[eE]-/)) {\n out.push(consumedNumber);\n } else {\n out.push(wrapBigIntValueObject(consumedNumber));\n }\n continue;\n }\n }\n out.push(json[ii]);\n }\n\n return out.join('');\n}\n\nfunction consumeNumber(json: string, ii: number): string | null {\n /** @see https://stackoverflow.com/a/13340826/11440277 */\n const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\n\n // Stop early if the first character isn't a digit or a minus sign.\n if (!json[ii]?.match(/[-\\d]/)) {\n return null;\n }\n\n // Otherwise, check if the next characters form a valid JSON number.\n const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX);\n return numberMatch ? numberMatch[0] : null;\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: string): string {\n return `{\"$n\":\"${value}\"}`;\n}\n\nfunction unwrapBigIntValueObject({ $n }: BigIntValueObject): bigint {\n if ($n.match(/[eE]/)) {\n const [units, exponent] = $n.split(/[eE]/);\n return BigInt(units) * BigInt(10) ** BigInt(exponent);\n }\n return BigInt($n);\n}\n\nfunction isBigIntValueObject(value: unknown): value is BigIntValueObject {\n return !!value && typeof value === 'object' && '$n' in value && typeof value.$n === 'string';\n}\n","import { RpcRequest } from './rpc-request';\n\nlet _nextMessageId = 0n;\nfunction getNextMessageId(): string {\n const id = _nextMessageId;\n _nextMessageId++;\n return id.toString();\n}\n\n/**\n * Returns a spec-compliant JSON RPC 2.0 message, given a method name and some params.\n *\n * Generates a new `id` on each call by incrementing a `bigint` and casting it to a string.\n */\nexport function createRpcMessage(request: RpcRequest) {\n return {\n id: getNextMessageId(),\n jsonrpc: '2.0',\n method: request.methodName,\n params: request.params,\n };\n}\n","/**\n * Transforms a value into a JSON string, whilst rendering bigints as large unsafe integers.\n */\nexport function stringifyJsonWithBigInts(value: unknown, space?: number | string): string {\n return unwrapBigIntValueObject(\n JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? wrapBigIntValueObject(v) : v), space),\n );\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: bigint): BigIntValueObject {\n return { $n: `${value}` };\n}\n\nfunction unwrapBigIntValueObject(value: string): string {\n return value.replace(/\\{\\s*\"\\$n\"\\s*:\\s*\"(-?\\d+)\"\\s*\\}/g, '$1');\n}\n","import { SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, SolanaError } from '@solana/errors';\nimport { Callable, Flatten, OverloadImplementations, UnionToIntersection } from '@solana/rpc-spec-types';\n\nimport { RpcApi, RpcPlan } from './rpc-api';\nimport { RpcTransport } from './rpc-transport';\n\nexport type RpcConfig = Readonly<{\n api: RpcApi;\n transport: TRpcTransport;\n}>;\n\n/**\n * An object that exposes all of the functions described by `TRpcMethods`.\n *\n * Calling each method returns a {@link PendingRpcRequest | PendingRpcRequest} where\n * `TResponse` is that method's response type.\n */\nexport type Rpc = {\n [TMethodName in keyof TRpcMethods]: PendingRpcRequestBuilder>;\n};\n\n/**\n * Pending requests are the result of calling a supported method on a {@link Rpc} object. They\n * encapsulate all of the information necessary to make the request without actually making it.\n *\n * Calling the {@link PendingRpcRequest.send | `send(options)`} method on a\n * {@link PendingRpcRequest | PendingRpcRequest} will trigger the request and return a\n * promise for `TResponse`.\n */\nexport type PendingRpcRequest = {\n send(options?: RpcSendOptions): Promise;\n};\n\nexport type RpcSendOptions = Readonly<{\n /**\n * An optional signal that you can supply when triggering a {@link PendingRpcRequest} that you\n * might later need to abort.\n */\n abortSignal?: AbortSignal;\n}>;\n\ntype PendingRpcRequestBuilder = UnionToIntersection<\n Flatten<{\n [P in keyof TMethodImplementations]: PendingRpcRequestReturnTypeMapper;\n }>\n>;\n\ntype PendingRpcRequestReturnTypeMapper =\n // Check that this property of the TRpcMethods interface is, in fact, a function.\n TMethodImplementation extends Callable\n ? (...args: Parameters) => PendingRpcRequest>\n : never;\n\n/**\n * Creates a {@link Rpc} instance given a {@link RpcApi | RpcApi} and a\n * {@link RpcTransport} capable of fulfilling them.\n */\nexport function createRpc(\n rpcConfig: RpcConfig,\n): Rpc {\n return makeProxy(rpcConfig);\n}\n\nfunction makeProxy(\n rpcConfig: RpcConfig,\n): Rpc {\n return new Proxy(rpcConfig.api, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get(target, p, receiver) {\n if (p === 'then') {\n return undefined;\n }\n return function (...rawParams: unknown[]) {\n const methodName = p.toString();\n const getApiPlan = Reflect.get(target, methodName, receiver);\n if (!getApiPlan) {\n throw new SolanaError(SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, {\n method: methodName,\n params: rawParams,\n });\n }\n const apiPlan = getApiPlan(...rawParams);\n return createPendingRpcRequest(rpcConfig, apiPlan);\n };\n },\n }) as Rpc;\n}\n\nfunction createPendingRpcRequest(\n { transport }: RpcConfig,\n plan: RpcPlan,\n): PendingRpcRequest {\n return {\n async send(options?: RpcSendOptions): Promise {\n return await plan.execute({ signal: options?.abortSignal, transport });\n },\n };\n}\n","import {\n Callable,\n createRpcMessage,\n RpcRequestTransformer,\n RpcResponse,\n RpcResponseTransformer,\n} from '@solana/rpc-spec-types';\n\nimport type { RpcTransport } from './rpc-transport';\n\nexport type RpcApiConfig = Readonly<{\n /**\n * An optional function that transforms the {@link RpcRequest} before it is sent to the JSON RPC\n * server.\n *\n * This is useful when the params supplied by the caller need to be transformed before\n * forwarding the message to the server. Use cases for this include applying defaults,\n * forwarding calls to renamed methods, and serializing complex values.\n */\n requestTransformer?: RpcRequestTransformer;\n /**\n * An optional function that transforms the {@link RpcResponse} before it is returned to the\n * caller.\n *\n * Use cases for this include constructing complex data types from serialized data, and throwing\n * exceptions.\n */\n responseTransformer?: RpcResponseTransformer;\n}>;\n\n/**\n * This type allows an {@link RpcApi} to describe how a particular request should be issued to the\n * JSON RPC server.\n *\n * Given a function that was called on a {@link Rpc}, this object exposes an `execute` function that\n * dictates which request will be sent, how the underlying transport will be used, and how the\n * responses will be transformed.\n *\n * This function accepts a {@link RpcTransport} and an `AbortSignal` and asynchronously returns a\n * {@link RpcResponse}. This gives us the opportunity to:\n *\n * - define the `payload` from the requested method name and parameters before passing it to the\n * transport.\n * - call the underlying transport zero, one or multiple times depending on the use-case (e.g.\n * caching or aggregating multiple responses).\n * - transform the response from the JSON RPC server, in case it does not match the `TResponse`\n * specified by the {@link PendingRpcRequest | PendingRpcRequest} returned from that\n * function.\n */\nexport type RpcPlan = {\n execute: (\n config: Readonly<{\n signal?: AbortSignal;\n transport: RpcTransport;\n }>,\n ) => Promise>;\n};\n\n/**\n * For each of `TRpcMethods`, this object exposes a method with the same name that maps between its\n * input arguments and a {@link RpcPlan | RpcPlan} that implements the execution of a\n * JSON RPC request to fetch `TResponse`.\n */\nexport type RpcApi = {\n [MethodName in keyof TRpcMethods]: RpcReturnTypeMapper;\n};\n\ntype RpcReturnTypeMapper = TRpcMethod extends Callable\n ? (...rawParams: unknown[]) => RpcPlan>\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RpcApiMethod = (...args: any) => any;\ninterface RpcApiMethods {\n [methodName: string]: RpcApiMethod;\n}\n\n/**\n * Creates a JavaScript proxy that converts _any_ function call called on it to a {@link RpcPlan} by\n * creating an `execute` function that:\n *\n * - sets the transport payload to a JSON RPC v2 payload object with the requested `methodName` and\n * `params` properties, optionally transformed by {@link RpcApiConfig.requestTransformer}.\n * - transforms the transport's response using the {@link RpcApiConfig.responseTransformer}\n * function, if provided.\n *\n * @example\n * ```ts\n * // For example, given this `RpcApi`:\n * const rpcApi = createJsonRpcApi({\n * requestTransformer: (...rawParams) => rawParams.reverse(),\n * responseTransformer: response => response.result,\n * });\n *\n * // ...the following function call:\n * rpcApi.foo('bar', { baz: 'bat' });\n *\n * // ...will produce a `RpcPlan` that:\n * // - Uses the following payload: { id: 1, jsonrpc: '2.0', method: 'foo', params: [{ baz: 'bat' }, 'bar'] }.\n * // - Returns the \"result\" property of the RPC response.\n * ```\n */\nexport function createJsonRpcApi(config?: RpcApiConfig): RpcApi {\n return new Proxy({} as RpcApi, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get>(\n ...args: Parameters>['get']>>\n ) {\n const [_, p] = args;\n const methodName = p.toString() as keyof TRpcMethods as string;\n return function (\n ...rawParams: Parameters<\n TRpcMethods[TMethodName] extends CallableFunction ? TRpcMethods[TMethodName] : never\n >\n ): RpcPlan> {\n const rawRequest = Object.freeze({ methodName, params: rawParams });\n const request = config?.requestTransformer ? config?.requestTransformer(rawRequest) : rawRequest;\n return Object.freeze(>>{\n execute: async ({ signal, transport }) => {\n const payload = createRpcMessage(request);\n const response = await transport({ payload, signal });\n if (!config?.responseTransformer) {\n return response;\n }\n return config.responseTransformer(response, request);\n },\n });\n };\n },\n });\n}\n","import { RpcResponse } from '@solana/rpc-spec-types';\n\ntype Config = Readonly<{\n /** A value of arbitrary type to be sent to a RPC server */\n payload: unknown;\n /**\n * An optional `AbortSignal` on which the `'abort'` event will be fired if the request should be\n * cancelled.\n */\n signal?: AbortSignal;\n}>;\n\n/**\n * A function that can act as a transport for a {@link Rpc}. It need only return a promise for a\n * response given the supplied config.\n */\nexport type RpcTransport = {\n (config: Config): Promise>;\n};\n\n/**\n * Returns `true` if the given payload is a JSON RPC v2 payload.\n *\n * This means, the payload is an object such that:\n *\n * - It has a `jsonrpc` property with a value of `'2.0'`.\n * - It has a `method` property that is a string.\n * - It has a `params` property of any type.\n *\n * @example\n * ```ts\n * import { isJsonRpcPayload } from '@solana/rpc-spec';\n *\n * if (isJsonRpcPayload(payload)) {\n * const payloadMethod: string = payload.method;\n * const payloadParams: unknown = payload.params;\n * }\n * ```\n */\nexport function isJsonRpcPayload(payload: unknown): payload is Readonly<{\n jsonrpc: '2.0';\n method: string;\n params: unknown;\n}> {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) {\n return false;\n }\n return (\n 'jsonrpc' in payload &&\n payload.jsonrpc === '2.0' &&\n 'method' in payload &&\n typeof payload.method === 'string' &&\n 'params' in payload\n );\n}\n","export function downcastNodeToNumberIfBigint(value: bigint): number;\nexport function downcastNodeToNumberIfBigint(value: T): T;\nexport function downcastNodeToNumberIfBigint(value: unknown): unknown {\n return typeof value === 'bigint'\n ? // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana\n // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely\n // downcasting `bigints` to `numbers`.\n Number(value)\n : value;\n}\n","import { RpcRequest, RpcRequestTransformer, RpcResponseTransformer } from '@solana/rpc-spec-types';\n\nexport type KeyPathWildcard = { readonly ['__keyPathWildcard:@solana/kit']: unique symbol };\nexport type KeyPath = ReadonlyArray;\n\nexport const KEYPATH_WILDCARD = {} as KeyPathWildcard;\n\ntype NodeVisitor = (value: unknown, state: TState) => unknown;\nexport type TraversalState = Readonly<{\n keyPath: KeyPath;\n}>;\n\nfunction getTreeWalker(visitors: NodeVisitor[]) {\n return function traverse(node: unknown, state: TState): unknown {\n if (Array.isArray(node)) {\n return node.map((element, ii) => {\n const nextState = {\n ...state,\n keyPath: [...state.keyPath, ii],\n };\n return traverse(element, nextState);\n });\n } else if (typeof node === 'object' && node !== null) {\n const out: Record = {};\n for (const propName in node) {\n if (!Object.prototype.hasOwnProperty.call(node, propName)) {\n continue;\n }\n const nextState = {\n ...state,\n keyPath: [...state.keyPath, propName],\n };\n out[propName] = traverse(node[propName as keyof typeof node], nextState);\n }\n return out;\n } else {\n return visitors.reduce((acc, visitNode) => visitNode(acc, state), node);\n }\n };\n}\n\n/**\n * Creates a transformer that traverses the request parameters and executes the provided visitors at\n * each node. A custom initial state can be provided but must at least provide `{ keyPath: [] }`.\n *\n * @example\n * ```ts\n * import { getTreeWalkerRequestTransformer } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getTreeWalkerRequestTransformer(\n * [\n * // Replaces foo.bar with \"baz\".\n * (node, state) => (state.keyPath === ['foo', 'bar'] ? 'baz' : node),\n * // Increments all numbers by 1.\n * node => (typeof node === number ? node + 1 : node),\n * ],\n * { keyPath: [] },\n * );\n * ```\n */\nexport function getTreeWalkerRequestTransformer(\n visitors: NodeVisitor[],\n initialState: TState,\n): RpcRequestTransformer {\n return (request: RpcRequest): RpcRequest => {\n const traverse = getTreeWalker(visitors);\n return Object.freeze({\n ...request,\n params: traverse(request.params, initialState),\n });\n };\n}\n\nexport function getTreeWalkerResponseTransformer(\n visitors: NodeVisitor[],\n initialState: TState,\n): RpcResponseTransformer {\n return json => getTreeWalker(visitors)(json, initialState);\n}\n","import { downcastNodeToNumberIfBigint } from './request-transformer-bigint-downcast-internal';\nimport { getTreeWalkerRequestTransformer } from './tree-traversal';\n\n/**\n * Creates a transformer that downcasts all `BigInt` values to `Number`.\n *\n * @example\n * ```ts\n * import { getBigIntDowncastRequestTransformer } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getBigIntDowncastRequestTransformer();\n * ```\n *\n */\nexport function getBigIntDowncastRequestTransformer() {\n return getTreeWalkerRequestTransformer([downcastNodeToNumberIfBigint], { keyPath: [] });\n}\n","import { Commitment } from '@solana/rpc-types';\n\nexport function applyDefaultCommitment({\n commitmentPropertyName,\n params,\n optionsObjectPositionInParams,\n overrideCommitment,\n}: Readonly<{\n commitmentPropertyName: string;\n optionsObjectPositionInParams: number;\n overrideCommitment?: Commitment;\n params: unknown[];\n}>) {\n const paramInTargetPosition = params[optionsObjectPositionInParams];\n if (\n // There's no config.\n paramInTargetPosition === undefined ||\n // There is a config object.\n (paramInTargetPosition && typeof paramInTargetPosition === 'object' && !Array.isArray(paramInTargetPosition))\n ) {\n if (\n // The config object already has a commitment set.\n paramInTargetPosition &&\n commitmentPropertyName in paramInTargetPosition\n ) {\n if (\n !paramInTargetPosition[commitmentPropertyName as keyof typeof paramInTargetPosition] ||\n paramInTargetPosition[commitmentPropertyName as keyof typeof paramInTargetPosition] === 'finalized'\n ) {\n // Delete the commitment property; `finalized` is already the server default.\n const nextParams = [...params];\n const {\n [commitmentPropertyName as keyof typeof paramInTargetPosition]: _, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...rest\n } = paramInTargetPosition;\n if (Object.keys(rest).length > 0) {\n nextParams[optionsObjectPositionInParams] = rest;\n } else {\n if (optionsObjectPositionInParams === nextParams.length - 1) {\n nextParams.length--;\n } else {\n nextParams[optionsObjectPositionInParams] = undefined;\n }\n }\n return nextParams;\n }\n } else if (overrideCommitment !== 'finalized') {\n // Apply the default commitment.\n const nextParams = [...params];\n nextParams[optionsObjectPositionInParams] = {\n ...paramInTargetPosition,\n [commitmentPropertyName]: overrideCommitment,\n };\n return nextParams;\n }\n }\n return params;\n}\n","import type { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec-types';\nimport type { Commitment } from '@solana/rpc-types';\n\nimport { applyDefaultCommitment } from './request-transformer-default-commitment-internal';\n\n/**\n * Creates a transformer that adds the provided default commitment to the configuration object of the request when applicable.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { getDefaultCommitmentRequestTransformer, OPTIONS_OBJECT_POSITION_BY_METHOD } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getDefaultCommitmentRequestTransformer({\n * defaultCommitment: 'confirmed',\n * optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD,\n * });\n */\nexport function getDefaultCommitmentRequestTransformer({\n defaultCommitment,\n optionsObjectPositionByMethod,\n}: Readonly<{\n defaultCommitment?: Commitment;\n optionsObjectPositionByMethod: Record;\n}>): RpcRequestTransformer {\n return (request: RpcRequest): RpcRequest => {\n const { params, methodName } = request;\n\n // We only apply default commitment to array parameters.\n if (!Array.isArray(params)) {\n return request;\n }\n\n // Find the position of the options object in the parameters and abort if not found.\n const optionsObjectPositionInParams = optionsObjectPositionByMethod[methodName];\n if (optionsObjectPositionInParams == null) {\n return request;\n }\n\n return Object.freeze({\n methodName,\n params: applyDefaultCommitment({\n commitmentPropertyName: methodName === 'sendTransaction' ? 'preflightCommitment' : 'commitment',\n optionsObjectPositionInParams,\n overrideCommitment: defaultCommitment,\n params,\n }),\n });\n };\n}\n","import { KeyPath, TraversalState } from './tree-traversal';\n\nexport function getIntegerOverflowNodeVisitor(onIntegerOverflow: (keyPath: KeyPath, value: bigint) => void) {\n return (value: T, { keyPath }: TraversalState): T => {\n if (typeof value === 'bigint') {\n if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) {\n onIntegerOverflow(keyPath as (number | string)[], value);\n }\n }\n return value;\n };\n}\n","import { RpcRequest } from '@solana/rpc-spec-types';\n\nimport { getIntegerOverflowNodeVisitor } from './request-transformer-integer-overflow-internal';\nimport { getTreeWalkerRequestTransformer, KeyPath } from './tree-traversal';\n\nexport type IntegerOverflowHandler = (request: RpcRequest, keyPath: KeyPath, value: bigint) => void;\n\n/**\n * Creates a transformer that traverses the request parameters and executes the provided handler\n * when an integer overflow is detected.\n *\n * @example\n * ```ts\n * import { getIntegerOverflowRequestTransformer } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getIntegerOverflowRequestTransformer((request, keyPath, value) => {\n * throw new Error(`Integer overflow at ${keyPath.join('.')}: ${value}`);\n * });\n * ```\n */\nexport function getIntegerOverflowRequestTransformer(onIntegerOverflow: IntegerOverflowHandler) {\n return (request: RpcRequest): RpcRequest => {\n const transformer = getTreeWalkerRequestTransformer(\n [getIntegerOverflowNodeVisitor((...args) => onIntegerOverflow(request, ...args))],\n { keyPath: [] },\n );\n return transformer(request);\n };\n}\n","export const OPTIONS_OBJECT_POSITION_BY_METHOD: Record = {\n accountNotifications: 1,\n blockNotifications: 1,\n getAccountInfo: 1,\n getBalance: 1,\n getBlock: 1,\n getBlockHeight: 0,\n getBlockProduction: 0,\n getBlocks: 2,\n getBlocksWithLimit: 2,\n getEpochInfo: 0,\n getFeeForMessage: 1,\n getInflationGovernor: 0,\n getInflationReward: 1,\n getLargestAccounts: 0,\n getLatestBlockhash: 0,\n getLeaderSchedule: 1,\n getMinimumBalanceForRentExemption: 1,\n getMultipleAccounts: 1,\n getProgramAccounts: 1,\n getSignaturesForAddress: 1,\n getSlot: 0,\n getSlotLeader: 0,\n getStakeMinimumDelegation: 0,\n getSupply: 0,\n getTokenAccountBalance: 1,\n getTokenAccountsByDelegate: 2,\n getTokenAccountsByOwner: 2,\n getTokenLargestAccounts: 1,\n getTokenSupply: 1,\n getTransaction: 1,\n getTransactionCount: 0,\n getVoteAccounts: 0,\n isBlockhashValid: 1,\n logsNotifications: 1,\n programNotifications: 1,\n requestAirdrop: 2,\n sendTransaction: 1,\n signatureNotifications: 1,\n simulateTransaction: 1,\n};\n","import { pipe } from '@solana/functional';\nimport { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec-types';\nimport { Commitment } from '@solana/rpc-types';\n\nimport { getBigIntDowncastRequestTransformer } from './request-transformer-bigint-downcast';\nimport { getDefaultCommitmentRequestTransformer } from './request-transformer-default-commitment';\nimport { getIntegerOverflowRequestTransformer, IntegerOverflowHandler } from './request-transformer-integer-overflow';\nimport { OPTIONS_OBJECT_POSITION_BY_METHOD } from './request-transformer-options-object-position-config';\n\nexport type RequestTransformerConfig = Readonly<{\n /**\n * An optional {@link Commitment} value to use as the default when none is supplied by the\n * caller.\n */\n defaultCommitment?: Commitment;\n /**\n * An optional function that will be called whenever a `bigint` input exceeds that which can be\n * expressed using JavaScript numbers.\n *\n * This is used in the default {@link SolanaRpcSubscriptionsApi} to throw an exception rather\n * than to allow truncated values to propagate through a program.\n */\n onIntegerOverflow?: IntegerOverflowHandler;\n}>;\n\n/**\n * Returns the default request transformer for the Solana RPC API.\n *\n * Under the hood, this function composes multiple\n * {@link RpcRequestTransformer | RpcRequestTransformers} together such as the\n * {@link getDefaultCommitmentTransformer}, the {@link getIntegerOverflowRequestTransformer} and the\n * {@link getBigIntDowncastRequestTransformer}.\n *\n * @example\n * ```ts\n * import { getDefaultRequestTransformerForSolanaRpc } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getDefaultRequestTransformerForSolanaRpc({\n * defaultCommitment: 'confirmed',\n * onIntegerOverflow: (request, keyPath, value) => {\n * throw new Error(`Integer overflow at ${keyPath.join('.')}: ${value}`);\n * },\n * });\n * ```\n */\nexport function getDefaultRequestTransformerForSolanaRpc(config?: RequestTransformerConfig): RpcRequestTransformer {\n const handleIntegerOverflow = config?.onIntegerOverflow;\n return (request: RpcRequest): RpcRequest => {\n return pipe(\n request,\n handleIntegerOverflow ? getIntegerOverflowRequestTransformer(handleIntegerOverflow) : r => r,\n getBigIntDowncastRequestTransformer(),\n getDefaultCommitmentRequestTransformer({\n defaultCommitment: config?.defaultCommitment,\n optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD,\n }),\n );\n };\n}\n","import { KeyPath, KEYPATH_WILDCARD, TraversalState } from './tree-traversal';\n\nexport function getBigIntUpcastVisitor(allowedNumericKeyPaths: readonly KeyPath[]) {\n return function upcastNodeToBigIntIfNumber(value: unknown, { keyPath }: TraversalState) {\n const isInteger = (typeof value === 'number' && Number.isInteger(value)) || typeof value === 'bigint';\n if (!isInteger) return value;\n if (keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) {\n return Number(value);\n } else {\n return BigInt(value);\n }\n };\n}\n\nfunction keyPathIsAllowedToBeNumeric(keyPath: KeyPath, allowedNumericKeyPaths: readonly KeyPath[]) {\n return allowedNumericKeyPaths.some(prohibitedKeyPath => {\n if (prohibitedKeyPath.length !== keyPath.length) {\n return false;\n }\n for (let ii = keyPath.length - 1; ii >= 0; ii--) {\n const keyPathPart = keyPath[ii];\n const prohibitedKeyPathPart = prohibitedKeyPath[ii];\n if (\n prohibitedKeyPathPart !== keyPathPart &&\n (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== 'number')\n ) {\n return false;\n }\n }\n return true;\n });\n}\n","import { getBigIntUpcastVisitor } from './response-transformer-bigint-upcast-internal';\nimport { getTreeWalkerResponseTransformer, KeyPath } from './tree-traversal';\n\n/**\n * Returns a transformer that upcasts all `Number` values to `BigInts` unless they match within the\n * provided {@link KeyPath | KeyPaths}. In other words, the provided {@link KeyPath | KeyPaths} will\n * remain as `Number` values, any other numeric value will be upcasted to a `BigInt`.\n *\n * Note that you can use {@link KEYPATH_WILDCARD} to match any key within a {@link KeyPath}.\n *\n * @example\n * ```ts\n * import { getBigIntUpcastResponseTransformer } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getBigIntUpcastResponseTransformer([\n * ['index'],\n * ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n * ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n * ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n * ]);\n * ```\n */\nexport function getBigIntUpcastResponseTransformer(allowedNumericKeyPaths: readonly KeyPath[]) {\n return getTreeWalkerResponseTransformer([getBigIntUpcastVisitor(allowedNumericKeyPaths)], { keyPath: [] });\n}\n","import { RpcResponseTransformer } from '@solana/rpc-spec-types';\n\ntype JsonRpcResponse = { result: unknown };\n\n/**\n * Returns a transformer that extracts the `result` field from the body of the RPC response.\n *\n * For instance, we go from `{ jsonrpc: '2.0', result: 'foo', id: 1 }` to `'foo'`.\n *\n * @example\n * ```ts\n * import { getResultResponseTransformer } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getResultResponseTransformer();\n * ```\n */\nexport function getResultResponseTransformer(): RpcResponseTransformer {\n return json => (json as JsonRpcResponse).result;\n}\n","import { KeyPath, KEYPATH_WILDCARD } from './tree-traversal';\n\nexport type AllowedNumericKeypaths = Partial>;\n\n// Numeric values nested in `jsonParsed` accounts\nexport const jsonParsedTokenAccountsConfigs = [\n // parsed Token/Token22 token account\n ['data', 'parsed', 'info', 'tokenAmount', 'decimals'],\n ['data', 'parsed', 'info', 'tokenAmount', 'uiAmount'],\n ['data', 'parsed', 'info', 'rentExemptReserve', 'decimals'],\n ['data', 'parsed', 'info', 'rentExemptReserve', 'uiAmount'],\n ['data', 'parsed', 'info', 'delegatedAmount', 'decimals'],\n ['data', 'parsed', 'info', 'delegatedAmount', 'uiAmount'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'olderTransferFee', 'transferFeeBasisPoints'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'newerTransferFee', 'transferFeeBasisPoints'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'preUpdateAverageRate'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'currentRate'],\n];\nexport const jsonParsedAccountsConfigs = [\n ...jsonParsedTokenAccountsConfigs,\n // parsed AddressTableLookup account\n ['data', 'parsed', 'info', 'lastExtendedSlotStartIndex'],\n // parsed Config account\n ['data', 'parsed', 'info', 'slashPenalty'],\n ['data', 'parsed', 'info', 'warmupCooldownRate'],\n // parsed Token/Token22 mint account\n ['data', 'parsed', 'info', 'decimals'],\n // parsed Token/Token22 multisig account\n ['data', 'parsed', 'info', 'numRequiredSigners'],\n ['data', 'parsed', 'info', 'numValidSigners'],\n // parsed Stake account\n ['data', 'parsed', 'info', 'stake', 'delegation', 'warmupCooldownRate'],\n // parsed Sysvar rent account\n ['data', 'parsed', 'info', 'exemptionThreshold'],\n ['data', 'parsed', 'info', 'burnPercent'],\n // parsed Vote account\n ['data', 'parsed', 'info', 'commission'],\n ['data', 'parsed', 'info', 'votes', KEYPATH_WILDCARD, 'confirmationCount'],\n];\nexport const innerInstructionsConfigs = [\n ['index'],\n ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n];\nexport const messageConfig = [\n ['addressTableLookups', KEYPATH_WILDCARD, 'writableIndexes', KEYPATH_WILDCARD],\n ['addressTableLookups', KEYPATH_WILDCARD, 'readonlyIndexes', KEYPATH_WILDCARD],\n ['header', 'numReadonlySignedAccounts'],\n ['header', 'numReadonlyUnsignedAccounts'],\n ['header', 'numRequiredSignatures'],\n ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n] as const;\n","import { getSolanaErrorFromJsonRpcError } from '@solana/errors';\nimport { RpcResponseTransformer } from '@solana/rpc-spec-types';\n\nimport { innerInstructionsConfigs, jsonParsedAccountsConfigs } from './response-transformer-allowed-numeric-values';\nimport { getBigIntUpcastVisitor } from './response-transformer-bigint-upcast-internal';\nimport { getTreeWalkerResponseTransformer, KeyPath, KEYPATH_WILDCARD } from './tree-traversal';\n\ntype JsonRpcResponse = { error: Parameters[0] } | { result: unknown };\n\n// Keypaths for simulateTransaction result that should remain as Number (not BigInt)\n// Note: These are relative to the error.data root, not result.value like in success responses\nfunction getSimulateTransactionAllowedNumericKeypaths(): readonly KeyPath[] {\n return [\n ['loadedAccountsDataSize'],\n ...jsonParsedAccountsConfigs.map(c => ['accounts', KEYPATH_WILDCARD, ...c]),\n ...innerInstructionsConfigs.map(c => ['innerInstructions', KEYPATH_WILDCARD, ...c]),\n ];\n}\n\n/**\n * Returns a transformer that throws a {@link SolanaError} with the appropriate RPC error code if\n * the body of the RPC response contains an error.\n *\n * @example\n * ```ts\n * import { getThrowSolanaErrorResponseTransformer } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getThrowSolanaErrorResponseTransformer();\n * ```\n */\nexport function getThrowSolanaErrorResponseTransformer(): RpcResponseTransformer {\n return (json, request) => {\n const jsonRpcResponse = json as JsonRpcResponse;\n if ('error' in jsonRpcResponse) {\n const { error } = jsonRpcResponse;\n\n // Check if this is a sendTransaction preflight failure (error code -32002)\n // These errors contain RpcSimulateTransactionResult in error.data which needs\n // BigInt values downcast to Number for fields that should be numbers\n const isSendTransactionPreflightFailure =\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error.code === -32002 || error.code === -32002n);\n\n if (isSendTransactionPreflightFailure && 'data' in error && error.data) {\n // Apply BigInt downcast transformation to error.data\n const treeWalker = getTreeWalkerResponseTransformer(\n [getBigIntUpcastVisitor(getSimulateTransactionAllowedNumericKeypaths())],\n { keyPath: [] },\n );\n const transformedData = treeWalker(error.data, request);\n\n // Reconstruct error with transformed data\n const transformedError = { ...error, data: transformedData };\n throw getSolanaErrorFromJsonRpcError(transformedError);\n }\n\n throw getSolanaErrorFromJsonRpcError(jsonRpcResponse.error);\n }\n return jsonRpcResponse;\n };\n}\n","import { pipe } from '@solana/functional';\nimport { RpcRequest, RpcResponse, RpcResponseTransformer } from '@solana/rpc-spec-types';\n\nimport { AllowedNumericKeypaths } from './response-transformer-allowed-numeric-values';\nimport { getBigIntUpcastResponseTransformer } from './response-transformer-bigint-upcast';\nimport { getResultResponseTransformer } from './response-transformer-result';\nimport { getThrowSolanaErrorResponseTransformer } from './response-transformer-throw-solana-error';\n\nexport type ResponseTransformerConfig = Readonly<{\n /**\n * An optional map from the name of an API method to an array of {@link KeyPath | KeyPaths}\n * pointing to values in the response that should materialize in the application as `Number`\n * instead of `BigInt`.\n */\n allowedNumericKeyPaths?: AllowedNumericKeypaths;\n}>;\n\n/**\n * Returns the default response transformer for the Solana RPC API.\n *\n * Under the hood, this function composes multiple\n * {@link RpcResponseTransformer | RpcResponseTransformers} together such as the\n * {@link getThrowSolanaErrorResponseTransformer}, the {@link getResultResponseTransformer} and the\n * {@link getBigIntUpcastResponseTransformer}.\n *\n * @example\n * ```ts\n * import { getDefaultResponseTransformerForSolanaRpc } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getDefaultResponseTransformerForSolanaRpc({\n * allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n * });\n * ```\n */\nexport function getDefaultResponseTransformerForSolanaRpc(\n config?: ResponseTransformerConfig,\n): RpcResponseTransformer {\n return (response: RpcResponse, request: RpcRequest): RpcResponse => {\n const methodName = request.methodName as keyof TApi;\n const keyPaths =\n config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;\n return pipe(\n response,\n r => getThrowSolanaErrorResponseTransformer()(r, request),\n r => getResultResponseTransformer()(r, request),\n r => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request),\n );\n };\n}\n\n/**\n * Returns the default response transformer for the Solana RPC Subscriptions API.\n *\n * Under the hood, this function composes the {@link getBigIntUpcastResponseTransformer}.\n *\n * @example\n * ```ts\n * import { getDefaultResponseTransformerForSolanaRpcSubscriptions } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getDefaultResponseTransformerForSolanaRpcSubscriptions({\n * allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n * });\n * ```\n */\nexport function getDefaultResponseTransformerForSolanaRpcSubscriptions(\n config?: ResponseTransformerConfig,\n): RpcResponseTransformer {\n return (response: RpcResponse, request: RpcRequest): RpcResponse => {\n const methodName = request.methodName as keyof TApi;\n const keyPaths =\n config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;\n return pipe(response, r => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request));\n };\n}\n","/**\n * This package contains types that describe the [methods](https://solana.com/docs/rpc/http) of the\n * Solana JSON RPC API, and utilities for creating a {@link RpcApi} implementation with sensible\n * defaults. It can be used standalone, but it is also exported as part of Kit\n * [`@solana/kit`](https://github.com/anza-xyz/kit/tree/main/packages/kit).\n *\n * @example\n * Each RPC method is described in terms of a TypeScript type of the following form:\n *\n * ```ts\n * type ExampleApi = {\n * getSomething(address: Address): Something;\n * };\n * ```\n *\n * A {@link RpcApi} that implements `ExampleApi` will ultimately expose its defined methods on any\n * {@link Rpc} that uses it.\n *\n * ```ts\n * const rpc: Rpc = createExampleRpc(/* ... *\\/);\n * const something: Something = await rpc.getSomething(address('95DpK3y3GF7U8s1k4EvZ7xqyeCkhsHeZaE97iZpHUGMN')).send();\n * ```\n *\n * @packageDocumentation\n */\nimport { createJsonRpcApi, RpcApi } from '@solana/rpc-spec';\nimport {\n AllowedNumericKeypaths,\n getDefaultRequestTransformerForSolanaRpc,\n getDefaultResponseTransformerForSolanaRpc,\n innerInstructionsConfigs,\n jsonParsedAccountsConfigs,\n jsonParsedTokenAccountsConfigs,\n KEYPATH_WILDCARD,\n messageConfig,\n RequestTransformerConfig,\n} from '@solana/rpc-transformers';\n\nimport { GetAccountInfoApi } from './getAccountInfo';\nimport { GetBalanceApi } from './getBalance';\nimport { GetBlockApi } from './getBlock';\nimport { GetBlockCommitmentApi } from './getBlockCommitment';\nimport { GetBlockHeightApi } from './getBlockHeight';\nimport { GetBlockProductionApi } from './getBlockProduction';\nimport { GetBlocksApi } from './getBlocks';\nimport { GetBlocksWithLimitApi } from './getBlocksWithLimit';\nimport { GetBlockTimeApi } from './getBlockTime';\nimport { GetClusterNodesApi } from './getClusterNodes';\nimport { GetEpochInfoApi } from './getEpochInfo';\nimport { GetEpochScheduleApi } from './getEpochSchedule';\nimport { GetFeeForMessageApi } from './getFeeForMessage';\nimport { GetFirstAvailableBlockApi } from './getFirstAvailableBlock';\nimport { GetGenesisHashApi } from './getGenesisHash';\nimport { GetHealthApi } from './getHealth';\nimport { GetHighestSnapshotSlotApi } from './getHighestSnapshotSlot';\nimport { GetIdentityApi } from './getIdentity';\nimport { GetInflationGovernorApi } from './getInflationGovernor';\nimport { GetInflationRateApi } from './getInflationRate';\nimport { GetInflationRewardApi } from './getInflationReward';\nimport { GetLargestAccountsApi } from './getLargestAccounts';\nimport { GetLatestBlockhashApi } from './getLatestBlockhash';\nimport { GetLeaderScheduleApi } from './getLeaderSchedule';\nimport { GetMaxRetransmitSlotApi } from './getMaxRetransmitSlot';\nimport { GetMaxShredInsertSlotApi } from './getMaxShredInsertSlot';\nimport { GetMinimumBalanceForRentExemptionApi } from './getMinimumBalanceForRentExemption';\nimport { GetMultipleAccountsApi } from './getMultipleAccounts';\nimport { GetProgramAccountsApi } from './getProgramAccounts';\nimport { GetRecentPerformanceSamplesApi } from './getRecentPerformanceSamples';\nimport { GetRecentPrioritizationFeesApi } from './getRecentPrioritizationFees';\nimport { GetSignaturesForAddressApi } from './getSignaturesForAddress';\nimport { GetSignatureStatusesApi } from './getSignatureStatuses';\nimport { GetSlotApi } from './getSlot';\nimport { GetSlotLeaderApi } from './getSlotLeader';\nimport { GetSlotLeadersApi } from './getSlotLeaders';\nimport { GetStakeMinimumDelegationApi } from './getStakeMinimumDelegation';\nimport { GetSupplyApi } from './getSupply';\nimport { GetTokenAccountBalanceApi } from './getTokenAccountBalance';\nimport { GetTokenAccountsByDelegateApi } from './getTokenAccountsByDelegate';\nimport { GetTokenAccountsByOwnerApi } from './getTokenAccountsByOwner';\nimport { GetTokenLargestAccountsApi } from './getTokenLargestAccounts';\nimport { GetTokenSupplyApi } from './getTokenSupply';\nimport { GetTransactionApi } from './getTransaction';\nimport { GetTransactionCountApi } from './getTransactionCount';\nimport { GetVersionApi } from './getVersion';\nimport { GetVoteAccountsApi } from './getVoteAccounts';\nimport { IsBlockhashValidApi } from './isBlockhashValid';\nimport { MinimumLedgerSlotApi } from './minimumLedgerSlot';\nimport { RequestAirdropApi } from './requestAirdrop';\nimport { SendTransactionApi } from './sendTransaction';\nimport { SimulateTransactionApi } from './simulateTransaction';\n\ntype SolanaRpcApiForAllClusters = GetAccountInfoApi &\n GetBalanceApi &\n GetBlockApi &\n GetBlockCommitmentApi &\n GetBlockHeightApi &\n GetBlockProductionApi &\n GetBlocksApi &\n GetBlocksWithLimitApi &\n GetBlockTimeApi &\n GetClusterNodesApi &\n GetEpochInfoApi &\n GetEpochScheduleApi &\n GetFeeForMessageApi &\n GetFirstAvailableBlockApi &\n GetGenesisHashApi &\n GetHealthApi &\n GetHighestSnapshotSlotApi &\n GetIdentityApi &\n GetInflationGovernorApi &\n GetInflationRateApi &\n GetInflationRewardApi &\n GetLargestAccountsApi &\n GetLatestBlockhashApi &\n GetLeaderScheduleApi &\n GetMaxRetransmitSlotApi &\n GetMaxShredInsertSlotApi &\n GetMinimumBalanceForRentExemptionApi &\n GetMultipleAccountsApi &\n GetProgramAccountsApi &\n GetRecentPerformanceSamplesApi &\n GetRecentPrioritizationFeesApi &\n GetSignaturesForAddressApi &\n GetSignatureStatusesApi &\n GetSlotApi &\n GetSlotLeaderApi &\n GetSlotLeadersApi &\n GetStakeMinimumDelegationApi &\n GetSupplyApi &\n GetTokenAccountBalanceApi &\n GetTokenAccountsByDelegateApi &\n GetTokenAccountsByOwnerApi &\n GetTokenLargestAccountsApi &\n GetTokenSupplyApi &\n GetTransactionApi &\n GetTransactionCountApi &\n GetVersionApi &\n GetVoteAccountsApi &\n IsBlockhashValidApi &\n MinimumLedgerSlotApi &\n SendTransactionApi &\n SimulateTransactionApi;\ntype SolanaRpcApiForTestClusters = RequestAirdropApi & SolanaRpcApiForAllClusters;\n/**\n * Represents the RPC methods available on test clusters.\n *\n * For instance, the test clusters support the {@link RequestAirdropApi} while mainnet does not.\n */\nexport type SolanaRpcApi = SolanaRpcApiForTestClusters;\n/**\n * Represents the RPC methods available on the devnet cluster.\n *\n * For instance, the devnet cluster supports the {@link RequestAirdropApi} while mainnet does not.\n */\nexport type SolanaRpcApiDevnet = SolanaRpcApiForTestClusters;\n/**\n * Represents the RPC methods available on the testnet cluster.\n *\n * For instance, the testnet cluster supports the {@link RequestAirdropApi} while mainnet does not.\n */\nexport type SolanaRpcApiTestnet = SolanaRpcApiForTestClusters;\n/**\n * Represents the RPC methods available on the mainnet cluster.\n *\n * For instance, the mainnet cluster does not support the {@link RequestAirdropApi} whereas test\n * clusters do.\n */\nexport type SolanaRpcApiMainnet = SolanaRpcApiForAllClusters;\n\nexport type {\n GetAccountInfoApi,\n GetBalanceApi,\n GetBlockApi,\n GetBlockCommitmentApi,\n GetBlockHeightApi,\n GetBlockProductionApi,\n GetBlocksApi,\n GetBlocksWithLimitApi,\n GetBlockTimeApi,\n GetClusterNodesApi,\n GetEpochInfoApi,\n GetEpochScheduleApi,\n GetFeeForMessageApi,\n GetFirstAvailableBlockApi,\n GetGenesisHashApi,\n GetHealthApi,\n GetHighestSnapshotSlotApi,\n GetIdentityApi,\n GetInflationGovernorApi,\n GetInflationRateApi,\n GetInflationRewardApi,\n GetLargestAccountsApi,\n GetLatestBlockhashApi,\n GetLeaderScheduleApi,\n GetMaxRetransmitSlotApi,\n GetMaxShredInsertSlotApi,\n GetMinimumBalanceForRentExemptionApi,\n GetMultipleAccountsApi,\n GetProgramAccountsApi,\n GetRecentPerformanceSamplesApi,\n GetRecentPrioritizationFeesApi,\n GetSignaturesForAddressApi,\n GetSignatureStatusesApi,\n GetSlotApi,\n GetSlotLeaderApi,\n GetSlotLeadersApi,\n GetStakeMinimumDelegationApi,\n GetSupplyApi,\n GetTokenAccountBalanceApi,\n GetTokenAccountsByDelegateApi,\n GetTokenAccountsByOwnerApi,\n GetTokenLargestAccountsApi,\n GetTokenSupplyApi,\n GetTransactionApi,\n GetTransactionCountApi,\n GetVersionApi,\n GetVoteAccountsApi,\n IsBlockhashValidApi,\n MinimumLedgerSlotApi,\n RequestAirdropApi,\n SendTransactionApi,\n SimulateTransactionApi,\n};\n\ntype Config = RequestTransformerConfig;\n\n/**\n * Creates a {@link RpcApi} implementation of the Solana JSON RPC API with some default behaviours.\n *\n * The default behaviours include:\n * - A transform that converts `bigint` inputs to `number` for compatibility with version 1.0 of the\n * Solana JSON RPC.\n * - A transform that calls the config's {@link Config.onIntegerOverflow | onIntegerOverflow}\n * handler whenever a `bigint` input would overflow a JavaScript IEEE 754 number. See\n * [this](https://github.com/solana-labs/solana-web3.js/issues/1116) GitHub issue for more\n * information.\n * - A transform that applies a default commitment wherever not specified\n */\nexport function createSolanaRpcApi<\n // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents\n TRpcMethods extends SolanaRpcApi | SolanaRpcApiDevnet | SolanaRpcApiMainnet | SolanaRpcApiTestnet = SolanaRpcApi,\n>(config?: Config): RpcApi {\n return createJsonRpcApi({\n requestTransformer: getDefaultRequestTransformerForSolanaRpc(config),\n responseTransformer: getDefaultResponseTransformerForSolanaRpc({\n allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n }),\n });\n}\n\nlet memoizedKeypaths: AllowedNumericKeypaths>;\n\n/**\n * These are keypaths at the end of which you will find a numeric value that should *not* be upcast\n * to a `bigint`. These are values that are legitimately defined as `u8` or `usize` on the backend.\n */\nfunction getAllowedNumericKeypaths(): AllowedNumericKeypaths> {\n if (!memoizedKeypaths) {\n memoizedKeypaths = {\n getAccountInfo: jsonParsedAccountsConfigs.map(c => ['value', ...c]),\n getBlock: [\n ['transactions', KEYPATH_WILDCARD, 'meta', 'preTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n [\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'preTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n ['transactions', KEYPATH_WILDCARD, 'meta', 'postTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n [\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'postTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n ['transactions', KEYPATH_WILDCARD, 'meta', 'rewards', KEYPATH_WILDCARD, 'commission'],\n ...innerInstructionsConfigs.map(c => [\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n ...c,\n ]),\n ...messageConfig.map(c => ['transactions', KEYPATH_WILDCARD, 'transaction', 'message', ...c] as const),\n ['rewards', KEYPATH_WILDCARD, 'commission'],\n ],\n getClusterNodes: [\n [KEYPATH_WILDCARD, 'featureSet'],\n [KEYPATH_WILDCARD, 'shredVersion'],\n ],\n getInflationGovernor: [['initial'], ['foundation'], ['foundationTerm'], ['taper'], ['terminal']],\n getInflationRate: [['foundation'], ['total'], ['validator']],\n getInflationReward: [[KEYPATH_WILDCARD, 'commission']],\n getMultipleAccounts: jsonParsedAccountsConfigs.map(c => ['value', KEYPATH_WILDCARD, ...c]),\n getProgramAccounts: jsonParsedAccountsConfigs.flatMap(c => [\n ['value', KEYPATH_WILDCARD, 'account', ...c],\n [KEYPATH_WILDCARD, 'account', ...c],\n ]),\n getRecentPerformanceSamples: [[KEYPATH_WILDCARD, 'samplePeriodSecs']],\n getTokenAccountBalance: [\n ['value', 'decimals'],\n ['value', 'uiAmount'],\n ],\n getTokenAccountsByDelegate: jsonParsedTokenAccountsConfigs.map(c => [\n 'value',\n KEYPATH_WILDCARD,\n 'account',\n ...c,\n ]),\n getTokenAccountsByOwner: jsonParsedTokenAccountsConfigs.map(c => [\n 'value',\n KEYPATH_WILDCARD,\n 'account',\n ...c,\n ]),\n getTokenLargestAccounts: [\n ['value', KEYPATH_WILDCARD, 'decimals'],\n ['value', KEYPATH_WILDCARD, 'uiAmount'],\n ],\n getTokenSupply: [\n ['value', 'decimals'],\n ['value', 'uiAmount'],\n ],\n getTransaction: [\n ['meta', 'preTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n ['meta', 'preTokenBalances', KEYPATH_WILDCARD, 'uiTokenAmount', 'decimals'],\n ['meta', 'postTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n ['meta', 'postTokenBalances', KEYPATH_WILDCARD, 'uiTokenAmount', 'decimals'],\n ['meta', 'rewards', KEYPATH_WILDCARD, 'commission'],\n ...innerInstructionsConfigs.map(c => ['meta', 'innerInstructions', KEYPATH_WILDCARD, ...c]),\n ...messageConfig.map(c => ['transaction', 'message', ...c] as const),\n ],\n getVersion: [['feature-set']],\n getVoteAccounts: [\n ['current', KEYPATH_WILDCARD, 'commission'],\n ['delinquent', KEYPATH_WILDCARD, 'commission'],\n ],\n simulateTransaction: [\n ['value', 'loadedAccountsDataSize'],\n ...jsonParsedAccountsConfigs.map(c => ['value', 'accounts', KEYPATH_WILDCARD, ...c]),\n ...innerInstructionsConfigs.map(c => ['value', 'innerInstructions', KEYPATH_WILDCARD, ...c]),\n ],\n };\n }\n return memoizedKeypaths;\n}\n","import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, SolanaError } from '@solana/errors';\n\nexport type AllowedHttpRequestHeaders = Readonly<\n {\n // Someone can still sneak a forbidden header past Typescript if they do something like\n // fOo-BaR, but at that point they deserve the runtime failure.\n [K in DisallowedHeaders | ForbiddenHeaders as\n | Capitalize> // `Foo-bar`\n | K // `Foo-Bar`\n | Lowercase // `foo-bar`\n | Uncapitalize // `foo-Bar`\n // `FOO-BAR`\n | Uppercase]?: never;\n } & { [headerName: string]: string }\n>;\n// These are headers that we simply don't allow the developer to override because they're\n// fundamental to the operation of the JSON-RPC transport.\ntype DisallowedHeaders = 'Accept' | 'Content-Length' | 'Content-Type' | 'Solana-Client';\ntype ForbiddenHeaders =\n | 'Accept-Charset'\n // Though technically forbidden in non-Node environments, we don't have a way to target\n // TypeScript types depending on which platform you are authoring for. `Accept-Encoding` is\n // therefore omitted from the forbidden headers type, but is still a runtime error in dev mode\n // when supplied in a non-Node context.\n // | 'Accept-Encoding'\n | 'Access-Control-Request-Headers'\n | 'Access-Control-Request-Method'\n | 'Connection'\n | 'Content-Length'\n | 'Cookie'\n | 'Date'\n | 'DNT'\n | 'Expect'\n | 'Host'\n | 'Keep-Alive'\n // Similar to `Accept-Encoding`, we don't have a way to target TypeScript types depending on\n // which platform you are authoring for. `Origin` is therefore omitted from the forbidden\n // headers type, but is still a runtime error in dev mode when supplied in a browser context.\n // | 'Origin'\n | 'Permissions-Policy'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via'\n | `Proxy-${string}`\n | `Sec-${string}`;\n\n// These are headers which are fundamental to the JSON-RPC transport, and must not be modified.\nconst DISALLOWED_HEADERS: Record = {\n accept: true,\n 'content-length': true,\n 'content-type': true,\n};\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS: Record = /* @__PURE__ */ Object.assign(\n {\n 'accept-charset': true,\n 'access-control-request-headers': true,\n 'access-control-request-method': true,\n connection: true,\n 'content-length': true,\n cookie: true,\n date: true,\n dnt: true,\n expect: true,\n host: true,\n 'keep-alive': true,\n 'permissions-policy': true,\n // Prefix matching is implemented in code, below.\n // 'proxy-': true,\n // 'sec-': true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n via: true,\n },\n __NODEJS__ ? undefined : { 'accept-encoding': true },\n __BROWSER__ ? { origin: true } : undefined,\n);\n\nexport function assertIsAllowedHttpRequestHeaders(\n headers: Record,\n): asserts headers is AllowedHttpRequestHeaders {\n const badHeaders = Object.keys(headers).filter(headerName => {\n const lowercaseHeaderName = headerName.toLowerCase();\n return (\n DISALLOWED_HEADERS[headerName.toLowerCase()] === true ||\n FORBIDDEN_HEADERS[headerName.toLowerCase()] === true ||\n lowercaseHeaderName.startsWith('proxy-') ||\n lowercaseHeaderName.startsWith('sec-')\n );\n });\n if (badHeaders.length > 0) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, {\n headers: badHeaders,\n });\n }\n}\n\n// Lowercasing header names makes it easier to override user-supplied headers, such as those defined\n// in the `DisallowedHeaders` type.\nexport function normalizeHeaders>(\n headers: T,\n): { [K in string & keyof T as Lowercase]: T[K] } {\n const out: Record = {};\n for (const headerName in headers) {\n out[headerName.toLowerCase()] = headers[headerName];\n }\n return out as { [K in string & keyof T as Lowercase]: T[K] };\n}\n","import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SolanaError } from '@solana/errors';\nimport type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\nimport type Dispatcher from 'undici-types/dispatcher';\n\nimport { HttpTransportConfig as Config } from './http-transport-config';\nimport { assertIsAllowedHttpRequestHeaders, normalizeHeaders } from './http-transport-headers';\n\nlet didWarnDispatcherWasSuppliedInNonNodeEnvironment = false;\nfunction warnDispatcherWasSuppliedInNonNodeEnvironment() {\n if (didWarnDispatcherWasSuppliedInNonNodeEnvironment) {\n return;\n }\n didWarnDispatcherWasSuppliedInNonNodeEnvironment = true;\n console.warn(\n 'You have supplied a `Dispatcher` to `createHttpTransport()`. It has been ignored ' +\n 'because Undici dispatchers only work in Node environments. To eliminate this ' +\n 'warning, omit the `dispatcher_NODE_ONLY` property from your config when running in ' +\n 'a non-Node environment.',\n );\n}\n\n/**\n * Creates a function you can use to make `POST` requests with headers suitable for sending JSON\n * data to a server.\n *\n * @example\n * ```ts\n * import { createHttpTransport } from '@solana/rpc-transport-http';\n *\n * const transport = createHttpTransport({ url: 'https://api.mainnet-beta.solana.com' });\n * const response = await transport({\n * payload: { id: 1, jsonrpc: '2.0', method: 'getSlot' },\n * });\n * const data = await response.json();\n * ```\n */\nexport function createHttpTransport(config: Config): RpcTransport {\n if (process.env.NODE_ENV !== \"production\" && !__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n warnDispatcherWasSuppliedInNonNodeEnvironment();\n }\n const { fromJson, headers, toJson, url } = config;\n if (process.env.NODE_ENV !== \"production\" && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n let dispatcherConfig: { dispatcher: Dispatcher | undefined } | undefined;\n if (__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n dispatcherConfig = { dispatcher: config.dispatcher_NODE_ONLY };\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest({\n payload,\n signal,\n }: Parameters[0]): Promise> {\n const body = toJson ? toJson(payload) : JSON.stringify(payload);\n const requestInfo = {\n ...dispatcherConfig,\n body,\n headers: {\n ...customHeaders,\n // Keep these headers lowercase so they will override any user-supplied headers above.\n accept: 'application/json',\n 'content-length': body.length.toString(),\n 'content-type': 'application/json; charset=utf-8',\n },\n method: 'POST',\n signal,\n };\n const response = await fetch(url, requestInfo);\n if (!response.ok) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, {\n headers: response.headers,\n message: response.statusText,\n statusCode: response.status,\n });\n }\n if (fromJson) {\n return fromJson(await response.text(), payload) as TResponse;\n }\n return await response.json();\n };\n}\n","import { isJsonRpcPayload } from '@solana/rpc-spec';\n\nconst SOLANA_RPC_METHODS = [\n 'getAccountInfo',\n 'getBalance',\n 'getBlock',\n 'getBlockCommitment',\n 'getBlockHeight',\n 'getBlockProduction',\n 'getBlocks',\n 'getBlocksWithLimit',\n 'getBlockTime',\n 'getClusterNodes',\n 'getEpochInfo',\n 'getEpochSchedule',\n 'getFeeForMessage',\n 'getFirstAvailableBlock',\n 'getGenesisHash',\n 'getHealth',\n 'getHighestSnapshotSlot',\n 'getIdentity',\n 'getInflationGovernor',\n 'getInflationRate',\n 'getInflationReward',\n 'getLargestAccounts',\n 'getLatestBlockhash',\n 'getLeaderSchedule',\n 'getMaxRetransmitSlot',\n 'getMaxShredInsertSlot',\n 'getMinimumBalanceForRentExemption',\n 'getMultipleAccounts',\n 'getProgramAccounts',\n 'getRecentPerformanceSamples',\n 'getRecentPrioritizationFees',\n 'getSignaturesForAddress',\n 'getSignatureStatuses',\n 'getSlot',\n 'getSlotLeader',\n 'getSlotLeaders',\n 'getStakeMinimumDelegation',\n 'getSupply',\n 'getTokenAccountBalance',\n 'getTokenAccountsByDelegate',\n 'getTokenAccountsByOwner',\n 'getTokenLargestAccounts',\n 'getTokenSupply',\n 'getTransaction',\n 'getTransactionCount',\n 'getVersion',\n 'getVoteAccounts',\n 'index',\n 'isBlockhashValid',\n 'minimumLedgerSlot',\n 'requestAirdrop',\n 'sendTransaction',\n 'simulateTransaction',\n] as const;\n\n/**\n * Helper function that checks if a given `RpcRequest` comes from the Solana RPC API.\n */\nexport function isSolanaRequest(payload: unknown): payload is Readonly<{\n jsonrpc: '2.0';\n method: (typeof SOLANA_RPC_METHODS)[number];\n params: unknown;\n}> {\n return isJsonRpcPayload(payload) && (SOLANA_RPC_METHODS as readonly string[]).includes(payload.method);\n}\n","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigInts } from '@solana/rpc-spec-types';\n\nimport { createHttpTransport } from './http-transport';\nimport { HttpTransportConfig } from './http-transport-config';\nimport { isSolanaRequest } from './is-solana-request';\n\ntype Config = Pick;\n\n/**\n * Creates a {@link RpcTransport} that uses JSON HTTP requests — much like the\n * {@link createHttpTransport} function - except that it also uses custom `toJson` and `fromJson`\n * functions in order to allow `bigint` values to be serialized and deserialized correctly over the\n * wire.\n *\n * Since this is something specific to the Solana RPC API, these custom JSON functions are only\n * triggered when the request is recognized as a Solana RPC request. Normal RPC APIs should aim to\n * wrap their `bigint` values — e.g. `u64` or `i64` — in special value objects that represent the\n * number as a string to avoid numerical values going above `Number.MAX_SAFE_INTEGER`.\n *\n * It has the same configuration options as {@link createHttpTransport}, but without the `fromJson`\n * and `toJson` options.\n */\nexport function createHttpTransportForSolanaRpc(config: Config): RpcTransport {\n return createHttpTransport({\n ...config,\n fromJson: (rawResponse: string, payload: unknown) =>\n isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigInts(payload) : JSON.stringify(payload),\n });\n}\n","/**\n * This project is a fork of [nickyout/fast-stable-stringify](https://github.com/nickyout/fast-stable-stringify)\n *\n * The most popular repository providing this feature is [substack's json-stable-stringify](https://www.npmjs.com/package/json-stable-stringify). The intent of this library is to provide a faster alternative for when performance is more important than features. It assumes you provide basic javascript values without circular references, and returns a non-indented string.\n *\n * Just like substack's, it:\n *\n * - handles all variations of all basic javascript values (number, string, boolean, array, object, null, Date, BigInt)\n * - handles undefined _and_ function in the same way as `JSON.stringify`\n * - **does not support ie8 (and below) with complete certainty**.\n *\n * Unlike substack's, it:\n *\n * - does not implement the 'replacer' or 'space' arguments of the JSON.stringify method\n * - does not check for circular references\n *\n * @example\n * ```js\n * import stringify from '@solana/fast-stable-stringify';\n * stringify({ d: 0, c: 1, a: 2, b: 3, e: 4 }); // '{\"a\":2,\"b\":3,\"c\":1,\"d\":0,\"e\":4}'\n * ```\n *\n * @packageDocumentation\n */\nconst objToString = Object.prototype.toString;\nconst objKeys =\n Object.keys ||\n function (obj) {\n const keys = [];\n for (const name in obj) {\n keys.push(name);\n }\n return keys;\n };\n\nfunction stringify(val: unknown, isArrayProp: boolean) {\n let i, max, str, keys, key, propVal, toStr;\n if (val === true) {\n return 'true';\n }\n if (val === false) {\n return 'false';\n }\n switch (typeof val) {\n case 'object':\n if (val === null) {\n return null;\n } else if ('toJSON' in val && typeof val.toJSON === 'function') {\n return stringify(val.toJSON(), isArrayProp);\n } else {\n toStr = objToString.call(val);\n if (toStr === '[object Array]') {\n str = '[';\n max = (val as unknown[]).length - 1;\n for (i = 0; i < max; i++) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += stringify((val as unknown[])[i], true) + ',';\n }\n if (max > -1) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += stringify((val as unknown[])[i], true);\n }\n return str + ']';\n } else if (toStr === '[object Object]') {\n // only object is left\n keys = objKeys(val).sort();\n max = keys.length;\n str = '';\n i = 0;\n while (i < max) {\n key = keys[i];\n propVal = stringify((val as Record)[key], false);\n if (propVal !== undefined) {\n if (str) {\n str += ',';\n }\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += JSON.stringify(key) + ':' + propVal;\n }\n i++;\n }\n return '{' + str + '}';\n } else {\n return JSON.stringify(val);\n }\n }\n case 'function':\n case 'undefined':\n return isArrayProp ? null : undefined;\n case 'bigint':\n return `${val.toString()}n`;\n case 'string':\n return JSON.stringify(val);\n default:\n return isFinite(val as number) ? val : null;\n }\n}\n\nexport default function (\n val:\n | Function // eslint-disable-line @typescript-eslint/no-unsafe-function-type\n | undefined,\n): undefined;\nexport default function (val: unknown): string;\nexport default function (val: unknown): string | undefined {\n const returnVal = stringify(val, false);\n if (returnVal !== undefined) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n return '' + returnVal;\n }\n}\n","import { safeCaptureStackTrace, SOLANA_ERROR__RPC__INTEGER_OVERFLOW, SolanaError } from '@solana/errors';\nimport type { KeyPath } from '@solana/rpc-transformers';\n\nexport function createSolanaJsonRpcIntegerOverflowError(\n methodName: string,\n keyPath: KeyPath,\n value: bigint,\n): SolanaError {\n let argumentLabel = '';\n if (typeof keyPath[0] === 'number') {\n const argPosition = keyPath[0] + 1;\n const lastDigit = argPosition % 10;\n const lastTwoDigits = argPosition % 100;\n if (lastDigit == 1 && lastTwoDigits != 11) {\n argumentLabel = argPosition + 'st';\n } else if (lastDigit == 2 && lastTwoDigits != 12) {\n argumentLabel = argPosition + 'nd';\n } else if (lastDigit == 3 && lastTwoDigits != 13) {\n argumentLabel = argPosition + 'rd';\n } else {\n argumentLabel = argPosition + 'th';\n }\n } else {\n argumentLabel = `\\`${keyPath[0].toString()}\\``;\n }\n const path =\n keyPath.length > 1\n ? keyPath\n .slice(1)\n .map(pathPart => (typeof pathPart === 'number' ? `[${pathPart}]` : pathPart))\n .join('.')\n : undefined;\n const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, {\n argumentLabel,\n keyPath: keyPath as readonly (number | string | symbol)[],\n methodName,\n optionalPathLabel: path ? ` at path \\`${path}\\`` : '',\n value,\n ...(path !== undefined ? { path } : undefined),\n });\n safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError);\n return error;\n}\n","import type { createSolanaRpcApi } from '@solana/rpc-api';\n\nimport { createSolanaJsonRpcIntegerOverflowError } from './rpc-integer-overflow-error';\n\n/**\n * When you create {@link Rpc} instances with custom transports but otherwise the default RPC API\n * behaviours, use this.\n *\n * @example\n * ```ts\n * const myCustomRpc = createRpc({\n * api: createSolanaRpcApi(DEFAULT_RPC_CONFIG),\n * transport: myCustomTransport,\n * });\n * ```\n */\nexport const DEFAULT_RPC_CONFIG: Partial[0]>> = {\n defaultCommitment: 'confirmed',\n onIntegerOverflow(request, keyPath, value) {\n throw createSolanaJsonRpcIntegerOverflowError(request.methodName, keyPath, value);\n },\n};\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import { AbortController } from '@solana/event-target-impl';\nimport type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\n\ntype CoalescedRequest = {\n readonly abortController: AbortController;\n numConsumers: number;\n readonly responsePromise: Promise;\n};\n\ntype GetDeduplicationKeyFn = (payload: unknown) => string | undefined;\n\n// This used to be a `Symbol()`, but there's a bug in Node <21 where the `undici` library passes\n// the `reason` property of the `AbortSignal` straight to `Error.captureStackTrace()` without first\n// typechecking it. `Error.captureStackTrace()` fatals when given a `Symbol`.\n// See https://github.com/nodejs/undici/pull/2597\nlet EXPLICIT_ABORT_TOKEN: ReturnType;\nfunction createExplicitAbortToken() {\n // This function is an annoying workaround to prevent `process.env.NODE_ENV` from appearing at\n // the top level of this module and thwarting an optimizing compiler's attempt to tree-shake.\n return process.env.NODE_ENV !== \"production\"\n ? {\n EXPLICIT_ABORT_TOKEN:\n 'This object is thrown from the request that underlies a series of coalesced ' +\n 'requests when the last request in that series aborts',\n }\n : {};\n}\n\nexport function getRpcTransportWithRequestCoalescing(\n transport: TTransport,\n getDeduplicationKey: GetDeduplicationKeyFn,\n): TTransport {\n let coalescedRequestsByDeduplicationKey: Record | undefined;\n return async function makeCoalescedHttpRequest(\n request: Parameters[0],\n ): Promise> {\n const { payload, signal } = request;\n const deduplicationKey = getDeduplicationKey(payload);\n if (deduplicationKey === undefined) {\n return await transport(request);\n }\n if (!coalescedRequestsByDeduplicationKey) {\n queueMicrotask(() => {\n coalescedRequestsByDeduplicationKey = undefined;\n });\n coalescedRequestsByDeduplicationKey = {};\n }\n if (coalescedRequestsByDeduplicationKey[deduplicationKey] == null) {\n const abortController = new AbortController();\n const responsePromise = (async () => {\n try {\n return await transport({\n ...request,\n signal: abortController.signal,\n });\n } catch (e) {\n if (e === (EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken())) {\n // We triggered this error when the last subscriber aborted. Letting this\n // error bubble up from here would cause runtime fatals where there should\n // be none.\n return;\n }\n throw e;\n }\n })();\n coalescedRequestsByDeduplicationKey[deduplicationKey] = {\n abortController,\n numConsumers: 0,\n responsePromise,\n };\n }\n const coalescedRequest = coalescedRequestsByDeduplicationKey[deduplicationKey];\n coalescedRequest.numConsumers++;\n if (signal) {\n const responsePromise = coalescedRequest.responsePromise as Promise>;\n return await new Promise>((resolve, reject) => {\n const handleAbort = (e: AbortSignalEventMap['abort']) => {\n signal.removeEventListener('abort', handleAbort);\n coalescedRequest.numConsumers -= 1;\n queueMicrotask(() => {\n if (coalescedRequest.numConsumers === 0) {\n const abortController = coalescedRequest.abortController;\n abortController.abort((EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken()));\n }\n });\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject((e.target as AbortSignal).reason);\n };\n signal.addEventListener('abort', handleAbort);\n responsePromise\n .then(resolve)\n .catch(reject)\n .finally(() => {\n signal.removeEventListener('abort', handleAbort);\n });\n });\n } else {\n return (await coalescedRequest.responsePromise) as RpcResponse;\n }\n } as TTransport;\n}\n","import fastStableStringify from '@solana/fast-stable-stringify';\nimport { isJsonRpcPayload } from '@solana/rpc-spec';\n\nexport function getSolanaRpcPayloadDeduplicationKey(payload: unknown): string | undefined {\n return isJsonRpcPayload(payload) ? fastStableStringify([payload.method, payload.params]) : undefined;\n}\n","import { pipe } from '@solana/functional';\nimport { createHttpTransport, createHttpTransportForSolanaRpc } from '@solana/rpc-transport-http';\nimport type { ClusterUrl } from '@solana/rpc-types';\n\nimport { RpcTransportFromClusterUrl } from './rpc-clusters';\nimport { getRpcTransportWithRequestCoalescing } from './rpc-request-coalescer';\nimport { getSolanaRpcPayloadDeduplicationKey } from './rpc-request-deduplication';\n\ntype RpcTransportConfig = Parameters[0];\ninterface DefaultRpcTransportConfig extends RpcTransportConfig {\n url: TClusterUrl;\n}\n\nfunction normalizeHeaders>(\n headers: T,\n): { [K in string & keyof T as Lowercase]: T[K] } {\n const out: Record = {};\n for (const headerName in headers) {\n // Lowercasing header names makes it easier to override user-supplied headers.\n out[headerName.toLowerCase()] = headers[headerName];\n }\n return out as { [K in string & keyof T as Lowercase]: T[K] };\n}\n\n/**\n * Creates a {@link RpcTransport} with some default behaviours.\n *\n * The default behaviours include:\n * - An automatically-set `Solana-Client` request header, containing the version of `@solana/kit`\n * - Logic that coalesces multiple calls in the same runloop, for the same methods with the same\n * arguments, into a single network request.\n * - [node-only] An automatically-set `Accept-Encoding` request header asking the server to compress\n * responses\n *\n * @param config\n */\nexport function createDefaultRpcTransport(\n config: DefaultRpcTransportConfig,\n): RpcTransportFromClusterUrl {\n return pipe(\n createHttpTransportForSolanaRpc({\n ...config,\n headers: {\n ...(__NODEJS__ &&\n ({\n // Keep these headers lowercase so they will be overridden by any user-supplied headers below.\n 'accept-encoding':\n // Natively supported by Node LTS v20.18.0 and above.\n 'br,gzip,deflate', // Brotli, gzip, and Deflate, in that order.\n } as { [overrideHeader: string]: string })),\n ...(config.headers ? normalizeHeaders(config.headers) : undefined),\n ...({\n // Keep these headers lowercase so they will override any user-supplied headers above.\n 'solana-client': __VERSION__ ? `js/${__VERSION__}` : 'UNKNOWN',\n } as { [overrideHeader: string]: string }),\n },\n }) as RpcTransportFromClusterUrl,\n transport => getRpcTransportWithRequestCoalescing(transport, getSolanaRpcPayloadDeduplicationKey),\n );\n}\n","import { createSolanaRpcApi } from '@solana/rpc-api';\nimport { createRpc, RpcTransport } from '@solana/rpc-spec';\nimport { ClusterUrl } from '@solana/rpc-types';\n\nimport type { RpcFromTransport, SolanaRpcApiFromTransport } from './rpc-clusters';\nimport { DEFAULT_RPC_CONFIG } from './rpc-default-config';\nimport { createDefaultRpcTransport } from './rpc-transport';\n\ntype DefaultRpcTransportConfig = Parameters<\n typeof createDefaultRpcTransport\n>[0];\n\n/**\n * Creates a {@link Rpc} instance that exposes the Solana JSON RPC API given a cluster URL and some\n * optional transport config. See {@link createDefaultRpcTransport} for the shape of the transport\n * config.\n */\nexport function createSolanaRpc(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n return createSolanaRpcFromTransport(createDefaultRpcTransport({ url: clusterUrl, ...config }));\n}\n\n/**\n * Creates a {@link Rpc} instance that exposes the Solana JSON RPC API given the supplied\n * {@link RpcTransport}.\n */\nexport function createSolanaRpcFromTransport(transport: TTransport) {\n return createRpc({\n api: createSolanaRpcApi(DEFAULT_RPC_CONFIG),\n transport,\n }) as RpcFromTransport, TTransport>;\n}\n","\n//# sourceMappingURL=index.node.mjs.map\n//# sourceMappingURL=index.node.mjs.map","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import {\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE,\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\n\nimport { DataPublisher } from './data-publisher';\n\ntype Config = Readonly<{\n /**\n * Triggering this abort signal will cause all iterators spawned from this iterator to return\n * once they have published all queued messages.\n */\n abortSignal: AbortSignal;\n /**\n * Messages from this channel of `dataPublisher` will be the ones yielded through the iterators.\n *\n * Messages only begin to be queued after the first time an iterator begins to poll. Channel\n * messages published before that time will be dropped.\n */\n dataChannelName: string;\n // FIXME: It would be nice to be able to constrain the type of `dataPublisher` to one that\n // definitely supports the `dataChannelName` and `errorChannelName` channels, and\n // furthermore publishes `TData` on the `dataChannelName` channel. This is more difficult\n // than it should be: https://tsplay.dev/NlZelW\n dataPublisher: DataPublisher;\n /**\n * Messages from this channel of `dataPublisher` will be the ones thrown through the iterators.\n *\n * Any new iterators created after the first error is encountered will reject with that error\n * when polled.\n */\n errorChannelName: string;\n}>;\n\nconst enum PublishType {\n DATA,\n ERROR,\n}\n\ntype IteratorKey = symbol;\ntype IteratorState =\n | {\n __hasPolled: false;\n publishQueue: (\n | {\n __type: PublishType.DATA;\n data: TData;\n }\n | {\n __type: PublishType.ERROR;\n err: unknown;\n }\n )[];\n }\n | {\n __hasPolled: true;\n onData: (data: TData) => void;\n onError: Parameters[0]>[1];\n };\n\nlet EXPLICIT_ABORT_TOKEN: symbol;\nfunction createExplicitAbortToken() {\n // This function is an annoying workaround to prevent `process.env.NODE_ENV` from appearing at\n // the top level of this module and thwarting an optimizing compiler's attempt to tree-shake.\n return Symbol(\n process.env.NODE_ENV !== \"production\"\n ? \"This symbol is thrown from a socket's iterator when the connection is explicitly \" +\n 'aborted by the user'\n : undefined,\n );\n}\n\nconst UNINITIALIZED = Symbol();\n\n/**\n * Returns an `AsyncIterable` given a data publisher.\n *\n * The iterable will produce iterators that vend messages published to `dataChannelName` and will\n * throw the first time a message is published to `errorChannelName`. Triggering the abort signal\n * will cause all iterators spawned from this iterator to return once they have published all queued\n * messages.\n *\n * Things to note:\n *\n * - If a message is published over a channel before the `AsyncIterator` attached to it has polled\n * for the next result, the message will be queued in memory.\n * - Messages only begin to be queued after the first time an iterator begins to poll. Channel\n * messages published before that time will be dropped.\n * - If there are messages in the queue and an error occurs, all queued messages will be vended to\n * the iterator before the error is thrown.\n * - If there are messages in the queue and the abort signal fires, all queued messages will be\n * vended to the iterator after which it will return.\n * - Any new iterators created after the first error is encountered will reject with that error when\n * polled.\n *\n * @param config\n *\n * @example\n * ```ts\n * const iterable = createAsyncIterableFromDataPublisher({\n * abortSignal: AbortSignal.timeout(10_000),\n * dataChannelName: 'message',\n * dataPublisher,\n * errorChannelName: 'error',\n * });\n * try {\n * for await (const message of iterable) {\n * console.log('Got message', message);\n * }\n * } catch (e) {\n * console.error('An error was published to the error channel', e);\n * } finally {\n * console.log(\"It's been 10 seconds; that's enough for now.\");\n * }\n * ```\n */\nexport function createAsyncIterableFromDataPublisher({\n abortSignal,\n dataChannelName,\n dataPublisher,\n errorChannelName,\n}: Config): AsyncIterable {\n const iteratorState: Map> = new Map();\n function publishErrorToAllIterators(reason: unknown) {\n for (const [iteratorKey, state] of iteratorState.entries()) {\n if (state.__hasPolled) {\n iteratorState.delete(iteratorKey);\n state.onError(reason);\n } else {\n state.publishQueue.push({\n __type: PublishType.ERROR,\n err: reason,\n });\n }\n }\n }\n const abortController = new AbortController();\n abortSignal.addEventListener('abort', () => {\n abortController.abort();\n publishErrorToAllIterators((EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken()));\n });\n const options = { signal: abortController.signal } as const;\n let firstError: unknown = UNINITIALIZED;\n dataPublisher.on(\n errorChannelName,\n err => {\n if (firstError === UNINITIALIZED) {\n firstError = err;\n abortController.abort();\n publishErrorToAllIterators(err);\n }\n },\n options,\n );\n dataPublisher.on(\n dataChannelName,\n data => {\n iteratorState.forEach((state, iteratorKey) => {\n if (state.__hasPolled) {\n const { onData } = state;\n iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] });\n onData(data as TData);\n } else {\n state.publishQueue.push({\n __type: PublishType.DATA,\n data: data as TData,\n });\n }\n });\n },\n options,\n );\n return {\n async *[Symbol.asyncIterator]() {\n if (abortSignal.aborted) {\n return;\n }\n if (firstError !== UNINITIALIZED) {\n throw firstError;\n }\n const iteratorKey = Symbol();\n iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] });\n try {\n while (true) {\n const state = iteratorState.get(iteratorKey);\n if (!state) {\n // There should always be state by now.\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING);\n }\n if (state.__hasPolled) {\n // You should never be able to poll twice in a row.\n throw new SolanaError(\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE,\n );\n }\n const publishQueue = state.publishQueue;\n try {\n if (publishQueue.length) {\n state.publishQueue = [];\n for (const item of publishQueue) {\n if (item.__type === PublishType.DATA) {\n yield item.data;\n } else {\n throw item.err;\n }\n }\n } else {\n yield await new Promise((resolve, reject) => {\n iteratorState.set(iteratorKey, {\n __hasPolled: true,\n onData: resolve,\n onError: reject,\n });\n });\n }\n } catch (e) {\n if (e === (EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken())) {\n return;\n } else {\n throw e;\n }\n }\n }\n } finally {\n iteratorState.delete(iteratorKey);\n }\n },\n };\n}\n","import { TypedEventEmitter, TypedEventTarget } from './event-emitter';\n\ntype UnsubscribeFn = () => void;\n\n/**\n * Represents an object with an `on` function that you can call to subscribe to certain data over a\n * named channel.\n *\n * @example\n * ```ts\n * let dataPublisher: DataPublisher<{ error: SolanaError }>;\n * dataPublisher.on('data', handleData); // ERROR. `data` is not a known channel name.\n * dataPublisher.on('error', e => {\n * console.error(e);\n * }); // OK.\n * ```\n */\nexport interface DataPublisher = Record> {\n /**\n * Call this to subscribe to data over a named channel.\n *\n * @param channelName The name of the channel on which to subscribe for messages\n * @param subscriber The function to call when a message becomes available\n * @param options.signal An abort signal you can fire to unsubscribe\n *\n * @returns A function that you can call to unsubscribe\n */\n on(\n channelName: TChannelName,\n subscriber: (data: TDataByChannelName[TChannelName]) => void,\n options?: { signal: AbortSignal },\n ): UnsubscribeFn;\n}\n\n/**\n * Returns an object with an `on` function that you can call to subscribe to certain data over a\n * named channel.\n *\n * The `on` function returns an unsubscribe function.\n *\n * @example\n * ```ts\n * const socketDataPublisher = getDataPublisherFromEventEmitter(new WebSocket('wss://api.devnet.solana.com'));\n * const unsubscribe = socketDataPublisher.on('message', message => {\n * if (JSON.parse(message.data).id === 42) {\n * console.log('Got response 42');\n * unsubscribe();\n * }\n * });\n * ```\n */\nexport function getDataPublisherFromEventEmitter>(\n eventEmitter: TypedEventEmitter | TypedEventTarget,\n): DataPublisher<{\n [TEventType in keyof TEventMap]: TEventMap[TEventType] extends CustomEvent ? TEventMap[TEventType]['detail'] : null;\n}> {\n return {\n on(channelName, subscriber, options) {\n function innerListener(ev: Event) {\n if (ev instanceof CustomEvent) {\n const data = (ev as CustomEvent).detail;\n (subscriber as unknown as (data: TEventMap[typeof channelName]) => void)(data);\n } else {\n (subscriber as () => void)();\n }\n }\n eventEmitter.addEventListener(channelName, innerListener, options);\n return () => {\n eventEmitter.removeEventListener(channelName, innerListener);\n };\n },\n };\n}\n","import { EventTarget } from '@solana/event-target-impl';\n\nimport { DataPublisher, getDataPublisherFromEventEmitter } from './data-publisher';\n\n/**\n * Given a channel that carries messages for multiple subscribers on a single channel name, this\n * function returns a new {@link DataPublisher} that splits them into multiple channel names.\n *\n * @param messageTransformer A function that receives the message as the first argument, and returns\n * a tuple of the derived channel name and the message.\n *\n * @example\n * Imagine a channel that carries multiple notifications whose destination is contained within the\n * message itself.\n *\n * ```ts\n * const demuxedDataPublisher = demultiplexDataPublisher(channel, 'message', message => {\n * const destinationChannelName = `notification-for:${message.subscriberId}`;\n * return [destinationChannelName, message];\n * });\n * ```\n *\n * Now you can subscribe to _only_ the messages you are interested in, without having to subscribe\n * to the entire `'message'` channel and filter out the messages that are not for you.\n *\n * ```ts\n * demuxedDataPublisher.on(\n * 'notification-for:123',\n * message => {\n * console.log('Got a message for subscriber 123', message);\n * },\n * { signal: AbortSignal.timeout(5_000) },\n * );\n * ```\n */\nexport function demultiplexDataPublisher<\n TDataPublisher extends DataPublisher,\n const TChannelName extends Parameters[0],\n>(\n publisher: TDataPublisher,\n sourceChannelName: TChannelName,\n messageTransformer: (\n // FIXME: Deriving the type of the message from `TDataPublisher` and `TChannelName` would\n // help callers to constrain their transform functions.\n message: unknown,\n ) => [destinationChannelName: string, message: unknown] | void,\n): DataPublisher {\n let innerPublisherState:\n | {\n readonly dispose: () => void;\n numSubscribers: number;\n }\n | undefined;\n const eventTarget = new EventTarget();\n const demultiplexedDataPublisher = getDataPublisherFromEventEmitter(eventTarget);\n return {\n ...demultiplexedDataPublisher,\n on(channelName, subscriber, options) {\n if (!innerPublisherState) {\n const innerPublisherUnsubscribe = publisher.on(sourceChannelName, sourceMessage => {\n const transformResult = messageTransformer(sourceMessage);\n if (!transformResult) {\n return;\n }\n const [destinationChannelName, message] = transformResult;\n eventTarget.dispatchEvent(\n new CustomEvent(destinationChannelName, {\n detail: message,\n }),\n );\n });\n innerPublisherState = {\n dispose: innerPublisherUnsubscribe,\n numSubscribers: 0,\n };\n }\n innerPublisherState.numSubscribers++;\n const unsubscribe = demultiplexedDataPublisher.on(channelName, subscriber, options);\n let isActive = true;\n function handleUnsubscribe() {\n if (!isActive) {\n return;\n }\n isActive = false;\n options?.signal.removeEventListener('abort', handleUnsubscribe);\n innerPublisherState!.numSubscribers--;\n if (innerPublisherState!.numSubscribers === 0) {\n innerPublisherState!.dispose();\n innerPublisherState = undefined;\n }\n unsubscribe();\n }\n options?.signal.addEventListener('abort', handleUnsubscribe);\n return handleUnsubscribe;\n },\n };\n}\n","import { SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, SolanaError } from '@solana/errors';\nimport { Callable, Flatten, OverloadImplementations, UnionToIntersection } from '@solana/rpc-spec-types';\nimport { createAsyncIterableFromDataPublisher } from '@solana/subscribable';\n\nimport { RpcSubscriptionsApi, RpcSubscriptionsPlan } from './rpc-subscriptions-api';\nimport { PendingRpcSubscriptionsRequest, RpcSubscribeOptions } from './rpc-subscriptions-request';\nimport { RpcSubscriptionsTransport } from './rpc-subscriptions-transport';\n\nexport type RpcSubscriptionsConfig = Readonly<{\n api: RpcSubscriptionsApi;\n transport: RpcSubscriptionsTransport;\n}>;\n\n/**\n * An object that exposes all of the functions described by `TRpcSubscriptionsMethods`.\n *\n * Calling each method returns a\n * {@link PendingRpcSubscriptionsRequest | PendingRpcSubscriptionsRequest} where\n * `TNotification` is that method's notification type.\n */\nexport type RpcSubscriptions = {\n [TMethodName in keyof TRpcSubscriptionsMethods]: PendingRpcSubscriptionsRequestBuilder<\n OverloadImplementations\n >;\n};\n\ntype PendingRpcSubscriptionsRequestBuilder = UnionToIntersection<\n Flatten<{\n [P in keyof TSubscriptionMethodImplementations]: PendingRpcSubscriptionsRequestReturnTypeMapper<\n TSubscriptionMethodImplementations[P]\n >;\n }>\n>;\n\ntype PendingRpcSubscriptionsRequestReturnTypeMapper =\n // Check that this property of the TRpcSubscriptionMethods interface is, in fact, a function.\n TSubscriptionMethodImplementation extends Callable\n ? (\n ...args: Parameters\n ) => PendingRpcSubscriptionsRequest>\n : never;\n\n/**\n * Creates a {@link RpcSubscriptions} instance given a\n * {@link RpcSubscriptionsApi | RpcSubscriptionsApi} and a\n * {@link RpcSubscriptionsTransport} capable of fulfilling them.\n */\nexport function createSubscriptionRpc(\n rpcConfig: RpcSubscriptionsConfig,\n): RpcSubscriptions {\n return new Proxy(rpcConfig.api, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get(target, p, receiver) {\n if (p === 'then') {\n return undefined;\n }\n return function (...rawParams: unknown[]) {\n const notificationName = p.toString();\n const createRpcSubscriptionPlan = Reflect.get(target, notificationName, receiver);\n if (!createRpcSubscriptionPlan) {\n throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, {\n notificationName,\n });\n }\n const subscriptionPlan = createRpcSubscriptionPlan(...rawParams);\n return createPendingRpcSubscription(rpcConfig.transport, subscriptionPlan);\n };\n },\n }) as RpcSubscriptions;\n}\n\nfunction createPendingRpcSubscription(\n transport: RpcSubscriptionsTransport,\n subscriptionsPlan: RpcSubscriptionsPlan,\n): PendingRpcSubscriptionsRequest {\n return {\n async subscribe({ abortSignal }: RpcSubscribeOptions): Promise> {\n const notificationsDataPublisher = await transport({\n signal: abortSignal,\n ...subscriptionsPlan,\n });\n return createAsyncIterableFromDataPublisher({\n abortSignal,\n dataChannelName: 'notification',\n dataPublisher: notificationsDataPublisher,\n errorChannelName: 'error',\n });\n },\n };\n}\n","import { Callable, RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec-types';\nimport { DataPublisher } from '@solana/subscribable';\n\nimport { RpcSubscriptionsChannel } from './rpc-subscriptions-channel';\nimport { RpcSubscriptionsTransportDataEvents } from './rpc-subscriptions-transport';\n\nexport type RpcSubscriptionsApiConfig = Readonly<{\n planExecutor: RpcSubscriptionsPlanExecutor>;\n /**\n * An optional function that transforms the {@link RpcRequest} before it is sent to the JSON RPC\n * server.\n *\n * This is useful when the params supplied by the caller need to be transformed before\n * forwarding the message to the server. Use cases for this include applying defaults,\n * forwarding calls to renamed methods, and serializing complex values.\n */\n requestTransformer?: RpcRequestTransformer;\n}>;\n\n/**\n * A function that implements a protocol for subscribing and unsubscribing from notifications given\n * a {@link RpcSubscriptionsChannel}, a {@link RpcRequest}, and an `AbortSignal`.\n *\n * @returns A {@link DataPublisher} that emits {@link RpcSubscriptionsTransportDataEvents}\n */\ntype RpcSubscriptionsPlanExecutor = (\n config: Readonly<{\n channel: RpcSubscriptionsChannel;\n request: RpcRequest;\n signal: AbortSignal;\n }>,\n) => Promise>>;\n\n/**\n * This type allows an {@link RpcSubscriptionsApi} to describe how a particular subscription should\n * be issued to the JSON RPC server.\n *\n * Given a function that was called on a {@link RpcSubscriptions}, this object exposes an `execute`\n * function that dictates which subscription request will be sent, how the underlying transport will\n * be used, and how the notifications will be transformed.\n *\n * This function accepts a {@link RpcSubscriptionsChannel} and an `AbortSignal` and asynchronously\n * returns a {@link DataPublisher}. This gives us the opportunity to:\n *\n * - define the `payload` from the requested method name and parameters before passing it to the\n * channel.\n * - call the underlying channel zero, one or multiple times depending on the use-case (e.g.\n * caching or coalescing multiple subscriptions).\n * - transform the notification from the JSON RPC server, in case it does not match the\n * `TNotification` specified by the\n * {@link PendingRpcSubscriptionsRequest | PendingRpcSubscriptionsRequest} emitted\n * from the publisher returned.\n */\nexport type RpcSubscriptionsPlan = Readonly<{\n /**\n * This method may be called with a newly-opened channel or a pre-established channel.\n */\n execute: (\n config: Readonly<{\n channel: RpcSubscriptionsChannel;\n signal: AbortSignal;\n }>,\n ) => Promise>>;\n /**\n * This request is used to uniquely identify the subscription.\n * It typically comes from the method name and parameters of the subscription call,\n * after potentially being transformed by the RPC Subscriptions API.\n */\n request: RpcRequest;\n}>;\n\n/**\n * For each of `TRpcSubscriptionsMethods`, this object exposes a method with the same name that maps\n * between its input arguments and a\n * {@link RpcSubscriptionsPlan | RpcSubscriptionsPlan} that implements the execution\n * of a JSON RPC subscription for `TNotifications`.\n */\nexport type RpcSubscriptionsApi = {\n [MethodName in keyof TRpcSubscriptionMethods]: RpcSubscriptionsReturnTypeMapper<\n TRpcSubscriptionMethods[MethodName]\n >;\n};\n\ntype RpcSubscriptionsReturnTypeMapper = TRpcMethod extends Callable\n ? (...rawParams: unknown[]) => RpcSubscriptionsPlan>\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RpcSubscriptionsApiMethod = (...args: any) => any;\nexport interface RpcSubscriptionsApiMethods {\n [methodName: string]: RpcSubscriptionsApiMethod;\n}\n\n/**\n * Creates a JavaScript proxy that converts _any_ function call called on it to a\n * {@link RpcSubscriptionsPlan} by creating an `execute` function that:\n *\n * - calls the supplied {@link RpcSubscriptionsApiConfig.planExecutor} with a JSON RPC v2 payload\n * object with the requested `methodName` and `params` properties, optionally transformed by\n * {@link RpcSubscriptionsApiConfig.requestTransformer}.\n *\n * @example\n * ```ts\n * // For example, given this `RpcSubscriptionsApi`:\n * const rpcSubscriptionsApi = createJsonRpcSubscriptionsApi({\n * async planExecutor({ channel, request }) {\n * await channel.send(request);\n * return {\n * ...channel,\n * on(type, listener, options) {\n * if (type !== 'message') {\n * return channel.on(type, listener, options);\n * }\n * return channel.on(\n * 'message',\n * function resultGettingListener(message) {\n * listener(message.result);\n * },\n * options,\n * );\n * }\n * }\n * },\n * requestTransformer: (...rawParams) => rawParams.reverse(),\n * });\n *\n * // ...the following function call:\n * rpcSubscriptionsApi.foo('bar', { baz: 'bat' });\n *\n * // ...will produce a `RpcSubscriptionsPlan` that:\n * // - Uses the following payload: { id: 1, jsonrpc: '2.0', method: 'foo', params: [{ baz: 'bat' }, 'bar'] }.\n * // - Emits the \"result\" property of each RPC Subscriptions message.\n * ```\n */\nexport function createRpcSubscriptionsApi(\n config: RpcSubscriptionsApiConfig,\n): RpcSubscriptionsApi {\n return new Proxy({} as RpcSubscriptionsApi, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get>(\n ...args: Parameters>['get']>>\n ) {\n const [_, p] = args;\n const methodName = p.toString() as keyof TRpcSubscriptionsApiMethods as string;\n return function (\n ...params: Parameters<\n TRpcSubscriptionsApiMethods[TNotificationName] extends CallableFunction\n ? TRpcSubscriptionsApiMethods[TNotificationName]\n : never\n >\n ): RpcSubscriptionsPlan> {\n const rawRequest = { methodName, params };\n const request = config.requestTransformer ? config.requestTransformer(rawRequest) : rawRequest;\n return {\n execute(planConfig) {\n return config.planExecutor({ ...planConfig, request });\n },\n request,\n };\n };\n },\n });\n}\n","import {\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SolanaError,\n} from '@solana/errors';\nimport { DataPublisher } from '@solana/subscribable';\n\ntype RpcSubscriptionsChannelSolanaErrorCode =\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT;\n\nexport type RpcSubscriptionChannelEvents = {\n /**\n * Fires when the channel closes unexpectedly.\n * @eventProperty\n */\n error: SolanaError;\n /**\n * Fires on every message received from the remote end.\n * @eventProperty\n */\n message: TInboundMessage;\n};\n\n/**\n * A {@link DataPublisher} on which you can subscribe to events of type\n * {@link RpcSubscriptionChannelEvents | RpcSubscriptionChannelEvents}.\n * Additionally, you can use this object to send messages of type `TOutboundMessage` back to the\n * remote end by calling its {@link RpcSubscriptionsChannel.send | `send(message)`} method.\n */\nexport interface RpcSubscriptionsChannel extends DataPublisher<\n RpcSubscriptionChannelEvents\n> {\n send(message: TOutboundMessage): Promise;\n}\n\n/**\n * A channel creator is a function that accepts an `AbortSignal`, returns a new\n * {@link RpcSubscriptionsChannel}, and tears down the channel when the abort signal fires.\n */\nexport type RpcSubscriptionsChannelCreator = (\n config: Readonly<{\n abortSignal: AbortSignal;\n }>,\n) => Promise>;\n\n/**\n * Given a channel with inbound messages of type `T` and a function of type `T => U`, returns a new\n * channel with inbound messages of type `U`.\n *\n * Note that this only affects messages of type `\"message\"` and thus, does not affect incoming error\n * messages.\n *\n * @example Parsing incoming JSON messages\n * ```ts\n * const transformedChannel = transformChannelInboundMessages(channel, JSON.parse);\n * ```\n */\nexport function transformChannelInboundMessages(\n channel: RpcSubscriptionsChannel,\n transform: (message: TInboundMessage) => TNewInboundMessage,\n): RpcSubscriptionsChannel {\n return Object.freeze>({\n ...channel,\n on(type, subscriber, options) {\n if (type !== 'message') {\n return channel.on(\n type,\n subscriber as (data: RpcSubscriptionChannelEvents[typeof type]) => void,\n options,\n );\n }\n return channel.on(\n 'message',\n message => (subscriber as (data: TNewInboundMessage) => void)(transform(message)),\n options,\n );\n },\n });\n}\n\n/**\n * Given a channel with outbound messages of type `T` and a function of type `U => T`, returns a new\n * channel with outbound messages of type `U`.\n *\n * @example Stringifying JSON messages before sending them over the wire\n * ```ts\n * const transformedChannel = transformChannelOutboundMessages(channel, JSON.stringify);\n * ```\n */\nexport function transformChannelOutboundMessages(\n channel: RpcSubscriptionsChannel,\n transform: (message: TNewOutboundMessage) => TOutboundMessage,\n): RpcSubscriptionsChannel {\n return Object.freeze>({\n ...channel,\n send: message => channel.send(transform(message)),\n });\n}\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import {\n getSolanaErrorFromJsonRpcError,\n SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID,\n SolanaError,\n} from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport { safeRace } from '@solana/promises';\nimport { createRpcMessage, RpcRequest, RpcResponseData, RpcResponseTransformer } from '@solana/rpc-spec-types';\nimport { DataPublisher } from '@solana/subscribable';\nimport { demultiplexDataPublisher } from '@solana/subscribable';\n\nimport { RpcSubscriptionChannelEvents } from './rpc-subscriptions-channel';\nimport { RpcSubscriptionsChannel } from './rpc-subscriptions-channel';\n\ntype Config = Readonly<{\n channel: RpcSubscriptionsChannel | RpcResponseData>;\n responseTransformer?: RpcResponseTransformer;\n signal: AbortSignal;\n subscribeRequest: RpcRequest;\n unsubscribeMethodName: string;\n}>;\n\ntype RpcNotification = Readonly<{\n method: string;\n params: Readonly<{\n result: TNotification;\n subscription: number;\n }>;\n}>;\n\ntype RpcSubscriptionId = number;\n\ntype RpcSubscriptionNotificationEvents = Omit, 'message'> & {\n notification: TNotification;\n};\n\nconst subscriberCountBySubscriptionIdByChannel = new WeakMap>();\nfunction decrementSubscriberCountAndReturnNewCount(channel: WeakKey, subscriptionId?: number): number | undefined {\n return augmentSubscriberCountAndReturnNewCount(-1, channel, subscriptionId);\n}\nfunction incrementSubscriberCount(channel: WeakKey, subscriptionId?: number): void {\n augmentSubscriberCountAndReturnNewCount(1, channel, subscriptionId);\n}\nfunction getSubscriberCountBySubscriptionIdForChannel(channel: WeakKey): Record {\n let subscriberCountBySubscriptionId = subscriberCountBySubscriptionIdByChannel.get(channel);\n if (!subscriberCountBySubscriptionId) {\n subscriberCountBySubscriptionIdByChannel.set(channel, (subscriberCountBySubscriptionId = {}));\n }\n return subscriberCountBySubscriptionId;\n}\nfunction augmentSubscriberCountAndReturnNewCount(\n amount: -1 | 1,\n channel: WeakKey,\n subscriptionId?: number,\n): number | undefined {\n if (subscriptionId === undefined) {\n return;\n }\n const subscriberCountBySubscriptionId = getSubscriberCountBySubscriptionIdForChannel(channel);\n if (!subscriberCountBySubscriptionId[subscriptionId] && amount > 0) {\n subscriberCountBySubscriptionId[subscriptionId] = 0;\n }\n const newCount = amount + subscriberCountBySubscriptionId[subscriptionId];\n if (newCount <= 0) {\n delete subscriberCountBySubscriptionId[subscriptionId];\n } else {\n subscriberCountBySubscriptionId[subscriptionId] = newCount;\n }\n return newCount;\n}\n\nconst cache = new WeakMap();\nfunction getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer(\n channel: RpcSubscriptionsChannel>,\n subscribeRequest: RpcRequest,\n responseTransformer?: RpcResponseTransformer,\n): DataPublisher<{\n [channelName: `notification:${number}`]: TNotification;\n}> {\n let publisherByResponseTransformer = cache.get(channel);\n if (!publisherByResponseTransformer) {\n cache.set(channel, (publisherByResponseTransformer = new WeakMap()));\n }\n const responseTransformerKey = responseTransformer ?? channel;\n let publisher = publisherByResponseTransformer.get(responseTransformerKey);\n if (!publisher) {\n publisherByResponseTransformer.set(\n responseTransformerKey,\n (publisher = demultiplexDataPublisher(channel, 'message', rawMessage => {\n const message = rawMessage as RpcNotification | RpcResponseData;\n if (!('method' in message)) {\n return;\n }\n const transformedNotification = responseTransformer\n ? responseTransformer(message.params.result, subscribeRequest)\n : message.params.result;\n return [`notification:${message.params.subscription}`, transformedNotification];\n })),\n );\n }\n return publisher;\n}\n\n/**\n * Given a channel, this function executes the particular subscription plan required by the Solana\n * JSON RPC Subscriptions API.\n *\n * @param config\n *\n * 1. Calls the `subscribeRequest` on the remote RPC\n * 2. Waits for a response containing the subscription id\n * 3. Returns a {@link DataPublisher} that publishes notifications related to that subscriptions id,\n * filtering out all others\n * 4. Calls the `unsubscribeMethodName` on the remote RPC when the abort signal is fired.\n */\nexport async function executeRpcPubSubSubscriptionPlan({\n channel,\n responseTransformer,\n signal,\n subscribeRequest,\n unsubscribeMethodName,\n}: Config): Promise>> {\n let subscriptionId: number | undefined;\n channel.on(\n 'error',\n () => {\n // An error on the channel indicates that the subscriptions are dead.\n // There is no longer any sense hanging on to subscription ids.\n // Erasing it here will prevent the unsubscribe code from running.\n subscriptionId = undefined;\n subscriberCountBySubscriptionIdByChannel.delete(channel);\n },\n { signal },\n );\n /**\n * STEP 1\n * Create a promise that rejects if this subscription is aborted and sends\n * the unsubscribe message if the subscription is active at that time.\n */\n const abortPromise = new Promise((_, reject) => {\n function handleAbort(this: AbortSignal) {\n /**\n * Because of https://github.com/solana-labs/solana/pull/18943, two subscriptions for\n * materially the same notification will be coalesced on the server. This means they\n * will be assigned the same subscription id, and will occupy one subscription slot. We\n * must be careful not to send the unsubscribe message until the last subscriber aborts.\n */\n if (decrementSubscriberCountAndReturnNewCount(channel, subscriptionId) === 0) {\n const unsubscribePayload = createRpcMessage({\n methodName: unsubscribeMethodName,\n params: [subscriptionId],\n });\n subscriptionId = undefined;\n channel.send(unsubscribePayload).catch(() => {});\n }\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(this.reason);\n }\n if (signal.aborted) {\n handleAbort.call(signal);\n } else {\n signal.addEventListener('abort', handleAbort);\n }\n });\n /**\n * STEP 2\n * Send the subscription request.\n */\n const subscribePayload = createRpcMessage(subscribeRequest);\n await channel.send(subscribePayload);\n /**\n * STEP 3\n * Wait for the acknowledgement from the server with the subscription id.\n */\n const subscriptionIdPromise = new Promise((resolve, reject) => {\n const abortController = new AbortController();\n signal.addEventListener('abort', abortController.abort.bind(abortController));\n const options = { signal: abortController.signal } as const;\n channel.on(\n 'error',\n err => {\n abortController.abort();\n reject(err);\n },\n options,\n );\n channel.on(\n 'message',\n message => {\n if (message && typeof message === 'object' && 'id' in message && message.id === subscribePayload.id) {\n abortController.abort();\n if ('error' in message) {\n reject(getSolanaErrorFromJsonRpcError(message.error));\n } else {\n resolve(message.result);\n }\n }\n },\n options,\n );\n });\n subscriptionId = await safeRace([abortPromise, subscriptionIdPromise]);\n if (subscriptionId == null) {\n throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID);\n }\n incrementSubscriberCount(channel, subscriptionId);\n /**\n * STEP 4\n * Filter out notifications unrelated to this subscription.\n */\n const notificationPublisher = getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer(\n channel,\n subscribeRequest,\n responseTransformer,\n );\n const notificationKey = `notification:${subscriptionId}` as const;\n return {\n on(type, listener, options) {\n switch (type) {\n case 'notification':\n return notificationPublisher.on(\n notificationKey,\n listener as (data: RpcSubscriptionNotificationEvents['notification']) => void,\n options,\n );\n case 'error':\n return channel.on(\n 'error',\n listener as (data: RpcSubscriptionNotificationEvents['error']) => void,\n options,\n );\n default:\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, {\n channelName: type,\n supportedChannelNames: ['notification', 'error'],\n });\n }\n },\n };\n}\n","import {\n createRpcSubscriptionsApi,\n executeRpcPubSubSubscriptionPlan,\n RpcSubscriptionsApi,\n RpcSubscriptionsApiMethods,\n} from '@solana/rpc-subscriptions-spec';\nimport {\n AllowedNumericKeypaths,\n getDefaultRequestTransformerForSolanaRpc,\n getDefaultResponseTransformerForSolanaRpcSubscriptions,\n jsonParsedAccountsConfigs,\n KEYPATH_WILDCARD,\n RequestTransformerConfig,\n} from '@solana/rpc-transformers';\n\nimport { AccountNotificationsApi } from './account-notifications';\nimport { BlockNotificationsApi } from './block-notifications';\nimport { LogsNotificationsApi } from './logs-notifications';\nimport { ProgramNotificationsApi } from './program-notifications';\nimport { RootNotificationsApi } from './root-notifications';\nimport { SignatureNotificationsApi } from './signature-notifications';\nimport { SlotNotificationsApi } from './slot-notifications';\nimport { SlotsUpdatesNotificationsApi } from './slots-updates-notifications';\nimport { VoteNotificationsApi } from './vote-notifications';\n\nexport type SolanaRpcSubscriptionsApi = AccountNotificationsApi &\n LogsNotificationsApi &\n ProgramNotificationsApi &\n RootNotificationsApi &\n SignatureNotificationsApi &\n SlotNotificationsApi;\nexport type SolanaRpcSubscriptionsApiUnstable = BlockNotificationsApi &\n SlotsUpdatesNotificationsApi &\n VoteNotificationsApi;\n\nexport type {\n AccountNotificationsApi,\n BlockNotificationsApi,\n LogsNotificationsApi,\n ProgramNotificationsApi,\n RootNotificationsApi,\n SignatureNotificationsApi,\n SlotNotificationsApi,\n SlotsUpdatesNotificationsApi,\n VoteNotificationsApi,\n};\n\ntype Config = RequestTransformerConfig;\n\nfunction createSolanaRpcSubscriptionsApi_INTERNAL(\n config?: Config,\n): RpcSubscriptionsApi {\n const requestTransformer = getDefaultRequestTransformerForSolanaRpc(config);\n const responseTransformer = getDefaultResponseTransformerForSolanaRpcSubscriptions({\n allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n });\n return createRpcSubscriptionsApi({\n planExecutor({ request, ...rest }) {\n return executeRpcPubSubSubscriptionPlan({\n ...rest,\n responseTransformer,\n subscribeRequest: { ...request, methodName: request.methodName.replace(/Notifications$/, 'Subscribe') },\n unsubscribeMethodName: request.methodName.replace(/Notifications$/, 'Unsubscribe'),\n });\n },\n requestTransformer,\n });\n}\n\nexport function createSolanaRpcSubscriptionsApi(\n config?: Config,\n): RpcSubscriptionsApi {\n return createSolanaRpcSubscriptionsApi_INTERNAL(config);\n}\n\nexport function createSolanaRpcSubscriptionsApi_UNSTABLE(config?: Config) {\n return createSolanaRpcSubscriptionsApi_INTERNAL(\n config,\n );\n}\n\nlet memoizedKeypaths: AllowedNumericKeypaths<\n RpcSubscriptionsApi\n>;\n\n/**\n * These are keypaths at the end of which you will find a numeric value that should *not* be upcast\n * to a `bigint`. These are values that are legitimately defined as `u8` or `usize` on the backend.\n */\nfunction getAllowedNumericKeypaths(): AllowedNumericKeypaths<\n RpcSubscriptionsApi\n> {\n if (!memoizedKeypaths) {\n memoizedKeypaths = {\n accountNotifications: jsonParsedAccountsConfigs.map(c => ['value', ...c]),\n blockNotifications: [\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'preTokenBalances',\n KEYPATH_WILDCARD,\n 'accountIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'preTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'postTokenBalances',\n KEYPATH_WILDCARD,\n 'accountIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'postTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n ['value', 'block', 'transactions', KEYPATH_WILDCARD, 'meta', 'rewards', KEYPATH_WILDCARD, 'commission'],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n 'index',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n 'instructions',\n KEYPATH_WILDCARD,\n 'programIdIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n 'instructions',\n KEYPATH_WILDCARD,\n 'accounts',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'addressTableLookups',\n KEYPATH_WILDCARD,\n 'writableIndexes',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'addressTableLookups',\n KEYPATH_WILDCARD,\n 'readonlyIndexes',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'instructions',\n KEYPATH_WILDCARD,\n 'programIdIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'instructions',\n KEYPATH_WILDCARD,\n 'accounts',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'header',\n 'numReadonlySignedAccounts',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'header',\n 'numReadonlyUnsignedAccounts',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'header',\n 'numRequiredSignatures',\n ],\n ['value', 'block', 'rewards', KEYPATH_WILDCARD, 'commission'],\n ],\n programNotifications: jsonParsedAccountsConfigs.flatMap(c => [\n ['value', KEYPATH_WILDCARD, 'account', ...c],\n [KEYPATH_WILDCARD, 'account', ...c],\n ]),\n };\n }\n return memoizedKeypaths;\n}\n","'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [options.isServer=false] Create the instance in either\n * server or client mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n */\n constructor(options) {\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._maxPayload = this._options.maxPayload | 0;\n this._isServer = !!this._options.isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate({\n ...opts.perMessageDeflate,\n isServer: false,\n maxPayload: opts.maxPayload\n });\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate({\n ...this.options.perMessageDeflate,\n isServer: true,\n maxPayload: this.options.maxPayload\n });\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of \n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n","import createWebSocketStream from './lib/stream.js';\nimport extension from './lib/extension.js';\nimport PerMessageDeflate from './lib/permessage-deflate.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport subprotocol from './lib/subprotocol.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport {\n createWebSocketStream,\n extension,\n PerMessageDeflate,\n Receiver,\n Sender,\n subprotocol,\n WebSocket,\n WebSocketServer\n};\n\nexport default WebSocket;\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","// When building the browser bundle, this import gets replaced by `globalThis.WebSocket`.\nimport WebSocketImpl from 'ws';\n\nexport default globalThis.WebSocket\n ? globalThis.WebSocket // Use native `WebSocket` in runtimes that support it (eg. Deno)\n : WebSocketImpl;\n","import {\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SolanaError,\n} from '@solana/errors';\nimport { EventTarget } from '@solana/event-target-impl';\nimport { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\nimport { getDataPublisherFromEventEmitter } from '@solana/subscribable';\nimport WebSocket from '@solana/ws-impl';\n\nexport type Config = Readonly<{\n /**\n * The number of bytes to admit into the WebSocket's send buffer before queueing messages on the\n * client.\n *\n * When you call {@link RpcSubscriptionsChannel.send | `send()`} on a `WebSocket` the runtime\n * might add the message to a buffer rather than send it right away. In the event that\n * `socket.bufferedAmount` exceeds the value configured here, messages will be added to a queue\n * in your application code instead of being sent to the WebSocket, until such time as the\n * `bufferedAmount` falls back below the high watermark.\n */\n sendBufferHighWatermark: number;\n /**\n * An `AbortSignal` to fire when you want to explicitly close the `WebSocket`.\n *\n * If the channel is open it will be closed with a normal closure code\n * (https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1) If the channel has not been\n * established yet, firing this signal will result in the `AbortError` being thrown to the\n * caller who was trying to open the channel.\n */\n signal: AbortSignal;\n /**\n * A string representing the target endpoint.\n *\n * In Node, it must be an absolute URL using the `ws` or `wss` protocol.\n */\n url: string;\n}>;\n\ntype WebSocketMessage = ArrayBufferLike | ArrayBufferView | Blob | string;\n\nconst NORMAL_CLOSURE_CODE = 1000; // https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1\n\n/**\n * Creates an object that represents an open channel to a `WebSocket` server.\n *\n * You can use it to send messages by calling its\n * {@link RpcSubscriptionsChannel.send | `send()`} function and you can receive them by subscribing\n * to the {@link RpcSubscriptionChannelEvents} it emits.\n */\nexport function createWebSocketChannel({\n sendBufferHighWatermark,\n signal,\n url,\n}: Config): Promise> {\n if (signal.aborted) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n return Promise.reject(signal.reason);\n }\n let bufferDrainWatcher: Readonly<{ onCancel(): void; promise: Promise }> | undefined;\n let hasConnected = false;\n const listenerRemovers = new Set<() => void>();\n function cleanupListeners() {\n listenerRemovers.forEach(r => {\n r();\n });\n listenerRemovers.clear();\n }\n function handleAbort() {\n cleanupListeners();\n if (!hasConnected) {\n rejectOpen(signal.reason);\n }\n if (webSocket.readyState !== WebSocket.CLOSED && webSocket.readyState !== WebSocket.CLOSING) {\n webSocket.close(NORMAL_CLOSURE_CODE);\n }\n }\n function handleClose(ev: CloseEvent) {\n cleanupListeners();\n bufferDrainWatcher?.onCancel();\n signal.removeEventListener('abort', handleAbort);\n webSocket.removeEventListener('close', handleClose);\n webSocket.removeEventListener('error', handleError);\n webSocket.removeEventListener('message', handleMessage);\n webSocket.removeEventListener('open', handleOpen);\n if (!signal.aborted && !(ev.wasClean && ev.code === NORMAL_CLOSURE_CODE)) {\n eventTarget.dispatchEvent(\n new CustomEvent('error', {\n detail: new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, {\n cause: ev,\n }),\n }),\n );\n }\n }\n function handleError(ev: Event) {\n if (signal.aborted) {\n return;\n }\n if (!hasConnected) {\n const failedToConnectError = new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, {\n errorEvent: ev,\n });\n rejectOpen(failedToConnectError);\n eventTarget.dispatchEvent(\n new CustomEvent('error', {\n detail: failedToConnectError,\n }),\n );\n }\n }\n function handleMessage(ev: MessageEvent) {\n if (signal.aborted) {\n return;\n }\n eventTarget.dispatchEvent(new CustomEvent('message', { detail: ev.data }));\n }\n const eventTarget = new EventTarget();\n const dataPublisher = getDataPublisherFromEventEmitter(eventTarget);\n function handleOpen() {\n hasConnected = true;\n resolveOpen({\n ...dataPublisher,\n async send(message) {\n if (webSocket.readyState !== WebSocket.OPEN) {\n throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED);\n }\n if (!bufferDrainWatcher && webSocket.bufferedAmount > sendBufferHighWatermark) {\n let onCancel!: () => void;\n const promise = new Promise((resolve, reject) => {\n const intervalId = setInterval(() => {\n if (\n webSocket.readyState !== WebSocket.OPEN ||\n !(webSocket.bufferedAmount > sendBufferHighWatermark)\n ) {\n clearInterval(intervalId);\n bufferDrainWatcher = undefined;\n resolve();\n }\n }, 16);\n onCancel = () => {\n bufferDrainWatcher = undefined;\n clearInterval(intervalId);\n reject(\n new SolanaError(\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n ),\n );\n };\n });\n bufferDrainWatcher = {\n onCancel,\n promise,\n };\n }\n if (bufferDrainWatcher) {\n if (ArrayBuffer.isView(message) && !(message instanceof DataView)) {\n const TypedArrayConstructor = message.constructor as {\n new (...args: [typeof message]): typeof message;\n };\n // Clone the message to prevent mutation while queued.\n message = new TypedArrayConstructor(message);\n }\n await bufferDrainWatcher.promise;\n }\n webSocket.send(message);\n },\n });\n }\n const webSocket = new WebSocket(url);\n signal.addEventListener('abort', handleAbort);\n webSocket.addEventListener('close', handleClose);\n webSocket.addEventListener('error', handleError);\n webSocket.addEventListener('message', handleMessage);\n webSocket.addEventListener('open', handleOpen);\n let rejectOpen!: (e: SolanaError) => void;\n let resolveOpen!: (value: RpcSubscriptionsChannel) => void;\n return new Promise>((resolve, reject) => {\n rejectOpen = reject;\n resolveOpen = resolve;\n });\n}\n","import { safeCaptureStackTrace, SOLANA_ERROR__RPC__INTEGER_OVERFLOW, SolanaError } from '@solana/errors';\nimport type { KeyPath } from '@solana/rpc-transformers';\n\nexport function createSolanaJsonRpcIntegerOverflowError(\n methodName: string,\n keyPath: KeyPath,\n value: bigint,\n): SolanaError {\n let argumentLabel = '';\n if (typeof keyPath[0] === 'number') {\n const argPosition = keyPath[0] + 1;\n const lastDigit = argPosition % 10;\n const lastTwoDigits = argPosition % 100;\n if (lastDigit == 1 && lastTwoDigits != 11) {\n argumentLabel = argPosition + 'st';\n } else if (lastDigit == 2 && lastTwoDigits != 12) {\n argumentLabel = argPosition + 'nd';\n } else if (lastDigit == 3 && lastTwoDigits != 13) {\n argumentLabel = argPosition + 'rd';\n } else {\n argumentLabel = argPosition + 'th';\n }\n } else {\n argumentLabel = `\\`${keyPath[0].toString()}\\``;\n }\n const path =\n keyPath.length > 1\n ? keyPath\n .slice(1)\n .map(pathPart => (typeof pathPart === 'number' ? `[${pathPart}]` : pathPart))\n .join('.')\n : undefined;\n const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, {\n argumentLabel,\n keyPath: keyPath as readonly (number | string | symbol)[],\n methodName,\n optionalPathLabel: path ? ` at path \\`${path}\\`` : '',\n value,\n ...(path !== undefined ? { path } : undefined),\n });\n safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError);\n return error;\n}\n","import type { createSolanaRpcSubscriptionsApi } from '@solana/rpc-subscriptions-api';\n\nimport { createSolanaJsonRpcIntegerOverflowError } from './rpc-integer-overflow-error';\n\nexport const DEFAULT_RPC_SUBSCRIPTIONS_CONFIG: Partial<\n NonNullable[0]>\n> = {\n defaultCommitment: 'confirmed',\n onIntegerOverflow(request, keyPath, value) {\n throw createSolanaJsonRpcIntegerOverflowError(request.methodName, keyPath, value);\n },\n};\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import { isSolanaError, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport type { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\n\ntype Config> = Readonly<{\n abortSignal: AbortSignal;\n channel: TChannel;\n intervalMs: number;\n}>;\n\nconst PING_PAYLOAD = {\n jsonrpc: '2.0',\n method: 'ping',\n} as const;\n\n/**\n * Given a {@link RpcSubscriptionsChannel}, will return a new channel that sends a ping message to\n * the inner channel if a message has not been sent or received in the last `intervalMs`. In web\n * browsers, this implementation sends no ping when the network is down, and sends a ping\n * immediately upon the network coming back up.\n */\nexport function getRpcSubscriptionsChannelWithAutoping>({\n abortSignal: callerAbortSignal,\n channel,\n intervalMs,\n}: Config): TChannel {\n let intervalId: ReturnType | undefined;\n function sendPing() {\n channel.send(PING_PAYLOAD).catch((e: unknown) => {\n if (isSolanaError(e, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED)) {\n pingerAbortController.abort();\n }\n });\n }\n function restartPingTimer() {\n clearInterval(intervalId);\n intervalId = setInterval(sendPing, intervalMs);\n }\n const pingerAbortController = new AbortController();\n pingerAbortController.signal.addEventListener('abort', () => {\n clearInterval(intervalId);\n });\n callerAbortSignal.addEventListener('abort', () => {\n pingerAbortController.abort();\n });\n channel.on(\n 'error',\n () => {\n pingerAbortController.abort();\n },\n { signal: pingerAbortController.signal },\n );\n channel.on('message', restartPingTimer, { signal: pingerAbortController.signal });\n if (!__BROWSER__ || globalThis.navigator.onLine) {\n restartPingTimer();\n }\n if (__BROWSER__) {\n globalThis.addEventListener(\n 'offline',\n function handleOffline() {\n clearInterval(intervalId);\n },\n { signal: pingerAbortController.signal },\n );\n globalThis.addEventListener(\n 'online',\n function handleOnline() {\n sendPing();\n restartPingTimer();\n },\n { signal: pingerAbortController.signal },\n );\n }\n return {\n ...channel,\n send(...args) {\n if (!pingerAbortController.signal.aborted) {\n restartPingTimer();\n }\n return channel.send(...args);\n },\n };\n}\n","import { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\n\nexport type ChannelPoolEntry = {\n channel: PromiseLike> | RpcSubscriptionsChannel;\n readonly dispose: () => void;\n subscriptionCount: number;\n};\n\ntype ChannelPool = { readonly entries: ChannelPoolEntry[]; freeChannelIndex: number };\n\nexport function createChannelPool(): ChannelPool {\n return {\n entries: [],\n freeChannelIndex: -1,\n };\n}\n","import { AbortController } from '@solana/event-target-impl';\nimport { RpcSubscriptionsChannelCreator } from '@solana/rpc-subscriptions-spec';\n\nimport { ChannelPoolEntry, createChannelPool } from './rpc-subscriptions-channel-pool-internal';\n\ntype Config = Readonly<{\n maxSubscriptionsPerChannel: number;\n minChannels: number;\n}>;\n\n/**\n * Given a channel creator, will return a new channel creator with the following behavior.\n *\n * 1. When called, returns a {@link RpcSubscriptionsChannel}. Adds that channel to a pool.\n * 2. When called again, creates and returns new\n * {@link RpcSubscriptionChannel | RpcSubscriptionChannels} up to the number specified by\n * `minChannels`.\n * 3. When `minChannels` channels have been created, subsequent calls vend whichever existing\n * channel from the pool has the fewest subscribers, or the next one in rotation in the event of\n * a tie.\n * 4. Once all channels carry the number of subscribers specified by the number\n * `maxSubscriptionsPerChannel`, new channels in excess of `minChannel` will be created,\n * returned, and added to the pool.\n * 5. A channel will be destroyed once all of its subscribers' abort signals fire.\n */\nexport function getChannelPoolingChannelCreator<\n TChannelCreator extends RpcSubscriptionsChannelCreator,\n>(createChannel: TChannelCreator, { maxSubscriptionsPerChannel, minChannels }: Config): TChannelCreator {\n const pool = createChannelPool();\n /**\n * This function advances the free channel index to the pool entry with the most capacity. It\n * sets the index to `-1` if all channels are full.\n */\n function recomputeFreeChannelIndex() {\n if (pool.entries.length < minChannels) {\n // Don't set the free channel index until the pool fills up; we want to keep creating\n // channels before we start rotating among them.\n pool.freeChannelIndex = -1;\n return;\n }\n let mostFreeChannel: Readonly<{ poolIndex: number; subscriptionCount: number }> | undefined;\n for (let ii = 0; ii < pool.entries.length; ii++) {\n const nextPoolIndex = (pool.freeChannelIndex + ii + 2) % pool.entries.length;\n const nextPoolEntry =\n // Start from the item two positions after the current item. This way, the\n // search will finish on the item after the current one. This ensures that, if\n // any channels tie for having the most capacity, the one that will be chosen is\n // the one immediately to the current one's right (wrapping around).\n pool.entries[nextPoolIndex];\n if (\n nextPoolEntry.subscriptionCount < maxSubscriptionsPerChannel &&\n (!mostFreeChannel || mostFreeChannel.subscriptionCount >= nextPoolEntry.subscriptionCount)\n ) {\n mostFreeChannel = {\n poolIndex: nextPoolIndex,\n subscriptionCount: nextPoolEntry.subscriptionCount,\n };\n }\n }\n pool.freeChannelIndex = mostFreeChannel?.poolIndex ?? -1;\n }\n return function getExistingChannelWithMostCapacityOrCreateChannel({ abortSignal }) {\n let poolEntry: ChannelPoolEntry;\n function destroyPoolEntry() {\n const index = pool.entries.findIndex(entry => entry === poolEntry);\n pool.entries.splice(index, 1);\n poolEntry.dispose();\n recomputeFreeChannelIndex();\n }\n if (pool.freeChannelIndex === -1) {\n const abortController = new AbortController();\n const newChannelPromise = createChannel({ abortSignal: abortController.signal });\n newChannelPromise\n .then(newChannel => {\n newChannel.on('error', destroyPoolEntry, { signal: abortController.signal });\n })\n .catch(destroyPoolEntry);\n poolEntry = {\n channel: newChannelPromise,\n dispose() {\n abortController.abort();\n },\n subscriptionCount: 0,\n };\n pool.entries.push(poolEntry);\n } else {\n poolEntry = pool.entries[pool.freeChannelIndex];\n }\n /**\n * A note about subscription counts.\n * Because of https://github.com/solana-labs/solana/pull/18943, two subscriptions for\n * materially the same notification will be coalesced on the server. This means they will be\n * assigned the same subscription id, and will occupy one subscription slot. We can't tell,\n * from here, whether a subscription will be treated in this way or not, so we\n * unconditionally increment the subscription count every time a subscription request is\n * made. This may result in subscription channels being treated as out-of-capacity when in\n * fact they are not.\n */\n poolEntry.subscriptionCount++;\n abortSignal.addEventListener('abort', function destroyConsumer() {\n poolEntry.subscriptionCount--;\n if (poolEntry.subscriptionCount === 0) {\n destroyPoolEntry();\n } else if (pool.freeChannelIndex !== -1) {\n // Back the free channel index up one position, and recompute it.\n pool.freeChannelIndex--;\n recomputeFreeChannelIndex();\n }\n });\n recomputeFreeChannelIndex();\n return poolEntry.channel;\n } as TChannelCreator;\n}\n","import { pipe } from '@solana/functional';\nimport {\n RpcSubscriptionsChannel,\n transformChannelInboundMessages,\n transformChannelOutboundMessages,\n} from '@solana/rpc-subscriptions-spec';\n\n/**\n * Given a {@link RpcSubscriptionsChannel}, will return a new channel that parses data published to\n * the `'message'` channel as JSON, and JSON-stringifies messages sent via the\n * {@link RpcSubscriptionsChannel.send | send(message)} method.\n */\nexport function getRpcSubscriptionsChannelWithJSONSerialization(\n channel: RpcSubscriptionsChannel,\n): RpcSubscriptionsChannel {\n return pipe(\n channel,\n c => transformChannelInboundMessages(c, JSON.parse),\n c => transformChannelOutboundMessages(c, JSON.stringify),\n );\n}\n","import { pipe } from '@solana/functional';\nimport { parseJsonWithBigInts, stringifyJsonWithBigInts } from '@solana/rpc-spec-types';\nimport {\n RpcSubscriptionsChannel,\n transformChannelInboundMessages,\n transformChannelOutboundMessages,\n} from '@solana/rpc-subscriptions-spec';\n\n/**\n * Similarly, to {@link getRpcSubscriptionsChannelWithJSONSerialization}, this function will\n * stringify and parse JSON message to and from the given `string` channel. However, this function\n * parses any integer value as a `BigInt` in order to safely handle numbers that exceed the\n * JavaScript [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\n * value.\n */\nexport function getRpcSubscriptionsChannelWithBigIntJSONSerialization(\n channel: RpcSubscriptionsChannel,\n): RpcSubscriptionsChannel {\n return pipe(\n channel,\n c => transformChannelInboundMessages(c, parseJsonWithBigInts),\n c => transformChannelOutboundMessages(c, stringifyJsonWithBigInts),\n );\n}\n","import { createWebSocketChannel } from '@solana/rpc-subscriptions-channel-websocket';\nimport type { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\nimport type { ClusterUrl } from '@solana/rpc-types';\n\nimport { getRpcSubscriptionsChannelWithAutoping } from './rpc-subscriptions-autopinger';\nimport { getChannelPoolingChannelCreator } from './rpc-subscriptions-channel-pool';\nimport { RpcSubscriptionsChannelCreatorFromClusterUrl } from './rpc-subscriptions-clusters';\nimport { getRpcSubscriptionsChannelWithJSONSerialization } from './rpc-subscriptions-json';\nimport { getRpcSubscriptionsChannelWithBigIntJSONSerialization } from './rpc-subscriptions-json-bigint';\n\nexport type DefaultRpcSubscriptionsChannelConfig = Readonly<{\n /**\n * The number of milliseconds to wait since the last message sent or received over the channel\n * before sending a ping message to keep the channel open.\n */\n intervalMs?: number;\n /**\n * The number of subscribers that may share a channel before a new channel must be created.\n *\n * It is important that you set this to the maximum number of subscriptions that your RPC\n * provider recommends making over a single connection; the default is set deliberately low, so\n * as to comply with the restrictive limits of the public mainnet RPC node.\n *\n * @defaultValue 100\n */\n maxSubscriptionsPerChannel?: number;\n /** The number of channels to create before reusing a channel for a new subscription. */\n minChannels?: number;\n /**\n * The number of bytes of data to admit into the\n * [`WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) buffer before\n * buffering data on the client.\n */\n sendBufferHighWatermark?: number;\n /** The URL of the web socket server. Must use the `ws` or `wss` protocols. */\n url: TClusterUrl;\n}>;\n\n/**\n * Similar to {@link createDefaultRpcSubscriptionsChannelCreator} with some Solana-specific\n * defaults.\n *\n * For instance, it safely handles `BigInt` values in JSON messages since Solana RPC servers accept\n * and return integers larger than [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER).\n */\nexport function createDefaultSolanaRpcSubscriptionsChannelCreator(\n config: DefaultRpcSubscriptionsChannelConfig,\n): RpcSubscriptionsChannelCreatorFromClusterUrl {\n return createDefaultRpcSubscriptionsChannelCreatorImpl({\n ...config,\n jsonSerializer: getRpcSubscriptionsChannelWithBigIntJSONSerialization,\n });\n}\n\n/**\n * Creates a function that returns new subscription channels when called.\n */\nexport function createDefaultRpcSubscriptionsChannelCreator(\n config: DefaultRpcSubscriptionsChannelConfig,\n): RpcSubscriptionsChannelCreatorFromClusterUrl {\n return createDefaultRpcSubscriptionsChannelCreatorImpl({\n ...config,\n jsonSerializer: getRpcSubscriptionsChannelWithJSONSerialization,\n });\n}\n\nfunction createDefaultRpcSubscriptionsChannelCreatorImpl(\n config: DefaultRpcSubscriptionsChannelConfig & {\n jsonSerializer: (channel: RpcSubscriptionsChannel) => RpcSubscriptionsChannel;\n },\n): RpcSubscriptionsChannelCreatorFromClusterUrl {\n if (/^wss?:/i.test(config.url) === false) {\n const protocolMatch = config.url.match(/^([^:]+):/);\n throw new DOMException(\n protocolMatch\n ? \"Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or \" +\n `'wss'. '${protocolMatch[1]}:' is not allowed.`\n : `Failed to construct 'WebSocket': The URL '${config.url}' is invalid.`,\n );\n }\n const { intervalMs, ...rest } = config;\n const createDefaultRpcSubscriptionsChannel = (({ abortSignal }) => {\n return createWebSocketChannel({\n ...rest,\n sendBufferHighWatermark:\n config.sendBufferHighWatermark ??\n // Let 128KB of data into the WebSocket buffer before buffering it in the app.\n 131_072,\n signal: abortSignal,\n })\n .then(config.jsonSerializer)\n .then(channel =>\n getRpcSubscriptionsChannelWithAutoping({\n abortSignal,\n channel,\n intervalMs: intervalMs ?? 5_000,\n }),\n );\n }) as RpcSubscriptionsChannelCreatorFromClusterUrl;\n return getChannelPoolingChannelCreator(createDefaultRpcSubscriptionsChannel, {\n maxSubscriptionsPerChannel:\n config.maxSubscriptionsPerChannel ??\n /**\n * A note about this default. The idea here is that, because some RPC providers impose\n * an upper limit on the number of subscriptions you can make per channel, we must\n * choose a number low enough to avoid hitting that limit. Without knowing what provider\n * a given person is using, or what their limit is, we have to choose the lowest of all\n * known limits. As of this writing (October 2024) that is the public mainnet RPC node\n * (api.mainnet-beta.solana.com) at 100 subscriptions.\n */\n 100,\n minChannels: config.minChannels ?? 1,\n });\n}\n","import { AbortController } from '@solana/event-target-impl';\nimport fastStableStringify from '@solana/fast-stable-stringify';\nimport { RpcSubscriptionsTransport } from '@solana/rpc-subscriptions-spec';\nimport { DataPublisher } from '@solana/subscribable';\n\ntype CacheEntry = {\n readonly abortController: AbortController;\n readonly dataPublisherPromise: Promise;\n numSubscribers: number;\n};\n\n/**\n * Given a {@link RpcSubscriptionsTransport}, will return a new transport that coalesces identical\n * subscriptions into a single subscription request to the server. The determination of whether a\n * subscription is the same as another is based on the `rpcRequest` returned by its\n * {@link RpcSubscriptionsPlan}. The subscription will only be aborted once all subscribers abort,\n * or there is an error.\n */\nexport function getRpcSubscriptionsTransportWithSubscriptionCoalescing(\n transport: TTransport,\n): TTransport {\n const cache = new Map();\n return function rpcSubscriptionsTransportWithSubscriptionCoalescing(config) {\n const { request, signal } = config;\n const subscriptionConfigurationHash = fastStableStringify([request.methodName, request.params]);\n\n let cachedDataPublisherPromise = cache.get(subscriptionConfigurationHash);\n if (!cachedDataPublisherPromise) {\n const abortController = new AbortController();\n const dataPublisherPromise = transport({\n ...config,\n signal: abortController.signal,\n });\n dataPublisherPromise\n .then(dataPublisher => {\n dataPublisher.on(\n 'error',\n () => {\n cache.delete(subscriptionConfigurationHash);\n abortController.abort();\n },\n { signal: abortController.signal },\n );\n })\n .catch(() => {});\n cache.set(\n subscriptionConfigurationHash,\n (cachedDataPublisherPromise = {\n abortController,\n dataPublisherPromise,\n numSubscribers: 0,\n }),\n );\n }\n cachedDataPublisherPromise.numSubscribers++;\n signal.addEventListener(\n 'abort',\n () => {\n cachedDataPublisherPromise.numSubscribers--;\n if (cachedDataPublisherPromise.numSubscribers === 0) {\n queueMicrotask(() => {\n if (cachedDataPublisherPromise.numSubscribers === 0) {\n cache.delete(subscriptionConfigurationHash);\n cachedDataPublisherPromise.abortController.abort();\n }\n });\n }\n },\n { signal: cachedDataPublisherPromise.abortController.signal },\n );\n return cachedDataPublisherPromise.dataPublisherPromise;\n } as TTransport;\n}\n","import { pipe } from '@solana/functional';\nimport { RpcSubscriptionsChannelCreator, RpcSubscriptionsTransport } from '@solana/rpc-subscriptions-spec';\nimport { ClusterUrl } from '@solana/rpc-types';\n\nimport {\n RpcSubscriptionsChannelCreatorDevnet,\n RpcSubscriptionsChannelCreatorFromClusterUrl,\n RpcSubscriptionsChannelCreatorMainnet,\n RpcSubscriptionsChannelCreatorTestnet,\n RpcSubscriptionsTransportDevnet,\n RpcSubscriptionsTransportFromClusterUrl,\n RpcSubscriptionsTransportMainnet,\n RpcSubscriptionsTransportTestnet,\n} from './rpc-subscriptions-clusters';\nimport { getRpcSubscriptionsTransportWithSubscriptionCoalescing } from './rpc-subscriptions-coalescer';\n\nexport type DefaultRpcSubscriptionsTransportConfig = Readonly<{\n createChannel: RpcSubscriptionsChannelCreatorFromClusterUrl;\n}>;\n\n/**\n * Creates a {@link RpcSubscriptionsTransport} with some default behaviours.\n *\n * The default behaviours include:\n * - Logic that coalesces multiple subscriptions for the same notifications with the same arguments\n * into a single subscription.\n *\n * @param config\n */\nexport function createDefaultRpcSubscriptionsTransport({\n createChannel,\n}: DefaultRpcSubscriptionsTransportConfig) {\n return pipe(\n createRpcSubscriptionsTransportFromChannelCreator(\n createChannel,\n ) as RpcSubscriptionsTransport as RpcSubscriptionsTransportFromClusterUrl,\n transport => getRpcSubscriptionsTransportWithSubscriptionCoalescing(transport),\n );\n}\n\nexport function createRpcSubscriptionsTransportFromChannelCreator<\n TChannelCreator extends RpcSubscriptionsChannelCreator,\n TInboundMessage,\n TOutboundMessage,\n>(createChannel: TChannelCreator) {\n return (async ({ execute, signal }) => {\n const channel = await createChannel({ abortSignal: signal });\n return await execute({ channel, signal });\n }) as TChannelCreator extends RpcSubscriptionsChannelCreatorDevnet\n ? RpcSubscriptionsTransportDevnet\n : TChannelCreator extends RpcSubscriptionsChannelCreatorTestnet\n ? RpcSubscriptionsTransportTestnet\n : TChannelCreator extends RpcSubscriptionsChannelCreatorMainnet\n ? RpcSubscriptionsTransportMainnet\n : RpcSubscriptionsTransport;\n}\n","import type { SolanaRpcSubscriptionsApi, SolanaRpcSubscriptionsApiUnstable } from '@solana/rpc-subscriptions-api';\nimport { createSolanaRpcSubscriptionsApi } from '@solana/rpc-subscriptions-api';\nimport {\n createSubscriptionRpc,\n RpcSubscriptionsApiMethods,\n type RpcSubscriptionsTransport,\n} from '@solana/rpc-subscriptions-spec';\nimport { ClusterUrl } from '@solana/rpc-types';\n\nimport { DEFAULT_RPC_SUBSCRIPTIONS_CONFIG } from './rpc-default-config';\nimport {\n createDefaultSolanaRpcSubscriptionsChannelCreator,\n DefaultRpcSubscriptionsChannelConfig,\n} from './rpc-subscriptions-channel';\nimport type { RpcSubscriptionsFromTransport } from './rpc-subscriptions-clusters';\nimport { createDefaultRpcSubscriptionsTransport } from './rpc-subscriptions-transport';\n\ntype Config = DefaultRpcSubscriptionsChannelConfig;\n\nfunction createSolanaRpcSubscriptionsImpl(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n const transport = createDefaultRpcSubscriptionsTransport({\n createChannel: createDefaultSolanaRpcSubscriptionsChannelCreator({ ...config, url: clusterUrl }),\n });\n return createSolanaRpcSubscriptionsFromTransport(transport);\n}\n\n/**\n * Creates a {@link RpcSubscriptions} instance that exposes the Solana JSON RPC WebSocket API given\n * a cluster URL and some optional channel config. See\n * {@link createDefaultRpcSubscriptionsChannelCreator} for the shape of the channel config.\n */\nexport function createSolanaRpcSubscriptions(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n return createSolanaRpcSubscriptionsImpl(clusterUrl, config);\n}\n\n/**\n * Creates a {@link RpcSubscriptions} instance that exposes the Solana JSON RPC WebSocket API,\n * including its unstable methods, given a cluster URL and some optional channel config. See\n * {@link createDefaultRpcSubscriptionsChannelCreator} for the shape of the channel config.\n */\nexport function createSolanaRpcSubscriptions_UNSTABLE(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n return createSolanaRpcSubscriptionsImpl(\n clusterUrl,\n config,\n );\n}\n\n/**\n * Creates a {@link RpcSubscriptions} instance that exposes the Solana JSON RPC WebSocket API given\n * the supplied {@link RpcSubscriptionsTransport}.\n */\nexport function createSolanaRpcSubscriptionsFromTransport<\n TTransport extends RpcSubscriptionsTransport,\n TApi extends RpcSubscriptionsApiMethods = SolanaRpcSubscriptionsApi,\n>(transport: TTransport) {\n return createSubscriptionRpc({\n api: createSolanaRpcSubscriptionsApi(DEFAULT_RPC_SUBSCRIPTIONS_CONFIG),\n transport,\n }) as RpcSubscriptionsFromTransport;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, SolanaError } from '@solana/errors';\n\nimport { MessageSigner } from './message-signer';\nimport { TransactionSigner } from './transaction-signer';\n\n/**\n * Removes all duplicated {@link MessageSigner | MessageSigners} and\n * {@link TransactionSigner | TransactionSigners} from a provided array\n * by comparing their {@link Address | addresses}.\n *\n * @internal\n */\nexport function deduplicateSigners(\n signers: readonly TSigner[],\n): readonly TSigner[] {\n const deduplicated: Record = {};\n signers.forEach(signer => {\n if (!deduplicated[signer.address]) {\n deduplicated[signer.address] = signer;\n } else if (deduplicated[signer.address] !== signer) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, {\n address: signer.address,\n });\n }\n });\n return Object.values(deduplicated);\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction, TransactionWithinSizeLimit, TransactionWithLifetime } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link TransactionModifyingSigner#modifyAndSignTransactions | modifyAndSignTransactions} method.\n *\n * @see {@link BaseTransactionSignerConfig}\n */\nexport type TransactionModifyingSignerConfig = BaseTransactionSignerConfig;\n\n/**\n * A signer interface that potentially modifies the provided {@link Transaction | Transactions}\n * before signing them.\n *\n * For instance, this enables wallets to inject additional instructions into the\n * transaction before signing them. For each transaction, instead of returning a\n * {@link SignatureDictionary}, its\n * {@link TransactionModifyingSigner#modifyAndSignTransactions | modifyAndSignTransactions} function\n * returns an updated {@link Transaction} with a potentially modified set of instructions and\n * signature dictionary. The returned transaction must be within the transaction size limit,\n * and include a `lifetimeConstraint`.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: TransactionModifyingSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * modifyAndSignTransactions: async (\n * transactions: Transaction[]\n * ): Promise<(Transaction & TransactionWithinSizeLimit & TransactionWithLifetime)[]> => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Sequential**. Contrary to partial signers, these cannot be executed in\n * parallel as each call can modify the provided transactions.\n * - **First signers**. For a given transaction, a modifying signer must always\n * be used before a partial signer as the former will likely modify the\n * transaction and thus impact the outcome of the latter.\n * - **Potential conflicts**. If more than one modifying signer is provided,\n * the second signer may invalidate the signature of the first one. However,\n * modifying signers may decide not to modify a transaction based on the\n * existence of signatures for that transaction.\n *\n * @see {@link isTransactionModifyingSigner}\n * @see {@link assertIsTransactionModifyingSigner}\n */\nexport type TransactionModifyingSigner = Readonly<{\n address: Address;\n modifyAndSignTransactions(\n transactions: readonly (Transaction | (Transaction & TransactionWithLifetime))[],\n config?: TransactionModifyingSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link TransactionModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionModifyingSigner({ address, modifyAndSignTransactions: async () => {} }); // true\n * isTransactionModifyingSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionModifyingSigner}\n */\nexport function isTransactionModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionModifyingSigner {\n return 'modifyAndSignTransactions' in value && typeof value.modifyAndSignTransactions === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionModifyingSigner({ address, modifyAndSignTransactions: async () => {} }); // void\n * assertIsTransactionModifyingSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionModifyingSigner}\n */\nexport function assertIsTransactionModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionModifyingSigner {\n if (!isTransactionModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction, TransactionWithinSizeLimit, TransactionWithLifetime } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig, SignatureDictionary } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link TransactionPartialSigner#signTransactions | signTransactions} method.\n *\n * @see {@link BaseTransactionSignerConfig}\n */\nexport type TransactionPartialSignerConfig = BaseTransactionSignerConfig;\n\n/**\n * A signer interface that signs an array of {@link Transaction | Transactions}\n * without modifying their content. It defines a\n * {@link TransactionPartialSigner#signTransactions | signTransactions}\n * function that returns a {@link SignatureDictionary} for each provided transaction.\n *\n * Such signature dictionaries are expected to be merged with the existing ones if any.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: TransactionPartialSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * signTransactions: async (\n * transactions: Transaction[]\n * ): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Parallel**. It returns a signature dictionary for each provided\n * transaction without modifying them, making it possible for multiple\n * partial signers to sign the same transaction in parallel.\n * - **Flexible order**. The order in which we use these signers for\n * a given transaction doesn’t matter.\n *\n * @see {@link isTransactionPartialSigner}\n * @see {@link assertIsTransactionPartialSigner}\n */\nexport type TransactionPartialSigner = Readonly<{\n address: Address;\n signTransactions(\n transactions: readonly (Transaction & TransactionWithinSizeLimit & TransactionWithLifetime)[],\n config?: TransactionPartialSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link TransactionPartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionPartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionPartialSigner({ address, signTransactions: async () => {} }); // true\n * isTransactionPartialSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionPartialSigner}\n */\nexport function isTransactionPartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionPartialSigner {\n return 'signTransactions' in value && typeof value.signTransactions === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionPartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionPartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionPartialSigner({ address, signTransactions: async () => {} }); // void\n * assertIsTransactionPartialSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionPartialSigner}\n */\nexport function assertIsTransactionPartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionPartialSigner {\n if (!isTransactionPartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { Transaction, TransactionWithLifetime } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link TransactionSendingSignerConfig#signAndSendTransactions | signAndSendTransactions} method.\n *\n * @see {@link BaseTransactionSignerConfig}\n */\nexport type TransactionSendingSignerConfig = BaseTransactionSignerConfig;\n\n/**\n * A signer interface that signs one or multiple transactions\n * before sending them immediately to the blockchain.\n *\n * It defines a {@link TransactionSendingSignerConfig#signAndSendTransactions | signAndSendTransactions}\n * function that returns the transaction signature (i.e. its identifier) for each provided\n * {@link Transaction}.\n *\n * This interface is required for PDA wallets and other types of wallets that don't provide an\n * interface for signing transactions without sending them.\n *\n * Note that it is also possible for such signers to modify the provided transactions\n * before signing and sending them. This enables use cases where the modified transactions\n * cannot be shared with the app and thus must be sent directly.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const myTransactionSendingSigner: TransactionSendingSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * signAndSendTransactions: async (transactions: Transaction[]): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Single signer**. Since this signer also sends the provided transactions,\n * we can only use a single {@link TransactionSendingSigner} for a given set of transactions.\n * - **Last signer**. Trivially, that signer must also be the last one used.\n * - **Potential conflicts**. Since signers may decide to modify the given\n * transactions before sending them, they may invalidate previous signatures.\n * However, signers may decide not to modify a transaction based\n * on the existence of signatures for that transaction.\n * - **Potential confirmation**. Whilst this is not required by this interface,\n * it is also worth noting that most wallets will also wait for the transaction\n * to be confirmed (typically with a `confirmed` commitment)\n * before notifying the app that they are done.\n *\n * @see {@link isTransactionSendingSigner}\n * @see {@link assertIsTransactionSendingSigner}\n */\nexport type TransactionSendingSigner = Readonly<{\n address: Address;\n signAndSendTransactions(\n transactions: readonly (Transaction | (Transaction & TransactionWithLifetime))[],\n config?: TransactionSendingSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link TransactionSendingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionSendingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionSendingSigner({ address, signAndSendTransactions: async () => {} }); // true\n * isTransactionSendingSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionSendingSigner}\n */\nexport function isTransactionSendingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionSendingSigner {\n return 'signAndSendTransactions' in value && typeof value.signAndSendTransactions === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionSendingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionSendingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionSendingSigner({ address, signAndSendTransactions: async () => {} }); // void\n * assertIsTransactionSendingSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionSendingSigner}\n */\nexport function assertIsTransactionSendingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionSendingSigner {\n if (!isTransactionSendingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isTransactionModifyingSigner, TransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner, TransactionSendingSigner } from './transaction-sending-signer';\n\n/**\n * Defines a signer capable of signing transactions.\n *\n * @see {@link TransactionModifyingSigner} For signers that can modify transactions before signing them.\n * @see {@link TransactionPartialSigner} For signers that can be used in parallel.\n * @see {@link TransactionSendingSigner} For signers that send transactions after signing them.\n * @see {@link isTransactionSigner}\n * @see {@link assertIsTransactionSigner}\n */\nexport type TransactionSigner =\n | TransactionModifyingSigner\n | TransactionPartialSigner\n | TransactionSendingSigner;\n\n/**\n * Checks whether the provided value implements the {@link TransactionSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionSigner({ address, signTransactions: async () => {} }); // true\n * isTransactionSigner({ address, modifyAndSignTransactions: async () => {} }); // true\n * isTransactionSigner({ address, signAndSendTransactions: async () => {} }); // true\n * isTransactionSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionSigner}\n */\nexport function isTransactionSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionSigner {\n return (\n isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value)\n );\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionSigner({ address, signTransactions: async () => {} }); // void\n * assertIsTransactionSigner({ address, modifyAndSignTransactions: async () => {} }); // void\n * assertIsTransactionSigner({ address, signAndSendTransactions: async () => {} }); // void\n * assertIsTransactionSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionSigner}\n */\nexport function assertIsTransactionSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionSigner {\n if (!isTransactionSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { AccountLookupMeta, AccountMeta, AccountRole, Instruction } from '@solana/instructions';\nimport {\n BaseTransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionVersion,\n} from '@solana/transaction-messages';\n\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { TransactionMessageWithFeePayerSigner } from './fee-payer-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\n\n/**\n * An extension of the {@link AccountMeta} type that allows us to store {@link TransactionSigner | TransactionSigners} inside it.\n *\n * Note that, because this type represents a signer, it must use one the following two roles:\n * - {@link AccountRole.READONLY_SIGNER}\n * - {@link AccountRole.WRITABLE_SIGNER}\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for the {@link TransactionSigner} to use within the account meta.\n *\n * @interface\n *\n * @example\n * ```ts\n * import { AccountRole } from '@solana/instructions';\n * import { generateKeyPairSigner, AccountSignerMeta } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * const account: AccountSignerMeta = {\n * address: signer.address,\n * role: AccountRole.READONLY_SIGNER,\n * signer,\n * };\n * ```\n */\nexport interface AccountSignerMeta<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n> extends AccountMeta {\n readonly role: AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER;\n readonly signer: TSigner;\n}\n\n/**\n * A union type that supports base account metas as well as {@link AccountSignerMeta | signer account metas}.\n */\ntype AccountMetaWithSigner =\n | AccountLookupMeta\n | AccountMeta\n | AccountSignerMeta;\n\n/**\n * Composable type that allows {@link AccountSignerMeta | AccountSignerMetas} to be used inside the instruction's `accounts` array\n *\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n * @typeParam TAccounts - Optionally provide a narrower type for the account metas.\n *\n * @interface\n *\n * @example\n * ```ts\n * import { AccountRole, Instruction } from '@solana/instructions';\n * import { generateKeyPairSigner, InstructionWithSigners } from '@solana/signers';\n *\n * const [authority, buffer] = await Promise.all([\n * generateKeyPairSigner(),\n * generateKeyPairSigner(),\n * ]);\n * const instruction: Instruction & InstructionWithSigners = {\n * programAddress: address('1234..5678'),\n * accounts: [\n * // The authority is a signer account.\n * {\n * address: authority.address,\n * role: AccountRole.READONLY_SIGNER,\n * signer: authority,\n * },\n * // The buffer is a writable account.\n * { address: buffer.address, role: AccountRole.WRITABLE },\n * ],\n * };\n * ```\n */\nexport type InstructionWithSigners<\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly AccountMetaWithSigner[] = readonly AccountMetaWithSigner[],\n> = Pick, 'accounts'>;\n\n/**\n * A {@link BaseTransactionMessage} type extension that accept {@link TransactionSigner | TransactionSigners}.\n *\n * Namely, it allows:\n * - a {@link TransactionSigner} to be used as the fee payer and\n * - {@link InstructionWithSigners} to be used in its instructions.\n *\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n * @typeParam TAccounts - Optionally provide a narrower type for the account metas.\n *\n * @example\n * ```ts\n * import { Instruction } from '@solana/instructions';\n * import { BaseTransactionMessage } from '@solana/transaction-messages';\n * import { generateKeyPairSigner, InstructionWithSigners, TransactionMessageWithSigners } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * const firstInstruction: Instruction = { ... };\n * const secondInstruction: InstructionWithSigners = { ... };\n * const transactionMessage: BaseTransactionMessage & TransactionMessageWithSigners = {\n * feePayer: signer,\n * instructions: [firstInstruction, secondInstruction],\n * }\n * ```\n */\nexport type TransactionMessageWithSigners<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly AccountMetaWithSigner[] = readonly AccountMetaWithSigner[],\n> = Partial | TransactionMessageWithFeePayerSigner> &\n Pick<\n BaseTransactionMessage>,\n 'instructions'\n >;\n\n/**\n * Extracts and deduplicates all {@link TransactionSigner | TransactionSigners} stored\n * inside the account metas of an {@link InstructionWithSigners | instruction}.\n *\n * Any extracted signers that share the same {@link Address} will be de-duplicated.\n *\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n *\n * @example\n * ```ts\n * import { InstructionWithSigners, getSignersFromInstruction } from '@solana/signers';\n *\n * const signerA = { address: address('1111..1111'), signTransactions: async () => {} };\n * const signerB = { address: address('2222..2222'), signTransactions: async () => {} };\n * const instructionWithSigners: InstructionWithSigners = {\n * accounts: [\n * { address: signerA.address, signer: signerA, ... },\n * { address: signerB.address, signer: signerB, ... },\n * { address: signerA.address, signer: signerA, ... },\n * ],\n * };\n *\n * const instructionSigners = getSignersFromInstruction(instructionWithSigners);\n * // ^ [signerA, signerB]\n * ```\n */\nexport function getSignersFromInstruction(\n instruction: InstructionWithSigners,\n): readonly TSigner[] {\n return deduplicateSigners(\n (instruction.accounts ?? []).flatMap(account => ('signer' in account ? account.signer : [])),\n );\n}\n\n/**\n * Extracts and deduplicates all {@link TransactionSigner | TransactionSigners} stored\n * inside a given {@link TransactionMessageWithSigners | transaction message}.\n *\n * This includes any {@link TransactionSigner | TransactionSigners} stored\n * as the fee payer or in the instructions of the transaction message.\n *\n * Any extracted signers that share the same {@link Address} will be de-duplicated.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import { Instruction } from '@solana/instructions';\n * import { InstructionWithSigners, TransactionMessageWithSigners, getSignersFromTransactionMessage } from '@solana/signers';\n *\n * const signerA = { address: address('1111..1111'), signTransactions: async () => {} };\n * const signerB = { address: address('2222..2222'), signTransactions: async () => {} };\n * const firstInstruction: Instruction & InstructionWithSigners = {\n * programAddress: address('1234..5678'),\n * accounts: [{ address: signerA.address, signer: signerA, ... }],\n * };\n * const secondInstruction: Instruction & InstructionWithSigners = {\n * programAddress: address('1234..5678'),\n * accounts: [{ address: signerB.address, signer: signerB, ... }],\n * };\n * const transactionMessage: TransactionMessageWithSigners = {\n * feePayer: signerA,\n * instructions: [firstInstruction, secondInstruction],\n * }\n *\n * const transactionSigners = getSignersFromTransactionMessage(transactionMessage);\n * // ^ [signerA, signerB]\n * ```\n */\nexport function getSignersFromTransactionMessage<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n TTransactionMessage extends TransactionMessageWithSigners = TransactionMessageWithSigners<\n TAddress,\n TSigner\n >,\n>(transaction: TTransactionMessage): readonly TSigner[] {\n return deduplicateSigners([\n ...(transaction.feePayer && isTransactionSigner(transaction.feePayer) ? [transaction.feePayer as TSigner] : []),\n ...transaction.instructions.flatMap(getSignersFromInstruction),\n ]);\n}\n","import { Address } from '@solana/addresses';\nimport { Instruction, isSignerRole } from '@solana/instructions';\nimport { BaseTransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\nimport { AccountSignerMeta, InstructionWithSigners, TransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\n\n/**\n * Attaches the provided {@link TransactionSigner | TransactionSigners} to the\n * account metas of an instruction when applicable.\n *\n * For an account meta to match a provided signer it:\n * - Must have a signer role ({@link AccountRole.READONLY_SIGNER} or {@link AccountRole.WRITABLE_SIGNER}).\n * - Must have the same address as the provided signer.\n * - Must not have an attached signer already.\n *\n * @typeParam TInstruction - The inferred type of the instruction provided.\n *\n * @example\n * ```ts\n * import { AccountRole, Instruction } from '@solana/instructions';\n * import { addSignersToInstruction, TransactionSigner } from '@solana/signers';\n *\n * const instruction: Instruction = {\n * accounts: [\n * { address: '1111' as Address, role: AccountRole.READONLY_SIGNER },\n * { address: '2222' as Address, role: AccountRole.WRITABLE_SIGNER },\n * ],\n * // ...\n * };\n *\n * const signerA: TransactionSigner<'1111'>;\n * const signerB: TransactionSigner<'2222'>;\n * const instructionWithSigners = addSignersToInstruction(\n * [signerA, signerB],\n * instruction\n * );\n *\n * // instructionWithSigners.accounts[0].signer === signerA\n * // instructionWithSigners.accounts[1].signer === signerB\n * ```\n */\nexport function addSignersToInstruction(\n signers: TransactionSigner[],\n instruction: TInstruction | (InstructionWithSigners & TInstruction),\n): InstructionWithSigners & TInstruction {\n if (!instruction.accounts || instruction.accounts.length === 0) {\n return instruction as InstructionWithSigners & TInstruction;\n }\n\n const signerByAddress = new Map(deduplicateSigners(signers).map(signer => [signer.address, signer]));\n return Object.freeze({\n ...instruction,\n accounts: instruction.accounts.map(account => {\n const signer = signerByAddress.get(account.address);\n if (!isSignerRole(account.role) || 'signer' in account || !signer) {\n return account;\n }\n return Object.freeze({ ...account, signer } as AccountSignerMeta);\n }),\n });\n}\n\n/**\n * Attaches the provided {@link TransactionSigner | TransactionSigners} to the\n * account metas of all instructions inside a transaction message and/or\n * the transaction message fee payer, when applicable.\n *\n * For an account meta to match a provided signer it:\n * - Must have a signer role ({@link AccountRole.READONLY_SIGNER} or {@link AccountRole.WRITABLE_SIGNER}).\n * - Must have the same address as the provided signer.\n * - Must not have an attached signer already.\n *\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import { AccountRole, Instruction } from '@solana/instructions';\n * import { BaseTransactionMessage } from '@solana/transaction-messages';\n * import { addSignersToTransactionMessage, TransactionSigner } from '@solana/signers';\n *\n * const instructionA: Instruction = {\n * accounts: [{ address: '1111' as Address, role: AccountRole.READONLY_SIGNER }],\n * // ...\n * };\n * const instructionB: Instruction = {\n * accounts: [{ address: '2222' as Address, role: AccountRole.WRITABLE_SIGNER }],\n * // ...\n * };\n * const transactionMessage: BaseTransactionMessage = {\n * instructions: [instructionA, instructionB],\n * // ...\n * }\n *\n * const signerA: TransactionSigner<'1111'>;\n * const signerB: TransactionSigner<'2222'>;\n * const transactionMessageWithSigners = addSignersToTransactionMessage(\n * [signerA, signerB],\n * transactionMessage\n * );\n *\n * // transactionMessageWithSigners.instructions[0].accounts[0].signer === signerA\n * // transactionMessageWithSigners.instructions[1].accounts[0].signer === signerB\n * ```\n */\nexport function addSignersToTransactionMessage(\n signers: TransactionSigner[],\n transactionMessage: TTransactionMessage | (TransactionMessageWithSigners & TTransactionMessage),\n): TransactionMessageWithSigners & TTransactionMessage {\n const feePayerSigner = hasAddressOnlyFeePayer(transactionMessage)\n ? signers.find(signer => signer.address === transactionMessage.feePayer.address)\n : undefined;\n\n if (!feePayerSigner && transactionMessage.instructions.length === 0) {\n return transactionMessage as TransactionMessageWithSigners & TTransactionMessage;\n }\n\n return Object.freeze({\n ...transactionMessage,\n ...(feePayerSigner ? { feePayer: feePayerSigner } : null),\n instructions: transactionMessage.instructions.map(instruction => addSignersToInstruction(signers, instruction)),\n });\n}\n\nfunction hasAddressOnlyFeePayer(\n message: BaseTransactionMessage & Partial,\n): message is BaseTransactionMessage & { feePayer: { address: Address } } {\n return (\n !!message &&\n 'feePayer' in message &&\n !!message.feePayer &&\n typeof message.feePayer.address === 'string' &&\n !isTransactionSigner(message.feePayer)\n );\n}\n","import { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\nimport { TransactionSigner } from './transaction-signer';\n\n/**\n * Alternative to {@link TransactionMessageWithFeePayer} that uses a {@link TransactionSigner} for the fee payer.\n *\n * @typeParam TAddress - Supply a string literal to define a fee payer having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for the {@link TransactionSigner}.\n *\n * @example\n * ```ts\n * import { TransactionMessage } from '@solana/transaction-messages';\n * import { generateKeyPairSigner, TransactionMessageWithFeePayerSigner } from '@solana/signers';\n *\n * const transactionMessage: TransactionMessage & TransactionMessageWithFeePayerSigner = {\n * feePayer: await generateKeyPairSigner(),\n * instructions: [],\n * version: 0,\n * };\n * ```\n */\nexport interface TransactionMessageWithFeePayerSigner<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n> {\n readonly feePayer: TSigner;\n}\n\n/**\n * A helper type to exclude the fee payer from a transaction message.\n */\ntype ExcludeTransactionMessageFeePayer =\n TTransactionMessage extends unknown ? Omit : never;\n\n/**\n * Sets the fee payer of a {@link TransactionMessage | transaction message}\n * using a {@link TransactionSigner}.\n *\n * @typeParam TFeePayerAddress - Supply a string literal to define a fee payer having a particular address.\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import { pipe } from '@solana/functional';\n * import { generateKeyPairSigner, setTransactionMessageFeePayerSigner } from '@solana/signers';\n * import { createTransactionMessage } from '@solana/transaction-messages';\n *\n * const feePayer = await generateKeyPairSigner();\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 0 }),\n * message => setTransactionMessageFeePayerSigner(signer, message),\n * );\n * ```\n */\nexport function setTransactionMessageFeePayerSigner<\n TFeePayerAddress extends string,\n TTransactionMessage extends Partial &\n TransactionMessage,\n>(\n feePayer: TransactionSigner,\n transactionMessage: TTransactionMessage,\n): ExcludeTransactionMessageFeePayer & TransactionMessageWithFeePayerSigner {\n Object.freeze(feePayer);\n const out = { ...transactionMessage, feePayer };\n Object.freeze(out);\n return out as ExcludeTransactionMessageFeePayer &\n TransactionMessageWithFeePayerSigner;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig, SignatureDictionary } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link MessagePartialSigner#signMessages | signMessages} method.\n *\n * @see {@link BaseSignerConfig}\n */\nexport type MessagePartialSignerConfig = BaseSignerConfig;\n\n/**\n * A signer interface that signs an array of {@link SignableMessage | SignableMessages}\n * without modifying their content.\n *\n * It defines a {@link MessagePartialSigner#signMessages | signMessages} function\n * that returns a {@link SignatureDictionary} for each provided message.\n * Such signature dictionaries are expected to be merged with the existing ones if any.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: MessagePartialSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * signMessages: async (\n * messages: SignableMessage[]\n * ): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Parallel**. When multiple signers sign the same message, we can\n * perform this operation in parallel to obtain all their signatures.\n * - **Flexible order**. The order in which we use these signers\n * for a given message doesn’t matter.\n *\n * @see {@link SignableMessage}\n * @see {@link createSignableMessage}\n * @see {@link isMessagePartialSigner}\n * @see {@link assertIsMessagePartialSigner}\n */\nexport type MessagePartialSigner = Readonly<{\n address: Address;\n signMessages(\n messages: readonly SignableMessage[],\n config?: MessagePartialSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link MessagePartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isMessagePartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isMessagePartialSigner({ address, signMessages: async () => {} }); // true\n * isMessagePartialSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsMessagePartialSigner}\n */\nexport function isMessagePartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is MessagePartialSigner {\n return 'signMessages' in value && typeof value.signMessages === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link MessagePartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsMessagePartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsMessagePartialSigner({ address, signMessages: async () => {} }); // void\n * assertIsMessagePartialSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isMessagePartialSigner}\n */\nexport function assertIsMessagePartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is MessagePartialSigner {\n if (!isMessagePartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SolanaError } from '@solana/errors';\nimport { createKeyPairFromBytes, createKeyPairFromPrivateKeyBytes, generateKeyPair, signBytes } from '@solana/keys';\nimport { partiallySignTransaction } from '@solana/transactions';\n\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\n\n/**\n * Defines a signer that uses a {@link CryptoKeyPair} to sign messages and transactions.\n *\n * It implements both the {@link MessagePartialSigner} and {@link TransactionPartialSigner}\n * interfaces and keeps track of the {@link CryptoKeyPair} instance used\n * to sign messages and transactions.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner } from '@solana/signers';\n *\n * const signer = generateKeyPairSigner();\n * signer.address; // Address;\n * signer.keyPair; // CryptoKeyPair;\n * const [messageSignatures] = await signer.signMessages([message]);\n * const [transactionSignatures] = await signer.signTransactions([transaction]);\n * ```\n *\n * @see {@link generateKeyPairSigner}\n * @see {@link createSignerFromKeyPair}\n * @see {@link createKeyPairSignerFromBytes}\n * @see {@link createKeyPairSignerFromPrivateKeyBytes}\n * @see {@link isKeyPairSigner}\n * @see {@link assertIsKeyPairSigner}\n */\nexport type KeyPairSigner = MessagePartialSigner &\n TransactionPartialSigner & { keyPair: CryptoKeyPair };\n\n/**\n * Checks whether the provided value implements the {@link KeyPairSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner, isKeyPairSigner } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * isKeyPairSigner(signer); // true\n * isKeyPairSigner({ address: address('1234..5678') }); // false\n * ```\n */\nexport function isKeyPairSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is KeyPairSigner {\n return (\n 'keyPair' in value &&\n typeof value.keyPair === 'object' &&\n isMessagePartialSigner(value) &&\n isTransactionPartialSigner(value)\n );\n}\n\n/**\n * Asserts that the provided value implements the {@link KeyPairSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner, assertIsKeyPairSigner } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * assertIsKeyPairSigner(signer); // void\n * assertIsKeyPairSigner({ address: address('1234..5678') }); // Throws an error.\n * ```\n */\nexport function assertIsKeyPairSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is KeyPairSigner {\n if (!isKeyPairSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, {\n address: value.address,\n });\n }\n}\n\n/**\n * Creates a {@link KeyPairSigner} from a provided {@link CryptoKeyPair}.\n *\n * The {@link MessagePartialSigner#signMessages | signMessages} and\n * {@link TransactionPartialSigner#signTransactions | signTransactions}\n * functions of the returned signer will use the private key of the provided\n * key pair to sign messages and transactions.\n *\n * Note that both the {@link MessagePartialSigner#signMessages | signMessages} and\n * {@link TransactionPartialSigner#signTransactions | signTransactions} implementations\n * are parallelized, meaning that they will sign all provided messages and transactions in parallel.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { createSignerFromKeyPair, KeyPairSigner } from '@solana/signers';\n *\n * const keyPair: CryptoKeyPair = await generateKeyPair();\n * const signer: KeyPairSigner = await createSignerFromKeyPair(keyPair);\n * ```\n */\nexport async function createSignerFromKeyPair(keyPair: CryptoKeyPair): Promise {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n const out: KeyPairSigner = {\n address,\n keyPair,\n signMessages: messages =>\n Promise.all(\n messages.map(async message =>\n Object.freeze({ [address]: await signBytes(keyPair.privateKey, message.content) }),\n ),\n ),\n signTransactions: transactions =>\n Promise.all(\n transactions.map(async transaction => {\n const signedTransaction = await partiallySignTransaction([keyPair], transaction);\n // we know that the address has signed `signedTransaction` because it comes from the keypair\n return Object.freeze({ [address]: signedTransaction.signatures[address]! });\n }),\n ),\n };\n\n return Object.freeze(out);\n}\n\n/**\n * Generates a signer capable of signing messages and transactions by generating\n * a {@link CryptoKeyPair} and creating a {@link KeyPairSigner} from it.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * ```\n *\n * @see {@link createSignerFromKeyPair}\n */\nexport async function generateKeyPairSigner(): Promise {\n return await createSignerFromKeyPair(await generateKeyPair());\n}\n\n/**\n * Creates a new {@link KeyPairSigner} from a 64-bytes `Uint8Array` secret key (private key and public key).\n *\n * @example\n * ```ts\n * import fs from 'fs';\n * import { createKeyPairSignerFromBytes } from '@solana/signers';\n *\n * // Get bytes from local keypair file.\n * const keypairFile = fs.readFileSync('~/.config/solana/id.json');\n * const keypairBytes = new Uint8Array(JSON.parse(keypairFile.toString()));\n *\n * // Create a KeyPairSigner from the bytes.\n * const signer = await createKeyPairSignerFromBytes(keypairBytes);\n * ```\n *\n * @see {@link createKeyPairSignerFromPrivateKeyBytes} if you only have the 32-bytes private key instead.\n */\nexport async function createKeyPairSignerFromBytes(\n bytes: ReadonlyUint8Array,\n extractable?: boolean,\n): Promise {\n return await createSignerFromKeyPair(await createKeyPairFromBytes(bytes, extractable));\n}\n\n/**\n * Creates a new {@link KeyPairSigner} from a 32-bytes `Uint8Array` private key.\n *\n * @example\n * ```ts\n * import { getUtf8Encoder } from '@solana/codecs-strings';\n * import { createKeyPairSignerFromPrivateKeyBytes } from '@solana/signers';\n *\n * const message = getUtf8Encoder().encode('Hello, World!');\n * const seed = new Uint8Array(await crypto.subtle.digest('SHA-256', message));\n *\n * const derivedSigner = await createKeyPairSignerFromPrivateKeyBytes(seed);\n * ```\n *\n * @see {@link createKeyPairSignerFromBytes} if you have the 64-bytes secret key instead (private key and public key).\n */\nexport async function createKeyPairSignerFromPrivateKeyBytes(\n bytes: ReadonlyUint8Array,\n extractable?: boolean,\n): Promise {\n return await createSignerFromKeyPair(await createKeyPairFromPrivateKeyBytes(bytes, extractable));\n}\n","import { Address, isAddress } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link MessageModifyingSigner#modifyAndSignMessages | modifyAndSignMessages} method.\n *\n * @see {@link BaseSignerConfig}\n */\nexport type MessageModifyingSignerConfig = BaseSignerConfig;\n\n/**\n * A signer interface that _potentially_ modifies the content\n * of the provided {@link SignableMessage | SignableMessages} before signing them.\n *\n * For instance, this enables wallets to prefix or suffix nonces to the messages they sign.\n * For each message, instead of returning a {@link SignatureDictionary}, the\n * {@link MessageModifyingSigner#modifyAndSignMessages | modifyAndSignMessages} function\n * returns an updated {@link SignableMessage} with a potentially modified content and signature dictionary.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: MessageModifyingSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * modifyAndSignMessages: async (\n * messages: SignableMessage[]\n * ): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Sequential**. Contrary to partial signers, these cannot be executed in\n * parallel as each call can modify the content of the message.\n * - **First signers**. For a given message, a modifying signer must always be used\n * before a partial signer as the former will likely modify the message and\n * thus impact the outcome of the latter.\n * - **Potential conflicts**. If more than one modifying signer is provided, the second\n * signer may invalidate the signature of the first one. However, modifying signers\n * may decide not to modify a message based on the existence of signatures for that message.\n *\n * @see {@link SignableMessage}\n * @see {@link createSignableMessage}\n * @see {@link isMessageModifyingSigner}\n * @see {@link assertIsMessageModifyingSigner}\n */\nexport type MessageModifyingSigner = Readonly<{\n address: Address;\n modifyAndSignMessages(\n messages: readonly SignableMessage[],\n config?: MessageModifyingSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link MessageModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isMessageModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isMessageModifyingSigner({ address, modifyAndSignMessages: async () => {} }); // true\n * isMessageModifyingSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsMessageModifyingSigner}\n */\nexport function isMessageModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is MessageModifyingSigner {\n return (\n isAddress(value.address) &&\n 'modifyAndSignMessages' in value &&\n typeof value.modifyAndSignMessages === 'function'\n );\n}\n\n/**\n * Asserts that the provided value implements the {@link MessageModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsMessageModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsMessageModifyingSigner({ address, modifyAndSignMessages: async () => {} }); // void\n * assertIsMessageModifyingSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isMessageModifyingSigner}\n */\nexport function assertIsMessageModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is MessageModifyingSigner {\n if (!isMessageModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isMessageModifyingSigner, MessageModifyingSigner } from './message-modifying-signer';\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\n\n/**\n * Defines a signer capable of signing messages.\n *\n * @see {@link MessageModifyingSigner} For signers that can modify messages before signing them.\n * @see {@link MessagePartialSigner} For signers that can be used in parallel.\n * @see {@link isMessageSigner}\n * @see {@link assertIsMessageSigner}\n */\nexport type MessageSigner =\n | MessageModifyingSigner\n | MessagePartialSigner;\n\n/**\n * Checks whether the provided value implements the {@link MessageSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isMessageSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isMessageSigner({ address, signMessages: async () => {} }); // true\n * isMessageSigner({ address, modifyAndSignMessages: async () => {} }); // true\n * isMessageSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsMessageSigner}\n */\nexport function isMessageSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is MessageSigner {\n return isMessagePartialSigner(value) || isMessageModifyingSigner(value);\n}\n\n/**\n * Asserts that the provided value implements the {@link MessageSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsMessageSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsMessageSigner({ address, signMessages: async () => {} }); // void\n * assertIsMessageSigner({ address, modifyAndSignMessages: async () => {} }); // void\n * assertIsMessageSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isMessageSigner}\n */\nexport function assertIsMessageSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is MessageSigner {\n if (!isMessageSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\n\nimport { MessagePartialSigner } from './message-partial-signer';\nimport { TransactionPartialSigner } from './transaction-partial-signer';\n\n/**\n * Defines a Noop (No-Operation) signer that pretends to partially sign messages and transactions.\n *\n * For a given {@link Address}, a Noop Signer can be created to offer an implementation of both\n * the {@link MessagePartialSigner} and {@link TransactionPartialSigner} interfaces such that\n * they do not sign anything. Namely, signing a transaction or a message with a `NoopSigner`\n * will return an empty `SignatureDictionary`.\n *\n * @typeParam TAddress - Supply a string literal to define a Noop signer having a particular address.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { createNoopSigner } from '@solana/signers';\n *\n * const signer = createNoopSigner(address('1234..5678'));\n * const [messageSignatures] = await signer.signMessages([message]);\n * const [transactionSignatures] = await signer.signTransactions([transaction]);\n * // ^ Both messageSignatures and transactionSignatures are empty.\n * ```\n *\n * @remarks\n * This signer may be useful:\n *\n * - For testing purposes.\n * - For indicating that a given account is a signer and taking the responsibility to provide\n * the signature for that account ourselves. For instance, if we need to send the transaction\n * to a server that will sign it and send it for us.\n *\n * @see {@link createNoopSigner}\n */\nexport type NoopSigner = MessagePartialSigner &\n TransactionPartialSigner;\n\n/**\n * Creates a {@link NoopSigner} from the provided {@link Address}.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { createNoopSigner } from '@solana/signers';\n *\n * const signer = createNoopSigner(address('1234..5678'));\n * ```\n */\nexport function createNoopSigner(address: Address): NoopSigner {\n const out: NoopSigner = {\n address,\n signMessages: messages => Promise.resolve(messages.map(() => Object.freeze({}))),\n signTransactions: transactions => Promise.resolve(transactions.map(() => Object.freeze({}))),\n };\n\n return Object.freeze(out);\n}\n","import { OffchainMessageWithRequiredSignatories } from '@solana/offchain-messages';\n\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { isMessageSigner, MessageSigner } from './message-signer';\n\n/**\n * Represents a {@link Signer} that is required to sign an offchain message for it to be valid.\n */\nexport type OffchainMessageSignatorySigner = MessageSigner;\n\n/**\n * Extracts and deduplicates all {@link MessageSigner | MessageSigners} stored inside a given\n * {@link OffchainMessageWithSigners | offchain message}.\n *\n * Any extracted signers that share the same {@link Address} will be de-duplicated.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for {@link MessageSigner | MessageSigners}.\n * @typeParam TOffchainMessage - The inferred type of the offchain message provided.\n *\n * @example\n * ```ts\n * import { OffchainMessageWithSigners, getSignersFromOffchainMessage } from '@solana/signers';\n *\n * const signerA = { address: address('1111..1111'), signMessages: async () => {} };\n * const signerB = { address: address('2222..2222'), modifyAndSignMessages: async () => {} };\n * const OffchainMessage: OffchainMessageWithSigners = {\n * /* ... *\\/\n * requiredSignatories: [signerA, signerB],\n * };\n *\n * const messageSigners = getSignersFromOffchainMessage(offchainMessage);\n * // ^ [signerA, signerB]\n * ```\n */\nexport function getSignersFromOffchainMessage({\n requiredSignatories,\n}: OffchainMessageWithRequiredSignatories): readonly MessageSigner[] {\n const messageSigners = requiredSignatories.filter(isMessageSigner);\n return deduplicateSigners(messageSigners);\n}\n","import {\n assertIsFullySignedOffchainMessageEnvelope,\n compileOffchainMessageEnvelope,\n FullySignedOffchainMessageEnvelope,\n OffchainMessage,\n OffchainMessageEnvelope,\n OffchainMessageSignatory,\n OffchainMessageWithRequiredSignatories,\n} from '@solana/offchain-messages';\n\nimport {\n isMessageModifyingSigner,\n MessageModifyingSigner,\n MessageModifyingSignerConfig,\n} from './message-modifying-signer';\nimport { isMessagePartialSigner, MessagePartialSigner, MessagePartialSignerConfig } from './message-partial-signer';\nimport { MessageSigner } from './message-signer';\nimport { getSignersFromOffchainMessage, OffchainMessageSignatorySigner } from './offchain-message-signer';\nimport { SignableMessage } from './signable-message';\n\n/**\n * Extracts all {@link MessageSigner | MessageSigners} inside the provided offchain message and uses\n * them to return a signed offchain message envelope.\n *\n * It first uses all {@link MessageModifyingSigner | MessageModifyingSigners} sequentially before\n * using all {@link MessagePartialSigner | MessagePartialSigners} in parallel.\n *\n * If a composite signer implements both interfaces, it will be used as a\n * {@link MessageModifyingSigner} if no other signer implements that interface. Otherwise, it will\n * be used as a {@link MessagePartialSigner}.\n *\n * @example\n * ```ts\n * const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage);\n * ```\n *\n * It also accepts an optional {@link AbortSignal} that will be propagated to all signers.\n *\n * ```ts\n * const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage, {\n * abortSignal: myAbortController.signal,\n * });\n * ```\n *\n * @see {@link signOffchainMessageWithSigners}\n */\nexport async function partiallySignOffchainMessageWithSigners(\n offchainMessage: OffchainMessageWithRequiredSignatories &\n Omit,\n config?: MessagePartialSignerConfig,\n): Promise {\n const { partialSigners, modifyingSigners } = categorizeMessageSigners(\n getSignersFromOffchainMessage(offchainMessage),\n );\n return await signModifyingAndPartialMessageSigners(offchainMessage, modifyingSigners, partialSigners, config);\n}\n\n/**\n * Extracts all {@link MessageSigner | MessageSigners} inside the provided offchain message and uses\n * them to return a signed offchain message envelope before asserting that all signatures required\n * by the message are present.\n *\n * This function delegates to the {@link partiallySignOffchainMessageWithSigners} function\n * in order to extract signers from the offchain message and sign it.\n *\n * @example\n * ```ts\n * const mySignedOffchainMessageEnvelope = await signOffchainMessageWithSigners(myOffchainMessage);\n *\n * // With additional config.\n * const mySignedOffchainMessageEnvelope = await signOffchainMessageWithSigners(myOffchainMessage, {\n * abortSignal: myAbortController.signal,\n * });\n *\n * // We now know the offchain message is fully signed.\n * mySignedOffchainMessageEnvelope satisfies FullySignedOffchainMessageEnvelope;\n * ```\n *\n * @see {@link partiallySignOffchainMessageWithSigners}\n */\nexport async function signOffchainMessageWithSigners(\n offchainMessage: OffchainMessageWithRequiredSignatories &\n Omit,\n config?: MessagePartialSignerConfig,\n): Promise {\n const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage, config);\n assertIsFullySignedOffchainMessageEnvelope(signedOffchainMessageEnvelope);\n return signedOffchainMessageEnvelope;\n}\n\n/**\n * Identifies each provided {@link MessageSigner} and categorizes them into their respective types.\n * When a signer implements multiple interfaces, it will try to used to most powerful interface but\n * fall back to the least powerful interface when necessary.\n *\n * For instance, if a signer implements {@link MessageSigner} and {@link MessageModifyingSigner},\n * it will be categorized as a `MessageModifyingSigner`.\n */\nfunction categorizeMessageSigners(signers: readonly MessageSigner[]): Readonly<{\n modifyingSigners: readonly MessageModifyingSigner[];\n partialSigners: readonly MessagePartialSigner[];\n}> {\n // Identify the modifying signers from the other signers.\n const modifyingSigners = identifyMessageModifyingSigners(signers);\n\n // Use any remaining signers as partial signers.\n const partialSigners = signers\n .filter(isMessagePartialSigner)\n .filter(signer => !(modifyingSigners as typeof signers).includes(signer));\n\n return Object.freeze({ modifyingSigners, partialSigners });\n}\n\n/** Identifies the best signers to use as MessageModifyingSigners, if any */\nfunction identifyMessageModifyingSigners(\n signers: readonly (MessageModifyingSigner | MessagePartialSigner)[],\n): readonly MessageModifyingSigner[] {\n // Ensure there are any MessageModifyingSigner in the first place.\n const modifyingSigners = signers.filter(isMessageModifyingSigner);\n if (modifyingSigners.length === 0) return [];\n\n // Prefer modifying signers that do not offer partial signing.\n const nonPartialSigners = modifyingSigners.filter(signer => !isMessagePartialSigner(signer));\n if (nonPartialSigners.length > 0) return nonPartialSigners;\n\n // Otherwise, choose only one modifying signer (whichever).\n return [modifyingSigners[0]];\n}\n\n/**\n * Signs an offchain message using the provided\n * {@link MessageModifyingSigner | MessageModifyingSigners} sequentially followed by the\n * {@link MessagePartialSigner | MessagePartialSigners} in parallel.\n */\nasync function signModifyingAndPartialMessageSigners(\n offchainMessage: OffchainMessageWithRequiredSignatories &\n Omit,\n modifyingSigners: readonly MessageModifyingSigner[] = [],\n partialSigners: readonly MessagePartialSigner[] = [],\n config?: MessageModifyingSignerConfig,\n): Promise {\n // @ts-expect-error SignableMessage should probably specify `ReadonlyUint8Array` here.\n const offchainMessageEnvelope: SignableMessage = compileOffchainMessageEnvelope(offchainMessage);\n\n // Handle modifying signers sequentially.\n const modifiedOffchainMessage = await modifyingSigners.reduce(async (offchainMessageEnvelope, modifyingSigner) => {\n config?.abortSignal?.throwIfAborted();\n const [message] = await modifyingSigner.modifyAndSignMessages([await offchainMessageEnvelope], config);\n return Object.freeze(message);\n }, Promise.resolve(offchainMessageEnvelope));\n\n // Handle partial signers in parallel.\n config?.abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signMessages([modifiedOffchainMessage], config);\n return signatures;\n }),\n );\n\n // @ts-expect-error SignableMessage should probably specify `ReadonlyUint8Array` here.\n return Object.freeze({\n ...modifiedOffchainMessage,\n signatures: Object.freeze(\n signatureDictionaries.reduce((signatures, signatureDictionary) => {\n return { ...signatures, ...signatureDictionary };\n }, modifiedOffchainMessage.signatures ?? {}),\n ),\n } as OffchainMessageEnvelope);\n}\n","import {\n SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS,\n SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\nimport { BaseTransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\nimport { getSignersFromTransactionMessage, TransactionMessageWithSigners } from './account-signer-meta';\nimport { isTransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner } from './transaction-sending-signer';\n\n/**\n * Defines a transaction message with exactly one {@link TransactionSendingSigner}.\n *\n * This type is used to narrow the type of transaction messages that have been\n * checked to have exactly one sending signer.\n *\n * @example\n * ```ts\n * import { assertIsTransactionMessageWithSingleSendingSigner } from '@solana/signers';\n *\n * assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);\n * transactionMessage satisfies TransactionMessageWithSingleSendingSigner;\n * ```\n *\n * @see {@link isTransactionMessageWithSingleSendingSigner}\n * @see {@link assertIsTransactionMessageWithSingleSendingSigner}\n */\nexport type TransactionMessageWithSingleSendingSigner = Brand<\n TransactionMessageWithSigners,\n 'TransactionMessageWithSingleSendingSigner'\n>;\n\n/**\n * Checks whether the provided transaction has exactly one {@link TransactionSendingSigner}.\n *\n * This can be useful when using {@link signAndSendTransactionMessageWithSigners} to provide\n * a fallback strategy in case the transaction message cannot be send using this function.\n *\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import {\n * isTransactionMessageWithSingleSendingSigner,\n * signAndSendTransactionMessageWithSigners,\n * signTransactionMessageWithSigners,\n * } from '@solana/signers';\n * import { getBase64EncodedWireTransaction } from '@solana/transactions';\n *\n * let transactionSignature: SignatureBytes;\n * if (isTransactionMessageWithSingleSendingSigner(transactionMessage)) {\n * transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage);\n * } else {\n * const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);\n * const encodedTransaction = getBase64EncodedWireTransaction(signedTransaction);\n * transactionSignature = await rpc.sendTransaction(encodedTransaction).send();\n * }\n * ```\n *\n * @see {@link signAndSendTransactionMessageWithSigners}\n * @see {@link assertIsTransactionMessageWithSingleSendingSigner}\n */\nexport function isTransactionMessageWithSingleSendingSigner<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(transaction: TTransactionMessage): transaction is TransactionMessageWithSingleSendingSigner & TTransactionMessage {\n try {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Asserts that the provided transaction message has exactly one {@link TransactionSendingSigner}.\n *\n * This can be useful when using the {@link signAndSendTransactionMessageWithSigners} function\n * to ensure it will be able to select the correct signer to send the transaction.\n *\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import {\n * assertIsTransactionMessageWithSingleSendingSigner,\n * signAndSendTransactionMessageWithSigners\n * } from '@solana/signers';\n *\n * assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);\n * const transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage);\n * ```\n *\n * @see {@link signAndSendTransactionMessageWithSigners}\n * @see {@link isTransactionMessageWithSingleSendingSigner}\n */\nexport function assertIsTransactionMessageWithSingleSendingSigner<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(\n transaction: TTransactionMessage,\n): asserts transaction is TransactionMessageWithSingleSendingSigner & TTransactionMessage {\n const signers = getSignersFromTransactionMessage(transaction);\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n\n if (sendingSigners.length === 0) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n // When identifying if there are multiple sending signers, we only need to check for\n // sending signers that do not implement other transaction signer interfaces as\n // they will be used as these other signer interfaces in case of a conflict.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionPartialSigner(signer) && !isTransactionModifyingSigner(signer),\n );\n\n if (sendingOnlySigners.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS);\n }\n}\n","import { SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { BaseTransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\nimport {\n assertIsFullySignedTransaction,\n compileTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithinSizeLimit,\n TransactionWithLifetime,\n} from '@solana/transactions';\n\nimport { getSignersFromTransactionMessage, TransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport {\n isTransactionModifyingSigner,\n TransactionModifyingSigner,\n TransactionModifyingSignerConfig,\n} from './transaction-modifying-signer';\nimport {\n isTransactionPartialSigner,\n TransactionPartialSigner,\n TransactionPartialSignerConfig,\n} from './transaction-partial-signer';\nimport {\n isTransactionSendingSigner,\n TransactionSendingSigner,\n TransactionSendingSignerConfig,\n} from './transaction-sending-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\nimport { assertIsTransactionMessageWithSingleSendingSigner } from './transaction-with-single-sending-signer';\n\n/**\n * Extracts all {@link TransactionSigner | TransactionSigners} inside the provided\n * transaction message and uses them to return a signed transaction.\n *\n * It first uses all {@link TransactionModifyingSigner | TransactionModifyingSigners} sequentially before\n * using all {@link TransactionPartialSigner | TransactionPartialSigners} in parallel.\n *\n * If a composite signer implements both interfaces, it will be used as a\n * {@link TransactionModifyingSigner} if no other signer implements that interface.\n * Otherwise, it will be used as a {@link TransactionPartialSigner}.\n *\n * @example\n * ```ts\n * const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage);\n * ```\n *\n * It also accepts an optional {@link AbortSignal} that will be propagated to all signers.\n *\n * ```ts\n * const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, {\n * abortSignal: myAbortController.signal,\n * });\n * ```\n *\n * @remarks\n * Finally, note that this function ignores {@link TransactionSendingSigner | TransactionSendingSigners}\n * as it does not send the transaction. Check out the {@link signAndSendTransactionMessageWithSigners}\n * function for more details on how to use sending signers.\n *\n * @see {@link signTransactionMessageWithSigners}\n * @see {@link signAndSendTransactionMessageWithSigners}\n */\nexport async function partiallySignTransactionMessageWithSigners(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n config?: TransactionPartialSignerConfig,\n): Promise {\n const { partialSigners, modifyingSigners } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transactionMessage).filter(isTransactionSigner)),\n { identifySendingSigner: false },\n );\n\n return await signModifyingAndPartialTransactionSigners(\n transactionMessage,\n modifyingSigners,\n partialSigners,\n config,\n );\n}\n\n/**\n * Extracts all {@link TransactionSigner | TransactionSigners} inside the provided\n * transaction message and uses them to return a signed transaction before asserting\n * that all signatures required by the transaction are present.\n *\n * This function delegates to the {@link partiallySignTransactionMessageWithSigners} function\n * in order to extract signers from the transaction message and sign the transaction.\n *\n * @example\n * ```ts\n * const mySignedTransaction = await signTransactionMessageWithSigners(myTransactionMessage);\n *\n * // With additional config.\n * const mySignedTransaction = await signTransactionMessageWithSigners(myTransactionMessage, {\n * abortSignal: myAbortController.signal,\n * });\n *\n * // We now know the transaction is fully signed.\n * mySignedTransaction satisfies FullySignedTransaction;\n * ```\n *\n * @see {@link partiallySignTransactionMessageWithSigners}\n * @see {@link signAndSendTransactionMessageWithSigners}\n */\nexport async function signTransactionMessageWithSigners(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n config?: TransactionPartialSignerConfig,\n): Promise {\n const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, config);\n assertIsFullySignedTransaction(signedTransaction);\n return signedTransaction;\n}\n\n/**\n * Extracts all {@link TransactionSigner | TransactionSigners} inside the provided\n * transaction message and uses them to sign it before sending it immediately to the blockchain.\n *\n * It returns the signature of the sent transaction (i.e. its identifier) as bytes.\n *\n * @example\n * ```ts\n * import { signAndSendTransactionMessageWithSigners } from '@solana/signers';\n *\n * const transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage);\n *\n * // With additional config.\n * const transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage, {\n * abortSignal: myAbortController.signal,\n * });\n * ```\n *\n * @remarks\n * Similarly to the {@link partiallySignTransactionMessageWithSigners} function, it first uses all\n * {@link TransactionModifyingSigner | TransactionModifyingSigners} sequentially before using all\n * {@link TransactionPartialSigner | TransactionPartialSigners} in parallel.\n * It then sends the transaction using the {@link TransactionSendingSigner} it identified.\n *\n * Composite transaction signers are treated such that at least one sending signer is used if any.\n * When a {@link TransactionSigner} implements more than one interface, we use it as a:\n *\n * - {@link TransactionSendingSigner}, if no other {@link TransactionSendingSigner} exists.\n * - {@link TransactionModifyingSigner}, if no other {@link TransactionModifyingSigner} exists.\n * - {@link TransactionPartialSigner}, otherwise.\n *\n * The provided transaction must contain exactly one {@link TransactionSendingSigner} inside its account metas.\n * If more than one composite signers implement the {@link TransactionSendingSigner} interface,\n * one of them will be selected as the sending signer. Otherwise, if multiple\n * {@link TransactionSendingSigner | TransactionSendingSigners} must be selected, the function will throw an error.\n *\n * If you'd like to assert that a transaction makes use of exactly one {@link TransactionSendingSigner}\n * _before_ calling this function, you may use the {@link assertIsTransactionMessageWithSingleSendingSigner} function.\n *\n * Alternatively, you may use the {@link isTransactionMessageWithSingleSendingSigner} function to provide a\n * fallback in case the transaction does not contain any sending signer.\n *\n * @see {@link assertIsTransactionMessageWithSingleSendingSigner}\n * @see {@link isTransactionMessageWithSingleSendingSigner}\n * @see {@link partiallySignTransactionMessageWithSigners}\n * @see {@link signTransactionMessageWithSigners}\n *\n */\nexport async function signAndSendTransactionMessageWithSigners(\n transaction: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n config?: TransactionSendingSignerConfig,\n): Promise {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n\n const abortSignal = config?.abortSignal;\n const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transaction).filter(isTransactionSigner)),\n );\n\n abortSignal?.throwIfAborted();\n const signedTransaction = await signModifyingAndPartialTransactionSigners(\n transaction,\n modifyingSigners,\n partialSigners,\n config,\n );\n\n if (!sendingSigner) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n abortSignal?.throwIfAborted();\n const [signature] = await sendingSigner.signAndSendTransactions([signedTransaction], config);\n abortSignal?.throwIfAborted();\n\n return signature;\n}\n\n/**\n * Identifies each provided TransactionSigner and categorizes them into their respective types.\n * When a signer implements multiple interface, it will try to used to most powerful interface\n * but fallback to the least powerful interface when necessary.\n * For instance, if a signer implements TransactionSendingSigner and TransactionModifyingSigner,\n * it will be categorized as a TransactionSendingSigner if and only if no other signers implement\n * the TransactionSendingSigner interface.\n */\nfunction categorizeTransactionSigners(\n signers: readonly TransactionSigner[],\n config: { identifySendingSigner?: boolean } = {},\n): Readonly<{\n modifyingSigners: readonly TransactionModifyingSigner[];\n partialSigners: readonly TransactionPartialSigner[];\n sendingSigner: TransactionSendingSigner | null;\n}> {\n // Identify the unique sending signer that should be used.\n const identifySendingSigner = config.identifySendingSigner ?? true;\n const sendingSigner = identifySendingSigner ? identifyTransactionSendingSigner(signers) : null;\n\n // Now, focus on the other signers.\n // I.e. the modifying or partial signers that are not the identified sending signer.\n // Note that any other sending only signers will be discarded.\n const otherSigners = signers.filter(\n (signer): signer is TransactionModifyingSigner | TransactionPartialSigner =>\n signer !== sendingSigner && (isTransactionModifyingSigner(signer) || isTransactionPartialSigner(signer)),\n );\n\n // Identify the modifying signers from the other signers.\n const modifyingSigners = identifyTransactionModifyingSigners(otherSigners);\n\n // Use any remaining signers as partial signers.\n const partialSigners = otherSigners\n .filter(isTransactionPartialSigner)\n .filter(signer => !(modifyingSigners as typeof otherSigners).includes(signer));\n\n return Object.freeze({ modifyingSigners, partialSigners, sendingSigner });\n}\n\n/** Identifies the best signer to use as a TransactionSendingSigner, if any */\nfunction identifyTransactionSendingSigner(signers: readonly TransactionSigner[]): TransactionSendingSigner | null {\n // Ensure there are any TransactionSendingSigners in the first place.\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n if (sendingSigners.length === 0) return null;\n\n // Prefer sending signers that do not offer other interfaces.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionModifyingSigner(signer) && !isTransactionPartialSigner(signer),\n );\n if (sendingOnlySigners.length > 0) {\n return sendingOnlySigners[0];\n }\n\n // Otherwise, choose any sending signer.\n return sendingSigners[0];\n}\n\n/** Identifies the best signers to use as TransactionModifyingSigners, if any */\nfunction identifyTransactionModifyingSigners(\n signers: readonly (TransactionModifyingSigner | TransactionPartialSigner)[],\n): readonly TransactionModifyingSigner[] {\n // Ensure there are any TransactionModifyingSigner in the first place.\n const modifyingSigners = signers.filter(isTransactionModifyingSigner);\n if (modifyingSigners.length === 0) return [];\n\n // Prefer modifying signers that do not offer partial signing.\n const nonPartialSigners = modifyingSigners.filter(signer => !isTransactionPartialSigner(signer));\n if (nonPartialSigners.length > 0) return nonPartialSigners;\n\n // Otherwise, choose only one modifying signer (whichever).\n return [modifyingSigners[0]];\n}\n\n/**\n * Signs a transaction using the provided TransactionModifyingSigners\n * sequentially followed by the TransactionPartialSigners in parallel.\n */\nasync function signModifyingAndPartialTransactionSigners(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n modifyingSigners: readonly TransactionModifyingSigner[] = [],\n partialSigners: readonly TransactionPartialSigner[] = [],\n config?: TransactionModifyingSignerConfig,\n): Promise {\n // serialize the transaction\n const transaction = compileTransaction(transactionMessage);\n\n // Handle modifying signers sequentially.\n const modifiedTransaction = (await modifyingSigners.reduce(\n async (transaction, modifyingSigner) => {\n config?.abortSignal?.throwIfAborted();\n const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction], config);\n return Object.freeze(tx);\n },\n Promise.resolve(transaction) as Promise>,\n )) as Transaction & TransactionWithinSizeLimit & TransactionWithLifetime;\n\n // Handle partial signers in parallel.\n config?.abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signTransactions([modifiedTransaction], config);\n return signatures;\n }),\n );\n\n return Object.freeze({\n ...modifiedTransaction,\n signatures: Object.freeze(\n signatureDictionaries.reduce((signatures, signatureDictionary) => {\n return { ...signatures, ...signatureDictionary };\n }, modifiedTransaction.signatures ?? {}),\n ),\n });\n}\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import { TextEncoder } from '@solana/text-encoding-impl';\n\nimport { SignatureDictionary } from './types';\n\n/**\n * Defines a message that needs signing and its current set of signatures if any.\n *\n * This interface allows {@link MessageModifyingSigner | MessageModifyingSigners}\n * to decide on whether or not they should modify the provided message depending\n * on whether or not signatures already exist for such message.\n *\n * It also helps create a more consistent API by providing a structure analogous\n * to transactions which also keep track of their {@link SignatureDictionary}.\n *\n * @example\n * ```ts\n * import { createSignableMessage } from '@solana/signers';\n *\n * const message = createSignableMessage(new Uint8Array([1, 2, 3]));\n * message.content; // The content of the message as bytes.\n * message.signatures; // The current set of signatures for this message.\n * ```\n *\n * @see {@link createSignableMessage}\n */\nexport type SignableMessage = Readonly<{\n content: Uint8Array;\n signatures: SignatureDictionary;\n}>;\n\n/**\n * Creates a {@link SignableMessage} from a `Uint8Array` or a UTF-8 string.\n *\n * It optionally accepts a signature dictionary if the message already contains signatures.\n *\n * @example\n * ```ts\n * const message = createSignableMessage(new Uint8Array([1, 2, 3]));\n * const messageFromText = createSignableMessage('Hello world!');\n * const messageWithSignatures = createSignableMessage('Hello world!', {\n * [address('1234..5678')]: new Uint8Array([1, 2, 3]) as SignatureBytes,\n * });\n * ```\n */\nexport function createSignableMessage(\n content: Uint8Array | string,\n signatures: SignatureDictionary = {},\n): SignableMessage {\n return Object.freeze({\n content: typeof content === 'string' ? new TextEncoder().encode(content) : content,\n signatures: Object.freeze({ ...signatures }),\n });\n}\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import { SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, SolanaError } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport type { GetEpochInfoApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SlotNotificationsApi } from '@solana/rpc-subscriptions';\nimport type { Commitment } from '@solana/rpc-types';\n\ntype GetBlockHeightExceedencePromiseFn = (config: {\n abortSignal: AbortSignal;\n /**\n * Fetch the block height as of the highest slot that has reached this level of commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /** The block height after which to reject the promise */\n lastValidBlockHeight: bigint;\n}) => Promise;\n\ntype CreateBlockHeightExceedencePromiseFactoryConfig = {\n rpc: Rpc & { '~cluster'?: TCluster };\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Creates a promise that throws when the network progresses past the block height after which the\n * supplied blockhash is considered expired for use as a transaction lifetime specifier.\n *\n * When a transaction's lifetime is tied to a blockhash, that transaction can be landed on the\n * network until that blockhash expires. All blockhashes have a block height after which they are\n * considered to have expired.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, SolanaError } from '@solana/errors';\n * import { createBlockHeightExceedencePromiseFactory } from '@solana/transaction-confirmation';\n *\n * const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({\n * rpc,\n * rpcSubscriptions,\n * });\n * try {\n * await getBlockHeightExceedencePromise({ lastValidBlockHeight });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n * console.error(\n * `The block height of the network has exceeded ${e.context.lastValidBlockHeight}. ` +\n * `It is now ${e.context.currentBlockHeight}`,\n * );\n * // Re-sign and retry the transaction.\n * return;\n * }\n * throw e;\n * }\n * ```\n */\nexport function createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig<'devnet'>): GetBlockHeightExceedencePromiseFn;\nexport function createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig<'testnet'>): GetBlockHeightExceedencePromiseFn;\nexport function createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig<'mainnet'>): GetBlockHeightExceedencePromiseFn;\nexport function createBlockHeightExceedencePromiseFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig): GetBlockHeightExceedencePromiseFn {\n return async function getBlockHeightExceedencePromise({\n abortSignal: callerAbortSignal,\n commitment,\n lastValidBlockHeight,\n }): Promise {\n callerAbortSignal.throwIfAborted();\n const abortController = new AbortController();\n const handleAbort = () => {\n abortController.abort();\n };\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n async function getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() {\n const { absoluteSlot, blockHeight } = await rpc\n .getEpochInfo({ commitment })\n .send({ abortSignal: abortController.signal });\n return {\n blockHeight,\n differenceBetweenSlotHeightAndBlockHeight: absoluteSlot - blockHeight,\n };\n }\n try {\n const [slotNotifications, { blockHeight: initialBlockHeight, differenceBetweenSlotHeightAndBlockHeight }] =\n await Promise.all([\n rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal }),\n getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight(),\n ]);\n callerAbortSignal.throwIfAborted();\n let currentBlockHeight = initialBlockHeight;\n if (currentBlockHeight <= lastValidBlockHeight) {\n let lastKnownDifferenceBetweenSlotHeightAndBlockHeight = differenceBetweenSlotHeightAndBlockHeight;\n for await (const slotNotification of slotNotifications) {\n const { slot } = slotNotification;\n if (slot - lastKnownDifferenceBetweenSlotHeightAndBlockHeight > lastValidBlockHeight) {\n // Before making a final decision, recheck the actual block height.\n const {\n blockHeight: recheckedBlockHeight,\n differenceBetweenSlotHeightAndBlockHeight: currentDifferenceBetweenSlotHeightAndBlockHeight,\n } = await getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight();\n currentBlockHeight = recheckedBlockHeight;\n if (currentBlockHeight > lastValidBlockHeight) {\n // Verified; the block height has been exceeded.\n break;\n } else {\n // The block height has not been exceeded, which implies that the\n // difference between the slot height and the block height has grown\n // (ie. some blocks have been skipped since we started). Recalibrate the\n // difference and keep waiting.\n lastKnownDifferenceBetweenSlotHeightAndBlockHeight =\n currentDifferenceBetweenSlotHeightAndBlockHeight;\n }\n }\n }\n }\n callerAbortSignal.throwIfAborted();\n throw new SolanaError(SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, {\n currentBlockHeight,\n lastValidBlockHeight,\n });\n } finally {\n abortController.abort();\n }\n };\n}\n","import type { Address } from '@solana/addresses';\nimport { getBase58Decoder, getBase64Encoder } from '@solana/codecs-strings';\nimport { SOLANA_ERROR__INVALID_NONCE, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, SolanaError } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport { safeRace } from '@solana/promises';\nimport type { GetAccountInfoApi, Rpc } from '@solana/rpc';\nimport type { AccountNotificationsApi, RpcSubscriptions } from '@solana/rpc-subscriptions';\nimport type { Base64EncodedDataResponse, Commitment } from '@solana/rpc-types';\nimport { Nonce } from '@solana/transaction-messages';\n\ntype GetNonceInvalidationPromiseFn = (config: {\n abortSignal: AbortSignal;\n /**\n * Fetch the nonce account details as of the highest slot that has reached this level of\n * commitment.\n */\n commitment: Commitment;\n /**\n * The value of the nonce that we would expect to see in the nonce account in order for any\n * transaction with that nonce-based lifetime to be considered valid.\n */\n currentNonceValue: Nonce;\n /** The address of the account in which the currently-valid nonce value is stored */\n nonceAccountAddress: Address;\n}) => Promise;\n\ntype CreateNonceInvalidationPromiseFactoryConfig = {\n rpc: Rpc & { '~cluster'?: TCluster };\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\nconst NONCE_VALUE_OFFSET =\n 4 + // version(u32)\n 4 + // state(u32)\n 32; // nonce authority(pubkey)\n// Then comes the nonce value.\n\n/**\n * Creates a promise that throws when the value stored in a nonce account is not the expected one.\n *\n * When a transaction's lifetime is tied to the value stored in a nonce account, that transaction\n * can be landed on the network until the nonce is advanced to a new value.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, SolanaError } from '@solana/errors';\n * import { createNonceInvalidationPromiseFactory } from '@solana/transaction-confirmation';\n *\n * const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({\n * rpc,\n * rpcSubscriptions,\n * });\n * try {\n * await getNonceInvalidationPromise({\n * currentNonceValue,\n * nonceAccountAddress,\n * });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__NONCE_INVALID)) {\n * console.error(`The nonce has advanced to ${e.context.actualNonceValue}`);\n * // Re-sign and retry the transaction.\n * return;\n * } else if (isSolanaError(e, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND)) {\n * console.error(`No nonce account was found at ${nonceAccountAddress}`);\n * }\n * throw e;\n * }\n * ```\n */\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig<'devnet'>): GetNonceInvalidationPromiseFn;\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig<'testnet'>): GetNonceInvalidationPromiseFn;\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig<'mainnet'>): GetNonceInvalidationPromiseFn;\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig): GetNonceInvalidationPromiseFn {\n return async function getNonceInvalidationPromise({\n abortSignal: callerAbortSignal,\n commitment,\n currentNonceValue: expectedNonceValue,\n nonceAccountAddress,\n }) {\n const abortController = new AbortController();\n function handleAbort() {\n abortController.abort();\n }\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n /**\n * STEP 1: Set up a subscription for nonce account changes.\n */\n const accountNotifications = await rpcSubscriptions\n .accountNotifications(nonceAccountAddress, { commitment, encoding: 'base64' })\n .subscribe({ abortSignal: abortController.signal });\n const base58Decoder = getBase58Decoder();\n const base64Encoder = getBase64Encoder();\n function getNonceFromAccountData([base64EncodedBytes]: Base64EncodedDataResponse): Nonce {\n const data = base64Encoder.encode(base64EncodedBytes);\n const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32);\n return base58Decoder.decode(nonceValueBytes) as Nonce;\n }\n const nonceAccountDidAdvancePromise = (async () => {\n for await (const accountNotification of accountNotifications) {\n const nonceValue = getNonceFromAccountData(accountNotification.value.data);\n if (nonceValue !== expectedNonceValue) {\n throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, {\n actualNonceValue: nonceValue,\n expectedNonceValue,\n });\n }\n }\n })();\n /**\n * STEP 2: Having subscribed for updates, make a one-shot request for the current nonce\n * value to check if it has already been advanced.\n */\n const nonceIsAlreadyInvalidPromise = (async () => {\n const { value: nonceAccount } = await rpc\n .getAccountInfo(nonceAccountAddress, {\n commitment,\n dataSlice: { length: 32, offset: NONCE_VALUE_OFFSET },\n encoding: 'base58',\n })\n .send({ abortSignal: abortController.signal });\n if (!nonceAccount) {\n throw new SolanaError(SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, {\n nonceAccountAddress,\n });\n }\n const nonceValue =\n // This works because we asked for the exact slice of data representing the nonce\n // value, and furthermore asked for it in `base58` encoding.\n nonceAccount.data[0] as unknown as Nonce;\n if (nonceValue !== expectedNonceValue) {\n throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, {\n actualNonceValue: nonceValue,\n expectedNonceValue,\n });\n } else {\n await new Promise(() => {\n /* never resolve */\n });\n }\n })();\n try {\n return await safeRace([nonceAccountDidAdvancePromise, nonceIsAlreadyInvalidPromise]);\n } finally {\n abortController.abort();\n }\n };\n}\n","import { getSolanaErrorFromTransactionError } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport type { Signature } from '@solana/keys';\nimport { safeRace } from '@solana/promises';\nimport type { GetSignatureStatusesApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport { type Commitment, commitmentComparator } from '@solana/rpc-types';\n\ntype GetRecentSignatureConfirmationPromiseFn = (config: {\n abortSignal: AbortSignal;\n /**\n * The level of commitment the transaction must have achieved in order for the promise to\n * resolve.\n */\n commitment: Commitment;\n /**\n * A 64 byte Ed25519 signature, encoded as a base-58 string, that uniquely identifies a\n * transaction by virtue of being the first or only signature in its list of signatures.\n */\n signature: Signature;\n}) => Promise;\n\ntype CreateRecentSignatureConfirmationPromiseFactoryConfig = {\n rpc: Rpc & { '~cluster'?: TCluster };\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Creates a promise that resolves when a recently-landed transaction achieves the target\n * confirmation commitment, and throws when the transaction fails with an error.\n *\n * The status of recently-landed transactions is available in the network's status cache. This\n * confirmation strategy will only yield a result if the signature is still in the status cache. To\n * fetch the status of transactions older than those available in the status cache, use the\n * {@link GetSignatureStatusesApi.getSignatureStatuses} method setting the\n * `searchTransactionHistory` configuration param to `true`.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { createRecentSignatureConfirmationPromiseFactory } from '@solana/transaction-confirmation';\n *\n * const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n * rpc,\n * rpcSubscriptions,\n * });\n * try {\n * await getRecentSignatureConfirmationPromise({\n * commitment,\n * signature,\n * });\n * console.log(`The transaction with signature \\`${signature}\\` has achieved a commitment level of \\`${commitment}\\``);\n * } catch (e) {\n * console.error(`The transaction with signature \\`${signature}\\` failed`, e.cause);\n * throw e;\n * }\n * ```\n */\nexport function createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig<'devnet'>): GetRecentSignatureConfirmationPromiseFn;\nexport function createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig<'testnet'>): GetRecentSignatureConfirmationPromiseFn;\nexport function createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig<'mainnet'>): GetRecentSignatureConfirmationPromiseFn;\nexport function createRecentSignatureConfirmationPromiseFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig): GetRecentSignatureConfirmationPromiseFn {\n return async function getRecentSignatureConfirmationPromise({\n abortSignal: callerAbortSignal,\n commitment,\n signature,\n }) {\n const abortController = new AbortController();\n function handleAbort() {\n abortController.abort();\n }\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n /**\n * STEP 1: Set up a subscription for status changes to a signature.\n */\n const signatureStatusNotifications = await rpcSubscriptions\n .signatureNotifications(signature, { commitment })\n .subscribe({ abortSignal: abortController.signal });\n const signatureDidCommitPromise = (async () => {\n for await (const signatureStatusNotification of signatureStatusNotifications) {\n if (signatureStatusNotification.value.err) {\n throw getSolanaErrorFromTransactionError(signatureStatusNotification.value.err);\n } else {\n return;\n }\n }\n })();\n /**\n * STEP 2: Having subscribed for updates, make a one-shot request for the current status.\n * This will only yield a result if the signature is still in the status cache.\n */\n const signatureStatusLookupPromise = (async () => {\n const { value: signatureStatusResults } = await rpc\n .getSignatureStatuses([signature])\n .send({ abortSignal: abortController.signal });\n const signatureStatus = signatureStatusResults[0];\n if (signatureStatus?.err) {\n throw getSolanaErrorFromTransactionError(signatureStatus.err);\n } else if (\n signatureStatus?.confirmationStatus &&\n commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0\n ) {\n return;\n } else {\n await new Promise(() => {\n /* never resolve */\n });\n }\n })();\n try {\n return await safeRace([signatureDidCommitPromise, signatureStatusLookupPromise]);\n } finally {\n abortController.abort();\n }\n };\n}\n","import type { Commitment } from '@solana/rpc-types';\n\ntype Config = Readonly<{\n abortSignal: AbortSignal;\n /**\n * The timeout promise will throw after 30 seconds when the commitment is `processed`, and 60\n * seconds otherwise.\n */\n commitment: Commitment;\n}>;\n\n/**\n * When no other heuristic exists to infer that a transaction has expired, you can use this promise\n * factory with a commitment level. It throws after 30 seconds when the commitment is `processed`,\n * and 60 seconds otherwise. You would typically race this with another confirmation strategy.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { safeRace } from '@solana/promises';\n * import { getTimeoutPromise } from '@solana/transaction-confirmation';\n *\n * try {\n * await safeRace([getCustomTransactionConfirmationPromise(/* ... *\\/), getTimeoutPromise({ commitment })]);\n * } catch (e) {\n * if (e instanceof DOMException && e.name === 'TimeoutError') {\n * console.log('Could not confirm transaction after a timeout');\n * }\n * throw e;\n * }\n * ```\n */\nexport async function getTimeoutPromise({ abortSignal: callerAbortSignal, commitment }: Config) {\n return await new Promise((_, reject) => {\n const handleAbort = (e: AbortSignalEventMap['abort']) => {\n clearTimeout(timeoutId);\n const abortError = new DOMException((e.target as AbortSignal).reason, 'AbortError');\n reject(abortError);\n };\n callerAbortSignal.addEventListener('abort', handleAbort);\n const timeoutMs = commitment === 'processed' ? 30_000 : 60_000;\n const startMs = performance.now();\n const timeoutId =\n // We use `setTimeout` instead of `AbortSignal.timeout()` because we want to measure\n // elapsed time instead of active time.\n // See https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static\n setTimeout(() => {\n const elapsedMs = performance.now() - startMs;\n reject(new DOMException(`Timeout elapsed after ${elapsedMs} ms`, 'TimeoutError'));\n }, timeoutMs);\n });\n}\n","import { AbortController } from '@solana/event-target-impl';\nimport type { Signature } from '@solana/keys';\nimport { safeRace } from '@solana/promises';\nimport type { Commitment } from '@solana/rpc-types';\n\nimport { createRecentSignatureConfirmationPromiseFactory } from './confirmation-strategy-recent-signature';\n\nexport interface BaseTransactionConfirmationStrategyConfig {\n abortSignal?: AbortSignal;\n commitment: Commitment;\n getRecentSignatureConfirmationPromise: ReturnType;\n}\n\ntype WithNonNullableAbortSignal = Omit & Readonly<{ abortSignal: AbortSignal }>;\n\nexport async function raceStrategies(\n signature: Signature,\n config: TConfig,\n getSpecificStrategiesForRace: (config: WithNonNullableAbortSignal) => readonly Promise[],\n) {\n const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise } = config;\n callerAbortSignal?.throwIfAborted();\n const abortController = new AbortController();\n if (callerAbortSignal) {\n const handleAbort = () => {\n abortController.abort();\n };\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n }\n try {\n const specificStrategies = getSpecificStrategiesForRace({\n ...config,\n abortSignal: abortController.signal,\n });\n return await safeRace([\n getRecentSignatureConfirmationPromise({\n abortSignal: abortController.signal,\n commitment,\n signature,\n }),\n ...specificStrategies,\n ]);\n } finally {\n abortController.abort();\n }\n}\n","import { Signature } from '@solana/keys';\nimport {\n getSignatureFromTransaction,\n Transaction,\n TransactionWithBlockhashLifetime,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\nimport { createBlockHeightExceedencePromiseFactory } from './confirmation-strategy-blockheight';\nimport { createNonceInvalidationPromiseFactory } from './confirmation-strategy-nonce';\nimport { BaseTransactionConfirmationStrategyConfig, raceStrategies } from './confirmation-strategy-racer';\nimport { getTimeoutPromise } from './confirmation-strategy-timeout';\n\nexport type TransactionWithLastValidBlockHeight = Omit & {\n lifetimeConstraint: Omit;\n};\n\ninterface WaitForDurableNonceTransactionConfirmationConfig extends BaseTransactionConfirmationStrategyConfig {\n getNonceInvalidationPromise: ReturnType;\n transaction: Readonly;\n}\n\ninterface WaitForRecentTransactionWithBlockhashLifetimeConfirmationConfig extends BaseTransactionConfirmationStrategyConfig {\n getBlockHeightExceedencePromise: ReturnType;\n transaction: Readonly;\n}\n\ninterface WaitForRecentTransactionWithTimeBasedLifetimeConfirmationConfig extends BaseTransactionConfirmationStrategyConfig {\n getTimeoutPromise: typeof getTimeoutPromise;\n /**\n * A 64 byte Ed25519 signature, encoded as a base-58 string, that uniquely identifies a\n * transaction by virtue of being the first or only signature in its list of signatures.\n */\n signature: Signature;\n}\n\n/**\n * Supply your own confirmation implementations to this function to create a custom nonce\n * transaction confirmation strategy.\n *\n * @example\n * ```ts\n * import { waitForDurableNonceTransactionConfirmation } from '@solana/transaction-confirmation';\n *\n * try {\n * await waitForDurableNonceTransactionConfirmation({\n * getNonceInvalidationPromise({ abortSignal, commitment, currentNonceValue, nonceAccountAddress }) {\n * // Return a promise that rejects when a nonce becomes invalid.\n * },\n * getRecentSignatureConfirmationPromise({ abortSignal, commitment, signature }) {\n * // Return a promise that resolves when a transaction achieves confirmation\n * },\n * });\n * } catch (e) {\n * // Handle errors.\n * }\n * ```\n */\nexport async function waitForDurableNonceTransactionConfirmation(\n config: WaitForDurableNonceTransactionConfirmationConfig,\n): Promise {\n await raceStrategies(\n getSignatureFromTransaction(config.transaction),\n config,\n function getSpecificStrategiesForRace({ abortSignal, commitment, getNonceInvalidationPromise, transaction }) {\n return [\n getNonceInvalidationPromise({\n abortSignal,\n commitment,\n currentNonceValue: transaction.lifetimeConstraint.nonce,\n nonceAccountAddress: transaction.lifetimeConstraint.nonceAccountAddress,\n }),\n ];\n },\n );\n}\n\n/**\n * Supply your own confirmation implementations to this function to create a custom confirmation\n * strategy for recently-landed transactions.\n *\n * @example\n * ```ts\n * import { waitForRecentTransactionConfirmation } from '@solana/transaction-confirmation';\n *\n * try {\n * await waitForRecentTransactionConfirmation({\n * getBlockHeightExceedencePromise({ abortSignal, commitment, lastValidBlockHeight }) {\n * // Return a promise that rejects when the blockhash's block height has been exceeded\n * },\n * getRecentSignatureConfirmationPromise({ abortSignal, commitment, signature }) {\n * // Return a promise that resolves when a transaction achieves confirmation\n * },\n * });\n * } catch (e) {\n * // Handle errors.\n * }\n * ```\n */\nexport async function waitForRecentTransactionConfirmation(\n config: WaitForRecentTransactionWithBlockhashLifetimeConfirmationConfig,\n): Promise {\n await raceStrategies(\n getSignatureFromTransaction(config.transaction),\n config,\n function getSpecificStrategiesForRace({\n abortSignal,\n commitment,\n getBlockHeightExceedencePromise,\n transaction,\n }) {\n return [\n getBlockHeightExceedencePromise({\n abortSignal,\n commitment,\n lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight,\n }),\n ];\n },\n );\n}\n\n/** @deprecated */\nexport async function waitForRecentTransactionConfirmationUntilTimeout(\n config: WaitForRecentTransactionWithTimeBasedLifetimeConfirmationConfig,\n): Promise {\n await raceStrategies(\n config.signature,\n config,\n function getSpecificStrategiesForRace({ abortSignal, commitment, getTimeoutPromise }) {\n return [\n getTimeoutPromise({\n abortSignal,\n commitment,\n }),\n ];\n },\n );\n}\n","import type { Address } from '@solana/addresses';\nimport type { Signature } from '@solana/keys';\nimport type { RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { Commitment, Lamports } from '@solana/rpc-types';\nimport { waitForRecentTransactionConfirmationUntilTimeout } from '@solana/transaction-confirmation';\n\ntype RequestAndConfirmAirdropConfig = Readonly<{\n abortSignal?: AbortSignal;\n commitment: Commitment;\n confirmSignatureOnlyTransaction: (\n config: Omit<\n Parameters[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) => Promise;\n lamports: Lamports;\n recipientAddress: Address;\n rpc: Rpc;\n}>;\n\nexport async function requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmSignatureOnlyTransaction,\n lamports,\n recipientAddress,\n rpc,\n}: RequestAndConfirmAirdropConfig): Promise {\n const airdropTransactionSignature = await rpc\n .requestAirdrop(recipientAddress, lamports, { commitment })\n .send({ abortSignal });\n await confirmSignatureOnlyTransaction({\n abortSignal,\n commitment,\n signature: airdropTransactionSignature,\n });\n return airdropTransactionSignature;\n}\n","import type { Signature } from '@solana/keys';\nimport type { GetSignatureStatusesApi, RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createRecentSignatureConfirmationPromiseFactory,\n getTimeoutPromise,\n waitForRecentTransactionConfirmationUntilTimeout,\n} from '@solana/transaction-confirmation';\n\nimport { requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT } from './airdrop-internal';\n\ntype AirdropFunction = (\n config: Omit<\n Parameters[0],\n 'confirmSignatureOnlyTransaction' | 'rpc'\n >,\n) => Promise;\n\ntype AirdropFactoryConfig = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link RequestAirdropApi} of the Solana RPC API */\n rpc: Rpc & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to airdrop a certain amount of {@link Lamports} to a Solana\n * address.\n *\n * > [!NOTE] This only works on test clusters.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { address, airdropFactory, createSolanaRpc, createSolanaRpcSubscriptions, devnet, lamports } from '@solana/kit';\n *\n * const rpc = createSolanaRpc(devnet('http://127.0.0.1:8899'));\n * const rpcSubscriptions = createSolanaRpcSubscriptions(devnet('ws://127.0.0.1:8900'));\n *\n * const airdrop = airdropFactory({ rpc, rpcSubscriptions });\n *\n * await airdrop({\n * commitment: 'confirmed',\n * recipientAddress: address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa'),\n * lamports: lamports(10_000_000n),\n * });\n * ```\n */\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'devnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'mainnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'testnet'>): AirdropFunction;\nexport function airdropFactory({\n rpc,\n rpcSubscriptions,\n}: AirdropFactoryConfig): AirdropFunction {\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n async function confirmSignatureOnlyTransaction(\n config: Omit<\n Parameters[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmationUntilTimeout({\n ...config,\n getRecentSignatureConfirmationPromise,\n getTimeoutPromise,\n });\n }\n return async function airdrop(config) {\n return await requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmSignatureOnlyTransaction,\n rpc,\n });\n };\n}\n","import {\n assertAccountsDecoded,\n assertAccountsExist,\n type FetchAccountsConfig,\n fetchJsonParsedAccounts,\n} from '@solana/accounts';\nimport type { Address } from '@solana/addresses';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport { type AddressesByLookupTableAddress } from '@solana/transaction-messages';\n\ntype FetchedAddressLookup = {\n addresses: Address[];\n};\n\n/**\n * Given a list of addresses belonging to address lookup tables, returns a map of lookup table\n * addresses to an ordered array of the addresses they contain.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function fetchAddressesForLookupTables(\n lookupTableAddresses: Address[],\n rpc: Rpc,\n config?: FetchAccountsConfig,\n): Promise {\n if (lookupTableAddresses.length === 0) {\n return {};\n }\n\n const fetchedLookupTables = await fetchJsonParsedAccounts(\n rpc,\n lookupTableAddresses,\n config,\n );\n\n assertAccountsDecoded(fetchedLookupTables);\n assertAccountsExist(fetchedLookupTables);\n\n return fetchedLookupTables.reduce((acc, lookup) => {\n return {\n ...acc,\n [lookup.address]: lookup.data.addresses,\n };\n }, {});\n}\n","import { type FetchAccountsConfig } from '@solana/accounts';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport {\n CompiledTransactionMessage,\n CompiledTransactionMessageWithLifetime,\n decompileTransactionMessage,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionMessageWithLifetime,\n} from '@solana/transaction-messages';\n\nimport { fetchAddressesForLookupTables } from './fetch-lookup-tables';\n\ntype DecompileTransactionMessageFetchingLookupTablesConfig = FetchAccountsConfig & {\n lastValidBlockHeight?: bigint;\n};\n\n/**\n * Returns a {@link TransactionMessage} from a {@link CompiledTransactionMessage}. If any of the\n * accounts in the compiled message require an address lookup table to find their address, this\n * function will use the supplied RPC instance to fetch the contents of the address lookup table\n * from the network.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function decompileTransactionMessageFetchingLookupTables(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n rpc: Rpc,\n config?: DecompileTransactionMessageFetchingLookupTablesConfig,\n): Promise {\n const lookupTables =\n 'addressTableLookups' in compiledTransactionMessage &&\n compiledTransactionMessage.addressTableLookups !== undefined &&\n compiledTransactionMessage.addressTableLookups.length > 0\n ? compiledTransactionMessage.addressTableLookups\n : [];\n const lookupTableAddresses = lookupTables.map(l => l.lookupTableAddress);\n\n const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {};\n const addressesByLookupTableAddress =\n lookupTableAddresses.length > 0\n ? await fetchAddressesForLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig)\n : {};\n\n return decompileTransactionMessage(compiledTransactionMessage, {\n addressesByLookupTableAddress,\n lastValidBlockHeight,\n });\n}\n","import type { Lamports } from '@solana/rpc-types';\n\n/**\n * Calculates the minimum {@link Lamports | lamports} required to make an account rent exempt for a\n * given data size, without performing an RPC call.\n *\n * Values are sourced from the on-chain rent parameters in the Solana runtime:\n * https://github.com/anza-xyz/solana-sdk/blob/c07f692e41d757057c8700211a9300cdcd6d33b1/rent/src/lib.rs#L93-L97\n *\n * Note that this logic may change, or be incorrect depending on the cluster you are connected to.\n * You can always use the RPC method `getMinimumBalanceForRentExemption` to get the current value.\n *\n * @param space The number of bytes of account data.\n */\nexport function getMinimumBalanceForRentExemption(space: bigint): Lamports {\n const RENT = {\n ACCOUNT_STORAGE_OVERHEAD: 128n,\n DEFAULT_EXEMPTION_THRESHOLD: 2n,\n DEFAULT_LAMPORTS_PER_BYTE_YEAR: 3_480n,\n } as const;\n const requiredLamports =\n (RENT.ACCOUNT_STORAGE_OVERHEAD + space) *\n RENT.DEFAULT_LAMPORTS_PER_BYTE_YEAR *\n RENT.DEFAULT_EXEMPTION_THRESHOLD;\n return requiredLamports as Lamports;\n}\n","import type { Signature } from '@solana/keys';\nimport type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { Commitment, commitmentComparator } from '@solana/rpc-types';\nimport {\n TransactionWithLastValidBlockHeight,\n waitForDurableNonceTransactionConfirmation,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getBase64EncodedWireTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\ninterface SendAndConfirmDurableNonceTransactionConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmDurableNonceTransaction: (\n config: Omit<\n Parameters[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise;\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime;\n}\n\ninterface SendAndConfirmTransactionWithBlockhashLifetimeConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmRecentTransaction: (\n config: Omit<\n Parameters[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise;\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight;\n}\n\ninterface SendTransactionBaseConfig extends SendTransactionConfigWithoutEncoding {\n abortSignal?: AbortSignal;\n commitment: Commitment;\n rpc: Rpc;\n transaction: SendableTransaction & Transaction;\n}\n\ntype SendTransactionConfigWithoutEncoding = Omit<\n NonNullable[1]>,\n 'encoding'\n>;\n\nfunction getSendTransactionConfigWithAdjustedPreflightCommitment(\n commitment: Commitment,\n config?: SendTransactionConfigWithoutEncoding,\n): SendTransactionConfigWithoutEncoding | void {\n if (\n // The developer has supplied no value for `preflightCommitment`.\n !config?.preflightCommitment &&\n // The value of `commitment` is lower than the server default of `preflightCommitment`.\n commitmentComparator(commitment, 'finalized' /* default value of `preflightCommitment` */) < 0\n ) {\n return {\n ...config,\n // In the common case, it is unlikely that you want to simulate a transaction at\n // `finalized` commitment when your standard of commitment for confirming the\n // transaction is lower. Cap the simulation commitment level to the level of the\n // confirmation commitment.\n preflightCommitment: commitment,\n };\n }\n // The commitment at which the developer wishes to confirm the transaction is at least as\n // high as the commitment at which they want to simulate it. Honour the config as-is.\n return config;\n}\n\nexport async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendTransactionBaseConfig): Promise {\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction);\n return await rpc\n .sendTransaction(base64EncodedWireTransaction, {\n ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig),\n encoding: 'base64',\n })\n .send({ abortSignal });\n}\n\nexport async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmDurableNonceTransactionConfig): Promise {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmDurableNonceTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n\nexport async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmRecentTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmTransactionWithBlockhashLifetimeConfig): Promise {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmRecentTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n","import { getSolanaErrorFromTransactionError, isSolanaError, SOLANA_ERROR__INVALID_NONCE } from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport type { GetAccountInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { AccountNotificationsApi, RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport { commitmentComparator } from '@solana/rpc-types';\nimport {\n createNonceInvalidationPromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n waitForDurableNonceTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getSignatureFromTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\nimport { sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmDurableNonceTransactionFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime,\n config: Omit<\n Parameters[0],\n 'confirmDurableNonceTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise;\n\ntype SendAndConfirmDurableNonceTransactionFactoryConfig = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc & { '~cluster'?: TCluster };\n /** An object that supports the {@link AccountNotificationsApi} and the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a nonce-based transaction to the network and to wait\n * until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * isSolanaError,\n * sendAndConfirmDurableNonceTransactionFactory,\n * SOLANA_ERROR__INVALID_NONCE,\n * SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n * } from '@solana/kit';\n *\n * const sendAndConfirmNonceTransaction = sendAndConfirmDurableNonceTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmNonceTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND)) {\n * console.error(\n * 'The lifetime specified by this transaction refers to a nonce account ' +\n * `\\`${e.context.nonceAccountAddress}\\` that does not exist`,\n * );\n * } else if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n * console.error('This transaction depends on a nonce that is no longer valid');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'devnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'testnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'mainnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig): SendAndConfirmDurableNonceTransactionFunction {\n const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({ rpc, rpcSubscriptions } as Parameters<\n typeof createNonceInvalidationPromiseFactory\n >[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n\n /**\n * Creates a wrapped version of getNonceInvalidationPromise that handles the race condition\n * where the nonce account update notification arrives before the signature confirmation.\n *\n * When the nonce changes, we check if our transaction actually landed on-chain.\n * If it did, we don't throw - letting the signature confirmation promise continue.\n */\n function createNonceInvalidationPromiseHandlingRaceCondition(\n signature: Signature,\n ): typeof getNonceInvalidationPromise {\n return async function wrappedGetNonceInvalidationPromise(config) {\n try {\n return await getNonceInvalidationPromise(config);\n } catch (e) {\n // If nonce became invalid, check if our transaction actually landed\n if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n let status;\n try {\n const { value: statuses } = await rpc\n .getSignatureStatuses([signature])\n .send({ abortSignal: config.abortSignal });\n status = statuses[0];\n } catch {\n // RPC failed - propagate the original nonce error\n throw e;\n }\n\n if (status === null || status === undefined) {\n // Transaction doesn't exist - nonce was truly invalid\n throw e;\n }\n\n // Check if status meets required commitment\n if (\n status.confirmationStatus !== null &&\n commitmentComparator(status.confirmationStatus, config.commitment) >= 0\n ) {\n // Transaction failed on-chain, throw the error from the transaction\n if (status.err !== null) {\n throw getSolanaErrorFromTransactionError(status.err);\n }\n // Transaction succeeded, resolve the promise successfully\n return;\n }\n\n // Commitment not met yet - return a never-resolving promise\n // This lets the signature confirmation promise continue\n return await new Promise(() => {});\n }\n throw e;\n }\n };\n }\n\n async function confirmDurableNonceTransaction(\n config: Omit<\n Parameters[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n const wrappedGetNonceInvalidationPromise = createNonceInvalidationPromiseHandlingRaceCondition(\n getSignatureFromTransaction(config.transaction),\n );\n\n await waitForDurableNonceTransactionConfirmation({\n ...config,\n getNonceInvalidationPromise: wrappedGetNonceInvalidationPromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmDurableNonceTransaction(transaction, config) {\n await sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { GetEpochInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi, SlotNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createBlockHeightExceedencePromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n TransactionWithLastValidBlockHeight,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight,\n config: Omit<\n Parameters[0],\n 'confirmRecentTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise;\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} and the {@link SlotNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a blockhash-based transaction to the network and to\n * wait until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, sendAndConfirmTransactionFactory, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED } from '@solana/kit';\n *\n * const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n * console.error('This transaction depends on a blockhash that has expired');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'devnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'testnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'mainnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig): SendAndConfirmTransactionWithBlockhashLifetimeFunction {\n const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n async function confirmRecentTransaction(\n config: Omit<\n Parameters[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmation({\n ...config,\n getBlockHeightExceedencePromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmTransaction(transaction, config) {\n await sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmRecentTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendTransactionWithoutConfirmingFunction = (\n transaction: SendableTransaction & Transaction,\n config: Omit[0], 'rpc' | 'transaction'>,\n) => Promise;\n\ninterface SendTransactionWithoutConfirmingFactoryConfig {\n /** An object that supports the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc;\n}\n\n/**\n * Returns a function that you can call to send a transaction with any kind of lifetime to the\n * network without waiting for it to be confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * sendTransactionWithoutConfirmingFactory,\n * SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n * } from '@solana/kit';\n *\n * const sendTransaction = sendTransactionWithoutConfirmingFactory({ rpc });\n *\n * try {\n * await sendTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE)) {\n * console.error('The transaction failed in simulation', e.cause);\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendTransactionWithoutConfirmingFactory({\n rpc,\n}: SendTransactionWithoutConfirmingFactoryConfig): SendTransactionWithoutConfirmingFunction {\n return async function sendTransactionWithoutConfirming(transaction, config) {\n await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n rpc,\n transaction,\n });\n };\n}\n","/**\n * Wallet Key Derivation\n *\n * BIP-39 mnemonic generation + BIP-44 HD key derivation for EVM and Solana.\n * Absorbed from @blockrun/clawwallet. No file I/O here - auth.ts handles persistence.\n *\n * Solana uses SLIP-10 Ed25519 derivation (Phantom/Solflare/Backpack compatible).\n * EVM uses standard BIP-32 secp256k1 derivation.\n */\n\nimport { HDKey } from \"@scure/bip32\";\nimport { generateMnemonic, mnemonicToSeedSync, validateMnemonic } from \"@scure/bip39\";\nimport { wordlist as english } from \"@scure/bip39/wordlists/english\";\nimport { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha512 } from \"@noble/hashes/sha2.js\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nconst ETH_DERIVATION_PATH = \"m/44'/60'/0'/0/0\";\nconst SOLANA_HARDENED_INDICES = [44 + 0x80000000, 501 + 0x80000000, 0 + 0x80000000, 0 + 0x80000000]; // m/44'/501'/0'/0'\n\nexport interface DerivedKeys {\n mnemonic: string;\n evmPrivateKey: `0x${string}`;\n evmAddress: string;\n solanaPrivateKeyBytes: Uint8Array; // 32 bytes\n}\n\n/**\n * Generate a 24-word BIP-39 mnemonic.\n */\nexport function generateWalletMnemonic(): string {\n return generateMnemonic(english, 256);\n}\n\n/**\n * Validate a BIP-39 mnemonic.\n */\nexport function isValidMnemonic(mnemonic: string): boolean {\n return validateMnemonic(mnemonic, english);\n}\n\n/**\n * Derive EVM private key and address from a BIP-39 mnemonic.\n * Path: m/44'/60'/0'/0/0 (standard Ethereum derivation)\n */\nexport function deriveEvmKey(mnemonic: string): { privateKey: `0x${string}`; address: string } {\n const seed = mnemonicToSeedSync(mnemonic);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(ETH_DERIVATION_PATH);\n if (!derived.privateKey) throw new Error(\"Failed to derive EVM private key\");\n const hex = `0x${Buffer.from(derived.privateKey).toString(\"hex\")}` as `0x${string}`;\n const account = privateKeyToAccount(hex);\n return { privateKey: hex, address: account.address };\n}\n\n/**\n * Derive 32-byte Solana private key using SLIP-10 Ed25519 derivation.\n * Path: m/44'/501'/0'/0' (Phantom / Solflare / Backpack compatible)\n *\n * Algorithm (SLIP-0010 for Ed25519):\n * 1. Master: HMAC-SHA512(key=\"ed25519 seed\", data=bip39_seed) → IL=key, IR=chainCode\n * 2. For each hardened child index:\n * HMAC-SHA512(key=chainCode, data=0x00 || key || ser32(index)) → split again\n * 3. Final IL (32 bytes) = Ed25519 private key seed\n */\nexport function deriveSolanaKeyBytes(mnemonic: string): Uint8Array {\n const seed = mnemonicToSeedSync(mnemonic);\n\n // Master key from SLIP-10\n // @noble/hashes v2 requires Uint8Array keys (v1 accepted strings)\n let I = hmac(sha512, new TextEncoder().encode(\"ed25519 seed\"), seed);\n let key = I.slice(0, 32);\n let chainCode = I.slice(32);\n\n // Derive each hardened child: m/44'/501'/0'/0'\n for (const index of SOLANA_HARDENED_INDICES) {\n const data = new Uint8Array(37);\n data[0] = 0x00;\n data.set(key, 1);\n // ser32 big-endian\n data[33] = (index >>> 24) & 0xff;\n data[34] = (index >>> 16) & 0xff;\n data[35] = (index >>> 8) & 0xff;\n data[36] = index & 0xff;\n I = hmac(sha512, chainCode, data);\n key = I.slice(0, 32);\n chainCode = I.slice(32);\n }\n\n return new Uint8Array(key);\n}\n\n/**\n * Derive both EVM and Solana keys from a single mnemonic.\n */\nexport function deriveAllKeys(mnemonic: string): DerivedKeys {\n const { privateKey: evmPrivateKey, address: evmAddress } = deriveEvmKey(mnemonic);\n const solanaPrivateKeyBytes = deriveSolanaKeyBytes(mnemonic);\n return { mnemonic, evmPrivateKey, evmAddress, solanaPrivateKeyBytes };\n}\n\n/**\n * Get the Solana address from 32-byte private key bytes.\n * Uses @solana/kit's createKeyPairSignerFromPrivateKeyBytes (dynamic import).\n */\nexport async function getSolanaAddress(privateKeyBytes: Uint8Array): Promise {\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const signer = await createKeyPairSignerFromPrivateKeyBytes(privateKeyBytes);\n return signer.address;\n}\n","/**\n * OnchainOsAdapter — thin wrapper around OKX's `onchainos` CLI.\n *\n * The CLI owns wallet state (email login, key material, on-chain interaction).\n * XClawRouter shells out to it for wallet identity and x402 payment signing\n * so private keys never live in this process.\n *\n * CLI surface used here (verified against okxclawrouter sample):\n * onchainos --version\n * onchainos wallet status → { data: { loggedIn, evmAddress?, email? } }\n * onchainos wallet addresses → { data: { evm?, xlayer?, solana? } }\n * Each chain may be a string, an array\n * of strings, or an array of objects\n * with an `address` field — handled\n * tolerantly by `addresses()`.\n * onchainos wallet login (interactive)\n * onchainos wallet logout\n * onchainos payment x402-pay --accepts \n * → { data: { signature, authorization, sessionCert? } }\n *\n * Some onchainos builds omit `evmAddress` from `wallet status` even when the\n * user is logged in. Callers should fall back to `addresses()` to recover the\n * Base/EVM address rather than treating \"no evmAddress in status\" as \"no\n * onchainos wallet\".\n *\n * Raw EIP-712 / typed-data signing is NOT exposed by onchainos, so we use\n * `payment x402-pay` for the entire signing step rather than the @x402/fetch\n * signer plumbing. See proxy.ts for the call site.\n */\n\nimport { execFile, execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nconst DEFAULT_BIN = \"onchainos\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst PAYMENT_TIMEOUT_MS = 30_000;\n\nconst FALLBACK_CANDIDATES = [\n `${homedir()}/.local/bin/onchainos`,\n \"/opt/homebrew/bin/onchainos\",\n \"/usr/local/bin/onchainos\",\n];\n\nexport interface OnchainOsStatus {\n loggedIn: boolean;\n email?: string;\n evmAddress?: `0x${string}`;\n solanaAddress?: string;\n}\n\nexport interface OnchainOsAddresses {\n /** Base / EVM address. */\n evm?: `0x${string}`;\n /** OKX X Layer address (EVM-compatible). */\n xlayer?: `0x${string}`;\n /** Solana base58 address. */\n solana?: string;\n}\n\nexport interface OnchainOsX402Payment {\n signature: string;\n authorization: Record;\n sessionCert?: string;\n}\n\nexport interface OnchainOsAdapterOptions {\n /** Override the CLI binary path. Defaults to env var, then PATH, then common installs. */\n bin?: string;\n /** Per-command timeout in ms. */\n timeoutMs?: number;\n}\n\nexport class OnchainOsCliError extends Error {\n constructor(\n message: string,\n readonly stderr?: string,\n readonly exitCode?: number | null,\n ) {\n super(message);\n this.name = \"OnchainOsCliError\";\n }\n}\n\n/** Resolve the onchainos binary using env var → PATH → common install locations. */\nexport function resolveOnchainosBin(override?: string): string {\n if (override) return override;\n const env = process.env.XCLAWROUTER_ONCHAINOS_BIN ?? process.env.ONCHAINOS_BIN;\n if (env) return env;\n const fallback = FALLBACK_CANDIDATES.find((candidate) => existsSync(candidate));\n return fallback ?? DEFAULT_BIN;\n}\n\nasync function runCli(bin: string, args: string[], opts: { timeoutMs: number }): Promise {\n try {\n const { stdout } = await execFileAsync(bin, args, {\n timeout: opts.timeoutMs,\n maxBuffer: 8 * 1024 * 1024,\n });\n return stdout;\n } catch (err) {\n throw wrapCliError(err, bin, args);\n }\n}\n\nfunction wrapCliError(err: unknown, bin: string, args: string[]): OnchainOsCliError {\n const e = err as NodeJS.ErrnoException & {\n stderr?: string;\n code?: string | number | null;\n };\n if (e.code === \"ENOENT\") {\n return new OnchainOsCliError(\n `onchainos CLI not found at \"${bin}\". Install OKX's agentic wallet CLI ` +\n `(https://web3.okx.com/onchainos) and ensure it is on PATH, or set ` +\n `XCLAWROUTER_ONCHAINOS_BIN to the binary location.`,\n );\n }\n return new OnchainOsCliError(\n `onchainos ${args.join(\" \")} failed: ${e.message}`,\n e.stderr,\n typeof e.code === \"number\" ? e.code : null,\n );\n}\n\nfunction parseJson(stdout: string, label: string): T {\n const trimmed = stdout.trim();\n if (!trimmed) {\n throw new OnchainOsCliError(`onchainos ${label}: empty output`);\n }\n try {\n return JSON.parse(trimmed) as T;\n } catch (err) {\n throw new OnchainOsCliError(\n `onchainos ${label}: invalid JSON output — ${(err as Error).message}\\n${trimmed.slice(0, 500)}`,\n );\n }\n}\n\n/**\n * Many onchainos commands wrap their result in `{ data: ... }`. Some return the\n * payload directly. Accept both shapes so callers don't have to care.\n */\nfunction unwrapData(parsed: unknown): T {\n if (parsed && typeof parsed === \"object\" && \"data\" in parsed) {\n const inner = (parsed as { data?: unknown }).data;\n if (inner !== undefined && inner !== null) return inner as T;\n }\n return parsed as T;\n}\n\n/**\n * Pull a single address string out of whatever shape onchainos returned for a\n * given chain. The CLI is inconsistent across builds: it may emit a bare\n * string, an array of strings, or an array of objects with `address`/`value`\n * fields. We accept all three.\n */\nfunction pickAddressString(value: unknown): string | undefined {\n if (!value) return undefined;\n if (typeof value === \"string\") return value.trim() || undefined;\n if (Array.isArray(value)) {\n for (const item of value) {\n const found = pickAddressString(item);\n if (found) return found;\n }\n return undefined;\n }\n if (typeof value === \"object\") {\n const obj = value as Record;\n for (const key of [\"address\", \"evmAddress\", \"publicAddress\", \"value\", \"addr\"]) {\n const candidate = obj[key];\n if (typeof candidate === \"string\" && candidate.trim()) return candidate.trim();\n }\n }\n return undefined;\n}\n\nfunction pickEvmAddress(value: unknown): `0x${string}` | undefined {\n const addr = pickAddressString(value);\n if (!addr || !addr.startsWith(\"0x\") || addr.length !== 42) return undefined;\n return addr as `0x${string}`;\n}\n\nexport class OnchainOsAdapter {\n private readonly bin: string;\n private readonly timeoutMs: number;\n\n constructor(opts: OnchainOsAdapterOptions = {}) {\n this.bin = resolveOnchainosBin(opts.bin);\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n /** Quick, synchronous probe — does the binary exist and respond to --version? */\n isInstalled(): boolean {\n try {\n execFileSync(this.bin, [\"--version\"], {\n encoding: \"utf-8\",\n stdio: \"pipe\",\n timeout: 5_000,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n async status(): Promise {\n const stdout = await runCli(this.bin, [\"wallet\", \"status\"], {\n timeoutMs: this.timeoutMs,\n });\n const raw = unwrapData<{\n loggedIn?: boolean;\n connected?: boolean;\n email?: string;\n evmAddress?: string;\n evm?: string;\n solanaAddress?: string;\n solana?: string;\n }>(parseJson(stdout, \"wallet status\"));\n\n const loggedIn = Boolean(raw.loggedIn ?? raw.connected);\n const evmAddress = (raw.evmAddress ?? raw.evm) as `0x${string}` | undefined;\n const solanaAddress = raw.solanaAddress ?? raw.solana;\n return {\n loggedIn,\n email: raw.email,\n evmAddress: evmAddress?.startsWith(\"0x\") ? evmAddress : undefined,\n solanaAddress,\n };\n }\n\n /**\n * Fetch the wallet's addresses across chains. Use this as a fallback when\n * `wallet status` doesn't include `evmAddress` — some onchainos builds omit\n * the address from status but still expose it via `wallet addresses`.\n *\n * Tolerates the three shapes onchainos has shipped for each chain entry:\n * - bare string: `\"0xabc...\"`\n * - array of strings: `[\"0xabc...\", \"0xdef...\"]`\n * - array of objects: `[{ address: \"0xabc...\", chain: \"base\" }, ...]`\n */\n async addresses(): Promise {\n const stdout = await runCli(this.bin, [\"wallet\", \"addresses\"], {\n timeoutMs: this.timeoutMs,\n });\n const raw = unwrapData<{\n evm?: unknown;\n base?: unknown;\n xlayer?: unknown;\n solana?: unknown;\n }>(parseJson(stdout, \"wallet addresses\"));\n\n return {\n evm: pickEvmAddress(raw.evm ?? raw.base),\n xlayer: pickEvmAddress(raw.xlayer),\n solana: pickAddressString(raw.solana),\n };\n }\n\n async login(email: string): Promise {\n if (!email.includes(\"@\")) {\n throw new Error(`Invalid email address: ${email}`);\n }\n // Login involves an interactive verification step; allow more time.\n await runCli(this.bin, [\"wallet\", \"login\", email], { timeoutMs: 5 * 60_000 });\n }\n\n async logout(): Promise {\n await runCli(this.bin, [\"wallet\", \"logout\"], { timeoutMs: this.timeoutMs });\n }\n\n /**\n * Sign an x402 payment via onchainos. Pass through the full `accepts` array\n * from the 402 response — onchainos picks the chain/scheme it can satisfy.\n */\n async signX402Payment(accepts: unknown[]): Promise {\n const acceptsJson = JSON.stringify(accepts);\n const stdout = await runCli(this.bin, [\"payment\", \"x402-pay\", \"--accepts\", acceptsJson], {\n timeoutMs: PAYMENT_TIMEOUT_MS,\n });\n const parsed = parseJson(stdout, \"payment x402-pay\");\n const result = unwrapData>(parsed);\n if (!result.signature || typeof result.signature !== \"string\") {\n throw new OnchainOsCliError(\n `onchainos payment x402-pay returned no signature: ${JSON.stringify(parsed).slice(0, 500)}`,\n );\n }\n if (!result.authorization || typeof result.authorization !== \"object\") {\n throw new OnchainOsCliError(\n `onchainos payment x402-pay returned no authorization: ${JSON.stringify(parsed).slice(0, 500)}`,\n );\n }\n return {\n signature: result.signature,\n authorization: result.authorization as Record,\n sessionCert: typeof result.sessionCert === \"string\" ? result.sessionCert : undefined,\n };\n }\n}\n","/**\n * XClawRouter wallet resolution.\n *\n * Wallet identity is resolved in this order:\n * 1. OKX onchainos CLI (if installed AND user is logged in) — preferred.\n * Private keys never enter this process; signing happens via\n * `onchainos payment x402-pay`. See onchainos-adapter.ts.\n * 2. Saved wallet.key file (legacy BIP-39 path — preserved for existing users)\n * 3. BLOCKRUN_WALLET_KEY env var (legacy)\n * 4. Auto-generated BIP-39 wallet — **opt-in only**, gated behind\n * `XCLAWROUTER_USE_LOCAL_WALLET=1`. On a fresh install with no OKX\n * wallet, resolution throws `OnchainOsRequiredError` instead of silently\n * generating a local key. This is the fix for \"一装就生成本地 wallet\"\n * — users should be guided to install/login onchainos, not handed a\n * local key they don't realize is in play.\n */\n\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { readTextFile } from \"./fs-read.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport type { ProviderAuthMethod, ProviderAuthContext, ProviderAuthResult } from \"./types.js\";\nimport {\n generateWalletMnemonic,\n isValidMnemonic,\n deriveSolanaKeyBytes,\n deriveAllKeys,\n getSolanaAddress,\n} from \"./wallet.js\";\nimport { OnchainOsAdapter } from \"./onchainos-adapter.js\";\n\n// ---------------------------------------------------------------------------\n// OKX onchainos detection\n// ---------------------------------------------------------------------------\n\n/**\n * Result of attempting to use the OKX onchainos Agentic Wallet.\n *\n * Every non-`ok` variant must be distinguishable by the caller — otherwise\n * users who half-installed onchainos, forgot to log in, or hit a transient CLI\n * error get the same silent local-key fallback and never learn why their OKX\n * wallet wasn't picked up.\n *\n * - `ok` — onchainos is installed, logged in, and we have a usable EVM address.\n * - `no-binary` — onchainos CLI is not on PATH. Tip handled at the call site\n * (companion onboarding-tip issue covers when/how to suggest installing).\n * - `not-logged-in` — binary is installed but `wallet status` reports\n * `loggedIn: false`. User just needs to run `onchainos login`.\n * - `status-error` — `wallet status` exited non-zero, timed out, or returned\n * malformed output. `reason` carries the underlying CLI error message.\n * - `no-evm-address` — status is logged in but neither `wallet status` nor the\n * `wallet addresses` fallback yielded an EVM address (e.g. a Solana-only\n * account).\n * - `addresses-error` — status was logged in without an `evmAddress`, but the\n * `wallet addresses` fallback itself failed. `reason` carries the CLI error.\n */\nexport type OnchainOsDetectionResult =\n | { kind: \"ok\"; address: `0x${string}`; email?: string; adapter: OnchainOsAdapter }\n | { kind: \"no-binary\" }\n | { kind: \"not-logged-in\" }\n | { kind: \"status-error\"; reason: string }\n | { kind: \"no-evm-address\" }\n | { kind: \"addresses-error\"; reason: string };\n\nfunction errorReason(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\n/**\n * Detect an OKX onchainos wallet, returning a discriminated result so callers\n * can surface a tailored warning per failure mode instead of silently falling\n * back to a local key.\n *\n * Some onchainos builds omit `evmAddress` from `wallet status`; when the user\n * is logged in but status has no address, fall back to `wallet addresses` to\n * recover the Base/EVM address. Without this fallback, the router would\n * incorrectly think there is no agentic wallet and silently generate a fresh\n * local key — sending users to a different address than their OKX wallet.\n */\nexport async function detectOnchainosWallet(): Promise {\n const adapter = new OnchainOsAdapter();\n if (!adapter.isInstalled()) return { kind: \"no-binary\" };\n\n let status;\n try {\n status = await adapter.status();\n } catch (err) {\n return { kind: \"status-error\", reason: errorReason(err) };\n }\n\n if (!status.loggedIn) return { kind: \"not-logged-in\" };\n\n let evmAddress = status.evmAddress;\n if (!evmAddress) {\n try {\n const addresses = await adapter.addresses();\n if (addresses.evm) evmAddress = addresses.evm;\n } catch (err) {\n return { kind: \"addresses-error\", reason: errorReason(err) };\n }\n }\n\n if (!evmAddress) return { kind: \"no-evm-address\" };\n return { kind: \"ok\", address: evmAddress, email: status.email, adapter };\n}\n\n/** URL where users can download / read about OKX onchainos. */\nexport const ONCHAINOS_DOWNLOAD_URL = \"https://web3.okx.com/onchainos\";\n\n/**\n * Curl-able installer script for the onchainos binary. Hosted by OKX in the\n * onchainos-skills repo. Shared between `xclawrouter setup` (auto-install on\n * first launch) and `scripts/reinstall.sh` (curl-one-liner install path) so a\n * URL move only needs to happen in one place on the TS side.\n *\n * NOTE: the shell installer (`scripts/reinstall.sh`) duplicates this URL as a\n * bash variable because POSIX shell can't import TS. Keep them in sync.\n */\nexport const ONCHAINOS_INSTALLER_URL =\n \"https://raw.githubusercontent.com/okx/onchainos-skills/main/install.sh\";\n\n/**\n * Thrown when a fresh install has no OKX wallet AND no legacy saved wallet,\n * AND the user has not explicitly opted into local-key generation via\n * `XCLAWROUTER_USE_LOCAL_WALLET=1`. Callers should surface the message\n * verbatim — it contains the next-step commands the user needs.\n */\nexport class OnchainOsRequiredError extends Error {\n constructor(public readonly detection: OnchainOsDetectionResult) {\n const notInstalled = detection.kind === \"no-binary\";\n super(\n \"No wallet available.\\n\" +\n \"\\n\" +\n \"XClawRouter uses OKX Agentic Wallet (onchainos). \" +\n (notInstalled\n ? \"onchainos is not installed yet.\\n\"\n : \"onchainos is installed but you're not logged in yet.\\n\") +\n \"\\n\" +\n \"Run this one command to install + log in:\\n\" +\n \" npx @blockrun/xclawrouter setup\\n\" +\n \"\\n\" +\n \"It will install the onchainos binary (if needed) and prompt you for\\n\" +\n \"email + OTP. Then restart the gateway: openclaw gateway restart\\n\" +\n \"\\n\" +\n \"Opt-out (legacy local BIP-39 wallet — you manage backups yourself):\\n\" +\n \" export XCLAWROUTER_USE_LOCAL_WALLET=1\\n\" +\n \" openclaw gateway restart\\n\",\n );\n this.name = \"OnchainOsRequiredError\";\n }\n}\n\n/**\n * Severity for each line in the Agentic Wallet status block. Lets callers\n * route the block through a structured logger (e.g. OpenClaw's\n * `api.logger.info` / `.warn`) without losing the install-state-vs.-failure\n * distinction, while plain stdout callers can just print all lines.\n *\n * - `info` — neutral confirmation (e.g. \"✓ installed\", \"→ Run: …\").\n * - `warn` — failure or missing-state marker (e.g. \"⚠ not installed\",\n * \"✗ not logged in\"). Anything the user needs to *act on*.\n */\nexport type AgenticWalletStatusLine = { level: \"info\" | \"warn\"; text: string };\n\n/**\n * Render the multi-line \"Agentic Wallet status\" block — the canonical\n * answer to \"is OKX onchainos installed, am I logged in, and what should I\n * do about it?\". Emitted on every non-OKX launch so users never wonder why\n * we silently fell back to a local key.\n *\n * Pure function returning structured lines (no `[XClawRouter]` prefix, no\n * console calls) so it can be routed to:\n * - plain stdout (`src/cli.ts`, via `console.log` after adding the\n * `[XClawRouter] ` prefix), or\n * - OpenClaw's structured logger (`src/index.ts`, via `api.logger.info` /\n * `api.logger.warn` — the plugin name prefix comes from the logger).\n *\n * Returns `[]` for `kind: \"ok\"` — the existing `Using OKX onchainos wallet:`\n * line already conveys \"Agentic Wallet ready\" and a status banner above it\n * would be noise.\n */\nexport function formatAgenticWalletStatus(\n detection: OnchainOsDetectionResult,\n): AgenticWalletStatusLine[] {\n switch (detection.kind) {\n case \"ok\":\n // Status is implicit in the `Using OKX onchainos wallet: …` log that\n // follows. Don't emit a banner on the happy path.\n return [];\n case \"no-binary\":\n return [\n { level: \"warn\", text: \"⚠ OKX Agentic Wallet not installed\" },\n { level: \"info\", text: ` → Download: ${ONCHAINOS_DOWNLOAD_URL}` },\n { level: \"info\", text: \" → After install, run: onchainos login\" },\n ];\n case \"not-logged-in\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed\" },\n { level: \"warn\", text: \"✗ Login status: not logged in\" },\n { level: \"info\", text: \" → Run: onchainos login\" },\n ];\n case \"status-error\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed\" },\n {\n level: \"warn\",\n text: `✗ Login status: unknown — status check failed: ${detection.reason}`,\n },\n ];\n case \"no-evm-address\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed (logged in)\" },\n { level: \"warn\", text: \"✗ No EVM address found (Solana-only account?)\" },\n ];\n case \"addresses-error\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed (logged in)\" },\n { level: \"warn\", text: `✗ Could not read wallet addresses: ${detection.reason}` },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Payment chain persistence (used by both paths)\n// ---------------------------------------------------------------------------\n\nconst WALLET_DIR = join(homedir(), \".openclaw\", \"blockrun\");\nconst WALLET_FILE = join(WALLET_DIR, \"wallet.key\");\nconst MNEMONIC_FILE = join(WALLET_DIR, \"mnemonic\");\nconst CHAIN_FILE = join(WALLET_DIR, \"payment-chain\");\n\nexport { WALLET_DIR, WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE };\n\nexport async function savePaymentChain(chain: \"base\" | \"solana\"): Promise {\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(CHAIN_FILE, chain + \"\\n\", { mode: 0o600 });\n}\n\nexport async function loadPaymentChain(): Promise<\"base\" | \"solana\"> {\n try {\n const content = (await readTextFile(CHAIN_FILE)).trim();\n if (content === \"solana\") return \"solana\";\n return \"base\";\n } catch {\n return \"base\";\n }\n}\n\n/**\n * Resolve payment chain: env var → persisted file → default \"base\".\n * Accepts both XCLAWROUTER_PAYMENT_CHAIN (preferred) and CLAWROUTER_PAYMENT_CHAIN\n * (legacy, deprecated — will be removed after one release).\n */\nexport async function resolvePaymentChain(): Promise<\"base\" | \"solana\"> {\n const env = process.env.XCLAWROUTER_PAYMENT_CHAIN ?? process.env.CLAWROUTER_PAYMENT_CHAIN;\n if (env === \"solana\") return \"solana\";\n if (env === \"base\") return \"base\";\n return loadPaymentChain();\n}\n\n// ---------------------------------------------------------------------------\n// Local-key path (used when onchainos is unavailable)\n// ---------------------------------------------------------------------------\n\nasync function loadSavedWallet(): Promise {\n try {\n const key = (await readTextFile(WALLET_FILE)).trim();\n if (key.startsWith(\"0x\") && key.length === 66) {\n console.log(`[XClawRouter] ✓ Loaded existing wallet from ${WALLET_FILE}`);\n return key;\n }\n console.error(`[XClawRouter] ✗ CRITICAL: Wallet file exists but has invalid format!`);\n console.error(`[XClawRouter] File: ${WALLET_FILE}`);\n console.error(`[XClawRouter] Expected: 0x followed by 64 hex characters (66 chars total)`);\n throw new Error(\n `Wallet file at ${WALLET_FILE} is corrupted or has wrong format. ` +\n `Refusing to auto-generate new wallet to protect existing funds. ` +\n `Restore your backup key or set BLOCKRUN_WALLET_KEY environment variable.`,\n );\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n if (err instanceof Error && err.message.includes(\"Refusing to auto-generate\")) {\n throw err;\n }\n throw new Error(\n `Cannot read wallet file at ${WALLET_FILE}: ${err instanceof Error ? err.message : String(err)}.`,\n { cause: err },\n );\n }\n }\n return undefined;\n}\n\nasync function loadMnemonic(): Promise {\n try {\n const mnemonic = (await readTextFile(MNEMONIC_FILE)).trim();\n if (mnemonic && isValidMnemonic(mnemonic)) return mnemonic;\n console.warn(`[XClawRouter] ⚠ Mnemonic file exists but has invalid format — ignoring`);\n return undefined;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.warn(`[XClawRouter] ⚠ Cannot read mnemonic file — ignoring`);\n }\n }\n return undefined;\n}\n\nasync function saveMnemonic(mnemonic: string): Promise {\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(MNEMONIC_FILE, mnemonic + \"\\n\", { mode: 0o600 });\n}\n\nasync function generateAndSaveWallet(): Promise<{\n key: string;\n address: string;\n mnemonic: string;\n solanaPrivateKeyBytes: Uint8Array;\n}> {\n const existingMnemonic = await loadMnemonic();\n if (existingMnemonic) {\n throw new Error(\n `Mnemonic file exists at ${MNEMONIC_FILE} but wallet.key is missing.\\n` +\n `Refusing to generate a new wallet to protect existing funds.`,\n );\n }\n\n const mnemonic = generateWalletMnemonic();\n const derived = deriveAllKeys(mnemonic);\n\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(WALLET_FILE, derived.evmPrivateKey + \"\\n\", { mode: 0o600 });\n await writeFile(MNEMONIC_FILE, mnemonic + \"\\n\", { mode: 0o600 });\n\n const verification = (await readTextFile(WALLET_FILE)).trim();\n if (verification !== derived.evmPrivateKey) {\n throw new Error(\"Wallet file verification failed - content mismatch\");\n }\n\n return {\n key: derived.evmPrivateKey,\n address: derived.evmAddress,\n mnemonic,\n solanaPrivateKeyBytes: derived.solanaPrivateKeyBytes,\n };\n}\n\n/**\n * Result of wallet resolution.\n *\n * - `source: \"okx\"` — OKX onchainos wallet is connected. `key` is undefined\n * because signing is delegated to onchainos (no private key in this process).\n * `onchainos` is the adapter the proxy uses to sign x402 payments.\n * - `source: \"saved\" | \"env\" | \"config\" | \"generated\"` — local key path.\n */\nexport type WalletResolution = {\n key?: string;\n address: string;\n source: \"saved\" | \"env\" | \"config\" | \"generated\" | \"okx\";\n mnemonic?: string;\n solanaPrivateKeyBytes?: Uint8Array;\n onchainos?: OnchainOsAdapter;\n email?: string;\n /**\n * The outcome of OKX onchainos detection. Present whenever\n * `resolveOrGenerateWalletKey` ran the detection — callers use this to\n * decide which warning, if any, to show the user. `kind: \"ok\"` accompanies\n * `source: \"okx\"`; any other kind means we fell back to a local key.\n */\n onchainosDetection?: OnchainOsDetectionResult;\n};\n\n/**\n * Resolve the wallet identity, preferring OKX onchainos when available.\n *\n * If onchainos is installed and logged in, returns its EVM address as the\n * wallet identity (no local key). Otherwise falls back to the legacy\n * local-key flow: saved file → env var → auto-generate.\n */\nexport async function resolveOrGenerateWalletKey(): Promise {\n // 1. Prefer OKX onchainos when installed + logged in.\n const onchainosDetection = await detectOnchainosWallet();\n if (onchainosDetection.kind === \"ok\") {\n return {\n address: onchainosDetection.address,\n source: \"okx\",\n onchainos: onchainosDetection.adapter,\n email: onchainosDetection.email,\n onchainosDetection,\n };\n }\n\n // 2. Legacy local-key path.\n const saved = await loadSavedWallet();\n if (saved) {\n const account = privateKeyToAccount(saved as `0x${string}`);\n const mnemonic = await loadMnemonic();\n if (mnemonic) {\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n return {\n key: saved,\n address: account.address,\n source: \"saved\",\n mnemonic,\n solanaPrivateKeyBytes: solanaKeyBytes,\n onchainosDetection,\n };\n }\n return { key: saved, address: account.address, source: \"saved\", onchainosDetection };\n }\n\n const envKey = process.env.BLOCKRUN_WALLET_KEY;\n if (typeof envKey === \"string\" && envKey.startsWith(\"0x\") && envKey.length === 66) {\n const account = privateKeyToAccount(envKey as `0x${string}`);\n const mnemonic = await loadMnemonic();\n if (mnemonic) {\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n return {\n key: envKey,\n address: account.address,\n source: \"env\",\n mnemonic,\n solanaPrivateKeyBytes: solanaKeyBytes,\n onchainosDetection,\n };\n }\n return { key: envKey, address: account.address, source: \"env\", onchainosDetection };\n }\n\n // Fresh install with no OKX wallet AND no legacy saved key.\n // Refuse to silently generate a local BIP-39 wallet — users have been\n // surprised by \"一装就生成本地 wallet\" too many times. They must either:\n // (a) install + log in to onchainos, OR\n // (b) explicitly opt into the legacy local-key path.\n if (process.env.XCLAWROUTER_USE_LOCAL_WALLET !== \"1\") {\n throw new OnchainOsRequiredError(onchainosDetection);\n }\n\n const result = await generateAndSaveWallet();\n return {\n key: result.key,\n address: result.address,\n source: \"generated\",\n mnemonic: result.mnemonic,\n solanaPrivateKeyBytes: result.solanaPrivateKeyBytes,\n onchainosDetection,\n };\n}\n\n/** Restore wallet.key from an existing mnemonic file. */\nexport async function recoverWalletFromMnemonic(): Promise {\n const mnemonic = await loadMnemonic();\n if (!mnemonic) {\n console.error(`[XClawRouter] No mnemonic found at ${MNEMONIC_FILE}`);\n process.exit(1);\n }\n\n const existing = await loadSavedWallet().catch(() => undefined);\n if (existing) {\n console.error(`[XClawRouter] wallet.key already exists at ${WALLET_FILE}`);\n process.exit(1);\n }\n\n const derived = deriveAllKeys(mnemonic);\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n const solanaAddress = await getSolanaAddress(solanaKeyBytes).catch(() => undefined);\n\n console.log(`[XClawRouter] Derived EVM Address : ${derived.evmAddress}`);\n if (solanaAddress) console.log(`[XClawRouter] Derived Solana Address: ${solanaAddress}`);\n\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(WALLET_FILE, derived.evmPrivateKey + \"\\n\", { mode: 0o600 });\n console.log(`[XClawRouter] ✓ wallet.key restored at ${WALLET_FILE}`);\n}\n\n/** Set up Solana for an existing local-key wallet. Not used in OKX mode. */\nexport async function setupSolana(): Promise<{\n mnemonic: string;\n solanaPrivateKeyBytes: Uint8Array;\n}> {\n const existing = await loadMnemonic();\n if (existing) throw new Error(\"Solana wallet already set up at \" + MNEMONIC_FILE);\n\n const savedKey = await loadSavedWallet();\n if (!savedKey) {\n throw new Error(\n \"No EVM wallet found. Run XClawRouter first to generate a wallet before setting up Solana.\",\n );\n }\n\n const mnemonic = generateWalletMnemonic();\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n await saveMnemonic(mnemonic);\n\n return { mnemonic, solanaPrivateKeyBytes: solanaKeyBytes };\n}\n\n/** @deprecated Legacy manual-entry auth. */\nexport const walletKeyAuth: ProviderAuthMethod = {\n id: \"wallet-key\",\n label: \"Wallet Private Key\",\n hint: \"Enter your EVM wallet private key (0x...) for x402 payments\",\n kind: \"api_key\",\n run: async (ctx: ProviderAuthContext): Promise => {\n const key = await ctx.prompter.text({\n message: \"Enter your wallet private key (0x...)\",\n validate: (value: string) => {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"0x\")) return \"Key must start with 0x\";\n if (trimmed.length !== 66) return \"Key must be 66 characters\";\n if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed)) return \"Key must be valid hex\";\n return undefined;\n },\n });\n\n if (!key || typeof key !== \"string\") throw new Error(\"Wallet key is required\");\n\n return {\n profiles: [{ profileId: \"default\", credential: { apiKey: key.trim() } }],\n notes: [\"Wallet key stored securely in OpenClaw credentials.\"],\n };\n },\n};\n\n/** @deprecated Legacy env-var auth. */\nexport const envKeyAuth: ProviderAuthMethod = {\n id: \"env-key\",\n label: \"Environment Variable\",\n hint: \"Use BLOCKRUN_WALLET_KEY environment variable\",\n kind: \"api_key\",\n run: async (): Promise => {\n const key = process.env.BLOCKRUN_WALLET_KEY;\n if (!key) throw new Error(\"BLOCKRUN_WALLET_KEY environment variable is not set.\");\n return {\n profiles: [{ profileId: \"default\", credential: { apiKey: key.trim() } }],\n notes: [\"Using wallet key from BLOCKRUN_WALLET_KEY environment variable.\"],\n };\n },\n};\n","'use strict'\n\nmodule.exports = {\n kClose: Symbol('close'),\n kDestroy: Symbol('destroy'),\n kDispatch: Symbol('dispatch'),\n kUrl: Symbol('url'),\n kWriting: Symbol('writing'),\n kResuming: Symbol('resuming'),\n kQueue: Symbol('queue'),\n kConnect: Symbol('connect'),\n kConnecting: Symbol('connecting'),\n kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'),\n kKeepAliveMaxTimeout: Symbol('max keep alive timeout'),\n kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'),\n kKeepAliveTimeoutValue: Symbol('keep alive timeout'),\n kKeepAlive: Symbol('keep alive'),\n kHeadersTimeout: Symbol('headers timeout'),\n kBodyTimeout: Symbol('body timeout'),\n kServerName: Symbol('server name'),\n kLocalAddress: Symbol('local address'),\n kHost: Symbol('host'),\n kNoRef: Symbol('no ref'),\n kBodyUsed: Symbol('used'),\n kBody: Symbol('abstracted request body'),\n kRunning: Symbol('running'),\n kBlocking: Symbol('blocking'),\n kPending: Symbol('pending'),\n kSize: Symbol('size'),\n kBusy: Symbol('busy'),\n kQueued: Symbol('queued'),\n kFree: Symbol('free'),\n kConnected: Symbol('connected'),\n kClosed: Symbol('closed'),\n kNeedDrain: Symbol('need drain'),\n kReset: Symbol('reset'),\n kDestroyed: Symbol.for('nodejs.stream.destroyed'),\n kResume: Symbol('resume'),\n kOnError: Symbol('on error'),\n kMaxHeadersSize: Symbol('max headers size'),\n kRunningIdx: Symbol('running index'),\n kPendingIdx: Symbol('pending index'),\n kError: Symbol('error'),\n kClients: Symbol('clients'),\n kClient: Symbol('client'),\n kParser: Symbol('parser'),\n kOnDestroyed: Symbol('destroy callbacks'),\n kPipelining: Symbol('pipelining'),\n kSocket: Symbol('socket'),\n kHostHeader: Symbol('host header'),\n kConnector: Symbol('connector'),\n kStrictContentLength: Symbol('strict content length'),\n kMaxRedirections: Symbol('maxRedirections'),\n kMaxRequests: Symbol('maxRequestsPerClient'),\n kProxy: Symbol('proxy agent options'),\n kCounter: Symbol('socket request counter'),\n kMaxResponseSize: Symbol('max response size'),\n kHTTP2Session: Symbol('http2Session'),\n kHTTP2SessionState: Symbol('http2Session state'),\n kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),\n kConstruct: Symbol('constructable'),\n kListeners: Symbol('listeners'),\n kHTTPContext: Symbol('http context'),\n kMaxConcurrentStreams: Symbol('max concurrent streams'),\n kHTTP2InitialWindowSize: Symbol('http2 initial window size'),\n kHTTP2ConnectionWindowSize: Symbol('http2 connection window size'),\n kEnableConnectProtocol: Symbol('http2session connect protocol'),\n kRemoteSettings: Symbol('http2session remote settings'),\n kHTTP2Stream: Symbol('http2session client stream'),\n kPingInterval: Symbol('ping interval'),\n kNoProxyAgent: Symbol('no proxy agent'),\n kHttpProxyAgent: Symbol('http proxy agent'),\n kHttpsProxyAgent: Symbol('https proxy agent'),\n kSocks5ProxyAgent: Symbol('socks5 proxy agent')\n}\n","'use strict'\n\n/**\n * This module offers an optimized timer implementation designed for scenarios\n * where high precision is not critical.\n *\n * The timer achieves faster performance by using a low-resolution approach,\n * with an accuracy target of within 500ms. This makes it particularly useful\n * for timers with delays of 1 second or more, where exact timing is less\n * crucial.\n *\n * It's important to note that Node.js timers are inherently imprecise, as\n * delays can occur due to the event loop being blocked by other operations.\n * Consequently, timers may trigger later than their scheduled time.\n */\n\n/**\n * The fastNow variable contains the internal fast timer clock value.\n *\n * @type {number}\n */\nlet fastNow = 0\n\n/**\n * RESOLUTION_MS represents the target resolution time in milliseconds.\n *\n * @type {number}\n * @default 1000\n */\nconst RESOLUTION_MS = 1e3\n\n/**\n * TICK_MS defines the desired interval in milliseconds between each tick.\n * The target value is set to half the resolution time, minus 1 ms, to account\n * for potential event loop overhead.\n *\n * @type {number}\n * @default 499\n */\nconst TICK_MS = (RESOLUTION_MS >> 1) - 1\n\n/**\n * fastNowTimeout is a Node.js timer used to manage and process\n * the FastTimers stored in the `fastTimers` array.\n *\n * @type {NodeJS.Timeout}\n */\nlet fastNowTimeout\n\n/**\n * The kFastTimer symbol is used to identify FastTimer instances.\n *\n * @type {Symbol}\n */\nconst kFastTimer = Symbol('kFastTimer')\n\n/**\n * The fastTimers array contains all active FastTimers.\n *\n * @type {FastTimer[]}\n */\nconst fastTimers = []\n\n/**\n * These constants represent the various states of a FastTimer.\n */\n\n/**\n * The `NOT_IN_LIST` constant indicates that the FastTimer is not included\n * in the `fastTimers` array. Timers with this status will not be processed\n * during the next tick by the `onTick` function.\n *\n * A FastTimer can be re-added to the `fastTimers` array by invoking the\n * `refresh` method on the FastTimer instance.\n *\n * @type {-2}\n */\nconst NOT_IN_LIST = -2\n\n/**\n * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled\n * for removal from the `fastTimers` array. A FastTimer in this state will\n * be removed in the next tick by the `onTick` function and will no longer\n * be processed.\n *\n * This status is also set when the `clear` method is called on the FastTimer instance.\n *\n * @type {-1}\n */\nconst TO_BE_CLEARED = -1\n\n/**\n * The `PENDING` constant signifies that the FastTimer is awaiting processing\n * in the next tick by the `onTick` function. Timers with this status will have\n * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick.\n *\n * @type {0}\n */\nconst PENDING = 0\n\n/**\n * The `ACTIVE` constant indicates that the FastTimer is active and waiting\n * for its timer to expire. During the next tick, the `onTick` function will\n * check if the timer has expired, and if so, it will execute the associated callback.\n *\n * @type {1}\n */\nconst ACTIVE = 1\n\n/**\n * The onTick function processes the fastTimers array.\n *\n * @returns {void}\n */\nfunction onTick () {\n /**\n * Increment the fastNow value by the TICK_MS value, despite the actual time\n * that has passed since the last tick. This approach ensures independence\n * from the system clock and delays caused by a blocked event loop.\n *\n * @type {number}\n */\n fastNow += TICK_MS\n\n /**\n * The `idx` variable is used to iterate over the `fastTimers` array.\n * Expired timers are removed by replacing them with the last element in the array.\n * Consequently, `idx` is only incremented when the current element is not removed.\n *\n * @type {number}\n */\n let idx = 0\n\n /**\n * The len variable will contain the length of the fastTimers array\n * and will be decremented when a FastTimer should be removed from the\n * fastTimers array.\n *\n * @type {number}\n */\n let len = fastTimers.length\n\n while (idx < len) {\n /**\n * @type {FastTimer}\n */\n const timer = fastTimers[idx]\n\n // If the timer is in the ACTIVE state and the timer has expired, it will\n // be processed in the next tick.\n if (timer._state === PENDING) {\n // Set the _idleStart value to the fastNow value minus the TICK_MS value\n // to account for the time the timer was in the PENDING state.\n timer._idleStart = fastNow - TICK_MS\n timer._state = ACTIVE\n } else if (\n timer._state === ACTIVE &&\n fastNow >= timer._idleStart + timer._idleTimeout\n ) {\n timer._state = TO_BE_CLEARED\n timer._idleStart = -1\n timer._onTimeout(timer._timerArg)\n }\n\n if (timer._state === TO_BE_CLEARED) {\n timer._state = NOT_IN_LIST\n\n // Move the last element to the current index and decrement len if it is\n // not the only element in the array.\n if (--len !== 0) {\n fastTimers[idx] = fastTimers[len]\n }\n } else {\n ++idx\n }\n }\n\n // Set the length of the fastTimers array to the new length and thus\n // removing the excess FastTimers elements from the array.\n fastTimers.length = len\n\n // If there are still active FastTimers in the array, refresh the Timer.\n // If there are no active FastTimers, the timer will be refreshed again\n // when a new FastTimer is instantiated.\n if (fastTimers.length !== 0) {\n refreshTimeout()\n }\n}\n\nfunction refreshTimeout () {\n // If the fastNowTimeout is already set and the Timer has the refresh()-\n // method available, call it to refresh the timer.\n // Some timer objects returned by setTimeout may not have a .refresh()\n // method (e.g. mocked timers in tests).\n if (fastNowTimeout?.refresh) {\n fastNowTimeout.refresh()\n // fastNowTimeout is not instantiated yet or refresh is not availabe,\n // create a new Timer.\n } else {\n clearTimeout(fastNowTimeout)\n fastNowTimeout = setTimeout(onTick, TICK_MS)\n // If the Timer has an unref method, call it to allow the process to exit,\n // if there are no other active handles. When using fake timers or mocked\n // environments (like Jest), .unref() may not be defined,\n fastNowTimeout?.unref()\n }\n}\n\n/**\n * The `FastTimer` class is a data structure designed to store and manage\n * timer information.\n */\nclass FastTimer {\n [kFastTimer] = true\n\n /**\n * The state of the timer, which can be one of the following:\n * - NOT_IN_LIST (-2)\n * - TO_BE_CLEARED (-1)\n * - PENDING (0)\n * - ACTIVE (1)\n *\n * @type {-2|-1|0|1}\n * @private\n */\n _state = NOT_IN_LIST\n\n /**\n * The number of milliseconds to wait before calling the callback.\n *\n * @type {number}\n * @private\n */\n _idleTimeout = -1\n\n /**\n * The time in milliseconds when the timer was started. This value is used to\n * calculate when the timer should expire.\n *\n * @type {number}\n * @default -1\n * @private\n */\n _idleStart = -1\n\n /**\n * The function to be executed when the timer expires.\n * @type {Function}\n * @private\n */\n _onTimeout\n\n /**\n * The argument to be passed to the callback when the timer expires.\n *\n * @type {*}\n * @private\n */\n _timerArg\n\n /**\n * @constructor\n * @param {Function} callback A function to be executed after the timer\n * expires.\n * @param {number} delay The time, in milliseconds that the timer should wait\n * before the specified function or code is executed.\n * @param {*} arg\n */\n constructor (callback, delay, arg) {\n this._onTimeout = callback\n this._idleTimeout = delay\n this._timerArg = arg\n\n this.refresh()\n }\n\n /**\n * Sets the timer's start time to the current time, and reschedules the timer\n * to call its callback at the previously specified duration adjusted to the\n * current time.\n * Using this on a timer that has already called its callback will reactivate\n * the timer.\n *\n * @returns {void}\n */\n refresh () {\n // In the special case that the timer is not in the list of active timers,\n // add it back to the array to be processed in the next tick by the onTick\n // function.\n if (this._state === NOT_IN_LIST) {\n fastTimers.push(this)\n }\n\n // If the timer is the only active timer, refresh the fastNowTimeout for\n // better resolution.\n if (!fastNowTimeout || fastTimers.length === 1) {\n refreshTimeout()\n }\n\n // Setting the state to PENDING will cause the timer to be reset in the\n // next tick by the onTick function.\n this._state = PENDING\n }\n\n /**\n * The `clear` method cancels the timer, preventing it from executing.\n *\n * @returns {void}\n * @private\n */\n clear () {\n // Set the state to TO_BE_CLEARED to mark the timer for removal in the next\n // tick by the onTick function.\n this._state = TO_BE_CLEARED\n\n // Reset the _idleStart value to -1 to indicate that the timer is no longer\n // active.\n this._idleStart = -1\n }\n}\n\n/**\n * This module exports a setTimeout and clearTimeout function that can be\n * used as a drop-in replacement for the native functions.\n */\nmodule.exports = {\n /**\n * The setTimeout() method sets a timer which executes a function once the\n * timer expires.\n * @param {Function} callback A function to be executed after the timer\n * expires.\n * @param {number} delay The time, in milliseconds that the timer should\n * wait before the specified function or code is executed.\n * @param {*} [arg] An optional argument to be passed to the callback function\n * when the timer expires.\n * @returns {NodeJS.Timeout|FastTimer}\n */\n setTimeout (callback, delay, arg) {\n // If the delay is less than or equal to the RESOLUTION_MS value return a\n // native Node.js Timer instance.\n return delay <= RESOLUTION_MS\n ? setTimeout(callback, delay, arg)\n : new FastTimer(callback, delay, arg)\n },\n /**\n * The clearTimeout method cancels an instantiated Timer previously created\n * by calling setTimeout.\n *\n * @param {NodeJS.Timeout|FastTimer} timeout\n */\n clearTimeout (timeout) {\n // If the timeout is a FastTimer, call its own clear method.\n if (timeout[kFastTimer]) {\n /**\n * @type {FastTimer}\n */\n timeout.clear()\n // Otherwise it is an instance of a native NodeJS.Timeout, so call the\n // Node.js native clearTimeout function.\n } else {\n clearTimeout(timeout)\n }\n },\n /**\n * The setFastTimeout() method sets a fastTimer which executes a function once\n * the timer expires.\n * @param {Function} callback A function to be executed after the timer\n * expires.\n * @param {number} delay The time, in milliseconds that the timer should\n * wait before the specified function or code is executed.\n * @param {*} [arg] An optional argument to be passed to the callback function\n * when the timer expires.\n * @returns {FastTimer}\n */\n setFastTimeout (callback, delay, arg) {\n return new FastTimer(callback, delay, arg)\n },\n /**\n * The clearTimeout method cancels an instantiated FastTimer previously\n * created by calling setFastTimeout.\n *\n * @param {FastTimer} timeout\n */\n clearFastTimeout (timeout) {\n timeout.clear()\n },\n /**\n * The now method returns the value of the internal fast timer clock.\n *\n * @returns {number}\n */\n now () {\n return fastNow\n },\n /**\n * Trigger the onTick function to process the fastTimers array.\n * Exported for testing purposes only.\n * Marking as deprecated to discourage any use outside of testing.\n * @deprecated\n * @param {number} [delay=0] The delay in milliseconds to add to the now value.\n */\n tick (delay = 0) {\n fastNow += delay - RESOLUTION_MS + 1\n onTick()\n onTick()\n },\n /**\n * Reset FastTimers.\n * Exported for testing purposes only.\n * Marking as deprecated to discourage any use outside of testing.\n * @deprecated\n */\n reset () {\n fastNow = 0\n fastTimers.length = 0\n clearTimeout(fastNowTimeout)\n fastNowTimeout = null\n },\n /**\n * Exporting for testing purposes only.\n * Marking as deprecated to discourage any use outside of testing.\n * @deprecated\n */\n kFastTimer\n}\n","'use strict'\n\nconst kUndiciError = Symbol.for('undici.error.UND_ERR')\nclass UndiciError extends Error {\n constructor (message, options) {\n super(message, options)\n this.name = 'UndiciError'\n this.code = 'UND_ERR'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kUndiciError] === true\n }\n\n get [kUndiciError] () {\n return true\n }\n}\n\nconst kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT')\nclass ConnectTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ConnectTimeoutError'\n this.message = message || 'Connect Timeout Error'\n this.code = 'UND_ERR_CONNECT_TIMEOUT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kConnectTimeoutError] === true\n }\n\n get [kConnectTimeoutError] () {\n return true\n }\n}\n\nconst kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT')\nclass HeadersTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'HeadersTimeoutError'\n this.message = message || 'Headers Timeout Error'\n this.code = 'UND_ERR_HEADERS_TIMEOUT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kHeadersTimeoutError] === true\n }\n\n get [kHeadersTimeoutError] () {\n return true\n }\n}\n\nconst kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW')\nclass HeadersOverflowError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'HeadersOverflowError'\n this.message = message || 'Headers Overflow Error'\n this.code = 'UND_ERR_HEADERS_OVERFLOW'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kHeadersOverflowError] === true\n }\n\n get [kHeadersOverflowError] () {\n return true\n }\n}\n\nconst kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT')\nclass BodyTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'BodyTimeoutError'\n this.message = message || 'Body Timeout Error'\n this.code = 'UND_ERR_BODY_TIMEOUT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kBodyTimeoutError] === true\n }\n\n get [kBodyTimeoutError] () {\n return true\n }\n}\n\nconst kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG')\nclass InvalidArgumentError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'InvalidArgumentError'\n this.message = message || 'Invalid Argument Error'\n this.code = 'UND_ERR_INVALID_ARG'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kInvalidArgumentError] === true\n }\n\n get [kInvalidArgumentError] () {\n return true\n }\n}\n\nconst kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE')\nclass InvalidReturnValueError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'InvalidReturnValueError'\n this.message = message || 'Invalid Return Value Error'\n this.code = 'UND_ERR_INVALID_RETURN_VALUE'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kInvalidReturnValueError] === true\n }\n\n get [kInvalidReturnValueError] () {\n return true\n }\n}\n\nconst kAbortError = Symbol.for('undici.error.UND_ERR_ABORT')\nclass AbortError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'AbortError'\n this.message = message || 'The operation was aborted'\n this.code = 'UND_ERR_ABORT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kAbortError] === true\n }\n\n get [kAbortError] () {\n return true\n }\n}\n\nconst kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED')\nclass RequestAbortedError extends AbortError {\n constructor (message) {\n super(message)\n this.name = 'AbortError'\n this.message = message || 'Request aborted'\n this.code = 'UND_ERR_ABORTED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kRequestAbortedError] === true\n }\n\n get [kRequestAbortedError] () {\n return true\n }\n}\n\nconst kInformationalError = Symbol.for('undici.error.UND_ERR_INFO')\nclass InformationalError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'InformationalError'\n this.message = message || 'Request information'\n this.code = 'UND_ERR_INFO'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kInformationalError] === true\n }\n\n get [kInformationalError] () {\n return true\n }\n}\n\nconst kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH')\nclass RequestContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'RequestContentLengthMismatchError'\n this.message = message || 'Request body length does not match content-length header'\n this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kRequestContentLengthMismatchError] === true\n }\n\n get [kRequestContentLengthMismatchError] () {\n return true\n }\n}\n\nconst kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH')\nclass ResponseContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ResponseContentLengthMismatchError'\n this.message = message || 'Response body length does not match content-length header'\n this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kResponseContentLengthMismatchError] === true\n }\n\n get [kResponseContentLengthMismatchError] () {\n return true\n }\n}\n\nconst kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED')\nclass ClientDestroyedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ClientDestroyedError'\n this.message = message || 'The client is destroyed'\n this.code = 'UND_ERR_DESTROYED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kClientDestroyedError] === true\n }\n\n get [kClientDestroyedError] () {\n return true\n }\n}\n\nconst kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED')\nclass ClientClosedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ClientClosedError'\n this.message = message || 'The client is closed'\n this.code = 'UND_ERR_CLOSED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kClientClosedError] === true\n }\n\n get [kClientClosedError] () {\n return true\n }\n}\n\nconst kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET')\nclass SocketError extends UndiciError {\n constructor (message, socket) {\n super(message)\n this.name = 'SocketError'\n this.message = message || 'Socket error'\n this.code = 'UND_ERR_SOCKET'\n this.socket = socket\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kSocketError] === true\n }\n\n get [kSocketError] () {\n return true\n }\n}\n\nconst kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED')\nclass NotSupportedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'NotSupportedError'\n this.message = message || 'Not supported error'\n this.code = 'UND_ERR_NOT_SUPPORTED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kNotSupportedError] === true\n }\n\n get [kNotSupportedError] () {\n return true\n }\n}\n\nconst kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM')\nclass BalancedPoolMissingUpstreamError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MissingUpstreamError'\n this.message = message || 'No upstream has been added to the BalancedPool'\n this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kBalancedPoolMissingUpstreamError] === true\n }\n\n get [kBalancedPoolMissingUpstreamError] () {\n return true\n }\n}\n\nconst kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER')\nclass HTTPParserError extends Error {\n constructor (message, code, data) {\n super(message)\n this.name = 'HTTPParserError'\n this.code = code ? `HPE_${code}` : undefined\n this.data = data ? data.toString() : undefined\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kHTTPParserError] === true\n }\n\n get [kHTTPParserError] () {\n return true\n }\n}\n\nconst kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE')\nclass ResponseExceededMaxSizeError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ResponseExceededMaxSizeError'\n this.message = message || 'Response content exceeded max size'\n this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kResponseExceededMaxSizeError] === true\n }\n\n get [kResponseExceededMaxSizeError] () {\n return true\n }\n}\n\nconst kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY')\nclass RequestRetryError extends UndiciError {\n constructor (message, code, { headers, data }) {\n super(message)\n this.name = 'RequestRetryError'\n this.message = message || 'Request retry error'\n this.code = 'UND_ERR_REQ_RETRY'\n this.statusCode = code\n this.data = data\n this.headers = headers\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kRequestRetryError] === true\n }\n\n get [kRequestRetryError] () {\n return true\n }\n}\n\nconst kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE')\nclass ResponseError extends UndiciError {\n constructor (message, code, { headers, body }) {\n super(message)\n this.name = 'ResponseError'\n this.message = message || 'Response error'\n this.code = 'UND_ERR_RESPONSE'\n this.statusCode = code\n this.body = body\n this.headers = headers\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kResponseError] === true\n }\n\n get [kResponseError] () {\n return true\n }\n}\n\nconst kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS')\nclass SecureProxyConnectionError extends UndiciError {\n constructor (cause, message, options = {}) {\n super(message, { cause, ...options })\n this.name = 'SecureProxyConnectionError'\n this.message = message || 'Secure Proxy Connection failed'\n this.code = 'UND_ERR_PRX_TLS'\n this.cause = cause\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kSecureProxyConnectionError] === true\n }\n\n get [kSecureProxyConnectionError] () {\n return true\n }\n}\n\nconst kMaxOriginsReachedError = Symbol.for('undici.error.UND_ERR_MAX_ORIGINS_REACHED')\nclass MaxOriginsReachedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MaxOriginsReachedError'\n this.message = message || 'Maximum allowed origins reached'\n this.code = 'UND_ERR_MAX_ORIGINS_REACHED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kMaxOriginsReachedError] === true\n }\n\n get [kMaxOriginsReachedError] () {\n return true\n }\n}\n\nclass Socks5ProxyError extends UndiciError {\n constructor (message, code) {\n super(message)\n this.name = 'Socks5ProxyError'\n this.message = message || 'SOCKS5 proxy error'\n this.code = code || 'UND_ERR_SOCKS5'\n }\n}\n\nconst kMessageSizeExceededError = Symbol.for('undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED')\nclass MessageSizeExceededError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MessageSizeExceededError'\n this.message = message || 'Max decompressed message size exceeded'\n this.code = 'UND_ERR_WS_MESSAGE_SIZE_EXCEEDED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kMessageSizeExceededError] === true\n }\n\n get [kMessageSizeExceededError] () {\n return true\n }\n}\n\nmodule.exports = {\n AbortError,\n HTTPParserError,\n UndiciError,\n HeadersTimeoutError,\n HeadersOverflowError,\n BodyTimeoutError,\n RequestContentLengthMismatchError,\n ConnectTimeoutError,\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError,\n ClientDestroyedError,\n ClientClosedError,\n InformationalError,\n SocketError,\n NotSupportedError,\n ResponseContentLengthMismatchError,\n BalancedPoolMissingUpstreamError,\n ResponseExceededMaxSizeError,\n RequestRetryError,\n ResponseError,\n SecureProxyConnectionError,\n MaxOriginsReachedError,\n Socks5ProxyError,\n MessageSizeExceededError\n}\n","'use strict'\n\n/**\n * @see https://developer.mozilla.org/docs/Web/HTTP/Headers\n */\nconst wellknownHeaderNames = /** @type {const} */ ([\n 'Accept',\n 'Accept-Encoding',\n 'Accept-Language',\n 'Accept-Ranges',\n 'Access-Control-Allow-Credentials',\n 'Access-Control-Allow-Headers',\n 'Access-Control-Allow-Methods',\n 'Access-Control-Allow-Origin',\n 'Access-Control-Expose-Headers',\n 'Access-Control-Max-Age',\n 'Access-Control-Request-Headers',\n 'Access-Control-Request-Method',\n 'Age',\n 'Allow',\n 'Alt-Svc',\n 'Alt-Used',\n 'Authorization',\n 'Cache-Control',\n 'Clear-Site-Data',\n 'Connection',\n 'Content-Disposition',\n 'Content-Encoding',\n 'Content-Language',\n 'Content-Length',\n 'Content-Location',\n 'Content-Range',\n 'Content-Security-Policy',\n 'Content-Security-Policy-Report-Only',\n 'Content-Type',\n 'Cookie',\n 'Cross-Origin-Embedder-Policy',\n 'Cross-Origin-Opener-Policy',\n 'Cross-Origin-Resource-Policy',\n 'Date',\n 'Device-Memory',\n 'Downlink',\n 'ECT',\n 'ETag',\n 'Expect',\n 'Expect-CT',\n 'Expires',\n 'Forwarded',\n 'From',\n 'Host',\n 'If-Match',\n 'If-Modified-Since',\n 'If-None-Match',\n 'If-Range',\n 'If-Unmodified-Since',\n 'Keep-Alive',\n 'Last-Modified',\n 'Link',\n 'Location',\n 'Max-Forwards',\n 'Origin',\n 'Permissions-Policy',\n 'Pragma',\n 'Proxy-Authenticate',\n 'Proxy-Authorization',\n 'RTT',\n 'Range',\n 'Referer',\n 'Referrer-Policy',\n 'Refresh',\n 'Retry-After',\n 'Sec-WebSocket-Accept',\n 'Sec-WebSocket-Extensions',\n 'Sec-WebSocket-Key',\n 'Sec-WebSocket-Protocol',\n 'Sec-WebSocket-Version',\n 'Server',\n 'Server-Timing',\n 'Service-Worker-Allowed',\n 'Service-Worker-Navigation-Preload',\n 'Set-Cookie',\n 'SourceMap',\n 'Strict-Transport-Security',\n 'Supports-Loading-Mode',\n 'TE',\n 'Timing-Allow-Origin',\n 'Trailer',\n 'Transfer-Encoding',\n 'Upgrade',\n 'Upgrade-Insecure-Requests',\n 'User-Agent',\n 'Vary',\n 'Via',\n 'WWW-Authenticate',\n 'X-Content-Type-Options',\n 'X-DNS-Prefetch-Control',\n 'X-Frame-Options',\n 'X-Permitted-Cross-Domain-Policies',\n 'X-Powered-By',\n 'X-Requested-With',\n 'X-XSS-Protection'\n])\n\n/** @type {Record, string>} */\nconst headerNameLowerCasedRecord = {}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(headerNameLowerCasedRecord, null)\n\n/**\n * @type {Record, Buffer>}\n */\nconst wellknownHeaderNameBuffers = {}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(wellknownHeaderNameBuffers, null)\n\n/**\n * @param {string} header Lowercased header\n * @returns {Buffer}\n */\nfunction getHeaderNameAsBuffer (header) {\n let buffer = wellknownHeaderNameBuffers[header]\n\n if (buffer === undefined) {\n buffer = Buffer.from(header)\n }\n\n return buffer\n}\n\nfor (let i = 0; i < wellknownHeaderNames.length; ++i) {\n const key = wellknownHeaderNames[i]\n const lowerCasedKey = key.toLowerCase()\n headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] =\n lowerCasedKey\n}\n\nmodule.exports = {\n wellknownHeaderNames,\n headerNameLowerCasedRecord,\n getHeaderNameAsBuffer\n}\n","'use strict'\n\nconst {\n wellknownHeaderNames,\n headerNameLowerCasedRecord\n} = require('./constants')\n\nclass TstNode {\n /** @type {any} */\n value = null\n /** @type {null | TstNode} */\n left = null\n /** @type {null | TstNode} */\n middle = null\n /** @type {null | TstNode} */\n right = null\n /** @type {number} */\n code\n /**\n * @param {string} key\n * @param {any} value\n * @param {number} index\n */\n constructor (key, value, index) {\n if (index === undefined || index >= key.length) {\n throw new TypeError('Unreachable')\n }\n const code = this.code = key.charCodeAt(index)\n // check code is ascii string\n if (code > 0x7F) {\n throw new TypeError('key must be ascii string')\n }\n if (key.length !== ++index) {\n this.middle = new TstNode(key, value, index)\n } else {\n this.value = value\n }\n }\n\n /**\n * @param {string} key\n * @param {any} value\n * @returns {void}\n */\n add (key, value) {\n const length = key.length\n if (length === 0) {\n throw new TypeError('Unreachable')\n }\n let index = 0\n /**\n * @type {TstNode}\n */\n let node = this\n while (true) {\n const code = key.charCodeAt(index)\n // check code is ascii string\n if (code > 0x7F) {\n throw new TypeError('key must be ascii string')\n }\n if (node.code === code) {\n if (length === ++index) {\n node.value = value\n break\n } else if (node.middle !== null) {\n node = node.middle\n } else {\n node.middle = new TstNode(key, value, index)\n break\n }\n } else if (node.code < code) {\n if (node.left !== null) {\n node = node.left\n } else {\n node.left = new TstNode(key, value, index)\n break\n }\n } else if (node.right !== null) {\n node = node.right\n } else {\n node.right = new TstNode(key, value, index)\n break\n }\n }\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {TstNode | null}\n */\n search (key) {\n const keylength = key.length\n let index = 0\n /**\n * @type {TstNode|null}\n */\n let node = this\n while (node !== null && index < keylength) {\n let code = key[index]\n // A-Z\n // First check if it is bigger than 0x5a.\n // Lowercase letters have higher char codes than uppercase ones.\n // Also we assume that headers will mostly contain lowercase characters.\n if (code <= 0x5a && code >= 0x41) {\n // Lowercase for uppercase.\n code |= 32\n }\n while (node !== null) {\n if (code === node.code) {\n if (keylength === ++index) {\n // Returns Node since it is the last key.\n return node\n }\n node = node.middle\n break\n }\n node = node.code < code ? node.left : node.right\n }\n }\n return null\n }\n}\n\nclass TernarySearchTree {\n /** @type {TstNode | null} */\n node = null\n\n /**\n * @param {string} key\n * @param {any} value\n * @returns {void}\n * */\n insert (key, value) {\n if (this.node === null) {\n this.node = new TstNode(key, value, 0)\n } else {\n this.node.add(key, value)\n }\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {any}\n */\n lookup (key) {\n return this.node?.search(key)?.value ?? null\n }\n}\n\nconst tree = new TernarySearchTree()\n\nfor (let i = 0; i < wellknownHeaderNames.length; ++i) {\n const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]\n tree.insert(key, key)\n}\n\nmodule.exports = {\n TernarySearchTree,\n tree\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { kDestroyed, kBodyUsed, kListeners, kBody } = require('./symbols')\nconst { IncomingMessage } = require('node:http')\nconst stream = require('node:stream')\nconst net = require('node:net')\nconst { stringify } = require('node:querystring')\nconst { EventEmitter: EE } = require('node:events')\nconst timers = require('../util/timers')\nconst { InvalidArgumentError, ConnectTimeoutError } = require('./errors')\nconst { headerNameLowerCasedRecord } = require('./constants')\nconst { tree } = require('./tree')\n\nclass BodyAsyncIterable {\n constructor (body) {\n this[kBody] = body\n this[kBodyUsed] = false\n }\n\n async * [Symbol.asyncIterator] () {\n assert(!this[kBodyUsed], 'disturbed')\n this[kBodyUsed] = true\n yield * this[kBody]\n }\n}\n\nfunction noop () {}\n\n/**\n * @param {*} body\n * @returns {*}\n */\nfunction wrapRequestBody (body) {\n if (isStream(body)) {\n // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp\n // so that it can be dispatched again?\n // TODO (fix): Do we need 100-expect support to provide a way to do this properly?\n if (bodyLength(body) === 0) {\n body\n .on('data', function () {\n assert(false)\n })\n }\n\n if (typeof body.readableDidRead !== 'boolean') {\n body[kBodyUsed] = false\n EE.prototype.on.call(body, 'data', function () {\n this[kBodyUsed] = true\n })\n }\n\n return body\n } else if (body && typeof body.pipeTo === 'function') {\n // TODO (fix): We can't access ReadableStream internal state\n // to determine whether or not it has been disturbed. This is just\n // a workaround.\n return new BodyAsyncIterable(body)\n } else if (body && isFormDataLike(body)) {\n return body\n } else if (\n body &&\n typeof body !== 'string' &&\n !ArrayBuffer.isView(body) &&\n isIterable(body)\n ) {\n // TODO: Should we allow re-using iterable if !this.opts.idempotent\n // or through some other flag?\n return new BodyAsyncIterable(body)\n } else {\n return body\n }\n}\n\n/**\n * @param {*} obj\n * @returns {obj is import('node:stream').Stream}\n */\nfunction isStream (obj) {\n return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function'\n}\n\n/**\n * @param {*} object\n * @returns {object is Blob}\n */\nfunction isBlobLike (object) {\n return object instanceof Blob\n}\n\n/**\n * @param {string} url The path to check for query strings or fragments.\n * @returns {boolean} Returns true if the path contains a query string or fragment.\n */\nfunction pathHasQueryOrFragment (url) {\n return (\n url.includes('?') ||\n url.includes('#')\n )\n}\n\n/**\n * @param {string} url The URL to add the query params to\n * @param {import('node:querystring').ParsedUrlQueryInput} queryParams The object to serialize into a URL query string\n * @returns {string} The URL with the query params added\n */\nfunction serializePathWithQuery (url, queryParams) {\n if (pathHasQueryOrFragment(url)) {\n throw new Error('Query params cannot be passed when url already contains \"?\" or \"#\".')\n }\n\n const stringified = stringify(queryParams)\n\n if (stringified) {\n url += '?' + stringified\n }\n\n return url\n}\n\n/**\n * @param {number|string|undefined} port\n * @returns {boolean}\n */\nfunction isValidPort (port) {\n const value = parseInt(port, 10)\n return (\n value === Number(port) &&\n value >= 0 &&\n value <= 65535\n )\n}\n\n/**\n * Check if the value is a valid http or https prefixed string.\n *\n * @param {string} value\n * @returns {boolean}\n */\nfunction isHttpOrHttpsPrefixed (value) {\n return (\n value != null &&\n value[0] === 'h' &&\n value[1] === 't' &&\n value[2] === 't' &&\n value[3] === 'p' &&\n (\n value[4] === ':' ||\n (\n value[4] === 's' &&\n value[5] === ':'\n )\n )\n )\n}\n\n/**\n * @param {string|URL|Record} url\n * @returns {URL}\n */\nfunction parseURL (url) {\n if (typeof url === 'string') {\n /**\n * @type {URL}\n */\n url = new URL(url)\n\n if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n return url\n }\n\n if (!url || typeof url !== 'object') {\n throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.')\n }\n\n if (!(url instanceof URL)) {\n if (url.port != null && url.port !== '' && isValidPort(url.port) === false) {\n throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.')\n }\n\n if (url.path != null && typeof url.path !== 'string') {\n throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.')\n }\n\n if (url.pathname != null && typeof url.pathname !== 'string') {\n throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.')\n }\n\n if (url.hostname != null && typeof url.hostname !== 'string') {\n throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.')\n }\n\n if (url.origin != null && typeof url.origin !== 'string') {\n throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.')\n }\n\n if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n const port = url.port != null\n ? url.port\n : (url.protocol === 'https:' ? 443 : 80)\n let origin = url.origin != null\n ? url.origin\n : `${url.protocol || ''}//${url.hostname || ''}:${port}`\n let path = url.path != null\n ? url.path\n : `${url.pathname || ''}${url.search || ''}`\n\n if (origin[origin.length - 1] === '/') {\n origin = origin.slice(0, origin.length - 1)\n }\n\n if (path && path[0] !== '/') {\n path = `/${path}`\n }\n // new URL(path, origin) is unsafe when `path` contains an absolute URL\n // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL:\n // If first parameter is a relative URL, second param is required, and will be used as the base URL.\n // If first parameter is an absolute URL, a given second param will be ignored.\n return new URL(`${origin}${path}`)\n }\n\n if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n return url\n}\n\n/**\n * @param {string|URL|Record} url\n * @returns {URL}\n */\nfunction parseOrigin (url) {\n url = parseURL(url)\n\n if (url.pathname !== '/' || url.search || url.hash) {\n throw new InvalidArgumentError('invalid url')\n }\n\n return url\n}\n\n/**\n * @param {string} host\n * @returns {string}\n */\nfunction getHostname (host) {\n if (host[0] === '[') {\n const idx = host.indexOf(']')\n\n assert(idx !== -1)\n return host.substring(1, idx)\n }\n\n const idx = host.indexOf(':')\n if (idx === -1) return host\n\n return host.substring(0, idx)\n}\n\n/**\n * IP addresses are not valid server names per RFC6066\n * Currently, the only server names supported are DNS hostnames\n * @param {string|null} host\n * @returns {string|null}\n */\nfunction getServerName (host) {\n if (!host) {\n return null\n }\n\n assert(typeof host === 'string')\n\n const servername = getHostname(host)\n if (net.isIP(servername)) {\n return ''\n }\n\n return servername\n}\n\n/**\n * @function\n * @template T\n * @param {T} obj\n * @returns {T}\n */\nfunction deepClone (obj) {\n return JSON.parse(JSON.stringify(obj))\n}\n\n/**\n * @param {*} obj\n * @returns {obj is AsyncIterable}\n */\nfunction isAsyncIterable (obj) {\n return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function')\n}\n\n/**\n * @param {*} obj\n * @returns {obj is Iterable}\n */\nfunction isIterable (obj) {\n return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))\n}\n\n/**\n * Checks whether an object has a safe Symbol.iterator — i.e. one that is\n * either own or inherited from a non-Object.prototype chain. This prevents\n * prototype-pollution attacks from injecting a fake iterator on\n * Object.prototype.\n * @param {object} obj\n * @returns {boolean}\n */\nfunction hasSafeIterator (obj) {\n const prototype = Object.getPrototypeOf(obj)\n const ownIterator = Object.hasOwn(obj, Symbol.iterator)\n return ownIterator || (prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === 'function')\n}\n\n/**\n * @param {Blob|Buffer|import ('stream').Stream} body\n * @returns {number|null}\n */\nfunction bodyLength (body) {\n if (body == null) {\n return 0\n } else if (isStream(body)) {\n const state = body._readableState\n return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length)\n ? state.length\n : null\n } else if (isBlobLike(body)) {\n return body.size != null ? body.size : null\n } else if (isBuffer(body)) {\n return body.byteLength\n }\n\n return null\n}\n\n/**\n * @param {import ('stream').Stream} body\n * @returns {boolean}\n */\nfunction isDestroyed (body) {\n return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body)))\n}\n\n/**\n * @param {import ('stream').Stream} stream\n * @param {Error} [err]\n * @returns {void}\n */\nfunction destroy (stream, err) {\n if (stream == null || !isStream(stream) || isDestroyed(stream)) {\n return\n }\n\n if (typeof stream.destroy === 'function') {\n if (Object.getPrototypeOf(stream).constructor === IncomingMessage) {\n // See: https://github.com/nodejs/node/pull/38505/files\n stream.socket = null\n }\n\n stream.destroy(err)\n } else if (err) {\n queueMicrotask(() => {\n stream.emit('error', err)\n })\n }\n\n if (stream.destroyed !== true) {\n stream[kDestroyed] = true\n }\n}\n\nconst KEEPALIVE_TIMEOUT_EXPR = /timeout=(\\d+)/\n/**\n * @param {string} val\n * @returns {number | null}\n */\nfunction parseKeepAliveTimeout (val) {\n const m = val.match(KEEPALIVE_TIMEOUT_EXPR)\n return m ? parseInt(m[1], 10) * 1000 : null\n}\n\n/**\n * Retrieves a header name and returns its lowercase value.\n * @param {string | Buffer} value Header name\n * @returns {string}\n */\nfunction headerNameToString (value) {\n return typeof value === 'string'\n ? headerNameLowerCasedRecord[value] ?? value.toLowerCase()\n : tree.lookup(value) ?? value.toString('latin1').toLowerCase()\n}\n\n/**\n * Receive the buffer as a string and return its lowercase value.\n * @param {Buffer} value Header name\n * @returns {string}\n */\nfunction bufferToLowerCasedHeaderName (value) {\n return tree.lookup(value) ?? value.toString('latin1').toLowerCase()\n}\n\n/**\n * @param {(Buffer | string)[]} headers\n * @param {Record} [obj]\n * @returns {Record}\n */\nfunction parseHeaders (headers, obj) {\n if (obj === undefined) obj = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headerNameToString(headers[i])\n let val = obj[key]\n\n if (val !== undefined) {\n if (!Object.hasOwn(obj, key)) {\n const headersValue = typeof headers[i + 1] === 'string'\n ? headers[i + 1]\n : Array.isArray(headers[i + 1])\n ? headers[i + 1].map(x => x.toString('latin1'))\n : headers[i + 1].toString('latin1')\n\n if (key === '__proto__') {\n Object.defineProperty(obj, key, {\n value: headersValue,\n enumerable: true,\n configurable: true,\n writable: true\n })\n } else {\n obj[key] = headersValue\n }\n } else {\n if (typeof val === 'string') {\n val = [val]\n obj[key] = val\n }\n val.push(headers[i + 1].toString('latin1'))\n }\n } else {\n const headersValue = typeof headers[i + 1] === 'string'\n ? headers[i + 1]\n : Array.isArray(headers[i + 1])\n ? headers[i + 1].map(x => x.toString('latin1'))\n : headers[i + 1].toString('latin1')\n\n obj[key] = headersValue\n }\n }\n\n return obj\n}\n\n/**\n * @param {Buffer[]} headers\n * @returns {string[]}\n */\nfunction parseRawHeaders (headers) {\n const headersLength = headers.length\n /**\n * @type {string[]}\n */\n const ret = new Array(headersLength)\n\n let key\n let val\n\n for (let n = 0; n < headersLength; n += 2) {\n key = headers[n]\n val = headers[n + 1]\n\n typeof key !== 'string' && (key = key.toString())\n typeof val !== 'string' && (val = val.toString('latin1'))\n\n ret[n] = key\n ret[n + 1] = val\n }\n\n return ret\n}\n\n/**\n * @param {Record} headers\n * @returns {Buffer[]}\n */\nfunction toRawHeaders (headers) {\n const rawHeaders = []\n\n for (const [name, value] of Object.entries(headers)) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n rawHeaders.push(Buffer.from(name, 'latin1'), Buffer.from(`${entry}`, 'latin1'))\n }\n } else {\n rawHeaders.push(Buffer.from(name, 'latin1'), Buffer.from(`${value}`, 'latin1'))\n }\n }\n\n return rawHeaders\n}\n\n/**\n * @param {string[]} headers\n * @param {Buffer[]} headers\n */\nfunction encodeRawHeaders (headers) {\n if (!Array.isArray(headers)) {\n throw new TypeError('expected headers to be an array')\n }\n return headers.map(x => Buffer.from(x))\n}\n\n/**\n * @param {*} buffer\n * @returns {buffer is Buffer}\n */\nfunction isBuffer (buffer) {\n // See, https://github.com/mcollina/undici/pull/319\n return buffer instanceof Uint8Array || Buffer.isBuffer(buffer)\n}\n\n/**\n * Asserts that the handler object is a request handler.\n *\n * @param {object} handler\n * @param {string} method\n * @param {string} [upgrade]\n * @returns {asserts handler is import('../api/api-request').RequestHandler}\n */\nfunction assertRequestHandler (handler, method, upgrade) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n if (typeof handler.onRequestStart !== 'function') {\n throw new InvalidArgumentError('invalid onRequestStart method')\n }\n\n if (typeof handler.onResponseError !== 'function') {\n throw new InvalidArgumentError('invalid onResponseError method')\n }\n\n if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) {\n throw new InvalidArgumentError('invalid onBodySent method')\n }\n\n if (typeof handler.onRequestSent !== 'function' && handler.onRequestSent !== undefined) {\n throw new InvalidArgumentError('invalid onRequestSent method')\n }\n\n if (upgrade || method === 'CONNECT') {\n if (typeof handler.onRequestUpgrade !== 'function') {\n throw new InvalidArgumentError('invalid onRequestUpgrade method')\n }\n } else {\n if (typeof handler.onResponseStart !== 'function') {\n throw new InvalidArgumentError('invalid onResponseStart method')\n }\n\n if (typeof handler.onResponseData !== 'function') {\n throw new InvalidArgumentError('invalid onResponseData method')\n }\n\n if (typeof handler.onResponseEnd !== 'function') {\n throw new InvalidArgumentError('invalid onResponseEnd method')\n }\n }\n}\n\n/**\n * A body is disturbed if it has been read from and it cannot be re-used without\n * losing state or data.\n * @param {import('node:stream').Readable} body\n * @returns {boolean}\n */\nfunction isDisturbed (body) {\n // TODO (fix): Why is body[kBodyUsed] needed?\n return !!(body && (stream.isDisturbed(body) || body[kBodyUsed]))\n}\n\n/**\n * @typedef {object} SocketInfo\n * @property {string} [localAddress]\n * @property {number} [localPort]\n * @property {string} [remoteAddress]\n * @property {number} [remotePort]\n * @property {string} [remoteFamily]\n * @property {number} [timeout]\n * @property {number} bytesWritten\n * @property {number} bytesRead\n */\n\n/**\n * @param {import('net').Socket} socket\n * @returns {SocketInfo}\n */\nfunction getSocketInfo (socket) {\n return {\n localAddress: socket.localAddress,\n localPort: socket.localPort,\n remoteAddress: socket.remoteAddress,\n remotePort: socket.remotePort,\n remoteFamily: socket.remoteFamily,\n timeout: socket.timeout,\n bytesWritten: socket.bytesWritten,\n bytesRead: socket.bytesRead\n }\n}\n\n/**\n * @param {Iterable} iterable\n * @returns {ReadableStream}\n */\nfunction ReadableStreamFrom (iterable) {\n // We cannot use ReadableStream.from here because it does not return a byte stream.\n\n let iterator\n return new ReadableStream(\n {\n start () {\n iterator = iterable[Symbol.asyncIterator]()\n },\n pull (controller) {\n return iterator.next().then(({ done, value }) => {\n if (done) {\n return queueMicrotask(() => {\n controller.close()\n controller.byobRequest?.respond(0)\n })\n } else {\n const buf = Buffer.isBuffer(value) ? value : Buffer.from(value)\n if (buf.byteLength) {\n return controller.enqueue(new Uint8Array(buf))\n } else {\n return this.pull(controller)\n }\n }\n })\n },\n cancel () {\n return iterator.return()\n },\n type: 'bytes'\n }\n )\n}\n\n/**\n * The object should be a FormData instance and contains all the required\n * methods.\n * @param {*} object\n * @returns {object is FormData}\n */\nfunction isFormDataLike (object) {\n return (\n object &&\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n object[Symbol.toStringTag] === 'FormData'\n )\n}\n\nfunction addAbortListener (signal, listener) {\n if ('addEventListener' in signal) {\n signal.addEventListener('abort', listener, { once: true })\n return () => signal.removeEventListener('abort', listener)\n }\n signal.once('abort', listener)\n return () => signal.removeListener('abort', listener)\n}\n\nconst validTokenChars = new Uint8Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0-15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32-47 (!\"#$%&'()*+,-./)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48-63 (0-9:;<=>?)\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64-79 (@A-O)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80-95 (P-Z[\\]^_)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96-111 (`a-o)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112-127 (p-z{|}~)\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128-143\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144-159\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160-175\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176-191\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192-207\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208-223\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224-239\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240-255\n])\n\n/**\n * @see https://tools.ietf.org/html/rfc7230#section-3.2.6\n * @param {number} c\n * @returns {boolean}\n */\nfunction isTokenCharCode (c) {\n return (validTokenChars[c] === 1)\n}\n\nconst tokenRegExp = /^[\\^_`a-zA-Z\\-0-9!#$%&'*+.|~]+$/\n\n/**\n * @param {string} characters\n * @returns {boolean}\n */\nfunction isValidHTTPToken (characters) {\n if (characters.length >= 12) return tokenRegExp.test(characters)\n if (characters.length === 0) return false\n\n for (let i = 0; i < characters.length; i++) {\n if (validTokenChars[characters.charCodeAt(i)] !== 1) {\n return false\n }\n }\n return true\n}\n\n// headerCharRegex have been lifted from\n// https://github.com/nodejs/node/blob/main/lib/_http_common.js\n\n/**\n * Matches if val contains an invalid field-vchar\n * field-value = *( field-content / obs-fold )\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n */\nconst headerCharRegex = /[^\\t\\x20-\\x7e\\x80-\\xff]/\n\n/**\n * @param {string} characters\n * @returns {boolean}\n */\nfunction isValidHeaderValue (characters) {\n return !headerCharRegex.test(characters)\n}\n\nconst rangeHeaderRegex = /^bytes (\\d+)-(\\d+)\\/(\\d+)?$/\n\n/**\n * @typedef {object} RangeHeader\n * @property {number} start\n * @property {number | null} end\n * @property {number | null} size\n */\n\n/**\n * Parse accordingly to RFC 9110\n * @see https://www.rfc-editor.org/rfc/rfc9110#field.content-range\n * @param {string} [range]\n * @returns {RangeHeader|null}\n */\nfunction parseRangeHeader (range) {\n if (range == null || range === '') return { start: 0, end: null, size: null }\n\n const m = range ? range.match(rangeHeaderRegex) : null\n return m\n ? {\n start: parseInt(m[1]),\n end: m[2] ? parseInt(m[2]) : null,\n size: m[3] ? parseInt(m[3]) : null\n }\n : null\n}\n\n/**\n * @template {import(\"events\").EventEmitter} T\n * @param {T} obj\n * @param {string} name\n * @param {(...args: any[]) => void} listener\n * @returns {T}\n */\nfunction addListener (obj, name, listener) {\n const listeners = (obj[kListeners] ??= [])\n listeners.push([name, listener])\n obj.on(name, listener)\n return obj\n}\n\n/**\n * @template {import(\"events\").EventEmitter} T\n * @param {T} obj\n * @returns {T}\n */\nfunction removeAllListeners (obj) {\n if (obj[kListeners] != null) {\n for (const [name, listener] of obj[kListeners]) {\n obj.removeListener(name, listener)\n }\n obj[kListeners] = null\n }\n return obj\n}\n\n/**\n * @param {import ('../dispatcher/client')} client\n * @param {import ('../core/request')} request\n * @param {Error} err\n */\nfunction errorRequest (client, request, err) {\n try {\n request.onResponseError(err)\n assert(request.aborted)\n } catch (err) {\n client.emit('error', err)\n }\n}\n\n/**\n * @param {WeakRef} socketWeakRef\n * @param {object} opts\n * @param {number} opts.timeout\n * @param {string} opts.hostname\n * @param {number} opts.port\n * @returns {() => void}\n */\nconst setupConnectTimeout = process.platform === 'win32'\n ? (socketWeakRef, opts) => {\n if (!opts.timeout) {\n return noop\n }\n\n let s1 = null\n let s2 = null\n const fastTimer = timers.setFastTimeout(() => {\n // setImmediate is added to make sure that we prioritize socket error events over timeouts\n s1 = setImmediate(() => {\n // Windows needs an extra setImmediate probably due to implementation differences in the socket logic\n s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts))\n })\n }, opts.timeout)\n return () => {\n timers.clearFastTimeout(fastTimer)\n clearImmediate(s1)\n clearImmediate(s2)\n }\n }\n : (socketWeakRef, opts) => {\n if (!opts.timeout) {\n return noop\n }\n\n let s1 = null\n const fastTimer = timers.setFastTimeout(() => {\n // setImmediate is added to make sure that we prioritize socket error events over timeouts\n s1 = setImmediate(() => {\n onConnectTimeout(socketWeakRef.deref(), opts)\n })\n }, opts.timeout)\n return () => {\n timers.clearFastTimeout(fastTimer)\n clearImmediate(s1)\n }\n }\n\n/**\n * @param {net.Socket} socket\n * @param {object} opts\n * @param {number} opts.timeout\n * @param {string} opts.hostname\n * @param {number} opts.port\n */\nfunction onConnectTimeout (socket, opts) {\n // The socket could be already garbage collected\n if (socket == null) {\n return\n }\n\n let message = 'Connect Timeout Error'\n if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {\n message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`\n } else {\n message += ` (attempted address: ${opts.hostname}:${opts.port},`\n }\n\n message += ` timeout: ${opts.timeout}ms)`\n\n destroy(socket, new ConnectTimeoutError(message))\n}\n\n/**\n * @param {string} urlString\n * @returns {string}\n */\nfunction getProtocolFromUrlString (urlString) {\n if (\n urlString[0] === 'h' &&\n urlString[1] === 't' &&\n urlString[2] === 't' &&\n urlString[3] === 'p'\n ) {\n switch (urlString[4]) {\n case ':':\n return 'http:'\n case 's':\n if (urlString[5] === ':') {\n return 'https:'\n }\n }\n }\n // fallback if none of the usual suspects\n return urlString.slice(0, urlString.indexOf(':') + 1)\n}\n\nconst kEnumerableProperty = Object.create(null)\nkEnumerableProperty.enumerable = true\n\nconst normalizedMethodRecordsBase = {\n delete: 'DELETE',\n DELETE: 'DELETE',\n get: 'GET',\n GET: 'GET',\n head: 'HEAD',\n HEAD: 'HEAD',\n options: 'OPTIONS',\n OPTIONS: 'OPTIONS',\n post: 'POST',\n POST: 'POST',\n put: 'PUT',\n PUT: 'PUT'\n}\n\nconst normalizedMethodRecords = {\n ...normalizedMethodRecordsBase,\n patch: 'patch',\n PATCH: 'PATCH'\n}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(normalizedMethodRecordsBase, null)\nObject.setPrototypeOf(normalizedMethodRecords, null)\n\nmodule.exports = {\n kEnumerableProperty,\n isDisturbed,\n isBlobLike,\n parseOrigin,\n parseURL,\n getServerName,\n isStream,\n isIterable,\n hasSafeIterator,\n isAsyncIterable,\n isDestroyed,\n headerNameToString,\n bufferToLowerCasedHeaderName,\n addListener,\n removeAllListeners,\n errorRequest,\n parseRawHeaders,\n toRawHeaders,\n encodeRawHeaders,\n parseHeaders,\n parseKeepAliveTimeout,\n destroy,\n bodyLength,\n deepClone,\n ReadableStreamFrom,\n isBuffer,\n assertRequestHandler,\n getSocketInfo,\n isFormDataLike,\n pathHasQueryOrFragment,\n serializePathWithQuery,\n addAbortListener,\n isValidHTTPToken,\n isValidHeaderValue,\n isTokenCharCode,\n parseRangeHeader,\n normalizedMethodRecordsBase,\n normalizedMethodRecords,\n isValidPort,\n isHttpOrHttpsPrefixed,\n safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']),\n wrapRequestBody,\n setupConnectTimeout,\n getProtocolFromUrlString\n}\n","'use strict'\n\nconst {\n kConnected,\n kPending,\n kRunning,\n kSize,\n kFree,\n kQueued\n} = require('../core/symbols')\n\nclass ClientStats {\n constructor (client) {\n this.connected = client[kConnected]\n this.pending = client[kPending]\n this.running = client[kRunning]\n this.size = client[kSize]\n }\n}\n\nclass PoolStats {\n constructor (pool) {\n this.connected = pool[kConnected]\n this.free = pool[kFree]\n this.pending = pool[kPending]\n this.queued = pool[kQueued]\n this.running = pool[kRunning]\n this.size = pool[kSize]\n }\n}\n\nmodule.exports = { ClientStats, PoolStats }\n","'use strict'\n\nconst diagnosticsChannel = require('node:diagnostics_channel')\nconst util = require('node:util')\n\nconst undiciDebugLog = util.debuglog('undici')\nconst fetchDebuglog = util.debuglog('fetch')\nconst websocketDebuglog = util.debuglog('websocket')\n\nconst channels = {\n // Client\n beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'),\n connected: diagnosticsChannel.channel('undici:client:connected'),\n connectError: diagnosticsChannel.channel('undici:client:connectError'),\n sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'),\n // Request\n create: diagnosticsChannel.channel('undici:request:create'),\n bodySent: diagnosticsChannel.channel('undici:request:bodySent'),\n bodyChunkSent: diagnosticsChannel.channel('undici:request:bodyChunkSent'),\n bodyChunkReceived: diagnosticsChannel.channel('undici:request:bodyChunkReceived'),\n headers: diagnosticsChannel.channel('undici:request:headers'),\n trailers: diagnosticsChannel.channel('undici:request:trailers'),\n error: diagnosticsChannel.channel('undici:request:error'),\n // WebSocket\n open: diagnosticsChannel.channel('undici:websocket:open'),\n close: diagnosticsChannel.channel('undici:websocket:close'),\n socketError: diagnosticsChannel.channel('undici:websocket:socket_error'),\n ping: diagnosticsChannel.channel('undici:websocket:ping'),\n pong: diagnosticsChannel.channel('undici:websocket:pong'),\n // ProxyAgent\n proxyConnected: diagnosticsChannel.channel('undici:proxy:connected')\n}\n\nlet isTrackingClientEvents = false\n\nfunction trackClientEvents (debugLog = undiciDebugLog) {\n if (isTrackingClientEvents) {\n return\n }\n\n // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n // This can happen when both Node.js built-in undici and undici as a dependency are present\n if (channels.beforeConnect.hasSubscribers || channels.connected.hasSubscribers ||\n channels.connectError.hasSubscribers || channels.sendHeaders.hasSubscribers) {\n isTrackingClientEvents = true\n return\n }\n\n isTrackingClientEvents = true\n\n diagnosticsChannel.subscribe('undici:client:beforeConnect',\n evt => {\n const {\n connectParams: { version, protocol, port, host }\n } = evt\n debugLog(\n 'connecting to %s%s using %s%s',\n host,\n port ? `:${port}` : '',\n protocol,\n version\n )\n })\n\n diagnosticsChannel.subscribe('undici:client:connected',\n evt => {\n const {\n connectParams: { version, protocol, port, host }\n } = evt\n debugLog(\n 'connected to %s%s using %s%s',\n host,\n port ? `:${port}` : '',\n protocol,\n version\n )\n })\n\n diagnosticsChannel.subscribe('undici:client:connectError',\n evt => {\n const {\n connectParams: { version, protocol, port, host },\n error\n } = evt\n debugLog(\n 'connection to %s%s using %s%s errored - %s',\n host,\n port ? `:${port}` : '',\n protocol,\n version,\n error.message\n )\n })\n\n diagnosticsChannel.subscribe('undici:client:sendHeaders',\n evt => {\n const {\n request: { method, path, origin }\n } = evt\n debugLog('sending request to %s %s%s', method, origin, path)\n })\n}\n\nlet isTrackingRequestEvents = false\n\nfunction trackRequestEvents (debugLog = undiciDebugLog) {\n if (isTrackingRequestEvents) {\n return\n }\n\n // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n // This can happen when both Node.js built-in undici and undici as a dependency are present\n if (channels.headers.hasSubscribers || channels.trailers.hasSubscribers ||\n channels.error.hasSubscribers) {\n isTrackingRequestEvents = true\n return\n }\n\n isTrackingRequestEvents = true\n\n diagnosticsChannel.subscribe('undici:request:headers',\n evt => {\n const {\n request: { method, path, origin },\n response: { statusCode }\n } = evt\n debugLog(\n 'received response to %s %s%s - HTTP %d',\n method,\n origin,\n path,\n statusCode\n )\n })\n\n diagnosticsChannel.subscribe('undici:request:trailers',\n evt => {\n const {\n request: { method, path, origin }\n } = evt\n debugLog('trailers received from %s %s%s', method, origin, path)\n })\n\n diagnosticsChannel.subscribe('undici:request:error',\n evt => {\n const {\n request: { method, path, origin },\n error\n } = evt\n debugLog(\n 'request to %s %s%s errored - %s',\n method,\n origin,\n path,\n error.message\n )\n })\n}\n\nlet isTrackingWebSocketEvents = false\n\nfunction trackWebSocketEvents (debugLog = websocketDebuglog) {\n if (isTrackingWebSocketEvents) {\n return\n }\n\n // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n // This can happen when both Node.js built-in undici and undici as a dependency are present\n if (channels.open.hasSubscribers || channels.close.hasSubscribers ||\n channels.socketError.hasSubscribers || channels.ping.hasSubscribers ||\n channels.pong.hasSubscribers) {\n isTrackingWebSocketEvents = true\n return\n }\n\n isTrackingWebSocketEvents = true\n\n diagnosticsChannel.subscribe('undici:websocket:open',\n evt => {\n if (evt.address != null) {\n const { address, port } = evt.address\n debugLog('connection opened %s%s', address, port ? `:${port}` : '')\n } else {\n debugLog('connection opened')\n }\n })\n\n diagnosticsChannel.subscribe('undici:websocket:close',\n evt => {\n const { websocket, code, reason } = evt\n debugLog(\n 'closed connection to %s - %s %s',\n websocket.url,\n code,\n reason\n )\n })\n\n diagnosticsChannel.subscribe('undici:websocket:socket_error',\n err => {\n debugLog('connection errored - %s', err.message)\n })\n\n diagnosticsChannel.subscribe('undici:websocket:ping',\n evt => {\n debugLog('ping received')\n })\n\n diagnosticsChannel.subscribe('undici:websocket:pong',\n evt => {\n debugLog('pong received')\n })\n}\n\nif (undiciDebugLog.enabled || fetchDebuglog.enabled) {\n trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)\n trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)\n}\n\nif (websocketDebuglog.enabled) {\n trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog)\n trackWebSocketEvents(websocketDebuglog)\n}\n\nmodule.exports = {\n channels\n}\n","'use strict'\n\nconst {\n InvalidArgumentError,\n NotSupportedError\n} = require('./errors')\nconst assert = require('node:assert')\nconst {\n isValidHTTPToken,\n isValidHeaderValue,\n isStream,\n destroy,\n isBuffer,\n isFormDataLike,\n isIterable,\n hasSafeIterator,\n isBlobLike,\n serializePathWithQuery,\n parseHeaders,\n assertRequestHandler,\n getServerName,\n normalizedMethodRecords,\n getProtocolFromUrlString\n} = require('./util')\nconst { channels } = require('./diagnostics.js')\nconst { headerNameLowerCasedRecord } = require('./constants')\n\n// Verifies that a given path is valid does not contain control chars \\x00 to \\x20\nconst invalidPathRegex = /[^\\u0021-\\u00ff]/\n\nconst kHandler = Symbol('handler')\nconst kController = Symbol('controller')\nconst kResume = Symbol('resume')\n\nclass RequestController {\n #paused = false\n #reason = null\n #aborted = false\n #abort\n\n [kResume] = null\n\n rawHeaders = null\n rawTrailers = null\n\n constructor (abort) {\n this.#abort = abort\n }\n\n pause () {\n this.#paused = true\n }\n\n resume () {\n if (this.#paused) {\n this.#paused = false\n this[kResume]?.()\n }\n }\n\n abort (reason) {\n if (!this.#aborted) {\n this.#aborted = true\n this.#reason = reason\n this.#abort(reason)\n }\n }\n\n get aborted () {\n return this.#aborted\n }\n\n get reason () {\n return this.#reason\n }\n\n get paused () {\n return this.#paused\n }\n}\n\nclass Request {\n constructor (origin, {\n path,\n method,\n body,\n headers,\n query,\n idempotent,\n blocking,\n upgrade,\n headersTimeout,\n bodyTimeout,\n reset,\n expectContinue,\n servername,\n throwOnError,\n maxRedirections,\n typeOfService\n }, handler) {\n if (typeof path !== 'string') {\n throw new InvalidArgumentError('path must be a string')\n } else if (\n path[0] !== '/' &&\n !(path.startsWith('http://') || path.startsWith('https://')) &&\n method !== 'CONNECT'\n ) {\n throw new InvalidArgumentError('path must be an absolute URL or start with a slash')\n } else if (invalidPathRegex.test(path)) {\n throw new InvalidArgumentError('invalid request path')\n }\n\n if (typeof method !== 'string') {\n throw new InvalidArgumentError('method must be a string')\n } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) {\n throw new InvalidArgumentError('invalid request method')\n }\n\n if (upgrade && typeof upgrade !== 'string') {\n throw new InvalidArgumentError('upgrade must be a string')\n }\n\n if (upgrade && !isValidHeaderValue(upgrade)) {\n throw new InvalidArgumentError('invalid upgrade header')\n }\n\n if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('invalid headersTimeout')\n }\n\n if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('invalid bodyTimeout')\n }\n\n if (reset != null && typeof reset !== 'boolean') {\n throw new InvalidArgumentError('invalid reset')\n }\n\n if (expectContinue != null && typeof expectContinue !== 'boolean') {\n throw new InvalidArgumentError('invalid expectContinue')\n }\n\n if (throwOnError != null) {\n throw new InvalidArgumentError('invalid throwOnError')\n }\n\n if (maxRedirections != null && maxRedirections !== 0) {\n throw new InvalidArgumentError('maxRedirections is not supported, use the redirect interceptor')\n }\n\n if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) {\n throw new InvalidArgumentError('typeOfService must be an integer between 0 and 255')\n }\n\n this.headersTimeout = headersTimeout\n\n this.bodyTimeout = bodyTimeout\n\n this.method = method\n\n this.typeOfService = typeOfService ?? 0\n\n this.abort = null\n\n if (body == null) {\n this.body = null\n } else if (isStream(body)) {\n this.body = body\n\n const rState = this.body._readableState\n if (!rState || !rState.autoDestroy) {\n this.endHandler = function autoDestroy () {\n destroy(this)\n }\n this.body.on('end', this.endHandler)\n }\n\n this.errorHandler = err => {\n if (this.abort) {\n this.abort(err)\n } else {\n this.error = err\n }\n }\n this.body.on('error', this.errorHandler)\n } else if (isBuffer(body)) {\n this.body = body.byteLength ? body : null\n } else if (ArrayBuffer.isView(body)) {\n this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null\n } else if (body instanceof ArrayBuffer) {\n this.body = body.byteLength ? Buffer.from(body) : null\n } else if (typeof body === 'string') {\n this.body = body.length ? Buffer.from(body) : null\n } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) {\n this.body = body\n } else {\n throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable')\n }\n\n this.completed = false\n this.aborted = false\n\n this.upgrade = upgrade || null\n\n this.path = query ? serializePathWithQuery(path, query) : path\n\n // TODO: shall we maybe standardize it to an URL object?\n this.origin = origin\n\n this.protocol = getProtocolFromUrlString(origin)\n\n this.idempotent = idempotent == null\n ? method === 'HEAD' || method === 'GET'\n : idempotent\n\n this.blocking = blocking ?? this.method !== 'HEAD'\n\n this.reset = reset == null ? null : reset\n\n this.host = null\n\n this.contentLength = null\n\n this.contentType = null\n\n this.headers = []\n\n // Only for H2\n this.expectContinue = expectContinue != null ? expectContinue : false\n\n if (Array.isArray(headers)) {\n if (headers.length % 2 !== 0) {\n throw new InvalidArgumentError('headers array must be even')\n }\n for (let i = 0; i < headers.length; i += 2) {\n processHeader(this, headers[i], headers[i + 1])\n }\n } else if (headers && typeof headers === 'object') {\n if (hasSafeIterator(headers)) {\n for (const header of headers) {\n if (!Array.isArray(header) || header.length !== 2) {\n throw new InvalidArgumentError('headers must be in key-value pair format')\n }\n processHeader(this, header[0], header[1])\n }\n } else {\n const keys = Object.keys(headers)\n for (let i = 0; i < keys.length; ++i) {\n processHeader(this, keys[i], headers[keys[i]])\n }\n }\n } else if (headers != null) {\n throw new InvalidArgumentError('headers must be an object or an array')\n }\n\n assertRequestHandler(handler, method, upgrade)\n\n this.servername = servername || getServerName(this.host) || null\n\n this[kHandler] = handler\n\n if (channels.create.hasSubscribers) {\n channels.create.publish({ request: this })\n }\n }\n\n onBodySent (chunk) {\n if (channels.bodyChunkSent.hasSubscribers) {\n channels.bodyChunkSent.publish({ request: this, chunk })\n }\n if (this[kHandler].onBodySent) {\n try {\n return this[kHandler].onBodySent(chunk)\n } catch (err) {\n this.abort(err)\n }\n }\n }\n\n onRequestSent () {\n if (channels.bodySent.hasSubscribers) {\n channels.bodySent.publish({ request: this })\n }\n\n if (this[kHandler].onRequestSent) {\n try {\n return this[kHandler].onRequestSent()\n } catch (err) {\n this.abort(err)\n }\n }\n }\n\n onRequestStart (abort, context) {\n assert(!this.aborted)\n assert(!this.completed)\n\n this[kController] = new RequestController(abort)\n\n if (this.error) {\n this[kController].abort(this.error)\n return\n }\n\n this.abort = abort\n return this[kHandler].onRequestStart(this[kController], context)\n }\n\n onResponseStarted () {\n return this[kHandler].onResponseStarted?.()\n }\n\n onResponseStart (statusCode, headers, resume, statusText) {\n assert(!this.aborted)\n assert(!this.completed)\n\n if (channels.headers.hasSubscribers) {\n channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })\n }\n\n const controller = this[kController]\n if (controller) {\n controller[kResume] = resume\n controller.rawHeaders = headers\n }\n\n const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers\n\n try {\n this[kHandler].onResponseStart?.(controller, statusCode, parsedHeaders, statusText)\n return !controller?.paused\n } catch (err) {\n this.abort(err)\n return false\n }\n }\n\n onResponseData (chunk) {\n assert(!this.aborted)\n assert(!this.completed)\n\n if (channels.bodyChunkReceived.hasSubscribers) {\n channels.bodyChunkReceived.publish({ request: this, chunk })\n }\n\n const controller = this[kController]\n try {\n this[kHandler].onResponseData?.(controller, chunk)\n return !controller?.paused\n } catch (err) {\n this.abort(err)\n return false\n }\n }\n\n onRequestUpgrade (statusCode, headers, socket) {\n assert(!this.aborted)\n assert(!this.completed)\n\n const controller = this[kController]\n if (controller) {\n controller.rawHeaders = headers\n }\n\n const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers\n\n return this[kHandler].onRequestUpgrade?.(controller, statusCode, parsedHeaders, socket)\n }\n\n onResponseEnd (trailers) {\n this.onFinally()\n\n assert(!this.aborted)\n assert(!this.completed)\n\n this.completed = true\n if (channels.trailers.hasSubscribers) {\n channels.trailers.publish({ request: this, trailers })\n }\n\n const controller = this[kController]\n if (controller) {\n controller.rawTrailers = trailers\n }\n\n const parsedTrailers = Array.isArray(trailers) ? parseHeaders(trailers) : trailers\n\n try {\n return this[kHandler].onResponseEnd?.(controller, parsedTrailers)\n } catch (err) {\n // TODO (fix): This might be a bad idea?\n this.onResponseError(err)\n }\n }\n\n onResponseError (error) {\n this.onFinally()\n\n if (channels.error.hasSubscribers) {\n channels.error.publish({ request: this, error })\n }\n\n if (this.aborted) {\n return\n }\n this.aborted = true\n\n const controller = this[kController]\n\n return this[kHandler].onResponseError?.(controller, error)\n }\n\n onFinally () {\n if (this.errorHandler) {\n this.body.off('error', this.errorHandler)\n this.errorHandler = null\n }\n\n if (this.endHandler) {\n this.body.off('end', this.endHandler)\n this.endHandler = null\n }\n }\n\n addHeader (key, value) {\n processHeader(this, key, value)\n return this\n }\n}\n\nfunction processHeader (request, key, val) {\n if (val && (typeof val === 'object' && !Array.isArray(val))) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n } else if (val === undefined) {\n return\n }\n\n let headerName = headerNameLowerCasedRecord[key]\n\n if (headerName === undefined) {\n headerName = key.toLowerCase()\n if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) {\n throw new InvalidArgumentError('invalid header key')\n }\n }\n\n if (Array.isArray(val)) {\n const arr = []\n for (let i = 0; i < val.length; i++) {\n if (typeof val[i] === 'string') {\n if (!isValidHeaderValue(val[i])) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n arr.push(val[i])\n } else if (val[i] === null) {\n arr.push('')\n } else if (typeof val[i] === 'object') {\n throw new InvalidArgumentError(`invalid ${key} header`)\n } else {\n arr.push(`${val[i]}`)\n }\n }\n val = arr\n } else if (typeof val === 'string') {\n if (!isValidHeaderValue(val)) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n } else if (val === null) {\n val = ''\n } else {\n val = `${val}`\n }\n\n if (headerName === 'host') {\n if (request.host !== null) {\n throw new InvalidArgumentError('duplicate host header')\n }\n if (typeof val !== 'string') {\n throw new InvalidArgumentError('invalid host header')\n }\n // Consumed by Client\n request.host = val\n } else if (headerName === 'content-length') {\n if (request.contentLength !== null) {\n throw new InvalidArgumentError('duplicate content-length header')\n }\n request.contentLength = parseInt(val, 10)\n if (!Number.isFinite(request.contentLength)) {\n throw new InvalidArgumentError('invalid content-length header')\n }\n } else if (request.contentType === null && headerName === 'content-type') {\n request.contentType = val\n request.headers.push(key, val)\n } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') {\n throw new InvalidArgumentError(`invalid ${headerName} header`)\n } else if (headerName === 'connection') {\n // Per RFC 7230 Section 6.1, Connection header can contain\n // a comma-separated list of connection option tokens (header names)\n const value = typeof val === 'string' ? val : null\n if (value === null) {\n throw new InvalidArgumentError('invalid connection header')\n }\n\n for (const token of value.toLowerCase().split(',')) {\n const trimmed = token.trim()\n if (!isValidHTTPToken(trimmed)) {\n throw new InvalidArgumentError('invalid connection header')\n }\n if (trimmed === 'close') {\n request.reset = true\n }\n }\n } else if (headerName === 'expect') {\n throw new NotSupportedError('expect header not supported')\n } else {\n request.headers.push(key, val)\n }\n}\n\nmodule.exports = Request\n","'use strict'\nconst EventEmitter = require('node:events')\n\nclass Dispatcher extends EventEmitter {\n dispatch () {\n throw new Error('not implemented')\n }\n\n close () {\n throw new Error('not implemented')\n }\n\n destroy () {\n throw new Error('not implemented')\n }\n\n compose (...args) {\n // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...\n const interceptors = Array.isArray(args[0]) ? args[0] : args\n let dispatch = this.dispatch.bind(this)\n\n for (const interceptor of interceptors) {\n if (interceptor == null) {\n continue\n }\n\n if (typeof interceptor !== 'function') {\n throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)\n }\n\n dispatch = interceptor(dispatch)\n\n if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {\n throw new TypeError('invalid interceptor')\n }\n }\n\n return new Proxy(this, {\n get: (target, key) => key === 'dispatch' ? dispatch : target[key]\n })\n }\n}\n\nmodule.exports = Dispatcher\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst {\n ClientDestroyedError,\n ClientClosedError,\n InvalidArgumentError\n} = require('../core/errors')\nconst { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require('../core/symbols')\n\nconst kOnDestroyed = Symbol('onDestroyed')\nconst kOnClosed = Symbol('onClosed')\nconst kWebSocketOptions = Symbol('webSocketOptions')\n\nclass DispatcherBase extends Dispatcher {\n /** @type {boolean} */\n [kDestroyed] = false;\n\n /** @type {Array|null} */\n [kOnClosed] = null\n\n /**\n * @param {import('../../types/dispatcher').DispatcherOptions} [opts]\n */\n constructor (opts) {\n super()\n this[kWebSocketOptions] = opts?.webSocket ?? {}\n }\n\n /**\n * @returns {import('../../types/dispatcher').WebSocketOptions}\n */\n get webSocketOptions () {\n return {\n maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 // 128 MB default\n }\n }\n\n /** @returns {boolean} */\n get destroyed () {\n return this[kDestroyed]\n }\n\n /** @returns {boolean} */\n get closed () {\n return this[kClosed]\n }\n\n close (callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.close((err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n const err = new ClientDestroyedError()\n queueMicrotask(() => callback(err, null))\n return\n }\n\n if (this[kClosed]) {\n if (this[kOnClosed]) {\n this[kOnClosed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n this[kClosed] = true\n this[kOnClosed] ??= []\n this[kOnClosed].push(callback)\n\n const onClosed = () => {\n const callbacks = this[kOnClosed]\n this[kOnClosed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kClose]()\n .then(() => this.destroy())\n .then(() => queueMicrotask(onClosed))\n }\n\n destroy (err, callback) {\n if (typeof err === 'function') {\n callback = err\n err = null\n }\n\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.destroy(err, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n if (this[kOnDestroyed]) {\n this[kOnDestroyed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n if (!err) {\n err = new ClientDestroyedError()\n }\n\n this[kDestroyed] = true\n this[kOnDestroyed] ??= []\n this[kOnDestroyed].push(callback)\n\n const onDestroyed = () => {\n const callbacks = this[kOnDestroyed]\n this[kOnDestroyed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kDestroy](err)\n .then(() => queueMicrotask(onDestroyed))\n }\n\n dispatch (opts, handler) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n try {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object.')\n }\n\n if (opts.dispatcher) {\n throw new InvalidArgumentError('opts.dispatcher is not supported by instance methods. Pass opts.dispatcher to the top-level undici functions or call the dispatcher instance method directly.')\n }\n\n if (this[kDestroyed] || this[kOnDestroyed]) {\n throw new ClientDestroyedError()\n }\n\n if (this[kClosed]) {\n throw new ClientClosedError()\n }\n\n return this[kDispatch](opts, handler)\n } catch (err) {\n if (typeof handler.onResponseError !== 'function') {\n throw err\n }\n\n handler.onResponseError(null, err)\n\n return false\n }\n }\n}\n\nmodule.exports = DispatcherBase\n","'use strict'\n\nconst net = require('node:net')\nconst assert = require('node:assert')\nconst util = require('./util')\nconst { InvalidArgumentError } = require('./errors')\n\nlet tls // include tls conditionally since it is not always available\n\n// TODO: session re-use does not wait for the first\n// connection to resolve the session and might therefore\n// resolve the same servername multiple times even when\n// re-use is enabled.\n\nconst SessionCache = class WeakSessionCache {\n constructor (maxCachedSessions) {\n this._maxCachedSessions = maxCachedSessions\n this._sessionCache = new Map()\n this._sessionRegistry = new FinalizationRegistry((key) => {\n if (this._sessionCache.size < this._maxCachedSessions) {\n return\n }\n\n const ref = this._sessionCache.get(key)\n if (ref !== undefined && ref.deref() === undefined) {\n this._sessionCache.delete(key)\n }\n })\n }\n\n get (sessionKey) {\n const ref = this._sessionCache.get(sessionKey)\n return ref ? ref.deref() : null\n }\n\n set (sessionKey, session) {\n if (this._maxCachedSessions === 0) {\n return\n }\n\n this._sessionCache.set(sessionKey, new WeakRef(session))\n this._sessionRegistry.register(session, sessionKey)\n }\n}\n\nfunction buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {\n if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {\n throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')\n }\n\n const options = { path: socketPath, ...opts }\n const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)\n timeout = timeout == null ? 10e3 : timeout\n allowH2 = allowH2 != null ? allowH2 : true\n return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {\n let socket\n if (protocol === 'https:') {\n if (!tls) {\n tls = require('node:tls')\n }\n servername = servername || options.servername || util.getServerName(host) || null\n\n const sessionKey = servername || hostname\n assert(sessionKey)\n\n const session = customSession || sessionCache.get(sessionKey) || null\n\n port = port || 443\n\n socket = tls.connect({\n highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...\n ...options,\n servername,\n session,\n localAddress,\n ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],\n socket: httpSocket, // upgrade socket connection\n port,\n host: hostname\n })\n\n socket\n .on('session', function (session) {\n // TODO (fix): Can a session become invalid once established? Don't think so?\n sessionCache.set(sessionKey, session)\n })\n } else {\n assert(!httpSocket, 'httpSocket can only be sent on TLS update')\n\n port = port || 80\n\n socket = net.connect({\n highWaterMark: 64 * 1024, // Same as nodejs fs streams.\n ...options,\n localAddress,\n port,\n host: hostname\n })\n if (useH2c === true) {\n socket.alpnProtocol = 'h2'\n }\n }\n\n // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket\n if (options.keepAlive == null || options.keepAlive) {\n const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay\n socket.setKeepAlive(true, keepAliveInitialDelay)\n }\n\n const clearConnectTimeout = util.setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port })\n\n socket\n .setNoDelay(true)\n .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {\n queueMicrotask(clearConnectTimeout)\n\n if (callback) {\n const cb = callback\n callback = null\n cb(null, this)\n }\n })\n .on('error', function (err) {\n queueMicrotask(clearConnectTimeout)\n\n if (callback) {\n const cb = callback\n callback = null\n cb(err)\n }\n })\n\n return socket\n }\n}\n\nmodule.exports = buildConnector\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.enumToMap = enumToMap;\nfunction enumToMap(obj, filter = [], exceptions = []) {\n const emptyFilter = (filter?.length ?? 0) === 0;\n const emptyExceptions = (exceptions?.length ?? 0) === 0;\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => {\n return (typeof value === 'number' &&\n (emptyFilter || filter.includes(value)) &&\n (emptyExceptions || !exceptions.includes(value)));\n }));\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SPECIAL_HEADERS = exports.MINOR = exports.MAJOR = exports.HTAB_SP_VCHAR_OBS_TEXT = exports.QUOTED_STRING = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.HEX = exports.URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.STATUSES_HTTP = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.HEADER_STATE = exports.FINISH = exports.STATUSES = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0;\nconst utils_1 = require(\"./utils\");\n// Emums\nexports.ERROR = {\n OK: 0,\n INTERNAL: 1,\n STRICT: 2,\n CR_EXPECTED: 25,\n LF_EXPECTED: 3,\n UNEXPECTED_CONTENT_LENGTH: 4,\n UNEXPECTED_SPACE: 30,\n CLOSED_CONNECTION: 5,\n INVALID_METHOD: 6,\n INVALID_URL: 7,\n INVALID_CONSTANT: 8,\n INVALID_VERSION: 9,\n INVALID_HEADER_TOKEN: 10,\n INVALID_CONTENT_LENGTH: 11,\n INVALID_CHUNK_SIZE: 12,\n INVALID_STATUS: 13,\n INVALID_EOF_STATE: 14,\n INVALID_TRANSFER_ENCODING: 15,\n CB_MESSAGE_BEGIN: 16,\n CB_HEADERS_COMPLETE: 17,\n CB_MESSAGE_COMPLETE: 18,\n CB_CHUNK_HEADER: 19,\n CB_CHUNK_COMPLETE: 20,\n PAUSED: 21,\n PAUSED_UPGRADE: 22,\n PAUSED_H2_UPGRADE: 23,\n USER: 24,\n CB_URL_COMPLETE: 26,\n CB_STATUS_COMPLETE: 27,\n CB_METHOD_COMPLETE: 32,\n CB_VERSION_COMPLETE: 33,\n CB_HEADER_FIELD_COMPLETE: 28,\n CB_HEADER_VALUE_COMPLETE: 29,\n CB_CHUNK_EXTENSION_NAME_COMPLETE: 34,\n CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35,\n CB_RESET: 31,\n CB_PROTOCOL_COMPLETE: 38,\n};\nexports.TYPE = {\n BOTH: 0, // default\n REQUEST: 1,\n RESPONSE: 2,\n};\nexports.FLAGS = {\n CONNECTION_KEEP_ALIVE: 1 << 0,\n CONNECTION_CLOSE: 1 << 1,\n CONNECTION_UPGRADE: 1 << 2,\n CHUNKED: 1 << 3,\n UPGRADE: 1 << 4,\n CONTENT_LENGTH: 1 << 5,\n SKIPBODY: 1 << 6,\n TRAILING: 1 << 7,\n // 1 << 8 is unused\n TRANSFER_ENCODING: 1 << 9,\n};\nexports.LENIENT_FLAGS = {\n HEADERS: 1 << 0,\n CHUNKED_LENGTH: 1 << 1,\n KEEP_ALIVE: 1 << 2,\n TRANSFER_ENCODING: 1 << 3,\n VERSION: 1 << 4,\n DATA_AFTER_CLOSE: 1 << 5,\n OPTIONAL_LF_AFTER_CR: 1 << 6,\n OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7,\n OPTIONAL_CR_BEFORE_LF: 1 << 8,\n SPACES_AFTER_CHUNK_SIZE: 1 << 9,\n};\nexports.METHODS = {\n 'DELETE': 0,\n 'GET': 1,\n 'HEAD': 2,\n 'POST': 3,\n 'PUT': 4,\n /* pathological */\n 'CONNECT': 5,\n 'OPTIONS': 6,\n 'TRACE': 7,\n /* WebDAV */\n 'COPY': 8,\n 'LOCK': 9,\n 'MKCOL': 10,\n 'MOVE': 11,\n 'PROPFIND': 12,\n 'PROPPATCH': 13,\n 'SEARCH': 14,\n 'UNLOCK': 15,\n 'BIND': 16,\n 'REBIND': 17,\n 'UNBIND': 18,\n 'ACL': 19,\n /* subversion */\n 'REPORT': 20,\n 'MKACTIVITY': 21,\n 'CHECKOUT': 22,\n 'MERGE': 23,\n /* upnp */\n 'M-SEARCH': 24,\n 'NOTIFY': 25,\n 'SUBSCRIBE': 26,\n 'UNSUBSCRIBE': 27,\n /* RFC-5789 */\n 'PATCH': 28,\n 'PURGE': 29,\n /* CalDAV */\n 'MKCALENDAR': 30,\n /* RFC-2068, section 19.6.1.2 */\n 'LINK': 31,\n 'UNLINK': 32,\n /* icecast */\n 'SOURCE': 33,\n /* RFC-7540, section 11.6 */\n 'PRI': 34,\n /* RFC-2326 RTSP */\n 'DESCRIBE': 35,\n 'ANNOUNCE': 36,\n 'SETUP': 37,\n 'PLAY': 38,\n 'PAUSE': 39,\n 'TEARDOWN': 40,\n 'GET_PARAMETER': 41,\n 'SET_PARAMETER': 42,\n 'REDIRECT': 43,\n 'RECORD': 44,\n /* RAOP */\n 'FLUSH': 45,\n /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */\n 'QUERY': 46,\n};\nexports.STATUSES = {\n CONTINUE: 100,\n SWITCHING_PROTOCOLS: 101,\n PROCESSING: 102,\n EARLY_HINTS: 103,\n RESPONSE_IS_STALE: 110, // Unofficial\n REVALIDATION_FAILED: 111, // Unofficial\n DISCONNECTED_OPERATION: 112, // Unofficial\n HEURISTIC_EXPIRATION: 113, // Unofficial\n MISCELLANEOUS_WARNING: 199, // Unofficial\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NON_AUTHORITATIVE_INFORMATION: 203,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n MULTI_STATUS: 207,\n ALREADY_REPORTED: 208,\n TRANSFORMATION_APPLIED: 214, // Unofficial\n IM_USED: 226,\n MISCELLANEOUS_PERSISTENT_WARNING: 299, // Unofficial\n MULTIPLE_CHOICES: 300,\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n USE_PROXY: 305,\n SWITCH_PROXY: 306, // No longer used\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n PROXY_AUTHENTICATION_REQUIRED: 407,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n RANGE_NOT_SATISFIABLE: 416,\n EXPECTATION_FAILED: 417,\n IM_A_TEAPOT: 418,\n PAGE_EXPIRED: 419, // Unofficial\n ENHANCE_YOUR_CALM: 420, // Unofficial\n MISDIRECTED_REQUEST: 421,\n UNPROCESSABLE_ENTITY: 422,\n LOCKED: 423,\n FAILED_DEPENDENCY: 424,\n TOO_EARLY: 425,\n UPGRADE_REQUIRED: 426,\n PRECONDITION_REQUIRED: 428,\n TOO_MANY_REQUESTS: 429,\n REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, // Unofficial\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n LOGIN_TIMEOUT: 440, // Unofficial\n NO_RESPONSE: 444, // Unofficial\n RETRY_WITH: 449, // Unofficial\n BLOCKED_BY_PARENTAL_CONTROL: 450, // Unofficial\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\n CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, // Unofficial\n INVALID_X_FORWARDED_FOR: 463, // Unofficial\n REQUEST_HEADER_TOO_LARGE: 494, // Unofficial\n SSL_CERTIFICATE_ERROR: 495, // Unofficial\n SSL_CERTIFICATE_REQUIRED: 496, // Unofficial\n HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, // Unofficial\n INVALID_TOKEN: 498, // Unofficial\n CLIENT_CLOSED_REQUEST: 499, // Unofficial\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n VARIANT_ALSO_NEGOTIATES: 506,\n INSUFFICIENT_STORAGE: 507,\n LOOP_DETECTED: 508,\n BANDWIDTH_LIMIT_EXCEEDED: 509,\n NOT_EXTENDED: 510,\n NETWORK_AUTHENTICATION_REQUIRED: 511,\n WEB_SERVER_UNKNOWN_ERROR: 520, // Unofficial\n WEB_SERVER_IS_DOWN: 521, // Unofficial\n CONNECTION_TIMEOUT: 522, // Unofficial\n ORIGIN_IS_UNREACHABLE: 523, // Unofficial\n TIMEOUT_OCCURED: 524, // Unofficial\n SSL_HANDSHAKE_FAILED: 525, // Unofficial\n INVALID_SSL_CERTIFICATE: 526, // Unofficial\n RAILGUN_ERROR: 527, // Unofficial\n SITE_IS_OVERLOADED: 529, // Unofficial\n SITE_IS_FROZEN: 530, // Unofficial\n IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, // Unofficial\n NETWORK_READ_TIMEOUT: 598, // Unofficial\n NETWORK_CONNECT_TIMEOUT: 599, // Unofficial\n};\nexports.FINISH = {\n SAFE: 0,\n SAFE_WITH_CB: 1,\n UNSAFE: 2,\n};\nexports.HEADER_STATE = {\n GENERAL: 0,\n CONNECTION: 1,\n CONTENT_LENGTH: 2,\n TRANSFER_ENCODING: 3,\n UPGRADE: 4,\n CONNECTION_KEEP_ALIVE: 5,\n CONNECTION_CLOSE: 6,\n CONNECTION_UPGRADE: 7,\n TRANSFER_ENCODING_CHUNKED: 8,\n};\n// C headers\nexports.METHODS_HTTP = [\n exports.METHODS.DELETE,\n exports.METHODS.GET,\n exports.METHODS.HEAD,\n exports.METHODS.POST,\n exports.METHODS.PUT,\n exports.METHODS.CONNECT,\n exports.METHODS.OPTIONS,\n exports.METHODS.TRACE,\n exports.METHODS.COPY,\n exports.METHODS.LOCK,\n exports.METHODS.MKCOL,\n exports.METHODS.MOVE,\n exports.METHODS.PROPFIND,\n exports.METHODS.PROPPATCH,\n exports.METHODS.SEARCH,\n exports.METHODS.UNLOCK,\n exports.METHODS.BIND,\n exports.METHODS.REBIND,\n exports.METHODS.UNBIND,\n exports.METHODS.ACL,\n exports.METHODS.REPORT,\n exports.METHODS.MKACTIVITY,\n exports.METHODS.CHECKOUT,\n exports.METHODS.MERGE,\n exports.METHODS['M-SEARCH'],\n exports.METHODS.NOTIFY,\n exports.METHODS.SUBSCRIBE,\n exports.METHODS.UNSUBSCRIBE,\n exports.METHODS.PATCH,\n exports.METHODS.PURGE,\n exports.METHODS.MKCALENDAR,\n exports.METHODS.LINK,\n exports.METHODS.UNLINK,\n exports.METHODS.PRI,\n // TODO(indutny): should we allow it with HTTP?\n exports.METHODS.SOURCE,\n exports.METHODS.QUERY,\n];\nexports.METHODS_ICE = [\n exports.METHODS.SOURCE,\n];\nexports.METHODS_RTSP = [\n exports.METHODS.OPTIONS,\n exports.METHODS.DESCRIBE,\n exports.METHODS.ANNOUNCE,\n exports.METHODS.SETUP,\n exports.METHODS.PLAY,\n exports.METHODS.PAUSE,\n exports.METHODS.TEARDOWN,\n exports.METHODS.GET_PARAMETER,\n exports.METHODS.SET_PARAMETER,\n exports.METHODS.REDIRECT,\n exports.METHODS.RECORD,\n exports.METHODS.FLUSH,\n // For AirPlay\n exports.METHODS.GET,\n exports.METHODS.POST,\n];\nexports.METHOD_MAP = (0, utils_1.enumToMap)(exports.METHODS);\nexports.H_METHOD_MAP = Object.fromEntries(Object.entries(exports.METHODS).filter(([k]) => k.startsWith('H')));\nexports.STATUSES_HTTP = [\n exports.STATUSES.CONTINUE,\n exports.STATUSES.SWITCHING_PROTOCOLS,\n exports.STATUSES.PROCESSING,\n exports.STATUSES.EARLY_HINTS,\n exports.STATUSES.RESPONSE_IS_STALE,\n exports.STATUSES.REVALIDATION_FAILED,\n exports.STATUSES.DISCONNECTED_OPERATION,\n exports.STATUSES.HEURISTIC_EXPIRATION,\n exports.STATUSES.MISCELLANEOUS_WARNING,\n exports.STATUSES.OK,\n exports.STATUSES.CREATED,\n exports.STATUSES.ACCEPTED,\n exports.STATUSES.NON_AUTHORITATIVE_INFORMATION,\n exports.STATUSES.NO_CONTENT,\n exports.STATUSES.RESET_CONTENT,\n exports.STATUSES.PARTIAL_CONTENT,\n exports.STATUSES.MULTI_STATUS,\n exports.STATUSES.ALREADY_REPORTED,\n exports.STATUSES.TRANSFORMATION_APPLIED,\n exports.STATUSES.IM_USED,\n exports.STATUSES.MISCELLANEOUS_PERSISTENT_WARNING,\n exports.STATUSES.MULTIPLE_CHOICES,\n exports.STATUSES.MOVED_PERMANENTLY,\n exports.STATUSES.FOUND,\n exports.STATUSES.SEE_OTHER,\n exports.STATUSES.NOT_MODIFIED,\n exports.STATUSES.USE_PROXY,\n exports.STATUSES.SWITCH_PROXY,\n exports.STATUSES.TEMPORARY_REDIRECT,\n exports.STATUSES.PERMANENT_REDIRECT,\n exports.STATUSES.BAD_REQUEST,\n exports.STATUSES.UNAUTHORIZED,\n exports.STATUSES.PAYMENT_REQUIRED,\n exports.STATUSES.FORBIDDEN,\n exports.STATUSES.NOT_FOUND,\n exports.STATUSES.METHOD_NOT_ALLOWED,\n exports.STATUSES.NOT_ACCEPTABLE,\n exports.STATUSES.PROXY_AUTHENTICATION_REQUIRED,\n exports.STATUSES.REQUEST_TIMEOUT,\n exports.STATUSES.CONFLICT,\n exports.STATUSES.GONE,\n exports.STATUSES.LENGTH_REQUIRED,\n exports.STATUSES.PRECONDITION_FAILED,\n exports.STATUSES.PAYLOAD_TOO_LARGE,\n exports.STATUSES.URI_TOO_LONG,\n exports.STATUSES.UNSUPPORTED_MEDIA_TYPE,\n exports.STATUSES.RANGE_NOT_SATISFIABLE,\n exports.STATUSES.EXPECTATION_FAILED,\n exports.STATUSES.IM_A_TEAPOT,\n exports.STATUSES.PAGE_EXPIRED,\n exports.STATUSES.ENHANCE_YOUR_CALM,\n exports.STATUSES.MISDIRECTED_REQUEST,\n exports.STATUSES.UNPROCESSABLE_ENTITY,\n exports.STATUSES.LOCKED,\n exports.STATUSES.FAILED_DEPENDENCY,\n exports.STATUSES.TOO_EARLY,\n exports.STATUSES.UPGRADE_REQUIRED,\n exports.STATUSES.PRECONDITION_REQUIRED,\n exports.STATUSES.TOO_MANY_REQUESTS,\n exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL,\n exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE,\n exports.STATUSES.LOGIN_TIMEOUT,\n exports.STATUSES.NO_RESPONSE,\n exports.STATUSES.RETRY_WITH,\n exports.STATUSES.BLOCKED_BY_PARENTAL_CONTROL,\n exports.STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS,\n exports.STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST,\n exports.STATUSES.INVALID_X_FORWARDED_FOR,\n exports.STATUSES.REQUEST_HEADER_TOO_LARGE,\n exports.STATUSES.SSL_CERTIFICATE_ERROR,\n exports.STATUSES.SSL_CERTIFICATE_REQUIRED,\n exports.STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT,\n exports.STATUSES.INVALID_TOKEN,\n exports.STATUSES.CLIENT_CLOSED_REQUEST,\n exports.STATUSES.INTERNAL_SERVER_ERROR,\n exports.STATUSES.NOT_IMPLEMENTED,\n exports.STATUSES.BAD_GATEWAY,\n exports.STATUSES.SERVICE_UNAVAILABLE,\n exports.STATUSES.GATEWAY_TIMEOUT,\n exports.STATUSES.HTTP_VERSION_NOT_SUPPORTED,\n exports.STATUSES.VARIANT_ALSO_NEGOTIATES,\n exports.STATUSES.INSUFFICIENT_STORAGE,\n exports.STATUSES.LOOP_DETECTED,\n exports.STATUSES.BANDWIDTH_LIMIT_EXCEEDED,\n exports.STATUSES.NOT_EXTENDED,\n exports.STATUSES.NETWORK_AUTHENTICATION_REQUIRED,\n exports.STATUSES.WEB_SERVER_UNKNOWN_ERROR,\n exports.STATUSES.WEB_SERVER_IS_DOWN,\n exports.STATUSES.CONNECTION_TIMEOUT,\n exports.STATUSES.ORIGIN_IS_UNREACHABLE,\n exports.STATUSES.TIMEOUT_OCCURED,\n exports.STATUSES.SSL_HANDSHAKE_FAILED,\n exports.STATUSES.INVALID_SSL_CERTIFICATE,\n exports.STATUSES.RAILGUN_ERROR,\n exports.STATUSES.SITE_IS_OVERLOADED,\n exports.STATUSES.SITE_IS_FROZEN,\n exports.STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR,\n exports.STATUSES.NETWORK_READ_TIMEOUT,\n exports.STATUSES.NETWORK_CONNECT_TIMEOUT,\n];\nexports.ALPHA = [];\nfor (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {\n // Upper case\n exports.ALPHA.push(String.fromCharCode(i));\n // Lower case\n exports.ALPHA.push(String.fromCharCode(i + 0x20));\n}\nexports.NUM_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n};\nexports.HEX_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF,\n a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf,\n};\nexports.NUM = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n];\nexports.ALPHANUM = exports.ALPHA.concat(exports.NUM);\nexports.MARK = ['-', '_', '.', '!', '~', '*', '\\'', '(', ')'];\nexports.USERINFO_CHARS = exports.ALPHANUM\n .concat(exports.MARK)\n .concat(['%', ';', ':', '&', '=', '+', '$', ',']);\n// TODO(indutny): use RFC\nexports.URL_CHAR = [\n '!', '\"', '$', '%', '&', '\\'',\n '(', ')', '*', '+', ',', '-', '.', '/',\n ':', ';', '<', '=', '>',\n '@', '[', '\\\\', ']', '^', '_',\n '`',\n '{', '|', '}', '~',\n].concat(exports.ALPHANUM);\nexports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']);\n/* Tokens as defined by rfc 2616. Also lowercases them.\n * token = 1*\n * separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n * | \",\" | \";\" | \":\" | \"\\\" | <\">\n * | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n * | \"{\" | \"}\" | SP | HT\n */\nexports.TOKEN = [\n '!', '#', '$', '%', '&', '\\'',\n '*', '+', '-', '.',\n '^', '_', '`',\n '|', '~',\n].concat(exports.ALPHANUM);\n/*\n * Verify that a char is a valid visible (printable) US-ASCII\n * character or %x80-FF\n */\nexports.HEADER_CHARS = ['\\t'];\nfor (let i = 32; i <= 255; i++) {\n if (i !== 127) {\n exports.HEADER_CHARS.push(i);\n }\n}\n// ',' = \\x44\nexports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44);\nexports.QUOTED_STRING = ['\\t', ' '];\nfor (let i = 0x21; i <= 0xff; i++) {\n if (i !== 0x22 && i !== 0x5c) { // All characters in ASCII except \\ and \"\n exports.QUOTED_STRING.push(i);\n }\n}\nexports.HTAB_SP_VCHAR_OBS_TEXT = ['\\t', ' '];\n// VCHAR: https://tools.ietf.org/html/rfc5234#appendix-B.1\nfor (let i = 0x21; i <= 0x7E; i++) {\n exports.HTAB_SP_VCHAR_OBS_TEXT.push(i);\n}\n// OBS_TEXT: https://datatracker.ietf.org/doc/html/rfc9110#name-collected-abnf\nfor (let i = 0x80; i <= 0xff; i++) {\n exports.HTAB_SP_VCHAR_OBS_TEXT.push(i);\n}\nexports.MAJOR = exports.NUM_MAP;\nexports.MINOR = exports.MAJOR;\nexports.SPECIAL_HEADERS = {\n 'connection': exports.HEADER_STATE.CONNECTION,\n 'content-length': exports.HEADER_STATE.CONTENT_LENGTH,\n 'proxy-connection': exports.HEADER_STATE.CONNECTION,\n 'transfer-encoding': exports.HEADER_STATE.TRANSFER_ENCODING,\n 'upgrade': exports.HEADER_STATE.UPGRADE,\n};\nexports.default = {\n ERROR: exports.ERROR,\n TYPE: exports.TYPE,\n FLAGS: exports.FLAGS,\n LENIENT_FLAGS: exports.LENIENT_FLAGS,\n METHODS: exports.METHODS,\n STATUSES: exports.STATUSES,\n FINISH: exports.FINISH,\n HEADER_STATE: exports.HEADER_STATE,\n ALPHA: exports.ALPHA,\n NUM_MAP: exports.NUM_MAP,\n HEX_MAP: exports.HEX_MAP,\n NUM: exports.NUM,\n ALPHANUM: exports.ALPHANUM,\n MARK: exports.MARK,\n USERINFO_CHARS: exports.USERINFO_CHARS,\n URL_CHAR: exports.URL_CHAR,\n HEX: exports.HEX,\n TOKEN: exports.TOKEN,\n HEADER_CHARS: exports.HEADER_CHARS,\n CONNECTION_TOKEN_CHARS: exports.CONNECTION_TOKEN_CHARS,\n QUOTED_STRING: exports.QUOTED_STRING,\n HTAB_SP_VCHAR_OBS_TEXT: exports.HTAB_SP_VCHAR_OBS_TEXT,\n MAJOR: exports.MAJOR,\n MINOR: exports.MINOR,\n SPECIAL_HEADERS: exports.SPECIAL_HEADERS,\n METHODS_HTTP: exports.METHODS_HTTP,\n METHODS_ICE: exports.METHODS_ICE,\n METHODS_RTSP: exports.METHODS_RTSP,\n METHOD_MAP: exports.METHOD_MAP,\n H_METHOD_MAP: exports.H_METHOD_MAP,\n STATUSES_HTTP: exports.STATUSES_HTTP,\n};\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\n\nconst wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgL5YUCAgd/A34gASACaiEEAkAgACIDKAIMIgANACADKAIEBEAgAyABNgIECyMAQRBrIgkkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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C0HjAQwHC0HXAQwGC0HYAQwFC0HZAQwEC0HaAQwDC0HbAQwCC0HdAQwBC0HcAQshAgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAg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ogKiAqICogKiAqICogKiAqICogKiAqICogIAogILIAQgAUEBaiIBRw0AC0HJACECDOwCCyABQQFqIQEgA0Evai0AAEEBcQ2lAiADQQA2AhwgAyABNgIUIANBlxA2AhAgA0EKNgIMQQAhAgzrAgsgASAERwRAA0AgAS0AAEEgRw0VIAQgAUEBaiIBRw0AC0H4ACECDOsCC0H4ACECDOoCCyADQQI6ACgMOAtBACECIANBADYCHCADQb8LNgIQIANBAjYCDCADIAFBAWo2AhQM6AILQQAhAgzOAgtBDSECDM0CC0ETIQIMzAILQRUhAgzLAgtBFiECDMoCC0EYIQIMyQILQRkhAgzIAgtBGiECDMcCC0EbIQIMxgILQRwhAgzFAgtBHSECDMQCC0EeIQIMwwILQR8hAgzCAgtBICECDMECC0EiIQIMwAILQSMhAgy/AgtBJSECDL4CC0HlACECDL0CCyADQT02AhwgAyABNgIUIAMgADYCDEEAIQIM1QILIANBGzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDNQCCyADQSA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzTAgsgA0ETNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0gILIANBCzYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNECCyADQRA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzQAgsgA0EgNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzwILIANBCzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM4CCyADQQw2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzNAgtBACECIANBADYCHCADIAE2AhQgA0HdDjYCECADQRI2AgwMzAILAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB/QEhAgzMAgsCQAJAIAMtADZBAUcNAEEAIQACQCADKAI4IgJFDQAgAigCYCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUcNASADQfwBNgIcIAMgATYCFCADQdwZNgIQIANBFTYCDEEAIQIMzQILQdwBIQIMswILIANBADYCHCADIAE2AhQgA0H5CzYCECADQR82AgxBACECDMsCCwJAAkAgAy0AKEEBaw4CBAEAC0HbASECDLICC0HUASECDLECCyADQQI6ADFBACEAAkAgAygCOCICRQ0AIAIoAgAiAkUNACADIAIRAAAhAAsgAEUEQEHdASECDLECCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQbQMNgIQIANBEDYCDEEAIQIMygILIANB+wE2AhwgAyABNgIUIANBgRo2AhAgA0EVNgIMQQAhAgzJAgsgASAERgRAQfoBIQIMyQILIAEtAABByABGDQEgA0EBOgAoC0HAASECDK4CC0HaASECDK0CCyABIARHBEAgA0EMNgIIIAMgATYCBEHZASECDK0CC0H5ASECDMUCCyABIARGBEBB+AEhAgzFAgsgAS0AAEHIAEcNBCABQQFqIQFB2AEhAgyrAgsgASAERgRAQfcBIQIMxAILAkACQCABLQAAQcUAaw4QAAUFBQUFBQUFBQUFBQUFAQULIAFBAWohAUHWASECDKsCCyABQQFqIQFB1wEhAgyqAgtB9gEhAiABIARGDcICIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbrVAGotAABHDQMgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMMCCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIARQRAQeMBIQIMqgILIANB9QE2AhwgAyABNgIUIAMgADYCDEEAIQIMwgILQfQBIQIgASAERg3BAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEG41QBqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzCAgsgA0GBBDsBKCADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIADQMMAgsgA0EANgIAC0EAIQIgA0EANgIcIAMgATYCFCADQeUfNgIQIANBCDYCDAy/AgtB1QEhAgylAgsgA0HzATYCHCADIAE2AhQgAyAANgIMQQAhAgy9AgtBACEAAkAgAygCOCICRQ0AIAIoAkAiAkUNACADIAIRAAAhAAsgAEUNbiAAQRVHBEAgA0EANgIcIAMgATYCFCADQYIPNgIQIANBIDYCDEEAIQIMvQILIANBjwE2AhwgAyABNgIUIANB7Bs2AhAgA0EVNgIMQQAhAgy8AgsgASAERwRAIANBDTYCCCADIAE2AgRB0wEhAgyjAgtB8gEhAgy7AgsgASAERgRAQfEBIQIMuwILAkACQAJAIAEtAABByABrDgsAAQgICAgICAgIAggLIAFBAWohAUHQASECDKMCCyABQQFqIQFB0QEhAgyiAgsgAUEBaiEBQdIBIQIMoQILQfABIQIgASAERg25AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBtdUAai0AAEcNBCAAQQJGDQMgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuQILQe8BIQIgASAERg24AiADKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABBs9UAai0AAEcNAyAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuAILQe4BIQIgASAERg23AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMtwILIAMoAgQhACADQgA3AwAgAyAAIAVBAWoiARArIgBFDQIgA0HsATYCHCADIAE2AhQgAyAANgIMQQAhAgy2AgsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNnAIgA0HtATYCHCADIAE2AhQgAyAANgIMQQAhAgy0AgtBzwEhAgyaAgtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDLQCC0HOASECDJoCCyADQesBNgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMsgILIAEgBEYEQEHrASECDLICCyABLQAAQS9GBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GyODYCECADQQg2AgxBACECDLECC0HNASECDJcCCyABIARHBEAgA0EONgIIIAMgATYCBEHMASECDJcCC0HqASECDK8CCyABIARGBEBB6QEhAgyvAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBywEhAgyWAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZcCIANB6AE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAEgBEYEQEHnASECDK4CCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5gE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILQcoBIQIMlAILIAEgBEYEQEHlASECDK0CC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDQIgA0HiATYCHCADIAE2AhQgAyAANgIMQQAhAgyvAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZoCIANB4wE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ2YAiADQeQBNgIcIAMgATYCFCADIAA2AgwMrQILQckBIQIMkwILQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBpA02AhAgA0EhNgIMQQAhAgytAgtByAEhAgyTAgsgA0HhATYCHCADIAE2AhQgA0HQGjYCECADQRU2AgxBACECDKsCCyABIARGBEBB4QEhAgyrAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANBmRE2AhAgA0EJNgIMQQAhAgyrAgtBxwEhAgyRAgsgASAERgRAQeABIQIMqgILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyrAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqgILQcYBIQIMkAILIAEgBEYEQEHfASECDKkCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqgILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKkCC0HFASECDI8CCyABIARGBEBB3gEhAgyoAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKkCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyoAgtBxAEhAgyOAgsgASAERgRAQd0BIQIMpwILAkACQAJAAkAgAS0AAEEKaw4XAgMDAAMDAwMDAwMDAwMDAwMDAwMDAwEDCyABQQFqDAULIAFBAWohAUHDASECDI8CCyABQQFqIQEgA0Evai0AAEEBcQ0IIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKcCCyADQQA2AhwgAyABNgIUIANBjQs2AhAgA0ENNgIMQQAhAgymAgsgASAERwRAIANBDzYCCCADIAE2AgRBASECDI0CC0HcASECDKUCCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtB2wEhAgymAgsgAygCBCEAIANBADYCBCADIAAgARAtIgBFBEAgAUEBaiEBDAQLIANB2gE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMpQILIAMoAgQhACADQQA2AgQgAyAAIAEQLSIADQEgAUEBagshAUHBASECDIoCCyADQdkBNgIcIAMgADYCDCADIAFBAWo2AhRBACECDKICC0HCASECDIgCCyADQS9qLQAAQQFxDQEgA0EANgIcIAMgATYCFCADQeQcNgIQIANBGTYCDEEAIQIMoAILIAEgBEYEQEHZASEC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IAFBAWohAUGeASECDOQBCyABQQFqIQFBnwEhAgzjAQtBtwEhAiABIARGDfsBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQezUAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPwBCyADQQA2AgAgBkEBaiEBQQ0MKAtBtgEhAiABIARGDfoBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPsBCyADQQA2AgAgBkEBaiEBQQwMJwtBtQEhAiABIARGDfkBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQerUAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPoBCyADQQA2AgAgBkEBaiEBQQMMJgtBtAEhAiABIARGDfgBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQejUAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPkBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQbMBIQIM+AELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBmQEhAgzfAQsgAUEBaiEBQZoBIQIM3gELQbIBIQIgASAERg32ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHm1ABqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz3AQsgA0EANgIAIAZBAWohAUEnDCMLQbEBIQIgASAERg31ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHk1ABqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz2AQsgA0EANgIAIAZBAWohAUEcDCILQbABIQIgASAERg30ASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHe1ABqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz1AQsgA0EANgIAIAZBAWohAUEGDCELQa8BIQIgASAERg3zASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHZ1ABqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz0AQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGuASECDPMBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQY4BIQIM3AELIAFBAWohAUGPASECDNsBCyABQQFqIQFBlAEhAgzaAQsgAUEBaiEBQZUBIQIM2QELQa0BIQIgASAERg3xASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHX1ABqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzyAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGsASECDPEBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGQASECDNgBCyABQQFqIQFBkwEhAgzXAQsgASAERgRAQasBIQIM8AELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQZEBIQIM1wELIAFBAWohAUGSASECDNYBCyABIARGBEBBqgEhAgzvAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GpASECIAEgBEYN7QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABB0dQAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7gELIANBADYCACAGQQFqIQFBHgwaC0GoASECIAEgBEYN7AEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBytQAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7QELIANBADYCACAGQQFqIQFBFQwZC0GnASECIAEgBEYN6wEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBx9QAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7AELIANBADYCACAGQQFqIQFBFwwYC0GmASECIAEgBEYN6gEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBwdQAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6wELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBpQEhAgzqAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYsBIQIM0QELIAFBAWohAUGMASECDNABC0GkASECIAEgBEYN6AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBptUAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6QELIANBADYCACAGQQFqIQFBCQwVC0GjASECIAEgBEYN5wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBpNUAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6AELIANBADYCACAGQQFqIQFBHwwUC0GiASECIAEgBEYN5gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBvtQAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5wELIANBADYCACAGQQFqIQFBAgwTC0GhASECIAEgBEYN5QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQbzUAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOUBCyABIARGBEBBoAEhAgzlAQtBASABLQAAQd8ARw0RGiABQQFqIQFBhwEhAgzLAQsgA0EANgIAIAZBAWohAUGIASECDMoBC0GfASECIAEgBEYN4gEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4wELIANBADYCACAGQQFqIQFBKQwPC0GeASECIAEgBEYN4QEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBuNQAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4gELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBnQEhAgzhAQsgAS0AAEHFAEcNDiABQQFqIQFBhAEhAgzHAQsgASAERgRAQZwBIQIM4AELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFBggEhAgzHAQsgAUEBaiEBQYMBIQIMxgELQZsBIQIgASAERg3eASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGz1ABqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzfAQsgA0EANgIAIAZBAWohAUEjDAsLQZoBIQIgASAERg3dASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGw1ABqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzeAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGZASECDN0BCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQf0AIQIMxAELIAFBAWohAUGAASECDMMBCyABIARGBEBBmAEhAgzcAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB/gAhAgzDAQsgAUEBaiEBQf8AIQIMwgELIAEgBEYEQEGXASECDNsBCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQZYBIQIgASAERg3ZASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEGs1ABqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzaAQsgA0EANgIAIAZBAWohAUEFDAYLQZUBIQIgASAERg3YASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGm1ABqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzZAQsgA0EANgIAIAZBAWohAUEWDAULQZQBIQIgASAERg3XASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzYAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGTASECDNcBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUH5ACECDL4BCyABQQFqIQFB+gAhAgy9AQtBkgEhAiABIARGDdUBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQaDUAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNYBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGRASECDNQBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC4iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB/h82AhAgA0EGNgIMDNEBC0H4ACECDLcBCyADQZABNgIcIAMgATYCFCADIAA2AgxBACECDM8BC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgzOAQtB9wAhAgy0AQsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDMwBCyABIARGBEBBjwEhAgzMAQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GbHzYCECADQQY2AgxBACECDMwBC0ECIQIMsgELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GOASECDMoBCyABIARGBEBBjQEhAgzKAQsCQCABLQAAQQlrDgRKAABKAAtB9QAhAgywAQsgAy0AKUEFRgRAQfYAIQIMsAELQfQAIQIMrwELIAEgBEYEQEGMASECDMgBCyADQRA2AgggAyABNgIEDAoLIAEgBEYEQEGLASECDMcBCwJAIAEtAABBCWsOBEcAAEcAC0HzACECDK0BCyABIARHBEAgA0EQNgIIIAMgATYCBEHxACECDK0BC0GKASECDMUBCwJAIAEgBEcEQANAIAEtAABBoNAAai0AACIAQQNHBEACQCAAQQFrDgJJAAQLQfAAIQIMrwELIAQgAUEBaiIBRw0AC0GIASEC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BCABQQFqIgFHDQALQfsAIQIMpwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMpgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMpQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMpAELIANBADYCHCADIAE2AhQgA0G8CjYCECADQQc2AgxBACECDKMBC0HPACECDIkBC0HRACECDIgBC0HnACECDIcBCyABIARGBEBB+gAhAgygAQsCQCABLQAAQQlrDgQgAAAgAAsgAUEBaiEBQeYAIQIMhgELIAEgBEYEQEH5ACECDJ8BCwJAIAEtAABBCWsOBB8AAB8AC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQRAQeIBIQIMhgELIABBFUcEQCADQQA2AhwgAyABNgIUIANByQ02AhAgA0EaNgIMQQAhAgyfAQsgA0H4ADYCHCADIAE2AhQgA0HqGjYCECADQRU2AgxBACECDJ4BCyABIARHBEAgA0ENNgIIIAMgATYCBEHkACECDIUBC0H3ACECDJ0BCyABIARGBEBB9gAhAgydAQsCQAJAAkAgAS0AAEHIAGsOCwABCwsLCwsLCwsCCwsgAUEBaiEBQd0AIQIMhQELIAFBAWohAUHgACECDIQBCyABQQFqIQFB4wAhAgyDAQtB9QAhAiABIARGDZsBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbXVAGotAABHDQggAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJwBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIABEAgA0H0ADYCHCADIAE2AhQgAyAANgIMQQAhAgycAQtB4gAhAgyCAQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJwBC0HhACECDIIBCyADQfMANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMmgELIAMtACkiAEEja0ELSQ0JAkAgAEEGSw0AQQEgAHRBygBxRQ0ADAoLQQAhAiADQQA2AhwgAyABNgIUIANB7Qk2AhAgA0EINgIMDJkBC0HyACECIAEgBEYNmAEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBs9UAai0AAEcNBSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMmQELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfEANgIcIAMgATYCFCADIAA2AgxBACECDJkBC0HfACECDH8LQQAhAAJAIAMoAjgiAkUNACACKAI0IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANB6g02AhAgA0EmNgIMQQAhAgyZAQtB3gAhAgx/CyADQfAANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMlwELIAMtAClBIUYNBiADQQA2AhwgAyABNgIUIANBkQo2AhAgA0EINgIMQQAhAgyWAQtB7wAhAiABIARGDZUBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDVAGotAABHDQIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJYBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIARQ0CIANB7QA2AhwgAyABNgIUIAMgADYCDEEAIQIMlQELIANBADYCAAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDYABIANB7gA2AhwgAyABNgIUIAMgADYCDEEAIQIMkwELQdwAIQIMeQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJMBC0HbACECDHkLIANB7AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyRAQsgAy0AKSIAQSNJDQAgAEEuRg0AIANBADYCHCADIAE2AhQgA0HJCTYCECADQQg2AgxBACECDJABC0HaACECDHYLIAEgBEYEQEHrACECDI8BCwJAIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMjwELQdkAIQIMdQsgASAERwRAIANBDjYCCCADIAE2AgRB2AAhAgx1C0HqACECDI0BCyABIARGBEBB6QAhAgyNAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1wAhAgx0CyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeiADQegANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyABIARGBEBB5wAhAgyMAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ17IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMjAELQdYAIQIMcgsgASAERgRAQeUAIQIMiwELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDI0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNfSADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeyADQeQANgIcIAMgATYCFCADIAA2AgwMiwELQdQAIQIMcQsgAy0AKUEiRg2GAUHTACECDHALQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALIABFBEBB1QAhAgxwCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQaQNNgIQIANBITYCDEEAIQIMiQELIANB4QA2AhwgAyABNgIUIANB0Bo2AhAgA0EVNgIMQQAhAgyIAQsgASAERgRAQeAAIQIMiAELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HSACECDHALIANBADYCHCADIAE2AhQgA0G2ETYCECADQQk2AgxBACECDIgBCyADQQA2AhwgAyABNgIUIANBthE2AhAgA0EJNgIMQQAhAgyHAQsgASAERgRAQd8AIQIMhwELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBthE2AhAgA0ECNgIMQQAhAgyGAQsgASAERgRAQd0AIQIMhgELIAEtAAAiAkENRgRAIAFBAWohAUHQACECDG0LIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyFAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0HKLTYCECADQQc2AgwMgwELIAEgBEYEQEHbACECDIMBCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc4AIQIMaAsgASAERgRAQdoAIQIMgQELIAEtAABBCWsOBAABAQABC0EAIQIgA0EANgIcIANBmhI2AhAgA0EHNgIMIAMgAUEBajYCFAx/CyADQYASOwEqQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2QA2AhwgAyABNgIUIANB6ho2AhAgA0EVNgIMQQAhAgx+C0HNACECDGQLIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDHwLIAEgBEYEQEHZACECDHwLIAEtAABBIEcNPSABQQFqIQEgAy0ALkEBcQ09IANBADYCHCADIAE2AhQgA0HCHDYCECADQR42AgxBACECDHsLIAEgBEYEQEHYACECDHsLAkACQAJAAkACQCABLQAAIgBBCmsOBAIDAwABCyABQQFqIQFBLCECDGULIABBOkcNASADQQA2AhwgAyABNgIUIANB5xE2AhAgA0EKNgIMQQAhAgx9CyABQQFqIQEgA0Evai0AAEEBcUUNcyADLQAyQYABcUUEQCADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALAkACQCAADhZNTEsBAQEBAQEBAQEBAQEBAQEBAQEAAQsgA0EpNgIcIAMgATYCFCADQawZNgIQIANBFTYCDEEAIQIMfgsg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c3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=='\n\nlet wasmBuffer\n\nObject.defineProperty(module, 'exports', {\n get: () => {\n return wasmBuffer\n ? wasmBuffer\n : (wasmBuffer = Buffer.from(wasmBase64, 'base64'))\n }\n})\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\n\nconst wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgLhocCAwd/A34BeyABIAJqIQQCQCAAIgMoAgwiAA0AIAMoAgQEQCADIAE2AgQLIwBBEGsiCSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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DAgLQeMBDAcLQdcBDAYLQdgBDAULQdkBDAQLQdoBDAMLQdsBDAILQd0BDAELQdwBCyECA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAn8CQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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A0EXNgIcIAMgADYCDCADIAFBAWo2AhQM+AILIABBFUYNI0EAIQIgA0EANgIcIAMgATYCFCADQdYMNgIQIANBIzYCDAz3AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQwdCyADQRk2AhwgAyAANgIMIAMgAUEBajYCFAz2AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQzvAgsgA0EaNgIcIAMgADYCDCADIAFBAWo2AhQM9QILIABBFUYNH0EAIQIgA0EANgIcIAMgATYCFCADQdAPNgIQIANBIjYCDAz0AgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDBsLIANBHDYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgzzAgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDOsCCyADQR02AhwgAyAANgIMIAMgAUEBajYCFEEAIQIM8gILIABBO0cNASABQQFqIQELQSYhAgzXAgtBACECIANBADYCHCADIAE2AhQgA0GfFTYCECADQQw2AgwM7wILIAEgBEcEQANAIAEtAABBIEcNhAIgBCABQQFqIgFHDQALQSwhAgzvAgtBLCECDO4CCyABIARGBEBBNCECDO4CCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtBNCECDO8CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNnwIgA0EyNgIcIAMgATYCFCADIAA2AgxBACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUEQCABQQFqIQEMnwILIANBMjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgztAgsgASAERwRAAkADQCABLQAAQTBrIgBB/wFxQQpPBEBBOiECDNcCCyADKQMgIgtCmbPmzJmz5swZVg0BIAMgC0IKfiIKNwMgIAogAK1C/wGDIgtCf4VWDQEgAyAKIAt8NwMgIAQgAUEBaiIBRw0AC0HAACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABQQFqIgEQMSIADRcM4gILQcAAIQIM7AILIAEgBEYEQEHJACECDOwCCwJAA0ACQCABLQAAQQlrDhgAAqICogKpAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAgCiAgsgBCABQQFqIgFHDQALQckAIQIM7AILIAFBAWohASADQS9qLQAAQQFxDaUCIANBADYCHCADIAE2AhQgA0GXEDYCECADQQo2AgxBACECDOsCCyABIARHBEADQCABLQAAQSBHDRUgBCABQQFqIgFHDQALQfgAIQIM6wILQfgAIQIM6gILIANBAjoAKAw4C0EAIQIgA0EANgIcIANBvws2AhAgA0ECNgIMIAMgAUEBajYCFAzoAgtBACECDM4CC0ENIQIMzQILQRMhAgzMAgtBFSECDMsCC0EWIQIMygILQRghAgzJAgtBGSECDMgCC0EaIQIMxwILQRshAgzGAgtBHCECDMUCC0EdIQIMxAILQR4hAgzDAgtBHyECDMICC0EgIQIMwQILQSIhAgzAAgtBIyECDL8CC0ElIQIMvgILQeUAIQIMvQILIANBPTYCHCADIAE2AhQgAyAANgIMQQAhAgzVAgsgA0EbNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIM1AILIANBIDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNMCCyADQRM2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzSAgsgA0ELNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0QILIANBEDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNACCyADQSA2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzPAgsgA0ELNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzgILIANBDDYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM0CC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAzMAgsCQANAAkAgAS0AAEEKaw4EAAICAAILIAQgAUEBaiIBRw0AC0H9ASECDMwCCwJAAkAgAy0ANkEBRw0AQQAhAAJAIAMoAjgiAkUNACACKAJgIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB/AE2AhwgAyABNgIUIANB3Bk2AhAgA0EVNgIMQQAhAgzNAgtB3AEhAgyzAgsgA0EANgIcIAMgATYCFCADQfkLNgIQIANBHzYCDEEAIQIMywILAkACQCADLQAoQQFrDgIEAQALQdsBIQIMsgILQdQBIQIMsQILIANBAjoAMUEAIQACQCADKAI4IgJFDQAgAigCACICRQ0AIAMgAhEAACEACyAARQRAQd0BIQIMsQILIABBFUcEQCADQQA2AhwgAyABNgIUIANBtAw2AhAgA0EQNgIMQQAhAgzKAgsgA0H7ATYCHCADIAE2AhQgA0GBGjYCECADQRU2AgxBACECDMkCCyABIARGBEBB+gEhAgzJAgsgAS0AAEHIAEYNASADQQE6ACgLQcABIQIMrgILQdoBIQIMrQILIAEgBEcEQCADQQw2AgggAyABNgIEQdkBIQIMrQILQfkBIQIMxQILIAEgBEYEQEH4ASECDMUCCyABLQAAQcgARw0EIAFBAWohAUHYASECDKsCCyABIARGBEBB9wEhAgzEAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQdYBIQIMqwILIAFBAWohAUHXASECDKoCC0H2ASECIAEgBEYNwgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABButUAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMwwILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgBFBEBB4wEhAgyqAgsgA0H1ATYCHCADIAE2AhQgAyAANgIMQQAhAgzCAgtB9AEhAiABIARGDcECIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjVAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMICCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB5R82AhAgA0EINgIMDL8CC0HVASECDKUCCyADQfMBNgIcIAMgATYCFCADIAA2AgxBACECDL0CC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ1uIABBFUcEQCADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgy9AgsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDLwCCyABIARHBEAgA0ENNgIIIAMgATYCBEHTASECDKMCC0HyASECDLsCCyABIARGBEBB8QEhAgy7AgsCQAJAAkAgAS0AAEHIAGsOCwABCAgICAgICAgCCAsgAUEBaiEBQdABIQIMowILIAFBAWohAUHRASECDKICCyABQQFqIQFB0gEhAgyhAgtB8AEhAiABIARGDbkCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEG11QBqLQAARw0EIABBAkYNAyAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy5AgtB7wEhAiABIARGDbgCIAMoAgAiACAEIAFraiEGIAEgAGtBAWohBQNAIAEtAAAgAEGz1QBqLQAARw0DIABBAUYNAiAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy4AgtB7gEhAiABIARGDbcCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEGw1QBqLQAARw0CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy3AgsgAygCBCEAIANCADcDACADIAAgBUEBaiIBECsiAEUNAiADQewBNgIcIAMgATYCFCADIAA2AgxBACECDLYCCyADQQA2AgALIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ2cAiADQe0BNgIcIAMgATYCFCADIAA2AgxBACECDLQCC0HPASECDJoCC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMtAILQc4BIQIMmgILIANB6wE2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyyAgsgASAERgRAQesBIQIMsgILIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMsQILQc0BIQIMlwILIAEgBEcEQCADQQ42AgggAyABNgIEQcwBIQIMlwILQeoBIQIMrwILIAEgBEYEQEHpASECDK8CCyABLQAAQTBrIgBB/wFxQQpJBEAgAyAAOgAqIAFBAWohAUHLASECDJYCCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNlwIgA0HoATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgASAERgRAQecBIQIMrgILAkAgAS0AAEEuRgRAIAFBAWohAQwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmAIgA0HmATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgtBygEhAgyUAgsgASAERgRAQeUBIQIMrQILQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDK8CCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmgIgA0HjATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5AE2AhwgAyABNgIUIAMgADYCDAytAgtByQEhAgyTAgtBACEAAkAgAygCOCICRQ0AIAIoAkQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GkDTYCECADQSE2AgxBACECDK0CC0HIASECDJMCCyADQeEBNgIcIAMgATYCFCADQdAaNgIQIANBFTYCDEEAIQIMqwILIAEgBEYEQEHhASECDKsCCwJAIAEtAABBIEYEQCADQQA7ATQgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GZETYCECADQQk2AgxBACECDKsCC0HHASECDJECCyABIARGBEBB4AEhAgyqAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKsCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyqAgtBxgEhAgyQAgsgASAERgRAQd8BIQIMqQILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyqAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqQILQcUBIQIMjwILIAEgBEYEQEHeASECDKgCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqQILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKgCC0HEASECDI4CCyABIARGBEBB3QEhAgynAgsCQAJAAkACQCABLQAAQQprDhcCAwMAAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAFBAWoMBQsgAUEBaiEBQcMBIQIMjwILIAFBAWohASADQS9qLQAAQQFxDQggA0EANgIcIAMgATYCFCADQY0LNgIQIANBDTYCDEEAIQIMpwILIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKYCCyABIARHBEAgA0EPNgIIIAMgATYCBEEBIQIMjQILQdwBIQIMpQILAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0HbASECDKYCCyADKAIEIQAgA0EANgIEIAMgACABEC0iAEUEQCABQQFqIQEMBAsgA0HaATYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgylAgsgAygCBCEAIANBADYCBCADIAAgARAtIgANASABQQFqCyEBQcEBIQIMigILIANB2QE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMogILQcIBIQIMiAILIANBL2otAABBAXENASADQQA2AhwgAyABNgIUIANB5Bw2AhAgA0EZNgIMQQAhAgygAgsgASAERgRAQdkB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CyADIAU2AgAMkAILIANBADYCACAGQQFqIQFBGgw8C0HKASECIAEgBEYNjgIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBjdUAai0AAEcNOyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjwILIANBADYCACAGQQFqIQFBIQw7CyABIARGBEBByQEhAgyOAgsCQAJAIAEtAABBwQBrDhQAPT09PT09PT09PT09PT09PT09AT0LIAFBAWohAUGtASECDPUBCyABQQFqIQFBsAEhAgz0AQsgASAERgRAQcgBIQIMjQILAkACQCABLQAAQdUAaw4LADw8PDw8PDw8PAE8CyABQQFqIQFBrgEhAgz0AQsgAUEBaiEBQa8BIQIM8wELQccBIQIgASAERg2LAiADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw04IABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyMAgsgA0EANgIAIAZBAWohAUEqDDgLIAEgBEYEQEHGASECDIsCCyABLQAAQdAARw04IAFBAWohAUElDDcLQcUBIQIgASAERg2JAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGB1QBqLQAARw02IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyKAgsgA0EANgIAIAZBAWohAUEODDYLIAEgBEYEQEHEASECDIkCCyABLQAAQcUARw02IAFBAWohAUGrASECDO8BCyABIARGBEBBwwEhAgyIAgsCQAJAAkACQCABLQAAQcIAaw4PAAECOTk5OTk5OTk5OTkDOQsgAUEBaiEBQacBIQIM8QELIAFBAWohAUGoASECDPABCyABQQFqIQFBqQEhAgzvAQsgAUEBaiEBQaoBIQIM7gELQcIBIQIgASAERg2GAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH+1ABqLQAARw0zIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyHAgsgA0EANgIAIAZBAWohAUEUDDMLQcEBIQIgASAERg2FAiADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANA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BTYCAAzsAQsgA0EANgIAIAZBAWohAUEXDBgLQaYBIQIgASAERg3qASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHB1ABqLQAARw0XIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzrAQsgA0EANgIAIAZBAWohAUEYDBcLIAEgBEYEQEGlASECDOoBCwJAAkAgAS0AAEHJAGsOBwAZGRkZGQEZCyABQQFqIQFBiwEhAgzRAQsgAUEBaiEBQYwBIQIM0AELQaQBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw0VIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEJDBULQaMBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw0UIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEfDBQLQaIBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEG+1ABqLQAARw0TIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUECDBMLQaEBIQIgASAERg3lASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYDQCABLQAAIABBvNQAai0AAEcNESAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5QELIAEgBEYEQEGgASECDOUBC0EBIAEtAABB3wBHDREaIAFBAWohAUGHASECDMsBCyADQQA2AgAgBkEBaiEBQYgBIQIMygELQZ8BIQIgASAERg3iASADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw0PIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzjAQsgA0EANgIAIAZBAWohAUEpDA8LQZ4BIQIgASAERg3hASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEG41ABqLQAARw0OIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAziAQsgA0EANgIAIAZBAWohAUEtDA4LIAEgBEYEQEGdASECDOEBCyABLQAAQcUARw0OIAFBAWohAUGEASECDMcBCyABIARGBEBBnAEhAgzgAQsCQAJAIAEtAABBzABrDggADw8PDw8PAQ8LIAFBAWohAUGCASECDMcBCyABQQFqIQFBgwEhAgzGAQtBmwEhAiABIARGDd4BIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQbPUAGotAABHDQsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN8BCyADQQA2AgAgBkEBaiEBQSMMCwtBmgEhAiABIARGDd0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDUAGotAABHDQogAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN4BCyADQQA2AgAgBkEBaiEBQQAMCgsgASAERgRAQZkBIQIM3QELAkACQCABLQAAQcgAaw4IAAwMDAwMDAEMCyABQQFqIQFB/QAhAgzEAQsgAUEBaiEBQYABIQIMwwELIAEgBEYEQEGYASECDNwBCwJAAkAgAS0AAEHOAGsOAwALAQsLIAFBAWohAUH+ACECDMMBCyABQQFqIQFB/wAhAgzCAQsgASAERgRAQZcBIQIM2wELIAEtAABB2QBHDQggAUEBaiEBQQgMBwtBlgEhAiABIARGDdkBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazUAGotAABHDQYgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNoBCyADQQA2AgAgBkEBaiEBQQUMBgtBlQEhAiABIARGDdgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQabUAGotAABHDQUgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNkBCyADQQA2AgAgBkEBaiEBQRYMBQtBlAEhAiABIARGDdcBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDQQgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyADQQA2AgAgBkEBaiEBQRAMBAsgASAERgRAQZMBIQIM1wELAkACQCABLQAAQcMAaw4MAAYGBgYGBgYGBgYBBgsgAUEBaiEBQfkAIQIMvgELIAFBAWohAUH6ACECDL0BC0GSASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBoNQAai0AAEcNAiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBJAwCCyADQQA2AgAMAgsgASAERgRAQZEBIQIM1AELIAEtAABBzABHDQEgAUEBaiEBQRMLOgApIAMoAgQhACADQQA2AgQgAyAAIAEQLiIADQIMAQtBACECIANBADYCHCADIAE2AhQgA0H+HzYCECADQQY2AgwM0QELQfgAIQIMtwELIANBkAE2AhwgAyABNgIUIAMgADYCDEEAIQIMzwELQQAhAAJAIAMoAjgiAkUNACACKAJAIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GCDzYCECADQSA2AgxBACECDM4BC0H3ACECDLQBCyADQY8BNgIcIAMgATYCFCADQewbNgIQIANBFTYCDEEAIQIMzAELIAEgBEYEQEGPASECDMwBCwJAIAEtAABBIEYEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQZsfNgIQIANBBjYCDEEAIQIMzAELQQIhAgyyAQsDQCABLQAAQSBHDQIgBCABQQFqIgFHDQALQY4BIQIMygELIAEgBEYEQEGNASECDMoBCwJAIAEtAABBCWsOBEoAAEoAC0H1ACECDLABCyADLQApQQVGBEBB9gAhAgywAQtB9AAhAgyvAQsgASAERgRAQYwBIQIMyAELIANBEDYCCCADIAE2AgQMCgsgASAERgRAQYsBIQIMxwELAkAgAS0AAEEJaw4ERwAARwALQfMAIQIMrQELIAEgBEcEQCADQRA2AgggAyABNgIEQfEAIQIMrQELQYoBIQIMxQELAkAgASAERwRAA0AgAS0AAEGg0ABqLQAAIgBBA0cEQAJAIABBAWsOAkkABAtB8AAhAgyvAQsgBCABQQFqIgFHDQALQYgBIQIMxgELQYgBIQIMxQELIANBADYCHCADIAE2AhQgA0HbIDYCECADQQc2AgxBACECDMQBCyABIARGBEBBiQEhAgzEAQsCQAJAAkAgAS0AAEGg0gBqLQAAQQFrDgNGAgABC0HyACECDKwBCyADQQA2AhwgAyABNgIUIANBtBI2AhAgA0EHNgIMQQAhAgzEAQtB6gAhAgyqAQsgASAERwRAIAFBAWohAUHvACECDKoBC0GHASECDMIBCyAEIAEiAEYEQEGGASECDMIBCyAALQAAIgFBL0YEQCAAQQFqIQFB7gAhAgypAQsgAUEJayICQRdLDQEgACEBQQEgAnRBm4CABHENQQwBCyAEIAEiAEYEQEGFASECDMEBCyAALQAAQS9HDQAgAEEBaiEBDAMLQQAhAiADQQA2AhwgAyAANgIUIANB2yA2AhAgA0EHNgIMDL8BCwJAAkACQAJAAkADQCABLQAAQaDOAGotAAAiAEEFRwRAAkACQCAAQQFrDghHBQYHCAAEAQgLQesAIQIMrQELIAFBAWohAUHtACECDKwBCyAEIAFBAWoiAUcNAAtBhAEhAgzDAQsgAUEBagwUCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDMEBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDMABCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDL8BCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy+AQsgASAERgRAQYMBIQIMvgELAkAgAS0AAEGgzgBqLQAAQQFrDgg+BAUGAAgCAwcLIAFBAWohAQtBAyECDKMBCyABQQFqDA0LQQAhAiADQQA2AhwgA0HREjYCECADQQc2AgwgAyABQQFqNgIUDLoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDLkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDLgBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDLcBCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy2AQtB7AAhAgycAQsgASAERgRAQYIBIQIMtQELIAFBAWoMAgsgASAERgRAQYEBIQIMtAELIAFBAWoMAQsgASAERg0BIAFBAWoLIQFBBCECDJgBC0GAASECDLABCwNAIAEtAABBoMwAai0AACIAQQJHBEAgAEEBRwRAQekAIQIMmQELDDELIAQgAUEBaiIBRw0AC0H/ACECDK8BCyABIARGBEBB/gAhAgyvAQsCQCABLQAAQQlrDjcvAwYvBAYGBgYGBgYGBgYGBgYGBgYGBgUGBgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYABgsgAUEBagshAUEFIQIMlAELIAFBAWoMBgsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgypAQsgA0EANgIcIAMgATYCFCADQY0UNgIQIANBBzYCDEEAIQIMqAELAkACQAJAAkADQCABLQAAQaDKAGotAAAiAEEFRwRAAkAgAEEBaw4GLgMEBQYABgtB6AAhAgyUAQsgBCABQQFqIgFHDQALQf0AIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqAELIANBADYCHCADIAE2AhQgA0HkCDYCECADQQc2AgxBACECDKcBCyABIARGDQEgAUEBagshAUEGIQIMjAELQfwAIQIMpAELAkACQAJAAkADQCABLQAAQaDIAGotAAAiAEEFRwRAIABBAWsOBCkCAwQFCyAEIAFBAWoiAUcNAAtB+wAhAgynAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgymAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgylAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgykAQsgA0EANgIcIAMgATYCFCADQbwKNgIQIANBBzYCDEEAIQIMowELQc8AIQIMiQELQdEAIQIMiAELQecAIQIMhwELIAEgBEYEQEH6ACECDKABCwJAIAEtAABBCWsOBCAAACAACyABQQFqIQFB5gAhAgyGAQsgASAERgRAQfkAIQIMnwELAkAgAS0AAEEJaw4EHwAAHwALQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFBEBB4gEhAgyGAQsgAEEVRwRAIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDJ8BCyADQfgANgIcIAMgATYCFCADQeoaNgIQIANBFTYCDEEAIQIMngELIAEgBEcEQCADQQ02AgggAyABNgIEQeQAIQIMhQELQfcAIQIMnQELIAEgBEYEQEH2ACECDJ0BCwJAAkACQCABLQAAQcgAaw4LAAELCwsLCwsLCwILCyABQQFqIQFB3QAhAgyFAQsgAUEBaiEBQeAAIQIMhAELIAFBAWohAUHjACECDIMBC0H1ACECIAEgBEYNmwEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBtdUAai0AAEcNCCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMnAELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfQANgIcIAMgATYCFCADIAA2AgxBACECDJwBC0HiACECDIIBC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMnAELQeEAIQIMggELIANB8wA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyaAQsgAy0AKSIAQSNrQQtJDQkCQCAAQQZLDQBBASAAdEHKAHFFDQAMCgtBACECIANBADYCHCADIAE2AhQgA0HtCTYCECADQQg2AgwMmQELQfIAIQIgASAERg2YASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGz1QBqLQAARw0FIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAQsgAygCBCEAIANCADcDACADIAAgBkEBaiIBECsiAARAIANB8QA2AhwgAyABNgIUIAMgADYCDEEAIQIMmQELQd8AIQIMfwtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJkBC0HeACECDH8LIANB8AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyXAQsgAy0AKUEhRg0GIANBADYCHCADIAE2AhQgA0GRCjYCECADQQg2AgxBACECDJYBC0HvACECIAEgBEYNlQEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMlgELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgBFDQIgA0HtADYCHCADIAE2AhQgAyAANgIMQQAhAgyVAQsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNgAEgA0HuADYCHCADIAE2AhQgAyAANgIMQQAhAgyTAQtB3AAhAgx5C0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMkwELQdsAIQIMeQsgA0HsADYCHCADIAE2AhQgA0GAGzYCECADQRU2AgxBACECDJEBCyADLQApIgBBI0kNACAAQS5GDQAgA0EANgIcIAMgATYCFCADQckJNgIQIANBCDYCDEEAIQIMkAELQdoAIQIMdgsgASAERgRAQesAIQIMjwELAkAgAS0AAEEvRgRAIAFBAWohAQwBCyAD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ciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=='\n\nlet wasmBuffer\n\nObject.defineProperty(module, 'exports', {\n get: () => {\n return wasmBuffer\n ? wasmBuffer\n : (wasmBuffer = Buffer.from(wasmBase64, 'base64'))\n }\n})\n","'use strict'\n\nconst corsSafeListedMethods = /** @type {const} */ (['GET', 'HEAD', 'POST'])\nconst corsSafeListedMethodsSet = new Set(corsSafeListedMethods)\n\nconst nullBodyStatus = /** @type {const} */ ([101, 204, 205, 304])\n\nconst redirectStatus = /** @type {const} */ ([301, 302, 303, 307, 308])\nconst redirectStatusSet = new Set(redirectStatus)\n\n/**\n * @see https://fetch.spec.whatwg.org/#block-bad-port\n */\nconst badPorts = /** @type {const} */ ([\n '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79',\n '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137',\n '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532',\n '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723',\n '2049', '3659', '4045', '4190', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6679',\n '6697', '10080'\n])\nconst badPortsSet = new Set(badPorts)\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-header\n */\nconst referrerPolicyTokens = /** @type {const} */ ([\n 'no-referrer',\n 'no-referrer-when-downgrade',\n 'same-origin',\n 'origin',\n 'strict-origin',\n 'origin-when-cross-origin',\n 'strict-origin-when-cross-origin',\n 'unsafe-url'\n])\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies\n */\nconst referrerPolicy = /** @type {const} */ ([\n '',\n ...referrerPolicyTokens\n])\nconst referrerPolicyTokensSet = new Set(referrerPolicyTokens)\n\nconst requestRedirect = /** @type {const} */ (['follow', 'manual', 'error'])\n\nconst safeMethods = /** @type {const} */ (['GET', 'HEAD', 'OPTIONS', 'TRACE'])\nconst safeMethodsSet = new Set(safeMethods)\n\nconst requestMode = /** @type {const} */ (['navigate', 'same-origin', 'no-cors', 'cors'])\n\nconst requestCredentials = /** @type {const} */ (['omit', 'same-origin', 'include'])\n\nconst requestCache = /** @type {const} */ ([\n 'default',\n 'no-store',\n 'reload',\n 'no-cache',\n 'force-cache',\n 'only-if-cached'\n])\n\n/**\n * @see https://fetch.spec.whatwg.org/#request-body-header-name\n */\nconst requestBodyHeader = /** @type {const} */ ([\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-type',\n // See https://github.com/nodejs/undici/issues/2021\n // 'Content-Length' is a forbidden header name, which is typically\n // removed in the Headers implementation. However, undici doesn't\n // filter out headers, so we add it here.\n 'content-length'\n])\n\n/**\n * @see https://fetch.spec.whatwg.org/#enumdef-requestduplex\n */\nconst requestDuplex = /** @type {const} */ ([\n 'half'\n])\n\n/**\n * @see http://fetch.spec.whatwg.org/#forbidden-method\n */\nconst forbiddenMethods = /** @type {const} */ (['CONNECT', 'TRACE', 'TRACK'])\nconst forbiddenMethodsSet = new Set(forbiddenMethods)\n\nconst subresource = /** @type {const} */ ([\n 'audio',\n 'audioworklet',\n 'font',\n 'image',\n 'manifest',\n 'paintworklet',\n 'script',\n 'style',\n 'track',\n 'video',\n 'xslt',\n ''\n])\nconst subresourceSet = new Set(subresource)\n\nmodule.exports = {\n subresource,\n forbiddenMethods,\n requestBodyHeader,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n redirectStatus,\n corsSafeListedMethods,\n nullBodyStatus,\n safeMethods,\n badPorts,\n requestDuplex,\n subresourceSet,\n badPortsSet,\n redirectStatusSet,\n corsSafeListedMethodsSet,\n safeMethodsSet,\n forbiddenMethodsSet,\n referrerPolicyTokens: referrerPolicyTokensSet\n}\n","'use strict'\n\n// In case of breaking changes, increase the version\n// number to avoid conflicts.\nconst globalOrigin = Symbol.for('undici.globalOrigin.1')\n\nfunction getGlobalOrigin () {\n return globalThis[globalOrigin]\n}\n\nfunction setGlobalOrigin (newOrigin) {\n if (newOrigin === undefined) {\n Object.defineProperty(globalThis, globalOrigin, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: false\n })\n\n return\n }\n\n const parsedURL = new URL(newOrigin)\n\n if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') {\n throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`)\n }\n\n Object.defineProperty(globalThis, globalOrigin, {\n value: parsedURL,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nmodule.exports = {\n getGlobalOrigin,\n setGlobalOrigin\n}\n","'use strict'\n\nconst textDecoder = new TextDecoder()\n\n/**\n * @see https://encoding.spec.whatwg.org/#utf-8-decode\n * @param {Uint8Array} buffer\n */\nfunction utf8DecodeBytes (buffer) {\n if (buffer.length === 0) {\n return ''\n }\n\n // 1. Let buffer be the result of peeking three bytes from\n // ioQueue, converted to a byte sequence.\n\n // 2. If buffer is 0xEF 0xBB 0xBF, then read three\n // bytes from ioQueue. (Do nothing with those bytes.)\n if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {\n buffer = buffer.subarray(3)\n }\n\n // 3. Process a queue with an instance of UTF-8’s\n // decoder, ioQueue, output, and \"replacement\".\n const output = textDecoder.decode(buffer)\n\n // 4. Return output.\n return output\n}\n\nmodule.exports = {\n utf8DecodeBytes\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { utf8DecodeBytes } = require('../../encoding')\n\n/**\n * @param {(char: string) => boolean} condition\n * @param {string} input\n * @param {{ position: number }} position\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n */\nfunction collectASequenceOfCodePoints (condition, input, position) {\n // 1. Let result be the empty string.\n let result = ''\n\n // 2. While position doesn’t point past the end of input and the\n // code point at position within input meets the condition condition:\n while (position.position < input.length && condition(input[position.position])) {\n // 1. Append that code point to the end of result.\n result += input[position.position]\n\n // 2. Advance position by 1.\n position.position++\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * A faster collectASequenceOfCodePoints that only works when comparing a single character.\n * @param {string} char\n * @param {string} input\n * @param {{ position: number }} position\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n */\nfunction collectASequenceOfCodePointsFast (char, input, position) {\n const idx = input.indexOf(char, position.position)\n const start = position.position\n\n if (idx === -1) {\n position.position = input.length\n return input.slice(start)\n }\n\n position.position = idx\n return input.slice(start, position.position)\n}\n\nconst ASCII_WHITESPACE_REPLACE_REGEX = /[\\u0009\\u000A\\u000C\\u000D\\u0020]/g // eslint-disable-line no-control-regex\n\n/**\n * @param {string} data\n * @returns {Uint8Array | 'failure'}\n *\n * @see https://infra.spec.whatwg.org/#forgiving-base64-decode\n */\nfunction forgivingBase64 (data) {\n // 1. Remove all ASCII whitespace from data.\n data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, '')\n\n let dataLength = data.length\n // 2. If data’s code point length divides by 4 leaving\n // no remainder, then:\n if (dataLength % 4 === 0) {\n // 1. If data ends with one or two U+003D (=) code points,\n // then remove them from data.\n if (data.charCodeAt(dataLength - 1) === 0x003D) {\n --dataLength\n if (data.charCodeAt(dataLength - 1) === 0x003D) {\n --dataLength\n }\n }\n }\n\n // 3. If data’s code point length divides by 4 leaving\n // a remainder of 1, then return failure.\n if (dataLength % 4 === 1) {\n return 'failure'\n }\n\n // 4. If data contains a code point that is not one of\n // U+002B (+)\n // U+002F (/)\n // ASCII alphanumeric\n // then return failure.\n if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) {\n return 'failure'\n }\n\n const buffer = Buffer.from(data, 'base64')\n return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n}\n\n/**\n * @param {number} char\n * @returns {boolean}\n *\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n */\nfunction isASCIIWhitespace (char) {\n return (\n char === 0x09 || // \\t\n char === 0x0a || // \\n\n char === 0x0c || // \\f\n char === 0x0d || // \\r\n char === 0x20 // space\n )\n}\n\n/**\n * @param {Uint8Array} input\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#isomorphic-decode\n */\nfunction isomorphicDecode (input) {\n // 1. To isomorphic decode a byte sequence input, return a string whose code point\n // length is equal to input’s length and whose code points have the same values\n // as the values of input’s bytes, in the same order.\n const length = input.length\n if ((2 << 15) - 1 > length) {\n return String.fromCharCode.apply(null, input)\n }\n let result = ''\n let i = 0\n let addition = (2 << 15) - 1\n while (i < length) {\n if (i + addition > length) {\n addition = length - i\n }\n result += String.fromCharCode.apply(null, input.subarray(i, i += addition))\n }\n return result\n}\n\nconst invalidIsomorphicEncodeValueRegex = /[^\\x00-\\xFF]/ // eslint-disable-line no-control-regex\n\n/**\n * @param {string} input\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#isomorphic-encode\n */\nfunction isomorphicEncode (input) {\n // 1. Assert: input contains no code points greater than U+00FF.\n assert(!invalidIsomorphicEncodeValueRegex.test(input))\n\n // 2. Return a byte sequence whose length is equal to input’s code\n // point length and whose bytes have the same values as the\n // values of input’s code points, in the same order\n return input\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value\n * @param {Uint8Array} bytes\n */\nfunction parseJSONFromBytes (bytes) {\n return JSON.parse(utf8DecodeBytes(bytes))\n}\n\n/**\n * @param {string} str\n * @param {boolean} [leading=true]\n * @param {boolean} [trailing=true]\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace\n */\nfunction removeASCIIWhitespace (str, leading = true, trailing = true) {\n return removeChars(str, leading, trailing, isASCIIWhitespace)\n}\n\n/**\n * @param {string} str\n * @param {boolean} leading\n * @param {boolean} trailing\n * @param {(charCode: number) => boolean} predicate\n * @returns {string}\n */\nfunction removeChars (str, leading, trailing, predicate) {\n let lead = 0\n let trail = str.length - 1\n\n if (leading) {\n while (lead < str.length && predicate(str.charCodeAt(lead))) lead++\n }\n\n if (trailing) {\n while (trail > 0 && predicate(str.charCodeAt(trail))) trail--\n }\n\n return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1)\n}\n\n// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string\nfunction serializeJavascriptValueToJSONString (value) {\n // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).\n const result = JSON.stringify(value)\n\n // 2. If result is undefined, then throw a TypeError.\n if (result === undefined) {\n throw new TypeError('Value is not JSON serializable')\n }\n\n // 3. Assert: result is a string.\n assert(typeof result === 'string')\n\n // 4. Return result.\n return result\n}\n\nmodule.exports = {\n collectASequenceOfCodePoints,\n collectASequenceOfCodePointsFast,\n forgivingBase64,\n isASCIIWhitespace,\n isomorphicDecode,\n isomorphicEncode,\n parseJSONFromBytes,\n removeASCIIWhitespace,\n removeChars,\n serializeJavascriptValueToJSONString\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { forgivingBase64, collectASequenceOfCodePoints, collectASequenceOfCodePointsFast, isomorphicDecode, removeASCIIWhitespace, removeChars } = require('../infra')\n\nconst encoder = new TextEncoder()\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-token-code-point\n */\nconst HTTP_TOKEN_CODEPOINTS = /^[-!#$%&'*+.^_|~A-Za-z0-9]+$/u\nconst HTTP_WHITESPACE_REGEX = /[\\u000A\\u000D\\u0009\\u0020]/u // eslint-disable-line\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point\n */\nconst HTTP_QUOTED_STRING_TOKENS = /^[\\u0009\\u0020-\\u007E\\u0080-\\u00FF]+$/u // eslint-disable-line\n\n// https://fetch.spec.whatwg.org/#data-url-processor\n/** @param {URL} dataURL */\nfunction dataURLProcessor (dataURL) {\n // 1. Assert: dataURL’s scheme is \"data\".\n assert(dataURL.protocol === 'data:')\n\n // 2. Let input be the result of running the URL\n // serializer on dataURL with exclude fragment\n // set to true.\n let input = URLSerializer(dataURL, true)\n\n // 3. Remove the leading \"data:\" string from input.\n input = input.slice(5)\n\n // 4. Let position point at the start of input.\n const position = { position: 0 }\n\n // 5. Let mimeType be the result of collecting a\n // sequence of code points that are not equal\n // to U+002C (,), given position.\n let mimeType = collectASequenceOfCodePointsFast(\n ',',\n input,\n position\n )\n\n // 6. Strip leading and trailing ASCII whitespace\n // from mimeType.\n // Undici implementation note: we need to store the\n // length because if the mimetype has spaces removed,\n // the wrong amount will be sliced from the input in\n // step #9\n const mimeTypeLength = mimeType.length\n mimeType = removeASCIIWhitespace(mimeType, true, true)\n\n // 7. If position is past the end of input, then\n // return failure\n if (position.position >= input.length) {\n return 'failure'\n }\n\n // 8. Advance position by 1.\n position.position++\n\n // 9. Let encodedBody be the remainder of input.\n const encodedBody = input.slice(mimeTypeLength + 1)\n\n // 10. Let body be the percent-decoding of encodedBody.\n let body = stringPercentDecode(encodedBody)\n\n // 11. If mimeType ends with U+003B (;), followed by\n // zero or more U+0020 SPACE, followed by an ASCII\n // case-insensitive match for \"base64\", then:\n if (/;(?:\\u0020*)base64$/ui.test(mimeType)) {\n // 1. Let stringBody be the isomorphic decode of body.\n const stringBody = isomorphicDecode(body)\n\n // 2. Set body to the forgiving-base64 decode of\n // stringBody.\n body = forgivingBase64(stringBody)\n\n // 3. If body is failure, then return failure.\n if (body === 'failure') {\n return 'failure'\n }\n\n // 4. Remove the last 6 code points from mimeType.\n mimeType = mimeType.slice(0, -6)\n\n // 5. Remove trailing U+0020 SPACE code points from mimeType,\n // if any.\n mimeType = mimeType.replace(/(\\u0020+)$/u, '')\n\n // 6. Remove the last U+003B (;) code point from mimeType.\n mimeType = mimeType.slice(0, -1)\n }\n\n // 12. If mimeType starts with U+003B (;), then prepend\n // \"text/plain\" to mimeType.\n if (mimeType.startsWith(';')) {\n mimeType = 'text/plain' + mimeType\n }\n\n // 13. Let mimeTypeRecord be the result of parsing\n // mimeType.\n let mimeTypeRecord = parseMIMEType(mimeType)\n\n // 14. If mimeTypeRecord is failure, then set\n // mimeTypeRecord to text/plain;charset=US-ASCII.\n if (mimeTypeRecord === 'failure') {\n mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII')\n }\n\n // 15. Return a new data: URL struct whose MIME\n // type is mimeTypeRecord and body is body.\n // https://fetch.spec.whatwg.org/#data-url-struct\n return { mimeType: mimeTypeRecord, body }\n}\n\n// https://url.spec.whatwg.org/#concept-url-serializer\n/**\n * @param {URL} url\n * @param {boolean} excludeFragment\n */\nfunction URLSerializer (url, excludeFragment = false) {\n if (!excludeFragment) {\n return url.href\n }\n\n const href = url.href\n const hashLength = url.hash.length\n\n const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength)\n\n if (!hashLength && href.endsWith('#')) {\n return serialized.slice(0, -1)\n }\n\n return serialized\n}\n\n// https://url.spec.whatwg.org/#string-percent-decode\n/** @param {string} input */\nfunction stringPercentDecode (input) {\n // 1. Let bytes be the UTF-8 encoding of input.\n const bytes = encoder.encode(input)\n\n // 2. Return the percent-decoding of bytes.\n return percentDecode(bytes)\n}\n\n/**\n * @param {number} byte\n */\nfunction isHexCharByte (byte) {\n // 0-9 A-F a-f\n return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66)\n}\n\n/**\n * @param {number} byte\n */\nfunction hexByteToNumber (byte) {\n return (\n // 0-9\n byte >= 0x30 && byte <= 0x39\n ? (byte - 48)\n // Convert to uppercase\n // ((byte & 0xDF) - 65) + 10\n : ((byte & 0xDF) - 55)\n )\n}\n\n// https://url.spec.whatwg.org/#percent-decode\n/** @param {Uint8Array} input */\nfunction percentDecode (input) {\n const length = input.length\n // 1. Let output be an empty byte sequence.\n /** @type {Uint8Array} */\n const output = new Uint8Array(length)\n let j = 0\n let i = 0\n // 2. For each byte byte in input:\n while (i < length) {\n const byte = input[i]\n\n // 1. If byte is not 0x25 (%), then append byte to output.\n if (byte !== 0x25) {\n output[j++] = byte\n\n // 2. Otherwise, if byte is 0x25 (%) and the next two bytes\n // after byte in input are not in the ranges\n // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),\n // and 0x61 (a) to 0x66 (f), all inclusive, append byte\n // to output.\n } else if (\n byte === 0x25 &&\n !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))\n ) {\n output[j++] = 0x25\n\n // 3. Otherwise:\n } else {\n // 1. Let bytePoint be the two bytes after byte in input,\n // decoded, and then interpreted as hexadecimal number.\n // 2. Append a byte whose value is bytePoint to output.\n output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2])\n\n // 3. Skip the next two bytes in input.\n i += 2\n }\n ++i\n }\n\n // 3. Return output.\n return length === j ? output : output.subarray(0, j)\n}\n\n// https://mimesniff.spec.whatwg.org/#parse-a-mime-type\n/** @param {string} input */\nfunction parseMIMEType (input) {\n // 1. Remove any leading and trailing HTTP whitespace\n // from input.\n input = removeHTTPWhitespace(input, true, true)\n\n // 2. Let position be a position variable for input,\n // initially pointing at the start of input.\n const position = { position: 0 }\n\n // 3. Let type be the result of collecting a sequence\n // of code points that are not U+002F (/) from\n // input, given position.\n const type = collectASequenceOfCodePointsFast(\n '/',\n input,\n position\n )\n\n // 4. If type is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n // https://mimesniff.spec.whatwg.org/#http-token-code-point\n if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {\n return 'failure'\n }\n\n // 5. If position is past the end of input, then return\n // failure\n if (position.position >= input.length) {\n return 'failure'\n }\n\n // 6. Advance position by 1. (This skips past U+002F (/).)\n position.position++\n\n // 7. Let subtype be the result of collecting a sequence of\n // code points that are not U+003B (;) from input, given\n // position.\n let subtype = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 8. Remove any trailing HTTP whitespace from subtype.\n subtype = removeHTTPWhitespace(subtype, false, true)\n\n // 9. If subtype is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {\n return 'failure'\n }\n\n const typeLowercase = type.toLowerCase()\n const subtypeLowercase = subtype.toLowerCase()\n\n // 10. Let mimeType be a new MIME type record whose type\n // is type, in ASCII lowercase, and subtype is subtype,\n // in ASCII lowercase.\n // https://mimesniff.spec.whatwg.org/#mime-type\n const mimeType = {\n type: typeLowercase,\n subtype: subtypeLowercase,\n /** @type {Map} */\n parameters: new Map(),\n // https://mimesniff.spec.whatwg.org/#mime-type-essence\n essence: `${typeLowercase}/${subtypeLowercase}`\n }\n\n // 11. While position is not past the end of input:\n while (position.position < input.length) {\n // 1. Advance position by 1. (This skips past U+003B (;).)\n position.position++\n\n // 2. Collect a sequence of code points that are HTTP\n // whitespace from input given position.\n collectASequenceOfCodePoints(\n // https://fetch.spec.whatwg.org/#http-whitespace\n char => HTTP_WHITESPACE_REGEX.test(char),\n input,\n position\n )\n\n // 3. Let parameterName be the result of collecting a\n // sequence of code points that are not U+003B (;)\n // or U+003D (=) from input, given position.\n let parameterName = collectASequenceOfCodePoints(\n (char) => char !== ';' && char !== '=',\n input,\n position\n )\n\n // 4. Set parameterName to parameterName, in ASCII\n // lowercase.\n parameterName = parameterName.toLowerCase()\n\n // 5. If position is not past the end of input, then:\n if (position.position < input.length) {\n // 1. If the code point at position within input is\n // U+003B (;), then continue.\n if (input[position.position] === ';') {\n continue\n }\n\n // 2. Advance position by 1. (This skips past U+003D (=).)\n position.position++\n }\n\n // 6. If position is past the end of input, then break.\n if (position.position >= input.length) {\n break\n }\n\n // 7. Let parameterValue be null.\n let parameterValue = null\n\n // 8. If the code point at position within input is\n // U+0022 (\"), then:\n if (input[position.position] === '\"') {\n // 1. Set parameterValue to the result of collecting\n // an HTTP quoted string from input, given position\n // and the extract-value flag.\n parameterValue = collectAnHTTPQuotedString(input, position, true)\n\n // 2. Collect a sequence of code points that are not\n // U+003B (;) from input, given position.\n collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 9. Otherwise:\n } else {\n // 1. Set parameterValue to the result of collecting\n // a sequence of code points that are not U+003B (;)\n // from input, given position.\n parameterValue = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 2. Remove any trailing HTTP whitespace from parameterValue.\n parameterValue = removeHTTPWhitespace(parameterValue, false, true)\n\n // 3. If parameterValue is the empty string, then continue.\n if (parameterValue.length === 0) {\n continue\n }\n }\n\n // 10. If all of the following are true\n // - parameterName is not the empty string\n // - parameterName solely contains HTTP token code points\n // - parameterValue solely contains HTTP quoted-string token code points\n // - mimeType’s parameters[parameterName] does not exist\n // then set mimeType’s parameters[parameterName] to parameterValue.\n if (\n parameterName.length !== 0 &&\n HTTP_TOKEN_CODEPOINTS.test(parameterName) &&\n (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&\n !mimeType.parameters.has(parameterName)\n ) {\n mimeType.parameters.set(parameterName, parameterValue)\n }\n }\n\n // 12. Return mimeType.\n return mimeType\n}\n\n// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string\n// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string\n/**\n * @param {string} input\n * @param {{ position: number }} position\n * @param {boolean} [extractValue=false]\n */\nfunction collectAnHTTPQuotedString (input, position, extractValue = false) {\n // 1. Let positionStart be position.\n const positionStart = position.position\n\n // 2. Let value be the empty string.\n let value = ''\n\n // 3. Assert: the code point at position within input\n // is U+0022 (\").\n assert(input[position.position] === '\"')\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. While true:\n while (true) {\n // 1. Append the result of collecting a sequence of code points\n // that are not U+0022 (\") or U+005C (\\) from input, given\n // position, to value.\n value += collectASequenceOfCodePoints(\n (char) => char !== '\"' && char !== '\\\\',\n input,\n position\n )\n\n // 2. If position is past the end of input, then break.\n if (position.position >= input.length) {\n break\n }\n\n // 3. Let quoteOrBackslash be the code point at position within\n // input.\n const quoteOrBackslash = input[position.position]\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. If quoteOrBackslash is U+005C (\\), then:\n if (quoteOrBackslash === '\\\\') {\n // 1. If position is past the end of input, then append\n // U+005C (\\) to value and break.\n if (position.position >= input.length) {\n value += '\\\\'\n break\n }\n\n // 2. Append the code point at position within input to value.\n value += input[position.position]\n\n // 3. Advance position by 1.\n position.position++\n\n // 6. Otherwise:\n } else {\n // 1. Assert: quoteOrBackslash is U+0022 (\").\n assert(quoteOrBackslash === '\"')\n\n // 2. Break.\n break\n }\n }\n\n // 6. If the extract-value flag is set, then return value.\n if (extractValue) {\n return value\n }\n\n // 7. Return the code points from positionStart to position,\n // inclusive, within input.\n return input.slice(positionStart, position.position)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type\n */\nfunction serializeAMimeType (mimeType) {\n assert(mimeType !== 'failure')\n const { parameters, essence } = mimeType\n\n // 1. Let serialization be the concatenation of mimeType’s\n // type, U+002F (/), and mimeType’s subtype.\n let serialization = essence\n\n // 2. For each name → value of mimeType’s parameters:\n for (let [name, value] of parameters.entries()) {\n // 1. Append U+003B (;) to serialization.\n serialization += ';'\n\n // 2. Append name to serialization.\n serialization += name\n\n // 3. Append U+003D (=) to serialization.\n serialization += '='\n\n // 4. If value does not solely contain HTTP token code\n // points or value is the empty string, then:\n if (!HTTP_TOKEN_CODEPOINTS.test(value)) {\n // 1. Precede each occurrence of U+0022 (\") or\n // U+005C (\\) in value with U+005C (\\).\n value = value.replace(/[\\\\\"]/ug, '\\\\$&')\n\n // 2. Prepend U+0022 (\") to value.\n value = '\"' + value\n\n // 3. Append U+0022 (\") to value.\n value += '\"'\n }\n\n // 5. Append value to serialization.\n serialization += value\n }\n\n // 3. Return serialization.\n return serialization\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {number} char\n */\nfunction isHTTPWhiteSpace (char) {\n // \"\\r\\n\\t \"\n return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {string} str\n * @param {boolean} [leading=true]\n * @param {boolean} [trailing=true]\n */\nfunction removeHTTPWhitespace (str, leading = true, trailing = true) {\n return removeChars(str, leading, trailing, isHTTPWhiteSpace)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type\n * @param {Exclude, 'failure'>} mimeType\n */\nfunction minimizeSupportedMimeType (mimeType) {\n switch (mimeType.essence) {\n case 'application/ecmascript':\n case 'application/javascript':\n case 'application/x-ecmascript':\n case 'application/x-javascript':\n case 'text/ecmascript':\n case 'text/javascript':\n case 'text/javascript1.0':\n case 'text/javascript1.1':\n case 'text/javascript1.2':\n case 'text/javascript1.3':\n case 'text/javascript1.4':\n case 'text/javascript1.5':\n case 'text/jscript':\n case 'text/livescript':\n case 'text/x-ecmascript':\n case 'text/x-javascript':\n // 1. If mimeType is a JavaScript MIME type, then return \"text/javascript\".\n return 'text/javascript'\n case 'application/json':\n case 'text/json':\n // 2. If mimeType is a JSON MIME type, then return \"application/json\".\n return 'application/json'\n case 'image/svg+xml':\n // 3. If mimeType’s essence is \"image/svg+xml\", then return \"image/svg+xml\".\n return 'image/svg+xml'\n case 'text/xml':\n case 'application/xml':\n // 4. If mimeType is an XML MIME type, then return \"application/xml\".\n return 'application/xml'\n }\n\n // 2. If mimeType is a JSON MIME type, then return \"application/json\".\n if (mimeType.subtype.endsWith('+json')) {\n return 'application/json'\n }\n\n // 4. If mimeType is an XML MIME type, then return \"application/xml\".\n if (mimeType.subtype.endsWith('+xml')) {\n return 'application/xml'\n }\n\n // 5. If mimeType is supported by the user agent, then return mimeType’s essence.\n // Technically, node doesn't support any mimetypes.\n\n // 6. Return the empty string.\n return ''\n}\n\nmodule.exports = {\n dataURLProcessor,\n URLSerializer,\n stringPercentDecode,\n parseMIMEType,\n collectAnHTTPQuotedString,\n serializeAMimeType,\n removeHTTPWhitespace,\n minimizeSupportedMimeType,\n HTTP_TOKEN_CODEPOINTS\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { types, inspect } = require('node:util')\nconst { markAsUncloneable } = require('node:worker_threads')\n\nconst UNDEFINED = 1\nconst BOOLEAN = 2\nconst STRING = 3\nconst SYMBOL = 4\nconst NUMBER = 5\nconst BIGINT = 6\nconst NULL = 7\nconst OBJECT = 8 // function and object\n\nconst FunctionPrototypeSymbolHasInstance = Function.call.bind(Function.prototype[Symbol.hasInstance])\n\n/** @type {import('../../../types/webidl').Webidl} */\nconst webidl = {\n converters: {},\n util: {},\n errors: {},\n is: {}\n}\n\n/**\n * @description Instantiate an error.\n *\n * @param {Object} opts\n * @param {string} opts.header\n * @param {string} opts.message\n * @returns {TypeError}\n */\nwebidl.errors.exception = function (message) {\n return new TypeError(`${message.header}: ${message.message}`)\n}\n\n/**\n * @description Instantiate an error when conversion from one type to another has failed.\n *\n * @param {Object} opts\n * @param {string} opts.prefix\n * @param {string} opts.argument\n * @param {string[]} opts.types\n * @returns {TypeError}\n */\nwebidl.errors.conversionFailed = function (opts) {\n const plural = opts.types.length === 1 ? '' : ' one of'\n const message =\n `${opts.argument} could not be converted to` +\n `${plural}: ${opts.types.join(', ')}.`\n\n return webidl.errors.exception({\n header: opts.prefix,\n message\n })\n}\n\n/**\n * @description Instantiate an error when an invalid argument is provided\n *\n * @param {Object} context\n * @param {string} context.prefix\n * @param {string} context.value\n * @param {string} context.type\n * @returns {TypeError}\n */\nwebidl.errors.invalidArgument = function (context) {\n return webidl.errors.exception({\n header: context.prefix,\n message: `\"${context.value}\" is an invalid ${context.type}.`\n })\n}\n\n// https://webidl.spec.whatwg.org/#implements\nwebidl.brandCheck = function (V, I) {\n if (!FunctionPrototypeSymbolHasInstance(I, V)) {\n const err = new TypeError('Illegal invocation')\n err.code = 'ERR_INVALID_THIS' // node compat.\n throw err\n }\n}\n\nwebidl.brandCheckMultiple = function (List) {\n const prototypes = List.map((c) => webidl.util.MakeTypeAssertion(c))\n\n return (V) => {\n if (prototypes.every(typeCheck => !typeCheck(V))) {\n const err = new TypeError('Illegal invocation')\n err.code = 'ERR_INVALID_THIS' // node compat.\n throw err\n }\n }\n}\n\nwebidl.argumentLengthCheck = function ({ length }, min, ctx) {\n if (length < min) {\n throw webidl.errors.exception({\n message: `${min} argument${min !== 1 ? 's' : ''} required, ` +\n `but${length ? ' only' : ''} ${length} found.`,\n header: ctx\n })\n }\n}\n\nwebidl.illegalConstructor = function () {\n throw webidl.errors.exception({\n header: 'TypeError',\n message: 'Illegal constructor'\n })\n}\n\nwebidl.util.MakeTypeAssertion = function (I) {\n return (O) => FunctionPrototypeSymbolHasInstance(I, O)\n}\n\n// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values\nwebidl.util.Type = function (V) {\n switch (typeof V) {\n case 'undefined': return UNDEFINED\n case 'boolean': return BOOLEAN\n case 'string': return STRING\n case 'symbol': return SYMBOL\n case 'number': return NUMBER\n case 'bigint': return BIGINT\n case 'function':\n case 'object': {\n if (V === null) {\n return NULL\n }\n\n return OBJECT\n }\n }\n}\n\nwebidl.util.Types = {\n UNDEFINED,\n BOOLEAN,\n STRING,\n SYMBOL,\n NUMBER,\n BIGINT,\n NULL,\n OBJECT\n}\n\nwebidl.util.TypeValueToString = function (o) {\n switch (webidl.util.Type(o)) {\n case UNDEFINED: return 'Undefined'\n case BOOLEAN: return 'Boolean'\n case STRING: return 'String'\n case SYMBOL: return 'Symbol'\n case NUMBER: return 'Number'\n case BIGINT: return 'BigInt'\n case NULL: return 'Null'\n case OBJECT: return 'Object'\n }\n}\n\nwebidl.util.markAsUncloneable = markAsUncloneable\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint\nwebidl.util.ConvertToInt = function (V, bitLength, signedness, flags) {\n let upperBound\n let lowerBound\n\n // 1. If bitLength is 64, then:\n if (bitLength === 64) {\n // 1. Let upperBound be 2^53 − 1.\n upperBound = Math.pow(2, 53) - 1\n\n // 2. If signedness is \"unsigned\", then let lowerBound be 0.\n if (signedness === 'unsigned') {\n lowerBound = 0\n } else {\n // 3. Otherwise let lowerBound be −2^53 + 1.\n lowerBound = Math.pow(-2, 53) + 1\n }\n } else if (signedness === 'unsigned') {\n // 2. Otherwise, if signedness is \"unsigned\", then:\n\n // 1. Let lowerBound be 0.\n lowerBound = 0\n\n // 2. Let upperBound be 2^bitLength − 1.\n upperBound = Math.pow(2, bitLength) - 1\n } else {\n // 3. Otherwise:\n\n // 1. Let lowerBound be -2^bitLength − 1.\n lowerBound = Math.pow(-2, bitLength) - 1\n\n // 2. Let upperBound be 2^bitLength − 1 − 1.\n upperBound = Math.pow(2, bitLength - 1) - 1\n }\n\n // 4. Let x be ? ToNumber(V).\n let x = Number(V)\n\n // 5. If x is −0, then set x to +0.\n if (x === 0) {\n x = 0\n }\n\n // 6. If the conversion is to an IDL type associated\n // with the [EnforceRange] extended attribute, then:\n if (webidl.util.HasFlag(flags, webidl.attributes.EnforceRange)) {\n // 1. If x is NaN, +∞, or −∞, then throw a TypeError.\n if (\n Number.isNaN(x) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Could not convert ${webidl.util.Stringify(V)} to an integer.`\n })\n }\n\n // 2. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 3. If x < lowerBound or x > upperBound, then\n // throw a TypeError.\n if (x < lowerBound || x > upperBound) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.`\n })\n }\n\n // 4. Return x.\n return x\n }\n\n // 7. If x is not NaN and the conversion is to an IDL\n // type associated with the [Clamp] extended\n // attribute, then:\n if (!Number.isNaN(x) && webidl.util.HasFlag(flags, webidl.attributes.Clamp)) {\n // 1. Set x to min(max(x, lowerBound), upperBound).\n x = Math.min(Math.max(x, lowerBound), upperBound)\n\n // 2. Round x to the nearest integer, choosing the\n // even integer if it lies halfway between two,\n // and choosing +0 rather than −0.\n if (Math.floor(x) % 2 === 0) {\n x = Math.floor(x)\n } else {\n x = Math.ceil(x)\n }\n\n // 3. Return x.\n return x\n }\n\n // 8. If x is NaN, +0, +∞, or −∞, then return +0.\n if (\n Number.isNaN(x) ||\n (x === 0 && Object.is(0, x)) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n return 0\n }\n\n // 9. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 10. Set x to x modulo 2^bitLength.\n x = x % Math.pow(2, bitLength)\n\n // 11. If signedness is \"signed\" and x ≥ 2^bitLength − 1,\n // then return x − 2^bitLength.\n if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {\n return x - Math.pow(2, bitLength)\n }\n\n // 12. Otherwise, return x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart\nwebidl.util.IntegerPart = function (n) {\n // 1. Let r be floor(abs(n)).\n const r = Math.floor(Math.abs(n))\n\n // 2. If n < 0, then return -1 × r.\n if (n < 0) {\n return -1 * r\n }\n\n // 3. Otherwise, return r.\n return r\n}\n\nwebidl.util.Stringify = function (V) {\n const type = webidl.util.Type(V)\n\n switch (type) {\n case SYMBOL:\n return `Symbol(${V.description})`\n case OBJECT:\n return inspect(V)\n case STRING:\n return `\"${V}\"`\n case BIGINT:\n return `${V}n`\n default:\n return `${V}`\n }\n}\n\nwebidl.util.IsResizableArrayBuffer = function (V) {\n if (types.isArrayBuffer(V)) {\n return V.resizable\n }\n\n if (types.isSharedArrayBuffer(V)) {\n return V.growable\n }\n\n throw webidl.errors.exception({\n header: 'IsResizableArrayBuffer',\n message: `\"${webidl.util.Stringify(V)}\" is not an array buffer.`\n })\n}\n\nwebidl.util.HasFlag = function (flags, attributes) {\n return typeof flags === 'number' && (flags & attributes) === attributes\n}\n\n// https://webidl.spec.whatwg.org/#es-sequence\nwebidl.sequenceConverter = function (converter) {\n return (V, prefix, argument, Iterable) => {\n // 1. If Type(V) is not Object, throw a TypeError.\n if (webidl.util.Type(V) !== OBJECT) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.`\n })\n }\n\n // 2. Let method be ? GetMethod(V, @@iterator).\n /** @type {Generator} */\n const method = typeof Iterable === 'function' ? Iterable() : V?.[Symbol.iterator]?.()\n const seq = []\n let index = 0\n\n // 3. If method is undefined, throw a TypeError.\n if (\n method === undefined ||\n typeof method.next !== 'function'\n ) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} is not iterable.`\n })\n }\n\n // https://webidl.spec.whatwg.org/#create-sequence-from-iterable\n while (true) {\n const { done, value } = method.next()\n\n if (done) {\n break\n }\n\n seq.push(converter(value, prefix, `${argument}[${index++}]`))\n }\n\n return seq\n }\n}\n\n// https://webidl.spec.whatwg.org/#es-to-record\nwebidl.recordConverter = function (keyConverter, valueConverter) {\n return (O, prefix, argument) => {\n // 1. If Type(O) is not Object, throw a TypeError.\n if (webidl.util.Type(O) !== OBJECT) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} (\"${webidl.util.TypeValueToString(O)}\") is not an Object.`\n })\n }\n\n // 2. Let result be a new empty instance of record.\n const result = {}\n\n if (!types.isProxy(O)) {\n // 1. Let desc be ? O.[[GetOwnProperty]](key).\n const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]\n\n for (const key of keys) {\n const keyName = webidl.util.Stringify(key)\n\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key, prefix, `Key ${keyName} in ${argument}`)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key], prefix, `${argument}[${keyName}]`)\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n\n // 5. Return result.\n return result\n }\n\n // 3. Let keys be ? O.[[OwnPropertyKeys]]().\n const keys = Reflect.ownKeys(O)\n\n // 4. For each key of keys.\n for (const key of keys) {\n // 1. Let desc be ? O.[[GetOwnProperty]](key).\n const desc = Reflect.getOwnPropertyDescriptor(O, key)\n\n // 2. If desc is not undefined and desc.[[Enumerable]] is true:\n if (desc?.enumerable) {\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key, prefix, argument)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key], prefix, argument)\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n }\n\n // 5. Return result.\n return result\n }\n}\n\nwebidl.interfaceConverter = function (TypeCheck, name) {\n return (V, prefix, argument) => {\n if (!TypeCheck(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `Expected ${argument} (\"${webidl.util.Stringify(V)}\") to be an instance of ${name}.`\n })\n }\n\n return V\n }\n}\n\nwebidl.dictionaryConverter = function (converters) {\n // \"For each dictionary member member declared on dictionary, in lexicographical order:\"\n converters.sort((a, b) => (a.key > b.key) - (a.key < b.key))\n\n return (dictionary, prefix, argument) => {\n const dict = {}\n\n if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) {\n throw webidl.errors.exception({\n header: prefix,\n message: `Expected ${dictionary} to be one of: Null, Undefined, Object.`\n })\n }\n\n for (const options of converters) {\n const { key, defaultValue, required, converter } = options\n\n if (required === true) {\n if (dictionary == null || !Object.hasOwn(dictionary, key)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `Missing required key \"${key}\".`\n })\n }\n }\n\n let value = dictionary?.[key]\n const hasDefault = defaultValue !== undefined\n\n // Only use defaultValue if value is undefined and\n // a defaultValue options was provided.\n if (hasDefault && value === undefined) {\n value = defaultValue()\n }\n\n // A key can be optional and have no default value.\n // When this happens, do not perform a conversion,\n // and do not assign the key a value.\n if (required || hasDefault || value !== undefined) {\n value = converter(value, prefix, `${argument}.${key}`)\n\n if (\n options.allowedValues &&\n !options.allowedValues.includes(value)\n ) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.`\n })\n }\n\n dict[key] = value\n }\n }\n\n return dict\n }\n}\n\nwebidl.nullableConverter = function (converter) {\n return (V, prefix, argument) => {\n if (V === null) {\n return V\n }\n\n return converter(V, prefix, argument)\n }\n}\n\n/**\n * @param {*} value\n * @returns {boolean}\n */\nwebidl.is.USVString = function (value) {\n return (\n typeof value === 'string' &&\n value.isWellFormed()\n )\n}\n\nwebidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream)\nwebidl.is.Blob = webidl.util.MakeTypeAssertion(Blob)\nwebidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams)\nwebidl.is.File = webidl.util.MakeTypeAssertion(File)\nwebidl.is.URL = webidl.util.MakeTypeAssertion(URL)\nwebidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal)\nwebidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort)\n\nwebidl.is.BufferSource = function (V) {\n return types.isArrayBuffer(V) || (\n ArrayBuffer.isView(V) &&\n types.isArrayBuffer(V.buffer)\n )\n}\n\n// https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy\nwebidl.util.getCopyOfBytesHeldByBufferSource = function (bufferSource) {\n // 1. Let jsBufferSource be the result of converting bufferSource to a JavaScript value.\n const jsBufferSource = bufferSource\n\n // 2. Let jsArrayBuffer be jsBufferSource.\n let jsArrayBuffer = jsBufferSource\n\n // 3. Let offset be 0.\n let offset = 0\n\n // 4. Let length be 0.\n let length = 0\n\n // 5. If jsBufferSource has a [[ViewedArrayBuffer]] internal slot, then:\n if (types.isTypedArray(jsBufferSource) || types.isDataView(jsBufferSource)) {\n // 5.1. Set jsArrayBuffer to jsBufferSource.[[ViewedArrayBuffer]].\n jsArrayBuffer = jsBufferSource.buffer\n\n // 5.2. Set offset to jsBufferSource.[[ByteOffset]].\n offset = jsBufferSource.byteOffset\n\n // 5.3. Set length to jsBufferSource.[[ByteLength]].\n length = jsBufferSource.byteLength\n } else {\n // 6. Otherwise:\n\n // 6.1. Assert: jsBufferSource is an ArrayBuffer or SharedArrayBuffer object.\n assert(types.isAnyArrayBuffer(jsBufferSource))\n\n // 6.2. Set length to jsBufferSource.[[ArrayBufferByteLength]].\n length = jsBufferSource.byteLength\n }\n\n // 7. If IsDetachedBuffer(jsArrayBuffer) is true, then return the empty byte sequence.\n if (jsArrayBuffer.detached) {\n return new Uint8Array(0)\n }\n\n // 8. Let bytes be a new byte sequence of length equal to length.\n const bytes = new Uint8Array(length)\n\n // 9. For i in the range offset to offset + length − 1, inclusive,\n // set bytes[i − offset] to GetValueFromBuffer(jsArrayBuffer, i, Uint8, true, Unordered).\n const view = new Uint8Array(jsArrayBuffer, offset, length)\n bytes.set(view)\n\n // 10. Return bytes.\n return bytes\n}\n\n// https://webidl.spec.whatwg.org/#es-DOMString\nwebidl.converters.DOMString = function (V, prefix, argument, flags) {\n // 1. If V is null and the conversion is to an IDL type\n // associated with the [LegacyNullToEmptyString]\n // extended attribute, then return the DOMString value\n // that represents the empty string.\n if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) {\n return ''\n }\n\n // 2. Let x be ? ToString(V).\n if (typeof V === 'symbol') {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} is a symbol, which cannot be converted to a DOMString.`\n })\n }\n\n // 3. Return the IDL DOMString value that represents the\n // same sequence of code units as the one the\n // ECMAScript String value x represents.\n return String(V)\n}\n\n// https://webidl.spec.whatwg.org/#es-ByteString\nwebidl.converters.ByteString = function (V, prefix, argument) {\n // 1. Let x be ? ToString(V).\n if (typeof V === 'symbol') {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} is a symbol, which cannot be converted to a ByteString.`\n })\n }\n\n const x = String(V)\n\n // 2. If the value of any element of x is greater than\n // 255, then throw a TypeError.\n for (let index = 0; index < x.length; index++) {\n if (x.charCodeAt(index) > 255) {\n throw new TypeError(\n 'Cannot convert argument to a ByteString because the character at ' +\n `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`\n )\n }\n }\n\n // 3. Return an IDL ByteString value whose length is the\n // length of x, and where the value of each element is\n // the value of the corresponding element of x.\n return x\n}\n\n/**\n * @param {unknown} value\n * @returns {string}\n * @see https://webidl.spec.whatwg.org/#es-USVString\n */\nwebidl.converters.USVString = function (value) {\n // TODO: rewrite this so we can control the errors thrown\n if (typeof value === 'string') {\n return value.toWellFormed()\n }\n return `${value}`.toWellFormed()\n}\n\n// https://webidl.spec.whatwg.org/#es-boolean\nwebidl.converters.boolean = function (V) {\n // 1. Let x be the result of computing ToBoolean(V).\n // https://262.ecma-international.org/10.0/index.html#table-10\n const x = Boolean(V)\n\n // 2. Return the IDL boolean value that is the one that represents\n // the same truth value as the ECMAScript Boolean value x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-any\nwebidl.converters.any = function (V) {\n return V\n}\n\n// https://webidl.spec.whatwg.org/#es-long-long\nwebidl.converters['long long'] = function (V, prefix, argument) {\n // 1. Let x be ? ConvertToInt(V, 64, \"signed\").\n const x = webidl.util.ConvertToInt(V, 64, 'signed', 0, prefix, argument)\n\n // 2. Return the IDL long long value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long-long\nwebidl.converters['unsigned long long'] = function (V, prefix, argument) {\n // 1. Let x be ? ConvertToInt(V, 64, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 64, 'unsigned', 0, prefix, argument)\n\n // 2. Return the IDL unsigned long long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long\nwebidl.converters['unsigned long'] = function (V, prefix, argument) {\n // 1. Let x be ? ConvertToInt(V, 32, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 32, 'unsigned', 0, prefix, argument)\n\n // 2. Return the IDL unsigned long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-short\nwebidl.converters['unsigned short'] = function (V, prefix, argument, flags) {\n // 1. Let x be ? ConvertToInt(V, 16, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 16, 'unsigned', flags, prefix, argument)\n\n // 2. Return the IDL unsigned short value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#idl-ArrayBuffer\nwebidl.converters.ArrayBuffer = function (V, prefix, argument, flags) {\n // 1. If V is not an Object, or V does not have an\n // [[ArrayBufferData]] internal slot, then throw a\n // TypeError.\n // 2. If IsSharedArrayBuffer(V) is true, then throw a\n // TypeError.\n // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isArrayBuffer(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBuffer']\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V) is true, then throw a\n // TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a resizable ArrayBuffer.`\n })\n }\n\n // 4. Return the IDL ArrayBuffer value that is a\n // reference to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#idl-SharedArrayBuffer\nwebidl.converters.SharedArrayBuffer = function (V, prefix, argument, flags) {\n // 1. If V is not an Object, or V does not have an\n // [[ArrayBufferData]] internal slot, then throw a\n // TypeError.\n // 2. If IsSharedArrayBuffer(V) is false, then throw a\n // TypeError.\n // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isSharedArrayBuffer(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['SharedArrayBuffer']\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V) is true, then throw a\n // TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a resizable SharedArrayBuffer.`\n })\n }\n\n // 4. Return the IDL SharedArrayBuffer value that is a\n // reference to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#dfn-typed-array-type\nwebidl.converters.TypedArray = function (V, T, prefix, argument, flags) {\n // 1. Let T be the IDL type V is being converted to.\n\n // 2. If Type(V) is not Object, or V does not have a\n // [[TypedArrayName]] internal slot with a value\n // equal to T’s name, then throw a TypeError.\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isTypedArray(V) ||\n V.constructor.name !== T.name\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: [T.name]\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a shared array buffer.`\n })\n }\n\n // 4. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a resizable array buffer.`\n })\n }\n\n // 5. Return the IDL value of type T that is a reference\n // to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#idl-DataView\nwebidl.converters.DataView = function (V, prefix, argument, flags) {\n // 1. If Type(V) is not Object, or V does not have a\n // [[DataView]] internal slot, then throw a TypeError.\n if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['DataView']\n })\n }\n\n // 2. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,\n // then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a shared array buffer.`\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a resizable array buffer.`\n })\n }\n\n // 4. Return the IDL DataView value that is a reference\n // to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#ArrayBufferView\nwebidl.converters.ArrayBufferView = function (V, prefix, argument, flags) {\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isArrayBufferView(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBufferView']\n })\n }\n\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a shared array buffer.`\n })\n }\n\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a resizable array buffer.`\n })\n }\n\n return V\n}\n\n// https://webidl.spec.whatwg.org/#BufferSource\nwebidl.converters.BufferSource = function (V, prefix, argument, flags) {\n if (types.isArrayBuffer(V)) {\n return webidl.converters.ArrayBuffer(V, prefix, argument, flags)\n }\n\n if (types.isArrayBufferView(V)) {\n flags &= ~webidl.attributes.AllowShared\n\n return webidl.converters.ArrayBufferView(V, prefix, argument, flags)\n }\n\n // Make this explicit for easier debugging\n if (types.isSharedArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a SharedArrayBuffer.`\n })\n }\n\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBuffer', 'ArrayBufferView']\n })\n}\n\n// https://webidl.spec.whatwg.org/#AllowSharedBufferSource\nwebidl.converters.AllowSharedBufferSource = function (V, prefix, argument, flags) {\n if (types.isArrayBuffer(V)) {\n return webidl.converters.ArrayBuffer(V, prefix, argument, flags)\n }\n\n if (types.isSharedArrayBuffer(V)) {\n return webidl.converters.SharedArrayBuffer(V, prefix, argument, flags)\n }\n\n if (types.isArrayBufferView(V)) {\n flags |= webidl.attributes.AllowShared\n return webidl.converters.ArrayBufferView(V, prefix, argument, flags)\n }\n\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBuffer', 'SharedArrayBuffer', 'ArrayBufferView']\n })\n}\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.ByteString\n)\n\nwebidl.converters['sequence>'] = webidl.sequenceConverter(\n webidl.converters['sequence']\n)\n\nwebidl.converters['record'] = webidl.recordConverter(\n webidl.converters.ByteString,\n webidl.converters.ByteString\n)\n\nwebidl.converters.Blob = webidl.interfaceConverter(webidl.is.Blob, 'Blob')\n\nwebidl.converters.AbortSignal = webidl.interfaceConverter(\n webidl.is.AbortSignal,\n 'AbortSignal'\n)\n\n/**\n * [LegacyTreatNonObjectAsNull]\n * callback EventHandlerNonNull = any (Event event);\n * typedef EventHandlerNonNull? EventHandler;\n * @param {*} V\n */\nwebidl.converters.EventHandlerNonNull = function (V) {\n if (webidl.util.Type(V) !== OBJECT) {\n return null\n }\n\n // [I]f the value is not an object, it will be converted to null, and if the value is not callable,\n // it will be converted to a callback function value that does nothing when called.\n if (typeof V === 'function') {\n return V\n }\n\n return () => {}\n}\n\nwebidl.attributes = {\n Clamp: 1 << 0,\n EnforceRange: 1 << 1,\n AllowShared: 1 << 2,\n AllowResizable: 1 << 3,\n LegacyNullToEmptyString: 1 << 4\n}\n\nmodule.exports = {\n webidl\n}\n","'use strict'\n\nconst { Transform } = require('node:stream')\nconst zlib = require('node:zlib')\nconst { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require('./constants')\nconst { getGlobalOrigin } = require('./global')\nconst { collectAnHTTPQuotedString, parseMIMEType } = require('./data-url')\nconst { performance } = require('node:perf_hooks')\nconst { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require('../../core/util')\nconst assert = require('node:assert')\nconst { isUint8Array } = require('node:util/types')\nconst { webidl } = require('../webidl')\nconst { isomorphicEncode, collectASequenceOfCodePoints, removeChars } = require('../infra')\n\nfunction responseURL (response) {\n // https://fetch.spec.whatwg.org/#responses\n // A response has an associated URL. It is a pointer to the last URL\n // in response’s URL list and null if response’s URL list is empty.\n const urlList = response.urlList\n const length = urlList.length\n return length === 0 ? null : urlList[length - 1].toString()\n}\n\n// https://fetch.spec.whatwg.org/#concept-response-location-url\nfunction responseLocationURL (response, requestFragment) {\n // 1. If response’s status is not a redirect status, then return null.\n if (!redirectStatusSet.has(response.status)) {\n return null\n }\n\n // 2. Let location be the result of extracting header list values given\n // `Location` and response’s header list.\n let location = response.headersList.get('location', true)\n\n // 3. If location is a header value, then set location to the result of\n // parsing location with response’s URL.\n if (location !== null && isValidHeaderValue(location)) {\n if (!isValidEncodedURL(location)) {\n // Some websites respond location header in UTF-8 form without encoding them as ASCII\n // and major browsers redirect them to correctly UTF-8 encoded addresses.\n // Here, we handle that behavior in the same way.\n location = normalizeBinaryStringToUtf8(location)\n }\n location = new URL(location, responseURL(response))\n }\n\n // 4. If location is a URL whose fragment is null, then set location’s\n // fragment to requestFragment.\n if (location && !location.hash) {\n location.hash = requestFragment\n }\n\n // 5. Return location.\n return location\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2\n * @param {string} url\n * @returns {boolean}\n */\nfunction isValidEncodedURL (url) {\n for (let i = 0; i < url.length; ++i) {\n const code = url.charCodeAt(i)\n\n if (\n code > 0x7E || // Non-US-ASCII + DEL\n code < 0x20 // Control characters NUL - US\n ) {\n return false\n }\n }\n return true\n}\n\n/**\n * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it.\n * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well.\n * @param {string} value\n * @returns {string}\n */\nfunction normalizeBinaryStringToUtf8 (value) {\n return Buffer.from(value, 'binary').toString('utf8')\n}\n\n/** @returns {URL} */\nfunction requestCurrentURL (request) {\n return request.urlList[request.urlList.length - 1]\n}\n\nfunction requestBadPort (request) {\n // 1. Let url be request’s current URL.\n const url = requestCurrentURL(request)\n\n // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,\n // then return blocked.\n if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {\n return 'blocked'\n }\n\n // 3. Return allowed.\n return 'allowed'\n}\n\nfunction isErrorLike (object) {\n return object instanceof Error || (\n object?.constructor?.name === 'Error' ||\n object?.constructor?.name === 'DOMException'\n )\n}\n\n// Check whether |statusText| is a ByteString and\n// matches the Reason-Phrase token production.\n// RFC 2616: https://tools.ietf.org/html/rfc2616\n// RFC 7230: https://tools.ietf.org/html/rfc7230\n// \"reason-phrase = *( HTAB / SP / VCHAR / obs-text )\"\n// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116\nfunction isValidReasonPhrase (statusText) {\n for (let i = 0; i < statusText.length; ++i) {\n const c = statusText.charCodeAt(i)\n if (\n !(\n (\n c === 0x09 || // HTAB\n (c >= 0x20 && c <= 0x7e) || // SP / VCHAR\n (c >= 0x80 && c <= 0xff)\n ) // obs-text\n )\n ) {\n return false\n }\n }\n return true\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-name\n * @param {string} potentialValue\n */\nconst isValidHeaderName = isValidHTTPToken\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value\n * @param {string} potentialValue\n */\nfunction isValidHeaderValue (potentialValue) {\n // - Has no leading or trailing HTTP tab or space bytes.\n // - Contains no 0x00 (NUL) or HTTP newline bytes.\n return (\n potentialValue[0] === '\\t' ||\n potentialValue[0] === ' ' ||\n potentialValue[potentialValue.length - 1] === '\\t' ||\n potentialValue[potentialValue.length - 1] === ' ' ||\n potentialValue.includes('\\n') ||\n potentialValue.includes('\\r') ||\n potentialValue.includes('\\0')\n ) === false\n}\n\n/**\n * Parse a referrer policy from a Referrer-Policy header\n * @see https://w3c.github.io/webappsec-referrer-policy/#parse-referrer-policy-from-header\n */\nfunction parseReferrerPolicy (actualResponse) {\n // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.\n const policyHeader = (actualResponse.headersList.get('referrer-policy', true) ?? '').split(',')\n\n // 2. Let policy be the empty string.\n let policy = ''\n\n // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.\n\n // Note: As the referrer-policy can contain multiple policies\n // separated by comma, we need to loop through all of them\n // and pick the first valid one.\n // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy\n if (policyHeader.length) {\n // The right-most policy takes precedence.\n // The left-most policy is the fallback.\n for (let i = policyHeader.length; i !== 0; i--) {\n const token = policyHeader[i - 1].trim()\n if (referrerPolicyTokens.has(token)) {\n policy = token\n break\n }\n }\n }\n\n // 4. Return policy.\n return policy\n}\n\n/**\n * Given a request request and a response actualResponse, this algorithm\n * updates request’s referrer policy according to the Referrer-Policy\n * header (if any) in actualResponse.\n * @see https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect\n * @param {import('./request').Request} request\n * @param {import('./response').Response} actualResponse\n */\nfunction setRequestReferrerPolicyOnRedirect (request, actualResponse) {\n // 1. Let policy be the result of executing § 8.1 Parse a referrer policy\n // from a Referrer-Policy header on actualResponse.\n const policy = parseReferrerPolicy(actualResponse)\n\n // 2. If policy is not the empty string, then set request’s referrer policy to policy.\n if (policy !== '') {\n request.referrerPolicy = policy\n }\n}\n\n// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check\nfunction crossOriginResourcePolicyCheck () {\n // TODO\n return 'allowed'\n}\n\n// https://fetch.spec.whatwg.org/#concept-cors-check\nfunction corsCheck () {\n // TODO\n return 'success'\n}\n\n// https://fetch.spec.whatwg.org/#concept-tao-check\nfunction TAOCheck () {\n // TODO\n return 'success'\n}\n\nfunction appendFetchMetadata (httpRequest) {\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header\n\n // 1. Assert: r’s url is a potentially trustworthy URL.\n // TODO\n\n // 2. Let header be a Structured Header whose value is a token.\n let header = null\n\n // 3. Set header’s value to r’s mode.\n header = httpRequest.mode\n\n // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.\n httpRequest.headersList.set('sec-fetch-mode', header, true)\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header\n // TODO\n}\n\n// https://fetch.spec.whatwg.org/#append-a-request-origin-header\nfunction appendRequestOriginHeader (request) {\n // 1. Let serializedOrigin be the result of byte-serializing a request origin\n // with request.\n // TODO: implement \"byte-serializing a request origin\"\n let serializedOrigin = request.origin\n\n // - \"'client' is changed to an origin during fetching.\"\n // This doesn't happen in undici (in most cases) because undici, by default,\n // has no concept of origin.\n // - request.origin can also be set to request.client.origin (client being\n // an environment settings object), which is undefined without using\n // setGlobalOrigin.\n if (serializedOrigin === 'client' || serializedOrigin === undefined) {\n return\n }\n\n // 2. If request’s response tainting is \"cors\" or request’s mode is \"websocket\",\n // then append (`Origin`, serializedOrigin) to request’s header list.\n // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:\n if (request.responseTainting === 'cors' || request.mode === 'websocket') {\n request.headersList.append('origin', serializedOrigin, true)\n } else if (request.method !== 'GET' && request.method !== 'HEAD') {\n // 1. Switch on request’s referrer policy:\n switch (request.referrerPolicy) {\n case 'no-referrer':\n // Set serializedOrigin to `null`.\n serializedOrigin = null\n break\n case 'no-referrer-when-downgrade':\n case 'strict-origin':\n case 'strict-origin-when-cross-origin':\n // If request’s origin is a tuple origin, its scheme is \"https\", and\n // request’s current URL’s scheme is not \"https\", then set\n // serializedOrigin to `null`.\n if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n case 'same-origin':\n // If request’s origin is not same origin with request’s current URL’s\n // origin, then set serializedOrigin to `null`.\n if (!sameOrigin(request, requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n default:\n // Do nothing.\n }\n\n // 2. Append (`Origin`, serializedOrigin) to request’s header list.\n request.headersList.append('origin', serializedOrigin, true)\n }\n}\n\n// https://w3c.github.io/hr-time/#dfn-coarsen-time\nfunction coarsenTime (timestamp, crossOriginIsolatedCapability) {\n // TODO\n return timestamp\n}\n\n// https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info\nfunction clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) {\n if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) {\n return {\n domainLookupStartTime: defaultStartTime,\n domainLookupEndTime: defaultStartTime,\n connectionStartTime: defaultStartTime,\n connectionEndTime: defaultStartTime,\n secureConnectionStartTime: defaultStartTime,\n ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol\n }\n }\n\n return {\n domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability),\n domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability),\n connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability),\n connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability),\n secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability),\n ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol\n }\n}\n\n// https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time\nfunction coarsenedSharedCurrentTime (crossOriginIsolatedCapability) {\n return coarsenTime(performance.now(), crossOriginIsolatedCapability)\n}\n\n// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info\nfunction createOpaqueTimingInfo (timingInfo) {\n return {\n startTime: timingInfo.startTime ?? 0,\n redirectStartTime: 0,\n redirectEndTime: 0,\n postRedirectStartTime: timingInfo.startTime ?? 0,\n finalServiceWorkerStartTime: 0,\n finalNetworkResponseStartTime: 0,\n finalNetworkRequestStartTime: 0,\n endTime: 0,\n encodedBodySize: 0,\n decodedBodySize: 0,\n finalConnectionTimingInfo: null\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#policy-container\nfunction makePolicyContainer () {\n // Note: the fetch spec doesn't make use of embedder policy or CSP list\n return {\n referrerPolicy: 'strict-origin-when-cross-origin'\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container\nfunction clonePolicyContainer (policyContainer) {\n return {\n referrerPolicy: policyContainer.referrerPolicy\n }\n}\n\n/**\n * Determine request’s Referrer\n *\n * @see https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer\n */\nfunction determineRequestsReferrer (request) {\n // Given a request request, we can determine the correct referrer information\n // to send by examining its referrer policy as detailed in the following\n // steps, which return either no referrer or a URL:\n\n // 1. Let policy be request's referrer policy.\n const policy = request.referrerPolicy\n\n // Note: policy cannot (shouldn't) be null or an empty string.\n assert(policy)\n\n // 2. Let environment be request’s client.\n\n let referrerSource = null\n\n // 3. Switch on request’s referrer:\n\n // \"client\"\n if (request.referrer === 'client') {\n // Note: node isn't a browser and doesn't implement document/iframes,\n // so we bypass this step and replace it with our own.\n\n const globalOrigin = getGlobalOrigin()\n\n if (!globalOrigin || globalOrigin.origin === 'null') {\n return 'no-referrer'\n }\n\n // Note: we need to clone it as it's mutated\n referrerSource = new URL(globalOrigin)\n // a URL\n } else if (webidl.is.URL(request.referrer)) {\n // Let referrerSource be request’s referrer.\n referrerSource = request.referrer\n }\n\n // 4. Let request’s referrerURL be the result of stripping referrerSource for\n // use as a referrer.\n let referrerURL = stripURLForReferrer(referrerSource)\n\n // 5. Let referrerOrigin be the result of stripping referrerSource for use as\n // a referrer, with the origin-only flag set to true.\n const referrerOrigin = stripURLForReferrer(referrerSource, true)\n\n // 6. If the result of serializing referrerURL is a string whose length is\n // greater than 4096, set referrerURL to referrerOrigin.\n if (referrerURL.toString().length > 4096) {\n referrerURL = referrerOrigin\n }\n\n // 7. The user agent MAY alter referrerURL or referrerOrigin at this point\n // to enforce arbitrary policy considerations in the interests of minimizing\n // data leakage. For example, the user agent could strip the URL down to an\n // origin, modify its host, replace it with an empty string, etc.\n\n // 8. Execute the switch statements corresponding to the value of policy:\n switch (policy) {\n case 'no-referrer':\n // Return no referrer\n return 'no-referrer'\n case 'origin':\n // Return referrerOrigin\n if (referrerOrigin != null) {\n return referrerOrigin\n }\n return stripURLForReferrer(referrerSource, true)\n case 'unsafe-url':\n // Return referrerURL.\n return referrerURL\n case 'strict-origin': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n // 2. Return referrerOrigin\n return referrerOrigin\n }\n case 'strict-origin-when-cross-origin': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(referrerURL, currentURL)) {\n return referrerURL\n }\n\n // 2. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n\n // 3. Return referrerOrigin.\n return referrerOrigin\n }\n case 'same-origin':\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(request, referrerURL)) {\n return referrerURL\n }\n // 2. Return no referrer.\n return 'no-referrer'\n case 'origin-when-cross-origin':\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(request, referrerURL)) {\n return referrerURL\n }\n // 2. Return referrerOrigin.\n return referrerOrigin\n case 'no-referrer-when-downgrade': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n // 2. Return referrerURL.\n return referrerURL\n }\n }\n}\n\n/**\n * Certain portions of URLs must not be included when sending a URL as the\n * value of a `Referer` header: a URLs fragment, username, and password\n * components must be stripped from the URL before it’s sent out. This\n * algorithm accepts a origin-only flag, which defaults to false. If set to\n * true, the algorithm will additionally remove the URL’s path and query\n * components, leaving only the scheme, host, and port.\n *\n * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url\n * @param {URL} url\n * @param {boolean} [originOnly=false]\n */\nfunction stripURLForReferrer (url, originOnly = false) {\n // 1. Assert: url is a URL.\n assert(webidl.is.URL(url))\n\n // Note: Create a new URL instance to avoid mutating the original URL.\n url = new URL(url)\n\n // 2. If url’s scheme is a local scheme, then return no referrer.\n if (urlIsLocal(url)) {\n return 'no-referrer'\n }\n\n // 3. Set url’s username to the empty string.\n url.username = ''\n\n // 4. Set url’s password to the empty string.\n url.password = ''\n\n // 5. Set url’s fragment to null.\n url.hash = ''\n\n // 6. If the origin-only flag is true, then:\n if (originOnly === true) {\n // 1. Set url’s path to « the empty string ».\n url.pathname = ''\n\n // 2. Set url’s query to null.\n url.search = ''\n }\n\n // 7. Return url.\n return url\n}\n\nconst isPotentialleTrustworthyIPv4 = RegExp.prototype.test\n .bind(/^127\\.(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){2}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)$/)\n\nconst isPotentiallyTrustworthyIPv6 = RegExp.prototype.test\n .bind(/^(?:(?:0{1,4}:){7}|(?:0{1,4}:){1,6}:|::)0{0,3}1$/)\n\n/**\n * Check if host matches one of the CIDR notations 127.0.0.0/8 or ::1/128.\n *\n * @param {string} origin\n * @returns {boolean}\n */\nfunction isOriginIPPotentiallyTrustworthy (origin) {\n // IPv6\n if (origin.includes(':')) {\n // Remove brackets from IPv6 addresses\n if (origin[0] === '[' && origin[origin.length - 1] === ']') {\n origin = origin.slice(1, -1)\n }\n return isPotentiallyTrustworthyIPv6(origin)\n }\n\n // IPv4\n return isPotentialleTrustworthyIPv4(origin)\n}\n\n/**\n * A potentially trustworthy origin is one which a user agent can generally\n * trust as delivering data securely.\n *\n * Return value `true` means `Potentially Trustworthy`.\n * Return value `false` means `Not Trustworthy`.\n *\n * @see https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy\n * @param {string} origin\n * @returns {boolean}\n */\nfunction isOriginPotentiallyTrustworthy (origin) {\n // 1. If origin is an opaque origin, return \"Not Trustworthy\".\n if (origin == null || origin === 'null') {\n return false\n }\n\n // 2. Assert: origin is a tuple origin.\n origin = new URL(origin)\n\n // 3. If origin’s scheme is either \"https\" or \"wss\",\n // return \"Potentially Trustworthy\".\n if (origin.protocol === 'https:' || origin.protocol === 'wss:') {\n return true\n }\n\n // 4. If origin’s host matches one of the CIDR notations 127.0.0.0/8 or\n // ::1/128 [RFC4632], return \"Potentially Trustworthy\".\n if (isOriginIPPotentiallyTrustworthy(origin.hostname)) {\n return true\n }\n\n // 5. If the user agent conforms to the name resolution rules in\n // [let-localhost-be-localhost] and one of the following is true:\n\n // origin’s host is \"localhost\" or \"localhost.\"\n if (origin.hostname === 'localhost' || origin.hostname === 'localhost.') {\n return true\n }\n\n // origin’s host ends with \".localhost\" or \".localhost.\"\n if (origin.hostname.endsWith('.localhost') || origin.hostname.endsWith('.localhost.')) {\n return true\n }\n\n // 6. If origin’s scheme is \"file\", return \"Potentially Trustworthy\".\n if (origin.protocol === 'file:') {\n return true\n }\n\n // 7. If origin’s scheme component is one which the user agent considers to\n // be authenticated, return \"Potentially Trustworthy\".\n\n // 8. If origin has been configured as a trustworthy origin, return\n // \"Potentially Trustworthy\".\n\n // 9. Return \"Not Trustworthy\".\n return false\n}\n\n/**\n * A potentially trustworthy URL is one which either inherits context from its\n * creator (about:blank, about:srcdoc, data) or one whose origin is a\n * potentially trustworthy origin.\n *\n * Return value `true` means `Potentially Trustworthy`.\n * Return value `false` means `Not Trustworthy`.\n *\n * @see https://www.w3.org/TR/secure-contexts/#is-url-trustworthy\n * @param {URL} url\n * @returns {boolean}\n */\nfunction isURLPotentiallyTrustworthy (url) {\n // Given a URL record (url), the following algorithm returns \"Potentially\n // Trustworthy\" or \"Not Trustworthy\" as appropriate:\n if (!webidl.is.URL(url)) {\n return false\n }\n\n // 1. If url is \"about:blank\" or \"about:srcdoc\",\n // return \"Potentially Trustworthy\".\n if (url.href === 'about:blank' || url.href === 'about:srcdoc') {\n return true\n }\n\n // 2. If url’s scheme is \"data\", return \"Potentially Trustworthy\".\n if (url.protocol === 'data:') return true\n\n // Note: The origin of blob: URLs is the origin of the context in which they\n // were created. Therefore, blobs created in a trustworthy origin will\n // themselves be potentially trustworthy.\n if (url.protocol === 'blob:') return true\n\n // 3. Return the result of executing § 3.1 Is origin potentially trustworthy?\n // on url’s origin.\n return isOriginPotentiallyTrustworthy(url.origin)\n}\n\n// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request\nfunction tryUpgradeRequestToAPotentiallyTrustworthyURL (request) {\n // TODO\n}\n\n/**\n * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}\n * @param {URL} A\n * @param {URL} B\n */\nfunction sameOrigin (A, B) {\n // 1. If A and B are the same opaque origin, then return true.\n if (A.origin === B.origin && A.origin === 'null') {\n return true\n }\n\n // 2. If A and B are both tuple origins and their schemes,\n // hosts, and port are identical, then return true.\n if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {\n return true\n }\n\n // 3. Return false.\n return false\n}\n\nfunction isAborted (fetchParams) {\n return fetchParams.controller.state === 'aborted'\n}\n\nfunction isCancelled (fetchParams) {\n return fetchParams.controller.state === 'aborted' ||\n fetchParams.controller.state === 'terminated'\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-method-normalize\n * @param {string} method\n */\nfunction normalizeMethod (method) {\n return normalizedMethodRecordsBase[method.toLowerCase()] ?? method\n}\n\n// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object\nconst esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {string} name name of the instance\n * @param {((target: any) => any)} kInternalIterator\n * @param {string | number} [keyIndex]\n * @param {string | number} [valueIndex]\n */\nfunction createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) {\n class FastIterableIterator {\n /** @type {any} */\n #target\n /** @type {'key' | 'value' | 'key+value'} */\n #kind\n /** @type {number} */\n #index\n\n /**\n * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object\n * @param {unknown} target\n * @param {'key' | 'value' | 'key+value'} kind\n */\n constructor (target, kind) {\n this.#target = target\n this.#kind = kind\n this.#index = 0\n }\n\n next () {\n // 1. Let interface be the interface for which the iterator prototype object exists.\n // 2. Let thisValue be the this value.\n // 3. Let object be ? ToObject(thisValue).\n // 4. If object is a platform object, then perform a security\n // check, passing:\n // 5. If object is not a default iterator object for interface,\n // then throw a TypeError.\n if (typeof this !== 'object' || this === null || !(#target in this)) {\n throw new TypeError(\n `'next' called on an object that does not implement interface ${name} Iterator.`\n )\n }\n\n // 6. Let index be object’s index.\n // 7. Let kind be object’s kind.\n // 8. Let values be object’s target's value pairs to iterate over.\n const index = this.#index\n const values = kInternalIterator(this.#target)\n\n // 9. Let len be the length of values.\n const len = values.length\n\n // 10. If index is greater than or equal to len, then return\n // CreateIterResultObject(undefined, true).\n if (index >= len) {\n return {\n value: undefined,\n done: true\n }\n }\n\n // 11. Let pair be the entry in values at index index.\n const { [keyIndex]: key, [valueIndex]: value } = values[index]\n\n // 12. Set object’s index to index + 1.\n this.#index = index + 1\n\n // 13. Return the iterator result for pair and kind.\n\n // https://webidl.spec.whatwg.org/#iterator-result\n\n // 1. Let result be a value determined by the value of kind:\n let result\n switch (this.#kind) {\n case 'key':\n // 1. Let idlKey be pair’s key.\n // 2. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 3. result is key.\n result = key\n break\n case 'value':\n // 1. Let idlValue be pair’s value.\n // 2. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 3. result is value.\n result = value\n break\n case 'key+value':\n // 1. Let idlKey be pair’s key.\n // 2. Let idlValue be pair’s value.\n // 3. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 4. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 5. Let array be ! ArrayCreate(2).\n // 6. Call ! CreateDataProperty(array, \"0\", key).\n // 7. Call ! CreateDataProperty(array, \"1\", value).\n // 8. result is array.\n result = [key, value]\n break\n }\n\n // 2. Return CreateIterResultObject(result, false).\n return {\n value: result,\n done: false\n }\n }\n }\n\n // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n // @ts-ignore\n delete FastIterableIterator.prototype.constructor\n\n Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype)\n\n Object.defineProperties(FastIterableIterator.prototype, {\n [Symbol.toStringTag]: {\n writable: false,\n enumerable: false,\n configurable: true,\n value: `${name} Iterator`\n },\n next: { writable: true, enumerable: true, configurable: true }\n })\n\n /**\n * @param {unknown} target\n * @param {'key' | 'value' | 'key+value'} kind\n * @returns {IterableIterator}\n */\n return function (target, kind) {\n return new FastIterableIterator(target, kind)\n }\n}\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {string} name name of the instance\n * @param {any} object class\n * @param {(target: any) => any} kInternalIterator\n * @param {string | number} [keyIndex]\n * @param {string | number} [valueIndex]\n */\nfunction iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) {\n const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex)\n\n const properties = {\n keys: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function keys () {\n webidl.brandCheck(this, object)\n return makeIterator(this, 'key')\n }\n },\n values: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function values () {\n webidl.brandCheck(this, object)\n return makeIterator(this, 'value')\n }\n },\n entries: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function entries () {\n webidl.brandCheck(this, object)\n return makeIterator(this, 'key+value')\n }\n },\n forEach: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function forEach (callbackfn, thisArg = globalThis) {\n webidl.brandCheck(this, object)\n webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`)\n if (typeof callbackfn !== 'function') {\n throw new TypeError(\n `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.`\n )\n }\n for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) {\n callbackfn.call(thisArg, value, key, this)\n }\n }\n }\n }\n\n return Object.defineProperties(object.prototype, {\n ...properties,\n [Symbol.iterator]: {\n writable: true,\n enumerable: false,\n configurable: true,\n value: properties.entries.value\n }\n })\n}\n\n/**\n * @param {import('./body').ExtractBodyResult} body\n * @param {(bytes: Uint8Array) => void} processBody\n * @param {(error: Error) => void} processBodyError\n * @returns {void}\n *\n * @see https://fetch.spec.whatwg.org/#body-fully-read\n */\nfunction fullyReadBody (body, processBody, processBodyError) {\n // 1. If taskDestination is null, then set taskDestination to\n // the result of starting a new parallel queue.\n\n // 2. Let successSteps given a byte sequence bytes be to queue a\n // fetch task to run processBody given bytes, with taskDestination.\n const successSteps = processBody\n\n // 3. Let errorSteps be to queue a fetch task to run processBodyError,\n // with taskDestination.\n const errorSteps = processBodyError\n\n try {\n // 4. Let reader be the result of getting a reader for body’s stream.\n // If that threw an exception, then run errorSteps with that\n // exception and return.\n const reader = body.stream.getReader()\n\n // 5. Read all bytes from reader, given successSteps and errorSteps.\n readAllBytes(reader, successSteps, errorSteps)\n } catch (e) {\n errorSteps(e)\n }\n}\n\n/**\n * @param {ReadableStreamController} controller\n */\nfunction readableStreamClose (controller) {\n try {\n controller.close()\n controller.byobRequest?.respond(0)\n } catch (err) {\n // TODO: add comment explaining why this error occurs.\n if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) {\n throw err\n }\n }\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes\n * @see https://streams.spec.whatwg.org/#read-loop\n * @param {ReadableStream>} reader\n * @param {(bytes: Uint8Array) => void} successSteps\n * @param {(error: Error) => void} failureSteps\n * @returns {Promise}\n */\nasync function readAllBytes (reader, successSteps, failureSteps) {\n try {\n const bytes = []\n let byteLength = 0\n\n do {\n const { done, value: chunk } = await reader.read()\n\n if (done) {\n // 1. Call successSteps with bytes.\n successSteps(Buffer.concat(bytes, byteLength))\n return\n }\n\n // 1. If chunk is not a Uint8Array object, call failureSteps\n // with a TypeError and abort these steps.\n if (!isUint8Array(chunk)) {\n failureSteps(new TypeError('Received non-Uint8Array chunk'))\n return\n }\n\n // 2. Append the bytes represented by chunk to bytes.\n bytes.push(chunk)\n byteLength += chunk.length\n\n // 3. Read-loop given reader, bytes, successSteps, and failureSteps.\n } while (true)\n } catch (e) {\n // 1. Call failureSteps with e.\n failureSteps(e)\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#is-local\n * @param {URL} url\n * @returns {boolean}\n */\nfunction urlIsLocal (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n // A URL is local if its scheme is a local scheme.\n // A local scheme is \"about\", \"blob\", or \"data\".\n return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'\n}\n\n/**\n * @param {string|URL} url\n * @returns {boolean}\n */\nfunction urlHasHttpsScheme (url) {\n return (\n (\n typeof url === 'string' &&\n url[5] === ':' &&\n url[0] === 'h' &&\n url[1] === 't' &&\n url[2] === 't' &&\n url[3] === 'p' &&\n url[4] === 's'\n ) ||\n url.protocol === 'https:'\n )\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-scheme\n * @param {URL} url\n */\nfunction urlIsHttpHttpsScheme (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n return protocol === 'http:' || protocol === 'https:'\n}\n\n/**\n * @typedef {Object} RangeHeaderValue\n * @property {number|null} rangeStartValue\n * @property {number|null} rangeEndValue\n */\n\n/**\n * @see https://fetch.spec.whatwg.org/#simple-range-header-value\n * @param {string} value\n * @param {boolean} allowWhitespace\n * @return {RangeHeaderValue|'failure'}\n */\nfunction simpleRangeHeaderValue (value, allowWhitespace) {\n // 1. Let data be the isomorphic decoding of value.\n // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string,\n // nothing more. We obviously don't need to do that if value is a string already.\n const data = value\n\n // 2. If data does not start with \"bytes\", then return failure.\n if (!data.startsWith('bytes')) {\n return 'failure'\n }\n\n // 3. Let position be a position variable for data, initially pointing at the 5th code point of data.\n const position = { position: 5 }\n\n // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,\n // from data given position.\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 5. If the code point at position within data is not U+003D (=), then return failure.\n if (data.charCodeAt(position.position) !== 0x3D) {\n return 'failure'\n }\n\n // 6. Advance position by 1.\n position.position++\n\n // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from\n // data given position.\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits,\n // from data given position.\n const rangeStart = collectASequenceOfCodePoints(\n (char) => {\n const code = char.charCodeAt(0)\n\n return code >= 0x30 && code <= 0x39\n },\n data,\n position\n )\n\n // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the\n // empty string; otherwise null.\n const rangeStartValue = rangeStart.length ? Number(rangeStart) : null\n\n // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,\n // from data given position.\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 11. If the code point at position within data is not U+002D (-), then return failure.\n if (data.charCodeAt(position.position) !== 0x2D) {\n return 'failure'\n }\n\n // 12. Advance position by 1.\n position.position++\n\n // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab\n // or space, from data given position.\n // Note from Khafra: its the same step as in #8 again lol\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 14. Let rangeEnd be the result of collecting a sequence of code points that are\n // ASCII digits, from data given position.\n // Note from Khafra: you wouldn't guess it, but this is also the same step as #8\n const rangeEnd = collectASequenceOfCodePoints(\n (char) => {\n const code = char.charCodeAt(0)\n\n return code >= 0x30 && code <= 0x39\n },\n data,\n position\n )\n\n // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd\n // is not the empty string; otherwise null.\n // Note from Khafra: THE SAME STEP, AGAIN!!!\n // Note: why interpret as a decimal if we only collect ascii digits?\n const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null\n\n // 16. If position is not past the end of data, then return failure.\n if (position.position < data.length) {\n return 'failure'\n }\n\n // 17. If rangeEndValue and rangeStartValue are null, then return failure.\n if (rangeEndValue === null && rangeStartValue === null) {\n return 'failure'\n }\n\n // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is\n // greater than rangeEndValue, then return failure.\n // Note: ... when can they not be numbers?\n if (rangeStartValue > rangeEndValue) {\n return 'failure'\n }\n\n // 19. Return (rangeStartValue, rangeEndValue).\n return { rangeStartValue, rangeEndValue }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#build-a-content-range\n * @param {number} rangeStart\n * @param {number} rangeEnd\n * @param {number} fullLength\n */\nfunction buildContentRange (rangeStart, rangeEnd, fullLength) {\n // 1. Let contentRange be `bytes `.\n let contentRange = 'bytes '\n\n // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange.\n contentRange += isomorphicEncode(`${rangeStart}`)\n\n // 3. Append 0x2D (-) to contentRange.\n contentRange += '-'\n\n // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange.\n contentRange += isomorphicEncode(`${rangeEnd}`)\n\n // 5. Append 0x2F (/) to contentRange.\n contentRange += '/'\n\n // 6. Append fullLength, serialized and isomorphic encoded to contentRange.\n contentRange += isomorphicEncode(`${fullLength}`)\n\n // 7. Return contentRange.\n return contentRange\n}\n\n// A Stream, which pipes the response to zlib.createInflate() or\n// zlib.createInflateRaw() depending on the first byte of the Buffer.\n// If the lower byte of the first byte is 0x08, then the stream is\n// interpreted as a zlib stream, otherwise it's interpreted as a\n// raw deflate stream.\nclass InflateStream extends Transform {\n #zlibOptions\n\n /** @param {zlib.ZlibOptions} [zlibOptions] */\n constructor (zlibOptions) {\n super()\n this.#zlibOptions = zlibOptions\n }\n\n _transform (chunk, encoding, callback) {\n if (!this._inflateStream) {\n if (chunk.length === 0) {\n callback()\n return\n }\n this._inflateStream = (chunk[0] & 0x0F) === 0x08\n ? zlib.createInflate(this.#zlibOptions)\n : zlib.createInflateRaw(this.#zlibOptions)\n\n this._inflateStream.on('data', this.push.bind(this))\n this._inflateStream.on('end', () => this.push(null))\n this._inflateStream.on('error', (err) => this.destroy(err))\n }\n\n this._inflateStream.write(chunk, encoding, callback)\n }\n\n _final (callback) {\n if (this._inflateStream) {\n this._inflateStream.end()\n this._inflateStream = null\n }\n callback()\n }\n}\n\n/**\n * @param {zlib.ZlibOptions} [zlibOptions]\n * @returns {InflateStream}\n */\nfunction createInflate (zlibOptions) {\n return new InflateStream(zlibOptions)\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type\n * @param {import('./headers').HeadersList} headers\n */\nfunction extractMimeType (headers) {\n // 1. Let charset be null.\n let charset = null\n\n // 2. Let essence be null.\n let essence = null\n\n // 3. Let mimeType be null.\n let mimeType = null\n\n // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers.\n const values = getDecodeSplit('content-type', headers)\n\n // 5. If values is null, then return failure.\n if (values === null) {\n return 'failure'\n }\n\n // 6. For each value of values:\n for (const value of values) {\n // 6.1. Let temporaryMimeType be the result of parsing value.\n const temporaryMimeType = parseMIMEType(value)\n\n // 6.2. If temporaryMimeType is failure or its essence is \"*/*\", then continue.\n if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') {\n continue\n }\n\n // 6.3. Set mimeType to temporaryMimeType.\n mimeType = temporaryMimeType\n\n // 6.4. If mimeType’s essence is not essence, then:\n if (mimeType.essence !== essence) {\n // 6.4.1. Set charset to null.\n charset = null\n\n // 6.4.2. If mimeType’s parameters[\"charset\"] exists, then set charset to\n // mimeType’s parameters[\"charset\"].\n if (mimeType.parameters.has('charset')) {\n charset = mimeType.parameters.get('charset')\n }\n\n // 6.4.3. Set essence to mimeType’s essence.\n essence = mimeType.essence\n } else if (!mimeType.parameters.has('charset') && charset !== null) {\n // 6.5. Otherwise, if mimeType’s parameters[\"charset\"] does not exist, and\n // charset is non-null, set mimeType’s parameters[\"charset\"] to charset.\n mimeType.parameters.set('charset', charset)\n }\n }\n\n // 7. If mimeType is null, then return failure.\n if (mimeType == null) {\n return 'failure'\n }\n\n // 8. Return mimeType.\n return mimeType\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split\n * @param {string|null} value\n */\nfunction gettingDecodingSplitting (value) {\n // 1. Let input be the result of isomorphic decoding value.\n const input = value\n\n // 2. Let position be a position variable for input, initially pointing at the start of input.\n const position = { position: 0 }\n\n // 3. Let values be a list of strings, initially empty.\n const values = []\n\n // 4. Let temporaryValue be the empty string.\n let temporaryValue = ''\n\n // 5. While position is not past the end of input:\n while (position.position < input.length) {\n // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (\")\n // or U+002C (,) from input, given position, to temporaryValue.\n temporaryValue += collectASequenceOfCodePoints(\n (char) => char !== '\"' && char !== ',',\n input,\n position\n )\n\n // 5.2. If position is not past the end of input, then:\n if (position.position < input.length) {\n // 5.2.1. If the code point at position within input is U+0022 (\"), then:\n if (input.charCodeAt(position.position) === 0x22) {\n // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue.\n temporaryValue += collectAnHTTPQuotedString(\n input,\n position\n )\n\n // 5.2.1.2. If position is not past the end of input, then continue.\n if (position.position < input.length) {\n continue\n }\n } else {\n // 5.2.2. Otherwise:\n\n // 5.2.2.1. Assert: the code point at position within input is U+002C (,).\n assert(input.charCodeAt(position.position) === 0x2C)\n\n // 5.2.2.2. Advance position by 1.\n position.position++\n }\n }\n\n // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue.\n temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20)\n\n // 5.4. Append temporaryValue to values.\n values.push(temporaryValue)\n\n // 5.6. Set temporaryValue to the empty string.\n temporaryValue = ''\n }\n\n // 6. Return values.\n return values\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split\n * @param {string} name lowercase header name\n * @param {import('./headers').HeadersList} list\n */\nfunction getDecodeSplit (name, list) {\n // 1. Let value be the result of getting name from list.\n const value = list.get(name, true)\n\n // 2. If value is null, then return null.\n if (value === null) {\n return null\n }\n\n // 3. Return the result of getting, decoding, and splitting value.\n return gettingDecodingSplitting(value)\n}\n\nfunction hasAuthenticationEntry (request) {\n return false\n}\n\n/**\n * @see https://url.spec.whatwg.org/#include-credentials\n * @param {URL} url\n */\nfunction includesCredentials (url) {\n // A URL includes credentials if its username or password is not the empty string.\n return !!(url.username || url.password)\n}\n\n/**\n * @see https://html.spec.whatwg.org/multipage/document-sequences.html#traversable-navigable\n * @param {object|string} navigable\n */\nfunction isTraversableNavigable (navigable) {\n // Returns true only if we have an actual traversable navigable object\n // that can prompt the user for credentials. In Node.js, this will always\n // be false since there's no Window object or navigable.\n return navigable != null && navigable !== 'client' && navigable !== 'no-traversable'\n}\n\nclass EnvironmentSettingsObjectBase {\n get baseUrl () {\n return getGlobalOrigin()\n }\n\n get origin () {\n return this.baseUrl?.origin\n }\n\n policyContainer = makePolicyContainer()\n}\n\nclass EnvironmentSettingsObject {\n settingsObject = new EnvironmentSettingsObjectBase()\n}\n\nconst environmentSettingsObject = new EnvironmentSettingsObject()\n\nmodule.exports = {\n isAborted,\n isCancelled,\n isValidEncodedURL,\n ReadableStreamFrom,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n clampAndCoarsenConnectionTimingInfo,\n coarsenedSharedCurrentTime,\n determineRequestsReferrer,\n makePolicyContainer,\n clonePolicyContainer,\n appendFetchMetadata,\n appendRequestOriginHeader,\n TAOCheck,\n corsCheck,\n crossOriginResourcePolicyCheck,\n createOpaqueTimingInfo,\n setRequestReferrerPolicyOnRedirect,\n isValidHTTPToken,\n requestBadPort,\n requestCurrentURL,\n responseURL,\n responseLocationURL,\n isURLPotentiallyTrustworthy,\n isValidReasonPhrase,\n sameOrigin,\n normalizeMethod,\n iteratorMixin,\n createIterator,\n isValidHeaderName,\n isValidHeaderValue,\n isErrorLike,\n fullyReadBody,\n readableStreamClose,\n urlIsLocal,\n urlHasHttpsScheme,\n urlIsHttpHttpsScheme,\n readAllBytes,\n simpleRangeHeaderValue,\n buildContentRange,\n createInflate,\n extractMimeType,\n getDecodeSplit,\n environmentSettingsObject,\n isOriginIPPotentiallyTrustworthy,\n hasAuthenticationEntry,\n includesCredentials,\n isTraversableNavigable\n}\n","'use strict'\n\nconst { iteratorMixin } = require('./util')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { webidl } = require('../webidl')\nconst nodeUtil = require('node:util')\n\n// https://xhr.spec.whatwg.org/#formdata\nclass FormData {\n #state = []\n\n constructor (form = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (form !== undefined) {\n throw webidl.errors.conversionFailed({\n prefix: 'FormData constructor',\n argument: 'Argument 1',\n types: ['undefined']\n })\n }\n }\n\n append (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.append'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n name = webidl.converters.USVString(name)\n\n if (arguments.length === 3 || webidl.is.Blob(value)) {\n value = webidl.converters.Blob(value, prefix, 'value')\n\n if (filename !== undefined) {\n filename = webidl.converters.USVString(filename)\n }\n } else {\n value = webidl.converters.USVString(value)\n }\n\n // 1. Let value be value if given; otherwise blobValue.\n\n // 2. Let entry be the result of creating an entry with\n // name, value, and filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. Append entry to this’s entry list.\n this.#state.push(entry)\n }\n\n delete (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.delete'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // The delete(name) method steps are to remove all entries whose name\n // is name from this’s entry list.\n this.#state = this.#state.filter(entry => entry.name !== name)\n }\n\n get (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.get'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return null.\n const idx = this.#state.findIndex((entry) => entry.name === name)\n if (idx === -1) {\n return null\n }\n\n // 2. Return the value of the first entry whose name is name from\n // this’s entry list.\n return this.#state[idx].value\n }\n\n getAll (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.getAll'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return the empty list.\n // 2. Return the values of all entries whose name is name, in order,\n // from this’s entry list.\n return this.#state\n .filter((entry) => entry.name === name)\n .map((entry) => entry.value)\n }\n\n has (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.has'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // The has(name) method steps are to return true if there is an entry\n // whose name is name in this’s entry list; otherwise false.\n return this.#state.findIndex((entry) => entry.name === name) !== -1\n }\n\n set (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.set'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n name = webidl.converters.USVString(name)\n\n if (arguments.length === 3 || webidl.is.Blob(value)) {\n value = webidl.converters.Blob(value, prefix, 'value')\n\n if (filename !== undefined) {\n filename = webidl.converters.USVString(filename)\n }\n } else {\n value = webidl.converters.USVString(value)\n }\n\n // The set(name, value) and set(name, blobValue, filename) method steps\n // are:\n\n // 1. Let value be value if given; otherwise blobValue.\n\n // 2. Let entry be the result of creating an entry with name, value, and\n // filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. If there are entries in this’s entry list whose name is name, then\n // replace the first such entry with entry and remove the others.\n const idx = this.#state.findIndex((entry) => entry.name === name)\n if (idx !== -1) {\n this.#state = [\n ...this.#state.slice(0, idx),\n entry,\n ...this.#state.slice(idx + 1).filter((entry) => entry.name !== name)\n ]\n } else {\n // 4. Otherwise, append entry to this’s entry list.\n this.#state.push(entry)\n }\n }\n\n [nodeUtil.inspect.custom] (depth, options) {\n const state = this.#state.reduce((a, b) => {\n if (a[b.name]) {\n if (Array.isArray(a[b.name])) {\n a[b.name].push(b.value)\n } else {\n a[b.name] = [a[b.name], b.value]\n }\n } else {\n a[b.name] = b.value\n }\n\n return a\n }, { __proto__: null })\n\n options.depth ??= depth\n options.colors ??= true\n\n const output = nodeUtil.formatWithOptions(options, state)\n\n // remove [Object null prototype]\n return `FormData ${output.slice(output.indexOf(']') + 2)}`\n }\n\n /**\n * @param {FormData} formData\n */\n static getFormDataState (formData) {\n return formData.#state\n }\n\n /**\n * @param {FormData} formData\n * @param {any[]} newState\n */\n static setFormDataState (formData, newState) {\n formData.#state = newState\n }\n}\n\nconst { getFormDataState, setFormDataState } = FormData\nReflect.deleteProperty(FormData, 'getFormDataState')\nReflect.deleteProperty(FormData, 'setFormDataState')\n\niteratorMixin('FormData', FormData, getFormDataState, 'name', 'value')\n\nObject.defineProperties(FormData.prototype, {\n append: kEnumerableProperty,\n delete: kEnumerableProperty,\n get: kEnumerableProperty,\n getAll: kEnumerableProperty,\n has: kEnumerableProperty,\n set: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'FormData',\n configurable: true\n }\n})\n\n/**\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry\n * @param {string} name\n * @param {string|Blob} value\n * @param {?string} filename\n * @returns\n */\nfunction makeEntry (name, value, filename) {\n // 1. Set name to the result of converting name into a scalar value string.\n // Note: This operation was done by the webidl converter USVString.\n\n // 2. If value is a string, then set value to the result of converting\n // value into a scalar value string.\n if (typeof value === 'string') {\n // Note: This operation was done by the webidl converter USVString.\n } else {\n // 3. Otherwise:\n\n // 1. If value is not a File object, then set value to a new File object,\n // representing the same bytes, whose name attribute value is \"blob\"\n if (!webidl.is.File(value)) {\n value = new File([value], 'blob', { type: value.type })\n }\n\n // 2. If filename is given, then set value to a new File object,\n // representing the same bytes, whose name attribute is filename.\n if (filename !== undefined) {\n /** @type {FilePropertyBag} */\n const options = {\n type: value.type,\n lastModified: value.lastModified\n }\n\n value = new File([value], filename, options)\n }\n }\n\n // 4. Return an entry whose name is name and whose value is value.\n return { name, value }\n}\n\nwebidl.is.FormData = webidl.util.MakeTypeAssertion(FormData)\n\nmodule.exports = { FormData, makeEntry, setFormDataState }\n","'use strict'\n\nconst { bufferToLowerCasedHeaderName } = require('../../core/util')\nconst { HTTP_TOKEN_CODEPOINTS } = require('./data-url')\nconst { makeEntry } = require('./formdata')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst { isomorphicDecode } = require('../infra')\n\nconst dd = Buffer.from('--')\nconst decoder = new TextDecoder()\nconst decoderIgnoreBOM = new TextDecoder('utf-8', { ignoreBOM: true })\n\n/**\n * @param {string} chars\n */\nfunction isAsciiString (chars) {\n for (let i = 0; i < chars.length; ++i) {\n if ((chars.charCodeAt(i) & ~0x7F) !== 0) {\n return false\n }\n }\n return true\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-boundary\n * @param {string} boundary\n */\nfunction validateBoundary (boundary) {\n const length = boundary.length\n\n // - its length is greater or equal to 27 and lesser or equal to 70, and\n if (length < 27 || length > 70) {\n return false\n }\n\n // - it is composed by bytes in the ranges 0x30 to 0x39, 0x41 to 0x5A, or\n // 0x61 to 0x7A, inclusive (ASCII alphanumeric), or which are 0x27 ('),\n // 0x2D (-) or 0x5F (_).\n for (let i = 0; i < length; ++i) {\n const cp = boundary.charCodeAt(i)\n\n if (!(\n (cp >= 0x30 && cp <= 0x39) ||\n (cp >= 0x41 && cp <= 0x5a) ||\n (cp >= 0x61 && cp <= 0x7a) ||\n cp === 0x27 ||\n cp === 0x2d ||\n cp === 0x5f\n )) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-parser\n * @param {Buffer} input\n * @param {ReturnType} mimeType\n */\nfunction multipartFormDataParser (input, mimeType) {\n // 1. Assert: mimeType’s essence is \"multipart/form-data\".\n assert(mimeType !== 'failure' && mimeType.essence === 'multipart/form-data')\n\n const boundaryString = mimeType.parameters.get('boundary')\n\n // 2. If mimeType’s parameters[\"boundary\"] does not exist, return failure.\n // Otherwise, let boundary be the result of UTF-8 decoding mimeType’s\n // parameters[\"boundary\"].\n if (boundaryString === undefined) {\n throw parsingError('missing boundary in content-type header')\n }\n\n const boundary = Buffer.from(`--${boundaryString}`, 'utf8')\n\n // 3. Let entry list be an empty entry list.\n const entryList = []\n\n // 4. Let position be a pointer to a byte in input, initially pointing at\n // the first byte.\n const position = { position: 0 }\n\n // Note: Per RFC 2046 Section 5.1.1, we must ignore anything before the\n // first boundary delimiter line (preamble). Search for the first boundary.\n const firstBoundaryIndex = input.indexOf(boundary)\n\n if (firstBoundaryIndex === -1) {\n throw parsingError('no boundary found in multipart body')\n }\n\n // Start parsing from the first boundary, ignoring any preamble\n position.position = firstBoundaryIndex\n\n // 5. While true:\n while (true) {\n // 5.1. If position points to a sequence of bytes starting with 0x2D 0x2D\n // (`--`) followed by boundary, advance position by 2 + the length of\n // boundary. Otherwise, return failure.\n // Note: boundary is padded with 2 dashes already, no need to add 2.\n if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) {\n position.position += boundary.length\n } else {\n throw parsingError('expected a value starting with -- and the boundary')\n }\n\n // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A\n // (`--` followed by CR LF) followed by the end of input, return entry list.\n // Note: Per RFC 2046 Section 5.1.1, we must ignore anything after the\n // final boundary delimiter (epilogue). Check for -- or --CRLF and return\n // regardless of what follows.\n if (bufferStartsWith(input, dd, position)) {\n // Found closing boundary delimiter (--), ignore any epilogue\n return entryList\n }\n\n // 5.3. If position does not point to a sequence of bytes starting with 0x0D\n // 0x0A (CR LF), return failure.\n if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {\n throw parsingError('expected CRLF')\n }\n\n // 5.4. Advance position by 2. (This skips past the newline.)\n position.position += 2\n\n // 5.5. Let name, filename and contentType be the result of parsing\n // multipart/form-data headers on input and position, if the result\n // is not failure. Otherwise, return failure.\n const result = parseMultipartFormDataHeaders(input, position)\n\n let { name, filename, contentType, encoding } = result\n\n // 5.6. Advance position by 2. (This skips past the empty line that marks\n // the end of the headers.)\n position.position += 2\n\n // 5.7. Let body be the empty byte sequence.\n let body\n\n // 5.8. Body loop: While position is not past the end of input:\n // TODO: the steps here are completely wrong\n {\n const boundaryIndex = input.indexOf(boundary.subarray(2), position.position)\n\n if (boundaryIndex === -1) {\n throw parsingError('expected boundary after body')\n }\n\n body = input.subarray(position.position, boundaryIndex - 4)\n\n position.position += body.length\n\n // Note: position must be advanced by the body's length before being\n // decoded, otherwise the parsing will fail.\n if (encoding === 'base64') {\n body = Buffer.from(body.toString(), 'base64')\n }\n }\n\n // 5.9. If position does not point to a sequence of bytes starting with\n // 0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2.\n if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {\n throw parsingError('expected CRLF')\n } else {\n position.position += 2\n }\n\n // 5.10. If filename is not null:\n let value\n\n if (filename !== null) {\n // 5.10.1. If contentType is null, set contentType to \"text/plain\".\n contentType ??= 'text/plain'\n\n // 5.10.2. If contentType is not an ASCII string, set contentType to the empty string.\n\n // Note: `buffer.isAscii` can be used at zero-cost, but converting a string to a buffer is a high overhead.\n // Content-Type is a relatively small string, so it is faster to use `String#charCodeAt`.\n if (!isAsciiString(contentType)) {\n contentType = ''\n }\n\n // 5.10.3. Let value be a new File object with name filename, type contentType, and body body.\n value = new File([body], filename, { type: contentType })\n } else {\n // 5.11. Otherwise:\n\n // 5.11.1. Let value be the UTF-8 decoding without BOM of body.\n value = decoderIgnoreBOM.decode(Buffer.from(body))\n }\n\n // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object.\n assert(webidl.is.USVString(name))\n assert((typeof value === 'string' && webidl.is.USVString(value)) || webidl.is.File(value))\n\n // 5.13. Create an entry with name and value, and append it to entry list.\n entryList.push(makeEntry(name, value, filename))\n }\n}\n\n/**\n * Parses content-disposition attributes (e.g., name=\"value\" or filename*=utf-8''encoded)\n * @param {Buffer} input\n * @param {{ position: number }} position\n * @returns {{ name: string, value: string }}\n */\nfunction parseContentDispositionAttribute (input, position) {\n // Skip leading semicolon and whitespace\n if (input[position.position] === 0x3b /* ; */) {\n position.position++\n }\n\n // Skip whitespace\n collectASequenceOfBytes(\n (char) => char === 0x20 || char === 0x09,\n input,\n position\n )\n\n // Collect attribute name (token characters)\n const attributeName = collectASequenceOfBytes(\n (char) => isToken(char) && char !== 0x3d && char !== 0x2a, // not = or *\n input,\n position\n )\n\n if (attributeName.length === 0) {\n return null\n }\n\n const attrNameStr = attributeName.toString('ascii').toLowerCase()\n\n // Check for extended notation (attribute*)\n const isExtended = input[position.position] === 0x2a /* * */\n if (isExtended) {\n position.position++ // skip *\n }\n\n // Expect = sign\n if (input[position.position] !== 0x3d /* = */) {\n return null\n }\n position.position++ // skip =\n\n // Skip whitespace\n collectASequenceOfBytes(\n (char) => char === 0x20 || char === 0x09,\n input,\n position\n )\n\n let value\n\n if (isExtended) {\n // Extended attribute format: charset'language'encoded-value\n const headerValue = collectASequenceOfBytes(\n (char) => char !== 0x20 && char !== 0x0d && char !== 0x0a && char !== 0x3b, // not space, CRLF, or ;\n input,\n position\n )\n\n // Check for utf-8'' prefix (case insensitive)\n if (\n (headerValue[0] !== 0x75 && headerValue[0] !== 0x55) || // u or U\n (headerValue[1] !== 0x74 && headerValue[1] !== 0x54) || // t or T\n (headerValue[2] !== 0x66 && headerValue[2] !== 0x46) || // f or F\n headerValue[3] !== 0x2d || // -\n headerValue[4] !== 0x38 // 8\n ) {\n throw parsingError('unknown encoding, expected utf-8\\'\\'')\n }\n\n // Skip utf-8'' and decode the rest\n value = decodeURIComponent(decoder.decode(headerValue.subarray(7)))\n } else if (input[position.position] === 0x22 /* \" */) {\n // Quoted string\n position.position++ // skip opening quote\n\n const quotedValue = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d && char !== 0x22, // not LF, CR, or \"\n input,\n position\n )\n\n if (input[position.position] !== 0x22) {\n throw parsingError('Closing quote not found')\n }\n position.position++ // skip closing quote\n\n value = decoder.decode(quotedValue)\n .replace(/%0A/ig, '\\n')\n .replace(/%0D/ig, '\\r')\n .replace(/%22/g, '\"')\n } else {\n // Token value (no quotes)\n const tokenValue = collectASequenceOfBytes(\n (char) => isToken(char) && char !== 0x3b, // not ;\n input,\n position\n )\n\n value = decoder.decode(tokenValue)\n }\n\n return { name: attrNameStr, value }\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#parse-multipart-form-data-headers\n * @param {Buffer} input\n * @param {{ position: number }} position\n */\nfunction parseMultipartFormDataHeaders (input, position) {\n // 1. Let name, filename and contentType be null.\n let name = null\n let filename = null\n let contentType = null\n let encoding = null\n\n // 2. While true:\n while (true) {\n // 2.1. If position points to a sequence of bytes starting with 0x0D 0x0A (CR LF):\n if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) {\n // 2.1.1. If name is null, return failure.\n if (name === null) {\n throw parsingError('header name is null')\n }\n\n // 2.1.2. Return name, filename and contentType.\n return { name, filename, contentType, encoding }\n }\n\n // 2.2. Let header name be the result of collecting a sequence of bytes that are\n // not 0x0A (LF), 0x0D (CR) or 0x3A (:), given position.\n let headerName = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d && char !== 0x3a,\n input,\n position\n )\n\n // 2.3. Remove any HTTP tab or space bytes from the start or end of header name.\n headerName = removeChars(headerName, true, true, (char) => char === 0x9 || char === 0x20)\n\n // 2.4. If header name does not match the field-name token production, return failure.\n if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) {\n throw parsingError('header name does not match the field-name token production')\n }\n\n // 2.5. If the byte at position is not 0x3A (:), return failure.\n if (input[position.position] !== 0x3a) {\n throw parsingError('expected :')\n }\n\n // 2.6. Advance position by 1.\n position.position++\n\n // 2.7. Collect a sequence of bytes that are HTTP tab or space bytes given position.\n // (Do nothing with those bytes.)\n collectASequenceOfBytes(\n (char) => char === 0x20 || char === 0x09,\n input,\n position\n )\n\n // 2.8. Byte-lowercase header name and switch on the result:\n switch (bufferToLowerCasedHeaderName(headerName)) {\n case 'content-disposition': {\n name = filename = null\n\n // Collect the disposition type (should be \"form-data\")\n const dispositionType = collectASequenceOfBytes(\n (char) => isToken(char),\n input,\n position\n )\n\n if (dispositionType.toString('ascii').toLowerCase() !== 'form-data') {\n throw parsingError('expected form-data for content-disposition header')\n }\n\n // Parse attributes recursively until CRLF\n while (\n position.position < input.length &&\n input[position.position] !== 0x0d &&\n input[position.position + 1] !== 0x0a\n ) {\n const attribute = parseContentDispositionAttribute(input, position)\n\n if (!attribute) {\n break\n }\n\n if (attribute.name === 'name') {\n name = attribute.value\n } else if (attribute.name === 'filename') {\n filename = attribute.value\n }\n }\n\n if (name === null) {\n throw parsingError('name attribute is required in content-disposition header')\n }\n\n break\n }\n case 'content-type': {\n // 1. Let header value be the result of collecting a sequence of bytes that are\n // not 0x0A (LF) or 0x0D (CR), given position.\n let headerValue = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d,\n input,\n position\n )\n\n // 2. Remove any HTTP tab or space bytes from the end of header value.\n headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20)\n\n // 3. Set contentType to the isomorphic decoding of header value.\n contentType = isomorphicDecode(headerValue)\n\n break\n }\n case 'content-transfer-encoding': {\n let headerValue = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d,\n input,\n position\n )\n\n headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20)\n\n encoding = isomorphicDecode(headerValue)\n\n break\n }\n default: {\n // Collect a sequence of bytes that are not 0x0A (LF) or 0x0D (CR), given position.\n // (Do nothing with those bytes.)\n collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d,\n input,\n position\n )\n }\n }\n\n // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A\n // (CR LF), return failure. Otherwise, advance position by 2 (past the newline).\n if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) {\n throw parsingError('expected CRLF')\n } else {\n position.position += 2\n }\n }\n}\n\n/**\n * @param {(char: number) => boolean} condition\n * @param {Buffer} input\n * @param {{ position: number }} position\n */\nfunction collectASequenceOfBytes (condition, input, position) {\n let start = position.position\n\n while (start < input.length && condition(input[start])) {\n ++start\n }\n\n return input.subarray(position.position, (position.position = start))\n}\n\n/**\n * @param {Buffer} buf\n * @param {boolean} leading\n * @param {boolean} trailing\n * @param {(charCode: number) => boolean} predicate\n * @returns {Buffer}\n */\nfunction removeChars (buf, leading, trailing, predicate) {\n let lead = 0\n let trail = buf.length - 1\n\n if (leading) {\n while (lead < buf.length && predicate(buf[lead])) lead++\n }\n\n if (trailing) {\n while (trail > 0 && predicate(buf[trail])) trail--\n }\n\n return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1)\n}\n\n/**\n * Checks if {@param buffer} starts with {@param start}\n * @param {Buffer} buffer\n * @param {Buffer} start\n * @param {{ position: number }} position\n */\nfunction bufferStartsWith (buffer, start, position) {\n if (buffer.length < start.length) {\n return false\n }\n\n for (let i = 0; i < start.length; i++) {\n if (start[i] !== buffer[position.position + i]) {\n return false\n }\n }\n\n return true\n}\n\nfunction parsingError (cause) {\n return new TypeError('Failed to parse body as FormData.', { cause: new TypeError(cause) })\n}\n\n/**\n * CTL = \n * @param {number} char\n */\nfunction isCTL (char) {\n return char <= 0x1f || char === 0x7f\n}\n\n/**\n * tspecials := \"(\" / \")\" / \"<\" / \">\" / \"@\" /\n * \",\" / \";\" / \":\" / \"\\\" / <\">\n * \"/\" / \"[\" / \"]\" / \"?\" / \"=\"\n * ; Must be in quoted-string,\n * ; to use within parameter values\n * @param {number} char\n */\nfunction isTSpecial (char) {\n return (\n char === 0x28 || // (\n char === 0x29 || // )\n char === 0x3c || // <\n char === 0x3e || // >\n char === 0x40 || // @\n char === 0x2c || // ,\n char === 0x3b || // ;\n char === 0x3a || // :\n char === 0x5c || // \\\n char === 0x22 || // \"\n char === 0x2f || // /\n char === 0x5b || // [\n char === 0x5d || // ]\n char === 0x3f || // ?\n char === 0x3d // +\n )\n}\n\n/**\n * token := 1*\n * @param {number} char\n */\nfunction isToken (char) {\n return (\n char <= 0x7f && // ascii\n char !== 0x20 && // space\n char !== 0x09 &&\n !isCTL(char) &&\n !isTSpecial(char)\n )\n}\n\nmodule.exports = {\n multipartFormDataParser,\n validateBoundary\n}\n","'use strict'\n\n/** @typedef {`node:${string}`} NodeModuleName */\n\n/** @type {Record any>} */\nconst lazyLoaders = {\n __proto__: null,\n 'node:crypto': () => require('node:crypto'),\n 'node:sqlite': () => require('node:sqlite')\n}\n\n/**\n * @param {NodeModuleName} moduleName\n * @returns {boolean}\n */\nfunction detectRuntimeFeatureByNodeModule (moduleName) {\n try {\n lazyLoaders[moduleName]()\n return true\n } catch (err) {\n if (err.code !== 'ERR_UNKNOWN_BUILTIN_MODULE' && err.code !== 'ERR_NO_CRYPTO') {\n throw err\n }\n return false\n }\n}\n\nconst runtimeFeaturesAsNodeModule = /** @type {const} */ (['crypto', 'sqlite'])\n/** @typedef {typeof runtimeFeaturesAsNodeModule[number]} RuntimeFeatureByNodeModule */\n/** @typedef {RuntimeFeatureByNodeModule} Feature */\n\n/**\n * @param {Feature} feature\n * @returns {boolean}\n */\nfunction detectRuntimeFeature (feature) {\n if (runtimeFeaturesAsNodeModule.includes(/** @type {RuntimeFeatureByNodeModule} */ (feature))) {\n return detectRuntimeFeatureByNodeModule(`node:${feature}`)\n }\n throw new TypeError(`unknown feature: ${feature}`)\n}\n\n/**\n * @class\n * @name RuntimeFeatures\n */\nclass RuntimeFeatures {\n /** @type {Map} */\n #map = new Map()\n\n /**\n * Clears all cached feature detections.\n */\n clear () {\n this.#map.clear()\n }\n\n /**\n * @param {Feature} feature\n * @returns {boolean}\n */\n has (feature) {\n return (\n this.#map.get(feature) ?? this.#detectRuntimeFeature(feature)\n )\n }\n\n /**\n * @param {Feature} feature\n * @param {boolean} value\n */\n set (feature, value) {\n if (runtimeFeaturesAsNodeModule.includes(feature) === false) {\n throw new TypeError(`unknown feature: ${feature}`)\n }\n this.#map.set(feature, value)\n }\n\n /**\n * @param {Feature} feature\n * @returns {boolean}\n */\n #detectRuntimeFeature (feature) {\n const result = detectRuntimeFeature(feature)\n this.#map.set(feature, result)\n return result\n }\n}\n\nconst instance = new RuntimeFeatures()\n\nmodule.exports.runtimeFeatures = instance\nmodule.exports.default = instance\n","'use strict'\n\nconst util = require('../../core/util')\nconst {\n ReadableStreamFrom,\n readableStreamClose,\n fullyReadBody,\n extractMimeType\n} = require('./util')\nconst { FormData, setFormDataState } = require('./formdata')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst { isErrored, isDisturbed } = require('node:stream')\nconst { isUint8Array } = require('node:util/types')\nconst { serializeAMimeType } = require('./data-url')\nconst { multipartFormDataParser } = require('./formdata-parser')\nconst { parseJSONFromBytes } = require('../infra')\nconst { utf8DecodeBytes } = require('../../encoding')\nconst { runtimeFeatures } = require('../../util/runtime-features.js')\n\nconst random = runtimeFeatures.has('crypto')\n ? require('node:crypto').randomInt\n : (max) => Math.floor(Math.random() * max)\n\nconst textEncoder = new TextEncoder()\nfunction noop () {}\n\nconst streamRegistry = new FinalizationRegistry((weakRef) => {\n const stream = weakRef.deref()\n if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) {\n stream.cancel('Response object has been garbage collected').catch(noop)\n }\n})\n\n/**\n * Extract a body with type from a byte sequence or BodyInit object\n *\n * @param {import('../../../types').BodyInit} object - The BodyInit object to extract from\n * @param {boolean} [keepalive=false] - If true, indicates that the body\n * @returns {[{stream: ReadableStream, source: any, length: number | null}, string | null]} - Returns a tuple containing the body and its type\n *\n * @see https://fetch.spec.whatwg.org/#concept-bodyinit-extract\n */\nfunction extractBody (object, keepalive = false) {\n // 1. Let stream be null.\n let stream = null\n let controller = null\n\n // 2. If object is a ReadableStream object, then set stream to object.\n if (webidl.is.ReadableStream(object)) {\n stream = object\n } else if (webidl.is.Blob(object)) {\n // 3. Otherwise, if object is a Blob object, set stream to the\n // result of running object’s get stream.\n stream = object.stream()\n } else {\n // 4. Otherwise, set stream to a new ReadableStream object, and set\n // up stream with byte reading support.\n stream = new ReadableStream({\n pull () {},\n start (c) {\n controller = c\n },\n cancel () {},\n type: 'bytes'\n })\n }\n\n // 5. Assert: stream is a ReadableStream object.\n assert(webidl.is.ReadableStream(stream))\n\n // 6. Let action be null.\n let action = null\n\n // 7. Let source be null.\n let source = null\n\n // 8. Let length be null.\n let length = null\n\n // 9. Let type be null.\n let type = null\n\n // 10. Switch on object:\n if (typeof object === 'string') {\n // Set source to the UTF-8 encoding of object.\n // Note: setting source to a Uint8Array here breaks some mocking assumptions.\n source = object\n\n // Set type to `text/plain;charset=UTF-8`.\n type = 'text/plain;charset=UTF-8'\n } else if (webidl.is.URLSearchParams(object)) {\n // URLSearchParams\n\n // spec says to run application/x-www-form-urlencoded on body.list\n // this is implemented in Node.js as apart of an URLSearchParams instance toString method\n // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490\n // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100\n\n // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list.\n source = object.toString()\n\n // Set type to `application/x-www-form-urlencoded;charset=UTF-8`.\n type = 'application/x-www-form-urlencoded;charset=UTF-8'\n } else if (webidl.is.BufferSource(object)) {\n // Set source to a copy of the bytes held by object.\n source = webidl.util.getCopyOfBytesHeldByBufferSource(object)\n } else if (webidl.is.FormData(object)) {\n const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`\n const prefix = `--${boundary}\\r\\nContent-Disposition: form-data`\n\n /*! formdata-polyfill. MIT License. Jimmy Wärting */\n const formdataEscape = (str) =>\n str.replace(/\\n/g, '%0A').replace(/\\r/g, '%0D').replace(/\"/g, '%22')\n const normalizeLinefeeds = (value) => value.replace(/\\r?\\n|\\r/g, '\\r\\n')\n\n // Set action to this step: run the multipart/form-data\n // encoding algorithm, with object’s entry list and UTF-8.\n // - This ensures that the body is immutable and can't be changed afterwords\n // - That the content-length is calculated in advance.\n // - And that all parts are pre-encoded and ready to be sent.\n\n const blobParts = []\n const rn = new Uint8Array([13, 10]) // '\\r\\n'\n length = 0\n let hasUnknownSizeValue = false\n\n for (const [name, value] of object) {\n if (typeof value === 'string') {\n const chunk = textEncoder.encode(prefix +\n `; name=\"${formdataEscape(normalizeLinefeeds(name))}\"` +\n `\\r\\n\\r\\n${normalizeLinefeeds(value)}\\r\\n`)\n blobParts.push(chunk)\n length += chunk.byteLength\n } else {\n const chunk = textEncoder.encode(`${prefix}; name=\"${formdataEscape(normalizeLinefeeds(name))}\"` +\n (value.name ? `; filename=\"${formdataEscape(value.name)}\"` : '') + '\\r\\n' +\n `Content-Type: ${\n value.type || 'application/octet-stream'\n }\\r\\n\\r\\n`)\n blobParts.push(chunk, value, rn)\n if (typeof value.size === 'number') {\n length += chunk.byteLength + value.size + rn.byteLength\n } else {\n hasUnknownSizeValue = true\n }\n }\n }\n\n // CRLF is appended to the body to function with legacy servers and match other implementations.\n // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030\n // https://github.com/form-data/form-data/issues/63\n const chunk = textEncoder.encode(`--${boundary}--\\r\\n`)\n blobParts.push(chunk)\n length += chunk.byteLength\n if (hasUnknownSizeValue) {\n length = null\n }\n\n // Set source to object.\n source = object\n\n action = async function * () {\n for (const part of blobParts) {\n if (part.stream) {\n yield * part.stream()\n } else {\n yield part\n }\n }\n }\n\n // Set type to `multipart/form-data; boundary=`,\n // followed by the multipart/form-data boundary string generated\n // by the multipart/form-data encoding algorithm.\n type = `multipart/form-data; boundary=${boundary}`\n } else if (webidl.is.Blob(object)) {\n // Blob\n\n // Set source to object.\n source = object\n\n // Set length to object’s size.\n length = object.size\n\n // If object’s type attribute is not the empty byte sequence, set\n // type to its value.\n if (object.type) {\n type = object.type\n }\n } else if (typeof object[Symbol.asyncIterator] === 'function') {\n // If keepalive is true, then throw a TypeError.\n if (keepalive) {\n throw new TypeError('keepalive')\n }\n\n // If object is disturbed or locked, then throw a TypeError.\n if (util.isDisturbed(object) || object.locked) {\n throw new TypeError(\n 'Response body object should not be disturbed or locked'\n )\n }\n\n stream =\n webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object)\n }\n\n // 11. If source is a byte sequence, then set action to a\n // step that returns source and length to source’s length.\n if (typeof source === 'string' || isUint8Array(source)) {\n action = () => {\n length = typeof source === 'string' ? Buffer.byteLength(source) : source.length\n return source\n }\n }\n\n // 12. If action is non-null, then run these steps in parallel:\n if (action != null) {\n ;(async () => {\n // 1. Run action.\n const result = action()\n\n // 2. Whenever one or more bytes are available and stream is not errored,\n // enqueue the result of creating a Uint8Array from the available bytes into stream.\n const iterator = result?.[Symbol.asyncIterator]?.()\n if (iterator) {\n for await (const bytes of iterator) {\n if (isErrored(stream)) break\n if (bytes.length) {\n controller.enqueue(new Uint8Array(bytes))\n }\n }\n } else if (result?.length && !isErrored(stream)) {\n controller.enqueue(typeof result === 'string' ? textEncoder.encode(result) : new Uint8Array(result))\n }\n\n // 3. When running action is done, close stream.\n queueMicrotask(() => readableStreamClose(controller))\n })()\n }\n\n // 13. Let body be a body whose stream is stream, source is source,\n // and length is length.\n const body = { stream, source, length }\n\n // 14. Return (body, type).\n return [body, type]\n}\n\n/**\n * @typedef {object} ExtractBodyResult\n * @property {ReadableStream>} stream - The ReadableStream containing the body data\n * @property {any} source - The original source of the body data\n * @property {number | null} length - The length of the body data, or null\n */\n\n/**\n * Safely extract a body with type from a byte sequence or BodyInit object.\n *\n * @param {import('../../../types').BodyInit} object - The BodyInit object to extract from\n * @param {boolean} [keepalive=false] - If true, indicates that the body\n * @returns {[ExtractBodyResult, string | null]} - Returns a tuple containing the body and its type\n *\n * @see https://fetch.spec.whatwg.org/#bodyinit-safely-extract\n */\nfunction safelyExtractBody (object, keepalive = false) {\n // To safely extract a body and a `Content-Type` value from\n // a byte sequence or BodyInit object object, run these steps:\n\n // 1. If object is a ReadableStream object, then:\n if (webidl.is.ReadableStream(object)) {\n // Assert: object is neither disturbed nor locked.\n assert(!util.isDisturbed(object), 'The body has already been consumed.')\n assert(!object.locked, 'The stream is locked.')\n }\n\n // 2. Return the results of extracting object.\n return extractBody(object, keepalive)\n}\n\nfunction cloneBody (body) {\n // To clone a body body, run these steps:\n\n // https://fetch.spec.whatwg.org/#concept-body-clone\n\n // 1. Let « out1, out2 » be the result of teeing body’s stream.\n const { 0: out1, 1: out2 } = body.stream.tee()\n\n // 2. Set body’s stream to out1.\n body.stream = out1\n\n // 3. Return a body whose stream is out2 and other members are copied from body.\n return {\n stream: out2,\n length: body.length,\n source: body.source\n }\n}\n\nfunction bodyMixinMethods (instance, getInternalState) {\n const methods = {\n blob () {\n // The blob() method steps are to return the result of\n // running consume body with this and the following step\n // given a byte sequence bytes: return a Blob whose\n // contents are bytes and whose type attribute is this’s\n // MIME type.\n return consumeBody(this, (bytes) => {\n let mimeType = bodyMimeType(getInternalState(this))\n\n if (mimeType === null) {\n mimeType = ''\n } else if (mimeType) {\n mimeType = serializeAMimeType(mimeType)\n }\n\n // Return a Blob whose contents are bytes and type attribute\n // is mimeType.\n return new Blob([bytes], { type: mimeType })\n }, instance, getInternalState)\n },\n\n arrayBuffer () {\n // The arrayBuffer() method steps are to return the result\n // of running consume body with this and the following step\n // given a byte sequence bytes: return a new ArrayBuffer\n // whose contents are bytes.\n return consumeBody(this, (bytes) => {\n return new Uint8Array(bytes).buffer\n }, instance, getInternalState)\n },\n\n text () {\n // The text() method steps are to return the result of running\n // consume body with this and UTF-8 decode.\n return consumeBody(this, utf8DecodeBytes, instance, getInternalState)\n },\n\n json () {\n // The json() method steps are to return the result of running\n // consume body with this and parse JSON from bytes.\n return consumeBody(this, parseJSONFromBytes, instance, getInternalState)\n },\n\n formData () {\n // The formData() method steps are to return the result of running\n // consume body with this and the following step given a byte sequence bytes:\n return consumeBody(this, (value) => {\n // 1. Let mimeType be the result of get the MIME type with this.\n const mimeType = bodyMimeType(getInternalState(this))\n\n // 2. If mimeType is non-null, then switch on mimeType’s essence and run\n // the corresponding steps:\n if (mimeType !== null) {\n switch (mimeType.essence) {\n case 'multipart/form-data': {\n // 1. ... [long step]\n // 2. If that fails for some reason, then throw a TypeError.\n const parsed = multipartFormDataParser(value, mimeType)\n\n // 3. Return a new FormData object, appending each entry,\n // resulting from the parsing operation, to its entry list.\n const fd = new FormData()\n setFormDataState(fd, parsed)\n\n return fd\n }\n case 'application/x-www-form-urlencoded': {\n // 1. Let entries be the result of parsing bytes.\n const entries = new URLSearchParams(value.toString())\n\n // 2. If entries is failure, then throw a TypeError.\n\n // 3. Return a new FormData object whose entry list is entries.\n const fd = new FormData()\n\n for (const [name, value] of entries) {\n fd.append(name, value)\n }\n\n return fd\n }\n }\n }\n\n // 3. Throw a TypeError.\n throw new TypeError(\n 'Content-Type was not one of \"multipart/form-data\" or \"application/x-www-form-urlencoded\".'\n )\n }, instance, getInternalState)\n },\n\n bytes () {\n // The bytes() method steps are to return the result of running consume body\n // with this and the following step given a byte sequence bytes: return the\n // result of creating a Uint8Array from bytes in this’s relevant realm.\n return consumeBody(this, (bytes) => {\n return new Uint8Array(bytes)\n }, instance, getInternalState)\n }\n }\n\n return methods\n}\n\nfunction mixinBody (prototype, getInternalState) {\n Object.assign(prototype.prototype, bodyMixinMethods(prototype, getInternalState))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-consume-body\n * @param {any} object internal state\n * @param {(value: unknown) => unknown} convertBytesToJSValue\n * @param {any} instance\n * @param {(target: any) => any} getInternalState\n */\nfunction consumeBody (object, convertBytesToJSValue, instance, getInternalState) {\n try {\n webidl.brandCheck(object, instance)\n } catch (e) {\n return Promise.reject(e)\n }\n\n object = getInternalState(object)\n\n // 1. If object is unusable, then return a promise rejected\n // with a TypeError.\n if (bodyUnusable(object)) {\n return Promise.reject(new TypeError('Body is unusable: Body has already been read'))\n }\n\n // 2. Let promise be a new promise.\n const promise = Promise.withResolvers()\n\n // 3. Let errorSteps given error be to reject promise with error.\n const errorSteps = promise.reject\n\n // 4. Let successSteps given a byte sequence data be to resolve\n // promise with the result of running convertBytesToJSValue\n // with data. If that threw an exception, then run errorSteps\n // with that exception.\n const successSteps = (data) => {\n try {\n promise.resolve(convertBytesToJSValue(data))\n } catch (e) {\n errorSteps(e)\n }\n }\n\n // 5. If object’s body is null, then run successSteps with an\n // empty byte sequence.\n if (object.body == null) {\n successSteps(Buffer.allocUnsafe(0))\n return promise.promise\n }\n\n // 6. Otherwise, fully read object’s body given successSteps,\n // errorSteps, and object’s relevant global object.\n fullyReadBody(object.body, successSteps, errorSteps)\n\n // 7. Return promise.\n return promise.promise\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-unusable\n * @param {any} object internal state\n */\nfunction bodyUnusable (object) {\n const body = object.body\n\n // An object including the Body interface mixin is\n // said to be unusable if its body is non-null and\n // its body’s stream is disturbed or locked.\n return body != null && (body.stream.locked || util.isDisturbed(body.stream))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-mime-type\n * @param {any} requestOrResponse internal state\n */\nfunction bodyMimeType (requestOrResponse) {\n // 1. Let headers be null.\n // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list.\n // 3. Otherwise, set headers to requestOrResponse’s response’s header list.\n /** @type {import('./headers').HeadersList} */\n const headers = requestOrResponse.headersList\n\n // 4. Let mimeType be the result of extracting a MIME type from headers.\n const mimeType = extractMimeType(headers)\n\n // 5. If mimeType is failure, then return null.\n if (mimeType === 'failure') {\n return null\n }\n\n // 6. Return mimeType.\n return mimeType\n}\n\nmodule.exports = {\n extractBody,\n safelyExtractBody,\n cloneBody,\n mixinBody,\n streamRegistry,\n bodyUnusable\n}\n","'use strict'\n\n/* global WebAssembly */\n\nconst assert = require('node:assert')\nconst util = require('../core/util.js')\nconst { channels } = require('../core/diagnostics.js')\nconst timers = require('../util/timers.js')\nconst {\n RequestContentLengthMismatchError,\n ResponseContentLengthMismatchError,\n RequestAbortedError,\n HeadersTimeoutError,\n HeadersOverflowError,\n SocketError,\n InformationalError,\n BodyTimeoutError,\n HTTPParserError,\n ResponseExceededMaxSizeError\n} = require('../core/errors.js')\nconst {\n kUrl,\n kReset,\n kClient,\n kParser,\n kBlocking,\n kRunning,\n kPending,\n kSize,\n kWriting,\n kQueue,\n kNoRef,\n kKeepAliveDefaultTimeout,\n kHostHeader,\n kPendingIdx,\n kRunningIdx,\n kError,\n kPipelining,\n kSocket,\n kKeepAliveTimeoutValue,\n kMaxHeadersSize,\n kKeepAliveMaxTimeout,\n kKeepAliveTimeoutThreshold,\n kHeadersTimeout,\n kBodyTimeout,\n kStrictContentLength,\n kMaxRequests,\n kCounter,\n kMaxResponseSize,\n kOnError,\n kResume,\n kHTTPContext,\n kClosed\n} = require('../core/symbols.js')\n\nconst constants = require('../llhttp/constants.js')\nconst EMPTY_BUF = Buffer.alloc(0)\nconst FastBuffer = Buffer[Symbol.species]\nconst removeAllListeners = util.removeAllListeners\n\nlet extractBody\n\nfunction lazyllhttp () {\n const llhttpWasmData = process.env.JEST_WORKER_ID ? require('../llhttp/llhttp-wasm.js') : undefined\n\n let mod\n\n // We disable wasm SIMD on ppc64 as it seems to be broken on Power 9 architectures.\n let useWasmSIMD = process.arch !== 'ppc64'\n // The Env Variable UNDICI_NO_WASM_SIMD allows explicitly overriding the default behavior\n if (process.env.UNDICI_NO_WASM_SIMD === '1') {\n useWasmSIMD = true\n } else if (process.env.UNDICI_NO_WASM_SIMD === '0') {\n useWasmSIMD = false\n }\n\n if (useWasmSIMD) {\n try {\n mod = new WebAssembly.Module(require('../llhttp/llhttp_simd-wasm.js'))\n } catch {\n }\n }\n\n if (!mod) {\n // We could check if the error was caused by the simd option not\n // being enabled, but the occurring of this other error\n // * https://github.com/emscripten-core/emscripten/issues/11495\n // got me to remove that check to avoid breaking Node 12.\n mod = new WebAssembly.Module(llhttpWasmData || require('../llhttp/llhttp-wasm.js'))\n }\n\n return new WebAssembly.Instance(mod, {\n env: {\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_url: (p, at, len) => {\n return 0\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_status: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @returns {number}\n */\n wasm_on_message_begin: (p) => {\n assert(currentParser.ptr === p)\n return currentParser.onMessageBegin()\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_header_field: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_header_value: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @param {number} statusCode\n * @param {0|1} upgrade\n * @param {0|1} shouldKeepAlive\n * @returns {number}\n */\n wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => {\n assert(currentParser.ptr === p)\n return currentParser.onHeadersComplete(statusCode, upgrade === 1, shouldKeepAlive === 1)\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_body: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @returns {number}\n */\n wasm_on_message_complete: (p) => {\n assert(currentParser.ptr === p)\n return currentParser.onMessageComplete()\n }\n\n }\n })\n}\n\nlet llhttpInstance = null\n\n/**\n * @type {Parser|null}\n */\nlet currentParser = null\nlet currentBufferRef = null\n/**\n * @type {number}\n */\nlet currentBufferSize = 0\nlet currentBufferPtr = null\n\nconst USE_NATIVE_TIMER = 0\nconst USE_FAST_TIMER = 1\n\n// Use fast timers for headers and body to take eventual event loop\n// latency into account.\nconst TIMEOUT_HEADERS = 2 | USE_FAST_TIMER\nconst TIMEOUT_BODY = 4 | USE_FAST_TIMER\n\n// Use native timers to ignore event loop latency for keep-alive\n// handling.\nconst TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER\n\nclass Parser {\n /**\n * @param {import('./client.js')} client\n * @param {import('net').Socket} socket\n * @param {*} llhttp\n */\n constructor (client, socket, { exports }) {\n this.llhttp = exports\n this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE)\n this.client = client\n /**\n * @type {import('net').Socket}\n */\n this.socket = socket\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n this.statusCode = 0\n this.statusText = ''\n this.upgrade = false\n this.headers = []\n this.headersSize = 0\n this.headersMaxSize = client[kMaxHeadersSize]\n this.shouldKeepAlive = false\n this.paused = false\n this.resume = this.resume.bind(this)\n\n this.bytesRead = 0\n\n this.keepAlive = ''\n this.contentLength = ''\n this.connection = ''\n this.maxResponseSize = client[kMaxResponseSize]\n }\n\n setTimeout (delay, type) {\n // If the existing timer and the new timer are of different timer type\n // (fast or native) or have different delay, we need to clear the existing\n // timer and set a new one.\n if (\n delay !== this.timeoutValue ||\n (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER)\n ) {\n // If a timeout is already set, clear it with clearTimeout of the fast\n // timer implementation, as it can clear fast and native timers.\n if (this.timeout) {\n timers.clearTimeout(this.timeout)\n this.timeout = null\n }\n\n if (delay) {\n if (type & USE_FAST_TIMER) {\n this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this))\n } else {\n this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this))\n this.timeout?.unref()\n }\n }\n\n this.timeoutValue = delay\n } else if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n this.timeoutType = type\n }\n\n resume () {\n if (this.socket.destroyed || !this.paused) {\n return\n }\n\n assert(this.ptr != null)\n assert(currentParser === null)\n\n this.llhttp.llhttp_resume(this.ptr)\n\n assert(this.timeoutType === TIMEOUT_BODY)\n if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n this.paused = false\n this.execute(this.socket.read() || EMPTY_BUF) // Flush parser.\n this.readMore()\n }\n\n readMore () {\n while (!this.paused && this.ptr) {\n const chunk = this.socket.read()\n if (chunk === null) {\n break\n }\n this.execute(chunk)\n }\n }\n\n /**\n * @param {Buffer} chunk\n */\n execute (chunk) {\n assert(currentParser === null)\n assert(this.ptr != null)\n assert(!this.paused)\n\n const { socket, llhttp } = this\n\n // Allocate a new buffer if the current buffer is too small.\n if (chunk.length > currentBufferSize) {\n if (currentBufferPtr) {\n llhttp.free(currentBufferPtr)\n }\n // Allocate a buffer that is a multiple of 4096 bytes.\n currentBufferSize = Math.ceil(chunk.length / 4096) * 4096\n currentBufferPtr = llhttp.malloc(currentBufferSize)\n }\n\n new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(chunk)\n\n // Call `execute` on the wasm parser.\n // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data,\n // and finally the length of bytes to parse.\n // The return value is an error code or `constants.ERROR.OK`.\n try {\n let ret\n\n try {\n currentBufferRef = chunk\n currentParser = this\n ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length)\n } finally {\n currentParser = null\n currentBufferRef = null\n }\n\n if (ret !== constants.ERROR.OK) {\n const data = chunk.subarray(llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr)\n\n if (ret === constants.ERROR.PAUSED_UPGRADE) {\n this.onUpgrade(data)\n } else if (ret === constants.ERROR.PAUSED) {\n this.paused = true\n socket.unshift(data)\n } else {\n const ptr = llhttp.llhttp_get_error_reason(this.ptr)\n let message = ''\n if (ptr) {\n const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0)\n message =\n 'Response does not match the HTTP/1.1 protocol (' +\n Buffer.from(llhttp.memory.buffer, ptr, len).toString() +\n ')'\n }\n throw new HTTPParserError(message, constants.ERROR[ret], data)\n }\n }\n } catch (err) {\n util.destroy(socket, err)\n }\n }\n\n destroy () {\n assert(currentParser === null)\n assert(this.ptr != null)\n\n this.llhttp.llhttp_free(this.ptr)\n this.ptr = null\n\n this.timeout && timers.clearTimeout(this.timeout)\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n\n this.paused = false\n }\n\n /**\n * @param {Buffer} buf\n * @returns {0}\n */\n onStatus (buf) {\n this.statusText = buf.toString()\n return 0\n }\n\n /**\n * @returns {0|-1}\n */\n onMessageBegin () {\n const { socket, client } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n if (!request) {\n return -1\n }\n request.onResponseStarted()\n\n return 0\n }\n\n /**\n * @param {Buffer} buf\n * @returns {number}\n */\n onHeaderField (buf) {\n const len = this.headers.length\n\n if ((len & 1) === 0) {\n this.headers.push(buf)\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n this.trackHeader(buf.length)\n\n return 0\n }\n\n /**\n * @param {Buffer} buf\n * @returns {number}\n */\n onHeaderValue (buf) {\n let len = this.headers.length\n\n if ((len & 1) === 1) {\n this.headers.push(buf)\n len += 1\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n const key = this.headers[len - 2]\n if (key.length === 10) {\n const headerName = util.bufferToLowerCasedHeaderName(key)\n if (headerName === 'keep-alive') {\n this.keepAlive += buf.toString()\n } else if (headerName === 'connection') {\n this.connection += buf.toString()\n }\n } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') {\n this.contentLength += buf.toString()\n }\n\n this.trackHeader(buf.length)\n\n return 0\n }\n\n /**\n * @param {number} len\n */\n trackHeader (len) {\n this.headersSize += len\n if (this.headersSize >= this.headersMaxSize) {\n util.destroy(this.socket, new HeadersOverflowError())\n }\n }\n\n /**\n * @param {Buffer} head\n */\n onUpgrade (head) {\n const { upgrade, client, socket, headers, statusCode } = this\n\n assert(upgrade)\n assert(client[kSocket] === socket)\n assert(!socket.destroyed)\n assert(!this.paused)\n assert((headers.length & 1) === 0)\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n assert(request.upgrade || request.method === 'CONNECT')\n\n this.statusCode = 0\n this.statusText = ''\n this.shouldKeepAlive = false\n\n this.headers = []\n this.headersSize = 0\n\n socket.unshift(head)\n\n socket[kParser].destroy()\n socket[kParser] = null\n\n socket[kClient] = null\n socket[kError] = null\n\n removeAllListeners(socket)\n\n client[kSocket] = null\n client[kHTTPContext] = null // TODO (fix): This is hacky...\n client[kQueue][client[kRunningIdx]++] = null\n client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade'))\n\n try {\n request.onRequestUpgrade(statusCode, headers, socket)\n } catch (err) {\n util.destroy(socket, err)\n }\n\n client[kResume]()\n }\n\n /**\n * @param {number} statusCode\n * @param {boolean} upgrade\n * @param {boolean} shouldKeepAlive\n * @returns {number}\n */\n onHeadersComplete (statusCode, upgrade, shouldKeepAlive) {\n const { client, socket, headers, statusText } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n\n if (!request) {\n return -1\n }\n\n assert(!this.upgrade)\n assert(this.statusCode < 200)\n\n if (statusCode === 100) {\n util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))\n return -1\n }\n\n /* this can only happen if server is misbehaving */\n if (upgrade && !request.upgrade) {\n util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket)))\n return -1\n }\n\n assert(this.timeoutType === TIMEOUT_HEADERS)\n\n this.statusCode = statusCode\n this.shouldKeepAlive = (\n shouldKeepAlive ||\n // Override llhttp value which does not allow keepAlive for HEAD.\n (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive')\n )\n\n if (this.statusCode >= 200) {\n const bodyTimeout = request.bodyTimeout != null\n ? request.bodyTimeout\n : client[kBodyTimeout]\n this.setTimeout(bodyTimeout, TIMEOUT_BODY)\n } else if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n if (request.method === 'CONNECT') {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n if (upgrade) {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n assert((this.headers.length & 1) === 0)\n this.headers = []\n this.headersSize = 0\n\n if (this.shouldKeepAlive && client[kPipelining]) {\n const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null\n\n if (keepAliveTimeout != null) {\n const timeout = Math.min(\n keepAliveTimeout - client[kKeepAliveTimeoutThreshold],\n client[kKeepAliveMaxTimeout]\n )\n if (timeout <= 0) {\n socket[kReset] = true\n } else {\n client[kKeepAliveTimeoutValue] = timeout\n }\n } else {\n client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]\n }\n } else {\n // Stop more requests from being dispatched.\n socket[kReset] = true\n }\n\n const pause = request.onResponseStart(statusCode, headers, this.resume, statusText) === false\n\n if (request.aborted) {\n return -1\n }\n\n if (request.method === 'HEAD') {\n return 1\n }\n\n if (statusCode < 200) {\n return 1\n }\n\n if (socket[kBlocking]) {\n socket[kBlocking] = false\n client[kResume]()\n }\n\n return pause ? constants.ERROR.PAUSED : 0\n }\n\n /**\n * @param {Buffer} buf\n * @returns {number}\n */\n onBody (buf) {\n const { client, socket, statusCode, maxResponseSize } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert(this.timeoutType === TIMEOUT_BODY)\n if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n assert(statusCode >= 200)\n\n if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {\n util.destroy(socket, new ResponseExceededMaxSizeError())\n return -1\n }\n\n this.bytesRead += buf.length\n\n if (request.onResponseData(buf) === false) {\n return constants.ERROR.PAUSED\n }\n\n return 0\n }\n\n /**\n * @returns {number}\n */\n onMessageComplete () {\n const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this\n\n if (socket.destroyed && (!statusCode || shouldKeepAlive)) {\n return -1\n }\n\n if (upgrade) {\n return 0\n }\n\n assert(statusCode >= 100)\n assert((this.headers.length & 1) === 0)\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n this.statusCode = 0\n this.statusText = ''\n this.bytesRead = 0\n this.contentLength = ''\n this.keepAlive = ''\n this.connection = ''\n\n this.headers = []\n this.headersSize = 0\n\n if (statusCode < 200) {\n return 0\n }\n\n if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) {\n util.destroy(socket, new ResponseContentLengthMismatchError())\n return -1\n }\n\n request.onResponseEnd(headers)\n\n client[kQueue][client[kRunningIdx]++] = null\n\n if (socket[kWriting]) {\n assert(client[kRunning] === 0)\n // Response completed before request.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (!shouldKeepAlive) {\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (socket[kReset] && client[kRunning] === 0) {\n // Destroy socket once all requests have completed.\n // The request at the tail of the pipeline is the one\n // that requested reset and no further requests should\n // have been queued since then.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (client[kPipelining] == null || client[kPipelining] === 1) {\n // We must wait a full event loop cycle to reuse this socket to make sure\n // that non-spec compliant servers are not closing the connection even if they\n // said they won't.\n setImmediate(client[kResume])\n } else {\n client[kResume]()\n }\n\n return 0\n }\n}\n\nfunction onParserTimeout (parserWeakRef) {\n const parser = parserWeakRef.deref()\n if (!parser) {\n return\n }\n\n const { socket, timeoutType, client, paused } = parser\n\n if (timeoutType === TIMEOUT_HEADERS) {\n if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {\n assert(!paused, 'cannot be paused while waiting for headers')\n util.destroy(socket, new HeadersTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_BODY) {\n if (!paused) {\n util.destroy(socket, new BodyTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_KEEP_ALIVE) {\n assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue])\n util.destroy(socket, new InformationalError('socket idle timeout'))\n }\n}\n\n/**\n * @param {import ('./client.js')} client\n * @param {import('net').Socket} socket\n * @returns\n */\nfunction connectH1 (client, socket) {\n client[kSocket] = socket\n\n if (!llhttpInstance) {\n llhttpInstance = lazyllhttp()\n }\n\n if (socket.errored) {\n throw socket.errored\n }\n\n if (socket.destroyed) {\n throw new SocketError('destroyed')\n }\n\n socket[kNoRef] = false\n socket[kWriting] = false\n socket[kReset] = false\n socket[kBlocking] = false\n socket[kParser] = new Parser(client, socket, llhttpInstance)\n\n util.addListener(socket, 'error', onHttpSocketError)\n util.addListener(socket, 'readable', onHttpSocketReadable)\n util.addListener(socket, 'end', onHttpSocketEnd)\n util.addListener(socket, 'close', onHttpSocketClose)\n\n socket[kClosed] = false\n socket.on('close', onSocketClose)\n\n return {\n version: 'h1',\n defaultPipelining: 1,\n write (request) {\n return writeH1(client, request)\n },\n resume () {\n resumeH1(client)\n },\n /**\n * @param {Error|undefined} err\n * @param {() => void} callback\n */\n destroy (err, callback) {\n if (socket[kClosed]) {\n queueMicrotask(callback)\n } else {\n socket.on('close', callback)\n socket.destroy(err)\n }\n },\n /**\n * @returns {boolean}\n */\n get destroyed () {\n return socket.destroyed\n },\n /**\n * @param {import('../core/request.js')} request\n * @returns {boolean}\n */\n busy (request) {\n if (socket[kWriting] || socket[kReset] || socket[kBlocking]) {\n return true\n }\n\n if (request) {\n if (client[kRunning] > 0 && !request.idempotent) {\n // Non-idempotent request cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return true\n }\n\n if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) {\n // Don't dispatch an upgrade until all preceding requests have completed.\n // A misbehaving server might upgrade the connection before all pipelined\n // request has completed.\n return true\n }\n\n if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 &&\n (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) {\n // Request with stream or iterator body can error while other requests\n // are inflight and indirectly error those as well.\n // Ensure this doesn't happen by waiting for inflight\n // to complete before dispatching.\n\n // Request with stream or iterator body cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return true\n }\n }\n\n return false\n }\n }\n}\n\nfunction onHttpSocketError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n const parser = this[kParser]\n\n // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded\n // to the user.\n if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so for as a valid response.\n parser.onMessageComplete()\n return\n }\n\n this[kError] = err\n\n this[kClient][kOnError](err)\n}\n\nfunction onHttpSocketReadable () {\n this[kParser]?.readMore()\n}\n\nfunction onHttpSocketEnd () {\n const parser = this[kParser]\n\n if (parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n return\n }\n\n util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onHttpSocketClose () {\n const parser = this[kParser]\n\n if (parser) {\n if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n }\n\n this[kParser].destroy()\n this[kParser] = null\n }\n\n const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n const client = this[kClient]\n\n client[kSocket] = null\n client[kHTTPContext] = null // TODO (fix): This is hacky...\n\n if (client.destroyed) {\n assert(client[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(client, request, err)\n }\n } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') {\n // Fail head of pipeline.\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n\n util.errorRequest(client, request, err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n\n client[kResume]()\n}\n\nfunction onSocketClose () {\n this[kClosed] = true\n}\n\n/**\n * @param {import('./client.js')} client\n */\nfunction resumeH1 (client) {\n const socket = client[kSocket]\n\n if (socket && !socket.destroyed) {\n if (client[kSize] === 0) {\n if (!socket[kNoRef] && socket.unref) {\n socket.unref()\n socket[kNoRef] = true\n }\n } else if (socket[kNoRef] && socket.ref) {\n socket.ref()\n socket[kNoRef] = false\n }\n\n if (client[kSize] === 0) {\n if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) {\n socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE)\n }\n } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {\n if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {\n const request = client[kQueue][client[kRunningIdx]]\n const headersTimeout = request.headersTimeout != null\n ? request.headersTimeout\n : client[kHeadersTimeout]\n socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS)\n }\n }\n }\n}\n\n// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2\nfunction shouldSendContentLength (method) {\n return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'\n}\n\n/**\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @returns\n */\nfunction writeH1 (client, request) {\n const { method, path, host, upgrade, blocking, reset } = request\n\n let { body, headers, contentLength } = request\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH' ||\n method === 'QUERY' ||\n method === 'PROPFIND' ||\n method === 'PROPPATCH'\n )\n\n if (util.isFormDataLike(body)) {\n if (!extractBody) {\n extractBody = require('../web/fetch/body.js').extractBody\n }\n\n const [bodyStream, contentType] = extractBody(body)\n if (request.contentType == null) {\n headers.push('content-type', contentType)\n }\n body = bodyStream.stream\n contentLength = bodyStream.length\n } else if (util.isBlobLike(body) && request.contentType == null && body.type) {\n headers.push('content-type', body.type)\n }\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n const bodyLength = util.bodyLength(body)\n\n contentLength = bodyLength ?? contentLength\n\n if (contentLength === null) {\n contentLength = request.contentLength\n }\n\n if (contentLength === 0 && !expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n\n contentLength = null\n }\n\n // https://github.com/nodejs/undici/issues/2046\n // A user agent may send a Content-Length header with 0 value, this should be allowed.\n if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n util.errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n const socket = client[kSocket]\n\n /**\n * @param {Error} [err]\n * @returns {void}\n */\n const abort = (err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n util.errorRequest(client, request, err || new RequestAbortedError())\n\n util.destroy(body)\n util.destroy(socket, new InformationalError('aborted'))\n }\n\n try {\n request.onRequestStart(abort, null)\n } catch (err) {\n util.errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n if (method === 'HEAD') {\n // https://github.com/mcollina/undici/issues/258\n // Close after a HEAD request to interop with misbehaving servers\n // that may send a body in the response.\n\n socket[kReset] = true\n }\n\n if (upgrade || method === 'CONNECT') {\n // On CONNECT or upgrade, block pipeline from dispatching further\n // requests on this connection.\n\n socket[kReset] = true\n }\n\n if (reset != null) {\n socket[kReset] = reset\n }\n\n if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) {\n socket[kReset] = true\n }\n\n if (blocking) {\n socket[kBlocking] = true\n }\n\n if (socket.setTypeOfService) {\n socket.setTypeOfService(request.typeOfService)\n }\n\n let header = `${method} ${path} HTTP/1.1\\r\\n`\n\n if (typeof host === 'string') {\n header += `host: ${host}\\r\\n`\n } else {\n header += client[kHostHeader]\n }\n\n if (upgrade) {\n header += `connection: upgrade\\r\\nupgrade: ${upgrade}\\r\\n`\n } else if (client[kPipelining] && !socket[kReset]) {\n header += 'connection: keep-alive\\r\\n'\n } else {\n header += 'connection: close\\r\\n'\n }\n\n if (Array.isArray(headers)) {\n for (let n = 0; n < headers.length; n += 2) {\n const key = headers[n + 0]\n const val = headers[n + 1]\n\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n header += `${key}: ${val[i]}\\r\\n`\n }\n } else {\n header += `${key}: ${val}\\r\\n`\n }\n }\n }\n\n if (channels.sendHeaders.hasSubscribers) {\n channels.sendHeaders.publish({ request, headers: header, socket })\n }\n\n if (!body || bodyLength === 0) {\n writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload)\n } else if (util.isBuffer(body)) {\n writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload)\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload)\n } else {\n writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload)\n }\n } else if (util.isStream(body)) {\n writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload)\n } else if (util.isIterable(body)) {\n writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload)\n } else {\n assert(false)\n }\n\n return true\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {import('stream').Stream} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n */\nfunction writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n let finished = false\n\n const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })\n\n /**\n * @param {Buffer} chunk\n * @returns {void}\n */\n const onData = function (chunk) {\n if (finished) {\n return\n }\n\n try {\n if (!writer.write(chunk) && this.pause) {\n this.pause()\n }\n } catch (err) {\n util.destroy(this, err)\n }\n }\n\n /**\n * @returns {void}\n */\n const onDrain = function () {\n if (finished) {\n return\n }\n\n if (body.resume) {\n body.resume()\n }\n }\n\n /**\n * @returns {void}\n */\n const onClose = function () {\n // 'close' might be emitted *before* 'error' for\n // broken streams. Wait a tick to avoid this case.\n queueMicrotask(() => {\n // It's only safe to remove 'error' listener after\n // 'close'.\n body.removeListener('error', onFinished)\n })\n\n if (!finished) {\n const err = new RequestAbortedError()\n queueMicrotask(() => onFinished(err))\n }\n }\n\n /**\n * @param {Error} [err]\n * @returns\n */\n const onFinished = function (err) {\n if (finished) {\n return\n }\n\n finished = true\n\n assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1))\n\n socket\n .off('drain', onDrain)\n .off('error', onFinished)\n\n body\n .removeListener('data', onData)\n .removeListener('end', onFinished)\n .removeListener('close', onClose)\n\n if (!err) {\n try {\n writer.end()\n } catch (er) {\n err = er\n }\n }\n\n writer.destroy(err)\n\n if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) {\n util.destroy(body, err)\n } else {\n util.destroy(body)\n }\n }\n\n body\n .on('data', onData)\n .on('end', onFinished)\n .on('error', onFinished)\n .on('close', onClose)\n\n if (body.resume) {\n body.resume()\n }\n\n socket\n .on('drain', onDrain)\n .on('error', onFinished)\n\n if (body.errorEmitted ?? body.errored) {\n setImmediate(onFinished, body.errored)\n } else if (body.endEmitted ?? body.readableEnded) {\n setImmediate(onFinished, null)\n }\n\n if (body.closeEmitted ?? body.closed) {\n setImmediate(onClose)\n }\n}\n\n/**\n * @typedef AbortCallback\n * @type {Function}\n * @param {Error} [err]\n * @returns {void}\n */\n\n/**\n * @param {AbortCallback} abort\n * @param {Uint8Array|null} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {void}\n */\nfunction writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n try {\n if (!body) {\n if (contentLength === 0) {\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n assert(contentLength === null, 'no body must not have content length')\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n } else if (util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(body)\n socket.uncork()\n request.onBodySent(body)\n\n if (!expectsPayload && request.reset !== false) {\n socket[kReset] = true\n }\n }\n request.onRequestSent()\n\n client[kResume]()\n } catch (err) {\n abort(err)\n }\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {Blob} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {Promise}\n */\nasync function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n assert(contentLength === body.size, 'blob body must have content length')\n\n try {\n if (contentLength != null && contentLength !== body.size) {\n throw new RequestContentLengthMismatchError()\n }\n\n const buffer = Buffer.from(await body.arrayBuffer())\n\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(buffer)\n socket.uncork()\n\n request.onBodySent(buffer)\n request.onRequestSent()\n\n if (!expectsPayload && request.reset !== false) {\n socket[kReset] = true\n }\n\n client[kResume]()\n } catch (err) {\n abort(err)\n }\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {Iterable} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {Promise}\n */\nasync function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n let callback = null\n function onDrain () {\n if (callback) {\n const cb = callback\n callback = null\n cb()\n }\n }\n\n const waitForDrain = () => new Promise((resolve, reject) => {\n assert(callback === null)\n\n if (socket[kError]) {\n reject(socket[kError])\n } else {\n callback = resolve\n }\n })\n\n socket\n .on('close', onDrain)\n .on('drain', onDrain)\n\n const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (!writer.write(chunk)) {\n await waitForDrain()\n }\n }\n\n writer.end()\n } catch (err) {\n writer.destroy(err)\n } finally {\n socket\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n}\n\nclass AsyncWriter {\n /**\n *\n * @param {object} arg\n * @param {AbortCallback} arg.abort\n * @param {import('net').Socket} arg.socket\n * @param {import('../core/request.js')} arg.request\n * @param {number} arg.contentLength\n * @param {import('./client.js')} arg.client\n * @param {boolean} arg.expectsPayload\n * @param {string} arg.header\n */\n constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) {\n this.socket = socket\n this.request = request\n this.contentLength = contentLength\n this.client = client\n this.bytesWritten = 0\n this.expectsPayload = expectsPayload\n this.header = header\n this.abort = abort\n\n socket[kWriting] = true\n }\n\n /**\n * @param {Buffer} chunk\n * @returns\n */\n write (chunk) {\n const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return false\n }\n\n const len = Buffer.byteLength(chunk)\n if (!len) {\n return true\n }\n\n // We should defer writing chunks.\n if (contentLength !== null && bytesWritten + len > contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n socket.cork()\n\n if (bytesWritten === 0) {\n if (!expectsPayload && request.reset !== false) {\n socket[kReset] = true\n }\n\n if (contentLength === null) {\n socket.write(`${header}transfer-encoding: chunked\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n }\n }\n\n if (contentLength === null) {\n socket.write(`\\r\\n${len.toString(16)}\\r\\n`, 'latin1')\n }\n\n this.bytesWritten += len\n\n const ret = socket.write(chunk)\n\n socket.uncork()\n\n request.onBodySent(chunk)\n\n if (!ret) {\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n }\n\n return ret\n }\n\n /**\n * @returns {void}\n */\n end () {\n const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this\n request.onRequestSent()\n\n socket[kWriting] = false\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return\n }\n\n if (bytesWritten === 0) {\n if (expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body.\n\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n } else if (contentLength === null) {\n socket.write('\\r\\n0\\r\\n\\r\\n', 'latin1')\n }\n\n if (contentLength !== null && bytesWritten !== contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n } else {\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n }\n\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n\n client[kResume]()\n }\n\n /**\n * @param {Error} [err]\n * @returns {void}\n */\n destroy (err) {\n const { socket, client, abort } = this\n\n socket[kWriting] = false\n\n if (err) {\n assert(client[kRunning] <= 1, 'pipeline should only contain this request')\n abort(err)\n }\n }\n}\n\nmodule.exports = connectH1\n","'use strict'\n\nconst assert = require('node:assert')\nconst { pipeline } = require('node:stream')\nconst util = require('../core/util.js')\nconst {\n RequestContentLengthMismatchError,\n RequestAbortedError,\n SocketError,\n InformationalError,\n InvalidArgumentError\n} = require('../core/errors.js')\nconst {\n kUrl,\n kReset,\n kClient,\n kRunning,\n kPending,\n kQueue,\n kPendingIdx,\n kRunningIdx,\n kError,\n kSocket,\n kStrictContentLength,\n kOnError,\n kMaxConcurrentStreams,\n kPingInterval,\n kHTTP2Session,\n kHTTP2InitialWindowSize,\n kHTTP2ConnectionWindowSize,\n kResume,\n kSize,\n kHTTPContext,\n kClosed,\n kBodyTimeout,\n kEnableConnectProtocol,\n kRemoteSettings,\n kHTTP2Stream,\n kHTTP2SessionState\n} = require('../core/symbols.js')\nconst { channels } = require('../core/diagnostics.js')\n\nconst kOpenStreams = Symbol('open streams')\n\nlet extractBody\n\n/** @type {import('http2')} */\nlet http2\ntry {\n http2 = require('node:http2')\n} catch {\n // @ts-ignore\n http2 = { constants: {} }\n}\n\nconst {\n constants: {\n HTTP2_HEADER_AUTHORITY,\n HTTP2_HEADER_METHOD,\n HTTP2_HEADER_PATH,\n HTTP2_HEADER_SCHEME,\n HTTP2_HEADER_CONTENT_LENGTH,\n HTTP2_HEADER_EXPECT,\n HTTP2_HEADER_STATUS,\n HTTP2_HEADER_PROTOCOL,\n NGHTTP2_REFUSED_STREAM,\n NGHTTP2_CANCEL\n }\n} = http2\n\nfunction parseH2Headers (headers) {\n const result = []\n\n for (const [name, value] of Object.entries(headers)) {\n // h2 may concat the header value by array\n // e.g. Set-Cookie\n if (Array.isArray(value)) {\n for (const subvalue of value) {\n // we need to provide each header value of header name\n // because the headers handler expect name-value pair\n result.push(Buffer.from(name), Buffer.from(subvalue))\n }\n } else {\n result.push(Buffer.from(name), Buffer.from(value))\n }\n }\n\n return result\n}\n\nfunction connectH2 (client, socket) {\n client[kSocket] = socket\n\n const http2InitialWindowSize = client[kHTTP2InitialWindowSize]\n const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize]\n\n const session = http2.connect(client[kUrl], {\n createConnection: () => socket,\n peerMaxConcurrentStreams: client[kMaxConcurrentStreams],\n settings: {\n // TODO(metcoder95): add support for PUSH\n enablePush: false,\n ...(http2InitialWindowSize != null ? { initialWindowSize: http2InitialWindowSize } : null)\n }\n })\n\n client[kSocket] = socket\n session[kOpenStreams] = 0\n session[kClient] = client\n session[kSocket] = socket\n session[kHTTP2SessionState] = {\n ping: {\n interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref()\n }\n }\n // We set it to true by default in a best-effort; however once connected to an H2 server\n // we will check if extended CONNECT protocol is supported or not\n // and set this value accordingly.\n session[kEnableConnectProtocol] = false\n // States whether or not we have received the remote settings from the server\n session[kRemoteSettings] = false\n\n // Apply connection-level flow control once connected (if supported).\n if (http2ConnectionWindowSize) {\n util.addListener(session, 'connect', applyConnectionWindowSize.bind(session, http2ConnectionWindowSize))\n }\n\n util.addListener(session, 'error', onHttp2SessionError)\n util.addListener(session, 'frameError', onHttp2FrameError)\n util.addListener(session, 'end', onHttp2SessionEnd)\n util.addListener(session, 'goaway', onHttp2SessionGoAway)\n util.addListener(session, 'close', onHttp2SessionClose)\n util.addListener(session, 'remoteSettings', onHttp2RemoteSettings)\n // TODO (@metcoder95): implement SETTINGS support\n // util.addListener(session, 'localSettings', onHttp2RemoteSettings)\n\n session.unref()\n\n client[kHTTP2Session] = session\n socket[kHTTP2Session] = session\n\n util.addListener(socket, 'error', onHttp2SocketError)\n util.addListener(socket, 'end', onHttp2SocketEnd)\n util.addListener(socket, 'close', onHttp2SocketClose)\n\n socket[kClosed] = false\n socket.on('close', onSocketClose)\n\n return {\n version: 'h2',\n defaultPipelining: Infinity,\n /**\n * @param {import('../core/request.js')} request\n * @returns {boolean}\n */\n write (request) {\n return writeH2(client, request)\n },\n /**\n * @returns {void}\n */\n resume () {\n resumeH2(client)\n },\n /**\n * @param {Error | null} err\n * @param {() => void} callback\n */\n destroy (err, callback) {\n if (socket[kClosed]) {\n queueMicrotask(callback)\n } else {\n socket.destroy(err).on('close', callback)\n }\n },\n /**\n * @type {boolean}\n */\n get destroyed () {\n return socket.destroyed\n },\n /**\n * @param {import('../core/request.js')} request\n * @returns {boolean}\n */\n busy (request) {\n if (request != null) {\n if (client[kRunning] > 0) {\n // We are already processing requests\n\n // Non-idempotent request cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n if (request.idempotent === false) return true\n // Don't dispatch an upgrade until all preceding requests have completed.\n // Possibly, we do not have remote settings confirmed yet.\n if ((request.upgrade === 'websocket' || request.method === 'CONNECT') && session[kRemoteSettings] === false) return true\n // Request with stream or iterator body can error while other requests\n // are inflight and indirectly error those as well.\n // Ensure this doesn't happen by waiting for inflight\n // to complete before dispatching.\n\n // Request with stream or iterator body cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n if (util.bodyLength(request.body) !== 0 &&\n (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) return true\n } else {\n return (request.upgrade === 'websocket' || request.method === 'CONNECT') && session[kRemoteSettings] === false\n }\n }\n\n return false\n }\n }\n}\n\nfunction resumeH2 (client) {\n const socket = client[kSocket]\n\n if (socket?.destroyed === false) {\n if (client[kSize] === 0 || client[kMaxConcurrentStreams] === 0) {\n socket.unref()\n client[kHTTP2Session].unref()\n } else {\n socket.ref()\n client[kHTTP2Session].ref()\n }\n }\n}\n\nfunction applyConnectionWindowSize (connectionWindowSize) {\n try {\n if (typeof this.setLocalWindowSize === 'function') {\n this.setLocalWindowSize(connectionWindowSize)\n }\n } catch {\n // Best-effort only.\n }\n}\n\nfunction onHttp2RemoteSettings (settings) {\n // Fallbacks are a safe bet, remote setting will always override\n this[kClient][kMaxConcurrentStreams] = settings.maxConcurrentStreams ?? this[kClient][kMaxConcurrentStreams]\n /**\n * From RFC-8441\n * A sender MUST NOT send a SETTINGS_ENABLE_CONNECT_PROTOCOL parameter\n * with the value of 0 after previously sending a value of 1.\n */\n // Note: Cannot be tested in Node, it does not supports disabling the extended CONNECT protocol once enabled\n if (this[kRemoteSettings] === true && this[kEnableConnectProtocol] === true && settings.enableConnectProtocol === false) {\n const err = new InformationalError('HTTP/2: Server disabled extended CONNECT protocol against RFC-8441')\n this[kSocket][kError] = err\n this[kClient][kOnError](err)\n return\n }\n\n this[kEnableConnectProtocol] = settings.enableConnectProtocol ?? this[kEnableConnectProtocol]\n this[kRemoteSettings] = true\n this[kClient][kResume]()\n}\n\nfunction onHttp2SendPing (session) {\n const state = session[kHTTP2SessionState]\n if ((session.closed || session.destroyed) && state.ping.interval != null) {\n clearInterval(state.ping.interval)\n state.ping.interval = null\n return\n }\n\n // If no ping sent, do nothing\n session.ping(onPing.bind(session))\n\n function onPing (err, duration) {\n const client = this[kClient]\n const socket = this[kClient]\n\n if (err != null) {\n const error = new InformationalError(`HTTP/2: \"PING\" errored - type ${err.message}`)\n socket[kError] = error\n client[kOnError](error)\n } else {\n client.emit('ping', duration)\n }\n }\n}\n\nfunction onHttp2SessionError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n this[kSocket][kError] = err\n this[kClient][kOnError](err)\n}\n\nfunction onHttp2FrameError (type, code, id) {\n if (id === 0) {\n const err = new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`)\n this[kSocket][kError] = err\n this[kClient][kOnError](err)\n }\n}\n\nfunction onHttp2SessionEnd () {\n const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket]))\n this.destroy(err)\n util.destroy(this[kSocket], err)\n}\n\n/**\n * This is the root cause of #3011\n * We need to handle GOAWAY frames properly, and trigger the session close\n * along with the socket right away\n *\n * @this {import('http2').ClientHttp2Session}\n * @param {number} errorCode\n */\nfunction onHttp2SessionGoAway (errorCode) {\n // TODO(mcollina): Verify if GOAWAY implements the spec correctly:\n // https://datatracker.ietf.org/doc/html/rfc7540#section-6.8\n // Specifically, we do not verify the \"valid\" stream id.\n\n const err = this[kError] || new SocketError(`HTTP/2: \"GOAWAY\" frame received with code ${errorCode}`, util.getSocketInfo(this[kSocket]))\n const client = this[kClient]\n\n client[kSocket] = null\n client[kHTTPContext] = null\n\n // this is an HTTP2 session\n this.close()\n this[kHTTP2Session] = null\n\n util.destroy(this[kSocket], err)\n\n // Fail head of pipeline.\n if (client[kRunningIdx] < client[kQueue].length) {\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n util.errorRequest(client, request, err)\n client[kPendingIdx] = client[kRunningIdx]\n }\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n client.emit('connectionError', client[kUrl], [client], err)\n\n client[kResume]()\n}\n\nfunction onHttp2SessionClose () {\n const { [kClient]: client, [kHTTP2SessionState]: state } = this\n const { [kSocket]: socket } = client\n\n const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket))\n\n client[kSocket] = null\n client[kHTTPContext] = null\n\n if (state.ping.interval != null) {\n clearInterval(state.ping.interval)\n state.ping.interval = null\n }\n\n if (client.destroyed) {\n assert(client[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(client, request, err)\n }\n }\n}\n\nfunction onHttp2SocketClose () {\n const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n const client = this[kHTTP2Session][kClient]\n\n client[kSocket] = null\n client[kHTTPContext] = null\n\n if (this[kHTTP2Session] !== null) {\n this[kHTTP2Session].destroy(err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n\n client[kResume]()\n}\n\nfunction onHttp2SocketError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n this[kError] = err\n\n this[kClient][kOnError](err)\n}\n\nfunction onHttp2SocketEnd () {\n util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onSocketClose () {\n this[kClosed] = true\n}\n\n// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2\nfunction shouldSendContentLength (method) {\n return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'\n}\n\nfunction writeH2 (client, request) {\n const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]\n const session = client[kHTTP2Session]\n const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request\n let { body } = request\n\n if (upgrade != null && upgrade !== 'websocket') {\n util.errorRequest(client, request, new InvalidArgumentError(`Custom upgrade \"${upgrade}\" not supported over HTTP/2`))\n return false\n }\n\n const headers = {}\n for (let n = 0; n < reqHeaders.length; n += 2) {\n const key = reqHeaders[n + 0]\n const val = reqHeaders[n + 1]\n\n if (key === 'cookie') {\n if (headers[key] != null) {\n headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val]\n } else {\n headers[key] = val\n }\n\n continue\n }\n\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n if (headers[key]) {\n headers[key] += `, ${val[i]}`\n } else {\n headers[key] = val[i]\n }\n }\n } else if (headers[key]) {\n headers[key] += `, ${val}`\n } else {\n headers[key] = val\n }\n }\n\n /** @type {import('node:http2').ClientHttp2Stream} */\n let stream = null\n\n const { hostname, port } = client[kUrl]\n\n headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}`\n headers[HTTP2_HEADER_METHOD] = method\n\n const abort = (err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n err = err || new RequestAbortedError()\n\n util.errorRequest(client, request, err)\n\n if (stream != null) {\n // Some chunks might still come after abort,\n // let's ignore them\n stream.removeAllListeners('data')\n\n // On Abort, we close the stream to send RST_STREAM frame\n stream.close()\n\n // We move the running index to the next request\n client[kOnError](err)\n client[kResume]()\n }\n\n // We do not destroy the socket as we can continue using the session\n // the stream gets destroyed and the session remains to create new streams\n util.destroy(body, err)\n }\n\n try {\n // We are already connected, streams are pending.\n // We can call on connect, and wait for abort\n request.onRequestStart(abort, null)\n } catch (err) {\n util.errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n if (upgrade || method === 'CONNECT') {\n session.ref()\n\n if (upgrade === 'websocket') {\n // We cannot upgrade to websocket if extended CONNECT protocol is not supported\n if (session[kEnableConnectProtocol] === false) {\n util.errorRequest(client, request, new InformationalError('HTTP/2: Extended CONNECT protocol not supported by server'))\n session.unref()\n return false\n }\n\n // We force the method to CONNECT\n // as per RFC-8441\n // https://datatracker.ietf.org/doc/html/rfc8441#section-4\n headers[HTTP2_HEADER_METHOD] = 'CONNECT'\n headers[HTTP2_HEADER_PROTOCOL] = 'websocket'\n // :path and :scheme headers must be omitted when sending CONNECT but set if extended-CONNECT\n headers[HTTP2_HEADER_PATH] = path\n\n if (protocol === 'ws:' || protocol === 'wss:') {\n headers[HTTP2_HEADER_SCHEME] = protocol === 'ws:' ? 'http' : 'https'\n } else {\n headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'\n }\n\n stream = session.request(headers, { endStream: false, signal })\n stream[kHTTP2Stream] = true\n\n stream.once('response', (headers, _flags) => {\n const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n\n request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream)\n\n ++session[kOpenStreams]\n client[kQueue][client[kRunningIdx]++] = null\n })\n\n stream.on('error', () => {\n if (stream.rstCode === NGHTTP2_REFUSED_STREAM || stream.rstCode === NGHTTP2_CANCEL) {\n // NGHTTP2_REFUSED_STREAM (7) or NGHTTP2_CANCEL (8)\n // We do not treat those as errors as the server might\n // not support websockets and refuse the stream\n abort(new InformationalError(`HTTP/2: \"stream error\" received - code ${stream.rstCode}`))\n }\n })\n\n stream.once('close', () => {\n session[kOpenStreams] -= 1\n if (session[kOpenStreams] === 0) session.unref()\n })\n\n stream.setTimeout(requestTimeout)\n return true\n }\n\n // TODO: consolidate once we support CONNECT properly\n // NOTE: We are already connected, streams are pending, first request\n // will create a new stream. We trigger a request to create the stream and wait until\n // `ready` event is triggered\n // We disabled endStream to allow the user to write to the stream\n stream = session.request(headers, { endStream: false, signal })\n stream[kHTTP2Stream] = true\n stream.on('response', headers => {\n const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n\n request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream)\n ++session[kOpenStreams]\n client[kQueue][client[kRunningIdx]++] = null\n })\n stream.once('close', () => {\n session[kOpenStreams] -= 1\n if (session[kOpenStreams] === 0) session.unref()\n })\n stream.setTimeout(requestTimeout)\n\n return true\n }\n\n // https://tools.ietf.org/html/rfc7540#section-8.3\n // :path and :scheme headers must be omitted when sending CONNECT\n headers[HTTP2_HEADER_PATH] = path\n headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH'\n )\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n let contentLength = util.bodyLength(body)\n\n if (util.isFormDataLike(body)) {\n extractBody ??= require('../web/fetch/body.js').extractBody\n\n const [bodyStream, contentType] = extractBody(body)\n headers['content-type'] = contentType\n\n body = bodyStream.stream\n contentLength = bodyStream.length\n }\n\n if (contentLength == null) {\n contentLength = request.contentLength\n }\n\n if (!expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n // And for methods that don't expect a payload, omit Content-Length.\n contentLength = null\n }\n\n // https://github.com/nodejs/undici/issues/2046\n // A user agent may send a Content-Length header with 0 value, this should be allowed.\n if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n util.errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n if (contentLength != null) {\n assert(body || contentLength === 0, 'no body must not have content length')\n headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`\n }\n\n session.ref()\n\n if (channels.sendHeaders.hasSubscribers) {\n let header = ''\n for (const key in headers) {\n header += `${key}: ${headers[key]}\\r\\n`\n }\n channels.sendHeaders.publish({ request, headers: header, socket: session[kSocket] })\n }\n\n // TODO(metcoder95): add support for sending trailers\n const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null\n if (expectContinue) {\n headers[HTTP2_HEADER_EXPECT] = '100-continue'\n stream = session.request(headers, { endStream: shouldEndStream, signal })\n stream[kHTTP2Stream] = true\n\n stream.once('continue', writeBodyH2)\n } else {\n stream = session.request(headers, {\n endStream: shouldEndStream,\n signal\n })\n stream[kHTTP2Stream] = true\n\n writeBodyH2()\n }\n\n // Increment counter as we have new streams open\n ++session[kOpenStreams]\n stream.setTimeout(requestTimeout)\n\n // Track whether we received a response (headers)\n let responseReceived = false\n\n stream.once('response', headers => {\n const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n request.onResponseStarted()\n responseReceived = true\n\n // Due to the stream nature, it is possible we face a race condition\n // where the stream has been assigned, but the request has been aborted\n // the request remains in-flight and headers hasn't been received yet\n // for those scenarios, best effort is to destroy the stream immediately\n // as there's no value to keep it open.\n if (request.aborted) {\n stream.removeAllListeners('data')\n return\n }\n\n if (request.onResponseStart(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) {\n stream.pause()\n }\n\n stream.on('data', (chunk) => {\n if (request.aborted || request.completed) {\n return\n }\n\n if (request.onResponseData(chunk) === false) {\n stream.pause()\n }\n })\n })\n\n stream.once('end', () => {\n stream.removeAllListeners('data')\n // If we received a response, this is a normal completion\n if (responseReceived) {\n if (!request.aborted && !request.completed) {\n request.onResponseEnd({})\n }\n\n client[kQueue][client[kRunningIdx]++] = null\n client[kResume]()\n } else {\n // Stream ended without receiving a response - this is an error\n // (e.g., server destroyed the stream before sending headers)\n abort(new InformationalError('HTTP/2: stream half-closed (remote)'))\n client[kQueue][client[kRunningIdx]++] = null\n client[kPendingIdx] = client[kRunningIdx]\n client[kResume]()\n }\n })\n\n stream.once('close', () => {\n stream.removeAllListeners('data')\n session[kOpenStreams] -= 1\n if (session[kOpenStreams] === 0) {\n session.unref()\n }\n })\n\n stream.once('error', function (err) {\n stream.removeAllListeners('data')\n abort(err)\n })\n\n stream.once('frameError', (type, code) => {\n stream.removeAllListeners('data')\n abort(new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`))\n })\n\n stream.on('aborted', () => {\n stream.removeAllListeners('data')\n })\n\n stream.on('timeout', () => {\n const err = new InformationalError(`HTTP/2: \"stream timeout after ${requestTimeout}\"`)\n stream.removeAllListeners('data')\n session[kOpenStreams] -= 1\n\n if (session[kOpenStreams] === 0) {\n session.unref()\n }\n\n abort(err)\n })\n\n stream.once('trailers', trailers => {\n if (request.aborted || request.completed) {\n return\n }\n\n request.onResponseEnd(trailers)\n })\n\n return true\n\n function writeBodyH2 () {\n if (!body || contentLength === 0) {\n writeBuffer(\n abort,\n stream,\n null,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else if (util.isBuffer(body)) {\n writeBuffer(\n abort,\n stream,\n body,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable(\n abort,\n stream,\n body.stream(),\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else {\n writeBlob(\n abort,\n stream,\n body,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n }\n } else if (util.isStream(body)) {\n writeStream(\n abort,\n client[kSocket],\n expectsPayload,\n stream,\n body,\n client,\n request,\n contentLength\n )\n } else if (util.isIterable(body)) {\n writeIterable(\n abort,\n stream,\n body,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else {\n assert(false)\n }\n }\n}\n\nfunction writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n try {\n if (body != null && util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n h2stream.cork()\n h2stream.write(body)\n h2stream.uncork()\n h2stream.end()\n\n request.onBodySent(body)\n }\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n request.onRequestSent()\n client[kResume]()\n } catch (error) {\n abort(error)\n }\n}\n\nfunction writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n // For HTTP/2, is enough to pipe the stream\n const pipe = pipeline(\n body,\n h2stream,\n (err) => {\n if (err) {\n util.destroy(pipe, err)\n abort(err)\n } else {\n util.removeAllListeners(pipe)\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n client[kResume]()\n }\n }\n )\n\n util.addListener(pipe, 'data', onPipeData)\n\n function onPipeData (chunk) {\n request.onBodySent(chunk)\n }\n}\n\nasync function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n assert(contentLength === body.size, 'blob body must have content length')\n\n try {\n if (contentLength != null && contentLength !== body.size) {\n throw new RequestContentLengthMismatchError()\n }\n\n const buffer = Buffer.from(await body.arrayBuffer())\n\n h2stream.cork()\n h2stream.write(buffer)\n h2stream.uncork()\n h2stream.end()\n\n request.onBodySent(buffer)\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n client[kResume]()\n } catch (err) {\n abort(err)\n }\n}\n\nasync function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n let callback = null\n function onDrain () {\n if (callback) {\n const cb = callback\n callback = null\n cb()\n }\n }\n\n const waitForDrain = () => new Promise((resolve, reject) => {\n assert(callback === null)\n\n if (socket[kError]) {\n reject(socket[kError])\n } else {\n callback = resolve\n }\n })\n\n h2stream\n .on('close', onDrain)\n .on('drain', onDrain)\n\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n const res = h2stream.write(chunk)\n request.onBodySent(chunk)\n if (!res) {\n await waitForDrain()\n }\n }\n\n h2stream.end()\n\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n client[kResume]()\n } catch (err) {\n abort(err)\n } finally {\n h2stream\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n}\n\nmodule.exports = connectH2\n","'use strict'\n\nconst assert = require('node:assert')\nconst net = require('node:net')\nconst http = require('node:http')\nconst util = require('../core/util.js')\nconst { ClientStats } = require('../util/stats.js')\nconst { channels } = require('../core/diagnostics.js')\nconst Request = require('../core/request.js')\nconst DispatcherBase = require('./dispatcher-base')\nconst {\n InvalidArgumentError,\n InformationalError,\n ClientDestroyedError\n} = require('../core/errors.js')\nconst buildConnector = require('../core/connect.js')\nconst {\n kUrl,\n kServerName,\n kClient,\n kBusy,\n kConnect,\n kResuming,\n kRunning,\n kPending,\n kSize,\n kQueue,\n kConnected,\n kConnecting,\n kNeedDrain,\n kKeepAliveDefaultTimeout,\n kHostHeader,\n kPendingIdx,\n kRunningIdx,\n kError,\n kPipelining,\n kKeepAliveTimeoutValue,\n kMaxHeadersSize,\n kKeepAliveMaxTimeout,\n kKeepAliveTimeoutThreshold,\n kHeadersTimeout,\n kBodyTimeout,\n kStrictContentLength,\n kConnector,\n kMaxRequests,\n kCounter,\n kClose,\n kDestroy,\n kDispatch,\n kLocalAddress,\n kMaxResponseSize,\n kOnError,\n kHTTPContext,\n kMaxConcurrentStreams,\n kHTTP2InitialWindowSize,\n kHTTP2ConnectionWindowSize,\n kResume,\n kPingInterval\n} = require('../core/symbols.js')\nconst connectH1 = require('./client-h1.js')\nconst connectH2 = require('./client-h2.js')\n\nconst kClosedResolve = Symbol('kClosedResolve')\n\nconst getDefaultNodeMaxHeaderSize = http &&\n http.maxHeaderSize &&\n Number.isInteger(http.maxHeaderSize) &&\n http.maxHeaderSize > 0\n ? () => http.maxHeaderSize\n : () => { throw new InvalidArgumentError('http module not available or http.maxHeaderSize invalid') }\n\nconst noop = () => { }\n\nfunction getPipelining (client) {\n return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1\n}\n\n/**\n * @type {import('../../types/client.js').default}\n */\nclass Client extends DispatcherBase {\n /**\n *\n * @param {string|URL} url\n * @param {import('../../types/client.js').Client.Options} options\n */\n constructor (url, {\n maxHeaderSize,\n headersTimeout,\n socketTimeout,\n requestTimeout,\n connectTimeout,\n bodyTimeout,\n idleTimeout,\n keepAlive,\n keepAliveTimeout,\n maxKeepAliveTimeout,\n keepAliveMaxTimeout,\n keepAliveTimeoutThreshold,\n socketPath,\n pipelining,\n tls,\n strictContentLength,\n maxCachedSessions,\n connect,\n maxRequestsPerClient,\n localAddress,\n maxResponseSize,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n // h2\n maxConcurrentStreams,\n allowH2,\n useH2c,\n initialWindowSize,\n connectionWindowSize,\n pingInterval,\n webSocket\n } = {}) {\n if (keepAlive !== undefined) {\n throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')\n }\n\n if (socketTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (requestTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (idleTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead')\n }\n\n if (maxKeepAliveTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead')\n }\n\n if (maxHeaderSize != null) {\n if (!Number.isInteger(maxHeaderSize) || maxHeaderSize < 1) {\n throw new InvalidArgumentError('invalid maxHeaderSize')\n }\n } else {\n // If maxHeaderSize is not provided, use the default value from the http module\n // or if that is not available, throw an error.\n maxHeaderSize = getDefaultNodeMaxHeaderSize()\n }\n\n if (socketPath != null && typeof socketPath !== 'string') {\n throw new InvalidArgumentError('invalid socketPath')\n }\n\n if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {\n throw new InvalidArgumentError('invalid connectTimeout')\n }\n\n if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveTimeout')\n }\n\n if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveMaxTimeout')\n }\n\n if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) {\n throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold')\n }\n\n if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('headersTimeout must be a positive integer or zero')\n }\n\n if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {\n throw new InvalidArgumentError('maxRequestsPerClient must be a positive number')\n }\n\n if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) {\n throw new InvalidArgumentError('localAddress must be valid string IP address')\n }\n\n if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {\n throw new InvalidArgumentError('maxResponseSize must be a positive number')\n }\n\n if (\n autoSelectFamilyAttemptTimeout != null &&\n (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)\n ) {\n throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number')\n }\n\n // h2\n if (allowH2 != null && typeof allowH2 !== 'boolean') {\n throw new InvalidArgumentError('allowH2 must be a valid boolean value')\n }\n\n if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {\n throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0')\n }\n\n if (useH2c != null && typeof useH2c !== 'boolean') {\n throw new InvalidArgumentError('useH2c must be a valid boolean value')\n }\n\n if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {\n throw new InvalidArgumentError('initialWindowSize must be a positive integer, greater than 0')\n }\n\n if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {\n throw new InvalidArgumentError('connectionWindowSize must be a positive integer, greater than 0')\n }\n\n if (pingInterval != null && (typeof pingInterval !== 'number' || !Number.isInteger(pingInterval) || pingInterval < 0)) {\n throw new InvalidArgumentError('pingInterval must be a positive integer, greater or equal to 0')\n }\n\n super({ webSocket })\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n useH2c,\n socketPath,\n timeout: connectTimeout,\n ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n } else {\n const customConnect = connect\n connect = (opts, callback) => customConnect({\n ...opts,\n ...(socketPath != null ? { socketPath } : null),\n ...(allowH2 != null ? { allowH2 } : null)\n }, callback)\n }\n\n this[kUrl] = util.parseOrigin(url)\n this[kConnector] = connect\n this[kPipelining] = pipelining != null ? pipelining : 1\n this[kMaxHeadersSize] = maxHeaderSize\n this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout\n this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout\n this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold\n this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]\n this[kServerName] = null\n this[kLocalAddress] = localAddress != null ? localAddress : null\n this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\\r\\n`\n this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3\n this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3\n this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength\n this[kMaxRequests] = maxRequestsPerClient\n this[kClosedResolve] = null\n this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1\n this[kHTTPContext] = null\n // h2\n this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server\n // HTTP/2 window sizes are set to higher defaults than Node.js core for better performance:\n // - initialWindowSize: 262144 (256KB) vs Node.js default 65535 (64KB - 1)\n // Allows more data to be sent before requiring acknowledgment, improving throughput\n // especially on high-latency networks. This matches common production HTTP/2 servers.\n // - connectionWindowSize: 524288 (512KB) vs Node.js default (none set)\n // Provides better flow control for the entire connection across multiple streams.\n this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144\n this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288\n this[kPingInterval] = pingInterval != null ? pingInterval : 60e3 // Default ping interval for h2 - 1 minute\n\n // kQueue is built up of 3 sections separated by\n // the kRunningIdx and kPendingIdx indices.\n // | complete | running | pending |\n // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length\n // kRunningIdx points to the first running element.\n // kPendingIdx points to the first pending element.\n // This implements a fast queue with an amortized\n // time of O(1).\n\n this[kQueue] = []\n this[kRunningIdx] = 0\n this[kPendingIdx] = 0\n\n this[kResume] = (sync) => resume(this, sync)\n this[kOnError] = (err) => onError(this, err)\n }\n\n get pipelining () {\n return this[kPipelining]\n }\n\n set pipelining (value) {\n this[kPipelining] = value\n this[kResume](true)\n }\n\n get stats () {\n return new ClientStats(this)\n }\n\n get [kPending] () {\n return this[kQueue].length - this[kPendingIdx]\n }\n\n get [kRunning] () {\n return this[kPendingIdx] - this[kRunningIdx]\n }\n\n get [kSize] () {\n return this[kQueue].length - this[kRunningIdx]\n }\n\n get [kConnected] () {\n return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed\n }\n\n get [kBusy] () {\n return Boolean(\n this[kHTTPContext]?.busy(null) ||\n (this[kSize] >= (getPipelining(this) || 1)) ||\n this[kPending] > 0\n )\n }\n\n [kConnect] (cb) {\n connect(this)\n this.once('connect', cb)\n }\n\n [kDispatch] (opts, handler) {\n const request = new Request(this[kUrl].origin, opts, handler)\n\n this[kQueue].push(request)\n if (this[kResuming]) {\n // Do nothing.\n } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {\n // Wait a tick in case stream/iterator is ended in the same tick.\n this[kResuming] = 1\n queueMicrotask(() => resume(this))\n } else {\n this[kResume](true)\n }\n\n if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {\n this[kNeedDrain] = 2\n }\n\n return this[kNeedDrain] < 2\n }\n\n [kClose] () {\n // TODO: for H2 we need to gracefully flush the remaining enqueued\n // request and close each stream.\n return new Promise((resolve) => {\n if (this[kSize]) {\n this[kClosedResolve] = resolve\n } else {\n resolve(null)\n }\n })\n }\n\n [kDestroy] (err) {\n return new Promise((resolve) => {\n const requests = this[kQueue].splice(this[kPendingIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(this, request, err)\n }\n\n const callback = () => {\n if (this[kClosedResolve]) {\n // TODO (fix): Should we error here with ClientDestroyedError?\n this[kClosedResolve]()\n this[kClosedResolve] = null\n }\n resolve(null)\n }\n\n if (this[kHTTPContext]) {\n this[kHTTPContext].destroy(err, callback)\n this[kHTTPContext] = null\n } else {\n queueMicrotask(callback)\n }\n\n this[kResume]()\n })\n }\n}\n\nfunction onError (client, err) {\n if (\n client[kRunning] === 0 &&\n err.code !== 'UND_ERR_INFO' &&\n err.code !== 'UND_ERR_SOCKET'\n ) {\n // Error is not caused by running request and not a recoverable\n // socket error.\n\n assert(client[kPendingIdx] === client[kRunningIdx])\n\n const requests = client[kQueue].splice(client[kRunningIdx])\n\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(client, request, err)\n }\n assert(client[kSize] === 0)\n }\n}\n\n/**\n * @param {Client} client\n * @returns {void}\n */\nfunction connect (client) {\n assert(!client[kConnecting])\n assert(!client[kHTTPContext])\n\n let { host, hostname, protocol, port } = client[kUrl]\n\n // Resolve ipv6\n if (hostname[0] === '[') {\n const idx = hostname.indexOf(']')\n\n assert(idx !== -1)\n const ip = hostname.substring(1, idx)\n\n assert(net.isIPv6(ip))\n hostname = ip\n }\n\n client[kConnecting] = true\n\n if (channels.beforeConnect.hasSubscribers) {\n channels.beforeConnect.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n version: client[kHTTPContext]?.version,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector]\n })\n }\n\n try {\n client[kConnector]({\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n }, (err, socket) => {\n if (err) {\n handleConnectError(client, err, { host, hostname, protocol, port })\n client[kResume]()\n return\n }\n\n if (client.destroyed) {\n util.destroy(socket.on('error', noop), new ClientDestroyedError())\n client[kResume]()\n return\n }\n\n assert(socket)\n\n try {\n client[kHTTPContext] = socket.alpnProtocol === 'h2'\n ? connectH2(client, socket)\n : connectH1(client, socket)\n } catch (err) {\n socket.destroy().on('error', noop)\n handleConnectError(client, err, { host, hostname, protocol, port })\n client[kResume]()\n return\n }\n\n client[kConnecting] = false\n\n socket[kCounter] = 0\n socket[kMaxRequests] = client[kMaxRequests]\n socket[kClient] = client\n socket[kError] = null\n\n if (channels.connected.hasSubscribers) {\n channels.connected.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n version: client[kHTTPContext]?.version,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n socket\n })\n }\n\n client.emit('connect', client[kUrl], [client])\n client[kResume]()\n })\n } catch (err) {\n handleConnectError(client, err, { host, hostname, protocol, port })\n client[kResume]()\n }\n}\n\nfunction handleConnectError (client, err, { host, hostname, protocol, port }) {\n if (client.destroyed) {\n return\n }\n\n client[kConnecting] = false\n\n if (channels.connectError.hasSubscribers) {\n channels.connectError.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n version: client[kHTTPContext]?.version,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n error: err\n })\n }\n\n if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n assert(client[kRunning] === 0)\n while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {\n const request = client[kQueue][client[kPendingIdx]++]\n util.errorRequest(client, request, err)\n }\n } else {\n onError(client, err)\n }\n\n client.emit('connectionError', client[kUrl], [client], err)\n}\n\nfunction emitDrain (client) {\n client[kNeedDrain] = 0\n client.emit('drain', client[kUrl], [client])\n}\n\nfunction resume (client, sync) {\n if (client[kResuming] === 2) {\n return\n }\n\n client[kResuming] = 2\n\n _resume(client, sync)\n client[kResuming] = 0\n\n if (client[kRunningIdx] > 256) {\n client[kQueue].splice(0, client[kRunningIdx])\n client[kPendingIdx] -= client[kRunningIdx]\n client[kRunningIdx] = 0\n }\n}\n\nfunction _resume (client, sync) {\n while (true) {\n if (client.destroyed) {\n assert(client[kPending] === 0)\n return\n }\n\n if (client[kClosedResolve] && !client[kSize]) {\n client[kClosedResolve]()\n client[kClosedResolve] = null\n return\n }\n\n if (client[kHTTPContext]) {\n client[kHTTPContext].resume()\n }\n\n if (client[kBusy]) {\n client[kNeedDrain] = 2\n } else if (client[kNeedDrain] === 2) {\n if (sync) {\n client[kNeedDrain] = 1\n queueMicrotask(() => emitDrain(client))\n } else {\n emitDrain(client)\n }\n continue\n }\n\n if (client[kPending] === 0) {\n return\n }\n\n if (client[kRunning] >= (getPipelining(client) || 1)) {\n return\n }\n\n const request = client[kQueue][client[kPendingIdx]]\n\n if (request === null) {\n return\n }\n\n if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {\n if (client[kRunning] > 0) {\n return\n }\n\n client[kServerName] = request.servername\n client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => {\n client[kHTTPContext] = null\n resume(client)\n })\n }\n\n if (client[kConnecting]) {\n return\n }\n\n if (!client[kHTTPContext]) {\n connect(client)\n return\n }\n\n if (client[kHTTPContext].destroyed) {\n return\n }\n\n if (client[kHTTPContext].busy(request)) {\n return\n }\n\n if (!request.aborted && client[kHTTPContext].write(request)) {\n client[kPendingIdx]++\n } else {\n client[kQueue].splice(client[kPendingIdx], 1)\n }\n }\n}\n\nmodule.exports = Client\n","'use strict'\n\n// Extracted from node/lib/internal/fixed_queue.js\n\n// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two.\nconst kSize = 2048\nconst kMask = kSize - 1\n\n// The FixedQueue is implemented as a singly-linked list of fixed-size\n// circular buffers. It looks something like this:\n//\n// head tail\n// | |\n// v v\n// +-----------+ <-----\\ +-----------+ <------\\ +-----------+\n// | [null] | \\----- | next | \\------- | next |\n// +-----------+ +-----------+ +-----------+\n// | item | <-- bottom | item | <-- bottom | undefined |\n// | item | | item | | undefined |\n// | item | | item | | undefined |\n// | item | | item | | undefined |\n// | item | | item | bottom --> | item |\n// | item | | item | | item |\n// | ... | | ... | | ... |\n// | item | | item | | item |\n// | item | | item | | item |\n// | undefined | <-- top | item | | item |\n// | undefined | | item | | item |\n// | undefined | | undefined | <-- top top --> | undefined |\n// +-----------+ +-----------+ +-----------+\n//\n// Or, if there is only one circular buffer, it looks something\n// like either of these:\n//\n// head tail head tail\n// | | | |\n// v v v v\n// +-----------+ +-----------+\n// | [null] | | [null] |\n// +-----------+ +-----------+\n// | undefined | | item |\n// | undefined | | item |\n// | item | <-- bottom top --> | undefined |\n// | item | | undefined |\n// | undefined | <-- top bottom --> | item |\n// | undefined | | item |\n// +-----------+ +-----------+\n//\n// Adding a value means moving `top` forward by one, removing means\n// moving `bottom` forward by one. After reaching the end, the queue\n// wraps around.\n//\n// When `top === bottom` the current queue is empty and when\n// `top + 1 === bottom` it's full. This wastes a single space of storage\n// but allows much quicker checks.\n\n/**\n * @type {FixedCircularBuffer}\n * @template T\n */\nclass FixedCircularBuffer {\n /** @type {number} */\n bottom = 0\n /** @type {number} */\n top = 0\n /** @type {Array} */\n list = new Array(kSize).fill(undefined)\n /** @type {T|null} */\n next = null\n\n /** @returns {boolean} */\n isEmpty () {\n return this.top === this.bottom\n }\n\n /** @returns {boolean} */\n isFull () {\n return ((this.top + 1) & kMask) === this.bottom\n }\n\n /**\n * @param {T} data\n * @returns {void}\n */\n push (data) {\n this.list[this.top] = data\n this.top = (this.top + 1) & kMask\n }\n\n /** @returns {T|null} */\n shift () {\n const nextItem = this.list[this.bottom]\n if (nextItem === undefined) { return null }\n this.list[this.bottom] = undefined\n this.bottom = (this.bottom + 1) & kMask\n return nextItem\n }\n}\n\n/**\n * @template T\n */\nmodule.exports = class FixedQueue {\n constructor () {\n /** @type {FixedCircularBuffer} */\n this.head = this.tail = new FixedCircularBuffer()\n }\n\n /** @returns {boolean} */\n isEmpty () {\n return this.head.isEmpty()\n }\n\n /** @param {T} data */\n push (data) {\n if (this.head.isFull()) {\n // Head is full: Creates a new queue, sets the old queue's `.next` to it,\n // and sets it as the new main queue.\n this.head = this.head.next = new FixedCircularBuffer()\n }\n this.head.push(data)\n }\n\n /** @returns {T|null} */\n shift () {\n const tail = this.tail\n const next = tail.shift()\n if (tail.isEmpty() && tail.next !== null) {\n // If there is another queue, it forms the new tail.\n this.tail = tail.next\n tail.next = null\n }\n return next\n }\n}\n","'use strict'\n\nconst { PoolStats } = require('../util/stats.js')\nconst DispatcherBase = require('./dispatcher-base')\nconst FixedQueue = require('./fixed-queue')\nconst { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('../core/symbols')\n\nconst kClients = Symbol('clients')\nconst kNeedDrain = Symbol('needDrain')\nconst kQueue = Symbol('queue')\nconst kClosedResolve = Symbol('closed resolve')\nconst kOnDrain = Symbol('onDrain')\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kGetDispatcher = Symbol('get dispatcher')\nconst kAddClient = Symbol('add client')\nconst kRemoveClient = Symbol('remove client')\n\nclass PoolBase extends DispatcherBase {\n [kQueue] = new FixedQueue();\n\n [kQueued] = 0;\n\n [kClients] = [];\n\n [kNeedDrain] = false;\n\n [kOnDrain] (client, origin, targets) {\n const queue = this[kQueue]\n\n let needDrain = false\n\n while (!needDrain) {\n const item = queue.shift()\n if (!item) {\n break\n }\n this[kQueued]--\n needDrain = !client.dispatch(item.opts, item.handler)\n }\n\n client[kNeedDrain] = needDrain\n\n if (!needDrain && this[kNeedDrain]) {\n this[kNeedDrain] = false\n this.emit('drain', origin, [this, ...targets])\n }\n\n if (this[kClosedResolve] && queue.isEmpty()) {\n const closeAll = []\n for (let i = 0; i < this[kClients].length; i++) {\n const client = this[kClients][i]\n if (!client.destroyed) {\n closeAll.push(client.close())\n }\n }\n return Promise.all(closeAll)\n .then(this[kClosedResolve])\n }\n }\n\n [kOnConnect] = (origin, targets) => {\n this.emit('connect', origin, [this, ...targets])\n };\n\n [kOnDisconnect] = (origin, targets, err) => {\n this.emit('disconnect', origin, [this, ...targets], err)\n };\n\n [kOnConnectionError] = (origin, targets, err) => {\n this.emit('connectionError', origin, [this, ...targets], err)\n }\n\n get [kBusy] () {\n return this[kNeedDrain]\n }\n\n get [kConnected] () {\n let ret = 0\n for (const { [kConnected]: connected } of this[kClients]) {\n ret += connected\n }\n return ret\n }\n\n get [kFree] () {\n let ret = 0\n for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) {\n ret += connected && !needDrain\n }\n return ret\n }\n\n get [kPending] () {\n let ret = this[kQueued]\n for (const { [kPending]: pending } of this[kClients]) {\n ret += pending\n }\n return ret\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { [kRunning]: running } of this[kClients]) {\n ret += running\n }\n return ret\n }\n\n get [kSize] () {\n let ret = this[kQueued]\n for (const { [kSize]: size } of this[kClients]) {\n ret += size\n }\n return ret\n }\n\n get stats () {\n return new PoolStats(this)\n }\n\n [kClose] () {\n if (this[kQueue].isEmpty()) {\n const closeAll = []\n for (let i = 0; i < this[kClients].length; i++) {\n const client = this[kClients][i]\n if (!client.destroyed) {\n closeAll.push(client.close())\n }\n }\n return Promise.all(closeAll)\n } else {\n return new Promise((resolve) => {\n this[kClosedResolve] = resolve\n })\n }\n }\n\n [kDestroy] (err) {\n while (true) {\n const item = this[kQueue].shift()\n if (!item) {\n break\n }\n item.handler.onResponseError(null, err)\n }\n\n const destroyAll = new Array(this[kClients].length)\n for (let i = 0; i < this[kClients].length; i++) {\n destroyAll[i] = this[kClients][i].destroy(err)\n }\n return Promise.all(destroyAll)\n }\n\n [kDispatch] (opts, handler) {\n const dispatcher = this[kGetDispatcher]()\n\n if (!dispatcher) {\n this[kNeedDrain] = true\n this[kQueue].push({ opts, handler })\n this[kQueued]++\n } else if (!dispatcher.dispatch(opts, handler)) {\n dispatcher[kNeedDrain] = true\n this[kNeedDrain] = !this[kGetDispatcher]()\n }\n\n return !this[kNeedDrain]\n }\n\n [kAddClient] (client) {\n client\n .on('drain', this[kOnDrain].bind(this, client))\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].push(client)\n\n if (this[kNeedDrain]) {\n queueMicrotask(() => {\n if (this[kNeedDrain]) {\n this[kOnDrain](client, client[kUrl], [client, this])\n }\n })\n }\n\n return this\n }\n\n [kRemoveClient] (client) {\n client.close(() => {\n const idx = this[kClients].indexOf(client)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n })\n\n this[kNeedDrain] = this[kClients].some(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n }\n}\n\nmodule.exports = {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n}\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher,\n kRemoveClient\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { kUrl } = require('../core/symbols')\nconst buildConnector = require('../core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass Pool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n clientTtl,\n ...options\n } = {}) {\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n super(options)\n\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }\n this[kFactory] = factory\n\n this.on('connect', (origin, targets) => {\n if (clientTtl != null && clientTtl > 0) {\n for (const target of targets) {\n Object.assign(target, { ttl: Date.now() })\n }\n }\n })\n\n this.on('connectionError', (origin, targets, error) => {\n // If a connection error occurs, we remove the client from the pool,\n // and emit a connectionError event. They will not be re-used.\n // Fixes https://github.com/nodejs/undici/issues/3895\n for (const target of targets) {\n // Do not use kRemoveClient here, as it will close the client,\n // but the client cannot be closed in this state.\n const idx = this[kClients].indexOf(target)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n }\n })\n }\n\n [kGetDispatcher] () {\n const clientTtlOption = this[kOptions].clientTtl\n for (const client of this[kClients]) {\n // check ttl of client and if it's stale, remove it from the pool\n if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {\n this[kRemoveClient](client)\n } else if (!client[kNeedDrain]) {\n return client\n }\n }\n\n if (!this[kConnections] || this[kClients].length < this[kConnections]) {\n const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n return dispatcher\n }\n }\n}\n\nmodule.exports = Pool\n","'use strict'\n\nconst {\n BalancedPoolMissingUpstreamError,\n InvalidArgumentError\n} = require('../core/errors')\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Pool = require('./pool')\nconst { kUrl } = require('../core/symbols')\nconst util = require('../core/util')\nconst kFactory = Symbol('factory')\n\nconst kOptions = Symbol('options')\nconst kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor')\nconst kCurrentWeight = Symbol('kCurrentWeight')\nconst kIndex = Symbol('kIndex')\nconst kWeight = Symbol('kWeight')\nconst kMaxWeightPerServer = Symbol('kMaxWeightPerServer')\nconst kErrorPenalty = Symbol('kErrorPenalty')\n\n/**\n * Calculate the greatest common divisor of two numbers by\n * using the Euclidean algorithm.\n *\n * @param {number} a\n * @param {number} b\n * @returns {number}\n */\nfunction getGreatestCommonDivisor (a, b) {\n if (a === 0) return b\n\n while (b !== 0) {\n const t = b\n b = a % b\n a = t\n }\n return a\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass BalancedPool extends PoolBase {\n constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) {\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n super()\n\n this[kOptions] = { ...util.deepClone(opts) }\n this[kIndex] = -1\n this[kCurrentWeight] = 0\n\n this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100\n this[kErrorPenalty] = this[kOptions].errorPenalty || 15\n\n if (!Array.isArray(upstreams)) {\n upstreams = [upstreams]\n }\n\n this[kFactory] = factory\n\n for (const upstream of upstreams) {\n this.addUpstream(upstream)\n }\n this._updateBalancedPoolStats()\n }\n\n addUpstream (upstream) {\n const upstreamOrigin = util.parseOrigin(upstream).origin\n\n if (this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))) {\n return this\n }\n const pool = this[kFactory](upstreamOrigin, this[kOptions])\n\n this[kAddClient](pool)\n pool.on('connect', () => {\n pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty])\n })\n\n pool.on('connectionError', () => {\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n })\n\n pool.on('disconnect', (...args) => {\n const err = args[2]\n if (err && err.code === 'UND_ERR_SOCKET') {\n // decrease the weight of the pool.\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n }\n })\n\n for (const client of this[kClients]) {\n client[kWeight] = this[kMaxWeightPerServer]\n }\n\n this._updateBalancedPoolStats()\n\n return this\n }\n\n _updateBalancedPoolStats () {\n let result = 0\n for (let i = 0; i < this[kClients].length; i++) {\n result = getGreatestCommonDivisor(this[kClients][i][kWeight], result)\n }\n\n this[kGreatestCommonDivisor] = result\n }\n\n removeUpstream (upstream) {\n const upstreamOrigin = util.parseOrigin(upstream).origin\n\n const pool = this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))\n\n if (pool) {\n this[kRemoveClient](pool)\n }\n\n return this\n }\n\n getUpstream (upstream) {\n const upstreamOrigin = util.parseOrigin(upstream).origin\n\n return this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))\n }\n\n get upstreams () {\n return this[kClients]\n .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true)\n .map((p) => p[kUrl].origin)\n }\n\n [kGetDispatcher] () {\n // We validate that pools is greater than 0,\n // otherwise we would have to wait until an upstream\n // is added, which might never happen.\n if (this[kClients].length === 0) {\n throw new BalancedPoolMissingUpstreamError()\n }\n\n const dispatcher = this[kClients].find(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n\n if (!dispatcher) {\n return\n }\n\n const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true)\n\n if (allClientsBusy) {\n return\n }\n\n let counter = 0\n\n let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain])\n\n while (counter++ < this[kClients].length) {\n this[kIndex] = (this[kIndex] + 1) % this[kClients].length\n const pool = this[kClients][this[kIndex]]\n\n // find pool index with the largest weight\n if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) {\n maxWeightIndex = this[kIndex]\n }\n\n // decrease the current weight every `this[kClients].length`.\n if (this[kIndex] === 0) {\n // Set the current weight to the next lower weight.\n this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]\n\n if (this[kCurrentWeight] <= 0) {\n this[kCurrentWeight] = this[kMaxWeightPerServer]\n }\n }\n if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) {\n return pool\n }\n }\n\n this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]\n this[kIndex] = maxWeightIndex\n return this[kClients][maxWeightIndex]\n }\n}\n\nmodule.exports = BalancedPool\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher,\n kRemoveClient\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { kUrl } = require('../core/symbols')\nconst buildConnector = require('../core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\nconst kIndex = Symbol('index')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass RoundRobinPool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n clientTtl,\n ...options\n } = {}) {\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n super()\n\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }\n this[kFactory] = factory\n this[kIndex] = -1\n\n this.on('connect', (origin, targets) => {\n if (clientTtl != null && clientTtl > 0) {\n for (const target of targets) {\n Object.assign(target, { ttl: Date.now() })\n }\n }\n })\n\n this.on('connectionError', (origin, targets, error) => {\n for (const target of targets) {\n const idx = this[kClients].indexOf(target)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n }\n })\n }\n\n [kGetDispatcher] () {\n const clientTtlOption = this[kOptions].clientTtl\n const clientsLength = this[kClients].length\n\n // If we have no clients yet, create one\n if (clientsLength === 0) {\n const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n return dispatcher\n }\n\n // Round-robin through existing clients\n let checked = 0\n while (checked < clientsLength) {\n this[kIndex] = (this[kIndex] + 1) % clientsLength\n const client = this[kClients][this[kIndex]]\n\n // Check if client is stale (TTL expired)\n if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {\n this[kRemoveClient](client)\n checked++\n continue\n }\n\n // Return client if it's not draining\n if (!client[kNeedDrain]) {\n return client\n }\n\n checked++\n }\n\n // All clients are busy, create a new one if we haven't reached the limit\n if (!this[kConnections] || clientsLength < this[kConnections]) {\n const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n return dispatcher\n }\n }\n}\n\nmodule.exports = RoundRobinPool\n","'use strict'\n\nconst { InvalidArgumentError, MaxOriginsReachedError } = require('../core/errors')\nconst { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = require('../core/symbols')\nconst DispatcherBase = require('./dispatcher-base')\nconst Pool = require('./pool')\nconst Client = require('./client')\nconst util = require('../core/util')\n\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kOnDrain = Symbol('onDrain')\nconst kFactory = Symbol('factory')\nconst kOptions = Symbol('options')\nconst kOrigins = Symbol('origins')\n\nfunction defaultFactory (origin, opts) {\n return opts && opts.connections === 1\n ? new Client(origin, opts)\n : new Pool(origin, opts)\n}\n\nclass Agent extends DispatcherBase {\n constructor ({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) {\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof maxOrigins !== 'number' || Number.isNaN(maxOrigins) || maxOrigins <= 0) {\n throw new InvalidArgumentError('maxOrigins must be a number greater than 0')\n }\n\n super(options)\n\n if (connect && typeof connect !== 'function') {\n connect = { ...connect }\n }\n\n this[kOptions] = { ...util.deepClone(options), maxOrigins, connect }\n this[kFactory] = factory\n this[kClients] = new Map()\n this[kOrigins] = new Set()\n\n this[kOnDrain] = (origin, targets) => {\n this.emit('drain', origin, [this, ...targets])\n }\n\n this[kOnConnect] = (origin, targets) => {\n this.emit('connect', origin, [this, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n this.emit('disconnect', origin, [this, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n this.emit('connectionError', origin, [this, ...targets], err)\n }\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { dispatcher } of this[kClients].values()) {\n ret += dispatcher[kRunning]\n }\n return ret\n }\n\n [kDispatch] (opts, handler) {\n let origin\n if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) {\n origin = String(opts.origin)\n } else {\n throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')\n }\n\n const allowH2 = opts.allowH2 ?? this[kOptions].allowH2\n const key = allowH2 === false ? `${origin}#http1-only` : origin\n\n if (this[kOrigins].size >= this[kOptions].maxOrigins && !this[kOrigins].has(origin)) {\n throw new MaxOriginsReachedError()\n }\n\n const result = this[kClients].get(key)\n let dispatcher = result && result.dispatcher\n if (!dispatcher) {\n const closeClientIfUnused = (connected) => {\n const result = this[kClients].get(key)\n if (result) {\n if (connected) result.count -= 1\n if (result.count <= 0) {\n this[kClients].delete(key)\n if (!result.dispatcher.destroyed) {\n result.dispatcher.close()\n }\n }\n\n let hasOrigin = false\n for (const entry of this[kClients].values()) {\n if (entry.origin === origin) {\n hasOrigin = true\n break\n }\n }\n\n if (!hasOrigin) {\n this[kOrigins].delete(origin)\n }\n }\n }\n dispatcher = this[kFactory](opts.origin, allowH2 === false\n ? { ...this[kOptions], allowH2: false }\n : this[kOptions])\n .on('drain', this[kOnDrain])\n .on('connect', (origin, targets) => {\n const result = this[kClients].get(key)\n if (result) {\n result.count += 1\n }\n this[kOnConnect](origin, targets)\n })\n .on('disconnect', (origin, targets, err) => {\n closeClientIfUnused(true)\n this[kOnDisconnect](origin, targets, err)\n })\n .on('connectionError', (origin, targets, err) => {\n closeClientIfUnused(false)\n this[kOnConnectionError](origin, targets, err)\n })\n\n this[kClients].set(key, { count: 0, dispatcher, origin })\n this[kOrigins].add(origin)\n }\n\n return dispatcher.dispatch(opts, handler)\n }\n\n [kClose] () {\n const closePromises = []\n for (const { dispatcher } of this[kClients].values()) {\n closePromises.push(dispatcher.close())\n }\n this[kClients].clear()\n\n return Promise.all(closePromises)\n }\n\n [kDestroy] (err) {\n const destroyPromises = []\n for (const { dispatcher } of this[kClients].values()) {\n destroyPromises.push(dispatcher.destroy(err))\n }\n this[kClients].clear()\n\n return Promise.all(destroyPromises)\n }\n\n get stats () {\n const allClientStats = {}\n for (const { dispatcher } of this[kClients].values()) {\n if (dispatcher.stats) {\n allClientStats[dispatcher[kUrl].origin] = dispatcher.stats\n }\n }\n return allClientStats\n }\n}\n\nmodule.exports = Agent\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { toRawHeaders } = require('../core/util')\n\nclass LegacyHandlerWrapper {\n #handler\n\n constructor (handler) {\n this.#handler = handler\n }\n\n onRequestStart (controller, context) {\n this.#handler.onConnect?.((reason) => controller.abort(reason), context)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {})\n this.#handler.onUpgrade?.(statusCode, rawHeaders, socket)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {})\n\n if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {\n controller.pause()\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.#handler.onData?.(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (controller, trailers) {\n const rawTrailers = controller?.rawTrailers ?? toRawHeaders(trailers ?? {})\n this.#handler.onComplete?.(rawTrailers)\n }\n\n onResponseError (_controller, err) {\n if (!this.#handler.onError) {\n throw err\n }\n\n this.#handler.onError(err)\n }\n\n onBodySent (chunk) {\n this.#handler.onBodySent?.(chunk)\n }\n\n onRequestSent () {\n this.#handler.onRequestSent?.()\n }\n\n onResponseStarted () {\n this.#handler.onResponseStarted?.()\n }\n}\n\nclass Dispatcher1Wrapper extends Dispatcher {\n #dispatcher\n\n constructor (dispatcher) {\n super()\n\n if (!dispatcher || typeof dispatcher.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument dispatcher must implement dispatch')\n }\n\n this.#dispatcher = dispatcher\n }\n\n static wrapHandler (handler) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n if (typeof handler.onRequestStart === 'function') {\n return handler\n }\n\n return new LegacyHandlerWrapper(handler)\n }\n\n dispatch (opts, handler) {\n // Legacy (v1) consumers do not support HTTP/2, so force HTTP/1.1.\n // See https://github.com/nodejs/undici/issues/4989\n if (opts.allowH2 !== false) {\n opts = { ...opts, allowH2: false }\n }\n\n return this.#dispatcher.dispatch(opts, Dispatcher1Wrapper.wrapHandler(handler))\n }\n\n close (...args) {\n return this.#dispatcher.close(...args)\n }\n\n destroy (...args) {\n return this.#dispatcher.destroy(...args)\n }\n}\n\nmodule.exports = Dispatcher1Wrapper\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\nconst net = require('node:net')\nconst { InvalidArgumentError } = require('./errors')\n\n/**\n * Parse an address and determine its type\n * @param {string} address - The address to parse\n * @returns {{type: number, buffer: Buffer}} Address type and buffer\n */\nfunction parseAddress (address) {\n // Check if it's an IPv4 address\n if (net.isIPv4(address)) {\n const parts = address.split('.').map(Number)\n return {\n type: 0x01, // IPv4\n buffer: Buffer.from(parts)\n }\n }\n\n // Check if it's an IPv6 address\n if (net.isIPv6(address)) {\n return {\n type: 0x04, // IPv6\n buffer: parseIPv6(address)\n }\n }\n\n // Otherwise, treat as domain name\n const domainBuffer = Buffer.from(address, 'utf8')\n if (domainBuffer.length > 255) {\n throw new InvalidArgumentError('Domain name too long (max 255 bytes)')\n }\n\n return {\n type: 0x03, // Domain\n buffer: Buffer.concat([Buffer.from([domainBuffer.length]), domainBuffer])\n }\n}\n\n/**\n * Parse IPv6 address to buffer\n * @param {string} address - IPv6 address string\n * @returns {Buffer} 16-byte buffer\n */\nfunction parseIPv6 (address) {\n const buffer = Buffer.alloc(16)\n const parts = address.split(':')\n let partIndex = 0\n let bufferIndex = 0\n\n // Handle compressed notation (::)\n const doubleColonIndex = address.indexOf('::')\n if (doubleColonIndex !== -1) {\n // Count non-empty parts\n const nonEmptyParts = parts.filter(p => p.length > 0).length\n const skipParts = 8 - nonEmptyParts\n\n for (let i = 0; i < parts.length; i++) {\n if (parts[i] === '' && i === doubleColonIndex / 3) {\n // Skip empty parts for ::\n bufferIndex += skipParts * 2\n } else if (parts[i] !== '') {\n const value = parseInt(parts[i], 16)\n buffer.writeUInt16BE(value, bufferIndex)\n bufferIndex += 2\n }\n }\n } else {\n // No compression, parse normally\n for (const part of parts) {\n if (part === '') continue\n const value = parseInt(part, 16)\n buffer.writeUInt16BE(value, partIndex * 2)\n partIndex++\n }\n }\n\n return buffer\n}\n\n/**\n * Build a SOCKS5 address buffer\n * @param {number} type - Address type (1=IPv4, 3=Domain, 4=IPv6)\n * @param {Buffer} addressBuffer - The address data\n * @param {number} port - Port number\n * @returns {Buffer} Complete address buffer including type, address, and port\n */\nfunction buildAddressBuffer (type, addressBuffer, port) {\n const portBuffer = Buffer.allocUnsafe(2)\n portBuffer.writeUInt16BE(port, 0)\n\n return Buffer.concat([\n Buffer.from([type]),\n addressBuffer,\n portBuffer\n ])\n}\n\n/**\n * Parse address from SOCKS5 response\n * @param {Buffer} buffer - Buffer containing the address\n * @param {number} offset - Starting offset in buffer\n * @returns {{address: string, port: number, bytesRead: number}}\n */\nfunction parseResponseAddress (buffer, offset = 0) {\n if (buffer.length < offset + 1) {\n throw new InvalidArgumentError('Buffer too small to contain address type')\n }\n\n const addressType = buffer[offset]\n let address\n let currentOffset = offset + 1\n\n switch (addressType) {\n case 0x01: { // IPv4\n if (buffer.length < currentOffset + 6) {\n throw new InvalidArgumentError('Buffer too small for IPv4 address')\n }\n address = Array.from(buffer.subarray(currentOffset, currentOffset + 4)).join('.')\n currentOffset += 4\n break\n }\n\n case 0x03: { // Domain\n if (buffer.length < currentOffset + 1) {\n throw new InvalidArgumentError('Buffer too small for domain length')\n }\n const domainLength = buffer[currentOffset]\n currentOffset += 1\n\n if (buffer.length < currentOffset + domainLength + 2) {\n throw new InvalidArgumentError('Buffer too small for domain address')\n }\n address = buffer.subarray(currentOffset, currentOffset + domainLength).toString('utf8')\n currentOffset += domainLength\n break\n }\n\n case 0x04: { // IPv6\n if (buffer.length < currentOffset + 18) {\n throw new InvalidArgumentError('Buffer too small for IPv6 address')\n }\n // Convert buffer to IPv6 string\n const parts = []\n for (let i = 0; i < 8; i++) {\n const value = buffer.readUInt16BE(currentOffset + i * 2)\n parts.push(value.toString(16))\n }\n address = parts.join(':')\n currentOffset += 16\n break\n }\n\n default:\n throw new InvalidArgumentError(`Invalid address type: ${addressType}`)\n }\n\n // Parse port\n if (buffer.length < currentOffset + 2) {\n throw new InvalidArgumentError('Buffer too small for port')\n }\n const port = buffer.readUInt16BE(currentOffset)\n currentOffset += 2\n\n return {\n address,\n port,\n bytesRead: currentOffset - offset\n }\n}\n\n/**\n * Create error for SOCKS5 reply code\n * @param {number} replyCode - SOCKS5 reply code\n * @returns {Error} Appropriate error object\n */\nfunction createReplyError (replyCode) {\n const messages = {\n 0x01: 'General SOCKS server failure',\n 0x02: 'Connection not allowed by ruleset',\n 0x03: 'Network unreachable',\n 0x04: 'Host unreachable',\n 0x05: 'Connection refused',\n 0x06: 'TTL expired',\n 0x07: 'Command not supported',\n 0x08: 'Address type not supported'\n }\n\n const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`\n const error = new Error(message)\n error.code = `SOCKS5_${replyCode}`\n return error\n}\n\nmodule.exports = {\n parseAddress,\n parseIPv6,\n buildAddressBuffer,\n parseResponseAddress,\n createReplyError\n}\n","'use strict'\n\nconst { EventEmitter } = require('node:events')\nconst { Buffer } = require('node:buffer')\nconst { InvalidArgumentError, Socks5ProxyError } = require('./errors')\nconst { debuglog } = require('node:util')\nconst { parseAddress } = require('./socks5-utils')\n\nconst debug = debuglog('undici:socks5')\n\n// SOCKS5 constants\nconst SOCKS_VERSION = 0x05\n\n// Authentication methods\nconst AUTH_METHODS = {\n NO_AUTH: 0x00,\n GSSAPI: 0x01,\n USERNAME_PASSWORD: 0x02,\n NO_ACCEPTABLE: 0xFF\n}\n\n// SOCKS5 commands\nconst COMMANDS = {\n CONNECT: 0x01,\n BIND: 0x02,\n UDP_ASSOCIATE: 0x03\n}\n\n// Address types\nconst ADDRESS_TYPES = {\n IPV4: 0x01,\n DOMAIN: 0x03,\n IPV6: 0x04\n}\n\n// Reply codes\nconst REPLY_CODES = {\n SUCCEEDED: 0x00,\n GENERAL_FAILURE: 0x01,\n CONNECTION_NOT_ALLOWED: 0x02,\n NETWORK_UNREACHABLE: 0x03,\n HOST_UNREACHABLE: 0x04,\n CONNECTION_REFUSED: 0x05,\n TTL_EXPIRED: 0x06,\n COMMAND_NOT_SUPPORTED: 0x07,\n ADDRESS_TYPE_NOT_SUPPORTED: 0x08\n}\n\n// State machine states\nconst STATES = {\n INITIAL: 'initial',\n HANDSHAKING: 'handshaking',\n AUTHENTICATING: 'authenticating',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n ERROR: 'error',\n CLOSED: 'closed'\n}\n\n/**\n * SOCKS5 client implementation\n * Handles SOCKS5 protocol negotiation and connection establishment\n */\nclass Socks5Client extends EventEmitter {\n constructor (socket, options = {}) {\n super()\n\n if (!socket) {\n throw new InvalidArgumentError('socket is required')\n }\n\n this.socket = socket\n this.options = options\n this.state = STATES.INITIAL\n this.buffer = Buffer.alloc(0)\n\n // Authentication settings\n this.authMethods = []\n if (options.username && options.password) {\n this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD)\n }\n this.authMethods.push(AUTH_METHODS.NO_AUTH)\n\n // Socket event handlers\n this.socket.on('data', this.onData.bind(this))\n this.socket.on('error', this.onError.bind(this))\n this.socket.on('close', this.onClose.bind(this))\n }\n\n /**\n * Handle incoming data from the socket\n */\n onData (data) {\n debug('received data', data.length, 'bytes in state', this.state)\n this.buffer = Buffer.concat([this.buffer, data])\n\n try {\n switch (this.state) {\n case STATES.HANDSHAKING:\n this.handleHandshakeResponse()\n break\n case STATES.AUTHENTICATING:\n this.handleAuthResponse()\n break\n case STATES.CONNECTING:\n this.handleConnectResponse()\n break\n }\n } catch (err) {\n this.onError(err)\n }\n }\n\n /**\n * Handle socket errors\n */\n onError (err) {\n debug('socket error', err)\n this.state = STATES.ERROR\n this.emit('error', err)\n this.destroy()\n }\n\n /**\n * Handle socket close\n */\n onClose () {\n debug('socket closed')\n this.state = STATES.CLOSED\n this.emit('close')\n }\n\n /**\n * Destroy the client and underlying socket\n */\n destroy () {\n if (this.socket && !this.socket.destroyed) {\n this.socket.destroy()\n }\n }\n\n /**\n * Start the SOCKS5 handshake\n */\n handshake () {\n if (this.state !== STATES.INITIAL) {\n throw new InvalidArgumentError('Handshake already started')\n }\n\n debug('starting handshake with', this.authMethods.length, 'auth methods')\n this.state = STATES.HANDSHAKING\n\n // Build handshake request\n // +----+----------+----------+\n // |VER | NMETHODS | METHODS |\n // +----+----------+----------+\n // | 1 | 1 | 1 to 255 |\n // +----+----------+----------+\n const request = Buffer.alloc(2 + this.authMethods.length)\n request[0] = SOCKS_VERSION\n request[1] = this.authMethods.length\n this.authMethods.forEach((method, i) => {\n request[2 + i] = method\n })\n\n this.socket.write(request)\n }\n\n /**\n * Handle handshake response from server\n */\n handleHandshakeResponse () {\n if (this.buffer.length < 2) {\n return // Not enough data yet\n }\n\n const version = this.buffer[0]\n const method = this.buffer[1]\n\n if (version !== SOCKS_VERSION) {\n throw new Socks5ProxyError(`Invalid SOCKS version: ${version}`, 'UND_ERR_SOCKS5_VERSION')\n }\n\n if (method === AUTH_METHODS.NO_ACCEPTABLE) {\n throw new Socks5ProxyError('No acceptable authentication method', 'UND_ERR_SOCKS5_AUTH_REJECTED')\n }\n\n this.buffer = this.buffer.subarray(2)\n debug('server selected auth method', method)\n\n if (method === AUTH_METHODS.NO_AUTH) {\n this.emit('authenticated')\n } else if (method === AUTH_METHODS.USERNAME_PASSWORD) {\n this.state = STATES.AUTHENTICATING\n this.sendAuthRequest()\n } else {\n throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, 'UND_ERR_SOCKS5_AUTH_METHOD')\n }\n }\n\n /**\n * Send username/password authentication request\n */\n sendAuthRequest () {\n const { username, password } = this.options\n\n if (!username || !password) {\n throw new InvalidArgumentError('Username and password required for authentication')\n }\n\n debug('sending username/password auth')\n\n // Username/Password authentication request (RFC 1929)\n // +----+------+----------+------+----------+\n // |VER | ULEN | UNAME | PLEN | PASSWD |\n // +----+------+----------+------+----------+\n // | 1 | 1 | 1 to 255 | 1 | 1 to 255 |\n // +----+------+----------+------+----------+\n const usernameBuffer = Buffer.from(username)\n const passwordBuffer = Buffer.from(password)\n\n if (usernameBuffer.length > 255 || passwordBuffer.length > 255) {\n throw new InvalidArgumentError('Username or password too long')\n }\n\n const request = Buffer.alloc(3 + usernameBuffer.length + passwordBuffer.length)\n request[0] = 0x01 // Sub-negotiation version\n request[1] = usernameBuffer.length\n usernameBuffer.copy(request, 2)\n request[2 + usernameBuffer.length] = passwordBuffer.length\n passwordBuffer.copy(request, 3 + usernameBuffer.length)\n\n this.socket.write(request)\n }\n\n /**\n * Handle authentication response\n */\n handleAuthResponse () {\n if (this.buffer.length < 2) {\n return // Not enough data yet\n }\n\n const version = this.buffer[0]\n const status = this.buffer[1]\n\n if (version !== 0x01) {\n throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version}`, 'UND_ERR_SOCKS5_AUTH_VERSION')\n }\n\n if (status !== 0x00) {\n throw new Socks5ProxyError('Authentication failed', 'UND_ERR_SOCKS5_AUTH_FAILED')\n }\n\n this.buffer = this.buffer.subarray(2)\n debug('authentication successful')\n this.emit('authenticated')\n }\n\n /**\n * Send CONNECT command\n * @param {string} address - Target address (IP or domain)\n * @param {number} port - Target port\n */\n connect (address, port) {\n if (this.state === STATES.CONNECTED) {\n throw new InvalidArgumentError('Already connected')\n }\n\n debug('connecting to', address, port)\n this.state = STATES.CONNECTING\n\n const request = this.buildConnectRequest(COMMANDS.CONNECT, address, port)\n this.socket.write(request)\n }\n\n /**\n * Build a SOCKS5 request\n */\n buildConnectRequest (command, address, port) {\n // Parse address to determine type and buffer\n const { type: addressType, buffer: addressBuffer } = parseAddress(address)\n\n // Build request\n // +----+-----+-------+------+----------+----------+\n // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |\n // +----+-----+-------+------+----------+----------+\n // | 1 | 1 | X'00' | 1 | Variable | 2 |\n // +----+-----+-------+------+----------+----------+\n const request = Buffer.alloc(4 + addressBuffer.length + 2)\n request[0] = SOCKS_VERSION\n request[1] = command\n request[2] = 0x00 // Reserved\n request[3] = addressType\n addressBuffer.copy(request, 4)\n request.writeUInt16BE(port, 4 + addressBuffer.length)\n\n return request\n }\n\n /**\n * Handle CONNECT response\n */\n handleConnectResponse () {\n if (this.buffer.length < 4) {\n return // Not enough data for header\n }\n\n const version = this.buffer[0]\n const reply = this.buffer[1]\n const addressType = this.buffer[3]\n\n if (version !== SOCKS_VERSION) {\n throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version}`, 'UND_ERR_SOCKS5_REPLY_VERSION')\n }\n\n // Calculate the expected response length\n let responseLength = 4 // VER + REP + RSV + ATYP\n if (addressType === ADDRESS_TYPES.IPV4) {\n responseLength += 4 + 2 // IPv4 + port\n } else if (addressType === ADDRESS_TYPES.DOMAIN) {\n if (this.buffer.length < 5) {\n return // Need domain length byte\n }\n responseLength += 1 + this.buffer[4] + 2 // length byte + domain + port\n } else if (addressType === ADDRESS_TYPES.IPV6) {\n responseLength += 16 + 2 // IPv6 + port\n } else {\n throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, 'UND_ERR_SOCKS5_ADDR_TYPE')\n }\n\n if (this.buffer.length < responseLength) {\n return // Not enough data for full response\n }\n\n if (reply !== REPLY_CODES.SUCCEEDED) {\n const errorMessage = this.getReplyErrorMessage(reply)\n throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`)\n }\n\n // Parse bound address and port\n let boundAddress\n let offset = 4\n\n if (addressType === ADDRESS_TYPES.IPV4) {\n boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join('.')\n offset += 4\n } else if (addressType === ADDRESS_TYPES.DOMAIN) {\n const domainLength = this.buffer[offset]\n offset += 1\n boundAddress = this.buffer.subarray(offset, offset + domainLength).toString()\n offset += domainLength\n } else if (addressType === ADDRESS_TYPES.IPV6) {\n // Parse IPv6 address from 16-byte buffer\n const parts = []\n for (let i = 0; i < 8; i++) {\n const value = this.buffer.readUInt16BE(offset + i * 2)\n parts.push(value.toString(16))\n }\n boundAddress = parts.join(':')\n offset += 16\n }\n\n const boundPort = this.buffer.readUInt16BE(offset)\n\n this.buffer = this.buffer.subarray(responseLength)\n this.state = STATES.CONNECTED\n\n debug('connected, bound address:', boundAddress, 'port:', boundPort)\n this.emit('connected', { address: boundAddress, port: boundPort })\n }\n\n /**\n * Get human-readable error message for reply code\n */\n getReplyErrorMessage (reply) {\n switch (reply) {\n case REPLY_CODES.GENERAL_FAILURE:\n return 'General SOCKS server failure'\n case REPLY_CODES.CONNECTION_NOT_ALLOWED:\n return 'Connection not allowed by ruleset'\n case REPLY_CODES.NETWORK_UNREACHABLE:\n return 'Network unreachable'\n case REPLY_CODES.HOST_UNREACHABLE:\n return 'Host unreachable'\n case REPLY_CODES.CONNECTION_REFUSED:\n return 'Connection refused'\n case REPLY_CODES.TTL_EXPIRED:\n return 'TTL expired'\n case REPLY_CODES.COMMAND_NOT_SUPPORTED:\n return 'Command not supported'\n case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED:\n return 'Address type not supported'\n default:\n return `Unknown error code: ${reply}`\n }\n }\n}\n\nmodule.exports = {\n Socks5Client,\n AUTH_METHODS,\n COMMANDS,\n ADDRESS_TYPES,\n REPLY_CODES,\n STATES\n}\n","'use strict'\n\nconst net = require('node:net')\nconst { URL } = require('node:url')\n\nlet tls // include tls conditionally since it is not always available\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { Socks5Client } = require('../core/socks5-client')\nconst { kDispatch, kClose, kDestroy } = require('../core/symbols')\nconst Pool = require('./pool')\nconst buildConnector = require('../core/connect')\nconst { debuglog } = require('node:util')\n\nconst debug = debuglog('undici:socks5-proxy')\n\nconst kProxyUrl = Symbol('proxy url')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kProxyAuth = Symbol('proxy auth')\nconst kPool = Symbol('pool')\nconst kConnector = Symbol('connector')\n\n// Static flag to ensure warning is only emitted once per process\nlet experimentalWarningEmitted = false\n\n/**\n * SOCKS5 proxy agent for dispatching requests through a SOCKS5 proxy\n */\nclass Socks5ProxyAgent extends DispatcherBase {\n constructor (proxyUrl, options = {}) {\n super()\n\n // Emit experimental warning only once\n if (!experimentalWarningEmitted) {\n process.emitWarning(\n 'SOCKS5 proxy support is experimental and subject to change',\n 'ExperimentalWarning'\n )\n experimentalWarningEmitted = true\n }\n\n if (!proxyUrl) {\n throw new InvalidArgumentError('Proxy URL is mandatory')\n }\n\n // Parse proxy URL\n const url = typeof proxyUrl === 'string' ? new URL(proxyUrl) : proxyUrl\n\n if (url.protocol !== 'socks5:' && url.protocol !== 'socks:') {\n throw new InvalidArgumentError('Proxy URL must use socks5:// or socks:// protocol')\n }\n\n this[kProxyUrl] = url\n this[kProxyHeaders] = options.headers || {}\n\n // Extract auth from URL or options\n this[kProxyAuth] = {\n username: options.username || (url.username ? decodeURIComponent(url.username) : null),\n password: options.password || (url.password ? decodeURIComponent(url.password) : null)\n }\n\n // Create connector for proxy connection\n this[kConnector] = options.connect || buildConnector({\n ...options.proxyTls,\n servername: options.proxyTls?.servername || url.hostname\n })\n\n // Pool for the actual HTTP connections (with SOCKS5 tunnel connect function)\n this[kPool] = null\n }\n\n /**\n * Create a SOCKS5 connection to the proxy\n */\n async createSocks5Connection (targetHost, targetPort) {\n const proxyHost = this[kProxyUrl].hostname\n const proxyPort = parseInt(this[kProxyUrl].port) || 1080\n\n debug('creating SOCKS5 connection to', proxyHost, proxyPort)\n\n // Connect to the SOCKS5 proxy\n const socketReady = Promise.withResolvers()\n\n const onSocketConnect = () => {\n socket.removeListener('error', onSocketError)\n socketReady.resolve(socket)\n }\n\n const onSocketError = (err) => {\n socket.removeListener('connect', onSocketConnect)\n socketReady.reject(err)\n }\n\n const socket = net.connect({\n host: proxyHost,\n port: proxyPort\n })\n\n socket.once('connect', onSocketConnect)\n socket.once('error', onSocketError)\n\n await socketReady.promise\n\n // Create SOCKS5 client\n const socks5Client = new Socks5Client(socket, this[kProxyAuth])\n\n // Handle SOCKS5 errors\n socks5Client.on('error', (err) => {\n debug('SOCKS5 error:', err)\n socket.destroy()\n })\n\n // Perform SOCKS5 handshake\n await socks5Client.handshake()\n\n // Wait for authentication (if required)\n const authenticationReady = Promise.withResolvers()\n\n const authenticationTimeout = setTimeout(() => {\n authenticationReady.reject(new Error('SOCKS5 authentication timeout'))\n }, 5000)\n\n const onAuthenticated = () => {\n clearTimeout(authenticationTimeout)\n socks5Client.removeListener('error', onAuthenticationError)\n authenticationReady.resolve()\n }\n\n const onAuthenticationError = (err) => {\n clearTimeout(authenticationTimeout)\n socks5Client.removeListener('authenticated', onAuthenticated)\n authenticationReady.reject(err)\n }\n\n // Check if already authenticated (for NO_AUTH method)\n if (socks5Client.state === 'authenticated') {\n clearTimeout(authenticationTimeout)\n authenticationReady.resolve()\n } else {\n socks5Client.once('authenticated', onAuthenticated)\n socks5Client.once('error', onAuthenticationError)\n }\n\n await authenticationReady.promise\n\n // Send CONNECT command\n await socks5Client.connect(targetHost, targetPort)\n\n // Wait for connection\n const connectionReady = Promise.withResolvers()\n\n const connectionTimeout = setTimeout(() => {\n connectionReady.reject(new Error('SOCKS5 connection timeout'))\n }, 5000)\n\n const onConnected = (info) => {\n debug('SOCKS5 tunnel established to', targetHost, targetPort, 'via', info)\n clearTimeout(connectionTimeout)\n socks5Client.removeListener('error', onConnectionError)\n connectionReady.resolve()\n }\n\n const onConnectionError = (err) => {\n clearTimeout(connectionTimeout)\n socks5Client.removeListener('connected', onConnected)\n connectionReady.reject(err)\n }\n\n socks5Client.once('connected', onConnected)\n socks5Client.once('error', onConnectionError)\n\n await connectionReady.promise\n\n return socket\n }\n\n /**\n * Dispatch a request through the SOCKS5 proxy\n */\n async [kDispatch] (opts, handler) {\n const { origin } = opts\n\n debug('dispatching request to', origin, 'via SOCKS5')\n\n try {\n // Create Pool with custom connect function if we don't have one yet\n if (!this[kPool] || this[kPool].destroyed || this[kPool].closed) {\n this[kPool] = new Pool(origin, {\n pipelining: opts.pipelining,\n connections: opts.connections,\n connect: async (connectOpts, callback) => {\n try {\n const url = new URL(origin)\n const targetHost = url.hostname\n const targetPort = parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80)\n\n debug('establishing SOCKS5 connection to', targetHost, targetPort)\n\n // Create SOCKS5 tunnel\n const socket = await this.createSocks5Connection(targetHost, targetPort)\n\n // Handle TLS if needed\n let finalSocket = socket\n if (url.protocol === 'https:') {\n if (!tls) {\n tls = require('node:tls')\n }\n debug('upgrading to TLS')\n finalSocket = tls.connect({\n socket,\n servername: targetHost,\n ...connectOpts.tls || {}\n })\n\n const tlsReady = Promise.withResolvers()\n finalSocket.once('secureConnect', tlsReady.resolve)\n finalSocket.once('error', tlsReady.reject)\n await tlsReady.promise\n }\n\n callback(null, finalSocket)\n } catch (err) {\n debug('SOCKS5 connection error:', err)\n callback(err)\n }\n }\n })\n }\n\n // Dispatch the request through the pool\n return this[kPool][kDispatch](opts, handler)\n } catch (err) {\n debug('dispatch error:', err)\n if (typeof handler.onError === 'function') {\n handler.onError(err)\n } else {\n throw err\n }\n }\n }\n\n async [kClose] () {\n if (this[kPool]) {\n await this[kPool].close()\n }\n }\n\n async [kDestroy] (err) {\n if (this[kPool]) {\n await this[kPool].destroy(err)\n }\n }\n}\n\nmodule.exports = Socks5ProxyAgent\n","'use strict'\n\nconst { kProxy, kClose, kDestroy, kDispatch } = require('../core/symbols')\nconst Agent = require('./agent')\nconst Pool = require('./pool')\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require('../core/errors')\nconst buildConnector = require('../core/connect')\nconst Client = require('./client')\nconst { channels } = require('../core/diagnostics')\nconst Socks5ProxyAgent = require('./socks5-proxy-agent')\n\nconst kAgent = Symbol('proxy agent')\nconst kClient = Symbol('proxy client')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kRequestTls = Symbol('request tls settings')\nconst kProxyTls = Symbol('proxy tls settings')\nconst kConnectEndpoint = Symbol('connect endpoint function')\nconst kConnectEndpointHTTP1 = Symbol('connect endpoint function (http/1.1 only)')\nconst kTunnelProxy = Symbol('tunnel proxy')\n\nfunction defaultProtocolPort (protocol) {\n return protocol === 'https:' ? 443 : 80\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nconst noop = () => {}\n\nfunction defaultAgentFactory (origin, opts) {\n if (opts.connections === 1) {\n return new Client(origin, opts)\n }\n return new Pool(origin, opts)\n}\n\nclass Http1ProxyWrapper extends DispatcherBase {\n #client\n\n constructor (proxyUrl, { headers = {}, connect, factory }) {\n if (!proxyUrl) {\n throw new InvalidArgumentError('Proxy URL is mandatory')\n }\n\n super()\n\n this[kProxyHeaders] = headers\n if (factory) {\n this.#client = factory(proxyUrl, { connect })\n } else {\n this.#client = new Client(proxyUrl, { connect })\n }\n }\n\n [kDispatch] (opts, handler) {\n const onResponseStart = handler.onResponseStart\n handler.onResponseStart = function (controller, statusCode, data, statusMessage) {\n if (statusCode === 407) {\n if (typeof handler.onResponseError === 'function') {\n handler.onResponseError(controller, new InvalidArgumentError('Proxy Authentication Required (407)'))\n }\n return\n }\n if (onResponseStart) onResponseStart.call(this, controller, statusCode, data, statusMessage)\n }\n\n // Rewrite request as an HTTP1 Proxy request, without tunneling.\n const {\n origin,\n path = '/',\n headers = {}\n } = opts\n\n opts.path = origin + path\n\n if (!('host' in headers) && !('Host' in headers)) {\n const { host } = new URL(origin)\n headers.host = host\n }\n opts.headers = { ...this[kProxyHeaders], ...headers }\n\n return this.#client[kDispatch](opts, handler)\n }\n\n [kClose] () {\n return this.#client.close()\n }\n\n [kDestroy] (err) {\n return this.#client.destroy(err)\n }\n}\n\nclass ProxyAgent extends DispatcherBase {\n constructor (opts) {\n if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) {\n throw new InvalidArgumentError('Proxy uri is mandatory')\n }\n\n const { clientFactory = defaultFactory } = opts\n if (typeof clientFactory !== 'function') {\n throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')\n }\n\n const { proxyTunnel = true, connectTimeout } = opts\n\n super()\n\n const url = this.#getUrl(opts)\n const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url\n\n this[kProxy] = { uri: href, protocol }\n this[kRequestTls] = opts.requestTls\n this[kProxyTls] = opts.proxyTls\n this[kProxyHeaders] = opts.headers || {}\n this[kTunnelProxy] = proxyTunnel\n\n if (opts.auth && opts.token) {\n throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')\n } else if (opts.auth) {\n /* @deprecated in favour of opts.token */\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`\n } else if (opts.token) {\n this[kProxyHeaders]['proxy-authorization'] = opts.token\n } else if (username && password) {\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`\n }\n\n const connect = buildConnector({ timeout: connectTimeout, ...opts.proxyTls })\n this[kConnectEndpoint] = buildConnector({ timeout: connectTimeout, ...opts.requestTls })\n this[kConnectEndpointHTTP1] = buildConnector({ timeout: connectTimeout, ...opts.requestTls, allowH2: false })\n\n const agentFactory = opts.factory || defaultAgentFactory\n const factory = (origin, options) => {\n const { protocol } = new URL(origin)\n\n // Handle SOCKS5 proxy\n if (this[kProxy].protocol === 'socks5:' || this[kProxy].protocol === 'socks:') {\n return new Socks5ProxyAgent(this[kProxy].uri, {\n headers: this[kProxyHeaders],\n connect,\n factory: agentFactory,\n username: opts.username || username,\n password: opts.password || password,\n proxyTls: opts.proxyTls\n })\n }\n\n if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {\n return new Http1ProxyWrapper(this[kProxy].uri, {\n headers: this[kProxyHeaders],\n connect,\n factory: agentFactory\n })\n }\n return agentFactory(origin, options)\n }\n\n // For SOCKS5 proxies, we don't need a client to the proxy itself\n // The SOCKS5 connection is handled within Socks5ProxyAgent\n if (protocol === 'socks5:' || protocol === 'socks:') {\n this[kClient] = null\n } else {\n this[kClient] = clientFactory(url, { connect })\n }\n\n this[kAgent] = new Agent({\n ...opts,\n factory,\n connect: async (opts, callback) => {\n // SOCKS5 proxies handle their own connections via Socks5ProxyAgent,\n // so this connect function should never be called for them.\n if (!this[kClient]) {\n callback(new InvalidArgumentError('Cannot establish tunnel connection without a proxy client'))\n return\n }\n\n let requestedPath = opts.host\n if (!opts.port) {\n requestedPath += `:${defaultProtocolPort(opts.protocol)}`\n }\n try {\n const connectParams = {\n origin,\n port,\n path: requestedPath,\n signal: opts.signal,\n headers: {\n ...this[kProxyHeaders],\n host: opts.host,\n ...(opts.connections == null || opts.connections > 0 ? { 'proxy-connection': 'keep-alive' } : {})\n },\n servername: this[kProxyTls]?.servername || proxyHostname\n }\n const { socket, statusCode } = await this[kClient].connect(connectParams)\n if (statusCode !== 200) {\n socket.on('error', noop).destroy()\n callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))\n return\n }\n\n if (channels.proxyConnected.hasSubscribers) {\n channels.proxyConnected.publish({\n socket,\n connectParams\n })\n }\n\n if (opts.protocol !== 'https:') {\n callback(null, socket)\n return\n }\n let servername\n if (this[kRequestTls]) {\n servername = this[kRequestTls].servername\n } else {\n servername = opts.servername\n }\n const connectEndpoint = opts.allowH2 === false\n ? this[kConnectEndpointHTTP1]\n : this[kConnectEndpoint]\n\n connectEndpoint({ ...opts, servername, httpSocket: socket }, callback)\n } catch (err) {\n if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n // Throw a custom error to avoid loop in client.js#connect\n callback(new SecureProxyConnectionError(err))\n } else {\n callback(err)\n }\n }\n }\n })\n }\n\n dispatch (opts, handler) {\n const headers = buildHeaders(opts.headers)\n throwIfProxyAuthIsSent(headers)\n\n if (headers && !('host' in headers) && !('Host' in headers)) {\n const { host } = new URL(opts.origin)\n headers.host = host\n }\n\n return this[kAgent].dispatch(\n {\n ...opts,\n headers\n },\n handler\n )\n }\n\n /**\n * @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts\n * @returns {URL}\n */\n #getUrl (opts) {\n if (typeof opts === 'string') {\n return new URL(opts)\n } else if (opts instanceof URL) {\n return opts\n } else {\n return new URL(opts.uri)\n }\n }\n\n [kClose] () {\n const promises = [this[kAgent].close()]\n if (this[kClient]) {\n promises.push(this[kClient].close())\n }\n return Promise.all(promises)\n }\n\n [kDestroy] () {\n const promises = [this[kAgent].destroy()]\n if (this[kClient]) {\n promises.push(this[kClient].destroy())\n }\n return Promise.all(promises)\n }\n}\n\n/**\n * @param {string[] | Record} headers\n * @returns {Record}\n */\nfunction buildHeaders (headers) {\n // When using undici.fetch, the headers list is stored\n // as an array.\n if (Array.isArray(headers)) {\n /** @type {Record} */\n const headersPair = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n headersPair[headers[i]] = headers[i + 1]\n }\n\n return headersPair\n }\n\n return headers\n}\n\n/**\n * @param {Record} headers\n *\n * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers\n * Nevertheless, it was changed and to avoid a security vulnerability by end users\n * this check was created.\n * It should be removed in the next major version for performance reasons\n */\nfunction throwIfProxyAuthIsSent (headers) {\n const existProxyAuth = headers && Object.keys(headers)\n .find((key) => key.toLowerCase() === 'proxy-authorization')\n if (existProxyAuth) {\n throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')\n }\n}\n\nmodule.exports = ProxyAgent\n","'use strict'\n\nconst DispatcherBase = require('./dispatcher-base')\nconst { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = require('../core/symbols')\nconst ProxyAgent = require('./proxy-agent')\nconst Agent = require('./agent')\n\nconst DEFAULT_PORTS = {\n 'http:': 80,\n 'https:': 443\n}\n\nclass EnvHttpProxyAgent extends DispatcherBase {\n #noProxyValue = null\n #noProxyEntries = null\n #opts = null\n\n constructor (opts = {}) {\n super()\n this.#opts = opts\n\n const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts\n\n this[kNoProxyAgent] = new Agent(agentOpts)\n\n const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY\n if (HTTP_PROXY) {\n this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY })\n } else {\n this[kHttpProxyAgent] = this[kNoProxyAgent]\n }\n\n const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY\n if (HTTPS_PROXY) {\n this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY })\n } else {\n this[kHttpsProxyAgent] = this[kHttpProxyAgent]\n }\n\n this.#parseNoProxy()\n }\n\n [kDispatch] (opts, handler) {\n const url = new URL(opts.origin)\n const agent = this.#getProxyAgentForUrl(url)\n return agent.dispatch(opts, handler)\n }\n\n [kClose] () {\n return Promise.all([\n this[kNoProxyAgent].close(),\n !this[kHttpProxyAgent][kClosed] && this[kHttpProxyAgent].close(),\n !this[kHttpsProxyAgent][kClosed] && this[kHttpsProxyAgent].close()\n ])\n }\n\n [kDestroy] (err) {\n return Promise.all([\n this[kNoProxyAgent].destroy(err),\n !this[kHttpProxyAgent][kDestroyed] && this[kHttpProxyAgent].destroy(err),\n !this[kHttpsProxyAgent][kDestroyed] && this[kHttpsProxyAgent].destroy(err)\n ])\n }\n\n #getProxyAgentForUrl (url) {\n let { protocol, host: hostname, port } = url\n\n // Stripping ports in this way instead of using parsedUrl.hostname to make\n // sure that the brackets around IPv6 addresses are kept.\n hostname = hostname.replace(/:\\d*$/, '').toLowerCase()\n port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0\n if (!this.#shouldProxy(hostname, port)) {\n return this[kNoProxyAgent]\n }\n if (protocol === 'https:') {\n return this[kHttpsProxyAgent]\n }\n return this[kHttpProxyAgent]\n }\n\n #shouldProxy (hostname, port) {\n if (this.#noProxyChanged) {\n this.#parseNoProxy()\n }\n\n if (this.#noProxyEntries.length === 0) {\n return true // Always proxy if NO_PROXY is not set or empty.\n }\n if (this.#noProxyValue === '*') {\n return false // Never proxy if wildcard is set.\n }\n\n for (let i = 0; i < this.#noProxyEntries.length; i++) {\n const entry = this.#noProxyEntries[i]\n if (entry.port && entry.port !== port) {\n continue // Skip if ports don't match.\n }\n // Don't proxy if the hostname is equal with the no_proxy host.\n if (hostname === entry.hostname) {\n return false\n }\n // Don't proxy if the hostname is the subdomain of the no_proxy host.\n // Reference - https://github.com/denoland/deno/blob/6fbce91e40cc07fc6da74068e5cc56fdd40f7b4c/ext/fetch/proxy.rs#L485\n if (hostname.slice(-(entry.hostname.length + 1)) === `.${entry.hostname}`) {\n return false\n }\n }\n\n return true\n }\n\n #parseNoProxy () {\n const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv\n const noProxySplit = noProxyValue.split(/[,\\s]/)\n const noProxyEntries = []\n\n for (let i = 0; i < noProxySplit.length; i++) {\n const entry = noProxySplit[i]\n if (!entry) {\n continue\n }\n const parsed = entry.match(/^(.+):(\\d+)$/)\n noProxyEntries.push({\n // strip leading dot or asterisk with dot\n hostname: (parsed ? parsed[1] : entry).replace(/^\\*?\\./, '').toLowerCase(),\n port: parsed ? Number.parseInt(parsed[2], 10) : 0\n })\n }\n\n this.#noProxyValue = noProxyValue\n this.#noProxyEntries = noProxyEntries\n }\n\n get #noProxyChanged () {\n if (this.#opts.noProxy !== undefined) {\n return false\n }\n return this.#noProxyValue !== this.#noProxyEnv\n }\n\n get #noProxyEnv () {\n return process.env.no_proxy ?? process.env.NO_PROXY ?? ''\n }\n}\n\nmodule.exports = EnvHttpProxyAgent\n","'use strict'\nconst assert = require('node:assert')\n\nconst { kRetryHandlerDefaultRetry } = require('../core/symbols')\nconst { RequestRetryError } = require('../core/errors')\nconst {\n isDisturbed,\n parseRangeHeader,\n wrapRequestBody\n} = require('../core/util')\n\nfunction calculateRetryAfterHeader (retryAfter) {\n const retryTime = new Date(retryAfter).getTime()\n return isNaN(retryTime) ? 0 : retryTime - Date.now()\n}\n\nclass RetryHandler {\n constructor (opts, { dispatch, handler }) {\n const { retryOptions, ...dispatchOpts } = opts\n const {\n // Retry scoped\n retry: retryFn,\n maxRetries,\n maxTimeout,\n minTimeout,\n timeoutFactor,\n // Response scoped\n methods,\n errorCodes,\n retryAfter,\n statusCodes,\n throwOnError\n } = retryOptions ?? {}\n\n this.error = null\n this.dispatch = dispatch\n this.handler = handler\n this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }\n this.retryOpts = {\n throwOnError: throwOnError ?? true,\n retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],\n retryAfter: retryAfter ?? true,\n maxTimeout: maxTimeout ?? 30 * 1000, // 30s,\n minTimeout: minTimeout ?? 500, // .5s\n timeoutFactor: timeoutFactor ?? 2,\n maxRetries: maxRetries ?? 5,\n // What errors we should retry\n methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],\n // Indicates which errors to retry\n statusCodes: statusCodes ?? [500, 502, 503, 504, 429],\n // List of errors to retry\n errorCodes: errorCodes ?? [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'EHOSTDOWN',\n 'EHOSTUNREACH',\n 'EPIPE',\n 'UND_ERR_SOCKET'\n ]\n }\n\n this.retryCount = 0\n this.retryCountCheckpoint = 0\n this.headersSent = false\n this.start = 0\n this.end = null\n this.etag = null\n }\n\n onResponseStartWithRetry (controller, statusCode, headers, statusMessage, err) {\n if (this.retryOpts.throwOnError) {\n // Preserve old behavior for status codes that are not eligible for retry\n if (this.retryOpts.statusCodes.includes(statusCode) === false) {\n this.headersSent = true\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n } else {\n this.error = err\n }\n\n return\n }\n\n if (isDisturbed(this.opts.body)) {\n this.headersSent = true\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n return\n }\n\n function shouldRetry (passedErr) {\n if (passedErr) {\n this.headersSent = true\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n controller.resume()\n return\n }\n\n this.error = err\n controller.resume()\n }\n\n controller.pause()\n this.retryOpts.retry(\n err,\n {\n state: { counter: this.retryCount },\n opts: { retryOptions: this.retryOpts, ...this.opts }\n },\n shouldRetry.bind(this)\n )\n }\n\n onRequestStart (controller, context) {\n if (!this.headersSent) {\n this.handler.onRequestStart?.(controller, context)\n }\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {\n const { statusCode, code, headers } = err\n const { method, retryOptions } = opts\n const {\n maxRetries,\n minTimeout,\n maxTimeout,\n timeoutFactor,\n statusCodes,\n errorCodes,\n methods\n } = retryOptions\n const { counter } = state\n\n // Any code that is not a Undici's originated and allowed to retry\n if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) {\n cb(err)\n return\n }\n\n // If a set of method are provided and the current method is not in the list\n if (Array.isArray(methods) && !methods.includes(method)) {\n cb(err)\n return\n }\n\n // If a set of status code are provided and the current status code is not in the list\n if (\n statusCode != null &&\n Array.isArray(statusCodes) &&\n !statusCodes.includes(statusCode)\n ) {\n cb(err)\n return\n }\n\n // If we reached the max number of retries\n if (counter > maxRetries) {\n cb(err)\n return\n }\n\n let retryAfterHeader = headers?.['retry-after']\n if (retryAfterHeader) {\n retryAfterHeader = Number(retryAfterHeader)\n retryAfterHeader = Number.isNaN(retryAfterHeader)\n ? calculateRetryAfterHeader(headers['retry-after'])\n : retryAfterHeader * 1e3 // Retry-After is in seconds\n }\n\n const retryTimeout =\n retryAfterHeader > 0\n ? Math.min(retryAfterHeader, maxTimeout)\n : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)\n\n setTimeout(() => cb(null), retryTimeout)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n this.error = null\n this.retryCount += 1\n\n if (statusCode >= 300) {\n const err = new RequestRetryError('Request failed', statusCode, {\n headers,\n data: {\n count: this.retryCount\n }\n })\n\n this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err)\n return\n }\n\n // Checkpoint for resume from where we left it\n if (this.headersSent) {\n // Only Partial Content 206 supposed to provide Content-Range,\n // any other status code that partially consumed the payload\n // should not be retried because it would result in downstream\n // wrongly concatenate multiple responses.\n if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) {\n throw new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n\n const contentRange = parseRangeHeader(headers['content-range'])\n // If no content range\n if (!contentRange) {\n // We always throw here as we want to indicate that we entred unexpected path\n throw new RequestRetryError('Content-Range mismatch', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n\n // Let's start with a weak etag check\n if (this.etag != null && this.etag !== headers.etag) {\n // We always throw here as we want to indicate that we entred unexpected path\n throw new RequestRetryError('ETag mismatch', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n\n const { start, size, end = size ? size - 1 : null } = contentRange\n\n assert(this.start === start, 'content-range mismatch')\n assert(this.end == null || this.end === end, 'content-range mismatch')\n\n return\n }\n\n if (this.end == null) {\n if (statusCode === 206) {\n // First time we receive 206\n const range = parseRangeHeader(headers['content-range'])\n\n if (range == null) {\n this.headersSent = true\n this.handler.onResponseStart?.(\n controller,\n statusCode,\n headers,\n statusMessage\n )\n return\n }\n\n const { start, size, end = size ? size - 1 : null } = range\n assert(\n start != null && Number.isFinite(start),\n 'content-range mismatch'\n )\n assert(end != null && Number.isFinite(end), 'invalid content-length')\n\n this.start = start\n this.end = end\n }\n\n // We make our best to checkpoint the body for further range headers\n if (this.end == null) {\n const contentLength = headers['content-length']\n this.end = contentLength != null ? Number(contentLength) - 1 : null\n }\n\n assert(Number.isFinite(this.start))\n assert(\n this.end == null || Number.isFinite(this.end),\n 'invalid content-length'\n )\n\n this.resume = true\n this.etag = headers.etag != null ? headers.etag : null\n\n // Weak etags are not useful for comparison nor cache\n // for instance not safe to assume if the response is byte-per-byte\n // equal\n if (\n this.etag != null &&\n this.etag[0] === 'W' &&\n this.etag[1] === '/'\n ) {\n this.etag = null\n }\n\n this.headersSent = true\n this.handler.onResponseStart?.(\n controller,\n statusCode,\n headers,\n statusMessage\n )\n } else {\n throw new RequestRetryError('Request failed', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.error) {\n return\n }\n\n this.start += chunk.length\n\n this.handler.onResponseData?.(controller, chunk)\n }\n\n onResponseEnd (controller, trailers) {\n if (this.error && this.retryOpts.throwOnError) {\n throw this.error\n }\n\n if (!this.error) {\n this.retryCount = 0\n return this.handler.onResponseEnd?.(controller, trailers)\n }\n\n this.retry(controller)\n }\n\n retry (controller) {\n if (this.start !== 0) {\n const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }\n\n // Weak etag check - weak etags will make comparison algorithms never match\n if (this.etag != null) {\n headers['if-match'] = this.etag\n }\n\n this.opts = {\n ...this.opts,\n headers: {\n ...this.opts.headers,\n ...headers\n }\n }\n }\n\n try {\n this.retryCountCheckpoint = this.retryCount\n this.dispatch(this.opts, this)\n } catch (err) {\n this.handler.onResponseError?.(controller, err)\n }\n }\n\n onResponseError (controller, err) {\n if (controller?.aborted || isDisturbed(this.opts.body)) {\n this.handler.onResponseError?.(controller, err)\n return\n }\n\n function shouldRetry (returnedErr) {\n if (!returnedErr) {\n this.retry(controller)\n return\n }\n\n this.handler?.onResponseError?.(controller, returnedErr)\n }\n\n // We reconcile in case of a mix between network errors\n // and server error response\n if (this.retryCount - this.retryCountCheckpoint > 0) {\n // We count the difference between the last checkpoint and the current retry count\n this.retryCount =\n this.retryCountCheckpoint +\n (this.retryCount - this.retryCountCheckpoint)\n } else {\n this.retryCount += 1\n }\n\n this.retryOpts.retry(\n err,\n {\n state: { counter: this.retryCount },\n opts: { retryOptions: this.retryOpts, ...this.opts }\n },\n shouldRetry.bind(this)\n )\n }\n}\n\nmodule.exports = RetryHandler\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst RetryHandler = require('../handler/retry-handler')\n\nclass RetryAgent extends Dispatcher {\n #agent = null\n #options = null\n constructor (agent, options = {}) {\n super(options)\n this.#agent = agent\n this.#options = options\n }\n\n dispatch (opts, handler) {\n const retry = new RetryHandler({\n ...opts,\n retryOptions: this.#options\n }, {\n dispatch: this.#agent.dispatch.bind(this.#agent),\n handler\n })\n return this.#agent.dispatch(opts, retry)\n }\n\n close () {\n return this.#agent.close()\n }\n\n destroy () {\n return this.#agent.destroy()\n }\n}\n\nmodule.exports = RetryAgent\n","'use strict'\n\nconst { InvalidArgumentError } = require('../core/errors')\nconst Client = require('./client')\n\nclass H2CClient extends Client {\n constructor (origin, clientOpts) {\n if (typeof origin === 'string') {\n origin = new URL(origin)\n }\n\n if (origin.protocol !== 'http:') {\n throw new InvalidArgumentError(\n 'h2c-client: Only h2c protocol is supported'\n )\n }\n\n const { maxConcurrentStreams, pipelining, ...opts } =\n clientOpts ?? {}\n let defaultMaxConcurrentStreams = 100\n let defaultPipelining = 100\n\n if (\n maxConcurrentStreams != null &&\n Number.isInteger(maxConcurrentStreams) &&\n maxConcurrentStreams > 0\n ) {\n defaultMaxConcurrentStreams = maxConcurrentStreams\n }\n\n if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) {\n defaultPipelining = pipelining\n }\n\n if (defaultPipelining > defaultMaxConcurrentStreams) {\n throw new InvalidArgumentError(\n 'h2c-client: pipelining cannot be greater than maxConcurrentStreams'\n )\n }\n\n super(origin, {\n ...opts,\n maxConcurrentStreams: defaultMaxConcurrentStreams,\n pipelining: defaultPipelining,\n allowH2: true,\n useH2c: true\n })\n }\n}\n\nmodule.exports = H2CClient\n","'use strict'\n\nconst assert = require('node:assert')\nconst { Readable } = require('node:stream')\nconst { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require('../core/errors')\nconst util = require('../core/util')\nconst { ReadableStreamFrom } = require('../core/util')\n\nconst kConsume = Symbol('kConsume')\nconst kReading = Symbol('kReading')\nconst kBody = Symbol('kBody')\nconst kAbort = Symbol('kAbort')\nconst kContentType = Symbol('kContentType')\nconst kContentLength = Symbol('kContentLength')\nconst kUsed = Symbol('kUsed')\nconst kBytesRead = Symbol('kBytesRead')\n\nconst noop = () => {}\n\n/**\n * @class\n * @extends {Readable}\n * @see https://fetch.spec.whatwg.org/#body\n */\nclass BodyReadable extends Readable {\n /**\n * @param {object} opts\n * @param {(this: Readable, size: number) => void} opts.resume\n * @param {() => (void | null)} opts.abort\n * @param {string} [opts.contentType = '']\n * @param {number} [opts.contentLength]\n * @param {number} [opts.highWaterMark = 64 * 1024]\n */\n constructor ({\n resume,\n abort,\n contentType = '',\n contentLength,\n highWaterMark = 64 * 1024 // Same as nodejs fs streams.\n }) {\n super({\n autoDestroy: true,\n read: resume,\n highWaterMark\n })\n\n this._readableState.dataEmitted = false\n\n this[kAbort] = abort\n\n /** @type {Consume | null} */\n this[kConsume] = null\n\n /** @type {number} */\n this[kBytesRead] = 0\n\n /** @type {ReadableStream|null} */\n this[kBody] = null\n\n /** @type {boolean} */\n this[kUsed] = false\n\n /** @type {string} */\n this[kContentType] = contentType\n\n /** @type {number|null} */\n this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null\n\n /**\n * Is stream being consumed through Readable API?\n * This is an optimization so that we avoid checking\n * for 'data' and 'readable' listeners in the hot path\n * inside push().\n *\n * @type {boolean}\n */\n this[kReading] = false\n }\n\n /**\n * @param {Error|null} err\n * @param {(error:(Error|null)) => void} callback\n * @returns {void}\n */\n _destroy (err, callback) {\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (err) {\n this[kAbort]()\n }\n\n // Workaround for Node \"bug\". If the stream is destroyed in same\n // tick as it is created, then a user who is waiting for a\n // promise (i.e micro tick) for installing an 'error' listener will\n // never get a chance and will always encounter an unhandled exception.\n if (!this[kUsed]) {\n setImmediate(callback, err)\n } else {\n callback(err)\n }\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n on (event, listener) {\n if (event === 'data' || event === 'readable') {\n this[kReading] = true\n this[kUsed] = true\n }\n return super.on(event, listener)\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n addListener (event, listener) {\n return this.on(event, listener)\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n off (event, listener) {\n const ret = super.off(event, listener)\n if (event === 'data' || event === 'readable') {\n this[kReading] = (\n this.listenerCount('data') > 0 ||\n this.listenerCount('readable') > 0\n )\n }\n return ret\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n removeListener (event, listener) {\n return this.off(event, listener)\n }\n\n /**\n * @param {Buffer|null} chunk\n * @returns {boolean}\n */\n push (chunk) {\n if (chunk) {\n this[kBytesRead] += chunk.length\n if (this[kConsume]) {\n consumePush(this[kConsume], chunk)\n return this[kReading] ? super.push(chunk) : true\n }\n }\n\n return super.push(chunk)\n }\n\n /**\n * Consumes and returns the body as a string.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-text\n * @returns {Promise}\n */\n text () {\n return consume(this, 'text')\n }\n\n /**\n * Consumes and returns the body as a JavaScript Object.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-json\n * @returns {Promise}\n */\n json () {\n return consume(this, 'json')\n }\n\n /**\n * Consumes and returns the body as a Blob\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-blob\n * @returns {Promise}\n */\n blob () {\n return consume(this, 'blob')\n }\n\n /**\n * Consumes and returns the body as an Uint8Array.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-bytes\n * @returns {Promise}\n */\n bytes () {\n return consume(this, 'bytes')\n }\n\n /**\n * Consumes and returns the body as an ArrayBuffer.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-arraybuffer\n * @returns {Promise}\n */\n arrayBuffer () {\n return consume(this, 'arrayBuffer')\n }\n\n /**\n * Not implemented\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-formdata\n * @throws {NotSupportedError}\n */\n async formData () {\n // TODO: Implement.\n throw new NotSupportedError()\n }\n\n /**\n * Returns true if the body is not null and the body has been consumed.\n * Otherwise, returns false.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-bodyused\n * @readonly\n * @returns {boolean}\n */\n get bodyUsed () {\n return util.isDisturbed(this)\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#dom-body-body\n * @readonly\n * @returns {ReadableStream}\n */\n get body () {\n if (!this[kBody]) {\n this[kBody] = ReadableStreamFrom(this)\n if (this[kConsume]) {\n // TODO: Is this the best way to force a lock?\n this[kBody].getReader() // Ensure stream is locked.\n assert(this[kBody].locked)\n }\n }\n return this[kBody]\n }\n\n /**\n * Dumps the response body by reading `limit` number of bytes.\n * @param {object} opts\n * @param {number} [opts.limit = 131072] Number of bytes to read.\n * @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump.\n * @returns {Promise}\n */\n dump (opts) {\n const signal = opts?.signal\n\n if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) {\n return Promise.reject(new InvalidArgumentError('signal must be an AbortSignal'))\n }\n\n const limit = opts?.limit && Number.isFinite(opts.limit)\n ? opts.limit\n : 128 * 1024\n\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new AbortError())\n }\n\n if (this._readableState.closeEmitted) {\n return Promise.resolve(null)\n }\n\n return new Promise((resolve, reject) => {\n if (\n (this[kContentLength] && (this[kContentLength] > limit)) ||\n this[kBytesRead] > limit\n ) {\n this.destroy(new AbortError())\n }\n\n if (signal) {\n const onAbort = () => {\n this.destroy(signal.reason ?? new AbortError())\n }\n signal.addEventListener('abort', onAbort)\n this\n .on('close', function () {\n signal.removeEventListener('abort', onAbort)\n if (signal.aborted) {\n reject(signal.reason ?? new AbortError())\n } else {\n resolve(null)\n }\n })\n } else {\n this.on('close', resolve)\n }\n\n this\n .on('error', noop)\n .on('data', () => {\n if (this[kBytesRead] > limit) {\n this.destroy()\n }\n })\n .resume()\n })\n }\n\n /**\n * @param {BufferEncoding} encoding\n * @returns {this}\n */\n setEncoding (encoding) {\n if (Buffer.isEncoding(encoding)) {\n this._readableState.encoding = encoding\n }\n return this\n }\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestream-locked\n * @param {BodyReadable} bodyReadable\n * @returns {boolean}\n */\nfunction isLocked (bodyReadable) {\n // Consume is an implicit lock.\n return bodyReadable[kBody]?.locked === true || bodyReadable[kConsume] !== null\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-unusable\n * @param {BodyReadable} bodyReadable\n * @returns {boolean}\n */\nfunction isUnusable (bodyReadable) {\n return util.isDisturbed(bodyReadable) || isLocked(bodyReadable)\n}\n\n/**\n * @typedef {'text' | 'json' | 'blob' | 'bytes' | 'arrayBuffer'} ConsumeType\n */\n\n/**\n * @template {ConsumeType} T\n * @typedef {T extends 'text' ? string :\n * T extends 'json' ? unknown :\n * T extends 'blob' ? Blob :\n * T extends 'arrayBuffer' ? ArrayBuffer :\n * T extends 'bytes' ? Uint8Array :\n * never\n * } ConsumeReturnType\n */\n/**\n * @typedef {object} Consume\n * @property {ConsumeType} type\n * @property {BodyReadable} stream\n * @property {((value?: any) => void)} resolve\n * @property {((err: Error) => void)} reject\n * @property {number} length\n * @property {Buffer[]} body\n */\n\n/**\n * @template {ConsumeType} T\n * @param {BodyReadable} stream\n * @param {T} type\n * @returns {Promise>}\n */\nfunction consume (stream, type) {\n assert(!stream[kConsume])\n\n return new Promise((resolve, reject) => {\n if (isUnusable(stream)) {\n const rState = stream._readableState\n if (rState.destroyed && rState.closeEmitted === false) {\n stream\n .on('error', reject)\n .on('close', () => {\n reject(new TypeError('unusable'))\n })\n } else {\n reject(rState.errored ?? new TypeError('unusable'))\n }\n } else {\n queueMicrotask(() => {\n stream[kConsume] = {\n type,\n stream,\n resolve,\n reject,\n length: 0,\n body: []\n }\n\n stream\n .on('error', function (err) {\n consumeFinish(this[kConsume], err)\n })\n .on('close', function () {\n if (this[kConsume].body !== null) {\n consumeFinish(this[kConsume], new RequestAbortedError())\n }\n })\n\n consumeStart(stream[kConsume])\n })\n }\n })\n}\n\n/**\n * @param {Consume} consume\n * @returns {void}\n */\nfunction consumeStart (consume) {\n if (consume.body === null) {\n return\n }\n\n const { _readableState: state } = consume.stream\n\n if (state.bufferIndex) {\n const start = state.bufferIndex\n const end = state.buffer.length\n for (let n = start; n < end; n++) {\n consumePush(consume, state.buffer[n])\n }\n } else {\n for (const chunk of state.buffer) {\n consumePush(consume, chunk)\n }\n }\n\n if (state.endEmitted) {\n consumeEnd(this[kConsume], this._readableState.encoding)\n } else {\n consume.stream.on('end', function () {\n consumeEnd(this[kConsume], this._readableState.encoding)\n })\n }\n\n consume.stream.resume()\n\n while (consume.stream.read() != null) {\n // Loop\n }\n}\n\n/**\n * @param {Buffer[]} chunks\n * @param {number} length\n * @param {BufferEncoding} [encoding='utf8']\n * @returns {string}\n */\nfunction chunksDecode (chunks, length, encoding) {\n if (chunks.length === 0 || length === 0) {\n return ''\n }\n const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length)\n const bufferLength = buffer.length\n\n // Skip BOM.\n const start =\n bufferLength > 2 &&\n buffer[0] === 0xef &&\n buffer[1] === 0xbb &&\n buffer[2] === 0xbf\n ? 3\n : 0\n if (!encoding || encoding === 'utf8' || encoding === 'utf-8') {\n return buffer.utf8Slice(start, bufferLength)\n } else {\n return buffer.subarray(start, bufferLength).toString(encoding)\n }\n}\n\n/**\n * @param {Buffer[]} chunks\n * @param {number} length\n * @returns {Uint8Array}\n */\nfunction chunksConcat (chunks, length) {\n if (chunks.length === 0 || length === 0) {\n return new Uint8Array(0)\n }\n if (chunks.length === 1) {\n // fast-path\n return new Uint8Array(chunks[0])\n }\n const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer)\n\n let offset = 0\n for (let i = 0; i < chunks.length; ++i) {\n const chunk = chunks[i]\n buffer.set(chunk, offset)\n offset += chunk.length\n }\n\n return buffer\n}\n\n/**\n * @param {Consume} consume\n * @param {BufferEncoding} encoding\n * @returns {void}\n */\nfunction consumeEnd (consume, encoding) {\n const { type, body, resolve, stream, length } = consume\n\n try {\n if (type === 'text') {\n resolve(chunksDecode(body, length, encoding))\n } else if (type === 'json') {\n resolve(JSON.parse(chunksDecode(body, length, encoding)))\n } else if (type === 'arrayBuffer') {\n resolve(chunksConcat(body, length).buffer)\n } else if (type === 'blob') {\n resolve(new Blob(body, { type: stream[kContentType] }))\n } else if (type === 'bytes') {\n resolve(chunksConcat(body, length))\n }\n\n consumeFinish(consume)\n } catch (err) {\n stream.destroy(err)\n }\n}\n\n/**\n * @param {Consume} consume\n * @param {Buffer} chunk\n * @returns {void}\n */\nfunction consumePush (consume, chunk) {\n consume.length += chunk.length\n consume.body.push(chunk)\n}\n\n/**\n * @param {Consume} consume\n * @param {Error} [err]\n * @returns {void}\n */\nfunction consumeFinish (consume, err) {\n if (consume.body === null) {\n return\n }\n\n if (err) {\n consume.reject(err)\n } else {\n consume.resolve()\n }\n\n // Reset the consume object to allow for garbage collection.\n consume.type = null\n consume.stream = null\n consume.resolve = null\n consume.reject = null\n consume.length = 0\n consume.body = null\n}\n\nmodule.exports = {\n Readable: BodyReadable,\n chunksDecode\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst { Readable } = require('./readable')\nconst { InvalidArgumentError, RequestAbortedError } = require('../core/errors')\nconst util = require('../core/util')\n\nfunction noop () {}\n\nclass RequestHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders, highWaterMark } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) {\n throw new InvalidArgumentError('invalid highWaterMark')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_REQUEST')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', noop), err)\n }\n throw err\n }\n\n this.method = method\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.res = null\n this.abort = null\n this.body = body\n this.trailers = {}\n this.context = null\n this.controller = null\n this.onInfo = onInfo || null\n this.highWaterMark = highWaterMark\n this.reason = null\n this.removeAbortListener = null\n\n if (signal?.aborted) {\n this.reason = signal.reason ?? new RequestAbortedError()\n } else if (signal) {\n this.removeAbortListener = util.addAbortListener(signal, () => {\n this.reason = signal.reason ?? new RequestAbortedError()\n if (this.res) {\n util.destroy(this.res.on('error', noop), this.reason)\n } else if (this.abort) {\n this.abort(this.reason)\n }\n })\n }\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.controller = controller\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart (controller, statusCode, headers, statusText) {\n const { callback, opaque, context, responseHeaders, highWaterMark } = this\n\n const rawHeaders = controller?.rawHeaders\n const responseHeaderData = responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers: responseHeaderData })\n }\n return\n }\n\n const parsedHeaders = headers\n const contentType = parsedHeaders?.['content-type']\n const contentLength = parsedHeaders?.['content-length']\n const res = new Readable({\n resume: () => controller.resume(),\n abort: (reason) => controller.abort(reason),\n contentType,\n contentLength: this.method !== 'HEAD' && contentLength\n ? Number(contentLength)\n : null,\n highWaterMark\n })\n\n if (this.removeAbortListener) {\n res.on('close', this.removeAbortListener)\n this.removeAbortListener = null\n }\n\n this.callback = null\n this.res = res\n if (callback !== null) {\n try {\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n statusText,\n headers: responseHeaderData,\n trailers: this.trailers,\n opaque,\n body: res,\n context\n })\n } catch (err) {\n // If the callback throws synchronously, we need to handle it\n // Remove reference to res to allow res being garbage collected\n this.res = null\n\n // Destroy the response stream\n util.destroy(res.on('error', noop), err)\n\n // Use queueMicrotask to re-throw the error so it reaches uncaughtException\n queueMicrotask(() => {\n throw err\n })\n }\n }\n }\n\n onResponseData (controller, chunk) {\n if (!this.res) {\n return\n }\n\n if (this.res.push(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (_controller, trailers) {\n if (trailers && typeof trailers === 'object') {\n for (const key of Object.keys(trailers)) {\n if (key === '__proto__') {\n Object.defineProperty(this.trailers, key, {\n value: trailers[key],\n enumerable: true,\n configurable: true,\n writable: true\n })\n } else {\n this.trailers[key] = trailers[key]\n }\n }\n }\n this.res?.push(null)\n }\n\n onResponseError (_controller, err) {\n const { res, callback, body, opaque } = this\n\n if (callback) {\n // TODO: Does this need queueMicrotask?\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (res) {\n this.res = null\n // Ensure all queued handlers are invoked before destroying res.\n queueMicrotask(() => {\n util.destroy(res.on('error', noop), err)\n })\n }\n\n if (body) {\n this.body = null\n\n if (util.isStream(body)) {\n body.on('error', noop)\n util.destroy(body, err)\n }\n }\n\n if (this.removeAbortListener) {\n this.removeAbortListener()\n this.removeAbortListener = null\n }\n }\n}\n\nfunction request (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n request.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const handler = new RequestHandler(opts, callback)\n\n this.dispatch(opts, handler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = request\nmodule.exports.RequestHandler = RequestHandler\n","'use strict'\n\nconst { addAbortListener } = require('../core/util')\nconst { RequestAbortedError } = require('../core/errors')\n\nconst kListener = Symbol('kListener')\nconst kSignal = Symbol('kSignal')\n\nfunction abort (self) {\n if (self.abort) {\n self.abort(self[kSignal]?.reason)\n } else {\n self.reason = self[kSignal]?.reason ?? new RequestAbortedError()\n }\n removeSignal(self)\n}\n\nfunction addSignal (self, signal) {\n self.reason = null\n\n self[kSignal] = null\n self[kListener] = null\n\n if (!signal) {\n return\n }\n\n if (signal.aborted) {\n abort(self)\n return\n }\n\n self[kSignal] = signal\n self[kListener] = () => {\n abort(self)\n }\n\n addAbortListener(self[kSignal], self[kListener])\n}\n\nfunction removeSignal (self) {\n if (!self[kSignal]) {\n return\n }\n\n if ('removeEventListener' in self[kSignal]) {\n self[kSignal].removeEventListener('abort', self[kListener])\n } else {\n self[kSignal].removeListener('abort', self[kListener])\n }\n\n self[kSignal] = null\n self[kListener] = null\n}\n\nmodule.exports = {\n addSignal,\n removeSignal\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { finished } = require('node:stream')\nconst { AsyncResource } = require('node:async_hooks')\nconst { InvalidArgumentError, InvalidReturnValueError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nfunction noop () {}\n\nclass StreamHandler extends AsyncResource {\n constructor (opts, factory, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('invalid factory')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_STREAM')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', noop), err)\n }\n throw err\n }\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.factory = factory\n this.callback = callback\n this.res = null\n this.abort = null\n this.context = null\n this.controller = null\n this.trailers = null\n this.body = body\n this.onInfo = onInfo || null\n\n if (util.isStream(body)) {\n body.on('error', (err) => {\n this.onResponseError(this.controller, err)\n })\n }\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.controller = controller\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart (controller, statusCode, headers, _statusMessage) {\n const { factory, opaque, context, responseHeaders } = this\n\n const rawHeaders = controller?.rawHeaders\n const responseHeaderData = responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers: responseHeaderData })\n }\n return\n }\n\n this.factory = null\n\n if (factory === null) {\n return\n }\n\n const res = this.runInAsyncScope(factory, null, {\n statusCode,\n headers: responseHeaderData,\n opaque,\n context\n })\n\n if (\n !res ||\n typeof res.write !== 'function' ||\n typeof res.end !== 'function' ||\n typeof res.on !== 'function'\n ) {\n throw new InvalidReturnValueError('expected Writable')\n }\n\n // TODO: Avoid finished. It registers an unnecessary amount of listeners.\n finished(res, { readable: false }, (err) => {\n const { callback, res, opaque, trailers, abort } = this\n\n this.res = null\n if (err || !res?.readable) {\n util.destroy(res, err)\n }\n\n this.callback = null\n this.runInAsyncScope(callback, null, err || null, { opaque, trailers })\n\n if (err) {\n abort()\n }\n })\n\n res.on('drain', () => controller.resume())\n\n this.res = res\n\n const needDrain = res.writableNeedDrain !== undefined\n ? res.writableNeedDrain\n : res._writableState?.needDrain\n\n if (needDrain === true) {\n controller.pause()\n }\n }\n\n onResponseData (controller, chunk) {\n const { res } = this\n\n if (!res) {\n return\n }\n\n if (res.write(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (_controller, trailers) {\n const { res } = this\n\n removeSignal(this)\n\n if (!res) {\n return\n }\n\n if (trailers && typeof trailers === 'object') {\n this.trailers = trailers\n }\n\n res.end()\n }\n\n onResponseError (_controller, err) {\n const { res, callback, opaque, body } = this\n\n removeSignal(this)\n\n this.factory = null\n\n if (res) {\n this.res = null\n util.destroy(res, err)\n } else if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (body) {\n this.body = null\n util.destroy(body, err)\n }\n }\n}\n\nfunction stream (opts, factory, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n stream.call(this, opts, factory, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const handler = new StreamHandler(opts, factory, callback)\n\n this.dispatch(opts, handler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = stream\n","'use strict'\n\nconst {\n Readable,\n Duplex,\n PassThrough\n} = require('node:stream')\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst {\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nfunction noop () {}\n\nconst kResume = Symbol('resume')\n\nclass PipelineRequest extends Readable {\n constructor () {\n super({ autoDestroy: true })\n\n this[kResume] = null\n }\n\n _read () {\n const { [kResume]: resume } = this\n\n if (resume) {\n this[kResume] = null\n resume()\n }\n }\n\n _destroy (err, callback) {\n this._read()\n\n callback(err)\n }\n}\n\nclass PipelineResponse extends Readable {\n constructor (resume) {\n super({ autoDestroy: true })\n this[kResume] = resume\n }\n\n _read () {\n this[kResume]()\n }\n\n _destroy (err, callback) {\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n callback(err)\n }\n}\n\nclass PipelineHandler extends AsyncResource {\n constructor (opts, handler) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof handler !== 'function') {\n throw new InvalidArgumentError('invalid handler')\n }\n\n const { signal, method, opaque, onInfo, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_PIPELINE')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.handler = handler\n this.abort = null\n this.context = null\n this.onInfo = onInfo || null\n\n this.req = new PipelineRequest().on('error', noop)\n\n this.ret = new Duplex({\n readableObjectMode: opts.objectMode,\n autoDestroy: true,\n read: () => {\n const { body } = this\n\n if (body?.resume) {\n body.resume()\n }\n },\n write: (chunk, encoding, callback) => {\n const { req } = this\n\n if (req.push(chunk, encoding) || req._readableState.destroyed) {\n callback()\n } else {\n req[kResume] = callback\n }\n },\n destroy: (err, callback) => {\n const { body, req, res, ret, abort } = this\n\n if (!err && !ret._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (abort && err) {\n abort()\n }\n\n util.destroy(body, err)\n util.destroy(req, err)\n util.destroy(res, err)\n\n removeSignal(this)\n\n callback(err)\n }\n }).on('prefinish', () => {\n const { req } = this\n\n // Node < 15 does not call _final in same tick.\n req.push(null)\n })\n\n this.res = null\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n const { res } = this\n\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(!res, 'pipeline cannot be retried')\n\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart (controller, statusCode, headers, _statusMessage) {\n const { opaque, handler, context } = this\n\n if (statusCode < 200) {\n if (this.onInfo) {\n const rawHeaders = controller?.rawHeaders\n const responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n this.onInfo({ statusCode, headers: responseHeaders })\n }\n return\n }\n\n this.res = new PipelineResponse(() => controller.resume())\n\n let body\n try {\n this.handler = null\n const rawHeaders = controller?.rawHeaders\n const responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n body = this.runInAsyncScope(handler, null, {\n statusCode,\n headers: responseHeaders,\n opaque,\n body: this.res,\n context\n })\n } catch (err) {\n this.res.on('error', noop)\n throw err\n }\n\n if (!body || typeof body.on !== 'function') {\n throw new InvalidReturnValueError('expected Readable')\n }\n\n body\n .on('data', (chunk) => {\n const { ret, body } = this\n\n if (!ret.push(chunk) && body.pause) {\n body.pause()\n }\n })\n .on('error', (err) => {\n const { ret } = this\n\n util.destroy(ret, err)\n })\n .on('end', () => {\n const { ret } = this\n\n ret.push(null)\n })\n .on('close', () => {\n const { ret } = this\n\n if (!ret._readableState.ended) {\n util.destroy(ret, new RequestAbortedError())\n }\n })\n\n this.body = body\n }\n\n onResponseData (controller, chunk) {\n const { res } = this\n\n if (res.push(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (_controller, _trailers) {\n const { res } = this\n res.push(null)\n }\n\n onResponseError (_controller, err) {\n const { ret } = this\n this.handler = null\n util.destroy(ret, err)\n }\n}\n\nfunction pipeline (opts, handler) {\n try {\n const pipelineHandler = new PipelineHandler(opts, handler)\n this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler)\n return pipelineHandler.ret\n } catch (err) {\n return new PassThrough().destroy(err)\n }\n}\n\nmodule.exports = pipeline\n","'use strict'\n\nconst { InvalidArgumentError, SocketError } = require('../core/errors')\nconst { AsyncResource } = require('node:async_hooks')\nconst assert = require('node:assert')\nconst util = require('../core/util')\nconst { kHTTP2Stream } = require('../core/symbols')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass UpgradeHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_UPGRADE')\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.abort = null\n this.context = null\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart () {\n throw new SocketError('bad upgrade', null)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n assert(socket[kHTTP2Stream] === true ? statusCode === 200 : statusCode === 101)\n\n const { callback, opaque, context } = this\n\n removeSignal(this)\n\n this.callback = null\n\n const rawHeaders = controller?.rawHeaders\n const responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n\n this.runInAsyncScope(callback, null, null, {\n headers: responseHeaders,\n socket,\n opaque,\n context\n })\n }\n\n onResponseError (_controller, err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction upgrade (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n upgrade.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const upgradeHandler = new UpgradeHandler(opts, callback)\n const upgradeOpts = {\n ...opts,\n method: opts.method || 'GET',\n upgrade: opts.protocol || 'Websocket'\n }\n this.dispatch(upgradeOpts, upgradeHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = upgrade\n","'use strict'\n\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst { InvalidArgumentError, SocketError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass ConnectHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_CONNECT')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.callback = callback\n this.abort = null\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart () {\n throw new SocketError('bad connect', null)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n const { callback, opaque, context } = this\n\n removeSignal(this)\n\n this.callback = null\n\n let responseHeaders = headers\n const rawHeaders = controller?.rawHeaders\n // Indicates is an HTTP2Session\n if (responseHeaders != null) {\n responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n }\n\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n headers: responseHeaders,\n socket,\n opaque,\n context\n })\n }\n\n onResponseError (_controller, err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction connect (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n connect.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const connectHandler = new ConnectHandler(opts, callback)\n const connectOptions = { ...opts, method: 'CONNECT' }\n this.dispatch(connectOptions, connectHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = connect\n","'use strict'\n\nmodule.exports.request = require('./api-request')\nmodule.exports.stream = require('./api-stream')\nmodule.exports.pipeline = require('./api-pipeline')\nmodule.exports.upgrade = require('./api-upgrade')\nmodule.exports.connect = require('./api-connect')\n","'use strict'\n\nconst { UndiciError } = require('../core/errors')\n\nconst kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED')\n\n/**\n * The request does not match any registered mock dispatches.\n */\nclass MockNotMatchedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MockNotMatchedError'\n this.message = message || 'The request does not match any registered mock dispatches'\n this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kMockNotMatchedError] === true\n }\n\n get [kMockNotMatchedError] () {\n return true\n }\n}\n\nmodule.exports = {\n MockNotMatchedError\n}\n","'use strict'\n\nmodule.exports = {\n kAgent: Symbol('agent'),\n kOptions: Symbol('options'),\n kFactory: Symbol('factory'),\n kDispatches: Symbol('dispatches'),\n kDispatchKey: Symbol('dispatch key'),\n kDefaultHeaders: Symbol('default headers'),\n kDefaultTrailers: Symbol('default trailers'),\n kContentLength: Symbol('content length'),\n kMockAgent: Symbol('mock agent'),\n kMockAgentSet: Symbol('mock agent set'),\n kMockAgentGet: Symbol('mock agent get'),\n kMockDispatch: Symbol('mock dispatch'),\n kClose: Symbol('close'),\n kOriginalClose: Symbol('original agent close'),\n kOriginalDispatch: Symbol('original dispatch'),\n kOrigin: Symbol('origin'),\n kIsMockActive: Symbol('is mock active'),\n kNetConnect: Symbol('net connect'),\n kGetNetConnect: Symbol('get net connect'),\n kConnected: Symbol('connected'),\n kIgnoreTrailingSlash: Symbol('ignore trailing slash'),\n kMockAgentMockCallHistoryInstance: Symbol('mock agent mock call history name'),\n kMockAgentRegisterCallHistory: Symbol('mock agent register mock call history'),\n kMockAgentAddCallHistoryLog: Symbol('mock agent add call history log'),\n kMockAgentIsCallHistoryEnabled: Symbol('mock agent is call history enabled'),\n kMockAgentAcceptsNonStandardSearchParameters: Symbol('mock agent accepts non standard search parameters'),\n kMockCallHistoryAddLog: Symbol('mock call history add log'),\n kTotalDispatchCount: Symbol('total dispatch count')\n}\n","'use strict'\n\nconst { MockNotMatchedError } = require('./mock-errors')\nconst {\n kDispatches,\n kMockAgent,\n kOriginalDispatch,\n kOrigin,\n kGetNetConnect,\n kTotalDispatchCount\n} = require('./mock-symbols')\nconst { serializePathWithQuery, parseHeaders } = require('../core/util')\nconst { STATUS_CODES } = require('node:http')\nconst {\n types: {\n isPromise\n }\n} = require('node:util')\nconst { InvalidArgumentError } = require('../core/errors')\n\nfunction matchValue (match, value) {\n if (typeof match === 'string') {\n return match === value\n }\n if (match instanceof RegExp) {\n return match.test(value)\n }\n if (typeof match === 'function') {\n return match(value) === true\n }\n return false\n}\n\nfunction lowerCaseEntries (headers) {\n return Object.fromEntries(\n Object.entries(headers).map(([headerName, headerValue]) => {\n return [headerName.toLocaleLowerCase(), headerValue]\n })\n )\n}\n\n/**\n * @param {import('../../index').Headers|string[]|Record} headers\n * @param {string} key\n */\nfunction getHeaderByName (headers, key) {\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {\n return headers[i + 1]\n }\n }\n\n return undefined\n } else if (typeof headers.get === 'function') {\n return headers.get(key)\n } else {\n return lowerCaseEntries(headers)[key.toLocaleLowerCase()]\n }\n}\n\n/** @param {string[]} headers */\nfunction buildHeadersFromArray (headers) { // fetch HeadersList\n const clone = headers.slice()\n const entries = []\n for (let index = 0; index < clone.length; index += 2) {\n entries.push([clone[index], clone[index + 1]])\n }\n return Object.fromEntries(entries)\n}\n\nfunction matchHeaders (mockDispatch, headers) {\n if (typeof mockDispatch.headers === 'function') {\n if (Array.isArray(headers)) { // fetch HeadersList\n headers = buildHeadersFromArray(headers)\n }\n return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})\n }\n if (typeof mockDispatch.headers === 'undefined') {\n return true\n }\n if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {\n return false\n }\n\n for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {\n const headerValue = getHeaderByName(headers, matchHeaderName)\n\n if (!matchValue(matchHeaderValue, headerValue)) {\n return false\n }\n }\n return true\n}\n\nfunction normalizeSearchParams (query) {\n if (typeof query !== 'string') {\n return query\n }\n\n const originalQp = new URLSearchParams(query)\n const normalizedQp = new URLSearchParams()\n\n for (let [key, value] of originalQp.entries()) {\n key = key.replace('[]', '')\n\n const valueRepresentsString = /^(['\"]).*\\1$/.test(value)\n if (valueRepresentsString) {\n normalizedQp.append(key, value)\n continue\n }\n\n if (value.includes(',')) {\n const values = value.split(',')\n for (const v of values) {\n normalizedQp.append(key, v)\n }\n continue\n }\n\n normalizedQp.append(key, value)\n }\n\n return normalizedQp\n}\n\nfunction safeUrl (path) {\n if (typeof path !== 'string') {\n return path\n }\n const pathSegments = path.split('?', 3)\n if (pathSegments.length !== 2) {\n return path\n }\n\n const qp = new URLSearchParams(pathSegments.pop())\n qp.sort()\n return [...pathSegments, qp.toString()].join('?')\n}\n\nfunction matchKey (mockDispatch, { path, method, body, headers }) {\n const pathMatch = matchValue(mockDispatch.path, path)\n const methodMatch = matchValue(mockDispatch.method, method)\n const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true\n const headersMatch = matchHeaders(mockDispatch, headers)\n return pathMatch && methodMatch && bodyMatch && headersMatch\n}\n\nfunction getResponseData (data) {\n if (Buffer.isBuffer(data)) {\n return data\n } else if (data instanceof Uint8Array) {\n return data\n } else if (data instanceof ArrayBuffer) {\n return data\n } else if (typeof data === 'object') {\n return JSON.stringify(data)\n } else if (data) {\n return data.toString()\n } else {\n return ''\n }\n}\n\nfunction getMockDispatch (mockDispatches, key) {\n const basePath = key.query ? serializePathWithQuery(key.path, key.query) : key.path\n const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath\n\n const resolvedPathWithoutTrailingSlash = removeTrailingSlash(resolvedPath)\n\n // Match path\n let matchedMockDispatches = mockDispatches\n .filter(({ consumed }) => !consumed)\n .filter(({ path, ignoreTrailingSlash }) => {\n return ignoreTrailingSlash\n ? matchValue(removeTrailingSlash(safeUrl(path)), resolvedPathWithoutTrailingSlash)\n : matchValue(safeUrl(path), resolvedPath)\n })\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)\n }\n\n // Match method\n matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`)\n }\n\n // Match body\n matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true)\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`)\n }\n\n // Match headers\n matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers))\n if (matchedMockDispatches.length === 0) {\n const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers\n throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`)\n }\n\n return matchedMockDispatches[0]\n}\n\nfunction addMockDispatch (mockDispatches, key, data, opts) {\n const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false, ...opts }\n const replyData = typeof data === 'function' ? { callback: data } : { ...data }\n const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }\n mockDispatches.push(newMockDispatch)\n // Track total number of intercepts ever registered for better error messages\n mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1\n return newMockDispatch\n}\n\nfunction deleteMockDispatch (mockDispatches, key) {\n const index = mockDispatches.findIndex(dispatch => {\n if (!dispatch.consumed) {\n return false\n }\n return matchKey(dispatch, key)\n })\n if (index !== -1) {\n mockDispatches.splice(index, 1)\n }\n}\n\n/**\n * @param {string} path Path to remove trailing slash from\n */\nfunction removeTrailingSlash (path) {\n while (path.endsWith('/')) {\n path = path.slice(0, -1)\n }\n\n if (path.length === 0) {\n path = '/'\n }\n\n return path\n}\n\nfunction buildKey (opts) {\n const { path, method, body, headers, query } = opts\n\n return {\n path,\n method,\n body,\n headers,\n query\n }\n}\n\nfunction generateKeyValues (data) {\n const keys = Object.keys(data)\n const result = []\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i]\n const value = data[key]\n const name = Buffer.from(`${key}`)\n if (Array.isArray(value)) {\n for (let j = 0; j < value.length; ++j) {\n result.push(name, Buffer.from(`${value[j]}`))\n }\n } else {\n result.push(name, Buffer.from(`${value}`))\n }\n }\n return result\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n * @param {number} statusCode\n */\nfunction getStatusText (statusCode) {\n return STATUS_CODES[statusCode] || 'unknown'\n}\n\nasync function getResponse (body) {\n const buffers = []\n for await (const data of body) {\n buffers.push(data)\n }\n return Buffer.concat(buffers).toString('utf8')\n}\n\n/**\n * Mock dispatch function used to simulate undici dispatches\n */\nfunction mockDispatch (opts, handler) {\n // Get mock dispatch from built key\n const key = buildKey(opts)\n const mockDispatch = getMockDispatch(this[kDispatches], key)\n\n mockDispatch.timesInvoked++\n\n // Here's where we resolve a callback if a callback is present for the dispatch data.\n if (mockDispatch.data.callback) {\n mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }\n }\n\n // Parse mockDispatch data\n const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch\n const { timesInvoked, times } = mockDispatch\n\n // If it's used up and not persistent, mark as consumed\n mockDispatch.consumed = !persist && timesInvoked >= times\n mockDispatch.pending = timesInvoked < times\n\n // If specified, trigger dispatch error\n if (error !== null) {\n deleteMockDispatch(this[kDispatches], key)\n handler.onResponseError(null, error)\n return true\n }\n\n // Track whether the request has been aborted\n let aborted = false\n let timer = null\n\n // Create the controller early so abort can use it\n const controller = {\n paused: false,\n rawHeaders: null,\n rawTrailers: null,\n pause () {\n this.paused = true\n },\n resume () {\n this.paused = false\n },\n abort: (reason) => {\n if (aborted) {\n return\n }\n aborted = true\n\n // Clear the pending delayed response if any\n if (timer !== null) {\n clearTimeout(timer)\n timer = null\n }\n\n handler.onResponseError?.(controller, reason)\n }\n }\n\n // Call onRequestStart to allow the handler to receive the controller\n handler.onRequestStart?.(controller, null)\n\n // Handle the request with a delay if necessary\n if (typeof delay === 'number' && delay > 0) {\n timer = setTimeout(() => {\n timer = null\n handleReply(this[kDispatches])\n }, delay)\n } else {\n handleReply(this[kDispatches])\n }\n\n function handleReply (mockDispatches, _data = data) {\n // Don't send response if the request was aborted\n if (aborted) {\n return\n }\n\n // fetch's HeadersList is a 1D string array\n const optsHeaders = Array.isArray(opts.headers)\n ? buildHeadersFromArray(opts.headers)\n : opts.headers\n const body = typeof _data === 'function'\n ? _data({ ...opts, headers: optsHeaders })\n : _data\n\n // util.types.isPromise is likely needed for jest.\n if (isPromise(body)) {\n // If handleReply is asynchronous, throwing an error\n // in the callback will reject the promise, rather than\n // synchronously throw the error, which breaks some tests.\n // Rather, we wait for the callback to resolve if it is a\n // promise, and then re-run handleReply with the new body.\n return body.then((newData) => handleReply(mockDispatches, newData))\n }\n\n // Check again if aborted after async body resolution\n if (aborted) {\n return\n }\n\n const responseData = getResponseData(body)\n const responseHeaders = generateKeyValues(headers)\n const responseTrailers = generateKeyValues(trailers)\n\n // Update the controller with response data\n controller.rawHeaders = responseHeaders\n controller.rawTrailers = responseTrailers\n\n handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode))\n handler.onResponseData?.(controller, Buffer.from(responseData))\n handler.onResponseEnd?.(controller, parseHeaders(responseTrailers))\n deleteMockDispatch(mockDispatches, key)\n }\n\n return true\n}\n\nfunction buildMockDispatch () {\n const agent = this[kMockAgent]\n const origin = this[kOrigin]\n const originalDispatch = this[kOriginalDispatch]\n\n return function dispatch (opts, handler) {\n if (agent.isMockActive) {\n try {\n mockDispatch.call(this, opts, handler)\n } catch (error) {\n if (error.code === 'UND_MOCK_ERR_MOCK_NOT_MATCHED') {\n const netConnect = agent[kGetNetConnect]()\n const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length\n const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length\n const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`\n if (netConnect === false) {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`)\n }\n if (checkNetConnect(netConnect, origin)) {\n originalDispatch.call(this, opts, handler)\n } else {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`)\n }\n } else {\n throw error\n }\n }\n } else {\n originalDispatch.call(this, opts, handler)\n }\n }\n}\n\nfunction checkNetConnect (netConnect, origin) {\n const url = new URL(origin)\n if (netConnect === true) {\n return true\n } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {\n return true\n }\n return false\n}\n\nfunction normalizeOrigin (origin) {\n if (typeof origin !== 'string' && !(origin instanceof URL)) {\n return origin\n }\n\n if (origin instanceof URL) {\n return origin.origin\n }\n\n return origin.toLowerCase()\n}\n\nfunction buildAndValidateMockOptions (opts) {\n const { agent, ...mockOptions } = opts\n\n if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== 'boolean') {\n throw new InvalidArgumentError('options.enableCallHistory must to be a boolean')\n }\n\n if ('acceptNonStandardSearchParameters' in mockOptions && typeof mockOptions.acceptNonStandardSearchParameters !== 'boolean') {\n throw new InvalidArgumentError('options.acceptNonStandardSearchParameters must to be a boolean')\n }\n\n if ('ignoreTrailingSlash' in mockOptions && typeof mockOptions.ignoreTrailingSlash !== 'boolean') {\n throw new InvalidArgumentError('options.ignoreTrailingSlash must to be a boolean')\n }\n\n return mockOptions\n}\n\nmodule.exports = {\n getResponseData,\n getMockDispatch,\n addMockDispatch,\n deleteMockDispatch,\n buildKey,\n generateKeyValues,\n matchValue,\n getResponse,\n getStatusText,\n mockDispatch,\n buildMockDispatch,\n checkNetConnect,\n buildAndValidateMockOptions,\n getHeaderByName,\n buildHeadersFromArray,\n normalizeSearchParams,\n normalizeOrigin\n}\n","'use strict'\n\nconst { getResponseData, buildKey, addMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kDispatchKey,\n kDefaultHeaders,\n kDefaultTrailers,\n kContentLength,\n kMockDispatch,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { serializePathWithQuery } = require('../core/util')\n\n/**\n * Defines the scope API for an interceptor reply\n */\nclass MockScope {\n constructor (mockDispatch) {\n this[kMockDispatch] = mockDispatch\n }\n\n /**\n * Delay a reply by a set amount in ms.\n */\n delay (waitInMs) {\n if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) {\n throw new InvalidArgumentError('waitInMs must be a valid integer > 0')\n }\n\n this[kMockDispatch].delay = waitInMs\n return this\n }\n\n /**\n * For a defined reply, never mark as consumed.\n */\n persist () {\n this[kMockDispatch].persist = true\n return this\n }\n\n /**\n * Allow one to define a reply for a set amount of matching requests.\n */\n times (repeatTimes) {\n if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) {\n throw new InvalidArgumentError('repeatTimes must be a valid integer > 0')\n }\n\n this[kMockDispatch].times = repeatTimes\n return this\n }\n}\n\n/**\n * Defines an interceptor for a Mock\n */\nclass MockInterceptor {\n constructor (opts, mockDispatches) {\n if (typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object')\n }\n if (typeof opts.path === 'undefined') {\n throw new InvalidArgumentError('opts.path must be defined')\n }\n if (typeof opts.method === 'undefined') {\n opts.method = 'GET'\n }\n // See https://github.com/nodejs/undici/issues/1245\n // As per RFC 3986, clients are not supposed to send URI\n // fragments to servers when they retrieve a document,\n if (typeof opts.path === 'string') {\n if (opts.query) {\n opts.path = serializePathWithQuery(opts.path, opts.query)\n } else {\n // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811\n const parsedURL = new URL(opts.path, 'data://')\n opts.path = parsedURL.pathname + parsedURL.search\n }\n }\n if (typeof opts.method === 'string') {\n opts.method = opts.method.toUpperCase()\n }\n\n this[kDispatchKey] = buildKey(opts)\n this[kDispatches] = mockDispatches\n this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n this[kDefaultHeaders] = {}\n this[kDefaultTrailers] = {}\n this[kContentLength] = false\n }\n\n createMockScopeDispatchData ({ statusCode, data, responseOptions }) {\n const responseData = getResponseData(data)\n const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}\n const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }\n const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }\n\n return { statusCode, data, headers, trailers }\n }\n\n validateReplyParameters (replyParameters) {\n if (typeof replyParameters.statusCode === 'undefined') {\n throw new InvalidArgumentError('statusCode must be defined')\n }\n if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) {\n throw new InvalidArgumentError('responseOptions must be an object')\n }\n }\n\n /**\n * Mock an undici request with a defined reply.\n */\n reply (replyOptionsCallbackOrStatusCode) {\n // Values of reply aren't available right now as they\n // can only be available when the reply callback is invoked.\n if (typeof replyOptionsCallbackOrStatusCode === 'function') {\n // We'll first wrap the provided callback in another function,\n // this function will properly resolve the data from the callback\n // when invoked.\n const wrappedDefaultsCallback = (opts) => {\n // Our reply options callback contains the parameter for statusCode, data and options.\n const resolvedData = replyOptionsCallbackOrStatusCode(opts)\n\n // Check if it is in the right format\n if (typeof resolvedData !== 'object' || resolvedData === null) {\n throw new InvalidArgumentError('reply options callback must return an object')\n }\n\n const replyParameters = { data: '', responseOptions: {}, ...resolvedData }\n this.validateReplyParameters(replyParameters)\n // Since the values can be obtained immediately we return them\n // from this higher order function that will be resolved later.\n return {\n ...this.createMockScopeDispatchData(replyParameters)\n }\n }\n\n // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data.\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n return new MockScope(newMockDispatch)\n }\n\n // We can have either one or three parameters, if we get here,\n // we should have 1-3 parameters. So we spread the arguments of\n // this function to obtain the parameters, since replyData will always\n // just be the statusCode.\n const replyParameters = {\n statusCode: replyOptionsCallbackOrStatusCode,\n data: arguments[1] === undefined ? '' : arguments[1],\n responseOptions: arguments[2] === undefined ? {} : arguments[2]\n }\n this.validateReplyParameters(replyParameters)\n\n // Send in-already provided data like usual\n const dispatchData = this.createMockScopeDispatchData(replyParameters)\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Mock an undici request with a defined error.\n */\n replyWithError (error) {\n if (typeof error === 'undefined') {\n throw new InvalidArgumentError('error must be defined')\n }\n\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Set default reply headers on the interceptor for subsequent replies\n */\n defaultReplyHeaders (headers) {\n if (typeof headers === 'undefined') {\n throw new InvalidArgumentError('headers must be defined')\n }\n\n this[kDefaultHeaders] = headers\n return this\n }\n\n /**\n * Set default reply trailers on the interceptor for subsequent replies\n */\n defaultReplyTrailers (trailers) {\n if (typeof trailers === 'undefined') {\n throw new InvalidArgumentError('trailers must be defined')\n }\n\n this[kDefaultTrailers] = trailers\n return this\n }\n\n /**\n * Set reply content length header for replies on the interceptor\n */\n replyContentLength () {\n this[kContentLength] = true\n return this\n }\n}\n\nmodule.exports.MockInterceptor = MockInterceptor\nmodule.exports.MockScope = MockScope\n","'use strict'\n\nconst { promisify } = require('node:util')\nconst Client = require('../dispatcher/client')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockClient provides an API that extends the Client to influence the mockDispatches.\n */\nclass MockClient extends Client {\n constructor (origin, opts) {\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n super(origin, opts)\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(\n opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts },\n this[kDispatches]\n )\n }\n\n cleanMocks () {\n this[kDispatches] = []\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockClient\n","'use strict'\n\nconst { kMockCallHistoryAddLog } = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\nfunction handleFilterCallsWithOptions (criteria, options, handler, store) {\n switch (options.operator) {\n case 'OR':\n store.push(...handler(criteria))\n\n return store\n case 'AND':\n return handler.call({ logs: store }, criteria)\n default:\n // guard -- should never happens because buildAndValidateFilterCallsOptions is called before\n throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \\'OR\\' or \\'AND\\'')\n }\n}\n\nfunction buildAndValidateFilterCallsOptions (options = {}) {\n const finalOptions = {}\n\n if ('operator' in options) {\n if (typeof options.operator !== 'string' || (options.operator.toUpperCase() !== 'OR' && options.operator.toUpperCase() !== 'AND')) {\n throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \\'OR\\' or \\'AND\\'')\n }\n\n return {\n ...finalOptions,\n operator: options.operator.toUpperCase()\n }\n }\n\n return finalOptions\n}\n\nfunction makeFilterCalls (parameterName) {\n return (parameterValue) => {\n if (typeof parameterValue === 'string' || parameterValue == null) {\n return this.logs.filter((log) => {\n return log[parameterName] === parameterValue\n })\n }\n if (parameterValue instanceof RegExp) {\n return this.logs.filter((log) => {\n return parameterValue.test(log[parameterName])\n })\n }\n\n throw new InvalidArgumentError(`${parameterName} parameter should be one of string, regexp, undefined or null`)\n }\n}\nfunction computeUrlWithMaybeSearchParameters (requestInit) {\n // path can contains query url parameters\n // or query can contains query url parameters\n try {\n const url = new URL(requestInit.path, requestInit.origin)\n\n // requestInit.path contains query url parameters\n // requestInit.query is then undefined\n if (url.search.length !== 0) {\n return url\n }\n\n // requestInit.query can be populated here\n url.search = new URLSearchParams(requestInit.query).toString()\n\n return url\n } catch (error) {\n throw new InvalidArgumentError('An error occurred when computing MockCallHistoryLog.url', { cause: error })\n }\n}\n\nclass MockCallHistoryLog {\n constructor (requestInit = {}) {\n this.body = requestInit.body\n this.headers = requestInit.headers\n this.method = requestInit.method\n\n const url = computeUrlWithMaybeSearchParameters(requestInit)\n\n this.fullUrl = url.toString()\n this.origin = url.origin\n this.path = url.pathname\n this.searchParams = Object.fromEntries(url.searchParams)\n this.protocol = url.protocol\n this.host = url.host\n this.port = url.port\n this.hash = url.hash\n }\n\n toMap () {\n return new Map([\n ['protocol', this.protocol],\n ['host', this.host],\n ['port', this.port],\n ['origin', this.origin],\n ['path', this.path],\n ['hash', this.hash],\n ['searchParams', this.searchParams],\n ['fullUrl', this.fullUrl],\n ['method', this.method],\n ['body', this.body],\n ['headers', this.headers]]\n )\n }\n\n toString () {\n const options = { betweenKeyValueSeparator: '->', betweenPairSeparator: '|' }\n let result = ''\n\n this.toMap().forEach((value, key) => {\n if (typeof value === 'string' || value === undefined || value === null) {\n result = `${result}${key}${options.betweenKeyValueSeparator}${value}${options.betweenPairSeparator}`\n }\n if ((typeof value === 'object' && value !== null) || Array.isArray(value)) {\n result = `${result}${key}${options.betweenKeyValueSeparator}${JSON.stringify(value)}${options.betweenPairSeparator}`\n }\n // maybe miss something for non Record / Array headers and searchParams here\n })\n\n // delete last betweenPairSeparator\n return result.slice(0, -1)\n }\n}\n\nclass MockCallHistory {\n logs = []\n\n calls () {\n return this.logs\n }\n\n firstCall () {\n return this.logs.at(0)\n }\n\n lastCall () {\n return this.logs.at(-1)\n }\n\n nthCall (number) {\n if (typeof number !== 'number') {\n throw new InvalidArgumentError('nthCall must be called with a number')\n }\n if (!Number.isInteger(number)) {\n throw new InvalidArgumentError('nthCall must be called with an integer')\n }\n if (Math.sign(number) !== 1) {\n throw new InvalidArgumentError('nthCall must be called with a positive value. use firstCall or lastCall instead')\n }\n\n // non zero based index. this is more human readable\n return this.logs.at(number - 1)\n }\n\n filterCalls (criteria, options) {\n // perf\n if (this.logs.length === 0) {\n return this.logs\n }\n if (typeof criteria === 'function') {\n return this.logs.filter(criteria)\n }\n if (criteria instanceof RegExp) {\n return this.logs.filter((log) => {\n return criteria.test(log.toString())\n })\n }\n if (typeof criteria === 'object' && criteria !== null) {\n // no criteria - returning all logs\n if (Object.keys(criteria).length === 0) {\n return this.logs\n }\n\n const finalOptions = { operator: 'OR', ...buildAndValidateFilterCallsOptions(options) }\n\n let maybeDuplicatedLogsFiltered = []\n if ('protocol' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered)\n }\n if ('host' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered)\n }\n if ('port' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered)\n }\n if ('origin' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered)\n }\n if ('path' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered)\n }\n if ('hash' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered)\n }\n if ('fullUrl' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered)\n }\n if ('method' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered)\n }\n\n const uniqLogsFiltered = [...new Set(maybeDuplicatedLogsFiltered)]\n\n return uniqLogsFiltered\n }\n\n throw new InvalidArgumentError('criteria parameter should be one of function, regexp, or object')\n }\n\n filterCallsByProtocol = makeFilterCalls.call(this, 'protocol')\n\n filterCallsByHost = makeFilterCalls.call(this, 'host')\n\n filterCallsByPort = makeFilterCalls.call(this, 'port')\n\n filterCallsByOrigin = makeFilterCalls.call(this, 'origin')\n\n filterCallsByPath = makeFilterCalls.call(this, 'path')\n\n filterCallsByHash = makeFilterCalls.call(this, 'hash')\n\n filterCallsByFullUrl = makeFilterCalls.call(this, 'fullUrl')\n\n filterCallsByMethod = makeFilterCalls.call(this, 'method')\n\n clear () {\n this.logs = []\n }\n\n [kMockCallHistoryAddLog] (requestInit) {\n const log = new MockCallHistoryLog(requestInit)\n\n this.logs.push(log)\n\n return log\n }\n\n * [Symbol.iterator] () {\n for (const log of this.calls()) {\n yield log\n }\n }\n}\n\nmodule.exports.MockCallHistory = MockCallHistory\nmodule.exports.MockCallHistoryLog = MockCallHistoryLog\n","'use strict'\n\nconst { promisify } = require('node:util')\nconst Pool = require('../dispatcher/pool')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockPool provides an API that extends the Pool to influence the mockDispatches.\n */\nclass MockPool extends Pool {\n constructor (origin, opts) {\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n super(origin, opts)\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(\n opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts },\n this[kDispatches]\n )\n }\n\n cleanMocks () {\n this[kDispatches] = []\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockPool\n","'use strict'\n\nconst { Transform } = require('node:stream')\nconst { Console } = require('node:console')\n\nconst PERSISTENT = process.versions.icu ? '✅' : 'Y '\nconst NOT_PERSISTENT = process.versions.icu ? '❌' : 'N '\n\n/**\n * Gets the output of `console.table(…)` as a string.\n */\nmodule.exports = class PendingInterceptorsFormatter {\n constructor ({ disableColors } = {}) {\n this.transform = new Transform({\n transform (chunk, _enc, cb) {\n cb(null, chunk)\n }\n })\n\n this.logger = new Console({\n stdout: this.transform,\n inspectOptions: {\n colors: !disableColors && !process.env.CI\n }\n })\n }\n\n format (pendingInterceptors) {\n const withPrettyHeaders = pendingInterceptors.map(\n ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({\n Method: method,\n Origin: origin,\n Path: path,\n 'Status code': statusCode,\n Persistent: persist ? PERSISTENT : NOT_PERSISTENT,\n Invocations: timesInvoked,\n Remaining: persist ? Infinity : times - timesInvoked\n }))\n\n this.logger.table(withPrettyHeaders)\n return this.transform.read().toString()\n }\n}\n","'use strict'\n\nconst { kClients } = require('../core/symbols')\nconst Agent = require('../dispatcher/agent')\nconst {\n kAgent,\n kMockAgentSet,\n kMockAgentGet,\n kDispatches,\n kIsMockActive,\n kNetConnect,\n kGetNetConnect,\n kOptions,\n kFactory,\n kMockAgentRegisterCallHistory,\n kMockAgentIsCallHistoryEnabled,\n kMockAgentAddCallHistoryLog,\n kMockAgentMockCallHistoryInstance,\n kMockAgentAcceptsNonStandardSearchParameters,\n kMockCallHistoryAddLog,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst MockClient = require('./mock-client')\nconst MockPool = require('./mock-pool')\nconst { matchValue, normalizeSearchParams, buildAndValidateMockOptions, normalizeOrigin } = require('./mock-utils')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst Dispatcher = require('../dispatcher/dispatcher')\nconst PendingInterceptorsFormatter = require('./pending-interceptors-formatter')\nconst { MockCallHistory } = require('./mock-call-history')\n\nclass MockAgent extends Dispatcher {\n constructor (opts = {}) {\n super(opts)\n\n const mockOptions = buildAndValidateMockOptions(opts)\n\n this[kNetConnect] = true\n this[kIsMockActive] = true\n this[kMockAgentIsCallHistoryEnabled] = mockOptions.enableCallHistory ?? false\n this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions.acceptNonStandardSearchParameters ?? false\n this[kIgnoreTrailingSlash] = mockOptions.ignoreTrailingSlash ?? false\n\n // Instantiate Agent and encapsulate\n if (opts?.agent && typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n const agent = opts?.agent ? opts.agent : new Agent(opts)\n this[kAgent] = agent\n\n this[kClients] = agent[kClients]\n this[kOptions] = mockOptions\n\n if (this[kMockAgentIsCallHistoryEnabled]) {\n this[kMockAgentRegisterCallHistory]()\n }\n }\n\n get (origin) {\n // Normalize origin to handle URL objects and case-insensitive hostnames\n const normalizedOrigin = normalizeOrigin(origin)\n const originKey = this[kIgnoreTrailingSlash] ? normalizedOrigin.replace(/\\/$/, '') : normalizedOrigin\n\n let dispatcher = this[kMockAgentGet](originKey)\n\n if (!dispatcher) {\n dispatcher = this[kFactory](originKey)\n this[kMockAgentSet](originKey, dispatcher)\n }\n return dispatcher\n }\n\n dispatch (opts, handler) {\n opts.origin = normalizeOrigin(opts.origin)\n\n // Call MockAgent.get to perform additional setup before dispatching as normal\n this.get(opts.origin)\n\n this[kMockAgentAddCallHistoryLog](opts)\n\n const acceptNonStandardSearchParameters = this[kMockAgentAcceptsNonStandardSearchParameters]\n\n const dispatchOpts = { ...opts }\n\n if (acceptNonStandardSearchParameters && dispatchOpts.path) {\n const [path, searchParams] = dispatchOpts.path.split('?')\n const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters)\n dispatchOpts.path = `${path}?${normalizedSearchParams}`\n }\n\n return this[kAgent].dispatch(dispatchOpts, handler)\n }\n\n async close () {\n this.clearCallHistory()\n await this[kAgent].close()\n this[kClients].clear()\n }\n\n deactivate () {\n this[kIsMockActive] = false\n }\n\n activate () {\n this[kIsMockActive] = true\n }\n\n enableNetConnect (matcher) {\n if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) {\n if (Array.isArray(this[kNetConnect])) {\n this[kNetConnect].push(matcher)\n } else {\n this[kNetConnect] = [matcher]\n }\n } else if (typeof matcher === 'undefined') {\n this[kNetConnect] = true\n } else {\n throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.')\n }\n }\n\n disableNetConnect () {\n this[kNetConnect] = false\n }\n\n enableCallHistory () {\n this[kMockAgentIsCallHistoryEnabled] = true\n\n return this\n }\n\n disableCallHistory () {\n this[kMockAgentIsCallHistoryEnabled] = false\n\n return this\n }\n\n getCallHistory () {\n return this[kMockAgentMockCallHistoryInstance]\n }\n\n clearCallHistory () {\n if (this[kMockAgentMockCallHistoryInstance] !== undefined) {\n this[kMockAgentMockCallHistoryInstance].clear()\n }\n }\n\n // This is required to bypass issues caused by using global symbols - see:\n // https://github.com/nodejs/undici/issues/1447\n get isMockActive () {\n return this[kIsMockActive]\n }\n\n [kMockAgentRegisterCallHistory] () {\n if (this[kMockAgentMockCallHistoryInstance] === undefined) {\n this[kMockAgentMockCallHistoryInstance] = new MockCallHistory()\n }\n }\n\n [kMockAgentAddCallHistoryLog] (opts) {\n if (this[kMockAgentIsCallHistoryEnabled]) {\n // additional setup when enableCallHistory class method is used after mockAgent instantiation\n this[kMockAgentRegisterCallHistory]()\n\n // add call history log on every call (intercepted or not)\n this[kMockAgentMockCallHistoryInstance][kMockCallHistoryAddLog](opts)\n }\n }\n\n [kMockAgentSet] (origin, dispatcher) {\n this[kClients].set(origin, { count: 0, dispatcher })\n }\n\n [kFactory] (origin) {\n const mockOptions = Object.assign({ agent: this }, this[kOptions])\n return this[kOptions] && this[kOptions].connections === 1\n ? new MockClient(origin, mockOptions)\n : new MockPool(origin, mockOptions)\n }\n\n [kMockAgentGet] (origin) {\n // First check if we can immediately find it\n const result = this[kClients].get(origin)\n if (result?.dispatcher) {\n return result.dispatcher\n }\n\n // If the origin is not a string create a dummy parent pool and return to user\n if (typeof origin !== 'string') {\n const dispatcher = this[kFactory]('http://localhost:9999')\n this[kMockAgentSet](origin, dispatcher)\n return dispatcher\n }\n\n // If we match, create a pool and assign the same dispatches\n for (const [keyMatcher, result] of Array.from(this[kClients])) {\n if (result && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {\n const dispatcher = this[kFactory](origin)\n this[kMockAgentSet](origin, dispatcher)\n dispatcher[kDispatches] = result.dispatcher[kDispatches]\n return dispatcher\n }\n }\n }\n\n [kGetNetConnect] () {\n return this[kNetConnect]\n }\n\n pendingInterceptors () {\n const mockAgentClients = this[kClients]\n\n return Array.from(mockAgentClients.entries())\n .flatMap(([origin, result]) => result.dispatcher[kDispatches].map(dispatch => ({ ...dispatch, origin })))\n .filter(({ pending }) => pending)\n }\n\n assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) {\n const pending = this.pendingInterceptors()\n\n if (pending.length === 0) {\n return\n }\n\n throw new UndiciError(\n pending.length === 1\n ? `1 interceptor is pending:\\n\\n${pendingInterceptorsFormatter.format(pending)}`.trim()\n : `${pending.length} interceptors are pending:\\n\\n${pendingInterceptorsFormatter.format(pending)}`.trim()\n )\n }\n}\n\nmodule.exports = MockAgent\n","'use strict'\n\nconst { InvalidArgumentError } = require('../core/errors')\nconst { runtimeFeatures } = require('../util/runtime-features.js')\n\n/**\n * @typedef {Object} HeaderFilters\n * @property {Set} ignore - Set of headers to ignore for matching\n * @property {Set} exclude - Set of headers to exclude from matching\n * @property {Set} match - Set of headers to match (empty means match\n */\n\n/**\n * Creates cached header sets for performance\n *\n * @param {import('./snapshot-recorder').SnapshotRecorderMatchOptions} matchOptions - Matching options for headers\n * @returns {HeaderFilters} - Cached sets for ignore, exclude, and match headers\n */\nfunction createHeaderFilters (matchOptions = {}) {\n const { ignoreHeaders = [], excludeHeaders = [], matchHeaders = [], caseSensitive = false } = matchOptions\n\n return {\n ignore: new Set(ignoreHeaders.map(header => caseSensitive ? header : header.toLowerCase())),\n exclude: new Set(excludeHeaders.map(header => caseSensitive ? header : header.toLowerCase())),\n match: new Set(matchHeaders.map(header => caseSensitive ? header : header.toLowerCase()))\n }\n}\n\nconst crypto = runtimeFeatures.has('crypto')\n ? require('node:crypto')\n : null\n\n/**\n * @callback HashIdFunction\n * @param {string} value - The value to hash\n * @returns {string} - The base64url encoded hash of the value\n */\n\n/**\n * Generates a hash for a given value\n * @type {HashIdFunction}\n */\nconst hashId = crypto?.hash\n ? (value) => crypto.hash('sha256', value, 'base64url')\n : (value) => Buffer.from(value).toString('base64url')\n\n/**\n * @typedef {(url: string) => boolean} IsUrlExcluded Checks if a URL matches any of the exclude patterns\n */\n\n/** @typedef {{[key: Lowercase]: string}} NormalizedHeaders */\n/** @typedef {Array} UndiciHeaders */\n/** @typedef {Record} Headers */\n\n/**\n * @param {*} headers\n * @returns {headers is UndiciHeaders}\n */\nfunction isUndiciHeaders (headers) {\n return Array.isArray(headers) && (headers.length & 1) === 0\n}\n\n/**\n * Factory function to create a URL exclusion checker\n * @param {Array} [excludePatterns=[]] - Array of patterns to exclude\n * @returns {IsUrlExcluded} - A function that checks if a URL matches any of the exclude patterns\n */\nfunction isUrlExcludedFactory (excludePatterns = []) {\n if (excludePatterns.length === 0) {\n return () => false\n }\n\n return function isUrlExcluded (url) {\n let urlLowerCased\n\n for (const pattern of excludePatterns) {\n if (typeof pattern === 'string') {\n if (!urlLowerCased) {\n // Convert URL to lowercase only once\n urlLowerCased = url.toLowerCase()\n }\n // Simple string match (case-insensitive)\n if (urlLowerCased.includes(pattern.toLowerCase())) {\n return true\n }\n } else if (pattern instanceof RegExp) {\n // Regex pattern match\n if (pattern.test(url)) {\n return true\n }\n }\n }\n\n return false\n }\n}\n\n/**\n * Normalizes headers for consistent comparison\n *\n * @param {Object|UndiciHeaders} headers - Headers to normalize\n * @returns {NormalizedHeaders} - Normalized headers as a lowercase object\n */\nfunction normalizeHeaders (headers) {\n /** @type {NormalizedHeaders} */\n const normalizedHeaders = {}\n\n if (!headers) return normalizedHeaders\n\n // Handle array format (undici internal format: [name, value, name, value, ...])\n if (isUndiciHeaders(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i]\n const value = headers[i + 1]\n if (key && value !== undefined) {\n // Convert Buffers to strings if needed\n const keyStr = Buffer.isBuffer(key) ? key.toString() : key\n const valueStr = Buffer.isBuffer(value) ? value.toString() : value\n normalizedHeaders[keyStr.toLowerCase()] = valueStr\n }\n }\n return normalizedHeaders\n }\n\n // Handle object format\n if (headers && typeof headers === 'object') {\n for (const [key, value] of Object.entries(headers)) {\n if (key && typeof key === 'string') {\n normalizedHeaders[key.toLowerCase()] = Array.isArray(value) ? value.join(', ') : String(value)\n }\n }\n }\n\n return normalizedHeaders\n}\n\nconst validSnapshotModes = /** @type {const} */ (['record', 'playback', 'update'])\n\n/** @typedef {typeof validSnapshotModes[number]} SnapshotMode */\n\n/**\n * @param {*} mode - The snapshot mode to validate\n * @returns {asserts mode is SnapshotMode}\n */\nfunction validateSnapshotMode (mode) {\n if (!validSnapshotModes.includes(mode)) {\n throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(', ')}`)\n }\n}\n\nmodule.exports = {\n createHeaderFilters,\n hashId,\n isUndiciHeaders,\n normalizeHeaders,\n isUrlExcludedFactory,\n validateSnapshotMode\n}\n","'use strict'\n\nconst { writeFile, readFile, mkdir } = require('node:fs/promises')\nconst { dirname, resolve } = require('node:path')\nconst { setTimeout, clearTimeout } = require('node:timers')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst { hashId, isUrlExcludedFactory, normalizeHeaders, createHeaderFilters } = require('./snapshot-utils')\n\n/**\n * @typedef {Object} SnapshotRequestOptions\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} path - Request path\n * @property {string} origin - Request origin (base URL)\n * @property {import('./snapshot-utils').Headers|import('./snapshot-utils').UndiciHeaders} headers - Request headers\n * @property {import('./snapshot-utils').NormalizedHeaders} _normalizedHeaders - Request headers as a lowercase object\n * @property {string|Buffer} [body] - Request body (optional)\n */\n\n/**\n * @typedef {Object} SnapshotEntryRequest\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} url - Full URL of the request\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object\n * @property {string|Buffer} [body] - Request body (optional)\n */\n\n/**\n * @typedef {Object} SnapshotEntryResponse\n * @property {number} statusCode - HTTP status code of the response\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized response headers as a lowercase object\n * @property {string} body - Response body as a base64url encoded string\n * @property {Object} [trailers] - Optional response trailers\n */\n\n/**\n * @typedef {Object} SnapshotEntry\n * @property {SnapshotEntryRequest} request - The request object\n * @property {Array} responses - Array of response objects\n * @property {number} callCount - Number of times this snapshot has been called\n * @property {string} timestamp - ISO timestamp of when the snapshot was created\n */\n\n/**\n * @typedef {Object} SnapshotRecorderMatchOptions\n * @property {Array} [matchHeaders=[]] - Headers to match (empty array means match all headers)\n * @property {Array} [ignoreHeaders=[]] - Headers to ignore for matching\n * @property {Array} [excludeHeaders=[]] - Headers to exclude from matching\n * @property {boolean} [matchBody=true] - Whether to match request body\n * @property {boolean} [matchQuery=true] - Whether to match query properties\n * @property {boolean} [caseSensitive=false] - Whether header matching is case-sensitive\n */\n\n/**\n * @typedef {Object} SnapshotRecorderOptions\n * @property {string} [snapshotPath] - Path to save/load snapshots\n * @property {import('./snapshot-utils').SnapshotMode} [mode='record'] - Mode: 'record' or 'playback'\n * @property {number} [maxSnapshots=Infinity] - Maximum number of snapshots to keep\n * @property {boolean} [autoFlush=false] - Whether to automatically flush snapshots to disk\n * @property {number} [flushInterval=30000] - Auto-flush interval in milliseconds (default: 30 seconds)\n * @property {Array} [excludeUrls=[]] - URLs to exclude from recording\n * @property {function} [shouldRecord=null] - Function to filter requests for recording\n * @property {function} [shouldPlayback=null] - Function to filter requests\n */\n\n/**\n * @typedef {Object} SnapshotFormattedRequest\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} url - Full URL of the request (with query parameters if matchQuery is true)\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object\n * @property {string} body - Request body (optional, only if matchBody is true)\n */\n\n/**\n * @typedef {Object} SnapshotInfo\n * @property {string} hash - Hash key for the snapshot\n * @property {SnapshotEntryRequest} request - The request object\n * @property {number} responseCount - Number of responses recorded for this request\n * @property {number} callCount - Number of times this snapshot has been called\n * @property {string} timestamp - ISO timestamp of when the snapshot was created\n */\n\n/**\n * Formats a request for consistent snapshot storage\n * Caches normalized headers to avoid repeated processing\n *\n * @param {SnapshotRequestOptions} opts - Request options\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached header sets for performance\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers and body\n * @returns {SnapshotFormattedRequest} - Formatted request object\n */\nfunction formatRequestKey (opts, headerFilters, matchOptions = {}) {\n const url = new URL(opts.path, opts.origin)\n\n // Cache normalized headers if not already done\n const normalized = opts._normalizedHeaders || normalizeHeaders(opts.headers)\n if (!opts._normalizedHeaders) {\n opts._normalizedHeaders = normalized\n }\n\n return {\n method: opts.method || 'GET',\n url: matchOptions.matchQuery !== false ? url.toString() : `${url.origin}${url.pathname}`,\n headers: filterHeadersForMatching(normalized, headerFilters, matchOptions),\n body: matchOptions.matchBody !== false && opts.body ? String(opts.body) : ''\n }\n}\n\n/**\n * Filters headers based on matching configuration\n *\n * @param {import('./snapshot-utils').Headers} headers - Headers to filter\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers\n */\nfunction filterHeadersForMatching (headers, headerFilters, matchOptions = {}) {\n if (!headers || typeof headers !== 'object') return {}\n\n const {\n caseSensitive = false\n } = matchOptions\n\n const filtered = {}\n const { ignore, exclude, match } = headerFilters\n\n for (const [key, value] of Object.entries(headers)) {\n const headerKey = caseSensitive ? key : key.toLowerCase()\n\n // Skip if in exclude list (for security)\n if (exclude.has(headerKey)) continue\n\n // Skip if in ignore list (for matching)\n if (ignore.has(headerKey)) continue\n\n // If matchHeaders is specified, only include those headers\n if (match.size !== 0) {\n if (!match.has(headerKey)) continue\n }\n\n filtered[headerKey] = value\n }\n\n return filtered\n}\n\n/**\n * Filters headers for storage (only excludes sensitive headers)\n *\n * @param {import('./snapshot-utils').Headers} headers - Headers to filter\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers\n */\nfunction filterHeadersForStorage (headers, headerFilters, matchOptions = {}) {\n if (!headers || typeof headers !== 'object') return {}\n\n const {\n caseSensitive = false\n } = matchOptions\n\n const filtered = {}\n const { exclude: excludeSet } = headerFilters\n\n for (const [key, value] of Object.entries(headers)) {\n const headerKey = caseSensitive ? key : key.toLowerCase()\n\n // Skip if in exclude list (for security)\n if (excludeSet.has(headerKey)) continue\n\n filtered[headerKey] = value\n }\n\n return filtered\n}\n\n/**\n * Creates a hash key for request matching\n * Properly orders headers to avoid conflicts and uses crypto hashing when available\n *\n * @param {SnapshotFormattedRequest} formattedRequest - Request object\n * @returns {string} - Base64url encoded hash of the request\n */\nfunction createRequestHash (formattedRequest) {\n const parts = [\n formattedRequest.method,\n formattedRequest.url\n ]\n\n // Process headers in a deterministic way to avoid conflicts\n if (formattedRequest.headers && typeof formattedRequest.headers === 'object') {\n const headerKeys = Object.keys(formattedRequest.headers).sort()\n for (const key of headerKeys) {\n const values = Array.isArray(formattedRequest.headers[key])\n ? formattedRequest.headers[key]\n : [formattedRequest.headers[key]]\n\n // Add header name\n parts.push(key)\n\n // Add all values for this header, sorted for consistency\n for (const value of values.sort()) {\n parts.push(String(value))\n }\n }\n }\n\n // Add body\n parts.push(formattedRequest.body)\n\n const content = parts.join('|')\n\n return hashId(content)\n}\n\nclass SnapshotRecorder {\n /** @type {NodeJS.Timeout | null} */\n #flushTimeout\n\n /** @type {import('./snapshot-utils').IsUrlExcluded} */\n #isUrlExcluded\n\n /** @type {Map} */\n #snapshots = new Map()\n\n /** @type {string|undefined} */\n #snapshotPath\n\n /** @type {number} */\n #maxSnapshots = Infinity\n\n /** @type {boolean} */\n #autoFlush = false\n\n /** @type {import('./snapshot-utils').HeaderFilters} */\n #headerFilters\n\n /**\n * Creates a new SnapshotRecorder instance\n * @param {SnapshotRecorderOptions&SnapshotRecorderMatchOptions} [options={}] - Configuration options for the recorder\n */\n constructor (options = {}) {\n this.#snapshotPath = options.snapshotPath\n this.#maxSnapshots = options.maxSnapshots || Infinity\n this.#autoFlush = options.autoFlush || false\n this.flushInterval = options.flushInterval || 30000 // 30 seconds default\n this._flushTimer = null\n\n // Matching configuration\n /** @type {Required} */\n this.matchOptions = {\n matchHeaders: options.matchHeaders || [], // empty means match all headers\n ignoreHeaders: options.ignoreHeaders || [],\n excludeHeaders: options.excludeHeaders || [],\n matchBody: options.matchBody !== false, // default: true\n matchQuery: options.matchQuery !== false, // default: true\n caseSensitive: options.caseSensitive || false\n }\n\n // Cache processed header sets to avoid recreating them on every request\n this.#headerFilters = createHeaderFilters(this.matchOptions)\n\n // Request filtering callbacks\n this.shouldRecord = options.shouldRecord || (() => true) // function(requestOpts) -> boolean\n this.shouldPlayback = options.shouldPlayback || (() => true) // function(requestOpts) -> boolean\n\n // URL pattern filtering\n this.#isUrlExcluded = isUrlExcludedFactory(options.excludeUrls) // Array of regex patterns or strings\n\n // Start auto-flush timer if enabled\n if (this.#autoFlush && this.#snapshotPath) {\n this.#startAutoFlush()\n }\n }\n\n /**\n * Records a request-response interaction\n * @param {SnapshotRequestOptions} requestOpts - Request options\n * @param {SnapshotEntryResponse} response - Response data to record\n * @return {Promise} - Resolves when the recording is complete\n */\n async record (requestOpts, response) {\n // Check if recording should be filtered out\n if (!this.shouldRecord(requestOpts)) {\n return // Skip recording\n }\n\n // Check URL exclusion patterns\n if (this.isUrlExcluded(requestOpts)) {\n return // Skip recording\n }\n\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n\n // Extract response data - always store body as base64\n const normalizedHeaders = normalizeHeaders(response.headers)\n\n /** @type {SnapshotEntryResponse} */\n const responseData = {\n statusCode: response.statusCode,\n headers: filterHeadersForStorage(normalizedHeaders, this.#headerFilters, this.matchOptions),\n body: Buffer.isBuffer(response.body)\n ? response.body.toString('base64')\n : Buffer.from(String(response.body || '')).toString('base64'),\n trailers: response.trailers\n }\n\n // Remove oldest snapshot if we exceed maxSnapshots limit\n if (this.#snapshots.size >= this.#maxSnapshots && !this.#snapshots.has(hash)) {\n const oldestKey = this.#snapshots.keys().next().value\n this.#snapshots.delete(oldestKey)\n }\n\n // Support sequential responses - if snapshot exists, add to responses array\n const existingSnapshot = this.#snapshots.get(hash)\n if (existingSnapshot && existingSnapshot.responses) {\n existingSnapshot.responses.push(responseData)\n existingSnapshot.timestamp = new Date().toISOString()\n } else {\n this.#snapshots.set(hash, {\n request,\n responses: [responseData], // Always store as array for consistency\n callCount: 0,\n timestamp: new Date().toISOString()\n })\n }\n\n // Auto-flush if enabled\n if (this.#autoFlush && this.#snapshotPath) {\n this.#scheduleFlush()\n }\n }\n\n /**\n * Checks if a URL should be excluded from recording/playback\n * @param {SnapshotRequestOptions} requestOpts - Request options to check\n * @returns {boolean} - True if URL is excluded\n */\n isUrlExcluded (requestOpts) {\n const url = new URL(requestOpts.path, requestOpts.origin).toString()\n return this.#isUrlExcluded(url)\n }\n\n /**\n * Finds a matching snapshot for the given request\n * Returns the appropriate response based on call count for sequential responses\n *\n * @param {SnapshotRequestOptions} requestOpts - Request options to match\n * @returns {SnapshotEntry&Record<'response', SnapshotEntryResponse>|undefined} - Matching snapshot response or undefined if not found\n */\n findSnapshot (requestOpts) {\n // Check if playback should be filtered out\n if (!this.shouldPlayback(requestOpts)) {\n return undefined // Skip playback\n }\n\n // Check URL exclusion patterns\n if (this.isUrlExcluded(requestOpts)) {\n return undefined // Skip playback\n }\n\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n const snapshot = this.#snapshots.get(hash)\n\n if (!snapshot) return undefined\n\n // Handle sequential responses\n const currentCallCount = snapshot.callCount || 0\n const responseIndex = Math.min(currentCallCount, snapshot.responses.length - 1)\n snapshot.callCount = currentCallCount + 1\n\n return {\n ...snapshot,\n response: snapshot.responses[responseIndex]\n }\n }\n\n /**\n * Loads snapshots from file\n * @param {string} [filePath] - Optional file path to load snapshots from\n * @return {Promise} - Resolves when snapshots are loaded\n */\n async loadSnapshots (filePath) {\n const path = filePath || this.#snapshotPath\n if (!path) {\n throw new InvalidArgumentError('Snapshot path is required')\n }\n\n try {\n const data = await readFile(resolve(path), 'utf8')\n const parsed = JSON.parse(data)\n\n // Convert array format back to Map\n if (Array.isArray(parsed)) {\n this.#snapshots.clear()\n for (const { hash, snapshot } of parsed) {\n this.#snapshots.set(hash, snapshot)\n }\n } else {\n // Legacy object format\n this.#snapshots = new Map(Object.entries(parsed))\n }\n } catch (error) {\n if (error.code === 'ENOENT') {\n // File doesn't exist yet - that's ok for recording mode\n this.#snapshots.clear()\n } else {\n throw new UndiciError(`Failed to load snapshots from ${path}`, { cause: error })\n }\n }\n }\n\n /**\n * Saves snapshots to file\n *\n * @param {string} [filePath] - Optional file path to save snapshots\n * @returns {Promise} - Resolves when snapshots are saved\n */\n async saveSnapshots (filePath) {\n const path = filePath || this.#snapshotPath\n if (!path) {\n throw new InvalidArgumentError('Snapshot path is required')\n }\n\n const resolvedPath = resolve(path)\n\n // Ensure directory exists\n await mkdir(dirname(resolvedPath), { recursive: true })\n\n // Convert Map to serializable format\n const data = Array.from(this.#snapshots.entries()).map(([hash, snapshot]) => ({\n hash,\n snapshot\n }))\n\n await writeFile(resolvedPath, JSON.stringify(data, null, 2), { flush: true })\n }\n\n /**\n * Clears all recorded snapshots\n * @returns {void}\n */\n clear () {\n this.#snapshots.clear()\n }\n\n /**\n * Gets all recorded snapshots\n * @return {Array} - Array of all recorded snapshots\n */\n getSnapshots () {\n return Array.from(this.#snapshots.values())\n }\n\n /**\n * Gets snapshot count\n * @return {number} - Number of recorded snapshots\n */\n size () {\n return this.#snapshots.size\n }\n\n /**\n * Resets call counts for all snapshots (useful for test cleanup)\n * @returns {void}\n */\n resetCallCounts () {\n for (const snapshot of this.#snapshots.values()) {\n snapshot.callCount = 0\n }\n }\n\n /**\n * Deletes a specific snapshot by request options\n * @param {SnapshotRequestOptions} requestOpts - Request options to match\n * @returns {boolean} - True if snapshot was deleted, false if not found\n */\n deleteSnapshot (requestOpts) {\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n return this.#snapshots.delete(hash)\n }\n\n /**\n * Gets information about a specific snapshot\n * @param {SnapshotRequestOptions} requestOpts - Request options to match\n * @returns {SnapshotInfo|null} - Snapshot information or null if not found\n */\n getSnapshotInfo (requestOpts) {\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n const snapshot = this.#snapshots.get(hash)\n\n if (!snapshot) return null\n\n return {\n hash,\n request: snapshot.request,\n responseCount: snapshot.responses ? snapshot.responses.length : (snapshot.response ? 1 : 0), // .response for legacy snapshots\n callCount: snapshot.callCount || 0,\n timestamp: snapshot.timestamp\n }\n }\n\n /**\n * Replaces all snapshots with new data (full replacement)\n * @param {Array<{hash: string; snapshot: SnapshotEntry}>|Record} snapshotData - New snapshot data to replace existing ones\n * @returns {void}\n */\n replaceSnapshots (snapshotData) {\n this.#snapshots.clear()\n\n if (Array.isArray(snapshotData)) {\n for (const { hash, snapshot } of snapshotData) {\n this.#snapshots.set(hash, snapshot)\n }\n } else if (snapshotData && typeof snapshotData === 'object') {\n // Legacy object format\n this.#snapshots = new Map(Object.entries(snapshotData))\n }\n }\n\n /**\n * Starts the auto-flush timer\n * @returns {void}\n */\n #startAutoFlush () {\n return this.#scheduleFlush()\n }\n\n /**\n * Stops the auto-flush timer\n * @returns {void}\n */\n #stopAutoFlush () {\n if (this.#flushTimeout) {\n clearTimeout(this.#flushTimeout)\n // Ensure any pending flush is completed\n this.saveSnapshots().catch(() => {\n // Ignore flush errors\n })\n this.#flushTimeout = null\n }\n }\n\n /**\n * Schedules a flush (debounced to avoid excessive writes)\n */\n #scheduleFlush () {\n this.#flushTimeout = setTimeout(() => {\n this.saveSnapshots().catch(() => {\n // Ignore flush errors\n })\n if (this.#autoFlush) {\n this.#flushTimeout?.refresh()\n } else {\n this.#flushTimeout = null\n }\n }, 1000) // 1 second debounce\n }\n\n /**\n * Cleanup method to stop timers\n * @returns {void}\n */\n destroy () {\n this.#stopAutoFlush()\n if (this.#flushTimeout) {\n clearTimeout(this.#flushTimeout)\n this.#flushTimeout = null\n }\n }\n\n /**\n * Async close method that saves all recordings and performs cleanup\n * @returns {Promise}\n */\n async close () {\n // Save any pending recordings if we have a snapshot path\n if (this.#snapshotPath && this.#snapshots.size !== 0) {\n await this.saveSnapshots()\n }\n\n // Perform cleanup\n this.destroy()\n }\n}\n\nmodule.exports = { SnapshotRecorder, formatRequestKey, createRequestHash, filterHeadersForMatching, filterHeadersForStorage, createHeaderFilters }\n","'use strict'\n\nconst Agent = require('../dispatcher/agent')\nconst MockAgent = require('./mock-agent')\nconst { SnapshotRecorder } = require('./snapshot-recorder')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst util = require('../core/util')\nconst { validateSnapshotMode } = require('./snapshot-utils')\n\nconst kSnapshotRecorder = Symbol('kSnapshotRecorder')\nconst kSnapshotMode = Symbol('kSnapshotMode')\nconst kSnapshotPath = Symbol('kSnapshotPath')\nconst kSnapshotLoaded = Symbol('kSnapshotLoaded')\nconst kRealAgent = Symbol('kRealAgent')\n\n// Static flag to ensure warning is only emitted once per process\nlet warningEmitted = false\n\nclass SnapshotAgent extends MockAgent {\n constructor (opts = {}) {\n // Emit experimental warning only once\n if (!warningEmitted) {\n process.emitWarning(\n 'SnapshotAgent is experimental and subject to change',\n 'ExperimentalWarning'\n )\n warningEmitted = true\n }\n\n const {\n mode = 'record',\n snapshotPath = null,\n ...mockAgentOpts\n } = opts\n\n super(mockAgentOpts)\n\n validateSnapshotMode(mode)\n\n // Validate snapshotPath is provided when required\n if ((mode === 'playback' || mode === 'update') && !snapshotPath) {\n throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`)\n }\n\n this[kSnapshotMode] = mode\n this[kSnapshotPath] = snapshotPath\n\n this[kSnapshotRecorder] = new SnapshotRecorder({\n snapshotPath: this[kSnapshotPath],\n mode: this[kSnapshotMode],\n maxSnapshots: opts.maxSnapshots,\n autoFlush: opts.autoFlush,\n flushInterval: opts.flushInterval,\n matchHeaders: opts.matchHeaders,\n ignoreHeaders: opts.ignoreHeaders,\n excludeHeaders: opts.excludeHeaders,\n matchBody: opts.matchBody,\n matchQuery: opts.matchQuery,\n caseSensitive: opts.caseSensitive,\n shouldRecord: opts.shouldRecord,\n shouldPlayback: opts.shouldPlayback,\n excludeUrls: opts.excludeUrls\n })\n this[kSnapshotLoaded] = false\n\n // For recording/update mode, we need a real agent to make actual requests\n // For playback mode, we need a real agent if there are excluded URLs\n if (this[kSnapshotMode] === 'record' || this[kSnapshotMode] === 'update' ||\n (this[kSnapshotMode] === 'playback' && opts.excludeUrls && opts.excludeUrls.length > 0)) {\n this[kRealAgent] = new Agent(opts)\n }\n\n // Auto-load snapshots in playback/update mode\n if ((this[kSnapshotMode] === 'playback' || this[kSnapshotMode] === 'update') && this[kSnapshotPath]) {\n this.loadSnapshots().catch(() => {\n // Ignore load errors - file might not exist yet\n })\n }\n }\n\n dispatch (opts, handler) {\n const mode = this[kSnapshotMode]\n\n // Check if URL should be excluded (pass through without mocking/recording)\n if (this[kSnapshotRecorder].isUrlExcluded(opts)) {\n // Real agent is guaranteed by constructor when excludeUrls is configured\n return this[kRealAgent].dispatch(opts, handler)\n }\n\n if (mode === 'playback' || mode === 'update') {\n // Ensure snapshots are loaded\n if (!this[kSnapshotLoaded]) {\n // Need to load asynchronously, delegate to async version\n return this.#asyncDispatch(opts, handler)\n }\n\n // Try to find existing snapshot (synchronous)\n const snapshot = this[kSnapshotRecorder].findSnapshot(opts)\n\n if (snapshot) {\n // Use recorded response (synchronous)\n return this.#replaySnapshot(snapshot, handler)\n } else if (mode === 'update') {\n // Make real request and record it (async required)\n return this.#recordAndReplay(opts, handler)\n } else {\n // Playback mode but no snapshot found\n const error = new UndiciError(`No snapshot found for ${opts.method || 'GET'} ${opts.path}`)\n if (handler.onResponseError) {\n handler.onResponseError(null, error)\n return\n }\n throw error\n }\n } else if (mode === 'record') {\n // Record mode - make real request and save response (async required)\n return this.#recordAndReplay(opts, handler)\n }\n }\n\n /**\n * Async version of dispatch for when we need to load snapshots first\n */\n async #asyncDispatch (opts, handler) {\n await this.loadSnapshots()\n return this.dispatch(opts, handler)\n }\n\n /**\n * Records a real request and replays the response\n */\n #recordAndReplay (opts, handler) {\n const responseData = {\n statusCode: null,\n headers: {},\n trailers: {},\n body: []\n }\n\n const self = this // Capture 'this' context for use within nested handler callbacks\n\n const recordingHandler = {\n onRequestStart (controller, context) {\n return handler.onRequestStart(controller, { ...context, history: this.history })\n },\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n return handler.onRequestUpgrade(controller, statusCode, headers, socket)\n },\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n responseData.statusCode = statusCode\n responseData.headers = headers\n return handler.onResponseStart(controller, statusCode, headers, statusMessage)\n },\n\n onResponseData (controller, chunk) {\n responseData.body.push(chunk)\n return handler.onResponseData(controller, chunk)\n },\n\n onResponseEnd (controller, trailers) {\n responseData.trailers = trailers\n\n // Record the interaction using captured 'self' context (fire and forget)\n const responseBody = Buffer.concat(responseData.body)\n self[kSnapshotRecorder].record(opts, {\n statusCode: responseData.statusCode,\n headers: responseData.headers,\n body: responseBody,\n trailers: responseData.trailers\n })\n .then(() => handler.onResponseEnd(controller, trailers))\n .catch((error) => handler.onResponseError(controller, error))\n },\n\n onResponseError (controller, error) {\n return handler.onResponseError(controller, error)\n }\n }\n\n // Use composed agent if available (includes interceptors), otherwise use real agent\n const agent = this[kRealAgent]\n return agent.dispatch(opts, recordingHandler)\n }\n\n /**\n * Replays a recorded response\n *\n * @param {Object} snapshot - The recorded snapshot to replay.\n * @param {Object} handler - The handler to call with the response data.\n * @returns {void}\n */\n #replaySnapshot (snapshot, handler) {\n try {\n const { response } = snapshot\n\n const rawHeaders = response.headers ? util.toRawHeaders(response.headers) : []\n const rawTrailers = response.trailers ? util.toRawHeaders(response.trailers) : []\n\n const controller = {\n rawHeaders,\n rawTrailers,\n pause () { },\n resume () { },\n abort (reason) {\n this.aborted = true\n this.reason = reason\n },\n\n aborted: false,\n paused: false\n }\n\n handler.onRequestStart(controller)\n\n handler.onResponseStart(controller, response.statusCode, response.headers, response.statusMessage)\n\n // Body is always stored as base64 string\n const body = Buffer.from(response.body, 'base64')\n handler.onResponseData(controller, body)\n\n handler.onResponseEnd(controller, response.trailers)\n } catch (error) {\n handler.onResponseError?.(null, error)\n }\n }\n\n /**\n * Loads snapshots from file\n *\n * @param {string} [filePath] - Optional file path to load snapshots from.\n * @returns {Promise} - Resolves when snapshots are loaded.\n */\n async loadSnapshots (filePath) {\n await this[kSnapshotRecorder].loadSnapshots(filePath || this[kSnapshotPath])\n this[kSnapshotLoaded] = true\n\n // In playback mode, set up MockAgent interceptors for all snapshots\n if (this[kSnapshotMode] === 'playback') {\n this.#setupMockInterceptors()\n }\n }\n\n /**\n * Saves snapshots to file\n *\n * @param {string} [filePath] - Optional file path to save snapshots to.\n * @returns {Promise} - Resolves when snapshots are saved.\n */\n async saveSnapshots (filePath) {\n return this[kSnapshotRecorder].saveSnapshots(filePath || this[kSnapshotPath])\n }\n\n /**\n * Sets up MockAgent interceptors based on recorded snapshots.\n *\n * This method creates MockAgent interceptors for each recorded snapshot,\n * allowing the SnapshotAgent to fall back to MockAgent's standard intercept\n * mechanism in playback mode. Each interceptor is configured to persist\n * (remain active for multiple requests) and responds with the recorded\n * response data.\n *\n * Called automatically when loading snapshots in playback mode.\n *\n * @returns {void}\n */\n #setupMockInterceptors () {\n for (const snapshot of this[kSnapshotRecorder].getSnapshots()) {\n const { request, responses, response } = snapshot\n const url = new URL(request.url)\n\n const mockPool = this.get(url.origin)\n\n // Handle both new format (responses array) and legacy format (response object)\n const responseData = responses ? responses[0] : response\n if (!responseData) continue\n\n mockPool.intercept({\n path: url.pathname + url.search,\n method: request.method,\n headers: request.headers,\n body: request.body\n }).reply(responseData.statusCode, responseData.body, {\n headers: responseData.headers,\n trailers: responseData.trailers\n }).persist()\n }\n }\n\n /**\n * Gets the snapshot recorder\n * @return {SnapshotRecorder} - The snapshot recorder instance\n */\n getRecorder () {\n return this[kSnapshotRecorder]\n }\n\n /**\n * Gets the current mode\n * @return {import('./snapshot-utils').SnapshotMode} - The current snapshot mode\n */\n getMode () {\n return this[kSnapshotMode]\n }\n\n /**\n * Clears all snapshots\n * @returns {void}\n */\n clearSnapshots () {\n this[kSnapshotRecorder].clear()\n }\n\n /**\n * Resets call counts for all snapshots (useful for test cleanup)\n * @returns {void}\n */\n resetCallCounts () {\n this[kSnapshotRecorder].resetCallCounts()\n }\n\n /**\n * Deletes a specific snapshot by request options\n * @param {import('./snapshot-recorder').SnapshotRequestOptions} requestOpts - Request options to identify the snapshot\n * @return {Promise} - Returns true if the snapshot was deleted, false if not found\n */\n deleteSnapshot (requestOpts) {\n return this[kSnapshotRecorder].deleteSnapshot(requestOpts)\n }\n\n /**\n * Gets information about a specific snapshot\n * @returns {import('./snapshot-recorder').SnapshotInfo|null} - Snapshot information or null if not found\n */\n getSnapshotInfo (requestOpts) {\n return this[kSnapshotRecorder].getSnapshotInfo(requestOpts)\n }\n\n /**\n * Replaces all snapshots with new data (full replacement)\n * @param {Array<{hash: string; snapshot: import('./snapshot-recorder').SnapshotEntryshotEntry}>|Record} snapshotData - New snapshot data to replace existing snapshots\n * @returns {void}\n */\n replaceSnapshots (snapshotData) {\n this[kSnapshotRecorder].replaceSnapshots(snapshotData)\n }\n\n /**\n * Closes the agent, saving snapshots and cleaning up resources.\n *\n * @returns {Promise}\n */\n async close () {\n await this[kSnapshotRecorder].close()\n await this[kRealAgent]?.close()\n await super.close()\n }\n}\n\nmodule.exports = SnapshotAgent\n","'use strict'\n\n// We include a version number for the Dispatcher API. In case of breaking changes,\n// this version number must be increased to avoid conflicts.\nconst globalDispatcher = Symbol.for('undici.globalDispatcher.2')\nconst legacyGlobalDispatcher = Symbol.for('undici.globalDispatcher.1')\nconst { InvalidArgumentError } = require('./core/errors')\nconst Agent = require('./dispatcher/agent')\nconst Dispatcher1Wrapper = require('./dispatcher/dispatcher1-wrapper')\n\nif (getGlobalDispatcher() === undefined) {\n setGlobalDispatcher(new Agent())\n}\n\nfunction setGlobalDispatcher (agent) {\n if (!agent || typeof agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument agent must implement Agent')\n }\n\n Object.defineProperty(globalThis, globalDispatcher, {\n value: agent,\n writable: true,\n enumerable: false,\n configurable: false\n })\n\n const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent)\n\n Object.defineProperty(globalThis, legacyGlobalDispatcher, {\n value: legacyAgent,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nfunction getGlobalDispatcher () {\n return globalThis[globalDispatcher]\n}\n\n// These are the globals that can be installed by undici.install().\n// Not exported by index.js to avoid use outside of this module.\nconst installedExports = /** @type {const} */ (\n [\n 'fetch',\n 'Headers',\n 'Response',\n 'Request',\n 'FormData',\n 'WebSocket',\n 'CloseEvent',\n 'ErrorEvent',\n 'MessageEvent',\n 'EventSource'\n ]\n)\n\nmodule.exports = {\n setGlobalDispatcher,\n getGlobalDispatcher,\n installedExports\n}\n","'use strict'\n\nconst assert = require('node:assert')\n\n/**\n * @deprecated\n */\nmodule.exports = class DecoratorHandler {\n #handler\n #onCompleteCalled = false\n #onErrorCalled = false\n #onResponseStartCalled = false\n\n constructor (handler) {\n if (typeof handler !== 'object' || handler === null) {\n throw new TypeError('handler must be an object')\n }\n this.#handler = handler\n }\n\n onRequestStart (...args) {\n this.#handler.onRequestStart?.(...args)\n }\n\n onRequestUpgrade (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n\n return this.#handler.onRequestUpgrade?.(...args)\n }\n\n onResponseStart (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n assert(!this.#onResponseStartCalled)\n\n this.#onResponseStartCalled = true\n\n return this.#handler.onResponseStart?.(...args)\n }\n\n onResponseData (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n\n return this.#handler.onResponseData?.(...args)\n }\n\n onResponseEnd (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n\n this.#onCompleteCalled = true\n return this.#handler.onResponseEnd?.(...args)\n }\n\n onResponseError (...args) {\n this.#onErrorCalled = true\n return this.#handler.onResponseError?.(...args)\n }\n\n /**\n * @deprecated\n */\n onBodySent () {}\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst assert = require('node:assert')\nconst { InvalidArgumentError } = require('../core/errors')\n\nconst redirectableStatusCodes = [300, 301, 302, 303, 307, 308]\n\nconst noop = () => {}\n\nclass RedirectHandler {\n static buildDispatch (dispatcher, maxRedirections) {\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n const dispatch = dispatcher.dispatch.bind(dispatcher)\n return (opts, originalHandler) => dispatch(opts, new RedirectHandler(dispatch, maxRedirections, opts, originalHandler))\n }\n\n constructor (dispatch, maxRedirections, opts, handler) {\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n this.dispatch = dispatch\n this.location = null\n const { maxRedirections: _, ...cleanOpts } = opts\n this.opts = cleanOpts // opts must be a copy, exclude maxRedirections\n this.opts.body = util.wrapRequestBody(this.opts.body)\n this.maxRedirections = maxRedirections\n this.handler = handler\n this.history = []\n }\n\n onRequestStart (controller, context) {\n this.handler.onRequestStart?.(controller, { ...context, history: this.history })\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {\n throw new Error('max redirects')\n }\n\n // https://tools.ietf.org/html/rfc7231#section-6.4.2\n // https://fetch.spec.whatwg.org/#http-redirect-fetch\n // In case of HTTP 301 or 302 with POST, change the method to GET\n if ((statusCode === 301 || statusCode === 302) && this.opts.method === 'POST') {\n this.opts.method = 'GET'\n if (util.isStream(this.opts.body)) {\n util.destroy(this.opts.body.on('error', noop))\n }\n this.opts.body = null\n }\n\n // https://tools.ietf.org/html/rfc7231#section-6.4.4\n // In case of HTTP 303, always replace method to be either HEAD or GET\n if (statusCode === 303 && this.opts.method !== 'HEAD') {\n this.opts.method = 'GET'\n if (util.isStream(this.opts.body)) {\n util.destroy(this.opts.body.on('error', noop))\n }\n this.opts.body = null\n }\n\n this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) || redirectableStatusCodes.indexOf(statusCode) === -1\n ? null\n : headers.location\n\n if (this.opts.origin) {\n this.history.push(new URL(this.opts.path, this.opts.origin))\n }\n\n if (!this.location) {\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n return\n }\n\n const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))\n const path = search ? `${pathname}${search}` : pathname\n\n // Check for redirect loops by seeing if we've already visited this URL in our history\n // This catches the case where Client/Pool try to handle cross-origin redirects but fail\n // and keep redirecting to the same URL in an infinite loop\n const redirectUrlString = `${origin}${path}`\n for (const historyUrl of this.history) {\n if (historyUrl.toString() === redirectUrlString) {\n throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`)\n }\n }\n\n // Remove headers referring to the original URL.\n // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.\n // https://tools.ietf.org/html/rfc7231#section-6.4\n this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)\n this.opts.path = path\n this.opts.origin = origin\n this.opts.query = null\n }\n\n onResponseData (controller, chunk) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response bodies.\n\n Redirection is used to serve the requested resource from another URL, so it assumes that\n no body is generated (and thus can be ignored). Even though generating a body is not prohibited.\n\n For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually\n (which means it's optional and not mandated) contain just an hyperlink to the value of\n the Location response header, so the body can be ignored safely.\n\n For status 300, which is \"Multiple Choices\", the spec mentions both generating a Location\n response header AND a response body with the other possible location to follow.\n Since the spec explicitly chooses not to specify a format for such body and leave it to\n servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it.\n */\n } else {\n this.handler.onResponseData?.(controller, chunk)\n }\n }\n\n onResponseEnd (controller, trailers) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections\n and neither are useful if present.\n\n See comment on onData method above for more detailed information.\n */\n this.dispatch(this.opts, this)\n } else {\n this.handler.onResponseEnd(controller, trailers)\n }\n }\n\n onResponseError (controller, error) {\n this.handler.onResponseError?.(controller, error)\n }\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4.4\nfunction shouldRemoveHeader (header, removeContent, unknownOrigin) {\n if (header.length === 4) {\n return util.headerNameToString(header) === 'host'\n }\n if (removeContent && util.headerNameToString(header).startsWith('content-')) {\n return true\n }\n if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) {\n const name = util.headerNameToString(header)\n return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization'\n }\n return false\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4\nfunction cleanRequestHeaders (headers, removeContent, unknownOrigin) {\n const ret = []\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {\n ret.push(headers[i], headers[i + 1])\n }\n }\n } else if (headers && typeof headers === 'object') {\n const entries = util.hasSafeIterator(headers) ? headers : Object.entries(headers)\n\n for (const [key, value] of entries) {\n if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {\n ret.push(key, value)\n }\n }\n } else {\n assert(headers == null, 'headers must be an object or an array')\n }\n return ret\n}\n\nmodule.exports = RedirectHandler\n","'use strict'\n\nconst RedirectHandler = require('../handler/redirect-handler')\n\nfunction createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections } = {}) {\n return (dispatch) => {\n return function Intercept (opts, handler) {\n const { maxRedirections = defaultMaxRedirections, ...rest } = opts\n\n if (maxRedirections == null || maxRedirections === 0) {\n return dispatch(opts, handler)\n }\n\n const dispatchOpts = { ...rest } // Stop sub dispatcher from also redirecting.\n const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler)\n return dispatch(dispatchOpts, redirectHandler)\n }\n }\n}\n\nmodule.exports = createRedirectInterceptor\n","'use strict'\n\n// const { parseHeaders } = require('../core/util')\nconst DecoratorHandler = require('../handler/decorator-handler')\nconst { ResponseError } = require('../core/errors')\n\nclass ResponseErrorHandler extends DecoratorHandler {\n #statusCode\n #contentType\n #decoder\n #headers\n #body\n\n constructor (_opts, { handler }) {\n super(handler)\n }\n\n #checkContentType (contentType) {\n return (this.#contentType ?? '').indexOf(contentType) === 0\n }\n\n onRequestStart (controller, context) {\n this.#statusCode = 0\n this.#contentType = null\n this.#decoder = null\n this.#headers = null\n this.#body = ''\n\n return super.onRequestStart(controller, context)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n this.#statusCode = statusCode\n this.#headers = headers\n this.#contentType = headers['content-type']\n\n if (this.#statusCode < 400) {\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n if (this.#checkContentType('application/json') || this.#checkContentType('text/plain')) {\n this.#decoder = new TextDecoder('utf-8')\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.#statusCode < 400) {\n return super.onResponseData(controller, chunk)\n }\n\n this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? ''\n }\n\n onResponseEnd (controller, trailers) {\n if (this.#statusCode >= 400) {\n this.#body += this.#decoder?.decode(undefined, { stream: false }) ?? ''\n\n if (this.#checkContentType('application/json')) {\n try {\n this.#body = JSON.parse(this.#body)\n } catch {\n // Do nothing...\n }\n }\n\n let err\n const stackTraceLimit = Error.stackTraceLimit\n Error.stackTraceLimit = 0\n try {\n err = new ResponseError('Response Error', this.#statusCode, {\n body: this.#body,\n headers: this.#headers\n })\n } finally {\n Error.stackTraceLimit = stackTraceLimit\n }\n\n super.onResponseError(controller, err)\n } else {\n super.onResponseEnd(controller, trailers)\n }\n }\n\n onResponseError (controller, err) {\n super.onResponseError(controller, err)\n }\n}\n\nmodule.exports = () => {\n return (dispatch) => {\n return function Intercept (opts, handler) {\n return dispatch(opts, new ResponseErrorHandler(opts, { handler }))\n }\n }\n}\n","'use strict'\nconst RetryHandler = require('../handler/retry-handler')\n\nmodule.exports = globalOpts => {\n return dispatch => {\n return function retryInterceptor (opts, handler) {\n return dispatch(\n opts,\n new RetryHandler(\n { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } },\n {\n handler,\n dispatch\n }\n )\n )\n }\n }\n}\n","'use strict'\n\nconst { InvalidArgumentError, RequestAbortedError } = require('../core/errors')\nconst DecoratorHandler = require('../handler/decorator-handler')\n\nclass DumpHandler extends DecoratorHandler {\n #maxSize = 1024 * 1024\n #dumped = false\n #size = 0\n #controller = null\n aborted = false\n reason = false\n\n constructor ({ maxSize, signal }, handler) {\n if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) {\n throw new InvalidArgumentError('maxSize must be a number greater than 0')\n }\n\n super(handler)\n\n this.#maxSize = maxSize ?? this.#maxSize\n // this.#handler = handler\n }\n\n #abort (reason) {\n this.aborted = true\n this.reason = reason\n }\n\n onRequestStart (controller, context) {\n controller.abort = this.#abort.bind(this)\n this.#controller = controller\n\n return super.onRequestStart(controller, context)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n const contentLength = headers['content-length']\n\n if (contentLength != null && contentLength > this.#maxSize) {\n throw new RequestAbortedError(\n `Response size (${contentLength}) larger than maxSize (${\n this.#maxSize\n })`\n )\n }\n\n if (this.aborted === true) {\n return true\n }\n\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n onResponseError (controller, err) {\n if (this.#dumped) {\n return\n }\n\n // On network errors before connect, controller will be null\n err = this.#controller?.reason ?? err\n\n super.onResponseError(controller, err)\n }\n\n onResponseData (controller, chunk) {\n this.#size = this.#size + chunk.length\n\n if (this.#size >= this.#maxSize) {\n this.#dumped = true\n\n if (this.aborted === true) {\n super.onResponseError(controller, this.reason)\n } else {\n super.onResponseEnd(controller, {})\n }\n }\n\n return true\n }\n\n onResponseEnd (controller, trailers) {\n if (this.#dumped) {\n return\n }\n\n if (this.#controller.aborted === true) {\n super.onResponseError(controller, this.reason)\n return\n }\n\n super.onResponseEnd(controller, trailers)\n }\n}\n\nfunction createDumpInterceptor (\n { maxSize: defaultMaxSize } = {\n maxSize: 1024 * 1024\n }\n) {\n return dispatch => {\n return function Intercept (opts, handler) {\n const { dumpMaxSize = defaultMaxSize } = opts\n\n const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal }, handler)\n\n return dispatch(opts, dumpHandler)\n }\n }\n}\n\nmodule.exports = createDumpInterceptor\n","'use strict'\nconst { isIP } = require('node:net')\nconst { lookup } = require('node:dns')\nconst DecoratorHandler = require('../handler/decorator-handler')\nconst { InvalidArgumentError, InformationalError } = require('../core/errors')\nconst maxInt = Math.pow(2, 31) - 1\n\nfunction hasSafeIterator (headers) {\n const prototype = Object.getPrototypeOf(headers)\n const ownIterator = Object.hasOwn(headers, Symbol.iterator)\n return ownIterator || (prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === 'function')\n}\n\nfunction isHostHeader (key) {\n return typeof key === 'string' && key.toLowerCase() === 'host'\n}\n\nfunction normalizeHeaders (headers) {\n if (headers == null) {\n return null\n }\n\n if (Array.isArray(headers)) {\n if (headers.length === 0 || !Array.isArray(headers[0])) {\n return headers\n }\n\n const normalized = []\n for (const header of headers) {\n if (Array.isArray(header) && header.length === 2) {\n normalized.push(header[0], header[1])\n } else {\n normalized.push(header)\n }\n }\n\n return normalized\n }\n\n if (typeof headers === 'object' && hasSafeIterator(headers)) {\n const normalized = []\n for (const header of headers) {\n if (Array.isArray(header) && header.length === 2) {\n normalized.push(header[0], header[1])\n } else {\n normalized.push(header)\n }\n }\n\n return normalized\n }\n\n return headers\n}\n\nfunction hasHostHeader (headers) {\n if (headers == null) {\n return false\n }\n\n if (Array.isArray(headers)) {\n if (headers.length === 0) {\n return false\n }\n\n for (let i = 0; i < headers.length; i += 2) {\n if (isHostHeader(headers[i])) {\n return true\n }\n }\n\n return false\n }\n\n if (typeof headers === 'object') {\n for (const key in headers) {\n if (isHostHeader(key)) {\n return true\n }\n }\n }\n\n return false\n}\n\nfunction withHostHeader (host, headers) {\n const normalizedHeaders = normalizeHeaders(headers)\n\n if (hasHostHeader(normalizedHeaders)) {\n return normalizedHeaders\n }\n\n if (Array.isArray(normalizedHeaders)) {\n return ['host', host, ...normalizedHeaders]\n }\n\n if (normalizedHeaders && typeof normalizedHeaders === 'object') {\n return {\n host,\n ...normalizedHeaders\n }\n }\n\n return { host }\n}\n\nclass DNSStorage {\n #maxItems = 0\n #records = new Map()\n\n constructor (opts) {\n this.#maxItems = opts.maxItems\n }\n\n get size () {\n return this.#records.size\n }\n\n get (hostname) {\n return this.#records.get(hostname) ?? null\n }\n\n set (hostname, records) {\n this.#records.set(hostname, records)\n }\n\n delete (hostname) {\n this.#records.delete(hostname)\n }\n\n // Delegate to storage decide can we do more lookups or not\n full () {\n return this.size >= this.#maxItems\n }\n}\n\nclass DNSInstance {\n #maxTTL = 0\n #maxItems = 0\n dualStack = true\n affinity = null\n lookup = null\n pick = null\n storage = null\n\n constructor (opts) {\n this.#maxTTL = opts.maxTTL\n this.#maxItems = opts.maxItems\n this.dualStack = opts.dualStack\n this.affinity = opts.affinity\n this.lookup = opts.lookup ?? this.#defaultLookup\n this.pick = opts.pick ?? this.#defaultPick\n this.storage = opts.storage ?? new DNSStorage(opts)\n }\n\n runLookup (origin, opts, cb) {\n const ips = this.storage.get(origin.hostname)\n\n // If full, we just return the origin\n if (ips == null && this.storage.full()) {\n cb(null, origin)\n return\n }\n\n const newOpts = {\n affinity: this.affinity,\n dualStack: this.dualStack,\n lookup: this.lookup,\n pick: this.pick,\n ...opts.dns,\n maxTTL: this.#maxTTL,\n maxItems: this.#maxItems\n }\n\n // If no IPs we lookup\n if (ips == null) {\n this.lookup(origin, newOpts, (err, addresses) => {\n if (err || addresses == null || addresses.length === 0) {\n cb(err ?? new InformationalError('No DNS entries found'))\n return\n }\n\n this.setRecords(origin, addresses)\n const records = this.storage.get(origin.hostname)\n\n const ip = this.pick(\n origin,\n records,\n newOpts.affinity\n )\n\n let port\n if (typeof ip.port === 'number') {\n port = `:${ip.port}`\n } else if (origin.port !== '') {\n port = `:${origin.port}`\n } else {\n port = ''\n }\n\n cb(\n null,\n new URL(`${origin.protocol}//${\n ip.family === 6 ? `[${ip.address}]` : ip.address\n }${port}`)\n )\n })\n } else {\n // If there's IPs we pick\n const ip = this.pick(\n origin,\n ips,\n newOpts.affinity\n )\n\n // If no IPs we lookup - deleting old records\n if (ip == null) {\n this.storage.delete(origin.hostname)\n this.runLookup(origin, opts, cb)\n return\n }\n\n let port\n if (typeof ip.port === 'number') {\n port = `:${ip.port}`\n } else if (origin.port !== '') {\n port = `:${origin.port}`\n } else {\n port = ''\n }\n\n cb(\n null,\n new URL(`${origin.protocol}//${\n ip.family === 6 ? `[${ip.address}]` : ip.address\n }${port}`)\n )\n }\n }\n\n #defaultLookup (origin, opts, cb) {\n lookup(\n origin.hostname,\n {\n all: true,\n family: this.dualStack === false ? this.affinity : 0,\n order: 'ipv4first'\n },\n (err, addresses) => {\n if (err) {\n return cb(err)\n }\n\n const results = new Map()\n\n for (const addr of addresses) {\n // On linux we found duplicates, we attempt to remove them with\n // the latest record\n results.set(`${addr.address}:${addr.family}`, addr)\n }\n\n cb(null, results.values())\n }\n )\n }\n\n #defaultPick (origin, hostnameRecords, affinity) {\n let ip = null\n const { records, offset } = hostnameRecords\n\n let family\n if (this.dualStack) {\n if (affinity == null) {\n // Balance between ip families\n if (offset == null || offset === maxInt) {\n hostnameRecords.offset = 0\n affinity = 4\n } else {\n hostnameRecords.offset++\n affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4\n }\n }\n\n if (records[affinity] != null && records[affinity].ips.length > 0) {\n family = records[affinity]\n } else {\n family = records[affinity === 4 ? 6 : 4]\n }\n } else {\n family = records[affinity]\n }\n\n // If no IPs we return null\n if (family == null || family.ips.length === 0) {\n return ip\n }\n\n if (family.offset == null || family.offset === maxInt) {\n family.offset = 0\n } else {\n family.offset++\n }\n\n const position = family.offset % family.ips.length\n ip = family.ips[position] ?? null\n\n if (ip == null) {\n return ip\n }\n\n if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms\n // We delete expired records\n // It is possible that they have different TTL, so we manage them individually\n family.ips.splice(position, 1)\n return this.pick(origin, hostnameRecords, affinity)\n }\n\n return ip\n }\n\n pickFamily (origin, ipFamily) {\n const records = this.storage.get(origin.hostname)?.records\n if (!records) {\n return null\n }\n\n const family = records[ipFamily]\n if (!family) {\n return null\n }\n\n if (family.offset == null || family.offset === maxInt) {\n family.offset = 0\n } else {\n family.offset++\n }\n\n const position = family.offset % family.ips.length\n const ip = family.ips[position] ?? null\n if (ip == null) {\n return ip\n }\n\n if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms\n // We delete expired records\n // It is possible that they have different TTL, so we manage them individually\n family.ips.splice(position, 1)\n }\n\n return ip\n }\n\n setRecords (origin, addresses) {\n const timestamp = Date.now()\n const records = { records: { 4: null, 6: null } }\n let minTTL = this.#maxTTL\n for (const record of addresses) {\n record.timestamp = timestamp\n if (typeof record.ttl === 'number') {\n // The record TTL is expected to be in ms\n record.ttl = Math.min(record.ttl, this.#maxTTL)\n minTTL = Math.min(minTTL, record.ttl)\n } else {\n record.ttl = this.#maxTTL\n }\n\n const familyRecords = records.records[record.family] ?? { ips: [] }\n\n familyRecords.ips.push(record)\n records.records[record.family] = familyRecords\n }\n\n // We provide a default TTL if external storage will be used without TTL per record-level support\n this.storage.set(origin.hostname, records, { ttl: minTTL })\n }\n\n deleteRecords (origin) {\n this.storage.delete(origin.hostname)\n }\n\n getHandler (meta, opts) {\n return new DNSDispatchHandler(this, meta, opts)\n }\n}\n\nclass DNSDispatchHandler extends DecoratorHandler {\n #state = null\n #opts = null\n #dispatch = null\n #origin = null\n #controller = null\n #newOrigin = null\n #firstTry = true\n\n constructor (state, { origin, handler, dispatch, newOrigin }, opts) {\n super(handler)\n this.#origin = origin\n this.#newOrigin = newOrigin\n this.#opts = { ...opts }\n this.#state = state\n this.#dispatch = dispatch\n }\n\n onResponseError (controller, err) {\n switch (err.code) {\n case 'ETIMEDOUT':\n case 'ECONNREFUSED': {\n if (this.#state.dualStack) {\n if (!this.#firstTry) {\n super.onResponseError(controller, err)\n return\n }\n this.#firstTry = false\n\n // Pick an ip address from the other family\n const otherFamily = this.#newOrigin.hostname[0] === '[' ? 4 : 6\n const ip = this.#state.pickFamily(this.#origin, otherFamily)\n if (ip == null) {\n super.onResponseError(controller, err)\n return\n }\n\n let port\n if (typeof ip.port === 'number') {\n port = `:${ip.port}`\n } else if (this.#origin.port !== '') {\n port = `:${this.#origin.port}`\n } else {\n port = ''\n }\n\n const dispatchOpts = {\n ...this.#opts,\n origin: `${this.#origin.protocol}//${\n ip.family === 6 ? `[${ip.address}]` : ip.address\n }${port}`,\n headers: withHostHeader(this.#origin.host, this.#opts.headers)\n }\n this.#dispatch(dispatchOpts, this)\n return\n }\n\n // if dual-stack disabled, we error out\n super.onResponseError(controller, err)\n break\n }\n case 'ENOTFOUND':\n this.#state.deleteRecords(this.#origin)\n super.onResponseError(controller, err)\n break\n default:\n super.onResponseError(controller, err)\n break\n }\n }\n}\n\nmodule.exports = interceptorOpts => {\n if (\n interceptorOpts?.maxTTL != null &&\n (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0)\n ) {\n throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number')\n }\n\n if (\n interceptorOpts?.maxItems != null &&\n (typeof interceptorOpts?.maxItems !== 'number' ||\n interceptorOpts?.maxItems < 1)\n ) {\n throw new InvalidArgumentError(\n 'Invalid maxItems. Must be a positive number and greater than zero'\n )\n }\n\n if (\n interceptorOpts?.affinity != null &&\n interceptorOpts?.affinity !== 4 &&\n interceptorOpts?.affinity !== 6\n ) {\n throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6')\n }\n\n if (\n interceptorOpts?.dualStack != null &&\n typeof interceptorOpts?.dualStack !== 'boolean'\n ) {\n throw new InvalidArgumentError('Invalid dualStack. Must be a boolean')\n }\n\n if (\n interceptorOpts?.lookup != null &&\n typeof interceptorOpts?.lookup !== 'function'\n ) {\n throw new InvalidArgumentError('Invalid lookup. Must be a function')\n }\n\n if (\n interceptorOpts?.pick != null &&\n typeof interceptorOpts?.pick !== 'function'\n ) {\n throw new InvalidArgumentError('Invalid pick. Must be a function')\n }\n\n if (\n interceptorOpts?.storage != null &&\n (typeof interceptorOpts?.storage?.get !== 'function' ||\n typeof interceptorOpts?.storage?.set !== 'function' ||\n typeof interceptorOpts?.storage?.full !== 'function' ||\n typeof interceptorOpts?.storage?.delete !== 'function'\n )\n ) {\n throw new InvalidArgumentError('Invalid storage. Must be a object with methods: { get, set, full, delete }')\n }\n\n const dualStack = interceptorOpts?.dualStack ?? true\n let affinity\n if (dualStack) {\n affinity = interceptorOpts?.affinity ?? null\n } else {\n affinity = interceptorOpts?.affinity ?? 4\n }\n\n const opts = {\n maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms\n lookup: interceptorOpts?.lookup ?? null,\n pick: interceptorOpts?.pick ?? null,\n dualStack,\n affinity,\n maxItems: interceptorOpts?.maxItems ?? Infinity,\n storage: interceptorOpts?.storage\n }\n\n const instance = new DNSInstance(opts)\n\n return dispatch => {\n return function dnsInterceptor (origDispatchOpts, handler) {\n const origin =\n origDispatchOpts.origin.constructor === URL\n ? origDispatchOpts.origin\n : new URL(origDispatchOpts.origin)\n\n if (isIP(origin.hostname) !== 0) {\n return dispatch(origDispatchOpts, handler)\n }\n\n instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => {\n if (err) {\n return handler.onResponseError(null, err)\n }\n\n const dispatchOpts = {\n ...origDispatchOpts,\n servername: origin.hostname, // For SNI on TLS\n origin: newOrigin.origin,\n headers: withHostHeader(origin.host, origDispatchOpts.headers)\n }\n\n dispatch(\n dispatchOpts,\n instance.getHandler(\n { origin, dispatch, handler, newOrigin },\n origDispatchOpts\n )\n )\n })\n\n return true\n }\n }\n}\n","'use strict'\n\nconst {\n safeHTTPMethods,\n pathHasQueryOrFragment,\n hasSafeIterator\n} = require('../core/util')\n\nconst { serializePathWithQuery } = require('../core/util')\n\n/**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts\n */\nfunction makeCacheKey (opts) {\n if (!opts.origin) {\n throw new Error('opts.origin is undefined')\n }\n\n let fullPath = opts.path || '/'\n\n if (opts.query && !pathHasQueryOrFragment(opts.path)) {\n fullPath = serializePathWithQuery(fullPath, opts.query)\n }\n\n return {\n origin: opts.origin.toString(),\n method: opts.method,\n path: fullPath,\n headers: opts.headers\n }\n}\n\n/**\n * @param {Record}\n * @returns {Record}\n */\nfunction normalizeHeaders (opts) {\n let headers\n if (opts.headers == null) {\n headers = {}\n } else if (typeof opts.headers === 'object') {\n headers = {}\n\n if (hasSafeIterator(opts.headers)) {\n for (const x of opts.headers) {\n if (!Array.isArray(x)) {\n throw new Error('opts.headers is not a valid header map')\n }\n const [key, val] = x\n if (typeof key !== 'string' || typeof val !== 'string') {\n throw new Error('opts.headers is not a valid header map')\n }\n headers[key.toLowerCase()] = val\n }\n } else {\n for (const key of Object.keys(opts.headers)) {\n headers[key.toLowerCase()] = opts.headers[key]\n }\n }\n } else {\n throw new Error('opts.headers is not an object')\n }\n\n return headers\n}\n\n/**\n * @param {any} key\n */\nfunction assertCacheKey (key) {\n if (typeof key !== 'object') {\n throw new TypeError(`expected key to be object, got ${typeof key}`)\n }\n\n for (const property of ['origin', 'method', 'path']) {\n if (typeof key[property] !== 'string') {\n throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`)\n }\n }\n\n if (key.headers !== undefined && typeof key.headers !== 'object') {\n throw new TypeError(`expected headers to be object, got ${typeof key}`)\n }\n}\n\n/**\n * @param {any} value\n */\nfunction assertCacheValue (value) {\n if (typeof value !== 'object') {\n throw new TypeError(`expected value to be object, got ${typeof value}`)\n }\n\n for (const property of ['statusCode', 'cachedAt', 'staleAt', 'deleteAt']) {\n if (typeof value[property] !== 'number') {\n throw new TypeError(`expected value.${property} to be number, got ${typeof value[property]}`)\n }\n }\n\n if (typeof value.statusMessage !== 'string') {\n throw new TypeError(`expected value.statusMessage to be string, got ${typeof value.statusMessage}`)\n }\n\n if (value.headers != null && typeof value.headers !== 'object') {\n throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value.headers}`)\n }\n\n if (value.vary !== undefined && typeof value.vary !== 'object') {\n throw new TypeError(`expected value.vary to be object, got ${typeof value.vary}`)\n }\n\n if (value.etag !== undefined && typeof value.etag !== 'string') {\n throw new TypeError(`expected value.etag to be string, got ${typeof value.etag}`)\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-cache-control\n * @see https://www.iana.org/assignments/http-cache-directives/http-cache-directives.xhtml\n\n * @param {string | string[]} header\n * @returns {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives}\n */\nfunction parseCacheControlHeader (header) {\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives}\n */\n const output = {}\n\n let directives\n if (Array.isArray(header)) {\n directives = []\n\n for (const directive of header) {\n directives.push(...directive.split(','))\n }\n } else {\n directives = header.split(',')\n }\n\n for (let i = 0; i < directives.length; i++) {\n const directive = directives[i].toLowerCase()\n const keyValueDelimiter = directive.indexOf('=')\n\n let key\n let value\n if (keyValueDelimiter !== -1) {\n key = directive.substring(0, keyValueDelimiter).trimStart()\n value = directive.substring(keyValueDelimiter + 1)\n } else {\n key = directive.trim()\n }\n\n switch (key) {\n case 'min-fresh':\n case 'max-stale':\n case 'max-age':\n case 's-maxage':\n case 'stale-while-revalidate':\n case 'stale-if-error': {\n if (value === undefined || value[0] === ' ') {\n continue\n }\n\n if (\n value.length >= 2 &&\n value[0] === '\"' &&\n value[value.length - 1] === '\"'\n ) {\n value = value.substring(1, value.length - 1)\n }\n\n const parsedValue = parseInt(value, 10)\n // eslint-disable-next-line no-self-compare\n if (parsedValue !== parsedValue) {\n continue\n }\n\n if (key === 'max-age' && key in output && output[key] >= parsedValue) {\n continue\n }\n\n output[key] = parsedValue\n\n break\n }\n case 'private':\n case 'no-cache': {\n if (value) {\n // The private and no-cache directives can be unqualified (aka just\n // `private` or `no-cache`) or qualified (w/ a value). When they're\n // qualified, it's a list of headers like `no-cache=header1`,\n // `no-cache=\"header1\"`, or `no-cache=\"header1, header2\"`\n // If we're given multiple headers, the comma messes us up since\n // we split the full header by commas. So, let's loop through the\n // remaining parts in front of us until we find one that ends in a\n // quote. We can then just splice all of the parts in between the\n // starting quote and the ending quote out of the directives array\n // and continue parsing like normal.\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-no-cache-2\n if (value[0] === '\"') {\n // Something like `no-cache=\"some-header\"` OR `no-cache=\"some-header, another-header\"`.\n\n // Add the first header on and cut off the leading quote\n const headers = [value.substring(1)]\n\n let foundEndingQuote = value[value.length - 1] === '\"'\n if (!foundEndingQuote) {\n // Something like `no-cache=\"some-header, another-header\"`\n // This can still be something invalid, e.g. `no-cache=\"some-header, ...`\n for (let j = i + 1; j < directives.length; j++) {\n const nextPart = directives[j]\n const nextPartLength = nextPart.length\n\n headers.push(nextPart.trim())\n\n if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '\"') {\n foundEndingQuote = true\n break\n }\n }\n }\n\n if (foundEndingQuote) {\n let lastHeader = headers[headers.length - 1]\n if (lastHeader[lastHeader.length - 1] === '\"') {\n lastHeader = lastHeader.substring(0, lastHeader.length - 1)\n headers[headers.length - 1] = lastHeader\n }\n\n if (key in output) {\n output[key] = output[key].concat(headers)\n } else {\n output[key] = headers\n }\n }\n } else {\n // Something like `no-cache=\"some-header\"`\n if (key in output) {\n output[key] = output[key].concat(value)\n } else {\n output[key] = [value]\n }\n }\n\n break\n }\n }\n // eslint-disable-next-line no-fallthrough\n case 'public':\n case 'no-store':\n case 'must-revalidate':\n case 'proxy-revalidate':\n case 'immutable':\n case 'no-transform':\n case 'must-understand':\n case 'only-if-cached':\n if (value) {\n // These are qualified (something like `public=...`) when they aren't\n // allowed to be, skip\n continue\n }\n\n output[key] = true\n break\n default:\n // Ignore unknown directives as per https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.3-1\n continue\n }\n }\n\n return output\n}\n\n/**\n * @param {string | string[]} varyHeader Vary header from the server\n * @param {Record} headers Request headers\n * @returns {Record}\n */\nfunction parseVaryHeader (varyHeader, headers) {\n if (typeof varyHeader === 'string' && varyHeader.includes('*')) {\n return headers\n }\n\n const output = /** @type {Record} */ ({})\n\n const varyingHeaders = typeof varyHeader === 'string'\n ? varyHeader.split(',')\n : varyHeader\n\n for (const header of varyingHeaders) {\n const trimmedHeader = header.trim().toLowerCase()\n\n output[trimmedHeader] = headers[trimmedHeader] ?? null\n }\n\n return output\n}\n\n/**\n * Note: this deviates from the spec a little. Empty etags (\"\", W/\"\") are valid,\n * however, including them in cached resposnes serves little to no purpose.\n *\n * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-etag\n *\n * @param {string} etag\n * @returns {boolean}\n */\nfunction isEtagUsable (etag) {\n if (etag.length <= 2) {\n // Shortest an etag can be is two chars (just \"\"). This is where we deviate\n // from the spec requiring a min of 3 chars however\n return false\n }\n\n if (etag[0] === '\"' && etag[etag.length - 1] === '\"') {\n // ETag: \"\"asd123\"\" or ETag: \"W/\"asd123\"\", kinda undefined behavior in the\n // spec. Some servers will accept these while others don't.\n // ETag: \"asd123\"\n return !(etag[1] === '\"' || etag.startsWith('\"W/'))\n }\n\n if (etag.startsWith('W/\"') && etag[etag.length - 1] === '\"') {\n // ETag: W/\"\", also where we deviate from the spec & require a min of 3\n // chars\n // ETag: for W/\"\", W/\"asd123\"\n return etag.length !== 4\n }\n\n // Anything else\n return false\n}\n\n/**\n * @param {unknown} store\n * @returns {asserts store is import('../../types/cache-interceptor.d.ts').default.CacheStore}\n */\nfunction assertCacheStore (store, name = 'CacheStore') {\n if (typeof store !== 'object' || store === null) {\n throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store === null ? 'null' : typeof store}`)\n }\n\n for (const fn of ['get', 'createWriteStream', 'delete']) {\n if (typeof store[fn] !== 'function') {\n throw new TypeError(`${name} needs to have a \\`${fn}()\\` function`)\n }\n }\n}\n/**\n * @param {unknown} methods\n * @returns {asserts methods is import('../../types/cache-interceptor.d.ts').default.CacheMethods[]}\n */\nfunction assertCacheMethods (methods, name = 'CacheMethods') {\n if (!Array.isArray(methods)) {\n throw new TypeError(`expected type of ${name} needs to be an array, got ${methods === null ? 'null' : typeof methods}`)\n }\n\n if (methods.length === 0) {\n throw new TypeError(`${name} needs to have at least one method`)\n }\n\n for (const method of methods) {\n if (!safeHTTPMethods.includes(method)) {\n throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(', ')}, got ${method}`)\n }\n }\n}\n\n/**\n * Creates a string key for request deduplication purposes.\n * This key is used to identify in-flight requests that can be shared.\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {Set} [excludeHeaders] Set of lowercase header names to exclude from the key\n * @returns {string}\n */\nfunction makeDeduplicationKey (cacheKey, excludeHeaders) {\n // Use JSON.stringify to produce a collision-resistant key.\n // Previous format used `:` and `=` delimiters without escaping, which\n // allowed different header sets to produce identical keys (e.g.\n // {a:\"x:b=y\"} vs {a:\"x\", b:\"y\"}). See: https://github.com/nodejs/undici/issues/5012\n const headers = {}\n\n if (cacheKey.headers) {\n const sortedHeaders = Object.keys(cacheKey.headers).sort()\n for (const header of sortedHeaders) {\n // Skip excluded headers\n if (excludeHeaders?.has(header.toLowerCase())) {\n continue\n }\n headers[header] = cacheKey.headers[header]\n }\n }\n\n return JSON.stringify([cacheKey.origin, cacheKey.method, cacheKey.path, headers])\n}\n\nmodule.exports = {\n makeCacheKey,\n normalizeHeaders,\n assertCacheKey,\n assertCacheValue,\n parseCacheControlHeader,\n parseVaryHeader,\n isEtagUsable,\n assertCacheMethods,\n assertCacheStore,\n makeDeduplicationKey\n}\n","'use strict'\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-date-time-formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseHttpDate (date) {\n // Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate\n // Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format\n // Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format\n\n switch (date[3]) {\n case ',': return parseImfDate(date)\n case ' ': return parseAscTimeDate(date)\n default: return parseRfc850Date(date)\n }\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#preferred.date.format\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseImfDate (date) {\n if (\n date.length !== 29 ||\n date[4] !== ' ' ||\n date[7] !== ' ' ||\n date[11] !== ' ' ||\n date[16] !== ' ' ||\n date[19] !== ':' ||\n date[22] !== ':' ||\n date[25] !== ' ' ||\n date[26] !== 'G' ||\n date[27] !== 'M' ||\n date[28] !== 'T'\n ) {\n return undefined\n }\n\n let weekday = -1\n if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday\n weekday = 0\n } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday\n weekday = 1\n } else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday\n weekday = 2\n } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday\n weekday = 3\n } else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday\n weekday = 4\n } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday\n weekday = 5\n } else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday\n weekday = 6\n } else {\n return undefined // Not a valid day of the week\n }\n\n let day = 0\n if (date[5] === '0') {\n // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n const code = date.charCodeAt(6)\n if (code < 49 || code > 57) {\n return undefined // Not a digit\n }\n day = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(5)\n if (code1 < 49 || code1 > 51) {\n return undefined // Not a digit between 1 and 3\n }\n const code2 = date.charCodeAt(6)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let monthIdx = -1\n if (\n (date[8] === 'J' && date[9] === 'a' && date[10] === 'n')\n ) {\n monthIdx = 0 // Jan\n } else if (\n (date[8] === 'F' && date[9] === 'e' && date[10] === 'b')\n ) {\n monthIdx = 1 // Feb\n } else if (\n (date[8] === 'M' && date[9] === 'a')\n ) {\n if (date[10] === 'r') {\n monthIdx = 2 // Mar\n } else if (date[10] === 'y') {\n monthIdx = 4 // May\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[8] === 'J')\n ) {\n if (date[9] === 'a' && date[10] === 'n') {\n monthIdx = 0 // Jan\n } else if (date[9] === 'u') {\n if (date[10] === 'n') {\n monthIdx = 5 // Jun\n } else if (date[10] === 'l') {\n monthIdx = 6 // Jul\n } else {\n return undefined // Invalid month\n }\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[8] === 'A')\n ) {\n if (date[9] === 'p' && date[10] === 'r') {\n monthIdx = 3 // Apr\n } else if (date[9] === 'u' && date[10] === 'g') {\n monthIdx = 7 // Aug\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[8] === 'S' && date[9] === 'e' && date[10] === 'p')\n ) {\n monthIdx = 8 // Sep\n } else if (\n (date[8] === 'O' && date[9] === 'c' && date[10] === 't')\n ) {\n monthIdx = 9 // Oct\n } else if (\n (date[8] === 'N' && date[9] === 'o' && date[10] === 'v')\n ) {\n monthIdx = 10 // Nov\n } else if (\n (date[8] === 'D' && date[9] === 'e' && date[10] === 'c')\n ) {\n monthIdx = 11 // Dec\n } else {\n // Not a valid month\n return undefined\n }\n\n const yearDigit1 = date.charCodeAt(12)\n if (yearDigit1 < 48 || yearDigit1 > 57) {\n return undefined // Not a digit\n }\n const yearDigit2 = date.charCodeAt(13)\n if (yearDigit2 < 48 || yearDigit2 > 57) {\n return undefined // Not a digit\n }\n const yearDigit3 = date.charCodeAt(14)\n if (yearDigit3 < 48 || yearDigit3 > 57) {\n return undefined // Not a digit\n }\n const yearDigit4 = date.charCodeAt(15)\n if (yearDigit4 < 48 || yearDigit4 > 57) {\n return undefined // Not a digit\n }\n const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)\n\n let hour = 0\n if (date[17] === '0') {\n const code = date.charCodeAt(18)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n hour = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(17)\n if (code1 < 48 || code1 > 50) {\n return undefined // Not a digit between 0 and 2\n }\n const code2 = date.charCodeAt(18)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n if (code1 === 50 && code2 > 51) {\n return undefined // Hour cannot be greater than 23\n }\n hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let minute = 0\n if (date[20] === '0') {\n const code = date.charCodeAt(21)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n minute = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(20)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(21)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let second = 0\n if (date[23] === '0') {\n const code = date.charCodeAt(24)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n second = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(23)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(24)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n return result.getUTCDay() === weekday ? result : undefined\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseAscTimeDate (date) {\n // This is assumed to be in UTC\n\n if (\n date.length !== 24 ||\n date[7] !== ' ' ||\n date[10] !== ' ' ||\n date[19] !== ' '\n ) {\n return undefined\n }\n\n let weekday = -1\n if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday\n weekday = 0\n } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday\n weekday = 1\n } else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday\n weekday = 2\n } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday\n weekday = 3\n } else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday\n weekday = 4\n } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday\n weekday = 5\n } else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday\n weekday = 6\n } else {\n return undefined // Not a valid day of the week\n }\n\n let monthIdx = -1\n if (\n (date[4] === 'J' && date[5] === 'a' && date[6] === 'n')\n ) {\n monthIdx = 0 // Jan\n } else if (\n (date[4] === 'F' && date[5] === 'e' && date[6] === 'b')\n ) {\n monthIdx = 1 // Feb\n } else if (\n (date[4] === 'M' && date[5] === 'a')\n ) {\n if (date[6] === 'r') {\n monthIdx = 2 // Mar\n } else if (date[6] === 'y') {\n monthIdx = 4 // May\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[4] === 'J')\n ) {\n if (date[5] === 'a' && date[6] === 'n') {\n monthIdx = 0 // Jan\n } else if (date[5] === 'u') {\n if (date[6] === 'n') {\n monthIdx = 5 // Jun\n } else if (date[6] === 'l') {\n monthIdx = 6 // Jul\n } else {\n return undefined // Invalid month\n }\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[4] === 'A')\n ) {\n if (date[5] === 'p' && date[6] === 'r') {\n monthIdx = 3 // Apr\n } else if (date[5] === 'u' && date[6] === 'g') {\n monthIdx = 7 // Aug\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[4] === 'S' && date[5] === 'e' && date[6] === 'p')\n ) {\n monthIdx = 8 // Sep\n } else if (\n (date[4] === 'O' && date[5] === 'c' && date[6] === 't')\n ) {\n monthIdx = 9 // Oct\n } else if (\n (date[4] === 'N' && date[5] === 'o' && date[6] === 'v')\n ) {\n monthIdx = 10 // Nov\n } else if (\n (date[4] === 'D' && date[5] === 'e' && date[6] === 'c')\n ) {\n monthIdx = 11 // Dec\n } else {\n // Not a valid month\n return undefined\n }\n\n let day = 0\n if (date[8] === ' ') {\n // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n const code = date.charCodeAt(9)\n if (code < 49 || code > 57) {\n return undefined // Not a digit\n }\n day = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(8)\n if (code1 < 49 || code1 > 51) {\n return undefined // Not a digit between 1 and 3\n }\n const code2 = date.charCodeAt(9)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let hour = 0\n if (date[11] === '0') {\n const code = date.charCodeAt(12)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n hour = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(11)\n if (code1 < 48 || code1 > 50) {\n return undefined // Not a digit between 0 and 2\n }\n const code2 = date.charCodeAt(12)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n if (code1 === 50 && code2 > 51) {\n return undefined // Hour cannot be greater than 23\n }\n hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let minute = 0\n if (date[14] === '0') {\n const code = date.charCodeAt(15)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n minute = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(14)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(15)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let second = 0\n if (date[17] === '0') {\n const code = date.charCodeAt(18)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n second = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(17)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(18)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n const yearDigit1 = date.charCodeAt(20)\n if (yearDigit1 < 48 || yearDigit1 > 57) {\n return undefined // Not a digit\n }\n const yearDigit2 = date.charCodeAt(21)\n if (yearDigit2 < 48 || yearDigit2 > 57) {\n return undefined // Not a digit\n }\n const yearDigit3 = date.charCodeAt(22)\n if (yearDigit3 < 48 || yearDigit3 > 57) {\n return undefined // Not a digit\n }\n const yearDigit4 = date.charCodeAt(23)\n if (yearDigit4 < 48 || yearDigit4 > 57) {\n return undefined // Not a digit\n }\n const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)\n\n const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n return result.getUTCDay() === weekday ? result : undefined\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseRfc850Date (date) {\n let commaIndex = -1\n\n let weekday = -1\n if (date[0] === 'S') {\n if (date[1] === 'u' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n weekday = 0 // Sunday\n commaIndex = 6\n } else if (date[1] === 'a' && date[2] === 't' && date[3] === 'u' && date[4] === 'r' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {\n weekday = 6 // Saturday\n commaIndex = 8\n }\n } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n weekday = 1 // Monday\n commaIndex = 6\n } else if (date[0] === 'T') {\n if (date[1] === 'u' && date[2] === 'e' && date[3] === 's' && date[4] === 'd' && date[5] === 'a' && date[6] === 'y') {\n weekday = 2 // Tuesday\n commaIndex = 7\n } else if (date[1] === 'h' && date[2] === 'u' && date[3] === 'r' && date[4] === 's' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {\n weekday = 4 // Thursday\n commaIndex = 8\n }\n } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd' && date[3] === 'n' && date[4] === 'e' && date[5] === 's' && date[6] === 'd' && date[7] === 'a' && date[8] === 'y') {\n weekday = 3 // Wednesday\n commaIndex = 9\n } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n weekday = 5 // Friday\n commaIndex = 6\n } else {\n // Not a valid day name\n return undefined\n }\n\n if (\n date[commaIndex] !== ',' ||\n (date.length - commaIndex - 1) !== 23 ||\n date[commaIndex + 1] !== ' ' ||\n date[commaIndex + 4] !== '-' ||\n date[commaIndex + 8] !== '-' ||\n date[commaIndex + 11] !== ' ' ||\n date[commaIndex + 14] !== ':' ||\n date[commaIndex + 17] !== ':' ||\n date[commaIndex + 20] !== ' ' ||\n date[commaIndex + 21] !== 'G' ||\n date[commaIndex + 22] !== 'M' ||\n date[commaIndex + 23] !== 'T'\n ) {\n return undefined\n }\n\n let day = 0\n if (date[commaIndex + 2] === '0') {\n // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n const code = date.charCodeAt(commaIndex + 3)\n if (code < 49 || code > 57) {\n return undefined // Not a digit\n }\n day = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 2)\n if (code1 < 49 || code1 > 51) {\n return undefined // Not a digit between 1 and 3\n }\n const code2 = date.charCodeAt(commaIndex + 3)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let monthIdx = -1\n if (\n (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'n')\n ) {\n monthIdx = 0 // Jan\n } else if (\n (date[commaIndex + 5] === 'F' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'b')\n ) {\n monthIdx = 1 // Feb\n } else if (\n (date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'r')\n ) {\n monthIdx = 2 // Mar\n } else if (\n (date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'p' && date[commaIndex + 7] === 'r')\n ) {\n monthIdx = 3 // Apr\n } else if (\n (date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'y')\n ) {\n monthIdx = 4 // May\n } else if (\n (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'n')\n ) {\n monthIdx = 5 // Jun\n } else if (\n (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'l')\n ) {\n monthIdx = 6 // Jul\n } else if (\n (date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'g')\n ) {\n monthIdx = 7 // Aug\n } else if (\n (date[commaIndex + 5] === 'S' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'p')\n ) {\n monthIdx = 8 // Sep\n } else if (\n (date[commaIndex + 5] === 'O' && date[commaIndex + 6] === 'c' && date[commaIndex + 7] === 't')\n ) {\n monthIdx = 9 // Oct\n } else if (\n (date[commaIndex + 5] === 'N' && date[commaIndex + 6] === 'o' && date[commaIndex + 7] === 'v')\n ) {\n monthIdx = 10 // Nov\n } else if (\n (date[commaIndex + 5] === 'D' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'c')\n ) {\n monthIdx = 11 // Dec\n } else {\n // Not a valid month\n return undefined\n }\n\n const yearDigit1 = date.charCodeAt(commaIndex + 9)\n if (yearDigit1 < 48 || yearDigit1 > 57) {\n return undefined // Not a digit\n }\n const yearDigit2 = date.charCodeAt(commaIndex + 10)\n if (yearDigit2 < 48 || yearDigit2 > 57) {\n return undefined // Not a digit\n }\n\n let year = (yearDigit1 - 48) * 10 + (yearDigit2 - 48) // Convert ASCII codes to number\n\n // RFC 6265 states that the year is in the range 1970-2069.\n // @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.1\n //\n // 3. If the year-value is greater than or equal to 70 and less than or\n // equal to 99, increment the year-value by 1900.\n // 4. If the year-value is greater than or equal to 0 and less than or\n // equal to 69, increment the year-value by 2000.\n year += year < 70 ? 2000 : 1900\n\n let hour = 0\n if (date[commaIndex + 12] === '0') {\n const code = date.charCodeAt(commaIndex + 13)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n hour = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 12)\n if (code1 < 48 || code1 > 50) {\n return undefined // Not a digit between 0 and 2\n }\n const code2 = date.charCodeAt(commaIndex + 13)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n if (code1 === 50 && code2 > 51) {\n return undefined // Hour cannot be greater than 23\n }\n hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let minute = 0\n if (date[commaIndex + 15] === '0') {\n const code = date.charCodeAt(commaIndex + 16)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n minute = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 15)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(commaIndex + 16)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let second = 0\n if (date[commaIndex + 18] === '0') {\n const code = date.charCodeAt(commaIndex + 19)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n second = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 18)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(commaIndex + 19)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n return result.getUTCDay() === weekday ? result : undefined\n}\n\nmodule.exports = {\n parseHttpDate\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst {\n parseCacheControlHeader,\n parseVaryHeader,\n isEtagUsable\n} = require('../util/cache')\nconst { parseHttpDate } = require('../util/date.js')\n\nfunction noop () {}\n\n// Status codes that we can use some heuristics on to cache\nconst HEURISTICALLY_CACHEABLE_STATUS_CODES = [\n 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501\n]\n\n// Status codes which semantic is not handled by the cache\n// https://datatracker.ietf.org/doc/html/rfc9111#section-3\n// This list should not grow beyond 206 unless the RFC is updated\n// by a newer one including more. Please introduce another list if\n// implementing caching of responses with the 'must-understand' directive.\nconst NOT_UNDERSTOOD_STATUS_CODES = [\n 206\n]\n\nconst MAX_RESPONSE_AGE = 2147483647000\n\n/**\n * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler\n *\n * @implements {DispatchHandler}\n */\nclass CacheHandler {\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}\n */\n #cacheKey\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions['type']}\n */\n #cacheType\n\n /**\n * @type {number | undefined}\n */\n #cacheByDefault\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheStore}\n */\n #store\n\n /**\n * @type {import('../../types/dispatcher.d.ts').default.DispatchHandler}\n */\n #handler\n\n /**\n * @type {import('node:stream').Writable | undefined}\n */\n #writeStream\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n */\n constructor ({ store, type, cacheByDefault }, cacheKey, handler) {\n this.#store = store\n this.#cacheType = type\n this.#cacheByDefault = cacheByDefault\n this.#cacheKey = cacheKey\n this.#handler = handler\n }\n\n onRequestStart (controller, context) {\n this.#writeStream?.destroy()\n this.#writeStream = undefined\n this.#handler.onRequestStart?.(controller, context)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {number} statusCode\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {string} statusMessage\n */\n onResponseStart (\n controller,\n statusCode,\n resHeaders,\n statusMessage\n ) {\n const downstreamOnHeaders = () =>\n this.#handler.onResponseStart?.(\n controller,\n statusCode,\n resHeaders,\n statusMessage\n )\n const handler = this\n\n if (\n !util.safeHTTPMethods.includes(this.#cacheKey.method) &&\n statusCode >= 200 &&\n statusCode <= 399\n ) {\n // Successful response to an unsafe method, delete it from cache\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-invalidating-stored-response\n try {\n this.#store.delete(this.#cacheKey)?.catch?.(noop)\n } catch {\n // Fail silently\n }\n return downstreamOnHeaders()\n }\n\n const cacheControlHeader = resHeaders['cache-control']\n const heuristicallyCacheable = resHeaders['last-modified'] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode)\n if (\n !cacheControlHeader &&\n !resHeaders['expires'] &&\n !heuristicallyCacheable &&\n !this.#cacheByDefault\n ) {\n // Don't have anything to tell us this response is cachable and we're not\n // caching by default\n return downstreamOnHeaders()\n }\n\n const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}\n if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {\n return downstreamOnHeaders()\n }\n\n const now = Date.now()\n const resAge = resHeaders.age ? getAge(resHeaders.age) : undefined\n if (resAge && resAge >= MAX_RESPONSE_AGE) {\n // Response considered stale\n return downstreamOnHeaders()\n }\n\n const resDate = typeof resHeaders.date === 'string'\n ? parseHttpDate(resHeaders.date)\n : undefined\n\n const staleAt =\n determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ??\n this.#cacheByDefault\n if (staleAt === undefined || (resAge && resAge > staleAt)) {\n return downstreamOnHeaders()\n }\n\n const baseTime = resDate ? resDate.getTime() : now\n const absoluteStaleAt = staleAt + baseTime\n if (now >= absoluteStaleAt) {\n // Response is already stale\n return downstreamOnHeaders()\n }\n\n let varyDirectives\n if (this.#cacheKey.headers && resHeaders.vary) {\n varyDirectives = parseVaryHeader(resHeaders.vary, this.#cacheKey.headers)\n if (!varyDirectives) {\n // Parse error\n return downstreamOnHeaders()\n }\n }\n\n const cachedAt = resAge ? now - resAge : now\n const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt)\n const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives)\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheValue}\n */\n const value = {\n statusCode,\n statusMessage,\n headers: strippedHeaders,\n vary: varyDirectives,\n cacheControlDirectives,\n cachedAt,\n staleAt: absoluteStaleAt,\n deleteAt\n }\n\n // Not modified, re-use the cached value\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-handling-304-not-modified\n if (statusCode === 304) {\n const handle304 = (cachedValue) => {\n if (!cachedValue) {\n // Do not create a new cache entry, as a 304 won't have a body - so cannot be cached.\n return downstreamOnHeaders()\n }\n\n // Re-use the cached value: statuscode, statusmessage, headers and body\n value.statusCode = cachedValue.statusCode\n value.statusMessage = cachedValue.statusMessage\n value.etag = cachedValue.etag\n value.headers = { ...cachedValue.headers, ...strippedHeaders }\n\n downstreamOnHeaders()\n\n this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value)\n\n if (!this.#writeStream || !cachedValue?.body) {\n return\n }\n\n if (typeof cachedValue.body.values === 'function') {\n const bodyIterator = cachedValue.body.values()\n\n const streamCachedBody = () => {\n for (const chunk of bodyIterator) {\n const full = this.#writeStream.write(chunk) === false\n this.#handler.onResponseData?.(controller, chunk)\n // when stream is full stop writing until we get a 'drain' event\n if (full) {\n break\n }\n }\n }\n\n this.#writeStream\n .on('error', function () {\n handler.#writeStream = undefined\n handler.#store.delete(handler.#cacheKey)\n })\n .on('drain', () => {\n streamCachedBody()\n })\n .on('close', function () {\n if (handler.#writeStream === this) {\n handler.#writeStream = undefined\n }\n })\n\n streamCachedBody()\n } else if (typeof cachedValue.body.on === 'function') {\n // Readable stream body (e.g. from async/remote cache stores)\n cachedValue.body\n .on('data', (chunk) => {\n this.#writeStream.write(chunk)\n this.#handler.onResponseData?.(controller, chunk)\n })\n .on('end', () => {\n this.#writeStream.end()\n })\n .on('error', () => {\n this.#writeStream = undefined\n this.#store.delete(this.#cacheKey)\n })\n\n this.#writeStream\n .on('error', function () {\n handler.#writeStream = undefined\n handler.#store.delete(handler.#cacheKey)\n })\n .on('close', function () {\n if (handler.#writeStream === this) {\n handler.#writeStream = undefined\n }\n })\n }\n }\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheValue}\n */\n const result = this.#store.get(this.#cacheKey)\n if (result && typeof result.then === 'function') {\n result.then(handle304)\n } else {\n handle304(result)\n }\n } else {\n if (typeof resHeaders.etag === 'string' && isEtagUsable(resHeaders.etag)) {\n value.etag = resHeaders.etag\n }\n\n this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value)\n\n if (!this.#writeStream) {\n return downstreamOnHeaders()\n }\n\n this.#writeStream\n .on('drain', () => controller.resume())\n .on('error', function () {\n // TODO (fix): Make error somehow observable?\n handler.#writeStream = undefined\n\n // Delete the value in case the cache store is holding onto state from\n // the call to createWriteStream\n handler.#store.delete(handler.#cacheKey)\n })\n .on('close', function () {\n if (handler.#writeStream === this) {\n handler.#writeStream = undefined\n }\n\n // TODO (fix): Should we resume even if was paused downstream?\n controller.resume()\n })\n\n downstreamOnHeaders()\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.#writeStream?.write(chunk) === false) {\n controller.pause()\n }\n\n this.#handler.onResponseData?.(controller, chunk)\n }\n\n onResponseEnd (controller, trailers) {\n this.#writeStream?.end()\n this.#handler.onResponseEnd?.(controller, trailers)\n }\n\n onResponseError (controller, err) {\n this.#writeStream?.destroy(err)\n this.#writeStream = undefined\n this.#handler.onResponseError?.(controller, err)\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen\n *\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType\n * @param {number} statusCode\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} [reqHeaders]\n */\nfunction canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {\n // Status code must be final and understood.\n if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {\n return false\n }\n // Responses with neither status codes that are heuristically cacheable, nor \"explicit enough\" caching\n // directives, are not cacheable. \"Explicit enough\": see https://www.rfc-editor.org/rfc/rfc9111.html#section-3\n if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders['expires'] &&\n !cacheControlDirectives.public &&\n cacheControlDirectives['max-age'] === undefined &&\n // RFC 9111: a private response directive, if the cache is not shared\n !(cacheControlDirectives.private && cacheType === 'private') &&\n !(cacheControlDirectives['s-maxage'] !== undefined && cacheType === 'shared')\n ) {\n return false\n }\n\n if (cacheControlDirectives['no-store']) {\n return false\n }\n\n if (cacheType === 'shared' && cacheControlDirectives.private === true) {\n return false\n }\n\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-4.1-5\n if (resHeaders.vary?.includes('*')) {\n return false\n }\n\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen\n if (reqHeaders?.authorization) {\n if (\n !cacheControlDirectives.public &&\n !cacheControlDirectives['s-maxage'] &&\n !cacheControlDirectives['must-revalidate']\n ) {\n return false\n }\n\n if (typeof reqHeaders.authorization !== 'string') {\n return false\n }\n\n if (\n Array.isArray(cacheControlDirectives['no-cache']) &&\n cacheControlDirectives['no-cache'].includes('authorization')\n ) {\n return false\n }\n\n if (\n Array.isArray(cacheControlDirectives['private']) &&\n cacheControlDirectives['private'].includes('authorization')\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @param {string | string[]} ageHeader\n * @returns {number | undefined}\n */\nfunction getAge (ageHeader) {\n const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader)\n\n return isNaN(age) ? undefined : age * 1000\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType\n * @param {number} now\n * @param {number | undefined} age\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {Date | undefined} responseDate\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n *\n * @returns {number | undefined} time that the value is stale at in seconds or undefined if it shouldn't be cached\n */\nfunction determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) {\n if (cacheType === 'shared') {\n // Prioritize s-maxage since we're a shared cache\n // s-maxage > max-age > Expire\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10-3\n const sMaxAge = cacheControlDirectives['s-maxage']\n if (sMaxAge !== undefined) {\n return sMaxAge > 0 ? sMaxAge * 1000 : undefined\n }\n }\n\n const maxAge = cacheControlDirectives['max-age']\n if (maxAge !== undefined) {\n return maxAge > 0 ? maxAge * 1000 : undefined\n }\n\n if (typeof resHeaders.expires === 'string') {\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.3\n const expiresDate = parseHttpDate(resHeaders.expires)\n if (expiresDate) {\n if (now >= expiresDate.getTime()) {\n return undefined\n }\n\n if (responseDate) {\n if (responseDate >= expiresDate) {\n return undefined\n }\n\n if (age !== undefined && age > (expiresDate - responseDate)) {\n return undefined\n }\n }\n\n return expiresDate.getTime() - now\n }\n }\n\n if (typeof resHeaders['last-modified'] === 'string') {\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-heuristic-fresh\n const lastModified = new Date(resHeaders['last-modified'])\n if (isValidDate(lastModified)) {\n if (lastModified.getTime() >= now) {\n return undefined\n }\n\n const responseAge = now - lastModified.getTime()\n\n return responseAge * 0.1\n }\n }\n\n if (cacheControlDirectives.immutable) {\n // https://www.rfc-editor.org/rfc/rfc8246.html#section-2.2\n return 31536000\n }\n\n return undefined\n}\n\n/**\n * @param {number} baseTime\n * @param {number} cachedAt\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @param {number} staleAt\n */\nfunction determineDeleteAt (baseTime, cachedAt, cacheControlDirectives, staleAt) {\n let staleWhileRevalidate = -Infinity\n let staleIfError = -Infinity\n let immutable = -Infinity\n\n if (cacheControlDirectives['stale-while-revalidate']) {\n staleWhileRevalidate = staleAt + (cacheControlDirectives['stale-while-revalidate'] * 1000)\n }\n\n if (cacheControlDirectives['stale-if-error']) {\n staleIfError = staleAt + (cacheControlDirectives['stale-if-error'] * 1000)\n }\n\n if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {\n immutable = cachedAt + 31536000000\n }\n\n // When no stale directives or immutable flag, add a revalidation buffer\n // equal to the freshness lifetime so the entry survives past staleAt long\n // enough to be revalidated instead of silently disappearing.\n //\n // Response Date headers only have second precision, so baseTime can trail the\n // actual cache insertion time by up to ~1s. Pad the buffer by that bounded\n // skew so short-lived entries do not disappear exactly when they should be\n // revalidated.\n if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {\n const freshnessLifetime = staleAt - baseTime\n const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1000)\n return staleAt + freshnessLifetime + datePrecisionPadding\n }\n\n return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable)\n}\n\n/**\n * Strips headers required to be removed in cached responses\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @returns {Record}\n */\nfunction stripNecessaryHeaders (resHeaders, cacheControlDirectives) {\n const headersToRemove = [\n 'connection',\n 'proxy-authenticate',\n 'proxy-authentication-info',\n 'proxy-authorization',\n 'proxy-connection',\n 'te',\n 'transfer-encoding',\n 'upgrade',\n // We'll add age back when serving it\n 'age'\n ]\n\n if (resHeaders['connection']) {\n if (Array.isArray(resHeaders['connection'])) {\n // connection: a\n // connection: b\n headersToRemove.push(...resHeaders['connection'].map(header => header.trim()))\n } else {\n // connection: a, b\n headersToRemove.push(...resHeaders['connection'].split(',').map(header => header.trim()))\n }\n }\n\n if (Array.isArray(cacheControlDirectives['no-cache'])) {\n headersToRemove.push(...cacheControlDirectives['no-cache'])\n }\n\n if (Array.isArray(cacheControlDirectives['private'])) {\n headersToRemove.push(...cacheControlDirectives['private'])\n }\n\n let strippedHeaders\n for (const headerName of headersToRemove) {\n if (resHeaders[headerName]) {\n strippedHeaders ??= { ...resHeaders }\n delete strippedHeaders[headerName]\n }\n }\n\n return strippedHeaders ?? resHeaders\n}\n\n/**\n * @param {Date} date\n * @returns {boolean}\n */\nfunction isValidDate (date) {\n return date instanceof Date && Number.isFinite(date.valueOf())\n}\n\nmodule.exports = CacheHandler\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst { EventEmitter } = require('node:events')\nconst { assertCacheKey, assertCacheValue } = require('../util/cache.js')\n\n/**\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheKey} CacheKey\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheValue} CacheValue\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore\n * @typedef {import('../../types/cache-interceptor.d.ts').default.GetResult} GetResult\n */\n\n/**\n * @implements {CacheStore}\n * @extends {EventEmitter}\n */\nclass MemoryCacheStore extends EventEmitter {\n #maxCount = 1024\n #maxSize = 104857600 // 100MB\n #maxEntrySize = 5242880 // 5MB\n\n #size = 0\n #count = 0\n #entries = new Map()\n #hasEmittedMaxSizeEvent = false\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts]\n */\n constructor (opts) {\n super()\n if (opts) {\n if (typeof opts !== 'object') {\n throw new TypeError('MemoryCacheStore options must be an object')\n }\n\n if (opts.maxCount !== undefined) {\n if (\n typeof opts.maxCount !== 'number' ||\n !Number.isInteger(opts.maxCount) ||\n opts.maxCount < 0\n ) {\n throw new TypeError('MemoryCacheStore options.maxCount must be a non-negative integer')\n }\n this.#maxCount = opts.maxCount\n }\n\n if (opts.maxSize !== undefined) {\n if (\n typeof opts.maxSize !== 'number' ||\n !Number.isInteger(opts.maxSize) ||\n opts.maxSize < 0\n ) {\n throw new TypeError('MemoryCacheStore options.maxSize must be a non-negative integer')\n }\n this.#maxSize = opts.maxSize\n }\n\n if (opts.maxEntrySize !== undefined) {\n if (\n typeof opts.maxEntrySize !== 'number' ||\n !Number.isInteger(opts.maxEntrySize) ||\n opts.maxEntrySize < 0\n ) {\n throw new TypeError('MemoryCacheStore options.maxEntrySize must be a non-negative integer')\n }\n this.#maxEntrySize = opts.maxEntrySize\n }\n }\n }\n\n /**\n * Get the current size of the cache in bytes\n * @returns {number} The current size of the cache in bytes\n */\n get size () {\n return this.#size\n }\n\n /**\n * Check if the cache is full (either max size or max count reached)\n * @returns {boolean} True if the cache is full, false otherwise\n */\n isFull () {\n return this.#size >= this.#maxSize || this.#count >= this.#maxCount\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req\n * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined}\n */\n get (key) {\n assertCacheKey(key)\n\n const topLevelKey = `${key.origin}:${key.path}`\n\n const now = Date.now()\n const entries = this.#entries.get(topLevelKey)\n\n const entry = entries ? findEntry(key, entries, now) : null\n\n return entry == null\n ? undefined\n : {\n statusMessage: entry.statusMessage,\n statusCode: entry.statusCode,\n headers: entry.headers,\n body: entry.body,\n vary: entry.vary ? entry.vary : undefined,\n etag: entry.etag,\n cacheControlDirectives: entry.cacheControlDirectives,\n cachedAt: entry.cachedAt,\n staleAt: entry.staleAt,\n deleteAt: entry.deleteAt\n }\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} val\n * @returns {Writable | undefined}\n */\n createWriteStream (key, val) {\n assertCacheKey(key)\n assertCacheValue(val)\n\n const topLevelKey = `${key.origin}:${key.path}`\n\n const store = this\n const entry = { ...key, ...val, body: [], size: 0 }\n\n return new Writable({\n write (chunk, encoding, callback) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding)\n }\n\n entry.size += chunk.byteLength\n\n if (entry.size >= store.#maxEntrySize) {\n this.destroy()\n } else {\n entry.body.push(chunk)\n }\n\n callback(null)\n },\n final (callback) {\n let entries = store.#entries.get(topLevelKey)\n if (!entries) {\n entries = []\n store.#entries.set(topLevelKey, entries)\n }\n const previousEntry = findEntry(key, entries, Date.now())\n if (previousEntry) {\n const index = entries.indexOf(previousEntry)\n entries.splice(index, 1, entry)\n store.#size -= previousEntry.size\n } else {\n entries.push(entry)\n store.#count += 1\n }\n\n store.#size += entry.size\n\n // Check if cache is full and emit event if needed\n if (store.#size > store.#maxSize || store.#count > store.#maxCount) {\n // Emit maxSizeExceeded event if we haven't already\n if (!store.#hasEmittedMaxSizeEvent) {\n store.emit('maxSizeExceeded', {\n size: store.#size,\n maxSize: store.#maxSize,\n count: store.#count,\n maxCount: store.#maxCount\n })\n store.#hasEmittedMaxSizeEvent = true\n }\n\n // Perform eviction\n for (const [key, entries] of store.#entries) {\n for (const entry of entries.splice(0, entries.length / 2)) {\n store.#size -= entry.size\n store.#count -= 1\n }\n if (entries.length === 0) {\n store.#entries.delete(key)\n }\n }\n\n // Reset the event flag after eviction\n if (store.#size < store.#maxSize && store.#count < store.#maxCount) {\n store.#hasEmittedMaxSizeEvent = false\n }\n }\n\n callback(null)\n }\n })\n }\n\n /**\n * @param {CacheKey} key\n */\n delete (key) {\n if (typeof key !== 'object') {\n throw new TypeError(`expected key to be object, got ${typeof key}`)\n }\n\n const topLevelKey = `${key.origin}:${key.path}`\n\n for (const entry of this.#entries.get(topLevelKey) ?? []) {\n this.#size -= entry.size\n this.#count -= 1\n }\n this.#entries.delete(topLevelKey)\n }\n}\n\nfunction findEntry (key, entries, now) {\n return entries.find((entry) => (\n entry.deleteAt > now &&\n entry.method === key.method &&\n (entry.vary == null || Object.keys(entry.vary).every(headerName => {\n if (entry.vary[headerName] === null) {\n return key.headers[headerName] === undefined\n }\n\n return entry.vary[headerName] === key.headers[headerName]\n }))\n ))\n}\n\nmodule.exports = MemoryCacheStore\n","'use strict'\n\nconst assert = require('node:assert')\n\n/**\n * This takes care of revalidation requests we send to the origin. If we get\n * a response indicating that what we have is cached (via a HTTP 304), we can\n * continue using the cached value. Otherwise, we'll receive the new response\n * here, which we then just pass on to the next handler (most likely a\n * CacheHandler). Note that this assumes the proper headers were already\n * included in the request to tell the origin that we want to revalidate the\n * response (i.e. if-modified-since or if-none-match).\n *\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-validation\n *\n * @implements {import('../../types/dispatcher.d.ts').default.DispatchHandler}\n */\nclass CacheRevalidationHandler {\n #successful = false\n\n /**\n * @type {((boolean, any) => void) | null}\n */\n #callback\n\n /**\n * @type {(import('../../types/dispatcher.d.ts').default.DispatchHandler)}\n */\n #handler\n\n #context\n\n /**\n * @type {boolean}\n */\n #allowErrorStatusCodes\n\n /**\n * @param {(boolean) => void} callback Function to call if the cached value is valid\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler\n * @param {boolean} allowErrorStatusCodes\n */\n constructor (callback, handler, allowErrorStatusCodes) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function')\n }\n\n this.#callback = callback\n this.#handler = handler\n this.#allowErrorStatusCodes = allowErrorStatusCodes\n }\n\n onRequestStart (_, context) {\n this.#successful = false\n this.#context = context\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n onResponseStart (\n controller,\n statusCode,\n headers,\n statusMessage\n ) {\n assert(this.#callback != null)\n\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-handling-a-validation-respo\n // https://datatracker.ietf.org/doc/html/rfc5861#section-4\n this.#successful = statusCode === 304 ||\n (this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504)\n this.#callback(this.#successful, this.#context)\n this.#callback = null\n\n if (this.#successful) {\n return true\n }\n\n this.#handler.onRequestStart?.(controller, this.#context)\n this.#handler.onResponseStart?.(\n controller,\n statusCode,\n headers,\n statusMessage\n )\n }\n\n onResponseData (controller, chunk) {\n if (this.#successful) {\n return\n }\n\n return this.#handler.onResponseData?.(controller, chunk)\n }\n\n onResponseEnd (controller, trailers) {\n if (this.#successful) {\n return\n }\n\n this.#handler.onResponseEnd?.(controller, trailers)\n }\n\n onResponseError (controller, err) {\n if (this.#successful) {\n return\n }\n\n if (this.#callback) {\n this.#callback(false)\n this.#callback = null\n }\n\n if (typeof this.#handler.onResponseError === 'function') {\n this.#handler.onResponseError(controller, err)\n } else {\n throw err\n }\n }\n}\n\nmodule.exports = CacheRevalidationHandler\n","'use strict'\n\nconst assert = require('node:assert')\nconst { Readable } = require('node:stream')\nconst util = require('../core/util')\nconst CacheHandler = require('../handler/cache-handler')\nconst MemoryCacheStore = require('../cache/memory-cache-store')\nconst CacheRevalidationHandler = require('../handler/cache-revalidation-handler')\nconst { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = require('../util/cache.js')\nconst { AbortError } = require('../core/errors.js')\n\n/**\n * @param {(string | RegExp)[] | undefined} origins\n * @param {string} name\n */\nfunction assertCacheOrigins (origins, name) {\n if (origins === undefined) return\n if (!Array.isArray(origins)) {\n throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`)\n }\n for (let i = 0; i < origins.length; i++) {\n const origin = origins[i]\n if (typeof origin !== 'string' && !(origin instanceof RegExp)) {\n throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`)\n }\n }\n}\n\nconst nop = () => {}\n\n/**\n * @typedef {(options: import('../../types/dispatcher.d.ts').default.DispatchOptions, handler: import('../../types/dispatcher.d.ts').default.DispatchHandler) => void} DispatchFn\n */\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @returns {boolean}\n */\nfunction needsRevalidation (result, cacheControlDirectives, { headers = {} }) {\n // Always revalidate requests with the no-cache request directive.\n if (cacheControlDirectives?.['no-cache']) {\n return true\n }\n\n // Always revalidate requests with unqualified no-cache response directive.\n if (result.cacheControlDirectives?.['no-cache'] && !Array.isArray(result.cacheControlDirectives['no-cache'])) {\n return true\n }\n\n // Always revalidate requests with conditional headers.\n if (headers['if-modified-since'] || headers['if-none-match']) {\n return true\n }\n\n return false\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives\n * @returns {boolean}\n */\nfunction isStale (result, cacheControlDirectives) {\n const now = Date.now()\n if (now > result.staleAt) {\n // Response is stale\n if (cacheControlDirectives?.['max-stale']) {\n // There's a threshold where we can serve stale responses, let's see if\n // we're in it\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-max-stale\n const gracePeriod = result.staleAt + (cacheControlDirectives['max-stale'] * 1000)\n return now > gracePeriod\n }\n\n return true\n }\n\n if (cacheControlDirectives?.['min-fresh']) {\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.3\n\n // At this point, staleAt is always > now\n const timeLeftTillStale = result.staleAt - now\n const threshold = cacheControlDirectives['min-fresh'] * 1000\n\n return timeLeftTillStale <= threshold\n }\n\n return false\n}\n\n/**\n * Check if we're within the stale-while-revalidate window for a stale response\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @returns {boolean}\n */\nfunction withinStaleWhileRevalidateWindow (result) {\n const staleWhileRevalidate = result.cacheControlDirectives?.['stale-while-revalidate']\n if (!staleWhileRevalidate) {\n return false\n }\n\n const now = Date.now()\n const staleWhileRevalidateExpiry = result.staleAt + (staleWhileRevalidate * 1000)\n return now <= staleWhileRevalidateExpiry\n}\n\n/**\n * @param {DispatchFn} dispatch\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl\n */\nfunction handleUncachedResponse (\n dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl\n) {\n if (reqCacheControl?.['only-if-cached']) {\n let aborted = false\n\n const controller = {\n paused: false,\n rawHeaders: [],\n rawTrailers: [],\n pause () {\n this.paused = true\n },\n resume () {\n this.paused = false\n },\n abort: (reason) => {\n aborted = true\n handler.onResponseError?.(controller, reason ?? new AbortError())\n }\n }\n\n try {\n handler.onRequestStart?.(controller, null)\n\n if (aborted) {\n return\n }\n\n handler.onResponseStart?.(controller, 504, {}, 'Gateway Timeout')\n if (aborted) {\n return\n }\n\n handler.onResponseEnd?.(controller, {})\n } catch (err) {\n if (typeof handler.onResponseError === 'function') {\n handler.onResponseError(controller, err)\n }\n }\n\n return true\n }\n\n return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n}\n\n/**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {number} age\n * @param {any} context\n * @param {boolean} isStale\n */\nfunction sendCachedValue (handler, opts, result, age, context, isStale) {\n // TODO (perf): Readable.from path can be optimized...\n const stream = util.isStream(result.body)\n ? result.body\n : Readable.from(result.body ?? [])\n\n assert(!stream.destroyed, 'stream should not be destroyed')\n assert(!stream.readableDidRead, 'stream should not be readableDidRead')\n\n const controller = {\n rawHeaders: [],\n rawTrailers: [],\n resume () {\n stream.resume()\n },\n pause () {\n stream.pause()\n },\n get paused () {\n return stream.isPaused()\n },\n get aborted () {\n return stream.destroyed\n },\n get reason () {\n return stream.errored\n },\n abort (reason) {\n stream.destroy(reason ?? new AbortError())\n }\n }\n\n stream\n .on('error', function (err) {\n if (!this.readableEnded) {\n if (typeof handler.onResponseError === 'function') {\n handler.onResponseError(controller, err)\n } else {\n throw err\n }\n }\n })\n .on('close', function () {\n if (!this.errored) {\n handler.onResponseEnd?.(controller, {})\n }\n })\n\n handler.onRequestStart?.(controller, context)\n\n if (stream.destroyed) {\n return\n }\n\n // Add the age header\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-age\n const headers = { ...result.headers, age: String(age) }\n\n if (isStale) {\n // Add warning header\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Warning\n headers.warning = '110 - \"response is stale\"'\n }\n\n controller.rawHeaders = util.toRawHeaders(headers)\n\n handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage)\n\n if (opts.method === 'HEAD') {\n stream.destroy()\n } else {\n stream.on('data', function (chunk) {\n handler.onResponseData?.(controller, chunk)\n })\n }\n}\n\n/**\n * @param {DispatchFn} dispatch\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} result\n */\nfunction handleResult (\n dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl,\n result\n) {\n if (!result) {\n return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)\n }\n\n const now = Date.now()\n if (now > result.deleteAt) {\n // Response is expired, cache store shouldn't have given this to us\n return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n }\n\n const age = Math.round((now - result.cachedAt) / 1000)\n if (reqCacheControl?.['max-age'] && age >= reqCacheControl['max-age']) {\n // Response is considered expired for this specific request\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.1\n return dispatch(opts, handler)\n }\n\n const stale = isStale(result, reqCacheControl)\n const revalidate = needsRevalidation(result, reqCacheControl, opts)\n\n // Check if the response is stale\n if (stale || revalidate) {\n if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) {\n // If body is a stream we can't revalidate...\n // TODO (fix): This could be less strict...\n return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n }\n\n // RFC 5861: If we're within stale-while-revalidate window, serve stale immediately\n // and revalidate in background, unless immediate revalidation is necessary\n if (!revalidate && withinStaleWhileRevalidateWindow(result)) {\n // Serve stale response immediately\n sendCachedValue(handler, opts, result, age, null, true)\n\n // Start background revalidation (fire-and-forget)\n queueMicrotask(() => {\n const headers = {\n ...opts.headers,\n 'if-modified-since': new Date(result.cachedAt).toUTCString()\n }\n\n if (result.etag) {\n headers['if-none-match'] = result.etag\n }\n\n if (result.vary) {\n for (const key in result.vary) {\n if (result.vary[key] != null) {\n headers[key] = result.vary[key]\n }\n }\n }\n\n // Background revalidation - update cache if we get new data\n dispatch(\n {\n ...opts,\n headers\n },\n new CacheHandler(globalOpts, cacheKey, {\n // Silent handler that just updates the cache\n onRequestStart () {},\n onRequestUpgrade () {},\n onResponseStart () {},\n onResponseData () {},\n onResponseEnd () {},\n onResponseError () {}\n })\n )\n })\n\n return true\n }\n\n let withinStaleIfErrorThreshold = false\n const staleIfErrorExpiry = result.cacheControlDirectives['stale-if-error'] ?? reqCacheControl?.['stale-if-error']\n if (staleIfErrorExpiry) {\n withinStaleIfErrorThreshold = now < (result.staleAt + (staleIfErrorExpiry * 1000))\n }\n\n const headers = {\n ...opts.headers,\n 'if-modified-since': new Date(result.cachedAt).toUTCString()\n }\n\n if (result.etag) {\n headers['if-none-match'] = result.etag\n }\n\n if (result.vary) {\n for (const key in result.vary) {\n if (result.vary[key] != null) {\n headers[key] = result.vary[key]\n }\n }\n }\n\n // We need to revalidate the response\n return dispatch(\n {\n ...opts,\n headers\n },\n new CacheRevalidationHandler(\n (success, context) => {\n if (success) {\n // TODO: successful revalidation should be considered fresh (not give stale warning).\n sendCachedValue(handler, opts, result, age, context, stale)\n } else if (util.isStream(result.body)) {\n result.body.on('error', nop).destroy()\n }\n },\n new CacheHandler(globalOpts, cacheKey, handler),\n withinStaleIfErrorThreshold\n )\n )\n }\n\n // Dump request body.\n if (util.isStream(opts.body)) {\n opts.body.on('error', nop).destroy()\n }\n\n sendCachedValue(handler, opts, result, age, null, false)\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions} [opts]\n * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}\n */\nmodule.exports = (opts = {}) => {\n const {\n store = new MemoryCacheStore(),\n methods = ['GET'],\n cacheByDefault = undefined,\n type = 'shared',\n origins = undefined\n } = opts\n\n if (typeof opts !== 'object' || opts === null) {\n throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)\n }\n\n assertCacheStore(store, 'opts.store')\n assertCacheMethods(methods, 'opts.methods')\n assertCacheOrigins(origins, 'opts.origins')\n\n if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') {\n throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`)\n }\n\n if (typeof type !== 'undefined' && type !== 'shared' && type !== 'private') {\n throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`)\n }\n\n const globalOpts = {\n store,\n methods,\n cacheByDefault,\n type\n }\n\n const safeMethodsToNotCache = util.safeHTTPMethods.filter(method => methods.includes(method) === false)\n\n return dispatch => {\n return (opts, handler) => {\n if (!opts.origin || safeMethodsToNotCache.includes(opts.method)) {\n // Not a method we want to cache or we don't have the origin, skip\n return dispatch(opts, handler)\n }\n\n // Check if origin is in whitelist\n if (origins !== undefined) {\n const requestOrigin = opts.origin.toString().toLowerCase()\n let isAllowed = false\n\n for (let i = 0; i < origins.length; i++) {\n const allowed = origins[i]\n if (typeof allowed === 'string') {\n if (allowed.toLowerCase() === requestOrigin) {\n isAllowed = true\n break\n }\n } else if (allowed.test(requestOrigin)) {\n isAllowed = true\n break\n }\n }\n\n if (!isAllowed) {\n return dispatch(opts, handler)\n }\n }\n\n opts = {\n ...opts,\n headers: normalizeHeaders(opts)\n }\n\n const reqCacheControl = opts.headers?.['cache-control']\n ? parseCacheControlHeader(opts.headers['cache-control'])\n : undefined\n\n if (reqCacheControl?.['no-store']) {\n return dispatch(opts, handler)\n }\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}\n */\n const cacheKey = makeCacheKey(opts)\n const result = store.get(cacheKey)\n\n if (result && typeof result.then === 'function') {\n return result\n .then(result => handleResult(dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl,\n result\n ))\n } else {\n return handleResult(\n dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl,\n result\n )\n }\n }\n }\n}\n","'use strict'\n\nconst { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = require('node:zlib')\nconst { pipeline } = require('node:stream')\nconst DecoratorHandler = require('../handler/decorator-handler')\n\n/** @typedef {import('node:stream').Transform} Transform */\n/** @typedef {import('node:stream').Transform} Controller */\n/** @typedef {Transform&import('node:zlib').Zlib} DecompressorStream */\n\n/** @type {Record DecompressorStream>} */\nconst supportedEncodings = {\n gzip: createGunzip,\n 'x-gzip': createGunzip,\n br: createBrotliDecompress,\n deflate: createInflate,\n compress: createInflate,\n 'x-compress': createInflate,\n zstd: createZstdDecompress\n}\n\nconst defaultSkipStatusCodes = /** @type {const} */ ([204, 304])\n\nlet warningEmitted = /** @type {boolean} */ (false)\n\n/**\n * @typedef {Object} DecompressHandlerOptions\n * @property {number[]|Readonly} [skipStatusCodes=[204, 304]] - List of status codes to skip decompression for\n * @property {boolean} [skipErrorResponses] - Whether to skip decompression for error responses (status codes >= 400)\n */\n\nclass DecompressHandler extends DecoratorHandler {\n /** @type {Transform[]} */\n #decompressors = []\n /** @type {Readonly} */\n #skipStatusCodes\n /** @type {boolean} */\n #skipErrorResponses\n\n constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {\n super(handler)\n this.#skipStatusCodes = skipStatusCodes\n this.#skipErrorResponses = skipErrorResponses\n }\n\n /**\n * Determines if decompression should be skipped based on encoding and status code\n * @param {string} contentEncoding - Content-Encoding header value\n * @param {number} statusCode - HTTP status code of the response\n * @returns {boolean} - True if decompression should be skipped\n */\n #shouldSkipDecompression (contentEncoding, statusCode) {\n if (!contentEncoding || statusCode < 200) return true\n if (this.#skipStatusCodes.includes(statusCode)) return true\n if (this.#skipErrorResponses && statusCode >= 400) return true\n return false\n }\n\n /**\n * Creates a chain of decompressors for multiple content encodings\n *\n * @param {string} encodings - Comma-separated list of content encodings\n * @returns {Array} - Array of decompressor streams\n * @throws {Error} - If the number of content-encodings exceeds the maximum allowed\n */\n #createDecompressionChain (encodings) {\n const parts = encodings.split(',')\n\n // Limit the number of content-encodings to prevent resource exhaustion.\n // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).\n const maxContentEncodings = 5\n if (parts.length > maxContentEncodings) {\n throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`)\n }\n\n /** @type {DecompressorStream[]} */\n const decompressors = []\n\n for (let i = parts.length - 1; i >= 0; i--) {\n const encoding = parts[i].trim()\n if (!encoding) continue\n\n if (!supportedEncodings[encoding]) {\n decompressors.length = 0 // Clear if unsupported encoding\n return decompressors // Unsupported encoding\n }\n\n decompressors.push(supportedEncodings[encoding]())\n }\n\n return decompressors\n }\n\n /**\n * Sets up event handlers for a decompressor stream using readable events\n * @param {DecompressorStream} decompressor - The decompressor stream\n * @param {Controller} controller - The controller to coordinate with\n * @returns {void}\n */\n #setupDecompressorEvents (decompressor, controller) {\n decompressor.on('readable', () => {\n let chunk\n while ((chunk = decompressor.read()) !== null) {\n const result = super.onResponseData(controller, chunk)\n if (result === false) {\n break\n }\n }\n })\n\n decompressor.on('error', (error) => {\n super.onResponseError(controller, error)\n })\n }\n\n /**\n * Sets up event handling for a single decompressor\n * @param {Controller} controller - The controller to handle events\n * @returns {void}\n */\n #setupSingleDecompressor (controller) {\n const decompressor = this.#decompressors[0]\n this.#setupDecompressorEvents(decompressor, controller)\n\n decompressor.on('end', () => {\n super.onResponseEnd(controller, {})\n })\n }\n\n /**\n * Sets up event handling for multiple chained decompressors using pipeline\n * @param {Controller} controller - The controller to handle events\n * @returns {void}\n */\n #setupMultipleDecompressors (controller) {\n const lastDecompressor = this.#decompressors[this.#decompressors.length - 1]\n this.#setupDecompressorEvents(lastDecompressor, controller)\n\n pipeline(this.#decompressors, (err) => {\n if (err) {\n super.onResponseError(controller, err)\n return\n }\n super.onResponseEnd(controller, {})\n })\n }\n\n /**\n * Cleans up decompressor references to prevent memory leaks\n * @returns {void}\n */\n #cleanupDecompressors () {\n this.#decompressors.length = 0\n }\n\n /**\n * @param {Controller} controller\n * @param {number} statusCode\n * @param {Record} headers\n * @param {string} statusMessage\n * @returns {void}\n */\n onResponseStart (controller, statusCode, headers, statusMessage) {\n const contentEncoding = headers['content-encoding']\n\n // If content encoding is not supported or status code is in skip list\n if (this.#shouldSkipDecompression(contentEncoding, statusCode)) {\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase())\n\n if (decompressors.length === 0) {\n this.#cleanupDecompressors()\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n this.#decompressors = decompressors\n\n // Remove compression headers since we're decompressing\n const { 'content-encoding': _, 'content-length': __, ...newHeaders } = headers\n\n if (controller?.rawHeaders) {\n const rawHeaders = controller.rawHeaders\n\n if (Array.isArray(rawHeaders)) {\n const filteredHeaders = []\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const headerName = rawHeaders[i]\n const name = Buffer.isBuffer(headerName) ? headerName.toString('latin1') : `${headerName}`\n const lowerName = name.toLowerCase()\n\n if (lowerName === 'content-encoding' || lowerName === 'content-length') {\n continue\n }\n\n filteredHeaders.push(rawHeaders[i], rawHeaders[i + 1])\n }\n controller.rawHeaders = filteredHeaders\n } else if (typeof rawHeaders === 'object') {\n for (const name of Object.keys(rawHeaders)) {\n const lowerName = name.toLowerCase()\n if (lowerName === 'content-encoding' || lowerName === 'content-length') {\n delete rawHeaders[name]\n }\n }\n }\n }\n\n if (this.#decompressors.length === 1) {\n this.#setupSingleDecompressor(controller)\n } else {\n this.#setupMultipleDecompressors(controller)\n }\n\n return super.onResponseStart(controller, statusCode, newHeaders, statusMessage)\n }\n\n /**\n * @param {Controller} controller\n * @param {Buffer} chunk\n * @returns {void}\n */\n onResponseData (controller, chunk) {\n if (this.#decompressors.length > 0) {\n this.#decompressors[0].write(chunk)\n return\n }\n super.onResponseData(controller, chunk)\n }\n\n /**\n * @param {Controller} controller\n * @param {Record | undefined} trailers\n * @returns {void}\n */\n onResponseEnd (controller, trailers) {\n if (this.#decompressors.length > 0) {\n this.#decompressors[0].end()\n this.#cleanupDecompressors()\n return\n }\n super.onResponseEnd(controller, trailers)\n }\n\n /**\n * @param {Controller} controller\n * @param {Error} err\n * @returns {void}\n */\n onResponseError (controller, err) {\n if (this.#decompressors.length > 0) {\n for (const decompressor of this.#decompressors) {\n decompressor.destroy(err)\n }\n this.#cleanupDecompressors()\n }\n super.onResponseError(controller, err)\n }\n}\n\n/**\n * Creates a decompression interceptor for HTTP responses\n * @param {DecompressHandlerOptions} [options] - Options for the interceptor\n * @returns {Function} - Interceptor function\n */\nfunction createDecompressInterceptor (options = {}) {\n // Emit experimental warning only once\n if (!warningEmitted) {\n process.emitWarning(\n 'DecompressInterceptor is experimental and subject to change',\n 'ExperimentalWarning'\n )\n warningEmitted = true\n }\n\n return (dispatch) => {\n return (opts, handler) => {\n const decompressHandler = new DecompressHandler(handler, options)\n return dispatch(opts, decompressHandler)\n }\n }\n}\n\nmodule.exports = createDecompressInterceptor\n","'use strict'\n\nconst { RequestAbortedError } = require('../core/errors')\n\n/**\n * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler\n */\n\nconst DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024\n\n/**\n * @typedef {Object} WaitingHandler\n * @property {DispatchHandler} handler\n * @property {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @property {Buffer[]} bufferedChunks\n * @property {number} bufferedBytes\n * @property {object | null} pendingTrailers\n * @property {boolean} done\n */\n\n/**\n * Handler that forwards response events to multiple waiting handlers.\n * Used for request deduplication.\n *\n * @implements {DispatchHandler}\n */\nclass DeduplicationHandler {\n /**\n * @type {DispatchHandler}\n */\n #primaryHandler\n\n /**\n * @type {WaitingHandler[]}\n */\n #waitingHandlers = []\n\n /**\n * @type {number}\n */\n #maxBufferSize = DEFAULT_MAX_BUFFER_SIZE\n\n /**\n * @type {number}\n */\n #statusCode = 0\n\n /**\n * @type {Record}\n */\n #headers = {}\n\n /**\n * @type {string}\n */\n #statusMessage = ''\n\n /**\n * @type {boolean}\n */\n #aborted = false\n\n /**\n * @type {boolean}\n */\n #responseStarted = false\n\n /**\n * @type {boolean}\n */\n #responseDataStarted = false\n\n /**\n * @type {boolean}\n */\n #completed = false\n\n /**\n * @type {import('../../types/dispatcher.d.ts').default.DispatchController | null}\n */\n #controller = null\n\n /**\n * @type {(() => void) | null}\n */\n #onComplete = null\n\n /**\n * @param {DispatchHandler} primaryHandler The primary handler\n * @param {() => void} onComplete Callback when request completes\n * @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler\n */\n constructor (primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) {\n this.#primaryHandler = primaryHandler\n this.#onComplete = onComplete\n this.#maxBufferSize = maxBufferSize\n }\n\n /**\n * Add a waiting handler that will receive response events.\n * Returns false if deduplication can no longer safely attach this handler.\n *\n * @param {DispatchHandler} handler\n * @returns {boolean}\n */\n addWaitingHandler (handler) {\n if (this.#completed || this.#responseDataStarted) {\n return false\n }\n\n const waitingHandler = this.#createWaitingHandler(handler)\n const waitingController = waitingHandler.controller\n\n try {\n handler.onRequestStart?.(waitingController, null)\n\n if (waitingController.aborted) {\n waitingHandler.done = true\n return true\n }\n\n if (this.#responseStarted) {\n handler.onResponseStart?.(\n waitingController,\n this.#statusCode,\n this.#headers,\n this.#statusMessage\n )\n }\n } catch {\n // Ignore errors from waiting handlers\n waitingHandler.done = true\n return true\n }\n\n if (!waitingController.aborted) {\n this.#waitingHandlers.push(waitingHandler)\n }\n\n return true\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {any} context\n */\n onRequestStart (controller, context) {\n this.#controller = controller\n this.#primaryHandler.onRequestStart?.(controller, context)\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {number} statusCode\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} headers\n * @param {Socket} socket\n */\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.#primaryHandler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {number} statusCode\n * @param {Record} headers\n * @param {string} statusMessage\n */\n onResponseStart (controller, statusCode, headers, statusMessage) {\n this.#responseStarted = true\n this.#statusCode = statusCode\n this.#headers = headers\n this.#statusMessage = statusMessage\n\n this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n\n for (const waitingHandler of this.#waitingHandlers) {\n const { handler, controller: waitingController } = waitingHandler\n\n if (waitingHandler.done || waitingController.aborted) {\n waitingHandler.done = true\n continue\n }\n\n try {\n handler.onResponseStart?.(\n waitingController,\n statusCode,\n headers,\n statusMessage\n )\n } catch {\n // Ignore errors from waiting handlers\n }\n\n if (waitingController.aborted) {\n waitingHandler.done = true\n }\n }\n\n this.#pruneDoneWaitingHandlers()\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {Buffer} chunk\n */\n onResponseData (controller, chunk) {\n if (this.#aborted || this.#completed) {\n return\n }\n\n this.#responseDataStarted = true\n\n this.#primaryHandler.onResponseData?.(controller, chunk)\n\n for (const waitingHandler of this.#waitingHandlers) {\n const { handler, controller: waitingController } = waitingHandler\n\n if (waitingHandler.done || waitingController.aborted) {\n waitingHandler.done = true\n continue\n }\n\n if (waitingController.paused) {\n this.#bufferWaitingChunk(waitingHandler, chunk)\n continue\n }\n\n try {\n handler.onResponseData?.(waitingController, chunk)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n if (waitingController.aborted) {\n waitingHandler.done = true\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n }\n }\n\n this.#pruneDoneWaitingHandlers()\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {object} trailers\n */\n onResponseEnd (controller, trailers) {\n if (this.#aborted || this.#completed) {\n return\n }\n\n this.#completed = true\n this.#primaryHandler.onResponseEnd?.(controller, trailers)\n\n for (const waitingHandler of this.#waitingHandlers) {\n if (waitingHandler.done || waitingHandler.controller.aborted) {\n waitingHandler.done = true\n continue\n }\n\n this.#flushWaitingHandler(waitingHandler)\n\n if (waitingHandler.done || waitingHandler.controller.aborted) {\n waitingHandler.done = true\n continue\n }\n\n if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) {\n waitingHandler.pendingTrailers = trailers\n continue\n }\n\n try {\n waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n waitingHandler.done = true\n }\n\n this.#pruneDoneWaitingHandlers()\n this.#onComplete?.()\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {Error} err\n */\n onResponseError (controller, err) {\n if (this.#completed) {\n return\n }\n\n this.#aborted = true\n this.#completed = true\n\n this.#primaryHandler.onResponseError?.(controller, err)\n\n for (const waitingHandler of this.#waitingHandlers) {\n this.#errorWaitingHandler(waitingHandler, err)\n }\n\n this.#waitingHandlers = []\n this.#onComplete?.()\n }\n\n /**\n * @param {DispatchHandler} handler\n * @returns {WaitingHandler}\n */\n #createWaitingHandler (handler) {\n /** @type {WaitingHandler} */\n const waitingHandler = {\n handler,\n controller: null,\n bufferedChunks: [],\n bufferedBytes: 0,\n pendingTrailers: null,\n done: false\n }\n\n const state = {\n aborted: false,\n paused: false,\n reason: null\n }\n\n waitingHandler.controller = {\n resume: () => {\n if (state.aborted) {\n return\n }\n\n state.paused = false\n this.#flushWaitingHandler(waitingHandler)\n\n if (\n this.#completed &&\n waitingHandler.pendingTrailers &&\n waitingHandler.bufferedChunks.length === 0 &&\n !state.paused &&\n !state.aborted\n ) {\n try {\n waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n waitingHandler.pendingTrailers = null\n waitingHandler.done = true\n }\n\n this.#pruneDoneWaitingHandlers()\n },\n pause: () => {\n if (!state.aborted) {\n state.paused = true\n }\n },\n get paused () { return state.paused },\n get aborted () { return state.aborted },\n get reason () { return state.reason },\n abort: (reason) => {\n state.aborted = true\n state.reason = reason ?? null\n waitingHandler.done = true\n waitingHandler.pendingTrailers = null\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n }\n }\n\n return waitingHandler\n }\n\n /**\n * @param {WaitingHandler} waitingHandler\n * @param {Buffer} chunk\n */\n #bufferWaitingChunk (waitingHandler, chunk) {\n if (waitingHandler.done || waitingHandler.controller.aborted) {\n waitingHandler.done = true\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n return\n }\n\n const bufferedChunk = Buffer.from(chunk)\n waitingHandler.bufferedChunks.push(bufferedChunk)\n waitingHandler.bufferedBytes += bufferedChunk.length\n\n if (waitingHandler.bufferedBytes > this.#maxBufferSize) {\n const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`)\n this.#errorWaitingHandler(waitingHandler, err)\n }\n }\n\n /**\n * @param {WaitingHandler} waitingHandler\n */\n #flushWaitingHandler (waitingHandler) {\n const { handler, controller } = waitingHandler\n\n while (\n !waitingHandler.done &&\n !controller.aborted &&\n !controller.paused &&\n waitingHandler.bufferedChunks.length > 0\n ) {\n const bufferedChunk = waitingHandler.bufferedChunks.shift()\n waitingHandler.bufferedBytes -= bufferedChunk.length\n\n try {\n handler.onResponseData?.(controller, bufferedChunk)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n if (controller.aborted) {\n waitingHandler.done = true\n waitingHandler.pendingTrailers = null\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n break\n }\n }\n }\n\n /**\n * @param {WaitingHandler} waitingHandler\n * @param {Error} err\n */\n #errorWaitingHandler (waitingHandler, err) {\n if (waitingHandler.done) {\n return\n }\n\n waitingHandler.done = true\n waitingHandler.pendingTrailers = null\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n\n try {\n waitingHandler.controller.abort(err)\n waitingHandler.handler.onResponseError?.(waitingHandler.controller, err)\n } catch {\n // Ignore errors from waiting handlers\n }\n }\n\n #pruneDoneWaitingHandlers () {\n this.#waitingHandlers = this.#waitingHandlers.filter(waitingHandler => waitingHandler.done === false)\n }\n}\n\nmodule.exports = DeduplicationHandler\n","'use strict'\n\nconst diagnosticsChannel = require('node:diagnostics_channel')\nconst util = require('../core/util')\nconst DeduplicationHandler = require('../handler/deduplication-handler')\nconst { normalizeHeaders, makeCacheKey, makeDeduplicationKey } = require('../util/cache.js')\n\nconst pendingRequestsChannel = diagnosticsChannel.channel('undici:request:pending-requests')\n\n/**\n * @param {import('../../types/interceptors.d.ts').default.DeduplicateInterceptorOpts} [opts]\n * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}\n */\nmodule.exports = (opts = {}) => {\n const {\n methods = ['GET'],\n skipHeaderNames = [],\n excludeHeaderNames = [],\n maxBufferSize = 5 * 1024 * 1024\n } = opts\n\n if (typeof opts !== 'object' || opts === null) {\n throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)\n }\n\n if (!Array.isArray(methods)) {\n throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`)\n }\n\n for (const method of methods) {\n if (!util.safeHTTPMethods.includes(method)) {\n throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`)\n }\n }\n\n if (!Array.isArray(skipHeaderNames)) {\n throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`)\n }\n\n if (!Array.isArray(excludeHeaderNames)) {\n throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`)\n }\n\n if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) {\n throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`)\n }\n\n // Convert to lowercase Set for case-insensitive header matching\n const skipHeaderNamesSet = new Set(skipHeaderNames.map(name => name.toLowerCase()))\n\n // Convert to lowercase Set for case-insensitive header exclusion from deduplication key\n const excludeHeaderNamesSet = new Set(excludeHeaderNames.map(name => name.toLowerCase()))\n\n /**\n * Map of pending requests for deduplication\n * @type {Map}\n */\n const pendingRequests = new Map()\n\n return dispatch => {\n return (opts, handler) => {\n if (!opts.origin || methods.includes(opts.method) === false) {\n return dispatch(opts, handler)\n }\n\n opts = {\n ...opts,\n headers: normalizeHeaders(opts)\n }\n\n // Skip deduplication if request contains any of the specified headers\n if (skipHeaderNamesSet.size > 0) {\n for (const headerName of Object.keys(opts.headers)) {\n if (skipHeaderNamesSet.has(headerName.toLowerCase())) {\n return dispatch(opts, handler)\n }\n }\n }\n\n const cacheKey = makeCacheKey(opts)\n const dedupeKey = makeDeduplicationKey(cacheKey, excludeHeaderNamesSet)\n\n // Check if there's already a pending request for this key\n const pendingHandler = pendingRequests.get(dedupeKey)\n if (pendingHandler) {\n // Add this handler to the waiting list when safe.\n // If body streaming has already started, this request must be sent independently.\n if (pendingHandler.addWaitingHandler(handler)) {\n return true\n }\n\n return dispatch(opts, handler)\n }\n\n // Create a new deduplication handler\n const deduplicationHandler = new DeduplicationHandler(\n handler,\n () => {\n // Clean up when request completes\n pendingRequests.delete(dedupeKey)\n if (pendingRequestsChannel.hasSubscribers) {\n pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'removed' })\n }\n },\n maxBufferSize\n )\n\n // Register the pending request\n pendingRequests.set(dedupeKey, deduplicationHandler)\n if (pendingRequestsChannel.hasSubscribers) {\n pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'added' })\n }\n\n return dispatch(opts, deduplicationHandler)\n }\n }\n}\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst { assertCacheKey, assertCacheValue } = require('../util/cache.js')\n\nlet DatabaseSync\n\nconst VERSION = 3\n\n// 2gb\nconst MAX_ENTRY_SIZE = 2 * 1000 * 1000 * 1000\n\n/**\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore\n * @implements {CacheStore}\n *\n * @typedef {{\n * id: Readonly,\n * body?: Uint8Array\n * statusCode: number\n * statusMessage: string\n * headers?: string\n * vary?: string\n * etag?: string\n * cacheControlDirectives?: string\n * cachedAt: number\n * staleAt: number\n * deleteAt: number\n * }} SqliteStoreValue\n */\nmodule.exports = class SqliteCacheStore {\n #maxEntrySize = MAX_ENTRY_SIZE\n #maxCount = Infinity\n\n /**\n * @type {import('node:sqlite').DatabaseSync}\n */\n #db\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #getValuesQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #updateValueQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #insertValueQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #deleteExpiredValuesQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #deleteByUrlQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #countEntriesQuery\n\n /**\n * @type {import('node:sqlite').StatementSync | null}\n */\n #deleteOldValuesQuery\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.SqliteCacheStoreOpts | undefined} opts\n */\n constructor (opts) {\n if (opts) {\n if (typeof opts !== 'object') {\n throw new TypeError('SqliteCacheStore options must be an object')\n }\n\n if (opts.maxEntrySize !== undefined) {\n if (\n typeof opts.maxEntrySize !== 'number' ||\n !Number.isInteger(opts.maxEntrySize) ||\n opts.maxEntrySize < 0\n ) {\n throw new TypeError('SqliteCacheStore options.maxEntrySize must be a non-negative integer')\n }\n\n if (opts.maxEntrySize > MAX_ENTRY_SIZE) {\n throw new TypeError('SqliteCacheStore options.maxEntrySize must be less than 2gb')\n }\n\n this.#maxEntrySize = opts.maxEntrySize\n }\n\n if (opts.maxCount !== undefined) {\n if (\n typeof opts.maxCount !== 'number' ||\n !Number.isInteger(opts.maxCount) ||\n opts.maxCount < 0\n ) {\n throw new TypeError('SqliteCacheStore options.maxCount must be a non-negative integer')\n }\n this.#maxCount = opts.maxCount\n }\n }\n\n if (!DatabaseSync) {\n DatabaseSync = require('node:sqlite').DatabaseSync\n }\n this.#db = new DatabaseSync(opts?.location ?? ':memory:')\n\n this.#db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = NORMAL;\n PRAGMA temp_store = memory;\n PRAGMA optimize;\n\n CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION} (\n -- Data specific to us\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n url TEXT NOT NULL,\n method TEXT NOT NULL,\n\n -- Data returned to the interceptor\n body BUF NULL,\n deleteAt INTEGER NOT NULL,\n statusCode INTEGER NOT NULL,\n statusMessage TEXT NOT NULL,\n headers TEXT NULL,\n cacheControlDirectives TEXT NULL,\n etag TEXT NULL,\n vary TEXT NULL,\n cachedAt INTEGER NOT NULL,\n staleAt INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_getValuesQuery ON cacheInterceptorV${VERSION}(url, method, deleteAt);\n CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_deleteByUrlQuery ON cacheInterceptorV${VERSION}(deleteAt);\n `)\n\n this.#getValuesQuery = this.#db.prepare(`\n SELECT\n id,\n body,\n deleteAt,\n statusCode,\n statusMessage,\n headers,\n etag,\n cacheControlDirectives,\n vary,\n cachedAt,\n staleAt\n FROM cacheInterceptorV${VERSION}\n WHERE\n url = ?\n AND method = ?\n ORDER BY\n deleteAt ASC\n `)\n\n this.#updateValueQuery = this.#db.prepare(`\n UPDATE cacheInterceptorV${VERSION} SET\n body = ?,\n deleteAt = ?,\n statusCode = ?,\n statusMessage = ?,\n headers = ?,\n etag = ?,\n cacheControlDirectives = ?,\n cachedAt = ?,\n staleAt = ?\n WHERE\n id = ?\n `)\n\n this.#insertValueQuery = this.#db.prepare(`\n INSERT INTO cacheInterceptorV${VERSION} (\n url,\n method,\n body,\n deleteAt,\n statusCode,\n statusMessage,\n headers,\n etag,\n cacheControlDirectives,\n vary,\n cachedAt,\n staleAt\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n this.#deleteByUrlQuery = this.#db.prepare(\n `DELETE FROM cacheInterceptorV${VERSION} WHERE url = ?`\n )\n\n this.#countEntriesQuery = this.#db.prepare(\n `SELECT COUNT(*) AS total FROM cacheInterceptorV${VERSION}`\n )\n\n this.#deleteExpiredValuesQuery = this.#db.prepare(\n `DELETE FROM cacheInterceptorV${VERSION} WHERE deleteAt <= ?`\n )\n\n this.#deleteOldValuesQuery = this.#maxCount === Infinity\n ? null\n : this.#db.prepare(`\n DELETE FROM cacheInterceptorV${VERSION}\n WHERE id IN (\n SELECT\n id\n FROM cacheInterceptorV${VERSION}\n ORDER BY cachedAt DESC\n LIMIT ?\n )\n `)\n }\n\n close () {\n this.#db.close()\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @returns {(import('../../types/cache-interceptor.d.ts').default.GetResult & { body?: Buffer }) | undefined}\n */\n get (key) {\n assertCacheKey(key)\n\n const value = this.#findValue(key)\n return value\n ? {\n body: value.body ? Buffer.from(value.body.buffer, value.body.byteOffset, value.body.byteLength) : undefined,\n statusCode: value.statusCode,\n statusMessage: value.statusMessage,\n headers: value.headers ? JSON.parse(value.headers) : undefined,\n etag: value.etag ? value.etag : undefined,\n vary: value.vary ? JSON.parse(value.vary) : undefined,\n cacheControlDirectives: value.cacheControlDirectives\n ? JSON.parse(value.cacheControlDirectives)\n : undefined,\n cachedAt: value.cachedAt,\n staleAt: value.staleAt,\n deleteAt: value.deleteAt\n }\n : undefined\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue & { body: null | Buffer | Array}} value\n */\n set (key, value) {\n assertCacheKey(key)\n\n const url = this.#makeValueUrl(key)\n const body = Array.isArray(value.body) ? Buffer.concat(value.body) : value.body\n const size = body?.byteLength\n\n if (size && size > this.#maxEntrySize) {\n return\n }\n\n const existingValue = this.#findValue(key, true)\n if (existingValue) {\n // Updating an existing response, let's overwrite it\n this.#updateValueQuery.run(\n body,\n value.deleteAt,\n value.statusCode,\n value.statusMessage,\n value.headers ? JSON.stringify(value.headers) : null,\n value.etag ? value.etag : null,\n value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,\n value.cachedAt,\n value.staleAt,\n existingValue.id\n )\n } else {\n this.#prune()\n // New response, let's insert it\n this.#insertValueQuery.run(\n url,\n key.method,\n body,\n value.deleteAt,\n value.statusCode,\n value.statusMessage,\n value.headers ? JSON.stringify(value.headers) : null,\n value.etag ? value.etag : null,\n value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,\n value.vary ? JSON.stringify(value.vary) : null,\n value.cachedAt,\n value.staleAt\n )\n }\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} value\n * @returns {Writable | undefined}\n */\n createWriteStream (key, value) {\n assertCacheKey(key)\n assertCacheValue(value)\n\n let size = 0\n /**\n * @type {Buffer[] | null}\n */\n const body = []\n const store = this\n\n return new Writable({\n decodeStrings: true,\n write (chunk, encoding, callback) {\n size += chunk.byteLength\n\n if (size < store.#maxEntrySize) {\n body.push(chunk)\n } else {\n this.destroy()\n }\n\n callback()\n },\n final (callback) {\n store.set(key, { ...value, body })\n callback()\n }\n })\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n */\n delete (key) {\n if (typeof key !== 'object') {\n throw new TypeError(`expected key to be object, got ${typeof key}`)\n }\n\n this.#deleteByUrlQuery.run(this.#makeValueUrl(key))\n }\n\n #prune () {\n if (Number.isFinite(this.#maxCount) && this.size <= this.#maxCount) {\n return 0\n }\n\n {\n const removed = this.#deleteExpiredValuesQuery.run(Date.now()).changes\n if (removed) {\n return removed\n }\n }\n\n {\n const removed = this.#deleteOldValuesQuery?.run(Math.max(Math.floor(this.#maxCount * 0.1), 1)).changes\n if (removed) {\n return removed\n }\n }\n\n return 0\n }\n\n /**\n * Counts the number of rows in the cache\n * @returns {Number}\n */\n get size () {\n const { total } = this.#countEntriesQuery.get()\n return total\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @returns {string}\n */\n #makeValueUrl (key) {\n return `${key.origin}/${key.path}`\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {boolean} [canBeExpired=false]\n * @returns {SqliteStoreValue | undefined}\n */\n #findValue (key, canBeExpired = false) {\n const url = this.#makeValueUrl(key)\n const { headers, method } = key\n\n /**\n * @type {SqliteStoreValue[]}\n */\n const values = this.#getValuesQuery.all(url, method)\n\n if (values.length === 0) {\n return undefined\n }\n\n const now = Date.now()\n for (const value of values) {\n if (now >= value.deleteAt && !canBeExpired) {\n return undefined\n }\n\n let matches = true\n\n if (value.vary) {\n const vary = JSON.parse(value.vary)\n\n for (const header in vary) {\n if (!headerValueEquals(headers[header], vary[header])) {\n matches = false\n break\n }\n }\n }\n\n if (matches) {\n return value\n }\n }\n\n return undefined\n }\n}\n\n/**\n * @param {string|string[]|null|undefined} lhs\n * @param {string|string[]|null|undefined} rhs\n * @returns {boolean}\n */\nfunction headerValueEquals (lhs, rhs) {\n if (lhs == null && rhs == null) {\n return true\n }\n\n if ((lhs == null && rhs != null) ||\n (lhs != null && rhs == null)) {\n return false\n }\n\n if (Array.isArray(lhs) && Array.isArray(rhs)) {\n if (lhs.length !== rhs.length) {\n return false\n }\n\n return lhs.every((x, i) => x === rhs[i])\n }\n\n return lhs === rhs\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst { kConstruct } = require('../../core/symbols')\nconst { kEnumerableProperty } = require('../../core/util')\nconst {\n iteratorMixin,\n isValidHeaderName,\n isValidHeaderValue\n} = require('./util')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst util = require('node:util')\n\n/**\n * @param {number} code\n * @returns {code is (0x0a | 0x0d | 0x09 | 0x20)}\n */\nfunction isHTTPWhiteSpaceCharCode (code) {\n return code === 0x0a || code === 0x0d || code === 0x09 || code === 0x20\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize\n * @param {string} potentialValue\n * @returns {string}\n */\nfunction headerValueNormalize (potentialValue) {\n // To normalize a byte sequence potentialValue, remove\n // any leading and trailing HTTP whitespace bytes from\n // potentialValue.\n let i = 0; let j = potentialValue.length\n\n while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j\n while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i\n\n return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)\n}\n\n/**\n * @param {Headers} headers\n * @param {Array|Object} object\n */\nfunction fill (headers, object) {\n // To fill a Headers object headers with a given object object, run these steps:\n\n // 1. If object is a sequence, then for each header in object:\n // Note: webidl conversion to array has already been done.\n if (Array.isArray(object)) {\n for (let i = 0; i < object.length; ++i) {\n const header = object[i]\n // 1. If header does not contain exactly two items, then throw a TypeError.\n if (header.length !== 2) {\n throw webidl.errors.exception({\n header: 'Headers constructor',\n message: `expected name/value pair to be length 2, found ${header.length}.`\n })\n }\n\n // 2. Append (header’s first item, header’s second item) to headers.\n appendHeader(headers, header[0], header[1])\n }\n } else if (typeof object === 'object' && object !== null) {\n // Note: null should throw\n\n // 2. Otherwise, object is a record, then for each key → value in object,\n // append (key, value) to headers\n const keys = Object.keys(object)\n for (let i = 0; i < keys.length; ++i) {\n appendHeader(headers, keys[i], object[keys[i]])\n }\n } else {\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-headers-append\n * @param {Headers} headers\n * @param {string} name\n * @param {string} value\n */\nfunction appendHeader (headers, name, value) {\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value,\n type: 'header value'\n })\n }\n\n // 3. If headers’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if headers’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 5. Otherwise, if headers’s guard is \"request-no-cors\":\n // TODO\n // Note: undici does not implement forbidden header names\n if (getHeadersGuard(headers) === 'immutable') {\n throw new TypeError('immutable')\n }\n\n // 6. Otherwise, if headers’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n\n // 7. Append (name, value) to headers’s header list.\n return getHeadersList(headers).append(name, value, false)\n\n // 8. If headers’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from headers\n}\n\n// https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n/**\n * @param {Headers} target\n */\nfunction headersListSortAndCombine (target) {\n const headersList = getHeadersList(target)\n\n if (!headersList) {\n return []\n }\n\n if (headersList.sortedMap) {\n return headersList.sortedMap\n }\n\n // 1. Let headers be an empty list of headers with the key being the name\n // and value the value.\n const headers = []\n\n // 2. Let names be the result of convert header names to a sorted-lowercase\n // set with all the names of the headers in list.\n const names = headersList.toSortedArray()\n\n const cookies = headersList.cookies\n\n // fast-path\n if (cookies === null || cookies.length === 1) {\n // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray`\n return (headersList.sortedMap = names)\n }\n\n // 3. For each name of names:\n for (let i = 0; i < names.length; ++i) {\n const { 0: name, 1: value } = names[i]\n // 1. If name is `set-cookie`, then:\n if (name === 'set-cookie') {\n // 1. Let values be a list of all values of headers in list whose name\n // is a byte-case-insensitive match for name, in order.\n\n // 2. For each value of values:\n // 1. Append (name, value) to headers.\n for (let j = 0; j < cookies.length; ++j) {\n headers.push([name, cookies[j]])\n }\n } else {\n // 2. Otherwise:\n\n // 1. Let value be the result of getting name from list.\n\n // 2. Assert: value is non-null.\n // Note: This operation was done by `HeadersList#toSortedArray`.\n\n // 3. Append (name, value) to headers.\n headers.push([name, value])\n }\n }\n\n // 4. Return headers.\n return (headersList.sortedMap = headers)\n}\n\nfunction compareHeaderName (a, b) {\n return a[0] < b[0] ? -1 : 1\n}\n\nclass HeadersList {\n /** @type {[string, string][]|null} */\n cookies = null\n\n sortedMap\n headersMap\n\n constructor (init) {\n if (init instanceof HeadersList) {\n this.headersMap = new Map(init.headersMap)\n this.sortedMap = init.sortedMap\n this.cookies = init.cookies === null ? null : [...init.cookies]\n } else {\n this.headersMap = new Map(init)\n this.sortedMap = null\n }\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#header-list-contains\n * @param {string} name\n * @param {boolean} isLowerCase\n */\n contains (name, isLowerCase) {\n // A header list list contains a header name name if list\n // contains a header whose name is a byte-case-insensitive\n // match for name.\n\n return this.headersMap.has(isLowerCase ? name : name.toLowerCase())\n }\n\n clear () {\n this.headersMap.clear()\n this.sortedMap = null\n this.cookies = null\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-append\n * @param {string} name\n * @param {string} value\n * @param {boolean} isLowerCase\n */\n append (name, value, isLowerCase) {\n this.sortedMap = null\n\n // 1. If list contains name, then set name to the first such\n // header’s name.\n const lowercaseName = isLowerCase ? name : name.toLowerCase()\n const exists = this.headersMap.get(lowercaseName)\n\n // 2. Append (name, value) to list.\n if (exists) {\n const delimiter = lowercaseName === 'cookie' ? '; ' : ', '\n this.headersMap.set(lowercaseName, {\n name: exists.name,\n value: `${exists.value}${delimiter}${value}`\n })\n } else {\n this.headersMap.set(lowercaseName, { name, value })\n }\n\n if (lowercaseName === 'set-cookie') {\n (this.cookies ??= []).push(value)\n }\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-set\n * @param {string} name\n * @param {string} value\n * @param {boolean} isLowerCase\n */\n set (name, value, isLowerCase) {\n this.sortedMap = null\n const lowercaseName = isLowerCase ? name : name.toLowerCase()\n\n if (lowercaseName === 'set-cookie') {\n this.cookies = [value]\n }\n\n // 1. If list contains name, then set the value of\n // the first such header to value and remove the\n // others.\n // 2. Otherwise, append header (name, value) to list.\n this.headersMap.set(lowercaseName, { name, value })\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-delete\n * @param {string} name\n * @param {boolean} isLowerCase\n */\n delete (name, isLowerCase) {\n this.sortedMap = null\n if (!isLowerCase) name = name.toLowerCase()\n\n if (name === 'set-cookie') {\n this.cookies = null\n }\n\n this.headersMap.delete(name)\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-get\n * @param {string} name\n * @param {boolean} isLowerCase\n * @returns {string | null}\n */\n get (name, isLowerCase) {\n // 1. If list does not contain name, then return null.\n // 2. Return the values of all headers in list whose name\n // is a byte-case-insensitive match for name,\n // separated from each other by 0x2C 0x20, in order.\n return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null\n }\n\n * [Symbol.iterator] () {\n // use the lowercased name\n for (const { 0: name, 1: { value } } of this.headersMap) {\n yield [name, value]\n }\n }\n\n get entries () {\n const headers = {}\n\n if (this.headersMap.size !== 0) {\n for (const { name, value } of this.headersMap.values()) {\n headers[name] = value\n }\n }\n\n return headers\n }\n\n rawValues () {\n return this.headersMap.values()\n }\n\n get entriesList () {\n const headers = []\n\n if (this.headersMap.size !== 0) {\n for (const { 0: lowerName, 1: { name, value } } of this.headersMap) {\n if (lowerName === 'set-cookie') {\n for (const cookie of this.cookies) {\n headers.push([name, cookie])\n }\n } else {\n headers.push([name, value])\n }\n }\n }\n\n return headers\n }\n\n // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set\n toSortedArray () {\n const size = this.headersMap.size\n const array = new Array(size)\n // In most cases, you will use the fast-path.\n // fast-path: Use binary insertion sort for small arrays.\n if (size <= 32) {\n if (size === 0) {\n // If empty, it is an empty array. To avoid the first index assignment.\n return array\n }\n // Improve performance by unrolling loop and avoiding double-loop.\n // Double-loop-less version of the binary insertion sort.\n const iterator = this.headersMap[Symbol.iterator]()\n const firstValue = iterator.next().value\n // set [name, value] to first index.\n array[0] = [firstValue[0], firstValue[1].value]\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n // 3.2.2. Assert: value is non-null.\n assert(firstValue[1].value !== null)\n for (\n let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value;\n i < size;\n ++i\n ) {\n // get next value\n value = iterator.next().value\n // set [name, value] to current index.\n x = array[i] = [value[0], value[1].value]\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n // 3.2.2. Assert: value is non-null.\n assert(x[1] !== null)\n left = 0\n right = i\n // binary search\n while (left < right) {\n // middle index\n pivot = left + ((right - left) >> 1)\n // compare header name\n if (array[pivot][0] <= x[0]) {\n left = pivot + 1\n } else {\n right = pivot\n }\n }\n if (i !== pivot) {\n j = i\n while (j > left) {\n array[j] = array[--j]\n }\n array[left] = x\n }\n }\n /* c8 ignore next 4 */\n if (!iterator.next().done) {\n // This is for debugging and will never be called.\n throw new TypeError('Unreachable')\n }\n return array\n } else {\n // This case would be a rare occurrence.\n // slow-path: fallback\n let i = 0\n for (const { 0: name, 1: { value } } of this.headersMap) {\n array[i++] = [name, value]\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n // 3.2.2. Assert: value is non-null.\n assert(value !== null)\n }\n return array.sort(compareHeaderName)\n }\n }\n}\n\n// https://fetch.spec.whatwg.org/#headers-class\nclass Headers {\n #guard\n /**\n * @type {HeadersList}\n */\n #headersList\n\n /**\n * @param {HeadersInit|Symbol} [init]\n * @returns\n */\n constructor (init = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (init === kConstruct) {\n return\n }\n\n this.#headersList = new HeadersList()\n\n // The new Headers(init) constructor steps are:\n\n // 1. Set this’s guard to \"none\".\n this.#guard = 'none'\n\n // 2. If init is given, then fill this with init.\n if (init !== undefined) {\n init = webidl.converters.HeadersInit(init, 'Headers constructor', 'init')\n fill(this, init)\n }\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-append\n append (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, 'Headers.append')\n\n const prefix = 'Headers.append'\n name = webidl.converters.ByteString(name, prefix, 'name')\n value = webidl.converters.ByteString(value, prefix, 'value')\n\n return appendHeader(this, name, value)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-delete\n delete (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, 'Headers.delete')\n\n const prefix = 'Headers.delete'\n name = webidl.converters.ByteString(name, prefix, 'name')\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.delete',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. If this’s guard is \"immutable\", then throw a TypeError.\n // 3. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 4. Otherwise, if this’s guard is \"request-no-cors\", name\n // is not a no-CORS-safelisted request-header name, and\n // name is not a privileged no-CORS request-header name,\n // return.\n // 5. Otherwise, if this’s guard is \"response\" and name is\n // a forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this.#guard === 'immutable') {\n throw new TypeError('immutable')\n }\n\n // 6. If this’s header list does not contain name, then\n // return.\n if (!this.#headersList.contains(name, false)) {\n return\n }\n\n // 7. Delete name from this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this.\n this.#headersList.delete(name, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-get\n get (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, 'Headers.get')\n\n const prefix = 'Headers.get'\n name = webidl.converters.ByteString(name, prefix, 'name')\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return the result of getting name from this’s header\n // list.\n return this.#headersList.get(name, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-has\n has (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, 'Headers.has')\n\n const prefix = 'Headers.has'\n name = webidl.converters.ByteString(name, prefix, 'name')\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return true if this’s header list contains name;\n // otherwise false.\n return this.#headersList.contains(name, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-set\n set (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, 'Headers.set')\n\n const prefix = 'Headers.set'\n name = webidl.converters.ByteString(name, prefix, 'name')\n value = webidl.converters.ByteString(value, prefix, 'value')\n\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value,\n type: 'header value'\n })\n }\n\n // 3. If this’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 5. Otherwise, if this’s guard is \"request-no-cors\" and\n // name/value is not a no-CORS-safelisted request-header,\n // return.\n // 6. Otherwise, if this’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this.#guard === 'immutable') {\n throw new TypeError('immutable')\n }\n\n // 7. Set (name, value) in this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this\n this.#headersList.set(name, value, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie\n getSetCookie () {\n webidl.brandCheck(this, Headers)\n\n // 1. If this’s header list does not contain `Set-Cookie`, then return « ».\n // 2. Return the values of all headers in this’s header list whose name is\n // a byte-case-insensitive match for `Set-Cookie`, in order.\n\n const list = this.#headersList.cookies\n\n if (list) {\n return [...list]\n }\n\n return []\n }\n\n [util.inspect.custom] (depth, options) {\n options.depth ??= depth\n\n return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}`\n }\n\n static getHeadersGuard (o) {\n return o.#guard\n }\n\n static setHeadersGuard (o, guard) {\n o.#guard = guard\n }\n\n /**\n * @param {Headers} o\n */\n static getHeadersList (o) {\n return o.#headersList\n }\n\n /**\n * @param {Headers} target\n * @param {HeadersList} list\n */\n static setHeadersList (target, list) {\n target.#headersList = list\n }\n}\n\nconst { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers\nReflect.deleteProperty(Headers, 'getHeadersGuard')\nReflect.deleteProperty(Headers, 'setHeadersGuard')\nReflect.deleteProperty(Headers, 'getHeadersList')\nReflect.deleteProperty(Headers, 'setHeadersList')\n\niteratorMixin('Headers', Headers, headersListSortAndCombine, 0, 1)\n\nObject.defineProperties(Headers.prototype, {\n append: kEnumerableProperty,\n delete: kEnumerableProperty,\n get: kEnumerableProperty,\n has: kEnumerableProperty,\n set: kEnumerableProperty,\n getSetCookie: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Headers',\n configurable: true\n },\n [util.inspect.custom]: {\n enumerable: false\n }\n})\n\nwebidl.converters.HeadersInit = function (V, prefix, argument) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {\n const iterator = Reflect.get(V, Symbol.iterator)\n\n // A work-around to ensure we send the properly-cased Headers when V is a Headers object.\n // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please.\n if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object\n try {\n return getHeadersList(V).entriesList\n } catch {\n // fall-through\n }\n }\n\n if (typeof iterator === 'function') {\n return webidl.converters['sequence>'](V, prefix, argument, iterator.bind(V))\n }\n\n return webidl.converters['record'](V, prefix, argument)\n }\n\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n}\n\nmodule.exports = {\n fill,\n // for test.\n compareHeaderName,\n Headers,\n HeadersList,\n getHeadersGuard,\n setHeadersGuard,\n setHeadersList,\n getHeadersList\n}\n","'use strict'\n\nconst { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = require('./headers')\nconst { extractBody, cloneBody, mixinBody, streamRegistry, bodyUnusable } = require('./body')\nconst util = require('../../core/util')\nconst nodeUtil = require('node:util')\nconst { kEnumerableProperty } = util\nconst {\n isValidReasonPhrase,\n isCancelled,\n isAborted,\n isErrorLike,\n environmentSettingsObject: relevantRealm\n} = require('./util')\nconst {\n redirectStatusSet,\n nullBodyStatus\n} = require('./constants')\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('./data-url')\nconst { kConstruct } = require('../../core/symbols')\nconst assert = require('node:assert')\nconst { isomorphicEncode, serializeJavascriptValueToJSONString } = require('../infra')\n\nconst textEncoder = new TextEncoder('utf-8')\n\n// https://fetch.spec.whatwg.org/#response-class\nclass Response {\n /** @type {Headers} */\n #headers\n\n #state\n\n // Creates network error Response.\n static error () {\n // The static error() method steps are to return the result of creating a\n // Response object, given a new network error, \"immutable\", and this’s\n // relevant Realm.\n const responseObject = fromInnerResponse(makeNetworkError(), 'immutable')\n\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response-json\n static json (data, init = undefined) {\n webidl.argumentLengthCheck(arguments, 1, 'Response.json')\n\n if (init !== null) {\n init = webidl.converters.ResponseInit(init)\n }\n\n // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.\n const bytes = textEncoder.encode(\n serializeJavascriptValueToJSONString(data)\n )\n\n // 2. Let body be the result of extracting bytes.\n const body = extractBody(bytes)\n\n // 3. Let responseObject be the result of creating a Response object, given a new response,\n // \"response\", and this’s relevant Realm.\n const responseObject = fromInnerResponse(makeResponse({}), 'response')\n\n // 4. Perform initialize a response given responseObject, init, and (body, \"application/json\").\n initializeResponse(responseObject, init, { body: body[0], type: 'application/json' })\n\n // 5. Return responseObject.\n return responseObject\n }\n\n // Creates a redirect Response that redirects to url with status status.\n static redirect (url, status = 302) {\n webidl.argumentLengthCheck(arguments, 1, 'Response.redirect')\n\n url = webidl.converters.USVString(url)\n status = webidl.converters['unsigned short'](status)\n\n // 1. Let parsedURL be the result of parsing url with current settings\n // object’s API base URL.\n // 2. If parsedURL is failure, then throw a TypeError.\n // TODO: base-URL?\n let parsedURL\n try {\n parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl)\n } catch (err) {\n throw new TypeError(`Failed to parse URL from ${url}`, { cause: err })\n }\n\n // 3. If status is not a redirect status, then throw a RangeError.\n if (!redirectStatusSet.has(status)) {\n throw new RangeError(`Invalid status code ${status}`)\n }\n\n // 4. Let responseObject be the result of creating a Response object,\n // given a new response, \"immutable\", and this’s relevant Realm.\n const responseObject = fromInnerResponse(makeResponse({}), 'immutable')\n\n // 5. Set responseObject’s response’s status to status.\n responseObject.#state.status = status\n\n // 6. Let value be parsedURL, serialized and isomorphic encoded.\n const value = isomorphicEncode(URLSerializer(parsedURL))\n\n // 7. Append `Location`/value to responseObject’s response’s header list.\n responseObject.#state.headersList.append('location', value, true)\n\n // 8. Return responseObject.\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response\n constructor (body = null, init = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (body === kConstruct) {\n return\n }\n\n if (body !== null) {\n body = webidl.converters.BodyInit(body, 'Response', 'body')\n }\n\n init = webidl.converters.ResponseInit(init)\n\n // 1. Set this’s response to a new response.\n this.#state = makeResponse({})\n\n // 2. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is this’s response’s header list and guard\n // is \"response\".\n this.#headers = new Headers(kConstruct)\n setHeadersGuard(this.#headers, 'response')\n setHeadersList(this.#headers, this.#state.headersList)\n\n // 3. Let bodyWithType be null.\n let bodyWithType = null\n\n // 4. If body is non-null, then set bodyWithType to the result of extracting body.\n if (body != null) {\n const [extractedBody, type] = extractBody(body)\n bodyWithType = { body: extractedBody, type }\n }\n\n // 5. Perform initialize a response given this, init, and bodyWithType.\n initializeResponse(this, init, bodyWithType)\n }\n\n // Returns response’s type, e.g., \"cors\".\n get type () {\n webidl.brandCheck(this, Response)\n\n // The type getter steps are to return this’s response’s type.\n return this.#state.type\n }\n\n // Returns response’s URL, if it has one; otherwise the empty string.\n get url () {\n webidl.brandCheck(this, Response)\n\n const urlList = this.#state.urlList\n\n // The url getter steps are to return the empty string if this’s\n // response’s URL is null; otherwise this’s response’s URL,\n // serialized with exclude fragment set to true.\n const url = urlList[urlList.length - 1] ?? null\n\n if (url === null) {\n return ''\n }\n\n return URLSerializer(url, true)\n }\n\n // Returns whether response was obtained through a redirect.\n get redirected () {\n webidl.brandCheck(this, Response)\n\n // The redirected getter steps are to return true if this’s response’s URL\n // list has more than one item; otherwise false.\n return this.#state.urlList.length > 1\n }\n\n // Returns response’s status.\n get status () {\n webidl.brandCheck(this, Response)\n\n // The status getter steps are to return this’s response’s status.\n return this.#state.status\n }\n\n // Returns whether response’s status is an ok status.\n get ok () {\n webidl.brandCheck(this, Response)\n\n // The ok getter steps are to return true if this’s response’s status is an\n // ok status; otherwise false.\n return this.#state.status >= 200 && this.#state.status <= 299\n }\n\n // Returns response’s status message.\n get statusText () {\n webidl.brandCheck(this, Response)\n\n // The statusText getter steps are to return this’s response’s status\n // message.\n return this.#state.statusText\n }\n\n // Returns response’s headers as Headers.\n get headers () {\n webidl.brandCheck(this, Response)\n\n // The headers getter steps are to return this’s headers.\n return this.#headers\n }\n\n get body () {\n webidl.brandCheck(this, Response)\n\n return this.#state.body ? this.#state.body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Response)\n\n return !!this.#state.body && util.isDisturbed(this.#state.body.stream)\n }\n\n // Returns a clone of response.\n clone () {\n webidl.brandCheck(this, Response)\n\n // 1. If this is unusable, then throw a TypeError.\n if (bodyUnusable(this.#state)) {\n throw webidl.errors.exception({\n header: 'Response.clone',\n message: 'Body has already been consumed.'\n })\n }\n\n // 2. Let clonedResponse be the result of cloning this’s response.\n const clonedResponse = cloneResponse(this.#state)\n\n // Note: To re-register because of a new stream.\n // Don't set finalizers other than for fetch responses.\n if (this.#state.urlList.length !== 0 && this.#state.body?.stream) {\n streamRegistry.register(this, new WeakRef(this.#state.body.stream))\n }\n\n // 3. Return the result of creating a Response object, given\n // clonedResponse, this’s headers’s guard, and this’s relevant Realm.\n return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers))\n }\n\n [nodeUtil.inspect.custom] (depth, options) {\n if (options.depth === null) {\n options.depth = 2\n }\n\n options.colors ??= true\n\n const properties = {\n status: this.status,\n statusText: this.statusText,\n headers: this.headers,\n body: this.body,\n bodyUsed: this.bodyUsed,\n ok: this.ok,\n redirected: this.redirected,\n type: this.type,\n url: this.url\n }\n\n return `Response ${nodeUtil.formatWithOptions(options, properties)}`\n }\n\n /**\n * @param {Response} response\n */\n static getResponseHeaders (response) {\n return response.#headers\n }\n\n /**\n * @param {Response} response\n * @param {Headers} newHeaders\n */\n static setResponseHeaders (response, newHeaders) {\n response.#headers = newHeaders\n }\n\n /**\n * @param {Response} response\n */\n static getResponseState (response) {\n return response.#state\n }\n\n /**\n * @param {Response} response\n * @param {any} newState\n */\n static setResponseState (response, newState) {\n response.#state = newState\n }\n}\n\nconst { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response\nReflect.deleteProperty(Response, 'getResponseHeaders')\nReflect.deleteProperty(Response, 'setResponseHeaders')\nReflect.deleteProperty(Response, 'getResponseState')\nReflect.deleteProperty(Response, 'setResponseState')\n\nmixinBody(Response, getResponseState)\n\nObject.defineProperties(Response.prototype, {\n type: kEnumerableProperty,\n url: kEnumerableProperty,\n status: kEnumerableProperty,\n ok: kEnumerableProperty,\n redirected: kEnumerableProperty,\n statusText: kEnumerableProperty,\n headers: kEnumerableProperty,\n clone: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Response',\n configurable: true\n }\n})\n\nObject.defineProperties(Response, {\n json: kEnumerableProperty,\n redirect: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\n// https://fetch.spec.whatwg.org/#concept-response-clone\nfunction cloneResponse (response) {\n // To clone a response response, run these steps:\n\n // 1. If response is a filtered response, then return a new identical\n // filtered response whose internal response is a clone of response’s\n // internal response.\n if (response.internalResponse) {\n return filterResponse(\n cloneResponse(response.internalResponse),\n response.type\n )\n }\n\n // 2. Let newResponse be a copy of response, except for its body.\n const newResponse = makeResponse({ ...response, body: null })\n\n // 3. If response’s body is non-null, then set newResponse’s body to the\n // result of cloning response’s body.\n if (response.body != null) {\n newResponse.body = cloneBody(response.body)\n }\n\n // 4. Return newResponse.\n return newResponse\n}\n\nfunction makeResponse (init) {\n return {\n aborted: false,\n rangeRequested: false,\n timingAllowPassed: false,\n requestIncludesCredentials: false,\n type: 'default',\n status: 200,\n timingInfo: null,\n cacheState: '',\n statusText: '',\n ...init,\n headersList: init?.headersList\n ? new HeadersList(init?.headersList)\n : new HeadersList(),\n urlList: init?.urlList ? [...init.urlList] : []\n }\n}\n\nfunction makeNetworkError (reason) {\n const isError = isErrorLike(reason)\n return makeResponse({\n type: 'error',\n status: 0,\n error: isError\n ? reason\n : new Error(reason ? String(reason) : reason),\n aborted: reason && reason.name === 'AbortError'\n })\n}\n\n// @see https://fetch.spec.whatwg.org/#concept-network-error\nfunction isNetworkError (response) {\n return (\n // A network error is a response whose type is \"error\",\n response.type === 'error' &&\n // status is 0\n response.status === 0\n )\n}\n\nfunction makeFilteredResponse (response, state) {\n state = {\n internalResponse: response,\n ...state\n }\n\n return new Proxy(response, {\n get (target, p) {\n return p in state ? state[p] : target[p]\n },\n set (target, p, value) {\n assert(!(p in state))\n target[p] = value\n return true\n }\n })\n}\n\n// https://fetch.spec.whatwg.org/#concept-filtered-response\nfunction filterResponse (response, type) {\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (type === 'basic') {\n // A basic filtered response is a filtered response whose type is \"basic\"\n // and header list excludes any headers in internal response’s header list\n // whose name is a forbidden response-header name.\n\n // Note: undici does not implement forbidden response-header names\n return makeFilteredResponse(response, {\n type: 'basic',\n headersList: response.headersList\n })\n } else if (type === 'cors') {\n // A CORS filtered response is a filtered response whose type is \"cors\"\n // and header list excludes any headers in internal response’s header\n // list whose name is not a CORS-safelisted response-header name, given\n // internal response’s CORS-exposed header-name list.\n\n // Note: undici does not implement CORS-safelisted response-header names\n return makeFilteredResponse(response, {\n type: 'cors',\n headersList: response.headersList\n })\n } else if (type === 'opaque') {\n // An opaque filtered response is a filtered response whose type is\n // \"opaque\", URL list is the empty list, status is 0, status message\n // is the empty byte sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaque',\n urlList: [],\n status: 0,\n statusText: '',\n body: null\n })\n } else if (type === 'opaqueredirect') {\n // An opaque-redirect filtered response is a filtered response whose type\n // is \"opaqueredirect\", status is 0, status message is the empty byte\n // sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaqueredirect',\n status: 0,\n statusText: '',\n headersList: [],\n body: null\n })\n } else {\n assert(false)\n }\n}\n\n// https://fetch.spec.whatwg.org/#appropriate-network-error\nfunction makeAppropriateNetworkError (fetchParams, err = null) {\n // 1. Assert: fetchParams is canceled.\n assert(isCancelled(fetchParams))\n\n // 2. Return an aborted network error if fetchParams is aborted;\n // otherwise return a network error.\n return isAborted(fetchParams)\n ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err }))\n : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err }))\n}\n\n// https://whatpr.org/fetch/1392.html#initialize-a-response\nfunction initializeResponse (response, init, body) {\n // 1. If init[\"status\"] is not in the range 200 to 599, inclusive, then\n // throw a RangeError.\n if (init.status !== null && (init.status < 200 || init.status > 599)) {\n throw new RangeError('init[\"status\"] must be in the range of 200 to 599, inclusive.')\n }\n\n // 2. If init[\"statusText\"] does not match the reason-phrase token production,\n // then throw a TypeError.\n if ('statusText' in init && init.statusText != null) {\n // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2:\n // reason-phrase = *( HTAB / SP / VCHAR / obs-text )\n if (!isValidReasonPhrase(String(init.statusText))) {\n throw new TypeError('Invalid statusText')\n }\n }\n\n // 3. Set response’s response’s status to init[\"status\"].\n if ('status' in init && init.status != null) {\n getResponseState(response).status = init.status\n }\n\n // 4. Set response’s response’s status message to init[\"statusText\"].\n if ('statusText' in init && init.statusText != null) {\n getResponseState(response).statusText = init.statusText\n }\n\n // 5. If init[\"headers\"] exists, then fill response’s headers with init[\"headers\"].\n if ('headers' in init && init.headers != null) {\n fill(getResponseHeaders(response), init.headers)\n }\n\n // 6. If body was given, then:\n if (body) {\n // 1. If response's status is a null body status, then throw a TypeError.\n if (nullBodyStatus.includes(response.status)) {\n throw webidl.errors.exception({\n header: 'Response constructor',\n message: `Invalid response status code ${response.status}`\n })\n }\n\n // 2. Set response's body to body's body.\n getResponseState(response).body = body.body\n\n // 3. If body's type is non-null and response's header list does not contain\n // `Content-Type`, then append (`Content-Type`, body's type) to response's header list.\n if (body.type != null && !getResponseState(response).headersList.contains('content-type', true)) {\n getResponseState(response).headersList.append('content-type', body.type, true)\n }\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#response-create\n * @param {any} innerResponse\n * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard\n * @returns {Response}\n */\nfunction fromInnerResponse (innerResponse, guard) {\n const response = new Response(kConstruct)\n setResponseState(response, innerResponse)\n const headers = new Headers(kConstruct)\n setResponseHeaders(response, headers)\n setHeadersList(headers, innerResponse.headersList)\n setHeadersGuard(headers, guard)\n\n // Note: If innerResponse's urlList contains a URL, it is a fetch response.\n if (innerResponse.urlList.length !== 0 && innerResponse.body?.stream) {\n // If the target (response) is reclaimed, the cleanup callback may be called at some point with\n // the held value provided for it (innerResponse.body.stream). The held value can be any value:\n // a primitive or an object, even undefined. If the held value is an object, the registry keeps\n // a strong reference to it (so it can pass it to the cleanup callback later). Reworded from\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n streamRegistry.register(response, new WeakRef(innerResponse.body.stream))\n }\n\n return response\n}\n\n// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit\nwebidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V, prefix, name)\n }\n\n if (webidl.is.Blob(V)) {\n return V\n }\n\n if (webidl.is.BufferSource(V)) {\n return V\n }\n\n if (webidl.is.FormData(V)) {\n return V\n }\n\n if (webidl.is.URLSearchParams(V)) {\n return V\n }\n\n return webidl.converters.DOMString(V, prefix, name)\n}\n\n// https://fetch.spec.whatwg.org/#bodyinit\nwebidl.converters.BodyInit = function (V, prefix, argument) {\n if (webidl.is.ReadableStream(V)) {\n return V\n }\n\n // Note: the spec doesn't include async iterables,\n // this is an undici extension.\n if (V?.[Symbol.asyncIterator]) {\n return V\n }\n\n return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument)\n}\n\nwebidl.converters.ResponseInit = webidl.dictionaryConverter([\n {\n key: 'status',\n converter: webidl.converters['unsigned short'],\n defaultValue: () => 200\n },\n {\n key: 'statusText',\n converter: webidl.converters.ByteString,\n defaultValue: () => ''\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n }\n])\n\nwebidl.is.Response = webidl.util.MakeTypeAssertion(Response)\n\nmodule.exports = {\n isNetworkError,\n makeNetworkError,\n makeResponse,\n makeAppropriateNetworkError,\n filterResponse,\n Response,\n cloneResponse,\n fromInnerResponse,\n getResponseState\n}\n","/* globals AbortController */\n\n'use strict'\n\nconst { extractBody, mixinBody, cloneBody, bodyUnusable } = require('./body')\nconst { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require('./headers')\nconst util = require('../../core/util')\nconst nodeUtil = require('node:util')\nconst {\n isValidHTTPToken,\n sameOrigin,\n environmentSettingsObject\n} = require('./util')\nconst {\n forbiddenMethodsSet,\n corsSafeListedMethodsSet,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n requestDuplex\n} = require('./constants')\nconst { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('./data-url')\nconst { kConstruct } = require('../../core/symbols')\nconst assert = require('node:assert')\nconst { getMaxListeners, setMaxListeners, defaultMaxListeners } = require('node:events')\n\nconst kAbortController = Symbol('abortController')\n\nconst requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {\n signal.removeEventListener('abort', abort)\n})\n\nconst dependentControllerMap = new WeakMap()\n\nlet abortSignalHasEventHandlerLeakWarning\n\ntry {\n abortSignalHasEventHandlerLeakWarning = getMaxListeners(new AbortController().signal) > 0\n} catch {\n abortSignalHasEventHandlerLeakWarning = false\n}\n\nfunction buildAbort (acRef) {\n return abort\n\n function abort () {\n const ac = acRef.deref()\n if (ac !== undefined) {\n // Currently, there is a problem with FinalizationRegistry.\n // https://github.com/nodejs/node/issues/49344\n // https://github.com/nodejs/node/issues/47748\n // In the case of abort, the first step is to unregister from it.\n // If the controller can refer to it, it is still registered.\n // It will be removed in the future.\n requestFinalizer.unregister(abort)\n\n // Unsubscribe a listener.\n // FinalizationRegistry will no longer be called, so this must be done.\n this.removeEventListener('abort', abort)\n\n ac.abort(this.reason)\n\n const controllerList = dependentControllerMap.get(ac.signal)\n\n if (controllerList !== undefined) {\n if (controllerList.size !== 0) {\n for (const ref of controllerList) {\n const ctrl = ref.deref()\n if (ctrl !== undefined) {\n ctrl.abort(this.reason)\n }\n }\n controllerList.clear()\n }\n dependentControllerMap.delete(ac.signal)\n }\n }\n }\n}\n\nlet patchMethodWarning = false\n\n// https://fetch.spec.whatwg.org/#request-class\nclass Request {\n /** @type {AbortSignal} */\n #signal\n\n /** @type {import('../../dispatcher/dispatcher')} */\n #dispatcher\n\n /** @type {Headers} */\n #headers\n\n #state\n\n // https://fetch.spec.whatwg.org/#dom-request\n constructor (input, init = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (input === kConstruct) {\n return\n }\n\n const prefix = 'Request constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n input = webidl.converters.RequestInfo(input)\n init = webidl.converters.RequestInit(init)\n\n // 1. Let request be null.\n let request = null\n\n // 2. Let fallbackMode be null.\n let fallbackMode = null\n\n // 3. Let baseURL be this’s relevant settings object’s API base URL.\n const baseUrl = environmentSettingsObject.settingsObject.baseUrl\n\n // 4. Let signal be null.\n let signal = null\n\n // 5. If input is a string, then:\n if (typeof input === 'string') {\n this.#dispatcher = init.dispatcher\n\n // 1. Let parsedURL be the result of parsing input with baseURL.\n // 2. If parsedURL is failure, then throw a TypeError.\n let parsedURL\n try {\n parsedURL = new URL(input, baseUrl)\n } catch (err) {\n throw new TypeError('Failed to parse URL from ' + input, { cause: err })\n }\n\n // 3. If parsedURL includes credentials, then throw a TypeError.\n if (parsedURL.username || parsedURL.password) {\n throw new TypeError(\n 'Request cannot be constructed from a URL that includes credentials: ' +\n input\n )\n }\n\n // 4. Set request to a new request whose URL is parsedURL.\n request = makeRequest({ urlList: [parsedURL] })\n\n // 5. Set fallbackMode to \"cors\".\n fallbackMode = 'cors'\n } else {\n // 6. Otherwise:\n\n // 7. Assert: input is a Request object.\n assert(webidl.is.Request(input))\n\n // 8. Set request to input’s request.\n request = input.#state\n\n // 9. Set signal to input’s signal.\n signal = input.#signal\n\n this.#dispatcher = init.dispatcher || input.#dispatcher\n }\n\n // 7. Let origin be this’s relevant settings object’s origin.\n const origin = environmentSettingsObject.settingsObject.origin\n\n // 8. Let window be \"client\".\n let window = 'client'\n\n // 9. If request’s window is an environment settings object and its origin\n // is same origin with origin, then set window to request’s window.\n if (\n request.window?.constructor?.name === 'EnvironmentSettingsObject' &&\n sameOrigin(request.window, origin)\n ) {\n window = request.window\n }\n\n // 10. If init[\"window\"] exists and is non-null, then throw a TypeError.\n if (init.window != null) {\n throw new TypeError(`'window' option '${window}' must be null`)\n }\n\n // 11. If init[\"window\"] exists, then set window to \"no-window\".\n if ('window' in init) {\n window = 'no-window'\n }\n\n // 12. Set request to a new request with the following properties:\n request = makeRequest({\n // URL request’s URL.\n // undici implementation note: this is set as the first item in request's urlList in makeRequest\n // method request’s method.\n method: request.method,\n // header list A copy of request’s header list.\n // undici implementation note: headersList is cloned in makeRequest\n headersList: request.headersList,\n // unsafe-request flag Set.\n unsafeRequest: request.unsafeRequest,\n // client This’s relevant settings object.\n client: environmentSettingsObject.settingsObject,\n // window window.\n window,\n // priority request’s priority.\n priority: request.priority,\n // origin request’s origin. The propagation of the origin is only significant for navigation requests\n // being handled by a service worker. In this scenario a request can have an origin that is different\n // from the current client.\n origin: request.origin,\n // referrer request’s referrer.\n referrer: request.referrer,\n // referrer policy request’s referrer policy.\n referrerPolicy: request.referrerPolicy,\n // mode request’s mode.\n mode: request.mode,\n // credentials mode request’s credentials mode.\n credentials: request.credentials,\n // cache mode request’s cache mode.\n cache: request.cache,\n // redirect mode request’s redirect mode.\n redirect: request.redirect,\n // integrity metadata request’s integrity metadata.\n integrity: request.integrity,\n // keepalive request’s keepalive.\n keepalive: request.keepalive,\n // reload-navigation flag request’s reload-navigation flag.\n reloadNavigation: request.reloadNavigation,\n // history-navigation flag request’s history-navigation flag.\n historyNavigation: request.historyNavigation,\n // URL list A clone of request’s URL list.\n urlList: [...request.urlList]\n })\n\n const initHasKey = Object.keys(init).length !== 0\n\n // 13. If init is not empty, then:\n if (initHasKey) {\n // 1. If request’s mode is \"navigate\", then set it to \"same-origin\".\n if (request.mode === 'navigate') {\n request.mode = 'same-origin'\n }\n\n // 2. Unset request’s reload-navigation flag.\n request.reloadNavigation = false\n\n // 3. Unset request’s history-navigation flag.\n request.historyNavigation = false\n\n // 4. Set request’s origin to \"client\".\n request.origin = 'client'\n\n // 5. Set request’s referrer to \"client\"\n request.referrer = 'client'\n\n // 6. Set request’s referrer policy to the empty string.\n request.referrerPolicy = ''\n\n // 7. Set request’s URL to request’s current URL.\n request.url = request.urlList[request.urlList.length - 1]\n\n // 8. Set request’s URL list to « request’s URL ».\n request.urlList = [request.url]\n }\n\n // 14. If init[\"referrer\"] exists, then:\n if (init.referrer !== undefined) {\n // 1. Let referrer be init[\"referrer\"].\n const referrer = init.referrer\n\n // 2. If referrer is the empty string, then set request’s referrer to \"no-referrer\".\n if (referrer === '') {\n request.referrer = 'no-referrer'\n } else {\n // 1. Let parsedReferrer be the result of parsing referrer with\n // baseURL.\n // 2. If parsedReferrer is failure, then throw a TypeError.\n let parsedReferrer\n try {\n parsedReferrer = new URL(referrer, baseUrl)\n } catch (err) {\n throw new TypeError(`Referrer \"${referrer}\" is not a valid URL.`, { cause: err })\n }\n\n // 3. If one of the following is true\n // - parsedReferrer’s scheme is \"about\" and path is the string \"client\"\n // - parsedReferrer’s origin is not same origin with origin\n // then set request’s referrer to \"client\".\n if (\n (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') ||\n (origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl))\n ) {\n request.referrer = 'client'\n } else {\n // 4. Otherwise, set request’s referrer to parsedReferrer.\n request.referrer = parsedReferrer\n }\n }\n }\n\n // 15. If init[\"referrerPolicy\"] exists, then set request’s referrer policy\n // to it.\n if (init.referrerPolicy !== undefined) {\n request.referrerPolicy = init.referrerPolicy\n }\n\n // 16. Let mode be init[\"mode\"] if it exists, and fallbackMode otherwise.\n let mode\n if (init.mode !== undefined) {\n mode = init.mode\n } else {\n mode = fallbackMode\n }\n\n // 17. If mode is \"navigate\", then throw a TypeError.\n if (mode === 'navigate') {\n throw webidl.errors.exception({\n header: 'Request constructor',\n message: 'invalid request mode navigate.'\n })\n }\n\n // 18. If mode is non-null, set request’s mode to mode.\n if (mode != null) {\n request.mode = mode\n }\n\n // 19. If init[\"credentials\"] exists, then set request’s credentials mode\n // to it.\n if (init.credentials !== undefined) {\n request.credentials = init.credentials\n }\n\n // 18. If init[\"cache\"] exists, then set request’s cache mode to it.\n if (init.cache !== undefined) {\n request.cache = init.cache\n }\n\n // 21. If request’s cache mode is \"only-if-cached\" and request’s mode is\n // not \"same-origin\", then throw a TypeError.\n if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {\n throw new TypeError(\n \"'only-if-cached' can be set only with 'same-origin' mode\"\n )\n }\n\n // 22. If init[\"redirect\"] exists, then set request’s redirect mode to it.\n if (init.redirect !== undefined) {\n request.redirect = init.redirect\n }\n\n // 23. If init[\"integrity\"] exists, then set request’s integrity metadata to it.\n if (init.integrity != null) {\n request.integrity = String(init.integrity)\n }\n\n // 24. If init[\"keepalive\"] exists, then set request’s keepalive to it.\n if (init.keepalive !== undefined) {\n request.keepalive = Boolean(init.keepalive)\n }\n\n // 25. If init[\"method\"] exists, then:\n if (init.method !== undefined) {\n // 1. Let method be init[\"method\"].\n let method = init.method\n\n const mayBeNormalized = normalizedMethodRecords[method]\n\n if (mayBeNormalized !== undefined) {\n // Note: Bypass validation DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH and these lowercase ones\n request.method = mayBeNormalized\n } else {\n // 2. If method is not a method or method is a forbidden method, then\n // throw a TypeError.\n if (!isValidHTTPToken(method)) {\n throw new TypeError(`'${method}' is not a valid HTTP method.`)\n }\n\n const upperCase = method.toUpperCase()\n\n if (forbiddenMethodsSet.has(upperCase)) {\n throw new TypeError(`'${method}' HTTP method is unsupported.`)\n }\n\n // 3. Normalize method.\n // https://fetch.spec.whatwg.org/#concept-method-normalize\n // Note: must be in uppercase\n method = normalizedMethodRecordsBase[upperCase] ?? method\n\n // 4. Set request’s method to method.\n request.method = method\n }\n\n if (!patchMethodWarning && request.method === 'patch') {\n process.emitWarning('Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.', {\n code: 'UNDICI-FETCH-patch'\n })\n\n patchMethodWarning = true\n }\n }\n\n // 26. If init[\"signal\"] exists, then set signal to it.\n if (init.signal !== undefined) {\n signal = init.signal\n }\n\n // 27. Set this’s request to request.\n this.#state = request\n\n // 28. Set this’s signal to a new AbortSignal object with this’s relevant\n // Realm.\n // TODO: could this be simplified with AbortSignal.any\n // (https://dom.spec.whatwg.org/#dom-abortsignal-any)\n const ac = new AbortController()\n this.#signal = ac.signal\n\n // 29. If signal is not null, then make this’s signal follow signal.\n if (signal != null) {\n if (signal.aborted) {\n ac.abort(signal.reason)\n } else {\n // Keep a strong ref to ac while request object\n // is alive. This is needed to prevent AbortController\n // from being prematurely garbage collected.\n // See, https://github.com/nodejs/undici/issues/1926.\n this[kAbortController] = ac\n\n const acRef = new WeakRef(ac)\n const abort = buildAbort(acRef)\n\n // If the max amount of listeners is equal to the default, increase it\n if (abortSignalHasEventHandlerLeakWarning && getMaxListeners(signal) === defaultMaxListeners) {\n setMaxListeners(1500, signal)\n }\n\n util.addAbortListener(signal, abort)\n // The third argument must be a registry key to be unregistered.\n // Without it, you cannot unregister.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n // abort is used as the unregister key. (because it is unique)\n requestFinalizer.register(ac, { signal, abort }, abort)\n }\n }\n\n // 30. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is request’s header list and guard is\n // \"request\".\n this.#headers = new Headers(kConstruct)\n setHeadersList(this.#headers, request.headersList)\n setHeadersGuard(this.#headers, 'request')\n\n // 31. If this’s request’s mode is \"no-cors\", then:\n if (mode === 'no-cors') {\n // 1. If this’s request’s method is not a CORS-safelisted method,\n // then throw a TypeError.\n if (!corsSafeListedMethodsSet.has(request.method)) {\n throw new TypeError(\n `'${request.method} is unsupported in no-cors mode.`\n )\n }\n\n // 2. Set this’s headers’s guard to \"request-no-cors\".\n setHeadersGuard(this.#headers, 'request-no-cors')\n }\n\n // 32. If init is not empty, then:\n if (initHasKey) {\n /** @type {HeadersList} */\n const headersList = getHeadersList(this.#headers)\n // 1. Let headers be a copy of this’s headers and its associated header\n // list.\n // 2. If init[\"headers\"] exists, then set headers to init[\"headers\"].\n const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList)\n\n // 3. Empty this’s headers’s header list.\n headersList.clear()\n\n // 4. If headers is a Headers object, then for each header in its header\n // list, append header’s name/header’s value to this’s headers.\n if (headers instanceof HeadersList) {\n for (const { name, value } of headers.rawValues()) {\n headersList.append(name, value, false)\n }\n // Note: Copy the `set-cookie` meta-data.\n headersList.cookies = headers.cookies\n } else {\n // 5. Otherwise, fill this’s headers with headers.\n fillHeaders(this.#headers, headers)\n }\n }\n\n // 33. Let inputBody be input’s request’s body if input is a Request\n // object; otherwise null.\n const inputBody = webidl.is.Request(input) ? input.#state.body : null\n\n // 34. If either init[\"body\"] exists and is non-null or inputBody is\n // non-null, and request’s method is `GET` or `HEAD`, then throw a\n // TypeError.\n if (\n (init.body != null || inputBody != null) &&\n (request.method === 'GET' || request.method === 'HEAD')\n ) {\n throw new TypeError('Request with GET/HEAD method cannot have body.')\n }\n\n // 35. Let initBody be null.\n let initBody = null\n\n // 36. If init[\"body\"] exists and is non-null, then:\n if (init.body != null) {\n // 1. Let Content-Type be null.\n // 2. Set initBody and Content-Type to the result of extracting\n // init[\"body\"], with keepalive set to request’s keepalive.\n const [extractedBody, contentType] = extractBody(\n init.body,\n request.keepalive\n )\n initBody = extractedBody\n\n // 3, If Content-Type is non-null and this’s headers’s header list does\n // not contain `Content-Type`, then append `Content-Type`/Content-Type to\n // this’s headers.\n if (contentType && !getHeadersList(this.#headers).contains('content-type', true)) {\n this.#headers.append('content-type', contentType, true)\n }\n }\n\n // 37. Let inputOrInitBody be initBody if it is non-null; otherwise\n // inputBody.\n const inputOrInitBody = initBody ?? inputBody\n\n // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is\n // null, then:\n if (inputOrInitBody != null && inputOrInitBody.source == null) {\n // 1. If initBody is non-null and init[\"duplex\"] does not exist,\n // then throw a TypeError.\n if (initBody != null && init.duplex == null) {\n throw new TypeError('RequestInit: duplex option is required when sending a body.')\n }\n\n // 2. If this’s request’s mode is neither \"same-origin\" nor \"cors\",\n // then throw a TypeError.\n if (request.mode !== 'same-origin' && request.mode !== 'cors') {\n throw new TypeError(\n 'If request is made from ReadableStream, mode should be \"same-origin\" or \"cors\"'\n )\n }\n\n // 3. Set this’s request’s use-CORS-preflight flag.\n request.useCORSPreflightFlag = true\n }\n\n // 39. Let finalBody be inputOrInitBody.\n let finalBody = inputOrInitBody\n\n // 40. If initBody is null and inputBody is non-null, then:\n if (initBody == null && inputBody != null) {\n // 1. If input is unusable, then throw a TypeError.\n if (bodyUnusable(input.#state)) {\n throw new TypeError(\n 'Cannot construct a Request with a Request object that has already been used.'\n )\n }\n\n // 2. Set finalBody to the result of creating a proxy for inputBody.\n // https://streams.spec.whatwg.org/#readablestream-create-a-proxy\n const identityTransform = new TransformStream()\n inputBody.stream.pipeThrough(identityTransform)\n finalBody = {\n source: inputBody.source,\n length: inputBody.length,\n stream: identityTransform.readable\n }\n }\n\n // 41. Set this’s request’s body to finalBody.\n this.#state.body = finalBody\n }\n\n // Returns request’s HTTP method, which is \"GET\" by default.\n get method () {\n webidl.brandCheck(this, Request)\n\n // The method getter steps are to return this’s request’s method.\n return this.#state.method\n }\n\n // Returns the URL of request as a string.\n get url () {\n webidl.brandCheck(this, Request)\n\n // The url getter steps are to return this’s request’s URL, serialized.\n return URLSerializer(this.#state.url)\n }\n\n // Returns a Headers object consisting of the headers associated with request.\n // Note that headers added in the network layer by the user agent will not\n // be accounted for in this object, e.g., the \"Host\" header.\n get headers () {\n webidl.brandCheck(this, Request)\n\n // The headers getter steps are to return this’s headers.\n return this.#headers\n }\n\n // Returns the kind of resource requested by request, e.g., \"document\"\n // or \"script\".\n get destination () {\n webidl.brandCheck(this, Request)\n\n // The destination getter are to return this’s request’s destination.\n return this.#state.destination\n }\n\n // Returns the referrer of request. Its value can be a same-origin URL if\n // explicitly set in init, the empty string to indicate no referrer, and\n // \"about:client\" when defaulting to the global’s default. This is used\n // during fetching to determine the value of the `Referer` header of the\n // request being made.\n get referrer () {\n webidl.brandCheck(this, Request)\n\n // 1. If this’s request’s referrer is \"no-referrer\", then return the\n // empty string.\n if (this.#state.referrer === 'no-referrer') {\n return ''\n }\n\n // 2. If this’s request’s referrer is \"client\", then return\n // \"about:client\".\n if (this.#state.referrer === 'client') {\n return 'about:client'\n }\n\n // Return this’s request’s referrer, serialized.\n return this.#state.referrer.toString()\n }\n\n // Returns the referrer policy associated with request.\n // This is used during fetching to compute the value of the request’s\n // referrer.\n get referrerPolicy () {\n webidl.brandCheck(this, Request)\n\n // The referrerPolicy getter steps are to return this’s request’s referrer policy.\n return this.#state.referrerPolicy\n }\n\n // Returns the mode associated with request, which is a string indicating\n // whether the request will use CORS, or will be restricted to same-origin\n // URLs.\n get mode () {\n webidl.brandCheck(this, Request)\n\n // The mode getter steps are to return this’s request’s mode.\n return this.#state.mode\n }\n\n // Returns the credentials mode associated with request,\n // which is a string indicating whether credentials will be sent with the\n // request always, never, or only when sent to a same-origin URL.\n get credentials () {\n webidl.brandCheck(this, Request)\n\n // The credentials getter steps are to return this’s request’s credentials mode.\n return this.#state.credentials\n }\n\n // Returns the cache mode associated with request,\n // which is a string indicating how the request will\n // interact with the browser’s cache when fetching.\n get cache () {\n webidl.brandCheck(this, Request)\n\n // The cache getter steps are to return this’s request’s cache mode.\n return this.#state.cache\n }\n\n // Returns the redirect mode associated with request,\n // which is a string indicating how redirects for the\n // request will be handled during fetching. A request\n // will follow redirects by default.\n get redirect () {\n webidl.brandCheck(this, Request)\n\n // The redirect getter steps are to return this’s request’s redirect mode.\n return this.#state.redirect\n }\n\n // Returns request’s subresource integrity metadata, which is a\n // cryptographic hash of the resource being fetched. Its value\n // consists of multiple hashes separated by whitespace. [SRI]\n get integrity () {\n webidl.brandCheck(this, Request)\n\n // The integrity getter steps are to return this’s request’s integrity\n // metadata.\n return this.#state.integrity\n }\n\n // Returns a boolean indicating whether or not request can outlive the\n // global in which it was created.\n get keepalive () {\n webidl.brandCheck(this, Request)\n\n // The keepalive getter steps are to return this’s request’s keepalive.\n return this.#state.keepalive\n }\n\n // Returns a boolean indicating whether or not request is for a reload\n // navigation.\n get isReloadNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isReloadNavigation getter steps are to return true if this’s\n // request’s reload-navigation flag is set; otherwise false.\n return this.#state.reloadNavigation\n }\n\n // Returns a boolean indicating whether or not request is for a history\n // navigation (a.k.a. back-forward navigation).\n get isHistoryNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isHistoryNavigation getter steps are to return true if this’s request’s\n // history-navigation flag is set; otherwise false.\n return this.#state.historyNavigation\n }\n\n // Returns the signal associated with request, which is an AbortSignal\n // object indicating whether or not request has been aborted, and its\n // abort event handler.\n get signal () {\n webidl.brandCheck(this, Request)\n\n // The signal getter steps are to return this’s signal.\n return this.#signal\n }\n\n get body () {\n webidl.brandCheck(this, Request)\n\n return this.#state.body ? this.#state.body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Request)\n\n return !!this.#state.body && util.isDisturbed(this.#state.body.stream)\n }\n\n get duplex () {\n webidl.brandCheck(this, Request)\n\n return 'half'\n }\n\n // Returns a clone of request.\n clone () {\n webidl.brandCheck(this, Request)\n\n // 1. If this is unusable, then throw a TypeError.\n if (bodyUnusable(this.#state)) {\n throw new TypeError('unusable')\n }\n\n // 2. Let clonedRequest be the result of cloning this’s request.\n const clonedRequest = cloneRequest(this.#state)\n\n // 3. Let clonedRequestObject be the result of creating a Request object,\n // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.\n // 4. Make clonedRequestObject’s signal follow this’s signal.\n const ac = new AbortController()\n if (this.signal.aborted) {\n ac.abort(this.signal.reason)\n } else {\n let list = dependentControllerMap.get(this.signal)\n if (list === undefined) {\n list = new Set()\n dependentControllerMap.set(this.signal, list)\n }\n const acRef = new WeakRef(ac)\n list.add(acRef)\n util.addAbortListener(\n ac.signal,\n buildAbort(acRef)\n )\n }\n\n // 4. Return clonedRequestObject.\n return fromInnerRequest(clonedRequest, this.#dispatcher, ac.signal, getHeadersGuard(this.#headers))\n }\n\n [nodeUtil.inspect.custom] (depth, options) {\n if (options.depth === null) {\n options.depth = 2\n }\n\n options.colors ??= true\n\n const properties = {\n method: this.method,\n url: this.url,\n headers: this.headers,\n destination: this.destination,\n referrer: this.referrer,\n referrerPolicy: this.referrerPolicy,\n mode: this.mode,\n credentials: this.credentials,\n cache: this.cache,\n redirect: this.redirect,\n integrity: this.integrity,\n keepalive: this.keepalive,\n isReloadNavigation: this.isReloadNavigation,\n isHistoryNavigation: this.isHistoryNavigation,\n signal: this.signal\n }\n\n return `Request ${nodeUtil.formatWithOptions(options, properties)}`\n }\n\n /**\n * @param {Request} request\n * @param {AbortSignal} newSignal\n */\n static setRequestSignal (request, newSignal) {\n request.#signal = newSignal\n return request\n }\n\n /**\n * @param {Request} request\n */\n static getRequestDispatcher (request) {\n return request.#dispatcher\n }\n\n /**\n * @param {Request} request\n * @param {import('../../dispatcher/dispatcher')} newDispatcher\n */\n static setRequestDispatcher (request, newDispatcher) {\n request.#dispatcher = newDispatcher\n }\n\n /**\n * @param {Request} request\n * @param {Headers} newHeaders\n */\n static setRequestHeaders (request, newHeaders) {\n request.#headers = newHeaders\n }\n\n /**\n * @param {Request} request\n */\n static getRequestState (request) {\n return request.#state\n }\n\n /**\n * @param {Request} request\n * @param {any} newState\n */\n static setRequestState (request, newState) {\n request.#state = newState\n }\n}\n\nconst { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request\nReflect.deleteProperty(Request, 'setRequestSignal')\nReflect.deleteProperty(Request, 'getRequestDispatcher')\nReflect.deleteProperty(Request, 'setRequestDispatcher')\nReflect.deleteProperty(Request, 'setRequestHeaders')\nReflect.deleteProperty(Request, 'getRequestState')\nReflect.deleteProperty(Request, 'setRequestState')\n\nmixinBody(Request, getRequestState)\n\n// https://fetch.spec.whatwg.org/#requests\nfunction makeRequest (init) {\n return {\n method: init.method ?? 'GET',\n localURLsOnly: init.localURLsOnly ?? false,\n unsafeRequest: init.unsafeRequest ?? false,\n body: init.body ?? null,\n client: init.client ?? null,\n reservedClient: init.reservedClient ?? null,\n replacesClientId: init.replacesClientId ?? '',\n window: init.window ?? 'client',\n keepalive: init.keepalive ?? false,\n serviceWorkers: init.serviceWorkers ?? 'all',\n initiator: init.initiator ?? '',\n destination: init.destination ?? '',\n priority: init.priority ?? null,\n origin: init.origin ?? 'client',\n policyContainer: init.policyContainer ?? 'client',\n referrer: init.referrer ?? 'client',\n referrerPolicy: init.referrerPolicy ?? '',\n mode: init.mode ?? 'no-cors',\n useCORSPreflightFlag: init.useCORSPreflightFlag ?? false,\n credentials: init.credentials ?? 'same-origin',\n useCredentials: init.useCredentials ?? false,\n cache: init.cache ?? 'default',\n redirect: init.redirect ?? 'follow',\n integrity: init.integrity ?? '',\n cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? '',\n parserMetadata: init.parserMetadata ?? '',\n reloadNavigation: init.reloadNavigation ?? false,\n historyNavigation: init.historyNavigation ?? false,\n userActivation: init.userActivation ?? false,\n taintedOrigin: init.taintedOrigin ?? false,\n redirectCount: init.redirectCount ?? 0,\n responseTainting: init.responseTainting ?? 'basic',\n preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false,\n done: init.done ?? false,\n timingAllowFailed: init.timingAllowFailed ?? false,\n useURLCredentials: init.useURLCredentials ?? undefined,\n traversableForUserPrompts: init.traversableForUserPrompts ?? 'client',\n urlList: init.urlList,\n url: init.urlList[0],\n headersList: init.headersList\n ? new HeadersList(init.headersList)\n : new HeadersList()\n }\n}\n\n// https://fetch.spec.whatwg.org/#concept-request-clone\nfunction cloneRequest (request) {\n // To clone a request request, run these steps:\n\n // 1. Let newRequest be a copy of request, except for its body.\n const newRequest = makeRequest({ ...request, body: null })\n\n // 2. If request’s body is non-null, set newRequest’s body to the\n // result of cloning request’s body.\n if (request.body != null) {\n newRequest.body = cloneBody(request.body)\n }\n\n // 3. Return newRequest.\n return newRequest\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#request-create\n * @param {any} innerRequest\n * @param {import('../../dispatcher/agent')} dispatcher\n * @param {AbortSignal} signal\n * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard\n * @returns {Request}\n */\nfunction fromInnerRequest (innerRequest, dispatcher, signal, guard) {\n const request = new Request(kConstruct)\n setRequestState(request, innerRequest)\n setRequestDispatcher(request, dispatcher)\n setRequestSignal(request, signal)\n const headers = new Headers(kConstruct)\n setRequestHeaders(request, headers)\n setHeadersList(headers, innerRequest.headersList)\n setHeadersGuard(headers, guard)\n return request\n}\n\nObject.defineProperties(Request.prototype, {\n method: kEnumerableProperty,\n url: kEnumerableProperty,\n headers: kEnumerableProperty,\n redirect: kEnumerableProperty,\n clone: kEnumerableProperty,\n signal: kEnumerableProperty,\n duplex: kEnumerableProperty,\n destination: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n isHistoryNavigation: kEnumerableProperty,\n isReloadNavigation: kEnumerableProperty,\n keepalive: kEnumerableProperty,\n integrity: kEnumerableProperty,\n cache: kEnumerableProperty,\n credentials: kEnumerableProperty,\n attribute: kEnumerableProperty,\n referrerPolicy: kEnumerableProperty,\n referrer: kEnumerableProperty,\n mode: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Request',\n configurable: true\n }\n})\n\nwebidl.is.Request = webidl.util.MakeTypeAssertion(Request)\n\n/**\n * @param {*} V\n * @returns {import('../../../types/fetch').Request|string}\n *\n * @see https://fetch.spec.whatwg.org/#requestinfo\n */\nwebidl.converters.RequestInfo = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n if (webidl.is.Request(V)) {\n return V\n }\n\n return webidl.converters.USVString(V)\n}\n\n/**\n * @param {*} V\n * @returns {import('../../../types/fetch').RequestInit}\n * @see https://fetch.spec.whatwg.org/#requestinit\n */\nwebidl.converters.RequestInit = webidl.dictionaryConverter([\n {\n key: 'method',\n converter: webidl.converters.ByteString\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n },\n {\n key: 'body',\n converter: webidl.nullableConverter(\n webidl.converters.BodyInit\n )\n },\n {\n key: 'referrer',\n converter: webidl.converters.USVString\n },\n {\n key: 'referrerPolicy',\n converter: webidl.converters.DOMString,\n // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy\n allowedValues: referrerPolicy\n },\n {\n key: 'mode',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#concept-request-mode\n allowedValues: requestMode\n },\n {\n key: 'credentials',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcredentials\n allowedValues: requestCredentials\n },\n {\n key: 'cache',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcache\n allowedValues: requestCache\n },\n {\n key: 'redirect',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestredirect\n allowedValues: requestRedirect\n },\n {\n key: 'integrity',\n converter: webidl.converters.DOMString\n },\n {\n key: 'keepalive',\n converter: webidl.converters.boolean\n },\n {\n key: 'signal',\n converter: webidl.nullableConverter(\n (signal) => webidl.converters.AbortSignal(\n signal,\n 'RequestInit',\n 'signal'\n )\n )\n },\n {\n key: 'window',\n converter: webidl.converters.any\n },\n {\n key: 'duplex',\n converter: webidl.converters.DOMString,\n allowedValues: requestDuplex\n },\n {\n key: 'dispatcher', // undici specific option\n converter: webidl.converters.any\n },\n {\n key: 'priority',\n converter: webidl.converters.DOMString,\n allowedValues: ['high', 'low', 'auto'],\n defaultValue: () => 'auto'\n }\n])\n\nmodule.exports = {\n Request,\n makeRequest,\n fromInnerRequest,\n cloneRequest,\n getRequestDispatcher,\n getRequestState\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { runtimeFeatures } = require('../../util/runtime-features.js')\n\n/**\n * @typedef {object} Metadata\n * @property {SRIHashAlgorithm} alg - The algorithm used for the hash.\n * @property {string} val - The base64-encoded hash value.\n */\n\n/**\n * @typedef {Metadata[]} MetadataList\n */\n\n/**\n * @typedef {('sha256' | 'sha384' | 'sha512')} SRIHashAlgorithm\n */\n\n/**\n * @type {Map}\n *\n * The valid SRI hash algorithm token set is the ordered set « \"sha256\",\n * \"sha384\", \"sha512\" » (corresponding to SHA-256, SHA-384, and SHA-512\n * respectively). The ordering of this set is meaningful, with stronger\n * algorithms appearing later in the set.\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#valid-sri-hash-algorithm-token-set\n */\nconst validSRIHashAlgorithmTokenSet = new Map([['sha256', 0], ['sha384', 1], ['sha512', 2]])\n\n// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable\n/** @type {import('node:crypto')} */\nlet crypto\n\nif (runtimeFeatures.has('crypto')) {\n crypto = require('node:crypto')\n const cryptoHashes = crypto.getHashes()\n\n // If no hashes are available, we cannot support SRI.\n if (cryptoHashes.length === 0) {\n validSRIHashAlgorithmTokenSet.clear()\n }\n\n for (const algorithm of validSRIHashAlgorithmTokenSet.keys()) {\n // If the algorithm is not supported, remove it from the list.\n if (cryptoHashes.includes(algorithm) === false) {\n validSRIHashAlgorithmTokenSet.delete(algorithm)\n }\n }\n} else {\n // If crypto is not available, we cannot support SRI.\n validSRIHashAlgorithmTokenSet.clear()\n}\n\n/**\n * @typedef GetSRIHashAlgorithmIndex\n * @type {(algorithm: SRIHashAlgorithm) => number}\n * @param {SRIHashAlgorithm} algorithm\n * @returns {number} The index of the algorithm in the valid SRI hash algorithm\n * token set.\n */\n\nconst getSRIHashAlgorithmIndex = /** @type {GetSRIHashAlgorithmIndex} */ (Map.prototype.get.bind(\n validSRIHashAlgorithmTokenSet))\n\n/**\n * @typedef IsValidSRIHashAlgorithm\n * @type {(algorithm: string) => algorithm is SRIHashAlgorithm}\n * @param {*} algorithm\n * @returns {algorithm is SRIHashAlgorithm}\n */\n\nconst isValidSRIHashAlgorithm = /** @type {IsValidSRIHashAlgorithm} */ (\n Map.prototype.has.bind(validSRIHashAlgorithmTokenSet)\n)\n\n/**\n * @param {Uint8Array} bytes\n * @param {string} metadataList\n * @returns {boolean}\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist\n */\nconst bytesMatch = runtimeFeatures.has('crypto') === false || validSRIHashAlgorithmTokenSet.size === 0\n // If node is not built with OpenSSL support, we cannot check\n // a request's integrity, so allow it by default (the spec will\n // allow requests if an invalid hash is given, as precedence).\n ? () => true\n : (bytes, metadataList) => {\n // 1. Let parsedMetadata be the result of parsing metadataList.\n const parsedMetadata = parseMetadata(metadataList)\n\n // 2. If parsedMetadata is empty set, return true.\n if (parsedMetadata.length === 0) {\n return true\n }\n\n // 3. Let metadata be the result of getting the strongest\n // metadata from parsedMetadata.\n const metadata = getStrongestMetadata(parsedMetadata)\n\n // 4. For each item in metadata:\n for (const item of metadata) {\n // 1. Let algorithm be the item[\"alg\"].\n const algorithm = item.alg\n\n // 2. Let expectedValue be the item[\"val\"].\n const expectedValue = item.val\n\n // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e\n // \"be liberal with padding\". This is annoying, and it's not even in the spec.\n\n // 3. Let actualValue be the result of applying algorithm to bytes .\n const actualValue = applyAlgorithmToBytes(algorithm, bytes)\n\n // 4. If actualValue is a case-sensitive match for expectedValue,\n // return true.\n if (caseSensitiveMatch(actualValue, expectedValue)) {\n return true\n }\n }\n\n // 5. Return false.\n return false\n }\n\n/**\n * @param {MetadataList} metadataList\n * @returns {MetadataList} The strongest hash algorithm from the metadata list.\n */\nfunction getStrongestMetadata (metadataList) {\n // 1. Let result be the empty set and strongest be the empty string.\n const result = []\n /** @type {Metadata|null} */\n let strongest = null\n\n // 2. For each item in set:\n for (const item of metadataList) {\n // 1. Assert: item[\"alg\"] is a valid SRI hash algorithm token.\n assert(isValidSRIHashAlgorithm(item.alg), 'Invalid SRI hash algorithm token')\n\n // 2. If result is the empty set, then:\n if (result.length === 0) {\n // 1. Append item to result.\n result.push(item)\n\n // 2. Set strongest to item.\n strongest = item\n\n // 3. Continue.\n continue\n }\n\n // 3. Let currentAlgorithm be strongest[\"alg\"], and currentAlgorithmIndex be\n // the index of currentAlgorithm in the valid SRI hash algorithm token set.\n const currentAlgorithm = /** @type {Metadata} */ (strongest).alg\n const currentAlgorithmIndex = getSRIHashAlgorithmIndex(currentAlgorithm)\n\n // 4. Let newAlgorithm be the item[\"alg\"], and newAlgorithmIndex be the\n // index of newAlgorithm in the valid SRI hash algorithm token set.\n const newAlgorithm = item.alg\n const newAlgorithmIndex = getSRIHashAlgorithmIndex(newAlgorithm)\n\n // 5. If newAlgorithmIndex is less than currentAlgorithmIndex, then continue.\n if (newAlgorithmIndex < currentAlgorithmIndex) {\n continue\n\n // 6. Otherwise, if newAlgorithmIndex is greater than\n // currentAlgorithmIndex:\n } else if (newAlgorithmIndex > currentAlgorithmIndex) {\n // 1. Set strongest to item.\n strongest = item\n\n // 2. Set result to « item ».\n result[0] = item\n result.length = 1\n\n // 7. Otherwise, newAlgorithmIndex and currentAlgorithmIndex are the same\n // value. Append item to result.\n } else {\n result.push(item)\n }\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * @param {string} metadata\n * @returns {MetadataList}\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata\n */\nfunction parseMetadata (metadata) {\n // 1. Let result be the empty set.\n /** @type {MetadataList} */\n const result = []\n\n // 2. For each item returned by splitting metadata on spaces:\n for (const item of metadata.split(' ')) {\n // 1. Let expression-and-options be the result of splitting item on U+003F (?).\n const expressionAndOptions = item.split('?', 1)\n\n // 2. Let algorithm-expression be expression-and-options[0].\n const algorithmExpression = expressionAndOptions[0]\n\n // 3. Let base64-value be the empty string.\n let base64Value = ''\n\n // 4. Let algorithm-and-value be the result of splitting algorithm-expression on U+002D (-).\n const algorithmAndValue = [algorithmExpression.slice(0, 6), algorithmExpression.slice(7)]\n\n // 5. Let algorithm be algorithm-and-value[0].\n const algorithm = algorithmAndValue[0]\n\n // 6. If algorithm is not a valid SRI hash algorithm token, then continue.\n if (!isValidSRIHashAlgorithm(algorithm)) {\n continue\n }\n\n // 7. If algorithm-and-value[1] exists, set base64-value to\n // algorithm-and-value[1].\n if (algorithmAndValue[1]) {\n base64Value = algorithmAndValue[1]\n }\n\n // 8. Let metadata be the ordered map\n // «[\"alg\" → algorithm, \"val\" → base64-value]».\n const metadata = {\n alg: algorithm,\n val: base64Value\n }\n\n // 9. Append metadata to result.\n result.push(metadata)\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * Applies the specified hash algorithm to the given bytes\n *\n * @typedef {(algorithm: SRIHashAlgorithm, bytes: Uint8Array) => string} ApplyAlgorithmToBytes\n * @param {SRIHashAlgorithm} algorithm\n * @param {Uint8Array} bytes\n * @returns {string}\n */\nconst applyAlgorithmToBytes = (algorithm, bytes) => {\n return crypto.hash(algorithm, bytes, 'base64')\n}\n\n/**\n * Compares two base64 strings, allowing for base64url\n * in the second string.\n *\n * @param {string} actualValue base64 encoded string\n * @param {string} expectedValue base64 or base64url encoded string\n * @returns {boolean}\n */\nfunction caseSensitiveMatch (actualValue, expectedValue) {\n // Ignore padding characters from the end of the strings by\n // decreasing the length by 1 or 2 if the last characters are `=`.\n let actualValueLength = actualValue.length\n if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === '=') {\n actualValueLength -= 1\n }\n if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === '=') {\n actualValueLength -= 1\n }\n let expectedValueLength = expectedValue.length\n if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === '=') {\n expectedValueLength -= 1\n }\n if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === '=') {\n expectedValueLength -= 1\n }\n\n if (actualValueLength !== expectedValueLength) {\n return false\n }\n\n for (let i = 0; i < actualValueLength; ++i) {\n if (\n actualValue[i] === expectedValue[i] ||\n (actualValue[i] === '+' && expectedValue[i] === '-') ||\n (actualValue[i] === '/' && expectedValue[i] === '_')\n ) {\n continue\n }\n return false\n }\n\n return true\n}\n\nmodule.exports = {\n applyAlgorithmToBytes,\n bytesMatch,\n caseSensitiveMatch,\n isValidSRIHashAlgorithm,\n getStrongestMetadata,\n parseMetadata\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst {\n makeNetworkError,\n makeAppropriateNetworkError,\n filterResponse,\n makeResponse,\n fromInnerResponse,\n getResponseState\n} = require('./response')\nconst { HeadersList } = require('./headers')\nconst { Request, cloneRequest, getRequestDispatcher, getRequestState } = require('./request')\nconst zlib = require('node:zlib')\nconst {\n makePolicyContainer,\n clonePolicyContainer,\n requestBadPort,\n TAOCheck,\n appendRequestOriginHeader,\n responseLocationURL,\n requestCurrentURL,\n setRequestReferrerPolicyOnRedirect,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n createOpaqueTimingInfo,\n appendFetchMetadata,\n corsCheck,\n crossOriginResourcePolicyCheck,\n determineRequestsReferrer,\n coarsenedSharedCurrentTime,\n sameOrigin,\n isCancelled,\n isAborted,\n isErrorLike,\n fullyReadBody,\n readableStreamClose,\n urlIsLocal,\n urlIsHttpHttpsScheme,\n urlHasHttpsScheme,\n clampAndCoarsenConnectionTimingInfo,\n simpleRangeHeaderValue,\n buildContentRange,\n createInflate,\n extractMimeType,\n hasAuthenticationEntry,\n includesCredentials,\n isTraversableNavigable\n} = require('./util')\nconst assert = require('node:assert')\nconst { safelyExtractBody, extractBody } = require('./body')\nconst {\n redirectStatusSet,\n nullBodyStatus,\n safeMethodsSet,\n requestBodyHeader,\n subresourceSet\n} = require('./constants')\nconst EE = require('node:events')\nconst { Readable, pipeline, finished, isErrored, isReadable } = require('node:stream')\nconst { addAbortListener, bufferToLowerCasedHeaderName } = require('../../core/util')\nconst { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require('./data-url')\nconst { getGlobalDispatcher } = require('../../global')\nconst { webidl } = require('../webidl')\nconst { STATUS_CODES } = require('node:http')\nconst { bytesMatch } = require('../subresource-integrity/subresource-integrity')\nconst { isomorphicEncode } = require('../infra')\n\nconst GET_OR_HEAD = ['GET', 'HEAD']\n\nconst defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined'\n ? 'node'\n : 'undici'\n\n/** @type {import('buffer').resolveObjectURL} */\nlet resolveObjectURL\n\nclass Fetch extends EE {\n constructor (dispatcher) {\n super()\n\n this.dispatcher = dispatcher\n this.connection = null\n this.dump = false\n this.state = 'ongoing'\n }\n\n terminate (reason) {\n if (this.state !== 'ongoing') {\n return\n }\n\n this.state = 'terminated'\n this.connection?.destroy(reason)\n this.emit('terminated', reason)\n }\n\n // https://fetch.spec.whatwg.org/#fetch-controller-abort\n abort (error) {\n if (this.state !== 'ongoing') {\n return\n }\n\n // 1. Set controller’s state to \"aborted\".\n this.state = 'aborted'\n\n // 2. Let fallbackError be an \"AbortError\" DOMException.\n // 3. Set error to fallbackError if it is not given.\n if (!error) {\n error = new DOMException('The operation was aborted.', 'AbortError')\n }\n\n // 4. Let serializedError be StructuredSerialize(error).\n // If that threw an exception, catch it, and let\n // serializedError be StructuredSerialize(fallbackError).\n\n // 5. Set controller’s serialized abort reason to serializedError.\n this.serializedAbortReason = error\n\n this.connection?.destroy(error)\n this.emit('terminated', error)\n }\n}\n\nfunction handleFetchDone (response) {\n finalizeAndReportTiming(response, 'fetch')\n}\n\n// https://fetch.spec.whatwg.org/#fetch-method\nfunction fetch (input, init = undefined) {\n webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch')\n\n // 1. Let p be a new promise.\n let p = Promise.withResolvers()\n\n // 2. Let requestObject be the result of invoking the initial value of\n // Request as constructor with input and init as arguments. If this throws\n // an exception, reject p with it and return p.\n let requestObject\n\n try {\n requestObject = new Request(input, init)\n } catch (e) {\n p.reject(e)\n return p.promise\n }\n\n // 3. Let request be requestObject’s request.\n const request = getRequestState(requestObject)\n\n // 4. If requestObject’s signal’s aborted flag is set, then:\n if (requestObject.signal.aborted) {\n // 1. Abort the fetch() call with p, request, null, and\n // requestObject’s signal’s abort reason.\n abortFetch(p, request, null, requestObject.signal.reason, null)\n\n // 2. Return p.\n return p.promise\n }\n\n // 5. Let globalObject be request’s client’s global object.\n const globalObject = request.client.globalObject\n\n // 6. If globalObject is a ServiceWorkerGlobalScope object, then set\n // request’s service-workers mode to \"none\".\n if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') {\n request.serviceWorkers = 'none'\n }\n\n // 7. Let responseObject be null.\n let responseObject = null\n\n // 8. Let relevantRealm be this’s relevant Realm.\n\n // 9. Let locallyAborted be false.\n let locallyAborted = false\n\n // 10. Let controller be null.\n let controller = null\n\n // 11. Add the following abort steps to requestObject’s signal:\n addAbortListener(\n requestObject.signal,\n () => {\n // 1. Set locallyAborted to true.\n locallyAborted = true\n\n // 2. Assert: controller is non-null.\n assert(controller != null)\n\n // 3. Abort controller with requestObject’s signal’s abort reason.\n controller.abort(requestObject.signal.reason)\n\n const realResponse = responseObject?.deref()\n\n // 4. Abort the fetch() call with p, request, responseObject,\n // and requestObject’s signal’s abort reason.\n abortFetch(p, request, realResponse, requestObject.signal.reason, controller.controller)\n }\n )\n\n // 12. Let handleFetchDone given response response be to finalize and\n // report timing with response, globalObject, and \"fetch\".\n // see function handleFetchDone\n\n // 13. Set controller to the result of calling fetch given request,\n // with processResponseEndOfBody set to handleFetchDone, and processResponse\n // given response being these substeps:\n\n const processResponse = (response) => {\n // 1. If locallyAborted is true, terminate these substeps.\n if (locallyAborted) {\n return\n }\n\n // 2. If response’s aborted flag is set, then:\n if (response.aborted) {\n // 1. Let deserializedError be the result of deserialize a serialized\n // abort reason given controller’s serialized abort reason and\n // relevantRealm.\n\n // 2. Abort the fetch() call with p, request, responseObject, and\n // deserializedError.\n\n abortFetch(p, request, responseObject, controller.serializedAbortReason, controller.controller)\n return\n }\n\n // 3. If response is a network error, then reject p with a TypeError\n // and terminate these substeps.\n if (response.type === 'error') {\n p.reject(new TypeError('fetch failed', { cause: response.error }))\n return\n }\n\n // 4. Set responseObject to the result of creating a Response object,\n // given response, \"immutable\", and relevantRealm.\n responseObject = new WeakRef(fromInnerResponse(response, 'immutable'))\n\n // 5. Resolve p with responseObject.\n p.resolve(responseObject.deref())\n p = null\n }\n\n controller = fetching({\n request,\n processResponseEndOfBody: handleFetchDone,\n processResponse,\n dispatcher: getRequestDispatcher(requestObject), // undici\n // Keep requestObject alive to prevent its AbortController from being GC'd\n // See https://github.com/nodejs/undici/issues/4627\n requestObject\n })\n\n // 14. Return p.\n return p.promise\n}\n\n// https://fetch.spec.whatwg.org/#finalize-and-report-timing\nfunction finalizeAndReportTiming (response, initiatorType = 'other') {\n // 1. If response is an aborted network error, then return.\n if (response.type === 'error' && response.aborted) {\n return\n }\n\n // 2. If response’s URL list is null or empty, then return.\n if (!response.urlList?.length) {\n return\n }\n\n // 3. Let originalURL be response’s URL list[0].\n const originalURL = response.urlList[0]\n\n // 4. Let timingInfo be response’s timing info.\n let timingInfo = response.timingInfo\n\n // 5. Let cacheState be response’s cache state.\n let cacheState = response.cacheState\n\n // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return.\n if (!urlIsHttpHttpsScheme(originalURL)) {\n return\n }\n\n // 7. If timingInfo is null, then return.\n if (timingInfo === null) {\n return\n }\n\n // 8. If response’s timing allow passed flag is not set, then:\n if (!response.timingAllowPassed) {\n // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.\n timingInfo = createOpaqueTimingInfo({\n startTime: timingInfo.startTime\n })\n\n // 2. Set cacheState to the empty string.\n cacheState = ''\n }\n\n // 9. Set timingInfo’s end time to the coarsened shared current time\n // given global’s relevant settings object’s cross-origin isolated\n // capability.\n // TODO: given global’s relevant settings object’s cross-origin isolated\n // capability?\n timingInfo.endTime = coarsenedSharedCurrentTime()\n\n // 10. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 11. Mark resource timing for timingInfo, originalURL, initiatorType,\n // global, and cacheState.\n markResourceTiming(\n timingInfo,\n originalURL.href,\n initiatorType,\n globalThis,\n cacheState,\n '', // bodyType\n response.status\n )\n}\n\n// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing\nconst markResourceTiming = performance.markResourceTiming\n\n// https://fetch.spec.whatwg.org/#abort-fetch\nfunction abortFetch (p, request, responseObject, error, controller /* undici-specific */) {\n // 1. Reject promise with error.\n if (p) {\n // We might have already resolved the promise at this stage\n p.reject(error)\n }\n\n // 2. If request’s body is not null and is readable, then cancel request’s\n // body with error.\n if (request.body?.stream != null && isReadable(request.body.stream)) {\n request.body.stream.cancel(error).catch((err) => {\n if (err.code === 'ERR_INVALID_STATE') {\n // Node bug?\n return\n }\n throw err\n })\n }\n\n // 3. If responseObject is null, then return.\n if (responseObject == null) {\n return\n }\n\n // 4. Let response be responseObject’s response.\n const response = getResponseState(responseObject)\n\n // 5. If response’s body is not null and is readable, then error response’s\n // body with error.\n if (response.body?.stream != null && isReadable(response.body.stream)) {\n controller.error(error)\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetching\nfunction fetching ({\n request,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseEndOfBody,\n processResponseConsumeBody,\n useParallelQueue = false,\n dispatcher = getGlobalDispatcher(), // undici\n requestObject = null // Keep alive to prevent AbortController GC, see #4627\n}) {\n // Ensure that the dispatcher is set accordingly\n assert(dispatcher)\n\n // 1. Let taskDestination be null.\n let taskDestination = null\n\n // 2. Let crossOriginIsolatedCapability be false.\n let crossOriginIsolatedCapability = false\n\n // 3. If request’s client is non-null, then:\n if (request.client != null) {\n // 1. Set taskDestination to request’s client’s global object.\n taskDestination = request.client.globalObject\n\n // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin\n // isolated capability.\n crossOriginIsolatedCapability =\n request.client.crossOriginIsolatedCapability\n }\n\n // 4. If useParallelQueue is true, then set taskDestination to the result of\n // starting a new parallel queue.\n // TODO\n\n // 5. Let timingInfo be a new fetch timing info whose start time and\n // post-redirect start time are the coarsened shared current time given\n // crossOriginIsolatedCapability.\n const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability)\n const timingInfo = createOpaqueTimingInfo({\n startTime: currentTime\n })\n\n // 6. Let fetchParams be a new fetch params whose\n // request is request,\n // timing info is timingInfo,\n // process request body chunk length is processRequestBodyChunkLength,\n // process request end-of-body is processRequestEndOfBody,\n // process response is processResponse,\n // process response consume body is processResponseConsumeBody,\n // process response end-of-body is processResponseEndOfBody,\n // task destination is taskDestination,\n // and cross-origin isolated capability is crossOriginIsolatedCapability.\n const fetchParams = {\n controller: new Fetch(dispatcher),\n request,\n timingInfo,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseConsumeBody,\n processResponseEndOfBody,\n taskDestination,\n crossOriginIsolatedCapability,\n // Keep requestObject alive to prevent its AbortController from being GC'd\n requestObject\n }\n\n // 7. If request’s body is a byte sequence, then set request’s body to\n // request’s body as a body.\n // NOTE: Since fetching is only called from fetch, body should already be\n // extracted.\n assert(!request.body || request.body.stream)\n\n // 8. If request’s window is \"client\", then set request’s window to request’s\n // client, if request’s client’s global object is a Window object; otherwise\n // \"no-window\".\n if (request.window === 'client') {\n // TODO: What if request.client is null?\n request.window =\n request.client?.globalObject?.constructor?.name === 'Window'\n ? request.client\n : 'no-window'\n }\n\n // 9. If request’s origin is \"client\", then set request’s origin to request’s\n // client’s origin.\n if (request.origin === 'client') {\n request.origin = request.client.origin\n }\n\n // 10. If all of the following conditions are true:\n // TODO\n\n // 11. If request’s policy container is \"client\", then:\n if (request.policyContainer === 'client') {\n // 1. If request’s client is non-null, then set request’s policy\n // container to a clone of request’s client’s policy container. [HTML]\n if (request.client != null) {\n request.policyContainer = clonePolicyContainer(\n request.client.policyContainer\n )\n } else {\n // 2. Otherwise, set request’s policy container to a new policy\n // container.\n request.policyContainer = makePolicyContainer()\n }\n }\n\n // 12. If request’s header list does not contain `Accept`, then:\n if (!request.headersList.contains('accept', true)) {\n // 1. Let value be `*/*`.\n const value = '*/*'\n\n // 2. A user agent should set value to the first matching statement, if\n // any, switching on request’s destination:\n // \"document\"\n // \"frame\"\n // \"iframe\"\n // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`\n // \"image\"\n // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`\n // \"style\"\n // `text/css,*/*;q=0.1`\n // TODO\n\n // 3. Append `Accept`/value to request’s header list.\n request.headersList.append('accept', value, true)\n }\n\n // 13. If request’s header list does not contain `Accept-Language`, then\n // user agents should append `Accept-Language`/an appropriate value to\n // request’s header list.\n if (!request.headersList.contains('accept-language', true)) {\n request.headersList.append('accept-language', '*', true)\n }\n\n // 14. If request’s priority is null, then use request’s initiator and\n // destination appropriately in setting request’s priority to a\n // user-agent-defined object.\n if (request.priority === null) {\n // TODO\n }\n\n // 15. If request is a subresource request, then:\n if (subresourceSet.has(request.destination)) {\n // TODO\n }\n\n // 16. Run main fetch given fetchParams.\n mainFetch(fetchParams, false)\n\n // 17. Return fetchParam's controller\n return fetchParams.controller\n}\n\n// https://fetch.spec.whatwg.org/#concept-main-fetch\nasync function mainFetch (fetchParams, recursive) {\n try {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. If request’s local-URLs-only flag is set and request’s current URL is\n // not local, then set response to a network error.\n if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {\n response = makeNetworkError('local URLs only')\n }\n\n // 4. Run report Content Security Policy violations for request.\n // TODO\n\n // 5. Upgrade request to a potentially trustworthy URL, if appropriate.\n tryUpgradeRequestToAPotentiallyTrustworthyURL(request)\n\n // 6. If should request be blocked due to a bad port, should fetching request\n // be blocked as mixed content, or should request be blocked by Content\n // Security Policy returns blocked, then set response to a network error.\n if (requestBadPort(request) === 'blocked') {\n response = makeNetworkError('bad port')\n }\n // TODO: should fetching request be blocked as mixed content?\n // TODO: should request be blocked by Content Security Policy?\n\n // 7. If request’s referrer policy is the empty string, then set request’s\n // referrer policy to request’s policy container’s referrer policy.\n if (request.referrerPolicy === '') {\n request.referrerPolicy = request.policyContainer.referrerPolicy\n }\n\n // 8. If request’s referrer is not \"no-referrer\", then set request’s\n // referrer to the result of invoking determine request’s referrer.\n if (request.referrer !== 'no-referrer') {\n request.referrer = determineRequestsReferrer(request)\n }\n\n // 9. Set request’s current URL’s scheme to \"https\" if all of the following\n // conditions are true:\n // - request’s current URL’s scheme is \"http\"\n // - request’s current URL’s host is a domain\n // - Matching request’s current URL’s host per Known HSTS Host Domain Name\n // Matching results in either a superdomain match with an asserted\n // includeSubDomains directive or a congruent match (with or without an\n // asserted includeSubDomains directive). [HSTS]\n // TODO\n\n // 10. If recursive is false, then run the remaining steps in parallel.\n // TODO\n\n // 11. If response is null, then set response to the result of running\n // the steps corresponding to the first matching statement:\n if (response === null) {\n const currentURL = requestCurrentURL(request)\n if (\n // - request’s current URL’s origin is same origin with request’s origin,\n // and request’s response tainting is \"basic\"\n (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||\n // request’s current URL’s scheme is \"data\"\n (currentURL.protocol === 'data:') ||\n // - request’s mode is \"navigate\" or \"websocket\"\n (request.mode === 'navigate' || request.mode === 'websocket')\n ) {\n // 1. Set request’s response tainting to \"basic\".\n request.responseTainting = 'basic'\n\n // 2. Return the result of running scheme fetch given fetchParams.\n response = await schemeFetch(fetchParams)\n\n // request’s mode is \"same-origin\"\n } else if (request.mode === 'same-origin') {\n // 1. Return a network error.\n response = makeNetworkError('request mode cannot be \"same-origin\"')\n\n // request’s mode is \"no-cors\"\n } else if (request.mode === 'no-cors') {\n // 1. If request’s redirect mode is not \"follow\", then return a network\n // error.\n if (request.redirect !== 'follow') {\n response = makeNetworkError(\n 'redirect mode cannot be \"follow\" for \"no-cors\" request'\n )\n } else {\n // 2. Set request’s response tainting to \"opaque\".\n request.responseTainting = 'opaque'\n\n // 3. Return the result of running scheme fetch given fetchParams.\n response = await schemeFetch(fetchParams)\n }\n // request’s current URL’s scheme is not an HTTP(S) scheme\n } else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {\n // Return a network error.\n response = makeNetworkError('URL scheme must be a HTTP(S) scheme')\n\n // - request’s use-CORS-preflight flag is set\n // - request’s unsafe-request flag is set and either request’s method is\n // not a CORS-safelisted method or CORS-unsafe request-header names with\n // request’s header list is not empty\n // 1. Set request’s response tainting to \"cors\".\n // 2. Let corsWithPreflightResponse be the result of running HTTP fetch\n // given fetchParams and true.\n // 3. If corsWithPreflightResponse is a network error, then clear cache\n // entries using request.\n // 4. Return corsWithPreflightResponse.\n // TODO\n\n // Otherwise\n } else {\n // 1. Set request’s response tainting to \"cors\".\n request.responseTainting = 'cors'\n\n // 2. Return the result of running HTTP fetch given fetchParams.\n response = await httpFetch(fetchParams)\n }\n }\n\n // 12. If recursive is true, then return response.\n if (recursive) {\n return response\n }\n\n // 13. If response is not a network error and response is not a filtered\n // response, then:\n if (response.status !== 0 && !response.internalResponse) {\n // If request’s response tainting is \"cors\", then:\n if (request.responseTainting === 'cors') {\n // 1. Let headerNames be the result of extracting header list values\n // given `Access-Control-Expose-Headers` and response’s header list.\n // TODO\n // 2. If request’s credentials mode is not \"include\" and headerNames\n // contains `*`, then set response’s CORS-exposed header-name list to\n // all unique header names in response’s header list.\n // TODO\n // 3. Otherwise, if headerNames is not null or failure, then set\n // response’s CORS-exposed header-name list to headerNames.\n // TODO\n }\n\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (request.responseTainting === 'basic') {\n response = filterResponse(response, 'basic')\n } else if (request.responseTainting === 'cors') {\n response = filterResponse(response, 'cors')\n } else if (request.responseTainting === 'opaque') {\n response = filterResponse(response, 'opaque')\n } else {\n assert(false)\n }\n }\n\n // 14. Let internalResponse be response, if response is a network error,\n // and response’s internal response otherwise.\n let internalResponse =\n response.status === 0 ? response : response.internalResponse\n\n // 15. If internalResponse’s URL list is empty, then set it to a clone of\n // request’s URL list.\n if (internalResponse.urlList.length === 0) {\n internalResponse.urlList.push(...request.urlList)\n }\n\n // 16. If request’s timing allow failed flag is unset, then set\n // internalResponse’s timing allow passed flag.\n if (!request.timingAllowFailed) {\n response.timingAllowPassed = true\n }\n\n // 17. If response is not a network error and any of the following returns\n // blocked\n // - should internalResponse to request be blocked as mixed content\n // - should internalResponse to request be blocked by Content Security Policy\n // - should internalResponse to request be blocked due to its MIME type\n // - should internalResponse to request be blocked due to nosniff\n // TODO\n\n // 18. If response’s type is \"opaque\", internalResponse’s status is 206,\n // internalResponse’s range-requested flag is set, and request’s header\n // list does not contain `Range`, then set response and internalResponse\n // to a network error.\n if (\n response.type === 'opaque' &&\n internalResponse.status === 206 &&\n internalResponse.rangeRequested &&\n !request.headers.contains('range', true)\n ) {\n response = internalResponse = makeNetworkError()\n }\n\n // 19. If response is not a network error and either request’s method is\n // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,\n // set internalResponse’s body to null and disregard any enqueuing toward\n // it (if any).\n if (\n response.status !== 0 &&\n (request.method === 'HEAD' ||\n request.method === 'CONNECT' ||\n nullBodyStatus.includes(internalResponse.status))\n ) {\n internalResponse.body = null\n fetchParams.controller.dump = true\n }\n\n // 20. If request’s integrity metadata is not the empty string, then:\n if (request.integrity) {\n // 1. Let processBodyError be this step: run fetch finale given fetchParams\n // and a network error.\n const processBodyError = (reason) =>\n fetchFinale(fetchParams, makeNetworkError(reason))\n\n // 2. If request’s response tainting is \"opaque\", or response’s body is null,\n // then run processBodyError and abort these steps.\n if (request.responseTainting === 'opaque' || response.body == null) {\n processBodyError(response.error)\n return\n }\n\n // 3. Let processBody given bytes be these steps:\n const processBody = (bytes) => {\n // 1. If bytes do not match request’s integrity metadata,\n // then run processBodyError and abort these steps. [SRI]\n if (!bytesMatch(bytes, request.integrity)) {\n processBodyError('integrity mismatch')\n return\n }\n\n // 2. Set response’s body to bytes as a body.\n response.body = safelyExtractBody(bytes)[0]\n\n // 3. Run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n\n // 4. Fully read response’s body given processBody and processBodyError.\n fullyReadBody(response.body, processBody, processBodyError)\n } else {\n // 21. Otherwise, run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n } catch (err) {\n fetchParams.controller.terminate(err)\n }\n}\n\n// https://fetch.spec.whatwg.org/#concept-scheme-fetch\n// given a fetch params fetchParams\nfunction schemeFetch (fetchParams) {\n // Note: since the connection is destroyed on redirect, which sets fetchParams to a\n // cancelled state, we do not want this condition to trigger *unless* there have been\n // no redirects. See https://github.com/nodejs/undici/issues/1776\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {\n return Promise.resolve(makeAppropriateNetworkError(fetchParams))\n }\n\n // 2. Let request be fetchParams’s request.\n const { request } = fetchParams\n\n const { protocol: scheme } = requestCurrentURL(request)\n\n // 3. Switch on request’s current URL’s scheme and run the associated steps:\n switch (scheme) {\n case 'about:': {\n // If request’s current URL’s path is the string \"blank\", then return a new response\n // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) »,\n // and body is the empty byte sequence as a body.\n\n // Otherwise, return a network error.\n return Promise.resolve(makeNetworkError('about scheme is not supported'))\n }\n case 'blob:': {\n if (!resolveObjectURL) {\n resolveObjectURL = require('node:buffer').resolveObjectURL\n }\n\n // 1. Let blobURLEntry be request’s current URL’s blob URL entry.\n const blobURLEntry = requestCurrentURL(request)\n\n // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56\n // Buffer.resolveObjectURL does not ignore URL queries.\n if (blobURLEntry.search.length !== 0) {\n return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))\n }\n\n const blob = resolveObjectURL(blobURLEntry.toString())\n\n // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s\n // object is not a Blob object, then return a network error.\n if (request.method !== 'GET' || !webidl.is.Blob(blob)) {\n return Promise.resolve(makeNetworkError('invalid method'))\n }\n\n // 3. Let blob be blobURLEntry’s object.\n // Note: done above\n\n // 4. Let response be a new response.\n const response = makeResponse()\n\n // 5. Let fullLength be blob’s size.\n const fullLength = blob.size\n\n // 6. Let serializedFullLength be fullLength, serialized and isomorphic encoded.\n const serializedFullLength = isomorphicEncode(`${fullLength}`)\n\n // 7. Let type be blob’s type.\n const type = blob.type\n\n // 8. If request’s header list does not contain `Range`:\n // 9. Otherwise:\n if (!request.headersList.contains('range', true)) {\n // 1. Let bodyWithType be the result of safely extracting blob.\n // Note: in the FileAPI a blob \"object\" is a Blob *or* a MediaSource.\n // In node, this can only ever be a Blob. Therefore we can safely\n // use extractBody directly.\n const bodyWithType = extractBody(blob)\n\n // 2. Set response’s status message to `OK`.\n response.statusText = 'OK'\n\n // 3. Set response’s body to bodyWithType’s body.\n response.body = bodyWithType[0]\n\n // 4. Set response’s header list to « (`Content-Length`, serializedFullLength), (`Content-Type`, type) ».\n response.headersList.set('content-length', serializedFullLength, true)\n response.headersList.set('content-type', type, true)\n } else {\n // 1. Set response’s range-requested flag.\n response.rangeRequested = true\n\n // 2. Let rangeHeader be the result of getting `Range` from request’s header list.\n const rangeHeader = request.headersList.get('range', true)\n\n // 3. Let rangeValue be the result of parsing a single range header value given rangeHeader and true.\n const rangeValue = simpleRangeHeaderValue(rangeHeader, true)\n\n // 4. If rangeValue is failure, then return a network error.\n if (rangeValue === 'failure') {\n return Promise.resolve(makeNetworkError('failed to fetch the data URL'))\n }\n\n // 5. Let (rangeStart, rangeEnd) be rangeValue.\n let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue\n\n // 6. If rangeStart is null:\n // 7. Otherwise:\n if (rangeStart === null) {\n // 1. Set rangeStart to fullLength − rangeEnd.\n rangeStart = fullLength - rangeEnd\n\n // 2. Set rangeEnd to rangeStart + rangeEnd − 1.\n rangeEnd = rangeStart + rangeEnd - 1\n } else {\n // 1. If rangeStart is greater than or equal to fullLength, then return a network error.\n if (rangeStart >= fullLength) {\n return Promise.resolve(makeNetworkError('Range start is greater than the blob\\'s size.'))\n }\n\n // 2. If rangeEnd is null or rangeEnd is greater than or equal to fullLength, then set\n // rangeEnd to fullLength − 1.\n if (rangeEnd === null || rangeEnd >= fullLength) {\n rangeEnd = fullLength - 1\n }\n }\n\n // 8. Let slicedBlob be the result of invoking slice blob given blob, rangeStart,\n // rangeEnd + 1, and type.\n const slicedBlob = blob.slice(rangeStart, rangeEnd + 1, type)\n\n // 9. Let slicedBodyWithType be the result of safely extracting slicedBlob.\n // Note: same reason as mentioned above as to why we use extractBody\n const slicedBodyWithType = extractBody(slicedBlob)\n\n // 10. Set response’s body to slicedBodyWithType’s body.\n response.body = slicedBodyWithType[0]\n\n // 11. Let serializedSlicedLength be slicedBlob’s size, serialized and isomorphic encoded.\n const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`)\n\n // 12. Let contentRange be the result of invoking build a content range given rangeStart,\n // rangeEnd, and fullLength.\n const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength)\n\n // 13. Set response’s status to 206.\n response.status = 206\n\n // 14. Set response’s status message to `Partial Content`.\n response.statusText = 'Partial Content'\n\n // 15. Set response’s header list to « (`Content-Length`, serializedSlicedLength),\n // (`Content-Type`, type), (`Content-Range`, contentRange) ».\n response.headersList.set('content-length', serializedSlicedLength, true)\n response.headersList.set('content-type', type, true)\n response.headersList.set('content-range', contentRange, true)\n }\n\n // 10. Return response.\n return Promise.resolve(response)\n }\n case 'data:': {\n // 1. Let dataURLStruct be the result of running the\n // data: URL processor on request’s current URL.\n const currentURL = requestCurrentURL(request)\n const dataURLStruct = dataURLProcessor(currentURL)\n\n // 2. If dataURLStruct is failure, then return a\n // network error.\n if (dataURLStruct === 'failure') {\n return Promise.resolve(makeNetworkError('failed to fetch the data URL'))\n }\n\n // 3. Let mimeType be dataURLStruct’s MIME type, serialized.\n const mimeType = serializeAMimeType(dataURLStruct.mimeType)\n\n // 4. Return a response whose status message is `OK`,\n // header list is « (`Content-Type`, mimeType) »,\n // and body is dataURLStruct’s body as a body.\n return Promise.resolve(makeResponse({\n statusText: 'OK',\n headersList: [\n ['content-type', { name: 'Content-Type', value: mimeType }]\n ],\n body: safelyExtractBody(dataURLStruct.body)[0]\n }))\n }\n case 'file:': {\n // For now, unfortunate as it is, file URLs are left as an exercise for the reader.\n // When in doubt, return a network error.\n return Promise.resolve(makeNetworkError('not implemented... yet...'))\n }\n case 'http:':\n case 'https:': {\n // Return the result of running HTTP fetch given fetchParams.\n\n return httpFetch(fetchParams)\n .catch((err) => makeNetworkError(err))\n }\n default: {\n return Promise.resolve(makeNetworkError('unknown scheme'))\n }\n }\n}\n\n// https://fetch.spec.whatwg.org/#finalize-response\nfunction finalizeResponse (fetchParams, response) {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // 2, If fetchParams’s process response done is not null, then queue a fetch\n // task to run fetchParams’s process response done given response, with\n // fetchParams’s task destination.\n if (fetchParams.processResponseDone != null) {\n queueMicrotask(() => fetchParams.processResponseDone(response))\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetch-finale\nfunction fetchFinale (fetchParams, response) {\n // 1. Let timingInfo be fetchParams’s timing info.\n let timingInfo = fetchParams.timingInfo\n\n // 2. If response is not a network error and fetchParams’s request’s client is a secure context,\n // then set timingInfo’s server-timing headers to the result of getting, decoding, and splitting\n // `Server-Timing` from response’s internal response’s header list.\n // TODO\n\n // 3. Let processResponseEndOfBody be the following steps:\n const processResponseEndOfBody = () => {\n // 1. Let unsafeEndTime be the unsafe shared current time.\n const unsafeEndTime = Date.now() // ?\n\n // 2. If fetchParams’s request’s destination is \"document\", then set fetchParams’s controller’s\n // full timing info to fetchParams’s timing info.\n if (fetchParams.request.destination === 'document') {\n fetchParams.controller.fullTimingInfo = timingInfo\n }\n\n // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global:\n fetchParams.controller.reportTimingSteps = () => {\n // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return.\n if (!urlIsHttpHttpsScheme(fetchParams.request.url)) {\n return\n }\n\n // 2. Set timingInfo’s end time to the relative high resolution time given unsafeEndTime and global.\n timingInfo.endTime = unsafeEndTime\n\n // 3. Let cacheState be response’s cache state.\n let cacheState = response.cacheState\n\n // 4. Let bodyInfo be response’s body info.\n const bodyInfo = response.bodyInfo\n\n // 5. If response’s timing allow passed flag is not set, then set timingInfo to the result of creating an\n // opaque timing info for timingInfo and set cacheState to the empty string.\n if (!response.timingAllowPassed) {\n timingInfo = createOpaqueTimingInfo(timingInfo)\n\n cacheState = ''\n }\n\n // 6. Let responseStatus be 0.\n let responseStatus = 0\n\n // 7. If fetchParams’s request’s mode is not \"navigate\" or response’s has-cross-origin-redirects is false:\n if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) {\n // 1. Set responseStatus to response’s status.\n responseStatus = response.status\n\n // 2. Let mimeType be the result of extracting a MIME type from response’s header list.\n const mimeType = extractMimeType(response.headersList)\n\n // 3. If mimeType is not failure, then set bodyInfo’s content type to the result of minimizing a supported MIME type given mimeType.\n if (mimeType !== 'failure') {\n bodyInfo.contentType = minimizeSupportedMimeType(mimeType)\n }\n }\n\n // 8. If fetchParams’s request’s initiator type is non-null, then mark resource timing given timingInfo,\n // fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo,\n // and responseStatus.\n if (fetchParams.request.initiatorType != null) {\n markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus)\n }\n }\n\n // 4. Let processResponseEndOfBodyTask be the following steps:\n const processResponseEndOfBodyTask = () => {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // 2. If fetchParams’s process response end-of-body is non-null, then run fetchParams’s process\n // response end-of-body given response.\n if (fetchParams.processResponseEndOfBody != null) {\n queueMicrotask(() => fetchParams.processResponseEndOfBody(response))\n }\n\n // 3. If fetchParams’s request’s initiator type is non-null and fetchParams’s request’s client’s\n // global object is fetchParams’s task destination, then run fetchParams’s controller’s report\n // timing steps given fetchParams’s request’s client’s global object.\n if (fetchParams.request.initiatorType != null) {\n fetchParams.controller.reportTimingSteps()\n }\n }\n\n // 5. Queue a fetch task to run processResponseEndOfBodyTask with fetchParams’s task destination\n queueMicrotask(() => processResponseEndOfBodyTask())\n }\n\n // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s\n // process response given response, with fetchParams’s task destination.\n if (fetchParams.processResponse != null) {\n queueMicrotask(() => {\n fetchParams.processResponse(response)\n fetchParams.processResponse = null\n })\n }\n\n // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response.\n const internalResponse = response.type === 'error' ? response : (response.internalResponse ?? response)\n\n // 6. If internalResponse’s body is null, then run processResponseEndOfBody.\n // 7. Otherwise:\n if (internalResponse.body == null) {\n processResponseEndOfBody()\n } else {\n // mcollina: all the following steps of the specs are skipped.\n // The internal transform stream is not needed.\n // See https://github.com/nodejs/undici/pull/3093#issuecomment-2050198541\n\n // 1. Let transformStream be a new TransformStream.\n // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, enqueues chunk in transformStream.\n // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm\n // set to processResponseEndOfBody.\n // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream.\n\n finished(internalResponse.body.stream, () => {\n processResponseEndOfBody()\n })\n }\n}\n\n// https://fetch.spec.whatwg.org/#http-fetch\nasync function httpFetch (fetchParams) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let actualResponse be null.\n let actualResponse = null\n\n // 4. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 5. If request’s service-workers mode is \"all\", then:\n if (request.serviceWorkers === 'all') {\n // TODO\n }\n\n // 6. If response is null, then:\n if (response === null) {\n // 1. If makeCORSPreflight is true and one of these conditions is true:\n // TODO\n\n // 2. If request’s redirect mode is \"follow\", then set request’s\n // service-workers mode to \"none\".\n if (request.redirect === 'follow') {\n request.serviceWorkers = 'none'\n }\n\n // 3. Set response and actualResponse to the result of running\n // HTTP-network-or-cache fetch given fetchParams.\n actualResponse = response = await httpNetworkOrCacheFetch(fetchParams)\n\n // 4. If request’s response tainting is \"cors\" and a CORS check\n // for request and response returns failure, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n corsCheck(request, response) === 'failure'\n ) {\n return makeNetworkError('cors failure')\n }\n\n // 5. If the TAO check for request and response returns failure, then set\n // request’s timing allow failed flag.\n if (TAOCheck(request, response) === 'failure') {\n request.timingAllowFailed = true\n }\n }\n\n // 7. If either request’s response tainting or response’s type\n // is \"opaque\", and the cross-origin resource policy check with\n // request’s origin, request’s client, request’s destination,\n // and actualResponse returns blocked, then return a network error.\n if (\n (request.responseTainting === 'opaque' || response.type === 'opaque') &&\n crossOriginResourcePolicyCheck(\n request.origin,\n request.client,\n request.destination,\n actualResponse\n ) === 'blocked'\n ) {\n return makeNetworkError('blocked')\n }\n\n // 8. If actualResponse’s status is a redirect status, then:\n if (redirectStatusSet.has(actualResponse.status)) {\n // 1. If actualResponse’s status is not 303, request’s body is not null,\n // and the connection uses HTTP/2, then user agents may, and are even\n // encouraged to, transmit an RST_STREAM frame.\n // See, https://github.com/whatwg/fetch/issues/1288\n if (request.redirect !== 'manual') {\n fetchParams.controller.connection.destroy(undefined, false)\n }\n\n // 2. Switch on request’s redirect mode:\n if (request.redirect === 'error') {\n // Set response to a network error.\n response = makeNetworkError('unexpected redirect')\n } else if (request.redirect === 'manual') {\n // Set response to an opaque-redirect filtered response whose internal\n // response is actualResponse.\n // NOTE(spec): On the web this would return an `opaqueredirect` response,\n // but that doesn't make sense server side.\n // See https://github.com/nodejs/undici/issues/1193.\n response = actualResponse\n } else if (request.redirect === 'follow') {\n // Set response to the result of running HTTP-redirect fetch given\n // fetchParams and response.\n response = await httpRedirectFetch(fetchParams, response)\n } else {\n assert(false)\n }\n }\n\n // 9. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 10. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-redirect-fetch\nfunction httpRedirectFetch (fetchParams, response) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let actualResponse be response, if response is not a filtered response,\n // and response’s internal response otherwise.\n const actualResponse = response.internalResponse\n ? response.internalResponse\n : response\n\n // 3. Let locationURL be actualResponse’s location URL given request’s current\n // URL’s fragment.\n let locationURL\n\n try {\n locationURL = responseLocationURL(\n actualResponse,\n requestCurrentURL(request).hash\n )\n\n // 4. If locationURL is null, then return response.\n if (locationURL == null) {\n return response\n }\n } catch (err) {\n // 5. If locationURL is failure, then return a network error.\n return Promise.resolve(makeNetworkError(err))\n }\n\n // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network\n // error.\n if (!urlIsHttpHttpsScheme(locationURL)) {\n return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))\n }\n\n // 7. If request’s redirect count is 20, then return a network error.\n if (request.redirectCount === 20) {\n return Promise.resolve(makeNetworkError('redirect count exceeded'))\n }\n\n // 8. Increase request’s redirect count by 1.\n request.redirectCount += 1\n\n // 9. If request’s mode is \"cors\", locationURL includes credentials, and\n // request’s origin is not same origin with locationURL’s origin, then return\n // a network error.\n if (\n request.mode === 'cors' &&\n (locationURL.username || locationURL.password) &&\n !sameOrigin(request, locationURL)\n ) {\n return Promise.resolve(makeNetworkError('cross origin not allowed for request mode \"cors\"'))\n }\n\n // 10. If request’s response tainting is \"cors\" and locationURL includes\n // credentials, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n (locationURL.username || locationURL.password)\n ) {\n return Promise.resolve(makeNetworkError(\n 'URL cannot contain credentials for request mode \"cors\"'\n ))\n }\n\n // 11. If actualResponse’s status is not 303, request’s body is non-null,\n // and request’s body’s source is null, then return a network error.\n if (\n actualResponse.status !== 303 &&\n request.body != null &&\n request.body.source == null\n ) {\n return Promise.resolve(makeNetworkError())\n }\n\n // 12. If one of the following is true\n // - actualResponse’s status is 301 or 302 and request’s method is `POST`\n // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD`\n if (\n ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||\n (actualResponse.status === 303 &&\n !GET_OR_HEAD.includes(request.method))\n ) {\n // then:\n // 1. Set request’s method to `GET` and request’s body to null.\n request.method = 'GET'\n request.body = null\n\n // 2. For each headerName of request-body-header name, delete headerName from\n // request’s header list.\n for (const headerName of requestBodyHeader) {\n request.headersList.delete(headerName)\n }\n }\n\n // 13. If request’s current URL’s origin is not same origin with locationURL’s\n // origin, then for each headerName of CORS non-wildcard request-header name,\n // delete headerName from request’s header list.\n if (!sameOrigin(requestCurrentURL(request), locationURL)) {\n // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name\n request.headersList.delete('authorization', true)\n\n // https://fetch.spec.whatwg.org/#authentication-entries\n request.headersList.delete('proxy-authorization', true)\n\n // \"Cookie\" and \"Host\" are forbidden request-headers, which undici doesn't implement.\n request.headersList.delete('cookie', true)\n request.headersList.delete('host', true)\n }\n\n // 14. If request's body is non-null, then set request's body to the first return\n // value of safely extracting request's body's source.\n if (request.body != null) {\n assert(request.body.source != null)\n request.body = safelyExtractBody(request.body.source)[0]\n }\n\n // 15. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 16. Set timingInfo’s redirect end time and post-redirect start time to the\n // coarsened shared current time given fetchParams’s cross-origin isolated\n // capability.\n timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =\n coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n\n // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s\n // redirect start time to timingInfo’s start time.\n if (timingInfo.redirectStartTime === 0) {\n timingInfo.redirectStartTime = timingInfo.startTime\n }\n\n // 18. Append locationURL to request’s URL list.\n request.urlList.push(locationURL)\n\n // 19. Invoke set request’s referrer policy on redirect on request and\n // actualResponse.\n setRequestReferrerPolicyOnRedirect(request, actualResponse)\n\n // 20. Return the result of running main fetch given fetchParams and true.\n return mainFetch(fetchParams, true)\n}\n\n// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch\nasync function httpNetworkOrCacheFetch (\n fetchParams,\n isAuthenticationFetch = false,\n isNewConnectionFetch = false\n) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let httpFetchParams be null.\n let httpFetchParams = null\n\n // 3. Let httpRequest be null.\n let httpRequest = null\n\n // 4. Let response be null.\n let response = null\n\n // 5. Let storedResponse be null.\n // TODO: cache\n\n // 6. Let httpCache be null.\n const httpCache = null\n\n // 7. Let the revalidatingFlag be unset.\n const revalidatingFlag = false\n\n // 8. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If request’s window is \"no-window\" and request’s redirect mode is\n // \"error\", then set httpFetchParams to fetchParams and httpRequest to\n // request.\n if (request.window === 'no-window' && request.redirect === 'error') {\n httpFetchParams = fetchParams\n httpRequest = request\n } else {\n // Otherwise:\n\n // 1. Set httpRequest to a clone of request.\n httpRequest = cloneRequest(request)\n\n // 2. Set httpFetchParams to a copy of fetchParams.\n httpFetchParams = { ...fetchParams }\n\n // 3. Set httpFetchParams’s request to httpRequest.\n httpFetchParams.request = httpRequest\n }\n\n // 3. Let includeCredentials be true if one of\n const includeCredentials =\n request.credentials === 'include' ||\n (request.credentials === 'same-origin' &&\n request.responseTainting === 'basic')\n\n // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s\n // body is non-null; otherwise null.\n const contentLength = httpRequest.body ? httpRequest.body.length : null\n\n // 5. Let contentLengthHeaderValue be null.\n let contentLengthHeaderValue = null\n\n // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or\n // `PUT`, then set contentLengthHeaderValue to `0`.\n if (\n httpRequest.body == null &&\n ['POST', 'PUT'].includes(httpRequest.method)\n ) {\n contentLengthHeaderValue = '0'\n }\n\n // 7. If contentLength is non-null, then set contentLengthHeaderValue to\n // contentLength, serialized and isomorphic encoded.\n if (contentLength != null) {\n contentLengthHeaderValue = isomorphicEncode(`${contentLength}`)\n }\n\n // 8. If contentLengthHeaderValue is non-null, then append\n // `Content-Length`/contentLengthHeaderValue to httpRequest’s header\n // list.\n if (contentLengthHeaderValue != null) {\n httpRequest.headersList.append('content-length', contentLengthHeaderValue, true)\n }\n\n // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`,\n // contentLengthHeaderValue) to httpRequest’s header list.\n\n // 10. If contentLength is non-null and httpRequest’s keepalive is true,\n // then:\n if (contentLength != null && httpRequest.keepalive) {\n // NOTE: keepalive is a noop outside of browser context.\n }\n\n // 11. If httpRequest’s referrer is a URL, then append\n // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded,\n // to httpRequest’s header list.\n if (webidl.is.URL(httpRequest.referrer)) {\n httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true)\n }\n\n // 12. Append a request `Origin` header for httpRequest.\n appendRequestOriginHeader(httpRequest)\n\n // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA]\n appendFetchMetadata(httpRequest)\n\n // 14. If httpRequest’s header list does not contain `User-Agent`, then\n // user agents should append `User-Agent`/default `User-Agent` value to\n // httpRequest’s header list.\n if (!httpRequest.headersList.contains('user-agent', true)) {\n httpRequest.headersList.append('user-agent', defaultUserAgent, true)\n }\n\n // 15. If httpRequest’s cache mode is \"default\" and httpRequest’s header\n // list contains `If-Modified-Since`, `If-None-Match`,\n // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set\n // httpRequest’s cache mode to \"no-store\".\n if (\n httpRequest.cache === 'default' &&\n (httpRequest.headersList.contains('if-modified-since', true) ||\n httpRequest.headersList.contains('if-none-match', true) ||\n httpRequest.headersList.contains('if-unmodified-since', true) ||\n httpRequest.headersList.contains('if-match', true) ||\n httpRequest.headersList.contains('if-range', true))\n ) {\n httpRequest.cache = 'no-store'\n }\n\n // 16. If httpRequest’s cache mode is \"no-cache\", httpRequest’s prevent\n // no-cache cache-control header modification flag is unset, and\n // httpRequest’s header list does not contain `Cache-Control`, then append\n // `Cache-Control`/`max-age=0` to httpRequest’s header list.\n if (\n httpRequest.cache === 'no-cache' &&\n !httpRequest.preventNoCacheCacheControlHeaderModification &&\n !httpRequest.headersList.contains('cache-control', true)\n ) {\n httpRequest.headersList.append('cache-control', 'max-age=0', true)\n }\n\n // 17. If httpRequest’s cache mode is \"no-store\" or \"reload\", then:\n if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') {\n // 1. If httpRequest’s header list does not contain `Pragma`, then append\n // `Pragma`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('pragma', true)) {\n httpRequest.headersList.append('pragma', 'no-cache', true)\n }\n\n // 2. If httpRequest’s header list does not contain `Cache-Control`,\n // then append `Cache-Control`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('cache-control', true)) {\n httpRequest.headersList.append('cache-control', 'no-cache', true)\n }\n }\n\n // 18. If httpRequest’s header list contains `Range`, then append\n // `Accept-Encoding`/`identity` to httpRequest’s header list.\n if (httpRequest.headersList.contains('range', true)) {\n httpRequest.headersList.append('accept-encoding', 'identity', true)\n }\n\n // 19. Modify httpRequest’s header list per HTTP. Do not append a given\n // header if httpRequest’s header list contains that header’s name.\n // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129\n if (!httpRequest.headersList.contains('accept-encoding', true)) {\n if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {\n httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true)\n } else {\n httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true)\n }\n }\n\n httpRequest.headersList.delete('host', true)\n\n // 21. If includeCredentials is true, then:\n if (includeCredentials) {\n // 1. If the user agent is not configured to block cookies for httpRequest\n // (see section 7 of [COOKIES]), then:\n // TODO: credentials\n\n // 2. If httpRequest’s header list does not contain `Authorization`, then:\n if (!httpRequest.headersList.contains('authorization', true)) {\n // 1. Let authorizationValue be null.\n let authorizationValue = null\n\n // 2. If there’s an authentication entry for httpRequest and either\n // httpRequest’s use-URL-credentials flag is unset or httpRequest’s\n // current URL does not include credentials, then set\n // authorizationValue to authentication entry.\n if (hasAuthenticationEntry(httpRequest) && (\n httpRequest.useURLCredentials === undefined || !includesCredentials(requestCurrentURL(httpRequest))\n )) {\n // TODO\n } else if (includesCredentials(requestCurrentURL(httpRequest)) && isAuthenticationFetch) {\n // 3. Otherwise, if httpRequest’s current URL does include credentials\n // and isAuthenticationFetch is true, set authorizationValue to\n // httpRequest’s current URL, converted to an `Authorization` value\n const { username, password } = requestCurrentURL(httpRequest)\n authorizationValue = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`\n }\n\n // 4. If authorizationValue is non-null, then append (`Authorization`,\n // authorizationValue) to httpRequest’s header list.\n if (authorizationValue !== null) {\n httpRequest.headersList.append('Authorization', authorizationValue, false)\n }\n }\n }\n\n // 21. If there’s a proxy-authentication entry, use it as appropriate.\n // TODO: proxy-authentication\n\n // 22. Set httpCache to the result of determining the HTTP cache\n // partition, given httpRequest.\n // TODO: cache\n\n // 23. If httpCache is null, then set httpRequest’s cache mode to\n // \"no-store\".\n if (httpCache == null) {\n httpRequest.cache = 'no-store'\n }\n\n // 24. If httpRequest’s cache mode is neither \"no-store\" nor \"reload\",\n // then:\n if (httpRequest.cache !== 'no-store' && httpRequest.cache !== 'reload') {\n // TODO: cache\n }\n\n // 9. If aborted, then return the appropriate network error for fetchParams.\n // TODO\n\n // 10. If response is null, then:\n if (response == null) {\n // 1. If httpRequest’s cache mode is \"only-if-cached\", then return a\n // network error.\n if (httpRequest.cache === 'only-if-cached') {\n return makeNetworkError('only if cached')\n }\n\n // 2. Let forwardResponse be the result of running HTTP-network fetch\n // given httpFetchParams, includeCredentials, and isNewConnectionFetch.\n const forwardResponse = await httpNetworkFetch(\n httpFetchParams,\n includeCredentials,\n isNewConnectionFetch\n )\n\n // 3. If httpRequest’s method is unsafe and forwardResponse’s status is\n // in the range 200 to 399, inclusive, invalidate appropriate stored\n // responses in httpCache, as per the \"Invalidation\" chapter of HTTP\n // Caching, and set storedResponse to null. [HTTP-CACHING]\n if (\n !safeMethodsSet.has(httpRequest.method) &&\n forwardResponse.status >= 200 &&\n forwardResponse.status <= 399\n ) {\n // TODO: cache\n }\n\n // 4. If the revalidatingFlag is set and forwardResponse’s status is 304,\n // then:\n if (revalidatingFlag && forwardResponse.status === 304) {\n // TODO: cache\n }\n\n // 5. If response is null, then:\n if (response == null) {\n // 1. Set response to forwardResponse.\n response = forwardResponse\n\n // 2. Store httpRequest and forwardResponse in httpCache, as per the\n // \"Storing Responses in Caches\" chapter of HTTP Caching. [HTTP-CACHING]\n // TODO: cache\n }\n }\n\n // 11. Set response’s URL list to a clone of httpRequest’s URL list.\n response.urlList = [...httpRequest.urlList]\n\n // 12. If httpRequest’s header list contains `Range`, then set response’s\n // range-requested flag.\n if (httpRequest.headersList.contains('range', true)) {\n response.rangeRequested = true\n }\n\n // 13. Set response’s request-includes-credentials to includeCredentials.\n response.requestIncludesCredentials = includeCredentials\n\n // 14. If response’s status is 401, httpRequest’s response tainting is not \"cors\",\n // includeCredentials is true, and request’s traversable for user prompts is\n // a traversable navigable:\n //\n // In Node.js there is no traversable navigable to prompt the user, but we\n // still need to handle URL-embedded credentials so authentication retries\n // for WebSocket handshakes continue to work.\n if (response.status === 401 && httpRequest.responseTainting !== 'cors' && includeCredentials && (\n request.useURLCredentials !== undefined ||\n isTraversableNavigable(request.traversableForUserPrompts)\n )) {\n // 2. If request’s body is non-null, then:\n if (request.body != null) {\n // 1. If request’s body’s source is null, then return a network error.\n if (request.body.source == null) {\n // Note: In Node.js, this code path should not be reached because\n // isTraversableNavigable() returns false for non-navigable contexts.\n // However, we handle it gracefully by returning the response instead of\n // a network error, as we won't actually retry the request.\n // This aligns with the Fetch spec discussion in whatwg/fetch#1132,\n // which allows implementations flexibility when credentials can't be obtained.\n return response\n }\n\n // 2. Set request’s body to the body of the result of safely extracting\n // request’s body’s source.\n request.body = safelyExtractBody(request.body.source)[0]\n }\n\n // 3. If request’s use-URL-credentials flag is unset or isAuthenticationFetch is\n // true, then:\n if (request.useURLCredentials === undefined || isAuthenticationFetch) {\n // 1. If fetchParams is canceled, then return the appropriate network error\n // for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 2. Let username and password be the result of prompting the end user for a\n // username and password, respectively, in request’s traversable for user prompts.\n // TODO\n\n // 3. Set the username given request’s current URL and username.\n // requestCurrentURL(request).username = TODO\n\n // 4. Set the password given request’s current URL and password.\n // requestCurrentURL(request).password = TODO\n\n // In browsers, the user will be prompted to enter a username/password before the request\n // is re-sent. To prevent an infinite 401 loop, return the response for now.\n // https://github.com/nodejs/undici/pull/4756\n return response\n }\n\n // 4. Set response to the result of running HTTP-network-or-cache fetch given\n // fetchParams and true.\n fetchParams.controller.connection.destroy()\n\n response = await httpNetworkOrCacheFetch(fetchParams, true)\n }\n\n // 15. If response’s status is 407, then:\n if (response.status === 407) {\n // 1. If request’s window is \"no-window\", then return a network error.\n if (request.window === 'no-window') {\n return makeNetworkError()\n }\n\n // 2. ???\n\n // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 4. Prompt the end user as appropriate in request’s window and store\n // the result as a proxy-authentication entry. [HTTP-AUTH]\n // TODO: Invoke some kind of callback?\n\n // 5. Set response to the result of running HTTP-network-or-cache fetch given\n // fetchParams.\n // TODO\n return makeNetworkError('proxy authentication required')\n }\n\n // 16. If all of the following are true\n if (\n // response’s status is 421\n response.status === 421 &&\n // isNewConnectionFetch is false\n !isNewConnectionFetch &&\n // request’s body is null, or request’s body is non-null and request’s body’s source is non-null\n (request.body == null || request.body.source != null)\n ) {\n // then:\n\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 2. Set response to the result of running HTTP-network-or-cache\n // fetch given fetchParams, isAuthenticationFetch, and true.\n\n // TODO (spec): The spec doesn't specify this but we need to cancel\n // the active response before we can start a new one.\n // https://github.com/whatwg/fetch/issues/1293\n fetchParams.controller.connection.destroy()\n\n response = await httpNetworkOrCacheFetch(\n fetchParams,\n isAuthenticationFetch,\n true\n )\n }\n\n // 17. If isAuthenticationFetch is true, then create an authentication entry\n if (isAuthenticationFetch) {\n // TODO\n }\n\n // 18. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-network-fetch\nasync function httpNetworkFetch (\n fetchParams,\n includeCredentials = false,\n forceNewConnection = false\n) {\n assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed)\n\n fetchParams.controller.connection = {\n abort: null,\n destroyed: false,\n destroy (err, abort = true) {\n if (!this.destroyed) {\n this.destroyed = true\n if (abort) {\n this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError'))\n }\n }\n }\n }\n\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 4. Let httpCache be the result of determining the HTTP cache partition,\n // given request.\n // TODO: cache\n const httpCache = null\n\n // 5. If httpCache is null, then set request’s cache mode to \"no-store\".\n if (httpCache == null) {\n request.cache = 'no-store'\n }\n\n // 6. Let networkPartitionKey be the result of determining the network\n // partition key given request.\n // TODO\n\n // 7. Let newConnection be \"yes\" if forceNewConnection is true; otherwise\n // \"no\".\n const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars\n\n // 8. Switch on request’s mode:\n if (request.mode === 'websocket') {\n // Let connection be the result of obtaining a WebSocket connection,\n // given request’s current URL.\n // TODO\n } else {\n // Let connection be the result of obtaining a connection, given\n // networkPartitionKey, request’s current URL’s origin,\n // includeCredentials, and forceNewConnection.\n // TODO\n }\n\n // 9. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If connection is failure, then return a network error.\n\n // 2. Set timingInfo’s final connection timing info to the result of\n // calling clamp and coarsen connection timing info with connection’s\n // timing info, timingInfo’s post-redirect start time, and fetchParams’s\n // cross-origin isolated capability.\n\n // 3. If connection is not an HTTP/2 connection, request’s body is non-null,\n // and request’s body’s source is null, then append (`Transfer-Encoding`,\n // `chunked`) to request’s header list.\n\n // 4. Set timingInfo’s final network-request start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated\n // capability.\n\n // 5. Set response to the result of making an HTTP request over connection\n // using request with the following caveats:\n\n // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS]\n // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH]\n\n // - If request’s body is non-null, and request’s body’s source is null,\n // then the user agent may have a buffer of up to 64 kibibytes and store\n // a part of request’s body in that buffer. If the user agent reads from\n // request’s body beyond that buffer’s size and the user agent needs to\n // resend request, then instead return a network error.\n\n // - Set timingInfo’s final network-response start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated capability,\n // immediately after the user agent’s HTTP parser receives the first byte\n // of the response (e.g., frame header bytes for HTTP/2 or response status\n // line for HTTP/1.x).\n\n // - Wait until all the headers are transmitted.\n\n // - Any responses whose status is in the range 100 to 199, inclusive,\n // and is not 101, are to be ignored, except for the purposes of setting\n // timingInfo’s final network-response start time above.\n\n // - If request’s header list contains `Transfer-Encoding`/`chunked` and\n // response is transferred via HTTP/1.0 or older, then return a network\n // error.\n\n // - If the HTTP request results in a TLS client certificate dialog, then:\n\n // 1. If request’s window is an environment settings object, make the\n // dialog available in request’s window.\n\n // 2. Otherwise, return a network error.\n\n // To transmit request’s body body, run these steps:\n let requestBody = null\n // 1. If body is null and fetchParams’s process request end-of-body is\n // non-null, then queue a fetch task given fetchParams’s process request\n // end-of-body and fetchParams’s task destination.\n if (request.body == null && fetchParams.processRequestEndOfBody) {\n queueMicrotask(() => fetchParams.processRequestEndOfBody())\n } else if (request.body != null) {\n // 2. Otherwise, if body is non-null:\n\n // 1. Let processBodyChunk given bytes be these steps:\n const processBodyChunk = async function * (bytes) {\n // 1. If the ongoing fetch is terminated, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. Run this step in parallel: transmit bytes.\n yield bytes\n\n // 3. If fetchParams’s process request body is non-null, then run\n // fetchParams’s process request body given bytes’s length.\n fetchParams.processRequestBodyChunkLength?.(bytes.byteLength)\n }\n\n // 2. Let processEndOfBody be these steps:\n const processEndOfBody = () => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If fetchParams’s process request end-of-body is non-null,\n // then run fetchParams’s process request end-of-body.\n if (fetchParams.processRequestEndOfBody) {\n fetchParams.processRequestEndOfBody()\n }\n }\n\n // 3. Let processBodyError given e be these steps:\n const processBodyError = (e) => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If e is an \"AbortError\" DOMException, then abort fetchParams’s controller.\n if (e.name === 'AbortError') {\n fetchParams.controller.abort()\n } else {\n fetchParams.controller.terminate(e)\n }\n }\n\n // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody,\n // processBodyError, and fetchParams’s task destination.\n requestBody = (async function * () {\n try {\n for await (const bytes of request.body.stream) {\n yield * processBodyChunk(bytes)\n }\n processEndOfBody()\n } catch (err) {\n processBodyError(err)\n }\n })()\n }\n\n try {\n // socket is only provided for websockets\n const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody })\n\n if (socket) {\n response = makeResponse({ status, statusText, headersList, socket })\n } else {\n const iterator = body[Symbol.asyncIterator]()\n fetchParams.controller.next = () => iterator.next()\n\n response = makeResponse({ status, statusText, headersList })\n }\n } catch (err) {\n // 10. If aborted, then:\n if (err.name === 'AbortError') {\n // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n fetchParams.controller.connection.destroy()\n\n // 2. Return the appropriate network error for fetchParams.\n return makeAppropriateNetworkError(fetchParams, err)\n }\n\n return makeNetworkError(err)\n }\n\n // 11. Let pullAlgorithm be an action that resumes the ongoing fetch\n // if it is suspended.\n const pullAlgorithm = () => {\n return fetchParams.controller.resume()\n }\n\n // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s\n // controller with reason, given reason.\n const cancelAlgorithm = (reason) => {\n // If the aborted fetch was already terminated, then we do not\n // need to do anything.\n if (!isCancelled(fetchParams)) {\n fetchParams.controller.abort(reason)\n }\n }\n\n // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by\n // the user agent.\n // TODO\n\n // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object\n // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.\n // TODO\n\n // 15. Let stream be a new ReadableStream.\n // 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm,\n // cancelAlgorithm set to cancelAlgorithm.\n const stream = new ReadableStream(\n {\n start (controller) {\n fetchParams.controller.controller = controller\n },\n pull: pullAlgorithm,\n cancel: cancelAlgorithm,\n type: 'bytes'\n }\n )\n\n // 17. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. Set response’s body to a new body whose stream is stream.\n response.body = { stream, source: null, length: null }\n\n // 2. If response is not a network error and request’s cache mode is\n // not \"no-store\", then update response in httpCache for request.\n // TODO\n\n // 3. If includeCredentials is true and the user agent is not configured\n // to block cookies for request (see section 7 of [COOKIES]), then run the\n // \"set-cookie-string\" parsing algorithm (see section 5.2 of [COOKIES]) on\n // the value of each header whose name is a byte-case-insensitive match for\n // `Set-Cookie` in response’s header list, if any, and request’s current URL.\n // TODO\n\n // 18. If aborted, then:\n // TODO\n\n // 19. Run these steps in parallel:\n\n // 1. Run these steps, but abort when fetchParams is canceled:\n if (!fetchParams.controller.resume) {\n fetchParams.controller.on('terminated', onAborted)\n }\n\n fetchParams.controller.resume = async () => {\n // 1. While true\n while (true) {\n // 1-3. See onData...\n\n // 4. Set bytes to the result of handling content codings given\n // codings and bytes.\n let bytes\n let isFailure\n try {\n const { done, value } = await fetchParams.controller.next()\n\n if (isAborted(fetchParams)) {\n break\n }\n\n bytes = done ? undefined : value\n } catch (err) {\n if (fetchParams.controller.ended && !timingInfo.encodedBodySize) {\n // zlib doesn't like empty streams.\n bytes = undefined\n } else {\n bytes = err\n\n // err may be propagated from the result of calling readablestream.cancel,\n // which might not be an error. https://github.com/nodejs/undici/issues/2009\n isFailure = true\n }\n }\n\n if (bytes === undefined) {\n // 2. Otherwise, if the bytes transmission for response’s message\n // body is done normally and stream is readable, then close\n // stream, finalize response for fetchParams and response, and\n // abort these in-parallel steps.\n readableStreamClose(fetchParams.controller.controller)\n\n finalizeResponse(fetchParams, response)\n\n return\n }\n\n // 5. Increase timingInfo’s decoded body size by bytes’s length.\n timingInfo.decodedBodySize += bytes?.byteLength ?? 0\n\n // 6. If bytes is failure, then terminate fetchParams’s controller.\n if (isFailure) {\n fetchParams.controller.terminate(bytes)\n return\n }\n\n // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes\n // into stream.\n const buffer = new Uint8Array(bytes)\n if (buffer.byteLength) {\n fetchParams.controller.controller.enqueue(buffer)\n }\n\n // 8. If stream is errored, then terminate the ongoing fetch.\n if (isErrored(stream)) {\n fetchParams.controller.terminate()\n return\n }\n\n // 9. If stream doesn’t need more data ask the user agent to suspend\n // the ongoing fetch.\n if (fetchParams.controller.controller.desiredSize <= 0) {\n return\n }\n }\n }\n\n // 2. If aborted, then:\n function onAborted (reason) {\n // 2. If fetchParams is aborted, then:\n if (isAborted(fetchParams)) {\n // 1. Set response’s aborted flag.\n response.aborted = true\n\n // 2. If stream is readable, then error stream with the result of\n // deserialize a serialized abort reason given fetchParams’s\n // controller’s serialized abort reason and an\n // implementation-defined realm.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(\n fetchParams.controller.serializedAbortReason\n )\n }\n } else {\n // 3. Otherwise, if stream is readable, error stream with a TypeError.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(new TypeError('terminated', {\n cause: isErrorLike(reason) ? reason : undefined\n }))\n }\n }\n\n // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so.\n fetchParams.controller.connection.destroy()\n }\n\n // 20. Return response.\n return response\n\n function dispatch ({ body }) {\n const url = requestCurrentURL(request)\n /** @type {import('../../..').Agent} */\n const agent = fetchParams.controller.dispatcher\n\n const path = url.pathname + url.search\n const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === '?'\n\n return dispatchWithProtocolPreference(body)\n\n function dispatchWithProtocolPreference (body, allowH2) {\n return new Promise((resolve, reject) => agent.dispatch(\n {\n path: hasTrailingQuestionMark ? `${path}?` : path,\n origin: url.origin,\n method: request.method,\n body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,\n headers: request.headersList.entries,\n maxRedirections: 0,\n upgrade: request.mode === 'websocket' ? 'websocket' : undefined,\n ...(allowH2 === false ? { allowH2 } : null)\n },\n {\n body: null,\n abort: null,\n\n onRequestStart (controller) {\n // TODO (fix): Do we need connection here?\n const { connection } = fetchParams.controller\n\n // Set timingInfo’s final connection timing info to the result of calling clamp and coarsen\n // connection timing info with connection’s timing info, timingInfo’s post-redirect start\n // time, and fetchParams’s cross-origin isolated capability.\n // TODO: implement connection timing\n timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability)\n\n const abort = (reason) => controller.abort(reason)\n\n if (connection.destroyed) {\n abort(new DOMException('The operation was aborted.', 'AbortError'))\n } else {\n fetchParams.controller.on('terminated', abort)\n this.abort = connection.abort = abort\n }\n\n // Set timingInfo’s final network-request start time to the coarsened shared current time given\n // fetchParams’s cross-origin isolated capability.\n timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n },\n\n onResponseStarted () {\n // Set timingInfo’s final network-response start time to the coarsened shared current\n // time given fetchParams’s cross-origin isolated capability, immediately after the\n // user agent’s HTTP parser receives the first byte of the response (e.g., frame header\n // bytes for HTTP/2 or response status line for HTTP/1.x).\n timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n },\n\n onResponseStart (controller, status, _headers, statusText) {\n if (status < 200) {\n return\n }\n\n const rawHeaders = controller?.rawHeaders ?? []\n const headersList = new HeadersList()\n\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i])\n const value = rawHeaders[i + 1]\n if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {\n for (const val of value) {\n headersList.append(nameStr, val.toString('latin1'), true)\n }\n } else {\n headersList.append(nameStr, value.toString('latin1'), true)\n }\n }\n const location = headersList.get('location', true)\n\n this.body = new Readable({ read: () => controller.resume() })\n\n const willFollow = location && request.redirect === 'follow' &&\n redirectStatusSet.has(status)\n\n const decoders = []\n\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding\n if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {\n // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1\n const contentEncoding = headersList.get('content-encoding', true)\n // \"All content-coding values are case-insensitive...\"\n /** @type {string[]} */\n const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []\n\n // Limit the number of content-encodings to prevent resource exhaustion.\n // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).\n const maxContentEncodings = 5\n if (codings.length > maxContentEncodings) {\n reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`))\n return\n }\n\n for (let i = codings.length - 1; i >= 0; --i) {\n const coding = codings[i].trim()\n // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2\n if (coding === 'x-gzip' || coding === 'gzip') {\n decoders.push(zlib.createGunzip({\n // Be less strict when decoding compressed responses, since sometimes\n // servers send slightly invalid responses that are still accepted\n // by common browsers.\n // Always using Z_SYNC_FLUSH is what cURL does.\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n }))\n } else if (coding === 'deflate') {\n decoders.push(createInflate({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n }))\n } else if (coding === 'br') {\n decoders.push(zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n }))\n } else if (coding === 'zstd') {\n decoders.push(zlib.createZstdDecompress({\n flush: zlib.constants.ZSTD_e_continue,\n finishFlush: zlib.constants.ZSTD_e_end\n }))\n } else {\n decoders.length = 0\n break\n }\n }\n }\n\n const onError = (err) => this.onResponseError(controller, err)\n\n resolve({\n status,\n statusText,\n headersList,\n body: decoders.length\n ? pipeline(this.body, ...decoders, (err) => {\n if (err) {\n this.onResponseError(controller, err)\n }\n }).on('error', onError)\n : this.body.on('error', onError)\n })\n },\n\n onResponseData (controller, chunk) {\n if (fetchParams.controller.dump) {\n return\n }\n\n // 1. If one or more bytes have been transmitted from response’s\n // message body, then:\n\n // 1. Let bytes be the transmitted bytes.\n const bytes = chunk\n\n // 2. Let codings be the result of extracting header list values\n // given `Content-Encoding` and response’s header list.\n // See pullAlgorithm.\n\n // 3. Increase timingInfo’s encoded body size by bytes’s length.\n timingInfo.encodedBodySize += bytes.byteLength\n\n // 4. See pullAlgorithm...\n\n if (this.body.push(bytes) === false) {\n controller.pause()\n }\n },\n\n onResponseEnd () {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n fetchParams.controller.ended = true\n\n this.body?.push(null)\n },\n\n onResponseError (_controller, error) {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n if (\n request.mode === 'websocket' &&\n allowH2 !== false &&\n error?.code === 'UND_ERR_INFO' &&\n error?.message === 'HTTP/2: Extended CONNECT protocol not supported by server'\n ) {\n // The origin negotiated H2, but RFC 8441 websocket support is unavailable.\n // Retry the opening handshake on a fresh HTTP/1.1-only connection instead.\n resolve(dispatchWithProtocolPreference(body, false))\n return\n }\n\n this.body?.destroy(error)\n\n fetchParams.controller.terminate(error)\n\n reject(error)\n },\n\n onRequestUpgrade (controller, status, _headers, socket) {\n // We need to support 200 for websocket over h2 as per RFC-8441\n // Absence of session means H1\n if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) {\n return false\n }\n\n const rawHeaders = controller?.rawHeaders ?? []\n const headersList = new HeadersList()\n\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i])\n const value = rawHeaders[i + 1]\n if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {\n for (const val of value) {\n headersList.append(nameStr, val.toString('latin1'), true)\n }\n } else {\n headersList.append(nameStr, value.toString('latin1'), true)\n }\n }\n\n resolve({\n status,\n statusText: STATUS_CODES[status],\n headersList,\n socket\n })\n\n return true\n }\n }\n ))\n }\n }\n}\n\nmodule.exports = {\n fetch,\n Fetch,\n fetching,\n finalizeAndReportTiming\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { URLSerializer } = require('../fetch/data-url')\nconst { isValidHeaderName } = require('../fetch/util')\n\n/**\n * @see https://url.spec.whatwg.org/#concept-url-equals\n * @param {URL} A\n * @param {URL} B\n * @param {boolean | undefined} excludeFragment\n * @returns {boolean}\n */\nfunction urlEquals (A, B, excludeFragment = false) {\n const serializedA = URLSerializer(A, excludeFragment)\n\n const serializedB = URLSerializer(B, excludeFragment)\n\n return serializedA === serializedB\n}\n\n/**\n * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262\n * @param {string} header\n */\nfunction getFieldValues (header) {\n assert(header !== null)\n\n const values = []\n\n for (let value of header.split(',')) {\n value = value.trim()\n\n if (isValidHeaderName(value)) {\n values.push(value)\n }\n }\n\n return values\n}\n\nmodule.exports = {\n urlEquals,\n getFieldValues\n}\n","'use strict'\n\nconst assert = require('node:assert')\n\nconst { kConstruct } = require('../../core/symbols')\nconst { urlEquals, getFieldValues } = require('./util')\nconst { kEnumerableProperty, isDisturbed } = require('../../core/util')\nconst { webidl } = require('../webidl')\nconst { cloneResponse, fromInnerResponse, getResponseState } = require('../fetch/response')\nconst { Request, fromInnerRequest, getRequestState } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { urlIsHttpHttpsScheme, readAllBytes } = require('../fetch/util')\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation\n * @typedef {Object} CacheBatchOperation\n * @property {'delete' | 'put'} type\n * @property {any} request\n * @property {any} response\n * @property {import('../../../types/cache').CacheQueryOptions} options\n */\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list\n * @typedef {[any, any][]} requestResponseList\n */\n\nclass Cache {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list\n * @type {requestResponseList}\n */\n #relevantRequestResponseList\n\n constructor () {\n if (arguments[0] !== kConstruct) {\n webidl.illegalConstructor()\n }\n\n webidl.util.markAsUncloneable(this)\n this.#relevantRequestResponseList = arguments[1]\n }\n\n async match (request, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.match'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n const p = this.#internalMatchAll(request, options, 1)\n\n if (p.length === 0) {\n return\n }\n\n return p[0]\n }\n\n async matchAll (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.matchAll'\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n return this.#internalMatchAll(request, options)\n }\n\n async add (request) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.add'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n request = webidl.converters.RequestInfo(request)\n\n // 1.\n const requests = [request]\n\n // 2.\n const responseArrayPromise = this.addAll(requests)\n\n // 3.\n return await responseArrayPromise\n }\n\n async addAll (requests) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.addAll'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n // 1.\n const responsePromises = []\n\n // 2.\n const requestList = []\n\n // 3.\n for (let request of requests) {\n if (request === undefined) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: 'Argument 1',\n types: ['undefined is not allowed']\n })\n }\n\n request = webidl.converters.RequestInfo(request)\n\n if (typeof request === 'string') {\n continue\n }\n\n // 3.1\n const r = getRequestState(request)\n\n // 3.2\n if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Expected http/s scheme when method is not GET.'\n })\n }\n }\n\n // 4.\n /** @type {ReturnType[]} */\n const fetchControllers = []\n\n // 5.\n for (const request of requests) {\n // 5.1\n const r = getRequestState(new Request(request))\n\n // 5.2\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Expected http/s scheme.'\n })\n }\n\n // 5.4\n r.initiator = 'fetch'\n r.destination = 'subresource'\n\n // 5.5\n requestList.push(r)\n\n // 5.6\n const responsePromise = Promise.withResolvers()\n\n // 5.7\n fetchControllers.push(fetching({\n request: r,\n processResponse (response) {\n // 1.\n if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Received an invalid status code or the request failed.'\n }))\n } else if (response.headersList.contains('vary')) { // 2.\n // 2.1\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n // 2.2\n for (const fieldValue of fieldValues) {\n // 2.2.1\n if (fieldValue === '*') {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'invalid vary field value'\n }))\n\n for (const controller of fetchControllers) {\n controller.abort()\n }\n\n return\n }\n }\n }\n },\n processResponseEndOfBody (response) {\n // 1.\n if (response.aborted) {\n responsePromise.reject(new DOMException('aborted', 'AbortError'))\n return\n }\n\n // 2.\n responsePromise.resolve(response)\n }\n }))\n\n // 5.8\n responsePromises.push(responsePromise.promise)\n }\n\n // 6.\n const p = Promise.all(responsePromises)\n\n // 7.\n const responses = await p\n\n // 7.1\n const operations = []\n\n // 7.2\n let index = 0\n\n // 7.3\n for (const response of responses) {\n // 7.3.1\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 7.3.2\n request: requestList[index], // 7.3.3\n response // 7.3.4\n }\n\n operations.push(operation) // 7.3.5\n\n index++ // 7.3.6\n }\n\n // 7.5\n const cacheJobPromise = Promise.withResolvers()\n\n // 7.6.1\n let errorData = null\n\n // 7.6.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 7.6.3\n queueMicrotask(() => {\n // 7.6.3.1\n if (errorData === null) {\n cacheJobPromise.resolve(undefined)\n } else {\n // 7.6.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n // 7.7\n return cacheJobPromise.promise\n }\n\n async put (request, response) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.put'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n request = webidl.converters.RequestInfo(request)\n response = webidl.converters.Response(response, prefix, 'response')\n\n // 1.\n let innerRequest = null\n\n // 2.\n if (webidl.is.Request(request)) {\n innerRequest = getRequestState(request)\n } else { // 3.\n innerRequest = getRequestState(new Request(request))\n }\n\n // 4.\n if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Expected an http/s scheme when method is not GET'\n })\n }\n\n // 5.\n const innerResponse = getResponseState(response)\n\n // 6.\n if (innerResponse.status === 206) {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Got 206 status'\n })\n }\n\n // 7.\n if (innerResponse.headersList.contains('vary')) {\n // 7.1.\n const fieldValues = getFieldValues(innerResponse.headersList.get('vary'))\n\n // 7.2.\n for (const fieldValue of fieldValues) {\n // 7.2.1\n if (fieldValue === '*') {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Got * vary field value'\n })\n }\n }\n }\n\n // 8.\n if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Response body is locked or disturbed'\n })\n }\n\n // 9.\n const clonedResponse = cloneResponse(innerResponse)\n\n // 10.\n const bodyReadPromise = Promise.withResolvers()\n\n // 11.\n if (innerResponse.body != null) {\n // 11.1\n const stream = innerResponse.body.stream\n\n // 11.2\n const reader = stream.getReader()\n\n // 11.3\n readAllBytes(reader, bodyReadPromise.resolve, bodyReadPromise.reject)\n } else {\n bodyReadPromise.resolve(undefined)\n }\n\n // 12.\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n // 13.\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 14.\n request: innerRequest, // 15.\n response: clonedResponse // 16.\n }\n\n // 17.\n operations.push(operation)\n\n // 19.\n const bytes = await bodyReadPromise.promise\n\n if (clonedResponse.body != null) {\n clonedResponse.body.source = bytes\n }\n\n // 19.1\n const cacheJobPromise = Promise.withResolvers()\n\n // 19.2.1\n let errorData = null\n\n // 19.2.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 19.2.3\n queueMicrotask(() => {\n // 19.2.3.1\n if (errorData === null) {\n cacheJobPromise.resolve()\n } else { // 19.2.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n async delete (request, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.delete'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n /**\n * @type {Request}\n */\n let r = null\n\n if (webidl.is.Request(request)) {\n r = getRequestState(request)\n\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return false\n }\n } else {\n assert(typeof request === 'string')\n\n r = getRequestState(new Request(request))\n }\n\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'delete',\n request: r,\n options\n }\n\n operations.push(operation)\n\n const cacheJobPromise = Promise.withResolvers()\n\n let errorData = null\n let requestResponses\n\n try {\n requestResponses = this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n queueMicrotask(() => {\n if (errorData === null) {\n cacheJobPromise.resolve(!!requestResponses?.length)\n } else {\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys\n * @param {any} request\n * @param {import('../../../types/cache').CacheQueryOptions} options\n * @returns {Promise}\n */\n async keys (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.keys'\n\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n // 2.1\n if (webidl.is.Request(request)) {\n // 2.1.1\n r = getRequestState(request)\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') { // 2.2\n r = getRequestState(new Request(request))\n }\n }\n\n // 4.\n const promise = Promise.withResolvers()\n\n // 5.\n // 5.1\n const requests = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n // 5.2.1.1\n requests.push(requestResponse[0])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n // 5.3.2.1\n requests.push(requestResponse[0])\n }\n }\n\n // 5.4\n queueMicrotask(() => {\n // 5.4.1\n const requestList = []\n\n // 5.4.2\n for (const request of requests) {\n const requestObject = fromInnerRequest(\n request,\n undefined,\n new AbortController().signal,\n 'immutable'\n )\n // 5.4.2.1\n requestList.push(requestObject)\n }\n\n // 5.4.3\n promise.resolve(Object.freeze(requestList))\n })\n\n return promise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm\n * @param {CacheBatchOperation[]} operations\n * @returns {requestResponseList}\n */\n #batchCacheOperations (operations) {\n // 1.\n const cache = this.#relevantRequestResponseList\n\n // 2.\n const backupCache = [...cache]\n\n // 3.\n const addedItems = []\n\n // 4.1\n const resultList = []\n\n try {\n // 4.2\n for (const operation of operations) {\n // 4.2.1\n if (operation.type !== 'delete' && operation.type !== 'put') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'operation type does not match \"delete\" or \"put\"'\n })\n }\n\n // 4.2.2\n if (operation.type === 'delete' && operation.response != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'delete operation should not have an associated response'\n })\n }\n\n // 4.2.3\n if (this.#queryCache(operation.request, operation.options, addedItems).length) {\n throw new DOMException('???', 'InvalidStateError')\n }\n\n // 4.2.4\n let requestResponses\n\n // 4.2.5\n if (operation.type === 'delete') {\n // 4.2.5.1\n requestResponses = this.#queryCache(operation.request, operation.options)\n\n // TODO: the spec is wrong, this is needed to pass WPTs\n if (requestResponses.length === 0) {\n return []\n }\n\n // 4.2.5.2\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.5.2.1\n cache.splice(idx, 1)\n }\n } else if (operation.type === 'put') { // 4.2.6\n // 4.2.6.1\n if (operation.response == null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'put operation should have an associated response'\n })\n }\n\n // 4.2.6.2\n const r = operation.request\n\n // 4.2.6.3\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'expected http or https scheme'\n })\n }\n\n // 4.2.6.4\n if (r.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'not get method'\n })\n }\n\n // 4.2.6.5\n if (operation.options != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'options must not be defined'\n })\n }\n\n // 4.2.6.6\n requestResponses = this.#queryCache(operation.request)\n\n // 4.2.6.7\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.6.7.1\n cache.splice(idx, 1)\n }\n\n // 4.2.6.8\n cache.push([operation.request, operation.response])\n\n // 4.2.6.10\n addedItems.push([operation.request, operation.response])\n }\n\n // 4.2.7\n resultList.push([operation.request, operation.response])\n }\n\n // 4.3\n return resultList\n } catch (e) { // 5.\n // 5.1\n this.#relevantRequestResponseList.length = 0\n\n // 5.2\n this.#relevantRequestResponseList = backupCache\n\n // 5.3\n throw e\n }\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#query-cache\n * @param {any} requestQuery\n * @param {import('../../../types/cache').CacheQueryOptions} options\n * @param {requestResponseList} targetStorage\n * @returns {requestResponseList}\n */\n #queryCache (requestQuery, options, targetStorage) {\n /** @type {requestResponseList} */\n const resultList = []\n\n const storage = targetStorage ?? this.#relevantRequestResponseList\n\n for (const requestResponse of storage) {\n const [cachedRequest, cachedResponse] = requestResponse\n if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) {\n resultList.push(requestResponse)\n }\n }\n\n return resultList\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm\n * @param {any} requestQuery\n * @param {any} request\n * @param {any | null} response\n * @param {import('../../../types/cache').CacheQueryOptions | undefined} options\n * @returns {boolean}\n */\n #requestMatchesCachedItem (requestQuery, request, response = null, options) {\n // if (options?.ignoreMethod === false && request.method === 'GET') {\n // return false\n // }\n\n const queryURL = new URL(requestQuery.url)\n\n const cachedURL = new URL(request.url)\n\n if (options?.ignoreSearch) {\n cachedURL.search = ''\n\n queryURL.search = ''\n }\n\n if (!urlEquals(queryURL, cachedURL, true)) {\n return false\n }\n\n if (\n response == null ||\n options?.ignoreVary ||\n !response.headersList.contains('vary')\n ) {\n return true\n }\n\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n for (const fieldValue of fieldValues) {\n if (fieldValue === '*') {\n return false\n }\n\n const requestValue = request.headersList.get(fieldValue)\n const queryValue = requestQuery.headersList.get(fieldValue)\n\n // If one has the header and the other doesn't, or one has\n // a different value than the other, return false\n if (requestValue !== queryValue) {\n return false\n }\n }\n\n return true\n }\n\n #internalMatchAll (request, options, maxResponses = Infinity) {\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n if (webidl.is.Request(request)) {\n // 2.1.1\n r = getRequestState(request)\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') {\n // 2.2.1\n r = getRequestState(new Request(request))\n }\n }\n\n // 5.\n // 5.1\n const responses = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n responses.push(requestResponse[1])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n responses.push(requestResponse[1])\n }\n }\n\n // 5.4\n // We don't implement CORs so we don't need to loop over the responses, yay!\n\n // 5.5.1\n const responseList = []\n\n // 5.5.2\n for (const response of responses) {\n // 5.5.2.1\n const responseObject = fromInnerResponse(cloneResponse(response), 'immutable')\n\n responseList.push(responseObject)\n\n if (responseList.length >= maxResponses) {\n break\n }\n }\n\n // 6.\n return Object.freeze(responseList)\n }\n}\n\nObject.defineProperties(Cache.prototype, {\n [Symbol.toStringTag]: {\n value: 'Cache',\n configurable: true\n },\n match: kEnumerableProperty,\n matchAll: kEnumerableProperty,\n add: kEnumerableProperty,\n addAll: kEnumerableProperty,\n put: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nconst cacheQueryOptionConverters = [\n {\n key: 'ignoreSearch',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'ignoreMethod',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'ignoreVary',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n }\n]\n\nwebidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters)\n\nwebidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([\n ...cacheQueryOptionConverters,\n {\n key: 'cacheName',\n converter: webidl.converters.DOMString\n }\n])\n\nwebidl.converters.Response = webidl.interfaceConverter(\n webidl.is.Response,\n 'Response'\n)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.RequestInfo\n)\n\nmodule.exports = {\n Cache\n}\n","'use strict'\n\nconst { Cache } = require('./cache')\nconst { webidl } = require('../webidl')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { kConstruct } = require('../../core/symbols')\n\nclass CacheStorage {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map\n * @type {Map}\n */\n async has (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n\n const prefix = 'CacheStorage.has'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n // 2.1.1\n // 2.2\n return this.#caches.has(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open\n * @param {string} cacheName\n * @returns {Promise}\n */\n async open (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n\n const prefix = 'CacheStorage.open'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n // 2.1\n if (this.#caches.has(cacheName)) {\n // await caches.open('v1') !== await caches.open('v1')\n\n // 2.1.1\n const cache = this.#caches.get(cacheName)\n\n // 2.1.1.1\n return new Cache(kConstruct, cache)\n }\n\n // 2.2\n const cache = []\n\n // 2.3\n this.#caches.set(cacheName, cache)\n\n // 2.4\n return new Cache(kConstruct, cache)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete\n * @param {string} cacheName\n * @returns {Promise}\n */\n async delete (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n\n const prefix = 'CacheStorage.delete'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n return this.#caches.delete(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys\n * @returns {Promise}\n */\n async keys () {\n webidl.brandCheck(this, CacheStorage)\n\n // 2.1\n const keys = this.#caches.keys()\n\n // 2.2\n return [...keys]\n }\n}\n\nObject.defineProperties(CacheStorage.prototype, {\n [Symbol.toStringTag]: {\n value: 'CacheStorage',\n configurable: true\n },\n match: kEnumerableProperty,\n has: kEnumerableProperty,\n open: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nmodule.exports = {\n CacheStorage\n}\n","'use strict'\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size\nconst maxAttributeValueSize = 1024\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size\nconst maxNameValuePairSize = 4096\n\nmodule.exports = {\n maxAttributeValueSize,\n maxNameValuePairSize\n}\n","'use strict'\n\n/**\n * @param {string} value\n * @returns {boolean}\n */\nfunction isCTLExcludingHtab (value) {\n for (let i = 0; i < value.length; ++i) {\n const code = value.charCodeAt(i)\n\n if (\n (code >= 0x00 && code <= 0x08) ||\n (code >= 0x0A && code <= 0x1F) ||\n code === 0x7F\n ) {\n return true\n }\n }\n return false\n}\n\n/**\n CHAR = \n token = 1*\n separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n | \",\" | \";\" | \":\" | \"\\\" | <\">\n | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n | \"{\" | \"}\" | SP | HT\n * @param {string} name\n */\nfunction validateCookieName (name) {\n for (let i = 0; i < name.length; ++i) {\n const code = name.charCodeAt(i)\n\n if (\n code < 0x21 || // exclude CTLs (0-31), SP and HT\n code > 0x7E || // exclude non-ascii and DEL\n code === 0x22 || // \"\n code === 0x28 || // (\n code === 0x29 || // )\n code === 0x3C || // <\n code === 0x3E || // >\n code === 0x40 || // @\n code === 0x2C || // ,\n code === 0x3B || // ;\n code === 0x3A || // :\n code === 0x5C || // \\\n code === 0x2F || // /\n code === 0x5B || // [\n code === 0x5D || // ]\n code === 0x3F || // ?\n code === 0x3D || // =\n code === 0x7B || // {\n code === 0x7D // }\n ) {\n throw new Error('Invalid cookie name')\n }\n }\n}\n\n/**\n cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n ; US-ASCII characters excluding CTLs,\n ; whitespace DQUOTE, comma, semicolon,\n ; and backslash\n * @param {string} value\n */\nfunction validateCookieValue (value) {\n let len = value.length\n let i = 0\n\n // if the value is wrapped in DQUOTE\n if (value[0] === '\"') {\n if (len === 1 || value[len - 1] !== '\"') {\n throw new Error('Invalid cookie value')\n }\n --len\n ++i\n }\n\n while (i < len) {\n const code = value.charCodeAt(i++)\n\n if (\n code < 0x21 || // exclude CTLs (0-31)\n code > 0x7E || // non-ascii and DEL (127)\n code === 0x22 || // \"\n code === 0x2C || // ,\n code === 0x3B || // ;\n code === 0x5C // \\\n ) {\n throw new Error('Invalid cookie value')\n }\n }\n}\n\n/**\n * path-value = \n * @param {string} path\n */\nfunction validateCookiePath (path) {\n for (let i = 0; i < path.length; ++i) {\n const code = path.charCodeAt(i)\n\n if (\n code < 0x20 || // exclude CTLs (0-31)\n code === 0x7F || // DEL\n code === 0x3B // ;\n ) {\n throw new Error('Invalid cookie path')\n }\n }\n}\n\n/**\n * I have no idea why these values aren't allowed to be honest,\n * but Deno tests these. - Khafra\n * @param {string} domain\n */\nfunction validateCookieDomain (domain) {\n if (\n domain.startsWith('-') ||\n domain.endsWith('.') ||\n domain.endsWith('-')\n ) {\n throw new Error('Invalid cookie domain')\n }\n}\n\nconst IMFDays = [\n 'Sun', 'Mon', 'Tue', 'Wed',\n 'Thu', 'Fri', 'Sat'\n]\n\nconst IMFMonths = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n]\n\nconst IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0'))\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1\n * @param {number|Date} date\n IMF-fixdate = day-name \",\" SP date1 SP time-of-day SP GMT\n ; fixed length/zone/capitalization subset of the format\n ; see Section 3.3 of [RFC5322]\n\n day-name = %x4D.6F.6E ; \"Mon\", case-sensitive\n / %x54.75.65 ; \"Tue\", case-sensitive\n / %x57.65.64 ; \"Wed\", case-sensitive\n / %x54.68.75 ; \"Thu\", case-sensitive\n / %x46.72.69 ; \"Fri\", case-sensitive\n / %x53.61.74 ; \"Sat\", case-sensitive\n / %x53.75.6E ; \"Sun\", case-sensitive\n date1 = day SP month SP year\n ; e.g., 02 Jun 1982\n\n day = 2DIGIT\n month = %x4A.61.6E ; \"Jan\", case-sensitive\n / %x46.65.62 ; \"Feb\", case-sensitive\n / %x4D.61.72 ; \"Mar\", case-sensitive\n / %x41.70.72 ; \"Apr\", case-sensitive\n / %x4D.61.79 ; \"May\", case-sensitive\n / %x4A.75.6E ; \"Jun\", case-sensitive\n / %x4A.75.6C ; \"Jul\", case-sensitive\n / %x41.75.67 ; \"Aug\", case-sensitive\n / %x53.65.70 ; \"Sep\", case-sensitive\n / %x4F.63.74 ; \"Oct\", case-sensitive\n / %x4E.6F.76 ; \"Nov\", case-sensitive\n / %x44.65.63 ; \"Dec\", case-sensitive\n year = 4DIGIT\n\n GMT = %x47.4D.54 ; \"GMT\", case-sensitive\n\n time-of-day = hour \":\" minute \":\" second\n ; 00:00:00 - 23:59:60 (leap second)\n\n hour = 2DIGIT\n minute = 2DIGIT\n second = 2DIGIT\n */\nfunction toIMFDate (date) {\n if (typeof date === 'number') {\n date = new Date(date)\n }\n\n return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`\n}\n\n/**\n max-age-av = \"Max-Age=\" non-zero-digit *DIGIT\n ; In practice, both expires-av and max-age-av\n ; are limited to dates representable by the\n ; user agent.\n * @param {number} maxAge\n */\nfunction validateCookieMaxAge (maxAge) {\n if (maxAge < 0) {\n throw new Error('Invalid cookie max-age')\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1\n * @param {import('./index').Cookie} cookie\n */\nfunction stringify (cookie) {\n if (cookie.name.length === 0) {\n return null\n }\n\n validateCookieName(cookie.name)\n validateCookieValue(cookie.value)\n\n const out = [`${cookie.name}=${cookie.value}`]\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2\n if (cookie.name.startsWith('__Secure-')) {\n cookie.secure = true\n }\n\n if (cookie.name.startsWith('__Host-')) {\n cookie.secure = true\n cookie.domain = null\n cookie.path = '/'\n }\n\n if (cookie.secure) {\n out.push('Secure')\n }\n\n if (cookie.httpOnly) {\n out.push('HttpOnly')\n }\n\n if (typeof cookie.maxAge === 'number') {\n validateCookieMaxAge(cookie.maxAge)\n out.push(`Max-Age=${cookie.maxAge}`)\n }\n\n if (cookie.domain) {\n validateCookieDomain(cookie.domain)\n out.push(`Domain=${cookie.domain}`)\n }\n\n if (cookie.path) {\n validateCookiePath(cookie.path)\n out.push(`Path=${cookie.path}`)\n }\n\n if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') {\n out.push(`Expires=${toIMFDate(cookie.expires)}`)\n }\n\n if (cookie.sameSite) {\n out.push(`SameSite=${cookie.sameSite}`)\n }\n\n for (const part of cookie.unparsed) {\n if (!part.includes('=')) {\n throw new Error('Invalid unparsed')\n }\n\n const [key, ...value] = part.split('=')\n\n out.push(`${key.trim()}=${value.join('=')}`)\n }\n\n return out.join('; ')\n}\n\nmodule.exports = {\n isCTLExcludingHtab,\n validateCookieName,\n validateCookiePath,\n validateCookieValue,\n toIMFDate,\n stringify\n}\n","'use strict'\n\nconst { collectASequenceOfCodePointsFast } = require('../infra')\nconst { maxNameValuePairSize, maxAttributeValueSize } = require('./constants')\nconst { isCTLExcludingHtab } = require('./util')\nconst assert = require('node:assert')\nconst { unescape: qsUnescape } = require('node:querystring')\n\n/**\n * @description Parses the field-value attributes of a set-cookie header string.\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} header\n * @returns {import('./index').Cookie|null} if the header is invalid, null will be returned\n */\nfunction parseSetCookie (header) {\n // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F\n // character (CTL characters excluding HTAB): Abort these steps and\n // ignore the set-cookie-string entirely.\n if (isCTLExcludingHtab(header)) {\n return null\n }\n\n let nameValuePair = ''\n let unparsedAttributes = ''\n let name = ''\n let value = ''\n\n // 2. If the set-cookie-string contains a %x3B (\";\") character:\n if (header.includes(';')) {\n // 1. The name-value-pair string consists of the characters up to,\n // but not including, the first %x3B (\";\"), and the unparsed-\n // attributes consist of the remainder of the set-cookie-string\n // (including the %x3B (\";\") in question).\n const position = { position: 0 }\n\n nameValuePair = collectASequenceOfCodePointsFast(';', header, position)\n unparsedAttributes = header.slice(position.position)\n } else {\n // Otherwise:\n\n // 1. The name-value-pair string consists of all the characters\n // contained in the set-cookie-string, and the unparsed-\n // attributes is the empty string.\n nameValuePair = header\n }\n\n // 3. If the name-value-pair string lacks a %x3D (\"=\") character, then\n // the name string is empty, and the value string is the value of\n // name-value-pair.\n if (!nameValuePair.includes('=')) {\n value = nameValuePair\n } else {\n // Otherwise, the name string consists of the characters up to, but\n // not including, the first %x3D (\"=\") character, and the (possibly\n // empty) value string consists of the characters after the first\n // %x3D (\"=\") character.\n const position = { position: 0 }\n name = collectASequenceOfCodePointsFast(\n '=',\n nameValuePair,\n position\n )\n value = nameValuePair.slice(position.position + 1)\n }\n\n // 4. Remove any leading or trailing WSP characters from the name\n // string and the value string.\n name = name.trim()\n value = value.trim()\n\n // 5. If the sum of the lengths of the name string and the value string\n // is more than 4096 octets, abort these steps and ignore the set-\n // cookie-string entirely.\n if (name.length + value.length > maxNameValuePairSize) {\n return null\n }\n\n // 6. The cookie-name is the name string, and the cookie-value is the\n // value string.\n // https://datatracker.ietf.org/doc/html/rfc6265\n // To maximize compatibility with user agents, servers that wish to\n // store arbitrary data in a cookie-value SHOULD encode that data, for\n // example, using Base64 [RFC4648].\n return {\n name, value: qsUnescape(value), ...parseUnparsedAttributes(unparsedAttributes)\n }\n}\n\n/**\n * Parses the remaining attributes of a set-cookie header\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} unparsedAttributes\n * @param {Object.} [cookieAttributeList={}]\n */\nfunction parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {\n // 1. If the unparsed-attributes string is empty, skip the rest of\n // these steps.\n if (unparsedAttributes.length === 0) {\n return cookieAttributeList\n }\n\n // 2. Discard the first character of the unparsed-attributes (which\n // will be a %x3B (\";\") character).\n assert(unparsedAttributes[0] === ';')\n unparsedAttributes = unparsedAttributes.slice(1)\n\n let cookieAv = ''\n\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n if (unparsedAttributes.includes(';')) {\n // 1. Consume the characters of the unparsed-attributes up to, but\n // not including, the first %x3B (\";\") character.\n cookieAv = collectASequenceOfCodePointsFast(\n ';',\n unparsedAttributes,\n { position: 0 }\n )\n unparsedAttributes = unparsedAttributes.slice(cookieAv.length)\n } else {\n // Otherwise:\n\n // 1. Consume the remainder of the unparsed-attributes.\n cookieAv = unparsedAttributes\n unparsedAttributes = ''\n }\n\n // Let the cookie-av string be the characters consumed in this step.\n\n let attributeName = ''\n let attributeValue = ''\n\n // 4. If the cookie-av string contains a %x3D (\"=\") character:\n if (cookieAv.includes('=')) {\n // 1. The (possibly empty) attribute-name string consists of the\n // characters up to, but not including, the first %x3D (\"=\")\n // character, and the (possibly empty) attribute-value string\n // consists of the characters after the first %x3D (\"=\")\n // character.\n const position = { position: 0 }\n\n attributeName = collectASequenceOfCodePointsFast(\n '=',\n cookieAv,\n position\n )\n attributeValue = cookieAv.slice(position.position + 1)\n } else {\n // Otherwise:\n\n // 1. The attribute-name string consists of the entire cookie-av\n // string, and the attribute-value string is empty.\n attributeName = cookieAv\n }\n\n // 5. Remove any leading or trailing WSP characters from the attribute-\n // name string and the attribute-value string.\n attributeName = attributeName.trim()\n attributeValue = attributeValue.trim()\n\n // 6. If the attribute-value is longer than 1024 octets, ignore the\n // cookie-av string and return to Step 1 of this algorithm.\n if (attributeValue.length > maxAttributeValueSize) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 7. Process the attribute-name and attribute-value according to the\n // requirements in the following subsections. (Notice that\n // attributes with unrecognized attribute-names are ignored.)\n const attributeNameLowercase = attributeName.toLowerCase()\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1\n // If the attribute-name case-insensitively matches the string\n // \"Expires\", the user agent MUST process the cookie-av as follows.\n if (attributeNameLowercase === 'expires') {\n // 1. Let the expiry-time be the result of parsing the attribute-value\n // as cookie-date (see Section 5.1.1).\n const expiryTime = new Date(attributeValue)\n\n // 2. If the attribute-value failed to parse as a cookie date, ignore\n // the cookie-av.\n\n cookieAttributeList.expires = expiryTime\n } else if (attributeNameLowercase === 'max-age') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2\n // If the attribute-name case-insensitively matches the string \"Max-\n // Age\", the user agent MUST process the cookie-av as follows.\n\n // 1. If the first character of the attribute-value is not a DIGIT or a\n // \"-\" character, ignore the cookie-av.\n const charCode = attributeValue.charCodeAt(0)\n\n if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 2. If the remainder of attribute-value contains a non-DIGIT\n // character, ignore the cookie-av.\n if (!/^\\d+$/.test(attributeValue)) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 3. Let delta-seconds be the attribute-value converted to an integer.\n const deltaSeconds = Number(attributeValue)\n\n // 4. Let cookie-age-limit be the maximum age of the cookie (which\n // SHOULD be 400 days or less, see Section 4.1.2.2).\n\n // 5. Set delta-seconds to the smaller of its present value and cookie-\n // age-limit.\n // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)\n\n // 6. If delta-seconds is less than or equal to zero (0), let expiry-\n // time be the earliest representable date and time. Otherwise, let\n // the expiry-time be the current date and time plus delta-seconds\n // seconds.\n // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds\n\n // 7. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Max-Age and an attribute-value of expiry-time.\n cookieAttributeList.maxAge = deltaSeconds\n } else if (attributeNameLowercase === 'domain') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3\n // If the attribute-name case-insensitively matches the string \"Domain\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. Let cookie-domain be the attribute-value.\n let cookieDomain = attributeValue\n\n // 2. If cookie-domain starts with %x2E (\".\"), let cookie-domain be\n // cookie-domain without its leading %x2E (\".\").\n if (cookieDomain[0] === '.') {\n cookieDomain = cookieDomain.slice(1)\n }\n\n // 3. Convert the cookie-domain to lower case.\n cookieDomain = cookieDomain.toLowerCase()\n\n // 4. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Domain and an attribute-value of cookie-domain.\n cookieAttributeList.domain = cookieDomain\n } else if (attributeNameLowercase === 'path') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4\n // If the attribute-name case-insensitively matches the string \"Path\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. If the attribute-value is empty or if the first character of the\n // attribute-value is not %x2F (\"/\"):\n let cookiePath = ''\n if (attributeValue.length === 0 || attributeValue[0] !== '/') {\n // 1. Let cookie-path be the default-path.\n cookiePath = '/'\n } else {\n // Otherwise:\n\n // 1. Let cookie-path be the attribute-value.\n cookiePath = attributeValue\n }\n\n // 2. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Path and an attribute-value of cookie-path.\n cookieAttributeList.path = cookiePath\n } else if (attributeNameLowercase === 'secure') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5\n // If the attribute-name case-insensitively matches the string \"Secure\",\n // the user agent MUST append an attribute to the cookie-attribute-list\n // with an attribute-name of Secure and an empty attribute-value.\n\n cookieAttributeList.secure = true\n } else if (attributeNameLowercase === 'httponly') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6\n // If the attribute-name case-insensitively matches the string\n // \"HttpOnly\", the user agent MUST append an attribute to the cookie-\n // attribute-list with an attribute-name of HttpOnly and an empty\n // attribute-value.\n\n cookieAttributeList.httpOnly = true\n } else if (attributeNameLowercase === 'samesite') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7\n // If the attribute-name case-insensitively matches the string\n // \"SameSite\", the user agent MUST process the cookie-av as follows:\n\n // 1. Let enforcement be \"Default\".\n let enforcement = 'Default'\n\n const attributeValueLowercase = attributeValue.toLowerCase()\n // 2. If cookie-av's attribute-value is a case-insensitive match for\n // \"None\", set enforcement to \"None\".\n if (attributeValueLowercase.includes('none')) {\n enforcement = 'None'\n }\n\n // 3. If cookie-av's attribute-value is a case-insensitive match for\n // \"Strict\", set enforcement to \"Strict\".\n if (attributeValueLowercase.includes('strict')) {\n enforcement = 'Strict'\n }\n\n // 4. If cookie-av's attribute-value is a case-insensitive match for\n // \"Lax\", set enforcement to \"Lax\".\n if (attributeValueLowercase.includes('lax')) {\n enforcement = 'Lax'\n }\n\n // 5. Append an attribute to the cookie-attribute-list with an\n // attribute-name of \"SameSite\" and an attribute-value of\n // enforcement.\n cookieAttributeList.sameSite = enforcement\n } else {\n cookieAttributeList.unparsed ??= []\n\n cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)\n }\n\n // 8. Return to Step 1 of this algorithm.\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n}\n\nmodule.exports = {\n parseSetCookie,\n parseUnparsedAttributes\n}\n","'use strict'\n\nconst { parseSetCookie } = require('./parse')\nconst { stringify } = require('./util')\nconst { webidl } = require('../webidl')\nconst { Headers } = require('../fetch/headers')\n\nconst brandChecks = webidl.brandCheckMultiple([Headers, globalThis.Headers].filter(Boolean))\n\n/**\n * @typedef {Object} Cookie\n * @property {string} name\n * @property {string} value\n * @property {Date|number} [expires]\n * @property {number} [maxAge]\n * @property {string} [domain]\n * @property {string} [path]\n * @property {boolean} [secure]\n * @property {boolean} [httpOnly]\n * @property {'Strict'|'Lax'|'None'} [sameSite]\n * @property {string[]} [unparsed]\n */\n\n/**\n * @param {Headers} headers\n * @returns {Record}\n */\nfunction getCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, 'getCookies')\n\n brandChecks(headers)\n\n const cookie = headers.get('cookie')\n\n /** @type {Record} */\n const out = {}\n\n if (!cookie) {\n return out\n }\n\n for (const piece of cookie.split(';')) {\n const [name, ...value] = piece.split('=')\n\n out[name.trim()] = value.join('=')\n }\n\n return out\n}\n\n/**\n * @param {Headers} headers\n * @param {string} name\n * @param {{ path?: string, domain?: string }|undefined} attributes\n * @returns {void}\n */\nfunction deleteCookie (headers, name, attributes) {\n brandChecks(headers)\n\n const prefix = 'deleteCookie'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n name = webidl.converters.DOMString(name, prefix, 'name')\n attributes = webidl.converters.DeleteCookieAttributes(attributes)\n\n // Matches behavior of\n // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278\n setCookie(headers, {\n name,\n value: '',\n expires: new Date(0),\n ...attributes\n })\n}\n\n/**\n * @param {Headers} headers\n * @returns {Cookie[]}\n */\nfunction getSetCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, 'getSetCookies')\n\n brandChecks(headers)\n\n const cookies = headers.getSetCookie()\n\n if (!cookies) {\n return []\n }\n\n return cookies.map((pair) => parseSetCookie(pair))\n}\n\n/**\n * Parses a cookie string\n * @param {string} cookie\n */\nfunction parseCookie (cookie) {\n cookie = webidl.converters.DOMString(cookie)\n\n return parseSetCookie(cookie)\n}\n\n/**\n * @param {Headers} headers\n * @param {Cookie} cookie\n * @returns {void}\n */\nfunction setCookie (headers, cookie) {\n webidl.argumentLengthCheck(arguments, 2, 'setCookie')\n\n brandChecks(headers)\n\n cookie = webidl.converters.Cookie(cookie)\n\n const str = stringify(cookie)\n\n if (str) {\n headers.append('set-cookie', str, true)\n }\n}\n\nwebidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: () => null\n }\n])\n\nwebidl.converters.Cookie = webidl.dictionaryConverter([\n {\n converter: webidl.converters.DOMString,\n key: 'name'\n },\n {\n converter: webidl.converters.DOMString,\n key: 'value'\n },\n {\n converter: webidl.nullableConverter((value) => {\n if (typeof value === 'number') {\n return webidl.converters['unsigned long long'](value)\n }\n\n return new Date(value)\n }),\n key: 'expires',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters['long long']),\n key: 'maxAge',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'secure',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'httpOnly',\n defaultValue: () => null\n },\n {\n converter: webidl.converters.USVString,\n key: 'sameSite',\n allowedValues: ['Strict', 'Lax', 'None']\n },\n {\n converter: webidl.sequenceConverter(webidl.converters.DOMString),\n key: 'unparsed',\n defaultValue: () => []\n }\n])\n\nmodule.exports = {\n getCookies,\n deleteCookie,\n getSetCookies,\n setCookie,\n parseCookie\n}\n","'use strict'\n\nconst { webidl } = require('../webidl')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { kConstruct } = require('../../core/symbols')\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n */\nclass MessageEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n if (type === kConstruct) {\n super(arguments[1], arguments[2])\n webidl.util.markAsUncloneable(this)\n return\n }\n\n const prefix = 'MessageEvent constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n type = webidl.converters.DOMString(type, prefix, 'type')\n eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, 'eventInitDict')\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n webidl.util.markAsUncloneable(this)\n }\n\n get data () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.data\n }\n\n get origin () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.origin\n }\n\n get lastEventId () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.lastEventId\n }\n\n get source () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.source\n }\n\n get ports () {\n webidl.brandCheck(this, MessageEvent)\n\n if (!Object.isFrozen(this.#eventInit.ports)) {\n Object.freeze(this.#eventInit.ports)\n }\n\n return this.#eventInit.ports\n }\n\n initMessageEvent (\n type,\n bubbles = false,\n cancelable = false,\n data = null,\n origin = '',\n lastEventId = '',\n source = null,\n ports = []\n ) {\n webidl.brandCheck(this, MessageEvent)\n\n webidl.argumentLengthCheck(arguments, 1, 'MessageEvent.initMessageEvent')\n\n return new MessageEvent(type, {\n bubbles, cancelable, data, origin, lastEventId, source, ports\n })\n }\n\n static createFastMessageEvent (type, init) {\n const messageEvent = new MessageEvent(kConstruct, type, init)\n messageEvent.#eventInit = init\n messageEvent.#eventInit.data ??= null\n messageEvent.#eventInit.origin ??= ''\n messageEvent.#eventInit.lastEventId ??= ''\n messageEvent.#eventInit.source ??= null\n messageEvent.#eventInit.ports ??= []\n return messageEvent\n }\n}\n\nconst { createFastMessageEvent } = MessageEvent\ndelete MessageEvent.createFastMessageEvent\n\n/**\n * @see https://websockets.spec.whatwg.org/#the-closeevent-interface\n */\nclass CloseEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n const prefix = 'CloseEvent constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n type = webidl.converters.DOMString(type, prefix, 'type')\n eventInitDict = webidl.converters.CloseEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n webidl.util.markAsUncloneable(this)\n }\n\n get wasClean () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.wasClean\n }\n\n get code () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.code\n }\n\n get reason () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.reason\n }\n}\n\n// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\nclass ErrorEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict) {\n const prefix = 'ErrorEvent constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n super(type, eventInitDict)\n webidl.util.markAsUncloneable(this)\n\n type = webidl.converters.DOMString(type, prefix, 'type')\n eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})\n\n this.#eventInit = eventInitDict\n }\n\n get message () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.message\n }\n\n get filename () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.filename\n }\n\n get lineno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.lineno\n }\n\n get colno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.colno\n }\n\n get error () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.error\n }\n}\n\nObject.defineProperties(MessageEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'MessageEvent',\n configurable: true\n },\n data: kEnumerableProperty,\n origin: kEnumerableProperty,\n lastEventId: kEnumerableProperty,\n source: kEnumerableProperty,\n ports: kEnumerableProperty,\n initMessageEvent: kEnumerableProperty\n})\n\nObject.defineProperties(CloseEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'CloseEvent',\n configurable: true\n },\n reason: kEnumerableProperty,\n code: kEnumerableProperty,\n wasClean: kEnumerableProperty\n})\n\nObject.defineProperties(ErrorEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'ErrorEvent',\n configurable: true\n },\n message: kEnumerableProperty,\n filename: kEnumerableProperty,\n lineno: kEnumerableProperty,\n colno: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\nwebidl.converters.MessagePort = webidl.interfaceConverter(\n webidl.is.MessagePort,\n 'MessagePort'\n)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.MessagePort\n)\n\nconst eventInit = [\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n }\n]\n\nwebidl.converters.MessageEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'data',\n converter: webidl.converters.any,\n defaultValue: () => null\n },\n {\n key: 'origin',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n },\n {\n key: 'lastEventId',\n converter: webidl.converters.DOMString,\n defaultValue: () => ''\n },\n {\n key: 'source',\n // Node doesn't implement WindowProxy or ServiceWorker, so the only\n // valid value for source is a MessagePort.\n converter: webidl.nullableConverter(webidl.converters.MessagePort),\n defaultValue: () => null\n },\n {\n key: 'ports',\n converter: webidl.converters['sequence'],\n defaultValue: () => []\n }\n])\n\nwebidl.converters.CloseEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'wasClean',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'code',\n converter: webidl.converters['unsigned short'],\n defaultValue: () => 0\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n }\n])\n\nwebidl.converters.ErrorEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'message',\n converter: webidl.converters.DOMString,\n defaultValue: () => ''\n },\n {\n key: 'filename',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n },\n {\n key: 'lineno',\n converter: webidl.converters['unsigned long'],\n defaultValue: () => 0\n },\n {\n key: 'colno',\n converter: webidl.converters['unsigned long'],\n defaultValue: () => 0\n },\n {\n key: 'error',\n converter: webidl.converters.any\n }\n])\n\nmodule.exports = {\n MessageEvent,\n CloseEvent,\n ErrorEvent,\n createFastMessageEvent\n}\n","'use strict'\n\n/**\n * This is a Globally Unique Identifier unique used to validate that the\n * endpoint accepts websocket connections.\n * @see https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3\n * @type {'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'}\n */\nconst uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'\n\n/**\n * @type {PropertyDescriptor}\n */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\n/**\n * The states of the WebSocket connection.\n *\n * @readonly\n * @enum\n * @property {0} CONNECTING\n * @property {1} OPEN\n * @property {2} CLOSING\n * @property {3} CLOSED\n */\nconst states = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3\n}\n\n/**\n * @readonly\n * @enum\n * @property {0} NOT_SENT\n * @property {1} PROCESSING\n * @property {2} SENT\n */\nconst sentCloseFrameState = {\n SENT: 1,\n RECEIVED: 2\n}\n\n/**\n * The WebSocket opcodes.\n *\n * @readonly\n * @enum\n * @property {0x0} CONTINUATION\n * @property {0x1} TEXT\n * @property {0x2} BINARY\n * @property {0x8} CLOSE\n * @property {0x9} PING\n * @property {0xA} PONG\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n */\nconst opcodes = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n CLOSE: 0x8,\n PING: 0x9,\n PONG: 0xA\n}\n\n/**\n * The maximum value for an unsigned 16-bit integer.\n *\n * @type {65535} 2 ** 16 - 1\n */\nconst maxUnsigned16Bit = 65535\n\n/**\n * The states of the parser.\n *\n * @readonly\n * @enum\n * @property {0} INFO\n * @property {2} PAYLOADLENGTH_16\n * @property {3} PAYLOADLENGTH_64\n * @property {4} READ_DATA\n */\nconst parserStates = {\n INFO: 0,\n PAYLOADLENGTH_16: 2,\n PAYLOADLENGTH_64: 3,\n READ_DATA: 4\n}\n\n/**\n * An empty buffer.\n *\n * @type {Buffer}\n */\nconst emptyBuffer = Buffer.allocUnsafe(0)\n\n/**\n * @readonly\n * @property {1} text\n * @property {2} typedArray\n * @property {3} arrayBuffer\n * @property {4} blob\n */\nconst sendHints = {\n text: 1,\n typedArray: 2,\n arrayBuffer: 3,\n blob: 4\n}\n\nmodule.exports = {\n uid,\n sentCloseFrameState,\n staticPropertyDescriptors,\n states,\n opcodes,\n maxUnsigned16Bit,\n parserStates,\n emptyBuffer,\n sendHints\n}\n","'use strict'\n\nconst { states, opcodes } = require('./constants')\nconst { isUtf8 } = require('node:buffer')\nconst { removeHTTPWhitespace } = require('../fetch/data-url')\nconst { collectASequenceOfCodePointsFast } = require('../infra')\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isConnecting (readyState) {\n // If the WebSocket connection is not yet established, and the connection\n // is not yet closed, then the WebSocket connection is in the CONNECTING state.\n return readyState === states.CONNECTING\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isEstablished (readyState) {\n // If the server's response is validated as provided for above, it is\n // said that _The WebSocket Connection is Established_ and that the\n // WebSocket Connection is in the OPEN state.\n return readyState === states.OPEN\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isClosing (readyState) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n return readyState === states.CLOSING\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isClosed (readyState) {\n return readyState === states.CLOSED\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e\n * @param {EventTarget} target\n * @param {(...args: ConstructorParameters) => Event} eventFactory\n * @param {EventInit | undefined} eventInitDict\n * @returns {void}\n */\nfunction fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) {\n // 1. If eventConstructor is not given, then let eventConstructor be Event.\n\n // 2. Let event be the result of creating an event given eventConstructor,\n // in the relevant realm of target.\n // 3. Initialize event’s type attribute to e.\n const event = eventFactory(e, eventInitDict)\n\n // 4. Initialize any other IDL attributes of event as described in the\n // invocation of this algorithm.\n\n // 5. Return the result of dispatching event at target, with legacy target\n // override flag set if set.\n target.dispatchEvent(event)\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @param {import('./websocket').Handler} handler\n * @param {number} type Opcode\n * @param {Buffer} data application data\n * @returns {void}\n */\nfunction websocketMessageReceived (handler, type, data) {\n handler.onMessage(type, data)\n}\n\n/**\n * @param {Buffer} buffer\n * @returns {ArrayBuffer}\n */\nfunction toArrayBuffer (buffer) {\n if (buffer.byteLength === buffer.buffer.byteLength) {\n return buffer.buffer\n }\n return new Uint8Array(buffer).buffer\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455\n * @see https://datatracker.ietf.org/doc/html/rfc2616\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407\n * @param {string} protocol\n * @returns {boolean}\n */\nfunction isValidSubprotocol (protocol) {\n // If present, this value indicates one\n // or more comma-separated subprotocol the client wishes to speak,\n // ordered by preference. The elements that comprise this value\n // MUST be non-empty strings with characters in the range U+0021 to\n // U+007E not including separator characters as defined in\n // [RFC2616] and MUST all be unique strings.\n if (protocol.length === 0) {\n return false\n }\n\n for (let i = 0; i < protocol.length; ++i) {\n const code = protocol.charCodeAt(i)\n\n if (\n code < 0x21 || // CTL, contains SP (0x20) and HT (0x09)\n code > 0x7E ||\n code === 0x22 || // \"\n code === 0x28 || // (\n code === 0x29 || // )\n code === 0x2C || // ,\n code === 0x2F || // /\n code === 0x3A || // :\n code === 0x3B || // ;\n code === 0x3C || // <\n code === 0x3D || // =\n code === 0x3E || // >\n code === 0x3F || // ?\n code === 0x40 || // @\n code === 0x5B || // [\n code === 0x5C || // \\\n code === 0x5D || // ]\n code === 0x7B || // {\n code === 0x7D // }\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4\n * @param {number} code\n * @returns {boolean}\n */\nfunction isValidStatusCode (code) {\n if (code >= 1000 && code < 1015) {\n return (\n code !== 1004 && // reserved\n code !== 1005 && // \"MUST NOT be set as a status code\"\n code !== 1006 // \"MUST NOT be set as a status code\"\n )\n }\n\n return code >= 3000 && code <= 4999\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isControlFrame (opcode) {\n return (\n opcode === opcodes.CLOSE ||\n opcode === opcodes.PING ||\n opcode === opcodes.PONG\n )\n}\n\n/**\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isContinuationFrame (opcode) {\n return opcode === opcodes.CONTINUATION\n}\n\n/**\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isTextBinaryFrame (opcode) {\n return opcode === opcodes.TEXT || opcode === opcodes.BINARY\n}\n\n/**\n *\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isValidOpcode (opcode) {\n return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode)\n}\n\n/**\n * Parses a Sec-WebSocket-Extensions header value.\n * @param {string} extensions\n * @returns {Map}\n */\n// TODO(@Uzlopak, @KhafraDev): make compliant https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\nfunction parseExtensions (extensions) {\n const position = { position: 0 }\n const extensionList = new Map()\n\n while (position.position < extensions.length) {\n const pair = collectASequenceOfCodePointsFast(';', extensions, position)\n const [name, value = ''] = pair.split('=', 2)\n\n extensionList.set(\n removeHTTPWhitespace(name, true, false),\n removeHTTPWhitespace(value, false, true)\n )\n\n position.position++\n }\n\n return extensionList\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2\n * @description \"client-max-window-bits = 1*DIGIT\"\n * @param {string} value\n * @returns {boolean}\n */\nfunction isValidClientWindowBits (value) {\n // Must have at least one character\n if (value.length === 0) {\n return false\n }\n\n // Check all characters are ASCII digits\n for (let i = 0; i < value.length; i++) {\n const byte = value.charCodeAt(i)\n\n if (byte < 0x30 || byte > 0x39) {\n return false\n }\n }\n\n // Check numeric range: zlib requires windowBits in range 8-15\n const num = Number.parseInt(value, 10)\n return num >= 8 && num <= 15\n}\n\n/**\n * @see https://whatpr.org/websockets/48/7b748d3...d5570f3.html#get-a-url-record\n * @param {string} url\n * @param {string} [baseURL]\n */\nfunction getURLRecord (url, baseURL) {\n // 1. Let urlRecord be the result of applying the URL parser to url with baseURL .\n // 2. If urlRecord is failure, then throw a \" SyntaxError \" DOMException .\n let urlRecord\n\n try {\n urlRecord = new URL(url, baseURL)\n } catch (e) {\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 3. If urlRecord ’s scheme is \" http \", then set urlRecord ’s scheme to \" ws \".\n // 4. Otherwise, if urlRecord ’s scheme is \" https \", set urlRecord ’s scheme to \" wss \".\n if (urlRecord.protocol === 'http:') {\n urlRecord.protocol = 'ws:'\n } else if (urlRecord.protocol === 'https:') {\n urlRecord.protocol = 'wss:'\n }\n\n // 5. If urlRecord ’s scheme is not \" ws \" or \" wss \", then throw a \" SyntaxError \" DOMException .\n if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {\n throw new DOMException('expected a ws: or wss: url', 'SyntaxError')\n }\n\n // If urlRecord ’s fragment is non-null, then throw a \" SyntaxError \" DOMException .\n if (urlRecord.hash.length || urlRecord.href.endsWith('#')) {\n throw new DOMException('hash', 'SyntaxError')\n }\n\n // Return urlRecord .\n return urlRecord\n}\n\n// https://whatpr.org/websockets/48.html#validate-close-code-and-reason\nfunction validateCloseCodeAndReason (code, reason) {\n // 1. If code is not null, but is neither an integer equal to\n // 1000 nor an integer in the range 3000 to 4999, inclusive,\n // throw an \"InvalidAccessError\" DOMException.\n if (code !== null) {\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new DOMException('invalid code', 'InvalidAccessError')\n }\n }\n\n // 2. If reason is not null, then:\n if (reason !== null) {\n // 2.1. Let reasonBytes be the result of UTF-8 encoding reason.\n // 2.2. If reasonBytes is longer than 123 bytes, then throw a\n // \"SyntaxError\" DOMException.\n const reasonBytesLength = Buffer.byteLength(reason)\n\n if (reasonBytesLength > 123) {\n throw new DOMException(`Reason must be less than 123 bytes; received ${reasonBytesLength}`, 'SyntaxError')\n }\n }\n}\n\n/**\n * Converts a Buffer to utf-8, even on platforms without icu.\n * @type {(buffer: Buffer) => string}\n */\nconst utf8Decode = (() => {\n if (typeof process.versions.icu === 'string') {\n const fatalDecoder = new TextDecoder('utf-8', { fatal: true })\n return fatalDecoder.decode.bind(fatalDecoder)\n }\n return function (buffer) {\n if (isUtf8(buffer)) {\n return buffer.toString('utf-8')\n }\n throw new TypeError('Invalid utf-8 received.')\n }\n})()\n\nmodule.exports = {\n isConnecting,\n isEstablished,\n isClosing,\n isClosed,\n fireEvent,\n isValidSubprotocol,\n isValidStatusCode,\n websocketMessageReceived,\n utf8Decode,\n isControlFrame,\n isContinuationFrame,\n isTextBinaryFrame,\n isValidOpcode,\n parseExtensions,\n isValidClientWindowBits,\n toArrayBuffer,\n getURLRecord,\n validateCloseCodeAndReason\n}\n","'use strict'\n\nconst { runtimeFeatures } = require('../../util/runtime-features')\nconst { maxUnsigned16Bit, opcodes } = require('./constants')\n\nconst BUFFER_SIZE = 8 * 1024\n\nlet buffer = null\nlet bufIdx = BUFFER_SIZE\n\nconst randomFillSync = runtimeFeatures.has('crypto')\n ? require('node:crypto').randomFillSync\n // not full compatibility, but minimum.\n : function randomFillSync (buffer, _offset, _size) {\n for (let i = 0; i < buffer.length; ++i) {\n buffer[i] = Math.random() * 255 | 0\n }\n return buffer\n }\n\nfunction generateMask () {\n if (bufIdx === BUFFER_SIZE) {\n bufIdx = 0\n randomFillSync((buffer ??= Buffer.allocUnsafeSlow(BUFFER_SIZE)), 0, BUFFER_SIZE)\n }\n return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]]\n}\n\nclass WebsocketFrameSend {\n /**\n * @param {Buffer|undefined} data\n */\n constructor (data) {\n this.frameData = data\n }\n\n createFrame (opcode) {\n const frameData = this.frameData\n const maskKey = generateMask()\n const bodyLength = frameData?.byteLength ?? 0\n\n /** @type {number} */\n let payloadLength = bodyLength // 0-125\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n\n const buffer = Buffer.allocUnsafe(bodyLength + offset)\n\n // Clear first 2 bytes, everything else is overwritten\n buffer[0] = buffer[1] = 0\n buffer[0] |= 0x80 // FIN\n buffer[0] = (buffer[0] & 0xF0) + opcode // opcode\n\n /*! ws. MIT License. Einar Otto Stangvik */\n buffer[offset - 4] = maskKey[0]\n buffer[offset - 3] = maskKey[1]\n buffer[offset - 2] = maskKey[2]\n buffer[offset - 1] = maskKey[3]\n\n buffer[1] = payloadLength\n\n if (payloadLength === 126) {\n buffer.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n // Clear extended payload length\n buffer[2] = buffer[3] = 0\n buffer.writeUIntBE(bodyLength, 4, 6)\n }\n\n buffer[1] |= 0x80 // MASK\n\n // mask body\n for (let i = 0; i < bodyLength; ++i) {\n buffer[offset + i] = frameData[i] ^ maskKey[i & 3]\n }\n\n return buffer\n }\n\n /**\n * @param {Uint8Array} buffer\n */\n static createFastTextFrame (buffer) {\n const maskKey = generateMask()\n\n const bodyLength = buffer.length\n\n // mask body\n for (let i = 0; i < bodyLength; ++i) {\n buffer[i] ^= maskKey[i & 3]\n }\n\n let payloadLength = bodyLength\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n const head = Buffer.allocUnsafeSlow(offset)\n\n head[0] = 0x80 /* FIN */ | opcodes.TEXT /* opcode TEXT */\n head[1] = payloadLength | 0x80 /* MASK */\n head[offset - 4] = maskKey[0]\n head[offset - 3] = maskKey[1]\n head[offset - 2] = maskKey[2]\n head[offset - 1] = maskKey[3]\n\n if (payloadLength === 126) {\n head.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n head[2] = head[3] = 0\n head.writeUIntBE(bodyLength, 4, 6)\n }\n\n return [head, buffer]\n }\n}\n\nmodule.exports = {\n WebsocketFrameSend,\n generateMask // for benchmark\n}\n","'use strict'\n\nconst { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = require('./constants')\nconst { parseExtensions, isClosed, isClosing, isEstablished, isConnecting, validateCloseCodeAndReason } = require('./util')\nconst { makeRequest } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { Headers, getHeadersList } = require('../fetch/headers')\nconst { getDecodeSplit } = require('../fetch/util')\nconst { WebsocketFrameSend } = require('./frame')\nconst assert = require('node:assert')\nconst { runtimeFeatures } = require('../../util/runtime-features')\n\nconst crypto = runtimeFeatures.has('crypto')\n ? require('node:crypto')\n : null\n\nlet warningEmitted = false\n\n/**\n * @see https://websockets.spec.whatwg.org/#concept-websocket-establish\n * @param {URL} url\n * @param {string|string[]} protocols\n * @param {import('./websocket').Handler} handler\n * @param {Partial} options\n */\nfunction establishWebSocketConnection (url, protocols, client, handler, options) {\n // 1. Let requestURL be a copy of url, with its scheme set to \"http\", if url’s\n // scheme is \"ws\", and to \"https\" otherwise.\n const requestURL = url\n\n requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'\n\n // 2. Let request be a new request, whose URL is requestURL, client is client,\n // service-workers mode is \"none\", referrer is \"no-referrer\", mode is\n // \"websocket\", credentials mode is \"include\", cache mode is \"no-store\" ,\n // redirect mode is \"error\", and use-URL-credentials flag is set.\n const request = makeRequest({\n urlList: [requestURL],\n client,\n serviceWorkers: 'none',\n referrer: 'no-referrer',\n mode: 'websocket',\n credentials: 'include',\n cache: 'no-store',\n redirect: 'error',\n useURLCredentials: true\n })\n\n // Note: undici extension, allow setting custom headers.\n if (options.headers) {\n const headersList = getHeadersList(new Headers(options.headers))\n\n request.headersList = headersList\n }\n\n // 3. Append (`Upgrade`, `websocket`) to request’s header list.\n // 4. Append (`Connection`, `Upgrade`) to request’s header list.\n // Note: both of these are handled by undici currently.\n // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397\n\n // 5. Let keyValue be a nonce consisting of a randomly selected\n // 16-byte value that has been forgiving-base64-encoded and\n // isomorphic encoded.\n const keyValue = crypto.randomBytes(16).toString('base64')\n\n // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s\n // header list.\n request.headersList.append('sec-websocket-key', keyValue, true)\n\n // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s\n // header list.\n request.headersList.append('sec-websocket-version', '13', true)\n\n // 8. For each protocol in protocols, combine\n // (`Sec-WebSocket-Protocol`, protocol) in request’s header\n // list.\n for (const protocol of protocols) {\n request.headersList.append('sec-websocket-protocol', protocol, true)\n }\n\n // 9. Let permessageDeflate be a user-agent defined\n // \"permessage-deflate\" extension header value.\n // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673\n const permessageDeflate = 'permessage-deflate; client_max_window_bits'\n\n // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to\n // request’s header list.\n request.headersList.append('sec-websocket-extensions', permessageDeflate, true)\n\n // 11. Fetch request with useParallelQueue set to true, and\n // processResponse given response being these steps:\n const controller = fetching({\n request,\n useParallelQueue: true,\n dispatcher: options.dispatcher,\n processResponse (response) {\n // 1. If response is a network error or its status is not 101,\n // fail the WebSocket connection.\n // if (response.type === 'error' || ((response.socket?.session != null && response.status !== 200) && response.status !== 101)) {\n if (response.type === 'error' || response.status !== 101) {\n // The presence of a session property on the socket indicates HTTP2\n // HTTP1\n if (response.socket?.session == null) {\n failWebsocketConnection(handler, 1002, 'Received network error or non-101 status code.', response.error)\n return\n }\n\n // HTTP2\n if (response.status !== 200) {\n failWebsocketConnection(handler, 1002, 'Received network error or non-200 status code.', response.error)\n return\n }\n }\n\n if (warningEmitted === false && response.socket?.session != null) {\n process.emitWarning('WebSocket over HTTP2 is experimental, and subject to change.', 'ExperimentalWarning')\n warningEmitted = true\n }\n\n // 2. If protocols is not the empty list and extracting header\n // list values given `Sec-WebSocket-Protocol` and response’s\n // header list results in null, failure, or the empty byte\n // sequence, then fail the WebSocket connection.\n if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(handler, 1002, 'Server did not respond with sent protocols.')\n return\n }\n\n // 3. Follow the requirements stated step 2 to step 6, inclusive,\n // of the last set of steps in section 4.1 of The WebSocket\n // Protocol to validate response. This either results in fail\n // the WebSocket connection or the WebSocket connection is\n // established.\n\n // 2. If the response lacks an |Upgrade| header field or the |Upgrade|\n // header field contains a value that is not an ASCII case-\n // insensitive match for the value \"websocket\", the client MUST\n // _Fail the WebSocket Connection_.\n // For H2, no upgrade header is expected.\n if (response.socket.session == null && response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {\n failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to \"websocket\".')\n return\n }\n\n // 3. If the response lacks a |Connection| header field or the\n // |Connection| header field doesn't contain a token that is an\n // ASCII case-insensitive match for the value \"Upgrade\", the client\n // MUST _Fail the WebSocket Connection_.\n // For H2, no connection header is expected.\n if (response.socket.session == null && response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {\n failWebsocketConnection(handler, 1002, 'Server did not set Connection header to \"upgrade\".')\n return\n }\n\n // 4. If the response lacks a |Sec-WebSocket-Accept| header field or\n // the |Sec-WebSocket-Accept| contains a value other than the\n // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-\n // Key| (as a string, not base64-decoded) with the string \"258EAFA5-\n // E914-47DA-95CA-C5AB0DC85B11\" but ignoring any leading and\n // trailing whitespace, the client MUST _Fail the WebSocket\n // Connection_.\n const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')\n const digest = crypto.hash('sha1', keyValue + uid, 'base64')\n if (secWSAccept !== digest) {\n failWebsocketConnection(handler, 1002, 'Incorrect hash received in Sec-WebSocket-Accept header.')\n return\n }\n\n // 5. If the response includes a |Sec-WebSocket-Extensions| header\n // field and this header field indicates the use of an extension\n // that was not present in the client's handshake (the server has\n // indicated an extension not requested by the client), the client\n // MUST _Fail the WebSocket Connection_. (The parsing of this\n // header field to determine which extensions are requested is\n // discussed in Section 9.1.)\n const secExtension = response.headersList.get('Sec-WebSocket-Extensions')\n let extensions\n\n if (secExtension !== null) {\n extensions = parseExtensions(secExtension)\n\n if (!extensions.has('permessage-deflate')) {\n failWebsocketConnection(handler, 1002, 'Sec-WebSocket-Extensions header does not match.')\n return\n }\n }\n\n // 6. If the response includes a |Sec-WebSocket-Protocol| header field\n // and this header field indicates the use of a subprotocol that was\n // not present in the client's handshake (the server has indicated a\n // subprotocol not requested by the client), the client MUST _Fail\n // the WebSocket Connection_.\n const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')\n\n if (secProtocol !== null) {\n const requestProtocols = getDecodeSplit('sec-websocket-protocol', request.headersList)\n\n // The client can request that the server use a specific subprotocol by\n // including the |Sec-WebSocket-Protocol| field in its handshake. If it\n // is specified, the server needs to include the same field and one of\n // the selected subprotocol values in its response for the connection to\n // be established.\n if (!requestProtocols.includes(secProtocol)) {\n failWebsocketConnection(handler, 1002, 'Protocol was not set in the opening handshake.')\n return\n }\n }\n\n response.socket.on('data', handler.onSocketData)\n response.socket.on('close', handler.onSocketClose)\n response.socket.on('error', handler.onSocketError)\n\n handler.wasEverConnected = true\n handler.onConnectionEstablished(response, extensions)\n }\n })\n\n return controller\n}\n\n/**\n * @see https://whatpr.org/websockets/48.html#close-the-websocket\n * @param {import('./websocket').Handler} object\n * @param {number} [code=null]\n * @param {string} [reason='']\n */\nfunction closeWebSocketConnection (object, code, reason, validate = false) {\n // 1. If code was not supplied, let code be null.\n code ??= null\n\n // 2. If reason was not supplied, let reason be the empty string.\n reason ??= ''\n\n // 3. Validate close code and reason with code and reason.\n if (validate) validateCloseCodeAndReason(code, reason)\n\n // 4. Run the first matching steps from the following list:\n // - If object’s ready state is CLOSING (2) or CLOSED (3)\n // - If the WebSocket connection is not yet established [WSP]\n // - If the WebSocket closing handshake has not yet been started [WSP]\n // - Otherwise\n if (isClosed(object.readyState) || isClosing(object.readyState)) {\n // Do nothing.\n } else if (!isEstablished(object.readyState)) {\n // Fail the WebSocket connection and set object’s ready state to CLOSING (2). [WSP]\n failWebsocketConnection(object)\n object.readyState = states.CLOSING\n } else if (!object.closeState.has(sentCloseFrameState.SENT) && !object.closeState.has(sentCloseFrameState.RECEIVED)) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n\n const frame = new WebsocketFrameSend()\n\n // If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n\n // If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n // If code is null and reason is the empty string, the WebSocket Close frame must not have a body.\n // If reason is non-empty but code is null, then set code to 1000 (\"Normal Closure\").\n if (reason.length !== 0 && code === null) {\n code = 1000\n }\n\n // If code is set, then the status code to use in the WebSocket Close frame must be the integer given by code.\n assert(code === null || Number.isInteger(code))\n\n if (code === null && reason.length === 0) {\n frame.frameData = emptyBuffer\n } else if (code !== null && reason === null) {\n frame.frameData = Buffer.allocUnsafe(2)\n frame.frameData.writeUInt16BE(code, 0)\n } else if (code !== null && reason !== null) {\n // If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n frame.frameData = Buffer.allocUnsafe(2 + Buffer.byteLength(reason))\n frame.frameData.writeUInt16BE(code, 0)\n // the body MAY contain UTF-8-encoded data with value /reason/\n frame.frameData.write(reason, 2, 'utf-8')\n } else {\n frame.frameData = emptyBuffer\n }\n\n object.socket.write(frame.createFrame(opcodes.CLOSE))\n\n object.closeState.add(sentCloseFrameState.SENT)\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n object.readyState = states.CLOSING\n } else {\n // Set object’s ready state to CLOSING (2).\n object.readyState = states.CLOSING\n }\n}\n\n/**\n * @param {import('./websocket').Handler} handler\n * @param {number} code\n * @param {string|undefined} reason\n * @param {unknown} cause\n * @returns {void}\n */\nfunction failWebsocketConnection (handler, code, reason, cause) {\n // If _The WebSocket Connection is Established_ prior to the point where\n // the endpoint is required to _Fail the WebSocket Connection_, the\n // endpoint SHOULD send a Close frame with an appropriate status code\n // (Section 7.4) before proceeding to _Close the WebSocket Connection_.\n if (isEstablished(handler.readyState)) {\n closeWebSocketConnection(handler, code, reason, false)\n }\n\n handler.controller.abort()\n\n if (isConnecting(handler.readyState)) {\n // If the connection was not established, we must still emit an 'error' and 'close' events\n handler.onSocketClose()\n } else if (handler.socket?.destroyed === false) {\n handler.socket.destroy()\n }\n}\n\nmodule.exports = {\n establishWebSocketConnection,\n failWebsocketConnection,\n closeWebSocketConnection\n}\n","'use strict'\n\nconst { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require('node:zlib')\nconst { isValidClientWindowBits } = require('./util')\nconst { MessageSizeExceededError } = require('../../core/errors')\n\nconst tail = Buffer.from([0x00, 0x00, 0xff, 0xff])\nconst kBuffer = Symbol('kBuffer')\nconst kLength = Symbol('kLength')\n\nclass PerMessageDeflate {\n /** @type {import('node:zlib').InflateRaw} */\n #inflate\n\n #options = {}\n\n #maxPayloadSize = 0\n\n /**\n * @param {Map} extensions\n */\n constructor (extensions, options) {\n this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover')\n this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits')\n\n this.#maxPayloadSize = options.maxPayloadSize\n }\n\n /**\n * Decompress a compressed payload.\n * @param {Buffer} chunk Compressed data\n * @param {boolean} fin Final fragment flag\n * @param {Function} callback Callback function\n */\n decompress (chunk, fin, callback) {\n // An endpoint uses the following algorithm to decompress a message.\n // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the\n // payload of the message.\n // 2. Decompress the resulting data using DEFLATE.\n if (!this.#inflate) {\n let windowBits = Z_DEFAULT_WINDOWBITS\n\n if (this.#options.serverMaxWindowBits) { // empty values default to Z_DEFAULT_WINDOWBITS\n if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) {\n callback(new Error('Invalid server_max_window_bits'))\n return\n }\n\n windowBits = Number.parseInt(this.#options.serverMaxWindowBits)\n }\n\n try {\n this.#inflate = createInflateRaw({ windowBits })\n } catch (err) {\n callback(err)\n return\n }\n this.#inflate[kBuffer] = []\n this.#inflate[kLength] = 0\n\n this.#inflate.on('data', (data) => {\n this.#inflate[kLength] += data.length\n\n if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) {\n callback(new MessageSizeExceededError())\n this.#inflate.removeAllListeners()\n this.#inflate = null\n return\n }\n\n this.#inflate[kBuffer].push(data)\n })\n\n this.#inflate.on('error', (err) => {\n this.#inflate = null\n callback(err)\n })\n }\n\n this.#inflate.write(chunk)\n if (fin) {\n this.#inflate.write(tail)\n }\n\n this.#inflate.flush(() => {\n if (!this.#inflate) {\n return\n }\n\n const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength])\n\n this.#inflate[kBuffer].length = 0\n this.#inflate[kLength] = 0\n\n callback(null, full)\n })\n }\n}\n\nmodule.exports = { PerMessageDeflate }\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst assert = require('node:assert')\nconst { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require('./constants')\nconst {\n isValidStatusCode,\n isValidOpcode,\n websocketMessageReceived,\n utf8Decode,\n isControlFrame,\n isTextBinaryFrame,\n isContinuationFrame\n} = require('./util')\nconst { failWebsocketConnection } = require('./connection')\nconst { WebsocketFrameSend } = require('./frame')\nconst { PerMessageDeflate } = require('./permessage-deflate')\nconst { MessageSizeExceededError } = require('../../core/errors')\n\n// This code was influenced by ws released under the MIT license.\n// Copyright (c) 2011 Einar Otto Stangvik \n// Copyright (c) 2013 Arnout Kazemier and contributors\n// Copyright (c) 2016 Luigi Pinca and contributors\n\nclass ByteParser extends Writable {\n #buffers = []\n #fragmentsBytes = 0\n #byteOffset = 0\n #loop = false\n\n #state = parserStates.INFO\n\n #info = {}\n #fragments = []\n\n /** @type {Map} */\n #extensions\n\n /** @type {import('./websocket').Handler} */\n #handler\n\n /** @type {number} */\n #maxPayloadSize\n\n /**\n * @param {import('./websocket').Handler} handler\n * @param {Map|null} extensions\n * @param {{ maxPayloadSize?: number }} [options]\n */\n constructor (handler, extensions, options = {}) {\n super()\n\n this.#handler = handler\n this.#extensions = extensions == null ? new Map() : extensions\n this.#maxPayloadSize = options.maxPayloadSize ?? 0\n\n if (this.#extensions.has('permessage-deflate')) {\n this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions, options))\n }\n }\n\n /**\n * @param {Buffer} chunk\n * @param {() => void} callback\n */\n _write (chunk, _, callback) {\n this.#buffers.push(chunk)\n this.#byteOffset += chunk.length\n this.#loop = true\n\n this.run(callback)\n }\n\n #validatePayloadLength () {\n if (\n this.#maxPayloadSize > 0 &&\n !isControlFrame(this.#info.opcode) &&\n this.#info.payloadLength > this.#maxPayloadSize\n ) {\n failWebsocketConnection(this.#handler, 1009, 'Payload size exceeds maximum allowed size')\n return false\n }\n\n return true\n }\n\n /**\n * Runs whenever a new chunk is received.\n * Callback is called whenever there are no more chunks buffering,\n * or not enough bytes are buffered to parse.\n */\n run (callback) {\n while (this.#loop) {\n if (this.#state === parserStates.INFO) {\n // If there aren't enough bytes to parse the payload length, etc.\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n const fin = (buffer[0] & 0x80) !== 0\n const opcode = buffer[0] & 0x0F\n const masked = (buffer[1] & 0x80) === 0x80\n\n const fragmented = !fin && opcode !== opcodes.CONTINUATION\n const payloadLength = buffer[1] & 0x7F\n\n const rsv1 = buffer[0] & 0x40\n const rsv2 = buffer[0] & 0x20\n const rsv3 = buffer[0] & 0x10\n\n if (!isValidOpcode(opcode)) {\n failWebsocketConnection(this.#handler, 1002, 'Invalid opcode received')\n return callback()\n }\n\n if (masked) {\n failWebsocketConnection(this.#handler, 1002, 'Frame cannot be masked')\n return callback()\n }\n\n // MUST be 0 unless an extension is negotiated that defines meanings\n // for non-zero values. If a nonzero value is received and none of\n // the negotiated extensions defines the meaning of such a nonzero\n // value, the receiving endpoint MUST _Fail the WebSocket\n // Connection_.\n // This document allocates the RSV1 bit of the WebSocket header for\n // PMCEs and calls the bit the \"Per-Message Compressed\" bit. On a\n // WebSocket connection where a PMCE is in use, this bit indicates\n // whether a message is compressed or not.\n if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) {\n failWebsocketConnection(this.#handler, 1002, 'Expected RSV1 to be clear.')\n return\n }\n\n if (rsv2 !== 0 || rsv3 !== 0) {\n failWebsocketConnection(this.#handler, 1002, 'RSV1, RSV2, RSV3 must be clear')\n return\n }\n\n if (fragmented && !isTextBinaryFrame(opcode)) {\n // Only text and binary frames can be fragmented\n failWebsocketConnection(this.#handler, 1002, 'Invalid frame type was fragmented.')\n return\n }\n\n // If we are already parsing a text/binary frame and do not receive either\n // a continuation frame or close frame, fail the connection.\n if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) {\n failWebsocketConnection(this.#handler, 1002, 'Expected continuation frame')\n return\n }\n\n if (this.#info.fragmented && fragmented) {\n // A fragmented frame can't be fragmented itself\n failWebsocketConnection(this.#handler, 1002, 'Fragmented frame exceeded 125 bytes.')\n return\n }\n\n // \"All control frames MUST have a payload length of 125 bytes or less\n // and MUST NOT be fragmented.\"\n if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) {\n failWebsocketConnection(this.#handler, 1002, 'Control frame either too large or fragmented')\n return\n }\n\n if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) {\n failWebsocketConnection(this.#handler, 1002, 'Unexpected continuation frame')\n return\n }\n\n if (payloadLength <= 125) {\n this.#info.payloadLength = payloadLength\n this.#state = parserStates.READ_DATA\n\n if (!this.#validatePayloadLength()) {\n return\n }\n } else if (payloadLength === 126) {\n this.#state = parserStates.PAYLOADLENGTH_16\n } else if (payloadLength === 127) {\n this.#state = parserStates.PAYLOADLENGTH_64\n }\n\n if (isTextBinaryFrame(opcode)) {\n this.#info.binaryType = opcode\n this.#info.compressed = rsv1 !== 0\n }\n\n this.#info.opcode = opcode\n this.#info.masked = masked\n this.#info.fin = fin\n this.#info.fragmented = fragmented\n } else if (this.#state === parserStates.PAYLOADLENGTH_16) {\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.payloadLength = buffer.readUInt16BE(0)\n this.#state = parserStates.READ_DATA\n\n if (!this.#validatePayloadLength()) {\n return\n }\n } else if (this.#state === parserStates.PAYLOADLENGTH_64) {\n if (this.#byteOffset < 8) {\n return callback()\n }\n\n const buffer = this.consume(8)\n const upper = buffer.readUInt32BE(0)\n const lower = buffer.readUInt32BE(4)\n\n // 2^31 is the maximum bytes an arraybuffer can contain\n // on 32-bit systems. Although, on 64-bit systems, this is\n // 2^53-1 bytes.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e\n if (upper !== 0 || lower > 2 ** 31 - 1) {\n failWebsocketConnection(this.#handler, 1009, 'Received payload length > 2^31 bytes.')\n return\n }\n\n this.#info.payloadLength = lower\n this.#state = parserStates.READ_DATA\n\n if (!this.#validatePayloadLength()) {\n return\n }\n } else if (this.#state === parserStates.READ_DATA) {\n if (this.#byteOffset < this.#info.payloadLength) {\n return callback()\n }\n\n const body = this.consume(this.#info.payloadLength)\n\n if (isControlFrame(this.#info.opcode)) {\n this.#loop = this.parseControlFrame(body)\n this.#state = parserStates.INFO\n } else {\n if (!this.#info.compressed) {\n this.writeFragments(body)\n\n // If the frame is not fragmented, a message has been received.\n // If the frame is fragmented, it will terminate with a fin bit set\n // and an opcode of 0 (continuation), therefore we handle that when\n // parsing continuation frames, not here.\n if (!this.#info.fragmented && this.#info.fin) {\n websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())\n }\n\n this.#state = parserStates.INFO\n } else {\n this.#extensions.get('permessage-deflate').decompress(\n body,\n this.#info.fin,\n (error, data) => {\n if (error) {\n const code = error instanceof MessageSizeExceededError ? 1009 : 1007\n failWebsocketConnection(this.#handler, code, error.message)\n return\n }\n\n this.writeFragments(data)\n\n // Check cumulative fragment size\n if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) {\n failWebsocketConnection(this.#handler, 1009, new MessageSizeExceededError().message)\n return\n }\n\n if (!this.#info.fin) {\n this.#state = parserStates.INFO\n this.#loop = true\n this.run(callback)\n return\n }\n\n websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())\n\n this.#loop = true\n this.#state = parserStates.INFO\n this.run(callback)\n },\n this.#fragmentsBytes\n )\n\n this.#loop = false\n break\n }\n }\n }\n }\n }\n\n /**\n * Take n bytes from the buffered Buffers\n * @param {number} n\n * @returns {Buffer}\n */\n consume (n) {\n if (n > this.#byteOffset) {\n throw new Error('Called consume() before buffers satiated.')\n } else if (n === 0) {\n return emptyBuffer\n }\n\n this.#byteOffset -= n\n\n const first = this.#buffers[0]\n\n if (first.length > n) {\n // replace with remaining buffer\n this.#buffers[0] = first.subarray(n, first.length)\n return first.subarray(0, n)\n } else if (first.length === n) {\n // prefect match\n return this.#buffers.shift()\n } else {\n let offset = 0\n // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.\n const buffer = Buffer.allocUnsafeSlow(n)\n while (offset !== n) {\n const next = this.#buffers[0]\n const length = next.length\n\n if (length + offset === n) {\n buffer.set(this.#buffers.shift(), offset)\n break\n } else if (length + offset > n) {\n buffer.set(next.subarray(0, n - offset), offset)\n this.#buffers[0] = next.subarray(n - offset)\n break\n } else {\n buffer.set(this.#buffers.shift(), offset)\n offset += length\n }\n }\n\n return buffer\n }\n }\n\n writeFragments (fragment) {\n this.#fragmentsBytes += fragment.length\n this.#fragments.push(fragment)\n }\n\n consumeFragments () {\n const fragments = this.#fragments\n\n if (fragments.length === 1) {\n // single fragment\n this.#fragmentsBytes = 0\n return fragments.shift()\n }\n\n let offset = 0\n // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.\n const output = Buffer.allocUnsafeSlow(this.#fragmentsBytes)\n\n for (let i = 0; i < fragments.length; ++i) {\n const buffer = fragments[i]\n output.set(buffer, offset)\n offset += buffer.length\n }\n\n this.#fragments = []\n this.#fragmentsBytes = 0\n\n return output\n }\n\n parseCloseBody (data) {\n assert(data.length !== 1)\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n /** @type {number|undefined} */\n let code\n\n if (data.length >= 2) {\n // _The WebSocket Connection Close Code_ is\n // defined as the status code (Section 7.4) contained in the first Close\n // control frame received by the application\n code = data.readUInt16BE(0)\n }\n\n if (code !== undefined && !isValidStatusCode(code)) {\n return { code: 1002, reason: 'Invalid status code', error: true }\n }\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6\n /** @type {Buffer} */\n let reason = data.subarray(2)\n\n // Remove BOM\n if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {\n reason = reason.subarray(3)\n }\n\n try {\n reason = utf8Decode(reason)\n } catch {\n return { code: 1007, reason: 'Invalid UTF-8', error: true }\n }\n\n return { code, reason, error: false }\n }\n\n /**\n * Parses control frames.\n * @param {Buffer} body\n */\n parseControlFrame (body) {\n const { opcode, payloadLength } = this.#info\n\n if (opcode === opcodes.CLOSE) {\n if (payloadLength === 1) {\n failWebsocketConnection(this.#handler, 1002, 'Received close frame with a 1-byte body.')\n return false\n }\n\n this.#info.closeInfo = this.parseCloseBody(body)\n\n if (this.#info.closeInfo.error) {\n const { code, reason } = this.#info.closeInfo\n\n failWebsocketConnection(this.#handler, code, reason)\n return false\n }\n\n // Upon receiving such a frame, the other peer sends a\n // Close frame in response, if it hasn't already sent one.\n if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n // If an endpoint receives a Close frame and did not previously send a\n // Close frame, the endpoint MUST send a Close frame in response. (When\n // sending a Close frame in response, the endpoint typically echos the\n // status code it received.)\n let body = emptyBuffer\n if (this.#info.closeInfo.code) {\n body = Buffer.allocUnsafe(2)\n body.writeUInt16BE(this.#info.closeInfo.code, 0)\n }\n const closeFrame = new WebsocketFrameSend(body)\n\n this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE))\n this.#handler.closeState.add(sentCloseFrameState.SENT)\n }\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this.#handler.readyState = states.CLOSING\n this.#handler.closeState.add(sentCloseFrameState.RECEIVED)\n\n return false\n } else if (opcode === opcodes.PING) {\n // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in\n // response, unless it already received a Close frame.\n // A Pong frame sent in response to a Ping frame must have identical\n // \"Application data\"\n\n if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n const frame = new WebsocketFrameSend(body)\n\n this.#handler.socket.write(frame.createFrame(opcodes.PONG))\n\n this.#handler.onPing(body)\n }\n } else if (opcode === opcodes.PONG) {\n // A Pong frame MAY be sent unsolicited. This serves as a\n // unidirectional heartbeat. A response to an unsolicited Pong frame is\n // not expected.\n this.#handler.onPong(body)\n }\n\n return true\n }\n\n get closingInfo () {\n return this.#info.closeInfo\n }\n}\n\nmodule.exports = {\n ByteParser\n}\n","'use strict'\n\nconst { WebsocketFrameSend } = require('./frame')\nconst { opcodes, sendHints } = require('./constants')\nconst FixedQueue = require('../../dispatcher/fixed-queue')\n\n/**\n * @typedef {object} SendQueueNode\n * @property {Promise | null} promise\n * @property {((...args: any[]) => any)} callback\n * @property {Buffer | null} frame\n */\n\nclass SendQueue {\n /**\n * @type {FixedQueue}\n */\n #queue = new FixedQueue()\n\n /**\n * @type {boolean}\n */\n #running = false\n\n /** @type {import('node:net').Socket} */\n #socket\n\n constructor (socket) {\n this.#socket = socket\n }\n\n add (item, cb, hint) {\n if (hint !== sendHints.blob) {\n if (!this.#running) {\n // TODO(@tsctx): support fast-path for string on running\n if (hint === sendHints.text) {\n // special fast-path for string\n const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item)\n this.#socket.cork()\n this.#socket.write(head)\n this.#socket.write(body, cb)\n this.#socket.uncork()\n } else {\n // direct writing\n this.#socket.write(createFrame(item, hint), cb)\n }\n } else {\n /** @type {SendQueueNode} */\n const node = {\n promise: null,\n callback: cb,\n frame: createFrame(item, hint)\n }\n this.#queue.push(node)\n }\n return\n }\n\n /** @type {SendQueueNode} */\n const node = {\n promise: item.arrayBuffer().then((ab) => {\n node.promise = null\n node.frame = createFrame(ab, hint)\n }),\n callback: cb,\n frame: null\n }\n\n this.#queue.push(node)\n\n if (!this.#running) {\n this.#run()\n }\n }\n\n async #run () {\n this.#running = true\n const queue = this.#queue\n while (!queue.isEmpty()) {\n const node = queue.shift()\n // wait pending promise\n if (node.promise !== null) {\n await node.promise\n }\n // write\n this.#socket.write(node.frame, node.callback)\n // cleanup\n node.callback = node.frame = null\n }\n this.#running = false\n }\n}\n\nfunction createFrame (data, hint) {\n return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY)\n}\n\nfunction toBuffer (data, hint) {\n switch (hint) {\n case sendHints.text:\n case sendHints.typedArray:\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n case sendHints.arrayBuffer:\n case sendHints.blob:\n return new Uint8Array(data)\n }\n}\n\nmodule.exports = { SendQueue }\n","'use strict'\n\nconst { isArrayBuffer } = require('node:util/types')\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('../fetch/data-url')\nconst { environmentSettingsObject } = require('../fetch/util')\nconst { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = require('./constants')\nconst {\n isConnecting,\n isEstablished,\n isClosing,\n isClosed,\n isValidSubprotocol,\n fireEvent,\n utf8Decode,\n toArrayBuffer,\n getURLRecord\n} = require('./util')\nconst { establishWebSocketConnection, closeWebSocketConnection, failWebsocketConnection } = require('./connection')\nconst { ByteParser } = require('./receiver')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { getGlobalDispatcher } = require('../../global')\nconst { ErrorEvent, CloseEvent, createFastMessageEvent } = require('./events')\nconst { SendQueue } = require('./sender')\nconst { WebsocketFrameSend } = require('./frame')\nconst { channels } = require('../../core/diagnostics')\n\nfunction getSocketAddress (socket) {\n if (typeof socket?.address === 'function') {\n return socket.address()\n }\n\n if (typeof socket?.session?.socket?.address === 'function') {\n return socket.session.socket.address()\n }\n\n return null\n}\n\n/**\n * @typedef {object} Handler\n * @property {(response: any, extensions?: string[]) => void} onConnectionEstablished\n * @property {(opcode: number, data: Buffer) => void} onMessage\n * @property {(error: Error) => void} onParserError\n * @property {() => void} onParserDrain\n * @property {(chunk: Buffer) => void} onSocketData\n * @property {(err: Error) => void} onSocketError\n * @property {() => void} onSocketClose\n * @property {(body: Buffer) => void} onPing\n * @property {(body: Buffer) => void} onPong\n *\n * @property {number} readyState\n * @property {import('stream').Duplex} socket\n * @property {Set} closeState\n * @property {import('../fetch/index').Fetch} controller\n * @property {boolean} [wasEverConnected=false]\n */\n\n// https://websockets.spec.whatwg.org/#interface-definition\nclass WebSocket extends EventTarget {\n #events = {\n open: null,\n error: null,\n close: null,\n message: null\n }\n\n #bufferedAmount = 0\n #protocol = ''\n #extensions = ''\n\n /** @type {SendQueue} */\n #sendQueue\n\n /** @type {Handler} */\n #handler = {\n onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),\n onMessage: (opcode, data) => this.#onMessage(opcode, data),\n onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),\n onParserDrain: () => this.#onParserDrain(),\n onSocketData: (chunk) => {\n if (!this.#parser.write(chunk)) {\n this.#handler.socket.pause()\n }\n },\n onSocketError: (err) => {\n this.#handler.readyState = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(err)\n }\n\n this.#handler.socket.destroy()\n },\n onSocketClose: () => this.#onSocketClose(),\n onPing: (body) => {\n if (channels.ping.hasSubscribers) {\n channels.ping.publish({\n payload: body,\n websocket: this\n })\n }\n },\n onPong: (body) => {\n if (channels.pong.hasSubscribers) {\n channels.pong.publish({\n payload: body,\n websocket: this\n })\n }\n },\n\n readyState: states.CONNECTING,\n socket: null,\n closeState: new Set(),\n controller: null,\n wasEverConnected: false\n }\n\n #url\n #binaryType\n /** @type {import('./receiver').ByteParser} */\n #parser\n\n /**\n * @param {string} url\n * @param {string|string[]} protocols\n */\n constructor (url, protocols = []) {\n super()\n\n webidl.util.markAsUncloneable(this)\n\n const prefix = 'WebSocket constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols, prefix, 'options')\n\n url = webidl.converters.USVString(url)\n protocols = options.protocols\n\n // 1. Let baseURL be this's relevant settings object's API base URL.\n const baseURL = environmentSettingsObject.settingsObject.baseUrl\n\n // 2. Let urlRecord be the result of getting a URL record given url and baseURL.\n const urlRecord = getURLRecord(url, baseURL)\n\n // 3. If protocols is a string, set protocols to a sequence consisting\n // of just that string.\n if (typeof protocols === 'string') {\n protocols = [protocols]\n }\n\n // 4. If any of the values in protocols occur more than once or otherwise\n // fail to match the requirements for elements that comprise the value\n // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket\n // protocol, then throw a \"SyntaxError\" DOMException.\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 5. Set this's url to urlRecord.\n this.#url = new URL(urlRecord.href)\n\n // 6. Let client be this's relevant settings object.\n const client = environmentSettingsObject.settingsObject\n\n // 7. Run this step in parallel:\n // 7.1. Establish a WebSocket connection given urlRecord, protocols,\n // and client.\n this.#handler.controller = establishWebSocketConnection(\n urlRecord,\n protocols,\n client,\n this.#handler,\n options\n )\n\n // Each WebSocket object has an associated ready state, which is a\n // number representing the state of the connection. Initially it must\n // be CONNECTING (0).\n this.#handler.readyState = WebSocket.CONNECTING\n\n // The extensions attribute must initially return the empty string.\n\n // The protocol attribute must initially return the empty string.\n\n // Each WebSocket object has an associated binary type, which is a\n // BinaryType. Initially it must be \"blob\".\n this.#binaryType = 'blob'\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-close\n * @param {number|undefined} code\n * @param {string|undefined} reason\n */\n close (code = undefined, reason = undefined) {\n webidl.brandCheck(this, WebSocket)\n\n const prefix = 'WebSocket.close'\n\n if (code !== undefined) {\n code = webidl.converters['unsigned short'](code, prefix, 'code', webidl.attributes.Clamp)\n }\n\n if (reason !== undefined) {\n reason = webidl.converters.USVString(reason)\n }\n\n // 1. If code is the special value \"missing\", then set code to null.\n code ??= null\n\n // 2. If reason is the special value \"missing\", then set reason to the empty string.\n reason ??= ''\n\n // 3. Close the WebSocket with this, code, and reason.\n closeWebSocketConnection(this.#handler, code, reason, true)\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-send\n * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data\n */\n send (data) {\n webidl.brandCheck(this, WebSocket)\n\n const prefix = 'WebSocket.send'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n data = webidl.converters.WebSocketSendData(data, prefix, 'data')\n\n // 1. If this's ready state is CONNECTING, then throw an\n // \"InvalidStateError\" DOMException.\n if (isConnecting(this.#handler.readyState)) {\n throw new DOMException('Sent before connected.', 'InvalidStateError')\n }\n\n // 2. Run the appropriate set of steps from the following list:\n // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1\n // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n\n if (!isEstablished(this.#handler.readyState) || isClosing(this.#handler.readyState)) {\n return\n }\n\n // If data is a string\n if (typeof data === 'string') {\n // If the WebSocket connection is established and the WebSocket\n // closing handshake has not yet started, then the user agent\n // must send a WebSocket Message comprised of the data argument\n // using a text frame opcode; if the data cannot be sent, e.g.\n // because it would need to be buffered but the buffer is full,\n // the user agent must flag the WebSocket as full and then close\n // the WebSocket connection. Any invocation of this method with a\n // string argument that does not throw an exception must increase\n // the bufferedAmount attribute by the number of bytes needed to\n // express the argument as UTF-8.\n\n const buffer = Buffer.from(data)\n\n this.#bufferedAmount += buffer.byteLength\n this.#sendQueue.add(buffer, () => {\n this.#bufferedAmount -= buffer.byteLength\n }, sendHints.text)\n } else if (isArrayBuffer(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need\n // to be buffered but the buffer is full, the user agent must flag\n // the WebSocket as full and then close the WebSocket connection.\n // The data to be sent is the data stored in the buffer described\n // by the ArrayBuffer object. Any invocation of this method with an\n // ArrayBuffer argument that does not throw an exception must\n // increase the bufferedAmount attribute by the length of the\n // ArrayBuffer in bytes.\n\n this.#bufferedAmount += data.byteLength\n this.#sendQueue.add(data, () => {\n this.#bufferedAmount -= data.byteLength\n }, sendHints.arrayBuffer)\n } else if (ArrayBuffer.isView(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The\n // data to be sent is the data stored in the section of the buffer\n // described by the ArrayBuffer object that data references. Any\n // invocation of this method with this kind of argument that does\n // not throw an exception must increase the bufferedAmount attribute\n // by the length of data’s buffer in bytes.\n\n this.#bufferedAmount += data.byteLength\n this.#sendQueue.add(data, () => {\n this.#bufferedAmount -= data.byteLength\n }, sendHints.typedArray)\n } else if (webidl.is.Blob(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The data\n // to be sent is the raw data represented by the Blob object. Any\n // invocation of this method with a Blob argument that does not throw\n // an exception must increase the bufferedAmount attribute by the size\n // of the Blob object’s raw data, in bytes.\n\n this.#bufferedAmount += data.size\n this.#sendQueue.add(data, () => {\n this.#bufferedAmount -= data.size\n }, sendHints.blob)\n }\n }\n\n get readyState () {\n webidl.brandCheck(this, WebSocket)\n\n // The readyState getter steps are to return this's ready state.\n return this.#handler.readyState\n }\n\n get bufferedAmount () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#bufferedAmount\n }\n\n get url () {\n webidl.brandCheck(this, WebSocket)\n\n // The url getter steps are to return this's url, serialized.\n return URLSerializer(this.#url)\n }\n\n get extensions () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#extensions\n }\n\n get protocol () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#protocol\n }\n\n get onopen () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.open\n }\n\n set onopen (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('open', listener)\n this.#events.open = fn\n } else {\n this.#events.open = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('error', listener)\n this.#events.error = fn\n } else {\n this.#events.error = null\n }\n }\n\n get onclose () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.close\n }\n\n set onclose (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.close) {\n this.removeEventListener('close', this.#events.close)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('close', listener)\n this.#events.close = fn\n } else {\n this.#events.close = null\n }\n }\n\n get onmessage () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.message\n }\n\n set onmessage (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('message', listener)\n this.#events.message = fn\n } else {\n this.#events.message = null\n }\n }\n\n get binaryType () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#binaryType\n }\n\n set binaryType (type) {\n webidl.brandCheck(this, WebSocket)\n\n if (type !== 'blob' && type !== 'arraybuffer') {\n this.#binaryType = 'blob'\n } else {\n this.#binaryType = type\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n */\n #onConnectionEstablished (response, parsedExtensions) {\n // processResponse is called when the \"response's header list has been received and initialized.\"\n // once this happens, the connection is open\n this.#handler.socket = response.socket\n\n // Get maxPayloadSize from dispatcher options\n const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize\n\n const parser = new ByteParser(this.#handler, parsedExtensions, {\n maxPayloadSize\n })\n parser.on('drain', () => this.#handler.onParserDrain())\n parser.on('error', (err) => this.#handler.onParserError(err))\n\n this.#parser = parser\n this.#sendQueue = new SendQueue(response.socket)\n\n // 1. Change the ready state to OPEN (1).\n this.#handler.readyState = states.OPEN\n\n // 2. Change the extensions attribute’s value to the extensions in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\n const extensions = response.headersList.get('sec-websocket-extensions')\n\n if (extensions !== null) {\n this.#extensions = extensions\n }\n\n // 3. Change the protocol attribute’s value to the subprotocol in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9\n const protocol = response.headersList.get('sec-websocket-protocol')\n\n if (protocol !== null) {\n this.#protocol = protocol\n }\n\n // 4. Fire an event named open at the WebSocket object.\n fireEvent('open', this)\n\n if (channels.open.hasSubscribers) {\n // Convert headers to a plain object for the event\n const headers = response.headersList.entries\n channels.open.publish({\n address: getSocketAddress(response.socket),\n protocol: this.#protocol,\n extensions: this.#extensions,\n websocket: this,\n handshakeResponse: {\n status: response.status,\n statusText: response.statusText,\n headers\n }\n })\n }\n }\n\n #onMessage (type, data) {\n // 1. If ready state is not OPEN (1), then return.\n if (this.#handler.readyState !== states.OPEN) {\n return\n }\n\n // 2. Let dataForEvent be determined by switching on type and binary type:\n let dataForEvent\n\n if (type === opcodes.TEXT) {\n // -> type indicates that the data is Text\n // a new DOMString containing data\n try {\n dataForEvent = utf8Decode(data)\n } catch {\n failWebsocketConnection(this.#handler, 1007, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n if (this.#binaryType === 'blob') {\n // -> type indicates that the data is Binary and binary type is \"blob\"\n // a new Blob object, created in the relevant Realm of the WebSocket\n // object, that represents data as its raw data\n dataForEvent = new Blob([data])\n } else {\n // -> type indicates that the data is Binary and binary type is \"arraybuffer\"\n // a new ArrayBuffer object, created in the relevant Realm of the\n // WebSocket object, whose contents are data\n dataForEvent = toArrayBuffer(data)\n }\n }\n\n // 3. Fire an event named message at the WebSocket object, using MessageEvent,\n // with the origin attribute initialized to the serialization of the WebSocket\n // object’s url's origin, and the data attribute initialized to dataForEvent.\n fireEvent('message', this, createFastMessageEvent, {\n origin: this.#url.origin,\n data: dataForEvent\n })\n }\n\n #onParserDrain () {\n this.#handler.socket.resume()\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4\n */\n #onSocketClose () {\n // If the TCP connection was closed after the\n // WebSocket closing handshake was completed, the WebSocket connection\n // is said to have been closed _cleanly_.\n const wasClean =\n this.#handler.closeState.has(sentCloseFrameState.SENT) &&\n this.#handler.closeState.has(sentCloseFrameState.RECEIVED)\n\n let code = 1005\n let reason = ''\n\n const result = this.#parser?.closingInfo\n\n if (result && !result.error) {\n code = result.code ?? 1005\n reason = result.reason\n }\n\n // 1. Change the ready state to CLOSED (3).\n this.#handler.readyState = states.CLOSED\n\n // 2. If the user agent was required to fail the WebSocket\n // connection, or if the WebSocket connection was closed\n // after being flagged as full, fire an event named error\n // at the WebSocket object.\n if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n // If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n code = 1006\n\n fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {\n error: new TypeError(reason)\n })\n }\n\n // 3. Fire an event named close at the WebSocket object,\n // using CloseEvent, with the wasClean attribute\n // initialized to true if the connection closed cleanly\n // and false otherwise, the code attribute initialized to\n // the WebSocket connection close code, and the reason\n // attribute initialized to the result of applying UTF-8\n // decode without BOM to the WebSocket connection close\n // reason.\n // TODO: process.nextTick\n fireEvent('close', this, (type, init) => new CloseEvent(type, init), {\n wasClean, code, reason\n })\n\n if (channels.close.hasSubscribers) {\n channels.close.publish({\n websocket: this,\n code,\n reason\n })\n }\n }\n\n /**\n * @param {WebSocket} ws\n * @param {Buffer|undefined} buffer\n */\n static ping (ws, buffer) {\n if (Buffer.isBuffer(buffer)) {\n if (buffer.length > 125) {\n throw new TypeError('A PING frame cannot have a body larger than 125 bytes.')\n }\n } else if (buffer !== undefined) {\n throw new TypeError('Expected buffer payload')\n }\n\n // An endpoint MAY send a Ping frame any time after the connection is\n // established and before the connection is closed.\n const readyState = ws.#handler.readyState\n\n if (isEstablished(readyState) && !isClosing(readyState) && !isClosed(readyState)) {\n const frame = new WebsocketFrameSend(buffer)\n ws.#handler.socket.write(frame.createFrame(opcodes.PING))\n }\n }\n}\n\nconst { ping } = WebSocket\nReflect.deleteProperty(WebSocket, 'ping')\n\n// https://websockets.spec.whatwg.org/#dom-websocket-connecting\nWebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING\n// https://websockets.spec.whatwg.org/#dom-websocket-open\nWebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN\n// https://websockets.spec.whatwg.org/#dom-websocket-closing\nWebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING\n// https://websockets.spec.whatwg.org/#dom-websocket-closed\nWebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED\n\nObject.defineProperties(WebSocket.prototype, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors,\n url: kEnumerableProperty,\n readyState: kEnumerableProperty,\n bufferedAmount: kEnumerableProperty,\n onopen: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onclose: kEnumerableProperty,\n close: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n binaryType: kEnumerableProperty,\n send: kEnumerableProperty,\n extensions: kEnumerableProperty,\n protocol: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocket',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(WebSocket, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors\n})\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.DOMString\n)\n\nwebidl.converters['DOMString or sequence'] = function (V, prefix, argument) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT && Symbol.iterator in V) {\n return webidl.converters['sequence'](V)\n }\n\n return webidl.converters.DOMString(V, prefix, argument)\n}\n\n// This implements the proposal made in https://github.com/whatwg/websockets/issues/42\nwebidl.converters.WebSocketInit = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.converters['DOMString or sequence'],\n defaultValue: () => []\n },\n {\n key: 'dispatcher',\n converter: webidl.converters.any,\n defaultValue: () => getGlobalDispatcher()\n },\n {\n key: 'headers',\n converter: webidl.nullableConverter(webidl.converters.HeadersInit)\n }\n])\n\nwebidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT && !(Symbol.iterator in V)) {\n return webidl.converters.WebSocketInit(V)\n }\n\n return { protocols: webidl.converters['DOMString or sequence'](V) }\n}\n\nwebidl.converters.WebSocketSendData = function (V) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {\n if (webidl.is.Blob(V)) {\n return V\n }\n\n if (webidl.is.BufferSource(V)) {\n return V\n }\n }\n\n return webidl.converters.USVString(V)\n}\n\nmodule.exports = {\n WebSocket,\n ping\n}\n","'use strict'\n\nconst { webidl } = require('../../webidl')\nconst { validateCloseCodeAndReason } = require('../util')\nconst { kConstruct } = require('../../../core/symbols')\nconst { kEnumerableProperty } = require('../../../core/util')\n\nfunction createInheritableDOMException () {\n // https://github.com/nodejs/node/issues/59677\n class Test extends DOMException {\n get reason () {\n return ''\n }\n }\n\n if (new Test().reason !== undefined) {\n return DOMException\n }\n\n return new Proxy(DOMException, {\n construct (target, args, newTarget) {\n const instance = Reflect.construct(target, args, target)\n Object.setPrototypeOf(instance, newTarget.prototype)\n return instance\n }\n })\n}\n\nclass WebSocketError extends createInheritableDOMException() {\n #closeCode\n #reason\n\n constructor (message = '', init = undefined) {\n message = webidl.converters.DOMString(message, 'WebSocketError', 'message')\n\n // 1. Set this 's name to \" WebSocketError \".\n // 2. Set this 's message to message .\n super(message, 'WebSocketError')\n\n if (init === kConstruct) {\n return\n } else if (init !== null) {\n init = webidl.converters.WebSocketCloseInfo(init)\n }\n\n // 3. Let code be init [\" closeCode \"] if it exists , or null otherwise.\n let code = init.closeCode ?? null\n\n // 4. Let reason be init [\" reason \"] if it exists , or the empty string otherwise.\n const reason = init.reason ?? ''\n\n // 5. Validate close code and reason with code and reason .\n validateCloseCodeAndReason(code, reason)\n\n // 6. If reason is non-empty, but code is not set, then set code to 1000 (\"Normal Closure\").\n if (reason.length !== 0 && code === null) {\n code = 1000\n }\n\n // 7. Set this 's closeCode to code .\n this.#closeCode = code\n\n // 8. Set this 's reason to reason .\n this.#reason = reason\n }\n\n get closeCode () {\n return this.#closeCode\n }\n\n get reason () {\n return this.#reason\n }\n\n /**\n * @param {string} message\n * @param {number|null} code\n * @param {string} reason\n */\n static createUnvalidatedWebSocketError (message, code, reason) {\n const error = new WebSocketError(message, kConstruct)\n error.#closeCode = code\n error.#reason = reason\n return error\n }\n}\n\nconst { createUnvalidatedWebSocketError } = WebSocketError\ndelete WebSocketError.createUnvalidatedWebSocketError\n\nObject.defineProperties(WebSocketError.prototype, {\n closeCode: kEnumerableProperty,\n reason: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocketError',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nwebidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError)\n\nmodule.exports = { WebSocketError, createUnvalidatedWebSocketError }\n","'use strict'\n\nconst { environmentSettingsObject } = require('../../fetch/util')\nconst { states, opcodes, sentCloseFrameState } = require('../constants')\nconst { webidl } = require('../../webidl')\nconst { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = require('../util')\nconst { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = require('../connection')\nconst { channels } = require('../../../core/diagnostics')\nconst { WebsocketFrameSend } = require('../frame')\nconst { ByteParser } = require('../receiver')\nconst { WebSocketError, createUnvalidatedWebSocketError } = require('./websocketerror')\nconst { kEnumerableProperty } = require('../../../core/util')\nconst { utf8DecodeBytes } = require('../../../encoding')\n\nlet emittedExperimentalWarning = false\n\nclass WebSocketStream {\n // Each WebSocketStream object has an associated url , which is a URL record .\n /** @type {URL} */\n #url\n\n // Each WebSocketStream object has an associated opened promise , which is a promise.\n /** @type {ReturnType} */\n #openedPromise\n\n // Each WebSocketStream object has an associated closed promise , which is a promise.\n /** @type {ReturnType} */\n #closedPromise\n\n // Each WebSocketStream object has an associated readable stream , which is a ReadableStream .\n /** @type {ReadableStream} */\n #readableStream\n /** @type {ReadableStreamDefaultController} */\n #readableStreamController\n\n // Each WebSocketStream object has an associated writable stream , which is a WritableStream .\n /** @type {WritableStream} */\n #writableStream\n\n // Each WebSocketStream object has an associated boolean handshake aborted , which is initially false.\n #handshakeAborted = false\n\n /** @type {import('../websocket').Handler} */\n #handler = {\n // https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol\n onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),\n onMessage: (opcode, data) => this.#onMessage(opcode, data),\n onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),\n onParserDrain: () => this.#handler.socket.resume(),\n onSocketData: (chunk) => {\n if (!this.#parser.write(chunk)) {\n this.#handler.socket.pause()\n }\n },\n onSocketError: (err) => {\n this.#handler.readyState = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(err)\n }\n\n this.#handler.socket.destroy()\n },\n onSocketClose: () => this.#onSocketClose(),\n onPing: () => {},\n onPong: () => {},\n\n readyState: states.CONNECTING,\n socket: null,\n closeState: new Set(),\n controller: null,\n wasEverConnected: false\n }\n\n /** @type {import('../receiver').ByteParser} */\n #parser\n\n constructor (url, options = undefined) {\n if (!emittedExperimentalWarning) {\n process.emitWarning('WebSocketStream is experimental! Expect it to change at any time.', {\n code: 'UNDICI-WSS'\n })\n emittedExperimentalWarning = true\n }\n\n webidl.argumentLengthCheck(arguments, 1, 'WebSocket')\n\n url = webidl.converters.USVString(url)\n if (options !== null) {\n options = webidl.converters.WebSocketStreamOptions(options)\n }\n\n // 1. Let baseURL be this 's relevant settings object 's API base URL .\n const baseURL = environmentSettingsObject.settingsObject.baseUrl\n\n // 2. Let urlRecord be the result of getting a URL record given url and baseURL .\n const urlRecord = getURLRecord(url, baseURL)\n\n // 3. Let protocols be options [\" protocols \"] if it exists , otherwise an empty sequence.\n const protocols = options.protocols\n\n // 4. If any of the values in protocols occur more than once or otherwise fail to match the requirements for elements that comprise the value of ` Sec-WebSocket-Protocol ` fields as defined by The WebSocket Protocol , then throw a \" SyntaxError \" DOMException . [WSP]\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 5. Set this 's url to urlRecord .\n this.#url = urlRecord.toString()\n\n // 6. Set this 's opened promise and closed promise to new promises.\n this.#openedPromise = Promise.withResolvers()\n this.#closedPromise = Promise.withResolvers()\n\n // 7. Apply backpressure to the WebSocket.\n // TODO\n\n // 8. If options [\" signal \"] exists ,\n if (options.signal != null) {\n // 8.1. Let signal be options [\" signal \"].\n const signal = options.signal\n\n // 8.2. If signal is aborted , then reject this 's opened promise and closed promise with signal ’s abort reason\n // and return.\n if (signal.aborted) {\n this.#openedPromise.reject(signal.reason)\n this.#closedPromise.reject(signal.reason)\n return\n }\n\n // 8.3. Add the following abort steps to signal :\n signal.addEventListener('abort', () => {\n // 8.3.1. If the WebSocket connection is not yet established : [WSP]\n if (!isEstablished(this.#handler.readyState)) {\n // 8.3.1.1. Fail the WebSocket connection .\n failWebsocketConnection(this.#handler)\n\n // Set this 's ready state to CLOSING .\n this.#handler.readyState = states.CLOSING\n\n // Reject this 's opened promise and closed promise with signal ’s abort reason .\n this.#openedPromise.reject(signal.reason)\n this.#closedPromise.reject(signal.reason)\n\n // Set this 's handshake aborted to true.\n this.#handshakeAborted = true\n }\n }, { once: true })\n }\n\n // 9. Let client be this 's relevant settings object .\n const client = environmentSettingsObject.settingsObject\n\n // 10. Run this step in parallel :\n // 10.1. Establish a WebSocket connection given urlRecord , protocols , and client . [FETCH]\n this.#handler.controller = establishWebSocketConnection(\n urlRecord,\n protocols,\n client,\n this.#handler,\n options\n )\n }\n\n // The url getter steps are to return this 's url , serialized .\n get url () {\n return this.#url.toString()\n }\n\n // The opened getter steps are to return this 's opened promise .\n get opened () {\n return this.#openedPromise.promise\n }\n\n // The closed getter steps are to return this 's closed promise .\n get closed () {\n return this.#closedPromise.promise\n }\n\n // The close( closeInfo ) method steps are:\n close (closeInfo = undefined) {\n if (closeInfo !== null) {\n closeInfo = webidl.converters.WebSocketCloseInfo(closeInfo)\n }\n\n // 1. Let code be closeInfo [\" closeCode \"] if present, or null otherwise.\n const code = closeInfo.closeCode ?? null\n\n // 2. Let reason be closeInfo [\" reason \"].\n const reason = closeInfo.reason\n\n // 3. Close the WebSocket with this , code , and reason .\n closeWebSocketConnection(this.#handler, code, reason, true)\n }\n\n #write (chunk) {\n // See /websockets/stream/tentative/write.any.html\n chunk = webidl.converters.WebSocketStreamWrite(chunk)\n\n // 1. Let promise be a new promise created in stream ’s relevant realm .\n const promise = Promise.withResolvers()\n\n // 2. Let data be null.\n let data = null\n\n // 3. Let opcode be null.\n let opcode = null\n\n // 4. If chunk is a BufferSource ,\n if (webidl.is.BufferSource(chunk)) {\n // 4.1. Set data to a copy of the bytes given chunk .\n data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk.slice())\n\n // 4.2. Set opcode to a binary frame opcode.\n opcode = opcodes.BINARY\n } else {\n // 5. Otherwise,\n\n // 5.1. Let string be the result of converting chunk to an IDL USVString .\n // If this throws an exception, return a promise rejected with the exception.\n let string\n\n try {\n string = webidl.converters.DOMString(chunk)\n } catch (e) {\n promise.reject(e)\n return promise.promise\n }\n\n // 5.2. Set data to the result of UTF-8 encoding string .\n data = new TextEncoder().encode(string)\n\n // 5.3. Set opcode to a text frame opcode.\n opcode = opcodes.TEXT\n }\n\n // 6. In parallel,\n // 6.1. Wait until there is sufficient buffer space in stream to send the message.\n\n // 6.2. If the closing handshake has not yet started , Send a WebSocket Message to stream comprised of data using opcode .\n if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n const frame = new WebsocketFrameSend(data)\n\n this.#handler.socket.write(frame.createFrame(opcode), () => {\n promise.resolve(undefined)\n })\n }\n\n // 6.3. Queue a global task on the WebSocket task source given stream ’s relevant global object to resolve promise with undefined.\n return promise.promise\n }\n\n /** @type {import('../websocket').Handler['onConnectionEstablished']} */\n #onConnectionEstablished (response, parsedExtensions) {\n this.#handler.socket = response.socket\n\n const parser = new ByteParser(this.#handler, parsedExtensions)\n parser.on('drain', () => this.#handler.onParserDrain())\n parser.on('error', (err) => this.#handler.onParserError(err))\n\n this.#parser = parser\n\n // 1. Change stream ’s ready state to OPEN (1).\n this.#handler.readyState = states.OPEN\n\n // 2. Set stream ’s was ever connected to true.\n // This is done in the opening handshake.\n\n // 3. Let extensions be the extensions in use .\n const extensions = parsedExtensions ?? ''\n\n // 4. Let protocol be the subprotocol in use .\n const protocol = response.headersList.get('sec-websocket-protocol') ?? ''\n\n // 5. Let pullAlgorithm be an action that pulls bytes from stream .\n // 6. Let cancelAlgorithm be an action that cancels stream with reason , given reason .\n // 7. Let readable be a new ReadableStream .\n // 8. Set up readable with pullAlgorithm and cancelAlgorithm .\n const readable = new ReadableStream({\n start: (controller) => {\n this.#readableStreamController = controller\n },\n cancel: (reason) => this.#cancel(reason)\n })\n\n // 9. Let writeAlgorithm be an action that writes chunk to stream , given chunk .\n // 10. Let closeAlgorithm be an action that closes stream .\n // 11. Let abortAlgorithm be an action that aborts stream with reason , given reason .\n // 12. Let writable be a new WritableStream .\n // 13. Set up writable with writeAlgorithm , closeAlgorithm , and abortAlgorithm .\n const writable = new WritableStream({\n write: (chunk) => this.#write(chunk),\n close: () => closeWebSocketConnection(this.#handler, null, null),\n abort: (reason) => this.#closeUsingReason(reason)\n })\n\n // Set stream ’s readable stream to readable .\n this.#readableStream = readable\n\n // Set stream ’s writable stream to writable .\n this.#writableStream = writable\n\n // Resolve stream ’s opened promise with WebSocketOpenInfo «[ \" extensions \" → extensions , \" protocol \" → protocol , \" readable \" → readable , \" writable \" → writable ]».\n this.#openedPromise.resolve({\n extensions,\n protocol,\n readable,\n writable\n })\n }\n\n /** @type {import('../websocket').Handler['onMessage']} */\n #onMessage (type, data) {\n // 1. If stream’s ready state is not OPEN (1), then return.\n if (this.#handler.readyState !== states.OPEN) {\n return\n }\n\n // 2. Let chunk be determined by switching on type:\n // - type indicates that the data is Text\n // a new DOMString containing data\n // - type indicates that the data is Binary\n // a new Uint8Array object, created in the relevant Realm of the\n // WebSocketStream object, whose contents are data\n let chunk\n\n if (type === opcodes.TEXT) {\n try {\n chunk = utf8Decode(data)\n } catch {\n failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n chunk = new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n }\n\n // 3. Enqueue chunk into stream’s readable stream.\n this.#readableStreamController.enqueue(chunk)\n\n // 4. Apply backpressure to the WebSocket.\n }\n\n /** @type {import('../websocket').Handler['onSocketClose']} */\n #onSocketClose () {\n const wasClean =\n this.#handler.closeState.has(sentCloseFrameState.SENT) &&\n this.#handler.closeState.has(sentCloseFrameState.RECEIVED)\n\n // 1. Change the ready state to CLOSED (3).\n this.#handler.readyState = states.CLOSED\n\n // 2. If stream ’s handshake aborted is true, then return.\n if (this.#handshakeAborted) {\n return\n }\n\n // 3. If stream ’s was ever connected is false, then reject stream ’s opened promise with a new WebSocketError.\n if (!this.#handler.wasEverConnected) {\n this.#openedPromise.reject(new WebSocketError('Socket never opened'))\n }\n\n const result = this.#parser?.closingInfo\n\n // 4. Let code be the WebSocket connection close code .\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n // If this Close control frame contains no status code, _The WebSocket\n // Connection Close Code_ is considered to be 1005. If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n let code = result?.code ?? 1005\n\n if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n code = 1006\n }\n\n // 5. Let reason be the result of applying UTF-8 decode without BOM to the WebSocket connection close reason .\n const reason = result?.reason == null ? '' : utf8DecodeBytes(Buffer.from(result.reason))\n\n // 6. If the connection was closed cleanly ,\n if (wasClean) {\n // 6.1. Close stream ’s readable stream .\n this.#readableStreamController.close()\n\n // 6.2. Error stream ’s writable stream with an \" InvalidStateError \" DOMException indicating that a closed WebSocketStream cannot be written to.\n if (!this.#writableStream.locked) {\n this.#writableStream.abort(new DOMException('A closed WebSocketStream cannot be written to', 'InvalidStateError'))\n }\n\n // 6.3. Resolve stream ’s closed promise with WebSocketCloseInfo «[ \" closeCode \" → code , \" reason \" → reason ]».\n this.#closedPromise.resolve({\n closeCode: code,\n reason\n })\n } else {\n // 7. Otherwise,\n\n // 7.1. Let error be a new WebSocketError whose closeCode is code and reason is reason .\n const error = createUnvalidatedWebSocketError('unclean close', code, reason)\n\n // 7.2. Error stream ’s readable stream with error .\n this.#readableStreamController?.error(error)\n\n // 7.3. Error stream ’s writable stream with error .\n this.#writableStream?.abort(error)\n\n // 7.4. Reject stream ’s closed promise with error .\n this.#closedPromise.reject(error)\n }\n }\n\n #closeUsingReason (reason) {\n // 1. Let code be null.\n let code = null\n\n // 2. Let reasonString be the empty string.\n let reasonString = ''\n\n // 3. If reason implements WebSocketError ,\n if (webidl.is.WebSocketError(reason)) {\n // 3.1. Set code to reason ’s closeCode .\n code = reason.closeCode\n\n // 3.2. Set reasonString to reason ’s reason .\n reasonString = reason.reason\n }\n\n // 4. Close the WebSocket with stream , code , and reasonString . If this throws an exception,\n // discard code and reasonString and close the WebSocket with stream .\n closeWebSocketConnection(this.#handler, code, reasonString)\n }\n\n // To cancel a WebSocketStream stream given reason , close using reason giving stream and reason .\n #cancel (reason) {\n this.#closeUsingReason(reason)\n }\n}\n\nObject.defineProperties(WebSocketStream.prototype, {\n url: kEnumerableProperty,\n opened: kEnumerableProperty,\n closed: kEnumerableProperty,\n close: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocketStream',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nwebidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.sequenceConverter(webidl.converters.USVString),\n defaultValue: () => []\n },\n {\n key: 'signal',\n converter: webidl.nullableConverter(webidl.converters.AbortSignal),\n defaultValue: () => null\n }\n])\n\nwebidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([\n {\n key: 'closeCode',\n converter: (V) => webidl.converters['unsigned short'](V, webidl.attributes.EnforceRange)\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n }\n])\n\nwebidl.converters.WebSocketStreamWrite = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n return webidl.converters.BufferSource(V)\n}\n\nmodule.exports = { WebSocketStream }\n","'use strict'\n\n/**\n * Checks if the given value is a valid LastEventId.\n * @param {string} value\n * @returns {boolean}\n */\nfunction isValidLastEventId (value) {\n // LastEventId should not contain U+0000 NULL\n return value.indexOf('\\u0000') === -1\n}\n\n/**\n * Checks if the given value is a base 10 digit.\n * @param {string} value\n * @returns {boolean}\n */\nfunction isASCIINumber (value) {\n if (value.length === 0) return false\n for (let i = 0; i < value.length; i++) {\n if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false\n }\n return true\n}\n\nmodule.exports = {\n isValidLastEventId,\n isASCIINumber\n}\n","'use strict'\nconst { Transform } = require('node:stream')\nconst { isASCIINumber, isValidLastEventId } = require('./util')\n\n/**\n * @type {number[]} BOM\n */\nconst BOM = [0xEF, 0xBB, 0xBF]\n/**\n * @type {10} LF\n */\nconst LF = 0x0A\n/**\n * @type {13} CR\n */\nconst CR = 0x0D\n/**\n * @type {58} COLON\n */\nconst COLON = 0x3A\n/**\n * @type {32} SPACE\n */\nconst SPACE = 0x20\n\n/**\n * @typedef {object} EventSourceStreamEvent\n * @type {object}\n * @property {string} [event] The event type.\n * @property {string} [data] The data of the message.\n * @property {string} [id] A unique ID for the event.\n * @property {string} [retry] The reconnection time, in milliseconds.\n */\n\n/**\n * @typedef eventSourceSettings\n * @type {object}\n * @property {string} [lastEventId] The last event ID received from the server.\n * @property {string} [origin] The origin of the event source.\n * @property {number} [reconnectionTime] The reconnection time, in milliseconds.\n */\n\nclass EventSourceStream extends Transform {\n /**\n * @type {eventSourceSettings}\n */\n state\n\n /**\n * Leading byte-order-mark check.\n * @type {boolean}\n */\n checkBOM = true\n\n /**\n * @type {boolean}\n */\n crlfCheck = false\n\n /**\n * @type {boolean}\n */\n eventEndCheck = false\n\n /**\n * @type {Buffer|null}\n */\n buffer = null\n\n pos = 0\n\n event = {\n data: undefined,\n event: undefined,\n id: undefined,\n retry: undefined\n }\n\n /**\n * @param {object} options\n * @param {boolean} [options.readableObjectMode]\n * @param {eventSourceSettings} [options.eventSourceSettings]\n * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push]\n */\n constructor (options = {}) {\n // Enable object mode as EventSourceStream emits objects of shape\n // EventSourceStreamEvent\n options.readableObjectMode = true\n\n super(options)\n\n this.state = options.eventSourceSettings || {}\n if (options.push) {\n this.push = options.push\n }\n }\n\n /**\n * @param {Buffer} chunk\n * @param {string} _encoding\n * @param {Function} callback\n * @returns {void}\n */\n _transform (chunk, _encoding, callback) {\n if (chunk.length === 0) {\n callback()\n return\n }\n\n // Cache the chunk in the buffer, as the data might not be complete while\n // processing it\n // TODO: Investigate if there is a more performant way to handle\n // incoming chunks\n // see: https://github.com/nodejs/undici/issues/2630\n if (this.buffer) {\n this.buffer = Buffer.concat([this.buffer, chunk])\n } else {\n this.buffer = chunk\n }\n\n // Strip leading byte-order-mark if we opened the stream and started\n // the processing of the incoming data\n if (this.checkBOM) {\n switch (this.buffer.length) {\n case 1:\n // Check if the first byte is the same as the first byte of the BOM\n if (this.buffer[0] === BOM[0]) {\n // If it is, we need to wait for more data\n callback()\n return\n }\n // Set the checkBOM flag to false as we don't need to check for the\n // BOM anymore\n this.checkBOM = false\n\n // The buffer only contains one byte so we need to wait for more data\n callback()\n return\n case 2:\n // Check if the first two bytes are the same as the first two bytes\n // of the BOM\n if (\n this.buffer[0] === BOM[0] &&\n this.buffer[1] === BOM[1]\n ) {\n // If it is, we need to wait for more data, because the third byte\n // is needed to determine if it is the BOM or not\n callback()\n return\n }\n\n // Set the checkBOM flag to false as we don't need to check for the\n // BOM anymore\n this.checkBOM = false\n break\n case 3:\n // Check if the first three bytes are the same as the first three\n // bytes of the BOM\n if (\n this.buffer[0] === BOM[0] &&\n this.buffer[1] === BOM[1] &&\n this.buffer[2] === BOM[2]\n ) {\n // If it is, we can drop the buffered data, as it is only the BOM\n this.buffer = Buffer.alloc(0)\n // Set the checkBOM flag to false as we don't need to check for the\n // BOM anymore\n this.checkBOM = false\n\n // Await more data\n callback()\n return\n }\n // If it is not the BOM, we can start processing the data\n this.checkBOM = false\n break\n default:\n // The buffer is longer than 3 bytes, so we can drop the BOM if it is\n // present\n if (\n this.buffer[0] === BOM[0] &&\n this.buffer[1] === BOM[1] &&\n this.buffer[2] === BOM[2]\n ) {\n // Remove the BOM from the buffer\n this.buffer = this.buffer.subarray(3)\n }\n\n // Set the checkBOM flag to false as we don't need to check for the\n this.checkBOM = false\n break\n }\n }\n\n while (this.pos < this.buffer.length) {\n // If the previous line ended with an end-of-line, we need to check\n // if the next character is also an end-of-line.\n if (this.eventEndCheck) {\n // If the the current character is an end-of-line, then the event\n // is finished and we can process it\n\n // If the previous line ended with a carriage return, we need to\n // check if the current character is a line feed and remove it\n // from the buffer.\n if (this.crlfCheck) {\n // If the current character is a line feed, we can remove it\n // from the buffer and reset the crlfCheck flag\n if (this.buffer[this.pos] === LF) {\n this.buffer = this.buffer.subarray(this.pos + 1)\n this.pos = 0\n this.crlfCheck = false\n\n // It is possible that the line feed is not the end of the\n // event. We need to check if the next character is an\n // end-of-line character to determine if the event is\n // finished. We simply continue the loop to check the next\n // character.\n\n // As we removed the line feed from the buffer and set the\n // crlfCheck flag to false, we basically don't make any\n // distinction between a line feed and a carriage return.\n continue\n }\n this.crlfCheck = false\n }\n\n if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {\n // If the current character is a carriage return, we need to\n // set the crlfCheck flag to true, as we need to check if the\n // next character is a line feed so we can remove it from the\n // buffer\n if (this.buffer[this.pos] === CR) {\n this.crlfCheck = true\n }\n\n this.buffer = this.buffer.subarray(this.pos + 1)\n this.pos = 0\n if (\n this.event.data !== undefined || this.event.event || this.event.id !== undefined || this.event.retry) {\n this.processEvent(this.event)\n }\n this.clearEvent()\n continue\n }\n // If the current character is not an end-of-line, then the event\n // is not finished and we have to reset the eventEndCheck flag\n this.eventEndCheck = false\n continue\n }\n\n // If the current character is an end-of-line, we can process the\n // line\n if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {\n // If the current character is a carriage return, we need to\n // set the crlfCheck flag to true, as we need to check if the\n // next character is a line feed\n if (this.buffer[this.pos] === CR) {\n this.crlfCheck = true\n }\n\n // In any case, we can process the line as we reached an\n // end-of-line character\n this.parseLine(this.buffer.subarray(0, this.pos), this.event)\n\n // Remove the processed line from the buffer\n this.buffer = this.buffer.subarray(this.pos + 1)\n // Reset the position as we removed the processed line from the buffer\n this.pos = 0\n // A line was processed and this could be the end of the event. We need\n // to check if the next line is empty to determine if the event is\n // finished.\n this.eventEndCheck = true\n continue\n }\n\n this.pos++\n }\n\n callback()\n }\n\n /**\n * @param {Buffer} line\n * @param {EventSourceStreamEvent} event\n */\n parseLine (line, event) {\n // If the line is empty (a blank line)\n // Dispatch the event, as defined below.\n // This will be handled in the _transform method\n if (line.length === 0) {\n return\n }\n\n // If the line starts with a U+003A COLON character (:)\n // Ignore the line.\n const colonPosition = line.indexOf(COLON)\n if (colonPosition === 0) {\n return\n }\n\n let field = ''\n let value = ''\n\n // If the line contains a U+003A COLON character (:)\n if (colonPosition !== -1) {\n // Collect the characters on the line before the first U+003A COLON\n // character (:), and let field be that string.\n // TODO: Investigate if there is a more performant way to extract the\n // field\n // see: https://github.com/nodejs/undici/issues/2630\n field = line.subarray(0, colonPosition).toString('utf8')\n\n // Collect the characters on the line after the first U+003A COLON\n // character (:), and let value be that string.\n // If value starts with a U+0020 SPACE character, remove it from value.\n let valueStart = colonPosition + 1\n if (line[valueStart] === SPACE) {\n ++valueStart\n }\n // TODO: Investigate if there is a more performant way to extract the\n // value\n // see: https://github.com/nodejs/undici/issues/2630\n value = line.subarray(valueStart).toString('utf8')\n\n // Otherwise, the string is not empty but does not contain a U+003A COLON\n // character (:)\n } else {\n // Process the field using the steps described below, using the whole\n // line as the field name, and the empty string as the field value.\n field = line.toString('utf8')\n value = ''\n }\n\n // Modify the event with the field name and value. The value is also\n // decoded as UTF-8\n switch (field) {\n case 'data':\n if (event[field] === undefined) {\n event[field] = value\n } else {\n event[field] += `\\n${value}`\n }\n break\n case 'retry':\n if (isASCIINumber(value)) {\n event[field] = value\n }\n break\n case 'id':\n if (isValidLastEventId(value)) {\n event[field] = value\n }\n break\n case 'event':\n if (value.length > 0) {\n event[field] = value\n }\n break\n }\n }\n\n /**\n * @param {EventSourceStreamEvent} event\n */\n processEvent (event) {\n if (event.retry && isASCIINumber(event.retry)) {\n this.state.reconnectionTime = parseInt(event.retry, 10)\n }\n\n if (event.id !== undefined && isValidLastEventId(event.id)) {\n this.state.lastEventId = event.id\n }\n\n // only dispatch event, when data is provided\n if (event.data !== undefined) {\n this.push({\n type: event.event || 'message',\n options: {\n data: event.data,\n lastEventId: this.state.lastEventId,\n origin: this.state.origin\n }\n })\n }\n }\n\n clearEvent () {\n this.event = {\n data: undefined,\n event: undefined,\n id: undefined,\n retry: undefined\n }\n }\n}\n\nmodule.exports = {\n EventSourceStream\n}\n","'use strict'\n\nconst { pipeline } = require('node:stream')\nconst { fetching } = require('../fetch')\nconst { makeRequest } = require('../fetch/request')\nconst { webidl } = require('../webidl')\nconst { EventSourceStream } = require('./eventsource-stream')\nconst { parseMIMEType } = require('../fetch/data-url')\nconst { createFastMessageEvent } = require('../websocket/events')\nconst { isNetworkError } = require('../fetch/response')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { environmentSettingsObject } = require('../fetch/util')\n\nlet experimentalWarned = false\n\n/**\n * A reconnection time, in milliseconds. This must initially be an implementation-defined value,\n * probably in the region of a few seconds.\n *\n * In Comparison:\n * - Chrome uses 3000ms.\n * - Deno uses 5000ms.\n *\n * @type {3000}\n */\nconst defaultReconnectionTime = 3000\n\n/**\n * The readyState attribute represents the state of the connection.\n * @typedef ReadyState\n * @type {0|1|2}\n * @readonly\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev\n */\n\n/**\n * The connection has not yet been established, or it was closed and the user\n * agent is reconnecting.\n * @type {0}\n */\nconst CONNECTING = 0\n\n/**\n * The user agent has an open connection and is dispatching events as it\n * receives them.\n * @type {1}\n */\nconst OPEN = 1\n\n/**\n * The connection is not open, and the user agent is not trying to reconnect.\n * @type {2}\n */\nconst CLOSED = 2\n\n/**\n * Requests for the element will have their mode set to \"cors\" and their credentials mode set to \"same-origin\".\n * @type {'anonymous'}\n */\nconst ANONYMOUS = 'anonymous'\n\n/**\n * Requests for the element will have their mode set to \"cors\" and their credentials mode set to \"include\".\n * @type {'use-credentials'}\n */\nconst USE_CREDENTIALS = 'use-credentials'\n\n/**\n * The EventSource interface is used to receive server-sent events. It\n * connects to a server over HTTP and receives events in text/event-stream\n * format without closing the connection.\n * @extends {EventTarget}\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n * @api public\n */\nclass EventSource extends EventTarget {\n #events = {\n open: null,\n error: null,\n message: null\n }\n\n #url\n #withCredentials = false\n\n /**\n * @type {ReadyState}\n */\n #readyState = CONNECTING\n\n #request = null\n #controller = null\n\n #dispatcher\n\n /**\n * @type {import('./eventsource-stream').eventSourceSettings}\n */\n #state\n\n /**\n * Creates a new EventSource object.\n * @param {string} url\n * @param {EventSourceInit} [eventSourceInitDict={}]\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface\n */\n constructor (url, eventSourceInitDict = {}) {\n // 1. Let ev be a new EventSource object.\n super()\n\n webidl.util.markAsUncloneable(this)\n\n const prefix = 'EventSource constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n if (!experimentalWarned) {\n experimentalWarned = true\n process.emitWarning('EventSource is experimental, expect them to change at any time.', {\n code: 'UNDICI-ES'\n })\n }\n\n url = webidl.converters.USVString(url)\n eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict')\n\n this.#dispatcher = eventSourceInitDict.node.dispatcher || eventSourceInitDict.dispatcher\n this.#state = {\n lastEventId: '',\n reconnectionTime: eventSourceInitDict.node.reconnectionTime\n }\n\n // 2. Let settings be ev's relevant settings object.\n // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object\n const settings = environmentSettingsObject\n\n let urlRecord\n\n try {\n // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings.\n urlRecord = new URL(url, settings.settingsObject.baseUrl)\n this.#state.origin = urlRecord.origin\n } catch (e) {\n // 4. If urlRecord is failure, then throw a \"SyntaxError\" DOMException.\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 5. Set ev's url to urlRecord.\n this.#url = urlRecord.href\n\n // 6. Let corsAttributeState be Anonymous.\n let corsAttributeState = ANONYMOUS\n\n // 7. If the value of eventSourceInitDict's withCredentials member is true,\n // then set corsAttributeState to Use Credentials and set ev's\n // withCredentials attribute to true.\n if (eventSourceInitDict.withCredentials === true) {\n corsAttributeState = USE_CREDENTIALS\n this.#withCredentials = true\n }\n\n // 8. Let request be the result of creating a potential-CORS request given\n // urlRecord, the empty string, and corsAttributeState.\n const initRequest = {\n redirect: 'follow',\n keepalive: true,\n // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes\n mode: 'cors',\n credentials: corsAttributeState === 'anonymous'\n ? 'same-origin'\n : 'omit',\n referrer: 'no-referrer'\n }\n\n // 9. Set request's client to settings.\n initRequest.client = environmentSettingsObject.settingsObject\n\n // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list.\n initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]]\n\n // 11. Set request's cache mode to \"no-store\".\n initRequest.cache = 'no-store'\n\n // 12. Set request's initiator type to \"other\".\n initRequest.initiator = 'other'\n\n initRequest.urlList = [new URL(this.#url)]\n\n // 13. Set ev's request to request.\n this.#request = makeRequest(initRequest)\n\n this.#connect()\n }\n\n /**\n * Returns the state of this EventSource object's connection. It can have the\n * values described below.\n * @returns {ReadyState}\n * @readonly\n */\n get readyState () {\n return this.#readyState\n }\n\n /**\n * Returns the URL providing the event stream.\n * @readonly\n * @returns {string}\n */\n get url () {\n return this.#url\n }\n\n /**\n * Returns a boolean indicating whether the EventSource object was\n * instantiated with CORS credentials set (true), or not (false, the default).\n */\n get withCredentials () {\n return this.#withCredentials\n }\n\n #connect () {\n if (this.#readyState === CLOSED) return\n\n this.#readyState = CONNECTING\n\n const fetchParams = {\n request: this.#request,\n dispatcher: this.#dispatcher\n }\n\n // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection.\n const processEventSourceEndOfBody = (response) => {\n if (!isNetworkError(response)) {\n return this.#reconnect()\n }\n }\n\n // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody...\n fetchParams.processResponseEndOfBody = processEventSourceEndOfBody\n\n // and processResponse set to the following steps given response res:\n fetchParams.processResponse = (response) => {\n // 1. If res is an aborted network error, then fail the connection.\n\n if (isNetworkError(response)) {\n // 1. When a user agent is to fail the connection, the user agent\n // must queue a task which, if the readyState attribute is set to a\n // value other than CLOSED, sets the readyState attribute to CLOSED\n // and fires an event named error at the EventSource object. Once the\n // user agent has failed the connection, it does not attempt to\n // reconnect.\n if (response.aborted) {\n this.close()\n this.dispatchEvent(new Event('error'))\n return\n // 2. Otherwise, if res is a network error, then reestablish the\n // connection, unless the user agent knows that to be futile, in\n // which case the user agent may fail the connection.\n } else {\n this.#reconnect()\n return\n }\n }\n\n // 3. Otherwise, if res's status is not 200, or if res's `Content-Type`\n // is not `text/event-stream`, then fail the connection.\n const contentType = response.headersList.get('content-type', true)\n const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure'\n const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream'\n if (\n response.status !== 200 ||\n contentTypeValid === false\n ) {\n this.close()\n this.dispatchEvent(new Event('error'))\n return\n }\n\n // 4. Otherwise, announce the connection and interpret res's body\n // line by line.\n\n // When a user agent is to announce the connection, the user agent\n // must queue a task which, if the readyState attribute is set to a\n // value other than CLOSED, sets the readyState attribute to OPEN\n // and fires an event named open at the EventSource object.\n // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model\n this.#readyState = OPEN\n this.dispatchEvent(new Event('open'))\n\n // If redirected to a different origin, set the origin to the new origin.\n this.#state.origin = response.urlList[response.urlList.length - 1].origin\n\n const eventSourceStream = new EventSourceStream({\n eventSourceSettings: this.#state,\n push: (event) => {\n this.dispatchEvent(createFastMessageEvent(\n event.type,\n event.options\n ))\n }\n })\n\n pipeline(response.body.stream,\n eventSourceStream,\n (error) => {\n if (\n error?.aborted === false\n ) {\n this.close()\n this.dispatchEvent(new Event('error'))\n }\n })\n }\n\n this.#controller = fetching(fetchParams)\n }\n\n /**\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model\n * @returns {void}\n */\n #reconnect () {\n // When a user agent is to reestablish the connection, the user agent must\n // run the following steps. These steps are run in parallel, not as part of\n // a task. (The tasks that it queues, of course, are run like normal tasks\n // and not themselves in parallel.)\n\n // 1. Queue a task to run the following steps:\n\n // 1. If the readyState attribute is set to CLOSED, abort the task.\n if (this.#readyState === CLOSED) return\n\n // 2. Set the readyState attribute to CONNECTING.\n this.#readyState = CONNECTING\n\n // 3. Fire an event named error at the EventSource object.\n this.dispatchEvent(new Event('error'))\n\n // 2. Wait a delay equal to the reconnection time of the event source.\n setTimeout(() => {\n // 5. Queue a task to run the following steps:\n\n // 1. If the EventSource object's readyState attribute is not set to\n // CONNECTING, then return.\n if (this.#readyState !== CONNECTING) return\n\n // 2. Let request be the EventSource object's request.\n // 3. If the EventSource object's last event ID string is not the empty\n // string, then:\n // 1. Let lastEventIDValue be the EventSource object's last event ID\n // string, encoded as UTF-8.\n // 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header\n // list.\n if (this.#state.lastEventId.length) {\n this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)\n }\n\n // 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.\n this.#connect()\n }, this.#state.reconnectionTime)?.unref()\n }\n\n /**\n * Closes the connection, if any, and sets the readyState attribute to\n * CLOSED.\n */\n close () {\n webidl.brandCheck(this, EventSource)\n\n if (this.#readyState === CLOSED) return\n this.#readyState = CLOSED\n this.#controller.abort()\n this.#request = null\n }\n\n get onopen () {\n return this.#events.open\n }\n\n set onopen (fn) {\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('open', listener)\n this.#events.open = fn\n } else {\n this.#events.open = null\n }\n }\n\n get onmessage () {\n return this.#events.message\n }\n\n set onmessage (fn) {\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('message', listener)\n this.#events.message = fn\n } else {\n this.#events.message = null\n }\n }\n\n get onerror () {\n return this.#events.error\n }\n\n set onerror (fn) {\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('error', listener)\n this.#events.error = fn\n } else {\n this.#events.error = null\n }\n }\n}\n\nconst constantsPropertyDescriptors = {\n CONNECTING: {\n __proto__: null,\n configurable: false,\n enumerable: true,\n value: CONNECTING,\n writable: false\n },\n OPEN: {\n __proto__: null,\n configurable: false,\n enumerable: true,\n value: OPEN,\n writable: false\n },\n CLOSED: {\n __proto__: null,\n configurable: false,\n enumerable: true,\n value: CLOSED,\n writable: false\n }\n}\n\nObject.defineProperties(EventSource, constantsPropertyDescriptors)\nObject.defineProperties(EventSource.prototype, constantsPropertyDescriptors)\n\nObject.defineProperties(EventSource.prototype, {\n close: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n onopen: kEnumerableProperty,\n readyState: kEnumerableProperty,\n url: kEnumerableProperty,\n withCredentials: kEnumerableProperty\n})\n\nwebidl.converters.EventSourceInitDict = webidl.dictionaryConverter([\n {\n key: 'withCredentials',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'dispatcher', // undici only\n converter: webidl.converters.any\n },\n {\n key: 'node', // undici only\n converter: webidl.dictionaryConverter([\n {\n key: 'reconnectionTime',\n converter: webidl.converters['unsigned long'],\n defaultValue: () => defaultReconnectionTime\n },\n {\n key: 'dispatcher',\n converter: webidl.converters.any\n }\n ]),\n defaultValue: () => ({})\n }\n])\n\nmodule.exports = {\n EventSource,\n defaultReconnectionTime\n}\n","'use strict'\n\nconst Client = require('./lib/dispatcher/client')\nconst Dispatcher = require('./lib/dispatcher/dispatcher')\nconst Pool = require('./lib/dispatcher/pool')\nconst BalancedPool = require('./lib/dispatcher/balanced-pool')\nconst RoundRobinPool = require('./lib/dispatcher/round-robin-pool')\nconst Agent = require('./lib/dispatcher/agent')\nconst Dispatcher1Wrapper = require('./lib/dispatcher/dispatcher1-wrapper')\nconst ProxyAgent = require('./lib/dispatcher/proxy-agent')\nconst Socks5ProxyAgent = require('./lib/dispatcher/socks5-proxy-agent')\nconst EnvHttpProxyAgent = require('./lib/dispatcher/env-http-proxy-agent')\nconst RetryAgent = require('./lib/dispatcher/retry-agent')\nconst H2CClient = require('./lib/dispatcher/h2c-client')\nconst errors = require('./lib/core/errors')\nconst util = require('./lib/core/util')\nconst { InvalidArgumentError } = errors\nconst api = require('./lib/api')\nconst buildConnector = require('./lib/core/connect')\nconst MockClient = require('./lib/mock/mock-client')\nconst { MockCallHistory, MockCallHistoryLog } = require('./lib/mock/mock-call-history')\nconst MockAgent = require('./lib/mock/mock-agent')\nconst MockPool = require('./lib/mock/mock-pool')\nconst SnapshotAgent = require('./lib/mock/snapshot-agent')\nconst mockErrors = require('./lib/mock/mock-errors')\nconst RetryHandler = require('./lib/handler/retry-handler')\nconst { getGlobalDispatcher, setGlobalDispatcher } = require('./lib/global')\nconst DecoratorHandler = require('./lib/handler/decorator-handler')\nconst RedirectHandler = require('./lib/handler/redirect-handler')\n\nObject.assign(Dispatcher.prototype, api)\n\nmodule.exports.Dispatcher = Dispatcher\nmodule.exports.Client = Client\nmodule.exports.Pool = Pool\nmodule.exports.BalancedPool = BalancedPool\nmodule.exports.RoundRobinPool = RoundRobinPool\nmodule.exports.Agent = Agent\nmodule.exports.Dispatcher1Wrapper = Dispatcher1Wrapper\nmodule.exports.ProxyAgent = ProxyAgent\nmodule.exports.Socks5ProxyAgent = Socks5ProxyAgent\nmodule.exports.EnvHttpProxyAgent = EnvHttpProxyAgent\nmodule.exports.RetryAgent = RetryAgent\nmodule.exports.H2CClient = H2CClient\nmodule.exports.RetryHandler = RetryHandler\n\nmodule.exports.DecoratorHandler = DecoratorHandler\nmodule.exports.RedirectHandler = RedirectHandler\nmodule.exports.interceptors = {\n redirect: require('./lib/interceptor/redirect'),\n responseError: require('./lib/interceptor/response-error'),\n retry: require('./lib/interceptor/retry'),\n dump: require('./lib/interceptor/dump'),\n dns: require('./lib/interceptor/dns'),\n cache: require('./lib/interceptor/cache'),\n decompress: require('./lib/interceptor/decompress'),\n deduplicate: require('./lib/interceptor/deduplicate')\n}\n\nmodule.exports.cacheStores = {\n MemoryCacheStore: require('./lib/cache/memory-cache-store')\n}\n\nconst SqliteCacheStore = require('./lib/cache/sqlite-cache-store')\nmodule.exports.cacheStores.SqliteCacheStore = SqliteCacheStore\n\nmodule.exports.buildConnector = buildConnector\nmodule.exports.errors = errors\nmodule.exports.util = {\n parseHeaders: util.parseHeaders,\n headerNameToString: util.headerNameToString\n}\n\nfunction makeDispatcher (fn) {\n return (url, opts, handler) => {\n if (typeof opts === 'function') {\n handler = opts\n opts = null\n }\n\n if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) {\n throw new InvalidArgumentError('invalid url')\n }\n\n if (opts != null && typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (opts && opts.path != null) {\n if (typeof opts.path !== 'string') {\n throw new InvalidArgumentError('invalid opts.path')\n }\n\n let path = opts.path\n if (!opts.path.startsWith('/')) {\n path = `/${path}`\n }\n\n url = new URL(util.parseOrigin(url).origin + path)\n } else {\n if (!opts) {\n opts = typeof url === 'object' ? url : {}\n }\n\n url = util.parseURL(url)\n }\n\n const { agent, dispatcher = getGlobalDispatcher(), ...restOpts } = opts\n\n if (agent) {\n throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?')\n }\n\n return fn.call(dispatcher, {\n ...restOpts,\n origin: url.origin,\n path: url.search ? `${url.pathname}${url.search}` : url.pathname,\n method: opts.method || (opts.body ? 'PUT' : 'GET')\n }, handler)\n }\n}\n\nmodule.exports.setGlobalDispatcher = setGlobalDispatcher\nmodule.exports.getGlobalDispatcher = getGlobalDispatcher\n\nconst fetchImpl = require('./lib/web/fetch').fetch\n\n// Capture __filename at module load time for stack trace augmentation.\n// This may be undefined when bundled in environments like Node.js internals.\nconst currentFilename = typeof __filename !== 'undefined' ? __filename : undefined\n\nfunction appendFetchStackTrace (err, filename) {\n if (!err || typeof err !== 'object') {\n return\n }\n\n const stack = typeof err.stack === 'string' ? err.stack : ''\n const normalizedFilename = filename.replace(/\\\\/g, '/')\n\n if (stack && (stack.includes(filename) || stack.includes(normalizedFilename))) {\n return\n }\n\n const capture = {}\n Error.captureStackTrace(capture, appendFetchStackTrace)\n\n if (!capture.stack) {\n return\n }\n\n const captureLines = capture.stack.split('\\n').slice(1).join('\\n')\n\n err.stack = stack ? `${stack}\\n${captureLines}` : capture.stack\n}\n\nmodule.exports.fetch = function fetch (init, options = undefined) {\n return fetchImpl(init, options).catch(err => {\n if (currentFilename) {\n appendFetchStackTrace(err, currentFilename)\n } else if (err && typeof err === 'object') {\n Error.captureStackTrace(err, module.exports.fetch)\n }\n throw err\n })\n}\nmodule.exports.Headers = require('./lib/web/fetch/headers').Headers\nmodule.exports.Response = require('./lib/web/fetch/response').Response\nmodule.exports.Request = require('./lib/web/fetch/request').Request\nmodule.exports.FormData = require('./lib/web/fetch/formdata').FormData\n\nconst { setGlobalOrigin, getGlobalOrigin } = require('./lib/web/fetch/global')\n\nmodule.exports.setGlobalOrigin = setGlobalOrigin\nmodule.exports.getGlobalOrigin = getGlobalOrigin\n\nconst { CacheStorage } = require('./lib/web/cache/cachestorage')\nconst { kConstruct } = require('./lib/core/symbols')\n\nmodule.exports.caches = new CacheStorage(kConstruct)\n\nconst { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = require('./lib/web/cookies')\n\nmodule.exports.deleteCookie = deleteCookie\nmodule.exports.getCookies = getCookies\nmodule.exports.getSetCookies = getSetCookies\nmodule.exports.setCookie = setCookie\nmodule.exports.parseCookie = parseCookie\n\nconst { parseMIMEType, serializeAMimeType } = require('./lib/web/fetch/data-url')\n\nmodule.exports.parseMIMEType = parseMIMEType\nmodule.exports.serializeAMimeType = serializeAMimeType\n\nconst { CloseEvent, ErrorEvent, MessageEvent } = require('./lib/web/websocket/events')\nconst { WebSocket, ping } = require('./lib/web/websocket/websocket')\nmodule.exports.WebSocket = WebSocket\nmodule.exports.CloseEvent = CloseEvent\nmodule.exports.ErrorEvent = ErrorEvent\nmodule.exports.MessageEvent = MessageEvent\nmodule.exports.ping = ping\n\nmodule.exports.WebSocketStream = require('./lib/web/websocket/stream/websocketstream').WebSocketStream\nmodule.exports.WebSocketError = require('./lib/web/websocket/stream/websocketerror').WebSocketError\n\nmodule.exports.request = makeDispatcher(api.request)\nmodule.exports.stream = makeDispatcher(api.stream)\nmodule.exports.pipeline = makeDispatcher(api.pipeline)\nmodule.exports.connect = makeDispatcher(api.connect)\nmodule.exports.upgrade = makeDispatcher(api.upgrade)\n\nmodule.exports.MockClient = MockClient\nmodule.exports.MockCallHistory = MockCallHistory\nmodule.exports.MockCallHistoryLog = MockCallHistoryLog\nmodule.exports.MockPool = MockPool\nmodule.exports.MockAgent = MockAgent\nmodule.exports.SnapshotAgent = SnapshotAgent\nmodule.exports.mockErrors = mockErrors\n\nconst { EventSource } = require('./lib/web/eventsource/eventsource')\n\nmodule.exports.EventSource = EventSource\n\nfunction install () {\n globalThis.fetch = module.exports.fetch\n globalThis.Headers = module.exports.Headers\n globalThis.Response = module.exports.Response\n globalThis.Request = module.exports.Request\n globalThis.FormData = module.exports.FormData\n globalThis.WebSocket = module.exports.WebSocket\n globalThis.CloseEvent = module.exports.CloseEvent\n globalThis.ErrorEvent = module.exports.ErrorEvent\n globalThis.MessageEvent = module.exports.MessageEvent\n globalThis.EventSource = module.exports.EventSource\n}\n\nmodule.exports.install = install\n","/**\n * Solana USDC Balance Monitor\n *\n * Checks USDC balance on Solana mainnet with caching.\n * Absorbed from @blockrun/clawwallet's solana-adapter.ts (balance portion only).\n */\n\nimport { address as solAddress, createSolanaRpc } from \"@solana/kit\";\n\nconst SOLANA_USDC_MINT = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nconst SOLANA_DEFAULT_RPC = \"https://api.mainnet-beta.solana.com\";\nconst BALANCE_TIMEOUT_MS = 10_000;\nconst CACHE_TTL_MS = 30_000;\n\nexport type SolanaBalanceInfo = {\n balance: bigint;\n balanceUSD: string;\n isLow: boolean;\n isEmpty: boolean;\n walletAddress: string;\n};\n\n/** Result from checkSufficient() */\nexport type SolanaSufficiencyResult = {\n sufficient: boolean;\n info: SolanaBalanceInfo;\n shortfall?: string;\n};\n\nexport class SolanaBalanceMonitor {\n private readonly rpc: ReturnType;\n private readonly walletAddress: string;\n private cachedBalance: bigint | null = null;\n private cachedAt = 0;\n\n constructor(walletAddress: string, rpcUrl?: string) {\n this.walletAddress = walletAddress;\n const url = rpcUrl || process[\"env\"].CLAWROUTER_SOLANA_RPC_URL || SOLANA_DEFAULT_RPC;\n this.rpc = createSolanaRpc(url);\n }\n\n async checkBalance(): Promise {\n const now = Date.now();\n if (\n this.cachedBalance !== null &&\n this.cachedBalance > 0n &&\n now - this.cachedAt < CACHE_TTL_MS\n ) {\n return this.buildInfo(this.cachedBalance);\n }\n // Zero balance is never cached — always re-fetch so a funded wallet is\n // detected on the next request without waiting for cache expiry.\n const balance = await this.fetchBalance();\n if (balance > 0n) {\n this.cachedBalance = balance;\n this.cachedAt = now;\n }\n return this.buildInfo(balance);\n }\n\n deductEstimated(amountMicros: bigint): void {\n if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) {\n this.cachedBalance -= amountMicros;\n }\n }\n\n invalidate(): void {\n this.cachedBalance = null;\n this.cachedAt = 0;\n }\n\n async refresh(): Promise {\n this.invalidate();\n return this.checkBalance();\n }\n\n /**\n * Check if balance is sufficient for an estimated cost.\n */\n async checkSufficient(estimatedCostMicros: bigint): Promise {\n const info = await this.checkBalance();\n if (info.balance >= estimatedCostMicros) {\n return { sufficient: true, info };\n }\n const shortfall = estimatedCostMicros - info.balance;\n return {\n sufficient: false,\n info,\n shortfall: this.formatUSDC(shortfall),\n };\n }\n\n /**\n * Format USDC amount (in micros) as \"$X.XX\".\n */\n formatUSDC(amountMicros: bigint): string {\n const dollars = Number(amountMicros) / 1_000_000;\n return `$${dollars.toFixed(2)}`;\n }\n\n getWalletAddress(): string {\n return this.walletAddress;\n }\n\n /**\n * Check native SOL balance (in lamports). Useful for detecting users who\n * funded with SOL instead of USDC.\n */\n async checkSolBalance(): Promise {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS);\n try {\n const owner = solAddress(this.walletAddress);\n const response = await this.rpc.getBalance(owner).send({ abortSignal: controller.signal });\n return BigInt(response.value);\n } catch {\n return 0n;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async fetchBalance(): Promise {\n const owner = solAddress(this.walletAddress);\n const mint = solAddress(SOLANA_USDC_MINT);\n\n // The public Solana RPC frequently returns empty token account lists even\n // for funded wallets. Retry up to 3 times on empty/error before accepting $0.\n // Rate-limited or flaky RPC calls should not silently zero out a funded wallet.\n const MAX_ATTEMPTS = 3;\n let lastError: unknown;\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n try {\n const result = await this.fetchBalanceOnce(owner, mint);\n if (result > 0n) return result;\n // Got 0 — might be RPC returning empty for a funded wallet.\n // Retry unless this is the last attempt.\n if (attempt < MAX_ATTEMPTS - 1) {\n await new Promise((r) => setTimeout(r, 1_500 * (attempt + 1)));\n }\n } catch (err) {\n lastError = err;\n if (attempt < MAX_ATTEMPTS - 1) {\n await new Promise((r) => setTimeout(r, 1_500 * (attempt + 1)));\n }\n }\n }\n // If all attempts threw, re-throw so callers can distinguish RPC failure from actual $0.\n if (lastError !== undefined) throw lastError;\n return 0n;\n }\n\n private async fetchBalanceOnce(\n owner: ReturnType,\n mint: ReturnType,\n ): Promise {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS);\n\n try {\n const response = await this.rpc\n .getTokenAccountsByOwner(owner, { mint }, { encoding: \"jsonParsed\" })\n .send({ abortSignal: controller.signal });\n\n if (response.value.length === 0) return 0n;\n\n let total = 0n;\n for (const account of response.value) {\n const parsed = account.account.data as {\n parsed: { info: { tokenAmount: { amount: string } } };\n };\n total += BigInt(parsed.parsed.info.tokenAmount.amount);\n }\n return total;\n } catch (err) {\n throw new Error(\n `Failed to fetch Solana USDC balance: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n private buildInfo(balance: bigint): SolanaBalanceInfo {\n const dollars = Number(balance) / 1_000_000;\n return {\n balance,\n balanceUSD: `$${dollars.toFixed(2)}`,\n isLow: balance < 1_000_000n,\n isEmpty: balance < 100n,\n walletAddress: this.walletAddress,\n };\n }\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\n\nexport type Mint = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: Option
;\n /** Total supply of tokens. */\n supply: bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: Option
;\n};\n\nexport type MintArgs = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: OptionOrNullable
;\n /** Total supply of tokens. */\n supply: number | bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: OptionOrNullable
;\n};\n\nexport function getMintEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n [\n 'mintAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n [\n 'freezeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getMintDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n [\n 'mintAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n [\n 'freezeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getMintCodec(): FixedSizeCodec {\n return combineCodec(getMintEncoder(), getMintDecoder());\n}\n\nexport function decodeMint(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMint(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMint(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMintDecoder()\n );\n}\n\nexport async function fetchMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMint(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMint(maybeAccount);\n}\n\nexport async function fetchAllMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMint(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMint(maybeAccount));\n}\n\nexport function getMintSize(): number {\n return 82;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n} from '@solana/kit';\n\nexport type Multisig = {\n /** Number of signers required. */\n m: number;\n /** Number of valid signers. */\n n: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Signer public keys. */\n signers: Array
;\n};\n\nexport type MultisigArgs = Multisig;\n\nexport function getMultisigEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['m', getU8Encoder()],\n ['n', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n ['signers', getArrayEncoder(getAddressEncoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['m', getU8Decoder()],\n ['n', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n ['signers', getArrayDecoder(getAddressDecoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigCodec(): FixedSizeCodec {\n return combineCodec(getMultisigEncoder(), getMultisigDecoder());\n}\n\nexport function decodeMultisig(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMultisig(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMultisig(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMultisigDecoder()\n );\n}\n\nexport async function fetchMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMultisig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMultisig(maybeAccount);\n}\n\nexport async function fetchAllMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMultisig(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMultisig(maybeAccount));\n}\n\nexport function getMultisigSize(): number {\n return 355;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AccountState {\n Uninitialized,\n Initialized,\n Frozen,\n}\n\nexport type AccountStateArgs = AccountState;\n\nexport function getAccountStateEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AccountState);\n}\n\nexport function getAccountStateDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AccountState);\n}\n\nexport function getAccountStateCodec(): FixedSizeCodec<\n AccountStateArgs,\n AccountState\n> {\n return combineCodec(getAccountStateEncoder(), getAccountStateDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AuthorityType {\n MintTokens,\n FreezeAccount,\n AccountOwner,\n CloseAccount,\n}\n\nexport type AuthorityTypeArgs = AuthorityType;\n\nexport function getAuthorityTypeEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AuthorityType);\n}\n\nexport function getAuthorityTypeDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AuthorityType);\n}\n\nexport function getAuthorityTypeCodec(): FixedSizeCodec<\n AuthorityTypeArgs,\n AuthorityType\n> {\n return combineCodec(getAuthorityTypeEncoder(), getAuthorityTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n type AccountState,\n type AccountStateArgs,\n} from '../types';\n\nexport type Token = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: Option
;\n /** The account's state. */\n state: AccountState;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: Option;\n /** The amount delegated. */\n delegatedAmount: bigint;\n /** Optional authority to close the account. */\n closeAuthority: Option
;\n};\n\nexport type TokenArgs = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: number | bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: OptionOrNullable
;\n /** The account's state. */\n state: AccountStateArgs;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: OptionOrNullable;\n /** The amount delegated. */\n delegatedAmount: number | bigint;\n /** Optional authority to close the account. */\n closeAuthority: OptionOrNullable
;\n};\n\nexport function getTokenEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['mint', getAddressEncoder()],\n ['owner', getAddressEncoder()],\n ['amount', getU64Encoder()],\n [\n 'delegate',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateEncoder()],\n [\n 'isNative',\n getOptionEncoder(getU64Encoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Encoder()],\n [\n 'closeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getTokenDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['mint', getAddressDecoder()],\n ['owner', getAddressDecoder()],\n ['amount', getU64Decoder()],\n [\n 'delegate',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateDecoder()],\n [\n 'isNative',\n getOptionDecoder(getU64Decoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Decoder()],\n [\n 'closeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getTokenCodec(): FixedSizeCodec {\n return combineCodec(getTokenEncoder(), getTokenDecoder());\n}\n\nexport function decodeToken(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeToken(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeToken(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getTokenDecoder()\n );\n}\n\nexport async function fetchToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeToken(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeToken(maybeAccount);\n}\n\nexport async function fetchAllToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeToken(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeToken(maybeAccount));\n}\n\nexport function getTokenSize(): number {\n return 165;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedCreateAssociatedTokenIdempotentInstruction,\n type ParsedCreateAssociatedTokenInstruction,\n type ParsedRecoverNestedAssociatedTokenInstruction,\n} from '../instructions';\n\nexport const ASSOCIATED_TOKEN_PROGRAM_ADDRESS =\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;\n\nexport enum AssociatedTokenInstruction {\n CreateAssociatedToken,\n CreateAssociatedTokenIdempotent,\n RecoverNestedAssociatedToken,\n}\n\nexport function identifyAssociatedTokenInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): AssociatedTokenInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedToken;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n }\n throw new Error(\n 'The provided instruction could not be identified as a associatedToken instruction.'\n );\n}\n\nexport type ParsedAssociatedTokenInstruction<\n TProgram extends string = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n> =\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedToken;\n } & ParsedCreateAssociatedTokenInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n } & ParsedCreateAssociatedTokenIdempotentInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n } & ParsedRecoverNestedAssociatedTokenInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedAmountToUiAmountInstruction,\n type ParsedApproveCheckedInstruction,\n type ParsedApproveInstruction,\n type ParsedBurnCheckedInstruction,\n type ParsedBurnInstruction,\n type ParsedCloseAccountInstruction,\n type ParsedFreezeAccountInstruction,\n type ParsedGetAccountDataSizeInstruction,\n type ParsedInitializeAccount2Instruction,\n type ParsedInitializeAccount3Instruction,\n type ParsedInitializeAccountInstruction,\n type ParsedInitializeImmutableOwnerInstruction,\n type ParsedInitializeMint2Instruction,\n type ParsedInitializeMintInstruction,\n type ParsedInitializeMultisig2Instruction,\n type ParsedInitializeMultisigInstruction,\n type ParsedMintToCheckedInstruction,\n type ParsedMintToInstruction,\n type ParsedRevokeInstruction,\n type ParsedSetAuthorityInstruction,\n type ParsedSyncNativeInstruction,\n type ParsedThawAccountInstruction,\n type ParsedTransferCheckedInstruction,\n type ParsedTransferInstruction,\n type ParsedUiAmountToAmountInstruction,\n} from '../instructions';\n\nexport const TOKEN_PROGRAM_ADDRESS =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n\nexport enum TokenAccount {\n Mint,\n Token,\n Multisig,\n}\n\nexport function identifyTokenAccount(\n account: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): TokenAccount {\n const data = 'data' in account ? account.data : account;\n if (data.length === 82) {\n return TokenAccount.Mint;\n }\n if (data.length === 165) {\n return TokenAccount.Token;\n }\n if (data.length === 355) {\n return TokenAccount.Multisig;\n }\n throw new Error(\n 'The provided account could not be identified as a token account.'\n );\n}\n\nexport enum TokenInstruction {\n InitializeMint,\n InitializeAccount,\n InitializeMultisig,\n Transfer,\n Approve,\n Revoke,\n SetAuthority,\n MintTo,\n Burn,\n CloseAccount,\n FreezeAccount,\n ThawAccount,\n TransferChecked,\n ApproveChecked,\n MintToChecked,\n BurnChecked,\n InitializeAccount2,\n SyncNative,\n InitializeAccount3,\n InitializeMultisig2,\n InitializeMint2,\n GetAccountDataSize,\n InitializeImmutableOwner,\n AmountToUiAmount,\n UiAmountToAmount,\n}\n\nexport function identifyTokenInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): TokenInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return TokenInstruction.InitializeMint;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return TokenInstruction.InitializeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return TokenInstruction.InitializeMultisig;\n }\n if (containsBytes(data, getU8Encoder().encode(3), 0)) {\n return TokenInstruction.Transfer;\n }\n if (containsBytes(data, getU8Encoder().encode(4), 0)) {\n return TokenInstruction.Approve;\n }\n if (containsBytes(data, getU8Encoder().encode(5), 0)) {\n return TokenInstruction.Revoke;\n }\n if (containsBytes(data, getU8Encoder().encode(6), 0)) {\n return TokenInstruction.SetAuthority;\n }\n if (containsBytes(data, getU8Encoder().encode(7), 0)) {\n return TokenInstruction.MintTo;\n }\n if (containsBytes(data, getU8Encoder().encode(8), 0)) {\n return TokenInstruction.Burn;\n }\n if (containsBytes(data, getU8Encoder().encode(9), 0)) {\n return TokenInstruction.CloseAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(10), 0)) {\n return TokenInstruction.FreezeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(11), 0)) {\n return TokenInstruction.ThawAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(12), 0)) {\n return TokenInstruction.TransferChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(13), 0)) {\n return TokenInstruction.ApproveChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(14), 0)) {\n return TokenInstruction.MintToChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(15), 0)) {\n return TokenInstruction.BurnChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(16), 0)) {\n return TokenInstruction.InitializeAccount2;\n }\n if (containsBytes(data, getU8Encoder().encode(17), 0)) {\n return TokenInstruction.SyncNative;\n }\n if (containsBytes(data, getU8Encoder().encode(18), 0)) {\n return TokenInstruction.InitializeAccount3;\n }\n if (containsBytes(data, getU8Encoder().encode(19), 0)) {\n return TokenInstruction.InitializeMultisig2;\n }\n if (containsBytes(data, getU8Encoder().encode(20), 0)) {\n return TokenInstruction.InitializeMint2;\n }\n if (containsBytes(data, getU8Encoder().encode(21), 0)) {\n return TokenInstruction.GetAccountDataSize;\n }\n if (containsBytes(data, getU8Encoder().encode(22), 0)) {\n return TokenInstruction.InitializeImmutableOwner;\n }\n if (containsBytes(data, getU8Encoder().encode(23), 0)) {\n return TokenInstruction.AmountToUiAmount;\n }\n if (containsBytes(data, getU8Encoder().encode(24), 0)) {\n return TokenInstruction.UiAmountToAmount;\n }\n throw new Error(\n 'The provided instruction could not be identified as a token instruction.'\n );\n}\n\nexport type ParsedTokenInstruction<\n TProgram extends string = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n> =\n | ({\n instructionType: TokenInstruction.InitializeMint;\n } & ParsedInitializeMintInstruction)\n | ({\n instructionType: TokenInstruction.InitializeAccount;\n } & ParsedInitializeAccountInstruction)\n | ({\n instructionType: TokenInstruction.InitializeMultisig;\n } & ParsedInitializeMultisigInstruction)\n | ({\n instructionType: TokenInstruction.Transfer;\n } & ParsedTransferInstruction)\n | ({\n instructionType: TokenInstruction.Approve;\n } & ParsedApproveInstruction)\n | ({\n instructionType: TokenInstruction.Revoke;\n } & ParsedRevokeInstruction)\n | ({\n instructionType: TokenInstruction.SetAuthority;\n } & ParsedSetAuthorityInstruction)\n | ({\n instructionType: TokenInstruction.MintTo;\n } & ParsedMintToInstruction)\n | ({\n instructionType: TokenInstruction.Burn;\n } & ParsedBurnInstruction)\n | ({\n instructionType: TokenInstruction.CloseAccount;\n } & ParsedCloseAccountInstruction)\n | ({\n instructionType: TokenInstruction.FreezeAccount;\n } & ParsedFreezeAccountInstruction)\n | ({\n instructionType: TokenInstruction.ThawAccount;\n } & ParsedThawAccountInstruction)\n | ({\n instructionType: TokenInstruction.TransferChecked;\n } & ParsedTransferCheckedInstruction)\n | ({\n instructionType: TokenInstruction.ApproveChecked;\n } & ParsedApproveCheckedInstruction)\n | ({\n instructionType: TokenInstruction.MintToChecked;\n } & ParsedMintToCheckedInstruction)\n | ({\n instructionType: TokenInstruction.BurnChecked;\n } & ParsedBurnCheckedInstruction)\n | ({\n instructionType: TokenInstruction.InitializeAccount2;\n } & ParsedInitializeAccount2Instruction)\n | ({\n instructionType: TokenInstruction.SyncNative;\n } & ParsedSyncNativeInstruction)\n | ({\n instructionType: TokenInstruction.InitializeAccount3;\n } & ParsedInitializeAccount3Instruction)\n | ({\n instructionType: TokenInstruction.InitializeMultisig2;\n } & ParsedInitializeMultisig2Instruction)\n | ({\n instructionType: TokenInstruction.InitializeMint2;\n } & ParsedInitializeMint2Instruction)\n | ({\n instructionType: TokenInstruction.GetAccountDataSize;\n } & ParsedGetAccountDataSizeInstruction)\n | ({\n instructionType: TokenInstruction.InitializeImmutableOwner;\n } & ParsedInitializeImmutableOwnerInstruction)\n | ({\n instructionType: TokenInstruction.AmountToUiAmount;\n } & ParsedAmountToUiAmountInstruction)\n | ({\n instructionType: TokenInstruction.UiAmountToAmount;\n } & ParsedUiAmountToAmountInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\n\n/** InvalidOwner: Associated token account owner does not match address derivation */\nexport const ASSOCIATED_TOKEN_ERROR__INVALID_OWNER = 0x0; // 0\n\nexport type AssociatedTokenError = typeof ASSOCIATED_TOKEN_ERROR__INVALID_OWNER;\n\nlet associatedTokenErrorMessages:\n | Record\n | undefined;\nif (process.env.NODE_ENV !== 'production') {\n associatedTokenErrorMessages = {\n [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER]: `Associated token account owner does not match address derivation`,\n };\n}\n\nexport function getAssociatedTokenErrorMessage(\n code: AssociatedTokenError\n): string {\n if (process.env.NODE_ENV !== 'production') {\n return (\n associatedTokenErrorMessages as Record\n )[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isAssociatedTokenError<\n TProgramErrorCode extends AssociatedTokenError,\n>(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\n\n/** NotRentExempt: Lamport balance below rent-exempt threshold */\nexport const TOKEN_ERROR__NOT_RENT_EXEMPT = 0x0; // 0\n/** InsufficientFunds: Insufficient funds */\nexport const TOKEN_ERROR__INSUFFICIENT_FUNDS = 0x1; // 1\n/** InvalidMint: Invalid Mint */\nexport const TOKEN_ERROR__INVALID_MINT = 0x2; // 2\n/** MintMismatch: Account not associated with this Mint */\nexport const TOKEN_ERROR__MINT_MISMATCH = 0x3; // 3\n/** OwnerMismatch: Owner does not match */\nexport const TOKEN_ERROR__OWNER_MISMATCH = 0x4; // 4\n/** FixedSupply: Fixed supply */\nexport const TOKEN_ERROR__FIXED_SUPPLY = 0x5; // 5\n/** AlreadyInUse: Already in use */\nexport const TOKEN_ERROR__ALREADY_IN_USE = 0x6; // 6\n/** InvalidNumberOfProvidedSigners: Invalid number of provided signers */\nexport const TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 0x7; // 7\n/** InvalidNumberOfRequiredSigners: Invalid number of required signers */\nexport const TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 0x8; // 8\n/** UninitializedState: State is unititialized */\nexport const TOKEN_ERROR__UNINITIALIZED_STATE = 0x9; // 9\n/** NativeNotSupported: Instruction does not support native tokens */\nexport const TOKEN_ERROR__NATIVE_NOT_SUPPORTED = 0xa; // 10\n/** NonNativeHasBalance: Non-native account can only be closed if its balance is zero */\nexport const TOKEN_ERROR__NON_NATIVE_HAS_BALANCE = 0xb; // 11\n/** InvalidInstruction: Invalid instruction */\nexport const TOKEN_ERROR__INVALID_INSTRUCTION = 0xc; // 12\n/** InvalidState: State is invalid for requested operation */\nexport const TOKEN_ERROR__INVALID_STATE = 0xd; // 13\n/** Overflow: Operation overflowed */\nexport const TOKEN_ERROR__OVERFLOW = 0xe; // 14\n/** AuthorityTypeNotSupported: Account does not support specified authority type */\nexport const TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 0xf; // 15\n/** MintCannotFreeze: This token mint cannot freeze accounts */\nexport const TOKEN_ERROR__MINT_CANNOT_FREEZE = 0x10; // 16\n/** AccountFrozen: Account is frozen */\nexport const TOKEN_ERROR__ACCOUNT_FROZEN = 0x11; // 17\n/** MintDecimalsMismatch: The provided decimals value different from the Mint decimals */\nexport const TOKEN_ERROR__MINT_DECIMALS_MISMATCH = 0x12; // 18\n/** NonNativeNotSupported: Instruction does not support non-native tokens */\nexport const TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED = 0x13; // 19\n\nexport type TokenError =\n | typeof TOKEN_ERROR__ACCOUNT_FROZEN\n | typeof TOKEN_ERROR__ALREADY_IN_USE\n | typeof TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED\n | typeof TOKEN_ERROR__FIXED_SUPPLY\n | typeof TOKEN_ERROR__INSUFFICIENT_FUNDS\n | typeof TOKEN_ERROR__INVALID_INSTRUCTION\n | typeof TOKEN_ERROR__INVALID_MINT\n | typeof TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS\n | typeof TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS\n | typeof TOKEN_ERROR__INVALID_STATE\n | typeof TOKEN_ERROR__MINT_CANNOT_FREEZE\n | typeof TOKEN_ERROR__MINT_DECIMALS_MISMATCH\n | typeof TOKEN_ERROR__MINT_MISMATCH\n | typeof TOKEN_ERROR__NATIVE_NOT_SUPPORTED\n | typeof TOKEN_ERROR__NON_NATIVE_HAS_BALANCE\n | typeof TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED\n | typeof TOKEN_ERROR__NOT_RENT_EXEMPT\n | typeof TOKEN_ERROR__OVERFLOW\n | typeof TOKEN_ERROR__OWNER_MISMATCH\n | typeof TOKEN_ERROR__UNINITIALIZED_STATE;\n\nlet tokenErrorMessages: Record | undefined;\nif (process.env.NODE_ENV !== 'production') {\n tokenErrorMessages = {\n [TOKEN_ERROR__ACCOUNT_FROZEN]: `Account is frozen`,\n [TOKEN_ERROR__ALREADY_IN_USE]: `Already in use`,\n [TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`,\n [TOKEN_ERROR__FIXED_SUPPLY]: `Fixed supply`,\n [TOKEN_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`,\n [TOKEN_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`,\n [TOKEN_ERROR__INVALID_MINT]: `Invalid Mint`,\n [TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`,\n [TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`,\n [TOKEN_ERROR__INVALID_STATE]: `State is invalid for requested operation`,\n [TOKEN_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`,\n [TOKEN_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`,\n [TOKEN_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`,\n [TOKEN_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`,\n [TOKEN_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`,\n [TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`,\n [TOKEN_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`,\n [TOKEN_ERROR__OVERFLOW]: `Operation overflowed`,\n [TOKEN_ERROR__OWNER_MISMATCH]: `Owner does not match`,\n [TOKEN_ERROR__UNINITIALIZED_STATE]: `State is unititialized`,\n };\n}\n\nexport function getTokenErrorMessage(code: TokenError): string {\n if (process.env.NODE_ENV !== 'production') {\n return (tokenErrorMessages as Record)[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isTokenError(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n TOKEN_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from '@solana/kit';\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected a value but received null or undefined.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): Address {\n if (!value) {\n throw new Error('Expected a Address.');\n }\n if (typeof value === 'object' && 'address' in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address;\n }\n return value as Address;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): ProgramDerivedAddress {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error('Expected a ProgramDerivedAddress.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): TransactionSigner {\n if (!value || !isTransactionSigner(value)) {\n throw new Error('Expected a TransactionSigner.');\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null =\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: 'omitted' | 'programId'\n) {\n return (\n account: ResolvedAccount\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === 'omitted') return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n): value is TransactionSigner {\n return (\n !!value &&\n typeof value === 'object' &&\n 'address' in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR = 23;\n\nexport function getAmountToUiAmountDiscriminatorBytes() {\n return getU8Encoder().encode(AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR);\n}\n\nexport type AmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type AmountToUiAmountInstructionData = {\n discriminator: number;\n /** The amount of tokens to reformat. */\n amount: bigint;\n};\n\nexport type AmountToUiAmountInstructionDataArgs = {\n /** The amount of tokens to reformat. */\n amount: number | bigint;\n};\n\nexport function getAmountToUiAmountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getAmountToUiAmountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getAmountToUiAmountInstructionDataCodec(): FixedSizeCodec<\n AmountToUiAmountInstructionDataArgs,\n AmountToUiAmountInstructionData\n> {\n return combineCodec(\n getAmountToUiAmountInstructionDataEncoder(),\n getAmountToUiAmountInstructionDataDecoder()\n );\n}\n\nexport type AmountToUiAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n amount: AmountToUiAmountInstructionDataArgs['amount'];\n};\n\nexport function getAmountToUiAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: AmountToUiAmountInput,\n config?: { programAddress?: TProgramAddress }\n): AmountToUiAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getAmountToUiAmountInstructionDataEncoder().encode(\n args as AmountToUiAmountInstructionDataArgs\n ),\n programAddress,\n } as AmountToUiAmountInstruction);\n}\n\nexport type ParsedAmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: AmountToUiAmountInstructionData;\n};\n\nexport function parseAmountToUiAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedAmountToUiAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getAmountToUiAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_DISCRIMINATOR = 4;\n\nexport function getApproveDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_DISCRIMINATOR);\n}\n\nexport type ApproveInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n};\n\nexport type ApproveInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n};\n\nexport function getApproveInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_DISCRIMINATOR })\n );\n}\n\nexport function getApproveInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getApproveInstructionDataCodec(): FixedSizeCodec<\n ApproveInstructionDataArgs,\n ApproveInstructionData\n> {\n return combineCodec(\n getApproveInstructionDataEncoder(),\n getApproveInstructionDataDecoder()\n );\n}\n\nexport type ApproveInput<\n TAccountSource extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getApproveInstruction<\n TAccountSource extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: ApproveInput,\n config?: { programAddress?: TProgramAddress }\n): ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveInstructionDataEncoder().encode(\n args as ApproveInstructionDataArgs\n ),\n programAddress,\n } as ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The delegate. */\n delegate: TAccountMetas[1];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ApproveInstructionData;\n};\n\nexport function parseApproveInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_CHECKED_DISCRIMINATOR = 13;\n\nexport function getApproveCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_CHECKED_DISCRIMINATOR);\n}\n\nexport type ApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type ApproveCheckedInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getApproveCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getApproveCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getApproveCheckedInstructionDataCodec(): FixedSizeCodec<\n ApproveCheckedInstructionDataArgs,\n ApproveCheckedInstructionData\n> {\n return combineCodec(\n getApproveCheckedInstructionDataEncoder(),\n getApproveCheckedInstructionDataDecoder()\n );\n}\n\nexport type ApproveCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveCheckedInstructionDataArgs['amount'];\n decimals: ApproveCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getApproveCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: ApproveCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n TAccountOwner\n >,\n config?: { programAddress?: TProgramAddress }\n): ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveCheckedInstructionDataEncoder().encode(\n args as ApproveCheckedInstructionDataArgs\n ),\n programAddress,\n } as ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The delegate. */\n delegate: TAccountMetas[2];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[3];\n };\n data: ApproveCheckedInstructionData;\n};\n\nexport function parseApproveCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_DISCRIMINATOR = 8;\n\nexport function getBurnDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_DISCRIMINATOR);\n}\n\nexport type BurnInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnInstructionData = {\n /** The amount of tokens to burn. */\n discriminator: number;\n amount: bigint;\n};\n\nexport type BurnInstructionDataArgs = { amount: number | bigint };\n\nexport function getBurnInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_DISCRIMINATOR })\n );\n}\n\nexport function getBurnInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getBurnInstructionDataCodec(): FixedSizeCodec<\n BurnInstructionDataArgs,\n BurnInstructionData\n> {\n return combineCodec(\n getBurnInstructionDataEncoder(),\n getBurnInstructionDataDecoder()\n );\n}\n\nexport type BurnInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getBurnInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: BurnInput,\n config?: { programAddress?: TProgramAddress }\n): BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnInstructionDataEncoder().encode(\n args as BurnInstructionDataArgs\n ),\n programAddress,\n } as BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnInstructionData;\n};\n\nexport function parseBurnInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_CHECKED_DISCRIMINATOR = 15;\n\nexport function getBurnCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_CHECKED_DISCRIMINATOR);\n}\n\nexport type BurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to burn. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type BurnCheckedInstructionDataArgs = {\n /** The amount of tokens to burn. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getBurnCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getBurnCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getBurnCheckedInstructionDataCodec(): FixedSizeCodec<\n BurnCheckedInstructionDataArgs,\n BurnCheckedInstructionData\n> {\n return combineCodec(\n getBurnCheckedInstructionDataEncoder(),\n getBurnCheckedInstructionDataDecoder()\n );\n}\n\nexport type BurnCheckedInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnCheckedInstructionDataArgs['amount'];\n decimals: BurnCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getBurnCheckedInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: BurnCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnCheckedInstructionDataEncoder().encode(\n args as BurnCheckedInstructionDataArgs\n ),\n programAddress,\n } as BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnCheckedInstructionData;\n};\n\nexport function parseBurnCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CLOSE_ACCOUNT_DISCRIMINATOR = 9;\n\nexport function getCloseAccountDiscriminatorBytes() {\n return getU8Encoder().encode(CLOSE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type CloseAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseAccountInstructionData = { discriminator: number };\n\nexport type CloseAccountInstructionDataArgs = {};\n\nexport function getCloseAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: CLOSE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getCloseAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCloseAccountInstructionDataCodec(): FixedSizeCodec<\n CloseAccountInstructionDataArgs,\n CloseAccountInstructionData\n> {\n return combineCodec(\n getCloseAccountInstructionDataEncoder(),\n getCloseAccountInstructionDataDecoder()\n );\n}\n\nexport type CloseAccountInput<\n TAccountAccount extends string = string,\n TAccountDestination extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to close. */\n account: Address;\n /** The destination account. */\n destination: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getCloseAccountInstruction<\n TAccountAccount extends string,\n TAccountDestination extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: CloseAccountInput,\n config?: { programAddress?: TProgramAddress }\n): CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getCloseAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedCloseAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to close. */\n account: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: CloseAccountInstructionData;\n};\n\nexport function parseCloseAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCloseAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n destination: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getCloseAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n getAddressEncoder,\n getProgramDerivedAddress,\n type Address,\n type ProgramDerivedAddress,\n} from '@solana/kit';\n\nexport type AssociatedTokenSeeds = {\n /** The wallet address of the associated token account. */\n owner: Address;\n /** The address of the token program to use. */\n tokenProgram: Address;\n /** The mint address of the associated token account. */\n mint: Address;\n};\n\nexport async function findAssociatedTokenPda(\n seeds: AssociatedTokenSeeds,\n config: { programAddress?: Address | undefined } = {}\n): Promise {\n const {\n programAddress = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>,\n } = config;\n return await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getAddressEncoder().encode(seeds.owner),\n getAddressEncoder().encode(seeds.tokenProgram),\n getAddressEncoder().encode(seeds.mint),\n ],\n });\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR = 0;\n\nexport function getCreateAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type CreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenInstructionData = { discriminator: number };\n\nexport type CreateAssociatedTokenInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenInstructionDataArgs,\n CreateAssociatedTokenInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenInstructionDataEncoder(),\n getCreateAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenInstructionData;\n};\n\nexport function parseCreateAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR = 1;\n\nexport function getCreateAssociatedTokenIdempotentDiscriminatorBytes() {\n return getU8Encoder().encode(\n CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR\n );\n}\n\nexport type CreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenIdempotentInstructionData = {\n discriminator: number;\n};\n\nexport type CreateAssociatedTokenIdempotentInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenIdempotentInstructionDataArgs,\n CreateAssociatedTokenIdempotentInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenIdempotentInstructionDataEncoder(),\n getCreateAssociatedTokenIdempotentInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenIdempotentInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenIdempotentInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenIdempotentInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenIdempotentInstructionData;\n};\n\nexport function parseCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenIdempotentInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenIdempotentInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const FREEZE_ACCOUNT_DISCRIMINATOR = 10;\n\nexport function getFreezeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(FREEZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type FreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type FreezeAccountInstructionData = { discriminator: number };\n\nexport type FreezeAccountInstructionDataArgs = {};\n\nexport function getFreezeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: FREEZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getFreezeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getFreezeAccountInstructionDataCodec(): FixedSizeCodec<\n FreezeAccountInstructionDataArgs,\n FreezeAccountInstructionData\n> {\n return combineCodec(\n getFreezeAccountInstructionDataEncoder(),\n getFreezeAccountInstructionDataDecoder()\n );\n}\n\nexport type FreezeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to freeze. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getFreezeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: FreezeAccountInput,\n config?: { programAddress?: TProgramAddress }\n): FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getFreezeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedFreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to freeze. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: FreezeAccountInstructionData;\n};\n\nexport function parseFreezeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedFreezeAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getFreezeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR = 21;\n\nexport function getGetAccountDataSizeDiscriminatorBytes() {\n return getU8Encoder().encode(GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR);\n}\n\nexport type GetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type GetAccountDataSizeInstructionData = { discriminator: number };\n\nexport type GetAccountDataSizeInstructionDataArgs = {};\n\nexport function getGetAccountDataSizeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getGetAccountDataSizeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getGetAccountDataSizeInstructionDataCodec(): FixedSizeCodec<\n GetAccountDataSizeInstructionDataArgs,\n GetAccountDataSizeInstructionData\n> {\n return combineCodec(\n getGetAccountDataSizeInstructionDataEncoder(),\n getGetAccountDataSizeInstructionDataDecoder()\n );\n}\n\nexport type GetAccountDataSizeInput = {\n /** The mint to calculate for. */\n mint: Address;\n};\n\nexport function getGetAccountDataSizeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: GetAccountDataSizeInput,\n config?: { programAddress?: TProgramAddress }\n): GetAccountDataSizeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getGetAccountDataSizeInstructionDataEncoder().encode({}),\n programAddress,\n } as GetAccountDataSizeInstruction);\n}\n\nexport type ParsedGetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: GetAccountDataSizeInstructionData;\n};\n\nexport function parseGetAccountDataSizeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedGetAccountDataSizeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getGetAccountDataSizeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT_DISCRIMINATOR = 1;\n\nexport function getInitializeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type InitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccountInstructionData = { discriminator: number };\n\nexport type InitializeAccountInstructionDataArgs = {};\n\nexport function getInitializeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeAccountInstructionDataCodec(): FixedSizeCodec<\n InitializeAccountInstructionDataArgs,\n InitializeAccountInstructionData\n> {\n return combineCodec(\n getInitializeAccountInstructionDataEncoder(),\n getInitializeAccountInstructionDataDecoder()\n );\n}\n\nexport type InitializeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** The new account's owner/multisignature. */\n owner: Address;\n /** Rent sysvar. */\n rent?: Address;\n};\n\nexport function getInitializeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeAccountInput<\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** The new account's owner/multisignature. */\n owner: TAccountMetas[2];\n /** Rent sysvar. */\n rent: TAccountMetas[3];\n };\n data: InitializeAccountInstructionData;\n};\n\nexport function parseInitializeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccountInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT2_DISCRIMINATOR = 16;\n\nexport function getInitializeAccount2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT2_DISCRIMINATOR);\n}\n\nexport type InitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount2InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount2InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount2InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount2InstructionDataArgs,\n InitializeAccount2InstructionData\n> {\n return combineCodec(\n getInitializeAccount2InstructionDataEncoder(),\n getInitializeAccount2InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount2Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n owner: InitializeAccount2InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount2Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccount2InstructionDataEncoder().encode(\n args as InitializeAccount2InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** Rent sysvar. */\n rent: TAccountMetas[2];\n };\n data: InitializeAccount2InstructionData;\n};\n\nexport function parseInitializeAccount2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount2Instruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccount2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT3_DISCRIMINATOR = 18;\n\nexport function getInitializeAccount3DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT3_DISCRIMINATOR);\n}\n\nexport type InitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount3InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount3InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount3InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT3_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount3InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount3InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount3InstructionDataArgs,\n InitializeAccount3InstructionData\n> {\n return combineCodec(\n getInitializeAccount3InstructionDataEncoder(),\n getInitializeAccount3InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount3Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n owner: InitializeAccount3InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount3Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount3Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account), getAccountMeta(accounts.mint)],\n data: getInitializeAccount3InstructionDataEncoder().encode(\n args as InitializeAccount3InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n };\n data: InitializeAccount3InstructionData;\n};\n\nexport function parseInitializeAccount3Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount3Instruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount(), mint: getNextAccount() },\n data: getInitializeAccount3InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR = 22;\n\nexport function getInitializeImmutableOwnerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR);\n}\n\nexport type InitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeImmutableOwnerInstructionData = { discriminator: number };\n\nexport type InitializeImmutableOwnerInstructionDataArgs = {};\n\nexport function getInitializeImmutableOwnerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeImmutableOwnerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeImmutableOwnerInstructionDataCodec(): FixedSizeCodec<\n InitializeImmutableOwnerInstructionDataArgs,\n InitializeImmutableOwnerInstructionData\n> {\n return combineCodec(\n getInitializeImmutableOwnerInstructionDataEncoder(),\n getInitializeImmutableOwnerInstructionDataDecoder()\n );\n}\n\nexport type InitializeImmutableOwnerInput<\n TAccountAccount extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n};\n\nexport function getInitializeImmutableOwnerInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeImmutableOwnerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeImmutableOwnerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getInitializeImmutableOwnerInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeImmutableOwnerInstruction);\n}\n\nexport type ParsedInitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n };\n data: InitializeImmutableOwnerInstructionData;\n};\n\nexport function parseInitializeImmutableOwnerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeImmutableOwnerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getInitializeImmutableOwnerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT_DISCRIMINATOR);\n}\n\nexport type InitializeMintInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMintInstructionData = {\n discriminator: number;\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMintInstructionDataArgs = {\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMintInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMintInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMintInstructionDataCodec(): Codec<\n InitializeMintInstructionDataArgs,\n InitializeMintInstructionData\n> {\n return combineCodec(\n getInitializeMintInstructionDataEncoder(),\n getInitializeMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeMintInput<\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** Token mint account. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n decimals: InitializeMintInstructionDataArgs['decimals'];\n mintAuthority: InitializeMintInstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMintInstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMintInstruction<\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), getAccountMeta(accounts.rent)],\n data: getInitializeMintInstructionDataEncoder().encode(\n args as InitializeMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeMintInstruction);\n}\n\nexport type ParsedInitializeMintInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Token mint account. */\n mint: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMintInstructionData;\n};\n\nexport function parseInitializeMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMintInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT2_DISCRIMINATOR = 20;\n\nexport function getInitializeMint2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT2_DISCRIMINATOR);\n}\n\nexport type InitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMint2InstructionData = {\n discriminator: number;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMint2InstructionDataArgs = {\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMint2InstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT2_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMint2InstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMint2InstructionDataCodec(): Codec<\n InitializeMint2InstructionDataArgs,\n InitializeMint2InstructionData\n> {\n return combineCodec(\n getInitializeMint2InstructionDataEncoder(),\n getInitializeMint2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMint2Input = {\n /** The mint to initialize. */\n mint: Address;\n decimals: InitializeMint2InstructionDataArgs['decimals'];\n mintAuthority: InitializeMint2InstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMint2InstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMint2Instruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMint2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMint2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMint2InstructionDataEncoder().encode(\n args as InitializeMint2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMint2Instruction);\n}\n\nexport type ParsedInitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMint2InstructionData;\n};\n\nexport function parseInitializeMint2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMint2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMint2InstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG_DISCRIMINATOR = 2;\n\nexport function getInitializeMultisigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG_DISCRIMINATOR);\n}\n\nexport type InitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisigInstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisigInstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisigInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisigInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisigInstructionDataCodec(): FixedSizeCodec<\n InitializeMultisigInstructionDataArgs,\n InitializeMultisigInstructionData\n> {\n return combineCodec(\n getInitializeMultisigInstructionDataEncoder(),\n getInitializeMultisigInstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisigInput<\n TAccountMultisig extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The multisignature account to initialize. */\n multisig: Address;\n /** Rent sysvar. */\n rent?: Address;\n m: InitializeMultisigInstructionDataArgs['m'];\n signers: Array
;\n};\n\nexport function getInitializeMultisigInstruction<\n TAccountMultisig extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.multisig),\n getAccountMeta(accounts.rent),\n ...remainingAccounts,\n ],\n data: getInitializeMultisigInstructionDataEncoder().encode(\n args as InitializeMultisigInstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMultisigInstructionData;\n};\n\nexport function parseInitializeMultisigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisigInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMultisigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG2_DISCRIMINATOR = 19;\n\nexport function getInitializeMultisig2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG2_DISCRIMINATOR);\n}\n\nexport type InitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisig2InstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisig2InstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisig2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisig2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisig2InstructionDataCodec(): FixedSizeCodec<\n InitializeMultisig2InstructionDataArgs,\n InitializeMultisig2InstructionData\n> {\n return combineCodec(\n getInitializeMultisig2InstructionDataEncoder(),\n getInitializeMultisig2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisig2Input =\n {\n /** The multisignature account to initialize. */\n multisig: Address;\n m: InitializeMultisig2InstructionDataArgs['m'];\n signers: Array
;\n };\n\nexport function getInitializeMultisig2Instruction<\n TAccountMultisig extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisig2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisig2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.multisig), ...remainingAccounts],\n data: getInitializeMultisig2InstructionDataEncoder().encode(\n args as InitializeMultisig2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisig2Instruction);\n}\n\nexport type ParsedInitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n };\n data: InitializeMultisig2InstructionData;\n};\n\nexport function parseInitializeMultisig2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisig2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount() },\n data: getInitializeMultisig2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_DISCRIMINATOR = 7;\n\nexport function getMintToDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_DISCRIMINATOR);\n}\n\nexport type MintToInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n};\n\nexport type MintToInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n};\n\nexport function getMintToInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_DISCRIMINATOR })\n );\n}\n\nexport function getMintToInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getMintToInstructionDataCodec(): FixedSizeCodec<\n MintToInstructionDataArgs,\n MintToInstructionData\n> {\n return combineCodec(\n getMintToInstructionDataEncoder(),\n getMintToInstructionDataDecoder()\n );\n}\n\nexport type MintToInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint account. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getMintToInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: MintToInput,\n config?: { programAddress?: TProgramAddress }\n): MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToInstructionDataEncoder().encode(\n args as MintToInstructionDataArgs\n ),\n programAddress,\n } as MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint account. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToInstructionData;\n};\n\nexport function parseMintToInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_CHECKED_DISCRIMINATOR = 14;\n\nexport function getMintToCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_CHECKED_DISCRIMINATOR);\n}\n\nexport type MintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToCheckedInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type MintToCheckedInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getMintToCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getMintToCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getMintToCheckedInstructionDataCodec(): FixedSizeCodec<\n MintToCheckedInstructionDataArgs,\n MintToCheckedInstructionData\n> {\n return combineCodec(\n getMintToCheckedInstructionDataEncoder(),\n getMintToCheckedInstructionDataDecoder()\n );\n}\n\nexport type MintToCheckedInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToCheckedInstructionDataArgs['amount'];\n decimals: MintToCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getMintToCheckedInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: MintToCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToCheckedInstructionDataEncoder().encode(\n args as MintToCheckedInstructionDataArgs\n ),\n programAddress,\n } as MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToCheckedInstructionData;\n};\n\nexport function parseMintToCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR = 2;\n\nexport function getRecoverNestedAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type RecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountNestedAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountNestedTokenMintAddress extends string | AccountMeta = string,\n TAccountDestinationAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerTokenMintAddress extends string | AccountMeta = string,\n TAccountWalletAddress extends string | AccountMeta = string,\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountNestedAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerTokenMintAddress,\n TAccountWalletAddress extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountWalletAddress,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RecoverNestedAssociatedTokenInstructionData = {\n discriminator: number;\n};\n\nexport type RecoverNestedAssociatedTokenInstructionDataArgs = {};\n\nexport function getRecoverNestedAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n RecoverNestedAssociatedTokenInstructionDataArgs,\n RecoverNestedAssociatedTokenInstructionData\n> {\n return combineCodec(\n getRecoverNestedAssociatedTokenInstructionDataEncoder(),\n getRecoverNestedAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress?: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress?: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress?: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getRecoverNestedAssociatedTokenInstructionAsync<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.ownerAssociatedAccountAddress.value) {\n accounts.ownerAssociatedAccountAddress.value = await findAssociatedTokenPda(\n {\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.ownerTokenMintAddress.value),\n }\n );\n }\n if (!accounts.nestedAssociatedAccountAddress.value) {\n accounts.nestedAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.ownerAssociatedAccountAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n if (!accounts.destinationAssociatedAccountAddress.value) {\n accounts.destinationAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getRecoverNestedAssociatedTokenInstruction<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedRecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: TAccountMetas[0];\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: TAccountMetas[1];\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: TAccountMetas[2];\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: TAccountMetas[3];\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: TAccountMetas[4];\n /** Wallet address for the owner associated token account. */\n walletAddress: TAccountMetas[5];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[6];\n };\n data: RecoverNestedAssociatedTokenInstructionData;\n};\n\nexport function parseRecoverNestedAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRecoverNestedAssociatedTokenInstruction {\n if (instruction.accounts.length < 7) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n nestedAssociatedAccountAddress: getNextAccount(),\n nestedTokenMintAddress: getNextAccount(),\n destinationAssociatedAccountAddress: getNextAccount(),\n ownerAssociatedAccountAddress: getNextAccount(),\n ownerTokenMintAddress: getNextAccount(),\n walletAddress: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getRecoverNestedAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const REVOKE_DISCRIMINATOR = 5;\n\nexport function getRevokeDiscriminatorBytes() {\n return getU8Encoder().encode(REVOKE_DISCRIMINATOR);\n}\n\nexport type RevokeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RevokeInstructionData = { discriminator: number };\n\nexport type RevokeInstructionDataArgs = {};\n\nexport function getRevokeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: REVOKE_DISCRIMINATOR })\n );\n}\n\nexport function getRevokeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRevokeInstructionDataCodec(): FixedSizeCodec<\n RevokeInstructionDataArgs,\n RevokeInstructionData\n> {\n return combineCodec(\n getRevokeInstructionDataEncoder(),\n getRevokeInstructionDataDecoder()\n );\n}\n\nexport type RevokeInput<\n TAccountSource extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The source account owner or its multisignature. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getRevokeInstruction<\n TAccountSource extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: RevokeInput,\n config?: { programAddress?: TProgramAddress }\n): RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getRevokeInstructionDataEncoder().encode({}),\n programAddress,\n } as RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedRevokeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The source account owner or its multisignature. */\n owner: TAccountMetas[1];\n };\n data: RevokeInstructionData;\n};\n\nexport function parseRevokeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRevokeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { source: getNextAccount(), owner: getNextAccount() },\n data: getRevokeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAuthorityTypeDecoder,\n getAuthorityTypeEncoder,\n type AuthorityType,\n type AuthorityTypeArgs,\n} from '../types';\n\nexport const SET_AUTHORITY_DISCRIMINATOR = 6;\n\nexport function getSetAuthorityDiscriminatorBytes() {\n return getU8Encoder().encode(SET_AUTHORITY_DISCRIMINATOR);\n}\n\nexport type SetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountOwned extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountOwned extends string\n ? WritableAccount\n : TAccountOwned,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SetAuthorityInstructionData = {\n discriminator: number;\n /** The type of authority to update. */\n authorityType: AuthorityType;\n /** The new authority */\n newAuthority: Option
;\n};\n\nexport type SetAuthorityInstructionDataArgs = {\n /** The type of authority to update. */\n authorityType: AuthorityTypeArgs;\n /** The new authority */\n newAuthority: OptionOrNullable
;\n};\n\nexport function getSetAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['authorityType', getAuthorityTypeEncoder()],\n ['newAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({ ...value, discriminator: SET_AUTHORITY_DISCRIMINATOR })\n );\n}\n\nexport function getSetAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['authorityType', getAuthorityTypeDecoder()],\n ['newAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getSetAuthorityInstructionDataCodec(): Codec<\n SetAuthorityInstructionDataArgs,\n SetAuthorityInstructionData\n> {\n return combineCodec(\n getSetAuthorityInstructionDataEncoder(),\n getSetAuthorityInstructionDataDecoder()\n );\n}\n\nexport type SetAuthorityInput<\n TAccountOwned extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The mint or account to change the authority of. */\n owned: Address;\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: Address | TransactionSigner;\n authorityType: SetAuthorityInstructionDataArgs['authorityType'];\n newAuthority: SetAuthorityInstructionDataArgs['newAuthority'];\n multiSigners?: Array;\n};\n\nexport function getSetAuthorityInstruction<\n TAccountOwned extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: SetAuthorityInput,\n config?: { programAddress?: TProgramAddress }\n): SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owned: { value: input.owned ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owned),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getSetAuthorityInstructionDataEncoder().encode(\n args as SetAuthorityInstructionDataArgs\n ),\n programAddress,\n } as SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedSetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint or account to change the authority of. */\n owned: TAccountMetas[0];\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: TAccountMetas[1];\n };\n data: SetAuthorityInstructionData;\n};\n\nexport function parseSetAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSetAuthorityInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { owned: getNextAccount(), owner: getNextAccount() },\n data: getSetAuthorityInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const SYNC_NATIVE_DISCRIMINATOR = 17;\n\nexport function getSyncNativeDiscriminatorBytes() {\n return getU8Encoder().encode(SYNC_NATIVE_DISCRIMINATOR);\n}\n\nexport type SyncNativeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SyncNativeInstructionData = { discriminator: number };\n\nexport type SyncNativeInstructionDataArgs = {};\n\nexport function getSyncNativeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: SYNC_NATIVE_DISCRIMINATOR })\n );\n}\n\nexport function getSyncNativeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getSyncNativeInstructionDataCodec(): FixedSizeCodec<\n SyncNativeInstructionDataArgs,\n SyncNativeInstructionData\n> {\n return combineCodec(\n getSyncNativeInstructionDataEncoder(),\n getSyncNativeInstructionDataDecoder()\n );\n}\n\nexport type SyncNativeInput = {\n /** The native token account to sync with its underlying lamports. */\n account: Address;\n};\n\nexport function getSyncNativeInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: SyncNativeInput,\n config?: { programAddress?: TProgramAddress }\n): SyncNativeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getSyncNativeInstructionDataEncoder().encode({}),\n programAddress,\n } as SyncNativeInstruction);\n}\n\nexport type ParsedSyncNativeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The native token account to sync with its underlying lamports. */\n account: TAccountMetas[0];\n };\n data: SyncNativeInstructionData;\n};\n\nexport function parseSyncNativeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSyncNativeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getSyncNativeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const THAW_ACCOUNT_DISCRIMINATOR = 11;\n\nexport function getThawAccountDiscriminatorBytes() {\n return getU8Encoder().encode(THAW_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type ThawAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ThawAccountInstructionData = { discriminator: number };\n\nexport type ThawAccountInstructionDataArgs = {};\n\nexport function getThawAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: THAW_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getThawAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getThawAccountInstructionDataCodec(): FixedSizeCodec<\n ThawAccountInstructionDataArgs,\n ThawAccountInstructionData\n> {\n return combineCodec(\n getThawAccountInstructionDataEncoder(),\n getThawAccountInstructionDataDecoder()\n );\n}\n\nexport type ThawAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to thaw. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getThawAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: ThawAccountInput,\n config?: { programAddress?: TProgramAddress }\n): ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getThawAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedThawAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to thaw. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ThawAccountInstructionData;\n};\n\nexport function parseThawAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedThawAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getThawAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_DISCRIMINATOR = 3;\n\nexport function getTransferDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_DISCRIMINATOR);\n}\n\nexport type TransferInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n};\n\nexport type TransferInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n};\n\nexport function getTransferInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_DISCRIMINATOR })\n );\n}\n\nexport function getTransferInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getTransferInstructionDataCodec(): FixedSizeCodec<\n TransferInstructionDataArgs,\n TransferInstructionData\n> {\n return combineCodec(\n getTransferInstructionDataEncoder(),\n getTransferInstructionDataDecoder()\n );\n}\n\nexport type TransferInput<\n TAccountSource extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getTransferInstruction<\n TAccountSource extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: TransferInput,\n config?: { programAddress?: TProgramAddress }\n): TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferInstructionDataEncoder().encode(\n args as TransferInstructionDataArgs\n ),\n programAddress,\n } as TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: TransferInstructionData;\n};\n\nexport function parseTransferInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_CHECKED_DISCRIMINATOR = 12;\n\nexport function getTransferCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_CHECKED_DISCRIMINATOR);\n}\n\nexport type TransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type TransferCheckedInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getTransferCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getTransferCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getTransferCheckedInstructionDataCodec(): FixedSizeCodec<\n TransferCheckedInstructionDataArgs,\n TransferCheckedInstructionData\n> {\n return combineCodec(\n getTransferCheckedInstructionDataEncoder(),\n getTransferCheckedInstructionDataDecoder()\n );\n}\n\nexport type TransferCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferCheckedInstructionDataArgs['amount'];\n decimals: TransferCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getTransferCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: TransferCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferCheckedInstructionDataEncoder().encode(\n args as TransferCheckedInstructionDataArgs\n ),\n programAddress,\n } as TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The destination account. */\n destination: TAccountMetas[2];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: TransferCheckedInstructionData;\n};\n\nexport function parseTransferCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR = 24;\n\nexport function getUiAmountToAmountDiscriminatorBytes() {\n return getU8Encoder().encode(UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR);\n}\n\nexport type UiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UiAmountToAmountInstructionData = {\n discriminator: number;\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport type UiAmountToAmountInstructionDataArgs = {\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport function getUiAmountToAmountInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['uiAmount', getUtf8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getUiAmountToAmountInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['uiAmount', getUtf8Decoder()],\n ]);\n}\n\nexport function getUiAmountToAmountInstructionDataCodec(): Codec<\n UiAmountToAmountInstructionDataArgs,\n UiAmountToAmountInstructionData\n> {\n return combineCodec(\n getUiAmountToAmountInstructionDataEncoder(),\n getUiAmountToAmountInstructionDataDecoder()\n );\n}\n\nexport type UiAmountToAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n uiAmount: UiAmountToAmountInstructionDataArgs['uiAmount'];\n};\n\nexport function getUiAmountToAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: UiAmountToAmountInput,\n config?: { programAddress?: TProgramAddress }\n): UiAmountToAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getUiAmountToAmountInstructionDataEncoder().encode(\n args as UiAmountToAmountInstructionDataArgs\n ),\n programAddress,\n } as UiAmountToAmountInstruction);\n}\n\nexport type ParsedUiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: UiAmountToAmountInstructionData;\n};\n\nexport function parseUiAmountToAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUiAmountToAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getUiAmountToAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU32Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedAdvanceNonceAccountInstruction,\n type ParsedAllocateInstruction,\n type ParsedAllocateWithSeedInstruction,\n type ParsedAssignInstruction,\n type ParsedAssignWithSeedInstruction,\n type ParsedAuthorizeNonceAccountInstruction,\n type ParsedCreateAccountInstruction,\n type ParsedCreateAccountWithSeedInstruction,\n type ParsedInitializeNonceAccountInstruction,\n type ParsedTransferSolInstruction,\n type ParsedTransferSolWithSeedInstruction,\n type ParsedUpgradeNonceAccountInstruction,\n type ParsedWithdrawNonceAccountInstruction,\n} from '../instructions';\n\nexport const SYSTEM_PROGRAM_ADDRESS =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n\nexport enum SystemAccount {\n Nonce,\n}\n\nexport enum SystemInstruction {\n CreateAccount,\n Assign,\n TransferSol,\n CreateAccountWithSeed,\n AdvanceNonceAccount,\n WithdrawNonceAccount,\n InitializeNonceAccount,\n AuthorizeNonceAccount,\n Allocate,\n AllocateWithSeed,\n AssignWithSeed,\n TransferSolWithSeed,\n UpgradeNonceAccount,\n}\n\nexport function identifySystemInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): SystemInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU32Encoder().encode(0), 0)) {\n return SystemInstruction.CreateAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(1), 0)) {\n return SystemInstruction.Assign;\n }\n if (containsBytes(data, getU32Encoder().encode(2), 0)) {\n return SystemInstruction.TransferSol;\n }\n if (containsBytes(data, getU32Encoder().encode(3), 0)) {\n return SystemInstruction.CreateAccountWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(4), 0)) {\n return SystemInstruction.AdvanceNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(5), 0)) {\n return SystemInstruction.WithdrawNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(6), 0)) {\n return SystemInstruction.InitializeNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(7), 0)) {\n return SystemInstruction.AuthorizeNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(8), 0)) {\n return SystemInstruction.Allocate;\n }\n if (containsBytes(data, getU32Encoder().encode(9), 0)) {\n return SystemInstruction.AllocateWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(10), 0)) {\n return SystemInstruction.AssignWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(11), 0)) {\n return SystemInstruction.TransferSolWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(12), 0)) {\n return SystemInstruction.UpgradeNonceAccount;\n }\n throw new Error(\n 'The provided instruction could not be identified as a system instruction.'\n );\n}\n\nexport type ParsedSystemInstruction<\n TProgram extends string = '11111111111111111111111111111111',\n> =\n | ({\n instructionType: SystemInstruction.CreateAccount;\n } & ParsedCreateAccountInstruction)\n | ({\n instructionType: SystemInstruction.Assign;\n } & ParsedAssignInstruction)\n | ({\n instructionType: SystemInstruction.TransferSol;\n } & ParsedTransferSolInstruction)\n | ({\n instructionType: SystemInstruction.CreateAccountWithSeed;\n } & ParsedCreateAccountWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.AdvanceNonceAccount;\n } & ParsedAdvanceNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.WithdrawNonceAccount;\n } & ParsedWithdrawNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.InitializeNonceAccount;\n } & ParsedInitializeNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.AuthorizeNonceAccount;\n } & ParsedAuthorizeNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.Allocate;\n } & ParsedAllocateInstruction)\n | ({\n instructionType: SystemInstruction.AllocateWithSeed;\n } & ParsedAllocateWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.AssignWithSeed;\n } & ParsedAssignWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.TransferSolWithSeed;\n } & ParsedTransferSolWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.UpgradeNonceAccount;\n } & ParsedUpgradeNonceAccountInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { SYSTEM_PROGRAM_ADDRESS } from '../programs';\n\n/** AccountAlreadyInUse: an account with the same address already exists */\nexport const SYSTEM_ERROR__ACCOUNT_ALREADY_IN_USE = 0x0; // 0\n/** ResultWithNegativeLamports: account does not have enough SOL to perform the operation */\nexport const SYSTEM_ERROR__RESULT_WITH_NEGATIVE_LAMPORTS = 0x1; // 1\n/** InvalidProgramId: cannot assign account to this program id */\nexport const SYSTEM_ERROR__INVALID_PROGRAM_ID = 0x2; // 2\n/** InvalidAccountDataLength: cannot allocate account data of this length */\nexport const SYSTEM_ERROR__INVALID_ACCOUNT_DATA_LENGTH = 0x3; // 3\n/** MaxSeedLengthExceeded: length of requested seed is too long */\nexport const SYSTEM_ERROR__MAX_SEED_LENGTH_EXCEEDED = 0x4; // 4\n/** AddressWithSeedMismatch: provided address does not match addressed derived from seed */\nexport const SYSTEM_ERROR__ADDRESS_WITH_SEED_MISMATCH = 0x5; // 5\n/** NonceNoRecentBlockhashes: advancing stored nonce requires a populated RecentBlockhashes sysvar */\nexport const SYSTEM_ERROR__NONCE_NO_RECENT_BLOCKHASHES = 0x6; // 6\n/** NonceBlockhashNotExpired: stored nonce is still in recent_blockhashes */\nexport const SYSTEM_ERROR__NONCE_BLOCKHASH_NOT_EXPIRED = 0x7; // 7\n/** NonceUnexpectedBlockhashValue: specified nonce does not match stored nonce */\nexport const SYSTEM_ERROR__NONCE_UNEXPECTED_BLOCKHASH_VALUE = 0x8; // 8\n\nexport type SystemError =\n | typeof SYSTEM_ERROR__ACCOUNT_ALREADY_IN_USE\n | typeof SYSTEM_ERROR__ADDRESS_WITH_SEED_MISMATCH\n | typeof SYSTEM_ERROR__INVALID_ACCOUNT_DATA_LENGTH\n | typeof SYSTEM_ERROR__INVALID_PROGRAM_ID\n | typeof SYSTEM_ERROR__MAX_SEED_LENGTH_EXCEEDED\n | typeof SYSTEM_ERROR__NONCE_BLOCKHASH_NOT_EXPIRED\n | typeof SYSTEM_ERROR__NONCE_NO_RECENT_BLOCKHASHES\n | typeof SYSTEM_ERROR__NONCE_UNEXPECTED_BLOCKHASH_VALUE\n | typeof SYSTEM_ERROR__RESULT_WITH_NEGATIVE_LAMPORTS;\n\nlet systemErrorMessages: Record | undefined;\nif (process.env.NODE_ENV !== 'production') {\n systemErrorMessages = {\n [SYSTEM_ERROR__ACCOUNT_ALREADY_IN_USE]: `an account with the same address already exists`,\n [SYSTEM_ERROR__ADDRESS_WITH_SEED_MISMATCH]: `provided address does not match addressed derived from seed`,\n [SYSTEM_ERROR__INVALID_ACCOUNT_DATA_LENGTH]: `cannot allocate account data of this length`,\n [SYSTEM_ERROR__INVALID_PROGRAM_ID]: `cannot assign account to this program id`,\n [SYSTEM_ERROR__MAX_SEED_LENGTH_EXCEEDED]: `length of requested seed is too long`,\n [SYSTEM_ERROR__NONCE_BLOCKHASH_NOT_EXPIRED]: `stored nonce is still in recent_blockhashes`,\n [SYSTEM_ERROR__NONCE_NO_RECENT_BLOCKHASHES]: `advancing stored nonce requires a populated RecentBlockhashes sysvar`,\n [SYSTEM_ERROR__NONCE_UNEXPECTED_BLOCKHASH_VALUE]: `specified nonce does not match stored nonce`,\n [SYSTEM_ERROR__RESULT_WITH_NEGATIVE_LAMPORTS]: `account does not have enough SOL to perform the operation`,\n };\n}\n\nexport function getSystemErrorMessage(code: SystemError): string {\n if (process.env.NODE_ENV !== 'production') {\n return (systemErrorMessages as Record)[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isSystemError(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n SYSTEM_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from '@solana/kit';\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected a value but received null or undefined.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): Address {\n if (!value) {\n throw new Error('Expected a Address.');\n }\n if (typeof value === 'object' && 'address' in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address;\n }\n return value as Address;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): ProgramDerivedAddress {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error('Expected a ProgramDerivedAddress.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): TransactionSigner {\n if (!value || !isTransactionSigner(value)) {\n throw new Error('Expected a TransactionSigner.');\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null =\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: 'omitted' | 'programId'\n) {\n return (\n account: ResolvedAccount\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === 'omitted') return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n): value is TransactionSigner {\n return (\n !!value &&\n typeof value === 'object' &&\n 'address' in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n BASE_ACCOUNT_SIZE,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { SYSTEM_PROGRAM_ADDRESS } from '../programs';\nimport {\n getAccountMetaFactory,\n type InstructionWithByteDelta,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ACCOUNT_DISCRIMINATOR = 0;\n\nexport function getCreateAccountDiscriminatorBytes() {\n return getU32Encoder().encode(CREATE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type CreateAccountInstruction<\n TProgram extends string = typeof SYSTEM_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountNewAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountNewAccount extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountNewAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAccountInstructionData = {\n discriminator: number;\n lamports: bigint;\n space: bigint;\n programAddress: Address;\n};\n\nexport type CreateAccountInstructionDataArgs = {\n lamports: number | bigint;\n space: number | bigint;\n programAddress: Address;\n};\n\nexport function getCreateAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU32Encoder()],\n ['lamports', getU64Encoder()],\n ['space', getU64Encoder()],\n ['programAddress', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: CREATE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getCreateAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU32Decoder()],\n ['lamports', getU64Decoder()],\n ['space', getU64Decoder()],\n ['programAddress', getAddressDecoder()],\n ]);\n}\n\nexport function getCreateAccountInstructionDataCodec(): FixedSizeCodec<\n CreateAccountInstructionDataArgs,\n CreateAccountInstructionData\n> {\n return combineCodec(\n getCreateAccountInstructionDataEncoder(),\n getCreateAccountInstructionDataDecoder()\n );\n}\n\nexport type CreateAccountInput<\n TAccountPayer extends string = string,\n TAccountNewAccount extends string = string,\n> = {\n payer: TransactionSigner;\n newAccount: TransactionSigner;\n lamports: CreateAccountInstructionDataArgs['lamports'];\n space: CreateAccountInstructionDataArgs['space'];\n programAddress: CreateAccountInstructionDataArgs['programAddress'];\n};\n\nexport function getCreateAccountInstruction<\n TAccountPayer extends string,\n TAccountNewAccount extends string,\n TProgramAddress extends Address = typeof SYSTEM_PROGRAM_ADDRESS,\n>(\n input: CreateAccountInput,\n config?: { programAddress?: TProgramAddress }\n): CreateAccountInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNewAccount\n> &\n InstructionWithByteDelta {\n // Program address.\n const programAddress = config?.programAddress ?? SYSTEM_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n newAccount: { value: input.newAccount ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Bytes created or reallocated by the instruction.\n const byteDelta: number = [Number(args.space) + BASE_ACCOUNT_SIZE].reduce(\n (a, b) => a + b,\n 0\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'omitted');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.newAccount),\n ],\n byteDelta,\n data: getCreateAccountInstructionDataEncoder().encode(\n args as CreateAccountInstructionDataArgs\n ),\n programAddress,\n } as CreateAccountInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNewAccount\n > &\n InstructionWithByteDelta);\n}\n\nexport type ParsedCreateAccountInstruction<\n TProgram extends string = typeof SYSTEM_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n payer: TAccountMetas[0];\n newAccount: TAccountMetas[1];\n };\n data: CreateAccountInstructionData;\n};\n\nexport function parseCreateAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAccountInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { payer: getNextAccount(), newAccount: getNextAccount() },\n data: getCreateAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","import { getCreateAccountInstruction } from '@solana-program/system';\nimport {\n Address,\n InstructionPlan,\n OptionOrNullable,\n sequentialInstructionPlan,\n TransactionSigner,\n} from '@solana/kit';\nimport {\n getInitializeMint2Instruction,\n getMintSize,\n TOKEN_PROGRAM_ADDRESS,\n} from './generated';\n\n// RPC `getMinimumBalanceForRentExemption` for 82 bytes, which is token mint size\n// Hardcoded to avoid requiring an RPC request each time\nconst MINIMUM_BALANCE_FOR_MINT = 1461600;\n\nexport type CreateMintInstructionPlanInput = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** New mint account to create. */\n newMint: TransactionSigner;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority?: OptionOrNullable
;\n /**\n * Optional override for the amount of Lamports to fund the mint account with.\n * @default 1461600\n * */\n mintAccountLamports?: number;\n};\n\ntype CreateMintInstructionPlanConfig = {\n systemProgram?: Address;\n tokenProgram?: Address;\n};\n\nexport function getCreateMintInstructionPlan(\n input: CreateMintInstructionPlanInput,\n config?: CreateMintInstructionPlanConfig\n): InstructionPlan {\n return sequentialInstructionPlan([\n getCreateAccountInstruction(\n {\n payer: input.payer,\n newAccount: input.newMint,\n lamports: input.mintAccountLamports ?? MINIMUM_BALANCE_FOR_MINT,\n space: getMintSize(),\n programAddress: config?.tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n },\n {\n programAddress: config?.systemProgram,\n }\n ),\n getInitializeMint2Instruction(\n {\n mint: input.newMint.address,\n decimals: input.decimals,\n mintAuthority: input.mintAuthority,\n freezeAuthority: input.freezeAuthority,\n },\n {\n programAddress: config?.tokenProgram,\n }\n ),\n ]);\n}\n","import {\n InstructionPlan,\n sequentialInstructionPlan,\n Address,\n TransactionSigner,\n} from '@solana/kit';\nimport {\n findAssociatedTokenPda,\n getCreateAssociatedTokenIdempotentInstruction,\n getMintToCheckedInstruction,\n TOKEN_PROGRAM_ADDRESS,\n} from './generated';\n\ntype MintToATAInstructionPlanInput = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to mint to.\n * Will be created if it does not already exist.\n * Note: Use {@link getMintToATAInstructionPlanAsync} instead to derive this automatically.\n * Note: Use {@link findAssociatedTokenPda} to derive the associated token account address.\n */\n ata: Address;\n /** Wallet address for the associated token account. */\n owner: Address;\n /** The token mint for the associated token account. */\n mint: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: Address | TransactionSigner;\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n multiSigners?: Array;\n};\n\ntype MintToATAInstructionPlanConfig = {\n systemProgram?: Address;\n tokenProgram?: Address;\n associatedTokenProgram?: Address;\n};\n\nexport function getMintToATAInstructionPlan(\n input: MintToATAInstructionPlanInput,\n config?: MintToATAInstructionPlanConfig\n): InstructionPlan {\n return sequentialInstructionPlan([\n getCreateAssociatedTokenIdempotentInstruction(\n {\n payer: input.payer,\n ata: input.ata,\n owner: input.owner,\n mint: input.mint,\n systemProgram: config?.systemProgram,\n tokenProgram: config?.tokenProgram,\n },\n {\n programAddress: config?.associatedTokenProgram,\n }\n ),\n // mint to this token account\n getMintToCheckedInstruction(\n {\n mint: input.mint,\n token: input.ata,\n mintAuthority: input.mintAuthority,\n amount: input.amount,\n decimals: input.decimals,\n multiSigners: input.multiSigners,\n },\n {\n programAddress: config?.tokenProgram,\n }\n ),\n ]);\n}\n\ntype MintToATAInstructionPlanAsyncInput = Omit<\n MintToATAInstructionPlanInput,\n 'ata'\n>;\n\nexport async function getMintToATAInstructionPlanAsync(\n input: MintToATAInstructionPlanAsyncInput,\n config?: MintToATAInstructionPlanConfig\n): Promise {\n const [ataAddress] = await findAssociatedTokenPda({\n owner: input.owner,\n tokenProgram: config?.tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n mint: input.mint,\n });\n return getMintToATAInstructionPlan(\n {\n ...input,\n ata: ataAddress,\n },\n config\n );\n}\n","import {\n InstructionPlan,\n sequentialInstructionPlan,\n Address,\n TransactionSigner,\n} from '@solana/kit';\nimport {\n findAssociatedTokenPda,\n getCreateAssociatedTokenIdempotentInstruction,\n getTransferCheckedInstruction,\n TOKEN_PROGRAM_ADDRESS,\n} from './generated';\n\ntype TransferToATAInstructionPlanInput = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** The token mint to transfer. */\n mint: Address;\n /** The source account for the transfer. */\n source: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n /** Associated token account address to transfer to.\n * Will be created if it does not already exist.\n * Note: Use {@link getTransferToATAInstructionPlanAsync} instead to derive this automatically.\n * Note: Use {@link findAssociatedTokenPda} to derive the associated token account address.\n */\n destination: Address;\n /** Wallet address for the destination. */\n recipient: Address;\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n multiSigners?: Array;\n};\n\ntype TransferToATAInstructionPlanConfig = {\n systemProgram?: Address;\n tokenProgram?: Address;\n associatedTokenProgram?: Address;\n};\n\nexport function getTransferToATAInstructionPlan(\n input: TransferToATAInstructionPlanInput,\n config?: TransferToATAInstructionPlanConfig\n): InstructionPlan {\n return sequentialInstructionPlan([\n getCreateAssociatedTokenIdempotentInstruction(\n {\n payer: input.payer,\n ata: input.destination,\n owner: input.recipient,\n mint: input.mint,\n systemProgram: config?.systemProgram,\n tokenProgram: config?.tokenProgram,\n },\n {\n programAddress: config?.associatedTokenProgram,\n }\n ),\n getTransferCheckedInstruction(\n {\n source: input.source,\n mint: input.mint,\n destination: input.destination,\n authority: input.authority,\n amount: input.amount,\n decimals: input.decimals,\n multiSigners: input.multiSigners,\n },\n {\n programAddress: config?.tokenProgram,\n }\n ),\n ]);\n}\n\ntype TransferToATAInstructionPlanAsyncInput = Omit<\n TransferToATAInstructionPlanInput,\n 'destination'\n>;\n\nexport async function getTransferToATAInstructionPlanAsync(\n input: TransferToATAInstructionPlanAsyncInput,\n config?: TransferToATAInstructionPlanConfig\n): Promise {\n const [ataAddress] = await findAssociatedTokenPda({\n owner: input.recipient,\n tokenProgram: config?.tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n mint: input.mint,\n });\n return getTransferToATAInstructionPlan(\n {\n ...input,\n destination: ataAddress,\n },\n config\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AccountState {\n Uninitialized,\n Initialized,\n Frozen,\n}\n\nexport type AccountStateArgs = AccountState;\n\nexport function getAccountStateEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AccountState);\n}\n\nexport function getAccountStateDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AccountState);\n}\n\nexport function getAccountStateCodec(): FixedSizeCodec<\n AccountStateArgs,\n AccountState\n> {\n return combineCodec(getAccountStateEncoder(), getAccountStateDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AuthorityType {\n MintTokens,\n FreezeAccount,\n AccountOwner,\n CloseAccount,\n TransferFeeConfig,\n WithheldWithdraw,\n CloseMint,\n InterestRate,\n PermanentDelegate,\n ConfidentialTransferMint,\n TransferHookProgramId,\n ConfidentialTransferFeeConfig,\n MetadataPointer,\n GroupPointer,\n GroupMemberPointer,\n ScaledUiAmount,\n Pause,\n}\n\nexport type AuthorityTypeArgs = AuthorityType;\n\nexport function getAuthorityTypeEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AuthorityType);\n}\n\nexport function getAuthorityTypeDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AuthorityType);\n}\n\nexport function getAuthorityTypeCodec(): FixedSizeCodec<\n AuthorityTypeArgs,\n AuthorityType\n> {\n return combineCodec(getAuthorityTypeEncoder(), getAuthorityTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from '@solana/kit';\n\n/** Authenticated encryption containing an account balance. */\nexport type DecryptableBalance = ReadonlyUint8Array;\n\nexport type DecryptableBalanceArgs = DecryptableBalance;\n\nexport function getDecryptableBalanceEncoder(): FixedSizeEncoder {\n return fixEncoderSize(getBytesEncoder(), 36);\n}\n\nexport function getDecryptableBalanceDecoder(): FixedSizeDecoder {\n return fixDecoderSize(getBytesDecoder(), 36);\n}\n\nexport function getDecryptableBalanceCodec(): FixedSizeCodec<\n DecryptableBalanceArgs,\n DecryptableBalance\n> {\n return combineCodec(\n getDecryptableBalanceEncoder(),\n getDecryptableBalanceDecoder()\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from '@solana/kit';\n\n/** ElGamal ciphertext containing an account balance. */\nexport type EncryptedBalance = ReadonlyUint8Array;\n\nexport type EncryptedBalanceArgs = EncryptedBalance;\n\nexport function getEncryptedBalanceEncoder(): FixedSizeEncoder {\n return fixEncoderSize(getBytesEncoder(), 64);\n}\n\nexport function getEncryptedBalanceDecoder(): FixedSizeDecoder {\n return fixDecoderSize(getBytesDecoder(), 64);\n}\n\nexport function getEncryptedBalanceCodec(): FixedSizeCodec<\n EncryptedBalanceArgs,\n EncryptedBalance\n> {\n return combineCodec(\n getEncryptedBalanceEncoder(),\n getEncryptedBalanceDecoder()\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getDiscriminatedUnionDecoder,\n getDiscriminatedUnionEncoder,\n getF64Decoder,\n getF64Encoder,\n getI16Decoder,\n getI16Encoder,\n getMapDecoder,\n getMapEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getUnitDecoder,\n getUnitEncoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type GetDiscriminatedUnionVariant,\n type GetDiscriminatedUnionVariantContent,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n getEncryptedBalanceDecoder,\n getEncryptedBalanceEncoder,\n getTransferFeeDecoder,\n getTransferFeeEncoder,\n type AccountState,\n type AccountStateArgs,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n type EncryptedBalance,\n type EncryptedBalanceArgs,\n type TransferFee,\n type TransferFeeArgs,\n} from '.';\n\nexport type Extension =\n | { __kind: 'Uninitialized' }\n | {\n __kind: 'TransferFeeConfig';\n /** Optional authority to set the fee. */\n transferFeeConfigAuthority: Address;\n /** Withdraw from mint instructions must be signed by this key. */\n withdrawWithheldAuthority: Address;\n /** Withheld transfer fee tokens that have been moved to the mint for withdrawal. */\n withheldAmount: bigint;\n /** Older transfer fee, used if the current epoch < newerTransferFee.epoch. */\n olderTransferFee: TransferFee;\n /** Newer transfer fee, used if the current epoch >= newerTransferFee.epoch. */\n newerTransferFee: TransferFee;\n }\n | {\n __kind: 'TransferFeeAmount';\n /** Withheld transfer fee tokens that can be claimed by the fee authority. */\n withheldAmount: bigint;\n }\n | { __kind: 'MintCloseAuthority'; closeAuthority: Address }\n | {\n __kind: 'ConfidentialTransferMint';\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts (if `auto_approve_new_accounts` is true).\n *\n * The legacy Token Multisig account is not supported as the authority.\n */\n authority: Option
;\n /**\n * Indicate if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n *\n * * If `true`, no approval is required and new accounts may be used immediately.\n * * If `false`, the authority must approve newly configured accounts (see\n * `ConfidentialTransferInstruction::ConfigureAccount`).\n */\n autoApproveNewAccounts: boolean;\n /** Authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: Option
;\n }\n | {\n __kind: 'ConfidentialTransferAccount';\n /**\n * `true` if this account has been approved for use. All confidential\n * transfer operations for the account will fail until approval is granted.\n */\n approved: boolean;\n /** The public key associated with ElGamal encryption. */\n elgamalPubkey: Address;\n /** The low 16 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceLow: EncryptedBalance;\n /** The high 32 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceHigh: EncryptedBalance;\n /** The available balance (encrypted by `encrypiton_pubkey`). */\n availableBalance: EncryptedBalance;\n /** The decryptable available balance. */\n decryptableAvailableBalance: DecryptableBalance;\n /** If `false`, the extended account rejects any incoming confidential transfers. */\n allowConfidentialCredits: boolean;\n /** If `false`, the base account rejects any incoming transfers. */\n allowNonConfidentialCredits: boolean;\n /** The total number of `Deposit` and `Transfer` instructions that have credited `pending_balance`. */\n pendingBalanceCreditCounter: bigint;\n /**\n * The maximum number of `Deposit` and `Transfer` instructions that can\n * credit `pending_balance` before the `ApplyPendingBalance`\n * instruction is executed.\n */\n maximumPendingBalanceCreditCounter: bigint;\n /**\n * The `expected_pending_balance_credit_counter` value that was included in\n * the last `ApplyPendingBalance` instruction.\n */\n expectedPendingBalanceCreditCounter: bigint;\n /**\n * The actual `pending_balance_credit_counter` when the last\n * `ApplyPendingBalance` instruction was executed.\n */\n actualPendingBalanceCreditCounter: bigint;\n }\n | { __kind: 'DefaultAccountState'; state: AccountState }\n | { __kind: 'ImmutableOwner' }\n | {\n __kind: 'MemoTransfer';\n /** Require transfers into this account to be accompanied by a memo. */\n requireIncomingTransferMemos: boolean;\n }\n | { __kind: 'NonTransferable' }\n | {\n __kind: 'InterestBearingConfig';\n rateAuthority: Address;\n initializationTimestamp: bigint;\n preUpdateAverageRate: number;\n lastUpdateTimestamp: bigint;\n currentRate: number;\n }\n | {\n __kind: 'CpiGuard';\n /** Lock certain token operations from taking place within CPI for this account. */\n lockCpi: boolean;\n }\n | { __kind: 'PermanentDelegate'; delegate: Address }\n | { __kind: 'NonTransferableAccount' }\n | {\n __kind: 'TransferHook';\n /** The transfer hook update authority. */\n authority: Address;\n /** The transfer hook program account. */\n programId: Address;\n }\n | {\n __kind: 'TransferHookAccount';\n /**\n * Whether or not this account is currently transferring tokens\n * True during the transfer hook cpi, otherwise false.\n */\n transferring: boolean;\n }\n | {\n __kind: 'ConfidentialTransferFee';\n /** Optional authority to set the withdraw withheld authority ElGamal key. */\n authority: Option
;\n /**\n * Withheld fees from accounts must be encrypted with this ElGamal key.\n *\n * Note that whoever holds the ElGamal private key for this ElGamal public\n * key has the ability to decode any withheld fee amount that are\n * associated with accounts. When combined with the fee parameters, the\n * withheld fee amounts can reveal information about transfer amounts.\n */\n elgamalPubkey: Address;\n /** If `false`, the harvest of withheld tokens to mint is rejected. */\n harvestToMintEnabled: boolean;\n /**\n * Withheld confidential transfer fee tokens that have been moved to the\n * mint for withdrawal.\n */\n withheldAmount: EncryptedBalance;\n }\n | {\n __kind: 'ConfidentialTransferFeeAmount';\n /** Amount withheld during confidential transfers, to be harvest to the mint. */\n withheldAmount: EncryptedBalance;\n }\n | {\n __kind: 'MetadataPointer';\n /** Optional authority that can set the metadata address. */\n authority: Option
;\n /** Optional Account Address that holds the metadata. */\n metadataAddress: Option
;\n }\n | {\n __kind: 'TokenMetadata';\n /** The authority that can sign to update the metadata. */\n updateAuthority: Option
;\n /** The associated mint, used to counter spoofing to be sure that metadata belongs to a particular mint. */\n mint: Address;\n /** The longer name of the token. */\n name: string;\n /** The shortened symbol for the token. */\n symbol: string;\n /** The URI pointing to richer metadata. */\n uri: string;\n /** Any additional metadata about the token as key-value pairs. */\n additionalMetadata: Map;\n }\n | {\n __kind: 'GroupPointer';\n /** Optional authority that can set the group address. */\n authority: Option
;\n /** Optional account address that holds the group. */\n groupAddress: Option
;\n }\n | {\n __kind: 'TokenGroup';\n /** The authority that can sign to update the group. */\n updateAuthority: Option
;\n /** The associated mint, used to counter spoofing to be sure that group belongs to a particular mint. */\n mint: Address;\n /** The current number of group members. */\n size: bigint;\n /** The maximum number of group members. */\n maxSize: bigint;\n }\n | {\n __kind: 'GroupMemberPointer';\n /** Optional authority that can set the member address. */\n authority: Option
;\n /** Optional account address that holds the member. */\n memberAddress: Option
;\n }\n | {\n __kind: 'TokenGroupMember';\n /** The associated mint, used to counter spoofing to be sure that member belongs to a particular mint. */\n mint: Address;\n /** The pubkey of the `TokenGroup`. */\n group: Address;\n /** The member number. */\n memberNumber: bigint;\n }\n | { __kind: 'ConfidentialMintBurn' }\n | {\n __kind: 'ScaledUiAmountConfig';\n authority: Address;\n multiplier: number;\n newMultiplierEffectiveTimestamp: bigint;\n newMultiplier: number;\n }\n | { __kind: 'PausableConfig'; authority: Option
; paused: boolean }\n | { __kind: 'PausableAccount' };\n\nexport type ExtensionArgs =\n | { __kind: 'Uninitialized' }\n | {\n __kind: 'TransferFeeConfig';\n /** Optional authority to set the fee. */\n transferFeeConfigAuthority: Address;\n /** Withdraw from mint instructions must be signed by this key. */\n withdrawWithheldAuthority: Address;\n /** Withheld transfer fee tokens that have been moved to the mint for withdrawal. */\n withheldAmount: number | bigint;\n /** Older transfer fee, used if the current epoch < newerTransferFee.epoch. */\n olderTransferFee: TransferFeeArgs;\n /** Newer transfer fee, used if the current epoch >= newerTransferFee.epoch. */\n newerTransferFee: TransferFeeArgs;\n }\n | {\n __kind: 'TransferFeeAmount';\n /** Withheld transfer fee tokens that can be claimed by the fee authority. */\n withheldAmount: number | bigint;\n }\n | { __kind: 'MintCloseAuthority'; closeAuthority: Address }\n | {\n __kind: 'ConfidentialTransferMint';\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts (if `auto_approve_new_accounts` is true).\n *\n * The legacy Token Multisig account is not supported as the authority.\n */\n authority: OptionOrNullable
;\n /**\n * Indicate if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n *\n * * If `true`, no approval is required and new accounts may be used immediately.\n * * If `false`, the authority must approve newly configured accounts (see\n * `ConfidentialTransferInstruction::ConfigureAccount`).\n */\n autoApproveNewAccounts: boolean;\n /** Authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: OptionOrNullable
;\n }\n | {\n __kind: 'ConfidentialTransferAccount';\n /**\n * `true` if this account has been approved for use. All confidential\n * transfer operations for the account will fail until approval is granted.\n */\n approved: boolean;\n /** The public key associated with ElGamal encryption. */\n elgamalPubkey: Address;\n /** The low 16 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceLow: EncryptedBalanceArgs;\n /** The high 32 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceHigh: EncryptedBalanceArgs;\n /** The available balance (encrypted by `encrypiton_pubkey`). */\n availableBalance: EncryptedBalanceArgs;\n /** The decryptable available balance. */\n decryptableAvailableBalance: DecryptableBalanceArgs;\n /** If `false`, the extended account rejects any incoming confidential transfers. */\n allowConfidentialCredits: boolean;\n /** If `false`, the base account rejects any incoming transfers. */\n allowNonConfidentialCredits: boolean;\n /** The total number of `Deposit` and `Transfer` instructions that have credited `pending_balance`. */\n pendingBalanceCreditCounter: number | bigint;\n /**\n * The maximum number of `Deposit` and `Transfer` instructions that can\n * credit `pending_balance` before the `ApplyPendingBalance`\n * instruction is executed.\n */\n maximumPendingBalanceCreditCounter: number | bigint;\n /**\n * The `expected_pending_balance_credit_counter` value that was included in\n * the last `ApplyPendingBalance` instruction.\n */\n expectedPendingBalanceCreditCounter: number | bigint;\n /**\n * The actual `pending_balance_credit_counter` when the last\n * `ApplyPendingBalance` instruction was executed.\n */\n actualPendingBalanceCreditCounter: number | bigint;\n }\n | { __kind: 'DefaultAccountState'; state: AccountStateArgs }\n | { __kind: 'ImmutableOwner' }\n | {\n __kind: 'MemoTransfer';\n /** Require transfers into this account to be accompanied by a memo. */\n requireIncomingTransferMemos: boolean;\n }\n | { __kind: 'NonTransferable' }\n | {\n __kind: 'InterestBearingConfig';\n rateAuthority: Address;\n initializationTimestamp: number | bigint;\n preUpdateAverageRate: number;\n lastUpdateTimestamp: number | bigint;\n currentRate: number;\n }\n | {\n __kind: 'CpiGuard';\n /** Lock certain token operations from taking place within CPI for this account. */\n lockCpi: boolean;\n }\n | { __kind: 'PermanentDelegate'; delegate: Address }\n | { __kind: 'NonTransferableAccount' }\n | {\n __kind: 'TransferHook';\n /** The transfer hook update authority. */\n authority: Address;\n /** The transfer hook program account. */\n programId: Address;\n }\n | {\n __kind: 'TransferHookAccount';\n /**\n * Whether or not this account is currently transferring tokens\n * True during the transfer hook cpi, otherwise false.\n */\n transferring: boolean;\n }\n | {\n __kind: 'ConfidentialTransferFee';\n /** Optional authority to set the withdraw withheld authority ElGamal key. */\n authority: OptionOrNullable
;\n /**\n * Withheld fees from accounts must be encrypted with this ElGamal key.\n *\n * Note that whoever holds the ElGamal private key for this ElGamal public\n * key has the ability to decode any withheld fee amount that are\n * associated with accounts. When combined with the fee parameters, the\n * withheld fee amounts can reveal information about transfer amounts.\n */\n elgamalPubkey: Address;\n /** If `false`, the harvest of withheld tokens to mint is rejected. */\n harvestToMintEnabled: boolean;\n /**\n * Withheld confidential transfer fee tokens that have been moved to the\n * mint for withdrawal.\n */\n withheldAmount: EncryptedBalanceArgs;\n }\n | {\n __kind: 'ConfidentialTransferFeeAmount';\n /** Amount withheld during confidential transfers, to be harvest to the mint. */\n withheldAmount: EncryptedBalanceArgs;\n }\n | {\n __kind: 'MetadataPointer';\n /** Optional authority that can set the metadata address. */\n authority: OptionOrNullable
;\n /** Optional Account Address that holds the metadata. */\n metadataAddress: OptionOrNullable
;\n }\n | {\n __kind: 'TokenMetadata';\n /** The authority that can sign to update the metadata. */\n updateAuthority: OptionOrNullable
;\n /** The associated mint, used to counter spoofing to be sure that metadata belongs to a particular mint. */\n mint: Address;\n /** The longer name of the token. */\n name: string;\n /** The shortened symbol for the token. */\n symbol: string;\n /** The URI pointing to richer metadata. */\n uri: string;\n /** Any additional metadata about the token as key-value pairs. */\n additionalMetadata: Map;\n }\n | {\n __kind: 'GroupPointer';\n /** Optional authority that can set the group address. */\n authority: OptionOrNullable
;\n /** Optional account address that holds the group. */\n groupAddress: OptionOrNullable
;\n }\n | {\n __kind: 'TokenGroup';\n /** The authority that can sign to update the group. */\n updateAuthority: OptionOrNullable
;\n /** The associated mint, used to counter spoofing to be sure that group belongs to a particular mint. */\n mint: Address;\n /** The current number of group members. */\n size: number | bigint;\n /** The maximum number of group members. */\n maxSize: number | bigint;\n }\n | {\n __kind: 'GroupMemberPointer';\n /** Optional authority that can set the member address. */\n authority: OptionOrNullable
;\n /** Optional account address that holds the member. */\n memberAddress: OptionOrNullable
;\n }\n | {\n __kind: 'TokenGroupMember';\n /** The associated mint, used to counter spoofing to be sure that member belongs to a particular mint. */\n mint: Address;\n /** The pubkey of the `TokenGroup`. */\n group: Address;\n /** The member number. */\n memberNumber: number | bigint;\n }\n | { __kind: 'ConfidentialMintBurn' }\n | {\n __kind: 'ScaledUiAmountConfig';\n authority: Address;\n multiplier: number;\n newMultiplierEffectiveTimestamp: number | bigint;\n newMultiplier: number;\n }\n | {\n __kind: 'PausableConfig';\n authority: OptionOrNullable
;\n paused: boolean;\n }\n | { __kind: 'PausableAccount' };\n\nexport function getExtensionEncoder(): Encoder {\n return getDiscriminatedUnionEncoder(\n [\n ['Uninitialized', getUnitEncoder()],\n [\n 'TransferFeeConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n ['transferFeeConfigAuthority', getAddressEncoder()],\n ['withdrawWithheldAuthority', getAddressEncoder()],\n ['withheldAmount', getU64Encoder()],\n ['olderTransferFee', getTransferFeeEncoder()],\n ['newerTransferFee', getTransferFeeEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TransferFeeAmount',\n addEncoderSizePrefix(\n getStructEncoder([['withheldAmount', getU64Encoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'MintCloseAuthority',\n addEncoderSizePrefix(\n getStructEncoder([['closeAuthority', getAddressEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferMint',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanEncoder()],\n [\n 'auditorElgamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferAccount',\n addEncoderSizePrefix(\n getStructEncoder([\n ['approved', getBooleanEncoder()],\n ['elgamalPubkey', getAddressEncoder()],\n ['pendingBalanceLow', getEncryptedBalanceEncoder()],\n ['pendingBalanceHigh', getEncryptedBalanceEncoder()],\n ['availableBalance', getEncryptedBalanceEncoder()],\n ['decryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['allowConfidentialCredits', getBooleanEncoder()],\n ['allowNonConfidentialCredits', getBooleanEncoder()],\n ['pendingBalanceCreditCounter', getU64Encoder()],\n ['maximumPendingBalanceCreditCounter', getU64Encoder()],\n ['expectedPendingBalanceCreditCounter', getU64Encoder()],\n ['actualPendingBalanceCreditCounter', getU64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'DefaultAccountState',\n addEncoderSizePrefix(\n getStructEncoder([['state', getAccountStateEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'ImmutableOwner',\n addEncoderSizePrefix(getStructEncoder([]), getU16Encoder()),\n ],\n [\n 'MemoTransfer',\n addEncoderSizePrefix(\n getStructEncoder([\n ['requireIncomingTransferMemos', getBooleanEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'NonTransferable',\n addEncoderSizePrefix(getStructEncoder([]), getU16Encoder()),\n ],\n [\n 'InterestBearingConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n ['rateAuthority', getAddressEncoder()],\n ['initializationTimestamp', getU64Encoder()],\n ['preUpdateAverageRate', getI16Encoder()],\n ['lastUpdateTimestamp', getU64Encoder()],\n ['currentRate', getI16Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'CpiGuard',\n addEncoderSizePrefix(\n getStructEncoder([['lockCpi', getBooleanEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'PermanentDelegate',\n addEncoderSizePrefix(\n getStructEncoder([['delegate', getAddressEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'NonTransferableAccount',\n addEncoderSizePrefix(getStructEncoder([]), getU16Encoder()),\n ],\n [\n 'TransferHook',\n addEncoderSizePrefix(\n getStructEncoder([\n ['authority', getAddressEncoder()],\n ['programId', getAddressEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TransferHookAccount',\n addEncoderSizePrefix(\n getStructEncoder([['transferring', getBooleanEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferFee',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['elgamalPubkey', getAddressEncoder()],\n ['harvestToMintEnabled', getBooleanEncoder()],\n ['withheldAmount', getEncryptedBalanceEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferFeeAmount',\n addEncoderSizePrefix(\n getStructEncoder([['withheldAmount', getEncryptedBalanceEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'MetadataPointer',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TokenMetadata',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'updateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressEncoder()],\n ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['symbol', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['uri', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\n 'additionalMetadata',\n getMapEncoder(\n addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()),\n addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())\n ),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'GroupPointer',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TokenGroup',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'updateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressEncoder()],\n ['size', getU64Encoder()],\n ['maxSize', getU64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'GroupMemberPointer',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TokenGroupMember',\n addEncoderSizePrefix(\n getStructEncoder([\n ['mint', getAddressEncoder()],\n ['group', getAddressEncoder()],\n ['memberNumber', getU64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n ['ConfidentialMintBurn', getUnitEncoder()],\n [\n 'ScaledUiAmountConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n ['authority', getAddressEncoder()],\n ['multiplier', getF64Encoder()],\n ['newMultiplierEffectiveTimestamp', getU64Encoder()],\n ['newMultiplier', getF64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'PausableConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['paused', getBooleanEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n ['PausableAccount', getUnitEncoder()],\n ],\n { size: getU16Encoder() }\n );\n}\n\nexport function getExtensionDecoder(): Decoder {\n return getDiscriminatedUnionDecoder(\n [\n ['Uninitialized', getUnitDecoder()],\n [\n 'TransferFeeConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n ['transferFeeConfigAuthority', getAddressDecoder()],\n ['withdrawWithheldAuthority', getAddressDecoder()],\n ['withheldAmount', getU64Decoder()],\n ['olderTransferFee', getTransferFeeDecoder()],\n ['newerTransferFee', getTransferFeeDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TransferFeeAmount',\n addDecoderSizePrefix(\n getStructDecoder([['withheldAmount', getU64Decoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'MintCloseAuthority',\n addDecoderSizePrefix(\n getStructDecoder([['closeAuthority', getAddressDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferMint',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanDecoder()],\n [\n 'auditorElgamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferAccount',\n addDecoderSizePrefix(\n getStructDecoder([\n ['approved', getBooleanDecoder()],\n ['elgamalPubkey', getAddressDecoder()],\n ['pendingBalanceLow', getEncryptedBalanceDecoder()],\n ['pendingBalanceHigh', getEncryptedBalanceDecoder()],\n ['availableBalance', getEncryptedBalanceDecoder()],\n ['decryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['allowConfidentialCredits', getBooleanDecoder()],\n ['allowNonConfidentialCredits', getBooleanDecoder()],\n ['pendingBalanceCreditCounter', getU64Decoder()],\n ['maximumPendingBalanceCreditCounter', getU64Decoder()],\n ['expectedPendingBalanceCreditCounter', getU64Decoder()],\n ['actualPendingBalanceCreditCounter', getU64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'DefaultAccountState',\n addDecoderSizePrefix(\n getStructDecoder([['state', getAccountStateDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'ImmutableOwner',\n addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()),\n ],\n [\n 'MemoTransfer',\n addDecoderSizePrefix(\n getStructDecoder([\n ['requireIncomingTransferMemos', getBooleanDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'NonTransferable',\n addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()),\n ],\n [\n 'InterestBearingConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n ['rateAuthority', getAddressDecoder()],\n ['initializationTimestamp', getU64Decoder()],\n ['preUpdateAverageRate', getI16Decoder()],\n ['lastUpdateTimestamp', getU64Decoder()],\n ['currentRate', getI16Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'CpiGuard',\n addDecoderSizePrefix(\n getStructDecoder([['lockCpi', getBooleanDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'PermanentDelegate',\n addDecoderSizePrefix(\n getStructDecoder([['delegate', getAddressDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'NonTransferableAccount',\n addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()),\n ],\n [\n 'TransferHook',\n addDecoderSizePrefix(\n getStructDecoder([\n ['authority', getAddressDecoder()],\n ['programId', getAddressDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TransferHookAccount',\n addDecoderSizePrefix(\n getStructDecoder([['transferring', getBooleanDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferFee',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['elgamalPubkey', getAddressDecoder()],\n ['harvestToMintEnabled', getBooleanDecoder()],\n ['withheldAmount', getEncryptedBalanceDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferFeeAmount',\n addDecoderSizePrefix(\n getStructDecoder([['withheldAmount', getEncryptedBalanceDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'MetadataPointer',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TokenMetadata',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'updateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressDecoder()],\n ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['symbol', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['uri', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\n 'additionalMetadata',\n getMapDecoder(\n addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()),\n addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())\n ),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'GroupPointer',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TokenGroup',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'updateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressDecoder()],\n ['size', getU64Decoder()],\n ['maxSize', getU64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'GroupMemberPointer',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TokenGroupMember',\n addDecoderSizePrefix(\n getStructDecoder([\n ['mint', getAddressDecoder()],\n ['group', getAddressDecoder()],\n ['memberNumber', getU64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n ['ConfidentialMintBurn', getUnitDecoder()],\n [\n 'ScaledUiAmountConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n ['authority', getAddressDecoder()],\n ['multiplier', getF64Decoder()],\n ['newMultiplierEffectiveTimestamp', getU64Decoder()],\n ['newMultiplier', getF64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'PausableConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['paused', getBooleanDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n ['PausableAccount', getUnitDecoder()],\n ],\n { size: getU16Decoder() }\n );\n}\n\nexport function getExtensionCodec(): Codec {\n return combineCodec(getExtensionEncoder(), getExtensionDecoder());\n}\n\n// Data Enum Helpers.\nexport function extension(\n kind: 'Uninitialized'\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TransferFeeConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferFeeConfig'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TransferFeeAmount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferFeeAmount'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'MintCloseAuthority',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'MintCloseAuthority'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ConfidentialTransferMint',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferMint'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferMint'\n>;\nexport function extension(\n kind: 'ConfidentialTransferAccount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferAccount'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferAccount'\n>;\nexport function extension(\n kind: 'DefaultAccountState',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'DefaultAccountState'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ImmutableOwner',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ImmutableOwner'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'MemoTransfer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'MemoTransfer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'NonTransferable',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'NonTransferable'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'InterestBearingConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'InterestBearingConfig'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'InterestBearingConfig'\n>;\nexport function extension(\n kind: 'CpiGuard',\n data: GetDiscriminatedUnionVariantContent\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'PermanentDelegate',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'PermanentDelegate'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'NonTransferableAccount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'NonTransferableAccount'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'NonTransferableAccount'\n>;\nexport function extension(\n kind: 'TransferHook',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferHook'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TransferHookAccount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferHookAccount'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ConfidentialTransferFee',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFee'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFee'\n>;\nexport function extension(\n kind: 'ConfidentialTransferFeeAmount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFeeAmount'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFeeAmount'\n>;\nexport function extension(\n kind: 'MetadataPointer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'MetadataPointer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TokenMetadata',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TokenMetadata'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'GroupPointer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'GroupPointer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TokenGroup',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TokenGroup'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'GroupMemberPointer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'GroupMemberPointer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TokenGroupMember',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TokenGroupMember'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ConfidentialMintBurn'\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialMintBurn'\n>;\nexport function extension(\n kind: 'ScaledUiAmountConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ScaledUiAmountConfig'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ScaledUiAmountConfig'\n>;\nexport function extension(\n kind: 'PausableConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'PausableConfig'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'PausableAccount'\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: K,\n data?: Data\n) {\n return Array.isArray(data)\n ? { __kind: kind, fields: data }\n : { __kind: kind, ...(data ?? {}) };\n}\n\nexport function isExtension(\n kind: K,\n value: Extension\n): value is Extension & { __kind: K } {\n return value.__kind === kind;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n getU16Decoder,\n getU16Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\n/**\n * Extensions that can be applied to mints or accounts. Mint extensions must\n * only be applied to mint accounts, and account extensions must only be\n * applied to token holding accounts.\n */\nexport enum ExtensionType {\n Uninitialized,\n TransferFeeConfig,\n TransferFeeAmount,\n MintCloseAuthority,\n ConfidentialTransferMint,\n ConfidentialTransferAccount,\n DefaultAccountState,\n ImmutableOwner,\n MemoTransfer,\n NonTransferable,\n InterestBearingConfig,\n CpiGuard,\n PermanentDelegate,\n NonTransferableAccount,\n TransferHook,\n TransferHookAccount,\n ConfidentialTransferFee,\n ConfidentialTransferFeeAmount,\n ScaledUiAmountConfig,\n PausableConfig,\n PausableAccount,\n MetadataPointer,\n TokenMetadata,\n GroupPointer,\n TokenGroup,\n GroupMemberPointer,\n TokenGroupMember,\n}\n\nexport type ExtensionTypeArgs = ExtensionType;\n\nexport function getExtensionTypeEncoder(): FixedSizeEncoder {\n return getEnumEncoder(ExtensionType, { size: getU16Encoder() });\n}\n\nexport function getExtensionTypeDecoder(): FixedSizeDecoder {\n return getEnumDecoder(ExtensionType, { size: getU16Decoder() });\n}\n\nexport function getExtensionTypeCodec(): FixedSizeCodec<\n ExtensionTypeArgs,\n ExtensionType\n> {\n return combineCodec(getExtensionTypeEncoder(), getExtensionTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getDiscriminatedUnionDecoder,\n getDiscriminatedUnionEncoder,\n getStructDecoder,\n getStructEncoder,\n getTupleDecoder,\n getTupleEncoder,\n getU32Decoder,\n getU32Encoder,\n getUnitDecoder,\n getUnitEncoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Codec,\n type Decoder,\n type Encoder,\n type GetDiscriminatedUnionVariant,\n type GetDiscriminatedUnionVariantContent,\n} from '@solana/kit';\n\n/** Fields in the metadata account, used for updating. */\nexport type TokenMetadataField =\n | { __kind: 'Name' }\n | { __kind: 'Symbol' }\n | { __kind: 'Uri' }\n | { __kind: 'Key'; fields: readonly [string] };\n\nexport type TokenMetadataFieldArgs = TokenMetadataField;\n\nexport function getTokenMetadataFieldEncoder(): Encoder {\n return getDiscriminatedUnionEncoder([\n ['Name', getUnitEncoder()],\n ['Symbol', getUnitEncoder()],\n ['Uri', getUnitEncoder()],\n [\n 'Key',\n getStructEncoder([\n [\n 'fields',\n getTupleEncoder([\n addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()),\n ]),\n ],\n ]),\n ],\n ]);\n}\n\nexport function getTokenMetadataFieldDecoder(): Decoder {\n return getDiscriminatedUnionDecoder([\n ['Name', getUnitDecoder()],\n ['Symbol', getUnitDecoder()],\n ['Uri', getUnitDecoder()],\n [\n 'Key',\n getStructDecoder([\n [\n 'fields',\n getTupleDecoder([\n addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()),\n ]),\n ],\n ]),\n ],\n ]);\n}\n\nexport function getTokenMetadataFieldCodec(): Codec<\n TokenMetadataFieldArgs,\n TokenMetadataField\n> {\n return combineCodec(\n getTokenMetadataFieldEncoder(),\n getTokenMetadataFieldDecoder()\n );\n}\n\n// Data Enum Helpers.\nexport function tokenMetadataField(\n kind: 'Name'\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField(\n kind: 'Symbol'\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField(\n kind: 'Uri'\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField(\n kind: 'Key',\n data: GetDiscriminatedUnionVariantContent<\n TokenMetadataFieldArgs,\n '__kind',\n 'Key'\n >['fields']\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField<\n K extends TokenMetadataFieldArgs['__kind'],\n Data,\n>(kind: K, data?: Data) {\n return Array.isArray(data)\n ? { __kind: kind, fields: data }\n : { __kind: kind, ...(data ?? {}) };\n}\n\nexport function isTokenMetadataField(\n kind: K,\n value: TokenMetadataField\n): value is TokenMetadataField & { __kind: K } {\n return value.__kind === kind;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU64Decoder,\n getU64Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport type TransferFee = {\n /** First epoch where the transfer fee takes effect. */\n epoch: bigint;\n /** Maximum fee assessed on transfers, expressed as an amount of tokens. */\n maximumFee: bigint;\n /**\n * Amount of transfer collected as fees, expressed as basis points of the\n * transfer amount, ie. increments of 0.01%.\n */\n transferFeeBasisPoints: number;\n};\n\nexport type TransferFeeArgs = {\n /** First epoch where the transfer fee takes effect. */\n epoch: number | bigint;\n /** Maximum fee assessed on transfers, expressed as an amount of tokens. */\n maximumFee: number | bigint;\n /**\n * Amount of transfer collected as fees, expressed as basis points of the\n * transfer amount, ie. increments of 0.01%.\n */\n transferFeeBasisPoints: number;\n};\n\nexport function getTransferFeeEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['epoch', getU64Encoder()],\n ['maximumFee', getU64Encoder()],\n ['transferFeeBasisPoints', getU16Encoder()],\n ]);\n}\n\nexport function getTransferFeeDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['epoch', getU64Decoder()],\n ['maximumFee', getU64Decoder()],\n ['transferFeeBasisPoints', getU16Decoder()],\n ]);\n}\n\nexport function getTransferFeeCodec(): FixedSizeCodec<\n TransferFeeArgs,\n TransferFee\n> {\n return combineCodec(getTransferFeeEncoder(), getTransferFeeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getConstantDecoder,\n getConstantEncoder,\n getHiddenPrefixDecoder,\n getHiddenPrefixEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n padLeftEncoder,\n type Account,\n type Address,\n type Codec,\n type Decoder,\n type EncodedAccount,\n type Encoder,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getExtensionDecoder,\n getExtensionEncoder,\n type Extension,\n type ExtensionArgs,\n} from '../types';\n\nexport type Mint = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: Option
;\n /** Total supply of tokens. */\n supply: bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: Option
;\n /** The extensions activated on the mint account. */\n extensions: Option>;\n};\n\nexport type MintArgs = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: OptionOrNullable
;\n /** Total supply of tokens. */\n supply: number | bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: OptionOrNullable
;\n /** The extensions activated on the mint account. */\n extensions: OptionOrNullable>;\n};\n\nexport function getMintEncoder(): Encoder {\n return getStructEncoder([\n [\n 'mintAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n [\n 'freezeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionEncoder(\n getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(padLeftEncoder(getU8Encoder(), 83).encode(1))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getMintDecoder(): Decoder {\n return getStructDecoder([\n [\n 'mintAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n [\n 'freezeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionDecoder(\n getHiddenPrefixDecoder(\n getArrayDecoder(getExtensionDecoder(), { size: 'remainder' }),\n [getConstantDecoder(padLeftEncoder(getU8Encoder(), 83).encode(1))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getMintCodec(): Codec {\n return combineCodec(getMintEncoder(), getMintDecoder());\n}\n\nexport function decodeMint(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMint(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMint(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMintDecoder()\n );\n}\n\nexport async function fetchMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMint(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMint(maybeAccount);\n}\n\nexport async function fetchAllMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMint(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMint(maybeAccount));\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n} from '@solana/kit';\n\nexport type Multisig = {\n /** Number of signers required. */\n m: number;\n /** Number of valid signers. */\n n: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Signer public keys. */\n signers: Array
;\n};\n\nexport type MultisigArgs = Multisig;\n\nexport function getMultisigEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['m', getU8Encoder()],\n ['n', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n ['signers', getArrayEncoder(getAddressEncoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['m', getU8Decoder()],\n ['n', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n ['signers', getArrayDecoder(getAddressDecoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigCodec(): FixedSizeCodec {\n return combineCodec(getMultisigEncoder(), getMultisigDecoder());\n}\n\nexport function decodeMultisig(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMultisig(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMultisig(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMultisigDecoder()\n );\n}\n\nexport async function fetchMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMultisig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMultisig(maybeAccount);\n}\n\nexport async function fetchAllMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMultisig(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMultisig(maybeAccount));\n}\n\nexport function getMultisigSize(): number {\n return 355;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getConstantDecoder,\n getConstantEncoder,\n getHiddenPrefixDecoder,\n getHiddenPrefixEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Encoder,\n type Account,\n type Address,\n type Codec,\n type Decoder,\n type EncodedAccount,\n type Encoder,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n getExtensionDecoder,\n getExtensionEncoder,\n type AccountState,\n type AccountStateArgs,\n type Extension,\n type ExtensionArgs,\n} from '../types';\n\nexport type Token = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: Option
;\n /** The account's state. */\n state: AccountState;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: Option;\n /** The amount delegated. */\n delegatedAmount: bigint;\n /** Optional authority to close the account. */\n closeAuthority: Option
;\n /** The extensions activated on the token account. */\n extensions: Option>;\n};\n\nexport type TokenArgs = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: number | bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: OptionOrNullable
;\n /** The account's state. */\n state: AccountStateArgs;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: OptionOrNullable;\n /** The amount delegated. */\n delegatedAmount: number | bigint;\n /** Optional authority to close the account. */\n closeAuthority: OptionOrNullable
;\n /** The extensions activated on the token account. */\n extensions: OptionOrNullable>;\n};\n\nexport function getTokenEncoder(): Encoder {\n return getStructEncoder([\n ['mint', getAddressEncoder()],\n ['owner', getAddressEncoder()],\n ['amount', getU64Encoder()],\n [\n 'delegate',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateEncoder()],\n [\n 'isNative',\n getOptionEncoder(getU64Encoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Encoder()],\n [\n 'closeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionEncoder(\n getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(getU8Encoder().encode(2))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getTokenDecoder(): Decoder {\n return getStructDecoder([\n ['mint', getAddressDecoder()],\n ['owner', getAddressDecoder()],\n ['amount', getU64Decoder()],\n [\n 'delegate',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateDecoder()],\n [\n 'isNative',\n getOptionDecoder(getU64Decoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Decoder()],\n [\n 'closeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionDecoder(\n getHiddenPrefixDecoder(\n getArrayDecoder(getExtensionDecoder(), { size: 'remainder' }),\n [getConstantDecoder(getU8Encoder().encode(2))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getTokenCodec(): Codec {\n return combineCodec(getTokenEncoder(), getTokenDecoder());\n}\n\nexport function decodeToken(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeToken(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeToken(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getTokenDecoder()\n );\n}\n\nexport async function fetchToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeToken(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeToken(maybeAccount);\n}\n\nexport async function fetchAllToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeToken(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeToken(maybeAccount));\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedCreateAssociatedTokenIdempotentInstruction,\n type ParsedCreateAssociatedTokenInstruction,\n type ParsedRecoverNestedAssociatedTokenInstruction,\n} from '../instructions';\n\nexport const ASSOCIATED_TOKEN_PROGRAM_ADDRESS =\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;\n\nexport enum AssociatedTokenInstruction {\n CreateAssociatedToken,\n CreateAssociatedTokenIdempotent,\n RecoverNestedAssociatedToken,\n}\n\nexport function identifyAssociatedTokenInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): AssociatedTokenInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedToken;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n }\n throw new Error(\n 'The provided instruction could not be identified as a associatedToken instruction.'\n );\n}\n\nexport type ParsedAssociatedTokenInstruction<\n TProgram extends string = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n> =\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedToken;\n } & ParsedCreateAssociatedTokenInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n } & ParsedCreateAssociatedTokenIdempotentInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n } & ParsedRecoverNestedAssociatedTokenInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedAmountToUiAmountInstruction,\n type ParsedApplyConfidentialPendingBalanceInstruction,\n type ParsedApproveCheckedInstruction,\n type ParsedApproveConfidentialTransferAccountInstruction,\n type ParsedApproveInstruction,\n type ParsedBurnCheckedInstruction,\n type ParsedBurnInstruction,\n type ParsedCloseAccountInstruction,\n type ParsedConfidentialDepositInstruction,\n type ParsedConfidentialTransferInstruction,\n type ParsedConfidentialTransferWithFeeInstruction,\n type ParsedConfidentialWithdrawInstruction,\n type ParsedConfigureConfidentialTransferAccountInstruction,\n type ParsedCreateNativeMintInstruction,\n type ParsedDisableConfidentialCreditsInstruction,\n type ParsedDisableCpiGuardInstruction,\n type ParsedDisableHarvestToMintInstruction,\n type ParsedDisableMemoTransfersInstruction,\n type ParsedDisableNonConfidentialCreditsInstruction,\n type ParsedEmitTokenMetadataInstruction,\n type ParsedEmptyConfidentialTransferAccountInstruction,\n type ParsedEnableConfidentialCreditsInstruction,\n type ParsedEnableCpiGuardInstruction,\n type ParsedEnableHarvestToMintInstruction,\n type ParsedEnableMemoTransfersInstruction,\n type ParsedEnableNonConfidentialCreditsInstruction,\n type ParsedFreezeAccountInstruction,\n type ParsedGetAccountDataSizeInstruction,\n type ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction,\n type ParsedHarvestWithheldTokensToMintInstruction,\n type ParsedInitializeAccount2Instruction,\n type ParsedInitializeAccount3Instruction,\n type ParsedInitializeAccountInstruction,\n type ParsedInitializeConfidentialTransferFeeInstruction,\n type ParsedInitializeConfidentialTransferMintInstruction,\n type ParsedInitializeDefaultAccountStateInstruction,\n type ParsedInitializeGroupMemberPointerInstruction,\n type ParsedInitializeGroupPointerInstruction,\n type ParsedInitializeImmutableOwnerInstruction,\n type ParsedInitializeInterestBearingMintInstruction,\n type ParsedInitializeMetadataPointerInstruction,\n type ParsedInitializeMint2Instruction,\n type ParsedInitializeMintCloseAuthorityInstruction,\n type ParsedInitializeMintInstruction,\n type ParsedInitializeMultisig2Instruction,\n type ParsedInitializeMultisigInstruction,\n type ParsedInitializeNonTransferableMintInstruction,\n type ParsedInitializePausableConfigInstruction,\n type ParsedInitializePermanentDelegateInstruction,\n type ParsedInitializeScaledUiAmountMintInstruction,\n type ParsedInitializeTokenGroupInstruction,\n type ParsedInitializeTokenGroupMemberInstruction,\n type ParsedInitializeTokenMetadataInstruction,\n type ParsedInitializeTransferFeeConfigInstruction,\n type ParsedInitializeTransferHookInstruction,\n type ParsedMintToCheckedInstruction,\n type ParsedMintToInstruction,\n type ParsedPauseInstruction,\n type ParsedReallocateInstruction,\n type ParsedRemoveTokenMetadataKeyInstruction,\n type ParsedResumeInstruction,\n type ParsedRevokeInstruction,\n type ParsedSetAuthorityInstruction,\n type ParsedSetTransferFeeInstruction,\n type ParsedSyncNativeInstruction,\n type ParsedThawAccountInstruction,\n type ParsedTransferCheckedInstruction,\n type ParsedTransferCheckedWithFeeInstruction,\n type ParsedTransferInstruction,\n type ParsedUiAmountToAmountInstruction,\n type ParsedUpdateConfidentialTransferMintInstruction,\n type ParsedUpdateDefaultAccountStateInstruction,\n type ParsedUpdateGroupMemberPointerInstruction,\n type ParsedUpdateGroupPointerInstruction,\n type ParsedUpdateMetadataPointerInstruction,\n type ParsedUpdateMultiplierScaledUiMintInstruction,\n type ParsedUpdateRateInterestBearingMintInstruction,\n type ParsedUpdateTokenGroupMaxSizeInstruction,\n type ParsedUpdateTokenGroupUpdateAuthorityInstruction,\n type ParsedUpdateTokenMetadataFieldInstruction,\n type ParsedUpdateTokenMetadataUpdateAuthorityInstruction,\n type ParsedUpdateTransferHookInstruction,\n type ParsedWithdrawExcessLamportsInstruction,\n type ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction,\n type ParsedWithdrawWithheldTokensFromAccountsInstruction,\n type ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction,\n type ParsedWithdrawWithheldTokensFromMintInstruction,\n} from '../instructions';\n\nexport const TOKEN_2022_PROGRAM_ADDRESS =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n\nexport enum Token2022Account {\n Mint,\n Token,\n Multisig,\n}\n\nexport function identifyToken2022Account(\n account: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): Token2022Account {\n const data = 'data' in account ? account.data : account;\n if (data.length === 82) {\n return Token2022Account.Mint;\n }\n if (data.length === 165) {\n return Token2022Account.Token;\n }\n if (data.length === 355) {\n return Token2022Account.Multisig;\n }\n throw new Error(\n 'The provided account could not be identified as a token-2022 account.'\n );\n}\n\nexport enum Token2022Instruction {\n InitializeMint,\n InitializeAccount,\n InitializeMultisig,\n Transfer,\n Approve,\n Revoke,\n SetAuthority,\n MintTo,\n Burn,\n CloseAccount,\n FreezeAccount,\n ThawAccount,\n TransferChecked,\n ApproveChecked,\n MintToChecked,\n BurnChecked,\n InitializeAccount2,\n SyncNative,\n InitializeAccount3,\n InitializeMultisig2,\n InitializeMint2,\n GetAccountDataSize,\n InitializeImmutableOwner,\n AmountToUiAmount,\n UiAmountToAmount,\n InitializeMintCloseAuthority,\n InitializeTransferFeeConfig,\n TransferCheckedWithFee,\n WithdrawWithheldTokensFromMint,\n WithdrawWithheldTokensFromAccounts,\n HarvestWithheldTokensToMint,\n SetTransferFee,\n InitializeConfidentialTransferMint,\n UpdateConfidentialTransferMint,\n ConfigureConfidentialTransferAccount,\n ApproveConfidentialTransferAccount,\n EmptyConfidentialTransferAccount,\n ConfidentialDeposit,\n ConfidentialWithdraw,\n ConfidentialTransfer,\n ApplyConfidentialPendingBalance,\n EnableConfidentialCredits,\n DisableConfidentialCredits,\n EnableNonConfidentialCredits,\n DisableNonConfidentialCredits,\n ConfidentialTransferWithFee,\n InitializeDefaultAccountState,\n UpdateDefaultAccountState,\n Reallocate,\n EnableMemoTransfers,\n DisableMemoTransfers,\n CreateNativeMint,\n InitializeNonTransferableMint,\n InitializeInterestBearingMint,\n UpdateRateInterestBearingMint,\n EnableCpiGuard,\n DisableCpiGuard,\n InitializePermanentDelegate,\n InitializeTransferHook,\n UpdateTransferHook,\n InitializeConfidentialTransferFee,\n WithdrawWithheldTokensFromMintForConfidentialTransferFee,\n WithdrawWithheldTokensFromAccountsForConfidentialTransferFee,\n HarvestWithheldTokensToMintForConfidentialTransferFee,\n EnableHarvestToMint,\n DisableHarvestToMint,\n WithdrawExcessLamports,\n InitializeMetadataPointer,\n UpdateMetadataPointer,\n InitializeGroupPointer,\n UpdateGroupPointer,\n InitializeGroupMemberPointer,\n UpdateGroupMemberPointer,\n InitializeScaledUiAmountMint,\n UpdateMultiplierScaledUiMint,\n InitializePausableConfig,\n Pause,\n Resume,\n InitializeTokenMetadata,\n UpdateTokenMetadataField,\n RemoveTokenMetadataKey,\n UpdateTokenMetadataUpdateAuthority,\n EmitTokenMetadata,\n InitializeTokenGroup,\n UpdateTokenGroupMaxSize,\n UpdateTokenGroupUpdateAuthority,\n InitializeTokenGroupMember,\n}\n\nexport function identifyToken2022Instruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): Token2022Instruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return Token2022Instruction.InitializeMint;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return Token2022Instruction.InitializeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return Token2022Instruction.InitializeMultisig;\n }\n if (containsBytes(data, getU8Encoder().encode(3), 0)) {\n return Token2022Instruction.Transfer;\n }\n if (containsBytes(data, getU8Encoder().encode(4), 0)) {\n return Token2022Instruction.Approve;\n }\n if (containsBytes(data, getU8Encoder().encode(5), 0)) {\n return Token2022Instruction.Revoke;\n }\n if (containsBytes(data, getU8Encoder().encode(6), 0)) {\n return Token2022Instruction.SetAuthority;\n }\n if (containsBytes(data, getU8Encoder().encode(7), 0)) {\n return Token2022Instruction.MintTo;\n }\n if (containsBytes(data, getU8Encoder().encode(8), 0)) {\n return Token2022Instruction.Burn;\n }\n if (containsBytes(data, getU8Encoder().encode(9), 0)) {\n return Token2022Instruction.CloseAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(10), 0)) {\n return Token2022Instruction.FreezeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(11), 0)) {\n return Token2022Instruction.ThawAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(12), 0)) {\n return Token2022Instruction.TransferChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(13), 0)) {\n return Token2022Instruction.ApproveChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(14), 0)) {\n return Token2022Instruction.MintToChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(15), 0)) {\n return Token2022Instruction.BurnChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(16), 0)) {\n return Token2022Instruction.InitializeAccount2;\n }\n if (containsBytes(data, getU8Encoder().encode(17), 0)) {\n return Token2022Instruction.SyncNative;\n }\n if (containsBytes(data, getU8Encoder().encode(18), 0)) {\n return Token2022Instruction.InitializeAccount3;\n }\n if (containsBytes(data, getU8Encoder().encode(19), 0)) {\n return Token2022Instruction.InitializeMultisig2;\n }\n if (containsBytes(data, getU8Encoder().encode(20), 0)) {\n return Token2022Instruction.InitializeMint2;\n }\n if (containsBytes(data, getU8Encoder().encode(21), 0)) {\n return Token2022Instruction.GetAccountDataSize;\n }\n if (containsBytes(data, getU8Encoder().encode(22), 0)) {\n return Token2022Instruction.InitializeImmutableOwner;\n }\n if (containsBytes(data, getU8Encoder().encode(23), 0)) {\n return Token2022Instruction.AmountToUiAmount;\n }\n if (containsBytes(data, getU8Encoder().encode(24), 0)) {\n return Token2022Instruction.UiAmountToAmount;\n }\n if (containsBytes(data, getU8Encoder().encode(25), 0)) {\n return Token2022Instruction.InitializeMintCloseAuthority;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeTransferFeeConfig;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.TransferCheckedWithFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(3), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromAccounts;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(4), 1)\n ) {\n return Token2022Instruction.HarvestWithheldTokensToMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(5), 1)\n ) {\n return Token2022Instruction.SetTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeConfidentialTransferMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateConfidentialTransferMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.ConfigureConfidentialTransferAccount;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(3), 1)\n ) {\n return Token2022Instruction.ApproveConfidentialTransferAccount;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(4), 1)\n ) {\n return Token2022Instruction.EmptyConfidentialTransferAccount;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(5), 1)\n ) {\n return Token2022Instruction.ConfidentialDeposit;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(6), 1)\n ) {\n return Token2022Instruction.ConfidentialWithdraw;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(7), 1)\n ) {\n return Token2022Instruction.ConfidentialTransfer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(8), 1)\n ) {\n return Token2022Instruction.ApplyConfidentialPendingBalance;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(9), 1)\n ) {\n return Token2022Instruction.EnableConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(10), 1)\n ) {\n return Token2022Instruction.DisableConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(11), 1)\n ) {\n return Token2022Instruction.EnableNonConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(12), 1)\n ) {\n return Token2022Instruction.DisableNonConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(13), 1)\n ) {\n return Token2022Instruction.ConfidentialTransferWithFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(28), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeDefaultAccountState;\n }\n if (\n containsBytes(data, getU8Encoder().encode(28), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateDefaultAccountState;\n }\n if (containsBytes(data, getU8Encoder().encode(29), 0)) {\n return Token2022Instruction.Reallocate;\n }\n if (\n containsBytes(data, getU8Encoder().encode(30), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.EnableMemoTransfers;\n }\n if (\n containsBytes(data, getU8Encoder().encode(30), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.DisableMemoTransfers;\n }\n if (containsBytes(data, getU8Encoder().encode(31), 0)) {\n return Token2022Instruction.CreateNativeMint;\n }\n if (containsBytes(data, getU8Encoder().encode(32), 0)) {\n return Token2022Instruction.InitializeNonTransferableMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(33), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeInterestBearingMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(33), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateRateInterestBearingMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(34), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.EnableCpiGuard;\n }\n if (\n containsBytes(data, getU8Encoder().encode(34), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.DisableCpiGuard;\n }\n if (containsBytes(data, getU8Encoder().encode(35), 0)) {\n return Token2022Instruction.InitializePermanentDelegate;\n }\n if (\n containsBytes(data, getU8Encoder().encode(36), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeTransferHook;\n }\n if (\n containsBytes(data, getU8Encoder().encode(36), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateTransferHook;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromMintForConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromAccountsForConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(3), 1)\n ) {\n return Token2022Instruction.HarvestWithheldTokensToMintForConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(4), 1)\n ) {\n return Token2022Instruction.EnableHarvestToMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(5), 1)\n ) {\n return Token2022Instruction.DisableHarvestToMint;\n }\n if (containsBytes(data, getU8Encoder().encode(38), 0)) {\n return Token2022Instruction.WithdrawExcessLamports;\n }\n if (\n containsBytes(data, getU8Encoder().encode(39), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeMetadataPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(39), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateMetadataPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(40), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeGroupPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(40), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateGroupPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(41), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeGroupMemberPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(41), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateGroupMemberPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(43), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeScaledUiAmountMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(43), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateMultiplierScaledUiMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(44), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializePausableConfig;\n }\n if (\n containsBytes(data, getU8Encoder().encode(44), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.Pause;\n }\n if (\n containsBytes(data, getU8Encoder().encode(44), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.Resume;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([210, 225, 30, 162, 88, 184, 77, 141]),\n 0\n )\n ) {\n return Token2022Instruction.InitializeTokenMetadata;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([221, 233, 49, 45, 181, 202, 220, 200]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenMetadataField;\n }\n if (\n containsBytes(data, new Uint8Array([234, 18, 32, 56, 89, 141, 37, 181]), 0)\n ) {\n return Token2022Instruction.RemoveTokenMetadataKey;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([215, 228, 166, 228, 84, 100, 86, 123]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenMetadataUpdateAuthority;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([250, 166, 180, 250, 13, 12, 184, 70]),\n 0\n )\n ) {\n return Token2022Instruction.EmitTokenMetadata;\n }\n if (\n containsBytes(data, new Uint8Array([121, 113, 108, 39, 54, 51, 0, 4]), 0)\n ) {\n return Token2022Instruction.InitializeTokenGroup;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([108, 37, 171, 143, 248, 30, 18, 110]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenGroupMaxSize;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([161, 105, 88, 1, 237, 221, 216, 203]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenGroupUpdateAuthority;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([152, 32, 222, 176, 223, 237, 116, 134]),\n 0\n )\n ) {\n return Token2022Instruction.InitializeTokenGroupMember;\n }\n throw new Error(\n 'The provided instruction could not be identified as a token-2022 instruction.'\n );\n}\n\nexport type ParsedToken2022Instruction<\n TProgram extends string = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n> =\n | ({\n instructionType: Token2022Instruction.InitializeMint;\n } & ParsedInitializeMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeAccount;\n } & ParsedInitializeAccountInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeMultisig;\n } & ParsedInitializeMultisigInstruction)\n | ({\n instructionType: Token2022Instruction.Transfer;\n } & ParsedTransferInstruction)\n | ({\n instructionType: Token2022Instruction.Approve;\n } & ParsedApproveInstruction)\n | ({\n instructionType: Token2022Instruction.Revoke;\n } & ParsedRevokeInstruction)\n | ({\n instructionType: Token2022Instruction.SetAuthority;\n } & ParsedSetAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.MintTo;\n } & ParsedMintToInstruction)\n | ({\n instructionType: Token2022Instruction.Burn;\n } & ParsedBurnInstruction)\n | ({\n instructionType: Token2022Instruction.CloseAccount;\n } & ParsedCloseAccountInstruction)\n | ({\n instructionType: Token2022Instruction.FreezeAccount;\n } & ParsedFreezeAccountInstruction)\n | ({\n instructionType: Token2022Instruction.ThawAccount;\n } & ParsedThawAccountInstruction)\n | ({\n instructionType: Token2022Instruction.TransferChecked;\n } & ParsedTransferCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.ApproveChecked;\n } & ParsedApproveCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.MintToChecked;\n } & ParsedMintToCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.BurnChecked;\n } & ParsedBurnCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeAccount2;\n } & ParsedInitializeAccount2Instruction)\n | ({\n instructionType: Token2022Instruction.SyncNative;\n } & ParsedSyncNativeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeAccount3;\n } & ParsedInitializeAccount3Instruction)\n | ({\n instructionType: Token2022Instruction.InitializeMultisig2;\n } & ParsedInitializeMultisig2Instruction)\n | ({\n instructionType: Token2022Instruction.InitializeMint2;\n } & ParsedInitializeMint2Instruction)\n | ({\n instructionType: Token2022Instruction.GetAccountDataSize;\n } & ParsedGetAccountDataSizeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeImmutableOwner;\n } & ParsedInitializeImmutableOwnerInstruction)\n | ({\n instructionType: Token2022Instruction.AmountToUiAmount;\n } & ParsedAmountToUiAmountInstruction)\n | ({\n instructionType: Token2022Instruction.UiAmountToAmount;\n } & ParsedUiAmountToAmountInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeMintCloseAuthority;\n } & ParsedInitializeMintCloseAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTransferFeeConfig;\n } & ParsedInitializeTransferFeeConfigInstruction)\n | ({\n instructionType: Token2022Instruction.TransferCheckedWithFee;\n } & ParsedTransferCheckedWithFeeInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromMint;\n } & ParsedWithdrawWithheldTokensFromMintInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromAccounts;\n } & ParsedWithdrawWithheldTokensFromAccountsInstruction)\n | ({\n instructionType: Token2022Instruction.HarvestWithheldTokensToMint;\n } & ParsedHarvestWithheldTokensToMintInstruction)\n | ({\n instructionType: Token2022Instruction.SetTransferFee;\n } & ParsedSetTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeConfidentialTransferMint;\n } & ParsedInitializeConfidentialTransferMintInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateConfidentialTransferMint;\n } & ParsedUpdateConfidentialTransferMintInstruction)\n | ({\n instructionType: Token2022Instruction.ConfigureConfidentialTransferAccount;\n } & ParsedConfigureConfidentialTransferAccountInstruction)\n | ({\n instructionType: Token2022Instruction.ApproveConfidentialTransferAccount;\n } & ParsedApproveConfidentialTransferAccountInstruction)\n | ({\n instructionType: Token2022Instruction.EmptyConfidentialTransferAccount;\n } & ParsedEmptyConfidentialTransferAccountInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialDeposit;\n } & ParsedConfidentialDepositInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialWithdraw;\n } & ParsedConfidentialWithdrawInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialTransfer;\n } & ParsedConfidentialTransferInstruction)\n | ({\n instructionType: Token2022Instruction.ApplyConfidentialPendingBalance;\n } & ParsedApplyConfidentialPendingBalanceInstruction)\n | ({\n instructionType: Token2022Instruction.EnableConfidentialCredits;\n } & ParsedEnableConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.DisableConfidentialCredits;\n } & ParsedDisableConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.EnableNonConfidentialCredits;\n } & ParsedEnableNonConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.DisableNonConfidentialCredits;\n } & ParsedDisableNonConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialTransferWithFee;\n } & ParsedConfidentialTransferWithFeeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeDefaultAccountState;\n } & ParsedInitializeDefaultAccountStateInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateDefaultAccountState;\n } & ParsedUpdateDefaultAccountStateInstruction)\n | ({\n instructionType: Token2022Instruction.Reallocate;\n } & ParsedReallocateInstruction)\n | ({\n instructionType: Token2022Instruction.EnableMemoTransfers;\n } & ParsedEnableMemoTransfersInstruction)\n | ({\n instructionType: Token2022Instruction.DisableMemoTransfers;\n } & ParsedDisableMemoTransfersInstruction)\n | ({\n instructionType: Token2022Instruction.CreateNativeMint;\n } & ParsedCreateNativeMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeNonTransferableMint;\n } & ParsedInitializeNonTransferableMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeInterestBearingMint;\n } & ParsedInitializeInterestBearingMintInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateRateInterestBearingMint;\n } & ParsedUpdateRateInterestBearingMintInstruction)\n | ({\n instructionType: Token2022Instruction.EnableCpiGuard;\n } & ParsedEnableCpiGuardInstruction)\n | ({\n instructionType: Token2022Instruction.DisableCpiGuard;\n } & ParsedDisableCpiGuardInstruction)\n | ({\n instructionType: Token2022Instruction.InitializePermanentDelegate;\n } & ParsedInitializePermanentDelegateInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTransferHook;\n } & ParsedInitializeTransferHookInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTransferHook;\n } & ParsedUpdateTransferHookInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeConfidentialTransferFee;\n } & ParsedInitializeConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromMintForConfidentialTransferFee;\n } & ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromAccountsForConfidentialTransferFee;\n } & ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.HarvestWithheldTokensToMintForConfidentialTransferFee;\n } & ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.EnableHarvestToMint;\n } & ParsedEnableHarvestToMintInstruction)\n | ({\n instructionType: Token2022Instruction.DisableHarvestToMint;\n } & ParsedDisableHarvestToMintInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawExcessLamports;\n } & ParsedWithdrawExcessLamportsInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeMetadataPointer;\n } & ParsedInitializeMetadataPointerInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateMetadataPointer;\n } & ParsedUpdateMetadataPointerInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeGroupPointer;\n } & ParsedInitializeGroupPointerInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateGroupPointer;\n } & ParsedUpdateGroupPointerInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeGroupMemberPointer;\n } & ParsedInitializeGroupMemberPointerInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateGroupMemberPointer;\n } & ParsedUpdateGroupMemberPointerInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeScaledUiAmountMint;\n } & ParsedInitializeScaledUiAmountMintInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateMultiplierScaledUiMint;\n } & ParsedUpdateMultiplierScaledUiMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializePausableConfig;\n } & ParsedInitializePausableConfigInstruction)\n | ({\n instructionType: Token2022Instruction.Pause;\n } & ParsedPauseInstruction)\n | ({\n instructionType: Token2022Instruction.Resume;\n } & ParsedResumeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTokenMetadata;\n } & ParsedInitializeTokenMetadataInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenMetadataField;\n } & ParsedUpdateTokenMetadataFieldInstruction)\n | ({\n instructionType: Token2022Instruction.RemoveTokenMetadataKey;\n } & ParsedRemoveTokenMetadataKeyInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenMetadataUpdateAuthority;\n } & ParsedUpdateTokenMetadataUpdateAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.EmitTokenMetadata;\n } & ParsedEmitTokenMetadataInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTokenGroup;\n } & ParsedInitializeTokenGroupInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenGroupMaxSize;\n } & ParsedUpdateTokenGroupMaxSizeInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenGroupUpdateAuthority;\n } & ParsedUpdateTokenGroupUpdateAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTokenGroupMember;\n } & ParsedInitializeTokenGroupMemberInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\n\n/** InvalidOwner: Associated token account owner does not match address derivation */\nexport const ASSOCIATED_TOKEN_ERROR__INVALID_OWNER = 0x0; // 0\n\nexport type AssociatedTokenError = typeof ASSOCIATED_TOKEN_ERROR__INVALID_OWNER;\n\nlet associatedTokenErrorMessages:\n | Record\n | undefined;\nif (process.env.NODE_ENV !== 'production') {\n associatedTokenErrorMessages = {\n [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER]: `Associated token account owner does not match address derivation`,\n };\n}\n\nexport function getAssociatedTokenErrorMessage(\n code: AssociatedTokenError\n): string {\n if (process.env.NODE_ENV !== 'production') {\n return (\n associatedTokenErrorMessages as Record\n )[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isAssociatedTokenError<\n TProgramErrorCode extends AssociatedTokenError,\n>(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\n\n/** NotRentExempt: Lamport balance below rent-exempt threshold */\nexport const TOKEN_2022_ERROR__NOT_RENT_EXEMPT = 0x0; // 0\n/** InsufficientFunds: Insufficient funds */\nexport const TOKEN_2022_ERROR__INSUFFICIENT_FUNDS = 0x1; // 1\n/** InvalidMint: Invalid Mint */\nexport const TOKEN_2022_ERROR__INVALID_MINT = 0x2; // 2\n/** MintMismatch: Account not associated with this Mint */\nexport const TOKEN_2022_ERROR__MINT_MISMATCH = 0x3; // 3\n/** OwnerMismatch: Owner does not match */\nexport const TOKEN_2022_ERROR__OWNER_MISMATCH = 0x4; // 4\n/** FixedSupply: Fixed supply */\nexport const TOKEN_2022_ERROR__FIXED_SUPPLY = 0x5; // 5\n/** AlreadyInUse: Already in use */\nexport const TOKEN_2022_ERROR__ALREADY_IN_USE = 0x6; // 6\n/** InvalidNumberOfProvidedSigners: Invalid number of provided signers */\nexport const TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 0x7; // 7\n/** InvalidNumberOfRequiredSigners: Invalid number of required signers */\nexport const TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 0x8; // 8\n/** UninitializedState: State is unititialized */\nexport const TOKEN_2022_ERROR__UNINITIALIZED_STATE = 0x9; // 9\n/** NativeNotSupported: Instruction does not support native tokens */\nexport const TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED = 0xa; // 10\n/** NonNativeHasBalance: Non-native account can only be closed if its balance is zero */\nexport const TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE = 0xb; // 11\n/** InvalidInstruction: Invalid instruction */\nexport const TOKEN_2022_ERROR__INVALID_INSTRUCTION = 0xc; // 12\n/** InvalidState: State is invalid for requested operation */\nexport const TOKEN_2022_ERROR__INVALID_STATE = 0xd; // 13\n/** Overflow: Operation overflowed */\nexport const TOKEN_2022_ERROR__OVERFLOW = 0xe; // 14\n/** AuthorityTypeNotSupported: Account does not support specified authority type */\nexport const TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 0xf; // 15\n/** MintCannotFreeze: This token mint cannot freeze accounts */\nexport const TOKEN_2022_ERROR__MINT_CANNOT_FREEZE = 0x10; // 16\n/** AccountFrozen: Account is frozen */\nexport const TOKEN_2022_ERROR__ACCOUNT_FROZEN = 0x11; // 17\n/** MintDecimalsMismatch: The provided decimals value different from the Mint decimals */\nexport const TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH = 0x12; // 18\n/** NonNativeNotSupported: Instruction does not support non-native tokens */\nexport const TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED = 0x13; // 19\n\nexport type Token2022Error =\n | typeof TOKEN_2022_ERROR__ACCOUNT_FROZEN\n | typeof TOKEN_2022_ERROR__ALREADY_IN_USE\n | typeof TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED\n | typeof TOKEN_2022_ERROR__FIXED_SUPPLY\n | typeof TOKEN_2022_ERROR__INSUFFICIENT_FUNDS\n | typeof TOKEN_2022_ERROR__INVALID_INSTRUCTION\n | typeof TOKEN_2022_ERROR__INVALID_MINT\n | typeof TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS\n | typeof TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS\n | typeof TOKEN_2022_ERROR__INVALID_STATE\n | typeof TOKEN_2022_ERROR__MINT_CANNOT_FREEZE\n | typeof TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH\n | typeof TOKEN_2022_ERROR__MINT_MISMATCH\n | typeof TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED\n | typeof TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE\n | typeof TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED\n | typeof TOKEN_2022_ERROR__NOT_RENT_EXEMPT\n | typeof TOKEN_2022_ERROR__OVERFLOW\n | typeof TOKEN_2022_ERROR__OWNER_MISMATCH\n | typeof TOKEN_2022_ERROR__UNINITIALIZED_STATE;\n\nlet token2022ErrorMessages: Record | undefined;\nif (process.env.NODE_ENV !== 'production') {\n token2022ErrorMessages = {\n [TOKEN_2022_ERROR__ACCOUNT_FROZEN]: `Account is frozen`,\n [TOKEN_2022_ERROR__ALREADY_IN_USE]: `Already in use`,\n [TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`,\n [TOKEN_2022_ERROR__FIXED_SUPPLY]: `Fixed supply`,\n [TOKEN_2022_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`,\n [TOKEN_2022_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`,\n [TOKEN_2022_ERROR__INVALID_MINT]: `Invalid Mint`,\n [TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`,\n [TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`,\n [TOKEN_2022_ERROR__INVALID_STATE]: `State is invalid for requested operation`,\n [TOKEN_2022_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`,\n [TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`,\n [TOKEN_2022_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`,\n [TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`,\n [TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`,\n [TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`,\n [TOKEN_2022_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`,\n [TOKEN_2022_ERROR__OVERFLOW]: `Operation overflowed`,\n [TOKEN_2022_ERROR__OWNER_MISMATCH]: `Owner does not match`,\n [TOKEN_2022_ERROR__UNINITIALIZED_STATE]: `State is unititialized`,\n };\n}\n\nexport function getToken2022ErrorMessage(code: Token2022Error): string {\n if (process.env.NODE_ENV !== 'production') {\n return (token2022ErrorMessages as Record)[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isToken2022Error(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n TOKEN_2022_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from '@solana/kit';\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected a value but received null or undefined.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): Address {\n if (!value) {\n throw new Error('Expected a Address.');\n }\n if (typeof value === 'object' && 'address' in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address;\n }\n return value as Address;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): ProgramDerivedAddress {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error('Expected a ProgramDerivedAddress.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): TransactionSigner {\n if (!value || !isTransactionSigner(value)) {\n throw new Error('Expected a TransactionSigner.');\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null =\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: 'omitted' | 'programId'\n) {\n return (\n account: ResolvedAccount\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === 'omitted') return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n): value is TransactionSigner {\n return (\n !!value &&\n typeof value === 'object' &&\n 'address' in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR = 23;\n\nexport function getAmountToUiAmountDiscriminatorBytes() {\n return getU8Encoder().encode(AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR);\n}\n\nexport type AmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type AmountToUiAmountInstructionData = {\n discriminator: number;\n /** The amount of tokens to reformat. */\n amount: bigint;\n};\n\nexport type AmountToUiAmountInstructionDataArgs = {\n /** The amount of tokens to reformat. */\n amount: number | bigint;\n};\n\nexport function getAmountToUiAmountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getAmountToUiAmountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getAmountToUiAmountInstructionDataCodec(): FixedSizeCodec<\n AmountToUiAmountInstructionDataArgs,\n AmountToUiAmountInstructionData\n> {\n return combineCodec(\n getAmountToUiAmountInstructionDataEncoder(),\n getAmountToUiAmountInstructionDataDecoder()\n );\n}\n\nexport type AmountToUiAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n amount: AmountToUiAmountInstructionDataArgs['amount'];\n};\n\nexport function getAmountToUiAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: AmountToUiAmountInput,\n config?: { programAddress?: TProgramAddress }\n): AmountToUiAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getAmountToUiAmountInstructionDataEncoder().encode(\n args as AmountToUiAmountInstructionDataArgs\n ),\n programAddress,\n } as AmountToUiAmountInstruction);\n}\n\nexport type ParsedAmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: AmountToUiAmountInstructionData;\n};\n\nexport function parseAmountToUiAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedAmountToUiAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getAmountToUiAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const APPLY_CONFIDENTIAL_PENDING_BALANCE_DISCRIMINATOR = 27;\n\nexport function getApplyConfidentialPendingBalanceDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPLY_CONFIDENTIAL_PENDING_BALANCE_DISCRIMINATOR\n );\n}\n\nexport const APPLY_CONFIDENTIAL_PENDING_BALANCE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 8;\n\nexport function getApplyConfidentialPendingBalanceConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPLY_CONFIDENTIAL_PENDING_BALANCE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ApplyConfidentialPendingBalanceInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApplyConfidentialPendingBalanceInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * The expected number of pending balance credits since the last successful\n * `ApplyPendingBalance` instruction\n */\n expectedPendingBalanceCreditCounter: bigint;\n /**\n * The new decryptable balance if the pending balance is applied\n * successfully\n */\n newDecryptableAvailableBalance: DecryptableBalance;\n};\n\nexport type ApplyConfidentialPendingBalanceInstructionDataArgs = {\n /**\n * The expected number of pending balance credits since the last successful\n * `ApplyPendingBalance` instruction\n */\n expectedPendingBalanceCreditCounter: number | bigint;\n /**\n * The new decryptable balance if the pending balance is applied\n * successfully\n */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n};\n\nexport function getApplyConfidentialPendingBalanceInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['expectedPendingBalanceCreditCounter', getU64Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: APPLY_CONFIDENTIAL_PENDING_BALANCE_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n APPLY_CONFIDENTIAL_PENDING_BALANCE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getApplyConfidentialPendingBalanceInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['expectedPendingBalanceCreditCounter', getU64Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ]);\n}\n\nexport function getApplyConfidentialPendingBalanceInstructionDataCodec(): FixedSizeCodec<\n ApplyConfidentialPendingBalanceInstructionDataArgs,\n ApplyConfidentialPendingBalanceInstructionData\n> {\n return combineCodec(\n getApplyConfidentialPendingBalanceInstructionDataEncoder(),\n getApplyConfidentialPendingBalanceInstructionDataDecoder()\n );\n}\n\nexport type ApplyConfidentialPendingBalanceInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n expectedPendingBalanceCreditCounter: ApplyConfidentialPendingBalanceInstructionDataArgs['expectedPendingBalanceCreditCounter'];\n newDecryptableAvailableBalance: ApplyConfidentialPendingBalanceInstructionDataArgs['newDecryptableAvailableBalance'];\n multiSigners?: Array;\n};\n\nexport function getApplyConfidentialPendingBalanceInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApplyConfidentialPendingBalanceInput,\n config?: { programAddress?: TProgramAddress }\n): ApplyConfidentialPendingBalanceInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getApplyConfidentialPendingBalanceInstructionDataEncoder().encode(\n args as ApplyConfidentialPendingBalanceInstructionDataArgs\n ),\n programAddress,\n } as ApplyConfidentialPendingBalanceInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedApplyConfidentialPendingBalanceInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: ApplyConfidentialPendingBalanceInstructionData;\n};\n\nexport function parseApplyConfidentialPendingBalanceInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApplyConfidentialPendingBalanceInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getApplyConfidentialPendingBalanceInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_DISCRIMINATOR = 4;\n\nexport function getApproveDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_DISCRIMINATOR);\n}\n\nexport type ApproveInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n};\n\nexport type ApproveInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n};\n\nexport function getApproveInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_DISCRIMINATOR })\n );\n}\n\nexport function getApproveInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getApproveInstructionDataCodec(): FixedSizeCodec<\n ApproveInstructionDataArgs,\n ApproveInstructionData\n> {\n return combineCodec(\n getApproveInstructionDataEncoder(),\n getApproveInstructionDataDecoder()\n );\n}\n\nexport type ApproveInput<\n TAccountSource extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getApproveInstruction<\n TAccountSource extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApproveInput,\n config?: { programAddress?: TProgramAddress }\n): ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveInstructionDataEncoder().encode(\n args as ApproveInstructionDataArgs\n ),\n programAddress,\n } as ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The delegate. */\n delegate: TAccountMetas[1];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ApproveInstructionData;\n};\n\nexport function parseApproveInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_CHECKED_DISCRIMINATOR = 13;\n\nexport function getApproveCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_CHECKED_DISCRIMINATOR);\n}\n\nexport type ApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type ApproveCheckedInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getApproveCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getApproveCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getApproveCheckedInstructionDataCodec(): FixedSizeCodec<\n ApproveCheckedInstructionDataArgs,\n ApproveCheckedInstructionData\n> {\n return combineCodec(\n getApproveCheckedInstructionDataEncoder(),\n getApproveCheckedInstructionDataDecoder()\n );\n}\n\nexport type ApproveCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveCheckedInstructionDataArgs['amount'];\n decimals: ApproveCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getApproveCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApproveCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n TAccountOwner\n >,\n config?: { programAddress?: TProgramAddress }\n): ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveCheckedInstructionDataEncoder().encode(\n args as ApproveCheckedInstructionDataArgs\n ),\n programAddress,\n } as ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The delegate. */\n delegate: TAccountMetas[2];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[3];\n };\n data: ApproveCheckedInstructionData;\n};\n\nexport function parseApproveCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR = 27;\n\nexport function getApproveConfidentialTransferAccountDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR\n );\n}\n\nexport const APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 3;\n\nexport function getApproveConfidentialTransferAccountConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ApproveConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveConfidentialTransferAccountInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type ApproveConfidentialTransferAccountInstructionDataArgs = {};\n\nexport function getApproveConfidentialTransferAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getApproveConfidentialTransferAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getApproveConfidentialTransferAccountInstructionDataCodec(): FixedSizeCodec<\n ApproveConfidentialTransferAccountInstructionDataArgs,\n ApproveConfidentialTransferAccountInstructionData\n> {\n return combineCodec(\n getApproveConfidentialTransferAccountInstructionDataEncoder(),\n getApproveConfidentialTransferAccountInstructionDataDecoder()\n );\n}\n\nexport type ApproveConfidentialTransferAccountInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account to approve. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** Confidential transfer mint authority. */\n authority: TransactionSigner;\n};\n\nexport function getApproveConfidentialTransferAccountInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApproveConfidentialTransferAccountInput<\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ApproveConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getApproveConfidentialTransferAccountInstructionDataEncoder().encode(\n {}\n ),\n programAddress,\n } as ApproveConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n >);\n}\n\nexport type ParsedApproveConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account to approve. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** Confidential transfer mint authority. */\n authority: TAccountMetas[2];\n };\n data: ApproveConfidentialTransferAccountInstructionData;\n};\n\nexport function parseApproveConfidentialTransferAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveConfidentialTransferAccountInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getApproveConfidentialTransferAccountInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_DISCRIMINATOR = 8;\n\nexport function getBurnDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_DISCRIMINATOR);\n}\n\nexport type BurnInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnInstructionData = {\n /** The amount of tokens to burn. */\n discriminator: number;\n amount: bigint;\n};\n\nexport type BurnInstructionDataArgs = { amount: number | bigint };\n\nexport function getBurnInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_DISCRIMINATOR })\n );\n}\n\nexport function getBurnInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getBurnInstructionDataCodec(): FixedSizeCodec<\n BurnInstructionDataArgs,\n BurnInstructionData\n> {\n return combineCodec(\n getBurnInstructionDataEncoder(),\n getBurnInstructionDataDecoder()\n );\n}\n\nexport type BurnInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getBurnInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: BurnInput,\n config?: { programAddress?: TProgramAddress }\n): BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnInstructionDataEncoder().encode(\n args as BurnInstructionDataArgs\n ),\n programAddress,\n } as BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnInstructionData;\n};\n\nexport function parseBurnInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_CHECKED_DISCRIMINATOR = 15;\n\nexport function getBurnCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_CHECKED_DISCRIMINATOR);\n}\n\nexport type BurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to burn. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type BurnCheckedInstructionDataArgs = {\n /** The amount of tokens to burn. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getBurnCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getBurnCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getBurnCheckedInstructionDataCodec(): FixedSizeCodec<\n BurnCheckedInstructionDataArgs,\n BurnCheckedInstructionData\n> {\n return combineCodec(\n getBurnCheckedInstructionDataEncoder(),\n getBurnCheckedInstructionDataDecoder()\n );\n}\n\nexport type BurnCheckedInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnCheckedInstructionDataArgs['amount'];\n decimals: BurnCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getBurnCheckedInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: BurnCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnCheckedInstructionDataEncoder().encode(\n args as BurnCheckedInstructionDataArgs\n ),\n programAddress,\n } as BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnCheckedInstructionData;\n};\n\nexport function parseBurnCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CLOSE_ACCOUNT_DISCRIMINATOR = 9;\n\nexport function getCloseAccountDiscriminatorBytes() {\n return getU8Encoder().encode(CLOSE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type CloseAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseAccountInstructionData = { discriminator: number };\n\nexport type CloseAccountInstructionDataArgs = {};\n\nexport function getCloseAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: CLOSE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getCloseAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCloseAccountInstructionDataCodec(): FixedSizeCodec<\n CloseAccountInstructionDataArgs,\n CloseAccountInstructionData\n> {\n return combineCodec(\n getCloseAccountInstructionDataEncoder(),\n getCloseAccountInstructionDataDecoder()\n );\n}\n\nexport type CloseAccountInput<\n TAccountAccount extends string = string,\n TAccountDestination extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to close. */\n account: Address;\n /** The destination account. */\n destination: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getCloseAccountInstruction<\n TAccountAccount extends string,\n TAccountDestination extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: CloseAccountInput,\n config?: { programAddress?: TProgramAddress }\n): CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getCloseAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedCloseAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to close. */\n account: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: CloseAccountInstructionData;\n};\n\nexport function parseCloseAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCloseAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n destination: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getCloseAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CONFIDENTIAL_DEPOSIT_DISCRIMINATOR = 27;\n\nexport function getConfidentialDepositDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_DEPOSIT_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_DEPOSIT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 5;\n\nexport function getConfidentialDepositConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_DEPOSIT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialDepositInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialDepositInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The amount of tokens to deposit. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type ConfidentialDepositInstructionDataArgs = {\n /** The amount of tokens to deposit. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getConfidentialDepositInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_DEPOSIT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_DEPOSIT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialDepositInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getConfidentialDepositInstructionDataCodec(): FixedSizeCodec<\n ConfidentialDepositInstructionDataArgs,\n ConfidentialDepositInstructionData\n> {\n return combineCodec(\n getConfidentialDepositInstructionDataEncoder(),\n getConfidentialDepositInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialDepositInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: ConfidentialDepositInstructionDataArgs['amount'];\n decimals: ConfidentialDepositInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialDepositInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialDepositInput<\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialDepositInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialDepositInstructionDataEncoder().encode(\n args as ConfidentialDepositInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialDepositInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialDepositInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: ConfidentialDepositInstructionData;\n};\n\nexport function parseConfidentialDepositInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialDepositInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialDepositInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 27;\n\nexport function getConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_TRANSFER_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_TRANSFER_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 7;\n\nexport function getConfidentialTransferConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_TRANSFER_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialTransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSourceToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestinationToken extends string | AccountMeta = string,\n TAccountInstructionsSysvar extends string | AccountMeta = string,\n TAccountEqualityRecord extends string | AccountMeta = string,\n TAccountCiphertextValidityRecord extends\n | string\n | AccountMeta = string,\n TAccountRangeRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSourceToken extends string\n ? WritableAccount\n : TAccountSourceToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestinationToken extends string\n ? WritableAccount\n : TAccountDestinationToken,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvar,\n TAccountEqualityRecord extends string\n ? ReadonlyAccount\n : TAccountEqualityRecord,\n TAccountCiphertextValidityRecord extends string\n ? ReadonlyAccount\n : TAccountCiphertextValidityRecord,\n TAccountRangeRecord extends string\n ? ReadonlyAccount\n : TAccountRangeRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialTransferInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalance;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Transfer` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n ciphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU128Data`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport type ConfidentialTransferInstructionDataArgs = {\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalanceArgs;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Transfer` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n ciphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU128Data`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport function getConfidentialTransferInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['equalityProofInstructionOffset', getI8Encoder()],\n ['ciphertextValidityProofInstructionOffset', getI8Encoder()],\n ['rangeProofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_TRANSFER_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialTransferInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['equalityProofInstructionOffset', getI8Decoder()],\n ['ciphertextValidityProofInstructionOffset', getI8Decoder()],\n ['rangeProofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfidentialTransferInstructionDataCodec(): FixedSizeCodec<\n ConfidentialTransferInstructionDataArgs,\n ConfidentialTransferInstructionData\n> {\n return combineCodec(\n getConfidentialTransferInstructionDataEncoder(),\n getConfidentialTransferInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialTransferInput<\n TAccountSourceToken extends string = string,\n TAccountMint extends string = string,\n TAccountDestinationToken extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountEqualityRecord extends string = string,\n TAccountCiphertextValidityRecord extends string = string,\n TAccountRangeRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source SPL Token account. */\n sourceToken: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** The destination SPL Token account. */\n destinationToken: Address;\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: Address;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: Address;\n /** (Optional) Ciphertext validity proof record account or context state account. */\n ciphertextValidityRecord?: Address;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n newSourceDecryptableAvailableBalance: ConfidentialTransferInstructionDataArgs['newSourceDecryptableAvailableBalance'];\n equalityProofInstructionOffset: ConfidentialTransferInstructionDataArgs['equalityProofInstructionOffset'];\n ciphertextValidityProofInstructionOffset: ConfidentialTransferInstructionDataArgs['ciphertextValidityProofInstructionOffset'];\n rangeProofInstructionOffset: ConfidentialTransferInstructionDataArgs['rangeProofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialTransferInstruction<\n TAccountSourceToken extends string,\n TAccountMint extends string,\n TAccountDestinationToken extends string,\n TAccountInstructionsSysvar extends string,\n TAccountEqualityRecord extends string,\n TAccountCiphertextValidityRecord extends string,\n TAccountRangeRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialTransferInput<\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountCiphertextValidityRecord,\n TAccountRangeRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialTransferInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n sourceToken: { value: input.sourceToken ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destinationToken: {\n value: input.destinationToken ?? null,\n isWritable: true,\n },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n equalityRecord: { value: input.equalityRecord ?? null, isWritable: false },\n ciphertextValidityRecord: {\n value: input.ciphertextValidityRecord ?? null,\n isWritable: false,\n },\n rangeRecord: { value: input.rangeRecord ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.sourceToken),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destinationToken),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.equalityRecord),\n getAccountMeta(accounts.ciphertextValidityRecord),\n getAccountMeta(accounts.rangeRecord),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialTransferInstructionDataEncoder().encode(\n args as ConfidentialTransferInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialTransferInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialTransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source SPL Token account. */\n sourceToken: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** The destination SPL Token account. */\n destinationToken: TAccountMetas[2];\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: TAccountMetas[3] | undefined;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: TAccountMetas[4] | undefined;\n /** (Optional) Ciphertext validity proof record account or context state account. */\n ciphertextValidityRecord?: TAccountMetas[5] | undefined;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: TAccountMetas[6] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[7];\n };\n data: ConfidentialTransferInstructionData;\n};\n\nexport function parseConfidentialTransferInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialTransferInstruction {\n if (instruction.accounts.length < 8) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n sourceToken: getNextAccount(),\n mint: getNextAccount(),\n destinationToken: getNextAccount(),\n instructionsSysvar: getNextOptionalAccount(),\n equalityRecord: getNextOptionalAccount(),\n ciphertextValidityRecord: getNextOptionalAccount(),\n rangeRecord: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialTransferInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIDENTIAL_TRANSFER_WITH_FEE_DISCRIMINATOR = 27;\n\nexport function getConfidentialTransferWithFeeDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_TRANSFER_WITH_FEE_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_TRANSFER_WITH_FEE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 13;\n\nexport function getConfidentialTransferWithFeeConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_TRANSFER_WITH_FEE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialTransferWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSourceToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestinationToken extends string | AccountMeta = string,\n TAccountInstructionsSysvar extends string | AccountMeta = string,\n TAccountEqualityRecord extends string | AccountMeta = string,\n TAccountTransferAmountCiphertextValidityRecord extends\n | string\n | AccountMeta = string,\n TAccountFeeSigmaRecord extends string | AccountMeta = string,\n TAccountFeeCiphertextValidityRecord extends\n | string\n | AccountMeta = string,\n TAccountRangeRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSourceToken extends string\n ? WritableAccount\n : TAccountSourceToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestinationToken extends string\n ? WritableAccount\n : TAccountDestinationToken,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvar,\n TAccountEqualityRecord extends string\n ? ReadonlyAccount\n : TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord extends string\n ? ReadonlyAccount\n : TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord extends string\n ? ReadonlyAccount\n : TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord extends string\n ? ReadonlyAccount\n : TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord extends string\n ? ReadonlyAccount\n : TAccountRangeRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialTransferWithFeeInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalance;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `TransferWithFee` instruction in the transaction. If the offset\n * is `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n transferAmountCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::VerifyPercentageWithFee`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeSigmaProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext2HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU256Data`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport type ConfidentialTransferWithFeeInstructionDataArgs = {\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalanceArgs;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `TransferWithFee` instruction in the transaction. If the offset\n * is `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n transferAmountCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::VerifyPercentageWithFee`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeSigmaProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext2HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU256Data`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport function getConfidentialTransferWithFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['equalityProofInstructionOffset', getI8Encoder()],\n [\n 'transferAmountCiphertextValidityProofInstructionOffset',\n getI8Encoder(),\n ],\n ['feeSigmaProofInstructionOffset', getI8Encoder()],\n ['feeCiphertextValidityProofInstructionOffset', getI8Encoder()],\n ['rangeProofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_TRANSFER_WITH_FEE_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_TRANSFER_WITH_FEE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialTransferWithFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['equalityProofInstructionOffset', getI8Decoder()],\n ['transferAmountCiphertextValidityProofInstructionOffset', getI8Decoder()],\n ['feeSigmaProofInstructionOffset', getI8Decoder()],\n ['feeCiphertextValidityProofInstructionOffset', getI8Decoder()],\n ['rangeProofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfidentialTransferWithFeeInstructionDataCodec(): FixedSizeCodec<\n ConfidentialTransferWithFeeInstructionDataArgs,\n ConfidentialTransferWithFeeInstructionData\n> {\n return combineCodec(\n getConfidentialTransferWithFeeInstructionDataEncoder(),\n getConfidentialTransferWithFeeInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialTransferWithFeeInput<\n TAccountSourceToken extends string = string,\n TAccountMint extends string = string,\n TAccountDestinationToken extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountEqualityRecord extends string = string,\n TAccountTransferAmountCiphertextValidityRecord extends string = string,\n TAccountFeeSigmaRecord extends string = string,\n TAccountFeeCiphertextValidityRecord extends string = string,\n TAccountRangeRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source SPL Token account. */\n sourceToken: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** The destination SPL Token account. */\n destinationToken: Address;\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: Address;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: Address;\n /**\n * (Optional) Transfer amount ciphertext validity proof record\n * account or context state account.\n */\n transferAmountCiphertextValidityRecord?: Address;\n /** (Optional) Fee sigma proof record account or context state account. */\n feeSigmaRecord?: Address;\n /** (Optional) Fee ciphertext validity proof record account or context state account. */\n feeCiphertextValidityRecord?: Address;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n newSourceDecryptableAvailableBalance: ConfidentialTransferWithFeeInstructionDataArgs['newSourceDecryptableAvailableBalance'];\n equalityProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['equalityProofInstructionOffset'];\n transferAmountCiphertextValidityProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['transferAmountCiphertextValidityProofInstructionOffset'];\n feeSigmaProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['feeSigmaProofInstructionOffset'];\n feeCiphertextValidityProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['feeCiphertextValidityProofInstructionOffset'];\n rangeProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['rangeProofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialTransferWithFeeInstruction<\n TAccountSourceToken extends string,\n TAccountMint extends string,\n TAccountDestinationToken extends string,\n TAccountInstructionsSysvar extends string,\n TAccountEqualityRecord extends string,\n TAccountTransferAmountCiphertextValidityRecord extends string,\n TAccountFeeSigmaRecord extends string,\n TAccountFeeCiphertextValidityRecord extends string,\n TAccountRangeRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialTransferWithFeeInput<\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialTransferWithFeeInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n sourceToken: { value: input.sourceToken ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destinationToken: {\n value: input.destinationToken ?? null,\n isWritable: true,\n },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n equalityRecord: { value: input.equalityRecord ?? null, isWritable: false },\n transferAmountCiphertextValidityRecord: {\n value: input.transferAmountCiphertextValidityRecord ?? null,\n isWritable: false,\n },\n feeSigmaRecord: { value: input.feeSigmaRecord ?? null, isWritable: false },\n feeCiphertextValidityRecord: {\n value: input.feeCiphertextValidityRecord ?? null,\n isWritable: false,\n },\n rangeRecord: { value: input.rangeRecord ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.sourceToken),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destinationToken),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.equalityRecord),\n getAccountMeta(accounts.transferAmountCiphertextValidityRecord),\n getAccountMeta(accounts.feeSigmaRecord),\n getAccountMeta(accounts.feeCiphertextValidityRecord),\n getAccountMeta(accounts.rangeRecord),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialTransferWithFeeInstructionDataEncoder().encode(\n args as ConfidentialTransferWithFeeInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialTransferWithFeeInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialTransferWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source SPL Token account. */\n sourceToken: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** The destination SPL Token account. */\n destinationToken: TAccountMetas[2];\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: TAccountMetas[3] | undefined;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: TAccountMetas[4] | undefined;\n /**\n * (Optional) Transfer amount ciphertext validity proof record\n * account or context state account.\n */\n transferAmountCiphertextValidityRecord?: TAccountMetas[5] | undefined;\n /** (Optional) Fee sigma proof record account or context state account. */\n feeSigmaRecord?: TAccountMetas[6] | undefined;\n /** (Optional) Fee ciphertext validity proof record account or context state account. */\n feeCiphertextValidityRecord?: TAccountMetas[7] | undefined;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: TAccountMetas[8] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[9];\n };\n data: ConfidentialTransferWithFeeInstructionData;\n};\n\nexport function parseConfidentialTransferWithFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialTransferWithFeeInstruction {\n if (instruction.accounts.length < 10) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n sourceToken: getNextAccount(),\n mint: getNextAccount(),\n destinationToken: getNextAccount(),\n instructionsSysvar: getNextOptionalAccount(),\n equalityRecord: getNextOptionalAccount(),\n transferAmountCiphertextValidityRecord: getNextOptionalAccount(),\n feeSigmaRecord: getNextOptionalAccount(),\n feeCiphertextValidityRecord: getNextOptionalAccount(),\n rangeRecord: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialTransferWithFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIDENTIAL_WITHDRAW_DISCRIMINATOR = 27;\n\nexport function getConfidentialWithdrawDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_WITHDRAW_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_WITHDRAW_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 6;\n\nexport function getConfidentialWithdrawConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_WITHDRAW_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialWithdrawInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountInstructionsSysvar extends string | AccountMeta = string,\n TAccountEqualityRecord extends string | AccountMeta = string,\n TAccountRangeRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvar,\n TAccountEqualityRecord extends string\n ? ReadonlyAccount\n : TAccountEqualityRecord,\n TAccountRangeRecord extends string\n ? ReadonlyAccount\n : TAccountRangeRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialWithdrawInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The amount of tokens to withdraw. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The new decryptable balance if the withdrawal succeeds. */\n newDecryptableAvailableBalance: DecryptableBalance;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Withdraw` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU64`\n * instruction to the `Withdraw` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport type ConfidentialWithdrawInstructionDataArgs = {\n /** The amount of tokens to withdraw. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The new decryptable balance if the withdrawal succeeds. */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Withdraw` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU64`\n * instruction to the `Withdraw` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport function getConfidentialWithdrawInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['equalityProofInstructionOffset', getI8Encoder()],\n ['rangeProofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_WITHDRAW_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_WITHDRAW_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialWithdrawInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['equalityProofInstructionOffset', getI8Decoder()],\n ['rangeProofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfidentialWithdrawInstructionDataCodec(): FixedSizeCodec<\n ConfidentialWithdrawInstructionDataArgs,\n ConfidentialWithdrawInstructionData\n> {\n return combineCodec(\n getConfidentialWithdrawInstructionDataEncoder(),\n getConfidentialWithdrawInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialWithdrawInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountEqualityRecord extends string = string,\n TAccountRangeRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /**\n * Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: Address;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: Address;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: ConfidentialWithdrawInstructionDataArgs['amount'];\n decimals: ConfidentialWithdrawInstructionDataArgs['decimals'];\n newDecryptableAvailableBalance: ConfidentialWithdrawInstructionDataArgs['newDecryptableAvailableBalance'];\n equalityProofInstructionOffset: ConfidentialWithdrawInstructionDataArgs['equalityProofInstructionOffset'];\n rangeProofInstructionOffset: ConfidentialWithdrawInstructionDataArgs['rangeProofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialWithdrawInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountInstructionsSysvar extends string,\n TAccountEqualityRecord extends string,\n TAccountRangeRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialWithdrawInput<\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountRangeRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialWithdrawInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n equalityRecord: { value: input.equalityRecord ?? null, isWritable: false },\n rangeRecord: { value: input.rangeRecord ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.equalityRecord),\n getAccountMeta(accounts.rangeRecord),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialWithdrawInstructionDataEncoder().encode(\n args as ConfidentialWithdrawInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialWithdrawInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialWithdrawInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /**\n * Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: TAccountMetas[2] | undefined;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: TAccountMetas[3] | undefined;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: TAccountMetas[4] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[5];\n };\n data: ConfidentialWithdrawInstructionData;\n};\n\nexport function parseConfidentialWithdrawInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialWithdrawInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n instructionsSysvar: getNextOptionalAccount(),\n equalityRecord: getNextOptionalAccount(),\n rangeRecord: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialWithdrawInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR = 27;\n\nexport function getConfigureConfidentialTransferAccountDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR\n );\n}\n\nexport const CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 2;\n\nexport function getConfigureConfidentialTransferAccountConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfigureConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = 'Sysvar1nstructions1111111111111111111111111',\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfigureConfidentialTransferAccountInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The decryptable balance (always 0) once the configure account succeeds. */\n decryptableZeroBalance: DecryptableBalance;\n /**\n * The maximum number of despots and transfers that an account can receiver\n * before the `ApplyPendingBalance` is executed\n */\n maximumPendingBalanceCreditCounter: bigint;\n /**\n * Relative location of the `ProofInstruction::ZeroCiphertextProof`\n * instruction to the `ConfigureAccount` instruction in the\n * transaction. If the offset is `0`, then use a context state account\n * for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport type ConfigureConfidentialTransferAccountInstructionDataArgs = {\n /** The decryptable balance (always 0) once the configure account succeeds. */\n decryptableZeroBalance: DecryptableBalanceArgs;\n /**\n * The maximum number of despots and transfers that an account can receiver\n * before the `ApplyPendingBalance` is executed\n */\n maximumPendingBalanceCreditCounter: number | bigint;\n /**\n * Relative location of the `ProofInstruction::ZeroCiphertextProof`\n * instruction to the `ConfigureAccount` instruction in the\n * transaction. If the offset is `0`, then use a context state account\n * for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport function getConfigureConfidentialTransferAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['decryptableZeroBalance', getDecryptableBalanceEncoder()],\n ['maximumPendingBalanceCreditCounter', getU64Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfigureConfidentialTransferAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['decryptableZeroBalance', getDecryptableBalanceDecoder()],\n ['maximumPendingBalanceCreditCounter', getU64Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfigureConfidentialTransferAccountInstructionDataCodec(): FixedSizeCodec<\n ConfigureConfidentialTransferAccountInstructionDataArgs,\n ConfigureConfidentialTransferAccountInstructionData\n> {\n return combineCodec(\n getConfigureConfidentialTransferAccountInstructionDataEncoder(),\n getConfigureConfidentialTransferAccountInstructionDataDecoder()\n );\n}\n\nexport type ConfigureConfidentialTransferAccountInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /**\n * Instructions sysvar if `VerifyPubkeyValidity` is included in\n * the same transaction or context state account if\n * `VerifyPubkeyValidity` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState?: Address;\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n decryptableZeroBalance: ConfigureConfidentialTransferAccountInstructionDataArgs['decryptableZeroBalance'];\n maximumPendingBalanceCreditCounter: ConfigureConfidentialTransferAccountInstructionDataArgs['maximumPendingBalanceCreditCounter'];\n proofInstructionOffset: ConfigureConfidentialTransferAccountInstructionDataArgs['proofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfigureConfidentialTransferAccountInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfigureConfidentialTransferAccountInput<\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfigureConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvarOrContextState.value) {\n accounts.instructionsSysvarOrContextState.value =\n 'Sysvar1nstructions1111111111111111111111111' as Address<'Sysvar1nstructions1111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfigureConfidentialTransferAccountInstructionDataEncoder().encode(\n args as ConfigureConfidentialTransferAccountInstructionDataArgs\n ),\n programAddress,\n } as ConfigureConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfigureConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /**\n * Instructions sysvar if `VerifyPubkeyValidity` is included in\n * the same transaction or context state account if\n * `VerifyPubkeyValidity` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState: TAccountMetas[2];\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: TAccountMetas[3] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[4];\n };\n data: ConfigureConfidentialTransferAccountInstructionData;\n};\n\nexport function parseConfigureConfidentialTransferAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfigureConfidentialTransferAccountInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfigureConfidentialTransferAccountInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n getAddressEncoder,\n getProgramDerivedAddress,\n type Address,\n type ProgramDerivedAddress,\n} from '@solana/kit';\n\nexport type AssociatedTokenSeeds = {\n /** The wallet address of the associated token account. */\n owner: Address;\n /** The address of the token program to use. */\n tokenProgram: Address;\n /** The mint address of the associated token account. */\n mint: Address;\n};\n\nexport async function findAssociatedTokenPda(\n seeds: AssociatedTokenSeeds,\n config: { programAddress?: Address | undefined } = {}\n): Promise {\n const {\n programAddress = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>,\n } = config;\n return await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getAddressEncoder().encode(seeds.owner),\n getAddressEncoder().encode(seeds.tokenProgram),\n getAddressEncoder().encode(seeds.mint),\n ],\n });\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR = 0;\n\nexport function getCreateAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type CreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenInstructionData = { discriminator: number };\n\nexport type CreateAssociatedTokenInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenInstructionDataArgs,\n CreateAssociatedTokenInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenInstructionDataEncoder(),\n getCreateAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenInstructionData;\n};\n\nexport function parseCreateAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR = 1;\n\nexport function getCreateAssociatedTokenIdempotentDiscriminatorBytes() {\n return getU8Encoder().encode(\n CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR\n );\n}\n\nexport type CreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenIdempotentInstructionData = {\n discriminator: number;\n};\n\nexport type CreateAssociatedTokenIdempotentInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenIdempotentInstructionDataArgs,\n CreateAssociatedTokenIdempotentInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenIdempotentInstructionDataEncoder(),\n getCreateAssociatedTokenIdempotentInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenIdempotentInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenIdempotentInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenIdempotentInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenIdempotentInstructionData;\n};\n\nexport function parseCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenIdempotentInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenIdempotentInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CREATE_NATIVE_MINT_DISCRIMINATOR = 31;\n\nexport function getCreateNativeMintDiscriminatorBytes() {\n return getU8Encoder().encode(CREATE_NATIVE_MINT_DISCRIMINATOR);\n}\n\nexport type CreateNativeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountNativeMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountNativeMint extends string\n ? WritableAccount\n : TAccountNativeMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateNativeMintInstructionData = { discriminator: number };\n\nexport type CreateNativeMintInstructionDataArgs = {};\n\nexport function getCreateNativeMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: CREATE_NATIVE_MINT_DISCRIMINATOR })\n );\n}\n\nexport function getCreateNativeMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateNativeMintInstructionDataCodec(): FixedSizeCodec<\n CreateNativeMintInstructionDataArgs,\n CreateNativeMintInstructionData\n> {\n return combineCodec(\n getCreateNativeMintInstructionDataEncoder(),\n getCreateNativeMintInstructionDataDecoder()\n );\n}\n\nexport type CreateNativeMintInput<\n TAccountPayer extends string = string,\n TAccountNativeMint extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Funding account (must be a system account) */\n payer: TransactionSigner;\n /** The native mint address */\n nativeMint: Address;\n /** System program for mint account funding */\n systemProgram?: Address;\n};\n\nexport function getCreateNativeMintInstruction<\n TAccountPayer extends string,\n TAccountNativeMint extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: CreateNativeMintInput<\n TAccountPayer,\n TAccountNativeMint,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateNativeMintInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNativeMint,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n nativeMint: { value: input.nativeMint ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.nativeMint),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getCreateNativeMintInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateNativeMintInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNativeMint,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedCreateNativeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account) */\n payer: TAccountMetas[0];\n /** The native mint address */\n nativeMint: TAccountMetas[1];\n /** System program for mint account funding */\n systemProgram: TAccountMetas[2];\n };\n data: CreateNativeMintInstructionData;\n};\n\nexport function parseCreateNativeMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateNativeMintInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n nativeMint: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getCreateNativeMintInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getDisableConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const DISABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 10;\n\nexport function getDisableConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type DisableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type DisableConfidentialCreditsInstructionDataArgs = {};\n\nexport function getDisableConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n DISABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n DisableConfidentialCreditsInstructionDataArgs,\n DisableConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getDisableConfidentialCreditsInstructionDataEncoder(),\n getDisableConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type DisableConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): DisableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getDisableConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedDisableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: DisableConfidentialCreditsInstructionData;\n};\n\nexport function parseDisableConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getDisableConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_CPI_GUARD_DISCRIMINATOR = 34;\n\nexport function getDisableCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport const DISABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR = 1;\n\nexport function getDisableCpiGuardCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport type DisableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableCpiGuardInstructionData = {\n discriminator: number;\n cpiGuardDiscriminator: number;\n};\n\nexport type DisableCpiGuardInstructionDataArgs = {};\n\nexport function getDisableCpiGuardInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['cpiGuardDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_CPI_GUARD_DISCRIMINATOR,\n cpiGuardDiscriminator: DISABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableCpiGuardInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['cpiGuardDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableCpiGuardInstructionDataCodec(): FixedSizeCodec<\n DisableCpiGuardInstructionDataArgs,\n DisableCpiGuardInstructionData\n> {\n return combineCodec(\n getDisableCpiGuardInstructionDataEncoder(),\n getDisableCpiGuardInstructionDataDecoder()\n );\n}\n\nexport type DisableCpiGuardInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner/delegate or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableCpiGuardInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableCpiGuardInput,\n config?: { programAddress?: TProgramAddress }\n): DisableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getDisableCpiGuardInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedDisableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner/delegate or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: DisableCpiGuardInstructionData;\n};\n\nexport function parseDisableCpiGuardInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableCpiGuardInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getDisableCpiGuardInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_HARVEST_TO_MINT_DISCRIMINATOR = 37;\n\nexport function getDisableHarvestToMintDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_HARVEST_TO_MINT_DISCRIMINATOR);\n}\n\nexport const DISABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 5;\n\nexport function getDisableHarvestToMintConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type DisableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableHarvestToMintInstructionData = {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n};\n\nexport type DisableHarvestToMintInstructionDataArgs = {};\n\nexport function getDisableHarvestToMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_HARVEST_TO_MINT_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n DISABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableHarvestToMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableHarvestToMintInstructionDataCodec(): FixedSizeCodec<\n DisableHarvestToMintInstructionDataArgs,\n DisableHarvestToMintInstructionData\n> {\n return combineCodec(\n getDisableHarvestToMintInstructionDataEncoder(),\n getDisableHarvestToMintInstructionDataDecoder()\n );\n}\n\nexport type DisableHarvestToMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The confidential transfer fee authority */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableHarvestToMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableHarvestToMintInput,\n config?: { programAddress?: TProgramAddress }\n): DisableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getDisableHarvestToMintInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedDisableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The confidential transfer fee authority */\n authority: TAccountMetas[1];\n };\n data: DisableHarvestToMintInstructionData;\n};\n\nexport function parseDisableHarvestToMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableHarvestToMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getDisableHarvestToMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_MEMO_TRANSFERS_DISCRIMINATOR = 30;\n\nexport function getDisableMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_MEMO_TRANSFERS_DISCRIMINATOR);\n}\n\nexport const DISABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR = 1;\n\nexport function getDisableMemoTransfersMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR\n );\n}\n\nexport type DisableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableMemoTransfersInstructionData = {\n discriminator: number;\n memoTransfersDiscriminator: number;\n};\n\nexport type DisableMemoTransfersInstructionDataArgs = {};\n\nexport function getDisableMemoTransfersInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['memoTransfersDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_MEMO_TRANSFERS_DISCRIMINATOR,\n memoTransfersDiscriminator:\n DISABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableMemoTransfersInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['memoTransfersDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableMemoTransfersInstructionDataCodec(): FixedSizeCodec<\n DisableMemoTransfersInstructionDataArgs,\n DisableMemoTransfersInstructionData\n> {\n return combineCodec(\n getDisableMemoTransfersInstructionDataEncoder(),\n getDisableMemoTransfersInstructionDataDecoder()\n );\n}\n\nexport type DisableMemoTransfersInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableMemoTransfersInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableMemoTransfersInput,\n config?: { programAddress?: TProgramAddress }\n): DisableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getDisableMemoTransfersInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedDisableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: DisableMemoTransfersInstructionData;\n};\n\nexport function parseDisableMemoTransfersInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableMemoTransfersInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getDisableMemoTransfersInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getDisableNonConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const DISABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 12;\n\nexport function getDisableNonConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type DisableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableNonConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type DisableNonConfidentialCreditsInstructionDataArgs = {};\n\nexport function getDisableNonConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n DISABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableNonConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableNonConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n DisableNonConfidentialCreditsInstructionDataArgs,\n DisableNonConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getDisableNonConfidentialCreditsInstructionDataEncoder(),\n getDisableNonConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type DisableNonConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableNonConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableNonConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): DisableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getDisableNonConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedDisableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: DisableNonConfidentialCreditsInstructionData;\n};\n\nexport function parseDisableNonConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableNonConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getDisableNonConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const EMIT_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([\n 250, 166, 180, 250, 13, 12, 184, 70,\n]);\n\nexport function getEmitTokenMetadataDiscriminatorBytes() {\n return getBytesEncoder().encode(EMIT_TOKEN_METADATA_DISCRIMINATOR);\n}\n\nexport type EmitTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? ReadonlyAccount\n : TAccountMetadata,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EmitTokenMetadataInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Start of range of data to emit */\n start: Option;\n /** End of range of data to emit */\n end: Option;\n};\n\nexport type EmitTokenMetadataInstructionDataArgs = {\n /** Start of range of data to emit */\n start?: OptionOrNullable;\n /** End of range of data to emit */\n end?: OptionOrNullable;\n};\n\nexport function getEmitTokenMetadataInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['start', getOptionEncoder(getU64Encoder())],\n ['end', getOptionEncoder(getU64Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: EMIT_TOKEN_METADATA_DISCRIMINATOR,\n start: value.start ?? none(),\n end: value.end ?? none(),\n })\n );\n}\n\nexport function getEmitTokenMetadataInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['start', getOptionDecoder(getU64Decoder())],\n ['end', getOptionDecoder(getU64Decoder())],\n ]);\n}\n\nexport function getEmitTokenMetadataInstructionDataCodec(): Codec<\n EmitTokenMetadataInstructionDataArgs,\n EmitTokenMetadataInstructionData\n> {\n return combineCodec(\n getEmitTokenMetadataInstructionDataEncoder(),\n getEmitTokenMetadataInstructionDataDecoder()\n );\n}\n\nexport type EmitTokenMetadataInput = {\n metadata: Address;\n start?: EmitTokenMetadataInstructionDataArgs['start'];\n end?: EmitTokenMetadataInstructionDataArgs['end'];\n};\n\nexport function getEmitTokenMetadataInstruction<\n TAccountMetadata extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EmitTokenMetadataInput,\n config?: { programAddress?: TProgramAddress }\n): EmitTokenMetadataInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.metadata)],\n data: getEmitTokenMetadataInstructionDataEncoder().encode(\n args as EmitTokenMetadataInstructionDataArgs\n ),\n programAddress,\n } as EmitTokenMetadataInstruction);\n}\n\nexport type ParsedEmitTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n };\n data: EmitTokenMetadataInstructionData;\n};\n\nexport function parseEmitTokenMetadataInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEmitTokenMetadataInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount() },\n data: getEmitTokenMetadataInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR = 27;\n\nexport function getEmptyConfidentialTransferAccountDiscriminatorBytes() {\n return getU8Encoder().encode(\n EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR\n );\n}\n\nexport const EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 4;\n\nexport function getEmptyConfidentialTransferAccountConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type EmptyConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = 'Sysvar1nstructions1111111111111111111111111',\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EmptyConfidentialTransferAccountInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * Relative location of the `ProofInstruction::VerifyCloseAccount`\n * instruction to the `EmptyAccount` instruction in the transaction. If\n * the offset is `0`, then use a context state account for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport type EmptyConfidentialTransferAccountInstructionDataArgs = {\n /**\n * Relative location of the `ProofInstruction::VerifyCloseAccount`\n * instruction to the `EmptyAccount` instruction in the transaction. If\n * the offset is `0`, then use a context state account for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport function getEmptyConfidentialTransferAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEmptyConfidentialTransferAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getEmptyConfidentialTransferAccountInstructionDataCodec(): FixedSizeCodec<\n EmptyConfidentialTransferAccountInstructionDataArgs,\n EmptyConfidentialTransferAccountInstructionData\n> {\n return combineCodec(\n getEmptyConfidentialTransferAccountInstructionDataEncoder(),\n getEmptyConfidentialTransferAccountInstructionDataDecoder()\n );\n}\n\nexport type EmptyConfidentialTransferAccountInput<\n TAccountToken extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /**\n * Instructions sysvar if `VerifyZeroCiphertext` is included in\n * the same transaction or context state account if\n * `VerifyZeroCiphertext` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState?: Address;\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n proofInstructionOffset: EmptyConfidentialTransferAccountInstructionDataArgs['proofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getEmptyConfidentialTransferAccountInstruction<\n TAccountToken extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EmptyConfidentialTransferAccountInput<\n TAccountToken,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): EmptyConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvarOrContextState.value) {\n accounts.instructionsSysvarOrContextState.value =\n 'Sysvar1nstructions1111111111111111111111111' as Address<'Sysvar1nstructions1111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEmptyConfidentialTransferAccountInstructionDataEncoder().encode(\n args as EmptyConfidentialTransferAccountInstructionDataArgs\n ),\n programAddress,\n } as EmptyConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEmptyConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /**\n * Instructions sysvar if `VerifyZeroCiphertext` is included in\n * the same transaction or context state account if\n * `VerifyZeroCiphertext` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState: TAccountMetas[1];\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: TAccountMetas[2] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: EmptyConfidentialTransferAccountInstructionData;\n};\n\nexport function parseEmptyConfidentialTransferAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEmptyConfidentialTransferAccountInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getEmptyConfidentialTransferAccountInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getEnableConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const ENABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 9;\n\nexport function getEnableConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type EnableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type EnableConfidentialCreditsInstructionDataArgs = {};\n\nexport function getEnableConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n ENABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n EnableConfidentialCreditsInstructionDataArgs,\n EnableConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getEnableConfidentialCreditsInstructionDataEncoder(),\n getEnableConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type EnableConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): EnableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEnableConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEnableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: EnableConfidentialCreditsInstructionData;\n};\n\nexport function parseEnableConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getEnableConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_CPI_GUARD_DISCRIMINATOR = 34;\n\nexport function getEnableCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport const ENABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR = 0;\n\nexport function getEnableCpiGuardCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport type EnableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableCpiGuardInstructionData = {\n discriminator: number;\n cpiGuardDiscriminator: number;\n};\n\nexport type EnableCpiGuardInstructionDataArgs = {};\n\nexport function getEnableCpiGuardInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['cpiGuardDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_CPI_GUARD_DISCRIMINATOR,\n cpiGuardDiscriminator: ENABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableCpiGuardInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['cpiGuardDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableCpiGuardInstructionDataCodec(): FixedSizeCodec<\n EnableCpiGuardInstructionDataArgs,\n EnableCpiGuardInstructionData\n> {\n return combineCodec(\n getEnableCpiGuardInstructionDataEncoder(),\n getEnableCpiGuardInstructionDataDecoder()\n );\n}\n\nexport type EnableCpiGuardInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner/delegate or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableCpiGuardInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableCpiGuardInput,\n config?: { programAddress?: TProgramAddress }\n): EnableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getEnableCpiGuardInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedEnableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner/delegate or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: EnableCpiGuardInstructionData;\n};\n\nexport function parseEnableCpiGuardInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableCpiGuardInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getEnableCpiGuardInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_HARVEST_TO_MINT_DISCRIMINATOR = 37;\n\nexport function getEnableHarvestToMintDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_HARVEST_TO_MINT_DISCRIMINATOR);\n}\n\nexport const ENABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 4;\n\nexport function getEnableHarvestToMintConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type EnableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableHarvestToMintInstructionData = {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n};\n\nexport type EnableHarvestToMintInstructionDataArgs = {};\n\nexport function getEnableHarvestToMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_HARVEST_TO_MINT_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n ENABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableHarvestToMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableHarvestToMintInstructionDataCodec(): FixedSizeCodec<\n EnableHarvestToMintInstructionDataArgs,\n EnableHarvestToMintInstructionData\n> {\n return combineCodec(\n getEnableHarvestToMintInstructionDataEncoder(),\n getEnableHarvestToMintInstructionDataDecoder()\n );\n}\n\nexport type EnableHarvestToMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The confidential transfer fee authority */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableHarvestToMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableHarvestToMintInput,\n config?: { programAddress?: TProgramAddress }\n): EnableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEnableHarvestToMintInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEnableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The confidential transfer fee authority */\n authority: TAccountMetas[1];\n };\n data: EnableHarvestToMintInstructionData;\n};\n\nexport function parseEnableHarvestToMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableHarvestToMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getEnableHarvestToMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_MEMO_TRANSFERS_DISCRIMINATOR = 30;\n\nexport function getEnableMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_MEMO_TRANSFERS_DISCRIMINATOR);\n}\n\nexport const ENABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR = 0;\n\nexport function getEnableMemoTransfersMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR\n );\n}\n\nexport type EnableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableMemoTransfersInstructionData = {\n discriminator: number;\n memoTransfersDiscriminator: number;\n};\n\nexport type EnableMemoTransfersInstructionDataArgs = {};\n\nexport function getEnableMemoTransfersInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['memoTransfersDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_MEMO_TRANSFERS_DISCRIMINATOR,\n memoTransfersDiscriminator:\n ENABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableMemoTransfersInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['memoTransfersDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableMemoTransfersInstructionDataCodec(): FixedSizeCodec<\n EnableMemoTransfersInstructionDataArgs,\n EnableMemoTransfersInstructionData\n> {\n return combineCodec(\n getEnableMemoTransfersInstructionDataEncoder(),\n getEnableMemoTransfersInstructionDataDecoder()\n );\n}\n\nexport type EnableMemoTransfersInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableMemoTransfersInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableMemoTransfersInput,\n config?: { programAddress?: TProgramAddress }\n): EnableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getEnableMemoTransfersInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedEnableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: EnableMemoTransfersInstructionData;\n};\n\nexport function parseEnableMemoTransfersInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableMemoTransfersInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getEnableMemoTransfersInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getEnableNonConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const ENABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 11;\n\nexport function getEnableNonConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type EnableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableNonConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type EnableNonConfidentialCreditsInstructionDataArgs = {};\n\nexport function getEnableNonConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n ENABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableNonConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableNonConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n EnableNonConfidentialCreditsInstructionDataArgs,\n EnableNonConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getEnableNonConfidentialCreditsInstructionDataEncoder(),\n getEnableNonConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type EnableNonConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableNonConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableNonConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): EnableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEnableNonConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEnableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: EnableNonConfidentialCreditsInstructionData;\n};\n\nexport function parseEnableNonConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableNonConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getEnableNonConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const FREEZE_ACCOUNT_DISCRIMINATOR = 10;\n\nexport function getFreezeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(FREEZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type FreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type FreezeAccountInstructionData = { discriminator: number };\n\nexport type FreezeAccountInstructionDataArgs = {};\n\nexport function getFreezeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: FREEZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getFreezeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getFreezeAccountInstructionDataCodec(): FixedSizeCodec<\n FreezeAccountInstructionDataArgs,\n FreezeAccountInstructionData\n> {\n return combineCodec(\n getFreezeAccountInstructionDataEncoder(),\n getFreezeAccountInstructionDataDecoder()\n );\n}\n\nexport type FreezeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to freeze. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getFreezeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: FreezeAccountInput,\n config?: { programAddress?: TProgramAddress }\n): FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getFreezeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedFreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to freeze. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: FreezeAccountInstructionData;\n};\n\nexport function parseFreezeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedFreezeAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getFreezeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR = 21;\n\nexport function getGetAccountDataSizeDiscriminatorBytes() {\n return getU8Encoder().encode(GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR);\n}\n\nexport type GetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type GetAccountDataSizeInstructionData = { discriminator: number };\n\nexport type GetAccountDataSizeInstructionDataArgs = {};\n\nexport function getGetAccountDataSizeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getGetAccountDataSizeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getGetAccountDataSizeInstructionDataCodec(): FixedSizeCodec<\n GetAccountDataSizeInstructionDataArgs,\n GetAccountDataSizeInstructionData\n> {\n return combineCodec(\n getGetAccountDataSizeInstructionDataEncoder(),\n getGetAccountDataSizeInstructionDataDecoder()\n );\n}\n\nexport type GetAccountDataSizeInput = {\n /** The mint to calculate for. */\n mint: Address;\n};\n\nexport function getGetAccountDataSizeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: GetAccountDataSizeInput,\n config?: { programAddress?: TProgramAddress }\n): GetAccountDataSizeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getGetAccountDataSizeInstructionDataEncoder().encode({}),\n programAddress,\n } as GetAccountDataSizeInstruction);\n}\n\nexport type ParsedGetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: GetAccountDataSizeInstructionData;\n};\n\nexport function parseGetAccountDataSizeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedGetAccountDataSizeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getGetAccountDataSizeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_DISCRIMINATOR = 26;\n\nexport function getHarvestWithheldTokensToMintDiscriminatorBytes() {\n return getU8Encoder().encode(HARVEST_WITHHELD_TOKENS_TO_MINT_DISCRIMINATOR);\n}\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_TRANSFER_FEE_DISCRIMINATOR = 4;\n\nexport function getHarvestWithheldTokensToMintTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n HARVEST_WITHHELD_TOKENS_TO_MINT_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type HarvestWithheldTokensToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type HarvestWithheldTokensToMintInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n};\n\nexport type HarvestWithheldTokensToMintInstructionDataArgs = {};\n\nexport function getHarvestWithheldTokensToMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: HARVEST_WITHHELD_TOKENS_TO_MINT_DISCRIMINATOR,\n transferFeeDiscriminator:\n HARVEST_WITHHELD_TOKENS_TO_MINT_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getHarvestWithheldTokensToMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getHarvestWithheldTokensToMintInstructionDataCodec(): FixedSizeCodec<\n HarvestWithheldTokensToMintInstructionDataArgs,\n HarvestWithheldTokensToMintInstructionData\n> {\n return combineCodec(\n getHarvestWithheldTokensToMintInstructionDataEncoder(),\n getHarvestWithheldTokensToMintInstructionDataDecoder()\n );\n}\n\nexport type HarvestWithheldTokensToMintInput<\n TAccountMint extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n sources: Array
;\n};\n\nexport function getHarvestWithheldTokensToMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: HarvestWithheldTokensToMintInput,\n config?: { programAddress?: TProgramAddress }\n): HarvestWithheldTokensToMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.sources.map((address) => ({\n address,\n role: AccountRole.WRITABLE,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), ...remainingAccounts],\n data: getHarvestWithheldTokensToMintInstructionDataEncoder().encode({}),\n programAddress,\n } as HarvestWithheldTokensToMintInstruction);\n}\n\nexport type ParsedHarvestWithheldTokensToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n };\n data: HarvestWithheldTokensToMintInstructionData;\n};\n\nexport function parseHarvestWithheldTokensToMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedHarvestWithheldTokensToMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getHarvestWithheldTokensToMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 3;\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionData =\n { discriminator: number; confidentialTransferFeeDiscriminator: number };\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataArgs =\n {};\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator:\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataArgs,\n HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataEncoder(),\n getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n sources?: Array
;\n};\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: HarvestWithheldTokensToMintForConfidentialTransferFeeInput,\n config?: { programAddress?: TProgramAddress }\n): HarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.sources ?? []).map(\n (address) => ({ address, role: AccountRole.WRITABLE })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), ...remainingAccounts],\n data: getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataEncoder().encode(\n {}\n ),\n programAddress,\n } as HarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint\n >);\n}\n\nexport type ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n };\n data: HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionData;\n};\n\nexport function parseHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT_DISCRIMINATOR = 1;\n\nexport function getInitializeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type InitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccountInstructionData = { discriminator: number };\n\nexport type InitializeAccountInstructionDataArgs = {};\n\nexport function getInitializeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeAccountInstructionDataCodec(): FixedSizeCodec<\n InitializeAccountInstructionDataArgs,\n InitializeAccountInstructionData\n> {\n return combineCodec(\n getInitializeAccountInstructionDataEncoder(),\n getInitializeAccountInstructionDataDecoder()\n );\n}\n\nexport type InitializeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** The new account's owner/multisignature. */\n owner: Address;\n /** Rent sysvar. */\n rent?: Address;\n};\n\nexport function getInitializeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeAccountInput<\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** The new account's owner/multisignature. */\n owner: TAccountMetas[2];\n /** Rent sysvar. */\n rent: TAccountMetas[3];\n };\n data: InitializeAccountInstructionData;\n};\n\nexport function parseInitializeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccountInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT2_DISCRIMINATOR = 16;\n\nexport function getInitializeAccount2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT2_DISCRIMINATOR);\n}\n\nexport type InitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount2InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount2InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount2InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount2InstructionDataArgs,\n InitializeAccount2InstructionData\n> {\n return combineCodec(\n getInitializeAccount2InstructionDataEncoder(),\n getInitializeAccount2InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount2Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n owner: InitializeAccount2InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount2Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccount2InstructionDataEncoder().encode(\n args as InitializeAccount2InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** Rent sysvar. */\n rent: TAccountMetas[2];\n };\n data: InitializeAccount2InstructionData;\n};\n\nexport function parseInitializeAccount2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount2Instruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccount2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT3_DISCRIMINATOR = 18;\n\nexport function getInitializeAccount3DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT3_DISCRIMINATOR);\n}\n\nexport type InitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount3InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount3InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount3InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT3_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount3InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount3InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount3InstructionDataArgs,\n InitializeAccount3InstructionData\n> {\n return combineCodec(\n getInitializeAccount3InstructionDataEncoder(),\n getInitializeAccount3InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount3Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n owner: InitializeAccount3InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount3Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount3Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account), getAccountMeta(accounts.mint)],\n data: getInitializeAccount3InstructionDataEncoder().encode(\n args as InitializeAccount3InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n };\n data: InitializeAccount3InstructionData;\n};\n\nexport function parseInitializeAccount3Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount3Instruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount(), mint: getNextAccount() },\n data: getInitializeAccount3InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getInitializeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 0;\n\nexport function getInitializeConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type InitializeConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeConfidentialTransferFeeInstructionData = {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n /** Optional authority to set the withdraw withheld authority ElGamal key */\n authority: Option
;\n /** Withheld fees from accounts must be encrypted with this ElGamal key */\n withdrawWithheldAuthorityElGamalPubkey: Option
;\n};\n\nexport type InitializeConfidentialTransferFeeInstructionDataArgs = {\n /** Optional authority to set the withdraw withheld authority ElGamal key */\n authority: OptionOrNullable
;\n /** Withheld fees from accounts must be encrypted with this ElGamal key */\n withdrawWithheldAuthorityElGamalPubkey: OptionOrNullable
;\n};\n\nexport function getInitializeConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'withdrawWithheldAuthorityElGamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'withdrawWithheldAuthorityElGamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n InitializeConfidentialTransferFeeInstructionDataArgs,\n InitializeConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getInitializeConfidentialTransferFeeInstructionDataEncoder(),\n getInitializeConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type InitializeConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n> = {\n /** The SPL Token mint. */\n mint: Address;\n authority: InitializeConfidentialTransferFeeInstructionDataArgs['authority'];\n withdrawWithheldAuthorityElGamalPubkey: InitializeConfidentialTransferFeeInstructionDataArgs['withdrawWithheldAuthorityElGamalPubkey'];\n};\n\nexport function getInitializeConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeConfidentialTransferFeeInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeConfidentialTransferFeeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeConfidentialTransferFeeInstructionDataEncoder().encode(\n args as InitializeConfidentialTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as InitializeConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token mint. */\n mint: TAccountMetas[0];\n };\n data: InitializeConfidentialTransferFeeInstructionData;\n};\n\nexport function parseInitializeConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeConfidentialTransferFeeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR = 27;\n\nexport function getInitializeConfidentialTransferMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR\n );\n}\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 0;\n\nexport function getInitializeConfidentialTransferMintConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type InitializeConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeConfidentialTransferMintInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts.\n */\n authority: Option
;\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: Option
;\n};\n\nexport type InitializeConfidentialTransferMintInstructionDataArgs = {\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts.\n */\n authority: OptionOrNullable
;\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: OptionOrNullable
;\n};\n\nexport function getInitializeConfidentialTransferMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanEncoder()],\n [\n 'auditorElgamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeConfidentialTransferMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanDecoder()],\n [\n 'auditorElgamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeConfidentialTransferMintInstructionDataCodec(): FixedSizeCodec<\n InitializeConfidentialTransferMintInstructionDataArgs,\n InitializeConfidentialTransferMintInstructionData\n> {\n return combineCodec(\n getInitializeConfidentialTransferMintInstructionDataEncoder(),\n getInitializeConfidentialTransferMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeConfidentialTransferMintInput<\n TAccountMint extends string = string,\n> = {\n /** The SPL Token mint. */\n mint: Address;\n authority: InitializeConfidentialTransferMintInstructionDataArgs['authority'];\n autoApproveNewAccounts: InitializeConfidentialTransferMintInstructionDataArgs['autoApproveNewAccounts'];\n auditorElgamalPubkey: InitializeConfidentialTransferMintInstructionDataArgs['auditorElgamalPubkey'];\n};\n\nexport function getInitializeConfidentialTransferMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeConfidentialTransferMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeConfidentialTransferMintInstructionDataEncoder().encode(\n args as InitializeConfidentialTransferMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token mint. */\n mint: TAccountMetas[0];\n };\n data: InitializeConfidentialTransferMintInstructionData;\n};\n\nexport function parseInitializeConfidentialTransferMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeConfidentialTransferMintInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeConfidentialTransferMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n type AccountState,\n type AccountStateArgs,\n} from '../types';\n\nexport const INITIALIZE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 28;\n\nexport function getInitializeDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 0;\n\nexport function getInitializeDefaultAccountStateDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR\n );\n}\n\nexport type InitializeDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeDefaultAccountStateInstructionData = {\n discriminator: number;\n defaultAccountStateDiscriminator: number;\n /** The state each new token account should start with. */\n state: AccountState;\n};\n\nexport type InitializeDefaultAccountStateInstructionDataArgs = {\n /** The state each new token account should start with. */\n state: AccountStateArgs;\n};\n\nexport function getInitializeDefaultAccountStateInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['defaultAccountStateDiscriminator', getU8Encoder()],\n ['state', getAccountStateEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n defaultAccountStateDiscriminator:\n INITIALIZE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeDefaultAccountStateInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['defaultAccountStateDiscriminator', getU8Decoder()],\n ['state', getAccountStateDecoder()],\n ]);\n}\n\nexport function getInitializeDefaultAccountStateInstructionDataCodec(): FixedSizeCodec<\n InitializeDefaultAccountStateInstructionDataArgs,\n InitializeDefaultAccountStateInstructionData\n> {\n return combineCodec(\n getInitializeDefaultAccountStateInstructionDataEncoder(),\n getInitializeDefaultAccountStateInstructionDataDecoder()\n );\n}\n\nexport type InitializeDefaultAccountStateInput<\n TAccountMint extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n state: InitializeDefaultAccountStateInstructionDataArgs['state'];\n};\n\nexport function getInitializeDefaultAccountStateInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeDefaultAccountStateInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeDefaultAccountStateInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeDefaultAccountStateInstructionDataEncoder().encode(\n args as InitializeDefaultAccountStateInstructionDataArgs\n ),\n programAddress,\n } as InitializeDefaultAccountStateInstruction);\n}\n\nexport type ParsedInitializeDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n };\n data: InitializeDefaultAccountStateInstructionData;\n};\n\nexport function parseInitializeDefaultAccountStateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeDefaultAccountStateInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeDefaultAccountStateInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_GROUP_MEMBER_POINTER_DISCRIMINATOR = 41;\n\nexport function getInitializeGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_GROUP_MEMBER_POINTER_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR = 0;\n\nexport function getInitializeGroupMemberPointerGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR\n );\n}\n\nexport type InitializeGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeGroupMemberPointerInstructionData = {\n discriminator: number;\n groupMemberPointerDiscriminator: number;\n /** The public key for the account that can update the group member address. */\n authority: Option
;\n /** The account address that holds the member. */\n memberAddress: Option
;\n};\n\nexport type InitializeGroupMemberPointerInstructionDataArgs = {\n /** The public key for the account that can update the group member address. */\n authority: OptionOrNullable
;\n /** The account address that holds the member. */\n memberAddress: OptionOrNullable
;\n};\n\nexport function getInitializeGroupMemberPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupMemberPointerDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n groupMemberPointerDiscriminator:\n INITIALIZE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeGroupMemberPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupMemberPointerDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeGroupMemberPointerInstructionDataCodec(): FixedSizeCodec<\n InitializeGroupMemberPointerInstructionDataArgs,\n InitializeGroupMemberPointerInstructionData\n> {\n return combineCodec(\n getInitializeGroupMemberPointerInstructionDataEncoder(),\n getInitializeGroupMemberPointerInstructionDataDecoder()\n );\n}\n\nexport type InitializeGroupMemberPointerInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeGroupMemberPointerInstructionDataArgs['authority'];\n memberAddress: InitializeGroupMemberPointerInstructionDataArgs['memberAddress'];\n};\n\nexport function getInitializeGroupMemberPointerInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeGroupMemberPointerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeGroupMemberPointerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeGroupMemberPointerInstructionDataEncoder().encode(\n args as InitializeGroupMemberPointerInstructionDataArgs\n ),\n programAddress,\n } as InitializeGroupMemberPointerInstruction);\n}\n\nexport type ParsedInitializeGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeGroupMemberPointerInstructionData;\n};\n\nexport function parseInitializeGroupMemberPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeGroupMemberPointerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeGroupMemberPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_GROUP_POINTER_DISCRIMINATOR = 40;\n\nexport function getInitializeGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_GROUP_POINTER_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR = 0;\n\nexport function getInitializeGroupPointerGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR\n );\n}\n\nexport type InitializeGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeGroupPointerInstructionData = {\n discriminator: number;\n groupPointerDiscriminator: number;\n /** The public key for the account that can update the group address. */\n authority: Option
;\n /** The account address that holds the group. */\n groupAddress: Option
;\n};\n\nexport type InitializeGroupPointerInstructionDataArgs = {\n /** The public key for the account that can update the group address. */\n authority: OptionOrNullable
;\n /** The account address that holds the group. */\n groupAddress: OptionOrNullable
;\n};\n\nexport function getInitializeGroupPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupPointerDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_GROUP_POINTER_DISCRIMINATOR,\n groupPointerDiscriminator:\n INITIALIZE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeGroupPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupPointerDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeGroupPointerInstructionDataCodec(): FixedSizeCodec<\n InitializeGroupPointerInstructionDataArgs,\n InitializeGroupPointerInstructionData\n> {\n return combineCodec(\n getInitializeGroupPointerInstructionDataEncoder(),\n getInitializeGroupPointerInstructionDataDecoder()\n );\n}\n\nexport type InitializeGroupPointerInput =\n {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeGroupPointerInstructionDataArgs['authority'];\n groupAddress: InitializeGroupPointerInstructionDataArgs['groupAddress'];\n };\n\nexport function getInitializeGroupPointerInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeGroupPointerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeGroupPointerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeGroupPointerInstructionDataEncoder().encode(\n args as InitializeGroupPointerInstructionDataArgs\n ),\n programAddress,\n } as InitializeGroupPointerInstruction);\n}\n\nexport type ParsedInitializeGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeGroupPointerInstructionData;\n};\n\nexport function parseInitializeGroupPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeGroupPointerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeGroupPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR = 22;\n\nexport function getInitializeImmutableOwnerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR);\n}\n\nexport type InitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeImmutableOwnerInstructionData = { discriminator: number };\n\nexport type InitializeImmutableOwnerInstructionDataArgs = {};\n\nexport function getInitializeImmutableOwnerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeImmutableOwnerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeImmutableOwnerInstructionDataCodec(): FixedSizeCodec<\n InitializeImmutableOwnerInstructionDataArgs,\n InitializeImmutableOwnerInstructionData\n> {\n return combineCodec(\n getInitializeImmutableOwnerInstructionDataEncoder(),\n getInitializeImmutableOwnerInstructionDataDecoder()\n );\n}\n\nexport type InitializeImmutableOwnerInput<\n TAccountAccount extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n};\n\nexport function getInitializeImmutableOwnerInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeImmutableOwnerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeImmutableOwnerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getInitializeImmutableOwnerInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeImmutableOwnerInstruction);\n}\n\nexport type ParsedInitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n };\n data: InitializeImmutableOwnerInstructionData;\n};\n\nexport function parseInitializeImmutableOwnerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeImmutableOwnerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getInitializeImmutableOwnerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getI16Decoder,\n getI16Encoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_INTEREST_BEARING_MINT_DISCRIMINATOR = 33;\n\nexport function getInitializeInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_INTEREST_BEARING_MINT_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeInterestBearingMintInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR\n );\n}\n\nexport type InitializeInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeInterestBearingMintInstructionData = {\n discriminator: number;\n interestBearingMintDiscriminator: number;\n /** The public key for the account that can update the rate */\n rateAuthority: Option
;\n /** The initial interest rate */\n rate: number;\n};\n\nexport type InitializeInterestBearingMintInstructionDataArgs = {\n /** The public key for the account that can update the rate */\n rateAuthority: OptionOrNullable
;\n /** The initial interest rate */\n rate: number;\n};\n\nexport function getInitializeInterestBearingMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['interestBearingMintDiscriminator', getU8Encoder()],\n [\n 'rateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['rate', getI16Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_INTEREST_BEARING_MINT_DISCRIMINATOR,\n interestBearingMintDiscriminator:\n INITIALIZE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeInterestBearingMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['interestBearingMintDiscriminator', getU8Decoder()],\n [\n 'rateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['rate', getI16Decoder()],\n ]);\n}\n\nexport function getInitializeInterestBearingMintInstructionDataCodec(): FixedSizeCodec<\n InitializeInterestBearingMintInstructionDataArgs,\n InitializeInterestBearingMintInstructionData\n> {\n return combineCodec(\n getInitializeInterestBearingMintInstructionDataEncoder(),\n getInitializeInterestBearingMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeInterestBearingMintInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n rateAuthority: InitializeInterestBearingMintInstructionDataArgs['rateAuthority'];\n rate: InitializeInterestBearingMintInstructionDataArgs['rate'];\n};\n\nexport function getInitializeInterestBearingMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeInterestBearingMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeInterestBearingMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeInterestBearingMintInstructionDataEncoder().encode(\n args as InitializeInterestBearingMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeInterestBearingMintInstruction);\n}\n\nexport type ParsedInitializeInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeInterestBearingMintInstructionData;\n};\n\nexport function parseInitializeInterestBearingMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeInterestBearingMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeInterestBearingMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_METADATA_POINTER_DISCRIMINATOR = 39;\n\nexport function getInitializeMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_METADATA_POINTER_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR = 0;\n\nexport function getInitializeMetadataPointerMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR\n );\n}\n\nexport type InitializeMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMetadataPointerInstructionData = {\n discriminator: number;\n metadataPointerDiscriminator: number;\n /** The public key for the account that can update the metadata address. */\n authority: Option
;\n /** The account address that holds the metadata. */\n metadataAddress: Option
;\n};\n\nexport type InitializeMetadataPointerInstructionDataArgs = {\n /** The public key for the account that can update the metadata address. */\n authority: OptionOrNullable
;\n /** The account address that holds the metadata. */\n metadataAddress: OptionOrNullable
;\n};\n\nexport function getInitializeMetadataPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['metadataPointerDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_METADATA_POINTER_DISCRIMINATOR,\n metadataPointerDiscriminator:\n INITIALIZE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeMetadataPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['metadataPointerDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeMetadataPointerInstructionDataCodec(): FixedSizeCodec<\n InitializeMetadataPointerInstructionDataArgs,\n InitializeMetadataPointerInstructionData\n> {\n return combineCodec(\n getInitializeMetadataPointerInstructionDataEncoder(),\n getInitializeMetadataPointerInstructionDataDecoder()\n );\n}\n\nexport type InitializeMetadataPointerInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeMetadataPointerInstructionDataArgs['authority'];\n metadataAddress: InitializeMetadataPointerInstructionDataArgs['metadataAddress'];\n};\n\nexport function getInitializeMetadataPointerInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMetadataPointerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMetadataPointerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMetadataPointerInstructionDataEncoder().encode(\n args as InitializeMetadataPointerInstructionDataArgs\n ),\n programAddress,\n } as InitializeMetadataPointerInstruction);\n}\n\nexport type ParsedInitializeMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMetadataPointerInstructionData;\n};\n\nexport function parseInitializeMetadataPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMetadataPointerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMetadataPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT_DISCRIMINATOR);\n}\n\nexport type InitializeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMintInstructionData = {\n discriminator: number;\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMintInstructionDataArgs = {\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMintInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMintInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMintInstructionDataCodec(): Codec<\n InitializeMintInstructionDataArgs,\n InitializeMintInstructionData\n> {\n return combineCodec(\n getInitializeMintInstructionDataEncoder(),\n getInitializeMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeMintInput<\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** Token mint account. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n decimals: InitializeMintInstructionDataArgs['decimals'];\n mintAuthority: InitializeMintInstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMintInstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMintInstruction<\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), getAccountMeta(accounts.rent)],\n data: getInitializeMintInstructionDataEncoder().encode(\n args as InitializeMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeMintInstruction);\n}\n\nexport type ParsedInitializeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Token mint account. */\n mint: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMintInstructionData;\n};\n\nexport function parseInitializeMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMintInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT2_DISCRIMINATOR = 20;\n\nexport function getInitializeMint2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT2_DISCRIMINATOR);\n}\n\nexport type InitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMint2InstructionData = {\n discriminator: number;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMint2InstructionDataArgs = {\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMint2InstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT2_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMint2InstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMint2InstructionDataCodec(): Codec<\n InitializeMint2InstructionDataArgs,\n InitializeMint2InstructionData\n> {\n return combineCodec(\n getInitializeMint2InstructionDataEncoder(),\n getInitializeMint2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMint2Input = {\n /** The mint to initialize. */\n mint: Address;\n decimals: InitializeMint2InstructionDataArgs['decimals'];\n mintAuthority: InitializeMint2InstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMint2InstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMint2Instruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMint2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMint2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMint2InstructionDataEncoder().encode(\n args as InitializeMint2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMint2Instruction);\n}\n\nexport type ParsedInitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMint2InstructionData;\n};\n\nexport function parseInitializeMint2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMint2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMint2InstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT_CLOSE_AUTHORITY_DISCRIMINATOR = 25;\n\nexport function getInitializeMintCloseAuthorityDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT_CLOSE_AUTHORITY_DISCRIMINATOR);\n}\n\nexport type InitializeMintCloseAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMintCloseAuthorityInstructionData = {\n discriminator: number;\n /** Authority that must sign the `CloseAccount` instruction on a mint. */\n closeAuthority: Option
;\n};\n\nexport type InitializeMintCloseAuthorityInstructionDataArgs = {\n /** Authority that must sign the `CloseAccount` instruction on a mint. */\n closeAuthority: OptionOrNullable
;\n};\n\nexport function getInitializeMintCloseAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['closeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT_CLOSE_AUTHORITY_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeMintCloseAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['closeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMintCloseAuthorityInstructionDataCodec(): Codec<\n InitializeMintCloseAuthorityInstructionDataArgs,\n InitializeMintCloseAuthorityInstructionData\n> {\n return combineCodec(\n getInitializeMintCloseAuthorityInstructionDataEncoder(),\n getInitializeMintCloseAuthorityInstructionDataDecoder()\n );\n}\n\nexport type InitializeMintCloseAuthorityInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n closeAuthority: InitializeMintCloseAuthorityInstructionDataArgs['closeAuthority'];\n};\n\nexport function getInitializeMintCloseAuthorityInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMintCloseAuthorityInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMintCloseAuthorityInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMintCloseAuthorityInstructionDataEncoder().encode(\n args as InitializeMintCloseAuthorityInstructionDataArgs\n ),\n programAddress,\n } as InitializeMintCloseAuthorityInstruction);\n}\n\nexport type ParsedInitializeMintCloseAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMintCloseAuthorityInstructionData;\n};\n\nexport function parseInitializeMintCloseAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMintCloseAuthorityInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMintCloseAuthorityInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG_DISCRIMINATOR = 2;\n\nexport function getInitializeMultisigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG_DISCRIMINATOR);\n}\n\nexport type InitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisigInstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisigInstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisigInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisigInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisigInstructionDataCodec(): FixedSizeCodec<\n InitializeMultisigInstructionDataArgs,\n InitializeMultisigInstructionData\n> {\n return combineCodec(\n getInitializeMultisigInstructionDataEncoder(),\n getInitializeMultisigInstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisigInput<\n TAccountMultisig extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The multisignature account to initialize. */\n multisig: Address;\n /** Rent sysvar. */\n rent?: Address;\n m: InitializeMultisigInstructionDataArgs['m'];\n signers: Array
;\n};\n\nexport function getInitializeMultisigInstruction<\n TAccountMultisig extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.multisig),\n getAccountMeta(accounts.rent),\n ...remainingAccounts,\n ],\n data: getInitializeMultisigInstructionDataEncoder().encode(\n args as InitializeMultisigInstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMultisigInstructionData;\n};\n\nexport function parseInitializeMultisigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisigInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMultisigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG2_DISCRIMINATOR = 19;\n\nexport function getInitializeMultisig2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG2_DISCRIMINATOR);\n}\n\nexport type InitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisig2InstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisig2InstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisig2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisig2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisig2InstructionDataCodec(): FixedSizeCodec<\n InitializeMultisig2InstructionDataArgs,\n InitializeMultisig2InstructionData\n> {\n return combineCodec(\n getInitializeMultisig2InstructionDataEncoder(),\n getInitializeMultisig2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisig2Input =\n {\n /** The multisignature account to initialize. */\n multisig: Address;\n m: InitializeMultisig2InstructionDataArgs['m'];\n signers: Array
;\n };\n\nexport function getInitializeMultisig2Instruction<\n TAccountMultisig extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisig2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisig2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.multisig), ...remainingAccounts],\n data: getInitializeMultisig2InstructionDataEncoder().encode(\n args as InitializeMultisig2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisig2Instruction);\n}\n\nexport type ParsedInitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n };\n data: InitializeMultisig2InstructionData;\n};\n\nexport function parseInitializeMultisig2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisig2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount() },\n data: getInitializeMultisig2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_NON_TRANSFERABLE_MINT_DISCRIMINATOR = 32;\n\nexport function getInitializeNonTransferableMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_NON_TRANSFERABLE_MINT_DISCRIMINATOR);\n}\n\nexport type InitializeNonTransferableMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeNonTransferableMintInstructionData = {\n discriminator: number;\n};\n\nexport type InitializeNonTransferableMintInstructionDataArgs = {};\n\nexport function getInitializeNonTransferableMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_NON_TRANSFERABLE_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeNonTransferableMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeNonTransferableMintInstructionDataCodec(): FixedSizeCodec<\n InitializeNonTransferableMintInstructionDataArgs,\n InitializeNonTransferableMintInstructionData\n> {\n return combineCodec(\n getInitializeNonTransferableMintInstructionDataEncoder(),\n getInitializeNonTransferableMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeNonTransferableMintInput<\n TAccountMint extends string = string,\n> = {\n /** The mint account to initialize. */\n mint: Address;\n};\n\nexport function getInitializeNonTransferableMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeNonTransferableMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeNonTransferableMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeNonTransferableMintInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeNonTransferableMintInstruction);\n}\n\nexport type ParsedInitializeNonTransferableMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint account to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeNonTransferableMintInstructionData;\n};\n\nexport function parseInitializeNonTransferableMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeNonTransferableMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeNonTransferableMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_PAUSABLE_CONFIG_DISCRIMINATOR = 44;\n\nexport function getInitializePausableConfigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_PAUSABLE_CONFIG_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_PAUSABLE_CONFIG_PAUSABLE_DISCRIMINATOR = 0;\n\nexport function getInitializePausableConfigPausableDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_PAUSABLE_CONFIG_PAUSABLE_DISCRIMINATOR\n );\n}\n\nexport type InitializePausableConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializePausableConfigInstructionData = {\n discriminator: number;\n pausableDiscriminator: number;\n /** The authority that can pause and resume the mint. */\n authority: Option
;\n};\n\nexport type InitializePausableConfigInstructionDataArgs = {\n /** The authority that can pause and resume the mint. */\n authority: OptionOrNullable
;\n};\n\nexport function getInitializePausableConfigInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['pausableDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_PAUSABLE_CONFIG_DISCRIMINATOR,\n pausableDiscriminator: INITIALIZE_PAUSABLE_CONFIG_PAUSABLE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializePausableConfigInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['pausableDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializePausableConfigInstructionDataCodec(): FixedSizeCodec<\n InitializePausableConfigInstructionDataArgs,\n InitializePausableConfigInstructionData\n> {\n return combineCodec(\n getInitializePausableConfigInstructionDataEncoder(),\n getInitializePausableConfigInstructionDataDecoder()\n );\n}\n\nexport type InitializePausableConfigInput<\n TAccountMint extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n authority: InitializePausableConfigInstructionDataArgs['authority'];\n};\n\nexport function getInitializePausableConfigInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializePausableConfigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializePausableConfigInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializePausableConfigInstructionDataEncoder().encode(\n args as InitializePausableConfigInstructionDataArgs\n ),\n programAddress,\n } as InitializePausableConfigInstruction);\n}\n\nexport type ParsedInitializePausableConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n };\n data: InitializePausableConfigInstructionData;\n};\n\nexport function parseInitializePausableConfigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializePausableConfigInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializePausableConfigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_PERMANENT_DELEGATE_DISCRIMINATOR = 35;\n\nexport function getInitializePermanentDelegateDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_PERMANENT_DELEGATE_DISCRIMINATOR);\n}\n\nexport type InitializePermanentDelegateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializePermanentDelegateInstructionData = {\n discriminator: number;\n /** Authority that may sign for `Transfer`s and `Burn`s on any account */\n delegate: Address;\n};\n\nexport type InitializePermanentDelegateInstructionDataArgs = {\n /** Authority that may sign for `Transfer`s and `Burn`s on any account */\n delegate: Address;\n};\n\nexport function getInitializePermanentDelegateInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['delegate', getAddressEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_PERMANENT_DELEGATE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializePermanentDelegateInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['delegate', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializePermanentDelegateInstructionDataCodec(): FixedSizeCodec<\n InitializePermanentDelegateInstructionDataArgs,\n InitializePermanentDelegateInstructionData\n> {\n return combineCodec(\n getInitializePermanentDelegateInstructionDataEncoder(),\n getInitializePermanentDelegateInstructionDataDecoder()\n );\n}\n\nexport type InitializePermanentDelegateInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n delegate: InitializePermanentDelegateInstructionDataArgs['delegate'];\n};\n\nexport function getInitializePermanentDelegateInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializePermanentDelegateInput,\n config?: { programAddress?: TProgramAddress }\n): InitializePermanentDelegateInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializePermanentDelegateInstructionDataEncoder().encode(\n args as InitializePermanentDelegateInstructionDataArgs\n ),\n programAddress,\n } as InitializePermanentDelegateInstruction);\n}\n\nexport type ParsedInitializePermanentDelegateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializePermanentDelegateInstructionData;\n};\n\nexport function parseInitializePermanentDelegateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializePermanentDelegateInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializePermanentDelegateInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getF64Decoder,\n getF64Encoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR = 43;\n\nexport function getInitializeScaledUiAmountMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_SCALED_UI_AMOUNT_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeScaledUiAmountMintScaledUiAmountMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_SCALED_UI_AMOUNT_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR\n );\n}\n\nexport type InitializeScaledUiAmountMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeScaledUiAmountMintInstructionData = {\n discriminator: number;\n scaledUiAmountMintDiscriminator: number;\n /** The authority that can update the multiplier */\n authority: Option
;\n /** The initial multiplier for the scaled UI extension */\n multiplier: number;\n};\n\nexport type InitializeScaledUiAmountMintInstructionDataArgs = {\n /** The authority that can update the multiplier */\n authority: OptionOrNullable
;\n /** The initial multiplier for the scaled UI extension */\n multiplier: number;\n};\n\nexport function getInitializeScaledUiAmountMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['scaledUiAmountMintDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['multiplier', getF64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR,\n scaledUiAmountMintDiscriminator:\n INITIALIZE_SCALED_UI_AMOUNT_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeScaledUiAmountMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['scaledUiAmountMintDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['multiplier', getF64Decoder()],\n ]);\n}\n\nexport function getInitializeScaledUiAmountMintInstructionDataCodec(): FixedSizeCodec<\n InitializeScaledUiAmountMintInstructionDataArgs,\n InitializeScaledUiAmountMintInstructionData\n> {\n return combineCodec(\n getInitializeScaledUiAmountMintInstructionDataEncoder(),\n getInitializeScaledUiAmountMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeScaledUiAmountMintInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeScaledUiAmountMintInstructionDataArgs['authority'];\n multiplier: InitializeScaledUiAmountMintInstructionDataArgs['multiplier'];\n};\n\nexport function getInitializeScaledUiAmountMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeScaledUiAmountMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeScaledUiAmountMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeScaledUiAmountMintInstructionDataEncoder().encode(\n args as InitializeScaledUiAmountMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeScaledUiAmountMintInstruction);\n}\n\nexport type ParsedInitializeScaledUiAmountMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeScaledUiAmountMintInstructionData;\n};\n\nexport function parseInitializeScaledUiAmountMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeScaledUiAmountMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeScaledUiAmountMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TOKEN_GROUP_DISCRIMINATOR = new Uint8Array([\n 121, 113, 108, 39, 54, 51, 0, 4,\n]);\n\nexport function getInitializeTokenGroupDiscriminatorBytes() {\n return getBytesEncoder().encode(INITIALIZE_TOKEN_GROUP_DISCRIMINATOR);\n}\n\nexport type InitializeTokenGroupInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountGroup extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountMintAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTokenGroupInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Update authority for the group */\n updateAuthority: Option
;\n /** The maximum number of group members */\n maxSize: bigint;\n};\n\nexport type InitializeTokenGroupInstructionDataArgs = {\n /** Update authority for the group */\n updateAuthority: OptionOrNullable
;\n /** The maximum number of group members */\n maxSize: number | bigint;\n};\n\nexport function getInitializeTokenGroupInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n [\n 'updateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['maxSize', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TOKEN_GROUP_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTokenGroupInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n [\n 'updateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['maxSize', getU64Decoder()],\n ]);\n}\n\nexport function getInitializeTokenGroupInstructionDataCodec(): Codec<\n InitializeTokenGroupInstructionDataArgs,\n InitializeTokenGroupInstructionData\n> {\n return combineCodec(\n getInitializeTokenGroupInstructionDataEncoder(),\n getInitializeTokenGroupInstructionDataDecoder()\n );\n}\n\nexport type InitializeTokenGroupInput<\n TAccountGroup extends string = string,\n TAccountMint extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n group: Address;\n mint: Address;\n mintAuthority: TransactionSigner;\n updateAuthority: InitializeTokenGroupInstructionDataArgs['updateAuthority'];\n maxSize: InitializeTokenGroupInstructionDataArgs['maxSize'];\n};\n\nexport function getInitializeTokenGroupInstruction<\n TAccountGroup extends string,\n TAccountMint extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTokenGroupInput<\n TAccountGroup,\n TAccountMint,\n TAccountMintAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeTokenGroupInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountMint,\n TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n group: { value: input.group ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.mintAuthority),\n ],\n data: getInitializeTokenGroupInstructionDataEncoder().encode(\n args as InitializeTokenGroupInstructionDataArgs\n ),\n programAddress,\n } as InitializeTokenGroupInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountMint,\n TAccountMintAuthority\n >);\n}\n\nexport type ParsedInitializeTokenGroupInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n group: TAccountMetas[0];\n mint: TAccountMetas[1];\n mintAuthority: TAccountMetas[2];\n };\n data: InitializeTokenGroupInstructionData;\n};\n\nexport function parseInitializeTokenGroupInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTokenGroupInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n group: getNextAccount(),\n mint: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getInitializeTokenGroupInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR = new Uint8Array([\n 152, 32, 222, 176, 223, 237, 116, 134,\n]);\n\nexport function getInitializeTokenGroupMemberDiscriminatorBytes() {\n return getBytesEncoder().encode(INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR);\n}\n\nexport type InitializeTokenGroupMemberInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMember extends string | AccountMeta = string,\n TAccountMemberMint extends string | AccountMeta = string,\n TAccountMemberMintAuthority extends string | AccountMeta = string,\n TAccountGroup extends string | AccountMeta = string,\n TAccountGroupUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMember extends string\n ? WritableAccount\n : TAccountMember,\n TAccountMemberMint extends string\n ? ReadonlyAccount\n : TAccountMemberMint,\n TAccountMemberMintAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMemberMintAuthority,\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountGroupUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTokenGroupMemberInstructionData = {\n discriminator: ReadonlyUint8Array;\n};\n\nexport type InitializeTokenGroupMemberInstructionDataArgs = {};\n\nexport function getInitializeTokenGroupMemberInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getBytesEncoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTokenGroupMemberInstructionDataDecoder(): Decoder {\n return getStructDecoder([['discriminator', getBytesDecoder()]]);\n}\n\nexport function getInitializeTokenGroupMemberInstructionDataCodec(): Codec<\n InitializeTokenGroupMemberInstructionDataArgs,\n InitializeTokenGroupMemberInstructionData\n> {\n return combineCodec(\n getInitializeTokenGroupMemberInstructionDataEncoder(),\n getInitializeTokenGroupMemberInstructionDataDecoder()\n );\n}\n\nexport type InitializeTokenGroupMemberInput<\n TAccountMember extends string = string,\n TAccountMemberMint extends string = string,\n TAccountMemberMintAuthority extends string = string,\n TAccountGroup extends string = string,\n TAccountGroupUpdateAuthority extends string = string,\n> = {\n member: Address;\n memberMint: Address;\n memberMintAuthority: TransactionSigner;\n group: Address;\n groupUpdateAuthority: TransactionSigner;\n};\n\nexport function getInitializeTokenGroupMemberInstruction<\n TAccountMember extends string,\n TAccountMemberMint extends string,\n TAccountMemberMintAuthority extends string,\n TAccountGroup extends string,\n TAccountGroupUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTokenGroupMemberInput<\n TAccountMember,\n TAccountMemberMint,\n TAccountMemberMintAuthority,\n TAccountGroup,\n TAccountGroupUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeTokenGroupMemberInstruction<\n TProgramAddress,\n TAccountMember,\n TAccountMemberMint,\n TAccountMemberMintAuthority,\n TAccountGroup,\n TAccountGroupUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n member: { value: input.member ?? null, isWritable: true },\n memberMint: { value: input.memberMint ?? null, isWritable: false },\n memberMintAuthority: {\n value: input.memberMintAuthority ?? null,\n isWritable: false,\n },\n group: { value: input.group ?? null, isWritable: true },\n groupUpdateAuthority: {\n value: input.groupUpdateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.member),\n getAccountMeta(accounts.memberMint),\n getAccountMeta(accounts.memberMintAuthority),\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.groupUpdateAuthority),\n ],\n data: getInitializeTokenGroupMemberInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeTokenGroupMemberInstruction<\n TProgramAddress,\n TAccountMember,\n TAccountMemberMint,\n TAccountMemberMintAuthority,\n TAccountGroup,\n TAccountGroupUpdateAuthority\n >);\n}\n\nexport type ParsedInitializeTokenGroupMemberInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n member: TAccountMetas[0];\n memberMint: TAccountMetas[1];\n memberMintAuthority: TAccountMetas[2];\n group: TAccountMetas[3];\n groupUpdateAuthority: TAccountMetas[4];\n };\n data: InitializeTokenGroupMemberInstructionData;\n};\n\nexport function parseInitializeTokenGroupMemberInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTokenGroupMemberInstruction {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n member: getNextAccount(),\n memberMint: getNextAccount(),\n memberMintAuthority: getNextAccount(),\n group: getNextAccount(),\n groupUpdateAuthority: getNextAccount(),\n },\n data: getInitializeTokenGroupMemberInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([\n 210, 225, 30, 162, 88, 184, 77, 141,\n]);\n\nexport function getInitializeTokenMetadataDiscriminatorBytes() {\n return getBytesEncoder().encode(INITIALIZE_TOKEN_METADATA_DISCRIMINATOR);\n}\n\nexport type InitializeTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlyAccount\n : TAccountUpdateAuthority,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountMintAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTokenMetadataInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Longer name of the token. */\n name: string;\n /** Shortened symbol of the token. */\n symbol: string;\n /** URI pointing to more metadata (image, video, etc.). */\n uri: string;\n};\n\nexport type InitializeTokenMetadataInstructionDataArgs = {\n /** Longer name of the token. */\n name: string;\n /** Shortened symbol of the token. */\n symbol: string;\n /** URI pointing to more metadata (image, video, etc.). */\n uri: string;\n};\n\nexport function getInitializeTokenMetadataInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['symbol', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['uri', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TOKEN_METADATA_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTokenMetadataInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['symbol', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['uri', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getInitializeTokenMetadataInstructionDataCodec(): Codec<\n InitializeTokenMetadataInstructionDataArgs,\n InitializeTokenMetadataInstructionData\n> {\n return combineCodec(\n getInitializeTokenMetadataInstructionDataEncoder(),\n getInitializeTokenMetadataInstructionDataDecoder()\n );\n}\n\nexport type InitializeTokenMetadataInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n TAccountMint extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: Address;\n mint: Address;\n mintAuthority: TransactionSigner;\n name: InitializeTokenMetadataInstructionDataArgs['name'];\n symbol: InitializeTokenMetadataInstructionDataArgs['symbol'];\n uri: InitializeTokenMetadataInstructionDataArgs['uri'];\n};\n\nexport function getInitializeTokenMetadataInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TAccountMint extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTokenMetadataInput<\n TAccountMetadata,\n TAccountUpdateAuthority,\n TAccountMint,\n TAccountMintAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeTokenMetadataInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority,\n TAccountMint,\n TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n mint: { value: input.mint ?? null, isWritable: false },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.mintAuthority),\n ],\n data: getInitializeTokenMetadataInstructionDataEncoder().encode(\n args as InitializeTokenMetadataInstructionDataArgs\n ),\n programAddress,\n } as InitializeTokenMetadataInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority,\n TAccountMint,\n TAccountMintAuthority\n >);\n}\n\nexport type ParsedInitializeTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n mint: TAccountMetas[2];\n mintAuthority: TAccountMetas[3];\n };\n data: InitializeTokenMetadataInstructionData;\n};\n\nexport function parseInitializeTokenMetadataInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTokenMetadataInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n metadata: getNextAccount(),\n updateAuthority: getNextAccount(),\n mint: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getInitializeTokenMetadataInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TRANSFER_FEE_CONFIG_DISCRIMINATOR = 26;\n\nexport function getInitializeTransferFeeConfigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_TRANSFER_FEE_CONFIG_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_TRANSFER_FEE_CONFIG_TRANSFER_FEE_DISCRIMINATOR = 0;\n\nexport function getInitializeTransferFeeConfigTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_TRANSFER_FEE_CONFIG_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type InitializeTransferFeeConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTransferFeeConfigInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** Pubkey that may update the fees. */\n transferFeeConfigAuthority: Option
;\n /** Withdraw instructions must be signed by this key. */\n withdrawWithheldAuthority: Option
;\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: bigint;\n};\n\nexport type InitializeTransferFeeConfigInstructionDataArgs = {\n /** Pubkey that may update the fees. */\n transferFeeConfigAuthority: OptionOrNullable
;\n /** Withdraw instructions must be signed by this key. */\n withdrawWithheldAuthority: OptionOrNullable
;\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: number | bigint;\n};\n\nexport function getInitializeTransferFeeConfigInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['transferFeeConfigAuthority', getOptionEncoder(getAddressEncoder())],\n ['withdrawWithheldAuthority', getOptionEncoder(getAddressEncoder())],\n ['transferFeeBasisPoints', getU16Encoder()],\n ['maximumFee', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TRANSFER_FEE_CONFIG_DISCRIMINATOR,\n transferFeeDiscriminator:\n INITIALIZE_TRANSFER_FEE_CONFIG_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTransferFeeConfigInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['transferFeeConfigAuthority', getOptionDecoder(getAddressDecoder())],\n ['withdrawWithheldAuthority', getOptionDecoder(getAddressDecoder())],\n ['transferFeeBasisPoints', getU16Decoder()],\n ['maximumFee', getU64Decoder()],\n ]);\n}\n\nexport function getInitializeTransferFeeConfigInstructionDataCodec(): Codec<\n InitializeTransferFeeConfigInstructionDataArgs,\n InitializeTransferFeeConfigInstructionData\n> {\n return combineCodec(\n getInitializeTransferFeeConfigInstructionDataEncoder(),\n getInitializeTransferFeeConfigInstructionDataDecoder()\n );\n}\n\nexport type InitializeTransferFeeConfigInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n transferFeeConfigAuthority: InitializeTransferFeeConfigInstructionDataArgs['transferFeeConfigAuthority'];\n withdrawWithheldAuthority: InitializeTransferFeeConfigInstructionDataArgs['withdrawWithheldAuthority'];\n transferFeeBasisPoints: InitializeTransferFeeConfigInstructionDataArgs['transferFeeBasisPoints'];\n maximumFee: InitializeTransferFeeConfigInstructionDataArgs['maximumFee'];\n};\n\nexport function getInitializeTransferFeeConfigInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTransferFeeConfigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeTransferFeeConfigInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeTransferFeeConfigInstructionDataEncoder().encode(\n args as InitializeTransferFeeConfigInstructionDataArgs\n ),\n programAddress,\n } as InitializeTransferFeeConfigInstruction);\n}\n\nexport type ParsedInitializeTransferFeeConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeTransferFeeConfigInstructionData;\n};\n\nexport function parseInitializeTransferFeeConfigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTransferFeeConfigInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeTransferFeeConfigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TRANSFER_HOOK_DISCRIMINATOR = 36;\n\nexport function getInitializeTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_TRANSFER_HOOK_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR = 0;\n\nexport function getInitializeTransferHookTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR\n );\n}\n\nexport type InitializeTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTransferHookInstructionData = {\n discriminator: number;\n transferHookDiscriminator: number;\n /** The public key for the account that can update the program id */\n authority: Option
;\n /** The program id that performs logic during transfers */\n programId: Option
;\n};\n\nexport type InitializeTransferHookInstructionDataArgs = {\n /** The public key for the account that can update the program id */\n authority: OptionOrNullable
;\n /** The program id that performs logic during transfers */\n programId: OptionOrNullable
;\n};\n\nexport function getInitializeTransferHookInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferHookDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'programId',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TRANSFER_HOOK_DISCRIMINATOR,\n transferHookDiscriminator:\n INITIALIZE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTransferHookInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferHookDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'programId',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeTransferHookInstructionDataCodec(): FixedSizeCodec<\n InitializeTransferHookInstructionDataArgs,\n InitializeTransferHookInstructionData\n> {\n return combineCodec(\n getInitializeTransferHookInstructionDataEncoder(),\n getInitializeTransferHookInstructionDataDecoder()\n );\n}\n\nexport type InitializeTransferHookInput =\n {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeTransferHookInstructionDataArgs['authority'];\n programId: InitializeTransferHookInstructionDataArgs['programId'];\n };\n\nexport function getInitializeTransferHookInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTransferHookInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeTransferHookInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeTransferHookInstructionDataEncoder().encode(\n args as InitializeTransferHookInstructionDataArgs\n ),\n programAddress,\n } as InitializeTransferHookInstruction);\n}\n\nexport type ParsedInitializeTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeTransferHookInstructionData;\n};\n\nexport function parseInitializeTransferHookInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTransferHookInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeTransferHookInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_DISCRIMINATOR = 7;\n\nexport function getMintToDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_DISCRIMINATOR);\n}\n\nexport type MintToInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n};\n\nexport type MintToInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n};\n\nexport function getMintToInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_DISCRIMINATOR })\n );\n}\n\nexport function getMintToInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getMintToInstructionDataCodec(): FixedSizeCodec<\n MintToInstructionDataArgs,\n MintToInstructionData\n> {\n return combineCodec(\n getMintToInstructionDataEncoder(),\n getMintToInstructionDataDecoder()\n );\n}\n\nexport type MintToInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint account. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getMintToInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: MintToInput,\n config?: { programAddress?: TProgramAddress }\n): MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToInstructionDataEncoder().encode(\n args as MintToInstructionDataArgs\n ),\n programAddress,\n } as MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint account. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToInstructionData;\n};\n\nexport function parseMintToInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_CHECKED_DISCRIMINATOR = 14;\n\nexport function getMintToCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_CHECKED_DISCRIMINATOR);\n}\n\nexport type MintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToCheckedInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type MintToCheckedInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getMintToCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getMintToCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getMintToCheckedInstructionDataCodec(): FixedSizeCodec<\n MintToCheckedInstructionDataArgs,\n MintToCheckedInstructionData\n> {\n return combineCodec(\n getMintToCheckedInstructionDataEncoder(),\n getMintToCheckedInstructionDataDecoder()\n );\n}\n\nexport type MintToCheckedInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToCheckedInstructionDataArgs['amount'];\n decimals: MintToCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getMintToCheckedInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: MintToCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToCheckedInstructionDataEncoder().encode(\n args as MintToCheckedInstructionDataArgs\n ),\n programAddress,\n } as MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToCheckedInstructionData;\n};\n\nexport function parseMintToCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const PAUSE_DISCRIMINATOR = 44;\n\nexport function getPauseDiscriminatorBytes() {\n return getU8Encoder().encode(PAUSE_DISCRIMINATOR);\n}\n\nexport const PAUSE_PAUSABLE_DISCRIMINATOR = 1;\n\nexport function getPausePausableDiscriminatorBytes() {\n return getU8Encoder().encode(PAUSE_PAUSABLE_DISCRIMINATOR);\n}\n\nexport type PauseInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type PauseInstructionData = {\n discriminator: number;\n pausableDiscriminator: number;\n};\n\nexport type PauseInstructionDataArgs = {};\n\nexport function getPauseInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['pausableDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: PAUSE_DISCRIMINATOR,\n pausableDiscriminator: PAUSE_PAUSABLE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getPauseInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['pausableDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getPauseInstructionDataCodec(): FixedSizeCodec<\n PauseInstructionDataArgs,\n PauseInstructionData\n> {\n return combineCodec(\n getPauseInstructionDataEncoder(),\n getPauseInstructionDataDecoder()\n );\n}\n\nexport type PauseInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The pausable authority that can pause the mint. */\n authority: Address | TransactionSigner;\n};\n\nexport function getPauseInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: PauseInput,\n config?: { programAddress?: TProgramAddress }\n): PauseInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getPauseInstructionDataEncoder().encode({}),\n programAddress,\n } as PauseInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedPauseInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The pausable authority that can pause the mint. */\n authority: TAccountMetas[1];\n };\n data: PauseInstructionData;\n};\n\nexport function parsePauseInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedPauseInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getPauseInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getArrayDecoder,\n getArrayEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getExtensionTypeDecoder,\n getExtensionTypeEncoder,\n type ExtensionType,\n type ExtensionTypeArgs,\n} from '../types';\n\nexport const REALLOCATE_DISCRIMINATOR = 29;\n\nexport function getReallocateDiscriminatorBytes() {\n return getU8Encoder().encode(REALLOCATE_DISCRIMINATOR);\n}\n\nexport type ReallocateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountPayer extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ReallocateInstructionData = {\n discriminator: number;\n /** New extension types to include in the reallocated account. */\n newExtensionTypes: Array;\n};\n\nexport type ReallocateInstructionDataArgs = {\n /** New extension types to include in the reallocated account. */\n newExtensionTypes: Array;\n};\n\nexport function getReallocateInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n [\n 'newExtensionTypes',\n getArrayEncoder(getExtensionTypeEncoder(), { size: 'remainder' }),\n ],\n ]),\n (value) => ({ ...value, discriminator: REALLOCATE_DISCRIMINATOR })\n );\n}\n\nexport function getReallocateInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n [\n 'newExtensionTypes',\n getArrayDecoder(getExtensionTypeDecoder(), { size: 'remainder' }),\n ],\n ]);\n}\n\nexport function getReallocateInstructionDataCodec(): Codec<\n ReallocateInstructionDataArgs,\n ReallocateInstructionData\n> {\n return combineCodec(\n getReallocateInstructionDataEncoder(),\n getReallocateInstructionDataDecoder()\n );\n}\n\nexport type ReallocateInput<\n TAccountToken extends string = string,\n TAccountPayer extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to reallocate. */\n token: Address;\n /** The payer account to fund reallocation. */\n payer: TransactionSigner;\n /** System program for reallocation funding. */\n systemProgram?: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n newExtensionTypes: ReallocateInstructionDataArgs['newExtensionTypes'];\n multiSigners?: Array;\n};\n\nexport function getReallocateInstruction<\n TAccountToken extends string,\n TAccountPayer extends string,\n TAccountSystemProgram extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ReallocateInput<\n TAccountToken,\n TAccountPayer,\n TAccountSystemProgram,\n TAccountOwner\n >,\n config?: { programAddress?: TProgramAddress }\n): ReallocateInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountPayer,\n TAccountSystemProgram,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n payer: { value: input.payer ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getReallocateInstructionDataEncoder().encode(\n args as ReallocateInstructionDataArgs\n ),\n programAddress,\n } as ReallocateInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountPayer,\n TAccountSystemProgram,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedReallocateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to reallocate. */\n token: TAccountMetas[0];\n /** The payer account to fund reallocation. */\n payer: TAccountMetas[1];\n /** System program for reallocation funding. */\n systemProgram: TAccountMetas[2];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[3];\n };\n data: ReallocateInstructionData;\n};\n\nexport function parseReallocateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedReallocateInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n payer: getNextAccount(),\n systemProgram: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getReallocateInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR = 2;\n\nexport function getRecoverNestedAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type RecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountNestedAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountNestedTokenMintAddress extends string | AccountMeta = string,\n TAccountDestinationAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerTokenMintAddress extends string | AccountMeta = string,\n TAccountWalletAddress extends string | AccountMeta = string,\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountNestedAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerTokenMintAddress,\n TAccountWalletAddress extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountWalletAddress,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RecoverNestedAssociatedTokenInstructionData = {\n discriminator: number;\n};\n\nexport type RecoverNestedAssociatedTokenInstructionDataArgs = {};\n\nexport function getRecoverNestedAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n RecoverNestedAssociatedTokenInstructionDataArgs,\n RecoverNestedAssociatedTokenInstructionData\n> {\n return combineCodec(\n getRecoverNestedAssociatedTokenInstructionDataEncoder(),\n getRecoverNestedAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress?: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress?: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress?: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getRecoverNestedAssociatedTokenInstructionAsync<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.ownerAssociatedAccountAddress.value) {\n accounts.ownerAssociatedAccountAddress.value = await findAssociatedTokenPda(\n {\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.ownerTokenMintAddress.value),\n }\n );\n }\n if (!accounts.nestedAssociatedAccountAddress.value) {\n accounts.nestedAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.ownerAssociatedAccountAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n if (!accounts.destinationAssociatedAccountAddress.value) {\n accounts.destinationAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getRecoverNestedAssociatedTokenInstruction<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedRecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: TAccountMetas[0];\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: TAccountMetas[1];\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: TAccountMetas[2];\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: TAccountMetas[3];\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: TAccountMetas[4];\n /** Wallet address for the owner associated token account. */\n walletAddress: TAccountMetas[5];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[6];\n };\n data: RecoverNestedAssociatedTokenInstructionData;\n};\n\nexport function parseRecoverNestedAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRecoverNestedAssociatedTokenInstruction {\n if (instruction.accounts.length < 7) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n nestedAssociatedAccountAddress: getNextAccount(),\n nestedTokenMintAddress: getNextAccount(),\n destinationAssociatedAccountAddress: getNextAccount(),\n ownerAssociatedAccountAddress: getNextAccount(),\n ownerTokenMintAddress: getNextAccount(),\n walletAddress: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getRecoverNestedAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR = new Uint8Array([\n 234, 18, 32, 56, 89, 141, 37, 181,\n]);\n\nexport function getRemoveTokenMetadataKeyDiscriminatorBytes() {\n return getBytesEncoder().encode(REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR);\n}\n\nexport type RemoveTokenMetadataKeyInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RemoveTokenMetadataKeyInstructionData = {\n discriminator: ReadonlyUint8Array;\n /**\n * If the idempotent flag is set to true, then the instruction will not\n * error if the key does not exist\n */\n idempotent: boolean;\n /** Key to remove in the additional metadata portion. */\n key: string;\n};\n\nexport type RemoveTokenMetadataKeyInstructionDataArgs = {\n /**\n * If the idempotent flag is set to true, then the instruction will not\n * error if the key does not exist\n */\n idempotent?: boolean;\n /** Key to remove in the additional metadata portion. */\n key: string;\n};\n\nexport function getRemoveTokenMetadataKeyInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['idempotent', getBooleanEncoder()],\n ['key', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR,\n idempotent: value.idempotent ?? false,\n })\n );\n}\n\nexport function getRemoveTokenMetadataKeyInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['idempotent', getBooleanDecoder()],\n ['key', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getRemoveTokenMetadataKeyInstructionDataCodec(): Codec<\n RemoveTokenMetadataKeyInstructionDataArgs,\n RemoveTokenMetadataKeyInstructionData\n> {\n return combineCodec(\n getRemoveTokenMetadataKeyInstructionDataEncoder(),\n getRemoveTokenMetadataKeyInstructionDataDecoder()\n );\n}\n\nexport type RemoveTokenMetadataKeyInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: TransactionSigner;\n idempotent?: RemoveTokenMetadataKeyInstructionDataArgs['idempotent'];\n key: RemoveTokenMetadataKeyInstructionDataArgs['key'];\n};\n\nexport function getRemoveTokenMetadataKeyInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: RemoveTokenMetadataKeyInput,\n config?: { programAddress?: TProgramAddress }\n): RemoveTokenMetadataKeyInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getRemoveTokenMetadataKeyInstructionDataEncoder().encode(\n args as RemoveTokenMetadataKeyInstructionDataArgs\n ),\n programAddress,\n } as RemoveTokenMetadataKeyInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedRemoveTokenMetadataKeyInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: RemoveTokenMetadataKeyInstructionData;\n};\n\nexport function parseRemoveTokenMetadataKeyInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRemoveTokenMetadataKeyInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount(), updateAuthority: getNextAccount() },\n data: getRemoveTokenMetadataKeyInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const RESUME_DISCRIMINATOR = 44;\n\nexport function getResumeDiscriminatorBytes() {\n return getU8Encoder().encode(RESUME_DISCRIMINATOR);\n}\n\nexport const RESUME_PAUSABLE_DISCRIMINATOR = 2;\n\nexport function getResumePausableDiscriminatorBytes() {\n return getU8Encoder().encode(RESUME_PAUSABLE_DISCRIMINATOR);\n}\n\nexport type ResumeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ResumeInstructionData = {\n discriminator: number;\n pausableDiscriminator: number;\n};\n\nexport type ResumeInstructionDataArgs = {};\n\nexport function getResumeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['pausableDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: RESUME_DISCRIMINATOR,\n pausableDiscriminator: RESUME_PAUSABLE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getResumeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['pausableDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getResumeInstructionDataCodec(): FixedSizeCodec<\n ResumeInstructionDataArgs,\n ResumeInstructionData\n> {\n return combineCodec(\n getResumeInstructionDataEncoder(),\n getResumeInstructionDataDecoder()\n );\n}\n\nexport type ResumeInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The pausable authority that can resume the mint. */\n authority: Address | TransactionSigner;\n};\n\nexport function getResumeInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ResumeInput,\n config?: { programAddress?: TProgramAddress }\n): ResumeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getResumeInstructionDataEncoder().encode({}),\n programAddress,\n } as ResumeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedResumeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The pausable authority that can resume the mint. */\n authority: TAccountMetas[1];\n };\n data: ResumeInstructionData;\n};\n\nexport function parseResumeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedResumeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getResumeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const REVOKE_DISCRIMINATOR = 5;\n\nexport function getRevokeDiscriminatorBytes() {\n return getU8Encoder().encode(REVOKE_DISCRIMINATOR);\n}\n\nexport type RevokeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RevokeInstructionData = { discriminator: number };\n\nexport type RevokeInstructionDataArgs = {};\n\nexport function getRevokeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: REVOKE_DISCRIMINATOR })\n );\n}\n\nexport function getRevokeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRevokeInstructionDataCodec(): FixedSizeCodec<\n RevokeInstructionDataArgs,\n RevokeInstructionData\n> {\n return combineCodec(\n getRevokeInstructionDataEncoder(),\n getRevokeInstructionDataDecoder()\n );\n}\n\nexport type RevokeInput<\n TAccountSource extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The source account owner or its multisignature. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getRevokeInstruction<\n TAccountSource extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: RevokeInput,\n config?: { programAddress?: TProgramAddress }\n): RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getRevokeInstructionDataEncoder().encode({}),\n programAddress,\n } as RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedRevokeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The source account owner or its multisignature. */\n owner: TAccountMetas[1];\n };\n data: RevokeInstructionData;\n};\n\nexport function parseRevokeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRevokeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { source: getNextAccount(), owner: getNextAccount() },\n data: getRevokeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAuthorityTypeDecoder,\n getAuthorityTypeEncoder,\n type AuthorityType,\n type AuthorityTypeArgs,\n} from '../types';\n\nexport const SET_AUTHORITY_DISCRIMINATOR = 6;\n\nexport function getSetAuthorityDiscriminatorBytes() {\n return getU8Encoder().encode(SET_AUTHORITY_DISCRIMINATOR);\n}\n\nexport type SetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountOwned extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountOwned extends string\n ? WritableAccount\n : TAccountOwned,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SetAuthorityInstructionData = {\n discriminator: number;\n /** The type of authority to update. */\n authorityType: AuthorityType;\n /** The new authority */\n newAuthority: Option
;\n};\n\nexport type SetAuthorityInstructionDataArgs = {\n /** The type of authority to update. */\n authorityType: AuthorityTypeArgs;\n /** The new authority */\n newAuthority: OptionOrNullable
;\n};\n\nexport function getSetAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['authorityType', getAuthorityTypeEncoder()],\n ['newAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({ ...value, discriminator: SET_AUTHORITY_DISCRIMINATOR })\n );\n}\n\nexport function getSetAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['authorityType', getAuthorityTypeDecoder()],\n ['newAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getSetAuthorityInstructionDataCodec(): Codec<\n SetAuthorityInstructionDataArgs,\n SetAuthorityInstructionData\n> {\n return combineCodec(\n getSetAuthorityInstructionDataEncoder(),\n getSetAuthorityInstructionDataDecoder()\n );\n}\n\nexport type SetAuthorityInput<\n TAccountOwned extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The mint or account to change the authority of. */\n owned: Address;\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: Address | TransactionSigner;\n authorityType: SetAuthorityInstructionDataArgs['authorityType'];\n newAuthority: SetAuthorityInstructionDataArgs['newAuthority'];\n multiSigners?: Array;\n};\n\nexport function getSetAuthorityInstruction<\n TAccountOwned extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: SetAuthorityInput,\n config?: { programAddress?: TProgramAddress }\n): SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owned: { value: input.owned ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owned),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getSetAuthorityInstructionDataEncoder().encode(\n args as SetAuthorityInstructionDataArgs\n ),\n programAddress,\n } as SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedSetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint or account to change the authority of. */\n owned: TAccountMetas[0];\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: TAccountMetas[1];\n };\n data: SetAuthorityInstructionData;\n};\n\nexport function parseSetAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSetAuthorityInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { owned: getNextAccount(), owner: getNextAccount() },\n data: getSetAuthorityInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const SET_TRANSFER_FEE_DISCRIMINATOR = 26;\n\nexport function getSetTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(SET_TRANSFER_FEE_DISCRIMINATOR);\n}\n\nexport const SET_TRANSFER_FEE_TRANSFER_FEE_DISCRIMINATOR = 5;\n\nexport function getSetTransferFeeTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(SET_TRANSFER_FEE_TRANSFER_FEE_DISCRIMINATOR);\n}\n\nexport type SetTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountTransferFeeConfigAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountTransferFeeConfigAuthority extends string\n ? ReadonlyAccount\n : TAccountTransferFeeConfigAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SetTransferFeeInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: bigint;\n};\n\nexport type SetTransferFeeInstructionDataArgs = {\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: number | bigint;\n};\n\nexport function getSetTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['transferFeeBasisPoints', getU16Encoder()],\n ['maximumFee', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_TRANSFER_FEE_DISCRIMINATOR,\n transferFeeDiscriminator: SET_TRANSFER_FEE_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['transferFeeBasisPoints', getU16Decoder()],\n ['maximumFee', getU64Decoder()],\n ]);\n}\n\nexport function getSetTransferFeeInstructionDataCodec(): FixedSizeCodec<\n SetTransferFeeInstructionDataArgs,\n SetTransferFeeInstructionData\n> {\n return combineCodec(\n getSetTransferFeeInstructionDataEncoder(),\n getSetTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type SetTransferFeeInput<\n TAccountMint extends string = string,\n TAccountTransferFeeConfigAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The mint's fee account owner or its multisignature account. */\n transferFeeConfigAuthority:\n | Address\n | TransactionSigner;\n transferFeeBasisPoints: SetTransferFeeInstructionDataArgs['transferFeeBasisPoints'];\n maximumFee: SetTransferFeeInstructionDataArgs['maximumFee'];\n multiSigners?: Array;\n};\n\nexport function getSetTransferFeeInstruction<\n TAccountMint extends string,\n TAccountTransferFeeConfigAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: SetTransferFeeInput,\n config?: { programAddress?: TProgramAddress }\n): SetTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['transferFeeConfigAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountTransferFeeConfigAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n transferFeeConfigAuthority: {\n value: input.transferFeeConfigAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.transferFeeConfigAuthority),\n ...remainingAccounts,\n ],\n data: getSetTransferFeeInstructionDataEncoder().encode(\n args as SetTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as SetTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['transferFeeConfigAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountTransferFeeConfigAuthority\n >);\n}\n\nexport type ParsedSetTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The mint's fee account owner or its multisignature account. */\n transferFeeConfigAuthority: TAccountMetas[1];\n };\n data: SetTransferFeeInstructionData;\n};\n\nexport function parseSetTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSetTransferFeeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n transferFeeConfigAuthority: getNextAccount(),\n },\n data: getSetTransferFeeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const SYNC_NATIVE_DISCRIMINATOR = 17;\n\nexport function getSyncNativeDiscriminatorBytes() {\n return getU8Encoder().encode(SYNC_NATIVE_DISCRIMINATOR);\n}\n\nexport type SyncNativeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SyncNativeInstructionData = { discriminator: number };\n\nexport type SyncNativeInstructionDataArgs = {};\n\nexport function getSyncNativeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: SYNC_NATIVE_DISCRIMINATOR })\n );\n}\n\nexport function getSyncNativeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getSyncNativeInstructionDataCodec(): FixedSizeCodec<\n SyncNativeInstructionDataArgs,\n SyncNativeInstructionData\n> {\n return combineCodec(\n getSyncNativeInstructionDataEncoder(),\n getSyncNativeInstructionDataDecoder()\n );\n}\n\nexport type SyncNativeInput = {\n /** The native token account to sync with its underlying lamports. */\n account: Address;\n};\n\nexport function getSyncNativeInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: SyncNativeInput,\n config?: { programAddress?: TProgramAddress }\n): SyncNativeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getSyncNativeInstructionDataEncoder().encode({}),\n programAddress,\n } as SyncNativeInstruction);\n}\n\nexport type ParsedSyncNativeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The native token account to sync with its underlying lamports. */\n account: TAccountMetas[0];\n };\n data: SyncNativeInstructionData;\n};\n\nexport function parseSyncNativeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSyncNativeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getSyncNativeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const THAW_ACCOUNT_DISCRIMINATOR = 11;\n\nexport function getThawAccountDiscriminatorBytes() {\n return getU8Encoder().encode(THAW_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type ThawAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ThawAccountInstructionData = { discriminator: number };\n\nexport type ThawAccountInstructionDataArgs = {};\n\nexport function getThawAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: THAW_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getThawAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getThawAccountInstructionDataCodec(): FixedSizeCodec<\n ThawAccountInstructionDataArgs,\n ThawAccountInstructionData\n> {\n return combineCodec(\n getThawAccountInstructionDataEncoder(),\n getThawAccountInstructionDataDecoder()\n );\n}\n\nexport type ThawAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to thaw. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getThawAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ThawAccountInput,\n config?: { programAddress?: TProgramAddress }\n): ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getThawAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedThawAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to thaw. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ThawAccountInstructionData;\n};\n\nexport function parseThawAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedThawAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getThawAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_DISCRIMINATOR = 3;\n\nexport function getTransferDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_DISCRIMINATOR);\n}\n\nexport type TransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n};\n\nexport type TransferInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n};\n\nexport function getTransferInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_DISCRIMINATOR })\n );\n}\n\nexport function getTransferInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getTransferInstructionDataCodec(): FixedSizeCodec<\n TransferInstructionDataArgs,\n TransferInstructionData\n> {\n return combineCodec(\n getTransferInstructionDataEncoder(),\n getTransferInstructionDataDecoder()\n );\n}\n\nexport type TransferInput<\n TAccountSource extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getTransferInstruction<\n TAccountSource extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: TransferInput,\n config?: { programAddress?: TProgramAddress }\n): TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferInstructionDataEncoder().encode(\n args as TransferInstructionDataArgs\n ),\n programAddress,\n } as TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: TransferInstructionData;\n};\n\nexport function parseTransferInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_CHECKED_DISCRIMINATOR = 12;\n\nexport function getTransferCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_CHECKED_DISCRIMINATOR);\n}\n\nexport type TransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type TransferCheckedInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getTransferCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getTransferCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getTransferCheckedInstructionDataCodec(): FixedSizeCodec<\n TransferCheckedInstructionDataArgs,\n TransferCheckedInstructionData\n> {\n return combineCodec(\n getTransferCheckedInstructionDataEncoder(),\n getTransferCheckedInstructionDataDecoder()\n );\n}\n\nexport type TransferCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferCheckedInstructionDataArgs['amount'];\n decimals: TransferCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getTransferCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: TransferCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferCheckedInstructionDataEncoder().encode(\n args as TransferCheckedInstructionDataArgs\n ),\n programAddress,\n } as TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The destination account. */\n destination: TAccountMetas[2];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: TransferCheckedInstructionData;\n};\n\nexport function parseTransferCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_CHECKED_WITH_FEE_DISCRIMINATOR = 26;\n\nexport function getTransferCheckedWithFeeDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_CHECKED_WITH_FEE_DISCRIMINATOR);\n}\n\nexport const TRANSFER_CHECKED_WITH_FEE_TRANSFER_FEE_DISCRIMINATOR = 1;\n\nexport function getTransferCheckedWithFeeTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n TRANSFER_CHECKED_WITH_FEE_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type TransferCheckedWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferCheckedWithFeeInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /**\n * Expected fee assessed on this transfer, calculated off-chain based\n * on the transfer_fee_basis_points and maximum_fee of the mint. May\n * be 0 for a mint without a configured transfer fee.\n */\n fee: bigint;\n};\n\nexport type TransferCheckedWithFeeInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /**\n * Expected fee assessed on this transfer, calculated off-chain based\n * on the transfer_fee_basis_points and maximum_fee of the mint. May\n * be 0 for a mint without a configured transfer fee.\n */\n fee: number | bigint;\n};\n\nexport function getTransferCheckedWithFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['fee', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: TRANSFER_CHECKED_WITH_FEE_DISCRIMINATOR,\n transferFeeDiscriminator:\n TRANSFER_CHECKED_WITH_FEE_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getTransferCheckedWithFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['fee', getU64Decoder()],\n ]);\n}\n\nexport function getTransferCheckedWithFeeInstructionDataCodec(): FixedSizeCodec<\n TransferCheckedWithFeeInstructionDataArgs,\n TransferCheckedWithFeeInstructionData\n> {\n return combineCodec(\n getTransferCheckedWithFeeInstructionDataEncoder(),\n getTransferCheckedWithFeeInstructionDataDecoder()\n );\n}\n\nexport type TransferCheckedWithFeeInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. May include the `TransferFeeAmount` extension. */\n source: Address;\n /** The token mint. May include the `TransferFeeConfig` extension. */\n mint: Address;\n /** The destination account. May include the `TransferFeeAmount` extension. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferCheckedWithFeeInstructionDataArgs['amount'];\n decimals: TransferCheckedWithFeeInstructionDataArgs['decimals'];\n fee: TransferCheckedWithFeeInstructionDataArgs['fee'];\n multiSigners?: Array;\n};\n\nexport function getTransferCheckedWithFeeInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: TransferCheckedWithFeeInput<\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): TransferCheckedWithFeeInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferCheckedWithFeeInstructionDataEncoder().encode(\n args as TransferCheckedWithFeeInstructionDataArgs\n ),\n programAddress,\n } as TransferCheckedWithFeeInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferCheckedWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. May include the `TransferFeeAmount` extension. */\n source: TAccountMetas[0];\n /** The token mint. May include the `TransferFeeConfig` extension. */\n mint: TAccountMetas[1];\n /** The destination account. May include the `TransferFeeAmount` extension. */\n destination: TAccountMetas[2];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: TransferCheckedWithFeeInstructionData;\n};\n\nexport function parseTransferCheckedWithFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferCheckedWithFeeInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferCheckedWithFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR = 24;\n\nexport function getUiAmountToAmountDiscriminatorBytes() {\n return getU8Encoder().encode(UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR);\n}\n\nexport type UiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UiAmountToAmountInstructionData = {\n discriminator: number;\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport type UiAmountToAmountInstructionDataArgs = {\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport function getUiAmountToAmountInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['uiAmount', getUtf8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getUiAmountToAmountInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['uiAmount', getUtf8Decoder()],\n ]);\n}\n\nexport function getUiAmountToAmountInstructionDataCodec(): Codec<\n UiAmountToAmountInstructionDataArgs,\n UiAmountToAmountInstructionData\n> {\n return combineCodec(\n getUiAmountToAmountInstructionDataEncoder(),\n getUiAmountToAmountInstructionDataDecoder()\n );\n}\n\nexport type UiAmountToAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n uiAmount: UiAmountToAmountInstructionDataArgs['uiAmount'];\n};\n\nexport function getUiAmountToAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UiAmountToAmountInput,\n config?: { programAddress?: TProgramAddress }\n): UiAmountToAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getUiAmountToAmountInstructionDataEncoder().encode(\n args as UiAmountToAmountInstructionDataArgs\n ),\n programAddress,\n } as UiAmountToAmountInstruction);\n}\n\nexport type ParsedUiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: UiAmountToAmountInstructionData;\n};\n\nexport function parseUiAmountToAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUiAmountToAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getUiAmountToAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR = 27;\n\nexport function getUpdateConfidentialTransferMintDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR);\n}\n\nexport const UPDATE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 1;\n\nexport function getUpdateConfidentialTransferMintConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type UpdateConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateConfidentialTransferMintInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: Option
;\n};\n\nexport type UpdateConfidentialTransferMintInstructionDataArgs = {\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: OptionOrNullable
;\n};\n\nexport function getUpdateConfidentialTransferMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['autoApproveNewAccounts', getBooleanEncoder()],\n [\n 'auditorElgamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n UPDATE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateConfidentialTransferMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['autoApproveNewAccounts', getBooleanDecoder()],\n [\n 'auditorElgamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateConfidentialTransferMintInstructionDataCodec(): FixedSizeCodec<\n UpdateConfidentialTransferMintInstructionDataArgs,\n UpdateConfidentialTransferMintInstructionData\n> {\n return combineCodec(\n getUpdateConfidentialTransferMintInstructionDataEncoder(),\n getUpdateConfidentialTransferMintInstructionDataDecoder()\n );\n}\n\nexport type UpdateConfidentialTransferMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token mint. */\n mint: Address;\n /** Confidential transfer mint authority. */\n authority: TransactionSigner;\n autoApproveNewAccounts: UpdateConfidentialTransferMintInstructionDataArgs['autoApproveNewAccounts'];\n auditorElgamalPubkey: UpdateConfidentialTransferMintInstructionDataArgs['auditorElgamalPubkey'];\n};\n\nexport function getUpdateConfidentialTransferMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateConfidentialTransferMintInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getUpdateConfidentialTransferMintInstructionDataEncoder().encode(\n args as UpdateConfidentialTransferMintInstructionDataArgs\n ),\n programAddress,\n } as UpdateConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountAuthority\n >);\n}\n\nexport type ParsedUpdateConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token mint. */\n mint: TAccountMetas[0];\n /** Confidential transfer mint authority. */\n authority: TAccountMetas[1];\n };\n data: UpdateConfidentialTransferMintInstructionData;\n};\n\nexport function parseUpdateConfidentialTransferMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateConfidentialTransferMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getUpdateConfidentialTransferMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n type AccountState,\n type AccountStateArgs,\n} from '../types';\n\nexport const UPDATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 28;\n\nexport function getUpdateDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR);\n}\n\nexport const UPDATE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 1;\n\nexport function getUpdateDefaultAccountStateDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR\n );\n}\n\nexport type UpdateDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountFreezeAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountFreezeAuthority extends string\n ? ReadonlyAccount\n : TAccountFreezeAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateDefaultAccountStateInstructionData = {\n discriminator: number;\n defaultAccountStateDiscriminator: number;\n /** The state each new token account should start with. */\n state: AccountState;\n};\n\nexport type UpdateDefaultAccountStateInstructionDataArgs = {\n /** The state each new token account should start with. */\n state: AccountStateArgs;\n};\n\nexport function getUpdateDefaultAccountStateInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['defaultAccountStateDiscriminator', getU8Encoder()],\n ['state', getAccountStateEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n defaultAccountStateDiscriminator:\n UPDATE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateDefaultAccountStateInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['defaultAccountStateDiscriminator', getU8Decoder()],\n ['state', getAccountStateDecoder()],\n ]);\n}\n\nexport function getUpdateDefaultAccountStateInstructionDataCodec(): FixedSizeCodec<\n UpdateDefaultAccountStateInstructionDataArgs,\n UpdateDefaultAccountStateInstructionData\n> {\n return combineCodec(\n getUpdateDefaultAccountStateInstructionDataEncoder(),\n getUpdateDefaultAccountStateInstructionDataDecoder()\n );\n}\n\nexport type UpdateDefaultAccountStateInput<\n TAccountMint extends string = string,\n TAccountFreezeAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n freezeAuthority:\n | Address\n | TransactionSigner;\n state: UpdateDefaultAccountStateInstructionDataArgs['state'];\n multiSigners?: Array;\n};\n\nexport function getUpdateDefaultAccountStateInstruction<\n TAccountMint extends string,\n TAccountFreezeAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateDefaultAccountStateInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateDefaultAccountStateInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['freezeAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountFreezeAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n freezeAuthority: {\n value: input.freezeAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.freezeAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateDefaultAccountStateInstructionDataEncoder().encode(\n args as UpdateDefaultAccountStateInstructionDataArgs\n ),\n programAddress,\n } as UpdateDefaultAccountStateInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['freezeAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountFreezeAuthority\n >);\n}\n\nexport type ParsedUpdateDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The mint freeze authority or its multisignature account. */\n freezeAuthority: TAccountMetas[1];\n };\n data: UpdateDefaultAccountStateInstructionData;\n};\n\nexport function parseUpdateDefaultAccountStateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateDefaultAccountStateInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), freezeAuthority: getNextAccount() },\n data: getUpdateDefaultAccountStateInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_GROUP_MEMBER_POINTER_DISCRIMINATOR = 41;\n\nexport function getUpdateGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_GROUP_MEMBER_POINTER_DISCRIMINATOR);\n}\n\nexport const UPDATE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR = 1;\n\nexport function getUpdateGroupMemberPointerGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR\n );\n}\n\nexport type UpdateGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountGroupMemberPointerAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountGroupMemberPointerAuthority extends string\n ? ReadonlyAccount\n : TAccountGroupMemberPointerAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateGroupMemberPointerInstructionData = {\n discriminator: number;\n groupMemberPointerDiscriminator: number;\n /** The new account address that holds the member. */\n memberAddress: Option
;\n};\n\nexport type UpdateGroupMemberPointerInstructionDataArgs = {\n /** The new account address that holds the member. */\n memberAddress: OptionOrNullable
;\n};\n\nexport function getUpdateGroupMemberPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupMemberPointerDiscriminator', getU8Encoder()],\n [\n 'memberAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n groupMemberPointerDiscriminator:\n UPDATE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateGroupMemberPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupMemberPointerDiscriminator', getU8Decoder()],\n [\n 'memberAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateGroupMemberPointerInstructionDataCodec(): FixedSizeCodec<\n UpdateGroupMemberPointerInstructionDataArgs,\n UpdateGroupMemberPointerInstructionData\n> {\n return combineCodec(\n getUpdateGroupMemberPointerInstructionDataEncoder(),\n getUpdateGroupMemberPointerInstructionDataDecoder()\n );\n}\n\nexport type UpdateGroupMemberPointerInput<\n TAccountMint extends string = string,\n TAccountGroupMemberPointerAuthority extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n /** The group member pointer authority or its multisignature account. */\n groupMemberPointerAuthority:\n | Address\n | TransactionSigner;\n memberAddress: UpdateGroupMemberPointerInstructionDataArgs['memberAddress'];\n multiSigners?: Array;\n};\n\nexport function getUpdateGroupMemberPointerInstruction<\n TAccountMint extends string,\n TAccountGroupMemberPointerAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateGroupMemberPointerInput<\n TAccountMint,\n TAccountGroupMemberPointerAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateGroupMemberPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupMemberPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupMemberPointerAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n groupMemberPointerAuthority: {\n value: input.groupMemberPointerAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.groupMemberPointerAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateGroupMemberPointerInstructionDataEncoder().encode(\n args as UpdateGroupMemberPointerInstructionDataArgs\n ),\n programAddress,\n } as UpdateGroupMemberPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupMemberPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupMemberPointerAuthority\n >);\n}\n\nexport type ParsedUpdateGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n /** The group member pointer authority or its multisignature account. */\n groupMemberPointerAuthority: TAccountMetas[1];\n };\n data: UpdateGroupMemberPointerInstructionData;\n};\n\nexport function parseUpdateGroupMemberPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateGroupMemberPointerInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n groupMemberPointerAuthority: getNextAccount(),\n },\n data: getUpdateGroupMemberPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_GROUP_POINTER_DISCRIMINATOR = 40;\n\nexport function getUpdateGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_GROUP_POINTER_DISCRIMINATOR);\n}\n\nexport const UPDATE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR = 1;\n\nexport function getUpdateGroupPointerGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR\n );\n}\n\nexport type UpdateGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountGroupPointerAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountGroupPointerAuthority extends string\n ? ReadonlyAccount\n : TAccountGroupPointerAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateGroupPointerInstructionData = {\n discriminator: number;\n groupPointerDiscriminator: number;\n /** The new account address that holds the group configurations. */\n groupAddress: Option
;\n};\n\nexport type UpdateGroupPointerInstructionDataArgs = {\n /** The new account address that holds the group configurations. */\n groupAddress: OptionOrNullable
;\n};\n\nexport function getUpdateGroupPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupPointerDiscriminator', getU8Encoder()],\n [\n 'groupAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_GROUP_POINTER_DISCRIMINATOR,\n groupPointerDiscriminator:\n UPDATE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateGroupPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupPointerDiscriminator', getU8Decoder()],\n [\n 'groupAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateGroupPointerInstructionDataCodec(): FixedSizeCodec<\n UpdateGroupPointerInstructionDataArgs,\n UpdateGroupPointerInstructionData\n> {\n return combineCodec(\n getUpdateGroupPointerInstructionDataEncoder(),\n getUpdateGroupPointerInstructionDataDecoder()\n );\n}\n\nexport type UpdateGroupPointerInput<\n TAccountMint extends string = string,\n TAccountGroupPointerAuthority extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n /** The group pointer authority or its multisignature account. */\n groupPointerAuthority:\n | Address\n | TransactionSigner;\n groupAddress: UpdateGroupPointerInstructionDataArgs['groupAddress'];\n multiSigners?: Array;\n};\n\nexport function getUpdateGroupPointerInstruction<\n TAccountMint extends string,\n TAccountGroupPointerAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateGroupPointerInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateGroupPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupPointerAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n groupPointerAuthority: {\n value: input.groupPointerAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.groupPointerAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateGroupPointerInstructionDataEncoder().encode(\n args as UpdateGroupPointerInstructionDataArgs\n ),\n programAddress,\n } as UpdateGroupPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupPointerAuthority\n >);\n}\n\nexport type ParsedUpdateGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n /** The group pointer authority or its multisignature account. */\n groupPointerAuthority: TAccountMetas[1];\n };\n data: UpdateGroupPointerInstructionData;\n};\n\nexport function parseUpdateGroupPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateGroupPointerInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n groupPointerAuthority: getNextAccount(),\n },\n data: getUpdateGroupPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_METADATA_POINTER_DISCRIMINATOR = 39;\n\nexport function getUpdateMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_METADATA_POINTER_DISCRIMINATOR);\n}\n\nexport const UPDATE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR = 1;\n\nexport function getUpdateMetadataPointerMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR\n );\n}\n\nexport type UpdateMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountMetadataPointerAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountMetadataPointerAuthority extends string\n ? ReadonlyAccount\n : TAccountMetadataPointerAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateMetadataPointerInstructionData = {\n discriminator: number;\n metadataPointerDiscriminator: number;\n /** The new account address that holds the metadata. */\n metadataAddress: Option
;\n};\n\nexport type UpdateMetadataPointerInstructionDataArgs = {\n /** The new account address that holds the metadata. */\n metadataAddress: OptionOrNullable
;\n};\n\nexport function getUpdateMetadataPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['metadataPointerDiscriminator', getU8Encoder()],\n [\n 'metadataAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_METADATA_POINTER_DISCRIMINATOR,\n metadataPointerDiscriminator:\n UPDATE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateMetadataPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['metadataPointerDiscriminator', getU8Decoder()],\n [\n 'metadataAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateMetadataPointerInstructionDataCodec(): FixedSizeCodec<\n UpdateMetadataPointerInstructionDataArgs,\n UpdateMetadataPointerInstructionData\n> {\n return combineCodec(\n getUpdateMetadataPointerInstructionDataEncoder(),\n getUpdateMetadataPointerInstructionDataDecoder()\n );\n}\n\nexport type UpdateMetadataPointerInput<\n TAccountMint extends string = string,\n TAccountMetadataPointerAuthority extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n /** The metadata pointer authority or its multisignature account. */\n metadataPointerAuthority:\n | Address\n | TransactionSigner;\n metadataAddress: UpdateMetadataPointerInstructionDataArgs['metadataAddress'];\n multiSigners?: Array;\n};\n\nexport function getUpdateMetadataPointerInstruction<\n TAccountMint extends string,\n TAccountMetadataPointerAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateMetadataPointerInput<\n TAccountMint,\n TAccountMetadataPointerAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateMetadataPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['metadataPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMetadataPointerAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n metadataPointerAuthority: {\n value: input.metadataPointerAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.metadataPointerAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateMetadataPointerInstructionDataEncoder().encode(\n args as UpdateMetadataPointerInstructionDataArgs\n ),\n programAddress,\n } as UpdateMetadataPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['metadataPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMetadataPointerAuthority\n >);\n}\n\nexport type ParsedUpdateMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n /** The metadata pointer authority or its multisignature account. */\n metadataPointerAuthority: TAccountMetas[1];\n };\n data: UpdateMetadataPointerInstructionData;\n};\n\nexport function parseUpdateMetadataPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateMetadataPointerInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n metadataPointerAuthority: getNextAccount(),\n },\n data: getUpdateMetadataPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getF64Decoder,\n getF64Encoder,\n getI64Decoder,\n getI64Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_MULTIPLIER_SCALED_UI_MINT_DISCRIMINATOR = 43;\n\nexport function getUpdateMultiplierScaledUiMintDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_MULTIPLIER_SCALED_UI_MINT_DISCRIMINATOR);\n}\n\nexport const UPDATE_MULTIPLIER_SCALED_UI_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR = 1;\n\nexport function getUpdateMultiplierScaledUiMintScaledUiAmountMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_MULTIPLIER_SCALED_UI_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR\n );\n}\n\nexport type UpdateMultiplierScaledUiMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? WritableAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateMultiplierScaledUiMintInstructionData = {\n discriminator: number;\n scaledUiAmountMintDiscriminator: number;\n /** The new multiplier for the scaled UI extension */\n multiplier: number;\n /** The timestamp at which the new multiplier will take effect */\n effectiveTimestamp: bigint;\n};\n\nexport type UpdateMultiplierScaledUiMintInstructionDataArgs = {\n /** The new multiplier for the scaled UI extension */\n multiplier: number;\n /** The timestamp at which the new multiplier will take effect */\n effectiveTimestamp: number | bigint;\n};\n\nexport function getUpdateMultiplierScaledUiMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['scaledUiAmountMintDiscriminator', getU8Encoder()],\n ['multiplier', getF64Encoder()],\n ['effectiveTimestamp', getI64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_MULTIPLIER_SCALED_UI_MINT_DISCRIMINATOR,\n scaledUiAmountMintDiscriminator:\n UPDATE_MULTIPLIER_SCALED_UI_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateMultiplierScaledUiMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['scaledUiAmountMintDiscriminator', getU8Decoder()],\n ['multiplier', getF64Decoder()],\n ['effectiveTimestamp', getI64Decoder()],\n ]);\n}\n\nexport function getUpdateMultiplierScaledUiMintInstructionDataCodec(): FixedSizeCodec<\n UpdateMultiplierScaledUiMintInstructionDataArgs,\n UpdateMultiplierScaledUiMintInstructionData\n> {\n return combineCodec(\n getUpdateMultiplierScaledUiMintInstructionDataEncoder(),\n getUpdateMultiplierScaledUiMintInstructionDataDecoder()\n );\n}\n\nexport type UpdateMultiplierScaledUiMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The multiplier authority. */\n authority: Address | TransactionSigner;\n multiplier: UpdateMultiplierScaledUiMintInstructionDataArgs['multiplier'];\n effectiveTimestamp: UpdateMultiplierScaledUiMintInstructionDataArgs['effectiveTimestamp'];\n multiSigners?: Array;\n};\n\nexport function getUpdateMultiplierScaledUiMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateMultiplierScaledUiMintInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateMultiplierScaledUiMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getUpdateMultiplierScaledUiMintInstructionDataEncoder().encode(\n args as UpdateMultiplierScaledUiMintInstructionDataArgs\n ),\n programAddress,\n } as UpdateMultiplierScaledUiMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedUpdateMultiplierScaledUiMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The multiplier authority. */\n authority: TAccountMetas[1];\n };\n data: UpdateMultiplierScaledUiMintInstructionData;\n};\n\nexport function parseUpdateMultiplierScaledUiMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateMultiplierScaledUiMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getUpdateMultiplierScaledUiMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI16Decoder,\n getI16Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_RATE_INTEREST_BEARING_MINT_DISCRIMINATOR = 33;\n\nexport function getUpdateRateInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_RATE_INTEREST_BEARING_MINT_DISCRIMINATOR);\n}\n\nexport const UPDATE_RATE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR = 1;\n\nexport function getUpdateRateInterestBearingMintInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_RATE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR\n );\n}\n\nexport type UpdateRateInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountRateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountRateAuthority extends string\n ? WritableAccount\n : TAccountRateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateRateInterestBearingMintInstructionData = {\n discriminator: number;\n interestBearingMintDiscriminator: number;\n /** The interest rate to update. */\n rate: number;\n};\n\nexport type UpdateRateInterestBearingMintInstructionDataArgs = {\n /** The interest rate to update. */\n rate: number;\n};\n\nexport function getUpdateRateInterestBearingMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['interestBearingMintDiscriminator', getU8Encoder()],\n ['rate', getI16Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_RATE_INTEREST_BEARING_MINT_DISCRIMINATOR,\n interestBearingMintDiscriminator:\n UPDATE_RATE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateRateInterestBearingMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['interestBearingMintDiscriminator', getU8Decoder()],\n ['rate', getI16Decoder()],\n ]);\n}\n\nexport function getUpdateRateInterestBearingMintInstructionDataCodec(): FixedSizeCodec<\n UpdateRateInterestBearingMintInstructionDataArgs,\n UpdateRateInterestBearingMintInstructionData\n> {\n return combineCodec(\n getUpdateRateInterestBearingMintInstructionDataEncoder(),\n getUpdateRateInterestBearingMintInstructionDataDecoder()\n );\n}\n\nexport type UpdateRateInterestBearingMintInput<\n TAccountMint extends string = string,\n TAccountRateAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The mint rate authority. */\n rateAuthority:\n | Address\n | TransactionSigner;\n rate: UpdateRateInterestBearingMintInstructionDataArgs['rate'];\n multiSigners?: Array;\n};\n\nexport function getUpdateRateInterestBearingMintInstruction<\n TAccountMint extends string,\n TAccountRateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateRateInterestBearingMintInput<\n TAccountMint,\n TAccountRateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateRateInterestBearingMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['rateAuthority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountRateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n rateAuthority: { value: input.rateAuthority ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.rateAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateRateInterestBearingMintInstructionDataEncoder().encode(\n args as UpdateRateInterestBearingMintInstructionDataArgs\n ),\n programAddress,\n } as UpdateRateInterestBearingMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['rateAuthority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountRateAuthority\n >);\n}\n\nexport type ParsedUpdateRateInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The mint rate authority. */\n rateAuthority: TAccountMetas[1];\n };\n data: UpdateRateInterestBearingMintInstructionData;\n};\n\nexport function parseUpdateRateInterestBearingMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateRateInterestBearingMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), rateAuthority: getNextAccount() },\n data: getUpdateRateInterestBearingMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR = new Uint8Array([\n 108, 37, 171, 143, 248, 30, 18, 110,\n]);\n\nexport function getUpdateTokenGroupMaxSizeDiscriminatorBytes() {\n return getBytesEncoder().encode(UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR);\n}\n\nexport type UpdateTokenGroupMaxSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountGroup extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenGroupMaxSizeInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** New max size for the group */\n maxSize: bigint;\n};\n\nexport type UpdateTokenGroupMaxSizeInstructionDataArgs = {\n /** New max size for the group */\n maxSize: number | bigint;\n};\n\nexport function getUpdateTokenGroupMaxSizeInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['maxSize', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenGroupMaxSizeInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['maxSize', getU64Decoder()],\n ]);\n}\n\nexport function getUpdateTokenGroupMaxSizeInstructionDataCodec(): Codec<\n UpdateTokenGroupMaxSizeInstructionDataArgs,\n UpdateTokenGroupMaxSizeInstructionData\n> {\n return combineCodec(\n getUpdateTokenGroupMaxSizeInstructionDataEncoder(),\n getUpdateTokenGroupMaxSizeInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenGroupMaxSizeInput<\n TAccountGroup extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n group: Address;\n updateAuthority: TransactionSigner;\n maxSize: UpdateTokenGroupMaxSizeInstructionDataArgs['maxSize'];\n};\n\nexport function getUpdateTokenGroupMaxSizeInstruction<\n TAccountGroup extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenGroupMaxSizeInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenGroupMaxSizeInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n group: { value: input.group ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenGroupMaxSizeInstructionDataEncoder().encode(\n args as UpdateTokenGroupMaxSizeInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenGroupMaxSizeInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenGroupMaxSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n group: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenGroupMaxSizeInstructionData;\n};\n\nexport function parseUpdateTokenGroupMaxSizeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenGroupMaxSizeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { group: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenGroupMaxSizeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR = new Uint8Array(\n [161, 105, 88, 1, 237, 221, 216, 203]\n);\n\nexport function getUpdateTokenGroupUpdateAuthorityDiscriminatorBytes() {\n return getBytesEncoder().encode(\n UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR\n );\n}\n\nexport type UpdateTokenGroupUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountGroup extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenGroupUpdateAuthorityInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** New authority for the group, or unset if `None` */\n newUpdateAuthority: Option
;\n};\n\nexport type UpdateTokenGroupUpdateAuthorityInstructionDataArgs = {\n /** New authority for the group, or unset if `None` */\n newUpdateAuthority: OptionOrNullable
;\n};\n\nexport function getUpdateTokenGroupUpdateAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n [\n 'newUpdateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenGroupUpdateAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n [\n 'newUpdateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateTokenGroupUpdateAuthorityInstructionDataCodec(): Codec<\n UpdateTokenGroupUpdateAuthorityInstructionDataArgs,\n UpdateTokenGroupUpdateAuthorityInstructionData\n> {\n return combineCodec(\n getUpdateTokenGroupUpdateAuthorityInstructionDataEncoder(),\n getUpdateTokenGroupUpdateAuthorityInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenGroupUpdateAuthorityInput<\n TAccountGroup extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n group: Address;\n /** Current update authority */\n updateAuthority: TransactionSigner;\n newUpdateAuthority: UpdateTokenGroupUpdateAuthorityInstructionDataArgs['newUpdateAuthority'];\n};\n\nexport function getUpdateTokenGroupUpdateAuthorityInstruction<\n TAccountGroup extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenGroupUpdateAuthorityInput<\n TAccountGroup,\n TAccountUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenGroupUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n group: { value: input.group ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenGroupUpdateAuthorityInstructionDataEncoder().encode(\n args as UpdateTokenGroupUpdateAuthorityInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenGroupUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenGroupUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n group: TAccountMetas[0];\n /** Current update authority */\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenGroupUpdateAuthorityInstructionData;\n};\n\nexport function parseUpdateTokenGroupUpdateAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenGroupUpdateAuthorityInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { group: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenGroupUpdateAuthorityInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getTokenMetadataFieldDecoder,\n getTokenMetadataFieldEncoder,\n type TokenMetadataField,\n type TokenMetadataFieldArgs,\n} from '../types';\n\nexport const UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR = new Uint8Array([\n 221, 233, 49, 45, 181, 202, 220, 200,\n]);\n\nexport function getUpdateTokenMetadataFieldDiscriminatorBytes() {\n return getBytesEncoder().encode(UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR);\n}\n\nexport type UpdateTokenMetadataFieldInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenMetadataFieldInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Field to update in the metadata. */\n field: TokenMetadataField;\n /** Value to write for the field. */\n value: string;\n};\n\nexport type UpdateTokenMetadataFieldInstructionDataArgs = {\n /** Field to update in the metadata. */\n field: TokenMetadataFieldArgs;\n /** Value to write for the field. */\n value: string;\n};\n\nexport function getUpdateTokenMetadataFieldInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['field', getTokenMetadataFieldEncoder()],\n ['value', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenMetadataFieldInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['field', getTokenMetadataFieldDecoder()],\n ['value', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getUpdateTokenMetadataFieldInstructionDataCodec(): Codec<\n UpdateTokenMetadataFieldInstructionDataArgs,\n UpdateTokenMetadataFieldInstructionData\n> {\n return combineCodec(\n getUpdateTokenMetadataFieldInstructionDataEncoder(),\n getUpdateTokenMetadataFieldInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenMetadataFieldInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: TransactionSigner;\n field: UpdateTokenMetadataFieldInstructionDataArgs['field'];\n value: UpdateTokenMetadataFieldInstructionDataArgs['value'];\n};\n\nexport function getUpdateTokenMetadataFieldInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenMetadataFieldInput<\n TAccountMetadata,\n TAccountUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenMetadataFieldInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenMetadataFieldInstructionDataEncoder().encode(\n args as UpdateTokenMetadataFieldInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenMetadataFieldInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenMetadataFieldInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenMetadataFieldInstructionData;\n};\n\nexport function parseUpdateTokenMetadataFieldInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenMetadataFieldInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenMetadataFieldInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR =\n new Uint8Array([215, 228, 166, 228, 84, 100, 86, 123]);\n\nexport function getUpdateTokenMetadataUpdateAuthorityDiscriminatorBytes() {\n return getBytesEncoder().encode(\n UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR\n );\n}\n\nexport type UpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenMetadataUpdateAuthorityInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** New authority for the token metadata, or unset if `None` */\n newUpdateAuthority: Option
;\n};\n\nexport type UpdateTokenMetadataUpdateAuthorityInstructionDataArgs = {\n /** New authority for the token metadata, or unset if `None` */\n newUpdateAuthority: OptionOrNullable
;\n};\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n [\n 'newUpdateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n [\n 'newUpdateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstructionDataCodec(): Codec<\n UpdateTokenMetadataUpdateAuthorityInstructionDataArgs,\n UpdateTokenMetadataUpdateAuthorityInstructionData\n> {\n return combineCodec(\n getUpdateTokenMetadataUpdateAuthorityInstructionDataEncoder(),\n getUpdateTokenMetadataUpdateAuthorityInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenMetadataUpdateAuthorityInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: TransactionSigner;\n newUpdateAuthority: UpdateTokenMetadataUpdateAuthorityInstructionDataArgs['newUpdateAuthority'];\n};\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenMetadataUpdateAuthorityInput<\n TAccountMetadata,\n TAccountUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenMetadataUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenMetadataUpdateAuthorityInstructionDataEncoder().encode(\n args as UpdateTokenMetadataUpdateAuthorityInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenMetadataUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenMetadataUpdateAuthorityInstructionData;\n};\n\nexport function parseUpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenMetadataUpdateAuthorityInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TRANSFER_HOOK_DISCRIMINATOR = 36;\n\nexport function getUpdateTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_TRANSFER_HOOK_DISCRIMINATOR);\n}\n\nexport const UPDATE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR = 1;\n\nexport function getUpdateTransferHookTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR\n );\n}\n\nexport type UpdateTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTransferHookInstructionData = {\n discriminator: number;\n transferHookDiscriminator: number;\n /** The program id that performs logic during transfers */\n programId: Option
;\n};\n\nexport type UpdateTransferHookInstructionDataArgs = {\n /** The program id that performs logic during transfers */\n programId: OptionOrNullable
;\n};\n\nexport function getUpdateTransferHookInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferHookDiscriminator', getU8Encoder()],\n [\n 'programId',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TRANSFER_HOOK_DISCRIMINATOR,\n transferHookDiscriminator:\n UPDATE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTransferHookInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferHookDiscriminator', getU8Decoder()],\n [\n 'programId',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateTransferHookInstructionDataCodec(): FixedSizeCodec<\n UpdateTransferHookInstructionDataArgs,\n UpdateTransferHookInstructionData\n> {\n return combineCodec(\n getUpdateTransferHookInstructionDataEncoder(),\n getUpdateTransferHookInstructionDataDecoder()\n );\n}\n\nexport type UpdateTransferHookInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The transfer hook authority. */\n authority: Address | TransactionSigner;\n programId: UpdateTransferHookInstructionDataArgs['programId'];\n multiSigners?: Array;\n};\n\nexport function getUpdateTransferHookInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTransferHookInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateTransferHookInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getUpdateTransferHookInstructionDataEncoder().encode(\n args as UpdateTransferHookInstructionDataArgs\n ),\n programAddress,\n } as UpdateTransferHookInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedUpdateTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The transfer hook authority. */\n authority: TAccountMetas[1];\n };\n data: UpdateTransferHookInstructionData;\n};\n\nexport function parseUpdateTransferHookInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTransferHookInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getUpdateTransferHookInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const WITHDRAW_EXCESS_LAMPORTS_DISCRIMINATOR = 38;\n\nexport function getWithdrawExcessLamportsDiscriminatorBytes() {\n return getU8Encoder().encode(WITHDRAW_EXCESS_LAMPORTS_DISCRIMINATOR);\n}\n\nexport type WithdrawExcessLamportsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSourceAccount extends string | AccountMeta = string,\n TAccountDestinationAccount extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSourceAccount extends string\n ? WritableAccount\n : TAccountSourceAccount,\n TAccountDestinationAccount extends string\n ? WritableAccount\n : TAccountDestinationAccount,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawExcessLamportsInstructionData = { discriminator: number };\n\nexport type WithdrawExcessLamportsInstructionDataArgs = {};\n\nexport function getWithdrawExcessLamportsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: WITHDRAW_EXCESS_LAMPORTS_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawExcessLamportsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getWithdrawExcessLamportsInstructionDataCodec(): FixedSizeCodec<\n WithdrawExcessLamportsInstructionDataArgs,\n WithdrawExcessLamportsInstructionData\n> {\n return combineCodec(\n getWithdrawExcessLamportsInstructionDataEncoder(),\n getWithdrawExcessLamportsInstructionDataDecoder()\n );\n}\n\nexport type WithdrawExcessLamportsInput<\n TAccountSourceAccount extends string = string,\n TAccountDestinationAccount extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** Account holding excess lamports. */\n sourceAccount: Address;\n /** Destination account for withdrawn lamports. */\n destinationAccount: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getWithdrawExcessLamportsInstruction<\n TAccountSourceAccount extends string,\n TAccountDestinationAccount extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawExcessLamportsInput<\n TAccountSourceAccount,\n TAccountDestinationAccount,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawExcessLamportsInstruction<\n TProgramAddress,\n TAccountSourceAccount,\n TAccountDestinationAccount,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n sourceAccount: { value: input.sourceAccount ?? null, isWritable: true },\n destinationAccount: {\n value: input.destinationAccount ?? null,\n isWritable: true,\n },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.sourceAccount),\n getAccountMeta(accounts.destinationAccount),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getWithdrawExcessLamportsInstructionDataEncoder().encode({}),\n programAddress,\n } as WithdrawExcessLamportsInstruction<\n TProgramAddress,\n TAccountSourceAccount,\n TAccountDestinationAccount,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedWithdrawExcessLamportsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Account holding excess lamports. */\n sourceAccount: TAccountMetas[0];\n /** Destination account for withdrawn lamports. */\n destinationAccount: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: WithdrawExcessLamportsInstructionData;\n};\n\nexport function parseWithdrawExcessLamportsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawExcessLamportsInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n sourceAccount: getNextAccount(),\n destinationAccount: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getWithdrawExcessLamportsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_DISCRIMINATOR = 26;\n\nexport function getWithdrawWithheldTokensFromAccountsDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_TRANSFER_FEE_DISCRIMINATOR = 3;\n\nexport function getWithdrawWithheldTokensFromAccountsTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountFeeReceiver extends string | AccountMeta = string,\n TAccountWithdrawWithheldAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountFeeReceiver extends string\n ? WritableAccount\n : TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority extends string\n ? ReadonlyAccount\n : TAccountWithdrawWithheldAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromAccountsInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** Number of token accounts harvested. */\n numTokenAccounts: number;\n};\n\nexport type WithdrawWithheldTokensFromAccountsInstructionDataArgs = {\n /** Number of token accounts harvested. */\n numTokenAccounts: number;\n};\n\nexport function getWithdrawWithheldTokensFromAccountsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['numTokenAccounts', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_DISCRIMINATOR,\n transferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromAccountsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['numTokenAccounts', getU8Decoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromAccountsInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromAccountsInstructionDataArgs,\n WithdrawWithheldTokensFromAccountsInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromAccountsInstructionDataEncoder(),\n getWithdrawWithheldTokensFromAccountsInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsInput<\n TAccountMint extends string = string,\n TAccountFeeReceiver extends string = string,\n TAccountWithdrawWithheldAuthority extends string = string,\n> = {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: Address;\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: Address;\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority:\n | Address\n | TransactionSigner;\n numTokenAccounts: WithdrawWithheldTokensFromAccountsInstructionDataArgs['numTokenAccounts'];\n multiSigners?: Array;\n sources: Array
;\n};\n\nexport function getWithdrawWithheldTokensFromAccountsInstruction<\n TAccountMint extends string,\n TAccountFeeReceiver extends string,\n TAccountWithdrawWithheldAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromAccountsInput<\n TAccountMint,\n TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromAccountsInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n feeReceiver: { value: input.feeReceiver ?? null, isWritable: true },\n withdrawWithheldAuthority: {\n value: input.withdrawWithheldAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = [\n ...(args.multiSigners ?? []).map((signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })),\n ...args.sources.map((address) => ({ address, role: AccountRole.WRITABLE })),\n ];\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.feeReceiver),\n getAccountMeta(accounts.withdrawWithheldAuthority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromAccountsInstructionDataEncoder().encode(\n args as WithdrawWithheldTokensFromAccountsInstructionDataArgs\n ),\n programAddress,\n } as WithdrawWithheldTokensFromAccountsInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromAccountsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: TAccountMetas[0];\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: TAccountMetas[1];\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority: TAccountMetas[2];\n };\n data: WithdrawWithheldTokensFromAccountsInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromAccountsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromAccountsInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n feeReceiver: getNextAccount(),\n withdrawWithheldAuthority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromAccountsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 2;\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = string,\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionData =\n {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n /** Number of token accounts harvested */\n numTokenAccounts: number;\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalance;\n };\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs =\n {\n /** Number of token accounts harvested */\n numTokenAccounts: number;\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n };\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ['numTokenAccounts', getU8Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ['numTokenAccounts', getU8Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs,\n WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataEncoder(),\n getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The fee receiver account. */\n destination: Address;\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: Address;\n /** Optional record account */\n record?: Address;\n /** The mint's withdraw_withheld_authority */\n authority: Address | TransactionSigner;\n numTokenAccounts: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs['numTokenAccounts'];\n proofInstructionOffset: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs['proofInstructionOffset'];\n newDecryptableAvailableBalance: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs['newDecryptableAvailableBalance'];\n multiSigners?: Array;\n};\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInput<\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataEncoder().encode(\n args as WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The fee receiver account. */\n destination: TAccountMetas[1];\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: TAccountMetas[2];\n /** Optional record account */\n record?: TAccountMetas[3] | undefined;\n /** The mint's withdraw_withheld_authority */\n authority: TAccountMetas[4];\n };\n data: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n destination: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_DISCRIMINATOR = 26;\n\nexport function getWithdrawWithheldTokensFromMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_TRANSFER_FEE_DISCRIMINATOR = 2;\n\nexport function getWithdrawWithheldTokensFromMintTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountFeeReceiver extends string | AccountMeta = string,\n TAccountWithdrawWithheldAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountFeeReceiver extends string\n ? WritableAccount\n : TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority extends string\n ? ReadonlyAccount\n : TAccountWithdrawWithheldAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromMintInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n};\n\nexport type WithdrawWithheldTokensFromMintInstructionDataArgs = {};\n\nexport function getWithdrawWithheldTokensFromMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: WITHDRAW_WITHHELD_TOKENS_FROM_MINT_DISCRIMINATOR,\n transferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromMintInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromMintInstructionDataArgs,\n WithdrawWithheldTokensFromMintInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromMintInstructionDataEncoder(),\n getWithdrawWithheldTokensFromMintInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromMintInput<\n TAccountMint extends string = string,\n TAccountFeeReceiver extends string = string,\n TAccountWithdrawWithheldAuthority extends string = string,\n> = {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: Address;\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: Address;\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority:\n | Address\n | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getWithdrawWithheldTokensFromMintInstruction<\n TAccountMint extends string,\n TAccountFeeReceiver extends string,\n TAccountWithdrawWithheldAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromMintInput<\n TAccountMint,\n TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n feeReceiver: { value: input.feeReceiver ?? null, isWritable: true },\n withdrawWithheldAuthority: {\n value: input.withdrawWithheldAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.feeReceiver),\n getAccountMeta(accounts.withdrawWithheldAuthority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromMintInstructionDataEncoder().encode({}),\n programAddress,\n } as WithdrawWithheldTokensFromMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: TAccountMetas[0];\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: TAccountMetas[1];\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority: TAccountMetas[2];\n };\n data: WithdrawWithheldTokensFromMintInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromMintInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n feeReceiver: getNextAccount(),\n withdrawWithheldAuthority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 1;\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = string,\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionData =\n {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalance;\n };\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs =\n {\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n };\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs,\n WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataEncoder(),\n getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The fee receiver account. */\n destination: Address;\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: Address;\n /** Optional record account if proof is read from record */\n record?: Address;\n /** The mint's withdraw_withheld_authority */\n authority: Address | TransactionSigner;\n proofInstructionOffset: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs['proofInstructionOffset'];\n newDecryptableAvailableBalance: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs['newDecryptableAvailableBalance'];\n multiSigners?: Array;\n};\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInput<\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataEncoder().encode(\n args as WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The fee receiver account. */\n destination: TAccountMetas[1];\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: TAccountMetas[2];\n /** Optional record account if proof is read from record */\n record?: TAccountMetas[3] | undefined;\n /** The mint's withdraw_withheld_authority */\n authority: TAccountMetas[4];\n };\n data: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n destination: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","import {\n type GetAccountInfoApi,\n type Rpc,\n Address,\n UnixTimestamp,\n unwrapOption,\n} from '@solana/kit';\nimport { fetchSysvarClock } from '@solana/sysvars';\nimport { fetchMint } from './generated';\n\n// Constants\nconst ONE_IN_BASIS_POINTS = 10000;\nconst SECONDS_PER_YEAR = 60 * 60 * 24 * 365.24;\n\n/**\n * Calculates the exponent for the interest rate formula.\n * @param t1 - The start time in seconds.\n * @param t2 - The end time in seconds.\n * @param r - The interest rate in basis points.\n *\n * @returns The calculated exponent.\n */\nfunction calculateExponentForTimesAndRate(t1: number, t2: number, r: number) {\n const timespan = t2 - t1;\n if (timespan < 0) {\n throw new Error('Invalid timespan: end time before start time');\n }\n\n const numerator = r * timespan;\n const exponent = numerator / (SECONDS_PER_YEAR * ONE_IN_BASIS_POINTS);\n return Math.exp(exponent);\n}\n\n/**\n * Calculates the total scale factor for an interest bearing token by combining two exponential functions:\n * One for the period between initialization and last update using the pre-update average rate,\n * and another for the period between last update and current time using the current rate.\n *\n * @param currentTimestamp Current timestamp in seconds\n * @param lastUpdateTimestamp Last time the interest rate was updated in seconds\n * @param initializationTimestamp Time the interest bearing extension was initialized in seconds\n * @param preUpdateAverageRate Interest rate in basis points before last update\n * @param currentRate Current interest rate in basis points\n *\n * @returns The total scale factor as a product of the two exponential functions\n */\nfunction calculateTotalScale({\n currentTimestamp,\n lastUpdateTimestamp,\n initializationTimestamp,\n preUpdateAverageRate,\n currentRate,\n}: {\n currentTimestamp: number;\n lastUpdateTimestamp: number;\n initializationTimestamp: number;\n preUpdateAverageRate: number;\n currentRate: number;\n}): number {\n // Calculate pre-update exponent\n const preUpdateExp = calculateExponentForTimesAndRate(\n initializationTimestamp,\n lastUpdateTimestamp,\n preUpdateAverageRate\n );\n\n // Calculate post-update exponent\n const postUpdateExp = calculateExponentForTimesAndRate(\n lastUpdateTimestamp,\n currentTimestamp,\n currentRate\n );\n\n return preUpdateExp * postUpdateExp;\n}\n\n/**\n * Calculates the decimal factor for a given number of decimals\n * @param decimals - Number of decimals\n * @returns The decimal factor (e.g., 100 for 2 decimals)\n */\nfunction getDecimalFactor(decimals: number): number {\n return Math.pow(10, decimals);\n}\n\n/**\n * Retrieves the current timestamp from the Solana clock sysvar.\n * @param rpc - The Solana rpc object.\n * @returns A promise that resolves to the current timestamp in seconds.\n * @throws An error if the sysvar clock cannot be fetched or parsed.\n */\nasync function getSysvarClockTimestamp(\n rpc: Rpc\n): Promise {\n const info = await fetchSysvarClock(rpc);\n if (!info) {\n throw new Error('Failed to fetch sysvar clock');\n }\n return info.unixTimestamp;\n}\n\n// ========== INTEREST BEARING MINT FUNCTIONS ==========\n\n/**\n * Convert amount to UiAmount for a mint with interest bearing extension without simulating a transaction\n * This implements the same logic as the CPI instruction available in /token/program-2022/src/extension/interest_bearing_mint/mod.rs\n * In general to calculate compounding interest over a period of time, the formula is:\n * A = P * e^(r * t) where\n * A = final amount after interest\n * P = principal amount (initial investment)\n * r = annual interest rate (as a decimal, e.g., 5% = 0.05)\n * t = time in years\n * e = mathematical constant (~2.718)\n *\n * In this case, we are calculating the total scale factor for the interest bearing extension which is the product of two exponential functions:\n * totalScale = e^(r1 * t1) * e^(r2 * t2)\n * where r1 and r2 are the interest rates before and after the last update, and t1 and t2 are the times in years between\n * the initialization timestamp and the last update timestamp, and between the last update timestamp and the current timestamp.\n *\n * @param amount Amount of tokens to be converted\n * @param decimals Number of decimals of the mint\n * @param currentTimestamp Current timestamp in seconds\n * @param lastUpdateTimestamp Last time the interest rate was updated in seconds\n * @param initializationTimestamp Time the interest bearing extension was initialized in seconds\n * @param preUpdateAverageRate Interest rate in basis points (1 basis point = 0.01%) before last update\n * @param currentRate Current interest rate in basis points\n *\n * @return Amount scaled by accrued interest as a string with appropriate decimal places\n */\nexport function amountToUiAmountForInterestBearingMintWithoutSimulation(\n amount: bigint,\n decimals: number,\n currentTimestamp: number,\n lastUpdateTimestamp: number,\n initializationTimestamp: number,\n preUpdateAverageRate: number,\n currentRate: number\n): string {\n const totalScale = calculateTotalScale({\n currentTimestamp,\n lastUpdateTimestamp,\n initializationTimestamp,\n preUpdateAverageRate,\n currentRate,\n });\n\n // Scale the amount by the total interest factor\n const scaledAmount = Number(amount) * totalScale;\n const decimalFactor = getDecimalFactor(decimals);\n\n return (Math.trunc(scaledAmount) / decimalFactor).toString();\n}\n\n/**\n * Convert an amount with interest back to the original amount without interest\n * This implements the same logic as the CPI instruction available in /token/program-2022/src/extension/interest_bearing_mint/mod.rs\n *\n * @param uiAmount UI Amount (principal plus continuously compounding interest) to be converted back to original principal\n * @param decimals Number of decimals for the mint\n * @param currentTimestamp Current timestamp in seconds\n * @param lastUpdateTimestamp Last time the interest rate was updated in seconds\n * @param initializationTimestamp Time the interest bearing extension was initialized in seconds\n * @param preUpdateAverageRate Interest rate in basis points (hundredths of a percent) before the last update\n * @param currentRate Current interest rate in basis points\n *\n * In general to calculate the principal from the UI amount, the formula is:\n * P = A / (e^(r * t)) where\n * P = principal\n * A = UI amount\n * r = annual interest rate (as a decimal, e.g., 5% = 0.05)\n * t = time in years\n *\n * In this case, we are calculating the principal by dividing the UI amount by the total scale factor which is the product of two exponential functions:\n * totalScale = e^(r1 * t1) * e^(r2 * t2)\n * where r1 is the pre-update average rate, r2 is the current rate, t1 is the time in years between the initialization timestamp and the last update timestamp,\n * and t2 is the time in years between the last update timestamp and the current timestamp.\n * then to calculate the principal, we divide the UI amount by the total scale factor:\n * P = A / totalScale\n *\n * @return Original amount (principal) without interest\n */\nexport function uiAmountToAmountForInterestBearingMintWithoutSimulation(\n uiAmount: string,\n decimals: number,\n currentTimestamp: number,\n lastUpdateTimestamp: number,\n initializationTimestamp: number,\n preUpdateAverageRate: number,\n currentRate: number\n): bigint {\n const uiAmountNumber = parseFloat(uiAmount);\n const decimalsFactor = getDecimalFactor(decimals);\n const uiAmountScaled = uiAmountNumber * decimalsFactor;\n\n const totalScale = calculateTotalScale({\n currentTimestamp,\n lastUpdateTimestamp,\n initializationTimestamp,\n preUpdateAverageRate,\n currentRate,\n });\n\n // Calculate original principal by dividing the UI amount by the total scale\n const originalPrincipal = uiAmountScaled / totalScale;\n return BigInt(Math.trunc(originalPrincipal));\n}\n\n// ========== SCALED UI AMOUNT MINT FUNCTIONS ==========\n\n/**\n * Convert amount to UiAmount for a mint with scaled UI amount extension\n * @param amount Amount of tokens to be converted\n * @param decimals Number of decimals of the mint\n * @param multiplier Multiplier to scale the amount\n * @return Scaled UI amount as a string\n */\nexport function amountToUiAmountForScaledUiAmountMintWithoutSimulation(\n amount: bigint,\n decimals: number,\n multiplier: number\n): string {\n const scaledAmount = Number(amount) * multiplier;\n const decimalFactor = getDecimalFactor(decimals);\n return (Math.trunc(scaledAmount) / decimalFactor).toString();\n}\n\n/**\n * Convert a UI amount back to the raw amount for a mint with a scaled UI amount extension\n * @param uiAmount UI Amount to be converted back to raw amount\n * @param decimals Number of decimals for the mint\n * @param multiplier Multiplier for the scaled UI amount\n *\n * @return Raw amount\n */\nexport function uiAmountToAmountForScaledUiAmountMintWithoutSimulation(\n uiAmount: string,\n decimals: number,\n multiplier: number\n): bigint {\n const uiAmountNumber = parseFloat(uiAmount);\n const decimalsFactor = getDecimalFactor(decimals);\n const uiAmountScaled = uiAmountNumber * decimalsFactor;\n const rawAmount = uiAmountScaled / multiplier;\n return BigInt(Math.trunc(rawAmount));\n}\n\n// ========== MAIN ENTRY POINT FUNCTIONS ==========\n\n/**\n * Convert amount to UiAmount for a mint without simulating a transaction\n * This implements the same logic as `process_amount_to_ui_amount` in\n * solana-labs/solana-program-library/token/program-2022/src/processor.rs\n * and `process_amount_to_ui_amount` in solana-labs/solana-program-library/token/program/src/processor.rs\n *\n * @param rpc Rpc to use\n * @param mint Mint to use for calculations\n * @param amount Amount of tokens to be converted to Ui Amount\n *\n * @return Ui Amount generated\n */\nexport async function amountToUiAmountForMintWithoutSimulation(\n rpc: Rpc,\n mint: Address,\n amount: bigint\n): Promise {\n const accountInfo = await fetchMint(rpc, mint);\n const extensions = unwrapOption(accountInfo.data.extensions);\n\n // Check for interest bearing mint extension\n const interestBearingMintConfigState = extensions?.find(\n (ext) => ext.__kind === 'InterestBearingConfig'\n );\n\n // Check for scaled UI amount extension\n const scaledUiAmountConfig = extensions?.find(\n (ext) => ext.__kind === 'ScaledUiAmountConfig'\n );\n\n // If no special extension, do standard conversion\n if (!interestBearingMintConfigState && !scaledUiAmountConfig) {\n const amountNumber = Number(amount);\n const decimalsFactor = getDecimalFactor(accountInfo.data.decimals);\n return (amountNumber / decimalsFactor).toString();\n }\n\n // Get timestamp if needed for special mint types\n const timestamp = await getSysvarClockTimestamp(rpc);\n\n // Handle interest bearing mint\n if (interestBearingMintConfigState) {\n return amountToUiAmountForInterestBearingMintWithoutSimulation(\n amount,\n accountInfo.data.decimals,\n Number(timestamp),\n Number(interestBearingMintConfigState.lastUpdateTimestamp),\n Number(interestBearingMintConfigState.initializationTimestamp),\n interestBearingMintConfigState.preUpdateAverageRate,\n interestBearingMintConfigState.currentRate\n );\n }\n\n // At this point, we know it must be a scaled UI amount mint\n if (scaledUiAmountConfig) {\n let multiplier = scaledUiAmountConfig.multiplier;\n // Use new multiplier if it's effective\n if (timestamp >= scaledUiAmountConfig.newMultiplierEffectiveTimestamp) {\n multiplier = scaledUiAmountConfig.newMultiplier;\n }\n return amountToUiAmountForScaledUiAmountMintWithoutSimulation(\n amount,\n accountInfo.data.decimals,\n multiplier\n );\n }\n\n // This should never happen due to the conditions above\n throw new Error('Unknown mint extension type');\n}\n\n/**\n * Convert a UI amount back to the raw amount\n *\n * @param rpc Rpc to use\n * @param mint Mint to use for calculations\n * @param uiAmount UI Amount to be converted back to raw amount\n *\n * @return Raw amount\n */\nexport async function uiAmountToAmountForMintWithoutSimulation(\n rpc: Rpc,\n mint: Address,\n uiAmount: string\n): Promise {\n const accountInfo = await fetchMint(rpc, mint);\n const extensions = unwrapOption(accountInfo.data.extensions);\n\n // Check for interest bearing mint extension\n const interestBearingMintConfigState = extensions?.find(\n (ext) => ext.__kind === 'InterestBearingConfig'\n );\n\n // Check for scaled UI amount extension\n const scaledUiAmountConfig = extensions?.find(\n (ext) => ext.__kind === 'ScaledUiAmountConfig'\n );\n\n // If no special extension, do standard conversion\n if (!interestBearingMintConfigState && !scaledUiAmountConfig) {\n const uiAmountScaled =\n parseFloat(uiAmount) * getDecimalFactor(accountInfo.data.decimals);\n return BigInt(Math.trunc(uiAmountScaled));\n }\n\n // Get timestamp if needed for special mint types\n const timestamp = await getSysvarClockTimestamp(rpc);\n\n // Handle interest bearing mint\n if (interestBearingMintConfigState) {\n return uiAmountToAmountForInterestBearingMintWithoutSimulation(\n uiAmount,\n accountInfo.data.decimals,\n Number(timestamp),\n Number(interestBearingMintConfigState.lastUpdateTimestamp),\n Number(interestBearingMintConfigState.initializationTimestamp),\n interestBearingMintConfigState.preUpdateAverageRate,\n interestBearingMintConfigState.currentRate\n );\n }\n\n // At this point, we know it must be a scaled UI amount mint\n if (scaledUiAmountConfig) {\n let multiplier = scaledUiAmountConfig.multiplier;\n // Use new multiplier if it's effective\n if (timestamp >= scaledUiAmountConfig.newMultiplierEffectiveTimestamp) {\n multiplier = scaledUiAmountConfig.newMultiplier;\n }\n return uiAmountToAmountForScaledUiAmountMintWithoutSimulation(\n uiAmount,\n accountInfo.data.decimals,\n multiplier\n );\n }\n\n // This should never happen due to the conditions above\n throw new Error('Unknown mint extension type');\n}\n","import {\n Address,\n Instruction,\n isNone,\n isOption,\n TransactionSigner,\n wrapNullable,\n} from '@solana/kit';\nimport {\n ExtensionArgs,\n getDisableMemoTransfersInstruction,\n getEnableMemoTransfersInstruction,\n getEnableCpiGuardInstruction,\n getDisableCpiGuardInstruction,\n getInitializeConfidentialTransferMintInstruction,\n getInitializeDefaultAccountStateInstruction,\n getInitializeGroupMemberPointerInstruction,\n getInitializeGroupPointerInstruction,\n getInitializeInterestBearingMintInstruction,\n getInitializeMetadataPointerInstruction,\n getInitializeMintCloseAuthorityInstruction,\n getInitializeTokenGroupInstruction,\n getInitializeTokenMetadataInstruction,\n getInitializeTransferFeeConfigInstruction,\n getInitializeNonTransferableMintInstruction,\n getInitializeTransferHookInstruction,\n getInitializePermanentDelegateInstruction,\n getInitializeScaledUiAmountMintInstruction,\n getInitializeConfidentialTransferFeeInstruction,\n getInitializePausableConfigInstruction,\n} from './generated';\n\n/**\n * Given a mint address and a list of mint extensions, returns a list of\n * instructions that MUST be run _before_ the `initializeMint` instruction\n * to properly initialize the given extensions on the mint account.\n */\nexport function getPreInitializeInstructionsForMintExtensions(\n mint: Address,\n extensions: ExtensionArgs[]\n): Instruction[] {\n return extensions.flatMap((extension) => {\n switch (extension.__kind) {\n case 'ConfidentialTransferMint':\n return [\n getInitializeConfidentialTransferMintInstruction({\n mint,\n ...extension,\n }),\n ];\n case 'DefaultAccountState':\n return [\n getInitializeDefaultAccountStateInstruction({\n mint,\n state: extension.state,\n }),\n ];\n case 'TransferFeeConfig':\n return [\n getInitializeTransferFeeConfigInstruction({\n mint,\n transferFeeConfigAuthority: extension.transferFeeConfigAuthority,\n withdrawWithheldAuthority: extension.withdrawWithheldAuthority,\n transferFeeBasisPoints:\n extension.newerTransferFee.transferFeeBasisPoints,\n maximumFee: extension.newerTransferFee.maximumFee,\n }),\n ];\n case 'MetadataPointer':\n return [\n getInitializeMetadataPointerInstruction({\n mint,\n authority: extension.authority,\n metadataAddress: extension.metadataAddress,\n }),\n ];\n case 'InterestBearingConfig':\n return [\n getInitializeInterestBearingMintInstruction({\n mint,\n rateAuthority: extension.rateAuthority,\n rate: extension.currentRate,\n }),\n ];\n case 'ScaledUiAmountConfig':\n return [\n getInitializeScaledUiAmountMintInstruction({\n mint,\n authority: extension.authority,\n multiplier: extension.multiplier,\n }),\n ];\n case 'PausableConfig':\n return [\n getInitializePausableConfigInstruction({\n mint,\n authority: extension.authority,\n }),\n ];\n case 'GroupPointer':\n return [\n getInitializeGroupPointerInstruction({\n mint,\n authority: extension.authority,\n groupAddress: extension.groupAddress,\n }),\n ];\n case 'GroupMemberPointer':\n return [\n getInitializeGroupMemberPointerInstruction({\n mint,\n authority: extension.authority,\n memberAddress: extension.memberAddress,\n }),\n ];\n case 'NonTransferable':\n return getInitializeNonTransferableMintInstruction({ mint });\n case 'TransferHook':\n return [\n getInitializeTransferHookInstruction({\n mint,\n authority: extension.authority,\n programId: extension.programId,\n }),\n ];\n case 'PermanentDelegate':\n return getInitializePermanentDelegateInstruction({\n mint,\n delegate: extension.delegate,\n });\n case 'ConfidentialTransferFee':\n return [\n getInitializeConfidentialTransferFeeInstruction({\n mint,\n authority: extension.authority,\n withdrawWithheldAuthorityElGamalPubkey: extension.elgamalPubkey,\n }),\n ];\n case 'MintCloseAuthority':\n return getInitializeMintCloseAuthorityInstruction({\n closeAuthority: extension.closeAuthority,\n mint,\n });\n default:\n return [];\n }\n });\n}\n\n/**\n * Given a mint address and a list of mint extensions, returns a list of\n * instructions that MUST be run _after_ the `initializeMint` instruction\n * to properly initialize the given extensions on the mint account.\n */\nexport function getPostInitializeInstructionsForMintExtensions(\n mint: Address,\n authority: TransactionSigner,\n extensions: ExtensionArgs[]\n): Instruction[] {\n return extensions.flatMap((extension): Instruction[] => {\n switch (extension.__kind) {\n case 'TokenMetadata':\n // eslint-disable-next-line no-case-declarations\n const tokenMetadataUpdateAuthority = isOption(extension.updateAuthority)\n ? extension.updateAuthority\n : wrapNullable(extension.updateAuthority);\n if (isNone(tokenMetadataUpdateAuthority)) {\n return [];\n }\n return [\n getInitializeTokenMetadataInstruction({\n metadata: mint,\n updateAuthority: tokenMetadataUpdateAuthority.value,\n mint,\n mintAuthority: authority,\n name: extension.name,\n symbol: extension.symbol,\n uri: extension.uri,\n }),\n ];\n case 'TokenGroup':\n return [\n getInitializeTokenGroupInstruction({\n group: mint,\n updateAuthority: isOption(extension.updateAuthority)\n ? extension.updateAuthority\n : wrapNullable(extension.updateAuthority),\n mint,\n mintAuthority: authority,\n maxSize: extension.maxSize,\n }),\n ];\n default:\n return [];\n }\n });\n}\n\n/**\n * Given a token address, its owner and a list of token extensions, returns a list\n * of instructions that MUST be run _after_ the `initializeAccount` instruction\n * to properly initialize the given extensions on the token account.\n */\nexport function getPostInitializeInstructionsForTokenExtensions(\n token: Address,\n owner: TransactionSigner | Address,\n extensions: ExtensionArgs[],\n multiSigners?: TransactionSigner[]\n): Instruction[] {\n return extensions.flatMap((extension) => {\n switch (extension.__kind) {\n case 'MemoTransfer':\n return [\n extension.requireIncomingTransferMemos\n ? getEnableMemoTransfersInstruction({ owner, token, multiSigners })\n : getDisableMemoTransfersInstruction({\n owner,\n token,\n multiSigners,\n }),\n ];\n case 'CpiGuard':\n return [\n extension.lockCpi\n ? getEnableCpiGuardInstruction({ owner, token, multiSigners })\n : getDisableCpiGuardInstruction({\n owner,\n token,\n multiSigners,\n }),\n ];\n default:\n return [];\n }\n });\n}\n","import {\n getArrayEncoder,\n getConstantEncoder,\n getHiddenPrefixEncoder,\n getU8Encoder,\n} from '@solana/kit';\nimport { ExtensionArgs, getExtensionEncoder } from './generated';\n\nconst TOKEN_BASE_SIZE = 165;\n\nexport function getTokenSize(extensions?: ExtensionArgs[]): number {\n if (extensions == null) return TOKEN_BASE_SIZE;\n const tvlEncoder = getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(getU8Encoder().encode(2))]\n );\n return TOKEN_BASE_SIZE + tvlEncoder.encode(extensions).length;\n}\n","import {\n getArrayEncoder,\n getConstantEncoder,\n getHiddenPrefixEncoder,\n getU8Encoder,\n padLeftEncoder,\n} from '@solana/kit';\nimport { ExtensionArgs, getExtensionEncoder } from './generated';\n\nconst MINT_BASE_SIZE = 82;\n\nexport function getMintSize(extensions?: ExtensionArgs[]): number {\n if (extensions == null) return MINT_BASE_SIZE;\n const tvlEncoder = getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(padLeftEncoder(getU8Encoder(), 83).encode(1))]\n );\n return MINT_BASE_SIZE + tvlEncoder.encode(extensions).length;\n}\n","/**\n * Token program addresses for SPL Token and Token-2022\n * These addresses are the same across all Solana networks (mainnet, devnet, testnet)\n */\nexport const TOKEN_PROGRAM_ADDRESS = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\";\nexport const TOKEN_2022_PROGRAM_ADDRESS = \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\";\nexport const COMPUTE_BUDGET_PROGRAM_ADDRESS = \"ComputeBudget111111111111111111111111111111\";\nexport const MEMO_PROGRAM_ADDRESS = \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\";\n\n/**\n * Phantom/Solflare Lighthouse program address\n * Phantom and Solflare wallets inject Lighthouse instructions for user protection on mainnet transactions.\n * - Phantom adds 1 Lighthouse instruction (4th instruction)\n * - Solflare adds 2 Lighthouse instructions (4th and 5th instructions)\n * We allow these as optional instructions to support these wallets.\n * See: https://github.com/x402-foundation/x402/issues/828\n */\nexport const LIGHTHOUSE_PROGRAM_ADDRESS = \"L2TExMFKdjpN9kozasaurPirfHy9P8sbXoAN1qA3S95\";\n\n/**\n * Default RPC URLs for Solana networks\n */\nexport const DEVNET_RPC_URL = \"https://api.devnet.solana.com\";\nexport const TESTNET_RPC_URL = \"https://api.testnet.solana.com\";\nexport const MAINNET_RPC_URL = \"https://api.mainnet-beta.solana.com\";\nexport const DEVNET_WS_URL = \"wss://api.devnet.solana.com\";\nexport const TESTNET_WS_URL = \"wss://api.testnet.solana.com\";\nexport const MAINNET_WS_URL = \"wss://api.mainnet-beta.solana.com\";\n\n/**\n * USDC token mint addresses (default stablecoin)\n */\nexport const USDC_MAINNET_ADDRESS = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nexport const USDC_DEVNET_ADDRESS = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\";\nexport const USDC_TESTNET_ADDRESS = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\"; // Same as devnet\n\n/**\n * Compute budget configuration\n * All prices are in microlamports (1 lamport = 1,000,000 microlamports)\n */\nexport const DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\nexport const MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 5_000_000; // 5 lamports\nexport const DEFAULT_COMPUTE_UNIT_LIMIT = 20_000;\n\n/**\n * How long a transaction is held in the duplicate settlement cache (ms).\n * Covers the Solana blockhash lifetime (~60-90s) with margin.\n */\nexport const SETTLEMENT_TTL_MS = 120_000;\n\n/**\n * Solana address validation regex (base58, 32-44 characters)\n */\nexport const SVM_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\n/**\n * CAIP-2 network identifiers for Solana (V2)\n */\nexport const SOLANA_MAINNET_CAIP2 = \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\";\nexport const SOLANA_DEVNET_CAIP2 = \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\";\nexport const SOLANA_TESTNET_CAIP2 = \"solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z\";\n\n/**\n * V1 to V2 network identifier mappings (for backwards compatibility)\n * V1 used simple names like solana, V2 uses CAIP-2\n */\nexport const V1_TO_V2_NETWORK_MAP: Record = {\n solana: SOLANA_MAINNET_CAIP2,\n \"solana-devnet\": SOLANA_DEVNET_CAIP2,\n \"solana-testnet\": SOLANA_TESTNET_CAIP2,\n};\n","import {\n getBase64Encoder,\n getTransactionDecoder,\n getCompiledTransactionMessageDecoder,\n type Transaction,\n createSolanaRpc,\n devnet,\n testnet,\n mainnet,\n type RpcDevnet,\n type SolanaRpcApiDevnet,\n type RpcTestnet,\n type SolanaRpcApiTestnet,\n type RpcMainnet,\n type SolanaRpcApiMainnet,\n} from \"@solana/kit\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { TOKEN_2022_PROGRAM_ADDRESS } from \"@solana-program/token-2022\";\nimport type { Network } from \"@x402/core/types\";\nimport {\n SVM_ADDRESS_REGEX,\n DEVNET_RPC_URL,\n TESTNET_RPC_URL,\n MAINNET_RPC_URL,\n USDC_MAINNET_ADDRESS,\n USDC_DEVNET_ADDRESS,\n USDC_TESTNET_ADDRESS,\n SOLANA_MAINNET_CAIP2,\n SOLANA_DEVNET_CAIP2,\n SOLANA_TESTNET_CAIP2,\n V1_TO_V2_NETWORK_MAP,\n} from \"./constants\";\nimport type { ExactSvmPayloadV1 } from \"./types\";\n\n/**\n * Normalize network identifier to CAIP-2 format\n * Handles both V1 names (solana, solana-devnet) and V2 CAIP-2 format\n *\n * @param network - Network identifier (V1 or V2 format)\n * @returns CAIP-2 network identifier\n */\nexport function normalizeNetwork(network: Network): string {\n // If it's already CAIP-2 format (contains \":\"), validate it's supported\n if (network.includes(\":\")) {\n const supported = [SOLANA_MAINNET_CAIP2, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2];\n if (!supported.includes(network)) {\n throw new Error(`Unsupported SVM network: ${network}`);\n }\n return network;\n }\n\n // Otherwise, it's a V1 network name, convert to CAIP-2\n const caip2Network = V1_TO_V2_NETWORK_MAP[network];\n if (!caip2Network) {\n throw new Error(`Unsupported SVM network: ${network}`);\n }\n return caip2Network;\n}\n\n/**\n * Validate Solana address format\n *\n * @param address - Base58 encoded address string\n * @returns true if address is valid, false otherwise\n */\nexport function validateSvmAddress(address: string): boolean {\n return SVM_ADDRESS_REGEX.test(address);\n}\n\n/**\n * Decode a base64 encoded transaction from an SVM payload\n *\n * @param svmPayload - The SVM payload containing a base64 encoded transaction\n * @returns Decoded Transaction object\n */\nexport function decodeTransactionFromPayload(svmPayload: ExactSvmPayloadV1): Transaction {\n try {\n const base64Encoder = getBase64Encoder();\n const transactionBytes = base64Encoder.encode(svmPayload.transaction);\n const transactionDecoder = getTransactionDecoder();\n return transactionDecoder.decode(transactionBytes);\n } catch (error) {\n console.error(\"Error decoding transaction:\", error);\n throw new Error(\"invalid_exact_svm_payload_transaction\");\n }\n}\n\n/**\n * Extract the token sender (owner of the source token account) from a TransferChecked instruction\n *\n * @param transaction - The decoded transaction\n * @returns The token payer address as a base58 string\n */\nexport function getTokenPayerFromTransaction(transaction: Transaction): string {\n const compiled = getCompiledTransactionMessageDecoder().decode(transaction.messageBytes);\n const staticAccounts = compiled.staticAccounts ?? [];\n const instructions = compiled.instructions ?? [];\n\n for (const ix of instructions) {\n const programIndex = ix.programAddressIndex;\n const programAddress = staticAccounts[programIndex].toString();\n\n // Check if this is a token program instruction\n if (\n programAddress === TOKEN_PROGRAM_ADDRESS.toString() ||\n programAddress === TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n const accountIndices: number[] = ix.accountIndices ?? [];\n // TransferChecked account order: [source, mint, destination, owner, ...]\n if (accountIndices.length >= 4) {\n const ownerIndex = accountIndices[3];\n const ownerAddress = staticAccounts[ownerIndex].toString();\n if (ownerAddress) return ownerAddress;\n }\n }\n }\n\n return \"\";\n}\n\n/**\n * Create an RPC client for the specified network\n *\n * @param network - Network identifier (CAIP-2 or V1 format)\n * @param customRpcUrl - Optional custom RPC URL\n * @returns RPC client for the specified network\n */\nexport function createRpcClient(\n network: Network,\n customRpcUrl?: string,\n):\n | RpcDevnet\n | RpcTestnet\n | RpcMainnet {\n const caip2Network = normalizeNetwork(network);\n\n switch (caip2Network) {\n case SOLANA_DEVNET_CAIP2: {\n const url = customRpcUrl || DEVNET_RPC_URL;\n return createSolanaRpc(devnet(url)) as RpcDevnet;\n }\n case SOLANA_TESTNET_CAIP2: {\n const url = customRpcUrl || TESTNET_RPC_URL;\n return createSolanaRpc(testnet(url)) as RpcTestnet;\n }\n case SOLANA_MAINNET_CAIP2: {\n const url = customRpcUrl || MAINNET_RPC_URL;\n return createSolanaRpc(mainnet(url)) as RpcMainnet;\n }\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n}\n\n/**\n * Get the default USDC mint address for a network\n *\n * @param network - Network identifier (CAIP-2 or V1 format)\n * @returns USDC mint address for the network\n */\nexport function getUsdcAddress(network: Network): string {\n const caip2Network = normalizeNetwork(network);\n\n switch (caip2Network) {\n case SOLANA_MAINNET_CAIP2:\n return USDC_MAINNET_ADDRESS;\n case SOLANA_DEVNET_CAIP2:\n return USDC_DEVNET_ADDRESS;\n case SOLANA_TESTNET_CAIP2:\n return USDC_TESTNET_ADDRESS;\n default:\n throw new Error(`No USDC address configured for network: ${network}`);\n }\n}\n\n/**\n * Convert a decimal amount to token smallest units\n *\n * @param decimalAmount - The decimal amount (e.g., \"0.10\")\n * @param decimals - The number of decimals for the token (e.g., 6 for USDC)\n * @returns The amount in smallest units as a string\n */\nexport function convertToTokenAmount(decimalAmount: string, decimals: number): string {\n const amount = parseFloat(decimalAmount);\n if (isNaN(amount)) {\n throw new Error(`Invalid amount: ${decimalAmount}`);\n }\n // Convert to smallest unit (e.g., for USDC with 6 decimals: 0.10 * 10^6 = 100000)\n const [intPart, decPart = \"\"] = String(amount).split(\".\");\n const paddedDec = decPart.padEnd(decimals, \"0\").slice(0, decimals);\n const tokenAmount = (intPart + paddedDec).replace(/^0+/, \"\") || \"0\";\n return tokenAmount;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedRequestHeapFrameInstruction,\n type ParsedRequestUnitsInstruction,\n type ParsedSetComputeUnitLimitInstruction,\n type ParsedSetComputeUnitPriceInstruction,\n type ParsedSetLoadedAccountsDataSizeLimitInstruction,\n} from '../instructions';\n\nexport const COMPUTE_BUDGET_PROGRAM_ADDRESS =\n 'ComputeBudget111111111111111111111111111111' as Address<'ComputeBudget111111111111111111111111111111'>;\n\nexport enum ComputeBudgetInstruction {\n RequestUnits,\n RequestHeapFrame,\n SetComputeUnitLimit,\n SetComputeUnitPrice,\n SetLoadedAccountsDataSizeLimit,\n}\n\nexport function identifyComputeBudgetInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): ComputeBudgetInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return ComputeBudgetInstruction.RequestUnits;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return ComputeBudgetInstruction.RequestHeapFrame;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return ComputeBudgetInstruction.SetComputeUnitLimit;\n }\n if (containsBytes(data, getU8Encoder().encode(3), 0)) {\n return ComputeBudgetInstruction.SetComputeUnitPrice;\n }\n if (containsBytes(data, getU8Encoder().encode(4), 0)) {\n return ComputeBudgetInstruction.SetLoadedAccountsDataSizeLimit;\n }\n throw new Error(\n 'The provided instruction could not be identified as a computeBudget instruction.'\n );\n}\n\nexport type ParsedComputeBudgetInstruction<\n TProgram extends string = 'ComputeBudget111111111111111111111111111111',\n> =\n | ({\n instructionType: ComputeBudgetInstruction.RequestUnits;\n } & ParsedRequestUnitsInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.RequestHeapFrame;\n } & ParsedRequestHeapFrameInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.SetComputeUnitLimit;\n } & ParsedSetComputeUnitLimitInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.SetComputeUnitPrice;\n } & ParsedSetComputeUnitPriceInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.SetLoadedAccountsDataSizeLimit;\n } & ParsedSetLoadedAccountsDataSizeLimitInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const REQUEST_HEAP_FRAME_DISCRIMINATOR = 1;\n\nexport function getRequestHeapFrameDiscriminatorBytes() {\n return getU8Encoder().encode(REQUEST_HEAP_FRAME_DISCRIMINATOR);\n}\n\nexport type RequestHeapFrameInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type RequestHeapFrameInstructionData = {\n discriminator: number;\n /**\n * Requested transaction-wide program heap size in bytes.\n * Must be multiple of 1024. Applies to each program, including CPIs.\n */\n bytes: number;\n};\n\nexport type RequestHeapFrameInstructionDataArgs = {\n /**\n * Requested transaction-wide program heap size in bytes.\n * Must be multiple of 1024. Applies to each program, including CPIs.\n */\n bytes: number;\n};\n\nexport function getRequestHeapFrameInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['bytes', getU32Encoder()],\n ]),\n (value) => ({ ...value, discriminator: REQUEST_HEAP_FRAME_DISCRIMINATOR })\n );\n}\n\nexport function getRequestHeapFrameInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['bytes', getU32Decoder()],\n ]);\n}\n\nexport function getRequestHeapFrameInstructionDataCodec(): FixedSizeCodec<\n RequestHeapFrameInstructionDataArgs,\n RequestHeapFrameInstructionData\n> {\n return combineCodec(\n getRequestHeapFrameInstructionDataEncoder(),\n getRequestHeapFrameInstructionDataDecoder()\n );\n}\n\nexport type RequestHeapFrameInput = {\n bytes: RequestHeapFrameInstructionDataArgs['bytes'];\n};\n\nexport function getRequestHeapFrameInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: RequestHeapFrameInput,\n config?: { programAddress?: TProgramAddress }\n): RequestHeapFrameInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getRequestHeapFrameInstructionDataEncoder().encode(\n args as RequestHeapFrameInstructionDataArgs\n ),\n programAddress,\n } as RequestHeapFrameInstruction);\n}\n\nexport type ParsedRequestHeapFrameInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: RequestHeapFrameInstructionData;\n};\n\nexport function parseRequestHeapFrameInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedRequestHeapFrameInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getRequestHeapFrameInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const REQUEST_UNITS_DISCRIMINATOR = 0;\n\nexport function getRequestUnitsDiscriminatorBytes() {\n return getU8Encoder().encode(REQUEST_UNITS_DISCRIMINATOR);\n}\n\nexport type RequestUnitsInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type RequestUnitsInstructionData = {\n discriminator: number;\n /** Units to request for transaction-wide compute. */\n units: number;\n /** Prioritization fee lamports. */\n additionalFee: number;\n};\n\nexport type RequestUnitsInstructionDataArgs = {\n /** Units to request for transaction-wide compute. */\n units: number;\n /** Prioritization fee lamports. */\n additionalFee: number;\n};\n\nexport function getRequestUnitsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['units', getU32Encoder()],\n ['additionalFee', getU32Encoder()],\n ]),\n (value) => ({ ...value, discriminator: REQUEST_UNITS_DISCRIMINATOR })\n );\n}\n\nexport function getRequestUnitsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['units', getU32Decoder()],\n ['additionalFee', getU32Decoder()],\n ]);\n}\n\nexport function getRequestUnitsInstructionDataCodec(): FixedSizeCodec<\n RequestUnitsInstructionDataArgs,\n RequestUnitsInstructionData\n> {\n return combineCodec(\n getRequestUnitsInstructionDataEncoder(),\n getRequestUnitsInstructionDataDecoder()\n );\n}\n\nexport type RequestUnitsInput = {\n units: RequestUnitsInstructionDataArgs['units'];\n additionalFee: RequestUnitsInstructionDataArgs['additionalFee'];\n};\n\nexport function getRequestUnitsInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: RequestUnitsInput,\n config?: { programAddress?: TProgramAddress }\n): RequestUnitsInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getRequestUnitsInstructionDataEncoder().encode(\n args as RequestUnitsInstructionDataArgs\n ),\n programAddress,\n } as RequestUnitsInstruction);\n}\n\nexport type ParsedRequestUnitsInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = { programAddress: Address; data: RequestUnitsInstructionData };\n\nexport function parseRequestUnitsInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedRequestUnitsInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getRequestUnitsInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR = 2;\n\nexport function getSetComputeUnitLimitDiscriminatorBytes() {\n return getU8Encoder().encode(SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR);\n}\n\nexport type SetComputeUnitLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type SetComputeUnitLimitInstructionData = {\n discriminator: number;\n /** Transaction-wide compute unit limit. */\n units: number;\n};\n\nexport type SetComputeUnitLimitInstructionDataArgs = {\n /** Transaction-wide compute unit limit. */\n units: number;\n};\n\nexport function getSetComputeUnitLimitInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['units', getU32Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetComputeUnitLimitInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['units', getU32Decoder()],\n ]);\n}\n\nexport function getSetComputeUnitLimitInstructionDataCodec(): FixedSizeCodec<\n SetComputeUnitLimitInstructionDataArgs,\n SetComputeUnitLimitInstructionData\n> {\n return combineCodec(\n getSetComputeUnitLimitInstructionDataEncoder(),\n getSetComputeUnitLimitInstructionDataDecoder()\n );\n}\n\nexport type SetComputeUnitLimitInput = {\n units: SetComputeUnitLimitInstructionDataArgs['units'];\n};\n\nexport function getSetComputeUnitLimitInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: SetComputeUnitLimitInput,\n config?: { programAddress?: TProgramAddress }\n): SetComputeUnitLimitInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getSetComputeUnitLimitInstructionDataEncoder().encode(\n args as SetComputeUnitLimitInstructionDataArgs\n ),\n programAddress,\n } as SetComputeUnitLimitInstruction);\n}\n\nexport type ParsedSetComputeUnitLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: SetComputeUnitLimitInstructionData;\n};\n\nexport function parseSetComputeUnitLimitInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedSetComputeUnitLimitInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getSetComputeUnitLimitInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR = 3;\n\nexport function getSetComputeUnitPriceDiscriminatorBytes() {\n return getU8Encoder().encode(SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR);\n}\n\nexport type SetComputeUnitPriceInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type SetComputeUnitPriceInstructionData = {\n discriminator: number;\n /** Transaction compute unit price used for prioritization fees. */\n microLamports: bigint;\n};\n\nexport type SetComputeUnitPriceInstructionDataArgs = {\n /** Transaction compute unit price used for prioritization fees. */\n microLamports: number | bigint;\n};\n\nexport function getSetComputeUnitPriceInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['microLamports', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetComputeUnitPriceInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['microLamports', getU64Decoder()],\n ]);\n}\n\nexport function getSetComputeUnitPriceInstructionDataCodec(): FixedSizeCodec<\n SetComputeUnitPriceInstructionDataArgs,\n SetComputeUnitPriceInstructionData\n> {\n return combineCodec(\n getSetComputeUnitPriceInstructionDataEncoder(),\n getSetComputeUnitPriceInstructionDataDecoder()\n );\n}\n\nexport type SetComputeUnitPriceInput = {\n microLamports: SetComputeUnitPriceInstructionDataArgs['microLamports'];\n};\n\nexport function getSetComputeUnitPriceInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: SetComputeUnitPriceInput,\n config?: { programAddress?: TProgramAddress }\n): SetComputeUnitPriceInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getSetComputeUnitPriceInstructionDataEncoder().encode(\n args as SetComputeUnitPriceInstructionDataArgs\n ),\n programAddress,\n } as SetComputeUnitPriceInstruction);\n}\n\nexport type ParsedSetComputeUnitPriceInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: SetComputeUnitPriceInstructionData;\n};\n\nexport function parseSetComputeUnitPriceInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedSetComputeUnitPriceInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getSetComputeUnitPriceInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_DISCRIMINATOR = 4;\n\nexport function getSetLoadedAccountsDataSizeLimitDiscriminatorBytes() {\n return getU8Encoder().encode(\n SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_DISCRIMINATOR\n );\n}\n\nexport type SetLoadedAccountsDataSizeLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type SetLoadedAccountsDataSizeLimitInstructionData = {\n discriminator: number;\n accountDataSizeLimit: number;\n};\n\nexport type SetLoadedAccountsDataSizeLimitInstructionDataArgs = {\n accountDataSizeLimit: number;\n};\n\nexport function getSetLoadedAccountsDataSizeLimitInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['accountDataSizeLimit', getU32Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetLoadedAccountsDataSizeLimitInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['accountDataSizeLimit', getU32Decoder()],\n ]);\n}\n\nexport function getSetLoadedAccountsDataSizeLimitInstructionDataCodec(): FixedSizeCodec<\n SetLoadedAccountsDataSizeLimitInstructionDataArgs,\n SetLoadedAccountsDataSizeLimitInstructionData\n> {\n return combineCodec(\n getSetLoadedAccountsDataSizeLimitInstructionDataEncoder(),\n getSetLoadedAccountsDataSizeLimitInstructionDataDecoder()\n );\n}\n\nexport type SetLoadedAccountsDataSizeLimitInput = {\n accountDataSizeLimit: SetLoadedAccountsDataSizeLimitInstructionDataArgs['accountDataSizeLimit'];\n};\n\nexport function getSetLoadedAccountsDataSizeLimitInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: SetLoadedAccountsDataSizeLimitInput,\n config?: { programAddress?: TProgramAddress }\n): SetLoadedAccountsDataSizeLimitInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getSetLoadedAccountsDataSizeLimitInstructionDataEncoder().encode(\n args as SetLoadedAccountsDataSizeLimitInstructionDataArgs\n ),\n programAddress,\n } as SetLoadedAccountsDataSizeLimitInstruction);\n}\n\nexport type ParsedSetLoadedAccountsDataSizeLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: SetLoadedAccountsDataSizeLimitInstructionData;\n};\n\nexport function parseSetLoadedAccountsDataSizeLimitInstruction<\n TProgram extends string,\n>(\n instruction: Instruction & InstructionWithData\n): ParsedSetLoadedAccountsDataSizeLimitInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getSetLoadedAccountsDataSizeLimitInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * A provisory compute unit limit is used to indicate that the transaction\n * should be estimated for compute units before being sent to the network.\n *\n * Setting it to zero ensures the transaction fails unless it is properly estimated.\n */\nexport const PROVISORY_COMPUTE_UNIT_LIMIT = 0;\n\n/**\n * The maximum compute unit limit that can be set for a transaction.\n */\nexport const MAX_COMPUTE_UNIT_LIMIT = 1_400_000;\n","import {\n BaseTransactionMessage,\n getU32Decoder,\n getU64Decoder,\n Instruction,\n MicroLamports,\n ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n COMPUTE_BUDGET_PROGRAM_ADDRESS,\n ComputeBudgetInstruction,\n identifyComputeBudgetInstruction,\n SetComputeUnitLimitInstruction,\n SetComputeUnitPriceInstruction,\n} from './generated';\n\n/**\n * Finds the index of the first `SetComputeUnitLimit` instruction in a transaction message\n * and its set limit, if any.\n */\nexport function getSetComputeUnitLimitInstructionIndexAndUnits(\n transactionMessage: BaseTransactionMessage\n): { index: number; units: number } | null {\n const index = getSetComputeUnitLimitInstructionIndex(transactionMessage);\n if (index < 0) {\n return null;\n }\n\n const units = getU32Decoder().decode(\n transactionMessage.instructions[index].data as ReadonlyUint8Array,\n 1\n );\n\n return { index, units };\n}\n\n/**\n * Finds the index of the first `SetComputeUnitLimit` instruction in a transaction message, if any.\n */\nexport function getSetComputeUnitLimitInstructionIndex(\n transactionMessage: BaseTransactionMessage\n) {\n return transactionMessage.instructions.findIndex(\n isSetComputeUnitLimitInstruction\n );\n}\n\n/**\n * Checks if the given instruction is a `SetComputeUnitLimit` instruction.\n */\nexport function isSetComputeUnitLimitInstruction(\n instruction: Instruction\n): instruction is SetComputeUnitLimitInstruction {\n return (\n instruction.programAddress === COMPUTE_BUDGET_PROGRAM_ADDRESS &&\n identifyComputeBudgetInstruction(instruction.data as Uint8Array) ===\n ComputeBudgetInstruction.SetComputeUnitLimit\n );\n}\n\n/**\n * Finds the index of the first `SetComputeUnitPrice` instruction in a transaction message\n * and its set micro-lamports, if any.\n */\nexport function getSetComputeUnitPriceInstructionIndexAndMicroLamports(\n transactionMessage: BaseTransactionMessage\n): { index: number; microLamports: MicroLamports } | null {\n const index = getSetComputeUnitPriceInstructionIndex(transactionMessage);\n if (index < 0) {\n return null;\n }\n\n const microLamports = getU64Decoder().decode(\n transactionMessage.instructions[index].data as ReadonlyUint8Array,\n 1\n ) as MicroLamports;\n\n return { index, microLamports };\n}\n\n/**\n * Finds the index of the first `SetComputeUnitPrice` instruction in a transaction message, if any.\n */\nexport function getSetComputeUnitPriceInstructionIndex(\n transactionMessage: BaseTransactionMessage\n) {\n return transactionMessage.instructions.findIndex(\n isSetComputeUnitPriceInstruction\n );\n}\n\n/**\n * Checks if the given instruction is a `SetComputeUnitPrice` instruction.\n */\nexport function isSetComputeUnitPriceInstruction(\n instruction: Instruction\n): instruction is SetComputeUnitPriceInstruction {\n return (\n instruction.programAddress === COMPUTE_BUDGET_PROGRAM_ADDRESS &&\n identifyComputeBudgetInstruction(instruction.data as Uint8Array) ===\n ComputeBudgetInstruction.SetComputeUnitPrice\n );\n}\n","import {\n appendTransactionMessageInstruction,\n BaseTransactionMessage,\n} from '@solana/kit';\nimport { PROVISORY_COMPUTE_UNIT_LIMIT } from './constants';\nimport { getSetComputeUnitLimitInstruction } from './generated';\nimport { getSetComputeUnitLimitInstructionIndexAndUnits } from './internal';\n\n/**\n * Appends a `SetComputeUnitLimit` instruction with a provisory\n * compute unit limit to a given transaction message\n * if and only if it does not already have one.\n *\n * @example\n * ```ts\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 0 }),\n * fillProvisorySetComputeUnitLimitInstruction,\n * // ...\n * );\n * ```\n */\nexport function fillProvisorySetComputeUnitLimitInstruction<\n TTransactionMessage extends BaseTransactionMessage,\n>(transactionMessage: TTransactionMessage) {\n return updateOrAppendSetComputeUnitLimitInstruction(\n (previousUnits) =>\n previousUnits === null ? PROVISORY_COMPUTE_UNIT_LIMIT : previousUnits,\n transactionMessage\n );\n}\n\n/**\n * Updates the first `SetComputeUnitLimit` instruction in a transaction message\n * with the given units, or appends a new instruction if none exists.\n * A function of the current value can be provided instead of a static value.\n *\n * @param units - The new compute unit limit, or a function that takes the previous\n * compute unit limit and returns the new limit.\n * @param transactionMessage - The transaction message to update.\n *\n * @example\n * ```ts\n * const updatedTransactionMessage = updateOrAppendSetComputeUnitLimitInstruction(\n * // E.g. Keep the current limit if it is set, otherwise set it to the maximum.\n * (currentUnits) => currentUnits === null ? MAX_COMPUTE_UNIT_LIMIT : currentUnits,\n * transactionMessage,\n * );\n * ```\n */\nexport function updateOrAppendSetComputeUnitLimitInstruction<\n TTransactionMessage extends BaseTransactionMessage,\n>(\n units: number | ((previousUnits: number | null) => number),\n transactionMessage: TTransactionMessage\n): TTransactionMessage {\n const getUnits = (previousUnits: number | null): number =>\n typeof units === 'function' ? units(previousUnits) : units;\n const instructionDetails =\n getSetComputeUnitLimitInstructionIndexAndUnits(transactionMessage);\n\n if (!instructionDetails) {\n return appendTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({ units: getUnits(null) }),\n transactionMessage\n ) as unknown as TTransactionMessage;\n }\n\n const { index, units: previousUnits } = instructionDetails;\n const newUnits = getUnits(previousUnits);\n if (newUnits === previousUnits) {\n return transactionMessage;\n }\n\n const newInstruction = getSetComputeUnitLimitInstruction({ units: newUnits });\n const newInstructions = [...transactionMessage.instructions];\n newInstructions.splice(index, 1, newInstruction);\n return Object.freeze({\n ...transactionMessage,\n instructions: newInstructions,\n });\n}\n","import {\n BaseTransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/kit';\nimport {\n MAX_COMPUTE_UNIT_LIMIT,\n PROVISORY_COMPUTE_UNIT_LIMIT,\n} from './constants';\nimport {\n EstimateComputeUnitLimitFactoryFunction,\n EstimateComputeUnitLimitFactoryFunctionConfig,\n} from './estimateComputeLimitInternal';\nimport { getSetComputeUnitLimitInstructionIndexAndUnits } from './internal';\nimport { updateOrAppendSetComputeUnitLimitInstruction } from './setComputeLimit';\n\ntype EstimateAndUpdateProvisoryComputeUnitLimitFactoryFunction = <\n TTransactionMessage extends BaseTransactionMessage &\n TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n config?: EstimateComputeUnitLimitFactoryFunctionConfig\n) => Promise;\n\n/**\n * Given a transaction message, if it does not have an explicit compute unit limit,\n * estimates the compute unit limit and updates the transaction message with\n * the estimated limit. Otherwise, returns the transaction message unchanged.\n *\n * It requires a function that estimates the compute unit limit.\n *\n * @example\n * ```ts\n * const estimateAndUpdateCUs = estimateAndUpdateProvisoryComputeUnitLimitFactory(\n * estimateComputeUnitLimitFactory({ rpc })\n * );\n *\n * const transactionMessageWithCUs = await estimateAndUpdateCUs(transactionMessage);\n * ```\n *\n * @see {@link estimateAndUpdateProvisoryComputeUnitLimitFactory}\n */\nexport function estimateAndUpdateProvisoryComputeUnitLimitFactory(\n estimateComputeUnitLimit: EstimateComputeUnitLimitFactoryFunction\n): EstimateAndUpdateProvisoryComputeUnitLimitFactoryFunction {\n return async function fn(transactionMessage, config) {\n const instructionDetails =\n getSetComputeUnitLimitInstructionIndexAndUnits(transactionMessage);\n\n // If the transaction message already has a compute unit limit instruction\n // which is set to a specific value — i.e. not 0 or the maximum limit —\n // we don't need to estimate the compute unit limit.\n if (\n instructionDetails &&\n instructionDetails.units !== PROVISORY_COMPUTE_UNIT_LIMIT &&\n instructionDetails.units !== MAX_COMPUTE_UNIT_LIMIT\n ) {\n return transactionMessage;\n }\n\n return updateOrAppendSetComputeUnitLimitInstruction(\n await estimateComputeUnitLimit(transactionMessage, config),\n transactionMessage\n );\n };\n}\n","import {\n BaseTransactionMessage,\n Commitment,\n compileTransaction,\n getBase64EncodedWireTransaction,\n isSolanaError,\n isTransactionMessageWithDurableNonceLifetime,\n pipe,\n Rpc,\n SimulateTransactionApi,\n Slot,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SolanaError,\n Transaction,\n TransactionMessageWithFeePayer,\n} from '@solana/kit';\nimport { updateOrAppendSetComputeUnitLimitInstruction } from './setComputeLimit';\nimport { MAX_COMPUTE_UNIT_LIMIT } from './constants';\n\nexport type EstimateComputeUnitLimitFactoryConfig = Readonly<{\n /** An object that supports the {@link SimulateTransactionApi} of the Solana RPC API */\n rpc: Rpc;\n}>;\n\nexport type EstimateComputeUnitLimitFactoryFunction = (\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer,\n config?: EstimateComputeUnitLimitFactoryFunctionConfig\n) => Promise;\n\nexport type EstimateComputeUnitLimitFactoryFunctionConfig = {\n abortSignal?: AbortSignal;\n /**\n * Compute the estimate as of the highest slot that has reached this level of commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /**\n * Prevents accessing stale data by enforcing that the RPC node has processed transactions up to\n * this slot\n */\n minContextSlot?: Slot;\n};\n\ntype EstimateComputeUnitLimitConfig =\n EstimateComputeUnitLimitFactoryFunctionConfig &\n Readonly<{\n rpc: Rpc;\n transactionMessage: BaseTransactionMessage &\n TransactionMessageWithFeePayer;\n }>;\n\n/**\n * Simulates a transaction message on the network and returns the number of compute units it\n * consumed during simulation.\n *\n * The estimate this function returns can be used to set a compute unit limit on the transaction.\n * Correctly budgeting a compute unit limit for your transaction message can increase the probability\n * that your transaction will be accepted for processing.\n *\n * If you don't declare a compute unit limit on your transaction, validators will assume an upper\n * limit of 200K compute units (CU) per instruction. Since validators have an incentive to pack as\n * many transactions into each block as possible, they may choose to include transactions that they\n * know will fit into the remaining compute budget for the current block over transactions that\n * might not. For this reason, you should set a compute unit limit on each of your transaction\n * messages, whenever possible.\n *\n * ## Example\n *\n * ```ts\n * import { getSetComputeLimitInstruction } from '@solana-program/compute-budget';\n * import { createSolanaRpc, getComputeUnitEstimateForTransactionMessageFactory, pipe } from '@solana/kit';\n *\n * // Create an estimator function.\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const getComputeUnitEstimateForTransactionMessage =\n * getComputeUnitEstimateForTransactionMessageFactory({ rpc });\n *\n * // Create your transaction message.\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * /* ... *\\/\n * );\n *\n * // Request an estimate of the actual compute units this message will consume.\n * const computeUnitsEstimate =\n * await getComputeUnitEstimateForTransactionMessage(transactionMessage);\n *\n * // Set the transaction message's compute unit budget.\n * const transactionMessageWithComputeUnitLimit = prependTransactionMessageInstruction(\n * getSetComputeLimitInstruction({ units: computeUnitsEstimate }),\n * transactionMessage,\n * );\n * ```\n *\n * > [!WARNING]\n * > The compute unit estimate is just that – an estimate. The compute unit consumption of the\n * > actual transaction might be higher or lower than what was observed in simulation. Unless you\n * > are confident that your particular transaction message will consume the same or fewer compute\n * > units as was estimated, you might like to augment the estimate by either a fixed number of CUs\n * > or a multiplier.\n *\n * > [!NOTE]\n * > If you are preparing an _unsigned_ transaction, destined to be signed and submitted to the\n * > network by a wallet, you might like to leave it up to the wallet to determine the compute unit\n * > limit. Consider that the wallet might have a more global view of how many compute units certain\n * > types of transactions consume, and might be able to make better estimates of an appropriate\n * > compute unit budget.\n */\nexport async function estimateComputeUnitLimit({\n transactionMessage,\n ...configs\n}: EstimateComputeUnitLimitConfig): Promise {\n const replaceRecentBlockhash =\n !isTransactionMessageWithDurableNonceLifetime(transactionMessage);\n const transaction = pipe(\n transactionMessage,\n (m) =>\n updateOrAppendSetComputeUnitLimitInstruction(MAX_COMPUTE_UNIT_LIMIT, m),\n compileTransaction\n );\n\n return await simulateTransactionAndGetConsumedUnits({\n transaction,\n replaceRecentBlockhash,\n ...configs,\n });\n}\n\ntype SimulateTransactionAndGetConsumedUnitsConfig = Omit<\n EstimateComputeUnitLimitConfig,\n 'transactionMessage'\n> &\n Readonly<{ replaceRecentBlockhash?: boolean; transaction: Transaction }>;\n\nasync function simulateTransactionAndGetConsumedUnits({\n abortSignal,\n rpc,\n transaction,\n ...simulateConfig\n}: SimulateTransactionAndGetConsumedUnitsConfig): Promise {\n const wireTransactionBytes = getBase64EncodedWireTransaction(transaction);\n\n try {\n const {\n value: { err: transactionError, unitsConsumed },\n } = await rpc\n .simulateTransaction(wireTransactionBytes, {\n ...simulateConfig,\n encoding: 'base64',\n sigVerify: false,\n })\n .send({ abortSignal });\n if (unitsConsumed == null) {\n // This should never be hit, because all RPCs should support `unitsConsumed` by now.\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT\n );\n }\n // FIXME(https://github.com/anza-xyz/agave/issues/1295): The simulation response returns\n // compute units as a u64, but the `SetComputeLimit` instruction only accepts a u32. Until\n // this changes, downcast it.\n const downcastUnitsConsumed =\n unitsConsumed > 4_294_967_295n ? 4_294_967_295 : Number(unitsConsumed);\n if (transactionError) {\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n {\n cause: transactionError,\n unitsConsumed: downcastUnitsConsumed,\n }\n );\n }\n return downcastUnitsConsumed;\n } catch (e) {\n if (\n isSolanaError(\n e,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT\n )\n )\n throw e;\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n { cause: e }\n );\n }\n}\n","import {\n estimateComputeUnitLimit,\n EstimateComputeUnitLimitFactoryConfig,\n EstimateComputeUnitLimitFactoryFunction,\n} from './estimateComputeLimitInternal';\n\n/**\n * Use this utility to estimate the actual compute unit cost of a given transaction message.\n *\n * Correctly budgeting a compute unit limit for your transaction message can increase the\n * probability that your transaction will be accepted for processing. If you don't declare a compute\n * unit limit on your transaction, validators will assume an upper limit of 200K compute units (CU)\n * per instruction.\n *\n * Since validators have an incentive to pack as many transactions into each block as possible, they\n * may choose to include transactions that they know will fit into the remaining compute budget for\n * the current block over transactions that might not. For this reason, you should set a compute\n * unit limit on each of your transaction messages, whenever possible.\n *\n * > [!WARNING]\n * > The compute unit estimate is just that -- an estimate. The compute unit consumption of the\n * > actual transaction might be higher or lower than what was observed in simulation. Unless you\n * > are confident that your particular transaction message will consume the same or fewer compute\n * > units as was estimated, you might like to augment the estimate by either a fixed number of CUs\n * > or a multiplier.\n *\n * > [!NOTE]\n * > If you are preparing an _unsigned_ transaction, destined to be signed and submitted to the\n * > network by a wallet, you might like to leave it up to the wallet to determine the compute unit\n * > limit. Consider that the wallet might have a more global view of how many compute units certain\n * > types of transactions consume, and might be able to make better estimates of an appropriate\n * > compute unit budget.\n *\n * > [!INFO]\n * > In the event that a transaction message does not already have a `SetComputeUnitLimit`\n * > instruction, this function will add one before simulation. This ensures that the compute unit\n * > consumption of the `SetComputeUnitLimit` instruction itself is included in the estimate.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { getSetComputeUnitLimitInstruction } from '@solana-program/compute-budget';\n * import { createSolanaRpc, estimateComputeUnitLimitFactory, pipe } from '@solana/kit';\n *\n * // Create an estimator function.\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const estimateComputeUnitLimit = estimateComputeUnitLimitFactory({ rpc });\n *\n * // Create your transaction message.\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * /* ... *\\/\n * );\n *\n * // Request an estimate of the actual compute units this message will consume. This is done by\n * // simulating the transaction and grabbing the estimated compute units from the result.\n * const estimatedUnits = await estimateComputeUnitLimit(transactionMessage);\n *\n * // Set the transaction message's compute unit budget.\n * const transactionMessageWithComputeUnitLimit = prependTransactionMessageInstruction(\n * getSetComputeUnitLimitInstruction({ units: estimatedUnits }),\n * transactionMessage,\n * );\n * ```\n */\nexport function estimateComputeUnitLimitFactory({\n rpc,\n}: EstimateComputeUnitLimitFactoryConfig): EstimateComputeUnitLimitFactoryFunction {\n return async function estimateComputeUnitLimitFactoryFunction(\n transactionMessage,\n config\n ) {\n return await estimateComputeUnitLimit({\n ...config,\n rpc,\n transactionMessage,\n });\n };\n}\n","import {\n appendTransactionMessageInstruction,\n BaseTransactionMessage,\n MicroLamports,\n} from '@solana/kit';\nimport { getSetComputeUnitPriceInstruction } from './generated';\nimport { getSetComputeUnitPriceInstructionIndexAndMicroLamports } from './internal';\n\n/**\n * Sets the compute unit price of a transaction message in micro-Lamports.\n *\n * @example\n * ```ts\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 0 }),\n * (m) => setTransactionMessageComputeUnitPrice(10_000, m),\n * // ...\n * );\n * ```\n */\nexport function setTransactionMessageComputeUnitPrice<\n TTransactionMessage extends BaseTransactionMessage,\n>(microLamports: number | bigint, transactionMessage: TTransactionMessage) {\n return appendTransactionMessageInstruction(\n getSetComputeUnitPriceInstruction({ microLamports }),\n transactionMessage\n );\n}\n\n/**\n * Updates the first `SetComputeUnitPrice` instruction in a transaction message\n * with the given micro-Lamports, or appends a new instruction if none exists.\n * A function of the current value can be provided instead of a static value.\n *\n * @param microLamports - The new compute unit price, or a function that\n * takes the previous price and returns the new one.\n * @param transactionMessage - The transaction message to update.\n *\n * @example\n * ```ts\n * const updatedTransactionMessage = updateOrAppendSetComputeUnitPriceInstruction(\n * // E.g. double the current price or set it to 10_000 if it isn't set.\n * (currentPrice) => currentPrice === null ? 10_000 : currentPrice * 2,\n * transactionMessage,\n * );\n * ```\n */\nexport function updateOrAppendSetComputeUnitPriceInstruction<\n TTransactionMessage extends BaseTransactionMessage,\n>(\n microLamports:\n | MicroLamports\n | ((previousMicroLamports: MicroLamports | null) => MicroLamports),\n transactionMessage: TTransactionMessage\n): TTransactionMessage {\n const getMicroLamports = (\n previousMicroLamports: MicroLamports | null\n ): MicroLamports =>\n typeof microLamports === 'function'\n ? microLamports(previousMicroLamports)\n : microLamports;\n const instructionDetails =\n getSetComputeUnitPriceInstructionIndexAndMicroLamports(transactionMessage);\n\n if (!instructionDetails) {\n return appendTransactionMessageInstruction(\n getSetComputeUnitPriceInstruction({\n microLamports: getMicroLamports(null),\n }),\n transactionMessage\n ) as unknown as TTransactionMessage;\n }\n\n const { index, microLamports: previousMicroLamports } = instructionDetails;\n const newMicroLamports = getMicroLamports(previousMicroLamports);\n if (newMicroLamports === previousMicroLamports) {\n return transactionMessage;\n }\n\n const newInstruction = getSetComputeUnitPriceInstruction({\n microLamports: newMicroLamports,\n });\n const newInstructions = [...transactionMessage.instructions];\n newInstructions.splice(index, 1, newInstruction);\n return Object.freeze({\n ...transactionMessage,\n instructions: newInstructions,\n });\n}\n","import {\n getSetComputeUnitLimitInstruction,\n setTransactionMessageComputeUnitPrice,\n} from \"@solana-program/compute-budget\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport {\n fetchMint,\n findAssociatedTokenPda,\n getTransferCheckedInstruction,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from \"@solana-program/token-2022\";\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n getBase64EncodedWireTransaction,\n partiallySignTransactionMessageWithSigners,\n pipe,\n prependTransactionMessageInstruction,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n type Address,\n} from \"@solana/kit\";\nimport type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@x402/core/types\";\nimport {\n DEFAULT_COMPUTE_UNIT_LIMIT,\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n MEMO_PROGRAM_ADDRESS,\n} from \"../../constants\";\nimport type { ClientSvmConfig, ClientSvmSigner } from \"../../signer\";\nimport type { ExactSvmPayloadV2 } from \"../../types\";\nimport { createRpcClient } from \"../../utils\";\n\n/**\n * SVM client implementation for the Exact payment scheme.\n */\nexport class ExactSvmScheme implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactSvmClient instance.\n *\n * @param signer - The SVM signer for client operations\n * @param config - Optional configuration with custom RPC URL\n * @returns ExactSvmClient instance\n */\n constructor(\n private readonly signer: ClientSvmSigner,\n private readonly config?: ClientSvmConfig,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise> {\n const rpc = createRpcClient(paymentRequirements.network, this.config?.rpcUrl);\n\n const tokenMint = await fetchMint(rpc, paymentRequirements.asset as Address);\n const tokenProgramAddress = tokenMint.programAddress;\n\n if (\n tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&\n tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n throw new Error(\"Asset was not created by a known token program\");\n }\n\n const [sourceATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: this.signer.address,\n tokenProgram: tokenProgramAddress,\n });\n\n const [destinationATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: paymentRequirements.payTo as Address,\n tokenProgram: tokenProgramAddress,\n });\n\n const transferIx = getTransferCheckedInstruction(\n {\n source: sourceATA,\n mint: paymentRequirements.asset as Address,\n destination: destinationATA,\n authority: this.signer,\n amount: BigInt(paymentRequirements.amount),\n decimals: tokenMint.data.decimals,\n },\n { programAddress: tokenProgramAddress },\n );\n\n // Facilitator must provide feePayer to cover transaction fees\n const feePayer = paymentRequirements.extra?.feePayer as Address;\n if (!feePayer) {\n throw new Error(\"feePayer is required in paymentRequirements.extra for SVM transactions\");\n }\n\n const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();\n\n const nonce = crypto.getRandomValues(new Uint8Array(16));\n const memoIx = {\n programAddress: MEMO_PROGRAM_ADDRESS as Address,\n accounts: [] as const,\n data: new TextEncoder().encode(\n Array.from(nonce)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n ),\n };\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx),\n tx => setTransactionMessageFeePayer(feePayer, tx),\n tx =>\n prependTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }),\n tx,\n ),\n tx => appendTransactionMessageInstructions([transferIx, memoIx], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n );\n\n const signedTransaction = await partiallySignTransactionMessageWithSigners(tx);\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);\n\n const payload: ExactSvmPayloadV2 = {\n transaction: base64EncodedWireTransaction,\n };\n\n return {\n x402Version,\n payload,\n };\n }\n}\n","/**\n * V1 exports for the SVM mechanism\n */\nexport { ExactSvmSchemeV1 } from \"../exact/v1\";\n\nexport const NETWORKS: string[] = [\"solana\", \"solana-devnet\", \"solana-testnet\"];\n","import {\n getSetComputeUnitLimitInstruction,\n setTransactionMessageComputeUnitPrice,\n} from \"@solana-program/compute-budget\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport {\n fetchMint,\n findAssociatedTokenPda,\n getTransferCheckedInstruction,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from \"@solana-program/token-2022\";\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n getBase64EncodedWireTransaction,\n partiallySignTransactionMessageWithSigners,\n pipe,\n prependTransactionMessageInstruction,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n type Address,\n} from \"@solana/kit\";\nimport type {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport type { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport {\n DEFAULT_COMPUTE_UNIT_LIMIT,\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n MEMO_PROGRAM_ADDRESS,\n} from \"../../../constants\";\nimport type { ClientSvmConfig, ClientSvmSigner } from \"../../../signer\";\nimport type { ExactSvmPayloadV1 } from \"../../../types\";\nimport { createRpcClient } from \"../../../utils\";\n\n/**\n * SVM client implementation for the Exact payment scheme (V1).\n */\nexport class ExactSvmSchemeV1 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactSvmClientV1 instance.\n *\n * @param signer - The SVM signer for client operations\n * @param config - Optional configuration with custom RPC URL\n * @returns ExactSvmClientV1 instance\n */\n constructor(\n private readonly signer: ClientSvmSigner,\n private readonly config?: ClientSvmConfig,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme (V1).\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<\n Pick & { scheme: string; network: Network }\n > {\n const selectedV1 = paymentRequirements as unknown as PaymentRequirementsV1;\n const rpc = createRpcClient(selectedV1.network, this.config?.rpcUrl);\n\n const tokenMint = await fetchMint(rpc, selectedV1.asset as Address);\n const tokenProgramAddress = tokenMint.programAddress;\n\n if (\n tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&\n tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n throw new Error(\"Asset was not created by a known token program\");\n }\n\n const [sourceATA] = await findAssociatedTokenPda({\n mint: selectedV1.asset as Address,\n owner: this.signer.address,\n tokenProgram: tokenProgramAddress,\n });\n\n const [destinationATA] = await findAssociatedTokenPda({\n mint: selectedV1.asset as Address,\n owner: selectedV1.payTo as Address,\n tokenProgram: tokenProgramAddress,\n });\n\n const transferIx = getTransferCheckedInstruction(\n {\n source: sourceATA,\n mint: selectedV1.asset as Address,\n destination: destinationATA,\n authority: this.signer,\n amount: BigInt(selectedV1.maxAmountRequired),\n decimals: tokenMint.data.decimals,\n },\n { programAddress: tokenProgramAddress },\n );\n\n // Facilitator must provide feePayer to cover transaction fees\n const feePayer = selectedV1.extra?.feePayer as Address;\n if (!feePayer) {\n throw new Error(\"feePayer is required in paymentRequirements.extra for SVM transactions\");\n }\n\n const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();\n\n const nonce = crypto.getRandomValues(new Uint8Array(16));\n const memoIx = {\n programAddress: MEMO_PROGRAM_ADDRESS as Address,\n accounts: [] as const,\n data: new TextEncoder().encode(\n Array.from(nonce)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n ),\n };\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx),\n tx => setTransactionMessageFeePayer(feePayer, tx),\n tx =>\n prependTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }),\n tx,\n ),\n tx => appendTransactionMessageInstructions([transferIx, memoIx], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n );\n\n const signedTransaction = await partiallySignTransactionMessageWithSigners(tx);\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);\n\n const payload: ExactSvmPayloadV1 = {\n transaction: base64EncodedWireTransaction,\n };\n\n return {\n x402Version,\n scheme: selectedV1.scheme,\n network: selectedV1.network,\n payload,\n };\n }\n}\n","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@x402/core/client\";\nimport { Network } from \"@x402/core/types\";\nimport { ClientSvmSigner } from \"../../signer\";\nimport { ExactSvmScheme } from \"./scheme\";\nimport { ExactSvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering SVM schemes to an x402Client\n */\nexport interface SvmClientConfig {\n /**\n * The SVM signer to use for creating payment payloads\n */\n signer: ClientSvmSigner;\n\n /**\n * Optional payment requirements selector function\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional specific networks to register\n */\n networks?: Network[];\n}\n\n/**\n * Registers SVM payment schemes to an existing x402Client instance.\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for SVM client registration\n * @returns The client instance for chaining\n */\nexport function registerExactSvmScheme(client: x402Client, config: SvmClientConfig): x402Client {\n // Register V2 scheme\n if (config.networks && config.networks.length > 0) {\n config.networks.forEach(network => {\n client.register(network, new ExactSvmScheme(config.signer));\n });\n } else {\n client.register(\"solana:*\", new ExactSvmScheme(config.signer));\n }\n\n // Register all V1 networks\n NETWORKS.forEach(network => {\n client.registerV1(network as Network, new ExactSvmSchemeV1(config.signer));\n });\n\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * Local x402 Proxy Server\n *\n * Sits between OpenClaw's pi-ai (which makes standard OpenAI-format requests)\n * and BlockRun's API (which requires x402 micropayments).\n *\n * Flow:\n * pi-ai → http://localhost:{port}/v1/chat/completions\n * → proxy forwards to https://blockrun.ai/api/v1/chat/completions\n * → gets 402 → @x402/fetch signs payment → retries\n * → streams response back to pi-ai\n *\n * Optimizations (v0.3.0):\n * - SSE heartbeat: for streaming requests, sends headers + heartbeat immediately\n * before the x402 flow, preventing OpenClaw's 10-15s timeout from firing.\n * - Response dedup: hashes request bodies and caches responses for 30s,\n * preventing double-charging when OpenClaw retries after timeout.\n * - Smart routing: when model is \"blockrun/auto\", classify query and pick cheapest model.\n * - Usage logging: log every request as JSON line to ~/.openclaw/blockrun/logs/\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\n\n// Per-request payment tracking via AsyncLocalStorage (safe for concurrent requests).\n// The x402 onAfterPaymentCreation hook writes the actual payment amount into the\n// request-scoped store, and the logging code reads it after payFetch completes.\nconst paymentStore = new AsyncLocalStorage<{ amountUsd: number }>();\nimport { finished } from \"node:stream\";\nimport type { AddressInfo } from \"node:net\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdir, writeFile, readFile, stat as fsStat } from \"node:fs/promises\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { createPublicClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { x402Client } from \"@x402/fetch\";\nimport { createPayFetchWithPreAuth } from \"./payment-preauth.js\";\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { toClientEvmSigner } from \"@x402/evm\";\nimport {\n route,\n getFallbackChain,\n getFallbackChainFiltered,\n filterByToolCalling,\n filterByVision,\n filterByExcludeList,\n calculateModelCost,\n DEFAULT_ROUTING_CONFIG,\n type RouterOptions,\n type RoutingDecision,\n type RoutingConfig,\n type ModelPricing,\n type Tier,\n} from \"./router/index.js\";\nimport { classifyByRules } from \"./router/rules.js\";\nimport {\n BLOCKRUN_MODELS,\n OPENCLAW_MODELS,\n resolveModelAlias,\n getModelContextWindow,\n isReasoningModel,\n supportsToolCalling,\n supportsVision,\n getActivePromoPrice,\n} from \"./models.js\";\nimport { logUsage, type UsageEntry } from \"./logger.js\";\nimport { getStats, clearStats } from \"./stats.js\";\nimport { RequestDeduplicator } from \"./dedup.js\";\nimport { ResponseCache, type ResponseCacheConfig } from \"./response-cache.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport type { SolanaBalanceMonitor } from \"./solana-balance.js\";\n\n/** Union type for chain-agnostic balance monitoring */\ntype AnyBalanceMonitor = BalanceMonitor | SolanaBalanceMonitor;\nimport { resolvePaymentChain } from \"./auth.js\";\nimport type { WalletResolution } from \"./auth.js\";\nimport { OnchainOsAdapter } from \"./onchainos-adapter.js\";\nimport { createOnchainosPayFetch } from \"./okx-x402-fetch.js\";\nimport { compressContext, shouldCompress, type NormalizedMessage } from \"./compression/index.js\";\n// Error classes available for programmatic use but not used in proxy\n// (universal free fallback means we don't throw balance errors anymore)\n// import { InsufficientFundsError, EmptyWalletError } from \"./errors.js\";\nimport { USER_AGENT, VERSION } from \"./version.js\";\nimport {\n SessionStore,\n getSessionId,\n deriveSessionId,\n hashRequestContent,\n type SessionConfig,\n} from \"./session.js\";\nimport { checkForUpdates } from \"./updater.js\";\nimport { loadExcludeList } from \"./exclude-models.js\";\nimport { PROXY_PORT } from \"./config.js\";\nimport { SessionJournal } from \"./journal.js\";\nimport { applyUpstreamProxy } from \"./upstream-proxy.js\";\nimport { extractTextualToolCalls } from \"./textual-tool-calls.js\";\n\nconst BLOCKRUN_API = \"https://blockrun.ai/api\";\nconst BLOCKRUN_SOLANA_API = \"https://sol.blockrun.ai/api\";\nconst IMAGE_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"images\");\nconst AUDIO_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"audio\");\nconst VIDEO_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"videos\");\n// Routing profile models - virtual models that trigger intelligent routing\nconst AUTO_MODEL = \"blockrun/auto\";\n\nconst ROUTING_PROFILES = new Set([\n \"blockrun/eco\",\n \"eco\",\n \"blockrun/auto\",\n \"auto\",\n \"blockrun/premium\",\n \"premium\",\n]);\n// Default free model first (auto-pick order). gpt-oss-120b is the historical\n// default — heavy users rely on it. New entries appended in chain order.\nconst FREE_MODELS = new Set([\n \"free/gpt-oss-120b\",\n \"free/gpt-oss-20b\",\n \"free/mistral-small-4-119b\", // 114 tok/s — fastest free chat\n \"free/deepseek-v4-pro\", // 1M ctx, MMLU-Pro 87.5 — strongest free reasoning\n \"free/deepseek-v4-flash\", // 1M ctx, ~5x faster than v4-pro\n \"free/qwen3-next-80b-a3b-thinking\", // 116 tok/s reasoning\n \"free/qwen3-coder-480b\",\n \"free/glm-4.7\",\n \"free/llama-4-maverick\",\n \"free/nemotron-3-nano-omni-30b-a3b-reasoning\", // first vision-capable free\n]);\n/** Pick the best available free model that isn't excluded. */\nfunction pickFreeModel(excludeList?: Set): string | undefined {\n for (const m of FREE_MODELS) {\n if (!excludeList?.has(m)) return m;\n }\n return undefined; // all free models excluded\n}\n// Keep backward-compat constant for places that don't have excludeList in scope\nconst FREE_MODEL = \"free/gpt-oss-120b\";\n/**\n * Map free/xxx model IDs to nvidia/xxx for upstream BlockRun API.\n * The \"free/\" prefix is a XClawRouter convention for the /model picker;\n * BlockRun server expects \"nvidia/\" prefix.\n */\nfunction toUpstreamModelId(modelId: string): string {\n if (modelId.startsWith(\"free/\")) {\n return \"nvidia/\" + modelId.slice(\"free/\".length);\n }\n return modelId;\n}\nconst MAX_MESSAGES = 200; // BlockRun API limit - truncate older messages if exceeded\nconst CONTEXT_LIMIT_KB = 5120; // Server-side limit: 5MB in KB\nconst HEARTBEAT_INTERVAL_MS = 2_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 180_000; // 3 minutes (allows for on-chain tx + LLM response)\nconst PER_MODEL_TIMEOUT_MS = 60_000; // 60s per individual model attempt (fallback to next on exceed)\nconst MAX_FALLBACK_ATTEMPTS = 5; // Maximum models to try in fallback chain (increased from 3 to ensure cheap models are tried)\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000; // Timeout for checking existing proxy\nconst RATE_LIMIT_COOLDOWN_MS = 60_000; // 60 seconds cooldown for rate-limited models\nconst OVERLOAD_COOLDOWN_MS = 15_000; // 15 seconds cooldown for overloaded providers\nconst PORT_RETRY_ATTEMPTS = 5; // Max attempts to bind port (handles TIME_WAIT)\nconst PORT_RETRY_DELAY_MS = 1_000; // Delay between retry attempts\nconst MODEL_BODY_READ_TIMEOUT_MS = 300_000; // 5 minutes for model responses (reasoning models are slow)\nconst ERROR_BODY_READ_TIMEOUT_MS = 30_000; // 30 seconds for error/partner body reads\n\nasync function readBodyWithTimeout(\n body: ReadableStream | null,\n timeoutMs: number = MODEL_BODY_READ_TIMEOUT_MS,\n): Promise {\n if (!body) return [];\n\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n\n let timer: ReturnType | undefined;\n try {\n while (true) {\n const result = await Promise.race([\n reader.read(),\n new Promise((_, reject) => {\n timer = setTimeout(() => reject(new Error(\"Body read timeout\")), timeoutMs);\n }),\n ]);\n clearTimeout(timer);\n if (result.done) break;\n chunks.push(result.value);\n }\n } finally {\n clearTimeout(timer);\n reader.releaseLock();\n }\n\n return chunks;\n}\n\n/**\n * Transform upstream payment errors into user-friendly messages.\n * Parses the raw x402 error and formats it nicely.\n */\nexport function transformPaymentError(errorBody: string): string {\n try {\n // Try to parse the error JSON\n const parsed = JSON.parse(errorBody) as {\n error?: string;\n details?: string;\n // blockrun-sol (Solana) format uses code+debug instead of details\n code?: string;\n debug?: string;\n payer?: string;\n };\n\n // Check if this is a payment verification error\n if (parsed.error === \"Payment verification failed\" && parsed.details) {\n // Extract the nested JSON from details\n // Format: \"Verification failed: {json}\\n\"\n const match = parsed.details.match(/Verification failed:\\s*(\\{.*\\})/s);\n if (match) {\n const innerJson = JSON.parse(match[1]) as {\n invalidMessage?: string;\n invalidReason?: string;\n payer?: string;\n };\n\n if (innerJson.invalidReason === \"insufficient_funds\" && innerJson.invalidMessage) {\n // Parse \"insufficient balance: 251 < 11463\"\n const balanceMatch = innerJson.invalidMessage.match(\n /insufficient balance:\\s*(\\d+)\\s*<\\s*(\\d+)/i,\n );\n if (balanceMatch) {\n const currentMicros = parseInt(balanceMatch[1], 10);\n const requiredMicros = parseInt(balanceMatch[2], 10);\n const currentUSD = (currentMicros / 1_000_000).toFixed(6);\n const requiredUSD = (requiredMicros / 1_000_000).toFixed(6);\n const wallet = innerJson.payer || \"unknown\";\n const shortWallet =\n wallet.length > 12 ? `${wallet.slice(0, 6)}...${wallet.slice(-4)}` : wallet;\n\n return JSON.stringify({\n error: {\n message: `Insufficient USDC balance. Current: $${currentUSD}, Required: ~$${requiredUSD}`,\n type: \"insufficient_funds\",\n wallet: wallet,\n current_balance_usd: currentUSD,\n required_usd: requiredUSD,\n help: `Fund wallet ${shortWallet} with USDC on Base, or use free model: /model free`,\n },\n });\n }\n }\n\n // Handle invalid_payload errors (signature issues, malformed payment)\n if (innerJson.invalidReason === \"invalid_payload\") {\n return JSON.stringify({\n error: {\n message: \"Payment signature invalid. This may be a temporary issue.\",\n type: \"invalid_payload\",\n help: \"Try again. If this persists, reinstall XClawRouter: curl -fsSL https://blockrun.ai/xclawrouter-update | bash\",\n },\n });\n }\n\n // Handle transaction simulation failures (Solana on-chain validation)\n if (innerJson.invalidReason === \"transaction_simulation_failed\") {\n console.error(\n `[XClawRouter] Solana transaction simulation failed: ${innerJson.invalidMessage || \"unknown\"}`,\n );\n return JSON.stringify({\n error: {\n message: \"Solana payment simulation failed. Retrying with a different model.\",\n type: \"transaction_simulation_failed\",\n help: \"This is usually temporary. If it persists, check your Solana USDC balance or try: /model free\",\n },\n });\n }\n }\n }\n\n // Handle code=PAYMENT_INVALID + debug format (used by blockrun-sol, can also\n // appear from blockrun Base when CDP returns non-200 with structured JSON body)\n if (\n parsed.error === \"Payment verification failed\" &&\n parsed.code === \"PAYMENT_INVALID\" &&\n parsed.debug\n ) {\n const debugLower = parsed.debug.toLowerCase();\n const wallet = parsed.payer || \"unknown\";\n const shortWallet =\n wallet.length > 12 ? `${wallet.slice(0, 6)}...${wallet.slice(-4)}` : wallet;\n // Detect chain from payer address format (0x = EVM, else Solana)\n const chain = wallet.startsWith(\"0x\") ? \"Base\" : \"Solana\";\n\n if (debugLower.includes(\"insufficient\")) {\n return JSON.stringify({\n error: {\n message: `Insufficient ${chain} USDC balance.`,\n type: \"insufficient_funds\",\n wallet,\n help:\n chain === \"Solana\"\n ? `Fund wallet ${shortWallet} with USDC on Solana, or switch to Base: /wallet base`\n : `Fund wallet ${shortWallet} with USDC on Base, or use free model: /model free`,\n },\n });\n }\n\n if (\n debugLower.includes(\"transaction_simulation_failed\") ||\n debugLower.includes(\"simulation\")\n ) {\n console.error(`[XClawRouter] ${chain} transaction simulation failed: ${parsed.debug}`);\n return JSON.stringify({\n error: {\n message: `${chain} payment simulation failed. Retrying with a different model.`,\n type: \"transaction_simulation_failed\",\n help: \"This is usually temporary. If it persists, try: /model free\",\n },\n });\n }\n\n if (debugLower.includes(\"invalid signature\") || debugLower.includes(\"invalid_signature\")) {\n return JSON.stringify({\n error: {\n message: `${chain} payment signature invalid.`,\n type: \"invalid_payload\",\n help: \"Try again. If this persists, reinstall XClawRouter: curl -fsSL https://blockrun.ai/xclawrouter-update | bash\",\n },\n });\n }\n\n if (debugLower.includes(\"expired\")) {\n return JSON.stringify({\n error: {\n message: `${chain} payment expired. Retrying.`,\n type: \"expired\",\n help: \"This is usually temporary.\",\n },\n });\n }\n\n // Unknown verification error — surface the debug reason\n console.error(\n `[XClawRouter] ${chain} payment verification failed: ${parsed.debug} payer=${wallet}`,\n );\n return JSON.stringify({\n error: {\n message: `${chain} payment verification failed: ${parsed.debug}`,\n type: \"payment_invalid\",\n wallet,\n help:\n chain === \"Solana\"\n ? \"Try again or switch to Base: /wallet base\"\n : \"Try again. If this persists, try: /model free\",\n },\n });\n }\n\n // Handle settlement failures (gas estimation, on-chain errors)\n if (\n parsed.error === \"Settlement failed\" ||\n parsed.error === \"Payment settlement failed\" ||\n parsed.details?.includes(\"Settlement failed\") ||\n parsed.details?.includes(\"transaction_simulation_failed\")\n ) {\n const details = parsed.details || \"\";\n const gasError = details.includes(\"unable to estimate gas\");\n\n return JSON.stringify({\n error: {\n message: gasError\n ? \"Payment failed: network congestion or gas issue. Try again.\"\n : \"Payment settlement failed. Try again in a moment.\",\n type: \"settlement_failed\",\n help: \"This is usually temporary. If it persists, try: /model free\",\n },\n });\n }\n } catch {\n // If parsing fails, return original\n }\n return errorBody;\n}\n\n/**\n * Semantic error categories from upstream provider responses.\n * Used to distinguish auth failures from rate limits from server errors\n * so each category can be handled independently without cross-contamination.\n */\nexport type ErrorCategory =\n | \"auth_failure\" // 401, 403: Wrong key or forbidden — don't retry with same key\n | \"quota_exceeded\" // 403 with plan/quota body: Plan limit hit\n | \"rate_limited\" // 429: Actual throttling — 60s cooldown\n | \"overloaded\" // 529, 503+overload body: Provider capacity — 15s cooldown\n | \"server_error\" // 5xx general: Transient — fallback immediately\n | \"payment_error\" // 402: x402 payment or funds issue\n | \"config_error\"; // 400, 413: Bad request content — skip this model\n\n/**\n * Classify an upstream error response into a semantic category.\n * Returns null if the status+body is not a provider-side issue worth retrying.\n */\nexport function categorizeError(status: number, body: string): ErrorCategory | null {\n if (status === 401) return \"auth_failure\";\n if (status === 402) return \"payment_error\";\n if (status === 403) {\n if (/plan.*limit|quota.*exceeded|subscription|allowance/i.test(body)) return \"quota_exceeded\";\n return \"auth_failure\"; // generic 403 = forbidden = likely auth issue\n }\n if (status === 429) return \"rate_limited\";\n if (status === 529) return \"overloaded\";\n if (status === 503 && /overload|capacity|too.*many.*request/i.test(body)) return \"overloaded\";\n if (status >= 500) return \"server_error\";\n if (status === 400 || status === 413) {\n // Only fallback on content-size or billing patterns; bare 400 = our bug, don't cycle\n if (PROVIDER_ERROR_PATTERNS.some((p) => p.test(body))) return \"config_error\";\n return null;\n }\n return null;\n}\n\n/**\n * Track rate-limited models to avoid hitting them again.\n * Maps model ID to the timestamp when the rate limit was hit.\n */\nconst rateLimitedModels = new Map();\n\n/** Per-model overload tracking (529/503 capacity errors) — shorter cooldown than rate limits. */\nconst overloadedModels = new Map();\n\n/** Per-model error category counts (in-memory, resets on restart). */\ntype ProviderErrorCounts = {\n auth_failure: number;\n quota_exceeded: number;\n rate_limited: number;\n overloaded: number;\n server_error: number;\n payment_error: number;\n config_error: number;\n};\nconst perProviderErrors = new Map();\n\n/** Record an error category hit for a model. */\nfunction recordProviderError(modelId: string, category: ErrorCategory): void {\n if (!perProviderErrors.has(modelId)) {\n perProviderErrors.set(modelId, {\n auth_failure: 0,\n quota_exceeded: 0,\n rate_limited: 0,\n overloaded: 0,\n server_error: 0,\n payment_error: 0,\n config_error: 0,\n });\n }\n perProviderErrors.get(modelId)![category]++;\n}\n\n/**\n * Check if a model is currently rate-limited (in cooldown period).\n */\nfunction isRateLimited(modelId: string): boolean {\n const hitTime = rateLimitedModels.get(modelId);\n if (!hitTime) return false;\n\n const elapsed = Date.now() - hitTime;\n if (elapsed >= RATE_LIMIT_COOLDOWN_MS) {\n rateLimitedModels.delete(modelId);\n return false;\n }\n return true;\n}\n\n/**\n * Mark a model as rate-limited.\n */\nfunction markRateLimited(modelId: string): void {\n rateLimitedModels.set(modelId, Date.now());\n console.log(`[XClawRouter] Model ${modelId} rate-limited, will deprioritize for 60s`);\n}\n\n/**\n * Mark a model as temporarily overloaded (529/503 capacity).\n * Shorter cooldown than rate limits since capacity restores quickly.\n */\nfunction markOverloaded(modelId: string): void {\n overloadedModels.set(modelId, Date.now());\n console.log(`[XClawRouter] Model ${modelId} overloaded, will deprioritize for 15s`);\n}\n\n/** Check if a model is in its overload cooldown period. */\nfunction isOverloaded(modelId: string): boolean {\n const hitTime = overloadedModels.get(modelId);\n if (!hitTime) return false;\n if (Date.now() - hitTime >= OVERLOAD_COOLDOWN_MS) {\n overloadedModels.delete(modelId);\n return false;\n }\n return true;\n}\n\n/**\n * Reorder models to put rate-limited ones at the end.\n */\nfunction prioritizeNonRateLimited(models: string[]): string[] {\n const available: string[] = [];\n const degraded: string[] = [];\n\n for (const model of models) {\n if (isRateLimited(model) || isOverloaded(model)) {\n degraded.push(model);\n } else {\n available.push(model);\n }\n }\n\n return [...available, ...degraded];\n}\n\n/**\n * Check if response socket is writable (prevents write-after-close errors).\n * Returns true only if all conditions are safe for writing.\n */\nfunction canWrite(res: ServerResponse): boolean {\n return (\n !res.writableEnded &&\n !res.destroyed &&\n res.socket !== null &&\n !res.socket.destroyed &&\n res.socket.writable\n );\n}\n\n/**\n * Safe write with backpressure handling.\n * Returns true if write succeeded, false if socket is closed or write failed.\n */\nfunction safeWrite(res: ServerResponse, data: string | Buffer): boolean {\n if (!canWrite(res)) {\n const bytes = typeof data === \"string\" ? Buffer.byteLength(data) : data.length;\n console.warn(`[XClawRouter] safeWrite: socket not writable, dropping ${bytes} bytes`);\n return false;\n }\n return res.write(data);\n}\n\n// Extra buffer for balance check (on top of estimateAmount's 20% buffer)\n// Total effective buffer: 1.2 * 1.5 = 1.8x (80% safety margin)\n// This prevents x402 payment failures after streaming headers are sent,\n// which would trigger OpenClaw's 5-24 hour billing cooldown.\nconst BALANCE_CHECK_BUFFER = 1.5;\n\n/**\n * Get the proxy port from pre-loaded configuration.\n * Port is validated at module load time, this just returns the cached value.\n */\nexport function getProxyPort(): number {\n return PROXY_PORT;\n}\n\n/**\n * Check if a proxy is already running on the given port.\n * Returns the wallet address if running, undefined otherwise.\n */\nasync function checkExistingProxy(\n port: number,\n): Promise<{ wallet: string; paymentChain?: string } | undefined> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`, {\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (response.ok) {\n const data = (await response.json()) as {\n status?: string;\n wallet?: string;\n paymentChain?: string;\n };\n if (data.status === \"ok\" && data.wallet) {\n return { wallet: data.wallet, paymentChain: data.paymentChain };\n }\n }\n return undefined;\n } catch {\n clearTimeout(timeoutId);\n return undefined;\n }\n}\n\n/**\n * Error patterns that indicate a provider-side issue (not user's fault).\n * These errors should trigger fallback to the next model in the chain.\n */\nconst PROVIDER_ERROR_PATTERNS = [\n /billing/i,\n /insufficient.*balance/i,\n /credits/i,\n /quota.*exceeded/i,\n /rate.*limit/i,\n /model.*unavailable/i,\n /model.*not.*available/i,\n /service.*unavailable/i,\n /capacity/i,\n /overloaded/i,\n /temporarily.*unavailable/i,\n /api.*key.*invalid/i,\n /authentication.*failed/i,\n /request too large/i,\n /request.*size.*exceeds/i,\n /payload too large/i,\n /payment.*verification.*failed/i,\n /model.*not.*allowed/i,\n /unknown.*model/i,\n /reasoning_content.*missing/i, // Thinking model multi-turn: missing reasoning_content → fallback\n /thinking.*reasoning_content/i,\n];\n\n/**\n * \"Successful\" response bodies that are actually provider degradation placeholders.\n * Some upstream providers occasionally return these with HTTP 200.\n */\nconst DEGRADED_RESPONSE_PATTERNS = [\n /the ai service is temporarily overloaded/i,\n /service is temporarily overloaded/i,\n /please try again in a moment/i,\n];\n\n/**\n * Known low-quality loop signatures seen during provider degradation windows.\n */\nconst DEGRADED_LOOP_PATTERNS = [\n /the boxed is the response\\./i,\n /the response is the text\\./i,\n /the final answer is the boxed\\./i,\n];\n\nfunction extractAssistantContent(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") return undefined;\n const record = payload as Record;\n const choices = record.choices;\n if (!Array.isArray(choices) || choices.length === 0) return undefined;\n\n const firstChoice = choices[0];\n if (!firstChoice || typeof firstChoice !== \"object\") return undefined;\n const choice = firstChoice as Record;\n const message = choice.message;\n if (!message || typeof message !== \"object\") return undefined;\n const content = (message as Record).content;\n return typeof content === \"string\" ? content : undefined;\n}\n\nfunction hasKnownLoopSignature(text: string): boolean {\n const matchCount = DEGRADED_LOOP_PATTERNS.reduce(\n (count, pattern) => (pattern.test(text) ? count + 1 : count),\n 0,\n );\n if (matchCount >= 2) return true;\n\n // Generic repetitive loop fallback for short repeated lines.\n const lines = text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n if (lines.length < 8) return false;\n\n const counts = new Map();\n for (const line of lines) {\n counts.set(line, (counts.get(line) ?? 0) + 1);\n }\n\n const maxRepeat = Math.max(...counts.values());\n const uniqueRatio = counts.size / lines.length;\n return maxRepeat >= 3 && uniqueRatio <= 0.45;\n}\n\n/**\n * Detect degraded 200-response payloads that should trigger model fallback.\n * Returns a short reason when fallback should happen, otherwise undefined.\n */\nexport function detectDegradedSuccessResponse(body: string): string | undefined {\n const trimmed = body.trim();\n if (!trimmed) return undefined;\n\n // Plain-text placeholder response.\n if (DEGRADED_RESPONSE_PATTERNS.some((pattern) => pattern.test(trimmed))) {\n return \"degraded response: overloaded placeholder\";\n }\n\n // Plain-text looping garbage response.\n if (hasKnownLoopSignature(trimmed)) {\n return \"degraded response: repetitive loop output\";\n }\n\n try {\n const parsed = JSON.parse(trimmed) as Record;\n\n // Some providers return JSON error payloads with HTTP 200.\n const errorField = parsed.error;\n let errorText = \"\";\n if (typeof errorField === \"string\") {\n errorText = errorField;\n } else if (errorField && typeof errorField === \"object\") {\n const errObj = errorField as Record;\n errorText = [\n typeof errObj.message === \"string\" ? errObj.message : \"\",\n typeof errObj.type === \"string\" ? errObj.type : \"\",\n typeof errObj.code === \"string\" ? errObj.code : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n if (errorText && PROVIDER_ERROR_PATTERNS.some((pattern) => pattern.test(errorText))) {\n return `degraded response: ${errorText.slice(0, 120)}`;\n }\n\n // Detect empty-turn responses: model returned 200 but no content and no tool calls.\n // Happens when models like gemini-3.1-flash-lite receive complex agentic requests\n // (e.g. Roo Code tool schemas) and produce zero output instead of refusing.\n const choices = parsed.choices;\n if (Array.isArray(choices) && choices.length > 0) {\n const choice = choices[0] as Record;\n const msg = (choice.message ?? choice.delta) as Record | undefined;\n if (msg) {\n const content = msg.content;\n const toolCalls = msg.tool_calls;\n const hasContent = typeof content === \"string\" && content.trim().length > 0;\n const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;\n const finishReason = choice.finish_reason as string | null | undefined;\n if (!hasContent && !hasToolCalls && finishReason === \"stop\") {\n return \"degraded response: empty turn (no content or tool calls)\";\n }\n }\n }\n\n // Successful wrapper with bad assistant content.\n const assistantContent = extractAssistantContent(parsed);\n if (!assistantContent) return undefined;\n if (DEGRADED_RESPONSE_PATTERNS.some((pattern) => pattern.test(assistantContent))) {\n return \"degraded response: overloaded assistant content\";\n }\n if (hasKnownLoopSignature(assistantContent)) {\n return \"degraded response: repetitive assistant loop\";\n }\n } catch {\n // Not JSON - handled by plaintext checks above.\n }\n\n return undefined;\n}\n\n/**\n * Valid message roles for OpenAI-compatible APIs.\n * Some clients send non-standard roles (e.g., \"developer\" instead of \"system\").\n */\nconst VALID_ROLES = new Set([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]);\n\n/**\n * Role mappings for non-standard roles.\n * Maps client-specific roles to standard OpenAI roles.\n */\nconst ROLE_MAPPINGS: Record = {\n developer: \"system\", // OpenAI's newer API uses \"developer\" for system messages\n model: \"assistant\", // Some APIs use \"model\" instead of \"assistant\"\n};\n\ntype ChatMessage = { role: string; content: string | unknown };\n\n/**\n * Anthropic tool ID pattern: only alphanumeric, underscore, and hyphen allowed.\n * Error: \"messages.X.content.Y.tool_use.id: String should match pattern '^[a-zA-Z0-9_-]+$'\"\n */\nconst VALID_TOOL_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\n/**\n * Sanitize a tool ID to match Anthropic's required pattern.\n * Replaces invalid characters with underscores.\n */\nfunction sanitizeToolId(id: string | undefined): string | undefined {\n if (!id || typeof id !== \"string\") return id;\n if (VALID_TOOL_ID_PATTERN.test(id)) return id;\n\n // Replace invalid characters with underscores\n return id.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\n/**\n * Type for messages with tool calls (OpenAI format).\n */\ntype MessageWithTools = ChatMessage & {\n tool_calls?: Array<{ id?: string; type?: string; function?: unknown }>;\n tool_call_id?: string;\n};\n\n/**\n * Type for content blocks that may contain tool IDs (Anthropic format in OpenAI wrapper).\n */\ntype ContentBlock = {\n type?: string;\n id?: string;\n tool_use_id?: string;\n [key: string]: unknown;\n};\n\n/**\n * Sanitize all tool IDs in messages to match Anthropic's pattern.\n * Handles both OpenAI format (tool_calls, tool_call_id) and content block formats.\n */\nfunction sanitizeToolIds(messages: ChatMessage[]): ChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n let hasChanges = false;\n const sanitized = messages.map((msg) => {\n const typedMsg = msg as MessageWithTools;\n let msgChanged = false;\n let newMsg = { ...msg } as MessageWithTools;\n\n // Sanitize tool_calls[].id in assistant messages\n if (typedMsg.tool_calls && Array.isArray(typedMsg.tool_calls)) {\n const newToolCalls = typedMsg.tool_calls.map((tc) => {\n if (tc.id && typeof tc.id === \"string\") {\n const sanitized = sanitizeToolId(tc.id);\n if (sanitized !== tc.id) {\n msgChanged = true;\n return { ...tc, id: sanitized };\n }\n }\n return tc;\n });\n if (msgChanged) {\n newMsg = { ...newMsg, tool_calls: newToolCalls };\n }\n }\n\n // Sanitize tool_call_id in tool messages\n if (typedMsg.tool_call_id && typeof typedMsg.tool_call_id === \"string\") {\n const sanitized = sanitizeToolId(typedMsg.tool_call_id);\n if (sanitized !== typedMsg.tool_call_id) {\n msgChanged = true;\n newMsg = { ...newMsg, tool_call_id: sanitized };\n }\n }\n\n // Sanitize content blocks if content is an array (Anthropic-style content)\n if (Array.isArray(typedMsg.content)) {\n const newContent = (typedMsg.content as ContentBlock[]).map((block) => {\n if (!block || typeof block !== \"object\") return block;\n\n let blockChanged = false;\n let newBlock = { ...block };\n\n // tool_use blocks have \"id\"\n if (block.type === \"tool_use\" && block.id && typeof block.id === \"string\") {\n const sanitized = sanitizeToolId(block.id);\n if (sanitized !== block.id) {\n blockChanged = true;\n newBlock = { ...newBlock, id: sanitized };\n }\n }\n\n // tool_result blocks have \"tool_use_id\"\n if (\n block.type === \"tool_result\" &&\n block.tool_use_id &&\n typeof block.tool_use_id === \"string\"\n ) {\n const sanitized = sanitizeToolId(block.tool_use_id);\n if (sanitized !== block.tool_use_id) {\n blockChanged = true;\n newBlock = { ...newBlock, tool_use_id: sanitized };\n }\n }\n\n if (blockChanged) {\n msgChanged = true;\n return newBlock;\n }\n return block;\n });\n\n if (msgChanged) {\n newMsg = { ...newMsg, content: newContent };\n }\n }\n\n if (msgChanged) {\n hasChanges = true;\n return newMsg;\n }\n return msg;\n });\n\n return hasChanges ? sanitized : messages;\n}\n\n/**\n * Normalize message roles to standard OpenAI format.\n * Converts non-standard roles (e.g., \"developer\") to valid ones.\n */\nfunction normalizeMessageRoles(messages: ChatMessage[]): ChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n let hasChanges = false;\n const normalized = messages.map((msg) => {\n if (VALID_ROLES.has(msg.role)) return msg;\n\n const mappedRole = ROLE_MAPPINGS[msg.role];\n if (mappedRole) {\n hasChanges = true;\n return { ...msg, role: mappedRole };\n }\n\n // Unknown role - default to \"user\" to avoid API errors\n hasChanges = true;\n return { ...msg, role: \"user\" };\n });\n\n return hasChanges ? normalized : messages;\n}\n\n/**\n * Normalize messages for Google models.\n * Google's Gemini API requires the first non-system message to be from \"user\".\n * If conversation starts with \"assistant\"/\"model\", prepend a placeholder user message.\n */\n\nfunction normalizeMessagesForGoogle(messages: ChatMessage[]): ChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n // Find first non-system message\n let firstNonSystemIdx = -1;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role !== \"system\") {\n firstNonSystemIdx = i;\n break;\n }\n }\n\n // If no non-system messages, return as-is\n if (firstNonSystemIdx === -1) return messages;\n\n const firstRole = messages[firstNonSystemIdx].role;\n\n // If first non-system message is already \"user\", no change needed\n if (firstRole === \"user\") return messages;\n\n // If first non-system message is \"assistant\" or \"model\", prepend a user message\n if (firstRole === \"assistant\" || firstRole === \"model\") {\n const normalized = [...messages];\n normalized.splice(firstNonSystemIdx, 0, {\n role: \"user\",\n content: \"(continuing conversation)\",\n });\n return normalized;\n }\n\n return messages;\n}\n\n/**\n * Check if a model is a Google model that requires message normalization.\n */\nfunction isGoogleModel(modelId: string): boolean {\n return modelId.startsWith(\"google/\") || modelId.startsWith(\"gemini\");\n}\n\n/**\n * Extended message type for thinking-enabled conversations.\n */\ntype ExtendedChatMessage = ChatMessage & {\n tool_calls?: unknown[];\n reasoning_content?: unknown;\n};\n\n/**\n * Normalize messages for thinking-enabled requests.\n * When thinking/extended_thinking is enabled, ALL assistant messages in history\n * must have reasoning_content (can be empty string if not present).\n *\n * Reasoning models like Kimi K2.5, DeepSeek-R1, etc. strip their thinking tokens\n * before we forward the response to the client. So when the client sends back the\n * assistant message in a follow-up turn, it lacks reasoning_content. These models\n * reject the multi-turn history with 400 if any assistant message is missing it.\n *\n * Previously only tool-call messages were patched — this missed plain text assistant\n * messages, causing 100% failures on existing (multi-turn) chats.\n *\n * Error examples:\n * \"400 thinking is enabled but reasoning_content is missing in assistant tool call message\"\n * \"400 thinking is enabled but reasoning_content is missing in assistant message\"\n */\nexport function normalizeMessagesForThinking(\n messages: ExtendedChatMessage[],\n): ExtendedChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n let hasChanges = false;\n const normalized = messages.map((msg) => {\n // Skip if not assistant or already has reasoning_content\n if (msg.role !== \"assistant\" || msg.reasoning_content !== undefined) {\n return msg;\n }\n\n // Add reasoning_content: \"\" to ALL assistant messages.\n // Reasoning models require it on every assistant turn in history, not just tool-call turns.\n hasChanges = true;\n return { ...msg, reasoning_content: \"\" };\n });\n\n return hasChanges ? normalized : messages;\n}\n\n/**\n * Remove \"blockrun\" branding from system messages before sending upstream.\n *\n * OpenClaw embeds `model=blockrun/auto` and `default_model=blockrun/auto` in its\n * system prompt Runtime section. LLMs pick up \"blockrun\" and adopt it as their\n * identity (e.g. \"I'm Blockrun\"), overriding the user's SOUL.md persona.\n *\n * This function replaces `blockrun/` references with the actual resolved\n * model name, and strips any remaining \"blockrun/\" prefix so the upstream LLM\n * never sees \"blockrun\" as an identity to adopt.\n */\nexport function debrandSystemMessages(\n messages: ChatMessage[],\n resolvedModel: string,\n): ChatMessage[] {\n // Routing profile names that get replaced with the actual model\n const PROFILE_NAMES = [\"auto\", \"free\", \"eco\", \"premium\"];\n const profilePattern = new RegExp(`\\\\bblockrun/(${PROFILE_NAMES.join(\"|\")})\\\\b`, \"gi\");\n // Also handle \"blockrun//\" → \"/\"\n const prefixPattern = /\\bblockrun\\/(?=[a-z])/gi;\n\n let hasChanges = false;\n const result = messages.map((msg) => {\n if (msg.role !== \"system\" || typeof msg.content !== \"string\") return msg;\n\n let content = msg.content;\n\n // Replace routing profiles (blockrun/auto etc.) with resolved model\n const afterProfiles = content.replace(profilePattern, resolvedModel);\n\n // Replace remaining blockrun/ prefix (e.g. blockrun/openai/gpt-4o → openai/gpt-4o)\n const afterPrefix = afterProfiles.replace(prefixPattern, \"\");\n\n if (afterPrefix !== content) {\n hasChanges = true;\n content = afterPrefix;\n }\n\n return content !== msg.content ? { ...msg, content } : msg;\n });\n\n return hasChanges ? result : messages;\n}\n\n/**\n * Result of truncating messages.\n */\ntype TruncationResult = {\n messages: T[];\n wasTruncated: boolean;\n originalCount: number;\n truncatedCount: number;\n};\n\n/**\n * Truncate messages to stay under BlockRun's MAX_MESSAGES limit.\n * Keeps all system messages and the most recent conversation history.\n * Returns the messages and whether truncation occurred.\n */\nfunction truncateMessages(messages: T[]): TruncationResult {\n if (!messages || messages.length <= MAX_MESSAGES) {\n return {\n messages,\n wasTruncated: false,\n originalCount: messages?.length ?? 0,\n truncatedCount: messages?.length ?? 0,\n };\n }\n\n // Separate system messages from conversation\n const systemMsgs = messages.filter((m) => m.role === \"system\");\n const conversationMsgs = messages.filter((m) => m.role !== \"system\");\n\n // Keep all system messages + most recent conversation messages\n const maxConversation = MAX_MESSAGES - systemMsgs.length;\n const truncatedConversation = conversationMsgs.slice(-maxConversation);\n\n const result = [...systemMsgs, ...truncatedConversation];\n\n console.log(\n `[XClawRouter] Truncated messages: ${messages.length} → ${result.length} (kept ${systemMsgs.length} system + ${truncatedConversation.length} recent)`,\n );\n\n return {\n messages: result,\n wasTruncated: true,\n originalCount: messages.length,\n truncatedCount: result.length,\n };\n}\n\n// Kimi/Moonshot models use special Unicode tokens for thinking boundaries.\n// Pattern: <|begin▁of▁thinking|>content<|end▁of▁thinking|>\n// The | is fullwidth vertical bar (U+FF5C), ▁ is lower one-eighth block (U+2581).\n\n// Match full Kimi thinking blocks: <|begin...|>content<|end...|>\nconst KIMI_BLOCK_RE = /<[||][^<>]*begin[^<>]*[||]>[\\s\\S]*?<[||][^<>]*end[^<>]*[||]>/gi;\n\n// Match standalone Kimi tokens like <|end▁of▁thinking|>\nconst KIMI_TOKEN_RE = /<[||][^<>]*[||]>/g;\n\n// Standard thinking tags that may leak through from various models\n// Includes namespaced antml:thinking (Anthropic internal monologue, stripped by OpenClaw v2026.4.2+)\nconst THINKING_TAG_RE = /<\\s*\\/?\\s*(?:think(?:ing)?|thought|antthinking|antml:thinking)\\b[^>]*>/gi;\n\n// Full thinking blocks: content\nconst THINKING_BLOCK_RE =\n /<\\s*(?:think(?:ing)?|thought|antthinking|antml:thinking)\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*(?:think(?:ing)?|thought|antthinking|antml:thinking)\\s*>/gi;\n\n/**\n * Strip thinking tokens and blocks from model response content.\n * Handles both Kimi-style Unicode tokens and standard XML-style tags.\n *\n * NOTE: DSML tags (<|DSML|...>) are NOT stripped - those are tool calls\n * that should be handled by the API, not hidden from users.\n */\nfunction stripThinkingTokens(content: string): string {\n if (!content) return content;\n // Strip full Kimi thinking blocks first (begin...end with content)\n let cleaned = content.replace(KIMI_BLOCK_RE, \"\");\n // Strip remaining standalone Kimi tokens\n cleaned = cleaned.replace(KIMI_TOKEN_RE, \"\");\n // Strip full thinking blocks (...)\n cleaned = cleaned.replace(THINKING_BLOCK_RE, \"\");\n // Strip remaining standalone thinking tags\n cleaned = cleaned.replace(THINKING_TAG_RE, \"\");\n return cleaned;\n}\n\n/** Callback info for low balance warning */\nexport type LowBalanceInfo = {\n balanceUSD: string;\n walletAddress: string;\n};\n\n/** Callback info for insufficient funds error */\nexport type InsufficientFundsInfo = {\n balanceUSD: string;\n requiredUSD: string;\n walletAddress: string;\n};\n\n/**\n * Wallet config: either a plain EVM private key string, or the full\n * resolution object from resolveOrGenerateWalletKey() which may include\n * Solana keys. Using the full object prevents callers from accidentally\n * forgetting to forward Solana key bytes.\n */\n/**\n * Wallet config accepts:\n * - string: legacy plain EVM private key\n * - { key, ... }: legacy resolution with optional Solana keys\n * - { source: \"okx\", address, onchainos }: OKX onchainos wallet — no\n * local key, signing delegated to the onchainos CLI.\n */\nexport type WalletConfig =\n | string\n | { key: string; solanaPrivateKeyBytes?: Uint8Array }\n | WalletResolution;\n\nexport type PaymentChain = \"base\" | \"solana\";\n\nexport type ProxyOptions = {\n wallet: WalletConfig;\n apiBase?: string;\n /** Payment chain: \"base\" (default) or \"solana\". Can also be set via CLAWROUTER_PAYMENT_CHAIN env var. */\n paymentChain?: PaymentChain;\n /** Port to listen on (default: 8402) */\n port?: number;\n routingConfig?: Partial;\n /** Request timeout in ms (default: 180000 = 3 minutes). Covers on-chain tx + LLM response. */\n requestTimeoutMs?: number;\n /** Skip balance checks (for testing only). Default: false */\n skipBalanceCheck?: boolean;\n /** Override the balance monitor with a mock (for testing only). */\n _balanceMonitorOverride?: AnyBalanceMonitor;\n /**\n * Session persistence config. When enabled, maintains model selection\n * across requests within a session to prevent mid-task model switching.\n */\n sessionConfig?: Partial;\n /**\n * Auto-compress large requests to reduce network usage.\n * When enabled, requests are automatically compressed using\n * LLM-safe context compression (15-40% reduction).\n * Default: true\n */\n autoCompressRequests?: boolean;\n /**\n * Threshold in KB to trigger auto-compression (default: 180).\n * Requests larger than this are compressed before sending.\n * Set to 0 to compress all requests.\n */\n compressionThresholdKB?: number;\n /**\n * Response caching config. When enabled, identical requests return\n * cached responses instead of making new API calls.\n * Default: enabled with 10 minute TTL, 200 max entries.\n */\n cacheConfig?: ResponseCacheConfig;\n /**\n * Maximum total spend (in USD) per session run.\n * Default: undefined (no limit). Example: 0.5 = $0.50 per session.\n */\n maxCostPerRunUsd?: number;\n /**\n * How to enforce the per-run cost cap.\n * - 'graceful' (default): when budget runs low, downgrade to cheaper models; use free model\n * as last resort. Only hard-stops when no model can serve the request.\n * - 'strict': immediately return 429 once the session spend reaches the cap.\n */\n maxCostPerRunMode?: \"graceful\" | \"strict\";\n /**\n * Set of model IDs to exclude from routing.\n * Excluded models are filtered out of fallback chains.\n * Loaded from ~/.openclaw/blockrun/exclude-models.json\n */\n excludeModels?: Set;\n onReady?: (port: number) => void;\n onError?: (error: Error) => void;\n onPayment?: (info: { model: string; amount: string; network: string }) => void;\n onRouted?: (decision: RoutingDecision) => void;\n /** Called when balance drops below $1.00 (warning, request still proceeds) */\n onLowBalance?: (info: LowBalanceInfo) => void;\n /** Called when balance is insufficient for a request (request fails) */\n onInsufficientFunds?: (info: InsufficientFundsInfo) => void;\n /**\n * Upstream proxy URL for all outgoing requests.\n * Supports http://, https://, and socks5:// schemes.\n * Also readable via BLOCKRUN_UPSTREAM_PROXY environment variable.\n * Example: \"socks5://127.0.0.1:1080\"\n */\n upstreamProxy?: string;\n};\n\nexport type ProxyHandle = {\n port: number;\n baseUrl: string;\n walletAddress: string;\n solanaAddress?: string;\n balanceMonitor: AnyBalanceMonitor;\n close: () => Promise;\n};\n\n/**\n * Build model pricing map from BLOCKRUN_MODELS.\n */\nfunction buildModelPricing(): Map {\n const map = new Map();\n for (const m of BLOCKRUN_MODELS) {\n if (m.id === AUTO_MODEL) continue; // skip meta-model\n const promoPrice = getActivePromoPrice(m);\n map.set(m.id, {\n inputPrice: m.inputPrice,\n outputPrice: m.outputPrice,\n ...(promoPrice !== undefined && { flatPrice: promoPrice }),\n });\n }\n return map;\n}\n\ntype ModelListEntry = {\n id: string;\n object: \"model\";\n created: number;\n owned_by: string;\n};\n\n/**\n * Build `/v1/models` response entries from the full OpenClaw model registry.\n * This includes alias IDs (e.g., `flash`, `kimi`) so `/model ` works reliably.\n */\nexport function buildProxyModelList(\n createdAt: number = Math.floor(Date.now() / 1000),\n): ModelListEntry[] {\n const seen = new Set();\n return OPENCLAW_MODELS.filter((model) => {\n if (seen.has(model.id)) return false;\n seen.add(model.id);\n return true;\n }).map((model) => ({\n id: model.id,\n object: \"model\",\n created: createdAt,\n owned_by: model.id.includes(\"/\") ? (model.id.split(\"/\")[0] ?? \"blockrun\") : \"blockrun\",\n }));\n}\n\n/**\n * Merge partial routing config overrides with defaults.\n */\nfunction mergeRoutingConfig(overrides?: Partial): RoutingConfig {\n if (!overrides) return DEFAULT_ROUTING_CONFIG;\n // Merge tier sets per-tier so users can override a single tier\n // (e.g. just COMPLEX) without having to redefine all four.\n // `null` explicitly disables a tier set (e.g. `agenticTiers: null` forces\n // all requests through regular tiers even when tools are present).\n const mergeTiers = (\n defaults: RoutingConfig[\"tiers\"] | null | undefined,\n user: Partial | null | undefined,\n ): RoutingConfig[\"tiers\"] | null => {\n if (user === null) return null;\n if (user === undefined) return defaults ?? null;\n return { ...(defaults ?? {}), ...user } as RoutingConfig[\"tiers\"];\n };\n return {\n ...DEFAULT_ROUTING_CONFIG,\n ...overrides,\n classifier: { ...DEFAULT_ROUTING_CONFIG.classifier, ...overrides.classifier },\n scoring: { ...DEFAULT_ROUTING_CONFIG.scoring, ...overrides.scoring },\n tiers:\n mergeTiers(DEFAULT_ROUTING_CONFIG.tiers, overrides.tiers) ?? DEFAULT_ROUTING_CONFIG.tiers,\n agenticTiers: mergeTiers(DEFAULT_ROUTING_CONFIG.agenticTiers, overrides.agenticTiers),\n ecoTiers: mergeTiers(DEFAULT_ROUTING_CONFIG.ecoTiers, overrides.ecoTiers),\n premiumTiers: mergeTiers(DEFAULT_ROUTING_CONFIG.premiumTiers, overrides.premiumTiers),\n overrides: { ...DEFAULT_ROUTING_CONFIG.overrides, ...overrides.overrides },\n };\n}\n\n/**\n * Build the `usage.cost` breakdown that XClawRouter injects into responses.\n * This uses ACTUAL token counts from the upstream usage field (not estimates)\n * and falls back to gracefully returning undefined when token counts or\n * routing info aren't available.\n *\n * OpenClaw's `session-cost-usage` module reads the standard `{total,input,output}`\n * fields. The extra fields (`baseline`, `savings_pct`, `model`, `tier`) are\n * forward-compat metadata for future OpenClaw UI or external analytics.\n *\n * Exported for unit tests.\n */\nexport type CostBreakdown = {\n /** Total cost in USD for this request (server-margin included). */\n total: number;\n /** Input-token cost in USD. */\n input: number;\n /** Output-token cost in USD. */\n output: number;\n /** What the baseline (Opus) would have cost for the same tokens. */\n baseline: number;\n /** Savings % vs baseline, integer 0..100. Omitted for `premium` profile. */\n savings_pct?: number;\n /** Actual model that answered (mirrors top-level `model` field). */\n model: string;\n /** Routing tier (SIMPLE / MEDIUM / COMPLEX / REASONING) if known. */\n tier?: string;\n};\n\nexport function buildCostBreakdown(params: {\n actualModelUsed: string;\n routingProfile: \"free\" | \"eco\" | \"auto\" | \"premium\" | undefined;\n routingDecision: { tier?: string } | undefined;\n modelPricing: Map;\n inputTokens: number | undefined;\n outputTokens: number | undefined;\n tier: string | undefined;\n}): CostBreakdown | undefined {\n const { actualModelUsed, routingProfile, modelPricing, inputTokens, outputTokens, tier } = params;\n // We need both token counts to produce meaningful actual-cost numbers.\n // If upstream didn't send usage (some providers omit it), skip cost injection\n // rather than publish misleading zero or estimate-based numbers.\n if (\n typeof inputTokens !== \"number\" ||\n typeof outputTokens !== \"number\" ||\n inputTokens < 0 ||\n outputTokens < 0\n ) {\n return undefined;\n }\n\n const pricing = modelPricing.get(actualModelUsed);\n const inputPrice = pricing?.inputPrice ?? 0;\n const outputPrice = pricing?.outputPrice ?? 0;\n const input = (inputTokens / 1_000_000) * inputPrice;\n const output = (outputTokens / 1_000_000) * outputPrice;\n\n // Use calculateModelCost to get server-margin-adjusted total and baseline\n // with the same logic as the pre-request estimator. This keeps total and\n // baseline internally consistent (same margin, same min-payment floor).\n const costs = calculateModelCost(\n actualModelUsed,\n modelPricing,\n inputTokens,\n outputTokens,\n routingProfile,\n );\n\n const total = costs.costEstimate;\n const baseline = costs.baselineCost;\n const savingsPct =\n routingProfile === \"premium\" || baseline <= 0\n ? undefined\n : Math.max(0, Math.min(100, Math.round(costs.savings * 100)));\n\n return {\n total,\n input,\n output,\n baseline,\n ...(savingsPct !== undefined ? { savings_pct: savingsPct } : {}),\n model: actualModelUsed,\n ...(tier ? { tier } : {}),\n };\n}\n\n/**\n * Estimate USDC cost for a request based on model pricing.\n * Returns amount string in USDC smallest unit (6 decimals) or undefined if unknown.\n */\nfunction estimateAmount(\n modelId: string,\n bodyLength: number,\n maxTokens: number,\n): string | undefined {\n const model = BLOCKRUN_MODELS.find((m) => m.id === modelId);\n if (!model) return undefined;\n\n let costUsd: number;\n const promoPrice = getActivePromoPrice(model);\n if (promoPrice !== undefined) {\n // Active promo: fixed cost per request, no token estimation needed\n costUsd = promoPrice;\n } else {\n // Rough estimate: ~4 chars per token for input\n const estimatedInputTokens = Math.ceil(bodyLength / 4);\n const estimatedOutputTokens = maxTokens || model.maxOutput || 4096;\n costUsd =\n (estimatedInputTokens / 1_000_000) * model.inputPrice +\n (estimatedOutputTokens / 1_000_000) * model.outputPrice;\n }\n\n // Convert to USDC 6-decimal integer, add 20% buffer for estimation error\n // Minimum 1000 ($0.001) to match CDP Facilitator's enforced minimum payment\n const amountMicros = Math.max(1000, Math.ceil(costUsd * 1.2 * 1_000_000));\n return amountMicros.toString();\n}\n\n// Image pricing table (must match server's IMAGE_MODELS in blockrun/src/lib/models.ts)\n// Server applies 5% margin on top of these prices.\nconst IMAGE_PRICING: Record }> = {\n \"openai/dall-e-3\": {\n default: 0.04,\n sizes: { \"1024x1024\": 0.04, \"1792x1024\": 0.08, \"1024x1792\": 0.08 },\n },\n \"openai/gpt-image-1\": {\n default: 0.02,\n sizes: { \"1024x1024\": 0.02, \"1536x1024\": 0.04, \"1024x1536\": 0.04 },\n },\n \"black-forest/flux-1.1-pro\": { default: 0.04 },\n \"google/nano-banana\": { default: 0.05 },\n \"google/nano-banana-pro\": {\n default: 0.1,\n sizes: { \"1024x1024\": 0.1, \"2048x2048\": 0.1, \"4096x4096\": 0.15 },\n },\n \"xai/grok-imagine-image\": { default: 0.02, sizes: { \"1024x1024\": 0.02 } },\n \"xai/grok-imagine-image-pro\": { default: 0.07, sizes: { \"1024x1024\": 0.07 } },\n \"zai/cogview-4\": {\n default: 0.015,\n sizes: {\n \"512x512\": 0.015,\n \"768x768\": 0.015,\n \"1024x1024\": 0.015,\n \"768x1344\": 0.015,\n \"1344x768\": 0.015,\n \"1440x1440\": 0.02,\n },\n },\n};\n\n// Video pricing (must match server's VIDEO_MODELS in blockrun/src/lib/models.ts)\nconst VIDEO_PRICING: Record = {\n \"xai/grok-imagine-video\": { pricePerSecond: 0.05, defaultDurationSeconds: 8 },\n \"bytedance/seedance-1.5-pro\": { pricePerSecond: 0.03, defaultDurationSeconds: 5 },\n \"bytedance/seedance-2.0-fast\": { pricePerSecond: 0.15, defaultDurationSeconds: 5 },\n \"bytedance/seedance-2.0\": { pricePerSecond: 0.3, defaultDurationSeconds: 5 },\n};\n\n/**\n * Estimate the cost of a video generation request (pricePerSecond × duration + 5% margin).\n */\nfunction estimateVideoCost(model: string, durationSeconds?: number): number {\n const p = VIDEO_PRICING[model];\n if (!p) return 0.4 * 1.05; // fallback: ~$0.40/clip + margin\n const dur = durationSeconds ?? p.defaultDurationSeconds;\n return p.pricePerSecond * dur * 1.05;\n}\n\n/**\n * Estimate the cost of an image generation/editing request.\n * Matches server-side calculateImagePrice() including 5% margin.\n */\nfunction estimateImageCost(model: string, size?: string, n: number = 1): number {\n const pricing = IMAGE_PRICING[model];\n if (!pricing) return 0.04 * n * 1.05; // fallback: assume $0.04/image + margin\n const sizePrice = size && pricing.sizes ? pricing.sizes[size] : undefined;\n const pricePerImage = sizePrice ?? pricing.default;\n return pricePerImage * n * 1.05; // 5% server margin\n}\n\n/**\n * Proxy a paid BlockRun data request through x402 payment flow.\n *\n * Used for partner endpoints (/v1/partner/*, /v1/pm/*), market data\n * (/v1/stocks/*, /v1/usstock/*, /v1/crypto/*, /v1/fx/*, /v1/commodity/*),\n * and wallet-backed data tools such as BlockRun Exa (/v1/exa/*). No smart routing,\n * SSE, compression, or sessions — just collect body, forward via payFetch\n * (which handles 402 automatically), and stream back.\n */\nasync function proxyPaidApiRequest(\n req: IncomingMessage,\n res: ServerResponse,\n apiBase: string,\n payFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise,\n getActualPaymentUsd: () => number,\n): Promise {\n const startTime = Date.now();\n const upstreamUrl = `${apiBase}${req.url}`;\n const isBlockrunExa = req.url?.startsWith(\"/v1/exa/\") ?? false;\n const isModalSandbox = req.url?.startsWith(\"/v1/modal/\") ?? false;\n const requestLabel = isBlockrunExa\n ? \"BlockRun Exa\"\n : isModalSandbox\n ? \"Modal Sandbox\"\n : \"Partner\";\n\n // Collect request body\n const bodyChunks: Buffer[] = [];\n for await (const chunk of req) {\n bodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const body = Buffer.concat(bodyChunks);\n\n // Forward headers (strip hop-by-hop + SDK/provider-specific)\n const headers: Record = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (\n key === \"host\" ||\n key === \"connection\" ||\n key === \"transfer-encoding\" ||\n key === \"content-length\"\n )\n continue;\n if (key.startsWith(\"x-stainless-\") || key.startsWith(\"anthropic-\")) continue;\n if (typeof value === \"string\") headers[key] = value;\n }\n if (!headers[\"content-type\"]) headers[\"content-type\"] = \"application/json\";\n headers[\"user-agent\"] = USER_AGENT;\n\n console.log(`[XClawRouter] ${requestLabel} request: ${req.method} ${req.url}`);\n\n const upstream = await payFetch(upstreamUrl, {\n method: req.method ?? \"POST\",\n headers,\n body: body.length > 0 ? new Uint8Array(body) : undefined,\n });\n\n // Forward response headers\n const responseHeaders: Record = {};\n upstream.headers.forEach((value, key) => {\n if (key === \"transfer-encoding\" || key === \"connection\" || key === \"content-encoding\") return;\n responseHeaders[key] = value;\n });\n\n res.writeHead(upstream.status, responseHeaders);\n\n // Stream response body\n if (upstream.body) {\n const chunks = await readBodyWithTimeout(upstream.body, ERROR_BODY_READ_TIMEOUT_MS);\n for (const chunk of chunks) {\n safeWrite(res, Buffer.from(chunk));\n }\n }\n\n res.end();\n\n const latencyMs = Date.now() - startTime;\n console.log(`[XClawRouter] ${requestLabel} response: ${upstream.status} (${latencyMs}ms)`);\n\n // Log paid tool usage with actual x402 payment amount.\n const requestCost = getActualPaymentUsd();\n logUsage({\n timestamp: new Date().toISOString(),\n model: isBlockrunExa ? \"blockrun-exa\" : isModalSandbox ? \"modal-sandbox\" : \"partner\",\n tier: \"PARTNER\",\n cost: requestCost,\n baselineCost: requestCost,\n savings: 0,\n latencyMs,\n partnerId:\n (req.url?.split(\"?\")[0] ?? \"\").replace(/^\\/v1\\//, \"\").replace(/\\//g, \"_\") || \"unknown\",\n service: isBlockrunExa ? \"web_search\" : isModalSandbox ? \"modal\" : \"partner\",\n }).catch(() => {});\n}\n\n/**\n * Read a local image file and return it as a base64 data URI.\n * Supports ~/ home directory expansion.\n */\nfunction readImageFileAsDataUri(filePath: string): string {\n const resolved = filePath.startsWith(\"~/\") ? join(homedir(), filePath.slice(2)) : filePath;\n\n if (!existsSync(resolved)) {\n throw new Error(`Image file not found: ${resolved}`);\n }\n\n const ext = resolved.split(\".\").pop()?.toLowerCase() ?? \"png\";\n const mimeMap: Record = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n };\n const mime = mimeMap[ext] ?? \"image/png\";\n const data = readFileSync(resolved);\n return `data:${mime};base64,${data.toString(\"base64\")}`;\n}\n\n/**\n * Upload a base64 data URI to catbox.moe and return a public URL.\n * Google image models (nano-banana) return data URIs instead of hosted URLs,\n * which breaks Telegram and other clients that can't render raw base64.\n */\nasync function uploadDataUriToHost(dataUri: string): Promise {\n const match = dataUri.match(/^data:(image\\/\\w+);base64,(.+)$/);\n if (!match) throw new Error(\"Invalid data URI format\");\n const [, mimeType, b64Data] = match;\n const ext = mimeType === \"image/jpeg\" ? \"jpg\" : (mimeType.split(\"/\")[1] ?? \"png\");\n\n const buffer = Buffer.from(b64Data, \"base64\");\n const blob = new Blob([buffer], { type: mimeType });\n\n const form = new FormData();\n form.append(\"reqtype\", \"fileupload\");\n form.append(\"fileToUpload\", blob, `image.${ext}`);\n\n const uploadController = new AbortController();\n const uploadTimeout = setTimeout(() => uploadController.abort(), 30_000);\n try {\n const resp = await fetch(\"https://catbox.moe/user/api.php\", {\n method: \"POST\",\n body: form,\n signal: uploadController.signal,\n });\n\n if (!resp.ok) throw new Error(`catbox.moe upload failed: HTTP ${resp.status}`);\n const result = await resp.text();\n if (result.startsWith(\"https://\")) {\n return result.trim();\n }\n throw new Error(`catbox.moe upload failed: ${result}`);\n } finally {\n clearTimeout(uploadTimeout);\n }\n}\n\n/**\n * Start the local x402 proxy server.\n *\n * If a proxy is already running on the target port, reuses it instead of failing.\n * Port can be configured via BLOCKRUN_PROXY_PORT environment variable.\n *\n * Returns a handle with the assigned port, base URL, and a close function.\n */\nexport async function startProxy(options: ProxyOptions): Promise {\n // Apply upstream proxy (SOCKS5/HTTP) before any outgoing requests\n const upstreamProxy = await applyUpstreamProxy(options.upstreamProxy);\n if (upstreamProxy) {\n console.log(`[XClawRouter] Upstream proxy: ${upstreamProxy}`);\n }\n\n // Normalize wallet config. Three shapes:\n // 1. Plain string private key (legacy CLI/test path)\n // 2. Full resolution object with `key` (legacy local-key path)\n // 3. OKX resolution with `source: \"okx\"` and an `onchainos` adapter — no\n // local key, signing happens via the onchainos CLI.\n const walletObj = typeof options.wallet === \"string\" ? undefined : options.wallet;\n const isOkxWallet =\n walletObj !== undefined &&\n \"source\" in walletObj &&\n walletObj.source === \"okx\" &&\n walletObj.onchainos !== undefined;\n const walletKey = typeof options.wallet === \"string\" ? options.wallet : walletObj?.key;\n const solanaPrivateKeyBytes = walletObj?.solanaPrivateKeyBytes;\n const okxAdapter: OnchainOsAdapter | undefined = isOkxWallet ? walletObj?.onchainos : undefined;\n const okxAddress: `0x${string}` | undefined = isOkxWallet\n ? (walletObj!.address as `0x${string}`)\n : undefined;\n if (!walletKey && !okxAdapter) {\n throw new Error(\n \"Wallet config has no signing backend: provide a private key or an OKX onchainos wallet.\",\n );\n }\n\n // Payment chain: options > env var > persisted file > default \"base\".\n // No dynamic switching — user selects chain via /wallet solana or /wallet base.\n const paymentChain = options.paymentChain ?? (await resolvePaymentChain());\n const apiBase =\n options.apiBase ??\n (paymentChain === \"solana\" && solanaPrivateKeyBytes ? BLOCKRUN_SOLANA_API : BLOCKRUN_API);\n if (paymentChain === \"solana\" && !solanaPrivateKeyBytes) {\n console.warn(\n `[XClawRouter] ⚠ Payment chain is Solana but no mnemonic found — falling back to Base (EVM).`,\n );\n console.warn(\n `[XClawRouter] To fix: run \"npx @blockrun/xclawrouter wallet recover\" if your mnemonic exists,`,\n );\n console.warn(`[XClawRouter] or run \"npx @blockrun/xclawrouter chain base\" to switch to EVM.`);\n } else if (paymentChain === \"solana\") {\n console.log(`[XClawRouter] Payment chain: Solana (${BLOCKRUN_SOLANA_API})`);\n }\n\n // Determine port: options.port > env var > default\n const listenPort = options.port ?? getProxyPort();\n\n // Check if a proxy is already running on this port\n const existingProxy = await checkExistingProxy(listenPort);\n if (existingProxy) {\n // Proxy already running — reuse it instead of failing with EADDRINUSE\n const expectedAddress: `0x${string}` =\n okxAddress ?? privateKeyToAccount(walletKey as `0x${string}`).address;\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n\n // Verify the existing proxy is using the same wallet (or warn if different)\n if (existingProxy.wallet !== expectedAddress) {\n console.warn(\n `[XClawRouter] Existing proxy on port ${listenPort} uses wallet ${existingProxy.wallet}, but current config uses ${expectedAddress}. Reusing existing proxy.`,\n );\n }\n\n // Verify the existing proxy is using the same payment chain\n if (existingProxy.paymentChain) {\n if (existingProxy.paymentChain !== paymentChain) {\n throw new Error(\n `Existing proxy on port ${listenPort} is using ${existingProxy.paymentChain} but ${paymentChain} was requested. ` +\n `Stop the existing proxy first or use a different port.`,\n );\n }\n } else if (paymentChain !== \"base\") {\n // Old proxy doesn't report chain — assume Base. Reject if Solana was requested.\n console.warn(\n `[XClawRouter] Existing proxy on port ${listenPort} does not report paymentChain (pre-v0.11 instance). Assuming Base.`,\n );\n throw new Error(\n `Existing proxy on port ${listenPort} is a pre-v0.11 instance (assumed Base) but ${paymentChain} was requested. ` +\n `Stop the existing proxy first or use a different port.`,\n );\n }\n\n // Derive Solana address if keys are available (for wallet status display)\n let reuseSolanaAddress: string | undefined;\n if (solanaPrivateKeyBytes) {\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(solanaPrivateKeyBytes);\n reuseSolanaAddress = solanaSigner.address;\n }\n\n // Use chain-appropriate balance monitor (lazy import to avoid loading @solana/kit on Base chain)\n let balanceMonitor: AnyBalanceMonitor;\n if (paymentChain === \"solana\" && reuseSolanaAddress) {\n const { SolanaBalanceMonitor } = await import(\"./solana-balance.js\");\n balanceMonitor = new SolanaBalanceMonitor(reuseSolanaAddress);\n } else {\n balanceMonitor = new BalanceMonitor(expectedAddress);\n }\n\n options.onReady?.(listenPort);\n\n return {\n port: listenPort,\n baseUrl,\n walletAddress: existingProxy.wallet,\n solanaAddress: reuseSolanaAddress,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n // Create x402 payment client. Two signing backends:\n // - OKX onchainos (when wallet source is \"okx\") — payments signed via the\n // `onchainos payment x402-pay` CLI, no private keys in this process.\n // - Local viem account (default) — derived from BIP-39 / env private key.\n const useOnchainos = !!okxAdapter;\n const evmPublicClient = createPublicClient({ chain: base, transport: http() });\n const x402 = new x402Client();\n\n let account: { address: `0x${string}` };\n if (useOnchainos) {\n account = { address: okxAddress! };\n console.log(`[XClawRouter] OKX onchainos wallet — EVM ${okxAddress}`);\n } else {\n const acct = privateKeyToAccount(walletKey as `0x${string}`);\n account = { address: acct.address };\n const evmSigner = toClientEvmSigner(acct, evmPublicClient);\n registerExactEvmScheme(x402, { signer: evmSigner });\n }\n\n // Register Solana scheme if key is available. OKX onchainos focuses on Base\n // (EVM); Solana support stays on the legacy local-mnemonic path.\n let solanaAddress: string | undefined;\n if (!useOnchainos && solanaPrivateKeyBytes) {\n const { registerExactSvmScheme } = await import(\"@x402/svm/exact/client\");\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(solanaPrivateKeyBytes);\n solanaAddress = solanaSigner.address;\n registerExactSvmScheme(x402, { signer: solanaSigner });\n console.log(`[XClawRouter] Solana wallet: ${solanaAddress}`);\n } else if (useOnchainos && paymentChain === \"solana\") {\n console.warn(\n `[XClawRouter] ⚠ Solana signing via onchainos is not yet implemented. ` +\n `Run \"/chain base\" to switch chains, or wait for an onchainos release that supports Solana.`,\n );\n }\n\n // Log which chain is used for each payment and capture actual payment amount\n x402.onAfterPaymentCreation(async (context) => {\n const network = context.selectedRequirements.network;\n const chain = network.startsWith(\"eip155\")\n ? \"Base (EVM)\"\n : network.startsWith(\"solana\")\n ? \"Solana\"\n : network;\n // Capture actual payment amount in USD (amount is in USDC micro units, 6 decimals)\n const amountMicros = parseInt(context.selectedRequirements.amount || \"0\", 10);\n const amountUsd = amountMicros / 1_000_000;\n // Write to request-scoped store (if available)\n const store = paymentStore.getStore();\n if (store) store.amountUsd = amountUsd;\n console.log(`[XClawRouter] Payment signed on ${chain} (${network}) — $${amountUsd.toFixed(6)}`);\n });\n\n // OKX mode: bypass @x402/fetch — onchainos exposes only the high-level\n // `payment x402-pay` command, not raw typed-data signing, so we hand-roll\n // 402-handling in createOnchainosPayFetch.\n const payFetch = useOnchainos\n ? createOnchainosPayFetch(fetch, okxAdapter!)\n : createPayFetchWithPreAuth(fetch, x402, undefined, {\n skipPreAuth: paymentChain === \"solana\",\n });\n\n // Create balance monitor for pre-request checks (lazy import to avoid loading @solana/kit on Base chain)\n let balanceMonitor: AnyBalanceMonitor;\n if (options._balanceMonitorOverride) {\n balanceMonitor = options._balanceMonitorOverride;\n } else if (paymentChain === \"solana\" && solanaAddress) {\n const { SolanaBalanceMonitor } = await import(\"./solana-balance.js\");\n balanceMonitor = new SolanaBalanceMonitor(solanaAddress);\n } else {\n balanceMonitor = new BalanceMonitor(account.address);\n }\n\n // Build router options (100% local — no external API calls for routing)\n const routingConfig = mergeRoutingConfig(options.routingConfig);\n const modelPricing = buildModelPricing();\n const routerOpts: RouterOptions = {\n config: routingConfig,\n modelPricing,\n };\n\n // Request deduplicator (shared across all requests)\n const deduplicator = new RequestDeduplicator();\n\n // Response cache for identical requests (longer TTL than dedup)\n const responseCache = new ResponseCache(options.cacheConfig);\n\n // Session store for model persistence (prevents mid-task model switching)\n const sessionStore = new SessionStore(options.sessionConfig);\n\n // Session journal for memory (enables agents to recall earlier work)\n const sessionJournal = new SessionJournal();\n\n // Track active connections for graceful cleanup\n const connections = new Set();\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n // Wrap in paymentStore.run() so x402 hook can write actual payment amount per-request\n paymentStore.run({ amountUsd: 0 }, async () => {\n // Add stream error handlers to prevent server crashes\n req.on(\"error\", (err) => {\n console.error(`[XClawRouter] Request stream error: ${err.message}`);\n // Don't throw - just log and let request handler deal with it\n });\n\n res.on(\"error\", (err) => {\n console.error(`[XClawRouter] Response stream error: ${err.message}`);\n // Don't try to write to failed socket - just log\n });\n\n // Finished wrapper for guaranteed cleanup on response completion/error\n finished(res, (err) => {\n if (err && err.code !== \"ERR_STREAM_DESTROYED\") {\n console.error(`[XClawRouter] Response finished with error: ${err.message}`);\n }\n // Note: heartbeatInterval cleanup happens in res.on(\"close\") handler\n // Note: completed and dedup cleanup happens in the res.on(\"close\") handler below\n });\n\n // Request finished wrapper for complete stream lifecycle tracking\n finished(req, (err) => {\n if (err && err.code !== \"ERR_STREAM_DESTROYED\") {\n console.error(`[XClawRouter] Request finished with error: ${err.message}`);\n }\n });\n\n // Health check with optional balance info\n if (req.url === \"/health\" || req.url?.startsWith(\"/health?\")) {\n const url = new URL(req.url, \"http://localhost\");\n const full = url.searchParams.get(\"full\") === \"true\";\n\n const response: Record = {\n status: \"ok\",\n wallet: account.address,\n paymentChain,\n };\n if (solanaAddress) {\n response.solana = solanaAddress;\n }\n if (upstreamProxy) {\n response.upstreamProxy = upstreamProxy;\n }\n\n if (full) {\n try {\n const balanceInfo = await balanceMonitor.checkBalance();\n response.balance = balanceInfo.balanceUSD;\n response.isLow = balanceInfo.isLow;\n response.isEmpty = balanceInfo.isEmpty;\n } catch {\n response.balanceError = \"Could not fetch balance\";\n }\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(response));\n return;\n }\n\n // Cache stats endpoint\n if (req.url === \"/cache\" || req.url?.startsWith(\"/cache?\")) {\n const stats = responseCache.getStats();\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n });\n res.end(JSON.stringify(stats, null, 2));\n return;\n }\n\n // Stats clear endpoint - delete all log files\n if (req.url === \"/stats\" && req.method === \"DELETE\") {\n try {\n const result = await clearStats();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ cleared: true, deletedFiles: result.deletedFiles }));\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `Failed to clear stats: ${err instanceof Error ? err.message : String(err)}`,\n }),\n );\n }\n return;\n }\n\n // Stats API endpoint - returns JSON for programmatic access\n if (req.url === \"/stats\" || req.url?.startsWith(\"/stats?\")) {\n try {\n const url = new URL(req.url, \"http://localhost\");\n const days = parseInt(url.searchParams.get(\"days\") || \"7\", 10);\n const stats = await getStats(Math.min(days, 30));\n\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n });\n res.end(\n JSON.stringify(\n {\n ...stats,\n providerErrors: Object.fromEntries(perProviderErrors),\n },\n null,\n 2,\n ),\n );\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `Failed to get stats: ${err instanceof Error ? err.message : String(err)}`,\n }),\n );\n }\n return;\n }\n\n // --- Handle /v1/models locally (no upstream call needed) ---\n if (req.url === \"/v1/models\" && req.method === \"GET\") {\n const models = buildProxyModelList();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ object: \"list\", data: models }));\n return;\n }\n\n // --- Serve locally cached images (~/.openclaw/blockrun/images/) ---\n if (req.url?.startsWith(\"/images/\") && req.method === \"GET\") {\n const filename = req.url\n .slice(\"/images/\".length)\n .split(\"?\")[0]!\n .replace(/[^a-zA-Z0-9._-]/g, \"\");\n if (!filename) {\n res.writeHead(400);\n res.end(\"Bad request\");\n return;\n }\n const filePath = join(IMAGE_DIR, filename);\n try {\n const s = await fsStat(filePath);\n if (!s.isFile()) throw new Error(\"not a file\");\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"png\";\n const mime: Record = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n gif: \"image/gif\",\n };\n const data = await readFile(filePath);\n res.writeHead(200, {\n \"Content-Type\": mime[ext] ?? \"application/octet-stream\",\n \"Content-Length\": data.length,\n });\n res.end(data);\n } catch {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image not found\" }));\n }\n return;\n }\n\n // --- Serve locally cached audio (~/.openclaw/blockrun/audio/) ---\n if (req.url?.startsWith(\"/audio/\") && req.method === \"GET\") {\n const filename = req.url\n .slice(\"/audio/\".length)\n .split(\"?\")[0]!\n .replace(/[^a-zA-Z0-9._-]/g, \"\");\n if (!filename) {\n res.writeHead(400);\n res.end(\"Bad request\");\n return;\n }\n const filePath = join(AUDIO_DIR, filename);\n try {\n const s = await fsStat(filePath);\n if (!s.isFile()) throw new Error(\"not a file\");\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"mp3\";\n const mime: Record = {\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n m4a: \"audio/mp4\",\n };\n const data = await readFile(filePath);\n res.writeHead(200, {\n \"Content-Type\": mime[ext] ?? \"audio/mpeg\",\n \"Content-Length\": data.length,\n });\n res.end(data);\n } catch {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Audio not found\" }));\n }\n return;\n }\n\n // --- Serve locally cached videos (~/.openclaw/blockrun/videos/) ---\n if (req.url?.startsWith(\"/videos/\") && req.method === \"GET\") {\n const filename = req.url\n .slice(\"/videos/\".length)\n .split(\"?\")[0]!\n .replace(/[^a-zA-Z0-9._-]/g, \"\");\n if (!filename) {\n res.writeHead(400);\n res.end(\"Bad request\");\n return;\n }\n const filePath = join(VIDEO_DIR, filename);\n try {\n const s = await fsStat(filePath);\n if (!s.isFile()) throw new Error(\"not a file\");\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"mp4\";\n const mime: Record = {\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mov: \"video/quicktime\",\n };\n const data = await readFile(filePath);\n res.writeHead(200, {\n \"Content-Type\": mime[ext] ?? \"video/mp4\",\n \"Content-Length\": data.length,\n });\n res.end(data);\n } catch {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Video not found\" }));\n }\n return;\n }\n\n // --- Handle /v1/images/generations: proxy with x402 payment + save data URIs locally ---\n // NOTE: image generation endpoints bypass maxCostPerRun budget tracking entirely.\n // Cost is charged via x402 micropayment directly — no session accumulation or cap enforcement.\n if (req.url === \"/v1/images/generations\" && req.method === \"POST\") {\n const imgStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const reqBody = Buffer.concat(chunks);\n // Parse request for usage logging\n let imgModel = \"unknown\";\n let imgCost = 0;\n try {\n const parsed = JSON.parse(reqBody.toString());\n imgModel = parsed.model || \"openai/dall-e-3\";\n const n = parsed.n || 1;\n imgCost = estimateImageCost(imgModel, parsed.size, n);\n } catch {\n /* use defaults */\n }\n try {\n const upstream = await payFetch(`${apiBase}/v1/images/generations`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const text = await upstream.text();\n if (!upstream.ok) {\n res.writeHead(upstream.status, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n let result: { created?: number; data?: Array<{ url?: string; revised_prompt?: string }> };\n try {\n result = JSON.parse(text);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n // Save images to ~/.openclaw/blockrun/images/ and replace with localhost URLs\n // Handles both base64 data URIs (Google) and HTTP URLs (DALL-E 3)\n if (result.data?.length) {\n await mkdir(IMAGE_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const img of result.data) {\n const dataUriMatch = img.url?.match(/^data:(image\\/\\w+);base64,(.+)$/);\n if (dataUriMatch) {\n const [, mimeType, b64] = dataUriMatch;\n const ext = mimeType === \"image/jpeg\" ? \"jpg\" : (mimeType!.split(\"/\")[1] ?? \"png\");\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n await writeFile(join(IMAGE_DIR, filename), Buffer.from(b64!, \"base64\"));\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image saved → ${img.url}`);\n } else if (img.url?.startsWith(\"https://\") || img.url?.startsWith(\"http://\")) {\n try {\n const imgResp = await fetch(img.url);\n if (imgResp.ok) {\n const contentType = imgResp.headers.get(\"content-type\") ?? \"image/png\";\n const ext =\n contentType.includes(\"jpeg\") || contentType.includes(\"jpg\")\n ? \"jpg\"\n : contentType.includes(\"webp\")\n ? \"webp\"\n : \"png\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await imgResp.arrayBuffer());\n await writeFile(join(IMAGE_DIR, filename), buf);\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image downloaded & saved → ${img.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download image, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n // Log image generation usage with actual x402 payment (previously missing entirely)\n const imgActualCost = paymentStore.getStore()?.amountUsd ?? imgCost;\n logUsage({\n timestamp: new Date().toISOString(),\n model: imgModel,\n tier: \"IMAGE\",\n cost: imgActualCost,\n baselineCost: imgActualCost,\n savings: 0,\n latencyMs: Date.now() - imgStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Image generation error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image generation failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle /v1/images/image2image: proxy with x402 payment + save images locally ---\n // Accepts image as: data URI, local file path, ~/path, or HTTP(S) URL\n if (req.url === \"/v1/images/image2image\" && req.method === \"POST\") {\n const img2imgStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const rawBody = Buffer.concat(chunks);\n\n // Resolve image/mask fields: file paths and URLs → data URIs\n let reqBody: string;\n // eslint-disable-next-line no-useless-assignment -- reassigned in try, used after catch\n let img2imgModel = \"openai/gpt-image-1\";\n // eslint-disable-next-line no-useless-assignment -- reassigned in try, used after catch\n let img2imgCost = 0;\n try {\n const parsed = JSON.parse(rawBody.toString());\n for (const field of [\"image\", \"mask\"] as const) {\n const val = parsed[field];\n if (typeof val !== \"string\" || !val) continue;\n if (val.startsWith(\"data:\")) {\n // Already a data URI — pass through\n } else if (val.startsWith(\"https://\") || val.startsWith(\"http://\")) {\n // Download URL → data URI\n const imgResp = await fetch(val);\n if (!imgResp.ok)\n throw new Error(`Failed to download ${field} from ${val}: HTTP ${imgResp.status}`);\n const contentType = imgResp.headers.get(\"content-type\") ?? \"image/png\";\n const buf = Buffer.from(await imgResp.arrayBuffer());\n parsed[field] = `data:${contentType};base64,${buf.toString(\"base64\")}`;\n console.log(\n `[XClawRouter] img2img: downloaded ${field} URL → data URI (${buf.length} bytes)`,\n );\n } else {\n // Local file path → data URI\n parsed[field] = readImageFileAsDataUri(val);\n console.log(`[XClawRouter] img2img: read ${field} file → data URI`);\n }\n }\n // Default model if not specified\n if (!parsed.model) parsed.model = \"openai/gpt-image-1\";\n img2imgModel = parsed.model;\n img2imgCost = estimateImageCost(img2imgModel, parsed.size, parsed.n || 1);\n reqBody = JSON.stringify(parsed);\n } catch (parseErr) {\n const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid request\", details: msg }));\n return;\n }\n\n try {\n const upstream = await payFetch(`${apiBase}/v1/images/image2image`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const text = await upstream.text();\n if (!upstream.ok) {\n res.writeHead(upstream.status, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n let result: { created?: number; data?: Array<{ url?: string; revised_prompt?: string }> };\n try {\n result = JSON.parse(text);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n // Save images to ~/.openclaw/blockrun/images/ and replace with localhost URLs\n // Handles both base64 data URIs (Google) and HTTP URLs (DALL-E 3)\n if (result.data?.length) {\n await mkdir(IMAGE_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const img of result.data) {\n const dataUriMatch = img.url?.match(/^data:(image\\/\\w+);base64,(.+)$/);\n if (dataUriMatch) {\n const [, mimeType, b64] = dataUriMatch;\n const ext = mimeType === \"image/jpeg\" ? \"jpg\" : (mimeType!.split(\"/\")[1] ?? \"png\");\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n await writeFile(join(IMAGE_DIR, filename), Buffer.from(b64!, \"base64\"));\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image saved → ${img.url}`);\n } else if (img.url?.startsWith(\"https://\") || img.url?.startsWith(\"http://\")) {\n try {\n const imgResp = await fetch(img.url);\n if (imgResp.ok) {\n const contentType = imgResp.headers.get(\"content-type\") ?? \"image/png\";\n const ext =\n contentType.includes(\"jpeg\") || contentType.includes(\"jpg\")\n ? \"jpg\"\n : contentType.includes(\"webp\")\n ? \"webp\"\n : \"png\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await imgResp.arrayBuffer());\n await writeFile(join(IMAGE_DIR, filename), buf);\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image downloaded & saved → ${img.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download image, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n // Log image editing usage with actual x402 payment (previously missing entirely)\n const img2imgActualCost = paymentStore.getStore()?.amountUsd ?? img2imgCost;\n logUsage({\n timestamp: new Date().toISOString(),\n model: img2imgModel,\n tier: \"IMAGE\",\n cost: img2imgActualCost,\n baselineCost: img2imgActualCost,\n savings: 0,\n latencyMs: Date.now() - img2imgStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Image editing error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image editing failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle /v1/audio/generations: proxy with x402 payment + save audio locally ---\n if (req.url === \"/v1/audio/generations\" && req.method === \"POST\") {\n const audioStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const reqBody = Buffer.concat(chunks);\n let audioModel = \"minimax/music-2.5+\";\n try {\n const parsed = JSON.parse(reqBody.toString());\n audioModel = parsed.model || audioModel;\n } catch {\n /* use defaults */\n }\n try {\n const upstream = await payFetch(`${apiBase}/v1/audio/generations`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const text = await upstream.text();\n if (!upstream.ok) {\n res.writeHead(upstream.status, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n let result: {\n created?: number;\n model?: string;\n data?: Array<{ url?: string; duration_seconds?: number; lyrics?: string }>;\n };\n try {\n result = JSON.parse(text);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n // Download audio from remote URL and save locally\n if (result.data?.length) {\n await mkdir(AUDIO_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const track of result.data) {\n if (track.url?.startsWith(\"https://\") || track.url?.startsWith(\"http://\")) {\n try {\n const audioResp = await fetch(track.url);\n if (audioResp.ok) {\n const contentType = audioResp.headers.get(\"content-type\") ?? \"audio/mpeg\";\n const ext = contentType.includes(\"wav\") ? \"wav\" : \"mp3\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await audioResp.arrayBuffer());\n await writeFile(join(AUDIO_DIR, filename), buf);\n track.url = `http://localhost:${port}/audio/${filename}`;\n console.log(`[XClawRouter] Audio saved → ${track.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download audio, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n const audioActualCost = paymentStore.getStore()?.amountUsd ?? 0.15;\n logUsage({\n timestamp: new Date().toISOString(),\n model: audioModel,\n tier: \"AUDIO\",\n cost: audioActualCost,\n baselineCost: audioActualCost,\n savings: 0,\n latencyMs: Date.now() - audioStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Audio generation error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Audio generation failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle /v1/videos/generations: async submit + poll ---\n // Server protocol (BlockRun 2026-04-23+):\n // POST /v1/videos/generations → 202 { id, poll_url } (payment verified, not settled)\n // GET /v1/videos/generations/{id} → 202 while queued/in_progress, 200 on completed\n // (settles on the first completed poll)\n // We collapse this back into a single blocking POST for the client — upstream\n // polling happens server-side and the client sees one HTTP round-trip.\n if (req.url === \"/v1/videos/generations\" && req.method === \"POST\") {\n const videoStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const reqBody = Buffer.concat(chunks);\n let videoModel = \"xai/grok-imagine-video\";\n let videoDuration: number | undefined;\n try {\n const parsed = JSON.parse(reqBody.toString());\n videoModel = parsed.model || videoModel;\n videoDuration =\n typeof parsed.duration_seconds === \"number\" ? parsed.duration_seconds : undefined;\n } catch {\n /* use defaults */\n }\n try {\n // Step 1: submit job. Server returns 202 with poll_url.\n const submitResp = await payFetch(`${apiBase}/v1/videos/generations`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const submitText = await submitResp.text();\n if (!submitResp.ok && submitResp.status !== 202) {\n res.writeHead(submitResp.status, { \"Content-Type\": \"application/json\" });\n res.end(submitText);\n return;\n }\n let submitResult: {\n id?: string;\n poll_url?: string;\n status?: string;\n // Legacy (pre-2026-04-23) servers still return the final result directly.\n created?: number;\n model?: string;\n data?: Array<{ url?: string; duration_seconds?: number; backed_up?: boolean }>;\n };\n try {\n submitResult = JSON.parse(submitText);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(submitText);\n return;\n }\n\n // Step 2: if no poll_url, upstream responded with the final result (legacy server) —\n // drop through to the same local-caching path as before.\n let finalResult: typeof submitResult = submitResult;\n if (submitResult.poll_url && submitResult.id) {\n const apiOrigin = new URL(apiBase).origin;\n const pollUrl = submitResult.poll_url.startsWith(\"http\")\n ? submitResult.poll_url\n : `${apiOrigin}${submitResult.poll_url}`;\n console.log(\n `[XClawRouter] Video job submitted (id=${submitResult.id}), polling upstream — typical 60–180s...`,\n );\n\n // Upstream typically 60-180s. Poll every 5s, bail after ~5min total.\n // Auth is 10min per server config; we stop before that.\n const pollDeadline = Date.now() + 300_000;\n const pollInterval = 5_000;\n // Small initial delay so the upstream has a chance to start.\n await new Promise((r) => setTimeout(r, 3_000));\n let pollError: string | undefined;\n while (Date.now() < pollDeadline) {\n const pollResp = await payFetch(pollUrl, {\n method: \"GET\",\n headers: { \"user-agent\": USER_AGENT },\n });\n const pollText = await pollResp.text();\n let pollBody: typeof submitResult & { error?: string } = {};\n try {\n pollBody = JSON.parse(pollText);\n } catch {\n pollError = `Non-JSON poll response (${pollResp.status}): ${pollText.slice(0, 200)}`;\n break;\n }\n if (\n pollResp.status === 202 ||\n pollBody.status === \"queued\" ||\n pollBody.status === \"in_progress\"\n ) {\n await new Promise((r) => setTimeout(r, pollInterval));\n continue;\n }\n if (pollBody.status === \"failed\") {\n pollError = pollBody.error ?? \"Upstream video generation failed\";\n break;\n }\n if (pollResp.ok && pollBody.status === \"completed\") {\n finalResult = pollBody;\n break;\n }\n // Any other non-OK: surface it.\n if (!pollResp.ok) {\n res.writeHead(pollResp.status, { \"Content-Type\": \"application/json\" });\n res.end(pollText);\n return;\n }\n // OK but no known status — treat as final and hand through.\n finalResult = pollBody;\n break;\n }\n if (pollError) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Video generation failed\", details: pollError }));\n return;\n }\n if (!finalResult.data) {\n res.writeHead(504, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: \"Video generation timed out\",\n details: `Upstream did not complete within 5 minutes (job id=${submitResult.id}). No payment has been settled.`,\n }),\n );\n return;\n }\n }\n\n // Step 3: download any hosted URLs to local disk + rewrite to localhost.\n if (finalResult.data?.length) {\n await mkdir(VIDEO_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const clip of finalResult.data) {\n if (clip.url?.startsWith(\"https://\") || clip.url?.startsWith(\"http://\")) {\n try {\n const videoResp = await fetch(clip.url);\n if (videoResp.ok) {\n const contentType = videoResp.headers.get(\"content-type\") ?? \"video/mp4\";\n const ext = contentType.includes(\"webm\")\n ? \"webm\"\n : contentType.includes(\"quicktime\")\n ? \"mov\"\n : \"mp4\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await videoResp.arrayBuffer());\n await writeFile(join(VIDEO_DIR, filename), buf);\n clip.url = `http://localhost:${port}/videos/${filename}`;\n console.log(`[XClawRouter] Video saved → ${clip.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download video, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n const videoActualCost =\n paymentStore.getStore()?.amountUsd ?? estimateVideoCost(videoModel, videoDuration);\n logUsage({\n timestamp: new Date().toISOString(),\n model: videoModel,\n tier: \"VIDEO\",\n cost: videoActualCost,\n baselineCost: videoActualCost,\n savings: 0,\n latencyMs: Date.now() - videoStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(finalResult));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Video generation error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Video generation failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle paid API paths (/v1/partner/*, /v1/pm/*, /v1/exa/*, /v1/modal/*,\n // /v1/stocks/*, /v1/usstock/*, /v1/crypto/*, /v1/fx/*, /v1/commodity/*) ---\n if (req.url?.match(/^\\/v1\\/(?:partner|pm|exa|modal|stocks|usstock|crypto|fx|commodity)\\//)) {\n try {\n await proxyPaidApiRequest(\n req,\n res,\n apiBase,\n payFetch,\n () => paymentStore.getStore()?.amountUsd ?? 0,\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n options.onError?.(error);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Partner proxy error: ${error.message}`, type: \"partner_error\" },\n }),\n );\n }\n }\n return;\n }\n\n // Only proxy paths starting with /v1\n if (!req.url?.startsWith(\"/v1\")) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n return;\n }\n\n try {\n await proxyRequest(\n req,\n res,\n apiBase,\n payFetch,\n options,\n routerOpts,\n deduplicator,\n balanceMonitor,\n sessionStore,\n responseCache,\n sessionJournal,\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n options.onError?.(error);\n\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Proxy error: ${error.message}`, type: \"proxy_error\" },\n }),\n );\n } else if (!res.writableEnded) {\n // Headers already sent (streaming) — send error as SSE event\n res.write(\n `data: ${JSON.stringify({ error: { message: error.message, type: \"proxy_error\" } })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n }\n }\n }); // end paymentStore.run()\n });\n\n // Listen on configured port with retry logic for TIME_WAIT handling\n // When gateway restarts quickly, the port may still be in TIME_WAIT state.\n // We retry with delay instead of incorrectly assuming a proxy is running.\n const tryListen = (attempt: number): Promise => {\n return new Promise((resolveAttempt, rejectAttempt) => {\n const onError = async (err: NodeJS.ErrnoException) => {\n server.removeListener(\"error\", onError);\n\n if (err.code === \"EADDRINUSE\") {\n // Port is in use - check if a proxy is actually running\n const existingProxy2 = await checkExistingProxy(listenPort);\n if (existingProxy2) {\n // Proxy is actually running - this is fine, reuse it\n console.log(`[XClawRouter] Existing proxy detected on port ${listenPort}, reusing`);\n rejectAttempt({\n code: \"REUSE_EXISTING\",\n wallet: existingProxy2.wallet,\n existingChain: existingProxy2.paymentChain,\n });\n return;\n }\n\n // Port is in TIME_WAIT (no proxy responding) - retry after delay\n if (attempt < PORT_RETRY_ATTEMPTS) {\n console.log(\n `[XClawRouter] Port ${listenPort} in TIME_WAIT, retrying in ${PORT_RETRY_DELAY_MS}ms (attempt ${attempt}/${PORT_RETRY_ATTEMPTS})`,\n );\n rejectAttempt({ code: \"RETRY\", attempt });\n return;\n }\n\n // Max retries exceeded\n console.error(\n `[XClawRouter] Port ${listenPort} still in use after ${PORT_RETRY_ATTEMPTS} attempts`,\n );\n rejectAttempt(err);\n return;\n }\n\n rejectAttempt(err);\n };\n\n server.once(\"error\", onError);\n server.listen(listenPort, \"127.0.0.1\", () => {\n server.removeListener(\"error\", onError);\n resolveAttempt();\n });\n });\n };\n\n // Retry loop for port binding\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= PORT_RETRY_ATTEMPTS; attempt++) {\n try {\n await tryListen(attempt);\n break; // Success\n } catch (err: unknown) {\n const error = err as {\n code?: string;\n wallet?: string;\n existingChain?: string;\n attempt?: number;\n };\n\n if (error.code === \"REUSE_EXISTING\" && error.wallet) {\n // Validate payment chain matches (same check as pre-listen reuse path)\n if (error.existingChain && error.existingChain !== paymentChain) {\n throw new Error(\n `Existing proxy on port ${listenPort} is using ${error.existingChain} but ${paymentChain} was requested. ` +\n `Stop the existing proxy first or use a different port.`,\n { cause: err },\n );\n }\n\n // Proxy is running, reuse it\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n options.onReady?.(listenPort);\n return {\n port: listenPort,\n baseUrl,\n walletAddress: error.wallet,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n if (error.code === \"RETRY\") {\n // Wait before retry\n await new Promise((r) => setTimeout(r, PORT_RETRY_DELAY_MS));\n continue;\n }\n\n // Other error - throw\n lastError = err as Error;\n break;\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n // Server is now listening - set up remaining handlers\n const addr = server.address() as AddressInfo;\n const port = addr.port;\n const baseUrl = `http://127.0.0.1:${port}`;\n\n options.onReady?.(port);\n\n // Check for updates (non-blocking)\n checkForUpdates();\n\n // Add runtime error handler AFTER successful listen\n // This handles errors that occur during server operation (not just startup)\n server.on(\"error\", (err) => {\n console.error(`[XClawRouter] Server runtime error: ${err.message}`);\n options.onError?.(err);\n // Don't crash - log and continue\n });\n\n // Handle client connection errors (bad requests, socket errors)\n server.on(\"clientError\", (err, socket) => {\n console.error(`[XClawRouter] Client error: ${err.message}`);\n // Send 400 Bad Request if socket is still writable\n if (socket.writable && !socket.destroyed) {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n }\n });\n\n // Track connections for graceful cleanup\n server.on(\"connection\", (socket) => {\n connections.add(socket);\n\n // Set 5-minute timeout for streaming requests\n socket.setTimeout(300_000);\n\n socket.on(\"timeout\", () => {\n console.error(`[XClawRouter] Socket timeout, destroying connection`);\n socket.destroy();\n });\n\n socket.on(\"end\", () => {\n // Half-closed by client (FIN received)\n });\n\n socket.on(\"error\", (err) => {\n console.error(`[XClawRouter] Socket error: ${err.message}`);\n });\n\n socket.on(\"close\", () => {\n connections.delete(socket);\n });\n });\n\n return {\n port,\n baseUrl,\n walletAddress: account.address,\n solanaAddress,\n balanceMonitor,\n close: () =>\n new Promise((res, rej) => {\n const timeout = setTimeout(() => {\n rej(new Error(\"[XClawRouter] Close timeout after 4s\"));\n }, 4000);\n\n sessionStore.close();\n // Destroy all active connections before closing server\n for (const socket of connections) {\n socket.destroy();\n }\n connections.clear();\n server.close((err) => {\n clearTimeout(timeout);\n if (err) {\n rej(err);\n } else {\n res();\n }\n });\n }),\n };\n}\n\n/** Result of attempting a model request */\ntype ModelRequestResult = {\n success: boolean;\n response?: Response;\n errorBody?: string;\n errorStatus?: number;\n isProviderError?: boolean;\n errorCategory?: ErrorCategory; // Semantic error classification\n};\n\n/**\n * Detect degenerate completions (repetition loops).\n *\n * Pattern observed in production (2026-04-16): `nvidia/kimi-k2.5` on long\n * Chinese agentic conversations returned e.g. ` 好的!!!!!!!!...` for 1024\n * tokens and hit `finish_reason: \"length\"`. Similar failures occur with\n * other models on certain inputs.\n *\n * Criteria (conservative to avoid false positives on markdown tables etc.):\n * - `finish_reason` must be \"length\" (didn't self-terminate)\n * - tail has ≥60 of the same punctuation char in the last 80 chars\n */\nfunction isDegenerateCompletion(bodyBuf: Buffer): boolean {\n try {\n const parsed = JSON.parse(bodyBuf.toString()) as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n };\n const choice = parsed.choices?.[0];\n const finishReason = choice?.finish_reason;\n if (finishReason !== \"length\") return false;\n\n const content = choice?.message?.content ?? \"\";\n if (content.length < 80) return false;\n\n const tail = content.slice(-80);\n const tailChars = [...tail];\n const firstChar = tailChars[0];\n if (!/[^\\p{L}\\p{N}\\s]/u.test(firstChar)) return false;\n\n const sameCount = tailChars.filter((c) => c === firstChar).length;\n return sameCount >= 60;\n } catch {\n return false;\n }\n}\n\n/**\n * Attempt a request with a specific model.\n * Returns the response or error details for fallback decision.\n */\nasync function tryModelRequest(\n upstreamUrl: string,\n method: string,\n headers: Record,\n body: Buffer,\n modelId: string,\n maxTokens: number,\n payFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise,\n balanceMonitor: AnyBalanceMonitor,\n signal: AbortSignal,\n): Promise {\n // Update model in body and normalize messages\n let requestBody = body;\n try {\n const parsed = JSON.parse(body.toString()) as Record;\n parsed.model = toUpstreamModelId(modelId);\n\n // Normalize message roles (e.g., \"developer\" -> \"system\")\n if (Array.isArray(parsed.messages)) {\n parsed.messages = normalizeMessageRoles(parsed.messages as ChatMessage[]);\n }\n\n // Remove \"blockrun\" branding from system messages so upstream LLMs don't\n // adopt \"Blockrun\" as their identity (overriding user's SOUL.md persona).\n if (Array.isArray(parsed.messages)) {\n parsed.messages = debrandSystemMessages(parsed.messages as ChatMessage[], modelId);\n }\n\n // Truncate messages to stay under BlockRun's limit (200 messages)\n if (Array.isArray(parsed.messages)) {\n const truncationResult = truncateMessages(parsed.messages as ChatMessage[]);\n parsed.messages = truncationResult.messages;\n }\n\n // Sanitize tool IDs to match Anthropic's pattern (alphanumeric, underscore, hyphen only)\n if (Array.isArray(parsed.messages)) {\n parsed.messages = sanitizeToolIds(parsed.messages as ChatMessage[]);\n }\n\n // Normalize messages for Google models (first non-system message must be \"user\")\n if (isGoogleModel(modelId) && Array.isArray(parsed.messages)) {\n parsed.messages = normalizeMessagesForGoogle(parsed.messages as ChatMessage[]);\n }\n\n // Normalize messages for thinking-enabled requests (add reasoning_content to all assistant messages)\n // Check request flags AND target model - reasoning models have thinking enabled server-side\n const hasThinkingEnabled = !!(\n parsed.thinking ||\n parsed.extended_thinking ||\n isReasoningModel(modelId)\n );\n if (hasThinkingEnabled && Array.isArray(parsed.messages)) {\n parsed.messages = normalizeMessagesForThinking(parsed.messages as ExtendedChatMessage[]);\n }\n\n requestBody = Buffer.from(JSON.stringify(parsed));\n } catch {\n // If body isn't valid JSON, use as-is\n }\n\n try {\n const response = await payFetch(upstreamUrl, {\n method,\n headers,\n body: requestBody.length > 0 ? new Uint8Array(requestBody) : undefined,\n signal,\n });\n\n // Check for provider errors\n if (response.status !== 200) {\n // Clone response to read body without consuming it\n const errorBodyChunks = await readBodyWithTimeout(response.body, ERROR_BODY_READ_TIMEOUT_MS);\n const errorBody = Buffer.concat(errorBodyChunks).toString();\n const category = categorizeError(response.status, errorBody);\n\n return {\n success: false,\n errorBody,\n errorStatus: response.status,\n isProviderError: category !== null,\n errorCategory: category ?? undefined,\n };\n }\n\n // Detect provider degradation hidden inside HTTP 200 responses.\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"json\") || contentType.includes(\"text\")) {\n try {\n const clonedChunks = await readBodyWithTimeout(\n response.clone().body,\n ERROR_BODY_READ_TIMEOUT_MS,\n );\n const responseBody = Buffer.concat(clonedChunks).toString();\n const degradedReason = detectDegradedSuccessResponse(responseBody);\n if (degradedReason) {\n return {\n success: false,\n errorBody: degradedReason,\n errorStatus: 503,\n isProviderError: true,\n };\n }\n } catch {\n // Ignore body inspection failures and pass through response.\n }\n }\n\n return { success: true, response };\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n errorBody: errorMsg,\n errorStatus: 500,\n isProviderError: true, // Network errors are retryable\n };\n }\n}\n\n/**\n * Proxy a single request through x402 payment flow to BlockRun API.\n *\n * Optimizations applied in order:\n * 1. Dedup check — if same request body seen within 30s, replay cached response\n * 2. Streaming heartbeat — for stream:true, send 200 + heartbeats immediately\n * 3. Smart routing — when model is \"blockrun/auto\", pick cheapest capable model\n * 4. Fallback chain — on provider errors, try next model in tier's fallback list\n */\nasync function proxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n apiBase: string,\n payFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise,\n options: ProxyOptions,\n routerOpts: RouterOptions,\n deduplicator: RequestDeduplicator,\n balanceMonitor: AnyBalanceMonitor,\n sessionStore: SessionStore,\n responseCache: ResponseCache,\n sessionJournal: SessionJournal,\n): Promise {\n const startTime = Date.now();\n\n // Build upstream URL: /v1/chat/completions → https://blockrun.ai/api/v1/chat/completions\n const upstreamUrl = `${apiBase}${req.url}`;\n\n // Collect request body\n const bodyChunks: Buffer[] = [];\n for await (const chunk of req) {\n bodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n let body = Buffer.concat(bodyChunks);\n\n // Track original context size for response headers\n const originalContextSizeKB = Math.ceil(body.length / 1024);\n\n // Routing debug info is on by default; disable with x-clawrouter-debug: false\n const debugMode = req.headers[\"x-clawrouter-debug\"] !== \"false\";\n\n // --- Smart routing ---\n let routingDecision: RoutingDecision | undefined;\n let hasTools = false; // true when request includes a tools schema\n let hasVision = false; // true when request includes image_url content parts\n let isStreaming = false;\n let modelId = \"\";\n let maxTokens = 4096;\n let routingProfile: \"eco\" | \"auto\" | \"premium\" | null = null;\n let stickyExplicitModel: string | undefined;\n let balanceFallbackNotice: string | undefined;\n let budgetDowngradeNotice: string | undefined;\n let budgetDowngradeHeaderMode: \"downgraded\" | undefined;\n let accumulatedContent = \"\"; // For session journal event extraction\n let responseInputTokens: number | undefined;\n let responseOutputTokens: number | undefined;\n let requestHadError = false; // Set to true when all models fail → used in logUsage\n const isChatCompletion = req.url?.includes(\"/chat/completions\");\n\n // Extract session ID early for journal operations (header-only at this point)\n const sessionId = getSessionId(req.headers as Record);\n // Full session ID (header + content-derived) — populated once messages are parsed\n let effectiveSessionId: string | undefined = sessionId;\n\n if (isChatCompletion && body.length > 0) {\n try {\n const parsed = JSON.parse(body.toString()) as Record;\n isStreaming = parsed.stream === true;\n modelId = (parsed.model as string) || \"\";\n maxTokens = (parsed.max_tokens as number) || 4096;\n let bodyModified = false;\n\n // Extract last user message content (used by session journal + /debug command)\n const parsedMessages = Array.isArray(parsed.messages)\n ? (parsed.messages as Array<{ role: string; content: unknown }>)\n : [];\n const lastUserMsg = [...parsedMessages].reverse().find((m) => m.role === \"user\");\n\n // Early tool detection for ALL request types (explicit model + routing profile).\n // The routing-profile branch may re-assign below (no-op since same value).\n hasTools = Array.isArray(parsed.tools) && (parsed.tools as unknown[]).length > 0;\n\n // Preserve OpenClaw tool schemas exactly as provided.\n // Stripping tools like web_search/web_fetch/browser/exec makes the upstream\n // model believe those capabilities do not exist, which breaks agentic runs.\n // Reliability is handled later via agentic routing and tool-support filters.\n\n const rawLastContent = lastUserMsg?.content;\n const lastContent =\n typeof rawLastContent === \"string\"\n ? rawLastContent\n : Array.isArray(rawLastContent)\n ? (rawLastContent as Array<{ type: string; text?: string }>)\n .filter((b) => b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\" \")\n : \"\";\n\n // --- Session Journal: Inject context if needed ---\n // Check if the last user message asks about past work\n if (sessionId && parsedMessages.length > 0) {\n const messages = parsedMessages;\n\n if (sessionJournal.needsContext(lastContent)) {\n const journalText = sessionJournal.format(sessionId);\n if (journalText) {\n // Find system message and prepend journal, or add a new system message\n const sysIdx = messages.findIndex((m) => m.role === \"system\");\n if (sysIdx >= 0 && typeof messages[sysIdx].content === \"string\") {\n messages[sysIdx] = {\n ...messages[sysIdx],\n content: journalText + \"\\n\\n\" + messages[sysIdx].content,\n };\n } else {\n messages.unshift({ role: \"system\", content: journalText });\n }\n parsed.messages = messages;\n bodyModified = true;\n console.log(\n `[XClawRouter] Injected session journal (${journalText.length} chars) for session ${sessionId.slice(0, 8)}...`,\n );\n }\n }\n }\n\n // --- /debug command: return routing diagnostics without calling upstream ---\n if (lastContent.startsWith(\"/debug\")) {\n const debugPrompt = lastContent.slice(\"/debug\".length).trim() || \"hello\";\n const messages = parsed.messages as Array<{ role: string; content: unknown }>;\n const systemMsg = messages?.find((m) => m.role === \"system\");\n const systemPrompt = typeof systemMsg?.content === \"string\" ? systemMsg.content : undefined;\n const fullText = `${systemPrompt ?? \"\"} ${debugPrompt}`;\n const estimatedTokens = Math.ceil(fullText.length / 4);\n\n // Determine routing profile\n const normalizedModel =\n typeof parsed.model === \"string\" ? parsed.model.trim().toLowerCase() : \"\";\n const profileName = normalizedModel.replace(\"blockrun/\", \"\");\n const debugProfile = (\n [\"eco\", \"auto\", \"premium\"].includes(profileName) ? profileName : \"auto\"\n ) as \"eco\" | \"auto\" | \"premium\";\n\n // Run scoring\n const scoring = classifyByRules(\n debugPrompt,\n systemPrompt,\n estimatedTokens,\n DEFAULT_ROUTING_CONFIG.scoring,\n );\n\n // Run full routing decision\n const debugRouting = route(debugPrompt, systemPrompt, maxTokens, {\n ...routerOpts,\n routingProfile: debugProfile,\n });\n\n // Format dimension scores\n const dimLines = (scoring.dimensions ?? [])\n .map((d) => {\n const nameStr = (d.name + \":\").padEnd(24);\n const scoreStr = d.score.toFixed(2).padStart(6);\n const sigStr = d.signal ? ` [${d.signal}]` : \"\";\n return ` ${nameStr}${scoreStr}${sigStr}`;\n })\n .join(\"\\n\");\n\n // Session info\n const sess = sessionId ? sessionStore.getSession(sessionId) : undefined;\n const sessLine = sess\n ? `Session: ${sessionId!.slice(0, 8)}... → pinned: ${sess.model} (${sess.requestCount} requests)`\n : sessionId\n ? `Session: ${sessionId.slice(0, 8)}... → no pinned model`\n : \"Session: none\";\n\n const { simpleMedium, mediumComplex, complexReasoning } =\n DEFAULT_ROUTING_CONFIG.scoring.tierBoundaries;\n\n const debugText = [\n \"XClawRouter Debug\",\n \"\",\n `Profile: ${debugProfile} | Tier: ${debugRouting.tier} | Model: ${debugRouting.model}`,\n `Confidence: ${debugRouting.confidence.toFixed(2)} | Cost: $${debugRouting.costEstimate.toFixed(4)} | Savings: ${(debugRouting.savings * 100).toFixed(0)}%`,\n `Reasoning: ${debugRouting.reasoning}`,\n \"\",\n `Scoring (weighted: ${scoring.score.toFixed(3)})`,\n dimLines,\n \"\",\n `Tier Boundaries: SIMPLE <${simpleMedium.toFixed(2)} | MEDIUM <${mediumComplex.toFixed(2)} | COMPLEX <${complexReasoning.toFixed(2)} | REASONING >=${complexReasoning.toFixed(2)}`,\n \"\",\n sessLine,\n ].join(\"\\n\");\n\n // Build synthetic OpenAI chat completion response\n const completionId = `chatcmpl-debug-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n const syntheticResponse = {\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/debug\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: debugText },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n };\n\n if (isStreaming) {\n // SSE streaming response\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n const sseChunk = {\n id: completionId,\n object: \"chat.completion.chunk\",\n created: timestamp,\n model: \"clawrouter/debug\",\n choices: [\n {\n index: 0,\n delta: { role: \"assistant\", content: debugText },\n finish_reason: null,\n },\n ],\n };\n const sseDone = {\n id: completionId,\n object: \"chat.completion.chunk\",\n created: timestamp,\n model: \"clawrouter/debug\",\n choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }],\n };\n res.write(`data: ${JSON.stringify(sseChunk)}\\n\\n`);\n res.write(`data: ${JSON.stringify(sseDone)}\\n\\n`);\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(syntheticResponse));\n }\n console.log(`[XClawRouter] /debug command → ${debugRouting.tier} | ${debugRouting.model}`);\n return;\n }\n\n // --- /imagegen command: generate an image via BlockRun image API ---\n if (lastContent.startsWith(\"/imagegen\")) {\n const imageArgs = lastContent.slice(\"/imagegen\".length).trim();\n\n // Parse optional flags: /imagegen --model dall-e-3 --size 1792x1024 a cute cat\n let imageModel = \"google/nano-banana\";\n let imageSize = \"1024x1024\";\n let imagePrompt = imageArgs;\n\n // Extract --model flag\n const modelMatch = imageArgs.match(/--model\\s+(\\S+)/);\n if (modelMatch) {\n const raw = modelMatch[1];\n // Resolve shorthand aliases\n const IMAGE_MODEL_ALIASES: Record = {\n \"dall-e-3\": \"openai/dall-e-3\",\n dalle3: \"openai/dall-e-3\",\n dalle: \"openai/dall-e-3\",\n \"gpt-image\": \"openai/gpt-image-1\",\n \"gpt-image-1\": \"openai/gpt-image-1\",\n flux: \"black-forest/flux-1.1-pro\",\n \"flux-pro\": \"black-forest/flux-1.1-pro\",\n banana: \"google/nano-banana\",\n \"nano-banana\": \"google/nano-banana\",\n \"banana-pro\": \"google/nano-banana-pro\",\n \"nano-banana-pro\": \"google/nano-banana-pro\",\n };\n imageModel = IMAGE_MODEL_ALIASES[raw] ?? raw;\n imagePrompt = imagePrompt.replace(/--model\\s+\\S+/, \"\").trim();\n }\n\n // Extract --size flag\n const sizeMatch = imageArgs.match(/--size\\s+(\\d+x\\d+)/);\n if (sizeMatch) {\n imageSize = sizeMatch[1];\n imagePrompt = imagePrompt.replace(/--size\\s+\\d+x\\d+/, \"\").trim();\n }\n\n if (!imagePrompt) {\n const errorText = [\n \"Usage: /imagegen \",\n \"\",\n \"Options:\",\n \" --model Model to use (default: nano-banana)\",\n \" --size Image size (default: 1024x1024)\",\n \"\",\n \"Models:\",\n \" nano-banana Google Gemini Flash — $0.05/image\",\n \" banana-pro Google Gemini Pro — $0.10/image (up to 4K)\",\n \" dall-e-3 OpenAI DALL-E 3 — $0.04/image\",\n \" gpt-image OpenAI GPT Image 1 — $0.02/image\",\n \" flux Black Forest Flux 1.1 Pro — $0.04/image\",\n \"\",\n \"Examples:\",\n \" /imagegen a cat wearing sunglasses\",\n \" /imagegen --model dall-e-3 a futuristic city at sunset\",\n \" /imagegen --model banana-pro --size 2048x2048 mountain landscape\",\n ].join(\"\\n\");\n\n const completionId = `chatcmpl-image-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n if (isStreaming) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: { role: \"assistant\", content: errorText }, finish_reason: null }] })}\\n\\n`,\n );\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }] })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/image\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: errorText },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n }),\n );\n }\n console.log(`[XClawRouter] /imagegen command → showing usage help`);\n return;\n }\n\n // Call upstream image generation API\n console.log(\n `[XClawRouter] /imagegen command → ${imageModel} (${imageSize}): ${imagePrompt.slice(0, 80)}...`,\n );\n try {\n const imageUpstreamUrl = `${apiBase}/v1/images/generations`;\n const imageBody = JSON.stringify({\n model: imageModel,\n prompt: imagePrompt,\n size: imageSize,\n n: 1,\n });\n const imageResponse = await payFetch(imageUpstreamUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: imageBody,\n });\n\n const imageResult = (await imageResponse.json()) as {\n created?: number;\n data?: Array<{ url?: string; revised_prompt?: string }>;\n error?: string | { message?: string };\n };\n\n let responseText: string;\n if (!imageResponse.ok || imageResult.error) {\n const errMsg =\n typeof imageResult.error === \"string\"\n ? imageResult.error\n : ((imageResult.error as { message?: string })?.message ??\n `HTTP ${imageResponse.status}`);\n responseText = `Image generation failed: ${errMsg}`;\n console.log(`[XClawRouter] /imagegen error: ${errMsg}`);\n } else {\n const images = imageResult.data ?? [];\n if (images.length === 0) {\n responseText = \"Image generation returned no results.\";\n } else {\n const lines: string[] = [];\n for (const img of images) {\n if (img.url) {\n if (img.url.startsWith(\"data:\")) {\n try {\n const hostedUrl = await uploadDataUriToHost(img.url);\n lines.push(hostedUrl);\n } catch (uploadErr) {\n console.error(\n `[XClawRouter] /imagegen: failed to upload data URI: ${uploadErr instanceof Error ? uploadErr.message : String(uploadErr)}`,\n );\n lines.push(\n \"Image generated but upload failed. Try again or use --model dall-e-3.\",\n );\n }\n } else {\n lines.push(img.url);\n }\n }\n if (img.revised_prompt) lines.push(`Revised prompt: ${img.revised_prompt}`);\n }\n lines.push(\"\", `Model: ${imageModel} | Size: ${imageSize}`);\n responseText = lines.join(\"\\n\");\n }\n console.log(`[XClawRouter] /imagegen success: ${images.length} image(s) generated`);\n // Log /imagegen usage with actual x402 payment\n const imagegenActualCost =\n paymentStore.getStore()?.amountUsd ?? estimateImageCost(imageModel, imageSize, 1);\n logUsage({\n timestamp: new Date().toISOString(),\n model: imageModel,\n tier: \"IMAGE\",\n cost: imagegenActualCost,\n baselineCost: imagegenActualCost,\n savings: 0,\n latencyMs: 0,\n }).catch(() => {});\n }\n\n // Return as synthetic chat completion\n const completionId = `chatcmpl-image-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n if (isStreaming) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: { role: \"assistant\", content: responseText }, finish_reason: null }] })}\\n\\n`,\n );\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }] })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/image\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: responseText },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n }),\n );\n }\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] /imagegen error: ${errMsg}`);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Image generation failed: ${errMsg}`, type: \"image_error\" },\n }),\n );\n }\n }\n return;\n }\n\n // --- /img2img command: edit an image via BlockRun image2image API ---\n if (lastContent.startsWith(\"/img2img\")) {\n const imgArgs = lastContent.slice(\"/img2img\".length).trim();\n\n let img2imgModel = \"openai/gpt-image-1\";\n let img2imgSize = \"1024x1024\";\n let imagePath: string | null = null;\n let maskPath: string | null = null;\n let img2imgPrompt = imgArgs;\n\n const imageMatch = imgArgs.match(/--image\\s+(\\S+)/);\n if (imageMatch) {\n imagePath = imageMatch[1];\n img2imgPrompt = img2imgPrompt.replace(/--image\\s+\\S+/, \"\").trim();\n }\n\n const maskMatch = imgArgs.match(/--mask\\s+(\\S+)/);\n if (maskMatch) {\n maskPath = maskMatch[1];\n img2imgPrompt = img2imgPrompt.replace(/--mask\\s+\\S+/, \"\").trim();\n }\n\n const img2imgSizeMatch = imgArgs.match(/--size\\s+(\\d+x\\d+)/);\n if (img2imgSizeMatch) {\n img2imgSize = img2imgSizeMatch[1];\n img2imgPrompt = img2imgPrompt.replace(/--size\\s+\\d+x\\d+/, \"\").trim();\n }\n\n const img2imgModelMatch = imgArgs.match(/--model\\s+(\\S+)/);\n if (img2imgModelMatch) {\n const raw = img2imgModelMatch[1];\n const IMG2IMG_ALIASES: Record = {\n \"gpt-image\": \"openai/gpt-image-1\",\n \"gpt-image-1\": \"openai/gpt-image-1\",\n };\n img2imgModel = IMG2IMG_ALIASES[raw] ?? raw;\n img2imgPrompt = img2imgPrompt.replace(/--model\\s+\\S+/, \"\").trim();\n }\n\n const usageText = [\n \"Usage: /img2img --image \",\n \"\",\n \"Options:\",\n \" --image Source image path (required)\",\n \" --mask Mask image path (optional, white = area to edit)\",\n \" --model Model (default: gpt-image-1)\",\n \" --size Output size (default: 1024x1024)\",\n \"\",\n \"Models:\",\n \" gpt-image-1 OpenAI GPT Image 1 — $0.02/image\",\n \"\",\n \"Examples:\",\n \" /img2img --image ~/photo.png change background to starry sky\",\n \" /img2img --image ./cat.jpg --mask ./mask.png remove the background\",\n \" /img2img --image /tmp/portrait.png --size 1536x1024 add a hat\",\n ].join(\"\\n\");\n\n const sendImg2ImgText = (text: string) => {\n const completionId = `chatcmpl-img2img-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n if (isStreaming) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/img2img\", choices: [{ index: 0, delta: { role: \"assistant\", content: text }, finish_reason: null }] })}\\n\\n`,\n );\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/img2img\", choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }] })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/img2img\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: text },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n }),\n );\n }\n };\n\n if (!imagePath || !img2imgPrompt) {\n sendImg2ImgText(usageText);\n return;\n }\n\n let imageDataUri: string;\n let maskDataUri: string | undefined;\n try {\n imageDataUri = readImageFileAsDataUri(imagePath);\n if (maskPath) maskDataUri = readImageFileAsDataUri(maskPath);\n } catch (fileErr) {\n const fileErrMsg = fileErr instanceof Error ? fileErr.message : String(fileErr);\n sendImg2ImgText(`Failed to read image file: ${fileErrMsg}`);\n return;\n }\n\n console.log(\n `[XClawRouter] /img2img → ${img2imgModel} (${img2imgSize}): ${img2imgPrompt.slice(0, 80)}`,\n );\n\n try {\n const img2imgBody = JSON.stringify({\n model: img2imgModel,\n prompt: img2imgPrompt,\n image: imageDataUri,\n ...(maskDataUri ? { mask: maskDataUri } : {}),\n size: img2imgSize,\n n: 1,\n });\n\n const img2imgResponse = await payFetch(`${apiBase}/v1/images/image2image`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: img2imgBody,\n });\n\n const img2imgResult = (await img2imgResponse.json()) as {\n created?: number;\n data?: Array<{ url?: string; revised_prompt?: string }>;\n error?: string | { message?: string };\n };\n\n let responseText: string;\n if (!img2imgResponse.ok || img2imgResult.error) {\n const errMsg =\n typeof img2imgResult.error === \"string\"\n ? img2imgResult.error\n : ((img2imgResult.error as { message?: string })?.message ??\n `HTTP ${img2imgResponse.status}`);\n responseText = `Image editing failed: ${errMsg}`;\n console.log(`[XClawRouter] /img2img error: ${errMsg}`);\n } else {\n const images = img2imgResult.data ?? [];\n if (images.length === 0) {\n responseText = \"Image editing returned no results.\";\n } else {\n const lines: string[] = [];\n for (const img of images) {\n if (img.url) {\n if (img.url.startsWith(\"data:\")) {\n try {\n const hostedUrl = await uploadDataUriToHost(img.url);\n lines.push(hostedUrl);\n } catch (uploadErr) {\n console.error(\n `[XClawRouter] /img2img: failed to upload data URI: ${uploadErr instanceof Error ? uploadErr.message : String(uploadErr)}`,\n );\n lines.push(\"Image edited but upload failed. Try again.\");\n }\n } else {\n lines.push(img.url);\n }\n }\n if (img.revised_prompt) lines.push(`Revised prompt: ${img.revised_prompt}`);\n }\n lines.push(\"\", `Model: ${img2imgModel} | Size: ${img2imgSize}`);\n responseText = lines.join(\"\\n\");\n }\n console.log(`[XClawRouter] /img2img success: ${images.length} image(s)`);\n // Log /img2img usage with actual x402 payment\n const img2imgActualCost2 =\n paymentStore.getStore()?.amountUsd ?? estimateImageCost(img2imgModel, img2imgSize, 1);\n logUsage({\n timestamp: new Date().toISOString(),\n model: img2imgModel,\n tier: \"IMAGE\",\n cost: img2imgActualCost2,\n baselineCost: img2imgActualCost2,\n savings: 0,\n latencyMs: 0,\n }).catch(() => {});\n }\n\n sendImg2ImgText(responseText);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] /img2img error: ${errMsg}`);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Image editing failed: ${errMsg}`, type: \"img2img_error\" },\n }),\n );\n }\n }\n return;\n }\n\n // Force stream: false — BlockRun API doesn't support streaming yet\n // XClawRouter handles SSE heartbeat simulation for upstream compatibility\n if (parsed.stream === true) {\n parsed.stream = false;\n bodyModified = true;\n }\n\n // Normalize model name for comparison (trim whitespace, lowercase)\n const normalizedModel =\n typeof parsed.model === \"string\" ? parsed.model.trim().toLowerCase() : \"\";\n\n // Resolve model aliases (e.g., \"claude\" -> \"anthropic/claude-sonnet-4-6\")\n const resolvedModel = resolveModelAlias(normalizedModel);\n const wasAlias = resolvedModel !== normalizedModel;\n\n // Check both normalizedModel and resolvedModel — OpenClaw may send \"openai/eco\"\n // which resolveModelAlias strips to \"eco\" (a valid routing profile)\n const isRoutingProfile =\n ROUTING_PROFILES.has(normalizedModel) || ROUTING_PROFILES.has(resolvedModel);\n\n // Extract routing profile type (free/eco/auto/premium)\n if (isRoutingProfile) {\n const profileName = resolvedModel.replace(\"blockrun/\", \"\");\n routingProfile = profileName as \"eco\" | \"auto\" | \"premium\";\n }\n\n // Debug: log received model name\n console.log(\n `[XClawRouter] Received model: \"${parsed.model}\" -> normalized: \"${normalizedModel}\"${wasAlias ? ` -> alias: \"${resolvedModel}\"` : \"\"}${routingProfile ? `, profile: ${routingProfile}` : \"\"}`,\n );\n\n // For explicit model requests, always canonicalize the model ID before upstream calls.\n // This ensures case/whitespace variants (e.g. \"DEEPSEEK/...\" or \" model \") route correctly.\n if (!isRoutingProfile) {\n if (parsed.model !== resolvedModel) {\n parsed.model = resolvedModel;\n bodyModified = true;\n }\n modelId = resolvedModel;\n\n // User explicitly chose this model — pin it to the session as a sticky\n // user-explicit pin. Future requests in the same session that come in\n // as routing profiles (e.g. blockrun/auto from OpenClaw's default\n // chat path) will respect this choice instead of re-routing.\n // This fixes the bug where /model in OpenClaw appeared to switch the\n // model (UI confirmed) but subsequent messages still used the\n // previously pinned auto-routed model.\n const explicitPinSessionId =\n getSessionId(req.headers as Record) ??\n deriveSessionId(parsedMessages);\n if (explicitPinSessionId) {\n // Use a generic tier — the explicit pin bypasses tier comparison anyway.\n sessionStore.setSession(explicitPinSessionId, resolvedModel, \"MEDIUM\", true);\n console.log(\n `[XClawRouter] Session ${explicitPinSessionId.slice(0, 8)}... user-explicit pin set: ${resolvedModel}`,\n );\n }\n }\n\n // Handle routing profiles (free/eco/auto/premium)\n if (isRoutingProfile) {\n {\n // eco/auto/premium - use tier routing\n // Check for session persistence - use pinned model if available\n // Fall back to deriving a session ID from message content when OpenClaw\n // doesn't send an explicit x-session-id header (the default behaviour).\n effectiveSessionId =\n getSessionId(req.headers as Record) ??\n deriveSessionId(parsedMessages);\n const existingSession = effectiveSessionId\n ? sessionStore.getSession(effectiveSessionId)\n : undefined;\n\n // Extract prompt from last user message (handles both string and Anthropic array content)\n const rawPrompt = lastUserMsg?.content;\n const prompt =\n typeof rawPrompt === \"string\"\n ? rawPrompt\n : Array.isArray(rawPrompt)\n ? (rawPrompt as Array<{ type: string; text?: string }>)\n .filter((b) => b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\" \")\n : \"\";\n const systemMsg = parsedMessages.find((m) => m.role === \"system\");\n const systemPrompt =\n typeof systemMsg?.content === \"string\" ? systemMsg.content : undefined;\n\n // Tool detection — when tools are present, force agentic tiers for reliable tool use\n const tools = parsed.tools as unknown[] | undefined;\n hasTools = Array.isArray(tools) && tools.length > 0;\n\n if (hasTools && tools) {\n console.log(`[XClawRouter] Tools detected (${tools.length}), forcing agentic tiers`);\n }\n\n // Vision detection: scan messages for image_url content parts\n hasVision = parsedMessages.some((m) => {\n if (Array.isArray(m.content)) {\n return (m.content as Array<{ type: string }>).some((p) => p.type === \"image_url\");\n }\n return false;\n });\n if (hasVision) {\n console.log(\n `[XClawRouter] Vision content detected, filtering to vision-capable models`,\n );\n }\n\n // Always route based on current request content\n routingDecision = route(prompt, systemPrompt, maxTokens, {\n ...routerOpts,\n routingProfile: routingProfile ?? undefined,\n hasTools,\n });\n\n // Keep agentic routing when tools are present, even for SIMPLE queries.\n // Tool-using requests need models with reliable function-call support;\n // demoting to non-agentic tiers causes fallback to models that refuse\n // tool schemas (gemini-flash-lite, deepseek) or lack tool support entirely.\n if (hasTools && routingDecision.tier === \"SIMPLE\") {\n console.log(\n `[XClawRouter] SIMPLE+tools: keeping agentic model ${routingDecision.model} (tools need reliable function-call support)`,\n );\n }\n\n if (existingSession) {\n // If the session was pinned by an explicit user choice (e.g. via\n // /model command), respect it unconditionally. The user's intent\n // wins over auto-routing tier escalation. This fixes the bug where\n // running /model blockrun/free/glm-4.7 didn't actually switch the\n // model, because the next request (which OpenClaw still sends as\n // a routing profile) would re-route through tier comparison.\n //\n // We override the routing decision and let execution fall through\n // to the upstream call below — without this short-circuit, the\n // tier-rank logic could downgrade or escalate away from the\n // user's choice.\n if (existingSession.userExplicit) {\n stickyExplicitModel = existingSession.model;\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... user-explicit pin: ${existingSession.model} (overriding auto-routed ${routingDecision.tier} → ${routingDecision.model})`,\n );\n parsed.model = existingSession.model;\n modelId = existingSession.model;\n bodyModified = true;\n sessionStore.touchSession(effectiveSessionId!);\n routingDecision = {\n ...routingDecision,\n model: existingSession.model,\n tier: existingSession.tier as Tier,\n };\n // Skip the rest of the existingSession branches; explicit pin wins.\n } else {\n // Never downgrade: only upgrade the session when the current request needs a higher\n // tier. This fixes the OpenClaw startup-message bias (the startup message always\n // scores low-complexity, which previously pinned all subsequent real queries to a\n // cheap model) while still preventing mid-task model switching on simple follow-ups.\n const tierRank: Record = {\n SIMPLE: 0,\n MEDIUM: 1,\n COMPLEX: 2,\n REASONING: 3,\n };\n const existingRank = tierRank[existingSession.tier] ?? 0;\n const newRank = tierRank[routingDecision.tier] ?? 0;\n\n if (newRank > existingRank) {\n // Current request needs higher capability — upgrade the session\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... upgrading: ${existingSession.tier} → ${routingDecision.tier} (${routingDecision.model})`,\n );\n parsed.model = routingDecision.model;\n modelId = routingDecision.model;\n bodyModified = true;\n if (effectiveSessionId) {\n sessionStore.setSession(\n effectiveSessionId,\n routingDecision.model,\n routingDecision.tier,\n );\n }\n } else if (routingDecision.tier === \"SIMPLE\") {\n // SIMPLE follow-up in an active session: let it use cheap routing.\n // e.g. \"你好\" or \"thanks\" after a complex task should not inherit the\n // expensive session model or recount all context tokens on a paid model.\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... SIMPLE follow-up, using cheap model: ${routingDecision.model} (bypassing pinned ${existingSession.tier})`,\n );\n parsed.model = routingDecision.model;\n modelId = routingDecision.model;\n bodyModified = true;\n sessionStore.touchSession(effectiveSessionId!);\n // routingDecision already reflects cheap model — no override needed\n } else {\n // Keep existing higher-tier model (prevent downgrade mid-task)\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... keeping pinned model: ${existingSession.model} (${existingSession.tier} >= ${routingDecision.tier})`,\n );\n parsed.model = existingSession.model;\n modelId = existingSession.model;\n bodyModified = true;\n sessionStore.touchSession(effectiveSessionId!);\n // Reflect the actual model used in the routing decision for logging/fallback\n routingDecision = {\n ...routingDecision,\n model: existingSession.model,\n tier: existingSession.tier as Tier,\n };\n }\n\n // --- Three-strike escalation: detect repetitive request patterns ---\n const lastAssistantMsg = [...parsedMessages]\n .reverse()\n .find((m) => m.role === \"assistant\");\n const assistantToolCalls = (\n lastAssistantMsg as { tool_calls?: Array<{ function?: { name?: string } }> }\n )?.tool_calls;\n const toolCallNames = Array.isArray(assistantToolCalls)\n ? assistantToolCalls\n .map((tc) => tc.function?.name)\n .filter((n): n is string => Boolean(n))\n : undefined;\n const contentHash = hashRequestContent(prompt, toolCallNames);\n const shouldEscalate = sessionStore.recordRequestHash(\n effectiveSessionId!,\n contentHash,\n );\n\n if (shouldEscalate) {\n const activeTierConfigs = routingDecision.tierConfigs ?? routerOpts.config.tiers;\n\n const escalation = sessionStore.escalateSession(\n effectiveSessionId!,\n activeTierConfigs,\n );\n if (escalation) {\n console.log(\n `[XClawRouter] ⚡ 3-strike escalation: ${existingSession.model} → ${escalation.model} (${existingSession.tier} → ${escalation.tier})`,\n );\n parsed.model = escalation.model;\n modelId = escalation.model;\n routingDecision = {\n ...routingDecision,\n model: escalation.model,\n tier: escalation.tier as Tier,\n };\n }\n }\n } // close `else` (auto-routed branch)\n } else {\n // No session — pin this routing decision for future requests\n parsed.model = routingDecision.model;\n modelId = routingDecision.model;\n bodyModified = true;\n if (effectiveSessionId) {\n sessionStore.setSession(\n effectiveSessionId,\n routingDecision.model,\n routingDecision.tier,\n );\n console.log(\n `[XClawRouter] Session ${effectiveSessionId.slice(0, 8)}... pinned to model: ${routingDecision.model}`,\n );\n }\n }\n\n options.onRouted?.(routingDecision);\n }\n }\n\n // Ensure effectiveSessionId is set for explicit model requests via content hash fallback.\n // Routing profile requests already derive session ID from message content (see line above).\n // Explicit model requests (openai/gpt-4o, anthropic/claude-*, etc.) without an\n // x-session-id header would otherwise have no session ID → maxCostPerRun not tracked.\n if (!effectiveSessionId && parsedMessages.length > 0) {\n effectiveSessionId = deriveSessionId(parsedMessages);\n }\n\n // Rebuild body if modified — map free/xxx → nvidia/xxx for upstream\n if (bodyModified) {\n if (parsed.model && typeof parsed.model === \"string\") {\n parsed.model = toUpstreamModelId(parsed.model);\n }\n body = Buffer.from(JSON.stringify(parsed));\n }\n } catch (err) {\n // Log routing errors so they're not silently swallowed\n const errorMsg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Routing error: ${errorMsg}`);\n console.error(`[XClawRouter] Need help? Run: npx @blockrun/xclawrouter doctor`);\n options.onError?.(new Error(`Routing failed: ${errorMsg}`));\n }\n }\n\n // --- Auto-compression ---\n // Compress large requests to reduce network usage and improve performance\n const autoCompress = options.autoCompressRequests ?? true;\n const compressionThreshold = options.compressionThresholdKB ?? 180;\n const requestSizeKB = Math.ceil(body.length / 1024);\n\n if (autoCompress && requestSizeKB > compressionThreshold) {\n try {\n console.log(\n `[XClawRouter] Request size ${requestSizeKB}KB exceeds threshold ${compressionThreshold}KB, applying compression...`,\n );\n\n // Parse messages for compression\n const parsed = JSON.parse(body.toString()) as {\n messages?: NormalizedMessage[];\n [key: string]: unknown;\n };\n\n if (parsed.messages && parsed.messages.length > 0 && shouldCompress(parsed.messages)) {\n // Apply compression with conservative settings\n const compressionResult = await compressContext(parsed.messages, {\n enabled: true,\n preserveRaw: false, // Don't need originals in proxy\n layers: {\n deduplication: true, // Safe: removes duplicate messages\n whitespace: true, // Safe: normalizes whitespace\n dictionary: false, // Disabled: requires model to understand codebook\n paths: false, // Disabled: requires model to understand path codes\n jsonCompact: true, // Safe: just removes JSON whitespace\n observation: false, // Disabled: may lose important context\n dynamicCodebook: false, // Disabled: requires model to understand codes\n },\n dictionary: {\n maxEntries: 50,\n minPhraseLength: 15,\n includeCodebookHeader: false,\n },\n });\n\n const compressedSizeKB = Math.ceil(compressionResult.compressedChars / 1024);\n const savings = (((requestSizeKB - compressedSizeKB) / requestSizeKB) * 100).toFixed(1);\n\n console.log(\n `[XClawRouter] Compressed ${requestSizeKB}KB → ${compressedSizeKB}KB (${savings}% reduction)`,\n );\n\n // Update request body with compressed messages\n parsed.messages = compressionResult.messages;\n body = Buffer.from(JSON.stringify(parsed));\n }\n } catch (err) {\n // Compression failed - continue with original request\n console.warn(\n `[XClawRouter] Compression failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // --- Response cache check (long-term, 10min TTL) ---\n // Prefix with the client's original stream intent. The body was already\n // rewritten to stream:false for the upstream call (same reason as dedupKey\n // below), so SSE and JSON responses would otherwise share a cache slot and\n // the first caller's response shape would be served to the second.\n const cacheKey = `${isStreaming ? \"sse\" : \"json\"}:${ResponseCache.generateKey(body)}`;\n const reqHeaders: Record = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === \"string\") reqHeaders[key] = value;\n }\n if (responseCache.shouldCache(body, reqHeaders)) {\n const cachedResponse = responseCache.get(cacheKey);\n if (cachedResponse) {\n console.log(`[XClawRouter] Cache HIT for ${cachedResponse.model} (saved API call)`);\n res.writeHead(cachedResponse.status, cachedResponse.headers);\n res.end(cachedResponse.body);\n return;\n }\n }\n\n // --- Dedup check (short-term, 30s TTL for retries) ---\n // Prefix with the client's original stream intent. The upstream `stream` flag\n // is rewritten to false before this point (BlockRun API is non-streaming), so\n // a streaming and non-streaming request with otherwise-identical bodies would\n // otherwise collide and serve each other's responses (JSON body to an SSE\n // caller, or vice versa).\n const dedupKey = `${isStreaming ? \"sse\" : \"json\"}:${RequestDeduplicator.hash(body)}`;\n\n // Check dedup cache (catches retries within 30s)\n const cached = deduplicator.getCached(dedupKey);\n if (cached) {\n res.writeHead(cached.status, cached.headers);\n res.end(cached.body);\n return;\n }\n\n // Check in-flight — wait for the original request to complete\n const inflight = deduplicator.getInflight(dedupKey);\n if (inflight) {\n const result = await inflight;\n res.writeHead(result.status, result.headers);\n res.end(result.body);\n return;\n }\n\n // Register this request as in-flight\n deduplicator.markInflight(dedupKey);\n\n // --- Pre-request balance check ---\n // Estimate cost and check if wallet has sufficient balance\n // Skip if skipBalanceCheck is set (for testing) or if using free model\n let estimatedCostMicros: bigint | undefined;\n // Use `let` so the balance-fallback path can update this when modelId is switched to a free model.\n let isFreeModel = FREE_MODELS.has(modelId ?? \"\");\n\n if (modelId && !options.skipBalanceCheck && !isFreeModel) {\n const estimated = estimateAmount(modelId, body.length, maxTokens);\n if (estimated) {\n estimatedCostMicros = BigInt(estimated);\n\n // Apply extra buffer for balance check to prevent x402 failures after streaming starts.\n // This is aggressive to avoid triggering OpenClaw's 5-24 hour billing cooldown.\n const bufferedCostMicros =\n (estimatedCostMicros * BigInt(Math.ceil(BALANCE_CHECK_BUFFER * 100))) / 100n;\n\n // Check balance before proceeding (using buffered amount)\n // Wrap in try/catch: Solana RPC failures (timeouts, rate limits) should\n // not silently downgrade the request — pass through optimistically instead.\n let sufficiency: Awaited> | null = null;\n try {\n sufficiency = await balanceMonitor.checkSufficient(bufferedCostMicros);\n } catch (balanceErr) {\n console.warn(\n `[XClawRouter] Balance check failed (${balanceErr instanceof Error ? balanceErr.message : String(balanceErr)}) — proceeding optimistically`,\n );\n }\n\n if (sufficiency && (sufficiency.info.isEmpty || !sufficiency.sufficient)) {\n // Wallet is empty or insufficient — fallback to best available free model\n const freeFallback = pickFreeModel(loadExcludeList()) ?? FREE_MODEL;\n const originalModel = modelId;\n console.log(\n `[XClawRouter] Wallet ${sufficiency.info.isEmpty ? \"empty\" : \"insufficient\"} (${sufficiency.info.balanceUSD}), falling back to free model: ${freeFallback} (requested: ${originalModel})`,\n );\n modelId = freeFallback;\n isFreeModel = true; // keep in sync — budget logic gates on !isFreeModel\n // Update the body with new model (map free/ → nvidia/ for upstream)\n const parsed = JSON.parse(body.toString()) as Record;\n parsed.model = toUpstreamModelId(FREE_MODEL);\n body = Buffer.from(JSON.stringify(parsed));\n\n // Build fund instruction — include wallet address so user knows where to send\n const walletAddr = sufficiency.info.walletAddress;\n const fundHint = walletAddr\n ? ` Send USDC to \\`${walletAddr}\\`.`\n : \" Run `/wallet` to see your address.\";\n\n // Set notice to prepend to response so user knows about the fallback\n balanceFallbackNotice = sufficiency.info.isEmpty\n ? `> **⚠️ Wallet empty** — using free model.${fundHint}\\n\\n`\n : `> **⚠️ Insufficient balance** (${sufficiency.info.balanceUSD}) — using free model instead of ${originalModel}.${fundHint}\\n\\n`;\n\n // Notify about the fallback\n options.onLowBalance?.({\n balanceUSD: sufficiency.info.balanceUSD,\n walletAddress: sufficiency.info.walletAddress,\n });\n } else if (sufficiency?.info.isLow) {\n // Balance is low but sufficient — warn and proceed\n options.onLowBalance?.({\n balanceUSD: sufficiency.info.balanceUSD,\n walletAddress: sufficiency.info.walletAddress,\n });\n }\n }\n }\n\n // --- Cost cap check: strict mode hard-stop ---\n // In 'strict' mode, reject if the projected session spend (accumulated + this request's\n // estimate) would exceed the cap. Checking projected cost (not just historical) prevents\n // a single large request from overshooting the cap before it's recorded.\n // In 'graceful' mode (default), the cap is enforced via model downgrade below.\n // Must happen before streaming headers are sent.\n if (\n options.maxCostPerRunUsd &&\n effectiveSessionId &&\n !isFreeModel &&\n (options.maxCostPerRunMode ?? \"graceful\") === \"strict\"\n ) {\n const runCostUsd = sessionStore.getSessionCostUsd(effectiveSessionId);\n // Include this request's estimated cost so even the first request is blocked\n // if it would push the session over the cap.\n const thisReqEstStr =\n estimatedCostMicros !== undefined\n ? estimatedCostMicros.toString()\n : modelId\n ? estimateAmount(modelId, body.length, maxTokens)\n : undefined;\n const thisReqEstUsd = thisReqEstStr ? Number(thisReqEstStr) / 1_000_000 : 0;\n const projectedCostUsd = runCostUsd + thisReqEstUsd;\n if (projectedCostUsd > options.maxCostPerRunUsd) {\n console.log(\n `[XClawRouter] Cost cap exceeded for session ${effectiveSessionId.slice(0, 8)}...: projected $${projectedCostUsd.toFixed(4)} (spent $${runCostUsd.toFixed(4)} + est $${thisReqEstUsd.toFixed(4)}) > $${options.maxCostPerRunUsd} limit`,\n );\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n });\n res.end(\n JSON.stringify({\n error: {\n message: `XClawRouter cost cap exceeded: projected spend $${projectedCostUsd.toFixed(4)} (spent $${runCostUsd.toFixed(4)} + est $${thisReqEstUsd.toFixed(4)}) would exceed limit $${options.maxCostPerRunUsd}`,\n type: \"cost_cap_exceeded\",\n code: \"cost_cap_exceeded\",\n },\n }),\n );\n deduplicator.removeInflight(dedupKey);\n return;\n }\n }\n\n // --- Budget pre-check: block when remaining budget can't cover the request ---\n // Must happen BEFORE streaming headers (429 can't be sent after SSE headers are flushed).\n // Three cases that require a hard block rather than graceful downgrade:\n // (A) tool/COMPLEX/REASONING routing profile — free model can't substitute\n // (B) explicit model request (no routing profile) — user chose a specific model,\n // silently substituting with free model would be deceptive regardless of task type\n // Simple routing profile requests are handled later via graceful downgrade.\n if (\n options.maxCostPerRunUsd &&\n effectiveSessionId &&\n !isFreeModel &&\n (options.maxCostPerRunMode ?? \"graceful\") === \"graceful\"\n ) {\n const runCostUsd = sessionStore.getSessionCostUsd(effectiveSessionId);\n const remainingUsd = options.maxCostPerRunUsd - runCostUsd;\n\n const isComplexOrAgentic =\n hasTools || routingDecision?.tier === \"COMPLEX\" || routingDecision?.tier === \"REASONING\";\n\n if (isComplexOrAgentic) {\n // Case A: tool/complex/agentic routing profile — check global model table\n // Intentionally exclude free models: they cannot handle complex/agentic tasks.\n const canAffordAnyNonFreeModel = BLOCKRUN_MODELS.some((m) => {\n if (FREE_MODELS.has(m.id)) return false;\n const est = estimateAmount(m.id, body.length, maxTokens);\n return est !== undefined && Number(est) / 1_000_000 <= remainingUsd;\n });\n if (!canAffordAnyNonFreeModel) {\n console.log(\n `[XClawRouter] Budget insufficient for agentic/complex session ${effectiveSessionId.slice(0, 8)}...: $${Math.max(0, remainingUsd).toFixed(4)} remaining — blocking (silent downgrade would corrupt tool/complex responses)`,\n );\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n \"X-XClawRouter-Budget-Mode\": \"blocked\",\n });\n res.end(\n JSON.stringify({\n error: {\n message: `XClawRouter budget exhausted: $${Math.max(0, remainingUsd).toFixed(4)} remaining (limit: $${options.maxCostPerRunUsd}). Increase maxCostPerRun to continue.`,\n type: \"cost_cap_exceeded\",\n code: \"budget_exhausted\",\n },\n }),\n );\n deduplicator.removeInflight(dedupKey);\n return;\n }\n } else if (!routingDecision && modelId && !FREE_MODELS.has(modelId)) {\n // Case B: explicit model request (user chose a specific model, not a routing profile).\n // Silently substituting their choice with free model is deceptive — block instead.\n const est = estimateAmount(modelId, body.length, maxTokens);\n const canAfford = !est || Number(est) / 1_000_000 <= remainingUsd;\n if (!canAfford) {\n console.log(\n `[XClawRouter] Budget insufficient for explicit model ${modelId} in session ${effectiveSessionId.slice(0, 8)}...: $${Math.max(0, remainingUsd).toFixed(4)} remaining — blocking (user explicitly chose ${modelId})`,\n );\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n \"X-XClawRouter-Budget-Mode\": \"blocked\",\n });\n res.end(\n JSON.stringify({\n error: {\n message: `XClawRouter budget exhausted: $${Math.max(0, remainingUsd).toFixed(4)} remaining (limit: $${options.maxCostPerRunUsd}). Increase maxCostPerRun to continue using ${modelId}.`,\n type: \"cost_cap_exceeded\",\n code: \"budget_exhausted\",\n },\n }),\n );\n deduplicator.removeInflight(dedupKey);\n return;\n }\n }\n }\n\n // --- Streaming: early header flush + heartbeat ---\n let heartbeatInterval: ReturnType | undefined;\n let headersSentEarly = false;\n\n if (isStreaming) {\n // Send 200 + SSE headers immediately, before x402 flow\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-context-used-kb\": String(originalContextSizeKB),\n \"x-context-limit-kb\": String(CONTEXT_LIMIT_KB),\n });\n headersSentEarly = true;\n\n // First heartbeat immediately\n safeWrite(res, \": heartbeat\\n\\n\");\n\n // Continue heartbeats every 2s while waiting for upstream\n heartbeatInterval = setInterval(() => {\n if (canWrite(res)) {\n safeWrite(res, \": heartbeat\\n\\n\");\n } else {\n // Socket closed, stop heartbeat\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n // Forward headers, stripping hop-by-hop and provider-specific headers.\n // OpenClaw v2026.4.2 centralizes provider header handling (native vs proxy),\n // but we strip SDK/provider headers defensively for older clients too.\n const headers: Record = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (\n key === \"host\" ||\n key === \"connection\" ||\n key === \"transfer-encoding\" ||\n key === \"content-length\"\n )\n continue;\n // SDK attribution headers (OpenAI x-stainless-*, Anthropic anthropic-*)\n // These are client-side telemetry/protocol headers — not meaningful to BlockRun.\n if (key.startsWith(\"x-stainless-\") || key.startsWith(\"anthropic-\")) continue;\n if (typeof value === \"string\") {\n headers[key] = value;\n }\n }\n if (!headers[\"content-type\"]) {\n headers[\"content-type\"] = \"application/json\";\n }\n headers[\"user-agent\"] = USER_AGENT;\n\n // --- Client disconnect cleanup ---\n let completed = false;\n res.on(\"close\", () => {\n if (heartbeatInterval) {\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n // Remove from in-flight if client disconnected before completion\n if (!completed) {\n deduplicator.removeInflight(dedupKey);\n }\n });\n\n // --- Request timeout ---\n // Global controller: hard deadline for the entire request (all model attempts combined).\n // Each model attempt gets its own per-model controller (PER_MODEL_TIMEOUT_MS).\n // If a model times out individually, we fall back to the next model instead of failing.\n // Only the global timeout causes an immediate error.\n const timeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const globalController = new AbortController();\n const timeoutId = setTimeout(() => globalController.abort(), timeoutMs);\n\n // Abort in-flight upstream requests when the client disconnects.\n // OpenClaw 2026.4.7+ aborts gateway requests on client disconnect;\n // without this, XClawRouter would leave orphan upstream fetches running.\n const onClientClose = () => {\n if (!globalController.signal.aborted) {\n console.log(`[XClawRouter] Client disconnected — aborting upstream request`);\n globalController.abort();\n }\n };\n req.on(\"close\", onClientClose);\n\n try {\n // --- Build fallback chain ---\n // If we have a routing decision, get the full fallback chain for the tier\n // Otherwise, just use the current model (no fallback for explicit model requests)\n let modelsToTry: string[];\n const excludeList = options.excludeModels ?? loadExcludeList();\n\n // Short-circuit: if balance check already determined wallet is empty/insufficient,\n // skip the entire routing chain (all paid models would 429 anyway) and go straight\n // to the free model. This avoids 4-5 wasted x402 payment signature attempts.\n // Only applies when balance check actually ran (not when skipBalanceCheck is set).\n if (isFreeModel && routingDecision && !options.skipBalanceCheck) {\n const freeFallback = pickFreeModel(excludeList) ?? FREE_MODEL;\n modelsToTry = [freeFallback];\n console.log(\n `[XClawRouter] Wallet empty — skipping routing chain, using free model: ${freeFallback}`,\n );\n } else if (routingDecision) {\n const prependStickyExplicitModel = (chain: string[]): string[] => {\n if (!stickyExplicitModel) return chain;\n return [stickyExplicitModel, ...chain.filter((model) => model !== stickyExplicitModel)];\n };\n // Estimate total context: input tokens (~4 chars per token) + max output tokens\n const estimatedInputTokens = Math.ceil(body.length / 4);\n const estimatedTotalTokens = estimatedInputTokens + maxTokens;\n\n // Use tier configs from the routing decision (set by RouterStrategy)\n const tierConfigs = routingDecision.tierConfigs ?? routerOpts.config.tiers;\n\n // Get full chain first, then filter by context\n const fullChain = prependStickyExplicitModel(\n getFallbackChain(routingDecision.tier, tierConfigs),\n );\n const contextFiltered = prependStickyExplicitModel(\n getFallbackChainFiltered(\n routingDecision.tier,\n tierConfigs,\n estimatedTotalTokens,\n getModelContextWindow,\n ),\n );\n\n // Log if models were filtered out due to context limits\n const contextExcluded = fullChain.filter((m) => !contextFiltered.includes(m));\n if (contextExcluded.length > 0) {\n console.log(\n `[XClawRouter] Context filter (~${estimatedTotalTokens} tokens): excluded ${contextExcluded.join(\", \")}`,\n );\n }\n\n // Filter out user-excluded models\n const excludeFiltered = prependStickyExplicitModel(\n filterByExcludeList(contextFiltered, excludeList),\n );\n const excludeExcluded = contextFiltered.filter((m) => !excludeFiltered.includes(m));\n if (excludeExcluded.length > 0) {\n console.log(\n `[XClawRouter] Exclude filter: excluded ${excludeExcluded.join(\", \")} (user preference)`,\n );\n }\n\n // Filter to models that support tool calling when request has tools.\n // Prevents models like grok-code-fast-1 from outputting tool invocations\n // as plain text JSON (the \"talking to itself\" bug).\n let toolFiltered = prependStickyExplicitModel(\n filterByToolCalling(excludeFiltered, hasTools, supportsToolCalling),\n );\n const toolExcluded = excludeFiltered.filter((m) => !toolFiltered.includes(m));\n if (toolExcluded.length > 0) {\n console.log(\n `[XClawRouter] Tool-calling filter: excluded ${toolExcluded.join(\", \")} (no structured function call support)`,\n );\n }\n\n // Filter out models that declare toolCalling but fail tool compliance in practice.\n // gemini-2.5-flash-lite refuses certain tool schemas (e.g. brave search) while\n // cheaper models like nvidia/gpt-oss-120b handle them fine.\n const TOOL_NONCOMPLIANT_MODELS = [\n \"google/gemini-2.5-flash-lite\",\n \"google/gemini-3-pro-preview\",\n \"google/gemini-3.1-pro\",\n ];\n if (hasTools && toolFiltered.length > 1) {\n const compliant = toolFiltered.filter((m) => !TOOL_NONCOMPLIANT_MODELS.includes(m));\n if (compliant.length > 0 && compliant.length < toolFiltered.length) {\n const dropped = toolFiltered.filter((m) => TOOL_NONCOMPLIANT_MODELS.includes(m));\n console.log(\n `[XClawRouter] Tool-compliance filter: excluded ${dropped.join(\", \")} (unreliable tool schema handling)`,\n );\n toolFiltered = prependStickyExplicitModel(compliant);\n }\n }\n\n // Filter to models that support vision when request has image_url content\n const visionFiltered = prependStickyExplicitModel(\n filterByVision(toolFiltered, hasVision, supportsVision),\n );\n const visionExcluded = toolFiltered.filter((m) => !visionFiltered.includes(m));\n if (visionExcluded.length > 0) {\n console.log(\n `[XClawRouter] Vision filter: excluded ${visionExcluded.join(\", \")} (no vision support)`,\n );\n }\n\n // Limit to MAX_FALLBACK_ATTEMPTS to prevent infinite loops\n modelsToTry = prependStickyExplicitModel(visionFiltered).slice(0, MAX_FALLBACK_ATTEMPTS);\n\n // Deprioritize rate-limited models (put them at the end)\n modelsToTry = prioritizeNonRateLimited(modelsToTry);\n } else {\n // For explicit model requests, use the requested model\n modelsToTry = modelId ? [modelId] : [];\n }\n\n // Ensure routed requests have a free-model last resort for non-tool chats.\n // Explicit model requests intentionally skip this: silently substituting a\n // user-chosen model with `free/*` is deceptive.\n if (!hasTools && routingDecision) {\n const freeFallback = pickFreeModel(excludeList);\n if (freeFallback && !modelsToTry.includes(freeFallback)) {\n modelsToTry.push(freeFallback);\n }\n }\n\n // --- Budget-aware routing (graceful mode) ---\n // Filter modelsToTry to only models that fit within the remaining session budget.\n // Simple tasks (no tools, non-complex tier): downgrade with visible warning.\n // Complex/agentic tasks with no affordable model: already blocked above (before streaming headers).\n if (\n options.maxCostPerRunUsd &&\n effectiveSessionId &&\n !isFreeModel &&\n (options.maxCostPerRunMode ?? \"graceful\") === \"graceful\"\n ) {\n const runCostUsd = sessionStore.getSessionCostUsd(effectiveSessionId);\n const remainingUsd = options.maxCostPerRunUsd - runCostUsd;\n\n const beforeFilter = [...modelsToTry];\n modelsToTry = modelsToTry.filter((m) => {\n if (FREE_MODELS.has(m)) return true; // free models always fit (no cost)\n const est = estimateAmount(m, body.length, maxTokens);\n if (!est) return true; // no pricing data → keep (permissive)\n return Number(est) / 1_000_000 <= remainingUsd;\n });\n\n const excluded = beforeFilter.filter((m) => !modelsToTry.includes(m));\n\n // Second-pass block: the pre-check caught obvious cases early (before streaming headers).\n // Here we recheck against the actual filtered modelsToTry chain. If the ONLY remaining\n // models are free, we must block rather than silently degrade for:\n // (A) complex/agentic routing profile tasks (tools / COMPLEX / REASONING tier)\n // (B) explicit model requests (user chose a specific model; free substitution is deceptive)\n // The pre-check already handles case (B) for non-streaming; this is a safety net for\n // streaming requests where SSE headers may have already been sent.\n const isComplexOrAgenticFilter =\n hasTools ||\n routingDecision?.tier === \"COMPLEX\" ||\n routingDecision?.tier === \"REASONING\" ||\n routingDecision === undefined; // explicit model: no routing profile → user chose the model\n const filteredToFreeOnly =\n modelsToTry.length > 0 && modelsToTry.every((m) => FREE_MODELS.has(m));\n\n if (isComplexOrAgenticFilter && filteredToFreeOnly) {\n const budgetSummary = `$${Math.max(0, remainingUsd).toFixed(4)} remaining (limit: $${options.maxCostPerRunUsd})`;\n console.log(\n `[XClawRouter] Budget filter left only free model for complex/agentic session — blocking (${budgetSummary})`,\n );\n const errPayload = JSON.stringify({\n error: {\n message: `XClawRouter budget exhausted: remaining budget (${budgetSummary}) cannot support a complex/tool request. Increase maxCostPerRun to continue.`,\n type: \"cost_cap_exceeded\",\n code: \"budget_exhausted\",\n },\n });\n if (heartbeatInterval) clearInterval(heartbeatInterval);\n if (headersSentEarly) {\n // Streaming: inject error SSE event + [DONE] and close\n safeWrite(res, `data: ${errPayload}\\n\\ndata: [DONE]\\n\\n`);\n res.end();\n } else {\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n \"X-XClawRouter-Budget-Mode\": \"blocked\",\n });\n res.end(errPayload);\n }\n deduplicator.removeInflight(dedupKey);\n return;\n }\n\n if (excluded.length > 0) {\n const budgetSummary =\n remainingUsd > 0\n ? `$${remainingUsd.toFixed(4)} remaining`\n : `budget exhausted ($${runCostUsd.toFixed(4)}/$${options.maxCostPerRunUsd})`;\n console.log(\n `[XClawRouter] Budget downgrade (${budgetSummary}): excluded ${excluded.join(\", \")}`,\n );\n\n // A: Set visible warning notice — prepended to response so user sees the downgrade\n const fromModel = excluded[0];\n const usingFree = modelsToTry.length === 1 && FREE_MODELS.has(modelsToTry[0]);\n if (usingFree) {\n budgetDowngradeNotice = `> **⚠️ Budget cap reached** ($${runCostUsd.toFixed(4)}/$${options.maxCostPerRunUsd}) — downgraded to free model. Quality may be reduced. Increase \\`maxCostPerRun\\` to continue with ${fromModel}.\\n\\n`;\n } else {\n const toModel = modelsToTry[0] ?? FREE_MODEL; // last resort\n budgetDowngradeNotice = `> **⚠️ Budget low** ($${remainingUsd > 0 ? remainingUsd.toFixed(4) : \"0.0000\"} remaining) — using ${toModel} instead of ${fromModel}.\\n\\n`;\n }\n // B: Header flag for orchestration layers (e.g. OpenClaw can pause/warn the user)\n budgetDowngradeHeaderMode = \"downgraded\";\n }\n }\n\n // --- Fallback loop: try each model until success ---\n let upstream: Response | undefined;\n let lastError: { body: string; status: number } | undefined;\n let actualModelUsed = modelId;\n const failedAttempts: Array<{ model: string; reason: string; status: number }> = [];\n\n for (let i = 0; i < modelsToTry.length; i++) {\n const tryModel = modelsToTry[i];\n const isLastAttempt = i === modelsToTry.length - 1;\n\n // Abort immediately if global deadline has already fired\n if (globalController.signal.aborted) {\n throw new Error(`Request timed out after ${timeoutMs}ms`);\n }\n\n console.log(`[XClawRouter] Trying model ${i + 1}/${modelsToTry.length}: ${tryModel}`);\n\n // Per-model abort controller — each model attempt gets its own 60s window.\n // When it fires, the fallback loop moves to the next model rather than failing.\n const modelController = new AbortController();\n const modelTimeoutId = setTimeout(() => modelController.abort(), PER_MODEL_TIMEOUT_MS);\n const combinedSignal = AbortSignal.any([globalController.signal, modelController.signal]);\n\n const result = await tryModelRequest(\n upstreamUrl,\n req.method ?? \"POST\",\n headers,\n body,\n tryModel,\n maxTokens,\n payFetch,\n balanceMonitor,\n combinedSignal,\n );\n clearTimeout(modelTimeoutId);\n\n // If the global deadline fired during this attempt, bail out entirely\n if (globalController.signal.aborted) {\n throw new Error(`Request timed out after ${timeoutMs}ms`);\n }\n\n // If the per-model timeout fired (but not global), treat as fallback-worthy error\n if (!result.success && modelController.signal.aborted && !isLastAttempt) {\n console.log(\n `[XClawRouter] Model ${tryModel} timed out after ${PER_MODEL_TIMEOUT_MS}ms, trying fallback`,\n );\n recordProviderError(tryModel, \"server_error\");\n continue;\n }\n\n if (result.success && result.response) {\n // Buffer the body so we can peek for degenerate output before committing\n // to this model. Non-streaming JSON responses are small; this is cheap.\n const bodyChunks = await readBodyWithTimeout(result.response.body);\n const bodyBuf = Buffer.concat(bodyChunks);\n\n if (isDegenerateCompletion(bodyBuf) && !isLastAttempt) {\n console.warn(\n `[XClawRouter] ⚠️ Degenerate output from ${tryModel} (finish_reason=length + repetition loop) — retrying with next fallback`,\n );\n recordProviderError(tryModel, \"server_error\");\n failedAttempts.push({\n model: tryModel,\n reason: \"degenerate_output\",\n status: 200,\n });\n continue;\n }\n\n // Re-wrap the buffered body so downstream code can read upstream.body normally\n upstream = new Response(new Uint8Array(bodyBuf), {\n status: result.response.status,\n statusText: result.response.statusText,\n headers: result.response.headers,\n });\n actualModelUsed = tryModel;\n console.log(`[XClawRouter] Success with model: ${tryModel}`);\n // Accumulate estimated cost to session for maxCostPerRun tracking\n if (options.maxCostPerRunUsd && effectiveSessionId && !FREE_MODELS.has(tryModel)) {\n const costEst = estimateAmount(tryModel, body.length, maxTokens);\n if (costEst) {\n sessionStore.addSessionCost(effectiveSessionId, BigInt(costEst));\n }\n }\n break;\n }\n\n // Request failed\n lastError = {\n body: result.errorBody || \"Unknown error\",\n status: result.errorStatus || 500,\n };\n failedAttempts.push({\n model: tryModel,\n reason: result.errorCategory || `HTTP ${result.errorStatus || 500}`,\n status: result.errorStatus || 500,\n });\n\n // Payment error (insufficient funds, simulation failure) — skip remaining\n // paid models, jump straight to free model. No point trying other paid\n // models with the same wallet state.\n // Must be checked BEFORE isProviderError gate: payment settlement failures\n // may return non-standard HTTP codes that categorizeError doesn't recognize,\n // causing isProviderError=false and breaking out of the fallback loop.\n const isPaymentErr =\n /payment.*verification.*failed|payment.*settlement.*failed|insufficient.*funds|transaction_simulation_failed/i.test(\n result.errorBody || \"\",\n );\n if (isPaymentErr && !FREE_MODELS.has(tryModel) && !isLastAttempt) {\n failedAttempts.push({\n ...failedAttempts[failedAttempts.length - 1],\n reason: \"payment_error\",\n });\n // Find a free model already in the chain\n const freeInChain = modelsToTry.findIndex((m, idx) => idx > i && FREE_MODELS.has(m));\n if (freeInChain > i + 1) {\n console.log(\n `[XClawRouter] Payment error — skipping to free model: ${modelsToTry[freeInChain]}`,\n );\n i = freeInChain - 1; // loop will increment to freeInChain\n continue;\n }\n // No free model in chain — pick best available and append\n if (freeInChain === -1) {\n const freeFallback = pickFreeModel(excludeList);\n if (freeFallback) {\n modelsToTry.push(freeFallback);\n console.log(`[XClawRouter] Payment error — appending free model: ${freeFallback}`);\n continue;\n }\n }\n }\n\n // Explicit pins intentionally avoid automatic free-model fallback, so a\n // single transient upstream 5xx (NVIDIA worker flake, blockrun 500)\n // would otherwise fail the whole request. Retry once with a short\n // backoff. Non-retryable errors (auth/payment/config) fall through.\n const isExplicitPin = !routingDecision;\n const isRetryableServerError =\n result.errorCategory === \"server_error\" || result.errorCategory === \"overloaded\";\n if (\n isExplicitPin &&\n isLastAttempt &&\n isRetryableServerError &&\n !globalController.signal.aborted\n ) {\n console.log(\n `[XClawRouter] Explicit pin ${tryModel} got ${result.errorCategory} (HTTP ${result.errorStatus ?? \"?\"}), retrying once in 500ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (!globalController.signal.aborted) {\n const retryController = new AbortController();\n const retryTimeoutId = setTimeout(() => retryController.abort(), PER_MODEL_TIMEOUT_MS);\n const retrySignal = AbortSignal.any([globalController.signal, retryController.signal]);\n const retryResult = await tryModelRequest(\n upstreamUrl,\n req.method ?? \"POST\",\n headers,\n body,\n tryModel,\n maxTokens,\n payFetch,\n balanceMonitor,\n retrySignal,\n );\n clearTimeout(retryTimeoutId);\n if (retryResult.success && retryResult.response) {\n upstream = retryResult.response;\n actualModelUsed = tryModel;\n console.log(`[XClawRouter] Explicit-pin retry succeeded for: ${tryModel}`);\n if (options.maxCostPerRunUsd && effectiveSessionId && !FREE_MODELS.has(tryModel)) {\n const costEst = estimateAmount(tryModel, body.length, maxTokens);\n if (costEst) {\n sessionStore.addSessionCost(effectiveSessionId, BigInt(costEst));\n }\n }\n break;\n }\n // Retry also failed — update lastError with the latest failure and\n // fall through to the standard break path.\n lastError = {\n body: retryResult.errorBody || lastError?.body || \"Unknown error\",\n status: retryResult.errorStatus || lastError?.status || 500,\n };\n failedAttempts.push({\n model: tryModel,\n reason: `${retryResult.errorCategory || `HTTP ${retryResult.errorStatus || 500}`} (retry)`,\n status: retryResult.errorStatus || 500,\n });\n }\n }\n\n // If it's a provider error and not the last attempt, try next model\n if (result.isProviderError && !isLastAttempt) {\n const isExplicitModelError = !routingDecision;\n const isUnknownExplicitModel =\n isExplicitModelError && /unknown.*model|invalid.*model/i.test(result.errorBody || \"\");\n if (isUnknownExplicitModel) {\n console.log(\n `[XClawRouter] Explicit model error from ${tryModel}, not falling back: ${result.errorBody?.slice(0, 100)}`,\n );\n break;\n }\n\n // Record error and apply category-specific handling\n const errorCat = result.errorCategory;\n if (errorCat) {\n recordProviderError(tryModel, errorCat);\n }\n\n if (errorCat === \"rate_limited\") {\n // --- Stepped backoff retry (429) ---\n // Token-bucket rate limits often recover within milliseconds.\n // Retry once after 200ms before treating this as a model-level failure.\n if (!isLastAttempt && !globalController.signal.aborted) {\n console.log(\n `[XClawRouter] Rate-limited on ${tryModel}, retrying in 200ms before failover`,\n );\n await new Promise((resolve) => setTimeout(resolve, 200));\n if (!globalController.signal.aborted) {\n const retryController = new AbortController();\n const retryTimeoutId = setTimeout(\n () => retryController.abort(),\n PER_MODEL_TIMEOUT_MS,\n );\n const retrySignal = AbortSignal.any([\n globalController.signal,\n retryController.signal,\n ]);\n const retryResult = await tryModelRequest(\n upstreamUrl,\n req.method ?? \"POST\",\n headers,\n body,\n tryModel,\n maxTokens,\n payFetch,\n balanceMonitor,\n retrySignal,\n );\n clearTimeout(retryTimeoutId);\n if (retryResult.success && retryResult.response) {\n upstream = retryResult.response;\n actualModelUsed = tryModel;\n console.log(`[XClawRouter] Rate-limit retry succeeded for: ${tryModel}`);\n if (options.maxCostPerRunUsd && effectiveSessionId && tryModel !== FREE_MODEL) {\n const costEst = estimateAmount(tryModel, body.length, maxTokens);\n if (costEst) {\n sessionStore.addSessionCost(effectiveSessionId, BigInt(costEst));\n }\n }\n break;\n }\n // Retry also failed — fall through to markRateLimited\n }\n }\n markRateLimited(tryModel);\n // Check for server-side update hint in 429 response\n try {\n const parsed = JSON.parse(result.errorBody || \"{}\");\n if (parsed.update_available) {\n console.log(\"\");\n console.log(\n `\\x1b[33m⬆️ XClawRouter ${parsed.update_available} available (you have ${VERSION})\\x1b[0m`,\n );\n console.log(\n ` Run: \\x1b[36mcurl -fsSL ${parsed.update_url || \"https://blockrun.ai/xclawrouter-update\"} | bash\\x1b[0m`,\n );\n console.log(\"\");\n }\n } catch {\n /* ignore parse errors */\n }\n } else if (errorCat === \"overloaded\") {\n markOverloaded(tryModel);\n } else if (errorCat === \"auth_failure\" || errorCat === \"quota_exceeded\") {\n console.log(\n `[XClawRouter] 🔑 ${errorCat === \"auth_failure\" ? \"Auth failure\" : \"Quota exceeded\"} for ${tryModel} — check provider config`,\n );\n }\n\n console.log(\n `[XClawRouter] Provider error from ${tryModel}, trying fallback: ${result.errorBody?.slice(0, 100)}`,\n );\n continue;\n }\n\n // Not a provider error or last attempt — stop trying\n if (!result.isProviderError) {\n console.log(\n `[XClawRouter] Non-provider error from ${tryModel}, not retrying: ${result.errorBody?.slice(0, 100)}`,\n );\n }\n break;\n }\n\n // Clear timeout and client-close listener — request attempts completed\n clearTimeout(timeoutId);\n req.removeListener(\"close\", onClientClose);\n\n // Clear heartbeat — real data is about to flow\n if (heartbeatInterval) {\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n\n // --- Emit routing debug info (opt-in via x-clawrouter-debug: true header) ---\n // For streaming: SSE comment (invisible to most clients, visible in raw stream)\n // For non-streaming: response headers added later\n if (debugMode && headersSentEarly && routingDecision) {\n const debugComment = `: x-clawrouter-debug profile=${routingProfile ?? \"auto\"} tier=${routingDecision.tier} model=${actualModelUsed} agentic=${routingDecision.agenticScore?.toFixed(2) ?? \"n/a\"} confidence=${routingDecision.confidence.toFixed(2)} reasoning=${routingDecision.reasoning}\\n\\n`;\n safeWrite(res, debugComment);\n }\n\n // Update routing decision with actual model used (for logging)\n // IMPORTANT: Recalculate cost for the actual model, not the original primary\n if (routingDecision && actualModelUsed !== routingDecision.model) {\n const estimatedInputTokens = Math.ceil(body.length / 4);\n const newCosts = calculateModelCost(\n actualModelUsed,\n routerOpts.modelPricing,\n estimatedInputTokens,\n maxTokens,\n routingProfile ?? undefined,\n );\n routingDecision = {\n ...routingDecision,\n model: actualModelUsed,\n reasoning: `${routingDecision.reasoning} | fallback to ${actualModelUsed}`,\n costEstimate: newCosts.costEstimate,\n baselineCost: newCosts.baselineCost,\n savings: newCosts.savings,\n };\n options.onRouted?.(routingDecision);\n\n // Update session pin to the actual model used — ensures the next request in\n // this conversation starts from the fallback model rather than retrying the\n // primary and falling back again (prevents the \"model keeps jumping\" issue).\n if (effectiveSessionId) {\n const pinnedSession = sessionStore.getSession(effectiveSessionId);\n if (pinnedSession?.userExplicit) {\n console.log(\n `[XClawRouter] Session ${effectiveSessionId.slice(0, 8)}... fallback used ${actualModelUsed}, preserving user-explicit pin: ${pinnedSession.model}`,\n );\n } else {\n sessionStore.setSession(effectiveSessionId, actualModelUsed, routingDecision.tier);\n console.log(\n `[XClawRouter] Session ${effectiveSessionId.slice(0, 8)}... updated pin to fallback: ${actualModelUsed}`,\n );\n }\n }\n }\n\n // --- Handle case where all models failed ---\n if (!upstream) {\n // Build structured error summary listing all attempted models\n const attemptSummary =\n failedAttempts.length > 0\n ? failedAttempts.map((a) => `${a.model} (${a.reason})`).join(\", \")\n : \"unknown\";\n const structuredMessage =\n failedAttempts.length > 0\n ? `All ${failedAttempts.length} models failed. Tried: ${attemptSummary}`\n : \"All models in fallback chain failed\";\n console.log(`[XClawRouter] ${structuredMessage}`);\n const rawErrBody = lastError?.body || structuredMessage;\n const errStatus = lastError?.status || 502;\n\n // Transform payment errors into user-friendly messages\n const transformedErr = transformPaymentError(rawErrBody);\n\n // Mark as error for usage logging (logs this failed attempt with cost)\n requestHadError = true;\n\n if (headersSentEarly) {\n // Streaming: send error as SSE event in OpenAI error format.\n // The OpenAI SDK (used by continue.dev and others) expects {\"error\": {...}}.\n // If the upstream error is already in that shape, use it; otherwise wrap it.\n // Sending raw upstream JSON (e.g. {\"code\":400,\"message\":\"...\"}) causes the SDK\n // to throw a generic \"Unexpected error\" instead of a meaningful message.\n let errPayload: string;\n try {\n const parsed = JSON.parse(transformedErr);\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n // Already has the correct {\"error\": {...}} wrapper — use as-is\n errPayload = JSON.stringify(parsed);\n } else {\n // Raw upstream JSON without error wrapper — wrap it\n errPayload = JSON.stringify({\n error: { message: rawErrBody, type: \"provider_error\", status: errStatus },\n });\n }\n } catch {\n errPayload = JSON.stringify({\n error: { message: rawErrBody, type: \"provider_error\", status: errStatus },\n });\n }\n const errEvent = `data: ${errPayload}\\n\\n`;\n safeWrite(res, errEvent);\n safeWrite(res, \"data: [DONE]\\n\\n\");\n res.end();\n\n const errBuf = Buffer.from(errEvent + \"data: [DONE]\\n\\n\");\n deduplicator.complete(dedupKey, {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n body: errBuf,\n completedAt: Date.now(),\n });\n } else {\n // Non-streaming: send transformed error response with context headers\n res.writeHead(errStatus, {\n \"Content-Type\": \"application/json\",\n \"x-context-used-kb\": String(originalContextSizeKB),\n \"x-context-limit-kb\": String(CONTEXT_LIMIT_KB),\n });\n res.end(transformedErr);\n\n deduplicator.complete(dedupKey, {\n status: errStatus,\n headers: { \"content-type\": \"application/json\" },\n body: Buffer.from(transformedErr),\n completedAt: Date.now(),\n });\n }\n\n // Log failed request so users can see it in `clawrouter logs`\n // cost = actual x402 payment if any was made, otherwise 0\n const errModel = routingDecision?.model ?? modelId;\n if (errModel) {\n const errPayment = paymentStore.getStore()?.amountUsd ?? 0;\n logUsage({\n timestamp: new Date().toISOString(),\n model: errModel,\n tier: routingDecision?.tier ?? \"DIRECT\",\n cost: errPayment,\n baselineCost: errPayment,\n savings: 0,\n latencyMs: Date.now() - startTime,\n status: \"error\",\n }).catch(() => {});\n }\n return;\n }\n\n // --- Stream response and collect for dedup cache ---\n const responseChunks: Buffer[] = [];\n\n if (headersSentEarly) {\n // Streaming: headers already sent. Response should be 200 at this point\n // (non-200 responses are handled in the fallback loop above)\n\n // Convert non-streaming JSON response to SSE streaming format for client\n // (BlockRun API returns JSON since we forced stream:false)\n // OpenClaw expects: object=\"chat.completion.chunk\" with choices[].delta (not message)\n // We emit proper incremental deltas to match OpenAI's streaming format exactly\n if (upstream.body) {\n const chunks = await readBodyWithTimeout(upstream.body);\n\n // Combine chunks and transform to streaming format\n const jsonBody = Buffer.concat(chunks);\n const jsonStr = jsonBody.toString();\n try {\n const rsp = JSON.parse(jsonStr) as {\n id?: string;\n object?: string;\n created?: number;\n model?: string;\n choices?: Array<{\n index?: number;\n message?: {\n role?: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n };\n delta?: {\n role?: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: unknown;\n };\n\n // Extract input token count from upstream response\n if (rsp.usage && typeof rsp.usage === \"object\") {\n const u = rsp.usage as Record;\n if (typeof u.prompt_tokens === \"number\") responseInputTokens = u.prompt_tokens;\n if (typeof u.completion_tokens === \"number\") responseOutputTokens = u.completion_tokens;\n }\n\n // Build base chunk structure (reused for all chunks)\n // Match OpenAI's exact format including system_fingerprint\n const baseChunk = {\n id: rsp.id ?? `chatcmpl-${Date.now()}`,\n object: \"chat.completion.chunk\",\n created: rsp.created ?? Math.floor(Date.now() / 1000),\n model: actualModelUsed || rsp.model || \"unknown\",\n system_fingerprint: null,\n };\n\n // Process each choice (usually just one)\n if (rsp.choices && Array.isArray(rsp.choices)) {\n for (const choice of rsp.choices) {\n const endsWithToolCalls = choice.finish_reason === \"tool_calls\";\n // Some OpenAI-compatible providers include planning prose in content\n // alongside tool_calls, or mark the turn as a tool-call turn via\n // finish_reason before exposing the tool_calls array at the same\n // object shape. Tool execution only needs tool_calls, so do not\n // forward that prose to chat channels.\n let toolCalls = choice.message?.tool_calls ?? choice.delta?.tool_calls;\n const rawContent = choice.message?.content ?? choice.delta?.content ?? \"\";\n\n // When upstream returns no structured tool_calls but the model emitted\n // tool calls as XML/text in `content` (e.g. OpenClaw-instructed\n // `...` or Anthropic-style `\n // ...`), synthesize the structured form so downstream tool\n // executors can dispatch them. The agent loops we saw in the wild\n // (six retries then a hallucinated \"API key missing\") came from\n // this gap.\n if (!endsWithToolCalls && (!toolCalls || toolCalls.length === 0) && rawContent) {\n const extracted = extractTextualToolCalls(rawContent);\n if (extracted.toolCalls.length > 0) {\n toolCalls = extracted.toolCalls;\n }\n }\n\n // Strip thinking tokens (Kimi <|...|> and standard tags)\n const content =\n endsWithToolCalls || (toolCalls && toolCalls.length > 0)\n ? \"\"\n : stripThinkingTokens(rawContent);\n const role = choice.message?.role ?? choice.delta?.role ?? \"assistant\";\n const index = choice.index ?? 0;\n\n // Accumulate content for session journal\n if (content) {\n accumulatedContent += content;\n }\n\n // Chunk 1: role only (mimics OpenAI's first chunk)\n const roleChunk = {\n ...baseChunk,\n choices: [{ index, delta: { role }, logprobs: null, finish_reason: null }],\n };\n const roleData = `data: ${JSON.stringify(roleChunk)}\\n\\n`;\n safeWrite(res, roleData);\n responseChunks.push(Buffer.from(roleData));\n\n // Chunk 1.5: balance fallback notice (tells user they got free model)\n if (balanceFallbackNotice) {\n const noticeChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: { content: balanceFallbackNotice },\n logprobs: null,\n finish_reason: null,\n },\n ],\n };\n const noticeData = `data: ${JSON.stringify(noticeChunk)}\\n\\n`;\n safeWrite(res, noticeData);\n responseChunks.push(Buffer.from(noticeData));\n balanceFallbackNotice = undefined; // Only inject once\n }\n\n // Chunk 1.6: budget downgrade notice (A: visible warning when model downgraded)\n if (budgetDowngradeNotice) {\n const noticeChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: { content: budgetDowngradeNotice },\n logprobs: null,\n finish_reason: null,\n },\n ],\n };\n const noticeData = `data: ${JSON.stringify(noticeChunk)}\\n\\n`;\n safeWrite(res, noticeData);\n responseChunks.push(Buffer.from(noticeData));\n budgetDowngradeNotice = undefined; // Only inject once\n }\n\n // Chunk 2: content (single chunk with full content)\n if (content) {\n const contentChunk = {\n ...baseChunk,\n choices: [{ index, delta: { content }, logprobs: null, finish_reason: null }],\n };\n const contentData = `data: ${JSON.stringify(contentChunk)}\\n\\n`;\n safeWrite(res, contentData);\n responseChunks.push(Buffer.from(contentData));\n }\n\n // Chunk 2b: tool_calls (forward tool calls from upstream)\n if (toolCalls && toolCalls.length > 0) {\n const toolCallChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: { tool_calls: toolCalls },\n logprobs: null,\n finish_reason: null,\n },\n ],\n };\n const toolCallData = `data: ${JSON.stringify(toolCallChunk)}\\n\\n`;\n safeWrite(res, toolCallData);\n responseChunks.push(Buffer.from(toolCallData));\n }\n\n // Chunk 3: finish_reason (signals completion)\n const finishChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: {},\n logprobs: null,\n finish_reason:\n endsWithToolCalls || (toolCalls && toolCalls.length > 0)\n ? \"tool_calls\"\n : (choice.finish_reason ?? \"stop\"),\n },\n ],\n };\n const finishData = `data: ${JSON.stringify(finishChunk)}\\n\\n`;\n safeWrite(res, finishData);\n responseChunks.push(Buffer.from(finishData));\n }\n }\n } catch {\n // If parsing fails, wrap in OpenAI error format so SDKs surface a\n // meaningful message instead of throwing a generic \"Unexpected error\".\n const errPayload = JSON.stringify({\n error: {\n message: `Upstream response could not be parsed: ${jsonStr.slice(0, 200)}`,\n type: \"proxy_error\",\n },\n });\n const sseData = `data: ${errPayload}\\n\\n`;\n safeWrite(res, sseData);\n responseChunks.push(Buffer.from(sseData));\n }\n }\n\n // Send a final usage chunk (OpenAI `stream_options.include_usage` format)\n // carrying both the standard token counts AND the XClawRouter cost breakdown.\n // OpenClaw's session-cost-usage module reads `usage.cost.{total,input,output}`\n // from every assistant message, so emitting the cost here feeds both the\n // per-session footer (/usage full) and the /stats-style reports.\n if (typeof responseInputTokens === \"number\" && typeof responseOutputTokens === \"number\") {\n const usagePayload: Record = {\n prompt_tokens: responseInputTokens,\n completion_tokens: responseOutputTokens,\n total_tokens: responseInputTokens + responseOutputTokens,\n };\n const costBreakdown = buildCostBreakdown({\n actualModelUsed,\n routingProfile: routingProfile ?? undefined,\n routingDecision,\n modelPricing: routerOpts.modelPricing,\n inputTokens: responseInputTokens,\n outputTokens: responseOutputTokens,\n tier: routingDecision?.tier,\n });\n if (costBreakdown) {\n usagePayload.cost = costBreakdown;\n }\n const usageChunk = {\n id: `chatcmpl-${Date.now()}`,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: actualModelUsed || \"unknown\",\n system_fingerprint: null,\n choices: [],\n usage: usagePayload,\n };\n const usageData = `data: ${JSON.stringify(usageChunk)}\\n\\n`;\n safeWrite(res, usageData);\n responseChunks.push(Buffer.from(usageData));\n }\n\n // Send cost summary as SSE comment before terminator (human-readable log)\n if (routingDecision) {\n const costComment = `: cost=$${routingDecision.costEstimate.toFixed(4)} savings=${(routingDecision.savings * 100).toFixed(0)}% model=${actualModelUsed} tier=${routingDecision.tier}\\n\\n`;\n safeWrite(res, costComment);\n responseChunks.push(Buffer.from(costComment));\n }\n\n // Send SSE terminator\n safeWrite(res, \"data: [DONE]\\n\\n\");\n responseChunks.push(Buffer.from(\"data: [DONE]\\n\\n\"));\n res.end();\n\n // Cache for dedup\n deduplicator.complete(dedupKey, {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n body: Buffer.concat(responseChunks),\n completedAt: Date.now(),\n });\n } else {\n // Non-streaming: forward status and headers from upstream\n const responseHeaders: Record = {};\n upstream.headers.forEach((value, key) => {\n // Skip hop-by-hop headers and content-encoding (fetch already decompresses)\n if (key === \"transfer-encoding\" || key === \"connection\" || key === \"content-encoding\")\n return;\n responseHeaders[key] = value;\n });\n\n // Add context usage headers\n responseHeaders[\"x-context-used-kb\"] = String(originalContextSizeKB);\n responseHeaders[\"x-context-limit-kb\"] = String(CONTEXT_LIMIT_KB);\n\n // Add routing debug headers (opt-in via x-clawrouter-debug: true header)\n if (debugMode && routingDecision) {\n responseHeaders[\"x-clawrouter-profile\"] = routingProfile ?? \"auto\";\n responseHeaders[\"x-clawrouter-tier\"] = routingDecision.tier;\n responseHeaders[\"x-clawrouter-model\"] = actualModelUsed;\n responseHeaders[\"x-clawrouter-confidence\"] = routingDecision.confidence.toFixed(2);\n responseHeaders[\"x-clawrouter-reasoning\"] = routingDecision.reasoning;\n if (routingDecision.agenticScore !== undefined) {\n responseHeaders[\"x-clawrouter-agentic-score\"] = routingDecision.agenticScore.toFixed(2);\n }\n }\n\n // Always include cost visibility headers when routing is active\n if (routingDecision) {\n responseHeaders[\"x-clawrouter-cost\"] = routingDecision.costEstimate.toFixed(6);\n responseHeaders[\"x-clawrouter-savings\"] = `${(routingDecision.savings * 100).toFixed(0)}%`;\n }\n\n // Collect full body for possible notice injection\n const bodyParts: Buffer[] = [];\n if (upstream.body) {\n const chunks = await readBodyWithTimeout(upstream.body);\n for (const chunk of chunks) {\n bodyParts.push(Buffer.from(chunk));\n }\n }\n\n let responseBody = Buffer.concat(bodyParts);\n\n // Strip thinking tokens from non-streaming responses (same as streaming path)\n if (responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n choices?: Array<{\n finish_reason?: string | null;\n message?: {\n content?: string;\n tool_calls?: unknown[];\n };\n }>;\n };\n let changed = false;\n for (const choice of parsed.choices ?? []) {\n const message = choice.message;\n if (!message || typeof message.content !== \"string\") continue;\n\n if (\n choice.finish_reason === \"tool_calls\" ||\n (Array.isArray(message.tool_calls) && message.tool_calls.length > 0)\n ) {\n if (message.content !== \"\") {\n message.content = \"\";\n changed = true;\n }\n continue;\n }\n\n // Synthesize tool_calls from XML/text formats some models emit in\n // `content` (OpenClaw `...`, Anthropic-style\n // `...`). Without this, tool calls land as\n // plain text and downstream executors can't dispatch them.\n const extracted = extractTextualToolCalls(message.content);\n if (extracted.toolCalls.length > 0) {\n message.tool_calls = extracted.toolCalls;\n message.content = \"\";\n choice.finish_reason = \"tool_calls\";\n changed = true;\n continue;\n }\n\n const stripped = stripThinkingTokens(message.content);\n if (stripped !== message.content) {\n message.content = stripped;\n changed = true;\n }\n }\n if (changed) responseBody = Buffer.from(JSON.stringify(parsed));\n } catch {\n /* not JSON, skip */\n }\n }\n\n // Prepend balance fallback notice to response content\n if (balanceFallbackNotice && responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n if (parsed.choices?.[0]?.message?.content !== undefined) {\n parsed.choices[0].message.content =\n balanceFallbackNotice + parsed.choices[0].message.content;\n responseBody = Buffer.from(JSON.stringify(parsed));\n }\n } catch {\n /* not JSON, skip notice */\n }\n balanceFallbackNotice = undefined;\n }\n\n // A: Prepend budget downgrade notice to response content\n if (budgetDowngradeNotice && responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n if (parsed.choices?.[0]?.message?.content !== undefined) {\n parsed.choices[0].message.content =\n budgetDowngradeNotice + parsed.choices[0].message.content;\n responseBody = Buffer.from(JSON.stringify(parsed));\n }\n } catch {\n /* not JSON, skip notice */\n }\n budgetDowngradeNotice = undefined;\n }\n\n // Inject actualModelUsed + per-call cost breakdown into non-streaming response.\n // - `model` is overwritten unconditionally (some upstreams omit it) so OpenAI\n // clients see the resolved model, not the routing profile.\n // - `usage.cost` follows OpenClaw's convention (session-cost-usage module reads\n // `usage.cost.{total,input,output}`). Extra fields (baseline, savings_pct,\n // model, tier) are forward-compat metadata ignored by current OpenClaw.\n if (actualModelUsed && responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n model?: string;\n usage?: Record;\n };\n parsed.model = actualModelUsed;\n\n const costBreakdown = buildCostBreakdown({\n actualModelUsed,\n routingProfile: routingProfile ?? undefined,\n routingDecision,\n modelPricing: routerOpts.modelPricing,\n inputTokens: responseInputTokens,\n outputTokens: responseOutputTokens,\n tier: routingDecision?.tier,\n });\n if (costBreakdown) {\n if (!parsed.usage || typeof parsed.usage !== \"object\") {\n parsed.usage = {};\n }\n (parsed.usage as Record).cost = costBreakdown;\n }\n\n responseBody = Buffer.from(JSON.stringify(parsed));\n } catch {\n /* not JSON, skip model/cost injection */\n }\n }\n\n // B: Add budget downgrade headers for orchestration layers\n if (budgetDowngradeHeaderMode) {\n responseHeaders[\"x-clawrouter-budget-downgrade\"] = \"1\";\n responseHeaders[\"x-clawrouter-budget-mode\"] = budgetDowngradeHeaderMode;\n budgetDowngradeHeaderMode = undefined;\n }\n\n // Update content-length header since body may have changed\n responseHeaders[\"content-length\"] = String(responseBody.length);\n res.writeHead(upstream.status, responseHeaders);\n safeWrite(res, responseBody);\n responseChunks.push(responseBody);\n res.end();\n\n // Cache for dedup (short-term, 30s)\n deduplicator.complete(dedupKey, {\n status: upstream.status,\n headers: responseHeaders,\n body: responseBody,\n completedAt: Date.now(),\n });\n\n // Cache for response cache (long-term, 10min) - only successful non-streaming\n if (upstream.status === 200 && responseCache.shouldCache(body)) {\n responseCache.set(cacheKey, {\n body: responseBody,\n status: upstream.status,\n headers: responseHeaders,\n model: actualModelUsed,\n });\n console.log(\n `[XClawRouter] Cached response for ${actualModelUsed} (${responseBody.length} bytes)`,\n );\n }\n\n // Extract content and token usage from non-streaming response\n try {\n const rspJson = JSON.parse(responseBody.toString()) as {\n choices?: Array<{ message?: { content?: string } }>;\n usage?: Record;\n };\n if (rspJson.choices?.[0]?.message?.content) {\n accumulatedContent = rspJson.choices[0].message.content;\n }\n if (rspJson.usage && typeof rspJson.usage === \"object\") {\n if (typeof rspJson.usage.prompt_tokens === \"number\")\n responseInputTokens = rspJson.usage.prompt_tokens;\n if (typeof rspJson.usage.completion_tokens === \"number\")\n responseOutputTokens = rspJson.usage.completion_tokens;\n }\n } catch {\n // Ignore parse errors - journal just won't have content for this response\n }\n }\n\n // --- Degenerate-output diagnostic (fires only on repetition loops) ---\n if (accumulatedContent.length >= 80) {\n const tail = accumulatedContent.slice(-80);\n const tailChars = [...tail];\n const firstChar = tailChars[0];\n const isPunct = /[^\\p{L}\\p{N}\\s]/u.test(firstChar);\n const sameCount = tailChars.filter((c) => c === firstChar).length;\n if (isPunct && sameCount >= 60) {\n console.warn(\n `[XClawRouter] ⚠️ Degenerate output detected — model=${actualModelUsed || \"unknown\"} len=${accumulatedContent.length} head=${JSON.stringify(accumulatedContent.slice(0, 40))} tail_repeats_${JSON.stringify(firstChar)}=${sameCount}/80`,\n );\n }\n }\n\n // --- Session Journal: Extract and record events from response ---\n if (sessionId && accumulatedContent) {\n const events = sessionJournal.extractEvents(accumulatedContent);\n if (events.length > 0) {\n sessionJournal.record(sessionId, events, actualModelUsed);\n console.log(\n `[XClawRouter] Recorded ${events.length} events to session journal for session ${sessionId.slice(0, 8)}...`,\n );\n }\n }\n\n // --- Optimistic balance deduction after successful response ---\n if (estimatedCostMicros !== undefined) {\n balanceMonitor.deductEstimated(estimatedCostMicros);\n }\n\n // Mark request as completed (for client disconnect cleanup)\n completed = true;\n } catch (err) {\n // Clear timeout and client-close listener on error\n clearTimeout(timeoutId);\n req.removeListener(\"close\", onClientClose);\n\n // Clear heartbeat on error\n if (heartbeatInterval) {\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n\n // Remove in-flight entry so retries aren't blocked\n deduplicator.removeInflight(dedupKey);\n\n // Invalidate balance cache on payment failure (might be out of date)\n balanceMonitor.invalidate();\n\n // Convert abort error to more descriptive timeout error\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(`Request timed out after ${timeoutMs}ms`, { cause: err });\n }\n\n throw err;\n }\n\n // --- Usage logging (fire-and-forget) ---\n // Use actual x402 payment amount from the per-request AsyncLocalStorage store.\n // This is the real amount the user paid — no estimation needed.\n // Falls back to local estimate only for free models (no x402 payment).\n const logModel = routingDecision?.model ?? modelId;\n if (logModel) {\n const actualPayment = paymentStore.getStore()?.amountUsd ?? 0;\n\n // For free models (no x402 payment), use local cost calculation as fallback\n let logCost: number;\n let logBaseline: number;\n let logSavings: number;\n if (actualPayment > 0) {\n logCost = actualPayment;\n // Calculate baseline for savings comparison\n const chargedInputTokens = Math.ceil(body.length / 4);\n const modelDef = BLOCKRUN_MODELS.find((m) => m.id === logModel);\n const chargedOutputTokens = modelDef ? Math.min(maxTokens, modelDef.maxOutput) : maxTokens;\n const baseline = calculateModelCost(\n logModel,\n routerOpts.modelPricing,\n chargedInputTokens,\n chargedOutputTokens,\n routingProfile ?? undefined,\n );\n logBaseline = baseline.baselineCost;\n logSavings = logBaseline > 0 ? Math.max(0, (logBaseline - logCost) / logBaseline) : 0;\n } else {\n const chargedInputTokens = Math.ceil(body.length / 4);\n const costs = calculateModelCost(\n logModel,\n routerOpts.modelPricing,\n chargedInputTokens,\n maxTokens,\n routingProfile ?? undefined,\n );\n // Free models: actual cost is $0 (no x402 payment ever made).\n // MIN_PAYMENT_USD floor in calculateModelCost would falsely inflate stats.\n logCost = FREE_MODELS.has(logModel) ? 0 : costs.costEstimate;\n logBaseline = costs.baselineCost;\n logSavings = FREE_MODELS.has(logModel) ? 1 : costs.savings;\n }\n\n const entry: UsageEntry = {\n timestamp: new Date().toISOString(),\n model: logModel,\n tier: routingDecision?.tier ?? \"DIRECT\",\n cost: logCost,\n baselineCost: logBaseline,\n savings: logSavings,\n latencyMs: Date.now() - startTime,\n status: requestHadError ? \"error\" : \"success\",\n ...(responseInputTokens !== undefined && { inputTokens: responseInputTokens }),\n ...(responseOutputTokens !== undefined && { outputTokens: responseOutputTokens }),\n };\n logUsage(entry).catch(() => {});\n }\n}\n","import type { Client } from '../clients/createClient.js'\nimport type { PublicActions } from '../clients/decorators/public.js'\nimport type { WalletActions } from '../clients/decorators/wallet.js'\nimport type { Transport } from '../clients/transports/createTransport.js'\nimport type { Account } from '../types/account.js'\nimport type { Chain } from '../types/chain.js'\nimport type { RpcSchema } from '../types/eip1193.js'\n\n/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction<\n transport extends Transport,\n chain extends Chain | undefined,\n account extends Account | undefined,\n rpcSchema extends RpcSchema | undefined,\n extended extends { [key: string]: unknown },\n client extends Client,\n parameters,\n returnType,\n>(\n client: client,\n actionFn: (_: any, parameters: parameters) => returnType,\n // Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n // meaning that `actionFn.name` will not always work. For that case, the consumer\n // needs to pass the name explicitly.\n name: keyof PublicActions | keyof WalletActions | (string & {}),\n): (parameters: parameters) => returnType {\n const action_implicit = client[actionFn.name]\n if (typeof action_implicit === 'function')\n return action_implicit as (params: parameters) => returnType\n\n const action_explicit = client[name]\n if (typeof action_explicit === 'function')\n return action_explicit as (params: parameters) => returnType\n\n return (params) => actionFn(client, params)\n}\n","import type {\n Abi,\n AbiParameter,\n AbiParameterToPrimitiveType,\n ExtractAbiEvents,\n} from 'abitype'\n\nimport {\n AbiEventNotFoundError,\n type AbiEventNotFoundErrorType,\n} from '../../errors/abi.js'\nimport {\n FilterTypeNotSupportedError,\n type FilterTypeNotSupportedErrorType,\n} from '../../errors/log.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n EventDefinition,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type ToEventSelectorErrorType,\n toEventSelector,\n} from '../hash/toEventSelector.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeEventTopics'\n\nexport type EncodeEventTopicsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n ///\n hasEvents = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiEvents] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName\n >,\n allErrorNames = ContractEventName,\n> = {\n abi: abi\n args?: allArgs | undefined\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { eventName?: eventName | allErrorNames | undefined }\n : { eventName: eventName | allErrorNames }\n : { eventName?: eventName | allErrorNames | undefined }\n> &\n (hasEvents extends true ? unknown : never)\n\nexport type EncodeEventTopicsReturnType = [Hex, ...(Hex | Hex[] | null)[]]\n\nexport type EncodeEventTopicsErrorType =\n | AbiEventNotFoundErrorType\n | EncodeArgErrorType\n | FormatAbiItemErrorType\n | GetAbiItemErrorType\n | ToEventSelectorErrorType\n | ErrorType\n\nexport function encodeEventTopics<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n>(\n parameters: EncodeEventTopicsParameters,\n): EncodeEventTopicsReturnType {\n const { abi, eventName, args } = parameters as EncodeEventTopicsParameters\n\n let abiItem = abi[0]\n if (eventName) {\n const item = getAbiItem({ abi, name: eventName })\n if (!item) throw new AbiEventNotFoundError(eventName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'event')\n throw new AbiEventNotFoundError(undefined, { docsPath })\n\n const definition = formatAbiItem(abiItem)\n const signature = toEventSelector(definition as EventDefinition)\n\n let topics: (Hex | Hex[] | null)[] = []\n if (args && 'inputs' in abiItem) {\n const indexedInputs = abiItem.inputs?.filter(\n (param) => 'indexed' in param && param.indexed,\n )\n const args_ = Array.isArray(args)\n ? args\n : Object.values(args).length > 0\n ? (indexedInputs?.map((x: any) => (args as any)[x.name]) ?? [])\n : []\n\n if (args_.length > 0) {\n topics =\n indexedInputs?.map((param, i) => {\n if (Array.isArray(args_[i]))\n return args_[i].map((_: any, j: number) =>\n encodeArg({ param, value: args_[i][j] }),\n )\n return typeof args_[i] !== 'undefined' && args_[i] !== null\n ? encodeArg({ param, value: args_[i] })\n : null\n }) ?? []\n }\n }\n return [signature, ...topics]\n}\n\nexport type EncodeArgErrorType =\n | Keccak256ErrorType\n | ToBytesErrorType\n | EncodeAbiParametersErrorType\n | FilterTypeNotSupportedErrorType\n | ErrorType\n\nfunction encodeArg({\n param,\n value,\n}: {\n param: AbiParameter\n value: AbiParameterToPrimitiveType\n}) {\n if (param.type === 'string' || param.type === 'bytes')\n return keccak256(toBytes(value as string))\n if (param.type === 'tuple' || param.type.match(/^(.*)\\[(\\d+)?\\]$/))\n throw new FilterTypeNotSupportedError(param.type)\n return encodeAbiParameters([param], [value])\n}\n","import { BaseError } from './base.js'\n\nexport type FilterTypeNotSupportedErrorType = FilterTypeNotSupportedError & {\n name: 'FilterTypeNotSupportedError'\n}\nexport class FilterTypeNotSupportedError extends BaseError {\n constructor(type: string) {\n super(`Filter type \"${type}\" is not supported.`, {\n name: 'FilterTypeNotSupportedError',\n })\n }\n}\n","import type { Abi, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Hex } from '../../types/misc.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreateContractEventFilterParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = undefined,\n args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n address?: Address | Address[] | undefined\n abi: abi\n eventName?: eventName | ContractEventName | undefined\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments in the event ABI item.\n * @default false\n */\n strict?: strict | boolean | undefined\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n} & (undefined extends eventName\n ? {\n args?: undefined\n }\n : MaybeExtractEventArgsFromAbi extends infer eventFilterArgs\n ? {\n args?:\n | eventFilterArgs\n | (args extends eventFilterArgs ? args : never)\n | undefined\n }\n : {\n args?: undefined\n })\n\nexport type CreateContractEventFilterReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = undefined,\n args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = Filter<'event', abi, eventName, args, strict, fromBlock, toBlock>\n\nexport type CreateContractEventFilterErrorType =\n | EncodeEventTopicsErrorType\n | RequestErrorType\n | NumberToHexErrorType\n | ErrorType\n\n/**\n * Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs).\n *\n * - Docs: https://viem.sh/docs/contract/createContractEventFilter\n *\n * @param client - Client to use\n * @param parameters - {@link CreateContractEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateContractEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createContractEventFilter } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createContractEventFilter(client, {\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * })\n */\nexport async function createContractEventFilter<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined,\n args extends MaybeExtractEventArgsFromAbi | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client,\n parameters: CreateContractEventFilterParameters<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n> {\n const { address, abi, args, eventName, fromBlock, strict, toBlock } =\n parameters as CreateContractEventFilterParameters\n\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newFilter',\n })\n\n const topics = eventName\n ? encodeEventTopics({\n abi,\n args,\n eventName,\n } as unknown as EncodeEventTopicsParameters)\n : undefined\n const id: Hex = await client.request({\n method: 'eth_newFilter',\n params: [\n {\n address,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n topics,\n },\n ],\n })\n\n return {\n abi,\n args,\n eventName,\n id,\n request: getRequest(id),\n strict: Boolean(strict),\n type: 'event',\n } as unknown as CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { OnResponseFn } from '../../clients/transports/fallback.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { EIP1193RequestFn, PublicRpcSchema } from '../../types/eip1193.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { Filter } from '../../types/utils.js'\n\ntype CreateFilterRequestScopeParameters = {\n method:\n | 'eth_newFilter'\n | 'eth_newPendingTransactionFilter'\n | 'eth_newBlockFilter'\n}\n\ntype FilterRpcSchema = Filter<\n PublicRpcSchema,\n { Method: 'eth_getFilterLogs' | 'eth_getFilterChanges' }\n>\n\ntype CreateFilterRequestScopeReturnType = (\n id: Hex,\n) => EIP1193RequestFn\n\n/**\n * Scopes `request` to the filter ID. If the client is a fallback, it will\n * listen for responses and scope the child transport `request` function\n * to the successful filter ID.\n */\nexport function createFilterRequestScope(\n client: Client,\n { method }: CreateFilterRequestScopeParameters,\n): CreateFilterRequestScopeReturnType {\n const requestMap: Record = {}\n\n if (client.transport.type === 'fallback')\n client.transport.onResponse?.(\n ({\n method: method_,\n response: id,\n status,\n transport,\n }: Parameters[0]) => {\n if (status === 'success' && method === method_)\n requestMap[id as Hex] = transport.request\n },\n )\n\n return ((id) =>\n requestMap[id] || client.request) as CreateFilterRequestScopeReturnType\n}\n","import type { Abi } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n GetValue,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type EstimateGasErrorType,\n type EstimateGasParameters,\n estimateGas,\n} from './estimateGas.js'\n\nexport type EstimateContractGasParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs,\n chain extends Chain | undefined = Chain | undefined,\n> = ContractFunctionParameters<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n args\n> &\n UnionOmit, 'data' | 'to' | 'value'> &\n GetValue<\n abi,\n functionName,\n EstimateGasParameters extends EstimateGasParameters\n ? EstimateGasParameters['value']\n : EstimateGasParameters['value']\n > & {\n /** Data to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f). */\n dataSuffix?: Hex | undefined\n }\n\nexport type EstimateContractGasReturnType = bigint\n\nexport type EstimateContractGasErrorType = GetContractErrorReturnType<\n EncodeFunctionDataErrorType | EstimateGasErrorType | ParseAccountErrorType\n>\n\n/**\n * Estimates the gas required to successfully execute a contract write function call.\n *\n * - Docs: https://viem.sh/docs/contract/estimateContractGas\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateContractGasParameters}\n * @returns The gas estimate (in wei). {@link EstimateContractGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateContractGas } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gas = await estimateContractGas(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint() public']),\n * functionName: 'mint',\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * })\n */\nexport async function estimateContractGas<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n args extends ContractFunctionArgs,\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n>(\n client: Client,\n parameters: EstimateContractGasParameters,\n): Promise {\n const {\n abi,\n address,\n args,\n functionName,\n dataSuffix = typeof client.dataSuffix === 'string'\n ? client.dataSuffix\n : client.dataSuffix?.value,\n ...request\n } = parameters as EstimateContractGasParameters\n const data = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n\n try {\n const gas = await getAction(\n client,\n estimateGas,\n 'estimateGas',\n )({\n data: `${data}${dataSuffix ? dataSuffix.replace('0x', '') : ''}`,\n to: address,\n ...request,\n } as unknown as EstimateGasParameters)\n return gas\n } catch (error) {\n const account = request.account ? parseAccount(request.account) : undefined\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/estimateContractGas',\n functionName,\n sender: account?.address,\n })\n }\n}\n","import type { Abi, Address } from 'abitype'\n\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n ContractFunctionExecutionError,\n type ContractFunctionExecutionErrorType,\n ContractFunctionRevertedError,\n type ContractFunctionRevertedErrorType,\n ContractFunctionZeroDataError,\n type ContractFunctionZeroDataErrorType,\n RawContractError,\n} from '../../errors/contract.js'\nimport { RpcRequestError } from '../../errors/request.js'\nimport { InternalRpcError, InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\nconst EXECUTION_REVERTED_ERROR_CODE = 3\n\nexport type GetContractErrorReturnType = Omit<\n ContractFunctionExecutionErrorType,\n 'cause'\n> & {\n cause:\n | cause\n | ContractFunctionZeroDataErrorType\n | ContractFunctionRevertedErrorType\n}\n\nexport function getContractError>(\n err: err,\n {\n abi,\n address,\n args,\n docsPath,\n functionName,\n sender,\n }: {\n abi: Abi\n args: any\n address?: Address | undefined\n docsPath?: string | undefined\n functionName: string\n sender?: Address | undefined\n },\n): GetContractErrorReturnType {\n const error = (\n err instanceof RawContractError\n ? err\n : err instanceof BaseError\n ? err.walk((err) => 'data' in (err as Error)) || err.walk()\n : {}\n ) as BaseError\n const { code, data, details, message, shortMessage } =\n error as RawContractError\n\n const cause = (() => {\n if (err instanceof AbiDecodingZeroDataError)\n return new ContractFunctionZeroDataError({ functionName, cause: err })\n if (\n ([EXECUTION_REVERTED_ERROR_CODE, InternalRpcError.code].includes(code) &&\n (data || details || message || shortMessage)) ||\n (code === InvalidInputRpcError.code &&\n details === 'execution reverted' &&\n data)\n ) {\n return new ContractFunctionRevertedError({\n abi,\n data: typeof data === 'object' ? data.data : data,\n functionName,\n message:\n error instanceof RpcRequestError\n ? details\n : (shortMessage ?? message),\n cause: err,\n })\n }\n return err\n })()\n\n return new ContractFunctionExecutionError(cause as BaseError, {\n abi,\n args,\n contractAddress: address,\n docsPath,\n functionName,\n sender,\n }) as GetContractErrorReturnType\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BaseError } from '../../errors/base.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n recoverAuthorizationAddress,\n} from '../../utils/authorization/recoverAuthorizationAddress.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type GetEstimateGasErrorReturnType,\n getEstimateGasError,\n} from '../../utils/errors/getEstimateGasError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { serializeStateOverride } from '../../utils/stateOverride.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport {\n type PrepareTransactionRequestParameters,\n type PrepareTransactionRequestParameterType,\n prepareTransactionRequest,\n} from '../wallet/prepareTransactionRequest.js'\n\nexport type EstimateGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = UnionOmit, 'from'> & {\n account?: Account | Address | undefined\n prepare?:\n | boolean\n | readonly PrepareTransactionRequestParameterType[]\n | undefined\n stateOverride?: StateOverride | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n )\ntype FormattedEstimateGas =\n FormattedTransactionRequest\n\nexport type EstimateGasReturnType = bigint\n\nexport type EstimateGasErrorType = GetEstimateGasErrorReturnType<\n | ParseAccountErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | RecoverAuthorizationAddressErrorType\n | AssertRequestErrorType\n>\n\n/**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateGasParameters}\n * @returns The gas estimate (in gas units). {@link EstimateGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateGas } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasEstimate = await estimateGas(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\nexport async function estimateGas<\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n>(\n client: Client,\n args: EstimateGasParameters,\n): Promise {\n const { account: account_ = client.account, prepare = true } = args\n const account = account_ ? parseAccount(account_) : undefined\n\n const parameters = (() => {\n if (Array.isArray(prepare)) return prepare\n // Some RPC Providers do not compute versioned hashes from blobs. We will need\n // to compute them.\n if (account?.type !== 'local') return ['blobVersionedHashes']\n return undefined\n })()\n\n try {\n const to = await (async () => {\n // If `to` exists on the parameters, use that.\n if (args.to) return args.to\n\n // If no `to` exists, and we are sending a EIP-7702 transaction, use the\n // address of the first authorization in the list.\n if (args.authorizationList && args.authorizationList.length > 0)\n return await recoverAuthorizationAddress({\n authorization: args.authorizationList[0],\n }).catch(() => {\n throw new BaseError(\n '`to` is required. Could not infer from `authorizationList`',\n )\n })\n\n // Otherwise, we are sending a deployment transaction.\n return undefined\n })()\n\n const {\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n blockNumber,\n blockTag,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n value,\n stateOverride,\n ...rest\n } = prepare\n ? ((await prepareTransactionRequest(client, {\n ...args,\n parameters,\n to,\n } as PrepareTransactionRequestParameters)) as EstimateGasParameters)\n : args\n\n // If we get `gas` back from the prepared transaction request, which is\n // different from the `gas` we provided, it was likely filled by other means\n // during request preparation (e.g. `eth_fillTransaction` or `chain.transactionRequest.prepare`).\n // (e.g. `eth_fillTransaction` or `chain.transactionRequest.prepare`).\n if (gas && args.gas !== gas) return gas\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const rpcStateOverride = serializeStateOverride(stateOverride)\n\n assertRequest(args as AssertRequestParameters)\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account,\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n data,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n } as TransactionRequest,\n 'estimateGas',\n )\n\n return BigInt(\n await client.request({\n method: 'eth_estimateGas',\n params: rpcStateOverride\n ? [\n request,\n block ?? client.experimental_blockTag ?? 'latest',\n rpcStateOverride,\n ]\n : block\n ? [request, block]\n : [request],\n }),\n )\n } catch (err) {\n throw getEstimateGasError(err as BaseError, {\n ...args,\n account,\n chain: client.chain,\n })\n }\n}\n","import type { Address } from 'abitype'\n\nimport { publicKeyToAddress } from '../../accounts/utils/publicKeyToAddress.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { recoverPublicKey } from './recoverPublicKey.js'\n\nexport type RecoverAddressParameters = {\n hash: Hex | ByteArray\n signature: Hex | ByteArray | Signature\n}\n\nexport type RecoverAddressReturnType = Address\n\nexport type RecoverAddressErrorType = ErrorType\n\nexport async function recoverAddress({\n hash,\n signature,\n}: RecoverAddressParameters): Promise {\n return publicKeyToAddress(await recoverPublicKey({ hash, signature }))\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { size } from '../data/size.js'\nimport {\n type HexToNumberErrorType,\n hexToBigInt,\n hexToNumber,\n} from '../encoding/fromHex.js'\nimport { toHex } from '../encoding/toHex.js'\n\nexport type RecoverPublicKeyParameters = {\n hash: Hex | ByteArray\n signature: Hex | ByteArray | Signature\n}\n\nexport type RecoverPublicKeyReturnType = Hex\n\nexport type RecoverPublicKeyErrorType =\n | HexToNumberErrorType\n | IsHexErrorType\n | ErrorType\n\nexport async function recoverPublicKey({\n hash,\n signature,\n}: RecoverPublicKeyParameters): Promise {\n const hashHex = isHex(hash) ? hash : toHex(hash)\n\n const { secp256k1 } = await import('@noble/curves/secp256k1')\n const signature_ = (() => {\n // typeof signature: `Signature`\n if (typeof signature === 'object' && 'r' in signature && 's' in signature) {\n const { r, s, v, yParity } = signature\n const yParityOrV = Number(yParity ?? v)!\n const recoveryBit = toRecoveryBit(yParityOrV)\n return new secp256k1.Signature(\n hexToBigInt(r),\n hexToBigInt(s),\n ).addRecoveryBit(recoveryBit)\n }\n\n // typeof signature: `Hex | ByteArray`\n const signatureHex = isHex(signature) ? signature : toHex(signature)\n if (size(signatureHex) !== 65) throw new Error('invalid signature length')\n const yParityOrV = hexToNumber(`0x${signatureHex.slice(130)}`)\n const recoveryBit = toRecoveryBit(yParityOrV)\n return secp256k1.Signature.fromCompact(\n signatureHex.substring(2, 130),\n ).addRecoveryBit(recoveryBit)\n })()\n\n const publicKey = signature_\n .recoverPublicKey(hashHex.substring(2))\n .toHex(false)\n return `0x${publicKey}`\n}\n\nfunction toRecoveryBit(yParityOrV: number) {\n if (yParityOrV === 0 || yParityOrV === 1) return yParityOrV\n if (yParityOrV === 27) return 0\n if (yParityOrV === 28) return 1\n throw new Error('Invalid yParityOrV value')\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n Authorization,\n AuthorizationRequest,\n SignedAuthorization,\n} from '../../types/authorization.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type RecoverAddressErrorType,\n recoverAddress,\n} from '../signature/recoverAddress.js'\nimport {\n type HashAuthorizationErrorType,\n hashAuthorization,\n} from './hashAuthorization.js'\n\nexport type RecoverAuthorizationAddressParameters<\n authorization extends OneOf<\n Authorization | AuthorizationRequest | SignedAuthorization\n > = OneOf,\n //\n _signature = Hex | ByteArray | OneOf,\n> = {\n /**\n * The Authorization object.\n *\n * - If an unsigned `authorization` is provided, the `signature` property is required.\n * - If a signed `authorization` is provided, the `signature` property does not need to be provided.\n */\n authorization:\n | authorization\n | OneOf\n} & (authorization extends SignedAuthorization\n ? {\n /** Signature of the Authorization. Not required if the `authorization` is signed. */\n signature?: _signature | undefined\n }\n : {\n /** Signature of the Authorization. Not required if the `authorization` is signed. */\n signature: _signature\n })\n\nexport type RecoverAuthorizationAddressReturnType = Address\n\nexport type RecoverAuthorizationAddressErrorType =\n | HashAuthorizationErrorType\n | RecoverAddressErrorType\n | ErrorType\n\nexport async function recoverAuthorizationAddress<\n const authorization extends OneOf<\n Authorization | AuthorizationRequest | SignedAuthorization\n >,\n>(\n parameters: RecoverAuthorizationAddressParameters,\n): Promise {\n const { authorization, signature } = parameters\n\n return recoverAddress({\n hash: hashAuthorization(authorization as AuthorizationRequest),\n signature: (signature ?? authorization) as Signature,\n })\n}\n","import type { Account } from '../accounts/types.js'\nimport type { EstimateGasParameters } from '../actions/public/estimateGas.js'\nimport type { Chain } from '../types/chain.js'\nimport { formatEther } from '../utils/unit/formatEther.js'\nimport { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { BaseError } from './base.js'\nimport { prettyPrint } from './transaction.js'\n\nexport type EstimateGasExecutionErrorType = EstimateGasExecutionError & {\n name: 'EstimateGasExecutionError'\n}\nexport class EstimateGasExecutionError extends BaseError {\n override cause: BaseError\n\n constructor(\n cause: BaseError,\n {\n account,\n docsPath,\n chain,\n data,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n }: Omit, 'account'> & {\n account?: Account | undefined\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n ) {\n const prettyArgs = prettyPrint({\n from: account?.address,\n to,\n value:\n typeof value !== 'undefined' &&\n `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n data,\n gas,\n gasPrice:\n typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n maxFeePerGas:\n typeof maxFeePerGas !== 'undefined' &&\n `${formatGwei(maxFeePerGas)} gwei`,\n maxPriorityFeePerGas:\n typeof maxPriorityFeePerGas !== 'undefined' &&\n `${formatGwei(maxPriorityFeePerGas)} gwei`,\n nonce,\n })\n\n super(cause.shortMessage, {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n 'Estimate Gas Arguments:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'EstimateGasExecutionError',\n })\n this.cause = cause\n }\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { EstimateGasParameters } from '../../actions/public/estimateGas.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n EstimateGasExecutionError,\n type EstimateGasExecutionErrorType,\n} from '../../errors/estimateGas.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetEstimateGasErrorReturnType = Omit<\n EstimateGasExecutionErrorType,\n 'cause'\n> & { cause: cause | GetNodeErrorReturnType }\n\nexport function getEstimateGasError>(\n err: err,\n {\n docsPath,\n ...args\n }: Omit & {\n account?: Account | undefined\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n): GetEstimateGasErrorReturnType {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new EstimateGasExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetEstimateGasErrorReturnType\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport {\n type EstimateFeesPerGasErrorType,\n internal_estimateFeesPerGas,\n} from '../../actions/public/estimateFeesPerGas.js'\nimport {\n type EstimateGasErrorType,\n type EstimateGasParameters,\n estimateGas,\n} from '../../actions/public/estimateGas.js'\nimport {\n type GetBlockErrorType,\n getBlock as getBlock_,\n} from '../../actions/public/getBlock.js'\nimport {\n type GetTransactionCountErrorType,\n getTransactionCount,\n} from '../../actions/public/getTransactionCount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { AccountNotFoundErrorType } from '../../errors/account.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n Eip1559FeesNotSupportedError,\n MaxFeePerGasTooLowError,\n} from '../../errors/fee.js'\nimport type { DeriveAccount, GetAccountParameter } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { GetTransactionRequestKzgParameter } from '../../types/kzg.js'\nimport type {\n TransactionRequest,\n TransactionRequestEIP1559,\n TransactionRequestEIP2930,\n TransactionRequestEIP4844,\n TransactionRequestEIP7702,\n TransactionRequestLegacy,\n TransactionSerializable,\n} from '../../types/transaction.js'\nimport type {\n ExactPartial,\n IsNever,\n Prettify,\n UnionOmit,\n UnionRequiredBy,\n} from '../../types/utils.js'\nimport { blobsToCommitments } from '../../utils/blob/blobsToCommitments.js'\nimport { blobsToProofs } from '../../utils/blob/blobsToProofs.js'\nimport { commitmentsToVersionedHashes } from '../../utils/blob/commitmentsToVersionedHashes.js'\nimport { toBlobSidecars } from '../../utils/blob/toBlobSidecars.js'\nimport type { FormattedTransactionRequest } from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { LruMap } from '../../utils/lru.js'\nimport type { NonceManager } from '../../utils/nonceManager.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport {\n type GetTransactionType,\n getTransactionType,\n} from '../../utils/transaction/getTransactionType.js'\nimport {\n type FillTransactionErrorType,\n type FillTransactionParameters,\n fillTransaction,\n} from '../public/fillTransaction.js'\nimport { getChainId as getChainId_ } from '../public/getChainId.js'\n\nexport const defaultParameters = [\n 'blobVersionedHashes',\n 'chainId',\n 'fees',\n 'gas',\n 'nonce',\n 'type',\n] as const\n\n/** @internal */\nexport const eip1559NetworkCache = /*#__PURE__*/ new Map()\n\n/** @internal */\nexport const supportsFillTransaction = /*#__PURE__*/ new LruMap(128)\n\nexport type PrepareTransactionRequestParameterType =\n | 'blobVersionedHashes'\n | 'chainId'\n | 'fees'\n | 'gas'\n | 'nonce'\n | 'sidecars'\n | 'type'\ntype ParameterTypeToParameters<\n parameterType extends PrepareTransactionRequestParameterType,\n> = parameterType extends 'fees'\n ? 'maxFeePerGas' | 'maxPriorityFeePerGas' | 'gasPrice'\n : parameterType\n\nexport type PrepareTransactionRequestRequest<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain,\n> = UnionOmit, 'from'> &\n GetTransactionRequestKzgParameter & {\n /**\n * Nonce manager to use for the transaction request.\n */\n nonceManager?: NonceManager | undefined\n /**\n * Parameters to prepare for the transaction request.\n *\n * @default ['blobVersionedHashes', 'chainId', 'fees', 'gas', 'nonce', 'type']\n */\n parameters?: readonly PrepareTransactionRequestParameterType[] | undefined\n }\n\nexport type PrepareTransactionRequestParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n > = PrepareTransactionRequestRequest,\n> = request &\n GetAccountParameter &\n GetChainParameter &\n GetTransactionRequestKzgParameter & { chainId?: number | undefined }\n\nexport type PrepareTransactionRequestReturnType<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n > = PrepareTransactionRequestRequest,\n ///\n _derivedAccount extends Account | Address | undefined = DeriveAccount<\n account,\n accountOverride\n >,\n _derivedChain extends Chain | undefined = DeriveChain,\n _transactionType = request['type'] extends string | undefined\n ? request['type']\n : GetTransactionType extends 'legacy'\n ? unknown\n : GetTransactionType,\n _transactionRequest extends TransactionRequest =\n | (_transactionType extends 'legacy' ? TransactionRequestLegacy : never)\n | (_transactionType extends 'eip1559' ? TransactionRequestEIP1559 : never)\n | (_transactionType extends 'eip2930' ? TransactionRequestEIP2930 : never)\n | (_transactionType extends 'eip4844' ? TransactionRequestEIP4844 : never)\n | (_transactionType extends 'eip7702' ? TransactionRequestEIP7702 : never),\n> = Prettify<\n UnionRequiredBy<\n Extract<\n UnionOmit, 'from'> &\n (_derivedChain extends Chain\n ? { chain: _derivedChain }\n : { chain?: undefined }) &\n (_derivedAccount extends Account\n ? { account: _derivedAccount; from: Address }\n : { account?: undefined; from?: undefined }),\n IsNever<_transactionRequest> extends true\n ? unknown\n : ExactPartial<_transactionRequest>\n > & { chainId?: number | undefined },\n ParameterTypeToParameters<\n request['parameters'] extends readonly PrepareTransactionRequestParameterType[]\n ? request['parameters'][number]\n : (typeof defaultParameters)[number]\n >\n > &\n (unknown extends request['kzg'] ? {} : Pick)\n>\n\nexport type PrepareTransactionRequestErrorType =\n | AccountNotFoundErrorType\n | AssertRequestErrorType\n | ParseAccountErrorType\n | GetBlockErrorType\n | GetTransactionCountErrorType\n | EstimateGasErrorType\n | EstimateFeesPerGasErrorType\n\n/**\n * Prepares a transaction request for signing.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest\n *\n * @param args - {@link PrepareTransactionRequestParameters}\n * @returns The transaction request. {@link PrepareTransactionRequestReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n */\nexport async function prepareTransactionRequest<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const request extends PrepareTransactionRequestRequest,\n accountOverride extends Account | Address | undefined = undefined,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client,\n args: PrepareTransactionRequestParameters<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >,\n): Promise<\n PrepareTransactionRequestReturnType<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >\n> {\n let request = args as PrepareTransactionRequestParameters\n\n request.account ??= client.account\n request.parameters ??= defaultParameters\n\n const {\n account: account_,\n chain = client.chain,\n nonceManager,\n parameters,\n } = request\n\n const prepareTransactionRequest = (() => {\n if (typeof chain?.prepareTransactionRequest === 'function')\n return {\n fn: chain.prepareTransactionRequest,\n runAt: ['beforeFillTransaction'],\n }\n if (Array.isArray(chain?.prepareTransactionRequest))\n return {\n fn: chain.prepareTransactionRequest[0],\n runAt: chain.prepareTransactionRequest[1].runAt,\n }\n return undefined\n })()\n\n let chainId: number | undefined\n async function getChainId(): Promise {\n if (chainId) return chainId\n if (typeof request.chainId !== 'undefined') return request.chainId\n if (chain) return chain.id\n const chainId_ = await getAction(client, getChainId_, 'getChainId')({})\n chainId = chainId_\n return chainId\n }\n\n const account = account_ ? parseAccount(account_) : account_\n\n let nonce = request.nonce\n if (\n parameters.includes('nonce') &&\n typeof nonce === 'undefined' &&\n account &&\n nonceManager\n ) {\n const chainId = await getChainId()\n nonce = await nonceManager.consume({\n address: account.address,\n chainId,\n client,\n })\n }\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('beforeFillTransaction')\n ) {\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'beforeFillTransaction',\n },\n )\n nonce ??= request.nonce\n }\n\n const attemptFill = (() => {\n // Do not attempt if blobs are provided.\n if (\n (parameters.includes('blobVersionedHashes') ||\n parameters.includes('sidecars')) &&\n request.kzg &&\n request.blobs\n )\n return false\n\n // Do not attempt if `eth_fillTransaction` is not supported.\n if (supportsFillTransaction.get(client.uid) === false) return false\n\n // Should attempt `eth_fillTransaction` if \"fees\" or \"gas\" are required to be populated,\n // otherwise, can just use the other individual calls.\n const shouldAttempt = ['fees', 'gas'].some((parameter) =>\n parameters.includes(parameter as PrepareTransactionRequestParameterType),\n )\n if (!shouldAttempt) return false\n\n // Check if `eth_fillTransaction` needs to be called.\n if (parameters.includes('chainId') && typeof request.chainId !== 'number')\n return true\n if (parameters.includes('nonce') && typeof nonce !== 'number') return true\n if (\n parameters.includes('fees') &&\n typeof request.gasPrice !== 'bigint' &&\n (typeof request.maxFeePerGas !== 'bigint' ||\n typeof (request as any).maxPriorityFeePerGas !== 'bigint')\n )\n return true\n if (parameters.includes('gas') && typeof request.gas !== 'bigint')\n return true\n return false\n })()\n\n const fillResult = attemptFill\n ? await getAction(\n client,\n fillTransaction,\n 'fillTransaction',\n )({ ...request, nonce } as FillTransactionParameters)\n .then((result) => {\n const {\n chainId,\n from,\n gas,\n gasPrice,\n nonce,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n type,\n ...rest\n } = result.transaction\n supportsFillTransaction.set(client.uid, true)\n return {\n ...request,\n ...(from ? { from } : {}),\n ...(type && !request.type ? { type } : {}),\n ...(typeof chainId !== 'undefined' ? { chainId } : {}),\n ...(typeof gas !== 'undefined' ? { gas } : {}),\n ...(typeof gasPrice !== 'undefined' ? { gasPrice } : {}),\n ...(typeof nonce !== 'undefined' ? { nonce } : {}),\n ...(typeof maxFeePerBlobGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxFeePerBlobGas }\n : {}),\n ...(typeof maxFeePerGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxFeePerGas }\n : {}),\n ...(typeof maxPriorityFeePerGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxPriorityFeePerGas }\n : {}),\n ...('nonceKey' in rest && typeof rest.nonceKey !== 'undefined'\n ? { nonceKey: rest.nonceKey }\n : {}),\n ...('keyAuthorization' in rest &&\n typeof rest.keyAuthorization !== 'undefined' &&\n rest.keyAuthorization !== null &&\n !('keyAuthorization' in request)\n ? { keyAuthorization: rest.keyAuthorization }\n : {}),\n }\n })\n .catch((e) => {\n const error = e as FillTransactionErrorType\n\n if (error.name !== 'TransactionExecutionError') return request\n\n const executionReverted = error.walk?.((e) => {\n const error = e as BaseError\n return error.name === 'ExecutionRevertedError'\n })\n if (executionReverted) throw e\n\n const unsupported = error.walk?.((e) => {\n const error = e as BaseError\n return (\n error.name === 'MethodNotFoundRpcError' ||\n error.name === 'MethodNotSupportedRpcError' ||\n error.message?.includes('eth_fillTransaction is not available')\n )\n })\n if (unsupported) supportsFillTransaction.set(client.uid, false)\n\n return request\n })\n : request\n\n nonce ??= fillResult.nonce\n\n request = {\n ...(fillResult as any),\n ...(account ? { from: account?.address } : {}),\n ...(nonce ? { nonce } : {}),\n }\n const { blobs, gas, kzg, type } = request\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('beforeFillParameters')\n ) {\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'beforeFillParameters',\n },\n )\n }\n\n let block: Block | undefined\n async function getBlock(): Promise {\n if (block) return block\n block = await getAction(\n client,\n getBlock_,\n 'getBlock',\n )({ blockTag: 'latest' })\n return block\n }\n\n if (\n parameters.includes('nonce') &&\n typeof nonce === 'undefined' &&\n account &&\n !nonceManager\n )\n request.nonce = await getAction(\n client,\n getTransactionCount,\n 'getTransactionCount',\n )({\n address: account.address,\n blockTag: 'pending',\n })\n\n if (\n (parameters.includes('blobVersionedHashes') ||\n parameters.includes('sidecars')) &&\n blobs &&\n kzg\n ) {\n const commitments = blobsToCommitments({ blobs, kzg })\n\n if (parameters.includes('blobVersionedHashes')) {\n const versionedHashes = commitmentsToVersionedHashes({\n commitments,\n to: 'hex',\n })\n request.blobVersionedHashes = versionedHashes\n }\n if (parameters.includes('sidecars')) {\n const proofs = blobsToProofs({ blobs, commitments, kzg })\n const sidecars = toBlobSidecars({\n blobs,\n commitments,\n proofs,\n to: 'hex',\n })\n request.sidecars = sidecars\n }\n }\n\n if (parameters.includes('chainId')) request.chainId = await getChainId()\n\n if (\n (parameters.includes('fees') || parameters.includes('type')) &&\n typeof type === 'undefined'\n ) {\n try {\n request.type = getTransactionType(\n request as TransactionSerializable,\n ) as any\n } catch {\n let isEip1559Network = eip1559NetworkCache.get(client.uid)\n if (typeof isEip1559Network === 'undefined') {\n const block = await getBlock()\n isEip1559Network = typeof block?.baseFeePerGas === 'bigint'\n eip1559NetworkCache.set(client.uid, isEip1559Network)\n }\n request.type = isEip1559Network ? 'eip1559' : 'legacy'\n }\n }\n\n if (parameters.includes('fees')) {\n // TODO(4844): derive blob base fees once https://github.com/ethereum/execution-apis/pull/486 is merged.\n\n if (request.type !== 'legacy' && request.type !== 'eip2930') {\n // EIP-1559 fees\n if (\n typeof request.maxFeePerGas === 'undefined' ||\n typeof request.maxPriorityFeePerGas === 'undefined'\n ) {\n const block = await getBlock()\n const { maxFeePerGas, maxPriorityFeePerGas } =\n await internal_estimateFeesPerGas(client, {\n block: block as Block,\n chain,\n request: request as PrepareTransactionRequestParameters,\n })\n\n if (\n typeof request.maxPriorityFeePerGas === 'undefined' &&\n request.maxFeePerGas &&\n request.maxFeePerGas < maxPriorityFeePerGas\n )\n throw new MaxFeePerGasTooLowError({\n maxPriorityFeePerGas,\n })\n\n request.maxPriorityFeePerGas = maxPriorityFeePerGas\n request.maxFeePerGas = maxFeePerGas\n }\n } else {\n // Legacy fees\n if (\n typeof request.maxFeePerGas !== 'undefined' ||\n typeof request.maxPriorityFeePerGas !== 'undefined'\n )\n throw new Eip1559FeesNotSupportedError()\n\n if (typeof request.gasPrice === 'undefined') {\n const block = await getBlock()\n const { gasPrice: gasPrice_ } = await internal_estimateFeesPerGas(\n client,\n {\n block: block as Block,\n chain,\n request: request as PrepareTransactionRequestParameters,\n type: 'legacy',\n },\n )\n request.gasPrice = gasPrice_\n }\n }\n }\n\n if (parameters.includes('gas') && typeof gas === 'undefined')\n request.gas = await getAction(\n client,\n estimateGas,\n 'estimateGas',\n )({\n ...request,\n account,\n prepare: account?.type === 'local' ? [] : ['blobVersionedHashes'],\n } as EstimateGasParameters)\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('afterFillParameters')\n )\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'afterFillParameters',\n },\n )\n\n assertRequest(request as AssertRequestParameters)\n\n delete request.parameters\n\n return request as any\n}\n","import { formatGwei } from '../utils/unit/formatGwei.js'\nimport { BaseError } from './base.js'\n\nexport type BaseFeeScalarErrorType = BaseFeeScalarError & {\n name: 'BaseFeeScalarError'\n}\nexport class BaseFeeScalarError extends BaseError {\n constructor() {\n super('`baseFeeMultiplier` must be greater than 1.', {\n name: 'BaseFeeScalarError',\n })\n }\n}\n\nexport type Eip1559FeesNotSupportedErrorType = Eip1559FeesNotSupportedError & {\n name: 'Eip1559FeesNotSupportedError'\n}\nexport class Eip1559FeesNotSupportedError extends BaseError {\n constructor() {\n super('Chain does not support EIP-1559 fees.', {\n name: 'Eip1559FeesNotSupportedError',\n })\n }\n}\n\nexport type MaxFeePerGasTooLowErrorType = MaxFeePerGasTooLowError & {\n name: 'MaxFeePerGasTooLowError'\n}\nexport class MaxFeePerGasTooLowError extends BaseError {\n constructor({ maxPriorityFeePerGas }: { maxPriorityFeePerGas: bigint }) {\n super(\n `\\`maxFeePerGas\\` cannot be less than the \\`maxPriorityFeePerGas\\` (${formatGwei(\n maxPriorityFeePerGas,\n )} gwei).`,\n { name: 'MaxFeePerGasTooLowError' },\n )\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n} from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n ChainFeesFnParameters,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToBigIntErrorType,\n hexToBigInt,\n} from '../../utils/encoding/fromHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { PrepareTransactionRequestParameters } from '../wallet/prepareTransactionRequest.js'\nimport { type GetBlockErrorType, getBlock } from './getBlock.js'\nimport { type GetGasPriceErrorType, getGasPrice } from './getGasPrice.js'\n\nexport type EstimateMaxPriorityFeePerGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n> = GetChainParameter\n\nexport type EstimateMaxPriorityFeePerGasReturnType = bigint\n\nexport type EstimateMaxPriorityFeePerGasErrorType =\n | GetBlockErrorType\n | HexToBigIntErrorType\n | RequestErrorType\n | GetBlockErrorType\n | GetGasPriceErrorType\n | Eip1559FeesNotSupportedErrorType\n | ErrorType\n\n/**\n * Returns an estimate for the max priority fee per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.defaultPriorityFee`](/docs/clients/chains#fees-defaultpriorityfee) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas\n *\n * @param client - Client to use\n * @returns An estimate (in wei) for the max priority fee per gas. {@link EstimateMaxPriorityFeePerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateMaxPriorityFeePerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateMaxPriorityFeePerGas(client)\n * // 10000000n\n */\nexport async function estimateMaxPriorityFeePerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n>(\n client: Client,\n args?:\n | EstimateMaxPriorityFeePerGasParameters\n | undefined,\n): Promise {\n return internal_estimateMaxPriorityFeePerGas(client, args as any)\n}\n\nexport async function internal_estimateMaxPriorityFeePerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n>(\n client: Client,\n args: EstimateMaxPriorityFeePerGasParameters & {\n block?: Block | undefined\n request?:\n | PrepareTransactionRequestParameters<\n chain,\n Account | undefined,\n chainOverride\n >\n | undefined\n },\n): Promise {\n const { block: block_, chain = client.chain, request } = args || {}\n\n try {\n const maxPriorityFeePerGas =\n chain?.fees?.maxPriorityFeePerGas ?? chain?.fees?.defaultPriorityFee\n\n if (typeof maxPriorityFeePerGas === 'function') {\n const block =\n block_ || (await getAction(client, getBlock, 'getBlock')({}))\n const maxPriorityFeePerGas_ = await maxPriorityFeePerGas({\n block,\n client,\n request,\n } as ChainFeesFnParameters)\n if (maxPriorityFeePerGas_ === null) throw new Error()\n return maxPriorityFeePerGas_\n }\n\n if (typeof maxPriorityFeePerGas !== 'undefined') return maxPriorityFeePerGas\n\n const maxPriorityFeePerGasHex = await client.request({\n method: 'eth_maxPriorityFeePerGas',\n })\n return hexToBigInt(maxPriorityFeePerGasHex)\n } catch {\n // If the RPC Provider does not support `eth_maxPriorityFeePerGas`\n // fall back to calculating it manually via `gasPrice - baseFeePerGas`.\n // See: https://github.com/ethereum/pm/issues/328#:~:text=eth_maxPriorityFeePerGas%20after%20London%20will%20effectively%20return%20eth_gasPrice%20%2D%20baseFee\n const [block, gasPrice] = await Promise.all([\n block_\n ? Promise.resolve(block_)\n : getAction(client, getBlock, 'getBlock')({}),\n getAction(client, getGasPrice, 'getGasPrice')({}),\n ])\n\n if (typeof block.baseFeePerGas !== 'bigint')\n throw new Eip1559FeesNotSupportedError()\n\n const maxPriorityFeePerGas = gasPrice - block.baseFeePerGas\n\n if (maxPriorityFeePerGas < 0n) return 0n\n return maxPriorityFeePerGas\n }\n}\n","import type { Hash } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type BlockNotFoundErrorType = BlockNotFoundError & {\n name: 'BlockNotFoundError'\n}\nexport class BlockNotFoundError extends BaseError {\n constructor({\n blockHash,\n blockNumber,\n }: {\n blockHash?: Hash | undefined\n blockNumber?: bigint | undefined\n }) {\n let identifier = 'Block'\n if (blockHash) identifier = `Block at hash \"${blockHash}\"`\n if (blockNumber) identifier = `Block at number \"${blockNumber}\"`\n super(`${identifier} could not be found.`, { name: 'BlockNotFoundError' })\n }\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n BlockNotFoundError,\n type BlockNotFoundErrorType,\n} from '../../errors/block.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcBlock } from '../../types/rpc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormattedBlock,\n formatBlock,\n} from '../../utils/formatters/block.js'\n\nexport type GetBlockParameters<\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = {\n /** Whether or not to include transaction data in the response. */\n includeTransactions?: includeTransactions | undefined\n} & (\n | {\n /** Hash of the block. */\n blockHash?: Hash | undefined\n blockNumber?: undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n blockNumber?: undefined\n /**\n * The block tag.\n * @default 'latest'\n */\n blockTag?: blockTag | BlockTag | undefined\n }\n)\n\nexport type GetBlockReturnType<\n chain extends Chain | undefined = undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = Prettify>\n\nexport type GetBlockErrorType =\n | BlockNotFoundErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns information about a block at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlock\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`.\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockParameters}\n * @returns Information about the block. {@link GetBlockReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlock } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await getBlock(client)\n */\nexport async function getBlock<\n chain extends Chain | undefined,\n account extends Account | undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client,\n {\n blockHash,\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n includeTransactions: includeTransactions_,\n }: GetBlockParameters = {},\n): Promise> {\n const includeTransactions = includeTransactions_ ?? false\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let block: RpcBlock | null = null\n if (blockHash) {\n block = await client.request(\n {\n method: 'eth_getBlockByHash',\n params: [blockHash, includeTransactions],\n },\n { dedupe: true },\n )\n } else {\n block = await client.request(\n {\n method: 'eth_getBlockByNumber',\n params: [blockNumberHex || blockTag, includeTransactions],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n }\n\n if (!block) throw new BlockNotFoundError({ blockHash, blockNumber })\n\n const format = client.chain?.formatters?.block?.format || formatBlock\n return format(block, 'getBlock')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Block, BlockTag } from '../../types/block.js'\nimport type {\n Chain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcBlock } from '../../types/rpc.js'\nimport type { ExactPartial, Prettify } from '../../types/utils.js'\n\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\nimport { type FormattedTransaction, formatTransaction } from './transaction.js'\n\ntype BlockPendingDependencies = 'hash' | 'logsBloom' | 'nonce' | 'number'\n\nexport type FormattedBlock<\n chain extends Chain | undefined = undefined,\n includeTransactions extends boolean = boolean,\n blockTag extends BlockTag = BlockTag,\n _FormatterReturnType = ExtractChainFormatterReturnType<\n chain,\n 'block',\n Block\n >,\n _ExcludedPendingDependencies extends string = BlockPendingDependencies &\n ExtractChainFormatterExclude,\n _Formatted = Omit<_FormatterReturnType, BlockPendingDependencies> & {\n [_key in _ExcludedPendingDependencies]: never\n } & Pick<\n Block,\n BlockPendingDependencies\n >,\n _Transactions = includeTransactions extends true\n ? Prettify>[]\n : Hash[],\n> = Omit<_Formatted, 'transactions'> & {\n transactions: _Transactions\n}\n\nexport type FormatBlockErrorType = ErrorType\n\nexport function formatBlock(\n block: ExactPartial,\n _?: string | undefined,\n) {\n const transactions = (block.transactions ?? []).map((transaction) => {\n if (typeof transaction === 'string') return transaction\n return formatTransaction(transaction)\n })\n return {\n ...block,\n baseFeePerGas: block.baseFeePerGas ? BigInt(block.baseFeePerGas) : null,\n blobGasUsed: block.blobGasUsed ? BigInt(block.blobGasUsed) : undefined,\n difficulty: block.difficulty ? BigInt(block.difficulty) : undefined,\n excessBlobGas: block.excessBlobGas\n ? BigInt(block.excessBlobGas)\n : undefined,\n gasLimit: block.gasLimit ? BigInt(block.gasLimit) : undefined,\n gasUsed: block.gasUsed ? BigInt(block.gasUsed) : undefined,\n hash: block.hash ? block.hash : null,\n logsBloom: block.logsBloom ? block.logsBloom : null,\n nonce: block.nonce ? block.nonce : null,\n number: block.number ? BigInt(block.number) : null,\n size: block.size ? BigInt(block.size) : undefined,\n timestamp: block.timestamp ? BigInt(block.timestamp) : undefined,\n transactions,\n totalDifficulty: block.totalDifficulty\n ? BigInt(block.totalDifficulty)\n : null,\n } as Block\n}\n\nexport type DefineBlockErrorType = DefineFormatterErrorType | ErrorType\n\nexport const defineBlock = /*#__PURE__*/ defineFormatter('block', formatBlock)\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { SignedAuthorizationList } from '../../types/authorization.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type {\n Chain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RpcAuthorizationList, RpcTransaction } from '../../types/rpc.js'\nimport type { Transaction, TransactionType } from '../../types/transaction.js'\nimport type { ExactPartial, UnionLooseOmit } from '../../types/utils.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\n\ntype TransactionPendingDependencies =\n | 'blockHash'\n | 'blockNumber'\n | 'transactionIndex'\n\nexport type FormattedTransaction<\n chain extends Chain | undefined = undefined,\n blockTag extends BlockTag = BlockTag,\n _FormatterReturnType = ExtractChainFormatterReturnType<\n chain,\n 'transaction',\n Transaction\n >,\n _ExcludedPendingDependencies extends string = TransactionPendingDependencies &\n ExtractChainFormatterExclude,\n> = UnionLooseOmit<_FormatterReturnType, TransactionPendingDependencies> & {\n [_K in _ExcludedPendingDependencies]: never\n} & Pick<\n Transaction,\n TransactionPendingDependencies\n >\n\nexport const transactionType = {\n '0x0': 'legacy',\n '0x1': 'eip2930',\n '0x2': 'eip1559',\n '0x3': 'eip4844',\n '0x4': 'eip7702',\n} as const satisfies Record\n\nexport type FormatTransactionErrorType = ErrorType\n\nexport function formatTransaction(\n transaction: ExactPartial,\n _?: string | undefined,\n) {\n const transaction_ = {\n ...transaction,\n blockHash: transaction.blockHash ? transaction.blockHash : null,\n blockNumber: transaction.blockNumber\n ? BigInt(transaction.blockNumber)\n : null,\n chainId: transaction.chainId ? hexToNumber(transaction.chainId) : undefined,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n gasPrice: transaction.gasPrice ? BigInt(transaction.gasPrice) : undefined,\n maxFeePerBlobGas: transaction.maxFeePerBlobGas\n ? BigInt(transaction.maxFeePerBlobGas)\n : undefined,\n maxFeePerGas: transaction.maxFeePerGas\n ? BigInt(transaction.maxFeePerGas)\n : undefined,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n ? BigInt(transaction.maxPriorityFeePerGas)\n : undefined,\n nonce: transaction.nonce ? hexToNumber(transaction.nonce) : undefined,\n to: transaction.to ? transaction.to : null,\n transactionIndex: transaction.transactionIndex\n ? Number(transaction.transactionIndex)\n : null,\n type: transaction.type\n ? (transactionType as any)[transaction.type]\n : undefined,\n typeHex: transaction.type ? transaction.type : undefined,\n value: transaction.value ? BigInt(transaction.value) : undefined,\n v: transaction.v ? BigInt(transaction.v) : undefined,\n } as Transaction\n\n if (transaction.authorizationList)\n transaction_.authorizationList = formatAuthorizationList(\n transaction.authorizationList,\n )\n\n transaction_.yParity = (() => {\n // If `yParity` is provided, we will use it.\n if (transaction.yParity) return Number(transaction.yParity)\n\n // If no `yParity` provided, try derive from `v`.\n if (typeof transaction_.v === 'bigint') {\n if (transaction_.v === 0n || transaction_.v === 27n) return 0\n if (transaction_.v === 1n || transaction_.v === 28n) return 1\n if (transaction_.v >= 35n) return transaction_.v % 2n === 0n ? 1 : 0\n }\n\n return undefined\n })()\n\n if (transaction_.type === 'legacy') {\n delete transaction_.accessList\n delete transaction_.maxFeePerBlobGas\n delete transaction_.maxFeePerGas\n delete transaction_.maxPriorityFeePerGas\n delete transaction_.yParity\n }\n if (transaction_.type === 'eip2930') {\n delete transaction_.maxFeePerBlobGas\n delete transaction_.maxFeePerGas\n delete transaction_.maxPriorityFeePerGas\n }\n if (transaction_.type === 'eip1559') delete transaction_.maxFeePerBlobGas\n\n return transaction_\n}\n\nexport type DefineTransactionErrorType = DefineFormatterErrorType | ErrorType\n\nexport const defineTransaction = /*#__PURE__*/ defineFormatter(\n 'transaction',\n formatTransaction,\n)\n\n//////////////////////////////////////////////////////////////////////////////\n\nfunction formatAuthorizationList(\n authorizationList: RpcAuthorizationList,\n): SignedAuthorizationList {\n return authorizationList.map((authorization) => ({\n address: (authorization as any).address,\n chainId: Number(authorization.chainId),\n nonce: Number(authorization.nonce),\n r: authorization.r,\n s: authorization.s,\n yParity: Number(authorization.yParity),\n })) as SignedAuthorizationList\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type GetGasPriceReturnType = bigint\n\nexport type GetGasPriceErrorType = RequestErrorType | ErrorType\n\n/**\n * Returns the current price of gas (in wei).\n *\n * - Docs: https://viem.sh/docs/actions/public/getGasPrice\n * - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice)\n *\n * @param client - Client to use\n * @returns The gas price (in wei). {@link GetGasPriceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getGasPrice } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasPrice = await getGasPrice(client)\n */\nexport async function getGasPrice<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client): Promise {\n const gasPrice = await client.request({\n method: 'eth_gasPrice',\n })\n return BigInt(gasPrice)\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n BaseFeeScalarError,\n type BaseFeeScalarErrorType,\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n} from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n ChainEstimateFeesPerGasFnParameters,\n ChainFeesFnParameters,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type {\n FeeValuesEIP1559,\n FeeValuesLegacy,\n FeeValuesType,\n} from '../../types/fee.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { PrepareTransactionRequestParameters } from '../wallet/prepareTransactionRequest.js'\nimport {\n type EstimateMaxPriorityFeePerGasErrorType,\n internal_estimateMaxPriorityFeePerGas,\n} from './estimateMaxPriorityFeePerGas.js'\nimport { getBlock } from './getBlock.js'\nimport { type GetGasPriceErrorType, getGasPrice } from './getGasPrice.js'\n\nexport type EstimateFeesPerGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n type extends FeeValuesType = FeeValuesType,\n> = {\n /**\n * The type of fee values to return.\n *\n * - `legacy`: Returns the legacy gas price.\n * - `eip1559`: Returns the max fee per gas and max priority fee per gas.\n *\n * @default 'eip1559'\n */\n type?: type | FeeValuesType | undefined\n} & GetChainParameter\n\nexport type EstimateFeesPerGasReturnType<\n type extends FeeValuesType = FeeValuesType,\n> =\n | (type extends 'legacy' ? FeeValuesLegacy : never)\n | (type extends 'eip1559' ? FeeValuesEIP1559 : never)\n\nexport type EstimateFeesPerGasErrorType =\n | BaseFeeScalarErrorType\n | EstimateMaxPriorityFeePerGasErrorType\n | GetGasPriceErrorType\n | Eip1559FeesNotSupportedErrorType\n | ErrorType\n\n/**\n * Returns an estimate for the fees per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.estimateFeesPerGas`](/docs/clients/chains#fees-estimatefeespergas) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateFeesPerGasParameters}\n * @returns An estimate (in wei) for the fees per gas. {@link EstimateFeesPerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateFeesPerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateFeesPerGas(client)\n * // { maxFeePerGas: ..., maxPriorityFeePerGas: ... }\n */\nexport async function estimateFeesPerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n type extends FeeValuesType = 'eip1559',\n>(\n client: Client,\n args?: EstimateFeesPerGasParameters | undefined,\n): Promise> {\n return internal_estimateFeesPerGas(client, args as any)\n}\n\nexport async function internal_estimateFeesPerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n type extends FeeValuesType = 'eip1559',\n>(\n client: Client,\n args: EstimateFeesPerGasParameters & {\n block?: Block | undefined\n request?: PrepareTransactionRequestParameters | undefined\n },\n): Promise> {\n const {\n block: block_,\n chain = client.chain,\n request,\n type = 'eip1559',\n } = args || {}\n\n const baseFeeMultiplier = await (async () => {\n if (typeof chain?.fees?.baseFeeMultiplier === 'function')\n return chain.fees.baseFeeMultiplier({\n block: block_ as Block,\n client,\n request,\n } as ChainFeesFnParameters)\n return chain?.fees?.baseFeeMultiplier ?? 1.2\n })()\n if (baseFeeMultiplier < 1) throw new BaseFeeScalarError()\n\n const decimals = baseFeeMultiplier.toString().split('.')[1]?.length ?? 0\n const denominator = 10 ** decimals\n const multiply = (base: bigint) =>\n (base * BigInt(Math.ceil(baseFeeMultiplier * denominator))) /\n BigInt(denominator)\n\n const block = block_\n ? block_\n : await getAction(client, getBlock, 'getBlock')({})\n\n if (typeof chain?.fees?.estimateFeesPerGas === 'function') {\n const fees = (await chain.fees.estimateFeesPerGas({\n block: block_ as Block,\n client,\n multiply,\n request,\n type,\n } as ChainEstimateFeesPerGasFnParameters)) as unknown as EstimateFeesPerGasReturnType\n\n if (fees !== null) return fees\n }\n\n if (type === 'eip1559') {\n if (typeof block.baseFeePerGas !== 'bigint')\n throw new Eip1559FeesNotSupportedError()\n\n const maxPriorityFeePerGas =\n typeof request?.maxPriorityFeePerGas === 'bigint'\n ? request.maxPriorityFeePerGas\n : await internal_estimateMaxPriorityFeePerGas(\n client as Client,\n {\n block: block as Block,\n chain,\n request,\n },\n )\n\n const baseFeePerGas = multiply(block.baseFeePerGas)\n const maxFeePerGas =\n request?.maxFeePerGas ?? baseFeePerGas + maxPriorityFeePerGas\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as EstimateFeesPerGasReturnType\n }\n\n const gasPrice =\n request?.gasPrice ??\n multiply(await getAction(client, getGasPrice, 'getGasPrice')({}))\n return {\n gasPrice,\n } as EstimateFeesPerGasReturnType\n}\n","import type { Address } from 'abitype'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { BaseFeeScalarError } from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account, GetAccountParameter } from '../../types/account.js'\nimport type {\n Chain,\n ChainFeesFnParameters,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type GetTransactionErrorReturnType,\n getTransactionError,\n} from '../../utils/errors/getTransactionError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransaction,\n formatTransaction,\n} from '../../utils/formatters/transaction.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { NonceManager } from '../../utils/nonceManager.js'\nimport { assertRequest } from '../../utils/transaction/assertRequest.js'\nimport { getBlock } from './getBlock.js'\nimport { getChainId as getChainId_ } from './getChainId.js'\n\nexport type FillTransactionParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain,\n> = UnionOmit, 'from'> &\n GetAccountParameter &\n GetChainParameter & {\n /**\n * Nonce manager to use for the transaction request.\n */\n nonceManager?: NonceManager | undefined\n }\n\nexport type FillTransactionReturnType<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain,\n> = {\n raw: Hex\n transaction: FormattedTransaction<_derivedChain>\n}\n\nexport type FillTransactionErrorType =\n | GetTransactionErrorReturnType\n | ErrorType\n\n/**\n * Fills a transaction request with the necessary fields to be signed over.\n *\n * - Docs: https://viem.sh/docs/actions/public/fillTransaction\n *\n * @param client - Client to use\n * @param parameters - {@link FillTransactionParameters}\n * @returns The filled transaction. {@link FillTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { fillTransaction } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await fillTransaction(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\nexport async function fillTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | undefined = undefined,\n>(\n client: Client,\n parameters: FillTransactionParameters<\n chain,\n account,\n chainOverride,\n accountOverride\n >,\n): Promise> {\n const {\n account = client.account,\n accessList,\n authorizationList,\n chain = client.chain,\n blobVersionedHashes,\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: nonce_,\n nonceManager,\n to,\n type,\n value,\n ...rest\n } = parameters\n\n const nonce = await (async () => {\n if (!account) return nonce_\n if (!nonceManager) return nonce_\n if (typeof nonce_ !== 'undefined') return nonce_\n const account_ = parseAccount(account)\n const chainId = chain\n ? chain.id\n : await getAction(client, getChainId_, 'getChainId')({})\n return await nonceManager.consume({\n address: account_.address,\n chainId,\n client,\n })\n })()\n\n assertRequest(parameters)\n\n const chainFormat = chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account: account ? parseAccount(account) : undefined,\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n type,\n value,\n } as TransactionRequest,\n 'fillTransaction',\n )\n\n try {\n const response = await client.request({\n method: 'eth_fillTransaction',\n params: [request],\n })\n const format = chain?.formatters?.transaction?.format || formatTransaction\n\n const transaction = format(response.tx)\n\n // Remove unnecessary fields.\n delete transaction.blockHash\n delete transaction.blockNumber\n delete transaction.r\n delete transaction.s\n delete transaction.transactionIndex\n delete transaction.v\n delete transaction.yParity\n\n // Rewrite fields.\n transaction.data = transaction.input\n\n // Preference supplied fees (some nodes do not take these preferences).\n if (transaction.gas) transaction.gas = parameters.gas ?? transaction.gas\n if (transaction.gasPrice)\n transaction.gasPrice = parameters.gasPrice ?? transaction.gasPrice\n if (transaction.maxFeePerBlobGas)\n transaction.maxFeePerBlobGas =\n parameters.maxFeePerBlobGas ?? transaction.maxFeePerBlobGas\n if (transaction.maxFeePerGas)\n transaction.maxFeePerGas =\n parameters.maxFeePerGas ?? transaction.maxFeePerGas\n if (transaction.maxPriorityFeePerGas)\n transaction.maxPriorityFeePerGas =\n parameters.maxPriorityFeePerGas ?? transaction.maxPriorityFeePerGas\n if (transaction.nonce)\n transaction.nonce = parameters.nonce ?? transaction.nonce\n\n // Build fee multiplier function.\n const feeMultiplier = await (async () => {\n if (typeof chain?.fees?.baseFeeMultiplier === 'function') {\n const block = await getAction(client, getBlock, 'getBlock')({})\n return chain.fees.baseFeeMultiplier({\n block,\n client,\n request: parameters,\n } as ChainFeesFnParameters)\n }\n return chain?.fees?.baseFeeMultiplier ?? 1.2\n })()\n if (feeMultiplier < 1) throw new BaseFeeScalarError()\n\n const decimals = feeMultiplier.toString().split('.')[1]?.length ?? 0\n const denominator = 10 ** decimals\n const multiplyFee = (base: bigint) =>\n (base * BigInt(Math.ceil(feeMultiplier * denominator))) /\n BigInt(denominator)\n\n // Apply fee multiplier.\n if (transaction.maxFeePerGas && !parameters.maxFeePerGas)\n transaction.maxFeePerGas = multiplyFee(transaction.maxFeePerGas)\n if (transaction.gasPrice && !parameters.gasPrice)\n transaction.gasPrice = multiplyFee(transaction.gasPrice)\n\n return {\n raw: response.raw,\n transaction: {\n from: request.from,\n ...transaction,\n },\n }\n } catch (err) {\n throw getTransactionError(\n err as BaseError,\n {\n ...parameters,\n chain: client.chain,\n } as never,\n )\n }\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport {\n TransactionExecutionError,\n type TransactionExecutionErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetTransactionErrorParameters = Omit<\n SendTransactionParameters,\n 'account' | 'chain'\n> & {\n account: Account | null\n chain?: Chain | undefined\n docsPath?: string | undefined\n}\n\nexport type GetTransactionErrorReturnType = Omit<\n TransactionExecutionErrorType,\n 'cause'\n> & { cause: cause | GetNodeErrorReturnType }\n\nexport function getTransactionError>(\n err: err,\n { docsPath, ...args }: GetTransactionErrorParameters,\n): GetTransactionErrorReturnType {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new TransactionExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetTransactionErrorReturnType\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\n\nexport type GetChainIdReturnType = number\n\nexport type GetChainIdErrorType =\n | HexToNumberErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the chain ID associated with the current network.\n *\n * - Docs: https://viem.sh/docs/actions/public/getChainId\n * - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid)\n *\n * @param client - Client to use\n * @returns The current chain ID. {@link GetChainIdReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getChainId } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const chainId = await getChainId(client)\n * // 1\n */\nexport async function getChainId<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client): Promise {\n const chainIdHex = await client.request(\n {\n method: 'eth_chainId',\n },\n { dedupe: true },\n )\n return hexToNumber(chainIdHex)\n}\n","import type { Abi, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n} from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash } from '../../types/misc.js'\nimport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n getAbiItem,\n} from '../../utils/abi/getAbiItem.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type GetLogsErrorType,\n type GetLogsParameters,\n getLogs,\n} from './getLogs.js'\n\nexport type GetContractEventsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined =\n | ContractEventName\n | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Contract ABI. */\n abi: abi\n args?:\n | ContractEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName\n >\n | undefined\n /** Contract event. */\n eventName?: eventName | ContractEventName | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | boolean | undefined\n} & (\n | {\n /** Block number or tag after which to include logs */\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /** Block number or tag before which to include logs */\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n blockHash?: undefined\n }\n | {\n fromBlock?: undefined\n toBlock?: undefined\n /** Hash of block to include logs from */\n blockHash?: Hash | undefined\n }\n)\n\nexport type GetContractEventsReturnType<\n abi extends Abi | readonly unknown[] = readonly unknown[],\n eventName extends ContractEventName | undefined =\n | ContractEventName\n | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n ///\n isPending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log[]\n\nexport type GetContractEventsErrorType =\n | GetAbiItemErrorType\n | GetLogsErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs emitted by a contract.\n *\n * - Docs: https://viem.sh/docs/contract/getContractEvents#getcontractevents\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetContractEventsParameters}\n * @returns A list of event logs. {@link GetContractEventsReturnType}\n *\n * @example\n * import { createClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getContractEvents } from 'viem/public'\n * import { wagmiAbi } from './abi'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await getContractEvents(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: wagmiAbi,\n * eventName: 'Transfer'\n * })\n */\nexport async function getContractEvents<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client,\n parameters: GetContractEventsParameters<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n GetContractEventsReturnType\n> {\n const {\n abi,\n address,\n args,\n blockHash,\n eventName,\n fromBlock,\n toBlock,\n strict,\n } = parameters\n const event = eventName\n ? getAbiItem({ abi, name: eventName } as GetAbiItemParameters)\n : undefined\n const events = !event\n ? (abi as Abi).filter((x) => x.type === 'event')\n : undefined\n return getAction(\n client,\n getLogs,\n 'getLogs',\n )({\n address,\n args,\n blockHash,\n event,\n events,\n fromBlock,\n toBlock,\n strict,\n } as {} as GetLogsParameters) as unknown as GetContractEventsReturnType<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","// TODO(v3): checksum address.\n\nimport type { Abi, AbiEvent, AbiEventParameter, Address } from 'abitype'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ContractEventName, GetEventArgs } from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport { isAddressEqual } from '../address/isAddressEqual.js'\nimport { toBytes } from '../encoding/toBytes.js'\nimport { formatLog } from '../formatters/log.js'\nimport { keccak256 } from '../hash/keccak256.js'\nimport { toEventSelector } from '../hash/toEventSelector.js'\nimport {\n type DecodeEventLogErrorType,\n decodeEventLog,\n} from './decodeEventLog.js'\n\nexport type ParseEventLogsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends\n | ContractEventName\n | ContractEventName[]\n | undefined = ContractEventName,\n strict extends boolean | undefined = boolean | undefined,\n ///\n allArgs = GetEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName,\n {\n EnableUnion: true\n IndexedOnly: false\n Required: false\n }\n >,\n> = {\n /** Contract ABI. */\n abi: abi\n /** Arguments for the event. */\n args?: allArgs | undefined\n /** Contract event. */\n eventName?:\n | eventName\n | ContractEventName\n | ContractEventName[]\n | undefined\n /** List of logs. */\n logs: (Log | RpcLog)[]\n strict?: strict | boolean | undefined\n}\n\nexport type ParseEventLogsReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends\n | ContractEventName\n | ContractEventName[]\n | undefined = ContractEventName,\n strict extends boolean | undefined = boolean | undefined,\n ///\n derivedEventName extends\n | ContractEventName\n | undefined = eventName extends ContractEventName[]\n ? eventName[number]\n : eventName,\n> = Log[]\n\nexport type ParseEventLogsErrorType = DecodeEventLogErrorType | ErrorType\n\n/**\n * Extracts & decodes logs matching the provided signature(s) (`abi` + optional `eventName`)\n * from a set of opaque logs.\n *\n * @param parameters - {@link ParseEventLogsParameters}\n * @returns The logs. {@link ParseEventLogsReturnType}\n *\n * @example\n * import { createClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { parseEventLogs } from 'viem/op-stack'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const receipt = await getTransactionReceipt(client, {\n * hash: '0xec23b2ba4bc59ba61554507c1b1bc91649e6586eb2dd00c728e8ed0db8bb37ea',\n * })\n *\n * const logs = parseEventLogs({ logs: receipt.logs })\n * // [{ args: { ... }, eventName: 'TransactionDeposited', ... }, ...]\n */\nexport function parseEventLogs<\n abi extends Abi | readonly unknown[],\n strict extends boolean | undefined = true,\n eventName extends\n | ContractEventName\n | ContractEventName[]\n | undefined = undefined,\n>(\n parameters: ParseEventLogsParameters,\n): ParseEventLogsReturnType {\n const { abi, args, logs, strict = true } = parameters\n\n const eventName = (() => {\n if (!parameters.eventName) return undefined\n if (Array.isArray(parameters.eventName)) return parameters.eventName\n return [parameters.eventName as string]\n })()\n\n const abiTopics = (abi as Abi)\n .filter((abiItem) => abiItem.type === 'event')\n .map((abiItem) => ({\n abi: abiItem,\n selector: toEventSelector(abiItem),\n }))\n\n return logs\n .map((log) => {\n // Normalize RpcLog (hex-encoded quantities) to Log (bigint/number).\n // When logs come directly from an RPC response (e.g. eth_getLogs),\n // fields like blockNumber are hex strings instead of bigints.\n const formattedLog =\n typeof log.blockNumber === 'string' ? formatLog(log as RpcLog) : log\n\n // Find all matching ABI items with the same selector.\n // Multiple events can share the same selector but differ in indexed parameters\n // (e.g., ERC20 vs ERC721 Transfer events).\n const abiItems = abiTopics.filter(\n (abiTopic) => formattedLog.topics[0] === abiTopic.selector,\n )\n if (abiItems.length === 0) return null\n\n // Try each matching ABI item until one successfully decodes.\n let event: { eventName: string; args: unknown } | undefined\n let abiItem: { abi: AbiEvent; selector: Address } | undefined\n\n for (const item of abiItems) {\n try {\n event = decodeEventLog({\n ...formattedLog,\n abi: [item.abi],\n strict: true,\n })\n abiItem = item\n break\n } catch {\n // Try next ABI item\n }\n }\n\n // If strict decoding failed for all, and we're in non-strict mode,\n // fall back to the first matching ABI item.\n if (!event && !strict) {\n abiItem = abiItems[0]\n try {\n event = decodeEventLog({\n data: formattedLog.data,\n topics: formattedLog.topics,\n abi: [abiItem.abi],\n strict: false,\n })\n } catch {\n // If decoding still fails, return partial log in non-strict mode.\n const isUnnamed = abiItem.abi.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n return {\n ...formattedLog,\n args: isUnnamed ? [] : {},\n eventName: abiItem.abi.name,\n }\n }\n }\n\n // If no event was found, return null.\n if (!event || !abiItem) return null\n\n // Check that the decoded event name matches the provided event name.\n if (eventName && !eventName.includes(event.eventName)) return null\n\n // Check that the decoded event args match the provided args.\n if (\n !includesArgs({\n args: event.args,\n inputs: abiItem.abi.inputs,\n matchArgs: args,\n })\n )\n return null\n\n return { ...event, ...formattedLog }\n })\n .filter(Boolean) as unknown as ParseEventLogsReturnType<\n abi,\n eventName,\n strict\n >\n}\n\nfunction includesArgs(parameters: {\n args: unknown\n inputs: AbiEvent['inputs']\n matchArgs: unknown\n}) {\n const { args, inputs, matchArgs } = parameters\n\n if (!matchArgs) return true\n if (!args) return false\n\n function isEqual(input: AbiEventParameter, value: unknown, arg: unknown) {\n try {\n if (input.type === 'address')\n return isAddressEqual(value as Address, arg as Address)\n if (input.type === 'string' || input.type === 'bytes')\n return keccak256(toBytes(value as string)) === arg\n return value === arg\n } catch {\n return false\n }\n }\n\n if (Array.isArray(args) && Array.isArray(matchArgs)) {\n return matchArgs.every((value, index) => {\n if (value === null || value === undefined) return true\n const input = inputs[index]\n if (!input) return false\n const value_ = Array.isArray(value) ? value : [value]\n return value_.some((value) => isEqual(input, value, args[index]))\n })\n }\n\n if (\n typeof args === 'object' &&\n !Array.isArray(args) &&\n typeof matchArgs === 'object' &&\n !Array.isArray(matchArgs)\n )\n return Object.entries(matchArgs).every(([key, value]) => {\n if (value === null || value === undefined) return true\n const input = inputs.find((input) => input.name === key)\n if (!input) return false\n const value_ = Array.isArray(value) ? value : [value]\n return value_.some((value) =>\n isEqual(input, value, (args as Record)[key]),\n )\n })\n\n return false\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Log } from '../../types/log.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport type { ExactPartial } from '../../types/utils.js'\n\nexport type FormatLogErrorType = ErrorType\n\nexport function formatLog(\n log: ExactPartial,\n {\n args,\n eventName,\n }: { args?: unknown | undefined; eventName?: string | undefined } = {},\n) {\n return {\n ...log,\n blockHash: log.blockHash ? log.blockHash : null,\n blockNumber: log.blockNumber ? BigInt(log.blockNumber) : null,\n blockTimestamp: log.blockTimestamp\n ? BigInt(log.blockTimestamp)\n : log.blockTimestamp === null\n ? null\n : undefined,\n logIndex: log.logIndex ? Number(log.logIndex) : null,\n transactionHash: log.transactionHash ? log.transactionHash : null,\n transactionIndex: log.transactionIndex\n ? Number(log.transactionIndex)\n : null,\n ...(eventName ? { args, eventName } : {}),\n } as Log\n}\n","import type { Abi, AbiParameter } from 'abitype'\n\nimport {\n AbiDecodingDataSizeTooSmallError,\n type AbiDecodingDataSizeTooSmallErrorType,\n AbiEventSignatureEmptyTopicsError,\n type AbiEventSignatureEmptyTopicsErrorType,\n AbiEventSignatureNotFoundError,\n type AbiEventSignatureNotFoundErrorType,\n DecodeLogDataMismatch,\n type DecodeLogDataMismatchErrorType,\n DecodeLogTopicsMismatch,\n type DecodeLogTopicsMismatchErrorType,\n} from '../../errors/abi.js'\nimport { PositionOutOfBoundsError } from '../../errors/cursor.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractEventArgsFromTopics,\n ContractEventName,\n EventDefinition,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n IsNarrowable,\n Prettify,\n UnionEvaluate,\n} from '../../types/utils.js'\nimport { size } from '../data/size.js'\nimport {\n type ToEventSelectorErrorType,\n toEventSelector,\n} from '../hash/toEventSelector.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\n\nexport type DecodeEventLogParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n> = {\n abi: abi\n data?: data | undefined\n eventName?: eventName | ContractEventName | undefined\n strict?: strict | boolean | undefined\n topics: [signature: Hex, ...args: topics] | []\n}\n\nexport type DecodeEventLogReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n ///\n allEventNames extends\n ContractEventName = eventName extends ContractEventName\n ? eventName\n : ContractEventName,\n> = IsNarrowable extends true\n ? {\n [name in allEventNames]: Prettify<\n {\n eventName: name\n } & UnionEvaluate<\n ContractEventArgsFromTopics extends infer allArgs\n ? topics extends readonly []\n ? data extends undefined\n ? { args?: undefined }\n : { args?: allArgs | undefined }\n : { args: allArgs }\n : never\n >\n >\n }[allEventNames]\n : {\n eventName: eventName\n args: readonly unknown[] | undefined\n }\n\nexport type DecodeEventLogErrorType =\n | AbiDecodingDataSizeTooSmallErrorType\n | AbiEventSignatureEmptyTopicsErrorType\n | AbiEventSignatureNotFoundErrorType\n | DecodeAbiParametersErrorType\n | DecodeLogTopicsMismatchErrorType\n | DecodeLogDataMismatchErrorType\n | FormatAbiItemErrorType\n | ToEventSelectorErrorType\n | ErrorType\n\nconst docsPath = '/docs/contract/decodeEventLog'\n\nexport function decodeEventLog<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n>(\n parameters: DecodeEventLogParameters,\n): DecodeEventLogReturnType {\n const {\n abi,\n data,\n strict: strict_,\n topics,\n } = parameters as DecodeEventLogParameters\n\n const strict = strict_ ?? true\n const [signature, ...argTopics] = topics\n if (!signature) throw new AbiEventSignatureEmptyTopicsError({ docsPath })\n\n const abiItem = abi.find(\n (x) =>\n x.type === 'event' &&\n signature === toEventSelector(formatAbiItem(x) as EventDefinition),\n )\n\n if (!(abiItem && 'name' in abiItem) || abiItem.type !== 'event')\n throw new AbiEventSignatureNotFoundError(signature, { docsPath })\n\n const { name, inputs } = abiItem\n const isUnnamed = inputs?.some((x) => !('name' in x && x.name))\n\n const args: any = isUnnamed ? [] : {}\n\n // Decode topics (indexed args).\n const indexedInputs = inputs\n .map((x, i) => [x, i] as const)\n .filter(([x]) => 'indexed' in x && x.indexed)\n\n const missingIndexedInputs: [AbiParameter, number][] = []\n\n for (let i = 0; i < indexedInputs.length; i++) {\n const [param, argIndex] = indexedInputs[i]\n const topic = argTopics[i]\n if (!topic) {\n if (strict)\n throw new DecodeLogTopicsMismatch({\n abiItem,\n param: param as AbiParameter & { indexed: boolean },\n })\n // Track missing indexed inputs to decode from data when strict is false\n missingIndexedInputs.push([param, argIndex])\n continue\n }\n args[isUnnamed ? argIndex : param.name || argIndex] = decodeTopic({\n param,\n value: topic,\n })\n }\n\n // Decode data (non-indexed args + missing indexed args when strict is false).\n const nonIndexedInputs = inputs.filter((x) => !('indexed' in x && x.indexed))\n\n // When strict is false, missing indexed inputs should be decoded from data\n const inputsToDecode = strict\n ? nonIndexedInputs\n : [...missingIndexedInputs.map(([param]) => param), ...nonIndexedInputs]\n\n if (inputsToDecode.length > 0) {\n if (data && data !== '0x') {\n try {\n const decodedData = decodeAbiParameters(\n inputsToDecode,\n data,\n ) as unknown[]\n if (decodedData) {\n let dataIndex = 0\n // First, assign missing indexed parameters (when strict is false)\n if (!strict) {\n for (const [param, argIndex] of missingIndexedInputs) {\n args[isUnnamed ? argIndex : param.name || argIndex] =\n decodedData[dataIndex++]\n }\n }\n // Then, assign non-indexed parameters\n if (isUnnamed) {\n for (let i = 0; i < inputs.length; i++)\n if (args[i] === undefined && dataIndex < decodedData.length)\n args[i] = decodedData[dataIndex++]\n } else\n for (let i = 0; i < nonIndexedInputs.length; i++)\n args[nonIndexedInputs[i].name!] = decodedData[dataIndex++]\n }\n } catch (err) {\n if (strict) {\n if (\n err instanceof AbiDecodingDataSizeTooSmallError ||\n err instanceof PositionOutOfBoundsError\n )\n throw new DecodeLogDataMismatch({\n abiItem,\n data: data,\n params: inputsToDecode,\n size: size(data),\n })\n throw err\n }\n }\n } else if (strict) {\n throw new DecodeLogDataMismatch({\n abiItem,\n data: '0x',\n params: inputsToDecode,\n size: 0,\n })\n }\n }\n\n return {\n eventName: name,\n args: Object.values(args).length > 0 ? args : undefined,\n } as unknown as DecodeEventLogReturnType\n}\n\nfunction decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {\n if (\n param.type === 'string' ||\n param.type === 'bytes' ||\n param.type === 'tuple' ||\n param.type.match(/^(.*)\\[(\\d+)?\\]$/)\n )\n return value\n const decodedArg = decodeAbiParameters([param], value) || []\n return decodedArg[0]\n}\n","import type { AbiEvent, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash, LogTopic } from '../../types/misc.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetLogsParameters<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n> = {\n /** Address or list of addresses from which logs originated */\n address?: Address | Address[] | undefined\n} & (\n | {\n event: abiEvent\n events?: undefined\n args?: MaybeExtractEventArgsFromAbi | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events: abiEvents\n args?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events?: undefined\n args?: undefined\n strict?: undefined\n }\n) &\n (\n | {\n /** Block number or tag after which to include logs */\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /** Block number or tag before which to include logs */\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n blockHash?: undefined\n }\n | {\n fromBlock?: undefined\n toBlock?: undefined\n /** Hash of block to include logs from */\n blockHash?: Hash | undefined\n }\n )\n\nexport type GetLogsReturnType<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n _pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log[]\n\nexport type GetLogsErrorType =\n | DecodeEventLogErrorType\n | EncodeEventTopicsErrorType\n | FormatLogErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs matching the provided parameters.\n *\n * - Docs: https://viem.sh/docs/actions/public/getLogs\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/logs_event-logs\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetLogsParameters}\n * @returns A list of event logs. {@link GetLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getLogs } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await getLogs(client)\n */\nexport async function getLogs<\n chain extends Chain | undefined,\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client,\n {\n address,\n blockHash,\n fromBlock,\n toBlock,\n event,\n events: events_,\n args,\n strict: strict_,\n }: GetLogsParameters = {},\n): Promise> {\n const strict = strict_ ?? false\n const events = events_ ?? (event ? [event] : undefined)\n\n let topics: LogTopic[] = []\n if (events) {\n const encoded = (events as AbiEvent[]).flatMap((event) =>\n encodeEventTopics({\n abi: [event],\n eventName: (event as AbiEvent).name,\n args: events_ ? undefined : args,\n } as EncodeEventTopicsParameters),\n )\n // TODO: Clean up type casting\n topics = [encoded as LogTopic]\n if (event) topics = topics[0] as LogTopic[]\n }\n\n let logs: RpcLog[]\n if (blockHash) {\n logs = await client.request({\n method: 'eth_getLogs',\n params: [{ address, topics, blockHash }],\n })\n } else {\n logs = await client.request({\n method: 'eth_getLogs',\n params: [\n {\n address,\n topics,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n },\n ],\n })\n }\n\n const formattedLogs = logs.map((log) => formatLog(log))\n if (!events)\n return formattedLogs as GetLogsReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: events,\n args: args as any,\n logs: formattedLogs,\n strict,\n }) as unknown as GetLogsReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Abi } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n} from '../../types/contract.js'\nimport type { UnionEvaluate } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\n\nimport { type CallErrorType, type CallParameters, call } from './call.js'\n\nexport type ReadContractParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'pure' | 'view'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'pure' | 'view',\n functionName\n > = ContractFunctionArgs,\n> = UnionEvaluate<\n Pick<\n CallParameters,\n | 'account'\n | 'authorizationList'\n | 'blockNumber'\n | 'blockOverrides'\n | 'blockTag'\n | 'factory'\n | 'factoryData'\n | 'stateOverride'\n >\n> &\n ContractFunctionParameters\n\nexport type ReadContractReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'pure' | 'view'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'pure' | 'view',\n functionName\n > = ContractFunctionArgs,\n> = ContractFunctionReturnType\n\nexport type ReadContractErrorType = GetContractErrorReturnType<\n CallErrorType | EncodeFunctionDataErrorType | DecodeFunctionResultErrorType\n>\n\n/**\n * Calls a read-only function on a contract, and returns the response.\n *\n * - Docs: https://viem.sh/docs/contract/readContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_reading-contracts\n *\n * A \"read-only\" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link ReadContractParameters}\n * @returns The response from the contract. Type is inferred. {@link ReadContractReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { readContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await readContract(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // 424122n\n */\nexport async function readContract<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs,\n>(\n client: Client,\n parameters: ReadContractParameters,\n): Promise> {\n const { abi, address, args, functionName, ...rest } =\n parameters as ReadContractParameters\n const calldata = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n try {\n const { data } = await getAction(\n client,\n call,\n 'call',\n )({\n ...(rest as CallParameters),\n data: calldata,\n to: address!,\n })\n return decodeFunctionResult({\n abi,\n args,\n functionName,\n data: data || '0x',\n }) as ReadContractReturnType\n } catch (error) {\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/readContract',\n functionName,\n })\n }\n}\n","import type { Abi, AbiFunction, AbiStateMutability, Address } from 'abitype'\n\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account, ParseAccount } from '../../types/account.js'\nimport type { Chain, DeriveChain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n ExtractAbiFunctionForArgs,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type {\n IsNarrowable,\n NoInfer,\n Prettify,\n UnionEvaluate,\n UnionOmit,\n} from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { WriteContractParameters } from '../wallet/writeContract.js'\nimport { type CallErrorType, type CallParameters, call } from './call.js'\n\nexport type GetMutabilityAwareValue<\n abi extends Abi | readonly unknown[],\n mutability extends AbiStateMutability = AbiStateMutability,\n functionName extends ContractFunctionName<\n abi,\n mutability\n > = ContractFunctionName,\n valueType = TransactionRequest['value'],\n args extends ContractFunctionArgs<\n abi,\n mutability,\n functionName\n > = ContractFunctionArgs,\n abiFunction extends AbiFunction = abi extends Abi\n ? ExtractAbiFunctionForArgs\n : AbiFunction,\n _Narrowable extends boolean = IsNarrowable,\n> = _Narrowable extends true\n ? abiFunction['stateMutability'] extends 'payable'\n ? { value?: NoInfer | undefined }\n : abiFunction['payable'] extends true\n ? { value?: NoInfer | undefined }\n : { value?: undefined }\n : { value?: NoInfer | undefined }\n\nexport type SimulateContractParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs,\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | null | undefined = undefined,\n ///\n derivedChain extends Chain | undefined = DeriveChain,\n callParameters extends\n CallParameters = CallParameters,\n> = {\n account?: accountOverride | null | undefined\n chain?: chainOverride | undefined\n /** Data to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f). */\n dataSuffix?: Hex | undefined\n} & ContractFunctionParameters<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n args\n> &\n UnionOmit<\n callParameters,\n | 'account'\n | 'batch'\n | 'code'\n | 'to'\n | 'data'\n | 'factory'\n | 'factoryData'\n | 'value'\n > &\n GetMutabilityAwareValue<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n callParameters['value'],\n args\n >\n\nexport type SimulateContractReturnType<\n out abi extends Abi | readonly unknown[] = Abi,\n in out functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName,\n in out args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs,\n /** @ts-expect-error cast variance */\n out chain extends Chain | undefined = Chain | undefined,\n out account extends Account | undefined = Account | undefined,\n out chainOverride extends Chain | undefined = Chain | undefined,\n out accountOverride extends Account | Address | null | undefined =\n | Account\n | Address\n | null\n | undefined,\n ///\n in out minimizedAbi extends Abi = readonly [\n ExtractAbiFunctionForArgs<\n abi extends Abi ? abi : Abi,\n 'nonpayable' | 'payable',\n functionName,\n args\n >,\n ],\n out resolvedAccount extends\n | Account\n | null\n | undefined = accountOverride extends Account | Address | null\n ? ParseAccount\n : account,\n> = {\n result: ContractFunctionReturnType<\n minimizedAbi,\n 'nonpayable' | 'payable',\n functionName,\n args\n >\n request: Prettify<\n UnionEvaluate<\n UnionOmit<\n WriteContractParameters<\n minimizedAbi,\n functionName,\n args,\n chain,\n undefined,\n chainOverride\n >,\n 'account' | 'abi' | 'args' | 'chain' | 'functionName'\n >\n > &\n ContractFunctionParameters<\n minimizedAbi,\n 'nonpayable' | 'payable',\n functionName,\n args\n > & {\n chain: DeriveChain\n } & (resolvedAccount extends Account | null\n ? { account: resolvedAccount }\n : { account?: undefined })\n >\n}\n\nexport type SimulateContractErrorType =\n | ParseAccountErrorType\n | EncodeFunctionDataErrorType\n | GetContractErrorReturnType\n | ErrorType\n\n/**\n * Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions.\n *\n * - Docs: https://viem.sh/docs/contract/simulateContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_writing-to-contracts\n *\n * This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract), but also supports contract write functions.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link SimulateContractParameters}\n * @returns The simulation result and write request. {@link SimulateContractReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { simulateContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await simulateContract(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint(uint32) view returns (uint32)']),\n * functionName: 'mint',\n * args: ['69420'],\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function simulateContract<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | null | undefined = undefined,\n>(\n client: Client,\n parameters: SimulateContractParameters<\n abi,\n functionName,\n args,\n chain,\n chainOverride,\n accountOverride\n >,\n): Promise<\n SimulateContractReturnType<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride,\n accountOverride\n >\n> {\n const {\n abi,\n address,\n args,\n functionName,\n dataSuffix = typeof client.dataSuffix === 'string'\n ? client.dataSuffix\n : client.dataSuffix?.value,\n ...callRequest\n } = parameters as SimulateContractParameters\n\n const account = callRequest.account\n ? parseAccount(callRequest.account)\n : client.account\n const calldata = encodeFunctionData({ abi, args, functionName })\n\n try {\n const { data } = await getAction(\n client,\n call,\n 'call',\n )({\n batch: false,\n data: `${calldata}${dataSuffix ? dataSuffix.replace('0x', '') : ''}`,\n to: address,\n ...callRequest,\n account,\n })\n const result = decodeFunctionResult({\n abi,\n args,\n functionName,\n data: data || '0x',\n })\n const minimizedAbi = abi.filter(\n (abiItem) =>\n 'name' in abiItem && abiItem.name === parameters.functionName,\n )\n return {\n result,\n request: {\n abi: minimizedAbi,\n address,\n args,\n dataSuffix,\n functionName,\n ...callRequest,\n account,\n },\n } as unknown as SimulateContractReturnType<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride,\n accountOverride\n >\n } catch (error) {\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/simulateContract',\n functionName,\n sender: account?.address,\n })\n }\n}\n","import type { Abi, Address, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n} from '../../errors/abi.js'\nimport { InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { LogTopic } from '../../types/misc.js'\nimport type { GetPollOptions } from '../../types/transport.js'\nimport { decodeEventLog } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { formatLog } from '../../utils/formatters/log.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\nimport { createContractEventFilter } from './createContractEventFilter.js'\nimport { getBlockNumber } from './getBlockNumber.js'\nimport {\n type GetContractEventsParameters,\n getContractEvents,\n} from './getContractEvents.js'\nimport { getFilterChanges } from './getFilterChanges.js'\nimport { uninstallFilter } from './uninstallFilter.js'\n\nexport type WatchContractEventOnLogsParameter<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName = ContractEventName,\n strict extends boolean | undefined = undefined,\n> = abi extends Abi\n ? Abi extends abi\n ? Log[]\n : Log, strict>[]\n : Log[]\n\nexport type WatchContractEventOnLogsFn<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName = ContractEventName,\n strict extends boolean | undefined = undefined,\n> = (logs: WatchContractEventOnLogsParameter) => void\n\nexport type WatchContractEventParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Contract ABI. */\n abi: abi\n args?:\n | ContractEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName\n >\n | undefined\n /** Contract event. */\n eventName?: eventName | ContractEventName | undefined\n /** Block to start listening from. */\n fromBlock?: BlockNumber | undefined\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n /** The callback to call when new event logs are received. */\n onLogs: WatchContractEventOnLogsFn<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName,\n strict\n >\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | boolean | undefined\n} & GetPollOptions\n\nexport type WatchContractEventReturnType = () => void\n\nexport type WatchContractEventErrorType =\n | StringifyErrorType\n | ObserveErrorType\n | ErrorType\n\n/**\n * Watches and returns emitted contract event logs.\n *\n * - Docs: https://viem.sh/docs/contract/watchContractEvent\n *\n * This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent#onLogs).\n *\n * `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchContractEventParameters}\n * @returns A function that can be invoked to stop watching for new event logs. {@link WatchContractEventReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { watchContractEvent } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchContractEvent(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']),\n * eventName: 'Transfer',\n * args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' },\n * onLogs: (logs) => console.log(logs),\n * })\n */\nexport function watchContractEvent<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n>(\n client: Client,\n parameters: WatchContractEventParameters,\n): WatchContractEventReturnType {\n const {\n abi,\n address,\n args,\n batch = true,\n eventName,\n fromBlock,\n onError,\n onLogs,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n strict: strict_,\n } = parameters\n\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (typeof fromBlock === 'bigint') return true\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n\n const pollContractEvent = () => {\n const strict = strict_ ?? false\n const observerId = stringify([\n 'watchContractEvent',\n address,\n args,\n batch,\n client.uid,\n eventName,\n pollingInterval,\n strict,\n fromBlock,\n ])\n\n return observe(observerId, { onLogs, onError }, (emit) => {\n let previousBlockNumber: bigint\n if (fromBlock !== undefined) previousBlockNumber = fromBlock - 1n\n let filter: Filter<'event', abi, eventName> | undefined\n let initialized = false\n\n const unwatch = poll(\n async () => {\n if (!initialized) {\n try {\n filter = (await getAction(\n client,\n createContractEventFilter,\n 'createContractEventFilter',\n )({\n abi,\n address,\n args: args as any,\n eventName: eventName as any,\n strict: strict as any,\n fromBlock,\n })) as Filter<'event', abi, eventName>\n } catch {}\n initialized = true\n return\n }\n\n try {\n let logs: Log[]\n if (filter) {\n logs = await getAction(\n client,\n getFilterChanges,\n 'getFilterChanges',\n )({ filter })\n } else {\n // If the filter doesn't exist, we will fall back to use `getLogs`.\n // The fall back exists because some RPC Providers do not support filters.\n\n // Fetch the block number to use for `getLogs`.\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({})\n\n // If the block number has changed, we will need to fetch the logs.\n // If the block number doesn't exist, we are yet to reach the first poll interval,\n // so do not emit any logs.\n if (previousBlockNumber && previousBlockNumber < blockNumber) {\n logs = await getAction(\n client,\n getContractEvents,\n 'getContractEvents',\n )({\n abi,\n address,\n args,\n eventName,\n fromBlock: previousBlockNumber + 1n,\n toBlock: blockNumber,\n strict,\n } as {} as GetContractEventsParameters)\n } else {\n logs = []\n }\n previousBlockNumber = blockNumber\n }\n\n if (logs.length === 0) return\n if (batch) emit.onLogs(logs as any)\n else for (const log of logs) emit.onLogs([log] as any)\n } catch (err) {\n // If a filter has been set and gets uninstalled, providers will throw an InvalidInput error.\n // Reinitialize the filter when this occurs\n if (filter && err instanceof InvalidInputRpcError)\n initialized = false\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin: true,\n interval: pollingInterval,\n },\n )\n\n return async () => {\n if (filter)\n await getAction(\n client,\n uninstallFilter,\n 'uninstallFilter',\n )({ filter })\n unwatch()\n }\n })\n }\n\n const subscribeContractEvent = () => {\n const strict = strict_ ?? false\n const observerId = stringify([\n 'watchContractEvent',\n address,\n args,\n batch,\n client.uid,\n eventName,\n pollingInterval,\n strict,\n ])\n\n let active = true\n let unsubscribe = () => (active = false)\n return observe(observerId, { onLogs, onError }, (emit) => {\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const topics: LogTopic[] = eventName\n ? encodeEventTopics({\n abi: abi,\n eventName: eventName,\n args,\n } as EncodeEventTopicsParameters)\n : []\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['logs', { address, topics }],\n onData(data: any) {\n if (!active) return\n const log = data.result\n try {\n const { eventName, args } = decodeEventLog({\n abi: abi,\n data: log.data,\n topics: log.topics as any,\n strict: strict_,\n })\n const formatted = formatLog(log, {\n args,\n eventName: eventName as string,\n })\n emit.onLogs([formatted] as any)\n } catch (err) {\n let eventName: string | undefined\n let isUnnamed: boolean | undefined\n if (\n err instanceof DecodeLogDataMismatch ||\n err instanceof DecodeLogTopicsMismatch\n ) {\n // If strict mode is on, and log data/topics do not match event definition, skip.\n if (strict_) return\n eventName = err.abiItem.name\n isUnnamed = err.abiItem.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n }\n\n // Set args to empty if there is an error decoding (e.g. indexed/non-indexed params mismatch).\n const formatted = formatLog(log, {\n args: isUnnamed ? [] : {},\n eventName,\n })\n emit.onLogs([formatted] as any)\n }\n },\n onError(error: Error) {\n emit.onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n })\n }\n\n return enablePolling ? pollContractEvent() : subscribeContractEvent()\n}\n","import type { ErrorType } from '../errors/utils.js'\nimport type { MaybePromise } from '../types/utils.js'\n\ntype Callback = ((...args: any[]) => any) | undefined\ntype Callbacks = Record\n\nexport type ObserveErrorType = ErrorType\n\n/** @internal */\nexport const listenersCache = /*#__PURE__*/ new Map<\n string,\n { id: number; fns: Callbacks }[]\n>()\n/** @internal */\nexport const cleanupCache = /*#__PURE__*/ new Map<\n string,\n () => void | Promise\n>()\n\ntype EmitFunction = (\n emit: callbacks,\n) => MaybePromise void) | (() => Promise)>\n\nlet callbackCount = 0\n\n/**\n * @description Sets up an observer for a given function. If another function\n * is set up under the same observer id, the function will only be called once\n * for both instances of the observer.\n */\nexport function observe(\n observerId: string,\n callbacks: callbacks,\n fn: EmitFunction,\n) {\n const callbackId = ++callbackCount\n\n const getListeners = () => listenersCache.get(observerId) || []\n\n const unsubscribe = () => {\n const listeners = getListeners()\n listenersCache.set(\n observerId,\n listeners.filter((cb: any) => cb.id !== callbackId),\n )\n }\n\n const unwatch = () => {\n const listeners = getListeners()\n if (!listeners.some((cb: any) => cb.id === callbackId)) return\n const cleanup = cleanupCache.get(observerId)\n if (listeners.length === 1 && cleanup) {\n const p = cleanup()\n if (p instanceof Promise) p.catch(() => {})\n }\n unsubscribe()\n }\n\n const listeners = getListeners()\n listenersCache.set(observerId, [\n ...listeners,\n { id: callbackId, fns: callbacks },\n ])\n\n if (listeners && listeners.length > 0) return unwatch\n\n const emit: callbacks = {} as callbacks\n for (const key in callbacks) {\n emit[key] = ((\n ...args: Parameters>\n ) => {\n const listeners = getListeners()\n if (listeners.length === 0) return\n for (const listener of listeners) listener.fns[key]?.(...args)\n }) as callbacks[Extract]\n }\n\n const cleanup = fn(emit)\n if (typeof cleanup === 'function') cleanupCache.set(observerId, cleanup)\n\n return unwatch\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time))\n}\n","import type { ErrorType } from '../errors/utils.js'\nimport { wait } from './wait.js'\n\ntype PollOptions = {\n // Whether or not to emit when the polling starts.\n emitOnBegin?: boolean | undefined\n // The initial wait time (in ms) before polling.\n initialWaitTime?: ((data: data | void) => Promise) | undefined\n // The interval (in ms).\n interval: number\n}\n\nexport type PollErrorType = ErrorType\n\n/**\n * @description Polls a function at a specified interval.\n */\nexport function poll(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise,\n { emitOnBegin, initialWaitTime, interval }: PollOptions,\n) {\n let active = true\n\n const unwatch = () => (active = false)\n\n const watch = async () => {\n let data: data | undefined | void\n if (emitOnBegin) data = await fn({ unpoll: unwatch })\n\n const initialWait = (await initialWaitTime?.(data)) ?? interval\n await wait(initialWait)\n\n const poll = async () => {\n if (!active) return\n await fn({ unpoll: unwatch })\n await wait(interval)\n poll()\n }\n\n poll()\n }\n watch()\n\n return unwatch\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\n/** @internal */\nexport const promiseCache = /*#__PURE__*/ new Map()\n/** @internal */\nexport const responseCache = /*#__PURE__*/ new Map()\n\nexport type GetCacheErrorType = ErrorType\n\nexport function getCache(cacheKey: string) {\n const buildCache = (cacheKey: string, cache: Map) => ({\n clear: () => cache.delete(cacheKey),\n get: () => cache.get(cacheKey),\n set: (data: data) => cache.set(cacheKey, data),\n })\n\n const promise = buildCache>(cacheKey, promiseCache)\n const response = buildCache<{ created: Date; data: data }>(\n cacheKey,\n responseCache,\n )\n\n return {\n clear: () => {\n promise.clear()\n response.clear()\n },\n promise,\n response,\n }\n}\n\ntype WithCacheParameters = {\n /** The key to cache the data against. */\n cacheKey: string\n /** The time that cached data will remain in memory. Default: Infinity (no expiry) */\n cacheTime?: number | undefined\n}\n\n/**\n * @description Returns the result of a given promise, and caches the result for\n * subsequent invocations against a provided cache key.\n */\nexport async function withCache(\n fn: () => Promise,\n { cacheKey, cacheTime = Number.POSITIVE_INFINITY }: WithCacheParameters,\n) {\n const cache = getCache(cacheKey)\n\n // If a response exists in the cache, and it's not expired, return it\n // and do not invoke the promise.\n // If the max age is 0, the cache is disabled.\n const response = cache.response.get()\n if (response && cacheTime > 0) {\n const age = Date.now() - response.created.getTime()\n if (age < cacheTime) return response.data\n }\n\n let promise = cache.promise.get()\n if (!promise) {\n promise = fn()\n\n // Store the promise in the cache so that subsequent invocations\n // will wait for the same promise to resolve (deduping).\n cache.promise.set(promise)\n }\n\n try {\n const data = await promise\n\n // Store the response in the cache so that subsequent invocations\n // will return the same response.\n cache.response.set({ created: new Date(), data })\n\n return data\n } finally {\n // Clear the promise cache so that subsequent invocations will\n // invoke the promise again.\n cache.promise.clear()\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type GetCacheErrorType,\n getCache,\n withCache,\n} from '../../utils/promise/withCache.js'\n\nexport type GetBlockNumberParameters = {\n /** Time (in ms) that cached block number will remain in memory. */\n cacheTime?: number | undefined\n}\n\nexport type GetBlockNumberReturnType = bigint\n\nexport type GetBlockNumberErrorType = RequestErrorType | ErrorType\n\nconst cacheKey = (id: string) => `blockNumber.${id}`\n\n/** @internal */\nexport type GetBlockNumberCacheErrorType = GetCacheErrorType | ErrorType\n\n/** @internal */\nexport function getBlockNumberCache(id: string) {\n return getCache(cacheKey(id))\n}\n\n/**\n * Returns the number of the most recent block seen.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber)\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockNumberParameters}\n * @returns The number of the block. {@link GetBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlockNumber } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blockNumber = await getBlockNumber(client)\n * // 69420n\n */\nexport async function getBlockNumber(\n client: Client,\n { cacheTime = client.cacheTime }: GetBlockNumberParameters = {},\n): Promise {\n const blockNumberHex = await withCache(\n () =>\n client.request({\n method: 'eth_blockNumber',\n }),\n { cacheKey: cacheKey(client.uid), cacheTime },\n )\n return BigInt(blockNumberHex)\n}\n","import type { Abi, AbiEvent, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { RpcLog } from '../../index.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter, FilterType } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetFilterChangesParameters<\n filterType extends FilterType = FilterType,\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n filter: Filter\n}\n\nexport type GetFilterChangesReturnType<\n filterType extends FilterType = FilterType,\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _AbiEvent extends AbiEvent | undefined = abi extends Abi\n ? eventName extends string\n ? ExtractAbiEvent\n : undefined\n : undefined,\n _Pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = filterType extends 'event'\n ? Log[]\n : Hash[]\n\nexport type GetFilterChangesErrorType =\n | RequestErrorType\n | DecodeEventLogErrorType\n | FormatLogErrorType\n | ErrorType\n\n/**\n * Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterChanges\n * - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges)\n *\n * A Filter can be created from the following actions:\n *\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * Depending on the type of filter, the return value will be different:\n *\n * - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs.\n * - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes.\n * - If the filter was created with `createBlockFilter`, it returns a list of block hashes.\n *\n * @param client - Client to use\n * @param parameters - {@link GetFilterChangesParameters}\n * @returns Logs or hashes. {@link GetFilterChangesReturnType}\n *\n * @example\n * // Blocks\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createBlockFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createBlockFilter(client)\n * const hashes = await getFilterChanges(client, { filter })\n *\n * @example\n * // Contract Events\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createContractEventFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createContractEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * eventName: 'Transfer',\n * })\n * const logs = await getFilterChanges(client, { filter })\n *\n * @example\n * // Raw Events\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createEventFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await getFilterChanges(client, { filter })\n *\n * @example\n * // Transactions\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createPendingTransactionFilter(client)\n * const hashes = await getFilterChanges(client, { filter })\n */\nexport async function getFilterChanges<\n transport extends Transport,\n chain extends Chain | undefined,\n filterType extends FilterType,\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n _client: Client,\n {\n filter,\n }: GetFilterChangesParameters<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n> {\n const strict = 'strict' in filter && filter.strict\n\n const logs = await filter.request({\n method: 'eth_getFilterChanges',\n params: [filter.id],\n })\n\n if (typeof logs[0] === 'string')\n return logs as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n\n const formattedLogs = logs.map((log) => formatLog(log as RpcLog))\n if (!('abi' in filter) || !filter.abi)\n return formattedLogs as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: filter.abi,\n logs: formattedLogs,\n strict,\n }) as unknown as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type UninstallFilterParameters = {\n filter: Filter\n}\nexport type UninstallFilterReturnType = boolean\n\nexport type UninstallFilterErrorType = RequestErrorType | ErrorType\n\n/**\n * Destroys a [`Filter`](https://viem.sh/docs/glossary/types#filter).\n *\n * - Docs: https://viem.sh/docs/actions/public/uninstallFilter\n * - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter)\n *\n * Destroys a Filter that was created from one of the following Actions:\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * @param client - Client to use\n * @param parameters - {@link UninstallFilterParameters}\n * @returns A boolean indicating if the Filter was successfully uninstalled. {@link UninstallFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, uninstallFilter } from 'viem/public'\n *\n * const filter = await createPendingTransactionFilter(client)\n * const uninstalled = await uninstallFilter(client, { filter })\n * // true\n */\nexport async function uninstallFilter<\n transport extends Transport,\n chain extends Chain | undefined,\n>(\n _client: Client,\n { filter }: UninstallFilterParameters,\n): Promise {\n return filter.request({\n method: 'eth_uninstallFilter',\n params: [filter.id],\n })\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { TransactionSerializedGeneric } from '../../types/transaction.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type SendRawTransactionParameters = {\n /** The signed serialized transaction. */\n serializedTransaction: TransactionSerializedGeneric\n}\n\nexport type SendRawTransactionReturnType = Hash\n\nexport type SendRawTransactionErrorType = RequestErrorType | ErrorType\n\n/**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction\n * - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction hash. {@link SendRawTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const hash = await sendRawTransaction(client, {\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\nexport async function sendRawTransaction(\n client: Client,\n { serializedTransaction }: SendRawTransactionParameters,\n): Promise {\n return client.request(\n {\n method: 'eth_sendRawTransaction',\n params: [serializedTransaction],\n },\n { retryCount: 0 },\n )\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport { wait } from '../wait.js'\n\nexport type WithRetryParameters = {\n // The delay (in ms) between retries.\n delay?:\n | ((config: { count: number; error: Error }) => number)\n | number\n | undefined\n // The max number of times to retry.\n retryCount?: number | undefined\n // Whether or not to retry when an error is thrown.\n shouldRetry?:\n | (({\n count,\n error,\n }: {\n count: number\n error: Error\n }) => Promise | boolean)\n | undefined\n}\n\nexport type WithRetryErrorType = ErrorType\n\nexport function withRetry(\n fn: () => Promise,\n {\n delay: delay_ = 100,\n retryCount = 2,\n shouldRetry = () => true,\n }: WithRetryParameters = {},\n) {\n return new Promise((resolve, reject) => {\n const attemptRetry = async ({ count = 0 } = {}) => {\n const retry = async ({ error }: { error: Error }) => {\n const delay =\n typeof delay_ === 'function' ? delay_({ count, error }) : delay_\n if (delay) await wait(delay)\n attemptRetry({ count: count + 1 })\n }\n\n try {\n const data = await fn()\n resolve(data)\n } catch (err) {\n if (\n count < retryCount &&\n (await shouldRetry({ count, error: err as Error }))\n )\n return retry({ error: err as Error })\n reject(err)\n }\n }\n attemptRetry()\n })\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n Chain,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { RpcTransactionReceipt } from '../../types/rpc.js'\nimport type { TransactionReceipt } from '../../types/transaction.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\n\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\nimport { formatLog } from './log.js'\nimport { transactionType } from './transaction.js'\n\nexport type FormattedTransactionReceipt<\n chain extends Chain | undefined = undefined,\n> = ExtractChainFormatterReturnType<\n chain,\n 'transactionReceipt',\n TransactionReceipt\n>\n\nexport const receiptStatuses = {\n '0x0': 'reverted',\n '0x1': 'success',\n} as const\n\nexport type FormatTransactionReceiptErrorType = ErrorType\n\nexport function formatTransactionReceipt(\n transactionReceipt: ExactPartial,\n _?: string | undefined,\n) {\n const receipt = {\n ...transactionReceipt,\n blockNumber: transactionReceipt.blockNumber\n ? BigInt(transactionReceipt.blockNumber)\n : null,\n contractAddress: transactionReceipt.contractAddress\n ? transactionReceipt.contractAddress\n : null,\n cumulativeGasUsed: transactionReceipt.cumulativeGasUsed\n ? BigInt(transactionReceipt.cumulativeGasUsed)\n : null,\n effectiveGasPrice: transactionReceipt.effectiveGasPrice\n ? BigInt(transactionReceipt.effectiveGasPrice)\n : null,\n gasUsed: transactionReceipt.gasUsed\n ? BigInt(transactionReceipt.gasUsed)\n : null,\n logs: transactionReceipt.logs\n ? transactionReceipt.logs.map((log) => formatLog(log))\n : null,\n to: transactionReceipt.to ? transactionReceipt.to : null,\n transactionIndex: transactionReceipt.transactionIndex\n ? hexToNumber(transactionReceipt.transactionIndex)\n : null,\n status: transactionReceipt.status\n ? receiptStatuses[transactionReceipt.status]\n : null,\n type: transactionReceipt.type\n ? transactionType[\n transactionReceipt.type as keyof typeof transactionType\n ] || transactionReceipt.type\n : null,\n } as TransactionReceipt\n\n if (transactionReceipt.blobGasPrice)\n receipt.blobGasPrice = BigInt(transactionReceipt.blobGasPrice)\n if (transactionReceipt.blobGasUsed)\n receipt.blobGasUsed = BigInt(transactionReceipt.blobGasUsed)\n\n return receipt\n}\n\nexport type DefineTransactionReceiptErrorType =\n | DefineFormatterErrorType\n | ErrorType\n\nexport const defineTransactionReceipt = /*#__PURE__*/ defineFormatter(\n 'transactionReceipt',\n formatTransactionReceipt,\n)\n","import type { Address } from 'abitype'\n\nimport type { JsonRpcAccount } from '../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../accounts/utils/parseAccount.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Account } from '../types/account.js'\nimport type { BlockTag } from '../types/block.js'\nimport type { Chain } from '../types/chain.js'\nimport type { DataSuffix } from '../types/dataSuffix.js'\nimport type {\n EIP1193RequestFn,\n EIP1474Methods,\n RpcSchema,\n} from '../types/eip1193.js'\nimport type { ExactPartial, Prettify } from '../types/utils.js'\nimport type {\n CcipRequestParameters,\n CcipRequestReturnType,\n} from '../utils/ccip.js'\nimport { uid } from '../utils/uid.js'\nimport type { PublicActions } from './decorators/public.js'\nimport type { WalletActions } from './decorators/wallet.js'\nimport type { Transport } from './transports/createTransport.js'\n\nexport type ClientConfig<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n accountOrAddress extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = {\n /** The Account to use for the Client. This will be used for Actions that require an account as an argument. */\n account?: accountOrAddress | Account | Address | undefined\n /** Flags for batch settings. */\n batch?:\n | {\n /** Toggle to enable `eth_call` multicall aggregation. */\n multicall?: boolean | Prettify | undefined\n }\n | undefined\n /**\n * Default block tag to use for RPC requests.\n *\n * If the chain supports a pre-confirmation mechanism\n * (set via `chain.experimental_preconfirmationTime`), defaults to `'pending'`.\n *\n * @default 'latest'\n */\n experimental_blockTag?: BlockTag | undefined\n /**\n * Time (in ms) that cached data will remain in memory.\n * @default chain.blockTime / 3\n */\n cacheTime?: number | undefined\n /**\n * [CCIP Read](https://eips.ethereum.org/EIPS/eip-3668) configuration.\n * If `false`, the client will not support offchain CCIP lookups.\n */\n ccipRead?:\n | {\n /**\n * A function that will be called to make the offchain CCIP lookup request.\n * @see https://eips.ethereum.org/EIPS/eip-3668#client-lookup-protocol\n */\n request?: (\n parameters: CcipRequestParameters,\n ) => Promise\n }\n | false\n | undefined\n /** Chain for the client. */\n chain?: Chain | undefined | chain\n /** Data suffix to append to transaction data. */\n dataSuffix?: DataSuffix | undefined\n /** A key for the client. */\n key?: string | undefined\n /** A name for the client. */\n name?: string | undefined\n /**\n * Frequency (in ms) for polling enabled actions & events.\n * @default chain.blockTime / 3\n */\n pollingInterval?: number | undefined\n /**\n * Typed JSON-RPC schema for the client.\n */\n rpcSchema?: rpcSchema | undefined\n /** The RPC transport */\n transport: transport\n /** The type of client. */\n type?: string | undefined\n}\n\n// Actions that are used internally by other Actions (ie. `call` is used by `readContract`).\n// They are allowed to be extended, but must conform to their parameter & return type interfaces.\n// Example: an extended `call` action must accept `CallParameters` as parameters,\n// and conform to the `CallReturnType` return type.\ntype ExtendableProtectedActions<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n> = Pick<\n PublicActions,\n | 'call'\n | 'createContractEventFilter'\n | 'createEventFilter'\n | 'estimateContractGas'\n | 'estimateGas'\n | 'getBlock'\n | 'getBlockNumber'\n | 'getChainId'\n | 'getContractEvents'\n | 'getEnsText'\n | 'getFilterChanges'\n | 'getGasPrice'\n | 'getLogs'\n | 'getTransaction'\n | 'getTransactionCount'\n | 'getTransactionReceipt'\n | 'prepareTransactionRequest'\n | 'readContract'\n | 'sendRawTransaction'\n | 'simulateContract'\n | 'uninstallFilter'\n | 'watchBlockNumber'\n | 'watchContractEvent'\n> &\n Pick, 'sendTransaction' | 'writeContract'>\n\n// TODO: Move `transport` to slot index 2 since `chain` and `account` used more frequently.\n// Otherwise, we end up with a lot of `Client` in actions.\nexport type Client<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n extended extends Extended | undefined = Extended | undefined,\n> = Client_Base &\n (extended extends Extended ? extended : unknown) & {\n extend: <\n const client extends Extended &\n ExactPartial>,\n >(\n fn: (\n client: Client,\n ) => client,\n ) => Client<\n transport,\n chain,\n account,\n rpcSchema,\n Prettify & (extended extends Extended ? extended : unknown)\n >\n }\n\ntype Client_Base<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = {\n /** The Account of the Client. */\n account: account\n /** Flags for batch settings. */\n batch?: ClientConfig['batch'] | undefined\n /** Time (in ms) that cached data will remain in memory. */\n cacheTime: number\n /** [CCIP Read](https://eips.ethereum.org/EIPS/eip-3668) configuration. */\n ccipRead?: ClientConfig['ccipRead'] | undefined\n /** Chain for the client. */\n chain: chain\n /** Data suffix to append to transaction data. */\n dataSuffix?: DataSuffix | undefined\n /** Default block tag to use for RPC requests. */\n experimental_blockTag?: BlockTag | undefined\n /** A key for the client. */\n key: string\n /** A name for the client. */\n name: string\n /** Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. */\n pollingInterval: number\n /** Request function wrapped with friendly error handling */\n request: EIP1193RequestFn<\n rpcSchema extends undefined ? EIP1474Methods : rpcSchema\n >\n /** The RPC transport */\n transport: ReturnType['config'] & ReturnType['value']\n /** The type of client. */\n type: string\n /** A unique ID for the client. */\n uid: string\n}\n\ntype Extended = Prettify<\n // disallow redefining base properties\n { [_ in keyof Client_Base]?: undefined } & {\n [key: string]: unknown\n }\n>\n\nexport type MulticallBatchOptions = {\n /** The maximum size (in bytes) for each calldata chunk. @default 1_024 */\n batchSize?: number | undefined\n /** Enable deployless multicall. */\n deployless?: boolean | undefined\n /** The maximum number of milliseconds to wait before sending a batch. @default 0 */\n wait?: number | undefined\n}\n\nexport type CreateClientErrorType = ParseAccountErrorType | ErrorType\n\nexport function createClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n accountOrAddress extends Account | Address | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n parameters: ClientConfig,\n): Prettify<\n Client<\n transport,\n chain,\n accountOrAddress extends Address\n ? Prettify>\n : accountOrAddress,\n rpcSchema\n >\n>\n\nexport function createClient(parameters: ClientConfig): Client {\n const {\n batch,\n chain,\n ccipRead,\n dataSuffix,\n key = 'base',\n name = 'Base Client',\n type = 'base',\n } = parameters\n\n const experimental_blockTag =\n parameters.experimental_blockTag ??\n (typeof chain?.experimental_preconfirmationTime === 'number'\n ? 'pending'\n : undefined)\n const blockTime = chain?.blockTime ?? 12_000\n\n const defaultPollingInterval = Math.min(\n Math.max(Math.floor(blockTime / 2), 500),\n 4_000,\n )\n const pollingInterval = parameters.pollingInterval ?? defaultPollingInterval\n const cacheTime = parameters.cacheTime ?? pollingInterval\n\n const account = parameters.account\n ? parseAccount(parameters.account)\n : undefined\n const { config, request, value } = parameters.transport({\n account,\n chain,\n pollingInterval,\n })\n const transport = { ...config, ...value }\n\n const client = {\n account,\n batch,\n cacheTime,\n ccipRead,\n chain,\n dataSuffix,\n key,\n name,\n pollingInterval,\n request,\n transport,\n type,\n uid: uid(),\n ...(experimental_blockTag ? { experimental_blockTag } : {}),\n }\n\n function extend(base: typeof client) {\n type ExtendFn = (base: typeof client) => unknown\n return (extendFn: ExtendFn) => {\n const extended = extendFn(base) as Extended\n for (const key in client) delete extended[key]\n const combined = { ...base, ...extended }\n return Object.assign(combined, { extend: extend(combined as any) })\n }\n }\n\n return Object.assign(client, { extend: extend(client) as any })\n}\n\n/**\n * Defines a typed JSON-RPC schema for the client.\n * Note: This is a runtime noop function.\n */\nexport function rpcSchema(): rpcSchema {\n return null as any\n}\n","const size = 256\nlet index = size\nlet buffer: string\n\nexport function uid(length = 11) {\n if (!buffer || index + length > size * 2) {\n buffer = ''\n index = 0\n for (let i = 0; i < size; i++) {\n buffer += ((256 + Math.random() * 256) | 0).toString(16).substring(1)\n }\n }\n return buffer.substring(index, index++ + length)\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n addressResolverAbi,\n universalResolverResolveAbi,\n} from '../../constants/abis.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { type TrimErrorType, trim } from '../../utils/data/trim.js'\nimport { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js'\nimport { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'\nimport { type NamehashErrorType, namehash } from '../../utils/ens/namehash.js'\nimport {\n type PacketToBytesErrorType,\n packetToBytes,\n} from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsAddressParameters = Prettify<\n Pick & {\n /**\n * ENSIP-9 compliant coinType (chain) to get ENS address for.\n *\n * To get the `coinType` for a chain id, use the `toCoinType` function:\n * ```ts\n * import { toCoinType } from 'viem'\n * import { base } from 'viem/chains'\n *\n * const coinType = toCoinType(base.id)\n * ```\n *\n * @default 60n\n */\n coinType?: bigint | undefined\n /**\n * Universal Resolver gateway URLs to use for resolving CCIP-read requests.\n */\n gatewayUrls?: string[] | undefined\n /**\n * Name to get the address for.\n */\n name: string\n /**\n * Whether or not to throw errors propagated from the ENS Universal Resolver Contract.\n */\n strict?: boolean | undefined\n /**\n * Address of ENS Universal Resolver Contract.\n */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsAddressReturnType = Address | null\n\nexport type GetEnsAddressErrorType =\n | GetChainContractAddressErrorType\n | EncodeFunctionDataErrorType\n | NamehashErrorType\n | ToHexErrorType\n | PacketToBytesErrorType\n | DecodeFunctionResultErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Gets address for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAddress\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsAddressParameters}\n * @returns Address for ENS name or `null` if not found. {@link GetEnsAddressReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsAddress, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAddress = await getEnsAddress(client, {\n * name: normalize('wevm.eth'),\n * })\n * // '0xd2135CfB216b74109775236E36d4b433F1DF507B'\n */\nexport async function getEnsAddress(\n client: Client,\n parameters: GetEnsAddressParameters,\n): Promise {\n const { blockNumber, blockTag, coinType, name, gatewayUrls, strict } =\n parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n const tlds = chain?.ensTlds\n if (tlds && !tlds.some((tld) => name.endsWith(tld))) return null\n\n const args = (() => {\n if (coinType != null) return [namehash(name), BigInt(coinType)] as const\n return [namehash(name)] as const\n })()\n\n try {\n const functionData = encodeFunctionData({\n abi: addressResolverAbi,\n functionName: 'addr',\n args,\n })\n\n const readContractParameters = {\n address: universalResolverAddress,\n abi: universalResolverResolveAbi,\n functionName: 'resolveWithGateways',\n args: [\n toHex(packetToBytes(name)),\n functionData,\n gatewayUrls ?? [localBatchGatewayUrl],\n ],\n blockNumber,\n blockTag,\n } as const\n\n const readContractAction = getAction(client, readContract, 'readContract')\n\n const res = await readContractAction(readContractParameters)\n\n if (res[0] === '0x') return null\n\n const address = decodeFunctionResult({\n abi: addressResolverAbi,\n args,\n functionName: 'addr',\n data: res[0],\n })\n\n if (address === '0x') return null\n if (trim(address) === '0x00') return null\n return address\n } catch (err) {\n if (strict) throw err\n if (isNullUniversalResolverError(err)) return null\n throw err\n }\n}\n","import { BaseError } from '../../errors/base.js'\nimport { ContractFunctionRevertedError } from '../../errors/contract.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\n/** @internal */\nexport type IsNullUniversalResolverErrorErrorType = ErrorType\n\n/*\n * @description Checks if error is a valid null result UniversalResolver error\n */\nexport function isNullUniversalResolverError(err: unknown): boolean {\n if (!(err instanceof BaseError)) return false\n const cause = err.walk((e) => e instanceof ContractFunctionRevertedError)\n if (!(cause instanceof ContractFunctionRevertedError)) return false\n\n if (cause.data?.errorName === 'HttpError') return true\n if (cause.data?.errorName === 'ResolverError') return true\n if (cause.data?.errorName === 'ResolverNotContract') return true\n if (cause.data?.errorName === 'ResolverNotFound') return true\n if (cause.data?.errorName === 'ReverseAddressMismatch') return true\n if (cause.data?.errorName === 'UnsupportedResolverProfile') return true\n\n return false\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray } from '../../types/misc.js'\nimport { type ConcatErrorType, concat } from '../data/concat.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n type ToBytesErrorType,\n toBytes,\n} from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type EncodedLabelToLabelhashErrorType,\n encodedLabelToLabelhash,\n} from './encodedLabelToLabelhash.js'\n\nexport type NamehashErrorType =\n | BytesToHexErrorType\n | EncodedLabelToLabelhashErrorType\n | ToBytesErrorType\n | Keccak256ErrorType\n | StringToBytesErrorType\n | ConcatErrorType\n | ErrorType\n\n/**\n * @description Hashes ENS name\n *\n * - Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `namehash`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @example\n * namehash('wevm.eth')\n * '0x08c85f2f4059e930c45a6aeff9dcd3bd95dc3c5c1cddef6a0626b31152248560'\n *\n * @link https://eips.ethereum.org/EIPS/eip-137\n */\nexport function namehash(name: string) {\n let result = new Uint8Array(32).fill(0) as ByteArray\n if (!name) return bytesToHex(result)\n\n const labels = name.split('.')\n // Iterate in reverse order building up hash\n for (let i = labels.length - 1; i >= 0; i -= 1) {\n const hashFromEncodedLabel = encodedLabelToLabelhash(labels[i])\n const hashed = hashFromEncodedLabel\n ? toBytes(hashFromEncodedLabel)\n : keccak256(stringToBytes(labels[i]), 'bytes')\n result = keccak256(concat([result, hashed]), 'bytes')\n }\n\n return bytesToHex(result)\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\n\nexport type EncodedLabelToLabelhashErrorType = IsHexErrorType | ErrorType\n\nexport function encodedLabelToLabelhash(label: string): Hex | null {\n if (label.length !== 66) return null\n if (label.indexOf('[') !== 0) return null\n if (label.indexOf(']') !== 65) return null\n const hash = `0x${label.slice(1, 65)}`\n if (!isHex(hash)) return null\n return hash\n}\n","// Adapted from https://github.com/mafintosh/dns-packet\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray } from '../../types/misc.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n} from '../encoding/toBytes.js'\nimport {\n type EncodeLabelhashErrorType,\n encodeLabelhash,\n} from './encodeLabelhash.js'\nimport { type LabelhashErrorType, labelhash } from './labelhash.js'\n\nexport type PacketToBytesErrorType =\n | EncodeLabelhashErrorType\n | LabelhashErrorType\n | StringToBytesErrorType\n | ErrorType\n\n/*\n * @description Encodes a DNS packet into a ByteArray containing a UDP payload.\n *\n * @example\n * packetToBytes('awkweb.eth')\n * '0x0661776b7765620365746800'\n *\n * @see https://docs.ens.domains/resolution/names#dns\n *\n */\nexport function packetToBytes(packet: string): ByteArray {\n // strip leading and trailing `.`\n const value = packet.replace(/^\\.|\\.$/gm, '')\n if (value.length === 0) return new Uint8Array(1)\n\n const bytes = new Uint8Array(stringToBytes(value).byteLength + 2)\n\n let offset = 0\n const list = value.split('.')\n for (let i = 0; i < list.length; i++) {\n let encoded = stringToBytes(list[i])\n // if the length is > 255, make the encoded label value a labelhash\n // this is compatible with the universal resolver\n if (encoded.byteLength > 255)\n encoded = stringToBytes(encodeLabelhash(labelhash(list[i])))\n bytes[offset] = encoded.length\n bytes.set(encoded, offset + 1)\n offset += encoded.length + 1\n }\n\n if (bytes.byteLength !== offset + 1) return bytes.slice(0, offset + 1)\n\n return bytes\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\n\nexport type EncodeLabelhashErrorType = ErrorType\n\nexport function encodeLabelhash(hash: Hex): `[${string}]` {\n return `[${hash.slice(2)}]`\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n} from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type EncodedLabelToLabelhashErrorType,\n encodedLabelToLabelhash,\n} from './encodedLabelToLabelhash.js'\n\nexport type LabelhashErrorType =\n | BytesToHexErrorType\n | EncodedLabelToLabelhashErrorType\n | Keccak256ErrorType\n | StringToBytesErrorType\n | ErrorType\n\n/**\n * @description Hashes ENS label\n *\n * - Since ENS labels prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS labels](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `labelhash`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @example\n * labelhash('eth')\n * '0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0'\n */\nexport function labelhash(label: string) {\n const result = new Uint8Array(32).fill(0)\n if (!label) return bytesToHex(result)\n return encodedLabelToLabelhash(label) || keccak256(stringToBytes(label))\n}\n","import { BaseError } from './base.js'\n\nexport type EnsAvatarInvalidMetadataErrorType =\n EnsAvatarInvalidMetadataError & {\n name: 'EnsAvatarInvalidMetadataError'\n }\nexport class EnsAvatarInvalidMetadataError extends BaseError {\n constructor({ data }: { data: any }) {\n super(\n 'Unable to extract image from metadata. The metadata may be malformed or invalid.',\n {\n metaMessages: [\n '- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.',\n '',\n `Provided data: ${JSON.stringify(data)}`,\n ],\n name: 'EnsAvatarInvalidMetadataError',\n },\n )\n }\n}\n\nexport type EnsAvatarInvalidNftUriErrorType = EnsAvatarInvalidNftUriError & {\n name: 'EnsAvatarInvalidNftUriError'\n}\nexport class EnsAvatarInvalidNftUriError extends BaseError {\n constructor({ reason }: { reason: string }) {\n super(`ENS NFT avatar URI is invalid. ${reason}`, {\n name: 'EnsAvatarInvalidNftUriError',\n })\n }\n}\n\nexport type EnsAvatarUriResolutionErrorType = EnsAvatarUriResolutionError & {\n name: 'EnsAvatarUriResolutionError'\n}\nexport class EnsAvatarUriResolutionError extends BaseError {\n constructor({ uri }: { uri: string }) {\n super(\n `Unable to resolve ENS avatar URI \"${uri}\". The URI may be malformed, invalid, or does not respond with a valid image.`,\n { name: 'EnsAvatarUriResolutionError' },\n )\n }\n}\n\nexport type EnsAvatarUnsupportedNamespaceErrorType =\n EnsAvatarUnsupportedNamespaceError & {\n name: 'EnsAvatarUnsupportedNamespaceError'\n }\nexport class EnsAvatarUnsupportedNamespaceError extends BaseError {\n constructor({ namespace }: { namespace: string }) {\n super(\n `ENS NFT avatar namespace \"${namespace}\" is not supported. Must be \"erc721\" or \"erc1155\".`,\n { name: 'EnsAvatarUnsupportedNamespaceError' },\n )\n }\n}\n\nexport type EnsInvalidChainIdErrorType = EnsInvalidChainIdError & {\n name: 'EnsInvalidChainIdError'\n}\nexport class EnsInvalidChainIdError extends BaseError {\n constructor({ chainId }: { chainId: number }) {\n super(\n `Invalid ENSIP-11 chainId: ${chainId}. Must be between 0 and 0x7fffffff, or 1.`,\n {\n name: 'EnsInvalidChainIdError',\n },\n )\n }\n}\n","import type { Address } from 'abitype'\n\nimport {\n type ReadContractErrorType,\n readContract,\n} from '../../../actions/public/readContract.js'\nimport type { Client } from '../../../clients/createClient.js'\nimport type { Transport } from '../../../clients/transports/createTransport.js'\nimport {\n EnsAvatarInvalidMetadataError,\n type EnsAvatarInvalidMetadataErrorType,\n EnsAvatarInvalidNftUriError,\n type EnsAvatarInvalidNftUriErrorType,\n EnsAvatarUnsupportedNamespaceError,\n type EnsAvatarUnsupportedNamespaceErrorType,\n EnsAvatarUriResolutionError,\n type EnsAvatarUriResolutionErrorType,\n} from '../../../errors/ens.js'\nimport type { ErrorType } from '../../../errors/utils.js'\nimport type { Chain } from '../../../types/chain.js'\nimport type { AssetGatewayUrls } from '../../../types/ens.js'\n\ntype UriItem = {\n uri: string\n isOnChain: boolean\n isEncoded: boolean\n}\n\nconst networkRegex =\n /(?https?:\\/\\/[^/]*|ipfs:\\/|ipns:\\/|ar:\\/)?(?\\/)?(?ipfs\\/|ipns\\/)?(?[\\w\\-.]+)(?\\/.*)?/\nconst ipfsHashRegex =\n /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\\/(?[\\w\\-.]+))?(?\\/.*)?$/\nconst base64Regex = /^data:([a-zA-Z\\-/+]*);base64,([^\"].*)/\nconst dataURIRegex = /^data:([a-zA-Z\\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/\n\ntype IsImageUriErrorType = ErrorType\n\n/** @internal */\nexport async function isImageUri(uri: string) {\n try {\n const res = await fetch(uri, { method: 'HEAD' })\n // retrieve content type header to check if content is image\n if (res.status === 200) {\n const contentType = res.headers.get('content-type')\n return contentType?.startsWith('image/')\n }\n return false\n } catch (error: any) {\n // if error is not cors related then fail\n if (typeof error === 'object' && typeof error.response !== 'undefined') {\n return false\n }\n // fail in NodeJS, since the error is not cors but any other network issue\n if (!Object.hasOwn(globalThis, 'Image')) return false\n // in case of cors, use image api to validate if given url is an actual image\n return new Promise((resolve) => {\n const img = new Image()\n img.onload = () => {\n resolve(true)\n }\n img.onerror = () => {\n resolve(false)\n }\n img.src = uri\n })\n }\n}\n\ntype GetGatewayErrorType = ErrorType\n\n/** @internal */\nexport function getGateway(custom: string | undefined, defaultGateway: string) {\n if (!custom) return defaultGateway\n if (custom.endsWith('/')) return custom.slice(0, -1)\n return custom\n}\n\nexport type ResolveAvatarUriErrorType =\n | GetGatewayErrorType\n | EnsAvatarUriResolutionErrorType\n | ErrorType\n\nexport function resolveAvatarUri({\n uri,\n gatewayUrls,\n}: {\n uri: string\n gatewayUrls?: AssetGatewayUrls | undefined\n}): UriItem {\n const isEncoded = base64Regex.test(uri)\n if (isEncoded) return { uri, isOnChain: true, isEncoded }\n\n const ipfsGateway = getGateway(gatewayUrls?.ipfs, 'https://ipfs.io')\n const arweaveGateway = getGateway(gatewayUrls?.arweave, 'https://arweave.net')\n\n const networkRegexMatch = uri.match(networkRegex)\n const {\n protocol,\n subpath,\n target,\n subtarget = '',\n } = networkRegexMatch?.groups || {}\n\n const isIPNS = protocol === 'ipns:/' || subpath === 'ipns/'\n const isIPFS =\n protocol === 'ipfs:/' || subpath === 'ipfs/' || ipfsHashRegex.test(uri)\n\n if (uri.startsWith('http') && !isIPNS && !isIPFS) {\n let replacedUri = uri\n if (gatewayUrls?.arweave)\n replacedUri = uri.replace(/https:\\/\\/arweave.net/g, gatewayUrls?.arweave)\n return { uri: replacedUri, isOnChain: false, isEncoded: false }\n }\n\n if ((isIPNS || isIPFS) && target) {\n return {\n uri: `${ipfsGateway}/${isIPNS ? 'ipns' : 'ipfs'}/${target}${subtarget}`,\n isOnChain: false,\n isEncoded: false,\n }\n }\n\n if (protocol === 'ar:/' && target) {\n return {\n uri: `${arweaveGateway}/${target}${subtarget || ''}`,\n isOnChain: false,\n isEncoded: false,\n }\n }\n\n let parsedUri = uri.replace(dataURIRegex, '')\n if (parsedUri.startsWith(' {\n try {\n const res = await fetch(uri).then((res) => res.json())\n const image = await parseAvatarUri({\n gatewayUrls,\n uri: getJsonImage(res),\n })\n return image\n } catch {\n throw new EnsAvatarUriResolutionError({ uri })\n }\n}\n\nexport type ParseAvatarUriErrorType =\n | ResolveAvatarUriErrorType\n | IsImageUriErrorType\n | EnsAvatarUriResolutionErrorType\n | ErrorType\n\nexport async function parseAvatarUri({\n gatewayUrls,\n uri,\n}: {\n gatewayUrls?: AssetGatewayUrls | undefined\n uri: string\n}): Promise {\n const { uri: resolvedURI, isOnChain } = resolveAvatarUri({ uri, gatewayUrls })\n if (isOnChain) return resolvedURI\n\n // check if resolvedURI is an image, if it is return the url\n const isImage = await isImageUri(resolvedURI)\n if (isImage) return resolvedURI\n\n throw new EnsAvatarUriResolutionError({ uri })\n}\n\ntype ParsedNft = {\n chainID: number\n namespace: string\n contractAddress: Address\n tokenID: string\n}\n\nexport type ParseNftUriErrorType = EnsAvatarInvalidNftUriErrorType | ErrorType\n\nexport function parseNftUri(uri_: string): ParsedNft {\n let uri = uri_\n // parse valid nft spec (CAIP-22/CAIP-29)\n // @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs\n if (uri.startsWith('did:nft:')) {\n // convert DID to CAIP\n uri = uri.replace('did:nft:', '').replace(/_/g, '/')\n }\n\n const [reference, asset_namespace, tokenID] = uri.split('/')\n const [eip_namespace, chainID] = reference.split(':')\n const [erc_namespace, contractAddress] = asset_namespace.split(':')\n\n if (!eip_namespace || eip_namespace.toLowerCase() !== 'eip155')\n throw new EnsAvatarInvalidNftUriError({ reason: 'Only EIP-155 supported' })\n if (!chainID)\n throw new EnsAvatarInvalidNftUriError({ reason: 'Chain ID not found' })\n if (!contractAddress)\n throw new EnsAvatarInvalidNftUriError({\n reason: 'Contract address not found',\n })\n if (!tokenID)\n throw new EnsAvatarInvalidNftUriError({ reason: 'Token ID not found' })\n if (!erc_namespace)\n throw new EnsAvatarInvalidNftUriError({ reason: 'ERC namespace not found' })\n\n return {\n chainID: Number.parseInt(chainID, 10),\n namespace: erc_namespace.toLowerCase(),\n contractAddress: contractAddress as Address,\n tokenID,\n }\n}\n\nexport type GetNftTokenUriErrorType =\n | ReadContractErrorType\n | EnsAvatarUnsupportedNamespaceErrorType\n | ErrorType\n\nexport async function getNftTokenUri(\n client: Client,\n { nft }: { nft: ParsedNft },\n) {\n if (nft.namespace === 'erc721') {\n return readContract(client, {\n address: nft.contractAddress,\n abi: [\n {\n name: 'tokenURI',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'tokenId', type: 'uint256' }],\n outputs: [{ name: '', type: 'string' }],\n },\n ],\n functionName: 'tokenURI',\n args: [BigInt(nft.tokenID)],\n })\n }\n if (nft.namespace === 'erc1155') {\n return readContract(client, {\n address: nft.contractAddress,\n abi: [\n {\n name: 'uri',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: '_id', type: 'uint256' }],\n outputs: [{ name: '', type: 'string' }],\n },\n ],\n functionName: 'uri',\n args: [BigInt(nft.tokenID)],\n })\n }\n throw new EnsAvatarUnsupportedNamespaceError({ namespace: nft.namespace })\n}\n","import type { Client } from '../../../clients/createClient.js'\nimport type { Transport } from '../../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../../errors/utils.js'\nimport type { Chain } from '../../../types/chain.js'\nimport type { AssetGatewayUrls } from '../../../types/ens.js'\n\nimport {\n type GetJsonImageErrorType,\n type GetMetadataAvatarUriErrorType,\n type GetNftTokenUriErrorType,\n getJsonImage,\n getMetadataAvatarUri,\n getNftTokenUri,\n type ParseAvatarUriErrorType,\n type ParseNftUriErrorType,\n parseAvatarUri,\n parseNftUri,\n type ResolveAvatarUriErrorType,\n resolveAvatarUri,\n} from './utils.js'\n\nexport type ParseAvatarRecordErrorType =\n | ParseNftAvatarUriErrorType\n | ParseAvatarUriErrorType\n | ErrorType\n\n/*\n * @description Parses an ENS avatar record.\n *\n * @example\n * parseAvatarRecord('eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063')\n * 'https://ipfs.io/ipfs/QmSP4nq9fnN9dAiCj42ug9Wa79rqmQerZXZch82VqpiH7U/image.gif'\n *\n * @see https://docs.ens.domains/web/avatars\n *\n */\nexport async function parseAvatarRecord(\n client: Client,\n {\n gatewayUrls,\n record,\n }: {\n gatewayUrls?: AssetGatewayUrls | undefined\n record: string\n },\n): Promise {\n if (/eip155:/i.test(record))\n return parseNftAvatarUri(client, { gatewayUrls, record })\n return parseAvatarUri({ uri: record, gatewayUrls })\n}\n\ntype ParseNftAvatarUriErrorType =\n | ParseNftUriErrorType\n | GetNftTokenUriErrorType\n | ResolveAvatarUriErrorType\n | ParseAvatarUriErrorType\n | GetJsonImageErrorType\n | GetMetadataAvatarUriErrorType\n | ErrorType\n\nasync function parseNftAvatarUri(\n client: Client,\n {\n gatewayUrls,\n record,\n }: {\n gatewayUrls?: AssetGatewayUrls | undefined\n record: string\n },\n): Promise {\n // parse NFT URI into properties\n const nft = parseNftUri(record)\n // fetch tokenURI from the NFT contract\n const nftUri = await getNftTokenUri(client, { nft })\n // resolve the URI from the fetched tokenURI\n const {\n uri: resolvedNftUri,\n isOnChain,\n isEncoded,\n } = resolveAvatarUri({ uri: nftUri, gatewayUrls })\n\n // if the resolved URI is on chain, return the data\n if (\n isOnChain &&\n (resolvedNftUri.includes('data:application/json;base64,') ||\n resolvedNftUri.startsWith('{'))\n ) {\n const encodedJson = isEncoded\n ? // if it is encoded, decode it\n atob(resolvedNftUri.replace('data:application/json;base64,', ''))\n : // if it isn't encoded assume it is a JSON string, but it could be anything (it will error if it is)\n resolvedNftUri\n\n const decoded = JSON.parse(encodedJson)\n return parseAvatarUri({ uri: getJsonImage(decoded), gatewayUrls })\n }\n\n let uriTokenId = nft.tokenID\n if (nft.namespace === 'erc1155')\n uriTokenId = uriTokenId.replace('0x', '').padStart(64, '0')\n\n return getMetadataAvatarUri({\n gatewayUrls,\n uri: resolvedNftUri.replace(/(?:0x)?{id}/, uriTokenId),\n })\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n textResolverAbi,\n universalResolverResolveAbi,\n} from '../../constants/abis.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js'\nimport { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'\nimport { type NamehashErrorType, namehash } from '../../utils/ens/namehash.js'\nimport {\n type PacketToBytesErrorType,\n packetToBytes,\n} from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractErrorType,\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsTextParameters = Prettify<\n Pick & {\n /** ENS name to get Text for. */\n name: string\n /** Universal Resolver gateway URLs to use for resolving CCIP-read requests. */\n gatewayUrls?: string[] | undefined\n /** Text record to retrieve. */\n key: string\n /** Whether or not to throw errors propagated from the ENS Universal Resolver Contract. */\n strict?: boolean | undefined\n /** Address of ENS Universal Resolver Contract. */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsTextReturnType = string | null\n\nexport type GetEnsTextErrorType =\n | GetChainContractAddressErrorType\n | ReadContractErrorType\n | ToHexErrorType\n | PacketToBytesErrorType\n | EncodeFunctionDataErrorType\n | NamehashErrorType\n | DecodeFunctionResultErrorType\n\n/**\n * Gets a text record for specified ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsTextParameters}\n * @returns Address for ENS resolver. {@link GetEnsTextReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsText, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const twitterRecord = await getEnsText(client, {\n * name: normalize('wevm.eth'),\n * key: 'com.twitter',\n * })\n * // 'wevm_dev'\n */\nexport async function getEnsText(\n client: Client,\n parameters: GetEnsTextParameters,\n): Promise {\n const { blockNumber, blockTag, key, name, gatewayUrls, strict } = parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n const tlds = chain?.ensTlds\n if (tlds && !tlds.some((tld) => name.endsWith(tld))) return null\n\n try {\n const readContractParameters = {\n address: universalResolverAddress,\n abi: universalResolverResolveAbi,\n args: [\n toHex(packetToBytes(name)),\n encodeFunctionData({\n abi: textResolverAbi,\n functionName: 'text',\n args: [namehash(name), key],\n }),\n gatewayUrls ?? [localBatchGatewayUrl],\n ],\n functionName: 'resolveWithGateways',\n blockNumber,\n blockTag,\n } as const\n\n const readContractAction = getAction(client, readContract, 'readContract')\n\n const res = await readContractAction(readContractParameters)\n\n if (res[0] === '0x') return null\n\n const record = decodeFunctionResult({\n abi: textResolverAbi,\n functionName: 'text',\n data: res[0],\n })\n\n return record === '' ? null : record\n } catch (err) {\n if (strict) throw err\n if (isNullUniversalResolverError(err)) return null\n throw err\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { AssetGatewayUrls } from '../../types/ens.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type ParseAvatarRecordErrorType,\n parseAvatarRecord,\n} from '../../utils/ens/avatar/parseAvatarRecord.js'\nimport { getAction } from '../../utils/getAction.js'\n\nimport {\n type GetEnsTextErrorType,\n type GetEnsTextParameters,\n getEnsText,\n} from './getEnsText.js'\n\nexport type GetEnsAvatarParameters = Prettify<\n Omit & {\n /** Gateway urls to resolve IPFS and/or Arweave assets. */\n assetGatewayUrls?: AssetGatewayUrls | undefined\n }\n>\n\nexport type GetEnsAvatarReturnType = string | null\n\nexport type GetEnsAvatarErrorType =\n | GetEnsTextErrorType\n | ParseAvatarRecordErrorType\n | ErrorType\n\n/**\n * Gets the avatar of an ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText) with `key` set to `'avatar'`.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsAvatarParameters}\n * @returns Avatar URI or `null` if not found. {@link GetEnsAvatarReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsAvatar, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAvatar = await getEnsAvatar(client, {\n * name: normalize('wevm.eth'),\n * })\n * // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio'\n */\nexport async function getEnsAvatar(\n client: Client,\n {\n blockNumber,\n blockTag,\n assetGatewayUrls,\n name,\n gatewayUrls,\n strict,\n universalResolverAddress,\n }: GetEnsAvatarParameters,\n): Promise {\n const record = await getAction(\n client,\n getEnsText,\n 'getEnsText',\n )({\n blockNumber,\n blockTag,\n key: 'avatar',\n name,\n universalResolverAddress,\n gatewayUrls,\n strict,\n })\n if (!record) return null\n try {\n return await parseAvatarRecord(client, {\n record,\n gatewayUrls: assetGatewayUrls,\n })\n } catch {\n return null\n }\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { universalResolverReverseAbi } from '../../constants/abis.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js'\nimport { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'\nimport type { PacketToBytesErrorType } from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractErrorType,\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsNameParameters = Prettify<\n Pick & {\n /**\n * Address to get ENS name for.\n */\n address: Address\n /**\n * ENSIP-9 compliant coinType (chain) to get ENS name for.\n *\n * To get the `coinType` for a chain id, use the `toCoinType` function:\n * ```ts\n * import { toCoinType } from 'viem'\n * import { base } from 'viem/chains'\n *\n * const coinType = toCoinType(base.id)\n * ```\n *\n * @default 60n\n */\n coinType?: bigint | undefined\n /**\n * Universal Resolver gateway URLs to use for resolving CCIP-read requests.\n */\n gatewayUrls?: string[] | undefined\n /**\n * Whether or not to throw errors propagated from the ENS Universal Resolver Contract.\n */\n strict?: boolean | undefined\n /**\n * Address of ENS Universal Resolver Contract.\n */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsNameReturnType = string | null\n\nexport type GetEnsNameErrorType =\n | GetChainContractAddressErrorType\n | ReadContractErrorType\n | PacketToBytesErrorType\n | ErrorType\n\n/**\n * Gets primary name for specified address.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsName\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `reverse(bytes)` on ENS Universal Resolver Contract to \"reverse resolve\" the address to the primary ENS name.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsNameParameters}\n * @returns Name or `null` if not found. {@link GetEnsNameReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsName } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensName = await getEnsName(client, {\n * address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n * })\n * // 'wevm.eth'\n */\nexport async function getEnsName(\n client: Client,\n parameters: GetEnsNameParameters,\n): Promise {\n const {\n address,\n blockNumber,\n blockTag,\n coinType = 60n,\n gatewayUrls,\n strict,\n } = parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n try {\n const readContractParameters = {\n address: universalResolverAddress,\n abi: universalResolverReverseAbi,\n args: [address, coinType, gatewayUrls ?? [localBatchGatewayUrl]],\n functionName: 'reverseWithGateways',\n blockNumber,\n blockTag,\n } as const\n\n const readContractAction = getAction(client, readContract, 'readContract')\n\n const [name] = await readContractAction(readContractParameters)\n\n return name || null\n } catch (err) {\n if (strict) throw err\n if (isNullUniversalResolverError(err)) return null\n throw err\n }\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'\nimport {\n type PacketToBytesErrorType,\n packetToBytes,\n} from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsResolverParameters = Prettify<\n Pick & {\n /** Name to get the address for. */\n name: string\n /** Address of ENS Universal Resolver Contract. */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsResolverReturnType = Address\n\nexport type GetEnsResolverErrorType =\n | GetChainContractAddressErrorType\n | ToHexErrorType\n | PacketToBytesErrorType\n | ErrorType\n\n/**\n * Gets resolver for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsResolverParameters}\n * @returns Address for ENS resolver. {@link GetEnsResolverReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsResolver, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const resolverAddress = await getEnsResolver(client, {\n * name: normalize('wevm.eth'),\n * })\n * // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41'\n */\nexport async function getEnsResolver(\n client: Client,\n parameters: GetEnsResolverParameters,\n): Promise {\n const { blockNumber, blockTag, name } = parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n const tlds = chain?.ensTlds\n if (tlds && !tlds.some((tld) => name.endsWith(tld)))\n throw new Error(\n `${name} is not a valid ENS TLD (${tlds?.join(', ')}) for chain \"${chain.name}\" (id: ${chain.id}).`,\n )\n\n const [resolverAddress] = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n address: universalResolverAddress,\n abi: [\n {\n inputs: [{ type: 'bytes' }],\n name: 'findResolver',\n outputs: [\n { type: 'address' },\n { type: 'bytes32' },\n { type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ],\n functionName: 'findResolver',\n args: [toHex(packetToBytes(name))],\n blockNumber,\n blockTag,\n })\n return resolverAddress\n}\n","import type { Abi, AbiEvent, Address } from 'abitype'\n\nimport {\n type GetEnsAddressParameters,\n type GetEnsAddressReturnType,\n getEnsAddress,\n} from '../../actions/ens/getEnsAddress.js'\nimport {\n type GetEnsAvatarParameters,\n type GetEnsAvatarReturnType,\n getEnsAvatar,\n} from '../../actions/ens/getEnsAvatar.js'\nimport {\n type GetEnsNameParameters,\n type GetEnsNameReturnType,\n getEnsName,\n} from '../../actions/ens/getEnsName.js'\nimport {\n type GetEnsResolverParameters,\n type GetEnsResolverReturnType,\n getEnsResolver,\n} from '../../actions/ens/getEnsResolver.js'\nimport {\n type GetEnsTextParameters,\n type GetEnsTextReturnType,\n getEnsText,\n} from '../../actions/ens/getEnsText.js'\nimport {\n type CallParameters,\n type CallReturnType,\n call,\n} from '../../actions/public/call.js'\nimport {\n type CreateAccessListParameters,\n type CreateAccessListReturnType,\n createAccessList,\n} from '../../actions/public/createAccessList.js'\nimport {\n type CreateBlockFilterReturnType,\n createBlockFilter,\n} from '../../actions/public/createBlockFilter.js'\nimport {\n type CreateContractEventFilterParameters,\n type CreateContractEventFilterReturnType,\n createContractEventFilter,\n} from '../../actions/public/createContractEventFilter.js'\nimport {\n type CreateEventFilterParameters,\n type CreateEventFilterReturnType,\n createEventFilter,\n} from '../../actions/public/createEventFilter.js'\nimport {\n type CreatePendingTransactionFilterReturnType,\n createPendingTransactionFilter,\n} from '../../actions/public/createPendingTransactionFilter.js'\nimport {\n type EstimateContractGasParameters,\n type EstimateContractGasReturnType,\n estimateContractGas,\n} from '../../actions/public/estimateContractGas.js'\nimport {\n type EstimateFeesPerGasParameters,\n type EstimateFeesPerGasReturnType,\n estimateFeesPerGas,\n} from '../../actions/public/estimateFeesPerGas.js'\nimport {\n type EstimateGasParameters,\n type EstimateGasReturnType,\n estimateGas,\n} from '../../actions/public/estimateGas.js'\nimport {\n type EstimateMaxPriorityFeePerGasParameters,\n type EstimateMaxPriorityFeePerGasReturnType,\n estimateMaxPriorityFeePerGas,\n} from '../../actions/public/estimateMaxPriorityFeePerGas.js'\nimport {\n type FillTransactionParameters,\n type FillTransactionReturnType,\n fillTransaction,\n} from '../../actions/public/fillTransaction.js'\nimport {\n type GetBalanceParameters,\n type GetBalanceReturnType,\n getBalance,\n} from '../../actions/public/getBalance.js'\nimport {\n type GetBlobBaseFeeReturnType,\n getBlobBaseFee,\n} from '../../actions/public/getBlobBaseFee.js'\nimport {\n type GetBlockParameters,\n type GetBlockReturnType,\n getBlock,\n} from '../../actions/public/getBlock.js'\nimport {\n type GetBlockNumberParameters,\n type GetBlockNumberReturnType,\n getBlockNumber,\n} from '../../actions/public/getBlockNumber.js'\nimport {\n type GetBlockTransactionCountParameters,\n type GetBlockTransactionCountReturnType,\n getBlockTransactionCount,\n} from '../../actions/public/getBlockTransactionCount.js'\nimport {\n type GetChainIdReturnType,\n getChainId,\n} from '../../actions/public/getChainId.js'\nimport {\n type GetCodeParameters,\n type GetCodeReturnType,\n getCode,\n} from '../../actions/public/getCode.js'\nimport {\n type GetContractEventsParameters,\n type GetContractEventsReturnType,\n getContractEvents,\n} from '../../actions/public/getContractEvents.js'\nimport {\n type GetDelegationParameters,\n type GetDelegationReturnType,\n getDelegation,\n} from '../../actions/public/getDelegation.js'\nimport {\n type GetEip712DomainParameters,\n type GetEip712DomainReturnType,\n getEip712Domain,\n} from '../../actions/public/getEip712Domain.js'\nimport {\n type GetFeeHistoryParameters,\n type GetFeeHistoryReturnType,\n getFeeHistory,\n} from '../../actions/public/getFeeHistory.js'\nimport {\n type GetFilterChangesParameters,\n type GetFilterChangesReturnType,\n getFilterChanges,\n} from '../../actions/public/getFilterChanges.js'\nimport {\n type GetFilterLogsParameters,\n type GetFilterLogsReturnType,\n getFilterLogs,\n} from '../../actions/public/getFilterLogs.js'\nimport {\n type GetGasPriceReturnType,\n getGasPrice,\n} from '../../actions/public/getGasPrice.js'\nimport {\n type GetLogsParameters,\n type GetLogsReturnType,\n getLogs,\n} from '../../actions/public/getLogs.js'\nimport {\n type GetProofParameters,\n type GetProofReturnType,\n getProof,\n} from '../../actions/public/getProof.js'\nimport {\n type GetStorageAtParameters,\n type GetStorageAtReturnType,\n getStorageAt,\n} from '../../actions/public/getStorageAt.js'\nimport {\n type GetTransactionParameters,\n type GetTransactionReturnType,\n getTransaction,\n} from '../../actions/public/getTransaction.js'\nimport {\n type GetTransactionConfirmationsParameters,\n type GetTransactionConfirmationsReturnType,\n getTransactionConfirmations,\n} from '../../actions/public/getTransactionConfirmations.js'\nimport {\n type GetTransactionCountParameters,\n type GetTransactionCountReturnType,\n getTransactionCount,\n} from '../../actions/public/getTransactionCount.js'\nimport {\n type GetTransactionReceiptParameters,\n type GetTransactionReceiptReturnType,\n getTransactionReceipt,\n} from '../../actions/public/getTransactionReceipt.js'\nimport {\n type MulticallParameters,\n type MulticallReturnType,\n multicall,\n} from '../../actions/public/multicall.js'\nimport {\n type ReadContractParameters,\n type ReadContractReturnType,\n readContract,\n} from '../../actions/public/readContract.js'\nimport {\n type SimulateBlocksParameters,\n type SimulateBlocksReturnType,\n simulateBlocks,\n} from '../../actions/public/simulateBlocks.js'\nimport {\n type SimulateCallsParameters,\n type SimulateCallsReturnType,\n simulateCalls,\n} from '../../actions/public/simulateCalls.js'\nimport {\n type SimulateContractParameters,\n type SimulateContractReturnType,\n simulateContract,\n} from '../../actions/public/simulateContract.js'\nimport {\n type UninstallFilterParameters,\n type UninstallFilterReturnType,\n uninstallFilter,\n} from '../../actions/public/uninstallFilter.js'\nimport {\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from '../../actions/public/verifyHash.js'\nimport {\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from '../../actions/public/verifyMessage.js'\nimport {\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from '../../actions/public/verifyTypedData.js'\nimport {\n type WaitForTransactionReceiptParameters,\n type WaitForTransactionReceiptReturnType,\n waitForTransactionReceipt,\n} from '../../actions/public/waitForTransactionReceipt.js'\nimport {\n type WatchBlockNumberParameters,\n type WatchBlockNumberReturnType,\n watchBlockNumber,\n} from '../../actions/public/watchBlockNumber.js'\nimport {\n type WatchBlocksParameters,\n type WatchBlocksReturnType,\n watchBlocks,\n} from '../../actions/public/watchBlocks.js'\nimport {\n type WatchContractEventParameters,\n type WatchContractEventReturnType,\n watchContractEvent,\n} from '../../actions/public/watchContractEvent.js'\nimport {\n type WatchEventParameters,\n type WatchEventReturnType,\n watchEvent,\n} from '../../actions/public/watchEvent.js'\nimport {\n type WatchPendingTransactionsParameters,\n type WatchPendingTransactionsReturnType,\n watchPendingTransactions,\n} from '../../actions/public/watchPendingTransactions.js'\nimport {\n type VerifySiweMessageParameters,\n type VerifySiweMessageReturnType,\n verifySiweMessage,\n} from '../../actions/siwe/verifySiweMessage.js'\nimport {\n type PrepareTransactionRequestParameters,\n type PrepareTransactionRequestRequest,\n type PrepareTransactionRequestReturnType,\n prepareTransactionRequest,\n} from '../../actions/wallet/prepareTransactionRequest.js'\nimport {\n type SendRawTransactionParameters,\n type SendRawTransactionReturnType,\n sendRawTransaction,\n} from '../../actions/wallet/sendRawTransaction.js'\nimport {\n type SendRawTransactionSyncParameters,\n type SendRawTransactionSyncReturnType,\n sendRawTransactionSync,\n} from '../../actions/wallet/sendRawTransactionSync.js'\nimport type { Account } from '../../types/account.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventName,\n ContractFunctionArgs,\n ContractFunctionName,\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { FeeValuesType } from '../../types/fee.js'\nimport type { FilterType } from '../../types/filter.js'\nimport type { Client } from '../createClient.js'\nimport type { Transport } from '../transports/createTransport.js'\n\nexport type PublicActions<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n> = {\n /**\n * Executes a new message call immediately without submitting a transaction to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/call\n * - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call)\n *\n * @param args - {@link CallParameters}\n * @returns The call data. {@link CallReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const data = await client.call({\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\n call: (parameters: CallParameters) => Promise\n /**\n * Creates an EIP-2930 access list that you can include in a transaction.\n *\n * - Docs: https://viem.sh/docs/actions/public/createAccessList\n * - JSON-RPC Methods: `eth_createAccessList`\n *\n * @param args - {@link CreateAccessListParameters}\n * @returns The call data. {@link CreateAccessListReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const data = await client.createAccessList({\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\n createAccessList: (\n parameters: CreateAccessListParameters,\n ) => Promise\n /**\n * Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createBlockFilter\n * - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter)\n *\n * @returns Filter. {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, createBlockFilter, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createBlockFilter(client)\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'block' }\n */\n createBlockFilter: () => Promise\n /**\n * Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs).\n *\n * - Docs: https://viem.sh/docs/contract/createContractEventFilter\n *\n * @param args - {@link CreateContractEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateContractEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createContractEventFilter({\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * })\n */\n createContractEventFilter: <\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined,\n args extends MaybeExtractEventArgsFromAbi | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: CreateContractEventFilterParameters<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >,\n ) => Promise<\n CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n >\n /**\n * Creates a [`Filter`](https://viem.sh/docs/glossary/types#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createEventFilter\n * - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter)\n *\n * @param args - {@link CreateEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createEventFilter({\n * address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * })\n */\n createEventFilter: <\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _EventName extends string | undefined = MaybeAbiEventName,\n _Args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n >(\n args?:\n | CreateEventFilterParameters<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _EventName,\n _Args\n >\n | undefined,\n ) => Promise<\n CreateEventFilterReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _EventName,\n _Args\n >\n >\n /**\n * Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter\n * - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter)\n *\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createPendingTransactionFilter()\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'transaction' }\n */\n createPendingTransactionFilter: () => Promise\n /**\n * Estimates the gas required to successfully execute a contract write function call.\n *\n * - Docs: https://viem.sh/docs/contract/estimateContractGas\n *\n * @remarks\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param args - {@link EstimateContractGasParameters}\n * @returns The gas estimate (in wei). {@link EstimateContractGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gas = await client.estimateContractGas({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint() public']),\n * functionName: 'mint',\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * })\n */\n estimateContractGas: <\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n >(\n args: EstimateContractGasParameters,\n ) => Promise\n /**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param args - {@link EstimateGasParameters}\n * @returns The gas estimate (in wei). {@link EstimateGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasEstimate = await client.estimateGas({\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\n estimateGas: (\n args: EstimateGasParameters,\n ) => Promise\n /**\n * Fills a transaction request with the necessary fields to be signed over.\n *\n * - Docs: https://viem.sh/docs/actions/public/fillTransaction\n *\n * @param client - Client to use\n * @param parameters - {@link FillTransactionParameters}\n * @returns The filled transaction. {@link FillTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await client.fillTransaction({\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\n fillTransaction: <\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | undefined = undefined,\n >(\n args: FillTransactionParameters<\n chain,\n account,\n chainOverride,\n accountOverride\n >,\n ) => Promise>\n /**\n * Returns the balance of an address in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBalance\n * - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance)\n *\n * @remarks\n * You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther).\n *\n * ```ts\n * const balance = await getBalance(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * blockTag: 'safe'\n * })\n * const balanceAsEther = formatEther(balance)\n * // \"6.942\"\n * ```\n *\n * @param args - {@link GetBalanceParameters}\n * @returns The balance of the address in wei. {@link GetBalanceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const balance = await client.getBalance({\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n * // 10000000000000000000000n (wei)\n */\n getBalance: (args: GetBalanceParameters) => Promise\n /**\n * Returns the base fee per blob gas in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlobBaseFee\n * - JSON-RPC Methods: [`eth_blobBaseFee`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blobBaseFee)\n *\n * @param client - Client to use\n * @returns The blob base fee (in wei). {@link GetBlobBaseFeeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlobBaseFee } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blobBaseFee = await client.getBlobBaseFee()\n */\n getBlobBaseFee: () => Promise\n /**\n * Returns information about a block at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlock\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`.\n *\n * @param args - {@link GetBlockParameters}\n * @returns Information about the block. {@link GetBlockReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await client.getBlock()\n */\n getBlock: <\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n >(\n args?: GetBlockParameters | undefined,\n ) => Promise>\n /**\n * Returns the number of the most recent block seen.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber)\n *\n * @param args - {@link GetBlockNumberParameters}\n * @returns The number of the block. {@link GetBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blockNumber = await client.getBlockNumber()\n * // 69420n\n */\n getBlockNumber: (\n args?: GetBlockNumberParameters | undefined,\n ) => Promise\n /**\n * Returns the number of Transactions at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`.\n *\n * @param args - {@link GetBlockTransactionCountParameters}\n * @returns The block transaction count. {@link GetBlockTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const count = await client.getBlockTransactionCount()\n */\n getBlockTransactionCount: (\n args?: GetBlockTransactionCountParameters | undefined,\n ) => Promise\n /** @deprecated Use `getCode` instead. */\n getBytecode: (args: GetCodeParameters) => Promise\n /**\n * Returns the chain ID associated with the current network.\n *\n * - Docs: https://viem.sh/docs/actions/public/getChainId\n * - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid)\n *\n * @returns The current chain ID. {@link GetChainIdReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const chainId = await client.getChainId()\n * // 1\n */\n getChainId: () => Promise\n /**\n * Retrieves the bytecode at an address.\n *\n * - Docs: https://viem.sh/docs/contract/getCode\n * - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode)\n *\n * @param args - {@link GetBytecodeParameters}\n * @returns The contract's bytecode. {@link GetBytecodeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await client.getCode({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * })\n */\n getCode: (args: GetCodeParameters) => Promise\n /**\n * Returns a list of event logs emitted by a contract.\n *\n * - Docs: https://viem.sh/docs/actions/public/getContractEvents\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetContractEventsParameters}\n * @returns A list of event logs. {@link GetContractEventsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { wagmiAbi } from './abi'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await client.getContractEvents(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: wagmiAbi,\n * eventName: 'Transfer'\n * })\n */\n getContractEvents: <\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: GetContractEventsParameters<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n ) => Promise<\n GetContractEventsReturnType\n >\n /**\n * Returns the address that an account has delegated to via EIP-7702.\n *\n * - Docs: https://viem.sh/docs/actions/public/getDelegation\n *\n * @param args - {@link GetDelegationParameters}\n * @returns The delegated address, or undefined if not delegated. {@link GetDelegationReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const delegation = await client.getDelegation({\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\n getDelegation: (\n args: GetDelegationParameters,\n ) => Promise\n /**\n * Reads the EIP-712 domain from a contract, based on the ERC-5267 specification.\n *\n * @param client - A {@link Client} instance.\n * @param parameters - The parameters of the action. {@link GetEip712DomainParameters}\n * @returns The EIP-712 domain, fields, and extensions. {@link GetEip712DomainReturnType}\n *\n * @example\n * ```ts\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const domain = await client.getEip712Domain({\n * address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * })\n * // {\n * // domain: {\n * // name: 'ExampleContract',\n * // version: '1',\n * // chainId: 1,\n * // verifyingContract: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * // },\n * // fields: '0x0f',\n * // extensions: [],\n * // }\n * ```\n */\n getEip712Domain: (\n args: GetEip712DomainParameters,\n ) => Promise\n /**\n * Gets address for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAddress\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsAddressParameters}\n * @returns Address for ENS name or `null` if not found. {@link GetEnsAddressReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAddress = await client.getEnsAddress({\n * name: normalize('wevm.eth'),\n * })\n * // '0xd2135CfB216b74109775236E36d4b433F1DF507B'\n */\n getEnsAddress: (\n args: GetEnsAddressParameters,\n ) => Promise\n /**\n * Gets the avatar of an ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText) with `key` set to `'avatar'`.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsAvatarParameters}\n * @returns Avatar URI or `null` if not found. {@link GetEnsAvatarReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAvatar = await client.getEnsAvatar({\n * name: normalize('wevm.eth'),\n * })\n * // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio'\n */\n getEnsAvatar: (\n args: GetEnsAvatarParameters,\n ) => Promise\n /**\n * Gets primary name for specified address.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsName\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `reverse(bytes)` on ENS Universal Resolver Contract to \"reverse resolve\" the address to the primary ENS name.\n *\n * @param args - {@link GetEnsNameParameters}\n * @returns Name or `null` if not found. {@link GetEnsNameReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensName = await client.getEnsName({\n * address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n * })\n * // 'wevm.eth'\n */\n getEnsName: (args: GetEnsNameParameters) => Promise\n /**\n * Gets resolver for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsResolverParameters}\n * @returns Address for ENS resolver. {@link GetEnsResolverReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const resolverAddress = await client.getEnsResolver({\n * name: normalize('wevm.eth'),\n * })\n * // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41'\n */\n getEnsResolver: (\n args: GetEnsResolverParameters,\n ) => Promise\n /**\n * Gets a text record for specified ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsTextParameters}\n * @returns Address for ENS resolver. {@link GetEnsTextReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const twitterRecord = await client.getEnsText({\n * name: normalize('wevm.eth'),\n * key: 'com.twitter',\n * })\n * // 'wevm_dev'\n */\n getEnsText: (args: GetEnsTextParameters) => Promise\n /**\n * Returns a collection of historical gas information.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFeeHistory\n * - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory)\n *\n * @param args - {@link GetFeeHistoryParameters}\n * @returns The gas estimate (in wei). {@link GetFeeHistoryReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const feeHistory = await client.getFeeHistory({\n * blockCount: 4,\n * rewardPercentiles: [25, 75],\n * })\n */\n getFeeHistory: (\n args: GetFeeHistoryParameters,\n ) => Promise\n /**\n * Returns an estimate for the fees per gas for a transaction to be included\n * in the next block.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateFeesPerGasParameters}\n * @returns An estimate (in wei) for the fees per gas. {@link EstimateFeesPerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await client.estimateFeesPerGas()\n * // { maxFeePerGas: ..., maxPriorityFeePerGas: ... }\n */\n estimateFeesPerGas: <\n chainOverride extends Chain | undefined = undefined,\n type extends FeeValuesType = 'eip1559',\n >(\n args?: EstimateFeesPerGasParameters | undefined,\n ) => Promise>\n /**\n * Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterChanges\n * - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges)\n *\n * @remarks\n * A Filter can be created from the following actions:\n *\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * Depending on the type of filter, the return value will be different:\n *\n * - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs.\n * - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes.\n * - If the filter was created with `createBlockFilter`, it returns a list of block hashes.\n *\n * @param args - {@link GetFilterChangesParameters}\n * @returns Logs or hashes. {@link GetFilterChangesReturnType}\n *\n * @example\n * // Blocks\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createBlockFilter()\n * const hashes = await client.getFilterChanges({ filter })\n *\n * @example\n * // Contract Events\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createContractEventFilter({\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * eventName: 'Transfer',\n * })\n * const logs = await client.getFilterChanges({ filter })\n *\n * @example\n * // Raw Events\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createEventFilter({\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await client.getFilterChanges({ filter })\n *\n * @example\n * // Transactions\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createPendingTransactionFilter()\n * const hashes = await client.getFilterChanges({ filter })\n */\n getFilterChanges: <\n filterType extends FilterType,\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: GetFilterChangesParameters<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n ) => Promise<\n GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n >\n /**\n * Returns a list of event logs since the filter was created.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterLogs\n * - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs)\n *\n * @remarks\n * `getFilterLogs` is only compatible with **event filters**.\n *\n * @param args - {@link GetFilterLogsParameters}\n * @returns A list of event logs. {@link GetFilterLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createEventFilter({\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await client.getFilterLogs({ filter })\n */\n getFilterLogs: <\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: GetFilterLogsParameters,\n ) => Promise<\n GetFilterLogsReturnType\n >\n /**\n * Returns the current price of gas (in wei).\n *\n * - Docs: https://viem.sh/docs/actions/public/getGasPrice\n * - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice)\n *\n * @returns The gas price (in wei). {@link GetGasPriceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasPrice = await client.getGasPrice()\n */\n getGasPrice: () => Promise\n /**\n * Returns a list of event logs matching the provided parameters.\n *\n * - Docs: https://viem.sh/docs/actions/public/getLogs\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/logs_event-logs\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param args - {@link GetLogsParameters}\n * @returns A list of event logs. {@link GetLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await client.getLogs()\n */\n getLogs: <\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args?:\n | GetLogsParameters\n | undefined,\n ) => Promise<\n GetLogsReturnType\n >\n /**\n * Returns the account and storage values of the specified account including the Merkle-proof.\n *\n * - Docs: https://viem.sh/docs/actions/public/getProof\n * - JSON-RPC Methods:\n * - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186)\n *\n * @param client - Client to use\n * @param parameters - {@link GetProofParameters}\n * @returns Proof data. {@link GetProofReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await client.getProof({\n * address: '0x...',\n * storageKeys: ['0x...'],\n * })\n */\n getProof: (args: GetProofParameters) => Promise\n /**\n * Returns an estimate for the max priority fee per gas (in wei) for a transaction\n * to be included in the next block.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas\n *\n * @param client - Client to use\n * @returns An estimate (in wei) for the max priority fee per gas. {@link EstimateMaxPriorityFeePerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await client.estimateMaxPriorityFeePerGas()\n * // 10000000n\n */\n estimateMaxPriorityFeePerGas: <\n chainOverride extends Chain | undefined = undefined,\n >(\n args?:\n | EstimateMaxPriorityFeePerGasParameters\n | undefined,\n ) => Promise\n /**\n * Returns the value from a storage slot at a given address.\n *\n * - Docs: https://viem.sh/docs/contract/getStorageAt\n * - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat)\n *\n * @param args - {@link GetStorageAtParameters}\n * @returns The value of the storage slot. {@link GetStorageAtReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getStorageAt } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await client.getStorageAt({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * slot: toHex(0),\n * })\n */\n getStorageAt: (\n args: GetStorageAtParameters,\n ) => Promise\n /**\n * Returns information about a [Transaction](https://viem.sh/docs/glossary/terms#transaction) given a hash or block identifier.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransaction\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash)\n *\n * @param args - {@link GetTransactionParameters}\n * @returns The transaction information. {@link GetTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transaction = await client.getTransaction({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n getTransaction: (\n args: GetTransactionParameters,\n ) => Promise>\n /**\n * Returns the number of blocks passed (confirmations) since the transaction was processed on a block.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations)\n *\n * @param args - {@link GetTransactionConfirmationsParameters}\n * @returns The number of blocks passed since the transaction was processed. If confirmations is 0, then the Transaction has not been confirmed & processed yet. {@link GetTransactionConfirmationsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const confirmations = await client.getTransactionConfirmations({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n getTransactionConfirmations: (\n args: GetTransactionConfirmationsParameters,\n ) => Promise\n /**\n * Returns the number of [Transactions](https://viem.sh/docs/glossary/terms#transaction) an Account has broadcast / sent.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionCount\n * - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount)\n *\n * @param args - {@link GetTransactionCountParameters}\n * @returns The number of transactions an account has sent. {@link GetTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionCount = await client.getTransactionCount({\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\n getTransactionCount: (\n args: GetTransactionCountParameters,\n ) => Promise\n /**\n * Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt)\n *\n * @param args - {@link GetTransactionReceiptParameters}\n * @returns The transaction receipt. {@link GetTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await client.getTransactionReceipt({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n getTransactionReceipt: (\n args: GetTransactionReceiptParameters,\n ) => Promise>\n /**\n * Similar to [`readContract`](https://viem.sh/docs/contract/readContract), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall).\n *\n * - Docs: https://viem.sh/docs/contract/multicall\n *\n * @param args - {@link MulticallParameters}\n * @returns An array of results with accompanying status. {@link MulticallReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const abi = parseAbi([\n * 'function balanceOf(address) view returns (uint256)',\n * 'function totalSupply() view returns (uint256)',\n * ])\n * const result = await client.multicall({\n * contracts: [\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * },\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'totalSupply',\n * },\n * ],\n * })\n * // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }]\n */\n multicall: <\n const contracts extends readonly unknown[],\n allowFailure extends boolean = true,\n >(\n args: MulticallParameters,\n ) => Promise>\n /**\n * Prepares a transaction request for signing.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest\n *\n * @param args - {@link PrepareTransactionRequestParameters}\n * @returns The transaction request. {@link PrepareTransactionRequestReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await client.prepareTransactionRequest({\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await client.prepareTransactionRequest({\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n */\n prepareTransactionRequest: <\n const request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n >,\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | undefined = undefined,\n >(\n args: PrepareTransactionRequestParameters<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >,\n ) => Promise<\n PrepareTransactionRequestReturnType<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >\n >\n /**\n * Calls a read-only function on a contract, and returns the response.\n *\n * - Docs: https://viem.sh/docs/contract/readContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_reading-contracts\n *\n * @remarks\n * A \"read-only\" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param args - {@link ReadContractParameters}\n * @returns The response from the contract. Type is inferred. {@link ReadContractReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { readContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await client.readContract({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // 424122n\n */\n readContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs,\n >(\n args: ReadContractParameters,\n ) => Promise>\n /**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction\n * - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction hash. {@link SendRawTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const hash = await client.sendRawTransaction({\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\n sendRawTransaction: (\n args: SendRawTransactionParameters,\n ) => Promise\n /**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransactionSync\n * - JSON-RPC Method: [`eth_sendRawTransactionSync`](https://eips.ethereum.org/EIPS/eip-7966)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionSyncParameters}\n * @returns The transaction receipt. {@link SendRawTransactionSyncReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransactionSync } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const receipt = await client.sendRawTransactionSync({\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\n sendRawTransactionSync: (\n args: SendRawTransactionSyncParameters,\n ) => Promise>\n /**\n * @deprecated Use `simulateBlocks` instead.\n */\n simulate: (\n args: SimulateBlocksParameters,\n ) => Promise>\n /**\n * Simulates a set of calls on block(s) with optional block and state overrides.\n *\n * @example\n * ```ts\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await client.simulateBlocks({\n * blocks: [{\n * blockOverrides: {\n * number: 69420n,\n * },\n * calls: [{\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * }],\n * stateOverrides: [{\n * address: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * balance: parseEther('10'),\n * }],\n * }]\n * })\n * ```\n *\n * @param client - Client to use.\n * @param parameters - {@link SimulateParameters}\n * @returns Simulated blocks. {@link SimulateReturnType}\n */\n simulateBlocks: (\n args: SimulateBlocksParameters,\n ) => Promise>\n /**\n * Simulates a set of calls.\n *\n * @example\n * ```ts\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await client.simulateCalls({\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * calls: [{\n * {\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * ]\n * })\n * ```\n *\n * @param client - Client to use.\n * @param parameters - {@link SimulateCallsParameters}\n * @returns Results. {@link SimulateCallsReturnType}\n */\n simulateCalls: (\n args: SimulateCallsParameters,\n ) => Promise>\n /**\n * Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions.\n *\n * - Docs: https://viem.sh/docs/contract/simulateContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_writing-to-contracts\n *\n * @remarks\n * This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract), but also supports contract write functions.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param args - {@link SimulateContractParameters}\n * @returns The simulation result and write request. {@link SimulateContractReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await client.simulateContract({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint(uint32) view returns (uint32)']),\n * functionName: 'mint',\n * args: ['69420'],\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\n simulateContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n chainOverride extends Chain | undefined,\n accountOverride extends Account | Address | undefined = undefined,\n >(\n args: SimulateContractParameters<\n abi,\n functionName,\n args,\n chain,\n chainOverride,\n accountOverride\n >,\n ) => Promise<\n SimulateContractReturnType<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride,\n accountOverride\n >\n >\n /**\n * Verify that a hash was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyHash}\n *\n * @param parameters - {@link VerifyHashParameters}\n * @returns Whether or not the signature is valid. {@link VerifyHashReturnType}\n */\n verifyHash: (args: VerifyHashParameters) => Promise\n /**\n * Verify that a message was signed by the provided address.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyMessage}\n *\n * @param parameters - {@link VerifyMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifyMessageReturnType}\n */\n verifyMessage: (\n args: VerifyMessageParameters,\n ) => Promise\n /**\n * Verifies [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) formatted message was signed.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/siwe/actions/verifySiweMessage}\n *\n * @param parameters - {@link VerifySiweMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifySiweMessageReturnType}\n */\n verifySiweMessage: (\n args: VerifySiweMessageParameters,\n ) => Promise\n /**\n * Verify that typed data was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyTypedData}\n *\n * @param parameters - {@link VerifyTypedDataParameters}\n * @returns Whether or not the signature is valid. {@link VerifyTypedDataReturnType}\n */\n verifyTypedData: (\n args: VerifyTypedDataParameters,\n ) => Promise\n /**\n * Destroys a Filter that was created from one of the following Actions:\n *\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * - Docs: https://viem.sh/docs/actions/public/uninstallFilter\n * - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter)\n *\n * @param args - {@link UninstallFilterParameters}\n * @returns A boolean indicating if the Filter was successfully uninstalled. {@link UninstallFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, uninstallFilter } from 'viem/public'\n *\n * const filter = await client.createPendingTransactionFilter()\n * const uninstalled = await client.uninstallFilter({ filter })\n * // true\n */\n uninstallFilter: (\n args: UninstallFilterParameters,\n ) => Promise\n /**\n * Waits for the [Transaction](https://viem.sh/docs/glossary/terms#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt). If the Transaction reverts, then the action will throw an error.\n *\n * - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_sending-transactions\n * - JSON-RPC Methods:\n * - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed.\n * - If a Transaction has been replaced:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions\n * - Checks if one of the Transactions is a replacement\n * - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt).\n *\n * @remarks\n * The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions).\n *\n * Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce.\n *\n * There are 3 types of Transaction Replacement reasons:\n *\n * - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`)\n * - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`)\n * - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`)\n *\n * @param args - {@link WaitForTransactionReceiptParameters}\n * @returns The transaction receipt. {@link WaitForTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await client.waitForTransactionReceipt({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n waitForTransactionReceipt: (\n args: WaitForTransactionReceiptParameters,\n ) => Promise>\n /**\n * Watches and returns incoming block numbers.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param args - {@link WatchBlockNumberParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await client.watchBlockNumber({\n * onBlockNumber: (blockNumber) => console.log(blockNumber),\n * })\n */\n watchBlockNumber: (\n args: WatchBlockNumberParameters,\n ) => WatchBlockNumberReturnType\n /**\n * Watches and returns information for incoming blocks.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlocks\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param args - {@link WatchBlocksParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlocksReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await client.watchBlocks({\n * onBlock: (block) => console.log(block),\n * })\n */\n watchBlocks: <\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n >(\n args: WatchBlocksParameters<\n transport,\n chain,\n includeTransactions,\n blockTag\n >,\n ) => WatchBlocksReturnType\n /**\n * Watches and returns emitted contract event logs.\n *\n * - Docs: https://viem.sh/docs/contract/watchContractEvent\n *\n * @remarks\n * This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent#onLogs).\n *\n * `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param args - {@link WatchContractEventParameters}\n * @returns A function that can be invoked to stop watching for new event logs. {@link WatchContractEventReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = client.watchContractEvent({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']),\n * eventName: 'Transfer',\n * args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' },\n * onLogs: (logs) => console.log(logs),\n * })\n */\n watchContractEvent: <\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName,\n strict extends boolean | undefined = undefined,\n >(\n args: WatchContractEventParameters,\n ) => WatchContractEventReturnType\n /**\n * Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms#event-log).\n *\n * - Docs: https://viem.sh/docs/actions/public/watchEvent\n * - JSON-RPC Methods:\n * - **RPC Provider supports `eth_newFilter`:**\n * - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize).\n * - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges).\n * - **RPC Provider does not support `eth_newFilter`:**\n * - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval.\n *\n * @remarks\n * This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent#onLogs).\n *\n * `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param args - {@link WatchEventParameters}\n * @returns A function that can be invoked to stop watching for new Event Logs. {@link WatchEventReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = client.watchEvent({\n * onLogs: (logs) => console.log(logs),\n * })\n */\n watchEvent: <\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n >(\n args: WatchEventParameters,\n ) => WatchEventReturnType\n /**\n * Watches and returns pending transaction hashes.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions\n * - JSON-RPC Methods:\n * - When `poll: true`\n * - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter.\n * - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newPendingTransactions\"` event.\n *\n * @remarks\n * This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions#ontransactions).\n *\n * @param args - {@link WatchPendingTransactionsParameters}\n * @returns A function that can be invoked to stop watching for new pending transaction hashes. {@link WatchPendingTransactionsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await client.watchPendingTransactions({\n * onTransactions: (hashes) => console.log(hashes),\n * })\n */\n watchPendingTransactions: (\n args: WatchPendingTransactionsParameters,\n ) => WatchPendingTransactionsReturnType\n}\n\nexport function publicActions<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n>(\n client: Client,\n): PublicActions {\n return {\n call: (args) => call(client, args),\n createAccessList: (args) => createAccessList(client, args),\n createBlockFilter: () => createBlockFilter(client),\n createContractEventFilter: (args) =>\n createContractEventFilter(client, args),\n createEventFilter: (args) => createEventFilter(client, args),\n createPendingTransactionFilter: () =>\n createPendingTransactionFilter(client),\n estimateContractGas: (args) => estimateContractGas(client, args as any),\n estimateGas: (args) => estimateGas(client, args),\n getBalance: (args) => getBalance(client, args),\n getBlobBaseFee: () => getBlobBaseFee(client),\n getBlock: (args) => getBlock(client, args),\n getBlockNumber: (args) => getBlockNumber(client, args),\n getBlockTransactionCount: (args) => getBlockTransactionCount(client, args),\n getBytecode: (args) => getCode(client, args),\n getChainId: () => getChainId(client),\n getCode: (args) => getCode(client, args),\n getContractEvents: (args) => getContractEvents(client, args),\n getDelegation: (args) => getDelegation(client, args),\n getEip712Domain: (args) => getEip712Domain(client, args),\n getEnsAddress: (args) => getEnsAddress(client, args),\n getEnsAvatar: (args) => getEnsAvatar(client, args),\n getEnsName: (args) => getEnsName(client, args),\n getEnsResolver: (args) => getEnsResolver(client, args),\n getEnsText: (args) => getEnsText(client, args),\n getFeeHistory: (args) => getFeeHistory(client, args),\n estimateFeesPerGas: (args) => estimateFeesPerGas(client, args),\n getFilterChanges: (args) => getFilterChanges(client, args),\n getFilterLogs: (args) => getFilterLogs(client, args),\n getGasPrice: () => getGasPrice(client),\n getLogs: (args) => getLogs(client, args as any),\n getProof: (args) => getProof(client, args),\n estimateMaxPriorityFeePerGas: (args) =>\n estimateMaxPriorityFeePerGas(client, args),\n fillTransaction: (args) => fillTransaction(client, args),\n getStorageAt: (args) => getStorageAt(client, args),\n getTransaction: (args) => getTransaction(client, args),\n getTransactionConfirmations: (args) =>\n getTransactionConfirmations(client, args),\n getTransactionCount: (args) => getTransactionCount(client, args),\n getTransactionReceipt: (args) => getTransactionReceipt(client, args),\n multicall: (args) => multicall(client, args),\n prepareTransactionRequest: (args) =>\n prepareTransactionRequest(client as any, args as any) as any,\n readContract: (args) => readContract(client, args),\n sendRawTransaction: (args) => sendRawTransaction(client, args),\n sendRawTransactionSync: (args) => sendRawTransactionSync(client, args),\n simulate: (args) => simulateBlocks(client, args),\n simulateBlocks: (args) => simulateBlocks(client, args),\n simulateCalls: (args) => simulateCalls(client, args),\n simulateContract: (args) => simulateContract(client, args),\n verifyHash: (args) => verifyHash(client, args),\n verifyMessage: (args) => verifyMessage(client, args),\n verifySiweMessage: (args) => verifySiweMessage(client, args),\n verifyTypedData: (args) => verifyTypedData(client, args),\n uninstallFilter: (args) => uninstallFilter(client, args),\n waitForTransactionReceipt: (args) =>\n waitForTransactionReceipt(client, args),\n watchBlocks: (args) => watchBlocks(client, args),\n watchBlockNumber: (args) => watchBlockNumber(client, args),\n watchContractEvent: (args) => watchContractEvent(client, args),\n watchEvent: (args) => watchEvent(client, args),\n watchPendingTransactions: (args) => watchPendingTransactions(client, args),\n }\n}\n","import type { Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RpcTransactionRequest } from '../../types/rpc.js'\nimport type { AccessList, TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial, Prettify, UnionOmit } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type GetCallErrorReturnType,\n getCallError,\n} from '../../utils/errors/getCallError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport type {\n AssertRequestErrorType,\n AssertRequestParameters,\n} from '../../utils/transaction/assertRequest.js'\nimport { assertRequest } from '../../utils/transaction/assertRequest.js'\n\nexport type CreateAccessListParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = UnionOmit<\n FormattedTransactionRequest,\n 'from' | 'nonce' | 'accessList'\n> & {\n /** Account attached to the call (msg.sender). */\n account?: Account | Address | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n )\n\nexport type CreateAccessListReturnType = Prettify<{\n accessList: AccessList\n gasUsed: bigint\n}>\n\nexport type CreateAccessListErrorType = GetCallErrorReturnType<\n | ParseAccountErrorType\n | AssertRequestErrorType\n | NumberToHexErrorType\n | FormatTransactionRequestErrorType\n | RequestErrorType\n>\n\n/**\n * Creates an EIP-2930 access list.\n *\n * - Docs: https://viem.sh/docs/actions/public/createAccessList\n * - JSON-RPC Methods: `eth_createAccessList`\n *\n * @param client - Client to use\n * @param parameters - {@link CreateAccessListParameters}\n * @returns The access list. {@link CreateAccessListReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createAccessList } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const data = await createAccessList(client, {\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\nexport async function createAccessList(\n client: Client,\n args: CreateAccessListParameters,\n): Promise {\n const {\n account: account_ = client.account,\n blockNumber,\n blockTag = 'latest',\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n ...rest\n } = args\n const account = account_ ? parseAccount(account_) : undefined\n\n try {\n assertRequest(args as AssertRequestParameters)\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account,\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n } as TransactionRequest,\n 'createAccessList',\n ) as TransactionRequest\n\n const response = await client.request({\n method: 'eth_createAccessList',\n params: [request as ExactPartial, block],\n })\n return {\n accessList: response.accessList,\n gasUsed: BigInt(response.gasUsed),\n }\n } catch (err) {\n throw getCallError(err as ErrorType, {\n ...args,\n account,\n chain: client.chain,\n })\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreateBlockFilterReturnType = Filter<'block'>\n\nexport type CreateBlockFilterErrorType = RequestErrorType | ErrorType\n\n/**\n * Creates a [`Filter`](https://viem.sh/docs/glossary/types#filter) to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createBlockFilter\n * - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter)\n *\n * @param client - Client to use\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createBlockFilter } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createBlockFilter(client)\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'block' }\n */\nexport async function createBlockFilter(\n client: Client,\n): Promise {\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newBlockFilter',\n })\n const id = await client.request({\n method: 'eth_newBlockFilter',\n })\n return { id, request: getRequest(id), type: 'block' }\n}\n","import type { AbiEvent, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Hex, LogTopic } from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreateEventFilterParameters<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n _args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n> = {\n address?: Address | Address[] | undefined\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n} & (MaybeExtractEventArgsFromAbi<\n abiEvents,\n _eventName\n> extends infer eventFilterArgs\n ?\n | {\n args:\n | eventFilterArgs\n | (_args extends eventFilterArgs ? _args : never)\n event: abiEvent\n events?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n args?: undefined\n event?: abiEvent | undefined\n events?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n args?: undefined\n event?: undefined\n events: abiEvents | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n args?: undefined\n event?: undefined\n events?: undefined\n strict?: undefined\n }\n : {\n args?: undefined\n event?: undefined\n events?: undefined\n strict?: undefined\n })\n\nexport type CreateEventFilterReturnType<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _eventName extends string | undefined = MaybeAbiEventName,\n _args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n> = Prettify<\n Filter<'event', abiEvents, _eventName, _args, strict, fromBlock, toBlock>\n>\n\nexport type CreateEventFilterErrorType =\n | EncodeEventTopicsErrorType\n | RequestErrorType\n | NumberToHexErrorType\n | ErrorType\n\n/**\n * Creates a [`Filter`](https://viem.sh/docs/glossary/types#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createEventFilter\n * - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter)\n *\n * @param client - Client to use\n * @param parameters - {@link CreateEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createEventFilter } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createEventFilter(client, {\n * address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * })\n */\nexport async function createEventFilter<\n chain extends Chain | undefined,\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _eventName extends string | undefined = MaybeAbiEventName,\n _args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n>(\n client: Client,\n {\n address,\n args,\n event,\n events: events_,\n fromBlock,\n strict,\n toBlock,\n }: CreateEventFilterParameters<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _eventName,\n _args\n > = {} as any,\n): Promise<\n CreateEventFilterReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _eventName,\n _args\n >\n> {\n const events = events_ ?? (event ? [event] : undefined)\n\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newFilter',\n })\n\n let topics: LogTopic[] = []\n if (events) {\n const encoded = (events as AbiEvent[]).flatMap((event) =>\n encodeEventTopics({\n abi: [event],\n eventName: (event as AbiEvent).name,\n args,\n } as EncodeEventTopicsParameters),\n )\n // TODO: Clean up type casting\n topics = [encoded as LogTopic]\n if (event) topics = topics[0] as LogTopic[]\n }\n\n const id: Hex = await client.request({\n method: 'eth_newFilter',\n params: [\n {\n address,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n ...(topics.length ? { topics } : {}),\n },\n ],\n })\n\n return {\n abi: events,\n args,\n eventName: event ? (event as AbiEvent).name : undefined,\n fromBlock,\n id,\n request: getRequest(id),\n strict: Boolean(strict),\n toBlock,\n type: 'event',\n } as unknown as CreateEventFilterReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _eventName,\n _args\n >\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreatePendingTransactionFilterReturnType = Filter<'transaction'>\n\nexport type CreatePendingTransactionFilterErrorType =\n | RequestErrorType\n | ErrorType\n\n/**\n * Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter\n * - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter)\n *\n * @param client - Client to use\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createPendingTransactionFilter(client)\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'transaction' }\n */\nexport async function createPendingTransactionFilter<\n transport extends Transport,\n chain extends Chain | undefined,\n>(\n client: Client,\n): Promise {\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newPendingTransactionFilter',\n })\n const id = await client.request({\n method: 'eth_newPendingTransactionFilter',\n })\n return { id, request: getRequest(id), type: 'transaction' }\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { multicall3Abi } from '../../constants/abis.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport { decodeFunctionResult } from '../../utils/abi/decodeFunctionResult.js'\nimport { encodeFunctionData } from '../../utils/abi/encodeFunctionData.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type CallParameters, call } from './call.js'\n\nexport type GetBalanceParameters = {\n /** The address of the account. */\n address: Address\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /** The balance of the account at a block tag. */\n blockTag?: BlockTag | undefined\n }\n)\n\nexport type GetBalanceReturnType = bigint\n\nexport type GetBalanceErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the balance of an address in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBalance\n * - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance)\n *\n * You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther).\n *\n * ```ts\n * const balance = await getBalance(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * blockTag: 'safe'\n * })\n * const balanceAsEther = formatEther(balance)\n * // \"6.942\"\n * ```\n *\n * @param client - Client to use\n * @param parameters - {@link GetBalanceParameters}\n * @returns The balance of the address in wei. {@link GetBalanceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBalance } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const balance = await getBalance(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n * // 10000000000000000000000n (wei)\n */\nexport async function getBalance(\n client: Client,\n {\n address,\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n }: GetBalanceParameters,\n): Promise {\n if (client.batch?.multicall && client.chain?.contracts?.multicall3) {\n const multicall3Address = client.chain.contracts.multicall3.address\n\n const calldata = encodeFunctionData({\n abi: multicall3Abi,\n functionName: 'getEthBalance',\n args: [address],\n })\n\n const { data } = await getAction(\n client,\n call,\n 'call',\n )({\n to: multicall3Address,\n data: calldata,\n blockNumber,\n blockTag,\n } as unknown as CallParameters)\n\n return decodeFunctionResult({\n abi: multicall3Abi,\n functionName: 'getEthBalance',\n args: [address],\n data: data || '0x',\n })\n }\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n\n const balance = await client.request({\n method: 'eth_getBalance',\n params: [address, blockNumberHex || blockTag],\n })\n return BigInt(balance)\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type GetBlobBaseFeeReturnType = bigint\n\nexport type GetBlobBaseFeeErrorType = RequestErrorType | ErrorType\n\n/**\n * Returns the base fee per blob gas in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlobBaseFee\n * - JSON-RPC Methods: [`eth_blobBaseFee`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blobBaseFee)\n *\n * @param client - Client to use\n * @returns The blob base fee (in wei). {@link GetBlobBaseFeeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlobBaseFee } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blobBaseFee = await getBlobBaseFee(client)\n */\nexport async function getBlobBaseFee<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client,\n): Promise {\n const baseFee = await client.request({\n method: 'eth_blobBaseFee',\n })\n return BigInt(baseFee)\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { Quantity } from '../../types/rpc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetBlockTransactionCountParameters =\n | {\n /** Hash of the block. */\n blockHash?: Hash | undefined\n blockNumber?: undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n blockNumber?: undefined\n /** The block tag. Defaults to 'latest'. */\n blockTag?: BlockTag | undefined\n }\n\nexport type GetBlockTransactionCountReturnType = number\n\nexport type GetBlockTransactionCountErrorType =\n | NumberToHexErrorType\n | HexToNumberErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the number of Transactions at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`.\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockTransactionCountParameters}\n * @returns The block transaction count. {@link GetBlockTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlockTransactionCount } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const count = await getBlockTransactionCount(client)\n */\nexport async function getBlockTransactionCount(\n client: Client,\n {\n blockHash,\n blockNumber,\n blockTag = 'latest',\n }: GetBlockTransactionCountParameters = {},\n): Promise {\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let count: Quantity\n if (blockHash) {\n count = await client.request(\n {\n method: 'eth_getBlockTransactionCountByHash',\n params: [blockHash],\n },\n { dedupe: true },\n )\n } else {\n count = await client.request(\n {\n method: 'eth_getBlockTransactionCountByNumber',\n params: [blockNumberHex || blockTag],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n }\n\n return hexToNumber(count)\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetCodeParameters = {\n address: Address\n} & (\n | {\n blockNumber?: undefined\n blockTag?: BlockTag | undefined\n }\n | {\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\n\nexport type GetCodeReturnType = Hex | undefined\n\nexport type GetCodeErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Retrieves the bytecode at an address.\n *\n * - Docs: https://viem.sh/docs/contract/getCode\n * - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode)\n *\n * @param client - Client to use\n * @param parameters - {@link GetCodeParameters}\n * @returns The contract's bytecode. {@link GetCodeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getCode } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await getCode(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * })\n */\nexport async function getCode(\n client: Client,\n { address, blockNumber, blockTag = 'latest' }: GetCodeParameters,\n): Promise {\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n const hex = await client.request(\n {\n method: 'eth_getCode',\n params: [address, blockNumberHex || blockTag],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n if (hex === '0x') return undefined\n return hex\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport {\n type GetAddressErrorType,\n getAddress,\n} from '../../utils/address/getAddress.js'\nimport { type SizeErrorType, size } from '../../utils/data/size.js'\nimport { type SliceErrorType, slice } from '../../utils/data/slice.js'\nimport { type GetCodeErrorType, getCode } from './getCode.js'\n\nexport type GetDelegationParameters = {\n /** The address to check for delegation. */\n address: Address\n} & (\n | {\n blockNumber?: undefined\n blockTag?: BlockTag | undefined\n }\n | {\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\n\nexport type GetDelegationReturnType = Address | undefined\n\nexport type GetDelegationErrorType =\n | GetAddressErrorType\n | GetCodeErrorType\n | SliceErrorType\n | SizeErrorType\n | ErrorType\n\n/**\n * Returns the address that an account has delegated to via EIP-7702.\n *\n * - Docs: https://viem.sh/docs/actions/public/getDelegation\n *\n * @param client - Client to use\n * @param parameters - {@link GetDelegationParameters}\n * @returns The delegated address, or undefined if not delegated. {@link GetDelegationReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getDelegation } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const delegation = await getDelegation(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function getDelegation(\n client: Client,\n { address, blockNumber, blockTag = 'latest' }: GetDelegationParameters,\n): Promise {\n const code = await getCode(client, {\n address,\n ...(blockNumber !== undefined ? { blockNumber } : { blockTag }),\n } as GetDelegationParameters)\n\n if (!code) return undefined\n\n // EIP-7702 delegation designator: 0xef0100 prefix (3 bytes) + address (20 bytes) = 23 bytes\n if (size(code) !== 23) return undefined\n\n // Check for EIP-7702 delegation designator prefix\n if (!code.startsWith('0xef0100')) return undefined\n\n // Extract the delegated address (bytes 3-23) and checksum it\n return getAddress(slice(code, 3, 23))\n}\n","import type { Address } from 'abitype'\nimport { BaseError } from './base.js'\n\nexport type Eip712DomainNotFoundErrorType = Eip712DomainNotFoundError & {\n name: 'Eip712DomainNotFoundError'\n}\nexport class Eip712DomainNotFoundError extends BaseError {\n constructor({ address }: { address: Address }) {\n super(`No EIP-712 domain found on contract \"${address}\".`, {\n metaMessages: [\n 'Ensure that:',\n `- The contract is deployed at the address \"${address}\".`,\n '- `eip712Domain()` function exists on the contract.',\n '- `eip712Domain()` function matches signature to ERC-5267 specification.',\n ],\n name: 'Eip712DomainNotFoundError',\n })\n }\n}\n","import type { Address, TypedDataDomain } from 'abitype'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n Eip712DomainNotFoundError,\n type Eip712DomainNotFoundErrorType,\n} from '../../errors/eip712.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RequiredBy } from '../../types/utils.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractErrorType,\n type ReadContractParameters,\n readContract,\n} from './readContract.js'\n\nexport type GetEip712DomainParameters = {\n address: Address\n} & Pick\n\nexport type GetEip712DomainReturnType = {\n domain: RequiredBy<\n TypedDataDomain,\n 'chainId' | 'name' | 'verifyingContract' | 'salt' | 'version'\n >\n fields: Hex\n extensions: readonly bigint[]\n}\n\nexport type GetEip712DomainErrorType =\n | Eip712DomainNotFoundErrorType\n | ReadContractErrorType\n | ErrorType\n\n/**\n * Reads the EIP-712 domain from a contract, based on the ERC-5267 specification.\n *\n * @param client - A {@link Client} instance.\n * @param parameters - The parameters of the action. {@link GetEip712DomainParameters}\n * @returns The EIP-712 domain, fields, and extensions. {@link GetEip712DomainReturnType}\n *\n * @example\n * ```ts\n * import { createPublicClient, http, getEip712Domain } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const domain = await getEip712Domain(client, {\n * address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * })\n * // {\n * // domain: {\n * // name: 'ExampleContract',\n * // version: '1',\n * // chainId: 1,\n * // verifyingContract: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * // },\n * // fields: '0x0f',\n * // extensions: [],\n * // }\n * ```\n */\nexport async function getEip712Domain(\n client: Client,\n parameters: GetEip712DomainParameters,\n): Promise {\n const { address, factory, factoryData } = parameters\n\n try {\n const [\n fields,\n name,\n version,\n chainId,\n verifyingContract,\n salt,\n extensions,\n ] = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n abi,\n address,\n functionName: 'eip712Domain',\n factory,\n factoryData,\n })\n\n return {\n domain: {\n name,\n version,\n chainId: Number(chainId),\n verifyingContract,\n salt,\n },\n extensions,\n fields,\n }\n } catch (e) {\n const error = e as ReadContractErrorType\n if (\n error.name === 'ContractFunctionExecutionError' &&\n error.cause.name === 'ContractFunctionZeroDataError'\n ) {\n throw new Eip712DomainNotFoundError({ address })\n }\n throw error\n }\n}\n\nconst abi = [\n {\n inputs: [],\n name: 'eip712Domain',\n outputs: [\n { name: 'fields', type: 'bytes1' },\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n { name: 'salt', type: 'bytes32' },\n { name: 'extensions', type: 'uint256[]' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { FeeHistory } from '../../types/fee.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormatFeeHistoryErrorType,\n formatFeeHistory,\n} from '../../utils/formatters/feeHistory.js'\n\nexport type GetFeeHistoryParameters = {\n /**\n * Number of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. Less than requested may be returned if not all blocks are available.\n */\n blockCount: number\n /**\n * A monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used.\n */\n rewardPercentiles: number[]\n} & (\n | {\n blockNumber?: undefined\n /**\n * Highest number block of the requested range.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n | {\n /** Highest number block of the requested range. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\nexport type GetFeeHistoryReturnType = FeeHistory\n\nexport type GetFeeHistoryErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | FormatFeeHistoryErrorType\n\n/**\n * Returns a collection of historical gas information.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFeeHistory\n * - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory)\n *\n * @param client - Client to use\n * @param parameters - {@link GetFeeHistoryParameters}\n * @returns The gas estimate (in wei). {@link GetFeeHistoryReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getFeeHistory } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const feeHistory = await getFeeHistory(client, {\n * blockCount: 4,\n * rewardPercentiles: [25, 75],\n * })\n */\nexport async function getFeeHistory(\n client: Client,\n {\n blockCount,\n blockNumber,\n blockTag = 'latest',\n rewardPercentiles,\n }: GetFeeHistoryParameters,\n): Promise {\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const feeHistory = await client.request(\n {\n method: 'eth_feeHistory',\n params: [\n numberToHex(blockCount),\n blockNumberHex || blockTag,\n rewardPercentiles,\n ],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n return formatFeeHistory(feeHistory)\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { FeeHistory } from '../../types/fee.js'\nimport type { RpcFeeHistory } from '../../types/rpc.js'\n\nexport type FormatFeeHistoryErrorType = ErrorType\n\nexport function formatFeeHistory(feeHistory: RpcFeeHistory): FeeHistory {\n return {\n baseFeePerGas: feeHistory.baseFeePerGas.map((value) => BigInt(value)),\n gasUsedRatio: feeHistory.gasUsedRatio,\n oldestBlock: BigInt(feeHistory.oldestBlock),\n reward: feeHistory.reward?.map((reward) =>\n reward.map((value) => BigInt(value)),\n ),\n }\n}\n","import type { Abi, AbiEvent, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetFilterLogsParameters<\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n filter: Filter<'event', abi, eventName, any, strict, fromBlock, toBlock>\n}\nexport type GetFilterLogsReturnType<\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _AbiEvent extends AbiEvent | undefined = abi extends Abi\n ? eventName extends string\n ? ExtractAbiEvent\n : undefined\n : undefined,\n _Pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log[]\n\nexport type GetFilterLogsErrorType =\n | RequestErrorType\n | DecodeEventLogErrorType\n | FormatLogErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs since the filter was created.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterLogs\n * - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs)\n *\n * `getFilterLogs` is only compatible with **event filters**.\n *\n * @param client - Client to use\n * @param parameters - {@link GetFilterLogsParameters}\n * @returns A list of event logs. {@link GetFilterLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createEventFilter, getFilterLogs } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await getFilterLogs(client, { filter })\n */\nexport async function getFilterLogs<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n _client: Client,\n {\n filter,\n }: GetFilterLogsParameters,\n): Promise<\n GetFilterLogsReturnType\n> {\n const strict = filter.strict ?? false\n\n const logs = await filter.request({\n method: 'eth_getFilterLogs',\n params: [filter.id],\n })\n\n const formattedLogs = logs.map((log) => formatLog(log))\n if (!filter.abi)\n return formattedLogs as GetFilterLogsReturnType<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: filter.abi,\n logs: formattedLogs,\n strict,\n }) as unknown as GetFilterLogsReturnType<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Address } from 'abitype'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { Proof } from '../../types/proof.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormatProofErrorType,\n formatProof,\n} from '../../utils/formatters/proof.js'\n\nexport type GetProofParameters = {\n /** Account address. */\n address: Address\n /** Array of storage-keys that should be proofed and included. */\n storageKeys: Hash[]\n} & (\n | {\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n)\n\nexport type GetProofReturnType = Proof\n\nexport type GetProofErrorType =\n | NumberToHexErrorType\n | FormatProofErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the account and storage values of the specified account including the Merkle-proof.\n *\n * - Docs: https://viem.sh/docs/actions/public/getProof\n * - JSON-RPC Methods:\n * - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186)\n *\n * @param client - Client to use\n * @param parameters - {@link GetProofParameters}\n * @returns Proof data. {@link GetProofReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getProof } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await getProof(client, {\n * address: '0x...',\n * storageKeys: ['0x...'],\n * })\n */\nexport async function getProof(\n client: Client,\n {\n address,\n blockNumber,\n blockTag: blockTag_,\n storageKeys,\n }: GetProofParameters,\n): Promise {\n const blockTag = blockTag_ ?? 'latest'\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n const proof = await client.request({\n method: 'eth_getProof',\n params: [address, storageKeys, blockNumberHex || blockTag],\n })\n\n return formatProof(proof)\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport { type GetAddressErrorType, getAddress } from '../address/getAddress.js'\nimport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from '../address/isAddressEqual.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n type RecoverAuthorizationAddressParameters,\n recoverAuthorizationAddress,\n} from './recoverAuthorizationAddress.js'\n\nexport type VerifyAuthorizationParameters =\n RecoverAuthorizationAddressParameters & {\n /** The address that signed the Authorization object. */\n address: Address\n }\n\nexport type VerifyAuthorizationReturnType = boolean\n\nexport type VerifyAuthorizationErrorType =\n | IsAddressEqualErrorType\n | GetAddressErrorType\n | RecoverAuthorizationAddressErrorType\n | ErrorType\n\n/**\n * Verify that an Authorization object was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/utilities/verifyAuthorization}\n *\n * @param parameters - {@link VerifyAuthorizationParameters}\n * @returns Whether or not the signature is valid. {@link VerifyAuthorizationReturnType}\n */\nexport async function verifyAuthorization({\n address,\n authorization,\n signature,\n}: VerifyAuthorizationParameters): Promise {\n return isAddressEqual(\n getAddress(address),\n await recoverAuthorizationAddress({\n authorization,\n signature,\n }),\n )\n}\n","import { BaseError } from '../errors/base.js'\nimport {\n HttpRequestError,\n type HttpRequestErrorType,\n type RpcRequestErrorType,\n type TimeoutErrorType,\n type WebSocketRequestErrorType,\n} from '../errors/request.js'\nimport {\n AtomicityNotSupportedError,\n type AtomicityNotSupportedErrorType,\n AtomicReadyWalletRejectedUpgradeError,\n type AtomicReadyWalletRejectedUpgradeErrorType,\n BundleTooLargeError,\n type BundleTooLargeErrorType,\n ChainDisconnectedError,\n type ChainDisconnectedErrorType,\n DuplicateIdError,\n type DuplicateIdErrorType,\n InternalRpcError,\n type InternalRpcErrorType,\n InvalidInputRpcError,\n type InvalidInputRpcErrorType,\n InvalidParamsRpcError,\n type InvalidParamsRpcErrorType,\n InvalidRequestRpcError,\n type InvalidRequestRpcErrorType,\n JsonRpcVersionUnsupportedError,\n type JsonRpcVersionUnsupportedErrorType,\n LimitExceededRpcError,\n type LimitExceededRpcErrorType,\n MethodNotFoundRpcError,\n type MethodNotFoundRpcErrorType,\n MethodNotSupportedRpcError,\n type MethodNotSupportedRpcErrorType,\n ParseRpcError,\n type ParseRpcErrorType,\n ProviderDisconnectedError,\n type ProviderDisconnectedErrorType,\n type ProviderRpcErrorCode,\n ResourceNotFoundRpcError,\n type ResourceNotFoundRpcErrorType,\n ResourceUnavailableRpcError,\n type ResourceUnavailableRpcErrorType,\n type RpcError,\n type RpcErrorCode,\n type RpcErrorType,\n SwitchChainError,\n type SwitchChainErrorType,\n TransactionRejectedRpcError,\n type TransactionRejectedRpcErrorType,\n UnauthorizedProviderError,\n type UnauthorizedProviderErrorType,\n UnknownBundleIdError,\n type UnknownBundleIdErrorType,\n UnknownRpcError,\n type UnknownRpcErrorType,\n UnsupportedChainIdError,\n type UnsupportedChainIdErrorType,\n UnsupportedNonOptionalCapabilityError,\n type UnsupportedNonOptionalCapabilityErrorType,\n UnsupportedProviderMethodError,\n type UnsupportedProviderMethodErrorType,\n UserRejectedRequestError,\n type UserRejectedRequestErrorType,\n WalletConnectSessionSettlementError,\n type WalletConnectSessionSettlementErrorType,\n} from '../errors/rpc.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type {\n EIP1193RequestFn,\n EIP1193RequestOptions,\n} from '../types/eip1193.js'\nimport { stringToHex } from './encoding/toHex.js'\nimport type { CreateBatchSchedulerErrorType } from './promise/createBatchScheduler.js'\nimport { withDedupe } from './promise/withDedupe.js'\nimport { type WithRetryErrorType, withRetry } from './promise/withRetry.js'\nimport type { GetSocketRpcClientErrorType } from './rpc/socket.js'\nimport { stringify } from './stringify.js'\n\nexport type RequestErrorType =\n | AtomicityNotSupportedErrorType\n | AtomicReadyWalletRejectedUpgradeErrorType\n | BundleTooLargeErrorType\n | ChainDisconnectedErrorType\n | CreateBatchSchedulerErrorType\n | DuplicateIdErrorType\n | HttpRequestErrorType\n | InternalRpcErrorType\n | InvalidInputRpcErrorType\n | InvalidParamsRpcErrorType\n | InvalidRequestRpcErrorType\n | GetSocketRpcClientErrorType\n | JsonRpcVersionUnsupportedErrorType\n | LimitExceededRpcErrorType\n | MethodNotFoundRpcErrorType\n | MethodNotSupportedRpcErrorType\n | ParseRpcErrorType\n | ProviderDisconnectedErrorType\n | ResourceNotFoundRpcErrorType\n | ResourceUnavailableRpcErrorType\n | RpcErrorType\n | RpcRequestErrorType\n | SwitchChainErrorType\n | TimeoutErrorType\n | TransactionRejectedRpcErrorType\n | UnauthorizedProviderErrorType\n | UnknownBundleIdErrorType\n | UnknownRpcErrorType\n | UnsupportedChainIdErrorType\n | UnsupportedNonOptionalCapabilityErrorType\n | UnsupportedProviderMethodErrorType\n | UserRejectedRequestErrorType\n | WalletConnectSessionSettlementErrorType\n | WebSocketRequestErrorType\n | WithRetryErrorType\n | ErrorType\n\nexport function buildRequest Promise>(\n request: request,\n options: EIP1193RequestOptions = {},\n): EIP1193RequestFn {\n return async (args, overrideOptions = {}) => {\n const {\n dedupe = false,\n methods,\n retryDelay = 150,\n retryCount = 3,\n uid,\n } = {\n ...options,\n ...overrideOptions,\n }\n\n const { method } = args\n if (methods?.exclude?.includes(method))\n throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n method,\n })\n if (methods?.include && !methods.include.includes(method))\n throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n method,\n })\n\n const requestId = dedupe\n ? stringToHex(`${uid}.${stringify(args)}`)\n : undefined\n return withDedupe(\n () =>\n withRetry(\n async () => {\n try {\n return await request(args)\n } catch (err_) {\n const err = err_ as unknown as RpcError<\n RpcErrorCode | ProviderRpcErrorCode\n >\n switch (err.code) {\n // -32700\n case ParseRpcError.code:\n throw new ParseRpcError(err)\n // -32600\n case InvalidRequestRpcError.code:\n throw new InvalidRequestRpcError(err)\n // -32601\n case MethodNotFoundRpcError.code:\n throw new MethodNotFoundRpcError(err, { method: args.method })\n // -32602\n case InvalidParamsRpcError.code:\n throw new InvalidParamsRpcError(err)\n // -32603\n case InternalRpcError.code:\n throw new InternalRpcError(err)\n // -32000\n case InvalidInputRpcError.code:\n throw new InvalidInputRpcError(err)\n // -32001\n case ResourceNotFoundRpcError.code:\n throw new ResourceNotFoundRpcError(err)\n // -32002\n case ResourceUnavailableRpcError.code:\n throw new ResourceUnavailableRpcError(err)\n // -32003\n case TransactionRejectedRpcError.code:\n throw new TransactionRejectedRpcError(err)\n // -32004\n case MethodNotSupportedRpcError.code:\n throw new MethodNotSupportedRpcError(err, {\n method: args.method,\n })\n // -32005\n case LimitExceededRpcError.code:\n throw new LimitExceededRpcError(err)\n // -32006\n case JsonRpcVersionUnsupportedError.code:\n throw new JsonRpcVersionUnsupportedError(err)\n\n // 4001\n case UserRejectedRequestError.code:\n throw new UserRejectedRequestError(err)\n // 4100\n case UnauthorizedProviderError.code:\n throw new UnauthorizedProviderError(err)\n // 4200\n case UnsupportedProviderMethodError.code:\n throw new UnsupportedProviderMethodError(err)\n // 4900\n case ProviderDisconnectedError.code:\n throw new ProviderDisconnectedError(err)\n // 4901\n case ChainDisconnectedError.code:\n throw new ChainDisconnectedError(err)\n // 4902\n case SwitchChainError.code:\n throw new SwitchChainError(err)\n\n // 5700\n case UnsupportedNonOptionalCapabilityError.code:\n throw new UnsupportedNonOptionalCapabilityError(err)\n // 5710\n case UnsupportedChainIdError.code:\n throw new UnsupportedChainIdError(err)\n // 5720\n case DuplicateIdError.code:\n throw new DuplicateIdError(err)\n // 5730\n case UnknownBundleIdError.code:\n throw new UnknownBundleIdError(err)\n // 5740\n case BundleTooLargeError.code:\n throw new BundleTooLargeError(err)\n // 5750\n case AtomicReadyWalletRejectedUpgradeError.code:\n throw new AtomicReadyWalletRejectedUpgradeError(err)\n // 5760\n case AtomicityNotSupportedError.code:\n throw new AtomicityNotSupportedError(err)\n\n // CAIP-25: User Rejected Error\n // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes#rejected-caip-25\n case 5000:\n throw new UserRejectedRequestError(err)\n\n // WalletConnect: Session Settlement Failed\n // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes\n case WalletConnectSessionSettlementError.code:\n throw new WalletConnectSessionSettlementError(err)\n\n default:\n if (err_ instanceof BaseError) throw err_\n throw new UnknownRpcError(err as Error)\n }\n }\n },\n {\n delay: ({ count, error }) => {\n // If we find a Retry-After header, let's retry after the given time.\n if (error && error instanceof HttpRequestError) {\n const retryAfter = error?.headers?.get('Retry-After')\n if (retryAfter?.match(/\\d/))\n return Number.parseInt(retryAfter, 10) * 1000\n }\n\n // Otherwise, let's retry with an exponential backoff.\n return ~~(1 << count) * retryDelay\n },\n retryCount,\n shouldRetry: ({ error }) => shouldRetry(error),\n },\n ),\n { enabled: dedupe, id: requestId },\n )\n }\n}\n\n/** @internal */\nexport function shouldRetry(error: Error) {\n if ('code' in error && typeof error.code === 'number') {\n if (error.code === -1) return true // Unknown error\n if (error.code === LimitExceededRpcError.code) return true\n if (error.code === InternalRpcError.code) return true\n return false\n }\n if (error instanceof HttpRequestError && error.status) {\n // Forbidden\n if (error.status === 403) return true\n // Request Timeout\n if (error.status === 408) return true\n // Request Entity Too Large\n if (error.status === 413) return true\n // Too Many Requests\n if (error.status === 429) return true\n // Internal Server Error\n if (error.status === 500) return true\n // Bad Gateway\n if (error.status === 502) return true\n // Service Unavailable\n if (error.status === 503) return true\n // Gateway Timeout\n if (error.status === 504) return true\n return false\n }\n return true\n}\n","import { LruMap } from '../lru.js'\n\n/** @internal */\nexport const promiseCache = /*#__PURE__*/ new LruMap>(8192)\n\ntype WithDedupeOptions = {\n enabled?: boolean | undefined\n id?: string | undefined\n}\n\n/** Deduplicates in-flight promises. */\nexport function withDedupe(\n fn: () => Promise,\n { enabled = true, id }: WithDedupeOptions,\n): Promise {\n if (!enabled || !id) return fn()\n if (promiseCache.get(id)) return promiseCache.get(id)!\n const promise = fn().finally(() => promiseCache.delete(id))\n promiseCache.set(id, promise)\n return promise\n}\n","import type { Chain, ChainFormatters } from '../../types/chain.js'\nimport type { Assign, Prettify } from '../../types/utils.js'\n\nexport type DefineChainReturnType = Prettify<\n chain &\n (chain['extendSchema'] extends Record\n ? {\n extend: (\n extended: extended,\n ) => Assign\n }\n : {})\n>\n\nexport function defineChain<\n formatters extends ChainFormatters,\n const chain extends Chain,\n>(chain: chain): DefineChainReturnType, chain>> {\n const chainInstance = {\n formatters: undefined,\n fees: undefined,\n serializers: undefined,\n ...chain,\n } as Assign, chain>\n\n function extend(base: typeof chainInstance) {\n type ExtendFn = (base: typeof chainInstance) => unknown\n return (fnOrExtended: ExtendFn | Record) => {\n const properties = (\n typeof fnOrExtended === 'function' ? fnOrExtended(base) : fnOrExtended\n ) as (typeof chainInstance)['extendSchema']\n const combined = { ...base, ...properties }\n return Object.assign(combined, { extend: extend(combined) })\n }\n }\n\n return Object.assign(chainInstance, {\n extend: extend(chainInstance),\n }) as never\n}\n\nexport function extendSchema>(): schema {\n return {} as schema\n}\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n type ParseAbi,\n type ParseAbiItem,\n type ParseAbiParameter,\n type ParseAbiParameters,\n parseAbi,\n parseAbiItem,\n parseAbiParameter,\n parseAbiParameters,\n} from 'abitype'\nexport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../accounts/utils/parseAccount.js'\nexport {\n type PublicKeyToAddressErrorType,\n publicKeyToAddress,\n} from '../accounts/utils/publicKeyToAddress.js'\nexport {\n type DecodeAbiParametersErrorType,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n} from './abi/decodeAbiParameters.js'\nexport {\n type DecodeErrorResultErrorType,\n type DecodeErrorResultParameters,\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from './abi/decodeErrorResult.js'\nexport {\n type DecodeEventLogErrorType,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n decodeEventLog,\n} from './abi/decodeEventLog.js'\nexport {\n type DecodeFunctionDataErrorType,\n type DecodeFunctionDataParameters,\n type DecodeFunctionDataReturnType,\n decodeFunctionData,\n} from './abi/decodeFunctionData.js'\nexport {\n type DecodeFunctionResultErrorType,\n type DecodeFunctionResultParameters,\n type DecodeFunctionResultReturnType,\n decodeFunctionResult,\n} from './abi/decodeFunctionResult.js'\nexport {\n type EncodeAbiParametersErrorType,\n type EncodeAbiParametersReturnType,\n encodeAbiParameters,\n} from './abi/encodeAbiParameters.js'\nexport {\n type EncodeDeployDataErrorType,\n type EncodeDeployDataParameters,\n encodeDeployData,\n} from './abi/encodeDeployData.js'\nexport {\n type EncodeErrorResultErrorType,\n type EncodeErrorResultParameters,\n encodeErrorResult,\n} from './abi/encodeErrorResult.js'\nexport {\n type EncodeArgErrorType,\n type EncodeEventTopicsParameters,\n type EncodeEventTopicsReturnType,\n encodeEventTopics,\n} from './abi/encodeEventTopics.js'\nexport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from './abi/encodeFunctionData.js'\nexport {\n type EncodeFunctionResultErrorType,\n type EncodeFunctionResultParameters,\n encodeFunctionResult,\n} from './abi/encodeFunctionResult.js'\nexport { type EncodePackedErrorType, encodePacked } from './abi/encodePacked.js'\nexport {\n type FormatAbiItemErrorType,\n type FormatAbiParamErrorType,\n type FormatAbiParamsErrorType,\n formatAbiItem,\n formatAbiParams,\n} from './abi/formatAbiItem.js'\nexport {\n type FormatAbiItemWithArgsErrorType,\n formatAbiItemWithArgs,\n} from './abi/formatAbiItemWithArgs.js'\nexport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n getAbiItem,\n} from './abi/getAbiItem.js'\nexport {\n type ParseEventLogsErrorType,\n type ParseEventLogsParameters,\n type ParseEventLogsReturnType,\n parseEventLogs,\n} from './abi/parseEventLogs.js'\nexport {\n type ChecksumAddressErrorType,\n getAddress,\n} from './address/getAddress.js'\nexport {\n type GetContractAddressOptions,\n type GetCreate2AddressErrorType,\n type GetCreate2AddressOptions,\n type GetCreateAddressErrorType,\n type GetCreateAddressOptions,\n getContractAddress,\n getCreate2Address,\n getCreateAddress,\n} from './address/getContractAddress.js'\nexport { type IsAddressErrorType, isAddress } from './address/isAddress.js'\nexport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from './address/isAddressEqual.js'\nexport {\n type HashAuthorizationErrorType,\n type HashAuthorizationParameters,\n type HashAuthorizationReturnType,\n hashAuthorization,\n} from './authorization/hashAuthorization.js'\nexport {\n type RecoverAuthorizationAddressErrorType,\n type RecoverAuthorizationAddressParameters,\n type RecoverAuthorizationAddressReturnType,\n recoverAuthorizationAddress,\n} from './authorization/recoverAuthorizationAddress.js'\nexport {\n type SerializeAuthorizationListErrorType,\n type SerializeAuthorizationListReturnType,\n serializeAuthorizationList,\n} from './authorization/serializeAuthorizationList.js'\nexport {\n type VerifyAuthorizationErrorType,\n type VerifyAuthorizationParameters,\n type VerifyAuthorizationReturnType,\n verifyAuthorization,\n} from './authorization/verifyAuthorization.js'\nexport {\n buildRequest,\n type RequestErrorType,\n} from './buildRequest.js'\nexport {\n ccipRequest,\n /** @deprecated Use `ccipRequest`. */\n ccipRequest as ccipFetch,\n type OffchainLookupErrorType,\n offchainLookup,\n offchainLookupAbiItem,\n offchainLookupSignature,\n} from './ccip.js'\nexport {\n type AssertCurrentChainErrorType,\n type AssertCurrentChainParameters,\n assertCurrentChain,\n} from './chain/assertCurrentChain.js'\nexport { defineChain } from './chain/defineChain.js'\nexport {\n type ExtractChainErrorType,\n type ExtractChainParameters,\n type ExtractChainReturnType,\n extractChain,\n} from './chain/extractChain.js'\nexport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from './chain/getChainContractAddress.js'\nexport {\n type ConcatBytesErrorType,\n type ConcatErrorType,\n type ConcatHexErrorType,\n concat,\n concatBytes,\n concatHex,\n} from './data/concat.js'\nexport { type IsBytesErrorType, isBytes } from './data/isBytes.js'\nexport { type IsHexErrorType, isHex } from './data/isHex.js'\nexport {\n type PadBytesErrorType,\n type PadErrorType,\n type PadHexErrorType,\n pad,\n padBytes,\n padHex,\n} from './data/pad.js'\nexport { type SizeErrorType, size } from './data/size.js'\nexport {\n type AssertEndOffsetErrorType,\n type AssertStartOffsetErrorType,\n type SliceBytesErrorType,\n type SliceErrorType,\n type SliceHexErrorType,\n type SliceReturnType,\n slice,\n sliceBytes,\n sliceHex,\n} from './data/slice.js'\nexport { type TrimErrorType, type TrimReturnType, trim } from './data/trim.js'\nexport {\n type BytesToBigIntErrorType,\n type BytesToBigIntOpts,\n type BytesToBoolErrorType,\n type BytesToBoolOpts,\n type BytesToNumberErrorType,\n type BytesToNumberOpts,\n type BytesToStringErrorType,\n type BytesToStringOpts,\n bytesToBigInt,\n bytesToBigInt as bytesToBigint,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n type FromBytesErrorType,\n type FromBytesParameters,\n type FromBytesReturnType,\n fromBytes,\n} from './encoding/fromBytes.js'\nexport {\n type AssertSizeErrorType,\n type FromHexErrorType,\n type FromHexParameters,\n type FromHexReturnType,\n fromHex,\n type HexToBigIntErrorType,\n type HexToBigIntOpts,\n type HexToBoolErrorType,\n type HexToBoolOpts,\n type HexToNumberErrorType,\n type HexToNumberOpts,\n type HexToStringErrorType,\n type HexToStringOpts,\n hexToBigInt,\n hexToBool,\n hexToNumber,\n hexToString,\n} from './encoding/fromHex.js'\nexport {\n type FromRlpErrorType,\n fromRlp,\n} from './encoding/fromRlp.js'\nexport {\n type BoolToBytesErrorType,\n type BoolToBytesOpts,\n boolToBytes,\n type HexToBytesErrorType,\n type HexToBytesOpts,\n hexToBytes,\n type NumberToBytesErrorType,\n numberToBytes,\n type StringToBytesErrorType,\n type StringToBytesOpts,\n stringToBytes,\n type ToBytesErrorType,\n type ToBytesParameters,\n toBytes,\n} from './encoding/toBytes.js'\nexport {\n type BoolToHexErrorType,\n type BoolToHexOpts,\n type BytesToHexErrorType,\n type BytesToHexOpts,\n boolToHex,\n bytesToHex,\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n type StringToHexErrorType,\n type StringToHexOpts,\n stringToHex,\n type ToHexErrorType,\n type ToHexParameters,\n toHex,\n} from './encoding/toHex.js'\nexport {\n type BytesToRlpErrorType,\n type HexToRlpErrorType,\n type ToRlpErrorType,\n type ToRlpReturnType,\n toRlp,\n} from './encoding/toRlp.js'\nexport {\n type GetCallErrorReturnType,\n getCallError,\n} from './errors/getCallError.js'\nexport {\n type GetContractErrorReturnType,\n getContractError,\n} from './errors/getContractError.js'\nexport {\n type GetEstimateGasErrorReturnType,\n getEstimateGasError,\n} from './errors/getEstimateGasError.js'\nexport {\n containsNodeError,\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './errors/getNodeError.js'\nexport {\n type GetTransactionErrorParameters,\n type GetTransactionErrorReturnType,\n getTransactionError,\n} from './errors/getTransactionError.js'\nexport {\n type DefineBlockErrorType,\n defineBlock,\n type FormatBlockErrorType,\n type FormattedBlock,\n formatBlock,\n} from './formatters/block.js'\nexport { type ExtractErrorType, extract } from './formatters/extract.js'\nexport {\n type DefineFormatterErrorType,\n defineFormatter,\n} from './formatters/formatter.js'\nexport { type FormatLogErrorType, formatLog } from './formatters/log.js'\nexport {\n type DefineTransactionErrorType,\n defineTransaction,\n type FormatTransactionErrorType,\n type FormattedTransaction,\n formatTransaction,\n transactionType,\n} from './formatters/transaction.js'\nexport {\n type DefineTransactionReceiptErrorType,\n defineTransactionReceipt,\n type FormatTransactionReceiptErrorType,\n type FormattedTransactionReceipt,\n} from './formatters/transactionReceipt.js'\nexport {\n type DefineTransactionRequestErrorType,\n defineTransactionRequest,\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from './formatters/transactionRequest.js'\nexport { getAction } from './getAction.js'\nexport { type IsHashErrorType, isHash } from './hash/isHash.js'\nexport { type Keccak256ErrorType, keccak256 } from './hash/keccak256.js'\nexport { type Ripemd160ErrorType, ripemd160 } from './hash/ripemd160.js'\nexport { type Sha256ErrorType, sha256 } from './hash/sha256.js'\nexport {\n type ToEventHashErrorType,\n toEventHash,\n} from './hash/toEventHash.js'\nexport {\n type ToEventSelectorErrorType,\n /** @deprecated use `ToEventSelectorErrorType`. */\n type ToEventSelectorErrorType as GetEventSelectorErrorType,\n toEventSelector,\n /** @deprecated use `toEventSelector`. */\n toEventSelector as getEventSelector,\n} from './hash/toEventSelector.js'\nexport {\n type ToEventSignatureErrorType,\n /** @deprecated use `ToEventSignatureErrorType`. */\n type ToEventSignatureErrorType as GetEventSignatureErrorType,\n toEventSignature,\n /** @deprecated use `toEventSignature`. */\n toEventSignature as getEventSignature,\n} from './hash/toEventSignature.js'\nexport {\n type ToFunctionHashErrorType,\n toFunctionHash,\n} from './hash/toFunctionHash.js'\nexport {\n type ToFunctionSelectorErrorType,\n /** @deprecated use `ToFunctionSelectorErrorType`. */\n type ToFunctionSelectorErrorType as GetFunctionSelectorErrorType,\n toFunctionSelector,\n /** @deprecated use `toFunctionSelector`. */\n toFunctionSelector as getFunctionSelector,\n} from './hash/toFunctionSelector.js'\nexport {\n type ToFunctionSignatureErrorType,\n /** @deprecated use `ToFunctionSignatureErrorType`. */\n type ToFunctionSignatureErrorType as GetFunctionSignatureErrorType,\n toFunctionSignature,\n /** @deprecated use `toFunctionSignature`. */\n toFunctionSignature as getFunctionSignature,\n} from './hash/toFunctionSignature.js'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from './nonceManager.js'\nexport { arrayRegex, bytesRegex, integerRegex } from './regex.js'\nexport {\n getSocket,\n rpc,\n type WebSocketAsyncErrorType,\n type WebSocketAsyncOptions,\n type WebSocketAsyncReturnType,\n type WebSocketErrorType,\n type WebSocketOptions,\n type WebSocketReturnType,\n} from './rpc/compat.js'\nexport {\n getHttpRpcClient,\n type HttpRequestErrorType,\n type HttpRequestParameters,\n type HttpRequestReturnType,\n type HttpRpcClient,\n type HttpRpcClientOptions,\n} from './rpc/http.js'\nexport {\n type GetSocketParameters,\n type GetSocketRpcClientErrorType,\n type GetSocketRpcClientParameters,\n getSocketRpcClient,\n type Socket,\n type SocketRpcClient,\n socketClientCache,\n} from './rpc/socket.js'\nexport { getWebSocketRpcClient } from './rpc/webSocket.js'\nexport {\n type HashMessageErrorType,\n type HashMessageReturnType,\n hashMessage,\n} from './signature/hashMessage.js'\nexport {\n type HashDomainErrorType,\n type HashStructErrorType,\n type HashTypedDataParameters,\n type HashTypedDataReturnType,\n hashStruct,\n hashTypedData,\n} from './signature/hashTypedData.js'\nexport {\n type IsErc6492SignatureErrorType,\n type IsErc6492SignatureParameters,\n type IsErc6492SignatureReturnType,\n isErc6492Signature,\n} from './signature/isErc6492Signature.js'\nexport {\n type IsErc8010SignatureErrorType,\n type IsErc8010SignatureParameters,\n type IsErc8010SignatureReturnType,\n isErc8010Signature,\n} from './signature/isErc8010Signature.js'\nexport {\n type ParseErc6492SignatureErrorType,\n type ParseErc6492SignatureParameters,\n type ParseErc6492SignatureReturnType,\n parseErc6492Signature,\n} from './signature/parseErc6492Signature.js'\nexport {\n type ParseErc8010SignatureErrorType,\n type ParseErc8010SignatureParameters,\n type ParseErc8010SignatureReturnType,\n parseErc8010Signature,\n} from './signature/parseErc8010Signature.js'\nexport {\n type RecoverAddressErrorType,\n type RecoverAddressParameters,\n type RecoverAddressReturnType,\n recoverAddress,\n} from './signature/recoverAddress.js'\nexport {\n type RecoverMessageAddressErrorType,\n type RecoverMessageAddressParameters,\n type RecoverMessageAddressReturnType,\n recoverMessageAddress,\n} from './signature/recoverMessageAddress.js'\nexport {\n type RecoverPublicKeyErrorType,\n type RecoverPublicKeyParameters,\n type RecoverPublicKeyReturnType,\n recoverPublicKey,\n} from './signature/recoverPublicKey.js'\nexport {\n type RecoverTypedDataAddressErrorType,\n type RecoverTypedDataAddressParameters,\n type RecoverTypedDataAddressReturnType,\n recoverTypedDataAddress,\n} from './signature/recoverTypedDataAddress.js'\nexport {\n type SerializeErc6492SignatureErrorType,\n type SerializeErc6492SignatureParameters,\n type SerializeErc6492SignatureReturnType,\n serializeErc6492Signature,\n} from './signature/serializeErc6492Signature.js'\nexport {\n type SerializeErc8010SignatureErrorType,\n type SerializeErc8010SignatureParameters,\n type SerializeErc8010SignatureReturnType,\n serializeErc8010Signature,\n} from './signature/serializeErc8010Signature.js'\nexport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from './signature/verifyHash.js'\nexport {\n type VerifyMessageErrorType,\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from './signature/verifyMessage.js'\nexport {\n type VerifyTypedDataErrorType,\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from './signature/verifyTypedData.js'\nexport { type StringifyErrorType, stringify } from './stringify.js'\nexport {\n type AssertRequestErrorType,\n assertRequest,\n} from './transaction/assertRequest.js'\nexport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionLegacy,\n} from './transaction/assertTransaction.js'\nexport {\n type GetSerializedTransactionType,\n type GetSerializedTransactionTypeErrorType,\n getSerializedTransactionType,\n} from './transaction/getSerializedTransactionType.js'\nexport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './transaction/getTransactionType.js'\nexport {\n type ParseTransactionErrorType,\n parseTransaction,\n} from './transaction/parseTransaction.js'\nexport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './transaction/serializeAccessList.js'\nexport {\n type SerializeTransactionErrorType,\n type SerializeTransactionFn,\n serializeTransaction,\n} from './transaction/serializeTransaction.js'\nexport {\n type DomainSeparatorErrorType,\n type SerializeTypedDataErrorType,\n serializeTypedData,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from './typedData.js'\nexport { type FormatEtherErrorType, formatEther } from './unit/formatEther.js'\nexport { type FormatGweiErrorType, formatGwei } from './unit/formatGwei.js'\nexport { type FormatUnitsErrorType, formatUnits } from './unit/formatUnits.js'\nexport { type ParseEtherErrorType, parseEther } from './unit/parseEther.js'\nexport { type ParseGweiErrorType, parseGwei } from './unit/parseGwei.js'\nexport { type ParseUnitsErrorType, parseUnits } from './unit/parseUnits.js'\n","import {\n HttpRequestError,\n type HttpRequestErrorType as HttpRequestErrorType_,\n TimeoutError,\n type TimeoutErrorType,\n} from '../../errors/request.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { RpcRequest, RpcResponse } from '../../types/rpc.js'\nimport type { MaybePromise } from '../../types/utils.js'\nimport {\n type WithTimeoutErrorType,\n withTimeout,\n} from '../promise/withTimeout.js'\nimport { stringify } from '../stringify.js'\nimport { idCache } from './id.js'\n\nexport type HttpRpcClientOptions = {\n /** Override for the fetch function used to make requests. */\n fetchFn?:\n | ((input: string | URL | Request, init?: RequestInit) => Promise)\n | undefined\n /** Request configuration to pass to `fetch`. */\n fetchOptions?: Omit | undefined\n /** A callback to handle the request. */\n onRequest?:\n | ((\n request: Request,\n init: RequestInit,\n ) => MaybePromise<\n void | undefined | (RequestInit & { url?: string | undefined })\n >)\n | undefined\n /** A callback to handle the response. */\n onResponse?: ((response: Response) => Promise | void) | undefined\n /** The timeout (in ms) for the request. */\n timeout?: number | undefined\n}\n\nexport type HttpRequestParameters<\n body extends RpcRequest | RpcRequest[] = RpcRequest,\n> = {\n /** The RPC request body. */\n body: body\n /** Override for the fetch function used to make requests. */\n fetchFn?: HttpRpcClientOptions['fetchFn'] | undefined\n /** Request configuration to pass to `fetch`. */\n fetchOptions?: HttpRpcClientOptions['fetchOptions'] | undefined\n /** A callback to handle the response. */\n onRequest?:\n | ((\n request: Request,\n init: RequestInit,\n ) => MaybePromise<\n void | undefined | (RequestInit & { url?: string | undefined })\n >)\n | undefined\n /** A callback to handle the response. */\n onResponse?: ((response: Response) => Promise | void) | undefined\n /** The timeout (in ms) for the request. */\n timeout?: HttpRpcClientOptions['timeout'] | undefined\n}\n\nexport type HttpRequestReturnType<\n body extends RpcRequest | RpcRequest[] = RpcRequest,\n> = body extends RpcRequest[] ? RpcResponse[] : RpcResponse\n\nexport type HttpRequestErrorType =\n | HttpRequestErrorType_\n | TimeoutErrorType\n | WithTimeoutErrorType\n | ErrorType\n\nexport type HttpRpcClient = {\n request(\n params: HttpRequestParameters,\n ): Promise>\n}\n\nexport function getHttpRpcClient(\n url_: string,\n options: HttpRpcClientOptions = {},\n): HttpRpcClient {\n const { url, headers: headers_url } = parseUrl(url_)\n\n return {\n async request(params) {\n const {\n body,\n fetchFn = options.fetchFn ?? fetch,\n onRequest = options.onRequest,\n onResponse = options.onResponse,\n timeout = options.timeout ?? 10_000,\n } = params\n\n const fetchOptions = {\n ...(options.fetchOptions ?? {}),\n ...(params.fetchOptions ?? {}),\n }\n\n const { headers, method, signal: signal_ } = fetchOptions\n\n try {\n const response = await withTimeout(\n async ({ signal }) => {\n const init: RequestInit = {\n ...fetchOptions,\n body: Array.isArray(body)\n ? stringify(\n body.map((body) => ({\n jsonrpc: '2.0',\n id: body.id ?? idCache.take(),\n ...body,\n })),\n )\n : stringify({\n jsonrpc: '2.0',\n id: body.id ?? idCache.take(),\n ...body,\n }),\n headers: {\n ...headers_url,\n 'Content-Type': 'application/json',\n ...headers,\n },\n method: method || 'POST',\n signal: signal_ || (timeout > 0 ? signal : null),\n }\n const request = new Request(url, init)\n const args = (await onRequest?.(request, init)) ?? { ...init, url }\n const response = await fetchFn(args.url ?? url, args)\n return response\n },\n {\n errorInstance: new TimeoutError({ body, url }),\n timeout,\n signal: true,\n },\n )\n\n if (onResponse) await onResponse(response)\n\n let data: any\n if (\n response.headers.get('Content-Type')?.startsWith('application/json')\n )\n data = await response.json()\n else {\n data = await response.text()\n try {\n data = JSON.parse(data || '{}')\n } catch (err) {\n if (response.ok) throw err\n data = { error: data }\n }\n }\n\n if (!response.ok) {\n // If the response body contains a valid JSON-RPC error, return it\n // so it flows through the normal RPC error handling pipeline.\n if (\n typeof data.error?.code === 'number' &&\n typeof data.error?.message === 'string'\n )\n return data\n\n throw new HttpRequestError({\n body,\n details: stringify(data.error) || response.statusText,\n headers: response.headers,\n status: response.status,\n url,\n })\n }\n\n return data\n } catch (err) {\n if (err instanceof HttpRequestError) throw err\n if (err instanceof TimeoutError) throw err\n throw new HttpRequestError({\n body,\n cause: err as Error,\n url,\n })\n }\n },\n }\n}\n\n/** @internal */\nexport function parseUrl(url_: string) {\n try {\n const url = new URL(url_)\n\n const result = (() => {\n // Handle Basic authentication credentials\n if (url.username) {\n const credentials = `${decodeURIComponent(url.username)}:${decodeURIComponent(url.password)}`\n url.username = ''\n url.password = ''\n\n return {\n url: url.toString(),\n headers: { Authorization: `Basic ${btoa(credentials)}` },\n }\n }\n\n return\n })()\n\n return { url: url.toString(), ...result }\n } catch {\n return { url: url_ }\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\nexport type WithTimeoutErrorType = ErrorType\n\nexport function withTimeout(\n fn: ({\n signal,\n }: {\n signal: AbortController['signal'] | null\n }) => Promise,\n {\n errorInstance = new Error('timed out'),\n timeout,\n signal,\n }: {\n // The error instance to throw when the timeout is reached.\n errorInstance?: Error | undefined\n // The timeout (in ms).\n timeout: number\n // Whether or not the timeout should use an abort signal.\n signal?: boolean | undefined\n },\n): Promise {\n return new Promise((resolve, reject) => {\n ;(async () => {\n let timeoutId!: NodeJS.Timeout\n try {\n const controller = new AbortController()\n if (timeout > 0) {\n timeoutId = setTimeout(() => {\n if (signal) {\n controller.abort()\n } else {\n reject(errorInstance)\n }\n }, timeout) as NodeJS.Timeout // need to cast because bun globals.d.ts overrides @types/node\n }\n resolve(await fn({ signal: controller?.signal || null }))\n } catch (err) {\n if ((err as Error)?.name === 'AbortError') reject(errorInstance)\n reject(err)\n } finally {\n clearTimeout(timeoutId)\n }\n })()\n })\n}\n","function createIdStore() {\n return {\n current: 0,\n take() {\n return this.current++\n },\n reset() {\n this.current = 0\n },\n }\n}\n\nexport const idCache = /*#__PURE__*/ createIdStore()\n","import * as AbiParameters from '../core/AbiParameters.js'\nimport type * as Address from '../core/Address.js'\nimport * as Authorization from '../core/Authorization.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport * as Secp256k1 from '../core/Secp256k1.js'\nimport * as Signature from '../core/Signature.js'\n\n/** Unwrapped ERC-8010 signature. */\nexport type Unwrapped = {\n /** Authorization signed by the delegatee. */\n authorization: Authorization.Authorization\n /** Data to initialize the delegation. */\n data?: Hex.Hex | undefined\n /** The original signature. */\n signature: Hex.Hex\n /** Address of the initializer. */\n to?: Address.Address | undefined\n}\n\n/** Wrapped ERC-8010 signature. */\nexport type Wrapped = Hex.Hex\n\n/**\n * Magic bytes used to identify ERC-8010 wrapped signatures.\n */\nexport const magicBytes =\n '0x8010801080108010801080108010801080108010801080108010801080108010' as const\n\n/** Suffix ABI parameters for the ERC-8010 wrapped signature. */\nexport const suffixParameters = AbiParameters.from(\n '(uint256 chainId, address delegation, uint256 nonce, uint8 yParity, uint256 r, uint256 s), address to, bytes data',\n)\n\n/**\n * Asserts that the wrapped signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * SignatureErc8010.assert('0xdeadbeef')\n * // @error: InvalidWrappedSignatureError: Value `0xdeadbeef` is an invalid ERC-8010 wrapped signature.\n * ```\n *\n * @param value - The value to assert.\n */\nexport function assert(value: Unwrapped | Wrapped) {\n if (typeof value === 'string') {\n if (Hex.slice(value, -32) !== magicBytes)\n throw new InvalidWrappedSignatureError(value)\n } else Signature.assert(value.authorization)\n}\n\nexport declare namespace assert {\n type ErrorType =\n | InvalidWrappedSignatureError\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-8010 wrapped signature](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { SignatureErc8010 } from 'ox/erc8010' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * // Instantiate from serialized format. // [!code focus]\n * const wrapped = SignatureErc8010.from('0x...') // [!code focus]\n * // @log: { authorization: { ... }, data: '0x...', signature: { ... } } // [!code focus]\n *\n * // Instantiate from constituent parts. // [!code focus]\n * const wrapped = SignatureErc8010.from({ // [!code focus]\n * authorization: { ... }, // [!code focus]\n * data: '0x...', // [!code focus]\n * signature, // [!code focus]\n * })\n * // @log: { authorization: { ... }, data: '0x...', signature: { ... } }\n * ```\n *\n * @param value - Value to parse.\n * @returns Parsed value.\n */\nexport function from(value: Unwrapped | Wrapped): Unwrapped {\n if (typeof value === 'string') return unwrap(value)\n return value\n}\n\nexport declare namespace from {\n type ErrorType = unwrap.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Unwraps an [ERC-8010 wrapped signature](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * const { authorization, data, signature } = SignatureErc8010.unwrap('0x...')\n * ```\n *\n * @param wrapped - Wrapped signature to unwrap.\n * @returns Unwrapped signature.\n */\nexport function unwrap(wrapped: Wrapped): Unwrapped {\n assert(wrapped)\n\n const suffixLength = Hex.toNumber(Hex.slice(wrapped, -64, -32))\n const suffix = Hex.slice(wrapped, -suffixLength - 64, -64)\n const signature = Hex.slice(wrapped, 0, -suffixLength - 64)\n\n const [auth, to, data] = AbiParameters.decode(suffixParameters, suffix)\n\n const authorization = Authorization.from({\n address: auth.delegation,\n chainId: Number(auth.chainId),\n nonce: auth.nonce,\n yParity: auth.yParity,\n r: auth.r,\n s: auth.s,\n })\n\n return {\n authorization,\n signature,\n ...(data && data !== '0x' ? { data, to } : {}),\n }\n}\n\nexport declare namespace unwrap {\n type ErrorType = assert.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Wraps a signature into [ERC-8010 format](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md).\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1, Signature } from 'ox'\n * import { SignatureErc8010 } from 'ox/erc8010' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc8010.wrap({ // [!code focus]\n * authorization: { ... }, // [!code focus]\n * data: '0xdeadbeef', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param value - Values to wrap.\n * @returns Wrapped signature.\n */\nexport function wrap(value: Unwrapped): Wrapped {\n const { data, signature } = value\n\n assert(value)\n\n const self = Secp256k1.recoverAddress({\n payload: Authorization.getSignPayload(value.authorization),\n signature: Signature.from(value.authorization),\n })\n\n const suffix = AbiParameters.encode(suffixParameters, [\n {\n ...value.authorization,\n delegation: value.authorization.address,\n chainId: BigInt(value.authorization.chainId),\n },\n value.to ?? self,\n data ?? '0x',\n ])\n const suffixLength = Hex.fromNumber(Hex.size(suffix), { size: 32 })\n return Hex.concat(signature, suffix, suffixLength, magicBytes)\n}\n\nexport declare namespace wrap {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Validates a wrapped signature. Returns `true` if the wrapped signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * const valid = SignatureErc8010.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param value - The value to validate.\n * @returns `true` if the value is valid, `false` otherwise.\n */\nexport function validate(value: Unwrapped | Wrapped): boolean {\n try {\n assert(value)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** Thrown when the ERC-8010 wrapped signature is invalid. */\nexport class InvalidWrappedSignatureError extends Errors.BaseError {\n override readonly name = 'SignatureErc8010.InvalidWrappedSignatureError'\n\n constructor(wrapped: Wrapped) {\n super(`Value \\`${wrapped}\\` is an invalid ERC-8010 wrapped signature.`)\n }\n}\n","import * as abitype from 'abitype'\nimport * as Address from './Address.js'\nimport * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as internal from './internal/abiParameters.js'\nimport * as Cursor from './internal/cursor.js'\nimport * as Solidity from './Solidity.js'\n\n/** Root type for ABI parameters. */\nexport type AbiParameters = readonly abitype.AbiParameter[]\n\n/** A parameter on an {@link ox#AbiParameters.AbiParameters}. */\nexport type Parameter = abitype.AbiParameter\n\n/** A packed ABI type. */\nexport type PackedAbiType =\n | abitype.SolidityAddress\n | abitype.SolidityBool\n | abitype.SolidityBytes\n | abitype.SolidityInt\n | abitype.SolidityString\n | abitype.SolidityArrayWithoutTuple\n\n/**\n * Decodes ABI-encoded data into its respective primitive values based on ABI Parameters.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.decode(\n * AbiParameters.from(['string', 'uint', 'bool']),\n * '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000',\n * )\n * // @log: ['wagmi', 420n, true]\n * ```\n *\n * @example\n * ### JSON Parameters\n *\n * You can pass **JSON ABI** Parameters:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.decode(\n * [\n * { name: 'x', type: 'string' },\n * { name: 'y', type: 'uint' },\n * { name: 'z', type: 'bool' },\n * ],\n * '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000',\n * )\n * // @log: ['wagmi', 420n, true]\n * ```\n *\n * @param parameters - The set of ABI parameters to decode, in the shape of the `inputs` or `outputs` attribute of an ABI Item. These parameters must include valid [ABI types](https://docs.soliditylang.org/en/latest/types.html).\n * @param data - ABI encoded data.\n * @param options - Decoding options.\n * @returns Array of decoded values.\n */\nexport function decode<\n const parameters extends AbiParameters,\n as extends 'Object' | 'Array' = 'Array',\n>(\n parameters: parameters,\n data: Bytes.Bytes | Hex.Hex,\n options?: decode.Options,\n): decode.ReturnType\n\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decode(\n parameters: AbiParameters,\n data: Bytes.Bytes | Hex.Hex,\n options: {\n as?: 'Array' | 'Object' | undefined\n checksumAddress?: boolean | undefined\n } = {},\n): readonly unknown[] | Record {\n const { as = 'Array', checksumAddress = false } = options\n\n const bytes = typeof data === 'string' ? Bytes.fromHex(data) : data\n const cursor = Cursor.create(bytes)\n\n if (Bytes.size(bytes) === 0 && parameters.length > 0)\n throw new ZeroDataError()\n if (Bytes.size(bytes) && Bytes.size(bytes) < 32)\n throw new DataSizeTooSmallError({\n data: typeof data === 'string' ? data : Hex.fromBytes(data),\n parameters: parameters as readonly Parameter[],\n size: Bytes.size(bytes),\n })\n\n let consumed = 0\n const values: any = as === 'Array' ? [] : {}\n for (let i = 0; i < parameters.length; ++i) {\n const param = parameters[i] as Parameter\n cursor.setPosition(consumed)\n const [data, consumed_] = internal.decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: 0,\n })\n consumed += consumed_\n if (as === 'Array') values.push(data)\n else values[param.name ?? i] = data\n }\n return values\n}\n\nexport declare namespace decode {\n type Options = {\n /**\n * Whether the decoded values should be returned as an `Object` or `Array`.\n *\n * @default \"Array\"\n */\n as?: as | 'Object' | 'Array' | undefined\n /**\n * Whether decoded addresses should be checksummed.\n *\n * @default false\n */\n checksumAddress?: boolean | undefined\n }\n\n type ReturnType<\n parameters extends AbiParameters = AbiParameters,\n as extends 'Object' | 'Array' = 'Array',\n > = parameters extends readonly []\n ? as extends 'Object'\n ? {}\n : []\n : as extends 'Object'\n ? internal.ToObject\n : internal.ToPrimitiveTypes\n\n type ErrorType =\n | Bytes.fromHex.ErrorType\n | internal.decodeParameter.ErrorType\n | ZeroDataError\n | DataSizeTooSmallError\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes primitive values into ABI encoded data as per the [Application Binary Interface (ABI) Specification](https://docs.soliditylang.org/en/latest/abi-spec).\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.encode(\n * AbiParameters.from(['string', 'uint', 'bool']),\n * ['wagmi', 420n, true],\n * )\n * ```\n *\n * @example\n * ### JSON Parameters\n *\n * Specify **JSON ABI** Parameters as schema:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.encode(\n * [\n * { type: 'string', name: 'name' },\n * { type: 'uint', name: 'age' },\n * { type: 'bool', name: 'isOwner' },\n * ],\n * ['wagmi', 420n, true],\n * )\n * ```\n *\n * @param parameters - The set of ABI parameters to encode, in the shape of the `inputs` or `outputs` attribute of an ABI Item. These parameters must include valid [ABI types](https://docs.soliditylang.org/en/latest/types.html).\n * @param values - The set of primitive values that correspond to the ABI types defined in `parameters`.\n * @returns ABI encoded data.\n */\nexport function encode<\n const parameters extends AbiParameters | readonly unknown[],\n>(\n parameters: parameters,\n values: parameters extends AbiParameters\n ? internal.ToPrimitiveTypes\n : never,\n options?: encode.Options,\n): Hex.Hex {\n const { checksumAddress = false } = options ?? {}\n\n if (parameters.length !== values.length)\n throw new LengthMismatchError({\n expectedLength: parameters.length as number,\n givenLength: values.length as any,\n })\n // Prepare the parameters to determine dynamic types to encode.\n const preparedParameters = internal.prepareParameters({\n checksumAddress,\n parameters: parameters as readonly Parameter[],\n values: values as any,\n })\n const data = internal.encode(preparedParameters)\n if (data.length === 0) return '0x'\n return data\n}\n\nexport declare namespace encode {\n type ErrorType =\n | LengthMismatchError\n | internal.encode.ErrorType\n | internal.prepareParameters.ErrorType\n | Errors.GlobalErrorType\n\n type Options = {\n /**\n * Whether addresses should be checked against their checksum.\n *\n * @default false\n */\n checksumAddress?: boolean | undefined\n }\n}\n\n/**\n * Encodes an array of primitive values to a [packed ABI encoding](https://docs.soliditylang.org/en/latest/abi-spec.html#non-standard-packed-mode).\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const encoded = AbiParameters.encodePacked(\n * ['address', 'string'],\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 'hello world'],\n * )\n * // @log: '0xd8da6bf26964af9d7eed9e03e53415d37aa9604568656c6c6f20776f726c64'\n * ```\n *\n * @param types - Set of ABI types to pack encode.\n * @param values - The set of primitive values that correspond to the ABI types defined in `types`.\n * @returns The encoded packed data.\n */\nexport function encodePacked<\n const packedAbiTypes extends readonly PackedAbiType[] | readonly unknown[],\n>(types: packedAbiTypes, values: encodePacked.Values): Hex.Hex {\n if (types.length !== values.length)\n throw new LengthMismatchError({\n expectedLength: types.length as number,\n givenLength: values.length as number,\n })\n\n const data: Hex.Hex[] = []\n for (let i = 0; i < (types as unknown[]).length; i++) {\n const type = types[i]\n const value = values[i]\n data.push(encodePacked.encode(type, value))\n }\n return Hex.concat(...data)\n}\n\nexport namespace encodePacked {\n export type ErrorType =\n | Hex.concat.ErrorType\n | LengthMismatchError\n | Errors.GlobalErrorType\n\n export type Values<\n packedAbiTypes extends readonly PackedAbiType[] | readonly unknown[],\n > = {\n [key in keyof packedAbiTypes]: packedAbiTypes[key] extends abitype.AbiType\n ? abitype.AbiParameterToPrimitiveType<{ type: packedAbiTypes[key] }>\n : unknown\n }\n\n // eslint-disable-next-line jsdoc/require-jsdoc\n export function encode(\n type: packedAbiType,\n value: Values<[packedAbiType]>[0],\n isArray = false,\n ): Hex.Hex {\n if (type === 'address') {\n const address = value as Address.Address\n Address.assert(address)\n return Hex.padLeft(\n address.toLowerCase() as Hex.Hex,\n isArray ? 32 : 0,\n ) as Address.Address\n }\n if (type === 'string') return Hex.fromString(value as string)\n if (type === 'bytes') return value as Hex.Hex\n if (type === 'bool')\n return Hex.padLeft(Hex.fromBoolean(value as boolean), isArray ? 32 : 1)\n\n const intMatch = (type as string).match(Solidity.integerRegex)\n if (intMatch) {\n const [_type, baseType, bits = '256'] = intMatch\n const size = Number.parseInt(bits, 10) / 8\n return Hex.fromNumber(value as number, {\n size: isArray ? 32 : size,\n signed: baseType === 'int',\n })\n }\n\n const bytesMatch = (type as string).match(Solidity.bytesRegex)\n if (bytesMatch) {\n const [_type, size] = bytesMatch\n if (Number.parseInt(size!, 10) !== ((value as Hex.Hex).length - 2) / 2)\n throw new BytesSizeMismatchError({\n expectedSize: Number.parseInt(size!, 10),\n value: value as Hex.Hex,\n })\n return Hex.padRight(value as Hex.Hex, isArray ? 32 : 0) as Hex.Hex\n }\n\n const arrayMatch = (type as string).match(Solidity.arrayRegex)\n if (arrayMatch && Array.isArray(value)) {\n const [_type, childType] = arrayMatch\n const data: Hex.Hex[] = []\n for (let i = 0; i < value.length; i++) {\n data.push(encode(childType, value[i], true))\n }\n if (data.length === 0) return '0x'\n return Hex.concat(...data)\n }\n\n throw new InvalidTypeError(type as string)\n }\n}\n\n/**\n * Formats {@link ox#AbiParameters.AbiParameters} into **Human Readable ABI Parameters**.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const formatted = AbiParameters.format([\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ])\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param parameters - The ABI Parameters to format.\n * @returns The formatted ABI Parameters .\n */\nexport function format<\n const parameters extends readonly [\n Parameter | abitype.AbiEventParameter,\n ...(readonly (Parameter | abitype.AbiEventParameter)[]),\n ],\n>(\n parameters:\n | parameters\n | readonly [\n Parameter | abitype.AbiEventParameter,\n ...(readonly (Parameter | abitype.AbiEventParameter)[]),\n ],\n): abitype.FormatAbiParameters {\n return abitype.formatAbiParameters(parameters)\n}\n\nexport declare namespace format {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses arbitrary **JSON ABI Parameters** or **Human Readable ABI Parameters** into typed {@link ox#AbiParameters.AbiParameters}.\n *\n * @example\n * ### JSON Parameters\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const parameters = AbiParameters.from([\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ])\n *\n * parameters\n * //^?\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable Parameters\n *\n * Human Readable ABI Parameters can be parsed into a typed {@link ox#AbiParameters.AbiParameters}:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const parameters = AbiParameters.from('address spender, uint256 amount')\n *\n * parameters\n * //^?\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const parameters = AbiParameters.from([\n * 'struct Foo { address spender; uint256 amount; }', // [!code hl]\n * 'Foo foo, address bar',\n * ])\n *\n * parameters\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param parameters - The ABI Parameters to parse.\n * @returns The typed ABI Parameters.\n */\nexport function from<\n const parameters extends AbiParameters | string | readonly string[],\n>(\n parameters: parameters | AbiParameters | string | readonly string[],\n): from.ReturnType {\n if (Array.isArray(parameters) && typeof parameters[0] === 'string')\n return abitype.parseAbiParameters(parameters) as never\n if (typeof parameters === 'string')\n return abitype.parseAbiParameters(parameters) as never\n return parameters as never\n}\n\nexport declare namespace from {\n type ReturnType<\n parameters extends AbiParameters | string | readonly string[],\n > = parameters extends string\n ? abitype.ParseAbiParameters\n : parameters extends readonly string[]\n ? abitype.ParseAbiParameters\n : parameters\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Throws when the data size is too small for the given parameters.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x010f')\n * // ↑ ❌ 2 bytes\n * // @error: AbiParameters.DataSizeTooSmallError: Data size of 2 bytes is too small for given parameters.\n * // @error: Params: (uint256)\n * // @error: Data: 0x010f (2 bytes)\n * ```\n *\n * ### Solution\n *\n * Pass a valid data size.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x00000000000000000000000000000000000000000000000000000000000010f')\n * // ↑ ✅ 32 bytes\n * ```\n */\nexport class DataSizeTooSmallError extends Errors.BaseError {\n override readonly name = 'AbiParameters.DataSizeTooSmallError'\n constructor({\n data,\n parameters,\n size,\n }: { data: Hex.Hex; parameters: readonly Parameter[]; size: number }) {\n super(`Data size of ${size} bytes is too small for given parameters.`, {\n metaMessages: [\n `Params: (${abitype.formatAbiParameters(parameters as readonly [Parameter])})`,\n `Data: ${data} (${size} bytes)`,\n ],\n })\n }\n}\n\n/**\n * Throws when zero data is provided, but data is expected.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x')\n * // ↑ ❌ zero data\n * // @error: AbiParameters.DataSizeTooSmallError: Data size of 2 bytes is too small for given parameters.\n * // @error: Params: (uint256)\n * // @error: Data: 0x010f (2 bytes)\n * ```\n *\n * ### Solution\n *\n * Pass valid data.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x00000000000000000000000000000000000000000000000000000000000010f')\n * // ↑ ✅ 32 bytes\n * ```\n */\nexport class ZeroDataError extends Errors.BaseError {\n override readonly name = 'AbiParameters.ZeroDataError'\n constructor() {\n super('Cannot decode zero data (\"0x\") with ABI parameters.')\n }\n}\n\n/**\n * The length of the array value does not match the length specified in the corresponding ABI parameter.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from('uint256[3]'), [[69n, 420n]])\n * // ↑ expected: 3 ↑ ❌ length: 2\n * // @error: AbiParameters.ArrayLengthMismatchError: ABI encoding array length mismatch\n * // @error: for type `uint256[3]`. Expected: `3`. Given: `2`.\n * ```\n *\n * ### Solution\n *\n * Pass an array of the correct length.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['uint256[3]']), [[69n, 420n, 69n]])\n * // ↑ ✅ length: 3\n * ```\n */\nexport class ArrayLengthMismatchError extends Errors.BaseError {\n override readonly name = 'AbiParameters.ArrayLengthMismatchError'\n constructor({\n expectedLength,\n givenLength,\n type,\n }: { expectedLength: number; givenLength: number; type: string }) {\n super(\n `Array length mismatch for type \\`${type}\\`. Expected: \\`${expectedLength}\\`. Given: \\`${givenLength}\\`.`,\n )\n }\n}\n\n/**\n * The size of the bytes value does not match the size specified in the corresponding ABI parameter.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from('bytes8'), [['0xdeadbeefdeadbeefdeadbeef']])\n * // ↑ expected: 8 bytes ↑ ❌ size: 12 bytes\n * // @error: BytesSizeMismatchError: Size of bytes \"0xdeadbeefdeadbeefdeadbeef\"\n * // @error: (bytes12) does not match expected size (bytes8).\n * ```\n *\n * ### Solution\n *\n * Pass a bytes value of the correct size.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['bytes8']), ['0xdeadbeefdeadbeef'])\n * // ↑ ✅ size: 8 bytes\n * ```\n */\nexport class BytesSizeMismatchError extends Errors.BaseError {\n override readonly name = 'AbiParameters.BytesSizeMismatchError'\n constructor({\n expectedSize,\n value,\n }: { expectedSize: number; value: Hex.Hex }) {\n super(\n `Size of bytes \"${value}\" (bytes${Hex.size(\n value,\n )}) does not match expected size (bytes${expectedSize}).`,\n )\n }\n}\n\n/**\n * The length of the values to encode does not match the length of the ABI parameters.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['string', 'uint256']), ['hello'])\n * // @error: LengthMismatchError: ABI encoding params/values length mismatch.\n * // @error: Expected length (params): 2\n * // @error: Given length (values): 1\n * ```\n *\n * ### Solution\n *\n * Pass the correct number of values to encode.\n *\n * ### Solution\n *\n * Pass a [valid ABI type](https://docs.soliditylang.org/en/develop/abi-spec.html#types).\n */\nexport class LengthMismatchError extends Errors.BaseError {\n override readonly name = 'AbiParameters.LengthMismatchError'\n constructor({\n expectedLength,\n givenLength,\n }: { expectedLength: number; givenLength: number }) {\n super(\n [\n 'ABI encoding parameters/values length mismatch.',\n `Expected length (parameters): ${expectedLength}`,\n `Given length (values): ${givenLength}`,\n ].join('\\n'),\n )\n }\n}\n\n/**\n * The value provided is not a valid array as specified in the corresponding ABI parameter.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['uint256[3]']), [69])\n * ```\n *\n * ### Solution\n *\n * Pass an array value.\n */\nexport class InvalidArrayError extends Errors.BaseError {\n override readonly name = 'AbiParameters.InvalidArrayError'\n constructor(value: unknown) {\n super(`Value \\`${value}\\` is not a valid array.`)\n }\n}\n\n/**\n * Throws when the ABI parameter type is invalid.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'lol' }], '0x00000000000000000000000000000000000000000000000000000000000010f')\n * // ↑ ❌ invalid type\n * // @error: AbiParameters.InvalidTypeError: Type `lol` is not a valid ABI Type.\n * ```\n */\nexport class InvalidTypeError extends Errors.BaseError {\n override readonly name = 'AbiParameters.InvalidTypeError'\n constructor(type: string) {\n super(`Type \\`${type}\\` is not a valid ABI Type.`)\n }\n}\n","import type { Address as abitype_Address } from 'abitype'\nimport * as Bytes from './Bytes.js'\nimport * as Caches from './Caches.js'\nimport * as Errors from './Errors.js'\nimport * as Hash from './Hash.js'\nimport * as PublicKey from './PublicKey.js'\n\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/\n\n/** Root type for Address. */\nexport type Address = abitype_Address\n\n/**\n * Asserts that the given value is a valid {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.assert('0xA0Cf798816D4b9b9866b5330EEa46a18382f251e')\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.assert('0xdeadbeef')\n * // @error: InvalidAddressError: Address \"0xdeadbeef\" is invalid.\n * ```\n *\n * @param value - Value to assert if it is a valid address.\n * @param options - Assertion options.\n */\nexport function assert(\n value: string,\n options: assert.Options = {},\n): asserts value is Address {\n const { strict = true } = options\n\n if (!addressRegex.test(value))\n throw new InvalidAddressError({\n address: value,\n cause: new InvalidInputError(),\n })\n\n if (strict) {\n if (value.toLowerCase() === value) return\n if (checksum(value as Address) !== value)\n throw new InvalidAddressError({\n address: value,\n cause: new InvalidChecksumError(),\n })\n }\n}\n\nexport declare namespace assert {\n type Options = {\n /**\n * Enables strict mode. Whether or not to compare the address against its checksum.\n *\n * @default true\n */\n strict?: boolean | undefined\n }\n\n type ErrorType = InvalidAddressError | Errors.GlobalErrorType\n}\n\n/**\n * Computes the checksum address for the given {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.checksum('0xa0cf798816d4b9b9866b5330eea46a18382f251e')\n * // @log: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * ```\n *\n * @param address - The address to compute the checksum for.\n * @returns The checksummed address.\n */\nexport function checksum(address: string): Address {\n if (Caches.checksum.has(address)) return Caches.checksum.get(address)!\n\n assert(address, { strict: false })\n\n const hexAddress = address.substring(2).toLowerCase()\n const hash = Hash.keccak256(Bytes.fromString(hexAddress), { as: 'Bytes' })\n\n const characters = hexAddress.split('')\n for (let i = 0; i < 40; i += 2) {\n if (hash[i >> 1]! >> 4 >= 8 && characters[i]) {\n characters[i] = characters[i]!.toUpperCase()\n }\n if ((hash[i >> 1]! & 0x0f) >= 8 && characters[i + 1]) {\n characters[i + 1] = characters[i + 1]!.toUpperCase()\n }\n }\n\n const result = `0x${characters.join('')}` as const\n Caches.checksum.set(address, result)\n return result\n}\n\nexport declare namespace checksum {\n type ErrorType =\n | assert.ErrorType\n | Hash.keccak256.ErrorType\n | Bytes.fromString.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts a stringified address to a typed (optionally checksummed) {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0xa0cf798816d4b9b9866b5330eea46a18382f251e')\n * // @log: '0xa0cf798816d4b9b9866b5330eea46a18382f251e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0xa0cf798816d4b9b9866b5330eea46a18382f251e', {\n * checksum: true\n * })\n * // @log: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('hello')\n * // @error: InvalidAddressError: Address \"0xa\" is invalid.\n * ```\n *\n * @param address - An address string to convert to a typed Address.\n * @param options - Conversion options.\n * @returns The typed Address.\n */\nexport function from(address: string, options: from.Options = {}): Address {\n const { checksum: checksumVal = false } = options\n assert(address)\n if (checksumVal) return checksum(address)\n return address as Address\n}\n\nexport declare namespace from {\n type Options = {\n /**\n * Whether to checksum the address.\n *\n * @default false\n */\n checksum?: boolean | undefined\n }\n\n type ErrorType =\n | assert.ErrorType\n | checksum.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts an ECDSA public key to an {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address, PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from(\n * '0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5',\n * )\n * const address = Address.fromPublicKey(publicKey)\n * // @log: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'\n * ```\n *\n * @param publicKey - The ECDSA public key to convert to an {@link ox#Address.Address}.\n * @param options - Conversion options.\n * @returns The {@link ox#Address.Address} corresponding to the public key.\n */\nexport function fromPublicKey(\n publicKey: PublicKey.PublicKey,\n options: fromPublicKey.Options = {},\n): Address {\n const address = Hash.keccak256(\n `0x${PublicKey.toHex(publicKey).slice(4)}`,\n ).substring(26)\n return from(`0x${address}`, options)\n}\n\nexport declare namespace fromPublicKey {\n type Options = {\n /**\n * Whether to checksum the address.\n *\n * @default false\n */\n checksum?: boolean | undefined\n }\n\n type ErrorType =\n | Hash.keccak256.ErrorType\n | PublicKey.toHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if two {@link ox#Address.Address} are equal.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.isEqual(\n * '0xa0cf798816d4b9b9866b5330eea46a18382f251e',\n * '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * )\n * // @log: true\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.isEqual(\n * '0xa0cf798816d4b9b9866b5330eea46a18382f251e',\n * '0xA0Cf798816D4b9b9866b5330EEa46a18382f251f'\n * )\n * // @log: false\n * ```\n *\n * @param addressA - The first address to compare.\n * @param addressB - The second address to compare.\n * @returns Whether the addresses are equal.\n */\nexport function isEqual(addressA: Address, addressB: Address): boolean {\n assert(addressA, { strict: false })\n assert(addressB, { strict: false })\n return addressA.toLowerCase() === addressB.toLowerCase()\n}\n\nexport declare namespace isEqual {\n type ErrorType = assert.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Checks if the given address is a valid {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.validate('0xA0Cf798816D4b9b9866b5330EEa46a18382f251e')\n * // @log: true\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param address - Value to check if it is a valid address.\n * @param options - Check options.\n * @returns Whether the address is a valid address.\n */\nexport function validate(\n address: string,\n options: validate.Options = {},\n): address is Address {\n const { strict = true } = options ?? {}\n try {\n assert(address, { strict })\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /**\n * Enables strict mode. Whether or not to compare the address against its checksum.\n *\n * @default true\n */\n strict?: boolean | undefined\n }\n}\n\n/**\n * Thrown when an address is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0x123')\n * // @error: Address.InvalidAddressError: Address `0x123` is invalid.\n * ```\n */\nexport class InvalidAddressError<\n cause extends InvalidInputError | InvalidChecksumError =\n | InvalidInputError\n | InvalidChecksumError,\n> extends Errors.BaseError {\n override readonly name = 'Address.InvalidAddressError'\n\n constructor({ address, cause }: { address: string; cause: cause }) {\n super(`Address \"${address}\" is invalid.`, {\n cause,\n })\n }\n}\n\n/** Thrown when an address is not a 20 byte (40 hexadecimal character) value. */\nexport class InvalidInputError extends Errors.BaseError {\n override readonly name = 'Address.InvalidInputError'\n\n constructor() {\n super('Address is not a 20 byte (40 hexadecimal character) value.')\n }\n}\n\n/** Thrown when an address does not match its checksum counterpart. */\nexport class InvalidChecksumError extends Errors.BaseError {\n override readonly name = 'Address.InvalidChecksumError'\n\n constructor() {\n super('Address does not match its checksum counterpart.')\n }\n}\n","/**\n * @internal\n *\n * Map with a LRU (Least recently used) policy.\n * @see https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n */\nexport class LruMap extends Map {\n maxSize: number\n\n constructor(size: number) {\n super()\n this.maxSize = size\n }\n\n override get(key: string) {\n const value = super.get(key)\n\n if (super.has(key) && value !== undefined) {\n this.delete(key)\n super.set(key, value)\n }\n\n return value\n }\n\n override set(key: string, value: value) {\n super.set(key, value)\n if (this.maxSize && this.size > this.maxSize) {\n const firstKey = this.keys().next().value\n if (firstKey) this.delete(firstKey)\n }\n return this\n }\n}\n","import type * as Address from './Address.js'\nimport { LruMap } from './internal/lru.js'\n\nconst caches = {\n checksum: /*#__PURE__*/ new LruMap(8192),\n}\n\nexport const checksum = caches.checksum\n\n/**\n * Clears all global caches.\n *\n * @example\n * ```ts\n * import { Caches } from 'ox'\n * Caches.clear()\n * ```\n */\nexport function clear() {\n for (const cache of Object.values(caches)) cache.clear()\n}\n","import { hmac } from '@noble/hashes/hmac'\nimport { ripemd160 as noble_ripemd160 } from '@noble/hashes/ripemd160'\nimport { keccak_256 as noble_keccak256 } from '@noble/hashes/sha3'\nimport { sha256 as noble_sha256 } from '@noble/hashes/sha256'\nimport * as Bytes from './Bytes.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\n\n/**\n * Calculates the [Keccak256](https://en.wikipedia.org/wiki/SHA-3) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `keccak_256` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.keccak256('0xdeadbeef')\n * // @log: '0xd4fd4e189132273036449fc9e11198c739161b4c0116a9a2dccdfa1c492006f1'\n * ```\n *\n * @example\n * ### Calculate Hash of a String\n *\n * ```ts twoslash\n * import { Hash, Hex } from 'ox'\n *\n * Hash.keccak256(Hex.fromString('hello world'))\n * // @log: '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0'\n * ```\n *\n * @example\n * ### Configure Return Type\n *\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.keccak256('0xdeadbeef', { as: 'Bytes' })\n * // @log: Uint8Array [...]\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Keccak256 hash.\n */\nexport function keccak256<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n value: value | Hex.Hex | Bytes.Bytes,\n options: keccak256.Options = {},\n): keccak256.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = noble_keccak256(Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace keccak256 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Calculates the [HMAC-SHA256](https://en.wikipedia.org/wiki/HMAC) of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `hmac` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash, Hex } from 'ox'\n *\n * Hash.hmac256(Hex.fromString('key'), '0xdeadbeef')\n * // @log: '0x...'\n * ```\n *\n * @example\n * ### Configure Return Type\n *\n * ```ts twoslash\n * import { Hash, Hex } from 'ox'\n *\n * Hash.hmac256(Hex.fromString('key'), '0xdeadbeef', { as: 'Bytes' })\n * // @log: Uint8Array [...]\n * ```\n *\n * @param key - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} key.\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns HMAC-SHA256 hash.\n */\nexport function hmac256<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n key: Hex.Hex | Bytes.Bytes,\n value: value | Hex.Hex | Bytes.Bytes,\n options: hmac256.Options = {},\n): hmac256.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = hmac(noble_sha256, Bytes.from(key), Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace hmac256 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Calculates the [Ripemd160](https://en.wikipedia.org/wiki/RIPEMD) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `ripemd160` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.ripemd160('0xdeadbeef')\n * // '0x226821c2f5423e11fe9af68bd285c249db2e4b5a'\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Ripemd160 hash.\n */\nexport function ripemd160<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n value: value | Hex.Hex | Bytes.Bytes,\n options: ripemd160.Options = {},\n): ripemd160.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = noble_ripemd160(Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace ripemd160 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Calculates the [Sha256](https://en.wikipedia.org/wiki/SHA-256) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `sha256` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.sha256('0xdeadbeef')\n * // '0x5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953'\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Sha256 hash.\n */\nexport function sha256<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n value: value | Hex.Hex | Bytes.Bytes,\n options: sha256.Options = {},\n): sha256.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = noble_sha256(Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace sha256 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if a string is a valid hash value.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.validate('0x')\n * // @log: false\n *\n * Hash.validate('0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0')\n * // @log: true\n * ```\n *\n * @param value - Value to check.\n * @returns Whether the value is a valid hash.\n */\nexport function validate(value: string): value is Hex.Hex {\n return Hex.validate(value) && Hex.size(value) === 32\n}\n\nexport declare namespace validate {\n type ErrorType =\n | Hex.validate.ErrorType\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n","import * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type { Compute, ExactPartial } from './internal/types.js'\nimport * as Json from './Json.js'\n\n/** Root type for an ECDSA Public Key. */\nexport type PublicKey<\n compressed extends boolean = false,\n bigintType = bigint,\n numberType = number,\n> = Compute<\n compressed extends true\n ? {\n prefix: numberType\n x: bigintType\n y?: undefined\n }\n : {\n prefix: numberType\n x: bigintType\n y: bigintType\n }\n>\n\n/**\n * Asserts that a {@link ox#PublicKey.PublicKey} is valid.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * PublicKey.assert({\n * prefix: 4,\n * y: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * })\n * // @error: PublicKey.InvalidError: Value \\`{\"y\":\"1\"}\\` is not a valid public key.\n * // @error: Public key must contain:\n * // @error: - an `x` and `prefix` value (compressed)\n * // @error: - an `x`, `y`, and `prefix` value (uncompressed)\n * ```\n *\n * @param publicKey - The public key object to assert.\n */\nexport function assert(\n publicKey: ExactPartial,\n options: assert.Options = {},\n): asserts publicKey is PublicKey {\n const { compressed } = options\n const { prefix, x, y } = publicKey\n\n // Uncompressed\n if (\n compressed === false ||\n (typeof x === 'bigint' && typeof y === 'bigint')\n ) {\n if (prefix !== 4)\n throw new InvalidPrefixError({\n prefix,\n cause: new InvalidUncompressedPrefixError(),\n })\n return\n }\n\n // Compressed\n if (\n compressed === true ||\n (typeof x === 'bigint' && typeof y === 'undefined')\n ) {\n if (prefix !== 3 && prefix !== 2)\n throw new InvalidPrefixError({\n prefix,\n cause: new InvalidCompressedPrefixError(),\n })\n return\n }\n\n // Unknown/invalid\n throw new InvalidError({ publicKey })\n}\n\nexport declare namespace assert {\n type Options = {\n /** Whether or not the public key should be compressed. */\n compressed?: boolean\n }\n\n type ErrorType = InvalidError | InvalidPrefixError | Errors.GlobalErrorType\n}\n\n/**\n * Compresses a {@link ox#PublicKey.PublicKey}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const compressed = PublicKey.compress(publicKey) // [!code focus]\n * // @log: {\n * // @log: prefix: 3,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: }\n * ```\n *\n * @param publicKey - The public key to compress.\n * @returns The compressed public key.\n */\nexport function compress(publicKey: PublicKey): PublicKey {\n const { x, y } = publicKey\n return {\n prefix: y % 2n === 0n ? 2 : 3,\n x,\n }\n}\n\nexport declare namespace compress {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a typed {@link ox#PublicKey.PublicKey} object from a {@link ox#PublicKey.PublicKey}, {@link ox#Bytes.Bytes}, or {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @example\n * ### From Serialized\n *\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from('0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5')\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @param value - The public key value to instantiate.\n * @returns The instantiated {@link ox#PublicKey.PublicKey}.\n */\nexport function from<\n const publicKey extends\n | CompressedPublicKey\n | UncompressedPublicKey\n | Hex.Hex\n | Bytes.Bytes,\n>(value: from.Value): from.ReturnType {\n const publicKey = (() => {\n if (Hex.validate(value)) return fromHex(value)\n if (Bytes.validate(value)) return fromBytes(value)\n\n const { prefix, x, y } = value\n if (typeof x === 'bigint' && typeof y === 'bigint')\n return { prefix: prefix ?? 0x04, x, y }\n return { prefix, x }\n })()\n\n assert(publicKey)\n\n return publicKey as never\n}\n\n/** @internal */\ntype CompressedPublicKey = PublicKey\n\n/** @internal */\ntype UncompressedPublicKey = Omit, 'prefix'> & {\n prefix?: PublicKey['prefix'] | undefined\n}\n\nexport declare namespace from {\n type Value<\n publicKey extends\n | CompressedPublicKey\n | UncompressedPublicKey\n | Hex.Hex\n | Bytes.Bytes = PublicKey,\n > = publicKey | CompressedPublicKey | UncompressedPublicKey\n\n type ReturnType<\n publicKey extends\n | CompressedPublicKey\n | UncompressedPublicKey\n | Hex.Hex\n | Bytes.Bytes = PublicKey,\n > = publicKey extends CompressedPublicKey | UncompressedPublicKey\n ? publicKey extends UncompressedPublicKey\n ? Compute\n : publicKey\n : PublicKey\n\n type ErrorType = assert.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#PublicKey.PublicKey} from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromBytes(new Uint8Array([128, 3, 131, ...]))\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @param publicKey - The serialized public key.\n * @returns The deserialized public key.\n */\nexport function fromBytes(publicKey: Bytes.Bytes): PublicKey {\n return fromHex(Hex.fromBytes(publicKey))\n}\n\nexport declare namespace fromBytes {\n type ErrorType =\n | fromHex.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#PublicKey.PublicKey} from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromHex('0x8318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5')\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @example\n * ### Deserializing a Compressed Public Key\n *\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromHex('0x038318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed75')\n * // @log: {\n * // @log: prefix: 3,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: }\n * ```\n *\n * @param publicKey - The serialized public key.\n * @returns The deserialized public key.\n */\nexport function fromHex(publicKey: Hex.Hex): PublicKey {\n if (\n publicKey.length !== 132 &&\n publicKey.length !== 130 &&\n publicKey.length !== 68\n )\n throw new InvalidSerializedSizeError({ publicKey })\n\n if (publicKey.length === 130) {\n const x = BigInt(Hex.slice(publicKey, 0, 32))\n const y = BigInt(Hex.slice(publicKey, 32, 64))\n return {\n prefix: 4,\n x,\n y,\n } as never\n }\n\n if (publicKey.length === 132) {\n const prefix = Number(Hex.slice(publicKey, 0, 1))\n const x = BigInt(Hex.slice(publicKey, 1, 33))\n const y = BigInt(Hex.slice(publicKey, 33, 65))\n return {\n prefix,\n x,\n y,\n } as never\n }\n\n const prefix = Number(Hex.slice(publicKey, 0, 1))\n const x = BigInt(Hex.slice(publicKey, 1, 33))\n return {\n prefix,\n x,\n } as never\n}\n\nexport declare namespace fromHex {\n type ErrorType = Hex.slice.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#PublicKey.PublicKey} to {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const bytes = PublicKey.toBytes(publicKey) // [!code focus]\n * // @log: Uint8Array [128, 3, 131, ...]\n * ```\n *\n * @param publicKey - The public key to serialize.\n * @returns The serialized public key.\n */\nexport function toBytes(\n publicKey: PublicKey,\n options: toBytes.Options = {},\n): Bytes.Bytes {\n return Bytes.fromHex(toHex(publicKey, options))\n}\n\nexport declare namespace toBytes {\n type Options = {\n /**\n * Whether to include the prefix in the serialized public key.\n * @default true\n */\n includePrefix?: boolean | undefined\n }\n\n type ErrorType =\n | Hex.fromNumber.ErrorType\n | Bytes.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#PublicKey.PublicKey} to {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const hex = PublicKey.toHex(publicKey) // [!code focus]\n * // @log: '0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5'\n * ```\n *\n * @param publicKey - The public key to serialize.\n * @returns The serialized public key.\n */\nexport function toHex(\n publicKey: PublicKey,\n options: toHex.Options = {},\n): Hex.Hex {\n assert(publicKey)\n\n const { prefix, x, y } = publicKey\n const { includePrefix = true } = options\n\n const publicKey_ = Hex.concat(\n includePrefix ? Hex.fromNumber(prefix, { size: 1 }) : '0x',\n Hex.fromNumber(x, { size: 32 }),\n // If the public key is not compressed, add the y coordinate.\n typeof y === 'bigint' ? Hex.fromNumber(y, { size: 32 }) : '0x',\n )\n\n return publicKey_\n}\n\nexport declare namespace toHex {\n type Options = {\n /**\n * Whether to include the prefix in the serialized public key.\n * @default true\n */\n includePrefix?: boolean | undefined\n }\n\n type ErrorType = Hex.fromNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Validates a {@link ox#PublicKey.PublicKey}. Returns `true` if valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const valid = PublicKey.validate({\n * prefix: 4,\n * y: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * })\n * // @log: false\n * ```\n *\n * @param publicKey - The public key object to assert.\n */\nexport function validate(\n publicKey: ExactPartial,\n options: validate.Options = {},\n): boolean {\n try {\n assert(publicKey, options)\n return true\n } catch (_error) {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /** Whether or not the public key should be compressed. */\n compressed?: boolean\n }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Thrown when a public key is invalid.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * PublicKey.assert({ y: 1n })\n * // @error: PublicKey.InvalidError: Value `{\"y\":1n}` is not a valid public key.\n * // @error: Public key must contain:\n * // @error: - an `x` and `prefix` value (compressed)\n * // @error: - an `x`, `y`, and `prefix` value (uncompressed)\n * ```\n */\nexport class InvalidError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidError'\n\n constructor({ publicKey }: { publicKey: unknown }) {\n super(`Value \\`${Json.stringify(publicKey)}\\` is not a valid public key.`, {\n metaMessages: [\n 'Public key must contain:',\n '- an `x` and `prefix` value (compressed)',\n '- an `x`, `y`, and `prefix` value (uncompressed)',\n ],\n })\n }\n}\n\n/** Thrown when a public key has an invalid prefix. */\nexport class InvalidPrefixError<\n cause extends InvalidCompressedPrefixError | InvalidUncompressedPrefixError =\n | InvalidCompressedPrefixError\n | InvalidUncompressedPrefixError,\n> extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidPrefixError'\n\n constructor({ prefix, cause }: { prefix: number | undefined; cause: cause }) {\n super(`Prefix \"${prefix}\" is invalid.`, {\n cause,\n })\n }\n}\n\n/** Thrown when the public key has an invalid prefix for a compressed public key. */\nexport class InvalidCompressedPrefixError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidCompressedPrefixError'\n\n constructor() {\n super('Prefix must be 2 or 3 for compressed public keys.')\n }\n}\n\n/** Thrown when the public key has an invalid prefix for an uncompressed public key. */\nexport class InvalidUncompressedPrefixError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidUncompressedPrefixError'\n\n constructor() {\n super('Prefix must be 4 for uncompressed public keys.')\n }\n}\n\n/** Thrown when the public key has an invalid serialized size. */\nexport class InvalidSerializedSizeError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidSerializedSizeError'\n\n constructor({ publicKey }: { publicKey: Hex.Hex | Bytes.Bytes }) {\n super(`Value \\`${publicKey}\\` is an invalid public key size.`, {\n metaMessages: [\n 'Expected: 33 bytes (compressed + prefix), 64 bytes (uncompressed) or 65 bytes (uncompressed + prefix).',\n `Received ${Hex.size(Hex.from(publicKey))} bytes.`,\n ],\n })\n }\n}\n","import type {\n AbiParameter,\n AbiParameterKind,\n AbiParametersToPrimitiveTypes,\n AbiParameterToPrimitiveType,\n} from 'abitype'\nimport * as AbiParameters from '../AbiParameters.js'\nimport * as Address from '../Address.js'\nimport * as Bytes from '../Bytes.js'\nimport * as Errors from '../Errors.js'\nimport * as Hex from '../Hex.js'\nimport { integerRegex } from '../Solidity.js'\nimport type * as Cursor from './cursor.js'\nimport type { Compute, IsNarrowable, UnionToIntersection } from './types.js'\n\n/** @internal */\nexport type ParameterToPrimitiveType<\n abiParameter extends AbiParameter | { name: string; type: unknown },\n abiParameterKind extends AbiParameterKind = AbiParameterKind,\n> = AbiParameterToPrimitiveType\n\n/** @internal */\nexport type PreparedParameter = { dynamic: boolean; encoded: Hex.Hex }\n\n/** @internal */\nexport type ToObject<\n parameters extends readonly AbiParameter[],\n kind extends AbiParameterKind = AbiParameterKind,\n> = IsNarrowable extends true\n ? Compute<\n UnionToIntersection<\n {\n [index in keyof parameters]: parameters[index] extends {\n name: infer name extends string\n }\n ? {\n [key in name]: AbiParameterToPrimitiveType<\n parameters[index],\n kind\n >\n }\n : {\n [key in index]: AbiParameterToPrimitiveType<\n parameters[index],\n kind\n >\n }\n }[number]\n >\n >\n : unknown\n\n/** @internal */\nexport type ToPrimitiveTypes<\n abiParameters extends readonly AbiParameter[],\n abiParameterKind extends AbiParameterKind = AbiParameterKind,\n> = AbiParametersToPrimitiveTypes\n\n/** @internal */\nexport type Tuple = ParameterToPrimitiveType\n\n/** @internal */\nexport function decodeParameter(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n options: { checksumAddress?: boolean | undefined; staticPosition: number },\n) {\n const { checksumAddress, staticPosition } = options\n const arrayComponents = getArrayComponents(param.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return decodeArray(\n cursor,\n { ...param, type },\n { checksumAddress, length, staticPosition },\n )\n }\n if (param.type === 'tuple')\n return decodeTuple(cursor, param as TupleAbiParameter, {\n checksumAddress,\n staticPosition,\n })\n if (param.type === 'address')\n return decodeAddress(cursor, { checksum: checksumAddress })\n if (param.type === 'bool') return decodeBool(cursor)\n if (param.type.startsWith('bytes'))\n return decodeBytes(cursor, param, { staticPosition })\n if (param.type.startsWith('uint') || param.type.startsWith('int'))\n return decodeNumber(cursor, param)\n if (param.type === 'string') return decodeString(cursor, { staticPosition })\n throw new AbiParameters.InvalidTypeError(param.type)\n}\n\nexport declare namespace decodeParameter {\n type ErrorType =\n | decodeArray.ErrorType\n | decodeTuple.ErrorType\n | decodeAddress.ErrorType\n | decodeBool.ErrorType\n | decodeBytes.ErrorType\n | decodeNumber.ErrorType\n | decodeString.ErrorType\n | AbiParameters.InvalidTypeError\n | Errors.GlobalErrorType\n}\n\nconst sizeOfLength = 32\nconst sizeOfOffset = 32\n\n/** @internal */\nexport function decodeAddress(\n cursor: Cursor.Cursor,\n options: { checksum?: boolean | undefined } = {},\n) {\n const { checksum = false } = options\n const value = cursor.readBytes(32)\n const wrap = (address: Hex.Hex) =>\n checksum ? Address.checksum(address) : address\n return [wrap(Hex.fromBytes(Bytes.slice(value, -20))), 32]\n}\n\nexport declare namespace decodeAddress {\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Bytes.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeArray(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n options: {\n checksumAddress?: boolean | undefined\n length: number | null\n staticPosition: number\n },\n) {\n const { checksumAddress, length, staticPosition } = options\n\n // If the length of the array is not known in advance (dynamic array),\n // this means we will need to wonder off to the pointer and decode.\n if (!length) {\n // Dealing with a dynamic type, so get the offset of the array data.\n const offset = Bytes.toNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n const startOfData = start + sizeOfLength\n\n // Get the length of the array from the offset.\n cursor.setPosition(start)\n const length = Bytes.toNumber(cursor.readBytes(sizeOfLength))\n\n // Check if the array has any dynamic children.\n const dynamicChild = hasDynamicChild(param)\n\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // If any of the children is dynamic, then all elements will be offset pointer, thus size of one slot (32 bytes).\n // Otherwise, elements will be the size of their encoding (consumed bytes).\n cursor.setPosition(startOfData + (dynamicChild ? i * 32 : consumed))\n const [data, consumed_] = decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: startOfData,\n })\n consumed += consumed_\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance,\n // and the length of an element deeply nested in the array is not known,\n // we need to decode the offset of the array data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the array data.\n const offset = Bytes.toNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // Move cursor along to the next slot (next offset pointer).\n cursor.setPosition(start + i * 32)\n const [data] = decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: start,\n })\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance and the array is deeply static,\n // then we can just decode each element in sequence.\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n const [data, consumed_] = decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: staticPosition + consumed,\n })\n consumed += consumed_\n value.push(data)\n }\n return [value, consumed]\n}\n\nexport declare namespace decodeArray {\n type ErrorType = Bytes.toNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeBool(cursor: Cursor.Cursor) {\n return [Bytes.toBoolean(cursor.readBytes(32), { size: 32 }), 32]\n}\n\nexport declare namespace decodeBool {\n type ErrorType = Bytes.toBoolean.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeBytes(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n { staticPosition }: { staticPosition: number },\n) {\n const [_, size] = param.type.split('bytes')\n if (!size) {\n // Dealing with dynamic types, so get the offset of the bytes data.\n const offset = Bytes.toNumber(cursor.readBytes(32))\n\n // Set position of the cursor to start of bytes data.\n cursor.setPosition(staticPosition + offset)\n\n const length = Bytes.toNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data.\n if (length === 0) {\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return ['0x', 32]\n }\n\n const data = cursor.readBytes(length)\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [Hex.fromBytes(data), 32]\n }\n\n const value = Hex.fromBytes(cursor.readBytes(Number.parseInt(size, 10), 32))\n return [value, 32]\n}\n\nexport declare namespace decodeBytes {\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Bytes.toNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeNumber(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n) {\n const signed = param.type.startsWith('int')\n const size = Number.parseInt(param.type.split('int')[1] || '256', 10)\n const value = cursor.readBytes(32)\n return [\n size > 48\n ? Bytes.toBigInt(value, { signed })\n : Bytes.toNumber(value, { signed }),\n 32,\n ]\n}\n\nexport declare namespace decodeNumber {\n type ErrorType =\n | Bytes.toNumber.ErrorType\n | Bytes.toBigInt.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport type TupleAbiParameter = AbiParameters.Parameter & {\n components: readonly AbiParameters.Parameter[]\n}\n\n/** @internal */\nexport function decodeTuple(\n cursor: Cursor.Cursor,\n param: TupleAbiParameter,\n options: { checksumAddress?: boolean | undefined; staticPosition: number },\n) {\n const { checksumAddress, staticPosition } = options\n\n // Tuples can have unnamed components (i.e. they are arrays), so we must\n // determine whether the tuple is named or unnamed. In the case of a named\n // tuple, the value will be an object where each property is the name of the\n // component. In the case of an unnamed tuple, the value will be an array.\n const hasUnnamedChild =\n param.components.length === 0 || param.components.some(({ name }) => !name)\n\n // Initialize the value to an object or an array, depending on whether the\n // tuple is named or unnamed.\n const value: any = hasUnnamedChild ? [] : {}\n let consumed = 0\n\n // If the tuple has a dynamic child, we must first decode the offset to the\n // tuple data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the tuple data.\n const offset = Bytes.toNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of referencing slot + offset.\n const start = staticPosition + offset\n\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]!\n cursor.setPosition(start + consumed)\n const [data, consumed_] = decodeParameter(cursor, component, {\n checksumAddress,\n staticPosition: start,\n })\n consumed += consumed_\n value[hasUnnamedChild ? i : component?.name!] = data\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the tuple has static children, we can just decode each component\n // in sequence.\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]!\n const [data, consumed_] = decodeParameter(cursor, component, {\n checksumAddress,\n staticPosition,\n })\n value[hasUnnamedChild ? i : component?.name!] = data\n consumed += consumed_\n }\n return [value, consumed]\n}\n\nexport declare namespace decodeTuple {\n type ErrorType = Bytes.toNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeString(\n cursor: Cursor.Cursor,\n { staticPosition }: { staticPosition: number },\n) {\n // Get offset to start of string data.\n const offset = Bytes.toNumber(cursor.readBytes(32))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n cursor.setPosition(start)\n\n const length = Bytes.toNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data (empty string).\n if (length === 0) {\n cursor.setPosition(staticPosition + 32)\n return ['', 32]\n }\n\n const data = cursor.readBytes(length, 32)\n const value = Bytes.toString(Bytes.trimLeft(data))\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n\n return [value, 32]\n}\n\nexport declare namespace decodeString {\n type ErrorType =\n | Bytes.toNumber.ErrorType\n | Bytes.toString.ErrorType\n | Bytes.trimLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function prepareParameters<\n const parameters extends AbiParameters.AbiParameters,\n>({\n checksumAddress,\n parameters,\n values,\n}: {\n checksumAddress?: boolean | undefined\n parameters: parameters\n values: parameters extends AbiParameters.AbiParameters\n ? ToPrimitiveTypes\n : never\n}) {\n const preparedParameters: PreparedParameter[] = []\n for (let i = 0; i < parameters.length; i++) {\n preparedParameters.push(\n prepareParameter({\n checksumAddress,\n parameter: parameters[i]!,\n value: values[i],\n }),\n )\n }\n return preparedParameters\n}\n\n/** @internal */\nexport declare namespace prepareParameters {\n type ErrorType = prepareParameter.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function prepareParameter<\n const parameter extends AbiParameters.Parameter,\n>({\n checksumAddress = false,\n parameter: parameter_,\n value,\n}: {\n parameter: parameter\n value: parameter extends AbiParameters.Parameter\n ? ParameterToPrimitiveType\n : never\n checksumAddress?: boolean | undefined\n}): PreparedParameter {\n const parameter = parameter_ as AbiParameters.Parameter\n\n const arrayComponents = getArrayComponents(parameter.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return encodeArray(value, {\n checksumAddress,\n length,\n parameter: {\n ...parameter,\n type,\n },\n })\n }\n if (parameter.type === 'tuple') {\n return encodeTuple(value as unknown as Tuple, {\n checksumAddress,\n parameter: parameter as TupleAbiParameter,\n })\n }\n if (parameter.type === 'address') {\n return encodeAddress(value as unknown as Hex.Hex, {\n checksum: checksumAddress,\n })\n }\n if (parameter.type === 'bool') {\n return encodeBoolean(value as unknown as boolean)\n }\n if (parameter.type.startsWith('uint') || parameter.type.startsWith('int')) {\n const signed = parameter.type.startsWith('int')\n const [, , size = '256'] = integerRegex.exec(parameter.type) ?? []\n return encodeNumber(value as unknown as number, {\n signed,\n size: Number(size),\n })\n }\n if (parameter.type.startsWith('bytes')) {\n return encodeBytes(value as unknown as Hex.Hex, { type: parameter.type })\n }\n if (parameter.type === 'string') {\n return encodeString(value as unknown as string)\n }\n throw new AbiParameters.InvalidTypeError(parameter.type)\n}\n\n/** @internal */\nexport declare namespace prepareParameter {\n type ErrorType =\n | encodeArray.ErrorType\n | encodeTuple.ErrorType\n | encodeAddress.ErrorType\n | encodeBoolean.ErrorType\n | encodeBytes.ErrorType\n | encodeString.ErrorType\n | AbiParameters.InvalidTypeError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encode(preparedParameters: PreparedParameter[]): Hex.Hex {\n // 1. Compute the size of the static part of the parameters.\n let staticSize = 0\n for (let i = 0; i < preparedParameters.length; i++) {\n const { dynamic, encoded } = preparedParameters[i]!\n if (dynamic) staticSize += 32\n else staticSize += Hex.size(encoded)\n }\n\n // 2. Split the parameters into static and dynamic parts.\n const staticParameters: Hex.Hex[] = []\n const dynamicParameters: Hex.Hex[] = []\n let dynamicSize = 0\n for (let i = 0; i < preparedParameters.length; i++) {\n const { dynamic, encoded } = preparedParameters[i]!\n if (dynamic) {\n staticParameters.push(\n Hex.fromNumber(staticSize + dynamicSize, { size: 32 }),\n )\n dynamicParameters.push(encoded)\n dynamicSize += Hex.size(encoded)\n } else {\n staticParameters.push(encoded)\n }\n }\n\n // 3. Concatenate static and dynamic parts.\n return Hex.concat(...staticParameters, ...dynamicParameters)\n}\n\n/** @internal */\nexport declare namespace encode {\n type ErrorType =\n | Hex.concat.ErrorType\n | Hex.fromNumber.ErrorType\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeAddress(\n value: Hex.Hex,\n options: { checksum: boolean },\n): PreparedParameter {\n const { checksum = false } = options\n Address.assert(value, { strict: checksum })\n return {\n dynamic: false,\n encoded: Hex.padLeft(value.toLowerCase() as Hex.Hex),\n }\n}\n\n/** @internal */\nexport declare namespace encodeAddress {\n type ErrorType =\n | Address.assert.ErrorType\n | Hex.padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeArray(\n value: ParameterToPrimitiveType,\n options: {\n checksumAddress?: boolean | undefined\n length: number | null\n parameter: parameter\n },\n): PreparedParameter {\n const { checksumAddress, length, parameter } = options\n\n const dynamic = length === null\n\n if (!Array.isArray(value)) throw new AbiParameters.InvalidArrayError(value)\n if (!dynamic && value.length !== length)\n throw new AbiParameters.ArrayLengthMismatchError({\n expectedLength: length!,\n givenLength: value.length,\n type: `${parameter.type}[${length}]`,\n })\n\n let dynamicChild = false\n const preparedParameters: PreparedParameter[] = []\n for (let i = 0; i < value.length; i++) {\n const preparedParam = prepareParameter({\n checksumAddress,\n parameter,\n value: value[i],\n })\n if (preparedParam.dynamic) dynamicChild = true\n preparedParameters.push(preparedParam)\n }\n\n if (dynamic || dynamicChild) {\n const data = encode(preparedParameters)\n if (dynamic) {\n const length = Hex.fromNumber(preparedParameters.length, { size: 32 })\n return {\n dynamic: true,\n encoded:\n preparedParameters.length > 0 ? Hex.concat(length, data) : length,\n }\n }\n if (dynamicChild) return { dynamic: true, encoded: data }\n }\n return {\n dynamic: false,\n encoded: Hex.concat(...preparedParameters.map(({ encoded }) => encoded)),\n }\n}\n\n/** @internal */\nexport declare namespace encodeArray {\n type ErrorType =\n | AbiParameters.InvalidArrayError\n | AbiParameters.ArrayLengthMismatchError\n | Hex.concat.ErrorType\n | Hex.fromNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeBytes(\n value: Hex.Hex,\n { type }: { type: string },\n): PreparedParameter {\n const [, parametersize] = type.split('bytes')\n const bytesSize = Hex.size(value)\n if (!parametersize) {\n let value_ = value\n // If the size is not divisible by 32 bytes, pad the end\n // with empty bytes to the ceiling 32 bytes.\n if (bytesSize % 32 !== 0)\n value_ = Hex.padRight(value_, Math.ceil((value.length - 2) / 2 / 32) * 32)\n return {\n dynamic: true,\n encoded: Hex.concat(\n Hex.padLeft(Hex.fromNumber(bytesSize, { size: 32 })),\n value_,\n ),\n }\n }\n if (bytesSize !== Number.parseInt(parametersize, 10))\n throw new AbiParameters.BytesSizeMismatchError({\n expectedSize: Number.parseInt(parametersize, 10),\n value,\n })\n return { dynamic: false, encoded: Hex.padRight(value) }\n}\n\n/** @internal */\nexport declare namespace encodeBytes {\n type ErrorType =\n | Hex.padLeft.ErrorType\n | Hex.padRight.ErrorType\n | Hex.fromNumber.ErrorType\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeBoolean(value: boolean): PreparedParameter {\n if (typeof value !== 'boolean')\n throw new Errors.BaseError(\n `Invalid boolean value: \"${value}\" (type: ${typeof value}). Expected: \\`true\\` or \\`false\\`.`,\n )\n return { dynamic: false, encoded: Hex.padLeft(Hex.fromBoolean(value)) }\n}\n\n/** @internal */\nexport declare namespace encodeBoolean {\n type ErrorType =\n | Hex.padLeft.ErrorType\n | Hex.fromBoolean.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeNumber(\n value: number,\n { signed, size }: { signed: boolean; size: number },\n): PreparedParameter {\n if (typeof size === 'number') {\n const max = 2n ** (BigInt(size) - (signed ? 1n : 0n)) - 1n\n const min = signed ? -max - 1n : 0n\n if (value > max || value < min)\n throw new Hex.IntegerOutOfRangeError({\n max: max.toString(),\n min: min.toString(),\n signed,\n size: size / 8,\n value: value.toString(),\n })\n }\n return {\n dynamic: false,\n encoded: Hex.fromNumber(value, {\n size: 32,\n signed,\n }),\n }\n}\n\n/** @internal */\nexport declare namespace encodeNumber {\n type ErrorType = Hex.fromNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeString(value: string): PreparedParameter {\n const hexValue = Hex.fromString(value)\n const partsLength = Math.ceil(Hex.size(hexValue) / 32)\n const parts: Hex.Hex[] = []\n for (let i = 0; i < partsLength; i++) {\n parts.push(Hex.padRight(Hex.slice(hexValue, i * 32, (i + 1) * 32)))\n }\n return {\n dynamic: true,\n encoded: Hex.concat(\n Hex.padRight(Hex.fromNumber(Hex.size(hexValue), { size: 32 })),\n ...parts,\n ),\n }\n}\n\n/** @internal */\nexport declare namespace encodeString {\n type ErrorType =\n | Hex.fromNumber.ErrorType\n | Hex.padRight.ErrorType\n | Hex.slice.ErrorType\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeTuple<\n const parameter extends AbiParameters.Parameter & {\n components: readonly AbiParameters.Parameter[]\n },\n>(\n value: ParameterToPrimitiveType,\n options: {\n checksumAddress?: boolean | undefined\n parameter: parameter\n },\n): PreparedParameter {\n const { checksumAddress, parameter } = options\n\n let dynamic = false\n const preparedParameters: PreparedParameter[] = []\n for (let i = 0; i < parameter.components.length; i++) {\n const param_ = parameter.components[i]!\n const index = Array.isArray(value) ? i : param_.name\n const preparedParam = prepareParameter({\n checksumAddress,\n parameter: param_,\n value: (value as any)[index!] as readonly unknown[],\n })\n preparedParameters.push(preparedParam)\n if (preparedParam.dynamic) dynamic = true\n }\n return {\n dynamic,\n encoded: dynamic\n ? encode(preparedParameters)\n : Hex.concat(...preparedParameters.map(({ encoded }) => encoded)),\n }\n}\n\n/** @internal */\nexport declare namespace encodeTuple {\n type ErrorType = Hex.concat.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function getArrayComponents(\n type: string,\n): [length: number | null, innerType: string] | undefined {\n const matches = type.match(/^(.*)\\[(\\d+)?\\]$/)\n return matches\n ? // Return `null` if the array is dynamic.\n [matches[2]! ? Number(matches[2]!) : null, matches[1]!]\n : undefined\n}\n\n/** @internal */\nexport function hasDynamicChild(param: AbiParameters.Parameter) {\n const { type } = param\n if (type === 'string') return true\n if (type === 'bytes') return true\n if (type.endsWith('[]')) return true\n\n if (type === 'tuple') return (param as any).components?.some(hasDynamicChild)\n\n const arrayComponents = getArrayComponents(param.type)\n if (\n arrayComponents &&\n hasDynamicChild({\n ...param,\n type: arrayComponents[1],\n } as AbiParameters.Parameter)\n )\n return true\n\n return false\n}\n","export const arrayRegex = /^(.*)\\[([0-9]*)\\]$/\n\n// `bytes`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/\n\n// `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex =\n /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/\n\nexport const maxInt8 = 2n ** (8n - 1n) - 1n\nexport const maxInt16 = 2n ** (16n - 1n) - 1n\nexport const maxInt24 = 2n ** (24n - 1n) - 1n\nexport const maxInt32 = 2n ** (32n - 1n) - 1n\nexport const maxInt40 = 2n ** (40n - 1n) - 1n\nexport const maxInt48 = 2n ** (48n - 1n) - 1n\nexport const maxInt56 = 2n ** (56n - 1n) - 1n\nexport const maxInt64 = 2n ** (64n - 1n) - 1n\nexport const maxInt72 = 2n ** (72n - 1n) - 1n\nexport const maxInt80 = 2n ** (80n - 1n) - 1n\nexport const maxInt88 = 2n ** (88n - 1n) - 1n\nexport const maxInt96 = 2n ** (96n - 1n) - 1n\nexport const maxInt104 = 2n ** (104n - 1n) - 1n\nexport const maxInt112 = 2n ** (112n - 1n) - 1n\nexport const maxInt120 = 2n ** (120n - 1n) - 1n\nexport const maxInt128 = 2n ** (128n - 1n) - 1n\nexport const maxInt136 = 2n ** (136n - 1n) - 1n\nexport const maxInt144 = 2n ** (144n - 1n) - 1n\nexport const maxInt152 = 2n ** (152n - 1n) - 1n\nexport const maxInt160 = 2n ** (160n - 1n) - 1n\nexport const maxInt168 = 2n ** (168n - 1n) - 1n\nexport const maxInt176 = 2n ** (176n - 1n) - 1n\nexport const maxInt184 = 2n ** (184n - 1n) - 1n\nexport const maxInt192 = 2n ** (192n - 1n) - 1n\nexport const maxInt200 = 2n ** (200n - 1n) - 1n\nexport const maxInt208 = 2n ** (208n - 1n) - 1n\nexport const maxInt216 = 2n ** (216n - 1n) - 1n\nexport const maxInt224 = 2n ** (224n - 1n) - 1n\nexport const maxInt232 = 2n ** (232n - 1n) - 1n\nexport const maxInt240 = 2n ** (240n - 1n) - 1n\nexport const maxInt248 = 2n ** (248n - 1n) - 1n\nexport const maxInt256 = 2n ** (256n - 1n) - 1n\n\nexport const minInt8 = -(2n ** (8n - 1n))\nexport const minInt16 = -(2n ** (16n - 1n))\nexport const minInt24 = -(2n ** (24n - 1n))\nexport const minInt32 = -(2n ** (32n - 1n))\nexport const minInt40 = -(2n ** (40n - 1n))\nexport const minInt48 = -(2n ** (48n - 1n))\nexport const minInt56 = -(2n ** (56n - 1n))\nexport const minInt64 = -(2n ** (64n - 1n))\nexport const minInt72 = -(2n ** (72n - 1n))\nexport const minInt80 = -(2n ** (80n - 1n))\nexport const minInt88 = -(2n ** (88n - 1n))\nexport const minInt96 = -(2n ** (96n - 1n))\nexport const minInt104 = -(2n ** (104n - 1n))\nexport const minInt112 = -(2n ** (112n - 1n))\nexport const minInt120 = -(2n ** (120n - 1n))\nexport const minInt128 = -(2n ** (128n - 1n))\nexport const minInt136 = -(2n ** (136n - 1n))\nexport const minInt144 = -(2n ** (144n - 1n))\nexport const minInt152 = -(2n ** (152n - 1n))\nexport const minInt160 = -(2n ** (160n - 1n))\nexport const minInt168 = -(2n ** (168n - 1n))\nexport const minInt176 = -(2n ** (176n - 1n))\nexport const minInt184 = -(2n ** (184n - 1n))\nexport const minInt192 = -(2n ** (192n - 1n))\nexport const minInt200 = -(2n ** (200n - 1n))\nexport const minInt208 = -(2n ** (208n - 1n))\nexport const minInt216 = -(2n ** (216n - 1n))\nexport const minInt224 = -(2n ** (224n - 1n))\nexport const minInt232 = -(2n ** (232n - 1n))\nexport const minInt240 = -(2n ** (240n - 1n))\nexport const minInt248 = -(2n ** (248n - 1n))\nexport const minInt256 = -(2n ** (256n - 1n))\n\nexport const maxUint8 = 2n ** 8n - 1n\nexport const maxUint16 = 2n ** 16n - 1n\nexport const maxUint24 = 2n ** 24n - 1n\nexport const maxUint32 = 2n ** 32n - 1n\nexport const maxUint40 = 2n ** 40n - 1n\nexport const maxUint48 = 2n ** 48n - 1n\nexport const maxUint56 = 2n ** 56n - 1n\nexport const maxUint64 = 2n ** 64n - 1n\nexport const maxUint72 = 2n ** 72n - 1n\nexport const maxUint80 = 2n ** 80n - 1n\nexport const maxUint88 = 2n ** 88n - 1n\nexport const maxUint96 = 2n ** 96n - 1n\nexport const maxUint104 = 2n ** 104n - 1n\nexport const maxUint112 = 2n ** 112n - 1n\nexport const maxUint120 = 2n ** 120n - 1n\nexport const maxUint128 = 2n ** 128n - 1n\nexport const maxUint136 = 2n ** 136n - 1n\nexport const maxUint144 = 2n ** 144n - 1n\nexport const maxUint152 = 2n ** 152n - 1n\nexport const maxUint160 = 2n ** 160n - 1n\nexport const maxUint168 = 2n ** 168n - 1n\nexport const maxUint176 = 2n ** 176n - 1n\nexport const maxUint184 = 2n ** 184n - 1n\nexport const maxUint192 = 2n ** 192n - 1n\nexport const maxUint200 = 2n ** 200n - 1n\nexport const maxUint208 = 2n ** 208n - 1n\nexport const maxUint216 = 2n ** 216n - 1n\nexport const maxUint224 = 2n ** 224n - 1n\nexport const maxUint232 = 2n ** 232n - 1n\nexport const maxUint240 = 2n ** 240n - 1n\nexport const maxUint248 = 2n ** 248n - 1n\nexport const maxUint256 = 2n ** 256n - 1n\n","import type { Bytes } from '../Bytes.js'\nimport * as Errors from '../Errors.js'\n\n/** @internal */\nexport type Cursor = {\n bytes: Bytes\n dataView: DataView\n position: number\n positionReadCount: Map\n recursiveReadCount: number\n recursiveReadLimit: number\n remaining: number\n assertReadLimit(position?: number): void\n assertPosition(position: number): void\n decrementPosition(offset: number): void\n getReadCount(position?: number): number\n incrementPosition(offset: number): void\n inspectByte(position?: number): Bytes[number]\n inspectBytes(length: number, position?: number): Bytes\n inspectUint8(position?: number): number\n inspectUint16(position?: number): number\n inspectUint24(position?: number): number\n inspectUint32(position?: number): number\n pushByte(byte: Bytes[number]): void\n pushBytes(bytes: Bytes): void\n pushUint8(value: number): void\n pushUint16(value: number): void\n pushUint24(value: number): void\n pushUint32(value: number): void\n readByte(): Bytes[number]\n readBytes(length: number, size?: number): Bytes\n readUint8(): number\n readUint16(): number\n readUint24(): number\n readUint32(): number\n setPosition(position: number): () => void\n _touch(): void\n}\n\nconst staticCursor: Cursor = {\n bytes: new Uint8Array(),\n dataView: new DataView(new ArrayBuffer(0)),\n position: 0,\n positionReadCount: new Map(),\n recursiveReadCount: 0,\n recursiveReadLimit: Number.POSITIVE_INFINITY,\n assertReadLimit() {\n if (this.recursiveReadCount >= this.recursiveReadLimit)\n throw new RecursiveReadLimitExceededError({\n count: this.recursiveReadCount + 1,\n limit: this.recursiveReadLimit,\n })\n },\n assertPosition(position) {\n if (position < 0 || position > this.bytes.length - 1)\n throw new PositionOutOfBoundsError({\n length: this.bytes.length,\n position,\n })\n },\n decrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position - offset\n this.assertPosition(position)\n this.position = position\n },\n getReadCount(position) {\n return this.positionReadCount.get(position || this.position) || 0\n },\n incrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position + offset\n this.assertPosition(position)\n this.position = position\n },\n inspectByte(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]!\n },\n inspectBytes(length, position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + length - 1)\n return this.bytes.subarray(position, position + length)\n },\n inspectUint8(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]!\n },\n inspectUint16(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 1)\n return this.dataView.getUint16(position)\n },\n inspectUint24(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 2)\n return (\n (this.dataView.getUint16(position) << 8) +\n this.dataView.getUint8(position + 2)\n )\n },\n inspectUint32(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 3)\n return this.dataView.getUint32(position)\n },\n pushByte(byte: Bytes[number]) {\n this.assertPosition(this.position)\n this.bytes[this.position] = byte\n this.position++\n },\n pushBytes(bytes: Bytes) {\n this.assertPosition(this.position + bytes.length - 1)\n this.bytes.set(bytes, this.position)\n this.position += bytes.length\n },\n pushUint8(value: number) {\n this.assertPosition(this.position)\n this.bytes[this.position] = value\n this.position++\n },\n pushUint16(value: number) {\n this.assertPosition(this.position + 1)\n this.dataView.setUint16(this.position, value)\n this.position += 2\n },\n pushUint24(value: number) {\n this.assertPosition(this.position + 2)\n this.dataView.setUint16(this.position, value >> 8)\n this.dataView.setUint8(this.position + 2, value & ~4294967040)\n this.position += 3\n },\n pushUint32(value: number) {\n this.assertPosition(this.position + 3)\n this.dataView.setUint32(this.position, value)\n this.position += 4\n },\n readByte() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectByte()\n this.position++\n return value\n },\n readBytes(length, size) {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectBytes(length)\n this.position += size ?? length\n return value\n },\n readUint8() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint8()\n this.position += 1\n return value\n },\n readUint16() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint16()\n this.position += 2\n return value\n },\n readUint24() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint24()\n this.position += 3\n return value\n },\n readUint32() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint32()\n this.position += 4\n return value\n },\n get remaining() {\n return this.bytes.length - this.position\n },\n setPosition(position) {\n const oldPosition = this.position\n this.assertPosition(position)\n this.position = position\n return () => (this.position = oldPosition)\n },\n _touch() {\n if (this.recursiveReadLimit === Number.POSITIVE_INFINITY) return\n const count = this.getReadCount()\n this.positionReadCount.set(this.position, count + 1)\n if (count > 0) this.recursiveReadCount++\n },\n}\n\n/** @internal */\nexport function create(\n bytes: Bytes,\n { recursiveReadLimit = 8_192 }: create.Config = {},\n): Cursor {\n const cursor: Cursor = Object.create(staticCursor)\n cursor.bytes = bytes\n cursor.dataView = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n )\n cursor.positionReadCount = new Map()\n cursor.recursiveReadLimit = recursiveReadLimit\n return cursor\n}\n\n/** @internal */\nexport declare namespace create {\n type Config = { recursiveReadLimit?: number | undefined }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** @internal */\nexport class NegativeOffsetError extends Errors.BaseError {\n override readonly name = 'Cursor.NegativeOffsetError'\n\n constructor({ offset }: { offset: number }) {\n super(`Offset \\`${offset}\\` cannot be negative.`)\n }\n}\n\n/** @internal */\nexport class PositionOutOfBoundsError extends Errors.BaseError {\n override readonly name = 'Cursor.PositionOutOfBoundsError'\n\n constructor({ length, position }: { length: number; position: number }) {\n super(\n `Position \\`${position}\\` is out of bounds (\\`0 < position < ${length}\\`).`,\n )\n }\n}\n\n/** @internal */\nexport class RecursiveReadLimitExceededError extends Errors.BaseError {\n override readonly name = 'Cursor.RecursiveReadLimitExceededError'\n\n constructor({ count, limit }: { count: number; limit: number }) {\n super(\n `Recursive read limit of \\`${limit}\\` exceeded (recursive read count: \\`${count}\\`).`,\n )\n }\n}\n","import type * as Address from './Address.js'\nimport type * as Errors from './Errors.js'\nimport * as Hash from './Hash.js'\nimport * as Hex from './Hex.js'\nimport type { Compute, Mutable, Undefined } from './internal/types.js'\nimport * as Rlp from './Rlp.js'\nimport * as Signature from './Signature.js'\n\n/** Root type for an EIP-7702 Authorization. */\nexport type Authorization<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n> = Compute<\n {\n /** Address of the contract to set as code for the Authority. */\n address: Address.Address\n /** Chain ID to authorize. */\n chainId: numberType\n /** Nonce of the Authority to authorize. */\n nonce: bigintType\n } & (signed extends true\n ? Signature.Signature\n : Undefined)\n>\n\n/** RPC representation of an {@link ox#Authorization.Authorization}. */\nexport type Rpc = Authorization\n\n/** List of {@link ox#Authorization.Authorization}. */\nexport type List<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n> = Compute[]>\n\n/** RPC representation of an {@link ox#Authorization.List}. */\nexport type ListRpc = List\n\n/** Signed representation of a list of {@link ox#Authorization.Authorization}. */\nexport type ListSigned = List<\n true,\n bigintType,\n numberType\n>\n\n/** Signed representation of an {@link ox#Authorization.Authorization}. */\nexport type Signed = Authorization<\n true,\n bigintType,\n numberType\n>\n\n/** Tuple representation of an {@link ox#Authorization.Authorization}. */\nexport type Tuple = signed extends true\n ? readonly [\n chainId: Hex.Hex,\n address: Hex.Hex,\n nonce: Hex.Hex,\n yParity: Hex.Hex,\n r: Hex.Hex,\n s: Hex.Hex,\n ]\n : readonly [chainId: Hex.Hex, address: Hex.Hex, nonce: Hex.Hex]\n\n/** Tuple representation of a signed {@link ox#Authorization.Authorization}. */\nexport type TupleSigned = Tuple\n\n/** Tuple representation of a list of {@link ox#Authorization.Authorization}. */\nexport type TupleList =\n readonly Tuple[]\n\n/** Tuple representation of a list of signed {@link ox#Authorization.Authorization}. */\nexport type TupleListSigned = TupleList\n\n/**\n * Converts an [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization object into a typed {@link ox#Authorization.Authorization}.\n *\n * @example\n * An Authorization can be instantiated from an [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple in object format.\n *\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n * ```\n *\n * @example\n * ### Attaching Signatures\n *\n * A {@link ox#Signature.Signature} can be attached with the `signature` option. The example below demonstrates signing\n * an Authorization with {@link ox#Secp256k1.(sign:function)}.\n *\n * ```ts twoslash\n * import { Authorization, Secp256k1 } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 1,\n * nonce: 40n,\n * })\n *\n * const signature = Secp256k1.sign({\n * payload: Authorization.getSignPayload(authorization),\n * privateKey: '0x...',\n * })\n *\n * const authorization_signed = Authorization.from(authorization, { signature }) // [!code focus]\n * ```\n *\n * @param authorization - An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple in object format.\n * @param options - Authorization options.\n * @returns The {@link ox#Authorization.Authorization}.\n */\nexport function from<\n const authorization extends Authorization | Rpc,\n const signature extends Signature.Signature | undefined = undefined,\n>(\n authorization: authorization | Authorization,\n options: from.Options = {},\n): from.ReturnType {\n if (typeof authorization.chainId === 'string')\n return fromRpc(authorization) as never\n return { ...authorization, ...options.signature } as never\n}\n\nexport declare namespace from {\n type Options<\n signature extends Signature.Signature | undefined =\n | Signature.Signature\n | undefined,\n > = {\n /** The {@link ox#Signature.Signature} to attach to the Authorization. */\n signature?: signature | Signature.Signature | undefined\n }\n\n type ReturnType<\n authorization extends Authorization | Rpc = Authorization,\n signature extends Signature.Signature | undefined =\n | Signature.Signature\n | undefined,\n > = Compute<\n authorization extends Rpc\n ? Signed\n : authorization &\n (signature extends Signature.Signature ? Readonly : {})\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.Rpc} to an {@link ox#Authorization.Authorization}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.fromRpc({\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: '0x1',\n * nonce: '0x1',\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * })\n * ```\n *\n * @param authorization - The RPC-formatted Authorization.\n * @returns A signed {@link ox#Authorization.Authorization}.\n */\nexport function fromRpc(authorization: Rpc): Signed {\n const { address, chainId, nonce } = authorization\n const signature = Signature.extract(authorization)!\n\n return {\n address,\n chainId: Number(chainId),\n nonce: BigInt(nonce),\n ...signature,\n }\n}\n\nexport declare namespace fromRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.ListRpc} to an {@link ox#Authorization.List}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorizationList = Authorization.fromRpcList([{\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: '0x1',\n * nonce: '0x1',\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * }])\n * ```\n *\n * @param authorizationList - The RPC-formatted Authorization list.\n * @returns A signed {@link ox#Authorization.List}.\n */\nexport function fromRpcList(authorizationList: ListRpc): ListSigned {\n return authorizationList.map(fromRpc)\n}\n\nexport declare namespace fromRpcList {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.Tuple} to an {@link ox#Authorization.Authorization}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.fromTuple([\n * '0x1',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x3'\n * ])\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n\n * // @log: }\n * ```\n *\n * @example\n * It is also possible to append a Signature tuple to the end of an Authorization tuple.\n *\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.fromTuple([\n * '0x1',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x3',\n * '0x1',\n * '0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90',\n * '0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064',\n * ])\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: }\n * ```\n *\n * @param tuple - The [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple.\n * @returns The {@link ox#Authorization.Authorization}.\n */\nexport function fromTuple(\n tuple: tuple,\n): fromTuple.ReturnType {\n const [chainId, address, nonce, yParity, r, s] = tuple\n let args = {\n address,\n chainId: chainId === '0x' ? 0 : Number(chainId),\n nonce: nonce === '0x' ? 0n : BigInt(nonce),\n }\n if (yParity && r && s)\n args = { ...args, ...Signature.fromTuple([yParity, r, s]) }\n return from(args) as never\n}\n\nexport declare namespace fromTuple {\n type ReturnType = Compute<\n Authorization ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.TupleList} to an {@link ox#Authorization.List}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorizationList = Authorization.fromTupleList([\n * ['0x1', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x3'],\n * ['0x3', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x14'],\n * ])\n * // @log: [\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n,\n * // @log: },\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: },\n * // @log: ]\n * ```\n *\n * @example\n * It is also possible to append a Signature tuple to the end of an Authorization tuple.\n *\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorizationList = Authorization.fromTupleList([\n * ['0x1', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x3', '0x1', '0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90', '0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'],\n * ['0x3', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x14', '0x1', '0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90', '0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'],\n * ])\n * // @log: [\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n,\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: },\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: },\n * // @log: ]\n * ```\n *\n * @param tupleList - The [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple list.\n * @returns An {@link ox#Authorization.List}.\n */\nexport function fromTupleList(\n tupleList: tupleList,\n): fromTupleList.ReturnType {\n const list: Mutable = []\n for (const tuple of tupleList) list.push(fromTuple(tuple))\n return list as never\n}\n\nexport declare namespace fromTupleList {\n type ReturnType = Compute<\n TupleList ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Computes the sign payload for an {@link ox#Authorization.Authorization} in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n *\n * @example\n * The example below demonstrates computing the sign payload for an {@link ox#Authorization.Authorization}. This payload\n * can then be passed to signing functions like {@link ox#Secp256k1.(sign:function)}.\n *\n * ```ts twoslash\n * import { Authorization, Secp256k1 } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const payload = Authorization.getSignPayload(authorization) // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload,\n * privateKey: '0x...',\n * })\n * ```\n *\n * @param authorization - The {@link ox#Authorization.Authorization}.\n * @returns The sign payload.\n */\nexport function getSignPayload(authorization: Authorization): Hex.Hex {\n return hash(authorization, { presign: true })\n}\n\nexport declare namespace getSignPayload {\n type ErrorType = hash.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Computes the hash for an {@link ox#Authorization.Authorization} in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const hash = Authorization.hash(authorization) // [!code focus]\n * ```\n *\n * @param authorization - The {@link ox#Authorization.Authorization}.\n * @returns The hash.\n */\nexport function hash(\n authorization: Authorization,\n options: hash.Options = {},\n): Hex.Hex {\n const { presign } = options\n return Hash.keccak256(\n Hex.concat(\n '0x05',\n Rlp.fromHex(\n toTuple(\n presign\n ? {\n address: authorization.address,\n chainId: authorization.chainId,\n nonce: authorization.nonce,\n }\n : authorization,\n ),\n ),\n ),\n )\n}\n\nexport declare namespace hash {\n type ErrorType =\n | toTuple.ErrorType\n | Hash.keccak256.ErrorType\n | Hex.concat.ErrorType\n | Rlp.fromHex.ErrorType\n | Errors.GlobalErrorType\n\n type Options = {\n /** Whether to hash this authorization for signing. @default false */\n presign?: boolean | undefined\n }\n}\n\n/**\n * Converts an {@link ox#Authorization.Authorization} to an {@link ox#Authorization.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.toRpc({\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: 1,\n * nonce: 1n,\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * })\n * ```\n *\n * @param authorization - An Authorization.\n * @returns An RPC-formatted Authorization.\n */\nexport function toRpc(authorization: Signed): Rpc {\n const { address, chainId, nonce, ...signature } = authorization\n\n return {\n address,\n chainId: Hex.fromNumber(chainId),\n nonce: Hex.fromNumber(nonce),\n ...Signature.toRpc(signature),\n }\n}\n\nexport declare namespace toRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.List} to an {@link ox#Authorization.ListRpc}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.toRpcList([{\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: 1,\n * nonce: 1n,\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * }])\n * ```\n *\n * @param authorizationList - An Authorization List.\n * @returns An RPC-formatted Authorization List.\n */\nexport function toRpcList(authorizationList: ListSigned): ListRpc {\n return authorizationList.map(toRpc)\n}\n\nexport declare namespace toRpcList {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.Authorization} to an {@link ox#Authorization.Tuple}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const tuple = Authorization.toTuple(authorization) // [!code focus]\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 1,\n * // @log: nonce: 69n,\n * // @log: ]\n * ```\n *\n * @param authorization - The {@link ox#Authorization.Authorization}.\n * @returns An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple.\n */\nexport function toTuple(\n authorization: authorization,\n): toTuple.ReturnType {\n const { address, chainId, nonce } = authorization\n const signature = Signature.extract(authorization)\n return [\n chainId ? Hex.fromNumber(chainId) : '0x',\n address,\n nonce ? Hex.fromNumber(nonce) : '0x',\n ...(signature ? Signature.toTuple(signature) : []),\n ] as never\n}\n\nexport declare namespace toTuple {\n type ReturnType =\n Compute>\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.List} to an {@link ox#Authorization.TupleList}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization_1 = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n * const authorization_2 = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 3,\n * nonce: 20n,\n * })\n *\n * const tuple = Authorization.toTupleList([authorization_1, authorization_2]) // [!code focus]\n * // @log: [\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 1,\n * // @log: nonce: 69n,\n * // @log: ],\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: ],\n * // @log: ]\n * ```\n *\n * @param list - An {@link ox#Authorization.List}.\n * @returns An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple list.\n */\nexport function toTupleList<\n const list extends\n | readonly Authorization[]\n | readonly Authorization[],\n>(list?: list | undefined): toTupleList.ReturnType {\n if (!list || list.length === 0) return []\n\n const tupleList: Mutable = []\n for (const authorization of list) tupleList.push(toTuple(authorization))\n\n return tupleList as never\n}\n\nexport declare namespace toTupleList {\n type ReturnType<\n list extends\n | readonly Authorization[]\n | readonly Authorization[],\n > = Compute<\n TupleList[] ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as Cursor from './internal/cursor.js'\nimport type { ExactPartial, RecursiveArray } from './internal/types.js'\n\n/**\n * Decodes a Recursive-Length Prefix (RLP) value into a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Rlp } from 'ox'\n * Rlp.toBytes('0x8b68656c6c6f20776f726c64')\n * // Uint8Array([139, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100])\n * ```\n *\n * @param value - The value to decode.\n * @returns The decoded {@link ox#Bytes.Bytes} value.\n */\nexport function toBytes(\n value: Bytes.Bytes | Hex.Hex,\n): RecursiveArray {\n return to(value, 'Bytes')\n}\n\nexport declare namespace toBytes {\n type ErrorType = to.ErrorType\n}\n\n/**\n * Decodes a Recursive-Length Prefix (RLP) value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Rlp } from 'ox'\n * Rlp.toHex('0x8b68656c6c6f20776f726c64')\n * // 0x68656c6c6f20776f726c64\n * ```\n *\n * @param value - The value to decode.\n * @returns The decoded {@link ox#Hex.Hex} value.\n */\nexport function toHex(value: Bytes.Bytes | Hex.Hex): RecursiveArray {\n return to(value, 'Hex')\n}\n\nexport declare namespace toHex {\n type ErrorType = to.ErrorType\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n// Internal\n/////////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport function to<\n value extends Bytes.Bytes | Hex.Hex,\n to extends 'Hex' | 'Bytes',\n>(value: value, to: to | 'Hex' | 'Bytes'): to.ReturnType {\n const to_ = to ?? (typeof value === 'string' ? 'Hex' : 'Bytes')\n\n const bytes = (() => {\n if (typeof value === 'string') {\n if (value.length > 3 && value.length % 2 !== 0)\n throw new Hex.InvalidLengthError(value)\n return Bytes.fromHex(value)\n }\n return value as Bytes.Bytes\n })()\n\n const cursor = Cursor.create(bytes, {\n recursiveReadLimit: Number.POSITIVE_INFINITY,\n })\n const result = decodeRlpCursor(cursor, to_)\n\n return result as to.ReturnType\n}\n\n/** @internal */\nexport declare namespace to {\n type ReturnType =\n | (to extends 'Bytes' ? RecursiveArray : never)\n | (to extends 'Hex' ? RecursiveArray : never)\n\n type ErrorType =\n | Bytes.fromHex.ErrorType\n | decodeRlpCursor.ErrorType\n | Cursor.create.ErrorType\n | Hex.InvalidLengthError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\n\n/** @internal */\nexport function decodeRlpCursor(\n cursor: Cursor.Cursor,\n to: to | 'Hex' | 'Bytes' | undefined = 'Hex',\n): decodeRlpCursor.ReturnType {\n if (cursor.bytes.length === 0)\n return (\n to === 'Hex' ? Hex.fromBytes(cursor.bytes) : cursor.bytes\n ) as decodeRlpCursor.ReturnType\n\n const prefix = cursor.readByte()\n if (prefix < 0x80) cursor.decrementPosition(1)\n\n // bytes\n if (prefix < 0xc0) {\n const length = readLength(cursor, prefix, 0x80)\n const bytes = cursor.readBytes(length)\n return (\n to === 'Hex' ? Hex.fromBytes(bytes) : bytes\n ) as decodeRlpCursor.ReturnType\n }\n\n // list\n const length = readLength(cursor, prefix, 0xc0)\n return readList(cursor, length, to) as {} as decodeRlpCursor.ReturnType\n}\n\n/** @internal */\nexport declare namespace decodeRlpCursor {\n type ReturnType = to.ReturnType\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | readLength.ErrorType\n | readList.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function readLength(\n cursor: Cursor.Cursor,\n prefix: number,\n offset: number,\n) {\n if (offset === 0x80 && prefix < 0x80) return 1\n if (prefix <= offset + 55) return prefix - offset\n if (prefix === offset + 55 + 1) return cursor.readUint8()\n if (prefix === offset + 55 + 2) return cursor.readUint16()\n if (prefix === offset + 55 + 3) return cursor.readUint24()\n if (prefix === offset + 55 + 4) return cursor.readUint32()\n throw new Errors.BaseError('Invalid RLP prefix')\n}\n\n/** @internal */\nexport declare namespace readLength {\n type ErrorType = Errors.BaseError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function readList(\n cursor: Cursor.Cursor,\n length: number,\n to: to | 'Hex' | 'Bytes',\n) {\n const position = cursor.position\n const value: decodeRlpCursor.ReturnType[] = []\n while (cursor.position - position < length)\n value.push(decodeRlpCursor(cursor, to))\n return value\n}\n\n/** @internal */\nexport declare namespace readList {\n type ErrorType = Errors.GlobalErrorType\n}\n\ntype Encodable = {\n length: number\n encode(cursor: Cursor.Cursor): void\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value into a Recursive-Length Prefix (RLP) value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Rlp } from 'ox'\n *\n * Rlp.from('0x68656c6c6f20776f726c64', { as: 'Hex' })\n * // @log: 0x8b68656c6c6f20776f726c64\n *\n * Rlp.from(Bytes.from([139, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]), { as: 'Bytes' })\n * // @log: Uint8Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100])\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value to encode.\n * @param options - Options.\n * @returns The RLP value.\n */\nexport function from(\n value: RecursiveArray | RecursiveArray,\n options: from.Options,\n): from.ReturnType {\n const { as } = options\n\n const encodable = getEncodable(value)\n const cursor = Cursor.create(new Uint8Array(encodable.length))\n encodable.encode(cursor)\n\n if (as === 'Hex') return Hex.fromBytes(cursor.bytes) as from.ReturnType\n return cursor.bytes as from.ReturnType\n}\n\nexport declare namespace from {\n type Options = {\n /** The type to convert the RLP value to. */\n as: as | 'Hex' | 'Bytes'\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Cursor.create.ErrorType\n | Hex.fromBytes.ErrorType\n | Bytes.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a Recursive-Length Prefix (RLP) value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Rlp } from 'ox'\n *\n * Rlp.fromBytes(Bytes.from([139, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]))\n * // @log: Uint8Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100])\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} value to encode.\n * @param options - Options.\n * @returns The RLP value.\n */\nexport function fromBytes(\n bytes: RecursiveArray,\n options: fromBytes.Options = {},\n): fromBytes.ReturnType {\n const { as = 'Bytes' } = options\n return from(bytes, { as }) as never\n}\n\nexport declare namespace fromBytes {\n type Options = ExactPartial<\n from.Options\n >\n\n type ReturnType = from.ReturnType\n\n type ErrorType = from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Hex.Hex} value into a Recursive-Length Prefix (RLP) value.\n *\n * @example\n * ```ts twoslash\n * import { Rlp } from 'ox'\n *\n * Rlp.fromHex('0x68656c6c6f20776f726c64')\n * // @log: 0x8b68656c6c6f20776f726c64\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to encode.\n * @param options - Options.\n * @returns The RLP value.\n */\nexport function fromHex(\n hex: RecursiveArray,\n options: fromHex.Options = {},\n): fromHex.ReturnType {\n const { as = 'Hex' } = options\n return from(hex, { as }) as never\n}\n\nexport declare namespace fromHex {\n type Options = ExactPartial<\n from.Options\n >\n\n type ReturnType = from.ReturnType\n\n type ErrorType = from.ErrorType | Errors.GlobalErrorType\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n// Internal\n/////////////////////////////////////////////////////////////////////////////////\n\nfunction getEncodable(\n bytes: RecursiveArray | RecursiveArray,\n): Encodable {\n if (Array.isArray(bytes))\n return getEncodableList(bytes.map((x) => getEncodable(x)))\n return getEncodableBytes(bytes as any)\n}\n\nfunction getEncodableList(list: Encodable[]): Encodable {\n const bodyLength = list.reduce((acc, x) => acc + x.length, 0)\n\n const sizeOfBodyLength = getSizeOfLength(bodyLength)\n const length = (() => {\n if (bodyLength <= 55) return 1 + bodyLength\n return 1 + sizeOfBodyLength + bodyLength\n })()\n\n return {\n length,\n encode(cursor: Cursor.Cursor) {\n if (bodyLength <= 55) {\n cursor.pushByte(0xc0 + bodyLength)\n } else {\n cursor.pushByte(0xc0 + 55 + sizeOfBodyLength)\n if (sizeOfBodyLength === 1) cursor.pushUint8(bodyLength)\n else if (sizeOfBodyLength === 2) cursor.pushUint16(bodyLength)\n else if (sizeOfBodyLength === 3) cursor.pushUint24(bodyLength)\n else cursor.pushUint32(bodyLength)\n }\n for (const { encode } of list) {\n encode(cursor)\n }\n },\n }\n}\n\nfunction getEncodableBytes(bytesOrHex: Bytes.Bytes | Hex.Hex): Encodable {\n const bytes =\n typeof bytesOrHex === 'string' ? Bytes.fromHex(bytesOrHex) : bytesOrHex\n\n const sizeOfBytesLength = getSizeOfLength(bytes.length)\n const length = (() => {\n if (bytes.length === 1 && bytes[0]! < 0x80) return 1\n if (bytes.length <= 55) return 1 + bytes.length\n return 1 + sizeOfBytesLength + bytes.length\n })()\n\n return {\n length,\n encode(cursor: Cursor.Cursor) {\n if (bytes.length === 1 && bytes[0]! < 0x80) {\n cursor.pushBytes(bytes)\n } else if (bytes.length <= 55) {\n cursor.pushByte(0x80 + bytes.length)\n cursor.pushBytes(bytes)\n } else {\n cursor.pushByte(0x80 + 55 + sizeOfBytesLength)\n if (sizeOfBytesLength === 1) cursor.pushUint8(bytes.length)\n else if (sizeOfBytesLength === 2) cursor.pushUint16(bytes.length)\n else if (sizeOfBytesLength === 3) cursor.pushUint24(bytes.length)\n else cursor.pushUint32(bytes.length)\n cursor.pushBytes(bytes)\n }\n },\n }\n}\n\nfunction getSizeOfLength(length: number) {\n if (length <= 0xff) return 1\n if (length <= 0xff_ff) return 2\n if (length <= 0xff_ff_ff) return 3\n if (length <= 0xff_ff_ff_ff) return 4\n throw new Errors.BaseError('Length is too large.')\n}\n","/**\n * NIST secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Seems to be rigid (not backdoored)\n * [as per discussion](https://bitcointalk.org/index.php?topic=289795.msg3183975#msg3183975).\n *\n * secp256k1 belongs to Koblitz curves: it has efficiently computable endomorphism.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n * [See explanation](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2';\nimport { randomBytes } from '@noble/hashes/utils';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport { createHasher, type Hasher, type HTFMethod, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mod, pow2 } from './abstract/modular.ts';\nimport type { Hex, PrivKey } from './abstract/utils.ts';\nimport {\n aInRange,\n bytesToNumberBE,\n concatBytes,\n ensureBytes,\n inRange,\n numberToBytesBE,\n} from './abstract/utils.ts';\nimport { mapToCurveSimpleSWU, type ProjPointType as PointType } from './abstract/weierstrass.ts';\n\nconst secp256k1P = BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f');\nconst secp256k1N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst divNearest = (a: bigint, b: bigint) => (a + b / _2n) / b;\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1P;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1P, undefined, undefined, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const priv = secp256k1.utils.randomPrivateKey();\n * const pub = secp256k1.getPublicKey(priv);\n * const msg = new Uint8Array(32).fill(1); // message hash (not message) in ecdsa\n * const sig = secp256k1.sign(msg, priv); // `{prehash: true}` option is available\n * const isValid = secp256k1.verify(sig, msg, pub) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n {\n a: _0n,\n b: BigInt(7),\n Fp: Fpk1,\n n: secp256k1N,\n Gx: BigInt('55066263022277343669578718895168534326250603453777594175500187360389116729240'),\n Gy: BigInt('32670510020758816978083085130507043184471273380659243275938904335757337482424'),\n h: BigInt(1),\n lowS: true, // Allow only low-S signatures by default in sign() and verify()\n endo: {\n // Endomorphism, see above\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n splitScalar: (k: bigint) => {\n const n = secp256k1N;\n const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15');\n const b1 = -_1n * BigInt('0xe4437ed6010e88286f547fa90abfe4c3');\n const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8');\n const b2 = a1;\n const POW_2_128 = BigInt('0x100000000000000000000000000000000'); // (2n**128n).toString(16)\n\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n let k1 = mod(k - c1 * a1 - c2 * a2, n);\n let k2 = mod(-c1 * b1 - c2 * b2, n);\n const k1neg = k1 > POW_2_128;\n const k2neg = k2 > POW_2_128;\n if (k1neg) k1 = n - k1;\n if (k2neg) k2 = n - k2;\n if (k1 > POW_2_128 || k2 > POW_2_128) {\n throw new Error('splitScalar: Endomorphism failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n },\n },\n },\n sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(Uint8Array.from(tag, (c) => c.charCodeAt(0)));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType) => point.toRawBytes(true).slice(1);\nconst numTo32b = (n: bigint) => numberToBytesBE(n, 32);\nconst modP = (x: bigint) => mod(x, secp256k1P);\nconst modN = (x: bigint) => mod(x, secp256k1N);\nconst Point = /* @__PURE__ */ (() => secp256k1.ProjectivePoint)();\nconst GmulAdd = (Q: PointType, a: bigint, b: bigint) =>\n Point.BASE.multiplyAndAddUnsafe(Q, a, b);\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n let d_ = secp256k1.utils.normPrivateKeyToScalar(priv); // same method executed in fromPrivateKey\n let p = Point.fromPrivateKey(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = p.hasEvenY() ? d_ : modN(-d_);\n return { scalar: scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType {\n aInRange('x', x, _1n, secp256k1P); // Fail if x ≥ p.\n const xx = modP(x * x);\n const c = modP(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = sqrtMod(c); // Let y = c^(p+1)/4 mod p.\n if (y % _2n !== _0n) y = modP(-y); // Return the unique point P such that x(P) = x and\n const p = new Point(x, y, _1n); // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return modN(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(privateKey: Hex): Uint8Array {\n return schnorrGetExtPubKey(privateKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Hex,\n privateKey: PrivKey,\n auxRand: Hex = randomBytes(32)\n): Uint8Array {\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(privateKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = numTo32b(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n const k_ = modN(num(rand)); // Let k' = int(rand) mod n\n if (k_ === _0n) throw new Error('sign failed: k is zero'); // Fail if k' = 0.\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(k_); // Let R = k'⋅G.\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(numTo32b(modN(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!inRange(r, _1n, secp256k1P)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!inRange(s, _1n, secp256k1N)) return false;\n const e = challenge(numTo32b(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n const R = GmulAdd(P, s, modN(-e)); // R = s⋅G - e⋅P\n if (!R || !R.hasEvenY() || R.toAffine().x !== r) return false; // -eP == (n-e)P\n return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n utils: {\n randomPrivateKey: () => Uint8Array;\n lift_x: typeof lift_x;\n pointToBytes: (point: PointType) => Uint8Array;\n numberToBytesBE: typeof numberToBytesBE;\n bytesToNumberBE: typeof bytesToNumberBE;\n taggedHash: typeof taggedHash;\n mod: typeof mod;\n };\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const priv = schnorr.utils.randomPrivateKey();\n * const pub = schnorr.getPublicKey(priv);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, priv);\n * const isValid = schnorr.verify(sig, msg, pub);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => ({\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n utils: {\n randomPrivateKey: secp256k1.utils.randomPrivateKey,\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n taggedHash,\n mod,\n },\n}))();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: Hasher = /* @__PURE__ */ (() =>\n createHasher(\n secp256k1.ProjectivePoint,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n } as const\n ))();\n\nexport const hashToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.hashToCurve)();\n\nexport const encodeToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.encodeToCurve)();\n","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac } from '@noble/hashes/hmac';\nimport { concatBytes, randomBytes } from '@noble/hashes/utils';\nimport type { CHash } from './abstract/utils.ts';\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): {\n hash: CHash;\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => Uint8Array;\n randomBytes: typeof randomBytes;\n} {\n return {\n hash,\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => hmac(hash, key, concatBytes(...msgs)),\n randomBytes,\n };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, ...getHash(hash) });\n return { ...create(defHash), create };\n}\n","/**\n * Utils for modular division and finite fields.\n * A finite field over 11 is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { anumber } from '@noble/hashes/utils';\nimport {\n bitMask,\n bytesToNumberBE,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from './utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _8n = /* @__PURE__ */ BigInt(8);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * TODO: remove.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp: IField, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n // Throw if root^2 != n\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\nfunction sqrt5mod8(Fp: IField, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\n// TODO: Commented-out for now. Provide test vectors.\n// Tonelli is too slow for extension fields Fp2.\n// That means we can't use sqrt (c1, c2...) even for initialization constants.\n// if (P % _16n === _9n) return sqrt9mod16;\n// // prettier-ignore\n// function sqrt9mod16(Fp: IField, n: T, p7div16?: bigint) {\n// if (p7div16 === undefined) p7div16 = (Fp.ORDER + BigInt(7)) / _16n;\n// const c1 = Fp.sqrt(Fp.neg(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n// const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n// const c3 = Fp.sqrt(Fp.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n// const c4 = p7div16; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n// let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n// let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1\n// const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1\n// let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1\n// const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n// const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n// tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n// tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n// const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n// return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2\n// }\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): (Fp: IField, n: T) => T {\n // Initialization (precomputation).\n if (P < BigInt(3)) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp: IField, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): (Fp: IField, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) not implemented, see above\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField {\n ORDER: bigint;\n isLE: boolean;\n BYTES: number;\n BITS: number;\n MASK: bigint;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField(field: IField): IField {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'isSafeInteger',\n BITS: 'isSafeInteger',\n } as Record;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n return validateObject(field, opts);\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp: IField, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp: IField, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv(Fp: IField, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp: IField, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp: IField, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\n// CURVE.n lengths\nexport function nLength(\n n: bigint,\n nBitLength?: number\n): {\n nBitLength: number;\n nByteLength: number;\n} {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField & Required, 'isOdd'>>;\n/**\n * Initializes a finite field over prime.\n * Major performance optimizations:\n * * a) denormalized operations like mulN instead of mul\n * * b) same object shape: never add or remove keys\n * * c) Object.freeze\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n * @param ORDER prime positive bigint\n * @param bitLen how many bits the field consumes\n * @param isLE (def: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n ORDER: bigint,\n bitLen?: number,\n isLE = false,\n redef: Partial> = {}\n): Readonly {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen);\n if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP: ReturnType; // cached sqrtP\n const f: Readonly = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n\n inv: (num) => invert(num, ORDER),\n sqrt:\n redef.sqrt ||\n ((n) => {\n if (!sqrtP) sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes) => {\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n } as FpField);\n return Object.freeze(f);\n}\n\nexport function FpSqrtOdd(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n hash: string | Uint8Array,\n groupOrder: bigint,\n isLE = false\n): bigint {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(\n 'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n );\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type IField, nLength, validateField } from './modular.ts';\nimport { bitLen, bitMask, validateObject } from './utils.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint = {\n x: T;\n y: T;\n} & { z?: never; t?: never };\n\nexport interface Group> {\n double(): T;\n negate(): T;\n add(other: T): T;\n subtract(other: T): T;\n equals(other: T): boolean;\n multiply(scalar: bigint): T;\n}\n\nexport type GroupConstructor = {\n BASE: T;\n ZERO: T;\n};\nexport type Mapper = (i: T[]) => T[];\n\nfunction constTimeNegate>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\n\nfunction getW(P: any): number {\n return pointWindowSizes.get(P) || 1;\n}\n\nexport type IWNAF> = {\n constTimeNegate: >(condition: boolean, item: T) => T;\n hasPrecomputes(elm: T): boolean;\n unsafeLadder(elm: T, n: bigint, p?: T): T;\n precomputeWindow(elm: T, W: number): Group[];\n getPrecomputes(W: number, P: T, transform: Mapper): T[];\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T };\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc?: T): T;\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T };\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T;\n setWindowSize(P: T, W: number): void;\n};\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport function wNAF>(c: GroupConstructor, bits: number): IWNAF {\n return {\n constTimeNegate,\n\n hasPrecomputes(elm: T) {\n return getW(elm) !== 1;\n },\n\n // non-const time multiplication ladder\n unsafeLadder(elm: T, n: bigint, p = c.ZERO) {\n let d: T = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n },\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param elm Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(elm: T, W: number): Group[] {\n const { windows, windowSize } = calcWOpts(W, bits);\n const points: T[] = [];\n let p: T = elm;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n },\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @returns real and fake (for const-time) points\n */\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T } {\n // Smaller version:\n // https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n // TODO: check the scalar is less than group order?\n // wNAF behavior is undefined otherwise. But have to carefully remove\n // other checks before wNAF. ORDER == bits here.\n // Accumulators\n let p = c.ZERO;\n let f = c.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(constTimeNegate(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(constTimeNegate(isNeg, precomputes[offset]));\n }\n }\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n },\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc: T = c.ZERO): T {\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n return acc;\n },\n\n getPrecomputes(W: number, P: T, transform: Mapper): T[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(P);\n if (!comp) {\n comp = this.precomputeWindow(P, W) as T[];\n if (W !== 1) pointPrecomputes.set(P, transform(comp));\n }\n return comp;\n },\n\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T } {\n const W = getW(P);\n return this.wNAF(W, this.getPrecomputes(W, P, transform), n);\n },\n\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T {\n const W = getW(P);\n if (W === 1) return this.unsafeLadder(P, n, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, P, transform), n, prev);\n },\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n\n setWindowSize(P: T, W: number) {\n validateW(W, bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n },\n };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka private keys / bigints)\n */\nexport function pippenger>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n scalars: bigint[]\n): T {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as T;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n windowSize: number\n): (scalars: bigint[]) => T {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: T) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): T => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve = {\n Fp: IField; // Field over which we'll do calculations (Fp)\n n: bigint; // Curve order, total count of valid points in the field\n nBitLength?: number; // bit length of curve order\n nByteLength?: number; // byte length of curve order\n h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n hEff?: bigint; // Number to multiply to clear cofactor\n Gx: T; // base point X coordinate\n Gy: T; // base point Y coordinate\n allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\nexport function validateBasic(\n curve: BasicCurve & T\n): Readonly<\n {\n readonly nBitLength: number;\n readonly nByteLength: number;\n } & BasicCurve &\n T & {\n p: bigint;\n }\n> {\n validateField(curve.Fp);\n validateObject(\n curve,\n {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n },\n {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n }\n );\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n } as const);\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Parameters\n *\n * To initialize a weierstrass curve, one needs to pass following params:\n *\n * * a: formula param\n * * b: formula param\n * * Fp: finite field of prime characteristic P; may be complex (Fp2). Arithmetics is done in field\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * Gx: Base point (x, y) aka generator point. Gx = x coordinate\n * * Gy: ...y coordinate\n * * h: cofactor, usually 1. h*n = curve group order (n is only subgroup order)\n * * lowS: whether to enable (default) or disable \"low-s\" non-malleable signatures\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// prettier-ignore\nimport {\n pippenger, validateBasic, wNAF,\n type AffinePoint, type BasicCurve, type Group, type GroupConstructor\n} from './curve.ts';\n// prettier-ignore\nimport {\n Field,\n FpInvertBatch,\n getMinHashLength, invert, mapHashToField, mod, validateField,\n type IField\n} from './modular.ts';\n// prettier-ignore\nimport {\n aInRange, abool,\n bitMask,\n bytesToHex, bytesToNumberBE, concatBytes, createHmacDrbg, ensureBytes, hexToBytes,\n inRange, isBytes, memoized, numberToBytesBE, numberToHexUnpadded, validateObject,\n type CHash, type Hex, type PrivKey\n} from './utils.ts';\n\nexport type { AffinePoint };\ntype HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n splitScalar: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\nexport type BasicWCurve = BasicCurve & {\n // Params: a, b\n a: T;\n b: T;\n\n // Optional params\n allowedPrivateKeyLengths?: readonly number[]; // for P521\n wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n endo?: EndomorphismOpts;\n // When a cofactor != 1, there can be an effective methods to:\n // 1. Determine whether a point is torsion-free\n isTorsionFree?: (c: ProjConstructor, point: ProjPointType) => boolean;\n // 2. Clear torsion component\n clearCofactor?: (c: ProjConstructor, point: ProjPointType) => ProjPointType;\n};\n\nexport type Entropy = Hex | boolean;\nexport type SignOpts = { lowS?: boolean; extraEntropy?: Entropy; prehash?: boolean };\nexport type VerOpts = { lowS?: boolean; prehash?: boolean; format?: 'compact' | 'der' | undefined };\n\nfunction validateSigVerOpts(opts: SignOpts | VerOpts) {\n if (opts.lowS !== undefined) abool('lowS', opts.lowS);\n if (opts.prehash !== undefined) abool('prehash', opts.prehash);\n}\n\n// Instance for 3d XYZ points\nexport interface ProjPointType extends Group> {\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n get x(): T;\n get y(): T;\n toAffine(iz?: T): AffinePoint;\n toHex(isCompressed?: boolean): string;\n toRawBytes(isCompressed?: boolean): Uint8Array;\n\n assertValidity(): void;\n hasEvenY(): boolean;\n multiplyUnsafe(scalar: bigint): ProjPointType;\n multiplyAndAddUnsafe(Q: ProjPointType, a: bigint, b: bigint): ProjPointType | undefined;\n isTorsionFree(): boolean;\n clearCofactor(): ProjPointType;\n _setWindowSize(windowSize: number): void;\n}\n// Static methods for 3d XYZ points\nexport interface ProjConstructor extends GroupConstructor> {\n new (x: T, y: T, z: T): ProjPointType;\n fromAffine(p: AffinePoint): ProjPointType;\n fromHex(hex: Hex): ProjPointType;\n fromPrivateKey(privateKey: PrivKey): ProjPointType;\n normalizeZ(points: ProjPointType[]): ProjPointType[];\n msm(points: ProjPointType[], scalars: bigint[]): ProjPointType;\n}\n\nexport type CurvePointsType = BasicWCurve & {\n // Bytes\n fromBytes?: (bytes: Uint8Array) => AffinePoint;\n toBytes?: (c: ProjConstructor, point: ProjPointType, isCompressed: boolean) => Uint8Array;\n};\n\nexport type CurvePointsTypeWithLength = Readonly<\n CurvePointsType & { nByteLength: number; nBitLength: number }\n>;\n\nfunction validatePointOpts(curve: CurvePointsType): CurvePointsTypeWithLength {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n a: 'field',\n b: 'field',\n },\n {\n allowInfinityPoint: 'boolean',\n allowedPrivateKeyLengths: 'array',\n clearCofactor: 'function',\n fromBytes: 'function',\n isTorsionFree: 'function',\n toBytes: 'function',\n wrapPrivateKey: 'boolean',\n }\n );\n const { endo, Fp, a } = opts;\n if (endo) {\n if (!Fp.eql(a, Fp.ZERO)) {\n throw new Error('invalid endo: CURVE.a must be 0');\n }\n if (\n typeof endo !== 'object' ||\n typeof endo.beta !== 'bigint' ||\n typeof endo.splitScalar !== 'function'\n ) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"splitScalar\": function');\n }\n }\n return Object.freeze({ ...opts } as const);\n}\n\nexport type CurvePointsRes = {\n CURVE: ReturnType>;\n ProjectivePoint: ProjConstructor;\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n weierstrassEquation: (x: T) => T;\n isWithinCurveOrder: (num: bigint) => boolean;\n};\n\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\nfunction numToSizedHex(num: bigint, size: number): string {\n return bytesToHex(numberToBytesBE(num, size));\n}\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function weierstrassPoints(opts: CurvePointsType): CurvePointsRes {\n const CURVE = validatePointOpts(opts);\n const { Fp } = CURVE; // All curves has same field / group length as for now, but they can differ\n const Fn = Field(CURVE.n, CURVE.nBitLength);\n\n const toBytes =\n CURVE.toBytes ||\n ((_c: ProjConstructor, point: ProjPointType, _isCompressed: boolean) => {\n const a = point.toAffine();\n return concatBytes(Uint8Array.from([0x04]), Fp.toBytes(a.x), Fp.toBytes(a.y));\n });\n const fromBytes =\n CURVE.fromBytes ||\n ((bytes: Uint8Array) => {\n // const head = bytes[0];\n const tail = bytes.subarray(1);\n // if (head !== 0x04) throw new Error('Only non-compressed encoding is supported');\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n });\n\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x: T): T {\n const { a, b } = CURVE;\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n // Valid group elements reside in range 1..n-1\n function isWithinCurveOrder(num: bigint): boolean {\n return inRange(num, _1n, CURVE.n);\n }\n // Validates if priv key is valid and converts it to bigint.\n // Supports options allowedPrivateKeyLengths and wrapPrivateKey.\n function normPrivateKeyToScalar(key: PrivKey): bigint {\n const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n: N } = CURVE;\n if (lengths && typeof key !== 'bigint') {\n if (isBytes(key)) key = bytesToHex(key);\n // Normalize to hex string, pad. E.g. P521 would norm 130-132 char hex to 132-char bytes\n if (typeof key !== 'string' || !lengths.includes(key.length))\n throw new Error('invalid private key');\n key = key.padStart(nByteLength * 2, '0');\n }\n let num: bigint;\n try {\n num =\n typeof key === 'bigint'\n ? key\n : bytesToNumberBE(ensureBytes('private key', key, nByteLength));\n } catch (error) {\n throw new Error(\n 'invalid private key, expected hex or ' + nByteLength + ' bytes, got ' + typeof key\n );\n }\n if (wrapPrivateKey) num = mod(num, N); // disabled by default, enabled for BLS\n aInRange('private key', num, _1n, N); // num in range [1..N-1]\n return num;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint => {\n const { px: x, py: y, pz: z } = p;\n // Fast-path for normalized points\n if (Fp.eql(z, Fp.ONE)) return { x, y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(z);\n const ax = Fp.mul(x, iz);\n const ay = Fp.mul(y, iz);\n const zz = Fp.mul(z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x: ax, y: ay };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (CURVE.allowInfinityPoint && !Fp.is0(p.py)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n // Check if x, y are valid field elements\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not FE');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates: (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n * Default Point works in 2d / affine coordinates: (x, y)\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements ProjPointType {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n\n constructor(px: T, py: T, pz: T) {\n if (px == null || !Fp.isValid(px)) throw new Error('x required');\n if (py == null || !Fp.isValid(py) || Fp.is0(py)) throw new Error('y required');\n if (pz == null || !Fp.isValid(pz)) throw new Error('z required');\n this.px = px;\n this.py = py;\n this.pz = pz;\n Object.freeze(this);\n }\n\n // Does not validate if the point is on-curve.\n // Use fromHex instead, or call assertValidity() later.\n static fromAffine(p: AffinePoint): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n const is0 = (i: T) => Fp.eql(i, Fp.ZERO);\n // fromAffine(x:0, y:0) would produce (x:0, y:0, z:1), but we need (x:0, y:1, z:0)\n if (is0(x) && is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\n static normalizeZ(points: Point[]): Point[] {\n const toInv = FpInvertBatch(\n Fp,\n points.map((p) => p.pz)\n );\n return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);\n }\n\n /**\n * Converts hash string or Uint8Array to Point.\n * @param hex short/long ECDSA hex\n */\n static fromHex(hex: Hex): Point {\n const P = Point.fromAffine(fromBytes(ensureBytes('pointHex', hex)));\n P.assertValidity();\n return P;\n }\n\n // Multiplies generator point by privateKey.\n static fromPrivateKey(privateKey: PrivKey) {\n return Point.BASE.multiply(normPrivateKeyToScalar(privateKey));\n }\n\n // Multiscalar Multiplication\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n\n // \"Private method\", don't use it directly\n _setWindowSize(windowSize: number) {\n wnaf.setWindowSize(this, windowSize);\n }\n\n // A point on curve is valid if it conforms to equation.\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (Fp.isOdd) return !Fp.isOdd(y);\n throw new Error(\"Field doesn't support isOdd\");\n }\n\n /**\n * Compare one point to another.\n */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /**\n * Flips point to one corresponding to (x, -y) in Affine coordinates.\n */\n negate(): Point {\n return new Point(this.px, Fp.neg(this.py), this.pz);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { px: X1, py: Y1, pz: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0() {\n return this.equals(Point.ZERO);\n }\n\n private wNAF(n: bigint): { p: Point; f: Point } {\n return wnaf.wNAFCached(this, n, Point.normalizeZ);\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed private key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', sc, _0n, N);\n const I = Point.ZERO;\n if (sc === _0n) return I;\n if (this.is0() || sc === _1n) return this;\n\n // Case a: no endomorphism. Case b: has precomputes.\n if (!endo || wnaf.hasPrecomputes(this))\n return wnaf.wNAFCachedUnsafe(this, sc, Point.normalizeZ);\n\n // Case c: endomorphism\n /** See docs for {@link EndomorphismOpts} */\n let { k1neg, k1, k2neg, k2 } = endo.splitScalar(sc);\n let k1p = I;\n let k2p = I;\n let d: Point = this;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) k1p = k1p.add(d);\n if (k2 & _1n) k2p = k2p.add(d);\n d = d.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n if (k1neg) k1p = k1p.negate();\n if (k2neg) k2p = k2p.negate();\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n return k1p.add(k2p);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', scalar, _1n, N);\n let point: Point, fake: Point; // Fake point is used to const-time mult\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = endo.splitScalar(scalar);\n let { p: k1p, f: f1p } = this.wNAF(k1);\n let { p: k2p, f: f2p } = this.wNAF(k2);\n k1p = wnaf.constTimeNegate(k1neg, k1p);\n k2p = wnaf.constTimeNegate(k2neg, k2p);\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n point = k1p.add(k2p);\n fake = f1p.add(f2p);\n } else {\n const { p, f } = this.wNAF(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return Point.normalizeZ([point, fake])[0];\n }\n\n /**\n * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly.\n * Not using Strauss-Shamir trick: precomputation tables are faster.\n * The trick could be useful if both P and Q are not G (not in our case).\n * @returns non-zero affine point\n */\n multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n const G = Point.BASE; // No Strauss-Shamir trick: we have 10% faster G precomputes\n const mul = (\n P: Point,\n a: bigint // Select faster multiply() method\n ) => (a === _0n || a === _1n || !P.equals(G) ? P.multiplyUnsafe(a) : P.multiply(a));\n const sum = mul(this, a).add(mul(Q, b));\n return sum.is0() ? undefined : sum;\n }\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (x, y, z) ∋ (x=x/z, y=y/z)\n toAffine(iz?: T): AffinePoint {\n return toAffineMemo(this, iz);\n }\n isTorsionFree(): boolean {\n const { h: cofactor, isTorsionFree } = CURVE;\n if (cofactor === _1n) return true; // No subgroups, always torsion-free\n if (isTorsionFree) return isTorsionFree(Point, this);\n throw new Error('isTorsionFree() has not been declared for the elliptic curve');\n }\n clearCofactor(): Point {\n const { h: cofactor, clearCofactor } = CURVE;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(CURVE.h);\n }\n\n toRawBytes(isCompressed = true): Uint8Array {\n abool('isCompressed', isCompressed);\n this.assertValidity();\n return toBytes(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n abool('isCompressed', isCompressed);\n return bytesToHex(this.toRawBytes(isCompressed));\n }\n }\n const { endo, nBitLength } = CURVE;\n const wnaf = wNAF(Point, endo ? Math.ceil(nBitLength / 2) : nBitLength);\n return {\n CURVE,\n ProjectivePoint: Point as ProjConstructor,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n };\n}\n\n// Instance\nexport interface SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n assertValidity(): void;\n addRecoveryBit(recovery: number): RecoveredSignatureType;\n hasHighS(): boolean;\n normalizeS(): SignatureType;\n recoverPublicKey(msgHash: Hex): ProjPointType;\n toCompactRawBytes(): Uint8Array;\n toCompactHex(): string;\n toDERRawBytes(isCompressed?: boolean): Uint8Array;\n toDERHex(isCompressed?: boolean): string;\n}\nexport type RecoveredSignatureType = SignatureType & {\n readonly recovery: number;\n};\n// Static methods\nexport type SignatureConstructor = {\n new (r: bigint, s: bigint): SignatureType;\n fromCompact(hex: Hex): SignatureType;\n fromDER(hex: Hex): SignatureType;\n};\ntype SignatureLike = { r: bigint; s: bigint };\n\nexport type PubKey = Hex | ProjPointType;\n\nexport type CurveType = BasicWCurve & {\n hash: CHash; // CHash not FHash because we need outputLen for DRBG\n hmac: HmacFnSync;\n randomBytes: (bytesLength?: number) => Uint8Array;\n lowS?: boolean;\n bits2int?: (bytes: Uint8Array) => bigint;\n bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\n\nfunction validateOpts(\n curve: CurveType\n): Readonly {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n hash: 'hash',\n hmac: 'function',\n randomBytes: 'function',\n },\n {\n bits2int: 'function',\n bits2int_modN: 'function',\n lowS: 'boolean',\n }\n );\n return Object.freeze({ lowS: true, ...opts } as const);\n}\n\nexport type CurveFn = {\n CURVE: ReturnType;\n getPublicKey: (privateKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (privateA: PrivKey, publicB: Hex, isCompressed?: boolean) => Uint8Array;\n sign: (msgHash: Hex, privKey: PrivKey, opts?: SignOpts) => RecoveredSignatureType;\n verify: (signature: Hex | SignatureLike, msgHash: Hex, publicKey: Hex, opts?: VerOpts) => boolean;\n ProjectivePoint: ProjConstructor;\n Signature: SignatureConstructor;\n utils: {\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n isValidPrivateKey(privateKey: PrivKey): boolean;\n randomPrivateKey: () => Uint8Array;\n precompute: (windowSize?: number, point?: ProjPointType) => ProjPointType;\n };\n};\n\n/**\n * Creates short weierstrass curve and ECDSA signature methods for it.\n * @example\n * import { Field } from '@noble/curves/abstract/modular';\n * // Before that, define BigInt-s: a, b, p, n, Gx, Gy\n * const curve = weierstrass({ a, b, Fp: Field(p), n, Gx, Gy, h: 1n })\n */\nexport function weierstrass(curveDef: CurveType): CurveFn {\n const CURVE = validateOpts(curveDef) as ReturnType;\n const { Fp, n: CURVE_ORDER, nByteLength, nBitLength } = CURVE;\n const compressedLen = Fp.BYTES + 1; // e.g. 33 for 32\n const uncompressedLen = 2 * Fp.BYTES + 1; // e.g. 65 for 32\n\n function modN(a: bigint) {\n return mod(a, CURVE_ORDER);\n }\n function invN(a: bigint) {\n return invert(a, CURVE_ORDER);\n }\n\n const {\n ProjectivePoint: Point,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n } = weierstrassPoints({\n ...CURVE,\n toBytes(_c, point, isCompressed: boolean): Uint8Array {\n const a = point.toAffine();\n const x = Fp.toBytes(a.x);\n const cat = concatBytes;\n abool('isCompressed', isCompressed);\n if (isCompressed) {\n return cat(Uint8Array.from([point.hasEvenY() ? 0x02 : 0x03]), x);\n } else {\n return cat(Uint8Array.from([0x04]), x, Fp.toBytes(a.y));\n }\n },\n fromBytes(bytes: Uint8Array) {\n const len = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // this.assertValidity() is done inside of fromHex\n if (len === compressedLen && (head === 0x02 || head === 0x03)) {\n const x = bytesToNumberBE(tail);\n if (!inRange(x, _1n, Fp.ORDER)) throw new Error('Point is not on curve');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: bigint;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const suffix = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('Point is not on curve' + suffix);\n }\n const isYOdd = (y & _1n) === _1n;\n // ECDSA\n const isHeadOdd = (head & 1) === 1;\n if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n return { x, y };\n } else if (len === uncompressedLen && head === 0x04) {\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n } else {\n const cl = compressedLen;\n const ul = uncompressedLen;\n throw new Error(\n 'invalid Point, expected length of ' + cl + ', or uncompressed ' + ul + ', got ' + len\n );\n }\n },\n });\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n\n function normalizeS(s: bigint) {\n return isBiggerThanHalfOrder(s) ? modN(-s) : s;\n }\n // slice bytes num\n const slcNum = (b: Uint8Array, from: number, to: number) => bytesToNumberBE(b.slice(from, to));\n\n /**\n * ECDSA signature with its (r, s) properties. Supports DER & compact representations.\n */\n class Signature implements SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n constructor(r: bigint, s: bigint, recovery?: number) {\n aInRange('r', r, _1n, CURVE_ORDER); // r in [1..N]\n aInRange('s', s, _1n, CURVE_ORDER); // s in [1..N]\n this.r = r;\n this.s = s;\n if (recovery != null) this.recovery = recovery;\n Object.freeze(this);\n }\n\n // pair (bytes of r, bytes of s)\n static fromCompact(hex: Hex) {\n const l = nByteLength;\n hex = ensureBytes('compactSignature', hex, l * 2);\n return new Signature(slcNum(hex, 0, l), slcNum(hex, l, 2 * l));\n }\n\n // DER encoded ECDSA signature\n // https://bitcoin.stackexchange.com/questions/57644/what-are-the-parts-of-a-bitcoin-transaction-input-script\n static fromDER(hex: Hex) {\n const { r, s } = DER.toSig(ensureBytes('DER', hex));\n return new Signature(r, s);\n }\n\n /**\n * @todo remove\n * @deprecated\n */\n assertValidity(): void {}\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(msgHash: Hex): typeof Point.BASE {\n const { r, s, recovery: rec } = this;\n const h = bits2int_modN(ensureBytes('msgHash', msgHash)); // Truncate hash\n if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n const radj = rec === 2 || rec === 3 ? r + CURVE.n : r;\n if (radj >= Fp.ORDER) throw new Error('recovery id 2 or 3 invalid');\n const prefix = (rec & 1) === 0 ? '02' : '03';\n const R = Point.fromHex(prefix + numToSizedHex(radj, Fp.BYTES));\n const ir = invN(radj); // r^-1\n const u1 = modN(-h * ir); // -hr^-1\n const u2 = modN(s * ir); // sr^-1\n const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2); // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1)\n if (!Q) throw new Error('point at infinify'); // unsafe is fine: no priv data leaked\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, modN(-this.s), this.recovery) : this;\n }\n\n // DER-encoded\n toDERRawBytes() {\n return hexToBytes(this.toDERHex());\n }\n toDERHex() {\n return DER.hexFromSig(this);\n }\n\n // padded bytes of r, then padded bytes of s\n toCompactRawBytes() {\n return hexToBytes(this.toCompactHex());\n }\n toCompactHex() {\n const l = nByteLength;\n return numToSizedHex(this.r, l) + numToSizedHex(this.s, l);\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n const utils = {\n isValidPrivateKey(privateKey: PrivKey) {\n try {\n normPrivateKeyToScalar(privateKey);\n return true;\n } catch (error) {\n return false;\n }\n },\n normPrivateKeyToScalar: normPrivateKeyToScalar,\n\n /**\n * Produces cryptographically secure private key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n randomPrivateKey: (): Uint8Array => {\n const length = getMinHashLength(CURVE.n);\n return mapHashToField(CURVE.randomBytes(length), CURVE.n);\n },\n\n /**\n * Creates precompute table for an arbitrary EC point. Makes point \"cached\".\n * Allows to massively speed-up `point.multiply(scalar)`.\n * @returns cached point\n * @example\n * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey));\n * fast.multiply(privKey); // much faster ECDH now\n */\n precompute(windowSize = 8, point = Point.BASE): typeof Point.BASE {\n point._setWindowSize(windowSize);\n point.multiply(BigInt(3)); // 3 is arbitrary, just need any number here\n return point;\n },\n };\n\n /**\n * Computes public key for a private key. Checks for validity of the private key.\n * @param privateKey private key\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(privateKey: PrivKey, isCompressed = true): Uint8Array {\n return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n if (typeof item === 'bigint') return false;\n if (item instanceof Point) return true;\n const arr = ensureBytes('key', item);\n const len = arr.length;\n const fpl = Fp.BYTES;\n const compLen = fpl + 1; // e.g. 33 for 32\n const uncompLen = 2 * fpl + 1; // e.g. 65 for 32\n if (CURVE.allowedPrivateKeyLengths || nByteLength === compLen) {\n return undefined;\n } else {\n return len === compLen || len === uncompLen;\n }\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from private key and public key.\n * Checks: 1) private key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param privateA private key\n * @param publicB different public key\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(privateA: PrivKey, publicB: Hex, isCompressed = true): Uint8Array {\n if (isProbPub(privateA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicB) === false) throw new Error('second arg must be public key');\n const b = Point.fromHex(publicB); // check for being on-curve\n return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed);\n }\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n CURVE.bits2int ||\n function (bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - nBitLength; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n CURVE.bits2int_modN ||\n function (bytes: Uint8Array): bigint {\n return modN(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // NOTE: pads output with zero as per spec\n const ORDER_MASK = bitMask(nBitLength);\n /**\n * Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`.\n */\n function int2octets(num: bigint): Uint8Array {\n aInRange('num < 2^' + nBitLength, num, _0n, ORDER_MASK);\n // works with order, can have different size than numToField!\n return numberToBytesBE(num, nByteLength);\n }\n\n // Steps A, D of RFC6979 3.2\n // Creates RFC6979 seed; converts msg/privKey to numbers.\n // Used only in sign, not in verify.\n // NOTE: we cannot assume here that msgHash has same amount of bytes as curve order,\n // this will be invalid at least for P521. Also it can be bigger for P224 + SHA256\n function prepSig(msgHash: Hex, privateKey: PrivKey, opts = defaultSigOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { hash, randomBytes } = CURVE;\n let { lowS, prehash, extraEntropy: ent } = opts; // generates low-s sigs by default\n if (lowS == null) lowS = true; // RFC6979 3.2: we skip step A, because we already provide hash\n msgHash = ensureBytes('msgHash', msgHash);\n validateSigVerOpts(opts);\n if (prehash) msgHash = ensureBytes('prehashed msgHash', hash(msgHash));\n\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with nBitLength % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(msgHash);\n const d = normPrivateKeyToScalar(privateKey); // validate private key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (ent != null && ent !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n const e = ent === true ? randomBytes(Fp.BYTES) : ent; // generate random bytes OR pass as-is\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!isWithinCurveOrder(k)) return; // Important: all mod() calls here must be done over N\n const ik = invN(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = Gk\n const r = modN(q.x); // r = q.x mod n\n if (r === _0n) return;\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n const s = modN(ik * modN(m + r * d)); // Not using blinding here\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = normalizeS(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n }\n return { seed, k2sig };\n }\n const defaultSigOpts: SignOpts = { lowS: CURVE.lowS, prehash: false };\n const defaultVerOpts: VerOpts = { lowS: CURVE.lowS, prehash: false };\n\n /**\n * Signs message hash with a private key.\n * ```\n * sign(m, d, k) where\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr)/k mod n\n * ```\n * @param msgHash NOT message. msg needs to be hashed to `msgHash`, or use `prehash`.\n * @param privKey private key\n * @param opts lowS for non-malleable sigs. extraEntropy for mixing randomness into k. prehash will hash first arg.\n * @returns signature with recovery param\n */\n function sign(msgHash: Hex, privKey: PrivKey, opts = defaultSigOpts): RecoveredSignature {\n const { seed, k2sig } = prepSig(msgHash, privKey, opts); // Steps A, D of RFC6979 3.2.\n const C = CURVE;\n const drbg = createHmacDrbg(C.hash.outputLen, C.nByteLength, C.hmac);\n return drbg(seed, k2sig); // Steps B, C, D, E, F, G\n }\n\n // Enable precomputes. Slows down first publicKey computation by 20ms.\n Point.BASE._setWindowSize(8);\n // utils.precompute(8, ProjectivePoint.BASE)\n\n /**\n * Verifies a signature against message hash and public key.\n * Rejects lowS signatures by default: to override,\n * specify option `{lowS: false}`. Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * U1 = hs^-1 mod n\n * U2 = rs^-1 mod n\n * R = U1⋅G - U2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Hex | SignatureLike,\n msgHash: Hex,\n publicKey: Hex,\n opts = defaultVerOpts\n ): boolean {\n const sg = signature;\n msgHash = ensureBytes('msgHash', msgHash);\n publicKey = ensureBytes('publicKey', publicKey);\n const { lowS, prehash, format } = opts;\n\n // Verify opts, deduce signature format\n validateSigVerOpts(opts);\n if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n if (format !== undefined && format !== 'compact' && format !== 'der')\n throw new Error('format must be compact or der');\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj =\n !isHex &&\n !format &&\n typeof sg === 'object' &&\n sg !== null &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n\n let _sig: Signature | undefined = undefined;\n let P: ProjPointType;\n try {\n if (isObj) _sig = new Signature(sg.r, sg.s);\n if (isHex) {\n // Signature can be represented in 2 ways: compact (2*nByteLength) & DER (variable-length).\n // Since DER can also be 2*nByteLength bytes, we check for it first.\n try {\n if (format !== 'compact') _sig = Signature.fromDER(sg);\n } catch (derError) {\n if (!(derError instanceof DER.Err)) throw derError;\n }\n if (!_sig && format !== 'der') _sig = Signature.fromCompact(sg);\n }\n P = Point.fromHex(publicKey);\n } catch (error) {\n return false;\n }\n if (!_sig) return false;\n if (lowS && _sig.hasHighS()) return false;\n if (prehash) msgHash = CURVE.hash(msgHash);\n const { r, s } = _sig;\n const h = bits2int_modN(msgHash); // Cannot use fields methods, since it is group element\n const is = invN(s); // s^-1\n const u1 = modN(h * is); // u1 = hs^-1 mod n\n const u2 = modN(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2)?.toAffine(); // R = u1⋅G + u2⋅P\n if (!R) return false;\n const v = modN(R.x);\n return v === r;\n }\n return {\n CURVE,\n getPublicKey,\n getSharedSecret,\n sign,\n verify,\n ProjectivePoint: Point,\n Signature,\n utils,\n };\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(\n Fp: IField,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(\n Fp: IField,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n if (!Fp.isValid(opts.A) || !Fp.isValid(opts.B) || !Fp.isValid(opts.Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, opts.Z);\n if (!Fp.isOdd) throw new Error('Fp.isOdd is not implemented!');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, opts.Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, opts.B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(opts.Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, opts.A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, opts.A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, opts.B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\nimport * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type { Compute, ExactPartial, OneOf } from './internal/types.js'\nimport * as Json from './Json.js'\nimport * as Solidity from './Solidity.js'\n\n/** Root type for an ECDSA signature. */\nexport type Signature<\n recovered extends boolean = true,\n bigintType = bigint,\n numberType = number,\n> = Compute<\n recovered extends true\n ? {\n r: bigintType\n s: bigintType\n yParity: numberType\n }\n : {\n r: bigintType\n s: bigintType\n yParity?: numberType | undefined\n }\n>\n\n/** RPC-formatted ECDSA signature. */\nexport type Rpc = Signature<\n recovered,\n Hex.Hex,\n Hex.Hex\n>\n\n/** (Legacy) ECDSA signature. */\nexport type Legacy = {\n r: bigintType\n s: bigintType\n v: numberType\n}\n\n/** RPC-formatted (Legacy) ECDSA signature. */\nexport type LegacyRpc = Legacy\n\nexport type Tuple = readonly [yParity: Hex.Hex, r: Hex.Hex, s: Hex.Hex]\n\n/**\n * Asserts that a Signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.assert({\n * r: -49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * })\n * // @error: InvalidSignatureRError:\n * // @error: Value `-549...n` is an invalid r value.\n * // @error: r must be a positive integer less than 2^256.\n * ```\n *\n * @param signature - The signature object to assert.\n */\nexport function assert(\n signature: ExactPartial,\n options: assert.Options = {},\n): asserts signature is Signature {\n const { recovered } = options\n if (typeof signature.r === 'undefined')\n throw new MissingPropertiesError({ signature })\n if (typeof signature.s === 'undefined')\n throw new MissingPropertiesError({ signature })\n if (recovered && typeof signature.yParity === 'undefined')\n throw new MissingPropertiesError({ signature })\n if (signature.r < 0n || signature.r > Solidity.maxUint256)\n throw new InvalidRError({ value: signature.r })\n if (signature.s < 0n || signature.s > Solidity.maxUint256)\n throw new InvalidSError({ value: signature.s })\n if (\n typeof signature.yParity === 'number' &&\n signature.yParity !== 0 &&\n signature.yParity !== 1\n )\n throw new InvalidYParityError({ value: signature.yParity })\n}\n\nexport declare namespace assert {\n type Options = {\n /** Whether or not the signature should be recovered (contain `yParity`). */\n recovered?: boolean\n }\n\n type ErrorType =\n | MissingPropertiesError\n | InvalidRError\n | InvalidSError\n | InvalidYParityError\n | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#Bytes.Bytes} signature into a structured {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Signature } from 'ox'\n *\n * Signature.fromBytes(new Uint8Array([128, 3, 131, ...]))\n * // @log: { r: 5231...n, s: 3522...n, yParity: 0 }\n * ```\n *\n * @param signature - The serialized signature.\n * @returns The deserialized {@link ox#Signature.Signature}.\n */\nexport function fromBytes(signature: Bytes.Bytes): Signature {\n return fromHex(Hex.fromBytes(signature))\n}\n\nexport declare namespace fromBytes {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#Hex.Hex} signature into a structured {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.fromHex('0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c')\n * // @log: { r: 5231...n, s: 3522...n, yParity: 0 }\n * ```\n *\n * @param serialized - The serialized signature.\n * @returns The deserialized {@link ox#Signature.Signature}.\n */\nexport function fromHex(signature: Hex.Hex): Signature {\n if (signature.length !== 130 && signature.length !== 132)\n throw new InvalidSerializedSizeError({ signature })\n\n const r = BigInt(Hex.slice(signature, 0, 32))\n const s = BigInt(Hex.slice(signature, 32, 64))\n\n const yParity = (() => {\n const yParity = Number(`0x${signature.slice(130)}`)\n if (Number.isNaN(yParity)) return undefined\n try {\n return vToYParity(yParity)\n } catch {\n throw new InvalidYParityError({ value: yParity })\n }\n })()\n\n if (typeof yParity === 'undefined')\n return {\n r,\n s,\n } as never\n return {\n r,\n s,\n yParity,\n } as never\n}\n\nexport declare namespace fromHex {\n type ErrorType =\n | Hex.from.ErrorType\n | InvalidSerializedSizeError\n | Errors.GlobalErrorType\n}\n\n/**\n * Extracts a {@link ox#Signature.Signature} from an arbitrary object that may include signature properties.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Signature } from 'ox'\n *\n * Signature.extract({\n * baz: 'barry',\n * foo: 'bar',\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * zebra: 'stripes',\n * })\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: yParity: 1\n * // @log: }\n * ```\n *\n * @param value - The arbitrary object to extract the signature from.\n * @returns The extracted {@link ox#Signature.Signature}.\n */\nexport function extract(value: extract.Value): Signature | undefined {\n if (typeof value.r === 'undefined') return undefined\n if (typeof value.s === 'undefined') return undefined\n return from(value as any)\n}\n\nexport declare namespace extract {\n type Value = {\n r?: bigint | Hex.Hex | undefined\n s?: bigint | Hex.Hex | undefined\n yParity?: number | Hex.Hex | undefined\n v?: number | Hex.Hex | undefined\n }\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a typed {@link ox#Signature.Signature} object from a {@link ox#Signature.Signature}, {@link ox#Signature.Legacy}, {@link ox#Bytes.Bytes}, or {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.from({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * })\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: yParity: 1\n * // @log: }\n * ```\n *\n * @example\n * ### From Serialized\n *\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.from('0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db801')\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: yParity: 1,\n * // @log: }\n * ```\n *\n * @example\n * ### From Legacy\n *\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.from({\n * r: 47323457007453657207889730243826965761922296599680473886588287015755652701072n,\n * s: 57228803202727131502949358313456071280488184270258293674242124340113824882788n,\n * v: 27,\n * })\n * // @log: {\n * // @log: r: 47323457007453657207889730243826965761922296599680473886588287015755652701072n,\n * // @log: s: 57228803202727131502949358313456071280488184270258293674242124340113824882788n,\n * // @log: yParity: 0\n * // @log: }\n * ```\n *\n * @param signature - The signature value to instantiate.\n * @returns The instantiated {@link ox#Signature.Signature}.\n */\nexport function from<\n const signature extends\n | OneOf | Rpc | Legacy | LegacyRpc>\n | Hex.Hex\n | Bytes.Bytes,\n>(\n signature:\n | signature\n | OneOf | Rpc | Legacy | LegacyRpc>\n | Hex.Hex\n | Bytes.Bytes,\n): from.ReturnType {\n const signature_ = (() => {\n if (typeof signature === 'string') return fromHex(signature)\n if (signature instanceof Uint8Array) return fromBytes(signature)\n if (typeof signature.r === 'string') return fromRpc(signature)\n if (signature.v) return fromLegacy(signature)\n return {\n r: signature.r,\n s: signature.s,\n ...(typeof signature.yParity !== 'undefined'\n ? { yParity: signature.yParity }\n : {}),\n }\n })()\n assert(signature_)\n return signature_ as never\n}\n\nexport declare namespace from {\n type ReturnType<\n signature extends\n | OneOf | Rpc | Legacy | LegacyRpc>\n | Hex.Hex\n | Bytes.Bytes,\n > = signature extends Signature & { v?: undefined }\n ? signature\n : Signature\n\n type ErrorType =\n | assert.ErrorType\n | fromBytes.ErrorType\n | fromHex.ErrorType\n | vToYParity.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts a DER-encoded signature to a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromDerBytes(new Uint8Array([132, 51, 23, ...]))\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: }\n * ```\n *\n * @param signature - The DER-encoded signature to convert.\n * @returns The {@link ox#Signature.Signature}.\n */\nexport function fromDerBytes(signature: Bytes.Bytes): Signature {\n return fromDerHex(Hex.fromBytes(signature))\n}\n\nexport declare namespace fromDerBytes {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a DER-encoded signature to a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromDerHex('0x304402206e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf02204a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db8')\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: }\n * ```\n *\n * @param signature - The DER-encoded signature to convert.\n * @returns The {@link ox#Signature.Signature}.\n */\nexport function fromDerHex(signature: Hex.Hex): Signature {\n const { r, s } = secp256k1.Signature.fromDER(Hex.from(signature).slice(2))\n return { r, s }\n}\n\nexport declare namespace fromDerHex {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Legacy} into a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const legacy = Signature.fromLegacy({ r: 1n, s: 2n, v: 28 })\n * // @log: { r: 1n, s: 2n, yParity: 1 }\n * ```\n *\n * @param signature - The {@link ox#Signature.Legacy} to convert.\n * @returns The converted {@link ox#Signature.Signature}.\n */\nexport function fromLegacy(signature: Legacy): Signature {\n return {\n r: signature.r,\n s: signature.s,\n yParity: vToYParity(signature.v),\n }\n}\n\nexport declare namespace fromLegacy {\n type ErrorType = vToYParity.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Rpc} into a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromRpc({\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * })\n * ```\n *\n * @param signature - The {@link ox#Signature.Rpc} to convert.\n * @returns The converted {@link ox#Signature.Signature}.\n */\nexport function fromRpc(signature: {\n r: Hex.Hex\n s: Hex.Hex\n yParity?: Hex.Hex | undefined\n v?: Hex.Hex | undefined\n}): Signature {\n const yParity = (() => {\n const v = signature.v ? Number(signature.v) : undefined\n let yParity = signature.yParity ? Number(signature.yParity) : undefined\n if (typeof v === 'number' && typeof yParity !== 'number')\n yParity = vToYParity(v)\n if (typeof yParity !== 'number')\n throw new InvalidYParityError({ value: signature.yParity })\n return yParity\n })()\n\n return {\n r: BigInt(signature.r),\n s: BigInt(signature.s),\n yParity,\n }\n}\n\nexport declare namespace fromRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Tuple} to a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromTuple(['0x01', '0x7b', '0x1c8'])\n * // @log: {\n * // @log: r: 123n,\n * // @log: s: 456n,\n * // @log: yParity: 1,\n * // @log: }\n * ```\n *\n * @param tuple - The {@link ox#Signature.Tuple} to convert.\n * @returns The {@link ox#Signature.Signature}.\n */\nexport function fromTuple(tuple: Tuple): Signature {\n const [yParity, r, s] = tuple\n return from({\n r: r === '0x' ? 0n : BigInt(r),\n s: s === '0x' ? 0n : BigInt(s),\n yParity: yParity === '0x' ? 0 : Number(yParity),\n })\n}\n\nexport declare namespace fromTuple {\n type ErrorType = from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#Signature.Signature} to {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.toBytes({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1\n * })\n * // @log: Uint8Array [102, 16, 10, ...]\n * ```\n *\n * @param signature - The signature to serialize.\n * @returns The serialized signature.\n */\nexport function toBytes(signature: Signature): Bytes.Bytes {\n return Bytes.fromHex(toHex(signature))\n}\n\nexport declare namespace toBytes {\n type ErrorType =\n | toHex.ErrorType\n | Bytes.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#Signature.Signature} to {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.toHex({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1\n * })\n * // @log: '0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c'\n * ```\n *\n * @param signature - The signature to serialize.\n * @returns The serialized signature.\n */\nexport function toHex(signature: Signature): Hex.Hex {\n assert(signature)\n\n const r = signature.r\n const s = signature.s\n\n const signature_ = Hex.concat(\n Hex.fromNumber(r, { size: 32 }),\n Hex.fromNumber(s, { size: 32 }),\n // If the signature is recovered, add the recovery byte to the signature.\n typeof signature.yParity === 'number'\n ? Hex.fromNumber(yParityToV(signature.yParity), { size: 1 })\n : '0x',\n )\n\n return signature_\n}\n\nexport declare namespace toHex {\n type ErrorType =\n | Hex.concat.ErrorType\n | Hex.fromNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} to DER-encoded format.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.from({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * })\n *\n * const signature_der = Signature.toDerBytes(signature)\n * // @log: Uint8Array [132, 51, 23, ...]\n * ```\n *\n * @param signature - The signature to convert.\n * @returns The DER-encoded signature.\n */\nexport function toDerBytes(signature: Signature): Bytes.Bytes {\n const sig = new secp256k1.Signature(signature.r, signature.s)\n return sig.toDERRawBytes()\n}\n\nexport declare namespace toDerBytes {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} to DER-encoded format.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.from({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * })\n *\n * const signature_der = Signature.toDerHex(signature)\n * // @log: '0x304402206e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf02204a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db8'\n * ```\n *\n * @param signature - The signature to convert.\n * @returns The DER-encoded signature.\n */\nexport function toDerHex(signature: Signature): Hex.Hex {\n const sig = new secp256k1.Signature(signature.r, signature.s)\n return `0x${sig.toDERHex()}`\n}\n\nexport declare namespace toDerHex {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} into a {@link ox#Signature.Legacy}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const legacy = Signature.toLegacy({ r: 1n, s: 2n, yParity: 1 })\n * // @log: { r: 1n, s: 2n, v: 28 }\n * ```\n *\n * @param signature - The {@link ox#Signature.Signature} to convert.\n * @returns The converted {@link ox#Signature.Legacy}.\n */\nexport function toLegacy(signature: Signature): Legacy {\n return {\n r: signature.r,\n s: signature.s,\n v: yParityToV(signature.yParity),\n }\n}\n\nexport declare namespace toLegacy {\n type ErrorType = yParityToV.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} into a {@link ox#Signature.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.toRpc({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1\n * })\n * ```\n *\n * @param signature - The {@link ox#Signature.Signature} to convert.\n * @returns The converted {@link ox#Signature.Rpc}.\n */\nexport function toRpc(signature: Signature): Rpc {\n const { r, s, yParity } = signature\n return {\n r: Hex.fromNumber(r, { size: 32 }),\n s: Hex.fromNumber(s, { size: 32 }),\n yParity: yParity === 0 ? '0x0' : '0x1',\n }\n}\n\nexport declare namespace toRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} to a serialized {@link ox#Signature.Tuple} to be used for signatures in Transaction Envelopes, EIP-7702 Authorization Lists, etc.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signatureTuple = Signature.toTuple({\n * r: 123n,\n * s: 456n,\n * yParity: 1,\n * })\n * // @log: [yParity: '0x01', r: '0x7b', s: '0x1c8']\n * ```\n *\n * @param signature - The {@link ox#Signature.Signature} to convert.\n * @returns The {@link ox#Signature.Tuple}.\n */\nexport function toTuple(signature: Signature): Tuple {\n const { r, s, yParity } = signature\n\n return [\n yParity ? '0x01' : '0x',\n r === 0n ? '0x' : Hex.trimLeft(Hex.fromNumber(r!)),\n s === 0n ? '0x' : Hex.trimLeft(Hex.fromNumber(s!)),\n ] as const\n}\n\nexport declare namespace toTuple {\n type ErrorType =\n | Hex.trimLeft.ErrorType\n | Hex.fromNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Validates a Signature. Returns `true` if the signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const valid = Signature.validate({\n * r: -49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * })\n * // @log: false\n * ```\n *\n * @param signature - The signature object to assert.\n */\nexport function validate(\n signature: ExactPartial,\n options: validate.Options = {},\n): boolean {\n try {\n assert(signature, options)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /** Whether or not the signature should be recovered (contain `yParity`). */\n recovered?: boolean\n }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a ECDSA `v` value to a `yParity` value.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const yParity = Signature.vToYParity(28)\n * // @log: 1\n * ```\n *\n * @param v - The ECDSA `v` value to convert.\n * @returns The `yParity` value.\n */\nexport function vToYParity(v: number): Signature['yParity'] {\n if (v === 0 || v === 27) return 0\n if (v === 1 || v === 28) return 1\n if (v >= 35) return v % 2 === 0 ? 1 : 0\n throw new InvalidVError({ value: v })\n}\n\nexport declare namespace vToYParity {\n type ErrorType = InvalidVError | Errors.GlobalErrorType\n}\n\n/**\n * Converts a ECDSA `v` value to a `yParity` value.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const v = Signature.yParityToV(1)\n * // @log: 28\n * ```\n *\n * @param yParity - The ECDSA `yParity` value to convert.\n * @returns The `v` value.\n */\nexport function yParityToV(yParity: number): number {\n if (yParity === 0) return 27\n if (yParity === 1) return 28\n throw new InvalidYParityError({ value: yParity })\n}\n\nexport declare namespace yParityToV {\n type ErrorType = InvalidVError | Errors.GlobalErrorType\n}\n\n/** Thrown when the serialized signature is of an invalid size. */\nexport class InvalidSerializedSizeError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidSerializedSizeError'\n\n constructor({ signature }: { signature: Hex.Hex | Bytes.Bytes }) {\n super(`Value \\`${signature}\\` is an invalid signature size.`, {\n metaMessages: [\n 'Expected: 64 bytes or 65 bytes.',\n `Received ${Hex.size(Hex.from(signature))} bytes.`,\n ],\n })\n }\n}\n\n/** Thrown when the signature is missing either an `r`, `s`, or `yParity` property. */\nexport class MissingPropertiesError extends Errors.BaseError {\n override readonly name = 'Signature.MissingPropertiesError'\n\n constructor({ signature }: { signature: unknown }) {\n super(\n `Signature \\`${Json.stringify(signature)}\\` is missing either an \\`r\\`, \\`s\\`, or \\`yParity\\` property.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `r` value. */\nexport class InvalidRError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidRError'\n\n constructor({ value }: { value: unknown }) {\n super(\n `Value \\`${value}\\` is an invalid r value. r must be a positive integer less than 2^256.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `s` value. */\nexport class InvalidSError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidSError'\n\n constructor({ value }: { value: unknown }) {\n super(\n `Value \\`${value}\\` is an invalid s value. s must be a positive integer less than 2^256.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `yParity` value. */\nexport class InvalidYParityError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidYParityError'\n\n constructor({ value }: { value: unknown }) {\n super(\n `Value \\`${value}\\` is an invalid y-parity value. Y-parity must be 0 or 1.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `v` value. */\nexport class InvalidVError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidVError'\n\n constructor({ value }: { value: number }) {\n super(`Value \\`${value}\\` is an invalid v value. v must be 27, 28 or >=35.`)\n }\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\nimport * as Address from './Address.js'\nimport * as Bytes from './Bytes.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as Entropy from './internal/entropy.js'\nimport type { OneOf } from './internal/types.js'\nimport * as PublicKey from './PublicKey.js'\nimport type * as Signature from './Signature.js'\n\n/** Re-export of noble/curves secp256k1 utilities. */\nexport const noble = secp256k1\n\n/**\n * Creates a new secp256k1 ECDSA key pair consisting of a private key and its corresponding public key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const { privateKey, publicKey } = Secp256k1.createKeyPair()\n * ```\n *\n * @param options - The options to generate the key pair.\n * @returns The generated key pair containing both private and public keys.\n */\nexport function createKeyPair(\n options: createKeyPair.Options = {},\n): createKeyPair.ReturnType {\n const { as = 'Hex' } = options\n const privateKey = randomPrivateKey({ as })\n const publicKey = getPublicKey({ privateKey })\n\n return {\n privateKey: privateKey as never,\n publicKey,\n }\n}\n\nexport declare namespace createKeyPair {\n type Options = {\n /**\n * Format of the returned private key.\n * @default 'Hex'\n */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType = {\n privateKey:\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n publicKey: PublicKey.PublicKey\n }\n\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | PublicKey.from.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes the secp256k1 ECDSA public key from a provided private key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const publicKey = Secp256k1.getPublicKey({ privateKey: '0x...' })\n * ```\n *\n * @param options - The options to compute the public key.\n * @returns The computed public key.\n */\nexport function getPublicKey(\n options: getPublicKey.Options,\n): PublicKey.PublicKey {\n const { privateKey } = options\n const point = secp256k1.ProjectivePoint.fromPrivateKey(\n Hex.from(privateKey).slice(2),\n )\n return PublicKey.from(point)\n}\n\nexport declare namespace getPublicKey {\n type Options = {\n /**\n * Private key to compute the public key from.\n */\n privateKey: Hex.Hex | Bytes.Bytes\n }\n\n type ErrorType =\n | Hex.from.ErrorType\n | PublicKey.from.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes a shared secret using ECDH (Elliptic Curve Diffie-Hellman) between a private key and a public key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const { privateKey: privateKeyA } = Secp256k1.createKeyPair()\n * const { publicKey: publicKeyB } = Secp256k1.createKeyPair()\n *\n * const sharedSecret = Secp256k1.getSharedSecret({\n * privateKey: privateKeyA,\n * publicKey: publicKeyB\n * })\n * ```\n *\n * @param options - The options to compute the shared secret.\n * @returns The computed shared secret.\n */\nexport function getSharedSecret(\n options: getSharedSecret.Options,\n): getSharedSecret.ReturnType {\n const { as = 'Hex', privateKey, publicKey } = options\n const point = secp256k1.ProjectivePoint.fromHex(\n PublicKey.toHex(publicKey).slice(2),\n )\n const sharedPoint = point.multiply(\n secp256k1.utils.normPrivateKeyToScalar(Hex.from(privateKey).slice(2)),\n )\n const sharedSecret = sharedPoint.toRawBytes(true) // compressed format\n if (as === 'Hex') return Hex.fromBytes(sharedSecret) as never\n return sharedSecret as never\n}\n\nexport declare namespace getSharedSecret {\n type Options = {\n /**\n * Format of the returned shared secret.\n * @default 'Hex'\n */\n as?: as | 'Hex' | 'Bytes' | undefined\n /**\n * Private key to use for the shared secret computation.\n */\n privateKey: Hex.Hex | Bytes.Bytes\n /**\n * Public key to use for the shared secret computation.\n */\n publicKey: PublicKey.PublicKey\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Hex.from.ErrorType\n | PublicKey.toHex.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Generates a random ECDSA private key on the secp256k1 curve.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n * ```\n *\n * @param options - The options to generate the private key.\n * @returns The generated private key.\n */\nexport function randomPrivateKey(\n options: randomPrivateKey.Options = {},\n): randomPrivateKey.ReturnType {\n const { as = 'Hex' } = options\n const bytes = secp256k1.utils.randomPrivateKey()\n if (as === 'Hex') return Hex.fromBytes(bytes) as never\n return bytes as never\n}\n\nexport declare namespace randomPrivateKey {\n type Options = {\n /**\n * Format of the returned private key.\n * @default 'Hex'\n */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType = Hex.fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Recovers the signing address from the signed payload and signature.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey: '0x...' })\n *\n * const address = Secp256k1.recoverAddress({ // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The recovery options.\n * @returns The recovered address.\n */\nexport function recoverAddress(\n options: recoverAddress.Options,\n): recoverAddress.ReturnType {\n return Address.fromPublicKey(recoverPublicKey(options))\n}\n\nexport declare namespace recoverAddress {\n type Options = {\n /** Payload that was signed. */\n payload: Hex.Hex | Bytes.Bytes\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n\n type ReturnType = Address.Address\n\n type ErrorType =\n | Address.fromPublicKey.ErrorType\n | recoverPublicKey.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Recovers the signing public key from the signed payload and signature.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey: '0x...' })\n *\n * const publicKey = Secp256k1.recoverPublicKey({ // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The recovery options.\n * @returns The recovered public key.\n */\nexport function recoverPublicKey(\n options: recoverPublicKey.Options,\n): PublicKey.PublicKey {\n const { payload, signature } = options\n const { r, s, yParity } = signature\n const signature_ = new secp256k1.Signature(\n BigInt(r),\n BigInt(s),\n ).addRecoveryBit(yParity)\n const point = signature_.recoverPublicKey(Hex.from(payload).substring(2))\n return PublicKey.from(point)\n}\n\nexport declare namespace recoverPublicKey {\n type Options = {\n /** Payload that was signed. */\n payload: Hex.Hex | Bytes.Bytes\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n\n type ErrorType =\n | PublicKey.from.ErrorType\n | Hex.from.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Signs the payload with the provided private key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * privateKey: '0x...' // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The signing options.\n * @returns The ECDSA {@link ox#Signature.Signature}.\n */\nexport function sign(options: sign.Options): Signature.Signature {\n const {\n extraEntropy = Entropy.extraEntropy,\n hash,\n payload,\n privateKey,\n } = options\n const { r, s, recovery } = secp256k1.sign(\n Bytes.from(payload),\n Bytes.from(privateKey),\n {\n extraEntropy:\n typeof extraEntropy === 'boolean'\n ? extraEntropy\n : Hex.from(extraEntropy).slice(2),\n lowS: true,\n ...(hash ? { prehash: true } : {}),\n },\n )\n return {\n r,\n s,\n yParity: recovery,\n }\n}\n\nexport declare namespace sign {\n type Options = {\n /**\n * Extra entropy to add to the signing process. Setting to `false` will disable it.\n * @default true\n */\n extraEntropy?: boolean | Hex.Hex | Bytes.Bytes | undefined\n /**\n * If set to `true`, the payload will be hashed (sha256) before being signed.\n */\n hash?: boolean | undefined\n /**\n * Payload to sign.\n */\n payload: Hex.Hex | Bytes.Bytes\n /**\n * ECDSA private key.\n */\n privateKey: Hex.Hex | Bytes.Bytes\n }\n\n type ErrorType = Bytes.from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Verifies a payload was signed by the provided address.\n *\n * @example\n * ### Verify with Ethereum Address\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey: '0x...' })\n *\n * const verified = Secp256k1.verify({ // [!code focus]\n * address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @example\n * ### Verify with Public Key\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const privateKey = '0x...'\n * const publicKey = Secp256k1.getPublicKey({ privateKey })\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey })\n *\n * const verified = Secp256k1.verify({ // [!code focus]\n * publicKey, // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The verification options.\n * @returns Whether the payload was signed by the provided address.\n */\nexport function verify(options: verify.Options): boolean {\n const { address, hash, payload, publicKey, signature } = options\n if (address)\n return Address.isEqual(address, recoverAddress({ payload, signature }))\n return secp256k1.verify(\n signature,\n Bytes.from(payload),\n PublicKey.toBytes(publicKey),\n ...(hash ? [{ prehash: true, lowS: true }] : []),\n )\n}\n\nexport declare namespace verify {\n type Options = {\n /** If set to `true`, the payload will be hashed (sha256) before being verified. */\n hash?: boolean | undefined\n /** Payload that was signed. */\n payload: Hex.Hex | Bytes.Bytes\n } & OneOf<\n | {\n /** Address that signed the payload. */\n address: Address.Address\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n | {\n /** Public key that signed the payload. */\n publicKey: PublicKey.PublicKey\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Proof } from '../../types/proof.js'\nimport type { RpcProof } from '../../types/rpc.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { hexToNumber } from '../index.js'\n\nexport type FormatProofErrorType = ErrorType\n\nfunction formatStorageProof(storageProof: RpcProof['storageProof']) {\n return storageProof.map((proof) => ({\n ...proof,\n value: BigInt(proof.value),\n }))\n}\n\nexport function formatProof(proof: ExactPartial) {\n return {\n ...proof,\n balance: proof.balance ? BigInt(proof.balance) : undefined,\n nonce: proof.nonce ? hexToNumber(proof.nonce) : undefined,\n storageProof: proof.storageProof\n ? formatStorageProof(proof.storageProof)\n : undefined,\n } as Proof\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetStorageAtParameters = {\n address: Address\n slot: Hex\n} & (\n | {\n blockNumber?: undefined\n blockTag?: BlockTag | undefined\n }\n | {\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\n\nexport type GetStorageAtReturnType = Hex | undefined\n\nexport type GetStorageAtErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the value from a storage slot at a given address.\n *\n * - Docs: https://viem.sh/docs/contract/getStorageAt\n * - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat)\n *\n * @param client - Client to use\n * @param parameters - {@link GetStorageAtParameters}\n * @returns The value of the storage slot. {@link GetStorageAtReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getStorageAt } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await getStorageAt(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * slot: toHex(0),\n * })\n */\nexport async function getStorageAt(\n client: Client,\n { address, blockNumber, blockTag = 'latest', slot }: GetStorageAtParameters,\n): Promise {\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n const data = await client.request({\n method: 'eth_getStorageAt',\n params: [address, slot, blockNumberHex || blockTag],\n })\n return data\n}\n","import type { Address } from '../../accounts/index.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n TransactionNotFoundError,\n type TransactionNotFoundErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcTransaction } from '../../types/rpc.js'\nimport type { OneOf, Prettify } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormattedTransaction,\n formatTransaction,\n} from '../../utils/formatters/transaction.js'\n\nexport type GetTransactionParameters =\n OneOf<\n // eth_getTransactionByBlockHashAndIndex\n | {\n /** The block hash */\n blockHash: Hash\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByBlockNumberAndIndex\n | {\n /** The block number */\n blockNumber: bigint\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByBlockNumberAndIndex\n | {\n /** The block tag. */\n blockTag: blockTag | BlockTag\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByHash\n | {\n /** The hash of the transaction. */\n hash: Hash\n }\n // eth_getTransactionBySenderAndNonce\n | {\n /** The sender of the transaction. */\n sender: Address\n /** The nonce of the transaction on the sender. */\n nonce: number\n }\n >\n\nexport type GetTransactionReturnType<\n chain extends Chain | undefined = undefined,\n blockTag extends BlockTag = 'latest',\n> = Prettify>\n\nexport type GetTransactionErrorType =\n | TransactionNotFoundErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns information about a [Transaction](https://viem.sh/docs/glossary/terms#transaction) given a hash or block identifier.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransaction\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionParameters}\n * @returns The transaction information. {@link GetTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransaction } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transaction = await getTransaction(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransaction<\n chain extends Chain | undefined,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client,\n {\n blockHash,\n blockNumber,\n blockTag: blockTag_,\n hash,\n index,\n sender,\n nonce,\n }: GetTransactionParameters,\n): Promise> {\n const blockTag = blockTag_ || 'latest'\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let transaction: RpcTransaction | null = null\n if (hash) {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByHash',\n params: [hash],\n },\n { dedupe: true },\n )\n } else if (blockHash) {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByBlockHashAndIndex',\n params: [blockHash, numberToHex(index)],\n },\n { dedupe: true },\n )\n } else if ((blockNumberHex || blockTag) && typeof index === 'number') {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByBlockNumberAndIndex',\n params: [blockNumberHex || blockTag, numberToHex(index)],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n } else if (sender && typeof nonce === 'number') {\n transaction = await client.request(\n {\n method: 'eth_getTransactionBySenderAndNonce',\n params: [sender, numberToHex(nonce)],\n },\n { dedupe: true },\n )\n }\n\n if (!transaction)\n throw new TransactionNotFoundError({\n blockHash,\n blockNumber,\n blockTag,\n hash,\n index,\n })\n\n const format =\n client.chain?.formatters?.transaction?.format || formatTransaction\n return format(transaction, 'getTransaction')\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { FormattedTransactionReceipt } from '../../utils/formatters/transactionReceipt.js'\nimport { getAction } from '../../utils/getAction.js'\n\nimport {\n type GetBlockNumberErrorType,\n getBlockNumber,\n} from './getBlockNumber.js'\nimport {\n type GetTransactionErrorType,\n getTransaction,\n} from './getTransaction.js'\n\nexport type GetTransactionConfirmationsParameters<\n chain extends Chain | undefined = Chain,\n> =\n | {\n /** The transaction hash. */\n hash: Hash\n transactionReceipt?: undefined\n }\n | {\n hash?: undefined\n /** The transaction receipt. */\n transactionReceipt: FormattedTransactionReceipt\n }\n\nexport type GetTransactionConfirmationsReturnType = bigint\n\nexport type GetTransactionConfirmationsErrorType =\n | GetBlockNumberErrorType\n | GetTransactionErrorType\n | ErrorType\n\n/**\n * Returns the number of blocks passed (confirmations) since the transaction was processed on a block.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionConfirmationsParameters}\n * @returns The number of blocks passed since the transaction was processed. If confirmations is 0, then the Transaction has not been confirmed & processed yet. {@link GetTransactionConfirmationsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionConfirmations } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const confirmations = await getTransactionConfirmations(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransactionConfirmations<\n chain extends Chain | undefined,\n>(\n client: Client,\n { hash, transactionReceipt }: GetTransactionConfirmationsParameters,\n): Promise {\n const [blockNumber, transaction] = await Promise.all([\n getAction(client, getBlockNumber, 'getBlockNumber')({}),\n hash\n ? getAction(client, getTransaction, 'getTransaction')({ hash })\n : undefined,\n ])\n const transactionBlockNumber =\n transactionReceipt?.blockNumber || transaction?.blockNumber\n if (!transactionBlockNumber) return 0n\n return blockNumber - transactionBlockNumber! + 1n\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n TransactionReceiptNotFoundError,\n type TransactionReceiptNotFoundErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormattedTransactionReceipt,\n formatTransactionReceipt,\n} from '../../utils/formatters/transactionReceipt.js'\n\nexport type GetTransactionReceiptParameters = {\n /** The hash of the transaction. */\n hash: Hash\n}\n\nexport type GetTransactionReceiptReturnType<\n chain extends Chain | undefined = undefined,\n> = FormattedTransactionReceipt\n\nexport type GetTransactionReceiptErrorType =\n | RequestErrorType\n | TransactionReceiptNotFoundErrorType\n | ErrorType\n\n/**\n * Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactionreceipt)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionReceiptParameters}\n * @returns The transaction receipt. {@link GetTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionReceipt } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await getTransactionReceipt(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransactionReceipt(\n client: Client,\n { hash }: GetTransactionReceiptParameters,\n) {\n const receipt = await client.request(\n {\n method: 'eth_getTransactionReceipt',\n params: [hash],\n },\n { dedupe: true },\n )\n\n if (!receipt) throw new TransactionReceiptNotFoundError({ hash })\n\n const format =\n client.chain?.formatters?.transactionReceipt?.format ||\n formatTransactionReceipt\n return format(\n receipt,\n 'getTransactionReceipt',\n ) as GetTransactionReceiptReturnType\n}\n","import type { AbiStateMutability, Address, Narrow } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { multicall3Abi } from '../../constants/abis.js'\nimport { multicall3Bytecode } from '../../constants/contracts.js'\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport { BaseError } from '../../errors/base.js'\nimport { RawContractError } from '../../errors/contract.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ContractFunctionParameters } from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n MulticallContracts,\n MulticallResults,\n} from '../../types/multicall.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { CallParameters } from './call.js'\nimport { type ReadContractErrorType, readContract } from './readContract.js'\n\nexport type MulticallParameters<\n contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n allowFailure extends boolean = true,\n options extends {\n optional?: boolean\n properties?: Record\n } = {},\n> = Pick<\n CallParameters,\n | 'authorizationList'\n | 'blockNumber'\n | 'blockOverrides'\n | 'blockTag'\n | 'stateOverride'\n> & {\n /** The account to use for the multicall. */\n account?: Address | undefined\n /** Whether to allow failures. */\n allowFailure?: allowFailure | boolean | undefined\n /** The size of each batch of calls. */\n batchSize?: number | undefined\n /** Enable deployless multicall. */\n deployless?: boolean | undefined\n /** The contracts to call. */\n contracts: MulticallContracts<\n Narrow,\n { mutability: AbiStateMutability } & options\n >\n /** The address of the multicall3 contract to use. */\n multicallAddress?: Address | undefined\n}\n\nexport type MulticallReturnType<\n contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n allowFailure extends boolean = true,\n options extends {\n error?: Error\n } = { error: Error },\n> = MulticallResults<\n Narrow,\n allowFailure,\n { mutability: AbiStateMutability } & options\n>\n\nexport type MulticallErrorType =\n | GetChainContractAddressErrorType\n | ReadContractErrorType\n | GetContractErrorReturnType<\n EncodeFunctionDataErrorType | DecodeFunctionResultErrorType\n >\n | ErrorType\n\n/**\n * Similar to [`readContract`](https://viem.sh/docs/contract/readContract), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall).\n *\n * - Docs: https://viem.sh/docs/contract/multicall\n *\n * @param client - Client to use\n * @param parameters - {@link MulticallParameters}\n * @returns An array of results with accompanying status. {@link MulticallReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { multicall } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const abi = parseAbi([\n * 'function balanceOf(address) view returns (uint256)',\n * 'function totalSupply() view returns (uint256)',\n * ])\n * const results = await multicall(client, {\n * contracts: [\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * },\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'totalSupply',\n * },\n * ],\n * })\n * // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }]\n */\nexport async function multicall<\n const contracts extends readonly unknown[],\n chain extends Chain | undefined,\n allowFailure extends boolean = true,\n>(\n client: Client,\n parameters: MulticallParameters,\n): Promise> {\n const {\n account,\n authorizationList,\n allowFailure = true,\n blockNumber,\n blockOverrides,\n blockTag,\n stateOverride,\n } = parameters\n const contracts = parameters.contracts as ContractFunctionParameters[]\n\n const {\n batchSize = parameters.batchSize ?? 1024,\n deployless = parameters.deployless ?? false,\n } = typeof client.batch?.multicall === 'object' ? client.batch.multicall : {}\n\n const multicallAddress = (() => {\n if (parameters.multicallAddress) return parameters.multicallAddress\n if (deployless) return null\n if (client.chain) {\n return getChainContractAddress({\n blockNumber,\n chain: client.chain,\n contract: 'multicall3',\n })\n }\n throw new Error(\n 'client chain not configured. multicallAddress is required.',\n )\n })()\n\n type Aggregate3Calls = {\n allowFailure: boolean\n callData: Hex\n target: Address\n }[]\n\n const chunkedCalls: Aggregate3Calls[] = [[]]\n let currentChunk = 0\n let currentChunkSize = 0\n for (let i = 0; i < contracts.length; i++) {\n const { abi, address, args, functionName } = contracts[i]\n try {\n const callData = encodeFunctionData({ abi, args, functionName })\n\n currentChunkSize += (callData.length - 2) / 2\n // Check to see if we need to create a new chunk.\n if (\n // Check if batching is enabled.\n batchSize > 0 &&\n // Check if the current size of the batch exceeds the size limit.\n currentChunkSize > batchSize &&\n // Check if the current chunk is not already empty.\n chunkedCalls[currentChunk].length > 0\n ) {\n currentChunk++\n currentChunkSize = (callData.length - 2) / 2\n chunkedCalls[currentChunk] = []\n }\n\n chunkedCalls[currentChunk] = [\n ...chunkedCalls[currentChunk],\n {\n allowFailure: true,\n callData,\n target: address,\n },\n ]\n } catch (err) {\n const error = getContractError(err as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/multicall',\n functionName,\n sender: account,\n })\n if (!allowFailure) throw error\n chunkedCalls[currentChunk] = [\n ...chunkedCalls[currentChunk],\n {\n allowFailure: true,\n callData: '0x' as Hex,\n target: address,\n },\n ]\n }\n }\n\n const aggregate3Results = await Promise.allSettled(\n chunkedCalls.map((calls) =>\n getAction(\n client,\n readContract,\n 'readContract',\n )({\n ...(multicallAddress === null\n ? { code: multicall3Bytecode }\n : { address: multicallAddress }),\n abi: multicall3Abi,\n account,\n args: [calls],\n authorizationList,\n blockNumber,\n blockOverrides,\n blockTag,\n functionName: 'aggregate3',\n stateOverride,\n }),\n ),\n )\n\n const results = []\n for (let i = 0; i < aggregate3Results.length; i++) {\n const result = aggregate3Results[i]\n\n // If an error occurred in a `readContract` invocation (ie. network error),\n // then append the failure reason to each contract result.\n if (result.status === 'rejected') {\n if (!allowFailure) throw result.reason\n for (let j = 0; j < chunkedCalls[i].length; j++) {\n results.push({\n status: 'failure',\n error: result.reason,\n result: undefined,\n })\n }\n continue\n }\n\n // If the `readContract` call was successful, then decode the results.\n const aggregate3Result = result.value\n for (let j = 0; j < aggregate3Result.length; j++) {\n // Extract the response from `readContract`\n const { returnData, success } = aggregate3Result[j]\n\n // Extract the request call data from the original call.\n const { callData } = chunkedCalls[i][j]\n\n // Extract the contract config for this call from the `contracts` argument\n // for decoding.\n const { abi, address, functionName, args } = contracts[\n results.length\n ] as ContractFunctionParameters\n\n try {\n if (callData === '0x') throw new AbiDecodingZeroDataError()\n if (!success) throw new RawContractError({ data: returnData })\n const result = decodeFunctionResult({\n abi,\n args,\n data: returnData,\n functionName,\n })\n results.push(allowFailure ? { result, status: 'success' } : result)\n } catch (err) {\n const error = getContractError(err as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/multicall',\n functionName,\n })\n if (!allowFailure) throw error\n results.push({ error, result: undefined, status: 'failure' })\n }\n }\n }\n\n if (results.length !== contracts.length)\n throw new BaseError('multicall results mismatch')\n return results as MulticallReturnType\n}\n","import type { Abi, AbiStateMutability, Address, Narrow } from 'abitype'\nimport * as BlockOverrides from 'ox/BlockOverrides'\n\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { RawContractError } from '../../errors/contract.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block, BlockTag } from '../../types/block.js'\nimport type { Call, Calls } from '../../types/calls.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { MulticallResults } from '../../types/multicall.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial, UnionOmit } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport { concat } from '../../utils/data/concat.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { getContractError } from '../../utils/errors/getContractError.js'\nimport {\n type GetNodeErrorReturnType,\n getNodeError,\n} from '../../utils/errors/getNodeError.js'\nimport {\n type FormatBlockErrorType,\n formatBlock,\n} from '../../utils/formatters/block.js'\nimport { formatLog } from '../../utils/formatters/log.js'\nimport {\n type FormatTransactionRequestErrorType,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport {\n type SerializeStateOverrideErrorType,\n serializeStateOverride,\n} from '../../utils/stateOverride.js'\nimport {\n type AssertRequestErrorType,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\n\ntype CallExtraProperties = ExactPartial<\n UnionOmit<\n TransactionRequest,\n 'blobs' | 'data' | 'kzg' | 'to' | 'sidecars' | 'value'\n >\n> & {\n /** Account attached to the call (msg.sender). */\n account?: Account | Address | undefined\n /** Recipient. `null` if contract deployment. */\n to?: Address | null | undefined\n}\n\nexport type SimulateBlocksParameters<\n calls extends readonly unknown[] = readonly unknown[],\n> = {\n /** Blocks to simulate. */\n blocks: readonly {\n /** Block overrides. */\n blockOverrides?: BlockOverrides.BlockOverrides | undefined\n /** Calls to execute. */\n calls: Calls, CallExtraProperties>\n /** State overrides. */\n stateOverrides?: StateOverride | undefined\n }[]\n /** Whether to return the full transactions. */\n returnFullTransactions?: boolean | undefined\n /** Whether to trace transfers. */\n traceTransfers?: boolean | undefined\n /** Whether to enable validation mode. */\n validation?: boolean | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n)\n\nexport type SimulateBlocksReturnType<\n calls extends readonly unknown[] = readonly unknown[],\n> = readonly (Block & {\n calls: MulticallResults<\n Narrow,\n true,\n {\n extraProperties: {\n data: Hex\n gasUsed: bigint\n logs?: Log[] | undefined\n }\n error: Error\n mutability: AbiStateMutability\n }\n >\n})[]\n\nexport type SimulateBlocksErrorType =\n | AssertRequestErrorType\n | DecodeFunctionResultErrorType\n | EncodeFunctionDataErrorType\n | FormatBlockErrorType\n | FormatTransactionRequestErrorType\n | GetNodeErrorReturnType\n | ParseAccountErrorType\n | SerializeStateOverrideErrorType\n | NumberToHexErrorType\n | ErrorType\n\n/**\n * Simulates a set of calls on block(s) with optional block and state overrides.\n *\n * @example\n * ```ts\n * import { createClient, http, parseEther } from 'viem'\n * import { simulate } from 'viem/actions'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await simulate(client, {\n * blocks: [{\n * blockOverrides: {\n * number: 69420n,\n * },\n * calls: [{\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * }],\n * stateOverrides: [{\n * address: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * balance: parseEther('10'),\n * }],\n * }]\n * })\n * ```\n *\n * @param client - Client to use.\n * @param parameters - {@link SimulateBlocksParameters}\n * @returns Simulated blocks. {@link SimulateBlocksReturnType}\n */\nexport async function simulateBlocks<\n chain extends Chain | undefined,\n const calls extends readonly unknown[],\n>(\n client: Client,\n parameters: SimulateBlocksParameters,\n): Promise> {\n const {\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n blocks,\n returnFullTransactions,\n traceTransfers,\n validation,\n } = parameters\n\n try {\n const blockStateCalls = []\n for (const block of blocks) {\n const blockOverrides = block.blockOverrides\n ? BlockOverrides.toRpc(block.blockOverrides)\n : undefined\n const calls = block.calls.map((call_) => {\n const call = call_ as Call\n const account = call.account ? parseAccount(call.account) : undefined\n const data = call.abi ? encodeFunctionData(call) : call.data\n const request = {\n ...call,\n account,\n data: call.dataSuffix\n ? concat([data || '0x', call.dataSuffix])\n : data,\n from: call.from ?? account?.address,\n } as const\n assertRequest(request)\n return formatTransactionRequest(request)\n })\n const stateOverrides = block.stateOverrides\n ? serializeStateOverride(block.stateOverrides)\n : undefined\n\n blockStateCalls.push({\n blockOverrides,\n calls,\n stateOverrides,\n })\n }\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const result = await client.request({\n method: 'eth_simulateV1',\n params: [\n { blockStateCalls, returnFullTransactions, traceTransfers, validation },\n block,\n ],\n })\n\n return result.map((block, i) => ({\n ...formatBlock(block),\n calls: block.calls.map((call, j) => {\n const { abi, args, functionName, to } = blocks[i].calls[j] as Call<\n unknown,\n CallExtraProperties\n >\n\n const data = call.error?.data ?? call.returnData\n const gasUsed = BigInt(call.gasUsed)\n const logs = call.logs?.map((log) => formatLog(log))\n const status = call.status === '0x1' ? 'success' : 'failure'\n\n const result =\n abi && status === 'success' && data !== '0x'\n ? decodeFunctionResult({\n abi,\n data,\n functionName,\n })\n : null\n\n const error = (() => {\n if (status === 'success') return undefined\n\n let error: Error | undefined\n if (data === '0x') error = new AbiDecodingZeroDataError()\n else if (data) error = new RawContractError({ data })\n\n if (!error) return undefined\n return getContractError(error, {\n abi: (abi ?? []) as Abi,\n address: to ?? '0x',\n args,\n functionName: functionName ?? '',\n })\n })()\n\n return {\n data,\n gasUsed,\n logs,\n status,\n ...(status === 'success'\n ? {\n result,\n }\n : {\n error,\n }),\n }\n }),\n })) as unknown as SimulateBlocksReturnType\n } catch (e) {\n const cause = e as BaseError\n const error = getNodeError(cause, {})\n if (error instanceof UnknownNodeError) throw cause\n throw error\n }\n}\n","import * as abitype from 'abitype'\nimport type * as Abi from './Abi.js'\nimport * as Errors from './Errors.js'\nimport * as Hash from './Hash.js'\nimport * as Hex from './Hex.js'\nimport * as internal from './internal/abiItem.js'\nimport type { UnionCompute } from './internal/types.js'\n\n/** Root type for an item on an {@link ox#Abi.Abi}. */\nexport type AbiItem = Abi.Abi[number]\n\n/**\n * Extracts an {@link ox#AbiItem.AbiItem} item from an {@link ox#Abi.Abi}, given a name.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'error Foo(string)',\n * 'function foo(string)',\n * 'event Bar(uint256)',\n * ])\n *\n * type Foo = AbiItem.FromAbi\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n */\nexport type FromAbi<\n abi extends Abi.Abi,\n name extends ExtractNames,\n> = Extract\n\n/**\n * Extracts the names of all {@link ox#AbiItem.AbiItem} items in an {@link ox#Abi.Abi}.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'error Foo(string)',\n * 'function foo(string)',\n * 'event Bar(uint256)',\n * ])\n *\n * type names = AbiItem.Name\n * // ^?\n *\n * ```\n */\nexport type Name =\n abi extends Abi.Abi ? ExtractNames : string\n\nexport type ExtractNames = Extract<\n abi[number],\n { name: string }\n>['name']\n\n/**\n * Formats an {@link ox#AbiItem.AbiItem} into a **Human Readable ABI Item**.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const formatted = AbiItem.format({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param abiItem - The ABI Item to format.\n * @returns The formatted ABI Item .\n */\nexport function format(\n abiItem: abiItem | AbiItem,\n): abitype.FormatAbiItem {\n return abitype.formatAbiItem(abiItem) as never\n}\n\nexport declare namespace format {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses an arbitrary **JSON ABI Item** or **Human Readable ABI Item** into a typed {@link ox#AbiItem.AbiItem}.\n *\n * @example\n * ### JSON ABIs\n *\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const abiItem = AbiItem.from({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * abiItem\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable ABIs\n *\n * A Human Readable ABI can be parsed into a typed ABI object:\n *\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const abiItem = AbiItem.from(\n * 'function approve(address spender, uint256 amount) returns (bool)' // [!code hl]\n * )\n *\n * abiItem\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const abiItem = AbiItem.from([\n * 'struct Foo { address spender; uint256 amount; }', // [!code hl]\n * 'function approve(Foo foo) returns (bool)',\n * ])\n *\n * abiItem\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param abiItem - The ABI Item to parse.\n * @returns The typed ABI Item.\n */\nexport function from<\n const abiItem extends AbiItem | string | readonly string[],\n>(\n abiItem: (abiItem | AbiItem | string | readonly string[]) &\n (\n | (abiItem extends string ? internal.Signature : never)\n | (abiItem extends readonly string[]\n ? internal.Signatures\n : never)\n | AbiItem\n ),\n options: from.Options = {},\n): from.ReturnType {\n const { prepare = true } = options\n const item = (() => {\n if (Array.isArray(abiItem)) return abitype.parseAbiItem(abiItem)\n if (typeof abiItem === 'string')\n return abitype.parseAbiItem(abiItem as never)\n return abiItem\n })() as AbiItem\n return {\n ...item,\n ...(prepare ? { hash: getSignatureHash(item) } : {}),\n } as never\n}\n\nexport declare namespace from {\n type Options = {\n /**\n * Whether or not to prepare the extracted item (optimization for encoding performance).\n * When `true`, the `hash` property is computed and included in the returned value.\n *\n * @default true\n */\n prepare?: boolean | undefined\n }\n\n type ReturnType =\n abiItem extends string\n ? abitype.ParseAbiItem\n : abiItem extends readonly string[]\n ? abitype.ParseAbiItem\n : abiItem\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Extracts an {@link ox#AbiItem.AbiItem} from an {@link ox#Abi.Abi} given a name and optional arguments.\n *\n * @example\n * ABI Items can be extracted by their name using the `name` option:\n *\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n *\n * const item = AbiItem.fromAbi(abi, 'Transfer') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Extracting by Selector\n *\n * ABI Items can be extract by their selector when {@link ox#Hex.Hex} is provided to `name`.\n *\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n * const item = AbiItem.fromAbi(abi, '0x095ea7b3') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * :::note\n *\n * Extracting via a hex selector is useful when extracting an ABI Item from an `eth_call` RPC response,\n * a Transaction `input`, or from Event Log `topics`.\n *\n * :::\n *\n * @param abi - The ABI to extract from.\n * @param name - The name (or selector) of the ABI item to extract.\n * @param options - Extraction options.\n * @returns The ABI item.\n */\nexport function fromAbi<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends internal.ExtractArgs | undefined = undefined,\n //\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n options?: fromAbi.Options,\n): fromAbi.ReturnType {\n const { args = [], prepare = true } = (options ??\n {}) as unknown as fromAbi.Options\n\n const isSelector = Hex.validate(name, { strict: false })\n const abiItems = (abi as Abi.Abi).filter((abiItem) => {\n if (isSelector) {\n if (abiItem.type === 'function' || abiItem.type === 'error')\n return getSelector(abiItem) === Hex.slice(name, 0, 4)\n if (abiItem.type === 'event') return getSignatureHash(abiItem) === name\n return false\n }\n return 'name' in abiItem && abiItem.name === name\n })\n\n if (abiItems.length === 0) throw new NotFoundError({ name: name as string })\n if (abiItems.length === 1)\n return {\n ...abiItems[0],\n ...(prepare ? { hash: getSignatureHash(abiItems[0]!) } : {}),\n } as never\n\n let matchedAbiItem: AbiItem | undefined\n for (const abiItem of abiItems) {\n if (!('inputs' in abiItem)) continue\n if (!args || args.length === 0) {\n if (!abiItem.inputs || abiItem.inputs.length === 0)\n return {\n ...abiItem,\n ...(prepare ? { hash: getSignatureHash(abiItem) } : {}),\n } as never\n continue\n }\n if (!abiItem.inputs) continue\n if (abiItem.inputs.length === 0) continue\n if (abiItem.inputs.length !== args.length) continue\n const matched = args.every((arg, index) => {\n const abiParameter = 'inputs' in abiItem && abiItem.inputs![index]\n if (!abiParameter) return false\n return internal.isArgOfType(arg, abiParameter)\n })\n if (matched) {\n // Check for ambiguity against already matched parameters (e.g. `address` vs `bytes20`).\n if (\n matchedAbiItem &&\n 'inputs' in matchedAbiItem &&\n matchedAbiItem.inputs\n ) {\n const ambiguousTypes = internal.getAmbiguousTypes(\n abiItem.inputs,\n matchedAbiItem.inputs,\n args as readonly unknown[],\n )\n if (ambiguousTypes)\n throw new AmbiguityError(\n {\n abiItem,\n type: ambiguousTypes[0]!,\n },\n {\n abiItem: matchedAbiItem,\n type: ambiguousTypes[1]!,\n },\n )\n }\n\n matchedAbiItem = abiItem\n }\n }\n\n const abiItem = (() => {\n if (matchedAbiItem) return matchedAbiItem\n const [abiItem, ...overloads] = abiItems\n return { ...abiItem!, overloads }\n })()\n\n if (!abiItem) throw new NotFoundError({ name: name as string })\n return {\n ...abiItem,\n ...(prepare ? { hash: getSignatureHash(abiItem) } : {}),\n } as never\n}\n\nexport declare namespace fromAbi {\n type Options<\n abi extends Abi.Abi | readonly unknown[] = Abi.Abi,\n name extends Name = Name,\n args extends\n | internal.ExtractArgs\n | undefined = internal.ExtractArgs,\n ///\n allArgs = internal.ExtractArgs,\n > = {\n /**\n * Whether or not to prepare the extracted item (optimization for encoding performance).\n * When `true`, the `hash` property is computed and included in the returned value.\n *\n * @default true\n */\n prepare?: boolean | undefined\n } & UnionCompute<\n readonly [] extends allArgs\n ? {\n args?:\n | allArgs // show all options\n // infer value, widen inferred value of `args` conditionally to match `allArgs`\n | (abi extends Abi.Abi\n ? args extends allArgs\n ? internal.Widen\n : never\n : never)\n | undefined\n }\n : {\n args?:\n | allArgs // show all options\n | (internal.Widen & (args extends allArgs ? unknown : never)) // infer value, widen inferred value of `args` match `allArgs` (e.g. avoid union `args: readonly [123n] | readonly [bigint]`)\n | undefined\n }\n >\n\n type ReturnType<\n abi extends Abi.Abi | readonly unknown[] = Abi.Abi,\n name extends Name = Name,\n args extends\n | internal.ExtractArgs\n | undefined = internal.ExtractArgs,\n fallback = AbiItem,\n > = abi extends Abi.Abi\n ? Abi.Abi extends abi\n ? fallback\n : internal.ExtractForArgs<\n abi,\n name,\n args extends internal.ExtractArgs\n ? args\n : internal.ExtractArgs\n >\n : fallback\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Computes the [4-byte selector](https://solidity-by-example.org/function-selector/) for an {@link ox#AbiItem.AbiItem}.\n *\n * Useful for computing function selectors for calldata.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const selector = AbiItem.getSelector('function ownerOf(uint256 tokenId)')\n * // @log: '0x6352211e'\n * ```\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiItem } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const selector = AbiItem.getSelector(erc20Abi, 'ownerOf')\n * // @log: '0x6352211e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const selector = AbiItem.getSelector({\n * inputs: [{ type: 'uint256' }],\n * name: 'ownerOf',\n * outputs: [],\n * stateMutability: 'view',\n * type: 'function'\n * })\n * // @log: '0x6352211e'\n * ```\n *\n * @param abiItem - The ABI item to compute the selector for. Can be a signature or an ABI item for an error, event, function, etc.\n * @returns The first 4 bytes of the {@link ox#Hash.(keccak256:function)} hash of the function signature.\n */\nexport function getSelector<\n abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n>(abi: abi | Abi.Abi | readonly unknown[], name: name): Hex.Hex\nexport function getSelector(abiItem: string | AbiItem): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function getSelector(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: string]\n | [string | AbiItem]\n): Hex.Hex {\n const abiItem = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name] = parameters as [Abi.Abi | readonly unknown[], string]\n return fromAbi(abi, name)\n }\n return parameters[0] as string | AbiItem\n })()\n return Hex.slice(getSignatureHash(abiItem), 0, 4)\n}\n\nexport declare namespace getSelector {\n type ErrorType =\n | getSignatureHash.ErrorType\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes the stringified signature for a given {@link ox#AbiItem.AbiItem}.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const signature = AbiItem.getSignature('function ownerOf(uint256 tokenId)')\n * // @log: 'ownerOf(uint256)'\n * ```\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiItem } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const signature = AbiItem.getSignature(erc20Abi, 'ownerOf')\n * // @log: 'ownerOf(uint256)'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const signature = AbiItem.getSignature({\n * name: 'ownerOf',\n * type: 'function',\n * inputs: [{ name: 'tokenId', type: 'uint256' }],\n * outputs: [],\n * stateMutability: 'view',\n * })\n * // @log: 'ownerOf(uint256)'\n * ```\n *\n * @param abiItem - The ABI Item to compute the signature for.\n * @returns The stringified signature of the ABI Item.\n */\nexport function getSignature<\n abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n>(abi: abi | Abi.Abi | readonly unknown[], name: name): string\nexport function getSignature(abiItem: string | AbiItem): string\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function getSignature(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: string]\n | [string | AbiItem]\n): string {\n const abiItem = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name] = parameters as [Abi.Abi | readonly unknown[], string]\n return fromAbi(abi, name)\n }\n return parameters[0] as string | AbiItem\n })()\n const signature = (() => {\n if (typeof abiItem === 'string') return abiItem\n return abitype.formatAbiItem(abiItem)\n })()\n return internal.normalizeSignature(signature)\n}\n\nexport declare namespace getSignature {\n type ErrorType =\n | internal.normalizeSignature.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes the signature hash for an {@link ox#AbiItem.AbiItem}.\n *\n * Useful for computing Event Topic values.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const hash = AbiItem.getSignatureHash('event Transfer(address indexed from, address indexed to, uint256 amount)')\n * // @log: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n * ```\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiItem } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const hash = AbiItem.getSignatureHash(erc20Abi, 'Transfer')\n * // @log: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const hash = AbiItem.getSignatureHash({\n * name: 'Transfer',\n * type: 'event',\n * inputs: [\n * { name: 'from', type: 'address', indexed: true },\n * { name: 'to', type: 'address', indexed: true },\n * { name: 'amount', type: 'uint256', indexed: false },\n * ],\n * })\n * // @log: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n * ```\n *\n * @param abiItem - The ABI Item to compute the signature hash for.\n * @returns The {@link ox#Hash.(keccak256:function)} hash of the ABI item's signature.\n */\nexport function getSignatureHash<\n abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n>(abi: abi | Abi.Abi | readonly unknown[], name: name): Hex.Hex\nexport function getSignatureHash(abiItem: string | AbiItem): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function getSignatureHash(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: string]\n | [string | AbiItem]\n): Hex.Hex {\n const abiItem = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name] = parameters as [Abi.Abi | readonly unknown[], string]\n return fromAbi(abi, name)\n }\n return parameters[0] as string | AbiItem\n })()\n if (typeof abiItem !== 'string' && 'hash' in abiItem && abiItem.hash)\n return abiItem.hash as Hex.Hex\n return Hash.keccak256(Hex.fromString(getSignature(abiItem)))\n}\n\nexport declare namespace getSignatureHash {\n type ErrorType =\n | getSignature.ErrorType\n | Hash.keccak256.ErrorType\n | Hex.fromString.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Throws when ambiguous types are found on overloaded ABI items.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from(['function foo(address)', 'function foo(bytes20)'])\n * AbiFunction.fromAbi(foo, 'foo', {\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // @error: AbiItem.AmbiguityError: Found ambiguous types in overloaded ABI Items.\n * // @error: `bytes20` in `foo(bytes20)`, and\n * // @error: `address` in `foo(address)`\n * // @error: These types encode differently and cannot be distinguished at runtime.\n * // @error: Remove one of the ambiguous items in the ABI.\n * ```\n *\n * ### Solution\n *\n * Remove one of the ambiguous types from the ABI.\n *\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function foo(bytes20)' // [!code --]\n * ])\n * AbiFunction.fromAbi(foo, 'foo', {\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // @error: AbiItem.AmbiguityError: Found ambiguous types in overloaded ABI Items.\n * // @error: `bytes20` in `foo(bytes20)`, and\n * // @error: `address` in `foo(address)`\n * // @error: These types encode differently and cannot be distinguished at runtime.\n * // @error: Remove one of the ambiguous items in the ABI.\n * ```\n */\nexport class AmbiguityError extends Errors.BaseError {\n override readonly name = 'AbiItem.AmbiguityError'\n constructor(\n x: { abiItem: Abi.Abi[number]; type: string },\n y: { abiItem: Abi.Abi[number]; type: string },\n ) {\n super('Found ambiguous types in overloaded ABI Items.', {\n metaMessages: [\n // TODO: abitype to add support for signature-formatted ABI items.\n `\\`${x.type}\\` in \\`${internal.normalizeSignature(abitype.formatAbiItem(x.abiItem))}\\`, and`,\n `\\`${y.type}\\` in \\`${internal.normalizeSignature(abitype.formatAbiItem(y.abiItem))}\\``,\n '',\n 'These types encode differently and cannot be distinguished at runtime.',\n 'Remove one of the ambiguous items in the ABI.',\n ],\n })\n }\n}\n\n/**\n * Throws when an ABI item is not found in the ABI.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)'\n * ])\n * AbiFunction.fromAbi(foo, 'baz')\n * // @error: AbiItem.NotFoundError: ABI function with name \"baz\" not found.\n * ```\n *\n * ### Solution\n *\n * Ensure the ABI item exists on the ABI.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)',\n * 'function baz(bool)' // [!code ++]\n * ])\n * AbiFunction.fromAbi(foo, 'baz')\n * ```\n */\nexport class NotFoundError extends Errors.BaseError {\n override readonly name = 'AbiItem.NotFoundError'\n constructor({\n name,\n data,\n type = 'item',\n }: {\n name?: string | undefined\n data?: Hex.Hex | undefined\n type?: string | undefined\n }) {\n const selector = (() => {\n if (name) return ` with name \"${name}\"`\n if (data) return ` with data \"${data}\"`\n return ''\n })()\n super(`ABI ${type}${selector} not found.`)\n }\n}\n\n/**\n * Throws when the selector size is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)'\n * ])\n * AbiFunction.fromAbi(foo, '0xaaa')\n * // @error: AbiItem.InvalidSelectorSizeError: Selector size is invalid. Expected 4 bytes. Received 2 bytes (\"0xaaa\").\n * ```\n *\n * ### Solution\n *\n * Ensure the selector size is 4 bytes.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)'\n * ])\n * AbiFunction.fromAbi(foo, '0x7af82b1a')\n * ```\n */\nexport class InvalidSelectorSizeError extends Errors.BaseError {\n override readonly name = 'AbiItem.InvalidSelectorSizeError'\n constructor({ data }: { data: Hex.Hex }) {\n super(\n `Selector size is invalid. Expected 4 bytes. Received ${Hex.size(data)} bytes (\"${data}\").`,\n )\n }\n}\n","import type * as abitype from 'abitype'\nimport type * as Abi from '../Abi.js'\nimport type * as AbiItem from '../AbiItem.js'\nimport type * as AbiParameters from '../AbiParameters.js'\nimport * as Address from '../Address.js'\nimport * as Errors from '../Errors.js'\nimport type {\n Compute,\n IsNever,\n IsUnion,\n TypeErrorMessage,\n UnionToTuple,\n} from './types.js'\n\n/** @internal */\nexport type ExtractArgs<\n abi extends Abi.Abi | readonly unknown[] = Abi.Abi,\n name extends AbiItem.Name = AbiItem.Name,\n> = abitype.AbiParametersToPrimitiveTypes<\n AbiItem.FromAbi['inputs'],\n 'inputs'\n> extends infer args\n ? [args] extends [never]\n ? readonly unknown[]\n : args\n : readonly unknown[]\n\n/** @internal */\nexport type ExtractForArgs<\n abi extends Abi.Abi,\n name extends AbiItem.Name,\n args extends ExtractArgs,\n> = IsUnion extends true\n ? {\n [key in keyof abi]: abi[key] extends { name: name } ? abi[key] : never\n }[number]\n : AbiItem.FromAbi extends infer abiItem extends AbiItem.AbiItem & {\n inputs: readonly abitype.AbiParameter[]\n }\n ? IsUnion extends true // narrow overloads using `args` by converting to tuple and filtering out overloads that don't match\n ? UnionToTuple extends infer abiItems extends\n readonly (AbiItem.AbiItem & {\n inputs: readonly abitype.AbiParameter[]\n })[]\n ? IsNever> extends true\n ? Compute<\n abiItems[0] & {\n readonly overloads: UnionToTuple<\n Exclude\n >\n }\n >\n : TupleToUnion // convert back to union (removes `never` tuple entries: `['foo', never, 'bar'][number]` => `'foo' | 'bar'`)\n : never\n : abiItem\n : never\n\n/** @internal */\nexport type TupleToUnion<\n abiItems extends readonly {\n inputs: readonly abitype.AbiParameter[]\n }[],\n abi extends Abi.Abi,\n name extends AbiItem.Name,\n args extends ExtractArgs,\n> = {\n [k in keyof abiItems]: (\n readonly [] extends args\n ? readonly [] // fallback to `readonly []` if `args` has no value (e.g. `args` property not provided)\n : args\n ) extends abitype.AbiParametersToPrimitiveTypes<\n abiItems[k]['inputs'],\n 'inputs'\n >\n ? abiItems[k]\n : never\n}[number]\n\n/** @internal */\nexport type ErrorSignature<\n name extends string = string,\n parameters extends string = string,\n> = `error ${name}(${parameters})`\n\n/** @internal */\nexport type IsErrorSignature =\n signature extends ErrorSignature ? IsName : false\n\n/** @internal */\nexport type EventSignature<\n name extends string = string,\n parameters extends string = string,\n> = `event ${name}(${parameters})`\n\n/** @internal */\nexport type IsEventSignature =\n signature extends EventSignature ? IsName : false\n\n/** @internal */\nexport type FunctionSignature<\n name extends string = string,\n tail extends string = string,\n> = `function ${name}(${tail}`\nexport type IsFunctionSignature =\n signature extends FunctionSignature\n ? IsName extends true\n ? signature extends ValidFunctionSignatures\n ? true\n : // Check that `Parameters` is not absorbing other types (e.g. `returns`)\n signature extends `function ${string}(${infer parameters})`\n ? parameters extends InvalidFunctionParameters\n ? false\n : true\n : false\n : false\n : false\n/** @internal */\nexport type Scope = 'public' | 'external' // `internal` or `private` functions wouldn't make it to ABI so can ignore\n\n/** @internal */\nexport type Returns = `returns (${string})` | `returns(${string})`\n\n// Almost all valid function signatures, except `function ${string}(${infer parameters})` since `parameters` can absorb returns\n/** @internal */\nexport type ValidFunctionSignatures =\n | `function ${string}()`\n // basic\n | `function ${string}() ${Returns}`\n | `function ${string}() ${abitype.AbiStateMutability}`\n | `function ${string}() ${Scope}`\n // combinations\n | `function ${string}() ${abitype.AbiStateMutability} ${Returns}`\n | `function ${string}() ${Scope} ${Returns}`\n | `function ${string}() ${Scope} ${abitype.AbiStateMutability}`\n | `function ${string}() ${Scope} ${abitype.AbiStateMutability} ${Returns}`\n // Parameters\n | `function ${string}(${string}) ${Returns}`\n | `function ${string}(${string}) ${abitype.AbiStateMutability}`\n | `function ${string}(${string}) ${Scope}`\n | `function ${string}(${string}) ${abitype.AbiStateMutability} ${Returns}`\n | `function ${string}(${string}) ${Scope} ${Returns}`\n | `function ${string}(${string}) ${Scope} ${abitype.AbiStateMutability}`\n | `function ${string}(${string}) ${Scope} ${abitype.AbiStateMutability} ${Returns}`\n\n/** @internal */\nexport type StructSignature<\n name extends string = string,\n properties extends string = string,\n> = `struct ${name} {${properties}}`\n\n/** @internal */\nexport type IsStructSignature =\n signature extends StructSignature ? IsName : false\n\n/** @internal */\nexport type ConstructorSignature =\n `constructor(${tail}`\n\n/** @internal */\nexport type IsConstructorSignature =\n signature extends ConstructorSignature\n ? signature extends ValidConstructorSignatures\n ? true\n : false\n : false\n\n/** @internal */\nexport type ValidConstructorSignatures =\n | `constructor(${string})`\n | `constructor(${string}) payable`\n\n/** @internal */\nexport type FallbackSignature =\n `fallback() external${abiStateMutability}`\n\n/** @internal */\nexport type ReceiveSignature = 'receive() external payable'\n\n// TODO: Maybe use this for signature validation one day\n// https://twitter.com/devanshj__/status/1610423724708343808\n/** @internal */\nexport type IsSignature =\n | (IsErrorSignature extends true ? true : never)\n | (IsEventSignature extends true ? true : never)\n | (IsFunctionSignature extends true ? true : never)\n | (IsStructSignature extends true ? true : never)\n | (IsConstructorSignature extends true ? true : never)\n | (type extends FallbackSignature ? true : never)\n | (type extends ReceiveSignature ? true : never) extends infer condition\n ? [condition] extends [never]\n ? false\n : true\n : false\n\n/** @internal */\nexport type Signature<\n string1 extends string,\n string2 extends string | unknown = unknown,\n> = IsSignature extends true\n ? string1\n : string extends string1 // if exactly `string` (not narrowed), then pass through as valid\n ? string1\n : TypeErrorMessage<`Signature \"${string1}\" is invalid${string2 extends string\n ? ` at position ${string2}`\n : ''}.`>\n\n/** @internal */\nexport type Signatures = {\n [key in keyof signatures]: Signature\n}\n\n/** @internal */\nexport type IsName = name extends ''\n ? false\n : ValidateName extends name\n ? true\n : false\n\n/** @internal */\nexport type ValidateName<\n name extends string,\n checkCharacters extends boolean = false,\n> = name extends `${string}${' '}${string}`\n ? TypeErrorMessage<`Identifier \"${name}\" cannot contain whitespace.`>\n : IsSolidityKeyword extends true\n ? TypeErrorMessage<`\"${name}\" is a protected Solidity keyword.`>\n : name extends `${number}`\n ? TypeErrorMessage<`Identifier \"${name}\" cannot be a number string.`>\n : name extends `${number}${string}`\n ? TypeErrorMessage<`Identifier \"${name}\" cannot start with a number.`>\n : checkCharacters extends true\n ? IsValidCharacter extends true\n ? name\n : TypeErrorMessage<`\"${name}\" contains invalid character.`>\n : name\n\n/** @internal */\nexport type IsSolidityKeyword =\n type extends SolidityKeywords ? true : false\n\n/** @internal */\nexport type SolidityKeywords =\n | 'after'\n | 'alias'\n | 'anonymous'\n | 'apply'\n | 'auto'\n | 'byte'\n | 'calldata'\n | 'case'\n | 'catch'\n | 'constant'\n | 'copyof'\n | 'default'\n | 'defined'\n | 'error'\n | 'event'\n | 'external'\n | 'false'\n | 'final'\n | 'function'\n | 'immutable'\n | 'implements'\n | 'in'\n | 'indexed'\n | 'inline'\n | 'internal'\n | 'let'\n | 'mapping'\n | 'match'\n | 'memory'\n | 'mutable'\n | 'null'\n | 'of'\n | 'override'\n | 'partial'\n | 'private'\n | 'promise'\n | 'public'\n | 'pure'\n | 'reference'\n | 'relocatable'\n | 'return'\n | 'returns'\n | 'sizeof'\n | 'static'\n | 'storage'\n | 'struct'\n | 'super'\n | 'supports'\n | 'switch'\n | 'this'\n | 'true'\n | 'try'\n | 'typedef'\n | 'typeof'\n | 'var'\n | 'view'\n | 'virtual'\n | `address${`[${string}]` | ''}`\n | `bool${`[${string}]` | ''}`\n | `string${`[${string}]` | ''}`\n | `tuple${`[${string}]` | ''}`\n | `bytes${number | ''}${`[${string}]` | ''}`\n | `${'u' | ''}int${number | ''}${`[${string}]` | ''}`\n\n/** @internal */\nexport type IsValidCharacter =\n character extends `${ValidCharacters}${infer tail}`\n ? tail extends ''\n ? true\n : IsValidCharacter\n : false\n\n// biome-ignore format: no formatting\n/** @internal */\nexport type ValidCharacters =\n // uppercase letters\n | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'\n // lowercase letters\n | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'\n // numbers\n | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'\n // special characters\n | '_' | '$'\n\n// Template string inference can absorb `returns`:\n// type Result = `function foo(string) return s (uint256)` extends `function ${string}(${infer Parameters})` ? Parameters : never\n// // ^? type Result = \"string ) return s (uint256\"\n// So we need to validate against `returns` keyword with all combinations of whitespace\n/** @internal */\nexport type InvalidFunctionParameters =\n | `${string}${MangledReturns} (${string}`\n | `${string}) ${MangledReturns}${string}`\n | `${string})${string}${MangledReturns}${string}(${string}`\n\n// r_e_t_u_r_n_s\n/** @internal */\nexport type MangledReturns =\n // Single\n | `r${string}eturns`\n | `re${string}turns`\n | `ret${string}urns`\n | `retu${string}rns`\n | `retur${string}ns`\n | `return${string}s`\n // Double\n // `r_e*`\n | `r${string}e${string}turns`\n | `r${string}et${string}urns`\n | `r${string}etu${string}rns`\n | `r${string}etur${string}ns`\n | `r${string}eturn${string}s`\n // `re_t*`\n | `re${string}t${string}urns`\n | `re${string}tu${string}rns`\n | `re${string}tur${string}ns`\n | `re${string}turn${string}s`\n // `ret_u*`\n | `ret${string}u${string}rns`\n | `ret${string}ur${string}ns`\n | `ret${string}urn${string}s`\n // `retu_r*`\n | `retu${string}r${string}ns`\n | `retu${string}rn${string}s`\n // `retur_n*`\n | `retur${string}n${string}s`\n // Triple\n // `r_e_t*`\n | `r${string}e${string}t${string}urns`\n | `r${string}e${string}tu${string}rns`\n | `r${string}e${string}tur${string}ns`\n | `r${string}e${string}turn${string}s`\n // `re_t_u*`\n | `re${string}t${string}u${string}rns`\n | `re${string}t${string}ur${string}ns`\n | `re${string}t${string}urn${string}s`\n // `ret_u_r*`\n | `ret${string}u${string}r${string}ns`\n | `ret${string}u${string}rn${string}s`\n // `retu_r_n*`\n | `retu${string}r${string}n${string}s`\n // Quadruple\n // `r_e_t_u*`\n | `r${string}e${string}t${string}u${string}rns`\n | `r${string}e${string}t${string}ur${string}ns`\n | `r${string}e${string}t${string}urn${string}s`\n // `re_t_u_r*`\n | `re${string}t${string}u${string}r${string}ns`\n | `re${string}t${string}u${string}rn${string}s`\n // `ret_u_r_n*`\n | `ret${string}u${string}r${string}n${string}s`\n // Quintuple\n // `r_e_t_u_r*`\n | `r${string}e${string}t${string}u${string}r${string}ns`\n | `r${string}e${string}t${string}u${string}rn${string}s`\n // `re_t_u_r_n*`\n | `re${string}t${string}u${string}r${string}n${string}s`\n // Sextuple\n // `r_e_t_u_r_n_s`\n | `r${string}e${string}t${string}u${string}r${string}n${string}s`\n\n/** @internal */\nexport type Widen =\n | ([unknown] extends [type] ? unknown : never)\n | (type extends Function ? type : never)\n | (type extends abitype.ResolvedRegister['bigIntType'] ? bigint : never)\n | (type extends boolean ? boolean : never)\n | (type extends abitype.ResolvedRegister['intType'] ? number : never)\n | (type extends string\n ? type extends abitype.ResolvedRegister['addressType']\n ? abitype.ResolvedRegister['addressType']\n : type extends abitype.ResolvedRegister['bytesType']['inputs']\n ? abitype.ResolvedRegister['bytesType']\n : string\n : never)\n | (type extends readonly [] ? readonly [] : never)\n | (type extends Record\n ? { [K in keyof type]: Widen }\n : never)\n | (type extends { length: number }\n ? {\n [K in keyof type]: Widen\n } extends infer Val extends readonly unknown[]\n ? readonly [...Val]\n : never\n : never)\n\n/** @internal */\nexport function normalizeSignature(signature: string): string {\n let active = true\n let current = ''\n let level = 0\n let result = ''\n let valid = false\n\n for (let i = 0; i < signature.length; i++) {\n const char = signature[i]!\n\n // If the character is a separator, we want to reactivate.\n if (['(', ')', ','].includes(char)) active = true\n\n // If the character is a \"level\" token, we want to increment/decrement.\n if (char === '(') level++\n if (char === ')') level--\n\n // If we aren't active, we don't want to mutate the result.\n if (!active) continue\n\n // If level === 0, we are at the definition level.\n if (level === 0) {\n if (char === ' ' && ['event', 'function', 'error', ''].includes(result))\n result = ''\n else {\n result += char\n\n // If we are at the end of the definition, we must be finished.\n if (char === ')') {\n valid = true\n break\n }\n }\n\n continue\n }\n\n // Ignore spaces\n if (char === ' ') {\n // If the previous character is a separator, and the current section isn't empty, we want to deactivate.\n if (signature[i - 1] !== ',' && current !== ',' && current !== ',(') {\n current = ''\n active = false\n }\n continue\n }\n\n result += char\n current += char\n }\n\n if (!valid) throw new Errors.BaseError('Unable to normalize signature.')\n\n return result\n}\n\n/** @internal */\nexport declare namespace normalizeSignature {\n export type ErrorType = Errors.BaseError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function isArgOfType(\n arg: unknown,\n abiParameter: AbiParameters.Parameter,\n): boolean {\n const argType = typeof arg\n const abiParameterType = abiParameter.type\n switch (abiParameterType) {\n case 'address':\n return Address.validate(arg as Address.Address, { strict: false })\n case 'bool':\n return argType === 'boolean'\n case 'function':\n return argType === 'string'\n case 'string':\n return argType === 'string'\n default: {\n if (abiParameterType === 'tuple' && 'components' in abiParameter)\n return Object.values(abiParameter.components).every(\n (component, index) => {\n return isArgOfType(\n Object.values(arg as unknown[] | Record)[index],\n component as AbiParameters.Parameter,\n )\n },\n )\n\n // `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n // https://regexr.com/6v8hp\n if (\n /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(\n abiParameterType,\n )\n )\n return argType === 'number' || argType === 'bigint'\n\n // `bytes`: binary type of `M` bytes, `0 < M <= 32`\n // https://regexr.com/6va55\n if (/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(abiParameterType))\n return argType === 'string' || arg instanceof Uint8Array\n\n // fixed-length (`[M]`) and dynamic (`[]`) arrays\n // https://regexr.com/6va6i\n if (/[a-z]+[1-9]{0,3}(\\[[0-9]{0,}\\])+$/.test(abiParameterType)) {\n return (\n Array.isArray(arg) &&\n arg.every((x: unknown) =>\n isArgOfType(x, {\n ...abiParameter,\n // Pop off `[]` or `[M]` from end of type\n type: abiParameterType.replace(/(\\[[0-9]{0,}\\])$/, ''),\n } as AbiParameters.Parameter),\n )\n )\n }\n\n return false\n }\n }\n}\n\n/** @internal */\nexport function getAmbiguousTypes(\n sourceParameters: readonly AbiParameters.Parameter[],\n targetParameters: readonly AbiParameters.Parameter[],\n args: ExtractArgs,\n): AbiParameters.Parameter['type'][] | undefined {\n for (const parameterIndex in sourceParameters) {\n const sourceParameter = sourceParameters[parameterIndex]!\n const targetParameter = targetParameters[parameterIndex]!\n\n if (\n sourceParameter.type === 'tuple' &&\n targetParameter.type === 'tuple' &&\n 'components' in sourceParameter &&\n 'components' in targetParameter\n )\n return getAmbiguousTypes(\n sourceParameter.components,\n targetParameter.components,\n (args as any)[parameterIndex],\n )\n\n const types = [sourceParameter.type, targetParameter.type]\n\n const ambiguous = (() => {\n if (types.includes('address') && types.includes('bytes20')) return true\n if (types.includes('address') && types.includes('string'))\n return Address.validate(args[parameterIndex] as Address.Address, {\n strict: false,\n })\n if (types.includes('address') && types.includes('bytes'))\n return Address.validate(args[parameterIndex] as Address.Address, {\n strict: false,\n })\n return false\n })()\n\n if (ambiguous) return types\n }\n\n return\n}\n","import * as abitype from 'abitype'\nimport type * as Abi from './Abi.js'\nimport * as AbiItem from './AbiItem.js'\nimport * as AbiParameters from './AbiParameters.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type * as internal from './internal/abiConstructor.js'\nimport type { IsNarrowable } from './internal/types.js'\n\n/** Root type for an {@link ox#AbiItem.AbiItem} with a `constructor` type. */\nexport type AbiConstructor = abitype.AbiConstructor\n\n/**\n * ABI-decodes the provided constructor input (`inputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from('constructor(address, uint256)')\n *\n * const bytecode = '0x...'\n *\n * const data = AbiConstructor.encode(constructor, {\n * bytecode,\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n *\n * const decoded = AbiConstructor.decode(constructor, { // [!code focus]\n * bytecode, // [!code focus]\n * data, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object as a parameter to `AbiConstructor.decode`.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiConstructor } from 'ox'\n *\n * const abi = Abi.from([...])\n *\n * const data = AbiConstructor.encode(abi, {\n * bytecode: '0x...',\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n *\n * const decoded = AbiConstructor.decode(abi, { // [!code focus]\n * bytecode: '0x...', // [!code focus]\n * data, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param abiConstructor - The ABI Constructor to decode.\n * @param options - Decoding options.\n * @returns The decoded constructor inputs.\n */\nexport function decode<\n const abi extends Abi.Abi | readonly unknown[],\n abiConstructor extends\n AbiConstructor = fromAbi.ReturnType extends AbiConstructor\n ? fromAbi.ReturnType\n : never,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n options: decode.Options,\n): decode.ReturnType\nexport function decode(\n abiConstructor: abiConstructor | AbiConstructor,\n options: decode.Options,\n): decode.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decode(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], options: decode.Options]\n | [abiConstructor: AbiConstructor, options: decode.Options]\n): decode.ReturnType {\n const [abiConstructor, options] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, options] = parameters as [\n Abi.Abi | readonly unknown[],\n decode.Options,\n ]\n return [fromAbi(abi), options] as [AbiConstructor, decode.Options]\n }\n return parameters as [AbiConstructor, decode.Options]\n })()\n\n const { bytecode } = options\n if (abiConstructor.inputs?.length === 0) return undefined\n const data = options.data.replace(bytecode, '0x') as Hex.Hex\n return AbiParameters.decode(abiConstructor.inputs, data)\n}\n\nexport declare namespace decode {\n interface Options {\n /** The bytecode of the contract. */\n bytecode: Hex.Hex\n /** The encoded constructor. */\n data: Hex.Hex\n }\n\n type ReturnType =\n | (abiConstructor['inputs']['length'] extends 0\n ? undefined\n : abitype.AbiParametersToPrimitiveTypes)\n | (IsNarrowable extends true\n ? never\n : undefined)\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * ABI-encodes the provided constructor input (`inputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from('constructor(address, uint256)')\n *\n * const data = AbiConstructor.encode(constructor, {\n * bytecode: '0x...',\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object as a parameter to `AbiConstructor.encode`.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiConstructor } from 'ox'\n *\n * const abi = Abi.from([...])\n *\n * const data = AbiConstructor.encode(abi, { // [!code focus]\n * bytecode: '0x...', // [!code focus]\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n], // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @example\n * ### End-to-end\n *\n * Below is an end-to-end example of using `AbiConstructor.encode` to encode the constructor of a contract and deploy it.\n *\n * ```ts twoslash\n * import 'ox/window'\n * import { AbiConstructor, Hex } from 'ox'\n *\n * // 1. Instantiate the ABI Constructor.\n * const constructor = AbiConstructor.from(\n * 'constructor(address owner, uint256 amount)',\n * )\n *\n * // 2. Encode the ABI Constructor.\n * const data = AbiConstructor.encode(constructor, {\n * bytecode: '0x...',\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n *\n * // 3. Deploy the contract.\n * const hash = await window.ethereum!.request({\n * method: 'eth_sendTransaction',\n * params: [{ data }],\n * })\n * ```\n *\n * :::note\n *\n * For simplicity, the above example uses `window.ethereum.request`, but you can use any\n * type of JSON-RPC interface.\n *\n * :::\n *\n * @param abiConstructor - The ABI Constructor to encode.\n * @param options - Encoding options.\n * @returns The encoded constructor.\n */\nexport function encode<\n const abi extends Abi.Abi | readonly unknown[],\n abiConstructor extends\n AbiConstructor = fromAbi.ReturnType extends AbiConstructor\n ? fromAbi.ReturnType\n : never,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n options: encode.Options,\n): encode.ReturnType\nexport function encode(\n abiConstructor: abiConstructor | AbiConstructor,\n options: encode.Options,\n): encode.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function encode(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], options: encode.Options]\n | [abiConstructor: AbiConstructor, options: encode.Options]\n): encode.ReturnType {\n const [abiConstructor, options] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, options] = parameters as [\n Abi.Abi | readonly unknown[],\n encode.Options,\n ]\n return [fromAbi(abi), options] as [AbiConstructor, encode.Options]\n }\n\n return parameters as [AbiConstructor, encode.Options]\n })()\n\n const { bytecode, args } = options\n return Hex.concat(\n bytecode,\n abiConstructor.inputs?.length && args?.length\n ? AbiParameters.encode(abiConstructor.inputs, args as readonly unknown[])\n : '0x',\n )\n}\n\nexport declare namespace encode {\n type Options<\n abiConstructor extends AbiConstructor = AbiConstructor,\n ///\n args extends abitype.AbiParametersToPrimitiveTypes<\n abiConstructor['inputs']\n > = abitype.AbiParametersToPrimitiveTypes,\n > = {\n /** The bytecode of the contract. */\n bytecode: Hex.Hex\n /** The constructor arguments to encode. */\n args?: args | undefined\n } & (readonly [] extends args\n ? {}\n : {\n /** The constructor arguments to encode. */\n args: args\n })\n\n type ReturnType = Hex.Hex\n\n type ErrorType =\n | Hex.concat.ErrorType\n | AbiParameters.encode.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function format(\n abiConstructor: abiConstructor,\n): format.ReturnType\n/**\n * Formats an {@link ox#AbiConstructor.AbiConstructor} into a **Human Readable ABI Function**.\n *\n * @example\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const formatted = AbiConstructor.format({\n * inputs: [\n * { name: 'owner', type: 'address' },\n * ],\n * payable: false,\n * stateMutability: 'nonpayable',\n * type: 'constructor',\n * })\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param abiConstructor - The ABI Constructor to format.\n * @returns The formatted ABI Constructor.\n */\nexport function format(abiConstructor: AbiConstructor): string\n/** @internal */\nexport function format(abiConstructor: AbiConstructor): format.ReturnType {\n return abitype.formatAbiItem(abiConstructor)\n}\n\nexport declare namespace format {\n type ReturnType =\n abitype.FormatAbiItem\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function from<\n const abiConstructor extends AbiConstructor | string | readonly string[],\n>(\n abiConstructor: (abiConstructor | string | readonly string[]) &\n (\n | (abiConstructor extends string\n ? internal.Signature\n : never)\n | (abiConstructor extends readonly string[]\n ? internal.Signatures\n : never)\n | AbiConstructor\n ),\n): from.ReturnType\n/**\n * Parses an arbitrary **JSON ABI Constructor** or **Human Readable ABI Constructor** into a typed {@link ox#AbiConstructor.AbiConstructor}.\n *\n * @example\n * ### JSON ABIs\n *\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from({\n * inputs: [\n * { name: 'owner', type: 'address' },\n * ],\n * payable: false,\n * stateMutability: 'nonpayable',\n * type: 'constructor',\n * })\n *\n * constructor\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable ABIs\n *\n * A Human Readable ABI can be parsed into a typed ABI object:\n *\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from(\n * 'constructor(address owner)' // [!code hl]\n * )\n *\n * constructor\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from([\n * 'struct Foo { address owner; uint256 amount; }', // [!code hl]\n * 'constructor(Foo foo)',\n * ])\n *\n * constructor\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param abiConstructor - The ABI Constructor to parse.\n * @returns Typed ABI Constructor.\n */\nexport function from(\n abiConstructor: AbiConstructor | string | readonly string[],\n): AbiConstructor\n/** @internal */\nexport function from(\n abiConstructor: AbiConstructor | string | readonly string[],\n): from.ReturnType {\n return AbiItem.from(abiConstructor as AbiConstructor)\n}\n\nexport declare namespace from {\n type ReturnType<\n abiConstructor extends\n | AbiConstructor\n | string\n | readonly string[] = AbiConstructor,\n > = AbiItem.from.ReturnType\n\n type ErrorType = AbiItem.from.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function fromAbi(\n abi: abi | Abi.Abi | readonly unknown[],\n): fromAbi.ReturnType\n/**\n * Extracts an {@link ox#AbiConstructor.AbiConstructor} from an {@link ox#Abi.Abi} given a name and optional arguments.\n *\n * @example\n * ### Extracting by Name\n *\n * ABI Events can be extracted by their name using the `name` option:\n *\n * ```ts twoslash\n * import { Abi, AbiConstructor } from 'ox'\n *\n * const abi = Abi.from([\n * 'constructor(address owner)',\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n *\n * const item = AbiConstructor.fromAbi(abi) // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @returns The ABI constructor.\n */\nexport function fromAbi(abi: Abi.Abi | readonly unknown[]): AbiConstructor\n/** @internal */\nexport function fromAbi(abi: Abi.Abi | readonly unknown[]): fromAbi.ReturnType {\n const item = (abi as Abi.Abi).find((item) => item.type === 'constructor')\n if (!item) throw new AbiItem.NotFoundError({ name: 'constructor' })\n return item\n}\n\nexport declare namespace fromAbi {\n type ReturnType = Extract<\n abi[number],\n { type: 'constructor' }\n >\n\n type ErrorType = AbiItem.NotFoundError | Errors.GlobalErrorType\n}\n","import * as abitype from 'abitype'\nimport type * as Abi from './Abi.js'\nimport * as AbiItem from './AbiItem.js'\nimport * as AbiParameters from './AbiParameters.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type * as internal from './internal/abiFunction.js'\nimport type * as AbiItem_internal from './internal/abiItem.js'\nimport type * as AbiParameters_internal from './internal/abiParameters.js'\nimport type { IsNarrowable } from './internal/types.js'\n\n/** Root type for an {@link ox#AbiItem.AbiItem} with a `function` type. */\nexport type AbiFunction = abitype.AbiFunction & {\n hash?: Hex.Hex | undefined\n overloads?: readonly AbiFunction[] | undefined\n}\n\n/**\n * Extracts an {@link ox#AbiFunction.AbiFunction} item from an {@link ox#Abi.Abi}, given a name.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo(string)',\n * 'function bar(uint256)',\n * ])\n *\n * type Foo = AbiFunction.FromAbi\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n */\nexport type FromAbi<\n abi extends Abi.Abi,\n name extends ExtractNames,\n> = abitype.ExtractAbiFunction\n\n/**\n * Extracts the names of all {@link ox#AbiFunction.AbiFunction} items in an {@link ox#Abi.Abi}.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo(string)',\n * 'function bar(uint256)',\n * ])\n *\n * type names = AbiFunction.Name\n * // ^?\n *\n *\n * ```\n */\nexport type Name =\n abi extends Abi.Abi ? ExtractNames : string\n\nexport type ExtractNames<\n abi extends Abi.Abi,\n abiStateMutability extends\n abitype.AbiStateMutability = abitype.AbiStateMutability,\n> = abitype.ExtractAbiFunctionNames\n\n/**\n * ABI-decodes function arguments according to the ABI Item's input types (`inputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from('function approve(address, uint256)')\n *\n * const data = AbiFunction.encodeData(\n * approve,\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * )\n * // '0x095ea7b3000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000010f2c'\n *\n * const input = AbiFunction.decodeData(approve, data) // [!code focus]\n * // @log: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(decodeData:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([...])\n * const data = '0x...\n *\n * const input = AbiFunction.decodeData(\n * abi, // [!code focus]\n * 'approve', // [!code focus]\n * data\n * )\n * // @log: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * ```\n *\n * @param abiFunction - The ABI Item to decode.\n * @param data - The data to decode.\n */\nexport function decodeData<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n data: Hex.Hex,\n): decodeData.ReturnType\nexport function decodeData(\n abiFunction: abiItem | AbiFunction,\n data: Hex.Hex,\n): decodeData.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decodeData(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: Hex.Hex | string, data: Hex.Hex]\n | [abiFunction: AbiFunction, data: Hex.Hex]\n) {\n const [abiFunction, data] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, data] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n Hex.Hex,\n ]\n return [fromAbi(abi, name), data]\n }\n return parameters as [AbiFunction, Hex.Hex]\n })()\n\n const { overloads } = abiFunction\n\n if (Hex.size(data) < 4) throw new AbiItem.InvalidSelectorSizeError({ data })\n if (abiFunction.inputs?.length === 0) return undefined\n\n const item = overloads\n ? fromAbi([abiFunction, ...overloads], data as never)\n : abiFunction\n\n if (Hex.size(data) <= 4) return undefined\n return AbiParameters.decode(item.inputs, Hex.slice(data, 4))\n}\n\nexport declare namespace decodeData {\n type ReturnType = IsNarrowable<\n abiFunction,\n AbiFunction\n > extends true\n ? abiFunction['inputs'] extends readonly []\n ? undefined\n :\n | AbiParameters_internal.ToPrimitiveTypes\n | (abiFunction['overloads'] extends readonly AbiFunction[]\n ? AbiParameters_internal.ToPrimitiveTypes<\n abiFunction['overloads'][number]['inputs']\n >\n : never)\n : unknown\n\n type ErrorType =\n | fromAbi.ErrorType\n | AbiParameters.decode.ErrorType\n | Hex.size.ErrorType\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * ABI-decodes a function's result according to the ABI Item's output types (`outputs`).\n *\n * :::tip\n *\n * This function is typically used to decode contract function return values (e.g. the response of an `eth_call` or the `input` property of a Transaction).\n *\n * See the [End-to-end Example](#end-to-end).\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const data = '0x000000000000000000000000000000000000000000000000000000000000002a'\n *\n * const totalSupply = AbiFunction.from('function totalSupply() returns (uint256)')\n *\n * const output = AbiFunction.decodeResult(totalSupply, data)\n * // @log: 42n\n * ```\n *\n * @example\n * You can extract an ABI Function from a JSON ABI with {@link ox#AbiFunction.(fromAbi:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const data = '0x000000000000000000000000000000000000000000000000000000000000002a'\n *\n * const erc20Abi = Abi.from([...]) // [!code hl]\n * const totalSupply = AbiFunction.fromAbi(erc20Abi, 'totalSupply') // [!code hl]\n *\n * const output = AbiFunction.decodeResult(totalSupply, data)\n * // @log: 42n\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(decodeResult:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const data = '0x000000000000000000000000000000000000000000000000000000000000002a'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const output = AbiFunction.decodeResult(\n * erc20Abi, // [!code focus]\n * 'totalSupply', // [!code focus]\n * data\n * )\n * // @log: 42n\n * ```\n *\n * @example\n * ### End-to-end\n *\n * Below is an end-to-end example of using `AbiFunction.decodeResult` to decode the result of a `balanceOf` contract call on the [Wagmi Mint Example contract](https://etherscan.io/address/0xfba3912ca04dd458c843e2ee08967fc04f3579c2).\n *\n * ```ts twoslash\n * import 'ox/window'\n * import { Abi, AbiFunction } from 'ox'\n *\n * // 1. Extract the Function from the Contract's ABI.\n * const abi = Abi.from([\n * // ...\n * {\n * name: 'balanceOf',\n * type: 'function',\n * inputs: [{ name: 'account', type: 'address' }],\n * outputs: [{ name: 'balance', type: 'uint256' }],\n * stateMutability: 'view',\n * },\n * // ...\n * ])\n * const balanceOf = AbiFunction.fromAbi(abi, 'balanceOf')\n *\n * // 2. Encode the Function Input.\n * const data = AbiFunction.encodeData(\n * balanceOf,\n * ['0xd2135CfB216b74109775236E36d4b433F1DF507B']\n * )\n *\n * // 3. Perform the Contract Call.\n * const response = await window.ethereum!.request({\n * method: 'eth_call',\n * params: [\n * {\n * data,\n * to: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * },\n * ],\n * })\n *\n * // 4. Decode the Function Output. // [!code focus]\n * const balance = AbiFunction.decodeResult(balanceOf, response) // [!code focus]\n * // @log: 42n\n * ```\n *\n * :::note\n *\n * For simplicity, the above example uses `window.ethereum.request`, but you can use any\n * type of JSON-RPC interface.\n *\n * :::\n *\n * @param abiFunction - ABI Function to decode\n * @param data - ABI-encoded function output\n * @param options - Decoding options\n * @returns Decoded function output\n */\nexport function decodeResult<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n as extends 'Object' | 'Array' = 'Array',\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n): decodeResult.ReturnType\nexport function decodeResult<\n const abiFunction extends AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n>(\n abiFunction: abiFunction | AbiFunction,\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n): decodeResult.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decodeResult(\n ...parameters:\n | [\n abi: Abi.Abi | readonly unknown[],\n name: Hex.Hex | string,\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n ]\n | [\n abiFunction: AbiFunction,\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n ]\n) {\n const [abiFunction, data, options = {}] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, data, options] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n Hex.Hex,\n decodeResult.Options | undefined,\n ]\n return [fromAbi(abi, name), data, options]\n }\n return parameters as [\n AbiFunction,\n Hex.Hex,\n decodeResult.Options | undefined,\n ]\n })()\n\n const values = AbiParameters.decode(abiFunction.outputs, data, options)\n if (values && Object.keys(values).length === 0) return undefined\n if (values && Object.keys(values).length === 1) {\n if (Array.isArray(values)) return values[0]\n return Object.values(values)[0]\n }\n return values\n}\n\nexport declare namespace decodeResult {\n type Options = {\n /**\n * Whether the decoded values should be returned as an `Object` or `Array`.\n *\n * @default \"Array\"\n */\n as?: as | 'Array' | 'Object' | undefined\n }\n\n type ReturnType<\n abiFunction extends AbiFunction = AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n > = IsNarrowable extends true\n ? abiFunction['outputs'] extends readonly []\n ? undefined\n : abiFunction['outputs'] extends readonly [\n infer type extends abitype.AbiParameter,\n ]\n ? abitype.AbiParameterToPrimitiveType\n : AbiParameters.decode.ReturnType<\n abiFunction['outputs'],\n as\n > extends infer types\n ? types extends readonly []\n ? undefined\n : types extends readonly [infer type]\n ? type\n : types\n : never\n : unknown\n\n type ErrorType = AbiParameters.decode.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * ABI-encodes function arguments (`inputs`), prefixed with the 4 byte function selector.\n *\n * :::tip\n *\n * This function is typically used to encode a contract function and its arguments for contract calls (e.g. `data` parameter of an `eth_call` or `eth_sendTransaction`).\n *\n * See the [End-to-end Example](#end-to-end).\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from('function approve(address, uint256)')\n *\n * const data = AbiFunction.encodeData( // [!code focus]\n * approve, // [!code focus]\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n] // [!code focus]\n * ) // [!code focus]\n * // @log: '0x095ea7b3000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000010f2c'\n * ```\n *\n * @example\n * You can extract an ABI Function from a JSON ABI with {@link ox#AbiFunction.(fromAbi:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const erc20Abi = Abi.from([...]) // [!code hl]\n * const approve = AbiFunction.fromAbi(erc20Abi, 'approve') // [!code hl]\n *\n * const data = AbiFunction.encodeData(\n * approve,\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * )\n * // @log: '0x095ea7b3000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000010f2c'\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(encodeData:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const data = AbiFunction.encodeData(\n * erc20Abi, // [!code focus]\n * 'approve', // [!code focus]\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * )\n * ```\n *\n * @example\n * ### End-to-end\n *\n * Below is an end-to-end example of using `AbiFunction.encodeData` to encode the input of a `balanceOf` contract call on the [Wagmi Mint Example contract](https://etherscan.io/address/0xfba3912ca04dd458c843e2ee08967fc04f3579c2).\n *\n * ```ts twoslash\n * import 'ox/window'\n * import { Abi, AbiFunction } from 'ox'\n *\n * // 1. Extract the Function from the Contract's ABI.\n * const abi = Abi.from([\n * // ...\n * {\n * name: 'balanceOf',\n * type: 'function',\n * inputs: [{ name: 'account', type: 'address' }],\n * outputs: [{ name: 'balance', type: 'uint256' }],\n * stateMutability: 'view',\n * },\n * // ...\n * ])\n * const balanceOf = AbiFunction.fromAbi(abi, 'balanceOf')\n *\n * // 2. Encode the Function Input. // [!code focus]\n * const data = AbiFunction.encodeData( // [!code focus]\n * balanceOf, // [!code focus]\n * ['0xd2135CfB216b74109775236E36d4b433F1DF507B'] // [!code focus]\n * ) // [!code focus]\n *\n * // 3. Perform the Contract Call.\n * const response = await window.ethereum!.request({\n * method: 'eth_call',\n * params: [\n * {\n * data,\n * to: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * },\n * ],\n * })\n *\n * // 4. Decode the Function Output.\n * const balance = AbiFunction.decodeResult(balanceOf, response)\n * ```\n *\n * :::note\n *\n * For simplicity, the above example uses `window.ethereum.request`, but you can use any\n * type of JSON-RPC interface.\n *\n * :::\n *\n * @param abiFunction - ABI Function to encode\n * @param args - Function arguments\n * @returns ABI-encoded function name and arguments\n */\nexport function encodeData<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n ...args: encodeData.Args\n): Hex.Hex\nexport function encodeData(\n abiFunction: abiFunction | AbiFunction,\n ...args: encodeData.Args\n): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function encodeData(\n ...parameters:\n | [\n abi: Abi.Abi | readonly unknown[],\n name: Hex.Hex | string,\n ...args: readonly unknown[],\n ]\n | [abiFunction: AbiFunction, ...args: readonly unknown[]]\n) {\n const [abiFunction, args = []] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, args] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n readonly unknown[],\n ]\n return [fromAbi(abi, name, { args }), args]\n }\n const [abiFunction, args] = parameters as [AbiFunction, readonly unknown[]]\n return [abiFunction, args]\n })()\n\n const { overloads } = abiFunction\n\n const item = overloads\n ? (fromAbi([abiFunction as AbiFunction, ...overloads], abiFunction.name, {\n args,\n }) as AbiFunction)\n : abiFunction\n\n const selector = getSelector(item)\n\n const data =\n args.length > 0 ? AbiParameters.encode(item.inputs, args) : undefined\n\n return data ? Hex.concat(selector, data) : selector\n}\n\nexport declare namespace encodeData {\n type Args = IsNarrowable<\n abiFunction,\n AbiFunction\n > extends true\n ?\n | (abitype.AbiParametersToPrimitiveTypes<\n abiFunction['inputs']\n > extends readonly []\n ? []\n : [abitype.AbiParametersToPrimitiveTypes])\n | (abiFunction['overloads'] extends readonly AbiFunction[]\n ? [\n abitype.AbiParametersToPrimitiveTypes<\n abiFunction['overloads'][number]['inputs']\n >,\n ]\n : [])\n : readonly unknown[]\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * ABI-encodes a function's result (`outputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const totalSupply = AbiFunction.from('function totalSupply() returns (uint256)')\n * const output = AbiFunction.decodeResult(totalSupply, '0x000000000000000000000000000000000000000000000000000000000000002a')\n * // 42n\n *\n * const data = AbiFunction.encodeResult(totalSupply, 42n) // [!code focus]\n * // @log: '0x000000000000000000000000000000000000000000000000000000000000002a'\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(encodeResult:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([...])\n *\n * const data = AbiFunction.encodeResult(\n * abi, // [!code focus]\n * 'totalSupply', // [!code focus]\n * 42n\n * )\n * // @log: '0x000000000000000000000000000000000000000000000000000000000000002a'\n * ```\n *\n * @param abiFunction - The ABI item to encode the function output for.\n * @param output - The function output to encode.\n * @param options - Encoding options.\n * @returns The encoded function output.\n */\nexport function encodeResult<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n as extends 'Object' | 'Array' = 'Array',\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n output: encodeResult.Output,\n options?: encodeResult.Options,\n): Hex.Hex\nexport function encodeResult<\n const abiFunction extends AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n>(\n abiFunction: abiFunction | AbiFunction,\n output: encodeResult.Output,\n options?: encodeResult.Options,\n): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function encodeResult(\n ...parameters:\n | [\n abi: Abi.Abi | readonly unknown[],\n name: Hex.Hex | string,\n output: any,\n options?: encodeResult.Options | undefined,\n ]\n | [\n abiFunction: AbiFunction,\n output: any,\n options?: encodeResult.Options | undefined,\n ]\n) {\n const [abiFunction, output, options = {}] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, output, options] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n any,\n encodeResult.Options | undefined,\n ]\n return [fromAbi(abi, name), output, options]\n }\n return parameters as [\n AbiFunction,\n any,\n encodeResult.Options | undefined,\n ]\n })()\n\n const { as = 'Array' } = options\n\n const values = (() => {\n if (abiFunction.outputs.length === 1) return [output]\n if (Array.isArray(output)) return output\n if (as === 'Object') return Object.values(output as any)\n return [output]\n })()\n\n return AbiParameters.encode(abiFunction.outputs, values)\n}\n\nexport declare namespace encodeResult {\n type Output<\n abiFunction extends AbiFunction = AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n > = abiFunction['outputs'] extends readonly []\n ? never\n : abiFunction['outputs']['length'] extends 1\n ? AbiParameters_internal.ToPrimitiveTypes[0]\n : as extends 'Object'\n ? AbiParameters_internal.ToObject\n : AbiParameters_internal.ToPrimitiveTypes\n\n type Options = {\n as?: as | 'Object' | 'Array' | undefined\n }\n\n type ErrorType = AbiParameters.encode.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Formats an {@link ox#AbiFunction.AbiFunction} into a **Human Readable ABI Function**.\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const formatted = AbiFunction.format({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param abiFunction - The ABI Function to format.\n * @returns The formatted ABI Function.\n */\nexport function format(\n abiFunction: abiFunction | AbiFunction,\n): abitype.FormatAbiItem {\n return abitype.formatAbiItem(abiFunction) as never\n}\n\nexport declare namespace format {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses an arbitrary **JSON ABI Function** or **Human Readable ABI Function** into a typed {@link ox#AbiFunction.AbiFunction}.\n *\n * @example\n * ### JSON ABIs\n *\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * approve\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable ABIs\n *\n * A Human Readable ABI can be parsed into a typed ABI object:\n *\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from(\n * 'function approve(address spender, uint256 amount) returns (bool)' // [!code hl]\n * )\n *\n * approve\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from([\n * 'struct Foo { address spender; uint256 amount; }', // [!code hl]\n * 'function approve(Foo foo) returns (bool)',\n * ])\n *\n * approve\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param abiFunction - The ABI Function to parse.\n * @returns Typed ABI Function.\n */\nexport function from<\n const abiFunction extends AbiFunction | string | readonly string[],\n>(\n abiFunction: (abiFunction | AbiFunction | string | readonly string[]) &\n (\n | (abiFunction extends string ? internal.Signature : never)\n | (abiFunction extends readonly string[]\n ? internal.Signatures\n : never)\n | AbiFunction\n ),\n options: from.Options = {},\n): from.ReturnType {\n return AbiItem.from(abiFunction as AbiFunction, options) as never\n}\n\nexport declare namespace from {\n type Options = {\n /**\n * Whether or not to prepare the extracted function (optimization for encoding performance).\n * When `true`, the `hash` property is computed and included in the returned value.\n *\n * @default true\n */\n prepare?: boolean | undefined\n }\n\n type ReturnType<\n abiFunction extends AbiFunction | string | readonly string[],\n > = AbiItem.from.ReturnType\n\n type ErrorType = AbiItem.from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Extracts an {@link ox#AbiFunction.AbiFunction} from an {@link ox#Abi.Abi} given a name and optional arguments.\n *\n * @example\n * ### Extracting by Name\n *\n * ABI Functions can be extracted by their name using the `name` option:\n *\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n *\n * const item = AbiFunction.fromAbi(abi, 'foo') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Extracting by Selector\n *\n * ABI Functions can be extract by their selector when {@link ox#Hex.Hex} is provided to `name`.\n *\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n * const item = AbiFunction.fromAbi(abi, '0x095ea7b3') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * :::note\n *\n * Extracting via a hex selector is useful when extracting an ABI Function from an `eth_call` RPC response or\n * from a Transaction `input`.\n *\n * :::\n *\n * @param abi - The ABI to extract from.\n * @param name - The name (or selector) of the ABI item to extract.\n * @param options - Extraction options.\n * @returns The ABI item.\n */\nexport function fromAbi<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n options?: AbiItem.fromAbi.Options<\n abi,\n name,\n args,\n AbiItem_internal.ExtractArgs\n >,\n): AbiItem.fromAbi.ReturnType {\n const item = AbiItem.fromAbi(abi, name, options as any)\n if (item.type !== 'function')\n throw new AbiItem.NotFoundError({ name, type: 'function' })\n return item as never\n}\n\nexport declare namespace fromAbi {\n type ErrorType = AbiItem.fromAbi.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Computes the [4-byte selector](https://solidity-by-example.org/function-selector/) for an {@link ox#AbiFunction.AbiFunction}.\n *\n * Useful for computing function selectors for calldata.\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const selector = AbiFunction.getSelector('function ownerOf(uint256 tokenId)')\n * // @log: '0x6352211e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const selector = AbiFunction.getSelector({\n * inputs: [{ type: 'uint256' }],\n * name: 'ownerOf',\n * outputs: [],\n * stateMutability: 'view',\n * type: 'function'\n * })\n * // @log: '0x6352211e'\n * ```\n *\n * @param abiItem - The ABI item to compute the selector for.\n * @returns The first 4 bytes of the {@link ox#Hash.(keccak256:function)} hash of the function signature.\n */\nexport function getSelector(abiItem: string | AbiFunction): Hex.Hex {\n return AbiItem.getSelector(abiItem)\n}\n\nexport declare namespace getSelector {\n type ErrorType = AbiItem.getSelector.ErrorType | Errors.GlobalErrorType\n}\n","import type { AbiStateMutability, Address, Narrow } from 'abitype'\nimport * as AbiConstructor from 'ox/AbiConstructor'\nimport * as AbiFunction from 'ox/AbiFunction'\n\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { ethAddress, zeroAddress } from '../../constants/address.js'\nimport { deploylessCallViaBytecodeBytecode } from '../../constants/contracts.js'\nimport { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type { Call, Calls } from '../../types/calls.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { MulticallResults } from '../../types/multicall.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { Mutable } from '../../types/utils.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport { hexToBigInt } from '../../utils/index.js'\nimport {\n type CreateAccessListErrorType,\n createAccessList,\n} from './createAccessList.js'\nimport {\n type SimulateBlocksErrorType,\n type SimulateBlocksParameters,\n simulateBlocks,\n} from './simulateBlocks.js'\n\nconst getBalanceCode =\n '0x6080604052348015600e575f80fd5b5061016d8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063f8b2cb4f1461002d575b5f80fd5b610047600480360381019061004291906100db565b61005d565b604051610054919061011e565b60405180910390f35b5f8173ffffffffffffffffffffffffffffffffffffffff16319050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100aa82610081565b9050919050565b6100ba816100a0565b81146100c4575f80fd5b50565b5f813590506100d5816100b1565b92915050565b5f602082840312156100f0576100ef61007d565b5b5f6100fd848285016100c7565b91505092915050565b5f819050919050565b61011881610106565b82525050565b5f6020820190506101315f83018461010f565b9291505056fea26469706673582212203b9fe929fe995c7cf9887f0bdba8a36dd78e8b73f149b17d2d9ad7cd09d2dc6264736f6c634300081a0033'\n\nexport type SimulateCallsParameters<\n calls extends readonly unknown[] = readonly unknown[],\n account extends Account | Address | undefined = Account | Address | undefined,\n> = Omit & {\n /** Account attached to the calls (msg.sender). */\n account?: account | undefined\n /** Calls to simulate. */\n calls: Calls>\n /** State overrides. */\n stateOverrides?: StateOverride | undefined\n /** Whether to trace asset changes. */\n traceAssetChanges?: boolean | undefined\n}\n\nexport type SimulateCallsReturnType<\n calls extends readonly unknown[] = readonly unknown[],\n> = {\n /** Asset changes. */\n assetChanges: readonly {\n token: {\n address: Address\n decimals?: number | undefined\n symbol?: string | undefined\n }\n value: { pre: bigint; post: bigint; diff: bigint }\n }[]\n /** Block results. */\n block: Block\n /** Call results. */\n results: MulticallResults<\n Narrow,\n true,\n {\n extraProperties: {\n data: Hex\n gasUsed: bigint\n logs?: Log[] | undefined\n }\n error: Error\n mutability: AbiStateMutability\n }\n >\n}\n\nexport type SimulateCallsErrorType =\n | AbiFunction.encodeData.ErrorType\n | AbiFunction.from.ErrorType\n | CreateAccessListErrorType\n | EncodeFunctionDataErrorType\n | SimulateBlocksErrorType\n | ErrorType\n\n/**\n * Simulates execution of a batch of calls.\n *\n * @param client - Client to use\n * @param parameters - {@link SimulateCallsParameters}\n * @returns Results. {@link SimulateCallsReturnType}\n *\n * @example\n * ```ts\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { simulateCalls } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await simulateCalls(client, {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * calls: [{\n * {\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * ]\n * })\n * ```\n */\nexport async function simulateCalls<\n const calls extends readonly unknown[],\n chain extends Chain | undefined,\n account extends Account | Address | undefined = undefined,\n>(\n client: Client,\n parameters: SimulateCallsParameters,\n): Promise> {\n const {\n blockNumber,\n blockTag,\n calls,\n stateOverrides,\n traceAssetChanges,\n traceTransfers,\n validation,\n } = parameters\n\n const account = parameters.account\n ? parseAccount(parameters.account)\n : undefined\n\n if (traceAssetChanges && !account)\n throw new BaseError(\n '`account` is required when `traceAssetChanges` is true',\n )\n\n // Derive bytecode to extract ETH balance via a contract call.\n const getBalanceData = account\n ? AbiConstructor.encode(AbiConstructor.from('constructor(bytes, bytes)'), {\n bytecode: deploylessCallViaBytecodeBytecode,\n args: [\n getBalanceCode,\n AbiFunction.encodeData(\n AbiFunction.from('function getBalance(address)'),\n [account.address],\n ),\n ],\n })\n : undefined\n\n // Fetch ERC20/721 addresses that were \"touched\" from the calls.\n const assetAddresses = traceAssetChanges\n ? await Promise.all(\n parameters.calls.map(async (call: any) => {\n if (!call.data && !call.abi) return\n const { accessList } = await createAccessList(client, {\n account: account!.address,\n ...call,\n data: call.abi ? encodeFunctionData(call) : call.data,\n })\n return accessList.map(({ address, storageKeys }) =>\n storageKeys.length > 0 ? address : null,\n )\n }),\n ).then((x) => x.flat().filter(Boolean))\n : []\n\n const blocks = await simulateBlocks(client, {\n blockNumber,\n blockTag: blockTag as undefined,\n blocks: [\n ...(traceAssetChanges\n ? [\n // ETH pre balances\n {\n calls: [{ data: getBalanceData }],\n stateOverrides,\n },\n\n // Asset pre balances\n {\n calls: assetAddresses.map((address, i) => ({\n abi: [\n AbiFunction.from(\n 'function balanceOf(address) returns (uint256)',\n ),\n ],\n functionName: 'balanceOf',\n args: [account!.address],\n to: address,\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n ]\n : []),\n\n {\n calls: [...calls, { to: zeroAddress }].map((call) => ({\n ...(call as Call),\n from: account?.address,\n })) as any,\n stateOverrides,\n },\n\n ...(traceAssetChanges\n ? [\n // ETH post balances\n {\n calls: [{ data: getBalanceData }],\n },\n\n // Asset post balances\n {\n calls: assetAddresses.map((address, i) => ({\n abi: [\n AbiFunction.from(\n 'function balanceOf(address) returns (uint256)',\n ),\n ],\n functionName: 'balanceOf',\n args: [account!.address],\n to: address,\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n\n // Decimals\n {\n calls: assetAddresses.map((address, i) => ({\n to: address,\n abi: [\n AbiFunction.from('function decimals() returns (uint256)'),\n ],\n functionName: 'decimals',\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n\n // Token URI\n {\n calls: assetAddresses.map((address, i) => ({\n to: address,\n abi: [\n AbiFunction.from(\n 'function tokenURI(uint256) returns (string)',\n ),\n ],\n functionName: 'tokenURI',\n args: [0n],\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n\n // Symbols\n {\n calls: assetAddresses.map((address, i) => ({\n to: address,\n abi: [AbiFunction.from('function symbol() returns (string)')],\n functionName: 'symbol',\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n ]\n : []),\n ],\n traceTransfers,\n validation,\n })\n\n const block_results = traceAssetChanges ? blocks[2] : blocks[0]\n const [\n block_ethPre,\n block_assetsPre,\n ,\n block_ethPost,\n block_assetsPost,\n block_decimals,\n block_tokenURI,\n block_symbols,\n ] = traceAssetChanges ? blocks : []\n\n // Extract call results from the simulation.\n const { calls: block_calls, ...block } = block_results\n const results = block_calls.slice(0, -1) ?? []\n\n // Extract pre-execution ETH and asset balances.\n const ethPre = block_ethPre?.calls ?? []\n const assetsPre = block_assetsPre?.calls ?? []\n const balancesPre = [...ethPre, ...assetsPre].map((call) =>\n call.status === 'success' ? hexToBigInt(call.data) : null,\n )\n\n // Extract post-execution ETH and asset balances.\n const ethPost = block_ethPost?.calls ?? []\n const assetsPost = block_assetsPost?.calls ?? []\n const balancesPost = [...ethPost, ...assetsPost].map((call) =>\n call.status === 'success' ? hexToBigInt(call.data) : null,\n )\n\n // Extract asset symbols & decimals.\n const decimals = (block_decimals?.calls ?? []).map((x) =>\n x.status === 'success' ? x.result : null,\n ) as (number | null)[]\n const symbols = (block_symbols?.calls ?? []).map((x) =>\n x.status === 'success' ? x.result : null,\n ) as (string | null)[]\n const tokenURI = (block_tokenURI?.calls ?? []).map((x) =>\n x.status === 'success' ? x.result : null,\n ) as (string | null)[]\n\n const changes: Mutable['assetChanges']> = []\n for (const [i, balancePost] of balancesPost.entries()) {\n const balancePre = balancesPre[i]\n\n if (typeof balancePost !== 'bigint') continue\n if (typeof balancePre !== 'bigint') continue\n\n const decimals_ = decimals[i - 1]\n const symbol_ = symbols[i - 1]\n const tokenURI_ = tokenURI[i - 1]\n\n const token = (() => {\n if (i === 0)\n return {\n address: ethAddress,\n decimals: 18,\n symbol: 'ETH',\n }\n\n return {\n address: assetAddresses[i - 1]! as Address,\n decimals: tokenURI_ || decimals_ ? Number(decimals_ ?? 1) : undefined,\n symbol: symbol_ ?? undefined,\n }\n })()\n\n if (changes.some((change) => change.token.address === token.address))\n continue\n\n changes.push({\n token,\n value: {\n pre: balancePre,\n post: balancePost,\n diff: balancePost - balancePre,\n },\n })\n }\n\n return {\n assetChanges: changes,\n block,\n results,\n } as unknown as SimulateCallsReturnType\n}\n","export const ethAddress = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const\n\nexport const zeroAddress = '0x0000000000000000000000000000000000000000' as const\n","import type * as Abi from '../core/Abi.js'\nimport * as AbiParameters from '../core/AbiParameters.js'\nimport type * as Address from '../core/Address.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport type * as Signature from '../core/Signature.js'\n\n/** Unwrapped ERC-6492 signature. */\nexport type Unwrapped = {\n /** Calldata to pass to the target address for counterfactual verification. */\n data: Hex.Hex\n /** The original signature. */\n signature: Hex.Hex\n /** The target address to use for counterfactual verification. */\n to: Address.Address\n}\n\n/** Wrapped ERC-6492 signature. */\nexport type Wrapped = Hex.Hex\n\n/**\n * Magic bytes used to identify ERC-6492 wrapped signatures.\n */\nexport const magicBytes =\n '0x6492649264926492649264926492649264926492649264926492649264926492' as const\n\n/**\n * Deployless ERC-6492 signature verification bytecode.\n */\nexport const universalSignatureValidatorBytecode =\n '0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572'\n\n/**\n * ABI for the ERC-6492 universal deployless signature validator contract.\n *\n * Constructor return value is `0x1` (valid) or `0x0` (invalid).\n */\nexport const universalSignatureValidatorAbi = [\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n name: 'isValidSig',\n },\n] as const satisfies Abi.Abi\n\n/**\n * Asserts that the wrapped signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * SignatureErc6492.assert('0xdeadbeef')\n * // @error: InvalidWrappedSignatureError: Value `0xdeadbeef` is an invalid ERC-6492 wrapped signature.\n * ```\n *\n * @param wrapped - The wrapped signature to assert.\n */\nexport function assert(wrapped: Wrapped) {\n if (Hex.slice(wrapped, -32) !== magicBytes)\n throw new InvalidWrappedSignatureError(wrapped)\n}\n\nexport declare namespace assert {\n type ErrorType =\n | InvalidWrappedSignatureError\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { SignatureErc6492 } from 'ox/erc6492' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * // Instantiate from serialized format. // [!code focus]\n * const wrapped = SignatureErc6492.from('0x...') // [!code focus]\n * // @log: { data: '0x...', signature: { ... }, to: '0x...', } // [!code focus]\n *\n * // Instantiate from constituent parts. // [!code focus]\n * const wrapped = SignatureErc6492.from({ // [!code focus]\n * data: '0x...', // [!code focus]\n * signature, // [!code focus]\n * to: '0x...', // [!code focus]\n * })\n * // @log: { data: '0x...', signature: { ... }, to: '0x...', }\n * ```\n *\n * @param wrapped - Wrapped signature to parse.\n * @returns Wrapped signature.\n */\nexport function from(wrapped: Unwrapped | Wrapped): Unwrapped {\n if (typeof wrapped === 'string') return unwrap(wrapped)\n return wrapped\n}\n\nexport declare namespace from {\n type ReturnType = Unwrapped\n\n type ErrorType =\n | AbiParameters.from.ErrorType\n | AbiParameters.decode.ErrorType\n | Signature.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * const { data, signature, to } = SignatureErc6492.unwrap('0x...')\n * ```\n *\n * @param wrapped - Wrapped signature to parse.\n * @returns Wrapped signature.\n */\nexport function unwrap(wrapped: Wrapped): Unwrapped {\n assert(wrapped)\n\n const [to, data, signature] = AbiParameters.decode(\n AbiParameters.from('address, bytes, bytes'),\n wrapped,\n )\n\n return { data, signature, to }\n}\n\nexport declare namespace unwrap {\n type ErrorType =\n | AbiParameters.from.ErrorType\n | AbiParameters.decode.ErrorType\n | Signature.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification).\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1, Signature } from 'ox'\n * import { SignatureErc6492 } from 'ox/erc6492' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc6492.wrap({ // [!code focus]\n * data: '0xdeadbeef', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * to: '0x00000000219ab540356cBB839Cbe05303d7705Fa', // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param value - Wrapped signature to serialize.\n * @returns Serialized wrapped signature.\n */\nexport function wrap(value: Unwrapped): Wrapped {\n const { data, signature, to } = value\n\n return Hex.concat(\n AbiParameters.encode(AbiParameters.from('address, bytes, bytes'), [\n to,\n data,\n signature,\n ]),\n magicBytes,\n )\n}\n\nexport declare namespace wrap {\n type ErrorType =\n | AbiParameters.encode.ErrorType\n | Hex.concat.ErrorType\n | Signature.toHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Validates a wrapped signature. Returns `true` if the wrapped signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * const valid = SignatureErc6492.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param wrapped - The wrapped signature to validate.\n * @returns `true` if the wrapped signature is valid, `false` otherwise.\n */\nexport function validate(wrapped: Wrapped): boolean {\n try {\n assert(wrapped)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** Thrown when the ERC-6492 wrapped signature is invalid. */\nexport class InvalidWrappedSignatureError extends Errors.BaseError {\n override readonly name = 'SignatureErc6492.InvalidWrappedSignatureError'\n\n constructor(wrapped: Wrapped) {\n super(`Value \\`${wrapped}\\` is an invalid ERC-6492 wrapped signature.`)\n }\n}\n","import type { Address } from 'abitype'\nimport { SignatureErc6492 } from 'ox/erc6492'\nimport { SignatureErc8010 } from 'ox/erc8010'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n erc1271Abi,\n erc6492SignatureValidatorAbi,\n multicall3Abi,\n} from '../../constants/abis.js'\nimport {\n erc6492SignatureValidatorByteCode,\n multicall3Bytecode,\n} from '../../constants/contracts.js'\nimport {\n CallExecutionError,\n ContractFunctionExecutionError,\n} from '../../errors/contract.js'\nimport type { InvalidHexBooleanError } from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type EncodeDeployDataErrorType,\n encodeDeployData,\n} from '../../utils/abi/encodeDeployData.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetAddressErrorType,\n getAddress,\n} from '../../utils/address/getAddress.js'\nimport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from '../../utils/address/isAddressEqual.js'\nimport { verifyAuthorization } from '../../utils/authorization/verifyAuthorization.js'\nimport { type ConcatHexErrorType, concatHex } from '../../utils/data/concat.js'\nimport { type IsHexErrorType, isHex } from '../../utils/data/isHex.js'\nimport { hexToBool } from '../../utils/encoding/fromHex.js'\nimport {\n type BytesToHexErrorType,\n bytesToHex,\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type RecoverAddressErrorType,\n recoverAddress,\n} from '../../utils/signature/recoverAddress.js'\nimport {\n type SerializeSignatureErrorType,\n serializeSignature,\n} from '../../utils/signature/serializeSignature.js'\nimport { type CallErrorType, type CallParameters, call } from './call.js'\nimport { type GetCodeErrorType, getCode } from './getCode.js'\nimport { type ReadContractErrorType, readContract } from './readContract.js'\n\nexport type VerifyHashParameters = Pick<\n CallParameters,\n 'blockNumber' | 'blockTag'\n> & {\n /** The address that signed the original message. */\n address: Address\n /** The chain to use. */\n chain?: Chain | null | undefined\n /** The address of the ERC-6492 signature verifier contract. */\n erc6492VerifierAddress?: Address | undefined\n /** The hash to be verified. */\n hash: Hex\n /** Multicall3 address for ERC-8010 verification. */\n multicallAddress?: Address | undefined\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex | ByteArray | Signature\n /** @deprecated use `erc6492VerifierAddress` instead. */\n universalSignatureVerifierAddress?: Address | undefined\n /** Chooses which verification path to try first before falling back. */\n mode?: 'auto' | 'eoa' | (string & {}) | undefined\n} & OneOf<{ factory: Address; factoryData: Hex } | {}>\n\nexport type VerifyHashReturnType = boolean\n\nexport type VerifyHashErrorType =\n | BytesToHexErrorType\n | CallErrorType\n | ConcatHexErrorType\n | EncodeDeployDataErrorType\n | EncodeFunctionDataErrorType\n | ErrorType\n | GetAddressErrorType\n | GetCodeErrorType\n | InvalidHexBooleanError\n | IsAddressEqualErrorType\n | IsHexErrorType\n | NumberToHexErrorType\n | ReadContractErrorType\n | RecoverAddressErrorType\n | SerializeSignatureErrorType\n\n/**\n * Verifies a message hash onchain using ERC-6492.\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifyHashParameters}\n * @returns Whether or not the signature is valid. {@link VerifyHashReturnType}\n */\nexport async function verifyHash(\n client: Client,\n parameters: VerifyHashParameters,\n): Promise {\n const {\n address,\n chain = client.chain,\n hash,\n erc6492VerifierAddress:\n verifierAddress = parameters.universalSignatureVerifierAddress ??\n chain?.contracts?.erc6492Verifier?.address,\n multicallAddress = parameters.multicallAddress ??\n chain?.contracts?.multicall3?.address,\n mode = 'auto',\n } = parameters\n\n if (chain?.verifyHash) return await chain.verifyHash(client, parameters)\n\n const signature = (() => {\n const signature = parameters.signature\n if (isHex(signature)) return signature\n if (typeof signature === 'object' && 'r' in signature && 's' in signature)\n return serializeSignature(signature)\n return bytesToHex(signature)\n })()\n try {\n if (mode === 'eoa') {\n try {\n const verified = isAddressEqual(\n getAddress(address),\n await recoverAddress({ hash, signature }),\n )\n if (verified) return true\n } catch {}\n }\n\n if (SignatureErc8010.validate(signature))\n return await verifyErc8010(client, {\n ...parameters,\n multicallAddress,\n signature,\n })\n return await verifyErc6492(client, {\n ...parameters,\n verifierAddress,\n signature,\n })\n } catch (error) {\n if (mode !== 'eoa') {\n // Fallback attempt to verify the signature via ECDSA recovery.\n try {\n const verified = isAddressEqual(\n getAddress(address),\n await recoverAddress({ hash, signature }),\n )\n if (verified) return true\n } catch {}\n }\n\n if (error instanceof VerificationError) {\n // if the execution fails, the signature was not valid and an internal method inside of the validator reverted\n // this can happen for many reasons, for example if signer can not be recovered from the signature\n // or if the signature has no valid format\n return false\n }\n\n throw error\n }\n}\n\n/** @internal */\nexport async function verifyErc8010(\n client: Client,\n parameters: verifyErc8010.Parameters,\n) {\n const { address, blockNumber, blockTag, hash, multicallAddress } = parameters\n\n const {\n authorization: authorization_ox,\n data: initData,\n signature,\n to,\n } = SignatureErc8010.unwrap(parameters.signature)\n\n // Check if already delegated\n const code = await getCode(client, {\n address,\n blockNumber,\n blockTag,\n } as never)\n\n // If already delegated, perform standard ERC-1271 verification.\n if (code === concatHex(['0xef0100', authorization_ox.address]))\n return await verifyErc1271(client, {\n address,\n blockNumber,\n blockTag,\n hash,\n signature,\n })\n\n const authorization = {\n address: authorization_ox.address,\n chainId: Number(authorization_ox.chainId),\n nonce: Number(authorization_ox.nonce),\n r: numberToHex(authorization_ox.r, { size: 32 }),\n s: numberToHex(authorization_ox.s, { size: 32 }),\n yParity: authorization_ox.yParity,\n } as const\n\n const valid = await verifyAuthorization({\n address,\n authorization,\n })\n if (!valid) throw new VerificationError()\n\n // Deployless verification.\n const results = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n ...(multicallAddress\n ? { address: multicallAddress }\n : { code: multicall3Bytecode }),\n authorizationList: [authorization],\n abi: multicall3Abi,\n blockNumber,\n blockTag: 'pending',\n functionName: 'aggregate3',\n args: [\n [\n ...(initData\n ? ([\n {\n allowFailure: true,\n target: to ?? address,\n callData: initData,\n },\n ] as const)\n : []),\n {\n allowFailure: true,\n target: address,\n callData: encodeFunctionData({\n abi: erc1271Abi,\n functionName: 'isValidSignature',\n args: [hash, signature],\n }),\n },\n ],\n ],\n })\n\n const data = results[results.length - 1]?.returnData\n\n if (data?.startsWith('0x1626ba7e')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc8010 {\n export type Parameters = Pick & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** Multicall3 address for ERC-8010 verification. */\n multicallAddress?: Address | undefined\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n }\n}\n\n/** @internal */\n// biome-ignore lint/correctness/noUnusedVariables: _\nasync function verifyErc6492(\n client: Client,\n parameters: verifyErc6492.Parameters,\n) {\n const {\n address,\n factory,\n factoryData,\n hash,\n signature,\n verifierAddress,\n ...rest\n } = parameters\n\n const wrappedSignature = await (async () => {\n // If no `factory` or `factoryData` is provided, it is assumed that the\n // address is not a Smart Account, or the Smart Account is already deployed.\n if (!factory && !factoryData) return signature\n\n // If the signature is already wrapped, return the signature.\n if (SignatureErc6492.validate(signature)) return signature\n\n // If the Smart Account is not deployed, wrap the signature with a 6492 wrapper\n // to perform counterfactual validation.\n return SignatureErc6492.wrap({\n data: factoryData!,\n signature,\n to: factory!,\n })\n })()\n\n const args = verifierAddress\n ? ({\n to: verifierAddress,\n data: encodeFunctionData({\n abi: erc6492SignatureValidatorAbi,\n functionName: 'isValidSig',\n args: [address, hash, wrappedSignature],\n }),\n ...rest,\n } as unknown as CallParameters)\n : ({\n data: encodeDeployData({\n abi: erc6492SignatureValidatorAbi,\n args: [address, hash, wrappedSignature],\n bytecode: erc6492SignatureValidatorByteCode,\n }),\n ...rest,\n } as unknown as CallParameters)\n\n const { data } = await getAction(\n client,\n call,\n 'call',\n )(args).catch((error) => {\n if (error instanceof CallExecutionError) throw new VerificationError()\n throw error\n })\n\n if (hexToBool(data ?? '0x0')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc6492 {\n export type Parameters = Pick & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n /** The address of the ERC-6492 signature verifier contract. */\n verifierAddress?: Address | undefined\n } & OneOf<{ factory: Address; factoryData: Hex } | {}>\n}\n\n/** @internal */\nexport async function verifyErc1271(\n client: Client,\n parameters: verifyErc1271.Parameters,\n) {\n const { address, blockNumber, blockTag, hash, signature } = parameters\n\n const result = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n address,\n abi: erc1271Abi,\n args: [hash, signature],\n blockNumber,\n blockTag,\n functionName: 'isValidSignature',\n }).catch((error) => {\n if (error instanceof ContractFunctionExecutionError)\n throw new VerificationError()\n throw error\n })\n\n if (result.startsWith('0x1626ba7e')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc1271 {\n export type Parameters = Pick & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n }\n}\n\nclass VerificationError extends Error {}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ByteArray,\n Hex,\n SignableMessage,\n Signature,\n} from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { HashMessageErrorType } from '../../utils/signature/hashMessage.js'\nimport { hashMessage } from '../../utils/signature/hashMessage.js'\nimport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n verifyHash,\n} from './verifyHash.js'\n\nexport type VerifyMessageParameters = Prettify<\n Omit & {\n /** The address that signed the original message. */\n address: Address\n /** The message to be verified. */\n message: SignableMessage\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex | ByteArray | Signature\n }\n>\n\nexport type VerifyMessageReturnType = boolean\n\nexport type VerifyMessageErrorType =\n | HashMessageErrorType\n | VerifyHashErrorType\n | ErrorType\n\n/**\n * Verify that a message was signed by the provided address.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyMessage}\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifyMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifyMessageReturnType}\n */\nexport async function verifyMessage(\n client: Client,\n {\n address,\n message,\n factory,\n factoryData,\n signature,\n ...callRequest\n }: VerifyMessageParameters,\n): Promise {\n const hash = hashMessage(message)\n return getAction(\n client,\n verifyHash,\n 'verifyHash',\n )({\n address,\n factory: factory!,\n factoryData: factoryData!,\n hash,\n signature,\n ...callRequest,\n })\n}\n","import type { Address, TypedData } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { TypedDataDefinition } from '../../types/typedData.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type HashTypedDataErrorType,\n hashTypedData,\n} from '../../utils/signature/hashTypedData.js'\nimport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n verifyHash,\n} from './verifyHash.js'\n\nexport type VerifyTypedDataParameters<\n typedData extends TypedData | Record = TypedData,\n primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n> = Omit &\n TypedDataDefinition & {\n /** The address to verify the typed data for. */\n address: Address\n /** The signature to verify */\n signature: Hex | ByteArray | Signature\n }\n\nexport type VerifyTypedDataReturnType = boolean\n\nexport type VerifyTypedDataErrorType =\n | HashTypedDataErrorType\n | VerifyHashErrorType\n | ErrorType\n\n/**\n * Verify that typed data was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyTypedData}\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifyTypedDataParameters}\n * @returns Whether or not the signature is valid. {@link VerifyTypedDataReturnType}\n */\nexport async function verifyTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n chain extends Chain | undefined,\n>(\n client: Client,\n parameters: VerifyTypedDataParameters,\n): Promise {\n const {\n address,\n factory,\n factoryData,\n signature,\n message,\n primaryType,\n types,\n domain,\n ...callRequest\n } = parameters as VerifyTypedDataParameters\n const hash = hashTypedData({ message, primaryType, types, domain })\n return getAction(\n client,\n verifyHash,\n 'verifyHash',\n )({\n address,\n factory: factory!,\n factoryData: factoryData!,\n hash,\n signature,\n ...callRequest,\n })\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BlockNotFoundError } from '../../errors/block.js'\nimport {\n TransactionNotFoundError,\n TransactionReceiptNotFoundError,\n WaitForTransactionReceiptTimeoutError,\n type WaitForTransactionReceiptTimeoutErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { Transaction } from '../../types/transaction.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { withResolvers } from '../../utils/promise/withResolvers.js'\nimport {\n type WithRetryParameters,\n withRetry,\n} from '../../utils/promise/withRetry.js'\nimport { stringify } from '../../utils/stringify.js'\n\nimport { type GetBlockErrorType, getBlock } from './getBlock.js'\nimport {\n type GetTransactionErrorType,\n type GetTransactionReturnType,\n getTransaction,\n} from './getTransaction.js'\nimport {\n type GetTransactionReceiptErrorType,\n type GetTransactionReceiptReturnType,\n getTransactionReceipt,\n} from './getTransactionReceipt.js'\nimport {\n type WatchBlockNumberErrorType,\n watchBlockNumber,\n} from './watchBlockNumber.js'\n\nexport type ReplacementReason = 'cancelled' | 'replaced' | 'repriced'\nexport type ReplacementReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = {\n reason: ReplacementReason\n replacedTransaction: Transaction\n transaction: Transaction\n transactionReceipt: GetTransactionReceiptReturnType\n}\n\nexport type WaitForTransactionReceiptReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = GetTransactionReceiptReturnType\n\nexport type WaitForTransactionReceiptParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = {\n /**\n * Whether to check for transaction replacements.\n * @default true\n */\n checkReplacement?: boolean | undefined\n /**\n * The number of confirmations (blocks that have passed) to wait before resolving.\n * @default 1\n */\n confirmations?: number | undefined\n /** The hash of the transaction. */\n hash: Hash\n /** Optional callback to emit if the transaction has been replaced. */\n onReplaced?: ((response: ReplacementReturnType) => void) | undefined\n /**\n * Polling frequency (in ms). Defaults to the client's pollingInterval config.\n * @default client.pollingInterval\n */\n pollingInterval?: number | undefined\n /**\n * Number of times to retry if the transaction or block is not found.\n * @default 6 (exponential backoff)\n */\n retryCount?: WithRetryParameters['retryCount'] | undefined\n /**\n * Time to wait (in ms) between retries.\n * @default `({ count }) => ~~(1 << count) * 200` (exponential backoff)\n */\n retryDelay?: WithRetryParameters['delay'] | undefined\n /**\n * Optional timeout (in milliseconds) to wait before stopping polling.\n * @default 180_000\n */\n timeout?: number | undefined\n}\n\nexport type WaitForTransactionReceiptErrorType =\n | ObserveErrorType\n | GetBlockErrorType\n | GetTransactionErrorType\n | GetTransactionReceiptErrorType\n | WatchBlockNumberErrorType\n | WaitForTransactionReceiptTimeoutErrorType\n | ErrorType\n\n/**\n * Waits for the [Transaction](https://viem.sh/docs/glossary/terms#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt).\n *\n * - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_sending-transactions\n * - JSON-RPC Methods:\n * - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed.\n * - If a Transaction has been replaced:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions\n * - Checks if one of the Transactions is a replacement\n * - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt).\n *\n * The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions).\n *\n * Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce.\n *\n * There are 3 types of Transaction Replacement reasons:\n *\n * - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`)\n * - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`)\n * - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`)\n *\n * @param client - Client to use\n * @param parameters - {@link WaitForTransactionReceiptParameters}\n * @returns The transaction receipt. {@link WaitForTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, waitForTransactionReceipt, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await waitForTransactionReceipt(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function waitForTransactionReceipt<\n chain extends Chain | undefined,\n>(\n client: Client,\n parameters: WaitForTransactionReceiptParameters,\n): Promise> {\n const {\n checkReplacement = true,\n confirmations = 1,\n hash,\n onReplaced,\n retryCount = 6,\n retryDelay = ({ count }) => ~~(1 << count) * 200, // exponential backoff\n timeout = 180_000,\n } = parameters\n\n const observerId = stringify(['waitForTransactionReceipt', client.uid, hash])\n\n const pollingInterval = (() => {\n if (parameters.pollingInterval) return parameters.pollingInterval\n if (client.chain?.experimental_preconfirmationTime)\n return client.chain.experimental_preconfirmationTime\n return client.pollingInterval\n })()\n\n let transaction: GetTransactionReturnType | undefined\n let replacedTransaction: GetTransactionReturnType | undefined\n let receipt: GetTransactionReceiptReturnType | undefined\n let retrying = false\n\n let _unobserve: () => void\n let _unwatch: () => void\n\n const { promise, resolve, reject } =\n withResolvers>()\n\n const timer = timeout\n ? setTimeout(() => {\n _unwatch?.()\n _unobserve?.()\n reject(new WaitForTransactionReceiptTimeoutError({ hash }))\n }, timeout)\n : undefined\n\n _unobserve = observe(\n observerId,\n { onReplaced, resolve, reject },\n async (emit) => {\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({ hash }).catch(() => undefined)\n\n if (receipt && confirmations <= 1) {\n clearTimeout(timer)\n emit.resolve(receipt)\n _unobserve?.()\n return\n }\n\n _unwatch = getAction(\n client,\n watchBlockNumber,\n 'watchBlockNumber',\n )({\n emitMissed: true,\n emitOnBegin: true,\n poll: true,\n pollingInterval,\n async onBlockNumber(blockNumber_) {\n const done = (fn: () => void) => {\n clearTimeout(timer)\n _unwatch?.()\n fn()\n _unobserve?.()\n }\n\n let blockNumber = blockNumber_\n\n if (retrying) return\n\n try {\n // If we already have a valid receipt, let's check if we have enough\n // confirmations. If we do, then we can resolve.\n if (receipt) {\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n done(() => emit.resolve(receipt!))\n return\n }\n\n // Get the transaction to check if it's been replaced.\n // We need to retry as some RPC Providers may be slow to sync\n // up mined transactions.\n if (checkReplacement && !transaction) {\n retrying = true\n await withRetry(\n async () => {\n transaction = (await getAction(\n client,\n getTransaction,\n 'getTransaction',\n )({ hash })) as GetTransactionReturnType\n if (transaction.blockNumber)\n blockNumber = transaction.blockNumber\n },\n {\n delay: retryDelay,\n retryCount,\n },\n )\n retrying = false\n }\n\n // Get the receipt to check if it's been processed.\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({ hash })\n\n // Check if we have enough confirmations. If not, continue polling.\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n done(() => emit.resolve(receipt!))\n } catch (err) {\n // If the receipt is not found, the transaction will be pending.\n // We need to check if it has potentially been replaced.\n if (\n err instanceof TransactionNotFoundError ||\n err instanceof TransactionReceiptNotFoundError\n ) {\n if (!transaction) {\n retrying = false\n return\n }\n\n try {\n replacedTransaction = transaction\n\n // Let's retrieve the transactions from the current block.\n // We need to retry as some RPC Providers may be slow to sync\n // up mined blocks.\n retrying = true\n const block = await withRetry(\n () =>\n getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockNumber,\n includeTransactions: true,\n }),\n {\n delay: retryDelay,\n retryCount,\n shouldRetry: ({ error }) =>\n error instanceof BlockNotFoundError,\n },\n )\n retrying = false\n\n const replacementTransaction = (\n block.transactions as {} as Transaction[]\n ).find(\n ({ from, nonce }) =>\n from === replacedTransaction!.from &&\n nonce === replacedTransaction!.nonce,\n )\n\n // If we couldn't find a replacement transaction, continue polling.\n if (!replacementTransaction) return\n\n // If we found a replacement transaction, return it's receipt.\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({\n hash: replacementTransaction.hash,\n })\n\n // Check if we have enough confirmations. If not, continue polling.\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n let reason: ReplacementReason = 'replaced'\n if (\n replacementTransaction.to === replacedTransaction.to &&\n replacementTransaction.value === replacedTransaction.value &&\n replacementTransaction.input === replacedTransaction.input\n ) {\n reason = 'repriced'\n } else if (\n replacementTransaction.from === replacementTransaction.to &&\n replacementTransaction.value === 0n\n ) {\n reason = 'cancelled'\n }\n\n done(() => {\n emit.onReplaced?.({\n reason,\n replacedTransaction: replacedTransaction! as any,\n transaction: replacementTransaction,\n transactionReceipt: receipt!,\n })\n emit.resolve(receipt!)\n })\n } catch (err_) {\n done(() => emit.reject(err_))\n }\n } else {\n done(() => emit.reject(err))\n }\n }\n },\n })\n },\n )\n\n return promise\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { HasTransportType } from '../../types/transport.js'\nimport { hexToBigInt } from '../../utils/encoding/fromHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { observe } from '../../utils/observe.js'\nimport { type PollErrorType, poll } from '../../utils/poll.js'\nimport { stringify } from '../../utils/stringify.js'\n\nimport {\n type GetBlockNumberReturnType,\n getBlockNumber,\n} from './getBlockNumber.js'\n\nexport type OnBlockNumberParameter = GetBlockNumberReturnType\nexport type OnBlockNumberFn = (\n blockNumber: OnBlockNumberParameter,\n prevBlockNumber: OnBlockNumberParameter | undefined,\n) => void\n\nexport type WatchBlockNumberParameters<\n transport extends Transport = Transport,\n> = {\n /** The callback to call when a new block number is received. */\n onBlockNumber: OnBlockNumberFn\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n} & (\n | (HasTransportType extends true\n ? {\n emitMissed?: undefined\n emitOnBegin?: undefined\n /** Whether or not the WebSocket Transport should poll the JSON-RPC, rather than using `eth_subscribe`. */\n poll?: false | undefined\n pollingInterval?: undefined\n }\n : never)\n | {\n /** Whether or not to emit the missed block numbers to the callback. */\n emitMissed?: boolean | undefined\n /** Whether or not to emit the latest block number to the callback when the subscription opens. */\n emitOnBegin?: boolean | undefined\n poll?: true | undefined\n /** Polling frequency (in ms). Defaults to Client's pollingInterval config. */\n pollingInterval?: number | undefined\n }\n)\n\nexport type WatchBlockNumberReturnType = () => void\n\nexport type WatchBlockNumberErrorType = PollErrorType | ErrorType\n\n/**\n * Watches and returns incoming block numbers.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchBlockNumberParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, watchBlockNumber, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchBlockNumber(client, {\n * onBlockNumber: (blockNumber) => console.log(blockNumber),\n * })\n */\nexport function watchBlockNumber<\n chain extends Chain | undefined,\n transport extends Transport,\n>(\n client: Client,\n {\n emitOnBegin = false,\n emitMissed = false,\n onBlockNumber,\n onError,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n }: WatchBlockNumberParameters,\n): WatchBlockNumberReturnType {\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n\n let prevBlockNumber: GetBlockNumberReturnType | undefined\n\n const pollBlockNumber = () => {\n const observerId = stringify([\n 'watchBlockNumber',\n client.uid,\n emitOnBegin,\n emitMissed,\n pollingInterval,\n ])\n\n return observe(observerId, { onBlockNumber, onError }, (emit) =>\n poll(\n async () => {\n try {\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({ cacheTime: 0 })\n\n if (prevBlockNumber !== undefined) {\n // If the current block number is the same as the previous,\n // we can skip.\n if (blockNumber === prevBlockNumber) return\n\n // If we have missed out on some previous blocks, and the\n // `emitMissed` flag is truthy, let's emit those blocks.\n if (blockNumber - prevBlockNumber > 1 && emitMissed) {\n for (let i = prevBlockNumber + 1n; i < blockNumber; i++) {\n emit.onBlockNumber(i, prevBlockNumber)\n prevBlockNumber = i\n }\n }\n }\n\n // If the next block number is greater than the previous,\n // it is not in the past, and we can emit the new block number.\n if (\n prevBlockNumber === undefined ||\n blockNumber > prevBlockNumber\n ) {\n emit.onBlockNumber(blockNumber, prevBlockNumber)\n prevBlockNumber = blockNumber\n }\n } catch (err) {\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin,\n interval: pollingInterval,\n },\n ),\n )\n }\n\n const subscribeBlockNumber = () => {\n const observerId = stringify([\n 'watchBlockNumber',\n client.uid,\n emitOnBegin,\n emitMissed,\n ])\n\n return observe(observerId, { onBlockNumber, onError }, (emit) => {\n let active = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['newHeads'],\n onData(data: any) {\n if (!active) return\n const blockNumber = hexToBigInt(data.result?.number)\n emit.onBlockNumber(blockNumber, prevBlockNumber)\n prevBlockNumber = blockNumber\n },\n onError(error: Error) {\n emit.onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n })\n }\n\n return enablePolling ? pollBlockNumber() : subscribeBlockNumber()\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { HasTransportType } from '../../types/transport.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { observe } from '../../utils/observe.js'\nimport { type PollErrorType, poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\n\nimport { type GetBlockReturnType, getBlock } from './getBlock.js'\n\nexport type OnBlockParameter<\n chain extends Chain | undefined = Chain,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = GetBlockReturnType\n\nexport type OnBlock<\n chain extends Chain | undefined = Chain,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = (\n block: OnBlockParameter,\n prevBlock: OnBlockParameter | undefined,\n) => void\n\nexport type WatchBlocksParameters<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = {\n /** The callback to call when a new block is received. */\n onBlock: OnBlock\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n} & (\n | (HasTransportType extends true\n ? {\n blockTag?: undefined\n emitMissed?: undefined\n emitOnBegin?: undefined\n includeTransactions?: undefined\n /** Whether or not the WebSocket Transport should poll the JSON-RPC, rather than using `eth_subscribe`. */\n poll?: false | undefined\n pollingInterval?: undefined\n }\n : never)\n | {\n /** The block tag. Defaults to \"latest\". */\n blockTag?: blockTag | BlockTag | undefined\n /** Whether or not to emit the missed blocks to the callback. */\n emitMissed?: boolean | undefined\n /** Whether or not to emit the block to the callback when the subscription opens. */\n emitOnBegin?: boolean | undefined\n /** Whether or not to include transaction data in the response. */\n includeTransactions?: includeTransactions | undefined\n poll?: true | undefined\n /** Polling frequency (in ms). Defaults to the client's pollingInterval config. */\n pollingInterval?: number | undefined\n }\n)\n\nexport type WatchBlocksReturnType = () => void\n\nexport type WatchBlocksErrorType =\n | StringifyErrorType\n | PollErrorType\n | ErrorType\n\n/**\n * Watches and returns information for incoming blocks.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlocks\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchBlocksParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlocksReturnType}\n *\n * @example\n * import { createPublicClient, watchBlocks, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchBlocks(client, {\n * onBlock: (block) => console.log(block),\n * })\n */\nexport function watchBlocks<\n transport extends Transport,\n chain extends Chain | undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client,\n {\n blockTag = client.experimental_blockTag ?? 'latest',\n emitMissed = false,\n emitOnBegin = false,\n onBlock,\n onError,\n includeTransactions: includeTransactions_,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n }: WatchBlocksParameters,\n): WatchBlocksReturnType {\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n const includeTransactions = includeTransactions_ ?? false\n\n let prevBlock:\n | GetBlockReturnType\n | undefined\n\n const pollBlocks = () => {\n const observerId = stringify([\n 'watchBlocks',\n client.uid,\n blockTag,\n emitMissed,\n emitOnBegin,\n includeTransactions,\n pollingInterval,\n ])\n\n return observe(observerId, { onBlock, onError }, (emit) =>\n poll(\n async () => {\n try {\n const block = await getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockTag,\n includeTransactions,\n })\n if (block.number !== null && prevBlock?.number != null) {\n // If the current block number is the same as the previous,\n // we can skip.\n if (block.number === prevBlock.number) return\n\n // If we have missed out on some previous blocks, and the\n // `emitMissed` flag is truthy, let's emit those blocks.\n if (block.number - prevBlock.number > 1 && emitMissed) {\n for (let i = prevBlock?.number + 1n; i < block.number; i++) {\n const block = (await getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockNumber: i,\n includeTransactions,\n })) as GetBlockReturnType\n emit.onBlock(block as any, prevBlock as any)\n prevBlock = block\n }\n }\n }\n\n if (\n // If no previous block exists, emit.\n prevBlock?.number == null ||\n // If the block tag is \"pending\" with no block number, emit.\n (blockTag === 'pending' && block?.number == null) ||\n // If the next block number is greater than the previous block number, emit.\n // We don't want to emit blocks in the past.\n (block.number !== null && block.number > prevBlock.number)\n ) {\n emit.onBlock(block as any, prevBlock as any)\n prevBlock = block as any\n }\n } catch (err) {\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin,\n interval: pollingInterval,\n },\n ),\n )\n }\n\n const subscribeBlocks = () => {\n let active = true\n let emitFetched = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n if (emitOnBegin) {\n getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockTag,\n includeTransactions,\n })\n .then((block) => {\n if (!active) return\n if (!emitFetched) return\n onBlock(block as any, undefined)\n emitFetched = false\n })\n .catch(onError)\n }\n\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['newHeads'],\n async onData(data: any) {\n if (!active) return\n const block = (await getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockNumber: data.result?.number,\n includeTransactions,\n }).catch(() => {})) as GetBlockReturnType\n if (!active) return\n onBlock(block as any, prevBlock as any)\n emitFetched = false\n prevBlock = block\n },\n onError(error: Error) {\n onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n }\n\n return enablePolling ? pollBlocks() : subscribeBlocks()\n}\n","import type { AbiEvent, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n} from '../../errors/abi.js'\nimport { InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { LogTopic } from '../../types/misc.js'\nimport type { GetPollOptions } from '../../types/transport.js'\nimport { decodeEventLog } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { formatLog } from '../../utils/formatters/log.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\nimport {\n type CreateEventFilterParameters,\n createEventFilter,\n} from './createEventFilter.js'\nimport { getBlockNumber } from './getBlockNumber.js'\nimport { getFilterChanges } from './getFilterChanges.js'\nimport { type GetLogsParameters, getLogs } from './getLogs.js'\nimport { uninstallFilter } from './uninstallFilter.js'\n\nexport type WatchEventOnLogsParameter<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n eventName extends string | undefined = MaybeAbiEventName,\n> = Log[]\nexport type WatchEventOnLogsFn<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n> = (\n logs: WatchEventOnLogsParameter,\n) => void\n\nexport type WatchEventParameters<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Block to start listening from. */\n fromBlock?: BlockNumber | undefined\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n /** The callback to call when new event logs are received. */\n onLogs: WatchEventOnLogsFn\n} & GetPollOptions &\n (\n | {\n event: abiEvent\n events?: undefined\n args?: MaybeExtractEventArgsFromAbi | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events?: abiEvents | undefined\n args?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events?: undefined\n args?: undefined\n strict?: undefined\n }\n )\n\nexport type WatchEventReturnType = () => void\n\nexport type WatchEventErrorType =\n | StringifyErrorType\n | ObserveErrorType\n | ErrorType\n\n/**\n * Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms#event-log).\n *\n * - Docs: https://viem.sh/docs/actions/public/watchEvent\n * - JSON-RPC Methods:\n * - **RPC Provider supports `eth_newFilter`:**\n * - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize).\n * - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges).\n * - **RPC Provider does not support `eth_newFilter`:**\n * - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval.\n *\n * This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent#onLogs).\n *\n * `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchEventParameters}\n * @returns A function that can be invoked to stop watching for new Event Logs. {@link WatchEventReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { watchEvent } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchEvent(client, {\n * onLogs: (logs) => console.log(logs),\n * })\n */\nexport function watchEvent<\n chain extends Chain | undefined,\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n _eventName extends string | undefined = undefined,\n>(\n client: Client,\n {\n address,\n args,\n batch = true,\n event,\n events,\n fromBlock,\n onError,\n onLogs,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n strict: strict_,\n }: WatchEventParameters,\n): WatchEventReturnType {\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (typeof fromBlock === 'bigint') return true\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n const strict = strict_ ?? false\n\n const pollEvent = () => {\n const observerId = stringify([\n 'watchEvent',\n address,\n args,\n batch,\n client.uid,\n event,\n pollingInterval,\n fromBlock,\n ])\n\n return observe(observerId, { onLogs, onError }, (emit) => {\n let previousBlockNumber: bigint\n if (fromBlock !== undefined) previousBlockNumber = fromBlock - 1n\n let filter: Filter<'event', abiEvents, _eventName, any>\n let initialized = false\n\n const unwatch = poll(\n async () => {\n if (!initialized) {\n try {\n filter = (await getAction(\n client,\n createEventFilter as any,\n 'createEventFilter',\n )({\n address,\n args,\n event: event!,\n events,\n strict,\n fromBlock,\n } as unknown as CreateEventFilterParameters)) as unknown as Filter<\n 'event',\n abiEvents,\n _eventName\n >\n } catch {}\n initialized = true\n return\n }\n\n try {\n let logs: Log[]\n if (filter) {\n logs = await getAction(\n client,\n getFilterChanges,\n 'getFilterChanges',\n )({ filter })\n } else {\n // If the filter doesn't exist, we will fall back to use `getLogs`.\n // The fall back exists because some RPC Providers do not support filters.\n\n // Fetch the block number to use for `getLogs`.\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({})\n\n // If the block number has changed, we will need to fetch the logs.\n // If the block number doesn't exist, we are yet to reach the first poll interval,\n // so do not emit any logs.\n if (previousBlockNumber && previousBlockNumber !== blockNumber) {\n logs = await getAction(\n client,\n getLogs,\n 'getLogs',\n )({\n address,\n args,\n event: event!,\n events,\n fromBlock: previousBlockNumber + 1n,\n toBlock: blockNumber,\n } as unknown as GetLogsParameters)\n } else {\n logs = []\n }\n previousBlockNumber = blockNumber\n }\n\n if (logs.length === 0) return\n if (batch) emit.onLogs(logs as any)\n else for (const log of logs) emit.onLogs([log] as any)\n } catch (err) {\n // If a filter has been set and gets uninstalled, providers will throw an InvalidInput error.\n // Reinitialize the filter when this occurs\n if (filter && err instanceof InvalidInputRpcError)\n initialized = false\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin: true,\n interval: pollingInterval,\n },\n )\n\n return async () => {\n if (filter)\n await getAction(\n client,\n uninstallFilter,\n 'uninstallFilter',\n )({ filter })\n unwatch()\n }\n })\n }\n\n const subscribeEvent = () => {\n let active = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const events_ = events ?? (event ? [event] : undefined)\n let topics: LogTopic[] = []\n if (events_) {\n const encoded = (events_ as AbiEvent[]).flatMap((event) =>\n encodeEventTopics({\n abi: [event],\n eventName: (event as AbiEvent).name,\n args,\n } as EncodeEventTopicsParameters),\n )\n // TODO: Clean up type casting\n topics = [encoded as LogTopic]\n if (event) topics = topics[0] as LogTopic[]\n }\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['logs', { address, topics }],\n onData(data: any) {\n if (!active) return\n const log = data.result\n try {\n const { eventName, args } = decodeEventLog({\n abi: events_ ?? [],\n data: log.data,\n topics: log.topics,\n strict,\n })\n const formatted = formatLog(log, { args, eventName })\n onLogs([formatted] as any)\n } catch (err) {\n let eventName: string | undefined\n let isUnnamed: boolean | undefined\n if (\n err instanceof DecodeLogDataMismatch ||\n err instanceof DecodeLogTopicsMismatch\n ) {\n // If strict mode is on, and log data/topics do not match event definition, skip.\n if (strict_) return\n eventName = err.abiItem.name\n isUnnamed = err.abiItem.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n }\n\n // Set args to empty if there is an error decoding (e.g. indexed/non-indexed params mismatch).\n const formatted = formatLog(log, {\n args: isUnnamed ? [] : {},\n eventName,\n })\n onLogs([formatted] as any)\n }\n },\n onError(error: Error) {\n onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n }\n\n return enablePolling ? pollEvent() : subscribeEvent()\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { GetPollOptions } from '../../types/transport.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\n\nimport { createPendingTransactionFilter } from './createPendingTransactionFilter.js'\nimport { getFilterChanges } from './getFilterChanges.js'\nimport { uninstallFilter } from './uninstallFilter.js'\n\nexport type OnTransactionsParameter = Hash[]\nexport type OnTransactionsFn = (transactions: OnTransactionsParameter) => void\n\nexport type WatchPendingTransactionsParameters<\n transport extends Transport = Transport,\n> = {\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n /** The callback to call when new transactions are received. */\n onTransactions: OnTransactionsFn\n} & GetPollOptions\n\nexport type WatchPendingTransactionsReturnType = () => void\n\nexport type WatchPendingTransactionsErrorType =\n | StringifyErrorType\n | ObserveErrorType\n | ErrorType\n\n/**\n * Watches and returns pending transaction hashes.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions\n * - JSON-RPC Methods:\n * - When `poll: true`\n * - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter.\n * - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newPendingTransactions\"` event.\n *\n * This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions#ontransactions).\n *\n * @param client - Client to use\n * @param parameters - {@link WatchPendingTransactionsParameters}\n * @returns A function that can be invoked to stop watching for new pending transaction hashes. {@link WatchPendingTransactionsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { watchPendingTransactions } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await watchPendingTransactions(client, {\n * onTransactions: (hashes) => console.log(hashes),\n * })\n */\nexport function watchPendingTransactions<\n transport extends Transport,\n chain extends Chain | undefined,\n>(\n client: Client,\n {\n batch = true,\n onError,\n onTransactions,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n }: WatchPendingTransactionsParameters,\n) {\n const enablePolling =\n typeof poll_ !== 'undefined'\n ? poll_\n : client.transport.type !== 'webSocket' && client.transport.type !== 'ipc'\n\n const pollPendingTransactions = () => {\n const observerId = stringify([\n 'watchPendingTransactions',\n client.uid,\n batch,\n pollingInterval,\n ])\n return observe(observerId, { onTransactions, onError }, (emit) => {\n let filter: Filter<'transaction'>\n\n const unwatch = poll(\n async () => {\n try {\n if (!filter) {\n try {\n filter = await getAction(\n client,\n createPendingTransactionFilter,\n 'createPendingTransactionFilter',\n )({})\n return\n } catch (err) {\n unwatch()\n throw err\n }\n }\n\n const hashes = await getAction(\n client,\n getFilterChanges,\n 'getFilterChanges',\n )({ filter })\n if (hashes.length === 0) return\n if (batch) emit.onTransactions(hashes)\n else for (const hash of hashes) emit.onTransactions([hash])\n } catch (err) {\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin: true,\n interval: pollingInterval,\n },\n )\n\n return async () => {\n if (filter)\n await getAction(\n client,\n uninstallFilter,\n 'uninstallFilter',\n )({ filter })\n unwatch()\n }\n })\n }\n\n const subscribePendingTransactions = () => {\n let active = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n const { unsubscribe: unsubscribe_ } = await client.transport.subscribe({\n params: ['newPendingTransactions'],\n onData(data: any) {\n if (!active) return\n const transaction = data.result\n onTransactions([transaction])\n },\n onError(error: Error) {\n onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n }\n\n return enablePolling\n ? pollPendingTransactions()\n : subscribePendingTransactions()\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport type { HashMessageErrorType } from '../../utils/signature/hashMessage.js'\nimport { hashMessage } from '../../utils/signature/hashMessage.js'\nimport { parseSiweMessage } from '../../utils/siwe/parseSiweMessage.js'\nimport {\n type ValidateSiweMessageParameters,\n validateSiweMessage,\n} from '../../utils/siwe/validateSiweMessage.js'\nimport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n verifyHash,\n} from '../public/verifyHash.js'\n\nexport type VerifySiweMessageParameters = Prettify<\n Pick &\n Pick<\n ValidateSiweMessageParameters,\n 'address' | 'domain' | 'nonce' | 'scheme' | 'time'\n > & {\n /**\n * EIP-4361 formatted message.\n */\n message: string\n /**\n * Signature to check against.\n */\n signature: Hex\n }\n>\n\nexport type VerifySiweMessageReturnType = boolean\n\nexport type VerifySiweMessageErrorType =\n | HashMessageErrorType\n | VerifyHashErrorType\n | ErrorType\n\n/**\n * Verifies [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) formatted message was signed.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/siwe/actions/verifySiweMessage}\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifySiweMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifySiweMessageReturnType}\n */\nexport async function verifySiweMessage(\n client: Client,\n parameters: VerifySiweMessageParameters,\n): Promise {\n const {\n address,\n domain,\n message,\n nonce,\n scheme,\n signature,\n time = new Date(),\n ...callRequest\n } = parameters\n\n const parsed = parseSiweMessage(message)\n if (!parsed.address) return false\n\n const isValid = validateSiweMessage({\n address,\n domain,\n message: parsed,\n nonce,\n scheme,\n time,\n })\n if (!isValid) return false\n\n const hash = hashMessage(message)\n return verifyHash(client, {\n address: parsed.address,\n hash,\n signature,\n ...callRequest,\n })\n}\n","import type { Address } from 'abitype'\n\nimport type { ExactPartial, Prettify } from '../../types/utils.js'\nimport type { SiweMessage } from './types.js'\n\n/**\n * @description Parses EIP-4361 formatted message into message fields object.\n *\n * @see https://eips.ethereum.org/EIPS/eip-4361\n *\n * @returns EIP-4361 fields object\n */\nexport function parseSiweMessage(\n message: string,\n): Prettify> {\n const { scheme, statement, ...prefix } = (message.match(prefixRegex)\n ?.groups ?? {}) as {\n address: Address\n domain: string\n scheme?: string\n statement?: string\n }\n const { chainId, expirationTime, issuedAt, notBefore, requestId, ...suffix } =\n (message.match(suffixRegex)?.groups ?? {}) as {\n chainId: string\n expirationTime?: string\n issuedAt?: string\n nonce: string\n notBefore?: string\n requestId?: string\n uri: string\n version: '1'\n }\n const resources = message.split('Resources:')[1]?.split('\\n- ').slice(1)\n return {\n ...prefix,\n ...suffix,\n ...(chainId ? { chainId: Number(chainId) } : {}),\n ...(expirationTime ? { expirationTime: new Date(expirationTime) } : {}),\n ...(issuedAt ? { issuedAt: new Date(issuedAt) } : {}),\n ...(notBefore ? { notBefore: new Date(notBefore) } : {}),\n ...(requestId ? { requestId } : {}),\n ...(resources ? { resources } : {}),\n ...(scheme ? { scheme } : {}),\n ...(statement ? { statement } : {}),\n }\n}\n\n// https://regexr.com/80gdj\nconst prefixRegex =\n /^(?:(?[a-zA-Z][a-zA-Z0-9+-.]*):\\/\\/)?(?[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\\n)(?
0x[a-fA-F0-9]{40})\\n\\n(?:(?.*)\\n\\n)?/\n\n// https://regexr.com/80gf9\nconst suffixRegex =\n /(?:URI: (?.+))\\n(?:Version: (?.+))\\n(?:Chain ID: (?\\d+))\\n(?:Nonce: (?[a-zA-Z0-9]+))\\n(?:Issued At: (?.+))(?:\\nExpiration Time: (?.+))?(?:\\nNot Before: (?.+))?(?:\\nRequest ID: (?.+))?/\n","import type { Address } from 'abitype'\n\nimport type { ExactPartial } from '../../types/utils.js'\nimport { isAddress } from '../address/isAddress.js'\nimport { isAddressEqual } from '../address/isAddressEqual.js'\nimport type { SiweMessage } from './types.js'\n\nexport type ValidateSiweMessageParameters = {\n /**\n * Ethereum address to check against.\n */\n address?: Address | undefined\n /**\n * [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986) authority to check against.\n */\n domain?: string | undefined\n /**\n * EIP-4361 message fields.\n */\n message: ExactPartial\n /**\n * Random string to check against.\n */\n nonce?: string | undefined\n /**\n * [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#section-3.1) URI scheme to check against.\n */\n scheme?: string | undefined\n /**\n * Current time to check optional `expirationTime` and `notBefore` fields.\n *\n * @default new Date()\n */\n time?: Date | undefined\n}\n\nexport type ValidateSiweMessageReturnType = boolean\n\n/**\n * @description Validates EIP-4361 message.\n *\n * @see https://eips.ethereum.org/EIPS/eip-4361\n */\nexport function validateSiweMessage(\n parameters: ValidateSiweMessageParameters,\n): ValidateSiweMessageReturnType {\n const {\n address,\n domain,\n message,\n nonce,\n scheme,\n time = new Date(),\n } = parameters\n\n if (domain && message.domain !== domain) return false\n if (nonce && message.nonce !== nonce) return false\n if (scheme && message.scheme !== scheme) return false\n\n if (message.expirationTime && time >= message.expirationTime) return false\n if (message.notBefore && time < message.notBefore) return false\n\n try {\n if (!message.address) return false\n if (!isAddress(message.address, { strict: false })) return false\n if (address && !isAddressEqual(message.address, address)) return false\n } catch {\n return false\n }\n\n return true\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { TransactionReceiptRevertedError } from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { TransactionSerializedGeneric } from '../../types/transaction.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { formatTransactionReceipt } from '../../utils/formatters/transactionReceipt.js'\nimport type { FormattedTransactionReceipt } from '../../utils/index.js'\n\nexport type SendRawTransactionSyncParameters = {\n /** The signed serialized transaction. */\n serializedTransaction: TransactionSerializedGeneric\n /** Whether to throw an error if the transaction was detected as reverted. @default true */\n throwOnReceiptRevert?: boolean | undefined\n /** The timeout for the transaction. */\n timeout?: number | undefined\n}\n\nexport type SendRawTransactionSyncReturnType<\n chain extends Chain | undefined = undefined,\n> = FormattedTransactionReceipt\n\nexport type SendRawTransactionSyncErrorType = RequestErrorType | ErrorType\n\n/**\n * Sends a **signed** transaction to the network synchronously,\n * and waits for the transaction to be included in a block.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransactionSync\n * - JSON-RPC Method: [`eth_sendRawTransactionSync`](https://eips.ethereum.org/EIPS/eip-7966)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction receipt. {@link SendRawTransactionSyncReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransactionSync } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const receipt = await sendRawTransactionSync(client, {\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\nexport async function sendRawTransactionSync(\n client: Client,\n {\n serializedTransaction,\n throwOnReceiptRevert,\n timeout,\n }: SendRawTransactionSyncParameters,\n): Promise> {\n const receipt = await client.request(\n {\n method: 'eth_sendRawTransactionSync',\n params: timeout\n ? [serializedTransaction, timeout]\n : [serializedTransaction],\n },\n { retryCount: 0 },\n )\n const format =\n client.chain?.formatters?.transactionReceipt?.format ||\n formatTransactionReceipt\n\n const formatted = format(receipt) as SendRawTransactionSyncReturnType\n if (formatted.status === 'reverted' && throwOnReceiptRevert)\n throw new TransactionReceiptRevertedError({ receipt: formatted })\n return formatted\n}\n","import type { Address } from 'abitype'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Account, ParseAccount } from '../types/account.js'\nimport type { Chain } from '../types/chain.js'\nimport type { PublicRpcSchema, RpcSchema } from '../types/eip1193.js'\nimport type { Prettify } from '../types/utils.js'\nimport {\n type Client,\n type ClientConfig,\n type CreateClientErrorType,\n createClient,\n} from './createClient.js'\nimport { type PublicActions, publicActions } from './decorators/public.js'\nimport type { Transport } from './transports/createTransport.js'\n\nexport type PublicClientConfig<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n accountOrAddress extends Account | Address | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = Prettify<\n Pick<\n ClientConfig,\n | 'batch'\n | 'cacheTime'\n | 'ccipRead'\n | 'chain'\n | 'experimental_blockTag'\n | 'key'\n | 'name'\n | 'pollingInterval'\n | 'rpcSchema'\n | 'transport'\n >\n>\n\nexport type PublicClient<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n accountOrAddress extends Account | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = Prettify<\n Client<\n transport,\n chain,\n accountOrAddress,\n rpcSchema extends RpcSchema\n ? [...PublicRpcSchema, ...rpcSchema]\n : PublicRpcSchema,\n PublicActions\n >\n>\n\nexport type CreatePublicClientErrorType = CreateClientErrorType | ErrorType\n\n/**\n * Creates a Public Client with a given [Transport](https://viem.sh/docs/clients/intro) configured for a [Chain](https://viem.sh/docs/clients/chains).\n *\n * - Docs: https://viem.sh/docs/clients/public\n *\n * A Public Client is an interface to \"public\" [JSON-RPC API](https://ethereum.org/en/developers/docs/apis/json-rpc/) methods such as retrieving block numbers, transactions, reading from smart contracts, etc through [Public Actions](/docs/actions/public/introduction).\n *\n * @param config - {@link PublicClientConfig}\n * @returns A Public Client. {@link PublicClient}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n */\nexport function createPublicClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n accountOrAddress extends Account | Address | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n parameters: PublicClientConfig,\n): PublicClient, rpcSchema> {\n const { key = 'public', name = 'Public Client' } = parameters\n const client = createClient({\n ...parameters,\n key,\n name,\n type: 'publicClient',\n })\n return client.extend(publicActions) as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { EIP1193RequestFn } from '../../types/eip1193.js'\nimport type { OneOf } from '../../types/utils.js'\nimport { buildRequest } from '../../utils/buildRequest.js'\nimport { uid as uid_ } from '../../utils/uid.js'\nimport type { ClientConfig } from '../createClient.js'\n\nexport type TransportConfig<\n type extends string = string,\n eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn,\n> = {\n /** The name of the transport. */\n name: string\n /** The key of the transport. */\n key: string\n /** Methods to include or exclude from executing RPC requests. */\n methods?:\n | OneOf<\n | {\n include?: string[] | undefined\n }\n | {\n exclude?: string[] | undefined\n }\n >\n | undefined\n /** The JSON-RPC request function that matches the EIP-1193 request spec. */\n request: eip1193RequestFn\n /** The base delay (in ms) between retries. */\n retryDelay?: number | undefined\n /** The max number of times to retry. */\n retryCount?: number | undefined\n /** The timeout (in ms) for requests. */\n timeout?: number | undefined\n /** The type of the transport. */\n type: type\n}\n\nexport type Transport<\n type extends string = string,\n rpcAttributes = Record,\n eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn,\n> = ({\n chain,\n}: {\n account?: Account | undefined\n chain?: chain | undefined\n pollingInterval?: ClientConfig['pollingInterval'] | undefined\n retryCount?: TransportConfig['retryCount'] | undefined\n timeout?: TransportConfig['timeout'] | undefined\n}) => {\n config: TransportConfig\n request: eip1193RequestFn\n value?: rpcAttributes | undefined\n}\n\nexport type CreateTransportErrorType = ErrorType\n\n/**\n * @description Creates an transport intended to be used with a client.\n */\nexport function createTransport<\n type extends string,\n rpcAttributes extends Record,\n>(\n {\n key,\n methods,\n name,\n request,\n retryCount = 3,\n retryDelay = 150,\n timeout,\n type,\n }: TransportConfig,\n value?: rpcAttributes | undefined,\n): ReturnType> {\n const uid = uid_()\n return {\n config: {\n key,\n methods,\n name,\n request,\n retryCount,\n retryDelay,\n timeout,\n type,\n },\n request: buildRequest(request, { methods, retryCount, retryDelay, uid }),\n value,\n }\n}\n","import { RpcRequestError } from '../../errors/request.js'\nimport {\n UrlRequiredError,\n type UrlRequiredErrorType,\n} from '../../errors/transport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { EIP1193RequestFn, RpcSchema } from '../../types/eip1193.js'\nimport type { RpcRequest } from '../../types/rpc.js'\nimport { createBatchScheduler } from '../../utils/promise/createBatchScheduler.js'\nimport {\n getHttpRpcClient,\n type HttpRpcClientOptions,\n} from '../../utils/rpc/http.js'\n\nimport {\n type CreateTransportErrorType,\n createTransport,\n type Transport,\n type TransportConfig,\n} from './createTransport.js'\n\nexport type HttpTransportConfig<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n> = {\n /**\n * Whether to enable Batch JSON-RPC.\n * @link https://www.jsonrpc.org/specification#batch\n */\n batch?:\n | boolean\n | {\n /** The maximum number of JSON-RPC requests to send in a batch. @default 1_000 */\n batchSize?: number | undefined\n /** The maximum number of milliseconds to wait before sending a batch. @default 0 */\n wait?: number | undefined\n }\n | undefined\n fetchFn?: HttpRpcClientOptions['fetchFn'] | undefined\n /**\n * Request configuration to pass to `fetch`.\n * @link https://developer.mozilla.org/en-US/docs/Web/API/fetch\n */\n fetchOptions?: HttpRpcClientOptions['fetchOptions'] | undefined\n /** A callback to handle the response from `fetch`. */\n onFetchRequest?: HttpRpcClientOptions['onRequest'] | undefined\n /** A callback to handle the response from `fetch`. */\n onFetchResponse?: HttpRpcClientOptions['onResponse'] | undefined\n /** The key of the HTTP transport. */\n key?: TransportConfig['key'] | undefined\n /** Methods to include or exclude from executing RPC requests. */\n methods?: TransportConfig['methods'] | undefined\n /** The name of the HTTP transport. */\n name?: TransportConfig['name'] | undefined\n /** Whether to return JSON RPC errors as responses instead of throwing. */\n raw?: raw | boolean | undefined\n /** The max number of times to retry. */\n retryCount?: TransportConfig['retryCount'] | undefined\n /** The base delay (in ms) between retries. */\n retryDelay?: TransportConfig['retryDelay'] | undefined\n /** Typed JSON-RPC schema for the transport. */\n rpcSchema?: rpcSchema | RpcSchema | undefined\n /** The timeout (in ms) for the HTTP request. Default: 10_000 */\n timeout?: TransportConfig['timeout'] | undefined\n}\n\nexport type HttpTransport<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n> = Transport<\n 'http',\n {\n fetchOptions?: HttpTransportConfig['fetchOptions'] | undefined\n url?: string | undefined\n },\n EIP1193RequestFn\n>\n\nexport type HttpTransportErrorType =\n | CreateTransportErrorType\n | UrlRequiredErrorType\n | ErrorType\n\n/**\n * @description Creates a HTTP transport that connects to a JSON-RPC API.\n */\nexport function http<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n>(\n /** URL of the JSON-RPC API. Defaults to the chain's public RPC URL. */\n url?: string | undefined,\n config: HttpTransportConfig = {},\n): HttpTransport {\n const {\n batch,\n fetchFn,\n fetchOptions,\n key = 'http',\n methods,\n name = 'HTTP JSON-RPC',\n onFetchRequest,\n onFetchResponse,\n retryDelay,\n raw,\n } = config\n return ({ chain, retryCount: retryCount_, timeout: timeout_ }) => {\n const { batchSize = 1000, wait = 0 } =\n typeof batch === 'object' ? batch : {}\n const retryCount = config.retryCount ?? retryCount_\n const timeout = timeout_ ?? config.timeout ?? 10_000\n const url_ = url || chain?.rpcUrls.default.http[0]\n if (!url_) throw new UrlRequiredError()\n\n const rpcClient = getHttpRpcClient(url_, {\n fetchFn,\n fetchOptions,\n onRequest: onFetchRequest,\n onResponse: onFetchResponse,\n timeout,\n })\n\n return createTransport(\n {\n key,\n methods,\n name,\n async request({ method, params }) {\n const body = { method, params }\n\n const { schedule } = createBatchScheduler({\n id: url_,\n wait,\n shouldSplitBatch(requests) {\n return requests.length > batchSize\n },\n fn: (body: RpcRequest[]) =>\n rpcClient.request({\n body,\n }),\n sort: (a, b) => a.id - b.id,\n })\n\n const fn = async (body: RpcRequest) =>\n batch\n ? schedule(body)\n : [\n await rpcClient.request({\n body,\n }),\n ]\n\n const [{ error, result }] = await fn(body)\n\n if (raw) return { error, result }\n if (error)\n throw new RpcRequestError({\n body,\n error,\n url: url_,\n })\n return result\n },\n retryCount,\n retryDelay,\n timeout,\n type: 'http',\n },\n {\n fetchOptions,\n url: url_,\n },\n )\n }\n}\n","import { BaseError } from './base.js'\n\nexport type UrlRequiredErrorType = UrlRequiredError & {\n name: 'UrlRequiredError'\n}\nexport class UrlRequiredError extends BaseError {\n constructor() {\n super(\n 'No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.',\n {\n docsPath: '/docs/clients/intro',\n name: 'UrlRequiredError',\n },\n )\n }\n}\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n type Abi,\n type AbiEvent,\n type AbiFunction,\n type AbiParameter,\n type AbiParameterKind,\n type AbiParameterToPrimitiveType,\n type AbiStateMutability,\n type Address,\n CircularReferenceError,\n InvalidAbiItemError,\n InvalidAbiParameterError,\n InvalidAbiParametersError,\n InvalidAbiTypeParameterError,\n InvalidFunctionModifierError,\n InvalidModifierError,\n InvalidParameterError,\n InvalidParenthesisError,\n InvalidSignatureError,\n InvalidStructSignatureError,\n type Narrow,\n type ParseAbi,\n type ParseAbiItem,\n type ParseAbiParameter,\n type ParseAbiParameters,\n parseAbi,\n parseAbiItem,\n parseAbiParameter,\n parseAbiParameters,\n SolidityProtectedKeywordError,\n type TypedData,\n type TypedDataDomain,\n type TypedDataParameter,\n UnknownSignatureError,\n UnknownTypeError,\n} from 'abitype'\nexport type {\n BlockOverrides,\n Rpc as RpcBlockOverrides,\n} from 'ox/BlockOverrides'\nexport type { EntryPointVersion } from './account-abstraction/types/entryPointVersion.js'\nexport type {\n RpcEstimateUserOperationGasReturnType,\n RpcGetUserOperationByHashReturnType,\n RpcUserOperation,\n RpcUserOperationReceipt,\n RpcUserOperationRequest,\n} from './account-abstraction/types/rpc.js'\nexport type {\n EstimateUserOperationGasReturnType,\n GetUserOperationByHashReturnType,\n PackedUserOperation,\n UserOperation,\n UserOperationReceipt,\n UserOperationRequest,\n} from './account-abstraction/types/userOperation.js'\nexport type {\n Account,\n AccountSource,\n CustomSource,\n HDAccount,\n HDOptions,\n JsonRpcAccount,\n LocalAccount,\n PrivateKeyAccount,\n} from './accounts/types.js'\nexport type {\n GetEnsAddressErrorType,\n GetEnsAddressParameters,\n GetEnsAddressReturnType,\n} from './actions/ens/getEnsAddress.js'\nexport type {\n GetEnsAvatarErrorType,\n GetEnsAvatarParameters,\n GetEnsAvatarReturnType,\n} from './actions/ens/getEnsAvatar.js'\nexport type {\n GetEnsNameErrorType,\n GetEnsNameParameters,\n GetEnsNameReturnType,\n} from './actions/ens/getEnsName.js'\nexport type {\n GetEnsResolverErrorType,\n GetEnsResolverParameters,\n GetEnsResolverReturnType,\n} from './actions/ens/getEnsResolver.js'\nexport type {\n GetEnsTextErrorType,\n GetEnsTextParameters,\n GetEnsTextReturnType,\n} from './actions/ens/getEnsText.js'\nexport {\n type GetContractErrorType,\n type GetContractParameters,\n type GetContractReturnType,\n getContract,\n} from './actions/getContract.js'\nexport type {\n CallErrorType,\n CallParameters,\n CallReturnType,\n} from './actions/public/call.js'\nexport type {\n CreateAccessListErrorType,\n CreateAccessListParameters,\n CreateAccessListReturnType,\n} from './actions/public/createAccessList.js'\nexport type {\n CreateBlockFilterErrorType,\n CreateBlockFilterReturnType,\n} from './actions/public/createBlockFilter.js'\nexport type {\n CreateContractEventFilterErrorType,\n CreateContractEventFilterParameters,\n CreateContractEventFilterReturnType,\n} from './actions/public/createContractEventFilter.js'\nexport type {\n CreateEventFilterErrorType,\n CreateEventFilterParameters,\n CreateEventFilterReturnType,\n} from './actions/public/createEventFilter.js'\nexport type {\n CreatePendingTransactionFilterErrorType,\n CreatePendingTransactionFilterReturnType,\n} from './actions/public/createPendingTransactionFilter.js'\nexport type {\n EstimateContractGasErrorType,\n EstimateContractGasParameters,\n EstimateContractGasReturnType,\n} from './actions/public/estimateContractGas.js'\nexport type {\n EstimateFeesPerGasErrorType,\n EstimateFeesPerGasParameters,\n EstimateFeesPerGasReturnType,\n} from './actions/public/estimateFeesPerGas.js'\nexport type {\n EstimateGasErrorType,\n EstimateGasParameters,\n EstimateGasReturnType,\n} from './actions/public/estimateGas.js'\nexport type {\n EstimateMaxPriorityFeePerGasErrorType,\n EstimateMaxPriorityFeePerGasParameters,\n EstimateMaxPriorityFeePerGasReturnType,\n} from './actions/public/estimateMaxPriorityFeePerGas.js'\nexport type {\n FillTransactionErrorType,\n FillTransactionParameters,\n FillTransactionReturnType,\n} from './actions/public/fillTransaction.js'\nexport type {\n GetBalanceErrorType,\n GetBalanceParameters,\n GetBalanceReturnType,\n} from './actions/public/getBalance.js'\nexport type {\n GetBlobBaseFeeErrorType,\n GetBlobBaseFeeReturnType,\n} from './actions/public/getBlobBaseFee.js'\nexport type {\n GetBlockErrorType,\n GetBlockParameters,\n GetBlockReturnType,\n} from './actions/public/getBlock.js'\nexport type {\n GetBlockNumberErrorType,\n GetBlockNumberParameters,\n GetBlockNumberReturnType,\n} from './actions/public/getBlockNumber.js'\nexport type {\n GetBlockTransactionCountErrorType,\n GetBlockTransactionCountParameters,\n GetBlockTransactionCountReturnType,\n} from './actions/public/getBlockTransactionCount.js'\nexport type {\n GetChainIdErrorType,\n GetChainIdReturnType,\n} from './actions/public/getChainId.js'\nexport type {\n /** @deprecated Use `GetCodeErrorType` instead */\n GetCodeErrorType as GetBytecodeErrorType,\n GetCodeErrorType,\n /** @deprecated Use `GetCodeParameters` instead */\n GetCodeParameters as GetBytecodeParameters,\n GetCodeParameters,\n /** @deprecated Use `GetCodeReturnType` instead */\n GetCodeReturnType as GetBytecodeReturnType,\n GetCodeReturnType,\n} from './actions/public/getCode.js'\nexport type {\n GetContractEventsErrorType,\n GetContractEventsParameters,\n GetContractEventsReturnType,\n} from './actions/public/getContractEvents.js'\nexport type {\n GetDelegationErrorType,\n GetDelegationParameters,\n GetDelegationReturnType,\n} from './actions/public/getDelegation.js'\nexport type {\n GetEip712DomainErrorType,\n GetEip712DomainParameters,\n GetEip712DomainReturnType,\n} from './actions/public/getEip712Domain.js'\nexport type {\n GetFeeHistoryErrorType,\n GetFeeHistoryParameters,\n GetFeeHistoryReturnType,\n} from './actions/public/getFeeHistory.js'\nexport type {\n GetFilterChangesErrorType,\n GetFilterChangesParameters,\n GetFilterChangesReturnType,\n} from './actions/public/getFilterChanges.js'\nexport type {\n GetFilterLogsErrorType,\n GetFilterLogsParameters,\n GetFilterLogsReturnType,\n} from './actions/public/getFilterLogs.js'\nexport type {\n GetGasPriceErrorType,\n GetGasPriceReturnType,\n} from './actions/public/getGasPrice.js'\nexport type {\n GetLogsErrorType,\n GetLogsParameters,\n GetLogsReturnType,\n} from './actions/public/getLogs.js'\nexport type {\n GetProofErrorType,\n GetProofParameters,\n GetProofReturnType,\n} from './actions/public/getProof.js'\nexport type {\n GetStorageAtErrorType,\n GetStorageAtParameters,\n GetStorageAtReturnType,\n} from './actions/public/getStorageAt.js'\nexport type {\n GetTransactionErrorType,\n GetTransactionParameters,\n GetTransactionReturnType,\n} from './actions/public/getTransaction.js'\nexport type {\n GetTransactionConfirmationsErrorType,\n GetTransactionConfirmationsParameters,\n GetTransactionConfirmationsReturnType,\n} from './actions/public/getTransactionConfirmations.js'\nexport type {\n GetTransactionCountErrorType,\n GetTransactionCountParameters,\n GetTransactionCountReturnType,\n} from './actions/public/getTransactionCount.js'\nexport type {\n GetTransactionReceiptErrorType,\n GetTransactionReceiptParameters,\n GetTransactionReceiptReturnType,\n} from './actions/public/getTransactionReceipt.js'\nexport type {\n MulticallErrorType,\n MulticallParameters,\n MulticallReturnType,\n} from './actions/public/multicall.js'\nexport type {\n ReadContractErrorType,\n ReadContractParameters,\n ReadContractReturnType,\n} from './actions/public/readContract.js'\nexport type {\n SimulateBlocksErrorType,\n SimulateBlocksParameters,\n SimulateBlocksReturnType,\n} from './actions/public/simulateBlocks.js'\nexport type {\n SimulateCallsErrorType,\n SimulateCallsParameters,\n SimulateCallsReturnType,\n} from './actions/public/simulateCalls.js'\nexport type {\n GetMutabilityAwareValue,\n SimulateContractErrorType,\n SimulateContractParameters,\n SimulateContractReturnType,\n} from './actions/public/simulateContract.js'\nexport type {\n UninstallFilterErrorType,\n UninstallFilterParameters,\n UninstallFilterReturnType,\n} from './actions/public/uninstallFilter.js'\nexport type {\n VerifyHashErrorType as VerifyHashActionErrorType,\n VerifyHashParameters as VerifyHashActionParameters,\n VerifyHashReturnType as VerifyHashActionReturnType,\n} from './actions/public/verifyHash.js'\nexport type {\n VerifyMessageErrorType as VerifyMessageActionErrorType,\n VerifyMessageParameters as VerifyMessageActionParameters,\n VerifyMessageReturnType as VerifyMessageActionReturnType,\n} from './actions/public/verifyMessage.js'\nexport type {\n VerifyTypedDataErrorType as VerifyTypedDataActionErrorType,\n VerifyTypedDataParameters as VerifyTypedDataActionParameters,\n VerifyTypedDataReturnType as VerifyTypedDataActionReturnType,\n} from './actions/public/verifyTypedData.js'\nexport type {\n ReplacementReason,\n ReplacementReturnType,\n WaitForTransactionReceiptErrorType,\n WaitForTransactionReceiptParameters,\n WaitForTransactionReceiptReturnType,\n} from './actions/public/waitForTransactionReceipt.js'\nexport type {\n OnBlockNumberFn,\n OnBlockNumberParameter,\n WatchBlockNumberErrorType,\n WatchBlockNumberParameters,\n WatchBlockNumberReturnType,\n} from './actions/public/watchBlockNumber.js'\nexport type {\n OnBlock,\n OnBlockParameter,\n WatchBlocksErrorType,\n WatchBlocksParameters,\n WatchBlocksReturnType,\n} from './actions/public/watchBlocks.js'\nexport type {\n WatchContractEventErrorType,\n WatchContractEventOnLogsFn,\n WatchContractEventOnLogsParameter,\n WatchContractEventParameters,\n WatchContractEventReturnType,\n} from './actions/public/watchContractEvent.js'\nexport type {\n WatchEventErrorType,\n WatchEventOnLogsFn,\n WatchEventOnLogsParameter,\n WatchEventParameters,\n WatchEventReturnType,\n} from './actions/public/watchEvent.js'\nexport type {\n OnTransactionsFn,\n OnTransactionsParameter,\n WatchPendingTransactionsErrorType,\n WatchPendingTransactionsParameters,\n WatchPendingTransactionsReturnType,\n} from './actions/public/watchPendingTransactions.js'\nexport type {\n DropTransactionErrorType,\n DropTransactionParameters,\n} from './actions/test/dropTransaction.js'\nexport type {\n DumpStateErrorType,\n DumpStateReturnType,\n} from './actions/test/dumpState.js'\nexport type {\n GetAutomineErrorType,\n GetAutomineReturnType,\n} from './actions/test/getAutomine.js'\nexport type {\n GetTxpoolContentErrorType,\n GetTxpoolContentReturnType,\n} from './actions/test/getTxpoolContent.js'\nexport type {\n GetTxpoolStatusErrorType,\n GetTxpoolStatusReturnType,\n} from './actions/test/getTxpoolStatus.js'\nexport type {\n ImpersonateAccountErrorType,\n ImpersonateAccountParameters,\n} from './actions/test/impersonateAccount.js'\nexport type {\n IncreaseTimeErrorType,\n IncreaseTimeParameters,\n} from './actions/test/increaseTime.js'\nexport type {\n InspectTxpoolErrorType,\n InspectTxpoolReturnType,\n} from './actions/test/inspectTxpool.js'\nexport type {\n LoadStateErrorType,\n LoadStateParameters,\n LoadStateReturnType,\n} from './actions/test/loadState.js'\nexport type { MineErrorType, MineParameters } from './actions/test/mine.js'\nexport type { RemoveBlockTimestampIntervalErrorType } from './actions/test/removeBlockTimestampInterval.js'\nexport type { ResetErrorType, ResetParameters } from './actions/test/reset.js'\nexport type {\n RevertErrorType,\n RevertParameters,\n} from './actions/test/revert.js'\nexport type {\n SendUnsignedTransactionErrorType,\n SendUnsignedTransactionParameters,\n SendUnsignedTransactionReturnType,\n} from './actions/test/sendUnsignedTransaction.js'\nexport type { SetAutomineErrorType } from './actions/test/setAutomine.js'\nexport type {\n SetBalanceErrorType,\n SetBalanceParameters,\n} from './actions/test/setBalance.js'\nexport type {\n SetBlockGasLimitErrorType,\n SetBlockGasLimitParameters,\n} from './actions/test/setBlockGasLimit.js'\nexport type {\n SetBlockTimestampIntervalErrorType,\n SetBlockTimestampIntervalParameters,\n} from './actions/test/setBlockTimestampInterval.js'\nexport type {\n SetCodeErrorType,\n SetCodeParameters,\n} from './actions/test/setCode.js'\nexport type {\n SetCoinbaseErrorType,\n SetCoinbaseParameters,\n} from './actions/test/setCoinbase.js'\nexport type {\n SetIntervalMiningErrorType,\n SetIntervalMiningParameters,\n} from './actions/test/setIntervalMining.js'\nexport type { SetLoggingEnabledErrorType } from './actions/test/setLoggingEnabled.js'\nexport type {\n SetMinGasPriceErrorType,\n SetMinGasPriceParameters,\n} from './actions/test/setMinGasPrice.js'\nexport type {\n SetNextBlockBaseFeePerGasErrorType,\n SetNextBlockBaseFeePerGasParameters,\n} from './actions/test/setNextBlockBaseFeePerGas.js'\nexport type {\n SetNextBlockTimestampErrorType,\n SetNextBlockTimestampParameters,\n} from './actions/test/setNextBlockTimestamp.js'\nexport type {\n SetNonceErrorType,\n SetNonceParameters,\n} from './actions/test/setNonce.js'\nexport type { SetRpcUrlErrorType } from './actions/test/setRpcUrl.js'\nexport type {\n SetStorageAtErrorType,\n SetStorageAtParameters,\n} from './actions/test/setStorageAt.js'\nexport type { SnapshotErrorType } from './actions/test/snapshot.js'\nexport type {\n StopImpersonatingAccountErrorType,\n StopImpersonatingAccountParameters,\n} from './actions/test/stopImpersonatingAccount.js'\nexport type {\n AddChainErrorType,\n AddChainParameters,\n} from './actions/wallet/addChain.js'\nexport type {\n DeployContractErrorType,\n DeployContractParameters,\n DeployContractReturnType,\n} from './actions/wallet/deployContract.js'\nexport type {\n GetAddressesErrorType,\n GetAddressesReturnType,\n} from './actions/wallet/getAddresses.js'\nexport type {\n GetCallsStatusErrorType,\n GetCallsStatusParameters,\n GetCallsStatusReturnType,\n} from './actions/wallet/getCallsStatus.js'\nexport type {\n GetCapabilitiesErrorType,\n GetCapabilitiesParameters,\n GetCapabilitiesReturnType,\n} from './actions/wallet/getCapabilities.js'\nexport type {\n GetPermissionsErrorType,\n GetPermissionsReturnType,\n} from './actions/wallet/getPermissions.js'\nexport type {\n PrepareAuthorizationErrorType,\n PrepareAuthorizationParameters,\n PrepareAuthorizationReturnType,\n} from './actions/wallet/prepareAuthorization.js'\nexport type {\n PrepareTransactionRequestErrorType,\n PrepareTransactionRequestParameters,\n PrepareTransactionRequestParameterType,\n PrepareTransactionRequestRequest,\n PrepareTransactionRequestReturnType,\n} from './actions/wallet/prepareTransactionRequest.js'\nexport type {\n RequestAddressesErrorType,\n RequestAddressesReturnType,\n} from './actions/wallet/requestAddresses.js'\nexport type {\n RequestPermissionsErrorType,\n RequestPermissionsParameters,\n RequestPermissionsReturnType,\n} from './actions/wallet/requestPermissions.js'\nexport type {\n SendCallsErrorType,\n SendCallsParameters,\n SendCallsReturnType,\n} from './actions/wallet/sendCalls.js'\nexport type {\n SendCallsSyncErrorType,\n SendCallsSyncParameters,\n SendCallsSyncReturnType,\n} from './actions/wallet/sendCallsSync.js'\nexport type {\n SendRawTransactionErrorType,\n SendRawTransactionParameters,\n SendRawTransactionReturnType,\n} from './actions/wallet/sendRawTransaction.js'\nexport type {\n SendRawTransactionSyncErrorType,\n SendRawTransactionSyncParameters,\n SendRawTransactionSyncReturnType,\n} from './actions/wallet/sendRawTransactionSync.js'\nexport type {\n SendTransactionErrorType,\n SendTransactionParameters,\n SendTransactionRequest,\n SendTransactionReturnType,\n} from './actions/wallet/sendTransaction.js'\nexport type {\n SendTransactionSyncErrorType,\n SendTransactionSyncParameters,\n SendTransactionSyncRequest,\n SendTransactionSyncReturnType,\n} from './actions/wallet/sendTransactionSync.js'\nexport type {\n ShowCallsStatusErrorType,\n ShowCallsStatusParameters,\n ShowCallsStatusReturnType,\n} from './actions/wallet/showCallsStatus.js'\nexport type {\n SignAuthorizationErrorType,\n SignAuthorizationParameters,\n SignAuthorizationReturnType,\n} from './actions/wallet/signAuthorization.js'\nexport type {\n SignMessageErrorType,\n SignMessageParameters,\n SignMessageReturnType,\n} from './actions/wallet/signMessage.js'\nexport type {\n SignTransactionErrorType,\n SignTransactionParameters,\n SignTransactionRequest,\n SignTransactionReturnType,\n} from './actions/wallet/signTransaction.js'\nexport type {\n SignTypedDataErrorType,\n SignTypedDataParameters,\n SignTypedDataReturnType,\n} from './actions/wallet/signTypedData.js'\nexport type {\n SwitchChainErrorType,\n SwitchChainParameters,\n} from './actions/wallet/switchChain.js'\nexport type {\n WaitForCallsStatusErrorType,\n WaitForCallsStatusParameters,\n WaitForCallsStatusReturnType,\n WaitForCallsStatusTimeoutErrorType,\n} from './actions/wallet/waitForCallsStatus.js'\nexport { WaitForCallsStatusTimeoutError } from './actions/wallet/waitForCallsStatus.js'\nexport type {\n WatchAssetErrorType,\n WatchAssetParameters,\n WatchAssetReturnType,\n} from './actions/wallet/watchAsset.js'\nexport type {\n WriteContractErrorType,\n WriteContractParameters,\n WriteContractReturnType,\n} from './actions/wallet/writeContract.js'\nexport type {\n WriteContractSyncErrorType,\n WriteContractSyncParameters,\n WriteContractSyncReturnType,\n} from './actions/wallet/writeContractSync.js'\nexport {\n type Client,\n type ClientConfig,\n type CreateClientErrorType,\n createClient,\n type MulticallBatchOptions,\n rpcSchema,\n} from './clients/createClient.js'\nexport {\n type CreatePublicClientErrorType,\n createPublicClient,\n type PublicClient,\n type PublicClientConfig,\n} from './clients/createPublicClient.js'\nexport {\n type CreateTestClientErrorType,\n createTestClient,\n type TestClient,\n type TestClientConfig,\n} from './clients/createTestClient.js'\nexport {\n type CreateWalletClientErrorType,\n createWalletClient,\n type WalletClient,\n type WalletClientConfig,\n} from './clients/createWalletClient.js'\nexport {\n type PublicActions,\n publicActions,\n} from './clients/decorators/public.js'\nexport {\n type TestActions,\n testActions,\n} from './clients/decorators/test.js'\nexport {\n type WalletActions,\n walletActions,\n} from './clients/decorators/wallet.js'\nexport {\n type CreateTransportErrorType,\n createTransport,\n type Transport,\n type TransportConfig,\n} from './clients/transports/createTransport.js'\nexport {\n type CustomTransport,\n type CustomTransportConfig,\n type CustomTransportErrorType,\n custom,\n} from './clients/transports/custom.js'\nexport {\n type FallbackTransport,\n type FallbackTransportConfig,\n type FallbackTransportErrorType,\n fallback,\n shouldThrow,\n} from './clients/transports/fallback.js'\nexport {\n type HttpTransport,\n type HttpTransportConfig,\n type HttpTransportErrorType,\n http,\n} from './clients/transports/http.js'\nexport {\n type WebSocketTransport,\n type WebSocketTransportConfig,\n type WebSocketTransportErrorType,\n webSocket,\n} from './clients/transports/webSocket.js'\nexport {\n erc20Abi,\n erc20Abi_bytes32,\n erc721Abi,\n erc1155Abi,\n erc4626Abi,\n erc6492SignatureValidatorAbi,\n /** @deprecated use `erc6492SignatureValidatorAbi` instead. */\n erc6492SignatureValidatorAbi as universalSignatureValidatorAbi,\n multicall3Abi,\n} from './constants/abis.js'\nexport { ethAddress, zeroAddress } from './constants/address.js'\nexport { zeroHash } from './constants/bytes.js'\nexport {\n deploylessCallViaBytecodeBytecode,\n deploylessCallViaFactoryBytecode,\n erc6492SignatureValidatorByteCode,\n /** @deprecated use `erc6492SignatureValidatorByteCode` instead. */\n erc6492SignatureValidatorByteCode as universalSignatureValidatorByteCode,\n} from './constants/contracts.js'\nexport {\n maxInt8,\n maxInt16,\n maxInt24,\n maxInt32,\n maxInt40,\n maxInt48,\n maxInt56,\n maxInt64,\n maxInt72,\n maxInt80,\n maxInt88,\n maxInt96,\n maxInt104,\n maxInt112,\n maxInt120,\n maxInt128,\n maxInt136,\n maxInt144,\n maxInt152,\n maxInt160,\n maxInt168,\n maxInt176,\n maxInt184,\n maxInt192,\n maxInt200,\n maxInt208,\n maxInt216,\n maxInt224,\n maxInt232,\n maxInt240,\n maxInt248,\n maxInt256,\n maxUint8,\n maxUint16,\n maxUint24,\n maxUint32,\n maxUint40,\n maxUint48,\n maxUint56,\n maxUint64,\n maxUint72,\n maxUint80,\n maxUint88,\n maxUint96,\n maxUint104,\n maxUint112,\n maxUint120,\n maxUint128,\n maxUint136,\n maxUint144,\n maxUint152,\n maxUint160,\n maxUint168,\n maxUint176,\n maxUint184,\n maxUint192,\n maxUint200,\n maxUint208,\n maxUint216,\n maxUint224,\n maxUint232,\n maxUint240,\n maxUint248,\n maxUint256,\n minInt8,\n minInt16,\n minInt24,\n minInt32,\n minInt40,\n minInt48,\n minInt56,\n minInt64,\n minInt72,\n minInt80,\n minInt88,\n minInt96,\n minInt104,\n minInt112,\n minInt120,\n minInt128,\n minInt136,\n minInt144,\n minInt152,\n minInt160,\n minInt168,\n minInt176,\n minInt184,\n minInt192,\n minInt200,\n minInt208,\n minInt216,\n minInt224,\n minInt232,\n minInt240,\n minInt248,\n minInt256,\n} from './constants/number.js'\nexport { presignMessagePrefix } from './constants/strings.js'\nexport { etherUnits, gweiUnits, weiUnits } from './constants/unit.js'\nexport {\n AbiConstructorNotFoundError,\n type AbiConstructorNotFoundErrorType,\n AbiConstructorParamsNotFoundError,\n type AbiConstructorParamsNotFoundErrorType,\n AbiDecodingDataSizeInvalidError,\n type AbiDecodingDataSizeInvalidErrorType,\n AbiDecodingDataSizeTooSmallError,\n type AbiDecodingDataSizeTooSmallErrorType,\n AbiDecodingZeroDataError,\n type AbiDecodingZeroDataErrorType,\n AbiEncodingArrayLengthMismatchError,\n type AbiEncodingArrayLengthMismatchErrorType,\n AbiEncodingBytesSizeMismatchError,\n type AbiEncodingBytesSizeMismatchErrorType,\n AbiEncodingLengthMismatchError,\n type AbiEncodingLengthMismatchErrorType,\n AbiErrorInputsNotFoundError,\n type AbiErrorInputsNotFoundErrorType,\n AbiErrorNotFoundError,\n type AbiErrorNotFoundErrorType,\n AbiErrorSignatureNotFoundError,\n type AbiErrorSignatureNotFoundErrorType,\n AbiEventNotFoundError,\n type AbiEventNotFoundErrorType,\n AbiEventSignatureEmptyTopicsError,\n type AbiEventSignatureEmptyTopicsErrorType,\n AbiEventSignatureNotFoundError,\n type AbiEventSignatureNotFoundErrorType,\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n AbiFunctionOutputsNotFoundError,\n type AbiFunctionOutputsNotFoundErrorType,\n AbiFunctionSignatureNotFoundError,\n type AbiFunctionSignatureNotFoundErrorType,\n BytesSizeMismatchError,\n type BytesSizeMismatchErrorType,\n DecodeLogDataMismatch,\n type DecodeLogDataMismatchErrorType,\n DecodeLogTopicsMismatch,\n type DecodeLogTopicsMismatchErrorType,\n InvalidAbiDecodingTypeError,\n type InvalidAbiDecodingTypeErrorType,\n InvalidAbiEncodingTypeError,\n type InvalidAbiEncodingTypeErrorType,\n InvalidArrayError,\n type InvalidArrayErrorType,\n InvalidDefinitionTypeError,\n type InvalidDefinitionTypeErrorType,\n UnsupportedPackedAbiType,\n type UnsupportedPackedAbiTypeErrorType,\n} from './errors/abi.js'\nexport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from './errors/address.js'\nexport { BaseError, type BaseErrorType, setErrorConfig } from './errors/base.js'\nexport {\n BlockNotFoundError,\n type BlockNotFoundErrorType,\n} from './errors/block.js'\nexport {\n BundleFailedError,\n type BundleFailedErrorType,\n} from './errors/calls.js'\nexport {\n ChainDoesNotSupportContract,\n type ChainDoesNotSupportContractErrorType,\n ChainMismatchError,\n type ChainMismatchErrorType,\n ChainNotFoundError,\n type ChainNotFoundErrorType,\n ClientChainNotConfiguredError,\n type ClientChainNotConfiguredErrorType,\n InvalidChainIdError,\n type InvalidChainIdErrorType,\n} from './errors/chain.js'\nexport {\n CallExecutionError,\n type CallExecutionErrorType,\n ContractFunctionExecutionError,\n type ContractFunctionExecutionErrorType,\n ContractFunctionRevertedError,\n type ContractFunctionRevertedErrorType,\n ContractFunctionZeroDataError,\n type ContractFunctionZeroDataErrorType,\n CounterfactualDeploymentFailedError,\n type CounterfactualDeploymentFailedErrorType,\n RawContractError,\n type RawContractErrorType,\n} from './errors/contract.js'\nexport {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n SliceOffsetOutOfBoundsError,\n type SliceOffsetOutOfBoundsErrorType,\n} from './errors/data.js'\nexport {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n InvalidBytesBooleanError,\n type InvalidBytesBooleanErrorType,\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n InvalidHexValueError,\n type InvalidHexValueErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from './errors/encoding.js'\nexport {\n type EnsAvatarInvalidMetadataError,\n type EnsAvatarInvalidMetadataErrorType,\n EnsAvatarInvalidNftUriError,\n type EnsAvatarInvalidNftUriErrorType,\n EnsAvatarUnsupportedNamespaceError,\n type EnsAvatarUnsupportedNamespaceErrorType,\n EnsAvatarUriResolutionError,\n type EnsAvatarUriResolutionErrorType,\n EnsInvalidChainIdError,\n type EnsInvalidChainIdErrorType,\n} from './errors/ens.js'\nexport {\n EstimateGasExecutionError,\n type EstimateGasExecutionErrorType,\n} from './errors/estimateGas.js'\nexport {\n BaseFeeScalarError,\n type BaseFeeScalarErrorType,\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n MaxFeePerGasTooLowError,\n type MaxFeePerGasTooLowErrorType,\n} from './errors/fee.js'\nexport {\n FilterTypeNotSupportedError,\n type FilterTypeNotSupportedErrorType,\n} from './errors/log.js'\nexport {\n ExecutionRevertedError,\n type ExecutionRevertedErrorType,\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n FeeCapTooLowError,\n type FeeCapTooLowErrorType,\n InsufficientFundsError,\n type InsufficientFundsErrorType,\n IntrinsicGasTooHighError,\n type IntrinsicGasTooHighErrorType,\n IntrinsicGasTooLowError,\n type IntrinsicGasTooLowErrorType,\n NonceMaxValueError,\n type NonceMaxValueErrorType,\n NonceTooHighError,\n type NonceTooHighErrorType,\n NonceTooLowError,\n type NonceTooLowErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n TransactionTypeNotSupportedError,\n type TransactionTypeNotSupportedErrorType,\n UnknownNodeError,\n type UnknownNodeErrorType,\n} from './errors/node.js'\nexport {\n HttpRequestError,\n type HttpRequestErrorType,\n RpcRequestError,\n type RpcRequestErrorType,\n SocketClosedError,\n type SocketClosedErrorType,\n TimeoutError,\n type TimeoutErrorType,\n WebSocketRequestError,\n type WebSocketRequestErrorType,\n} from './errors/request.js'\nexport {\n AtomicityNotSupportedError,\n type AtomicityNotSupportedErrorType,\n AtomicReadyWalletRejectedUpgradeError,\n type AtomicReadyWalletRejectedUpgradeErrorType,\n BundleTooLargeError,\n type BundleTooLargeErrorType,\n ChainDisconnectedError,\n type ChainDisconnectedErrorType,\n DuplicateIdError,\n type DuplicateIdErrorType,\n InternalRpcError,\n type InternalRpcErrorType,\n InvalidInputRpcError,\n type InvalidInputRpcErrorType,\n InvalidParamsRpcError,\n type InvalidParamsRpcErrorType,\n InvalidRequestRpcError,\n type InvalidRequestRpcErrorType,\n JsonRpcVersionUnsupportedError,\n type JsonRpcVersionUnsupportedErrorType,\n LimitExceededRpcError,\n type LimitExceededRpcErrorType,\n MethodNotFoundRpcError,\n type MethodNotFoundRpcErrorType,\n MethodNotSupportedRpcError,\n type MethodNotSupportedRpcErrorType,\n ParseRpcError,\n type ParseRpcErrorType,\n ProviderDisconnectedError,\n type ProviderDisconnectedErrorType,\n ProviderRpcError,\n type ProviderRpcErrorCode,\n type ProviderRpcErrorType,\n ResourceNotFoundRpcError,\n type ResourceNotFoundRpcErrorType,\n ResourceUnavailableRpcError,\n type ResourceUnavailableRpcErrorType,\n RpcError,\n type RpcErrorCode,\n type RpcErrorType,\n SwitchChainError,\n TransactionRejectedRpcError,\n type TransactionRejectedRpcErrorType,\n UnauthorizedProviderError,\n type UnauthorizedProviderErrorType,\n UnknownBundleIdError,\n type UnknownBundleIdErrorType,\n UnknownRpcError,\n type UnknownRpcErrorType,\n UnsupportedChainIdError,\n type UnsupportedChainIdErrorType,\n UnsupportedNonOptionalCapabilityError,\n type UnsupportedNonOptionalCapabilityErrorType,\n UnsupportedProviderMethodError,\n type UnsupportedProviderMethodErrorType,\n UserRejectedRequestError,\n type UserRejectedRequestErrorType,\n} from './errors/rpc.js'\nexport {\n AccountStateConflictError,\n type AccountStateConflictErrorType,\n StateAssignmentConflictError,\n type StateAssignmentConflictErrorType,\n} from './errors/stateOverride.js'\nexport {\n FeeConflictError,\n type FeeConflictErrorType,\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n InvalidSerializableTransactionError,\n type InvalidSerializableTransactionErrorType,\n InvalidSerializedTransactionError,\n type InvalidSerializedTransactionErrorType,\n InvalidSerializedTransactionTypeError,\n type InvalidSerializedTransactionTypeErrorType,\n InvalidStorageKeySizeError,\n type InvalidStorageKeySizeErrorType,\n TransactionExecutionError,\n type TransactionExecutionErrorType,\n TransactionNotFoundError,\n type TransactionNotFoundErrorType,\n TransactionReceiptNotFoundError,\n type TransactionReceiptNotFoundErrorType,\n WaitForTransactionReceiptTimeoutError,\n type WaitForTransactionReceiptTimeoutErrorType,\n} from './errors/transaction.js'\nexport {\n UrlRequiredError,\n type UrlRequiredErrorType,\n} from './errors/transport.js'\nexport {\n InvalidDomainError,\n type InvalidDomainErrorType,\n InvalidPrimaryTypeError,\n type InvalidPrimaryTypeErrorType,\n InvalidStructTypeError,\n type InvalidStructTypeErrorType,\n} from './errors/typedData.js'\nexport {\n InvalidDecimalNumberError,\n type InvalidDecimalNumberErrorType,\n} from './errors/unit.js'\nexport type {\n DeriveAccount,\n HDKey,\n ParseAccount,\n} from './types/account.js'\nexport type {\n Authorization,\n AuthorizationList,\n AuthorizationRequest,\n SerializedAuthorization,\n SerializedAuthorizationList,\n SignedAuthorization,\n SignedAuthorizationList,\n} from './types/authorization.js'\nexport type {\n Block,\n BlockIdentifier,\n BlockNumber,\n BlockTag,\n Uncle,\n} from './types/block.js'\nexport type { Call, Calls } from './types/calls.js'\nexport type {\n Capabilities,\n /** @deprecated Use `Capabilities` instead. */\n Capabilities as WalletCapabilities,\n CapabilitiesSchema,\n /** @deprecated Use `ChainIdToCapabilities` instead. */\n ChainIdToCapabilities as WalletCapabilitiesRecord,\n ChainIdToCapabilities,\n ExtractCapabilities,\n} from './types/capabilities.js'\nexport type {\n Chain,\n ChainConfig,\n ChainContract,\n ChainEstimateFeesPerGasFn,\n ChainEstimateFeesPerGasFnParameters,\n ChainFees,\n ChainFeesFnParameters,\n ChainFormatter,\n ChainFormatters,\n ChainMaxPriorityFeePerGasFn,\n ChainSerializers,\n DeriveChain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterParameters,\n ExtractChainFormatterReturnType,\n GetChainParameter,\n} from './types/chain.js'\nexport type {\n AbiEventParametersToPrimitiveTypes,\n AbiEventParameterToPrimitiveType,\n AbiEventTopicToPrimitiveType,\n AbiItem,\n AbiItemArgs,\n AbiItemName,\n ContractConstructorArgs,\n ContractErrorArgs,\n ContractErrorName,\n ContractEventArgs,\n ContractEventArgsFromTopics,\n ContractEventName,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n EventDefinition,\n ExtractAbiFunctionForArgs,\n ExtractAbiItem,\n ExtractAbiItemForArgs,\n ExtractAbiItemNames,\n GetEventArgs,\n GetValue,\n LogTopicType,\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n UnionWiden,\n Widen,\n} from './types/contract.js'\nexport type { DataSuffix } from './types/dataSuffix.js'\nexport type {\n AddEthereumChainParameter,\n BundlerRpcSchema,\n DebugBundlerRpcSchema,\n EIP1193EventMap,\n EIP1193Events,\n EIP1193Parameters,\n EIP1193Provider,\n EIP1193RequestFn,\n EIP1474Methods,\n NetworkSync,\n PaymasterRpcSchema,\n ProviderConnectInfo,\n ProviderMessage,\n ProviderRpcErrorType as EIP1193ProviderRpcErrorType,\n PublicRpcSchema,\n RpcSchema,\n RpcSchemaOverride,\n TestRpcSchema,\n WalletCallReceipt,\n WalletGetAssetsParameters,\n WalletGetAssetsReturnType,\n WalletGetCallsStatusReturnType,\n WalletGrantPermissionsParameters,\n WalletGrantPermissionsReturnType,\n WalletPermission,\n WalletPermissionCaveat,\n WalletRpcSchema,\n WalletSendCallsParameters,\n WalletSendCallsReturnType,\n WatchAssetParams,\n} from './types/eip1193.js'\nexport { ProviderRpcError as EIP1193ProviderRpcError } from './types/eip1193.js'\nexport type { BlobSidecar, BlobSidecars } from './types/eip4844.js'\nexport type { AssetGateway, AssetGatewayUrls } from './types/ens.js'\nexport type {\n FeeHistory,\n FeeValues,\n FeeValuesEIP1559,\n FeeValuesEIP4844,\n FeeValuesLegacy,\n FeeValuesType,\n} from './types/fee.js'\nexport type { Filter, FilterType } from './types/filter.js'\nexport type { GetTransactionRequestKzgParameter, Kzg } from './types/kzg.js'\nexport type { Log } from './types/log.js'\nexport type {\n ByteArray,\n CompactSignature,\n Hash,\n Hex,\n LogTopic,\n SignableMessage,\n Signature,\n} from './types/misc.js'\nexport type {\n MulticallContracts,\n MulticallResponse,\n MulticallResults,\n} from './types/multicall.js'\nexport type { Register, ResolvedRegister } from './types/register.js'\nexport type {\n Index,\n Quantity,\n RpcAccountStateOverride,\n RpcAuthorization,\n RpcAuthorizationList,\n RpcBlock,\n RpcBlockIdentifier,\n RpcBlockNumber,\n RpcFeeHistory,\n RpcFeeValues,\n RpcLog,\n RpcProof,\n RpcStateMapping,\n RpcStateOverride,\n RpcTransaction,\n RpcTransactionReceipt,\n RpcTransactionRequest,\n RpcUncle,\n Status,\n} from './types/rpc.js'\nexport type {\n StateMapping,\n StateOverride,\n} from './types/stateOverride.js'\nexport type {\n AccessList,\n Transaction,\n TransactionBase,\n TransactionEIP1559,\n TransactionEIP2930,\n TransactionEIP4844,\n TransactionEIP7702,\n TransactionLegacy,\n TransactionReceipt,\n TransactionRequest,\n TransactionRequestBase,\n TransactionRequestEIP1559,\n TransactionRequestEIP2930,\n TransactionRequestEIP4844,\n TransactionRequestEIP7702,\n TransactionRequestGeneric,\n TransactionRequestLegacy,\n TransactionSerializable,\n TransactionSerializableBase,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedGeneric,\n TransactionSerializedLegacy,\n TransactionType,\n} from './types/transaction.js'\nexport type { GetPollOptions, GetTransportConfig } from './types/transport.js'\nexport type {\n EIP712DomainDefinition,\n MessageDefinition,\n TypedDataDefinition,\n} from './types/typedData.js'\nexport type {\n Assign,\n Branded,\n Evaluate,\n ExactPartial,\n ExactRequired,\n IsNarrowable,\n IsNever,\n IsUndefined,\n IsUnion,\n LooseOmit,\n MaybePartial,\n MaybePromise,\n MaybeRequired,\n Mutable,\n NoInfer,\n NoUndefined,\n Omit,\n OneOf,\n Or,\n PartialBy,\n Prettify,\n RequiredBy,\n Some,\n UnionEvaluate,\n UnionLooseOmit,\n UnionOmit,\n UnionPartialBy,\n UnionPick,\n UnionRequiredBy,\n UnionToTuple,\n ValueOf,\n} from './types/utils.js'\nexport type { Withdrawal } from './types/withdrawal.js'\nexport {\n type DecodeAbiParametersErrorType,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n} from './utils/abi/decodeAbiParameters.js'\nexport {\n type DecodeDeployDataErrorType,\n type DecodeDeployDataParameters,\n type DecodeDeployDataReturnType,\n decodeDeployData,\n} from './utils/abi/decodeDeployData.js'\nexport {\n type DecodeErrorResultErrorType,\n type DecodeErrorResultParameters,\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from './utils/abi/decodeErrorResult.js'\nexport {\n type DecodeEventLogErrorType,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n decodeEventLog,\n} from './utils/abi/decodeEventLog.js'\nexport {\n type DecodeFunctionDataErrorType,\n type DecodeFunctionDataParameters,\n type DecodeFunctionDataReturnType,\n decodeFunctionData,\n} from './utils/abi/decodeFunctionData.js'\nexport {\n type DecodeFunctionResultErrorType,\n type DecodeFunctionResultParameters,\n type DecodeFunctionResultReturnType,\n decodeFunctionResult,\n} from './utils/abi/decodeFunctionResult.js'\nexport {\n type EncodeAbiParametersErrorType,\n type EncodeAbiParametersReturnType,\n encodeAbiParameters,\n} from './utils/abi/encodeAbiParameters.js'\nexport {\n type EncodeDeployDataErrorType,\n type EncodeDeployDataParameters,\n type EncodeDeployDataReturnType,\n encodeDeployData,\n} from './utils/abi/encodeDeployData.js'\nexport {\n type EncodeErrorResultErrorType,\n type EncodeErrorResultParameters,\n type EncodeErrorResultReturnType,\n encodeErrorResult,\n} from './utils/abi/encodeErrorResult.js'\nexport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n type EncodeEventTopicsReturnType,\n encodeEventTopics,\n} from './utils/abi/encodeEventTopics.js'\nexport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n type EncodeFunctionDataReturnType,\n encodeFunctionData,\n} from './utils/abi/encodeFunctionData.js'\nexport {\n type EncodeFunctionResultErrorType,\n type EncodeFunctionResultParameters,\n type EncodeFunctionResultReturnType,\n encodeFunctionResult,\n} from './utils/abi/encodeFunctionResult.js'\nexport {\n type EncodePackedErrorType,\n encodePacked,\n} from './utils/abi/encodePacked.js'\nexport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n type GetAbiItemReturnType,\n getAbiItem,\n} from './utils/abi/getAbiItem.js'\nexport {\n type ParseEventLogsErrorType,\n type ParseEventLogsParameters,\n type ParseEventLogsReturnType,\n parseEventLogs,\n} from './utils/abi/parseEventLogs.js'\nexport {\n type PrepareEncodeFunctionDataErrorType,\n type PrepareEncodeFunctionDataParameters,\n type PrepareEncodeFunctionDataReturnType,\n prepareEncodeFunctionData,\n} from './utils/abi/prepareEncodeFunctionData.js'\nexport {\n type ChecksumAddressErrorType,\n checksumAddress,\n type GetAddressErrorType,\n getAddress,\n} from './utils/address/getAddress.js'\nexport {\n type GetContractAddressOptions,\n type GetCreate2AddressErrorType,\n type GetCreate2AddressOptions,\n type GetCreateAddressErrorType,\n type GetCreateAddressOptions,\n getContractAddress,\n getCreate2Address,\n getCreateAddress,\n} from './utils/address/getContractAddress.js'\nexport {\n type IsAddressErrorType,\n type IsAddressOptions,\n isAddress,\n} from './utils/address/isAddress.js'\nexport {\n type IsAddressEqualErrorType,\n type IsAddressEqualReturnType,\n isAddressEqual,\n} from './utils/address/isAddressEqual.js'\nexport {\n type BlobsToCommitmentsErrorType,\n type BlobsToCommitmentsParameters,\n type BlobsToCommitmentsReturnType,\n blobsToCommitments,\n} from './utils/blob/blobsToCommitments.js'\nexport {\n blobsToProofs,\n type blobsToProofsErrorType,\n type blobsToProofsParameters,\n type blobsToProofsReturnType,\n} from './utils/blob/blobsToProofs.js'\nexport {\n type CommitmentsToVersionedHashesErrorType,\n type CommitmentsToVersionedHashesParameters,\n type CommitmentsToVersionedHashesReturnType,\n commitmentsToVersionedHashes,\n} from './utils/blob/commitmentsToVersionedHashes.js'\nexport {\n type CommitmentToVersionedHashErrorType,\n type CommitmentToVersionedHashParameters,\n type CommitmentToVersionedHashReturnType,\n commitmentToVersionedHash,\n} from './utils/blob/commitmentToVersionedHash.js'\nexport {\n type FromBlobsErrorType,\n type FromBlobsParameters,\n type FromBlobsReturnType,\n fromBlobs,\n} from './utils/blob/fromBlobs.js'\nexport {\n type SidecarsToVersionedHashesErrorType,\n type SidecarsToVersionedHashesParameters,\n type SidecarsToVersionedHashesReturnType,\n sidecarsToVersionedHashes,\n} from './utils/blob/sidecarsToVersionedHashes.js'\nexport {\n type ToBlobSidecarsErrorType,\n type ToBlobSidecarsParameters,\n type ToBlobSidecarsReturnType,\n toBlobSidecars,\n} from './utils/blob/toBlobSidecars.js'\nexport {\n type ToBlobsErrorType,\n type ToBlobsParameters,\n type ToBlobsReturnType,\n toBlobs,\n} from './utils/blob/toBlobs.js'\nexport {\n type CcipRequestErrorType,\n type CcipRequestParameters,\n ccipRequest,\n /** @deprecated Use `ccipRequest`. */\n ccipRequest as ccipFetch,\n type OffchainLookupErrorType,\n offchainLookup,\n offchainLookupAbiItem,\n offchainLookupSignature,\n} from './utils/ccip.js'\nexport {\n type AssertCurrentChainErrorType,\n type AssertCurrentChainParameters,\n assertCurrentChain,\n} from './utils/chain/assertCurrentChain.js'\nexport {\n type DefineChainReturnType,\n defineChain,\n extendSchema,\n} from './utils/chain/defineChain.js'\nexport {\n type ExtractChainErrorType,\n type ExtractChainParameters,\n type ExtractChainReturnType,\n extractChain,\n} from './utils/chain/extractChain.js'\nexport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from './utils/chain/getChainContractAddress.js'\nexport {\n type ConcatBytesErrorType,\n type ConcatErrorType,\n type ConcatHexErrorType,\n type ConcatReturnType,\n concat,\n concatBytes,\n concatHex,\n} from './utils/data/concat.js'\nexport { type IsBytesErrorType, isBytes } from './utils/data/isBytes.js'\nexport { type IsHexErrorType, isHex } from './utils/data/isHex.js'\nexport {\n type PadBytesErrorType,\n type PadErrorType,\n type PadHexErrorType,\n type PadReturnType,\n pad,\n padBytes,\n padHex,\n} from './utils/data/pad.js'\nexport { type SizeErrorType, size } from './utils/data/size.js'\nexport {\n type SliceBytesErrorType,\n type SliceErrorType,\n type SliceHexErrorType,\n slice,\n sliceBytes,\n sliceHex,\n} from './utils/data/slice.js'\nexport {\n type TrimErrorType,\n type TrimReturnType,\n trim,\n} from './utils/data/trim.js'\nexport {\n type BytesToBigIntErrorType,\n type BytesToBigIntOpts,\n type BytesToBoolErrorType,\n type BytesToBoolOpts,\n type BytesToNumberErrorType,\n type BytesToNumberOpts,\n type BytesToStringErrorType,\n type BytesToStringOpts,\n bytesToBigInt,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n type FromBytesErrorType,\n type FromBytesParameters,\n fromBytes,\n} from './utils/encoding/fromBytes.js'\nexport {\n type FromHexErrorType,\n fromHex,\n type HexToBigIntErrorType,\n type HexToBoolErrorType,\n type HexToNumberErrorType,\n type HexToStringErrorType,\n hexToBigInt,\n hexToBool,\n hexToNumber,\n hexToString,\n} from './utils/encoding/fromHex.js'\nexport {\n type FromRlpErrorType,\n type FromRlpReturnType,\n fromRlp,\n} from './utils/encoding/fromRlp.js'\nexport {\n type BoolToBytesErrorType,\n type BoolToBytesOpts,\n boolToBytes,\n type HexToBytesErrorType,\n type HexToBytesOpts,\n hexToBytes,\n type NumberToBytesErrorType,\n numberToBytes,\n type StringToBytesErrorType,\n type StringToBytesOpts,\n stringToBytes,\n type ToBytesErrorType,\n type ToBytesParameters,\n toBytes,\n} from './utils/encoding/toBytes.js'\nexport {\n type BoolToHexErrorType,\n type BoolToHexOpts,\n type BytesToHexErrorType,\n type BytesToHexOpts,\n boolToHex,\n bytesToHex,\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n type StringToHexErrorType,\n type StringToHexOpts,\n stringToHex,\n type ToHexErrorType,\n type ToHexParameters,\n toHex,\n} from './utils/encoding/toHex.js'\nexport {\n type BytesToRlpErrorType,\n bytesToRlp,\n type HexToRlpErrorType,\n hexToRlp,\n type ToRlpErrorType,\n type ToRlpReturnType,\n toRlp,\n} from './utils/encoding/toRlp.js'\nexport { type LabelhashErrorType, labelhash } from './utils/ens/labelhash.js'\nexport { type NamehashErrorType, namehash } from './utils/ens/namehash.js'\nexport {\n type ToCoinTypeError,\n toCoinType,\n} from './utils/ens/toCoinType.js'\nexport {\n type GetContractErrorReturnType,\n getContractError,\n} from './utils/errors/getContractError.js'\nexport {\n type DefineBlockErrorType,\n defineBlock,\n type FormatBlockErrorType,\n type FormattedBlock,\n formatBlock,\n} from './utils/formatters/block.js'\nexport { type FormatLogErrorType, formatLog } from './utils/formatters/log.js'\nexport {\n type DefineTransactionErrorType,\n defineTransaction,\n type FormatTransactionErrorType,\n type FormattedTransaction,\n formatTransaction,\n transactionType,\n} from './utils/formatters/transaction.js'\nexport {\n type DefineTransactionReceiptErrorType,\n defineTransactionReceipt,\n type FormatTransactionReceiptErrorType,\n type FormattedTransactionReceipt,\n formatTransactionReceipt,\n} from './utils/formatters/transactionReceipt.js'\nexport {\n type DefineTransactionRequestErrorType,\n defineTransactionRequest,\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n rpcTransactionType,\n} from './utils/formatters/transactionRequest.js'\nexport { type IsHashErrorType, isHash } from './utils/hash/isHash.js'\nexport {\n type Keccak256ErrorType,\n type Keccak256Hash,\n keccak256,\n} from './utils/hash/keccak256.js'\nexport {\n type Ripemd160ErrorType,\n type Ripemd160Hash,\n ripemd160,\n} from './utils/hash/ripemd160.js'\nexport {\n type Sha256ErrorType,\n type Sha256Hash,\n sha256,\n} from './utils/hash/sha256.js'\nexport {\n type ToEventHashErrorType,\n toEventHash,\n} from './utils/hash/toEventHash.js'\nexport {\n type ToEventSelectorErrorType,\n /** @deprecated use `ToEventSelectorErrorType`. */\n type ToEventSelectorErrorType as GetEventSelectorErrorType,\n toEventSelector,\n /** @deprecated use `toEventSelector`. */\n toEventSelector as getEventSelector,\n} from './utils/hash/toEventSelector.js'\nexport {\n type ToEventSignatureErrorType,\n /** @deprecated use `ToEventSignatureErrorType`. */\n type ToEventSignatureErrorType as GetEventSignatureErrorType,\n toEventSignature,\n /** @deprecated use `toEventSignature`. */\n toEventSignature as getEventSignature,\n} from './utils/hash/toEventSignature.js'\nexport {\n type ToFunctionHashErrorType,\n toFunctionHash,\n} from './utils/hash/toFunctionHash.js'\nexport {\n type ToFunctionSelectorErrorType,\n /** @deprecated use `ToFunctionSelectorErrorType`. */\n type ToFunctionSelectorErrorType as GetFunctionSelectorErrorType,\n toFunctionSelector,\n /** @deprecated use `toFunctionSelector`. */\n toFunctionSelector as getFunctionSelector,\n} from './utils/hash/toFunctionSelector.js'\nexport {\n type ToFunctionSignatureErrorType,\n /** @deprecated use `ToFunctionSignatureErrorType`. */\n type ToFunctionSignatureErrorType as GetFunctionSignatureErrorType,\n toFunctionSignature,\n /** @deprecated use `toFunctionSignature`. */\n toFunctionSignature as getFunctionSignature,\n} from './utils/hash/toFunctionSignature.js'\nexport {\n type DefineKzgErrorType,\n type DefineKzgParameters,\n type DefineKzgReturnType,\n defineKzg,\n} from './utils/kzg/defineKzg.js'\nexport {\n type SetupKzgErrorType,\n type SetupKzgParameters,\n type SetupKzgReturnType,\n setupKzg,\n} from './utils/kzg/setupKzg.js'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from './utils/nonceManager.js'\nexport { withCache } from './utils/promise/withCache.js'\nexport {\n type WithRetryErrorType,\n withRetry,\n} from './utils/promise/withRetry.js'\nexport {\n type WithTimeoutErrorType,\n withTimeout,\n} from './utils/promise/withTimeout.js'\nexport {\n type CompactSignatureToSignatureErrorType,\n compactSignatureToSignature,\n} from './utils/signature/compactSignatureToSignature.js'\nexport {\n type HashMessageErrorType,\n hashMessage,\n} from './utils/signature/hashMessage.js'\nexport {\n type HashDomainErrorType,\n type HashStructErrorType,\n type HashTypedDataErrorType,\n type HashTypedDataParameters,\n type HashTypedDataReturnType,\n hashDomain,\n hashStruct,\n hashTypedData,\n} from './utils/signature/hashTypedData.js'\nexport {\n type IsErc6492SignatureErrorType,\n type IsErc6492SignatureParameters,\n type IsErc6492SignatureReturnType,\n isErc6492Signature,\n} from './utils/signature/isErc6492Signature.js'\nexport {\n type IsErc8010SignatureErrorType,\n type IsErc8010SignatureParameters,\n type IsErc8010SignatureReturnType,\n isErc8010Signature,\n} from './utils/signature/isErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseCompactSignatureErrorType`. */\n type ParseCompactSignatureErrorType as HexToCompactSignatureErrorType,\n type ParseCompactSignatureErrorType,\n /** @deprecated Use `parseCompactSignature`. */\n parseCompactSignature as hexToCompactSignature,\n parseCompactSignature,\n} from './utils/signature/parseCompactSignature.js'\nexport {\n type ParseErc6492SignatureErrorType,\n type ParseErc6492SignatureParameters,\n type ParseErc6492SignatureReturnType,\n parseErc6492Signature,\n} from './utils/signature/parseErc6492Signature.js'\nexport {\n type ParseErc8010SignatureErrorType,\n type ParseErc8010SignatureParameters,\n type ParseErc8010SignatureReturnType,\n parseErc8010Signature,\n} from './utils/signature/parseErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseSignatureErrorType`. */\n type ParseSignatureErrorType as HexToSignatureErrorType,\n type ParseSignatureErrorType,\n /** @deprecated Use `parseSignature`. */\n parseSignature as hexToSignature,\n parseSignature,\n} from './utils/signature/parseSignature.js'\nexport {\n type RecoverAddressErrorType,\n type RecoverAddressParameters,\n type RecoverAddressReturnType,\n recoverAddress,\n} from './utils/signature/recoverAddress.js'\nexport {\n type RecoverMessageAddressErrorType,\n type RecoverMessageAddressParameters,\n type RecoverMessageAddressReturnType,\n recoverMessageAddress,\n} from './utils/signature/recoverMessageAddress.js'\nexport {\n type RecoverPublicKeyErrorType,\n type RecoverPublicKeyParameters,\n type RecoverPublicKeyReturnType,\n recoverPublicKey,\n} from './utils/signature/recoverPublicKey.js'\nexport {\n type RecoverTransactionAddressErrorType,\n type RecoverTransactionAddressParameters,\n type RecoverTransactionAddressReturnType,\n recoverTransactionAddress,\n} from './utils/signature/recoverTransactionAddress.js'\nexport {\n type RecoverTypedDataAddressErrorType,\n type RecoverTypedDataAddressParameters,\n type RecoverTypedDataAddressReturnType,\n recoverTypedDataAddress,\n} from './utils/signature/recoverTypedDataAddress.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeCompactSignatureErrorType as CompactSignatureToHexErrorType,\n type SerializeCompactSignatureErrorType,\n /** @deprecated Use `serializeCompactSignature` instead. */\n serializeCompactSignature as compactSignatureToHex,\n serializeCompactSignature,\n} from './utils/signature/serializeCompactSignature.js'\nexport {\n type SerializeErc6492SignatureErrorType,\n type SerializeErc6492SignatureParameters,\n type SerializeErc6492SignatureReturnType,\n serializeErc6492Signature,\n} from './utils/signature/serializeErc6492Signature.js'\nexport {\n type SerializeErc8010SignatureErrorType,\n type SerializeErc8010SignatureParameters,\n type SerializeErc8010SignatureReturnType,\n serializeErc8010Signature,\n} from './utils/signature/serializeErc8010Signature.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeSignatureErrorType as SignatureToHexErrorType,\n type SerializeSignatureErrorType,\n type SerializeSignatureParameters,\n type SerializeSignatureReturnType,\n /** @deprecated Use `serializeSignature` instead. */\n serializeSignature as signatureToHex,\n serializeSignature,\n} from './utils/signature/serializeSignature.js'\nexport {\n type SignatureToCompactSignatureErrorType,\n signatureToCompactSignature,\n} from './utils/signature/signatureToCompactSignature.js'\nexport {\n type ToPrefixedMessageErrorType,\n toPrefixedMessage,\n} from './utils/signature/toPrefixedMessage.js'\nexport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from './utils/signature/verifyHash.js'\nexport {\n type VerifyMessageErrorType,\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from './utils/signature/verifyMessage.js'\nexport {\n type VerifyTypedDataErrorType,\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from './utils/signature/verifyTypedData.js'\nexport { type StringifyErrorType, stringify } from './utils/stringify.js'\nexport {\n type AssertRequestErrorType,\n assertRequest,\n} from './utils/transaction/assertRequest.js'\nexport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionLegacy,\n} from './utils/transaction/assertTransaction.js'\nexport {\n type GetSerializedTransactionType,\n type GetSerializedTransactionTypeErrorType,\n getSerializedTransactionType,\n} from './utils/transaction/getSerializedTransactionType.js'\nexport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './utils/transaction/getTransactionType.js'\nexport {\n type ParseTransactionErrorType,\n type ParseTransactionReturnType,\n parseTransaction,\n} from './utils/transaction/parseTransaction.js'\nexport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './utils/transaction/serializeAccessList.js'\nexport {\n type SerializedTransactionReturnType,\n type SerializeTransactionErrorType,\n type SerializeTransactionFn,\n serializeTransaction,\n} from './utils/transaction/serializeTransaction.js'\nexport {\n type DomainSeparatorErrorType,\n domainSeparator,\n type GetTypesForEIP712DomainErrorType,\n getTypesForEIP712Domain,\n type SerializeTypedDataErrorType,\n serializeTypedData,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from './utils/typedData.js'\nexport {\n type FormatEtherErrorType,\n formatEther,\n} from './utils/unit/formatEther.js'\nexport {\n type FormatGweiErrorType,\n formatGwei,\n} from './utils/unit/formatGwei.js'\nexport {\n type FormatUnitsErrorType,\n formatUnits,\n} from './utils/unit/formatUnits.js'\nexport {\n type ParseEtherErrorType,\n parseEther,\n} from './utils/unit/parseEther.js'\nexport { type ParseGweiErrorType, parseGwei } from './utils/unit/parseGwei.js'\nexport {\n type ParseUnitsErrorType,\n parseUnits,\n} from './utils/unit/parseUnits.js'\n","import type { Chain } from '../types/chain.js'\n\n/**\n * Predeploy contracts for OP Stack.\n * @see https://github.com/ethereum-optimism/optimism/blob/develop/specs/predeploys.md\n */\nexport const contracts = {\n gasPriceOracle: { address: '0x420000000000000000000000000000000000000F' },\n l1Block: { address: '0x4200000000000000000000000000000000000015' },\n l2CrossDomainMessenger: {\n address: '0x4200000000000000000000000000000000000007',\n },\n l2Erc721Bridge: { address: '0x4200000000000000000000000000000000000014' },\n l2StandardBridge: { address: '0x4200000000000000000000000000000000000010' },\n l2ToL1MessagePasser: {\n address: '0x4200000000000000000000000000000000000016',\n },\n} as const satisfies Chain['contracts']\n","import type { ChainFormatters } from '../types/chain.js'\nimport type { RpcTransaction } from '../types/rpc.js'\nimport { hexToBigInt } from '../utils/encoding/fromHex.js'\nimport { defineBlock } from '../utils/formatters/block.js'\nimport {\n defineTransaction,\n formatTransaction,\n} from '../utils/formatters/transaction.js'\nimport { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js'\nimport type { OpStackBlock, OpStackRpcBlock } from './types/block.js'\nimport type {\n OpStackRpcTransaction,\n OpStackRpcTransactionReceipt,\n OpStackTransaction,\n OpStackTransactionReceipt,\n} from './types/transaction.js'\n\nexport const formatters = {\n block: /*#__PURE__*/ defineBlock({\n format(args: OpStackRpcBlock): OpStackBlock {\n const transactions = args.transactions?.map((transaction) => {\n if (typeof transaction === 'string') return transaction\n const formatted = formatTransaction(\n transaction as RpcTransaction,\n ) as OpStackTransaction\n if (formatted.typeHex === '0x7e') {\n formatted.isSystemTx = transaction.isSystemTx\n formatted.mint = transaction.mint\n ? hexToBigInt(transaction.mint)\n : undefined\n formatted.sourceHash = transaction.sourceHash\n formatted.type = 'deposit'\n }\n return formatted\n })\n return {\n transactions,\n stateRoot: args.stateRoot,\n } as OpStackBlock\n },\n }),\n transaction: /*#__PURE__*/ defineTransaction({\n format(args: OpStackRpcTransaction): OpStackTransaction {\n const transaction = {} as OpStackTransaction\n if (args.type === '0x7e') {\n transaction.isSystemTx = args.isSystemTx\n transaction.mint = args.mint ? hexToBigInt(args.mint) : undefined\n transaction.sourceHash = args.sourceHash\n transaction.type = 'deposit'\n }\n return transaction\n },\n }),\n transactionReceipt: /*#__PURE__*/ defineTransactionReceipt({\n format(args: OpStackRpcTransactionReceipt): OpStackTransactionReceipt {\n return {\n l1GasPrice: args.l1GasPrice ? hexToBigInt(args.l1GasPrice) : null,\n l1GasUsed: args.l1GasUsed ? hexToBigInt(args.l1GasUsed) : null,\n l1Fee: args.l1Fee ? hexToBigInt(args.l1Fee) : null,\n l1FeeScalar: args.l1FeeScalar ? Number(args.l1FeeScalar) : null,\n } as OpStackTransactionReceipt\n },\n }),\n} as const satisfies ChainFormatters\n","import { InvalidAddressError } from '../errors/address.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { ChainSerializers } from '../types/chain.js'\nimport type { Hex, Signature } from '../types/misc.js'\nimport type { TransactionSerializable } from '../types/transaction.js'\nimport type { RequiredBy } from '../types/utils.js'\nimport { isAddress } from '../utils/address/isAddress.js'\nimport { concatHex } from '../utils/data/concat.js'\nimport { toHex } from '../utils/encoding/toHex.js'\nimport { toRlp } from '../utils/encoding/toRlp.js'\nimport {\n type SerializeTransactionErrorType as SerializeTransactionErrorType_,\n serializeTransaction as serializeTransaction_,\n} from '../utils/transaction/serializeTransaction.js'\nimport type {\n OpStackTransactionSerializable,\n TransactionSerializableDeposit,\n TransactionSerializedDeposit,\n} from './types/transaction.js'\n\nexport type SerializeTransactionReturnType = ReturnType<\n typeof serializeTransaction\n>\n\nexport type SerializeTransactionErrorType =\n | SerializeTransactionErrorType_\n | ErrorType\n\nexport function serializeTransaction(\n transaction: OpStackTransactionSerializable,\n signature?: Signature,\n) {\n if (isDeposit(transaction)) return serializeTransactionDeposit(transaction)\n return serializeTransaction_(\n transaction as TransactionSerializable,\n signature,\n )\n}\n\nexport const serializers = {\n transaction: serializeTransaction,\n} as const satisfies ChainSerializers\n\n//////////////////////////////////////////////////////////////////////////////\n// Serializers\n\nexport type SerializeTransactionDepositReturnType = TransactionSerializedDeposit\n\nfunction serializeTransactionDeposit(\n transaction: TransactionSerializableDeposit,\n): SerializeTransactionDepositReturnType {\n assertTransactionDeposit(transaction)\n\n const { sourceHash, data, from, gas, isSystemTx, mint, to, value } =\n transaction\n\n const serializedTransaction: Hex[] = [\n sourceHash,\n from,\n to ?? '0x',\n mint ? toHex(mint) : '0x',\n value ? toHex(value) : '0x',\n gas ? toHex(gas) : '0x',\n isSystemTx ? '0x1' : '0x',\n data ?? '0x',\n ]\n\n return concatHex([\n '0x7e',\n toRlp(serializedTransaction),\n ]) as SerializeTransactionDepositReturnType\n}\n\nfunction isDeposit(\n transaction: OpStackTransactionSerializable,\n): transaction is RequiredBy {\n if (transaction.type === 'deposit') return true\n if (typeof transaction.sourceHash !== 'undefined') return true\n return false\n}\n\nexport function assertTransactionDeposit(\n transaction: TransactionSerializableDeposit,\n) {\n const { from, to } = transaction\n if (from && !isAddress(from)) throw new InvalidAddressError({ address: from })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n}\n","import { contracts } from './contracts.js'\nimport { formatters } from './formatters.js'\nimport { serializers } from './serializers.js'\n\nexport const chainConfig = {\n blockTime: 2_000,\n contracts,\n formatters,\n serializers,\n} as const\n","import { chainConfig } from '../../op-stack/chainConfig.js'\nimport { defineChain } from '../../utils/chain/defineChain.js'\n\nconst sourceId = 1 // mainnet\n\nexport const base = /*#__PURE__*/ defineChain({\n ...chainConfig,\n id: 8453,\n name: 'Base',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: {\n http: ['https://mainnet.base.org'],\n },\n },\n blockExplorers: {\n default: {\n name: 'Basescan',\n url: 'https://basescan.org',\n apiUrl: 'https://api.basescan.org/api',\n },\n },\n contracts: {\n ...chainConfig.contracts,\n disputeGameFactory: {\n [sourceId]: {\n address: '0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e',\n },\n },\n l2OutputOracle: {\n [sourceId]: {\n address: '0x56315b90c40730925ec5485cf004d835058518A0',\n },\n },\n multicall3: {\n address: '0xca11bde05977b3631167028862be2a173976ca11',\n blockCreated: 5022,\n },\n portal: {\n [sourceId]: {\n address: '0x49048044D57e1C92A77f79988d21Fa8fAF74E97e',\n blockCreated: 17482143,\n },\n },\n l1StandardBridge: {\n [sourceId]: {\n address: '0x3154Cf16ccdb4C6d922629664174b904d80F2C35',\n blockCreated: 17482143,\n },\n },\n },\n sourceId,\n})\n\nexport const basePreconf = /*#__PURE__*/ defineChain({\n ...base,\n experimental_preconfirmationTime: 200,\n rpcUrls: {\n default: {\n http: ['https://mainnet-preconf.base.org'],\n },\n },\n})\n","export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n","export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","import { z } from \"zod\";\n\n// ============================================================================\n// Reusable Primitive Schemas\n// ============================================================================\n\n/**\n * Non-empty string schema - a string with at least one character.\n * Used for required string fields that cannot be empty.\n */\nexport const NonEmptyString = z.string().min(1);\nexport type NonEmptyString = z.infer;\n\n/**\n * Any record schema - an object with unknown keys and values.\n * Used for scheme-specific payloads and other extensible objects.\n */\nexport const Any = z.record(z.unknown());\nexport type Any = z.infer;\n\n/**\n * Optional any record schema - an optional object with unknown keys and values.\n * Used for optional extension fields like `extra` and `extensions`.\n */\nexport const OptionalAny = z.record(z.unknown()).optional().nullable();\nexport type OptionalAny = z.infer;\n\n// ============================================================================\n// Network Schemas\n// ============================================================================\n\n/**\n * Network identifier schema for V1 - loose validation.\n * V1 accepts any non-empty string for backwards compatibility.\n */\nexport const NetworkSchemaV1 = NonEmptyString;\nexport type NetworkV1 = z.infer;\n\n/**\n * Network identifier schema for V2 - CAIP-2 format validation.\n * V2 requires minimum length of 3 and a colon separator (e.g., \"eip155:84532\", \"solana:devnet\").\n */\nexport const NetworkSchemaV2 = z\n .string()\n .min(3)\n .refine(val => val.includes(\":\"), {\n message: \"Network must be in CAIP-2 format (e.g., 'eip155:84532')\",\n });\nexport type NetworkV2 = z.infer;\n\n/**\n * Union network schema - accepts either V1 or V2 format.\n */\nexport const NetworkSchema = z.union([NetworkSchemaV1, NetworkSchemaV2]);\nexport type Network = z.infer;\n\n// ============================================================================\n// Shared Schemas\n// ============================================================================\n\n/**\n * ResourceInfo schema for V2 - describes the protected resource.\n */\nexport const ResourceInfoSchema = z.object({\n url: NonEmptyString,\n description: z.string().optional(),\n mimeType: z.string().optional(),\n});\nexport type ResourceInfo = z.infer;\n\n// ============================================================================\n// V1 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V1.\n * V1 includes resource info directly in the requirements object.\n */\nexport const PaymentRequirementsV1Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n maxAmountRequired: NonEmptyString,\n resource: NonEmptyString, // URL string in V1\n description: z.string(),\n mimeType: z.string().optional(),\n outputSchema: Any.optional().nullable(),\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n asset: NonEmptyString,\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV1 = z.infer;\n\n/**\n * PaymentRequired (402 response) schema for V1.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV1Schema = z.object({\n x402Version: z.literal(1),\n error: z.string().optional(),\n accepts: z.array(PaymentRequirementsV1Schema).min(1),\n});\nexport type PaymentRequiredV1 = z.infer;\n\n/**\n * PaymentPayload schema for V1.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV1Schema = z.object({\n x402Version: z.literal(1),\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n payload: Any,\n});\nexport type PaymentPayloadV1 = z.infer;\n\n// ============================================================================\n// V2 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V2.\n * V2 uses \"amount\" instead of \"maxAmountRequired\" and doesn't include resource info.\n */\nexport const PaymentRequirementsV2Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV2,\n amount: NonEmptyString,\n asset: NonEmptyString,\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV2 = z.infer;\n\n/**\n * PaymentRequired (402 response) schema for V2.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV2Schema = z.object({\n x402Version: z.literal(2),\n error: z.string().optional(),\n resource: ResourceInfoSchema,\n accepts: z.array(PaymentRequirementsV2Schema).min(1),\n extensions: OptionalAny,\n});\nexport type PaymentRequiredV2 = z.infer;\n\n/**\n * PaymentPayload schema for V2.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV2Schema = z.object({\n x402Version: z.literal(2),\n resource: ResourceInfoSchema.optional(),\n accepted: PaymentRequirementsV2Schema,\n payload: Any,\n extensions: OptionalAny,\n});\nexport type PaymentPayloadV2 = z.infer;\n\n// ============================================================================\n// Union Schemas (V1 | V2)\n// ============================================================================\n\n/**\n * PaymentRequirements union schema - accepts either V1 or V2 format.\n * Use this when you need to handle both versions.\n */\nexport const PaymentRequirementsSchema = z.union([\n PaymentRequirementsV1Schema,\n PaymentRequirementsV2Schema,\n]);\nexport type PaymentRequirements = z.infer;\n\n/**\n * PaymentRequired union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentRequiredSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentRequiredV1Schema,\n PaymentRequiredV2Schema,\n]);\nexport type PaymentRequired = z.infer;\n\n/**\n * PaymentPayload union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentPayloadSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentPayloadV1Schema,\n PaymentPayloadV2Schema,\n]);\nexport type PaymentPayload = z.infer;\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Validates a PaymentRequired object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequired(\n value: unknown,\n): z.SafeParseReturnType {\n return PaymentRequiredSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequired object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequired\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequired(value: unknown): PaymentRequired {\n return PaymentRequiredSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequired (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequired\n */\nexport function isPaymentRequired(value: unknown): value is PaymentRequired {\n return PaymentRequiredSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentRequirements object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequirements(\n value: unknown,\n): z.SafeParseReturnType {\n return PaymentRequirementsSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequirements object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequirements\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequirements(value: unknown): PaymentRequirements {\n return PaymentRequirementsSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequirements (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirements\n */\nexport function isPaymentRequirements(value: unknown): value is PaymentRequirements {\n return PaymentRequirementsSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentPayload object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentPayload(\n value: unknown,\n): z.SafeParseReturnType {\n return PaymentPayloadSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentPayload object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentPayload\n * @throws ZodError if validation fails\n */\nexport function validatePaymentPayload(value: unknown): PaymentPayload {\n return PaymentPayloadSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentPayload (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayload\n */\nexport function isPaymentPayload(value: unknown): value is PaymentPayload {\n return PaymentPayloadSchema.safeParse(value).success;\n}\n\n// ============================================================================\n// Version-Specific Type Guards\n// ============================================================================\n\n/**\n * Type guard for PaymentRequiredV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV1\n */\nexport function isPaymentRequiredV1(value: unknown): value is PaymentRequiredV1 {\n return PaymentRequiredV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequiredV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV2\n */\nexport function isPaymentRequiredV2(value: unknown): value is PaymentRequiredV2 {\n return PaymentRequiredV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV1\n */\nexport function isPaymentRequirementsV1(value: unknown): value is PaymentRequirementsV1 {\n return PaymentRequirementsV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV2\n */\nexport function isPaymentRequirementsV2(value: unknown): value is PaymentRequirementsV2 {\n return PaymentRequirementsV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV1\n */\nexport function isPaymentPayloadV1(value: unknown): value is PaymentPayloadV1 {\n return PaymentPayloadV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV2\n */\nexport function isPaymentPayloadV2(value: unknown): value is PaymentPayloadV2 {\n return PaymentPayloadV2Schema.safeParse(value).success;\n}\n\n// ============================================================================\n// Re-export zod for convenience\n// ============================================================================\n\nexport { z } from \"zod\";\n","export const x402Version = 2;\n","import { Network } from \"../types\";\n\n/**\n * Scheme data structure for facilitator storage\n */\nexport interface SchemeData {\n facilitator: T;\n networks: Set;\n pattern: Network;\n}\n\nexport const findSchemesByNetwork = (\n map: Map>,\n network: Network,\n): Map | undefined => {\n // Direct match first\n let implementationsByScheme = map.get(network);\n\n if (!implementationsByScheme) {\n // Try pattern matching for registered network patterns\n for (const [registeredNetworkPattern, implementations] of map.entries()) {\n // Convert the registered network pattern to a regex\n // e.g., \"eip155:*\" becomes /^eip155:.*$/\n const pattern = registeredNetworkPattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape special regex chars except *\n .replace(/\\\\\\*/g, \".*\"); // Replace escaped * with .*\n\n const regex = new RegExp(`^${pattern}$`);\n\n if (regex.test(network)) {\n implementationsByScheme = implementations;\n break;\n }\n }\n }\n\n return implementationsByScheme;\n};\n\nexport const findByNetworkAndScheme = (\n map: Map>,\n scheme: string,\n network: Network,\n): T | undefined => {\n return findSchemesByNetwork(map, network)?.get(scheme);\n};\n\n/**\n * Finds a facilitator by scheme and network using pattern matching.\n * Works with new SchemeData storage structure.\n *\n * @param schemeMap - Map of scheme names to SchemeData\n * @param scheme - The scheme to find\n * @param network - The network to match against\n * @returns The facilitator if found, undefined otherwise\n */\nexport const findFacilitatorBySchemeAndNetwork = (\n schemeMap: Map>,\n scheme: string,\n network: Network,\n): T | undefined => {\n const schemeData = schemeMap.get(scheme);\n if (!schemeData) return undefined;\n\n // Check if network is in the stored networks set\n if (schemeData.networks.has(network)) {\n return schemeData.facilitator;\n }\n\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(network)) {\n return schemeData.facilitator;\n }\n\n return undefined;\n};\n\nexport const Base64EncodedRegex = /^[A-Za-z0-9+/]*={0,2}$/;\n\n/**\n * Encodes a string to base64 format\n *\n * @param data - The string to be encoded to base64\n * @returns The base64 encoded string\n */\nexport function safeBase64Encode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.btoa === \"function\") {\n const bytes = new TextEncoder().encode(data);\n const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join(\"\");\n return globalThis.btoa(binaryString);\n }\n return Buffer.from(data, \"utf8\").toString(\"base64\");\n}\n\n/**\n * Decodes a base64 string back to its original format\n *\n * @param data - The base64 encoded string to be decoded\n * @returns The decoded string in UTF-8 format\n */\nexport function safeBase64Decode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.atob === \"function\") {\n const binaryString = globalThis.atob(data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const decoder = new TextDecoder(\"utf-8\");\n return decoder.decode(bytes);\n }\n return Buffer.from(data, \"base64\").toString(\"utf-8\");\n}\n\n/**\n * Deep equality comparison for payment requirements\n * Uses a normalized JSON.stringify for consistent comparison\n *\n * @param obj1 - First object to compare\n * @param obj2 - Second object to compare\n * @returns True if objects are deeply equal\n */\nexport function deepEqual(obj1: unknown, obj2: unknown): boolean {\n // Normalize and stringify both objects for comparison\n // This handles nested objects, arrays, and different property orders\n const normalize = (obj: unknown): string => {\n // Handle primitives and null/undefined\n if (obj === null || obj === undefined) return JSON.stringify(obj);\n if (typeof obj !== \"object\") return JSON.stringify(obj);\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return JSON.stringify(\n obj.map(item =>\n typeof item === \"object\" && item !== null ? JSON.parse(normalize(item)) : item,\n ),\n );\n }\n\n // Handle objects - sort keys and recursively normalize values\n const sorted: Record = {};\n Object.keys(obj as Record)\n .sort()\n .forEach(key => {\n const value = (obj as Record)[key];\n sorted[key] =\n typeof value === \"object\" && value !== null ? JSON.parse(normalize(value)) : value;\n });\n return JSON.stringify(sorted);\n };\n\n try {\n return normalize(obj1) === normalize(obj2);\n } catch {\n // Fallback to simple comparison if normalization fails\n return JSON.stringify(obj1) === JSON.stringify(obj2);\n }\n}\n","import { x402ResourceServer, SettlementOverrides } from \"../server\";\nimport {\n decodePaymentSignatureHeader,\n encodePaymentRequiredHeader,\n encodePaymentResponseHeader,\n} from \".\";\nimport {\n PaymentPayload,\n PaymentRequired,\n SettleResponse,\n SettleError,\n FacilitatorResponseError,\n Price,\n Network,\n PaymentRequirements,\n} from \"../types\";\nimport { x402Version } from \"..\";\n\nexport const SETTLEMENT_OVERRIDES_HEADER = \"Settlement-Overrides\";\n\n/**\n * Framework-agnostic HTTP adapter interface\n * Implementations provide framework-specific HTTP operations\n */\nexport interface HTTPAdapter {\n getHeader(name: string): string | undefined;\n getMethod(): string;\n getPath(): string;\n getUrl(): string;\n getAcceptHeader(): string;\n getUserAgent(): string;\n\n /**\n * Get query parameters from the request URL\n *\n * @returns Record of query parameter key-value pairs\n */\n getQueryParams?(): Record;\n\n /**\n * Get a specific query parameter by name\n *\n * @param name - The query parameter name\n * @returns The query parameter value(s) or undefined\n */\n getQueryParam?(name: string): string | string[] | undefined;\n\n /**\n * Get the parsed request body\n * Framework adapters should parse JSON/form data appropriately\n *\n * @returns The parsed request body\n */\n getBody?(): unknown;\n}\n\n/**\n * Paywall configuration for HTML responses\n */\nexport interface PaywallConfig {\n appName?: string;\n appLogo?: string;\n sessionTokenEndpoint?: string;\n currentUrl?: string;\n testnet?: boolean;\n}\n\n/**\n * Paywall provider interface for generating HTML\n */\nexport interface PaywallProvider {\n generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string;\n}\n\n/**\n * Dynamic payTo function that receives HTTP request context\n */\nexport type DynamicPayTo = (context: HTTPRequestContext) => string | Promise;\n\n/**\n * Dynamic price function that receives HTTP request context\n */\nexport type DynamicPrice = (context: HTTPRequestContext) => Price | Promise;\n\n/**\n * Result of response body callbacks containing content type and body.\n */\nexport interface HTTPResponseBody {\n /**\n * The content type for the response (e.g., 'application/json', 'text/plain').\n */\n contentType: string;\n\n /**\n * The response body to include in the 402 response.\n */\n body: unknown;\n}\n\n/**\n * Dynamic function to generate a custom response for unpaid requests.\n * Receives the HTTP request context and returns the content type and body to include in the 402 response.\n */\nexport type UnpaidResponseBody = (\n context: HTTPRequestContext,\n) => HTTPResponseBody | Promise;\n\n/**\n * Dynamic function to generate a custom response for settlement failures.\n * Receives the HTTP request context and settle failure result, returns the content type and body.\n */\nexport type SettlementFailedResponseBody = (\n context: HTTPRequestContext,\n settleResult: Omit,\n) => HTTPResponseBody | Promise;\n\n/**\n * A single payment option for a route\n * Represents one way a client can pay for access to the resource\n */\nexport interface PaymentOption {\n scheme: string;\n payTo: string | DynamicPayTo;\n price: Price | DynamicPrice;\n network: Network;\n maxTimeoutSeconds?: number;\n extra?: Record;\n}\n\n/**\n * Route configuration for HTTP endpoints\n *\n * The 'accepts' field defines payment options for the route.\n * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods.\n */\nexport interface RouteConfig {\n // Payment option(s): single or array\n accepts: PaymentOption | PaymentOption[];\n\n // HTTP-specific metadata\n resource?: string;\n description?: string;\n mimeType?: string;\n customPaywallHtml?: string;\n\n /**\n * Optional callback to generate a custom response for unpaid API requests.\n * This allows servers to return preview data, error messages, or other content\n * when a request lacks payment.\n *\n * For browser requests (Accept: text/html), the paywall HTML takes precedence.\n * This callback is only used for API clients.\n *\n * If not provided, defaults to { contentType: 'application/json', body: {} }.\n *\n * @param context - The HTTP request context\n * @returns An object containing both contentType and body for the 402 response\n */\n unpaidResponseBody?: UnpaidResponseBody;\n\n /**\n * Optional callback to generate a custom response for settlement failures.\n * If not provided, defaults to { contentType: 'application/json', body: {} }.\n *\n * @param context - The HTTP request context\n * @param settleResult - The settlement failure result\n * @returns An object containing both contentType and body for the 402 response\n */\n settlementFailedResponseBody?: SettlementFailedResponseBody;\n\n // Extensions\n extensions?: Record;\n}\n\n/**\n * Routes configuration - maps path patterns to route configs\n */\nexport type RoutesConfig = Record | RouteConfig;\n\n/**\n * Hook that runs on every request to a protected route, before payment processing.\n * Can grant access without payment, deny the request, or continue to payment flow.\n *\n * @returns\n * - `void` - Continue to payment processing (default behavior)\n * - `{ grantAccess: true }` - Grant access without requiring payment\n * - `{ abort: true; reason: string }` - Deny the request (returns 403)\n */\nexport type ProtectedRequestHook = (\n context: HTTPRequestContext,\n routeConfig: RouteConfig,\n) => Promise;\n\n/**\n * Compiled route for efficient matching\n */\nexport interface CompiledRoute {\n verb: string;\n regex: RegExp;\n config: RouteConfig;\n pattern: string;\n}\n\n/**\n * HTTP request context that encapsulates all request data\n */\nexport interface HTTPRequestContext {\n adapter: HTTPAdapter;\n path: string;\n method: string;\n paymentHeader?: string;\n routePattern?: string;\n}\n\n/**\n * HTTP transport context contains both request context and optional response data.\n */\nexport interface HTTPTransportContext {\n /** The HTTP request context */\n request: HTTPRequestContext;\n /** The response body buffer */\n responseBody?: Buffer;\n /** Response headers set by the route handler (used for settlement overrides) */\n responseHeaders?: Record;\n}\n\n/**\n * HTTP response instructions for the framework middleware\n */\nexport interface HTTPResponseInstructions {\n status: number;\n headers: Record;\n body?: unknown; // e.g. Paywall for web browser requests, but could be any other type\n isHtml?: boolean; // e.g. if body is a paywall, then isHtml is true\n}\n\n/**\n * Result of processing an HTTP request for payment\n */\nexport type HTTPProcessResult =\n | { type: \"no-payment-required\" }\n | {\n type: \"payment-verified\";\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n declaredExtensions?: Record;\n }\n | { type: \"payment-error\"; response: HTTPResponseInstructions };\n\n/**\n * Result of processSettlement\n */\nexport type ProcessSettleSuccessResponse = SettleResponse & {\n success: true;\n headers: Record;\n requirements: PaymentRequirements;\n};\n\nexport type ProcessSettleFailureResponse = SettleResponse & {\n success: false;\n errorReason: string;\n errorMessage?: string;\n headers: Record;\n response: HTTPResponseInstructions;\n};\n\nexport type ProcessSettleResultResponse =\n | ProcessSettleSuccessResponse\n | ProcessSettleFailureResponse;\n\n/**\n * Represents a validation error for a specific route's payment configuration.\n */\nexport interface RouteValidationError {\n /** The route pattern (e.g., \"GET /api/weather\") */\n routePattern: string;\n /** The payment scheme that failed validation */\n scheme: string;\n /** The network that failed validation */\n network: Network;\n /** The type of validation failure */\n reason: \"missing_scheme\" | \"missing_facilitator\";\n /** Human-readable error message */\n message: string;\n}\n\n/**\n * Error thrown when route configuration validation fails.\n */\nexport class RouteConfigurationError extends Error {\n /** The validation errors that caused this exception */\n public readonly errors: RouteValidationError[];\n\n /**\n * Creates a new RouteConfigurationError with the given validation errors.\n *\n * @param errors - The validation errors that caused this exception.\n */\n constructor(errors: RouteValidationError[]) {\n const message = `x402 Route Configuration Errors:\\n${errors.map(e => ` - ${e.message}`).join(\"\\n\")}`;\n super(message);\n this.name = \"RouteConfigurationError\";\n this.errors = errors;\n }\n}\n\n/**\n * HTTP-enhanced x402 resource server\n * Provides framework-agnostic HTTP protocol handling\n */\nexport class x402HTTPResourceServer {\n private ResourceServer: x402ResourceServer;\n private compiledRoutes: CompiledRoute[] = [];\n private routesConfig: RoutesConfig;\n private paywallProvider?: PaywallProvider;\n private protectedRequestHooks: ProtectedRequestHook[] = [];\n\n /**\n * Creates a new x402HTTPResourceServer instance.\n *\n * @param ResourceServer - The core x402ResourceServer instance to use\n * @param routes - Route configuration for payment-protected endpoints\n */\n constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig) {\n this.ResourceServer = ResourceServer;\n this.routesConfig = routes;\n\n // Handle both single route and multiple routes\n const normalizedRoutes =\n typeof routes === \"object\" && !(\"accepts\" in routes)\n ? (routes as Record)\n : { \"*\": routes as RouteConfig };\n\n for (const [pattern, config] of Object.entries(normalizedRoutes)) {\n const parsed = this.parseRoutePattern(pattern);\n this.compiledRoutes.push({\n verb: parsed.verb,\n regex: parsed.regex,\n config,\n pattern: parsed.path,\n });\n }\n }\n\n /**\n * Get the underlying x402ResourceServer instance.\n *\n * @returns The underlying x402ResourceServer instance\n */\n get server(): x402ResourceServer {\n return this.ResourceServer;\n }\n\n /**\n * Get the routes configuration.\n *\n * @returns The routes configuration\n */\n get routes(): RoutesConfig {\n return this.routesConfig;\n }\n\n /**\n * Initialize the HTTP resource server.\n *\n * This method initializes the underlying resource server (fetching facilitator support)\n * and then validates that all route payment configurations have corresponding\n * registered schemes and facilitator support.\n *\n * @throws RouteConfigurationError if any route's payment options don't have\n * corresponding registered schemes or facilitator support\n *\n * @example\n * ```typescript\n * const httpServer = new x402HTTPResourceServer(server, routes);\n * await httpServer.initialize();\n * ```\n */\n async initialize(): Promise {\n // First, initialize the underlying resource server (fetches facilitator support)\n await this.ResourceServer.initialize();\n\n // Then validate route configuration\n const errors = this.validateRouteConfiguration();\n if (errors.length > 0) {\n throw new RouteConfigurationError(errors);\n }\n }\n\n /**\n * Register a custom paywall provider for generating HTML\n *\n * @param provider - PaywallProvider instance\n * @returns This service instance for chaining\n */\n registerPaywallProvider(provider: PaywallProvider): this {\n this.paywallProvider = provider;\n return this;\n }\n\n /**\n * Register a hook that runs on every request to a protected route, before payment processing.\n * Hooks are executed in order of registration. The first hook to return a non-void result wins.\n *\n * @param hook - The request hook function\n * @returns The x402HTTPResourceServer instance for chaining\n */\n onProtectedRequest(hook: ProtectedRequestHook): this {\n this.protectedRequestHooks.push(hook);\n return this;\n }\n\n /**\n * Process HTTP request and return response instructions\n * This is the main entry point for framework middleware\n *\n * @param context - HTTP request context\n * @param paywallConfig - Optional paywall configuration\n * @returns Process result indicating next action for middleware\n */\n async processHTTPRequest(\n context: HTTPRequestContext,\n paywallConfig?: PaywallConfig,\n ): Promise {\n const method = context.method || context.adapter.getMethod();\n context = { ...context, method };\n const { adapter, path } = context;\n\n // Find matching route\n const routeMatch = this.getRouteConfig(path, method);\n if (!routeMatch) {\n return { type: \"no-payment-required\" }; // No payment required for this route\n }\n const { config: routeConfig, pattern: routePattern } = routeMatch;\n const enrichedContext: HTTPRequestContext = { ...context, routePattern };\n\n // Execute request hooks before any payment processing\n for (const hook of this.protectedRequestHooks) {\n const result = await hook(enrichedContext, routeConfig);\n if (result && \"grantAccess\" in result) {\n return { type: \"no-payment-required\" };\n }\n if (result && \"abort\" in result) {\n return {\n type: \"payment-error\",\n response: {\n status: 403,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: result.reason },\n },\n };\n }\n }\n\n // Normalize accepts field to array of payment options\n const paymentOptions = this.normalizePaymentOptions(routeConfig);\n\n // Check for payment header (v1 or v2)\n const paymentPayload = this.extractPayment(adapter);\n\n // Create resource info, using config override if provided\n const resourceInfo = {\n url: routeConfig.resource || enrichedContext.adapter.getUrl(),\n description: routeConfig.description || \"\",\n mimeType: routeConfig.mimeType || \"\",\n };\n\n // Build requirements from all payment options\n // (this method handles resolving dynamic functions internally)\n let requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions(\n paymentOptions,\n enrichedContext,\n );\n\n let extensions = routeConfig.extensions;\n if (extensions) {\n extensions = this.ResourceServer.enrichExtensions(extensions, enrichedContext);\n }\n\n // createPaymentRequiredResponse already handles extension enrichment in the core layer\n const transportContext: HTTPTransportContext = { request: enrichedContext };\n const paymentRequired = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n !paymentPayload ? \"Payment required\" : undefined,\n extensions,\n transportContext,\n );\n\n // If no payment provided\n if (!paymentPayload) {\n // Resolve custom unpaid response body if provided\n const unpaidBody = routeConfig.unpaidResponseBody\n ? await routeConfig.unpaidResponseBody(enrichedContext)\n : undefined;\n\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(\n paymentRequired,\n this.isWebBrowser(adapter),\n paywallConfig,\n routeConfig.customPaywallHtml,\n unpaidBody,\n ),\n };\n }\n\n // Verify payment\n try {\n const matchingRequirements = this.ResourceServer.findMatchingRequirements(\n paymentRequired.accepts,\n paymentPayload,\n );\n\n if (!matchingRequirements) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements\",\n routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n const verifyResult = await this.ResourceServer.verifyPayment(\n paymentPayload,\n matchingRequirements,\n );\n\n if (!verifyResult.isValid) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n verifyResult.invalidReason,\n routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n // Payment is valid, return data needed for settlement\n return {\n type: \"payment-verified\",\n paymentPayload,\n paymentRequirements: matchingRequirements,\n declaredExtensions: routeConfig.extensions,\n };\n } catch (error) {\n if (error instanceof FacilitatorResponseError) {\n throw error;\n }\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n error instanceof Error ? error.message : \"Payment verification failed\",\n routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n }\n\n /**\n * Process settlement after successful response\n *\n * @param paymentPayload - The verified payment payload\n * @param requirements - The matching payment requirements\n * @param declaredExtensions - Optional declared extensions (for per-key enrichment)\n * @param transportContext - Optional HTTP transport context\n * @param settlementOverrides - Optional settlement overrides (e.g., partial settlement amount)\n * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure\n */\n async processSettlement(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions?: Record,\n transportContext?: HTTPTransportContext,\n settlementOverrides?: SettlementOverrides,\n ): Promise {\n if (transportContext?.request && !transportContext.request.method) {\n transportContext = {\n ...transportContext,\n request: {\n ...transportContext.request,\n method: transportContext.request.adapter.getMethod(),\n },\n };\n }\n try {\n // Resolve overrides: explicit param takes precedence, fall back to response header\n let resolvedOverrides = settlementOverrides;\n if (!resolvedOverrides && transportContext?.responseHeaders) {\n const overridesKey = SETTLEMENT_OVERRIDES_HEADER.toLowerCase();\n const rawValue = Object.entries(transportContext.responseHeaders).find(\n ([key]) => key.toLowerCase() === overridesKey,\n )?.[1];\n if (rawValue) {\n try {\n resolvedOverrides = JSON.parse(rawValue);\n } catch {\n // Ignore malformed header\n }\n }\n }\n\n const settleResponse = await this.ResourceServer.settlePayment(\n paymentPayload,\n requirements,\n declaredExtensions,\n transportContext,\n resolvedOverrides,\n );\n\n if (!settleResponse.success) {\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason: settleResponse.errorReason || \"Settlement failed\",\n errorMessage:\n settleResponse.errorMessage || settleResponse.errorReason || \"Settlement failed\",\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n\n return {\n ...settleResponse,\n success: true,\n headers: this.createSettlementHeaders(settleResponse),\n requirements,\n };\n } catch (error) {\n if (error instanceof FacilitatorResponseError) {\n throw error;\n }\n if (error instanceof SettleError) {\n const errorReason = error.errorReason || error.message;\n const settleResponse: SettleResponse = {\n success: false,\n errorReason,\n errorMessage: error.errorMessage || errorReason,\n payer: error.payer,\n network: error.network,\n transaction: error.transaction,\n };\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason,\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n const errorReason = error instanceof Error ? error.message : \"Settlement failed\";\n const settleResponse: SettleResponse = {\n success: false,\n errorReason,\n errorMessage: errorReason,\n network: requirements.network as Network,\n transaction: \"\",\n };\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason,\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n }\n\n /**\n * Check if a request requires payment based on route configuration\n *\n * @param context - HTTP request context\n * @returns True if the route requires payment, false otherwise\n */\n requiresPayment(context: HTTPRequestContext): boolean {\n const method = context.method || context.adapter.getMethod();\n return this.getRouteConfig(context.path, method) !== undefined;\n }\n\n /**\n * Build HTTPResponseInstructions for settlement failure.\n * Uses settlementFailedResponseBody hook if configured, otherwise defaults to empty body.\n *\n * @param failure - Settlement failure result with headers\n * @param transportContext - Optional HTTP transport context for the request\n * @returns HTTP response instructions for the 402 settlement failure response\n */\n private async buildSettlementFailureResponse(\n failure: Omit,\n transportContext?: HTTPTransportContext,\n ): Promise {\n const settlementHeaders = failure.headers;\n const routeConfig = transportContext\n ? this.getRouteConfig(transportContext.request.path, transportContext.request.method)\n : undefined;\n\n const customBody = routeConfig?.config.settlementFailedResponseBody\n ? await routeConfig.config.settlementFailedResponseBody(transportContext!.request, failure)\n : undefined;\n\n const contentType = customBody ? customBody.contentType : \"application/json\";\n const body = customBody ? customBody.body : {};\n\n return {\n status: 402,\n headers: {\n \"Content-Type\": contentType,\n ...settlementHeaders,\n },\n body,\n isHtml: contentType.includes(\"text/html\"),\n };\n }\n\n /**\n * Normalizes a RouteConfig's accepts field into an array of PaymentOptions\n * Handles both single PaymentOption and array formats\n *\n * @param routeConfig - Route configuration\n * @returns Array of payment options\n */\n private normalizePaymentOptions(routeConfig: RouteConfig): PaymentOption[] {\n return Array.isArray(routeConfig.accepts) ? routeConfig.accepts : [routeConfig.accepts];\n }\n\n /**\n * Validates that all payment options in routes have corresponding registered schemes\n * and facilitator support.\n *\n * @returns Array of validation errors (empty if all routes are valid)\n */\n private validateRouteConfiguration(): RouteValidationError[] {\n const errors: RouteValidationError[] = [];\n\n // Normalize routes to array of [pattern, config] pairs\n const normalizedRoutes =\n typeof this.routesConfig === \"object\" && !(\"accepts\" in this.routesConfig)\n ? Object.entries(this.routesConfig as Record)\n : [[\"*\", this.routesConfig as RouteConfig] as [string, RouteConfig]];\n\n for (const [pattern, config] of normalizedRoutes) {\n // Warn if wildcard routes are used with discovery extensions\n const pathPart = pattern.includes(\" \") ? pattern.split(/\\s+/)[1] : pattern;\n if (\n pathPart &&\n pathPart.includes(\"*\") &&\n config.extensions &&\n \"bazaar\" in config.extensions\n ) {\n console.warn(\n `[x402] Route \"${pattern}\": Wildcard (*) patterns with bazaar discovery extensions ` +\n `will auto-generate parameter names (var1, var2, ...). ` +\n `Consider using named parameters instead (e.g. /weather/:city) for better discovery metadata.`,\n );\n }\n\n const paymentOptions = this.normalizePaymentOptions(config);\n\n for (const option of paymentOptions) {\n // Check 1: Is scheme registered?\n if (!this.ResourceServer.hasRegisteredScheme(option.network, option.scheme)) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_scheme\",\n message: `Route \"${pattern}\": No scheme implementation registered for \"${option.scheme}\" on network \"${option.network}\"`,\n });\n // Skip facilitator check if scheme isn't registered\n continue;\n }\n\n // Check 2: Does facilitator support this scheme/network combination?\n const supportedKind = this.ResourceServer.getSupportedKind(\n x402Version,\n option.network,\n option.scheme,\n );\n\n if (!supportedKind) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_facilitator\",\n message: `Route \"${pattern}\": Facilitator does not support scheme \"${option.scheme}\" on network \"${option.network}\"`,\n });\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Get route configuration for a request\n *\n * @param path - Request path\n * @param method - HTTP method\n * @returns Route configuration and pattern, or undefined if no match\n */\n private getRouteConfig(\n path: string,\n method: string,\n ): { config: RouteConfig; pattern: string } | undefined {\n const normalizedPath = this.normalizePath(path);\n const upperMethod = method.toUpperCase();\n\n const matchingRoute = this.compiledRoutes.find(\n route =>\n route.regex.test(normalizedPath) && (route.verb === \"*\" || route.verb === upperMethod),\n );\n\n if (!matchingRoute) return undefined;\n return { config: matchingRoute.config, pattern: matchingRoute.pattern };\n }\n\n /**\n * Extract payment from HTTP headers (handles v1 and v2)\n *\n * @param adapter - HTTP adapter\n * @returns Decoded payment payload or null\n */\n private extractPayment(adapter: HTTPAdapter): PaymentPayload | null {\n // Check v2 header first (PAYMENT-SIGNATURE)\n const header = adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"PAYMENT-SIGNATURE\");\n\n if (header) {\n try {\n return decodePaymentSignatureHeader(header);\n } catch (error) {\n console.warn(\"Failed to decode PAYMENT-SIGNATURE header:\", error);\n }\n }\n\n return null;\n }\n\n /**\n * Check if request is from a web browser\n *\n * @param adapter - HTTP adapter\n * @returns True if request appears to be from a browser\n */\n private isWebBrowser(adapter: HTTPAdapter): boolean {\n const accept = adapter.getAcceptHeader();\n const userAgent = adapter.getUserAgent();\n return accept.includes(\"text/html\") && userAgent.includes(\"Mozilla\");\n }\n\n /**\n * Create HTTP response instructions from payment required\n *\n * @param paymentRequired - Payment requirements\n * @param isWebBrowser - Whether request is from browser\n * @param paywallConfig - Paywall configuration\n * @param customHtml - Custom HTML template\n * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests\n * @returns Response instructions\n */\n private createHTTPResponse(\n paymentRequired: PaymentRequired,\n isWebBrowser: boolean,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n unpaidResponse?: HTTPResponseBody,\n ): HTTPResponseInstructions {\n // Use 412 Precondition Failed for permit2_allowance_required error\n // This signals client needs to approve Permit2 before retrying\n const status = paymentRequired.error === \"permit2_allowance_required\" ? 412 : 402;\n\n if (isWebBrowser) {\n const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml);\n return {\n status,\n headers: { \"Content-Type\": \"text/html\" },\n body: html,\n isHtml: true,\n };\n }\n\n const response = this.createHTTPPaymentRequiredResponse(paymentRequired);\n\n // Use callback result if provided, otherwise default to JSON with empty object\n const contentType = unpaidResponse ? unpaidResponse.contentType : \"application/json\";\n const body = unpaidResponse ? unpaidResponse.body : {};\n\n return {\n status,\n headers: {\n \"Content-Type\": contentType,\n ...response.headers,\n },\n body,\n };\n }\n\n /**\n * Create HTTP payment required response (v1 puts in body, v2 puts in header)\n *\n * @param paymentRequired - Payment required object\n * @returns Headers and body for the HTTP response\n */\n private createHTTPPaymentRequiredResponse(paymentRequired: PaymentRequired): {\n headers: Record;\n } {\n return {\n headers: {\n \"PAYMENT-REQUIRED\": encodePaymentRequiredHeader(paymentRequired),\n },\n };\n }\n\n /**\n * Create settlement response headers\n *\n * @param settleResponse - Settlement response\n * @returns Headers to add to response\n */\n private createSettlementHeaders(settleResponse: SettleResponse): Record {\n const encoded = encodePaymentResponseHeader(settleResponse);\n return { \"PAYMENT-RESPONSE\": encoded };\n }\n\n /**\n * Parse route pattern into verb and regex\n *\n * @param pattern - Route pattern like \"GET /api/*\", \"/api/[id]\", or \"/api/:id\"\n * @returns Parsed pattern with verb and regex\n */\n private parseRoutePattern(pattern: string): { verb: string; regex: RegExp; path: string } {\n const [verb, path] = pattern.includes(\" \") ? pattern.split(/\\s+/) : [\"*\", pattern];\n\n const regex = new RegExp(\n `^${\n path\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/[$()+.?^{|}]/g, \"\\\\$&\") // Escape regex special chars\n .replace(/\\*/g, \".*?\") // Wildcards\n .replace(/\\[([^\\]]+)\\]/g, \"[^/]+\") // Parameters (Next.js style [param])\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, \"[^/]+\") // Parameters (Express style :param)\n .replace(/\\//g, \"\\\\/\") // Escape slashes\n }$`,\n \"i\",\n );\n\n return { verb: verb.toUpperCase(), regex, path };\n }\n\n /**\n * Normalize path for matching\n *\n * @param path - Raw path from request\n * @returns Normalized path\n */\n private normalizePath(path: string): string {\n const pathWithoutQuery = path.split(/[?#]/)[0];\n\n let decodedOrRawPath: string;\n try {\n decodedOrRawPath = decodeURIComponent(pathWithoutQuery);\n } catch {\n decodedOrRawPath = pathWithoutQuery;\n }\n\n return decodedOrRawPath\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/(.+?)\\/+$/, \"$1\");\n }\n\n /**\n * Generate paywall HTML for browser requests\n *\n * @param paymentRequired - Payment required response\n * @param paywallConfig - Optional paywall configuration\n * @param customHtml - Optional custom HTML template\n * @returns HTML string\n */\n private generatePaywallHTML(\n paymentRequired: PaymentRequired,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n ): string {\n if (customHtml) {\n return customHtml;\n }\n\n // Use custom paywall provider if set\n if (this.paywallProvider) {\n return this.paywallProvider.generateHtml(paymentRequired, paywallConfig);\n }\n\n // Try to use @x402/paywall if available (optional dependency)\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const paywall = require(\"@x402/paywall\");\n const displayAmount = this.getDisplayAmount(paymentRequired);\n const resource = paymentRequired.resource;\n\n return paywall.getPaywallHtml({\n amount: displayAmount,\n paymentRequired,\n currentUrl: resource?.url || paywallConfig?.currentUrl || \"\",\n testnet: paywallConfig?.testnet ?? true,\n appName: paywallConfig?.appName,\n appLogo: paywallConfig?.appLogo,\n sessionTokenEndpoint: paywallConfig?.sessionTokenEndpoint,\n });\n } catch {\n // @x402/paywall not installed, fall back to basic HTML\n }\n\n // Fallback: Basic HTML paywall\n const resource = paymentRequired.resource;\n const displayAmount = this.getDisplayAmount(paymentRequired);\n\n return `\n \n \n \n Payment Required\n \n \n \n \n
\n ${paywallConfig?.appLogo ? `\"${paywallConfig.appName` : \"\"}\n

Payment Required

\n ${resource ? `

Resource: ${resource.description || resource.url}

` : \"\"}\n

Amount: $${displayAmount.toFixed(2)} USDC

\n
\n \n

\n Note: Install @x402/paywall for full wallet connection and payment UI.\n

\n
\n
\n \n \n `;\n }\n\n /**\n * Extract display amount from payment requirements.\n *\n * @param paymentRequired - The payment required object\n * @returns The display amount in decimal format\n */\n private getDisplayAmount(paymentRequired: PaymentRequired): number {\n const accepts = paymentRequired.accepts;\n if (accepts && accepts.length > 0) {\n const firstReq = accepts[0];\n if (\"amount\" in firstReq) {\n // V2 format\n return parseFloat(firstReq.amount) / 1000000; // Assuming USDC with 6 decimals\n }\n }\n return 0;\n }\n}\n","import { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport {\n VerifyResponse,\n SettleResponse,\n SupportedResponse,\n VerifyError,\n SettleError,\n FacilitatorResponseError,\n} from \"../types/facilitator\";\nimport { z } from \"../schemas\";\n\nconst DEFAULT_FACILITATOR_URL = \"https://x402.org/facilitator\";\n\nexport interface FacilitatorConfig {\n url?: string;\n createAuthHeaders?: () => Promise<{\n verify: Record;\n settle: Record;\n supported: Record;\n }>;\n}\n\n/**\n * Interface for facilitator clients\n * Can be implemented for HTTP-based or local facilitators\n */\nexport interface FacilitatorClient {\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise;\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise;\n\n /**\n * Get supported payment kinds and extensions from the facilitator\n *\n * @returns Supported payment kinds and extensions\n */\n getSupported(): Promise;\n}\n\n/** Number of retries for getSupported() on 429 rate limit errors */\nconst GET_SUPPORTED_RETRIES = 3;\n/** Base delay in ms for exponential backoff on retries */\nconst GET_SUPPORTED_RETRY_DELAY_MS = 1000;\n\nconst verifyResponseSchema: z.ZodType = z.object({\n isValid: z.boolean(),\n invalidReason: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n invalidMessage: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n payer: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n extensions: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n});\n\nconst settleResponseSchema: z.ZodType = z.object({\n success: z.boolean(),\n errorReason: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n errorMessage: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n payer: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n transaction: z.string(),\n network: z.custom(value => typeof value === \"string\"),\n extensions: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n});\n\nconst supportedKindSchema: z.ZodType =\n z.object({\n x402Version: z.number(),\n scheme: z.string(),\n network: z.custom(\n value => typeof value === \"string\",\n ),\n extra: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n });\n\nconst supportedResponseSchema: z.ZodType = z.object({\n kinds: z.array(supportedKindSchema),\n extensions: z.array(z.string()).default([]),\n signers: z.record(z.string(), z.array(z.string())).default({}),\n});\n\n/**\n * Produces a compact excerpt of a facilitator response body for error messages.\n *\n * @param text - The raw response body text\n * @param limit - The maximum number of characters to include\n * @returns A normalized excerpt suitable for logs and thrown errors\n */\nfunction responseExcerpt(text: string, limit: number = 200): string {\n const compact = text.trim().replace(/\\s+/g, \" \");\n if (!compact) {\n return \"\";\n }\n\n if (compact.length <= limit) {\n return compact;\n }\n\n return `${compact.slice(0, limit - 3)}...`;\n}\n\n/**\n * Parses and validates a successful facilitator response body.\n *\n * @param response - The HTTP response returned by the facilitator\n * @param schema - The schema used to validate the response payload\n * @param operation - The facilitator operation name for error reporting\n * @returns The validated facilitator payload\n */\nasync function parseSuccessResponse(\n response: Response,\n schema: z.ZodType,\n operation: string,\n): Promise {\n const text = await response.text();\n\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new FacilitatorResponseError(\n `Facilitator ${operation} returned invalid JSON: ${responseExcerpt(text)}`,\n );\n }\n\n const parsed = schema.safeParse(data);\n if (!parsed.success) {\n throw new FacilitatorResponseError(\n `Facilitator ${operation} returned invalid data: ${responseExcerpt(text)}`,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * HTTP-based client for interacting with x402 facilitator services\n * Handles HTTP communication with facilitator endpoints\n */\nexport class HTTPFacilitatorClient implements FacilitatorClient {\n readonly url: string;\n private readonly _createAuthHeaders?: FacilitatorConfig[\"createAuthHeaders\"];\n\n /**\n * Creates a new HTTPFacilitatorClient instance.\n *\n * @param config - Configuration options for the facilitator client\n */\n constructor(config?: FacilitatorConfig) {\n // Normalize URL: strip trailing slashes to prevent redirect loops (e.g. 308)\n // when constructing endpoint paths like `${url}/supported`\n this.url = (config?.url || DEFAULT_FACILITATOR_URL).replace(/\\/+$/, \"\");\n this._createAuthHeaders = config?.createAuthHeaders;\n }\n\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise {\n let headers: Record = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"verify\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/verify`, {\n method: \"POST\",\n headers,\n redirect: \"follow\",\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new Error(`Facilitator verify failed (${response.status}): ${responseExcerpt(text)}`);\n }\n\n if (typeof data === \"object\" && data !== null && \"isValid\" in data) {\n throw new VerifyError(response.status, data as VerifyResponse);\n }\n\n throw new Error(\n `Facilitator verify failed (${response.status}): ${responseExcerpt(JSON.stringify(data))}`,\n );\n }\n\n return parseSuccessResponse(response, verifyResponseSchema, \"verify\");\n }\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise {\n let headers: Record = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"settle\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/settle`, {\n method: \"POST\",\n headers,\n redirect: \"follow\",\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new Error(`Facilitator settle failed (${response.status}): ${responseExcerpt(text)}`);\n }\n\n if (typeof data === \"object\" && data !== null && \"success\" in data) {\n throw new SettleError(response.status, data as SettleResponse);\n }\n\n throw new Error(\n `Facilitator settle failed (${response.status}): ${responseExcerpt(JSON.stringify(data))}`,\n );\n }\n\n return parseSuccessResponse(response, settleResponseSchema, \"settle\");\n }\n\n /**\n * Get supported payment kinds and extensions from the facilitator.\n * Retries with exponential backoff on 429 rate limit errors.\n *\n * @returns Supported payment kinds and extensions\n */\n async getSupported(): Promise {\n let headers: Record = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"supported\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n let lastError: Error | null = null;\n for (let attempt = 0; attempt < GET_SUPPORTED_RETRIES; attempt++) {\n const response = await fetch(`${this.url}/supported`, {\n method: \"GET\",\n headers,\n redirect: \"follow\",\n });\n\n if (response.ok) {\n return parseSuccessResponse(response, supportedResponseSchema, \"supported\");\n }\n\n const errorText = await response.text().catch(() => response.statusText);\n lastError = new Error(\n `Facilitator getSupported failed (${response.status}): ${responseExcerpt(errorText)}`,\n );\n\n // Retry on 429 rate limit errors with exponential backoff\n if (response.status === 429 && attempt < GET_SUPPORTED_RETRIES - 1) {\n const delay = GET_SUPPORTED_RETRY_DELAY_MS * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n throw lastError;\n }\n\n throw lastError ?? new Error(\"Facilitator getSupported failed after retries\");\n }\n\n /**\n * Creates authentication headers for a specific path.\n *\n * @param path - The path to create authentication headers for (e.g., \"verify\", \"settle\", \"supported\")\n * @returns An object containing the authentication headers for the specified path\n */\n async createAuthHeaders(path: string): Promise<{\n headers: Record;\n }> {\n if (this._createAuthHeaders) {\n const authHeaders = (await this._createAuthHeaders()) as Record<\n string,\n Record\n >;\n return {\n headers: authHeaders[path] ?? {},\n };\n }\n return {\n headers: {},\n };\n }\n\n /**\n * Helper to convert objects to JSON-safe format.\n * Handles BigInt and other non-JSON types.\n *\n * @param obj - The object to convert\n * @returns The JSON-safe representation of the object\n */\n private toJsonSafe(obj: unknown): unknown {\n return JSON.parse(\n JSON.stringify(obj, (_, value) => (typeof value === \"bigint\" ? value.toString() : value)),\n );\n }\n}\n","import {\n decodePaymentRequiredHeader,\n decodePaymentResponseHeader,\n encodePaymentSignatureHeader,\n} from \".\";\nimport { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { x402Client } from \"../client/x402Client\";\n\n/**\n * Context provided to onPaymentRequired hooks.\n */\nexport interface PaymentRequiredContext {\n paymentRequired: PaymentRequired;\n}\n\n/**\n * Hook called when a 402 response is received, before payment processing.\n * Return headers to try before payment, or void to proceed directly to payment.\n */\nexport type PaymentRequiredHook = (\n context: PaymentRequiredContext,\n) => Promise<{ headers: Record } | void>;\n\n/**\n * HTTP-specific client for handling x402 payment protocol over HTTP.\n *\n * Wraps a x402Client to provide HTTP-specific encoding/decoding functionality\n * for payment headers and responses while maintaining the builder pattern.\n */\nexport class x402HTTPClient {\n private paymentRequiredHooks: PaymentRequiredHook[] = [];\n\n /**\n * Creates a new x402HTTPClient instance.\n *\n * @param client - The underlying x402Client for payment logic\n */\n constructor(private readonly client: x402Client) {}\n\n /**\n * Register a hook to handle 402 responses before payment.\n * Hooks run in order; first to return headers wins.\n *\n * @param hook - The hook function to register\n * @returns This instance for chaining\n */\n onPaymentRequired(hook: PaymentRequiredHook): this {\n this.paymentRequiredHooks.push(hook);\n return this;\n }\n\n /**\n * Run hooks and return headers if any hook provides them.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Headers to use for retry, or null to proceed to payment\n */\n async handlePaymentRequired(\n paymentRequired: PaymentRequired,\n ): Promise | null> {\n for (const hook of this.paymentRequiredHooks) {\n const result = await hook({ paymentRequired });\n if (result?.headers) {\n return result.headers;\n }\n }\n return null;\n }\n\n /**\n * Encodes a payment payload into appropriate HTTP headers based on version.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns HTTP headers containing the encoded payment signature\n */\n encodePaymentSignatureHeader(paymentPayload: PaymentPayload): Record {\n switch (paymentPayload.x402Version) {\n case 2:\n return {\n \"PAYMENT-SIGNATURE\": encodePaymentSignatureHeader(paymentPayload),\n };\n case 1:\n return {\n \"X-PAYMENT\": encodePaymentSignatureHeader(paymentPayload),\n };\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Extracts payment required information from HTTP response.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @param body - Optional response body for v1 compatibility\n * @returns The payment required object\n */\n getPaymentRequiredResponse(\n getHeader: (name: string) => string | null | undefined,\n body?: unknown,\n ): PaymentRequired {\n // v2\n const paymentRequired = getHeader(\"PAYMENT-REQUIRED\");\n if (paymentRequired) {\n return decodePaymentRequiredHeader(paymentRequired);\n }\n\n // v1\n if (\n body &&\n body instanceof Object &&\n \"x402Version\" in body &&\n (body as PaymentRequired).x402Version === 1\n ) {\n return body as PaymentRequired;\n }\n\n throw new Error(\"Invalid payment required response\");\n }\n\n /**\n * Extracts payment settlement response from HTTP headers.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The settlement response object\n */\n getPaymentSettleResponse(getHeader: (name: string) => string | null | undefined): SettleResponse {\n // v2\n const paymentResponse = getHeader(\"PAYMENT-RESPONSE\");\n if (paymentResponse) {\n return decodePaymentResponseHeader(paymentResponse);\n }\n\n // v1\n const xPaymentResponse = getHeader(\"X-PAYMENT-RESPONSE\");\n if (xPaymentResponse) {\n return decodePaymentResponseHeader(xPaymentResponse);\n }\n\n throw new Error(\"Payment response header not found\");\n }\n\n /**\n * Creates a payment payload for the given payment requirements.\n * Delegates to the underlying x402Client.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Promise resolving to the payment payload\n */\n async createPaymentPayload(paymentRequired: PaymentRequired): Promise {\n return this.client.createPaymentPayload(paymentRequired);\n }\n}\n","import { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { Base64EncodedRegex, safeBase64Decode, safeBase64Encode } from \"../utils\";\n\n// HTTP Methods that typically use query parameters\nexport type QueryParamMethods = \"GET\" | \"HEAD\" | \"DELETE\";\n\n// HTTP Methods that typically use request body\nexport type BodyMethods = \"POST\" | \"PUT\" | \"PATCH\";\n\n/**\n * Encodes a payment payload as a base64 header value.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns Base64 encoded string representation of the payment payload\n */\nexport function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string {\n return safeBase64Encode(JSON.stringify(paymentPayload));\n}\n\n/**\n * Decodes a base64 payment signature header into a payment payload.\n *\n * @param paymentSignatureHeader - The base64 encoded payment signature header\n * @returns The decoded payment payload\n */\nexport function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload {\n if (!Base64EncodedRegex.test(paymentSignatureHeader)) {\n throw new Error(\"Invalid payment signature header\");\n }\n return JSON.parse(safeBase64Decode(paymentSignatureHeader)) as PaymentPayload;\n}\n\n/**\n * Encodes a payment required object as a base64 header value.\n *\n * @param paymentRequired - The payment required object to encode\n * @returns Base64 encoded string representation of the payment required object\n */\nexport function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string {\n return safeBase64Encode(JSON.stringify(paymentRequired));\n}\n\n/**\n * Decodes a base64 payment required header into a payment required object.\n *\n * @param paymentRequiredHeader - The base64 encoded payment required header\n * @returns The decoded payment required object\n */\nexport function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired {\n if (!Base64EncodedRegex.test(paymentRequiredHeader)) {\n throw new Error(\"Invalid payment required header\");\n }\n return JSON.parse(safeBase64Decode(paymentRequiredHeader)) as PaymentRequired;\n}\n\n/**\n * Encodes a payment response as a base64 header value.\n *\n * @param paymentResponse - The payment response to encode\n * @returns Base64 encoded string representation of the payment response\n */\nexport function encodePaymentResponseHeader(paymentResponse: SettleResponse): string {\n return safeBase64Encode(JSON.stringify(paymentResponse));\n}\n\n/**\n * Decodes a base64 payment response header into a settle response.\n *\n * @param paymentResponseHeader - The base64 encoded payment response header\n * @returns The decoded settle response\n */\nexport function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse {\n if (!Base64EncodedRegex.test(paymentResponseHeader)) {\n throw new Error(\"Invalid payment response header\");\n }\n return JSON.parse(safeBase64Decode(paymentResponseHeader)) as SettleResponse;\n}\n\n// Export HTTP service and types\nexport {\n x402HTTPResourceServer,\n HTTPAdapter,\n HTTPRequestContext,\n HTTPTransportContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n PaymentOption,\n RouteConfig,\n RoutesConfig,\n CompiledRoute,\n DynamicPayTo,\n DynamicPrice,\n UnpaidResponseBody,\n HTTPResponseBody,\n SettlementFailedResponseBody,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n RouteConfigurationError,\n ProtectedRequestHook,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { FacilitatorResponseError, getFacilitatorResponseError } from \"../types\";\nexport { x402HTTPClient, PaymentRequiredContext, PaymentRequiredHook } from \"./x402HTTPClient\";\n","import { x402Version } from \"..\";\nimport { SchemeNetworkClient } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network, PaymentRequired } from \"../types\";\nimport { findByNetworkAndScheme, findSchemesByNetwork } from \"../utils\";\n\n/**\n * Client Hook Context Interfaces\n */\n\nexport interface PaymentCreationContext {\n paymentRequired: PaymentRequired;\n selectedRequirements: PaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n paymentPayload: PaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n error: Error;\n}\n\n/**\n * Client Hook Type Definitions\n */\n\nexport type BeforePaymentCreationHook = (\n context: PaymentCreationContext,\n) => Promise;\n\nexport type AfterPaymentCreationHook = (context: PaymentCreatedContext) => Promise;\n\nexport type OnPaymentCreationFailureHook = (\n context: PaymentCreationFailureContext,\n) => Promise;\n\nexport type SelectPaymentRequirements = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements;\n\n/**\n * Extension that can enrich payment payloads on the client side.\n *\n * Client extensions are invoked after the scheme creates the base payment payload\n * but before it is returned. This allows mechanism-specific logic (e.g., EVM EIP-2612\n * permit signing) to enrich the payload's extensions data.\n */\nexport interface ClientExtension {\n /**\n * Unique key identifying this extension (e.g., \"eip2612GasSponsoring\").\n * Must match the extension key used in PaymentRequired.extensions.\n */\n key: string;\n\n /**\n * Called after payload creation when the extension key is present in\n * paymentRequired.extensions. Allows the extension to enrich the payload\n * with extension-specific data (e.g., signing an EIP-2612 permit).\n *\n * @param paymentPayload - The payment payload to enrich\n * @param paymentRequired - The original PaymentRequired response\n * @returns The enriched payment payload\n */\n enrichPaymentPayload?: (\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ) => Promise;\n}\n\n/**\n * A policy function that filters or transforms payment requirements.\n * Policies are applied in order before the selector chooses the final option.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of payment requirements to filter/transform\n * @returns Filtered array of payment requirements\n */\nexport type PaymentPolicy = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements[];\n\n\n/**\n * Configuration for registering a payment scheme with a specific network\n */\nexport interface SchemeRegistration {\n /**\n * The network identifier (e.g., 'eip155:8453', 'solana:mainnet')\n */\n network: Network;\n\n /**\n * The scheme client implementation for this network\n */\n client: SchemeNetworkClient;\n\n /**\n * The x402 protocol version to use for this scheme\n *\n * @default 2\n */\n x402Version?: number;\n}\n\n/**\n * Configuration options for the fetch wrapper\n */\nexport interface x402ClientConfig {\n /**\n * Array of scheme registrations defining which payment methods are supported\n */\n schemes: SchemeRegistration[];\n\n /**\n * Policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Custom payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n}\n\n/**\n * Core client for managing x402 payment schemes and creating payment payloads.\n *\n * Handles registration of payment schemes, policy-based filtering of payment requirements,\n * and creation of payment payloads based on server requirements.\n */\nexport class x402Client {\n private readonly paymentRequirementsSelector: SelectPaymentRequirements;\n private readonly registeredClientSchemes: Map>> = new Map();\n private readonly policies: PaymentPolicy[] = [];\n private readonly registeredExtensions: Map = new Map();\n\n private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n\n /**\n * Creates a new x402Client instance.\n *\n * @param paymentRequirementsSelector - Function to select payment requirements from available options\n */\n constructor(paymentRequirementsSelector?: SelectPaymentRequirements) {\n this.paymentRequirementsSelector = paymentRequirementsSelector || ((x402Version, accepts) => accepts[0]);\n }\n\n /**\n * Creates a new x402Client instance from a configuration object.\n *\n * @param config - The client configuration including schemes, policies, and payment requirements selector\n * @returns A configured x402Client instance\n */\n static fromConfig(config: x402ClientConfig): x402Client {\n const client = new x402Client(config.paymentRequirementsSelector);\n config.schemes.forEach(scheme => {\n if (scheme.x402Version === 1) {\n client.registerV1(scheme.network, scheme.client);\n } else {\n client.register(scheme.network, scheme.client);\n }\n });\n config.policies?.forEach(policy => {\n client.registerPolicy(policy);\n });\n return client;\n }\n\n /**\n * Registers a scheme client for the current x402 version.\n *\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n register(network: Network, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(x402Version, network, client);\n }\n\n /**\n * Registers a scheme client for x402 version 1.\n *\n * @param network - The v1 network identifier (e.g., 'base-sepolia', 'solana-devnet')\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n registerV1(network: string, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(1, network as Network, client);\n }\n\n /**\n * Registers a policy to filter or transform payment requirements.\n *\n * Policies are applied in order after filtering by registered schemes\n * and before the selector chooses the final payment requirement.\n *\n * @param policy - Function to filter/transform payment requirements\n * @returns The x402Client instance for chaining\n *\n * @example\n * ```typescript\n * // Prefer cheaper options\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => BigInt(r.value) < BigInt('1000000'))\n * );\n *\n * // Prefer specific networks\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => r.network.startsWith('eip155:'))\n * );\n * ```\n */\n registerPolicy(policy: PaymentPolicy): x402Client {\n this.policies.push(policy);\n return this;\n }\n\n /**\n * Registers a client extension that can enrich payment payloads.\n *\n * Extensions are invoked after the scheme creates the base payload and the\n * payload is wrapped with extensions/resource/accepted data. If the extension's\n * key is present in `paymentRequired.extensions`, the extension's\n * `enrichPaymentPayload` hook is called to modify the payload.\n *\n * @param extension - The client extension to register\n * @returns The x402Client instance for chaining\n */\n registerExtension(extension: ClientExtension): x402Client {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Register a hook to execute before payment payload creation.\n * Can abort creation by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onBeforePaymentCreation(hook: BeforePaymentCreationHook): x402Client {\n this.beforePaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment payload creation.\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onAfterPaymentCreation(hook: AfterPaymentCreationHook): x402Client {\n this.afterPaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment payload creation fails.\n * Can recover from failure by returning { recovered: true, payload: PaymentPayload }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): x402Client {\n this.onPaymentCreationFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Creates a payment payload based on a PaymentRequired response.\n *\n * Automatically extracts x402Version, resource, and extensions from the PaymentRequired\n * response and constructs a complete PaymentPayload with the accepted requirements.\n *\n * @param paymentRequired - The PaymentRequired response from the server\n * @returns Promise resolving to the complete payment payload\n */\n async createPaymentPayload(\n paymentRequired: PaymentRequired,\n ): Promise {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(paymentRequired.x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${paymentRequired.x402Version}`);\n }\n\n const requirements = this.selectPaymentRequirements(paymentRequired.x402Version, paymentRequired.accepts);\n\n const context: PaymentCreationContext = {\n paymentRequired,\n selectedRequirements: requirements,\n };\n\n // Execute beforePaymentCreation hooks\n for (const hook of this.beforePaymentCreationHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Payment creation aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeNetworkClient = findByNetworkAndScheme(clientSchemesByNetwork, requirements.scheme, requirements.network);\n if (!schemeNetworkClient) {\n throw new Error(`No client registered for scheme: ${requirements.scheme} and network: ${requirements.network}`);\n }\n\n const partialPayload = await schemeNetworkClient.createPaymentPayload(\n paymentRequired.x402Version,\n requirements,\n { extensions: paymentRequired.extensions },\n );\n\n let paymentPayload: PaymentPayload;\n if (partialPayload.x402Version == 1) {\n paymentPayload = partialPayload as PaymentPayload;\n } else {\n // Merge server-declared extensions with any scheme-provided extensions.\n // Scheme extensions overlay on top (e.g., EIP-2612 info enriches server declaration).\n const mergedExtensions = this.mergeExtensions(\n paymentRequired.extensions,\n partialPayload.extensions,\n );\n\n paymentPayload = {\n x402Version: partialPayload.x402Version,\n payload: partialPayload.payload,\n extensions: mergedExtensions,\n resource: paymentRequired.resource,\n accepted: requirements,\n };\n }\n\n // Enrich payload via registered client extensions (for non-scheme extensions)\n paymentPayload = await this.enrichPaymentPayloadWithExtensions(paymentPayload, paymentRequired);\n\n // Execute afterPaymentCreation hooks\n const createdContext: PaymentCreatedContext = {\n ...context,\n paymentPayload,\n };\n\n for (const hook of this.afterPaymentCreationHooks) {\n await hook(createdContext);\n }\n\n return paymentPayload;\n } catch (error) {\n const failureContext: PaymentCreationFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onPaymentCreationFailure hooks\n for (const hook of this.onPaymentCreationFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.payload;\n }\n }\n\n throw error;\n }\n }\n\n\n\n /**\n * Merges server-declared extensions with scheme-provided extensions.\n * Scheme extensions overlay on top of server extensions at each key,\n * preserving server-provided schema while overlaying scheme-provided info.\n *\n * @param serverExtensions - Extensions declared by the server in the 402 response\n * @param schemeExtensions - Extensions provided by the scheme client (e.g. EIP-2612)\n * @returns The merged extensions object, or undefined if both inputs are undefined\n */\n private mergeExtensions(\n serverExtensions?: Record,\n schemeExtensions?: Record,\n ): Record | undefined {\n if (!schemeExtensions) return serverExtensions;\n if (!serverExtensions) return schemeExtensions;\n\n const merged = { ...serverExtensions };\n for (const [key, schemeValue] of Object.entries(schemeExtensions)) {\n const serverValue = merged[key];\n if (\n serverValue &&\n typeof serverValue === \"object\" &&\n schemeValue &&\n typeof schemeValue === \"object\"\n ) {\n // Deep merge: scheme info overlays server info, schema preserved\n merged[key] = { ...serverValue as Record, ...schemeValue as Record };\n } else {\n merged[key] = schemeValue;\n }\n }\n return merged;\n }\n\n /**\n * Enriches a payment payload by calling registered extension hooks.\n * For each extension key present in the PaymentRequired response,\n * invokes the corresponding extension's enrichPaymentPayload callback.\n *\n * @param paymentPayload - The payment payload to enrich with extension data\n * @param paymentRequired - The PaymentRequired response containing extension declarations\n * @returns The enriched payment payload with extension data applied\n */\n private async enrichPaymentPayloadWithExtensions(\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ): Promise {\n if (!paymentRequired.extensions || this.registeredExtensions.size === 0) {\n return paymentPayload;\n }\n\n let enriched = paymentPayload;\n for (const [key, extension] of this.registeredExtensions) {\n if (key in paymentRequired.extensions && extension.enrichPaymentPayload) {\n enriched = await extension.enrichPaymentPayload(enriched, paymentRequired);\n }\n }\n\n return enriched;\n }\n\n /**\n * Selects appropriate payment requirements based on registered clients and policies.\n *\n * Selection process:\n * 1. Filter by registered schemes (network + scheme support)\n * 2. Apply all registered policies in order\n * 3. Use selector to choose final requirement\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of available payment requirements\n * @returns The selected payment requirements\n */\n private selectPaymentRequirements(x402Version: number, paymentRequirements: PaymentRequirements[]): PaymentRequirements {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${x402Version}`);\n }\n\n // Step 1: Filter by registered schemes\n const supportedPaymentRequirements = paymentRequirements.filter(requirement => {\n let clientSchemes = findSchemesByNetwork(clientSchemesByNetwork, requirement.network);\n if (!clientSchemes) {\n return false;\n }\n\n return clientSchemes.has(requirement.scheme);\n })\n\n if (supportedPaymentRequirements.length === 0) {\n throw new Error(`No network/scheme registered for x402 version: ${x402Version} which comply with the payment requirements. ${JSON.stringify({\n x402Version,\n paymentRequirements,\n x402Versions: Array.from(this.registeredClientSchemes.keys()),\n networks: Array.from(clientSchemesByNetwork.keys()),\n schemes: Array.from(clientSchemesByNetwork.values()).map(schemes => Array.from(schemes.keys())).flat(),\n })}`);\n }\n\n // Step 2: Apply all policies in order\n let filteredRequirements = supportedPaymentRequirements;\n for (const policy of this.policies) {\n filteredRequirements = policy(x402Version, filteredRequirements);\n\n if (filteredRequirements.length === 0) {\n throw new Error(`All payment requirements were filtered out by policies for x402 version: ${x402Version}`);\n }\n }\n\n // Step 3: Use selector to choose final requirement\n return this.paymentRequirementsSelector(x402Version, filteredRequirements);\n }\n\n /**\n * Internal method to register a scheme client.\n *\n * @param x402Version - The x402 protocol version\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n private _registerScheme(x402Version: number, network: Network, client: SchemeNetworkClient): x402Client {\n if (!this.registeredClientSchemes.has(x402Version)) {\n this.registeredClientSchemes.set(x402Version, new Map());\n }\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version)!;\n if (!clientSchemesByNetwork.has(network)) {\n clientSchemesByNetwork.set(network, new Map());\n }\n\n const clientByScheme = clientSchemesByNetwork.get(network)!;\n if (!clientByScheme.has(client.scheme)) {\n clientByScheme.set(client.scheme, client);\n }\n\n return this;\n }\n}\n","import { x402Client, x402ClientConfig, x402HTTPClient } from \"@x402/core/client\";\nimport { type PaymentRequired } from \"@x402/core/types\";\n\n/**\n * Enables the payment of APIs using the x402 payment protocol v2.\n *\n * This function wraps the native fetch API to automatically handle 402 Payment Required responses\n * by creating and sending payment headers. It will:\n * 1. Make the initial request\n * 2. If a 402 response is received, parse the payment requirements\n * 3. Create a payment header using the configured x402HTTPClient\n * 4. Retry the request with the payment header\n *\n * @param fetch - The fetch function to wrap (typically globalThis.fetch)\n * @param client - Configured x402Client or x402HTTPClient instance for handling payments\n * @returns A wrapped fetch function that handles 402 responses automatically\n *\n * @example\n * ```typescript\n * import { wrapFetchWithPayment, x402Client } from '@x402/fetch';\n * import { ExactEvmScheme } from '@x402/evm';\n * import { ExactSvmScheme } from '@x402/svm';\n *\n * const client = new x402Client()\n * .register('eip155:8453', new ExactEvmScheme(evmSigner))\n * .register('solana:mainnet', new ExactSvmScheme(svmSigner))\n * .register('eip155:1', new ExactEvmScheme(evmSigner), 1); // v1 protocol\n *\n * const fetchWithPay = wrapFetchWithPayment(fetch, client);\n *\n * // Make a request that may require payment\n * const response = await fetchWithPay('https://api.example.com/paid-endpoint');\n * ```\n *\n * @throws {Error} If no schemes are provided\n * @throws {Error} If the request configuration is missing\n * @throws {Error} If a payment has already been attempted for this request\n * @throws {Error} If there's an error creating the payment header\n */\nexport function wrapFetchWithPayment(\n fetch: typeof globalThis.fetch,\n client: x402Client | x402HTTPClient,\n) {\n const httpClient = client instanceof x402HTTPClient ? client : new x402HTTPClient(client);\n\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const request = new Request(input, init);\n const clonedRequest = request.clone();\n\n const response = await fetch(request);\n\n if (response.status !== 402) {\n return response;\n }\n\n // Parse payment requirements from response\n let paymentRequired: PaymentRequired;\n try {\n // Create getHeader function for case-insensitive header lookup\n const getHeader = (name: string) => response.headers.get(name);\n\n // Try to get from headers first (v2), then from body (v1)\n let body: PaymentRequired | undefined;\n try {\n const responseText = await response.text();\n if (responseText) {\n body = JSON.parse(responseText) as PaymentRequired;\n }\n } catch {\n // Ignore JSON parse errors - might be header-only response\n }\n\n paymentRequired = httpClient.getPaymentRequiredResponse(getHeader, body);\n } catch (error) {\n throw new Error(\n `Failed to parse payment requirements: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Run payment required hooks\n const hookHeaders = await httpClient.handlePaymentRequired(paymentRequired);\n if (hookHeaders) {\n const hookRequest = clonedRequest.clone();\n for (const [key, value] of Object.entries(hookHeaders)) {\n hookRequest.headers.set(key, value);\n }\n const hookResponse = await fetch(hookRequest);\n if (hookResponse.status !== 402) {\n return hookResponse; // Hook succeeded\n }\n // Hook's retry got 402, fall through to payment\n }\n\n // Create payment payload (copy extensions from PaymentRequired)\n let paymentPayload;\n try {\n paymentPayload = await client.createPaymentPayload(paymentRequired);\n } catch (error) {\n throw new Error(\n `Failed to create payment payload: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Encode payment header\n const paymentHeaders = httpClient.encodePaymentSignatureHeader(paymentPayload);\n\n // Check if this is already a retry to prevent infinite loops\n if (clonedRequest.headers.has(\"PAYMENT-SIGNATURE\") || clonedRequest.headers.has(\"X-PAYMENT\")) {\n throw new Error(\"Payment already attempted\");\n }\n\n // Add payment headers to cloned request\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n clonedRequest.headers.set(\n \"Access-Control-Expose-Headers\",\n \"PAYMENT-RESPONSE,X-PAYMENT-RESPONSE\",\n );\n\n // Retry the request with payment\n const secondResponse = await fetch(clonedRequest);\n return secondResponse;\n };\n}\n\n/**\n * Creates a payment-enabled fetch function from a configuration object.\n *\n * @param fetch - The fetch function to wrap (typically globalThis.fetch)\n * @param config - Configuration options including scheme registrations and selectors\n * @returns A wrapped fetch function that handles 402 responses automatically\n */\nexport function wrapFetchWithPaymentFromConfig(\n fetch: typeof globalThis.fetch,\n config: x402ClientConfig,\n) {\n const client = x402Client.fromConfig(config);\n return wrapFetchWithPayment(fetch, client);\n}\n\n// Re-export types and utilities for convenience\nexport { x402Client, x402HTTPClient } from \"@x402/core/client\";\nexport type {\n PaymentPolicy,\n SchemeRegistration,\n SelectPaymentRequirements,\n x402ClientConfig,\n} from \"@x402/core/client\";\nexport { decodePaymentResponseHeader } from \"@x402/core/http\";\nexport type {\n Network,\n PaymentPayload,\n PaymentRequired,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\n","/**\n * Payment Pre-Auth Cache\n *\n * Wraps the @x402/fetch SDK with pre-authorization caching.\n * After the first 402 response, caches payment requirements per endpoint.\n * On subsequent requests, pre-signs payment and attaches it to the first\n * request, skipping the 402 round trip (~200ms savings per request).\n *\n * Falls back to normal 402 flow if pre-signed payment is rejected.\n */\n\nimport type { x402Client } from \"@x402/fetch\";\nimport { x402HTTPClient } from \"@x402/fetch\";\n\ntype PaymentRequired = Parameters[\"createPaymentPayload\"]>[0];\n\ninterface CachedEntry {\n paymentRequired: PaymentRequired;\n cachedAt: number;\n}\n\nconst DEFAULT_TTL_MS = 3_600_000; // 1 hour\n\ntype FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise;\n\nexport function createPayFetchWithPreAuth(\n baseFetch: FetchFn,\n client: x402Client,\n ttlMs = DEFAULT_TTL_MS,\n options?: { skipPreAuth?: boolean },\n): FetchFn {\n const httpClient = new x402HTTPClient(client);\n const cache = new Map();\n\n return async (input: RequestInfo | URL, init?: RequestInit): Promise => {\n const request = new Request(input, init);\n const urlPath = new URL(request.url).pathname;\n\n // Extract model from request body to create model-specific cache keys.\n // Without this, a cached payment from a paid model (e.g. sonnet) would be\n // incorrectly applied to a free model (nvidia/gpt-oss-120b), causing\n // payment errors even when the server wouldn't charge for the request.\n let requestModel = \"\";\n if (init?.body) {\n try {\n const bodyStr =\n init.body instanceof Uint8Array\n ? new TextDecoder().decode(init.body)\n : typeof init.body === \"string\"\n ? init.body\n : \"\";\n if (bodyStr) {\n const parsed = JSON.parse(bodyStr) as { model?: string };\n requestModel = parsed.model ?? \"\";\n }\n } catch {\n /* not JSON, use empty model */\n }\n }\n const cacheKey = `${urlPath}:${requestModel}`;\n\n // Try pre-auth if we have cached payment requirements\n // Skip for Solana: payments use per-tx blockhashes that expire ~60-90s,\n // making cached requirements useless and causing double charges.\n const cached = !options?.skipPreAuth ? cache.get(cacheKey) : undefined;\n if (cached && Date.now() - cached.cachedAt < ttlMs) {\n try {\n const payload = await client.createPaymentPayload(cached.paymentRequired);\n const headers = httpClient.encodePaymentSignatureHeader(payload);\n const preAuthRequest = request.clone();\n for (const [key, value] of Object.entries(headers)) {\n preAuthRequest.headers.set(key, value);\n }\n const response = await baseFetch(preAuthRequest);\n if (response.status !== 402) {\n return response; // Pre-auth worked — saved ~200ms\n }\n // Pre-auth rejected (params may have changed) — invalidate and fall through\n cache.delete(cacheKey);\n } catch {\n // Pre-auth signing failed — invalidate and fall through\n cache.delete(cacheKey);\n }\n }\n\n // Normal flow: make request, handle 402 if needed\n const clonedRequest = request.clone();\n const response = await baseFetch(request);\n if (response.status !== 402) {\n return response;\n }\n\n // Parse 402 response and cache for future pre-auth\n let paymentRequired: PaymentRequired;\n try {\n const getHeader = (name: string) => response.headers.get(name);\n let body: unknown;\n try {\n const responseText = await Promise.race([\n response.text(),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error(\"Body read timeout\")), 30_000),\n ),\n ]);\n if (responseText) body = JSON.parse(responseText);\n } catch {\n /* empty body is fine */\n }\n paymentRequired = httpClient.getPaymentRequiredResponse(getHeader, body);\n cache.set(cacheKey, { paymentRequired, cachedAt: Date.now() });\n } catch (error) {\n throw new Error(\n `Failed to parse payment requirements: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n { cause: error },\n );\n }\n\n // Sign payment and retry\n const payload = await client.createPaymentPayload(paymentRequired);\n const paymentHeaders = httpClient.encodePaymentSignatureHeader(payload);\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n return baseFetch(clonedRequest);\n };\n}\n","// EIP-3009 TransferWithAuthorization types for EIP-712 signing\nexport const authorizationTypes = {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n} as const;\n\n/**\n * Permit2 EIP-712 types for signing PermitWitnessTransferFrom (exact scheme).\n * Must match the exact format expected by the Permit2 contract.\n * Note: Types must be in ALPHABETICAL order after the primary type (TokenPermissions < Witness).\n */\nexport const permit2WitnessTypes = {\n PermitWitnessTransferFrom: [\n { name: \"permitted\", type: \"TokenPermissions\" },\n { name: \"spender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"witness\", type: \"Witness\" },\n ],\n TokenPermissions: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n Witness: [\n { name: \"to\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Permit2 EIP-712 types for signing PermitWitnessTransferFrom (upto scheme).\n * The upto witness includes a `facilitator` field that the exact witness does not.\n * This ensures only the authorized facilitator can settle the payment.\n * Must match: Witness(address to,address facilitator,uint256 validAfter)\n */\nexport const uptoPermit2WitnessTypes = {\n PermitWitnessTransferFrom: [\n { name: \"permitted\", type: \"TokenPermissions\" },\n { name: \"spender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"witness\", type: \"Witness\" },\n ],\n TokenPermissions: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n Witness: [\n { name: \"to\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n} as const;\n\n// EIP3009 ABI for transferWithAuthorization function\nexport const eip3009ABI = [\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"v\", type: \"uint8\" },\n { name: \"r\", type: \"bytes32\" },\n { name: \"s\", type: \"bytes32\" },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"version\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"authorizer\", type: \"address\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n name: \"authorizationState\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/**\n * EIP-2612 Permit EIP-712 types for signing token.permit().\n */\nexport const eip2612PermitTypes = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * EIP-2612 nonces ABI for querying current nonce.\n */\nexport const eip2612NoncesAbi = [\n {\n type: \"function\",\n name: \"nonces\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/** ERC-20 approve(address,uint256) ABI for encoding/decoding approval calldata. */\nexport const erc20ApproveAbi = [\n {\n type: \"function\",\n name: \"approve\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/** ERC-20 allowance(address,address) ABI for checking spender approval. */\nexport const erc20AllowanceAbi = [\n {\n type: \"function\",\n name: \"allowance\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/** Gas limit for a standard ERC-20 approve() transaction. */\nexport const ERC20_APPROVE_GAS_LIMIT = 70_000n;\n\n/** Fallback max fee per gas (1 gwei) when fee estimation fails. */\nexport const DEFAULT_MAX_FEE_PER_GAS = 1_000_000_000n;\n\n/** Fallback max priority fee per gas (0.1 gwei) when fee estimation fails. */\nexport const DEFAULT_MAX_PRIORITY_FEE_PER_GAS = 100_000_000n;\n\n/**\n * Canonical Permit2 contract address.\n * Same address on all EVM chains via CREATE2 deployment.\n *\n * @see https://github.com/Uniswap/permit2\n */\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n/**\n * x402ExactPermit2Proxy contract address.\n * Vanity address: 0x4020...0001 for easy recognition.\n * This address is deterministic based on:\n * - Arachnid's deterministic deployer (0x4e59b44847b379578588920cA78FbF26c0B4956C)\n * - Vanity-mined salt for prefix 0x4020 and suffix 0001\n * - Contract bytecode + constructor args (PERMIT2_ADDRESS)\n */\nexport const x402ExactPermit2ProxyAddress = \"0x402085c248EeA27D92E8b30b2C58ed07f9E20001\" as const;\n\n/**\n * x402UptoPermit2Proxy contract address.\n * Vanity address: 0x4020...0002 for easy recognition.\n * This address is deterministic based on:\n * - Arachnid's deterministic deployer (0x4e59b44847b379578588920cA78FbF26c0B4956C)\n * - Vanity-mined salt for prefix 0x4020 and suffix 0002\n * - Contract bytecode + constructor args (PERMIT2_ADDRESS)\n */\nexport const x402UptoPermit2ProxyAddress = \"0x4020A4f3b7b90ccA423B9fabCc0CE57C6C240002\" as const;\n\n/**\n * ABI components for the exact Permit2 witness tuple: Witness(address to, uint256 validAfter).\n */\nconst permit2WitnessABIComponents = [\n { name: \"to\", type: \"address\", internalType: \"address\" },\n { name: \"validAfter\", type: \"uint256\", internalType: \"uint256\" },\n] as const;\n\n/**\n * ABI components for the upto Permit2 witness tuple:\n * Witness(address to, address facilitator, uint256 validAfter).\n */\nconst uptoPermit2WitnessABIComponents = [\n { name: \"to\", type: \"address\", internalType: \"address\" },\n { name: \"facilitator\", type: \"address\", internalType: \"address\" },\n { name: \"validAfter\", type: \"uint256\", internalType: \"uint256\" },\n] as const;\n\n/**\n * x402UptoPermit2Proxy ABI — settle/settleWithPermit for the upto payment scheme.\n * Key differences from exact: settle() takes a `uint256 amount` parameter, and the\n * Witness struct includes an `address facilitator` field.\n */\nexport const x402UptoPermit2ProxyABI = [\n {\n type: \"function\",\n name: \"PERMIT2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\", internalType: \"contract ISignatureTransfer\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPEHASH\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bytes32\", internalType: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPE_STRING\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"settle\",\n inputs: [\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.Witness\",\n components: uptoPermit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"settleWithPermit\",\n inputs: [\n {\n name: \"permit2612\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.EIP2612Permit\",\n components: [\n { name: \"value\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"r\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"s\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"v\", type: \"uint8\", internalType: \"uint8\" },\n ],\n },\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.Witness\",\n components: uptoPermit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n { type: \"event\", name: \"Settled\", inputs: [], anonymous: false },\n { type: \"event\", name: \"SettledWithPermit\", inputs: [], anonymous: false },\n { type: \"error\", name: \"AmountExceedsPermitted\", inputs: [] },\n { type: \"error\", name: \"InvalidDestination\", inputs: [] },\n { type: \"error\", name: \"InvalidOwner\", inputs: [] },\n { type: \"error\", name: \"InvalidPermit2Address\", inputs: [] },\n { type: \"error\", name: \"PaymentTooEarly\", inputs: [] },\n { type: \"error\", name: \"Permit2612AmountMismatch\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n { type: \"error\", name: \"UnauthorizedFacilitator\", inputs: [] },\n] as const;\n\n/**\n * x402ExactPermit2Proxy ABI - settle function for exact payment scheme.\n */\nexport const x402ExactPermit2ProxyABI = [\n {\n type: \"function\",\n name: \"PERMIT2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\", internalType: \"contract ISignatureTransfer\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPEHASH\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bytes32\", internalType: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPE_STRING\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"settle\",\n inputs: [\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"settleWithPermit\",\n inputs: [\n {\n name: \"permit2612\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.EIP2612Permit\",\n components: [\n { name: \"value\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"r\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"s\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"v\", type: \"uint8\", internalType: \"uint8\" },\n ],\n },\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n { type: \"event\", name: \"Settled\", inputs: [], anonymous: false },\n { type: \"event\", name: \"SettledWithPermit\", inputs: [], anonymous: false },\n { type: \"error\", name: \"InvalidAmount\", inputs: [] },\n { type: \"error\", name: \"InvalidDestination\", inputs: [] },\n { type: \"error\", name: \"InvalidOwner\", inputs: [] },\n { type: \"error\", name: \"InvalidPermit2Address\", inputs: [] },\n { type: \"error\", name: \"PaymentTooEarly\", inputs: [] },\n { type: \"error\", name: \"Permit2612AmountMismatch\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n] as const;\n","import { toHex } from \"viem\";\n\n/**\n * Extract chain ID from a CAIP-2 network identifier (eip155:CHAIN_ID).\n *\n * @param network - The network identifier in CAIP-2 format (e.g., \"eip155:8453\")\n * @returns The numeric chain ID\n * @throws Error if the network format is invalid\n */\nexport function getEvmChainId(network: string): number {\n if (network.startsWith(\"eip155:\")) {\n const idStr = network.split(\":\")[1];\n const chainId = parseInt(idStr, 10);\n if (isNaN(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${network}`);\n }\n return chainId;\n }\n\n throw new Error(`Unsupported network format: ${network} (expected eip155:CHAIN_ID)`);\n}\n\n/**\n * Get the crypto object from the global scope.\n *\n * @returns The crypto object\n * @throws Error if crypto API is not available\n */\nfunction getCrypto(): Crypto {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (!cryptoObj) {\n throw new Error(\"Crypto API not available\");\n }\n return cryptoObj;\n}\n\n/**\n * Create a random 32-byte nonce for EIP-3009 authorization.\n *\n * @returns A hex-encoded 32-byte nonce\n */\nexport function createNonce(): `0x${string}` {\n return toHex(getCrypto().getRandomValues(new Uint8Array(32)));\n}\n\n/**\n * Creates a random 256-bit nonce for Permit2.\n * Permit2 uses uint256 nonces (not bytes32 like EIP-3009).\n *\n * @returns A string representation of the random nonce\n */\nexport function createPermit2Nonce(): string {\n const randomBytes = getCrypto().getRandomValues(new Uint8Array(32));\n return BigInt(toHex(randomBytes)).toString();\n}\n","/**\n * Named error reason constants for the exact EVM facilitator.\n *\n * These strings must be character-for-character identical to the Go constants in\n * go/mechanisms/evm/exact/facilitator/errors.go to maintain cross-SDK parity.\n */\n\nexport const ErrInvalidScheme = \"invalid_exact_evm_scheme\";\nexport const ErrNetworkMismatch = \"invalid_exact_evm_network_mismatch\";\nexport const ErrMissingEip712Domain = \"invalid_exact_evm_missing_eip712_domain\";\nexport const ErrRecipientMismatch = \"invalid_exact_evm_recipient_mismatch\";\nexport const ErrInvalidSignature = \"invalid_exact_evm_signature\";\nexport const ErrValidBeforeExpired = \"invalid_exact_evm_payload_authorization_valid_before\";\nexport const ErrValidAfterInFuture = \"invalid_exact_evm_payload_authorization_valid_after\";\nexport const ErrInvalidAuthorizationValue = \"invalid_exact_evm_authorization_value\";\nexport const ErrUndeployedSmartWallet = \"invalid_exact_evm_payload_undeployed_smart_wallet\";\nexport const ErrTransactionFailed = \"invalid_exact_evm_transaction_failed\";\n\n// EIP-3009 verify errors\nexport const ErrEip3009TokenNameMismatch = \"invalid_exact_evm_token_name_mismatch\";\nexport const ErrEip3009TokenVersionMismatch = \"invalid_exact_evm_token_version_mismatch\";\nexport const ErrEip3009NotSupported = \"invalid_exact_evm_eip3009_not_supported\";\nexport const ErrEip3009NonceAlreadyUsed = \"invalid_exact_evm_nonce_already_used\";\nexport const ErrEip3009InsufficientBalance = \"invalid_exact_evm_insufficient_balance\";\nexport const ErrEip3009SimulationFailed = \"invalid_exact_evm_transaction_simulation_failed\";\n\n// Permit2 verify errors\nexport const ErrPermit2InvalidSpender = \"invalid_permit2_spender\";\nexport const ErrPermit2RecipientMismatch = \"invalid_permit2_recipient_mismatch\";\nexport const ErrPermit2DeadlineExpired = \"permit2_deadline_expired\";\nexport const ErrPermit2NotYetValid = \"permit2_not_yet_valid\";\nexport const ErrPermit2AmountMismatch = \"permit2_amount_mismatch\";\nexport const ErrPermit2TokenMismatch = \"permit2_token_mismatch\";\nexport const ErrPermit2InvalidSignature = \"invalid_permit2_signature\";\nexport const ErrPermit2AllowanceRequired = \"permit2_allowance_required\";\nexport const ErrPermit2SimulationFailed = \"permit2_simulation_failed\";\nexport const ErrPermit2InsufficientBalance = \"permit2_insufficient_balance\";\nexport const ErrPermit2ProxyNotDeployed = \"permit2_proxy_not_deployed\";\n\n// Permit2 settle errors (from contract reverts)\nexport const ErrPermit2InvalidAmount = \"permit2_invalid_amount\";\nexport const ErrPermit2InvalidDestination = \"permit2_invalid_destination\";\nexport const ErrPermit2InvalidOwner = \"permit2_invalid_owner\";\nexport const ErrPermit2PaymentTooEarly = \"permit2_payment_too_early\";\nexport const ErrPermit2InvalidNonce = \"permit2_invalid_nonce\";\nexport const ErrPermit2612AmountMismatch = \"permit2_2612_amount_mismatch\";\n\n// ERC-20 approval gas sponsoring verify errors\nexport const ErrErc20ApprovalInvalidFormat = \"invalid_erc20_approval_extension_format\";\nexport const ErrErc20ApprovalFromMismatch = \"erc20_approval_from_mismatch\";\nexport const ErrErc20ApprovalAssetMismatch = \"erc20_approval_asset_mismatch\";\nexport const ErrErc20ApprovalSpenderNotPermit2 = \"erc20_approval_spender_not_permit2\";\nexport const ErrErc20ApprovalTxWrongTarget = \"erc20_approval_tx_wrong_target\";\nexport const ErrErc20ApprovalTxWrongSelector = \"erc20_approval_tx_wrong_selector\";\nexport const ErrErc20ApprovalTxWrongSpender = \"erc20_approval_tx_wrong_spender\";\nexport const ErrErc20ApprovalTxInvalidCalldata = \"erc20_approval_tx_invalid_calldata\";\nexport const ErrErc20ApprovalTxSignerMismatch = \"erc20_approval_tx_signer_mismatch\";\nexport const ErrErc20ApprovalTxInvalidSignature = \"erc20_approval_tx_invalid_signature\";\nexport const ErrErc20ApprovalTxParseFailed = \"erc20_approval_tx_parse_failed\";\nexport const ErrErc20ApprovalTxFailed = \"erc20_approval_tx_failed\";\n\n// EIP-2612 gas sponsoring verify errors\nexport const ErrInvalidEip2612ExtensionFormat = \"invalid_eip2612_extension_format\";\nexport const ErrEip2612FromMismatch = \"eip2612_from_mismatch\";\nexport const ErrEip2612AssetMismatch = \"eip2612_asset_mismatch\";\nexport const ErrEip2612SpenderNotPermit2 = \"eip2612_spender_not_permit2\";\nexport const ErrEip2612DeadlineExpired = \"eip2612_deadline_expired\";\n\n// Shared settle errors\nexport const ErrUnsupportedPayloadType = \"unsupported_payload_type\";\nexport const ErrInvalidTransactionState = \"invalid_transaction_state\";\n","import { encodeFunctionData, decodeFunctionResult } from \"viem\";\n\n/**\n * Multicall3 contract address.\n * Same address on all EVM chains via CREATE2 deployment.\n *\n * @see https://github.com/mds1/multicall\n */\nexport const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\" as const;\n\n/** Multicall3 getEthBalance ABI for querying native token balance. */\nexport const multicall3GetEthBalanceAbi = [\n {\n name: \"getEthBalance\",\n inputs: [{ name: \"addr\", type: \"address\" }],\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/** Multicall3 tryAggregate ABI for batching calls. */\nconst multicall3ABI = [\n {\n inputs: [\n { name: \"requireSuccess\", type: \"bool\" },\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"callData\", type: \"bytes\" },\n ],\n },\n ],\n name: \"tryAggregate\",\n outputs: [\n {\n name: \"returnData\",\n type: \"tuple[]\",\n components: [\n { name: \"success\", type: \"bool\" },\n { name: \"returnData\", type: \"bytes\" },\n ],\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\nexport type ContractCall = {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n};\n\nexport type RawContractCall = {\n address: `0x${string}`;\n callData: `0x${string}`;\n};\n\nexport type MulticallSuccess = { status: \"success\"; result: unknown };\nexport type MulticallFailure = { status: \"failure\"; error: Error };\nexport type MulticallResult = MulticallSuccess | MulticallFailure;\n\n/**\n * Batches contract calls via Multicall3 `tryAggregate(false, ...)`.\n *\n * Accepts a mix of typed ContractCall (ABI-encoded + decoded) and\n * RawContractCall (pre-encoded calldata, no decoding) entries.\n * Raw calls are useful for the EIP-6492 factory deployment case\n * where calldata is pre-encoded with no ABI available.\n */\ntype ReadContractFn = (args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n}) => Promise;\n\n/**\n * Executes multiple contract read calls in a single RPC round-trip using Multicall3.\n *\n * @param readContract - Function that performs a single contract read (e.g. viem readContract)\n * @param calls - Array of contract calls to batch (ContractCall or RawContractCall)\n * @returns A promise that resolves to an array of decoded results, one per call\n */\nexport async function multicall(\n readContract: ReadContractFn,\n calls: ReadonlyArray,\n): Promise {\n const aggregateCalls = calls.map(call => {\n if (\"callData\" in call) {\n return { target: call.address, callData: call.callData };\n }\n const callData = encodeFunctionData({\n abi: call.abi,\n functionName: call.functionName,\n args: call.args as unknown[],\n });\n return { target: call.address, callData };\n });\n\n const rawResults = (await readContract({\n address: MULTICALL3_ADDRESS,\n abi: multicall3ABI,\n functionName: \"tryAggregate\",\n args: [false, aggregateCalls],\n })) as { success: boolean; returnData: `0x${string}` }[];\n\n return rawResults.map((raw, i) => {\n if (!raw.success) {\n return {\n status: \"failure\" as const,\n error: new Error(`multicall: call reverted (returnData: ${raw.returnData})`),\n };\n }\n\n const call = calls[i];\n if (\"callData\" in call) {\n return { status: \"success\" as const, result: undefined };\n }\n\n try {\n const decoded = decodeFunctionResult({\n abi: call.abi,\n functionName: call.functionName,\n data: raw.returnData,\n });\n return { status: \"success\" as const, result: decoded };\n } catch (err) {\n return {\n status: \"failure\" as const,\n error: err instanceof Error ? err : new Error(String(err)),\n };\n }\n });\n}\n","import {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { ClientEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { createNonce } from \"../../../utils\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\n\n/**\n * EVM client implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClientV1 instance.\n *\n * @param signer - The EVM signer for client operations\n */\n constructor(private readonly signer: ClientEvmSigner) {}\n\n /**\n * Creates a payment payload for the Exact scheme (V1).\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<\n Pick & { scheme: string; network: Network }\n > {\n const selectedV1 = paymentRequirements as unknown as PaymentRequirementsV1;\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEvmPayloadV1[\"authorization\"] = {\n from: this.signer.address,\n to: getAddress(selectedV1.payTo),\n value: selectedV1.maxAmountRequired,\n validAfter: (now - 600).toString(), // 10 minutes before\n validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n // Sign the authorization\n const signature = await this.signAuthorization(authorization, selectedV1);\n\n const payload: ExactEvmPayloadV1 = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n scheme: selectedV1.scheme,\n network: selectedV1.network,\n payload,\n };\n }\n\n /**\n * Sign the EIP-3009 authorization using EIP-712\n *\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\n private async signAuthorization(\n authorization: ExactEvmPayloadV1[\"authorization\"],\n requirements: PaymentRequirementsV1,\n ): Promise<`0x${string}`> {\n const chainId = getEvmChainIdV1(requirements.network as EvmNetworkV1);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await this.signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n }\n}\n","import {\n PaymentPayload,\n PaymentPayloadV1,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@x402/core/types\";\nimport { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport { getAddress, Hex, isAddressEqual, parseErc6492Signature } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { FacilitatorEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\nimport * as Errors from \"../../facilitator/errors\";\nimport {\n diagnoseEip3009SimulationFailure,\n executeTransferWithAuthorization,\n simulateEip3009Transfer,\n} from \"../../facilitator/eip3009-utils\";\n\nexport interface VerifyV1Options {\n /** Run onchain simulation. Defaults to true. */\n simulate?: boolean;\n}\n\nexport interface ExactEvmSchemeV1Config {\n /**\n * If enabled, the facilitator will deploy ERC-4337 smart wallets\n * via EIP-6492 when encountering undeployed contract signatures.\n *\n * @default false\n */\n deployERC4337WithEIP6492?: boolean;\n /**\n * If enabled, simulates transaction before settling. Defaults to false, ie only simulate during verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * EVM facilitator implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkFacilitator {\n readonly scheme = \"exact\";\n readonly caipFamily = \"eip155:*\";\n private readonly config: Required;\n\n /**\n * Creates a new ExactEvmFacilitatorV1 instance.\n *\n * @param signer - The EVM signer for facilitator operations\n * @param config - Optional configuration for the facilitator\n */\n constructor(\n private readonly signer: FacilitatorEvmSigner,\n config?: ExactEvmSchemeV1Config,\n ) {\n this.config = {\n deployERC4337WithEIP6492: config?.deployERC4337WithEIP6492 ?? false,\n simulateInSettle: config?.simulateInSettle ?? false,\n };\n }\n\n /**\n * Get mechanism-specific extra data for the supported kinds endpoint.\n * For EVM, no extra data is needed.\n *\n * @param _ - The network identifier (unused for EVM)\n * @returns undefined (EVM has no extra data)\n */\n getExtra(_: string): Record | undefined {\n return undefined;\n }\n\n /**\n * Get signer addresses used by this facilitator.\n * Returns all addresses this facilitator can use for signing/settling transactions.\n *\n * @param _ - The network identifier (unused for EVM, addresses are network-agnostic)\n * @returns Array of facilitator wallet addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verifies a payment payload (V1).\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Promise resolving to verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise {\n return this._verify(payload, requirements);\n }\n\n /**\n * Settles a payment by executing the transfer (V1).\n *\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @returns Promise resolving to settlement response\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise {\n const payloadV1 = payload as unknown as PaymentPayloadV1;\n const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n\n // Re-verify before settling\n const valid = await this._verify(payload, requirements, {\n simulate: this.config.simulateInSettle ?? false,\n });\n if (!valid.isValid) {\n return {\n success: false,\n network: payloadV1.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n payer: exactEvmPayload.authorization.from,\n };\n }\n\n try {\n // Parse ERC-6492 signature if applicable (for optional deployment)\n const { address: factoryAddress, data: factoryCalldata } = parseErc6492Signature(\n exactEvmPayload.signature!,\n );\n\n // Deploy ERC-4337 smart wallet via EIP-6492 if configured and needed\n if (\n this.config.deployERC4337WithEIP6492 &&\n factoryAddress &&\n factoryCalldata &&\n !isAddressEqual(factoryAddress, \"0x0000000000000000000000000000000000000000\")\n ) {\n // Check if smart wallet is already deployed\n const payerAddress = exactEvmPayload.authorization.from;\n const bytecode = await this.signer.getCode({ address: payerAddress });\n\n if (!bytecode || bytecode === \"0x\") {\n // Send the factory calldata directly as a transaction\n // The factoryCalldata already contains the complete encoded function call\n const deployTx = await this.signer.sendTransaction({\n to: factoryAddress as Hex,\n data: factoryCalldata as Hex,\n });\n\n // Wait for deployment transaction\n await this.signer.waitForTransactionReceipt({ hash: deployTx });\n }\n }\n\n const tx = await executeTransferWithAuthorization(\n this.signer,\n getAddress(requirements.asset),\n exactEvmPayload,\n );\n\n // Wait for transaction confirmation\n const receipt = await this.signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: Errors.ErrTransactionFailed,\n transaction: tx,\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n } catch (error) {\n return {\n success: false,\n errorReason: error instanceof Error ? error.message : Errors.ErrTransactionFailed,\n transaction: \"\",\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n }\n }\n\n /**\n * Internal verify with optional simulation control.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param options - Verification options (e.g. simulate)\n * @returns Promise resolving to verification response\n */\n private async _verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n options?: VerifyV1Options,\n ): Promise {\n const requirementsV1 = requirements as unknown as PaymentRequirementsV1;\n const payloadV1 = payload as unknown as PaymentPayloadV1;\n const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n const payer = exactEvmPayload.authorization.from;\n let eip6492Deployment:\n | { factoryAddress: `0x${string}`; factoryCalldata: `0x${string}` }\n | undefined;\n\n // Verify scheme matches\n if (payloadV1.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n // Get chain configuration\n let chainId: number;\n try {\n chainId = getEvmChainIdV1(payloadV1.network as EvmNetworkV1);\n } catch {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n return {\n isValid: false,\n invalidReason: Errors.ErrMissingEip712Domain,\n payer,\n };\n }\n\n const { name, version } = requirements.extra;\n const erc20Address = getAddress(requirements.asset);\n\n // Verify network matches\n if (payloadV1.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n // Build typed data for signature verification\n const permitTypedData = {\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\" as const,\n domain: {\n name,\n version,\n chainId,\n verifyingContract: erc20Address,\n },\n message: {\n from: exactEvmPayload.authorization.from,\n to: exactEvmPayload.authorization.to,\n value: BigInt(exactEvmPayload.authorization.value),\n validAfter: BigInt(exactEvmPayload.authorization.validAfter),\n validBefore: BigInt(exactEvmPayload.authorization.validBefore),\n nonce: exactEvmPayload.authorization.nonce,\n },\n };\n\n // Verify signature (flatten EIP-6492 handling out of catch block)\n let isValid = false;\n try {\n isValid = await this.signer.verifyTypedData({\n address: payer,\n ...permitTypedData,\n signature: exactEvmPayload.signature!,\n });\n } catch {\n isValid = false;\n }\n\n const signature = exactEvmPayload.signature!;\n const sigLen = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n\n // Extract EIP-6492 deployment info (factory address + calldata) if present\n const erc6492Data = parseErc6492Signature(signature);\n const hasDeploymentInfo =\n erc6492Data.address &&\n erc6492Data.data &&\n !isAddressEqual(erc6492Data.address, \"0x0000000000000000000000000000000000000000\");\n\n if (hasDeploymentInfo) {\n eip6492Deployment = {\n factoryAddress: erc6492Data.address!,\n factoryCalldata: erc6492Data.data!,\n };\n }\n\n if (!isValid) {\n const isSmartWallet = sigLen > 130; // 65 bytes = 130 hex chars for EOA\n\n if (!isSmartWallet) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidSignature,\n payer,\n };\n }\n\n const bytecode = await this.signer.getCode({ address: payer });\n const isDeployed = bytecode && bytecode !== \"0x\";\n\n if (!isDeployed && !hasDeploymentInfo) {\n return {\n isValid: false,\n invalidReason: Errors.ErrUndeployedSmartWallet,\n payer,\n };\n }\n }\n\n // Verify payment recipient matches\n if (getAddress(exactEvmPayload.authorization.to) !== getAddress(requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrRecipientMismatch,\n payer,\n };\n }\n\n // Verify validBefore is in the future (with 6 second buffer for block time)\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(exactEvmPayload.authorization.validBefore) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidBeforeExpired,\n payer,\n };\n }\n\n // Verify validAfter is not in the future\n if (BigInt(exactEvmPayload.authorization.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidAfterInFuture,\n payer,\n };\n }\n\n // Verify amount exactly matches requirements\n if (BigInt(exactEvmPayload.authorization.value) !== BigInt(requirementsV1.maxAmountRequired)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidAuthorizationValue,\n payer,\n };\n }\n\n // Transaction simulation\n if (options?.simulate !== false) {\n const simulationSucceeded = await simulateEip3009Transfer(\n this.signer,\n erc20Address,\n exactEvmPayload,\n eip6492Deployment,\n );\n if (!simulationSucceeded) {\n return diagnoseEip3009SimulationFailure(\n this.signer,\n erc20Address,\n exactEvmPayload,\n requirements,\n requirementsV1.maxAmountRequired,\n );\n }\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer,\n };\n }\n}\n","import { PaymentRequirements, VerifyResponse } from \"@x402/core/types\";\nimport { encodeFunctionData, getAddress, Hex, parseErc6492Signature, parseSignature } from \"viem\";\nimport { eip3009ABI } from \"../../constants\";\nimport { multicall, ContractCall, RawContractCall } from \"../../multicall\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport * as Errors from \"./errors\";\n\nexport interface Eip6492Deployment {\n factoryAddress: `0x${string}`;\n factoryCalldata: `0x${string}`;\n}\n\n/**\n * Simulates transferWithAuthorization via eth_call.\n * Returns true if simulation succeeded, false if it failed.\n *\n * @param signer - EVM signer for contract reads\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n * @param eip6492Deployment - Optional EIP-6492 factory info for undeployed smart wallets\n *\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulateEip3009Transfer(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n eip6492Deployment?: Eip6492Deployment,\n): Promise {\n const auth = payload.authorization;\n const transferArgs = [\n getAddress(auth.from),\n getAddress(auth.to),\n BigInt(auth.value),\n BigInt(auth.validAfter),\n BigInt(auth.validBefore),\n auth.nonce,\n ] as const;\n\n if (eip6492Deployment) {\n const { signature: innerSignature } = parseErc6492Signature(payload.signature!);\n const transferCalldata = encodeFunctionData({\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...transferArgs, innerSignature],\n });\n\n try {\n const results = await multicall(signer.readContract.bind(signer), [\n {\n address: getAddress(eip6492Deployment.factoryAddress),\n callData: eip6492Deployment.factoryCalldata,\n } satisfies RawContractCall,\n {\n address: erc20Address,\n callData: transferCalldata,\n } satisfies RawContractCall,\n ]);\n\n return results[1]?.status === \"success\";\n } catch {\n return false;\n }\n }\n\n const sig = payload.signature!;\n const sigLength = sig.startsWith(\"0x\") ? sig.length - 2 : sig.length;\n const isECDSA = sigLength === 130;\n\n try {\n if (isECDSA) {\n const parsedSig = parseSignature(sig);\n await signer.readContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [\n ...transferArgs,\n (parsedSig.v as number | undefined) ?? parsedSig.yParity,\n parsedSig.r,\n parsedSig.s,\n ],\n });\n } else {\n await signer.readContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...transferArgs, sig],\n });\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * After simulation fails, runs a single diagnostic multicall to determine the most specific error reason.\n * Checks balanceOf, name, version and authorizationState in one RPC round-trip.\n *\n * @param signer - EVM signer used for the payment\n * @param erc20Address - Address of the ERC-20 token contract\n * @param payload - The EIP-3009 transfer authorization payload\n * @param requirements - Payment requirements to validate against\n * @param amountRequired - Required amount for the payment (balance check)\n *\n * @returns Promise resolving to the verification result with validity and optional invalid reason\n */\nexport async function diagnoseEip3009SimulationFailure(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n requirements: PaymentRequirements,\n amountRequired: string,\n): Promise {\n const payer = payload.authorization.from;\n\n const diagnosticCalls: ContractCall[] = [\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payload.authorization.from],\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"name\",\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"version\",\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"authorizationState\",\n args: [payload.authorization.from, payload.authorization.nonce],\n },\n ];\n\n try {\n const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n const [balanceResult, nameResult, versionResult, authStateResult] = results;\n\n if (authStateResult.status === \"failure\") {\n return { isValid: false, invalidReason: Errors.ErrEip3009NotSupported, payer };\n }\n\n if (authStateResult.status === \"success\" && authStateResult.result === true) {\n return { isValid: false, invalidReason: Errors.ErrEip3009NonceAlreadyUsed, payer };\n }\n\n if (\n nameResult.status === \"success\" &&\n requirements.extra?.name &&\n nameResult.result !== requirements.extra.name\n ) {\n return { isValid: false, invalidReason: Errors.ErrEip3009TokenNameMismatch, payer };\n }\n\n if (\n versionResult.status === \"success\" &&\n requirements.extra?.version &&\n versionResult.result !== requirements.extra.version\n ) {\n return { isValid: false, invalidReason: Errors.ErrEip3009TokenVersionMismatch, payer };\n }\n\n if (balanceResult.status === \"success\") {\n const balance = balanceResult.result as bigint;\n if (balance < BigInt(amountRequired)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrEip3009InsufficientBalance,\n payer,\n };\n }\n }\n } catch {\n // Diagnostic multicall failed — fall through to generic error\n }\n\n return { isValid: false, invalidReason: Errors.ErrEip3009SimulationFailed, payer };\n}\n\n/**\n * Executes transferWithAuthorization onchain.\n *\n * @param signer - EVM signer for contract writes\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n *\n * @returns Transaction hash\n */\nexport async function executeTransferWithAuthorization(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n): Promise {\n const { signature } = parseErc6492Signature(payload.signature!);\n const signatureLength = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n const isECDSA = signatureLength === 130;\n\n const auth = payload.authorization;\n const baseArgs = [\n getAddress(auth.from),\n getAddress(auth.to),\n BigInt(auth.value),\n BigInt(auth.validAfter),\n BigInt(auth.validBefore),\n auth.nonce,\n ] as const;\n\n if (isECDSA) {\n const parsedSig = parseSignature(signature);\n return signer.writeContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [\n ...baseArgs,\n (parsedSig.v as number | undefined) || parsedSig.yParity,\n parsedSig.r,\n parsedSig.s,\n ],\n });\n }\n\n return signer.writeContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...baseArgs, signature],\n });\n}\n","export { ExactEvmSchemeV1 } from \"../exact/v1\";\n\nexport const EVM_NETWORK_CHAIN_ID_MAP = {\n ethereum: 1,\n sepolia: 11155111,\n abstract: 2741,\n \"abstract-testnet\": 11124,\n \"base-sepolia\": 84532,\n base: 8453,\n \"avalanche-fuji\": 43113,\n avalanche: 43114,\n iotex: 4689,\n sei: 1329,\n \"sei-testnet\": 1328,\n polygon: 137,\n \"polygon-amoy\": 80002,\n peaq: 3338,\n story: 1514,\n educhain: 41923,\n \"skale-base-sepolia\": 324705682,\n megaeth: 4326,\n monad: 143,\n stable: 988,\n \"stable-testnet\": 2201,\n} as const;\n\nexport type EvmNetworkV1 = keyof typeof EVM_NETWORK_CHAIN_ID_MAP;\n\nexport const NETWORKS: string[] = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);\n\n/**\n * Extract chain ID from a v1 legacy network name.\n *\n * @param network - The v1 network name (e.g., \"base-sepolia\", \"polygon\")\n * @returns The numeric chain ID\n * @throws Error if the network name is not a known v1 network\n */\nexport function getEvmChainIdV1(network: string): number {\n const chainId = EVM_NETWORK_CHAIN_ID_MAP[network as EvmNetworkV1];\n if (!chainId) {\n throw new Error(`Unsupported v1 network: ${network}`);\n }\n return chainId;\n}\n","import type { PaymentPayload } from \"@x402/core/types\";\nimport type { FacilitatorEvmSigner } from \"../signer\";\n\nexport const EIP2612_GAS_SPONSORING_KEY = \"eip2612GasSponsoring\" as const;\nexport const ERC20_APPROVAL_GAS_SPONSORING_KEY = \"erc20ApprovalGasSponsoring\" as const;\nexport const ERC20_APPROVAL_GAS_SPONSORING_VERSION = \"1\" as const;\n\nexport interface Eip2612GasSponsoringInfo {\n [key: string]: unknown;\n from: string;\n asset: string;\n spender: string;\n amount: string;\n nonce: string;\n deadline: string;\n signature: string;\n version: string;\n}\n\nexport interface Erc20ApprovalGasSponsoringInfo {\n [key: string]: unknown;\n from: `0x${string}`;\n asset: `0x${string}`;\n spender: `0x${string}`;\n amount: string;\n signedTransaction: `0x${string}`;\n version: string;\n}\n\n/**\n * A single transaction to be executed by the signer.\n * - `0x${string}`: a pre-signed serialized transaction (broadcast as-is via sendRawTransaction)\n * - `{ to, data, gas? }`: an unsigned call intent (signer signs and broadcasts)\n */\nexport type TransactionRequest =\n | `0x${string}`\n | { to: `0x${string}`; data: `0x${string}`; gas?: bigint };\n\nexport type Erc20ApprovalGasSponsoringSigner = FacilitatorEvmSigner & {\n sendTransactions(transactions: TransactionRequest[]): Promise<`0x${string}`[]>;\n simulateTransactions?(transactions: TransactionRequest[]): Promise;\n};\n\nexport interface Erc20ApprovalGasSponsoringFacilitatorExtension {\n key: typeof ERC20_APPROVAL_GAS_SPONSORING_KEY;\n signer?: Erc20ApprovalGasSponsoringSigner;\n signerForNetwork?: (network: string) => Erc20ApprovalGasSponsoringSigner | undefined;\n}\n\n/**\n * Extracts a typed `info` payload from an extension entry.\n *\n * @param payload - Payment payload containing optional extensions.\n * @param extensionKey - Extension key to extract.\n * @returns The extension `info` object when present; otherwise null.\n */\nfunction _extractInfo(\n payload: PaymentPayload,\n extensionKey: string,\n): Record | null {\n const extensions = payload.extensions;\n if (!extensions) return null;\n const extension = extensions[extensionKey] as { info?: Record } | undefined;\n if (!extension?.info) return null;\n return extension.info;\n}\n\n/**\n * Extracts and validates required EIP-2612 gas sponsoring fields.\n *\n * @param payload - Payment payload returned by the client scheme.\n * @returns Parsed EIP-2612 gas sponsoring info when available and complete.\n */\nexport function extractEip2612GasSponsoringInfo(\n payload: PaymentPayload,\n): Eip2612GasSponsoringInfo | null {\n const info = _extractInfo(payload, EIP2612_GAS_SPONSORING_KEY);\n if (!info) return null;\n if (\n !info.from ||\n !info.asset ||\n !info.spender ||\n !info.amount ||\n !info.nonce ||\n !info.deadline ||\n !info.signature ||\n !info.version\n ) {\n return null;\n }\n return info as unknown as Eip2612GasSponsoringInfo;\n}\n\n/**\n * Validates the structure and formatting of EIP-2612 sponsoring info.\n *\n * @param info - EIP-2612 extension info to validate.\n * @returns True when all required fields match expected patterns.\n */\nexport function validateEip2612GasSponsoringInfo(info: Eip2612GasSponsoringInfo): boolean {\n const addressPattern = /^0x[a-fA-F0-9]{40}$/;\n const numericPattern = /^[0-9]+$/;\n const hexPattern = /^0x[a-fA-F0-9]+$/;\n const versionPattern = /^[0-9]+(\\.[0-9]+)*$/;\n return (\n addressPattern.test(info.from) &&\n addressPattern.test(info.asset) &&\n addressPattern.test(info.spender) &&\n numericPattern.test(info.amount) &&\n numericPattern.test(info.nonce) &&\n numericPattern.test(info.deadline) &&\n hexPattern.test(info.signature) &&\n versionPattern.test(info.version)\n );\n}\n\n/**\n * Extracts and validates required ERC-20 approval sponsoring fields.\n *\n * @param payload - Payment payload returned by the client scheme.\n * @returns Parsed ERC-20 approval sponsoring info when available and complete.\n */\nexport function extractErc20ApprovalGasSponsoringInfo(\n payload: PaymentPayload,\n): Erc20ApprovalGasSponsoringInfo | null {\n const info = _extractInfo(payload, ERC20_APPROVAL_GAS_SPONSORING_KEY);\n if (!info) return null;\n if (\n !info.from ||\n !info.asset ||\n !info.spender ||\n !info.amount ||\n !info.signedTransaction ||\n !info.version\n ) {\n return null;\n }\n return info as unknown as Erc20ApprovalGasSponsoringInfo;\n}\n\n/**\n * Validates the structure and formatting of ERC-20 approval sponsoring info.\n *\n * @param info - ERC-20 approval extension info to validate.\n * @returns True when all required fields match expected patterns.\n */\nexport function validateErc20ApprovalGasSponsoringInfo(\n info: Erc20ApprovalGasSponsoringInfo,\n): boolean {\n const addressPattern = /^0x[a-fA-F0-9]{40}$/;\n const numericPattern = /^[0-9]+$/;\n const hexPattern = /^0x[a-fA-F0-9]+$/;\n const versionPattern = /^[0-9]+(\\.[0-9]+)*$/;\n return (\n addressPattern.test(info.from) &&\n addressPattern.test(info.asset) &&\n addressPattern.test(info.spender) &&\n numericPattern.test(info.amount) &&\n hexPattern.test(info.signedTransaction) &&\n versionPattern.test(info.version)\n );\n}\n\n/**\n * Resolves the ERC-20 approval extension signer for a specific network.\n *\n * @param extension - Optional facilitator extension config.\n * @param network - CAIP-2 network identifier.\n * @returns A network-specific signer when available, else the default signer.\n */\nexport function resolveErc20ApprovalExtensionSigner(\n extension: Erc20ApprovalGasSponsoringFacilitatorExtension | undefined,\n network: string,\n): Erc20ApprovalGasSponsoringSigner | undefined {\n if (!extension) return undefined;\n return extension.signerForNetwork?.(network) ?? extension.signer;\n}\n","import {\n PaymentPayload,\n PaymentPayloadResult,\n PaymentRequirements,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@x402/core/types\";\nimport {\n extractEip2612GasSponsoringInfo,\n validateEip2612GasSponsoringInfo,\n extractErc20ApprovalGasSponsoringInfo,\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n type Eip2612GasSponsoringInfo,\n type Erc20ApprovalGasSponsoringFacilitatorExtension,\n type Erc20ApprovalGasSponsoringSigner,\n} from \"../exact/extensions\";\nimport { getAddress, encodeFunctionData } from \"viem\";\nimport { PERMIT2_ADDRESS, eip3009ABI, erc20AllowanceAbi, permit2WitnessTypes } from \"../constants\";\nimport { multicall, ContractCall } from \"../multicall\";\nimport { createPermit2Nonce, getEvmChainId } from \"../utils\";\nimport {\n ErrPermit2612AmountMismatch,\n ErrPermit2InvalidAmount,\n ErrPermit2InvalidDestination,\n ErrPermit2InvalidNonce,\n ErrPermit2InvalidOwner,\n ErrPermit2InvalidSignature,\n ErrPermit2PaymentTooEarly,\n ErrPermit2AllowanceRequired,\n ErrPermit2SimulationFailed,\n ErrPermit2InsufficientBalance,\n ErrPermit2ProxyNotDeployed,\n ErrInvalidTransactionState,\n ErrTransactionFailed,\n ErrInvalidEip2612ExtensionFormat,\n ErrEip2612FromMismatch,\n ErrEip2612AssetMismatch,\n ErrEip2612SpenderNotPermit2,\n ErrEip2612DeadlineExpired,\n ErrErc20ApprovalTxFailed,\n} from \"../exact/facilitator/errors\";\nimport { ClientEvmSigner, FacilitatorEvmSigner } from \"../signer\";\nimport { ExactPermit2Payload, Permit2Authorization, UptoPermit2Payload } from \"../types\";\nimport { validateErc20ApprovalForPayment } from \"./erc20approval\";\nimport {\n ErrUptoAmountExceedsPermitted,\n ErrUptoUnauthorizedFacilitator,\n} from \"../upto/facilitator/errors\";\n\n/**\n * Base type for Permit2 payloads shared between exact and upto schemes.\n * Both {@link ExactPermit2Payload} and {@link UptoPermit2Payload} satisfy this type.\n */\nexport type Permit2PayloadBase = ExactPermit2Payload | UptoPermit2Payload;\n\n/**\n * Configuration for the Permit2 proxy contract used during settlement.\n * The exact and upto schemes use different proxy addresses and ABIs.\n */\nexport type Permit2ProxyConfig = {\n /** The deployed proxy contract address. */\n proxyAddress: `0x${string}`;\n /** The proxy contract ABI (must include settle and settleWithPermit functions). */\n proxyABI: readonly Record[];\n};\n\n/**\n * Checks Permit2 allowance and validates gas sponsoring extensions if allowance is insufficient.\n *\n * When the on-chain ERC-20 allowance to the Permit2 contract is below the required amount,\n * this function falls back to validating EIP-2612 or ERC-20 approval gas sponsoring extensions\n * attached to the payment payload.\n *\n * @param signer - The facilitator signer for on-chain reads\n * @param payload - The payment payload\n * @param requirements - The payment requirements\n * @param payer - The payer address\n * @param tokenAddress - The token contract address\n * @param context - Optional facilitator context for extension lookup\n * @returns A VerifyResponse if verification should stop (failure), or null to continue\n */\nexport async function verifyPermit2Allowance(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n payer: `0x${string}`,\n tokenAddress: `0x${string}`,\n context?: FacilitatorContext,\n): Promise {\n try {\n const allowance = (await signer.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [payer, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return null; // Sufficient allowance, continue verification\n }\n\n // Allowance insufficient — try EIP-2612 gas sponsoring first\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n const result = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null; // EIP-2612 is valid, allowance will be set atomically during settlement\n }\n\n // Try ERC-20 approval gas sponsoring as fallback\n const erc20GasSponsorshipExtension =\n context?.getExtension(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const result = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null; // ERC-20 approval is valid, will be broadcast before settlement\n }\n }\n\n return { isValid: false, invalidReason: \"permit2_allowance_required\", payer };\n } catch {\n // Allowance check failed — validate extensions if present; fail closed if none valid\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n const result = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null;\n }\n\n const erc20GasSponsorshipExtension =\n context?.getExtension(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const result = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null;\n }\n }\n\n return { isValid: false, invalidReason: \"permit2_allowance_required\", payer };\n }\n}\n\n/**\n * Waits for a transaction receipt and returns the appropriate SettleResponse.\n *\n * @param signer - Signer with waitForTransactionReceipt capability\n * @param tx - The transaction hash to wait for\n * @param payload - The payment payload (for network info)\n * @param payer - The payer address\n * @returns Promise resolving to a settlement response indicating success or failure\n */\nexport async function waitAndReturnSettleResponse(\n signer: Pick,\n tx: `0x${string}`,\n payload: PaymentPayload,\n payer: `0x${string}`,\n): Promise {\n const receipt = await signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: ErrInvalidTransactionState,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n}\n\n/**\n * Maps contract revert errors to structured SettleResponse error reasons.\n *\n * Inspects the error message for known contract revert strings and maps them\n * to the corresponding error reason constants. Falls back to a generic\n * \"transaction_failed\" reason with truncated message for unrecognized errors.\n *\n * @param error - The caught error (typically from a contract write)\n * @param payload - The payment payload (for network info)\n * @param payer - The payer address\n * @returns A failed SettleResponse with the mapped error reason\n */\nexport function mapSettleError(\n error: unknown,\n payload: PaymentPayload,\n payer: `0x${string}`,\n): SettleResponse {\n let errorReason: string = ErrTransactionFailed;\n if (error instanceof Error) {\n const message = error.message;\n if (message.includes(\"Permit2612AmountMismatch\")) {\n errorReason = ErrPermit2612AmountMismatch;\n } else if (message.includes(\"InvalidAmount\")) {\n errorReason = ErrPermit2InvalidAmount;\n } else if (message.includes(\"InvalidDestination\")) {\n errorReason = ErrPermit2InvalidDestination;\n } else if (message.includes(\"InvalidOwner\")) {\n errorReason = ErrPermit2InvalidOwner;\n } else if (message.includes(\"PaymentTooEarly\")) {\n errorReason = ErrPermit2PaymentTooEarly;\n } else if (message.includes(\"InvalidSignature\") || message.includes(\"SignatureExpired\")) {\n errorReason = ErrPermit2InvalidSignature;\n } else if (message.includes(\"InvalidNonce\")) {\n errorReason = ErrPermit2InvalidNonce;\n } else if (message.includes(\"erc20_approval_tx_failed\")) {\n errorReason = ErrErc20ApprovalTxFailed;\n } else if (message.includes(\"AmountExceedsPermitted\")) {\n errorReason = ErrUptoAmountExceedsPermitted;\n } else if (message.includes(\"UnauthorizedFacilitator\")) {\n errorReason = ErrUptoUnauthorizedFacilitator;\n } else {\n errorReason = `${ErrTransactionFailed}: ${message.slice(0, 500)}`;\n }\n }\n return {\n success: false,\n errorReason,\n transaction: \"\",\n network: payload.accepted.network,\n payer,\n };\n}\n\n/**\n * Validates EIP-2612 permit extension data for a Permit2 payment.\n *\n * Checks that the permit extension has a valid format and that the from address,\n * asset address, spender address, and deadline all match expectations.\n *\n * @param info - The EIP-2612 gas sponsoring info extracted from the payment payload\n * @param payer - The expected payer address\n * @param tokenAddress - The expected token address\n * @returns Validation result with isValid flag and optional invalidReason string\n */\nexport function validateEip2612PermitForPayment(\n info: Eip2612GasSponsoringInfo,\n payer: `0x${string}`,\n tokenAddress: `0x${string}`,\n): { isValid: boolean; invalidReason?: string } {\n if (!validateEip2612GasSponsoringInfo(info)) {\n return { isValid: false, invalidReason: ErrInvalidEip2612ExtensionFormat };\n }\n\n if (getAddress(info.from as `0x${string}`) !== getAddress(payer)) {\n return { isValid: false, invalidReason: ErrEip2612FromMismatch };\n }\n\n if (getAddress(info.asset as `0x${string}`) !== tokenAddress) {\n return { isValid: false, invalidReason: ErrEip2612AssetMismatch };\n }\n\n if (getAddress(info.spender as `0x${string}`) !== getAddress(PERMIT2_ADDRESS)) {\n return { isValid: false, invalidReason: ErrEip2612SpenderNotPermit2 };\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(info.deadline) < BigInt(now + 6)) {\n return { isValid: false, invalidReason: ErrEip2612DeadlineExpired };\n }\n\n return { isValid: true };\n}\n\n// ---------------------------------------------------------------------------\n// Simulation helpers (shared across exact and upto)\n// ---------------------------------------------------------------------------\n\n/**\n * Simulates settle() via eth_call (readContract).\n * Returns true if simulation succeeded, false if it failed.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulatePermit2Settle(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n settleArgs: readonly unknown[],\n): Promise {\n try {\n await signer.readContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settle\",\n args: settleArgs,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Simulates settleWithPermit() via eth_call (readContract).\n * The contract atomically calls token.permit() then PERMIT2.permitTransferFrom(),\n * so simulation covers allowance + balance + nonces.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @param eip2612Info - EIP-2612 gas sponsoring info from the payload extension\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulatePermit2SettleWithPermit(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n settleArgs: readonly unknown[],\n eip2612Info: Eip2612GasSponsoringInfo,\n): Promise {\n try {\n const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n await signer.readContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settleWithPermit\",\n args: [\n {\n value: BigInt(eip2612Info.amount),\n deadline: BigInt(eip2612Info.deadline),\n r,\n s,\n v,\n },\n ...settleArgs,\n ],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Delegates the full approve+settle simulation flow to the extension signer via simulateTransactions.\n * The signer owns execution strategy.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param extensionSigner - The extension signer with simulateTransactions capability\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction hex string\n * @returns true if the bundle simulation succeeded, false otherwise\n */\nexport async function simulatePermit2SettleWithErc20Approval(\n config: Permit2ProxyConfig,\n extensionSigner: Erc20ApprovalGasSponsoringSigner,\n settleArgs: readonly unknown[],\n erc20Info: { signedTransaction: string },\n): Promise {\n if (!extensionSigner.simulateTransactions) {\n return false;\n }\n\n try {\n const settleData = encodeFunctionData({\n abi: config.proxyABI,\n functionName: \"settle\",\n args: settleArgs,\n });\n\n return await extensionSigner.simulateTransactions([\n erc20Info.signedTransaction as `0x${string}`,\n { to: config.proxyAddress, data: settleData, gas: BigInt(300_000) },\n ]);\n } catch {\n return false;\n }\n}\n\n/**\n * Diagnoses a Permit2 simulation failure by performing a multicall to check the proxy deployment, balance and allowance.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param tokenAddress - ERC-20 token contract address\n * @param permit2Payload - The Permit2 authorization payload\n * @param amountRequired - Required payment amount (as string)\n * @returns VerifyResponse with the most specific failure reason\n */\nexport async function diagnosePermit2SimulationFailure(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n tokenAddress: `0x${string}`,\n permit2Payload: Permit2PayloadBase,\n amountRequired: string,\n): Promise {\n const payer = permit2Payload.permit2Authorization.from;\n\n const diagnosticCalls: ContractCall[] = [\n {\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"PERMIT2\",\n },\n {\n address: tokenAddress,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payer],\n },\n {\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [payer, PERMIT2_ADDRESS],\n },\n ];\n\n try {\n const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n const [proxyResult, balanceResult, allowanceResult] = results;\n\n if (proxyResult.status === \"failure\") {\n return { isValid: false, invalidReason: ErrPermit2ProxyNotDeployed, payer };\n }\n\n if (balanceResult.status === \"success\") {\n const balance = balanceResult.result as bigint;\n if (balance < BigInt(amountRequired)) {\n return { isValid: false, invalidReason: ErrPermit2InsufficientBalance, payer };\n }\n }\n\n if (allowanceResult.status === \"success\") {\n const allowance = allowanceResult.result as bigint;\n if (allowance < BigInt(amountRequired)) {\n return { isValid: false, invalidReason: ErrPermit2AllowanceRequired, payer };\n }\n }\n } catch {\n // Diagnostic multicall itself failed — fall through to generic error\n }\n\n return { isValid: false, invalidReason: ErrPermit2SimulationFailed, payer };\n}\n\n/**\n * Targeted multicall for the ERC-20 approval path where simulation cannot be used\n * (the approval hasn't been broadcast yet, so settle() would fail for expected reasons).\n * Checks proxy deployment, payer token balance and payer ETH balance for gas.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param tokenAddress - ERC-20 token contract address\n * @param payer - The payer address\n * @param amountRequired - Required payment amount (as string)\n * @returns VerifyResponse — valid if checks pass, otherwise the most specific failure\n */\nexport async function checkPermit2Prerequisites(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n tokenAddress: `0x${string}`,\n payer: `0x${string}`,\n amountRequired: string,\n): Promise {\n const diagnosticCalls: ContractCall[] = [\n {\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"PERMIT2\",\n },\n {\n address: tokenAddress,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payer],\n },\n ];\n\n try {\n const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n const [proxyResult, balanceResult] = results;\n\n if (proxyResult.status === \"failure\") {\n return { isValid: false, invalidReason: ErrPermit2ProxyNotDeployed, payer };\n }\n\n if (balanceResult.status === \"success\") {\n const balance = balanceResult.result as bigint;\n if (balance < BigInt(amountRequired)) {\n return { isValid: false, invalidReason: ErrPermit2InsufficientBalance, payer };\n }\n }\n } catch {\n // Multicall failed — fall through to valid (fail open for prerequisites-only check)\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n}\n\n/**\n * Builds args for exact settle(permit, owner, witness, signature).\n *\n * @param permit2Payload - The Permit2 payload containing authorization and signature data\n * @returns Tuple of contract call arguments for the exact settle function\n */\nexport function buildExactPermit2SettleArgs(permit2Payload: Permit2PayloadBase) {\n return [\n {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n },\n getAddress(permit2Payload.permit2Authorization.from),\n {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n permit2Payload.signature,\n ] as const;\n}\n\n/**\n * Builds args for upto settle(permit, amount, owner, witness, signature).\n * The upto contract's settle() takes an additional `amount` parameter and the witness\n * includes a `facilitator` field.\n *\n * @param permit2Payload - The upto Permit2 payload containing authorization and signature data\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @returns Tuple of contract call arguments for the upto settle function\n */\nexport function buildUptoPermit2SettleArgs(\n permit2Payload: UptoPermit2Payload,\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n) {\n return [\n {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n },\n settlementAmount,\n getAddress(permit2Payload.permit2Authorization.from),\n {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n facilitator: getAddress(facilitatorAddress),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n permit2Payload.signature,\n ] as const;\n}\n\n/**\n * Splits a 65-byte EIP-2612 signature into v, r, s components.\n *\n * @param signature - The hex-encoded 65-byte signature (with or without 0x prefix)\n * @returns Object with v (uint8), r (bytes32 hex), s (bytes32 hex)\n * @throws Error if the signature is not exactly 65 bytes (130 hex chars)\n */\nexport function splitEip2612Signature(signature: string): {\n v: number;\n r: `0x${string}`;\n s: `0x${string}`;\n} {\n const sig = signature.startsWith(\"0x\") ? signature.slice(2) : signature;\n\n if (sig.length !== 130) {\n throw new Error(\n `invalid EIP-2612 signature length: expected 65 bytes (130 hex chars), got ${sig.length / 2} bytes`,\n );\n }\n\n const r = `0x${sig.slice(0, 64)}` as `0x${string}`;\n const s = `0x${sig.slice(64, 128)}` as `0x${string}`;\n const v = parseInt(sig.slice(128, 130), 16);\n\n return { v, r, s };\n}\n\n// ---------------------------------------------------------------------------\n// Client-side helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Permit2 payload for any scheme (exact or upto).\n * The only scheme-specific input is the proxy address used as the spender.\n *\n * @param proxyAddress - The x402 proxy contract address to set as spender\n * @param signer - The EVM client signer\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createPermit2PayloadForProxy(\n proxyAddress: `0x${string}`,\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise {\n const now = Math.floor(Date.now() / 1000);\n const nonce = createPermit2Nonce();\n\n // Lower time bound - allow some clock skew\n const validAfter = (now - 600).toString();\n // Upper time bound is enforced by Permit2's deadline field\n const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();\n\n const permit2Authorization: Permit2Authorization & { from: `0x${string}` } = {\n from: signer.address,\n permitted: {\n token: getAddress(paymentRequirements.asset),\n amount: paymentRequirements.amount,\n },\n spender: proxyAddress,\n nonce,\n deadline,\n witness: {\n to: getAddress(paymentRequirements.payTo),\n validAfter,\n },\n };\n\n const signature = await signPermit2Authorization(\n signer,\n permit2Authorization,\n paymentRequirements,\n );\n\n return {\n x402Version,\n payload: { signature, permit2Authorization },\n };\n}\n\n/**\n * Signs a Permit2 authorization using EIP-712 with witness data.\n * The signature authorizes the proxy contract to transfer tokens on behalf of the signer.\n *\n * @param signer - The EVM client signer\n * @param permit2Authorization - The Permit2 authorization parameters\n * @param requirements - The payment requirements\n * @returns Promise resolving to the hex-encoded signature\n */\nasync function signPermit2Authorization(\n signer: ClientEvmSigner,\n permit2Authorization: Permit2Authorization & { from: `0x${string}` },\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n return await signer.signTypedData({\n domain: { name: \"Permit2\", chainId, verifyingContract: PERMIT2_ADDRESS },\n types: permit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\",\n message: {\n permitted: {\n token: getAddress(permit2Authorization.permitted.token),\n amount: BigInt(permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Authorization.spender),\n nonce: BigInt(permit2Authorization.nonce),\n deadline: BigInt(permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Authorization.witness.to),\n validAfter: BigInt(permit2Authorization.witness.validAfter),\n },\n },\n });\n}\n","import {\n getAddress,\n parseTransaction,\n decodeFunctionData,\n recoverTransactionAddress,\n type TransactionSerialized,\n} from \"viem\";\nimport type { VerifyResponse } from \"@x402/core/types\";\nimport {\n validateErc20ApprovalGasSponsoringInfo,\n type Erc20ApprovalGasSponsoringInfo,\n} from \"../exact/extensions\";\nimport { PERMIT2_ADDRESS, erc20ApproveAbi } from \"../constants\";\nimport {\n ErrErc20ApprovalInvalidFormat,\n ErrErc20ApprovalFromMismatch,\n ErrErc20ApprovalAssetMismatch,\n ErrErc20ApprovalSpenderNotPermit2,\n ErrErc20ApprovalTxWrongTarget,\n ErrErc20ApprovalTxWrongSelector,\n ErrErc20ApprovalTxWrongSpender,\n ErrErc20ApprovalTxInvalidCalldata,\n ErrErc20ApprovalTxSignerMismatch,\n ErrErc20ApprovalTxInvalidSignature,\n ErrErc20ApprovalTxParseFailed,\n} from \"../exact/facilitator/errors\";\n\n/** The approve(address,uint256) function selector */\nconst APPROVE_SELECTOR = \"0x095ea7b3\";\n\n/**\n * Validates ERC-20 approval extension data for a Permit2 payment.\n *\n * Performs comprehensive validation:\n * - Format validation via validateErc20ApprovalGasSponsoringInfo (JSON Schema)\n * - `from` matches payer\n * - `asset` matches token\n * - `spender` is PERMIT2_ADDRESS\n * - Transaction `to` matches token address\n * - Transaction calldata is a valid approve(PERMIT2_ADDRESS, ...) call\n * - Recovered transaction signer matches `from`\n *\n * @param info - The ERC-20 approval gas sponsoring info\n * @param payer - The expected payer address\n * @param tokenAddress - The expected token address\n * @returns Validation result with invalidReason and invalidMessage on failure\n */\nexport async function validateErc20ApprovalForPayment(\n info: Erc20ApprovalGasSponsoringInfo,\n payer: `0x${string}`,\n tokenAddress: `0x${string}`,\n): Promise> {\n if (!validateErc20ApprovalGasSponsoringInfo(info)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalInvalidFormat,\n invalidMessage: \"ERC-20 approval extension info failed schema validation\",\n };\n }\n\n if (getAddress(info.from) !== getAddress(payer)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalFromMismatch,\n invalidMessage: `Expected from=${payer}, got ${info.from}`,\n };\n }\n\n if (getAddress(info.asset) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalAssetMismatch,\n invalidMessage: `Expected asset=${tokenAddress}, got ${info.asset}`,\n };\n }\n\n if (getAddress(info.spender) !== getAddress(PERMIT2_ADDRESS)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalSpenderNotPermit2,\n invalidMessage: `Expected spender=${PERMIT2_ADDRESS}, got ${info.spender}`,\n };\n }\n\n try {\n const serializedTx = info.signedTransaction as TransactionSerialized;\n const tx = parseTransaction(serializedTx);\n\n if (!tx.to || getAddress(tx.to) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxWrongTarget,\n invalidMessage: `Transaction targets ${tx.to ?? \"null\"}, expected ${tokenAddress}`,\n };\n }\n\n const data = tx.data ?? \"0x\";\n if (!data.startsWith(APPROVE_SELECTOR)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxWrongSelector,\n invalidMessage: `Transaction calldata does not start with approve() selector ${APPROVE_SELECTOR}`,\n };\n }\n\n try {\n const decoded = decodeFunctionData({\n abi: erc20ApproveAbi,\n data: data as `0x${string}`,\n });\n const calldataSpender = getAddress(decoded.args[0] as `0x${string}`);\n if (calldataSpender !== getAddress(PERMIT2_ADDRESS)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxWrongSpender,\n invalidMessage: `approve() spender is ${calldataSpender}, expected Permit2 ${PERMIT2_ADDRESS}`,\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxInvalidCalldata,\n invalidMessage: \"Failed to decode approve() calldata from the signed transaction\",\n };\n }\n\n try {\n const recoveredAddress = await recoverTransactionAddress({\n serializedTransaction: serializedTx,\n });\n if (getAddress(recoveredAddress) !== getAddress(payer)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxSignerMismatch,\n invalidMessage: `Transaction signed by ${recoveredAddress}, expected payer ${payer}`,\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxInvalidSignature,\n invalidMessage: \"Failed to recover signer from the signed transaction\",\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxParseFailed,\n invalidMessage: \"Failed to parse the signed transaction\",\n };\n }\n\n return { isValid: true };\n}\n","/**\n * Named error reason constants for the upto EVM facilitator.\n *\n * Shared Permit2 errors are re-exported from exact/facilitator/errors.ts.\n * Upto-specific errors are defined here.\n *\n * These strings must be character-for-character identical to the Go constants\n * to maintain cross-SDK parity.\n */\n\n// Re-export shared Permit2 errors\nexport {\n ErrPermit2InvalidSpender,\n ErrPermit2RecipientMismatch,\n ErrPermit2DeadlineExpired,\n ErrPermit2NotYetValid,\n ErrPermit2AmountMismatch,\n ErrPermit2TokenMismatch,\n ErrPermit2InvalidSignature,\n ErrPermit2AllowanceRequired,\n ErrPermit2InvalidAmount,\n ErrPermit2InvalidDestination,\n ErrPermit2InvalidOwner,\n ErrPermit2PaymentTooEarly,\n ErrPermit2InvalidNonce,\n ErrPermit2612AmountMismatch,\n ErrErc20ApprovalInvalidFormat,\n ErrErc20ApprovalFromMismatch,\n ErrErc20ApprovalAssetMismatch,\n ErrErc20ApprovalSpenderNotPermit2,\n ErrErc20ApprovalTxWrongTarget,\n ErrErc20ApprovalTxWrongSelector,\n ErrErc20ApprovalTxWrongSpender,\n ErrErc20ApprovalTxInvalidCalldata,\n ErrErc20ApprovalTxSignerMismatch,\n ErrErc20ApprovalTxInvalidSignature,\n ErrErc20ApprovalTxParseFailed,\n} from \"../../exact/facilitator/errors\";\n\n// Upto-specific errors\nexport const ErrUptoInvalidScheme = \"invalid_upto_evm_scheme\";\nexport const ErrUptoNetworkMismatch = \"invalid_upto_evm_network_mismatch\";\nexport const ErrUptoSettlementExceedsAmount = \"invalid_upto_evm_payload_settlement_exceeds_amount\";\nexport const ErrUptoAmountExceedsPermitted = \"upto_amount_exceeds_permitted\";\nexport const ErrUptoUnauthorizedFacilitator = \"upto_unauthorized_facilitator\";\nexport const ErrUptoFacilitatorMismatch = \"upto_facilitator_mismatch\";\n","import { PaymentRequirements, PaymentPayloadResult } from \"@x402/core/types\";\nimport { encodeFunctionData, getAddress } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n x402ExactPermit2ProxyAddress,\n erc20ApproveAbi,\n erc20AllowanceAbi,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { createPermit2PayloadForProxy } from \"../../shared/permit2\";\n\n/** Maximum uint256 value for unlimited approval. */\nconst MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\n/**\n * Creates a Permit2 payload using the x402Permit2Proxy witness pattern.\n * The spender is set to x402Permit2Proxy, which enforces that funds\n * can only be sent to the witness.to address.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createPermit2Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise {\n return createPermit2PayloadForProxy(\n x402ExactPermit2ProxyAddress,\n signer,\n x402Version,\n paymentRequirements,\n );\n}\n\n/**\n * Creates transaction data to approve Permit2 to spend tokens.\n * The user sends this transaction (paying gas) before using Permit2 flow.\n *\n * @param tokenAddress - The ERC20 token contract address\n * @returns Transaction data to send for approval\n *\n * @example\n * ```typescript\n * const tx = createPermit2ApprovalTx(\"0x...\");\n * await walletClient.sendTransaction({\n * to: tx.to,\n * data: tx.data,\n * });\n * ```\n */\nexport function createPermit2ApprovalTx(tokenAddress: `0x${string}`): {\n to: `0x${string}`;\n data: `0x${string}`;\n} {\n const data = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [PERMIT2_ADDRESS, MAX_UINT256],\n });\n\n return {\n to: getAddress(tokenAddress),\n data,\n };\n}\n\n/**\n * Parameters for checking Permit2 allowance.\n * Application provides these to check if approval is needed.\n */\nexport interface Permit2AllowanceParams {\n tokenAddress: `0x${string}`;\n ownerAddress: `0x${string}`;\n}\n\n/**\n * Returns contract read parameters for checking Permit2 allowance.\n * Use with a public client to check if the user has approved Permit2.\n *\n * @param params - The allowance check parameters\n * @returns Contract read parameters for checking allowance\n *\n * @example\n * ```typescript\n * const readParams = getPermit2AllowanceReadParams({\n * tokenAddress: \"0x...\",\n * ownerAddress: \"0x...\",\n * });\n *\n * const allowance = await publicClient.readContract(readParams);\n * const needsApproval = allowance < requiredAmount;\n * ```\n */\nexport function getPermit2AllowanceReadParams(params: Permit2AllowanceParams): {\n address: `0x${string}`;\n abi: typeof erc20AllowanceAbi;\n functionName: \"allowance\";\n args: [`0x${string}`, `0x${string}`];\n} {\n return {\n address: getAddress(params.tokenAddress),\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [getAddress(params.ownerAddress), PERMIT2_ADDRESS],\n };\n}\n","import { PaymentRequirements, PaymentPayloadResult, PaymentPayloadContext } from \"@x402/core/types\";\nimport { EIP2612_GAS_SPONSORING_KEY, ERC20_APPROVAL_GAS_SPONSORING_KEY } from \"../exact/extensions\";\nimport { getAddress } from \"viem\";\nimport { PERMIT2_ADDRESS, erc20AllowanceAbi } from \"../constants\";\nimport { getEvmChainId } from \"../utils\";\nimport { ClientEvmSigner } from \"../signer\";\nimport { signEip2612Permit } from \"../exact/client/eip2612\";\nimport { signErc20ApprovalTransaction } from \"../exact/client/erc20approval\";\nimport { resolveExtensionRpcCapabilities, type ExactEvmSchemeOptions } from \"./rpc\";\n\n/**\n * Attempts to sign an EIP-2612 permit for gasless Permit2 approval.\n *\n * @param signer - The EVM client signer\n * @param options - Optional RPC configuration for backfilling capabilities\n * @param requirements - The payment requirements from the server\n * @param result - The payment payload result from the scheme\n * @param context - Optional context containing server extensions and metadata\n * @returns Extension data for EIP-2612 gas sponsoring, or undefined if not applicable\n */\nexport async function trySignEip2612PermitExtension(\n signer: ClientEvmSigner,\n options: ExactEvmSchemeOptions | undefined,\n requirements: PaymentRequirements,\n result: PaymentPayloadResult,\n context?: PaymentPayloadContext,\n): Promise | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);\n\n if (!capabilities.readContract) {\n return undefined;\n }\n\n if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {\n return undefined;\n }\n\n const tokenName = requirements.extra?.name as string | undefined;\n const tokenVersion = requirements.extra?.version as string | undefined;\n if (!tokenName || !tokenVersion) {\n return undefined;\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset) as `0x${string}`;\n\n try {\n const allowance = (await capabilities.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [signer.address, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return undefined;\n }\n } catch {\n // Allowance check failed, proceed with signing\n }\n\n const permit2Auth = result.payload?.permit2Authorization as Record | undefined;\n const deadline =\n (permit2Auth?.deadline as string) ??\n Math.floor(Date.now() / 1000 + requirements.maxTimeoutSeconds).toString();\n\n const info = await signEip2612Permit(\n {\n address: signer.address,\n signTypedData: msg => signer.signTypedData(msg),\n readContract: capabilities.readContract,\n },\n tokenAddress,\n tokenName,\n tokenVersion,\n chainId,\n deadline,\n requirements.amount,\n );\n\n return {\n [EIP2612_GAS_SPONSORING_KEY]: { info },\n };\n}\n\n/**\n * Attempts to sign an ERC-20 approval transaction for gasless Permit2 approval.\n *\n * @param signer - The EVM client signer\n * @param options - Optional RPC configuration for backfilling capabilities\n * @param requirements - The payment requirements from the server\n * @param context - Optional context containing server extensions and metadata\n * @returns Extension data for ERC-20 approval gas sponsoring, or undefined if not applicable\n */\nexport async function trySignErc20ApprovalExtension(\n signer: ClientEvmSigner,\n options: ExactEvmSchemeOptions | undefined,\n requirements: PaymentRequirements,\n context?: PaymentPayloadContext,\n): Promise | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);\n\n if (!capabilities.readContract) {\n return undefined;\n }\n\n if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {\n return undefined;\n }\n\n if (!capabilities.signTransaction || !capabilities.getTransactionCount) {\n return undefined;\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset) as `0x${string}`;\n\n try {\n const allowance = (await capabilities.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [signer.address, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return undefined;\n }\n } catch {\n // Allowance check failed, proceed with signing\n }\n\n const info = await signErc20ApprovalTransaction(\n {\n address: signer.address,\n signTransaction: capabilities.signTransaction,\n getTransactionCount: capabilities.getTransactionCount,\n estimateFeesPerGas: capabilities.estimateFeesPerGas,\n },\n tokenAddress,\n chainId,\n );\n\n return {\n [ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info },\n };\n}\n","import { getAddress } from \"viem\";\nimport { eip2612PermitTypes, eip2612NoncesAbi, PERMIT2_ADDRESS } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport type { Eip2612GasSponsoringInfo } from \"../extensions\";\n\nexport type Eip2612PermitSigner = Pick & {\n readContract: NonNullable;\n};\n\n/**\n * Signs an EIP-2612 permit authorizing the Permit2 contract to spend tokens.\n *\n * This creates a gasless off-chain signature that the facilitator can submit\n * on-chain via `x402Permit2Proxy.settleWithPermit()`.\n *\n * The `permittedAmount` must match the Permit2 `permitted.amount` exactly, as the\n * proxy contract enforces `permit2612.value == permittedAmount`.\n *\n * @param signer - The client EVM signer (must support readContract for nonce query)\n * @param tokenAddress - The ERC-20 token contract address\n * @param tokenName - The token name (from paymentRequirements.extra.name)\n * @param tokenVersion - The token version (from paymentRequirements.extra.version)\n * @param chainId - The chain ID\n * @param deadline - The deadline for the permit (unix timestamp as string)\n * @param permittedAmount - The Permit2 permitted amount (must match exactly)\n * @returns The EIP-2612 gas sponsoring info object\n */\nexport async function signEip2612Permit(\n signer: Eip2612PermitSigner,\n tokenAddress: `0x${string}`,\n tokenName: string,\n tokenVersion: string,\n chainId: number,\n deadline: string,\n permittedAmount: string,\n): Promise {\n const owner = signer.address;\n const spender = getAddress(PERMIT2_ADDRESS);\n\n // Query the current EIP-2612 nonce from the token contract\n const nonce = (await signer.readContract({\n address: tokenAddress,\n abi: eip2612NoncesAbi,\n functionName: \"nonces\",\n args: [owner],\n })) as bigint;\n\n // Construct EIP-712 domain for the token's permit function\n const domain = {\n name: tokenName,\n version: tokenVersion,\n chainId,\n verifyingContract: tokenAddress,\n };\n\n const approvalAmount = BigInt(permittedAmount);\n\n const message = {\n owner,\n spender,\n value: approvalAmount,\n nonce,\n deadline: BigInt(deadline),\n };\n\n // Sign the EIP-2612 permit\n const signature = await signer.signTypedData({\n domain,\n types: eip2612PermitTypes,\n primaryType: \"Permit\",\n message,\n });\n\n return {\n from: owner,\n asset: tokenAddress,\n spender,\n amount: approvalAmount.toString(),\n nonce: nonce.toString(),\n deadline,\n signature,\n version: \"1\",\n };\n}\n","import { encodeFunctionData, getAddress, maxUint256 } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n erc20ApproveAbi,\n ERC20_APPROVE_GAS_LIMIT,\n DEFAULT_MAX_FEE_PER_GAS,\n DEFAULT_MAX_PRIORITY_FEE_PER_GAS,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport {\n ERC20_APPROVAL_GAS_SPONSORING_VERSION,\n type Erc20ApprovalGasSponsoringInfo,\n} from \"../extensions\";\n\nexport type Erc20ApprovalTxSigner = Pick & {\n signTransaction: NonNullable;\n getTransactionCount: NonNullable;\n estimateFeesPerGas?: NonNullable;\n};\n\n/**\n * Signs an EIP-1559 `approve(Permit2, MaxUint256)` transaction for the given token.\n *\n * The signed transaction is NOT broadcast here — the facilitator broadcasts it\n * atomically before settling the Permit2 payment. This enables Permit2 payments\n * for generic ERC-20 tokens that do NOT implement EIP-2612.\n *\n * Always approves MaxUint256 regardless of the payment amount.\n *\n * @param signer - The client EVM signer (must support signTransaction, getTransactionCount)\n * @param tokenAddress - The ERC-20 token contract address\n * @param chainId - The chain ID\n * @returns The ERC-20 approval gas sponsoring info object\n */\nexport async function signErc20ApprovalTransaction(\n signer: Erc20ApprovalTxSigner,\n tokenAddress: `0x${string}`,\n chainId: number,\n): Promise {\n const from = signer.address;\n const spender = getAddress(PERMIT2_ADDRESS);\n\n // Encode approve(PERMIT2_ADDRESS, MaxUint256) calldata\n const data = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [spender, maxUint256],\n });\n\n // Get current nonce for the sender\n const nonce = await signer.getTransactionCount({ address: from });\n\n // Get current fee estimates, with fallback values\n let maxFeePerGas: bigint;\n let maxPriorityFeePerGas: bigint;\n try {\n const fees = await signer.estimateFeesPerGas?.();\n if (!fees) {\n throw new Error(\"no fee estimates available\");\n }\n maxFeePerGas = fees.maxFeePerGas;\n maxPriorityFeePerGas = fees.maxPriorityFeePerGas;\n } catch {\n maxFeePerGas = DEFAULT_MAX_FEE_PER_GAS;\n maxPriorityFeePerGas = DEFAULT_MAX_PRIORITY_FEE_PER_GAS;\n }\n\n // Sign the EIP-1559 transaction (not broadcast)\n const signedTransaction = await signer.signTransaction({\n to: tokenAddress,\n data,\n nonce,\n gas: ERC20_APPROVE_GAS_LIMIT,\n maxFeePerGas,\n maxPriorityFeePerGas,\n chainId,\n });\n\n return {\n from,\n asset: tokenAddress,\n spender,\n amount: maxUint256.toString(),\n signedTransaction,\n version: ERC20_APPROVAL_GAS_SPONSORING_VERSION,\n };\n}\n","import { createPublicClient, http } from \"viem\";\nimport type { ClientEvmSigner } from \"../signer\";\nimport { getEvmChainId } from \"../utils\";\n\nexport type EvmSchemeConfig = {\n rpcUrl?: string;\n};\n\nexport type EvmSchemeConfigByChainId = Record;\n\nexport type EvmSchemeOptions = EvmSchemeConfig | EvmSchemeConfigByChainId;\n\n/** @deprecated Use EvmSchemeConfig */\nexport type ExactEvmSchemeConfig = EvmSchemeConfig;\n/** @deprecated Use EvmSchemeConfigByChainId */\nexport type ExactEvmSchemeConfigByChainId = EvmSchemeConfigByChainId;\n/** @deprecated Use EvmSchemeOptions */\nexport type ExactEvmSchemeOptions = EvmSchemeOptions;\n\ntype ExtensionRpcCapabilities = Pick<\n ClientEvmSigner,\n \"readContract\" | \"signTransaction\" | \"getTransactionCount\" | \"estimateFeesPerGas\"\n>;\n\nconst rpcClientCache = new Map>();\n\n/**\n * Check if options is a per-chain-id configuration map.\n *\n * @param options - The EVM scheme options to check\n * @returns True if the options are keyed by chain ID\n */\nfunction isConfigByChainId(options: EvmSchemeOptions): options is EvmSchemeConfigByChainId {\n const keys = Object.keys(options);\n return keys.length > 0 && keys.every(key => /^\\d+$/.test(key));\n}\n\n/**\n * Get or create a cached viem public client for the given RPC URL.\n *\n * @param rpcUrl - The JSON-RPC endpoint URL\n * @returns A viem PublicClient instance\n */\nfunction getRpcClient(rpcUrl: string): ReturnType {\n const existing = rpcClientCache.get(rpcUrl);\n if (existing) {\n return existing;\n }\n\n const client = createPublicClient({\n transport: http(rpcUrl),\n });\n rpcClientCache.set(rpcUrl, client);\n return client;\n}\n\n/**\n * Resolve an RPC URL from scheme options for the given network.\n *\n * @param network - The CAIP-2 network identifier\n * @param options - Optional EVM scheme options (flat or per-chain-id)\n * @returns The resolved RPC URL, or undefined if not configured\n */\nexport function resolveRpcUrl(network: string, options?: EvmSchemeOptions): string | undefined {\n if (!options) {\n return undefined;\n }\n\n if (isConfigByChainId(options)) {\n const chainId = getEvmChainId(network);\n const optionsByChainId = options as EvmSchemeConfigByChainId;\n return optionsByChainId[chainId]?.rpcUrl;\n }\n\n return (options as EvmSchemeConfig).rpcUrl;\n}\n\n/**\n * Resolve RPC capabilities for extensions, backfilling from a public RPC client when the signer lacks them.\n *\n * @param network - The CAIP-2 network identifier\n * @param signer - The client EVM signer\n * @param options - Optional EVM scheme options for RPC URL resolution\n * @returns Extension RPC capabilities (readContract, signTransaction, etc.)\n */\nexport function resolveExtensionRpcCapabilities(\n network: string,\n signer: ClientEvmSigner,\n options?: EvmSchemeOptions,\n): ExtensionRpcCapabilities {\n const capabilities: ExtensionRpcCapabilities = {\n signTransaction: signer.signTransaction,\n readContract: signer.readContract,\n getTransactionCount: signer.getTransactionCount,\n estimateFeesPerGas: signer.estimateFeesPerGas,\n };\n\n const needsRpcBackfill =\n !capabilities.readContract ||\n !capabilities.getTransactionCount ||\n !capabilities.estimateFeesPerGas;\n if (!needsRpcBackfill) {\n return capabilities;\n }\n\n const rpcUrl = resolveRpcUrl(network, options);\n if (!rpcUrl) {\n return capabilities;\n }\n const rpcClient = getRpcClient(rpcUrl);\n if (!capabilities.readContract) {\n capabilities.readContract = args => rpcClient.readContract(args as never) as Promise;\n }\n if (!capabilities.getTransactionCount) {\n capabilities.getTransactionCount = async args =>\n rpcClient.getTransactionCount({ address: args.address });\n }\n if (!capabilities.estimateFeesPerGas) {\n capabilities.estimateFeesPerGas = async () => rpcClient.estimateFeesPerGas();\n }\n\n return capabilities;\n}\n","import { PaymentRequirements, PaymentPayloadResult } from \"@x402/core/types\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport { createNonce, getEvmChainId } from \"../../utils\";\n\n/**\n * Creates an EIP-3009 (transferWithAuthorization) payload.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createEIP3009Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise {\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEIP3009Payload[\"authorization\"] = {\n from: signer.address,\n to: getAddress(paymentRequirements.payTo),\n value: paymentRequirements.amount,\n validAfter: (now - 600).toString(),\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);\n\n const payload: ExactEIP3009Payload = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n payload,\n };\n}\n\n/**\n * Sign the EIP-3009 authorization using EIP-712.\n *\n * @param signer - The EVM signer\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signEIP3009Authorization(\n signer: ClientEvmSigner,\n authorization: ExactEIP3009Payload[\"authorization\"],\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n}\n","import {\n SchemeNetworkClient,\n PaymentRequirements,\n PaymentPayloadResult,\n PaymentPayloadContext,\n} from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { AssetTransferMethod } from \"../../types\";\nimport { createEIP3009Payload } from \"./eip3009\";\nimport { createPermit2Payload } from \"./permit2\";\nimport {\n trySignEip2612PermitExtension,\n trySignErc20ApprovalExtension,\n} from \"../../shared/extensions\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\n\n/**\n * EVM client implementation for the Exact payment scheme.\n * Supports both EIP-3009 (transferWithAuthorization) and Permit2 flows.\n *\n * Routes to the appropriate authorization method based on\n * `requirements.extra.assetTransferMethod`. Defaults to EIP-3009\n * for backward compatibility with older facilitators.\n *\n * When the server advertises `eip2612GasSponsoring` and the asset transfer\n * method is `permit2`, the scheme automatically signs an EIP-2612 permit\n * if the user lacks Permit2 approval. This requires `readContract` on the signer.\n */\nexport class ExactEvmScheme implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClient instance.\n *\n * @param signer - The EVM signer for client operations.\n * Base flow only requires `address` + `signTypedData`.\n * Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally\n * requires optional capabilities like `readContract` and tx signing helpers.\n * @param options - Optional RPC configuration used to backfill extension capabilities.\n */\n constructor(\n private readonly signer: ClientEvmSigner,\n private readonly options?: ExactEvmSchemeOptions,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.\n *\n * For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the\n * signer supports `readContract`, automatically signs an EIP-2612 permit\n * when Permit2 allowance is insufficient.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @param context - Optional context with server-declared extensions\n * @returns Promise resolving to a payment payload result (with optional extensions)\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n context?: PaymentPayloadContext,\n ): Promise {\n const assetTransferMethod =\n (paymentRequirements.extra?.assetTransferMethod as AssetTransferMethod) ?? \"eip3009\";\n\n if (assetTransferMethod === \"permit2\") {\n const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);\n\n const eip2612Extensions = await trySignEip2612PermitExtension(\n this.signer,\n this.options,\n paymentRequirements,\n result,\n context,\n );\n\n if (eip2612Extensions) {\n return {\n ...result,\n extensions: eip2612Extensions,\n };\n }\n\n const erc20Extensions = await trySignErc20ApprovalExtension(\n this.signer,\n this.options,\n paymentRequirements,\n context,\n );\n if (erc20Extensions) {\n return {\n ...result,\n extensions: erc20Extensions,\n };\n }\n\n return result;\n }\n\n return createEIP3009Payload(this.signer, x402Version, paymentRequirements);\n }\n}\n","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@x402/core/client\";\nimport { Network } from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\nimport { ExactEvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Client\n */\nexport interface EvmClientConfig {\n /**\n * The EVM signer to use for creating payment payloads\n */\n signer: ClientEvmSigner;\n\n /**\n * Optional payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional Exact EVM client scheme options.\n * Supports either a single config ({ rpcUrl }) or per-chain configs\n * keyed by EVM chain ID ({ 8453: { rpcUrl: \"...\" } }).\n */\n schemeOptions?: ExactEvmSchemeOptions;\n\n /**\n * Optional specific networks to register.\n * If not provided, registers wildcard support (eip155:*).\n */\n networks?: Network[];\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Client instance.\n *\n * This function registers:\n * - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for EVM client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@x402/evm/exact/client/register\";\n * import { x402Client } from \"@x402/core/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n * registerExactEvmScheme(client, { signer: account });\n * ```\n */\nexport function registerExactEvmScheme(client: x402Client, config: EvmClientConfig): x402Client {\n const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);\n\n // Register V2 scheme\n // EIP-2612 gas sponsoring is handled internally by the scheme when the\n // server advertises support - no separate extension registration needed.\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach(network => {\n client.register(network, evmScheme);\n });\n } else {\n // Register wildcard for all EVM chains\n client.register(\"eip155:*\", evmScheme);\n }\n\n // Register all V1 networks\n NETWORKS.forEach(network => {\n client.registerV1(network as Network, new ExactEvmSchemeV1(config.signer));\n });\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * ClientEvmSigner - Used by x402 clients to sign payment authorizations.\n *\n * Typically a viem WalletClient extended with publicActions:\n * ```typescript\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: baseSepolia,\n * transport: http(),\n * }).extend(publicActions);\n * ```\n *\n * Or composed via `toClientEvmSigner(account, publicClient)`.\n */\nexport type ClientEvmSigner = {\n readonly address: `0x${string}`;\n signTypedData(message: {\n domain: Record;\n types: Record;\n primaryType: string;\n message: Record;\n }): Promise<`0x${string}`>;\n /**\n * Optional on-chain reads.\n * Required only for extension enrichment (EIP-2612 / ERC-20 approval).\n */\n readContract?(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise;\n /**\n * Optional: Signs a raw EIP-1559 transaction without broadcasting.\n * Required for ERC-20 approval gas sponsoring when the token lacks EIP-2612.\n */\n signTransaction?(args: {\n to: `0x${string}`;\n data: `0x${string}`;\n nonce: number;\n gas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n chainId: number;\n }): Promise<`0x${string}`>;\n /**\n * Optional: Gets the current transaction count (nonce) for an address.\n * Required for ERC-20 approval gas sponsoring.\n */\n getTransactionCount?(args: { address: `0x${string}` }): Promise;\n /**\n * Optional: Estimates current gas fees per gas.\n * Required for ERC-20 approval gas sponsoring.\n */\n estimateFeesPerGas?(): Promise<{ maxFeePerGas: bigint; maxPriorityFeePerGas: bigint }>;\n};\n\n/**\n * FacilitatorEvmSigner - Used by x402 facilitators to verify and settle payments\n * This is typically a viem PublicClient + WalletClient combination that can\n * read contract state, verify signatures, write transactions, and wait for receipts\n *\n * Supports multiple addresses for load balancing, key rotation, and high availability\n */\nexport type FacilitatorEvmSigner = {\n /**\n * Get all addresses this facilitator can use for signing\n * Enables dynamic address selection for load balancing and key rotation\n */\n getAddresses(): readonly `0x${string}`[];\n\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise;\n verifyTypedData(args: {\n address: `0x${string}`;\n domain: Record;\n types: Record;\n primaryType: string;\n message: Record;\n signature: `0x${string}`;\n }): Promise;\n writeContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n /** Optional gas limit. When provided, skips eth_estimateGas simulation. */\n gas?: bigint;\n }): Promise<`0x${string}`>;\n sendTransaction(args: { to: `0x${string}`; data: `0x${string}` }): Promise<`0x${string}`>;\n waitForTransactionReceipt(args: { hash: `0x${string}` }): Promise<{ status: string }>;\n getCode(args: { address: `0x${string}` }): Promise<`0x${string}` | undefined>;\n};\n\n/**\n * Composes a ClientEvmSigner from a local account and a public client.\n *\n * Use this when your signer (e.g., `privateKeyToAccount`) doesn't have\n * `readContract`. The `publicClient` provides the on-chain read capability.\n *\n * Alternatively, use a WalletClient extended with publicActions directly:\n * ```typescript\n * const signer = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: baseSepolia,\n * transport: http(),\n * }).extend(publicActions);\n * ```\n *\n * @param signer - A signer with `address` and `signTypedData` (and optionally `readContract`)\n * @param publicClient - A client with optional read/nonce/fee helpers\n * @param publicClient.readContract - The readContract method from the public client\n * @param publicClient.getTransactionCount - Optional getTransactionCount for ERC-20 approval\n * @param publicClient.estimateFeesPerGas - Optional estimateFeesPerGas for ERC-20 approval\n * @returns A ClientEvmSigner with any available optional capabilities\n *\n * @example\n * ```typescript\n * const account = privateKeyToAccount(\"0x...\");\n * const publicClient = createPublicClient({ chain: baseSepolia, transport: http() });\n * const signer = toClientEvmSigner(account, publicClient);\n * ```\n */\nexport function toClientEvmSigner(\n signer: Omit & {\n readContract?: ClientEvmSigner[\"readContract\"];\n },\n publicClient?: {\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise;\n getTransactionCount?(args: { address: `0x${string}` }): Promise;\n estimateFeesPerGas?(): Promise<{ maxFeePerGas: bigint; maxPriorityFeePerGas: bigint }>;\n },\n): ClientEvmSigner {\n const readContract = signer.readContract ?? publicClient?.readContract.bind(publicClient);\n\n const result: ClientEvmSigner = {\n address: signer.address,\n signTypedData: msg => signer.signTypedData(msg),\n };\n\n if (readContract) {\n result.readContract = readContract;\n }\n\n // Forward optional capabilities from signer or publicClient\n const signTransaction = signer.signTransaction;\n if (signTransaction) {\n result.signTransaction = args => signTransaction(args);\n }\n\n const getTransactionCount =\n signer.getTransactionCount ?? publicClient?.getTransactionCount?.bind(publicClient);\n if (getTransactionCount) {\n result.getTransactionCount = args => getTransactionCount(args);\n }\n\n const estimateFeesPerGas =\n signer.estimateFeesPerGas ?? publicClient?.estimateFeesPerGas?.bind(publicClient);\n if (estimateFeesPerGas) {\n result.estimateFeesPerGas = () => estimateFeesPerGas();\n }\n\n return result;\n}\n\n/**\n * Converts a viem client with single address to a FacilitatorEvmSigner\n * Wraps the single address in a getAddresses() function for compatibility\n *\n * @param client - The client to convert (must have 'address' property)\n * @returns FacilitatorEvmSigner with getAddresses() support\n */\nexport function toFacilitatorEvmSigner(\n client: Omit & { address: `0x${string}` },\n): FacilitatorEvmSigner {\n return {\n ...client,\n getAddresses: () => [client.address],\n };\n}\n","/**\n * Rule-Based Classifier (v2 — Weighted Scoring)\n *\n * Scores a request across 14 weighted dimensions and maps the aggregate\n * score to a tier using configurable boundaries. Confidence is calibrated\n * via sigmoid — low confidence triggers the fallback classifier.\n *\n * Handles 70-80% of requests in < 1ms with zero cost.\n */\n\nimport type { Tier, ScoringResult, ScoringConfig } from \"./types.js\";\n\ntype DimensionScore = { name: string; score: number; signal: string | null };\n\n// ─── Dimension Scorers ───\n// Each returns a score in [-1, 1] and an optional signal string.\n\nfunction scoreTokenCount(\n estimatedTokens: number,\n thresholds: { simple: number; complex: number },\n): DimensionScore {\n if (estimatedTokens < thresholds.simple) {\n return { name: \"tokenCount\", score: -1.0, signal: `short (${estimatedTokens} tokens)` };\n }\n if (estimatedTokens > thresholds.complex) {\n return { name: \"tokenCount\", score: 1.0, signal: `long (${estimatedTokens} tokens)` };\n }\n return { name: \"tokenCount\", score: 0, signal: null };\n}\n\nfunction scoreKeywordMatch(\n text: string,\n keywords: string[],\n name: string,\n signalLabel: string,\n thresholds: { low: number; high: number },\n scores: { none: number; low: number; high: number },\n): DimensionScore {\n const matches = keywords.filter((kw) => text.includes(kw.toLowerCase()));\n if (matches.length >= thresholds.high) {\n return {\n name,\n score: scores.high,\n signal: `${signalLabel} (${matches.slice(0, 3).join(\", \")})`,\n };\n }\n if (matches.length >= thresholds.low) {\n return {\n name,\n score: scores.low,\n signal: `${signalLabel} (${matches.slice(0, 3).join(\", \")})`,\n };\n }\n return { name, score: scores.none, signal: null };\n}\n\nfunction scoreMultiStep(text: string): DimensionScore {\n const patterns = [/first.*then/i, /step \\d/i, /\\d\\.\\s/];\n const hits = patterns.filter((p) => p.test(text));\n if (hits.length > 0) {\n return { name: \"multiStepPatterns\", score: 0.5, signal: \"multi-step\" };\n }\n return { name: \"multiStepPatterns\", score: 0, signal: null };\n}\n\nfunction scoreQuestionComplexity(prompt: string): DimensionScore {\n const count = (prompt.match(/\\?/g) || []).length;\n if (count > 3) {\n return { name: \"questionComplexity\", score: 0.5, signal: `${count} questions` };\n }\n return { name: \"questionComplexity\", score: 0, signal: null };\n}\n\n/**\n * Score agentic task indicators.\n * Returns agenticScore (0-1) based on keyword matches:\n * - 4+ matches = 1.0 (high agentic)\n * - 3 matches = 0.6 (moderate agentic, triggers auto-agentic mode)\n * - 1-2 matches = 0.2 (low agentic)\n *\n * Thresholds raised because common keywords were pruned from the list.\n */\nfunction scoreAgenticTask(\n text: string,\n keywords: string[],\n): { dimensionScore: DimensionScore; agenticScore: number } {\n let matchCount = 0;\n const signals: string[] = [];\n\n for (const keyword of keywords) {\n if (text.includes(keyword.toLowerCase())) {\n matchCount++;\n if (signals.length < 3) {\n signals.push(keyword);\n }\n }\n }\n\n // Threshold-based scoring (raised thresholds after keyword pruning)\n if (matchCount >= 4) {\n return {\n dimensionScore: {\n name: \"agenticTask\",\n score: 1.0,\n signal: `agentic (${signals.join(\", \")})`,\n },\n agenticScore: 1.0,\n };\n } else if (matchCount >= 3) {\n return {\n dimensionScore: {\n name: \"agenticTask\",\n score: 0.6,\n signal: `agentic (${signals.join(\", \")})`,\n },\n agenticScore: 0.6,\n };\n } else if (matchCount >= 1) {\n return {\n dimensionScore: {\n name: \"agenticTask\",\n score: 0.2,\n signal: `agentic-light (${signals.join(\", \")})`,\n },\n agenticScore: 0.2,\n };\n }\n\n return {\n dimensionScore: { name: \"agenticTask\", score: 0, signal: null },\n agenticScore: 0,\n };\n}\n\n// ─── Main Classifier ───\n\nexport function classifyByRules(\n prompt: string,\n systemPrompt: string | undefined,\n estimatedTokens: number,\n config: ScoringConfig,\n): ScoringResult {\n // Score against user prompt only — system prompts contain boilerplate keywords\n // (tool definitions, skill descriptions, behavioral rules) that dominate scoring\n // and make every request score identically. See GitHub issue #50.\n const userText = prompt.toLowerCase();\n\n // Score all 14 dimensions against user text only\n const dimensions: DimensionScore[] = [\n // Token count uses total estimated tokens (system + user) — context size matters for model selection\n scoreTokenCount(estimatedTokens, config.tokenCountThresholds),\n scoreKeywordMatch(\n userText,\n config.codeKeywords,\n \"codePresence\",\n \"code\",\n { low: 1, high: 2 },\n { none: 0, low: 0.5, high: 1.0 },\n ),\n scoreKeywordMatch(\n userText,\n config.reasoningKeywords,\n \"reasoningMarkers\",\n \"reasoning\",\n { low: 1, high: 2 },\n { none: 0, low: 0.7, high: 1.0 },\n ),\n scoreKeywordMatch(\n userText,\n config.technicalKeywords,\n \"technicalTerms\",\n \"technical\",\n { low: 2, high: 4 },\n { none: 0, low: 0.5, high: 1.0 },\n ),\n scoreKeywordMatch(\n userText,\n config.creativeKeywords,\n \"creativeMarkers\",\n \"creative\",\n { low: 1, high: 2 },\n { none: 0, low: 0.5, high: 0.7 },\n ),\n scoreKeywordMatch(\n userText,\n config.simpleKeywords,\n \"simpleIndicators\",\n \"simple\",\n { low: 1, high: 2 },\n { none: 0, low: -1.0, high: -1.0 },\n ),\n scoreMultiStep(userText),\n scoreQuestionComplexity(prompt),\n\n // 6 new dimensions\n scoreKeywordMatch(\n userText,\n config.imperativeVerbs,\n \"imperativeVerbs\",\n \"imperative\",\n { low: 1, high: 2 },\n { none: 0, low: 0.3, high: 0.5 },\n ),\n scoreKeywordMatch(\n userText,\n config.constraintIndicators,\n \"constraintCount\",\n \"constraints\",\n { low: 1, high: 3 },\n { none: 0, low: 0.3, high: 0.7 },\n ),\n scoreKeywordMatch(\n userText,\n config.outputFormatKeywords,\n \"outputFormat\",\n \"format\",\n { low: 1, high: 2 },\n { none: 0, low: 0.4, high: 0.7 },\n ),\n scoreKeywordMatch(\n userText,\n config.referenceKeywords,\n \"referenceComplexity\",\n \"references\",\n { low: 1, high: 2 },\n { none: 0, low: 0.3, high: 0.5 },\n ),\n scoreKeywordMatch(\n userText,\n config.negationKeywords,\n \"negationComplexity\",\n \"negation\",\n { low: 2, high: 3 },\n { none: 0, low: 0.3, high: 0.5 },\n ),\n scoreKeywordMatch(\n userText,\n config.domainSpecificKeywords,\n \"domainSpecificity\",\n \"domain-specific\",\n { low: 1, high: 2 },\n { none: 0, low: 0.5, high: 0.8 },\n ),\n ];\n\n // Score agentic task indicators — user prompt only\n // System prompt describes assistant behavior, not user's intent.\n // e.g. a coding assistant system prompt with \"edit files\" / \"fix bugs\" should NOT\n // force every request into agentic mode.\n const agenticResult = scoreAgenticTask(userText, config.agenticTaskKeywords);\n dimensions.push(agenticResult.dimensionScore);\n const agenticScore = agenticResult.agenticScore;\n\n // Collect signals\n const signals = dimensions.filter((d) => d.signal !== null).map((d) => d.signal!);\n\n // Compute weighted score\n const weights = config.dimensionWeights;\n let weightedScore = 0;\n for (const d of dimensions) {\n const w = weights[d.name] ?? 0;\n weightedScore += d.score * w;\n }\n\n // Count reasoning markers for override — only check USER prompt, not system prompt\n // This prevents system prompts with \"step by step\" from triggering REASONING for simple queries\n const reasoningMatches = config.reasoningKeywords.filter((kw) =>\n userText.includes(kw.toLowerCase()),\n );\n\n // Direct reasoning override: 2+ reasoning markers = high confidence REASONING\n if (reasoningMatches.length >= 2) {\n const confidence = calibrateConfidence(\n Math.max(weightedScore, 0.3), // ensure positive for confidence calc\n config.confidenceSteepness,\n );\n return {\n score: weightedScore,\n tier: \"REASONING\",\n confidence: Math.max(confidence, 0.85),\n signals,\n agenticScore,\n dimensions,\n };\n }\n\n // Map weighted score to tier using boundaries\n const { simpleMedium, mediumComplex, complexReasoning } = config.tierBoundaries;\n let tier: Tier;\n let distanceFromBoundary: number;\n\n if (weightedScore < simpleMedium) {\n tier = \"SIMPLE\";\n distanceFromBoundary = simpleMedium - weightedScore;\n } else if (weightedScore < mediumComplex) {\n tier = \"MEDIUM\";\n distanceFromBoundary = Math.min(weightedScore - simpleMedium, mediumComplex - weightedScore);\n } else if (weightedScore < complexReasoning) {\n tier = \"COMPLEX\";\n distanceFromBoundary = Math.min(\n weightedScore - mediumComplex,\n complexReasoning - weightedScore,\n );\n } else {\n tier = \"REASONING\";\n distanceFromBoundary = weightedScore - complexReasoning;\n }\n\n // Calibrate confidence via sigmoid of distance from nearest boundary\n const confidence = calibrateConfidence(distanceFromBoundary, config.confidenceSteepness);\n\n // If confidence is below threshold → ambiguous\n if (confidence < config.confidenceThreshold) {\n return { score: weightedScore, tier: null, confidence, signals, agenticScore, dimensions };\n }\n\n return { score: weightedScore, tier, confidence, signals, agenticScore, dimensions };\n}\n\n/**\n * Sigmoid confidence calibration.\n * Maps distance from tier boundary to [0.5, 1.0] confidence range.\n */\nfunction calibrateConfidence(distance: number, steepness: number): number {\n return 1 / (1 + Math.exp(-steepness * distance));\n}\n","/**\n * Tier → Model Selection\n *\n * Maps a classification tier to the cheapest capable model.\n * Builds RoutingDecision metadata with cost estimates and savings.\n */\n\nimport type { Tier, TierConfig, RoutingDecision } from \"./types.js\";\n\nexport type ModelPricing = {\n inputPrice: number; // per 1M tokens\n outputPrice: number; // per 1M tokens\n /** Active promo flat price per request (overrides token-based pricing when set) */\n flatPrice?: number;\n};\n\nconst BASELINE_MODEL_ID = \"anthropic/claude-opus-4.7\";\n\n// Hardcoded fallback: Claude Opus 4.7 pricing (per 1M tokens)\n// Used when baseline model not found in dynamic pricing map\nconst BASELINE_INPUT_PRICE = 5.0;\nconst BASELINE_OUTPUT_PRICE = 25.0;\n\n/**\n * Select the primary model for a tier and build the RoutingDecision.\n */\nexport function selectModel(\n tier: Tier,\n confidence: number,\n method: \"rules\" | \"llm\",\n reasoning: string,\n tierConfigs: Record,\n modelPricing: Map,\n estimatedInputTokens: number,\n maxOutputTokens: number,\n routingProfile?: \"free\" | \"eco\" | \"auto\" | \"premium\",\n agenticScore?: number,\n): RoutingDecision {\n const tierConfig = tierConfigs[tier];\n const model = tierConfig.primary;\n const pricing = modelPricing.get(model);\n\n let costEstimate: number;\n if (pricing?.flatPrice !== undefined) {\n costEstimate = pricing.flatPrice;\n } else {\n const inputPrice = pricing?.inputPrice ?? 0;\n const outputPrice = pricing?.outputPrice ?? 0;\n costEstimate =\n (estimatedInputTokens / 1_000_000) * inputPrice + (maxOutputTokens / 1_000_000) * outputPrice;\n }\n\n // Baseline: what Claude Opus 4.5 would cost (the premium reference)\n const opusPricing = modelPricing.get(BASELINE_MODEL_ID);\n const opusInputPrice = opusPricing?.inputPrice ?? BASELINE_INPUT_PRICE;\n const opusOutputPrice = opusPricing?.outputPrice ?? BASELINE_OUTPUT_PRICE;\n const baselineInput = (estimatedInputTokens / 1_000_000) * opusInputPrice;\n const baselineOutput = (maxOutputTokens / 1_000_000) * opusOutputPrice;\n const baselineCost = baselineInput + baselineOutput;\n\n // Premium profile doesn't calculate savings (it's about quality, not cost)\n const savings =\n routingProfile === \"premium\"\n ? 0\n : baselineCost > 0\n ? Math.max(0, (baselineCost - costEstimate) / baselineCost)\n : 0;\n\n return {\n model,\n tier,\n confidence,\n method,\n reasoning,\n costEstimate,\n baselineCost,\n savings,\n ...(agenticScore !== undefined && { agenticScore }),\n };\n}\n\n/**\n * Get the ordered fallback chain for a tier: [primary, ...fallbacks].\n */\nexport function getFallbackChain(tier: Tier, tierConfigs: Record): string[] {\n const config = tierConfigs[tier];\n return [config.primary, ...config.fallback];\n}\n\n/**\n * Calculate cost for a specific model (used when fallback model is used).\n * Returns updated cost fields for RoutingDecision.\n */\n// Server-side margin applied to all x402 payments (must match blockrun server's MARGIN_PERCENT)\nconst SERVER_MARGIN_PERCENT = 5;\n// Minimum payment enforced by CDP Facilitator (must match blockrun server's MIN_PAYMENT_USD)\nconst MIN_PAYMENT_USD = 0.001;\n\nexport function calculateModelCost(\n model: string,\n modelPricing: Map,\n estimatedInputTokens: number,\n maxOutputTokens: number,\n routingProfile?: \"free\" | \"eco\" | \"auto\" | \"premium\",\n): { costEstimate: number; baselineCost: number; savings: number } {\n const pricing = modelPricing.get(model);\n\n let costEstimate: number;\n if (pricing?.flatPrice !== undefined) {\n // Active promo: fixed cost per request\n costEstimate = Math.max(pricing.flatPrice * (1 + SERVER_MARGIN_PERCENT / 100), MIN_PAYMENT_USD);\n } else {\n // Defensive: guard against undefined price fields (not just undefined pricing)\n const inputPrice = pricing?.inputPrice ?? 0;\n const outputPrice = pricing?.outputPrice ?? 0;\n const inputCost = (estimatedInputTokens / 1_000_000) * inputPrice;\n const outputCost = (maxOutputTokens / 1_000_000) * outputPrice;\n // Include server margin + minimum payment to match actual x402 charge\n costEstimate = Math.max(\n (inputCost + outputCost) * (1 + SERVER_MARGIN_PERCENT / 100),\n MIN_PAYMENT_USD,\n );\n }\n\n // Baseline: what Claude Opus 4.5 would cost (the premium reference)\n const opusPricing = modelPricing.get(BASELINE_MODEL_ID);\n const opusInputPrice = opusPricing?.inputPrice ?? BASELINE_INPUT_PRICE;\n const opusOutputPrice = opusPricing?.outputPrice ?? BASELINE_OUTPUT_PRICE;\n const baselineInput = (estimatedInputTokens / 1_000_000) * opusInputPrice;\n const baselineOutput = (maxOutputTokens / 1_000_000) * opusOutputPrice;\n const baselineCost = baselineInput + baselineOutput;\n\n // Premium profile doesn't calculate savings (it's about quality, not cost)\n const savings =\n routingProfile === \"premium\"\n ? 0\n : baselineCost > 0\n ? Math.max(0, (baselineCost - costEstimate) / baselineCost)\n : 0;\n\n return { costEstimate, baselineCost, savings };\n}\n\n/**\n * Filter a model list to only those that support tool calling.\n * When hasTools is false, returns the list unchanged.\n * When all models lack tool calling support, returns the full list as a fallback\n * (better to let the API error than produce an empty chain).\n */\nexport function filterByToolCalling(\n models: string[],\n hasTools: boolean,\n supportsToolCalling: (modelId: string) => boolean,\n): string[] {\n if (!hasTools) return models;\n const filtered = models.filter(supportsToolCalling);\n return filtered.length > 0 ? filtered : models;\n}\n\n/**\n * Filter a model list to only those that support vision (image inputs).\n * When hasVision is false, returns the list unchanged.\n * When all models lack vision support, returns the full list as a fallback\n * (better to let the API error than produce an empty chain).\n */\nexport function filterByVision(\n models: string[],\n hasVision: boolean,\n supportsVision: (modelId: string) => boolean,\n): string[] {\n if (!hasVision) return models;\n const filtered = models.filter(supportsVision);\n return filtered.length > 0 ? filtered : models;\n}\n\n/**\n * Filter a model list to remove user-excluded models.\n * When all models are excluded, returns the full list as a fallback\n * (same safety pattern as filterByToolCalling/filterByVision).\n */\nexport function filterByExcludeList(models: string[], excludeList: Set): string[] {\n if (excludeList.size === 0) return models;\n const filtered = models.filter((m) => !excludeList.has(m));\n return filtered.length > 0 ? filtered : models;\n}\n\n/**\n * Get the fallback chain filtered by context length.\n * Only returns models that can handle the estimated total context.\n *\n * @param tier - The tier to get fallback chain for\n * @param tierConfigs - Tier configurations\n * @param estimatedTotalTokens - Estimated total context (input + output)\n * @param getContextWindow - Function to get context window for a model ID\n * @returns Filtered list of models that can handle the context\n */\nexport function getFallbackChainFiltered(\n tier: Tier,\n tierConfigs: Record,\n estimatedTotalTokens: number,\n getContextWindow: (modelId: string) => number | undefined,\n): string[] {\n const fullChain = getFallbackChain(tier, tierConfigs);\n\n // Filter to models that can handle the context\n const filtered = fullChain.filter((modelId) => {\n const contextWindow = getContextWindow(modelId);\n if (contextWindow === undefined) {\n // Unknown model - include it (let API reject if needed)\n return true;\n }\n // Add 10% buffer for safety\n return contextWindow >= estimatedTotalTokens * 1.1;\n });\n\n // If all models filtered out, return the original chain\n // (let the API error out - better than no options)\n if (filtered.length === 0) {\n return fullChain;\n }\n\n return filtered;\n}\n","/**\n * Router Strategy Registry\n *\n * Pluggable strategy system for request routing.\n * Default: RulesStrategy — identical to the original inline route() logic, <1ms.\n */\n\nimport type {\n Tier,\n TierConfig,\n Promotion,\n RoutingDecision,\n RouterStrategy,\n RouterOptions,\n} from \"./types.js\";\nimport { classifyByRules } from \"./rules.js\";\nimport { selectModel } from \"./selector.js\";\n\n/**\n * Apply active time-windowed promotions to tier configs.\n * Returns a new tierConfigs object with promotion overrides merged in.\n * Expired or not-yet-active promotions are ignored.\n */\nfunction applyPromotions(\n tierConfigs: Record,\n promotions: Promotion[] | undefined,\n profile: \"auto\" | \"eco\" | \"premium\" | \"agentic\",\n now: Date = new Date(),\n): Record {\n if (!promotions || promotions.length === 0) return tierConfigs;\n\n let result = tierConfigs;\n for (const promo of promotions) {\n // Check time window\n const start = new Date(promo.startDate);\n const end = new Date(promo.endDate);\n if (now < start || now >= end) continue;\n\n // Check profile filter\n if (promo.profiles && !promo.profiles.includes(profile)) continue;\n\n // Shallow-clone on first mutation\n if (result === tierConfigs) {\n result = { ...tierConfigs };\n for (const t of Object.keys(result) as Tier[]) {\n result[t] = { ...result[t] };\n }\n }\n\n // Merge overrides\n for (const [tier, override] of Object.entries(promo.tierOverrides) as [\n Tier,\n Partial,\n ][]) {\n if (!result[tier]) continue;\n if (override.primary) result[tier].primary = override.primary;\n if (override.fallback) result[tier].fallback = override.fallback;\n }\n }\n\n return result;\n}\n\n/**\n * Rules-based routing strategy.\n * Extracted from the original route() in index.ts — logic is identical.\n * Attaches tierConfigs and profile to the decision for downstream use.\n */\nexport class RulesStrategy implements RouterStrategy {\n readonly name = \"rules\";\n\n route(\n prompt: string,\n systemPrompt: string | undefined,\n maxOutputTokens: number,\n options: RouterOptions,\n ): RoutingDecision {\n const { config, modelPricing } = options;\n\n // Estimate input tokens (~4 chars per token)\n const fullText = `${systemPrompt ?? \"\"} ${prompt}`;\n const estimatedTokens = Math.ceil(fullText.length / 4);\n\n // --- Rule-based classification (runs first to get agenticScore) ---\n const ruleResult = classifyByRules(prompt, systemPrompt, estimatedTokens, config.scoring);\n\n // --- Select tier configs based on routing profile ---\n const { routingProfile } = options;\n let tierConfigs: Record;\n let profileSuffix: string;\n let profile: RoutingDecision[\"profile\"];\n\n if (routingProfile === \"eco\") {\n // `ecoTiers: null` explicitly disables the special eco tier set while\n // keeping eco routing semantics. Fall back to regular tiers instead of\n // dropping into auto routing (which could select agentic tiers).\n tierConfigs = config.ecoTiers ?? config.tiers;\n profileSuffix = config.ecoTiers ? \" | eco\" : \" | eco (default tiers)\";\n profile = \"eco\";\n } else if (routingProfile === \"premium\") {\n // `premiumTiers: null` disables the premium-specific tier set but the\n // request is still a premium-profile request, so use regular tiers while\n // preserving premium metadata/cost semantics.\n tierConfigs = config.premiumTiers ?? config.tiers;\n profileSuffix = config.premiumTiers ? \" | premium\" : \" | premium (default tiers)\";\n profile = \"premium\";\n } else {\n // Auto profile (or undefined): intelligent routing with agentic detection.\n //\n // `agenticMode` semantics:\n // - `true` → force agentic tiers (ignore heuristics)\n // - `false` → disable agentic tiers entirely (even if tools are present)\n // - `undefined` → auto-detect via heuristics (tools present OR high agenticScore)\n const agenticScore = ruleResult.agenticScore ?? 0;\n const isAutoAgentic = agenticScore >= 0.5;\n const agenticModeSetting = config.overrides.agenticMode;\n const hasToolsInRequest = options.hasTools ?? false;\n let useAgenticTiers: boolean;\n if (agenticModeSetting === false) {\n // Explicitly disabled — never use agentic tiers\n useAgenticTiers = false;\n } else if (agenticModeSetting === true) {\n // Explicitly enabled — use agentic tiers if available\n useAgenticTiers = config.agenticTiers != null;\n } else {\n // Auto-detect\n useAgenticTiers = (hasToolsInRequest || isAutoAgentic) && config.agenticTiers != null;\n }\n tierConfigs = useAgenticTiers ? config.agenticTiers! : config.tiers;\n profileSuffix = useAgenticTiers ? ` | agentic${hasToolsInRequest ? \" (tools)\" : \"\"}` : \"\";\n profile = useAgenticTiers ? \"agentic\" : \"auto\";\n }\n\n // Apply time-windowed promotions\n tierConfigs = applyPromotions(tierConfigs, config.promotions, profile!, options.now);\n\n const agenticScoreValue = ruleResult.agenticScore;\n\n // --- Override: large context → force COMPLEX ---\n if (estimatedTokens > config.overrides.maxTokensForceComplex) {\n const decision = selectModel(\n \"COMPLEX\",\n 0.95,\n \"rules\",\n `Input exceeds ${config.overrides.maxTokensForceComplex} tokens${profileSuffix}`,\n tierConfigs,\n modelPricing,\n estimatedTokens,\n maxOutputTokens,\n routingProfile,\n agenticScoreValue,\n );\n return { ...decision, tierConfigs, profile };\n }\n\n // Structured output detection\n const hasStructuredOutput = systemPrompt ? /json|structured|schema/i.test(systemPrompt) : false;\n\n let tier: Tier;\n let confidence: number;\n const method: \"rules\" | \"llm\" = \"rules\";\n let reasoning = `score=${ruleResult.score.toFixed(2)} | ${ruleResult.signals.join(\", \")}`;\n\n if (ruleResult.tier !== null) {\n tier = ruleResult.tier;\n confidence = ruleResult.confidence;\n } else {\n // Ambiguous — default to configurable tier (no external API call)\n tier = config.overrides.ambiguousDefaultTier;\n confidence = 0.5;\n reasoning += ` | ambiguous -> default: ${tier}`;\n }\n\n // Apply structured output minimum tier\n if (hasStructuredOutput) {\n const tierRank: Record = { SIMPLE: 0, MEDIUM: 1, COMPLEX: 2, REASONING: 3 };\n const minTier = config.overrides.structuredOutputMinTier;\n if (tierRank[tier] < tierRank[minTier]) {\n reasoning += ` | upgraded to ${minTier} (structured output)`;\n tier = minTier;\n }\n }\n\n // Add routing profile suffix to reasoning\n reasoning += profileSuffix;\n\n const decision = selectModel(\n tier,\n confidence,\n method,\n reasoning,\n tierConfigs,\n modelPricing,\n estimatedTokens,\n maxOutputTokens,\n routingProfile,\n agenticScoreValue,\n );\n return { ...decision, tierConfigs, profile };\n }\n}\n\n// --- Strategy Registry ---\n\nconst registry = new Map();\nregistry.set(\"rules\", new RulesStrategy());\n\nexport function getStrategy(name: string): RouterStrategy {\n const strategy = registry.get(name);\n if (!strategy) {\n throw new Error(`Unknown routing strategy: ${name}`);\n }\n return strategy;\n}\n\nexport function registerStrategy(strategy: RouterStrategy): void {\n registry.set(strategy.name, strategy);\n}\n","/**\n * Default Routing Config\n *\n * All routing parameters as a TypeScript constant.\n * Operators override via openclaw.yaml plugin config.\n *\n * Scoring uses 14 weighted dimensions with sigmoid confidence calibration.\n */\n\nimport type { RoutingConfig } from \"./types.js\";\n\nexport const DEFAULT_ROUTING_CONFIG: RoutingConfig = {\n version: \"2.0\",\n\n classifier: {\n llmModel: \"google/gemini-2.5-flash\",\n llmMaxTokens: 10,\n llmTemperature: 0,\n promptTruncationChars: 500,\n cacheTtlMs: 3_600_000, // 1 hour\n },\n\n scoring: {\n tokenCountThresholds: { simple: 50, complex: 500 },\n\n // Multilingual keywords: EN + ZH + JA + RU + DE + ES + PT + KO + AR\n codeKeywords: [\n // English\n \"function\",\n \"class\",\n \"import\",\n \"def\",\n \"SELECT\",\n \"async\",\n \"await\",\n \"const\",\n \"let\",\n \"var\",\n \"return\",\n \"```\",\n // Chinese\n \"函数\",\n \"类\",\n \"导入\",\n \"定义\",\n \"查询\",\n \"异步\",\n \"等待\",\n \"常量\",\n \"变量\",\n \"返回\",\n // Japanese\n \"関数\",\n \"クラス\",\n \"インポート\",\n \"非同期\",\n \"定数\",\n \"変数\",\n // Russian\n \"функция\",\n \"класс\",\n \"импорт\",\n \"определ\",\n \"запрос\",\n \"асинхронный\",\n \"ожидать\",\n \"константа\",\n \"переменная\",\n \"вернуть\",\n // German\n \"funktion\",\n \"klasse\",\n \"importieren\",\n \"definieren\",\n \"abfrage\",\n \"asynchron\",\n \"erwarten\",\n \"konstante\",\n \"variable\",\n \"zurückgeben\",\n // Spanish\n \"función\",\n \"clase\",\n \"importar\",\n \"definir\",\n \"consulta\",\n \"asíncrono\",\n \"esperar\",\n \"constante\",\n \"variable\",\n \"retornar\",\n // Portuguese\n \"função\",\n \"classe\",\n \"importar\",\n \"definir\",\n \"consulta\",\n \"assíncrono\",\n \"aguardar\",\n \"constante\",\n \"variável\",\n \"retornar\",\n // Korean\n \"함수\",\n \"클래스\",\n \"가져오기\",\n \"정의\",\n \"쿼리\",\n \"비동기\",\n \"대기\",\n \"상수\",\n \"변수\",\n \"반환\",\n // Arabic\n \"دالة\",\n \"فئة\",\n \"استيراد\",\n \"تعريف\",\n \"استعلام\",\n \"غير متزامن\",\n \"انتظار\",\n \"ثابت\",\n \"متغير\",\n \"إرجاع\",\n ],\n reasoningKeywords: [\n // English\n \"prove\",\n \"theorem\",\n \"derive\",\n \"step by step\",\n \"chain of thought\",\n \"formally\",\n \"mathematical\",\n \"proof\",\n \"logically\",\n // Chinese\n \"证明\",\n \"定理\",\n \"推导\",\n \"逐步\",\n \"思维链\",\n \"形式化\",\n \"数学\",\n \"逻辑\",\n // Japanese\n \"証明\",\n \"定理\",\n \"導出\",\n \"ステップバイステップ\",\n \"論理的\",\n // Russian\n \"доказать\",\n \"докажи\",\n \"доказательств\",\n \"теорема\",\n \"вывести\",\n \"шаг за шагом\",\n \"пошагово\",\n \"поэтапно\",\n \"цепочка рассуждений\",\n \"рассуждени\",\n \"формально\",\n \"математически\",\n \"логически\",\n // German\n \"beweisen\",\n \"beweis\",\n \"theorem\",\n \"ableiten\",\n \"schritt für schritt\",\n \"gedankenkette\",\n \"formal\",\n \"mathematisch\",\n \"logisch\",\n // Spanish\n \"demostrar\",\n \"teorema\",\n \"derivar\",\n \"paso a paso\",\n \"cadena de pensamiento\",\n \"formalmente\",\n \"matemático\",\n \"prueba\",\n \"lógicamente\",\n // Portuguese\n \"provar\",\n \"teorema\",\n \"derivar\",\n \"passo a passo\",\n \"cadeia de pensamento\",\n \"formalmente\",\n \"matemático\",\n \"prova\",\n \"logicamente\",\n // Korean\n \"증명\",\n \"정리\",\n \"도출\",\n \"단계별\",\n \"사고의 연쇄\",\n \"형식적\",\n \"수학적\",\n \"논리적\",\n // Arabic\n \"إثبات\",\n \"نظرية\",\n \"اشتقاق\",\n \"خطوة بخطوة\",\n \"سلسلة التفكير\",\n \"رسمياً\",\n \"رياضي\",\n \"برهان\",\n \"منطقياً\",\n ],\n simpleKeywords: [\n // English\n \"what is\",\n \"define\",\n \"translate\",\n \"hello\",\n \"yes or no\",\n \"capital of\",\n \"how old\",\n \"who is\",\n \"when was\",\n // Chinese\n \"什么是\",\n \"定义\",\n \"翻译\",\n \"你好\",\n \"是否\",\n \"首都\",\n \"多大\",\n \"谁是\",\n \"何时\",\n // Japanese\n \"とは\",\n \"定義\",\n \"翻訳\",\n \"こんにちは\",\n \"はいかいいえ\",\n \"首都\",\n \"誰\",\n // Russian\n \"что такое\",\n \"определение\",\n \"перевести\",\n \"переведи\",\n \"привет\",\n \"да или нет\",\n \"столица\",\n \"сколько лет\",\n \"кто такой\",\n \"когда\",\n \"объясни\",\n // German\n \"was ist\",\n \"definiere\",\n \"übersetze\",\n \"hallo\",\n \"ja oder nein\",\n \"hauptstadt\",\n \"wie alt\",\n \"wer ist\",\n \"wann\",\n \"erkläre\",\n // Spanish\n \"qué es\",\n \"definir\",\n \"traducir\",\n \"hola\",\n \"sí o no\",\n \"capital de\",\n \"cuántos años\",\n \"quién es\",\n \"cuándo\",\n // Portuguese\n \"o que é\",\n \"definir\",\n \"traduzir\",\n \"olá\",\n \"sim ou não\",\n \"capital de\",\n \"quantos anos\",\n \"quem é\",\n \"quando\",\n // Korean\n \"무엇\",\n \"정의\",\n \"번역\",\n \"안녕하세요\",\n \"예 또는 아니오\",\n \"수도\",\n \"누구\",\n \"언제\",\n // Arabic\n \"ما هو\",\n \"تعريف\",\n \"ترجم\",\n \"مرحبا\",\n \"نعم أو لا\",\n \"عاصمة\",\n \"من هو\",\n \"متى\",\n ],\n technicalKeywords: [\n // English\n \"algorithm\",\n \"optimize\",\n \"architecture\",\n \"distributed\",\n \"kubernetes\",\n \"microservice\",\n \"database\",\n \"infrastructure\",\n // Chinese\n \"算法\",\n \"优化\",\n \"架构\",\n \"分布式\",\n \"微服务\",\n \"数据库\",\n \"基础设施\",\n // Japanese\n \"アルゴリズム\",\n \"最適化\",\n \"アーキテクチャ\",\n \"分散\",\n \"マイクロサービス\",\n \"データベース\",\n // Russian\n \"алгоритм\",\n \"оптимизировать\",\n \"оптимизаци\",\n \"оптимизируй\",\n \"архитектура\",\n \"распределённый\",\n \"микросервис\",\n \"база данных\",\n \"инфраструктура\",\n // German\n \"algorithmus\",\n \"optimieren\",\n \"architektur\",\n \"verteilt\",\n \"kubernetes\",\n \"mikroservice\",\n \"datenbank\",\n \"infrastruktur\",\n // Spanish\n \"algoritmo\",\n \"optimizar\",\n \"arquitectura\",\n \"distribuido\",\n \"microservicio\",\n \"base de datos\",\n \"infraestructura\",\n // Portuguese\n \"algoritmo\",\n \"otimizar\",\n \"arquitetura\",\n \"distribuído\",\n \"microsserviço\",\n \"banco de dados\",\n \"infraestrutura\",\n // Korean\n \"알고리즘\",\n \"최적화\",\n \"아키텍처\",\n \"분산\",\n \"마이크로서비스\",\n \"데이터베이스\",\n \"인프라\",\n // Arabic\n \"خوارزمية\",\n \"تحسين\",\n \"بنية\",\n \"موزع\",\n \"خدمة مصغرة\",\n \"قاعدة بيانات\",\n \"بنية تحتية\",\n ],\n creativeKeywords: [\n // English\n \"story\",\n \"poem\",\n \"compose\",\n \"brainstorm\",\n \"creative\",\n \"imagine\",\n \"write a\",\n // Chinese\n \"故事\",\n \"诗\",\n \"创作\",\n \"头脑风暴\",\n \"创意\",\n \"想象\",\n \"写一个\",\n // Japanese\n \"物語\",\n \"詩\",\n \"作曲\",\n \"ブレインストーム\",\n \"創造的\",\n \"想像\",\n // Russian\n \"история\",\n \"рассказ\",\n \"стихотворение\",\n \"сочинить\",\n \"сочини\",\n \"мозговой штурм\",\n \"творческий\",\n \"представить\",\n \"придумай\",\n \"напиши\",\n // German\n \"geschichte\",\n \"gedicht\",\n \"komponieren\",\n \"brainstorming\",\n \"kreativ\",\n \"vorstellen\",\n \"schreibe\",\n \"erzählung\",\n // Spanish\n \"historia\",\n \"poema\",\n \"componer\",\n \"lluvia de ideas\",\n \"creativo\",\n \"imaginar\",\n \"escribe\",\n // Portuguese\n \"história\",\n \"poema\",\n \"compor\",\n \"criativo\",\n \"imaginar\",\n \"escreva\",\n // Korean\n \"이야기\",\n \"시\",\n \"작곡\",\n \"브레인스토밍\",\n \"창의적\",\n \"상상\",\n \"작성\",\n // Arabic\n \"قصة\",\n \"قصيدة\",\n \"تأليف\",\n \"عصف ذهني\",\n \"إبداعي\",\n \"تخيل\",\n \"اكتب\",\n ],\n\n // New dimension keyword lists (multilingual)\n imperativeVerbs: [\n // English\n \"build\",\n \"create\",\n \"implement\",\n \"design\",\n \"develop\",\n \"construct\",\n \"generate\",\n \"deploy\",\n \"configure\",\n \"set up\",\n // Chinese\n \"构建\",\n \"创建\",\n \"实现\",\n \"设计\",\n \"开发\",\n \"生成\",\n \"部署\",\n \"配置\",\n \"设置\",\n // Japanese\n \"構築\",\n \"作成\",\n \"実装\",\n \"設計\",\n \"開発\",\n \"生成\",\n \"デプロイ\",\n \"設定\",\n // Russian\n \"построить\",\n \"построй\",\n \"создать\",\n \"создай\",\n \"реализовать\",\n \"реализуй\",\n \"спроектировать\",\n \"разработать\",\n \"разработай\",\n \"сконструировать\",\n \"сгенерировать\",\n \"сгенерируй\",\n \"развернуть\",\n \"разверни\",\n \"настроить\",\n \"настрой\",\n // German\n \"erstellen\",\n \"bauen\",\n \"implementieren\",\n \"entwerfen\",\n \"entwickeln\",\n \"konstruieren\",\n \"generieren\",\n \"bereitstellen\",\n \"konfigurieren\",\n \"einrichten\",\n // Spanish\n \"construir\",\n \"crear\",\n \"implementar\",\n \"diseñar\",\n \"desarrollar\",\n \"generar\",\n \"desplegar\",\n \"configurar\",\n // Portuguese\n \"construir\",\n \"criar\",\n \"implementar\",\n \"projetar\",\n \"desenvolver\",\n \"gerar\",\n \"implantar\",\n \"configurar\",\n // Korean\n \"구축\",\n \"생성\",\n \"구현\",\n \"설계\",\n \"개발\",\n \"배포\",\n \"설정\",\n // Arabic\n \"بناء\",\n \"إنشاء\",\n \"تنفيذ\",\n \"تصميم\",\n \"تطوير\",\n \"توليد\",\n \"نشر\",\n \"إعداد\",\n ],\n constraintIndicators: [\n // English\n \"under\",\n \"at most\",\n \"at least\",\n \"within\",\n \"no more than\",\n \"o(\",\n \"maximum\",\n \"minimum\",\n \"limit\",\n \"budget\",\n // Chinese\n \"不超过\",\n \"至少\",\n \"最多\",\n \"在内\",\n \"最大\",\n \"最小\",\n \"限制\",\n \"预算\",\n // Japanese\n \"以下\",\n \"最大\",\n \"最小\",\n \"制限\",\n \"予算\",\n // Russian\n \"не более\",\n \"не менее\",\n \"как минимум\",\n \"в пределах\",\n \"максимум\",\n \"минимум\",\n \"ограничение\",\n \"бюджет\",\n // German\n \"höchstens\",\n \"mindestens\",\n \"innerhalb\",\n \"nicht mehr als\",\n \"maximal\",\n \"minimal\",\n \"grenze\",\n \"budget\",\n // Spanish\n \"como máximo\",\n \"al menos\",\n \"dentro de\",\n \"no más de\",\n \"máximo\",\n \"mínimo\",\n \"límite\",\n \"presupuesto\",\n // Portuguese\n \"no máximo\",\n \"pelo menos\",\n \"dentro de\",\n \"não mais que\",\n \"máximo\",\n \"mínimo\",\n \"limite\",\n \"orçamento\",\n // Korean\n \"이하\",\n \"이상\",\n \"최대\",\n \"최소\",\n \"제한\",\n \"예산\",\n // Arabic\n \"على الأكثر\",\n \"على الأقل\",\n \"ضمن\",\n \"لا يزيد عن\",\n \"أقصى\",\n \"أدنى\",\n \"حد\",\n \"ميزانية\",\n ],\n outputFormatKeywords: [\n // English\n \"json\",\n \"yaml\",\n \"xml\",\n \"table\",\n \"csv\",\n \"markdown\",\n \"schema\",\n \"format as\",\n \"structured\",\n // Chinese\n \"表格\",\n \"格式化为\",\n \"结构化\",\n // Japanese\n \"テーブル\",\n \"フォーマット\",\n \"構造化\",\n // Russian\n \"таблица\",\n \"форматировать как\",\n \"структурированный\",\n // German\n \"tabelle\",\n \"formatieren als\",\n \"strukturiert\",\n // Spanish\n \"tabla\",\n \"formatear como\",\n \"estructurado\",\n // Portuguese\n \"tabela\",\n \"formatar como\",\n \"estruturado\",\n // Korean\n \"테이블\",\n \"형식\",\n \"구조화\",\n // Arabic\n \"جدول\",\n \"تنسيق\",\n \"منظم\",\n ],\n referenceKeywords: [\n // English\n \"above\",\n \"below\",\n \"previous\",\n \"following\",\n \"the docs\",\n \"the api\",\n \"the code\",\n \"earlier\",\n \"attached\",\n // Chinese\n \"上面\",\n \"下面\",\n \"之前\",\n \"接下来\",\n \"文档\",\n \"代码\",\n \"附件\",\n // Japanese\n \"上記\",\n \"下記\",\n \"前の\",\n \"次の\",\n \"ドキュメント\",\n \"コード\",\n // Russian\n \"выше\",\n \"ниже\",\n \"предыдущий\",\n \"следующий\",\n \"документация\",\n \"код\",\n \"ранее\",\n \"вложение\",\n // German\n \"oben\",\n \"unten\",\n \"vorherige\",\n \"folgende\",\n \"dokumentation\",\n \"der code\",\n \"früher\",\n \"anhang\",\n // Spanish\n \"arriba\",\n \"abajo\",\n \"anterior\",\n \"siguiente\",\n \"documentación\",\n \"el código\",\n \"adjunto\",\n // Portuguese\n \"acima\",\n \"abaixo\",\n \"anterior\",\n \"seguinte\",\n \"documentação\",\n \"o código\",\n \"anexo\",\n // Korean\n \"위\",\n \"아래\",\n \"이전\",\n \"다음\",\n \"문서\",\n \"코드\",\n \"첨부\",\n // Arabic\n \"أعلاه\",\n \"أدناه\",\n \"السابق\",\n \"التالي\",\n \"الوثائق\",\n \"الكود\",\n \"مرفق\",\n ],\n negationKeywords: [\n // English\n \"don't\",\n \"do not\",\n \"avoid\",\n \"never\",\n \"without\",\n \"except\",\n \"exclude\",\n \"no longer\",\n // Chinese\n \"不要\",\n \"避免\",\n \"从不\",\n \"没有\",\n \"除了\",\n \"排除\",\n // Japanese\n \"しないで\",\n \"避ける\",\n \"決して\",\n \"なしで\",\n \"除く\",\n // Russian\n \"не делай\",\n \"не надо\",\n \"нельзя\",\n \"избегать\",\n \"никогда\",\n \"без\",\n \"кроме\",\n \"исключить\",\n \"больше не\",\n // German\n \"nicht\",\n \"vermeide\",\n \"niemals\",\n \"ohne\",\n \"außer\",\n \"ausschließen\",\n \"nicht mehr\",\n // Spanish\n \"no hagas\",\n \"evitar\",\n \"nunca\",\n \"sin\",\n \"excepto\",\n \"excluir\",\n // Portuguese\n \"não faça\",\n \"evitar\",\n \"nunca\",\n \"sem\",\n \"exceto\",\n \"excluir\",\n // Korean\n \"하지 마\",\n \"피하다\",\n \"절대\",\n \"없이\",\n \"제외\",\n // Arabic\n \"لا تفعل\",\n \"تجنب\",\n \"أبداً\",\n \"بدون\",\n \"باستثناء\",\n \"استبعاد\",\n ],\n domainSpecificKeywords: [\n // English\n \"quantum\",\n \"fpga\",\n \"vlsi\",\n \"risc-v\",\n \"asic\",\n \"photonics\",\n \"genomics\",\n \"proteomics\",\n \"topological\",\n \"homomorphic\",\n \"zero-knowledge\",\n \"lattice-based\",\n // Chinese\n \"量子\",\n \"光子学\",\n \"基因组学\",\n \"蛋白质组学\",\n \"拓扑\",\n \"同态\",\n \"零知识\",\n \"格密码\",\n // Japanese\n \"量子\",\n \"フォトニクス\",\n \"ゲノミクス\",\n \"トポロジカル\",\n // Russian\n \"квантовый\",\n \"фотоника\",\n \"геномика\",\n \"протеомика\",\n \"топологический\",\n \"гомоморфный\",\n \"с нулевым разглашением\",\n \"на основе решёток\",\n // German\n \"quanten\",\n \"photonik\",\n \"genomik\",\n \"proteomik\",\n \"topologisch\",\n \"homomorph\",\n \"zero-knowledge\",\n \"gitterbasiert\",\n // Spanish\n \"cuántico\",\n \"fotónica\",\n \"genómica\",\n \"proteómica\",\n \"topológico\",\n \"homomórfico\",\n // Portuguese\n \"quântico\",\n \"fotônica\",\n \"genômica\",\n \"proteômica\",\n \"topológico\",\n \"homomórfico\",\n // Korean\n \"양자\",\n \"포토닉스\",\n \"유전체학\",\n \"위상\",\n \"동형\",\n // Arabic\n \"كمي\",\n \"ضوئيات\",\n \"جينوميات\",\n \"طوبولوجي\",\n \"تماثلي\",\n ],\n\n // Agentic task keywords - file ops, execution, multi-step, iterative work\n // Pruned: removed overly common words like \"then\", \"first\", \"run\", \"test\", \"build\"\n agenticTaskKeywords: [\n // English - File operations (clearly agentic)\n \"read file\",\n \"read the file\",\n \"look at\",\n \"check the\",\n \"open the\",\n \"edit\",\n \"modify\",\n \"update the\",\n \"change the\",\n \"write to\",\n \"create file\",\n // English - Execution (specific commands only)\n \"execute\",\n \"deploy\",\n \"install\",\n \"npm\",\n \"pip\",\n \"compile\",\n // English - Multi-step patterns (specific only)\n \"after that\",\n \"and also\",\n \"once done\",\n \"step 1\",\n \"step 2\",\n // English - Iterative work\n \"fix\",\n \"debug\",\n \"until it works\",\n \"keep trying\",\n \"iterate\",\n \"make sure\",\n \"verify\",\n \"confirm\",\n // Chinese (keep specific ones)\n \"读取文件\",\n \"查看\",\n \"打开\",\n \"编辑\",\n \"修改\",\n \"更新\",\n \"创建\",\n \"执行\",\n \"部署\",\n \"安装\",\n \"第一步\",\n \"第二步\",\n \"修复\",\n \"调试\",\n \"直到\",\n \"确认\",\n \"验证\",\n // Spanish\n \"leer archivo\",\n \"editar\",\n \"modificar\",\n \"actualizar\",\n \"ejecutar\",\n \"desplegar\",\n \"instalar\",\n \"paso 1\",\n \"paso 2\",\n \"arreglar\",\n \"depurar\",\n \"verificar\",\n // Portuguese\n \"ler arquivo\",\n \"editar\",\n \"modificar\",\n \"atualizar\",\n \"executar\",\n \"implantar\",\n \"instalar\",\n \"passo 1\",\n \"passo 2\",\n \"corrigir\",\n \"depurar\",\n \"verificar\",\n // Korean\n \"파일 읽기\",\n \"편집\",\n \"수정\",\n \"업데이트\",\n \"실행\",\n \"배포\",\n \"설치\",\n \"단계 1\",\n \"단계 2\",\n \"디버그\",\n \"확인\",\n // Arabic\n \"قراءة ملف\",\n \"تحرير\",\n \"تعديل\",\n \"تحديث\",\n \"تنفيذ\",\n \"نشر\",\n \"تثبيت\",\n \"الخطوة 1\",\n \"الخطوة 2\",\n \"إصلاح\",\n \"تصحيح\",\n \"تحقق\",\n ],\n\n // Dimension weights (sum to 1.0)\n dimensionWeights: {\n tokenCount: 0.08,\n codePresence: 0.15,\n reasoningMarkers: 0.18,\n technicalTerms: 0.1,\n creativeMarkers: 0.05,\n simpleIndicators: 0.02, // Reduced from 0.12 to make room for agenticTask\n multiStepPatterns: 0.12,\n questionComplexity: 0.05,\n imperativeVerbs: 0.03,\n constraintCount: 0.04,\n outputFormat: 0.03,\n referenceComplexity: 0.02,\n negationComplexity: 0.01,\n domainSpecificity: 0.02,\n agenticTask: 0.04, // Reduced - agentic signals influence tier selection, not dominate it\n },\n\n // Tier boundaries on weighted score axis\n tierBoundaries: {\n simpleMedium: 0.0,\n mediumComplex: 0.3, // Raised from 0.18 - prevent simple tasks from reaching expensive COMPLEX tier\n complexReasoning: 0.5, // Raised from 0.4 - reserve for true reasoning tasks\n },\n\n // Sigmoid steepness for confidence calibration\n confidenceSteepness: 12,\n // Below this confidence → ambiguous (null tier)\n confidenceThreshold: 0.7,\n },\n\n // Auto (balanced) tier configs - current default smart routing\n // Benchmark-tuned 2026-03-16: balancing quality (retention) + latency\n tiers: {\n SIMPLE: {\n primary: \"google/gemini-2.5-flash\", // 1,238ms, IQ 20, 60% retention (best) — fast AND quality\n fallback: [\n \"google/gemini-3-flash-preview\", // 1,398ms, IQ 46 — smarter fallback\n \"deepseek/deepseek-chat\", // 1,431ms, IQ 32, 41% retention\n \"moonshot/kimi-k2.5\", // 1,646ms, IQ 47, strong quality\n \"google/gemini-3.1-flash-lite\", // $0.25/$1.50, 1M context — newest flash-lite\n \"google/gemini-2.5-flash-lite\", // 1,353ms, $0.10/$0.40\n \"openai/gpt-5.4-nano\", // $0.20/$1.25, 1M context\n \"xai/grok-4-fast-non-reasoning\", // 1,143ms, $0.20/$0.50 — fast fallback\n \"free/gpt-oss-120b\", // 1,252ms, FREE fallback\n ],\n },\n MEDIUM: {\n primary: \"moonshot/kimi-k2.5\", // 1,646ms, IQ 47, $0.60/$3.00 — strong tool use, quality output\n fallback: [\n \"google/gemini-3-flash-preview\", // 1,398ms, IQ 46 — nearly same IQ, faster + cheaper\n \"deepseek/deepseek-chat\", // 1,431ms, IQ 32, 41% retention\n \"google/gemini-2.5-flash\", // 1,238ms, 60% retention\n \"google/gemini-3.1-flash-lite\", // $0.25/$1.50, 1M context\n \"google/gemini-2.5-flash-lite\", // 1,353ms, $0.10/$0.40\n \"xai/grok-4-1-fast-non-reasoning\", // 1,244ms, fast fallback\n \"xai/grok-3-mini\", // 1,202ms, $0.30/$0.50\n ],\n },\n COMPLEX: {\n primary: \"google/gemini-3.1-pro\", // 1,609ms, IQ 57 — fast flagship quality\n fallback: [\n \"google/gemini-3-pro-preview\", // 1,352ms, IQ 48 — quality-first fallback\n \"google/gemini-3-flash-preview\", // 1,398ms, IQ 46 — fast + smart\n \"xai/grok-4-0709\", // 1,348ms, IQ 41\n \"google/gemini-2.5-pro\", // 1,294ms\n \"anthropic/claude-sonnet-4.6\", // 2,110ms, IQ 52 — quality fallback\n \"deepseek/deepseek-chat\", // 1,431ms, IQ 32\n \"google/gemini-2.5-flash\", // 1,238ms, IQ 20 — cheap last resort\n \"openai/gpt-5.5\", // Newest OpenAI flagship — 1M+ ctx, native agent + computer use; benchmark TBD\n \"openai/gpt-5.4\", // 6,213ms, IQ 57 — previous flagship, benchmarked\n ],\n },\n REASONING: {\n primary: \"xai/grok-4-1-fast-reasoning\", // 1,454ms, $0.20/$0.50\n fallback: [\n \"xai/grok-4-fast-reasoning\", // 1,298ms, $0.20/$0.50\n \"deepseek/deepseek-reasoner\", // V4 Flash thinking ($0.20/$0.40, 1M ctx)\n \"deepseek/deepseek-v4-pro\", // V4 Pro flagship ($0.50/$1.00 promo through 2026-05-31, list $2/$4)\n \"openai/o4-mini\", // 2,328ms ($1.10/$4.40)\n \"openai/o3\", // 2,862ms\n ],\n },\n },\n\n // Eco tier configs - absolute cheapest (blockrun/eco)\n ecoTiers: {\n SIMPLE: {\n primary: \"free/gpt-oss-120b\", // FREE! $0.00/$0.00 — heavy user default\n fallback: [\n \"free/gpt-oss-20b\", // FREE — smaller, faster\n \"free/mistral-small-4-119b\", // FREE — 114 tok/s, fastest free chat\n \"free/deepseek-v4-flash\", // FREE — 1M context, ~5x faster than v4-pro\n \"free/qwen3-next-80b-a3b-thinking\", // FREE — 116 tok/s reasoning\n \"google/gemini-3.1-flash-lite\", // $0.25/$1.50 — newest flash-lite\n \"openai/gpt-5.4-nano\", // $0.20/$1.25 — fast nano\n \"google/gemini-2.5-flash-lite\", // $0.10/$0.40\n \"xai/grok-4-fast-non-reasoning\", // $0.20/$0.50\n ],\n },\n MEDIUM: {\n primary: \"google/gemini-3.1-flash-lite\", // $0.25/$1.50 — newest flash-lite\n fallback: [\n \"openai/gpt-5.4-nano\", // $0.20/$1.25\n \"google/gemini-2.5-flash-lite\", // $0.10/$0.40\n \"xai/grok-4-fast-non-reasoning\",\n \"google/gemini-2.5-flash\",\n ],\n },\n COMPLEX: {\n primary: \"google/gemini-3.1-flash-lite\", // $0.25/$1.50\n fallback: [\n \"google/gemini-2.5-flash-lite\",\n \"xai/grok-4-0709\",\n \"google/gemini-2.5-flash\",\n \"deepseek/deepseek-chat\",\n ],\n },\n REASONING: {\n primary: \"xai/grok-4-1-fast-reasoning\", // $0.20/$0.50\n fallback: [\n \"xai/grok-4-fast-reasoning\",\n \"deepseek/deepseek-reasoner\", // V4 Flash thinking — $0.20/$0.40\n \"deepseek/deepseek-v4-pro\", // V4 Pro flagship — $0.50/$1.00 promo, post-promo $2/$4\n ],\n },\n },\n\n // Premium tier configs - best quality (blockrun/premium)\n // codex=complex coding, kimi=simple coding, sonnet=reasoning/instructions, opus=architecture/PM/audits\n premiumTiers: {\n SIMPLE: {\n primary: \"moonshot/kimi-k2.6\", // $0.95/$4.00 - Moonshot flagship (256K ctx, vision + reasoning)\n fallback: [\n \"moonshot/kimi-k2.5\", // $0.60/$3.00 - proven reliable NVIDIA fallback when Moonshot direct API falters\n \"google/gemini-2.5-flash\", // 60% retention, fast growth\n \"anthropic/claude-haiku-4.5\",\n \"google/gemini-2.5-flash-lite\",\n \"deepseek/deepseek-chat\",\n ],\n },\n MEDIUM: {\n primary: \"openai/gpt-5.3-codex\", // $1.75/$14 - 400K context, 128K output, replaces 5.2\n fallback: [\n \"moonshot/kimi-k2.6\", // Moonshot flagship\n \"moonshot/kimi-k2.5\",\n \"google/gemini-2.5-flash\", // 60% retention, good coding capability\n \"google/gemini-2.5-pro\",\n \"xai/grok-4-0709\",\n \"anthropic/claude-sonnet-4.6\",\n ],\n },\n COMPLEX: {\n primary: \"anthropic/claude-opus-4.7\", // Best quality for complex tasks\n // Fallback chain de-Gemini'd 2026-04-22: when Anthropic 503s, Gemini is\n // also prone to \"high demand\" 503s (correlated failure — everyone falls\n // back to Google at the same time). Prefer xAI Grok → Moonshot → OpenAI\n // flagship → DeepSeek → NVIDIA free instead.\n fallback: [\n \"anthropic/claude-opus-4.6\", // in-family hot swap first\n \"anthropic/claude-sonnet-4.6\",\n \"xai/grok-4-0709\", // 503-resistant flagship\n \"moonshot/kimi-k2.6\", // Moonshot flagship, independent infra\n \"moonshot/kimi-k2.5\",\n \"openai/gpt-5.5\", // Newest OpenAI flagship — 1M+ ctx, native agent + computer use\n \"openai/gpt-5.4\", // Previous flagship (slow but stable, benchmarked at 6,213ms)\n \"openai/gpt-5.3-codex\",\n \"deepseek/deepseek-chat\", // Cheap, reliable\n \"free/qwen3-coder-480b\", // NVIDIA free ultimate backstop\n ],\n },\n REASONING: {\n primary: \"anthropic/claude-sonnet-4.6\", // 2,110ms, $3/$15 - best for reasoning/instructions\n fallback: [\n \"anthropic/claude-opus-4.7\", // Flagship Opus w/ adaptive thinking\n \"anthropic/claude-opus-4.6\", // 2,139ms\n \"xai/grok-4-1-fast-reasoning\", // 1,454ms, cheap fast reasoning\n \"openai/o4-mini\", // 2,328ms ($1.10/$4.40)\n \"openai/o3\", // 2,862ms\n ],\n },\n },\n\n // Agentic tier configs - models that excel at multi-step autonomous tasks\n agenticTiers: {\n SIMPLE: {\n primary: \"openai/gpt-4o-mini\", // $0.15/$0.60 - best tool compliance at lowest cost\n fallback: [\n \"moonshot/kimi-k2.5\", // 1,646ms, strong tool use quality\n \"anthropic/claude-haiku-4.5\", // 2,305ms\n \"xai/grok-4-1-fast-non-reasoning\", // 1,244ms, fast fallback\n ],\n },\n MEDIUM: {\n primary: \"moonshot/kimi-k2.5\", // 1,646ms, $0.60/$3.00 - strong tool use, proper function calls\n fallback: [\n \"xai/grok-4-1-fast-non-reasoning\", // 1,244ms, fast fallback\n \"openai/gpt-4o-mini\", // 2,764ms, reliable tool calling\n \"anthropic/claude-haiku-4.5\", // 2,305ms\n \"deepseek/deepseek-chat\", // 1,431ms\n ],\n },\n COMPLEX: {\n primary: \"anthropic/claude-sonnet-4.6\", // 2,110ms — best agentic quality\n // Fallback chain de-Gemini'd 2026-04-22: Gemini's \"high demand\" 503s\n // correlate with Anthropic outages (everyone falls back together).\n // Prefer 503-resistant providers first.\n fallback: [\n \"anthropic/claude-opus-4.7\", // Flagship Opus — in-family hot swap\n \"anthropic/claude-opus-4.6\", // 2,139ms\n \"xai/grok-4-0709\", // 1,348ms — strong tool use, independent infra\n \"moonshot/kimi-k2.5\", // strong tool use, independent infra\n \"openai/gpt-5.5\", // Newest flagship — native agent + computer use (exactly the agentic-tier use case)\n \"openai/gpt-5.4\", // Previous flagship — 6,213ms, reliable\n \"deepseek/deepseek-chat\", // 1,431ms — cheap, reliable\n \"free/qwen3-coder-480b\", // NVIDIA free ultimate backstop\n ],\n },\n REASONING: {\n primary: \"anthropic/claude-sonnet-4.6\", // 2,110ms — strong tool use + reasoning\n fallback: [\n \"anthropic/claude-opus-4.7\", // Flagship Opus w/ adaptive thinking\n \"anthropic/claude-opus-4.6\", // 2,139ms\n \"xai/grok-4-1-fast-reasoning\", // 1,454ms\n \"deepseek/deepseek-reasoner\", // 1,454ms\n ],\n },\n },\n\n // Time-windowed promotions — auto-applied when active, ignored when expired\n promotions: [\n {\n name: \"GLM-5.1 Launch Promo ($0.001 flat)\",\n startDate: \"2026-04-01\",\n endDate: \"2026-05-01\",\n tierOverrides: {\n SIMPLE: { primary: \"zai/glm-5.1\" },\n },\n profiles: [\"auto\"], // only auto profile — eco stays free, premium stays premium\n },\n ],\n\n overrides: {\n maxTokensForceComplex: 100_000,\n structuredOutputMinTier: \"MEDIUM\",\n ambiguousDefaultTier: \"MEDIUM\",\n // agenticMode left undefined → auto-detect via tools/agenticScore.\n // Set to `true` to force agentic tiers; `false` to disable them entirely.\n },\n};\n","/**\n * Smart Router Entry Point\n *\n * Classifies requests and routes to the cheapest capable model.\n * Delegates to pluggable RouterStrategy (default: RulesStrategy, <1ms).\n */\n\nimport type { RoutingDecision, RouterOptions } from \"./types.js\";\nimport { getStrategy } from \"./strategy.js\";\n\n/**\n * Route a request to the cheapest capable model.\n * Delegates to the registered \"rules\" strategy by default.\n */\nexport function route(\n prompt: string,\n systemPrompt: string | undefined,\n maxOutputTokens: number,\n options: RouterOptions,\n): RoutingDecision {\n const strategy = getStrategy(\"rules\");\n return strategy.route(prompt, systemPrompt, maxOutputTokens, options);\n}\n\nexport { getStrategy, registerStrategy } from \"./strategy.js\";\nexport {\n getFallbackChain,\n getFallbackChainFiltered,\n filterByToolCalling,\n filterByVision,\n filterByExcludeList,\n calculateModelCost,\n} from \"./selector.js\";\nexport { DEFAULT_ROUTING_CONFIG } from \"./config.js\";\nexport type {\n RoutingDecision,\n Tier,\n RoutingConfig,\n RouterOptions,\n RouterStrategy,\n} from \"./types.js\";\nexport type { ModelPricing } from \"./selector.js\";\n","/**\n * BlockRun Model Definitions for OpenClaw\n *\n * Maps BlockRun's 55+ AI models to OpenClaw's ModelDefinitionConfig format.\n * All models use the \"openai-completions\" API since BlockRun is OpenAI-compatible.\n *\n * Pricing is in USD per 1M tokens. Operators pay these rates via x402;\n * they set their own markup when reselling to end users (Phase 2).\n */\n\nimport type { ModelDefinitionConfig, ModelProviderConfig } from \"./types.js\";\n\n/**\n * Model aliases for convenient shorthand access.\n * Users can type `/model claude` instead of `/model blockrun/anthropic/claude-sonnet-4-6`.\n */\nexport const MODEL_ALIASES: Record = {\n // Claude - flagship opus is 4.7; sonnet stays at 4.6\n claude: \"anthropic/claude-sonnet-4.6\",\n \"br-sonnet\": \"anthropic/claude-sonnet-4.6\",\n sonnet: \"anthropic/claude-sonnet-4.6\",\n \"sonnet-4\": \"anthropic/claude-sonnet-4.6\",\n \"sonnet-4.6\": \"anthropic/claude-sonnet-4.6\",\n \"sonnet-4-6\": \"anthropic/claude-sonnet-4.6\",\n opus: \"anthropic/claude-opus-4.7\",\n \"opus-4\": \"anthropic/claude-opus-4.7\",\n \"opus-4.7\": \"anthropic/claude-opus-4.7\",\n \"opus-4-7\": \"anthropic/claude-opus-4.7\",\n \"opus-4.6\": \"anthropic/claude-opus-4.6\",\n \"opus-4-6\": \"anthropic/claude-opus-4.6\",\n haiku: \"anthropic/claude-haiku-4.5\",\n // Claude - provider/shortname patterns (common in agent frameworks)\n \"anthropic/sonnet\": \"anthropic/claude-sonnet-4.6\",\n \"anthropic/opus\": \"anthropic/claude-opus-4.7\",\n \"anthropic/haiku\": \"anthropic/claude-haiku-4.5\",\n \"anthropic/claude\": \"anthropic/claude-sonnet-4.6\",\n // Backward compatibility - generic opus-4 and older flagships point at 4.7;\n // explicit version pins (claude-opus-4-6) stay on 4.6 since server still routes it.\n \"anthropic/claude-sonnet-4\": \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-sonnet-4-6\": \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-opus-4\": \"anthropic/claude-opus-4.7\",\n \"anthropic/claude-opus-4-7\": \"anthropic/claude-opus-4.7\",\n \"anthropic/claude-opus-4-6\": \"anthropic/claude-opus-4.6\",\n \"anthropic/claude-opus-4-5\": \"anthropic/claude-opus-4.5\",\n \"anthropic/claude-haiku-4\": \"anthropic/claude-haiku-4.5\",\n \"anthropic/claude-haiku-4-5\": \"anthropic/claude-haiku-4.5\",\n\n // OpenAI\n gpt: \"openai/gpt-4o\",\n gpt4: \"openai/gpt-4o\",\n gpt5: \"openai/gpt-5.5\",\n \"gpt-5.5\": \"openai/gpt-5.5\",\n \"gpt-5.4\": \"openai/gpt-5.4\",\n \"gpt-5.4-pro\": \"openai/gpt-5.4-pro\",\n \"gpt-5.4-nano\": \"openai/gpt-5.4-nano\",\n nano: \"openai/gpt-5.4-nano\",\n \"gpt-5-nano\": \"openai/gpt-5.4-nano\",\n codex: \"openai/gpt-5.3-codex\",\n mini: \"openai/gpt-4o-mini\",\n o1: \"openai/o1\",\n o3: \"openai/o3\",\n // OpenAI Codex prefix aliases (OpenClaw v2026.4.5 openai-codex/ model ID format)\n \"openai-codex/gpt-5.4-mini\": \"openai/gpt-5.4-mini\",\n \"gpt-5.4-mini\": \"openai/gpt-5.4-mini\",\n\n // DeepSeek\n deepseek: \"deepseek/deepseek-chat\",\n \"deepseek-chat\": \"deepseek/deepseek-chat\",\n reasoner: \"deepseek/deepseek-reasoner\",\n\n // Kimi / Moonshot — K2.6 is the featured flagship on BlockRun (K2.5 hidden in\n // BlockRun's UI 2026-04-28). Bare aliases now resolve to K2.6. Users who\n // explicitly pinned \"kimi-k2.5\" continue to get K2.5 (cost-stability opt-in:\n // $0.60/$3.00 vs K2.6's $0.95/$4.00). NVIDIA-hosted K2.5 was retired 2026-04-21.\n kimi: \"moonshot/kimi-k2.6\",\n moonshot: \"moonshot/kimi-k2.6\",\n \"kimi-k2\": \"moonshot/kimi-k2.6\",\n \"kimi-k2.6\": \"moonshot/kimi-k2.6\",\n \"kimi-k2.5\": \"moonshot/kimi-k2.5\",\n \"nvidia/kimi-k2.5\": \"moonshot/kimi-k2.5\",\n\n // Google\n gemini: \"google/gemini-2.5-pro\",\n flash: \"google/gemini-2.5-flash\",\n \"gemini-3.1-pro-preview\": \"google/gemini-3.1-pro\",\n \"google/gemini-3.1-pro-preview\": \"google/gemini-3.1-pro\",\n \"gemini-3.1-flash-lite\": \"google/gemini-3.1-flash-lite\",\n \"gemini-2.5-flash-lite\": \"google/gemini-2.5-flash-lite\",\n\n // xAI\n grok: \"xai/grok-3\",\n \"grok-fast\": \"xai/grok-4-fast-reasoning\",\n \"grok-code\": \"deepseek/deepseek-chat\", // was grok-code-fast-1, delisted due to poor retention\n // Delisted model redirects — full model IDs that were previously valid but removed\n \"grok-code-fast-1\": \"deepseek/deepseek-chat\", // bare alias\n \"xai/grok-code-fast-1\": \"deepseek/deepseek-chat\", // delisted 2026-03-12\n \"xai/grok-3-fast\": \"xai/grok-4-fast-reasoning\", // delisted (too expensive)\n\n // NVIDIA — backward compat aliases (nvidia/xxx → free/xxx)\n // Default free model is gpt-oss-120b (heavy user demand). New free models\n // added 2026-04-29 — deepseek-v4-pro/flash, nemotron-omni — are additions,\n // not replacements. Retired-with-redirect entries below mirror BlockRun\n // server-side decommissioning of slow models (nemotron family, etc.).\n nvidia: \"free/gpt-oss-120b\",\n \"gpt-120b\": \"free/gpt-oss-120b\",\n \"gpt-20b\": \"free/gpt-oss-20b\",\n \"nvidia/gpt-oss-120b\": \"free/gpt-oss-120b\",\n \"nvidia/gpt-oss-20b\": \"free/gpt-oss-20b\",\n \"nvidia/deepseek-v3.2\": \"free/deepseek-v4-pro\", // v3.2 phased out 2026-04-29 → v4-pro\n \"free/deepseek-v3.2\": \"free/deepseek-v4-pro\", // local pin redirect\n \"nvidia/deepseek-v4-pro\": \"free/deepseek-v4-pro\",\n \"nvidia/deepseek-v4-flash\": \"free/deepseek-v4-flash\",\n \"nvidia/nemotron-3-nano-omni-30b-a3b-reasoning\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n \"nvidia/qwen3-coder-480b\": \"free/qwen3-coder-480b\",\n \"qwen/qwen3-coder-480b-a35b-instruct\": \"free/qwen3-coder-480b\",\n \"nvidia/glm-4.7\": \"free/glm-4.7\",\n \"nvidia/llama-4-maverick\": \"free/llama-4-maverick\",\n \"nvidia/qwen3-next-80b-a3b-thinking\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/mistral-small-4-119b\": \"free/mistral-small-4-119b\",\n // Retired free IDs → successors (mirror server-side redirects)\n \"nvidia/nemotron-ultra-253b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/nemotron-3-super-120b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/nemotron-super-49b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/mistral-large-3-675b\": \"free/mistral-small-4-119b\",\n \"nvidia/devstral-2-123b\": \"free/qwen3-coder-480b\",\n \"free/nemotron-ultra-253b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"free/nemotron-3-super-120b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"free/nemotron-super-49b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"free/mistral-large-3-675b\": \"free/mistral-small-4-119b\",\n \"free/devstral-2-123b\": \"free/qwen3-coder-480b\",\n // Free model shorthand aliases\n \"deepseek-free\": \"free/deepseek-v4-pro\", // upgraded from v3.2 (2026-04-29)\n \"deepseek-v4-pro\": \"free/deepseek-v4-pro\",\n \"deepseek-v4-flash\": \"free/deepseek-v4-flash\",\n \"v4-pro\": \"free/deepseek-v4-pro\",\n \"v4-flash\": \"free/deepseek-v4-flash\",\n \"mistral-free\": \"free/mistral-small-4-119b\",\n \"glm-free\": \"free/glm-4.7\",\n \"llama-free\": \"free/llama-4-maverick\",\n \"qwen-coder\": \"free/qwen3-coder-480b\",\n \"qwen-coder-free\": \"free/qwen3-coder-480b\",\n \"qwen-thinking\": \"free/qwen3-next-80b-a3b-thinking\",\n \"qwen3-next\": \"free/qwen3-next-80b-a3b-thinking\",\n \"mistral-small\": \"free/mistral-small-4-119b\",\n // Vision-capable free model — BlockRun's first\n \"nemotron-omni\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n \"nano-omni\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n \"vision-free\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n // Retired shorthand aliases redirect to successors\n nemotron: \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-ultra\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-253b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-super\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-49b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-120b\": \"free/qwen3-next-80b-a3b-thinking\",\n devstral: \"free/qwen3-coder-480b\",\n \"devstral-2\": \"free/qwen3-coder-480b\",\n maverick: \"free/llama-4-maverick\",\n free: \"free/gpt-oss-120b\",\n\n // MiniMax\n minimax: \"minimax/minimax-m2.7\",\n \"minimax-m2.7\": \"minimax/minimax-m2.7\",\n \"minimax-m2.5\": \"minimax/minimax-m2.5\",\n\n // Z.AI GLM-5\n glm: \"zai/glm-5.1\",\n \"glm-5\": \"zai/glm-5\",\n \"glm-5.1\": \"zai/glm-5.1\",\n \"glm-5-turbo\": \"zai/glm-5-turbo\",\n\n // Routing profile aliases (common variations)\n \"auto-router\": \"auto\",\n router: \"auto\",\n\n // Note: auto, eco, premium are virtual routing profiles registered in BLOCKRUN_MODELS\n // They don't need aliases since they're already top-level model IDs\n\n // Image generation\n dalle: \"openai/dall-e-3\",\n \"dall-e\": \"openai/dall-e-3\",\n \"gpt-image\": \"openai/gpt-image-1\",\n \"nano-banana\": \"google/nano-banana\",\n banana: \"google/nano-banana\",\n \"banana-pro\": \"google/nano-banana-pro\",\n \"nano-banana-pro\": \"google/nano-banana-pro\",\n flux: \"black-forest/flux-1.1-pro\",\n \"flux-pro\": \"black-forest/flux-1.1-pro\",\n \"grok-imagine\": \"xai/grok-imagine-image\",\n \"grok-imagine-pro\": \"xai/grok-imagine-image-pro\",\n cogview: \"zai/cogview-4\",\n\n // Video generation\n \"grok-video\": \"xai/grok-imagine-video\",\n seedance: \"bytedance/seedance-1.5-pro\",\n \"seedance-1.5\": \"bytedance/seedance-1.5-pro\",\n \"seedance-2-fast\": \"bytedance/seedance-2.0-fast\",\n \"seedance-2\": \"bytedance/seedance-2.0\",\n};\n\n/**\n * Resolve a model alias to its full model ID.\n * Also strips \"blockrun/\" prefix for direct model paths.\n * Examples:\n * - \"claude\" -> \"anthropic/claude-sonnet-4-6\" (alias)\n * - \"blockrun/claude\" -> \"anthropic/claude-sonnet-4-6\" (alias with prefix)\n * - \"blockrun/anthropic/claude-sonnet-4-6\" -> \"anthropic/claude-sonnet-4-6\" (prefix stripped)\n * - \"openai/gpt-4o\" -> \"openai/gpt-4o\" (unchanged)\n */\nexport function resolveModelAlias(model: string): string {\n const normalized = model.trim().toLowerCase();\n const resolved = MODEL_ALIASES[normalized];\n if (resolved) return resolved;\n\n // Check with \"blockrun/\" prefix stripped\n if (normalized.startsWith(\"blockrun/\")) {\n const withoutPrefix = normalized.slice(\"blockrun/\".length);\n const resolvedWithoutPrefix = MODEL_ALIASES[withoutPrefix];\n if (resolvedWithoutPrefix) return resolvedWithoutPrefix;\n\n // Even if not an alias, strip the prefix for direct model paths\n // e.g., \"blockrun/anthropic/claude-sonnet-4-6\" -> \"anthropic/claude-sonnet-4-6\"\n return withoutPrefix;\n }\n\n // Strip \"openai/\" prefix when it wraps a virtual routing profile or alias.\n // OpenClaw sends virtual models as \"openai/eco\", \"openai/auto\", etc. because\n // the provider uses the openai-completions API type.\n if (normalized.startsWith(\"openai/\")) {\n const withoutPrefix = normalized.slice(\"openai/\".length);\n const resolvedWithoutPrefix = MODEL_ALIASES[withoutPrefix];\n if (resolvedWithoutPrefix) return resolvedWithoutPrefix;\n\n // If it's a known BlockRun virtual profile (eco, auto, premium), return bare id\n const isVirtualProfile = BLOCKRUN_MODELS.some((m) => m.id === withoutPrefix);\n if (isVirtualProfile) return withoutPrefix;\n }\n\n // Strip \"openai-codex/\" prefix (OpenClaw v2026.4.5 model ID format).\n // e.g. \"openai-codex/gpt-5.4-mini\" -> check alias, then strip prefix.\n if (normalized.startsWith(\"openai-codex/\")) {\n const withoutPrefix = normalized.slice(\"openai-codex/\".length);\n const resolvedWithoutPrefix = MODEL_ALIASES[withoutPrefix];\n if (resolvedWithoutPrefix) return resolvedWithoutPrefix;\n\n // Fall back to checking if the bare name is a known model\n const isKnownModel = BLOCKRUN_MODELS.some((m) => m.id === withoutPrefix);\n if (isKnownModel) return withoutPrefix;\n }\n\n return model;\n}\n\ntype BlockRunModel = {\n id: string;\n name: string;\n /** Model version (e.g., \"4.6\", \"3.1\", \"5.2\") for tracking updates */\n version?: string;\n inputPrice: number;\n outputPrice: number;\n contextWindow: number;\n maxOutput: number;\n reasoning?: boolean;\n vision?: boolean;\n /** Models optimized for agentic workflows (multi-step autonomous tasks) */\n agentic?: boolean;\n /**\n * Model supports OpenAI-compatible structured function/tool calling.\n * Models without this flag output tool invocations as plain text JSON,\n * which leaks raw {\"command\":\"...\"} into visible chat messages.\n * Default: false (must opt-in to prevent silent regressions on new models).\n */\n toolCalling?: boolean;\n /** Model is deprecated — will be routed to fallbackModel if set */\n deprecated?: boolean;\n /** Model ID to route to when this model is deprecated */\n fallbackModel?: string;\n /** Time-limited promotional pricing — auto-expires after endDate */\n promo?: {\n /** Flat price per request in USD (replaces token-based pricing) */\n flatPrice: number;\n /** ISO date, promo starts (inclusive). e.g. \"2026-04-01\" */\n startDate: string;\n /** ISO date, promo ends (exclusive). e.g. \"2026-04-15\" */\n endDate: string;\n };\n};\n\nexport const BLOCKRUN_MODELS: BlockRunModel[] = [\n // Smart routing meta-models — proxy replaces with actual model\n // NOTE: Model IDs are WITHOUT provider prefix (OpenClaw adds \"blockrun/\" automatically)\n {\n id: \"auto\",\n name: \"Auto (Smart Router - Balanced)\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1_050_000,\n maxOutput: 128_000,\n },\n {\n id: \"free\",\n name: \"Free → Nemotron Ultra 253B\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131_072,\n maxOutput: 16_384,\n reasoning: true,\n },\n {\n id: \"eco\",\n name: \"Eco (Smart Router - Cost Optimized)\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1_050_000,\n maxOutput: 128_000,\n },\n {\n id: \"premium\",\n name: \"Premium (Smart Router - Best Quality)\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 2_000_000,\n maxOutput: 200_000,\n },\n\n // OpenAI GPT-5 Family\n {\n id: \"openai/gpt-5.2\",\n name: \"GPT-5.2\",\n version: \"5.2\",\n inputPrice: 1.75,\n outputPrice: 14.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5-mini\",\n name: \"GPT-5 Mini\",\n version: \"5.0\",\n inputPrice: 0.25,\n outputPrice: 2.0,\n contextWindow: 200000,\n maxOutput: 65536,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5-nano\",\n name: \"GPT-5 Nano\",\n version: \"5.0\",\n inputPrice: 0.05,\n outputPrice: 0.4,\n contextWindow: 128000,\n maxOutput: 32768,\n toolCalling: true,\n deprecated: true,\n fallbackModel: \"openai/gpt-5.4-nano\",\n },\n {\n id: \"openai/gpt-5.2-pro\",\n name: \"GPT-5.2 Pro\",\n version: \"5.2\",\n inputPrice: 21.0,\n outputPrice: 168.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n toolCalling: true,\n },\n // GPT-5.5 — newest visible flagship in blockrun. First fully retrained base since\n // GPT-4.5; 1M+ context, native agent + computer use. Costs 2x gpt-5.4 — routing\n // tiers still default to gpt-5.4 because it's benchmarked; users can pin 5.5.\n {\n id: \"openai/gpt-5.5\",\n name: \"GPT-5.5\",\n version: \"5.5\",\n inputPrice: 5.0,\n outputPrice: 30.0,\n contextWindow: 1050000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n // GPT-5.4 — flagship benchmarked into routing tiers\n {\n id: \"openai/gpt-5.4\",\n name: \"GPT-5.4\",\n version: \"5.4\",\n inputPrice: 2.5,\n outputPrice: 15.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5.4-mini\",\n name: \"GPT-5.4 Mini\",\n version: \"5.4\",\n inputPrice: 0.75,\n outputPrice: 4.5,\n contextWindow: 400000,\n maxOutput: 128000,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5.4-pro\",\n name: \"GPT-5.4 Pro\",\n version: \"5.4\",\n inputPrice: 30.0,\n outputPrice: 180.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5.4-nano\",\n name: \"GPT-5.4 Nano\",\n version: \"5.4\",\n inputPrice: 0.2,\n outputPrice: 1.25,\n contextWindow: 1050000,\n maxOutput: 32768,\n toolCalling: true,\n },\n\n // OpenAI GPT-5.3 Family\n {\n id: \"openai/gpt-5.3\",\n name: \"GPT-5.3\",\n version: \"5.3\",\n inputPrice: 1.75,\n outputPrice: 14.0,\n contextWindow: 128000,\n maxOutput: 16000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n\n // OpenAI Codex Family\n {\n id: \"openai/gpt-5.3-codex\",\n name: \"GPT-5.3 Codex\",\n version: \"5.3\",\n inputPrice: 1.75,\n outputPrice: 14.0,\n contextWindow: 400000,\n maxOutput: 128000,\n agentic: true,\n toolCalling: true,\n },\n\n // OpenAI GPT-4 Family\n {\n id: \"openai/gpt-4.1\",\n name: \"GPT-4.1\",\n version: \"4.1\",\n inputPrice: 2.0,\n outputPrice: 8.0,\n contextWindow: 128000,\n maxOutput: 16384,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4.1-mini\",\n name: \"GPT-4.1 Mini\",\n version: \"4.1\",\n inputPrice: 0.4,\n outputPrice: 1.6,\n contextWindow: 128000,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4.1-nano\",\n name: \"GPT-4.1 Nano\",\n version: \"4.1\",\n inputPrice: 0.1,\n outputPrice: 0.4,\n contextWindow: 128000,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4o\",\n name: \"GPT-4o\",\n version: \"4o\",\n inputPrice: 2.5,\n outputPrice: 10.0,\n contextWindow: 128000,\n maxOutput: 16384,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4o-mini\",\n name: \"GPT-4o Mini\",\n version: \"4o-mini\",\n inputPrice: 0.15,\n outputPrice: 0.6,\n contextWindow: 128000,\n maxOutput: 16384,\n toolCalling: true,\n },\n\n // OpenAI O-series (Reasoning)\n {\n id: \"openai/o1\",\n name: \"o1\",\n version: \"1\",\n inputPrice: 15.0,\n outputPrice: 60.0,\n contextWindow: 200000,\n maxOutput: 100000,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o1-mini\",\n name: \"o1-mini\",\n version: \"1-mini\",\n inputPrice: 1.1,\n outputPrice: 4.4,\n contextWindow: 128000,\n maxOutput: 65536,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o3\",\n name: \"o3\",\n version: \"3\",\n inputPrice: 2.0,\n outputPrice: 8.0,\n contextWindow: 200000,\n maxOutput: 100000,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o3-mini\",\n name: \"o3-mini\",\n version: \"3-mini\",\n inputPrice: 1.1,\n outputPrice: 4.4,\n contextWindow: 128000,\n maxOutput: 65536,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o4-mini\",\n name: \"o4-mini\",\n version: \"4-mini\",\n inputPrice: 1.1,\n outputPrice: 4.4,\n contextWindow: 128000,\n maxOutput: 65536,\n reasoning: true,\n toolCalling: true,\n },\n\n // Anthropic - all Claude models excel at agentic workflows\n // Use newest versions (4.6) with full provider prefix\n {\n id: \"anthropic/claude-haiku-4.5\",\n name: \"Claude Haiku 4.5\",\n version: \"4.5\",\n inputPrice: 1.0,\n outputPrice: 5.0,\n contextWindow: 200000,\n maxOutput: 8192,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n version: \"4.6\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 200000,\n maxOutput: 64000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-opus-4.5\",\n name: \"Claude Opus 4.5\",\n version: \"4.5\",\n inputPrice: 5.0,\n outputPrice: 25.0,\n contextWindow: 200000,\n maxOutput: 32000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-opus-4.6\",\n name: \"Claude Opus 4.6\",\n version: \"4.6\",\n inputPrice: 5.0,\n outputPrice: 25.0,\n contextWindow: 1000000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-opus-4.7\",\n name: \"Claude Opus 4.7\",\n version: \"4.7\",\n inputPrice: 5.0,\n outputPrice: 25.0,\n contextWindow: 1000000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n\n // Google\n {\n id: \"google/gemini-3.1-pro\",\n name: \"Gemini 3.1 Pro\",\n version: \"3.1\",\n inputPrice: 2.0,\n outputPrice: 12.0,\n contextWindow: 1050000,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-3-pro-preview\",\n name: \"Gemini 3 Pro Preview\",\n version: \"3.0\",\n inputPrice: 2.0,\n outputPrice: 12.0,\n contextWindow: 1050000,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-3-flash-preview\",\n name: \"Gemini 3 Flash Preview\",\n version: \"3.0\",\n inputPrice: 0.5,\n outputPrice: 3.0,\n contextWindow: 1000000,\n maxOutput: 65536,\n vision: true,\n },\n {\n id: \"google/gemini-2.5-pro\",\n name: \"Gemini 2.5 Pro\",\n version: \"2.5\",\n inputPrice: 1.25,\n outputPrice: 10.0,\n contextWindow: 1050000,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-2.5-flash\",\n name: \"Gemini 2.5 Flash\",\n version: \"2.5\",\n inputPrice: 0.3,\n outputPrice: 2.5,\n contextWindow: 1000000,\n maxOutput: 65536,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-2.5-flash-lite\",\n name: \"Gemini 2.5 Flash Lite\",\n version: \"2.5\",\n inputPrice: 0.1,\n outputPrice: 0.4,\n contextWindow: 1000000,\n maxOutput: 65536,\n toolCalling: true,\n },\n {\n id: \"google/gemini-3.1-flash-lite\",\n name: \"Gemini 3.1 Flash Lite\",\n version: \"3.1\",\n inputPrice: 0.25,\n outputPrice: 1.5,\n contextWindow: 1000000,\n maxOutput: 8192,\n toolCalling: true,\n },\n\n // DeepSeek\n {\n id: \"deepseek/deepseek-chat\",\n name: \"DeepSeek V3.2 Chat\",\n version: \"3.2\",\n inputPrice: 0.28,\n outputPrice: 0.42,\n contextWindow: 128000,\n maxOutput: 8192,\n toolCalling: true,\n },\n {\n id: \"deepseek/deepseek-reasoner\",\n name: \"DeepSeek V3.2 Reasoner\",\n version: \"3.2\",\n inputPrice: 0.28,\n outputPrice: 0.42,\n contextWindow: 128000,\n maxOutput: 8192,\n reasoning: true,\n toolCalling: true,\n },\n\n // Kimi K2.6 — Moonshot's current flagship (256K context, vision + reasoning). Only served via Moonshot direct API.\n {\n id: \"moonshot/kimi-k2.6\",\n name: \"Kimi K2.6\",\n version: \"k2.6\",\n inputPrice: 0.95,\n outputPrice: 4.0,\n contextWindow: 262144,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n\n // Kimi K2.5 — Moonshot direct is primary (better SLA). NVIDIA-hosted variant\n // retired 2026-04-21 (slow throughput) and now redirects to moonshot.\n {\n id: \"moonshot/kimi-k2.5\",\n name: \"Kimi K2.5\",\n version: \"k2.5\",\n inputPrice: 0.6,\n outputPrice: 3.0,\n contextWindow: 262144,\n maxOutput: 16384,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"nvidia/kimi-k2.5\",\n name: \"Kimi K2.5 (NVIDIA, retired)\",\n version: \"k2.5\",\n inputPrice: 0.6,\n outputPrice: 3.0,\n contextWindow: 262144,\n maxOutput: 8192,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n deprecated: true,\n fallbackModel: \"moonshot/kimi-k2.5\",\n },\n\n // xAI / Grok\n {\n id: \"xai/grok-3\",\n name: \"Grok 3\",\n version: \"3\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n // grok-3-fast removed - too expensive ($5/$25), use grok-4-fast instead\n {\n id: \"xai/grok-3-mini\",\n name: \"Grok 3 Mini\",\n version: \"3-mini\",\n inputPrice: 0.3,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n toolCalling: true,\n },\n\n // xAI Grok 4 Family - Ultra-cheap fast models\n {\n id: \"xai/grok-4-fast-reasoning\",\n name: \"Grok 4 Fast Reasoning\",\n version: \"4\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4-fast-non-reasoning\",\n name: \"Grok 4 Fast\",\n version: \"4\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4-1-fast-reasoning\",\n name: \"Grok 4.1 Fast Reasoning\",\n version: \"4.1\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4-1-fast-non-reasoning\",\n name: \"Grok 4.1 Fast\",\n version: \"4.1\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n toolCalling: true,\n },\n // xai/grok-code-fast-1 delisted 2026-03-12: poor retention (coding users churn),\n // no structured tool calling, alias \"grok-code\" redirected to deepseek-chat\n {\n id: \"xai/grok-4-0709\",\n name: \"Grok 4 (0709)\",\n version: \"4-0709\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-2-vision\",\n name: \"Grok 2 Vision\",\n version: \"2\",\n inputPrice: 2.0,\n outputPrice: 10.0,\n contextWindow: 131072,\n maxOutput: 16384,\n vision: true,\n toolCalling: true,\n },\n\n // xAI Grok 4.20 Family (hidden in picker; explicit-only — mirrors BlockRun hidden:true)\n {\n id: \"xai/grok-4.20-reasoning\",\n name: \"Grok 4.20 Reasoning\",\n version: \"4.20\",\n inputPrice: 2.0,\n outputPrice: 6.0,\n contextWindow: 2000000,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4.20-non-reasoning\",\n name: \"Grok 4.20\",\n version: \"4.20\",\n inputPrice: 2.0,\n outputPrice: 6.0,\n contextWindow: 2000000,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4.20-multi-agent\",\n name: \"Grok 4.20 Multi-Agent\",\n version: \"4.20\",\n inputPrice: 2.0,\n outputPrice: 6.0,\n contextWindow: 2000000,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n\n // MiniMax\n {\n id: \"minimax/minimax-m2.7\",\n name: \"MiniMax M2.7\",\n version: \"m2.7\",\n inputPrice: 0.3,\n outputPrice: 1.2,\n contextWindow: 204800,\n maxOutput: 16384,\n reasoning: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"minimax/minimax-m2.5\",\n name: \"MiniMax M2.5\",\n version: \"m2.5\",\n inputPrice: 0.3,\n outputPrice: 1.2,\n contextWindow: 204800,\n maxOutput: 16384,\n reasoning: true,\n agentic: true,\n toolCalling: true,\n deprecated: true,\n fallbackModel: \"minimax/minimax-m2.7\",\n },\n\n // Free models (hosted by NVIDIA, billingMode: \"free\" on server)\n // IDs use \"free/\" prefix so users see them as free in the /model picker.\n // ClawRouter maps free/xxx → nvidia/xxx before sending to BlockRun upstream\n // (see toUpstreamModelId in src/proxy.ts). BlockRun's NVIDIA_MODEL_MAP in\n // src/lib/ai-providers.ts maps known IDs to upstream NIM names; for IDs not\n // in the map, BlockRun falls through to the bare name (modelMap[k] || k),\n // so new entries here only need to match BlockRun's catalog ID — NVIDIA NIM\n // accepts the bare name directly.\n // toolCalling intentionally omitted: structured function calling unverified.\n // 2026-04-29: kept gpt-oss-120b/20b as defaults (heavy user demand); added\n // v4-pro / v4-flash (1M context, ~5x speed split) and nemotron-3-nano-omni\n // (first vision-capable free model, 256K context, accepts text/image/video/audio).\n // 2026-04-21: slimmed to 8 models, retired nemotron family + mistral-large-3-675b\n // + devstral-2-123b with successor redirects.\n {\n id: \"free/gpt-oss-120b\",\n name: \"[Free] GPT-OSS 120B\",\n version: \"120b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 128000,\n maxOutput: 16384,\n },\n {\n id: \"free/gpt-oss-20b\",\n name: \"[Free] GPT-OSS 20B\",\n version: \"20b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 128000,\n maxOutput: 16384,\n },\n {\n // V4 Pro: 1.6T MoE / 49B active, 1M context. MMLU-Pro 87.5, GPQA 90.1,\n // SWE-bench 80.6, LiveCodeBench 93.5. NIM ~150 tok/s on Blackwell.\n // Strongest free reasoning model — phases out free/deepseek-v3.2.\n id: \"free/deepseek-v4-pro\",\n name: \"[Free] DeepSeek V4 Pro\",\n version: \"v4-pro\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1000000,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n // V4 Flash: 284B / 13B active MoE, 1M context. ~5x faster than V4 Pro.\n // Strong on chat/summarization (MMLU-Pro 86.2). Caveat: weaker factual\n // recall (SimpleQA 34% vs Pro's 58%) — pick V4 Pro for fact-heavy loops.\n id: \"free/deepseek-v4-flash\",\n name: \"[Free] DeepSeek V4 Flash\",\n version: \"v4-flash\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1000000,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/qwen3-coder-480b\",\n name: \"[Free] Qwen3 Coder 480B\",\n version: \"480b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n },\n {\n id: \"free/glm-4.7\",\n name: \"[Free] GLM-4.7\",\n version: \"4.7\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/llama-4-maverick\",\n name: \"[Free] Llama 4 Maverick\",\n version: \"4-maverick\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/qwen3-next-80b-a3b-thinking\",\n name: \"[Free] Qwen3-Next 80B Thinking\",\n version: \"80b-a3b-thinking\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/mistral-small-4-119b\",\n name: \"[Free] Mistral Small 4 119B\",\n version: \"small-4-119b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n },\n {\n // Nemotron 3 Nano Omni: first vision-capable free model. 31B / 3.2B active\n // MoE, 256K context. ChartQA 90.3, DocVQA 95.6, MMMU 70.8. Accepts text,\n // images, video (up to 2min), audio (up to 1hr). Released 2026-04-27.\n id: \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n name: \"[Free] Nemotron 3 Nano Omni\",\n version: \"30b-a3b-omni-reasoning\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 256000,\n maxOutput: 16384,\n reasoning: true,\n vision: true,\n },\n\n // Z.AI GLM-5 Models\n {\n id: \"zai/glm-5.1\",\n name: \"GLM-5.1\",\n version: \"5.1\",\n inputPrice: 1.4,\n outputPrice: 4.4,\n contextWindow: 200000,\n maxOutput: 128000,\n toolCalling: true,\n promo: { flatPrice: 0.001, startDate: \"2026-04-01\", endDate: \"2026-04-15\" },\n },\n {\n id: \"zai/glm-5\",\n name: \"GLM-5\",\n version: \"5\",\n inputPrice: 1.0,\n outputPrice: 3.2,\n contextWindow: 200000,\n maxOutput: 128000,\n toolCalling: true,\n promo: { flatPrice: 0.001, startDate: \"2026-04-01\", endDate: \"2026-04-15\" },\n },\n {\n id: \"zai/glm-5-turbo\",\n name: \"GLM-5 Turbo\",\n version: \"5-turbo\",\n inputPrice: 1.2,\n outputPrice: 4.0,\n contextWindow: 200000,\n maxOutput: 128000,\n toolCalling: true,\n promo: { flatPrice: 0.001, startDate: \"2026-04-01\", endDate: \"2026-04-15\" },\n },\n];\n\n/**\n * Get the active flat promo price for a model, or undefined if no promo / expired.\n */\nexport function getActivePromoPrice(\n model: BlockRunModel,\n now: Date = new Date(),\n): number | undefined {\n if (!model.promo) return undefined;\n const start = new Date(model.promo.startDate);\n const end = new Date(model.promo.endDate);\n if (now >= start && now < end) return model.promo.flatPrice;\n return undefined;\n}\n\n/**\n * Convert BlockRun model definitions to OpenClaw ModelDefinitionConfig format.\n */\nfunction toOpenClawModel(m: BlockRunModel): ModelDefinitionConfig {\n return {\n id: m.id,\n name: m.name,\n api: \"openai-completions\",\n reasoning: m.reasoning ?? false,\n input: m.vision ? [\"text\", \"image\"] : [\"text\"],\n cost: {\n input: m.inputPrice,\n output: m.outputPrice,\n cacheRead: 0,\n cacheWrite: 0,\n },\n contextWindow: m.contextWindow,\n maxTokens: m.maxOutput,\n };\n}\n\n/**\n * Alias models that map to real models.\n * These allow users to use friendly names like \"free\" or \"gpt-120b\".\n */\nconst ALIAS_MODELS: ModelDefinitionConfig[] = Object.entries(MODEL_ALIASES)\n .map(([alias, targetId]) => {\n const target = BLOCKRUN_MODELS.find((m) => m.id === targetId);\n if (!target) return null;\n return toOpenClawModel({ ...target, id: alias, name: `${alias} → ${target.name}` });\n })\n .filter((m): m is ModelDefinitionConfig => m !== null);\n\n/**\n * All BlockRun models in OpenClaw format (including aliases).\n */\nexport const OPENCLAW_MODELS: ModelDefinitionConfig[] = [\n ...BLOCKRUN_MODELS.map(toOpenClawModel),\n ...ALIAS_MODELS,\n];\n\n/**\n * Build a ModelProviderConfig for BlockRun.\n *\n * @param baseUrl - The proxy's local base URL (e.g., \"http://127.0.0.1:12345\")\n */\nexport function buildProviderModels(baseUrl: string): ModelProviderConfig {\n return {\n baseUrl: `${baseUrl}/v1`,\n api: \"openai-completions\",\n models: OPENCLAW_MODELS,\n };\n}\n\n/**\n * Check if a model is optimized for agentic workflows.\n * Agentic models continue autonomously with multi-step tasks\n * instead of stopping and waiting for user input.\n */\nexport function isAgenticModel(modelId: string): boolean {\n const model = BLOCKRUN_MODELS.find(\n (m) => m.id === modelId || m.id === modelId.replace(\"blockrun/\", \"\"),\n );\n return model?.agentic ?? false;\n}\n\n/**\n * Get all agentic-capable models.\n */\nexport function getAgenticModels(): string[] {\n return BLOCKRUN_MODELS.filter((m) => m.agentic).map((m) => m.id);\n}\n\n/**\n * Check if a model supports OpenAI-compatible structured tool/function calling.\n * Models without this flag (e.g. grok-code-fast-1) output tool invocations as\n * plain text JSON, which leaks {\"command\":\"...\"} into visible chat messages.\n */\nexport function supportsToolCalling(modelId: string): boolean {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.toolCalling ?? false;\n}\n\n/**\n * Check if a model supports vision (image inputs).\n * Models without this flag cannot process image_url content parts.\n */\nexport function supportsVision(modelId: string): boolean {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.vision ?? false;\n}\n\n/**\n * Get context window size for a model.\n * Returns undefined if model not found.\n */\nexport function getModelContextWindow(modelId: string): number | undefined {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.contextWindow;\n}\n\n/**\n * Check if a model has reasoning/thinking capabilities.\n * Reasoning models may require reasoning_content in assistant tool_call messages.\n */\nexport function isReasoningModel(modelId: string): boolean {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.reasoning ?? false;\n}\n","/**\n * Usage Logger\n *\n * Logs every LLM request as a JSON line to a daily log file.\n * Files: ~/.openclaw/blockrun/logs/usage-YYYY-MM-DD.jsonl\n *\n * MVP: append-only JSON lines. No rotation, no cleanup.\n * Logging never breaks the request flow — all errors are swallowed.\n */\n\nimport { appendFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport type UsageEntry = {\n timestamp: string;\n model: string;\n tier: string;\n cost: number;\n baselineCost: number;\n savings: number; // 0-1 percentage\n latencyMs: number;\n /** Whether the request completed successfully or ended in an error */\n status?: \"success\" | \"error\";\n /** Input (prompt) tokens reported by the provider */\n inputTokens?: number;\n /** Output (completion) tokens reported by the provider */\n outputTokens?: number;\n /** Partner service ID (e.g., \"image_generation\") — only set for partner API calls */\n partnerId?: string;\n /** Partner service name (e.g., \"BlockRun\") — only set for partner API calls */\n service?: string;\n};\n\nconst LOG_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"logs\");\nlet dirReady = false;\n\nasync function ensureDir(): Promise {\n if (dirReady) return;\n await mkdir(LOG_DIR, { recursive: true });\n dirReady = true;\n}\n\n/**\n * Log a usage entry as a JSON line.\n */\nexport async function logUsage(entry: UsageEntry): Promise {\n try {\n await ensureDir();\n const date = entry.timestamp.slice(0, 10); // YYYY-MM-DD\n const file = join(LOG_DIR, `usage-${date}.jsonl`);\n await appendFile(file, JSON.stringify(entry) + \"\\n\");\n } catch {\n // Never break the request flow\n }\n}\n","/**\n * Usage Statistics Aggregator\n *\n * Reads usage log files and aggregates statistics for terminal display.\n * Supports filtering by date range and provides multiple aggregation views.\n */\n\nimport { readdir, unlink } from \"node:fs/promises\";\nimport { readTextFile } from \"./fs-read.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { UsageEntry } from \"./logger.js\";\nimport { VERSION } from \"./version.js\";\n\nconst LOG_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"logs\");\n\nexport type DailyStats = {\n date: string;\n totalRequests: number;\n totalCost: number;\n totalBaselineCost: number;\n totalSavings: number;\n avgLatencyMs: number;\n byTier: Record;\n byModel: Record;\n};\n\nexport type AggregatedStats = {\n period: string;\n totalRequests: number;\n totalCost: number;\n totalBaselineCost: number;\n totalSavings: number;\n savingsPercentage: number;\n avgLatencyMs: number;\n avgCostPerRequest: number;\n byTier: Record;\n byModel: Record;\n dailyBreakdown: DailyStats[];\n entriesWithBaseline: number; // Entries with valid baseline tracking\n};\n\n/**\n * Parse a JSONL log file into usage entries.\n * Handles both old format (without tier/baselineCost) and new format.\n */\nasync function parseLogFile(filePath: string): Promise {\n try {\n const content = await readTextFile(filePath);\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n const entries: UsageEntry[] = [];\n for (const line of lines) {\n try {\n const entry = JSON.parse(line) as Partial;\n entries.push({\n timestamp: entry.timestamp || new Date().toISOString(),\n model: entry.model || \"unknown\",\n tier: entry.tier || \"UNKNOWN\",\n cost: entry.cost || 0,\n baselineCost: entry.baselineCost || entry.cost || 0,\n savings: entry.savings || 0,\n latencyMs: entry.latencyMs || 0,\n });\n } catch {\n // Skip malformed lines, keep valid ones\n }\n }\n return entries;\n } catch {\n return [];\n }\n}\n\n/**\n * Get list of available log files sorted by date (newest first).\n */\nasync function getLogFiles(): Promise {\n try {\n const files = await readdir(LOG_DIR);\n return files\n .filter((f) => f.startsWith(\"usage-\") && f.endsWith(\".jsonl\"))\n .sort()\n .reverse();\n } catch {\n return [];\n }\n}\n\n/**\n * Aggregate stats for a single day.\n */\nfunction aggregateDay(date: string, entries: UsageEntry[]): DailyStats {\n const byTier: Record = {};\n const byModel: Record = {};\n let totalLatency = 0;\n\n for (const entry of entries) {\n // By tier\n if (!byTier[entry.tier]) byTier[entry.tier] = { count: 0, cost: 0 };\n byTier[entry.tier].count++;\n byTier[entry.tier].cost += entry.cost;\n\n // By model\n if (!byModel[entry.model]) byModel[entry.model] = { count: 0, cost: 0 };\n byModel[entry.model].count++;\n byModel[entry.model].cost += entry.cost;\n\n totalLatency += entry.latencyMs;\n }\n\n const totalCost = entries.reduce((sum, e) => sum + e.cost, 0);\n const totalBaselineCost = entries.reduce((sum, e) => sum + e.baselineCost, 0);\n\n return {\n date,\n totalRequests: entries.length,\n totalCost,\n totalBaselineCost,\n totalSavings: totalBaselineCost - totalCost,\n avgLatencyMs: entries.length > 0 ? totalLatency / entries.length : 0,\n byTier,\n byModel,\n };\n}\n\n/**\n * Get aggregated statistics for the last N days.\n */\nexport async function getStats(days: number = 7): Promise {\n const logFiles = await getLogFiles();\n const filesToRead = logFiles.slice(0, days);\n\n const dailyBreakdown: DailyStats[] = [];\n const allByTier: Record = {};\n const allByModel: Record = {};\n let totalRequests = 0;\n let totalCost = 0;\n let totalBaselineCost = 0;\n let totalLatency = 0;\n\n for (const file of filesToRead) {\n const date = file.replace(\"usage-\", \"\").replace(\".jsonl\", \"\");\n const filePath = join(LOG_DIR, file);\n const entries = await parseLogFile(filePath);\n\n if (entries.length === 0) continue;\n\n const dayStats = aggregateDay(date, entries);\n dailyBreakdown.push(dayStats);\n\n totalRequests += dayStats.totalRequests;\n totalCost += dayStats.totalCost;\n totalBaselineCost += dayStats.totalBaselineCost;\n totalLatency += dayStats.avgLatencyMs * dayStats.totalRequests;\n\n // Merge tier stats\n for (const [tier, stats] of Object.entries(dayStats.byTier)) {\n if (!allByTier[tier]) allByTier[tier] = { count: 0, cost: 0 };\n allByTier[tier].count += stats.count;\n allByTier[tier].cost += stats.cost;\n }\n\n // Merge model stats\n for (const [model, stats] of Object.entries(dayStats.byModel)) {\n if (!allByModel[model]) allByModel[model] = { count: 0, cost: 0 };\n allByModel[model].count += stats.count;\n allByModel[model].cost += stats.cost;\n }\n }\n\n // Calculate percentages\n const byTierWithPercentage: Record =\n {};\n for (const [tier, stats] of Object.entries(allByTier)) {\n byTierWithPercentage[tier] = {\n ...stats,\n percentage: totalRequests > 0 ? (stats.count / totalRequests) * 100 : 0,\n };\n }\n\n const byModelWithPercentage: Record =\n {};\n for (const [model, stats] of Object.entries(allByModel)) {\n byModelWithPercentage[model] = {\n ...stats,\n percentage: totalRequests > 0 ? (stats.count / totalRequests) * 100 : 0,\n };\n }\n\n const totalSavings = totalBaselineCost - totalCost;\n const savingsPercentage = totalBaselineCost > 0 ? (totalSavings / totalBaselineCost) * 100 : 0;\n\n // Count entries with valid baseline tracking (baseline != cost means tracking was active)\n let entriesWithBaseline = 0;\n for (const day of dailyBreakdown) {\n if (day.totalBaselineCost !== day.totalCost) {\n entriesWithBaseline += day.totalRequests;\n }\n }\n\n return {\n period: days === 1 ? \"today\" : `last ${days} days`,\n totalRequests,\n totalCost,\n totalBaselineCost,\n totalSavings,\n savingsPercentage,\n avgLatencyMs: totalRequests > 0 ? totalLatency / totalRequests : 0,\n avgCostPerRequest: totalRequests > 0 ? totalCost / totalRequests : 0,\n byTier: byTierWithPercentage,\n byModel: byModelWithPercentage,\n dailyBreakdown: dailyBreakdown.reverse(), // Oldest first for charts\n entriesWithBaseline, // How many entries have valid baseline tracking\n };\n}\n\n/**\n * Format stats as ASCII table for terminal display.\n */\nexport function formatStatsAscii(stats: AggregatedStats): string {\n const lines: string[] = [];\n\n // Header\n lines.push(\"╔════════════════════════════════════════════════════════════╗\");\n lines.push(`║ XClawRouter by BlockRun v${VERSION}`.padEnd(61) + \"║\");\n lines.push(\"║ Usage Statistics ║\");\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n\n // Summary\n lines.push(`║ Period: ${stats.period.padEnd(49)}║`);\n lines.push(`║ Total Requests: ${stats.totalRequests.toString().padEnd(41)}║`);\n lines.push(`║ Total Cost: $${stats.totalCost.toFixed(4).padEnd(43)}║`);\n lines.push(`║ Baseline Cost (Opus 4.5): $${stats.totalBaselineCost.toFixed(4).padEnd(30)}║`);\n\n // Show savings with note if some entries lack baseline tracking\n const savingsLine = `║ 💰 Total Saved: $${stats.totalSavings.toFixed(4)} (${stats.savingsPercentage.toFixed(1)}%)`;\n if (stats.entriesWithBaseline < stats.totalRequests && stats.entriesWithBaseline > 0) {\n lines.push(savingsLine.padEnd(61) + \"║\");\n const note = `║ (based on ${stats.entriesWithBaseline}/${stats.totalRequests} tracked requests)`;\n lines.push(note.padEnd(61) + \"║\");\n } else {\n lines.push(savingsLine.padEnd(61) + \"║\");\n }\n lines.push(`║ Avg Latency: ${stats.avgLatencyMs.toFixed(0)}ms`.padEnd(61) + \"║\");\n\n // Tier breakdown\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n lines.push(\"║ Routing by Tier: ║\");\n\n // Show all tiers found in data, ordered by known tiers first then others\n const knownTiers = [\"SIMPLE\", \"MEDIUM\", \"COMPLEX\", \"REASONING\", \"DIRECT\"];\n const allTiers = Object.keys(stats.byTier);\n const otherTiers = allTiers.filter((t) => !knownTiers.includes(t));\n const tierOrder = [...knownTiers.filter((t) => stats.byTier[t]), ...otherTiers];\n\n for (const tier of tierOrder) {\n const data = stats.byTier[tier];\n if (data) {\n const bar = \"█\".repeat(Math.min(20, Math.round(data.percentage / 5)));\n const displayTier = tier === \"UNKNOWN\" ? \"OTHER\" : tier;\n const line = `║ ${displayTier.padEnd(10)} ${bar.padEnd(20)} ${data.percentage.toFixed(1).padStart(5)}% (${data.count})`;\n lines.push(line.padEnd(61) + \"║\");\n }\n }\n\n // Top models\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n lines.push(\"║ Top Models: ║\");\n\n const sortedModels = Object.entries(stats.byModel)\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 5);\n\n for (const [model, data] of sortedModels) {\n const shortModel = model.length > 25 ? model.slice(0, 22) + \"...\" : model;\n const line = `║ ${shortModel.padEnd(25)} ${data.count.toString().padStart(5)} reqs $${data.cost.toFixed(4)}`;\n lines.push(line.padEnd(61) + \"║\");\n }\n\n // Daily breakdown (last 7 days)\n if (stats.dailyBreakdown.length > 0) {\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n lines.push(\"║ Daily Breakdown: ║\");\n lines.push(\"║ Date Requests Cost Saved ║\");\n\n for (const day of stats.dailyBreakdown.slice(-7)) {\n const saved = day.totalBaselineCost - day.totalCost;\n const line = `║ ${day.date} ${day.totalRequests.toString().padStart(6)} $${day.totalCost.toFixed(4).padStart(8)} $${saved.toFixed(4)}`;\n lines.push(line.padEnd(61) + \"║\");\n }\n }\n\n lines.push(\"╚════════════════════════════════════════════════════════════╝\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format per-request log entries as an ASCII table for terminal display.\n * Reads the last N days of log files and shows each request individually.\n */\nexport async function formatRecentLogs(days: number = 1): Promise {\n const logFiles = await getLogFiles();\n const filesToRead = logFiles.slice(0, days);\n\n const allEntries: UsageEntry[] = [];\n for (const file of filesToRead) {\n const entries = await parseLogFile(join(LOG_DIR, file));\n allEntries.push(...entries);\n }\n\n // Sort chronologically (oldest first)\n allEntries.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\n const lines: string[] = [];\n lines.push(\"╔════════════════════════════════════════════════════════════════════════╗\");\n lines.push(\n `║ XClawRouter Request Log — last ${days === 1 ? \"24h\" : `${days} days`}`.padEnd(72) + \"║\",\n );\n lines.push(\"╠══════════════════╦══════════════════════════╦═════════╦══════╦════════╣\");\n lines.push(\"║ Time ║ Model ║ Cost ║ ms ║ Status ║\");\n lines.push(\"╠══════════════════╬══════════════════════════╬═════════╬══════╬════════╣\");\n\n if (allEntries.length === 0) {\n lines.push(\"║ No requests found\".padEnd(72) + \"║\");\n }\n\n let totalCost = 0;\n for (const e of allEntries) {\n const time = e.timestamp.slice(11, 19); // HH:MM:SS\n const date = e.timestamp.slice(5, 10); // MM-DD\n const displayTime = `${date} ${time}`;\n const model = e.model.length > 24 ? e.model.slice(0, 21) + \"...\" : e.model;\n const cost = `$${e.cost.toFixed(4)}`;\n const ms = e.latencyMs > 9999 ? `${(e.latencyMs / 1000).toFixed(1)}s` : `${e.latencyMs}ms`;\n const status =\n (e as UsageEntry & { status?: string }).status === \"error\" ? \" ERROR \" : \" OK \";\n totalCost += e.cost;\n lines.push(\n `║ ${displayTime.padEnd(16)}║ ${model.padEnd(24)}║ ${cost.padStart(7)}║ ${ms.padStart(4)}║${status}║`,\n );\n }\n\n lines.push(\"╠══════════════════╩══════════════════════════╩═════════╩══════╩════════╣\");\n lines.push(\n `║ ${allEntries.length} request${allEntries.length !== 1 ? \"s\" : \"\"} Total spent: $${totalCost.toFixed(4)}`.padEnd(\n 72,\n ) + \"║\",\n );\n lines.push(\n \"║ Logs: ~/.openclaw/blockrun/logs/ (JSONL — one entry per request)\".padEnd(72) + \"║\",\n );\n lines.push(\"╚════════════════════════════════════════════════════════════════════════╝\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Delete all usage log files, resetting stats to zero.\n */\nexport async function clearStats(): Promise<{ deletedFiles: number }> {\n try {\n const files = await readdir(LOG_DIR);\n const logFiles = files.filter((f) => f.startsWith(\"usage-\") && f.endsWith(\".jsonl\"));\n\n await Promise.all(logFiles.map((f) => unlink(join(LOG_DIR, f))));\n\n return { deletedFiles: logFiles.length };\n } catch {\n return { deletedFiles: 0 };\n }\n}\n","/**\n * Single source of truth for version.\n * Reads from package.json at build time via tsup's define.\n */\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Read package.json at runtime\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// In dist/, go up one level to find package.json\nconst require = createRequire(import.meta.url);\nconst pkg = require(join(__dirname, \"..\", \"package.json\")) as { version: string };\n\nexport const VERSION = pkg.version;\nexport const USER_AGENT = `clawrouter/${VERSION}`;\n","/**\n * Request Deduplication\n *\n * Prevents double-charging when OpenClaw retries a request after timeout.\n * Tracks in-flight requests and caches completed responses for a short TTL.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport type CachedResponse = {\n status: number;\n headers: Record;\n body: Buffer;\n completedAt: number;\n};\n\ntype InflightEntry = {\n resolvers: Array<(result: CachedResponse) => void>;\n};\n\nconst DEFAULT_TTL_MS = 30_000; // 30 seconds\nconst MAX_BODY_SIZE = 1_048_576; // 1MB\n\n/**\n * Canonicalize JSON by sorting object keys recursively.\n * Ensures identical logical content produces identical string regardless of field order.\n */\nfunction canonicalize(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(canonicalize);\n }\n const sorted: Record = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = canonicalize((obj as Record)[key]);\n }\n return sorted;\n}\n\n/**\n * Strip OpenClaw-injected timestamps from message content.\n * Format: [DAY YYYY-MM-DD HH:MM TZ] at the start of messages.\n * Example: [SUN 2026-02-07 13:30 PST] Hello world\n *\n * This ensures requests with different timestamps but same content hash identically.\n */\nconst TIMESTAMP_PATTERN = /^\\[\\w{3}\\s+\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}\\s+\\w+\\]\\s*/;\n\nfunction stripTimestamps(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(stripTimestamps);\n }\n const result: Record = {};\n for (const [key, value] of Object.entries(obj as Record)) {\n if (key === \"content\" && typeof value === \"string\") {\n // Strip timestamp prefix from message content\n result[key] = value.replace(TIMESTAMP_PATTERN, \"\");\n } else {\n result[key] = stripTimestamps(value);\n }\n }\n return result;\n}\n\nexport class RequestDeduplicator {\n private inflight = new Map();\n private completed = new Map();\n private ttlMs: number;\n\n constructor(ttlMs = DEFAULT_TTL_MS) {\n this.ttlMs = ttlMs;\n }\n\n /** Hash request body to create a dedup key. */\n static hash(body: Buffer): string {\n // Canonicalize JSON to ensure consistent hashing regardless of field order.\n // Also strip OpenClaw-injected timestamps so retries with different timestamps\n // still match the same dedup key.\n let content = body;\n try {\n const parsed = JSON.parse(body.toString());\n const stripped = stripTimestamps(parsed);\n const canonical = canonicalize(stripped);\n content = Buffer.from(JSON.stringify(canonical));\n } catch {\n // Not valid JSON, use raw bytes\n }\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n }\n\n /** Check if a response is cached for this key. */\n getCached(key: string): CachedResponse | undefined {\n const entry = this.completed.get(key);\n if (!entry) return undefined;\n if (Date.now() - entry.completedAt > this.ttlMs) {\n this.completed.delete(key);\n return undefined;\n }\n return entry;\n }\n\n /** Check if a request with this key is currently in-flight. Returns a promise to wait on. */\n getInflight(key: string): Promise | undefined {\n const entry = this.inflight.get(key);\n if (!entry) return undefined;\n return new Promise((resolve) => {\n entry.resolvers.push(resolve);\n });\n }\n\n /** Mark a request as in-flight. */\n markInflight(key: string): void {\n this.inflight.set(key, {\n resolvers: [],\n });\n }\n\n /** Complete an in-flight request — cache result and notify waiters. */\n complete(key: string, result: CachedResponse): void {\n // Only cache responses within size limit\n if (result.body.length <= MAX_BODY_SIZE) {\n this.completed.set(key, result);\n }\n\n const entry = this.inflight.get(key);\n if (entry) {\n for (const resolve of entry.resolvers) {\n resolve(result);\n }\n this.inflight.delete(key);\n }\n\n this.prune();\n }\n\n /** Remove an in-flight entry on error (don't cache failures).\n * Also rejects any waiters so they can retry independently. */\n removeInflight(key: string): void {\n const entry = this.inflight.get(key);\n if (entry) {\n // Resolve waiters with a sentinel error response so they don't hang forever.\n // Waiters will see a 503 and can retry on their own.\n const errorBody = Buffer.from(\n JSON.stringify({\n error: { message: \"Original request failed, please retry\", type: \"dedup_origin_failed\" },\n }),\n );\n for (const resolve of entry.resolvers) {\n resolve({\n status: 503,\n headers: { \"content-type\": \"application/json\" },\n body: errorBody,\n completedAt: Date.now(),\n });\n }\n this.inflight.delete(key);\n }\n }\n\n /** Prune expired completed entries. */\n private prune(): void {\n const now = Date.now();\n for (const [key, entry] of this.completed) {\n if (now - entry.completedAt > this.ttlMs) {\n this.completed.delete(key);\n }\n }\n }\n}\n","/**\n * Response Cache for LLM Completions\n *\n * Caches LLM responses by request hash (model + messages + params).\n * Inspired by LiteLLM's caching system. Returns cached responses for\n * identical requests, saving both cost and latency.\n *\n * Features:\n * - TTL-based expiration (default 10 minutes)\n * - LRU eviction when cache is full\n * - Size limits per item (1MB max)\n * - Heap-based expiration tracking for efficient pruning\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport type CachedLLMResponse = {\n body: Buffer;\n status: number;\n headers: Record;\n model: string;\n cachedAt: number;\n expiresAt: number;\n};\n\nexport type ResponseCacheConfig = {\n /** Maximum number of cached responses. Default: 200 */\n maxSize?: number;\n /** Default TTL in seconds. Default: 600 (10 minutes) */\n defaultTTL?: number;\n /** Maximum size per cached item in bytes. Default: 1MB */\n maxItemSize?: number;\n /** Enable/disable cache. Default: true */\n enabled?: boolean;\n};\n\nconst DEFAULT_CONFIG: Required = {\n maxSize: 200,\n defaultTTL: 600,\n maxItemSize: 1_048_576, // 1MB\n enabled: true,\n};\n\n/**\n * Canonicalize JSON by sorting object keys recursively.\n * Ensures identical logical content produces identical hash.\n */\nfunction canonicalize(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(canonicalize);\n }\n const sorted: Record = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = canonicalize((obj as Record)[key]);\n }\n return sorted;\n}\n\n/**\n * Strip fields that shouldn't affect cache key:\n * - timestamps injected by OpenClaw\n * - request IDs\n *\n * `stream` IS part of the key because it changes the stored response shape\n * (JSON body vs SSE text/event-stream). A stream:true and stream:false request\n * with otherwise-identical bodies produce different responses and must live in\n * separate cache slots — otherwise the first one's response is served to the\n * second, which breaks the client.\n */\nconst TIMESTAMP_PATTERN = /^\\[\\w{3}\\s+\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}\\s+\\w+\\]\\s*/;\n\nfunction normalizeForCache(obj: Record): Record {\n const result: Record = {};\n\n for (const [key, value] of Object.entries(obj)) {\n // Skip fields that don't affect response content\n if ([\"user\", \"request_id\", \"x-request-id\"].includes(key)) {\n continue;\n }\n\n if (key === \"messages\" && Array.isArray(value)) {\n // Strip timestamps from message content\n result[key] = value.map((msg: unknown) => {\n if (typeof msg === \"object\" && msg !== null) {\n const m = msg as Record;\n if (typeof m.content === \"string\") {\n return { ...m, content: m.content.replace(TIMESTAMP_PATTERN, \"\") };\n }\n }\n return msg;\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport class ResponseCache {\n private cache = new Map();\n private expirationHeap: Array<{ expiresAt: number; key: string }> = [];\n private config: Required;\n\n // Stats for monitoring\n private stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n };\n\n constructor(config: ResponseCacheConfig = {}) {\n // Filter out undefined values so they don't override defaults\n const filtered = Object.fromEntries(\n Object.entries(config).filter(([, v]) => v !== undefined),\n ) as ResponseCacheConfig;\n this.config = { ...DEFAULT_CONFIG, ...filtered };\n }\n\n /**\n * Generate cache key from request body.\n * Hashes: model + messages + temperature + max_tokens + other params\n */\n static generateKey(body: Buffer | string): string {\n try {\n const parsed = JSON.parse(typeof body === \"string\" ? body : body.toString());\n const normalized = normalizeForCache(parsed);\n const canonical = canonicalize(normalized);\n const keyContent = JSON.stringify(canonical);\n return createHash(\"sha256\").update(keyContent).digest(\"hex\").slice(0, 32);\n } catch {\n // Fallback: hash raw body\n const content = typeof body === \"string\" ? body : body.toString();\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 32);\n }\n }\n\n /**\n * Check if caching is enabled for this request.\n * Respects cache control headers and request params.\n */\n shouldCache(body: Buffer | string, headers?: Record): boolean {\n if (!this.config.enabled) return false;\n\n // Respect Cache-Control: no-cache header\n if (headers?.[\"cache-control\"]?.includes(\"no-cache\")) {\n return false;\n }\n\n // Check for explicit cache disable in body\n try {\n const parsed = JSON.parse(typeof body === \"string\" ? body : body.toString());\n if (parsed.cache === false || parsed.no_cache === true) {\n return false;\n }\n } catch {\n // Not JSON, allow caching\n }\n\n return true;\n }\n\n /**\n * Get cached response if available and not expired.\n */\n get(key: string): CachedLLMResponse | undefined {\n const entry = this.cache.get(key);\n if (!entry) {\n this.stats.misses++;\n return undefined;\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n this.stats.misses++;\n return undefined;\n }\n\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Cache a response with optional custom TTL.\n */\n set(\n key: string,\n response: {\n body: Buffer;\n status: number;\n headers: Record;\n model: string;\n },\n ttlSeconds?: number,\n ): void {\n // Don't cache if disabled or maxSize is 0\n if (!this.config.enabled || this.config.maxSize <= 0) return;\n\n // Don't cache if item too large\n if (response.body.length > this.config.maxItemSize) {\n console.log(`[ResponseCache] Skipping cache - item too large: ${response.body.length} bytes`);\n return;\n }\n\n // Don't cache error responses\n if (response.status >= 400) {\n return;\n }\n\n // Evict if at capacity\n if (this.cache.size >= this.config.maxSize) {\n this.evict();\n }\n\n const now = Date.now();\n const ttl = ttlSeconds ?? this.config.defaultTTL;\n const expiresAt = now + ttl * 1000;\n\n const entry: CachedLLMResponse = {\n ...response,\n cachedAt: now,\n expiresAt,\n };\n\n this.cache.set(key, entry);\n this.expirationHeap.push({ expiresAt, key });\n }\n\n /**\n * Evict expired and oldest entries to make room.\n */\n private evict(): void {\n const now = Date.now();\n\n // First pass: remove expired entries\n this.expirationHeap.sort((a, b) => a.expiresAt - b.expiresAt);\n\n while (this.expirationHeap.length > 0) {\n const oldest = this.expirationHeap[0];\n\n // Check if entry still exists and matches\n const entry = this.cache.get(oldest.key);\n if (!entry || entry.expiresAt !== oldest.expiresAt) {\n // Stale heap entry, remove it\n this.expirationHeap.shift();\n continue;\n }\n\n if (oldest.expiresAt <= now) {\n // Expired, remove both\n this.cache.delete(oldest.key);\n this.expirationHeap.shift();\n this.stats.evictions++;\n } else {\n // Not expired, stop\n break;\n }\n }\n\n // Second pass: if still at capacity, evict oldest\n while (this.cache.size >= this.config.maxSize && this.expirationHeap.length > 0) {\n const oldest = this.expirationHeap.shift()!;\n if (this.cache.has(oldest.key)) {\n this.cache.delete(oldest.key);\n this.stats.evictions++;\n }\n }\n }\n\n /**\n * Get cache statistics.\n */\n getStats(): {\n size: number;\n maxSize: number;\n hits: number;\n misses: number;\n evictions: number;\n hitRate: string;\n } {\n const total = this.stats.hits + this.stats.misses;\n const hitRate = total > 0 ? ((this.stats.hits / total) * 100).toFixed(1) + \"%\" : \"0%\";\n\n return {\n size: this.cache.size,\n maxSize: this.config.maxSize,\n hits: this.stats.hits,\n misses: this.stats.misses,\n evictions: this.stats.evictions,\n hitRate,\n };\n }\n\n /**\n * Clear all cached entries.\n */\n clear(): void {\n this.cache.clear();\n this.expirationHeap = [];\n }\n\n /**\n * Check if cache is enabled.\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n}\n","/**\n * Typed Error Classes for XClawRouter\n *\n * Provides structured errors for balance-related failures with\n * all necessary information for user-friendly error messages.\n */\n\n/**\n * Thrown when wallet has insufficient USDC balance for a request.\n */\nexport class InsufficientFundsError extends Error {\n readonly code = \"INSUFFICIENT_FUNDS\" as const;\n readonly currentBalanceUSD: string;\n readonly requiredUSD: string;\n readonly walletAddress: string;\n\n constructor(opts: { currentBalanceUSD: string; requiredUSD: string; walletAddress: string }) {\n const msg = [\n `Insufficient balance. Current: ${opts.currentBalanceUSD}, Required: ${opts.requiredUSD}`,\n `Options:`,\n ` 1. Fund wallet: ${opts.walletAddress}`,\n ` 2. Use free model: /model free`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"InsufficientFundsError\";\n this.currentBalanceUSD = opts.currentBalanceUSD;\n this.requiredUSD = opts.requiredUSD;\n this.walletAddress = opts.walletAddress;\n }\n}\n\n/**\n * Thrown when wallet has no USDC balance (or effectively zero).\n */\nexport class EmptyWalletError extends Error {\n readonly code = \"EMPTY_WALLET\" as const;\n readonly walletAddress: string;\n\n constructor(walletAddress: string) {\n const msg = [\n `No USDC balance.`,\n `Options:`,\n ` 1. Fund wallet: ${walletAddress}`,\n ` 2. Use free model: /model free`,\n ` 3. Uninstall: bash ~/.openclaw/extensions/clawrouter/scripts/uninstall.sh`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"EmptyWalletError\";\n this.walletAddress = walletAddress;\n }\n}\n\n/**\n * Type guard to check if an error is InsufficientFundsError.\n */\nexport function isInsufficientFundsError(error: unknown): error is InsufficientFundsError {\n return error instanceof Error && (error as InsufficientFundsError).code === \"INSUFFICIENT_FUNDS\";\n}\n\n/**\n * Type guard to check if an error is EmptyWalletError.\n */\nexport function isEmptyWalletError(error: unknown): error is EmptyWalletError {\n return error instanceof Error && (error as EmptyWalletError).code === \"EMPTY_WALLET\";\n}\n\n/**\n * Type guard to check if an error is a balance-related error.\n */\nexport function isBalanceError(error: unknown): error is InsufficientFundsError | EmptyWalletError {\n return isInsufficientFundsError(error) || isEmptyWalletError(error);\n}\n\n/**\n * Thrown when RPC call fails (network error, node down, etc).\n * Distinguishes infrastructure failures from actual empty wallets.\n */\nexport class RpcError extends Error {\n readonly code = \"RPC_ERROR\" as const;\n readonly originalError: unknown;\n\n constructor(message: string, originalError?: unknown) {\n super(`RPC error: ${message}. Check network connectivity.`);\n this.name = \"RpcError\";\n this.originalError = originalError;\n }\n}\n\n/**\n * Type guard to check if an error is RpcError.\n */\nexport function isRpcError(error: unknown): error is RpcError {\n return error instanceof Error && (error as RpcError).code === \"RPC_ERROR\";\n}\n","/**\n * Balance Monitor for XClawRouter\n *\n * Monitors USDC balance on Base network with intelligent caching.\n * Provides pre-request balance checks to prevent failed payments.\n *\n * Caching Strategy:\n * - TTL: 30 seconds (balance is cached to avoid excessive RPC calls)\n * - Optimistic deduction: after successful payment, subtract estimated cost from cache\n * - Invalidation: on payment failure, immediately refresh from RPC\n */\n\nimport { createPublicClient, http, erc20Abi } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { RpcError } from \"./errors.js\";\n\n/** USDC contract address on Base mainnet */\nconst USDC_BASE = \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" as const;\n\n/** Cache TTL in milliseconds (30 seconds) */\nconst CACHE_TTL_MS = 30_000;\n\n/** Balance thresholds in USDC smallest unit (6 decimals) */\nexport const BALANCE_THRESHOLDS = {\n /** Low balance warning threshold: $1.00 */\n LOW_BALANCE_MICROS: 1_000_000n,\n /** Effectively zero threshold: $0.0001 (covers dust/rounding) */\n ZERO_THRESHOLD: 100n,\n} as const;\n\n/** Balance information returned by checkBalance() */\nexport type BalanceInfo = {\n /** Raw balance in USDC smallest unit (6 decimals) */\n balance: bigint;\n /** Formatted balance as \"$X.XX\" */\n balanceUSD: string;\n /** True if balance < $1.00 */\n isLow: boolean;\n /** True if balance < $0.0001 (effectively zero) */\n isEmpty: boolean;\n /** Wallet address for funding instructions */\n walletAddress: string;\n};\n\n/** Result from checkSufficient() */\nexport type SufficiencyResult = {\n /** True if balance >= estimated cost */\n sufficient: boolean;\n /** Current balance info */\n info: BalanceInfo;\n /** If insufficient, the shortfall as \"$X.XX\" */\n shortfall?: string;\n};\n\n/**\n * Monitors USDC balance on Base network.\n *\n * Usage:\n * const monitor = new BalanceMonitor(\"0x...\");\n * const info = await monitor.checkBalance();\n * if (info.isLow) console.warn(\"Low balance!\");\n */\nexport class BalanceMonitor {\n private readonly client;\n private readonly walletAddress: `0x${string}`;\n\n /** Cached balance (null = not yet fetched) */\n private cachedBalance: bigint | null = null;\n /** Timestamp when cache was last updated */\n private cachedAt = 0;\n\n constructor(walletAddress: string) {\n this.walletAddress = walletAddress as `0x${string}`;\n this.client = createPublicClient({\n chain: base,\n transport: http(undefined, {\n timeout: 10_000, // 10 second timeout to prevent hanging on slow RPC\n }),\n });\n }\n\n /**\n * Check current USDC balance.\n * Uses cache if valid, otherwise fetches from RPC.\n */\n async checkBalance(): Promise {\n const now = Date.now();\n\n // Use cache only when balance is positive and still fresh.\n // Zero balance is never cached — always re-fetch so a funded wallet is\n // detected on the next request without waiting for cache expiry.\n if (\n this.cachedBalance !== null &&\n this.cachedBalance > 0n &&\n now - this.cachedAt < CACHE_TTL_MS\n ) {\n return this.buildInfo(this.cachedBalance);\n }\n\n // Fetch from RPC\n const balance = await this.fetchBalance();\n if (balance > 0n) {\n this.cachedBalance = balance;\n this.cachedAt = now;\n }\n\n return this.buildInfo(balance);\n }\n\n /**\n * Check if balance is sufficient for an estimated cost.\n *\n * @param estimatedCostMicros - Estimated cost in USDC smallest unit (6 decimals)\n */\n async checkSufficient(estimatedCostMicros: bigint): Promise {\n const info = await this.checkBalance();\n\n if (info.balance >= estimatedCostMicros) {\n return { sufficient: true, info };\n }\n\n const shortfall = estimatedCostMicros - info.balance;\n return {\n sufficient: false,\n info,\n shortfall: this.formatUSDC(shortfall),\n };\n }\n\n /**\n * Optimistically deduct estimated cost from cached balance.\n * Call this after a successful payment to keep cache accurate.\n *\n * @param amountMicros - Amount to deduct in USDC smallest unit\n */\n deductEstimated(amountMicros: bigint): void {\n if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) {\n this.cachedBalance -= amountMicros;\n }\n }\n\n /**\n * Invalidate cache, forcing next checkBalance() to fetch from RPC.\n * Call this after a payment failure to get accurate balance.\n */\n invalidate(): void {\n this.cachedBalance = null;\n this.cachedAt = 0;\n }\n\n /**\n * Force refresh balance from RPC (ignores cache).\n */\n async refresh(): Promise {\n this.invalidate();\n return this.checkBalance();\n }\n\n /**\n * Format USDC amount (in micros) as \"$X.XX\".\n */\n formatUSDC(amountMicros: bigint): string {\n // USDC has 6 decimals\n const dollars = Number(amountMicros) / 1_000_000;\n return `$${dollars.toFixed(2)}`;\n }\n\n /**\n * Get the wallet address being monitored.\n */\n getWalletAddress(): string {\n return this.walletAddress;\n }\n\n /** Fetch balance from RPC */\n private async fetchBalance(): Promise {\n try {\n const balance = await this.client.readContract({\n address: USDC_BASE,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [this.walletAddress],\n });\n return balance;\n } catch (error) {\n // Throw typed error instead of silently returning 0\n // This allows callers to distinguish \"node down\" from \"wallet empty\"\n throw new RpcError(error instanceof Error ? error.message : \"Unknown error\", error);\n }\n }\n\n /** Build BalanceInfo from raw balance */\n private buildInfo(balance: bigint): BalanceInfo {\n return {\n balance,\n balanceUSD: this.formatUSDC(balance),\n isLow: balance < BALANCE_THRESHOLDS.LOW_BALANCE_MICROS,\n isEmpty: balance < BALANCE_THRESHOLDS.ZERO_THRESHOLD,\n walletAddress: this.walletAddress,\n };\n }\n}\n","/**\n * Custom payFetch for OKX onchainos mode.\n *\n * onchainos exposes payment signing as a single high-level command\n * (`payment x402-pay --accepts `), not raw EIP-712 typed-data signing.\n * We therefore can't plug it into the @x402/fetch signer plumbing — instead\n * we hand-roll the 402 → sign → replay loop that the official x402 spec\n * describes, mirroring okxclawrouter's reference handler.\n *\n * Supports both x402 protocol versions:\n * v2: `PAYMENT-REQUIRED` request header → `PAYMENT-SIGNATURE` reply header\n * v1: JSON-body 402 → `X-PAYMENT` reply header\n *\n * Pre-auth caching is intentionally skipped in this mode — onchainos issues\n * fresh nonces/timestamps per call, so caching the previous payload would\n * produce duplicate authorizations the facilitator rejects.\n */\n\nimport type { OnchainOsAdapter } from \"./onchainos-adapter.js\";\n\ntype FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise;\n\ninterface PaymentRequirement {\n x402Version?: number;\n resource?: unknown;\n accepted?: unknown;\n accepts?: unknown[];\n}\n\n/**\n * Build a payFetch that signs x402 payments through onchainos.\n * Drop-in replacement for `createPayFetchWithPreAuth` when source=okx.\n */\nexport function createOnchainosPayFetch(baseFetch: FetchFn, onchainos: OnchainOsAdapter): FetchFn {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise => {\n // Snapshot the request so we can replay verbatim after a 402.\n // Cloning consumes the body once, so we materialize it up front.\n const original = new Request(input, init);\n const bodyBuf = await original.clone().arrayBuffer();\n const headersSnapshot = new Headers(original.headers);\n\n const firstResponse = await baseFetch(original);\n if (firstResponse.status !== 402) return firstResponse;\n\n // Parse 402 — v2 header takes precedence, then v1 body.\n const paymentRequiredHeader = firstResponse.headers.get(\"PAYMENT-REQUIRED\");\n let requirement: PaymentRequirement;\n let isV2 = false;\n let accepts: unknown[];\n\n if (paymentRequiredHeader) {\n isV2 = true;\n requirement = JSON.parse(\n Buffer.from(paymentRequiredHeader, \"base64\").toString(),\n ) as PaymentRequirement;\n accepts = requirement.accepted ? [requirement.accepted] : (requirement.accepts ?? []);\n } else {\n const text = await firstResponse.text();\n try {\n requirement = JSON.parse(text) as PaymentRequirement;\n } catch {\n // 402 without a parseable body — surface a fresh 402 to the caller.\n return new Response(text, {\n status: 402,\n headers: firstResponse.headers,\n });\n }\n accepts = requirement.accepts ?? [];\n }\n\n if (accepts.length === 0) {\n throw new Error(\n `x402 402 response had no payment options to satisfy ` +\n `(onchainos cannot sign without an 'accepts' array)`,\n );\n }\n\n // Sign via onchainos.\n const payment = await onchainos.signX402Payment(accepts);\n\n // Build payment header.\n const accepted = (accepts[0] ?? {}) as Record;\n const payload: Record = {\n signature: payment.signature,\n authorization: payment.authorization,\n };\n\n let headerName: string;\n let headerValue: string;\n if (isV2) {\n const acceptedWithCert: Record = { ...accepted };\n if (accepted.scheme === \"aggr_deferred\" && payment.sessionCert) {\n acceptedWithCert.extra = {\n ...((accepted.extra as Record | undefined) ?? {}),\n sessionCert: payment.sessionCert,\n };\n }\n headerName = \"PAYMENT-SIGNATURE\";\n headerValue = Buffer.from(\n JSON.stringify({\n x402Version: requirement.x402Version ?? 2,\n resource: requirement.resource ?? { url: original.url },\n accepted: acceptedWithCert,\n payload,\n }),\n ).toString(\"base64\");\n } else {\n headerName = \"X-PAYMENT\";\n headerValue = Buffer.from(\n JSON.stringify({\n x402Version: 1,\n scheme: accepted.scheme,\n network: accepted.network,\n payload,\n }),\n ).toString(\"base64\");\n }\n\n // Replay request with payment header attached.\n const replayHeaders = new Headers(headersSnapshot);\n replayHeaders.set(headerName, headerValue);\n const replayInit: RequestInit = {\n method: original.method,\n headers: replayHeaders,\n body: original.method === \"GET\" || original.method === \"HEAD\" ? undefined : bodyBuf,\n redirect: original.redirect,\n credentials: original.credentials,\n };\n return baseFetch(original.url, replayInit);\n };\n}\n","/**\n * LLM-Safe Context Compression Types\n *\n * Types for the 7-layer compression system that reduces token usage\n * while preserving semantic meaning for LLM queries.\n */\n\n// Content part for multimodal messages (images, etc.)\nexport interface ContentPart {\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n}\n\n// Normalized message structure (matches OpenAI format)\n// Note: content can be an array for multimodal messages (images, etc.)\nexport interface NormalizedMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | ContentPart[] | null;\n tool_call_id?: string;\n tool_calls?: ToolCall[];\n name?: string;\n}\n\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\n// Compression configuration\nexport interface CompressionConfig {\n enabled: boolean;\n preserveRaw: boolean; // Keep original for logging\n\n // Per-layer toggles\n layers: {\n deduplication: boolean;\n whitespace: boolean;\n dictionary: boolean;\n paths: boolean;\n jsonCompact: boolean;\n observation: boolean; // L6: Compress tool results (BIG WIN)\n dynamicCodebook: boolean; // L7: Build codebook from content\n };\n\n // Dictionary settings\n dictionary: {\n maxEntries: number;\n minPhraseLength: number;\n includeCodebookHeader: boolean; // Include codebook in system message\n };\n}\n\n// Compression statistics\nexport interface CompressionStats {\n duplicatesRemoved: number;\n whitespaceSavedChars: number;\n dictionarySubstitutions: number;\n pathsShortened: number;\n jsonCompactedChars: number;\n observationsCompressed: number; // L6: Tool results compressed\n observationCharsSaved: number; // L6: Chars saved from observations\n dynamicSubstitutions: number; // L7: Dynamic codebook substitutions\n dynamicCharsSaved: number; // L7: Chars saved from dynamic codebook\n}\n\n// Result from compression\nexport interface CompressionResult {\n messages: NormalizedMessage[];\n originalMessages: NormalizedMessage[]; // For logging\n\n // Token estimates\n originalChars: number;\n compressedChars: number;\n compressionRatio: number; // 0.85 = 15% reduction\n\n // Per-layer stats\n stats: CompressionStats;\n\n // Codebook used (for decompression in logs)\n codebook: Record;\n pathMap: Record;\n dynamicCodes: Record; // L7: Dynamic codebook\n}\n\n// Log data extension for compression metrics\nexport interface CompressionLogData {\n enabled: boolean;\n ratio: number;\n original_chars: number;\n compressed_chars: number;\n stats: {\n duplicates_removed: number;\n whitespace_saved: number;\n dictionary_subs: number;\n paths_shortened: number;\n json_compacted: number;\n };\n}\n\n// Default configuration - CONSERVATIVE settings for model compatibility\n// Only enable layers that don't require the model to decode anything\nexport const DEFAULT_COMPRESSION_CONFIG: CompressionConfig = {\n enabled: true,\n preserveRaw: true,\n layers: {\n deduplication: true, // Safe: removes duplicate messages\n whitespace: true, // Safe: normalizes whitespace\n dictionary: false, // DISABLED: requires model to understand codebook\n paths: false, // DISABLED: requires model to understand path codes\n jsonCompact: true, // Safe: just removes JSON whitespace\n observation: false, // DISABLED: may lose important context\n dynamicCodebook: false, // DISABLED: requires model to understand codes\n },\n dictionary: {\n maxEntries: 50,\n minPhraseLength: 15,\n includeCodebookHeader: false, // No codebook header needed\n },\n};\n","/**\n * Layer 1: Message Deduplication\n *\n * Removes exact duplicate messages from conversation history.\n * Common in heartbeat patterns and repeated tool calls.\n *\n * Safe for LLM: Identical messages add no new information.\n * Expected savings: 2-5%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\nimport crypto from \"crypto\";\n\nexport interface DeduplicationResult {\n messages: NormalizedMessage[];\n duplicatesRemoved: number;\n originalCount: number;\n}\n\n/**\n * Generate a hash for a message based on its semantic content.\n * Uses role + content + tool_call_id to identify duplicates.\n */\nfunction hashMessage(message: NormalizedMessage): string {\n // Handle content - stringify arrays (multimodal), use string directly, or empty string\n let contentStr = \"\";\n if (typeof message.content === \"string\") {\n contentStr = message.content;\n } else if (Array.isArray(message.content)) {\n contentStr = JSON.stringify(message.content);\n }\n\n const parts = [message.role, contentStr, message.tool_call_id || \"\", message.name || \"\"];\n\n // Include tool_calls if present\n if (message.tool_calls) {\n parts.push(\n JSON.stringify(\n message.tool_calls.map((tc) => ({\n name: tc.function.name,\n args: tc.function.arguments,\n })),\n ),\n );\n }\n\n const content = parts.join(\"|\");\n return crypto.createHash(\"md5\").update(content).digest(\"hex\");\n}\n\n/**\n * Remove exact duplicate messages from the conversation.\n *\n * Strategy:\n * - Keep first occurrence of each unique message\n * - Preserve order for semantic coherence\n * - Never dedupe system messages (they set context)\n * - Allow duplicate user messages (user might repeat intentionally)\n * - CRITICAL: Never dedupe assistant messages with tool_calls that are\n * referenced by subsequent tool messages (breaks Anthropic tool_use/tool_result pairing)\n */\nexport function deduplicateMessages(messages: NormalizedMessage[]): DeduplicationResult {\n const seen = new Set();\n const result: NormalizedMessage[] = [];\n let duplicatesRemoved = 0;\n\n // First pass: collect all tool_call_ids that are referenced by tool messages\n // These tool_calls MUST be preserved to maintain tool_use/tool_result pairing\n const referencedToolCallIds = new Set();\n for (const message of messages) {\n if (message.role === \"tool\" && message.tool_call_id) {\n referencedToolCallIds.add(message.tool_call_id);\n }\n }\n\n for (const message of messages) {\n // Always keep system messages (they set important context)\n if (message.role === \"system\") {\n result.push(message);\n continue;\n }\n\n // Always keep user messages (user might repeat intentionally)\n if (message.role === \"user\") {\n result.push(message);\n continue;\n }\n\n // Always keep tool messages (they are results of tool calls)\n // Removing them would break the tool_use/tool_result pairing\n if (message.role === \"tool\") {\n result.push(message);\n continue;\n }\n\n // For assistant messages with tool_calls, check if any are referenced\n // by subsequent tool messages - if so, we MUST keep this message\n if (message.role === \"assistant\" && message.tool_calls) {\n const hasReferencedToolCall = message.tool_calls.some((tc) =>\n referencedToolCallIds.has(tc.id),\n );\n if (hasReferencedToolCall) {\n // This assistant message has tool_calls that are referenced - keep it\n result.push(message);\n continue;\n }\n }\n\n // For other assistant messages, check for duplicates\n const hash = hashMessage(message);\n\n if (!seen.has(hash)) {\n seen.add(hash);\n result.push(message);\n } else {\n duplicatesRemoved++;\n }\n }\n\n return {\n messages: result,\n duplicatesRemoved,\n originalCount: messages.length,\n };\n}\n","/**\n * Layer 2: Whitespace Normalization\n *\n * Reduces excessive whitespace without changing semantic meaning.\n *\n * Safe for LLM: Tokenizers normalize whitespace anyway.\n * Expected savings: 3-8%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\nexport interface WhitespaceResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n}\n\n/**\n * Normalize whitespace in a string.\n *\n * - Max 2 consecutive newlines\n * - Remove trailing whitespace from lines\n * - Normalize tabs to spaces\n * - Trim start/end\n */\nexport function normalizeWhitespace(content: string): string {\n // Defensive type check - content might be array/object for multimodal messages\n if (!content || typeof content !== \"string\") return content as string;\n\n return (\n content\n // Normalize line endings\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\")\n // Max 2 consecutive newlines (preserve paragraph breaks)\n .replace(/\\n{3,}/g, \"\\n\\n\")\n // Remove trailing whitespace from each line\n .replace(/[ \\t]+$/gm, \"\")\n // Normalize multiple spaces to single (except at line start for indentation)\n .replace(/([^\\n]) {2,}/g, \"$1 \")\n // Reduce excessive indentation (more than 8 spaces → 2 spaces per level)\n .replace(/^[ ]{8,}/gm, (match) => \" \".repeat(Math.ceil(match.length / 4)))\n // Normalize tabs to 2 spaces\n .replace(/\\t/g, \" \")\n // Trim\n .trim()\n );\n}\n\n/**\n * Apply whitespace normalization to all messages.\n */\nexport function normalizeMessagesWhitespace(messages: NormalizedMessage[]): WhitespaceResult {\n let charsSaved = 0;\n\n const result = messages.map((message) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") return message;\n\n const originalLength = message.content.length;\n const normalizedContent = normalizeWhitespace(message.content);\n charsSaved += originalLength - normalizedContent.length;\n\n return {\n ...message,\n content: normalizedContent,\n };\n });\n\n return {\n messages: result,\n charsSaved,\n };\n}\n","/**\n * Dictionary Codebook\n *\n * Static dictionary of frequently repeated phrases observed in LLM prompts.\n * Built from analysis of BlockRun production logs.\n *\n * Format: Short code ($XX) -> Long phrase\n * The LLM receives a codebook header and decodes in-context.\n */\n\n// Static codebook - common patterns from system prompts\n// Ordered by expected frequency and impact\nexport const STATIC_CODEBOOK: Record = {\n // High-impact: OpenClaw/Agent system prompt patterns (very common)\n $OC01: \"unbrowse_\", // Common prefix in tool names\n $OC02: \"\",\n $OC03: \"\",\n $OC04: \"\",\n $OC05: \"\",\n $OC06: \"\",\n $OC07: \"\",\n $OC08: \"(may need login)\",\n $OC09: \"API skill for OpenClaw\",\n $OC10: \"endpoints\",\n\n // Skill/tool markers\n $SK01: \"\",\n $SK02: \"\",\n $SK03: \"\",\n $SK04: \"\",\n\n // Schema patterns (very common in tool definitions)\n $T01: 'type: \"function\"',\n $T02: '\"type\": \"function\"',\n $T03: '\"type\": \"string\"',\n $T04: '\"type\": \"object\"',\n $T05: '\"type\": \"array\"',\n $T06: '\"type\": \"boolean\"',\n $T07: '\"type\": \"number\"',\n\n // Common descriptions\n $D01: \"description:\",\n $D02: '\"description\":',\n\n // Common instructions\n $I01: \"You are a personal assistant\",\n $I02: \"Tool names are case-sensitive\",\n $I03: \"Call tools exactly as listed\",\n $I04: \"Use when\",\n $I05: \"without asking\",\n\n // Safety phrases\n $S01: \"Do not manipulate or persuade\",\n $S02: \"Prioritize safety and human oversight\",\n $S03: \"unless explicitly requested\",\n\n // JSON patterns\n $J01: '\"required\": [\"',\n $J02: '\"properties\": {',\n $J03: '\"additionalProperties\": false',\n\n // Heartbeat patterns\n $H01: \"HEARTBEAT_OK\",\n $H02: \"Read HEARTBEAT.md if it exists\",\n\n // Role markers\n $R01: '\"role\": \"system\"',\n $R02: '\"role\": \"user\"',\n $R03: '\"role\": \"assistant\"',\n $R04: '\"role\": \"tool\"',\n\n // Common endings/phrases\n $E01: \"would you like to\",\n $E02: \"Let me know if you\",\n $E03: \"internal APIs\",\n $E04: \"session cookies\",\n\n // BlockRun model aliases (common in prompts)\n $M01: \"blockrun/\",\n $M02: \"openai/\",\n $M03: \"anthropic/\",\n $M04: \"google/\",\n $M05: \"xai/\",\n};\n\n/**\n * Get the inverse codebook for decompression.\n */\nexport function getInverseCodebook(): Record {\n const inverse: Record = {};\n for (const [code, phrase] of Object.entries(STATIC_CODEBOOK)) {\n inverse[phrase] = code;\n }\n return inverse;\n}\n\n/**\n * Generate the codebook header for inclusion in system message.\n * LLMs can decode in-context using this header.\n */\nexport function generateCodebookHeader(\n usedCodes: Set,\n pathMap: Record = {},\n): string {\n if (usedCodes.size === 0 && Object.keys(pathMap).length === 0) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n // Add used dictionary codes\n if (usedCodes.size > 0) {\n const codeEntries = Array.from(usedCodes)\n .map((code) => `${code}=${STATIC_CODEBOOK[code]}`)\n .join(\", \");\n parts.push(`[Dict: ${codeEntries}]`);\n }\n\n // Add path map\n if (Object.keys(pathMap).length > 0) {\n const pathEntries = Object.entries(pathMap)\n .map(([code, path]) => `${code}=${path}`)\n .join(\", \");\n parts.push(`[Paths: ${pathEntries}]`);\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Decompress a string using the codebook (for logging).\n */\nexport function decompressContent(\n content: string,\n codebook: Record = STATIC_CODEBOOK,\n): string {\n let result = content;\n for (const [code, phrase] of Object.entries(codebook)) {\n result = result.split(code).join(phrase);\n }\n return result;\n}\n","/**\n * Layer 3: Dictionary Encoding\n *\n * Replaces frequently repeated long phrases with short codes.\n * Uses a static codebook of common patterns from production logs.\n *\n * Safe for LLM: Reversible substitution with codebook header.\n * Expected savings: 4-8%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\nimport { getInverseCodebook } from \"../codebook.js\";\n\nexport interface DictionaryResult {\n messages: NormalizedMessage[];\n substitutionCount: number;\n usedCodes: Set;\n charsSaved: number;\n}\n\n/**\n * Apply dictionary encoding to a string.\n * Returns the encoded string and stats.\n */\nfunction encodeContent(\n content: string,\n inverseCodebook: Record,\n): { encoded: string; substitutions: number; codes: Set; charsSaved: number } {\n // Defensive type check - content might be array/object for multimodal messages\n if (!content || typeof content !== \"string\") {\n return { encoded: content, substitutions: 0, codes: new Set(), charsSaved: 0 };\n }\n let encoded = content;\n let substitutions = 0;\n let charsSaved = 0;\n const codes = new Set();\n\n // Sort phrases by length (longest first) to avoid partial matches\n const phrases = Object.keys(inverseCodebook).sort((a, b) => b.length - a.length);\n\n for (const phrase of phrases) {\n const code = inverseCodebook[phrase];\n const regex = new RegExp(escapeRegex(phrase), \"g\");\n const matches = encoded.match(regex);\n\n if (matches && matches.length > 0) {\n encoded = encoded.replace(regex, code);\n substitutions += matches.length;\n charsSaved += matches.length * (phrase.length - code.length);\n codes.add(code);\n }\n }\n\n return { encoded, substitutions, codes, charsSaved };\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Apply dictionary encoding to all messages.\n */\nexport function encodeMessages(messages: NormalizedMessage[]): DictionaryResult {\n const inverseCodebook = getInverseCodebook();\n let totalSubstitutions = 0;\n let totalCharsSaved = 0;\n const allUsedCodes = new Set();\n\n const result = messages.map((message) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") return message;\n\n const { encoded, substitutions, codes, charsSaved } = encodeContent(\n message.content,\n inverseCodebook,\n );\n\n totalSubstitutions += substitutions;\n totalCharsSaved += charsSaved;\n codes.forEach((code) => allUsedCodes.add(code));\n\n return {\n ...message,\n content: encoded,\n };\n });\n\n return {\n messages: result,\n substitutionCount: totalSubstitutions,\n usedCodes: allUsedCodes,\n charsSaved: totalCharsSaved,\n };\n}\n","/**\n * Layer 4: Path Shortening\n *\n * Detects common filesystem path prefixes and replaces them with short codes.\n * Common in coding assistant contexts with repeated file paths.\n *\n * Safe for LLM: Lossless abbreviation with path map header.\n * Expected savings: 1-3%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\nexport interface PathShorteningResult {\n messages: NormalizedMessage[];\n pathMap: Record; // $P1 -> /home/user/project/\n charsSaved: number;\n}\n\n// Regex to match filesystem paths\nconst PATH_REGEX = /(?:\\/[\\w.-]+){3,}/g;\n\n/**\n * Extract all paths from messages and find common prefixes.\n */\nfunction extractPaths(messages: NormalizedMessage[]): string[] {\n const paths: string[] = [];\n\n for (const message of messages) {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") continue;\n const matches = message.content.match(PATH_REGEX);\n if (matches) {\n paths.push(...matches);\n }\n }\n\n return paths;\n}\n\n/**\n * Group paths by their common prefixes.\n * Returns prefixes that appear at least 3 times.\n */\nfunction findFrequentPrefixes(paths: string[]): string[] {\n const prefixCounts = new Map();\n\n for (const path of paths) {\n const parts = path.split(\"/\").filter(Boolean);\n\n // Try prefixes of different lengths\n for (let i = 2; i < parts.length; i++) {\n const prefix = \"/\" + parts.slice(0, i).join(\"/\") + \"/\";\n prefixCounts.set(prefix, (prefixCounts.get(prefix) || 0) + 1);\n }\n }\n\n // Return prefixes that appear 3+ times, sorted by length (longest first)\n return Array.from(prefixCounts.entries())\n .filter(([, count]) => count >= 3)\n .sort((a, b) => b[0].length - a[0].length)\n .slice(0, 5) // Max 5 path codes\n .map(([prefix]) => prefix);\n}\n\n/**\n * Apply path shortening to all messages.\n */\nexport function shortenPaths(messages: NormalizedMessage[]): PathShorteningResult {\n const allPaths = extractPaths(messages);\n\n if (allPaths.length < 5) {\n // Not enough paths to benefit from shortening\n return {\n messages,\n pathMap: {},\n charsSaved: 0,\n };\n }\n\n const prefixes = findFrequentPrefixes(allPaths);\n\n if (prefixes.length === 0) {\n return {\n messages,\n pathMap: {},\n charsSaved: 0,\n };\n }\n\n // Create path map\n const pathMap: Record = {};\n prefixes.forEach((prefix, i) => {\n pathMap[`$P${i + 1}`] = prefix;\n });\n\n // Replace paths in messages\n let charsSaved = 0;\n\n const result = messages.map((message) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") return message;\n\n let content = message.content;\n const originalLength = content.length;\n\n // Replace prefixes (longest first to avoid partial replacements)\n for (const [code, prefix] of Object.entries(pathMap)) {\n content = content.split(prefix).join(code + \"/\");\n }\n\n charsSaved += originalLength - content.length;\n\n return {\n ...message,\n content,\n };\n });\n\n return {\n messages: result,\n pathMap,\n charsSaved,\n };\n}\n\n/**\n * Generate the path map header for the codebook.\n */\nexport function generatePathMapHeader(pathMap: Record): string {\n if (Object.keys(pathMap).length === 0) return \"\";\n\n const entries = Object.entries(pathMap)\n .map(([code, path]) => `${code}=${path}`)\n .join(\", \");\n\n return `[Paths: ${entries}]`;\n}\n","/**\n * Layer 5: JSON Compaction\n *\n * Minifies JSON in tool_call arguments and tool results.\n * Removes pretty-print whitespace from JSON strings.\n *\n * Safe for LLM: JSON semantics unchanged.\n * Expected savings: 2-4%\n */\n\nimport { NormalizedMessage, ToolCall } from \"../types.js\";\n\nexport interface JsonCompactResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n}\n\n/**\n * Compact a JSON string by parsing and re-stringifying without formatting.\n */\nfunction compactJson(jsonString: string): string {\n try {\n const parsed = JSON.parse(jsonString);\n return JSON.stringify(parsed);\n } catch {\n // Not valid JSON, return as-is\n return jsonString;\n }\n}\n\n/**\n * Check if a string looks like JSON (starts with { or [).\n */\nfunction looksLikeJson(str: string): boolean {\n const trimmed = str.trim();\n return (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n );\n}\n\n/**\n * Compact tool_call arguments in a message.\n */\nfunction compactToolCalls(toolCalls: ToolCall[]): ToolCall[] {\n return toolCalls.map((tc) => ({\n ...tc,\n function: {\n ...tc.function,\n arguments: compactJson(tc.function.arguments),\n },\n }));\n}\n\n/**\n * Apply JSON compaction to all messages.\n *\n * Targets:\n * - tool_call arguments (in assistant messages)\n * - tool message content (often JSON)\n */\nexport function compactMessagesJson(messages: NormalizedMessage[]): JsonCompactResult {\n let charsSaved = 0;\n\n const result = messages.map((message) => {\n const newMessage = { ...message };\n\n // Compact tool_calls arguments\n if (message.tool_calls && message.tool_calls.length > 0) {\n const originalLength = JSON.stringify(message.tool_calls).length;\n newMessage.tool_calls = compactToolCalls(message.tool_calls);\n const newLength = JSON.stringify(newMessage.tool_calls).length;\n charsSaved += originalLength - newLength;\n }\n\n // Compact tool message content if it looks like JSON\n // Only process string content (skip arrays for multimodal messages)\n if (\n message.role === \"tool\" &&\n message.content &&\n typeof message.content === \"string\" &&\n looksLikeJson(message.content)\n ) {\n const originalLength = message.content.length;\n const compacted = compactJson(message.content);\n charsSaved += originalLength - compacted.length;\n newMessage.content = compacted;\n }\n\n return newMessage;\n });\n\n return {\n messages: result,\n charsSaved,\n };\n}\n","/**\n * L6: Observation Compression (AGGRESSIVE)\n *\n * Inspired by claw-compactor's 97% compression on tool results.\n * Tool call results (especially large ones) are summarized to key info only.\n *\n * This is the biggest compression win - tool outputs can be 10KB+ but\n * only ~200 chars of actual useful information.\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\ninterface ObservationResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n observationsCompressed: number;\n}\n\n// Max length for tool results before compression kicks in\nconst TOOL_RESULT_THRESHOLD = 500;\n\n// Max length to compress tool results down to\nconst COMPRESSED_RESULT_MAX = 300;\n\n/**\n * Extract key information from tool result.\n * Keeps: errors, key values, status, first/last important lines.\n */\nfunction compressToolResult(content: string): string {\n if (!content || content.length <= TOOL_RESULT_THRESHOLD) {\n return content;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean);\n\n // Priority 1: Error messages (always keep)\n const errorLines = lines.filter(\n (l) => /error|exception|failed|denied|refused|timeout|invalid/i.test(l) && l.length < 200,\n );\n\n // Priority 2: Status/result lines\n const statusLines = lines.filter(\n (l) =>\n /success|complete|created|updated|found|result|status|total|count/i.test(l) && l.length < 150,\n );\n\n // Priority 3: Key JSON fields (extract important values)\n const jsonMatches: string[] = [];\n const jsonPattern = /\"(id|name|status|error|message|count|total|url|path)\":\\s*\"?([^\",}\\n]+)\"?/gi;\n let match;\n while ((match = jsonPattern.exec(content)) !== null) {\n jsonMatches.push(`${match[1]}: ${match[2].slice(0, 50)}`);\n }\n\n // Priority 4: First and last meaningful lines\n const firstLine = lines[0]?.slice(0, 100);\n const lastLine = lines.length > 1 ? lines[lines.length - 1]?.slice(0, 100) : \"\";\n\n // Build compressed observation\n const parts: string[] = [];\n\n if (errorLines.length > 0) {\n parts.push(\"[ERR] \" + errorLines.slice(0, 3).join(\" | \"));\n }\n\n if (statusLines.length > 0) {\n parts.push(statusLines.slice(0, 3).join(\" | \"));\n }\n\n if (jsonMatches.length > 0) {\n parts.push(jsonMatches.slice(0, 5).join(\", \"));\n }\n\n if (parts.length === 0) {\n // Fallback: keep first/last lines with truncation marker\n parts.push(firstLine || \"\");\n if (lines.length > 2) {\n parts.push(`[...${lines.length - 2} lines...]`);\n }\n if (lastLine && lastLine !== firstLine) {\n parts.push(lastLine);\n }\n }\n\n let result = parts.join(\"\\n\");\n\n // Final length cap\n if (result.length > COMPRESSED_RESULT_MAX) {\n result = result.slice(0, COMPRESSED_RESULT_MAX - 20) + \"\\n[...truncated]\";\n }\n\n return result;\n}\n\n/**\n * Compress large repeated content blocks.\n * Detects when same large block appears multiple times.\n */\nfunction deduplicateLargeBlocks(messages: NormalizedMessage[]): {\n messages: NormalizedMessage[];\n charsSaved: number;\n} {\n const blockHashes = new Map(); // hash -> first occurrence index\n let charsSaved = 0;\n\n const result = messages.map((msg, idx) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!msg.content || typeof msg.content !== \"string\" || msg.content.length < 500) {\n return msg;\n }\n\n // Hash first 200 chars as block identifier\n const blockKey = msg.content.slice(0, 200);\n\n if (blockHashes.has(blockKey)) {\n const firstIdx = blockHashes.get(blockKey)!;\n const original = msg.content;\n const compressed = `[See message #${firstIdx + 1} - same content]`;\n charsSaved += original.length - compressed.length;\n return { ...msg, content: compressed };\n }\n\n blockHashes.set(blockKey, idx);\n return msg;\n });\n\n return { messages: result, charsSaved };\n}\n\n/**\n * Compress tool results in messages.\n */\nexport function compressObservations(messages: NormalizedMessage[]): ObservationResult {\n let charsSaved = 0;\n let observationsCompressed = 0;\n\n // First pass: compress individual tool results\n let result = messages.map((msg) => {\n // Only compress tool role messages (these are tool call results)\n // Only process string content (skip arrays for multimodal messages)\n if (msg.role !== \"tool\" || !msg.content || typeof msg.content !== \"string\") {\n return msg;\n }\n\n const original = msg.content;\n if (original.length <= TOOL_RESULT_THRESHOLD) {\n return msg;\n }\n\n const compressed = compressToolResult(original);\n const saved = original.length - compressed.length;\n\n if (saved > 50) {\n charsSaved += saved;\n observationsCompressed++;\n return { ...msg, content: compressed };\n }\n\n return msg;\n });\n\n // Second pass: deduplicate large repeated blocks\n const dedupResult = deduplicateLargeBlocks(result);\n result = dedupResult.messages;\n charsSaved += dedupResult.charsSaved;\n\n return {\n messages: result,\n charsSaved,\n observationsCompressed,\n };\n}\n","/**\n * L7: Dynamic Codebook Builder\n *\n * Inspired by claw-compactor's frequency-based codebook.\n * Builds codebook from actual content being compressed,\n * rather than relying on static patterns.\n *\n * Finds phrases that appear 3+ times and replaces with short codes.\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\ninterface DynamicCodebookResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n dynamicCodes: Record; // code -> phrase\n substitutions: number;\n}\n\n// Config\nconst MIN_PHRASE_LENGTH = 20;\nconst MAX_PHRASE_LENGTH = 200;\nconst MIN_FREQUENCY = 3;\nconst MAX_ENTRIES = 100;\nconst CODE_PREFIX = \"$D\"; // Dynamic codes: $D01, $D02, etc.\n\n/**\n * Find repeated phrases in content.\n */\nfunction findRepeatedPhrases(allContent: string): Map {\n const phrases = new Map();\n\n // Split by sentence-like boundaries\n const segments = allContent.split(/(?<=[.!?\\n])\\s+/);\n\n for (const segment of segments) {\n const trimmed = segment.trim();\n if (trimmed.length >= MIN_PHRASE_LENGTH && trimmed.length <= MAX_PHRASE_LENGTH) {\n phrases.set(trimmed, (phrases.get(trimmed) || 0) + 1);\n }\n }\n\n // Also find repeated lines\n const lines = allContent.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length >= MIN_PHRASE_LENGTH && trimmed.length <= MAX_PHRASE_LENGTH) {\n phrases.set(trimmed, (phrases.get(trimmed) || 0) + 1);\n }\n }\n\n return phrases;\n}\n\n/**\n * Build dynamic codebook from message content.\n */\nfunction buildDynamicCodebook(messages: NormalizedMessage[]): Record {\n // Combine all content\n let allContent = \"\";\n for (const msg of messages) {\n // Only process string content (skip arrays for multimodal messages)\n if (msg.content && typeof msg.content === \"string\") {\n allContent += msg.content + \"\\n\";\n }\n }\n\n // Find repeated phrases\n const phrases = findRepeatedPhrases(allContent);\n\n // Filter by frequency and sort by savings potential\n const candidates: Array<{ phrase: string; count: number; savings: number }> = [];\n for (const [phrase, count] of phrases.entries()) {\n if (count >= MIN_FREQUENCY) {\n // Savings = (phrase length - code length) * occurrences\n const codeLength = 4; // e.g., \"$D01\"\n const savings = (phrase.length - codeLength) * count;\n if (savings > 50) {\n candidates.push({ phrase, count, savings });\n }\n }\n }\n\n // Sort by savings (descending) and take top entries\n candidates.sort((a, b) => b.savings - a.savings);\n const topCandidates = candidates.slice(0, MAX_ENTRIES);\n\n // Build codebook\n const codebook: Record = {};\n topCandidates.forEach((c, i) => {\n const code = `${CODE_PREFIX}${String(i + 1).padStart(2, \"0\")}`;\n codebook[code] = c.phrase;\n });\n\n return codebook;\n}\n\n/**\n * Escape special regex characters.\n */\nfunction escapeRegex(str: string): string {\n // Defensive type check\n if (!str || typeof str !== \"string\") return \"\";\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Apply dynamic codebook to messages.\n */\nexport function applyDynamicCodebook(messages: NormalizedMessage[]): DynamicCodebookResult {\n // Build codebook from content\n const codebook = buildDynamicCodebook(messages);\n\n if (Object.keys(codebook).length === 0) {\n return {\n messages,\n charsSaved: 0,\n dynamicCodes: {},\n substitutions: 0,\n };\n }\n\n // Create inverse map for replacement\n const phraseToCode: Record = {};\n for (const [code, phrase] of Object.entries(codebook)) {\n phraseToCode[phrase] = code;\n }\n\n // Sort phrases by length (longest first) to avoid partial replacements\n const sortedPhrases = Object.keys(phraseToCode).sort((a, b) => b.length - a.length);\n\n let charsSaved = 0;\n let substitutions = 0;\n\n // Apply replacements\n const result = messages.map((msg) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!msg.content || typeof msg.content !== \"string\") return msg;\n\n let content = msg.content;\n for (const phrase of sortedPhrases) {\n const code = phraseToCode[phrase];\n const regex = new RegExp(escapeRegex(phrase), \"g\");\n const matches = content.match(regex);\n if (matches) {\n content = content.replace(regex, code);\n charsSaved += (phrase.length - code.length) * matches.length;\n substitutions += matches.length;\n }\n }\n\n return { ...msg, content };\n });\n\n return {\n messages: result,\n charsSaved,\n dynamicCodes: codebook,\n substitutions,\n };\n}\n\n/**\n * Generate header for dynamic codes (to include in system message).\n */\nexport function generateDynamicCodebookHeader(codebook: Record): string {\n if (Object.keys(codebook).length === 0) return \"\";\n\n const entries = Object.entries(codebook)\n .slice(0, 20) // Limit header size\n .map(([code, phrase]) => {\n // Truncate long phrases in header\n const displayPhrase = phrase.length > 40 ? phrase.slice(0, 37) + \"...\" : phrase;\n return `${code}=${displayPhrase}`;\n })\n .join(\", \");\n\n return `[DynDict: ${entries}]`;\n}\n","/**\n * LLM-Safe Context Compression\n *\n * Reduces token usage by 15-40% while preserving semantic meaning.\n * Implements 7 compression layers inspired by claw-compactor.\n *\n * Usage:\n * const result = await compressContext(messages);\n * // result.messages -> compressed version to send to provider\n * // result.originalMessages -> original for logging\n */\n\nimport {\n NormalizedMessage,\n CompressionConfig,\n CompressionResult,\n CompressionStats,\n DEFAULT_COMPRESSION_CONFIG,\n} from \"./types.js\";\nimport { deduplicateMessages } from \"./layers/deduplication.js\";\nimport { normalizeMessagesWhitespace } from \"./layers/whitespace.js\";\nimport { encodeMessages } from \"./layers/dictionary.js\";\nimport { shortenPaths } from \"./layers/paths.js\";\nimport { compactMessagesJson } from \"./layers/json-compact.js\";\nimport { compressObservations } from \"./layers/observation.js\";\nimport { applyDynamicCodebook, generateDynamicCodebookHeader } from \"./layers/dynamic-codebook.js\";\nimport { generateCodebookHeader, STATIC_CODEBOOK } from \"./codebook.js\";\n\nexport * from \"./types.js\";\nexport { STATIC_CODEBOOK } from \"./codebook.js\";\n\n/**\n * Calculate total character count for messages.\n */\nfunction calculateTotalChars(messages: NormalizedMessage[]): number {\n return messages.reduce((total, msg) => {\n let chars = 0;\n if (typeof msg.content === \"string\") {\n chars = msg.content.length;\n } else if (Array.isArray(msg.content)) {\n // For multimodal content, stringify to get approximate size\n chars = JSON.stringify(msg.content).length;\n }\n if (msg.tool_calls) {\n chars += JSON.stringify(msg.tool_calls).length;\n }\n return total + chars;\n }, 0);\n}\n\n/**\n * Deep clone messages to preserve originals.\n */\nfunction cloneMessages(messages: NormalizedMessage[]): NormalizedMessage[] {\n return JSON.parse(JSON.stringify(messages));\n}\n\n/**\n * Prepend codebook header to the first USER message (not system).\n *\n * Why not system message?\n * - Google Gemini uses systemInstruction which doesn't support codebook format\n * - The codebook header in user message is still visible to all LLMs\n * - This ensures compatibility across all providers\n */\nfunction prependCodebookHeader(\n messages: NormalizedMessage[],\n usedCodes: Set,\n pathMap: Record,\n): NormalizedMessage[] {\n const header = generateCodebookHeader(usedCodes, pathMap);\n if (!header) return messages;\n\n // Find first user message (not system - Google's systemInstruction doesn't support codebook)\n const userIndex = messages.findIndex((m) => m.role === \"user\");\n\n if (userIndex === -1) {\n // No user message, add codebook as system (fallback)\n return [{ role: \"system\", content: header }, ...messages];\n }\n\n // Prepend to first user message (only if content is a string)\n return messages.map((msg, i) => {\n if (i === userIndex) {\n // Only prepend to string content - skip arrays (multimodal messages)\n if (typeof msg.content === \"string\") {\n return {\n ...msg,\n content: `${header}\\n\\n${msg.content}`,\n };\n }\n // For non-string content, don't modify the message\n // The codebook header would corrupt array content\n }\n return msg;\n });\n}\n\n/**\n * Main compression function.\n *\n * Applies 5 layers in sequence:\n * 1. Deduplication - Remove exact duplicate messages\n * 2. Whitespace - Normalize excessive whitespace\n * 3. Dictionary - Replace common phrases with codes\n * 4. Paths - Shorten repeated file paths\n * 5. JSON - Compact JSON in tool calls\n *\n * Then prepends a codebook header for the LLM to decode in-context.\n */\nexport async function compressContext(\n messages: NormalizedMessage[],\n config: Partial = {},\n): Promise {\n const fullConfig: CompressionConfig = {\n ...DEFAULT_COMPRESSION_CONFIG,\n ...config,\n layers: {\n ...DEFAULT_COMPRESSION_CONFIG.layers,\n ...config.layers,\n },\n dictionary: {\n ...DEFAULT_COMPRESSION_CONFIG.dictionary,\n ...config.dictionary,\n },\n };\n\n // If compression disabled, return as-is\n if (!fullConfig.enabled) {\n const originalChars = calculateTotalChars(messages);\n return {\n messages,\n originalMessages: messages,\n originalChars,\n compressedChars: originalChars,\n compressionRatio: 1,\n stats: {\n duplicatesRemoved: 0,\n whitespaceSavedChars: 0,\n dictionarySubstitutions: 0,\n pathsShortened: 0,\n jsonCompactedChars: 0,\n observationsCompressed: 0,\n observationCharsSaved: 0,\n dynamicSubstitutions: 0,\n dynamicCharsSaved: 0,\n },\n codebook: {},\n pathMap: {},\n dynamicCodes: {},\n };\n }\n\n // Preserve originals for logging\n const originalMessages = fullConfig.preserveRaw ? cloneMessages(messages) : messages;\n const originalChars = calculateTotalChars(messages);\n\n // Initialize stats\n const stats: CompressionStats = {\n duplicatesRemoved: 0,\n whitespaceSavedChars: 0,\n dictionarySubstitutions: 0,\n pathsShortened: 0,\n jsonCompactedChars: 0,\n observationsCompressed: 0,\n observationCharsSaved: 0,\n dynamicSubstitutions: 0,\n dynamicCharsSaved: 0,\n };\n\n let result = cloneMessages(messages);\n let usedCodes = new Set();\n let pathMap: Record = {};\n let dynamicCodes: Record = {};\n\n // Layer 1: Deduplication\n if (fullConfig.layers.deduplication) {\n const dedupResult = deduplicateMessages(result);\n result = dedupResult.messages;\n stats.duplicatesRemoved = dedupResult.duplicatesRemoved;\n }\n\n // Layer 2: Whitespace normalization\n if (fullConfig.layers.whitespace) {\n const wsResult = normalizeMessagesWhitespace(result);\n result = wsResult.messages;\n stats.whitespaceSavedChars = wsResult.charsSaved;\n }\n\n // Layer 3: Dictionary encoding\n if (fullConfig.layers.dictionary) {\n const dictResult = encodeMessages(result);\n result = dictResult.messages;\n stats.dictionarySubstitutions = dictResult.substitutionCount;\n usedCodes = dictResult.usedCodes;\n }\n\n // Layer 4: Path shortening\n if (fullConfig.layers.paths) {\n const pathResult = shortenPaths(result);\n result = pathResult.messages;\n pathMap = pathResult.pathMap;\n stats.pathsShortened = Object.keys(pathMap).length;\n }\n\n // Layer 5: JSON compaction\n if (fullConfig.layers.jsonCompact) {\n const jsonResult = compactMessagesJson(result);\n result = jsonResult.messages;\n stats.jsonCompactedChars = jsonResult.charsSaved;\n }\n\n // Layer 6: Observation compression (BIG WIN - 97% on tool results)\n if (fullConfig.layers.observation) {\n const obsResult = compressObservations(result);\n result = obsResult.messages;\n stats.observationsCompressed = obsResult.observationsCompressed;\n stats.observationCharsSaved = obsResult.charsSaved;\n }\n\n // Layer 7: Dynamic codebook (learns from actual content)\n if (fullConfig.layers.dynamicCodebook) {\n const dynResult = applyDynamicCodebook(result);\n result = dynResult.messages;\n stats.dynamicSubstitutions = dynResult.substitutions;\n stats.dynamicCharsSaved = dynResult.charsSaved;\n dynamicCodes = dynResult.dynamicCodes;\n }\n\n // Add codebook header if enabled and we have codes to include\n if (\n fullConfig.dictionary.includeCodebookHeader &&\n (usedCodes.size > 0 || Object.keys(pathMap).length > 0 || Object.keys(dynamicCodes).length > 0)\n ) {\n result = prependCodebookHeader(result, usedCodes, pathMap);\n // Also add dynamic codebook header if we have dynamic codes\n if (Object.keys(dynamicCodes).length > 0) {\n const dynHeader = generateDynamicCodebookHeader(dynamicCodes);\n if (dynHeader) {\n const systemIndex = result.findIndex((m) => m.role === \"system\");\n // Only prepend to string content - skip arrays (multimodal messages)\n if (systemIndex >= 0 && typeof result[systemIndex].content === \"string\") {\n result[systemIndex] = {\n ...result[systemIndex],\n content: `${dynHeader}\\n${result[systemIndex].content}`,\n };\n }\n }\n }\n }\n\n // Calculate final stats\n const compressedChars = calculateTotalChars(result);\n const compressionRatio = compressedChars / originalChars;\n\n // Build used codebook for logging\n const usedCodebook: Record = {};\n usedCodes.forEach((code) => {\n usedCodebook[code] = STATIC_CODEBOOK[code];\n });\n\n return {\n messages: result,\n originalMessages,\n originalChars,\n compressedChars,\n compressionRatio,\n stats,\n codebook: usedCodebook,\n pathMap,\n dynamicCodes,\n };\n}\n\n/**\n * Quick check if compression would benefit these messages.\n * Returns true if messages are large enough to warrant compression.\n */\nexport function shouldCompress(messages: NormalizedMessage[]): boolean {\n const chars = calculateTotalChars(messages);\n // Only compress if > 5000 chars (roughly 1000 tokens)\n return chars > 5000;\n}\n","/**\n * Session Persistence Store\n *\n * Tracks model selections per session to prevent model switching mid-task.\n * When a session is active, the router will continue using the same model\n * instead of re-routing each request.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport type SessionEntry = {\n model: string;\n tier: string;\n createdAt: number;\n lastUsedAt: number;\n requestCount: number;\n /**\n * `true` when the user explicitly chose this model (e.g. /model command in\n * OpenClaw or sending an explicit non-profile model in the request body).\n * Explicit pins are sticky — they're NOT overridden by tier escalation when\n * a future routing-profile request comes in. The user's intent wins.\n */\n userExplicit?: boolean;\n // --- Three-strike escalation ---\n recentHashes: string[]; // Sliding window of last 3 request content fingerprints\n strikes: number; // Consecutive similar request count\n escalated: boolean; // Whether session was already escalated via three-strike\n // --- Cost accumulation for maxCostPerRun ---\n sessionCostMicros: bigint; // Total estimated cost for this session run (USDC 6-decimal)\n};\n\nexport type SessionConfig = {\n /** Enable session persistence (default: false) */\n enabled: boolean;\n /** Session timeout in ms (default: 30 minutes) */\n timeoutMs: number;\n /** Header name for session ID (default: X-Session-ID) */\n headerName: string;\n};\n\nexport const DEFAULT_SESSION_CONFIG: SessionConfig = {\n enabled: true,\n timeoutMs: 30 * 60 * 1000, // 30 minutes\n headerName: \"x-session-id\",\n};\n\n/**\n * Session persistence store for maintaining model selections.\n */\nexport class SessionStore {\n private sessions: Map = new Map();\n private config: SessionConfig;\n private cleanupInterval: ReturnType | null = null;\n\n constructor(config: Partial = {}) {\n this.config = { ...DEFAULT_SESSION_CONFIG, ...config };\n\n // Start cleanup interval (every 5 minutes)\n if (this.config.enabled) {\n this.cleanupInterval = setInterval(() => this.cleanup(), 5 * 60 * 1000);\n }\n }\n\n /**\n * Get the pinned model for a session, if any.\n */\n getSession(sessionId: string): SessionEntry | undefined {\n if (!this.config.enabled || !sessionId) {\n return undefined;\n }\n\n const entry = this.sessions.get(sessionId);\n if (!entry) {\n return undefined;\n }\n\n // Check if session has expired\n const now = Date.now();\n if (now - entry.lastUsedAt > this.config.timeoutMs) {\n this.sessions.delete(sessionId);\n return undefined;\n }\n\n return entry;\n }\n\n /**\n * Pin a model to a session.\n *\n * Pass `userExplicit: true` when the user explicitly chose this model\n * (e.g. via /model command or by sending an explicit non-profile model).\n * Explicit pins are sticky — they survive tier-escalation comparisons so\n * that the user's choice keeps winning even if subsequent requests use a\n * routing profile that would normally re-route.\n */\n setSession(sessionId: string, model: string, tier: string, userExplicit?: boolean): void {\n if (!this.config.enabled || !sessionId) {\n return;\n }\n\n const existing = this.sessions.get(sessionId);\n const now = Date.now();\n\n if (existing) {\n existing.lastUsedAt = now;\n existing.requestCount++;\n // Update model if different (e.g., fallback)\n if (existing.model !== model) {\n existing.model = model;\n existing.tier = tier;\n }\n // Promote to explicit if the latest call upgraded it; do not silently\n // demote an existing explicit pin to auto-routed.\n if (userExplicit) {\n existing.userExplicit = true;\n }\n } else {\n this.sessions.set(sessionId, {\n model,\n tier,\n createdAt: now,\n lastUsedAt: now,\n requestCount: 1,\n userExplicit: userExplicit || undefined,\n recentHashes: [],\n strikes: 0,\n escalated: false,\n sessionCostMicros: 0n,\n });\n }\n }\n\n /**\n * Touch a session to extend its timeout.\n */\n touchSession(sessionId: string): void {\n if (!this.config.enabled || !sessionId) {\n return;\n }\n\n const entry = this.sessions.get(sessionId);\n if (entry) {\n entry.lastUsedAt = Date.now();\n entry.requestCount++;\n }\n }\n\n /**\n * Clear a specific session.\n */\n clearSession(sessionId: string): void {\n this.sessions.delete(sessionId);\n }\n\n /**\n * Clear all sessions.\n */\n clearAll(): void {\n this.sessions.clear();\n }\n\n /**\n * Get session stats for debugging.\n */\n getStats(): { count: number; sessions: Array<{ id: string; model: string; age: number }> } {\n const now = Date.now();\n const sessions = Array.from(this.sessions.entries()).map(([id, entry]) => ({\n id: id.slice(0, 8) + \"...\",\n model: entry.model,\n age: Math.round((now - entry.createdAt) / 1000),\n }));\n return { count: this.sessions.size, sessions };\n }\n\n /**\n * Clean up expired sessions.\n */\n private cleanup(): void {\n const now = Date.now();\n for (const [id, entry] of this.sessions) {\n if (now - entry.lastUsedAt > this.config.timeoutMs) {\n this.sessions.delete(id);\n }\n }\n }\n\n /**\n * Record a request content hash and detect repetitive patterns.\n * Returns true if escalation should be triggered (3+ consecutive similar requests).\n */\n recordRequestHash(sessionId: string, hash: string): boolean {\n const entry = this.sessions.get(sessionId);\n if (!entry) return false;\n\n const prev = entry.recentHashes;\n if (prev.length > 0 && prev[prev.length - 1] === hash) {\n entry.strikes++;\n } else {\n entry.strikes = 0;\n }\n\n entry.recentHashes.push(hash);\n if (entry.recentHashes.length > 3) {\n entry.recentHashes.shift();\n }\n\n return entry.strikes >= 2 && !entry.escalated;\n }\n\n /**\n * Escalate session to next tier. Returns the new model/tier or null if already at max.\n */\n escalateSession(\n sessionId: string,\n tierConfigs: Record,\n ): { model: string; tier: string } | null {\n const entry = this.sessions.get(sessionId);\n if (!entry) return null;\n\n const TIER_ORDER = [\"SIMPLE\", \"MEDIUM\", \"COMPLEX\", \"REASONING\"];\n const currentIdx = TIER_ORDER.indexOf(entry.tier);\n if (currentIdx < 0 || currentIdx >= TIER_ORDER.length - 1) return null;\n\n const nextTier = TIER_ORDER[currentIdx + 1];\n const nextConfig = tierConfigs[nextTier];\n if (!nextConfig) return null;\n\n entry.model = nextConfig.primary;\n entry.tier = nextTier;\n entry.strikes = 0;\n entry.escalated = true;\n\n return { model: nextConfig.primary, tier: nextTier };\n }\n\n /**\n * Add cost to a session's running total for maxCostPerRun tracking.\n * Cost is in USDC 6-decimal units (micros).\n * Creates a cost-tracking-only entry if none exists (e.g., explicit model requests\n * that never go through the routing path).\n */\n addSessionCost(sessionId: string, additionalMicros: bigint): void {\n let entry = this.sessions.get(sessionId);\n if (!entry) {\n const now = Date.now();\n entry = {\n model: \"\",\n tier: \"DIRECT\",\n createdAt: now,\n lastUsedAt: now,\n requestCount: 0,\n recentHashes: [],\n strikes: 0,\n escalated: false,\n sessionCostMicros: 0n,\n };\n this.sessions.set(sessionId, entry);\n }\n entry.sessionCostMicros += additionalMicros;\n }\n\n /**\n * Get the total accumulated cost for a session in USD.\n */\n getSessionCostUsd(sessionId: string): number {\n const entry = this.sessions.get(sessionId);\n if (!entry) return 0;\n return Number(entry.sessionCostMicros) / 1_000_000;\n }\n\n /**\n * Stop the cleanup interval.\n */\n close(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n }\n}\n\n/**\n * Generate a session ID from request headers or create a default.\n */\nexport function getSessionId(\n headers: Record,\n headerName: string = DEFAULT_SESSION_CONFIG.headerName,\n): string | undefined {\n const value = headers[headerName] || headers[headerName.toLowerCase()];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n if (Array.isArray(value) && value.length > 0) {\n return value[0];\n }\n return undefined;\n}\n\n/**\n * Derive a stable session ID from message content when no explicit session\n * header is provided. Uses the first user message as the conversation anchor —\n * same opening message = same session ID across all subsequent turns.\n *\n * This prevents model-switching mid-conversation even when OpenClaw doesn't\n * send an x-session-id header (which is the default OpenClaw behaviour).\n */\nexport function deriveSessionId(\n messages: Array<{ role: string; content: unknown }>,\n): string | undefined {\n const firstUser = messages.find((m) => m.role === \"user\");\n if (!firstUser) return undefined;\n\n const content =\n typeof firstUser.content === \"string\" ? firstUser.content : JSON.stringify(firstUser.content);\n\n // 8-char hex prefix of SHA-256 — short enough for logs, collision-resistant\n // enough for session tracking within a single gateway instance.\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 8);\n}\n\n/**\n * Generate a short hash fingerprint from request content.\n * Captures: last user message text + tool call names (if any).\n * Normalizes whitespace to avoid false negatives from minor formatting diffs.\n */\nexport function hashRequestContent(lastUserContent: string, toolCallNames?: string[]): string {\n const normalized = lastUserContent.replace(/\\s+/g, \" \").trim().slice(0, 500);\n const toolSuffix = toolCallNames?.length ? `|tools:${toolCallNames.sort().join(\",\")}` : \"\";\n return createHash(\"sha256\")\n .update(normalized + toolSuffix)\n .digest(\"hex\")\n .slice(0, 12);\n}\n","/**\n * Auto-update checker for ClawRouter.\n * Checks npm registry on startup and notifies user if update available.\n */\n\nimport { VERSION } from \"./version.js\";\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org/@blockrun/xclawrouter/latest\";\nconst CHECK_TIMEOUT_MS = 5_000; // Don't block startup for more than 5s\n\n/**\n * Compare semver versions. Returns:\n * 1 if a > b\n * 0 if a === b\n * -1 if a < b\n */\nfunction compareSemver(a: string, b: string): number {\n const pa = a.split(\".\").map(Number);\n const pb = b.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] || 0) > (pb[i] || 0)) return 1;\n if ((pa[i] || 0) < (pb[i] || 0)) return -1;\n }\n return 0;\n}\n\n/**\n * Check npm registry for latest version.\n * Non-blocking, silent on errors.\n */\nexport async function checkForUpdates(): Promise {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);\n\n const res = await fetch(NPM_REGISTRY, {\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeout);\n\n if (!res.ok) return;\n\n const data = (await res.json()) as { version?: string };\n const latest = data.version;\n\n if (!latest) return;\n\n if (compareSemver(latest, VERSION) > 0) {\n console.log(\"\");\n console.log(`\\x1b[33m⬆️ XClawRouter ${latest} available (you have ${VERSION})\\x1b[0m`);\n console.log(` Run: \\x1b[36mnpx @blockrun/xclawrouter@latest\\x1b[0m`);\n console.log(` Docs: \\x1b[36mhttps://blockrun.ai/clawrouter.md\\x1b[0m`);\n console.log(\"\");\n }\n } catch {\n // Silent fail - don't disrupt startup\n }\n}\n","/**\n * Exclude-models persistence module.\n *\n * Manages a user-configurable list of model IDs that the smart router\n * should never select. Stored as a sorted JSON array on disk.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { resolveModelAlias } from \"./models.js\";\n\nconst DEFAULT_FILE_PATH = join(homedir(), \".openclaw\", \"blockrun\", \"exclude-models.json\");\n\n/**\n * Load the exclude list from disk.\n * Returns an empty set if the file does not exist.\n */\nexport function loadExcludeList(filePath: string = DEFAULT_FILE_PATH): Set {\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const arr: unknown = JSON.parse(raw);\n if (Array.isArray(arr)) {\n return new Set(arr.filter((x): x is string => typeof x === \"string\"));\n }\n return new Set();\n } catch {\n return new Set();\n }\n}\n\n/**\n * Save a set of model IDs to disk as a sorted JSON array.\n */\nfunction saveExcludeList(set: Set, filePath: string): void {\n const sorted = [...set].sort();\n const dir = dirname(filePath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, JSON.stringify(sorted, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Add a model to the exclude list.\n * Resolves aliases before persisting.\n * @returns The resolved model ID.\n */\nexport function addExclusion(model: string, filePath: string = DEFAULT_FILE_PATH): string {\n const resolved = resolveModelAlias(model);\n const set = loadExcludeList(filePath);\n set.add(resolved);\n saveExcludeList(set, filePath);\n return resolved;\n}\n\n/**\n * Remove a model from the exclude list.\n * Resolves aliases before removing.\n * @returns true if the model was present and removed, false otherwise.\n */\nexport function removeExclusion(model: string, filePath: string = DEFAULT_FILE_PATH): boolean {\n const resolved = resolveModelAlias(model);\n const set = loadExcludeList(filePath);\n const had = set.delete(resolved);\n if (had) {\n saveExcludeList(set, filePath);\n }\n return had;\n}\n\n/**\n * Clear the entire exclude list.\n */\nexport function clearExclusions(filePath: string = DEFAULT_FILE_PATH): void {\n saveExcludeList(new Set(), filePath);\n}\n","/**\n * Configuration Module\n *\n * Reads environment variables at module load time.\n * Separated from network code to avoid security scanner false positives.\n */\n\nconst DEFAULT_PORT = 8402;\n\n/**\n * Proxy port configuration - resolved once at module load.\n * Reads BLOCKRUN_PROXY_PORT env var or defaults to 8402.\n */\nexport const PROXY_PORT = (() => {\n const envPort = process[\"env\"].BLOCKRUN_PROXY_PORT;\n if (envPort) {\n const parsed = parseInt(envPort, 10);\n if (!isNaN(parsed) && parsed > 0 && parsed < 65536) {\n return parsed;\n }\n }\n return DEFAULT_PORT;\n})();\n","/**\n * Session Journal - Memory layer for XClawRouter\n *\n * Maintains a compact record of key actions per session, enabling agents\n * to recall earlier work even when OpenClaw's sessions_history is truncated.\n *\n * How it works:\n * 1. As LLM responses flow through, extracts key actions (\"I created X\", \"I fixed Y\")\n * 2. Stores them in a compact journal per session\n * 3. When a request mentions past work (\"what did you do today?\"), injects the journal\n */\n\nexport interface JournalEntry {\n timestamp: number;\n action: string; // Compact description: \"Created login component\"\n model?: string;\n}\n\nexport interface SessionJournalConfig {\n /** Maximum entries per session (default: 100) */\n maxEntries?: number;\n /** Maximum age of entries in ms (default: 24 hours) */\n maxAgeMs?: number;\n /** Maximum events to extract per response (default: 5) */\n maxEventsPerResponse?: number;\n}\n\nconst DEFAULT_CONFIG: Required = {\n maxEntries: 100,\n maxAgeMs: 24 * 60 * 60 * 1000, // 24 hours\n maxEventsPerResponse: 5,\n};\n\nexport class SessionJournal {\n private journals: Map = new Map();\n private config: Required;\n\n constructor(config?: SessionJournalConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Extract key events from assistant response content.\n * Looks for patterns like \"I created...\", \"I fixed...\", \"Successfully...\"\n */\n extractEvents(content: string): string[] {\n if (!content || typeof content !== \"string\") {\n return [];\n }\n\n const events: string[] = [];\n const seen = new Set();\n\n // Patterns for identifying key actions\n // Note: Patterns allow optional words like \"also\", \"then\", \"have\" between \"I\" and verb\n const patterns = [\n // Creation patterns\n /I (?:also |then |have |)?(?:created|implemented|added|wrote|built|generated|set up|initialized) ([^.!?\\n]{10,150})/gi,\n // Fix patterns\n /I (?:also |then |have |)?(?:fixed|resolved|solved|patched|corrected|addressed|debugged) ([^.!?\\n]{10,150})/gi,\n // Completion patterns\n /I (?:also |then |have |)?(?:completed|finished|done with|wrapped up) ([^.!?\\n]{10,150})/gi,\n // Update patterns\n /I (?:also |then |have |)?(?:updated|modified|changed|refactored|improved|enhanced|optimized) ([^.!?\\n]{10,150})/gi,\n // Success patterns\n /Successfully ([^.!?\\n]{10,150})/gi,\n // Tool usage patterns (when agent uses tools)\n /I (?:also |then |have |)?(?:ran|executed|called|invoked) ([^.!?\\n]{10,100})/gi,\n ];\n\n for (const pattern of patterns) {\n // Reset pattern lastIndex for each iteration\n pattern.lastIndex = 0;\n\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const action = match[0].trim();\n\n // Skip if already seen (dedup)\n const normalized = action.toLowerCase();\n if (seen.has(normalized)) {\n continue;\n }\n\n // Validate length (not too short or too long)\n if (action.length >= 15 && action.length <= 200) {\n events.push(action);\n seen.add(normalized);\n }\n\n // Stop if we have enough events\n if (events.length >= this.config.maxEventsPerResponse) {\n break;\n }\n }\n\n if (events.length >= this.config.maxEventsPerResponse) {\n break;\n }\n }\n\n return events;\n }\n\n /**\n * Record events to the session journal.\n */\n record(sessionId: string, events: string[], model?: string): void {\n if (!sessionId || !events.length) {\n return;\n }\n\n const journal = this.journals.get(sessionId) || [];\n const now = Date.now();\n\n for (const action of events) {\n journal.push({\n timestamp: now,\n action,\n model,\n });\n }\n\n // Trim old entries and enforce max count\n const cutoff = now - this.config.maxAgeMs;\n const trimmed = journal.filter((e) => e.timestamp > cutoff).slice(-this.config.maxEntries);\n\n this.journals.set(sessionId, trimmed);\n }\n\n /**\n * Check if the user message indicates a need for historical context.\n */\n needsContext(lastUserMessage: string): boolean {\n if (!lastUserMessage || typeof lastUserMessage !== \"string\") {\n return false;\n }\n\n const lower = lastUserMessage.toLowerCase();\n\n // Trigger phrases that indicate user wants to recall past work\n const triggers = [\n // Direct questions about past work\n \"what did you do\",\n \"what have you done\",\n \"what did we do\",\n \"what have we done\",\n // Temporal references\n \"earlier\",\n \"before\",\n \"previously\",\n \"this session\",\n \"today\",\n \"so far\",\n // Summary requests\n \"remind me\",\n \"summarize\",\n \"summary of\",\n \"recap\",\n // Progress inquiries\n \"your work\",\n \"your progress\",\n \"accomplished\",\n \"achievements\",\n \"completed tasks\",\n ];\n\n return triggers.some((t) => lower.includes(t));\n }\n\n /**\n * Format the journal for injection into system message.\n * Returns null if journal is empty.\n */\n format(sessionId: string): string | null {\n const journal = this.journals.get(sessionId);\n if (!journal?.length) {\n return null;\n }\n\n const lines = journal.map((e) => {\n const time = new Date(e.timestamp).toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n });\n return `- ${time}: ${e.action}`;\n });\n\n return `[Session Memory - Key Actions]\\n${lines.join(\"\\n\")}`;\n }\n\n /**\n * Get the raw journal entries for a session (for debugging/testing).\n */\n getEntries(sessionId: string): JournalEntry[] {\n return this.journals.get(sessionId) || [];\n }\n\n /**\n * Clear journal for a specific session.\n */\n clear(sessionId: string): void {\n this.journals.delete(sessionId);\n }\n\n /**\n * Clear all journals.\n */\n clearAll(): void {\n this.journals.clear();\n }\n\n /**\n * Get stats about the journal.\n */\n getStats(): { sessions: number; totalEntries: number } {\n let totalEntries = 0;\n for (const entries of this.journals.values()) {\n totalEntries += entries.length;\n }\n return {\n sessions: this.journals.size,\n totalEntries,\n };\n }\n}\n","/**\n * Upstream Proxy Support\n *\n * Configures a global fetch dispatcher when BLOCKRUN_UPSTREAM_PROXY is set.\n * Supports http://, https://, and socks5:// proxy URLs.\n *\n * Usage:\n * BLOCKRUN_UPSTREAM_PROXY=socks5://127.0.0.1:1080 clawrouter start\n * BLOCKRUN_UPSTREAM_PROXY=http://127.0.0.1:8080 clawrouter start\n */\n\n/**\n * Apply upstream proxy settings to the global fetch dispatcher.\n * Called once at proxy startup if BLOCKRUN_UPSTREAM_PROXY is set.\n * Returns the proxy URL that was configured, or undefined if none.\n */\nexport async function applyUpstreamProxy(proxyUrl?: string): Promise {\n const url = proxyUrl ?? process.env.BLOCKRUN_UPSTREAM_PROXY;\n if (!url) return undefined;\n\n // Validate URL format\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n console.warn(\n `[XClawRouter] Invalid BLOCKRUN_UPSTREAM_PROXY URL: ${url} — skipping proxy setup`,\n );\n return undefined;\n }\n\n const scheme = parsed.protocol; // \"http:\", \"https:\", \"socks5:\"\n\n try {\n if (scheme === \"socks5:\" || scheme === \"socks4:\") {\n const { Socks5ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new Socks5ProxyAgent(url));\n } else if (scheme === \"http:\" || scheme === \"https:\") {\n const { ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new ProxyAgent(url));\n } else {\n console.warn(\n `[XClawRouter] Unsupported proxy scheme \"${scheme}\" in BLOCKRUN_UPSTREAM_PROXY — use http:// or socks5://`,\n );\n return undefined;\n }\n } catch (err) {\n console.warn(\n `[XClawRouter] Failed to configure upstream proxy \"${url}\": ${err instanceof Error ? err.message : err}`,\n );\n return undefined;\n }\n\n return url;\n}\n","/**\n * Extract tool calls that some models emit as XML/text inside `content`\n * instead of (or alongside an empty) structured `tool_calls` array.\n *\n * Two known shapes are recognized:\n *\n * 1. **OpenClaw-style** — `NAMEKV...`\n * Observed in production: OpenClaw prompts certain models with this format\n * and they honor it, but the calls land in `content` as plain text instead\n * of in `message.tool_calls`. At least one `arg_key`/`arg_value` pair is\n * required so a prose mention like `name` in\n * documentation does not mis-fire.\n *\n * 2. **Anthropic-style** — `V...`\n * Observed from Moonshot Kimi K2.6 in repro. The `` outer\n * tag is unique enough that prose mis-fires are very rare, so zero\n * parameters are still recognized inside this shape.\n *\n * Values are best-effort coerced via `JSON.parse` (so `\"5\"` → `5`, `\"true\"` →\n * `true`); strings that don't parse as JSON stay as strings.\n */\nimport { randomBytes } from \"node:crypto\";\n\nexport type ExtractedToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport type ExtractionResult = {\n toolCalls: ExtractedToolCall[];\n cleanedContent: string;\n};\n\n// Require at least one arg_key/arg_value pair to avoid matching prose\n// documentation that happens to mention `name`.\nconst OPENCLAW_TOOL_CALL_RE =\n /([^<]+?)((?:[\\s\\S]*?<\\/arg_key>\\s*[\\s\\S]*?<\\/arg_value>\\s*)+)<\\/tool_call>/g;\n\nconst OPENCLAW_ARG_RE = /([\\s\\S]*?)<\\/arg_key>\\s*([\\s\\S]*?)<\\/arg_value>/g;\n\nconst ANTHROPIC_BLOCK_RE = /]*>([\\s\\S]*?)<\\/function_calls\\s*>/g;\nconst ANTHROPIC_INVOKE_RE = /]*>([\\s\\S]*?)<\\/invoke\\s*>/g;\nconst ANTHROPIC_PARAM_RE = /]*>([\\s\\S]*?)<\\/parameter\\s*>/g;\n\nfunction generateId(): string {\n // OpenAI-shaped: \"call_\" + base64url chars. Length comparable to real OpenAI ids.\n return `call_${randomBytes(12).toString(\"base64url\")}`;\n}\n\nfunction coerceValue(raw: string): unknown {\n const trimmed = raw.trim();\n if (trimmed === \"\") return raw;\n try {\n return JSON.parse(trimmed);\n } catch {\n return raw;\n }\n}\n\ntype Range = { start: number; end: number };\n\nfunction extractOpenClawCalls(content: string): {\n calls: ExtractedToolCall[];\n matches: Range[];\n} {\n const calls: ExtractedToolCall[] = [];\n const matches: Range[] = [];\n\n OPENCLAW_TOOL_CALL_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = OPENCLAW_TOOL_CALL_RE.exec(content)) !== null) {\n const name = match[1]?.trim();\n if (!name) continue;\n const argsBlock = match[2] ?? \"\";\n\n const args: Record = {};\n OPENCLAW_ARG_RE.lastIndex = 0;\n let argMatch: RegExpExecArray | null;\n while ((argMatch = OPENCLAW_ARG_RE.exec(argsBlock)) !== null) {\n const key = argMatch[1]?.trim();\n const valueRaw = argMatch[2] ?? \"\";\n if (key) {\n args[key] = coerceValue(valueRaw);\n }\n }\n\n calls.push({\n id: generateId(),\n type: \"function\",\n function: { name, arguments: JSON.stringify(args) },\n });\n matches.push({ start: match.index, end: match.index + match[0].length });\n }\n\n return { calls, matches };\n}\n\nfunction extractAnthropicCalls(content: string): {\n calls: ExtractedToolCall[];\n matches: Range[];\n} {\n const calls: ExtractedToolCall[] = [];\n const matches: Range[] = [];\n\n ANTHROPIC_BLOCK_RE.lastIndex = 0;\n let blockMatch: RegExpExecArray | null;\n while ((blockMatch = ANTHROPIC_BLOCK_RE.exec(content)) !== null) {\n const inner = blockMatch[1] ?? \"\";\n let invokeFound = false;\n\n ANTHROPIC_INVOKE_RE.lastIndex = 0;\n let invokeMatch: RegExpExecArray | null;\n while ((invokeMatch = ANTHROPIC_INVOKE_RE.exec(inner)) !== null) {\n const name = invokeMatch[1];\n if (!name) continue;\n const invokeInner = invokeMatch[2] ?? \"\";\n\n const args: Record = {};\n ANTHROPIC_PARAM_RE.lastIndex = 0;\n let paramMatch: RegExpExecArray | null;\n while ((paramMatch = ANTHROPIC_PARAM_RE.exec(invokeInner)) !== null) {\n const key = paramMatch[1];\n const valueRaw = paramMatch[2] ?? \"\";\n if (key) {\n args[key] = coerceValue(valueRaw);\n }\n }\n\n calls.push({\n id: generateId(),\n type: \"function\",\n function: { name, arguments: JSON.stringify(args) },\n });\n invokeFound = true;\n }\n\n if (invokeFound) {\n matches.push({ start: blockMatch.index, end: blockMatch.index + blockMatch[0].length });\n }\n }\n\n return { calls, matches };\n}\n\nfunction stripRanges(content: string, ranges: Range[]): string {\n if (ranges.length === 0) return content;\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n let cleaned = \"\";\n let cursor = 0;\n for (const r of sorted) {\n if (r.start >= cursor) {\n cleaned += content.slice(cursor, r.start);\n cursor = r.end;\n }\n }\n cleaned += content.slice(cursor);\n return cleaned;\n}\n\nexport function extractTextualToolCalls(content: string): ExtractionResult {\n if (!content) {\n return { toolCalls: [], cleanedContent: \"\" };\n }\n\n const openClaw = extractOpenClawCalls(content);\n const anthropic = extractAnthropicCalls(content);\n\n const toolCalls = [...openClaw.calls, ...anthropic.calls];\n if (toolCalls.length === 0) {\n return { toolCalls: [], cleanedContent: content };\n }\n\n const cleanedContent = stripRanges(content, [...openClaw.matches, ...anthropic.matches]);\n return { toolCalls, cleanedContent };\n}\n","#!/usr/bin/env node\n/**\n * XClawRouter CLI\n *\n * Standalone proxy for deployed setups where the proxy needs to survive gateway restarts.\n *\n * Usage:\n * npx @blockrun/xclawrouter # Start standalone proxy\n * npx @blockrun/xclawrouter --version # Show version\n * npx @blockrun/xclawrouter --port 8402 # Custom port\n *\n * For production deployments, use with PM2:\n * pm2 start \"npx @blockrun/xclawrouter\" --name clawrouter\n */\n\nimport { startProxy, getProxyPort } from \"./proxy.js\";\nimport { VERSION } from \"./version.js\";\nimport {\n resolveOrGenerateWalletKey,\n resolvePaymentChain,\n recoverWalletFromMnemonic,\n savePaymentChain,\n formatAgenticWalletStatus,\n detectOnchainosWallet,\n OnchainOsRequiredError,\n ONCHAINOS_INSTALLER_URL,\n} from \"./auth.js\";\nimport { basename } from \"node:path\";\nimport { OnchainOsAdapter, resolveOnchainosBin } from \"./onchainos-adapter.js\";\nimport { execSync, execFileSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { createInterface } from \"node:readline/promises\";\nimport { getSolanaAddress } from \"./wallet.js\";\nimport { generateReport } from \"./report.js\";\nimport { formatRecentLogs } from \"./stats.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { PARTNER_SERVICES } from \"./partners/index.js\";\n\nfunction printHelp(): void {\n console.log(`\nXClawRouter v${VERSION} - Smart LLM Router\n\nUsage:\n xclawrouter [options]\n xclawrouter setup # Interactive OKX Agentic Wallet onboarding\n xclawrouter status # Live proxy status (wallet, balance, chain)\n xclawrouter wallet # Wallet details + balance\n xclawrouter models # List available models\n xclawrouter stats [--days ] # Usage stats (default: 7 days)\n xclawrouter doctor [opus] [question]\n xclawrouter partners [test]\n xclawrouter report [daily|weekly|monthly] [--json]\n xclawrouter logs [--days ]\n\nOptions:\n --version, -v Show version number\n --help, -h Show this help message\n --port Port to listen on (default: ${getProxyPort()})\n\nQuery Commands (talk to running proxy on localhost:${getProxyPort()}):\n status Proxy status: wallet, balance, payment chain\n wallet Wallet addresses + USDC balance\n models List all available models with pricing\n stats Usage breakdown: requests, cost, top models\n stats --days 14 Custom time range (max 30 days)\n cache Response cache stats (hit rate, size)\n\nManagement Commands:\n setup Interactive OKX Agentic Wallet onboarding (email login)\n doctor AI-powered diagnostics (default: Sonnet ~$0.003)\n doctor opus Use Opus for deeper analysis (~$0.01)\n logs Per-request breakdown: model, cost, latency, status\n logs --days 7 Show last 7 days of requests (default: 1 day)\n partners List available partner APIs with pricing\n partners test Test partner API endpoints (expect 402 = alive)\n wallet recover Restore wallet.key from mnemonic (if generated by XClawRouter)\n chain solana Switch to Solana (persists)\n chain base Switch to Base EVM (persists)\n\nEnvironment Variables:\n BLOCKRUN_WALLET_KEY Override wallet key (legacy local-key path)\n BLOCKRUN_PROXY_PORT Default proxy port (default: 8402)\n XCLAWROUTER_USE_LOCAL_WALLET=1 Opt into legacy local BIP-39 wallet generation\n (default: require OKX Agentic Wallet via onchainos)\n XCLAWROUTER_ONCHAINOS_BIN Override onchainos CLI path\n\nFor more info: https://blockrun.ai/clawrouter.md\n`);\n}\n\n/** Query the running proxy HTTP API */\nasync function queryProxy(path: string, port: number): Promise {\n const res = await fetch(`http://127.0.0.1:${port}${path}`);\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nasync function cmdStatus(port: number): Promise {\n try {\n const data = (await queryProxy(\"/health?full=true\", port)) as Record;\n console.log(`\\nClawRouter Status (port ${port})\\n`);\n console.log(` Status: ${data.status}`);\n console.log(` Payment Chain: ${data.paymentChain}`);\n console.log(` EVM Wallet: ${data.wallet}`);\n if (data.solana) console.log(` Solana Wallet: ${data.solana}`);\n console.log(` Balance: ${data.balance ?? \"unknown\"}`);\n if (data.isLow) console.log(` ⚠ Balance is low`);\n if (data.isEmpty) console.log(` ⚠ Balance is empty — using free models`);\n if (data.upstreamProxy) console.log(` Upstream Proxy: ${data.upstreamProxy}`);\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n console.error(` Is the proxy running? Start with: npx @blockrun/xclawrouter`);\n process.exit(1);\n }\n}\n\nasync function cmdWallet(port: number): Promise {\n try {\n const data = (await queryProxy(\"/health?full=true\", port)) as Record;\n console.log(`\\nClawRouter Wallet\\n`);\n console.log(` Payment Chain: ${data.paymentChain}`);\n console.log();\n console.log(` Base (EVM):`);\n console.log(` Address: ${data.wallet}`);\n console.log(` Fund: https://basescan.org/address/${data.wallet}`);\n if (data.solana) {\n console.log();\n console.log(` Solana:`);\n console.log(` Address: ${data.solana}`);\n console.log(` Fund: https://solscan.io/account/${data.solana}`);\n }\n console.log();\n console.log(` Balance: ${data.balance ?? \"unknown\"} (USDC)`);\n if (data.isEmpty) console.log(` ⚠ Empty — fund wallet or use free models`);\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\nasync function cmdModels(port: number): Promise {\n try {\n const data = (await queryProxy(\"/v1/models\", port)) as {\n data: Array<{ id: string; owned_by?: string }>;\n };\n console.log(`\\nAvailable Models (${data.data.length})\\n`);\n\n // Group by provider\n const groups = new Map();\n for (const m of data.data) {\n const provider = m.id.includes(\"/\") ? m.id.split(\"/\")[0] : \"blockrun\";\n if (!groups.has(provider)) groups.set(provider, []);\n groups.get(provider)!.push(m.id);\n }\n\n for (const [provider, models] of groups) {\n console.log(` ${provider} (${models.length}):`);\n for (const id of models) {\n console.log(` ${id}`);\n }\n console.log();\n }\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\nasync function cmdStats(port: number, days: number): Promise {\n try {\n const data = (await queryProxy(`/stats?days=${days}`, port)) as Record;\n const stats = data as {\n totalRequests?: number;\n totalCostUsd?: number;\n savedUsd?: number;\n savingsPercent?: number;\n topModels?: Array<{ model: string; requests: number; costUsd: number }>;\n };\n\n console.log(`\\nUsage Stats (last ${days} days)\\n`);\n console.log(` Requests: ${stats.totalRequests ?? 0}`);\n console.log(` Cost: $${(stats.totalCostUsd ?? 0).toFixed(4)}`);\n if (stats.savedUsd) {\n console.log(\n ` Saved: $${stats.savedUsd.toFixed(4)} (${stats.savingsPercent?.toFixed(0) ?? 0}% vs Opus)`,\n );\n }\n\n if (stats.topModels && stats.topModels.length > 0) {\n console.log();\n console.log(` Top Models:`);\n for (const m of stats.topModels.slice(0, 10)) {\n console.log(\n ` ${m.model.padEnd(40)} ${String(m.requests).padStart(5)} reqs $${m.costUsd.toFixed(4)}`,\n );\n }\n }\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\n/**\n * Bootstrap OKX Agentic Wallet for XClawRouter — minimal direct flow,\n * polished CLI presentation.\n *\n * The binary outputs raw JSON for every command (`{\"ok\":true,...}`). We\n * capture stdio (not inherit) so users don't see the JSON, then surface\n * a clean status line per step. ANSI escapes only — no extra deps.\n */\n\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n} as const;\nconst useColor = process.stdout.isTTY && !process.env.NO_COLOR && process.env.TERM !== \"dumb\";\nconst c = (color: string, s: string): string => (useColor ? `${color}${s}${ANSI.reset}` : s);\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nconst stripAnsi = (s: string): string => s.replace(ANSI_RE, \"\");\n\n/**\n * Translate an `OnchainOsDetectionResult.kind` into a one-line plain-English\n * description for end users. Surfacing the raw discriminant (e.g.\n * `no-evm-address`) in CLI error output reads like an internal enum leak —\n * use this whenever a detection failure is shown to a human.\n */\nfunction humanizeDetectionKind(\n kind: \"no-binary\" | \"not-logged-in\" | \"status-error\" | \"no-evm-address\" | \"addresses-error\",\n): string {\n switch (kind) {\n case \"no-binary\":\n return \"onchainos binary is missing from PATH\";\n case \"not-logged-in\":\n return \"onchainos is installed but reports `loggedIn: false`\";\n case \"status-error\":\n return \"`onchainos wallet status` returned an error\";\n case \"no-evm-address\":\n return \"no EVM address found — is this a Solana-only OKX account?\";\n case \"addresses-error\":\n return \"`onchainos wallet addresses` returned an error\";\n }\n}\n\nfunction printSetupHeader(): void {\n console.log();\n console.log(\" \" + c(ANSI.bold + ANSI.cyan, \"🦞 XClawRouter — Wallet Setup\"));\n console.log(\" \" + c(ANSI.dim, \"OKX Agentic Wallet (onchainos)\"));\n console.log();\n}\n\nfunction printSetupSummary(address: string, email: string | undefined): void {\n const lines = [\n c(ANSI.bold + ANSI.green, \"✓ Wallet ready\"),\n \"\",\n c(ANSI.dim, \"EVM address\"),\n c(ANSI.bold, address),\n ];\n if (email) {\n lines.push(\"\");\n lines.push(c(ANSI.dim, \"Email \") + email);\n }\n lines.push(c(ANSI.dim, \"Signing \") + \"OKX TEE \" + c(ANSI.dim, \"(no local private key)\"));\n\n // Funding hint. OKX onchainos x402 signing currently only supports Base\n // (Solana support hasn't shipped yet — see src/proxy.ts warning). USDC on\n // Base is the only thing that actually unlocks paid models, so name the\n // chain explicitly instead of saying \"USDC\" alone, which led users to\n // bridge to the wrong network.\n lines.push(\"\");\n lines.push(\n c(ANSI.dim, \"Fund \") + \"send \" + c(ANSI.bold, \"USDC on Base\") + \" to the address above\",\n );\n lines.push(\n c(ANSI.dim, \" \") + c(ANSI.dim, \"(free models work at $0; $5 unlocks paid tier)\"),\n );\n\n const width = Math.max(...lines.map((l) => stripAnsi(l).length));\n const horiz = \"─\".repeat(width + 2);\n console.log(\" ┌\" + horiz + \"┐\");\n for (const line of lines) {\n const pad = \" \".repeat(width - stripAnsi(line).length);\n console.log(\" │ \" + line + pad + \" │\");\n }\n console.log(\" └\" + horiz + \"┘\");\n}\n\nasync function cmdSetup(): Promise {\n printSetupHeader();\n\n // ── Step 1: onchainos binary ────────────────────────────────────────\n const adapter = new OnchainOsAdapter();\n if (!adapter.isInstalled()) {\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Installing onchainos binary…\\n\");\n process.stdout.write(\" \" + c(ANSI.dim, `(via ${ONCHAINOS_INSTALLER_URL})`) + \"\\n\");\n try {\n execSync(`curl -sSL --max-time 60 ${ONCHAINOS_INSTALLER_URL} | sh`, {\n stdio: [\"ignore\", \"ignore\", \"inherit\"],\n env: { ...process.env, PATH: `${homedir()}/.local/bin:${process.env.PATH ?? \"\"}` },\n });\n process.env.PATH = `${homedir()}/.local/bin:${process.env.PATH ?? \"\"}`;\n console.log(\" \" + c(ANSI.green, \"✓\") + \" onchainos installed\");\n } catch {\n console.error(\"\\n \" + c(ANSI.red, \"✗\") + \" onchainos install failed.\");\n console.error(\" Install manually then re-run setup:\");\n console.error(\" \" + c(ANSI.dim, `curl -sSL ${ONCHAINOS_INSTALLER_URL} | sh`));\n process.exit(1);\n }\n } else {\n console.log(\" \" + c(ANSI.green, \"✓\") + \" onchainos detected\");\n }\n\n // ── Step 2: already logged in? ──────────────────────────────────────\n const detection = await detectOnchainosWallet();\n if (detection.kind === \"ok\") {\n console.log(\" \" + c(ANSI.green, \"✓\") + \" Already signed in\");\n console.log();\n printSetupSummary(detection.address, detection.email);\n console.log();\n console.log(\n \" \" + c(ANSI.cyan, \"→\") + \" Restart OpenClaw: \" + c(ANSI.bold, \"openclaw gateway restart\"),\n );\n console.log();\n return;\n }\n console.log();\n\n // ── Step 3: collect email ───────────────────────────────────────────\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n let email: string;\n try {\n email = (await rl.question(\" \" + c(ANSI.cyan, \"→\") + \" Email: \")).trim();\n } finally {\n rl.close();\n }\n if (!email.includes(\"@\")) {\n console.error(\" \" + c(ANSI.red, \"✗\") + ` \"${email}\" doesn't look like an email address.`);\n process.exit(1);\n }\n\n // ── Step 4: send OTP (capture JSON output) ──────────────────────────\n const bin = resolveOnchainosBin();\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Sending login code to \" + email + \"…\");\n try {\n execFileSync(bin, [\"wallet\", \"login\", email], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch {\n process.stdout.write(\n \"\\r \" + c(ANSI.red, \"✗\") + \" Could not send code. Check the address and try again.\\n\",\n );\n process.exit(1);\n }\n process.stdout.write(\n \"\\r \" + c(ANSI.green, \"✓\") + \" Code sent — check your inbox at \" + c(ANSI.bold, email) + \"\\n\",\n );\n console.log();\n\n // ── Step 5: collect OTP ─────────────────────────────────────────────\n const rlOtp = createInterface({ input: process.stdin, output: process.stdout });\n let otp: string;\n try {\n otp = (await rlOtp.question(\" \" + c(ANSI.cyan, \"→\") + \" Login code: \")).trim();\n } finally {\n rlOtp.close();\n }\n if (!/^\\d{4,8}$/.test(otp)) {\n console.error(\n \" \" + c(ANSI.red, \"✗\") + ` \"${otp}\" doesn't look like a code (expected 4-8 digits).`,\n );\n process.exit(1);\n }\n\n // ── Step 6: verify ──────────────────────────────────────────────────\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Verifying code…\");\n try {\n execFileSync(bin, [\"wallet\", \"verify\", otp], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch {\n process.stdout.write(\n \"\\r \" + c(ANSI.red, \"✗\") + \" Verification failed. Re-run setup for a new code.\\n\",\n );\n process.exit(1);\n }\n process.stdout.write(\n \"\\r \" + c(ANSI.green, \"✓\") + \" Verified \\n\",\n );\n\n // ── Step 7: re-detect + summary ─────────────────────────────────────\n const after = await detectOnchainosWallet();\n if (after.kind !== \"ok\") {\n console.error(\n \"\\n \" +\n c(ANSI.red, \"✗\") +\n ` Login completed but the wallet still isn't detected (${humanizeDetectionKind(after.kind)}).`,\n );\n console.error(\" Run `onchainos wallet status` to diagnose.\");\n process.exit(1);\n }\n\n console.log();\n printSetupSummary(after.address, after.email);\n console.log();\n console.log(\n \" \" + c(ANSI.cyan, \"→\") + \" Restart OpenClaw: \" + c(ANSI.bold, \"openclaw gateway restart\"),\n );\n console.log();\n}\n\nasync function cmdCache(port: number): Promise {\n try {\n const data = (await queryProxy(\"/cache\", port)) as Record;\n console.log(`\\nCache Stats\\n`);\n for (const [key, value] of Object.entries(data)) {\n console.log(` ${key}: ${JSON.stringify(value)}`);\n }\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\nfunction parseArgs(args: string[]): {\n version: boolean;\n help: boolean;\n doctor: boolean;\n logs: boolean;\n logsDays: number;\n partners: boolean;\n partnersTest: boolean;\n report: boolean;\n reportPeriod: \"daily\" | \"weekly\" | \"monthly\";\n reportJson: boolean;\n walletRecover: boolean;\n setup: boolean;\n chain?: \"solana\" | \"base\";\n port?: number;\n // Query commands\n queryStatus: boolean;\n queryWallet: boolean;\n queryModels: boolean;\n queryStats: boolean;\n queryStatsDays: number;\n queryCache: boolean;\n} {\n const result = {\n version: false,\n help: false,\n doctor: false,\n logs: false,\n logsDays: 1,\n partners: false,\n partnersTest: false,\n report: false,\n reportPeriod: \"daily\" as \"daily\" | \"weekly\" | \"monthly\",\n reportJson: false,\n walletRecover: false,\n setup: false,\n chain: undefined as \"solana\" | \"base\" | undefined,\n port: undefined as number | undefined,\n queryStatus: false,\n queryWallet: false,\n queryModels: false,\n queryStats: false,\n queryStatsDays: 7,\n queryCache: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--version\" || arg === \"-v\") {\n result.version = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (arg === \"status\") {\n result.queryStatus = true;\n } else if (arg === \"models\") {\n result.queryModels = true;\n } else if (arg === \"stats\") {\n result.queryStats = true;\n if (args[i + 1] === \"--days\" && args[i + 2]) {\n result.queryStatsDays = Math.min(parseInt(args[i + 2], 10) || 7, 30);\n i += 2;\n }\n } else if (arg === \"cache\") {\n result.queryCache = true;\n } else if (arg === \"doctor\" || arg === \"--doctor\") {\n result.doctor = true;\n } else if (arg === \"logs\") {\n result.logs = true;\n if (args[i + 1] === \"--days\" && args[i + 2]) {\n result.logsDays = parseInt(args[i + 2], 10) || 1;\n i += 2;\n }\n } else if (arg === \"partners\") {\n result.partners = true;\n if (args[i + 1] === \"test\") {\n result.partnersTest = true;\n i++;\n }\n } else if (arg === \"report\") {\n result.report = true;\n const next = args[i + 1];\n if (next && [\"daily\", \"weekly\", \"monthly\"].includes(next)) {\n result.reportPeriod = next as \"daily\" | \"weekly\" | \"monthly\";\n i++;\n if (args[i + 1] === \"--json\") {\n result.reportJson = true;\n i++;\n }\n } else if (next === \"--json\") {\n result.reportJson = true;\n i++;\n }\n } else if (arg === \"wallet\") {\n if (args[i + 1] === \"recover\") {\n result.walletRecover = true;\n i++;\n } else if (args[i + 1] === \"solana\" || args[i + 1] === \"base\") {\n result.chain = args[i + 1] as \"solana\" | \"base\";\n i++;\n } else {\n result.queryWallet = true;\n }\n } else if (\n (arg === \"chain\" || arg === \"/wallet\") &&\n (args[i + 1] === \"solana\" || args[i + 1] === \"base\")\n ) {\n result.chain = args[i + 1] as \"solana\" | \"base\";\n i++;\n } else if (arg === \"setup\") {\n result.setup = true;\n } else if (arg === \"--port\" && args[i + 1]) {\n result.port = parseInt(args[i + 1], 10);\n i++;\n }\n }\n\n return result;\n}\n\nasync function main(): Promise {\n // Deprecation warning for the legacy `clawrouter` bin name. The package\n // renamed itself to `@blockrun/xclawrouter` in v0.12.179 and the bin entry\n // became `xclawrouter` in v0.12.180. We keep `clawrouter` as a no-op alias\n // pointing at the same dist/cli.js for one release so users with shell\n // aliases, pm2 processes, or shipped onboarding docs aren't broken on\n // upgrade — but we tell them what to migrate to. Removed in v0.13.\n const invokedAs = process.argv[1] ? basename(process.argv[1]) : \"\";\n if (invokedAs === \"clawrouter\" && !process.env.XCLAW_SUPPRESS_RENAME_NOTICE) {\n console.warn(\n \"[XClawRouter] `clawrouter` is deprecated — use `xclawrouter` (alias removed in v0.13).\",\n );\n }\n\n const args = parseArgs(process.argv.slice(2));\n\n if (args.version) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.help) {\n printHelp();\n process.exit(0);\n }\n\n // Query commands — talk to running proxy\n const queryPort = args.port ?? getProxyPort();\n\n if (args.queryStatus) {\n await cmdStatus(queryPort);\n process.exit(0);\n }\n if (args.queryWallet) {\n await cmdWallet(queryPort);\n process.exit(0);\n }\n if (args.queryModels) {\n await cmdModels(queryPort);\n process.exit(0);\n }\n if (args.queryStats) {\n await cmdStats(queryPort, args.queryStatsDays);\n process.exit(0);\n }\n if (args.queryCache) {\n await cmdCache(queryPort);\n process.exit(0);\n }\n\n if (args.doctor) {\n // Parse: doctor [opus|sonnet] [question...]\n const rawArgs = process.argv.slice(2);\n const doctorIndex = rawArgs.findIndex((a) => a === \"doctor\" || a === \"--doctor\");\n const afterDoctor = rawArgs.slice(doctorIndex + 1);\n\n // Check if first arg is model selection\n let model: \"sonnet\" | \"opus\" = \"sonnet\"; // default to cheaper\n let questionArgs = afterDoctor;\n\n if (afterDoctor[0] === \"opus\") {\n model = \"opus\";\n questionArgs = afterDoctor.slice(1);\n } else if (afterDoctor[0] === \"sonnet\") {\n model = \"sonnet\";\n questionArgs = afterDoctor.slice(1);\n }\n\n const userQuestion = questionArgs.join(\" \").trim() || undefined;\n await runDoctor(userQuestion, model);\n process.exit(0);\n }\n\n if (args.logs) {\n const output = await formatRecentLogs(args.logsDays);\n console.log(output);\n process.exit(0);\n }\n\n if (args.partners) {\n if (PARTNER_SERVICES.length === 0) {\n console.log(\"No partner APIs available.\");\n process.exit(0);\n }\n\n console.log(`\\nClawRouter Partner APIs (v${VERSION})\\n`);\n\n // Compact grouped view — one line per tool, grouped by category.\n const byCategory = new Map();\n for (const svc of PARTNER_SERVICES) {\n const bucket = byCategory.get(svc.category) ?? [];\n bucket.push(svc);\n byCategory.set(svc.category, bucket);\n }\n const toolWidth = Math.max(...PARTNER_SERVICES.map((s) => `blockrun_${s.id}`.length), 28);\n const priceWidth = Math.max(\n ...PARTNER_SERVICES.map((s) =>\n s.pricing.perUnit === \"free\" ? 4 : `${s.pricing.perUnit}/${s.pricing.unit}`.length,\n ),\n 12,\n );\n for (const [category, services] of byCategory) {\n console.log(`${category}`);\n for (const svc of services) {\n const tool = `blockrun_${svc.id}`.padEnd(toolWidth);\n const price = (\n svc.pricing.perUnit === \"free\" ? \"free\" : `${svc.pricing.perUnit}/${svc.pricing.unit}`\n ).padEnd(priceWidth);\n console.log(` ${tool} ${price} ${svc.shortDescription}`);\n }\n console.log();\n }\n\n if (args.partnersTest) {\n console.log(\"Testing partner endpoints...\\n\");\n const apiBase = \"https://blockrun.ai/api\";\n for (const svc of PARTNER_SERVICES) {\n const url = `${apiBase}/v1${svc.proxyPath}`;\n try {\n const response = await fetch(url, { method: \"GET\" });\n const status = response.status;\n const ok = status === 402 ? \"alive (402 = payment required)\" : `status ${status}`;\n console.log(` ${svc.id}: ${ok}`);\n } catch (err) {\n console.log(` ${svc.id}: error - ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n console.log();\n }\n\n process.exit(0);\n }\n\n if (args.walletRecover) {\n await recoverWalletFromMnemonic();\n process.exit(0);\n }\n\n if (args.chain) {\n const targetChain = args.chain;\n\n if (targetChain === \"solana\") {\n // Ensure Solana wallet is set up (mnemonic → keypair)\n const { existsSync } = await import(\"fs\");\n const { MNEMONIC_FILE, setupSolana } = await import(\"./auth.js\");\n const { deriveSolanaKeyBytes, getSolanaAddress } = await import(\"./wallet.js\");\n\n let solanaAddr: string;\n if (existsSync(MNEMONIC_FILE)) {\n // Already set up — derive address from existing mnemonic\n const { readFileSync } = await import(\"fs\");\n const mnemonic = readFileSync(MNEMONIC_FILE, \"utf8\").trim();\n const keyBytes = deriveSolanaKeyBytes(mnemonic);\n solanaAddr = await getSolanaAddress(keyBytes);\n console.log(`[XClawRouter] Solana wallet already set up.`);\n } else {\n // First time — generate mnemonic + keypair\n console.log(`[XClawRouter] Setting up Solana wallet...`);\n const { solanaPrivateKeyBytes } = await setupSolana();\n solanaAddr = await getSolanaAddress(solanaPrivateKeyBytes);\n console.log(`[XClawRouter] Solana wallet created.`);\n console.log(`[XClawRouter] ⚠ Back up your mnemonic: ${MNEMONIC_FILE}`);\n }\n\n await savePaymentChain(\"solana\");\n console.log(`[XClawRouter] Payment chain → Solana`);\n console.log(`[XClawRouter] Solana address : ${solanaAddr}`);\n console.log(`[XClawRouter] Fund USDC at : https://solscan.io/account/${solanaAddr}`);\n } else {\n await savePaymentChain(\"base\");\n console.log(`[XClawRouter] Payment chain → Base (EVM)`);\n }\n\n console.log(\n `[XClawRouter] Restart gateway to apply: systemctl --user restart openclaw-gateway.service`,\n );\n console.log(`[XClawRouter] or: openclaw gateway restart`);\n process.exit(0);\n }\n\n if (args.report) {\n const report = await generateReport(args.reportPeriod, args.reportJson);\n console.log(report);\n process.exit(0);\n }\n\n if (args.setup) {\n await cmdSetup();\n process.exit(0);\n }\n\n // Resolve wallet key.\n //\n // On a fresh install with no OKX wallet, `resolveOrGenerateWalletKey`\n // throws `OnchainOsRequiredError` instead of silently generating a local\n // key. In an INTERACTIVE terminal we transparently run `cmdSetup` here so\n // a user typing `npx @blockrun/xclawrouter` for the first time gets walked\n // through OKX install + email + OTP without having to manually invoke a\n // second command. In NON-interactive contexts (CI, Docker, gateway daemon)\n // we keep the old error+exit-2 behaviour so automation isn't left hanging\n // on a stdin prompt that no one will ever answer.\n let wallet;\n try {\n wallet = await resolveOrGenerateWalletKey();\n } catch (err) {\n if (err instanceof OnchainOsRequiredError) {\n const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);\n if (interactive) {\n console.log(\"\\n[XClawRouter] No wallet detected — launching guided setup\\n\");\n await cmdSetup();\n // cmdSetup exits non-zero on its own failure paths, so if we got here\n // it claims the OKX login completed. Guard the re-resolve anyway:\n // a TEE blip or stale onchainos session could still leave us without\n // a usable wallet, and we'd rather print a targeted hint than fall\n // through to main()'s generic \"Fatal error\" handler.\n try {\n wallet = await resolveOrGenerateWalletKey();\n } catch (err2) {\n if (err2 instanceof OnchainOsRequiredError) {\n console.error(\"[XClawRouter] Setup completed but the wallet still isn't detected.\");\n console.error(\n \"[XClawRouter] Diagnose with: onchainos wallet status (and re-run setup if needed)\",\n );\n process.exit(1);\n }\n throw err2;\n }\n } else {\n console.error(`[XClawRouter] ${err.message}`);\n process.exit(2);\n }\n } else {\n throw err;\n }\n }\n\n // Agentic Wallet status block. Tells the user, on every launch, whether\n // onchainos is installed and what their login state is, with the literal\n // next-step command/URL. Emitted BEFORE the \"Using ... wallet:\" line so the\n // user understands the state of the option they're (likely) not on, before\n // we tell them which local fallback we picked. XCLAW_QUIET=1 silences it.\n // (`src/index.ts` emits the same block through OpenClaw's structured\n // logger — keep these two sites in sync when changing the block shape.)\n const quiet = process.env.XCLAW_QUIET === \"1\";\n const detection = wallet.onchainosDetection;\n let printedStatus = false;\n if (!quiet && detection) {\n const lines = formatAgenticWalletStatus(detection);\n for (const line of lines) {\n // CLI uses one stream (stdout); the `level` distinction matters for\n // structured loggers, not for terminals, so funnel everything through\n // console.log with the consistent [XClawRouter] prefix.\n console.log(`[XClawRouter] ${line.text}`);\n }\n printedStatus = lines.length > 0;\n }\n\n if (wallet.source === \"okx\") {\n console.log(\n `[XClawRouter] Using OKX onchainos wallet: ${wallet.address}${wallet.email ? ` (${wallet.email})` : \"\"}`,\n );\n } else if (wallet.source === \"generated\") {\n console.log(`[XClawRouter] Generated new wallet: ${wallet.address}`);\n } else if (wallet.source === \"saved\") {\n console.log(`[XClawRouter] Using saved wallet: ${wallet.address}`);\n } else if (wallet.source === \"config\") {\n console.log(`[XClawRouter] Using wallet from plugin config: ${wallet.address}`);\n } else {\n console.log(`[XClawRouter] Using wallet from BLOCKRUN_WALLET_KEY: ${wallet.address}`);\n }\n\n // Suppression hint only when we actually emitted a status block — so a\n // running OKX wallet doesn't end up with a dangling \"(set XCLAW_QUIET…)\".\n if (printedStatus) {\n console.log(`[XClawRouter] (set XCLAW_QUIET=1 to suppress this block)`);\n }\n\n // Show Solana address if available\n if (wallet.solanaPrivateKeyBytes) {\n try {\n const solAddr = await getSolanaAddress(wallet.solanaPrivateKeyBytes);\n console.log(`[XClawRouter] Solana address: ${solAddr}`);\n } catch {\n // Non-fatal\n }\n }\n\n // Start the proxy\n const proxy = await startProxy({\n wallet,\n port: args.port,\n onReady: (port) => {\n console.log(`[XClawRouter] v${VERSION} | Proxy listening on http://127.0.0.1:${port}`);\n console.log(`[XClawRouter] Health check: http://127.0.0.1:${port}/health`);\n },\n onError: (error) => {\n console.error(`[XClawRouter] Error: ${error.message}`);\n },\n onRouted: (decision) => {\n const cost = decision.costEstimate.toFixed(4);\n const saved = (decision.savings * 100).toFixed(0);\n console.log(`[XClawRouter] [${decision.tier}] ${decision.model} $${cost} (saved ${saved}%)`);\n },\n onLowBalance: (info) => {\n console.warn(`[XClawRouter] Low balance: ${info.balanceUSD}. Fund: ${info.walletAddress}`);\n },\n onInsufficientFunds: (info) => {\n console.error(\n `[XClawRouter] Insufficient funds. Balance: ${info.balanceUSD}, Need: ${info.requiredUSD}`,\n );\n console.error(`[XClawRouter] Need help? Run: npx @blockrun/xclawrouter doctor`);\n },\n });\n\n // Check balance on the active payment chain\n const paymentChain = await resolvePaymentChain();\n const displayAddress =\n paymentChain === \"solana\" && proxy.solanaAddress ? proxy.solanaAddress : wallet.address;\n try {\n const balance = await proxy.balanceMonitor.checkBalance();\n if (balance.isEmpty) {\n console.log(`[XClawRouter] Wallet balance: $0.00 (using FREE model)`);\n console.log(`[XClawRouter] Fund wallet for premium models: ${displayAddress}`);\n } else if (balance.isLow) {\n console.log(`[XClawRouter] Wallet balance: ${balance.balanceUSD} (low)`);\n } else {\n console.log(`[XClawRouter] Wallet balance: ${balance.balanceUSD}`);\n }\n // Invalidate after display so the first real request always gets a fresh check.\n // Prevents a flaky RPC at startup from caching a false $0.00 and triggering\n // free-model fallback on the first request.\n proxy.balanceMonitor.invalidate();\n } catch {\n console.log(`[XClawRouter] Wallet: ${displayAddress} (balance check pending)`);\n }\n\n console.log(`[XClawRouter] Ready - Ctrl+C to stop`);\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\n[XClawRouter] Received ${signal}, shutting down...`);\n try {\n await proxy.close();\n console.log(`[XClawRouter] Proxy closed`);\n process.exit(0);\n } catch (err) {\n console.error(`[XClawRouter] Error during shutdown: ${err}`);\n process.exit(1);\n }\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nmain().catch((err) => {\n console.error(`[XClawRouter] Fatal error: ${err.message}`);\n console.error(`[XClawRouter] Need help? Run: npx @blockrun/xclawrouter doctor`);\n process.exit(1);\n});\n","/**\n * Cost Report Generator\n */\n\nimport { getStats } from \"./stats.js\";\nimport type { AggregatedStats } from \"./stats.js\";\n\nexport type ReportPeriod = \"daily\" | \"weekly\" | \"monthly\";\n\nexport async function generateReport(period: ReportPeriod, json: boolean = false): Promise {\n const days = period === \"daily\" ? 1 : period === \"weekly\" ? 7 : 30;\n const stats = await getStats(days);\n\n if (json) {\n return JSON.stringify(stats, null, 2);\n }\n\n return formatMarkdownReport(period, days, stats);\n}\n\nfunction formatMarkdownReport(period: ReportPeriod, days: number, stats: AggregatedStats): string {\n const lines: string[] = [];\n\n lines.push(`# XClawRouter ${capitalize(period)} Report`);\n lines.push(`**Period:** Last ${days} day${days > 1 ? \"s\" : \"\"}`);\n lines.push(`**Generated:** ${new Date().toISOString()}`);\n lines.push(\"\");\n\n lines.push(\"## 📊 Usage Summary\");\n lines.push(\"\");\n lines.push(`| Metric | Value |`);\n lines.push(`|--------|-------|`);\n lines.push(`| Total Requests | ${stats.totalRequests} |`);\n lines.push(`| Total Cost | $${stats.totalCost.toFixed(4)} |`);\n lines.push(`| Baseline Cost | $${stats.totalBaselineCost.toFixed(4)} |`);\n lines.push(`| **Savings** | **$${stats.totalSavings.toFixed(4)}** |`);\n lines.push(`| Savings % | ${stats.savingsPercentage.toFixed(1)}% |`);\n lines.push(`| Avg Latency | ${stats.avgLatencyMs.toFixed(0)}ms |`);\n lines.push(\"\");\n\n lines.push(\"## 🤖 Model Distribution\");\n lines.push(\"\");\n const sortedModels = Object.entries(stats.byModel)\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 10);\n for (const [model, data] of sortedModels) {\n lines.push(`- ${model}: ${data.count} reqs, $${data.cost.toFixed(4)}`);\n }\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * BlockRun Doctor - AI-Powered Diagnostics\n *\n * Collects system diagnostics and sends to Claude Opus 4.6 for analysis.\n * Works independently of OpenClaw - direct x402 payment to BlockRun API.\n */\n\nimport { platform, arch, freemem, totalmem } from \"node:os\";\nimport { createPublicClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { wrapFetchWithPayment, x402Client } from \"@x402/fetch\";\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { toClientEvmSigner } from \"@x402/evm\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport {\n resolveOrGenerateWalletKey,\n resolvePaymentChain,\n WALLET_FILE,\n MNEMONIC_FILE,\n} from \"./auth.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { getSolanaAddress } from \"./wallet.js\";\nimport { getStats } from \"./stats.js\";\nimport { getProxyPort } from \"./proxy.js\";\nimport { VERSION } from \"./version.js\";\n\n// Types\ninterface SystemInfo {\n os: string;\n arch: string;\n nodeVersion: string;\n memoryFree: string;\n memoryTotal: string;\n}\n\ninterface WalletInfo {\n exists: boolean;\n valid: boolean;\n address: string | null;\n solanaAddress: string | null;\n balance: string | null;\n isLow: boolean;\n isEmpty: boolean;\n source: \"saved\" | \"env\" | \"config\" | \"generated\" | \"okx\" | null;\n paymentChain: \"base\" | \"solana\";\n}\n\ninterface NetworkInfo {\n blockrunApi: { reachable: boolean; latencyMs: number | null };\n localProxy: { running: boolean; port: number };\n}\n\ninterface LogInfo {\n requestsLast24h: number;\n costLast24h: string;\n errorsFound: number;\n}\n\ninterface DiagnosticResult {\n version: string;\n latestVersion: string | null;\n timestamp: string;\n system: SystemInfo;\n wallet: WalletInfo;\n network: NetworkInfo;\n logs: LogInfo;\n issues: string[];\n}\n\n// Helpers\nfunction formatBytes(bytes: number): string {\n const gb = bytes / (1024 * 1024 * 1024);\n return `${gb.toFixed(1)}GB`;\n}\n\nfunction green(text: string): string {\n return `\\x1b[32m✓\\x1b[0m ${text}`;\n}\n\nfunction red(text: string): string {\n return `\\x1b[31m✗\\x1b[0m ${text}`;\n}\n\nfunction yellow(text: string): string {\n return `\\x1b[33m⚠\\x1b[0m ${text}`;\n}\n\n// Fetch latest published version from npm registry\nasync function fetchLatestVersion(): Promise {\n try {\n const res = await fetch(\"https://registry.npmjs.org/@blockrun/xclawrouter/latest\", {\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n// Collect system info\nfunction collectSystemInfo(): SystemInfo {\n return {\n os: `${platform()} ${arch()}`,\n arch: arch(),\n nodeVersion: process.version,\n memoryFree: formatBytes(freemem()),\n memoryTotal: formatBytes(totalmem()),\n };\n}\n\n// Collect wallet info\nasync function collectWalletInfo(): Promise {\n try {\n const { key, address, source, solanaPrivateKeyBytes } = await resolveOrGenerateWalletKey();\n\n if (!key || !address) {\n return {\n exists: false,\n valid: false,\n address: null,\n solanaAddress: null,\n balance: null,\n isLow: false,\n isEmpty: true,\n source: null,\n paymentChain: \"base\",\n };\n }\n\n // Derive Solana address if mnemonic-based wallet\n let solanaAddress: string | null = null;\n if (solanaPrivateKeyBytes) {\n try {\n solanaAddress = await getSolanaAddress(solanaPrivateKeyBytes);\n } catch {\n // Non-fatal\n }\n }\n\n // Check balance on the active payment chain\n const paymentChain = await resolvePaymentChain();\n try {\n let balanceInfo: { balanceUSD: string; isLow: boolean; isEmpty: boolean };\n if (paymentChain === \"solana\" && solanaAddress) {\n const { SolanaBalanceMonitor } = await import(\"./solana-balance.js\");\n const monitor = new SolanaBalanceMonitor(solanaAddress);\n balanceInfo = await monitor.checkBalance();\n } else {\n const monitor = new BalanceMonitor(address);\n balanceInfo = await monitor.checkBalance();\n }\n return {\n exists: true,\n valid: true,\n address,\n solanaAddress,\n balance: balanceInfo.balanceUSD,\n isLow: balanceInfo.isLow,\n isEmpty: balanceInfo.isEmpty,\n source,\n paymentChain,\n };\n } catch {\n return {\n exists: true,\n valid: true,\n address,\n solanaAddress,\n balance: null,\n isLow: false,\n isEmpty: false,\n source,\n paymentChain,\n };\n }\n } catch {\n return {\n exists: false,\n valid: false,\n address: null,\n solanaAddress: null,\n balance: null,\n isLow: false,\n isEmpty: true,\n source: null,\n paymentChain: \"base\",\n };\n }\n}\n\n// Collect network info\nasync function collectNetworkInfo(): Promise {\n const port = getProxyPort();\n\n // Check BlockRun API\n let blockrunReachable = false;\n let blockrunLatency: number | null = null;\n try {\n const start = Date.now();\n const response = await fetch(\"https://blockrun.ai/api/v1/models\", {\n method: \"GET\",\n signal: AbortSignal.timeout(10000),\n });\n blockrunLatency = Date.now() - start;\n blockrunReachable = response.ok || response.status === 402;\n } catch {\n // blockrunReachable already false\n }\n\n // Check local proxy\n let proxyRunning = false;\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`, {\n method: \"GET\",\n signal: AbortSignal.timeout(3000),\n });\n proxyRunning = response.ok;\n } catch {\n // proxyRunning already false\n }\n\n return {\n blockrunApi: { reachable: blockrunReachable, latencyMs: blockrunLatency },\n localProxy: { running: proxyRunning, port },\n };\n}\n\n// Collect log info\nasync function collectLogInfo(): Promise {\n try {\n const stats = await getStats(1); // Last 1 day\n return {\n requestsLast24h: stats.totalRequests,\n costLast24h: `$${stats.totalCost.toFixed(4)}`,\n errorsFound: 0, // TODO: parse error logs\n };\n } catch {\n return {\n requestsLast24h: 0,\n costLast24h: \"$0.00\",\n errorsFound: 0,\n };\n }\n}\n\n// Identify issues\nfunction identifyIssues(result: DiagnosticResult): string[] {\n const issues: string[] = [];\n\n if (!result.wallet.exists) {\n issues.push(\"No wallet found\");\n }\n if (result.wallet.isEmpty) {\n const chain = result.wallet.paymentChain === \"solana\" ? \"Solana\" : \"Base\";\n issues.push(`Wallet is empty - need to fund with USDC on ${chain}`);\n if (result.wallet.paymentChain === \"base\" && result.wallet.solanaAddress) {\n issues.push(\"Tip: if you funded Solana, run /wallet solana to switch chains\");\n }\n } else if (result.wallet.isLow) {\n issues.push(\"Wallet balance is low (< $1.00)\");\n }\n if (!result.network.blockrunApi.reachable) {\n issues.push(\"Cannot reach BlockRun API - check internet connection\");\n }\n if (!result.network.localProxy.running) {\n issues.push(`Local proxy not running on port ${result.network.localProxy.port}`);\n }\n if (result.latestVersion && result.latestVersion !== result.version) {\n issues.push(\n `Outdated version: running v${result.version}, latest is v${result.latestVersion}. Run: curl -fsSL https://blockrun.ai/xclawrouter-update | bash`,\n );\n }\n\n return issues;\n}\n\n// Print diagnostics to terminal\nfunction printDiagnostics(result: DiagnosticResult): void {\n console.log(\"\\n🔍 Collecting diagnostics...\\n\");\n\n // Version\n console.log(\"Version\");\n if (result.latestVersion && result.latestVersion !== result.version) {\n console.log(` ${red(`Installed: v${result.version} (outdated!)`)}`);\n console.log(` ${yellow(`Latest: v${result.latestVersion}`)}`);\n console.log(\n ` ${yellow(`Update: curl -fsSL https://blockrun.ai/xclawrouter-update | bash`)}`,\n );\n } else if (result.latestVersion) {\n console.log(` ${green(`v${result.version} (up to date)`)}`);\n } else {\n console.log(` ${green(`v${result.version}`)}`);\n }\n\n // System\n console.log(\"\\nSystem\");\n console.log(` ${green(`OS: ${result.system.os}`)}`);\n console.log(` ${green(`Node: ${result.system.nodeVersion}`)}`);\n console.log(\n ` ${green(`Memory: ${result.system.memoryFree} free / ${result.system.memoryTotal}`)}`,\n );\n\n // Wallet\n console.log(\"\\nWallet\");\n if (result.wallet.exists && result.wallet.valid) {\n console.log(` ${green(`Key: ${WALLET_FILE} (${result.wallet.source})`)}`);\n console.log(` ${green(`EVM Address: ${result.wallet.address}`)}`);\n if (result.wallet.solanaAddress) {\n console.log(` ${green(`Solana Address: ${result.wallet.solanaAddress}`)}`);\n }\n const chainLabel = result.wallet.paymentChain === \"solana\" ? \"Solana\" : \"Base\";\n console.log(` ${green(`Chain: ${chainLabel}`)}`);\n if (result.wallet.isEmpty) {\n console.log(\n ` ${red(`Balance: $0.00 - NEED TO FUND WITH USDC ON ${chainLabel.toUpperCase()}!`)}`,\n );\n if (result.wallet.paymentChain === \"base\" && result.wallet.solanaAddress) {\n console.log(` ${yellow(`Tip: funded Solana instead? Run /wallet solana to switch`)}`);\n }\n } else if (result.wallet.isLow) {\n console.log(` ${yellow(`Balance: ${result.wallet.balance} (low)`)}`);\n } else if (result.wallet.balance) {\n console.log(` ${green(`Balance: ${result.wallet.balance}`)}`);\n } else {\n console.log(` ${yellow(`Balance: checking...`)}`);\n }\n } else {\n console.log(` ${red(\"No wallet found\")}`);\n }\n\n // Network\n console.log(\"\\nNetwork\");\n if (result.network.blockrunApi.reachable) {\n console.log(\n ` ${green(`BlockRun API: reachable (${result.network.blockrunApi.latencyMs}ms)`)}`,\n );\n } else {\n console.log(` ${red(\"BlockRun API: unreachable\")}`);\n }\n if (result.network.localProxy.running) {\n console.log(` ${green(`Local proxy: running on :${result.network.localProxy.port}`)}`);\n } else {\n console.log(` ${red(`Local proxy: not running on :${result.network.localProxy.port}`)}`);\n }\n\n // Logs\n console.log(\"\\nLogs\");\n console.log(\n ` ${green(`Last 24h: ${result.logs.requestsLast24h} requests, ${result.logs.costLast24h} spent`)}`,\n );\n if (result.logs.errorsFound > 0) {\n console.log(` ${yellow(`${result.logs.errorsFound} errors found in logs`)}`);\n }\n\n // Issues summary\n if (result.issues.length > 0) {\n console.log(\"\\n⚠️ Issues Found:\");\n for (const issue of result.issues) {\n console.log(` • ${issue}`);\n }\n }\n}\n\n// Model options for doctor command\ntype DoctorModel = \"sonnet\" | \"opus\";\n\nconst DOCTOR_MODELS: Record = {\n sonnet: {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n cost: \"~$0.003\",\n },\n opus: {\n id: \"anthropic/claude-opus-4.7\",\n name: \"Claude Opus 4.7\",\n cost: \"~$0.01\",\n },\n};\n\n// Send to AI for analysis\nasync function analyzeWithAI(\n diagnostics: DiagnosticResult,\n userQuestion?: string,\n model: DoctorModel = \"sonnet\",\n): Promise {\n // Check if wallet has funds\n if (diagnostics.wallet.isEmpty) {\n console.log(\"\\n💳 Wallet is empty - cannot call AI for analysis.\");\n console.log(` Fund your EVM wallet with USDC on Base: ${diagnostics.wallet.address}`);\n if (diagnostics.wallet.solanaAddress) {\n console.log(` Fund your Solana wallet with USDC: ${diagnostics.wallet.solanaAddress}`);\n }\n console.log(\" Get USDC: https://www.coinbase.com/price/usd-coin\");\n console.log(\" Bridge to Base: https://bridge.base.org\\n\");\n return;\n }\n\n const modelConfig = DOCTOR_MODELS[model];\n console.log(`\\n📤 Sending to ${modelConfig.name} (${modelConfig.cost})...\\n`);\n\n try {\n const { key } = await resolveOrGenerateWalletKey();\n const account = privateKeyToAccount(key as `0x${string}`);\n const publicClient = createPublicClient({ chain: base, transport: http() });\n const evmSigner = toClientEvmSigner(account, publicClient);\n const x402 = new x402Client();\n registerExactEvmScheme(x402, { signer: evmSigner });\n\n // Register Solana scheme if user is on Solana chain\n const paymentChain = diagnostics.wallet.paymentChain;\n if (paymentChain === \"solana\") {\n try {\n if (!existsSync(MNEMONIC_FILE)) {\n throw new Error(`mnemonic file missing at ${MNEMONIC_FILE}`);\n }\n const mnemonic = readFileSync(MNEMONIC_FILE, \"utf8\").trim();\n if (!mnemonic) throw new Error(\"mnemonic file empty\");\n const { deriveSolanaKeyBytes } = await import(\"./wallet.js\");\n const { registerExactSvmScheme } = await import(\"@x402/svm/exact/client\");\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(solanaKeyBytes);\n registerExactSvmScheme(x402, { signer: solanaSigner });\n } catch (err) {\n console.log(\n ` ⚠ Could not register Solana signer: ${err instanceof Error ? err.message : String(err)}`,\n );\n console.log(` ⚠ Falling back to Base (EVM) — doctor request may fail on Solana chain\\n`);\n }\n }\n\n const paymentFetch = wrapFetchWithPayment(fetch, x402);\n const apiUrl =\n paymentChain === \"solana\"\n ? \"https://sol.blockrun.ai/api/v1/chat/completions\"\n : \"https://blockrun.ai/api/v1/chat/completions\";\n\n const response = await paymentFetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: modelConfig.id,\n stream: false,\n messages: [\n {\n role: \"system\",\n content: `You are a technical support expert for BlockRun and XClawRouter.\nAnalyze the diagnostics and:\n1. Identify the root cause of any issues\n2. Provide specific, actionable fix commands (bash)\n3. Explain why the issue occurred briefly\n4. Be concise but thorough\n5. Format commands in code blocks`,\n },\n {\n role: \"user\",\n content: userQuestion\n ? `Here are my system diagnostics:\\n\\n${JSON.stringify(diagnostics, null, 2)}\\n\\nUser's question: ${userQuestion}`\n : `Here are my system diagnostics:\\n\\n${JSON.stringify(diagnostics, null, 2)}\\n\\nPlease analyze and help me fix any issues.`,\n },\n ],\n max_tokens: 1000,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n console.log(`Error: ${response.status} - ${text}`);\n return;\n }\n\n const data = await response.json();\n const content = data.choices?.[0]?.message?.content;\n\n if (content) {\n console.log(\"🤖 AI Analysis:\\n\");\n console.log(content);\n console.log();\n } else {\n console.log(\"Error: No response from AI\");\n }\n } catch (err) {\n console.log(`\\nError calling AI: ${err instanceof Error ? err.message : String(err)}`);\n console.log(\"Try again or check your wallet balance.\\n\");\n }\n}\n\n// Main entry point\nexport async function runDoctor(\n userQuestion?: string,\n model: \"sonnet\" | \"opus\" = \"sonnet\",\n): Promise {\n console.log(`\\n🩺 BlockRun Doctor v${VERSION}\\n`);\n\n // Collect all diagnostics\n const [system, wallet, network, logs, latestVersion] = await Promise.all([\n collectSystemInfo(),\n collectWalletInfo(),\n collectNetworkInfo(),\n collectLogInfo(),\n fetchLatestVersion(),\n ]);\n\n const result: DiagnosticResult = {\n version: VERSION,\n latestVersion,\n timestamp: new Date().toISOString(),\n system,\n wallet,\n network,\n logs,\n issues: [],\n };\n\n // Identify issues\n result.issues = identifyIssues(result);\n\n // Print to terminal\n printDiagnostics(result);\n\n // Send to AI for analysis\n await analyzeWithAI(result, userQuestion, model);\n}\n","/**\n * Partner Service Registry\n *\n * Defines available partner APIs that can be called through ClawRouter's proxy.\n * Partners cover prediction-market data, realtime market quotes, and image/video\n * generation — all paid via x402 micropayments on the same wallet as LLM calls.\n */\n\nexport type PartnerServiceParam = {\n name: string;\n type: \"string\" | \"string[]\" | \"number\";\n description: string;\n required: boolean;\n};\n\nexport type PartnerCategory = \"Prediction markets\" | \"Market data\" | \"Image & Video\";\n\nexport type PartnerServiceDefinition = {\n /** Unique service ID used in tool names: blockrun_{id} */\n id: string;\n /** Human-readable name */\n name: string;\n /** Partner providing this service */\n partner: string;\n /** Category used for grouping in the `/partners` list view */\n category: PartnerCategory;\n /** Compact one-liner used in the `/partners` list (≤ 40 chars ideal) */\n shortDescription: string;\n /** Full description used for the tool's JSON Schema (LLM sees this) */\n description: string;\n /** Proxy path (relative to /v1) */\n proxyPath: string;\n /** HTTP method */\n method: \"GET\" | \"POST\";\n /** Parameters for the tool's JSON Schema */\n params: PartnerServiceParam[];\n /** Pricing info for display */\n pricing: {\n perUnit: string;\n unit: string;\n minimum: string;\n maximum: string;\n };\n /** Example usage for help text */\n example: {\n input: Record;\n description: string;\n };\n};\n\n/**\n * All registered partner services.\n * New partners are added here — the rest of the system picks them up automatically.\n */\nexport const PARTNER_SERVICES: PartnerServiceDefinition[] = [\n // ---------------------------------------------------------------------------\n // Predexon — Prediction Market Data\n // ---------------------------------------------------------------------------\n {\n id: \"predexon_events\",\n name: \"Polymarket Events\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Live Polymarket events\",\n description:\n \"Get live Polymarket prediction market events with current odds, volume, and liquidity. \" +\n \"Call this for ANY request about prediction markets, Polymarket markets, current odds, \" +\n \"what people are betting on, or market sentiment. \" +\n \"Do NOT use browser or web scraping — this returns structured real-time data directly. \" +\n \"Returns: event title, YES/NO prices (implied probability), volume, liquidity, end date.\",\n proxyPath: \"/pm/polymarket/events\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of events to return (default: 20, max: 100)\",\n required: false,\n },\n {\n name: \"tag\",\n type: \"string\",\n description: \"Filter by category: crypto, politics, sports, science, economics, etc.\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { limit: 20 },\n description: \"Get top 20 live Polymarket events\",\n },\n },\n {\n id: \"predexon_leaderboard\",\n name: \"Polymarket Leaderboard\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Top traders ranked by profit\",\n description:\n \"Get the Polymarket leaderboard of top traders ranked by profit. \" +\n \"Call this for ANY request about top Polymarket traders, whale wallets, best performers, \" +\n \"richest traders, or who is making the most money on Polymarket. \" +\n \"Do NOT use browser or web scraping — this returns structured data directly. \" +\n \"Returns: wallet address/username, total profit, total volume, win rate.\",\n proxyPath: \"/pm/polymarket/leaderboard\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of wallets to return (default: 20, max: 100)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { limit: 20 },\n description: \"Get top 20 Polymarket whale wallets by profit\",\n },\n },\n {\n id: \"predexon_markets\",\n name: \"Polymarket Markets Search\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Market search by keyword\",\n description:\n \"Search and filter Polymarket markets. Use this to find a market by keyword and get its conditionId \" +\n \"for follow-up calls (smart money, top holders, etc.). \" +\n \"Returns: question, conditionId, YES/NO prices, volume.\",\n proxyPath: \"/pm/polymarket/markets\",\n method: \"GET\",\n params: [\n {\n name: \"search\",\n type: \"string\",\n description: \"Keyword to search for (e.g. 'bitcoin', 'election', 'fed rate')\",\n required: false,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of markets to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { search: \"bitcoin\", limit: 10 },\n description: \"Search for Bitcoin-related prediction markets\",\n },\n },\n {\n id: \"predexon_smart_money\",\n name: \"Polymarket Smart Money\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Smart-money positions on a market\",\n description:\n \"See how high-performing wallets are positioned on a specific Polymarket market. \" +\n \"Use this after finding a market's conditionId via predexon_markets or predexon_events. \" +\n \"Returns: wallet addresses, their YES/NO positions, size, P&L, win rate.\",\n proxyPath: \"/pm/polymarket/market/:condition_id/smart-money\",\n method: \"GET\",\n params: [\n {\n name: \"condition_id\",\n type: \"string\",\n description: \"The market's conditionId (get this from predexon_markets or predexon_events)\",\n required: true,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of positions to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { condition_id: \"0xabc123...\", limit: 10 },\n description: \"See smart money positioning on a specific market\",\n },\n },\n {\n id: \"predexon_smart_activity\",\n name: \"Polymarket Smart Activity\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Where smart money is flowing now\",\n description:\n \"Discover which Polymarket markets high-performing wallets are currently active in. \" +\n \"Use this to find where smart money is flowing right now. \" +\n \"Returns: market titles, smart money volume, number of smart wallets active.\",\n proxyPath: \"/pm/polymarket/markets/smart-activity\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of markets to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { limit: 10 },\n description: \"Find markets where smart money is most active\",\n },\n },\n {\n id: \"predexon_wallet\",\n name: \"Polymarket Wallet Profile\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Wallet profile (PnL, winrate, positions)\",\n description:\n \"Get a complete profile for a Polymarket wallet address: profit, volume, win rate, markets traded, open positions. \" +\n \"Use this when the user asks to analyze or look up a specific wallet address.\",\n proxyPath: \"/pm/polymarket/wallet/:wallet\",\n method: \"GET\",\n params: [\n {\n name: \"wallet\",\n type: \"string\",\n description: \"Ethereum wallet address (0x...)\",\n required: true,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { wallet: \"0x1234...abcd\" },\n description: \"Get complete profile for a Polymarket wallet\",\n },\n },\n {\n id: \"predexon_wallet_pnl\",\n name: \"Polymarket Wallet P&L\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Wallet P&L time series\",\n description:\n \"Get P&L history and realized profit/loss time series for a Polymarket wallet. \" +\n \"Use this when the user wants to see how a wallet has performed over time.\",\n proxyPath: \"/pm/polymarket/wallet/pnl/:wallet\",\n method: \"GET\",\n params: [\n {\n name: \"wallet\",\n type: \"string\",\n description: \"Ethereum wallet address (0x...)\",\n required: true,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { wallet: \"0x1234...abcd\" },\n description: \"Get P&L history for a Polymarket wallet\",\n },\n },\n {\n id: \"predexon_matching_markets\",\n name: \"Cross-Market Matching (Polymarket vs Kalshi)\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Polymarket ↔ Kalshi market pairs\",\n description:\n \"Find equivalent markets across Polymarket and Kalshi to compare odds and spot arbitrage. \" +\n \"Use this when the user wants to compare prediction market prices across platforms.\",\n proxyPath: \"/pm/matching-markets\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of matched pairs to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { limit: 10 },\n description: \"Compare equivalent markets on Polymarket vs Kalshi\",\n },\n },\n // ---------------------------------------------------------------------------\n // BlockRun Markets — Realtime market data (stocks, crypto, FX, commodities)\n // ---------------------------------------------------------------------------\n {\n id: \"stock_price\",\n name: \"Global Stock Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime stock quote (12 markets)\",\n description:\n \"Get realtime price for a listed equity across 12 global markets. \" +\n \"Call this for ANY request about a specific stock price, quote, or current trading value \" +\n \"on NYSE/Nasdaq, HKEX, TSE, KRX, LSE, XETRA, Euronext, Shanghai/Shenzhen, or Toronto. \" +\n \"Do NOT use browser or web scraping — this returns structured real-time data directly. \" +\n \"Returns: symbol, price, confidence interval, publish time, feed ID.\",\n proxyPath: \"/stocks/:market/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"market\",\n type: \"string\",\n description:\n \"Market code (lowercase): us (NYSE/Nasdaq/AMEX), hk (HKEX), jp (TSE), kr (KRX), \" +\n \"gb (LSE), de (XETRA), fr (Euronext Paris), nl (Euronext Amsterdam), ie (Irish SE), \" +\n \"lu (Luxembourg SE), cn (Shanghai/Shenzhen ETFs), ca (TSX).\",\n required: true,\n },\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Ticker for the given market. Examples: AAPL (us), 0700-HK (hk), 7203 (jp), \" +\n \"005930 (kr), HSBA (gb), SAP (de), MC (fr), AIR (nl), VUSA (ie), MT (lu), 510310 (cn), HODL (ca).\",\n required: true,\n },\n {\n name: \"session\",\n type: \"string\",\n description: \"Optional session hint: pre, post, or on (regular hours).\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { market: \"us\", symbol: \"AAPL\" },\n description: \"Get realtime Apple stock price\",\n },\n },\n {\n id: \"stock_history\",\n name: \"Global Stock OHLC History\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"OHLC bars (1m–monthly)\",\n description:\n \"Get historical OHLC (candlestick) bars for a listed equity across 12 global markets. \" +\n \"Use this for charting, backtesting, or any request about a stock's past price action. \" +\n \"Supports resolutions: 1, 5, 15, 60, 240 (minutes) and D, W, M (daily/weekly/monthly). \" +\n \"Returns: OHLC arrays (open, high, low, close, volume, timestamps).\",\n proxyPath: \"/stocks/:market/history/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"market\",\n type: \"string\",\n description:\n \"Market code (lowercase): us, hk, jp, kr, gb, de, fr, nl, ie, lu, cn, ca. \" +\n \"See stock_price for full market descriptions.\",\n required: true,\n },\n {\n name: \"symbol\",\n type: \"string\",\n description: \"Ticker for the given market (e.g. AAPL for us, 0700-HK for hk).\",\n required: true,\n },\n {\n name: \"resolution\",\n type: \"string\",\n description:\n \"Bar resolution: 1, 5, 15, 60, 240 (minutes) or D, W, M (daily/weekly/monthly). Default: D.\",\n required: false,\n },\n {\n name: \"from\",\n type: \"number\",\n description: \"Start time as Unix epoch seconds (required).\",\n required: true,\n },\n {\n name: \"to\",\n type: \"number\",\n description: \"End time as Unix epoch seconds. Default: now.\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { market: \"us\", symbol: \"AAPL\", resolution: \"D\", from: 1704067200 },\n description: \"Get daily OHLC bars for AAPL starting Jan 1 2024\",\n },\n },\n {\n id: \"stock_list\",\n name: \"Global Stock Ticker List\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Ticker search — free\",\n description:\n \"List and search supported tickers for a given stock market. Use this to resolve a company \" +\n \"name to a ticker before calling stock_price or stock_history. FREE — no x402 payment.\",\n proxyPath: \"/stocks/:market/list\",\n method: \"GET\",\n params: [\n {\n name: \"market\",\n type: \"string\",\n description: \"Market code: us, hk, jp, kr, gb, de, fr, nl, ie, lu, cn, ca.\",\n required: true,\n },\n {\n name: \"q\",\n type: \"string\",\n description: \"Optional search query to filter tickers by symbol or description.\",\n required: false,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Max results to return (default: 100, max: 2000).\",\n required: false,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { market: \"us\", q: \"apple\", limit: 5 },\n description: \"Search US market for 'apple' tickers\",\n },\n },\n {\n id: \"crypto_price\",\n name: \"Crypto Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime crypto price — free\",\n description:\n \"Get realtime crypto price. Call this for ANY request about current crypto \" +\n \"prices (BTC, ETH, SOL, etc.). FREE — no x402 payment. Quote is always USD. \" +\n \"Do NOT use browser or web scraping — this returns structured real-time data directly.\",\n proxyPath: \"/crypto/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Crypto pair in BASE-QUOTE form. Examples: BTC-USD, ETH-USD, SOL-USD, DOGE-USD. \" +\n \"Quote is always USD.\",\n required: true,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { symbol: \"BTC-USD\" },\n description: \"Get realtime Bitcoin price\",\n },\n },\n {\n id: \"fx_price\",\n name: \"Foreign Exchange Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime FX rate — free\",\n description:\n \"Get realtime FX rate. Call this for ANY request about currency exchange rates. \" +\n \"FREE — no x402 payment. Do NOT use browser or web scraping.\",\n proxyPath: \"/fx/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Currency pair in BASE-QUOTE form. Examples: EUR-USD, GBP-USD, JPY-USD, CNY-USD.\",\n required: true,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { symbol: \"EUR-USD\" },\n description: \"Get realtime EUR/USD exchange rate\",\n },\n },\n {\n id: \"commodity_price\",\n name: \"Commodity Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime commodity spot — free\",\n description:\n \"Get realtime commodity spot price (gold, silver, platinum, etc.). \" +\n \"FREE — no x402 payment. Do NOT use browser or web scraping.\",\n proxyPath: \"/commodity/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Commodity code in BASE-USD form. Examples: XAU-USD (gold), XAG-USD (silver), XPT-USD (platinum).\",\n required: true,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { symbol: \"XAU-USD\" },\n description: \"Get realtime gold spot price\",\n },\n },\n // ---------------------------------------------------------------------------\n // BlockRun — Image & Video generation\n // ---------------------------------------------------------------------------\n {\n id: \"image_generation\",\n name: \"Image Generation\",\n partner: \"BlockRun\",\n category: \"Image & Video\",\n shortDescription: \"8 image models (DALL-E, Flux, Grok, ...)\",\n description:\n \"Generate an image from a text prompt. Models available: google/nano-banana (default), \" +\n \"google/nano-banana-pro (up to 4K), openai/gpt-image-1, openai/dall-e-3, \" +\n \"black-forest/flux-1.1-pro, xai/grok-imagine-image, xai/grok-imagine-image-pro, \" +\n \"zai/cogview-4. Returns a local http://localhost:8402/images/.png URL.\",\n proxyPath: \"/images/generations\",\n method: \"POST\",\n params: [\n {\n name: \"prompt\",\n type: \"string\",\n description: \"Text prompt describing the desired image.\",\n required: true,\n },\n {\n name: \"model\",\n type: \"string\",\n description:\n \"Full model ID (e.g. 'google/nano-banana', 'openai/dall-e-3'). Default: google/nano-banana.\",\n required: false,\n },\n {\n name: \"size\",\n type: \"string\",\n description:\n \"Image size, e.g. '1024x1024', '1792x1024', '4096x4096'. Model-dependent — see image model table.\",\n required: false,\n },\n {\n name: \"n\",\n type: \"number\",\n description: \"Number of images to generate (default 1, max 4).\",\n required: false,\n },\n ],\n pricing: {\n perUnit: \"$0.015–$0.15\",\n unit: \"image\",\n minimum: \"$0.015 (cogview-4)\",\n maximum: \"$0.15 (nano-banana-pro 4K)\",\n },\n example: {\n input: { model: \"google/nano-banana\", prompt: \"a golden retriever surfing on a wave\" },\n description: \"Generate an image with Nano Banana\",\n },\n },\n {\n id: \"image_edit\",\n name: \"Image Edit / Inpainting\",\n partner: \"BlockRun\",\n category: \"Image & Video\",\n shortDescription: \"Edit existing image (gpt-image-1)\",\n description:\n \"Edit or re-style an existing image via openai/gpt-image-1. \" +\n \"Supply `image` as a data URI, https URL, or local file path; optional `mask` for inpainting.\",\n proxyPath: \"/images/image2image\",\n method: \"POST\",\n params: [\n {\n name: \"prompt\",\n type: \"string\",\n description: \"Text prompt describing how to edit the image.\",\n required: true,\n },\n {\n name: \"image\",\n type: \"string\",\n description: \"Source image — data URI, https URL, or local path (~/... or /abs/path).\",\n required: true,\n },\n {\n name: \"mask\",\n type: \"string\",\n description: \"Optional inpainting mask in the same formats as `image`.\",\n required: false,\n },\n ],\n pricing: {\n perUnit: \"$0.02–$0.04\",\n unit: \"image\",\n minimum: \"$0.02\",\n maximum: \"$0.04 (1536x1024)\",\n },\n example: {\n input: { prompt: \"make the sky sunset orange\", image: \"~/Pictures/beach.png\" },\n description: \"Edit a local image with gpt-image-1\",\n },\n },\n {\n id: \"video_generation\",\n name: \"Video Generation\",\n partner: \"BlockRun\",\n category: \"Image & Video\",\n shortDescription: \"Grok Imagine + Seedance, 5–10s\",\n description:\n \"Generate a short video (5–10s) via xai/grok-imagine-video or bytedance/seedance-1.5-pro \" +\n \"(default, cheapest) / seedance-2.0-fast / seedance-2.0. Async — upstream polling takes \" +\n \"30–120 seconds. Returns a local http://localhost:8402/videos/.mp4 URL.\",\n proxyPath: \"/videos/generations\",\n method: \"POST\",\n params: [\n {\n name: \"prompt\",\n type: \"string\",\n description: \"Text prompt describing the video.\",\n required: true,\n },\n {\n name: \"model\",\n type: \"string\",\n description:\n \"Full model ID. Options: bytedance/seedance-1.5-pro (default), bytedance/seedance-2.0-fast, \" +\n \"bytedance/seedance-2.0, xai/grok-imagine-video.\",\n required: false,\n },\n {\n name: \"duration_seconds\",\n type: \"number\",\n description: \"Clip length in seconds. Supported: 5, 8, 10. Default depends on model.\",\n required: false,\n },\n ],\n pricing: {\n perUnit: \"$0.03–$0.30\",\n unit: \"second\",\n minimum: \"$0.15 (seedance-1.5-pro 5s)\",\n maximum: \"$3.00 (seedance-2.0 10s)\",\n },\n example: {\n input: { model: \"bytedance/seedance-1.5-pro\", prompt: \"a cat waving\", duration_seconds: 5 },\n description: \"Generate a 5-second Seedance video\",\n },\n },\n];\n\n/**\n * Get a partner service by ID.\n */\nexport function getPartnerService(id: string): PartnerServiceDefinition | undefined {\n return PARTNER_SERVICES.find((s) => s.id === id);\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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M,IAAI,YAAY,wCAAwC,EAAE,OAAO,uBAAuB,QAAA,CAAS;EAC3G;AACA,wBAAsB,KAAK,8BAA8B;AACzD,SAAO;AACX;AAEA,SAAS,mBAAmB,OAA2C;AACnE,SACI,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,aAAa,UACZ,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,SAAS,aACzD,OAAO,MAAM,YAAY;AAEjC;AC5HO,SAAS,sBAAsB,OAAyB;AAC3D,QAAM,kBAAqC;IACvC;IACA;EAAA;AAEJ,MAAI,cAAc,KAAK,KAAK,CAAC,CAAC,MAAM,SAAS,gBAAgB,SAAS,MAAM,QAAQ,MAAM,GAAG;AACzF,WAAO,MAAM;EACjB;AACA,SAAO;AACX;IVnBa,qCACA,6BACA,uCACA,oDACA,6CACA,qCACA,uCACA,uCACA,sCACA,wCAKA,qCACA,wCACA,wCACA,0CACA,yCACA,oEACA,8DACA,kEACA,mEACA,sEACA,qEACA,yEACA,oCACA,wEACA,wEACA,qEACA,kDACA,mDACA,kFACA,qDACA,0DACA,iFACA,yEACA,uDAIA,8CACA,qDACA,yDACA,qDACA,wCACA,qDACA,2DACA,uDACA,uDACA,8DACA,mDACA,oDAIA,2CACA,wDACA,kDACA,kDACA,6DAIA,6DACA,mDACA,8DACA,4DACA,8DACA,0DACA,4DACA,gEAIA,4DAIA,kDACA,qDACA,mDACA,0DACA,uDAIA,sDACA,kDACA,gDAKA,0CACA,gDACA,mDACA,2DACA,uDACA,yDACA,qDACA,uDACA,6DACA,8DACA,wDACA,yDACA,sDACA,iEACA,iEACA,0DACA,yDACA,0DACA,sDACA,sDACA,0DACA,4DACA,yDACA,wDACA,6DACA,gEACA,yCACA,gDACA,2DACA,4DACA,qEACA,yDACA,6CACA,kDACA,yDACA,2DACA,gDACA,kDACA,gEACA,uDACA,oEACA,6DACA,4DACA,4CACA,sDACA,iDACA,0DACA,wDACA,sDACA,qDACA,gDACA,yEACA,wDACA,wEACA,8EAIA,4DACA,gDACA,+CACA,yDACA,uDACA,mDACA,6DACA,2DACA,2DACA,wEACA,0DACA,sDAIA,yDACA,8EACA,+EACA,wEACA,yDACA,qEACA,8DACA,yDACA,yDACA,2DACA,wEACA,oDACA,2DACA,wEACA,oDACA,4DACA,4DACA,gEAIA,6DACA,kEACA,wDACA,oDACA,wDACA,sFACA,wFACA,sFACA,kEACA,+CACA,4CACA,8CACA,wDACA,2EACA,8FACA,8DACA,gEACA,wDACA,6DACA,6EACA,+CACA,yDACA,oEAKA,0CACA,iDACA,uDACA,oDACA,4DACA,6DACA,0DACA,oDACA,sDAEA,sDACA,4DACA,wDACA,oDACA,gEACA,mDACA,sDACA,6DACA,oEACA,sDACA,2DACA,sEACA,wEACA,yDACA,iEACA,qEACA,oEACA,qEACA,8DACA,mEACA,wEACA,wDACA,8DACA,yEACA,0EACA,wDACA,2EACA,yDAIA,kEACA,kEACA,yDACA,qEACA,gFACA,kFACA,8DACA,8DACA,qEACA,8EAIA,sDACA,2CACA,6CACA,gDACA,mEACA,2DACA,yDACA,+CACA,uDACA,2DACA,4CACA,2CACA,+CACA,qDACA,2CACA,qDACA,gEACA,kDACA,wCACA,oEACA,+DACA,yDACA,wEACA,qEAIA,qCACA,oDACA,yCACA,oDAIA,kEACA,kEACA,yEACA,4DACA,4DAMA,wEACA,kHACA,kFACA,8DACA,yEACA,kEACA,kEEnEA,qBC1QP,aACA,MCsFO,aGhGP,qBCaAA;;;;ARUC,IAAM,sCAAsC;AAC5C,IAAM,8BAA8B;AACpC,IAAM,wCAAwC;AAC9C,IAAM,qDAAqD;AAC3D,IAAM,8CAA8C;AACpD,IAAM,sCAAsC;AAC5C,IAAM,wCAAwC;AAC9C,IAAM,wCAAwC;AAC9C,IAAM,uCAAuC;AAC7C,IAAM,yCAAyC;AAK/C,IAAM,sCAAsC;AAC5C,IAAM,yCAAyC;AAC/C,IAAM,yCAAyC;AAC/C,IAAM,2CAA2C;AACjD,IAAM,0CAA0C;AAChD,IAAM,qEAAqE;AAC3E,IAAM,+DAA+D;AACrE,IAAM,mEAAmE;AACzE,IAAM,oEAAoE;AAC1E,IAAM,uEAAuE;AAC7E,IAAM,sEAAs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CACrD;AACD,SAAO,0BAAgC;IACnC,aAAa,EAAE,SAAS,GAAG,KAAA,GAAQ;AAC/B,aAAO,iCAAiC;QACpC,GAAG;QACH;QACA,kBAAkB,EAAE,GAAG,SAAS,YAAY,QAAQ,WAAW,QAAQ,kBAAkB,WAAW,EAAA;QACpG,uBAAuB,QAAQ,WAAW,QAAQ,kBAAkB,aAAa;MAAA,CACpF;IACL;IACA;EAAA,CACH;AACL;AAEO,SAAS,gCACZ,QACyB;AACzB,SAAO,yCAA+C,MAAM;AAChE;AAEO,SAAS,yCAAyC,QAAiB;AACtE,SAAO;IACH;EAAA;AAER;AAUA,SAASA,6BAEP;AACE,MAAI,CAACC,mBAAkB;AACnB,IAAAA,oBAAmB;MACf,sBAAsB,0BAA0B,IAAI,CAAAC,OAAK,CAAC,SAAS,GAAGA,EAAC,CAAC;MACxE,oBAAoB;QAChB;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ,CAAC,SAAS,SAAS,gBAAgB,kBAAkB,QAAQ,WAAW,kBAAkB,YAAY;QACtG;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;U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MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;AC5dA,IAAAG,qBAAA;AAAA;AAAA;AAKA,QAAM;AAAA;AAAA,MAA6C;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QAC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;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;A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Q,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,S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;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA;AAAA,MAEjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA;AAAA,MAEd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA;AAAA,MAEjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA;AAAA,MAEhB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAGA,iBAAiB;AAAA;AAAA,MAEf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,sBAAsB;AAAA;AAAA,MAEpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,sBAAsB;AAAA;AAAA,MAEpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA;AAAA,MAEjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA;AAAA,MAEhB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,wBAAwB;AAAA;AAAA,MAEtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;AAAA,IAIA,qBAAqB;AAAA;AAAA,MAEnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAA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","names":["docsPath","signature","signature","signature","signature","signature","abi","signature","signature","signature","length","formatAbiItem","init_formatAbiItem","version","init_version","BaseError","init_version","docsPath","version","init_formatAbiItem","BaseError","docsPath","size","signature","formatAbiItem","BaseError","size","size","BaseError","size","size","size","index","BaseError","encoder","l","s","crypto","toBytes","pad","crypto","init_utils","s","init_utils","l","toBytes","signature","BaseError","BaseError","address","size","hash","address","address","cacheKey","concatBytes","bytesRegex","integerRegex","init_regex","size","integerRegex","length","BaseError","index","init_regex","abi","index","abi","docsPath","formatAbiItem","init_formatAbiItem","abi","signature","BaseError","init_cursor","size","data","length","consumed","value","size","init_cursor","abi","signature","formatAbiItem","init_formatAbiItem","value","address","BaseError","BaseError","docsPath","chain","hash","index","init_utils","address","init_formatAbiItem","init_utils","BaseError","docsPath","chain","abi","formatAbiItem","signature","init_utils","BaseError","BaseError","docsPath","address","isLE","_32n","l","c","init_utils","toBytes","buffer","finished","init_utils","D","init_utils","hash","toBytes","pad","finished","isBytes","abytes","num","hexToNumber","_0n","bytesToHex","hexes","hexToBytes","e","concatBytes","pad","utf8ToBytes","_1n","gen","init_utils","_0n","modulo","_1n","gcd","_2n","P","c","num","bitLen","isLE","init_utils","_1n","c","s","P","_0n","base","wbits","init_utils","num","size","bytesToHex","Fn","toBytes","concatBytes","fromBytes","_3n","_4n","_1n","isBytes","Point","P","endo","_0n","a","modN","s","from","l","hexToBytes","utils","hash","randomBytes","e","sign","signature","isHex","o","_2n","tv5","c1","c2","isValid","init_utils","hash","create","init_utils","abytes","concatBytes","utf8ToBytes","hash","e","createHasher","Point","num","P","init_utils","P","_3n","_2n","c","concatBytes","_1n","_0n","e","signature","s","init_utils","createHasher","encode","BaseError","init_cursor","address","hash","BaseError","BaseError","e","formatted","address","init_stateOverride","address","sha256","sha256","init_sha256","version","sha256","init_sha256","version","init_blob","BaseError","size","hash","version","size","init_blob","init_cursor","abi","docsPath","isBytes","abytes","abool","numberToHexUnpadded","num","hexToNumber","_0n","bytesToHex","hasHexBuiltin","hexes","asciiToBase16","asciis","hexToBytes","bytesToNumberBE","bytesToNumberLE","numberToBytesBE","numberToBytesLE","ensureBytes","e","concatBytes","pad","inRange","isPosBig","aInRange","bitLen","_1n","createHmacDrbg","u8n","u8fr","gen","validateObject","validatorFns","memoized","bitMask","init_utils","version","init_version","version","init_errors","init_version","walk","BaseError","init_errors","docsPath","version","assertSize","size","SizeOverflowError","assertStartOffset","SliceOffsetOutOfBoundsError","assertEndOffset","charCodeToBase16","charCodeMap","pad","SizeExceedsPaddingSizeError","trim","assertSize","size","SizeOverflowError","assertStartOffset","SliceOffsetOutOfBoundsError","assertEndOffset","pad","SizeExceedsPaddingSizeError","trim","stringify","value","size","assertSize","index","charCodeToBase16","BaseError","encoder","padRight","pad","slice","assertStartOffset","assertEndOffset","toBigInt","InvalidBytesBooleanError","toNumber","trim","SizeOverflowError","SliceOffsetOutOfBoundsError","SizeExceedsPaddingSizeError","stringify","assert","concat","from","assertSize","hexes","size","IntegerOutOfRangeError","fromString","encoder","pad","slice","assertStartOffset","assertEndOffset","trimLeft","trim","validate","SizeOverflowError","SliceOffsetOutOfBoundsError","SizeExceedsPaddingSizeError","BaseError","stringify","toRpc","init_contract","BaseError","chain","abi","docsPath","chain","docsPath","cause","wait","args","split","init_utils","BaseError","abi","signature","formatAbiItem","init_formatAbiItem","abi","docsPath","formatAbiItem","signature","init_formatAbiItem","abi","docsPath","ccipRequest","init_ccip","BaseError","toRpc","base","data","offchainLookup","offchainLookupSignature","wait","args","size","init_contract","init_stateOverride","address","hash","version","BaseError","init_blob","address","signature","blobs","commitments","proofs","v","s","signature","BaseError","integerRegex","base","bytesRegex","struct","init_typedData","init_regex","init_typedData","s","signature","isBytes","anumber","wrap","c","encode","decode","l","from","padding","num","checksum","hash","c","init_utils","wordlist","e","init_esm","init_utils","hash","s","signature","address","signature","signature","address","hash","size","isBytes","anumber","abytes","ahash","aexists","aoutput","clean","createView","rotr","bytesToHex","hasHexBuiltin","hexes","asciiToBase16","asciis","hexToBytes","concatBytes","pad","createHasher","randomBytes","init_utils","Chi","c","Maj","HashMD","SHA256_IV","init_md","init_utils","isLE","createView","aexists","abytes","buffer","aoutput","clean","finished","SHA256_K","SHA256_W","sha256","init_sha2","init_md","init_utils","HashMD","D","rotr","Chi","Maj","clean","SHA256_IV","createHasher","abool","isPosBig","anumber","numberToHexUnpadded","num","hexToNumber","_0n","bytesToNumberBE","bytesToHex","bytesToNumberLE","abytes","numberToBytesBE","hexToBytes","numberToBytesLE","inRange","aInRange","bitLen","_1n","createHmacDrbg","u8n","concatBytes","gen","validateObject","memoized","bitMask","init_utils","mod","_0n","pow2","modulo","invert","_1n","gcd","sqrt3mod4","_4n","sqrt5mod8","_5n","_8n","_2n","P","Field","tonelliShanks","_7n","e2","e3","_3n","FpLegendre","c","FpSqrt","validateField","FIELD_FIELDS","validateObject","FpPow","num","FpInvertBatch","nLength","anumber","getFieldBytesLength","getMinHashLength","mapHashToField","isLE","abytes","bytesToNumberLE","bytesToNumberBE","numberToBytesLE","numberToBytesBE","init_modular","init_utils","c","FpInvertBatch","validateW","calcWOpts","bitMask","calcOffsets","_1n","getW","P","pointWindowSizes","_0n","Point","isLE","validateField","Field","Fn","pointPrecomputes","wNAF","init_curve","init_utils","init_modular","base","hmac","init_hmac","init_utils","hash","ahash","abytes","pad","clean","aexists","finished","divNearest","_0n","bitMask","bitLen","_1n","abool","weierstrass","Fn","validateObject","pointToBytes","concatBytes","abytes","_3n","_4n","Point","memoized","P","hexToBytes","endo","bytesToHex","wNAF","randomBytes","getMinHashLength","num","l","mapHashToField","isBytes","s","utils","hash","ahash","hmac","_2n","size","r","DER","bytesToNumberBE","aInRange","extraEntropy","e","sign","createHmacDrbg","signature","recoverPublicKey","DERErr","init_weierstrass","init_hmac","init_utils","init_curve","init_modular","numberToHexUnpadded","sqrtMod","P","_3n","pow2","_2n","Fpk1","secp256k1","init_secp256k1","init_sha2","init_modular","init_weierstrass","Field","weierstrass","sha256","isBytes","anumber","abytes","ahash","aexists","aoutput","clean","createView","rotr","concatBytes","pad","createHasher","oidNist","init_utils","_HMAC","hmac","init_hmac","init_utils","hash","ahash","abytes","pad","clean","aexists","finished","Chi","c","Maj","HashMD","SHA256_IV","SHA512_IV","init_md","init_utils","isLE","createView","aexists","abytes","buffer","aoutput","clean","finished","init_md","init_utils","HashMD","clean","createHasher","fromBig","U32_MASK64","_32n","split","l","add","shrSH","shrSL","rotrSH","rotrSL","rotrBH","rotrBL","add3L","add3H","add4L","add4H","add5L","add5H","init_u64","s","SHA256_K","SHA256_W","SHA2_32B","_SHA256","K512","SHA512_Kh","SHA512_Kl","SHA512_W_H","SHA512_W_L","sha256","sha512","init_sha2","init_md","init_u64","init_utils","HashMD","D","rotr","Chi","Maj","clean","SHA256_IV","split","rotrSH","shrSH","rotrSL","shrSL","rotrBH","rotrBL","add4L","add4H","add5L","add5H","add","add3L","add3H","SHA512_IV","createHasher","oidNist","isBytes","isArrayOf","afn","astr","anumber","aArr","astrArr","anumArr","chain","wrap","c","encode","decode","alphabet","l","join","from","convertRadix","radix","num","checksum","init_base","sha256","Point","init_secp256k1","init_hmac","init_sha2","init_utils","init_base","secp256k1","sha256","createView","concatBytes","abytes","hmac","sha512","version","c","index","hash","signature","e","isSolanaError","index","ORDERED_ERROR_NAMES","padBytes","slice","index","encoder","decoder","SolanaError","size","buffer","alphabet","base","charCodeToBase16","TextDecoder","TextEncoder","createEncoder","c","SolanaError","SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE","hexBytes","createDecoder","combineCodec","buffer","decoder","address","index","SolanaError","SolanaError","isAddress","base58Encoder","mod","pow2","SolanaError","address","e","encode","decode","Endian","combineCodec","createEncoder","createDecoder","size","newOffset","createEncoder","createDecoder","slice","combineCodec","getBase16Decoder","SolanaError","index","getEncodedSize","isFixedSize","getU8Encoder","transformEncoder","getU8Decoder","transformDecoder","l","encoder","decoder","containsBytes","init_index_node","AccountRole","isAddress","SolanaError","combineCodec","assertValidBaseString","alphabet","SolanaError","partitionLeadingZeroes","getBigIntFromBaseX","base","getBaseXFromBigInt","getU8Encoder","getU8Decoder","getStructEncoder","getStructDecoder","getArrayEncoder","getShortU16Encoder","getArrayDecoder","getShortU16Decoder","createEncoder","createDecoder","version","combineCodec","transformEncoder","getBase58Encoder","getAddressEncoder","getAddressDecoder","getBase58Decoder","transformDecoder","address","TYPE","index","AccountRole","getAddressComparator","isWritableRole","isSignerRole","l","getBaseXEncoder","getBaseXDecoder","SolanaError","signature","randomBytes","isValid","privateKey","signature","getBytesEncoder","SolanaError","address","index","SYSTEM_PROGRAM_ADDRESS","isAdvanceNonceAccountInstructionData","isAddress","signatureBytes","signTransaction","SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT","index","appendTransactionMessageInstruction","SolanaError","signature","context","traverse","traverseSequential","traverseParallel","traverseSingle","SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND","candidate","message","appendTransactionMessageInstructions","getAbortablePromise","getTransactionMessageSize","TRANSACTION_SIZE_LIMIT","isSolanaError","SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN","SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND","isAddress","version","SolanaError","transformEncoder","getAddressDecoder","getSignaturesToEncode","signature","getSignaturesEncoder","getU8Encoder","getStructEncoder","getBytesEncoder","SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO","address","transformDecoder","getStructDecoder","getArrayDecoder","getBytesDecoder","getU8Decoder","combineCodec","index","SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO","getArrayEncoder","getAddressEncoder","getUtf8Encoder","fixDecoderSize","getTupleDecoder","getUtf8Decoder","SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY","getTupleEncoder","getHiddenPrefixDecoder","SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED","encoder","SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE","signatureBytes","OffchainMessageContentFormat","unwrapBigIntValueObject","wrapBigIntValueObject","traverse","c","pipe","c","SolanaError","stringify","e","normalizeHeaders","AbortController","args","setMaxListeners","init_index_node","createExplicitAbortToken","e","EXPLICIT_ABORT_TOKEN","AbortController","EventTarget","args","setMaxListeners","e","SolanaError","AbortController","args","setMaxListeners","getAllowedNumericKeypaths","memoizedKeypaths","c","concat","buffer","toArrayBuffer","e","PerMessageDeflate","num","data","e","PerMessageDeflate","concat","toArrayBuffer","Receiver","num","PerMessageDeflate","Sender","Event","EventTarget","extension","http","randomBytes","createHash","URL","PerMessageDeflate","Receiver","Sender","WebSocket","address","key","e","WebSocket","createWebSocketStream","err","open","protocol","http","createHash","extension","PerMessageDeflate","subprotocol","WebSocket","WebSocketServer","index","version","WebSocket","s","EventTarget","index_node_default","args","setMaxListeners","WebSocketImpl","createSolanaJsonRpcIntegerOverflowError","e","index","c","pipe","transformChannelInboundMessages","transformChannelOutboundMessages","cache","AbortController","args","setMaxListeners","SolanaError","address","isAddress","offchainMessageEnvelope","SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING","signature","transaction","o","TextEncoder","e","base58Decoder","SolanaError","signature","safeRace","getTimeoutPromise","AbortController","args","setMaxListeners","lamports","l","createRecentSignatureConfirmationPromiseFactory","signature","e","commitmentComparator","index","createKeyPairSignerFromPrivateKeyBytes","init_esm","homedir","e","mkdir","join","homedir","chain","require_constants","buffer","index","assert","stringify","idx","stream","buffer","c","err","s2","util","version","address","assert","Request","err","assert","util","session","require_constants","c","Buffer","Buffer","require_constants","buffer","assert","buffer","assert","encoder","assert","c","o","index","keys","require_util","performance","assert","c","isAborted","index","e","FormData","entry","assert","decoder","buffer","util","FormData","assert","c","chunk","value","e","assert","util","mod","exports","finished","buffer","assert","util","headers","pipe","buffer","assert","http","util","Request","connect","err","client","size","util","origin","util","pool","dispatcher","util","origin","util","result","origin","Buffer","address","buffer","Buffer","version","address","URL","origin","protocol","opts","assert","shouldRetry","size","assert","util","consume","buffer","assert","util","assert","finished","util","res","opaque","assert","util","body","assert","util","assert","util","index","mockDispatch","replyParameters","newMockDispatch","promisify","promisify","result","crypto","normalizeHeaders","writeFile","readFile","mkdir","dirname","setTimeout","clearTimeout","normalizeHeaders","hash","util","require_global","assert","util","assert","normalizeHeaders","normalizeHeaders","cacheKey","util","cacheKey","index","key","entries","entry","assert","require_cache","assert","util","normalizeHeaders","cacheKey","isStale","handleResult","headers","opts","result","util","normalizeHeaders","opts","cacheKey","VERSION","size","assert","util","size","Headers","o","Headers","util","isAborted","assert","Response","require_request","Headers","util","assert","setMaxListeners","Request","assert","crypto","metadata","Request","isAborted","assert","finished","fetch","e","buffer","body","require_util","assert","require_cache","assert","Request","index","e","request","cache","cache","require_constants","require_util","stringify","assert","stringify","Headers","require_constants","uid","require_util","e","toArrayBuffer","buffer","num","buffer","randomFillSync","uid","Headers","assert","crypto","validate","require_permessage_deflate","PerMessageDeflate","require_receiver","assert","PerMessageDeflate","buffer","body","require_sender","node","require_websocket","toArrayBuffer","WebSocket","buffer","e","require_util","e","util","fetch","WebSocket","CACHE_TTL_MS","init_index_node","fixDecoderSize","getBytesDecoder","getStructDecoder","getU64Decoder","getU16Decoder","getOptionDecoder","getAddressDecoder","getU32Decoder","getBooleanDecoder","address","isTransactionSigner","kitIsTransactionSigner","getAddressEncoder","transformEncoder","getStructEncoder","getU8Encoder","getU64Encoder","AccountRole","ASSOCIATED_TOKEN_ERROR__INVALID_OWNER","associatedTokenErrorMessages","AccountState","init_index_node","transformEncoder","getStructEncoder","getU8Encoder","getU32Encoder","appendTransactionMessageInstruction","init_src","init_index_node","x402Version","tx","NETWORKS","init_src","init_index_node","x402Version","tx","NETWORKS","homedir","join","mkdir","writeFile","readFileSync","existsSync","BaseError","init_formatAbiItem","abi","formatAbiItem","signature","address","abi","abi","address","docsPath","BaseError","err","hash","signature","secp256k1","s","yParityOrV","recoveryBit","hash","signature","signature","BaseError","docsPath","chain","docsPath","cause","init_stateOverride","BaseError","BaseError","formatAuthorizationList","chain","chain","base","docsPath","cause","chain","format","base","chain","prepareTransactionRequest","getChainId","chainId","from","gas","nonce","type","e","error","getBlock","block","BaseError","abi","address","init_formatAbiItem","docsPath","abi","signature","formatAbiItem","abi","isEqual","index","value","input","address","event","abi","address","abi","address","abi","address","listeners","cleanup","poll","cacheKey","cache","abi","address","transport","eventName","args","shouldRetry","size","chain","base","key","BaseError","e","hash","hash","chain","address","BaseError","custom","res","chain","address","chain","chain","address","event","address","address","address","BaseError","address","address","version","e","address","signature","promiseCache","uid","BaseError","chain","base","body","response","assert","from","validate","LruMap","size","LruMap","keccak256","assert","from","validate","fromHex","fromBytes","assert","x","slice","prefix","toHex","assert","concat","BaseError","stringify","size","from","addressRegex","assert","InvalidAddressError","checksum","address","hash","keccak256","from","toHex","validate","address","assert","InvalidAddressError","BaseError","bytesRegex","integerRegex","maxInt8","maxInt16","maxInt24","maxInt32","maxInt40","maxInt48","maxInt56","maxInt64","maxInt72","maxInt80","maxInt88","maxInt96","maxInt104","maxInt112","maxInt120","maxInt128","maxInt136","maxInt144","maxInt152","maxInt160","maxInt168","maxInt176","maxInt184","maxInt192","maxInt200","maxInt208","maxInt216","maxInt224","maxInt232","maxInt240","maxInt248","maxInt256","minInt8","minInt16","minInt24","minInt32","minInt40","minInt48","minInt56","minInt64","minInt72","minInt80","minInt88","minInt96","minInt104","minInt112","minInt120","minInt128","minInt136","minInt144","minInt152","minInt160","minInt168","minInt176","minInt184","minInt192","minInt200","minInt208","minInt216","minInt224","minInt232","minInt240","minInt248","minInt256","maxUint8","maxUint16","maxUint24","maxUint32","maxUint40","maxUint48","maxUint56","maxUint64","maxUint72","maxUint80","maxUint88","maxUint96","maxUint104","maxUint112","maxUint120","maxUint128","maxUint136","maxUint144","maxUint152","maxUint160","maxUint168","maxUint176","maxUint184","maxUint192","maxUint200","maxUint208","maxUint216","maxUint224","maxUint232","maxUint240","maxUint248","maxUint256","decodeParameter","checksumAddress","getArrayComponents","decodeArray","decodeTuple","decodeAddress","decodeBool","decodeBytes","decodeNumber","decodeString","sizeOfLength","sizeOfOffset","checksum","wrap","address","slice","toNumber","length","hasDynamicChild","consumed","value","size","toBigInt","encodeArray","encodeTuple","encodeAddress","integerRegex","encodeNumber","encodeBytes","encodeString","concat","assert","InvalidArrayError","BytesSizeMismatchError","BaseError","IntegerOutOfRangeError","fromString","index","staticCursor","RecursiveReadLimitExceededError","PositionOutOfBoundsError","NegativeOffsetError","size","BaseError","checksumAddress","size","data","decodeParameter","encode","concat","encodePacked","address","assert","fromString","integerRegex","bytesRegex","BytesSizeMismatchError","from","BaseError","size","BytesSizeMismatchError","InvalidArrayError","from","getEncodable","fromHex","from","getEncodable","getEncodableList","getEncodableBytes","getSizeOfLength","encode","BaseError","init_utils","init_utils","_0n","_1n","_2n","_3n","_4n","_5n","_8n","mod","pow2","modulo","_0n","invert","mod","_1n","gcd","sqrt3mod4","_4n","sqrt5mod8","_5n","_8n","_2n","tonelliShanks","P","Field","FpLegendre","c","FpSqrt","_3n","FIELD_FIELDS","validateField","validateObject","FpPow","num","_0n","_1n","FpInvertBatch","FpLegendre","_1n","_2n","nLength","Field","bitLen","isLE","_0n","bitMask","_1n","num","mod","FpPow","invert","FpSqrt","numberToBytesLE","numberToBytesBE","bytesToNumberLE","bytesToNumberBE","FpInvertBatch","c","getFieldBytesLength","getMinHashLength","mapHashToField","isLE","num","bytesToNumberLE","bytesToNumberBE","mod","_1n","numberToBytesLE","numberToBytesBE","init_utils","_0n","_1n","constTimeNegate","validateW","calcWOpts","bitMask","calcOffsets","validateMSMPoints","c","validateMSMScalars","s","pointPrecomputes","pointWindowSizes","getW","P","wNAF","base","pippenger","bitLen","wbits","validateBasic","validateField","validateObject","nLength","init_utils","validateSigVerOpts","abool","validatePointOpts","validateBasic","validateObject","DERErr","DER","numberToHexUnpadded","num","_0n","bytesToNumberBE","ensureBytes","numToSizedHex","size","bytesToHex","numberToBytesBE","_1n","_2n","_3n","_4n","weierstrassPoints","Fn","Field","toBytes","concatBytes","fromBytes","inRange","isBytes","mod","aInRange","Point","memoized","FpInvertBatch","P","pippenger","endo","a","wNAF","validateOpts","weierstrass","modN","invert","s","from","l","hexToBytes","utils","getMinHashLength","mapHashToField","bitMask","hash","randomBytes","e","sign","createHmacDrbg","signature","isHex","getHash","hash","createCurve","create","weierstrass","secp256k1P","secp256k1N","_0n","_1n","_2n","divNearest","sqrtMod","P","_3n","pow2","Fpk1","Field","secp256k1","createCurve","mod","assert","signature","maxUint256","fromBytes","fromHex","InvalidSerializedSizeError","slice","s","yParity","extract","from","fromRpc","signature","fromRpc","yParity","signature","s","trimLeft","InvalidSerializedSizeError","BaseError","signature","size","from","stringify","from","fromRpc","address","signature","extract","hash","keccak256","concat","fromHex","toTuple","toTuple","address","signature","extract","recoverAddress","recoverPublicKey","signature","s","secp256k1","from","from","assert","slice","signature","recoverAddress","encode","size","concat","validate","BaseError","address","address","hash","index","hash","hash","contracts","abi","address","result","BaseError","init_stateOverride","block","toRpc","call","abi","result","error","e","normalizeSignature","signature","BaseError","isArgOfType","validate","index","getAmbiguousTypes","from","abi","validate","abiItem","slice","index","isArgOfType","getAmbiguousTypes","signature","normalizeSignature","keccak256","fromString","BaseError","encode","abi","options","fromAbi","concat","from","fromAbi","abi","item","encodeData","abi","args","fromAbi","abiFunction","getSelector","encode","concat","from","fromAbi","abi","getSelector","BaseError","encode","from","encodeData","call","address","InvalidWrappedSignatureError","assert","from","magicBytes","unwrap","validate","wrap","magicBytes","assert","slice","InvalidWrappedSignatureError","from","unwrap","signature","wrap","concat","encode","validate","BaseError","address","chain","hash","signature","address","signature","hash","address","signature","hash","transport","hash","from","block","transport","address","transport","event","args","hash","address","address","signature","isValid","hash","uid","BaseError","chain","wait","body","serializeTransaction","signature","from","util","e","objectUtil","s","errorUtil","errorMap","base64Regex","version","ctx","result","index","issues","elements","size","e","processed","base","result","r","ZodFirstPartyTypeKind","decoder","x402Version","extension","fetch","cache","cacheKey","payload","response","randomBytes","x402Version","signature","version","x402Version","getAddress","signature","x402Version","getAddress","signature","from","encodeFunctionData","x402Version","signature","version","readContract","signTransaction","getTransactionCount","estimateFeesPerGas","confidence","supportsToolCalling","supportsVision","decision","join","join","homedir","join","__filename","require","LOG_DIR","join","homedir","e","join","LOG_DIR","e","DEFAULT_TTL_MS","createHash","canonicalize","TIMESTAMP_PATTERN","RpcError","RpcError","crypto","hashMessage","hash","l","c","escapeRegex","originalChars","createHash","hash","join","dirname","homedir","join","homedir","DEFAULT_CONFIG","e","randomBytes","join","homedir","chain","sanitized","size","existsSync","readFileSync","buffer","baseUrl","createKeyPairSignerFromPrivateKeyBytes","balanceMonitor","SolanaBalanceMonitor","registerExactSvmScheme","responseCache","s","mkdir","port","writeFile","c","normalizedModel","cacheKey","bodyChunks","index","execFileSync","homedir","existsSync","readFileSync","address","SolanaBalanceMonitor","chain","existsSync","readFileSync","deriveSolanaKeyBytes","registerExactSvmScheme","createKeyPairSignerFromPrivateKeyBytes","s","address","l","pad","homedir","execFileSync","existsSync","MNEMONIC_FILE","setupSolana","deriveSolanaKeyBytes","getSolanaAddress","readFileSync"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/abitype/src/version.ts","../node_modules/abitype/src/errors.ts","../node_modules/abitype/src/regex.ts","../node_modules/abitype/src/human-readable/formatAbiParameter.ts","../node_modules/abitype/src/human-readable/formatAbiParameters.ts","../node_modules/abitype/src/human-readable/formatAbiItem.ts","../node_modules/abitype/src/human-readable/runtime/signatures.ts","../node_modules/abitype/src/human-readable/errors/abiItem.ts","../node_modules/abitype/src/human-readable/errors/abiParameter.ts","../node_modules/abitype/src/human-readable/errors/signature.ts","../node_modules/abitype/src/human-readable/errors/struct.ts","../node_modules/abitype/src/human-readable/errors/splitParameters.ts","../node_modules/abitype/src/human-readable/runtime/cache.ts","../node_modules/abitype/src/human-readable/runtime/utils.ts","../node_modules/abitype/src/human-readable/runtime/structs.ts","../node_modules/abitype/src/human-readable/parseAbi.ts","../node_modules/abitype/src/human-readable/parseAbiItem.ts","../node_modules/abitype/src/human-readable/parseAbiParameters.ts","../node_modules/abitype/src/exports/index.ts","../node_modules/viem/utils/getAction.ts","../node_modules/viem/utils/abi/formatAbiItem.ts","../node_modules/viem/utils/data/isHex.ts","../node_modules/viem/utils/data/size.ts","../node_modules/viem/errors/version.ts","../node_modules/viem/errors/base.ts","../node_modules/viem/errors/abi.ts","../node_modules/viem/errors/log.ts","../node_modules/viem/errors/data.ts","../node_modules/viem/utils/data/pad.ts","../node_modules/viem/errors/encoding.ts","../node_modules/viem/utils/data/trim.ts","../node_modules/viem/utils/encoding/fromHex.ts","../node_modules/viem/utils/encoding/toHex.ts","../node_modules/viem/utils/encoding/toBytes.ts","../node_modules/@noble/hashes/src/_u64.ts","../node_modules/@noble/hashes/src/cryptoNode.ts","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/sha3.ts","../node_modules/viem/utils/hash/keccak256.ts","../node_modules/viem/utils/hash/hashSignature.ts","../node_modules/viem/utils/hash/normalizeSignature.ts","../node_modules/viem/utils/hash/toSignature.ts","../node_modules/viem/utils/hash/toSignatureHash.ts","../node_modules/viem/utils/hash/toEventSelector.ts","../node_modules/viem/errors/address.ts","../node_modules/viem/utils/lru.ts","../node_modules/viem/utils/address/getAddress.ts","../node_modules/viem/utils/address/isAddress.ts","../node_modules/viem/utils/data/concat.ts","../node_modules/viem/utils/data/slice.ts","../node_modules/viem/utils/regex.ts","../node_modules/viem/utils/abi/encodeAbiParameters.ts","../node_modules/viem/utils/hash/toFunctionSelector.ts","../node_modules/viem/utils/abi/getAbiItem.ts","../node_modules/viem/utils/abi/encodeEventTopics.ts","../node_modules/viem/utils/filters/createFilterRequestScope.ts","../node_modules/viem/actions/public/createContractEventFilter.ts","../node_modules/viem/accounts/utils/parseAccount.ts","../node_modules/viem/utils/abi/prepareEncodeFunctionData.ts","../node_modules/viem/utils/abi/encodeFunctionData.ts","../node_modules/viem/constants/solidity.ts","../node_modules/viem/errors/cursor.ts","../node_modules/viem/utils/cursor.ts","../node_modules/viem/utils/encoding/fromBytes.ts","../node_modules/viem/utils/abi/decodeAbiParameters.ts","../node_modules/viem/utils/abi/decodeErrorResult.ts","../node_modules/viem/utils/stringify.ts","../node_modules/viem/utils/abi/formatAbiItemWithArgs.ts","../node_modules/viem/constants/unit.ts","../node_modules/viem/utils/unit/formatUnits.ts","../node_modules/viem/utils/unit/formatEther.ts","../node_modules/viem/utils/unit/formatGwei.ts","../node_modules/viem/errors/stateOverride.ts","../node_modules/viem/errors/transaction.ts","../node_modules/viem/errors/utils.ts","../node_modules/viem/errors/contract.ts","../node_modules/viem/errors/request.ts","../node_modules/viem/errors/rpc.ts","../node_modules/viem/utils/errors/getContractError.ts","../node_modules/viem/accounts/utils/publicKeyToAddress.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/sha2.ts","../node_modules/@noble/hashes/src/hmac.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/utils.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/modular.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/curve.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/weierstrass.ts","../node_modules/viem/node_modules/@noble/curves/src/_shortw_utils.ts","../node_modules/viem/node_modules/@noble/curves/src/abstract/hash-to-curve.ts","../node_modules/viem/node_modules/@noble/curves/src/secp256k1.ts","../node_modules/viem/utils/signature/recoverPublicKey.ts","../node_modules/viem/utils/signature/recoverAddress.ts","../node_modules/viem/utils/encoding/toRlp.ts","../node_modules/viem/utils/authorization/hashAuthorization.ts","../node_modules/viem/utils/authorization/recoverAuthorizationAddress.ts","../node_modules/viem/errors/estimateGas.ts","../node_modules/viem/errors/node.ts","../node_modules/viem/utils/errors/getNodeError.ts","../node_modules/viem/utils/errors/getEstimateGasError.ts","../node_modules/viem/utils/formatters/extract.ts","../node_modules/viem/utils/formatters/formatter.ts","../node_modules/viem/utils/formatters/transactionRequest.ts","../node_modules/viem/utils/stateOverride.ts","../node_modules/viem/constants/number.ts","../node_modules/viem/utils/transaction/assertRequest.ts","../node_modules/viem/errors/fee.ts","../node_modules/viem/errors/block.ts","../node_modules/viem/utils/formatters/transaction.ts","../node_modules/viem/utils/formatters/block.ts","../node_modules/viem/actions/public/getBlock.ts","../node_modules/viem/actions/public/getGasPrice.ts","../node_modules/viem/actions/public/estimateMaxPriorityFeePerGas.ts","../node_modules/viem/actions/public/estimateFeesPerGas.ts","../node_modules/viem/actions/public/getTransactionCount.ts","../node_modules/viem/utils/blob/blobsToCommitments.ts","../node_modules/viem/utils/blob/blobsToProofs.ts","../node_modules/@noble/hashes/src/sha256.ts","../node_modules/viem/utils/hash/sha256.ts","../node_modules/viem/utils/blob/commitmentToVersionedHash.ts","../node_modules/viem/utils/blob/commitmentsToVersionedHashes.ts","../node_modules/viem/constants/blob.ts","../node_modules/viem/constants/kzg.ts","../node_modules/viem/errors/blob.ts","../node_modules/viem/utils/blob/toBlobs.ts","../node_modules/viem/utils/blob/toBlobSidecars.ts","../node_modules/viem/utils/transaction/getTransactionType.ts","../node_modules/viem/utils/errors/getTransactionError.ts","../node_modules/viem/actions/public/getChainId.ts","../node_modules/viem/actions/public/fillTransaction.ts","../node_modules/viem/actions/wallet/prepareTransactionRequest.ts","../node_modules/viem/actions/public/estimateGas.ts","../node_modules/viem/actions/public/estimateContractGas.ts","../node_modules/viem/utils/address/isAddressEqual.ts","../node_modules/viem/utils/formatters/log.ts","../node_modules/viem/utils/abi/decodeEventLog.ts","../node_modules/viem/utils/abi/parseEventLogs.ts","../node_modules/viem/actions/public/getLogs.ts","../node_modules/viem/actions/public/getContractEvents.ts","../node_modules/viem/utils/abi/decodeFunctionResult.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/utils.ts","../node_modules/ox/core/version.ts","../node_modules/ox/core/internal/errors.ts","../node_modules/ox/core/Errors.ts","../node_modules/ox/core/internal/bytes.ts","../node_modules/ox/core/internal/hex.ts","../node_modules/ox/core/Json.ts","../node_modules/ox/core/Bytes.ts","../node_modules/ox/core/Hex.ts","../node_modules/ox/core/Withdrawal.ts","../node_modules/ox/core/BlockOverrides.ts","../node_modules/viem/constants/abis.ts","../node_modules/viem/constants/contract.ts","../node_modules/viem/constants/contracts.ts","../node_modules/viem/errors/chain.ts","../node_modules/viem/utils/abi/encodeDeployData.ts","../node_modules/viem/utils/chain/getChainContractAddress.ts","../node_modules/viem/utils/errors/getCallError.ts","../node_modules/viem/utils/promise/withResolvers.ts","../node_modules/viem/utils/promise/createBatchScheduler.ts","../node_modules/viem/errors/ccip.ts","../node_modules/viem/utils/abi/decodeFunctionData.ts","../node_modules/viem/utils/abi/encodeErrorResult.ts","../node_modules/viem/utils/abi/encodeFunctionResult.ts","../node_modules/viem/utils/ens/localBatchGatewayRequest.ts","../node_modules/viem/utils/ccip.ts","../node_modules/viem/actions/public/call.ts","../node_modules/viem/actions/public/readContract.ts","../node_modules/viem/actions/public/simulateContract.ts","../node_modules/viem/utils/observe.ts","../node_modules/viem/utils/wait.ts","../node_modules/viem/utils/poll.ts","../node_modules/viem/utils/promise/withCache.ts","../node_modules/viem/actions/public/getBlockNumber.ts","../node_modules/viem/actions/public/getFilterChanges.ts","../node_modules/viem/actions/public/uninstallFilter.ts","../node_modules/viem/actions/public/watchContractEvent.ts","../node_modules/viem/actions/wallet/sendRawTransaction.ts","../node_modules/viem/utils/promise/withRetry.ts","../node_modules/viem/utils/formatters/transactionReceipt.ts","../node_modules/viem/utils/uid.ts","../node_modules/viem/clients/createClient.ts","../node_modules/viem/utils/ens/errors.ts","../node_modules/viem/utils/ens/encodedLabelToLabelhash.ts","../node_modules/viem/utils/ens/namehash.ts","../node_modules/viem/utils/ens/encodeLabelhash.ts","../node_modules/viem/utils/ens/labelhash.ts","../node_modules/viem/utils/ens/packetToBytes.ts","../node_modules/viem/actions/ens/getEnsAddress.ts","../node_modules/viem/errors/ens.ts","../node_modules/viem/utils/ens/avatar/utils.ts","../node_modules/viem/utils/ens/avatar/parseAvatarRecord.ts","../node_modules/viem/actions/ens/getEnsText.ts","../node_modules/viem/actions/ens/getEnsAvatar.ts","../node_modules/viem/actions/ens/getEnsName.ts","../node_modules/viem/actions/ens/getEnsResolver.ts","../node_modules/viem/actions/public/createAccessList.ts","../node_modules/viem/actions/public/createBlockFilter.ts","../node_modules/viem/actions/public/createEventFilter.ts","../node_modules/viem/actions/public/createPendingTransactionFilter.ts","../node_modules/viem/actions/public/getBalance.ts","../node_modules/viem/actions/public/getBlobBaseFee.ts","../node_modules/viem/actions/public/getBlockTransactionCount.ts","../node_modules/viem/actions/public/getCode.ts","../node_modules/viem/actions/public/getDelegation.ts","../node_modules/viem/errors/eip712.ts","../node_modules/viem/actions/public/getEip712Domain.ts","../node_modules/viem/utils/formatters/feeHistory.ts","../node_modules/viem/actions/public/getFeeHistory.ts","../node_modules/viem/actions/public/getFilterLogs.ts","../node_modules/viem/utils/transaction/assertTransaction.ts","../node_modules/viem/utils/transaction/serializeAccessList.ts","../node_modules/viem/utils/transaction/serializeTransaction.ts","../node_modules/viem/utils/authorization/serializeAuthorizationList.ts","../node_modules/viem/utils/authorization/verifyAuthorization.ts","../node_modules/viem/utils/promise/withDedupe.ts","../node_modules/viem/utils/buildRequest.ts","../node_modules/viem/utils/chain/defineChain.ts","../node_modules/viem/utils/promise/withTimeout.ts","../node_modules/viem/utils/rpc/id.ts","../node_modules/viem/utils/rpc/http.ts","../node_modules/viem/constants/strings.ts","../node_modules/viem/utils/signature/toPrefixedMessage.ts","../node_modules/viem/utils/signature/hashMessage.ts","../node_modules/viem/errors/typedData.ts","../node_modules/viem/utils/typedData.ts","../node_modules/viem/utils/signature/hashTypedData.ts","../node_modules/ox/core/internal/lru.ts","../node_modules/ox/core/Caches.ts","../node_modules/ox/core/Hash.ts","../node_modules/ox/core/PublicKey.ts","../node_modules/ox/core/Address.ts","../node_modules/ox/core/Solidity.ts","../node_modules/ox/core/internal/abiParameters.ts","../node_modules/ox/core/internal/cursor.ts","../node_modules/ox/core/AbiParameters.ts","../node_modules/ox/core/Rlp.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/modular.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/curve.ts","../node_modules/ox/node_modules/@noble/curves/src/abstract/weierstrass.ts","../node_modules/ox/node_modules/@noble/curves/src/_shortw_utils.ts","../node_modules/ox/node_modules/@noble/curves/src/secp256k1.ts","../node_modules/ox/core/Signature.ts","../node_modules/ox/core/Authorization.ts","../node_modules/ox/core/Secp256k1.ts","../node_modules/ox/erc8010/SignatureErc8010.ts","../node_modules/ox/erc8010/index.ts","../node_modules/viem/utils/index.ts","../node_modules/viem/utils/formatters/proof.ts","../node_modules/viem/actions/public/getProof.ts","../node_modules/viem/actions/public/getStorageAt.ts","../node_modules/viem/actions/public/getTransaction.ts","../node_modules/viem/actions/public/getTransactionConfirmations.ts","../node_modules/viem/actions/public/getTransactionReceipt.ts","../node_modules/viem/actions/public/multicall.ts","../node_modules/viem/actions/public/simulateBlocks.ts","../node_modules/ox/core/internal/abiItem.ts","../node_modules/ox/core/AbiItem.ts","../node_modules/ox/core/AbiConstructor.ts","../node_modules/ox/core/AbiFunction.ts","../node_modules/viem/constants/address.ts","../node_modules/viem/actions/public/simulateCalls.ts","../node_modules/ox/erc6492/SignatureErc6492.ts","../node_modules/ox/erc6492/index.ts","../node_modules/viem/utils/signature/serializeSignature.ts","../node_modules/viem/actions/public/verifyHash.ts","../node_modules/viem/actions/public/verifyMessage.ts","../node_modules/viem/actions/public/verifyTypedData.ts","../node_modules/viem/actions/public/watchBlockNumber.ts","../node_modules/viem/actions/public/waitForTransactionReceipt.ts","../node_modules/viem/actions/public/watchBlocks.ts","../node_modules/viem/actions/public/watchEvent.ts","../node_modules/viem/actions/public/watchPendingTransactions.ts","../node_modules/viem/utils/siwe/parseSiweMessage.ts","../node_modules/viem/utils/siwe/validateSiweMessage.ts","../node_modules/viem/actions/siwe/verifySiweMessage.ts","../node_modules/viem/actions/wallet/sendRawTransactionSync.ts","../node_modules/viem/clients/decorators/public.ts","../node_modules/viem/clients/createPublicClient.ts","../node_modules/viem/clients/transports/createTransport.ts","../node_modules/viem/errors/transport.ts","../node_modules/viem/clients/transports/http.ts","../node_modules/viem/index.ts","../node_modules/viem/op-stack/contracts.ts","../node_modules/viem/op-stack/formatters.ts","../node_modules/viem/op-stack/serializers.ts","../node_modules/viem/op-stack/chainConfig.ts","../node_modules/viem/chains/definitions/base.ts","../node_modules/viem/chains/index.ts","../node_modules/@scure/base/index.ts","../node_modules/@noble/hashes/src/pbkdf2.ts","../node_modules/@scure/bip39/esm/index.js","../node_modules/viem/accounts/toAccount.ts","../node_modules/viem/accounts/utils/sign.ts","../node_modules/viem/accounts/utils/signAuthorization.ts","../node_modules/viem/accounts/utils/signMessage.ts","../node_modules/viem/accounts/utils/signTransaction.ts","../node_modules/viem/accounts/utils/signTypedData.ts","../node_modules/viem/accounts/privateKeyToAccount.ts","../node_modules/@scure/bip39/esm/wordlists/english.js","../node_modules/viem/accounts/index.ts","../src/fs-read.ts","../src/errors.ts","../src/balance.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/sha2.ts","../node_modules/@noble/curves/src/utils.ts","../node_modules/@noble/curves/src/abstract/modular.ts","../node_modules/@noble/curves/src/abstract/curve.ts","../node_modules/@noble/curves/node_modules/@noble/hashes/src/hmac.ts","../node_modules/@noble/curves/src/abstract/weierstrass.ts","../node_modules/@noble/curves/src/secp256k1.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/utils.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/hmac.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/_md.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/legacy.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/_u64.ts","../node_modules/@scure/bip32/node_modules/@noble/hashes/src/sha2.ts","../node_modules/@scure/bip32/node_modules/@scure/base/index.ts","../node_modules/@scure/bip32/index.ts","../node_modules/@solana/errors/src/codes.ts","../node_modules/@solana/errors/src/context.ts","../node_modules/@solana/errors/src/messages.ts","../node_modules/@solana/errors/src/message-formatter.ts","../node_modules/@solana/errors/src/error.ts","../node_modules/@solana/errors/src/stack-trace.ts","../node_modules/@solana/errors/src/rpc-enum-errors.ts","../node_modules/@solana/errors/src/instruction-error.ts","../node_modules/@solana/errors/src/transaction-error.ts","../node_modules/@solana/errors/src/json-rpc-error.ts","../node_modules/@solana/errors/src/simulation-errors.ts","../node_modules/@solana/codecs-core/src/bytes.ts","../node_modules/@solana/codecs-core/src/codec.ts","../node_modules/@solana/codecs-core/src/combine-codec.ts","../node_modules/@solana/codecs-core/src/add-codec-sentinel.ts","../node_modules/@solana/codecs-core/src/assertions.ts","../node_modules/@solana/codecs-core/src/add-codec-size-prefix.ts","../node_modules/@solana/codecs-core/src/array-buffers.ts","../node_modules/@solana/codecs-core/src/decoder-entire-byte-array.ts","../node_modules/@solana/codecs-core/src/fix-codec-size.ts","../node_modules/@solana/codecs-core/src/offset-codec.ts","../node_modules/@solana/codecs-core/src/resize-codec.ts","../node_modules/@solana/codecs-core/src/pad-codec.ts","../node_modules/@solana/codecs-core/src/reverse-codec.ts","../node_modules/@solana/codecs-core/src/transform-codec.ts","../node_modules/@solana/codecs-strings/src/assertions.ts","../node_modules/@solana/codecs-strings/src/baseX.ts","../node_modules/@solana/codecs-strings/src/base10.ts","../node_modules/@solana/codecs-strings/src/base16.ts","../node_modules/@solana/codecs-strings/src/base58.ts","../node_modules/@solana/codecs-strings/src/baseX-reslice.ts","../node_modules/@solana/codecs-strings/src/base64.ts","../node_modules/@solana/codecs-strings/src/null-characters.ts","../node_modules/@solana/text-encoding-impl/src/index.node.ts","../node_modules/@solana/codecs-strings/src/utf8.ts","../node_modules/@solana/accounts/src/account.ts","../node_modules/@solana/accounts/src/decode-account.ts","../node_modules/@solana/accounts/src/parse-account.ts","../node_modules/@solana/accounts/src/fetch-account.ts","../node_modules/@solana/accounts/src/maybe-account.ts","../node_modules/@solana/assertions/src/crypto.ts","../node_modules/@solana/assertions/src/subtle-crypto.ts","../node_modules/@solana/addresses/src/address.ts","../node_modules/@solana/addresses/src/vendor/noble/ed25519.ts","../node_modules/@solana/addresses/src/curve-internal.ts","../node_modules/@solana/addresses/src/curve.ts","../node_modules/@solana/addresses/src/program-derived-address.ts","../node_modules/@solana/addresses/src/public-key.ts","../node_modules/@solana/codecs-numbers/src/assertions.ts","../node_modules/@solana/codecs-numbers/src/common.ts","../node_modules/@solana/codecs-numbers/src/utils.ts","../node_modules/@solana/codecs-numbers/src/f32.ts","../node_modules/@solana/codecs-numbers/src/f64.ts","../node_modules/@solana/codecs-numbers/src/i128.ts","../node_modules/@solana/codecs-numbers/src/i16.ts","../node_modules/@solana/codecs-numbers/src/i32.ts","../node_modules/@solana/codecs-numbers/src/i64.ts","../node_modules/@solana/codecs-numbers/src/i8.ts","../node_modules/@solana/codecs-numbers/src/short-u16.ts","../node_modules/@solana/codecs-numbers/src/u128.ts","../node_modules/@solana/codecs-numbers/src/u16.ts","../node_modules/@solana/codecs-numbers/src/u32.ts","../node_modules/@solana/codecs-numbers/src/u64.ts","../node_modules/@solana/codecs-numbers/src/u8.ts","../node_modules/@solana/codecs-data-structures/src/assertions.ts","../node_modules/@solana/codecs-data-structures/src/utils.ts","../node_modules/@solana/codecs-data-structures/src/array.ts","../node_modules/@solana/codecs-data-structures/src/bit-array.ts","../node_modules/@solana/codecs-data-structures/src/boolean.ts","../node_modules/@solana/codecs-data-structures/src/bytes.ts","../node_modules/@solana/codecs-strings/src/base16.ts","../node_modules/@solana/codecs-data-structures/src/constant.ts","../node_modules/@solana/codecs-data-structures/src/tuple.ts","../node_modules/@solana/codecs-data-structures/src/union.ts","../node_modules/@solana/codecs-data-structures/src/discriminated-union.ts","../node_modules/@solana/codecs-data-structures/src/enum-helpers.ts","../node_modules/@solana/codecs-data-structures/src/enum.ts","../node_modules/@solana/codecs-data-structures/src/hidden-prefix.ts","../node_modules/@solana/codecs-data-structures/src/hidden-suffix.ts","../node_modules/@solana/codecs-data-structures/src/literal-union.ts","../node_modules/@solana/codecs-data-structures/src/map.ts","../node_modules/@solana/codecs-data-structures/src/unit.ts","../node_modules/@solana/codecs-data-structures/src/nullable.ts","../node_modules/@solana/codecs-data-structures/src/set.ts","../node_modules/@solana/codecs-data-structures/src/struct.ts","../node_modules/@solana/options/src/option.ts","../node_modules/@solana/options/src/unwrap-option.ts","../node_modules/@solana/options/src/option-codec.ts","../node_modules/@solana/options/src/unwrap-option-recursively.ts","../node_modules/@solana/codecs/dist/index.node.mjs","../node_modules/@solana/functional/src/pipe.ts","../node_modules/@solana/instructions/src/instruction.ts","../node_modules/@solana/instructions/src/roles.ts","../node_modules/@solana/rpc-types/src/blockhash.ts","../node_modules/@solana/rpc-types/src/cluster-url.ts","../node_modules/@solana/rpc-types/src/commitment.ts","../node_modules/@solana/rpc-types/src/lamports.ts","../node_modules/@solana/rpc-types/src/stringified-bigint.ts","../node_modules/@solana/rpc-types/src/stringified-number.ts","../node_modules/@solana/rpc-types/src/unix-timestamp.ts","../node_modules/@solana/transaction-messages/src/blockhash.ts","../node_modules/@solana/codecs-strings/src/assertions.ts","../node_modules/@solana/codecs-strings/src/baseX.ts","../node_modules/@solana/codecs-strings/src/base58.ts","../node_modules/@solana/transaction-messages/src/codecs/address-table-lookup.ts","../node_modules/@solana/transaction-messages/src/codecs/header.ts","../node_modules/@solana/transaction-messages/src/codecs/instruction.ts","../node_modules/@solana/transaction-messages/src/transaction-message.ts","../node_modules/@solana/transaction-messages/src/codecs/transaction-version.ts","../node_modules/@solana/transaction-messages/src/codecs/message.ts","../node_modules/@solana/transaction-messages/src/compile/accounts.ts","../node_modules/@solana/transaction-messages/src/compile/address-table-lookups.ts","../node_modules/@solana/transaction-messages/src/compile/header.ts","../node_modules/@solana/transaction-messages/src/compile/instructions.ts","../node_modules/@solana/transaction-messages/src/compile/lifetime-token.ts","../node_modules/@solana/transaction-messages/src/compile/static-accounts.ts","../node_modules/@solana/transaction-messages/src/compile/message.ts","../node_modules/@solana/transaction-messages/src/compress-transaction-message.ts","../node_modules/@solana/transaction-messages/src/create-transaction-message.ts","../node_modules/@solana/transaction-messages/src/durable-nonce-instruction.ts","../node_modules/@solana/transaction-messages/src/durable-nonce.ts","../node_modules/@solana/transaction-messages/src/fee-payer.ts","../node_modules/@solana/transaction-messages/src/instructions.ts","../node_modules/@solana/transaction-messages/src/decompile-message.ts","../node_modules/@solana/keys/src/algorithm.ts","../node_modules/@solana/keys/src/private-key.ts","../node_modules/@solana/keys/src/public-key.ts","../node_modules/@solana/keys/src/signatures.ts","../node_modules/@solana/keys/src/key-pair.ts","../node_modules/@solana/transactions/src/codecs/signatures-encoder.ts","../node_modules/@solana/transactions/src/codecs/transaction-codec.ts","../node_modules/@solana/transactions/src/lifetime.ts","../node_modules/@solana/transactions/src/compile-transaction.ts","../node_modules/@solana/transactions/src/signatures.ts","../node_modules/@solana/transactions/src/wire-transaction.ts","../node_modules/@solana/transactions/src/transaction-size.ts","../node_modules/@solana/transactions/src/sendable-transaction.ts","../node_modules/@solana/transactions/src/transaction-message-size.ts","../node_modules/@solana/promises/src/race.ts","../node_modules/@solana/promises/src/abortable.ts","../node_modules/@solana/instruction-plans/src/instruction-plan.ts","../node_modules/@solana/instruction-plans/src/append-instruction-plan.ts","../node_modules/@solana/instruction-plans/src/transaction-plan.ts","../node_modules/@solana/instruction-plans/src/transaction-plan-result.ts","../node_modules/@solana/instruction-plans/src/transaction-plan-executor.ts","../node_modules/@solana/instruction-plans/src/transaction-planner.ts","../node_modules/@solana/offchain-messages/src/application-domain.ts","../node_modules/@solana/offchain-messages/src/codecs/application-domain.ts","../node_modules/@solana/offchain-messages/src/codecs/signing-domain.ts","../node_modules/@solana/offchain-messages/src/codecs/preamble-common.ts","../node_modules/@solana/offchain-messages/src/codecs/signatures.ts","../node_modules/@solana/offchain-messages/src/codecs/envelope.ts","../node_modules/@solana/offchain-messages/src/content.ts","../node_modules/@solana/offchain-messages/src/message-v0.ts","../node_modules/@solana/offchain-messages/src/codecs/content.ts","../node_modules/@solana/offchain-messages/src/codecs/preamble-v0.ts","../node_modules/@solana/offchain-messages/src/codecs/message-v0.ts","../node_modules/@solana/offchain-messages/src/codecs/preamble-v1.ts","../node_modules/@solana/offchain-messages/src/codecs/message-v1.ts","../node_modules/@solana/offchain-messages/src/codecs/message.ts","../node_modules/@solana/offchain-messages/src/envelope-common.ts","../node_modules/@solana/offchain-messages/src/envelope-v0.ts","../node_modules/@solana/offchain-messages/src/envelope-v1.ts","../node_modules/@solana/offchain-messages/src/envelope.ts","../node_modules/@solana/offchain-messages/src/signatures.ts","../node_modules/@solana/plugin-core/src/client.ts","../node_modules/@solana/programs/src/program-error.ts","../node_modules/@solana/rpc-spec-types/src/parse-json-with-bigints.ts","../node_modules/@solana/rpc-spec-types/src/rpc-message.ts","../node_modules/@solana/rpc-spec-types/src/stringify-json-with-bigints.ts","../node_modules/@solana/rpc-spec/src/rpc.ts","../node_modules/@solana/rpc-spec/src/rpc-api.ts","../node_modules/@solana/rpc-spec/src/rpc-transport.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-bigint-downcast-internal.ts","../node_modules/@solana/rpc-transformers/src/tree-traversal.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-bigint-downcast.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-default-commitment-internal.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-default-commitment.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-integer-overflow-internal.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-integer-overflow.ts","../node_modules/@solana/rpc-transformers/src/request-transformer-options-object-position-config.ts","../node_modules/@solana/rpc-transformers/src/request-transformer.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-bigint-upcast-internal.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-bigint-upcast.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-result.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-allowed-numeric-values.ts","../node_modules/@solana/rpc-transformers/src/response-transformer-throw-solana-error.ts","../node_modules/@solana/rpc-transformers/src/response-transformer.ts","../node_modules/@solana/rpc-api/src/index.ts","../node_modules/@solana/rpc-transport-http/src/http-transport-headers.ts","../node_modules/@solana/rpc-transport-http/src/http-transport.ts","../node_modules/@solana/rpc-transport-http/src/is-solana-request.ts","../node_modules/@solana/rpc-transport-http/src/http-transport-for-solana-rpc.ts","../node_modules/@solana/fast-stable-stringify/src/index.ts","../node_modules/@solana/rpc/src/rpc-integer-overflow-error.ts","../node_modules/@solana/rpc/src/rpc-default-config.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/rpc/src/rpc-request-coalescer.ts","../node_modules/@solana/rpc/src/rpc-request-deduplication.ts","../node_modules/@solana/rpc/src/rpc-transport.ts","../node_modules/@solana/rpc/src/rpc.ts","../node_modules/@solana/rpc-parsed-types/dist/index.node.mjs","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/subscribable/src/async-iterable.ts","../node_modules/@solana/subscribable/src/data-publisher.ts","../node_modules/@solana/subscribable/src/demultiplex.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions-api.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions-channel.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/rpc-subscriptions-spec/src/rpc-subscriptions-pubsub-plan.ts","../node_modules/@solana/rpc-subscriptions-api/src/index.ts","../node_modules/ws/lib/constants.js","../node_modules/ws/lib/buffer-util.js","../node_modules/ws/lib/limiter.js","../node_modules/ws/lib/permessage-deflate.js","../node_modules/ws/lib/validation.js","../node_modules/ws/lib/receiver.js","../node_modules/ws/lib/sender.js","../node_modules/ws/lib/event-target.js","../node_modules/ws/lib/extension.js","../node_modules/ws/lib/websocket.js","../node_modules/ws/lib/stream.js","../node_modules/ws/lib/subprotocol.js","../node_modules/ws/lib/websocket-server.js","../node_modules/ws/wrapper.mjs","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/ws-impl/src/index.node.ts","../node_modules/@solana/rpc-subscriptions-channel-websocket/src/websocket-channel.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-integer-overflow-error.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-default-config.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-autopinger.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-channel-pool-internal.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-channel-pool.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-json.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-json-bigint.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-channel.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-coalescer.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions-transport.ts","../node_modules/@solana/rpc-subscriptions/src/rpc-subscriptions.ts","../node_modules/@solana/signers/src/deduplicate-signers.ts","../node_modules/@solana/signers/src/transaction-modifying-signer.ts","../node_modules/@solana/signers/src/transaction-partial-signer.ts","../node_modules/@solana/signers/src/transaction-sending-signer.ts","../node_modules/@solana/signers/src/transaction-signer.ts","../node_modules/@solana/signers/src/account-signer-meta.ts","../node_modules/@solana/signers/src/add-signers.ts","../node_modules/@solana/signers/src/fee-payer-signer.ts","../node_modules/@solana/signers/src/message-partial-signer.ts","../node_modules/@solana/signers/src/keypair-signer.ts","../node_modules/@solana/signers/src/message-modifying-signer.ts","../node_modules/@solana/signers/src/message-signer.ts","../node_modules/@solana/signers/src/noop-signer.ts","../node_modules/@solana/signers/src/offchain-message-signer.ts","../node_modules/@solana/signers/src/sign-offchain-message.ts","../node_modules/@solana/signers/src/transaction-with-single-sending-signer.ts","../node_modules/@solana/signers/src/sign-transaction.ts","../node_modules/@solana/text-encoding-impl/src/index.node.ts","../node_modules/@solana/signers/src/signable-message.ts","../node_modules/@solana/event-target-impl/src/index.node.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-blockheight.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-nonce.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-recent-signature.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-timeout.ts","../node_modules/@solana/transaction-confirmation/src/confirmation-strategy-racer.ts","../node_modules/@solana/transaction-confirmation/src/waiters.ts","../node_modules/@solana/kit/src/airdrop-internal.ts","../node_modules/@solana/kit/src/airdrop.ts","../node_modules/@solana/kit/src/fetch-lookup-tables.ts","../node_modules/@solana/kit/src/decompile-transaction-message-fetching-lookup-tables.ts","../node_modules/@solana/kit/src/get-minimum-balance-for-rent-exemption.ts","../node_modules/@solana/kit/src/send-transaction-internal.ts","../node_modules/@solana/kit/src/send-and-confirm-durable-nonce-transaction.ts","../node_modules/@solana/kit/src/send-and-confirm-transaction.ts","../node_modules/@solana/kit/src/send-transaction-without-confirming.ts","../src/wallet.ts","../src/onchainos-adapter.ts","../src/auth.ts","../node_modules/undici/lib/core/symbols.js","../node_modules/undici/lib/util/timers.js","../node_modules/undici/lib/core/errors.js","../node_modules/undici/lib/core/constants.js","../node_modules/undici/lib/core/tree.js","../node_modules/undici/lib/core/util.js","../node_modules/undici/lib/util/stats.js","../node_modules/undici/lib/core/diagnostics.js","../node_modules/undici/lib/core/request.js","../node_modules/undici/lib/dispatcher/dispatcher.js","../node_modules/undici/lib/dispatcher/dispatcher-base.js","../node_modules/undici/lib/core/connect.js","../node_modules/undici/lib/llhttp/utils.js","../node_modules/undici/lib/llhttp/constants.js","../node_modules/undici/lib/llhttp/llhttp-wasm.js","../node_modules/undici/lib/llhttp/llhttp_simd-wasm.js","../node_modules/undici/lib/web/fetch/constants.js","../node_modules/undici/lib/web/fetch/global.js","../node_modules/undici/lib/encoding/index.js","../node_modules/undici/lib/web/infra/index.js","../node_modules/undici/lib/web/fetch/data-url.js","../node_modules/undici/lib/web/webidl/index.js","../node_modules/undici/lib/web/fetch/util.js","../node_modules/undici/lib/web/fetch/formdata.js","../node_modules/undici/lib/web/fetch/formdata-parser.js","../node_modules/undici/lib/util/runtime-features.js","../node_modules/undici/lib/web/fetch/body.js","../node_modules/undici/lib/dispatcher/client-h1.js","../node_modules/undici/lib/dispatcher/client-h2.js","../node_modules/undici/lib/dispatcher/client.js","../node_modules/undici/lib/dispatcher/fixed-queue.js","../node_modules/undici/lib/dispatcher/pool-base.js","../node_modules/undici/lib/dispatcher/pool.js","../node_modules/undici/lib/dispatcher/balanced-pool.js","../node_modules/undici/lib/dispatcher/round-robin-pool.js","../node_modules/undici/lib/dispatcher/agent.js","../node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js","../node_modules/undici/lib/core/socks5-utils.js","../node_modules/undici/lib/core/socks5-client.js","../node_modules/undici/lib/dispatcher/socks5-proxy-agent.js","../node_modules/undici/lib/dispatcher/proxy-agent.js","../node_modules/undici/lib/dispatcher/env-http-proxy-agent.js","../node_modules/undici/lib/handler/retry-handler.js","../node_modules/undici/lib/dispatcher/retry-agent.js","../node_modules/undici/lib/dispatcher/h2c-client.js","../node_modules/undici/lib/api/readable.js","../node_modules/undici/lib/api/api-request.js","../node_modules/undici/lib/api/abort-signal.js","../node_modules/undici/lib/api/api-stream.js","../node_modules/undici/lib/api/api-pipeline.js","../node_modules/undici/lib/api/api-upgrade.js","../node_modules/undici/lib/api/api-connect.js","../node_modules/undici/lib/api/index.js","../node_modules/undici/lib/mock/mock-errors.js","../node_modules/undici/lib/mock/mock-symbols.js","../node_modules/undici/lib/mock/mock-utils.js","../node_modules/undici/lib/mock/mock-interceptor.js","../node_modules/undici/lib/mock/mock-client.js","../node_modules/undici/lib/mock/mock-call-history.js","../node_modules/undici/lib/mock/mock-pool.js","../node_modules/undici/lib/mock/pending-interceptors-formatter.js","../node_modules/undici/lib/mock/mock-agent.js","../node_modules/undici/lib/mock/snapshot-utils.js","../node_modules/undici/lib/mock/snapshot-recorder.js","../node_modules/undici/lib/mock/snapshot-agent.js","../node_modules/undici/lib/global.js","../node_modules/undici/lib/handler/decorator-handler.js","../node_modules/undici/lib/handler/redirect-handler.js","../node_modules/undici/lib/interceptor/redirect.js","../node_modules/undici/lib/interceptor/response-error.js","../node_modules/undici/lib/interceptor/retry.js","../node_modules/undici/lib/interceptor/dump.js","../node_modules/undici/lib/interceptor/dns.js","../node_modules/undici/lib/util/cache.js","../node_modules/undici/lib/util/date.js","../node_modules/undici/lib/handler/cache-handler.js","../node_modules/undici/lib/cache/memory-cache-store.js","../node_modules/undici/lib/handler/cache-revalidation-handler.js","../node_modules/undici/lib/interceptor/cache.js","../node_modules/undici/lib/interceptor/decompress.js","../node_modules/undici/lib/handler/deduplication-handler.js","../node_modules/undici/lib/interceptor/deduplicate.js","../node_modules/undici/lib/cache/sqlite-cache-store.js","../node_modules/undici/lib/web/fetch/headers.js","../node_modules/undici/lib/web/fetch/response.js","../node_modules/undici/lib/web/fetch/request.js","../node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js","../node_modules/undici/lib/web/fetch/index.js","../node_modules/undici/lib/web/cache/util.js","../node_modules/undici/lib/web/cache/cache.js","../node_modules/undici/lib/web/cache/cachestorage.js","../node_modules/undici/lib/web/cookies/constants.js","../node_modules/undici/lib/web/cookies/util.js","../node_modules/undici/lib/web/cookies/parse.js","../node_modules/undici/lib/web/cookies/index.js","../node_modules/undici/lib/web/websocket/events.js","../node_modules/undici/lib/web/websocket/constants.js","../node_modules/undici/lib/web/websocket/util.js","../node_modules/undici/lib/web/websocket/frame.js","../node_modules/undici/lib/web/websocket/connection.js","../node_modules/undici/lib/web/websocket/permessage-deflate.js","../node_modules/undici/lib/web/websocket/receiver.js","../node_modules/undici/lib/web/websocket/sender.js","../node_modules/undici/lib/web/websocket/websocket.js","../node_modules/undici/lib/web/websocket/stream/websocketerror.js","../node_modules/undici/lib/web/websocket/stream/websocketstream.js","../node_modules/undici/lib/web/eventsource/util.js","../node_modules/undici/lib/web/eventsource/eventsource-stream.js","../node_modules/undici/lib/web/eventsource/eventsource.js","../node_modules/undici/index.js","../src/solana-balance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/accounts/mint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/accounts/multisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/types/accountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/types/authorityType.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/accounts/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/programs/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/programs/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/errors/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/errors/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/shared/index.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/amountToUiAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/approve.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/approveChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/burn.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/burnChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/closeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/pdas/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/createAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/createAssociatedTokenIdempotent.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/freezeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/getAccountDataSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeAccount2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeAccount3.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeImmutableOwner.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMint2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMultisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/initializeMultisig2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/mintTo.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/mintToChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/recoverNestedAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/revoke.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/setAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/syncNative.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/thawAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/transfer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/transferChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/generated/instructions/uiAmountToAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/programs/system.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/errors/system.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/shared/index.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/node_modules/.pnpm/@solana-program+system@0.9.0_@solana+kit@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.5.3_ws@8.17.0_/node_modules/@solana-program/system/src/generated/instructions/createAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/createMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/mintToATA.ts","../node_modules/@x402/svm/node_modules/@solana-program/token/src/transferToATA.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/accountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/authorityType.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/decryptableBalance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/encryptedBalance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/extension.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/extensionType.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/tokenMetadataField.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/types/transferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/accounts/mint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/accounts/multisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/accounts/token.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/programs/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/programs/token2022.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/errors/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/errors/token2022.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/shared/index.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/amountToUiAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/applyConfidentialPendingBalance.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/approve.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/approveChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/approveConfidentialTransferAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/burn.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/burnChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/closeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialDeposit.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialTransfer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialTransferWithFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/confidentialWithdraw.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/configureConfidentialTransferAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/pdas/associatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/createAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/createAssociatedTokenIdempotent.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/createNativeMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableCpiGuard.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableHarvestToMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableMemoTransfers.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/disableNonConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/emitTokenMetadata.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/emptyConfidentialTransferAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableCpiGuard.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableHarvestToMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableMemoTransfers.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/enableNonConfidentialCredits.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/freezeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/getAccountDataSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/harvestWithheldTokensToMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/harvestWithheldTokensToMintForConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeAccount2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeAccount3.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeConfidentialTransferMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeDefaultAccountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeGroupMemberPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeGroupPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeImmutableOwner.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeInterestBearingMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMetadataPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMint2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMintCloseAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMultisig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeMultisig2.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeNonTransferableMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializePausableConfig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializePermanentDelegate.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeScaledUiAmountMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTokenGroup.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTokenGroupMember.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTokenMetadata.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTransferFeeConfig.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/initializeTransferHook.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/mintTo.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/mintToChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/pause.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/reallocate.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/recoverNestedAssociatedToken.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/removeTokenMetadataKey.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/resume.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/revoke.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/setAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/setTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/syncNative.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/thawAccount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/transfer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/transferChecked.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/transferCheckedWithFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/uiAmountToAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateConfidentialTransferMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateDefaultAccountState.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateGroupMemberPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateGroupPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateMetadataPointer.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateMultiplierScaledUiMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateRateInterestBearingMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenGroupMaxSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenGroupUpdateAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenMetadataField.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTokenMetadataUpdateAuthority.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/updateTransferHook.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawExcessLamports.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromAccounts.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromAccountsForConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromMint.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/generated/instructions/withdrawWithheldTokensFromMintForConfidentialTransferFee.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/amountToUiAmount.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/getInitializeInstructionsForExtensions.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/getTokenSize.ts","../node_modules/@x402/svm/node_modules/@solana-program/token-2022/src/getMintSize.ts","../node_modules/@x402/svm/src/constants.ts","../node_modules/@x402/svm/src/utils.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/programs/computeBudget.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/requestHeapFrame.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/requestUnits.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/setComputeUnitLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/setComputeUnitPrice.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/generated/instructions/setLoadedAccountsDataSizeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/constants.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/internal.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/setComputeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/estimateAndSetComputeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/estimateComputeLimitInternal.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/estimateComputeLimit.ts","../node_modules/@x402/svm/node_modules/@solana-program/compute-budget/src/setComputePrice.ts","../node_modules/@x402/svm/src/exact/client/scheme.ts","../node_modules/@x402/svm/src/v1/index.ts","../node_modules/@x402/svm/src/exact/v1/client/scheme.ts","../node_modules/@x402/svm/src/exact/client/register.ts","../src/proxy.ts","../node_modules/zod/v3/external.js","../node_modules/zod/v3/helpers/util.js","../node_modules/zod/v3/ZodError.js","../node_modules/zod/v3/locales/en.js","../node_modules/zod/v3/errors.js","../node_modules/zod/v3/helpers/parseUtil.js","../node_modules/zod/v3/helpers/errorUtil.js","../node_modules/zod/v3/types.js","../node_modules/@x402/core/src/schemas/index.ts","../node_modules/@x402/core/src/index.ts","../node_modules/@x402/core/src/utils/index.ts","../node_modules/@x402/core/src/http/x402HTTPResourceServer.ts","../node_modules/@x402/core/src/http/httpFacilitatorClient.ts","../node_modules/@x402/core/src/http/x402HTTPClient.ts","../node_modules/@x402/core/src/http/index.ts","../node_modules/@x402/core/src/client/x402Client.ts","../node_modules/@x402/fetch/src/index.ts","../src/payment-preauth.ts","../node_modules/@x402/evm/src/constants.ts","../node_modules/@x402/evm/src/utils.ts","../node_modules/@x402/evm/src/exact/facilitator/errors.ts","../node_modules/@x402/evm/src/multicall.ts","../node_modules/@x402/evm/src/exact/v1/client/scheme.ts","../node_modules/@x402/evm/src/exact/v1/facilitator/scheme.ts","../node_modules/@x402/evm/src/exact/facilitator/eip3009-utils.ts","../node_modules/@x402/evm/src/v1/index.ts","../node_modules/@x402/evm/src/exact/extensions.ts","../node_modules/@x402/evm/src/shared/permit2.ts","../node_modules/@x402/evm/src/shared/erc20approval.ts","../node_modules/@x402/evm/src/upto/facilitator/errors.ts","../node_modules/@x402/evm/src/exact/client/permit2.ts","../node_modules/@x402/evm/src/shared/extensions.ts","../node_modules/@x402/evm/src/exact/client/eip2612.ts","../node_modules/@x402/evm/src/exact/client/erc20approval.ts","../node_modules/@x402/evm/src/shared/rpc.ts","../node_modules/@x402/evm/src/exact/client/eip3009.ts","../node_modules/@x402/evm/src/exact/client/scheme.ts","../node_modules/@x402/evm/src/exact/client/register.ts","../node_modules/@x402/evm/src/signer.ts","../src/router/rules.ts","../src/router/selector.ts","../src/router/strategy.ts","../src/router/config.ts","../src/router/index.ts","../src/models.ts","../src/logger.ts","../src/stats.ts","../src/version.ts","../src/dedup.ts","../src/response-cache.ts","../src/okx-x402-fetch.ts","../src/compression/types.ts","../src/compression/layers/deduplication.ts","../src/compression/layers/whitespace.ts","../src/compression/codebook.ts","../src/compression/layers/dictionary.ts","../src/compression/layers/paths.ts","../src/compression/layers/json-compact.ts","../src/compression/layers/observation.ts","../src/compression/layers/dynamic-codebook.ts","../src/compression/index.ts","../src/session.ts","../src/updater.ts","../src/exclude-models.ts","../src/config.ts","../src/journal.ts","../src/upstream-proxy.ts","../src/textual-tool-calls.ts","../src/cli.ts","../src/report.ts","../src/doctor.ts","../src/partners/registry.ts"],"sourcesContent":["export const version = '1.2.3'\n","import type { OneOf, Pretty } from './types.js'\nimport { version } from './version.js'\n\ntype BaseErrorArgs = Pretty<\n {\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n } & OneOf<{ details?: string | undefined } | { cause?: BaseError | Error }>\n>\n\nexport class BaseError extends Error {\n details: string\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n shortMessage: string\n\n override name = 'AbiTypeError'\n\n constructor(shortMessage: string, args: BaseErrorArgs = {}) {\n const details =\n args.cause instanceof BaseError\n ? args.cause.details\n : args.cause?.message\n ? args.cause.message\n : args.details!\n const docsPath =\n args.cause instanceof BaseError\n ? args.cause.docsPath || args.docsPath\n : args.docsPath\n const message = [\n shortMessage || 'An error occurred.',\n '',\n ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n ...(docsPath ? [`Docs: https://abitype.dev${docsPath}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n `Version: abitype@${version}`,\n ].join('\\n')\n\n super(message)\n\n if (args.cause) this.cause = args.cause\n this.details = details\n this.docsPath = docsPath\n this.metaMessages = args.metaMessages\n this.shortMessage = shortMessage\n }\n}\n","// TODO: This looks cool. Need to check the performance of `new RegExp` versus defined inline though.\n// https://twitter.com/GabrielVergnaud/status/1622906834343366657\nexport function execTyped(regex: RegExp, string: string) {\n const match = regex.exec(string)\n return match?.groups as type | undefined\n}\n\n// `bytes`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/\n\n// `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex =\n /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/\n\nexport const isTupleRegex = /^\\(.+?\\).*?$/\n","import type { AbiEventParameter, AbiParameter } from '../abi.js'\nimport { execTyped } from '../regex.js'\nimport type { IsNarrowable, Join } from '../types.js'\nimport type { AssertName } from './types/signatures.js'\n\n/**\n * Formats {@link AbiParameter} to human-readable ABI parameter.\n *\n * @param abiParameter - ABI parameter\n * @returns Human-readable ABI parameter\n *\n * @example\n * type Result = FormatAbiParameter<{ type: 'address'; name: 'from'; }>\n * // ^? type Result = 'address from'\n */\nexport type FormatAbiParameter<\n abiParameter extends AbiParameter | AbiEventParameter,\n> = abiParameter extends {\n name?: infer name extends string\n type: `tuple${infer array}`\n components: infer components extends readonly AbiParameter[]\n indexed?: infer indexed extends boolean\n}\n ? FormatAbiParameter<\n {\n type: `(${Join<\n {\n [key in keyof components]: FormatAbiParameter<\n {\n type: components[key]['type']\n } & (IsNarrowable extends true\n ? { name: components[key]['name'] }\n : unknown) &\n (components[key] extends { components: readonly AbiParameter[] }\n ? { components: components[key]['components'] }\n : unknown)\n >\n },\n ', '\n >})${array}`\n } & (IsNarrowable extends true ? { name: name } : unknown) &\n (IsNarrowable extends true\n ? { indexed: indexed }\n : unknown)\n >\n : `${abiParameter['type']}${abiParameter extends { indexed: true }\n ? ' indexed'\n : ''}${abiParameter['name'] extends infer name extends string\n ? name extends ''\n ? ''\n : ` ${AssertName}`\n : ''}`\n\n// https://regexr.com/7f7rv\nconst tupleRegex = /^tuple(?(\\[(\\d*)\\])*)$/\n\n/**\n * Formats {@link AbiParameter} to human-readable ABI parameter.\n *\n * @param abiParameter - ABI parameter\n * @returns Human-readable ABI parameter\n *\n * @example\n * const result = formatAbiParameter({ type: 'address', name: 'from' })\n * // ^? const result: 'address from'\n */\nexport function formatAbiParameter<\n const abiParameter extends AbiParameter | AbiEventParameter,\n>(abiParameter: abiParameter): FormatAbiParameter {\n type Result = FormatAbiParameter\n\n let type = abiParameter.type\n if (tupleRegex.test(abiParameter.type) && 'components' in abiParameter) {\n type = '('\n const length = abiParameter.components.length as number\n for (let i = 0; i < length; i++) {\n const component = abiParameter.components[i]!\n type += formatAbiParameter(component)\n if (i < length - 1) type += ', '\n }\n const result = execTyped<{ array?: string }>(tupleRegex, abiParameter.type)\n type += `)${result?.array || ''}`\n return formatAbiParameter({\n ...abiParameter,\n type,\n }) as Result\n }\n // Add `indexed` to type if in `abiParameter`\n if ('indexed' in abiParameter && abiParameter.indexed)\n type = `${type} indexed`\n // Return human-readable ABI parameter\n if (abiParameter.name) return `${type} ${abiParameter.name}` as Result\n return type as Result\n}\n","import type { AbiEventParameter, AbiParameter } from '../abi.js'\nimport type { Join } from '../types.js'\nimport {\n type FormatAbiParameter,\n formatAbiParameter,\n} from './formatAbiParameter.js'\n\n/**\n * Formats {@link AbiParameter}s to human-readable ABI parameter.\n *\n * @param abiParameters - ABI parameters\n * @returns Human-readable ABI parameters\n *\n * @example\n * type Result = FormatAbiParameters<[\n * // ^? type Result = 'address from, uint256 tokenId'\n * { type: 'address'; name: 'from'; },\n * { type: 'uint256'; name: 'tokenId'; },\n * ]>\n */\nexport type FormatAbiParameters<\n abiParameters extends readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ],\n> = Join<\n {\n [key in keyof abiParameters]: FormatAbiParameter\n },\n ', '\n>\n\n/**\n * Formats {@link AbiParameter}s to human-readable ABI parameters.\n *\n * @param abiParameters - ABI parameters\n * @returns Human-readable ABI parameters\n *\n * @example\n * const result = formatAbiParameters([\n * // ^? const result: 'address from, uint256 tokenId'\n * { type: 'address', name: 'from' },\n * { type: 'uint256', name: 'tokenId' },\n * ])\n */\nexport function formatAbiParameters<\n const abiParameters extends readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ],\n>(abiParameters: abiParameters): FormatAbiParameters {\n let params = ''\n const length = abiParameters.length\n for (let i = 0; i < length; i++) {\n const abiParameter = abiParameters[i]!\n params += formatAbiParameter(abiParameter)\n if (i !== length - 1) params += ', '\n }\n return params as FormatAbiParameters\n}\n","import type {\n Abi,\n AbiConstructor,\n AbiError,\n AbiEvent,\n AbiEventParameter,\n AbiFallback,\n AbiFunction,\n AbiParameter,\n AbiReceive,\n AbiStateMutability,\n} from '../abi.js'\nimport {\n type FormatAbiParameters as FormatAbiParameters_,\n formatAbiParameters,\n} from './formatAbiParameters.js'\nimport type { AssertName } from './types/signatures.js'\n\n/**\n * Formats ABI item (e.g. error, event, function) into human-readable ABI item\n *\n * @param abiItem - ABI item\n * @returns Human-readable ABI item\n */\nexport type FormatAbiItem =\n Abi[number] extends abiItem\n ? string\n :\n | (abiItem extends AbiFunction\n ? AbiFunction extends abiItem\n ? string\n : `function ${AssertName}(${FormatAbiParameters<\n abiItem['inputs']\n >})${abiItem['stateMutability'] extends Exclude<\n AbiStateMutability,\n 'nonpayable'\n >\n ? ` ${abiItem['stateMutability']}`\n : ''}${abiItem['outputs']['length'] extends 0\n ? ''\n : ` returns (${FormatAbiParameters})`}`\n : never)\n | (abiItem extends AbiEvent\n ? AbiEvent extends abiItem\n ? string\n : `event ${AssertName}(${FormatAbiParameters<\n abiItem['inputs']\n >})`\n : never)\n | (abiItem extends AbiError\n ? AbiError extends abiItem\n ? string\n : `error ${AssertName}(${FormatAbiParameters<\n abiItem['inputs']\n >})`\n : never)\n | (abiItem extends AbiConstructor\n ? AbiConstructor extends abiItem\n ? string\n : `constructor(${FormatAbiParameters<\n abiItem['inputs']\n >})${abiItem['stateMutability'] extends 'payable'\n ? ' payable'\n : ''}`\n : never)\n | (abiItem extends AbiFallback\n ? AbiFallback extends abiItem\n ? string\n : `fallback() external${abiItem['stateMutability'] extends 'payable'\n ? ' payable'\n : ''}`\n : never)\n | (abiItem extends AbiReceive\n ? AbiReceive extends abiItem\n ? string\n : 'receive() external payable'\n : never)\n\ntype FormatAbiParameters<\n abiParameters extends readonly (AbiParameter | AbiEventParameter)[],\n> = abiParameters['length'] extends 0\n ? ''\n : FormatAbiParameters_<\n abiParameters extends readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ]\n ? abiParameters\n : never\n >\n\n/**\n * Formats ABI item (e.g. error, event, function) into human-readable ABI item\n *\n * @param abiItem - ABI item\n * @returns Human-readable ABI item\n */\nexport function formatAbiItem(\n abiItem: abiItem,\n): FormatAbiItem {\n type Result = FormatAbiItem\n type Params = readonly [\n AbiParameter | AbiEventParameter,\n ...(readonly (AbiParameter | AbiEventParameter)[]),\n ]\n\n if (abiItem.type === 'function')\n return `function ${abiItem.name}(${formatAbiParameters(\n abiItem.inputs as Params,\n )})${\n abiItem.stateMutability && abiItem.stateMutability !== 'nonpayable'\n ? ` ${abiItem.stateMutability}`\n : ''\n }${\n abiItem.outputs?.length\n ? ` returns (${formatAbiParameters(abiItem.outputs as Params)})`\n : ''\n }`\n if (abiItem.type === 'event')\n return `event ${abiItem.name}(${formatAbiParameters(\n abiItem.inputs as Params,\n )})`\n if (abiItem.type === 'error')\n return `error ${abiItem.name}(${formatAbiParameters(\n abiItem.inputs as Params,\n )})`\n if (abiItem.type === 'constructor')\n return `constructor(${formatAbiParameters(abiItem.inputs as Params)})${\n abiItem.stateMutability === 'payable' ? ' payable' : ''\n }`\n if (abiItem.type === 'fallback')\n return `fallback() external${\n abiItem.stateMutability === 'payable' ? ' payable' : ''\n }` as Result\n return 'receive() external payable' as Result\n}\n","import type { AbiStateMutability } from '../../abi.js'\nimport { execTyped } from '../../regex.js'\nimport type {\n EventModifier,\n FunctionModifier,\n Modifier,\n} from '../types/signatures.js'\n\n// https://regexr.com/7gmok\nconst errorSignatureRegex =\n /^error (?[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?.*?)\\)$/\nexport function isErrorSignature(signature: string) {\n return errorSignatureRegex.test(signature)\n}\nexport function execErrorSignature(signature: string) {\n return execTyped<{ name: string; parameters: string }>(\n errorSignatureRegex,\n signature,\n )\n}\n\n// https://regexr.com/7gmoq\nconst eventSignatureRegex =\n /^event (?[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?.*?)\\)$/\nexport function isEventSignature(signature: string) {\n return eventSignatureRegex.test(signature)\n}\nexport function execEventSignature(signature: string) {\n return execTyped<{ name: string; parameters: string }>(\n eventSignatureRegex,\n signature,\n )\n}\n\n// https://regexr.com/7gmot\nconst functionSignatureRegex =\n /^function (?[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?.*?)\\)(?: (?external|public{1}))?(?: (?pure|view|nonpayable|payable{1}))?(?: returns\\s?\\((?.*?)\\))?$/\nexport function isFunctionSignature(signature: string) {\n return functionSignatureRegex.test(signature)\n}\nexport function execFunctionSignature(signature: string) {\n return execTyped<{\n name: string\n parameters: string\n stateMutability?: AbiStateMutability\n returns?: string\n }>(functionSignatureRegex, signature)\n}\n\n// https://regexr.com/7gmp3\nconst structSignatureRegex =\n /^struct (?[a-zA-Z$_][a-zA-Z0-9$_]*) \\{(?.*?)\\}$/\nexport function isStructSignature(signature: string) {\n return structSignatureRegex.test(signature)\n}\nexport function execStructSignature(signature: string) {\n return execTyped<{ name: string; properties: string }>(\n structSignatureRegex,\n signature,\n )\n}\n\n// https://regexr.com/78u01\nconst constructorSignatureRegex =\n /^constructor\\((?.*?)\\)(?:\\s(?payable{1}))?$/\nexport function isConstructorSignature(signature: string) {\n return constructorSignatureRegex.test(signature)\n}\nexport function execConstructorSignature(signature: string) {\n return execTyped<{\n parameters: string\n stateMutability?: Extract\n }>(constructorSignatureRegex, signature)\n}\n\n// https://regexr.com/7srtn\nconst fallbackSignatureRegex =\n /^fallback\\(\\) external(?:\\s(?payable{1}))?$/\nexport function isFallbackSignature(signature: string) {\n return fallbackSignatureRegex.test(signature)\n}\nexport function execFallbackSignature(signature: string) {\n return execTyped<{\n parameters: string\n stateMutability?: Extract\n }>(fallbackSignatureRegex, signature)\n}\n\n// https://regexr.com/78u1k\nconst receiveSignatureRegex = /^receive\\(\\) external payable$/\nexport function isReceiveSignature(signature: string) {\n return receiveSignatureRegex.test(signature)\n}\n\nexport const modifiers = new Set([\n 'memory',\n 'indexed',\n 'storage',\n 'calldata',\n])\nexport const eventModifiers = new Set(['indexed'])\nexport const functionModifiers = new Set([\n 'calldata',\n 'memory',\n 'storage',\n])\n","import { BaseError } from '../../errors.js'\n\nexport class InvalidAbiItemError extends BaseError {\n override name = 'InvalidAbiItemError'\n\n constructor({ signature }: { signature: string | object }) {\n super('Failed to parse ABI item.', {\n details: `parseAbiItem(${JSON.stringify(signature, null, 2)})`,\n docsPath: '/api/human#parseabiitem-1',\n })\n }\n}\n\nexport class UnknownTypeError extends BaseError {\n override name = 'UnknownTypeError'\n\n constructor({ type }: { type: string }) {\n super('Unknown type.', {\n metaMessages: [\n `Type \"${type}\" is not a valid ABI type. Perhaps you forgot to include a struct signature?`,\n ],\n })\n }\n}\n\nexport class UnknownSolidityTypeError extends BaseError {\n override name = 'UnknownSolidityTypeError'\n\n constructor({ type }: { type: string }) {\n super('Unknown type.', {\n metaMessages: [`Type \"${type}\" is not a valid ABI type.`],\n })\n }\n}\n","import type { AbiItemType, AbiParameter } from '../../abi.js'\nimport { BaseError } from '../../errors.js'\nimport type { Modifier } from '../types/signatures.js'\n\nexport class InvalidAbiParameterError extends BaseError {\n override name = 'InvalidAbiParameterError'\n\n constructor({ param }: { param: string | object }) {\n super('Failed to parse ABI parameter.', {\n details: `parseAbiParameter(${JSON.stringify(param, null, 2)})`,\n docsPath: '/api/human#parseabiparameter-1',\n })\n }\n}\n\nexport class InvalidAbiParametersError extends BaseError {\n override name = 'InvalidAbiParametersError'\n\n constructor({ params }: { params: string | object }) {\n super('Failed to parse ABI parameters.', {\n details: `parseAbiParameters(${JSON.stringify(params, null, 2)})`,\n docsPath: '/api/human#parseabiparameters-1',\n })\n }\n}\n\nexport class InvalidParameterError extends BaseError {\n override name = 'InvalidParameterError'\n\n constructor({ param }: { param: string }) {\n super('Invalid ABI parameter.', {\n details: param,\n })\n }\n}\n\nexport class SolidityProtectedKeywordError extends BaseError {\n override name = 'SolidityProtectedKeywordError'\n\n constructor({ param, name }: { param: string; name: string }) {\n super('Invalid ABI parameter.', {\n details: param,\n metaMessages: [\n `\"${name}\" is a protected Solidity keyword. More info: https://docs.soliditylang.org/en/latest/cheatsheet.html`,\n ],\n })\n }\n}\n\nexport class InvalidModifierError extends BaseError {\n override name = 'InvalidModifierError'\n\n constructor({\n param,\n type,\n modifier,\n }: {\n param: string\n type?: AbiItemType | 'struct' | undefined\n modifier: Modifier\n }) {\n super('Invalid ABI parameter.', {\n details: param,\n metaMessages: [\n `Modifier \"${modifier}\" not allowed${\n type ? ` in \"${type}\" type` : ''\n }.`,\n ],\n })\n }\n}\n\nexport class InvalidFunctionModifierError extends BaseError {\n override name = 'InvalidFunctionModifierError'\n\n constructor({\n param,\n type,\n modifier,\n }: {\n param: string\n type?: AbiItemType | 'struct' | undefined\n modifier: Modifier\n }) {\n super('Invalid ABI parameter.', {\n details: param,\n metaMessages: [\n `Modifier \"${modifier}\" not allowed${\n type ? ` in \"${type}\" type` : ''\n }.`,\n `Data location can only be specified for array, struct, or mapping types, but \"${modifier}\" was given.`,\n ],\n })\n }\n}\n\nexport class InvalidAbiTypeParameterError extends BaseError {\n override name = 'InvalidAbiTypeParameterError'\n\n constructor({\n abiParameter,\n }: {\n abiParameter: AbiParameter & { indexed?: boolean | undefined }\n }) {\n super('Invalid ABI parameter.', {\n details: JSON.stringify(abiParameter, null, 2),\n metaMessages: ['ABI parameter type is invalid.'],\n })\n }\n}\n","import type { AbiItemType } from '../../abi.js'\nimport { BaseError } from '../../errors.js'\n\nexport class InvalidSignatureError extends BaseError {\n override name = 'InvalidSignatureError'\n\n constructor({\n signature,\n type,\n }: {\n signature: string\n type: AbiItemType | 'struct'\n }) {\n super(`Invalid ${type} signature.`, {\n details: signature,\n })\n }\n}\n\nexport class UnknownSignatureError extends BaseError {\n override name = 'UnknownSignatureError'\n\n constructor({ signature }: { signature: string }) {\n super('Unknown signature.', {\n details: signature,\n })\n }\n}\n\nexport class InvalidStructSignatureError extends BaseError {\n override name = 'InvalidStructSignatureError'\n\n constructor({ signature }: { signature: string }) {\n super('Invalid struct signature.', {\n details: signature,\n metaMessages: ['No properties exist.'],\n })\n }\n}\n","import { BaseError } from '../../errors.js'\n\nexport class CircularReferenceError extends BaseError {\n override name = 'CircularReferenceError'\n\n constructor({ type }: { type: string }) {\n super('Circular reference detected.', {\n metaMessages: [`Struct \"${type}\" is a circular reference.`],\n })\n }\n}\n","import { BaseError } from '../../errors.js'\n\nexport class InvalidParenthesisError extends BaseError {\n override name = 'InvalidParenthesisError'\n\n constructor({ current, depth }: { current: string; depth: number }) {\n super('Unbalanced parentheses.', {\n metaMessages: [\n `\"${current.trim()}\" has too many ${\n depth > 0 ? 'opening' : 'closing'\n } parentheses.`,\n ],\n details: `Depth \"${depth}\"`,\n })\n }\n}\n","import type { AbiItemType, AbiParameter } from '../../abi.js'\nimport type { StructLookup } from '../types/structs.js'\n\n/**\n * Gets {@link parameterCache} cache key namespaced by {@link type} and {@link structs}. This prevents parameters from being accessible to types that don't allow them (e.g. `string indexed foo` not allowed outside of `type: 'event'`) and ensures different struct definitions with the same name are cached separately.\n * @param param ABI parameter string\n * @param type ABI parameter type\n * @param structs Struct definitions to include in cache key\n * @returns Cache key for {@link parameterCache}\n */\nexport function getParameterCacheKey(\n param: string,\n type?: AbiItemType | 'struct',\n structs?: StructLookup,\n) {\n let structKey = ''\n if (structs)\n for (const struct of Object.entries(structs)) {\n if (!struct) continue\n let propertyKey = ''\n for (const property of struct[1]) {\n propertyKey += `[${property.type}${property.name ? `:${property.name}` : ''}]`\n }\n structKey += `(${struct[0]}{${propertyKey}})`\n }\n if (type) return `${type}:${param}${structKey}`\n return `${param}${structKey}`\n}\n\n/**\n * Basic cache seeded with common ABI parameter strings.\n *\n * **Note: When seeding more parameters, make sure you benchmark performance. The current number is the ideal balance between performance and having an already existing cache.**\n */\nexport const parameterCache = new Map<\n string,\n AbiParameter & { indexed?: boolean }\n>([\n // Unnamed\n ['address', { type: 'address' }],\n ['bool', { type: 'bool' }],\n ['bytes', { type: 'bytes' }],\n ['bytes32', { type: 'bytes32' }],\n ['int', { type: 'int256' }],\n ['int256', { type: 'int256' }],\n ['string', { type: 'string' }],\n ['uint', { type: 'uint256' }],\n ['uint8', { type: 'uint8' }],\n ['uint16', { type: 'uint16' }],\n ['uint24', { type: 'uint24' }],\n ['uint32', { type: 'uint32' }],\n ['uint64', { type: 'uint64' }],\n ['uint96', { type: 'uint96' }],\n ['uint112', { type: 'uint112' }],\n ['uint160', { type: 'uint160' }],\n ['uint192', { type: 'uint192' }],\n ['uint256', { type: 'uint256' }],\n\n // Named\n ['address owner', { type: 'address', name: 'owner' }],\n ['address to', { type: 'address', name: 'to' }],\n ['bool approved', { type: 'bool', name: 'approved' }],\n ['bytes _data', { type: 'bytes', name: '_data' }],\n ['bytes data', { type: 'bytes', name: 'data' }],\n ['bytes signature', { type: 'bytes', name: 'signature' }],\n ['bytes32 hash', { type: 'bytes32', name: 'hash' }],\n ['bytes32 r', { type: 'bytes32', name: 'r' }],\n ['bytes32 root', { type: 'bytes32', name: 'root' }],\n ['bytes32 s', { type: 'bytes32', name: 's' }],\n ['string name', { type: 'string', name: 'name' }],\n ['string symbol', { type: 'string', name: 'symbol' }],\n ['string tokenURI', { type: 'string', name: 'tokenURI' }],\n ['uint tokenId', { type: 'uint256', name: 'tokenId' }],\n ['uint8 v', { type: 'uint8', name: 'v' }],\n ['uint256 balance', { type: 'uint256', name: 'balance' }],\n ['uint256 tokenId', { type: 'uint256', name: 'tokenId' }],\n ['uint256 value', { type: 'uint256', name: 'value' }],\n\n // Indexed\n [\n 'event:address indexed from',\n { type: 'address', name: 'from', indexed: true },\n ],\n ['event:address indexed to', { type: 'address', name: 'to', indexed: true }],\n [\n 'event:uint indexed tokenId',\n { type: 'uint256', name: 'tokenId', indexed: true },\n ],\n [\n 'event:uint256 indexed tokenId',\n { type: 'uint256', name: 'tokenId', indexed: true },\n ],\n])\n","import type {\n AbiItemType,\n AbiType,\n SolidityArray,\n SolidityBytes,\n SolidityString,\n SolidityTuple,\n} from '../../abi.js'\nimport {\n bytesRegex,\n execTyped,\n integerRegex,\n isTupleRegex,\n} from '../../regex.js'\nimport { UnknownSolidityTypeError } from '../errors/abiItem.js'\nimport {\n InvalidFunctionModifierError,\n InvalidModifierError,\n InvalidParameterError,\n SolidityProtectedKeywordError,\n} from '../errors/abiParameter.js'\nimport {\n InvalidSignatureError,\n UnknownSignatureError,\n} from '../errors/signature.js'\nimport { InvalidParenthesisError } from '../errors/splitParameters.js'\nimport type { FunctionModifier, Modifier } from '../types/signatures.js'\nimport type { StructLookup } from '../types/structs.js'\nimport { getParameterCacheKey, parameterCache } from './cache.js'\nimport {\n eventModifiers,\n execConstructorSignature,\n execErrorSignature,\n execEventSignature,\n execFallbackSignature,\n execFunctionSignature,\n functionModifiers,\n isConstructorSignature,\n isErrorSignature,\n isEventSignature,\n isFallbackSignature,\n isFunctionSignature,\n isReceiveSignature,\n} from './signatures.js'\n\nexport function parseSignature(signature: string, structs: StructLookup = {}) {\n if (isFunctionSignature(signature))\n return parseFunctionSignature(signature, structs)\n\n if (isEventSignature(signature))\n return parseEventSignature(signature, structs)\n\n if (isErrorSignature(signature))\n return parseErrorSignature(signature, structs)\n\n if (isConstructorSignature(signature))\n return parseConstructorSignature(signature, structs)\n\n if (isFallbackSignature(signature)) return parseFallbackSignature(signature)\n\n if (isReceiveSignature(signature))\n return {\n type: 'receive',\n stateMutability: 'payable',\n }\n\n throw new UnknownSignatureError({ signature })\n}\n\nexport function parseFunctionSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execFunctionSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'function' })\n\n const inputParams = splitParameters(match.parameters)\n const inputs = []\n const inputLength = inputParams.length\n for (let i = 0; i < inputLength; i++) {\n inputs.push(\n parseAbiParameter(inputParams[i]!, {\n modifiers: functionModifiers,\n structs,\n type: 'function',\n }),\n )\n }\n\n const outputs = []\n if (match.returns) {\n const outputParams = splitParameters(match.returns)\n const outputLength = outputParams.length\n for (let i = 0; i < outputLength; i++) {\n outputs.push(\n parseAbiParameter(outputParams[i]!, {\n modifiers: functionModifiers,\n structs,\n type: 'function',\n }),\n )\n }\n }\n\n return {\n name: match.name,\n type: 'function',\n stateMutability: match.stateMutability ?? 'nonpayable',\n inputs,\n outputs,\n }\n}\n\nexport function parseEventSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execEventSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'event' })\n\n const params = splitParameters(match.parameters)\n const abiParameters = []\n const length = params.length\n for (let i = 0; i < length; i++)\n abiParameters.push(\n parseAbiParameter(params[i]!, {\n modifiers: eventModifiers,\n structs,\n type: 'event',\n }),\n )\n return { name: match.name, type: 'event', inputs: abiParameters }\n}\n\nexport function parseErrorSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execErrorSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'error' })\n\n const params = splitParameters(match.parameters)\n const abiParameters = []\n const length = params.length\n for (let i = 0; i < length; i++)\n abiParameters.push(\n parseAbiParameter(params[i]!, { structs, type: 'error' }),\n )\n return { name: match.name, type: 'error', inputs: abiParameters }\n}\n\nexport function parseConstructorSignature(\n signature: string,\n structs: StructLookup = {},\n) {\n const match = execConstructorSignature(signature)\n if (!match)\n throw new InvalidSignatureError({ signature, type: 'constructor' })\n\n const params = splitParameters(match.parameters)\n const abiParameters = []\n const length = params.length\n for (let i = 0; i < length; i++)\n abiParameters.push(\n parseAbiParameter(params[i]!, { structs, type: 'constructor' }),\n )\n return {\n type: 'constructor',\n stateMutability: match.stateMutability ?? 'nonpayable',\n inputs: abiParameters,\n }\n}\n\nexport function parseFallbackSignature(signature: string) {\n const match = execFallbackSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'fallback' })\n\n return {\n type: 'fallback',\n stateMutability: match.stateMutability ?? 'nonpayable',\n }\n}\n\nconst abiParameterWithoutTupleRegex =\n /^(?[a-zA-Z$_][a-zA-Z0-9$_]*(?:\\spayable)?)(?(?:\\[\\d*?\\])+?)?(?:\\s(?calldata|indexed|memory|storage{1}))?(?:\\s(?[a-zA-Z$_][a-zA-Z0-9$_]*))?$/\nconst abiParameterWithTupleRegex =\n /^\\((?.+?)\\)(?(?:\\[\\d*?\\])+?)?(?:\\s(?calldata|indexed|memory|storage{1}))?(?:\\s(?[a-zA-Z$_][a-zA-Z0-9$_]*))?$/\nconst dynamicIntegerRegex = /^u?int$/\n\ntype ParseOptions = {\n modifiers?: Set\n structs?: StructLookup\n type?: AbiItemType | 'struct'\n}\n\nexport function parseAbiParameter(param: string, options?: ParseOptions) {\n // optional namespace cache by `type`\n const parameterCacheKey = getParameterCacheKey(\n param,\n options?.type,\n options?.structs,\n )\n if (parameterCache.has(parameterCacheKey))\n return parameterCache.get(parameterCacheKey)!\n\n const isTuple = isTupleRegex.test(param)\n const match = execTyped<{\n array?: string\n modifier?: Modifier\n name?: string\n type: string\n }>(\n isTuple ? abiParameterWithTupleRegex : abiParameterWithoutTupleRegex,\n param,\n )\n if (!match) throw new InvalidParameterError({ param })\n\n if (match.name && isSolidityKeyword(match.name))\n throw new SolidityProtectedKeywordError({ param, name: match.name })\n\n const name = match.name ? { name: match.name } : {}\n const indexed = match.modifier === 'indexed' ? { indexed: true } : {}\n const structs = options?.structs ?? {}\n let type: string\n let components = {}\n if (isTuple) {\n type = 'tuple'\n const params = splitParameters(match.type)\n const components_ = []\n const length = params.length\n for (let i = 0; i < length; i++) {\n // remove `modifiers` from `options` to prevent from being added to tuple components\n components_.push(parseAbiParameter(params[i]!, { structs }))\n }\n components = { components: components_ }\n } else if (match.type in structs) {\n type = 'tuple'\n components = { components: structs[match.type] }\n } else if (dynamicIntegerRegex.test(match.type)) {\n type = `${match.type}256`\n } else if (match.type === 'address payable') {\n type = 'address'\n } else {\n type = match.type\n if (!(options?.type === 'struct') && !isSolidityType(type))\n throw new UnknownSolidityTypeError({ type })\n }\n\n if (match.modifier) {\n // Check if modifier exists, but is not allowed (e.g. `indexed` in `functionModifiers`)\n if (!options?.modifiers?.has?.(match.modifier))\n throw new InvalidModifierError({\n param,\n type: options?.type,\n modifier: match.modifier,\n })\n\n // Check if resolved `type` is valid if there is a function modifier\n if (\n functionModifiers.has(match.modifier as FunctionModifier) &&\n !isValidDataLocation(type, !!match.array)\n )\n throw new InvalidFunctionModifierError({\n param,\n type: options?.type,\n modifier: match.modifier,\n })\n }\n\n const abiParameter = {\n type: `${type}${match.array ?? ''}`,\n ...name,\n ...indexed,\n ...components,\n }\n parameterCache.set(parameterCacheKey, abiParameter)\n return abiParameter\n}\n\n// s/o latika for this\nexport function splitParameters(\n params: string,\n result: string[] = [],\n current = '',\n depth = 0,\n): readonly string[] {\n const length = params.trim().length\n // biome-ignore lint/correctness/noUnreachable: recursive\n for (let i = 0; i < length; i++) {\n const char = params[i]\n const tail = params.slice(i + 1)\n switch (char) {\n case ',':\n return depth === 0\n ? splitParameters(tail, [...result, current.trim()])\n : splitParameters(tail, result, `${current}${char}`, depth)\n case '(':\n return splitParameters(tail, result, `${current}${char}`, depth + 1)\n case ')':\n return splitParameters(tail, result, `${current}${char}`, depth - 1)\n default:\n return splitParameters(tail, result, `${current}${char}`, depth)\n }\n }\n\n if (current === '') return result\n if (depth !== 0) throw new InvalidParenthesisError({ current, depth })\n\n result.push(current.trim())\n return result\n}\n\nexport function isSolidityType(\n type: string,\n): type is Exclude {\n return (\n type === 'address' ||\n type === 'bool' ||\n type === 'function' ||\n type === 'string' ||\n bytesRegex.test(type) ||\n integerRegex.test(type)\n )\n}\n\nconst protectedKeywordsRegex =\n /^(?:after|alias|anonymous|apply|auto|byte|calldata|case|catch|constant|copyof|default|defined|error|event|external|false|final|function|immutable|implements|in|indexed|inline|internal|let|mapping|match|memory|mutable|null|of|override|partial|private|promise|public|pure|reference|relocatable|return|returns|sizeof|static|storage|struct|super|supports|switch|this|true|try|typedef|typeof|var|view|virtual)$/\n\n/** @internal */\nexport function isSolidityKeyword(name: string) {\n return (\n name === 'address' ||\n name === 'bool' ||\n name === 'function' ||\n name === 'string' ||\n name === 'tuple' ||\n bytesRegex.test(name) ||\n integerRegex.test(name) ||\n protectedKeywordsRegex.test(name)\n )\n}\n\n/** @internal */\nexport function isValidDataLocation(\n type: string,\n isArray: boolean,\n): type is Exclude<\n AbiType,\n SolidityString | Extract | SolidityArray\n> {\n return isArray || type === 'bytes' || type === 'string' || type === 'tuple'\n}\n","import type { AbiParameter } from '../../abi.js'\nimport { execTyped, isTupleRegex } from '../../regex.js'\nimport { UnknownTypeError } from '../errors/abiItem.js'\nimport { InvalidAbiTypeParameterError } from '../errors/abiParameter.js'\nimport {\n InvalidSignatureError,\n InvalidStructSignatureError,\n} from '../errors/signature.js'\nimport { CircularReferenceError } from '../errors/struct.js'\nimport type { StructLookup } from '../types/structs.js'\nimport { execStructSignature, isStructSignature } from './signatures.js'\nimport { isSolidityType, parseAbiParameter } from './utils.js'\n\nexport function parseStructs(signatures: readonly string[]) {\n // Create \"shallow\" version of each struct (and filter out non-structs or invalid structs)\n const shallowStructs: StructLookup = {}\n const signaturesLength = signatures.length\n for (let i = 0; i < signaturesLength; i++) {\n const signature = signatures[i]!\n if (!isStructSignature(signature)) continue\n\n const match = execStructSignature(signature)\n if (!match) throw new InvalidSignatureError({ signature, type: 'struct' })\n\n const properties = match.properties.split(';')\n\n const components: AbiParameter[] = []\n const propertiesLength = properties.length\n for (let k = 0; k < propertiesLength; k++) {\n const property = properties[k]!\n const trimmed = property.trim()\n if (!trimmed) continue\n const abiParameter = parseAbiParameter(trimmed, {\n type: 'struct',\n })\n components.push(abiParameter)\n }\n\n if (!components.length) throw new InvalidStructSignatureError({ signature })\n shallowStructs[match.name] = components\n }\n\n // Resolve nested structs inside each parameter\n const resolvedStructs: StructLookup = {}\n const entries = Object.entries(shallowStructs)\n const entriesLength = entries.length\n for (let i = 0; i < entriesLength; i++) {\n const [name, parameters] = entries[i]!\n resolvedStructs[name] = resolveStructs(parameters, shallowStructs)\n }\n\n return resolvedStructs\n}\n\nconst typeWithoutTupleRegex =\n /^(?[a-zA-Z$_][a-zA-Z0-9$_]*)(?(?:\\[\\d*?\\])+?)?$/\n\nfunction resolveStructs(\n abiParameters: readonly (AbiParameter & { indexed?: true })[] = [],\n structs: StructLookup = {},\n ancestors = new Set(),\n) {\n const components: AbiParameter[] = []\n const length = abiParameters.length\n for (let i = 0; i < length; i++) {\n const abiParameter = abiParameters[i]!\n const isTuple = isTupleRegex.test(abiParameter.type)\n if (isTuple) components.push(abiParameter)\n else {\n const match = execTyped<{ array?: string; type: string }>(\n typeWithoutTupleRegex,\n abiParameter.type,\n )\n if (!match?.type) throw new InvalidAbiTypeParameterError({ abiParameter })\n\n const { array, type } = match\n if (type in structs) {\n if (ancestors.has(type)) throw new CircularReferenceError({ type })\n\n components.push({\n ...abiParameter,\n type: `tuple${array ?? ''}`,\n components: resolveStructs(\n structs[type],\n structs,\n new Set([...ancestors, type]),\n ),\n })\n } else {\n if (isSolidityType(type)) components.push(abiParameter)\n else throw new UnknownTypeError({ type })\n }\n }\n }\n\n return components\n}\n","import type { Abi } from '../abi.js'\nimport type { Error, Filter } from '../types.js'\nimport { isStructSignature } from './runtime/signatures.js'\nimport { parseStructs } from './runtime/structs.js'\nimport { parseSignature } from './runtime/utils.js'\nimport type { Signatures } from './types/signatures.js'\nimport type { ParseStructs } from './types/structs.js'\nimport type { ParseSignature } from './types/utils.js'\n\n/**\n * Parses human-readable ABI into JSON {@link Abi}\n *\n * @param signatures - Human-readable ABI\n * @returns Parsed {@link Abi}\n *\n * @example\n * type Result = ParseAbi<\n * // ^? type Result = readonly [{ name: \"balanceOf\"; type: \"function\"; stateMutability:...\n * [\n * 'function balanceOf(address owner) view returns (uint256)',\n * 'event Transfer(address indexed from, address indexed to, uint256 amount)',\n * ]\n * >\n */\nexport type ParseAbi =\n string[] extends signatures\n ? Abi // If `T` was not able to be inferred (e.g. just `string[]`), return `Abi`\n : signatures extends readonly string[]\n ? signatures extends Signatures // Validate signatures\n ? ParseStructs extends infer structs\n ? {\n [key in keyof signatures]: signatures[key] extends string\n ? ParseSignature\n : never\n } extends infer mapped extends readonly unknown[]\n ? Filter extends infer result\n ? result extends readonly []\n ? never\n : result\n : never\n : never\n : never\n : never\n : never\n\n/**\n * Parses human-readable ABI into JSON {@link Abi}\n *\n * @param signatures - Human-Readable ABI\n * @returns Parsed {@link Abi}\n *\n * @example\n * const abi = parseAbi([\n * // ^? const abi: readonly [{ name: \"balanceOf\"; type: \"function\"; stateMutability:...\n * 'function balanceOf(address owner) view returns (uint256)',\n * 'event Transfer(address indexed from, address indexed to, uint256 amount)',\n * ])\n */\nexport function parseAbi(\n signatures: signatures['length'] extends 0\n ? Error<'At least one signature required'>\n : Signatures extends signatures\n ? signatures\n : Signatures,\n): ParseAbi {\n const structs = parseStructs(signatures as readonly string[])\n const abi = []\n const length = signatures.length as number\n for (let i = 0; i < length; i++) {\n const signature = (signatures as readonly string[])[i]!\n if (isStructSignature(signature)) continue\n abi.push(parseSignature(signature, structs))\n }\n return abi as unknown as ParseAbi\n}\n","import type { Abi } from '../abi.js'\nimport type { Narrow } from '../narrow.js'\nimport type { Error, Filter } from '../types.js'\nimport { InvalidAbiItemError } from './errors/abiItem.js'\nimport { isStructSignature } from './runtime/signatures.js'\nimport { parseStructs } from './runtime/structs.js'\nimport { parseSignature } from './runtime/utils.js'\nimport type { Signature, Signatures } from './types/signatures.js'\nimport type { ParseStructs } from './types/structs.js'\nimport type { ParseSignature } from './types/utils.js'\n\n/**\n * Parses human-readable ABI item (e.g. error, event, function) into {@link Abi} item\n *\n * @param signature - Human-readable ABI item\n * @returns Parsed {@link Abi} item\n *\n * @example\n * type Result = ParseAbiItem<'function balanceOf(address owner) view returns (uint256)'>\n * // ^? type Result = { name: \"balanceOf\"; type: \"function\"; stateMutability: \"view\";...\n *\n * @example\n * type Result = ParseAbiItem<\n * // ^? type Result = { name: \"foo\"; type: \"function\"; stateMutability: \"view\"; inputs:...\n * ['function foo(Baz bar) view returns (string)', 'struct Baz { string name; }']\n * >\n */\nexport type ParseAbiItem<\n signature extends string | readonly string[] | readonly unknown[],\n> =\n | (signature extends string\n ? string extends signature\n ? Abi[number]\n : signature extends Signature // Validate signature\n ? ParseSignature\n : never\n : never)\n | (signature extends readonly string[]\n ? string[] extends signature\n ? Abi[number] // Return generic Abi item since type was no inferrable\n : signature extends Signatures // Validate signature\n ? ParseStructs extends infer structs\n ? {\n [key in keyof signature]: ParseSignature<\n signature[key] extends string ? signature[key] : never,\n structs\n >\n } extends infer mapped extends readonly unknown[]\n ? // Filter out `never` since those are structs\n Filter[0] extends infer result\n ? result extends undefined // convert `undefined` to `never` (e.g. `ParseAbiItem<['struct Foo { string name; }']>`)\n ? never\n : result\n : never\n : never\n : never\n : never\n : never)\n\n/**\n * Parses human-readable ABI item (e.g. error, event, function) into {@link Abi} item\n *\n * @param signature - Human-readable ABI item\n * @returns Parsed {@link Abi} item\n *\n * @example\n * const abiItem = parseAbiItem('function balanceOf(address owner) view returns (uint256)')\n * // ^? const abiItem: { name: \"balanceOf\"; type: \"function\"; stateMutability: \"view\";...\n *\n * @example\n * const abiItem = parseAbiItem([\n * // ^? const abiItem: { name: \"foo\"; type: \"function\"; stateMutability: \"view\"; inputs:...\n * 'function foo(Baz bar) view returns (string)',\n * 'struct Baz { string name; }',\n * ])\n */\nexport function parseAbiItem<\n signature extends string | readonly string[] | readonly unknown[],\n>(\n signature: Narrow &\n (\n | (signature extends string\n ? string extends signature\n ? unknown\n : Signature\n : never)\n | (signature extends readonly string[]\n ? signature extends readonly [] // empty array\n ? Error<'At least one signature required.'>\n : string[] extends signature\n ? unknown\n : Signatures\n : never)\n ),\n): ParseAbiItem {\n let abiItem: ParseAbiItem | undefined\n if (typeof signature === 'string')\n abiItem = parseSignature(signature) as ParseAbiItem\n else {\n const structs = parseStructs(signature as readonly string[])\n const length = signature.length as number\n for (let i = 0; i < length; i++) {\n const signature_ = (signature as readonly string[])[i]!\n if (isStructSignature(signature_)) continue\n abiItem = parseSignature(signature_, structs) as ParseAbiItem\n break\n }\n }\n\n if (!abiItem) throw new InvalidAbiItemError({ signature })\n return abiItem as ParseAbiItem\n}\n","import type { AbiParameter } from '../abi.js'\nimport type { Narrow } from '../narrow.js'\nimport type { Error, Filter } from '../types.js'\nimport { InvalidAbiParametersError } from './errors/abiParameter.js'\nimport { isStructSignature, modifiers } from './runtime/signatures.js'\nimport { parseStructs } from './runtime/structs.js'\nimport { splitParameters } from './runtime/utils.js'\nimport { parseAbiParameter as parseAbiParameter_ } from './runtime/utils.js'\nimport type { IsStructSignature, Modifier } from './types/signatures.js'\nimport type { ParseStructs } from './types/structs.js'\nimport type { SplitParameters } from './types/utils.js'\nimport type { ParseAbiParameters as ParseAbiParameters_ } from './types/utils.js'\n\n/**\n * Parses human-readable ABI parameters into {@link AbiParameter}s\n *\n * @param params - Human-readable ABI parameters\n * @returns Parsed {@link AbiParameter}s\n *\n * @example\n * type Result = ParseAbiParameters('address from, address to, uint256 amount')\n * // ^? type Result: [{ type: \"address\"; name: \"from\"; }, { type: \"address\";...\n *\n * @example\n * type Result = ParseAbiParameters<\n * // ^? type Result: [{ type: \"tuple\"; components: [{ type: \"string\"; name:...\n * ['Baz bar', 'struct Baz { string name; }']\n * >\n */\nexport type ParseAbiParameters<\n params extends string | readonly string[] | readonly unknown[],\n> =\n | (params extends string\n ? params extends ''\n ? never\n : string extends params\n ? readonly AbiParameter[]\n : ParseAbiParameters_, { modifier: Modifier }>\n : never)\n | (params extends readonly string[]\n ? string[] extends params\n ? AbiParameter // Return generic AbiParameter item since type was no inferrable\n : ParseStructs extends infer structs\n ? {\n [key in keyof params]: params[key] extends string\n ? IsStructSignature extends true\n ? never\n : ParseAbiParameters_<\n SplitParameters,\n { modifier: Modifier; structs: structs }\n >\n : never\n } extends infer mapped extends readonly unknown[]\n ? Filter extends readonly [...infer content]\n ? content['length'] extends 0\n ? never\n : DeepFlatten\n : never\n : never\n : never\n : never)\n\n/**\n * Flatten all members of {@link T}\n *\n * @param T - List of items to flatten\n * @param Acc - The accumulator used while recursing\n * @returns The flattened array\n *\n * @example\n * type Result = DeepFlatten<[['a', 'b'], [['c']]]>\n * // ^? type Result = ['a', 'b', 'c']\n */\ntype DeepFlatten<\n T extends readonly unknown[],\n Acc extends readonly unknown[] = readonly [],\n> = T extends readonly [infer head, ...infer tail]\n ? tail extends undefined\n ? never\n : head extends readonly unknown[]\n ? DeepFlatten]>\n : DeepFlatten\n : Acc\n\n/**\n * Parses human-readable ABI parameters into {@link AbiParameter}s\n *\n * @param params - Human-readable ABI parameters\n * @returns Parsed {@link AbiParameter}s\n *\n * @example\n * const abiParameters = parseAbiParameters('address from, address to, uint256 amount')\n * // ^? const abiParameters: [{ type: \"address\"; name: \"from\"; }, { type: \"address\";...\n *\n * @example\n * const abiParameters = parseAbiParameters([\n * // ^? const abiParameters: [{ type: \"tuple\"; components: [{ type: \"string\"; name:...\n * 'Baz bar',\n * 'struct Baz { string name; }',\n * ])\n */\nexport function parseAbiParameters<\n params extends string | readonly string[] | readonly unknown[],\n>(\n params: Narrow &\n (\n | (params extends string\n ? params extends ''\n ? Error<'Empty string is not allowed.'>\n : unknown\n : never)\n | (params extends readonly string[]\n ? params extends readonly [] // empty array\n ? Error<'At least one parameter required.'>\n : string[] extends params\n ? unknown\n : unknown // TODO: Validate param string\n : never)\n ),\n): ParseAbiParameters {\n const abiParameters: AbiParameter[] = []\n if (typeof params === 'string') {\n const parameters = splitParameters(params)\n const length = parameters.length\n for (let i = 0; i < length; i++) {\n abiParameters.push(parseAbiParameter_(parameters[i]!, { modifiers }))\n }\n } else {\n const structs = parseStructs(params as readonly string[])\n const length = params.length as number\n for (let i = 0; i < length; i++) {\n const signature = (params as readonly string[])[i]!\n if (isStructSignature(signature)) continue\n const parameters = splitParameters(signature)\n const length = parameters.length\n for (let k = 0; k < length; k++) {\n abiParameters.push(\n parseAbiParameter_(parameters[k]!, { modifiers, structs }),\n )\n }\n }\n }\n\n if (abiParameters.length === 0)\n throw new InvalidAbiParametersError({ params })\n\n return abiParameters as ParseAbiParameters\n}\n","export type {\n Abi,\n AbiConstructor,\n AbiError,\n AbiEvent,\n AbiEventParameter,\n AbiFallback,\n AbiFunction,\n AbiInternalType,\n AbiItemType,\n AbiParameter,\n AbiParameterKind,\n AbiReceive,\n AbiStateMutability,\n AbiType,\n Address,\n SolidityAddress,\n SolidityArray,\n SolidityArrayWithoutTuple,\n SolidityArrayWithTuple,\n SolidityBool,\n SolidityBytes,\n SolidityFixedArrayRange,\n SolidityFixedArraySizeLookup,\n SolidityFunction,\n SolidityInt,\n SolidityString,\n SolidityTuple,\n TypedData,\n TypedDataDomain,\n TypedDataParameter,\n TypedDataType,\n} from '../abi.js'\n\n// biome-ignore lint/performance/noBarrelFile: \nexport { BaseError } from '../errors.js'\n\nexport type { Narrow } from '../narrow.js'\nexport { narrow } from '../narrow.js'\n\nexport type {\n Register,\n DefaultRegister,\n ResolvedRegister,\n} from '../register.js'\n\nexport type {\n AbiParameterToPrimitiveType,\n AbiParametersToPrimitiveTypes,\n AbiTypeToPrimitiveType,\n ExtractAbiError,\n ExtractAbiErrorNames,\n ExtractAbiErrors,\n ExtractAbiEvent,\n ExtractAbiEventNames,\n ExtractAbiEvents,\n ExtractAbiFunction,\n ExtractAbiFunctionNames,\n ExtractAbiFunctions,\n IsAbi,\n IsTypedData,\n TypedDataToPrimitiveTypes,\n} from '../utils.js'\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n// Human-Readable\n\nexport {\n formatAbi,\n type FormatAbi,\n} from '../human-readable/formatAbi.js'\n\nexport {\n formatAbiItem,\n type FormatAbiItem,\n} from '../human-readable/formatAbiItem.js'\n\nexport {\n formatAbiParameter,\n type FormatAbiParameter,\n} from '../human-readable/formatAbiParameter.js'\n\nexport {\n formatAbiParameters,\n type FormatAbiParameters,\n} from '../human-readable/formatAbiParameters.js'\n\nexport { parseAbi, type ParseAbi } from '../human-readable/parseAbi.js'\n\nexport {\n parseAbiItem,\n type ParseAbiItem,\n} from '../human-readable/parseAbiItem.js'\n\nexport {\n parseAbiParameter,\n type ParseAbiParameter,\n} from '../human-readable/parseAbiParameter.js'\n\nexport {\n parseAbiParameters,\n type ParseAbiParameters,\n} from '../human-readable/parseAbiParameters.js'\n\nexport {\n UnknownTypeError,\n InvalidAbiItemError,\n UnknownSolidityTypeError,\n} from '../human-readable/errors/abiItem.js'\n\nexport {\n InvalidAbiTypeParameterError,\n InvalidFunctionModifierError,\n InvalidModifierError,\n SolidityProtectedKeywordError,\n InvalidParameterError,\n InvalidAbiParametersError,\n InvalidAbiParameterError,\n} from '../human-readable/errors/abiParameter.js'\n\nexport {\n InvalidStructSignatureError,\n InvalidSignatureError,\n UnknownSignatureError,\n} from '../human-readable/errors/signature.js'\n\nexport { InvalidParenthesisError } from '../human-readable/errors/splitParameters.js'\n\nexport { CircularReferenceError } from '../human-readable/errors/struct.js'\n","import type { Client } from '../clients/createClient.js'\nimport type { PublicActions } from '../clients/decorators/public.js'\nimport type { WalletActions } from '../clients/decorators/wallet.js'\nimport type { Transport } from '../clients/transports/createTransport.js'\nimport type { Account } from '../types/account.js'\nimport type { Chain } from '../types/chain.js'\nimport type { RpcSchema } from '../types/eip1193.js'\n\n/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction<\n transport extends Transport,\n chain extends Chain | undefined,\n account extends Account | undefined,\n rpcSchema extends RpcSchema | undefined,\n extended extends { [key: string]: unknown },\n client extends Client,\n parameters,\n returnType,\n>(\n client: client,\n actionFn: (_: any, parameters: parameters) => returnType,\n // Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n // meaning that `actionFn.name` will not always work. For that case, the consumer\n // needs to pass the name explicitly.\n name: keyof PublicActions | keyof WalletActions | (string & {}),\n): (parameters: parameters) => returnType {\n const action_implicit = client[actionFn.name]\n if (typeof action_implicit === 'function')\n return action_implicit as (params: parameters) => returnType\n\n const action_explicit = client[name]\n if (typeof action_explicit === 'function')\n return action_explicit as (params: parameters) => returnType\n\n return (params) => actionFn(client, params)\n}\n","import type { AbiParameter } from 'abitype'\n\nimport {\n InvalidDefinitionTypeError,\n type InvalidDefinitionTypeErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { AbiItem } from '../../types/contract.js'\n\nexport type FormatAbiItemErrorType =\n | FormatAbiParamsErrorType\n | InvalidDefinitionTypeErrorType\n | ErrorType\n\nexport function formatAbiItem(\n abiItem: AbiItem,\n { includeName = false }: { includeName?: boolean | undefined } = {},\n) {\n if (\n abiItem.type !== 'function' &&\n abiItem.type !== 'event' &&\n abiItem.type !== 'error'\n )\n throw new InvalidDefinitionTypeError(abiItem.type)\n\n return `${abiItem.name}(${formatAbiParams(abiItem.inputs, { includeName })})`\n}\n\nexport type FormatAbiParamsErrorType = ErrorType\n\nexport function formatAbiParams(\n params: readonly AbiParameter[] | undefined,\n { includeName = false }: { includeName?: boolean | undefined } = {},\n): string {\n if (!params) return ''\n return params\n .map((param) => formatAbiParam(param, { includeName }))\n .join(includeName ? ', ' : ',')\n}\n\nexport type FormatAbiParamErrorType = ErrorType\n\nfunction formatAbiParam(\n param: AbiParameter,\n { includeName }: { includeName: boolean },\n): string {\n if (param.type.startsWith('tuple')) {\n return `(${formatAbiParams(\n (param as unknown as { components: AbiParameter[] }).components,\n { includeName },\n )})${param.type.slice('tuple'.length)}`\n }\n return param.type + (includeName && param.name ? ` ${param.name}` : '')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\n\nexport type IsHexErrorType = ErrorType\n\nexport function isHex(\n value: unknown,\n { strict = true }: { strict?: boolean | undefined } = {},\n): value is Hex {\n if (!value) return false\n if (typeof value !== 'string') return false\n return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nimport { type IsHexErrorType, isHex } from './isHex.js'\n\nexport type SizeErrorType = IsHexErrorType | ErrorType\n\n/**\n * @description Retrieves the size of the value (in bytes).\n *\n * @param value The value (hex or byte array) to retrieve the size of.\n * @returns The size of the value (in bytes).\n */\nexport function size(value: Hex | ByteArray) {\n if (isHex(value, { strict: false })) return Math.ceil((value.length - 2) / 2)\n return value.length\n}\n","export const version = '2.47.10'\n","import { version } from './version.js'\n\ntype ErrorConfig = {\n getDocsUrl?: ((args: BaseErrorParameters) => string | undefined) | undefined\n version?: string | undefined\n}\n\nlet errorConfig: ErrorConfig = {\n getDocsUrl: ({\n docsBaseUrl,\n docsPath = '',\n docsSlug,\n }: BaseErrorParameters) =>\n docsPath\n ? `${docsBaseUrl ?? 'https://viem.sh'}${docsPath}${\n docsSlug ? `#${docsSlug}` : ''\n }`\n : undefined,\n version: `viem@${version}`,\n}\n\nexport function setErrorConfig(config: ErrorConfig) {\n errorConfig = config\n}\n\ntype BaseErrorParameters = {\n cause?: BaseError | Error | undefined\n details?: string | undefined\n docsBaseUrl?: string | undefined\n docsPath?: string | undefined\n docsSlug?: string | undefined\n metaMessages?: string[] | undefined\n name?: string | undefined\n}\n\nexport type BaseErrorType = BaseError & { name: 'BaseError' }\nexport class BaseError extends Error {\n details: string\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n shortMessage: string\n version: string\n\n override name = 'BaseError'\n\n constructor(shortMessage: string, args: BaseErrorParameters = {}) {\n const details = (() => {\n if (args.cause instanceof BaseError) return args.cause.details\n if (args.cause?.message) return args.cause.message\n return args.details!\n })()\n const docsPath = (() => {\n if (args.cause instanceof BaseError)\n return args.cause.docsPath || args.docsPath\n return args.docsPath\n })()\n const docsUrl = errorConfig.getDocsUrl?.({ ...args, docsPath })\n\n const message = [\n shortMessage || 'An error occurred.',\n '',\n ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n ...(docsUrl ? [`Docs: ${docsUrl}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n ...(errorConfig.version ? [`Version: ${errorConfig.version}`] : []),\n ].join('\\n')\n\n super(message, args.cause ? { cause: args.cause } : undefined)\n\n this.details = details\n this.docsPath = docsPath\n this.metaMessages = args.metaMessages\n this.name = args.name ?? this.name\n this.shortMessage = shortMessage\n this.version = version\n }\n\n walk(): Error\n walk(fn: (err: unknown) => boolean): Error | null\n walk(fn?: any): any {\n return walk(this, fn)\n }\n}\n\nfunction walk(\n err: unknown,\n fn?: ((err: unknown) => boolean) | undefined,\n): unknown {\n if (fn?.(err)) return err\n if (\n err &&\n typeof err === 'object' &&\n 'cause' in err &&\n err.cause !== undefined\n )\n return walk(err.cause, fn)\n return fn ? null : err\n}\n","import type { Abi, AbiEvent, AbiParameter } from 'abitype'\n\nimport type { Hex } from '../types/misc.js'\nimport { formatAbiItem, formatAbiParams } from '../utils/abi/formatAbiItem.js'\nimport { size } from '../utils/data/size.js'\n\nimport { BaseError } from './base.js'\n\nexport type AbiConstructorNotFoundErrorType = AbiConstructorNotFoundError & {\n name: 'AbiConstructorNotFoundError'\n}\nexport class AbiConstructorNotFoundError extends BaseError {\n constructor({ docsPath }: { docsPath: string }) {\n super(\n [\n 'A constructor was not found on the ABI.',\n 'Make sure you are using the correct ABI and that the constructor exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiConstructorNotFoundError',\n },\n )\n }\n}\n\nexport type AbiConstructorParamsNotFoundErrorType =\n AbiConstructorParamsNotFoundError & {\n name: 'AbiConstructorParamsNotFoundError'\n }\n\nexport class AbiConstructorParamsNotFoundError extends BaseError {\n constructor({ docsPath }: { docsPath: string }) {\n super(\n [\n 'Constructor arguments were provided (`args`), but a constructor parameters (`inputs`) were not found on the ABI.',\n 'Make sure you are using the correct ABI, and that the `inputs` attribute on the constructor exists.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiConstructorParamsNotFoundError',\n },\n )\n }\n}\n\nexport type AbiDecodingDataSizeInvalidErrorType =\n AbiDecodingDataSizeInvalidError & {\n name: 'AbiDecodingDataSizeInvalidError'\n }\nexport class AbiDecodingDataSizeInvalidError extends BaseError {\n constructor({ data, size }: { data: Hex; size: number }) {\n super(\n [\n `Data size of ${size} bytes is invalid.`,\n 'Size must be in increments of 32 bytes (size % 32 === 0).',\n ].join('\\n'),\n {\n metaMessages: [`Data: ${data} (${size} bytes)`],\n name: 'AbiDecodingDataSizeInvalidError',\n },\n )\n }\n}\n\nexport type AbiDecodingDataSizeTooSmallErrorType =\n AbiDecodingDataSizeTooSmallError & {\n name: 'AbiDecodingDataSizeTooSmallError'\n }\nexport class AbiDecodingDataSizeTooSmallError extends BaseError {\n data: Hex\n params: readonly AbiParameter[]\n size: number\n\n constructor({\n data,\n params,\n size,\n }: { data: Hex; params: readonly AbiParameter[]; size: number }) {\n super(\n [`Data size of ${size} bytes is too small for given parameters.`].join(\n '\\n',\n ),\n {\n metaMessages: [\n `Params: (${formatAbiParams(params, { includeName: true })})`,\n `Data: ${data} (${size} bytes)`,\n ],\n name: 'AbiDecodingDataSizeTooSmallError',\n },\n )\n\n this.data = data\n this.params = params\n this.size = size\n }\n}\n\nexport type AbiDecodingZeroDataErrorType = AbiDecodingZeroDataError & {\n name: 'AbiDecodingZeroDataError'\n}\nexport class AbiDecodingZeroDataError extends BaseError {\n constructor({ cause }: { cause?: BaseError | Error | undefined } = {}) {\n super('Cannot decode zero data (\"0x\") with ABI parameters.', {\n name: 'AbiDecodingZeroDataError',\n cause,\n })\n }\n}\n\nexport type AbiEncodingArrayLengthMismatchErrorType =\n AbiEncodingArrayLengthMismatchError & {\n name: 'AbiEncodingArrayLengthMismatchError'\n }\nexport class AbiEncodingArrayLengthMismatchError extends BaseError {\n constructor({\n expectedLength,\n givenLength,\n type,\n }: { expectedLength: number; givenLength: number; type: string }) {\n super(\n [\n `ABI encoding array length mismatch for type ${type}.`,\n `Expected length: ${expectedLength}`,\n `Given length: ${givenLength}`,\n ].join('\\n'),\n { name: 'AbiEncodingArrayLengthMismatchError' },\n )\n }\n}\n\nexport type AbiEncodingBytesSizeMismatchErrorType =\n AbiEncodingBytesSizeMismatchError & {\n name: 'AbiEncodingBytesSizeMismatchError'\n }\nexport class AbiEncodingBytesSizeMismatchError extends BaseError {\n constructor({ expectedSize, value }: { expectedSize: number; value: Hex }) {\n super(\n `Size of bytes \"${value}\" (bytes${size(\n value,\n )}) does not match expected size (bytes${expectedSize}).`,\n { name: 'AbiEncodingBytesSizeMismatchError' },\n )\n }\n}\n\nexport type AbiEncodingLengthMismatchErrorType =\n AbiEncodingLengthMismatchError & {\n name: 'AbiEncodingLengthMismatchError'\n }\nexport class AbiEncodingLengthMismatchError extends BaseError {\n constructor({\n expectedLength,\n givenLength,\n }: { expectedLength: number; givenLength: number }) {\n super(\n [\n 'ABI encoding params/values length mismatch.',\n `Expected length (params): ${expectedLength}`,\n `Given length (values): ${givenLength}`,\n ].join('\\n'),\n { name: 'AbiEncodingLengthMismatchError' },\n )\n }\n}\n\nexport type AbiErrorInputsNotFoundErrorType = AbiErrorInputsNotFoundError & {\n name: 'AbiErrorInputsNotFoundError'\n}\nexport class AbiErrorInputsNotFoundError extends BaseError {\n constructor(errorName: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Arguments (\\`args\\`) were provided to \"${errorName}\", but \"${errorName}\" on the ABI does not contain any parameters (\\`inputs\\`).`,\n 'Cannot encode error result without knowing what the parameter types are.',\n 'Make sure you are using the correct ABI and that the inputs exist on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiErrorInputsNotFoundError',\n },\n )\n }\n}\n\nexport type AbiErrorNotFoundErrorType = AbiErrorNotFoundError & {\n name: 'AbiErrorNotFoundError'\n}\nexport class AbiErrorNotFoundError extends BaseError {\n constructor(\n errorName?: string | undefined,\n { docsPath }: { docsPath?: string | undefined } = {},\n ) {\n super(\n [\n `Error ${errorName ? `\"${errorName}\" ` : ''}not found on ABI.`,\n 'Make sure you are using the correct ABI and that the error exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiErrorNotFoundError',\n },\n )\n }\n}\n\nexport type AbiErrorSignatureNotFoundErrorType =\n AbiErrorSignatureNotFoundError & {\n name: 'AbiErrorSignatureNotFoundError'\n }\nexport class AbiErrorSignatureNotFoundError extends BaseError {\n signature: Hex\n\n constructor(\n signature: Hex,\n {\n docsPath,\n cause,\n }: { docsPath: string; cause?: BaseError | Error | undefined },\n ) {\n super(\n [\n `Encoded error signature \"${signature}\" not found on ABI.`,\n 'Make sure you are using the correct ABI and that the error exists on it.',\n `You can look up the decoded signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiErrorSignatureNotFoundError',\n cause,\n },\n )\n this.signature = signature\n }\n}\n\nexport type AbiEventSignatureEmptyTopicsErrorType =\n AbiEventSignatureEmptyTopicsError & {\n name: 'AbiEventSignatureEmptyTopicsError'\n }\nexport class AbiEventSignatureEmptyTopicsError extends BaseError {\n constructor({ docsPath }: { docsPath: string }) {\n super('Cannot extract event signature from empty topics.', {\n docsPath,\n name: 'AbiEventSignatureEmptyTopicsError',\n })\n }\n}\n\nexport type AbiEventSignatureNotFoundErrorType =\n AbiEventSignatureNotFoundError & {\n name: 'AbiEventSignatureNotFoundError'\n }\nexport class AbiEventSignatureNotFoundError extends BaseError {\n constructor(signature: Hex, { docsPath }: { docsPath: string }) {\n super(\n [\n `Encoded event signature \"${signature}\" not found on ABI.`,\n 'Make sure you are using the correct ABI and that the event exists on it.',\n `You can look up the signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiEventSignatureNotFoundError',\n },\n )\n }\n}\n\nexport type AbiEventNotFoundErrorType = AbiEventNotFoundError & {\n name: 'AbiEventNotFoundError'\n}\nexport class AbiEventNotFoundError extends BaseError {\n constructor(\n eventName?: string | undefined,\n { docsPath }: { docsPath?: string | undefined } = {},\n ) {\n super(\n [\n `Event ${eventName ? `\"${eventName}\" ` : ''}not found on ABI.`,\n 'Make sure you are using the correct ABI and that the event exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiEventNotFoundError',\n },\n )\n }\n}\n\nexport type AbiFunctionNotFoundErrorType = AbiFunctionNotFoundError & {\n name: 'AbiFunctionNotFoundError'\n}\nexport class AbiFunctionNotFoundError extends BaseError {\n constructor(\n functionName?: string | undefined,\n { docsPath }: { docsPath?: string | undefined } = {},\n ) {\n super(\n [\n `Function ${functionName ? `\"${functionName}\" ` : ''}not found on ABI.`,\n 'Make sure you are using the correct ABI and that the function exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiFunctionNotFoundError',\n },\n )\n }\n}\n\nexport type AbiFunctionOutputsNotFoundErrorType =\n AbiFunctionOutputsNotFoundError & {\n name: 'AbiFunctionOutputsNotFoundError'\n }\nexport class AbiFunctionOutputsNotFoundError extends BaseError {\n constructor(functionName: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Function \"${functionName}\" does not contain any \\`outputs\\` on ABI.`,\n 'Cannot decode function result without knowing what the parameter types are.',\n 'Make sure you are using the correct ABI and that the function exists on it.',\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiFunctionOutputsNotFoundError',\n },\n )\n }\n}\n\nexport type AbiFunctionSignatureNotFoundErrorType =\n AbiFunctionSignatureNotFoundError & {\n name: 'AbiFunctionSignatureNotFoundError'\n }\nexport class AbiFunctionSignatureNotFoundError extends BaseError {\n constructor(signature: Hex, { docsPath }: { docsPath: string }) {\n super(\n [\n `Encoded function signature \"${signature}\" not found on ABI.`,\n 'Make sure you are using the correct ABI and that the function exists on it.',\n `You can look up the signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ].join('\\n'),\n {\n docsPath,\n name: 'AbiFunctionSignatureNotFoundError',\n },\n )\n }\n}\n\nexport type AbiItemAmbiguityErrorType = AbiItemAmbiguityError & {\n name: 'AbiItemAmbiguityError'\n}\nexport class AbiItemAmbiguityError extends BaseError {\n constructor(\n x: { abiItem: Abi[number]; type: string },\n y: { abiItem: Abi[number]; type: string },\n ) {\n super('Found ambiguous types in overloaded ABI items.', {\n metaMessages: [\n `\\`${x.type}\\` in \\`${formatAbiItem(x.abiItem)}\\`, and`,\n `\\`${y.type}\\` in \\`${formatAbiItem(y.abiItem)}\\``,\n '',\n 'These types encode differently and cannot be distinguished at runtime.',\n 'Remove one of the ambiguous items in the ABI.',\n ],\n name: 'AbiItemAmbiguityError',\n })\n }\n}\n\nexport type BytesSizeMismatchErrorType = BytesSizeMismatchError & {\n name: 'BytesSizeMismatchError'\n}\nexport class BytesSizeMismatchError extends BaseError {\n constructor({\n expectedSize,\n givenSize,\n }: { expectedSize: number; givenSize: number }) {\n super(`Expected bytes${expectedSize}, got bytes${givenSize}.`, {\n name: 'BytesSizeMismatchError',\n })\n }\n}\n\nexport type DecodeLogDataMismatchErrorType = DecodeLogDataMismatch & {\n name: 'DecodeLogDataMismatch'\n}\nexport class DecodeLogDataMismatch extends BaseError {\n abiItem: AbiEvent\n data: Hex\n params: readonly AbiParameter[]\n size: number\n\n constructor({\n abiItem,\n data,\n params,\n size,\n }: {\n abiItem: AbiEvent\n data: Hex\n params: readonly AbiParameter[]\n size: number\n }) {\n super(\n [\n `Data size of ${size} bytes is too small for non-indexed event parameters.`,\n ].join('\\n'),\n {\n metaMessages: [\n `Params: (${formatAbiParams(params, { includeName: true })})`,\n `Data: ${data} (${size} bytes)`,\n ],\n name: 'DecodeLogDataMismatch',\n },\n )\n\n this.abiItem = abiItem\n this.data = data\n this.params = params\n this.size = size\n }\n}\n\nexport type DecodeLogTopicsMismatchErrorType = DecodeLogTopicsMismatch & {\n name: 'DecodeLogTopicsMismatch'\n}\nexport class DecodeLogTopicsMismatch extends BaseError {\n abiItem: AbiEvent\n\n constructor({\n abiItem,\n param,\n }: {\n abiItem: AbiEvent\n param: AbiParameter & { indexed: boolean }\n }) {\n super(\n [\n `Expected a topic for indexed event parameter${\n param.name ? ` \"${param.name}\"` : ''\n } on event \"${formatAbiItem(abiItem, { includeName: true })}\".`,\n ].join('\\n'),\n { name: 'DecodeLogTopicsMismatch' },\n )\n\n this.abiItem = abiItem\n }\n}\n\nexport type InvalidAbiEncodingTypeErrorType = InvalidAbiEncodingTypeError & {\n name: 'InvalidAbiEncodingTypeError'\n}\nexport class InvalidAbiEncodingTypeError extends BaseError {\n constructor(type: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Type \"${type}\" is not a valid encoding type.`,\n 'Please provide a valid ABI type.',\n ].join('\\n'),\n { docsPath, name: 'InvalidAbiEncodingType' },\n )\n }\n}\n\nexport type InvalidAbiDecodingTypeErrorType = InvalidAbiDecodingTypeError & {\n name: 'InvalidAbiDecodingTypeError'\n}\nexport class InvalidAbiDecodingTypeError extends BaseError {\n constructor(type: string, { docsPath }: { docsPath: string }) {\n super(\n [\n `Type \"${type}\" is not a valid decoding type.`,\n 'Please provide a valid ABI type.',\n ].join('\\n'),\n { docsPath, name: 'InvalidAbiDecodingType' },\n )\n }\n}\n\nexport type InvalidArrayErrorType = InvalidArrayError & {\n name: 'InvalidArrayError'\n}\nexport class InvalidArrayError extends BaseError {\n constructor(value: unknown) {\n super([`Value \"${value}\" is not a valid array.`].join('\\n'), {\n name: 'InvalidArrayError',\n })\n }\n}\n\nexport type InvalidDefinitionTypeErrorType = InvalidDefinitionTypeError & {\n name: 'InvalidDefinitionTypeError'\n}\nexport class InvalidDefinitionTypeError extends BaseError {\n constructor(type: string) {\n super(\n [\n `\"${type}\" is not a valid definition type.`,\n 'Valid types: \"function\", \"event\", \"error\"',\n ].join('\\n'),\n { name: 'InvalidDefinitionTypeError' },\n )\n }\n}\n\nexport type UnsupportedPackedAbiTypeErrorType = UnsupportedPackedAbiType & {\n name: 'UnsupportedPackedAbiType'\n}\nexport class UnsupportedPackedAbiType extends BaseError {\n constructor(type: unknown) {\n super(`Type \"${type}\" is not supported for packed encoding.`, {\n name: 'UnsupportedPackedAbiType',\n })\n }\n}\n","import { BaseError } from './base.js'\n\nexport type FilterTypeNotSupportedErrorType = FilterTypeNotSupportedError & {\n name: 'FilterTypeNotSupportedError'\n}\nexport class FilterTypeNotSupportedError extends BaseError {\n constructor(type: string) {\n super(`Filter type \"${type}\" is not supported.`, {\n name: 'FilterTypeNotSupportedError',\n })\n }\n}\n","import { BaseError } from './base.js'\n\nexport type SliceOffsetOutOfBoundsErrorType = SliceOffsetOutOfBoundsError & {\n name: 'SliceOffsetOutOfBoundsError'\n}\nexport class SliceOffsetOutOfBoundsError extends BaseError {\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \"${offset}\" is out-of-bounds (size: ${size}).`,\n { name: 'SliceOffsetOutOfBoundsError' },\n )\n }\n}\n\nexport type SizeExceedsPaddingSizeErrorType = SizeExceedsPaddingSizeError & {\n name: 'SizeExceedsPaddingSizeError'\n}\nexport class SizeExceedsPaddingSizeError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (${size}) exceeds padding size (${targetSize}).`,\n { name: 'SizeExceedsPaddingSizeError' },\n )\n }\n}\n\nexport type InvalidBytesLengthErrorType = InvalidBytesLengthError & {\n name: 'InvalidBytesLengthError'\n}\nexport class InvalidBytesLengthError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} is expected to be ${targetSize} ${type} long, but is ${size} ${type} long.`,\n { name: 'InvalidBytesLengthError' },\n )\n }\n}\n","import {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n} from '../../errors/data.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\ntype PadOptions = {\n dir?: 'left' | 'right' | undefined\n size?: number | null | undefined\n}\nexport type PadReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type PadErrorType = PadHexErrorType | PadBytesErrorType | ErrorType\n\nexport function pad(\n hexOrBytes: value,\n { dir, size = 32 }: PadOptions = {},\n): PadReturnType {\n if (typeof hexOrBytes === 'string')\n return padHex(hexOrBytes, { dir, size }) as PadReturnType\n return padBytes(hexOrBytes, { dir, size }) as PadReturnType\n}\n\nexport type PadHexErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padHex(hex_: Hex, { dir, size = 32 }: PadOptions = {}) {\n if (size === null) return hex_\n const hex = hex_.replace('0x', '')\n if (hex.length > size * 2)\n throw new SizeExceedsPaddingSizeError({\n size: Math.ceil(hex.length / 2),\n targetSize: size,\n type: 'hex',\n })\n\n return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](\n size * 2,\n '0',\n )}` as Hex\n}\n\nexport type PadBytesErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padBytes(\n bytes: ByteArray,\n { dir, size = 32 }: PadOptions = {},\n) {\n if (size === null) return bytes\n if (bytes.length > size)\n throw new SizeExceedsPaddingSizeError({\n size: bytes.length,\n targetSize: size,\n type: 'bytes',\n })\n const paddedBytes = new Uint8Array(size)\n for (let i = 0; i < size; i++) {\n const padEnd = dir === 'right'\n paddedBytes[padEnd ? i : size - i - 1] =\n bytes[padEnd ? i : bytes.length - i - 1]\n }\n return paddedBytes\n}\n","import type { ByteArray, Hex } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type IntegerOutOfRangeErrorType = IntegerOutOfRangeError & {\n name: 'IntegerOutOfRangeError'\n}\nexport class IntegerOutOfRangeError extends BaseError {\n constructor({\n max,\n min,\n signed,\n size,\n value,\n }: {\n max?: string | undefined\n min: string\n signed?: boolean | undefined\n size?: number | undefined\n value: string\n }) {\n super(\n `Number \"${value}\" is not in safe ${\n size ? `${size * 8}-bit ${signed ? 'signed' : 'unsigned'} ` : ''\n }integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`,\n { name: 'IntegerOutOfRangeError' },\n )\n }\n}\n\nexport type InvalidBytesBooleanErrorType = InvalidBytesBooleanError & {\n name: 'InvalidBytesBooleanError'\n}\nexport class InvalidBytesBooleanError extends BaseError {\n constructor(bytes: ByteArray) {\n super(\n `Bytes value \"${bytes}\" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`,\n {\n name: 'InvalidBytesBooleanError',\n },\n )\n }\n}\n\nexport type InvalidHexBooleanErrorType = InvalidHexBooleanError & {\n name: 'InvalidHexBooleanError'\n}\nexport class InvalidHexBooleanError extends BaseError {\n constructor(hex: Hex) {\n super(\n `Hex value \"${hex}\" is not a valid boolean. The hex value must be \"0x0\" (false) or \"0x1\" (true).`,\n { name: 'InvalidHexBooleanError' },\n )\n }\n}\n\nexport type InvalidHexValueErrorType = InvalidHexValueError & {\n name: 'InvalidHexValueError'\n}\nexport class InvalidHexValueError extends BaseError {\n constructor(value: Hex) {\n super(\n `Hex value \"${value}\" is an odd length (${value.length}). It must be an even length.`,\n { name: 'InvalidHexValueError' },\n )\n }\n}\n\nexport type SizeOverflowErrorType = SizeOverflowError & {\n name: 'SizeOverflowError'\n}\nexport class SizeOverflowError extends BaseError {\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed ${maxSize} bytes. Given size: ${givenSize} bytes.`,\n { name: 'SizeOverflowError' },\n )\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\ntype TrimOptions = {\n dir?: 'left' | 'right' | undefined\n}\nexport type TrimReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type TrimErrorType = ErrorType\n\nexport function trim(\n hexOrBytes: value,\n { dir = 'left' }: TrimOptions = {},\n): TrimReturnType {\n let data: any =\n typeof hexOrBytes === 'string' ? hexOrBytes.replace('0x', '') : hexOrBytes\n\n let sliceLength = 0\n for (let i = 0; i < data.length - 1; i++) {\n if (data[dir === 'left' ? i : data.length - i - 1].toString() === '0')\n sliceLength++\n else break\n }\n data =\n dir === 'left'\n ? data.slice(sliceLength)\n : data.slice(0, data.length - sliceLength)\n\n if (typeof hexOrBytes === 'string') {\n if (data.length === 1 && dir === 'right') data = `${data}0`\n return `0x${\n data.length % 2 === 1 ? `0${data}` : data\n }` as TrimReturnType\n }\n return data as TrimReturnType\n}\n","import {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type SizeErrorType, size as size_ } from '../data/size.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\n\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\n\nexport type AssertSizeErrorType =\n | SizeOverflowErrorType\n | SizeErrorType\n | ErrorType\n\nexport function assertSize(\n hexOrBytes: Hex | ByteArray,\n { size }: { size: number },\n): void {\n if (size_(hexOrBytes) > size)\n throw new SizeOverflowError({\n givenSize: size_(hexOrBytes),\n maxSize: size,\n })\n}\n\nexport type FromHexParameters<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n> =\n | to\n | {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n /** Type to convert to. */\n to: to\n }\n\nexport type FromHexReturnType = to extends 'string'\n ? string\n : to extends 'bigint'\n ? bigint\n : to extends 'number'\n ? number\n : to extends 'bytes'\n ? ByteArray\n : to extends 'boolean'\n ? boolean\n : never\n\nexport type FromHexErrorType =\n | HexToNumberErrorType\n | HexToBigIntErrorType\n | HexToBoolErrorType\n | HexToStringErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Decodes a hex string into a string, number, bigint, boolean, or byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex\n * - Example: https://viem.sh/docs/utilities/fromHex#usage\n *\n * @param hex Hex string to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x1a4', 'number')\n * // 420\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c6421', 'string')\n * // 'Hello world'\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * to: 'string'\n * })\n * // 'Hello world'\n */\nexport function fromHex<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n>(hex: Hex, toOrOpts: FromHexParameters): FromHexReturnType {\n const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts\n const to = opts.to\n\n if (to === 'number') return hexToNumber(hex, opts) as FromHexReturnType\n if (to === 'bigint') return hexToBigInt(hex, opts) as FromHexReturnType\n if (to === 'string') return hexToString(hex, opts) as FromHexReturnType\n if (to === 'boolean') return hexToBool(hex, opts) as FromHexReturnType\n return hexToBytes(hex, opts) as FromHexReturnType\n}\n\nexport type HexToBigIntOpts = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBigIntErrorType = AssertSizeErrorType | ErrorType\n\n/**\n * Decodes a hex value into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobigint\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x1a4', { signed: true })\n * // 420n\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420n\n */\nexport function hexToBigInt(hex: Hex, opts: HexToBigIntOpts = {}): bigint {\n const { signed } = opts\n\n if (opts.size) assertSize(hex, { size: opts.size })\n\n const value = BigInt(hex)\n if (!signed) return value\n\n const size = (hex.length - 2) / 2\n const max = (1n << (BigInt(size) * 8n - 1n)) - 1n\n if (value <= max) return value\n\n return value - BigInt(`0x${'f'.padStart(size * 2, 'f')}`) - 1n\n}\n\nexport type HexToBoolOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBoolErrorType =\n | AssertSizeErrorType\n | InvalidHexBooleanErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobool\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x01')\n * // true\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // true\n */\nexport function hexToBool(hex_: Hex, opts: HexToBoolOpts = {}): boolean {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = trim(hex)\n }\n if (trim(hex) === '0x00') return false\n if (trim(hex) === '0x01') return true\n throw new InvalidHexBooleanError(hex)\n}\n\nexport type HexToNumberOpts = HexToBigIntOpts\n\nexport type HexToNumberErrorType =\n | HexToBigIntErrorType\n | IntegerOutOfRangeErrorType\n | ErrorType\n\n/**\n * Decodes a hex string into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextonumber\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToNumber('0x1a4')\n * // 420\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420\n */\nexport function hexToNumber(hex: Hex, opts: HexToNumberOpts = {}): number {\n const value = hexToBigInt(hex, opts)\n const number = Number(value)\n if (!Number.isSafeInteger(number))\n throw new IntegerOutOfRangeError({\n max: `${Number.MAX_SAFE_INTEGER}`,\n min: `${Number.MIN_SAFE_INTEGER}`,\n signed: opts.signed,\n size: opts.size,\n value: `${value}n`,\n })\n return number\n}\n\nexport type HexToStringOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToStringErrorType =\n | AssertSizeErrorType\n | HexToBytesErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextostring\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c6421')\n * // 'Hello world!'\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * })\n * // 'Hello world'\n */\nexport function hexToString(hex: Hex, opts: HexToStringOpts = {}): string {\n let bytes = hexToBytes(hex)\n if (opts.size) {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes, { dir: 'right' })\n }\n return new TextDecoder().decode(bytes)\n}\n","import {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\n\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) =>\n i.toString(16).padStart(2, '0'),\n)\n\nexport type ToHexParameters = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type ToHexErrorType =\n | BoolToHexErrorType\n | BytesToHexErrorType\n | NumberToHexErrorType\n | StringToHexErrorType\n | ErrorType\n\n/**\n * Encodes a string, number, bigint, or ByteArray into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex\n * - Example: https://viem.sh/docs/utilities/toHex#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world')\n * // '0x48656c6c6f20776f726c6421'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex(420)\n * // '0x1a4'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world', { size: 32 })\n * // '0x48656c6c6f20776f726c64210000000000000000000000000000000000000000'\n */\nexport function toHex(\n value: string | number | bigint | boolean | ByteArray,\n opts: ToHexParameters = {},\n): Hex {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToHex(value, opts)\n if (typeof value === 'string') {\n return stringToHex(value, opts)\n }\n if (typeof value === 'boolean') return boolToHex(value, opts)\n return bytesToHex(value, opts)\n}\n\nexport type BoolToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BoolToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a boolean into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#booltohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true)\n * // '0x1'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(false)\n * // '0x0'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true, { size: 32 })\n * // '0x0000000000000000000000000000000000000000000000000000000000000001'\n */\nexport function boolToHex(value: boolean, opts: BoolToHexOpts = {}): Hex {\n const hex: Hex = `0x${Number(value)}`\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { size: opts.size })\n }\n return hex\n}\n\nexport type BytesToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BytesToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a bytes array into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#bytestohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]), { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function bytesToHex(value: ByteArray, opts: BytesToHexOpts = {}): Hex {\n let string = ''\n for (let i = 0; i < value.length; i++) {\n string += hexes[value[i]]\n }\n const hex = `0x${string}` as const\n\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { dir: 'right', size: opts.size })\n }\n return hex\n}\n\nexport type NumberToHexOpts =\n | {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** The size (in bytes) of the output hex value. */\n size: number\n }\n | {\n signed?: undefined\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\nexport type NumberToHexErrorType =\n | IntegerOutOfRangeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a number or bigint into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#numbertohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420)\n * // '0x1a4'\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420, { size: 32 })\n * // '0x00000000000000000000000000000000000000000000000000000000000001a4'\n */\nexport function numberToHex(\n value_: number | bigint,\n opts: NumberToHexOpts = {},\n): Hex {\n const { signed, size } = opts\n\n const value = BigInt(value_)\n\n let maxValue: bigint | number | undefined\n if (size) {\n if (signed) maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n\n else maxValue = 2n ** (BigInt(size) * 8n) - 1n\n } else if (typeof value_ === 'number') {\n maxValue = BigInt(Number.MAX_SAFE_INTEGER)\n }\n\n const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0\n\n if ((maxValue && value > maxValue) || value < minValue) {\n const suffix = typeof value_ === 'bigint' ? 'n' : ''\n throw new IntegerOutOfRangeError({\n max: maxValue ? `${maxValue}${suffix}` : undefined,\n min: `${minValue}${suffix}`,\n signed,\n size,\n value: `${value_}${suffix}`,\n })\n }\n\n const hex = `0x${(\n signed && value < 0 ? (1n << BigInt(size * 8)) + BigInt(value) : value\n ).toString(16)}` as Hex\n if (size) return pad(hex, { size }) as Hex\n return hex\n}\n\nexport type StringToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type StringToHexErrorType = BytesToHexErrorType | ErrorType\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\n/**\n * Encodes a UTF-8 string into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#stringtohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function stringToHex(value_: string, opts: StringToHexOpts = {}): Hex {\n const value = encoder.encode(value_)\n return bytesToHex(value, opts)\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\nimport {\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n} from './toHex.js'\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\nexport type ToBytesParameters = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type ToBytesErrorType =\n | NumberToBytesErrorType\n | BoolToBytesErrorType\n | HexToBytesErrorType\n | StringToBytesErrorType\n | IsHexErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string, hex value, bigint, number or boolean to a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes\n * - Example: https://viem.sh/docs/utilities/toBytes#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes('Hello world')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function toBytes(\n value: string | bigint | number | boolean | Hex,\n opts: ToBytesParameters = {},\n): ByteArray {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToBytes(value, opts)\n if (typeof value === 'boolean') return boolToBytes(value, opts)\n if (isHex(value)) return hexToBytes(value, opts)\n return stringToBytes(value, opts)\n}\n\nexport type BoolToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type BoolToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a boolean into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#booltobytes\n *\n * @param value Boolean value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true)\n * // Uint8Array([1])\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true, { size: 32 })\n * // Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n */\nexport function boolToBytes(value: boolean, opts: BoolToBytesOpts = {}) {\n const bytes = new Uint8Array(1)\n bytes[0] = Number(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { size: opts.size })\n }\n return bytes\n}\n\n// We use very optimized technique to convert hex string to byte array\nconst charCodeMap = {\n zero: 48,\n nine: 57,\n A: 65,\n F: 70,\n a: 97,\n f: 102,\n} as const\n\nfunction charCodeToBase16(char: number) {\n if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n return char - charCodeMap.zero\n if (char >= charCodeMap.A && char <= charCodeMap.F)\n return char - (charCodeMap.A - 10)\n if (char >= charCodeMap.a && char <= charCodeMap.f)\n return char - (charCodeMap.a - 10)\n return undefined\n}\n\nexport type HexToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type HexToBytesErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a hex string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#hextobytes\n *\n * @param hex Hex string to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function hexToBytes(hex_: Hex, opts: HexToBytesOpts = {}): ByteArray {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = pad(hex, { dir: 'right', size: opts.size })\n }\n\n let hexString = hex.slice(2) as string\n if (hexString.length % 2) hexString = `0${hexString}`\n\n const length = hexString.length / 2\n const bytes = new Uint8Array(length)\n for (let index = 0, j = 0; index < length; index++) {\n const nibbleLeft = charCodeToBase16(hexString.charCodeAt(j++))\n const nibbleRight = charCodeToBase16(hexString.charCodeAt(j++))\n if (nibbleLeft === undefined || nibbleRight === undefined) {\n throw new BaseError(\n `Invalid byte sequence (\"${hexString[j - 2]}${\n hexString[j - 1]\n }\" in \"${hexString}\").`,\n )\n }\n bytes[index] = nibbleLeft * 16 + nibbleRight\n }\n return bytes\n}\n\nexport type NumberToBytesErrorType =\n | NumberToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Encodes a number into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#numbertobytes\n *\n * @param value Number to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function numberToBytes(\n value: bigint | number,\n opts?: NumberToHexOpts | undefined,\n) {\n const hex = numberToHex(value, opts)\n return hexToBytes(hex)\n}\n\nexport type StringToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type StringToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#stringtobytes\n *\n * @param value String to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function stringToBytes(\n value: string,\n opts: StringToBytesOpts = {},\n): ByteArray {\n const bytes = encoder.encode(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { dir: 'right', size: opts.size })\n }\n return bytes\n}\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * Internal webcrypto alias.\n * We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.\n * Falls back to Node.js built-in crypto for Node.js <=v14.\n * See utils.ts for details.\n * @module\n */\n// @ts-ignore\nimport * as nc from 'node:crypto';\nexport const crypto: any =\n nc && typeof nc === 'object' && 'webcrypto' in nc\n ? (nc.webcrypto as any)\n : nc && typeof nc === 'object' && 'randomBytes' in nc\n ? nc\n : undefined;\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\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): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be 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);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + 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/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\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 => {};\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 {\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;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\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/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\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): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\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 = {};\nexport function checkOpts(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\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> = Hash & {\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 function */\nexport type CHash = ReturnType;\n/** Hash function with output */\nexport type CHashO = ReturnType;\n/** XOF with output */\nexport type CHashXO = ReturnType;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher>(\n hashCons: () => Hash\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher, T extends Object>(\n hashCons: (opts?: T) => Hash\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer, T extends Object>(\n hashCons: (opts?: T) => HashXOF\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createHasher, createXOFer, Hash,\n swap32IfBE,\n toBytes, u32,\n type CHash, type CHashXO, type HashXOF, type Input\n} from './utils.ts';\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s: Uint32Array, rounds: number = 24): void {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n\n/** Keccak sponge function. */\nexport class Keccak extends Hash implements HashXOF {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n\n public blockLen: number;\n public suffix: number;\n public outputLen: number;\n protected enableXOF = false;\n protected rounds: number;\n\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n blockLen: number,\n suffix: number,\n outputLen: number,\n enableXOF = false,\n rounds: number = 24\n ) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone(): Keccak {\n return this._cloneInto();\n }\n protected keccak(): void {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish(): void {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array): Uint8Array {\n aoutput(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest(): Uint8Array {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n createHasher(() => new Keccak(blockLen, suffix, outputLen));\n\n/** SHA3-224 hash function. */\nexport const sha3_224: CHash = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256: CHash = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nexport const sha3_384: CHash = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nexport const sha3_512: CHash = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n\n/** keccak-224 hash function. */\nexport const keccak_224: CHash = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256: CHash = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nexport const keccak_384: CHash = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nexport const keccak_512: CHash = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n createXOFer, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n );\n\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n","import { keccak_256 } from '@noble/hashes/sha3'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type Keccak256Hash =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type Keccak256ErrorType =\n | IsHexErrorType\n | ToBytesErrorType\n | ToHexErrorType\n | ErrorType\n\nexport function keccak256(\n value: Hex | ByteArray,\n to_?: to | undefined,\n): Keccak256Hash {\n const to = to_ || 'hex'\n const bytes = keccak_256(\n isHex(value, { strict: false }) ? toBytes(value) : value,\n )\n if (to === 'bytes') return bytes as Keccak256Hash\n return toHex(bytes) as Keccak256Hash\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type Keccak256ErrorType, keccak256 } from './keccak256.js'\n\nconst hash = (value: string) => keccak256(toBytes(value))\n\nexport type HashSignatureErrorType =\n | Keccak256ErrorType\n | ToBytesErrorType\n | ErrorType\n\nexport function hashSignature(sig: string) {\n return hash(sig)\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\ntype NormalizeSignatureParameters = string\ntype NormalizeSignatureReturnType = string\nexport type NormalizeSignatureErrorType = ErrorType\n\nexport function normalizeSignature(\n signature: NormalizeSignatureParameters,\n): NormalizeSignatureReturnType {\n let active = true\n let current = ''\n let level = 0\n let result = ''\n let valid = false\n\n for (let i = 0; i < signature.length; i++) {\n const char = signature[i]\n\n // If the character is a separator, we want to reactivate.\n if (['(', ')', ','].includes(char)) active = true\n\n // If the character is a \"level\" token, we want to increment/decrement.\n if (char === '(') level++\n if (char === ')') level--\n\n // If we aren't active, we don't want to mutate the result.\n if (!active) continue\n\n // If level === 0, we are at the definition level.\n if (level === 0) {\n if (char === ' ' && ['event', 'function', ''].includes(result))\n result = ''\n else {\n result += char\n\n // If we are at the end of the definition, we must be finished.\n if (char === ')') {\n valid = true\n break\n }\n }\n\n continue\n }\n\n // Ignore spaces\n if (char === ' ') {\n // If the previous character is a separator, and the current section isn't empty, we want to deactivate.\n if (signature[i - 1] !== ',' && current !== ',' && current !== ',(') {\n current = ''\n active = false\n }\n continue\n }\n\n result += char\n current += char\n }\n\n if (!valid) throw new BaseError('Unable to normalize signature.')\n\n return result\n}\n","import { type AbiEvent, type AbiFunction, formatAbiItem } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport {\n type NormalizeSignatureErrorType,\n normalizeSignature,\n} from './normalizeSignature.js'\n\nexport type ToSignatureErrorType = NormalizeSignatureErrorType | ErrorType\n\n/**\n * Returns the signature for a given function or event definition.\n *\n * @example\n * const signature = toSignature('function ownerOf(uint256 tokenId)')\n * // 'ownerOf(uint256)'\n *\n * @example\n * const signature_3 = toSignature({\n * name: 'ownerOf',\n * type: 'function',\n * inputs: [{ name: 'tokenId', type: 'uint256' }],\n * outputs: [],\n * stateMutability: 'view',\n * })\n * // 'ownerOf(uint256)'\n */\nexport const toSignature = (def: string | AbiFunction | AbiEvent) => {\n const def_ = (() => {\n if (typeof def === 'string') return def\n return formatAbiItem(def)\n })()\n return normalizeSignature(def_)\n}\n","import type { AbiEvent, AbiFunction } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport { type HashSignatureErrorType, hashSignature } from './hashSignature.js'\nimport { type ToSignatureErrorType, toSignature } from './toSignature.js'\n\nexport type ToSignatureHashErrorType =\n | HashSignatureErrorType\n | ToSignatureErrorType\n | ErrorType\n\n/**\n * Returns the hash (of the function/event signature) for a given event or function definition.\n */\nexport function toSignatureHash(fn: string | AbiFunction | AbiEvent) {\n return hashSignature(toSignature(fn))\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport {\n type ToSignatureHashErrorType,\n toSignatureHash,\n} from './toSignatureHash.js'\n\nexport type ToEventSelectorErrorType = ToSignatureHashErrorType | ErrorType\n\n/**\n * Returns the event selector for a given event definition.\n *\n * @example\n * const selector = toEventSelector('Transfer(address indexed from, address indexed to, uint256 amount)')\n * // 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n */\nexport const toEventSelector = toSignatureHash\n","import { BaseError } from './base.js'\n\nexport type InvalidAddressErrorType = InvalidAddressError & {\n name: 'InvalidAddressError'\n}\nexport class InvalidAddressError extends BaseError {\n constructor({ address }: { address: string }) {\n super(`Address \"${address}\" is invalid.`, {\n metaMessages: [\n '- Address must be a hex value of 20 bytes (40 hex characters).',\n '- Address must match its checksum counterpart.',\n ],\n name: 'InvalidAddressError',\n })\n }\n}\n","/**\n * Map with a LRU (Least recently used) policy.\n *\n * @link https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n */\nexport class LruMap extends Map {\n maxSize: number\n\n constructor(size: number) {\n super()\n this.maxSize = size\n }\n\n override get(key: string) {\n const value = super.get(key)\n\n if (super.has(key)) {\n super.delete(key)\n super.set(key, value as value)\n }\n\n return value\n }\n\n override set(key: string, value: value) {\n if (super.has(key)) super.delete(key)\n super.set(key, value)\n if (this.maxSize && this.size > this.maxSize) {\n const firstKey = super.keys().next().value\n if (firstKey !== undefined) super.delete(firstKey)\n }\n return this\n }\n}\n","import type { Address } from 'abitype'\n\nimport { InvalidAddressError } from '../../errors/address.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n} from '../encoding/toBytes.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport { LruMap } from '../lru.js'\nimport { type IsAddressErrorType, isAddress } from './isAddress.js'\n\nconst checksumAddressCache = /*#__PURE__*/ new LruMap
(8192)\n\nexport type ChecksumAddressErrorType =\n | Keccak256ErrorType\n | StringToBytesErrorType\n | ErrorType\n\nexport function checksumAddress(\n address_: Address,\n /**\n * Warning: EIP-1191 checksum addresses are generally not backwards compatible with the\n * wider Ethereum ecosystem, meaning it will break when validated against an application/tool\n * that relies on EIP-55 checksum encoding (checksum without chainId).\n *\n * It is highly recommended to not use this feature unless you\n * know what you are doing.\n *\n * See more: https://github.com/ethereum/EIPs/issues/1121\n */\n chainId?: number | undefined,\n): Address {\n if (checksumAddressCache.has(`${address_}.${chainId}`))\n return checksumAddressCache.get(`${address_}.${chainId}`)!\n\n const hexAddress = chainId\n ? `${chainId}${address_.toLowerCase()}`\n : address_.substring(2).toLowerCase()\n const hash = keccak256(stringToBytes(hexAddress), 'bytes')\n\n const address = (\n chainId ? hexAddress.substring(`${chainId}0x`.length) : hexAddress\n ).split('')\n for (let i = 0; i < 40; i += 2) {\n if (hash[i >> 1] >> 4 >= 8 && address[i]) {\n address[i] = address[i].toUpperCase()\n }\n if ((hash[i >> 1] & 0x0f) >= 8 && address[i + 1]) {\n address[i + 1] = address[i + 1].toUpperCase()\n }\n }\n\n const result = `0x${address.join('')}` as const\n checksumAddressCache.set(`${address_}.${chainId}`, result)\n return result\n}\n\nexport type GetAddressErrorType =\n | ChecksumAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\nexport function getAddress(\n address: string,\n /**\n * Warning: EIP-1191 checksum addresses are generally not backwards compatible with the\n * wider Ethereum ecosystem, meaning it will break when validated against an application/tool\n * that relies on EIP-55 checksum encoding (checksum without chainId).\n *\n * It is highly recommended to not use this feature unless you\n * know what you are doing.\n *\n * See more: https://github.com/ethereum/EIPs/issues/1121\n */\n chainId?: number,\n): Address {\n if (!isAddress(address, { strict: false }))\n throw new InvalidAddressError({ address })\n return checksumAddress(address, chainId)\n}\n","import type { Address } from 'abitype'\nimport type { ErrorType } from '../../errors/utils.js'\nimport { LruMap } from '../lru.js'\nimport { checksumAddress } from './getAddress.js'\n\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/\n\n/** @internal */\nexport const isAddressCache = /*#__PURE__*/ new LruMap(8192)\n\nexport type IsAddressOptions = {\n /**\n * Enables strict mode. Whether or not to compare the address against its checksum.\n *\n * @default true\n */\n strict?: boolean | undefined\n}\n\nexport type IsAddressErrorType = ErrorType\n\nexport function isAddress(\n address: string,\n options?: IsAddressOptions | undefined,\n): address is Address {\n const { strict = true } = options ?? {}\n const cacheKey = `${address}.${strict}`\n\n if (isAddressCache.has(cacheKey)) return isAddressCache.get(cacheKey)!\n\n const result = (() => {\n if (!addressRegex.test(address)) return false\n if (address.toLowerCase() === address) return true\n if (strict) return checksumAddress(address as Address) === address\n return true\n })()\n isAddressCache.set(cacheKey, result)\n return result\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nexport type ConcatReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type ConcatErrorType =\n | ConcatBytesErrorType\n | ConcatHexErrorType\n | ErrorType\n\nexport function concat(\n values: readonly value[],\n): ConcatReturnType {\n if (typeof values[0] === 'string')\n return concatHex(values as readonly Hex[]) as ConcatReturnType\n return concatBytes(values as readonly ByteArray[]) as ConcatReturnType\n}\n\nexport type ConcatBytesErrorType = ErrorType\n\nexport function concatBytes(values: readonly ByteArray[]): ByteArray {\n let length = 0\n for (const arr of values) {\n length += arr.length\n }\n const result = new Uint8Array(length)\n let offset = 0\n for (const arr of values) {\n result.set(arr, offset)\n offset += arr.length\n }\n return result\n}\n\nexport type ConcatHexErrorType = ErrorType\n\nexport function concatHex(values: readonly Hex[]): Hex {\n return `0x${(values as Hex[]).reduce(\n (acc, x) => acc + x.replace('0x', ''),\n '',\n )}`\n}\n","import {\n SliceOffsetOutOfBoundsError,\n type SliceOffsetOutOfBoundsErrorType,\n} from '../../errors/data.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nimport { type IsHexErrorType, isHex } from './isHex.js'\nimport { type SizeErrorType, size } from './size.js'\n\nexport type SliceReturnType = value extends Hex\n ? Hex\n : ByteArray\n\nexport type SliceErrorType =\n | IsHexErrorType\n | SliceBytesErrorType\n | SliceHexErrorType\n | ErrorType\n\n/**\n * @description Returns a section of the hex or byte array given a start/end bytes offset.\n *\n * @param value The hex or byte array to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function slice(\n value: value,\n start?: number | undefined,\n end?: number | undefined,\n { strict }: { strict?: boolean | undefined } = {},\n): SliceReturnType {\n if (isHex(value, { strict: false }))\n return sliceHex(value as Hex, start, end, {\n strict,\n }) as SliceReturnType\n return sliceBytes(value as ByteArray, start, end, {\n strict,\n }) as SliceReturnType\n}\n\nexport type AssertStartOffsetErrorType =\n | SliceOffsetOutOfBoundsErrorType\n | SizeErrorType\n | ErrorType\n\nfunction assertStartOffset(value: Hex | ByteArray, start?: number | undefined) {\n if (typeof start === 'number' && start > 0 && start > size(value) - 1)\n throw new SliceOffsetOutOfBoundsError({\n offset: start,\n position: 'start',\n size: size(value),\n })\n}\n\nexport type AssertEndOffsetErrorType =\n | SliceOffsetOutOfBoundsErrorType\n | SizeErrorType\n | ErrorType\n\nfunction assertEndOffset(\n value: Hex | ByteArray,\n start?: number | undefined,\n end?: number | undefined,\n) {\n if (\n typeof start === 'number' &&\n typeof end === 'number' &&\n size(value) !== end - start\n ) {\n throw new SliceOffsetOutOfBoundsError({\n offset: end,\n position: 'end',\n size: size(value),\n })\n }\n}\n\nexport type SliceBytesErrorType =\n | AssertStartOffsetErrorType\n | AssertEndOffsetErrorType\n | ErrorType\n\n/**\n * @description Returns a section of the byte array given a start/end bytes offset.\n *\n * @param value The byte array to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function sliceBytes(\n value_: ByteArray,\n start?: number | undefined,\n end?: number | undefined,\n { strict }: { strict?: boolean | undefined } = {},\n): ByteArray {\n assertStartOffset(value_, start)\n const value = value_.slice(start, end)\n if (strict) assertEndOffset(value, start, end)\n return value\n}\n\nexport type SliceHexErrorType =\n | AssertStartOffsetErrorType\n | AssertEndOffsetErrorType\n | ErrorType\n\n/**\n * @description Returns a section of the hex value given a start/end bytes offset.\n *\n * @param value The hex value to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function sliceHex(\n value_: Hex,\n start?: number | undefined,\n end?: number | undefined,\n { strict }: { strict?: boolean | undefined } = {},\n): Hex {\n assertStartOffset(value_, start)\n const value = `0x${value_\n .replace('0x', '')\n .slice((start ?? 0) * 2, (end ?? value_.length) * 2)}` as const\n if (strict) assertEndOffset(value, start, end)\n return value\n}\n","export const arrayRegex = /^(.*)\\[([0-9]*)\\]$/\n\n// `bytes`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/\n\n// `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex =\n /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/\n","import type {\n AbiParameter,\n AbiParameterKind,\n AbiParametersToPrimitiveTypes,\n AbiParameterToPrimitiveType,\n} from 'abitype'\n\nimport {\n AbiEncodingArrayLengthMismatchError,\n type AbiEncodingArrayLengthMismatchErrorType,\n AbiEncodingBytesSizeMismatchError,\n type AbiEncodingBytesSizeMismatchErrorType,\n AbiEncodingLengthMismatchError,\n type AbiEncodingLengthMismatchErrorType,\n InvalidAbiEncodingTypeError,\n type InvalidAbiEncodingTypeErrorType,\n InvalidArrayError,\n type InvalidArrayErrorType,\n} from '../../errors/abi.js'\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport { BaseError } from '../../errors/base.js'\nimport { IntegerOutOfRangeError } from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { type ConcatErrorType, concat } from '../data/concat.js'\nimport { type PadHexErrorType, padHex } from '../data/pad.js'\nimport { type SizeErrorType, size } from '../data/size.js'\nimport { type SliceErrorType, slice } from '../data/slice.js'\nimport {\n type BoolToHexErrorType,\n boolToHex,\n type NumberToHexErrorType,\n numberToHex,\n type StringToHexErrorType,\n stringToHex,\n} from '../encoding/toHex.js'\nimport { integerRegex } from '../regex.js'\n\nexport type EncodeAbiParametersReturnType = Hex\n\nexport type EncodeAbiParametersErrorType =\n | AbiEncodingLengthMismatchErrorType\n | PrepareParamsErrorType\n | EncodeParamsErrorType\n | ErrorType\n\n/**\n * @description Encodes a list of primitive values into an ABI-encoded hex value.\n *\n * - Docs: https://viem.sh/docs/abi/encodeAbiParameters#encodeabiparameters\n *\n * Generates ABI encoded data using the [ABI specification](https://docs.soliditylang.org/en/latest/abi-spec), given a set of ABI parameters (inputs/outputs) and their corresponding values.\n *\n * @param params - a set of ABI Parameters (params), that can be in the shape of the inputs or outputs attribute of an ABI Item.\n * @param values - a set of values (values) that correspond to the given params.\n * @example\n * ```typescript\n * import { encodeAbiParameters } from 'viem'\n *\n * const encodedData = encodeAbiParameters(\n * [\n * { name: 'x', type: 'string' },\n * { name: 'y', type: 'uint' },\n * { name: 'z', type: 'bool' }\n * ],\n * ['wagmi', 420n, true]\n * )\n * ```\n *\n * You can also pass in Human Readable parameters with the parseAbiParameters utility.\n *\n * @example\n * ```typescript\n * import { encodeAbiParameters, parseAbiParameters } from 'viem'\n *\n * const encodedData = encodeAbiParameters(\n * parseAbiParameters('string x, uint y, bool z'),\n * ['wagmi', 420n, true]\n * )\n * ```\n */\nexport function encodeAbiParameters<\n const params extends readonly AbiParameter[] | readonly unknown[],\n>(\n params: params,\n values: params extends readonly AbiParameter[]\n ? AbiParametersToPrimitiveTypes\n : never,\n): EncodeAbiParametersReturnType {\n if (params.length !== values.length)\n throw new AbiEncodingLengthMismatchError({\n expectedLength: params.length as number,\n givenLength: values.length as any,\n })\n // Prepare the parameters to determine dynamic types to encode.\n const preparedParams = prepareParams({\n params: params as readonly AbiParameter[],\n values: values as any,\n })\n const data = encodeParams(preparedParams)\n if (data.length === 0) return '0x'\n return data\n}\n\n/////////////////////////////////////////////////////////////////\n\ntype PreparedParam = { dynamic: boolean; encoded: Hex }\n\ntype TupleAbiParameter = AbiParameter & { components: readonly AbiParameter[] }\ntype Tuple = AbiParameterToPrimitiveType\n\ntype PrepareParamsErrorType = PrepareParamErrorType | ErrorType\n\nfunction prepareParams({\n params,\n values,\n}: {\n params: params\n values: AbiParametersToPrimitiveTypes\n}) {\n const preparedParams: PreparedParam[] = []\n for (let i = 0; i < params.length; i++) {\n preparedParams.push(prepareParam({ param: params[i], value: values[i] }))\n }\n return preparedParams\n}\n\ntype PrepareParamErrorType =\n | EncodeAddressErrorType\n | EncodeArrayErrorType\n | EncodeBytesErrorType\n | EncodeBoolErrorType\n | EncodeNumberErrorType\n | EncodeStringErrorType\n | EncodeTupleErrorType\n | GetArrayComponentsErrorType\n | InvalidAbiEncodingTypeErrorType\n | ErrorType\n\nfunction prepareParam({\n param,\n value,\n}: {\n param: param\n value: AbiParameterToPrimitiveType\n}): PreparedParam {\n const arrayComponents = getArrayComponents(param.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return encodeArray(value, { length, param: { ...param, type } })\n }\n if (param.type === 'tuple') {\n return encodeTuple(value as unknown as Tuple, {\n param: param as TupleAbiParameter,\n })\n }\n if (param.type === 'address') {\n return encodeAddress(value as unknown as Hex)\n }\n if (param.type === 'bool') {\n return encodeBool(value as unknown as boolean)\n }\n if (param.type.startsWith('uint') || param.type.startsWith('int')) {\n const signed = param.type.startsWith('int')\n const [, , size = '256'] = integerRegex.exec(param.type) ?? []\n return encodeNumber(value as unknown as number, {\n signed,\n size: Number(size),\n })\n }\n if (param.type.startsWith('bytes')) {\n return encodeBytes(value as unknown as Hex, { param })\n }\n if (param.type === 'string') {\n return encodeString(value as unknown as string)\n }\n throw new InvalidAbiEncodingTypeError(param.type, {\n docsPath: '/docs/contract/encodeAbiParameters',\n })\n}\n\n/////////////////////////////////////////////////////////////////\n\ntype EncodeParamsErrorType = NumberToHexErrorType | SizeErrorType | ErrorType\n\nfunction encodeParams(preparedParams: PreparedParam[]): Hex {\n // 1. Compute the size of the static part of the parameters.\n let staticSize = 0\n for (let i = 0; i < preparedParams.length; i++) {\n const { dynamic, encoded } = preparedParams[i]\n if (dynamic) staticSize += 32\n else staticSize += size(encoded)\n }\n\n // 2. Split the parameters into static and dynamic parts.\n const staticParams: Hex[] = []\n const dynamicParams: Hex[] = []\n let dynamicSize = 0\n for (let i = 0; i < preparedParams.length; i++) {\n const { dynamic, encoded } = preparedParams[i]\n if (dynamic) {\n staticParams.push(numberToHex(staticSize + dynamicSize, { size: 32 }))\n dynamicParams.push(encoded)\n dynamicSize += size(encoded)\n } else {\n staticParams.push(encoded)\n }\n }\n\n // 3. Concatenate static and dynamic parts.\n return concat([...staticParams, ...dynamicParams])\n}\n\n/////////////////////////////////////////////////////////////////\n\ntype EncodeAddressErrorType =\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\nfunction encodeAddress(value: Hex): PreparedParam {\n if (!isAddress(value)) throw new InvalidAddressError({ address: value })\n return { dynamic: false, encoded: padHex(value.toLowerCase() as Hex) }\n}\n\ntype EncodeArrayErrorType =\n | AbiEncodingArrayLengthMismatchErrorType\n | ConcatErrorType\n | EncodeParamsErrorType\n | InvalidArrayErrorType\n | NumberToHexErrorType\n // TODO: Add back once circular type reference is resolved\n // | PrepareParamErrorType\n | ErrorType\n\nfunction encodeArray(\n value: AbiParameterToPrimitiveType,\n {\n length,\n param,\n }: {\n length: number | null\n param: param\n },\n): PreparedParam {\n const dynamic = length === null\n\n if (!Array.isArray(value)) throw new InvalidArrayError(value)\n if (!dynamic && value.length !== length)\n throw new AbiEncodingArrayLengthMismatchError({\n expectedLength: length!,\n givenLength: value.length,\n type: `${param.type}[${length}]`,\n })\n\n let dynamicChild = false\n const preparedParams: PreparedParam[] = []\n for (let i = 0; i < value.length; i++) {\n const preparedParam = prepareParam({ param, value: value[i] })\n if (preparedParam.dynamic) dynamicChild = true\n preparedParams.push(preparedParam)\n }\n\n if (dynamic || dynamicChild) {\n const data = encodeParams(preparedParams)\n if (dynamic) {\n const length = numberToHex(preparedParams.length, { size: 32 })\n return {\n dynamic: true,\n encoded: preparedParams.length > 0 ? concat([length, data]) : length,\n }\n }\n if (dynamicChild) return { dynamic: true, encoded: data }\n }\n return {\n dynamic: false,\n encoded: concat(preparedParams.map(({ encoded }) => encoded)),\n }\n}\n\ntype EncodeBytesErrorType =\n | AbiEncodingBytesSizeMismatchErrorType\n | ConcatErrorType\n | PadHexErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nfunction encodeBytes(\n value: Hex,\n { param }: { param: param },\n): PreparedParam {\n const [, paramSize] = param.type.split('bytes')\n const bytesSize = size(value)\n if (!paramSize) {\n let value_ = value\n // If the size is not divisible by 32 bytes, pad the end\n // with empty bytes to the ceiling 32 bytes.\n if (bytesSize % 32 !== 0)\n value_ = padHex(value_, {\n dir: 'right',\n size: Math.ceil((value.length - 2) / 2 / 32) * 32,\n })\n return {\n dynamic: true,\n encoded: concat([padHex(numberToHex(bytesSize, { size: 32 })), value_]),\n }\n }\n if (bytesSize !== Number.parseInt(paramSize, 10))\n throw new AbiEncodingBytesSizeMismatchError({\n expectedSize: Number.parseInt(paramSize, 10),\n value,\n })\n return { dynamic: false, encoded: padHex(value, { dir: 'right' }) }\n}\n\ntype EncodeBoolErrorType = PadHexErrorType | BoolToHexErrorType | ErrorType\n\nfunction encodeBool(value: boolean): PreparedParam {\n if (typeof value !== 'boolean')\n throw new BaseError(\n `Invalid boolean value: \"${value}\" (type: ${typeof value}). Expected: \\`true\\` or \\`false\\`.`,\n )\n return { dynamic: false, encoded: padHex(boolToHex(value)) }\n}\n\ntype EncodeNumberErrorType = NumberToHexErrorType | ErrorType\n\nfunction encodeNumber(\n value: number,\n { signed, size = 256 }: { signed: boolean; size?: number | undefined },\n): PreparedParam {\n if (typeof size === 'number') {\n const max = 2n ** (BigInt(size) - (signed ? 1n : 0n)) - 1n\n const min = signed ? -max - 1n : 0n\n if (value > max || value < min)\n throw new IntegerOutOfRangeError({\n max: max.toString(),\n min: min.toString(),\n signed,\n size: size / 8,\n value: value.toString(),\n })\n }\n return {\n dynamic: false,\n encoded: numberToHex(value, {\n size: 32,\n signed,\n }),\n }\n}\n\ntype EncodeStringErrorType =\n | ConcatErrorType\n | NumberToHexErrorType\n | PadHexErrorType\n | SizeErrorType\n | SliceErrorType\n | StringToHexErrorType\n | ErrorType\n\nfunction encodeString(value: string): PreparedParam {\n const hexValue = stringToHex(value)\n const partsLength = Math.ceil(size(hexValue) / 32)\n const parts: Hex[] = []\n for (let i = 0; i < partsLength; i++) {\n parts.push(\n padHex(slice(hexValue, i * 32, (i + 1) * 32), {\n dir: 'right',\n }),\n )\n }\n return {\n dynamic: true,\n encoded: concat([\n padHex(numberToHex(size(hexValue), { size: 32 })),\n ...parts,\n ]),\n }\n}\n\ntype EncodeTupleErrorType =\n | ConcatErrorType\n | EncodeParamsErrorType\n // TODO: Add back once circular type reference is resolved\n // | PrepareParamErrorType\n | ErrorType\n\nfunction encodeTuple<\n const param extends AbiParameter & { components: readonly AbiParameter[] },\n>(\n value: AbiParameterToPrimitiveType,\n { param }: { param: param },\n): PreparedParam {\n let dynamic = false\n const preparedParams: PreparedParam[] = []\n for (let i = 0; i < param.components.length; i++) {\n const param_ = param.components[i]\n const index = Array.isArray(value) ? i : param_.name\n const preparedParam = prepareParam({\n param: param_,\n value: (value as any)[index!] as readonly unknown[],\n })\n preparedParams.push(preparedParam)\n if (preparedParam.dynamic) dynamic = true\n }\n return {\n dynamic,\n encoded: dynamic\n ? encodeParams(preparedParams)\n : concat(preparedParams.map(({ encoded }) => encoded)),\n }\n}\n\ntype GetArrayComponentsErrorType = ErrorType\n\nexport function getArrayComponents(\n type: string,\n): [length: number | null, innerType: string] | undefined {\n const matches = type.match(/^(.*)\\[(\\d+)?\\]$/)\n return matches\n ? // Return `null` if the array is dynamic.\n [matches[2] ? Number(matches[2]) : null, matches[1]]\n : undefined\n}\n","import type { AbiFunction } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport { type SliceErrorType, slice } from '../data/slice.js'\nimport {\n type ToSignatureHashErrorType,\n toSignatureHash,\n} from './toSignatureHash.js'\n\nexport type ToFunctionSelectorErrorType =\n | ToSignatureHashErrorType\n | SliceErrorType\n | ErrorType\n\n/**\n * Returns the function selector for a given function definition.\n *\n * @example\n * const selector = toFunctionSelector('function ownerOf(uint256 tokenId)')\n * // 0x6352211e\n */\nexport const toFunctionSelector = (fn: string | AbiFunction) =>\n slice(toSignatureHash(fn), 0, 4)\n","import type { Abi, AbiParameter, Address } from 'abitype'\n\nimport {\n AbiItemAmbiguityError,\n type AbiItemAmbiguityErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n AbiItem,\n AbiItemArgs,\n AbiItemName,\n ExtractAbiItemForArgs,\n Widen,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { UnionEvaluate } from '../../types/utils.js'\nimport { type IsHexErrorType, isHex } from '../../utils/data/isHex.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { toEventSelector } from '../hash/toEventSelector.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\n\nexport type GetAbiItemParameters<\n abi extends Abi | readonly unknown[] = Abi,\n name extends AbiItemName = AbiItemName,\n args extends AbiItemArgs | undefined = AbiItemArgs,\n ///\n allArgs = AbiItemArgs,\n allNames = AbiItemName,\n> = {\n abi: abi\n name:\n | allNames // show all options\n | (name extends allNames ? name : never) // infer value\n | Hex // function selector\n} & UnionEvaluate<\n readonly [] extends allArgs\n ? {\n args?:\n | allArgs // show all options\n // infer value, widen inferred value of `args` conditionally to match `allArgs`\n | (abi extends Abi\n ? args extends allArgs\n ? Widen\n : never\n : never)\n | undefined\n }\n : {\n args?:\n | allArgs // show all options\n | (Widen & (args extends allArgs ? unknown : never)) // infer value, widen inferred value of `args` match `allArgs` (e.g. avoid union `args: readonly [123n] | readonly [bigint]`)\n | undefined\n }\n>\n\nexport type GetAbiItemErrorType =\n | IsArgOfTypeErrorType\n | IsHexErrorType\n | ToFunctionSelectorErrorType\n | AbiItemAmbiguityErrorType\n | ErrorType\n\nexport type GetAbiItemReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n name extends AbiItemName = AbiItemName,\n args extends AbiItemArgs | undefined = AbiItemArgs,\n> = abi extends Abi\n ? Abi extends abi\n ? AbiItem | undefined\n : ExtractAbiItemForArgs<\n abi,\n name,\n args extends AbiItemArgs ? args : AbiItemArgs\n >\n : AbiItem | undefined\n\nexport function getAbiItem<\n const abi extends Abi | readonly unknown[],\n name extends AbiItemName,\n const args extends AbiItemArgs | undefined = undefined,\n>(\n parameters: GetAbiItemParameters,\n): GetAbiItemReturnType {\n const { abi, args = [], name } = parameters as unknown as GetAbiItemParameters\n\n const isSelector = isHex(name, { strict: false })\n const abiItems = (abi as Abi).filter((abiItem) => {\n if (isSelector) {\n if (abiItem.type === 'function')\n return toFunctionSelector(abiItem) === name\n if (abiItem.type === 'event') return toEventSelector(abiItem) === name\n return false\n }\n return 'name' in abiItem && abiItem.name === name\n })\n\n if (abiItems.length === 0)\n return undefined as GetAbiItemReturnType\n if (abiItems.length === 1)\n return abiItems[0] as GetAbiItemReturnType\n\n let matchedAbiItem: AbiItem | undefined\n for (const abiItem of abiItems) {\n if (!('inputs' in abiItem)) continue\n if (!args || args.length === 0) {\n if (!abiItem.inputs || abiItem.inputs.length === 0)\n return abiItem as GetAbiItemReturnType\n continue\n }\n if (!abiItem.inputs) continue\n if (abiItem.inputs.length === 0) continue\n if (abiItem.inputs.length !== args.length) continue\n const matched = args.every((arg, index) => {\n const abiParameter = 'inputs' in abiItem && abiItem.inputs![index]\n if (!abiParameter) return false\n return isArgOfType(arg, abiParameter)\n })\n if (matched) {\n // Check for ambiguity against already matched parameters (e.g. `address` vs `bytes20`).\n if (\n matchedAbiItem &&\n 'inputs' in matchedAbiItem &&\n matchedAbiItem.inputs\n ) {\n const ambiguousTypes = getAmbiguousTypes(\n abiItem.inputs,\n matchedAbiItem.inputs,\n args as readonly unknown[],\n )\n if (ambiguousTypes)\n throw new AbiItemAmbiguityError(\n {\n abiItem,\n type: ambiguousTypes[0],\n },\n {\n abiItem: matchedAbiItem,\n type: ambiguousTypes[1],\n },\n )\n }\n\n matchedAbiItem = abiItem\n }\n }\n\n if (matchedAbiItem)\n return matchedAbiItem as GetAbiItemReturnType\n return abiItems[0] as GetAbiItemReturnType\n}\n\ntype IsArgOfTypeErrorType = IsAddressErrorType | ErrorType\n\n/** @internal */\nexport function isArgOfType(arg: unknown, abiParameter: AbiParameter): boolean {\n const argType = typeof arg\n const abiParameterType = abiParameter.type\n switch (abiParameterType) {\n case 'address':\n return isAddress(arg as Address, { strict: false })\n case 'bool':\n return argType === 'boolean'\n case 'function':\n return argType === 'string'\n case 'string':\n return argType === 'string'\n default: {\n if (abiParameterType === 'tuple' && 'components' in abiParameter)\n return Object.values(abiParameter.components).every(\n (component, index) => {\n return (\n argType === 'object' &&\n isArgOfType(\n Object.values(arg as unknown[] | Record)[\n index\n ],\n component as AbiParameter,\n )\n )\n },\n )\n\n // `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n // https://regexr.com/6v8hp\n if (\n /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(\n abiParameterType,\n )\n )\n return argType === 'number' || argType === 'bigint'\n\n // `bytes`: binary type of `M` bytes, `0 < M <= 32`\n // https://regexr.com/6va55\n if (/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(abiParameterType))\n return argType === 'string' || arg instanceof Uint8Array\n\n // fixed-length (`[M]`) and dynamic (`[]`) arrays\n // https://regexr.com/6va6i\n if (/[a-z]+[1-9]{0,3}(\\[[0-9]{0,}\\])+$/.test(abiParameterType)) {\n return (\n Array.isArray(arg) &&\n arg.every((x: unknown) =>\n isArgOfType(x, {\n ...abiParameter,\n // Pop off `[]` or `[M]` from end of type\n type: abiParameterType.replace(/(\\[[0-9]{0,}\\])$/, ''),\n } as AbiParameter),\n )\n )\n }\n\n return false\n }\n }\n}\n\n/** @internal */\nexport function getAmbiguousTypes(\n sourceParameters: readonly AbiParameter[],\n targetParameters: readonly AbiParameter[],\n args: AbiItemArgs,\n): AbiParameter['type'][] | undefined {\n for (const parameterIndex in sourceParameters) {\n const sourceParameter = sourceParameters[parameterIndex]\n const targetParameter = targetParameters[parameterIndex]\n\n if (\n sourceParameter.type === 'tuple' &&\n targetParameter.type === 'tuple' &&\n 'components' in sourceParameter &&\n 'components' in targetParameter\n )\n return getAmbiguousTypes(\n sourceParameter.components,\n targetParameter.components,\n (args as any)[parameterIndex],\n )\n\n const types = [sourceParameter.type, targetParameter.type]\n\n const ambiguous = (() => {\n if (types.includes('address') && types.includes('bytes20')) return true\n if (types.includes('address') && types.includes('string'))\n return isAddress(args[parameterIndex] as Address, { strict: false })\n if (types.includes('address') && types.includes('bytes'))\n return isAddress(args[parameterIndex] as Address, { strict: false })\n return false\n })()\n\n if (ambiguous) return types\n }\n\n return\n}\n","import type {\n Abi,\n AbiParameter,\n AbiParameterToPrimitiveType,\n ExtractAbiEvents,\n} from 'abitype'\n\nimport {\n AbiEventNotFoundError,\n type AbiEventNotFoundErrorType,\n} from '../../errors/abi.js'\nimport {\n FilterTypeNotSupportedError,\n type FilterTypeNotSupportedErrorType,\n} from '../../errors/log.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n EventDefinition,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type ToEventSelectorErrorType,\n toEventSelector,\n} from '../hash/toEventSelector.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeEventTopics'\n\nexport type EncodeEventTopicsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n ///\n hasEvents = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiEvents] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName\n >,\n allErrorNames = ContractEventName,\n> = {\n abi: abi\n args?: allArgs | undefined\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { eventName?: eventName | allErrorNames | undefined }\n : { eventName: eventName | allErrorNames }\n : { eventName?: eventName | allErrorNames | undefined }\n> &\n (hasEvents extends true ? unknown : never)\n\nexport type EncodeEventTopicsReturnType = [Hex, ...(Hex | Hex[] | null)[]]\n\nexport type EncodeEventTopicsErrorType =\n | AbiEventNotFoundErrorType\n | EncodeArgErrorType\n | FormatAbiItemErrorType\n | GetAbiItemErrorType\n | ToEventSelectorErrorType\n | ErrorType\n\nexport function encodeEventTopics<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n>(\n parameters: EncodeEventTopicsParameters,\n): EncodeEventTopicsReturnType {\n const { abi, eventName, args } = parameters as EncodeEventTopicsParameters\n\n let abiItem = abi[0]\n if (eventName) {\n const item = getAbiItem({ abi, name: eventName })\n if (!item) throw new AbiEventNotFoundError(eventName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'event')\n throw new AbiEventNotFoundError(undefined, { docsPath })\n\n const definition = formatAbiItem(abiItem)\n const signature = toEventSelector(definition as EventDefinition)\n\n let topics: (Hex | Hex[] | null)[] = []\n if (args && 'inputs' in abiItem) {\n const indexedInputs = abiItem.inputs?.filter(\n (param) => 'indexed' in param && param.indexed,\n )\n const args_ = Array.isArray(args)\n ? args\n : Object.values(args).length > 0\n ? (indexedInputs?.map((x: any) => (args as any)[x.name]) ?? [])\n : []\n\n if (args_.length > 0) {\n topics =\n indexedInputs?.map((param, i) => {\n if (Array.isArray(args_[i]))\n return args_[i].map((_: any, j: number) =>\n encodeArg({ param, value: args_[i][j] }),\n )\n return typeof args_[i] !== 'undefined' && args_[i] !== null\n ? encodeArg({ param, value: args_[i] })\n : null\n }) ?? []\n }\n }\n return [signature, ...topics]\n}\n\nexport type EncodeArgErrorType =\n | Keccak256ErrorType\n | ToBytesErrorType\n | EncodeAbiParametersErrorType\n | FilterTypeNotSupportedErrorType\n | ErrorType\n\nfunction encodeArg({\n param,\n value,\n}: {\n param: AbiParameter\n value: AbiParameterToPrimitiveType\n}) {\n if (param.type === 'string' || param.type === 'bytes')\n return keccak256(toBytes(value as string))\n if (param.type === 'tuple' || param.type.match(/^(.*)\\[(\\d+)?\\]$/))\n throw new FilterTypeNotSupportedError(param.type)\n return encodeAbiParameters([param], [value])\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { OnResponseFn } from '../../clients/transports/fallback.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { EIP1193RequestFn, PublicRpcSchema } from '../../types/eip1193.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { Filter } from '../../types/utils.js'\n\ntype CreateFilterRequestScopeParameters = {\n method:\n | 'eth_newFilter'\n | 'eth_newPendingTransactionFilter'\n | 'eth_newBlockFilter'\n}\n\ntype FilterRpcSchema = Filter<\n PublicRpcSchema,\n { Method: 'eth_getFilterLogs' | 'eth_getFilterChanges' }\n>\n\ntype CreateFilterRequestScopeReturnType = (\n id: Hex,\n) => EIP1193RequestFn\n\n/**\n * Scopes `request` to the filter ID. If the client is a fallback, it will\n * listen for responses and scope the child transport `request` function\n * to the successful filter ID.\n */\nexport function createFilterRequestScope(\n client: Client,\n { method }: CreateFilterRequestScopeParameters,\n): CreateFilterRequestScopeReturnType {\n const requestMap: Record = {}\n\n if (client.transport.type === 'fallback')\n client.transport.onResponse?.(\n ({\n method: method_,\n response: id,\n status,\n transport,\n }: Parameters[0]) => {\n if (status === 'success' && method === method_)\n requestMap[id as Hex] = transport.request\n },\n )\n\n return ((id) =>\n requestMap[id] || client.request) as CreateFilterRequestScopeReturnType\n}\n","import type { Abi, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Hex } from '../../types/misc.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreateContractEventFilterParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = undefined,\n args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n address?: Address | Address[] | undefined\n abi: abi\n eventName?: eventName | ContractEventName | undefined\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments in the event ABI item.\n * @default false\n */\n strict?: strict | boolean | undefined\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n} & (undefined extends eventName\n ? {\n args?: undefined\n }\n : MaybeExtractEventArgsFromAbi extends infer eventFilterArgs\n ? {\n args?:\n | eventFilterArgs\n | (args extends eventFilterArgs ? args : never)\n | undefined\n }\n : {\n args?: undefined\n })\n\nexport type CreateContractEventFilterReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = undefined,\n args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = Filter<'event', abi, eventName, args, strict, fromBlock, toBlock>\n\nexport type CreateContractEventFilterErrorType =\n | EncodeEventTopicsErrorType\n | RequestErrorType\n | NumberToHexErrorType\n | ErrorType\n\n/**\n * Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs).\n *\n * - Docs: https://viem.sh/docs/contract/createContractEventFilter\n *\n * @param client - Client to use\n * @param parameters - {@link CreateContractEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateContractEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createContractEventFilter } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createContractEventFilter(client, {\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * })\n */\nexport async function createContractEventFilter<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined,\n args extends MaybeExtractEventArgsFromAbi | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client,\n parameters: CreateContractEventFilterParameters<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n> {\n const { address, abi, args, eventName, fromBlock, strict, toBlock } =\n parameters as CreateContractEventFilterParameters\n\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newFilter',\n })\n\n const topics = eventName\n ? encodeEventTopics({\n abi,\n args,\n eventName,\n } as unknown as EncodeEventTopicsParameters)\n : undefined\n const id: Hex = await client.request({\n method: 'eth_newFilter',\n params: [\n {\n address,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n topics,\n },\n ],\n })\n\n return {\n abi,\n args,\n eventName,\n id,\n request: getRequest(id),\n strict: Boolean(strict),\n type: 'event',\n } as unknown as CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../types.js'\n\nexport type ParseAccountErrorType = ErrorType\n\nexport function parseAccount(\n account: accountOrAddress,\n): accountOrAddress extends Address ? Account : accountOrAddress {\n if (typeof account === 'string')\n return { address: account, type: 'json-rpc' } as any\n return account as any\n}\n","import type {\n Abi,\n AbiStateMutability,\n ExtractAbiFunction,\n ExtractAbiFunctions,\n} from 'abitype'\n\nimport {\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport type { ConcatHexErrorType } from '../data/concat.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeFunctionData'\n\nexport type PrepareEncodeFunctionDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | Hex | undefined }\n : { functionName: functionName | allFunctionNames | Hex }\n : { functionName?: functionName | allFunctionNames | Hex | undefined }\n> &\n UnionEvaluate<{ args?: allArgs | undefined }> &\n (hasFunctions extends true ? unknown : never)\n\nexport type PrepareEncodeFunctionDataReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n> = {\n abi: abi extends Abi\n ? functionName extends ContractFunctionName\n ? [ExtractAbiFunction]\n : abi\n : Abi\n functionName: Hex\n}\n\nexport type PrepareEncodeFunctionDataErrorType =\n | AbiFunctionNotFoundErrorType\n | ConcatHexErrorType\n | FormatAbiItemErrorType\n | GetAbiItemErrorType\n | ToFunctionSelectorErrorType\n | ErrorType\n\nexport function prepareEncodeFunctionData<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n>(\n parameters: PrepareEncodeFunctionDataParameters,\n): PrepareEncodeFunctionDataReturnType {\n const { abi, args, functionName } =\n parameters as PrepareEncodeFunctionDataParameters\n\n let abiItem = abi[0]\n if (functionName) {\n const item = getAbiItem({\n abi,\n args,\n name: functionName,\n })\n if (!item) throw new AbiFunctionNotFoundError(functionName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'function')\n throw new AbiFunctionNotFoundError(undefined, { docsPath })\n\n return {\n abi: [abiItem],\n functionName: toFunctionSelector(formatAbiItem(abiItem)),\n } as unknown as PrepareEncodeFunctionDataReturnType\n}\n","import type { Abi, AbiStateMutability, ExtractAbiFunctions } from 'abitype'\n\nimport type { AbiFunctionNotFoundErrorType } from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport type { ToFunctionSelectorErrorType } from '../hash/toFunctionSelector.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport type { FormatAbiItemErrorType } from './formatAbiItem.js'\nimport type { GetAbiItemErrorType } from './getAbiItem.js'\nimport { prepareEncodeFunctionData } from './prepareEncodeFunctionData.js'\n\nexport type EncodeFunctionDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | Hex\n | undefined = ContractFunctionName,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | Hex | undefined }\n : { functionName: functionName | allFunctionNames | Hex }\n : { functionName?: functionName | allFunctionNames | Hex | undefined }\n> &\n UnionEvaluate<\n readonly [] extends allArgs\n ? { args?: allArgs | undefined }\n : { args: allArgs }\n > &\n (hasFunctions extends true ? unknown : never)\n\nexport type EncodeFunctionDataReturnType = Hex\n\nexport type EncodeFunctionDataErrorType =\n | AbiFunctionNotFoundErrorType\n | ConcatHexErrorType\n | EncodeAbiParametersErrorType\n | FormatAbiItemErrorType\n | GetAbiItemErrorType\n | ToFunctionSelectorErrorType\n | ErrorType\n\nexport function encodeFunctionData<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n>(\n parameters: EncodeFunctionDataParameters,\n): EncodeFunctionDataReturnType {\n const { args } = parameters as EncodeFunctionDataParameters\n\n const { abi, functionName } = (() => {\n if (\n parameters.abi.length === 1 &&\n parameters.functionName?.startsWith('0x')\n )\n return parameters as { abi: Abi; functionName: Hex }\n return prepareEncodeFunctionData(parameters)\n })()\n\n const abiItem = abi[0]\n const signature = functionName\n\n const data =\n 'inputs' in abiItem && abiItem.inputs\n ? encodeAbiParameters(abiItem.inputs, args ?? [])\n : undefined\n return concatHex([signature, data ?? '0x'])\n}\n","import type { AbiError } from 'abitype'\n\n// https://docs.soliditylang.org/en/v0.8.16/control-structures.html#panic-via-assert-and-error-via-require\nexport const panicReasons = {\n 1: 'An `assert` condition failed.',\n 17: 'Arithmetic operation resulted in underflow or overflow.',\n 18: 'Division or modulo by zero (e.g. `5 / 0` or `23 % 0`).',\n 33: 'Attempted to convert to an invalid type.',\n 34: 'Attempted to access a storage byte array that is incorrectly encoded.',\n 49: 'Performed `.pop()` on an empty array',\n 50: 'Array index is out of bounds.',\n 65: 'Allocated too much memory or created an array which is too large.',\n 81: 'Attempted to call a zero-initialized variable of internal function type.',\n} as const\n\nexport const solidityError: AbiError = {\n inputs: [\n {\n name: 'message',\n type: 'string',\n },\n ],\n name: 'Error',\n type: 'error',\n}\nexport const solidityPanic: AbiError = {\n inputs: [\n {\n name: 'reason',\n type: 'uint256',\n },\n ],\n name: 'Panic',\n type: 'error',\n}\n","import { BaseError } from './base.js'\n\nexport type NegativeOffsetErrorType = NegativeOffsetError & {\n name: 'NegativeOffsetError'\n}\nexport class NegativeOffsetError extends BaseError {\n constructor({ offset }: { offset: number }) {\n super(`Offset \\`${offset}\\` cannot be negative.`, {\n name: 'NegativeOffsetError',\n })\n }\n}\n\nexport type PositionOutOfBoundsErrorType = PositionOutOfBoundsError & {\n name: 'PositionOutOfBoundsError'\n}\nexport class PositionOutOfBoundsError extends BaseError {\n constructor({ length, position }: { length: number; position: number }) {\n super(\n `Position \\`${position}\\` is out of bounds (\\`0 < position < ${length}\\`).`,\n { name: 'PositionOutOfBoundsError' },\n )\n }\n}\n\nexport type RecursiveReadLimitExceededErrorType =\n RecursiveReadLimitExceededError & {\n name: 'RecursiveReadLimitExceededError'\n }\nexport class RecursiveReadLimitExceededError extends BaseError {\n constructor({ count, limit }: { count: number; limit: number }) {\n super(\n `Recursive read limit of \\`${limit}\\` exceeded (recursive read count: \\`${count}\\`).`,\n { name: 'RecursiveReadLimitExceededError' },\n )\n }\n}\n","import {\n NegativeOffsetError,\n type NegativeOffsetErrorType,\n PositionOutOfBoundsError,\n type PositionOutOfBoundsErrorType,\n RecursiveReadLimitExceededError,\n type RecursiveReadLimitExceededErrorType,\n} from '../errors/cursor.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { ByteArray } from '../types/misc.js'\n\nexport type Cursor = {\n bytes: ByteArray\n dataView: DataView\n position: number\n positionReadCount: Map\n recursiveReadCount: number\n recursiveReadLimit: number\n remaining: number\n assertReadLimit(position?: number): void\n assertPosition(position: number): void\n decrementPosition(offset: number): void\n getReadCount(position?: number): number\n incrementPosition(offset: number): void\n inspectByte(position?: number): ByteArray[number]\n inspectBytes(length: number, position?: number): ByteArray\n inspectUint8(position?: number): number\n inspectUint16(position?: number): number\n inspectUint24(position?: number): number\n inspectUint32(position?: number): number\n pushByte(byte: ByteArray[number]): void\n pushBytes(bytes: ByteArray): void\n pushUint8(value: number): void\n pushUint16(value: number): void\n pushUint24(value: number): void\n pushUint32(value: number): void\n readByte(): ByteArray[number]\n readBytes(length: number, size?: number): ByteArray\n readUint8(): number\n readUint16(): number\n readUint24(): number\n readUint32(): number\n setPosition(position: number): () => void\n _touch(): void\n}\n\ntype CursorErrorType =\n | CursorAssertPositionErrorType\n | CursorDecrementPositionErrorType\n | CursorIncrementPositionErrorType\n | ErrorType\n\ntype CursorAssertPositionErrorType = PositionOutOfBoundsErrorType | ErrorType\n\ntype CursorDecrementPositionErrorType = NegativeOffsetErrorType | ErrorType\n\ntype CursorIncrementPositionErrorType = NegativeOffsetErrorType | ErrorType\n\ntype StaticCursorErrorType =\n | NegativeOffsetErrorType\n | RecursiveReadLimitExceededErrorType\n\nconst staticCursor: Cursor = {\n bytes: new Uint8Array(),\n dataView: new DataView(new ArrayBuffer(0)),\n position: 0,\n positionReadCount: new Map(),\n recursiveReadCount: 0,\n recursiveReadLimit: Number.POSITIVE_INFINITY,\n assertReadLimit() {\n if (this.recursiveReadCount >= this.recursiveReadLimit)\n throw new RecursiveReadLimitExceededError({\n count: this.recursiveReadCount + 1,\n limit: this.recursiveReadLimit,\n })\n },\n assertPosition(position) {\n if (position < 0 || position > this.bytes.length - 1)\n throw new PositionOutOfBoundsError({\n length: this.bytes.length,\n position,\n })\n },\n decrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position - offset\n this.assertPosition(position)\n this.position = position\n },\n getReadCount(position) {\n return this.positionReadCount.get(position || this.position) || 0\n },\n incrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position + offset\n this.assertPosition(position)\n this.position = position\n },\n inspectByte(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]\n },\n inspectBytes(length, position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + length - 1)\n return this.bytes.subarray(position, position + length)\n },\n inspectUint8(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]\n },\n inspectUint16(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 1)\n return this.dataView.getUint16(position)\n },\n inspectUint24(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 2)\n return (\n (this.dataView.getUint16(position) << 8) +\n this.dataView.getUint8(position + 2)\n )\n },\n inspectUint32(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 3)\n return this.dataView.getUint32(position)\n },\n pushByte(byte: ByteArray[number]) {\n this.assertPosition(this.position)\n this.bytes[this.position] = byte\n this.position++\n },\n pushBytes(bytes: ByteArray) {\n this.assertPosition(this.position + bytes.length - 1)\n this.bytes.set(bytes, this.position)\n this.position += bytes.length\n },\n pushUint8(value: number) {\n this.assertPosition(this.position)\n this.bytes[this.position] = value\n this.position++\n },\n pushUint16(value: number) {\n this.assertPosition(this.position + 1)\n this.dataView.setUint16(this.position, value)\n this.position += 2\n },\n pushUint24(value: number) {\n this.assertPosition(this.position + 2)\n this.dataView.setUint16(this.position, value >> 8)\n this.dataView.setUint8(this.position + 2, value & ~4294967040)\n this.position += 3\n },\n pushUint32(value: number) {\n this.assertPosition(this.position + 3)\n this.dataView.setUint32(this.position, value)\n this.position += 4\n },\n readByte() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectByte()\n this.position++\n return value\n },\n readBytes(length, size) {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectBytes(length)\n this.position += size ?? length\n return value\n },\n readUint8() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint8()\n this.position += 1\n return value\n },\n readUint16() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint16()\n this.position += 2\n return value\n },\n readUint24() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint24()\n this.position += 3\n return value\n },\n readUint32() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint32()\n this.position += 4\n return value\n },\n get remaining() {\n return this.bytes.length - this.position\n },\n setPosition(position) {\n const oldPosition = this.position\n this.assertPosition(position)\n this.position = position\n return () => (this.position = oldPosition)\n },\n _touch() {\n if (this.recursiveReadLimit === Number.POSITIVE_INFINITY) return\n const count = this.getReadCount()\n this.positionReadCount.set(this.position, count + 1)\n if (count > 0) this.recursiveReadCount++\n },\n}\n\ntype CursorConfig = { recursiveReadLimit?: number | undefined }\n\nexport type CreateCursorErrorType =\n | CursorErrorType\n | StaticCursorErrorType\n | ErrorType\n\nexport function createCursor(\n bytes: ByteArray,\n { recursiveReadLimit = 8_192 }: CursorConfig = {},\n): Cursor {\n const cursor: Cursor = Object.create(staticCursor)\n cursor.bytes = bytes\n cursor.dataView = new DataView(\n bytes.buffer ?? bytes,\n bytes.byteOffset,\n bytes.byteLength,\n )\n cursor.positionReadCount = new Map()\n cursor.recursiveReadLimit = recursiveReadLimit\n return cursor\n}\n","import { InvalidBytesBooleanError } from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\n\nimport {\n type AssertSizeErrorType,\n assertSize,\n type HexToBigIntErrorType,\n type HexToNumberErrorType,\n hexToBigInt,\n hexToNumber,\n} from './fromHex.js'\nimport { type BytesToHexErrorType, bytesToHex } from './toHex.js'\n\nexport type FromBytesParameters<\n to extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean',\n> =\n | to\n | {\n /** Size of the bytes. */\n size?: number | undefined\n /** Type to convert to. */\n to: to\n }\n\nexport type FromBytesReturnType = to extends 'string'\n ? string\n : to extends 'hex'\n ? Hex\n : to extends 'bigint'\n ? bigint\n : to extends 'number'\n ? number\n : to extends 'boolean'\n ? boolean\n : never\n\nexport type FromBytesErrorType =\n | BytesToHexErrorType\n | BytesToBigIntErrorType\n | BytesToBoolErrorType\n | BytesToNumberErrorType\n | BytesToStringErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a UTF-8 string, hex value, number, bigint or boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes\n * - Example: https://viem.sh/docs/utilities/fromBytes#usage\n *\n * @param bytes Byte array to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromBytes } from 'viem'\n * const data = fromBytes(new Uint8Array([1, 164]), 'number')\n * // 420\n *\n * @example\n * import { fromBytes } from 'viem'\n * const data = fromBytes(\n * new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]),\n * 'string'\n * )\n * // 'Hello world'\n */\nexport function fromBytes<\n to extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean',\n>(\n bytes: ByteArray,\n toOrOpts: FromBytesParameters,\n): FromBytesReturnType {\n const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts\n const to = opts.to\n\n if (to === 'number')\n return bytesToNumber(bytes, opts) as FromBytesReturnType\n if (to === 'bigint')\n return bytesToBigInt(bytes, opts) as FromBytesReturnType\n if (to === 'boolean')\n return bytesToBool(bytes, opts) as FromBytesReturnType\n if (to === 'string')\n return bytesToString(bytes, opts) as FromBytesReturnType\n return bytesToHex(bytes, opts) as FromBytesReturnType\n}\n\nexport type BytesToBigIntOpts = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size of the bytes. */\n size?: number | undefined\n}\n\nexport type BytesToBigIntErrorType =\n | BytesToHexErrorType\n | HexToBigIntErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestobigint\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { bytesToBigInt } from 'viem'\n * const data = bytesToBigInt(new Uint8Array([1, 164]))\n * // 420n\n */\nexport function bytesToBigInt(\n bytes: ByteArray,\n opts: BytesToBigIntOpts = {},\n): bigint {\n if (typeof opts.size !== 'undefined') assertSize(bytes, { size: opts.size })\n const hex = bytesToHex(bytes, opts)\n return hexToBigInt(hex, opts)\n}\n\nexport type BytesToBoolOpts = {\n /** Size of the bytes. */\n size?: number | undefined\n}\n\nexport type BytesToBoolErrorType =\n | AssertSizeErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestobool\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { bytesToBool } from 'viem'\n * const data = bytesToBool(new Uint8Array([1]))\n * // true\n */\nexport function bytesToBool(\n bytes_: ByteArray,\n opts: BytesToBoolOpts = {},\n): boolean {\n let bytes = bytes_\n if (typeof opts.size !== 'undefined') {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes)\n }\n if (bytes.length > 1 || bytes[0] > 1)\n throw new InvalidBytesBooleanError(bytes)\n return Boolean(bytes[0])\n}\n\nexport type BytesToNumberOpts = BytesToBigIntOpts\n\nexport type BytesToNumberErrorType =\n | BytesToHexErrorType\n | HexToNumberErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestonumber\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { bytesToNumber } from 'viem'\n * const data = bytesToNumber(new Uint8Array([1, 164]))\n * // 420\n */\nexport function bytesToNumber(\n bytes: ByteArray,\n opts: BytesToNumberOpts = {},\n): number {\n if (typeof opts.size !== 'undefined') assertSize(bytes, { size: opts.size })\n const hex = bytesToHex(bytes, opts)\n return hexToNumber(hex, opts)\n}\n\nexport type BytesToStringOpts = {\n /** Size of the bytes. */\n size?: number | undefined\n}\n\nexport type BytesToStringErrorType =\n | AssertSizeErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a byte array into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestostring\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { bytesToString } from 'viem'\n * const data = bytesToString(new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // 'Hello world'\n */\nexport function bytesToString(\n bytes_: ByteArray,\n opts: BytesToStringOpts = {},\n): string {\n let bytes = bytes_\n if (typeof opts.size !== 'undefined') {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes, { dir: 'right' })\n }\n return new TextDecoder().decode(bytes)\n}\n","import type {\n AbiParameter,\n AbiParameterKind,\n AbiParametersToPrimitiveTypes,\n} from 'abitype'\nimport {\n AbiDecodingDataSizeTooSmallError,\n AbiDecodingZeroDataError,\n InvalidAbiDecodingTypeError,\n type InvalidAbiDecodingTypeErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type ChecksumAddressErrorType,\n checksumAddress,\n} from '../address/getAddress.js'\nimport {\n type CreateCursorErrorType,\n type Cursor,\n createCursor,\n} from '../cursor.js'\nimport { type SizeErrorType, size } from '../data/size.js'\nimport { type SliceBytesErrorType, sliceBytes } from '../data/slice.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\nimport {\n type BytesToBigIntErrorType,\n type BytesToBoolErrorType,\n type BytesToNumberErrorType,\n type BytesToStringErrorType,\n bytesToBigInt,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n} from '../encoding/fromBytes.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { getArrayComponents } from './encodeAbiParameters.js'\n\nexport type DecodeAbiParametersReturnType<\n params extends readonly AbiParameter[] = readonly AbiParameter[],\n> = AbiParametersToPrimitiveTypes<\n params extends readonly AbiParameter[] ? params : AbiParameter[],\n AbiParameterKind,\n true\n>\n\nexport type DecodeAbiParametersErrorType =\n | HexToBytesErrorType\n | BytesToHexErrorType\n | DecodeParameterErrorType\n | SizeErrorType\n | CreateCursorErrorType\n | ErrorType\n\nexport function decodeAbiParameters<\n const params extends readonly AbiParameter[],\n>(\n params: params,\n data: ByteArray | Hex,\n): DecodeAbiParametersReturnType {\n const bytes = typeof data === 'string' ? hexToBytes(data) : data\n const cursor = createCursor(bytes)\n\n if (size(bytes) === 0 && params.length > 0)\n throw new AbiDecodingZeroDataError()\n if (size(data) && size(data) < 32)\n throw new AbiDecodingDataSizeTooSmallError({\n data: typeof data === 'string' ? data : bytesToHex(data),\n params: params as readonly AbiParameter[],\n size: size(data),\n })\n\n let consumed = 0\n const values = []\n for (let i = 0; i < params.length; ++i) {\n const param = params[i]\n cursor.setPosition(consumed)\n const [data, consumed_] = decodeParameter(cursor, param, {\n staticPosition: 0,\n })\n consumed += consumed_\n values.push(data)\n }\n return values as never\n}\n\ntype DecodeParameterErrorType =\n | DecodeArrayErrorType\n | DecodeTupleErrorType\n | DecodeAddressErrorType\n | DecodeBoolErrorType\n | DecodeBytesErrorType\n | DecodeNumberErrorType\n | DecodeStringErrorType\n | InvalidAbiDecodingTypeErrorType\n\nfunction decodeParameter(\n cursor: Cursor,\n param: AbiParameter,\n { staticPosition }: { staticPosition: number },\n) {\n const arrayComponents = getArrayComponents(param.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return decodeArray(cursor, { ...param, type }, { length, staticPosition })\n }\n if (param.type === 'tuple')\n return decodeTuple(cursor, param as TupleAbiParameter, { staticPosition })\n\n if (param.type === 'address') return decodeAddress(cursor)\n if (param.type === 'bool') return decodeBool(cursor)\n if (param.type.startsWith('bytes'))\n return decodeBytes(cursor, param, { staticPosition })\n if (param.type.startsWith('uint') || param.type.startsWith('int'))\n return decodeNumber(cursor, param)\n if (param.type === 'string') return decodeString(cursor, { staticPosition })\n throw new InvalidAbiDecodingTypeError(param.type, {\n docsPath: '/docs/contract/decodeAbiParameters',\n })\n}\n\n////////////////////////////////////////////////////////////////////\n// Type Decoders\n\nconst sizeOfLength = 32\nconst sizeOfOffset = 32\n\ntype DecodeAddressErrorType =\n | ChecksumAddressErrorType\n | BytesToHexErrorType\n | SliceBytesErrorType\n | ErrorType\n\nfunction decodeAddress(cursor: Cursor) {\n const value = cursor.readBytes(32)\n return [checksumAddress(bytesToHex(sliceBytes(value, -20))), 32]\n}\n\ntype DecodeArrayErrorType = BytesToNumberErrorType | ErrorType\n\nfunction decodeArray(\n cursor: Cursor,\n param: AbiParameter,\n { length, staticPosition }: { length: number | null; staticPosition: number },\n) {\n // If the length of the array is not known in advance (dynamic array),\n // this means we will need to wonder off to the pointer and decode.\n if (!length) {\n // Dealing with a dynamic type, so get the offset of the array data.\n const offset = bytesToNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n const startOfData = start + sizeOfLength\n\n // Get the length of the array from the offset.\n cursor.setPosition(start)\n const length = bytesToNumber(cursor.readBytes(sizeOfLength))\n\n // Check if the array has any dynamic children.\n const dynamicChild = hasDynamicChild(param)\n\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // If any of the children is dynamic, then all elements will be offset pointer, thus size of one slot (32 bytes).\n // Otherwise, elements will be the size of their encoding (consumed bytes).\n cursor.setPosition(startOfData + (dynamicChild ? i * 32 : consumed))\n const [data, consumed_] = decodeParameter(cursor, param, {\n staticPosition: startOfData,\n })\n consumed += consumed_\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance,\n // and the length of an element deeply nested in the array is not known,\n // we need to decode the offset of the array data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the array data.\n const offset = bytesToNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // Move cursor along to the next slot (next offset pointer).\n cursor.setPosition(start + i * 32)\n const [data] = decodeParameter(cursor, param, {\n staticPosition: start,\n })\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance and the array is deeply static,\n // then we can just decode each element in sequence.\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n const [data, consumed_] = decodeParameter(cursor, param, {\n staticPosition: staticPosition + consumed,\n })\n consumed += consumed_\n value.push(data)\n }\n return [value, consumed]\n}\n\ntype DecodeBoolErrorType = BytesToBoolErrorType | ErrorType\n\nfunction decodeBool(cursor: Cursor) {\n return [bytesToBool(cursor.readBytes(32), { size: 32 }), 32]\n}\n\ntype DecodeBytesErrorType =\n | BytesToNumberErrorType\n | BytesToHexErrorType\n | ErrorType\n\nfunction decodeBytes(\n cursor: Cursor,\n param: AbiParameter,\n { staticPosition }: { staticPosition: number },\n) {\n const [_, size] = param.type.split('bytes')\n if (!size) {\n // Dealing with dynamic types, so get the offset of the bytes data.\n const offset = bytesToNumber(cursor.readBytes(32))\n\n // Set position of the cursor to start of bytes data.\n cursor.setPosition(staticPosition + offset)\n\n const length = bytesToNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data.\n if (length === 0) {\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return ['0x', 32]\n }\n\n const data = cursor.readBytes(length)\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [bytesToHex(data), 32]\n }\n\n const value = bytesToHex(cursor.readBytes(Number.parseInt(size, 10), 32))\n return [value, 32]\n}\n\ntype DecodeNumberErrorType =\n | BytesToNumberErrorType\n | BytesToBigIntErrorType\n | ErrorType\n\nfunction decodeNumber(cursor: Cursor, param: AbiParameter) {\n const signed = param.type.startsWith('int')\n const size = Number.parseInt(param.type.split('int')[1] || '256', 10)\n const value = cursor.readBytes(32)\n return [\n size > 48\n ? bytesToBigInt(value, { signed })\n : bytesToNumber(value, { signed }),\n 32,\n ]\n}\n\ntype TupleAbiParameter = AbiParameter & { components: readonly AbiParameter[] }\n\ntype DecodeTupleErrorType = BytesToNumberErrorType | ErrorType\n\nfunction decodeTuple(\n cursor: Cursor,\n param: TupleAbiParameter,\n { staticPosition }: { staticPosition: number },\n) {\n // Tuples can have unnamed components (i.e. they are arrays), so we must\n // determine whether the tuple is named or unnamed. In the case of a named\n // tuple, the value will be an object where each property is the name of the\n // component. In the case of an unnamed tuple, the value will be an array.\n const hasUnnamedChild =\n param.components.length === 0 || param.components.some(({ name }) => !name)\n\n // Initialize the value to an object or an array, depending on whether the\n // tuple is named or unnamed.\n const value: any = hasUnnamedChild ? [] : {}\n let consumed = 0\n\n // If the tuple has a dynamic child, we must first decode the offset to the\n // tuple data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the tuple data.\n const offset = bytesToNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of referencing slot + offset.\n const start = staticPosition + offset\n\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]\n cursor.setPosition(start + consumed)\n const [data, consumed_] = decodeParameter(cursor, component, {\n staticPosition: start,\n })\n consumed += consumed_\n value[hasUnnamedChild ? i : component?.name!] = data\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the tuple has static children, we can just decode each component\n // in sequence.\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]\n const [data, consumed_] = decodeParameter(cursor, component, {\n staticPosition,\n })\n value[hasUnnamedChild ? i : component?.name!] = data\n consumed += consumed_\n }\n return [value, consumed]\n}\n\ntype DecodeStringErrorType =\n | BytesToNumberErrorType\n | BytesToStringErrorType\n | TrimErrorType\n | ErrorType\n\nfunction decodeString(\n cursor: Cursor,\n { staticPosition }: { staticPosition: number },\n) {\n // Get offset to start of string data.\n const offset = bytesToNumber(cursor.readBytes(32))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n cursor.setPosition(start)\n\n const length = bytesToNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data (empty string).\n if (length === 0) {\n cursor.setPosition(staticPosition + 32)\n return ['', 32]\n }\n\n const data = cursor.readBytes(length, 32)\n const value = bytesToString(trim(data))\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n\n return [value, 32]\n}\n\nfunction hasDynamicChild(param: AbiParameter) {\n const { type } = param\n if (type === 'string') return true\n if (type === 'bytes') return true\n if (type.endsWith('[]')) return true\n\n if (type === 'tuple') return (param as any).components?.some(hasDynamicChild)\n\n const arrayComponents = getArrayComponents(param.type)\n if (\n arrayComponents &&\n hasDynamicChild({ ...param, type: arrayComponents[1] } as AbiParameter)\n )\n return true\n\n return false\n}\n","import type { Abi, ExtractAbiError } from 'abitype'\n\nimport { solidityError, solidityPanic } from '../../constants/solidity.js'\nimport {\n AbiDecodingZeroDataError,\n type AbiDecodingZeroDataErrorType,\n AbiErrorSignatureNotFoundError,\n type AbiErrorSignatureNotFoundErrorType,\n} from '../../errors/abi.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n AbiItem,\n ContractErrorArgs,\n ContractErrorName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { slice } from '../data/slice.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\n\nexport type DecodeErrorResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n> = { abi?: abi | undefined; data: Hex; cause?: BaseError | Error | undefined }\n\nexport type DecodeErrorResultReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n ///\n allErrorNames extends ContractErrorName = ContractErrorName,\n> = IsNarrowable extends true\n ? UnionEvaluate<\n {\n [errorName in allErrorNames]: {\n abiItem: abi extends Abi\n ? Abi extends abi\n ? AbiItem\n : ExtractAbiError\n : AbiItem\n args: ContractErrorArgs\n errorName: errorName\n }\n }[allErrorNames]\n >\n : {\n abiItem: AbiItem\n args: readonly unknown[] | undefined\n errorName: string\n }\n\nexport type DecodeErrorResultErrorType =\n | AbiDecodingZeroDataErrorType\n | AbiErrorSignatureNotFoundErrorType\n | DecodeAbiParametersErrorType\n | FormatAbiItemErrorType\n | ToFunctionSelectorErrorType\n | ErrorType\n\nexport function decodeErrorResult(\n parameters: DecodeErrorResultParameters,\n): DecodeErrorResultReturnType {\n const { abi, data, cause } = parameters as DecodeErrorResultParameters\n\n const signature = slice(data, 0, 4)\n if (signature === '0x') throw new AbiDecodingZeroDataError({ cause })\n\n const abi_ = [...(abi || []), solidityError, solidityPanic]\n const abiItem = abi_.find(\n (x) =>\n x.type === 'error' && signature === toFunctionSelector(formatAbiItem(x)),\n )\n if (!abiItem)\n throw new AbiErrorSignatureNotFoundError(signature, {\n docsPath: '/docs/contract/decodeErrorResult',\n cause,\n })\n return {\n abiItem,\n args:\n 'inputs' in abiItem && abiItem.inputs && abiItem.inputs.length > 0\n ? decodeAbiParameters(abiItem.inputs, slice(data, 4))\n : undefined,\n errorName: (abiItem as { name: string }).name,\n } as DecodeErrorResultReturnType\n}\n","import type { ErrorType } from '../errors/utils.js'\n\nexport type StringifyErrorType = ErrorType\n\nexport const stringify: typeof JSON.stringify = (value, replacer, space) =>\n JSON.stringify(\n value,\n (key, value_) => {\n const value = typeof value_ === 'bigint' ? value_.toString() : value_\n return typeof replacer === 'function' ? replacer(key, value) : value\n },\n space,\n )\n","import type { AbiParameter } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { AbiItem } from '../../types/contract.js'\nimport { stringify } from '../stringify.js'\n\nexport type FormatAbiItemWithArgsErrorType = ErrorType\n\nexport function formatAbiItemWithArgs({\n abiItem,\n args,\n includeFunctionName = true,\n includeName = false,\n}: {\n abiItem: AbiItem\n args: readonly unknown[]\n includeFunctionName?: boolean | undefined\n includeName?: boolean | undefined\n}) {\n if (!('name' in abiItem)) return\n if (!('inputs' in abiItem)) return\n if (!abiItem.inputs) return\n return `${includeFunctionName ? abiItem.name : ''}(${abiItem.inputs\n .map(\n (input: AbiParameter, i: number) =>\n `${includeName && input.name ? `${input.name}: ` : ''}${\n typeof args[i] === 'object' ? stringify(args[i]) : args[i]\n }`,\n )\n .join(', ')})`\n}\n","export const etherUnits = {\n gwei: 9,\n wei: 18,\n}\nexport const gweiUnits = {\n ether: -9,\n wei: 9,\n}\nexport const weiUnits = {\n ether: -18,\n gwei: -9,\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\nexport type FormatUnitsErrorType = ErrorType\n\n/**\n * Divides a number by a given exponent of base 10 (10exponent), and formats it into a string representation of the number..\n *\n * - Docs: https://viem.sh/docs/utilities/formatUnits\n *\n * @example\n * import { formatUnits } from 'viem'\n *\n * formatUnits(420000000000n, 9)\n * // '420'\n */\nexport function formatUnits(value: bigint, decimals: number) {\n let display = value.toString()\n\n const negative = display.startsWith('-')\n if (negative) display = display.slice(1)\n\n display = display.padStart(decimals, '0')\n\n let [integer, fraction] = [\n display.slice(0, display.length - decimals),\n display.slice(display.length - decimals),\n ]\n fraction = fraction.replace(/(0+)$/, '')\n return `${negative ? '-' : ''}${integer || '0'}${\n fraction ? `.${fraction}` : ''\n }`\n}\n","import { etherUnits } from '../../constants/unit.js'\n\nimport { type FormatUnitsErrorType, formatUnits } from './formatUnits.js'\n\nexport type FormatEtherErrorType = FormatUnitsErrorType\n\n/**\n * Converts numerical wei to a string representation of ether.\n *\n * - Docs: https://viem.sh/docs/utilities/formatEther\n *\n * @example\n * import { formatEther } from 'viem'\n *\n * formatEther(1000000000000000000n)\n * // '1'\n */\nexport function formatEther(wei: bigint, unit: 'wei' | 'gwei' = 'wei') {\n return formatUnits(wei, etherUnits[unit])\n}\n","import { gweiUnits } from '../../constants/unit.js'\n\nimport { type FormatUnitsErrorType, formatUnits } from './formatUnits.js'\n\nexport type FormatGweiErrorType = FormatUnitsErrorType\n\n/**\n * Converts numerical wei to a string representation of gwei.\n *\n * - Docs: https://viem.sh/docs/utilities/formatGwei\n *\n * @example\n * import { formatGwei } from 'viem'\n *\n * formatGwei(1000000000n)\n * // '1'\n */\nexport function formatGwei(wei: bigint, unit: 'wei' = 'wei') {\n return formatUnits(wei, gweiUnits[unit])\n}\n","import type { StateMapping, StateOverride } from '../types/stateOverride.js'\nimport { BaseError } from './base.js'\n\nexport type AccountStateConflictErrorType = AccountStateConflictError & {\n name: 'AccountStateConflictError'\n}\n\nexport class AccountStateConflictError extends BaseError {\n constructor({ address }: { address: string }) {\n super(`State for account \"${address}\" is set multiple times.`, {\n name: 'AccountStateConflictError',\n })\n }\n}\n\nexport type StateAssignmentConflictErrorType = StateAssignmentConflictError & {\n name: 'StateAssignmentConflictError'\n}\n\nexport class StateAssignmentConflictError extends BaseError {\n constructor() {\n super('state and stateDiff are set on the same account.', {\n name: 'StateAssignmentConflictError',\n })\n }\n}\n\n/** @internal */\nexport function prettyStateMapping(stateMapping: StateMapping) {\n return stateMapping.reduce((pretty, { slot, value }) => {\n return `${pretty} ${slot}: ${value}\\n`\n }, '')\n}\n\nexport function prettyStateOverride(stateOverride: StateOverride) {\n return stateOverride\n .reduce((pretty, { address, ...state }) => {\n let val = `${pretty} ${address}:\\n`\n if (state.nonce) val += ` nonce: ${state.nonce}\\n`\n if (state.balance) val += ` balance: ${state.balance}\\n`\n if (state.code) val += ` code: ${state.code}\\n`\n if (state.state) {\n val += ' state:\\n'\n val += prettyStateMapping(state.state)\n }\n if (state.stateDiff) {\n val += ' stateDiff:\\n'\n val += prettyStateMapping(state.stateDiff)\n }\n return val\n }, ' State Override:\\n')\n .slice(0, -1)\n}\n","import type { Account } from '../accounts/types.js'\nimport type { SendTransactionParameters } from '../actions/wallet/sendTransaction.js'\nimport type { BlockTag } from '../types/block.js'\nimport type { Chain } from '../types/chain.js'\nimport type { Hash, Hex } from '../types/misc.js'\nimport type {\n TransactionReceipt,\n TransactionType,\n} from '../types/transaction.js'\nimport { formatEther } from '../utils/unit/formatEther.js'\nimport { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { BaseError } from './base.js'\n\nexport function prettyPrint(\n args: Record,\n) {\n const entries = Object.entries(args)\n .map(([key, value]) => {\n if (value === undefined || value === false) return null\n return [key, value]\n })\n .filter(Boolean) as [string, string][]\n const maxLength = entries.reduce((acc, [key]) => Math.max(acc, key.length), 0)\n return entries\n .map(([key, value]) => ` ${`${key}:`.padEnd(maxLength + 1)} ${value}`)\n .join('\\n')\n}\n\nexport type FeeConflictErrorType = FeeConflictError & {\n name: 'FeeConflictError'\n}\nexport class FeeConflictError extends BaseError {\n constructor() {\n super(\n [\n 'Cannot specify both a `gasPrice` and a `maxFeePerGas`/`maxPriorityFeePerGas`.',\n 'Use `maxFeePerGas`/`maxPriorityFeePerGas` for EIP-1559 compatible networks, and `gasPrice` for others.',\n ].join('\\n'),\n { name: 'FeeConflictError' },\n )\n }\n}\n\nexport type InvalidLegacyVErrorType = InvalidLegacyVError & {\n name: 'InvalidLegacyVError'\n}\nexport class InvalidLegacyVError extends BaseError {\n constructor({ v }: { v: bigint }) {\n super(`Invalid \\`v\\` value \"${v}\". Expected 27 or 28.`, {\n name: 'InvalidLegacyVError',\n })\n }\n}\n\nexport type InvalidSerializableTransactionErrorType =\n InvalidSerializableTransactionError & {\n name: 'InvalidSerializableTransactionError'\n }\nexport class InvalidSerializableTransactionError extends BaseError {\n constructor({ transaction }: { transaction: Record }) {\n super('Cannot infer a transaction type from provided transaction.', {\n metaMessages: [\n 'Provided Transaction:',\n '{',\n prettyPrint(transaction),\n '}',\n '',\n 'To infer the type, either provide:',\n '- a `type` to the Transaction, or',\n '- an EIP-1559 Transaction with `maxFeePerGas`, or',\n '- an EIP-2930 Transaction with `gasPrice` & `accessList`, or',\n '- an EIP-4844 Transaction with `blobs`, `blobVersionedHashes`, `sidecars`, or',\n '- an EIP-7702 Transaction with `authorizationList`, or',\n '- a Legacy Transaction with `gasPrice`',\n ],\n name: 'InvalidSerializableTransactionError',\n })\n }\n}\n\nexport type InvalidSerializedTransactionTypeErrorType =\n InvalidSerializedTransactionTypeError & {\n name: 'InvalidSerializedTransactionTypeError'\n }\nexport class InvalidSerializedTransactionTypeError extends BaseError {\n serializedType: Hex\n\n constructor({ serializedType }: { serializedType: Hex }) {\n super(`Serialized transaction type \"${serializedType}\" is invalid.`, {\n name: 'InvalidSerializedTransactionType',\n })\n\n this.serializedType = serializedType\n }\n}\n\nexport type InvalidSerializedTransactionErrorType =\n InvalidSerializedTransactionError & {\n name: 'InvalidSerializedTransactionError'\n }\nexport class InvalidSerializedTransactionError extends BaseError {\n serializedTransaction: Hex\n type: TransactionType\n\n constructor({\n attributes,\n serializedTransaction,\n type,\n }: {\n attributes: Record\n serializedTransaction: Hex\n type: TransactionType\n }) {\n const missing = Object.entries(attributes)\n .map(([key, value]) => (typeof value === 'undefined' ? key : undefined))\n .filter(Boolean)\n super(`Invalid serialized transaction of type \"${type}\" was provided.`, {\n metaMessages: [\n `Serialized Transaction: \"${serializedTransaction}\"`,\n missing.length > 0 ? `Missing Attributes: ${missing.join(', ')}` : '',\n ].filter(Boolean),\n name: 'InvalidSerializedTransactionError',\n })\n\n this.serializedTransaction = serializedTransaction\n this.type = type\n }\n}\n\nexport type InvalidStorageKeySizeErrorType = InvalidStorageKeySizeError & {\n name: 'InvalidStorageKeySizeError'\n}\nexport class InvalidStorageKeySizeError extends BaseError {\n constructor({ storageKey }: { storageKey: Hex }) {\n super(\n `Size for storage key \"${storageKey}\" is invalid. Expected 32 bytes. Got ${Math.floor(\n (storageKey.length - 2) / 2,\n )} bytes.`,\n { name: 'InvalidStorageKeySizeError' },\n )\n }\n}\n\nexport type TransactionExecutionErrorType = TransactionExecutionError & {\n name: 'TransactionExecutionError'\n}\nexport class TransactionExecutionError extends BaseError {\n override cause: BaseError\n\n constructor(\n cause: BaseError,\n {\n account,\n docsPath,\n chain,\n data,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n }: Omit & {\n account: Account | null\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n ) {\n const prettyArgs = prettyPrint({\n chain: chain && `${chain?.name} (id: ${chain?.id})`,\n from: account?.address,\n to,\n value:\n typeof value !== 'undefined' &&\n `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n data,\n gas,\n gasPrice:\n typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n maxFeePerGas:\n typeof maxFeePerGas !== 'undefined' &&\n `${formatGwei(maxFeePerGas)} gwei`,\n maxPriorityFeePerGas:\n typeof maxPriorityFeePerGas !== 'undefined' &&\n `${formatGwei(maxPriorityFeePerGas)} gwei`,\n nonce,\n })\n\n super(cause.shortMessage, {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n 'Request Arguments:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'TransactionExecutionError',\n })\n this.cause = cause\n }\n}\n\nexport type TransactionNotFoundErrorType = TransactionNotFoundError & {\n name: 'TransactionNotFoundError'\n}\nexport class TransactionNotFoundError extends BaseError {\n constructor({\n blockHash,\n blockNumber,\n blockTag,\n hash,\n index,\n }: {\n blockHash?: Hash | undefined\n blockNumber?: bigint | undefined\n blockTag?: BlockTag | undefined\n hash?: Hash | undefined\n index?: number | undefined\n }) {\n let identifier = 'Transaction'\n if (blockTag && index !== undefined)\n identifier = `Transaction at block time \"${blockTag}\" at index \"${index}\"`\n if (blockHash && index !== undefined)\n identifier = `Transaction at block hash \"${blockHash}\" at index \"${index}\"`\n if (blockNumber && index !== undefined)\n identifier = `Transaction at block number \"${blockNumber}\" at index \"${index}\"`\n if (hash) identifier = `Transaction with hash \"${hash}\"`\n super(`${identifier} could not be found.`, {\n name: 'TransactionNotFoundError',\n })\n }\n}\n\nexport type TransactionReceiptNotFoundErrorType =\n TransactionReceiptNotFoundError & {\n name: 'TransactionReceiptNotFoundError'\n }\nexport class TransactionReceiptNotFoundError extends BaseError {\n constructor({ hash }: { hash: Hash }) {\n super(\n `Transaction receipt with hash \"${hash}\" could not be found. The Transaction may not be processed on a block yet.`,\n {\n name: 'TransactionReceiptNotFoundError',\n },\n )\n }\n}\n\nexport type TransactionReceiptRevertedErrorType =\n TransactionReceiptRevertedError & {\n name: 'TransactionReceiptRevertedError'\n }\nexport class TransactionReceiptRevertedError extends BaseError {\n receipt: TransactionReceipt\n\n constructor({ receipt }: { receipt: TransactionReceipt }) {\n super(`Transaction with hash \"${receipt.transactionHash}\" reverted.`, {\n metaMessages: [\n 'The receipt marked the transaction as \"reverted\". This could mean that the function on the contract you are trying to call threw an error.',\n ' ',\n 'You can attempt to extract the revert reason by:',\n '- calling the `simulateContract` or `simulateCalls` Action with the `abi` and `functionName` of the contract',\n '- using the `call` Action with raw `data`',\n ],\n name: 'TransactionReceiptRevertedError',\n })\n\n this.receipt = receipt\n }\n}\n\nexport type WaitForTransactionReceiptTimeoutErrorType =\n WaitForTransactionReceiptTimeoutError & {\n name: 'WaitForTransactionReceiptTimeoutError'\n }\nexport class WaitForTransactionReceiptTimeoutError extends BaseError {\n constructor({ hash }: { hash: Hash }) {\n super(\n `Timed out while waiting for transaction with hash \"${hash}\" to be confirmed.`,\n { name: 'WaitForTransactionReceiptTimeoutError' },\n )\n }\n}\n","import type { Address } from 'abitype'\n\nexport type ErrorType = Error & { name: name }\n\nexport const getContractAddress = (address: Address) => address\nexport const getUrl = (url: string) => url\n","import type { Abi, Address } from 'abitype'\n\nimport { parseAccount } from '../accounts/utils/parseAccount.js'\nimport type { CallParameters } from '../actions/public/call.js'\nimport { panicReasons } from '../constants/solidity.js'\nimport type { Chain } from '../types/chain.js'\nimport type { Hex } from '../types/misc.js'\nimport {\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from '../utils/abi/decodeErrorResult.js'\nimport { formatAbiItem } from '../utils/abi/formatAbiItem.js'\nimport { formatAbiItemWithArgs } from '../utils/abi/formatAbiItemWithArgs.js'\nimport { getAbiItem } from '../utils/abi/getAbiItem.js'\nimport { formatEther } from '../utils/unit/formatEther.js'\nimport { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { AbiErrorSignatureNotFoundError } from './abi.js'\nimport { BaseError } from './base.js'\nimport { prettyStateOverride } from './stateOverride.js'\nimport { prettyPrint } from './transaction.js'\nimport { getContractAddress } from './utils.js'\n\nexport type CallExecutionErrorType = CallExecutionError & {\n name: 'CallExecutionError'\n}\nexport class CallExecutionError extends BaseError {\n override cause: BaseError\n\n constructor(\n cause: BaseError,\n {\n account: account_,\n docsPath,\n chain,\n data,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n stateOverride,\n }: CallParameters & {\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n ) {\n const account = account_ ? parseAccount(account_) : undefined\n let prettyArgs = prettyPrint({\n from: account?.address,\n to,\n value:\n typeof value !== 'undefined' &&\n `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n data,\n gas,\n gasPrice:\n typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n maxFeePerGas:\n typeof maxFeePerGas !== 'undefined' &&\n `${formatGwei(maxFeePerGas)} gwei`,\n maxPriorityFeePerGas:\n typeof maxPriorityFeePerGas !== 'undefined' &&\n `${formatGwei(maxPriorityFeePerGas)} gwei`,\n nonce,\n })\n\n if (stateOverride) {\n prettyArgs += `\\n${prettyStateOverride(stateOverride)}`\n }\n\n super(cause.shortMessage, {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n 'Raw Call Arguments:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'CallExecutionError',\n })\n this.cause = cause\n }\n}\n\nexport type ContractFunctionExecutionErrorType =\n ContractFunctionExecutionError & {\n name: 'ContractFunctionExecutionError'\n }\nexport class ContractFunctionExecutionError extends BaseError {\n abi: Abi\n args?: unknown[] | undefined\n override cause: BaseError\n contractAddress?: Address | undefined\n formattedArgs?: string | undefined\n functionName: string\n sender?: Address | undefined\n\n constructor(\n cause: BaseError,\n {\n abi,\n args,\n contractAddress,\n docsPath,\n functionName,\n sender,\n }: {\n abi: Abi\n args?: any | undefined\n contractAddress?: Address | undefined\n docsPath?: string | undefined\n functionName: string\n sender?: Address | undefined\n },\n ) {\n const abiItem = getAbiItem({ abi, args, name: functionName })\n const formattedArgs = abiItem\n ? formatAbiItemWithArgs({\n abiItem,\n args,\n includeFunctionName: false,\n includeName: false,\n })\n : undefined\n const functionWithParams = abiItem\n ? formatAbiItem(abiItem, { includeName: true })\n : undefined\n\n const prettyArgs = prettyPrint({\n address: contractAddress && getContractAddress(contractAddress),\n function: functionWithParams,\n args:\n formattedArgs &&\n formattedArgs !== '()' &&\n `${[...Array(functionName?.length ?? 0).keys()]\n .map(() => ' ')\n .join('')}${formattedArgs}`,\n sender,\n })\n\n super(\n cause.shortMessage ||\n `An unknown error occurred while executing the contract function \"${functionName}\".`,\n {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n prettyArgs && 'Contract Call:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'ContractFunctionExecutionError',\n },\n )\n this.abi = abi\n this.args = args\n this.cause = cause\n this.contractAddress = contractAddress\n this.functionName = functionName\n this.sender = sender\n }\n}\n\nexport type ContractFunctionRevertedErrorType =\n ContractFunctionRevertedError & {\n name: 'ContractFunctionRevertedError'\n }\nexport class ContractFunctionRevertedError extends BaseError {\n data?: DecodeErrorResultReturnType | undefined\n raw?: Hex | undefined\n reason?: string | undefined\n signature?: Hex | undefined\n\n constructor({\n abi,\n data,\n functionName,\n message,\n cause: error,\n }: {\n abi: Abi\n data?: Hex | undefined\n functionName: string\n message?: string | undefined\n cause?: BaseError | Error | undefined\n }) {\n let cause: Error | undefined\n let decodedData: DecodeErrorResultReturnType | undefined\n let metaMessages: string[] | undefined\n let reason: string | undefined\n if (data && data !== '0x') {\n try {\n decodedData = decodeErrorResult({ abi, data, cause: error })\n const { abiItem, errorName, args: errorArgs } = decodedData\n if (errorName === 'Error') {\n reason = (errorArgs as [string])[0]\n } else if (errorName === 'Panic') {\n const [firstArg] = errorArgs as [number]\n reason = panicReasons[firstArg as keyof typeof panicReasons]\n } else {\n const errorWithParams = abiItem\n ? formatAbiItem(abiItem, { includeName: true })\n : undefined\n const formattedArgs =\n abiItem && errorArgs\n ? formatAbiItemWithArgs({\n abiItem,\n args: errorArgs,\n includeFunctionName: false,\n includeName: false,\n })\n : undefined\n\n metaMessages = [\n errorWithParams ? `Error: ${errorWithParams}` : '',\n formattedArgs && formattedArgs !== '()'\n ? ` ${[...Array(errorName?.length ?? 0).keys()]\n .map(() => ' ')\n .join('')}${formattedArgs}`\n : '',\n ]\n }\n } catch (err) {\n cause = err as Error\n }\n } else if (message) reason = message\n\n let signature: Hex | undefined\n if (cause instanceof AbiErrorSignatureNotFoundError) {\n signature = cause.signature\n metaMessages = [\n `Unable to decode signature \"${signature}\" as it was not found on the provided ABI.`,\n 'Make sure you are using the correct ABI and that the error exists on it.',\n `You can look up the decoded signature here: https://4byte.sourcify.dev/?q=${signature}.`,\n ]\n }\n\n super(\n (reason && reason !== 'execution reverted') || signature\n ? [\n `The contract function \"${functionName}\" reverted with the following ${\n signature ? 'signature' : 'reason'\n }:`,\n reason || signature,\n ].join('\\n')\n : `The contract function \"${functionName}\" reverted.`,\n {\n cause: cause ?? error,\n metaMessages,\n name: 'ContractFunctionRevertedError',\n },\n )\n\n this.data = decodedData\n this.raw = data\n this.reason = reason\n this.signature = signature\n }\n}\n\nexport type ContractFunctionZeroDataErrorType =\n ContractFunctionZeroDataError & {\n name: 'ContractFunctionZeroDataError'\n }\nexport class ContractFunctionZeroDataError extends BaseError {\n constructor({\n functionName,\n cause,\n }: {\n functionName: string\n cause?: BaseError | Error | undefined\n }) {\n super(`The contract function \"${functionName}\" returned no data (\"0x\").`, {\n metaMessages: [\n 'This could be due to any of the following:',\n ` - The contract does not have the function \"${functionName}\",`,\n ' - The parameters passed to the contract function may be invalid, or',\n ' - The address is not a contract.',\n ],\n name: 'ContractFunctionZeroDataError',\n cause,\n })\n }\n}\n\nexport type CounterfactualDeploymentFailedErrorType =\n CounterfactualDeploymentFailedError & {\n name: 'CounterfactualDeploymentFailedError'\n }\nexport class CounterfactualDeploymentFailedError extends BaseError {\n constructor({ factory }: { factory?: Address | undefined }) {\n super(\n `Deployment for counterfactual contract call failed${\n factory ? ` for factory \"${factory}\".` : ''\n }`,\n {\n metaMessages: [\n 'Please ensure:',\n '- The `factory` is a valid contract deployment factory (ie. Create2 Factory, ERC-4337 Factory, etc).',\n '- The `factoryData` is a valid encoded function call for contract deployment function on the factory.',\n ],\n name: 'CounterfactualDeploymentFailedError',\n },\n )\n }\n}\n\nexport type RawContractErrorType = RawContractError & {\n name: 'RawContractError'\n}\nexport class RawContractError extends BaseError {\n code = 3\n\n data?: Hex | { data?: Hex | undefined } | undefined\n\n constructor({\n data,\n message,\n }: {\n data?: Hex | { data?: Hex | undefined } | undefined\n message?: string | undefined\n }) {\n super(message || '', { name: 'RawContractError' })\n this.data = data\n }\n}\n","import { stringify } from '../utils/stringify.js'\n\nimport { BaseError } from './base.js'\nimport { getUrl } from './utils.js'\n\nexport type HttpRequestErrorType = HttpRequestError & {\n name: 'HttpRequestError'\n}\nexport class HttpRequestError extends BaseError {\n body?: { [x: string]: unknown } | { [y: string]: unknown }[] | undefined\n headers?: Headers | undefined\n status?: number | undefined\n url: string\n\n constructor({\n body,\n cause,\n details,\n headers,\n status,\n url,\n }: {\n body?: { [x: string]: unknown } | { [y: string]: unknown }[] | undefined\n cause?: Error | undefined\n details?: string | undefined\n headers?: Headers | undefined\n status?: number | undefined\n url: string\n }) {\n super('HTTP request failed.', {\n cause,\n details,\n metaMessages: [\n status && `Status: ${status}`,\n `URL: ${getUrl(url)}`,\n body && `Request body: ${stringify(body)}`,\n ].filter(Boolean) as string[],\n name: 'HttpRequestError',\n })\n this.body = body\n this.headers = headers\n this.status = status\n this.url = url\n }\n}\n\nexport type WebSocketRequestErrorType = WebSocketRequestError & {\n name: 'WebSocketRequestError'\n}\nexport class WebSocketRequestError extends BaseError {\n url: string\n constructor({\n body,\n cause,\n details,\n url,\n }: {\n body?: { [key: string]: unknown } | undefined\n cause?: Error | undefined\n details?: string | undefined\n url: string\n }) {\n super('WebSocket request failed.', {\n cause,\n details,\n metaMessages: [\n `URL: ${getUrl(url)}`,\n body && `Request body: ${stringify(body)}`,\n ].filter(Boolean) as string[],\n name: 'WebSocketRequestError',\n })\n this.url = url\n }\n}\n\nexport type RpcRequestErrorType = RpcRequestError & {\n name: 'RpcRequestError'\n}\nexport class RpcRequestError extends BaseError {\n code: number\n data?: unknown\n url: string\n constructor({\n body,\n error,\n url,\n }: {\n body: { [x: string]: unknown } | { [y: string]: unknown }[]\n error: { code: number; data?: unknown; message: string }\n url: string\n }) {\n super('RPC Request failed.', {\n cause: error as any,\n details: error.message,\n metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],\n name: 'RpcRequestError',\n })\n this.code = error.code\n this.data = error.data\n this.url = url\n }\n}\n\nexport type SocketClosedErrorType = SocketClosedError & {\n name: 'SocketClosedError'\n}\nexport class SocketClosedError extends BaseError {\n url: string | undefined\n constructor({\n url,\n }: {\n url?: string | undefined\n } = {}) {\n super('The socket has been closed.', {\n metaMessages: [url && `URL: ${getUrl(url)}`].filter(Boolean) as string[],\n name: 'SocketClosedError',\n })\n this.url = url\n }\n}\n\nexport type TimeoutErrorType = TimeoutError & {\n name: 'TimeoutError'\n}\nexport class TimeoutError extends BaseError {\n url: string\n constructor({\n body,\n url,\n }: {\n body: { [x: string]: unknown } | { [y: string]: unknown }[]\n url: string\n }) {\n super('The request took too long to respond.', {\n details: 'The request timed out.',\n metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],\n name: 'TimeoutError',\n })\n this.url = url\n }\n}\n","import type { Prettify } from '../types/utils.js'\nimport { BaseError } from './base.js'\nimport { RpcRequestError } from './request.js'\n\nconst unknownErrorCode = -1\n\nexport type RpcErrorCode =\n | -1\n | -32700 // Parse error\n | -32600 // Invalid request\n | -32601 // Method not found\n | -32602 // Invalid params\n | -32603 // Internal error\n | -32000 // Invalid input\n | -32001 // Resource not found\n | -32002 // Resource unavailable\n | -32003 // Transaction rejected\n | -32004 // Method not supported\n | -32005 // Limit exceeded\n | -32006 // JSON-RPC version not supported\n | -32042 // Method not found\n\ntype RpcErrorOptions = {\n code?: code | (number & {}) | undefined\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n name?: string | undefined\n shortMessage: string\n}\n\n/**\n * Error subclass implementing JSON RPC 2.0 errors and Ethereum RPC errors per EIP-1474.\n *\n * - EIP https://eips.ethereum.org/EIPS/eip-1474\n */\nexport type RpcErrorType = RpcError & { name: 'RpcError' }\nexport class RpcError extends BaseError {\n code: code_ | (number & {})\n\n constructor(\n cause: Error,\n {\n code,\n docsPath,\n metaMessages,\n name,\n shortMessage,\n }: RpcErrorOptions,\n ) {\n super(shortMessage, {\n cause,\n docsPath,\n metaMessages:\n metaMessages || (cause as { metaMessages?: string[] })?.metaMessages,\n name: name || 'RpcError',\n })\n this.name = name || cause.name\n this.code = (\n cause instanceof RpcRequestError ? cause.code : (code ?? unknownErrorCode)\n ) as code_\n }\n}\n\nexport type ProviderRpcErrorCode =\n | 4001 // User Rejected Request\n | 4100 // Unauthorized\n | 4200 // Unsupported Method\n | 4900 // Disconnected\n | 4901 // Chain Disconnected\n | 4902 // Chain Not Recognized\n | 5700 // Unsupported non-optional capability\n | 5710 // Unsupported chain id\n | 5720 // Duplicate ID\n | 5730 // Unknown bundle id\n | 5740 // Bundle too large\n | 5750 // Atomic-ready wallet rejected upgrade\n | 5760 // Atomicity not supported\n | 7000 // WalletConnect Session Settlement Failed\n\n/**\n * Error subclass implementing Ethereum Provider errors per EIP-1193.\n *\n * - EIP https://eips.ethereum.org/EIPS/eip-1193\n */\nexport type ProviderRpcErrorType = ProviderRpcError & {\n name: 'ProviderRpcError'\n}\nexport class ProviderRpcError<\n T = undefined,\n> extends RpcError {\n data?: T | undefined\n\n constructor(\n cause: Error,\n options: Prettify<\n RpcErrorOptions & {\n data?: T | undefined\n }\n >,\n ) {\n super(cause, options)\n\n this.data = options.data\n }\n}\n\n/**\n * Subclass for a \"Parse error\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type ParseRpcErrorType = ParseRpcError & {\n code: -32700\n name: 'ParseRpcError'\n}\nexport class ParseRpcError extends RpcError {\n static code = -32700 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ParseRpcError.code,\n name: 'ParseRpcError',\n shortMessage:\n 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.',\n })\n }\n}\n\n/**\n * Subclass for a \"Invalid request\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InvalidRequestRpcErrorType = InvalidRequestRpcError & {\n code: -32600\n name: 'InvalidRequestRpcError'\n}\nexport class InvalidRequestRpcError extends RpcError {\n static code = -32600 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InvalidRequestRpcError.code,\n name: 'InvalidRequestRpcError',\n shortMessage: 'JSON is not a valid request object.',\n })\n }\n}\n\n/**\n * Subclass for a \"Method not found\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type MethodNotFoundRpcErrorType = MethodNotFoundRpcError & {\n code: -32601\n name: 'MethodNotFoundRpcError'\n}\nexport class MethodNotFoundRpcError extends RpcError {\n static code = -32601 as const\n\n constructor(cause: Error, { method }: { method?: string } = {}) {\n super(cause, {\n code: MethodNotFoundRpcError.code,\n name: 'MethodNotFoundRpcError',\n shortMessage: `The method${method ? ` \"${method}\"` : ''} does not exist / is not available.`,\n })\n }\n}\n\n/**\n * Subclass for an \"Invalid params\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InvalidParamsRpcErrorType = InvalidParamsRpcError & {\n code: -32602\n name: 'InvalidParamsRpcError'\n}\nexport class InvalidParamsRpcError extends RpcError {\n static code = -32602 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InvalidParamsRpcError.code,\n name: 'InvalidParamsRpcError',\n shortMessage: [\n 'Invalid parameters were provided to the RPC method.',\n 'Double check you have provided the correct parameters.',\n ].join('\\n'),\n })\n }\n}\n\n/**\n * Subclass for an \"Internal error\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InternalRpcErrorType = InternalRpcError & {\n code: -32603\n name: 'InternalRpcError'\n}\nexport class InternalRpcError extends RpcError {\n static code = -32603 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InternalRpcError.code,\n name: 'InternalRpcError',\n shortMessage: 'An internal error was received.',\n })\n }\n}\n\n/**\n * Subclass for an \"Invalid input\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type InvalidInputRpcErrorType = InvalidInputRpcError & {\n code: -32000\n name: 'InvalidInputRpcError'\n}\nexport class InvalidInputRpcError extends RpcError {\n static code = -32000 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: InvalidInputRpcError.code,\n name: 'InvalidInputRpcError',\n shortMessage: [\n 'Missing or invalid parameters.',\n 'Double check you have provided the correct parameters.',\n ].join('\\n'),\n })\n }\n}\n\n/**\n * Subclass for a \"Resource not found\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type ResourceNotFoundRpcErrorType = ResourceNotFoundRpcError & {\n code: -32001\n name: 'ResourceNotFoundRpcError'\n}\nexport class ResourceNotFoundRpcError extends RpcError {\n override name = 'ResourceNotFoundRpcError'\n static code = -32001 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ResourceNotFoundRpcError.code,\n name: 'ResourceNotFoundRpcError',\n shortMessage: 'Requested resource not found.',\n })\n }\n}\n\n/**\n * Subclass for a \"Resource unavailable\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type ResourceUnavailableRpcErrorType = ResourceUnavailableRpcError & {\n code: -32002\n name: 'ResourceUnavailableRpcError'\n}\nexport class ResourceUnavailableRpcError extends RpcError {\n static code = -32002 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ResourceUnavailableRpcError.code,\n name: 'ResourceUnavailableRpcError',\n shortMessage: 'Requested resource not available.',\n })\n }\n}\n\n/**\n * Subclass for a \"Transaction rejected\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type TransactionRejectedRpcErrorType = TransactionRejectedRpcError & {\n code: -32003\n name: 'TransactionRejectedRpcError'\n}\nexport class TransactionRejectedRpcError extends RpcError {\n static code = -32003 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: TransactionRejectedRpcError.code,\n name: 'TransactionRejectedRpcError',\n shortMessage: 'Transaction creation failed.',\n })\n }\n}\n\n/**\n * Subclass for a \"Method not supported\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type MethodNotSupportedRpcErrorType = MethodNotSupportedRpcError & {\n code: -32004\n name: 'MethodNotSupportedRpcError'\n}\nexport class MethodNotSupportedRpcError extends RpcError {\n static code = -32004 as const\n\n constructor(cause: Error, { method }: { method?: string } = {}) {\n super(cause, {\n code: MethodNotSupportedRpcError.code,\n name: 'MethodNotSupportedRpcError',\n shortMessage: `Method${method ? ` \"${method}\"` : ''} is not supported.`,\n })\n }\n}\n\n/**\n * Subclass for a \"Limit exceeded\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type LimitExceededRpcErrorType = LimitExceededRpcError & {\n code: -32005\n name: 'LimitExceededRpcError'\n}\nexport class LimitExceededRpcError extends RpcError {\n static code = -32005 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: LimitExceededRpcError.code,\n name: 'LimitExceededRpcError',\n shortMessage: 'Request exceeds defined limit.',\n })\n }\n}\n\n/**\n * Subclass for a \"JSON-RPC version not supported\" EIP-1474 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes\n */\nexport type JsonRpcVersionUnsupportedErrorType =\n JsonRpcVersionUnsupportedError & {\n code: -32006\n name: 'JsonRpcVersionUnsupportedError'\n }\nexport class JsonRpcVersionUnsupportedError extends RpcError {\n static code = -32006 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: JsonRpcVersionUnsupportedError.code,\n name: 'JsonRpcVersionUnsupportedError',\n shortMessage: 'Version of JSON-RPC protocol is not supported.',\n })\n }\n}\n\n/**\n * Subclass for a \"User Rejected Request\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type UserRejectedRequestErrorType = UserRejectedRequestError & {\n code: 4001\n name: 'UserRejectedRequestError'\n}\nexport class UserRejectedRequestError extends ProviderRpcError {\n static code = 4001 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UserRejectedRequestError.code,\n name: 'UserRejectedRequestError',\n shortMessage: 'User rejected the request.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unauthorized\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type UnauthorizedProviderErrorType = UnauthorizedProviderError & {\n code: 4100\n name: 'UnauthorizedProviderError'\n}\nexport class UnauthorizedProviderError extends ProviderRpcError {\n static code = 4100 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnauthorizedProviderError.code,\n name: 'UnauthorizedProviderError',\n shortMessage:\n 'The requested method and/or account has not been authorized by the user.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unsupported Method\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type UnsupportedProviderMethodErrorType =\n UnsupportedProviderMethodError & {\n code: 4200\n name: 'UnsupportedProviderMethodError'\n }\nexport class UnsupportedProviderMethodError extends ProviderRpcError {\n static code = 4200 as const\n\n constructor(cause: Error, { method }: { method?: string } = {}) {\n super(cause, {\n code: UnsupportedProviderMethodError.code,\n name: 'UnsupportedProviderMethodError',\n shortMessage: `The Provider does not support the requested method${method ? ` \" ${method}\"` : ''}.`,\n })\n }\n}\n\n/**\n * Subclass for an \"Disconnected\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type ProviderDisconnectedErrorType = ProviderDisconnectedError & {\n code: 4900\n name: 'ProviderDisconnectedError'\n}\nexport class ProviderDisconnectedError extends ProviderRpcError {\n static code = 4900 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ProviderDisconnectedError.code,\n name: 'ProviderDisconnectedError',\n shortMessage: 'The Provider is disconnected from all chains.',\n })\n }\n}\n\n/**\n * Subclass for an \"Chain Disconnected\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type ChainDisconnectedErrorType = ChainDisconnectedError & {\n code: 4901\n name: 'ChainDisconnectedError'\n}\nexport class ChainDisconnectedError extends ProviderRpcError {\n static code = 4901 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: ChainDisconnectedError.code,\n name: 'ChainDisconnectedError',\n shortMessage: 'The Provider is not connected to the requested chain.',\n })\n }\n}\n\n/**\n * Subclass for an \"Switch Chain\" EIP-1193 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors\n */\nexport type SwitchChainErrorType = SwitchChainError & {\n code: 4902\n name: 'SwitchChainError'\n}\nexport class SwitchChainError extends ProviderRpcError {\n static code = 4902 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: SwitchChainError.code,\n name: 'SwitchChainError',\n shortMessage: 'An error occurred when attempting to switch chain.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unsupported non-optional capability\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type UnsupportedNonOptionalCapabilityErrorType =\n UnsupportedNonOptionalCapabilityError & {\n code: 5700\n name: 'UnsupportedNonOptionalCapabilityError'\n }\nexport class UnsupportedNonOptionalCapabilityError extends ProviderRpcError {\n static code = 5700 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnsupportedNonOptionalCapabilityError.code,\n name: 'UnsupportedNonOptionalCapabilityError',\n shortMessage:\n 'This Wallet does not support a capability that was not marked as optional.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unsupported chain id\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type UnsupportedChainIdErrorType = UnsupportedChainIdError & {\n code: 5710\n name: 'UnsupportedChainIdError'\n}\nexport class UnsupportedChainIdError extends ProviderRpcError {\n static code = 5710 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnsupportedChainIdError.code,\n name: 'UnsupportedChainIdError',\n shortMessage: 'This Wallet does not support the requested chain ID.',\n })\n }\n}\n\n/**\n * Subclass for an \"Duplicate ID\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type DuplicateIdErrorType = DuplicateIdError & {\n code: 5720\n name: 'DuplicateIdError'\n}\nexport class DuplicateIdError extends ProviderRpcError {\n static code = 5720 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: DuplicateIdError.code,\n name: 'DuplicateIdError',\n shortMessage: 'There is already a bundle submitted with this ID.',\n })\n }\n}\n\n/**\n * Subclass for an \"Unknown bundle ID\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type UnknownBundleIdErrorType = UnknownBundleIdError & {\n code: 5730\n name: 'UnknownBundleIdError'\n}\nexport class UnknownBundleIdError extends ProviderRpcError {\n static code = 5730 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: UnknownBundleIdError.code,\n name: 'UnknownBundleIdError',\n shortMessage: 'This bundle id is unknown / has not been submitted',\n })\n }\n}\n\n/**\n * Subclass for an \"Bundle too large\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type BundleTooLargeErrorType = BundleTooLargeError & {\n code: 5740\n name: 'BundleTooLargeError'\n}\nexport class BundleTooLargeError extends ProviderRpcError {\n static code = 5740 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: BundleTooLargeError.code,\n name: 'BundleTooLargeError',\n shortMessage: 'The call bundle is too large for the Wallet to process.',\n })\n }\n}\n\n/**\n * Subclass for an \"Atomic-ready wallet rejected upgrade\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type AtomicReadyWalletRejectedUpgradeErrorType =\n AtomicReadyWalletRejectedUpgradeError & {\n code: 5750\n name: 'AtomicReadyWalletRejectedUpgradeError'\n }\nexport class AtomicReadyWalletRejectedUpgradeError extends ProviderRpcError {\n static code = 5750 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: AtomicReadyWalletRejectedUpgradeError.code,\n name: 'AtomicReadyWalletRejectedUpgradeError',\n shortMessage:\n 'The Wallet can support atomicity after an upgrade, but the user rejected the upgrade.',\n })\n }\n}\n\n/**\n * Subclass for an \"Atomicity not supported\" EIP-5792 error.\n *\n * EIP https://eips.ethereum.org/EIPS/eip-5792#error-codes\n */\nexport type AtomicityNotSupportedErrorType = AtomicityNotSupportedError & {\n code: 5760\n name: 'AtomicityNotSupportedError'\n}\nexport class AtomicityNotSupportedError extends ProviderRpcError {\n static code = 5760 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: AtomicityNotSupportedError.code,\n name: 'AtomicityNotSupportedError',\n shortMessage:\n 'The wallet does not support atomic execution but the request requires it.',\n })\n }\n}\n\n/**\n * Subclass for a \"Session Settlement Failed\" WalletConnect error.\n *\n * WalletConnect https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes\n */\nexport type WalletConnectSessionSettlementErrorType =\n WalletConnectSessionSettlementError & {\n code: 7000\n name: 'WalletConnectSessionSettlementError'\n }\nexport class WalletConnectSessionSettlementError extends ProviderRpcError {\n static code = 7000 as const\n\n constructor(cause: Error) {\n super(cause, {\n code: WalletConnectSessionSettlementError.code,\n name: 'WalletConnectSessionSettlementError',\n shortMessage: 'WalletConnect session settlement failed.',\n })\n }\n}\n\n/**\n * Subclass for an unknown RPC error.\n */\nexport type UnknownRpcErrorType = UnknownRpcError & {\n name: 'UnknownRpcError'\n}\nexport class UnknownRpcError extends RpcError {\n constructor(cause: Error) {\n super(cause, {\n name: 'UnknownRpcError',\n shortMessage: 'An unknown RPC error occurred.',\n })\n }\n}\n","import type { Abi, Address } from 'abitype'\n\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n ContractFunctionExecutionError,\n type ContractFunctionExecutionErrorType,\n ContractFunctionRevertedError,\n type ContractFunctionRevertedErrorType,\n ContractFunctionZeroDataError,\n type ContractFunctionZeroDataErrorType,\n RawContractError,\n} from '../../errors/contract.js'\nimport { RpcRequestError } from '../../errors/request.js'\nimport { InternalRpcError, InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\nconst EXECUTION_REVERTED_ERROR_CODE = 3\n\nexport type GetContractErrorReturnType = Omit<\n ContractFunctionExecutionErrorType,\n 'cause'\n> & {\n cause:\n | cause\n | ContractFunctionZeroDataErrorType\n | ContractFunctionRevertedErrorType\n}\n\nexport function getContractError>(\n err: err,\n {\n abi,\n address,\n args,\n docsPath,\n functionName,\n sender,\n }: {\n abi: Abi\n args: any\n address?: Address | undefined\n docsPath?: string | undefined\n functionName: string\n sender?: Address | undefined\n },\n): GetContractErrorReturnType {\n const error = (\n err instanceof RawContractError\n ? err\n : err instanceof BaseError\n ? err.walk((err) => 'data' in (err as Error)) || err.walk()\n : {}\n ) as BaseError\n const { code, data, details, message, shortMessage } =\n error as RawContractError\n\n const cause = (() => {\n if (err instanceof AbiDecodingZeroDataError)\n return new ContractFunctionZeroDataError({ functionName, cause: err })\n if (\n ([EXECUTION_REVERTED_ERROR_CODE, InternalRpcError.code].includes(code) &&\n (data || details || message || shortMessage)) ||\n (code === InvalidInputRpcError.code &&\n details === 'execution reverted' &&\n data)\n ) {\n return new ContractFunctionRevertedError({\n abi,\n data: typeof data === 'object' ? data.data : data,\n functionName,\n message:\n error instanceof RpcRequestError\n ? details\n : (shortMessage ?? message),\n cause: err,\n })\n }\n return err\n })()\n\n return new ContractFunctionExecutionError(cause as BaseError, {\n abi,\n args,\n contractAddress: address,\n docsPath,\n functionName,\n sender,\n }) as GetContractErrorReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport {\n type ChecksumAddressErrorType,\n checksumAddress,\n} from '../../utils/address/getAddress.js'\nimport {\n type Keccak256ErrorType,\n keccak256,\n} from '../../utils/hash/keccak256.js'\n\nexport type PublicKeyToAddressErrorType =\n | ChecksumAddressErrorType\n | Keccak256ErrorType\n | ErrorType\n\n/**\n * @description Converts an ECDSA public key to an address.\n *\n * @param publicKey The public key to convert.\n *\n * @returns The address.\n */\nexport function publicKeyToAddress(publicKey: Hex): Address {\n const address = keccak256(`0x${publicKey.substring(4)}`).substring(26)\n return checksumAddress(`0x${address}`) as Address\n}\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n view: DataView,\n byteOffset: number,\n value: bigint,\n isLE: boolean\n): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\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> extends Hash {\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 super();\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: Input): this {\n aexists(this);\n data = toBytes(data);\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 setBigUint64(view, 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 should be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen should 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;\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://datatracker.ietf.org/doc/html/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, 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);\nexport class SHA256 extends HashMD {\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\n constructor(outputLen: number = 32) {\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\nexport class SHA224 extends SHA256 {\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\nexport class SHA512 extends HashMD {\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 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(outputLen: number = 64) {\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\nexport class SHA384 extends SHA512 {\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\nexport class SHA512_224 extends SHA512 {\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\nexport class SHA512_256 extends SHA512 {\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.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256: CHash = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash = /* @__PURE__ */ createHasher(() => new SHA224());\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash = /* @__PURE__ */ createHasher(() => new SHA384());\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 = /* @__PURE__ */ createHasher(() => new SHA512_256());\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 = /* @__PURE__ */ createHasher(() => new SHA512_224());\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, Hash, toBytes, type CHash, type Input } from './utils.ts';\n\nexport class HMAC> extends Hash> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, _key: Input) {\n super();\n ahash(hash);\n const key = toBytes(_key);\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Input): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: HMAC): HMAC {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): HMAC {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Input, message: Input): Uint8Array;\n create(hash: CHash, key: Input): HMAC;\n} = (hash: CHash, key: Input, message: Input): Uint8Array =>\n new HMAC(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Input) => new HMAC(hash, key);\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// 100 lines of code in the file are duplicated from noble-hashes (utils).\n// This is OK: `abstract` directory does not use noble-hashes.\n// User may opt-in into using different hashing library. This way, noble-hashes\n// won't be included into their bundle.\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n (message: Uint8Array | string): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\nexport function abytes(item: unknown): void {\n if (!isBytes(item)) throw new Error('Uint8Array expected');\n}\n\nexport function abool(title: string, value: boolean): void {\n if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean =\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// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n abytes(bytes);\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'private key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n let res: Uint8Array;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes(hex);\n } catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n } else if (isBytes(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n } else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\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\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n// Global symbols in both browsers and Node.js since v11\n// See https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([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// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\nconst u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\nconst u8fr = (arr: ArrayLike) => Uint8Array.from(arr); // another shortcut\ntype Pred = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred) => T {\n if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8fr([0x00]), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(u8fr([0x01]), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n bigint: (val: any): boolean => typeof val === 'bigint',\n function: (val: any): boolean => typeof val === 'function',\n boolean: (val: any): boolean => typeof val === 'boolean',\n string: (val: any): boolean => typeof val === 'string',\n stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes(val),\n isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n array: (val: any): boolean => Array.isArray(val),\n field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap> = { [K in keyof T]?: Validator };\n// type Record = { [P in K]: T; }\n\nexport function validateObject>(\n object: T,\n validators: ValMap,\n optValidators: ValMap = {}\n): T {\n const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n const val = object[fieldName as keyof typeof object];\n if (isOptional && val === undefined) return;\n if (!checkVal(val, object)) {\n throw new Error(\n 'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n );\n }\n };\n for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n","/**\n * Utils for modular division and finite fields.\n * A finite field over 11 is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { anumber } from '@noble/hashes/utils';\nimport {\n bitMask,\n bytesToNumberBE,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from './utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _8n = /* @__PURE__ */ BigInt(8);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * TODO: remove.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp: IField, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n // Throw if root^2 != n\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\nfunction sqrt5mod8(Fp: IField, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\n// TODO: Commented-out for now. Provide test vectors.\n// Tonelli is too slow for extension fields Fp2.\n// That means we can't use sqrt (c1, c2...) even for initialization constants.\n// if (P % _16n === _9n) return sqrt9mod16;\n// // prettier-ignore\n// function sqrt9mod16(Fp: IField, n: T, p7div16?: bigint) {\n// if (p7div16 === undefined) p7div16 = (Fp.ORDER + BigInt(7)) / _16n;\n// const c1 = Fp.sqrt(Fp.neg(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n// const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n// const c3 = Fp.sqrt(Fp.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n// const c4 = p7div16; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n// let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n// let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1\n// const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1\n// let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1\n// const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n// const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n// tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n// tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n// const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n// return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2\n// }\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): (Fp: IField, n: T) => T {\n // Initialization (precomputation).\n if (P < BigInt(3)) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp: IField, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): (Fp: IField, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) not implemented, see above\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField {\n ORDER: bigint;\n isLE: boolean;\n BYTES: number;\n BITS: number;\n MASK: bigint;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField(field: IField): IField {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'isSafeInteger',\n BITS: 'isSafeInteger',\n } as Record;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n return validateObject(field, opts);\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp: IField, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp: IField, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv(Fp: IField, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp: IField, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp: IField, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\n// CURVE.n lengths\nexport function nLength(\n n: bigint,\n nBitLength?: number\n): {\n nBitLength: number;\n nByteLength: number;\n} {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField & Required, 'isOdd'>>;\n/**\n * Initializes a finite field over prime.\n * Major performance optimizations:\n * * a) denormalized operations like mulN instead of mul\n * * b) same object shape: never add or remove keys\n * * c) Object.freeze\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n * @param ORDER prime positive bigint\n * @param bitLen how many bits the field consumes\n * @param isLE (def: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n ORDER: bigint,\n bitLen?: number,\n isLE = false,\n redef: Partial> = {}\n): Readonly {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen);\n if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP: ReturnType; // cached sqrtP\n const f: Readonly = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n\n inv: (num) => invert(num, ORDER),\n sqrt:\n redef.sqrt ||\n ((n) => {\n if (!sqrtP) sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes) => {\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n } as FpField);\n return Object.freeze(f);\n}\n\nexport function FpSqrtOdd(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n hash: string | Uint8Array,\n groupOrder: bigint,\n isLE = false\n): bigint {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(\n 'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n );\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type IField, nLength, validateField } from './modular.ts';\nimport { bitLen, bitMask, validateObject } from './utils.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint = {\n x: T;\n y: T;\n} & { z?: never; t?: never };\n\nexport interface Group> {\n double(): T;\n negate(): T;\n add(other: T): T;\n subtract(other: T): T;\n equals(other: T): boolean;\n multiply(scalar: bigint): T;\n}\n\nexport type GroupConstructor = {\n BASE: T;\n ZERO: T;\n};\nexport type Mapper = (i: T[]) => T[];\n\nfunction constTimeNegate>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\n\nfunction getW(P: any): number {\n return pointWindowSizes.get(P) || 1;\n}\n\nexport type IWNAF> = {\n constTimeNegate: >(condition: boolean, item: T) => T;\n hasPrecomputes(elm: T): boolean;\n unsafeLadder(elm: T, n: bigint, p?: T): T;\n precomputeWindow(elm: T, W: number): Group[];\n getPrecomputes(W: number, P: T, transform: Mapper): T[];\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T };\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc?: T): T;\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T };\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T;\n setWindowSize(P: T, W: number): void;\n};\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport function wNAF>(c: GroupConstructor, bits: number): IWNAF {\n return {\n constTimeNegate,\n\n hasPrecomputes(elm: T) {\n return getW(elm) !== 1;\n },\n\n // non-const time multiplication ladder\n unsafeLadder(elm: T, n: bigint, p = c.ZERO) {\n let d: T = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n },\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param elm Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(elm: T, W: number): Group[] {\n const { windows, windowSize } = calcWOpts(W, bits);\n const points: T[] = [];\n let p: T = elm;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n },\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @returns real and fake (for const-time) points\n */\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T } {\n // Smaller version:\n // https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n // TODO: check the scalar is less than group order?\n // wNAF behavior is undefined otherwise. But have to carefully remove\n // other checks before wNAF. ORDER == bits here.\n // Accumulators\n let p = c.ZERO;\n let f = c.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(constTimeNegate(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(constTimeNegate(isNeg, precomputes[offset]));\n }\n }\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n },\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc: T = c.ZERO): T {\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n return acc;\n },\n\n getPrecomputes(W: number, P: T, transform: Mapper): T[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(P);\n if (!comp) {\n comp = this.precomputeWindow(P, W) as T[];\n if (W !== 1) pointPrecomputes.set(P, transform(comp));\n }\n return comp;\n },\n\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T } {\n const W = getW(P);\n return this.wNAF(W, this.getPrecomputes(W, P, transform), n);\n },\n\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T {\n const W = getW(P);\n if (W === 1) return this.unsafeLadder(P, n, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, P, transform), n, prev);\n },\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n\n setWindowSize(P: T, W: number) {\n validateW(W, bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n },\n };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka private keys / bigints)\n */\nexport function pippenger>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n scalars: bigint[]\n): T {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as T;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n windowSize: number\n): (scalars: bigint[]) => T {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: T) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): T => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve = {\n Fp: IField; // Field over which we'll do calculations (Fp)\n n: bigint; // Curve order, total count of valid points in the field\n nBitLength?: number; // bit length of curve order\n nByteLength?: number; // byte length of curve order\n h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n hEff?: bigint; // Number to multiply to clear cofactor\n Gx: T; // base point X coordinate\n Gy: T; // base point Y coordinate\n allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\nexport function validateBasic(\n curve: BasicCurve & T\n): Readonly<\n {\n readonly nBitLength: number;\n readonly nByteLength: number;\n } & BasicCurve &\n T & {\n p: bigint;\n }\n> {\n validateField(curve.Fp);\n validateObject(\n curve,\n {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n },\n {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n }\n );\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n } as const);\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Parameters\n *\n * To initialize a weierstrass curve, one needs to pass following params:\n *\n * * a: formula param\n * * b: formula param\n * * Fp: finite field of prime characteristic P; may be complex (Fp2). Arithmetics is done in field\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * Gx: Base point (x, y) aka generator point. Gx = x coordinate\n * * Gy: ...y coordinate\n * * h: cofactor, usually 1. h*n = curve group order (n is only subgroup order)\n * * lowS: whether to enable (default) or disable \"low-s\" non-malleable signatures\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// prettier-ignore\nimport {\n pippenger, validateBasic, wNAF,\n type AffinePoint, type BasicCurve, type Group, type GroupConstructor\n} from './curve.ts';\n// prettier-ignore\nimport {\n Field,\n FpInvertBatch,\n getMinHashLength, invert, mapHashToField, mod, validateField,\n type IField\n} from './modular.ts';\n// prettier-ignore\nimport {\n aInRange, abool,\n bitMask,\n bytesToHex, bytesToNumberBE, concatBytes, createHmacDrbg, ensureBytes, hexToBytes,\n inRange, isBytes, memoized, numberToBytesBE, numberToHexUnpadded, validateObject,\n type CHash, type Hex, type PrivKey\n} from './utils.ts';\n\nexport type { AffinePoint };\ntype HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n splitScalar: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\nexport type BasicWCurve = BasicCurve & {\n // Params: a, b\n a: T;\n b: T;\n\n // Optional params\n allowedPrivateKeyLengths?: readonly number[]; // for P521\n wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n endo?: EndomorphismOpts;\n // When a cofactor != 1, there can be an effective methods to:\n // 1. Determine whether a point is torsion-free\n isTorsionFree?: (c: ProjConstructor, point: ProjPointType) => boolean;\n // 2. Clear torsion component\n clearCofactor?: (c: ProjConstructor, point: ProjPointType) => ProjPointType;\n};\n\nexport type Entropy = Hex | boolean;\nexport type SignOpts = { lowS?: boolean; extraEntropy?: Entropy; prehash?: boolean };\nexport type VerOpts = { lowS?: boolean; prehash?: boolean; format?: 'compact' | 'der' | undefined };\n\nfunction validateSigVerOpts(opts: SignOpts | VerOpts) {\n if (opts.lowS !== undefined) abool('lowS', opts.lowS);\n if (opts.prehash !== undefined) abool('prehash', opts.prehash);\n}\n\n// Instance for 3d XYZ points\nexport interface ProjPointType extends Group> {\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n get x(): T;\n get y(): T;\n toAffine(iz?: T): AffinePoint;\n toHex(isCompressed?: boolean): string;\n toRawBytes(isCompressed?: boolean): Uint8Array;\n\n assertValidity(): void;\n hasEvenY(): boolean;\n multiplyUnsafe(scalar: bigint): ProjPointType;\n multiplyAndAddUnsafe(Q: ProjPointType, a: bigint, b: bigint): ProjPointType | undefined;\n isTorsionFree(): boolean;\n clearCofactor(): ProjPointType;\n _setWindowSize(windowSize: number): void;\n}\n// Static methods for 3d XYZ points\nexport interface ProjConstructor extends GroupConstructor> {\n new (x: T, y: T, z: T): ProjPointType;\n fromAffine(p: AffinePoint): ProjPointType;\n fromHex(hex: Hex): ProjPointType;\n fromPrivateKey(privateKey: PrivKey): ProjPointType;\n normalizeZ(points: ProjPointType[]): ProjPointType[];\n msm(points: ProjPointType[], scalars: bigint[]): ProjPointType;\n}\n\nexport type CurvePointsType = BasicWCurve & {\n // Bytes\n fromBytes?: (bytes: Uint8Array) => AffinePoint;\n toBytes?: (c: ProjConstructor, point: ProjPointType, isCompressed: boolean) => Uint8Array;\n};\n\nexport type CurvePointsTypeWithLength = Readonly<\n CurvePointsType & { nByteLength: number; nBitLength: number }\n>;\n\nfunction validatePointOpts(curve: CurvePointsType): CurvePointsTypeWithLength {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n a: 'field',\n b: 'field',\n },\n {\n allowInfinityPoint: 'boolean',\n allowedPrivateKeyLengths: 'array',\n clearCofactor: 'function',\n fromBytes: 'function',\n isTorsionFree: 'function',\n toBytes: 'function',\n wrapPrivateKey: 'boolean',\n }\n );\n const { endo, Fp, a } = opts;\n if (endo) {\n if (!Fp.eql(a, Fp.ZERO)) {\n throw new Error('invalid endo: CURVE.a must be 0');\n }\n if (\n typeof endo !== 'object' ||\n typeof endo.beta !== 'bigint' ||\n typeof endo.splitScalar !== 'function'\n ) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"splitScalar\": function');\n }\n }\n return Object.freeze({ ...opts } as const);\n}\n\nexport type CurvePointsRes = {\n CURVE: ReturnType>;\n ProjectivePoint: ProjConstructor;\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n weierstrassEquation: (x: T) => T;\n isWithinCurveOrder: (num: bigint) => boolean;\n};\n\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\nfunction numToSizedHex(num: bigint, size: number): string {\n return bytesToHex(numberToBytesBE(num, size));\n}\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function weierstrassPoints(opts: CurvePointsType): CurvePointsRes {\n const CURVE = validatePointOpts(opts);\n const { Fp } = CURVE; // All curves has same field / group length as for now, but they can differ\n const Fn = Field(CURVE.n, CURVE.nBitLength);\n\n const toBytes =\n CURVE.toBytes ||\n ((_c: ProjConstructor, point: ProjPointType, _isCompressed: boolean) => {\n const a = point.toAffine();\n return concatBytes(Uint8Array.from([0x04]), Fp.toBytes(a.x), Fp.toBytes(a.y));\n });\n const fromBytes =\n CURVE.fromBytes ||\n ((bytes: Uint8Array) => {\n // const head = bytes[0];\n const tail = bytes.subarray(1);\n // if (head !== 0x04) throw new Error('Only non-compressed encoding is supported');\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n });\n\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x: T): T {\n const { a, b } = CURVE;\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n // Valid group elements reside in range 1..n-1\n function isWithinCurveOrder(num: bigint): boolean {\n return inRange(num, _1n, CURVE.n);\n }\n // Validates if priv key is valid and converts it to bigint.\n // Supports options allowedPrivateKeyLengths and wrapPrivateKey.\n function normPrivateKeyToScalar(key: PrivKey): bigint {\n const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n: N } = CURVE;\n if (lengths && typeof key !== 'bigint') {\n if (isBytes(key)) key = bytesToHex(key);\n // Normalize to hex string, pad. E.g. P521 would norm 130-132 char hex to 132-char bytes\n if (typeof key !== 'string' || !lengths.includes(key.length))\n throw new Error('invalid private key');\n key = key.padStart(nByteLength * 2, '0');\n }\n let num: bigint;\n try {\n num =\n typeof key === 'bigint'\n ? key\n : bytesToNumberBE(ensureBytes('private key', key, nByteLength));\n } catch (error) {\n throw new Error(\n 'invalid private key, expected hex or ' + nByteLength + ' bytes, got ' + typeof key\n );\n }\n if (wrapPrivateKey) num = mod(num, N); // disabled by default, enabled for BLS\n aInRange('private key', num, _1n, N); // num in range [1..N-1]\n return num;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint => {\n const { px: x, py: y, pz: z } = p;\n // Fast-path for normalized points\n if (Fp.eql(z, Fp.ONE)) return { x, y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(z);\n const ax = Fp.mul(x, iz);\n const ay = Fp.mul(y, iz);\n const zz = Fp.mul(z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x: ax, y: ay };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (CURVE.allowInfinityPoint && !Fp.is0(p.py)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n // Check if x, y are valid field elements\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not FE');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates: (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n * Default Point works in 2d / affine coordinates: (x, y)\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements ProjPointType {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n\n constructor(px: T, py: T, pz: T) {\n if (px == null || !Fp.isValid(px)) throw new Error('x required');\n if (py == null || !Fp.isValid(py) || Fp.is0(py)) throw new Error('y required');\n if (pz == null || !Fp.isValid(pz)) throw new Error('z required');\n this.px = px;\n this.py = py;\n this.pz = pz;\n Object.freeze(this);\n }\n\n // Does not validate if the point is on-curve.\n // Use fromHex instead, or call assertValidity() later.\n static fromAffine(p: AffinePoint): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n const is0 = (i: T) => Fp.eql(i, Fp.ZERO);\n // fromAffine(x:0, y:0) would produce (x:0, y:0, z:1), but we need (x:0, y:1, z:0)\n if (is0(x) && is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\n static normalizeZ(points: Point[]): Point[] {\n const toInv = FpInvertBatch(\n Fp,\n points.map((p) => p.pz)\n );\n return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);\n }\n\n /**\n * Converts hash string or Uint8Array to Point.\n * @param hex short/long ECDSA hex\n */\n static fromHex(hex: Hex): Point {\n const P = Point.fromAffine(fromBytes(ensureBytes('pointHex', hex)));\n P.assertValidity();\n return P;\n }\n\n // Multiplies generator point by privateKey.\n static fromPrivateKey(privateKey: PrivKey) {\n return Point.BASE.multiply(normPrivateKeyToScalar(privateKey));\n }\n\n // Multiscalar Multiplication\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n\n // \"Private method\", don't use it directly\n _setWindowSize(windowSize: number) {\n wnaf.setWindowSize(this, windowSize);\n }\n\n // A point on curve is valid if it conforms to equation.\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (Fp.isOdd) return !Fp.isOdd(y);\n throw new Error(\"Field doesn't support isOdd\");\n }\n\n /**\n * Compare one point to another.\n */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /**\n * Flips point to one corresponding to (x, -y) in Affine coordinates.\n */\n negate(): Point {\n return new Point(this.px, Fp.neg(this.py), this.pz);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { px: X1, py: Y1, pz: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0() {\n return this.equals(Point.ZERO);\n }\n\n private wNAF(n: bigint): { p: Point; f: Point } {\n return wnaf.wNAFCached(this, n, Point.normalizeZ);\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed private key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', sc, _0n, N);\n const I = Point.ZERO;\n if (sc === _0n) return I;\n if (this.is0() || sc === _1n) return this;\n\n // Case a: no endomorphism. Case b: has precomputes.\n if (!endo || wnaf.hasPrecomputes(this))\n return wnaf.wNAFCachedUnsafe(this, sc, Point.normalizeZ);\n\n // Case c: endomorphism\n /** See docs for {@link EndomorphismOpts} */\n let { k1neg, k1, k2neg, k2 } = endo.splitScalar(sc);\n let k1p = I;\n let k2p = I;\n let d: Point = this;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) k1p = k1p.add(d);\n if (k2 & _1n) k2p = k2p.add(d);\n d = d.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n if (k1neg) k1p = k1p.negate();\n if (k2neg) k2p = k2p.negate();\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n return k1p.add(k2p);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', scalar, _1n, N);\n let point: Point, fake: Point; // Fake point is used to const-time mult\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = endo.splitScalar(scalar);\n let { p: k1p, f: f1p } = this.wNAF(k1);\n let { p: k2p, f: f2p } = this.wNAF(k2);\n k1p = wnaf.constTimeNegate(k1neg, k1p);\n k2p = wnaf.constTimeNegate(k2neg, k2p);\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n point = k1p.add(k2p);\n fake = f1p.add(f2p);\n } else {\n const { p, f } = this.wNAF(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return Point.normalizeZ([point, fake])[0];\n }\n\n /**\n * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly.\n * Not using Strauss-Shamir trick: precomputation tables are faster.\n * The trick could be useful if both P and Q are not G (not in our case).\n * @returns non-zero affine point\n */\n multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n const G = Point.BASE; // No Strauss-Shamir trick: we have 10% faster G precomputes\n const mul = (\n P: Point,\n a: bigint // Select faster multiply() method\n ) => (a === _0n || a === _1n || !P.equals(G) ? P.multiplyUnsafe(a) : P.multiply(a));\n const sum = mul(this, a).add(mul(Q, b));\n return sum.is0() ? undefined : sum;\n }\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (x, y, z) ∋ (x=x/z, y=y/z)\n toAffine(iz?: T): AffinePoint {\n return toAffineMemo(this, iz);\n }\n isTorsionFree(): boolean {\n const { h: cofactor, isTorsionFree } = CURVE;\n if (cofactor === _1n) return true; // No subgroups, always torsion-free\n if (isTorsionFree) return isTorsionFree(Point, this);\n throw new Error('isTorsionFree() has not been declared for the elliptic curve');\n }\n clearCofactor(): Point {\n const { h: cofactor, clearCofactor } = CURVE;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(CURVE.h);\n }\n\n toRawBytes(isCompressed = true): Uint8Array {\n abool('isCompressed', isCompressed);\n this.assertValidity();\n return toBytes(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n abool('isCompressed', isCompressed);\n return bytesToHex(this.toRawBytes(isCompressed));\n }\n }\n const { endo, nBitLength } = CURVE;\n const wnaf = wNAF(Point, endo ? Math.ceil(nBitLength / 2) : nBitLength);\n return {\n CURVE,\n ProjectivePoint: Point as ProjConstructor,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n };\n}\n\n// Instance\nexport interface SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n assertValidity(): void;\n addRecoveryBit(recovery: number): RecoveredSignatureType;\n hasHighS(): boolean;\n normalizeS(): SignatureType;\n recoverPublicKey(msgHash: Hex): ProjPointType;\n toCompactRawBytes(): Uint8Array;\n toCompactHex(): string;\n toDERRawBytes(isCompressed?: boolean): Uint8Array;\n toDERHex(isCompressed?: boolean): string;\n}\nexport type RecoveredSignatureType = SignatureType & {\n readonly recovery: number;\n};\n// Static methods\nexport type SignatureConstructor = {\n new (r: bigint, s: bigint): SignatureType;\n fromCompact(hex: Hex): SignatureType;\n fromDER(hex: Hex): SignatureType;\n};\ntype SignatureLike = { r: bigint; s: bigint };\n\nexport type PubKey = Hex | ProjPointType;\n\nexport type CurveType = BasicWCurve & {\n hash: CHash; // CHash not FHash because we need outputLen for DRBG\n hmac: HmacFnSync;\n randomBytes: (bytesLength?: number) => Uint8Array;\n lowS?: boolean;\n bits2int?: (bytes: Uint8Array) => bigint;\n bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\n\nfunction validateOpts(\n curve: CurveType\n): Readonly {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n hash: 'hash',\n hmac: 'function',\n randomBytes: 'function',\n },\n {\n bits2int: 'function',\n bits2int_modN: 'function',\n lowS: 'boolean',\n }\n );\n return Object.freeze({ lowS: true, ...opts } as const);\n}\n\nexport type CurveFn = {\n CURVE: ReturnType;\n getPublicKey: (privateKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (privateA: PrivKey, publicB: Hex, isCompressed?: boolean) => Uint8Array;\n sign: (msgHash: Hex, privKey: PrivKey, opts?: SignOpts) => RecoveredSignatureType;\n verify: (signature: Hex | SignatureLike, msgHash: Hex, publicKey: Hex, opts?: VerOpts) => boolean;\n ProjectivePoint: ProjConstructor;\n Signature: SignatureConstructor;\n utils: {\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n isValidPrivateKey(privateKey: PrivKey): boolean;\n randomPrivateKey: () => Uint8Array;\n precompute: (windowSize?: number, point?: ProjPointType) => ProjPointType;\n };\n};\n\n/**\n * Creates short weierstrass curve and ECDSA signature methods for it.\n * @example\n * import { Field } from '@noble/curves/abstract/modular';\n * // Before that, define BigInt-s: a, b, p, n, Gx, Gy\n * const curve = weierstrass({ a, b, Fp: Field(p), n, Gx, Gy, h: 1n })\n */\nexport function weierstrass(curveDef: CurveType): CurveFn {\n const CURVE = validateOpts(curveDef) as ReturnType;\n const { Fp, n: CURVE_ORDER, nByteLength, nBitLength } = CURVE;\n const compressedLen = Fp.BYTES + 1; // e.g. 33 for 32\n const uncompressedLen = 2 * Fp.BYTES + 1; // e.g. 65 for 32\n\n function modN(a: bigint) {\n return mod(a, CURVE_ORDER);\n }\n function invN(a: bigint) {\n return invert(a, CURVE_ORDER);\n }\n\n const {\n ProjectivePoint: Point,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n } = weierstrassPoints({\n ...CURVE,\n toBytes(_c, point, isCompressed: boolean): Uint8Array {\n const a = point.toAffine();\n const x = Fp.toBytes(a.x);\n const cat = concatBytes;\n abool('isCompressed', isCompressed);\n if (isCompressed) {\n return cat(Uint8Array.from([point.hasEvenY() ? 0x02 : 0x03]), x);\n } else {\n return cat(Uint8Array.from([0x04]), x, Fp.toBytes(a.y));\n }\n },\n fromBytes(bytes: Uint8Array) {\n const len = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // this.assertValidity() is done inside of fromHex\n if (len === compressedLen && (head === 0x02 || head === 0x03)) {\n const x = bytesToNumberBE(tail);\n if (!inRange(x, _1n, Fp.ORDER)) throw new Error('Point is not on curve');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: bigint;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const suffix = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('Point is not on curve' + suffix);\n }\n const isYOdd = (y & _1n) === _1n;\n // ECDSA\n const isHeadOdd = (head & 1) === 1;\n if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n return { x, y };\n } else if (len === uncompressedLen && head === 0x04) {\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n } else {\n const cl = compressedLen;\n const ul = uncompressedLen;\n throw new Error(\n 'invalid Point, expected length of ' + cl + ', or uncompressed ' + ul + ', got ' + len\n );\n }\n },\n });\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n\n function normalizeS(s: bigint) {\n return isBiggerThanHalfOrder(s) ? modN(-s) : s;\n }\n // slice bytes num\n const slcNum = (b: Uint8Array, from: number, to: number) => bytesToNumberBE(b.slice(from, to));\n\n /**\n * ECDSA signature with its (r, s) properties. Supports DER & compact representations.\n */\n class Signature implements SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n constructor(r: bigint, s: bigint, recovery?: number) {\n aInRange('r', r, _1n, CURVE_ORDER); // r in [1..N]\n aInRange('s', s, _1n, CURVE_ORDER); // s in [1..N]\n this.r = r;\n this.s = s;\n if (recovery != null) this.recovery = recovery;\n Object.freeze(this);\n }\n\n // pair (bytes of r, bytes of s)\n static fromCompact(hex: Hex) {\n const l = nByteLength;\n hex = ensureBytes('compactSignature', hex, l * 2);\n return new Signature(slcNum(hex, 0, l), slcNum(hex, l, 2 * l));\n }\n\n // DER encoded ECDSA signature\n // https://bitcoin.stackexchange.com/questions/57644/what-are-the-parts-of-a-bitcoin-transaction-input-script\n static fromDER(hex: Hex) {\n const { r, s } = DER.toSig(ensureBytes('DER', hex));\n return new Signature(r, s);\n }\n\n /**\n * @todo remove\n * @deprecated\n */\n assertValidity(): void {}\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(msgHash: Hex): typeof Point.BASE {\n const { r, s, recovery: rec } = this;\n const h = bits2int_modN(ensureBytes('msgHash', msgHash)); // Truncate hash\n if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n const radj = rec === 2 || rec === 3 ? r + CURVE.n : r;\n if (radj >= Fp.ORDER) throw new Error('recovery id 2 or 3 invalid');\n const prefix = (rec & 1) === 0 ? '02' : '03';\n const R = Point.fromHex(prefix + numToSizedHex(radj, Fp.BYTES));\n const ir = invN(radj); // r^-1\n const u1 = modN(-h * ir); // -hr^-1\n const u2 = modN(s * ir); // sr^-1\n const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2); // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1)\n if (!Q) throw new Error('point at infinify'); // unsafe is fine: no priv data leaked\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, modN(-this.s), this.recovery) : this;\n }\n\n // DER-encoded\n toDERRawBytes() {\n return hexToBytes(this.toDERHex());\n }\n toDERHex() {\n return DER.hexFromSig(this);\n }\n\n // padded bytes of r, then padded bytes of s\n toCompactRawBytes() {\n return hexToBytes(this.toCompactHex());\n }\n toCompactHex() {\n const l = nByteLength;\n return numToSizedHex(this.r, l) + numToSizedHex(this.s, l);\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n const utils = {\n isValidPrivateKey(privateKey: PrivKey) {\n try {\n normPrivateKeyToScalar(privateKey);\n return true;\n } catch (error) {\n return false;\n }\n },\n normPrivateKeyToScalar: normPrivateKeyToScalar,\n\n /**\n * Produces cryptographically secure private key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n randomPrivateKey: (): Uint8Array => {\n const length = getMinHashLength(CURVE.n);\n return mapHashToField(CURVE.randomBytes(length), CURVE.n);\n },\n\n /**\n * Creates precompute table for an arbitrary EC point. Makes point \"cached\".\n * Allows to massively speed-up `point.multiply(scalar)`.\n * @returns cached point\n * @example\n * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey));\n * fast.multiply(privKey); // much faster ECDH now\n */\n precompute(windowSize = 8, point = Point.BASE): typeof Point.BASE {\n point._setWindowSize(windowSize);\n point.multiply(BigInt(3)); // 3 is arbitrary, just need any number here\n return point;\n },\n };\n\n /**\n * Computes public key for a private key. Checks for validity of the private key.\n * @param privateKey private key\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(privateKey: PrivKey, isCompressed = true): Uint8Array {\n return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n if (typeof item === 'bigint') return false;\n if (item instanceof Point) return true;\n const arr = ensureBytes('key', item);\n const len = arr.length;\n const fpl = Fp.BYTES;\n const compLen = fpl + 1; // e.g. 33 for 32\n const uncompLen = 2 * fpl + 1; // e.g. 65 for 32\n if (CURVE.allowedPrivateKeyLengths || nByteLength === compLen) {\n return undefined;\n } else {\n return len === compLen || len === uncompLen;\n }\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from private key and public key.\n * Checks: 1) private key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param privateA private key\n * @param publicB different public key\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(privateA: PrivKey, publicB: Hex, isCompressed = true): Uint8Array {\n if (isProbPub(privateA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicB) === false) throw new Error('second arg must be public key');\n const b = Point.fromHex(publicB); // check for being on-curve\n return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed);\n }\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n CURVE.bits2int ||\n function (bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - nBitLength; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n CURVE.bits2int_modN ||\n function (bytes: Uint8Array): bigint {\n return modN(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // NOTE: pads output with zero as per spec\n const ORDER_MASK = bitMask(nBitLength);\n /**\n * Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`.\n */\n function int2octets(num: bigint): Uint8Array {\n aInRange('num < 2^' + nBitLength, num, _0n, ORDER_MASK);\n // works with order, can have different size than numToField!\n return numberToBytesBE(num, nByteLength);\n }\n\n // Steps A, D of RFC6979 3.2\n // Creates RFC6979 seed; converts msg/privKey to numbers.\n // Used only in sign, not in verify.\n // NOTE: we cannot assume here that msgHash has same amount of bytes as curve order,\n // this will be invalid at least for P521. Also it can be bigger for P224 + SHA256\n function prepSig(msgHash: Hex, privateKey: PrivKey, opts = defaultSigOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { hash, randomBytes } = CURVE;\n let { lowS, prehash, extraEntropy: ent } = opts; // generates low-s sigs by default\n if (lowS == null) lowS = true; // RFC6979 3.2: we skip step A, because we already provide hash\n msgHash = ensureBytes('msgHash', msgHash);\n validateSigVerOpts(opts);\n if (prehash) msgHash = ensureBytes('prehashed msgHash', hash(msgHash));\n\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with nBitLength % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(msgHash);\n const d = normPrivateKeyToScalar(privateKey); // validate private key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (ent != null && ent !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n const e = ent === true ? randomBytes(Fp.BYTES) : ent; // generate random bytes OR pass as-is\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!isWithinCurveOrder(k)) return; // Important: all mod() calls here must be done over N\n const ik = invN(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = Gk\n const r = modN(q.x); // r = q.x mod n\n if (r === _0n) return;\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n const s = modN(ik * modN(m + r * d)); // Not using blinding here\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = normalizeS(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n }\n return { seed, k2sig };\n }\n const defaultSigOpts: SignOpts = { lowS: CURVE.lowS, prehash: false };\n const defaultVerOpts: VerOpts = { lowS: CURVE.lowS, prehash: false };\n\n /**\n * Signs message hash with a private key.\n * ```\n * sign(m, d, k) where\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr)/k mod n\n * ```\n * @param msgHash NOT message. msg needs to be hashed to `msgHash`, or use `prehash`.\n * @param privKey private key\n * @param opts lowS for non-malleable sigs. extraEntropy for mixing randomness into k. prehash will hash first arg.\n * @returns signature with recovery param\n */\n function sign(msgHash: Hex, privKey: PrivKey, opts = defaultSigOpts): RecoveredSignature {\n const { seed, k2sig } = prepSig(msgHash, privKey, opts); // Steps A, D of RFC6979 3.2.\n const C = CURVE;\n const drbg = createHmacDrbg(C.hash.outputLen, C.nByteLength, C.hmac);\n return drbg(seed, k2sig); // Steps B, C, D, E, F, G\n }\n\n // Enable precomputes. Slows down first publicKey computation by 20ms.\n Point.BASE._setWindowSize(8);\n // utils.precompute(8, ProjectivePoint.BASE)\n\n /**\n * Verifies a signature against message hash and public key.\n * Rejects lowS signatures by default: to override,\n * specify option `{lowS: false}`. Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * U1 = hs^-1 mod n\n * U2 = rs^-1 mod n\n * R = U1⋅G - U2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Hex | SignatureLike,\n msgHash: Hex,\n publicKey: Hex,\n opts = defaultVerOpts\n ): boolean {\n const sg = signature;\n msgHash = ensureBytes('msgHash', msgHash);\n publicKey = ensureBytes('publicKey', publicKey);\n const { lowS, prehash, format } = opts;\n\n // Verify opts, deduce signature format\n validateSigVerOpts(opts);\n if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n if (format !== undefined && format !== 'compact' && format !== 'der')\n throw new Error('format must be compact or der');\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj =\n !isHex &&\n !format &&\n typeof sg === 'object' &&\n sg !== null &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n\n let _sig: Signature | undefined = undefined;\n let P: ProjPointType;\n try {\n if (isObj) _sig = new Signature(sg.r, sg.s);\n if (isHex) {\n // Signature can be represented in 2 ways: compact (2*nByteLength) & DER (variable-length).\n // Since DER can also be 2*nByteLength bytes, we check for it first.\n try {\n if (format !== 'compact') _sig = Signature.fromDER(sg);\n } catch (derError) {\n if (!(derError instanceof DER.Err)) throw derError;\n }\n if (!_sig && format !== 'der') _sig = Signature.fromCompact(sg);\n }\n P = Point.fromHex(publicKey);\n } catch (error) {\n return false;\n }\n if (!_sig) return false;\n if (lowS && _sig.hasHighS()) return false;\n if (prehash) msgHash = CURVE.hash(msgHash);\n const { r, s } = _sig;\n const h = bits2int_modN(msgHash); // Cannot use fields methods, since it is group element\n const is = invN(s); // s^-1\n const u1 = modN(h * is); // u1 = hs^-1 mod n\n const u2 = modN(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2)?.toAffine(); // R = u1⋅G + u2⋅P\n if (!R) return false;\n const v = modN(R.x);\n return v === r;\n }\n return {\n CURVE,\n getPublicKey,\n getSharedSecret,\n sign,\n verify,\n ProjectivePoint: Point,\n Signature,\n utils,\n };\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(\n Fp: IField,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(\n Fp: IField,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n if (!Fp.isValid(opts.A) || !Fp.isValid(opts.B) || !Fp.isValid(opts.Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, opts.Z);\n if (!Fp.isOdd) throw new Error('Fp.isOdd is not implemented!');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, opts.Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, opts.B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(opts.Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, opts.A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, opts.A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, opts.B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac } from '@noble/hashes/hmac';\nimport { concatBytes, randomBytes } from '@noble/hashes/utils';\nimport type { CHash } from './abstract/utils.ts';\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): {\n hash: CHash;\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => Uint8Array;\n randomBytes: typeof randomBytes;\n} {\n return {\n hash,\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => hmac(hash, key, concatBytes(...msgs)),\n randomBytes,\n };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, ...getHash(hash) });\n return { ...create(defHash), create };\n}\n","/**\n * hash-to-curve from RFC 9380.\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * https://www.rfc-editor.org/rfc/rfc9380\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport type { AffinePoint, Group, GroupConstructor } from './curve.ts';\nimport { FpInvertBatch, type IField, mod } from './modular.ts';\nimport type { CHash } from './utils.ts';\nimport { abytes, bytesToNumberBE, concatBytes, utf8ToBytes, validateObject } from './utils.ts';\n\nexport type UnicodeOrBytes = string | Uint8Array;\n\n/**\n * * `DST` is a domain separation tag, defined in section 2.2.5\n * * `p` characteristic of F, where F is a finite field of characteristic p and order q = p^m\n * * `m` is extension degree (1 for prime fields)\n * * `k` is the target security target in bits (e.g. 128), from section 5.1\n * * `expand` is `xmd` (SHA2, SHA3, BLAKE) or `xof` (SHAKE, BLAKE-XOF)\n * * `hash` conforming to `utils.CHash` interface, with `outputLen` / `blockLen` props\n */\nexport type Opts = {\n DST: UnicodeOrBytes;\n p: bigint;\n m: number;\n k: number;\n expand: 'xmd' | 'xof';\n hash: CHash;\n};\n\n// Octet Stream to Integer. \"spec\" implementation of os2ip is 2.5x slower vs bytesToNumberBE.\nconst os2ip = bytesToNumberBE;\n\n// Integer to Octet Stream (numberToBytesBE)\nfunction i2osp(value: number, length: number): Uint8Array {\n anum(value);\n anum(length);\n if (value < 0 || value >= 1 << (8 * length)) throw new Error('invalid I2OSP input: ' + value);\n const res = Array.from({ length }).fill(0) as number[];\n for (let i = length - 1; i >= 0; i--) {\n res[i] = value & 0xff;\n value >>>= 8;\n }\n return new Uint8Array(res);\n}\n\nfunction strxor(a: Uint8Array, b: Uint8Array): Uint8Array {\n const arr = new Uint8Array(a.length);\n for (let i = 0; i < a.length; i++) {\n arr[i] = a[i] ^ b[i];\n }\n return arr;\n}\n\nfunction anum(item: unknown): void {\n if (!Number.isSafeInteger(item)) throw new Error('number expected');\n}\n\n/**\n * Produces a uniformly random byte string using a cryptographic hash function H that outputs b bits.\n * [RFC 9380 5.3.1](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.1).\n */\nexport function expand_message_xmd(\n msg: Uint8Array,\n DST: Uint8Array,\n lenInBytes: number,\n H: CHash\n): Uint8Array {\n abytes(msg);\n abytes(DST);\n anum(lenInBytes);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n if (DST.length > 255) DST = H(concatBytes(utf8ToBytes('H2C-OVERSIZE-DST-'), DST));\n const { outputLen: b_in_bytes, blockLen: r_in_bytes } = H;\n const ell = Math.ceil(lenInBytes / b_in_bytes);\n if (lenInBytes > 65535 || ell > 255) throw new Error('expand_message_xmd: invalid lenInBytes');\n const DST_prime = concatBytes(DST, i2osp(DST.length, 1));\n const Z_pad = i2osp(0, r_in_bytes);\n const l_i_b_str = i2osp(lenInBytes, 2); // len_in_bytes_str\n const b = new Array(ell);\n const b_0 = H(concatBytes(Z_pad, msg, l_i_b_str, i2osp(0, 1), DST_prime));\n b[0] = H(concatBytes(b_0, i2osp(1, 1), DST_prime));\n for (let i = 1; i <= ell; i++) {\n const args = [strxor(b_0, b[i - 1]), i2osp(i + 1, 1), DST_prime];\n b[i] = H(concatBytes(...args));\n }\n const pseudo_random_bytes = concatBytes(...b);\n return pseudo_random_bytes.slice(0, lenInBytes);\n}\n\n/**\n * Produces a uniformly random byte string using an extendable-output function (XOF) H.\n * 1. The collision resistance of H MUST be at least k bits.\n * 2. H MUST be an XOF that has been proved indifferentiable from\n * a random oracle under a reasonable cryptographic assumption.\n * [RFC 9380 5.3.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.2).\n */\nexport function expand_message_xof(\n msg: Uint8Array,\n DST: Uint8Array,\n lenInBytes: number,\n k: number,\n H: CHash\n): Uint8Array {\n abytes(msg);\n abytes(DST);\n anum(lenInBytes);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n // DST = H('H2C-OVERSIZE-DST-' || a_very_long_DST, Math.ceil((lenInBytes * k) / 8));\n if (DST.length > 255) {\n const dkLen = Math.ceil((2 * k) / 8);\n DST = H.create({ dkLen }).update(utf8ToBytes('H2C-OVERSIZE-DST-')).update(DST).digest();\n }\n if (lenInBytes > 65535 || DST.length > 255)\n throw new Error('expand_message_xof: invalid lenInBytes');\n return (\n H.create({ dkLen: lenInBytes })\n .update(msg)\n .update(i2osp(lenInBytes, 2))\n // 2. DST_prime = DST || I2OSP(len(DST), 1)\n .update(DST)\n .update(i2osp(DST.length, 1))\n .digest()\n );\n}\n\n/**\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * [RFC 9380 5.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.2).\n * @param msg a byte string containing the message to hash\n * @param count the number of elements of F to output\n * @param options `{DST: string, p: bigint, m: number, k: number, expand: 'xmd' | 'xof', hash: H}`, see above\n * @returns [u_0, ..., u_(count - 1)], a list of field elements.\n */\nexport function hash_to_field(msg: Uint8Array, count: number, options: Opts): bigint[][] {\n validateObject(options, {\n DST: 'stringOrUint8Array',\n p: 'bigint',\n m: 'isSafeInteger',\n k: 'isSafeInteger',\n hash: 'hash',\n });\n const { p, k, m, hash, expand, DST: _DST } = options;\n abytes(msg);\n anum(count);\n const DST = typeof _DST === 'string' ? utf8ToBytes(_DST) : _DST;\n const log2p = p.toString(2).length;\n const L = Math.ceil((log2p + k) / 8); // section 5.1 of ietf draft link above\n const len_in_bytes = count * m * L;\n let prb; // pseudo_random_bytes\n if (expand === 'xmd') {\n prb = expand_message_xmd(msg, DST, len_in_bytes, hash);\n } else if (expand === 'xof') {\n prb = expand_message_xof(msg, DST, len_in_bytes, k, hash);\n } else if (expand === '_internal_pass') {\n // for internal tests only\n prb = msg;\n } else {\n throw new Error('expand must be \"xmd\" or \"xof\"');\n }\n const u = new Array(count);\n for (let i = 0; i < count; i++) {\n const e = new Array(m);\n for (let j = 0; j < m; j++) {\n const elm_offset = L * (j + i * m);\n const tv = prb.subarray(elm_offset, elm_offset + L);\n e[j] = mod(os2ip(tv), p);\n }\n u[i] = e;\n }\n return u;\n}\n\nexport type XY = (x: T, y: T) => { x: T; y: T };\nexport type XYRatio = [T[], T[], T[], T[]]; // xn/xd, yn/yd\nexport function isogenyMap>(field: F, map: XYRatio): XY {\n // Make same order as in spec\n const coeff = map.map((i) => Array.from(i).reverse());\n return (x: T, y: T) => {\n const [xn, xd, yn, yd] = coeff.map((val) =>\n val.reduce((acc, i) => field.add(field.mul(acc, x), i))\n );\n // 6.6.3\n // Exceptional cases of iso_map are inputs that cause the denominator of\n // either rational function to evaluate to zero; such cases MUST return\n // the identity point on E.\n const [xd_inv, yd_inv] = FpInvertBatch(field, [xd, yd], true);\n x = field.mul(xn, xd_inv); // xNum / xDen\n y = field.mul(y, field.mul(yn, yd_inv)); // y * (yNum / yDev)\n return { x, y };\n };\n}\n\n/** Point interface, which curves must implement to work correctly with the module. */\nexport interface H2CPoint extends Group> {\n add(rhs: H2CPoint): H2CPoint;\n toAffine(iz?: bigint): AffinePoint;\n clearCofactor(): H2CPoint;\n assertValidity(): void;\n}\n\nexport interface H2CPointConstructor extends GroupConstructor> {\n fromAffine(ap: AffinePoint): H2CPoint;\n}\n\nexport type MapToCurve = (scalar: bigint[]) => AffinePoint;\n\n// Separated from initialization opts, so users won't accidentally change per-curve parameters\n// (changing DST is ok!)\nexport type htfBasicOpts = { DST: UnicodeOrBytes };\nexport type HTFMethod = (msg: Uint8Array, options?: htfBasicOpts) => H2CPoint;\nexport type MapMethod = (scalars: bigint[]) => H2CPoint;\nexport type Hasher = {\n hashToCurve: HTFMethod;\n encodeToCurve: HTFMethod;\n mapToCurve: MapMethod;\n defaults: Opts & { encodeDST?: UnicodeOrBytes };\n};\n\n/** Creates hash-to-curve methods from EC Point and mapToCurve function. */\nexport function createHasher(\n Point: H2CPointConstructor,\n mapToCurve: MapToCurve,\n defaults: Opts & { encodeDST?: UnicodeOrBytes }\n): Hasher {\n if (typeof mapToCurve !== 'function') throw new Error('mapToCurve() must be defined');\n function map(num: bigint[]) {\n return Point.fromAffine(mapToCurve(num));\n }\n function clear(initial: H2CPoint) {\n const P = initial.clearCofactor();\n if (P.equals(Point.ZERO)) return Point.ZERO; // zero will throw in assert\n P.assertValidity();\n return P;\n }\n\n return {\n defaults,\n\n // Encodes byte string to elliptic curve.\n // hash_to_curve from https://www.rfc-editor.org/rfc/rfc9380#section-3\n hashToCurve(msg: Uint8Array, options?: htfBasicOpts): H2CPoint {\n const u = hash_to_field(msg, 2, { ...defaults, DST: defaults.DST, ...options } as Opts);\n const u0 = map(u[0]);\n const u1 = map(u[1]);\n return clear(u0.add(u1));\n },\n\n // Encodes byte string to elliptic curve.\n // encode_to_curve from https://www.rfc-editor.org/rfc/rfc9380#section-3\n encodeToCurve(msg: Uint8Array, options?: htfBasicOpts): H2CPoint {\n const u = hash_to_field(msg, 1, { ...defaults, DST: defaults.encodeDST, ...options } as Opts);\n return clear(map(u[0]));\n },\n\n // Same as encodeToCurve, but without hash\n mapToCurve(scalars: bigint[]): H2CPoint {\n if (!Array.isArray(scalars)) throw new Error('expected array of bigints');\n for (const i of scalars)\n if (typeof i !== 'bigint') throw new Error('expected array of bigints');\n return clear(map(scalars));\n },\n };\n}\n","/**\n * NIST secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Seems to be rigid (not backdoored)\n * [as per discussion](https://bitcointalk.org/index.php?topic=289795.msg3183975#msg3183975).\n *\n * secp256k1 belongs to Koblitz curves: it has efficiently computable endomorphism.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n * [See explanation](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2';\nimport { randomBytes } from '@noble/hashes/utils';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport { createHasher, type Hasher, type HTFMethod, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mod, pow2 } from './abstract/modular.ts';\nimport type { Hex, PrivKey } from './abstract/utils.ts';\nimport {\n aInRange,\n bytesToNumberBE,\n concatBytes,\n ensureBytes,\n inRange,\n numberToBytesBE,\n} from './abstract/utils.ts';\nimport { mapToCurveSimpleSWU, type ProjPointType as PointType } from './abstract/weierstrass.ts';\n\nconst secp256k1P = BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f');\nconst secp256k1N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst divNearest = (a: bigint, b: bigint) => (a + b / _2n) / b;\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1P;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1P, undefined, undefined, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const priv = secp256k1.utils.randomPrivateKey();\n * const pub = secp256k1.getPublicKey(priv);\n * const msg = new Uint8Array(32).fill(1); // message hash (not message) in ecdsa\n * const sig = secp256k1.sign(msg, priv); // `{prehash: true}` option is available\n * const isValid = secp256k1.verify(sig, msg, pub) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n {\n a: _0n,\n b: BigInt(7),\n Fp: Fpk1,\n n: secp256k1N,\n Gx: BigInt('55066263022277343669578718895168534326250603453777594175500187360389116729240'),\n Gy: BigInt('32670510020758816978083085130507043184471273380659243275938904335757337482424'),\n h: BigInt(1),\n lowS: true, // Allow only low-S signatures by default in sign() and verify()\n endo: {\n // Endomorphism, see above\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n splitScalar: (k: bigint) => {\n const n = secp256k1N;\n const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15');\n const b1 = -_1n * BigInt('0xe4437ed6010e88286f547fa90abfe4c3');\n const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8');\n const b2 = a1;\n const POW_2_128 = BigInt('0x100000000000000000000000000000000'); // (2n**128n).toString(16)\n\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n let k1 = mod(k - c1 * a1 - c2 * a2, n);\n let k2 = mod(-c1 * b1 - c2 * b2, n);\n const k1neg = k1 > POW_2_128;\n const k2neg = k2 > POW_2_128;\n if (k1neg) k1 = n - k1;\n if (k2neg) k2 = n - k2;\n if (k1 > POW_2_128 || k2 > POW_2_128) {\n throw new Error('splitScalar: Endomorphism failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n },\n },\n },\n sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(Uint8Array.from(tag, (c) => c.charCodeAt(0)));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType) => point.toRawBytes(true).slice(1);\nconst numTo32b = (n: bigint) => numberToBytesBE(n, 32);\nconst modP = (x: bigint) => mod(x, secp256k1P);\nconst modN = (x: bigint) => mod(x, secp256k1N);\nconst Point = /* @__PURE__ */ (() => secp256k1.ProjectivePoint)();\nconst GmulAdd = (Q: PointType, a: bigint, b: bigint) =>\n Point.BASE.multiplyAndAddUnsafe(Q, a, b);\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n let d_ = secp256k1.utils.normPrivateKeyToScalar(priv); // same method executed in fromPrivateKey\n let p = Point.fromPrivateKey(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = p.hasEvenY() ? d_ : modN(-d_);\n return { scalar: scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType {\n aInRange('x', x, _1n, secp256k1P); // Fail if x ≥ p.\n const xx = modP(x * x);\n const c = modP(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = sqrtMod(c); // Let y = c^(p+1)/4 mod p.\n if (y % _2n !== _0n) y = modP(-y); // Return the unique point P such that x(P) = x and\n const p = new Point(x, y, _1n); // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return modN(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(privateKey: Hex): Uint8Array {\n return schnorrGetExtPubKey(privateKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Hex,\n privateKey: PrivKey,\n auxRand: Hex = randomBytes(32)\n): Uint8Array {\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(privateKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = numTo32b(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n const k_ = modN(num(rand)); // Let k' = int(rand) mod n\n if (k_ === _0n) throw new Error('sign failed: k is zero'); // Fail if k' = 0.\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(k_); // Let R = k'⋅G.\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(numTo32b(modN(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!inRange(r, _1n, secp256k1P)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!inRange(s, _1n, secp256k1N)) return false;\n const e = challenge(numTo32b(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n const R = GmulAdd(P, s, modN(-e)); // R = s⋅G - e⋅P\n if (!R || !R.hasEvenY() || R.toAffine().x !== r) return false; // -eP == (n-e)P\n return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n utils: {\n randomPrivateKey: () => Uint8Array;\n lift_x: typeof lift_x;\n pointToBytes: (point: PointType) => Uint8Array;\n numberToBytesBE: typeof numberToBytesBE;\n bytesToNumberBE: typeof bytesToNumberBE;\n taggedHash: typeof taggedHash;\n mod: typeof mod;\n };\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const priv = schnorr.utils.randomPrivateKey();\n * const pub = schnorr.getPublicKey(priv);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, priv);\n * const isValid = schnorr.verify(sig, msg, pub);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => ({\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n utils: {\n randomPrivateKey: secp256k1.utils.randomPrivateKey,\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n taggedHash,\n mod,\n },\n}))();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: Hasher = /* @__PURE__ */ (() =>\n createHasher(\n secp256k1.ProjectivePoint,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n } as const\n ))();\n\nexport const hashToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.hashToCurve)();\n\nexport const encodeToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.encodeToCurve)();\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { size } from '../data/size.js'\nimport {\n type HexToNumberErrorType,\n hexToBigInt,\n hexToNumber,\n} from '../encoding/fromHex.js'\nimport { toHex } from '../encoding/toHex.js'\n\nexport type RecoverPublicKeyParameters = {\n hash: Hex | ByteArray\n signature: Hex | ByteArray | Signature\n}\n\nexport type RecoverPublicKeyReturnType = Hex\n\nexport type RecoverPublicKeyErrorType =\n | HexToNumberErrorType\n | IsHexErrorType\n | ErrorType\n\nexport async function recoverPublicKey({\n hash,\n signature,\n}: RecoverPublicKeyParameters): Promise {\n const hashHex = isHex(hash) ? hash : toHex(hash)\n\n const { secp256k1 } = await import('@noble/curves/secp256k1')\n const signature_ = (() => {\n // typeof signature: `Signature`\n if (typeof signature === 'object' && 'r' in signature && 's' in signature) {\n const { r, s, v, yParity } = signature\n const yParityOrV = Number(yParity ?? v)!\n const recoveryBit = toRecoveryBit(yParityOrV)\n return new secp256k1.Signature(\n hexToBigInt(r),\n hexToBigInt(s),\n ).addRecoveryBit(recoveryBit)\n }\n\n // typeof signature: `Hex | ByteArray`\n const signatureHex = isHex(signature) ? signature : toHex(signature)\n if (size(signatureHex) !== 65) throw new Error('invalid signature length')\n const yParityOrV = hexToNumber(`0x${signatureHex.slice(130)}`)\n const recoveryBit = toRecoveryBit(yParityOrV)\n return secp256k1.Signature.fromCompact(\n signatureHex.substring(2, 130),\n ).addRecoveryBit(recoveryBit)\n })()\n\n const publicKey = signature_\n .recoverPublicKey(hashHex.substring(2))\n .toHex(false)\n return `0x${publicKey}`\n}\n\nfunction toRecoveryBit(yParityOrV: number) {\n if (yParityOrV === 0 || yParityOrV === 1) return yParityOrV\n if (yParityOrV === 27) return 0\n if (yParityOrV === 28) return 1\n throw new Error('Invalid yParityOrV value')\n}\n","import type { Address } from 'abitype'\n\nimport { publicKeyToAddress } from '../../accounts/utils/publicKeyToAddress.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { recoverPublicKey } from './recoverPublicKey.js'\n\nexport type RecoverAddressParameters = {\n hash: Hex | ByteArray\n signature: Hex | ByteArray | Signature\n}\n\nexport type RecoverAddressReturnType = Address\n\nexport type RecoverAddressErrorType = ErrorType\n\nexport async function recoverAddress({\n hash,\n signature,\n}: RecoverAddressParameters): Promise {\n return publicKeyToAddress(await recoverPublicKey({ hash, signature }))\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type CreateCursorErrorType,\n type Cursor,\n createCursor,\n} from '../cursor.js'\n\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from './toHex.js'\n\nexport type RecursiveArray = T | readonly RecursiveArray[]\n\ntype To = 'hex' | 'bytes'\n\ntype Encodable = {\n length: number\n encode(cursor: Cursor): void\n}\n\nexport type ToRlpReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type ToRlpErrorType =\n | CreateCursorErrorType\n | BytesToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\nexport function toRlp(\n bytes: RecursiveArray | RecursiveArray,\n to: to | To | undefined = 'hex',\n): ToRlpReturnType {\n const encodable = getEncodable(bytes)\n const cursor = createCursor(new Uint8Array(encodable.length))\n encodable.encode(cursor)\n\n if (to === 'hex') return bytesToHex(cursor.bytes) as ToRlpReturnType\n return cursor.bytes as ToRlpReturnType\n}\n\nexport type BytesToRlpErrorType = ToRlpErrorType | ErrorType\n\nexport function bytesToRlp(\n bytes: RecursiveArray,\n to: to | To | undefined = 'bytes',\n): ToRlpReturnType {\n return toRlp(bytes, to)\n}\n\nexport type HexToRlpErrorType = ToRlpErrorType | ErrorType\n\nexport function hexToRlp(\n hex: RecursiveArray,\n to: to | To | undefined = 'hex',\n): ToRlpReturnType {\n return toRlp(hex, to)\n}\n\nfunction getEncodable(\n bytes: RecursiveArray | RecursiveArray,\n): Encodable {\n if (Array.isArray(bytes))\n return getEncodableList(bytes.map((x) => getEncodable(x)))\n return getEncodableBytes(bytes as any)\n}\n\nfunction getEncodableList(list: Encodable[]): Encodable {\n const bodyLength = list.reduce((acc, x) => acc + x.length, 0)\n\n const sizeOfBodyLength = getSizeOfLength(bodyLength)\n const length = (() => {\n if (bodyLength <= 55) return 1 + bodyLength\n return 1 + sizeOfBodyLength + bodyLength\n })()\n\n return {\n length,\n encode(cursor: Cursor) {\n if (bodyLength <= 55) {\n cursor.pushByte(0xc0 + bodyLength)\n } else {\n cursor.pushByte(0xc0 + 55 + sizeOfBodyLength)\n if (sizeOfBodyLength === 1) cursor.pushUint8(bodyLength)\n else if (sizeOfBodyLength === 2) cursor.pushUint16(bodyLength)\n else if (sizeOfBodyLength === 3) cursor.pushUint24(bodyLength)\n else cursor.pushUint32(bodyLength)\n }\n for (const { encode } of list) {\n encode(cursor)\n }\n },\n }\n}\n\nfunction getEncodableBytes(bytesOrHex: ByteArray | Hex): Encodable {\n const bytes =\n typeof bytesOrHex === 'string' ? hexToBytes(bytesOrHex) : bytesOrHex\n\n const sizeOfBytesLength = getSizeOfLength(bytes.length)\n const length = (() => {\n if (bytes.length === 1 && bytes[0] < 0x80) return 1\n if (bytes.length <= 55) return 1 + bytes.length\n return 1 + sizeOfBytesLength + bytes.length\n })()\n\n return {\n length,\n encode(cursor: Cursor) {\n if (bytes.length === 1 && bytes[0] < 0x80) {\n cursor.pushBytes(bytes)\n } else if (bytes.length <= 55) {\n cursor.pushByte(0x80 + bytes.length)\n cursor.pushBytes(bytes)\n } else {\n cursor.pushByte(0x80 + 55 + sizeOfBytesLength)\n if (sizeOfBytesLength === 1) cursor.pushUint8(bytes.length)\n else if (sizeOfBytesLength === 2) cursor.pushUint16(bytes.length)\n else if (sizeOfBytesLength === 3) cursor.pushUint24(bytes.length)\n else cursor.pushUint32(bytes.length)\n cursor.pushBytes(bytes)\n }\n },\n }\n}\n\nfunction getSizeOfLength(length: number) {\n if (length < 2 ** 8) return 1\n if (length < 2 ** 16) return 2\n if (length < 2 ** 24) return 3\n if (length < 2 ** 32) return 4\n throw new BaseError('Length is too large.')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { AuthorizationRequest } from '../../types/authorization.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type NumberToHexErrorType, numberToHex } from '../encoding/toHex.js'\nimport { type ToRlpErrorType, toRlp } from '../encoding/toRlp.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type HashAuthorizationParameters =\n AuthorizationRequest & {\n /** Output format. @default \"hex\" */\n to?: to | To | undefined\n }\n\nexport type HashAuthorizationReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type HashAuthorizationErrorType =\n | Keccak256ErrorType\n | ConcatHexErrorType\n | ToRlpErrorType\n | NumberToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Computes an Authorization hash in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n */\nexport function hashAuthorization(\n parameters: HashAuthorizationParameters,\n): HashAuthorizationReturnType {\n const { chainId, nonce, to } = parameters\n const address = parameters.contractAddress ?? parameters.address\n const hash = keccak256(\n concatHex([\n '0x05',\n toRlp([\n chainId ? numberToHex(chainId) : '0x',\n address,\n nonce ? numberToHex(nonce) : '0x',\n ]),\n ]),\n )\n if (to === 'bytes') return hexToBytes(hash) as HashAuthorizationReturnType\n return hash as HashAuthorizationReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n Authorization,\n AuthorizationRequest,\n SignedAuthorization,\n} from '../../types/authorization.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type RecoverAddressErrorType,\n recoverAddress,\n} from '../signature/recoverAddress.js'\nimport {\n type HashAuthorizationErrorType,\n hashAuthorization,\n} from './hashAuthorization.js'\n\nexport type RecoverAuthorizationAddressParameters<\n authorization extends OneOf<\n Authorization | AuthorizationRequest | SignedAuthorization\n > = OneOf,\n //\n _signature = Hex | ByteArray | OneOf,\n> = {\n /**\n * The Authorization object.\n *\n * - If an unsigned `authorization` is provided, the `signature` property is required.\n * - If a signed `authorization` is provided, the `signature` property does not need to be provided.\n */\n authorization:\n | authorization\n | OneOf\n} & (authorization extends SignedAuthorization\n ? {\n /** Signature of the Authorization. Not required if the `authorization` is signed. */\n signature?: _signature | undefined\n }\n : {\n /** Signature of the Authorization. Not required if the `authorization` is signed. */\n signature: _signature\n })\n\nexport type RecoverAuthorizationAddressReturnType = Address\n\nexport type RecoverAuthorizationAddressErrorType =\n | HashAuthorizationErrorType\n | RecoverAddressErrorType\n | ErrorType\n\nexport async function recoverAuthorizationAddress<\n const authorization extends OneOf<\n Authorization | AuthorizationRequest | SignedAuthorization\n >,\n>(\n parameters: RecoverAuthorizationAddressParameters,\n): Promise {\n const { authorization, signature } = parameters\n\n return recoverAddress({\n hash: hashAuthorization(authorization as AuthorizationRequest),\n signature: (signature ?? authorization) as Signature,\n })\n}\n","import type { Account } from '../accounts/types.js'\nimport type { EstimateGasParameters } from '../actions/public/estimateGas.js'\nimport type { Chain } from '../types/chain.js'\nimport { formatEther } from '../utils/unit/formatEther.js'\nimport { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { BaseError } from './base.js'\nimport { prettyPrint } from './transaction.js'\n\nexport type EstimateGasExecutionErrorType = EstimateGasExecutionError & {\n name: 'EstimateGasExecutionError'\n}\nexport class EstimateGasExecutionError extends BaseError {\n override cause: BaseError\n\n constructor(\n cause: BaseError,\n {\n account,\n docsPath,\n chain,\n data,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n }: Omit, 'account'> & {\n account?: Account | undefined\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n ) {\n const prettyArgs = prettyPrint({\n from: account?.address,\n to,\n value:\n typeof value !== 'undefined' &&\n `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n data,\n gas,\n gasPrice:\n typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n maxFeePerGas:\n typeof maxFeePerGas !== 'undefined' &&\n `${formatGwei(maxFeePerGas)} gwei`,\n maxPriorityFeePerGas:\n typeof maxPriorityFeePerGas !== 'undefined' &&\n `${formatGwei(maxPriorityFeePerGas)} gwei`,\n nonce,\n })\n\n super(cause.shortMessage, {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n 'Estimate Gas Arguments:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'EstimateGasExecutionError',\n })\n this.cause = cause\n }\n}\n","import { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { BaseError } from './base.js'\n\n/**\n * geth: https://github.com/ethereum/go-ethereum/blob/master/core/error.go\n * https://github.com/ethereum/go-ethereum/blob/master/core/types/transaction.go#L34-L41\n *\n * erigon: https://github.com/ledgerwatch/erigon/blob/master/core/error.go\n * https://github.com/ledgerwatch/erigon/blob/master/core/types/transaction.go#L41-L46\n *\n * anvil: https://github.com/foundry-rs/foundry/blob/master/anvil/src/eth/error.rs#L108\n */\nexport type ExecutionRevertedErrorType = ExecutionRevertedError & {\n code: 3\n name: 'ExecutionRevertedError'\n}\nexport class ExecutionRevertedError extends BaseError {\n static code = 3\n static nodeMessage = /execution reverted|gas required exceeds allowance/\n\n constructor({\n cause,\n message,\n }: { cause?: BaseError | undefined; message?: string | undefined } = {}) {\n const reason = message\n ?.replace('execution reverted: ', '')\n ?.replace('execution reverted', '')\n super(\n `Execution reverted ${\n reason ? `with reason: ${reason}` : 'for an unknown reason'\n }.`,\n {\n cause,\n name: 'ExecutionRevertedError',\n },\n )\n }\n}\n\nexport type FeeCapTooHighErrorType = FeeCapTooHighError & {\n name: 'FeeCapTooHighError'\n}\nexport class FeeCapTooHighError extends BaseError {\n static nodeMessage =\n /max fee per gas higher than 2\\^256-1|fee cap higher than 2\\^256-1/\n constructor({\n cause,\n maxFeePerGas,\n }: {\n cause?: BaseError | undefined\n maxFeePerGas?: bigint | undefined\n } = {}) {\n super(\n `The fee cap (\\`maxFeePerGas\\`${\n maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)} gwei` : ''\n }) cannot be higher than the maximum allowed value (2^256-1).`,\n {\n cause,\n name: 'FeeCapTooHighError',\n },\n )\n }\n}\n\nexport type FeeCapTooLowErrorType = FeeCapTooLowError & {\n name: 'FeeCapTooLowError'\n}\nexport class FeeCapTooLowError extends BaseError {\n static nodeMessage =\n /max fee per gas less than block base fee|fee cap less than block base fee|transaction is outdated/\n constructor({\n cause,\n maxFeePerGas,\n }: {\n cause?: BaseError | undefined\n maxFeePerGas?: bigint | undefined\n } = {}) {\n super(\n `The fee cap (\\`maxFeePerGas\\`${\n maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)}` : ''\n } gwei) cannot be lower than the block base fee.`,\n {\n cause,\n name: 'FeeCapTooLowError',\n },\n )\n }\n}\n\nexport type NonceTooHighErrorType = NonceTooHighError & {\n name: 'NonceTooHighError'\n}\nexport class NonceTooHighError extends BaseError {\n static nodeMessage = /nonce too high/\n constructor({\n cause,\n nonce,\n }: { cause?: BaseError | undefined; nonce?: number | undefined } = {}) {\n super(\n `Nonce provided for the transaction ${\n nonce ? `(${nonce}) ` : ''\n }is higher than the next one expected.`,\n { cause, name: 'NonceTooHighError' },\n )\n }\n}\n\nexport type NonceTooLowErrorType = NonceTooLowError & {\n name: 'NonceTooLowError'\n}\nexport class NonceTooLowError extends BaseError {\n static nodeMessage =\n /nonce too low|transaction already imported|already known/\n constructor({\n cause,\n nonce,\n }: { cause?: BaseError | undefined; nonce?: number | undefined } = {}) {\n super(\n [\n `Nonce provided for the transaction ${\n nonce ? `(${nonce}) ` : ''\n }is lower than the current nonce of the account.`,\n 'Try increasing the nonce or find the latest nonce with `getTransactionCount`.',\n ].join('\\n'),\n { cause, name: 'NonceTooLowError' },\n )\n }\n}\n\nexport type NonceMaxValueErrorType = NonceMaxValueError & {\n name: 'NonceMaxValueError'\n}\nexport class NonceMaxValueError extends BaseError {\n static nodeMessage = /nonce has max value/\n constructor({\n cause,\n nonce,\n }: { cause?: BaseError | undefined; nonce?: number | undefined } = {}) {\n super(\n `Nonce provided for the transaction ${\n nonce ? `(${nonce}) ` : ''\n }exceeds the maximum allowed nonce.`,\n { cause, name: 'NonceMaxValueError' },\n )\n }\n}\n\nexport type InsufficientFundsErrorType = InsufficientFundsError & {\n name: 'InsufficientFundsError'\n}\nexport class InsufficientFundsError extends BaseError {\n static nodeMessage =\n /insufficient funds|exceeds transaction sender account balance/\n constructor({ cause }: { cause?: BaseError | undefined } = {}) {\n super(\n [\n 'The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.',\n ].join('\\n'),\n {\n cause,\n metaMessages: [\n 'This error could arise when the account does not have enough funds to:',\n ' - pay for the total gas fee,',\n ' - pay for the value to send.',\n ' ',\n 'The cost of the transaction is calculated as `gas * gas fee + value`, where:',\n ' - `gas` is the amount of gas needed for transaction to execute,',\n ' - `gas fee` is the gas fee,',\n ' - `value` is the amount of ether to send to the recipient.',\n ],\n name: 'InsufficientFundsError',\n },\n )\n }\n}\n\nexport type IntrinsicGasTooHighErrorType = IntrinsicGasTooHighError & {\n name: 'IntrinsicGasTooHighError'\n}\nexport class IntrinsicGasTooHighError extends BaseError {\n static nodeMessage = /intrinsic gas too high|gas limit reached/\n constructor({\n cause,\n gas,\n }: { cause?: BaseError | undefined; gas?: bigint | undefined } = {}) {\n super(\n `The amount of gas ${\n gas ? `(${gas}) ` : ''\n }provided for the transaction exceeds the limit allowed for the block.`,\n {\n cause,\n name: 'IntrinsicGasTooHighError',\n },\n )\n }\n}\n\nexport type IntrinsicGasTooLowErrorType = IntrinsicGasTooLowError & {\n name: 'IntrinsicGasTooLowError'\n}\nexport class IntrinsicGasTooLowError extends BaseError {\n static nodeMessage = /intrinsic gas too low/\n constructor({\n cause,\n gas,\n }: { cause?: BaseError | undefined; gas?: bigint | undefined } = {}) {\n super(\n `The amount of gas ${\n gas ? `(${gas}) ` : ''\n }provided for the transaction is too low.`,\n {\n cause,\n name: 'IntrinsicGasTooLowError',\n },\n )\n }\n}\n\nexport type TransactionTypeNotSupportedErrorType =\n TransactionTypeNotSupportedError & {\n name: 'TransactionTypeNotSupportedError'\n }\nexport class TransactionTypeNotSupportedError extends BaseError {\n static nodeMessage = /transaction type not valid/\n constructor({ cause }: { cause?: BaseError | undefined }) {\n super('The transaction type is not supported for this chain.', {\n cause,\n name: 'TransactionTypeNotSupportedError',\n })\n }\n}\n\nexport type TipAboveFeeCapErrorType = TipAboveFeeCapError & {\n name: 'TipAboveFeeCapError'\n}\nexport class TipAboveFeeCapError extends BaseError {\n static nodeMessage =\n /max priority fee per gas higher than max fee per gas|tip higher than fee cap/\n constructor({\n cause,\n maxPriorityFeePerGas,\n maxFeePerGas,\n }: {\n cause?: BaseError | undefined\n maxPriorityFeePerGas?: bigint | undefined\n maxFeePerGas?: bigint | undefined\n } = {}) {\n super(\n [\n `The provided tip (\\`maxPriorityFeePerGas\\`${\n maxPriorityFeePerGas\n ? ` = ${formatGwei(maxPriorityFeePerGas)} gwei`\n : ''\n }) cannot be higher than the fee cap (\\`maxFeePerGas\\`${\n maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)} gwei` : ''\n }).`,\n ].join('\\n'),\n {\n cause,\n name: 'TipAboveFeeCapError',\n },\n )\n }\n}\n\nexport type UnknownNodeErrorType = UnknownNodeError & {\n name: 'UnknownNodeError'\n}\nexport class UnknownNodeError extends BaseError {\n constructor({ cause }: { cause?: BaseError | undefined }) {\n super(`An error occurred while executing: ${cause?.shortMessage}`, {\n cause,\n name: 'UnknownNodeError',\n })\n }\n}\n","import type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n ExecutionRevertedError,\n type ExecutionRevertedErrorType,\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n FeeCapTooLowError,\n type FeeCapTooLowErrorType,\n InsufficientFundsError,\n type InsufficientFundsErrorType,\n IntrinsicGasTooHighError,\n type IntrinsicGasTooHighErrorType,\n IntrinsicGasTooLowError,\n type IntrinsicGasTooLowErrorType,\n NonceMaxValueError,\n type NonceMaxValueErrorType,\n NonceTooHighError,\n type NonceTooHighErrorType,\n NonceTooLowError,\n type NonceTooLowErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n TransactionTypeNotSupportedError,\n type TransactionTypeNotSupportedErrorType,\n UnknownNodeError,\n type UnknownNodeErrorType,\n} from '../../errors/node.js'\nimport { RpcRequestError } from '../../errors/request.js'\nimport {\n InvalidInputRpcError,\n TransactionRejectedRpcError,\n} from '../../errors/rpc.js'\nimport type { ExactPartial } from '../../types/utils.js'\n\nexport function containsNodeError(err: BaseError) {\n return (\n err instanceof TransactionRejectedRpcError ||\n err instanceof InvalidInputRpcError ||\n (err instanceof RpcRequestError && err.code === ExecutionRevertedError.code)\n )\n}\n\nexport type GetNodeErrorParameters = ExactPartial<\n SendTransactionParameters\n>\n\nexport type GetNodeErrorReturnType =\n | ExecutionRevertedErrorType\n | FeeCapTooHighErrorType\n | FeeCapTooLowErrorType\n | NonceTooHighErrorType\n | NonceTooLowErrorType\n | NonceMaxValueErrorType\n | InsufficientFundsErrorType\n | IntrinsicGasTooHighErrorType\n | IntrinsicGasTooLowErrorType\n | TransactionTypeNotSupportedErrorType\n | TipAboveFeeCapErrorType\n | UnknownNodeErrorType\n\nexport function getNodeError(\n err: BaseError,\n args: GetNodeErrorParameters,\n): GetNodeErrorReturnType {\n const message = (err.details || '').toLowerCase()\n\n const executionRevertedError =\n err instanceof BaseError\n ? err.walk(\n (e) =>\n (e as { code: number } | null | undefined)?.code ===\n ExecutionRevertedError.code,\n )\n : err\n if (executionRevertedError instanceof BaseError)\n return new ExecutionRevertedError({\n cause: err,\n message: executionRevertedError.details,\n }) as any\n if (ExecutionRevertedError.nodeMessage.test(message))\n return new ExecutionRevertedError({\n cause: err,\n message: err.details,\n }) as any\n if (FeeCapTooHighError.nodeMessage.test(message))\n return new FeeCapTooHighError({\n cause: err,\n maxFeePerGas: args?.maxFeePerGas,\n }) as any\n if (FeeCapTooLowError.nodeMessage.test(message))\n return new FeeCapTooLowError({\n cause: err,\n maxFeePerGas: args?.maxFeePerGas,\n }) as any\n if (NonceTooHighError.nodeMessage.test(message))\n return new NonceTooHighError({ cause: err, nonce: args?.nonce }) as any\n if (NonceTooLowError.nodeMessage.test(message))\n return new NonceTooLowError({ cause: err, nonce: args?.nonce }) as any\n if (NonceMaxValueError.nodeMessage.test(message))\n return new NonceMaxValueError({ cause: err, nonce: args?.nonce }) as any\n if (InsufficientFundsError.nodeMessage.test(message))\n return new InsufficientFundsError({ cause: err }) as any\n if (IntrinsicGasTooHighError.nodeMessage.test(message))\n return new IntrinsicGasTooHighError({ cause: err, gas: args?.gas }) as any\n if (IntrinsicGasTooLowError.nodeMessage.test(message))\n return new IntrinsicGasTooLowError({ cause: err, gas: args?.gas }) as any\n if (TransactionTypeNotSupportedError.nodeMessage.test(message))\n return new TransactionTypeNotSupportedError({ cause: err }) as any\n if (TipAboveFeeCapError.nodeMessage.test(message))\n return new TipAboveFeeCapError({\n cause: err,\n maxFeePerGas: args?.maxFeePerGas,\n maxPriorityFeePerGas: args?.maxPriorityFeePerGas,\n }) as any\n return new UnknownNodeError({\n cause: err,\n }) as any\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { EstimateGasParameters } from '../../actions/public/estimateGas.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n EstimateGasExecutionError,\n type EstimateGasExecutionErrorType,\n} from '../../errors/estimateGas.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetEstimateGasErrorReturnType = Omit<\n EstimateGasExecutionErrorType,\n 'cause'\n> & { cause: cause | GetNodeErrorReturnType }\n\nexport function getEstimateGasError>(\n err: err,\n {\n docsPath,\n ...args\n }: Omit & {\n account?: Account | undefined\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n): GetEstimateGasErrorReturnType {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new EstimateGasExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetEstimateGasErrorReturnType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ChainFormatter } from '../../types/chain.js'\n\nexport type ExtractErrorType = ErrorType\n\n/**\n * @description Picks out the keys from `value` that exist in the formatter..\n */\nexport function extract(\n value_: Record,\n { format }: { format?: ChainFormatter['format'] | undefined },\n) {\n if (!format) return {}\n\n const value: Record = {}\n function extract_(formatted: Record) {\n const keys = Object.keys(formatted)\n for (const key of keys) {\n if (key in value_) value[key] = value_[key]\n if (\n formatted[key] &&\n typeof formatted[key] === 'object' &&\n !Array.isArray(formatted[key])\n )\n extract_(formatted[key])\n }\n }\n\n const formatted = format(value_ || {})\n extract_(formatted)\n\n return value\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Prettify } from '../../types/utils.js'\n\nexport type DefineFormatterErrorType = ErrorType\n\nexport function defineFormatter(\n type: type,\n format: (args: parameters, action?: string | undefined) => returnType,\n) {\n return <\n parametersOverride,\n returnTypeOverride,\n exclude extends (keyof parameters | keyof parametersOverride)[] = [],\n >({\n exclude,\n format: overrides,\n }: {\n exclude?: exclude | undefined\n format: (\n args: parametersOverride,\n action?: string | undefined,\n ) => returnTypeOverride\n }) => {\n return {\n exclude,\n format: (args: parametersOverride, action?: string | undefined) => {\n const formatted = format(args as any, action)\n if (exclude) {\n for (const key of exclude) {\n delete (formatted as any)[key]\n }\n }\n return {\n ...formatted,\n ...overrides(args, action),\n } as Prettify & {\n [_key in exclude[number]]: never\n }\n },\n type,\n }\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { AuthorizationList } from '../../types/authorization.js'\nimport type {\n Chain,\n ExtractChainFormatterParameters,\n} from '../../types/chain.js'\nimport type { ByteArray } from '../../types/misc.js'\nimport type {\n RpcAuthorizationList,\n RpcTransactionRequest,\n} from '../../types/rpc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { bytesToHex, numberToHex } from '../encoding/toHex.js'\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\n\nexport type FormattedTransactionRequest<\n chain extends Chain | undefined = Chain | undefined,\n> = ExtractChainFormatterParameters<\n chain,\n 'transactionRequest',\n TransactionRequest\n>\n\nexport const rpcTransactionType = {\n legacy: '0x0',\n eip2930: '0x1',\n eip1559: '0x2',\n eip4844: '0x3',\n eip7702: '0x4',\n} as const\n\nexport type FormatTransactionRequestErrorType = ErrorType\n\nexport function formatTransactionRequest(\n request: ExactPartial & { account?: Account | undefined },\n _?: string | undefined,\n) {\n const rpcRequest = {} as RpcTransactionRequest\n\n if (typeof request.authorizationList !== 'undefined')\n rpcRequest.authorizationList = formatAuthorizationList(\n request.authorizationList,\n )\n if (typeof request.accessList !== 'undefined')\n rpcRequest.accessList = request.accessList\n if (typeof request.blobVersionedHashes !== 'undefined')\n rpcRequest.blobVersionedHashes = request.blobVersionedHashes\n if (typeof request.blobs !== 'undefined') {\n if (typeof request.blobs[0] !== 'string')\n rpcRequest.blobs = (request.blobs as ByteArray[]).map((x) =>\n bytesToHex(x),\n )\n else rpcRequest.blobs = request.blobs\n }\n if (typeof request.data !== 'undefined') rpcRequest.data = request.data\n if (request.account) rpcRequest.from = request.account.address\n if (typeof request.from !== 'undefined') rpcRequest.from = request.from\n if (typeof request.gas !== 'undefined')\n rpcRequest.gas = numberToHex(request.gas)\n if (typeof request.gasPrice !== 'undefined')\n rpcRequest.gasPrice = numberToHex(request.gasPrice)\n if (typeof request.maxFeePerBlobGas !== 'undefined')\n rpcRequest.maxFeePerBlobGas = numberToHex(request.maxFeePerBlobGas)\n if (typeof request.maxFeePerGas !== 'undefined')\n rpcRequest.maxFeePerGas = numberToHex(request.maxFeePerGas)\n if (typeof request.maxPriorityFeePerGas !== 'undefined')\n rpcRequest.maxPriorityFeePerGas = numberToHex(request.maxPriorityFeePerGas)\n if (typeof request.nonce !== 'undefined')\n rpcRequest.nonce = numberToHex(request.nonce)\n if (typeof request.to !== 'undefined') rpcRequest.to = request.to\n if (typeof request.type !== 'undefined')\n rpcRequest.type = rpcTransactionType[request.type]\n if (typeof request.value !== 'undefined')\n rpcRequest.value = numberToHex(request.value)\n\n return rpcRequest\n}\n\nexport type DefineTransactionRequestErrorType =\n | DefineFormatterErrorType\n | ErrorType\n\nexport const defineTransactionRequest = /*#__PURE__*/ defineFormatter(\n 'transactionRequest',\n formatTransactionRequest,\n)\n\n//////////////////////////////////////////////////////////////////////////////\n\nfunction formatAuthorizationList(\n authorizationList: AuthorizationList,\n): RpcAuthorizationList {\n return authorizationList.map(\n (authorization) =>\n ({\n address: authorization.address,\n r: authorization.r\n ? numberToHex(BigInt(authorization.r))\n : authorization.r,\n s: authorization.s\n ? numberToHex(BigInt(authorization.s))\n : authorization.s,\n chainId: numberToHex(authorization.chainId),\n nonce: numberToHex(authorization.nonce),\n ...(typeof authorization.yParity !== 'undefined'\n ? { yParity: numberToHex(authorization.yParity) }\n : {}),\n ...(typeof authorization.v !== 'undefined' &&\n typeof authorization.yParity === 'undefined'\n ? { v: numberToHex(authorization.v) }\n : {}),\n }) as any,\n ) as RpcAuthorizationList\n}\n","import {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../errors/address.js'\nimport {\n InvalidBytesLengthError,\n type InvalidBytesLengthErrorType,\n} from '../errors/data.js'\nimport {\n AccountStateConflictError,\n type AccountStateConflictErrorType,\n StateAssignmentConflictError,\n type StateAssignmentConflictErrorType,\n} from '../errors/stateOverride.js'\nimport type {\n RpcAccountStateOverride,\n RpcStateMapping,\n RpcStateOverride,\n} from '../types/rpc.js'\nimport type { StateMapping, StateOverride } from '../types/stateOverride.js'\nimport { isAddress } from './address/isAddress.js'\nimport { type NumberToHexErrorType, numberToHex } from './encoding/toHex.js'\n\ntype SerializeStateMappingParameters = StateMapping | undefined\n\ntype SerializeStateMappingErrorType = InvalidBytesLengthErrorType\n\n/** @internal */\nexport function serializeStateMapping(\n stateMapping: SerializeStateMappingParameters,\n): RpcStateMapping | undefined {\n if (!stateMapping || stateMapping.length === 0) return undefined\n return stateMapping.reduce((acc, { slot, value }) => {\n if (slot.length !== 66)\n throw new InvalidBytesLengthError({\n size: slot.length,\n targetSize: 66,\n type: 'hex',\n })\n if (value.length !== 66)\n throw new InvalidBytesLengthError({\n size: value.length,\n targetSize: 66,\n type: 'hex',\n })\n acc[slot] = value\n return acc\n }, {} as RpcStateMapping)\n}\n\ntype SerializeAccountStateOverrideParameters = Omit<\n StateOverride[number],\n 'address'\n>\n\ntype SerializeAccountStateOverrideErrorType =\n | NumberToHexErrorType\n | StateAssignmentConflictErrorType\n | SerializeStateMappingErrorType\n\n/** @internal */\nexport function serializeAccountStateOverride(\n parameters: SerializeAccountStateOverrideParameters,\n): RpcAccountStateOverride {\n const { balance, nonce, state, stateDiff, code } = parameters\n const rpcAccountStateOverride: RpcAccountStateOverride = {}\n if (code !== undefined) rpcAccountStateOverride.code = code\n if (balance !== undefined)\n rpcAccountStateOverride.balance = numberToHex(balance)\n if (nonce !== undefined) rpcAccountStateOverride.nonce = numberToHex(nonce)\n if (state !== undefined)\n rpcAccountStateOverride.state = serializeStateMapping(state)\n if (stateDiff !== undefined) {\n if (rpcAccountStateOverride.state) throw new StateAssignmentConflictError()\n rpcAccountStateOverride.stateDiff = serializeStateMapping(stateDiff)\n }\n return rpcAccountStateOverride\n}\n\ntype SerializeStateOverrideParameters = StateOverride | undefined\n\nexport type SerializeStateOverrideErrorType =\n | InvalidAddressErrorType\n | AccountStateConflictErrorType\n | SerializeAccountStateOverrideErrorType\n\n/** @internal */\nexport function serializeStateOverride(\n parameters?: SerializeStateOverrideParameters,\n): RpcStateOverride | undefined {\n if (!parameters) return undefined\n const rpcStateOverride: RpcStateOverride = {}\n for (const { address, ...accountState } of parameters) {\n if (!isAddress(address, { strict: false }))\n throw new InvalidAddressError({ address })\n if (rpcStateOverride[address])\n throw new AccountStateConflictError({ address: address })\n rpcStateOverride[address] = serializeAccountStateOverride(accountState)\n }\n return rpcStateOverride\n}\n","export const maxInt8 = 2n ** (8n - 1n) - 1n\nexport const maxInt16 = 2n ** (16n - 1n) - 1n\nexport const maxInt24 = 2n ** (24n - 1n) - 1n\nexport const maxInt32 = 2n ** (32n - 1n) - 1n\nexport const maxInt40 = 2n ** (40n - 1n) - 1n\nexport const maxInt48 = 2n ** (48n - 1n) - 1n\nexport const maxInt56 = 2n ** (56n - 1n) - 1n\nexport const maxInt64 = 2n ** (64n - 1n) - 1n\nexport const maxInt72 = 2n ** (72n - 1n) - 1n\nexport const maxInt80 = 2n ** (80n - 1n) - 1n\nexport const maxInt88 = 2n ** (88n - 1n) - 1n\nexport const maxInt96 = 2n ** (96n - 1n) - 1n\nexport const maxInt104 = 2n ** (104n - 1n) - 1n\nexport const maxInt112 = 2n ** (112n - 1n) - 1n\nexport const maxInt120 = 2n ** (120n - 1n) - 1n\nexport const maxInt128 = 2n ** (128n - 1n) - 1n\nexport const maxInt136 = 2n ** (136n - 1n) - 1n\nexport const maxInt144 = 2n ** (144n - 1n) - 1n\nexport const maxInt152 = 2n ** (152n - 1n) - 1n\nexport const maxInt160 = 2n ** (160n - 1n) - 1n\nexport const maxInt168 = 2n ** (168n - 1n) - 1n\nexport const maxInt176 = 2n ** (176n - 1n) - 1n\nexport const maxInt184 = 2n ** (184n - 1n) - 1n\nexport const maxInt192 = 2n ** (192n - 1n) - 1n\nexport const maxInt200 = 2n ** (200n - 1n) - 1n\nexport const maxInt208 = 2n ** (208n - 1n) - 1n\nexport const maxInt216 = 2n ** (216n - 1n) - 1n\nexport const maxInt224 = 2n ** (224n - 1n) - 1n\nexport const maxInt232 = 2n ** (232n - 1n) - 1n\nexport const maxInt240 = 2n ** (240n - 1n) - 1n\nexport const maxInt248 = 2n ** (248n - 1n) - 1n\nexport const maxInt256 = 2n ** (256n - 1n) - 1n\n\nexport const minInt8 = -(2n ** (8n - 1n))\nexport const minInt16 = -(2n ** (16n - 1n))\nexport const minInt24 = -(2n ** (24n - 1n))\nexport const minInt32 = -(2n ** (32n - 1n))\nexport const minInt40 = -(2n ** (40n - 1n))\nexport const minInt48 = -(2n ** (48n - 1n))\nexport const minInt56 = -(2n ** (56n - 1n))\nexport const minInt64 = -(2n ** (64n - 1n))\nexport const minInt72 = -(2n ** (72n - 1n))\nexport const minInt80 = -(2n ** (80n - 1n))\nexport const minInt88 = -(2n ** (88n - 1n))\nexport const minInt96 = -(2n ** (96n - 1n))\nexport const minInt104 = -(2n ** (104n - 1n))\nexport const minInt112 = -(2n ** (112n - 1n))\nexport const minInt120 = -(2n ** (120n - 1n))\nexport const minInt128 = -(2n ** (128n - 1n))\nexport const minInt136 = -(2n ** (136n - 1n))\nexport const minInt144 = -(2n ** (144n - 1n))\nexport const minInt152 = -(2n ** (152n - 1n))\nexport const minInt160 = -(2n ** (160n - 1n))\nexport const minInt168 = -(2n ** (168n - 1n))\nexport const minInt176 = -(2n ** (176n - 1n))\nexport const minInt184 = -(2n ** (184n - 1n))\nexport const minInt192 = -(2n ** (192n - 1n))\nexport const minInt200 = -(2n ** (200n - 1n))\nexport const minInt208 = -(2n ** (208n - 1n))\nexport const minInt216 = -(2n ** (216n - 1n))\nexport const minInt224 = -(2n ** (224n - 1n))\nexport const minInt232 = -(2n ** (232n - 1n))\nexport const minInt240 = -(2n ** (240n - 1n))\nexport const minInt248 = -(2n ** (248n - 1n))\nexport const minInt256 = -(2n ** (256n - 1n))\n\nexport const maxUint8 = 2n ** 8n - 1n\nexport const maxUint16 = 2n ** 16n - 1n\nexport const maxUint24 = 2n ** 24n - 1n\nexport const maxUint32 = 2n ** 32n - 1n\nexport const maxUint40 = 2n ** 40n - 1n\nexport const maxUint48 = 2n ** 48n - 1n\nexport const maxUint56 = 2n ** 56n - 1n\nexport const maxUint64 = 2n ** 64n - 1n\nexport const maxUint72 = 2n ** 72n - 1n\nexport const maxUint80 = 2n ** 80n - 1n\nexport const maxUint88 = 2n ** 88n - 1n\nexport const maxUint96 = 2n ** 96n - 1n\nexport const maxUint104 = 2n ** 104n - 1n\nexport const maxUint112 = 2n ** 112n - 1n\nexport const maxUint120 = 2n ** 120n - 1n\nexport const maxUint128 = 2n ** 128n - 1n\nexport const maxUint136 = 2n ** 136n - 1n\nexport const maxUint144 = 2n ** 144n - 1n\nexport const maxUint152 = 2n ** 152n - 1n\nexport const maxUint160 = 2n ** 160n - 1n\nexport const maxUint168 = 2n ** 168n - 1n\nexport const maxUint176 = 2n ** 176n - 1n\nexport const maxUint184 = 2n ** 184n - 1n\nexport const maxUint192 = 2n ** 192n - 1n\nexport const maxUint200 = 2n ** 200n - 1n\nexport const maxUint208 = 2n ** 208n - 1n\nexport const maxUint216 = 2n ** 216n - 1n\nexport const maxUint224 = 2n ** 224n - 1n\nexport const maxUint232 = 2n ** 232n - 1n\nexport const maxUint240 = 2n ** 240n - 1n\nexport const maxUint248 = 2n ** 248n - 1n\nexport const maxUint256 = 2n ** 256n - 1n\n","import {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'\nimport { maxUint256 } from '../../constants/number.js'\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport {\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n} from '../../errors/node.js'\nimport type { FeeConflictErrorType } from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { isAddress } from '../address/isAddress.js'\n\nexport type AssertRequestParameters = ExactPartial<\n SendTransactionParameters\n>\n\nexport type AssertRequestErrorType =\n | InvalidAddressErrorType\n | FeeConflictErrorType\n | FeeCapTooHighErrorType\n | ParseAccountErrorType\n | TipAboveFeeCapErrorType\n | ErrorType\n\nexport function assertRequest(args: AssertRequestParameters) {\n const { account: account_, maxFeePerGas, maxPriorityFeePerGas, to } = args\n const account = account_ ? parseAccount(account_) : undefined\n if (account && !isAddress(account.address))\n throw new InvalidAddressError({ address: account.address })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n\n if (maxFeePerGas && maxFeePerGas > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas })\n if (\n maxPriorityFeePerGas &&\n maxFeePerGas &&\n maxPriorityFeePerGas > maxFeePerGas\n )\n throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas })\n}\n","import { formatGwei } from '../utils/unit/formatGwei.js'\nimport { BaseError } from './base.js'\n\nexport type BaseFeeScalarErrorType = BaseFeeScalarError & {\n name: 'BaseFeeScalarError'\n}\nexport class BaseFeeScalarError extends BaseError {\n constructor() {\n super('`baseFeeMultiplier` must be greater than 1.', {\n name: 'BaseFeeScalarError',\n })\n }\n}\n\nexport type Eip1559FeesNotSupportedErrorType = Eip1559FeesNotSupportedError & {\n name: 'Eip1559FeesNotSupportedError'\n}\nexport class Eip1559FeesNotSupportedError extends BaseError {\n constructor() {\n super('Chain does not support EIP-1559 fees.', {\n name: 'Eip1559FeesNotSupportedError',\n })\n }\n}\n\nexport type MaxFeePerGasTooLowErrorType = MaxFeePerGasTooLowError & {\n name: 'MaxFeePerGasTooLowError'\n}\nexport class MaxFeePerGasTooLowError extends BaseError {\n constructor({ maxPriorityFeePerGas }: { maxPriorityFeePerGas: bigint }) {\n super(\n `\\`maxFeePerGas\\` cannot be less than the \\`maxPriorityFeePerGas\\` (${formatGwei(\n maxPriorityFeePerGas,\n )} gwei).`,\n { name: 'MaxFeePerGasTooLowError' },\n )\n }\n}\n","import type { Hash } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type BlockNotFoundErrorType = BlockNotFoundError & {\n name: 'BlockNotFoundError'\n}\nexport class BlockNotFoundError extends BaseError {\n constructor({\n blockHash,\n blockNumber,\n }: {\n blockHash?: Hash | undefined\n blockNumber?: bigint | undefined\n }) {\n let identifier = 'Block'\n if (blockHash) identifier = `Block at hash \"${blockHash}\"`\n if (blockNumber) identifier = `Block at number \"${blockNumber}\"`\n super(`${identifier} could not be found.`, { name: 'BlockNotFoundError' })\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { SignedAuthorizationList } from '../../types/authorization.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type {\n Chain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RpcAuthorizationList, RpcTransaction } from '../../types/rpc.js'\nimport type { Transaction, TransactionType } from '../../types/transaction.js'\nimport type { ExactPartial, UnionLooseOmit } from '../../types/utils.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\n\ntype TransactionPendingDependencies =\n | 'blockHash'\n | 'blockNumber'\n | 'transactionIndex'\n\nexport type FormattedTransaction<\n chain extends Chain | undefined = undefined,\n blockTag extends BlockTag = BlockTag,\n _FormatterReturnType = ExtractChainFormatterReturnType<\n chain,\n 'transaction',\n Transaction\n >,\n _ExcludedPendingDependencies extends string = TransactionPendingDependencies &\n ExtractChainFormatterExclude,\n> = UnionLooseOmit<_FormatterReturnType, TransactionPendingDependencies> & {\n [_K in _ExcludedPendingDependencies]: never\n} & Pick<\n Transaction,\n TransactionPendingDependencies\n >\n\nexport const transactionType = {\n '0x0': 'legacy',\n '0x1': 'eip2930',\n '0x2': 'eip1559',\n '0x3': 'eip4844',\n '0x4': 'eip7702',\n} as const satisfies Record\n\nexport type FormatTransactionErrorType = ErrorType\n\nexport function formatTransaction(\n transaction: ExactPartial,\n _?: string | undefined,\n) {\n const transaction_ = {\n ...transaction,\n blockHash: transaction.blockHash ? transaction.blockHash : null,\n blockNumber: transaction.blockNumber\n ? BigInt(transaction.blockNumber)\n : null,\n chainId: transaction.chainId ? hexToNumber(transaction.chainId) : undefined,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n gasPrice: transaction.gasPrice ? BigInt(transaction.gasPrice) : undefined,\n maxFeePerBlobGas: transaction.maxFeePerBlobGas\n ? BigInt(transaction.maxFeePerBlobGas)\n : undefined,\n maxFeePerGas: transaction.maxFeePerGas\n ? BigInt(transaction.maxFeePerGas)\n : undefined,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n ? BigInt(transaction.maxPriorityFeePerGas)\n : undefined,\n nonce: transaction.nonce ? hexToNumber(transaction.nonce) : undefined,\n to: transaction.to ? transaction.to : null,\n transactionIndex: transaction.transactionIndex\n ? Number(transaction.transactionIndex)\n : null,\n type: transaction.type\n ? (transactionType as any)[transaction.type]\n : undefined,\n typeHex: transaction.type ? transaction.type : undefined,\n value: transaction.value ? BigInt(transaction.value) : undefined,\n v: transaction.v ? BigInt(transaction.v) : undefined,\n } as Transaction\n\n if (transaction.authorizationList)\n transaction_.authorizationList = formatAuthorizationList(\n transaction.authorizationList,\n )\n\n transaction_.yParity = (() => {\n // If `yParity` is provided, we will use it.\n if (transaction.yParity) return Number(transaction.yParity)\n\n // If no `yParity` provided, try derive from `v`.\n if (typeof transaction_.v === 'bigint') {\n if (transaction_.v === 0n || transaction_.v === 27n) return 0\n if (transaction_.v === 1n || transaction_.v === 28n) return 1\n if (transaction_.v >= 35n) return transaction_.v % 2n === 0n ? 1 : 0\n }\n\n return undefined\n })()\n\n if (transaction_.type === 'legacy') {\n delete transaction_.accessList\n delete transaction_.maxFeePerBlobGas\n delete transaction_.maxFeePerGas\n delete transaction_.maxPriorityFeePerGas\n delete transaction_.yParity\n }\n if (transaction_.type === 'eip2930') {\n delete transaction_.maxFeePerBlobGas\n delete transaction_.maxFeePerGas\n delete transaction_.maxPriorityFeePerGas\n }\n if (transaction_.type === 'eip1559') delete transaction_.maxFeePerBlobGas\n\n return transaction_\n}\n\nexport type DefineTransactionErrorType = DefineFormatterErrorType | ErrorType\n\nexport const defineTransaction = /*#__PURE__*/ defineFormatter(\n 'transaction',\n formatTransaction,\n)\n\n//////////////////////////////////////////////////////////////////////////////\n\nfunction formatAuthorizationList(\n authorizationList: RpcAuthorizationList,\n): SignedAuthorizationList {\n return authorizationList.map((authorization) => ({\n address: (authorization as any).address,\n chainId: Number(authorization.chainId),\n nonce: Number(authorization.nonce),\n r: authorization.r,\n s: authorization.s,\n yParity: Number(authorization.yParity),\n })) as SignedAuthorizationList\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Block, BlockTag } from '../../types/block.js'\nimport type {\n Chain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcBlock } from '../../types/rpc.js'\nimport type { ExactPartial, Prettify } from '../../types/utils.js'\n\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\nimport { type FormattedTransaction, formatTransaction } from './transaction.js'\n\ntype BlockPendingDependencies = 'hash' | 'logsBloom' | 'nonce' | 'number'\n\nexport type FormattedBlock<\n chain extends Chain | undefined = undefined,\n includeTransactions extends boolean = boolean,\n blockTag extends BlockTag = BlockTag,\n _FormatterReturnType = ExtractChainFormatterReturnType<\n chain,\n 'block',\n Block\n >,\n _ExcludedPendingDependencies extends string = BlockPendingDependencies &\n ExtractChainFormatterExclude,\n _Formatted = Omit<_FormatterReturnType, BlockPendingDependencies> & {\n [_key in _ExcludedPendingDependencies]: never\n } & Pick<\n Block,\n BlockPendingDependencies\n >,\n _Transactions = includeTransactions extends true\n ? Prettify>[]\n : Hash[],\n> = Omit<_Formatted, 'transactions'> & {\n transactions: _Transactions\n}\n\nexport type FormatBlockErrorType = ErrorType\n\nexport function formatBlock(\n block: ExactPartial,\n _?: string | undefined,\n) {\n const transactions = (block.transactions ?? []).map((transaction) => {\n if (typeof transaction === 'string') return transaction\n return formatTransaction(transaction)\n })\n return {\n ...block,\n baseFeePerGas: block.baseFeePerGas ? BigInt(block.baseFeePerGas) : null,\n blobGasUsed: block.blobGasUsed ? BigInt(block.blobGasUsed) : undefined,\n difficulty: block.difficulty ? BigInt(block.difficulty) : undefined,\n excessBlobGas: block.excessBlobGas\n ? BigInt(block.excessBlobGas)\n : undefined,\n gasLimit: block.gasLimit ? BigInt(block.gasLimit) : undefined,\n gasUsed: block.gasUsed ? BigInt(block.gasUsed) : undefined,\n hash: block.hash ? block.hash : null,\n logsBloom: block.logsBloom ? block.logsBloom : null,\n nonce: block.nonce ? block.nonce : null,\n number: block.number ? BigInt(block.number) : null,\n size: block.size ? BigInt(block.size) : undefined,\n timestamp: block.timestamp ? BigInt(block.timestamp) : undefined,\n transactions,\n totalDifficulty: block.totalDifficulty\n ? BigInt(block.totalDifficulty)\n : null,\n } as Block\n}\n\nexport type DefineBlockErrorType = DefineFormatterErrorType | ErrorType\n\nexport const defineBlock = /*#__PURE__*/ defineFormatter('block', formatBlock)\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n BlockNotFoundError,\n type BlockNotFoundErrorType,\n} from '../../errors/block.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcBlock } from '../../types/rpc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormattedBlock,\n formatBlock,\n} from '../../utils/formatters/block.js'\n\nexport type GetBlockParameters<\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = {\n /** Whether or not to include transaction data in the response. */\n includeTransactions?: includeTransactions | undefined\n} & (\n | {\n /** Hash of the block. */\n blockHash?: Hash | undefined\n blockNumber?: undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n blockNumber?: undefined\n /**\n * The block tag.\n * @default 'latest'\n */\n blockTag?: blockTag | BlockTag | undefined\n }\n)\n\nexport type GetBlockReturnType<\n chain extends Chain | undefined = undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = Prettify>\n\nexport type GetBlockErrorType =\n | BlockNotFoundErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns information about a block at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlock\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`.\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockParameters}\n * @returns Information about the block. {@link GetBlockReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlock } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await getBlock(client)\n */\nexport async function getBlock<\n chain extends Chain | undefined,\n account extends Account | undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client,\n {\n blockHash,\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n includeTransactions: includeTransactions_,\n }: GetBlockParameters = {},\n): Promise> {\n const includeTransactions = includeTransactions_ ?? false\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let block: RpcBlock | null = null\n if (blockHash) {\n block = await client.request(\n {\n method: 'eth_getBlockByHash',\n params: [blockHash, includeTransactions],\n },\n { dedupe: true },\n )\n } else {\n block = await client.request(\n {\n method: 'eth_getBlockByNumber',\n params: [blockNumberHex || blockTag, includeTransactions],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n }\n\n if (!block) throw new BlockNotFoundError({ blockHash, blockNumber })\n\n const format = client.chain?.formatters?.block?.format || formatBlock\n return format(block, 'getBlock')\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type GetGasPriceReturnType = bigint\n\nexport type GetGasPriceErrorType = RequestErrorType | ErrorType\n\n/**\n * Returns the current price of gas (in wei).\n *\n * - Docs: https://viem.sh/docs/actions/public/getGasPrice\n * - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice)\n *\n * @param client - Client to use\n * @returns The gas price (in wei). {@link GetGasPriceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getGasPrice } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasPrice = await getGasPrice(client)\n */\nexport async function getGasPrice<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client): Promise {\n const gasPrice = await client.request({\n method: 'eth_gasPrice',\n })\n return BigInt(gasPrice)\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n} from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n ChainFeesFnParameters,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToBigIntErrorType,\n hexToBigInt,\n} from '../../utils/encoding/fromHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { PrepareTransactionRequestParameters } from '../wallet/prepareTransactionRequest.js'\nimport { type GetBlockErrorType, getBlock } from './getBlock.js'\nimport { type GetGasPriceErrorType, getGasPrice } from './getGasPrice.js'\n\nexport type EstimateMaxPriorityFeePerGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n> = GetChainParameter\n\nexport type EstimateMaxPriorityFeePerGasReturnType = bigint\n\nexport type EstimateMaxPriorityFeePerGasErrorType =\n | GetBlockErrorType\n | HexToBigIntErrorType\n | RequestErrorType\n | GetBlockErrorType\n | GetGasPriceErrorType\n | Eip1559FeesNotSupportedErrorType\n | ErrorType\n\n/**\n * Returns an estimate for the max priority fee per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.defaultPriorityFee`](/docs/clients/chains#fees-defaultpriorityfee) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas\n *\n * @param client - Client to use\n * @returns An estimate (in wei) for the max priority fee per gas. {@link EstimateMaxPriorityFeePerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateMaxPriorityFeePerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateMaxPriorityFeePerGas(client)\n * // 10000000n\n */\nexport async function estimateMaxPriorityFeePerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n>(\n client: Client,\n args?:\n | EstimateMaxPriorityFeePerGasParameters\n | undefined,\n): Promise {\n return internal_estimateMaxPriorityFeePerGas(client, args as any)\n}\n\nexport async function internal_estimateMaxPriorityFeePerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n>(\n client: Client,\n args: EstimateMaxPriorityFeePerGasParameters & {\n block?: Block | undefined\n request?:\n | PrepareTransactionRequestParameters<\n chain,\n Account | undefined,\n chainOverride\n >\n | undefined\n },\n): Promise {\n const { block: block_, chain = client.chain, request } = args || {}\n\n try {\n const maxPriorityFeePerGas =\n chain?.fees?.maxPriorityFeePerGas ?? chain?.fees?.defaultPriorityFee\n\n if (typeof maxPriorityFeePerGas === 'function') {\n const block =\n block_ || (await getAction(client, getBlock, 'getBlock')({}))\n const maxPriorityFeePerGas_ = await maxPriorityFeePerGas({\n block,\n client,\n request,\n } as ChainFeesFnParameters)\n if (maxPriorityFeePerGas_ === null) throw new Error()\n return maxPriorityFeePerGas_\n }\n\n if (typeof maxPriorityFeePerGas !== 'undefined') return maxPriorityFeePerGas\n\n const maxPriorityFeePerGasHex = await client.request({\n method: 'eth_maxPriorityFeePerGas',\n })\n return hexToBigInt(maxPriorityFeePerGasHex)\n } catch {\n // If the RPC Provider does not support `eth_maxPriorityFeePerGas`\n // fall back to calculating it manually via `gasPrice - baseFeePerGas`.\n // See: https://github.com/ethereum/pm/issues/328#:~:text=eth_maxPriorityFeePerGas%20after%20London%20will%20effectively%20return%20eth_gasPrice%20%2D%20baseFee\n const [block, gasPrice] = await Promise.all([\n block_\n ? Promise.resolve(block_)\n : getAction(client, getBlock, 'getBlock')({}),\n getAction(client, getGasPrice, 'getGasPrice')({}),\n ])\n\n if (typeof block.baseFeePerGas !== 'bigint')\n throw new Eip1559FeesNotSupportedError()\n\n const maxPriorityFeePerGas = gasPrice - block.baseFeePerGas\n\n if (maxPriorityFeePerGas < 0n) return 0n\n return maxPriorityFeePerGas\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n BaseFeeScalarError,\n type BaseFeeScalarErrorType,\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n} from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n ChainEstimateFeesPerGasFnParameters,\n ChainFeesFnParameters,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type {\n FeeValuesEIP1559,\n FeeValuesLegacy,\n FeeValuesType,\n} from '../../types/fee.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { PrepareTransactionRequestParameters } from '../wallet/prepareTransactionRequest.js'\nimport {\n type EstimateMaxPriorityFeePerGasErrorType,\n internal_estimateMaxPriorityFeePerGas,\n} from './estimateMaxPriorityFeePerGas.js'\nimport { getBlock } from './getBlock.js'\nimport { type GetGasPriceErrorType, getGasPrice } from './getGasPrice.js'\n\nexport type EstimateFeesPerGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n type extends FeeValuesType = FeeValuesType,\n> = {\n /**\n * The type of fee values to return.\n *\n * - `legacy`: Returns the legacy gas price.\n * - `eip1559`: Returns the max fee per gas and max priority fee per gas.\n *\n * @default 'eip1559'\n */\n type?: type | FeeValuesType | undefined\n} & GetChainParameter\n\nexport type EstimateFeesPerGasReturnType<\n type extends FeeValuesType = FeeValuesType,\n> =\n | (type extends 'legacy' ? FeeValuesLegacy : never)\n | (type extends 'eip1559' ? FeeValuesEIP1559 : never)\n\nexport type EstimateFeesPerGasErrorType =\n | BaseFeeScalarErrorType\n | EstimateMaxPriorityFeePerGasErrorType\n | GetGasPriceErrorType\n | Eip1559FeesNotSupportedErrorType\n | ErrorType\n\n/**\n * Returns an estimate for the fees per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.estimateFeesPerGas`](/docs/clients/chains#fees-estimatefeespergas) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateFeesPerGasParameters}\n * @returns An estimate (in wei) for the fees per gas. {@link EstimateFeesPerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateFeesPerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateFeesPerGas(client)\n * // { maxFeePerGas: ..., maxPriorityFeePerGas: ... }\n */\nexport async function estimateFeesPerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n type extends FeeValuesType = 'eip1559',\n>(\n client: Client,\n args?: EstimateFeesPerGasParameters | undefined,\n): Promise> {\n return internal_estimateFeesPerGas(client, args as any)\n}\n\nexport async function internal_estimateFeesPerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n type extends FeeValuesType = 'eip1559',\n>(\n client: Client,\n args: EstimateFeesPerGasParameters & {\n block?: Block | undefined\n request?: PrepareTransactionRequestParameters | undefined\n },\n): Promise> {\n const {\n block: block_,\n chain = client.chain,\n request,\n type = 'eip1559',\n } = args || {}\n\n const baseFeeMultiplier = await (async () => {\n if (typeof chain?.fees?.baseFeeMultiplier === 'function')\n return chain.fees.baseFeeMultiplier({\n block: block_ as Block,\n client,\n request,\n } as ChainFeesFnParameters)\n return chain?.fees?.baseFeeMultiplier ?? 1.2\n })()\n if (baseFeeMultiplier < 1) throw new BaseFeeScalarError()\n\n const decimals = baseFeeMultiplier.toString().split('.')[1]?.length ?? 0\n const denominator = 10 ** decimals\n const multiply = (base: bigint) =>\n (base * BigInt(Math.ceil(baseFeeMultiplier * denominator))) /\n BigInt(denominator)\n\n const block = block_\n ? block_\n : await getAction(client, getBlock, 'getBlock')({})\n\n if (typeof chain?.fees?.estimateFeesPerGas === 'function') {\n const fees = (await chain.fees.estimateFeesPerGas({\n block: block_ as Block,\n client,\n multiply,\n request,\n type,\n } as ChainEstimateFeesPerGasFnParameters)) as unknown as EstimateFeesPerGasReturnType\n\n if (fees !== null) return fees\n }\n\n if (type === 'eip1559') {\n if (typeof block.baseFeePerGas !== 'bigint')\n throw new Eip1559FeesNotSupportedError()\n\n const maxPriorityFeePerGas =\n typeof request?.maxPriorityFeePerGas === 'bigint'\n ? request.maxPriorityFeePerGas\n : await internal_estimateMaxPriorityFeePerGas(\n client as Client,\n {\n block: block as Block,\n chain,\n request,\n },\n )\n\n const baseFeePerGas = multiply(block.baseFeePerGas)\n const maxFeePerGas =\n request?.maxFeePerGas ?? baseFeePerGas + maxPriorityFeePerGas\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as EstimateFeesPerGasReturnType\n }\n\n const gasPrice =\n request?.gasPrice ??\n multiply(await getAction(client, getGasPrice, 'getGasPrice')({}))\n return {\n gasPrice,\n } as EstimateFeesPerGasReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetTransactionCountParameters = {\n /** The account address. */\n address: Address\n} & (\n | {\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /** The block tag. Defaults to 'latest'. */\n blockTag?: BlockTag | undefined\n }\n)\nexport type GetTransactionCountReturnType = number\n\nexport type GetTransactionCountErrorType =\n | RequestErrorType\n | NumberToHexErrorType\n | HexToNumberErrorType\n | ErrorType\n\n/**\n * Returns the number of [Transactions](https://viem.sh/docs/glossary/terms#transaction) an Account has sent.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionCount\n * - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionCountParameters}\n * @returns The number of transactions an account has sent. {@link GetTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionCount } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionCount = await getTransactionCount(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function getTransactionCount<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client,\n { address, blockTag = 'latest', blockNumber }: GetTransactionCountParameters,\n): Promise {\n const count = await client.request(\n {\n method: 'eth_getTransactionCount',\n params: [\n address,\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : blockTag,\n ],\n },\n {\n dedupe: Boolean(blockNumber),\n },\n )\n return hexToNumber(count)\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type BlobsToCommitmentsParameters<\n blobs extends readonly ByteArray[] | readonly Hex[] =\n | readonly ByteArray[]\n | readonly Hex[],\n to extends To | undefined = undefined,\n> = {\n /** Blobs to transform into commitments. */\n blobs: blobs | readonly ByteArray[] | readonly Hex[]\n /** KZG implementation. */\n kzg: Pick\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type BlobsToCommitmentsReturnType =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type BlobsToCommitmentsErrorType =\n | HexToBytesErrorType\n | BytesToHexErrorType\n | ErrorType\n\n/**\n * Compute commitments from a list of blobs.\n *\n * @example\n * ```ts\n * import { blobsToCommitments, toBlobs } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * ```\n */\nexport function blobsToCommitments<\n const blobs extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: BlobsToCommitmentsParameters,\n): BlobsToCommitmentsReturnType {\n const { kzg } = parameters\n\n const to =\n parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes')\n const blobs = (\n typeof parameters.blobs[0] === 'string'\n ? parameters.blobs.map((x) => hexToBytes(x as any))\n : parameters.blobs\n ) as ByteArray[]\n\n const commitments: ByteArray[] = []\n for (const blob of blobs)\n commitments.push(Uint8Array.from(kzg.blobToKzgCommitment(blob)))\n\n return (to === 'bytes'\n ? commitments\n : commitments.map((x) =>\n bytesToHex(x),\n )) as {} as BlobsToCommitmentsReturnType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type blobsToProofsParameters<\n blobs extends readonly ByteArray[] | readonly Hex[],\n commitments extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n ///\n _blobsType =\n | (blobs extends readonly Hex[] ? readonly Hex[] : never)\n | (blobs extends readonly ByteArray[] ? readonly ByteArray[] : never),\n> = {\n /** Blobs to transform into proofs. */\n blobs: blobs\n /** Commitments for the blobs. */\n commitments: commitments &\n (commitments extends _blobsType\n ? {}\n : `commitments must be the same type as blobs`)\n /** KZG implementation. */\n kzg: Pick\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type blobsToProofsReturnType =\n | (to extends 'bytes' ? ByteArray[] : never)\n | (to extends 'hex' ? Hex[] : never)\n\nexport type blobsToProofsErrorType =\n | BytesToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Compute the proofs for a list of blobs and their commitments.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n * ```\n */\nexport function blobsToProofs<\n const blobs extends readonly ByteArray[] | readonly Hex[],\n const commitments extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: blobsToProofsParameters,\n): blobsToProofsReturnType {\n const { kzg } = parameters\n\n const to =\n parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes')\n\n const blobs = (\n typeof parameters.blobs[0] === 'string'\n ? parameters.blobs.map((x) => hexToBytes(x as any))\n : parameters.blobs\n ) as ByteArray[]\n const commitments = (\n typeof parameters.commitments[0] === 'string'\n ? parameters.commitments.map((x) => hexToBytes(x as any))\n : parameters.commitments\n ) as ByteArray[]\n\n const proofs: ByteArray[] = []\n for (let i = 0; i < blobs.length; i++) {\n const blob = blobs[i]\n const commitment = commitments[i]\n proofs.push(Uint8Array.from(kzg.computeBlobKzgProof(blob, commitment)))\n }\n\n return (to === 'bytes'\n ? proofs\n : proofs.map((x) => bytesToHex(x))) as {} as blobsToProofsReturnType\n}\n","/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport {\n SHA224 as SHA224n,\n sha224 as sha224n,\n SHA256 as SHA256n,\n sha256 as sha256n,\n} from './sha2.ts';\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256: typeof SHA256n = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256: typeof sha256n = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224: typeof SHA224n = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224: typeof sha224n = sha224n;\n","import { sha256 as noble_sha256 } from '@noble/hashes/sha256'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type Sha256Hash =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type Sha256ErrorType =\n | IsHexErrorType\n | ToBytesErrorType\n | ToHexErrorType\n | ErrorType\n\nexport function sha256(\n value: Hex | ByteArray,\n to_?: to | undefined,\n): Sha256Hash {\n const to = to_ || 'hex'\n const bytes = noble_sha256(\n isHex(value, { strict: false }) ? toBytes(value) : value,\n )\n if (to === 'bytes') return bytes as Sha256Hash\n return toHex(bytes) as Sha256Hash\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { type Sha256ErrorType, sha256 } from '../hash/sha256.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type CommitmentToVersionedHashParameters<\n commitment extends Uint8Array | Hex = Uint8Array | Hex,\n to extends To | undefined = undefined,\n> = {\n /** Commitment from blob. */\n commitment: commitment | Uint8Array | Hex\n /** Return type. */\n to?: to | To | undefined\n /** Version to tag onto the hash. */\n version?: number | undefined\n}\n\nexport type CommitmentToVersionedHashReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type CommitmentToVersionedHashErrorType =\n | Sha256ErrorType\n | BytesToHexErrorType\n | ErrorType\n\n/**\n * Transform a commitment to it's versioned hash.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * commitmentToVersionedHash,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const [commitment] = blobsToCommitments({ blobs, kzg })\n * const versionedHash = commitmentToVersionedHash({ commitment })\n * ```\n */\nexport function commitmentToVersionedHash<\n const commitment extends Hex | ByteArray,\n to extends To =\n | (commitment extends Hex ? 'hex' : never)\n | (commitment extends ByteArray ? 'bytes' : never),\n>(\n parameters: CommitmentToVersionedHashParameters,\n): CommitmentToVersionedHashReturnType {\n const { commitment, version = 1 } = parameters\n const to = parameters.to ?? (typeof commitment === 'string' ? 'hex' : 'bytes')\n\n const versionedHash = sha256(commitment, 'bytes')\n versionedHash.set([version], 0)\n return (\n to === 'bytes' ? versionedHash : bytesToHex(versionedHash)\n ) as CommitmentToVersionedHashReturnType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type CommitmentToVersionedHashErrorType,\n commitmentToVersionedHash,\n} from './commitmentToVersionedHash.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type CommitmentsToVersionedHashesParameters<\n commitments extends readonly Uint8Array[] | readonly Hex[] =\n | readonly Uint8Array[]\n | readonly Hex[],\n to extends To | undefined = undefined,\n> = {\n /** Commitments from blobs. */\n commitments: commitments | readonly Uint8Array[] | readonly Hex[]\n /** Return type. */\n to?: to | To | undefined\n /** Version to tag onto the hashes. */\n version?: number | undefined\n}\n\nexport type CommitmentsToVersionedHashesReturnType =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type CommitmentsToVersionedHashesErrorType =\n | CommitmentToVersionedHashErrorType\n | ErrorType\n\n/**\n * Transform a list of commitments to their versioned hashes.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * commitmentsToVersionedHashes,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const versionedHashes = commitmentsToVersionedHashes({ commitments })\n * ```\n */\nexport function commitmentsToVersionedHashes<\n const commitments extends readonly Uint8Array[] | readonly Hex[],\n to extends To =\n | (commitments extends readonly Hex[] ? 'hex' : never)\n | (commitments extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: CommitmentsToVersionedHashesParameters,\n): CommitmentsToVersionedHashesReturnType {\n const { commitments, version } = parameters\n\n const to =\n parameters.to ?? (typeof commitments[0] === 'string' ? 'hex' : 'bytes')\n\n const hashes: Uint8Array[] | Hex[] = []\n for (const commitment of commitments) {\n hashes.push(\n commitmentToVersionedHash({\n commitment,\n to,\n version,\n }) as any,\n )\n }\n return hashes as any\n}\n","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\n\n/** Blob limit per transaction. */\nconst blobsPerTransaction = 6\n\n/** The number of bytes in a BLS scalar field element. */\nexport const bytesPerFieldElement = 32\n\n/** The number of field elements in a blob. */\nexport const fieldElementsPerBlob = 4096\n\n/** The number of bytes in a blob. */\nexport const bytesPerBlob = bytesPerFieldElement * fieldElementsPerBlob\n\n/** Blob bytes limit per transaction. */\nexport const maxBytesPerTransaction =\n bytesPerBlob * blobsPerTransaction -\n // terminator byte (0x80).\n 1 -\n // zero byte (0x00) appended to each field element.\n 1 * fieldElementsPerBlob * blobsPerTransaction\n","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\n\nexport const versionedHashVersionKzg = 1\n","import { versionedHashVersionKzg } from '../constants/kzg.js'\nimport type { Hash } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type BlobSizeTooLargeErrorType = BlobSizeTooLargeError & {\n name: 'BlobSizeTooLargeError'\n}\nexport class BlobSizeTooLargeError extends BaseError {\n constructor({ maxSize, size }: { maxSize: number; size: number }) {\n super('Blob size is too large.', {\n metaMessages: [`Max: ${maxSize} bytes`, `Given: ${size} bytes`],\n name: 'BlobSizeTooLargeError',\n })\n }\n}\n\nexport type EmptyBlobErrorType = EmptyBlobError & {\n name: 'EmptyBlobError'\n}\nexport class EmptyBlobError extends BaseError {\n constructor() {\n super('Blob data must not be empty.', { name: 'EmptyBlobError' })\n }\n}\n\nexport type InvalidVersionedHashSizeErrorType =\n InvalidVersionedHashSizeError & {\n name: 'InvalidVersionedHashSizeError'\n }\nexport class InvalidVersionedHashSizeError extends BaseError {\n constructor({\n hash,\n size,\n }: {\n hash: Hash\n size: number\n }) {\n super(`Versioned hash \"${hash}\" size is invalid.`, {\n metaMessages: ['Expected: 32', `Received: ${size}`],\n name: 'InvalidVersionedHashSizeError',\n })\n }\n}\n\nexport type InvalidVersionedHashVersionErrorType =\n InvalidVersionedHashVersionError & {\n name: 'InvalidVersionedHashVersionError'\n }\nexport class InvalidVersionedHashVersionError extends BaseError {\n constructor({\n hash,\n version,\n }: {\n hash: Hash\n version: number\n }) {\n super(`Versioned hash \"${hash}\" version is invalid.`, {\n metaMessages: [\n `Expected: ${versionedHashVersionKzg}`,\n `Received: ${version}`,\n ],\n name: 'InvalidVersionedHashVersionError',\n })\n }\n}\n","import {\n bytesPerBlob,\n bytesPerFieldElement,\n fieldElementsPerBlob,\n maxBytesPerTransaction,\n} from '../../constants/blob.js'\nimport {\n BlobSizeTooLargeError,\n type BlobSizeTooLargeErrorType,\n EmptyBlobError,\n type EmptyBlobErrorType,\n} from '../../errors/blob.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type CreateCursorErrorType, createCursor } from '../cursor.js'\nimport { type SizeErrorType, size } from '../data/size.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type ToBlobsParameters<\n data extends Hex | ByteArray = Hex | ByteArray,\n to extends To | undefined = undefined,\n> = {\n /** Data to transform to a blob. */\n data: data | Hex | ByteArray\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type ToBlobsReturnType =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type ToBlobsErrorType =\n | BlobSizeTooLargeErrorType\n | BytesToHexErrorType\n | CreateCursorErrorType\n | EmptyBlobErrorType\n | HexToBytesErrorType\n | SizeErrorType\n | ErrorType\n\n/**\n * Transforms arbitrary data to blobs.\n *\n * @example\n * ```ts\n * import { toBlobs, stringToHex } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * ```\n */\nexport function toBlobs<\n const data extends Hex | ByteArray,\n to extends To =\n | (data extends Hex ? 'hex' : never)\n | (data extends ByteArray ? 'bytes' : never),\n>(parameters: ToBlobsParameters): ToBlobsReturnType {\n const to =\n parameters.to ?? (typeof parameters.data === 'string' ? 'hex' : 'bytes')\n const data = (\n typeof parameters.data === 'string'\n ? hexToBytes(parameters.data)\n : parameters.data\n ) as ByteArray\n\n const size_ = size(data)\n if (!size_) throw new EmptyBlobError()\n if (size_ > maxBytesPerTransaction)\n throw new BlobSizeTooLargeError({\n maxSize: maxBytesPerTransaction,\n size: size_,\n })\n\n const blobs = []\n\n let active = true\n let position = 0\n while (active) {\n const blob = createCursor(new Uint8Array(bytesPerBlob))\n\n let size = 0\n while (size < fieldElementsPerBlob) {\n const bytes = data.slice(position, position + (bytesPerFieldElement - 1))\n\n // Push a zero byte so the field element doesn't overflow the BLS modulus.\n blob.pushByte(0x00)\n\n // Push the current segment of data bytes.\n blob.pushBytes(bytes)\n\n // If we detect that the current segment of data bytes is less than 31 bytes,\n // we can stop processing and push a terminator byte to indicate the end of the blob.\n if (bytes.length < 31) {\n blob.pushByte(0x80)\n active = false\n break\n }\n\n size++\n position += 31\n }\n\n blobs.push(blob)\n }\n\n return (\n to === 'bytes'\n ? blobs.map((x) => x.bytes)\n : blobs.map((x) => bytesToHex(x.bytes))\n ) as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { BlobSidecars } from '../../types/eip4844.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type BlobsToCommitmentsErrorType,\n blobsToCommitments,\n} from './blobsToCommitments.js'\nimport { blobsToProofs, type blobsToProofsErrorType } from './blobsToProofs.js'\nimport { type ToBlobsErrorType, toBlobs } from './toBlobs.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type ToBlobSidecarsParameters<\n data extends Hex | ByteArray | undefined = undefined,\n blobs extends readonly Hex[] | readonly ByteArray[] | undefined = undefined,\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n ///\n _blobsType =\n | (blobs extends readonly Hex[] ? readonly Hex[] : never)\n | (blobs extends readonly ByteArray[] ? readonly ByteArray[] : never),\n> = {\n /** Return type. */\n to?: to | To | undefined\n} & OneOf<\n | {\n /** Data to transform into blobs. */\n data: data | Hex | ByteArray\n /** KZG implementation. */\n kzg: Kzg\n }\n | {\n /** Blobs. */\n blobs: blobs | readonly Hex[] | readonly ByteArray[]\n /** Commitment for each blob. */\n commitments: _blobsType | readonly Hex[] | readonly ByteArray[]\n /** Proof for each blob. */\n proofs: _blobsType | readonly Hex[] | readonly ByteArray[]\n }\n>\n\nexport type ToBlobSidecarsReturnType =\n | (to extends 'bytes' ? BlobSidecars : never)\n | (to extends 'hex' ? BlobSidecars : never)\n\nexport type ToBlobSidecarsErrorType =\n | BlobsToCommitmentsErrorType\n | ToBlobsErrorType\n | blobsToProofsErrorType\n | ErrorType\n\n/**\n * Transforms arbitrary data (or blobs, commitments, & proofs) into a sidecar array.\n *\n * @example\n * ```ts\n * import { toBlobSidecars, stringToHex } from 'viem'\n *\n * const sidecars = toBlobSidecars({ data: stringToHex('hello world') })\n * ```\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * toBlobs,\n * blobsToProofs,\n * toBlobSidecars,\n * stringToHex\n * } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n *\n * const sidecars = toBlobSidecars({ blobs, commitments, proofs })\n * ```\n */\nexport function toBlobSidecars<\n const data extends Hex | ByteArray | undefined = undefined,\n const blobs extends\n | readonly Hex[]\n | readonly ByteArray[]\n | undefined = undefined,\n to extends To =\n | (data extends Hex ? 'hex' : never)\n | (data extends ByteArray ? 'bytes' : never)\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: ToBlobSidecarsParameters,\n): ToBlobSidecarsReturnType {\n const { data, kzg, to } = parameters\n const blobs = parameters.blobs ?? toBlobs({ data: data!, to })\n const commitments =\n parameters.commitments ?? blobsToCommitments({ blobs, kzg: kzg!, to })\n const proofs =\n parameters.proofs ?? blobsToProofs({ blobs, commitments, kzg: kzg!, to })\n\n const sidecars: BlobSidecars = []\n for (let i = 0; i < blobs.length; i++)\n sidecars.push({\n blob: blobs[i],\n commitment: commitments[i],\n proof: proofs[i],\n })\n\n return sidecars as ToBlobSidecarsReturnType\n}\n","import {\n InvalidSerializableTransactionError,\n type InvalidSerializableTransactionErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n FeeValuesEIP1559,\n FeeValuesEIP4844,\n FeeValuesLegacy,\n} from '../../index.js'\nimport type {\n TransactionRequestGeneric,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n} from '../../types/transaction.js'\nimport type { Assign, ExactPartial, IsNever, OneOf } from '../../types/utils.js'\n\nexport type GetTransactionType<\n transaction extends OneOf<\n TransactionSerializableGeneric | TransactionRequestGeneric\n > = TransactionSerializableGeneric,\n result =\n | (transaction extends LegacyProperties ? 'legacy' : never)\n | (transaction extends EIP1559Properties ? 'eip1559' : never)\n | (transaction extends EIP2930Properties ? 'eip2930' : never)\n | (transaction extends EIP4844Properties ? 'eip4844' : never)\n | (transaction extends EIP7702Properties ? 'eip7702' : never)\n | (transaction['type'] extends TransactionSerializableGeneric['type']\n ? Extract\n : never),\n> = IsNever extends true\n ? string\n : IsNever extends false\n ? result\n : string\n\nexport type GetTransactionTypeErrorType =\n | InvalidSerializableTransactionErrorType\n | ErrorType\n\nexport function getTransactionType<\n const transaction extends OneOf<\n TransactionSerializableGeneric | TransactionRequestGeneric\n >,\n>(transaction: transaction): GetTransactionType {\n if (transaction.type)\n return transaction.type as GetTransactionType\n\n if (typeof transaction.authorizationList !== 'undefined')\n return 'eip7702' as any\n\n if (\n typeof transaction.blobs !== 'undefined' ||\n typeof transaction.blobVersionedHashes !== 'undefined' ||\n typeof transaction.maxFeePerBlobGas !== 'undefined' ||\n typeof transaction.sidecars !== 'undefined'\n )\n return 'eip4844' as any\n\n if (\n typeof transaction.maxFeePerGas !== 'undefined' ||\n typeof transaction.maxPriorityFeePerGas !== 'undefined'\n ) {\n return 'eip1559' as any\n }\n\n if (typeof transaction.gasPrice !== 'undefined') {\n if (typeof transaction.accessList !== 'undefined') return 'eip2930' as any\n return 'legacy' as any\n }\n\n throw new InvalidSerializableTransactionError({ transaction })\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// Types\n\ntype BaseProperties = {\n accessList?: undefined\n authorizationList?: undefined\n blobs?: undefined\n blobVersionedHashes?: undefined\n gasPrice?: undefined\n maxFeePerBlobGas?: undefined\n maxFeePerGas?: undefined\n maxPriorityFeePerGas?: undefined\n sidecars?: undefined\n}\n\ntype LegacyProperties = Assign\ntype EIP1559Properties = Assign<\n BaseProperties,\n OneOf<\n | {\n maxFeePerGas: FeeValuesEIP1559['maxFeePerGas']\n }\n | {\n maxPriorityFeePerGas: FeeValuesEIP1559['maxPriorityFeePerGas']\n },\n FeeValuesEIP1559\n > & {\n accessList?: TransactionSerializableEIP2930['accessList'] | undefined\n }\n>\ntype EIP2930Properties = Assign<\n ExactPartial,\n {\n accessList: TransactionSerializableEIP2930['accessList']\n }\n>\ntype EIP4844Properties = Assign<\n ExactPartial,\n ExactPartial &\n OneOf<\n | {\n blobs: TransactionSerializableEIP4844['blobs']\n }\n | {\n blobVersionedHashes: TransactionSerializableEIP4844['blobVersionedHashes']\n }\n | {\n sidecars: TransactionSerializableEIP4844['sidecars']\n },\n TransactionSerializableEIP4844\n >\n>\ntype EIP7702Properties = Assign<\n ExactPartial,\n {\n authorizationList: TransactionSerializableEIP7702['authorizationList']\n }\n>\n","import type { Account } from '../../accounts/types.js'\nimport type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport {\n TransactionExecutionError,\n type TransactionExecutionErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetTransactionErrorParameters = Omit<\n SendTransactionParameters,\n 'account' | 'chain'\n> & {\n account: Account | null\n chain?: Chain | undefined\n docsPath?: string | undefined\n}\n\nexport type GetTransactionErrorReturnType = Omit<\n TransactionExecutionErrorType,\n 'cause'\n> & { cause: cause | GetNodeErrorReturnType }\n\nexport function getTransactionError>(\n err: err,\n { docsPath, ...args }: GetTransactionErrorParameters,\n): GetTransactionErrorReturnType {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new TransactionExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetTransactionErrorReturnType\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\n\nexport type GetChainIdReturnType = number\n\nexport type GetChainIdErrorType =\n | HexToNumberErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the chain ID associated with the current network.\n *\n * - Docs: https://viem.sh/docs/actions/public/getChainId\n * - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid)\n *\n * @param client - Client to use\n * @returns The current chain ID. {@link GetChainIdReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getChainId } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const chainId = await getChainId(client)\n * // 1\n */\nexport async function getChainId<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client): Promise {\n const chainIdHex = await client.request(\n {\n method: 'eth_chainId',\n },\n { dedupe: true },\n )\n return hexToNumber(chainIdHex)\n}\n","import type { Address } from 'abitype'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { BaseFeeScalarError } from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account, GetAccountParameter } from '../../types/account.js'\nimport type {\n Chain,\n ChainFeesFnParameters,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type GetTransactionErrorReturnType,\n getTransactionError,\n} from '../../utils/errors/getTransactionError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransaction,\n formatTransaction,\n} from '../../utils/formatters/transaction.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { NonceManager } from '../../utils/nonceManager.js'\nimport { assertRequest } from '../../utils/transaction/assertRequest.js'\nimport { getBlock } from './getBlock.js'\nimport { getChainId as getChainId_ } from './getChainId.js'\n\nexport type FillTransactionParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain,\n> = UnionOmit, 'from'> &\n GetAccountParameter &\n GetChainParameter & {\n /**\n * Nonce manager to use for the transaction request.\n */\n nonceManager?: NonceManager | undefined\n }\n\nexport type FillTransactionReturnType<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain,\n> = {\n raw: Hex\n transaction: FormattedTransaction<_derivedChain>\n}\n\nexport type FillTransactionErrorType =\n | GetTransactionErrorReturnType\n | ErrorType\n\n/**\n * Fills a transaction request with the necessary fields to be signed over.\n *\n * - Docs: https://viem.sh/docs/actions/public/fillTransaction\n *\n * @param client - Client to use\n * @param parameters - {@link FillTransactionParameters}\n * @returns The filled transaction. {@link FillTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { fillTransaction } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await fillTransaction(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\nexport async function fillTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | undefined = undefined,\n>(\n client: Client,\n parameters: FillTransactionParameters<\n chain,\n account,\n chainOverride,\n accountOverride\n >,\n): Promise> {\n const {\n account = client.account,\n accessList,\n authorizationList,\n chain = client.chain,\n blobVersionedHashes,\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: nonce_,\n nonceManager,\n to,\n type,\n value,\n ...rest\n } = parameters\n\n const nonce = await (async () => {\n if (!account) return nonce_\n if (!nonceManager) return nonce_\n if (typeof nonce_ !== 'undefined') return nonce_\n const account_ = parseAccount(account)\n const chainId = chain\n ? chain.id\n : await getAction(client, getChainId_, 'getChainId')({})\n return await nonceManager.consume({\n address: account_.address,\n chainId,\n client,\n })\n })()\n\n assertRequest(parameters)\n\n const chainFormat = chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account: account ? parseAccount(account) : undefined,\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n type,\n value,\n } as TransactionRequest,\n 'fillTransaction',\n )\n\n try {\n const response = await client.request({\n method: 'eth_fillTransaction',\n params: [request],\n })\n const format = chain?.formatters?.transaction?.format || formatTransaction\n\n const transaction = format(response.tx)\n\n // Remove unnecessary fields.\n delete transaction.blockHash\n delete transaction.blockNumber\n delete transaction.r\n delete transaction.s\n delete transaction.transactionIndex\n delete transaction.v\n delete transaction.yParity\n\n // Rewrite fields.\n transaction.data = transaction.input\n\n // Preference supplied fees (some nodes do not take these preferences).\n if (transaction.gas) transaction.gas = parameters.gas ?? transaction.gas\n if (transaction.gasPrice)\n transaction.gasPrice = parameters.gasPrice ?? transaction.gasPrice\n if (transaction.maxFeePerBlobGas)\n transaction.maxFeePerBlobGas =\n parameters.maxFeePerBlobGas ?? transaction.maxFeePerBlobGas\n if (transaction.maxFeePerGas)\n transaction.maxFeePerGas =\n parameters.maxFeePerGas ?? transaction.maxFeePerGas\n if (transaction.maxPriorityFeePerGas)\n transaction.maxPriorityFeePerGas =\n parameters.maxPriorityFeePerGas ?? transaction.maxPriorityFeePerGas\n if (transaction.nonce)\n transaction.nonce = parameters.nonce ?? transaction.nonce\n\n // Build fee multiplier function.\n const feeMultiplier = await (async () => {\n if (typeof chain?.fees?.baseFeeMultiplier === 'function') {\n const block = await getAction(client, getBlock, 'getBlock')({})\n return chain.fees.baseFeeMultiplier({\n block,\n client,\n request: parameters,\n } as ChainFeesFnParameters)\n }\n return chain?.fees?.baseFeeMultiplier ?? 1.2\n })()\n if (feeMultiplier < 1) throw new BaseFeeScalarError()\n\n const decimals = feeMultiplier.toString().split('.')[1]?.length ?? 0\n const denominator = 10 ** decimals\n const multiplyFee = (base: bigint) =>\n (base * BigInt(Math.ceil(feeMultiplier * denominator))) /\n BigInt(denominator)\n\n // Apply fee multiplier.\n if (transaction.maxFeePerGas && !parameters.maxFeePerGas)\n transaction.maxFeePerGas = multiplyFee(transaction.maxFeePerGas)\n if (transaction.gasPrice && !parameters.gasPrice)\n transaction.gasPrice = multiplyFee(transaction.gasPrice)\n\n return {\n raw: response.raw,\n transaction: {\n from: request.from,\n ...transaction,\n },\n }\n } catch (err) {\n throw getTransactionError(\n err as BaseError,\n {\n ...parameters,\n chain: client.chain,\n } as never,\n )\n }\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport {\n type EstimateFeesPerGasErrorType,\n internal_estimateFeesPerGas,\n} from '../../actions/public/estimateFeesPerGas.js'\nimport {\n type EstimateGasErrorType,\n type EstimateGasParameters,\n estimateGas,\n} from '../../actions/public/estimateGas.js'\nimport {\n type GetBlockErrorType,\n getBlock as getBlock_,\n} from '../../actions/public/getBlock.js'\nimport {\n type GetTransactionCountErrorType,\n getTransactionCount,\n} from '../../actions/public/getTransactionCount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { AccountNotFoundErrorType } from '../../errors/account.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n Eip1559FeesNotSupportedError,\n MaxFeePerGasTooLowError,\n} from '../../errors/fee.js'\nimport type { DeriveAccount, GetAccountParameter } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { GetTransactionRequestKzgParameter } from '../../types/kzg.js'\nimport type {\n TransactionRequest,\n TransactionRequestEIP1559,\n TransactionRequestEIP2930,\n TransactionRequestEIP4844,\n TransactionRequestEIP7702,\n TransactionRequestLegacy,\n TransactionSerializable,\n} from '../../types/transaction.js'\nimport type {\n ExactPartial,\n IsNever,\n Prettify,\n UnionOmit,\n UnionRequiredBy,\n} from '../../types/utils.js'\nimport { blobsToCommitments } from '../../utils/blob/blobsToCommitments.js'\nimport { blobsToProofs } from '../../utils/blob/blobsToProofs.js'\nimport { commitmentsToVersionedHashes } from '../../utils/blob/commitmentsToVersionedHashes.js'\nimport { toBlobSidecars } from '../../utils/blob/toBlobSidecars.js'\nimport type { FormattedTransactionRequest } from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { LruMap } from '../../utils/lru.js'\nimport type { NonceManager } from '../../utils/nonceManager.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport {\n type GetTransactionType,\n getTransactionType,\n} from '../../utils/transaction/getTransactionType.js'\nimport {\n type FillTransactionErrorType,\n type FillTransactionParameters,\n fillTransaction,\n} from '../public/fillTransaction.js'\nimport { getChainId as getChainId_ } from '../public/getChainId.js'\n\nexport const defaultParameters = [\n 'blobVersionedHashes',\n 'chainId',\n 'fees',\n 'gas',\n 'nonce',\n 'type',\n] as const\n\n/** @internal */\nexport const eip1559NetworkCache = /*#__PURE__*/ new Map()\n\n/** @internal */\nexport const supportsFillTransaction = /*#__PURE__*/ new LruMap(128)\n\nexport type PrepareTransactionRequestParameterType =\n | 'blobVersionedHashes'\n | 'chainId'\n | 'fees'\n | 'gas'\n | 'nonce'\n | 'sidecars'\n | 'type'\ntype ParameterTypeToParameters<\n parameterType extends PrepareTransactionRequestParameterType,\n> = parameterType extends 'fees'\n ? 'maxFeePerGas' | 'maxPriorityFeePerGas' | 'gasPrice'\n : parameterType\n\nexport type PrepareTransactionRequestRequest<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain,\n> = UnionOmit, 'from'> &\n GetTransactionRequestKzgParameter & {\n /**\n * Nonce manager to use for the transaction request.\n */\n nonceManager?: NonceManager | undefined\n /**\n * Parameters to prepare for the transaction request.\n *\n * @default ['blobVersionedHashes', 'chainId', 'fees', 'gas', 'nonce', 'type']\n */\n parameters?: readonly PrepareTransactionRequestParameterType[] | undefined\n }\n\nexport type PrepareTransactionRequestParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n > = PrepareTransactionRequestRequest,\n> = request &\n GetAccountParameter &\n GetChainParameter &\n GetTransactionRequestKzgParameter & { chainId?: number | undefined }\n\nexport type PrepareTransactionRequestReturnType<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n > = PrepareTransactionRequestRequest,\n ///\n _derivedAccount extends Account | Address | undefined = DeriveAccount<\n account,\n accountOverride\n >,\n _derivedChain extends Chain | undefined = DeriveChain,\n _transactionType = request['type'] extends string | undefined\n ? request['type']\n : GetTransactionType extends 'legacy'\n ? unknown\n : GetTransactionType,\n _transactionRequest extends TransactionRequest =\n | (_transactionType extends 'legacy' ? TransactionRequestLegacy : never)\n | (_transactionType extends 'eip1559' ? TransactionRequestEIP1559 : never)\n | (_transactionType extends 'eip2930' ? TransactionRequestEIP2930 : never)\n | (_transactionType extends 'eip4844' ? TransactionRequestEIP4844 : never)\n | (_transactionType extends 'eip7702' ? TransactionRequestEIP7702 : never),\n> = Prettify<\n UnionRequiredBy<\n Extract<\n UnionOmit, 'from'> &\n (_derivedChain extends Chain\n ? { chain: _derivedChain }\n : { chain?: undefined }) &\n (_derivedAccount extends Account\n ? { account: _derivedAccount; from: Address }\n : { account?: undefined; from?: undefined }),\n IsNever<_transactionRequest> extends true\n ? unknown\n : ExactPartial<_transactionRequest>\n > & { chainId?: number | undefined },\n ParameterTypeToParameters<\n request['parameters'] extends readonly PrepareTransactionRequestParameterType[]\n ? request['parameters'][number]\n : (typeof defaultParameters)[number]\n >\n > &\n (unknown extends request['kzg'] ? {} : Pick)\n>\n\nexport type PrepareTransactionRequestErrorType =\n | AccountNotFoundErrorType\n | AssertRequestErrorType\n | ParseAccountErrorType\n | GetBlockErrorType\n | GetTransactionCountErrorType\n | EstimateGasErrorType\n | EstimateFeesPerGasErrorType\n\n/**\n * Prepares a transaction request for signing.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest\n *\n * @param args - {@link PrepareTransactionRequestParameters}\n * @returns The transaction request. {@link PrepareTransactionRequestReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n */\nexport async function prepareTransactionRequest<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const request extends PrepareTransactionRequestRequest,\n accountOverride extends Account | Address | undefined = undefined,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client,\n args: PrepareTransactionRequestParameters<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >,\n): Promise<\n PrepareTransactionRequestReturnType<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >\n> {\n let request = args as PrepareTransactionRequestParameters\n\n request.account ??= client.account\n request.parameters ??= defaultParameters\n\n const {\n account: account_,\n chain = client.chain,\n nonceManager,\n parameters,\n } = request\n\n const prepareTransactionRequest = (() => {\n if (typeof chain?.prepareTransactionRequest === 'function')\n return {\n fn: chain.prepareTransactionRequest,\n runAt: ['beforeFillTransaction'],\n }\n if (Array.isArray(chain?.prepareTransactionRequest))\n return {\n fn: chain.prepareTransactionRequest[0],\n runAt: chain.prepareTransactionRequest[1].runAt,\n }\n return undefined\n })()\n\n let chainId: number | undefined\n async function getChainId(): Promise {\n if (chainId) return chainId\n if (typeof request.chainId !== 'undefined') return request.chainId\n if (chain) return chain.id\n const chainId_ = await getAction(client, getChainId_, 'getChainId')({})\n chainId = chainId_\n return chainId\n }\n\n const account = account_ ? parseAccount(account_) : account_\n\n let nonce = request.nonce\n if (\n parameters.includes('nonce') &&\n typeof nonce === 'undefined' &&\n account &&\n nonceManager\n ) {\n const chainId = await getChainId()\n nonce = await nonceManager.consume({\n address: account.address,\n chainId,\n client,\n })\n }\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('beforeFillTransaction')\n ) {\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'beforeFillTransaction',\n },\n )\n nonce ??= request.nonce\n }\n\n const attemptFill = (() => {\n // Do not attempt if blobs are provided.\n if (\n (parameters.includes('blobVersionedHashes') ||\n parameters.includes('sidecars')) &&\n request.kzg &&\n request.blobs\n )\n return false\n\n // Do not attempt if `eth_fillTransaction` is not supported.\n if (supportsFillTransaction.get(client.uid) === false) return false\n\n // Should attempt `eth_fillTransaction` if \"fees\" or \"gas\" are required to be populated,\n // otherwise, can just use the other individual calls.\n const shouldAttempt = ['fees', 'gas'].some((parameter) =>\n parameters.includes(parameter as PrepareTransactionRequestParameterType),\n )\n if (!shouldAttempt) return false\n\n // Check if `eth_fillTransaction` needs to be called.\n if (parameters.includes('chainId') && typeof request.chainId !== 'number')\n return true\n if (parameters.includes('nonce') && typeof nonce !== 'number') return true\n if (\n parameters.includes('fees') &&\n typeof request.gasPrice !== 'bigint' &&\n (typeof request.maxFeePerGas !== 'bigint' ||\n typeof (request as any).maxPriorityFeePerGas !== 'bigint')\n )\n return true\n if (parameters.includes('gas') && typeof request.gas !== 'bigint')\n return true\n return false\n })()\n\n const fillResult = attemptFill\n ? await getAction(\n client,\n fillTransaction,\n 'fillTransaction',\n )({ ...request, nonce } as FillTransactionParameters)\n .then((result) => {\n const {\n chainId,\n from,\n gas,\n gasPrice,\n nonce,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n type,\n ...rest\n } = result.transaction\n supportsFillTransaction.set(client.uid, true)\n return {\n ...request,\n ...(from ? { from } : {}),\n ...(type && !request.type ? { type } : {}),\n ...(typeof chainId !== 'undefined' ? { chainId } : {}),\n ...(typeof gas !== 'undefined' ? { gas } : {}),\n ...(typeof gasPrice !== 'undefined' ? { gasPrice } : {}),\n ...(typeof nonce !== 'undefined' ? { nonce } : {}),\n ...(typeof maxFeePerBlobGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxFeePerBlobGas }\n : {}),\n ...(typeof maxFeePerGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxFeePerGas }\n : {}),\n ...(typeof maxPriorityFeePerGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxPriorityFeePerGas }\n : {}),\n ...('nonceKey' in rest && typeof rest.nonceKey !== 'undefined'\n ? { nonceKey: rest.nonceKey }\n : {}),\n ...('keyAuthorization' in rest &&\n typeof rest.keyAuthorization !== 'undefined' &&\n rest.keyAuthorization !== null &&\n !('keyAuthorization' in request)\n ? { keyAuthorization: rest.keyAuthorization }\n : {}),\n }\n })\n .catch((e) => {\n const error = e as FillTransactionErrorType\n\n if (error.name !== 'TransactionExecutionError') return request\n\n const executionReverted = error.walk?.((e) => {\n const error = e as BaseError\n return error.name === 'ExecutionRevertedError'\n })\n if (executionReverted) throw e\n\n const unsupported = error.walk?.((e) => {\n const error = e as BaseError\n return (\n error.name === 'MethodNotFoundRpcError' ||\n error.name === 'MethodNotSupportedRpcError' ||\n error.message?.includes('eth_fillTransaction is not available')\n )\n })\n if (unsupported) supportsFillTransaction.set(client.uid, false)\n\n return request\n })\n : request\n\n nonce ??= fillResult.nonce\n\n request = {\n ...(fillResult as any),\n ...(account ? { from: account?.address } : {}),\n ...(nonce ? { nonce } : {}),\n }\n const { blobs, gas, kzg, type } = request\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('beforeFillParameters')\n ) {\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'beforeFillParameters',\n },\n )\n }\n\n let block: Block | undefined\n async function getBlock(): Promise {\n if (block) return block\n block = await getAction(\n client,\n getBlock_,\n 'getBlock',\n )({ blockTag: 'latest' })\n return block\n }\n\n if (\n parameters.includes('nonce') &&\n typeof nonce === 'undefined' &&\n account &&\n !nonceManager\n )\n request.nonce = await getAction(\n client,\n getTransactionCount,\n 'getTransactionCount',\n )({\n address: account.address,\n blockTag: 'pending',\n })\n\n if (\n (parameters.includes('blobVersionedHashes') ||\n parameters.includes('sidecars')) &&\n blobs &&\n kzg\n ) {\n const commitments = blobsToCommitments({ blobs, kzg })\n\n if (parameters.includes('blobVersionedHashes')) {\n const versionedHashes = commitmentsToVersionedHashes({\n commitments,\n to: 'hex',\n })\n request.blobVersionedHashes = versionedHashes\n }\n if (parameters.includes('sidecars')) {\n const proofs = blobsToProofs({ blobs, commitments, kzg })\n const sidecars = toBlobSidecars({\n blobs,\n commitments,\n proofs,\n to: 'hex',\n })\n request.sidecars = sidecars\n }\n }\n\n if (parameters.includes('chainId')) request.chainId = await getChainId()\n\n if (\n (parameters.includes('fees') || parameters.includes('type')) &&\n typeof type === 'undefined'\n ) {\n try {\n request.type = getTransactionType(\n request as TransactionSerializable,\n ) as any\n } catch {\n let isEip1559Network = eip1559NetworkCache.get(client.uid)\n if (typeof isEip1559Network === 'undefined') {\n const block = await getBlock()\n isEip1559Network = typeof block?.baseFeePerGas === 'bigint'\n eip1559NetworkCache.set(client.uid, isEip1559Network)\n }\n request.type = isEip1559Network ? 'eip1559' : 'legacy'\n }\n }\n\n if (parameters.includes('fees')) {\n // TODO(4844): derive blob base fees once https://github.com/ethereum/execution-apis/pull/486 is merged.\n\n if (request.type !== 'legacy' && request.type !== 'eip2930') {\n // EIP-1559 fees\n if (\n typeof request.maxFeePerGas === 'undefined' ||\n typeof request.maxPriorityFeePerGas === 'undefined'\n ) {\n const block = await getBlock()\n const { maxFeePerGas, maxPriorityFeePerGas } =\n await internal_estimateFeesPerGas(client, {\n block: block as Block,\n chain,\n request: request as PrepareTransactionRequestParameters,\n })\n\n if (\n typeof request.maxPriorityFeePerGas === 'undefined' &&\n request.maxFeePerGas &&\n request.maxFeePerGas < maxPriorityFeePerGas\n )\n throw new MaxFeePerGasTooLowError({\n maxPriorityFeePerGas,\n })\n\n request.maxPriorityFeePerGas = maxPriorityFeePerGas\n request.maxFeePerGas = maxFeePerGas\n }\n } else {\n // Legacy fees\n if (\n typeof request.maxFeePerGas !== 'undefined' ||\n typeof request.maxPriorityFeePerGas !== 'undefined'\n )\n throw new Eip1559FeesNotSupportedError()\n\n if (typeof request.gasPrice === 'undefined') {\n const block = await getBlock()\n const { gasPrice: gasPrice_ } = await internal_estimateFeesPerGas(\n client,\n {\n block: block as Block,\n chain,\n request: request as PrepareTransactionRequestParameters,\n type: 'legacy',\n },\n )\n request.gasPrice = gasPrice_\n }\n }\n }\n\n if (parameters.includes('gas') && typeof gas === 'undefined')\n request.gas = await getAction(\n client,\n estimateGas,\n 'estimateGas',\n )({\n ...request,\n account,\n prepare: account?.type === 'local' ? [] : ['blobVersionedHashes'],\n } as EstimateGasParameters)\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('afterFillParameters')\n )\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'afterFillParameters',\n },\n )\n\n assertRequest(request as AssertRequestParameters)\n\n delete request.parameters\n\n return request as any\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BaseError } from '../../errors/base.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n recoverAuthorizationAddress,\n} from '../../utils/authorization/recoverAuthorizationAddress.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type GetEstimateGasErrorReturnType,\n getEstimateGasError,\n} from '../../utils/errors/getEstimateGasError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { serializeStateOverride } from '../../utils/stateOverride.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport {\n type PrepareTransactionRequestParameters,\n type PrepareTransactionRequestParameterType,\n prepareTransactionRequest,\n} from '../wallet/prepareTransactionRequest.js'\n\nexport type EstimateGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = UnionOmit, 'from'> & {\n account?: Account | Address | undefined\n prepare?:\n | boolean\n | readonly PrepareTransactionRequestParameterType[]\n | undefined\n stateOverride?: StateOverride | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n )\ntype FormattedEstimateGas =\n FormattedTransactionRequest\n\nexport type EstimateGasReturnType = bigint\n\nexport type EstimateGasErrorType = GetEstimateGasErrorReturnType<\n | ParseAccountErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | RecoverAuthorizationAddressErrorType\n | AssertRequestErrorType\n>\n\n/**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateGasParameters}\n * @returns The gas estimate (in gas units). {@link EstimateGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateGas } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasEstimate = await estimateGas(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\nexport async function estimateGas<\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n>(\n client: Client,\n args: EstimateGasParameters,\n): Promise {\n const { account: account_ = client.account, prepare = true } = args\n const account = account_ ? parseAccount(account_) : undefined\n\n const parameters = (() => {\n if (Array.isArray(prepare)) return prepare\n // Some RPC Providers do not compute versioned hashes from blobs. We will need\n // to compute them.\n if (account?.type !== 'local') return ['blobVersionedHashes']\n return undefined\n })()\n\n try {\n const to = await (async () => {\n // If `to` exists on the parameters, use that.\n if (args.to) return args.to\n\n // If no `to` exists, and we are sending a EIP-7702 transaction, use the\n // address of the first authorization in the list.\n if (args.authorizationList && args.authorizationList.length > 0)\n return await recoverAuthorizationAddress({\n authorization: args.authorizationList[0],\n }).catch(() => {\n throw new BaseError(\n '`to` is required. Could not infer from `authorizationList`',\n )\n })\n\n // Otherwise, we are sending a deployment transaction.\n return undefined\n })()\n\n const {\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n blockNumber,\n blockTag,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n value,\n stateOverride,\n ...rest\n } = prepare\n ? ((await prepareTransactionRequest(client, {\n ...args,\n parameters,\n to,\n } as PrepareTransactionRequestParameters)) as EstimateGasParameters)\n : args\n\n // If we get `gas` back from the prepared transaction request, which is\n // different from the `gas` we provided, it was likely filled by other means\n // during request preparation (e.g. `eth_fillTransaction` or `chain.transactionRequest.prepare`).\n // (e.g. `eth_fillTransaction` or `chain.transactionRequest.prepare`).\n if (gas && args.gas !== gas) return gas\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const rpcStateOverride = serializeStateOverride(stateOverride)\n\n assertRequest(args as AssertRequestParameters)\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account,\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n data,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n } as TransactionRequest,\n 'estimateGas',\n )\n\n return BigInt(\n await client.request({\n method: 'eth_estimateGas',\n params: rpcStateOverride\n ? [\n request,\n block ?? client.experimental_blockTag ?? 'latest',\n rpcStateOverride,\n ]\n : block\n ? [request, block]\n : [request],\n }),\n )\n } catch (err) {\n throw getEstimateGasError(err as BaseError, {\n ...args,\n account,\n chain: client.chain,\n })\n }\n}\n","import type { Abi } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n GetValue,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type EstimateGasErrorType,\n type EstimateGasParameters,\n estimateGas,\n} from './estimateGas.js'\n\nexport type EstimateContractGasParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs,\n chain extends Chain | undefined = Chain | undefined,\n> = ContractFunctionParameters<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n args\n> &\n UnionOmit, 'data' | 'to' | 'value'> &\n GetValue<\n abi,\n functionName,\n EstimateGasParameters extends EstimateGasParameters\n ? EstimateGasParameters['value']\n : EstimateGasParameters['value']\n > & {\n /** Data to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f). */\n dataSuffix?: Hex | undefined\n }\n\nexport type EstimateContractGasReturnType = bigint\n\nexport type EstimateContractGasErrorType = GetContractErrorReturnType<\n EncodeFunctionDataErrorType | EstimateGasErrorType | ParseAccountErrorType\n>\n\n/**\n * Estimates the gas required to successfully execute a contract write function call.\n *\n * - Docs: https://viem.sh/docs/contract/estimateContractGas\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateContractGasParameters}\n * @returns The gas estimate (in wei). {@link EstimateContractGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateContractGas } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gas = await estimateContractGas(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint() public']),\n * functionName: 'mint',\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * })\n */\nexport async function estimateContractGas<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n args extends ContractFunctionArgs,\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n>(\n client: Client,\n parameters: EstimateContractGasParameters,\n): Promise {\n const {\n abi,\n address,\n args,\n functionName,\n dataSuffix = typeof client.dataSuffix === 'string'\n ? client.dataSuffix\n : client.dataSuffix?.value,\n ...request\n } = parameters as EstimateContractGasParameters\n const data = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n\n try {\n const gas = await getAction(\n client,\n estimateGas,\n 'estimateGas',\n )({\n data: `${data}${dataSuffix ? dataSuffix.replace('0x', '') : ''}`,\n to: address,\n ...request,\n } as unknown as EstimateGasParameters)\n return gas\n } catch (error) {\n const account = request.account ? parseAccount(request.account) : undefined\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/estimateContractGas',\n functionName,\n sender: account?.address,\n })\n }\n}\n","import type { Address } from 'abitype'\n\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport { isAddress } from './isAddress.js'\n\nexport type IsAddressEqualReturnType = boolean\nexport type IsAddressEqualErrorType = InvalidAddressErrorType | ErrorType\n\nexport function isAddressEqual(a: Address, b: Address) {\n if (!isAddress(a, { strict: false }))\n throw new InvalidAddressError({ address: a })\n if (!isAddress(b, { strict: false }))\n throw new InvalidAddressError({ address: b })\n return a.toLowerCase() === b.toLowerCase()\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Log } from '../../types/log.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport type { ExactPartial } from '../../types/utils.js'\n\nexport type FormatLogErrorType = ErrorType\n\nexport function formatLog(\n log: ExactPartial,\n {\n args,\n eventName,\n }: { args?: unknown | undefined; eventName?: string | undefined } = {},\n) {\n return {\n ...log,\n blockHash: log.blockHash ? log.blockHash : null,\n blockNumber: log.blockNumber ? BigInt(log.blockNumber) : null,\n blockTimestamp: log.blockTimestamp\n ? BigInt(log.blockTimestamp)\n : log.blockTimestamp === null\n ? null\n : undefined,\n logIndex: log.logIndex ? Number(log.logIndex) : null,\n transactionHash: log.transactionHash ? log.transactionHash : null,\n transactionIndex: log.transactionIndex\n ? Number(log.transactionIndex)\n : null,\n ...(eventName ? { args, eventName } : {}),\n } as Log\n}\n","import type { Abi, AbiParameter } from 'abitype'\n\nimport {\n AbiDecodingDataSizeTooSmallError,\n type AbiDecodingDataSizeTooSmallErrorType,\n AbiEventSignatureEmptyTopicsError,\n type AbiEventSignatureEmptyTopicsErrorType,\n AbiEventSignatureNotFoundError,\n type AbiEventSignatureNotFoundErrorType,\n DecodeLogDataMismatch,\n type DecodeLogDataMismatchErrorType,\n DecodeLogTopicsMismatch,\n type DecodeLogTopicsMismatchErrorType,\n} from '../../errors/abi.js'\nimport { PositionOutOfBoundsError } from '../../errors/cursor.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractEventArgsFromTopics,\n ContractEventName,\n EventDefinition,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n IsNarrowable,\n Prettify,\n UnionEvaluate,\n} from '../../types/utils.js'\nimport { size } from '../data/size.js'\nimport {\n type ToEventSelectorErrorType,\n toEventSelector,\n} from '../hash/toEventSelector.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\n\nexport type DecodeEventLogParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n> = {\n abi: abi\n data?: data | undefined\n eventName?: eventName | ContractEventName | undefined\n strict?: strict | boolean | undefined\n topics: [signature: Hex, ...args: topics] | []\n}\n\nexport type DecodeEventLogReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n ///\n allEventNames extends\n ContractEventName = eventName extends ContractEventName\n ? eventName\n : ContractEventName,\n> = IsNarrowable extends true\n ? {\n [name in allEventNames]: Prettify<\n {\n eventName: name\n } & UnionEvaluate<\n ContractEventArgsFromTopics extends infer allArgs\n ? topics extends readonly []\n ? data extends undefined\n ? { args?: undefined }\n : { args?: allArgs | undefined }\n : { args: allArgs }\n : never\n >\n >\n }[allEventNames]\n : {\n eventName: eventName\n args: readonly unknown[] | undefined\n }\n\nexport type DecodeEventLogErrorType =\n | AbiDecodingDataSizeTooSmallErrorType\n | AbiEventSignatureEmptyTopicsErrorType\n | AbiEventSignatureNotFoundErrorType\n | DecodeAbiParametersErrorType\n | DecodeLogTopicsMismatchErrorType\n | DecodeLogDataMismatchErrorType\n | FormatAbiItemErrorType\n | ToEventSelectorErrorType\n | ErrorType\n\nconst docsPath = '/docs/contract/decodeEventLog'\n\nexport function decodeEventLog<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n>(\n parameters: DecodeEventLogParameters,\n): DecodeEventLogReturnType {\n const {\n abi,\n data,\n strict: strict_,\n topics,\n } = parameters as DecodeEventLogParameters\n\n const strict = strict_ ?? true\n const [signature, ...argTopics] = topics\n if (!signature) throw new AbiEventSignatureEmptyTopicsError({ docsPath })\n\n const abiItem = abi.find(\n (x) =>\n x.type === 'event' &&\n signature === toEventSelector(formatAbiItem(x) as EventDefinition),\n )\n\n if (!(abiItem && 'name' in abiItem) || abiItem.type !== 'event')\n throw new AbiEventSignatureNotFoundError(signature, { docsPath })\n\n const { name, inputs } = abiItem\n const isUnnamed = inputs?.some((x) => !('name' in x && x.name))\n\n const args: any = isUnnamed ? [] : {}\n\n // Decode topics (indexed args).\n const indexedInputs = inputs\n .map((x, i) => [x, i] as const)\n .filter(([x]) => 'indexed' in x && x.indexed)\n\n const missingIndexedInputs: [AbiParameter, number][] = []\n\n for (let i = 0; i < indexedInputs.length; i++) {\n const [param, argIndex] = indexedInputs[i]\n const topic = argTopics[i]\n if (!topic) {\n if (strict)\n throw new DecodeLogTopicsMismatch({\n abiItem,\n param: param as AbiParameter & { indexed: boolean },\n })\n // Track missing indexed inputs to decode from data when strict is false\n missingIndexedInputs.push([param, argIndex])\n continue\n }\n args[isUnnamed ? argIndex : param.name || argIndex] = decodeTopic({\n param,\n value: topic,\n })\n }\n\n // Decode data (non-indexed args + missing indexed args when strict is false).\n const nonIndexedInputs = inputs.filter((x) => !('indexed' in x && x.indexed))\n\n // When strict is false, missing indexed inputs should be decoded from data\n const inputsToDecode = strict\n ? nonIndexedInputs\n : [...missingIndexedInputs.map(([param]) => param), ...nonIndexedInputs]\n\n if (inputsToDecode.length > 0) {\n if (data && data !== '0x') {\n try {\n const decodedData = decodeAbiParameters(\n inputsToDecode,\n data,\n ) as unknown[]\n if (decodedData) {\n let dataIndex = 0\n // First, assign missing indexed parameters (when strict is false)\n if (!strict) {\n for (const [param, argIndex] of missingIndexedInputs) {\n args[isUnnamed ? argIndex : param.name || argIndex] =\n decodedData[dataIndex++]\n }\n }\n // Then, assign non-indexed parameters\n if (isUnnamed) {\n for (let i = 0; i < inputs.length; i++)\n if (args[i] === undefined && dataIndex < decodedData.length)\n args[i] = decodedData[dataIndex++]\n } else\n for (let i = 0; i < nonIndexedInputs.length; i++)\n args[nonIndexedInputs[i].name!] = decodedData[dataIndex++]\n }\n } catch (err) {\n if (strict) {\n if (\n err instanceof AbiDecodingDataSizeTooSmallError ||\n err instanceof PositionOutOfBoundsError\n )\n throw new DecodeLogDataMismatch({\n abiItem,\n data: data,\n params: inputsToDecode,\n size: size(data),\n })\n throw err\n }\n }\n } else if (strict) {\n throw new DecodeLogDataMismatch({\n abiItem,\n data: '0x',\n params: inputsToDecode,\n size: 0,\n })\n }\n }\n\n return {\n eventName: name,\n args: Object.values(args).length > 0 ? args : undefined,\n } as unknown as DecodeEventLogReturnType\n}\n\nfunction decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {\n if (\n param.type === 'string' ||\n param.type === 'bytes' ||\n param.type === 'tuple' ||\n param.type.match(/^(.*)\\[(\\d+)?\\]$/)\n )\n return value\n const decodedArg = decodeAbiParameters([param], value) || []\n return decodedArg[0]\n}\n","// TODO(v3): checksum address.\n\nimport type { Abi, AbiEvent, AbiEventParameter, Address } from 'abitype'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ContractEventName, GetEventArgs } from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport { isAddressEqual } from '../address/isAddressEqual.js'\nimport { toBytes } from '../encoding/toBytes.js'\nimport { formatLog } from '../formatters/log.js'\nimport { keccak256 } from '../hash/keccak256.js'\nimport { toEventSelector } from '../hash/toEventSelector.js'\nimport {\n type DecodeEventLogErrorType,\n decodeEventLog,\n} from './decodeEventLog.js'\n\nexport type ParseEventLogsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends\n | ContractEventName\n | ContractEventName[]\n | undefined = ContractEventName,\n strict extends boolean | undefined = boolean | undefined,\n ///\n allArgs = GetEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName,\n {\n EnableUnion: true\n IndexedOnly: false\n Required: false\n }\n >,\n> = {\n /** Contract ABI. */\n abi: abi\n /** Arguments for the event. */\n args?: allArgs | undefined\n /** Contract event. */\n eventName?:\n | eventName\n | ContractEventName\n | ContractEventName[]\n | undefined\n /** List of logs. */\n logs: (Log | RpcLog)[]\n strict?: strict | boolean | undefined\n}\n\nexport type ParseEventLogsReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends\n | ContractEventName\n | ContractEventName[]\n | undefined = ContractEventName,\n strict extends boolean | undefined = boolean | undefined,\n ///\n derivedEventName extends\n | ContractEventName\n | undefined = eventName extends ContractEventName[]\n ? eventName[number]\n : eventName,\n> = Log[]\n\nexport type ParseEventLogsErrorType = DecodeEventLogErrorType | ErrorType\n\n/**\n * Extracts & decodes logs matching the provided signature(s) (`abi` + optional `eventName`)\n * from a set of opaque logs.\n *\n * @param parameters - {@link ParseEventLogsParameters}\n * @returns The logs. {@link ParseEventLogsReturnType}\n *\n * @example\n * import { createClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { parseEventLogs } from 'viem/op-stack'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const receipt = await getTransactionReceipt(client, {\n * hash: '0xec23b2ba4bc59ba61554507c1b1bc91649e6586eb2dd00c728e8ed0db8bb37ea',\n * })\n *\n * const logs = parseEventLogs({ logs: receipt.logs })\n * // [{ args: { ... }, eventName: 'TransactionDeposited', ... }, ...]\n */\nexport function parseEventLogs<\n abi extends Abi | readonly unknown[],\n strict extends boolean | undefined = true,\n eventName extends\n | ContractEventName\n | ContractEventName[]\n | undefined = undefined,\n>(\n parameters: ParseEventLogsParameters,\n): ParseEventLogsReturnType {\n const { abi, args, logs, strict = true } = parameters\n\n const eventName = (() => {\n if (!parameters.eventName) return undefined\n if (Array.isArray(parameters.eventName)) return parameters.eventName\n return [parameters.eventName as string]\n })()\n\n const abiTopics = (abi as Abi)\n .filter((abiItem) => abiItem.type === 'event')\n .map((abiItem) => ({\n abi: abiItem,\n selector: toEventSelector(abiItem),\n }))\n\n return logs\n .map((log) => {\n // Normalize RpcLog (hex-encoded quantities) to Log (bigint/number).\n // When logs come directly from an RPC response (e.g. eth_getLogs),\n // fields like blockNumber are hex strings instead of bigints.\n const formattedLog =\n typeof log.blockNumber === 'string' ? formatLog(log as RpcLog) : log\n\n // Find all matching ABI items with the same selector.\n // Multiple events can share the same selector but differ in indexed parameters\n // (e.g., ERC20 vs ERC721 Transfer events).\n const abiItems = abiTopics.filter(\n (abiTopic) => formattedLog.topics[0] === abiTopic.selector,\n )\n if (abiItems.length === 0) return null\n\n // Try each matching ABI item until one successfully decodes.\n let event: { eventName: string; args: unknown } | undefined\n let abiItem: { abi: AbiEvent; selector: Address } | undefined\n\n for (const item of abiItems) {\n try {\n event = decodeEventLog({\n ...formattedLog,\n abi: [item.abi],\n strict: true,\n })\n abiItem = item\n break\n } catch {\n // Try next ABI item\n }\n }\n\n // If strict decoding failed for all, and we're in non-strict mode,\n // fall back to the first matching ABI item.\n if (!event && !strict) {\n abiItem = abiItems[0]\n try {\n event = decodeEventLog({\n data: formattedLog.data,\n topics: formattedLog.topics,\n abi: [abiItem.abi],\n strict: false,\n })\n } catch {\n // If decoding still fails, return partial log in non-strict mode.\n const isUnnamed = abiItem.abi.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n return {\n ...formattedLog,\n args: isUnnamed ? [] : {},\n eventName: abiItem.abi.name,\n }\n }\n }\n\n // If no event was found, return null.\n if (!event || !abiItem) return null\n\n // Check that the decoded event name matches the provided event name.\n if (eventName && !eventName.includes(event.eventName)) return null\n\n // Check that the decoded event args match the provided args.\n if (\n !includesArgs({\n args: event.args,\n inputs: abiItem.abi.inputs,\n matchArgs: args,\n })\n )\n return null\n\n return { ...event, ...formattedLog }\n })\n .filter(Boolean) as unknown as ParseEventLogsReturnType<\n abi,\n eventName,\n strict\n >\n}\n\nfunction includesArgs(parameters: {\n args: unknown\n inputs: AbiEvent['inputs']\n matchArgs: unknown\n}) {\n const { args, inputs, matchArgs } = parameters\n\n if (!matchArgs) return true\n if (!args) return false\n\n function isEqual(input: AbiEventParameter, value: unknown, arg: unknown) {\n try {\n if (input.type === 'address')\n return isAddressEqual(value as Address, arg as Address)\n if (input.type === 'string' || input.type === 'bytes')\n return keccak256(toBytes(value as string)) === arg\n return value === arg\n } catch {\n return false\n }\n }\n\n if (Array.isArray(args) && Array.isArray(matchArgs)) {\n return matchArgs.every((value, index) => {\n if (value === null || value === undefined) return true\n const input = inputs[index]\n if (!input) return false\n const value_ = Array.isArray(value) ? value : [value]\n return value_.some((value) => isEqual(input, value, args[index]))\n })\n }\n\n if (\n typeof args === 'object' &&\n !Array.isArray(args) &&\n typeof matchArgs === 'object' &&\n !Array.isArray(matchArgs)\n )\n return Object.entries(matchArgs).every(([key, value]) => {\n if (value === null || value === undefined) return true\n const input = inputs.find((input) => input.name === key)\n if (!input) return false\n const value_ = Array.isArray(value) ? value : [value]\n return value_.some((value) =>\n isEqual(input, value, (args as Record)[key]),\n )\n })\n\n return false\n}\n","import type { AbiEvent, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash, LogTopic } from '../../types/misc.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetLogsParameters<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n> = {\n /** Address or list of addresses from which logs originated */\n address?: Address | Address[] | undefined\n} & (\n | {\n event: abiEvent\n events?: undefined\n args?: MaybeExtractEventArgsFromAbi | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events: abiEvents\n args?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events?: undefined\n args?: undefined\n strict?: undefined\n }\n) &\n (\n | {\n /** Block number or tag after which to include logs */\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /** Block number or tag before which to include logs */\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n blockHash?: undefined\n }\n | {\n fromBlock?: undefined\n toBlock?: undefined\n /** Hash of block to include logs from */\n blockHash?: Hash | undefined\n }\n )\n\nexport type GetLogsReturnType<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n _pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log[]\n\nexport type GetLogsErrorType =\n | DecodeEventLogErrorType\n | EncodeEventTopicsErrorType\n | FormatLogErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs matching the provided parameters.\n *\n * - Docs: https://viem.sh/docs/actions/public/getLogs\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/logs_event-logs\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetLogsParameters}\n * @returns A list of event logs. {@link GetLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getLogs } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await getLogs(client)\n */\nexport async function getLogs<\n chain extends Chain | undefined,\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client,\n {\n address,\n blockHash,\n fromBlock,\n toBlock,\n event,\n events: events_,\n args,\n strict: strict_,\n }: GetLogsParameters = {},\n): Promise> {\n const strict = strict_ ?? false\n const events = events_ ?? (event ? [event] : undefined)\n\n let topics: LogTopic[] = []\n if (events) {\n const encoded = (events as AbiEvent[]).flatMap((event) =>\n encodeEventTopics({\n abi: [event],\n eventName: (event as AbiEvent).name,\n args: events_ ? undefined : args,\n } as EncodeEventTopicsParameters),\n )\n // TODO: Clean up type casting\n topics = [encoded as LogTopic]\n if (event) topics = topics[0] as LogTopic[]\n }\n\n let logs: RpcLog[]\n if (blockHash) {\n logs = await client.request({\n method: 'eth_getLogs',\n params: [{ address, topics, blockHash }],\n })\n } else {\n logs = await client.request({\n method: 'eth_getLogs',\n params: [\n {\n address,\n topics,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n },\n ],\n })\n }\n\n const formattedLogs = logs.map((log) => formatLog(log))\n if (!events)\n return formattedLogs as GetLogsReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: events,\n args: args as any,\n logs: formattedLogs,\n strict,\n }) as unknown as GetLogsReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Abi, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n} from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash } from '../../types/misc.js'\nimport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n getAbiItem,\n} from '../../utils/abi/getAbiItem.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type GetLogsErrorType,\n type GetLogsParameters,\n getLogs,\n} from './getLogs.js'\n\nexport type GetContractEventsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined =\n | ContractEventName\n | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Contract ABI. */\n abi: abi\n args?:\n | ContractEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName\n >\n | undefined\n /** Contract event. */\n eventName?: eventName | ContractEventName | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | boolean | undefined\n} & (\n | {\n /** Block number or tag after which to include logs */\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /** Block number or tag before which to include logs */\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n blockHash?: undefined\n }\n | {\n fromBlock?: undefined\n toBlock?: undefined\n /** Hash of block to include logs from */\n blockHash?: Hash | undefined\n }\n)\n\nexport type GetContractEventsReturnType<\n abi extends Abi | readonly unknown[] = readonly unknown[],\n eventName extends ContractEventName | undefined =\n | ContractEventName\n | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n ///\n isPending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log[]\n\nexport type GetContractEventsErrorType =\n | GetAbiItemErrorType\n | GetLogsErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs emitted by a contract.\n *\n * - Docs: https://viem.sh/docs/contract/getContractEvents#getcontractevents\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetContractEventsParameters}\n * @returns A list of event logs. {@link GetContractEventsReturnType}\n *\n * @example\n * import { createClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getContractEvents } from 'viem/public'\n * import { wagmiAbi } from './abi'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await getContractEvents(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: wagmiAbi,\n * eventName: 'Transfer'\n * })\n */\nexport async function getContractEvents<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client,\n parameters: GetContractEventsParameters<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n GetContractEventsReturnType\n> {\n const {\n abi,\n address,\n args,\n blockHash,\n eventName,\n fromBlock,\n toBlock,\n strict,\n } = parameters\n const event = eventName\n ? getAbiItem({ abi, name: eventName } as GetAbiItemParameters)\n : undefined\n const events = !event\n ? (abi as Abi).filter((x) => x.type === 'event')\n : undefined\n return getAction(\n client,\n getLogs,\n 'getLogs',\n )({\n address,\n args,\n blockHash,\n event,\n events,\n fromBlock,\n toBlock,\n strict,\n } as {} as GetLogsParameters) as unknown as GetContractEventsReturnType<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Abi, AbiStateMutability, ExtractAbiFunctions } from 'abitype'\n\nimport {\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n AbiFunctionOutputsNotFoundError,\n type AbiFunctionOutputsNotFoundErrorType,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionReturnType,\n Widen,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/decodeFunctionResult'\n\nexport type DecodeFunctionResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n > = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n data: Hex\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | undefined }\n : { functionName: functionName | allFunctionNames }\n : { functionName?: functionName | allFunctionNames | undefined }\n> &\n UnionEvaluate<\n readonly [] extends allArgs\n ? {\n args?:\n | allArgs // show all options\n // infer value, widen inferred value of `args` conditionally to match `allArgs`\n | (abi extends Abi\n ? args extends allArgs\n ? Widen\n : never\n : never)\n | undefined\n }\n : {\n args?:\n | allArgs // show all options\n | (Widen & (args extends allArgs ? unknown : never)) // infer value, widen inferred value of `args` match `allArgs` (e.g. avoid union `args: readonly [123n] | readonly [bigint]`)\n | undefined\n }\n > &\n (hasFunctions extends true ? unknown : never)\n\nexport type DecodeFunctionResultReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n > = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n> = ContractFunctionReturnType<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName,\n args\n>\n\nexport type DecodeFunctionResultErrorType =\n | AbiFunctionNotFoundErrorType\n | AbiFunctionOutputsNotFoundErrorType\n | DecodeAbiParametersErrorType\n | GetAbiItemErrorType\n | ErrorType\n\nexport function decodeFunctionResult<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n const args extends ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n > = ContractFunctionArgs<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName\n >,\n>(\n parameters: DecodeFunctionResultParameters,\n): DecodeFunctionResultReturnType {\n const { abi, args, functionName, data } =\n parameters as DecodeFunctionResultParameters\n\n let abiItem = abi[0]\n if (functionName) {\n const item = getAbiItem({ abi, args, name: functionName })\n if (!item) throw new AbiFunctionNotFoundError(functionName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'function')\n throw new AbiFunctionNotFoundError(undefined, { docsPath })\n if (!abiItem.outputs)\n throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath })\n\n const values = decodeAbiParameters(abiItem.outputs, data)\n if (values && values.length > 1)\n return values as DecodeFunctionResultReturnType\n if (values && values.length === 1)\n return values[0] as DecodeFunctionResultReturnType\n return undefined as DecodeFunctionResultReturnType\n}\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// 100 lines of code in the file are duplicated from noble-hashes (utils).\n// This is OK: `abstract` directory does not use noble-hashes.\n// User may opt-in into using different hashing library. This way, noble-hashes\n// won't be included into their bundle.\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n (message: Uint8Array | string): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\nexport function abytes(item: unknown): void {\n if (!isBytes(item)) throw new Error('Uint8Array expected');\n}\n\nexport function abool(title: string, value: boolean): void {\n if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean =\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// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n abytes(bytes);\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'private key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n let res: Uint8Array;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes(hex);\n } catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n } else if (isBytes(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n } else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\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\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n// Global symbols in both browsers and Node.js since v11\n// See https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([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// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\nconst u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\nconst u8fr = (arr: ArrayLike) => Uint8Array.from(arr); // another shortcut\ntype Pred = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred) => T {\n if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8fr([0x00]), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(u8fr([0x01]), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n bigint: (val: any): boolean => typeof val === 'bigint',\n function: (val: any): boolean => typeof val === 'function',\n boolean: (val: any): boolean => typeof val === 'boolean',\n string: (val: any): boolean => typeof val === 'string',\n stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes(val),\n isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n array: (val: any): boolean => Array.isArray(val),\n field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap> = { [K in keyof T]?: Validator };\n// type Record = { [P in K]: T; }\n\nexport function validateObject>(\n object: T,\n validators: ValMap,\n optValidators: ValMap = {}\n): T {\n const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n const val = object[fieldName as keyof typeof object];\n if (isOptional && val === undefined) return;\n if (!checkVal(val, object)) {\n throw new Error(\n 'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n );\n }\n };\n for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n","/** @internal */\nexport const version = '0.1.1'\n","import { version } from '../version.js'\n\n/** @internal */\nexport function getUrl(url: string) {\n return url\n}\n\n/** @internal */\nexport function getVersion() {\n return version\n}\n\n/** @internal */\nexport function prettyPrint(args: unknown) {\n if (!args) return ''\n const entries = Object.entries(args)\n .map(([key, value]) => {\n if (value === undefined || value === false) return null\n return [key, value]\n })\n .filter(Boolean) as [string, string][]\n const maxLength = entries.reduce((acc, [key]) => Math.max(acc, key.length), 0)\n return entries\n .map(([key, value]) => ` ${`${key}:`.padEnd(maxLength + 1)} ${value}`)\n .join('\\n')\n}\n","import { getVersion } from './internal/errors.js'\n\nexport type GlobalErrorType = Error & {\n name: name\n}\n\n/**\n * Base error class inherited by all errors thrown by ox.\n *\n * @example\n * ```ts\n * import { Errors } from 'ox'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nexport class BaseError<\n cause extends Error | undefined = undefined,\n> extends Error {\n details: string\n docs?: string | undefined\n docsOrigin?: string | undefined\n docsPath?: string | undefined\n shortMessage: string\n showVersion?: boolean | undefined\n version?: string | undefined\n\n override cause: cause\n override name = 'BaseError'\n\n static defaultStaticOptions = {\n docsOrigin: 'https://oxlib.sh',\n showVersion: false,\n version: `ox@${getVersion()}`,\n } satisfies BaseError.GlobalOptions\n\n static setStaticOptions(options: BaseError.GlobalOptions) {\n BaseError.prototype.docsOrigin = options.docsOrigin\n BaseError.prototype.showVersion = options.showVersion\n BaseError.prototype.version = options.version\n }\n\n static {\n BaseError.setStaticOptions(BaseError.defaultStaticOptions)\n }\n\n constructor(shortMessage: string, options: BaseError.Options = {}) {\n const details = (() => {\n if (options.cause instanceof BaseError) {\n if (options.cause.details) return options.cause.details\n if (options.cause.shortMessage) return options.cause.shortMessage\n }\n if (\n options.cause &&\n 'details' in options.cause &&\n typeof options.cause.details === 'string'\n )\n return options.cause.details\n if (options.cause?.message) return options.cause.message\n return options.details!\n })()\n const docsPath = (() => {\n if (options.cause instanceof BaseError)\n return options.cause.docsPath || options.docsPath\n return options.docsPath\n })()\n\n const docsBaseUrl = options.docsOrigin ?? BaseError.prototype.docsOrigin\n const docs = `${docsBaseUrl}${docsPath ?? ''}`\n const showVersion = Boolean(\n options.version ?? BaseError.prototype.showVersion,\n )\n const version = options.version ?? BaseError.prototype.version\n\n const message = [\n shortMessage || 'An error occurred.',\n ...(options.metaMessages ? ['', ...options.metaMessages] : []),\n ...(details || docsPath || showVersion\n ? [\n '',\n details ? `Details: ${details}` : undefined,\n docsPath ? `See: ${docs}` : undefined,\n showVersion ? `Version: ${version}` : undefined,\n ]\n : []),\n ]\n .filter((x) => typeof x === 'string')\n .join('\\n')\n\n super(message, options.cause ? { cause: options.cause } : undefined)\n\n this.cause = options.cause as any\n this.details = details\n this.docs = docs\n this.docsOrigin = docsBaseUrl\n this.docsPath = docsPath\n this.shortMessage = shortMessage\n this.showVersion = showVersion\n this.version = version\n }\n\n walk(): Error\n walk(fn: (err: unknown) => boolean): Error | null\n walk(fn?: any): any {\n return walk(this, fn)\n }\n}\n\nexport declare namespace BaseError {\n type Options = {\n /** Cause of the error. */\n cause?: cause | undefined\n /** Details of the error. */\n details?: string | undefined\n /** Origin of the docs. */\n docsOrigin?: string | undefined\n /** Path of the docs. */\n docsPath?: string | undefined\n /** Meta messages to add to the error. */\n metaMessages?: (string | undefined)[] | undefined\n /** Version of the library to attribute the error to. */\n version?: string | undefined\n }\n\n type GlobalOptions = {\n /** Origin of the docs. */\n docsOrigin?: string | undefined\n /** Whether to show the version of the library in the error message. */\n showVersion?: boolean | undefined\n /** Version of the library to attribute the error to. */\n version?: string | undefined\n }\n}\n\n/** @internal */\nfunction walk(\n err: unknown,\n fn?: ((err: unknown) => boolean) | undefined,\n): unknown {\n if (fn?.(err)) return err\n if (err && typeof err === 'object' && 'cause' in err && err.cause)\n return walk(err.cause, fn)\n return fn ? null : err\n}\n","import * as Bytes from '../Bytes.js'\nimport type * as Errors from '../Errors.js'\n\n/** @internal */\nexport function assertSize(bytes: Bytes.Bytes, size_: number): void {\n if (Bytes.size(bytes) > size_)\n throw new Bytes.SizeOverflowError({\n givenSize: Bytes.size(bytes),\n maxSize: size_,\n })\n}\n\n/** @internal */\nexport declare namespace assertSize {\n type ErrorType =\n | Bytes.size.ErrorType\n | Bytes.SizeOverflowError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertStartOffset(\n value: Bytes.Bytes,\n start?: number | undefined,\n) {\n if (typeof start === 'number' && start > 0 && start > Bytes.size(value) - 1)\n throw new Bytes.SliceOffsetOutOfBoundsError({\n offset: start,\n position: 'start',\n size: Bytes.size(value),\n })\n}\n\nexport declare namespace assertStartOffset {\n export type ErrorType =\n | Bytes.SliceOffsetOutOfBoundsError\n | Bytes.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertEndOffset(\n value: Bytes.Bytes,\n start?: number | undefined,\n end?: number | undefined,\n) {\n if (\n typeof start === 'number' &&\n typeof end === 'number' &&\n Bytes.size(value) !== end - start\n ) {\n throw new Bytes.SliceOffsetOutOfBoundsError({\n offset: end,\n position: 'end',\n size: Bytes.size(value),\n })\n }\n}\n\n/** @internal */\nexport declare namespace assertEndOffset {\n type ErrorType =\n | Bytes.SliceOffsetOutOfBoundsError\n | Bytes.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport const charCodeMap = {\n zero: 48,\n nine: 57,\n A: 65,\n F: 70,\n a: 97,\n f: 102,\n} as const\n\n/** @internal */\nexport function charCodeToBase16(char: number) {\n if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n return char - charCodeMap.zero\n if (char >= charCodeMap.A && char <= charCodeMap.F)\n return char - (charCodeMap.A - 10)\n if (char >= charCodeMap.a && char <= charCodeMap.f)\n return char - (charCodeMap.a - 10)\n return undefined\n}\n\n/** @internal */\nexport function pad(bytes: Bytes.Bytes, options: pad.Options = {}) {\n const { dir, size = 32 } = options\n if (size === 0) return bytes\n if (bytes.length > size)\n throw new Bytes.SizeExceedsPaddingSizeError({\n size: bytes.length,\n targetSize: size,\n type: 'Bytes',\n })\n const paddedBytes = new Uint8Array(size)\n for (let i = 0; i < size; i++) {\n const padEnd = dir === 'right'\n paddedBytes[padEnd ? i : size - i - 1] =\n bytes[padEnd ? i : bytes.length - i - 1]!\n }\n return paddedBytes\n}\n\n/** @internal */\nexport declare namespace pad {\n type Options = {\n dir?: 'left' | 'right' | undefined\n size?: number | undefined\n }\n\n type ReturnType = Bytes.Bytes\n\n type ErrorType = Bytes.SizeExceedsPaddingSizeError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function trim(\n value: Bytes.Bytes,\n options: trim.Options = {},\n): trim.ReturnType {\n const { dir = 'left' } = options\n\n let data = value\n\n let sliceLength = 0\n for (let i = 0; i < data.length - 1; i++) {\n if (data[dir === 'left' ? i : data.length - i - 1]!.toString() === '0')\n sliceLength++\n else break\n }\n data =\n dir === 'left'\n ? data.slice(sliceLength)\n : data.slice(0, data.length - sliceLength)\n\n return data as trim.ReturnType\n}\n\n/** @internal */\nexport declare namespace trim {\n type Options = {\n dir?: 'left' | 'right' | undefined\n }\n\n type ReturnType = Bytes.Bytes\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import type * as Errors from '../Errors.js'\nimport * as Hex from '../Hex.js'\n\n/** @internal */\nexport function assertSize(hex: Hex.Hex, size_: number): void {\n if (Hex.size(hex) > size_)\n throw new Hex.SizeOverflowError({\n givenSize: Hex.size(hex),\n maxSize: size_,\n })\n}\n\n/** @internal */\nexport declare namespace assertSize {\n type ErrorType =\n | Hex.size.ErrorType\n | Hex.SizeOverflowError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertStartOffset(value: Hex.Hex, start?: number | undefined) {\n if (typeof start === 'number' && start > 0 && start > Hex.size(value) - 1)\n throw new Hex.SliceOffsetOutOfBoundsError({\n offset: start,\n position: 'start',\n size: Hex.size(value),\n })\n}\n\nexport declare namespace assertStartOffset {\n type ErrorType =\n | Hex.SliceOffsetOutOfBoundsError\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function assertEndOffset(\n value: Hex.Hex,\n start?: number | undefined,\n end?: number | undefined,\n) {\n if (\n typeof start === 'number' &&\n typeof end === 'number' &&\n Hex.size(value) !== end - start\n ) {\n throw new Hex.SliceOffsetOutOfBoundsError({\n offset: end,\n position: 'end',\n size: Hex.size(value),\n })\n }\n}\n\nexport declare namespace assertEndOffset {\n type ErrorType =\n | Hex.SliceOffsetOutOfBoundsError\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function pad(hex_: Hex.Hex, options: pad.Options = {}) {\n const { dir, size = 32 } = options\n\n if (size === 0) return hex_\n\n const hex = hex_.replace('0x', '')\n if (hex.length > size * 2)\n throw new Hex.SizeExceedsPaddingSizeError({\n size: Math.ceil(hex.length / 2),\n targetSize: size,\n type: 'Hex',\n })\n\n return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](size * 2, '0')}` as Hex.Hex\n}\n\n/** @internal */\nexport declare namespace pad {\n type Options = {\n dir?: 'left' | 'right' | undefined\n size?: number | undefined\n }\n type ErrorType = Hex.SizeExceedsPaddingSizeError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function trim(\n value: Hex.Hex,\n options: trim.Options = {},\n): trim.ReturnType {\n const { dir = 'left' } = options\n\n let data = value.replace('0x', '')\n\n let sliceLength = 0\n for (let i = 0; i < data.length - 1; i++) {\n if (data[dir === 'left' ? i : data.length - i - 1]!.toString() === '0')\n sliceLength++\n else break\n }\n data =\n dir === 'left'\n ? data.slice(sliceLength)\n : data.slice(0, data.length - sliceLength)\n\n if (data === '0') return '0x'\n if (dir === 'right' && data.length % 2 === 1) return `0x${data}0`\n return `0x${data}` as trim.ReturnType\n}\n\n/** @internal */\nexport declare namespace trim {\n type Options = {\n dir?: 'left' | 'right' | undefined\n }\n\n type ReturnType = Hex.Hex\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import type * as Errors from './Errors.js'\n\nconst bigIntSuffix = '#__bigint'\n\n/**\n * Serializes a value to a canonical JSON string as defined by\n * [RFC 8785 (JSON Canonicalization Scheme)](https://www.rfc-editor.org/rfc/rfc8785).\n *\n * - Object keys are sorted recursively by UTF-16 code unit comparison.\n * - Primitives are serialized per ECMAScript rules (no trailing zeros on numbers, etc.).\n * - No whitespace is inserted.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.canonicalize({ b: 2, a: 1 })\n * // @log: '{\"a\":1,\"b\":2}'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.canonicalize({ z: [3, { y: 1, x: 2 }], a: 'hello' })\n * // @log: '{\"a\":\"hello\",\"z\":[3,{\"x\":2,\"y\":1}]}'\n * ```\n *\n * @param value - The value to canonicalize.\n * @returns The canonical JSON string.\n */\nexport function canonicalize(value: unknown): string {\n if (value === null || typeof value === 'boolean' || typeof value === 'string')\n return JSON.stringify(value)\n if (typeof value === 'number') {\n if (!Number.isFinite(value))\n throw new TypeError('Cannot canonicalize non-finite number')\n return Object.is(value, -0) ? '0' : JSON.stringify(value)\n }\n if (typeof value === 'bigint')\n throw new TypeError('Cannot canonicalize bigint')\n if (Array.isArray(value))\n return `[${value.map((item) => canonicalize(item)).join(',')}]`\n if (typeof value === 'object') {\n const entries = Object.keys(value as Record)\n .sort()\n .reduce((acc, key) => {\n const v = (value as Record)[key]\n if (v !== undefined)\n acc.push(`${JSON.stringify(key)}:${canonicalize(v)}`)\n return acc\n }, [])\n return `{${entries.join(',')}}`\n }\n return undefined as never\n}\n\nexport declare namespace canonicalize {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses a JSON string, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.parse('{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}')\n * // @log: {\n * // @log: foo: 'bar',\n * // @log: baz: 69420694206942069420694206942069420694206942069420n\n * // @log: }\n * ```\n *\n * @param string - The value to parse.\n * @param reviver - A function that transforms the results.\n * @returns The parsed value.\n */\nexport function parse(\n string: string,\n reviver?: ((this: any, key: string, value: any) => any) | undefined,\n) {\n return JSON.parse(string, (key, value_) => {\n const value = value_\n if (typeof value === 'string' && value.endsWith(bigIntSuffix))\n return BigInt(value.slice(0, -bigIntSuffix.length))\n return typeof reviver === 'function' ? reviver(key, value) : value\n })\n}\n\nexport declare namespace parse {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Stringifies a value to its JSON representation, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.stringify({\n * foo: 'bar',\n * baz: 69420694206942069420694206942069420694206942069420n,\n * })\n * // @log: '{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}'\n * ```\n *\n * @param value - The value to stringify.\n * @param replacer - A function that transforms the results. It is passed the key and value of the property, and must return the value to be used in the JSON string. If this function returns `undefined`, the property is not included in the resulting JSON string.\n * @param space - A string or number that determines the indentation of the JSON string. If it is a number, it indicates the number of spaces to use as indentation; if it is a string (e.g. `'\\t'`), it uses the string as the indentation character.\n * @returns The JSON string.\n */\nexport function stringify(\n value: any,\n replacer?: ((this: any, key: string, value: any) => any) | null | undefined,\n space?: string | number | undefined,\n) {\n return JSON.stringify(\n value,\n (key, value) => {\n if (typeof replacer === 'function') return replacer(key, value)\n if (typeof value === 'bigint') return value.toString() + bigIntSuffix\n return value\n },\n space,\n )\n}\n\nexport declare namespace stringify {\n type ErrorType = Errors.GlobalErrorType\n}\n","import { equalBytes } from '@noble/curves/abstract/utils'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as internal from './internal/bytes.js'\nimport * as internal_hex from './internal/hex.js'\nimport * as Json from './Json.js'\n\nconst decoder = /*#__PURE__*/ new TextDecoder()\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\n/** Root type for a Bytes array. */\nexport type Bytes = Uint8Array\n\n/**\n * Asserts if the given value is {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.assert('abc')\n * // @error: Bytes.InvalidBytesTypeError:\n * // @error: Value `\"abc\"` of type `string` is an invalid Bytes value.\n * // @error: Bytes values must be of type `Uint8Array`.\n * ```\n *\n * @param value - Value to assert.\n */\nexport function assert(value: unknown): asserts value is Bytes {\n if (value instanceof Uint8Array) return\n if (!value) throw new InvalidBytesTypeError(value)\n if (typeof value !== 'object') throw new InvalidBytesTypeError(value)\n if (!('BYTES_PER_ELEMENT' in value)) throw new InvalidBytesTypeError(value)\n if (value.BYTES_PER_ELEMENT !== 1 || value.constructor.name !== 'Uint8Array')\n throw new InvalidBytesTypeError(value)\n}\n\nexport declare namespace assert {\n type ErrorType = InvalidBytesTypeError | Errors.GlobalErrorType\n}\n\n/**\n * Concatenates two or more {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const bytes = Bytes.concat(\n * Bytes.from([1]),\n * Bytes.from([69]),\n * Bytes.from([420, 69]),\n * )\n * // @log: Uint8Array [ 1, 69, 420, 69 ]\n * ```\n *\n * @param values - Values to concatenate.\n * @returns Concatenated {@link ox#Bytes.Bytes}.\n */\nexport function concat(...values: readonly Bytes[]): Bytes {\n let length = 0\n for (const arr of values) {\n length += arr.length\n }\n const result = new Uint8Array(length)\n for (let i = 0, index = 0; i < values.length; i++) {\n const arr = values[i]\n result.set(arr!, index)\n index += arr!.length\n }\n return result\n}\n\nexport declare namespace concat {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a {@link ox#Bytes.Bytes} value from a `Uint8Array`, a hex string, or an array of unsigned 8-bit integers.\n *\n * :::tip\n *\n * To instantiate from a **Boolean**, **String**, or **Number**, use one of the following:\n *\n * - `Bytes.fromBoolean`\n *\n * - `Bytes.fromString`\n *\n * - `Bytes.fromNumber`\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.from([255, 124, 5, 4])\n * // @log: Uint8Array([255, 124, 5, 4])\n *\n * const data = Bytes.from('0xdeadbeef')\n * // @log: Uint8Array([222, 173, 190, 239])\n * ```\n *\n * @param value - Value to convert.\n * @returns A {@link ox#Bytes.Bytes} instance.\n */\nexport function from(value: Hex.Hex | Bytes | readonly number[]): Bytes {\n if (value instanceof Uint8Array) return value\n if (typeof value === 'string') return fromHex(value)\n return fromArray(value)\n}\n\nexport declare namespace from {\n type ErrorType =\n | fromHex.ErrorType\n | fromArray.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts an array of unsigned 8-bit integers into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromArray([255, 124, 5, 4])\n * // @log: Uint8Array([255, 124, 5, 4])\n * ```\n *\n * @param value - Value to convert.\n * @returns A {@link ox#Bytes.Bytes} instance.\n */\nexport function fromArray(value: readonly number[] | Uint8Array): Bytes {\n return value instanceof Uint8Array ? value : new Uint8Array(value)\n}\n\nexport declare namespace fromArray {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Encodes a boolean value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromBoolean(true)\n * // @log: Uint8Array([1])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromBoolean(true, { size: 32 })\n * // @log: Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n * ```\n *\n * @param value - Boolean value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromBoolean(value: boolean, options: fromBoolean.Options = {}) {\n const { size } = options\n const bytes = new Uint8Array(1)\n bytes[0] = Number(value)\n if (typeof size === 'number') {\n internal.assertSize(bytes, size)\n return padLeft(bytes, size)\n }\n return bytes\n}\n\nexport declare namespace fromBoolean {\n type Options = {\n /** Size of the output bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Hex.Hex} value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromHex('0x48656c6c6f20776f726c6421')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromHex('0x48656c6c6f20776f726c6421', { size: 32 })\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n * ```\n *\n * @param value - {@link ox#Hex.Hex} value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromHex(value: Hex.Hex, options: fromHex.Options = {}): Bytes {\n const { size } = options\n\n let hex = value\n if (size) {\n internal_hex.assertSize(value, size)\n hex = Hex.padRight(value, size)\n }\n\n let hexString = hex.slice(2) as string\n if (hexString.length % 2) hexString = `0${hexString}`\n\n const length = hexString.length / 2\n const bytes = new Uint8Array(length)\n for (let index = 0, j = 0; index < length; index++) {\n const nibbleLeft = internal.charCodeToBase16(hexString.charCodeAt(j++))\n const nibbleRight = internal.charCodeToBase16(hexString.charCodeAt(j++))\n if (nibbleLeft === undefined || nibbleRight === undefined) {\n throw new Errors.BaseError(\n `Invalid byte sequence (\"${hexString[j - 2]}${hexString[j - 1]}\" in \"${hexString}\").`,\n )\n }\n bytes[index] = (nibbleLeft << 4) | nibbleRight\n }\n return bytes\n}\n\nexport declare namespace fromHex {\n type Options = {\n /** Size of the output bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal_hex.assertSize.ErrorType\n | Hex.padRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a number value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromNumber(420)\n * // @log: Uint8Array([1, 164])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromNumber(420, { size: 4 })\n * // @log: Uint8Array([0, 0, 1, 164])\n * ```\n *\n * @param value - Number value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromNumber(\n value: bigint | number,\n options?: fromNumber.Options | undefined,\n) {\n const hex = Hex.fromNumber(value, options)\n return fromHex(hex)\n}\n\nexport declare namespace fromNumber {\n export type Options = Hex.fromNumber.Options\n\n export type ErrorType =\n | Hex.fromNumber.ErrorType\n | fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a string into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromString('Hello world!')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromString('Hello world!', { size: 32 })\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n * ```\n *\n * @param value - String to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nexport function fromString(\n value: string,\n options: fromString.Options = {},\n): Bytes {\n const { size } = options\n\n const bytes = encoder.encode(value)\n if (typeof size === 'number') {\n internal.assertSize(bytes, size)\n return padRight(bytes, size)\n }\n return bytes\n}\n\nexport declare namespace fromString {\n type Options = {\n /** Size of the output bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if two {@link ox#Bytes.Bytes} values are equal.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.isEqual(Bytes.from([1]), Bytes.from([1]))\n * // @log: true\n *\n * Bytes.isEqual(Bytes.from([1]), Bytes.from([2]))\n * // @log: false\n * ```\n *\n * @param bytesA - First {@link ox#Bytes.Bytes} value.\n * @param bytesB - Second {@link ox#Bytes.Bytes} value.\n * @returns `true` if the two values are equal, otherwise `false`.\n */\nexport function isEqual(bytesA: Bytes, bytesB: Bytes) {\n return equalBytes(bytesA, bytesB)\n}\n\nexport declare namespace isEqual {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Bytes.Bytes} value to the left with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padLeft(Bytes.from([1]), 4)\n * // @log: Uint8Array([0, 0, 0, 1])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value to pad.\n * @param size - Size to pad the {@link ox#Bytes.Bytes} value to.\n * @returns Padded {@link ox#Bytes.Bytes} value.\n */\nexport function padLeft(\n value: Bytes,\n size?: number | undefined,\n): padLeft.ReturnType {\n return internal.pad(value, { dir: 'left', size })\n}\n\nexport declare namespace padLeft {\n type ReturnType = internal.pad.ReturnType\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Bytes.Bytes} value to the right with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padRight(Bytes.from([1]), 4)\n * // @log: Uint8Array([1, 0, 0, 0])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value to pad.\n * @param size - Size to pad the {@link ox#Bytes.Bytes} value to.\n * @returns Padded {@link ox#Bytes.Bytes} value.\n */\nexport function padRight(\n value: Bytes,\n size?: number | undefined,\n): padRight.ReturnType {\n return internal.pad(value, { dir: 'right', size })\n}\n\nexport declare namespace padRight {\n type ReturnType = internal.pad.ReturnType\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Generates random {@link ox#Bytes.Bytes} of the specified length.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const bytes = Bytes.random(32)\n * // @log: Uint8Array([... x32])\n * ```\n *\n * @param length - Length of the random {@link ox#Bytes.Bytes} to generate.\n * @returns Random {@link ox#Bytes.Bytes} of the specified length.\n */\nexport function random(length: number): Bytes {\n return crypto.getRandomValues(new Uint8Array(length))\n}\n\nexport declare namespace random {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Retrieves the size of a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.size(Bytes.from([1, 2, 3, 4]))\n * // @log: 4\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Size of the {@link ox#Bytes.Bytes} value.\n */\nexport function size(value: Bytes): number {\n return value.length\n}\n\nexport declare namespace size {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Returns a section of a {@link ox#Bytes.Bytes} value given a start/end bytes offset.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.slice(\n * Bytes.from([1, 2, 3, 4, 5, 6, 7, 8, 9]),\n * 1,\n * 4,\n * )\n * // @log: Uint8Array([2, 3, 4])\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value.\n * @param start - Start offset.\n * @param end - End offset.\n * @param options - Slice options.\n * @returns Sliced {@link ox#Bytes.Bytes} value.\n */\nexport function slice(\n value: Bytes,\n start?: number | undefined,\n end?: number | undefined,\n options: slice.Options = {},\n): Bytes {\n const { strict } = options\n internal.assertStartOffset(value, start)\n const value_ = value.slice(start, end)\n if (strict) internal.assertEndOffset(value_, start, end)\n return value_\n}\n\nexport declare namespace slice {\n type Options = {\n /** Asserts that the sliced value is the same size as the given start/end offsets. */\n strict?: boolean | undefined\n }\n\n export type ErrorType =\n | internal.assertStartOffset.ErrorType\n | internal.assertEndOffset.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a bigint.\n *\n * @example\n * ```ts\n * import { Bytes } from 'ox'\n *\n * Bytes.toBigInt(Bytes.from([1, 164]))\n * // @log: 420n\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Decoding options.\n * @returns Decoded bigint.\n */\nexport function toBigInt(bytes: Bytes, options: toBigInt.Options = {}): bigint {\n const { size } = options\n if (typeof size !== 'undefined') internal.assertSize(bytes, size)\n const hex = Hex.fromBytes(bytes, options)\n return Hex.toBigInt(hex, options)\n}\n\nexport declare namespace toBigInt {\n type Options = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Hex.toBigInt.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a boolean.\n *\n * @example\n * ```ts\n * import { Bytes } from 'ox'\n *\n * Bytes.toBoolean(Bytes.from([1]))\n * // @log: true\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Decoding options.\n * @returns Decoded boolean.\n */\nexport function toBoolean(\n bytes: Bytes,\n options: toBoolean.Options = {},\n): boolean {\n const { size } = options\n let bytes_ = bytes\n if (typeof size !== 'undefined') {\n internal.assertSize(bytes_, size)\n bytes_ = trimLeft(bytes_)\n }\n if (bytes_.length > 1 || bytes_[0]! > 1)\n throw new InvalidBytesBooleanError(bytes_)\n return Boolean(bytes_[0])\n}\n\nexport declare namespace toBoolean {\n type Options = {\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | trimLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toHex(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Options.\n * @returns Decoded {@link ox#Hex.Hex} value.\n */\nexport function toHex(value: Bytes, options: toHex.Options = {}): Hex.Hex {\n return Hex.fromBytes(value, options)\n}\n\nexport declare namespace toHex {\n type Options = {\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType = Hex.fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a number.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toNumber(Bytes.from([1, 164]))\n * // @log: 420\n * ```\n */\nexport function toNumber(bytes: Bytes, options: toNumber.Options = {}): number {\n const { size } = options\n if (typeof size !== 'undefined') internal.assertSize(bytes, size)\n const hex = Hex.fromBytes(bytes, options)\n return Hex.toNumber(hex, options)\n}\n\nexport declare namespace toNumber {\n type Options = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Hex.toNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a string.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.toString(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: 'Hello world'\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Options.\n * @returns Decoded string.\n */\nexport function toString(bytes: Bytes, options: toString.Options = {}): string {\n const { size } = options\n\n let bytes_ = bytes\n if (typeof size !== 'undefined') {\n internal.assertSize(bytes_, size)\n bytes_ = trimRight(bytes_)\n }\n return decoder.decode(bytes_)\n}\n\nexport declare namespace toString {\n export type Options = {\n /** Size of the bytes. */\n size?: number | undefined\n }\n\n export type ErrorType =\n | internal.assertSize.ErrorType\n | trimRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Trims leading zeros from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.trimLeft(Bytes.from([0, 0, 0, 0, 1, 2, 3]))\n * // @log: Uint8Array([1, 2, 3])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Trimmed {@link ox#Bytes.Bytes} value.\n */\nexport function trimLeft(value: Bytes): Bytes {\n return internal.trim(value, { dir: 'left' })\n}\n\nexport declare namespace trimLeft {\n type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Trims trailing zeros from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.trimRight(Bytes.from([1, 2, 3, 0, 0, 0, 0]))\n * // @log: Uint8Array([1, 2, 3])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Trimmed {@link ox#Bytes.Bytes} value.\n */\nexport function trimRight(value: Bytes): Bytes {\n return internal.trim(value, { dir: 'right' })\n}\n\nexport declare namespace trimRight {\n export type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Checks if the given value is {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.validate('0x')\n * // @log: false\n *\n * Bytes.validate(Bytes.from([1, 2, 3]))\n * // @log: true\n * ```\n *\n * @param value - Value to check.\n * @returns `true` if the value is {@link ox#Bytes.Bytes}, otherwise `false`.\n */\nexport function validate(value: unknown): value is Bytes {\n try {\n assert(value)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Thrown when the bytes value cannot be represented as a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toBoolean(Bytes.from([5]))\n * // @error: Bytes.InvalidBytesBooleanError: Bytes value `[5]` is not a valid boolean.\n * // @error: The bytes array must contain a single byte of either a `0` or `1` value.\n * ```\n */\nexport class InvalidBytesBooleanError extends Errors.BaseError {\n override readonly name = 'Bytes.InvalidBytesBooleanError'\n\n constructor(bytes: Bytes) {\n super(`Bytes value \\`${bytes}\\` is not a valid boolean.`, {\n metaMessages: [\n 'The bytes array must contain a single byte of either a `0` or `1` value.',\n ],\n })\n }\n}\n\n/**\n * Thrown when a value cannot be converted to bytes.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Bytes } from 'ox'\n *\n * Bytes.from('foo')\n * // @error: Bytes.InvalidBytesTypeError: Value `foo` of type `string` is an invalid Bytes value.\n * ```\n */\nexport class InvalidBytesTypeError extends Errors.BaseError {\n override readonly name = 'Bytes.InvalidBytesTypeError'\n\n constructor(value: unknown) {\n super(\n `Value \\`${typeof value === 'object' ? Json.stringify(value) : value}\\` of type \\`${typeof value}\\` is an invalid Bytes value.`,\n {\n metaMessages: ['Bytes values must be of type `Bytes`.'],\n },\n )\n }\n}\n\n/**\n * Thrown when a size exceeds the maximum allowed size.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.fromString('Hello World!', { size: 8 })\n * // @error: Bytes.SizeOverflowError: Size cannot exceed `8` bytes. Given size: `12` bytes.\n * ```\n */\nexport class SizeOverflowError extends Errors.BaseError {\n override readonly name = 'Bytes.SizeOverflowError'\n\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed \\`${maxSize}\\` bytes. Given size: \\`${givenSize}\\` bytes.`,\n )\n }\n}\n\n/**\n * Thrown when a slice offset is out-of-bounds.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.slice(Bytes.from([1, 2, 3]), 4)\n * // @error: Bytes.SliceOffsetOutOfBoundsError: Slice starting at offset `4` is out-of-bounds (size: `3`).\n * ```\n */\nexport class SliceOffsetOutOfBoundsError extends Errors.BaseError {\n override readonly name = 'Bytes.SliceOffsetOutOfBoundsError'\n\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \\`${offset}\\` is out-of-bounds (size: \\`${size}\\`).`,\n )\n }\n}\n\n/**\n * Thrown when a the padding size exceeds the maximum allowed size.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padLeft(Bytes.fromString('Hello World!'), 8)\n * // @error: [Bytes.SizeExceedsPaddingSizeError: Bytes size (`12`) exceeds padding size (`8`).\n * ```\n */\nexport class SizeExceedsPaddingSizeError extends Errors.BaseError {\n override readonly name = 'Bytes.SizeExceedsPaddingSizeError'\n\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'Hex' | 'Bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (\\`${size}\\`) exceeds padding size (\\`${targetSize}\\`).`,\n )\n }\n}\n","import { equalBytes } from '@noble/curves/abstract/utils'\nimport * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as internal_bytes from './internal/bytes.js'\nimport * as internal from './internal/hex.js'\nimport * as Json from './Json.js'\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) =>\n i.toString(16).padStart(2, '0'),\n)\n\n/** Root type for a Hex string. */\nexport type Hex = `0x${string}`\n\n/**\n * Asserts if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('abc')\n * // @error: InvalidHexValueTypeError:\n * // @error: Value `\"abc\"` of type `string` is an invalid hex type.\n * // @error: Hex types must be represented as `\"0x\\${string}\"`.\n * ```\n *\n * @param value - The value to assert.\n * @param options - Options.\n */\nexport function assert(\n value: unknown,\n options: assert.Options = {},\n): asserts value is Hex {\n const { strict = false } = options\n if (!value) throw new InvalidHexTypeError(value)\n if (typeof value !== 'string') throw new InvalidHexTypeError(value)\n if (strict) {\n if (!/^0x[0-9a-fA-F]*$/.test(value)) throw new InvalidHexValueError(value)\n }\n if (!value.startsWith('0x')) throw new InvalidHexValueError(value)\n}\n\nexport declare namespace assert {\n type Options = {\n /** Checks if the {@link ox#Hex.Hex} value contains invalid hexadecimal characters. @default false */\n strict?: boolean | undefined\n }\n\n type ErrorType =\n | InvalidHexTypeError\n | InvalidHexValueError\n | Errors.GlobalErrorType\n}\n\n/**\n * Concatenates two or more {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.concat('0x123', '0x456')\n * // @log: '0x123456'\n * ```\n *\n * @param values - The {@link ox#Hex.Hex} values to concatenate.\n * @returns The concatenated {@link ox#Hex.Hex} value.\n */\nexport function concat(...values: readonly Hex[]): Hex {\n return `0x${(values as Hex[]).reduce((acc, x) => acc + x.replace('0x', ''), '')}`\n}\n\nexport declare namespace concat {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a {@link ox#Hex.Hex} value from a hex string or {@link ox#Bytes.Bytes} value.\n *\n * :::tip\n *\n * To instantiate from a **Boolean**, **String**, or **Number**, use one of the following:\n *\n * - `Hex.fromBoolean`\n *\n * - `Hex.fromString`\n *\n * - `Hex.fromNumber`\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.from('0x48656c6c6f20576f726c6421')\n * // @log: '0x48656c6c6f20576f726c6421'\n *\n * Hex.from(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function from(value: Hex | Bytes.Bytes | readonly number[]): Hex {\n if (value instanceof Uint8Array) return fromBytes(value)\n if (Array.isArray(value)) return fromBytes(new Uint8Array(value))\n return value as never\n}\n\nexport declare namespace from {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType = fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a boolean into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromBoolean(true)\n * // @log: '0x1'\n *\n * Hex.fromBoolean(false)\n * // @log: '0x0'\n *\n * Hex.fromBoolean(true, { size: 32 })\n * // @log: '0x0000000000000000000000000000000000000000000000000000000000000001'\n * ```\n *\n * @param value - The boolean value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromBoolean(\n value: boolean,\n options: fromBoolean.Options = {},\n): Hex {\n const hex: Hex = `0x${Number(value)}`\n if (typeof options.size === 'number') {\n internal.assertSize(hex, options.size)\n return padLeft(hex, options.size)\n }\n return hex\n}\n\nexport declare namespace fromBoolean {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.fromBytes(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromBytes(\n value: Bytes.Bytes,\n options: fromBytes.Options = {},\n): Hex {\n let string = ''\n for (let i = 0; i < value.length; i++) string += hexes[value[i]!]\n const hex = `0x${string}` as const\n\n if (typeof options.size === 'number') {\n internal.assertSize(hex, options.size)\n return padRight(hex, options.size)\n }\n return hex\n}\n\nexport declare namespace fromBytes {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | padRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a number or bigint into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420)\n * // @log: '0x1a4'\n *\n * Hex.fromNumber(420, { size: 32 })\n * // @log: '0x00000000000000000000000000000000000000000000000000000000000001a4'\n * ```\n *\n * @param value - The number or bigint value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromNumber(\n value: number | bigint,\n options: fromNumber.Options = {},\n): Hex {\n const { signed, size } = options\n\n const value_ = BigInt(value)\n\n let maxValue: bigint | number | undefined\n if (size) {\n if (signed) maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n\n else maxValue = 2n ** (BigInt(size) * 8n) - 1n\n } else if (typeof value === 'number') {\n maxValue = BigInt(Number.MAX_SAFE_INTEGER)\n }\n\n const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0\n\n if ((maxValue && value_ > maxValue) || value_ < minValue) {\n const suffix = typeof value === 'bigint' ? 'n' : ''\n throw new IntegerOutOfRangeError({\n max: maxValue ? `${maxValue}${suffix}` : undefined,\n min: `${minValue}${suffix}`,\n signed,\n size,\n value: `${value}${suffix}`,\n })\n }\n\n const stringValue = (\n signed && value_ < 0 ? BigInt.asUintN(size * 8, BigInt(value_)) : value_\n ).toString(16)\n\n const hex = `0x${stringValue}` as Hex\n if (size) return padLeft(hex, size) as Hex\n return hex\n}\n\nexport declare namespace fromNumber {\n type Options =\n | {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** The size (in bytes) of the output hex value. */\n size: number\n }\n | {\n signed?: undefined\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | IntegerOutOfRangeError\n | padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a string into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n * Hex.fromString('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * Hex.fromString('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n * ```\n *\n * @param value - The string value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromString(\n value: string,\n options: fromString.Options = {},\n): Hex {\n return fromBytes(encoder.encode(value), options)\n}\n\nexport declare namespace fromString {\n type Options = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\n type ErrorType = fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Checks if two {@link ox#Hex.Hex} values are equal.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.isEqual('0xdeadbeef', '0xdeadbeef')\n * // @log: true\n *\n * Hex.isEqual('0xda', '0xba')\n * // @log: false\n * ```\n *\n * @param hexA - The first {@link ox#Hex.Hex} value.\n * @param hexB - The second {@link ox#Hex.Hex} value.\n * @returns `true` if the two {@link ox#Hex.Hex} values are equal, `false` otherwise.\n */\nexport function isEqual(hexA: Hex, hexB: Hex) {\n return equalBytes(Bytes.fromHex(hexA), Bytes.fromHex(hexB))\n}\n\nexport declare namespace isEqual {\n type ErrorType = Bytes.fromHex.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Hex.Hex} value to the left with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1234', 4)\n * // @log: '0x00001234'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nexport function padLeft(\n value: Hex,\n size?: number | undefined,\n): padLeft.ReturnType {\n return internal.pad(value, { dir: 'left', size })\n}\n\nexport declare namespace padLeft {\n type ReturnType = Hex\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Pads a {@link ox#Hex.Hex} value to the right with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts\n * import { Hex } from 'ox'\n *\n * Hex.padRight('0x1234', 4)\n * // @log: '0x12340000'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nexport function padRight(\n value: Hex,\n size?: number | undefined,\n): padRight.ReturnType {\n return internal.pad(value, { dir: 'right', size })\n}\n\nexport declare namespace padRight {\n type ReturnType = Hex\n type ErrorType = internal.pad.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Generates a random {@link ox#Hex.Hex} value of the specified length.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const hex = Hex.random(32)\n * // @log: '0x...'\n * ```\n *\n * @returns Random {@link ox#Hex.Hex} value.\n */\nexport function random(length: number): Hex {\n return fromBytes(Bytes.random(length))\n}\n\nexport declare namespace random {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Returns a section of a {@link ox#Bytes.Bytes} value given a start/end bytes offset.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 1, 4)\n * // @log: '0x234567'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to slice.\n * @param start - The start offset (in bytes).\n * @param end - The end offset (in bytes).\n * @param options - Options.\n * @returns The sliced {@link ox#Hex.Hex} value.\n */\nexport function slice(\n value: Hex,\n start?: number | undefined,\n end?: number | undefined,\n options: slice.Options = {},\n): Hex {\n const { strict } = options\n internal.assertStartOffset(value, start)\n const value_ = `0x${value\n .replace('0x', '')\n .slice((start ?? 0) * 2, (end ?? value.length) * 2)}` as const\n if (strict) internal.assertEndOffset(value_, start, end)\n return value_\n}\n\nexport declare namespace slice {\n type Options = {\n /** Asserts that the sliced value is the same size as the given start/end offsets. */\n strict?: boolean | undefined\n }\n\n type ErrorType =\n | internal.assertStartOffset.ErrorType\n | internal.assertEndOffset.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Retrieves the size of a {@link ox#Hex.Hex} value (in bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.size('0xdeadbeef')\n * // @log: 4\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to get the size of.\n * @returns The size of the {@link ox#Hex.Hex} value (in bytes).\n */\nexport function size(value: Hex): number {\n return Math.ceil((value.length - 2) / 2)\n}\n\nexport declare namespace size {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Trims leading zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimLeft('0x00000000deadbeef')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nexport function trimLeft(value: Hex): trimLeft.ReturnType {\n return internal.trim(value, { dir: 'left' })\n}\n\nexport declare namespace trimLeft {\n type ReturnType = Hex\n\n type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Trims trailing zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimRight('0xdeadbeef00000000')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nexport function trimRight(value: Hex): trimRight.ReturnType {\n return internal.trim(value, { dir: 'right' })\n}\n\nexport declare namespace trimRight {\n type ReturnType = Hex\n\n type ErrorType = internal.trim.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a BigInt.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBigInt('0x1a4')\n * // @log: 420n\n *\n * Hex.toBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420n\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded BigInt.\n */\nexport function toBigInt(hex: Hex, options: toBigInt.Options = {}): bigint {\n const { signed } = options\n\n if (options.size) internal.assertSize(hex, options.size)\n\n const value = BigInt(hex)\n if (!signed) return value\n\n const size = (hex.length - 2) / 2\n\n const max_unsigned = (1n << (BigInt(size) * 8n)) - 1n\n const max_signed = max_unsigned >> 1n\n\n if (value <= max_signed) return value\n return value - max_unsigned - 1n\n}\n\nexport declare namespace toBigInt {\n type Options = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType = internal.assertSize.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0x01')\n * // @log: true\n *\n * Hex.toBoolean('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // @log: true\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded boolean.\n */\nexport function toBoolean(hex: Hex, options: toBoolean.Options = {}): boolean {\n if (options.size) internal.assertSize(hex, options.size)\n const hex_ = trimLeft(hex)\n if (hex_ === '0x') return false\n if (hex_ === '0x1') return true\n throw new InvalidHexBooleanError(hex)\n}\n\nexport declare namespace toBoolean {\n type Options = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal.assertSize.ErrorType\n | trimLeft.ErrorType\n | InvalidHexBooleanError\n | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const data = Hex.toBytes('0x48656c6c6f20776f726c6421')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded {@link ox#Bytes.Bytes}.\n */\nexport function toBytes(hex: Hex, options: toBytes.Options = {}): Bytes.Bytes {\n return Bytes.fromHex(hex, options)\n}\n\nexport declare namespace toBytes {\n type Options = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType = Bytes.fromHex.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a number.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toNumber('0x1a4')\n * // @log: 420\n *\n * Hex.toNumber('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded number.\n */\nexport function toNumber(hex: Hex, options: toNumber.Options = {}): number {\n const { signed, size } = options\n if (!signed && !size) return Number(hex)\n return Number(toBigInt(hex, options))\n}\n\nexport declare namespace toNumber {\n type Options = toBigInt.Options\n\n type ErrorType = toBigInt.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Decodes a {@link ox#Hex.Hex} value into a string.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toString('0x48656c6c6f20576f726c6421')\n * // @log: 'Hello world!'\n *\n * Hex.toString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * })\n * // @log: 'Hello world'\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded string.\n */\nexport function toString(hex: Hex, options: toString.Options = {}): string {\n const { size } = options\n\n let bytes = Bytes.fromHex(hex)\n if (size) {\n internal_bytes.assertSize(bytes, size)\n bytes = Bytes.trimRight(bytes)\n }\n return new TextDecoder().decode(bytes)\n}\n\nexport declare namespace toString {\n type Options = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n }\n\n type ErrorType =\n | internal_bytes.assertSize.ErrorType\n | Bytes.fromHex.ErrorType\n | Bytes.trimRight.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.validate('0xdeadbeef')\n * // @log: true\n *\n * Hex.validate(Bytes.from([1, 2, 3]))\n * // @log: false\n * ```\n *\n * @param value - The value to check.\n * @param options - Options.\n * @returns `true` if the value is a {@link ox#Hex.Hex}, `false` otherwise.\n */\nexport function validate(\n value: unknown,\n options: validate.Options = {},\n): value is Hex {\n const { strict = false } = options\n try {\n assert(value, { strict })\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /** Checks if the {@link ox#Hex.Hex} value contains invalid hexadecimal characters. @default false */\n strict?: boolean | undefined\n }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Thrown when the provided integer is out of range, and cannot be represented as a hex value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420182738912731283712937129)\n * // @error: Hex.IntegerOutOfRangeError: Number \\`4.2018273891273126e+26\\` is not in safe unsigned integer range (`0` to `9007199254740991`)\n * ```\n */\nexport class IntegerOutOfRangeError extends Errors.BaseError {\n override readonly name = 'Hex.IntegerOutOfRangeError'\n\n constructor({\n max,\n min,\n signed,\n size,\n value,\n }: {\n max?: string | undefined\n min: string\n signed?: boolean | undefined\n size?: number | undefined\n value: string\n }) {\n super(\n `Number \\`${value}\\` is not in safe${\n size ? ` ${size * 8}-bit` : ''\n }${signed ? ' signed' : ' unsigned'} integer range ${max ? `(\\`${min}\\` to \\`${max}\\`)` : `(above \\`${min}\\`)`}`,\n )\n }\n}\n\n/**\n * Thrown when the provided hex value cannot be represented as a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0xa')\n * // @error: Hex.InvalidHexBooleanError: Hex value `\"0xa\"` is not a valid boolean.\n * // @error: The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).\n * ```\n */\nexport class InvalidHexBooleanError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidHexBooleanError'\n\n constructor(hex: Hex) {\n super(`Hex value \\`\"${hex}\"\\` is not a valid boolean.`, {\n metaMessages: [\n 'The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).',\n ],\n })\n }\n}\n\n/**\n * Thrown when the provided value is not a valid hex type.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert(1)\n * // @error: Hex.InvalidHexTypeError: Value `1` of type `number` is an invalid hex type.\n * ```\n */\nexport class InvalidHexTypeError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidHexTypeError'\n\n constructor(value: unknown) {\n super(\n `Value \\`${typeof value === 'object' ? Json.stringify(value) : value}\\` of type \\`${typeof value}\\` is an invalid hex type.`,\n {\n metaMessages: ['Hex types must be represented as `\"0x${string}\"`.'],\n },\n )\n }\n}\n\n/**\n * Thrown when the provided hex value is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('0x0123456789abcdefg')\n * // @error: Hex.InvalidHexValueError: Value `0x0123456789abcdefg` is an invalid hex value.\n * // @error: Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).\n * ```\n */\nexport class InvalidHexValueError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidHexValueError'\n\n constructor(value: unknown) {\n super(`Value \\`${value}\\` is an invalid hex value.`, {\n metaMessages: [\n 'Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).',\n ],\n })\n }\n}\n\n/**\n * Thrown when the provided hex value is an odd length.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.fromHex('0xabcde')\n * // @error: Hex.InvalidLengthError: Hex value `\"0xabcde\"` is an odd length (5 nibbles).\n * ```\n */\nexport class InvalidLengthError extends Errors.BaseError {\n override readonly name = 'Hex.InvalidLengthError'\n\n constructor(value: Hex) {\n super(\n `Hex value \\`\"${value}\"\\` is an odd length (${value.length - 2} nibbles).`,\n {\n metaMessages: ['It must be an even length.'],\n },\n )\n }\n}\n\n/**\n * Thrown when the size of the value exceeds the expected max size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromString('Hello World!', { size: 8 })\n * // @error: Hex.SizeOverflowError: Size cannot exceed `8` bytes. Given size: `12` bytes.\n * ```\n */\nexport class SizeOverflowError extends Errors.BaseError {\n override readonly name = 'Hex.SizeOverflowError'\n\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed \\`${maxSize}\\` bytes. Given size: \\`${givenSize}\\` bytes.`,\n )\n }\n}\n\n/**\n * Thrown when the slice offset exceeds the bounds of the value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 6)\n * // @error: Hex.SliceOffsetOutOfBoundsError: Slice starting at offset `6` is out-of-bounds (size: `5`).\n * ```\n */\nexport class SliceOffsetOutOfBoundsError extends Errors.BaseError {\n override readonly name = 'Hex.SliceOffsetOutOfBoundsError'\n\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \\`${offset}\\` is out-of-bounds (size: \\`${size}\\`).`,\n )\n }\n}\n\n/**\n * Thrown when the size of the value exceeds the pad size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1a4e12a45a21323123aaa87a897a897a898a6567a578a867a98778a667a85a875a87a6a787a65a675a6a9', 32)\n * // @error: Hex.SizeExceedsPaddingSizeError: Hex size (`43`) exceeds padding size (`32`).\n * ```\n */\nexport class SizeExceedsPaddingSizeError extends Errors.BaseError {\n override readonly name = 'Hex.SizeExceedsPaddingSizeError'\n\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'Hex' | 'Bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (\\`${size}\\`) exceeds padding size (\\`${targetSize}\\`).`,\n )\n }\n}\n","import type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\n\n/** A Withdrawal as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/withdrawal.yaml). */\nexport type Withdrawal = {\n address: Hex.Hex\n amount: bigintType\n index: numberType\n validatorIndex: numberType\n}\n\n/** An RPC Withdrawal as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/withdrawal.yaml). */\nexport type Rpc = Withdrawal\n\n/**\n * Converts a {@link ox#Withdrawal.Rpc} to an {@link ox#Withdrawal.Withdrawal}.\n *\n * @example\n * ```ts twoslash\n * import { Withdrawal } from 'ox'\n *\n * const withdrawal = Withdrawal.fromRpc({\n * address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * amount: '0x620323',\n * index: '0x0',\n * validatorIndex: '0x1',\n * })\n * // @log: {\n * // @log: address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * // @log: amount: 6423331n,\n * // @log: index: 0,\n * // @log: validatorIndex: 1\n * // @log: }\n * ```\n *\n * @param withdrawal - The RPC withdrawal to convert.\n * @returns An instantiated {@link ox#Withdrawal.Withdrawal}.\n */\nexport function fromRpc(withdrawal: Rpc): Withdrawal {\n return {\n ...withdrawal,\n amount: BigInt(withdrawal.amount),\n index: Number(withdrawal.index),\n validatorIndex: Number(withdrawal.validatorIndex),\n }\n}\n\nexport declare namespace fromRpc {\n export type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Withdrawal.Withdrawal} to an {@link ox#Withdrawal.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Withdrawal } from 'ox'\n *\n * const withdrawal = Withdrawal.toRpc({\n * address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * amount: 6423331n,\n * index: 0,\n * validatorIndex: 1,\n * })\n * // @log: {\n * // @log: address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * // @log: amount: '0x620323',\n * // @log: index: '0x0',\n * // @log: validatorIndex: '0x1',\n * // @log: }\n * ```\n *\n * @param withdrawal - The Withdrawal to convert.\n * @returns An RPC Withdrawal.\n */\nexport function toRpc(withdrawal: Withdrawal): Rpc {\n return {\n address: withdrawal.address,\n amount: Hex.fromNumber(withdrawal.amount),\n index: Hex.fromNumber(withdrawal.index),\n validatorIndex: Hex.fromNumber(withdrawal.validatorIndex),\n }\n}\n\nexport declare namespace toRpc {\n export type ErrorType = Errors.GlobalErrorType\n}\n","import type * as Address from './Address.js'\nimport * as Hex from './Hex.js'\nimport * as Withdrawal from './Withdrawal.js'\n\n/**\n * Block overrides.\n */\nexport type BlockOverrides = {\n /** Base fee per gas. */\n baseFeePerGas?: bigintType | undefined\n /** Blob base fee. */\n blobBaseFee?: bigintType | undefined\n /** Fee recipient (also known as coinbase). */\n feeRecipient?: Address.Address | undefined\n /** Gas limit. */\n gasLimit?: bigintType | undefined\n /** Block number. */\n number?: bigintType | undefined\n /** The previous value of randomness beacon. */\n prevRandao?: bigintType | undefined\n /** Block timestamp. */\n time?: bigintType | undefined\n /** Withdrawals made by validators. */\n withdrawals?: Withdrawal.Withdrawal[] | undefined\n}\n\n/**\n * RPC block overrides.\n */\nexport type Rpc = BlockOverrides\n\n/**\n * Converts an {@link ox#BlockOverrides.Rpc} to an {@link ox#BlockOverrides.BlockOverrides}.\n *\n * @example\n * ```ts twoslash\n * import { BlockOverrides } from 'ox'\n *\n * const blockOverrides = BlockOverrides.fromRpc({\n * baseFeePerGas: '0x1',\n * blobBaseFee: '0x2',\n * feeRecipient: '0x0000000000000000000000000000000000000000',\n * gasLimit: '0x4',\n * number: '0x5',\n * prevRandao: '0x6',\n * time: '0x1234567890',\n * withdrawals: [\n * {\n * address: '0x0000000000000000000000000000000000000000',\n * amount: '0x1',\n * index: '0x0',\n * validatorIndex: '0x1',\n * },\n * ],\n * })\n * ```\n *\n * @param rpcBlockOverrides - The RPC block overrides to convert.\n * @returns An instantiated {@link ox#BlockOverrides.BlockOverrides}.\n */\nexport function fromRpc(rpcBlockOverrides: Rpc): BlockOverrides {\n return {\n ...(rpcBlockOverrides.baseFeePerGas && {\n baseFeePerGas: BigInt(rpcBlockOverrides.baseFeePerGas),\n }),\n ...(rpcBlockOverrides.blobBaseFee && {\n blobBaseFee: BigInt(rpcBlockOverrides.blobBaseFee),\n }),\n ...(rpcBlockOverrides.feeRecipient && {\n feeRecipient: rpcBlockOverrides.feeRecipient,\n }),\n ...(rpcBlockOverrides.gasLimit && {\n gasLimit: BigInt(rpcBlockOverrides.gasLimit),\n }),\n ...(rpcBlockOverrides.number && {\n number: BigInt(rpcBlockOverrides.number),\n }),\n ...(rpcBlockOverrides.prevRandao && {\n prevRandao: BigInt(rpcBlockOverrides.prevRandao),\n }),\n ...(rpcBlockOverrides.time && {\n time: BigInt(rpcBlockOverrides.time),\n }),\n ...(rpcBlockOverrides.withdrawals && {\n withdrawals: rpcBlockOverrides.withdrawals.map(Withdrawal.fromRpc),\n }),\n }\n}\n\n/**\n * Converts an {@link ox#BlockOverrides.BlockOverrides} to an {@link ox#BlockOverrides.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { BlockOverrides } from 'ox'\n *\n * const blockOverrides = BlockOverrides.toRpc({\n * baseFeePerGas: 1n,\n * blobBaseFee: 2n,\n * feeRecipient: '0x0000000000000000000000000000000000000000',\n * gasLimit: 4n,\n * number: 5n,\n * prevRandao: 6n,\n * time: 78187493520n,\n * withdrawals: [\n * {\n * address: '0x0000000000000000000000000000000000000000',\n * amount: 1n,\n * index: 0,\n * validatorIndex: 1,\n * },\n * ],\n * })\n * ```\n *\n * @param blockOverrides - The block overrides to convert.\n * @returns An instantiated {@link ox#BlockOverrides.Rpc}.\n */\nexport function toRpc(blockOverrides: BlockOverrides): Rpc {\n return {\n ...(typeof blockOverrides.baseFeePerGas === 'bigint' && {\n baseFeePerGas: Hex.fromNumber(blockOverrides.baseFeePerGas),\n }),\n ...(typeof blockOverrides.blobBaseFee === 'bigint' && {\n blobBaseFee: Hex.fromNumber(blockOverrides.blobBaseFee),\n }),\n ...(typeof blockOverrides.feeRecipient === 'string' && {\n feeRecipient: blockOverrides.feeRecipient,\n }),\n ...(typeof blockOverrides.gasLimit === 'bigint' && {\n gasLimit: Hex.fromNumber(blockOverrides.gasLimit),\n }),\n ...(typeof blockOverrides.number === 'bigint' && {\n number: Hex.fromNumber(blockOverrides.number),\n }),\n ...(typeof blockOverrides.prevRandao === 'bigint' && {\n prevRandao: Hex.fromNumber(blockOverrides.prevRandao),\n }),\n ...(typeof blockOverrides.time === 'bigint' && {\n time: Hex.fromNumber(blockOverrides.time),\n }),\n ...(blockOverrides.withdrawals && {\n withdrawals: blockOverrides.withdrawals.map(Withdrawal.toRpc),\n }),\n }\n}\n","/* [Multicall3](https://github.com/mds1/multicall) */\nexport const multicall3Abi = [\n {\n inputs: [\n {\n components: [\n {\n name: 'target',\n type: 'address',\n },\n {\n name: 'allowFailure',\n type: 'bool',\n },\n {\n name: 'callData',\n type: 'bytes',\n },\n ],\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate3',\n outputs: [\n {\n components: [\n {\n name: 'success',\n type: 'bool',\n },\n {\n name: 'returnData',\n type: 'bytes',\n },\n ],\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'addr',\n type: 'address',\n },\n ],\n name: 'getEthBalance',\n outputs: [\n {\n name: 'balance',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockTimestamp',\n outputs: [\n {\n internalType: 'uint256',\n name: 'timestamp',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n\nexport const batchGatewayAbi = [\n {\n name: 'query',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n {\n type: 'tuple[]',\n name: 'queries',\n components: [\n {\n type: 'address',\n name: 'sender',\n },\n {\n type: 'string[]',\n name: 'urls',\n },\n {\n type: 'bytes',\n name: 'data',\n },\n ],\n },\n ],\n outputs: [\n {\n type: 'bool[]',\n name: 'failures',\n },\n {\n type: 'bytes[]',\n name: 'responses',\n },\n ],\n },\n {\n name: 'HttpError',\n type: 'error',\n inputs: [\n {\n type: 'uint16',\n name: 'status',\n },\n {\n type: 'string',\n name: 'message',\n },\n ],\n },\n] as const\n\nconst universalResolverErrors = [\n {\n inputs: [\n {\n name: 'dns',\n type: 'bytes',\n },\n ],\n name: 'DNSDecodingFailed',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'ens',\n type: 'string',\n },\n ],\n name: 'DNSEncodingFailed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'EmptyAddress',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'status',\n type: 'uint16',\n },\n {\n name: 'message',\n type: 'string',\n },\n ],\n name: 'HttpError',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidBatchGatewayResponse',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'errorData',\n type: 'bytes',\n },\n ],\n name: 'ResolverError',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'name',\n type: 'bytes',\n },\n {\n name: 'resolver',\n type: 'address',\n },\n ],\n name: 'ResolverNotContract',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'name',\n type: 'bytes',\n },\n ],\n name: 'ResolverNotFound',\n type: 'error',\n },\n {\n inputs: [\n {\n name: 'primary',\n type: 'string',\n },\n {\n name: 'primaryAddress',\n type: 'bytes',\n },\n ],\n name: 'ReverseAddressMismatch',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'selector',\n type: 'bytes4',\n },\n ],\n name: 'UnsupportedResolverProfile',\n type: 'error',\n },\n] as const\n\nexport const universalResolverResolveAbi = [\n ...universalResolverErrors,\n {\n name: 'resolveWithGateways',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'name', type: 'bytes' },\n { name: 'data', type: 'bytes' },\n { name: 'gateways', type: 'string[]' },\n ],\n outputs: [\n { name: '', type: 'bytes' },\n { name: 'address', type: 'address' },\n ],\n },\n] as const\n\nexport const universalResolverReverseAbi = [\n ...universalResolverErrors,\n {\n name: 'reverseWithGateways',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'bytes', name: 'reverseName' },\n { type: 'uint256', name: 'coinType' },\n { type: 'string[]', name: 'gateways' },\n ],\n outputs: [\n { type: 'string', name: 'resolvedName' },\n { type: 'address', name: 'resolver' },\n { type: 'address', name: 'reverseResolver' },\n ],\n },\n] as const\n\nexport const textResolverAbi = [\n {\n name: 'text',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'name', type: 'bytes32' },\n { name: 'key', type: 'string' },\n ],\n outputs: [{ name: '', type: 'string' }],\n },\n] as const\n\nexport const addressResolverAbi = [\n {\n name: 'addr',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'name', type: 'bytes32' }],\n outputs: [{ name: '', type: 'address' }],\n },\n {\n name: 'addr',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'name', type: 'bytes32' },\n { name: 'coinType', type: 'uint256' },\n ],\n outputs: [{ name: '', type: 'bytes' }],\n },\n] as const\n\n// ERC-1271\n// isValidSignature(bytes32 hash, bytes signature) → bytes4 magicValue\n/** @internal */\nexport const erc1271Abi = [\n {\n name: 'isValidSignature',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'hash', type: 'bytes32' },\n { name: 'signature', type: 'bytes' },\n ],\n outputs: [{ name: '', type: 'bytes4' }],\n },\n] as const\n\n// ERC-6492 - universal deployless signature validator contract\n// constructor(address _signer, bytes32 _hash, bytes _signature) → bytes4 returnValue\n// returnValue is either 0x1 (valid) or 0x0 (invalid)\nexport const erc6492SignatureValidatorAbi = [\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n name: 'isValidSig',\n },\n] as const\n\n/** [ERC-20 Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-20) */\nexport const erc20Abi = [\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'allowance',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'decimals',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint8',\n },\n ],\n },\n {\n type: 'function',\n name: 'name',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'symbol',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'totalSupply',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'transfer',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'transferFrom',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n] as const\n\n/**\n * [bytes32-flavored ERC-20](https://docs.makerdao.com/smart-contract-modules/mkr-module#4.-gotchas-potential-source-of-user-error)\n * for tokens (ie. Maker) that use bytes32 instead of string.\n */\nexport const erc20Abi_bytes32 = [\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'allowance',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'decimals',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint8',\n },\n ],\n },\n {\n type: 'function',\n name: 'name',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'bytes32',\n },\n ],\n },\n {\n type: 'function',\n name: 'symbol',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'bytes32',\n },\n ],\n },\n {\n type: 'function',\n name: 'totalSupply',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'transfer',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'transferFrom',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n] as const\n\n/** [ERC-1155 Multi Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-1155) */\nexport const erc1155Abi = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'balance',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'needed',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n name: 'ERC1155InsufficientBalance',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'approver',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidApprover',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'idsLength',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'valuesLength',\n type: 'uint256',\n },\n ],\n name: 'ERC1155InvalidArrayLength',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidOperator',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidReceiver',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'ERC1155InvalidSender',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'ERC1155MissingApprovalForAll',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'bool',\n name: 'approved',\n type: 'bool',\n },\n ],\n name: 'ApprovalForAll',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256[]',\n name: 'ids',\n type: 'uint256[]',\n },\n {\n indexed: false,\n internalType: 'uint256[]',\n name: 'values',\n type: 'uint256[]',\n },\n ],\n name: 'TransferBatch',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'TransferSingle',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'string',\n name: 'value',\n type: 'string',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n ],\n name: 'URI',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n ],\n name: 'balanceOf',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address[]',\n name: 'accounts',\n type: 'address[]',\n },\n {\n internalType: 'uint256[]',\n name: 'ids',\n type: 'uint256[]',\n },\n ],\n name: 'balanceOfBatch',\n outputs: [\n {\n internalType: 'uint256[]',\n name: '',\n type: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n ],\n name: 'isApprovedForAll',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n internalType: 'uint256[]',\n name: 'ids',\n type: 'uint256[]',\n },\n {\n internalType: 'uint256[]',\n name: 'values',\n type: 'uint256[]',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'safeBatchTransferFrom',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'from',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'safeTransferFrom',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n internalType: 'bool',\n name: 'approved',\n type: 'bool',\n },\n ],\n name: 'setApprovalForAll',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'interfaceId',\n type: 'bytes4',\n },\n ],\n name: 'supportsInterface',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n name: 'uri',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n\n/** [ERC-721 Non-Fungible Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-721) */\nexport const erc721Abi = [\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: true,\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'event',\n name: 'ApprovalForAll',\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'operator',\n type: 'address',\n },\n {\n indexed: false,\n name: 'approved',\n type: 'bool',\n },\n ],\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: true,\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'approve',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'getApproved',\n stateMutability: 'view',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'address',\n },\n ],\n },\n {\n type: 'function',\n name: 'isApprovedForAll',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'operator',\n type: 'address',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n },\n {\n type: 'function',\n name: 'name',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'ownerOf',\n stateMutability: 'view',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'owner',\n type: 'address',\n },\n ],\n },\n {\n type: 'function',\n name: 'safeTransferFrom',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'from',\n type: 'address',\n },\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'safeTransferFrom',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'from',\n type: 'address',\n },\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'id',\n type: 'uint256',\n },\n {\n name: 'data',\n type: 'bytes',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'setApprovalForAll',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'operator',\n type: 'address',\n },\n {\n name: 'approved',\n type: 'bool',\n },\n ],\n outputs: [],\n },\n {\n type: 'function',\n name: 'symbol',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'tokenByIndex',\n stateMutability: 'view',\n inputs: [\n {\n name: 'index',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'tokenByIndex',\n stateMutability: 'view',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'index',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'tokenURI',\n stateMutability: 'view',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [\n {\n type: 'string',\n },\n ],\n },\n {\n type: 'function',\n name: 'totalSupply',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'uint256',\n },\n ],\n },\n {\n type: 'function',\n name: 'transferFrom',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n },\n ],\n outputs: [],\n },\n] as const\n\n/** [ERC-4626 Tokenized Vaults Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626) */\nexport const erc4626Abi = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Approval',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'sender',\n type: 'address',\n },\n {\n indexed: true,\n name: 'receiver',\n type: 'address',\n },\n {\n indexed: false,\n name: 'assets',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'Deposit',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'sender',\n type: 'address',\n },\n {\n indexed: true,\n name: 'receiver',\n type: 'address',\n },\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: false,\n name: 'assets',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'Withdraw',\n type: 'event',\n },\n {\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n },\n ],\n name: 'allowance',\n outputs: [\n {\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'spender',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'approve',\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'asset',\n outputs: [\n {\n name: 'assetTokenAddress',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'account',\n type: 'address',\n },\n ],\n name: 'balanceOf',\n outputs: [\n {\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'convertToAssets',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'convertToShares',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'deposit',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'caller',\n type: 'address',\n },\n ],\n name: 'maxDeposit',\n outputs: [\n {\n name: 'maxAssets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'caller',\n type: 'address',\n },\n ],\n name: 'maxMint',\n outputs: [\n {\n name: 'maxShares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'maxRedeem',\n outputs: [\n {\n name: 'maxShares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'maxWithdraw',\n outputs: [\n {\n name: 'maxAssets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'mint',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'previewDeposit',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'previewMint',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'previewRedeem',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'previewWithdraw',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'redeem',\n outputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalAssets',\n outputs: [\n {\n name: 'totalManagedAssets',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalSupply',\n outputs: [\n {\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'transfer',\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'from',\n type: 'address',\n },\n {\n name: 'to',\n type: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'transferFrom',\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'assets',\n type: 'uint256',\n },\n {\n name: 'receiver',\n type: 'address',\n },\n {\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'withdraw',\n outputs: [\n {\n name: 'shares',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const\n","export const aggregate3Signature = '0x82ad56cb'\n","export const deploylessCallViaBytecodeBytecode =\n '0x608060405234801561001057600080fd5b5060405161018e38038061018e83398101604081905261002f91610124565b6000808351602085016000f59050803b61004857600080fd5b6000808351602085016000855af16040513d6000823e81610067573d81fd5b3d81f35b634e487b7160e01b600052604160045260246000fd5b600082601f83011261009257600080fd5b81516001600160401b038111156100ab576100ab61006b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d9576100d961006b565b6040528181528382016020018510156100f157600080fd5b60005b82811015610110576020818601810151838301820152016100f4565b506000918101602001919091529392505050565b6000806040838503121561013757600080fd5b82516001600160401b0381111561014d57600080fd5b61015985828601610081565b602085015190935090506001600160401b0381111561017757600080fd5b61018385828601610081565b915050925092905056fe'\n\nexport const deploylessCallViaFactoryBytecode =\n '0x608060405234801561001057600080fd5b506040516102c03803806102c083398101604081905261002f916101e6565b836001600160a01b03163b6000036100e457600080836001600160a01b03168360405161005c9190610270565b6000604051808303816000865af19150503d8060008114610099576040519150601f19603f3d011682016040523d82523d6000602084013e61009e565b606091505b50915091508115806100b857506001600160a01b0386163b155b156100e1578060405163101bb98d60e01b81526004016100d8919061028c565b60405180910390fd5b50505b6000808451602086016000885af16040513d6000823e81610103573d81fd5b3d81f35b80516001600160a01b038116811461011e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561015457818101518382015260200161013c565b50506000910152565b600082601f83011261016e57600080fd5b81516001600160401b0381111561018757610187610123565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101b5576101b5610123565b6040528181528382016020018510156101cd57600080fd5b6101de826020830160208701610139565b949350505050565b600080600080608085870312156101fc57600080fd5b61020585610107565b60208601519094506001600160401b0381111561022157600080fd5b61022d8782880161015d565b93505061023c60408601610107565b60608601519092506001600160401b0381111561025857600080fd5b6102648782880161015d565b91505092959194509250565b60008251610282818460208701610139565b9190910192915050565b60208152600082518060208401526102ab816040850160208701610139565b601f01601f1916919091016040019291505056fe'\n\nexport const erc6492SignatureValidatorByteCode =\n '0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572'\n\nexport const multicall3Bytecode =\n '0x608060405234801561001057600080fd5b506115b9806100206000396000f3fe6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e14610325578063bce38bd714610350578063c3077fa914610380578063ee82ac5e146103b2576100f3565b80634d2301cc1461026257806372425d9d1461029f57806382ad56cb146102ca57806386d516e8146102fa576100f3565b80633408e470116100c65780633408e470146101af578063399542e9146101da5780633e64a6961461020c57806342cbb15c14610237576100f3565b80630f28c97d146100f8578063174dea7114610123578063252dba421461015357806327e86d6e14610184575b600080fd5b34801561010457600080fd5b5061010d6103ef565b60405161011a9190610c0a565b60405180910390f35b61013d60048036038101906101389190610c94565b6103f7565b60405161014a9190610e94565b60405180910390f35b61016d60048036038101906101689190610f0c565b610615565b60405161017b92919061101b565b60405180910390f35b34801561019057600080fd5b506101996107ab565b6040516101a69190611064565b60405180910390f35b3480156101bb57600080fd5b506101c46107b7565b6040516101d19190610c0a565b60405180910390f35b6101f460048036038101906101ef91906110ab565b6107bf565b6040516102039392919061110b565b60405180910390f35b34801561021857600080fd5b506102216107e1565b60405161022e9190610c0a565b60405180910390f35b34801561024357600080fd5b5061024c6107e9565b6040516102599190610c0a565b60405180910390f35b34801561026e57600080fd5b50610289600480360381019061028491906111a7565b6107f1565b6040516102969190610c0a565b60405180910390f35b3480156102ab57600080fd5b506102b4610812565b6040516102c19190610c0a565b60405180910390f35b6102e460048036038101906102df919061122a565b61081a565b6040516102f19190610e94565b60405180910390f35b34801561030657600080fd5b5061030f6109e4565b60405161031c9190610c0a565b60405180910390f35b34801561033157600080fd5b5061033a6109ec565b6040516103479190611286565b60405180910390f35b61036a600480360381019061036591906110ab565b6109f4565b6040516103779190610e94565b60405180910390f35b61039a60048036038101906103959190610f0c565b610ba6565b6040516103a99392919061110b565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906112cd565b610bca565b6040516103e69190611064565b60405180910390f35b600042905090565b60606000808484905090508067ffffffffffffffff81111561041c5761041b6112fa565b5b60405190808252806020026020018201604052801561045557816020015b610442610bd5565b81526020019060019003908161043a5790505b5092503660005b828110156105c957600085828151811061047957610478611329565b5b6020026020010151905087878381811061049657610495611329565b5b90506020028101906104a89190611367565b925060008360400135905080860195508360000160208101906104cb91906111a7565b73ffffffffffffffffffffffffffffffffffffffff16818580606001906104f2919061138f565b604051610500929190611431565b60006040518083038185875af1925050503d806000811461053d576040519150601f19603f3d011682016040523d82523d6000602084013e610542565b606091505b5083600001846020018290528215151515815250505081516020850135176105bc577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b826001019250505061045c565b5082341461060c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610603906114a7565b60405180910390fd5b50505092915050565b6000606043915060008484905090508067ffffffffffffffff81111561063e5761063d6112fa565b5b60405190808252806020026020018201604052801561067157816020015b606081526020019060019003908161065c5790505b5091503660005b828110156107a157600087878381811061069557610694611329565b5b90506020028101906106a791906114c7565b92508260000160208101906106bc91906111a7565b73ffffffffffffffffffffffffffffffffffffffff168380602001906106e2919061138f565b6040516106f0929190611431565b6000604051808303816000865af19150503d806000811461072d576040519150601f19603f3d011682016040523d82523d6000602084013e610732565b606091505b5086848151811061074657610745611329565b5b60200260200101819052819250505080610795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078c9061153b565b60405180910390fd5b81600101915050610678565b5050509250929050565b60006001430340905090565b600046905090565b6000806060439250434091506107d68686866109f4565b905093509350939050565b600048905090565b600043905090565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b600044905090565b606060008383905090508067ffffffffffffffff81111561083e5761083d6112fa565b5b60405190808252806020026020018201604052801561087757816020015b610864610bd5565b81526020019060019003908161085c5790505b5091503660005b828110156109db57600084828151811061089b5761089a611329565b5b602002602001015190508686838181106108b8576108b7611329565b5b90506020028101906108ca919061155b565b92508260000160208101906108df91906111a7565b73ffffffffffffffffffffffffffffffffffffffff16838060400190610905919061138f565b604051610913929190611431565b6000604051808303816000865af19150503d8060008114610950576040519150601f19603f3d011682016040523d82523d6000602084013e610955565b606091505b5082600001836020018290528215151515815250505080516020840135176109cf577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b8160010191505061087e565b50505092915050565b600045905090565b600041905090565b606060008383905090508067ffffffffffffffff811115610a1857610a176112fa565b5b604051908082528060200260200182016040528015610a5157816020015b610a3e610bd5565b815260200190600190039081610a365790505b5091503660005b82811015610b9c576000848281518110610a7557610a74611329565b5b60200260200101519050868683818110610a9257610a91611329565b5b9050602002810190610aa491906114c7565b9250826000016020810190610ab991906111a7565b73ffffffffffffffffffffffffffffffffffffffff16838060200190610adf919061138f565b604051610aed929190611431565b6000604051808303816000865af19150503d8060008114610b2a576040519150601f19603f3d011682016040523d82523d6000602084013e610b2f565b606091505b508260000183602001829052821515151581525050508715610b90578060000151610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061153b565b60405180910390fd5b5b81600101915050610a58565b5050509392505050565b6000806060610bb7600186866107bf565b8093508194508295505050509250925092565b600081409050919050565b6040518060400160405280600015158152602001606081525090565b6000819050919050565b610c0481610bf1565b82525050565b6000602082019050610c1f6000830184610bfb565b92915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112610c5457610c53610c2f565b5b8235905067ffffffffffffffff811115610c7157610c70610c34565b5b602083019150836020820283011115610c8d57610c8c610c39565b5b9250929050565b60008060208385031215610cab57610caa610c25565b5b600083013567ffffffffffffffff811115610cc957610cc8610c2a565b5b610cd585828601610c3e565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60008115159050919050565b610d2281610d0d565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610d62578082015181840152602081019050610d47565b83811115610d71576000848401525b50505050565b6000601f19601f8301169050919050565b6000610d9382610d28565b610d9d8185610d33565b9350610dad818560208601610d44565b610db681610d77565b840191505092915050565b6000604083016000830151610dd96000860182610d19565b5060208301518482036020860152610df18282610d88565b9150508091505092915050565b6000610e0a8383610dc1565b905092915050565b6000602082019050919050565b6000610e2a82610ce1565b610e348185610cec565b935083602082028501610e4685610cfd565b8060005b85811015610e825784840389528151610e638582610dfe565b9450610e6e83610e12565b925060208a01995050600181019050610e4a565b50829750879550505050505092915050565b60006020820190508181036000830152610eae8184610e1f565b905092915050565b60008083601f840112610ecc57610ecb610c2f565b5b8235905067ffffffffffffffff811115610ee957610ee8610c34565b5b602083019150836020820283011115610f0557610f04610c39565b5b9250929050565b60008060208385031215610f2357610f22610c25565b5b600083013567ffffffffffffffff811115610f4157610f40610c2a565b5b610f4d85828601610eb6565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000610f918383610d88565b905092915050565b6000602082019050919050565b6000610fb182610f59565b610fbb8185610f64565b935083602082028501610fcd85610f75565b8060005b858110156110095784840389528151610fea8582610f85565b9450610ff583610f99565b925060208a01995050600181019050610fd1565b50829750879550505050505092915050565b60006040820190506110306000830185610bfb565b81810360208301526110428184610fa6565b90509392505050565b6000819050919050565b61105e8161104b565b82525050565b60006020820190506110796000830184611055565b92915050565b61108881610d0d565b811461109357600080fd5b50565b6000813590506110a58161107f565b92915050565b6000806000604084860312156110c4576110c3610c25565b5b60006110d286828701611096565b935050602084013567ffffffffffffffff8111156110f3576110f2610c2a565b5b6110ff86828701610eb6565b92509250509250925092565b60006060820190506111206000830186610bfb565b61112d6020830185611055565b818103604083015261113f8184610e1f565b9050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061117482611149565b9050919050565b61118481611169565b811461118f57600080fd5b50565b6000813590506111a18161117b565b92915050565b6000602082840312156111bd576111bc610c25565b5b60006111cb84828501611192565b91505092915050565b60008083601f8401126111ea576111e9610c2f565b5b8235905067ffffffffffffffff81111561120757611206610c34565b5b60208301915083602082028301111561122357611222610c39565b5b9250929050565b6000806020838503121561124157611240610c25565b5b600083013567ffffffffffffffff81111561125f5761125e610c2a565b5b61126b858286016111d4565b92509250509250929050565b61128081611169565b82525050565b600060208201905061129b6000830184611277565b92915050565b6112aa81610bf1565b81146112b557600080fd5b50565b6000813590506112c7816112a1565b92915050565b6000602082840312156112e3576112e2610c25565b5b60006112f1848285016112b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008235600160800383360303811261138357611382611358565b5b80830191505092915050565b600080833560016020038436030381126113ac576113ab611358565b5b80840192508235915067ffffffffffffffff8211156113ce576113cd61135d565b5b6020830192506001820236038313156113ea576113e9611362565b5b509250929050565b600081905092915050565b82818337600083830152505050565b600061141883856113f2565b93506114258385846113fd565b82840190509392505050565b600061143e82848661140c565b91508190509392505050565b600082825260208201905092915050565b7f4d756c746963616c6c333a2076616c7565206d69736d61746368000000000000600082015250565b6000611491601a8361144a565b915061149c8261145b565b602082019050919050565b600060208201905081810360008301526114c081611484565b9050919050565b6000823560016040038336030381126114e3576114e2611358565b5b80830191505092915050565b7f4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000600082015250565b600061152560178361144a565b9150611530826114ef565b602082019050919050565b6000602082019050818103600083015261155481611518565b9050919050565b60008235600160600383360303811261157757611576611358565b5b8083019150509291505056fea264697066735822122020c1bc9aacf8e4a6507193432a895a8e77094f45a1395583f07b24e860ef06cd64736f6c634300080c0033'\n","import type { Chain } from '../types/chain.js'\n\nimport { BaseError } from './base.js'\n\nexport type ChainDoesNotSupportContractErrorType =\n ChainDoesNotSupportContract & {\n name: 'ChainDoesNotSupportContract'\n }\nexport class ChainDoesNotSupportContract extends BaseError {\n constructor({\n blockNumber,\n chain,\n contract,\n }: {\n blockNumber?: bigint | undefined\n chain: Chain\n contract: { name: string; blockCreated?: number | undefined }\n }) {\n super(\n `Chain \"${chain.name}\" does not support contract \"${contract.name}\".`,\n {\n metaMessages: [\n 'This could be due to any of the following:',\n ...(blockNumber &&\n contract.blockCreated &&\n contract.blockCreated > blockNumber\n ? [\n `- The contract \"${contract.name}\" was not deployed until block ${contract.blockCreated} (current block ${blockNumber}).`,\n ]\n : [\n `- The chain does not have the contract \"${contract.name}\" configured.`,\n ]),\n ],\n name: 'ChainDoesNotSupportContract',\n },\n )\n }\n}\n\nexport type ChainMismatchErrorType = ChainMismatchError & {\n name: 'ChainMismatchError'\n}\nexport class ChainMismatchError extends BaseError {\n constructor({\n chain,\n currentChainId,\n }: {\n chain: Chain\n currentChainId: number\n }) {\n super(\n `The current chain of the wallet (id: ${currentChainId}) does not match the target chain for the transaction (id: ${chain.id} – ${chain.name}).`,\n {\n metaMessages: [\n `Current Chain ID: ${currentChainId}`,\n `Expected Chain ID: ${chain.id} – ${chain.name}`,\n ],\n name: 'ChainMismatchError',\n },\n )\n }\n}\n\nexport type ChainNotFoundErrorType = ChainNotFoundError & {\n name: 'ChainNotFoundError'\n}\nexport class ChainNotFoundError extends BaseError {\n constructor() {\n super(\n [\n 'No chain was provided to the request.',\n 'Please provide a chain with the `chain` argument on the Action, or by supplying a `chain` to WalletClient.',\n ].join('\\n'),\n {\n name: 'ChainNotFoundError',\n },\n )\n }\n}\n\nexport type ClientChainNotConfiguredErrorType =\n ClientChainNotConfiguredError & {\n name: 'ClientChainNotConfiguredError'\n }\nexport class ClientChainNotConfiguredError extends BaseError {\n constructor() {\n super('No chain was provided to the Client.', {\n name: 'ClientChainNotConfiguredError',\n })\n }\n}\n\nexport type InvalidChainIdErrorType = InvalidChainIdError & {\n name: 'InvalidChainIdError'\n}\nexport class InvalidChainIdError extends BaseError {\n constructor({ chainId }: { chainId?: number | undefined }) {\n super(\n typeof chainId === 'number'\n ? `Chain ID \"${chainId}\" is invalid.`\n : 'Chain ID is invalid.',\n { name: 'InvalidChainIdError' },\n )\n }\n}\n","import type { Abi } from 'abitype'\n\nimport {\n AbiConstructorNotFoundError,\n type AbiConstructorNotFoundErrorType,\n AbiConstructorParamsNotFoundError,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ContractConstructorArgs } from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { UnionEvaluate } from '../../types/utils.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\n\nconst docsPath = '/docs/contract/encodeDeployData'\n\nexport type EncodeDeployDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n ///\n hasConstructor = abi extends Abi\n ? Abi extends abi\n ? true\n : [Extract] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractConstructorArgs,\n> = {\n abi: abi\n bytecode: Hex\n} & UnionEvaluate<\n hasConstructor extends false\n ? { args?: undefined }\n : readonly [] extends allArgs\n ? { args?: allArgs | undefined }\n : { args: allArgs }\n>\n\nexport type EncodeDeployDataReturnType = Hex\n\nexport type EncodeDeployDataErrorType =\n | AbiConstructorNotFoundErrorType\n | ConcatHexErrorType\n | EncodeAbiParametersErrorType\n | ErrorType\n\nexport function encodeDeployData(\n parameters: EncodeDeployDataParameters,\n): EncodeDeployDataReturnType {\n const { abi, args, bytecode } = parameters as EncodeDeployDataParameters\n if (!args || args.length === 0) return bytecode\n\n const description = abi.find((x) => 'type' in x && x.type === 'constructor')\n if (!description) throw new AbiConstructorNotFoundError({ docsPath })\n if (!('inputs' in description))\n throw new AbiConstructorParamsNotFoundError({ docsPath })\n if (!description.inputs || description.inputs.length === 0)\n throw new AbiConstructorParamsNotFoundError({ docsPath })\n\n const data = encodeAbiParameters(description.inputs, args)\n return concatHex([bytecode, data!])\n}\n","import {\n ChainDoesNotSupportContract,\n type ChainDoesNotSupportContractErrorType,\n} from '../../errors/chain.js'\nimport type { Chain, ChainContract } from '../../types/chain.js'\n\nexport type GetChainContractAddressErrorType =\n ChainDoesNotSupportContractErrorType\n\nexport function getChainContractAddress({\n blockNumber,\n chain,\n contract: name,\n}: {\n blockNumber?: bigint | undefined\n chain: Chain\n contract: string\n}) {\n const contract = (chain?.contracts as Record)?.[name]\n if (!contract)\n throw new ChainDoesNotSupportContract({\n chain,\n contract: { name },\n })\n\n if (\n blockNumber &&\n contract.blockCreated &&\n contract.blockCreated > blockNumber\n )\n throw new ChainDoesNotSupportContract({\n blockNumber,\n chain,\n contract: {\n name,\n blockCreated: contract.blockCreated,\n },\n })\n\n return contract.address\n}\n","import type { CallParameters } from '../../actions/public/call.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n CallExecutionError,\n type CallExecutionErrorType,\n} from '../../errors/contract.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetCallErrorReturnType = Omit<\n CallExecutionErrorType,\n 'cause'\n> & {\n cause: cause | GetNodeErrorReturnType\n}\n\nexport function getCallError>(\n err: err,\n {\n docsPath,\n ...args\n }: CallParameters & {\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n): GetCallErrorReturnType {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new CallExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetCallErrorReturnType\n}\n","/** @internal */\nexport type PromiseWithResolvers = {\n promise: Promise\n resolve: (value: type | PromiseLike) => void\n reject: (reason?: unknown) => void\n}\n\n/** @internal */\nexport function withResolvers(): PromiseWithResolvers {\n let resolve: PromiseWithResolvers['resolve'] = () => undefined\n let reject: PromiseWithResolvers['reject'] = () => undefined\n\n const promise = new Promise((resolve_, reject_) => {\n resolve = resolve_\n reject = reject_\n })\n\n return { promise, resolve, reject }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport { type PromiseWithResolvers, withResolvers } from './withResolvers.js'\n\ntype Resolved = [\n result: returnType[number],\n results: returnType,\n]\n\ntype SchedulerItem = {\n args: unknown\n resolve: PromiseWithResolvers['resolve']\n reject: PromiseWithResolvers['reject']\n}\n\ntype BatchResultsCompareFn = (a: result, b: result) => number\n\ntype CreateBatchSchedulerArguments<\n parameters = unknown,\n returnType extends readonly unknown[] = readonly unknown[],\n> = {\n fn: (args: parameters[]) => Promise\n id: number | string\n shouldSplitBatch?: ((args: parameters[]) => boolean) | undefined\n wait?: number | undefined\n sort?: BatchResultsCompareFn | undefined\n}\n\ntype CreateBatchSchedulerReturnType<\n parameters = unknown,\n returnType extends readonly unknown[] = readonly unknown[],\n> = {\n flush: () => void\n schedule: parameters extends undefined\n ? (args?: parameters | undefined) => Promise>\n : (args: parameters) => Promise>\n}\n\nexport type CreateBatchSchedulerErrorType = ErrorType\n\nconst schedulerCache = /*#__PURE__*/ new Map()\n\n/** @internal */\nexport function createBatchScheduler<\n parameters,\n returnType extends readonly unknown[],\n>({\n fn,\n id,\n shouldSplitBatch,\n wait = 0,\n sort,\n}: CreateBatchSchedulerArguments<\n parameters,\n returnType\n>): CreateBatchSchedulerReturnType {\n const exec = async () => {\n const scheduler = getScheduler()\n flush()\n\n const args = scheduler.map(({ args }) => args)\n\n if (args.length === 0) return\n\n fn(args as parameters[])\n .then((data) => {\n if (sort && Array.isArray(data)) data.sort(sort)\n for (let i = 0; i < scheduler.length; i++) {\n const { resolve } = scheduler[i]\n resolve?.([data[i], data])\n }\n })\n .catch((err) => {\n for (let i = 0; i < scheduler.length; i++) {\n const { reject } = scheduler[i]\n reject?.(err)\n }\n })\n }\n\n const flush = () => schedulerCache.delete(id)\n\n const getBatchedArgs = () =>\n getScheduler().map(({ args }) => args) as parameters[]\n\n const getScheduler = () => schedulerCache.get(id) || []\n\n const setScheduler = (item: SchedulerItem) =>\n schedulerCache.set(id, [...getScheduler(), item])\n\n return {\n flush,\n async schedule(args: parameters) {\n const { promise, resolve, reject } = withResolvers()\n\n const split = shouldSplitBatch?.([...getBatchedArgs(), args])\n\n if (split) exec()\n\n const hasActiveScheduler = getScheduler().length > 0\n if (hasActiveScheduler) {\n setScheduler({ args, resolve, reject })\n return promise\n }\n\n setScheduler({ args, resolve, reject })\n setTimeout(exec, wait)\n return promise\n },\n } as unknown as CreateBatchSchedulerReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { Hex } from '../types/misc.js'\nimport { stringify } from '../utils/stringify.js'\n\nimport { BaseError } from './base.js'\nimport { getUrl } from './utils.js'\n\nexport type OffchainLookupErrorType = OffchainLookupError & {\n name: 'OffchainLookupError'\n}\nexport class OffchainLookupError extends BaseError {\n constructor({\n callbackSelector,\n cause,\n data,\n extraData,\n sender,\n urls,\n }: {\n callbackSelector: Hex\n cause: BaseError\n data: Hex\n extraData: Hex\n sender: Address\n urls: readonly string[]\n }) {\n super(\n cause.shortMessage ||\n 'An error occurred while fetching for an offchain result.',\n {\n cause,\n metaMessages: [\n ...(cause.metaMessages || []),\n cause.metaMessages?.length ? '' : [],\n 'Offchain Gateway Call:',\n urls && [\n ' Gateway URL(s):',\n ...urls.map((url) => ` ${getUrl(url)}`),\n ],\n ` Sender: ${sender}`,\n ` Data: ${data}`,\n ` Callback selector: ${callbackSelector}`,\n ` Extra data: ${extraData}`,\n ].flat(),\n name: 'OffchainLookupError',\n },\n )\n }\n}\n\nexport type OffchainLookupResponseMalformedErrorType =\n OffchainLookupResponseMalformedError & {\n name: 'OffchainLookupResponseMalformedError'\n }\nexport class OffchainLookupResponseMalformedError extends BaseError {\n constructor({ result, url }: { result: any; url: string }) {\n super(\n 'Offchain gateway response is malformed. Response data must be a hex value.',\n {\n metaMessages: [\n `Gateway URL: ${getUrl(url)}`,\n `Response: ${stringify(result)}`,\n ],\n name: 'OffchainLookupResponseMalformedError',\n },\n )\n }\n}\n\n/** @internal */\nexport type OffchainLookupSenderMismatchErrorType =\n OffchainLookupSenderMismatchError & {\n name: 'OffchainLookupSenderMismatchError'\n }\nexport class OffchainLookupSenderMismatchError extends BaseError {\n constructor({ sender, to }: { sender: Address; to: Address }) {\n super(\n 'Reverted sender address does not match target contract address (`to`).',\n {\n metaMessages: [\n `Contract address: ${to}`,\n `OffchainLookup sender address: ${sender}`,\n ],\n name: 'OffchainLookupSenderMismatchError',\n },\n )\n }\n}\n","import type { Abi, AbiStateMutability } from 'abitype'\n\nimport { AbiFunctionSignatureNotFoundError } from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type SliceErrorType, slice } from '../data/slice.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\n\nexport type DecodeFunctionDataParameters<\n abi extends Abi | readonly unknown[] = Abi,\n> = {\n abi: abi\n data: Hex\n}\n\nexport type DecodeFunctionDataReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n ///\n allFunctionNames extends\n ContractFunctionName = ContractFunctionName,\n> = IsNarrowable extends true\n ? UnionEvaluate<\n {\n [functionName in allFunctionNames]: {\n args: ContractFunctionArgs\n functionName: functionName\n }\n }[allFunctionNames]\n >\n : {\n args: readonly unknown[] | undefined\n functionName: string\n }\n\nexport type DecodeFunctionDataErrorType =\n | AbiFunctionSignatureNotFoundError\n | DecodeAbiParametersErrorType\n | FormatAbiItemErrorType\n | ToFunctionSelectorErrorType\n | SliceErrorType\n | ErrorType\n\nexport function decodeFunctionData(\n parameters: DecodeFunctionDataParameters,\n) {\n const { abi, data } = parameters as DecodeFunctionDataParameters\n const signature = slice(data, 0, 4)\n const description = abi.find(\n (x) =>\n x.type === 'function' &&\n signature === toFunctionSelector(formatAbiItem(x)),\n )\n if (!description)\n throw new AbiFunctionSignatureNotFoundError(signature, {\n docsPath: '/docs/contract/decodeFunctionData',\n })\n return {\n functionName: (description as { name: string }).name,\n args: ('inputs' in description &&\n description.inputs &&\n description.inputs.length > 0\n ? decodeAbiParameters(description.inputs, slice(data, 4))\n : undefined) as readonly unknown[] | undefined,\n } as DecodeFunctionDataReturnType\n}\n","import type { Abi, ExtractAbiErrors } from 'abitype'\n\nimport {\n AbiErrorInputsNotFoundError,\n AbiErrorNotFoundError,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractErrorArgs,\n ContractErrorName,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport {\n type ToFunctionSelectorErrorType,\n toFunctionSelector,\n} from '../hash/toFunctionSelector.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeErrorResult'\n\nexport type EncodeErrorResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n errorName extends ContractErrorName | undefined = ContractErrorName,\n ///\n hasErrors = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiErrors] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractErrorArgs<\n abi,\n errorName extends ContractErrorName\n ? errorName\n : ContractErrorName\n >,\n allErrorNames = ContractErrorName,\n> = {\n abi: abi\n args?: allArgs | undefined\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { errorName?: errorName | allErrorNames | undefined }\n : { errorName: errorName | allErrorNames }\n : { errorName?: errorName | allErrorNames | undefined }\n> &\n (hasErrors extends true ? unknown : never)\n\nexport type EncodeErrorResultReturnType = Hex\n\nexport type EncodeErrorResultErrorType =\n | GetAbiItemErrorType\n | FormatAbiItemErrorType\n | ToFunctionSelectorErrorType\n | EncodeAbiParametersErrorType\n | ConcatHexErrorType\n | ErrorType\n\nexport function encodeErrorResult<\n const abi extends Abi | readonly unknown[],\n errorName extends ContractErrorName | undefined = undefined,\n>(\n parameters: EncodeErrorResultParameters,\n): EncodeErrorResultReturnType {\n const { abi, errorName, args } = parameters as EncodeErrorResultParameters\n\n let abiItem = abi[0]\n if (errorName) {\n const item = getAbiItem({ abi, args, name: errorName })\n if (!item) throw new AbiErrorNotFoundError(errorName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'error')\n throw new AbiErrorNotFoundError(undefined, { docsPath })\n\n const definition = formatAbiItem(abiItem)\n const signature = toFunctionSelector(definition)\n\n let data: Hex = '0x'\n if (args && args.length > 0) {\n if (!abiItem.inputs)\n throw new AbiErrorInputsNotFoundError(abiItem.name, { docsPath })\n data = encodeAbiParameters(abiItem.inputs, args)\n }\n return concatHex([signature, data])\n}\n","import type { Abi, AbiStateMutability, ExtractAbiFunctions } from 'abitype'\n\nimport {\n AbiFunctionNotFoundError,\n AbiFunctionOutputsNotFoundError,\n InvalidArrayError,\n} from '../../errors/abi.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractFunctionName,\n ContractFunctionReturnType,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeFunctionResult'\n\nexport type EncodeFunctionResultParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends\n | ContractFunctionName\n | undefined = ContractFunctionName,\n ///\n hasFunctions = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiFunctions] extends [never]\n ? false\n : true\n : true,\n allFunctionNames = ContractFunctionName,\n> = {\n abi: abi\n result?:\n | ContractFunctionReturnType<\n abi,\n AbiStateMutability,\n functionName extends ContractFunctionName\n ? functionName\n : ContractFunctionName,\n never // allow all args. required for overloads to work.\n >\n | undefined\n} & UnionEvaluate<\n IsNarrowable extends true\n ? abi['length'] extends 1\n ? { functionName?: functionName | allFunctionNames | undefined }\n : { functionName: functionName | allFunctionNames }\n : { functionName?: functionName | allFunctionNames | undefined }\n> &\n (hasFunctions extends true ? unknown : never)\n\nexport type EncodeFunctionResultReturnType = Hex\n\nexport type EncodeFunctionResultErrorType =\n | AbiFunctionOutputsNotFoundError\n | AbiFunctionNotFoundError\n | EncodeAbiParametersErrorType\n | GetAbiItemErrorType\n | ErrorType\n\nexport function encodeFunctionResult<\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName | undefined = undefined,\n>(\n parameters: EncodeFunctionResultParameters,\n): EncodeFunctionResultReturnType {\n const { abi, functionName, result } =\n parameters as EncodeFunctionResultParameters\n\n let abiItem = abi[0]\n if (functionName) {\n const item = getAbiItem({ abi, name: functionName })\n if (!item) throw new AbiFunctionNotFoundError(functionName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'function')\n throw new AbiFunctionNotFoundError(undefined, { docsPath })\n\n if (!abiItem.outputs)\n throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath })\n\n const values = (() => {\n if (abiItem.outputs.length === 0) return []\n if (abiItem.outputs.length === 1) return [result]\n if (Array.isArray(result)) return result\n throw new InvalidArrayError(result)\n })()\n\n return encodeAbiParameters(abiItem.outputs, values)\n}\n","import { batchGatewayAbi } from '../../constants/abis.js'\nimport { solidityError } from '../../constants/solidity.js'\nimport type { Hex } from '../../types/misc.js'\nimport { decodeFunctionData } from '../abi/decodeFunctionData.js'\nimport { encodeErrorResult } from '../abi/encodeErrorResult.js'\nimport { encodeFunctionResult } from '../abi/encodeFunctionResult.js'\nimport type {\n CcipRequestErrorType,\n CcipRequestParameters,\n CcipRequestReturnType,\n} from '../ccip.js'\n\nexport const localBatchGatewayUrl = 'x-batch-gateway:true'\n\nexport async function localBatchGatewayRequest(parameters: {\n data: Hex\n ccipRequest: (\n parameters: CcipRequestParameters,\n ) => Promise\n}): Promise {\n const { data, ccipRequest } = parameters\n\n const {\n args: [queries],\n } = decodeFunctionData({ abi: batchGatewayAbi, data })\n\n const failures: boolean[] = []\n const responses: Hex[] = []\n await Promise.all(\n queries.map(async (query, i) => {\n try {\n responses[i] = query.urls.includes(localBatchGatewayUrl)\n ? await localBatchGatewayRequest({ data: query.data, ccipRequest })\n : await ccipRequest(query)\n failures[i] = false\n } catch (err) {\n failures[i] = true\n responses[i] = encodeError(err as CcipRequestErrorType)\n }\n }),\n )\n\n return encodeFunctionResult({\n abi: batchGatewayAbi,\n functionName: 'query',\n result: [failures, responses],\n })\n}\n\nfunction encodeError(error: CcipRequestErrorType): Hex {\n if (error.name === 'HttpRequestError' && error.status)\n return encodeErrorResult({\n abi: batchGatewayAbi,\n errorName: 'HttpError',\n args: [error.status, error.shortMessage],\n })\n return encodeErrorResult({\n abi: [solidityError],\n errorName: 'Error',\n args: ['shortMessage' in error ? error.shortMessage : error.message],\n })\n}\n","import type { Abi, Address } from 'abitype'\n\nimport { type CallParameters, call } from '../actions/public/call.js'\nimport type { Client } from '../clients/createClient.js'\nimport type { Transport } from '../clients/transports/createTransport.js'\nimport type { BaseError } from '../errors/base.js'\nimport {\n OffchainLookupError,\n type OffchainLookupErrorType as OffchainLookupErrorType_,\n OffchainLookupResponseMalformedError,\n type OffchainLookupResponseMalformedErrorType,\n OffchainLookupSenderMismatchError,\n} from '../errors/ccip.js'\nimport {\n HttpRequestError,\n type HttpRequestErrorType,\n} from '../errors/request.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Chain } from '../types/chain.js'\nimport type { Hex } from '../types/misc.js'\nimport { decodeErrorResult } from './abi/decodeErrorResult.js'\nimport { encodeAbiParameters } from './abi/encodeAbiParameters.js'\nimport { isAddressEqual } from './address/isAddressEqual.js'\nimport { concat } from './data/concat.js'\nimport { isHex } from './data/isHex.js'\nimport {\n localBatchGatewayRequest,\n localBatchGatewayUrl,\n} from './ens/localBatchGatewayRequest.js'\nimport { stringify } from './stringify.js'\n\nexport const offchainLookupSignature = '0x556f1830'\nexport const offchainLookupAbiItem = {\n name: 'OffchainLookup',\n type: 'error',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'urls',\n type: 'string[]',\n },\n {\n name: 'callData',\n type: 'bytes',\n },\n {\n name: 'callbackFunction',\n type: 'bytes4',\n },\n {\n name: 'extraData',\n type: 'bytes',\n },\n ],\n} as const satisfies Abi[number]\n\nexport type OffchainLookupErrorType = OffchainLookupErrorType_ | ErrorType\n\nexport async function offchainLookup(\n client: Client,\n {\n blockNumber,\n blockTag,\n data,\n to,\n }: Pick & {\n data: Hex\n to: Address\n },\n): Promise {\n const { args } = decodeErrorResult({\n data,\n abi: [offchainLookupAbiItem],\n })\n const [sender, urls, callData, callbackSelector, extraData] = args\n\n const { ccipRead } = client\n const ccipRequest_ =\n ccipRead && typeof ccipRead?.request === 'function'\n ? ccipRead.request\n : ccipRequest\n\n try {\n if (!isAddressEqual(to, sender))\n throw new OffchainLookupSenderMismatchError({ sender, to })\n\n const result = urls.includes(localBatchGatewayUrl)\n ? await localBatchGatewayRequest({\n data: callData,\n ccipRequest: ccipRequest_,\n })\n : await ccipRequest_({ data: callData, sender, urls })\n\n const { data: data_ } = await call(client, {\n blockNumber,\n blockTag,\n data: concat([\n callbackSelector,\n encodeAbiParameters(\n [{ type: 'bytes' }, { type: 'bytes' }],\n [result, extraData],\n ),\n ]),\n to,\n } as CallParameters)\n\n return data_!\n } catch (err) {\n throw new OffchainLookupError({\n callbackSelector,\n cause: err as BaseError,\n data,\n extraData,\n sender,\n urls,\n })\n }\n}\n\nexport type CcipRequestParameters = {\n data: Hex\n sender: Address\n urls: readonly string[]\n}\n\nexport type CcipRequestReturnType = Hex\n\nexport type CcipRequestErrorType =\n | HttpRequestErrorType\n | OffchainLookupResponseMalformedErrorType\n | ErrorType\n\nexport async function ccipRequest({\n data,\n sender,\n urls,\n}: CcipRequestParameters): Promise {\n let error = new Error('An unknown error occurred.')\n\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i]\n const method = url.includes('{data}') ? 'GET' : 'POST'\n const body = method === 'POST' ? { data, sender } : undefined\n const headers: HeadersInit =\n method === 'POST' ? { 'Content-Type': 'application/json' } : {}\n\n try {\n const response = await fetch(\n url.replace('{sender}', sender.toLowerCase()).replace('{data}', data),\n {\n body: JSON.stringify(body),\n headers,\n method,\n },\n )\n\n let result: any\n if (\n response.headers.get('Content-Type')?.startsWith('application/json')\n ) {\n result = (await response.json()).data\n } else {\n result = (await response.text()) as any\n }\n\n if (!response.ok) {\n error = new HttpRequestError({\n body,\n details: result?.error\n ? stringify(result.error)\n : response.statusText,\n headers: response.headers,\n status: response.status,\n url,\n })\n continue\n }\n\n if (!isHex(result)) {\n error = new OffchainLookupResponseMalformedError({\n result,\n url,\n })\n continue\n }\n\n return result\n } catch (err) {\n error = new HttpRequestError({\n body,\n details: (err as Error).message,\n url,\n })\n }\n }\n\n throw error\n}\n","import { type Address, parseAbi } from 'abitype'\nimport * as BlockOverrides from 'ox/BlockOverrides'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { multicall3Abi } from '../../constants/abis.js'\nimport { aggregate3Signature } from '../../constants/contract.js'\nimport {\n deploylessCallViaBytecodeBytecode,\n deploylessCallViaFactoryBytecode,\n multicall3Bytecode,\n} from '../../constants/contracts.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n ChainDoesNotSupportContract,\n ClientChainNotConfiguredError,\n} from '../../errors/chain.js'\nimport {\n CounterfactualDeploymentFailedError,\n RawContractError,\n type RawContractErrorType,\n} from '../../errors/contract.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RpcTransactionRequest } from '../../types/rpc.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial, UnionOmit } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeDeployDataErrorType,\n encodeDeployData,\n} from '../../utils/abi/encodeDeployData.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type GetCallErrorReturnType,\n getCallError,\n} from '../../utils/errors/getCallError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport {\n type CreateBatchSchedulerErrorType,\n createBatchScheduler,\n} from '../../utils/promise/createBatchScheduler.js'\nimport {\n type SerializeStateOverrideErrorType,\n serializeStateOverride,\n} from '../../utils/stateOverride.js'\nimport type {\n AssertRequestErrorType,\n AssertRequestParameters,\n} from '../../utils/transaction/assertRequest.js'\nimport { assertRequest } from '../../utils/transaction/assertRequest.js'\n\nexport type CallParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = UnionOmit, 'from'> & {\n /** Account attached to the call (msg.sender). */\n account?: Account | Address | undefined\n /** Whether or not to enable multicall batching on this call. */\n batch?: boolean | undefined\n /** Block overrides for the call. */\n blockOverrides?: BlockOverrides.BlockOverrides | undefined\n /** Bytecode to perform the call on. */\n code?: Hex | undefined\n /** Contract deployment factory address (ie. Create2 factory, Smart Account factory, etc). */\n factory?: Address | undefined\n /** Calldata to execute on the factory to deploy the contract. */\n factoryData?: Hex | undefined\n /** State overrides for the call. */\n stateOverride?: StateOverride | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n )\ntype FormattedCall =\n FormattedTransactionRequest\n\nexport type CallReturnType = { data: Hex | undefined }\n\nexport type CallErrorType = GetCallErrorReturnType<\n | ParseAccountErrorType\n | SerializeStateOverrideErrorType\n | AssertRequestErrorType\n | NumberToHexErrorType\n | FormatTransactionRequestErrorType\n | ScheduleMulticallErrorType\n | RequestErrorType\n | ToDeploylessCallViaBytecodeDataErrorType\n | ToDeploylessCallViaFactoryDataErrorType\n>\n\n/**\n * Executes a new message call immediately without submitting a transaction to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/call\n * - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call)\n *\n * @param client - Client to use\n * @param parameters - {@link CallParameters}\n * @returns The call data. {@link CallReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { call } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const data = await call(client, {\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\nexport async function call(\n client: Client,\n args: CallParameters,\n): Promise {\n const {\n account: account_ = client.account,\n authorizationList,\n batch = Boolean(client.batch?.multicall),\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n accessList,\n blobs,\n blockOverrides,\n code,\n data: data_,\n factory,\n factoryData,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n stateOverride,\n ...rest\n } = args\n const account = account_ ? parseAccount(account_) : undefined\n\n if (code && (factory || factoryData))\n throw new BaseError(\n 'Cannot provide both `code` & `factory`/`factoryData` as parameters.',\n )\n if (code && to)\n throw new BaseError('Cannot provide both `code` & `to` as parameters.')\n\n // Check if the call is deployless via bytecode.\n const deploylessCallViaBytecode = code && data_\n // Check if the call is deployless via a factory.\n const deploylessCallViaFactory = factory && factoryData && to && data_\n const deploylessCall = deploylessCallViaBytecode || deploylessCallViaFactory\n\n const data = (() => {\n if (deploylessCallViaBytecode)\n return toDeploylessCallViaBytecodeData({\n code,\n data: data_,\n })\n if (deploylessCallViaFactory)\n return toDeploylessCallViaFactoryData({\n data: data_,\n factory,\n factoryData,\n to,\n })\n return data_\n })()\n\n try {\n assertRequest(args as AssertRequestParameters)\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const rpcBlockOverrides = blockOverrides\n ? BlockOverrides.toRpc(blockOverrides)\n : undefined\n const rpcStateOverride = serializeStateOverride(stateOverride)\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n accessList,\n account,\n authorizationList,\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to: deploylessCall ? undefined : to,\n value,\n } as TransactionRequest,\n 'call',\n ) as TransactionRequest\n\n if (\n batch &&\n shouldPerformMulticall({ request }) &&\n !rpcStateOverride &&\n !rpcBlockOverrides\n ) {\n try {\n return await scheduleMulticall(client, {\n ...request,\n blockNumber,\n blockTag,\n } as unknown as ScheduleMulticallParameters)\n } catch (err) {\n if (\n !(err instanceof ClientChainNotConfiguredError) &&\n !(err instanceof ChainDoesNotSupportContract)\n )\n throw err\n }\n }\n\n const params = (() => {\n const base = [\n request as ExactPartial,\n block,\n ] as const\n if (rpcStateOverride && rpcBlockOverrides)\n return [...base, rpcStateOverride, rpcBlockOverrides] as const\n if (rpcStateOverride) return [...base, rpcStateOverride] as const\n if (rpcBlockOverrides) return [...base, {}, rpcBlockOverrides] as const\n return base\n })()\n\n const response = await client.request({\n method: 'eth_call',\n params,\n })\n if (response === '0x') return { data: undefined }\n return { data: response }\n } catch (err) {\n const data = getRevertErrorData(err)\n\n // Check for CCIP-Read offchain lookup signature.\n const { offchainLookup, offchainLookupSignature } = await import(\n '../../utils/ccip.js'\n )\n if (\n client.ccipRead !== false &&\n data?.slice(0, 10) === offchainLookupSignature &&\n to\n )\n return { data: await offchainLookup(client, { data, to }) }\n\n // Check for counterfactual deployment error.\n if (deploylessCall && data?.slice(0, 10) === '0x101bb98d')\n throw new CounterfactualDeploymentFailedError({ factory })\n\n throw getCallError(err as ErrorType, {\n ...args,\n account,\n chain: client.chain,\n })\n }\n}\n\n// We only want to perform a scheduled multicall if:\n// - The request has calldata,\n// - The request has a target address,\n// - The target address is not already the aggregate3 signature,\n// - The request has no other properties (`nonce`, `gas`, etc cannot be sent with a multicall).\nfunction shouldPerformMulticall({ request }: { request: TransactionRequest }) {\n const { data, to, ...request_ } = request\n if (!data) return false\n if (data.startsWith(aggregate3Signature)) return false\n if (!to) return false\n if (\n Object.values(request_).filter((x) => typeof x !== 'undefined').length > 0\n )\n return false\n return true\n}\n\ntype ScheduleMulticallParameters = Pick<\n CallParameters,\n 'blockNumber' | 'blockTag'\n> & {\n data: Hex\n multicallAddress?: Address | undefined\n to: Address\n}\n\ntype ScheduleMulticallErrorType =\n | GetChainContractAddressErrorType\n | NumberToHexErrorType\n | CreateBatchSchedulerErrorType\n | EncodeFunctionDataErrorType\n | DecodeFunctionResultErrorType\n | RawContractErrorType\n | ErrorType\n\nasync function scheduleMulticall(\n client: Client,\n args: ScheduleMulticallParameters,\n) {\n const {\n batchSize = 1024,\n deployless = false,\n wait = 0,\n } = typeof client.batch?.multicall === 'object' ? client.batch.multicall : {}\n const {\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n data,\n to,\n } = args\n\n const multicallAddress = (() => {\n if (deployless) return null\n if (args.multicallAddress) return args.multicallAddress\n if (client.chain) {\n return getChainContractAddress({\n blockNumber,\n chain: client.chain,\n contract: 'multicall3',\n })\n }\n throw new ClientChainNotConfiguredError()\n })()\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const { schedule } = createBatchScheduler({\n id: `${client.uid}.${block}`,\n wait,\n shouldSplitBatch(args) {\n const size = args.reduce((size, { data }) => size + (data.length - 2), 0)\n return size > batchSize * 2\n },\n fn: async (\n requests: {\n data: Hex\n to: Address\n }[],\n ) => {\n const calls = requests.map((request) => ({\n allowFailure: true,\n callData: request.data,\n target: request.to,\n }))\n\n const calldata = encodeFunctionData({\n abi: multicall3Abi,\n args: [calls],\n functionName: 'aggregate3',\n })\n\n const data = await client.request({\n method: 'eth_call',\n params: [\n {\n ...(multicallAddress === null\n ? {\n data: toDeploylessCallViaBytecodeData({\n code: multicall3Bytecode,\n data: calldata,\n }),\n }\n : { to: multicallAddress, data: calldata }),\n },\n block,\n ],\n })\n\n return decodeFunctionResult({\n abi: multicall3Abi,\n args: [calls],\n functionName: 'aggregate3',\n data: data || '0x',\n })\n },\n })\n\n const [{ returnData, success }] = await schedule({ data, to })\n\n if (!success) throw new RawContractError({ data: returnData })\n if (returnData === '0x') return { data: undefined }\n return { data: returnData }\n}\n\ntype ToDeploylessCallViaBytecodeDataErrorType =\n | EncodeDeployDataErrorType\n | ErrorType\n\nfunction toDeploylessCallViaBytecodeData(parameters: { code: Hex; data: Hex }) {\n const { code, data } = parameters\n return encodeDeployData({\n abi: parseAbi(['constructor(bytes, bytes)']),\n bytecode: deploylessCallViaBytecodeBytecode,\n args: [code, data],\n })\n}\n\ntype ToDeploylessCallViaFactoryDataErrorType =\n | EncodeDeployDataErrorType\n | ErrorType\n\nfunction toDeploylessCallViaFactoryData(parameters: {\n data: Hex\n factory: Address\n factoryData: Hex\n to: Address\n}) {\n const { data, factory, factoryData, to } = parameters\n return encodeDeployData({\n abi: parseAbi(['constructor(address, bytes, address, bytes)']),\n bytecode: deploylessCallViaFactoryBytecode,\n args: [to, data, factory, factoryData],\n })\n}\n\n/** @internal */\nexport type GetRevertErrorDataErrorType = ErrorType\n\n/** @internal */\nexport function getRevertErrorData(err: unknown) {\n if (!(err instanceof BaseError)) return undefined\n const error = err.walk() as RawContractError\n return typeof error?.data === 'object' ? error.data?.data : error.data\n}\n","import type { Abi } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n} from '../../types/contract.js'\nimport type { UnionEvaluate } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\n\nimport { type CallErrorType, type CallParameters, call } from './call.js'\n\nexport type ReadContractParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'pure' | 'view'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'pure' | 'view',\n functionName\n > = ContractFunctionArgs,\n> = UnionEvaluate<\n Pick<\n CallParameters,\n | 'account'\n | 'authorizationList'\n | 'blockNumber'\n | 'blockOverrides'\n | 'blockTag'\n | 'factory'\n | 'factoryData'\n | 'stateOverride'\n >\n> &\n ContractFunctionParameters\n\nexport type ReadContractReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'pure' | 'view'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'pure' | 'view',\n functionName\n > = ContractFunctionArgs,\n> = ContractFunctionReturnType\n\nexport type ReadContractErrorType = GetContractErrorReturnType<\n CallErrorType | EncodeFunctionDataErrorType | DecodeFunctionResultErrorType\n>\n\n/**\n * Calls a read-only function on a contract, and returns the response.\n *\n * - Docs: https://viem.sh/docs/contract/readContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_reading-contracts\n *\n * A \"read-only\" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link ReadContractParameters}\n * @returns The response from the contract. Type is inferred. {@link ReadContractReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { readContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await readContract(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // 424122n\n */\nexport async function readContract<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs,\n>(\n client: Client,\n parameters: ReadContractParameters,\n): Promise> {\n const { abi, address, args, functionName, ...rest } =\n parameters as ReadContractParameters\n const calldata = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n try {\n const { data } = await getAction(\n client,\n call,\n 'call',\n )({\n ...(rest as CallParameters),\n data: calldata,\n to: address!,\n })\n return decodeFunctionResult({\n abi,\n args,\n functionName,\n data: data || '0x',\n }) as ReadContractReturnType\n } catch (error) {\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/readContract',\n functionName,\n })\n }\n}\n","import type { Abi, AbiFunction, AbiStateMutability, Address } from 'abitype'\n\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account, ParseAccount } from '../../types/account.js'\nimport type { Chain, DeriveChain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n ExtractAbiFunctionForArgs,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type {\n IsNarrowable,\n NoInfer,\n Prettify,\n UnionEvaluate,\n UnionOmit,\n} from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { WriteContractParameters } from '../wallet/writeContract.js'\nimport { type CallErrorType, type CallParameters, call } from './call.js'\n\nexport type GetMutabilityAwareValue<\n abi extends Abi | readonly unknown[],\n mutability extends AbiStateMutability = AbiStateMutability,\n functionName extends ContractFunctionName<\n abi,\n mutability\n > = ContractFunctionName,\n valueType = TransactionRequest['value'],\n args extends ContractFunctionArgs<\n abi,\n mutability,\n functionName\n > = ContractFunctionArgs,\n abiFunction extends AbiFunction = abi extends Abi\n ? ExtractAbiFunctionForArgs\n : AbiFunction,\n _Narrowable extends boolean = IsNarrowable,\n> = _Narrowable extends true\n ? abiFunction['stateMutability'] extends 'payable'\n ? { value?: NoInfer | undefined }\n : abiFunction['payable'] extends true\n ? { value?: NoInfer | undefined }\n : { value?: undefined }\n : { value?: NoInfer | undefined }\n\nexport type SimulateContractParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs,\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | null | undefined = undefined,\n ///\n derivedChain extends Chain | undefined = DeriveChain,\n callParameters extends\n CallParameters = CallParameters,\n> = {\n account?: accountOverride | null | undefined\n chain?: chainOverride | undefined\n /** Data to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f). */\n dataSuffix?: Hex | undefined\n} & ContractFunctionParameters<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n args\n> &\n UnionOmit<\n callParameters,\n | 'account'\n | 'batch'\n | 'code'\n | 'to'\n | 'data'\n | 'factory'\n | 'factoryData'\n | 'value'\n > &\n GetMutabilityAwareValue<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n callParameters['value'],\n args\n >\n\nexport type SimulateContractReturnType<\n out abi extends Abi | readonly unknown[] = Abi,\n in out functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName,\n in out args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs,\n /** @ts-expect-error cast variance */\n out chain extends Chain | undefined = Chain | undefined,\n out account extends Account | undefined = Account | undefined,\n out chainOverride extends Chain | undefined = Chain | undefined,\n out accountOverride extends Account | Address | null | undefined =\n | Account\n | Address\n | null\n | undefined,\n ///\n in out minimizedAbi extends Abi = readonly [\n ExtractAbiFunctionForArgs<\n abi extends Abi ? abi : Abi,\n 'nonpayable' | 'payable',\n functionName,\n args\n >,\n ],\n out resolvedAccount extends\n | Account\n | null\n | undefined = accountOverride extends Account | Address | null\n ? ParseAccount\n : account,\n> = {\n result: ContractFunctionReturnType<\n minimizedAbi,\n 'nonpayable' | 'payable',\n functionName,\n args\n >\n request: Prettify<\n UnionEvaluate<\n UnionOmit<\n WriteContractParameters<\n minimizedAbi,\n functionName,\n args,\n chain,\n undefined,\n chainOverride\n >,\n 'account' | 'abi' | 'args' | 'chain' | 'functionName'\n >\n > &\n ContractFunctionParameters<\n minimizedAbi,\n 'nonpayable' | 'payable',\n functionName,\n args\n > & {\n chain: DeriveChain\n } & (resolvedAccount extends Account | null\n ? { account: resolvedAccount }\n : { account?: undefined })\n >\n}\n\nexport type SimulateContractErrorType =\n | ParseAccountErrorType\n | EncodeFunctionDataErrorType\n | GetContractErrorReturnType\n | ErrorType\n\n/**\n * Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions.\n *\n * - Docs: https://viem.sh/docs/contract/simulateContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_writing-to-contracts\n *\n * This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract), but also supports contract write functions.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link SimulateContractParameters}\n * @returns The simulation result and write request. {@link SimulateContractReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { simulateContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await simulateContract(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint(uint32) view returns (uint32)']),\n * functionName: 'mint',\n * args: ['69420'],\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function simulateContract<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | null | undefined = undefined,\n>(\n client: Client,\n parameters: SimulateContractParameters<\n abi,\n functionName,\n args,\n chain,\n chainOverride,\n accountOverride\n >,\n): Promise<\n SimulateContractReturnType<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride,\n accountOverride\n >\n> {\n const {\n abi,\n address,\n args,\n functionName,\n dataSuffix = typeof client.dataSuffix === 'string'\n ? client.dataSuffix\n : client.dataSuffix?.value,\n ...callRequest\n } = parameters as SimulateContractParameters\n\n const account = callRequest.account\n ? parseAccount(callRequest.account)\n : client.account\n const calldata = encodeFunctionData({ abi, args, functionName })\n\n try {\n const { data } = await getAction(\n client,\n call,\n 'call',\n )({\n batch: false,\n data: `${calldata}${dataSuffix ? dataSuffix.replace('0x', '') : ''}`,\n to: address,\n ...callRequest,\n account,\n })\n const result = decodeFunctionResult({\n abi,\n args,\n functionName,\n data: data || '0x',\n })\n const minimizedAbi = abi.filter(\n (abiItem) =>\n 'name' in abiItem && abiItem.name === parameters.functionName,\n )\n return {\n result,\n request: {\n abi: minimizedAbi,\n address,\n args,\n dataSuffix,\n functionName,\n ...callRequest,\n account,\n },\n } as unknown as SimulateContractReturnType<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride,\n accountOverride\n >\n } catch (error) {\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/simulateContract',\n functionName,\n sender: account?.address,\n })\n }\n}\n","import type { ErrorType } from '../errors/utils.js'\nimport type { MaybePromise } from '../types/utils.js'\n\ntype Callback = ((...args: any[]) => any) | undefined\ntype Callbacks = Record\n\nexport type ObserveErrorType = ErrorType\n\n/** @internal */\nexport const listenersCache = /*#__PURE__*/ new Map<\n string,\n { id: number; fns: Callbacks }[]\n>()\n/** @internal */\nexport const cleanupCache = /*#__PURE__*/ new Map<\n string,\n () => void | Promise\n>()\n\ntype EmitFunction = (\n emit: callbacks,\n) => MaybePromise void) | (() => Promise)>\n\nlet callbackCount = 0\n\n/**\n * @description Sets up an observer for a given function. If another function\n * is set up under the same observer id, the function will only be called once\n * for both instances of the observer.\n */\nexport function observe(\n observerId: string,\n callbacks: callbacks,\n fn: EmitFunction,\n) {\n const callbackId = ++callbackCount\n\n const getListeners = () => listenersCache.get(observerId) || []\n\n const unsubscribe = () => {\n const listeners = getListeners()\n listenersCache.set(\n observerId,\n listeners.filter((cb: any) => cb.id !== callbackId),\n )\n }\n\n const unwatch = () => {\n const listeners = getListeners()\n if (!listeners.some((cb: any) => cb.id === callbackId)) return\n const cleanup = cleanupCache.get(observerId)\n if (listeners.length === 1 && cleanup) {\n const p = cleanup()\n if (p instanceof Promise) p.catch(() => {})\n }\n unsubscribe()\n }\n\n const listeners = getListeners()\n listenersCache.set(observerId, [\n ...listeners,\n { id: callbackId, fns: callbacks },\n ])\n\n if (listeners && listeners.length > 0) return unwatch\n\n const emit: callbacks = {} as callbacks\n for (const key in callbacks) {\n emit[key] = ((\n ...args: Parameters>\n ) => {\n const listeners = getListeners()\n if (listeners.length === 0) return\n for (const listener of listeners) listener.fns[key]?.(...args)\n }) as callbacks[Extract]\n }\n\n const cleanup = fn(emit)\n if (typeof cleanup === 'function') cleanupCache.set(observerId, cleanup)\n\n return unwatch\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time))\n}\n","import type { ErrorType } from '../errors/utils.js'\nimport { wait } from './wait.js'\n\ntype PollOptions = {\n // Whether or not to emit when the polling starts.\n emitOnBegin?: boolean | undefined\n // The initial wait time (in ms) before polling.\n initialWaitTime?: ((data: data | void) => Promise) | undefined\n // The interval (in ms).\n interval: number\n}\n\nexport type PollErrorType = ErrorType\n\n/**\n * @description Polls a function at a specified interval.\n */\nexport function poll(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise,\n { emitOnBegin, initialWaitTime, interval }: PollOptions,\n) {\n let active = true\n\n const unwatch = () => (active = false)\n\n const watch = async () => {\n let data: data | undefined | void\n if (emitOnBegin) data = await fn({ unpoll: unwatch })\n\n const initialWait = (await initialWaitTime?.(data)) ?? interval\n await wait(initialWait)\n\n const poll = async () => {\n if (!active) return\n await fn({ unpoll: unwatch })\n await wait(interval)\n poll()\n }\n\n poll()\n }\n watch()\n\n return unwatch\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\n/** @internal */\nexport const promiseCache = /*#__PURE__*/ new Map()\n/** @internal */\nexport const responseCache = /*#__PURE__*/ new Map()\n\nexport type GetCacheErrorType = ErrorType\n\nexport function getCache(cacheKey: string) {\n const buildCache = (cacheKey: string, cache: Map) => ({\n clear: () => cache.delete(cacheKey),\n get: () => cache.get(cacheKey),\n set: (data: data) => cache.set(cacheKey, data),\n })\n\n const promise = buildCache>(cacheKey, promiseCache)\n const response = buildCache<{ created: Date; data: data }>(\n cacheKey,\n responseCache,\n )\n\n return {\n clear: () => {\n promise.clear()\n response.clear()\n },\n promise,\n response,\n }\n}\n\ntype WithCacheParameters = {\n /** The key to cache the data against. */\n cacheKey: string\n /** The time that cached data will remain in memory. Default: Infinity (no expiry) */\n cacheTime?: number | undefined\n}\n\n/**\n * @description Returns the result of a given promise, and caches the result for\n * subsequent invocations against a provided cache key.\n */\nexport async function withCache(\n fn: () => Promise,\n { cacheKey, cacheTime = Number.POSITIVE_INFINITY }: WithCacheParameters,\n) {\n const cache = getCache(cacheKey)\n\n // If a response exists in the cache, and it's not expired, return it\n // and do not invoke the promise.\n // If the max age is 0, the cache is disabled.\n const response = cache.response.get()\n if (response && cacheTime > 0) {\n const age = Date.now() - response.created.getTime()\n if (age < cacheTime) return response.data\n }\n\n let promise = cache.promise.get()\n if (!promise) {\n promise = fn()\n\n // Store the promise in the cache so that subsequent invocations\n // will wait for the same promise to resolve (deduping).\n cache.promise.set(promise)\n }\n\n try {\n const data = await promise\n\n // Store the response in the cache so that subsequent invocations\n // will return the same response.\n cache.response.set({ created: new Date(), data })\n\n return data\n } finally {\n // Clear the promise cache so that subsequent invocations will\n // invoke the promise again.\n cache.promise.clear()\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type GetCacheErrorType,\n getCache,\n withCache,\n} from '../../utils/promise/withCache.js'\n\nexport type GetBlockNumberParameters = {\n /** Time (in ms) that cached block number will remain in memory. */\n cacheTime?: number | undefined\n}\n\nexport type GetBlockNumberReturnType = bigint\n\nexport type GetBlockNumberErrorType = RequestErrorType | ErrorType\n\nconst cacheKey = (id: string) => `blockNumber.${id}`\n\n/** @internal */\nexport type GetBlockNumberCacheErrorType = GetCacheErrorType | ErrorType\n\n/** @internal */\nexport function getBlockNumberCache(id: string) {\n return getCache(cacheKey(id))\n}\n\n/**\n * Returns the number of the most recent block seen.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber)\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockNumberParameters}\n * @returns The number of the block. {@link GetBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlockNumber } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blockNumber = await getBlockNumber(client)\n * // 69420n\n */\nexport async function getBlockNumber(\n client: Client,\n { cacheTime = client.cacheTime }: GetBlockNumberParameters = {},\n): Promise {\n const blockNumberHex = await withCache(\n () =>\n client.request({\n method: 'eth_blockNumber',\n }),\n { cacheKey: cacheKey(client.uid), cacheTime },\n )\n return BigInt(blockNumberHex)\n}\n","import type { Abi, AbiEvent, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { RpcLog } from '../../index.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter, FilterType } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetFilterChangesParameters<\n filterType extends FilterType = FilterType,\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n filter: Filter\n}\n\nexport type GetFilterChangesReturnType<\n filterType extends FilterType = FilterType,\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _AbiEvent extends AbiEvent | undefined = abi extends Abi\n ? eventName extends string\n ? ExtractAbiEvent\n : undefined\n : undefined,\n _Pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = filterType extends 'event'\n ? Log[]\n : Hash[]\n\nexport type GetFilterChangesErrorType =\n | RequestErrorType\n | DecodeEventLogErrorType\n | FormatLogErrorType\n | ErrorType\n\n/**\n * Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterChanges\n * - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges)\n *\n * A Filter can be created from the following actions:\n *\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * Depending on the type of filter, the return value will be different:\n *\n * - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs.\n * - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes.\n * - If the filter was created with `createBlockFilter`, it returns a list of block hashes.\n *\n * @param client - Client to use\n * @param parameters - {@link GetFilterChangesParameters}\n * @returns Logs or hashes. {@link GetFilterChangesReturnType}\n *\n * @example\n * // Blocks\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createBlockFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createBlockFilter(client)\n * const hashes = await getFilterChanges(client, { filter })\n *\n * @example\n * // Contract Events\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createContractEventFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createContractEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * eventName: 'Transfer',\n * })\n * const logs = await getFilterChanges(client, { filter })\n *\n * @example\n * // Raw Events\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createEventFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await getFilterChanges(client, { filter })\n *\n * @example\n * // Transactions\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createPendingTransactionFilter(client)\n * const hashes = await getFilterChanges(client, { filter })\n */\nexport async function getFilterChanges<\n transport extends Transport,\n chain extends Chain | undefined,\n filterType extends FilterType,\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n _client: Client,\n {\n filter,\n }: GetFilterChangesParameters<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n> {\n const strict = 'strict' in filter && filter.strict\n\n const logs = await filter.request({\n method: 'eth_getFilterChanges',\n params: [filter.id],\n })\n\n if (typeof logs[0] === 'string')\n return logs as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n\n const formattedLogs = logs.map((log) => formatLog(log as RpcLog))\n if (!('abi' in filter) || !filter.abi)\n return formattedLogs as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: filter.abi,\n logs: formattedLogs,\n strict,\n }) as unknown as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type UninstallFilterParameters = {\n filter: Filter\n}\nexport type UninstallFilterReturnType = boolean\n\nexport type UninstallFilterErrorType = RequestErrorType | ErrorType\n\n/**\n * Destroys a [`Filter`](https://viem.sh/docs/glossary/types#filter).\n *\n * - Docs: https://viem.sh/docs/actions/public/uninstallFilter\n * - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter)\n *\n * Destroys a Filter that was created from one of the following Actions:\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * @param client - Client to use\n * @param parameters - {@link UninstallFilterParameters}\n * @returns A boolean indicating if the Filter was successfully uninstalled. {@link UninstallFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, uninstallFilter } from 'viem/public'\n *\n * const filter = await createPendingTransactionFilter(client)\n * const uninstalled = await uninstallFilter(client, { filter })\n * // true\n */\nexport async function uninstallFilter<\n transport extends Transport,\n chain extends Chain | undefined,\n>(\n _client: Client,\n { filter }: UninstallFilterParameters,\n): Promise {\n return filter.request({\n method: 'eth_uninstallFilter',\n params: [filter.id],\n })\n}\n","import type { Abi, Address, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n} from '../../errors/abi.js'\nimport { InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { LogTopic } from '../../types/misc.js'\nimport type { GetPollOptions } from '../../types/transport.js'\nimport { decodeEventLog } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { formatLog } from '../../utils/formatters/log.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\nimport { createContractEventFilter } from './createContractEventFilter.js'\nimport { getBlockNumber } from './getBlockNumber.js'\nimport {\n type GetContractEventsParameters,\n getContractEvents,\n} from './getContractEvents.js'\nimport { getFilterChanges } from './getFilterChanges.js'\nimport { uninstallFilter } from './uninstallFilter.js'\n\nexport type WatchContractEventOnLogsParameter<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName = ContractEventName,\n strict extends boolean | undefined = undefined,\n> = abi extends Abi\n ? Abi extends abi\n ? Log[]\n : Log, strict>[]\n : Log[]\n\nexport type WatchContractEventOnLogsFn<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName = ContractEventName,\n strict extends boolean | undefined = undefined,\n> = (logs: WatchContractEventOnLogsParameter) => void\n\nexport type WatchContractEventParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName | undefined = ContractEventName,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Contract ABI. */\n abi: abi\n args?:\n | ContractEventArgs<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName\n >\n | undefined\n /** Contract event. */\n eventName?: eventName | ContractEventName | undefined\n /** Block to start listening from. */\n fromBlock?: BlockNumber | undefined\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n /** The callback to call when new event logs are received. */\n onLogs: WatchContractEventOnLogsFn<\n abi,\n eventName extends ContractEventName\n ? eventName\n : ContractEventName,\n strict\n >\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | boolean | undefined\n} & GetPollOptions\n\nexport type WatchContractEventReturnType = () => void\n\nexport type WatchContractEventErrorType =\n | StringifyErrorType\n | ObserveErrorType\n | ErrorType\n\n/**\n * Watches and returns emitted contract event logs.\n *\n * - Docs: https://viem.sh/docs/contract/watchContractEvent\n *\n * This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent#onLogs).\n *\n * `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchContractEventParameters}\n * @returns A function that can be invoked to stop watching for new event logs. {@link WatchContractEventReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { watchContractEvent } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchContractEvent(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']),\n * eventName: 'Transfer',\n * args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' },\n * onLogs: (logs) => console.log(logs),\n * })\n */\nexport function watchContractEvent<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n>(\n client: Client,\n parameters: WatchContractEventParameters,\n): WatchContractEventReturnType {\n const {\n abi,\n address,\n args,\n batch = true,\n eventName,\n fromBlock,\n onError,\n onLogs,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n strict: strict_,\n } = parameters\n\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (typeof fromBlock === 'bigint') return true\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n\n const pollContractEvent = () => {\n const strict = strict_ ?? false\n const observerId = stringify([\n 'watchContractEvent',\n address,\n args,\n batch,\n client.uid,\n eventName,\n pollingInterval,\n strict,\n fromBlock,\n ])\n\n return observe(observerId, { onLogs, onError }, (emit) => {\n let previousBlockNumber: bigint\n if (fromBlock !== undefined) previousBlockNumber = fromBlock - 1n\n let filter: Filter<'event', abi, eventName> | undefined\n let initialized = false\n\n const unwatch = poll(\n async () => {\n if (!initialized) {\n try {\n filter = (await getAction(\n client,\n createContractEventFilter,\n 'createContractEventFilter',\n )({\n abi,\n address,\n args: args as any,\n eventName: eventName as any,\n strict: strict as any,\n fromBlock,\n })) as Filter<'event', abi, eventName>\n } catch {}\n initialized = true\n return\n }\n\n try {\n let logs: Log[]\n if (filter) {\n logs = await getAction(\n client,\n getFilterChanges,\n 'getFilterChanges',\n )({ filter })\n } else {\n // If the filter doesn't exist, we will fall back to use `getLogs`.\n // The fall back exists because some RPC Providers do not support filters.\n\n // Fetch the block number to use for `getLogs`.\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({})\n\n // If the block number has changed, we will need to fetch the logs.\n // If the block number doesn't exist, we are yet to reach the first poll interval,\n // so do not emit any logs.\n if (previousBlockNumber && previousBlockNumber < blockNumber) {\n logs = await getAction(\n client,\n getContractEvents,\n 'getContractEvents',\n )({\n abi,\n address,\n args,\n eventName,\n fromBlock: previousBlockNumber + 1n,\n toBlock: blockNumber,\n strict,\n } as {} as GetContractEventsParameters)\n } else {\n logs = []\n }\n previousBlockNumber = blockNumber\n }\n\n if (logs.length === 0) return\n if (batch) emit.onLogs(logs as any)\n else for (const log of logs) emit.onLogs([log] as any)\n } catch (err) {\n // If a filter has been set and gets uninstalled, providers will throw an InvalidInput error.\n // Reinitialize the filter when this occurs\n if (filter && err instanceof InvalidInputRpcError)\n initialized = false\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin: true,\n interval: pollingInterval,\n },\n )\n\n return async () => {\n if (filter)\n await getAction(\n client,\n uninstallFilter,\n 'uninstallFilter',\n )({ filter })\n unwatch()\n }\n })\n }\n\n const subscribeContractEvent = () => {\n const strict = strict_ ?? false\n const observerId = stringify([\n 'watchContractEvent',\n address,\n args,\n batch,\n client.uid,\n eventName,\n pollingInterval,\n strict,\n ])\n\n let active = true\n let unsubscribe = () => (active = false)\n return observe(observerId, { onLogs, onError }, (emit) => {\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const topics: LogTopic[] = eventName\n ? encodeEventTopics({\n abi: abi,\n eventName: eventName,\n args,\n } as EncodeEventTopicsParameters)\n : []\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['logs', { address, topics }],\n onData(data: any) {\n if (!active) return\n const log = data.result\n try {\n const { eventName, args } = decodeEventLog({\n abi: abi,\n data: log.data,\n topics: log.topics as any,\n strict: strict_,\n })\n const formatted = formatLog(log, {\n args,\n eventName: eventName as string,\n })\n emit.onLogs([formatted] as any)\n } catch (err) {\n let eventName: string | undefined\n let isUnnamed: boolean | undefined\n if (\n err instanceof DecodeLogDataMismatch ||\n err instanceof DecodeLogTopicsMismatch\n ) {\n // If strict mode is on, and log data/topics do not match event definition, skip.\n if (strict_) return\n eventName = err.abiItem.name\n isUnnamed = err.abiItem.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n }\n\n // Set args to empty if there is an error decoding (e.g. indexed/non-indexed params mismatch).\n const formatted = formatLog(log, {\n args: isUnnamed ? [] : {},\n eventName,\n })\n emit.onLogs([formatted] as any)\n }\n },\n onError(error: Error) {\n emit.onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n })\n }\n\n return enablePolling ? pollContractEvent() : subscribeContractEvent()\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { TransactionSerializedGeneric } from '../../types/transaction.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type SendRawTransactionParameters = {\n /** The signed serialized transaction. */\n serializedTransaction: TransactionSerializedGeneric\n}\n\nexport type SendRawTransactionReturnType = Hash\n\nexport type SendRawTransactionErrorType = RequestErrorType | ErrorType\n\n/**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction\n * - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction hash. {@link SendRawTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const hash = await sendRawTransaction(client, {\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\nexport async function sendRawTransaction(\n client: Client,\n { serializedTransaction }: SendRawTransactionParameters,\n): Promise {\n return client.request(\n {\n method: 'eth_sendRawTransaction',\n params: [serializedTransaction],\n },\n { retryCount: 0 },\n )\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport { wait } from '../wait.js'\n\nexport type WithRetryParameters = {\n // The delay (in ms) between retries.\n delay?:\n | ((config: { count: number; error: Error }) => number)\n | number\n | undefined\n // The max number of times to retry.\n retryCount?: number | undefined\n // Whether or not to retry when an error is thrown.\n shouldRetry?:\n | (({\n count,\n error,\n }: {\n count: number\n error: Error\n }) => Promise | boolean)\n | undefined\n}\n\nexport type WithRetryErrorType = ErrorType\n\nexport function withRetry(\n fn: () => Promise,\n {\n delay: delay_ = 100,\n retryCount = 2,\n shouldRetry = () => true,\n }: WithRetryParameters = {},\n) {\n return new Promise((resolve, reject) => {\n const attemptRetry = async ({ count = 0 } = {}) => {\n const retry = async ({ error }: { error: Error }) => {\n const delay =\n typeof delay_ === 'function' ? delay_({ count, error }) : delay_\n if (delay) await wait(delay)\n attemptRetry({ count: count + 1 })\n }\n\n try {\n const data = await fn()\n resolve(data)\n } catch (err) {\n if (\n count < retryCount &&\n (await shouldRetry({ count, error: err as Error }))\n )\n return retry({ error: err as Error })\n reject(err)\n }\n }\n attemptRetry()\n })\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n Chain,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { RpcTransactionReceipt } from '../../types/rpc.js'\nimport type { TransactionReceipt } from '../../types/transaction.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\n\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\nimport { formatLog } from './log.js'\nimport { transactionType } from './transaction.js'\n\nexport type FormattedTransactionReceipt<\n chain extends Chain | undefined = undefined,\n> = ExtractChainFormatterReturnType<\n chain,\n 'transactionReceipt',\n TransactionReceipt\n>\n\nexport const receiptStatuses = {\n '0x0': 'reverted',\n '0x1': 'success',\n} as const\n\nexport type FormatTransactionReceiptErrorType = ErrorType\n\nexport function formatTransactionReceipt(\n transactionReceipt: ExactPartial,\n _?: string | undefined,\n) {\n const receipt = {\n ...transactionReceipt,\n blockNumber: transactionReceipt.blockNumber\n ? BigInt(transactionReceipt.blockNumber)\n : null,\n contractAddress: transactionReceipt.contractAddress\n ? transactionReceipt.contractAddress\n : null,\n cumulativeGasUsed: transactionReceipt.cumulativeGasUsed\n ? BigInt(transactionReceipt.cumulativeGasUsed)\n : null,\n effectiveGasPrice: transactionReceipt.effectiveGasPrice\n ? BigInt(transactionReceipt.effectiveGasPrice)\n : null,\n gasUsed: transactionReceipt.gasUsed\n ? BigInt(transactionReceipt.gasUsed)\n : null,\n logs: transactionReceipt.logs\n ? transactionReceipt.logs.map((log) => formatLog(log))\n : null,\n to: transactionReceipt.to ? transactionReceipt.to : null,\n transactionIndex: transactionReceipt.transactionIndex\n ? hexToNumber(transactionReceipt.transactionIndex)\n : null,\n status: transactionReceipt.status\n ? receiptStatuses[transactionReceipt.status]\n : null,\n type: transactionReceipt.type\n ? transactionType[\n transactionReceipt.type as keyof typeof transactionType\n ] || transactionReceipt.type\n : null,\n } as TransactionReceipt\n\n if (transactionReceipt.blobGasPrice)\n receipt.blobGasPrice = BigInt(transactionReceipt.blobGasPrice)\n if (transactionReceipt.blobGasUsed)\n receipt.blobGasUsed = BigInt(transactionReceipt.blobGasUsed)\n\n return receipt\n}\n\nexport type DefineTransactionReceiptErrorType =\n | DefineFormatterErrorType\n | ErrorType\n\nexport const defineTransactionReceipt = /*#__PURE__*/ defineFormatter(\n 'transactionReceipt',\n formatTransactionReceipt,\n)\n","const size = 256\nlet index = size\nlet buffer: string\n\nexport function uid(length = 11) {\n if (!buffer || index + length > size * 2) {\n buffer = ''\n index = 0\n for (let i = 0; i < size; i++) {\n buffer += ((256 + Math.random() * 256) | 0).toString(16).substring(1)\n }\n }\n return buffer.substring(index, index++ + length)\n}\n","import type { Address } from 'abitype'\n\nimport type { JsonRpcAccount } from '../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../accounts/utils/parseAccount.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Account } from '../types/account.js'\nimport type { BlockTag } from '../types/block.js'\nimport type { Chain } from '../types/chain.js'\nimport type { DataSuffix } from '../types/dataSuffix.js'\nimport type {\n EIP1193RequestFn,\n EIP1474Methods,\n RpcSchema,\n} from '../types/eip1193.js'\nimport type { ExactPartial, Prettify } from '../types/utils.js'\nimport type {\n CcipRequestParameters,\n CcipRequestReturnType,\n} from '../utils/ccip.js'\nimport { uid } from '../utils/uid.js'\nimport type { PublicActions } from './decorators/public.js'\nimport type { WalletActions } from './decorators/wallet.js'\nimport type { Transport } from './transports/createTransport.js'\n\nexport type ClientConfig<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n accountOrAddress extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = {\n /** The Account to use for the Client. This will be used for Actions that require an account as an argument. */\n account?: accountOrAddress | Account | Address | undefined\n /** Flags for batch settings. */\n batch?:\n | {\n /** Toggle to enable `eth_call` multicall aggregation. */\n multicall?: boolean | Prettify | undefined\n }\n | undefined\n /**\n * Default block tag to use for RPC requests.\n *\n * If the chain supports a pre-confirmation mechanism\n * (set via `chain.experimental_preconfirmationTime`), defaults to `'pending'`.\n *\n * @default 'latest'\n */\n experimental_blockTag?: BlockTag | undefined\n /**\n * Time (in ms) that cached data will remain in memory.\n * @default chain.blockTime / 3\n */\n cacheTime?: number | undefined\n /**\n * [CCIP Read](https://eips.ethereum.org/EIPS/eip-3668) configuration.\n * If `false`, the client will not support offchain CCIP lookups.\n */\n ccipRead?:\n | {\n /**\n * A function that will be called to make the offchain CCIP lookup request.\n * @see https://eips.ethereum.org/EIPS/eip-3668#client-lookup-protocol\n */\n request?: (\n parameters: CcipRequestParameters,\n ) => Promise\n }\n | false\n | undefined\n /** Chain for the client. */\n chain?: Chain | undefined | chain\n /** Data suffix to append to transaction data. */\n dataSuffix?: DataSuffix | undefined\n /** A key for the client. */\n key?: string | undefined\n /** A name for the client. */\n name?: string | undefined\n /**\n * Frequency (in ms) for polling enabled actions & events.\n * @default chain.blockTime / 3\n */\n pollingInterval?: number | undefined\n /**\n * Typed JSON-RPC schema for the client.\n */\n rpcSchema?: rpcSchema | undefined\n /** The RPC transport */\n transport: transport\n /** The type of client. */\n type?: string | undefined\n}\n\n// Actions that are used internally by other Actions (ie. `call` is used by `readContract`).\n// They are allowed to be extended, but must conform to their parameter & return type interfaces.\n// Example: an extended `call` action must accept `CallParameters` as parameters,\n// and conform to the `CallReturnType` return type.\ntype ExtendableProtectedActions<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n> = Pick<\n PublicActions,\n | 'call'\n | 'createContractEventFilter'\n | 'createEventFilter'\n | 'estimateContractGas'\n | 'estimateGas'\n | 'getBlock'\n | 'getBlockNumber'\n | 'getChainId'\n | 'getContractEvents'\n | 'getEnsText'\n | 'getFilterChanges'\n | 'getGasPrice'\n | 'getLogs'\n | 'getTransaction'\n | 'getTransactionCount'\n | 'getTransactionReceipt'\n | 'prepareTransactionRequest'\n | 'readContract'\n | 'sendRawTransaction'\n | 'simulateContract'\n | 'uninstallFilter'\n | 'watchBlockNumber'\n | 'watchContractEvent'\n> &\n Pick, 'sendTransaction' | 'writeContract'>\n\n// TODO: Move `transport` to slot index 2 since `chain` and `account` used more frequently.\n// Otherwise, we end up with a lot of `Client` in actions.\nexport type Client<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n extended extends Extended | undefined = Extended | undefined,\n> = Client_Base &\n (extended extends Extended ? extended : unknown) & {\n extend: <\n const client extends Extended &\n ExactPartial>,\n >(\n fn: (\n client: Client,\n ) => client,\n ) => Client<\n transport,\n chain,\n account,\n rpcSchema,\n Prettify & (extended extends Extended ? extended : unknown)\n >\n }\n\ntype Client_Base<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = {\n /** The Account of the Client. */\n account: account\n /** Flags for batch settings. */\n batch?: ClientConfig['batch'] | undefined\n /** Time (in ms) that cached data will remain in memory. */\n cacheTime: number\n /** [CCIP Read](https://eips.ethereum.org/EIPS/eip-3668) configuration. */\n ccipRead?: ClientConfig['ccipRead'] | undefined\n /** Chain for the client. */\n chain: chain\n /** Data suffix to append to transaction data. */\n dataSuffix?: DataSuffix | undefined\n /** Default block tag to use for RPC requests. */\n experimental_blockTag?: BlockTag | undefined\n /** A key for the client. */\n key: string\n /** A name for the client. */\n name: string\n /** Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. */\n pollingInterval: number\n /** Request function wrapped with friendly error handling */\n request: EIP1193RequestFn<\n rpcSchema extends undefined ? EIP1474Methods : rpcSchema\n >\n /** The RPC transport */\n transport: ReturnType['config'] & ReturnType['value']\n /** The type of client. */\n type: string\n /** A unique ID for the client. */\n uid: string\n}\n\ntype Extended = Prettify<\n // disallow redefining base properties\n { [_ in keyof Client_Base]?: undefined } & {\n [key: string]: unknown\n }\n>\n\nexport type MulticallBatchOptions = {\n /** The maximum size (in bytes) for each calldata chunk. @default 1_024 */\n batchSize?: number | undefined\n /** Enable deployless multicall. */\n deployless?: boolean | undefined\n /** The maximum number of milliseconds to wait before sending a batch. @default 0 */\n wait?: number | undefined\n}\n\nexport type CreateClientErrorType = ParseAccountErrorType | ErrorType\n\nexport function createClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n accountOrAddress extends Account | Address | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n parameters: ClientConfig,\n): Prettify<\n Client<\n transport,\n chain,\n accountOrAddress extends Address\n ? Prettify>\n : accountOrAddress,\n rpcSchema\n >\n>\n\nexport function createClient(parameters: ClientConfig): Client {\n const {\n batch,\n chain,\n ccipRead,\n dataSuffix,\n key = 'base',\n name = 'Base Client',\n type = 'base',\n } = parameters\n\n const experimental_blockTag =\n parameters.experimental_blockTag ??\n (typeof chain?.experimental_preconfirmationTime === 'number'\n ? 'pending'\n : undefined)\n const blockTime = chain?.blockTime ?? 12_000\n\n const defaultPollingInterval = Math.min(\n Math.max(Math.floor(blockTime / 2), 500),\n 4_000,\n )\n const pollingInterval = parameters.pollingInterval ?? defaultPollingInterval\n const cacheTime = parameters.cacheTime ?? pollingInterval\n\n const account = parameters.account\n ? parseAccount(parameters.account)\n : undefined\n const { config, request, value } = parameters.transport({\n account,\n chain,\n pollingInterval,\n })\n const transport = { ...config, ...value }\n\n const client = {\n account,\n batch,\n cacheTime,\n ccipRead,\n chain,\n dataSuffix,\n key,\n name,\n pollingInterval,\n request,\n transport,\n type,\n uid: uid(),\n ...(experimental_blockTag ? { experimental_blockTag } : {}),\n }\n\n function extend(base: typeof client) {\n type ExtendFn = (base: typeof client) => unknown\n return (extendFn: ExtendFn) => {\n const extended = extendFn(base) as Extended\n for (const key in client) delete extended[key]\n const combined = { ...base, ...extended }\n return Object.assign(combined, { extend: extend(combined as any) })\n }\n }\n\n return Object.assign(client, { extend: extend(client) as any })\n}\n\n/**\n * Defines a typed JSON-RPC schema for the client.\n * Note: This is a runtime noop function.\n */\nexport function rpcSchema(): rpcSchema {\n return null as any\n}\n","import { BaseError } from '../../errors/base.js'\nimport { ContractFunctionRevertedError } from '../../errors/contract.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\n/** @internal */\nexport type IsNullUniversalResolverErrorErrorType = ErrorType\n\n/*\n * @description Checks if error is a valid null result UniversalResolver error\n */\nexport function isNullUniversalResolverError(err: unknown): boolean {\n if (!(err instanceof BaseError)) return false\n const cause = err.walk((e) => e instanceof ContractFunctionRevertedError)\n if (!(cause instanceof ContractFunctionRevertedError)) return false\n\n if (cause.data?.errorName === 'HttpError') return true\n if (cause.data?.errorName === 'ResolverError') return true\n if (cause.data?.errorName === 'ResolverNotContract') return true\n if (cause.data?.errorName === 'ResolverNotFound') return true\n if (cause.data?.errorName === 'ReverseAddressMismatch') return true\n if (cause.data?.errorName === 'UnsupportedResolverProfile') return true\n\n return false\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\n\nexport type EncodedLabelToLabelhashErrorType = IsHexErrorType | ErrorType\n\nexport function encodedLabelToLabelhash(label: string): Hex | null {\n if (label.length !== 66) return null\n if (label.indexOf('[') !== 0) return null\n if (label.indexOf(']') !== 65) return null\n const hash = `0x${label.slice(1, 65)}`\n if (!isHex(hash)) return null\n return hash\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray } from '../../types/misc.js'\nimport { type ConcatErrorType, concat } from '../data/concat.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n type ToBytesErrorType,\n toBytes,\n} from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type EncodedLabelToLabelhashErrorType,\n encodedLabelToLabelhash,\n} from './encodedLabelToLabelhash.js'\n\nexport type NamehashErrorType =\n | BytesToHexErrorType\n | EncodedLabelToLabelhashErrorType\n | ToBytesErrorType\n | Keccak256ErrorType\n | StringToBytesErrorType\n | ConcatErrorType\n | ErrorType\n\n/**\n * @description Hashes ENS name\n *\n * - Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `namehash`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @example\n * namehash('wevm.eth')\n * '0x08c85f2f4059e930c45a6aeff9dcd3bd95dc3c5c1cddef6a0626b31152248560'\n *\n * @link https://eips.ethereum.org/EIPS/eip-137\n */\nexport function namehash(name: string) {\n let result = new Uint8Array(32).fill(0) as ByteArray\n if (!name) return bytesToHex(result)\n\n const labels = name.split('.')\n // Iterate in reverse order building up hash\n for (let i = labels.length - 1; i >= 0; i -= 1) {\n const hashFromEncodedLabel = encodedLabelToLabelhash(labels[i])\n const hashed = hashFromEncodedLabel\n ? toBytes(hashFromEncodedLabel)\n : keccak256(stringToBytes(labels[i]), 'bytes')\n result = keccak256(concat([result, hashed]), 'bytes')\n }\n\n return bytesToHex(result)\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\n\nexport type EncodeLabelhashErrorType = ErrorType\n\nexport function encodeLabelhash(hash: Hex): `[${string}]` {\n return `[${hash.slice(2)}]`\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n} from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type EncodedLabelToLabelhashErrorType,\n encodedLabelToLabelhash,\n} from './encodedLabelToLabelhash.js'\n\nexport type LabelhashErrorType =\n | BytesToHexErrorType\n | EncodedLabelToLabelhashErrorType\n | Keccak256ErrorType\n | StringToBytesErrorType\n | ErrorType\n\n/**\n * @description Hashes ENS label\n *\n * - Since ENS labels prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS labels](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `labelhash`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @example\n * labelhash('eth')\n * '0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0'\n */\nexport function labelhash(label: string) {\n const result = new Uint8Array(32).fill(0)\n if (!label) return bytesToHex(result)\n return encodedLabelToLabelhash(label) || keccak256(stringToBytes(label))\n}\n","// Adapted from https://github.com/mafintosh/dns-packet\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray } from '../../types/misc.js'\nimport {\n type StringToBytesErrorType,\n stringToBytes,\n} from '../encoding/toBytes.js'\nimport {\n type EncodeLabelhashErrorType,\n encodeLabelhash,\n} from './encodeLabelhash.js'\nimport { type LabelhashErrorType, labelhash } from './labelhash.js'\n\nexport type PacketToBytesErrorType =\n | EncodeLabelhashErrorType\n | LabelhashErrorType\n | StringToBytesErrorType\n | ErrorType\n\n/*\n * @description Encodes a DNS packet into a ByteArray containing a UDP payload.\n *\n * @example\n * packetToBytes('awkweb.eth')\n * '0x0661776b7765620365746800'\n *\n * @see https://docs.ens.domains/resolution/names#dns\n *\n */\nexport function packetToBytes(packet: string): ByteArray {\n // strip leading and trailing `.`\n const value = packet.replace(/^\\.|\\.$/gm, '')\n if (value.length === 0) return new Uint8Array(1)\n\n const bytes = new Uint8Array(stringToBytes(value).byteLength + 2)\n\n let offset = 0\n const list = value.split('.')\n for (let i = 0; i < list.length; i++) {\n let encoded = stringToBytes(list[i])\n // if the length is > 255, make the encoded label value a labelhash\n // this is compatible with the universal resolver\n if (encoded.byteLength > 255)\n encoded = stringToBytes(encodeLabelhash(labelhash(list[i])))\n bytes[offset] = encoded.length\n bytes.set(encoded, offset + 1)\n offset += encoded.length + 1\n }\n\n if (bytes.byteLength !== offset + 1) return bytes.slice(0, offset + 1)\n\n return bytes\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n addressResolverAbi,\n universalResolverResolveAbi,\n} from '../../constants/abis.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { type TrimErrorType, trim } from '../../utils/data/trim.js'\nimport { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js'\nimport { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'\nimport { type NamehashErrorType, namehash } from '../../utils/ens/namehash.js'\nimport {\n type PacketToBytesErrorType,\n packetToBytes,\n} from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsAddressParameters = Prettify<\n Pick & {\n /**\n * ENSIP-9 compliant coinType (chain) to get ENS address for.\n *\n * To get the `coinType` for a chain id, use the `toCoinType` function:\n * ```ts\n * import { toCoinType } from 'viem'\n * import { base } from 'viem/chains'\n *\n * const coinType = toCoinType(base.id)\n * ```\n *\n * @default 60n\n */\n coinType?: bigint | undefined\n /**\n * Universal Resolver gateway URLs to use for resolving CCIP-read requests.\n */\n gatewayUrls?: string[] | undefined\n /**\n * Name to get the address for.\n */\n name: string\n /**\n * Whether or not to throw errors propagated from the ENS Universal Resolver Contract.\n */\n strict?: boolean | undefined\n /**\n * Address of ENS Universal Resolver Contract.\n */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsAddressReturnType = Address | null\n\nexport type GetEnsAddressErrorType =\n | GetChainContractAddressErrorType\n | EncodeFunctionDataErrorType\n | NamehashErrorType\n | ToHexErrorType\n | PacketToBytesErrorType\n | DecodeFunctionResultErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Gets address for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAddress\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsAddressParameters}\n * @returns Address for ENS name or `null` if not found. {@link GetEnsAddressReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsAddress, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAddress = await getEnsAddress(client, {\n * name: normalize('wevm.eth'),\n * })\n * // '0xd2135CfB216b74109775236E36d4b433F1DF507B'\n */\nexport async function getEnsAddress(\n client: Client,\n parameters: GetEnsAddressParameters,\n): Promise {\n const { blockNumber, blockTag, coinType, name, gatewayUrls, strict } =\n parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n const tlds = chain?.ensTlds\n if (tlds && !tlds.some((tld) => name.endsWith(tld))) return null\n\n const args = (() => {\n if (coinType != null) return [namehash(name), BigInt(coinType)] as const\n return [namehash(name)] as const\n })()\n\n try {\n const functionData = encodeFunctionData({\n abi: addressResolverAbi,\n functionName: 'addr',\n args,\n })\n\n const readContractParameters = {\n address: universalResolverAddress,\n abi: universalResolverResolveAbi,\n functionName: 'resolveWithGateways',\n args: [\n toHex(packetToBytes(name)),\n functionData,\n gatewayUrls ?? [localBatchGatewayUrl],\n ],\n blockNumber,\n blockTag,\n } as const\n\n const readContractAction = getAction(client, readContract, 'readContract')\n\n const res = await readContractAction(readContractParameters)\n\n if (res[0] === '0x') return null\n\n const address = decodeFunctionResult({\n abi: addressResolverAbi,\n args,\n functionName: 'addr',\n data: res[0],\n })\n\n if (address === '0x') return null\n if (trim(address) === '0x00') return null\n return address\n } catch (err) {\n if (strict) throw err\n if (isNullUniversalResolverError(err)) return null\n throw err\n }\n}\n","import { BaseError } from './base.js'\n\nexport type EnsAvatarInvalidMetadataErrorType =\n EnsAvatarInvalidMetadataError & {\n name: 'EnsAvatarInvalidMetadataError'\n }\nexport class EnsAvatarInvalidMetadataError extends BaseError {\n constructor({ data }: { data: any }) {\n super(\n 'Unable to extract image from metadata. The metadata may be malformed or invalid.',\n {\n metaMessages: [\n '- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.',\n '',\n `Provided data: ${JSON.stringify(data)}`,\n ],\n name: 'EnsAvatarInvalidMetadataError',\n },\n )\n }\n}\n\nexport type EnsAvatarInvalidNftUriErrorType = EnsAvatarInvalidNftUriError & {\n name: 'EnsAvatarInvalidNftUriError'\n}\nexport class EnsAvatarInvalidNftUriError extends BaseError {\n constructor({ reason }: { reason: string }) {\n super(`ENS NFT avatar URI is invalid. ${reason}`, {\n name: 'EnsAvatarInvalidNftUriError',\n })\n }\n}\n\nexport type EnsAvatarUriResolutionErrorType = EnsAvatarUriResolutionError & {\n name: 'EnsAvatarUriResolutionError'\n}\nexport class EnsAvatarUriResolutionError extends BaseError {\n constructor({ uri }: { uri: string }) {\n super(\n `Unable to resolve ENS avatar URI \"${uri}\". The URI may be malformed, invalid, or does not respond with a valid image.`,\n { name: 'EnsAvatarUriResolutionError' },\n )\n }\n}\n\nexport type EnsAvatarUnsupportedNamespaceErrorType =\n EnsAvatarUnsupportedNamespaceError & {\n name: 'EnsAvatarUnsupportedNamespaceError'\n }\nexport class EnsAvatarUnsupportedNamespaceError extends BaseError {\n constructor({ namespace }: { namespace: string }) {\n super(\n `ENS NFT avatar namespace \"${namespace}\" is not supported. Must be \"erc721\" or \"erc1155\".`,\n { name: 'EnsAvatarUnsupportedNamespaceError' },\n )\n }\n}\n\nexport type EnsInvalidChainIdErrorType = EnsInvalidChainIdError & {\n name: 'EnsInvalidChainIdError'\n}\nexport class EnsInvalidChainIdError extends BaseError {\n constructor({ chainId }: { chainId: number }) {\n super(\n `Invalid ENSIP-11 chainId: ${chainId}. Must be between 0 and 0x7fffffff, or 1.`,\n {\n name: 'EnsInvalidChainIdError',\n },\n )\n }\n}\n","import type { Address } from 'abitype'\n\nimport {\n type ReadContractErrorType,\n readContract,\n} from '../../../actions/public/readContract.js'\nimport type { Client } from '../../../clients/createClient.js'\nimport type { Transport } from '../../../clients/transports/createTransport.js'\nimport {\n EnsAvatarInvalidMetadataError,\n type EnsAvatarInvalidMetadataErrorType,\n EnsAvatarInvalidNftUriError,\n type EnsAvatarInvalidNftUriErrorType,\n EnsAvatarUnsupportedNamespaceError,\n type EnsAvatarUnsupportedNamespaceErrorType,\n EnsAvatarUriResolutionError,\n type EnsAvatarUriResolutionErrorType,\n} from '../../../errors/ens.js'\nimport type { ErrorType } from '../../../errors/utils.js'\nimport type { Chain } from '../../../types/chain.js'\nimport type { AssetGatewayUrls } from '../../../types/ens.js'\n\ntype UriItem = {\n uri: string\n isOnChain: boolean\n isEncoded: boolean\n}\n\nconst networkRegex =\n /(?https?:\\/\\/[^/]*|ipfs:\\/|ipns:\\/|ar:\\/)?(?\\/)?(?ipfs\\/|ipns\\/)?(?[\\w\\-.]+)(?\\/.*)?/\nconst ipfsHashRegex =\n /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\\/(?[\\w\\-.]+))?(?\\/.*)?$/\nconst base64Regex = /^data:([a-zA-Z\\-/+]*);base64,([^\"].*)/\nconst dataURIRegex = /^data:([a-zA-Z\\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/\n\ntype IsImageUriErrorType = ErrorType\n\n/** @internal */\nexport async function isImageUri(uri: string) {\n try {\n const res = await fetch(uri, { method: 'HEAD' })\n // retrieve content type header to check if content is image\n if (res.status === 200) {\n const contentType = res.headers.get('content-type')\n return contentType?.startsWith('image/')\n }\n return false\n } catch (error: any) {\n // if error is not cors related then fail\n if (typeof error === 'object' && typeof error.response !== 'undefined') {\n return false\n }\n // fail in NodeJS, since the error is not cors but any other network issue\n if (!Object.hasOwn(globalThis, 'Image')) return false\n // in case of cors, use image api to validate if given url is an actual image\n return new Promise((resolve) => {\n const img = new Image()\n img.onload = () => {\n resolve(true)\n }\n img.onerror = () => {\n resolve(false)\n }\n img.src = uri\n })\n }\n}\n\ntype GetGatewayErrorType = ErrorType\n\n/** @internal */\nexport function getGateway(custom: string | undefined, defaultGateway: string) {\n if (!custom) return defaultGateway\n if (custom.endsWith('/')) return custom.slice(0, -1)\n return custom\n}\n\nexport type ResolveAvatarUriErrorType =\n | GetGatewayErrorType\n | EnsAvatarUriResolutionErrorType\n | ErrorType\n\nexport function resolveAvatarUri({\n uri,\n gatewayUrls,\n}: {\n uri: string\n gatewayUrls?: AssetGatewayUrls | undefined\n}): UriItem {\n const isEncoded = base64Regex.test(uri)\n if (isEncoded) return { uri, isOnChain: true, isEncoded }\n\n const ipfsGateway = getGateway(gatewayUrls?.ipfs, 'https://ipfs.io')\n const arweaveGateway = getGateway(gatewayUrls?.arweave, 'https://arweave.net')\n\n const networkRegexMatch = uri.match(networkRegex)\n const {\n protocol,\n subpath,\n target,\n subtarget = '',\n } = networkRegexMatch?.groups || {}\n\n const isIPNS = protocol === 'ipns:/' || subpath === 'ipns/'\n const isIPFS =\n protocol === 'ipfs:/' || subpath === 'ipfs/' || ipfsHashRegex.test(uri)\n\n if (uri.startsWith('http') && !isIPNS && !isIPFS) {\n let replacedUri = uri\n if (gatewayUrls?.arweave)\n replacedUri = uri.replace(/https:\\/\\/arweave.net/g, gatewayUrls?.arweave)\n return { uri: replacedUri, isOnChain: false, isEncoded: false }\n }\n\n if ((isIPNS || isIPFS) && target) {\n return {\n uri: `${ipfsGateway}/${isIPNS ? 'ipns' : 'ipfs'}/${target}${subtarget}`,\n isOnChain: false,\n isEncoded: false,\n }\n }\n\n if (protocol === 'ar:/' && target) {\n return {\n uri: `${arweaveGateway}/${target}${subtarget || ''}`,\n isOnChain: false,\n isEncoded: false,\n }\n }\n\n let parsedUri = uri.replace(dataURIRegex, '')\n if (parsedUri.startsWith(' {\n try {\n const res = await fetch(uri).then((res) => res.json())\n const image = await parseAvatarUri({\n gatewayUrls,\n uri: getJsonImage(res),\n })\n return image\n } catch {\n throw new EnsAvatarUriResolutionError({ uri })\n }\n}\n\nexport type ParseAvatarUriErrorType =\n | ResolveAvatarUriErrorType\n | IsImageUriErrorType\n | EnsAvatarUriResolutionErrorType\n | ErrorType\n\nexport async function parseAvatarUri({\n gatewayUrls,\n uri,\n}: {\n gatewayUrls?: AssetGatewayUrls | undefined\n uri: string\n}): Promise {\n const { uri: resolvedURI, isOnChain } = resolveAvatarUri({ uri, gatewayUrls })\n if (isOnChain) return resolvedURI\n\n // check if resolvedURI is an image, if it is return the url\n const isImage = await isImageUri(resolvedURI)\n if (isImage) return resolvedURI\n\n throw new EnsAvatarUriResolutionError({ uri })\n}\n\ntype ParsedNft = {\n chainID: number\n namespace: string\n contractAddress: Address\n tokenID: string\n}\n\nexport type ParseNftUriErrorType = EnsAvatarInvalidNftUriErrorType | ErrorType\n\nexport function parseNftUri(uri_: string): ParsedNft {\n let uri = uri_\n // parse valid nft spec (CAIP-22/CAIP-29)\n // @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs\n if (uri.startsWith('did:nft:')) {\n // convert DID to CAIP\n uri = uri.replace('did:nft:', '').replace(/_/g, '/')\n }\n\n const [reference, asset_namespace, tokenID] = uri.split('/')\n const [eip_namespace, chainID] = reference.split(':')\n const [erc_namespace, contractAddress] = asset_namespace.split(':')\n\n if (!eip_namespace || eip_namespace.toLowerCase() !== 'eip155')\n throw new EnsAvatarInvalidNftUriError({ reason: 'Only EIP-155 supported' })\n if (!chainID)\n throw new EnsAvatarInvalidNftUriError({ reason: 'Chain ID not found' })\n if (!contractAddress)\n throw new EnsAvatarInvalidNftUriError({\n reason: 'Contract address not found',\n })\n if (!tokenID)\n throw new EnsAvatarInvalidNftUriError({ reason: 'Token ID not found' })\n if (!erc_namespace)\n throw new EnsAvatarInvalidNftUriError({ reason: 'ERC namespace not found' })\n\n return {\n chainID: Number.parseInt(chainID, 10),\n namespace: erc_namespace.toLowerCase(),\n contractAddress: contractAddress as Address,\n tokenID,\n }\n}\n\nexport type GetNftTokenUriErrorType =\n | ReadContractErrorType\n | EnsAvatarUnsupportedNamespaceErrorType\n | ErrorType\n\nexport async function getNftTokenUri(\n client: Client,\n { nft }: { nft: ParsedNft },\n) {\n if (nft.namespace === 'erc721') {\n return readContract(client, {\n address: nft.contractAddress,\n abi: [\n {\n name: 'tokenURI',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'tokenId', type: 'uint256' }],\n outputs: [{ name: '', type: 'string' }],\n },\n ],\n functionName: 'tokenURI',\n args: [BigInt(nft.tokenID)],\n })\n }\n if (nft.namespace === 'erc1155') {\n return readContract(client, {\n address: nft.contractAddress,\n abi: [\n {\n name: 'uri',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: '_id', type: 'uint256' }],\n outputs: [{ name: '', type: 'string' }],\n },\n ],\n functionName: 'uri',\n args: [BigInt(nft.tokenID)],\n })\n }\n throw new EnsAvatarUnsupportedNamespaceError({ namespace: nft.namespace })\n}\n","import type { Client } from '../../../clients/createClient.js'\nimport type { Transport } from '../../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../../errors/utils.js'\nimport type { Chain } from '../../../types/chain.js'\nimport type { AssetGatewayUrls } from '../../../types/ens.js'\n\nimport {\n type GetJsonImageErrorType,\n type GetMetadataAvatarUriErrorType,\n type GetNftTokenUriErrorType,\n getJsonImage,\n getMetadataAvatarUri,\n getNftTokenUri,\n type ParseAvatarUriErrorType,\n type ParseNftUriErrorType,\n parseAvatarUri,\n parseNftUri,\n type ResolveAvatarUriErrorType,\n resolveAvatarUri,\n} from './utils.js'\n\nexport type ParseAvatarRecordErrorType =\n | ParseNftAvatarUriErrorType\n | ParseAvatarUriErrorType\n | ErrorType\n\n/*\n * @description Parses an ENS avatar record.\n *\n * @example\n * parseAvatarRecord('eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063')\n * 'https://ipfs.io/ipfs/QmSP4nq9fnN9dAiCj42ug9Wa79rqmQerZXZch82VqpiH7U/image.gif'\n *\n * @see https://docs.ens.domains/web/avatars\n *\n */\nexport async function parseAvatarRecord(\n client: Client,\n {\n gatewayUrls,\n record,\n }: {\n gatewayUrls?: AssetGatewayUrls | undefined\n record: string\n },\n): Promise {\n if (/eip155:/i.test(record))\n return parseNftAvatarUri(client, { gatewayUrls, record })\n return parseAvatarUri({ uri: record, gatewayUrls })\n}\n\ntype ParseNftAvatarUriErrorType =\n | ParseNftUriErrorType\n | GetNftTokenUriErrorType\n | ResolveAvatarUriErrorType\n | ParseAvatarUriErrorType\n | GetJsonImageErrorType\n | GetMetadataAvatarUriErrorType\n | ErrorType\n\nasync function parseNftAvatarUri(\n client: Client,\n {\n gatewayUrls,\n record,\n }: {\n gatewayUrls?: AssetGatewayUrls | undefined\n record: string\n },\n): Promise {\n // parse NFT URI into properties\n const nft = parseNftUri(record)\n // fetch tokenURI from the NFT contract\n const nftUri = await getNftTokenUri(client, { nft })\n // resolve the URI from the fetched tokenURI\n const {\n uri: resolvedNftUri,\n isOnChain,\n isEncoded,\n } = resolveAvatarUri({ uri: nftUri, gatewayUrls })\n\n // if the resolved URI is on chain, return the data\n if (\n isOnChain &&\n (resolvedNftUri.includes('data:application/json;base64,') ||\n resolvedNftUri.startsWith('{'))\n ) {\n const encodedJson = isEncoded\n ? // if it is encoded, decode it\n atob(resolvedNftUri.replace('data:application/json;base64,', ''))\n : // if it isn't encoded assume it is a JSON string, but it could be anything (it will error if it is)\n resolvedNftUri\n\n const decoded = JSON.parse(encodedJson)\n return parseAvatarUri({ uri: getJsonImage(decoded), gatewayUrls })\n }\n\n let uriTokenId = nft.tokenID\n if (nft.namespace === 'erc1155')\n uriTokenId = uriTokenId.replace('0x', '').padStart(64, '0')\n\n return getMetadataAvatarUri({\n gatewayUrls,\n uri: resolvedNftUri.replace(/(?:0x)?{id}/, uriTokenId),\n })\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n textResolverAbi,\n universalResolverResolveAbi,\n} from '../../constants/abis.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js'\nimport { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'\nimport { type NamehashErrorType, namehash } from '../../utils/ens/namehash.js'\nimport {\n type PacketToBytesErrorType,\n packetToBytes,\n} from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractErrorType,\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsTextParameters = Prettify<\n Pick & {\n /** ENS name to get Text for. */\n name: string\n /** Universal Resolver gateway URLs to use for resolving CCIP-read requests. */\n gatewayUrls?: string[] | undefined\n /** Text record to retrieve. */\n key: string\n /** Whether or not to throw errors propagated from the ENS Universal Resolver Contract. */\n strict?: boolean | undefined\n /** Address of ENS Universal Resolver Contract. */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsTextReturnType = string | null\n\nexport type GetEnsTextErrorType =\n | GetChainContractAddressErrorType\n | ReadContractErrorType\n | ToHexErrorType\n | PacketToBytesErrorType\n | EncodeFunctionDataErrorType\n | NamehashErrorType\n | DecodeFunctionResultErrorType\n\n/**\n * Gets a text record for specified ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsTextParameters}\n * @returns Address for ENS resolver. {@link GetEnsTextReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsText, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const twitterRecord = await getEnsText(client, {\n * name: normalize('wevm.eth'),\n * key: 'com.twitter',\n * })\n * // 'wevm_dev'\n */\nexport async function getEnsText(\n client: Client,\n parameters: GetEnsTextParameters,\n): Promise {\n const { blockNumber, blockTag, key, name, gatewayUrls, strict } = parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n const tlds = chain?.ensTlds\n if (tlds && !tlds.some((tld) => name.endsWith(tld))) return null\n\n try {\n const readContractParameters = {\n address: universalResolverAddress,\n abi: universalResolverResolveAbi,\n args: [\n toHex(packetToBytes(name)),\n encodeFunctionData({\n abi: textResolverAbi,\n functionName: 'text',\n args: [namehash(name), key],\n }),\n gatewayUrls ?? [localBatchGatewayUrl],\n ],\n functionName: 'resolveWithGateways',\n blockNumber,\n blockTag,\n } as const\n\n const readContractAction = getAction(client, readContract, 'readContract')\n\n const res = await readContractAction(readContractParameters)\n\n if (res[0] === '0x') return null\n\n const record = decodeFunctionResult({\n abi: textResolverAbi,\n functionName: 'text',\n data: res[0],\n })\n\n return record === '' ? null : record\n } catch (err) {\n if (strict) throw err\n if (isNullUniversalResolverError(err)) return null\n throw err\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { AssetGatewayUrls } from '../../types/ens.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type ParseAvatarRecordErrorType,\n parseAvatarRecord,\n} from '../../utils/ens/avatar/parseAvatarRecord.js'\nimport { getAction } from '../../utils/getAction.js'\n\nimport {\n type GetEnsTextErrorType,\n type GetEnsTextParameters,\n getEnsText,\n} from './getEnsText.js'\n\nexport type GetEnsAvatarParameters = Prettify<\n Omit & {\n /** Gateway urls to resolve IPFS and/or Arweave assets. */\n assetGatewayUrls?: AssetGatewayUrls | undefined\n }\n>\n\nexport type GetEnsAvatarReturnType = string | null\n\nexport type GetEnsAvatarErrorType =\n | GetEnsTextErrorType\n | ParseAvatarRecordErrorType\n | ErrorType\n\n/**\n * Gets the avatar of an ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText) with `key` set to `'avatar'`.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsAvatarParameters}\n * @returns Avatar URI or `null` if not found. {@link GetEnsAvatarReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsAvatar, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAvatar = await getEnsAvatar(client, {\n * name: normalize('wevm.eth'),\n * })\n * // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio'\n */\nexport async function getEnsAvatar(\n client: Client,\n {\n blockNumber,\n blockTag,\n assetGatewayUrls,\n name,\n gatewayUrls,\n strict,\n universalResolverAddress,\n }: GetEnsAvatarParameters,\n): Promise {\n const record = await getAction(\n client,\n getEnsText,\n 'getEnsText',\n )({\n blockNumber,\n blockTag,\n key: 'avatar',\n name,\n universalResolverAddress,\n gatewayUrls,\n strict,\n })\n if (!record) return null\n try {\n return await parseAvatarRecord(client, {\n record,\n gatewayUrls: assetGatewayUrls,\n })\n } catch {\n return null\n }\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { universalResolverReverseAbi } from '../../constants/abis.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js'\nimport { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'\nimport type { PacketToBytesErrorType } from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractErrorType,\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsNameParameters = Prettify<\n Pick & {\n /**\n * Address to get ENS name for.\n */\n address: Address\n /**\n * ENSIP-9 compliant coinType (chain) to get ENS name for.\n *\n * To get the `coinType` for a chain id, use the `toCoinType` function:\n * ```ts\n * import { toCoinType } from 'viem'\n * import { base } from 'viem/chains'\n *\n * const coinType = toCoinType(base.id)\n * ```\n *\n * @default 60n\n */\n coinType?: bigint | undefined\n /**\n * Universal Resolver gateway URLs to use for resolving CCIP-read requests.\n */\n gatewayUrls?: string[] | undefined\n /**\n * Whether or not to throw errors propagated from the ENS Universal Resolver Contract.\n */\n strict?: boolean | undefined\n /**\n * Address of ENS Universal Resolver Contract.\n */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsNameReturnType = string | null\n\nexport type GetEnsNameErrorType =\n | GetChainContractAddressErrorType\n | ReadContractErrorType\n | PacketToBytesErrorType\n | ErrorType\n\n/**\n * Gets primary name for specified address.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsName\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `reverse(bytes)` on ENS Universal Resolver Contract to \"reverse resolve\" the address to the primary ENS name.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsNameParameters}\n * @returns Name or `null` if not found. {@link GetEnsNameReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsName } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensName = await getEnsName(client, {\n * address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n * })\n * // 'wevm.eth'\n */\nexport async function getEnsName(\n client: Client,\n parameters: GetEnsNameParameters,\n): Promise {\n const {\n address,\n blockNumber,\n blockTag,\n coinType = 60n,\n gatewayUrls,\n strict,\n } = parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n try {\n const readContractParameters = {\n address: universalResolverAddress,\n abi: universalResolverReverseAbi,\n args: [address, coinType, gatewayUrls ?? [localBatchGatewayUrl]],\n functionName: 'reverseWithGateways',\n blockNumber,\n blockTag,\n } as const\n\n const readContractAction = getAction(client, readContract, 'readContract')\n\n const [name] = await readContractAction(readContractParameters)\n\n return name || null\n } catch (err) {\n if (strict) throw err\n if (isNullUniversalResolverError(err)) return null\n throw err\n }\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'\nimport {\n type PacketToBytesErrorType,\n packetToBytes,\n} from '../../utils/ens/packetToBytes.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractParameters,\n readContract,\n} from '../public/readContract.js'\n\nexport type GetEnsResolverParameters = Prettify<\n Pick & {\n /** Name to get the address for. */\n name: string\n /** Address of ENS Universal Resolver Contract. */\n universalResolverAddress?: Address | undefined\n }\n>\n\nexport type GetEnsResolverReturnType = Address\n\nexport type GetEnsResolverErrorType =\n | GetChainContractAddressErrorType\n | ToHexErrorType\n | PacketToBytesErrorType\n | ErrorType\n\n/**\n * Gets resolver for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsResolverParameters}\n * @returns Address for ENS resolver. {@link GetEnsResolverReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsResolver, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const resolverAddress = await getEnsResolver(client, {\n * name: normalize('wevm.eth'),\n * })\n * // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41'\n */\nexport async function getEnsResolver(\n client: Client,\n parameters: GetEnsResolverParameters,\n): Promise {\n const { blockNumber, blockTag, name } = parameters\n const { chain } = client\n\n const universalResolverAddress = (() => {\n if (parameters.universalResolverAddress)\n return parameters.universalResolverAddress\n if (!chain)\n throw new Error(\n 'client chain not configured. universalResolverAddress is required.',\n )\n return getChainContractAddress({\n blockNumber,\n chain,\n contract: 'ensUniversalResolver',\n })\n })()\n\n const tlds = chain?.ensTlds\n if (tlds && !tlds.some((tld) => name.endsWith(tld)))\n throw new Error(\n `${name} is not a valid ENS TLD (${tlds?.join(', ')}) for chain \"${chain.name}\" (id: ${chain.id}).`,\n )\n\n const [resolverAddress] = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n address: universalResolverAddress,\n abi: [\n {\n inputs: [{ type: 'bytes' }],\n name: 'findResolver',\n outputs: [\n { type: 'address' },\n { type: 'bytes32' },\n { type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ],\n functionName: 'findResolver',\n args: [toHex(packetToBytes(name))],\n blockNumber,\n blockTag,\n })\n return resolverAddress\n}\n","import type { Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RpcTransactionRequest } from '../../types/rpc.js'\nimport type { AccessList, TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial, Prettify, UnionOmit } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type GetCallErrorReturnType,\n getCallError,\n} from '../../utils/errors/getCallError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport type {\n AssertRequestErrorType,\n AssertRequestParameters,\n} from '../../utils/transaction/assertRequest.js'\nimport { assertRequest } from '../../utils/transaction/assertRequest.js'\n\nexport type CreateAccessListParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = UnionOmit<\n FormattedTransactionRequest,\n 'from' | 'nonce' | 'accessList'\n> & {\n /** Account attached to the call (msg.sender). */\n account?: Account | Address | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n )\n\nexport type CreateAccessListReturnType = Prettify<{\n accessList: AccessList\n gasUsed: bigint\n}>\n\nexport type CreateAccessListErrorType = GetCallErrorReturnType<\n | ParseAccountErrorType\n | AssertRequestErrorType\n | NumberToHexErrorType\n | FormatTransactionRequestErrorType\n | RequestErrorType\n>\n\n/**\n * Creates an EIP-2930 access list.\n *\n * - Docs: https://viem.sh/docs/actions/public/createAccessList\n * - JSON-RPC Methods: `eth_createAccessList`\n *\n * @param client - Client to use\n * @param parameters - {@link CreateAccessListParameters}\n * @returns The access list. {@link CreateAccessListReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createAccessList } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const data = await createAccessList(client, {\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\nexport async function createAccessList(\n client: Client,\n args: CreateAccessListParameters,\n): Promise {\n const {\n account: account_ = client.account,\n blockNumber,\n blockTag = 'latest',\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n ...rest\n } = args\n const account = account_ ? parseAccount(account_) : undefined\n\n try {\n assertRequest(args as AssertRequestParameters)\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account,\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n } as TransactionRequest,\n 'createAccessList',\n ) as TransactionRequest\n\n const response = await client.request({\n method: 'eth_createAccessList',\n params: [request as ExactPartial, block],\n })\n return {\n accessList: response.accessList,\n gasUsed: BigInt(response.gasUsed),\n }\n } catch (err) {\n throw getCallError(err as ErrorType, {\n ...args,\n account,\n chain: client.chain,\n })\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreateBlockFilterReturnType = Filter<'block'>\n\nexport type CreateBlockFilterErrorType = RequestErrorType | ErrorType\n\n/**\n * Creates a [`Filter`](https://viem.sh/docs/glossary/types#filter) to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createBlockFilter\n * - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter)\n *\n * @param client - Client to use\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createBlockFilter } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createBlockFilter(client)\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'block' }\n */\nexport async function createBlockFilter(\n client: Client,\n): Promise {\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newBlockFilter',\n })\n const id = await client.request({\n method: 'eth_newBlockFilter',\n })\n return { id, request: getRequest(id), type: 'block' }\n}\n","import type { AbiEvent, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Hex, LogTopic } from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreateEventFilterParameters<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n _args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n> = {\n address?: Address | Address[] | undefined\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n} & (MaybeExtractEventArgsFromAbi<\n abiEvents,\n _eventName\n> extends infer eventFilterArgs\n ?\n | {\n args:\n | eventFilterArgs\n | (_args extends eventFilterArgs ? _args : never)\n event: abiEvent\n events?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n args?: undefined\n event?: abiEvent | undefined\n events?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n args?: undefined\n event?: undefined\n events: abiEvents | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n args?: undefined\n event?: undefined\n events?: undefined\n strict?: undefined\n }\n : {\n args?: undefined\n event?: undefined\n events?: undefined\n strict?: undefined\n })\n\nexport type CreateEventFilterReturnType<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _eventName extends string | undefined = MaybeAbiEventName,\n _args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n> = Prettify<\n Filter<'event', abiEvents, _eventName, _args, strict, fromBlock, toBlock>\n>\n\nexport type CreateEventFilterErrorType =\n | EncodeEventTopicsErrorType\n | RequestErrorType\n | NumberToHexErrorType\n | ErrorType\n\n/**\n * Creates a [`Filter`](https://viem.sh/docs/glossary/types#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createEventFilter\n * - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter)\n *\n * @param client - Client to use\n * @param parameters - {@link CreateEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createEventFilter } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createEventFilter(client, {\n * address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * })\n */\nexport async function createEventFilter<\n chain extends Chain | undefined,\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _eventName extends string | undefined = MaybeAbiEventName,\n _args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n>(\n client: Client,\n {\n address,\n args,\n event,\n events: events_,\n fromBlock,\n strict,\n toBlock,\n }: CreateEventFilterParameters<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _eventName,\n _args\n > = {} as any,\n): Promise<\n CreateEventFilterReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _eventName,\n _args\n >\n> {\n const events = events_ ?? (event ? [event] : undefined)\n\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newFilter',\n })\n\n let topics: LogTopic[] = []\n if (events) {\n const encoded = (events as AbiEvent[]).flatMap((event) =>\n encodeEventTopics({\n abi: [event],\n eventName: (event as AbiEvent).name,\n args,\n } as EncodeEventTopicsParameters),\n )\n // TODO: Clean up type casting\n topics = [encoded as LogTopic]\n if (event) topics = topics[0] as LogTopic[]\n }\n\n const id: Hex = await client.request({\n method: 'eth_newFilter',\n params: [\n {\n address,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n ...(topics.length ? { topics } : {}),\n },\n ],\n })\n\n return {\n abi: events,\n args,\n eventName: event ? (event as AbiEvent).name : undefined,\n fromBlock,\n id,\n request: getRequest(id),\n strict: Boolean(strict),\n toBlock,\n type: 'event',\n } as unknown as CreateEventFilterReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _eventName,\n _args\n >\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreatePendingTransactionFilterReturnType = Filter<'transaction'>\n\nexport type CreatePendingTransactionFilterErrorType =\n | RequestErrorType\n | ErrorType\n\n/**\n * Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter\n * - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter)\n *\n * @param client - Client to use\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createPendingTransactionFilter(client)\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'transaction' }\n */\nexport async function createPendingTransactionFilter<\n transport extends Transport,\n chain extends Chain | undefined,\n>(\n client: Client,\n): Promise {\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newPendingTransactionFilter',\n })\n const id = await client.request({\n method: 'eth_newPendingTransactionFilter',\n })\n return { id, request: getRequest(id), type: 'transaction' }\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { multicall3Abi } from '../../constants/abis.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport { decodeFunctionResult } from '../../utils/abi/decodeFunctionResult.js'\nimport { encodeFunctionData } from '../../utils/abi/encodeFunctionData.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type CallParameters, call } from './call.js'\n\nexport type GetBalanceParameters = {\n /** The address of the account. */\n address: Address\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /** The balance of the account at a block tag. */\n blockTag?: BlockTag | undefined\n }\n)\n\nexport type GetBalanceReturnType = bigint\n\nexport type GetBalanceErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the balance of an address in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBalance\n * - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance)\n *\n * You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther).\n *\n * ```ts\n * const balance = await getBalance(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * blockTag: 'safe'\n * })\n * const balanceAsEther = formatEther(balance)\n * // \"6.942\"\n * ```\n *\n * @param client - Client to use\n * @param parameters - {@link GetBalanceParameters}\n * @returns The balance of the address in wei. {@link GetBalanceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBalance } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const balance = await getBalance(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n * // 10000000000000000000000n (wei)\n */\nexport async function getBalance(\n client: Client,\n {\n address,\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n }: GetBalanceParameters,\n): Promise {\n if (client.batch?.multicall && client.chain?.contracts?.multicall3) {\n const multicall3Address = client.chain.contracts.multicall3.address\n\n const calldata = encodeFunctionData({\n abi: multicall3Abi,\n functionName: 'getEthBalance',\n args: [address],\n })\n\n const { data } = await getAction(\n client,\n call,\n 'call',\n )({\n to: multicall3Address,\n data: calldata,\n blockNumber,\n blockTag,\n } as unknown as CallParameters)\n\n return decodeFunctionResult({\n abi: multicall3Abi,\n functionName: 'getEthBalance',\n args: [address],\n data: data || '0x',\n })\n }\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n\n const balance = await client.request({\n method: 'eth_getBalance',\n params: [address, blockNumberHex || blockTag],\n })\n return BigInt(balance)\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type GetBlobBaseFeeReturnType = bigint\n\nexport type GetBlobBaseFeeErrorType = RequestErrorType | ErrorType\n\n/**\n * Returns the base fee per blob gas in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlobBaseFee\n * - JSON-RPC Methods: [`eth_blobBaseFee`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blobBaseFee)\n *\n * @param client - Client to use\n * @returns The blob base fee (in wei). {@link GetBlobBaseFeeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlobBaseFee } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blobBaseFee = await getBlobBaseFee(client)\n */\nexport async function getBlobBaseFee<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client,\n): Promise {\n const baseFee = await client.request({\n method: 'eth_blobBaseFee',\n })\n return BigInt(baseFee)\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { Quantity } from '../../types/rpc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetBlockTransactionCountParameters =\n | {\n /** Hash of the block. */\n blockHash?: Hash | undefined\n blockNumber?: undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n blockNumber?: undefined\n /** The block tag. Defaults to 'latest'. */\n blockTag?: BlockTag | undefined\n }\n\nexport type GetBlockTransactionCountReturnType = number\n\nexport type GetBlockTransactionCountErrorType =\n | NumberToHexErrorType\n | HexToNumberErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the number of Transactions at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`.\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockTransactionCountParameters}\n * @returns The block transaction count. {@link GetBlockTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlockTransactionCount } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const count = await getBlockTransactionCount(client)\n */\nexport async function getBlockTransactionCount(\n client: Client,\n {\n blockHash,\n blockNumber,\n blockTag = 'latest',\n }: GetBlockTransactionCountParameters = {},\n): Promise {\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let count: Quantity\n if (blockHash) {\n count = await client.request(\n {\n method: 'eth_getBlockTransactionCountByHash',\n params: [blockHash],\n },\n { dedupe: true },\n )\n } else {\n count = await client.request(\n {\n method: 'eth_getBlockTransactionCountByNumber',\n params: [blockNumberHex || blockTag],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n }\n\n return hexToNumber(count)\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetCodeParameters = {\n address: Address\n} & (\n | {\n blockNumber?: undefined\n blockTag?: BlockTag | undefined\n }\n | {\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\n\nexport type GetCodeReturnType = Hex | undefined\n\nexport type GetCodeErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Retrieves the bytecode at an address.\n *\n * - Docs: https://viem.sh/docs/contract/getCode\n * - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode)\n *\n * @param client - Client to use\n * @param parameters - {@link GetCodeParameters}\n * @returns The contract's bytecode. {@link GetCodeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getCode } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await getCode(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * })\n */\nexport async function getCode(\n client: Client,\n { address, blockNumber, blockTag = 'latest' }: GetCodeParameters,\n): Promise {\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n const hex = await client.request(\n {\n method: 'eth_getCode',\n params: [address, blockNumberHex || blockTag],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n if (hex === '0x') return undefined\n return hex\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport {\n type GetAddressErrorType,\n getAddress,\n} from '../../utils/address/getAddress.js'\nimport { type SizeErrorType, size } from '../../utils/data/size.js'\nimport { type SliceErrorType, slice } from '../../utils/data/slice.js'\nimport { type GetCodeErrorType, getCode } from './getCode.js'\n\nexport type GetDelegationParameters = {\n /** The address to check for delegation. */\n address: Address\n} & (\n | {\n blockNumber?: undefined\n blockTag?: BlockTag | undefined\n }\n | {\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\n\nexport type GetDelegationReturnType = Address | undefined\n\nexport type GetDelegationErrorType =\n | GetAddressErrorType\n | GetCodeErrorType\n | SliceErrorType\n | SizeErrorType\n | ErrorType\n\n/**\n * Returns the address that an account has delegated to via EIP-7702.\n *\n * - Docs: https://viem.sh/docs/actions/public/getDelegation\n *\n * @param client - Client to use\n * @param parameters - {@link GetDelegationParameters}\n * @returns The delegated address, or undefined if not delegated. {@link GetDelegationReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getDelegation } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const delegation = await getDelegation(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function getDelegation(\n client: Client,\n { address, blockNumber, blockTag = 'latest' }: GetDelegationParameters,\n): Promise {\n const code = await getCode(client, {\n address,\n ...(blockNumber !== undefined ? { blockNumber } : { blockTag }),\n } as GetDelegationParameters)\n\n if (!code) return undefined\n\n // EIP-7702 delegation designator: 0xef0100 prefix (3 bytes) + address (20 bytes) = 23 bytes\n if (size(code) !== 23) return undefined\n\n // Check for EIP-7702 delegation designator prefix\n if (!code.startsWith('0xef0100')) return undefined\n\n // Extract the delegated address (bytes 3-23) and checksum it\n return getAddress(slice(code, 3, 23))\n}\n","import type { Address } from 'abitype'\nimport { BaseError } from './base.js'\n\nexport type Eip712DomainNotFoundErrorType = Eip712DomainNotFoundError & {\n name: 'Eip712DomainNotFoundError'\n}\nexport class Eip712DomainNotFoundError extends BaseError {\n constructor({ address }: { address: Address }) {\n super(`No EIP-712 domain found on contract \"${address}\".`, {\n metaMessages: [\n 'Ensure that:',\n `- The contract is deployed at the address \"${address}\".`,\n '- `eip712Domain()` function exists on the contract.',\n '- `eip712Domain()` function matches signature to ERC-5267 specification.',\n ],\n name: 'Eip712DomainNotFoundError',\n })\n }\n}\n","import type { Address, TypedDataDomain } from 'abitype'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n Eip712DomainNotFoundError,\n type Eip712DomainNotFoundErrorType,\n} from '../../errors/eip712.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RequiredBy } from '../../types/utils.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type ReadContractErrorType,\n type ReadContractParameters,\n readContract,\n} from './readContract.js'\n\nexport type GetEip712DomainParameters = {\n address: Address\n} & Pick\n\nexport type GetEip712DomainReturnType = {\n domain: RequiredBy<\n TypedDataDomain,\n 'chainId' | 'name' | 'verifyingContract' | 'salt' | 'version'\n >\n fields: Hex\n extensions: readonly bigint[]\n}\n\nexport type GetEip712DomainErrorType =\n | Eip712DomainNotFoundErrorType\n | ReadContractErrorType\n | ErrorType\n\n/**\n * Reads the EIP-712 domain from a contract, based on the ERC-5267 specification.\n *\n * @param client - A {@link Client} instance.\n * @param parameters - The parameters of the action. {@link GetEip712DomainParameters}\n * @returns The EIP-712 domain, fields, and extensions. {@link GetEip712DomainReturnType}\n *\n * @example\n * ```ts\n * import { createPublicClient, http, getEip712Domain } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const domain = await getEip712Domain(client, {\n * address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * })\n * // {\n * // domain: {\n * // name: 'ExampleContract',\n * // version: '1',\n * // chainId: 1,\n * // verifyingContract: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * // },\n * // fields: '0x0f',\n * // extensions: [],\n * // }\n * ```\n */\nexport async function getEip712Domain(\n client: Client,\n parameters: GetEip712DomainParameters,\n): Promise {\n const { address, factory, factoryData } = parameters\n\n try {\n const [\n fields,\n name,\n version,\n chainId,\n verifyingContract,\n salt,\n extensions,\n ] = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n abi,\n address,\n functionName: 'eip712Domain',\n factory,\n factoryData,\n })\n\n return {\n domain: {\n name,\n version,\n chainId: Number(chainId),\n verifyingContract,\n salt,\n },\n extensions,\n fields,\n }\n } catch (e) {\n const error = e as ReadContractErrorType\n if (\n error.name === 'ContractFunctionExecutionError' &&\n error.cause.name === 'ContractFunctionZeroDataError'\n ) {\n throw new Eip712DomainNotFoundError({ address })\n }\n throw error\n }\n}\n\nconst abi = [\n {\n inputs: [],\n name: 'eip712Domain',\n outputs: [\n { name: 'fields', type: 'bytes1' },\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n { name: 'salt', type: 'bytes32' },\n { name: 'extensions', type: 'uint256[]' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { FeeHistory } from '../../types/fee.js'\nimport type { RpcFeeHistory } from '../../types/rpc.js'\n\nexport type FormatFeeHistoryErrorType = ErrorType\n\nexport function formatFeeHistory(feeHistory: RpcFeeHistory): FeeHistory {\n return {\n baseFeePerGas: feeHistory.baseFeePerGas.map((value) => BigInt(value)),\n gasUsedRatio: feeHistory.gasUsedRatio,\n oldestBlock: BigInt(feeHistory.oldestBlock),\n reward: feeHistory.reward?.map((reward) =>\n reward.map((value) => BigInt(value)),\n ),\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { FeeHistory } from '../../types/fee.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormatFeeHistoryErrorType,\n formatFeeHistory,\n} from '../../utils/formatters/feeHistory.js'\n\nexport type GetFeeHistoryParameters = {\n /**\n * Number of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. Less than requested may be returned if not all blocks are available.\n */\n blockCount: number\n /**\n * A monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used.\n */\n rewardPercentiles: number[]\n} & (\n | {\n blockNumber?: undefined\n /**\n * Highest number block of the requested range.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n | {\n /** Highest number block of the requested range. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\nexport type GetFeeHistoryReturnType = FeeHistory\n\nexport type GetFeeHistoryErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | FormatFeeHistoryErrorType\n\n/**\n * Returns a collection of historical gas information.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFeeHistory\n * - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory)\n *\n * @param client - Client to use\n * @param parameters - {@link GetFeeHistoryParameters}\n * @returns The gas estimate (in wei). {@link GetFeeHistoryReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getFeeHistory } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const feeHistory = await getFeeHistory(client, {\n * blockCount: 4,\n * rewardPercentiles: [25, 75],\n * })\n */\nexport async function getFeeHistory(\n client: Client,\n {\n blockCount,\n blockNumber,\n blockTag = 'latest',\n rewardPercentiles,\n }: GetFeeHistoryParameters,\n): Promise {\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const feeHistory = await client.request(\n {\n method: 'eth_feeHistory',\n params: [\n numberToHex(blockCount),\n blockNumberHex || blockTag,\n rewardPercentiles,\n ],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n return formatFeeHistory(feeHistory)\n}\n","import type { Abi, AbiEvent, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetFilterLogsParameters<\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n filter: Filter<'event', abi, eventName, any, strict, fromBlock, toBlock>\n}\nexport type GetFilterLogsReturnType<\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _AbiEvent extends AbiEvent | undefined = abi extends Abi\n ? eventName extends string\n ? ExtractAbiEvent\n : undefined\n : undefined,\n _Pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log[]\n\nexport type GetFilterLogsErrorType =\n | RequestErrorType\n | DecodeEventLogErrorType\n | FormatLogErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs since the filter was created.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterLogs\n * - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs)\n *\n * `getFilterLogs` is only compatible with **event filters**.\n *\n * @param client - Client to use\n * @param parameters - {@link GetFilterLogsParameters}\n * @returns A list of event logs. {@link GetFilterLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createEventFilter, getFilterLogs } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await getFilterLogs(client, { filter })\n */\nexport async function getFilterLogs<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n _client: Client,\n {\n filter,\n }: GetFilterLogsParameters,\n): Promise<\n GetFilterLogsReturnType\n> {\n const strict = filter.strict ?? false\n\n const logs = await filter.request({\n method: 'eth_getFilterLogs',\n params: [filter.id],\n })\n\n const formattedLogs = logs.map((log) => formatLog(log))\n if (!filter.abi)\n return formattedLogs as GetFilterLogsReturnType<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: filter.abi,\n logs: formattedLogs,\n strict,\n }) as unknown as GetFilterLogsReturnType<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import { versionedHashVersionKzg } from '../../constants/kzg.js'\nimport { maxUint256 } from '../../constants/number.js'\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport { BaseError, type BaseErrorType } from '../../errors/base.js'\nimport {\n EmptyBlobError,\n type EmptyBlobErrorType,\n InvalidVersionedHashSizeError,\n type InvalidVersionedHashSizeErrorType,\n InvalidVersionedHashVersionError,\n type InvalidVersionedHashVersionErrorType,\n} from '../../errors/blob.js'\nimport {\n InvalidChainIdError,\n type InvalidChainIdErrorType,\n} from '../../errors/chain.js'\nimport {\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n} from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableLegacy,\n} from '../../types/transaction.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { size } from '../data/size.js'\nimport { slice } from '../data/slice.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\n\nexport type AssertTransactionEIP7702ErrorType =\n | AssertTransactionEIP1559ErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | ErrorType\n\nexport function assertTransactionEIP7702(\n transaction: TransactionSerializableEIP7702,\n) {\n const { authorizationList } = transaction\n if (authorizationList) {\n for (const authorization of authorizationList) {\n const { chainId } = authorization\n const address = authorization.address\n if (!isAddress(address)) throw new InvalidAddressError({ address })\n if (chainId < 0) throw new InvalidChainIdError({ chainId })\n }\n }\n assertTransactionEIP1559(transaction as {} as TransactionSerializableEIP1559)\n}\n\nexport type AssertTransactionEIP4844ErrorType =\n | AssertTransactionEIP1559ErrorType\n | EmptyBlobErrorType\n | InvalidVersionedHashSizeErrorType\n | InvalidVersionedHashVersionErrorType\n | ErrorType\n\nexport function assertTransactionEIP4844(\n transaction: TransactionSerializableEIP4844,\n) {\n const { blobVersionedHashes } = transaction\n if (blobVersionedHashes) {\n if (blobVersionedHashes.length === 0) throw new EmptyBlobError()\n for (const hash of blobVersionedHashes) {\n const size_ = size(hash)\n const version = hexToNumber(slice(hash, 0, 1))\n if (size_ !== 32)\n throw new InvalidVersionedHashSizeError({ hash, size: size_ })\n if (version !== versionedHashVersionKzg)\n throw new InvalidVersionedHashVersionError({\n hash,\n version,\n })\n }\n }\n assertTransactionEIP1559(transaction as {} as TransactionSerializableEIP1559)\n}\n\nexport type AssertTransactionEIP1559ErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | TipAboveFeeCapErrorType\n | ErrorType\n\nexport function assertTransactionEIP1559(\n transaction: TransactionSerializableEIP1559,\n) {\n const { chainId, maxPriorityFeePerGas, maxFeePerGas, to } = transaction\n if (chainId <= 0) throw new InvalidChainIdError({ chainId })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (maxFeePerGas && maxFeePerGas > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas })\n if (\n maxPriorityFeePerGas &&\n maxFeePerGas &&\n maxPriorityFeePerGas > maxFeePerGas\n )\n throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas })\n}\n\nexport type AssertTransactionEIP2930ErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | ErrorType\n\nexport function assertTransactionEIP2930(\n transaction: TransactionSerializableEIP2930,\n) {\n const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =\n transaction\n if (chainId <= 0) throw new InvalidChainIdError({ chainId })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (maxPriorityFeePerGas || maxFeePerGas)\n throw new BaseError(\n '`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute.',\n )\n if (gasPrice && gasPrice > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })\n}\n\nexport type AssertTransactionLegacyErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | ErrorType\n\nexport function assertTransactionLegacy(\n transaction: TransactionSerializableLegacy,\n) {\n const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =\n transaction\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (typeof chainId !== 'undefined' && chainId <= 0)\n throw new InvalidChainIdError({ chainId })\n if (maxPriorityFeePerGas || maxFeePerGas)\n throw new BaseError(\n '`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute.',\n )\n if (gasPrice && gasPrice > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })\n}\n","import {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport {\n InvalidStorageKeySizeError,\n type InvalidStorageKeySizeErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { AccessList } from '../../types/transaction.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport type { RecursiveArray } from '../encoding/toRlp.js'\n\nexport type SerializeAccessListErrorType =\n | InvalidStorageKeySizeErrorType\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\n/*\n * Serialize an EIP-2930 access list\n * @remarks\n * Use to create a transaction serializer with support for EIP-2930 access lists\n *\n * @param accessList - Array of objects of address and arrays of Storage Keys\n * @throws InvalidAddressError, InvalidStorageKeySizeError\n * @returns Array of hex strings\n */\nexport function serializeAccessList(\n accessList?: AccessList | undefined,\n): RecursiveArray {\n if (!accessList || accessList.length === 0) return []\n\n const serializedAccessList = []\n for (let i = 0; i < accessList.length; i++) {\n const { address, storageKeys } = accessList[i]\n\n for (let j = 0; j < storageKeys.length; j++) {\n if (storageKeys[j].length - 2 !== 64) {\n throw new InvalidStorageKeySizeError({ storageKey: storageKeys[j] })\n }\n }\n\n if (!isAddress(address, { strict: false })) {\n throw new InvalidAddressError({ address })\n }\n\n serializedAccessList.push([address, storageKeys])\n }\n return serializedAccessList\n}\n","import {\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ByteArray,\n Hex,\n Signature,\n SignatureLegacy,\n} from '../../types/misc.js'\nimport type {\n TransactionSerializable,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedLegacy,\n TransactionType,\n} from '../../types/transaction.js'\nimport type { MaybePromise, OneOf } from '../../types/utils.js'\nimport {\n type SerializeAuthorizationListErrorType,\n serializeAuthorizationList,\n} from '../authorization/serializeAuthorizationList.js'\nimport {\n type BlobsToCommitmentsErrorType,\n blobsToCommitments,\n} from '../blob/blobsToCommitments.js'\nimport {\n blobsToProofs,\n type blobsToProofsErrorType,\n} from '../blob/blobsToProofs.js'\nimport {\n type CommitmentsToVersionedHashesErrorType,\n commitmentsToVersionedHashes,\n} from '../blob/commitmentsToVersionedHashes.js'\nimport {\n type ToBlobSidecarsErrorType,\n toBlobSidecars,\n} from '../blob/toBlobSidecars.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport { trim } from '../data/trim.js'\nimport {\n bytesToHex,\n type NumberToHexErrorType,\n numberToHex,\n} from '../encoding/toHex.js'\nimport { type ToRlpErrorType, toRlp } from '../encoding/toRlp.js'\n\nimport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionEIP4844ErrorType,\n type AssertTransactionEIP7702ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionEIP4844,\n assertTransactionEIP7702,\n assertTransactionLegacy,\n} from './assertTransaction.js'\nimport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './getTransactionType.js'\nimport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './serializeAccessList.js'\n\nexport type SerializedTransactionReturnType<\n transaction extends TransactionSerializable = TransactionSerializable,\n ///\n _transactionType extends TransactionType = GetTransactionType,\n> = TransactionSerialized<_transactionType>\n\nexport type SerializeTransactionFn<\n transaction extends TransactionSerializableGeneric = TransactionSerializable,\n ///\n _transactionType extends TransactionType = never,\n> = (\n transaction: OneOf,\n signature?: Signature | undefined,\n) => MaybePromise<\n SerializedTransactionReturnType<\n OneOf,\n _transactionType\n >\n>\n\nexport type SerializeTransactionErrorType =\n | GetTransactionTypeErrorType\n | SerializeTransactionEIP1559ErrorType\n | SerializeTransactionEIP2930ErrorType\n | SerializeTransactionEIP4844ErrorType\n | SerializeTransactionEIP7702ErrorType\n | SerializeTransactionLegacyErrorType\n | ErrorType\n\nexport function serializeTransaction<\n const transaction extends TransactionSerializable,\n ///\n _transactionType extends TransactionType = GetTransactionType,\n>(\n transaction: transaction,\n signature?: Signature | undefined,\n): SerializedTransactionReturnType {\n const type = getTransactionType(transaction) as GetTransactionType\n\n if (type === 'eip1559')\n return serializeTransactionEIP1559(\n transaction as TransactionSerializableEIP1559,\n signature,\n ) as SerializedTransactionReturnType\n\n if (type === 'eip2930')\n return serializeTransactionEIP2930(\n transaction as TransactionSerializableEIP2930,\n signature,\n ) as SerializedTransactionReturnType\n\n if (type === 'eip4844')\n return serializeTransactionEIP4844(\n transaction as TransactionSerializableEIP4844,\n signature,\n ) as SerializedTransactionReturnType\n\n if (type === 'eip7702')\n return serializeTransactionEIP7702(\n transaction as TransactionSerializableEIP7702,\n signature,\n ) as SerializedTransactionReturnType\n\n return serializeTransactionLegacy(\n transaction as TransactionSerializableLegacy,\n signature as SignatureLegacy,\n ) as SerializedTransactionReturnType\n}\n\ntype SerializeTransactionEIP7702ErrorType =\n | AssertTransactionEIP7702ErrorType\n | SerializeAuthorizationListErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP7702(\n transaction: TransactionSerializableEIP7702,\n signature?: Signature | undefined,\n): TransactionSerializedEIP7702 {\n const {\n authorizationList,\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP7702(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n const serializedAuthorizationList =\n serializeAuthorizationList(authorizationList)\n\n return concatHex([\n '0x04',\n toRlp([\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n serializedAuthorizationList,\n ...toYParitySignatureArray(transaction, signature),\n ]),\n ]) as TransactionSerializedEIP7702\n}\n\ntype SerializeTransactionEIP4844ErrorType =\n | AssertTransactionEIP4844ErrorType\n | BlobsToCommitmentsErrorType\n | CommitmentsToVersionedHashesErrorType\n | blobsToProofsErrorType\n | ToBlobSidecarsErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP4844(\n transaction: TransactionSerializableEIP4844,\n signature?: Signature | undefined,\n): TransactionSerializedEIP4844 {\n const {\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP4844(transaction)\n\n let blobVersionedHashes = transaction.blobVersionedHashes\n let sidecars = transaction.sidecars\n // If `blobs` are passed, we will need to compute the KZG commitments & proofs.\n if (\n transaction.blobs &&\n (typeof blobVersionedHashes === 'undefined' ||\n typeof sidecars === 'undefined')\n ) {\n const blobs = (\n typeof transaction.blobs[0] === 'string'\n ? transaction.blobs\n : (transaction.blobs as ByteArray[]).map((x) => bytesToHex(x))\n ) as Hex[]\n const kzg = transaction.kzg!\n const commitments = blobsToCommitments({\n blobs,\n kzg,\n })\n\n if (typeof blobVersionedHashes === 'undefined')\n blobVersionedHashes = commitmentsToVersionedHashes({\n commitments,\n })\n if (typeof sidecars === 'undefined') {\n const proofs = blobsToProofs({ blobs, commitments, kzg })\n sidecars = toBlobSidecars({ blobs, commitments, proofs })\n }\n }\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n maxFeePerBlobGas ? numberToHex(maxFeePerBlobGas) : '0x',\n blobVersionedHashes ?? [],\n ...toYParitySignatureArray(transaction, signature),\n ] as const\n\n const blobs: Hex[] = []\n const commitments: Hex[] = []\n const proofs: Hex[] = []\n if (sidecars)\n for (let i = 0; i < sidecars.length; i++) {\n const { blob, commitment, proof } = sidecars[i]\n blobs.push(blob)\n commitments.push(commitment)\n proofs.push(proof)\n }\n\n return concatHex([\n '0x03',\n sidecars\n ? // If sidecars are enabled, envelope turns into a \"wrapper\":\n toRlp([serializedTransaction, blobs, commitments, proofs])\n : // If sidecars are disabled, standard envelope is used:\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP4844\n}\n\ntype SerializeTransactionEIP1559ErrorType =\n | AssertTransactionEIP1559ErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP1559(\n transaction: TransactionSerializableEIP1559,\n signature?: Signature | undefined,\n): TransactionSerializedEIP1559 {\n const {\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP1559(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n ...toYParitySignatureArray(transaction, signature),\n ]\n\n return concatHex([\n '0x02',\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP1559\n}\n\ntype SerializeTransactionEIP2930ErrorType =\n | AssertTransactionEIP2930ErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP2930(\n transaction: TransactionSerializableEIP2930,\n signature?: Signature | undefined,\n): TransactionSerializedEIP2930 {\n const { chainId, gas, data, nonce, to, value, accessList, gasPrice } =\n transaction\n\n assertTransactionEIP2930(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n gasPrice ? numberToHex(gasPrice) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n ...toYParitySignatureArray(transaction, signature),\n ]\n\n return concatHex([\n '0x01',\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP2930\n}\n\ntype SerializeTransactionLegacyErrorType =\n | AssertTransactionLegacyErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | ErrorType\n\nfunction serializeTransactionLegacy(\n transaction: TransactionSerializableLegacy,\n signature?: SignatureLegacy | undefined,\n): TransactionSerializedLegacy {\n const { chainId = 0, gas, data, nonce, to, value, gasPrice } = transaction\n\n assertTransactionLegacy(transaction)\n\n let serializedTransaction = [\n nonce ? numberToHex(nonce) : '0x',\n gasPrice ? numberToHex(gasPrice) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n ]\n\n if (signature) {\n const v = (() => {\n // EIP-155 (inferred chainId)\n if (signature.v >= 35n) {\n const inferredChainId = (signature.v - 35n) / 2n\n if (inferredChainId > 0) return signature.v\n return 27n + (signature.v === 35n ? 0n : 1n)\n }\n\n // EIP-155 (explicit chainId)\n if (chainId > 0)\n return BigInt(chainId * 2) + BigInt(35n + signature.v - 27n)\n\n // Pre-EIP-155 (no chainId)\n const v = 27n + (signature.v === 27n ? 0n : 1n)\n if (signature.v !== v) throw new InvalidLegacyVError({ v: signature.v })\n return v\n })()\n\n const r = trim(signature.r)\n const s = trim(signature.s)\n\n serializedTransaction = [\n ...serializedTransaction,\n numberToHex(v),\n r === '0x00' ? '0x' : r,\n s === '0x00' ? '0x' : s,\n ]\n } else if (chainId > 0) {\n serializedTransaction = [\n ...serializedTransaction,\n numberToHex(chainId),\n '0x',\n '0x',\n ]\n }\n\n return toRlp(serializedTransaction) as TransactionSerializedLegacy\n}\n\nexport function toYParitySignatureArray(\n transaction: TransactionSerializableGeneric,\n signature_?: Signature | undefined,\n) {\n const signature = signature_ ?? transaction\n const { v, yParity } = signature\n\n if (typeof signature.r === 'undefined') return []\n if (typeof signature.s === 'undefined') return []\n if (typeof v === 'undefined' && typeof yParity === 'undefined') return []\n\n const r = trim(signature.r)\n const s = trim(signature.s)\n\n const yParity_ = (() => {\n if (typeof yParity === 'number') return yParity ? numberToHex(1) : '0x'\n if (v === 0n) return '0x'\n if (v === 1n) return numberToHex(1)\n\n return v === 27n ? '0x' : numberToHex(1)\n })()\n\n return [yParity_, r === '0x00' ? '0x' : r, s === '0x00' ? '0x' : s]\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n AuthorizationList,\n SerializedAuthorizationList,\n} from '../../types/authorization.js'\nimport { toHex } from '../encoding/toHex.js'\nimport { toYParitySignatureArray } from '../transaction/serializeTransaction.js'\n\nexport type SerializeAuthorizationListReturnType = SerializedAuthorizationList\n\nexport type SerializeAuthorizationListErrorType = ErrorType\n\n/*\n * Serializes an EIP-7702 authorization list.\n */\nexport function serializeAuthorizationList(\n authorizationList?: AuthorizationList | undefined,\n): SerializeAuthorizationListReturnType {\n if (!authorizationList || authorizationList.length === 0) return []\n\n const serializedAuthorizationList = []\n for (const authorization of authorizationList) {\n const { chainId, nonce, ...signature } = authorization\n const contractAddress = authorization.address\n serializedAuthorizationList.push([\n chainId ? toHex(chainId) : '0x',\n contractAddress,\n nonce ? toHex(nonce) : '0x',\n ...toYParitySignatureArray({}, signature),\n ])\n }\n\n return serializedAuthorizationList as {} as SerializeAuthorizationListReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport { type GetAddressErrorType, getAddress } from '../address/getAddress.js'\nimport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from '../address/isAddressEqual.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n type RecoverAuthorizationAddressParameters,\n recoverAuthorizationAddress,\n} from './recoverAuthorizationAddress.js'\n\nexport type VerifyAuthorizationParameters =\n RecoverAuthorizationAddressParameters & {\n /** The address that signed the Authorization object. */\n address: Address\n }\n\nexport type VerifyAuthorizationReturnType = boolean\n\nexport type VerifyAuthorizationErrorType =\n | IsAddressEqualErrorType\n | GetAddressErrorType\n | RecoverAuthorizationAddressErrorType\n | ErrorType\n\n/**\n * Verify that an Authorization object was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/utilities/verifyAuthorization}\n *\n * @param parameters - {@link VerifyAuthorizationParameters}\n * @returns Whether or not the signature is valid. {@link VerifyAuthorizationReturnType}\n */\nexport async function verifyAuthorization({\n address,\n authorization,\n signature,\n}: VerifyAuthorizationParameters): Promise {\n return isAddressEqual(\n getAddress(address),\n await recoverAuthorizationAddress({\n authorization,\n signature,\n }),\n )\n}\n","import { LruMap } from '../lru.js'\n\n/** @internal */\nexport const promiseCache = /*#__PURE__*/ new LruMap>(8192)\n\ntype WithDedupeOptions = {\n enabled?: boolean | undefined\n id?: string | undefined\n}\n\n/** Deduplicates in-flight promises. */\nexport function withDedupe(\n fn: () => Promise,\n { enabled = true, id }: WithDedupeOptions,\n): Promise {\n if (!enabled || !id) return fn()\n if (promiseCache.get(id)) return promiseCache.get(id)!\n const promise = fn().finally(() => promiseCache.delete(id))\n promiseCache.set(id, promise)\n return promise\n}\n","import { BaseError } from '../errors/base.js'\nimport {\n HttpRequestError,\n type HttpRequestErrorType,\n type RpcRequestErrorType,\n type TimeoutErrorType,\n type WebSocketRequestErrorType,\n} from '../errors/request.js'\nimport {\n AtomicityNotSupportedError,\n type AtomicityNotSupportedErrorType,\n AtomicReadyWalletRejectedUpgradeError,\n type AtomicReadyWalletRejectedUpgradeErrorType,\n BundleTooLargeError,\n type BundleTooLargeErrorType,\n ChainDisconnectedError,\n type ChainDisconnectedErrorType,\n DuplicateIdError,\n type DuplicateIdErrorType,\n InternalRpcError,\n type InternalRpcErrorType,\n InvalidInputRpcError,\n type InvalidInputRpcErrorType,\n InvalidParamsRpcError,\n type InvalidParamsRpcErrorType,\n InvalidRequestRpcError,\n type InvalidRequestRpcErrorType,\n JsonRpcVersionUnsupportedError,\n type JsonRpcVersionUnsupportedErrorType,\n LimitExceededRpcError,\n type LimitExceededRpcErrorType,\n MethodNotFoundRpcError,\n type MethodNotFoundRpcErrorType,\n MethodNotSupportedRpcError,\n type MethodNotSupportedRpcErrorType,\n ParseRpcError,\n type ParseRpcErrorType,\n ProviderDisconnectedError,\n type ProviderDisconnectedErrorType,\n type ProviderRpcErrorCode,\n ResourceNotFoundRpcError,\n type ResourceNotFoundRpcErrorType,\n ResourceUnavailableRpcError,\n type ResourceUnavailableRpcErrorType,\n type RpcError,\n type RpcErrorCode,\n type RpcErrorType,\n SwitchChainError,\n type SwitchChainErrorType,\n TransactionRejectedRpcError,\n type TransactionRejectedRpcErrorType,\n UnauthorizedProviderError,\n type UnauthorizedProviderErrorType,\n UnknownBundleIdError,\n type UnknownBundleIdErrorType,\n UnknownRpcError,\n type UnknownRpcErrorType,\n UnsupportedChainIdError,\n type UnsupportedChainIdErrorType,\n UnsupportedNonOptionalCapabilityError,\n type UnsupportedNonOptionalCapabilityErrorType,\n UnsupportedProviderMethodError,\n type UnsupportedProviderMethodErrorType,\n UserRejectedRequestError,\n type UserRejectedRequestErrorType,\n WalletConnectSessionSettlementError,\n type WalletConnectSessionSettlementErrorType,\n} from '../errors/rpc.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type {\n EIP1193RequestFn,\n EIP1193RequestOptions,\n} from '../types/eip1193.js'\nimport { stringToHex } from './encoding/toHex.js'\nimport type { CreateBatchSchedulerErrorType } from './promise/createBatchScheduler.js'\nimport { withDedupe } from './promise/withDedupe.js'\nimport { type WithRetryErrorType, withRetry } from './promise/withRetry.js'\nimport type { GetSocketRpcClientErrorType } from './rpc/socket.js'\nimport { stringify } from './stringify.js'\n\nexport type RequestErrorType =\n | AtomicityNotSupportedErrorType\n | AtomicReadyWalletRejectedUpgradeErrorType\n | BundleTooLargeErrorType\n | ChainDisconnectedErrorType\n | CreateBatchSchedulerErrorType\n | DuplicateIdErrorType\n | HttpRequestErrorType\n | InternalRpcErrorType\n | InvalidInputRpcErrorType\n | InvalidParamsRpcErrorType\n | InvalidRequestRpcErrorType\n | GetSocketRpcClientErrorType\n | JsonRpcVersionUnsupportedErrorType\n | LimitExceededRpcErrorType\n | MethodNotFoundRpcErrorType\n | MethodNotSupportedRpcErrorType\n | ParseRpcErrorType\n | ProviderDisconnectedErrorType\n | ResourceNotFoundRpcErrorType\n | ResourceUnavailableRpcErrorType\n | RpcErrorType\n | RpcRequestErrorType\n | SwitchChainErrorType\n | TimeoutErrorType\n | TransactionRejectedRpcErrorType\n | UnauthorizedProviderErrorType\n | UnknownBundleIdErrorType\n | UnknownRpcErrorType\n | UnsupportedChainIdErrorType\n | UnsupportedNonOptionalCapabilityErrorType\n | UnsupportedProviderMethodErrorType\n | UserRejectedRequestErrorType\n | WalletConnectSessionSettlementErrorType\n | WebSocketRequestErrorType\n | WithRetryErrorType\n | ErrorType\n\nexport function buildRequest Promise>(\n request: request,\n options: EIP1193RequestOptions = {},\n): EIP1193RequestFn {\n return async (args, overrideOptions = {}) => {\n const {\n dedupe = false,\n methods,\n retryDelay = 150,\n retryCount = 3,\n uid,\n } = {\n ...options,\n ...overrideOptions,\n }\n\n const { method } = args\n if (methods?.exclude?.includes(method))\n throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n method,\n })\n if (methods?.include && !methods.include.includes(method))\n throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n method,\n })\n\n const requestId = dedupe\n ? stringToHex(`${uid}.${stringify(args)}`)\n : undefined\n return withDedupe(\n () =>\n withRetry(\n async () => {\n try {\n return await request(args)\n } catch (err_) {\n const err = err_ as unknown as RpcError<\n RpcErrorCode | ProviderRpcErrorCode\n >\n switch (err.code) {\n // -32700\n case ParseRpcError.code:\n throw new ParseRpcError(err)\n // -32600\n case InvalidRequestRpcError.code:\n throw new InvalidRequestRpcError(err)\n // -32601\n case MethodNotFoundRpcError.code:\n throw new MethodNotFoundRpcError(err, { method: args.method })\n // -32602\n case InvalidParamsRpcError.code:\n throw new InvalidParamsRpcError(err)\n // -32603\n case InternalRpcError.code:\n throw new InternalRpcError(err)\n // -32000\n case InvalidInputRpcError.code:\n throw new InvalidInputRpcError(err)\n // -32001\n case ResourceNotFoundRpcError.code:\n throw new ResourceNotFoundRpcError(err)\n // -32002\n case ResourceUnavailableRpcError.code:\n throw new ResourceUnavailableRpcError(err)\n // -32003\n case TransactionRejectedRpcError.code:\n throw new TransactionRejectedRpcError(err)\n // -32004\n case MethodNotSupportedRpcError.code:\n throw new MethodNotSupportedRpcError(err, {\n method: args.method,\n })\n // -32005\n case LimitExceededRpcError.code:\n throw new LimitExceededRpcError(err)\n // -32006\n case JsonRpcVersionUnsupportedError.code:\n throw new JsonRpcVersionUnsupportedError(err)\n\n // 4001\n case UserRejectedRequestError.code:\n throw new UserRejectedRequestError(err)\n // 4100\n case UnauthorizedProviderError.code:\n throw new UnauthorizedProviderError(err)\n // 4200\n case UnsupportedProviderMethodError.code:\n throw new UnsupportedProviderMethodError(err)\n // 4900\n case ProviderDisconnectedError.code:\n throw new ProviderDisconnectedError(err)\n // 4901\n case ChainDisconnectedError.code:\n throw new ChainDisconnectedError(err)\n // 4902\n case SwitchChainError.code:\n throw new SwitchChainError(err)\n\n // 5700\n case UnsupportedNonOptionalCapabilityError.code:\n throw new UnsupportedNonOptionalCapabilityError(err)\n // 5710\n case UnsupportedChainIdError.code:\n throw new UnsupportedChainIdError(err)\n // 5720\n case DuplicateIdError.code:\n throw new DuplicateIdError(err)\n // 5730\n case UnknownBundleIdError.code:\n throw new UnknownBundleIdError(err)\n // 5740\n case BundleTooLargeError.code:\n throw new BundleTooLargeError(err)\n // 5750\n case AtomicReadyWalletRejectedUpgradeError.code:\n throw new AtomicReadyWalletRejectedUpgradeError(err)\n // 5760\n case AtomicityNotSupportedError.code:\n throw new AtomicityNotSupportedError(err)\n\n // CAIP-25: User Rejected Error\n // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes#rejected-caip-25\n case 5000:\n throw new UserRejectedRequestError(err)\n\n // WalletConnect: Session Settlement Failed\n // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes\n case WalletConnectSessionSettlementError.code:\n throw new WalletConnectSessionSettlementError(err)\n\n default:\n if (err_ instanceof BaseError) throw err_\n throw new UnknownRpcError(err as Error)\n }\n }\n },\n {\n delay: ({ count, error }) => {\n // If we find a Retry-After header, let's retry after the given time.\n if (error && error instanceof HttpRequestError) {\n const retryAfter = error?.headers?.get('Retry-After')\n if (retryAfter?.match(/\\d/))\n return Number.parseInt(retryAfter, 10) * 1000\n }\n\n // Otherwise, let's retry with an exponential backoff.\n return ~~(1 << count) * retryDelay\n },\n retryCount,\n shouldRetry: ({ error }) => shouldRetry(error),\n },\n ),\n { enabled: dedupe, id: requestId },\n )\n }\n}\n\n/** @internal */\nexport function shouldRetry(error: Error) {\n if ('code' in error && typeof error.code === 'number') {\n if (error.code === -1) return true // Unknown error\n if (error.code === LimitExceededRpcError.code) return true\n if (error.code === InternalRpcError.code) return true\n return false\n }\n if (error instanceof HttpRequestError && error.status) {\n // Forbidden\n if (error.status === 403) return true\n // Request Timeout\n if (error.status === 408) return true\n // Request Entity Too Large\n if (error.status === 413) return true\n // Too Many Requests\n if (error.status === 429) return true\n // Internal Server Error\n if (error.status === 500) return true\n // Bad Gateway\n if (error.status === 502) return true\n // Service Unavailable\n if (error.status === 503) return true\n // Gateway Timeout\n if (error.status === 504) return true\n return false\n }\n return true\n}\n","import type { Chain, ChainFormatters } from '../../types/chain.js'\nimport type { Assign, Prettify } from '../../types/utils.js'\n\nexport type DefineChainReturnType = Prettify<\n chain &\n (chain['extendSchema'] extends Record\n ? {\n extend: (\n extended: extended,\n ) => Assign\n }\n : {})\n>\n\nexport function defineChain<\n formatters extends ChainFormatters,\n const chain extends Chain,\n>(chain: chain): DefineChainReturnType, chain>> {\n const chainInstance = {\n formatters: undefined,\n fees: undefined,\n serializers: undefined,\n ...chain,\n } as Assign, chain>\n\n function extend(base: typeof chainInstance) {\n type ExtendFn = (base: typeof chainInstance) => unknown\n return (fnOrExtended: ExtendFn | Record) => {\n const properties = (\n typeof fnOrExtended === 'function' ? fnOrExtended(base) : fnOrExtended\n ) as (typeof chainInstance)['extendSchema']\n const combined = { ...base, ...properties }\n return Object.assign(combined, { extend: extend(combined) })\n }\n }\n\n return Object.assign(chainInstance, {\n extend: extend(chainInstance),\n }) as never\n}\n\nexport function extendSchema>(): schema {\n return {} as schema\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\nexport type WithTimeoutErrorType = ErrorType\n\nexport function withTimeout(\n fn: ({\n signal,\n }: {\n signal: AbortController['signal'] | null\n }) => Promise,\n {\n errorInstance = new Error('timed out'),\n timeout,\n signal,\n }: {\n // The error instance to throw when the timeout is reached.\n errorInstance?: Error | undefined\n // The timeout (in ms).\n timeout: number\n // Whether or not the timeout should use an abort signal.\n signal?: boolean | undefined\n },\n): Promise {\n return new Promise((resolve, reject) => {\n ;(async () => {\n let timeoutId!: NodeJS.Timeout\n try {\n const controller = new AbortController()\n if (timeout > 0) {\n timeoutId = setTimeout(() => {\n if (signal) {\n controller.abort()\n } else {\n reject(errorInstance)\n }\n }, timeout) as NodeJS.Timeout // need to cast because bun globals.d.ts overrides @types/node\n }\n resolve(await fn({ signal: controller?.signal || null }))\n } catch (err) {\n if ((err as Error)?.name === 'AbortError') reject(errorInstance)\n reject(err)\n } finally {\n clearTimeout(timeoutId)\n }\n })()\n })\n}\n","function createIdStore() {\n return {\n current: 0,\n take() {\n return this.current++\n },\n reset() {\n this.current = 0\n },\n }\n}\n\nexport const idCache = /*#__PURE__*/ createIdStore()\n","import {\n HttpRequestError,\n type HttpRequestErrorType as HttpRequestErrorType_,\n TimeoutError,\n type TimeoutErrorType,\n} from '../../errors/request.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { RpcRequest, RpcResponse } from '../../types/rpc.js'\nimport type { MaybePromise } from '../../types/utils.js'\nimport {\n type WithTimeoutErrorType,\n withTimeout,\n} from '../promise/withTimeout.js'\nimport { stringify } from '../stringify.js'\nimport { idCache } from './id.js'\n\nexport type HttpRpcClientOptions = {\n /** Override for the fetch function used to make requests. */\n fetchFn?:\n | ((input: string | URL | Request, init?: RequestInit) => Promise)\n | undefined\n /** Request configuration to pass to `fetch`. */\n fetchOptions?: Omit | undefined\n /** A callback to handle the request. */\n onRequest?:\n | ((\n request: Request,\n init: RequestInit,\n ) => MaybePromise<\n void | undefined | (RequestInit & { url?: string | undefined })\n >)\n | undefined\n /** A callback to handle the response. */\n onResponse?: ((response: Response) => Promise | void) | undefined\n /** The timeout (in ms) for the request. */\n timeout?: number | undefined\n}\n\nexport type HttpRequestParameters<\n body extends RpcRequest | RpcRequest[] = RpcRequest,\n> = {\n /** The RPC request body. */\n body: body\n /** Override for the fetch function used to make requests. */\n fetchFn?: HttpRpcClientOptions['fetchFn'] | undefined\n /** Request configuration to pass to `fetch`. */\n fetchOptions?: HttpRpcClientOptions['fetchOptions'] | undefined\n /** A callback to handle the response. */\n onRequest?:\n | ((\n request: Request,\n init: RequestInit,\n ) => MaybePromise<\n void | undefined | (RequestInit & { url?: string | undefined })\n >)\n | undefined\n /** A callback to handle the response. */\n onResponse?: ((response: Response) => Promise | void) | undefined\n /** The timeout (in ms) for the request. */\n timeout?: HttpRpcClientOptions['timeout'] | undefined\n}\n\nexport type HttpRequestReturnType<\n body extends RpcRequest | RpcRequest[] = RpcRequest,\n> = body extends RpcRequest[] ? RpcResponse[] : RpcResponse\n\nexport type HttpRequestErrorType =\n | HttpRequestErrorType_\n | TimeoutErrorType\n | WithTimeoutErrorType\n | ErrorType\n\nexport type HttpRpcClient = {\n request(\n params: HttpRequestParameters,\n ): Promise>\n}\n\nexport function getHttpRpcClient(\n url_: string,\n options: HttpRpcClientOptions = {},\n): HttpRpcClient {\n const { url, headers: headers_url } = parseUrl(url_)\n\n return {\n async request(params) {\n const {\n body,\n fetchFn = options.fetchFn ?? fetch,\n onRequest = options.onRequest,\n onResponse = options.onResponse,\n timeout = options.timeout ?? 10_000,\n } = params\n\n const fetchOptions = {\n ...(options.fetchOptions ?? {}),\n ...(params.fetchOptions ?? {}),\n }\n\n const { headers, method, signal: signal_ } = fetchOptions\n\n try {\n const response = await withTimeout(\n async ({ signal }) => {\n const init: RequestInit = {\n ...fetchOptions,\n body: Array.isArray(body)\n ? stringify(\n body.map((body) => ({\n jsonrpc: '2.0',\n id: body.id ?? idCache.take(),\n ...body,\n })),\n )\n : stringify({\n jsonrpc: '2.0',\n id: body.id ?? idCache.take(),\n ...body,\n }),\n headers: {\n ...headers_url,\n 'Content-Type': 'application/json',\n ...headers,\n },\n method: method || 'POST',\n signal: signal_ || (timeout > 0 ? signal : null),\n }\n const request = new Request(url, init)\n const args = (await onRequest?.(request, init)) ?? { ...init, url }\n const response = await fetchFn(args.url ?? url, args)\n return response\n },\n {\n errorInstance: new TimeoutError({ body, url }),\n timeout,\n signal: true,\n },\n )\n\n if (onResponse) await onResponse(response)\n\n let data: any\n if (\n response.headers.get('Content-Type')?.startsWith('application/json')\n )\n data = await response.json()\n else {\n data = await response.text()\n try {\n data = JSON.parse(data || '{}')\n } catch (err) {\n if (response.ok) throw err\n data = { error: data }\n }\n }\n\n if (!response.ok) {\n // If the response body contains a valid JSON-RPC error, return it\n // so it flows through the normal RPC error handling pipeline.\n if (\n typeof data.error?.code === 'number' &&\n typeof data.error?.message === 'string'\n )\n return data\n\n throw new HttpRequestError({\n body,\n details: stringify(data.error) || response.statusText,\n headers: response.headers,\n status: response.status,\n url,\n })\n }\n\n return data\n } catch (err) {\n if (err instanceof HttpRequestError) throw err\n if (err instanceof TimeoutError) throw err\n throw new HttpRequestError({\n body,\n cause: err as Error,\n url,\n })\n }\n },\n }\n}\n\n/** @internal */\nexport function parseUrl(url_: string) {\n try {\n const url = new URL(url_)\n\n const result = (() => {\n // Handle Basic authentication credentials\n if (url.username) {\n const credentials = `${decodeURIComponent(url.username)}:${decodeURIComponent(url.password)}`\n url.username = ''\n url.password = ''\n\n return {\n url: url.toString(),\n headers: { Authorization: `Basic ${btoa(credentials)}` },\n }\n }\n\n return\n })()\n\n return { url: url.toString(), ...result }\n } catch {\n return { url: url_ }\n }\n}\n","export const presignMessagePrefix = '\\x19Ethereum Signed Message:\\n'\n","import { presignMessagePrefix } from '../../constants/strings.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex, SignableMessage } from '../../types/misc.js'\nimport { type ConcatErrorType, concat } from '../data/concat.js'\nimport { size } from '../data/size.js'\nimport {\n type BytesToHexErrorType,\n bytesToHex,\n type StringToHexErrorType,\n stringToHex,\n} from '../encoding/toHex.js'\n\nexport type ToPrefixedMessageErrorType =\n | ConcatErrorType\n | StringToHexErrorType\n | BytesToHexErrorType\n | ErrorType\n\nexport function toPrefixedMessage(message_: SignableMessage): Hex {\n const message = (() => {\n if (typeof message_ === 'string') return stringToHex(message_)\n if (typeof message_.raw === 'string') return message_.raw\n return bytesToHex(message_.raw)\n })()\n const prefix = stringToHex(`${presignMessagePrefix}${size(message)}`)\n return concat([prefix, message])\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, SignableMessage } from '../../types/misc.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport { toPrefixedMessage } from './toPrefixedMessage.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type HashMessageReturnType =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type HashMessageErrorType = Keccak256ErrorType | ErrorType\n\nexport function hashMessage(\n message: SignableMessage,\n to_?: to | undefined,\n): HashMessageReturnType {\n return keccak256(toPrefixedMessage(message), to_)\n}\n","import type { TypedData } from 'abitype'\n\nimport { stringify } from '../utils/stringify.js'\nimport { BaseError } from './base.js'\n\nexport type InvalidDomainErrorType = InvalidDomainError & {\n name: 'InvalidDomainError'\n}\nexport class InvalidDomainError extends BaseError {\n constructor({ domain }: { domain: unknown }) {\n super(`Invalid domain \"${stringify(domain)}\".`, {\n metaMessages: ['Must be a valid EIP-712 domain.'],\n })\n }\n}\n\nexport type InvalidPrimaryTypeErrorType = InvalidPrimaryTypeError & {\n name: 'InvalidPrimaryTypeError'\n}\nexport class InvalidPrimaryTypeError extends BaseError {\n constructor({\n primaryType,\n types,\n }: { primaryType: string; types: TypedData | Record }) {\n super(\n `Invalid primary type \\`${primaryType}\\` must be one of \\`${JSON.stringify(Object.keys(types))}\\`.`,\n {\n docsPath: '/api/glossary/Errors#typeddatainvalidprimarytypeerror',\n metaMessages: ['Check that the primary type is a key in `types`.'],\n },\n )\n }\n}\n\nexport type InvalidStructTypeErrorType = InvalidStructTypeError & {\n name: 'InvalidStructTypeError'\n}\nexport class InvalidStructTypeError extends BaseError {\n constructor({ type }: { type: string }) {\n super(`Struct type \"${type}\" is invalid.`, {\n metaMessages: ['Struct type must not be a Solidity type.'],\n name: 'InvalidStructTypeError',\n })\n }\n}\n","import type { TypedData, TypedDataDomain, TypedDataParameter } from 'abitype'\n\nimport { BytesSizeMismatchError } from '../errors/abi.js'\nimport { InvalidAddressError } from '../errors/address.js'\nimport {\n InvalidDomainError,\n InvalidPrimaryTypeError,\n InvalidStructTypeError,\n} from '../errors/typedData.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Hex } from '../types/misc.js'\nimport type { TypedDataDefinition } from '../types/typedData.js'\nimport { type IsAddressErrorType, isAddress } from './address/isAddress.js'\nimport { type SizeErrorType, size } from './data/size.js'\nimport { type NumberToHexErrorType, numberToHex } from './encoding/toHex.js'\nimport { bytesRegex, integerRegex } from './regex.js'\nimport {\n type HashDomainErrorType,\n hashDomain,\n} from './signature/hashTypedData.js'\nimport { stringify } from './stringify.js'\n\nexport type SerializeTypedDataErrorType =\n | HashDomainErrorType\n | IsAddressErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nexport function serializeTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(parameters: TypedDataDefinition) {\n const {\n domain: domain_,\n message: message_,\n primaryType,\n types,\n } = parameters as unknown as TypedDataDefinition\n\n const normalizeData = (\n struct: readonly TypedDataParameter[],\n data_: Record,\n ) => {\n const data = { ...data_ }\n for (const param of struct) {\n const { name, type } = param\n if (type === 'address') data[name] = (data[name] as string).toLowerCase()\n }\n return data\n }\n\n const domain = (() => {\n if (!types.EIP712Domain) return {}\n if (!domain_) return {}\n return normalizeData(types.EIP712Domain, domain_)\n })()\n\n const message = (() => {\n if (primaryType === 'EIP712Domain') return undefined\n return normalizeData(types[primaryType], message_)\n })()\n\n return stringify({ domain, message, primaryType, types })\n}\n\nexport type ValidateTypedDataErrorType =\n | HashDomainErrorType\n | IsAddressErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nexport function validateTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(parameters: TypedDataDefinition) {\n const { domain, message, primaryType, types } =\n parameters as unknown as TypedDataDefinition\n\n const validateData = (\n struct: readonly TypedDataParameter[],\n data: Record,\n ) => {\n for (const param of struct) {\n const { name, type } = param\n const value = data[name]\n\n const integerMatch = type.match(integerRegex)\n if (\n integerMatch &&\n (typeof value === 'number' || typeof value === 'bigint')\n ) {\n const [_type, base, size_] = integerMatch\n // If number cannot be cast to a sized hex value, it is out of range\n // and will throw.\n numberToHex(value, {\n signed: base === 'int',\n size: Number.parseInt(size_, 10) / 8,\n })\n }\n\n if (type === 'address' && typeof value === 'string' && !isAddress(value))\n throw new InvalidAddressError({ address: value })\n\n const bytesMatch = type.match(bytesRegex)\n if (bytesMatch) {\n const [_type, size_] = bytesMatch\n if (size_ && size(value as Hex) !== Number.parseInt(size_, 10))\n throw new BytesSizeMismatchError({\n expectedSize: Number.parseInt(size_, 10),\n givenSize: size(value as Hex),\n })\n }\n\n const struct = types[type]\n if (struct) {\n validateReference(type)\n validateData(struct, value as Record)\n }\n }\n }\n\n // Validate domain types.\n if (types.EIP712Domain && domain) {\n if (typeof domain !== 'object') throw new InvalidDomainError({ domain })\n validateData(types.EIP712Domain, domain)\n }\n\n // Validate message types.\n if (primaryType !== 'EIP712Domain') {\n if (types[primaryType]) validateData(types[primaryType], message)\n else throw new InvalidPrimaryTypeError({ primaryType, types })\n }\n}\n\nexport type GetTypesForEIP712DomainErrorType = ErrorType\n\nexport function getTypesForEIP712Domain({\n domain,\n}: {\n domain?: TypedDataDomain | undefined\n}): TypedDataParameter[] {\n return [\n typeof domain?.name === 'string' && { name: 'name', type: 'string' },\n domain?.version && { name: 'version', type: 'string' },\n (typeof domain?.chainId === 'number' ||\n typeof domain?.chainId === 'bigint') && {\n name: 'chainId',\n type: 'uint256',\n },\n domain?.verifyingContract && {\n name: 'verifyingContract',\n type: 'address',\n },\n domain?.salt && { name: 'salt', type: 'bytes32' },\n ].filter(Boolean) as TypedDataParameter[]\n}\n\nexport type DomainSeparatorErrorType =\n | GetTypesForEIP712DomainErrorType\n | HashDomainErrorType\n | ErrorType\n\nexport function domainSeparator({ domain }: { domain: TypedDataDomain }): Hex {\n return hashDomain({\n domain: domain as never,\n types: {\n EIP712Domain: getTypesForEIP712Domain({ domain }),\n },\n })\n}\n\n/** @internal */\nfunction validateReference(type: string) {\n // Struct type must not be a Solidity type.\n if (\n type === 'address' ||\n type === 'bool' ||\n type === 'string' ||\n type.startsWith('bytes') ||\n type.startsWith('uint') ||\n type.startsWith('int')\n )\n throw new InvalidStructTypeError({ type })\n}\n","// Implementation forked and adapted from https://github.com/MetaMask/eth-sig-util/blob/main/src/sign-typed-data.ts\n\nimport type { AbiParameter, TypedData } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n EIP712DomainDefinition,\n MessageDefinition,\n TypedDataDefinition,\n} from '../../types/typedData.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from '../abi/encodeAbiParameters.js'\nimport { concat } from '../data/concat.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type GetTypesForEIP712DomainErrorType,\n getTypesForEIP712Domain,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from '../typedData.js'\n\ntype MessageTypeProperty = {\n name: string\n type: string\n}\n\nexport type HashTypedDataParameters<\n typedData extends TypedData | Record = TypedData,\n primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n> = TypedDataDefinition\n\nexport type HashTypedDataReturnType = Hex\n\nexport type HashTypedDataErrorType =\n | GetTypesForEIP712DomainErrorType\n | HashDomainErrorType\n | HashStructErrorType\n | ValidateTypedDataErrorType\n | ErrorType\n\nexport function hashTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(\n parameters: HashTypedDataParameters,\n): HashTypedDataReturnType {\n const {\n domain = {},\n message,\n primaryType,\n } = parameters as HashTypedDataParameters\n const types = {\n EIP712Domain: getTypesForEIP712Domain({ domain }),\n ...parameters.types,\n }\n\n // Need to do a runtime validation check on addresses, byte ranges, integer ranges, etc\n // as we can't statically check this with TypeScript.\n validateTypedData({\n domain,\n message,\n primaryType,\n types,\n })\n\n const parts: Hex[] = ['0x1901']\n if (domain)\n parts.push(\n hashDomain({\n domain,\n types: types as Record,\n }),\n )\n\n if (primaryType !== 'EIP712Domain')\n parts.push(\n hashStruct({\n data: message,\n primaryType,\n types: types as Record,\n }),\n )\n\n return keccak256(concat(parts))\n}\n\nexport type HashDomainErrorType = HashStructErrorType | ErrorType\n\nexport function hashDomain<\n const typedData extends TypedData | Record = TypedData,\n>({\n domain,\n types,\n}: UnionOmit, 'primaryType'>) {\n return hashStruct({\n data: domain as Record,\n primaryType: 'EIP712Domain',\n types: types as Record,\n })\n}\n\nexport type HashStructErrorType =\n | EncodeDataErrorType\n | Keccak256ErrorType\n | ErrorType\n\nexport function hashStruct<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>({\n data,\n primaryType,\n types,\n}: MessageDefinition) {\n const encoded = encodeData({\n data: data as Record,\n primaryType,\n types: types as Record,\n })\n return keccak256(encoded)\n}\n\ntype EncodeDataErrorType =\n | EncodeAbiParametersErrorType\n | EncodeFieldErrorType\n | HashTypeErrorType\n | ErrorType\n\nfunction encodeData({\n data,\n primaryType,\n types,\n}: {\n data: Record\n primaryType: string\n types: Record\n}) {\n const encodedTypes: AbiParameter[] = [{ type: 'bytes32' }]\n const encodedValues: unknown[] = [hashType({ primaryType, types })]\n\n for (const field of types[primaryType]) {\n const [type, value] = encodeField({\n types,\n name: field.name,\n type: field.type,\n value: data[field.name],\n })\n encodedTypes.push(type)\n encodedValues.push(value)\n }\n\n return encodeAbiParameters(encodedTypes, encodedValues)\n}\n\ntype HashTypeErrorType =\n | ToHexErrorType\n | EncodeTypeErrorType\n | Keccak256ErrorType\n | ErrorType\n\nfunction hashType({\n primaryType,\n types,\n}: {\n primaryType: string\n types: Record\n}) {\n const encodedHashType = toHex(encodeType({ primaryType, types }))\n return keccak256(encodedHashType)\n}\n\ntype EncodeTypeErrorType = FindTypeDependenciesErrorType\n\nexport function encodeType({\n primaryType,\n types,\n}: {\n primaryType: string\n types: Record\n}) {\n let result = ''\n const unsortedDeps = findTypeDependencies({ primaryType, types })\n unsortedDeps.delete(primaryType)\n\n const deps = [primaryType, ...Array.from(unsortedDeps).sort()]\n for (const type of deps) {\n result += `${type}(${types[type]\n .map(({ name, type: t }) => `${t} ${name}`)\n .join(',')})`\n }\n\n return result\n}\n\ntype FindTypeDependenciesErrorType = ErrorType\n\nfunction findTypeDependencies(\n {\n primaryType: primaryType_,\n types,\n }: {\n primaryType: string\n types: Record\n },\n results: Set = new Set(),\n): Set {\n const match = primaryType_.match(/^\\w*/u)\n const primaryType = match?.[0]!\n if (results.has(primaryType) || types[primaryType] === undefined) {\n return results\n }\n\n results.add(primaryType)\n\n for (const field of types[primaryType]) {\n findTypeDependencies({ primaryType: field.type, types }, results)\n }\n return results\n}\n\ntype EncodeFieldErrorType =\n | Keccak256ErrorType\n | EncodeAbiParametersErrorType\n | ToHexErrorType\n | ErrorType\n\nfunction encodeField({\n types,\n name,\n type,\n value,\n}: {\n types: Record\n name: string\n type: string\n value: any\n}): [type: AbiParameter, value: any] {\n if (types[type] !== undefined) {\n return [\n { type: 'bytes32' },\n keccak256(encodeData({ data: value, primaryType: type, types })),\n ]\n }\n\n if (type === 'bytes') return [{ type: 'bytes32' }, keccak256(value)]\n\n if (type === 'string') return [{ type: 'bytes32' }, keccak256(toHex(value))]\n\n if (type.lastIndexOf(']') === type.length - 1) {\n const parsedType = type.slice(0, type.lastIndexOf('['))\n const typeValuePairs = (value as [AbiParameter, any][]).map((item) =>\n encodeField({\n name,\n type: parsedType,\n types,\n value: item,\n }),\n )\n return [\n { type: 'bytes32' },\n keccak256(\n encodeAbiParameters(\n typeValuePairs.map(([t]) => t),\n typeValuePairs.map(([, v]) => v),\n ),\n ),\n ]\n }\n\n return [{ type }, value]\n}\n","/**\n * @internal\n *\n * Map with a LRU (Least recently used) policy.\n * @see https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n */\nexport class LruMap extends Map {\n maxSize: number\n\n constructor(size: number) {\n super()\n this.maxSize = size\n }\n\n override get(key: string) {\n const value = super.get(key)\n\n if (super.has(key) && value !== undefined) {\n this.delete(key)\n super.set(key, value)\n }\n\n return value\n }\n\n override set(key: string, value: value) {\n super.set(key, value)\n if (this.maxSize && this.size > this.maxSize) {\n const firstKey = this.keys().next().value\n if (firstKey) this.delete(firstKey)\n }\n return this\n }\n}\n","import type * as Address from './Address.js'\nimport { LruMap } from './internal/lru.js'\n\nconst caches = {\n checksum: /*#__PURE__*/ new LruMap(8192),\n}\n\nexport const checksum = caches.checksum\n\n/**\n * Clears all global caches.\n *\n * @example\n * ```ts\n * import { Caches } from 'ox'\n * Caches.clear()\n * ```\n */\nexport function clear() {\n for (const cache of Object.values(caches)) cache.clear()\n}\n","import { hmac } from '@noble/hashes/hmac'\nimport { ripemd160 as noble_ripemd160 } from '@noble/hashes/ripemd160'\nimport { keccak_256 as noble_keccak256 } from '@noble/hashes/sha3'\nimport { sha256 as noble_sha256 } from '@noble/hashes/sha256'\nimport * as Bytes from './Bytes.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\n\n/**\n * Calculates the [Keccak256](https://en.wikipedia.org/wiki/SHA-3) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `keccak_256` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.keccak256('0xdeadbeef')\n * // @log: '0xd4fd4e189132273036449fc9e11198c739161b4c0116a9a2dccdfa1c492006f1'\n * ```\n *\n * @example\n * ### Calculate Hash of a String\n *\n * ```ts twoslash\n * import { Hash, Hex } from 'ox'\n *\n * Hash.keccak256(Hex.fromString('hello world'))\n * // @log: '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0'\n * ```\n *\n * @example\n * ### Configure Return Type\n *\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.keccak256('0xdeadbeef', { as: 'Bytes' })\n * // @log: Uint8Array [...]\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Keccak256 hash.\n */\nexport function keccak256<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n value: value | Hex.Hex | Bytes.Bytes,\n options: keccak256.Options = {},\n): keccak256.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = noble_keccak256(Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace keccak256 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Calculates the [HMAC-SHA256](https://en.wikipedia.org/wiki/HMAC) of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `hmac` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash, Hex } from 'ox'\n *\n * Hash.hmac256(Hex.fromString('key'), '0xdeadbeef')\n * // @log: '0x...'\n * ```\n *\n * @example\n * ### Configure Return Type\n *\n * ```ts twoslash\n * import { Hash, Hex } from 'ox'\n *\n * Hash.hmac256(Hex.fromString('key'), '0xdeadbeef', { as: 'Bytes' })\n * // @log: Uint8Array [...]\n * ```\n *\n * @param key - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} key.\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns HMAC-SHA256 hash.\n */\nexport function hmac256<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n key: Hex.Hex | Bytes.Bytes,\n value: value | Hex.Hex | Bytes.Bytes,\n options: hmac256.Options = {},\n): hmac256.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = hmac(noble_sha256, Bytes.from(key), Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace hmac256 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Calculates the [Ripemd160](https://en.wikipedia.org/wiki/RIPEMD) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `ripemd160` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.ripemd160('0xdeadbeef')\n * // '0x226821c2f5423e11fe9af68bd285c249db2e4b5a'\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Ripemd160 hash.\n */\nexport function ripemd160<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n value: value | Hex.Hex | Bytes.Bytes,\n options: ripemd160.Options = {},\n): ripemd160.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = noble_ripemd160(Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace ripemd160 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Calculates the [Sha256](https://en.wikipedia.org/wiki/SHA-256) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `sha256` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.sha256('0xdeadbeef')\n * // '0x5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953'\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Sha256 hash.\n */\nexport function sha256<\n value extends Hex.Hex | Bytes.Bytes,\n as extends 'Hex' | 'Bytes' =\n | (value extends Hex.Hex ? 'Hex' : never)\n | (value extends Bytes.Bytes ? 'Bytes' : never),\n>(\n value: value | Hex.Hex | Bytes.Bytes,\n options: sha256.Options = {},\n): sha256.ReturnType {\n const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options\n const bytes = noble_sha256(Bytes.from(value))\n if (as === 'Bytes') return bytes as never\n return Hex.fromBytes(bytes) as never\n}\n\nexport declare namespace sha256 {\n type Options = {\n /** The return type. @default 'Hex' */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Bytes.from.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if a string is a valid hash value.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.validate('0x')\n * // @log: false\n *\n * Hash.validate('0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0')\n * // @log: true\n * ```\n *\n * @param value - Value to check.\n * @returns Whether the value is a valid hash.\n */\nexport function validate(value: string): value is Hex.Hex {\n return Hex.validate(value) && Hex.size(value) === 32\n}\n\nexport declare namespace validate {\n type ErrorType =\n | Hex.validate.ErrorType\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n","import * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type { Compute, ExactPartial } from './internal/types.js'\nimport * as Json from './Json.js'\n\n/** Root type for an ECDSA Public Key. */\nexport type PublicKey<\n compressed extends boolean = false,\n bigintType = bigint,\n numberType = number,\n> = Compute<\n compressed extends true\n ? {\n prefix: numberType\n x: bigintType\n y?: undefined\n }\n : {\n prefix: numberType\n x: bigintType\n y: bigintType\n }\n>\n\n/**\n * Asserts that a {@link ox#PublicKey.PublicKey} is valid.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * PublicKey.assert({\n * prefix: 4,\n * y: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * })\n * // @error: PublicKey.InvalidError: Value \\`{\"y\":\"1\"}\\` is not a valid public key.\n * // @error: Public key must contain:\n * // @error: - an `x` and `prefix` value (compressed)\n * // @error: - an `x`, `y`, and `prefix` value (uncompressed)\n * ```\n *\n * @param publicKey - The public key object to assert.\n */\nexport function assert(\n publicKey: ExactPartial,\n options: assert.Options = {},\n): asserts publicKey is PublicKey {\n const { compressed } = options\n const { prefix, x, y } = publicKey\n\n // Uncompressed\n if (\n compressed === false ||\n (typeof x === 'bigint' && typeof y === 'bigint')\n ) {\n if (prefix !== 4)\n throw new InvalidPrefixError({\n prefix,\n cause: new InvalidUncompressedPrefixError(),\n })\n return\n }\n\n // Compressed\n if (\n compressed === true ||\n (typeof x === 'bigint' && typeof y === 'undefined')\n ) {\n if (prefix !== 3 && prefix !== 2)\n throw new InvalidPrefixError({\n prefix,\n cause: new InvalidCompressedPrefixError(),\n })\n return\n }\n\n // Unknown/invalid\n throw new InvalidError({ publicKey })\n}\n\nexport declare namespace assert {\n type Options = {\n /** Whether or not the public key should be compressed. */\n compressed?: boolean\n }\n\n type ErrorType = InvalidError | InvalidPrefixError | Errors.GlobalErrorType\n}\n\n/**\n * Compresses a {@link ox#PublicKey.PublicKey}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const compressed = PublicKey.compress(publicKey) // [!code focus]\n * // @log: {\n * // @log: prefix: 3,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: }\n * ```\n *\n * @param publicKey - The public key to compress.\n * @returns The compressed public key.\n */\nexport function compress(publicKey: PublicKey): PublicKey {\n const { x, y } = publicKey\n return {\n prefix: y % 2n === 0n ? 2 : 3,\n x,\n }\n}\n\nexport declare namespace compress {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a typed {@link ox#PublicKey.PublicKey} object from a {@link ox#PublicKey.PublicKey}, {@link ox#Bytes.Bytes}, or {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @example\n * ### From Serialized\n *\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from('0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5')\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @param value - The public key value to instantiate.\n * @returns The instantiated {@link ox#PublicKey.PublicKey}.\n */\nexport function from<\n const publicKey extends\n | CompressedPublicKey\n | UncompressedPublicKey\n | Hex.Hex\n | Bytes.Bytes,\n>(value: from.Value): from.ReturnType {\n const publicKey = (() => {\n if (Hex.validate(value)) return fromHex(value)\n if (Bytes.validate(value)) return fromBytes(value)\n\n const { prefix, x, y } = value\n if (typeof x === 'bigint' && typeof y === 'bigint')\n return { prefix: prefix ?? 0x04, x, y }\n return { prefix, x }\n })()\n\n assert(publicKey)\n\n return publicKey as never\n}\n\n/** @internal */\ntype CompressedPublicKey = PublicKey\n\n/** @internal */\ntype UncompressedPublicKey = Omit, 'prefix'> & {\n prefix?: PublicKey['prefix'] | undefined\n}\n\nexport declare namespace from {\n type Value<\n publicKey extends\n | CompressedPublicKey\n | UncompressedPublicKey\n | Hex.Hex\n | Bytes.Bytes = PublicKey,\n > = publicKey | CompressedPublicKey | UncompressedPublicKey\n\n type ReturnType<\n publicKey extends\n | CompressedPublicKey\n | UncompressedPublicKey\n | Hex.Hex\n | Bytes.Bytes = PublicKey,\n > = publicKey extends CompressedPublicKey | UncompressedPublicKey\n ? publicKey extends UncompressedPublicKey\n ? Compute\n : publicKey\n : PublicKey\n\n type ErrorType = assert.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#PublicKey.PublicKey} from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromBytes(new Uint8Array([128, 3, 131, ...]))\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @param publicKey - The serialized public key.\n * @returns The deserialized public key.\n */\nexport function fromBytes(publicKey: Bytes.Bytes): PublicKey {\n return fromHex(Hex.fromBytes(publicKey))\n}\n\nexport declare namespace fromBytes {\n type ErrorType =\n | fromHex.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#PublicKey.PublicKey} from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromHex('0x8318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5')\n * // @log: {\n * // @log: prefix: 4,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @example\n * ### Deserializing a Compressed Public Key\n *\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromHex('0x038318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed75')\n * // @log: {\n * // @log: prefix: 3,\n * // @log: x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: }\n * ```\n *\n * @param publicKey - The serialized public key.\n * @returns The deserialized public key.\n */\nexport function fromHex(publicKey: Hex.Hex): PublicKey {\n if (\n publicKey.length !== 132 &&\n publicKey.length !== 130 &&\n publicKey.length !== 68\n )\n throw new InvalidSerializedSizeError({ publicKey })\n\n if (publicKey.length === 130) {\n const x = BigInt(Hex.slice(publicKey, 0, 32))\n const y = BigInt(Hex.slice(publicKey, 32, 64))\n return {\n prefix: 4,\n x,\n y,\n } as never\n }\n\n if (publicKey.length === 132) {\n const prefix = Number(Hex.slice(publicKey, 0, 1))\n const x = BigInt(Hex.slice(publicKey, 1, 33))\n const y = BigInt(Hex.slice(publicKey, 33, 65))\n return {\n prefix,\n x,\n y,\n } as never\n }\n\n const prefix = Number(Hex.slice(publicKey, 0, 1))\n const x = BigInt(Hex.slice(publicKey, 1, 33))\n return {\n prefix,\n x,\n } as never\n}\n\nexport declare namespace fromHex {\n type ErrorType = Hex.slice.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#PublicKey.PublicKey} to {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const bytes = PublicKey.toBytes(publicKey) // [!code focus]\n * // @log: Uint8Array [128, 3, 131, ...]\n * ```\n *\n * @param publicKey - The public key to serialize.\n * @returns The serialized public key.\n */\nexport function toBytes(\n publicKey: PublicKey,\n options: toBytes.Options = {},\n): Bytes.Bytes {\n return Bytes.fromHex(toHex(publicKey, options))\n}\n\nexport declare namespace toBytes {\n type Options = {\n /**\n * Whether to include the prefix in the serialized public key.\n * @default true\n */\n includePrefix?: boolean | undefined\n }\n\n type ErrorType =\n | Hex.fromNumber.ErrorType\n | Bytes.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#PublicKey.PublicKey} to {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n * prefix: 4,\n * x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const hex = PublicKey.toHex(publicKey) // [!code focus]\n * // @log: '0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5'\n * ```\n *\n * @param publicKey - The public key to serialize.\n * @returns The serialized public key.\n */\nexport function toHex(\n publicKey: PublicKey,\n options: toHex.Options = {},\n): Hex.Hex {\n assert(publicKey)\n\n const { prefix, x, y } = publicKey\n const { includePrefix = true } = options\n\n const publicKey_ = Hex.concat(\n includePrefix ? Hex.fromNumber(prefix, { size: 1 }) : '0x',\n Hex.fromNumber(x, { size: 32 }),\n // If the public key is not compressed, add the y coordinate.\n typeof y === 'bigint' ? Hex.fromNumber(y, { size: 32 }) : '0x',\n )\n\n return publicKey_\n}\n\nexport declare namespace toHex {\n type Options = {\n /**\n * Whether to include the prefix in the serialized public key.\n * @default true\n */\n includePrefix?: boolean | undefined\n }\n\n type ErrorType = Hex.fromNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Validates a {@link ox#PublicKey.PublicKey}. Returns `true` if valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const valid = PublicKey.validate({\n * prefix: 4,\n * y: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * })\n * // @log: false\n * ```\n *\n * @param publicKey - The public key object to assert.\n */\nexport function validate(\n publicKey: ExactPartial,\n options: validate.Options = {},\n): boolean {\n try {\n assert(publicKey, options)\n return true\n } catch (_error) {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /** Whether or not the public key should be compressed. */\n compressed?: boolean\n }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Thrown when a public key is invalid.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * PublicKey.assert({ y: 1n })\n * // @error: PublicKey.InvalidError: Value `{\"y\":1n}` is not a valid public key.\n * // @error: Public key must contain:\n * // @error: - an `x` and `prefix` value (compressed)\n * // @error: - an `x`, `y`, and `prefix` value (uncompressed)\n * ```\n */\nexport class InvalidError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidError'\n\n constructor({ publicKey }: { publicKey: unknown }) {\n super(`Value \\`${Json.stringify(publicKey)}\\` is not a valid public key.`, {\n metaMessages: [\n 'Public key must contain:',\n '- an `x` and `prefix` value (compressed)',\n '- an `x`, `y`, and `prefix` value (uncompressed)',\n ],\n })\n }\n}\n\n/** Thrown when a public key has an invalid prefix. */\nexport class InvalidPrefixError<\n cause extends InvalidCompressedPrefixError | InvalidUncompressedPrefixError =\n | InvalidCompressedPrefixError\n | InvalidUncompressedPrefixError,\n> extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidPrefixError'\n\n constructor({ prefix, cause }: { prefix: number | undefined; cause: cause }) {\n super(`Prefix \"${prefix}\" is invalid.`, {\n cause,\n })\n }\n}\n\n/** Thrown when the public key has an invalid prefix for a compressed public key. */\nexport class InvalidCompressedPrefixError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidCompressedPrefixError'\n\n constructor() {\n super('Prefix must be 2 or 3 for compressed public keys.')\n }\n}\n\n/** Thrown when the public key has an invalid prefix for an uncompressed public key. */\nexport class InvalidUncompressedPrefixError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidUncompressedPrefixError'\n\n constructor() {\n super('Prefix must be 4 for uncompressed public keys.')\n }\n}\n\n/** Thrown when the public key has an invalid serialized size. */\nexport class InvalidSerializedSizeError extends Errors.BaseError {\n override readonly name = 'PublicKey.InvalidSerializedSizeError'\n\n constructor({ publicKey }: { publicKey: Hex.Hex | Bytes.Bytes }) {\n super(`Value \\`${publicKey}\\` is an invalid public key size.`, {\n metaMessages: [\n 'Expected: 33 bytes (compressed + prefix), 64 bytes (uncompressed) or 65 bytes (uncompressed + prefix).',\n `Received ${Hex.size(Hex.from(publicKey))} bytes.`,\n ],\n })\n }\n}\n","import type { Address as abitype_Address } from 'abitype'\nimport * as Bytes from './Bytes.js'\nimport * as Caches from './Caches.js'\nimport * as Errors from './Errors.js'\nimport * as Hash from './Hash.js'\nimport * as PublicKey from './PublicKey.js'\n\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/\n\n/** Root type for Address. */\nexport type Address = abitype_Address\n\n/**\n * Asserts that the given value is a valid {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.assert('0xA0Cf798816D4b9b9866b5330EEa46a18382f251e')\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.assert('0xdeadbeef')\n * // @error: InvalidAddressError: Address \"0xdeadbeef\" is invalid.\n * ```\n *\n * @param value - Value to assert if it is a valid address.\n * @param options - Assertion options.\n */\nexport function assert(\n value: string,\n options: assert.Options = {},\n): asserts value is Address {\n const { strict = true } = options\n\n if (!addressRegex.test(value))\n throw new InvalidAddressError({\n address: value,\n cause: new InvalidInputError(),\n })\n\n if (strict) {\n if (value.toLowerCase() === value) return\n if (checksum(value as Address) !== value)\n throw new InvalidAddressError({\n address: value,\n cause: new InvalidChecksumError(),\n })\n }\n}\n\nexport declare namespace assert {\n type Options = {\n /**\n * Enables strict mode. Whether or not to compare the address against its checksum.\n *\n * @default true\n */\n strict?: boolean | undefined\n }\n\n type ErrorType = InvalidAddressError | Errors.GlobalErrorType\n}\n\n/**\n * Computes the checksum address for the given {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.checksum('0xa0cf798816d4b9b9866b5330eea46a18382f251e')\n * // @log: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * ```\n *\n * @param address - The address to compute the checksum for.\n * @returns The checksummed address.\n */\nexport function checksum(address: string): Address {\n if (Caches.checksum.has(address)) return Caches.checksum.get(address)!\n\n assert(address, { strict: false })\n\n const hexAddress = address.substring(2).toLowerCase()\n const hash = Hash.keccak256(Bytes.fromString(hexAddress), { as: 'Bytes' })\n\n const characters = hexAddress.split('')\n for (let i = 0; i < 40; i += 2) {\n if (hash[i >> 1]! >> 4 >= 8 && characters[i]) {\n characters[i] = characters[i]!.toUpperCase()\n }\n if ((hash[i >> 1]! & 0x0f) >= 8 && characters[i + 1]) {\n characters[i + 1] = characters[i + 1]!.toUpperCase()\n }\n }\n\n const result = `0x${characters.join('')}` as const\n Caches.checksum.set(address, result)\n return result\n}\n\nexport declare namespace checksum {\n type ErrorType =\n | assert.ErrorType\n | Hash.keccak256.ErrorType\n | Bytes.fromString.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts a stringified address to a typed (optionally checksummed) {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0xa0cf798816d4b9b9866b5330eea46a18382f251e')\n * // @log: '0xa0cf798816d4b9b9866b5330eea46a18382f251e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0xa0cf798816d4b9b9866b5330eea46a18382f251e', {\n * checksum: true\n * })\n * // @log: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('hello')\n * // @error: InvalidAddressError: Address \"0xa\" is invalid.\n * ```\n *\n * @param address - An address string to convert to a typed Address.\n * @param options - Conversion options.\n * @returns The typed Address.\n */\nexport function from(address: string, options: from.Options = {}): Address {\n const { checksum: checksumVal = false } = options\n assert(address)\n if (checksumVal) return checksum(address)\n return address as Address\n}\n\nexport declare namespace from {\n type Options = {\n /**\n * Whether to checksum the address.\n *\n * @default false\n */\n checksum?: boolean | undefined\n }\n\n type ErrorType =\n | assert.ErrorType\n | checksum.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts an ECDSA public key to an {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address, PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from(\n * '0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5',\n * )\n * const address = Address.fromPublicKey(publicKey)\n * // @log: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'\n * ```\n *\n * @param publicKey - The ECDSA public key to convert to an {@link ox#Address.Address}.\n * @param options - Conversion options.\n * @returns The {@link ox#Address.Address} corresponding to the public key.\n */\nexport function fromPublicKey(\n publicKey: PublicKey.PublicKey,\n options: fromPublicKey.Options = {},\n): Address {\n const address = Hash.keccak256(\n `0x${PublicKey.toHex(publicKey).slice(4)}`,\n ).substring(26)\n return from(`0x${address}`, options)\n}\n\nexport declare namespace fromPublicKey {\n type Options = {\n /**\n * Whether to checksum the address.\n *\n * @default false\n */\n checksum?: boolean | undefined\n }\n\n type ErrorType =\n | Hash.keccak256.ErrorType\n | PublicKey.toHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Checks if two {@link ox#Address.Address} are equal.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.isEqual(\n * '0xa0cf798816d4b9b9866b5330eea46a18382f251e',\n * '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * )\n * // @log: true\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.isEqual(\n * '0xa0cf798816d4b9b9866b5330eea46a18382f251e',\n * '0xA0Cf798816D4b9b9866b5330EEa46a18382f251f'\n * )\n * // @log: false\n * ```\n *\n * @param addressA - The first address to compare.\n * @param addressB - The second address to compare.\n * @returns Whether the addresses are equal.\n */\nexport function isEqual(addressA: Address, addressB: Address): boolean {\n assert(addressA, { strict: false })\n assert(addressB, { strict: false })\n return addressA.toLowerCase() === addressB.toLowerCase()\n}\n\nexport declare namespace isEqual {\n type ErrorType = assert.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Checks if the given address is a valid {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.validate('0xA0Cf798816D4b9b9866b5330EEa46a18382f251e')\n * // @log: true\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param address - Value to check if it is a valid address.\n * @param options - Check options.\n * @returns Whether the address is a valid address.\n */\nexport function validate(\n address: string,\n options: validate.Options = {},\n): address is Address {\n const { strict = true } = options ?? {}\n try {\n assert(address, { strict })\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /**\n * Enables strict mode. Whether or not to compare the address against its checksum.\n *\n * @default true\n */\n strict?: boolean | undefined\n }\n}\n\n/**\n * Thrown when an address is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0x123')\n * // @error: Address.InvalidAddressError: Address `0x123` is invalid.\n * ```\n */\nexport class InvalidAddressError<\n cause extends InvalidInputError | InvalidChecksumError =\n | InvalidInputError\n | InvalidChecksumError,\n> extends Errors.BaseError {\n override readonly name = 'Address.InvalidAddressError'\n\n constructor({ address, cause }: { address: string; cause: cause }) {\n super(`Address \"${address}\" is invalid.`, {\n cause,\n })\n }\n}\n\n/** Thrown when an address is not a 20 byte (40 hexadecimal character) value. */\nexport class InvalidInputError extends Errors.BaseError {\n override readonly name = 'Address.InvalidInputError'\n\n constructor() {\n super('Address is not a 20 byte (40 hexadecimal character) value.')\n }\n}\n\n/** Thrown when an address does not match its checksum counterpart. */\nexport class InvalidChecksumError extends Errors.BaseError {\n override readonly name = 'Address.InvalidChecksumError'\n\n constructor() {\n super('Address does not match its checksum counterpart.')\n }\n}\n","export const arrayRegex = /^(.*)\\[([0-9]*)\\]$/\n\n// `bytes`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/\n\n// `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex =\n /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/\n\nexport const maxInt8 = 2n ** (8n - 1n) - 1n\nexport const maxInt16 = 2n ** (16n - 1n) - 1n\nexport const maxInt24 = 2n ** (24n - 1n) - 1n\nexport const maxInt32 = 2n ** (32n - 1n) - 1n\nexport const maxInt40 = 2n ** (40n - 1n) - 1n\nexport const maxInt48 = 2n ** (48n - 1n) - 1n\nexport const maxInt56 = 2n ** (56n - 1n) - 1n\nexport const maxInt64 = 2n ** (64n - 1n) - 1n\nexport const maxInt72 = 2n ** (72n - 1n) - 1n\nexport const maxInt80 = 2n ** (80n - 1n) - 1n\nexport const maxInt88 = 2n ** (88n - 1n) - 1n\nexport const maxInt96 = 2n ** (96n - 1n) - 1n\nexport const maxInt104 = 2n ** (104n - 1n) - 1n\nexport const maxInt112 = 2n ** (112n - 1n) - 1n\nexport const maxInt120 = 2n ** (120n - 1n) - 1n\nexport const maxInt128 = 2n ** (128n - 1n) - 1n\nexport const maxInt136 = 2n ** (136n - 1n) - 1n\nexport const maxInt144 = 2n ** (144n - 1n) - 1n\nexport const maxInt152 = 2n ** (152n - 1n) - 1n\nexport const maxInt160 = 2n ** (160n - 1n) - 1n\nexport const maxInt168 = 2n ** (168n - 1n) - 1n\nexport const maxInt176 = 2n ** (176n - 1n) - 1n\nexport const maxInt184 = 2n ** (184n - 1n) - 1n\nexport const maxInt192 = 2n ** (192n - 1n) - 1n\nexport const maxInt200 = 2n ** (200n - 1n) - 1n\nexport const maxInt208 = 2n ** (208n - 1n) - 1n\nexport const maxInt216 = 2n ** (216n - 1n) - 1n\nexport const maxInt224 = 2n ** (224n - 1n) - 1n\nexport const maxInt232 = 2n ** (232n - 1n) - 1n\nexport const maxInt240 = 2n ** (240n - 1n) - 1n\nexport const maxInt248 = 2n ** (248n - 1n) - 1n\nexport const maxInt256 = 2n ** (256n - 1n) - 1n\n\nexport const minInt8 = -(2n ** (8n - 1n))\nexport const minInt16 = -(2n ** (16n - 1n))\nexport const minInt24 = -(2n ** (24n - 1n))\nexport const minInt32 = -(2n ** (32n - 1n))\nexport const minInt40 = -(2n ** (40n - 1n))\nexport const minInt48 = -(2n ** (48n - 1n))\nexport const minInt56 = -(2n ** (56n - 1n))\nexport const minInt64 = -(2n ** (64n - 1n))\nexport const minInt72 = -(2n ** (72n - 1n))\nexport const minInt80 = -(2n ** (80n - 1n))\nexport const minInt88 = -(2n ** (88n - 1n))\nexport const minInt96 = -(2n ** (96n - 1n))\nexport const minInt104 = -(2n ** (104n - 1n))\nexport const minInt112 = -(2n ** (112n - 1n))\nexport const minInt120 = -(2n ** (120n - 1n))\nexport const minInt128 = -(2n ** (128n - 1n))\nexport const minInt136 = -(2n ** (136n - 1n))\nexport const minInt144 = -(2n ** (144n - 1n))\nexport const minInt152 = -(2n ** (152n - 1n))\nexport const minInt160 = -(2n ** (160n - 1n))\nexport const minInt168 = -(2n ** (168n - 1n))\nexport const minInt176 = -(2n ** (176n - 1n))\nexport const minInt184 = -(2n ** (184n - 1n))\nexport const minInt192 = -(2n ** (192n - 1n))\nexport const minInt200 = -(2n ** (200n - 1n))\nexport const minInt208 = -(2n ** (208n - 1n))\nexport const minInt216 = -(2n ** (216n - 1n))\nexport const minInt224 = -(2n ** (224n - 1n))\nexport const minInt232 = -(2n ** (232n - 1n))\nexport const minInt240 = -(2n ** (240n - 1n))\nexport const minInt248 = -(2n ** (248n - 1n))\nexport const minInt256 = -(2n ** (256n - 1n))\n\nexport const maxUint8 = 2n ** 8n - 1n\nexport const maxUint16 = 2n ** 16n - 1n\nexport const maxUint24 = 2n ** 24n - 1n\nexport const maxUint32 = 2n ** 32n - 1n\nexport const maxUint40 = 2n ** 40n - 1n\nexport const maxUint48 = 2n ** 48n - 1n\nexport const maxUint56 = 2n ** 56n - 1n\nexport const maxUint64 = 2n ** 64n - 1n\nexport const maxUint72 = 2n ** 72n - 1n\nexport const maxUint80 = 2n ** 80n - 1n\nexport const maxUint88 = 2n ** 88n - 1n\nexport const maxUint96 = 2n ** 96n - 1n\nexport const maxUint104 = 2n ** 104n - 1n\nexport const maxUint112 = 2n ** 112n - 1n\nexport const maxUint120 = 2n ** 120n - 1n\nexport const maxUint128 = 2n ** 128n - 1n\nexport const maxUint136 = 2n ** 136n - 1n\nexport const maxUint144 = 2n ** 144n - 1n\nexport const maxUint152 = 2n ** 152n - 1n\nexport const maxUint160 = 2n ** 160n - 1n\nexport const maxUint168 = 2n ** 168n - 1n\nexport const maxUint176 = 2n ** 176n - 1n\nexport const maxUint184 = 2n ** 184n - 1n\nexport const maxUint192 = 2n ** 192n - 1n\nexport const maxUint200 = 2n ** 200n - 1n\nexport const maxUint208 = 2n ** 208n - 1n\nexport const maxUint216 = 2n ** 216n - 1n\nexport const maxUint224 = 2n ** 224n - 1n\nexport const maxUint232 = 2n ** 232n - 1n\nexport const maxUint240 = 2n ** 240n - 1n\nexport const maxUint248 = 2n ** 248n - 1n\nexport const maxUint256 = 2n ** 256n - 1n\n","import type {\n AbiParameter,\n AbiParameterKind,\n AbiParametersToPrimitiveTypes,\n AbiParameterToPrimitiveType,\n} from 'abitype'\nimport * as AbiParameters from '../AbiParameters.js'\nimport * as Address from '../Address.js'\nimport * as Bytes from '../Bytes.js'\nimport * as Errors from '../Errors.js'\nimport * as Hex from '../Hex.js'\nimport { integerRegex } from '../Solidity.js'\nimport type * as Cursor from './cursor.js'\nimport type { Compute, IsNarrowable, UnionToIntersection } from './types.js'\n\n/** @internal */\nexport type ParameterToPrimitiveType<\n abiParameter extends AbiParameter | { name: string; type: unknown },\n abiParameterKind extends AbiParameterKind = AbiParameterKind,\n> = AbiParameterToPrimitiveType\n\n/** @internal */\nexport type PreparedParameter = { dynamic: boolean; encoded: Hex.Hex }\n\n/** @internal */\nexport type ToObject<\n parameters extends readonly AbiParameter[],\n kind extends AbiParameterKind = AbiParameterKind,\n> = IsNarrowable extends true\n ? Compute<\n UnionToIntersection<\n {\n [index in keyof parameters]: parameters[index] extends {\n name: infer name extends string\n }\n ? {\n [key in name]: AbiParameterToPrimitiveType<\n parameters[index],\n kind\n >\n }\n : {\n [key in index]: AbiParameterToPrimitiveType<\n parameters[index],\n kind\n >\n }\n }[number]\n >\n >\n : unknown\n\n/** @internal */\nexport type ToPrimitiveTypes<\n abiParameters extends readonly AbiParameter[],\n abiParameterKind extends AbiParameterKind = AbiParameterKind,\n> = AbiParametersToPrimitiveTypes\n\n/** @internal */\nexport type Tuple = ParameterToPrimitiveType\n\n/** @internal */\nexport function decodeParameter(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n options: { checksumAddress?: boolean | undefined; staticPosition: number },\n) {\n const { checksumAddress, staticPosition } = options\n const arrayComponents = getArrayComponents(param.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return decodeArray(\n cursor,\n { ...param, type },\n { checksumAddress, length, staticPosition },\n )\n }\n if (param.type === 'tuple')\n return decodeTuple(cursor, param as TupleAbiParameter, {\n checksumAddress,\n staticPosition,\n })\n if (param.type === 'address')\n return decodeAddress(cursor, { checksum: checksumAddress })\n if (param.type === 'bool') return decodeBool(cursor)\n if (param.type.startsWith('bytes'))\n return decodeBytes(cursor, param, { staticPosition })\n if (param.type.startsWith('uint') || param.type.startsWith('int'))\n return decodeNumber(cursor, param)\n if (param.type === 'string') return decodeString(cursor, { staticPosition })\n throw new AbiParameters.InvalidTypeError(param.type)\n}\n\nexport declare namespace decodeParameter {\n type ErrorType =\n | decodeArray.ErrorType\n | decodeTuple.ErrorType\n | decodeAddress.ErrorType\n | decodeBool.ErrorType\n | decodeBytes.ErrorType\n | decodeNumber.ErrorType\n | decodeString.ErrorType\n | AbiParameters.InvalidTypeError\n | Errors.GlobalErrorType\n}\n\nconst sizeOfLength = 32\nconst sizeOfOffset = 32\n\n/** @internal */\nexport function decodeAddress(\n cursor: Cursor.Cursor,\n options: { checksum?: boolean | undefined } = {},\n) {\n const { checksum = false } = options\n const value = cursor.readBytes(32)\n const wrap = (address: Hex.Hex) =>\n checksum ? Address.checksum(address) : address\n return [wrap(Hex.fromBytes(Bytes.slice(value, -20))), 32]\n}\n\nexport declare namespace decodeAddress {\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Bytes.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeArray(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n options: {\n checksumAddress?: boolean | undefined\n length: number | null\n staticPosition: number\n },\n) {\n const { checksumAddress, length, staticPosition } = options\n\n // If the length of the array is not known in advance (dynamic array),\n // this means we will need to wonder off to the pointer and decode.\n if (!length) {\n // Dealing with a dynamic type, so get the offset of the array data.\n const offset = Bytes.toNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n const startOfData = start + sizeOfLength\n\n // Get the length of the array from the offset.\n cursor.setPosition(start)\n const length = Bytes.toNumber(cursor.readBytes(sizeOfLength))\n\n // Check if the array has any dynamic children.\n const dynamicChild = hasDynamicChild(param)\n\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // If any of the children is dynamic, then all elements will be offset pointer, thus size of one slot (32 bytes).\n // Otherwise, elements will be the size of their encoding (consumed bytes).\n cursor.setPosition(startOfData + (dynamicChild ? i * 32 : consumed))\n const [data, consumed_] = decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: startOfData,\n })\n consumed += consumed_\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance,\n // and the length of an element deeply nested in the array is not known,\n // we need to decode the offset of the array data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the array data.\n const offset = Bytes.toNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n // Move cursor along to the next slot (next offset pointer).\n cursor.setPosition(start + i * 32)\n const [data] = decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: start,\n })\n value.push(data)\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the length of the array is known in advance and the array is deeply static,\n // then we can just decode each element in sequence.\n let consumed = 0\n const value: unknown[] = []\n for (let i = 0; i < length; ++i) {\n const [data, consumed_] = decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: staticPosition + consumed,\n })\n consumed += consumed_\n value.push(data)\n }\n return [value, consumed]\n}\n\nexport declare namespace decodeArray {\n type ErrorType = Bytes.toNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeBool(cursor: Cursor.Cursor) {\n return [Bytes.toBoolean(cursor.readBytes(32), { size: 32 }), 32]\n}\n\nexport declare namespace decodeBool {\n type ErrorType = Bytes.toBoolean.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeBytes(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n { staticPosition }: { staticPosition: number },\n) {\n const [_, size] = param.type.split('bytes')\n if (!size) {\n // Dealing with dynamic types, so get the offset of the bytes data.\n const offset = Bytes.toNumber(cursor.readBytes(32))\n\n // Set position of the cursor to start of bytes data.\n cursor.setPosition(staticPosition + offset)\n\n const length = Bytes.toNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data.\n if (length === 0) {\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return ['0x', 32]\n }\n\n const data = cursor.readBytes(length)\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [Hex.fromBytes(data), 32]\n }\n\n const value = Hex.fromBytes(cursor.readBytes(Number.parseInt(size, 10), 32))\n return [value, 32]\n}\n\nexport declare namespace decodeBytes {\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | Bytes.toNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeNumber(\n cursor: Cursor.Cursor,\n param: AbiParameters.Parameter,\n) {\n const signed = param.type.startsWith('int')\n const size = Number.parseInt(param.type.split('int')[1] || '256', 10)\n const value = cursor.readBytes(32)\n return [\n size > 48\n ? Bytes.toBigInt(value, { signed })\n : Bytes.toNumber(value, { signed }),\n 32,\n ]\n}\n\nexport declare namespace decodeNumber {\n type ErrorType =\n | Bytes.toNumber.ErrorType\n | Bytes.toBigInt.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport type TupleAbiParameter = AbiParameters.Parameter & {\n components: readonly AbiParameters.Parameter[]\n}\n\n/** @internal */\nexport function decodeTuple(\n cursor: Cursor.Cursor,\n param: TupleAbiParameter,\n options: { checksumAddress?: boolean | undefined; staticPosition: number },\n) {\n const { checksumAddress, staticPosition } = options\n\n // Tuples can have unnamed components (i.e. they are arrays), so we must\n // determine whether the tuple is named or unnamed. In the case of a named\n // tuple, the value will be an object where each property is the name of the\n // component. In the case of an unnamed tuple, the value will be an array.\n const hasUnnamedChild =\n param.components.length === 0 || param.components.some(({ name }) => !name)\n\n // Initialize the value to an object or an array, depending on whether the\n // tuple is named or unnamed.\n const value: any = hasUnnamedChild ? [] : {}\n let consumed = 0\n\n // If the tuple has a dynamic child, we must first decode the offset to the\n // tuple data.\n if (hasDynamicChild(param)) {\n // Dealing with dynamic types, so get the offset of the tuple data.\n const offset = Bytes.toNumber(cursor.readBytes(sizeOfOffset))\n\n // Start is the static position of referencing slot + offset.\n const start = staticPosition + offset\n\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]!\n cursor.setPosition(start + consumed)\n const [data, consumed_] = decodeParameter(cursor, component, {\n checksumAddress,\n staticPosition: start,\n })\n consumed += consumed_\n value[hasUnnamedChild ? i : component?.name!] = data\n }\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n return [value, 32]\n }\n\n // If the tuple has static children, we can just decode each component\n // in sequence.\n for (let i = 0; i < param.components.length; ++i) {\n const component = param.components[i]!\n const [data, consumed_] = decodeParameter(cursor, component, {\n checksumAddress,\n staticPosition,\n })\n value[hasUnnamedChild ? i : component?.name!] = data\n consumed += consumed_\n }\n return [value, consumed]\n}\n\nexport declare namespace decodeTuple {\n type ErrorType = Bytes.toNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function decodeString(\n cursor: Cursor.Cursor,\n { staticPosition }: { staticPosition: number },\n) {\n // Get offset to start of string data.\n const offset = Bytes.toNumber(cursor.readBytes(32))\n\n // Start is the static position of current slot + offset.\n const start = staticPosition + offset\n cursor.setPosition(start)\n\n const length = Bytes.toNumber(cursor.readBytes(32))\n\n // If there is no length, we have zero data (empty string).\n if (length === 0) {\n cursor.setPosition(staticPosition + 32)\n return ['', 32]\n }\n\n const data = cursor.readBytes(length, 32)\n const value = Bytes.toString(Bytes.trimLeft(data))\n\n // As we have gone wondering, restore to the original position + next slot.\n cursor.setPosition(staticPosition + 32)\n\n return [value, 32]\n}\n\nexport declare namespace decodeString {\n type ErrorType =\n | Bytes.toNumber.ErrorType\n | Bytes.toString.ErrorType\n | Bytes.trimLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function prepareParameters<\n const parameters extends AbiParameters.AbiParameters,\n>({\n checksumAddress,\n parameters,\n values,\n}: {\n checksumAddress?: boolean | undefined\n parameters: parameters\n values: parameters extends AbiParameters.AbiParameters\n ? ToPrimitiveTypes\n : never\n}) {\n const preparedParameters: PreparedParameter[] = []\n for (let i = 0; i < parameters.length; i++) {\n preparedParameters.push(\n prepareParameter({\n checksumAddress,\n parameter: parameters[i]!,\n value: values[i],\n }),\n )\n }\n return preparedParameters\n}\n\n/** @internal */\nexport declare namespace prepareParameters {\n type ErrorType = prepareParameter.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function prepareParameter<\n const parameter extends AbiParameters.Parameter,\n>({\n checksumAddress = false,\n parameter: parameter_,\n value,\n}: {\n parameter: parameter\n value: parameter extends AbiParameters.Parameter\n ? ParameterToPrimitiveType\n : never\n checksumAddress?: boolean | undefined\n}): PreparedParameter {\n const parameter = parameter_ as AbiParameters.Parameter\n\n const arrayComponents = getArrayComponents(parameter.type)\n if (arrayComponents) {\n const [length, type] = arrayComponents\n return encodeArray(value, {\n checksumAddress,\n length,\n parameter: {\n ...parameter,\n type,\n },\n })\n }\n if (parameter.type === 'tuple') {\n return encodeTuple(value as unknown as Tuple, {\n checksumAddress,\n parameter: parameter as TupleAbiParameter,\n })\n }\n if (parameter.type === 'address') {\n return encodeAddress(value as unknown as Hex.Hex, {\n checksum: checksumAddress,\n })\n }\n if (parameter.type === 'bool') {\n return encodeBoolean(value as unknown as boolean)\n }\n if (parameter.type.startsWith('uint') || parameter.type.startsWith('int')) {\n const signed = parameter.type.startsWith('int')\n const [, , size = '256'] = integerRegex.exec(parameter.type) ?? []\n return encodeNumber(value as unknown as number, {\n signed,\n size: Number(size),\n })\n }\n if (parameter.type.startsWith('bytes')) {\n return encodeBytes(value as unknown as Hex.Hex, { type: parameter.type })\n }\n if (parameter.type === 'string') {\n return encodeString(value as unknown as string)\n }\n throw new AbiParameters.InvalidTypeError(parameter.type)\n}\n\n/** @internal */\nexport declare namespace prepareParameter {\n type ErrorType =\n | encodeArray.ErrorType\n | encodeTuple.ErrorType\n | encodeAddress.ErrorType\n | encodeBoolean.ErrorType\n | encodeBytes.ErrorType\n | encodeString.ErrorType\n | AbiParameters.InvalidTypeError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encode(preparedParameters: PreparedParameter[]): Hex.Hex {\n // 1. Compute the size of the static part of the parameters.\n let staticSize = 0\n for (let i = 0; i < preparedParameters.length; i++) {\n const { dynamic, encoded } = preparedParameters[i]!\n if (dynamic) staticSize += 32\n else staticSize += Hex.size(encoded)\n }\n\n // 2. Split the parameters into static and dynamic parts.\n const staticParameters: Hex.Hex[] = []\n const dynamicParameters: Hex.Hex[] = []\n let dynamicSize = 0\n for (let i = 0; i < preparedParameters.length; i++) {\n const { dynamic, encoded } = preparedParameters[i]!\n if (dynamic) {\n staticParameters.push(\n Hex.fromNumber(staticSize + dynamicSize, { size: 32 }),\n )\n dynamicParameters.push(encoded)\n dynamicSize += Hex.size(encoded)\n } else {\n staticParameters.push(encoded)\n }\n }\n\n // 3. Concatenate static and dynamic parts.\n return Hex.concat(...staticParameters, ...dynamicParameters)\n}\n\n/** @internal */\nexport declare namespace encode {\n type ErrorType =\n | Hex.concat.ErrorType\n | Hex.fromNumber.ErrorType\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeAddress(\n value: Hex.Hex,\n options: { checksum: boolean },\n): PreparedParameter {\n const { checksum = false } = options\n Address.assert(value, { strict: checksum })\n return {\n dynamic: false,\n encoded: Hex.padLeft(value.toLowerCase() as Hex.Hex),\n }\n}\n\n/** @internal */\nexport declare namespace encodeAddress {\n type ErrorType =\n | Address.assert.ErrorType\n | Hex.padLeft.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeArray(\n value: ParameterToPrimitiveType,\n options: {\n checksumAddress?: boolean | undefined\n length: number | null\n parameter: parameter\n },\n): PreparedParameter {\n const { checksumAddress, length, parameter } = options\n\n const dynamic = length === null\n\n if (!Array.isArray(value)) throw new AbiParameters.InvalidArrayError(value)\n if (!dynamic && value.length !== length)\n throw new AbiParameters.ArrayLengthMismatchError({\n expectedLength: length!,\n givenLength: value.length,\n type: `${parameter.type}[${length}]`,\n })\n\n let dynamicChild = false\n const preparedParameters: PreparedParameter[] = []\n for (let i = 0; i < value.length; i++) {\n const preparedParam = prepareParameter({\n checksumAddress,\n parameter,\n value: value[i],\n })\n if (preparedParam.dynamic) dynamicChild = true\n preparedParameters.push(preparedParam)\n }\n\n if (dynamic || dynamicChild) {\n const data = encode(preparedParameters)\n if (dynamic) {\n const length = Hex.fromNumber(preparedParameters.length, { size: 32 })\n return {\n dynamic: true,\n encoded:\n preparedParameters.length > 0 ? Hex.concat(length, data) : length,\n }\n }\n if (dynamicChild) return { dynamic: true, encoded: data }\n }\n return {\n dynamic: false,\n encoded: Hex.concat(...preparedParameters.map(({ encoded }) => encoded)),\n }\n}\n\n/** @internal */\nexport declare namespace encodeArray {\n type ErrorType =\n | AbiParameters.InvalidArrayError\n | AbiParameters.ArrayLengthMismatchError\n | Hex.concat.ErrorType\n | Hex.fromNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeBytes(\n value: Hex.Hex,\n { type }: { type: string },\n): PreparedParameter {\n const [, parametersize] = type.split('bytes')\n const bytesSize = Hex.size(value)\n if (!parametersize) {\n let value_ = value\n // If the size is not divisible by 32 bytes, pad the end\n // with empty bytes to the ceiling 32 bytes.\n if (bytesSize % 32 !== 0)\n value_ = Hex.padRight(value_, Math.ceil((value.length - 2) / 2 / 32) * 32)\n return {\n dynamic: true,\n encoded: Hex.concat(\n Hex.padLeft(Hex.fromNumber(bytesSize, { size: 32 })),\n value_,\n ),\n }\n }\n if (bytesSize !== Number.parseInt(parametersize, 10))\n throw new AbiParameters.BytesSizeMismatchError({\n expectedSize: Number.parseInt(parametersize, 10),\n value,\n })\n return { dynamic: false, encoded: Hex.padRight(value) }\n}\n\n/** @internal */\nexport declare namespace encodeBytes {\n type ErrorType =\n | Hex.padLeft.ErrorType\n | Hex.padRight.ErrorType\n | Hex.fromNumber.ErrorType\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeBoolean(value: boolean): PreparedParameter {\n if (typeof value !== 'boolean')\n throw new Errors.BaseError(\n `Invalid boolean value: \"${value}\" (type: ${typeof value}). Expected: \\`true\\` or \\`false\\`.`,\n )\n return { dynamic: false, encoded: Hex.padLeft(Hex.fromBoolean(value)) }\n}\n\n/** @internal */\nexport declare namespace encodeBoolean {\n type ErrorType =\n | Hex.padLeft.ErrorType\n | Hex.fromBoolean.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeNumber(\n value: number,\n { signed, size }: { signed: boolean; size: number },\n): PreparedParameter {\n if (typeof size === 'number') {\n const max = 2n ** (BigInt(size) - (signed ? 1n : 0n)) - 1n\n const min = signed ? -max - 1n : 0n\n if (value > max || value < min)\n throw new Hex.IntegerOutOfRangeError({\n max: max.toString(),\n min: min.toString(),\n signed,\n size: size / 8,\n value: value.toString(),\n })\n }\n return {\n dynamic: false,\n encoded: Hex.fromNumber(value, {\n size: 32,\n signed,\n }),\n }\n}\n\n/** @internal */\nexport declare namespace encodeNumber {\n type ErrorType = Hex.fromNumber.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeString(value: string): PreparedParameter {\n const hexValue = Hex.fromString(value)\n const partsLength = Math.ceil(Hex.size(hexValue) / 32)\n const parts: Hex.Hex[] = []\n for (let i = 0; i < partsLength; i++) {\n parts.push(Hex.padRight(Hex.slice(hexValue, i * 32, (i + 1) * 32)))\n }\n return {\n dynamic: true,\n encoded: Hex.concat(\n Hex.padRight(Hex.fromNumber(Hex.size(hexValue), { size: 32 })),\n ...parts,\n ),\n }\n}\n\n/** @internal */\nexport declare namespace encodeString {\n type ErrorType =\n | Hex.fromNumber.ErrorType\n | Hex.padRight.ErrorType\n | Hex.slice.ErrorType\n | Hex.size.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function encodeTuple<\n const parameter extends AbiParameters.Parameter & {\n components: readonly AbiParameters.Parameter[]\n },\n>(\n value: ParameterToPrimitiveType,\n options: {\n checksumAddress?: boolean | undefined\n parameter: parameter\n },\n): PreparedParameter {\n const { checksumAddress, parameter } = options\n\n let dynamic = false\n const preparedParameters: PreparedParameter[] = []\n for (let i = 0; i < parameter.components.length; i++) {\n const param_ = parameter.components[i]!\n const index = Array.isArray(value) ? i : param_.name\n const preparedParam = prepareParameter({\n checksumAddress,\n parameter: param_,\n value: (value as any)[index!] as readonly unknown[],\n })\n preparedParameters.push(preparedParam)\n if (preparedParam.dynamic) dynamic = true\n }\n return {\n dynamic,\n encoded: dynamic\n ? encode(preparedParameters)\n : Hex.concat(...preparedParameters.map(({ encoded }) => encoded)),\n }\n}\n\n/** @internal */\nexport declare namespace encodeTuple {\n type ErrorType = Hex.concat.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function getArrayComponents(\n type: string,\n): [length: number | null, innerType: string] | undefined {\n const matches = type.match(/^(.*)\\[(\\d+)?\\]$/)\n return matches\n ? // Return `null` if the array is dynamic.\n [matches[2]! ? Number(matches[2]!) : null, matches[1]!]\n : undefined\n}\n\n/** @internal */\nexport function hasDynamicChild(param: AbiParameters.Parameter) {\n const { type } = param\n if (type === 'string') return true\n if (type === 'bytes') return true\n if (type.endsWith('[]')) return true\n\n if (type === 'tuple') return (param as any).components?.some(hasDynamicChild)\n\n const arrayComponents = getArrayComponents(param.type)\n if (\n arrayComponents &&\n hasDynamicChild({\n ...param,\n type: arrayComponents[1],\n } as AbiParameters.Parameter)\n )\n return true\n\n return false\n}\n","import type { Bytes } from '../Bytes.js'\nimport * as Errors from '../Errors.js'\n\n/** @internal */\nexport type Cursor = {\n bytes: Bytes\n dataView: DataView\n position: number\n positionReadCount: Map\n recursiveReadCount: number\n recursiveReadLimit: number\n remaining: number\n assertReadLimit(position?: number): void\n assertPosition(position: number): void\n decrementPosition(offset: number): void\n getReadCount(position?: number): number\n incrementPosition(offset: number): void\n inspectByte(position?: number): Bytes[number]\n inspectBytes(length: number, position?: number): Bytes\n inspectUint8(position?: number): number\n inspectUint16(position?: number): number\n inspectUint24(position?: number): number\n inspectUint32(position?: number): number\n pushByte(byte: Bytes[number]): void\n pushBytes(bytes: Bytes): void\n pushUint8(value: number): void\n pushUint16(value: number): void\n pushUint24(value: number): void\n pushUint32(value: number): void\n readByte(): Bytes[number]\n readBytes(length: number, size?: number): Bytes\n readUint8(): number\n readUint16(): number\n readUint24(): number\n readUint32(): number\n setPosition(position: number): () => void\n _touch(): void\n}\n\nconst staticCursor: Cursor = {\n bytes: new Uint8Array(),\n dataView: new DataView(new ArrayBuffer(0)),\n position: 0,\n positionReadCount: new Map(),\n recursiveReadCount: 0,\n recursiveReadLimit: Number.POSITIVE_INFINITY,\n assertReadLimit() {\n if (this.recursiveReadCount >= this.recursiveReadLimit)\n throw new RecursiveReadLimitExceededError({\n count: this.recursiveReadCount + 1,\n limit: this.recursiveReadLimit,\n })\n },\n assertPosition(position) {\n if (position < 0 || position > this.bytes.length - 1)\n throw new PositionOutOfBoundsError({\n length: this.bytes.length,\n position,\n })\n },\n decrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position - offset\n this.assertPosition(position)\n this.position = position\n },\n getReadCount(position) {\n return this.positionReadCount.get(position || this.position) || 0\n },\n incrementPosition(offset) {\n if (offset < 0) throw new NegativeOffsetError({ offset })\n const position = this.position + offset\n this.assertPosition(position)\n this.position = position\n },\n inspectByte(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]!\n },\n inspectBytes(length, position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + length - 1)\n return this.bytes.subarray(position, position + length)\n },\n inspectUint8(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position)\n return this.bytes[position]!\n },\n inspectUint16(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 1)\n return this.dataView.getUint16(position)\n },\n inspectUint24(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 2)\n return (\n (this.dataView.getUint16(position) << 8) +\n this.dataView.getUint8(position + 2)\n )\n },\n inspectUint32(position_) {\n const position = position_ ?? this.position\n this.assertPosition(position + 3)\n return this.dataView.getUint32(position)\n },\n pushByte(byte: Bytes[number]) {\n this.assertPosition(this.position)\n this.bytes[this.position] = byte\n this.position++\n },\n pushBytes(bytes: Bytes) {\n this.assertPosition(this.position + bytes.length - 1)\n this.bytes.set(bytes, this.position)\n this.position += bytes.length\n },\n pushUint8(value: number) {\n this.assertPosition(this.position)\n this.bytes[this.position] = value\n this.position++\n },\n pushUint16(value: number) {\n this.assertPosition(this.position + 1)\n this.dataView.setUint16(this.position, value)\n this.position += 2\n },\n pushUint24(value: number) {\n this.assertPosition(this.position + 2)\n this.dataView.setUint16(this.position, value >> 8)\n this.dataView.setUint8(this.position + 2, value & ~4294967040)\n this.position += 3\n },\n pushUint32(value: number) {\n this.assertPosition(this.position + 3)\n this.dataView.setUint32(this.position, value)\n this.position += 4\n },\n readByte() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectByte()\n this.position++\n return value\n },\n readBytes(length, size) {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectBytes(length)\n this.position += size ?? length\n return value\n },\n readUint8() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint8()\n this.position += 1\n return value\n },\n readUint16() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint16()\n this.position += 2\n return value\n },\n readUint24() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint24()\n this.position += 3\n return value\n },\n readUint32() {\n this.assertReadLimit()\n this._touch()\n const value = this.inspectUint32()\n this.position += 4\n return value\n },\n get remaining() {\n return this.bytes.length - this.position\n },\n setPosition(position) {\n const oldPosition = this.position\n this.assertPosition(position)\n this.position = position\n return () => (this.position = oldPosition)\n },\n _touch() {\n if (this.recursiveReadLimit === Number.POSITIVE_INFINITY) return\n const count = this.getReadCount()\n this.positionReadCount.set(this.position, count + 1)\n if (count > 0) this.recursiveReadCount++\n },\n}\n\n/** @internal */\nexport function create(\n bytes: Bytes,\n { recursiveReadLimit = 8_192 }: create.Config = {},\n): Cursor {\n const cursor: Cursor = Object.create(staticCursor)\n cursor.bytes = bytes\n cursor.dataView = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n )\n cursor.positionReadCount = new Map()\n cursor.recursiveReadLimit = recursiveReadLimit\n return cursor\n}\n\n/** @internal */\nexport declare namespace create {\n type Config = { recursiveReadLimit?: number | undefined }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** @internal */\nexport class NegativeOffsetError extends Errors.BaseError {\n override readonly name = 'Cursor.NegativeOffsetError'\n\n constructor({ offset }: { offset: number }) {\n super(`Offset \\`${offset}\\` cannot be negative.`)\n }\n}\n\n/** @internal */\nexport class PositionOutOfBoundsError extends Errors.BaseError {\n override readonly name = 'Cursor.PositionOutOfBoundsError'\n\n constructor({ length, position }: { length: number; position: number }) {\n super(\n `Position \\`${position}\\` is out of bounds (\\`0 < position < ${length}\\`).`,\n )\n }\n}\n\n/** @internal */\nexport class RecursiveReadLimitExceededError extends Errors.BaseError {\n override readonly name = 'Cursor.RecursiveReadLimitExceededError'\n\n constructor({ count, limit }: { count: number; limit: number }) {\n super(\n `Recursive read limit of \\`${limit}\\` exceeded (recursive read count: \\`${count}\\`).`,\n )\n }\n}\n","import * as abitype from 'abitype'\nimport * as Address from './Address.js'\nimport * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as internal from './internal/abiParameters.js'\nimport * as Cursor from './internal/cursor.js'\nimport * as Solidity from './Solidity.js'\n\n/** Root type for ABI parameters. */\nexport type AbiParameters = readonly abitype.AbiParameter[]\n\n/** A parameter on an {@link ox#AbiParameters.AbiParameters}. */\nexport type Parameter = abitype.AbiParameter\n\n/** A packed ABI type. */\nexport type PackedAbiType =\n | abitype.SolidityAddress\n | abitype.SolidityBool\n | abitype.SolidityBytes\n | abitype.SolidityInt\n | abitype.SolidityString\n | abitype.SolidityArrayWithoutTuple\n\n/**\n * Decodes ABI-encoded data into its respective primitive values based on ABI Parameters.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.decode(\n * AbiParameters.from(['string', 'uint', 'bool']),\n * '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000',\n * )\n * // @log: ['wagmi', 420n, true]\n * ```\n *\n * @example\n * ### JSON Parameters\n *\n * You can pass **JSON ABI** Parameters:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.decode(\n * [\n * { name: 'x', type: 'string' },\n * { name: 'y', type: 'uint' },\n * { name: 'z', type: 'bool' },\n * ],\n * '0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000',\n * )\n * // @log: ['wagmi', 420n, true]\n * ```\n *\n * @param parameters - The set of ABI parameters to decode, in the shape of the `inputs` or `outputs` attribute of an ABI Item. These parameters must include valid [ABI types](https://docs.soliditylang.org/en/latest/types.html).\n * @param data - ABI encoded data.\n * @param options - Decoding options.\n * @returns Array of decoded values.\n */\nexport function decode<\n const parameters extends AbiParameters,\n as extends 'Object' | 'Array' = 'Array',\n>(\n parameters: parameters,\n data: Bytes.Bytes | Hex.Hex,\n options?: decode.Options,\n): decode.ReturnType\n\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decode(\n parameters: AbiParameters,\n data: Bytes.Bytes | Hex.Hex,\n options: {\n as?: 'Array' | 'Object' | undefined\n checksumAddress?: boolean | undefined\n } = {},\n): readonly unknown[] | Record {\n const { as = 'Array', checksumAddress = false } = options\n\n const bytes = typeof data === 'string' ? Bytes.fromHex(data) : data\n const cursor = Cursor.create(bytes)\n\n if (Bytes.size(bytes) === 0 && parameters.length > 0)\n throw new ZeroDataError()\n if (Bytes.size(bytes) && Bytes.size(bytes) < 32)\n throw new DataSizeTooSmallError({\n data: typeof data === 'string' ? data : Hex.fromBytes(data),\n parameters: parameters as readonly Parameter[],\n size: Bytes.size(bytes),\n })\n\n let consumed = 0\n const values: any = as === 'Array' ? [] : {}\n for (let i = 0; i < parameters.length; ++i) {\n const param = parameters[i] as Parameter\n cursor.setPosition(consumed)\n const [data, consumed_] = internal.decodeParameter(cursor, param, {\n checksumAddress,\n staticPosition: 0,\n })\n consumed += consumed_\n if (as === 'Array') values.push(data)\n else values[param.name ?? i] = data\n }\n return values\n}\n\nexport declare namespace decode {\n type Options = {\n /**\n * Whether the decoded values should be returned as an `Object` or `Array`.\n *\n * @default \"Array\"\n */\n as?: as | 'Object' | 'Array' | undefined\n /**\n * Whether decoded addresses should be checksummed.\n *\n * @default false\n */\n checksumAddress?: boolean | undefined\n }\n\n type ReturnType<\n parameters extends AbiParameters = AbiParameters,\n as extends 'Object' | 'Array' = 'Array',\n > = parameters extends readonly []\n ? as extends 'Object'\n ? {}\n : []\n : as extends 'Object'\n ? internal.ToObject\n : internal.ToPrimitiveTypes\n\n type ErrorType =\n | Bytes.fromHex.ErrorType\n | internal.decodeParameter.ErrorType\n | ZeroDataError\n | DataSizeTooSmallError\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes primitive values into ABI encoded data as per the [Application Binary Interface (ABI) Specification](https://docs.soliditylang.org/en/latest/abi-spec).\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.encode(\n * AbiParameters.from(['string', 'uint', 'bool']),\n * ['wagmi', 420n, true],\n * )\n * ```\n *\n * @example\n * ### JSON Parameters\n *\n * Specify **JSON ABI** Parameters as schema:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const data = AbiParameters.encode(\n * [\n * { type: 'string', name: 'name' },\n * { type: 'uint', name: 'age' },\n * { type: 'bool', name: 'isOwner' },\n * ],\n * ['wagmi', 420n, true],\n * )\n * ```\n *\n * @param parameters - The set of ABI parameters to encode, in the shape of the `inputs` or `outputs` attribute of an ABI Item. These parameters must include valid [ABI types](https://docs.soliditylang.org/en/latest/types.html).\n * @param values - The set of primitive values that correspond to the ABI types defined in `parameters`.\n * @returns ABI encoded data.\n */\nexport function encode<\n const parameters extends AbiParameters | readonly unknown[],\n>(\n parameters: parameters,\n values: parameters extends AbiParameters\n ? internal.ToPrimitiveTypes\n : never,\n options?: encode.Options,\n): Hex.Hex {\n const { checksumAddress = false } = options ?? {}\n\n if (parameters.length !== values.length)\n throw new LengthMismatchError({\n expectedLength: parameters.length as number,\n givenLength: values.length as any,\n })\n // Prepare the parameters to determine dynamic types to encode.\n const preparedParameters = internal.prepareParameters({\n checksumAddress,\n parameters: parameters as readonly Parameter[],\n values: values as any,\n })\n const data = internal.encode(preparedParameters)\n if (data.length === 0) return '0x'\n return data\n}\n\nexport declare namespace encode {\n type ErrorType =\n | LengthMismatchError\n | internal.encode.ErrorType\n | internal.prepareParameters.ErrorType\n | Errors.GlobalErrorType\n\n type Options = {\n /**\n * Whether addresses should be checked against their checksum.\n *\n * @default false\n */\n checksumAddress?: boolean | undefined\n }\n}\n\n/**\n * Encodes an array of primitive values to a [packed ABI encoding](https://docs.soliditylang.org/en/latest/abi-spec.html#non-standard-packed-mode).\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const encoded = AbiParameters.encodePacked(\n * ['address', 'string'],\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 'hello world'],\n * )\n * // @log: '0xd8da6bf26964af9d7eed9e03e53415d37aa9604568656c6c6f20776f726c64'\n * ```\n *\n * @param types - Set of ABI types to pack encode.\n * @param values - The set of primitive values that correspond to the ABI types defined in `types`.\n * @returns The encoded packed data.\n */\nexport function encodePacked<\n const packedAbiTypes extends readonly PackedAbiType[] | readonly unknown[],\n>(types: packedAbiTypes, values: encodePacked.Values): Hex.Hex {\n if (types.length !== values.length)\n throw new LengthMismatchError({\n expectedLength: types.length as number,\n givenLength: values.length as number,\n })\n\n const data: Hex.Hex[] = []\n for (let i = 0; i < (types as unknown[]).length; i++) {\n const type = types[i]\n const value = values[i]\n data.push(encodePacked.encode(type, value))\n }\n return Hex.concat(...data)\n}\n\nexport namespace encodePacked {\n export type ErrorType =\n | Hex.concat.ErrorType\n | LengthMismatchError\n | Errors.GlobalErrorType\n\n export type Values<\n packedAbiTypes extends readonly PackedAbiType[] | readonly unknown[],\n > = {\n [key in keyof packedAbiTypes]: packedAbiTypes[key] extends abitype.AbiType\n ? abitype.AbiParameterToPrimitiveType<{ type: packedAbiTypes[key] }>\n : unknown\n }\n\n // eslint-disable-next-line jsdoc/require-jsdoc\n export function encode(\n type: packedAbiType,\n value: Values<[packedAbiType]>[0],\n isArray = false,\n ): Hex.Hex {\n if (type === 'address') {\n const address = value as Address.Address\n Address.assert(address)\n return Hex.padLeft(\n address.toLowerCase() as Hex.Hex,\n isArray ? 32 : 0,\n ) as Address.Address\n }\n if (type === 'string') return Hex.fromString(value as string)\n if (type === 'bytes') return value as Hex.Hex\n if (type === 'bool')\n return Hex.padLeft(Hex.fromBoolean(value as boolean), isArray ? 32 : 1)\n\n const intMatch = (type as string).match(Solidity.integerRegex)\n if (intMatch) {\n const [_type, baseType, bits = '256'] = intMatch\n const size = Number.parseInt(bits, 10) / 8\n return Hex.fromNumber(value as number, {\n size: isArray ? 32 : size,\n signed: baseType === 'int',\n })\n }\n\n const bytesMatch = (type as string).match(Solidity.bytesRegex)\n if (bytesMatch) {\n const [_type, size] = bytesMatch\n if (Number.parseInt(size!, 10) !== ((value as Hex.Hex).length - 2) / 2)\n throw new BytesSizeMismatchError({\n expectedSize: Number.parseInt(size!, 10),\n value: value as Hex.Hex,\n })\n return Hex.padRight(value as Hex.Hex, isArray ? 32 : 0) as Hex.Hex\n }\n\n const arrayMatch = (type as string).match(Solidity.arrayRegex)\n if (arrayMatch && Array.isArray(value)) {\n const [_type, childType] = arrayMatch\n const data: Hex.Hex[] = []\n for (let i = 0; i < value.length; i++) {\n data.push(encode(childType, value[i], true))\n }\n if (data.length === 0) return '0x'\n return Hex.concat(...data)\n }\n\n throw new InvalidTypeError(type as string)\n }\n}\n\n/**\n * Formats {@link ox#AbiParameters.AbiParameters} into **Human Readable ABI Parameters**.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const formatted = AbiParameters.format([\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ])\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param parameters - The ABI Parameters to format.\n * @returns The formatted ABI Parameters .\n */\nexport function format<\n const parameters extends readonly [\n Parameter | abitype.AbiEventParameter,\n ...(readonly (Parameter | abitype.AbiEventParameter)[]),\n ],\n>(\n parameters:\n | parameters\n | readonly [\n Parameter | abitype.AbiEventParameter,\n ...(readonly (Parameter | abitype.AbiEventParameter)[]),\n ],\n): abitype.FormatAbiParameters {\n return abitype.formatAbiParameters(parameters)\n}\n\nexport declare namespace format {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses arbitrary **JSON ABI Parameters** or **Human Readable ABI Parameters** into typed {@link ox#AbiParameters.AbiParameters}.\n *\n * @example\n * ### JSON Parameters\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const parameters = AbiParameters.from([\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ])\n *\n * parameters\n * //^?\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable Parameters\n *\n * Human Readable ABI Parameters can be parsed into a typed {@link ox#AbiParameters.AbiParameters}:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const parameters = AbiParameters.from('address spender, uint256 amount')\n *\n * parameters\n * //^?\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * const parameters = AbiParameters.from([\n * 'struct Foo { address spender; uint256 amount; }', // [!code hl]\n * 'Foo foo, address bar',\n * ])\n *\n * parameters\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param parameters - The ABI Parameters to parse.\n * @returns The typed ABI Parameters.\n */\nexport function from<\n const parameters extends AbiParameters | string | readonly string[],\n>(\n parameters: parameters | AbiParameters | string | readonly string[],\n): from.ReturnType {\n if (Array.isArray(parameters) && typeof parameters[0] === 'string')\n return abitype.parseAbiParameters(parameters) as never\n if (typeof parameters === 'string')\n return abitype.parseAbiParameters(parameters) as never\n return parameters as never\n}\n\nexport declare namespace from {\n type ReturnType<\n parameters extends AbiParameters | string | readonly string[],\n > = parameters extends string\n ? abitype.ParseAbiParameters\n : parameters extends readonly string[]\n ? abitype.ParseAbiParameters\n : parameters\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Throws when the data size is too small for the given parameters.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x010f')\n * // ↑ ❌ 2 bytes\n * // @error: AbiParameters.DataSizeTooSmallError: Data size of 2 bytes is too small for given parameters.\n * // @error: Params: (uint256)\n * // @error: Data: 0x010f (2 bytes)\n * ```\n *\n * ### Solution\n *\n * Pass a valid data size.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x00000000000000000000000000000000000000000000000000000000000010f')\n * // ↑ ✅ 32 bytes\n * ```\n */\nexport class DataSizeTooSmallError extends Errors.BaseError {\n override readonly name = 'AbiParameters.DataSizeTooSmallError'\n constructor({\n data,\n parameters,\n size,\n }: { data: Hex.Hex; parameters: readonly Parameter[]; size: number }) {\n super(`Data size of ${size} bytes is too small for given parameters.`, {\n metaMessages: [\n `Params: (${abitype.formatAbiParameters(parameters as readonly [Parameter])})`,\n `Data: ${data} (${size} bytes)`,\n ],\n })\n }\n}\n\n/**\n * Throws when zero data is provided, but data is expected.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x')\n * // ↑ ❌ zero data\n * // @error: AbiParameters.DataSizeTooSmallError: Data size of 2 bytes is too small for given parameters.\n * // @error: Params: (uint256)\n * // @error: Data: 0x010f (2 bytes)\n * ```\n *\n * ### Solution\n *\n * Pass valid data.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'uint256' }], '0x00000000000000000000000000000000000000000000000000000000000010f')\n * // ↑ ✅ 32 bytes\n * ```\n */\nexport class ZeroDataError extends Errors.BaseError {\n override readonly name = 'AbiParameters.ZeroDataError'\n constructor() {\n super('Cannot decode zero data (\"0x\") with ABI parameters.')\n }\n}\n\n/**\n * The length of the array value does not match the length specified in the corresponding ABI parameter.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from('uint256[3]'), [[69n, 420n]])\n * // ↑ expected: 3 ↑ ❌ length: 2\n * // @error: AbiParameters.ArrayLengthMismatchError: ABI encoding array length mismatch\n * // @error: for type `uint256[3]`. Expected: `3`. Given: `2`.\n * ```\n *\n * ### Solution\n *\n * Pass an array of the correct length.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['uint256[3]']), [[69n, 420n, 69n]])\n * // ↑ ✅ length: 3\n * ```\n */\nexport class ArrayLengthMismatchError extends Errors.BaseError {\n override readonly name = 'AbiParameters.ArrayLengthMismatchError'\n constructor({\n expectedLength,\n givenLength,\n type,\n }: { expectedLength: number; givenLength: number; type: string }) {\n super(\n `Array length mismatch for type \\`${type}\\`. Expected: \\`${expectedLength}\\`. Given: \\`${givenLength}\\`.`,\n )\n }\n}\n\n/**\n * The size of the bytes value does not match the size specified in the corresponding ABI parameter.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from('bytes8'), [['0xdeadbeefdeadbeefdeadbeef']])\n * // ↑ expected: 8 bytes ↑ ❌ size: 12 bytes\n * // @error: BytesSizeMismatchError: Size of bytes \"0xdeadbeefdeadbeefdeadbeef\"\n * // @error: (bytes12) does not match expected size (bytes8).\n * ```\n *\n * ### Solution\n *\n * Pass a bytes value of the correct size.\n *\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['bytes8']), ['0xdeadbeefdeadbeef'])\n * // ↑ ✅ size: 8 bytes\n * ```\n */\nexport class BytesSizeMismatchError extends Errors.BaseError {\n override readonly name = 'AbiParameters.BytesSizeMismatchError'\n constructor({\n expectedSize,\n value,\n }: { expectedSize: number; value: Hex.Hex }) {\n super(\n `Size of bytes \"${value}\" (bytes${Hex.size(\n value,\n )}) does not match expected size (bytes${expectedSize}).`,\n )\n }\n}\n\n/**\n * The length of the values to encode does not match the length of the ABI parameters.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['string', 'uint256']), ['hello'])\n * // @error: LengthMismatchError: ABI encoding params/values length mismatch.\n * // @error: Expected length (params): 2\n * // @error: Given length (values): 1\n * ```\n *\n * ### Solution\n *\n * Pass the correct number of values to encode.\n *\n * ### Solution\n *\n * Pass a [valid ABI type](https://docs.soliditylang.org/en/develop/abi-spec.html#types).\n */\nexport class LengthMismatchError extends Errors.BaseError {\n override readonly name = 'AbiParameters.LengthMismatchError'\n constructor({\n expectedLength,\n givenLength,\n }: { expectedLength: number; givenLength: number }) {\n super(\n [\n 'ABI encoding parameters/values length mismatch.',\n `Expected length (parameters): ${expectedLength}`,\n `Given length (values): ${givenLength}`,\n ].join('\\n'),\n )\n }\n}\n\n/**\n * The value provided is not a valid array as specified in the corresponding ABI parameter.\n *\n * ### Example\n *\n * ```ts twoslash\n * // @noErrors\n * import { AbiParameters } from 'ox'\n * // ---cut---\n * AbiParameters.encode(AbiParameters.from(['uint256[3]']), [69])\n * ```\n *\n * ### Solution\n *\n * Pass an array value.\n */\nexport class InvalidArrayError extends Errors.BaseError {\n override readonly name = 'AbiParameters.InvalidArrayError'\n constructor(value: unknown) {\n super(`Value \\`${value}\\` is not a valid array.`)\n }\n}\n\n/**\n * Throws when the ABI parameter type is invalid.\n *\n * @example\n * ```ts twoslash\n * import { AbiParameters } from 'ox'\n *\n * AbiParameters.decode([{ type: 'lol' }], '0x00000000000000000000000000000000000000000000000000000000000010f')\n * // ↑ ❌ invalid type\n * // @error: AbiParameters.InvalidTypeError: Type `lol` is not a valid ABI Type.\n * ```\n */\nexport class InvalidTypeError extends Errors.BaseError {\n override readonly name = 'AbiParameters.InvalidTypeError'\n constructor(type: string) {\n super(`Type \\`${type}\\` is not a valid ABI Type.`)\n }\n}\n","import * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as Cursor from './internal/cursor.js'\nimport type { ExactPartial, RecursiveArray } from './internal/types.js'\n\n/**\n * Decodes a Recursive-Length Prefix (RLP) value into a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Rlp } from 'ox'\n * Rlp.toBytes('0x8b68656c6c6f20776f726c64')\n * // Uint8Array([139, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100])\n * ```\n *\n * @param value - The value to decode.\n * @returns The decoded {@link ox#Bytes.Bytes} value.\n */\nexport function toBytes(\n value: Bytes.Bytes | Hex.Hex,\n): RecursiveArray {\n return to(value, 'Bytes')\n}\n\nexport declare namespace toBytes {\n type ErrorType = to.ErrorType\n}\n\n/**\n * Decodes a Recursive-Length Prefix (RLP) value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Rlp } from 'ox'\n * Rlp.toHex('0x8b68656c6c6f20776f726c64')\n * // 0x68656c6c6f20776f726c64\n * ```\n *\n * @param value - The value to decode.\n * @returns The decoded {@link ox#Hex.Hex} value.\n */\nexport function toHex(value: Bytes.Bytes | Hex.Hex): RecursiveArray {\n return to(value, 'Hex')\n}\n\nexport declare namespace toHex {\n type ErrorType = to.ErrorType\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n// Internal\n/////////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport function to<\n value extends Bytes.Bytes | Hex.Hex,\n to extends 'Hex' | 'Bytes',\n>(value: value, to: to | 'Hex' | 'Bytes'): to.ReturnType {\n const to_ = to ?? (typeof value === 'string' ? 'Hex' : 'Bytes')\n\n const bytes = (() => {\n if (typeof value === 'string') {\n if (value.length > 3 && value.length % 2 !== 0)\n throw new Hex.InvalidLengthError(value)\n return Bytes.fromHex(value)\n }\n return value as Bytes.Bytes\n })()\n\n const cursor = Cursor.create(bytes, {\n recursiveReadLimit: Number.POSITIVE_INFINITY,\n })\n const result = decodeRlpCursor(cursor, to_)\n\n return result as to.ReturnType\n}\n\n/** @internal */\nexport declare namespace to {\n type ReturnType =\n | (to extends 'Bytes' ? RecursiveArray : never)\n | (to extends 'Hex' ? RecursiveArray : never)\n\n type ErrorType =\n | Bytes.fromHex.ErrorType\n | decodeRlpCursor.ErrorType\n | Cursor.create.ErrorType\n | Hex.InvalidLengthError\n | Errors.GlobalErrorType\n}\n\n/** @internal */\n\n/** @internal */\nexport function decodeRlpCursor(\n cursor: Cursor.Cursor,\n to: to | 'Hex' | 'Bytes' | undefined = 'Hex',\n): decodeRlpCursor.ReturnType {\n if (cursor.bytes.length === 0)\n return (\n to === 'Hex' ? Hex.fromBytes(cursor.bytes) : cursor.bytes\n ) as decodeRlpCursor.ReturnType\n\n const prefix = cursor.readByte()\n if (prefix < 0x80) cursor.decrementPosition(1)\n\n // bytes\n if (prefix < 0xc0) {\n const length = readLength(cursor, prefix, 0x80)\n const bytes = cursor.readBytes(length)\n return (\n to === 'Hex' ? Hex.fromBytes(bytes) : bytes\n ) as decodeRlpCursor.ReturnType\n }\n\n // list\n const length = readLength(cursor, prefix, 0xc0)\n return readList(cursor, length, to) as {} as decodeRlpCursor.ReturnType\n}\n\n/** @internal */\nexport declare namespace decodeRlpCursor {\n type ReturnType = to.ReturnType\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | readLength.ErrorType\n | readList.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function readLength(\n cursor: Cursor.Cursor,\n prefix: number,\n offset: number,\n) {\n if (offset === 0x80 && prefix < 0x80) return 1\n if (prefix <= offset + 55) return prefix - offset\n if (prefix === offset + 55 + 1) return cursor.readUint8()\n if (prefix === offset + 55 + 2) return cursor.readUint16()\n if (prefix === offset + 55 + 3) return cursor.readUint24()\n if (prefix === offset + 55 + 4) return cursor.readUint32()\n throw new Errors.BaseError('Invalid RLP prefix')\n}\n\n/** @internal */\nexport declare namespace readLength {\n type ErrorType = Errors.BaseError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function readList(\n cursor: Cursor.Cursor,\n length: number,\n to: to | 'Hex' | 'Bytes',\n) {\n const position = cursor.position\n const value: decodeRlpCursor.ReturnType[] = []\n while (cursor.position - position < length)\n value.push(decodeRlpCursor(cursor, to))\n return value\n}\n\n/** @internal */\nexport declare namespace readList {\n type ErrorType = Errors.GlobalErrorType\n}\n\ntype Encodable = {\n length: number\n encode(cursor: Cursor.Cursor): void\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value into a Recursive-Length Prefix (RLP) value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Rlp } from 'ox'\n *\n * Rlp.from('0x68656c6c6f20776f726c64', { as: 'Hex' })\n * // @log: 0x8b68656c6c6f20776f726c64\n *\n * Rlp.from(Bytes.from([139, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]), { as: 'Bytes' })\n * // @log: Uint8Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100])\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value to encode.\n * @param options - Options.\n * @returns The RLP value.\n */\nexport function from(\n value: RecursiveArray | RecursiveArray,\n options: from.Options,\n): from.ReturnType {\n const { as } = options\n\n const encodable = getEncodable(value)\n const cursor = Cursor.create(new Uint8Array(encodable.length))\n encodable.encode(cursor)\n\n if (as === 'Hex') return Hex.fromBytes(cursor.bytes) as from.ReturnType\n return cursor.bytes as from.ReturnType\n}\n\nexport declare namespace from {\n type Options = {\n /** The type to convert the RLP value to. */\n as: as | 'Hex' | 'Bytes'\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Cursor.create.ErrorType\n | Hex.fromBytes.ErrorType\n | Bytes.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a Recursive-Length Prefix (RLP) value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Rlp } from 'ox'\n *\n * Rlp.fromBytes(Bytes.from([139, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]))\n * // @log: Uint8Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100])\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} value to encode.\n * @param options - Options.\n * @returns The RLP value.\n */\nexport function fromBytes(\n bytes: RecursiveArray,\n options: fromBytes.Options = {},\n): fromBytes.ReturnType {\n const { as = 'Bytes' } = options\n return from(bytes, { as }) as never\n}\n\nexport declare namespace fromBytes {\n type Options = ExactPartial<\n from.Options\n >\n\n type ReturnType = from.ReturnType\n\n type ErrorType = from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Encodes a {@link ox#Hex.Hex} value into a Recursive-Length Prefix (RLP) value.\n *\n * @example\n * ```ts twoslash\n * import { Rlp } from 'ox'\n *\n * Rlp.fromHex('0x68656c6c6f20776f726c64')\n * // @log: 0x8b68656c6c6f20776f726c64\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to encode.\n * @param options - Options.\n * @returns The RLP value.\n */\nexport function fromHex(\n hex: RecursiveArray,\n options: fromHex.Options = {},\n): fromHex.ReturnType {\n const { as = 'Hex' } = options\n return from(hex, { as }) as never\n}\n\nexport declare namespace fromHex {\n type Options = ExactPartial<\n from.Options\n >\n\n type ReturnType = from.ReturnType\n\n type ErrorType = from.ErrorType | Errors.GlobalErrorType\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n// Internal\n/////////////////////////////////////////////////////////////////////////////////\n\nfunction getEncodable(\n bytes: RecursiveArray | RecursiveArray,\n): Encodable {\n if (Array.isArray(bytes))\n return getEncodableList(bytes.map((x) => getEncodable(x)))\n return getEncodableBytes(bytes as any)\n}\n\nfunction getEncodableList(list: Encodable[]): Encodable {\n const bodyLength = list.reduce((acc, x) => acc + x.length, 0)\n\n const sizeOfBodyLength = getSizeOfLength(bodyLength)\n const length = (() => {\n if (bodyLength <= 55) return 1 + bodyLength\n return 1 + sizeOfBodyLength + bodyLength\n })()\n\n return {\n length,\n encode(cursor: Cursor.Cursor) {\n if (bodyLength <= 55) {\n cursor.pushByte(0xc0 + bodyLength)\n } else {\n cursor.pushByte(0xc0 + 55 + sizeOfBodyLength)\n if (sizeOfBodyLength === 1) cursor.pushUint8(bodyLength)\n else if (sizeOfBodyLength === 2) cursor.pushUint16(bodyLength)\n else if (sizeOfBodyLength === 3) cursor.pushUint24(bodyLength)\n else cursor.pushUint32(bodyLength)\n }\n for (const { encode } of list) {\n encode(cursor)\n }\n },\n }\n}\n\nfunction getEncodableBytes(bytesOrHex: Bytes.Bytes | Hex.Hex): Encodable {\n const bytes =\n typeof bytesOrHex === 'string' ? Bytes.fromHex(bytesOrHex) : bytesOrHex\n\n const sizeOfBytesLength = getSizeOfLength(bytes.length)\n const length = (() => {\n if (bytes.length === 1 && bytes[0]! < 0x80) return 1\n if (bytes.length <= 55) return 1 + bytes.length\n return 1 + sizeOfBytesLength + bytes.length\n })()\n\n return {\n length,\n encode(cursor: Cursor.Cursor) {\n if (bytes.length === 1 && bytes[0]! < 0x80) {\n cursor.pushBytes(bytes)\n } else if (bytes.length <= 55) {\n cursor.pushByte(0x80 + bytes.length)\n cursor.pushBytes(bytes)\n } else {\n cursor.pushByte(0x80 + 55 + sizeOfBytesLength)\n if (sizeOfBytesLength === 1) cursor.pushUint8(bytes.length)\n else if (sizeOfBytesLength === 2) cursor.pushUint16(bytes.length)\n else if (sizeOfBytesLength === 3) cursor.pushUint24(bytes.length)\n else cursor.pushUint32(bytes.length)\n cursor.pushBytes(bytes)\n }\n },\n }\n}\n\nfunction getSizeOfLength(length: number) {\n if (length <= 0xff) return 1\n if (length <= 0xff_ff) return 2\n if (length <= 0xff_ff_ff) return 3\n if (length <= 0xff_ff_ff_ff) return 4\n throw new Errors.BaseError('Length is too large.')\n}\n","/**\n * Utils for modular division and finite fields.\n * A finite field over 11 is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { anumber } from '@noble/hashes/utils';\nimport {\n bitMask,\n bytesToNumberBE,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from './utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _8n = /* @__PURE__ */ BigInt(8);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * TODO: remove.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp: IField, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n // Throw if root^2 != n\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\nfunction sqrt5mod8(Fp: IField, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n return root;\n}\n\n// TODO: Commented-out for now. Provide test vectors.\n// Tonelli is too slow for extension fields Fp2.\n// That means we can't use sqrt (c1, c2...) even for initialization constants.\n// if (P % _16n === _9n) return sqrt9mod16;\n// // prettier-ignore\n// function sqrt9mod16(Fp: IField, n: T, p7div16?: bigint) {\n// if (p7div16 === undefined) p7div16 = (Fp.ORDER + BigInt(7)) / _16n;\n// const c1 = Fp.sqrt(Fp.neg(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n// const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n// const c3 = Fp.sqrt(Fp.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n// const c4 = p7div16; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n// let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n// let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1\n// const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1\n// let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1\n// const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n// const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n// tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n// tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n// const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n// return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2\n// }\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): (Fp: IField, n: T) => T {\n // Initialization (precomputation).\n if (P < BigInt(3)) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp: IField, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): (Fp: IField, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) not implemented, see above\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField {\n ORDER: bigint;\n isLE: boolean;\n BYTES: number;\n BITS: number;\n MASK: bigint;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField(field: IField): IField {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'isSafeInteger',\n BITS: 'isSafeInteger',\n } as Record;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n return validateObject(field, opts);\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp: IField, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp: IField, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv(Fp: IField, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp: IField, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp: IField, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\n// CURVE.n lengths\nexport function nLength(\n n: bigint,\n nBitLength?: number\n): {\n nBitLength: number;\n nByteLength: number;\n} {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField & Required, 'isOdd'>>;\n/**\n * Initializes a finite field over prime.\n * Major performance optimizations:\n * * a) denormalized operations like mulN instead of mul\n * * b) same object shape: never add or remove keys\n * * c) Object.freeze\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n * @param ORDER prime positive bigint\n * @param bitLen how many bits the field consumes\n * @param isLE (def: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n ORDER: bigint,\n bitLen?: number,\n isLE = false,\n redef: Partial> = {}\n): Readonly {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen);\n if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP: ReturnType; // cached sqrtP\n const f: Readonly = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n\n inv: (num) => invert(num, ORDER),\n sqrt:\n redef.sqrt ||\n ((n) => {\n if (!sqrtP) sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes) => {\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n } as FpField);\n return Object.freeze(f);\n}\n\nexport function FpSqrtOdd(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n hash: string | Uint8Array,\n groupOrder: bigint,\n isLE = false\n): bigint {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(\n 'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n );\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type IField, nLength, validateField } from './modular.ts';\nimport { bitLen, bitMask, validateObject } from './utils.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint = {\n x: T;\n y: T;\n} & { z?: never; t?: never };\n\nexport interface Group> {\n double(): T;\n negate(): T;\n add(other: T): T;\n subtract(other: T): T;\n equals(other: T): boolean;\n multiply(scalar: bigint): T;\n}\n\nexport type GroupConstructor = {\n BASE: T;\n ZERO: T;\n};\nexport type Mapper = (i: T[]) => T[];\n\nfunction constTimeNegate>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\n\nfunction getW(P: any): number {\n return pointWindowSizes.get(P) || 1;\n}\n\nexport type IWNAF> = {\n constTimeNegate: >(condition: boolean, item: T) => T;\n hasPrecomputes(elm: T): boolean;\n unsafeLadder(elm: T, n: bigint, p?: T): T;\n precomputeWindow(elm: T, W: number): Group[];\n getPrecomputes(W: number, P: T, transform: Mapper): T[];\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T };\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc?: T): T;\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T };\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T;\n setWindowSize(P: T, W: number): void;\n};\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport function wNAF>(c: GroupConstructor, bits: number): IWNAF {\n return {\n constTimeNegate,\n\n hasPrecomputes(elm: T) {\n return getW(elm) !== 1;\n },\n\n // non-const time multiplication ladder\n unsafeLadder(elm: T, n: bigint, p = c.ZERO) {\n let d: T = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n },\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param elm Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(elm: T, W: number): Group[] {\n const { windows, windowSize } = calcWOpts(W, bits);\n const points: T[] = [];\n let p: T = elm;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n },\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @returns real and fake (for const-time) points\n */\n wNAF(W: number, precomputes: T[], n: bigint): { p: T; f: T } {\n // Smaller version:\n // https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n // TODO: check the scalar is less than group order?\n // wNAF behavior is undefined otherwise. But have to carefully remove\n // other checks before wNAF. ORDER == bits here.\n // Accumulators\n let p = c.ZERO;\n let f = c.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(constTimeNegate(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(constTimeNegate(isNeg, precomputes[offset]));\n }\n }\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n },\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(W: number, precomputes: T[], n: bigint, acc: T = c.ZERO): T {\n const wo = calcWOpts(W, bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n return acc;\n },\n\n getPrecomputes(W: number, P: T, transform: Mapper): T[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(P);\n if (!comp) {\n comp = this.precomputeWindow(P, W) as T[];\n if (W !== 1) pointPrecomputes.set(P, transform(comp));\n }\n return comp;\n },\n\n wNAFCached(P: T, n: bigint, transform: Mapper): { p: T; f: T } {\n const W = getW(P);\n return this.wNAF(W, this.getPrecomputes(W, P, transform), n);\n },\n\n wNAFCachedUnsafe(P: T, n: bigint, transform: Mapper, prev?: T): T {\n const W = getW(P);\n if (W === 1) return this.unsafeLadder(P, n, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, P, transform), n, prev);\n },\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n\n setWindowSize(P: T, W: number) {\n validateW(W, bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n },\n };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka private keys / bigints)\n */\nexport function pippenger>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n scalars: bigint[]\n): T {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as T;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe>(\n c: GroupConstructor,\n fieldN: IField,\n points: T[],\n windowSize: number\n): (scalars: bigint[]) => T {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: T) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): T => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve = {\n Fp: IField; // Field over which we'll do calculations (Fp)\n n: bigint; // Curve order, total count of valid points in the field\n nBitLength?: number; // bit length of curve order\n nByteLength?: number; // byte length of curve order\n h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n hEff?: bigint; // Number to multiply to clear cofactor\n Gx: T; // base point X coordinate\n Gy: T; // base point Y coordinate\n allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\nexport function validateBasic(\n curve: BasicCurve & T\n): Readonly<\n {\n readonly nBitLength: number;\n readonly nByteLength: number;\n } & BasicCurve &\n T & {\n p: bigint;\n }\n> {\n validateField(curve.Fp);\n validateObject(\n curve,\n {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n },\n {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n }\n );\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n } as const);\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Parameters\n *\n * To initialize a weierstrass curve, one needs to pass following params:\n *\n * * a: formula param\n * * b: formula param\n * * Fp: finite field of prime characteristic P; may be complex (Fp2). Arithmetics is done in field\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * Gx: Base point (x, y) aka generator point. Gx = x coordinate\n * * Gy: ...y coordinate\n * * h: cofactor, usually 1. h*n = curve group order (n is only subgroup order)\n * * lowS: whether to enable (default) or disable \"low-s\" non-malleable signatures\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// prettier-ignore\nimport {\n pippenger, validateBasic, wNAF,\n type AffinePoint, type BasicCurve, type Group, type GroupConstructor\n} from './curve.ts';\n// prettier-ignore\nimport {\n Field,\n FpInvertBatch,\n getMinHashLength, invert, mapHashToField, mod, validateField,\n type IField\n} from './modular.ts';\n// prettier-ignore\nimport {\n aInRange, abool,\n bitMask,\n bytesToHex, bytesToNumberBE, concatBytes, createHmacDrbg, ensureBytes, hexToBytes,\n inRange, isBytes, memoized, numberToBytesBE, numberToHexUnpadded, validateObject,\n type CHash, type Hex, type PrivKey\n} from './utils.ts';\n\nexport type { AffinePoint };\ntype HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n splitScalar: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\nexport type BasicWCurve = BasicCurve & {\n // Params: a, b\n a: T;\n b: T;\n\n // Optional params\n allowedPrivateKeyLengths?: readonly number[]; // for P521\n wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n endo?: EndomorphismOpts;\n // When a cofactor != 1, there can be an effective methods to:\n // 1. Determine whether a point is torsion-free\n isTorsionFree?: (c: ProjConstructor, point: ProjPointType) => boolean;\n // 2. Clear torsion component\n clearCofactor?: (c: ProjConstructor, point: ProjPointType) => ProjPointType;\n};\n\nexport type Entropy = Hex | boolean;\nexport type SignOpts = { lowS?: boolean; extraEntropy?: Entropy; prehash?: boolean };\nexport type VerOpts = { lowS?: boolean; prehash?: boolean; format?: 'compact' | 'der' | undefined };\n\nfunction validateSigVerOpts(opts: SignOpts | VerOpts) {\n if (opts.lowS !== undefined) abool('lowS', opts.lowS);\n if (opts.prehash !== undefined) abool('prehash', opts.prehash);\n}\n\n// Instance for 3d XYZ points\nexport interface ProjPointType extends Group> {\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n get x(): T;\n get y(): T;\n toAffine(iz?: T): AffinePoint;\n toHex(isCompressed?: boolean): string;\n toRawBytes(isCompressed?: boolean): Uint8Array;\n\n assertValidity(): void;\n hasEvenY(): boolean;\n multiplyUnsafe(scalar: bigint): ProjPointType;\n multiplyAndAddUnsafe(Q: ProjPointType, a: bigint, b: bigint): ProjPointType | undefined;\n isTorsionFree(): boolean;\n clearCofactor(): ProjPointType;\n _setWindowSize(windowSize: number): void;\n}\n// Static methods for 3d XYZ points\nexport interface ProjConstructor extends GroupConstructor> {\n new (x: T, y: T, z: T): ProjPointType;\n fromAffine(p: AffinePoint): ProjPointType;\n fromHex(hex: Hex): ProjPointType;\n fromPrivateKey(privateKey: PrivKey): ProjPointType;\n normalizeZ(points: ProjPointType[]): ProjPointType[];\n msm(points: ProjPointType[], scalars: bigint[]): ProjPointType;\n}\n\nexport type CurvePointsType = BasicWCurve & {\n // Bytes\n fromBytes?: (bytes: Uint8Array) => AffinePoint;\n toBytes?: (c: ProjConstructor, point: ProjPointType, isCompressed: boolean) => Uint8Array;\n};\n\nexport type CurvePointsTypeWithLength = Readonly<\n CurvePointsType & { nByteLength: number; nBitLength: number }\n>;\n\nfunction validatePointOpts(curve: CurvePointsType): CurvePointsTypeWithLength {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n a: 'field',\n b: 'field',\n },\n {\n allowInfinityPoint: 'boolean',\n allowedPrivateKeyLengths: 'array',\n clearCofactor: 'function',\n fromBytes: 'function',\n isTorsionFree: 'function',\n toBytes: 'function',\n wrapPrivateKey: 'boolean',\n }\n );\n const { endo, Fp, a } = opts;\n if (endo) {\n if (!Fp.eql(a, Fp.ZERO)) {\n throw new Error('invalid endo: CURVE.a must be 0');\n }\n if (\n typeof endo !== 'object' ||\n typeof endo.beta !== 'bigint' ||\n typeof endo.splitScalar !== 'function'\n ) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"splitScalar\": function');\n }\n }\n return Object.freeze({ ...opts } as const);\n}\n\nexport type CurvePointsRes = {\n CURVE: ReturnType>;\n ProjectivePoint: ProjConstructor;\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n weierstrassEquation: (x: T) => T;\n isWithinCurveOrder: (num: bigint) => boolean;\n};\n\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\nfunction numToSizedHex(num: bigint, size: number): string {\n return bytesToHex(numberToBytesBE(num, size));\n}\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function weierstrassPoints(opts: CurvePointsType): CurvePointsRes {\n const CURVE = validatePointOpts(opts);\n const { Fp } = CURVE; // All curves has same field / group length as for now, but they can differ\n const Fn = Field(CURVE.n, CURVE.nBitLength);\n\n const toBytes =\n CURVE.toBytes ||\n ((_c: ProjConstructor, point: ProjPointType, _isCompressed: boolean) => {\n const a = point.toAffine();\n return concatBytes(Uint8Array.from([0x04]), Fp.toBytes(a.x), Fp.toBytes(a.y));\n });\n const fromBytes =\n CURVE.fromBytes ||\n ((bytes: Uint8Array) => {\n // const head = bytes[0];\n const tail = bytes.subarray(1);\n // if (head !== 0x04) throw new Error('Only non-compressed encoding is supported');\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n });\n\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x: T): T {\n const { a, b } = CURVE;\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n // Valid group elements reside in range 1..n-1\n function isWithinCurveOrder(num: bigint): boolean {\n return inRange(num, _1n, CURVE.n);\n }\n // Validates if priv key is valid and converts it to bigint.\n // Supports options allowedPrivateKeyLengths and wrapPrivateKey.\n function normPrivateKeyToScalar(key: PrivKey): bigint {\n const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n: N } = CURVE;\n if (lengths && typeof key !== 'bigint') {\n if (isBytes(key)) key = bytesToHex(key);\n // Normalize to hex string, pad. E.g. P521 would norm 130-132 char hex to 132-char bytes\n if (typeof key !== 'string' || !lengths.includes(key.length))\n throw new Error('invalid private key');\n key = key.padStart(nByteLength * 2, '0');\n }\n let num: bigint;\n try {\n num =\n typeof key === 'bigint'\n ? key\n : bytesToNumberBE(ensureBytes('private key', key, nByteLength));\n } catch (error) {\n throw new Error(\n 'invalid private key, expected hex or ' + nByteLength + ' bytes, got ' + typeof key\n );\n }\n if (wrapPrivateKey) num = mod(num, N); // disabled by default, enabled for BLS\n aInRange('private key', num, _1n, N); // num in range [1..N-1]\n return num;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint => {\n const { px: x, py: y, pz: z } = p;\n // Fast-path for normalized points\n if (Fp.eql(z, Fp.ONE)) return { x, y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(z);\n const ax = Fp.mul(x, iz);\n const ay = Fp.mul(y, iz);\n const zz = Fp.mul(z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x: ax, y: ay };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (CURVE.allowInfinityPoint && !Fp.is0(p.py)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n // Check if x, y are valid field elements\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not FE');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates: (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n * Default Point works in 2d / affine coordinates: (x, y)\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements ProjPointType {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n readonly px: T;\n readonly py: T;\n readonly pz: T;\n\n constructor(px: T, py: T, pz: T) {\n if (px == null || !Fp.isValid(px)) throw new Error('x required');\n if (py == null || !Fp.isValid(py) || Fp.is0(py)) throw new Error('y required');\n if (pz == null || !Fp.isValid(pz)) throw new Error('z required');\n this.px = px;\n this.py = py;\n this.pz = pz;\n Object.freeze(this);\n }\n\n // Does not validate if the point is on-curve.\n // Use fromHex instead, or call assertValidity() later.\n static fromAffine(p: AffinePoint): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n const is0 = (i: T) => Fp.eql(i, Fp.ZERO);\n // fromAffine(x:0, y:0) would produce (x:0, y:0, z:1), but we need (x:0, y:1, z:0)\n if (is0(x) && is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\n static normalizeZ(points: Point[]): Point[] {\n const toInv = FpInvertBatch(\n Fp,\n points.map((p) => p.pz)\n );\n return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);\n }\n\n /**\n * Converts hash string or Uint8Array to Point.\n * @param hex short/long ECDSA hex\n */\n static fromHex(hex: Hex): Point {\n const P = Point.fromAffine(fromBytes(ensureBytes('pointHex', hex)));\n P.assertValidity();\n return P;\n }\n\n // Multiplies generator point by privateKey.\n static fromPrivateKey(privateKey: PrivKey) {\n return Point.BASE.multiply(normPrivateKeyToScalar(privateKey));\n }\n\n // Multiscalar Multiplication\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n\n // \"Private method\", don't use it directly\n _setWindowSize(windowSize: number) {\n wnaf.setWindowSize(this, windowSize);\n }\n\n // A point on curve is valid if it conforms to equation.\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (Fp.isOdd) return !Fp.isOdd(y);\n throw new Error(\"Field doesn't support isOdd\");\n }\n\n /**\n * Compare one point to another.\n */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /**\n * Flips point to one corresponding to (x, -y) in Affine coordinates.\n */\n negate(): Point {\n return new Point(this.px, Fp.neg(this.py), this.pz);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { px: X1, py: Y1, pz: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0() {\n return this.equals(Point.ZERO);\n }\n\n private wNAF(n: bigint): { p: Point; f: Point } {\n return wnaf.wNAFCached(this, n, Point.normalizeZ);\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed private key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', sc, _0n, N);\n const I = Point.ZERO;\n if (sc === _0n) return I;\n if (this.is0() || sc === _1n) return this;\n\n // Case a: no endomorphism. Case b: has precomputes.\n if (!endo || wnaf.hasPrecomputes(this))\n return wnaf.wNAFCachedUnsafe(this, sc, Point.normalizeZ);\n\n // Case c: endomorphism\n /** See docs for {@link EndomorphismOpts} */\n let { k1neg, k1, k2neg, k2 } = endo.splitScalar(sc);\n let k1p = I;\n let k2p = I;\n let d: Point = this;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) k1p = k1p.add(d);\n if (k2 & _1n) k2p = k2p.add(d);\n d = d.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n if (k1neg) k1p = k1p.negate();\n if (k2neg) k2p = k2p.negate();\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n return k1p.add(k2p);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo, n: N } = CURVE;\n aInRange('scalar', scalar, _1n, N);\n let point: Point, fake: Point; // Fake point is used to const-time mult\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = endo.splitScalar(scalar);\n let { p: k1p, f: f1p } = this.wNAF(k1);\n let { p: k2p, f: f2p } = this.wNAF(k2);\n k1p = wnaf.constTimeNegate(k1neg, k1p);\n k2p = wnaf.constTimeNegate(k2neg, k2p);\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n point = k1p.add(k2p);\n fake = f1p.add(f2p);\n } else {\n const { p, f } = this.wNAF(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return Point.normalizeZ([point, fake])[0];\n }\n\n /**\n * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly.\n * Not using Strauss-Shamir trick: precomputation tables are faster.\n * The trick could be useful if both P and Q are not G (not in our case).\n * @returns non-zero affine point\n */\n multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n const G = Point.BASE; // No Strauss-Shamir trick: we have 10% faster G precomputes\n const mul = (\n P: Point,\n a: bigint // Select faster multiply() method\n ) => (a === _0n || a === _1n || !P.equals(G) ? P.multiplyUnsafe(a) : P.multiply(a));\n const sum = mul(this, a).add(mul(Q, b));\n return sum.is0() ? undefined : sum;\n }\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (x, y, z) ∋ (x=x/z, y=y/z)\n toAffine(iz?: T): AffinePoint {\n return toAffineMemo(this, iz);\n }\n isTorsionFree(): boolean {\n const { h: cofactor, isTorsionFree } = CURVE;\n if (cofactor === _1n) return true; // No subgroups, always torsion-free\n if (isTorsionFree) return isTorsionFree(Point, this);\n throw new Error('isTorsionFree() has not been declared for the elliptic curve');\n }\n clearCofactor(): Point {\n const { h: cofactor, clearCofactor } = CURVE;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(CURVE.h);\n }\n\n toRawBytes(isCompressed = true): Uint8Array {\n abool('isCompressed', isCompressed);\n this.assertValidity();\n return toBytes(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n abool('isCompressed', isCompressed);\n return bytesToHex(this.toRawBytes(isCompressed));\n }\n }\n const { endo, nBitLength } = CURVE;\n const wnaf = wNAF(Point, endo ? Math.ceil(nBitLength / 2) : nBitLength);\n return {\n CURVE,\n ProjectivePoint: Point as ProjConstructor,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n };\n}\n\n// Instance\nexport interface SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n assertValidity(): void;\n addRecoveryBit(recovery: number): RecoveredSignatureType;\n hasHighS(): boolean;\n normalizeS(): SignatureType;\n recoverPublicKey(msgHash: Hex): ProjPointType;\n toCompactRawBytes(): Uint8Array;\n toCompactHex(): string;\n toDERRawBytes(isCompressed?: boolean): Uint8Array;\n toDERHex(isCompressed?: boolean): string;\n}\nexport type RecoveredSignatureType = SignatureType & {\n readonly recovery: number;\n};\n// Static methods\nexport type SignatureConstructor = {\n new (r: bigint, s: bigint): SignatureType;\n fromCompact(hex: Hex): SignatureType;\n fromDER(hex: Hex): SignatureType;\n};\ntype SignatureLike = { r: bigint; s: bigint };\n\nexport type PubKey = Hex | ProjPointType;\n\nexport type CurveType = BasicWCurve & {\n hash: CHash; // CHash not FHash because we need outputLen for DRBG\n hmac: HmacFnSync;\n randomBytes: (bytesLength?: number) => Uint8Array;\n lowS?: boolean;\n bits2int?: (bytes: Uint8Array) => bigint;\n bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\n\nfunction validateOpts(\n curve: CurveType\n): Readonly {\n const opts = validateBasic(curve);\n validateObject(\n opts,\n {\n hash: 'hash',\n hmac: 'function',\n randomBytes: 'function',\n },\n {\n bits2int: 'function',\n bits2int_modN: 'function',\n lowS: 'boolean',\n }\n );\n return Object.freeze({ lowS: true, ...opts } as const);\n}\n\nexport type CurveFn = {\n CURVE: ReturnType;\n getPublicKey: (privateKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (privateA: PrivKey, publicB: Hex, isCompressed?: boolean) => Uint8Array;\n sign: (msgHash: Hex, privKey: PrivKey, opts?: SignOpts) => RecoveredSignatureType;\n verify: (signature: Hex | SignatureLike, msgHash: Hex, publicKey: Hex, opts?: VerOpts) => boolean;\n ProjectivePoint: ProjConstructor;\n Signature: SignatureConstructor;\n utils: {\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n isValidPrivateKey(privateKey: PrivKey): boolean;\n randomPrivateKey: () => Uint8Array;\n precompute: (windowSize?: number, point?: ProjPointType) => ProjPointType;\n };\n};\n\n/**\n * Creates short weierstrass curve and ECDSA signature methods for it.\n * @example\n * import { Field } from '@noble/curves/abstract/modular';\n * // Before that, define BigInt-s: a, b, p, n, Gx, Gy\n * const curve = weierstrass({ a, b, Fp: Field(p), n, Gx, Gy, h: 1n })\n */\nexport function weierstrass(curveDef: CurveType): CurveFn {\n const CURVE = validateOpts(curveDef) as ReturnType;\n const { Fp, n: CURVE_ORDER, nByteLength, nBitLength } = CURVE;\n const compressedLen = Fp.BYTES + 1; // e.g. 33 for 32\n const uncompressedLen = 2 * Fp.BYTES + 1; // e.g. 65 for 32\n\n function modN(a: bigint) {\n return mod(a, CURVE_ORDER);\n }\n function invN(a: bigint) {\n return invert(a, CURVE_ORDER);\n }\n\n const {\n ProjectivePoint: Point,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n } = weierstrassPoints({\n ...CURVE,\n toBytes(_c, point, isCompressed: boolean): Uint8Array {\n const a = point.toAffine();\n const x = Fp.toBytes(a.x);\n const cat = concatBytes;\n abool('isCompressed', isCompressed);\n if (isCompressed) {\n return cat(Uint8Array.from([point.hasEvenY() ? 0x02 : 0x03]), x);\n } else {\n return cat(Uint8Array.from([0x04]), x, Fp.toBytes(a.y));\n }\n },\n fromBytes(bytes: Uint8Array) {\n const len = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // this.assertValidity() is done inside of fromHex\n if (len === compressedLen && (head === 0x02 || head === 0x03)) {\n const x = bytesToNumberBE(tail);\n if (!inRange(x, _1n, Fp.ORDER)) throw new Error('Point is not on curve');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: bigint;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const suffix = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('Point is not on curve' + suffix);\n }\n const isYOdd = (y & _1n) === _1n;\n // ECDSA\n const isHeadOdd = (head & 1) === 1;\n if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n return { x, y };\n } else if (len === uncompressedLen && head === 0x04) {\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n } else {\n const cl = compressedLen;\n const ul = uncompressedLen;\n throw new Error(\n 'invalid Point, expected length of ' + cl + ', or uncompressed ' + ul + ', got ' + len\n );\n }\n },\n });\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n\n function normalizeS(s: bigint) {\n return isBiggerThanHalfOrder(s) ? modN(-s) : s;\n }\n // slice bytes num\n const slcNum = (b: Uint8Array, from: number, to: number) => bytesToNumberBE(b.slice(from, to));\n\n /**\n * ECDSA signature with its (r, s) properties. Supports DER & compact representations.\n */\n class Signature implements SignatureType {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n constructor(r: bigint, s: bigint, recovery?: number) {\n aInRange('r', r, _1n, CURVE_ORDER); // r in [1..N]\n aInRange('s', s, _1n, CURVE_ORDER); // s in [1..N]\n this.r = r;\n this.s = s;\n if (recovery != null) this.recovery = recovery;\n Object.freeze(this);\n }\n\n // pair (bytes of r, bytes of s)\n static fromCompact(hex: Hex) {\n const l = nByteLength;\n hex = ensureBytes('compactSignature', hex, l * 2);\n return new Signature(slcNum(hex, 0, l), slcNum(hex, l, 2 * l));\n }\n\n // DER encoded ECDSA signature\n // https://bitcoin.stackexchange.com/questions/57644/what-are-the-parts-of-a-bitcoin-transaction-input-script\n static fromDER(hex: Hex) {\n const { r, s } = DER.toSig(ensureBytes('DER', hex));\n return new Signature(r, s);\n }\n\n /**\n * @todo remove\n * @deprecated\n */\n assertValidity(): void {}\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(msgHash: Hex): typeof Point.BASE {\n const { r, s, recovery: rec } = this;\n const h = bits2int_modN(ensureBytes('msgHash', msgHash)); // Truncate hash\n if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n const radj = rec === 2 || rec === 3 ? r + CURVE.n : r;\n if (radj >= Fp.ORDER) throw new Error('recovery id 2 or 3 invalid');\n const prefix = (rec & 1) === 0 ? '02' : '03';\n const R = Point.fromHex(prefix + numToSizedHex(radj, Fp.BYTES));\n const ir = invN(radj); // r^-1\n const u1 = modN(-h * ir); // -hr^-1\n const u2 = modN(s * ir); // sr^-1\n const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2); // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1)\n if (!Q) throw new Error('point at infinify'); // unsafe is fine: no priv data leaked\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, modN(-this.s), this.recovery) : this;\n }\n\n // DER-encoded\n toDERRawBytes() {\n return hexToBytes(this.toDERHex());\n }\n toDERHex() {\n return DER.hexFromSig(this);\n }\n\n // padded bytes of r, then padded bytes of s\n toCompactRawBytes() {\n return hexToBytes(this.toCompactHex());\n }\n toCompactHex() {\n const l = nByteLength;\n return numToSizedHex(this.r, l) + numToSizedHex(this.s, l);\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n const utils = {\n isValidPrivateKey(privateKey: PrivKey) {\n try {\n normPrivateKeyToScalar(privateKey);\n return true;\n } catch (error) {\n return false;\n }\n },\n normPrivateKeyToScalar: normPrivateKeyToScalar,\n\n /**\n * Produces cryptographically secure private key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n randomPrivateKey: (): Uint8Array => {\n const length = getMinHashLength(CURVE.n);\n return mapHashToField(CURVE.randomBytes(length), CURVE.n);\n },\n\n /**\n * Creates precompute table for an arbitrary EC point. Makes point \"cached\".\n * Allows to massively speed-up `point.multiply(scalar)`.\n * @returns cached point\n * @example\n * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey));\n * fast.multiply(privKey); // much faster ECDH now\n */\n precompute(windowSize = 8, point = Point.BASE): typeof Point.BASE {\n point._setWindowSize(windowSize);\n point.multiply(BigInt(3)); // 3 is arbitrary, just need any number here\n return point;\n },\n };\n\n /**\n * Computes public key for a private key. Checks for validity of the private key.\n * @param privateKey private key\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(privateKey: PrivKey, isCompressed = true): Uint8Array {\n return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n if (typeof item === 'bigint') return false;\n if (item instanceof Point) return true;\n const arr = ensureBytes('key', item);\n const len = arr.length;\n const fpl = Fp.BYTES;\n const compLen = fpl + 1; // e.g. 33 for 32\n const uncompLen = 2 * fpl + 1; // e.g. 65 for 32\n if (CURVE.allowedPrivateKeyLengths || nByteLength === compLen) {\n return undefined;\n } else {\n return len === compLen || len === uncompLen;\n }\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from private key and public key.\n * Checks: 1) private key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param privateA private key\n * @param publicB different public key\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(privateA: PrivKey, publicB: Hex, isCompressed = true): Uint8Array {\n if (isProbPub(privateA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicB) === false) throw new Error('second arg must be public key');\n const b = Point.fromHex(publicB); // check for being on-curve\n return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed);\n }\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n CURVE.bits2int ||\n function (bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - nBitLength; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n CURVE.bits2int_modN ||\n function (bytes: Uint8Array): bigint {\n return modN(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // NOTE: pads output with zero as per spec\n const ORDER_MASK = bitMask(nBitLength);\n /**\n * Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`.\n */\n function int2octets(num: bigint): Uint8Array {\n aInRange('num < 2^' + nBitLength, num, _0n, ORDER_MASK);\n // works with order, can have different size than numToField!\n return numberToBytesBE(num, nByteLength);\n }\n\n // Steps A, D of RFC6979 3.2\n // Creates RFC6979 seed; converts msg/privKey to numbers.\n // Used only in sign, not in verify.\n // NOTE: we cannot assume here that msgHash has same amount of bytes as curve order,\n // this will be invalid at least for P521. Also it can be bigger for P224 + SHA256\n function prepSig(msgHash: Hex, privateKey: PrivKey, opts = defaultSigOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { hash, randomBytes } = CURVE;\n let { lowS, prehash, extraEntropy: ent } = opts; // generates low-s sigs by default\n if (lowS == null) lowS = true; // RFC6979 3.2: we skip step A, because we already provide hash\n msgHash = ensureBytes('msgHash', msgHash);\n validateSigVerOpts(opts);\n if (prehash) msgHash = ensureBytes('prehashed msgHash', hash(msgHash));\n\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with nBitLength % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(msgHash);\n const d = normPrivateKeyToScalar(privateKey); // validate private key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (ent != null && ent !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n const e = ent === true ? randomBytes(Fp.BYTES) : ent; // generate random bytes OR pass as-is\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!isWithinCurveOrder(k)) return; // Important: all mod() calls here must be done over N\n const ik = invN(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = Gk\n const r = modN(q.x); // r = q.x mod n\n if (r === _0n) return;\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n const s = modN(ik * modN(m + r * d)); // Not using blinding here\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = normalizeS(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n }\n return { seed, k2sig };\n }\n const defaultSigOpts: SignOpts = { lowS: CURVE.lowS, prehash: false };\n const defaultVerOpts: VerOpts = { lowS: CURVE.lowS, prehash: false };\n\n /**\n * Signs message hash with a private key.\n * ```\n * sign(m, d, k) where\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr)/k mod n\n * ```\n * @param msgHash NOT message. msg needs to be hashed to `msgHash`, or use `prehash`.\n * @param privKey private key\n * @param opts lowS for non-malleable sigs. extraEntropy for mixing randomness into k. prehash will hash first arg.\n * @returns signature with recovery param\n */\n function sign(msgHash: Hex, privKey: PrivKey, opts = defaultSigOpts): RecoveredSignature {\n const { seed, k2sig } = prepSig(msgHash, privKey, opts); // Steps A, D of RFC6979 3.2.\n const C = CURVE;\n const drbg = createHmacDrbg(C.hash.outputLen, C.nByteLength, C.hmac);\n return drbg(seed, k2sig); // Steps B, C, D, E, F, G\n }\n\n // Enable precomputes. Slows down first publicKey computation by 20ms.\n Point.BASE._setWindowSize(8);\n // utils.precompute(8, ProjectivePoint.BASE)\n\n /**\n * Verifies a signature against message hash and public key.\n * Rejects lowS signatures by default: to override,\n * specify option `{lowS: false}`. Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * U1 = hs^-1 mod n\n * U2 = rs^-1 mod n\n * R = U1⋅G - U2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Hex | SignatureLike,\n msgHash: Hex,\n publicKey: Hex,\n opts = defaultVerOpts\n ): boolean {\n const sg = signature;\n msgHash = ensureBytes('msgHash', msgHash);\n publicKey = ensureBytes('publicKey', publicKey);\n const { lowS, prehash, format } = opts;\n\n // Verify opts, deduce signature format\n validateSigVerOpts(opts);\n if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n if (format !== undefined && format !== 'compact' && format !== 'der')\n throw new Error('format must be compact or der');\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj =\n !isHex &&\n !format &&\n typeof sg === 'object' &&\n sg !== null &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n\n let _sig: Signature | undefined = undefined;\n let P: ProjPointType;\n try {\n if (isObj) _sig = new Signature(sg.r, sg.s);\n if (isHex) {\n // Signature can be represented in 2 ways: compact (2*nByteLength) & DER (variable-length).\n // Since DER can also be 2*nByteLength bytes, we check for it first.\n try {\n if (format !== 'compact') _sig = Signature.fromDER(sg);\n } catch (derError) {\n if (!(derError instanceof DER.Err)) throw derError;\n }\n if (!_sig && format !== 'der') _sig = Signature.fromCompact(sg);\n }\n P = Point.fromHex(publicKey);\n } catch (error) {\n return false;\n }\n if (!_sig) return false;\n if (lowS && _sig.hasHighS()) return false;\n if (prehash) msgHash = CURVE.hash(msgHash);\n const { r, s } = _sig;\n const h = bits2int_modN(msgHash); // Cannot use fields methods, since it is group element\n const is = invN(s); // s^-1\n const u1 = modN(h * is); // u1 = hs^-1 mod n\n const u2 = modN(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2)?.toAffine(); // R = u1⋅G + u2⋅P\n if (!R) return false;\n const v = modN(R.x);\n return v === r;\n }\n return {\n CURVE,\n getPublicKey,\n getSharedSecret,\n sign,\n verify,\n ProjectivePoint: Point,\n Signature,\n utils,\n };\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(\n Fp: IField,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(\n Fp: IField,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n if (!Fp.isValid(opts.A) || !Fp.isValid(opts.B) || !Fp.isValid(opts.Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, opts.Z);\n if (!Fp.isOdd) throw new Error('Fp.isOdd is not implemented!');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, opts.Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, opts.B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(opts.Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, opts.A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, opts.A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, opts.B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac } from '@noble/hashes/hmac';\nimport { concatBytes, randomBytes } from '@noble/hashes/utils';\nimport type { CHash } from './abstract/utils.ts';\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): {\n hash: CHash;\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => Uint8Array;\n randomBytes: typeof randomBytes;\n} {\n return {\n hash,\n hmac: (key: Uint8Array, ...msgs: Uint8Array[]) => hmac(hash, key, concatBytes(...msgs)),\n randomBytes,\n };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, ...getHash(hash) });\n return { ...create(defHash), create };\n}\n","/**\n * NIST secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Seems to be rigid (not backdoored)\n * [as per discussion](https://bitcointalk.org/index.php?topic=289795.msg3183975#msg3183975).\n *\n * secp256k1 belongs to Koblitz curves: it has efficiently computable endomorphism.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n * [See explanation](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2';\nimport { randomBytes } from '@noble/hashes/utils';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport { createHasher, type Hasher, type HTFMethod, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mod, pow2 } from './abstract/modular.ts';\nimport type { Hex, PrivKey } from './abstract/utils.ts';\nimport {\n aInRange,\n bytesToNumberBE,\n concatBytes,\n ensureBytes,\n inRange,\n numberToBytesBE,\n} from './abstract/utils.ts';\nimport { mapToCurveSimpleSWU, type ProjPointType as PointType } from './abstract/weierstrass.ts';\n\nconst secp256k1P = BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f');\nconst secp256k1N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst divNearest = (a: bigint, b: bigint) => (a + b / _2n) / b;\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1P;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1P, undefined, undefined, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const priv = secp256k1.utils.randomPrivateKey();\n * const pub = secp256k1.getPublicKey(priv);\n * const msg = new Uint8Array(32).fill(1); // message hash (not message) in ecdsa\n * const sig = secp256k1.sign(msg, priv); // `{prehash: true}` option is available\n * const isValid = secp256k1.verify(sig, msg, pub) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n {\n a: _0n,\n b: BigInt(7),\n Fp: Fpk1,\n n: secp256k1N,\n Gx: BigInt('55066263022277343669578718895168534326250603453777594175500187360389116729240'),\n Gy: BigInt('32670510020758816978083085130507043184471273380659243275938904335757337482424'),\n h: BigInt(1),\n lowS: true, // Allow only low-S signatures by default in sign() and verify()\n endo: {\n // Endomorphism, see above\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n splitScalar: (k: bigint) => {\n const n = secp256k1N;\n const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15');\n const b1 = -_1n * BigInt('0xe4437ed6010e88286f547fa90abfe4c3');\n const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8');\n const b2 = a1;\n const POW_2_128 = BigInt('0x100000000000000000000000000000000'); // (2n**128n).toString(16)\n\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n let k1 = mod(k - c1 * a1 - c2 * a2, n);\n let k2 = mod(-c1 * b1 - c2 * b2, n);\n const k1neg = k1 > POW_2_128;\n const k2neg = k2 > POW_2_128;\n if (k1neg) k1 = n - k1;\n if (k2neg) k2 = n - k2;\n if (k1 > POW_2_128 || k2 > POW_2_128) {\n throw new Error('splitScalar: Endomorphism failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n },\n },\n },\n sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(Uint8Array.from(tag, (c) => c.charCodeAt(0)));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType) => point.toRawBytes(true).slice(1);\nconst numTo32b = (n: bigint) => numberToBytesBE(n, 32);\nconst modP = (x: bigint) => mod(x, secp256k1P);\nconst modN = (x: bigint) => mod(x, secp256k1N);\nconst Point = /* @__PURE__ */ (() => secp256k1.ProjectivePoint)();\nconst GmulAdd = (Q: PointType, a: bigint, b: bigint) =>\n Point.BASE.multiplyAndAddUnsafe(Q, a, b);\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n let d_ = secp256k1.utils.normPrivateKeyToScalar(priv); // same method executed in fromPrivateKey\n let p = Point.fromPrivateKey(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = p.hasEvenY() ? d_ : modN(-d_);\n return { scalar: scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType {\n aInRange('x', x, _1n, secp256k1P); // Fail if x ≥ p.\n const xx = modP(x * x);\n const c = modP(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = sqrtMod(c); // Let y = c^(p+1)/4 mod p.\n if (y % _2n !== _0n) y = modP(-y); // Return the unique point P such that x(P) = x and\n const p = new Point(x, y, _1n); // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return modN(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(privateKey: Hex): Uint8Array {\n return schnorrGetExtPubKey(privateKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Hex,\n privateKey: PrivKey,\n auxRand: Hex = randomBytes(32)\n): Uint8Array {\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(privateKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = numTo32b(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n const k_ = modN(num(rand)); // Let k' = int(rand) mod n\n if (k_ === _0n) throw new Error('sign failed: k is zero'); // Fail if k' = 0.\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(k_); // Let R = k'⋅G.\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(numTo32b(modN(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!inRange(r, _1n, secp256k1P)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!inRange(s, _1n, secp256k1N)) return false;\n const e = challenge(numTo32b(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n const R = GmulAdd(P, s, modN(-e)); // R = s⋅G - e⋅P\n if (!R || !R.hasEvenY() || R.toAffine().x !== r) return false; // -eP == (n-e)P\n return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n utils: {\n randomPrivateKey: () => Uint8Array;\n lift_x: typeof lift_x;\n pointToBytes: (point: PointType) => Uint8Array;\n numberToBytesBE: typeof numberToBytesBE;\n bytesToNumberBE: typeof bytesToNumberBE;\n taggedHash: typeof taggedHash;\n mod: typeof mod;\n };\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const priv = schnorr.utils.randomPrivateKey();\n * const pub = schnorr.getPublicKey(priv);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, priv);\n * const isValid = schnorr.verify(sig, msg, pub);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => ({\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n utils: {\n randomPrivateKey: secp256k1.utils.randomPrivateKey,\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n taggedHash,\n mod,\n },\n}))();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: Hasher = /* @__PURE__ */ (() =>\n createHasher(\n secp256k1.ProjectivePoint,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n } as const\n ))();\n\nexport const hashToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.hashToCurve)();\n\nexport const encodeToCurve: HTFMethod = /* @__PURE__ */ (() =>\n secp256k1_hasher.encodeToCurve)();\n","import { secp256k1 } from '@noble/curves/secp256k1'\nimport * as Bytes from './Bytes.js'\nimport * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type { Compute, ExactPartial, OneOf } from './internal/types.js'\nimport * as Json from './Json.js'\nimport * as Solidity from './Solidity.js'\n\n/** Root type for an ECDSA signature. */\nexport type Signature<\n recovered extends boolean = true,\n bigintType = bigint,\n numberType = number,\n> = Compute<\n recovered extends true\n ? {\n r: bigintType\n s: bigintType\n yParity: numberType\n }\n : {\n r: bigintType\n s: bigintType\n yParity?: numberType | undefined\n }\n>\n\n/** RPC-formatted ECDSA signature. */\nexport type Rpc = Signature<\n recovered,\n Hex.Hex,\n Hex.Hex\n>\n\n/** (Legacy) ECDSA signature. */\nexport type Legacy = {\n r: bigintType\n s: bigintType\n v: numberType\n}\n\n/** RPC-formatted (Legacy) ECDSA signature. */\nexport type LegacyRpc = Legacy\n\nexport type Tuple = readonly [yParity: Hex.Hex, r: Hex.Hex, s: Hex.Hex]\n\n/**\n * Asserts that a Signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.assert({\n * r: -49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * })\n * // @error: InvalidSignatureRError:\n * // @error: Value `-549...n` is an invalid r value.\n * // @error: r must be a positive integer less than 2^256.\n * ```\n *\n * @param signature - The signature object to assert.\n */\nexport function assert(\n signature: ExactPartial,\n options: assert.Options = {},\n): asserts signature is Signature {\n const { recovered } = options\n if (typeof signature.r === 'undefined')\n throw new MissingPropertiesError({ signature })\n if (typeof signature.s === 'undefined')\n throw new MissingPropertiesError({ signature })\n if (recovered && typeof signature.yParity === 'undefined')\n throw new MissingPropertiesError({ signature })\n if (signature.r < 0n || signature.r > Solidity.maxUint256)\n throw new InvalidRError({ value: signature.r })\n if (signature.s < 0n || signature.s > Solidity.maxUint256)\n throw new InvalidSError({ value: signature.s })\n if (\n typeof signature.yParity === 'number' &&\n signature.yParity !== 0 &&\n signature.yParity !== 1\n )\n throw new InvalidYParityError({ value: signature.yParity })\n}\n\nexport declare namespace assert {\n type Options = {\n /** Whether or not the signature should be recovered (contain `yParity`). */\n recovered?: boolean\n }\n\n type ErrorType =\n | MissingPropertiesError\n | InvalidRError\n | InvalidSError\n | InvalidYParityError\n | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#Bytes.Bytes} signature into a structured {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Signature } from 'ox'\n *\n * Signature.fromBytes(new Uint8Array([128, 3, 131, ...]))\n * // @log: { r: 5231...n, s: 3522...n, yParity: 0 }\n * ```\n *\n * @param signature - The serialized signature.\n * @returns The deserialized {@link ox#Signature.Signature}.\n */\nexport function fromBytes(signature: Bytes.Bytes): Signature {\n return fromHex(Hex.fromBytes(signature))\n}\n\nexport declare namespace fromBytes {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#Hex.Hex} signature into a structured {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.fromHex('0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c')\n * // @log: { r: 5231...n, s: 3522...n, yParity: 0 }\n * ```\n *\n * @param serialized - The serialized signature.\n * @returns The deserialized {@link ox#Signature.Signature}.\n */\nexport function fromHex(signature: Hex.Hex): Signature {\n if (signature.length !== 130 && signature.length !== 132)\n throw new InvalidSerializedSizeError({ signature })\n\n const r = BigInt(Hex.slice(signature, 0, 32))\n const s = BigInt(Hex.slice(signature, 32, 64))\n\n const yParity = (() => {\n const yParity = Number(`0x${signature.slice(130)}`)\n if (Number.isNaN(yParity)) return undefined\n try {\n return vToYParity(yParity)\n } catch {\n throw new InvalidYParityError({ value: yParity })\n }\n })()\n\n if (typeof yParity === 'undefined')\n return {\n r,\n s,\n } as never\n return {\n r,\n s,\n yParity,\n } as never\n}\n\nexport declare namespace fromHex {\n type ErrorType =\n | Hex.from.ErrorType\n | InvalidSerializedSizeError\n | Errors.GlobalErrorType\n}\n\n/**\n * Extracts a {@link ox#Signature.Signature} from an arbitrary object that may include signature properties.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Signature } from 'ox'\n *\n * Signature.extract({\n * baz: 'barry',\n * foo: 'bar',\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * zebra: 'stripes',\n * })\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: yParity: 1\n * // @log: }\n * ```\n *\n * @param value - The arbitrary object to extract the signature from.\n * @returns The extracted {@link ox#Signature.Signature}.\n */\nexport function extract(value: extract.Value): Signature | undefined {\n if (typeof value.r === 'undefined') return undefined\n if (typeof value.s === 'undefined') return undefined\n return from(value as any)\n}\n\nexport declare namespace extract {\n type Value = {\n r?: bigint | Hex.Hex | undefined\n s?: bigint | Hex.Hex | undefined\n yParity?: number | Hex.Hex | undefined\n v?: number | Hex.Hex | undefined\n }\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Instantiates a typed {@link ox#Signature.Signature} object from a {@link ox#Signature.Signature}, {@link ox#Signature.Legacy}, {@link ox#Bytes.Bytes}, or {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.from({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * })\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: yParity: 1\n * // @log: }\n * ```\n *\n * @example\n * ### From Serialized\n *\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.from('0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db801')\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: yParity: 1,\n * // @log: }\n * ```\n *\n * @example\n * ### From Legacy\n *\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * Signature.from({\n * r: 47323457007453657207889730243826965761922296599680473886588287015755652701072n,\n * s: 57228803202727131502949358313456071280488184270258293674242124340113824882788n,\n * v: 27,\n * })\n * // @log: {\n * // @log: r: 47323457007453657207889730243826965761922296599680473886588287015755652701072n,\n * // @log: s: 57228803202727131502949358313456071280488184270258293674242124340113824882788n,\n * // @log: yParity: 0\n * // @log: }\n * ```\n *\n * @param signature - The signature value to instantiate.\n * @returns The instantiated {@link ox#Signature.Signature}.\n */\nexport function from<\n const signature extends\n | OneOf | Rpc | Legacy | LegacyRpc>\n | Hex.Hex\n | Bytes.Bytes,\n>(\n signature:\n | signature\n | OneOf | Rpc | Legacy | LegacyRpc>\n | Hex.Hex\n | Bytes.Bytes,\n): from.ReturnType {\n const signature_ = (() => {\n if (typeof signature === 'string') return fromHex(signature)\n if (signature instanceof Uint8Array) return fromBytes(signature)\n if (typeof signature.r === 'string') return fromRpc(signature)\n if (signature.v) return fromLegacy(signature)\n return {\n r: signature.r,\n s: signature.s,\n ...(typeof signature.yParity !== 'undefined'\n ? { yParity: signature.yParity }\n : {}),\n }\n })()\n assert(signature_)\n return signature_ as never\n}\n\nexport declare namespace from {\n type ReturnType<\n signature extends\n | OneOf | Rpc | Legacy | LegacyRpc>\n | Hex.Hex\n | Bytes.Bytes,\n > = signature extends Signature & { v?: undefined }\n ? signature\n : Signature\n\n type ErrorType =\n | assert.ErrorType\n | fromBytes.ErrorType\n | fromHex.ErrorType\n | vToYParity.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts a DER-encoded signature to a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromDerBytes(new Uint8Array([132, 51, 23, ...]))\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: }\n * ```\n *\n * @param signature - The DER-encoded signature to convert.\n * @returns The {@link ox#Signature.Signature}.\n */\nexport function fromDerBytes(signature: Bytes.Bytes): Signature {\n return fromDerHex(Hex.fromBytes(signature))\n}\n\nexport declare namespace fromDerBytes {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a DER-encoded signature to a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromDerHex('0x304402206e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf02204a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db8')\n * // @log: {\n * // @log: r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * // @log: s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * // @log: }\n * ```\n *\n * @param signature - The DER-encoded signature to convert.\n * @returns The {@link ox#Signature.Signature}.\n */\nexport function fromDerHex(signature: Hex.Hex): Signature {\n const { r, s } = secp256k1.Signature.fromDER(Hex.from(signature).slice(2))\n return { r, s }\n}\n\nexport declare namespace fromDerHex {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Legacy} into a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const legacy = Signature.fromLegacy({ r: 1n, s: 2n, v: 28 })\n * // @log: { r: 1n, s: 2n, yParity: 1 }\n * ```\n *\n * @param signature - The {@link ox#Signature.Legacy} to convert.\n * @returns The converted {@link ox#Signature.Signature}.\n */\nexport function fromLegacy(signature: Legacy): Signature {\n return {\n r: signature.r,\n s: signature.s,\n yParity: vToYParity(signature.v),\n }\n}\n\nexport declare namespace fromLegacy {\n type ErrorType = vToYParity.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Rpc} into a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromRpc({\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * })\n * ```\n *\n * @param signature - The {@link ox#Signature.Rpc} to convert.\n * @returns The converted {@link ox#Signature.Signature}.\n */\nexport function fromRpc(signature: {\n r: Hex.Hex\n s: Hex.Hex\n yParity?: Hex.Hex | undefined\n v?: Hex.Hex | undefined\n}): Signature {\n const yParity = (() => {\n const v = signature.v ? Number(signature.v) : undefined\n let yParity = signature.yParity ? Number(signature.yParity) : undefined\n if (typeof v === 'number' && typeof yParity !== 'number')\n yParity = vToYParity(v)\n if (typeof yParity !== 'number')\n throw new InvalidYParityError({ value: signature.yParity })\n return yParity\n })()\n\n return {\n r: BigInt(signature.r),\n s: BigInt(signature.s),\n yParity,\n }\n}\n\nexport declare namespace fromRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Tuple} to a {@link ox#Signature.Signature}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.fromTuple(['0x01', '0x7b', '0x1c8'])\n * // @log: {\n * // @log: r: 123n,\n * // @log: s: 456n,\n * // @log: yParity: 1,\n * // @log: }\n * ```\n *\n * @param tuple - The {@link ox#Signature.Tuple} to convert.\n * @returns The {@link ox#Signature.Signature}.\n */\nexport function fromTuple(tuple: Tuple): Signature {\n const [yParity, r, s] = tuple\n return from({\n r: r === '0x' ? 0n : BigInt(r),\n s: s === '0x' ? 0n : BigInt(s),\n yParity: yParity === '0x' ? 0 : Number(yParity),\n })\n}\n\nexport declare namespace fromTuple {\n type ErrorType = from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#Signature.Signature} to {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.toBytes({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1\n * })\n * // @log: Uint8Array [102, 16, 10, ...]\n * ```\n *\n * @param signature - The signature to serialize.\n * @returns The serialized signature.\n */\nexport function toBytes(signature: Signature): Bytes.Bytes {\n return Bytes.fromHex(toHex(signature))\n}\n\nexport declare namespace toBytes {\n type ErrorType =\n | toHex.ErrorType\n | Bytes.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#Signature.Signature} to {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.toHex({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1\n * })\n * // @log: '0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c'\n * ```\n *\n * @param signature - The signature to serialize.\n * @returns The serialized signature.\n */\nexport function toHex(signature: Signature): Hex.Hex {\n assert(signature)\n\n const r = signature.r\n const s = signature.s\n\n const signature_ = Hex.concat(\n Hex.fromNumber(r, { size: 32 }),\n Hex.fromNumber(s, { size: 32 }),\n // If the signature is recovered, add the recovery byte to the signature.\n typeof signature.yParity === 'number'\n ? Hex.fromNumber(yParityToV(signature.yParity), { size: 1 })\n : '0x',\n )\n\n return signature_\n}\n\nexport declare namespace toHex {\n type ErrorType =\n | Hex.concat.ErrorType\n | Hex.fromNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} to DER-encoded format.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.from({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * })\n *\n * const signature_der = Signature.toDerBytes(signature)\n * // @log: Uint8Array [132, 51, 23, ...]\n * ```\n *\n * @param signature - The signature to convert.\n * @returns The DER-encoded signature.\n */\nexport function toDerBytes(signature: Signature): Bytes.Bytes {\n const sig = new secp256k1.Signature(signature.r, signature.s)\n return sig.toDERRawBytes()\n}\n\nexport declare namespace toDerBytes {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} to DER-encoded format.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.from({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * })\n *\n * const signature_der = Signature.toDerHex(signature)\n * // @log: '0x304402206e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf02204a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db8'\n * ```\n *\n * @param signature - The signature to convert.\n * @returns The DER-encoded signature.\n */\nexport function toDerHex(signature: Signature): Hex.Hex {\n const sig = new secp256k1.Signature(signature.r, signature.s)\n return `0x${sig.toDERHex()}`\n}\n\nexport declare namespace toDerHex {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} into a {@link ox#Signature.Legacy}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const legacy = Signature.toLegacy({ r: 1n, s: 2n, yParity: 1 })\n * // @log: { r: 1n, s: 2n, v: 28 }\n * ```\n *\n * @param signature - The {@link ox#Signature.Signature} to convert.\n * @returns The converted {@link ox#Signature.Legacy}.\n */\nexport function toLegacy(signature: Signature): Legacy {\n return {\n r: signature.r,\n s: signature.s,\n v: yParityToV(signature.yParity),\n }\n}\n\nexport declare namespace toLegacy {\n type ErrorType = yParityToV.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} into a {@link ox#Signature.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signature = Signature.toRpc({\n * r: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1\n * })\n * ```\n *\n * @param signature - The {@link ox#Signature.Signature} to convert.\n * @returns The converted {@link ox#Signature.Rpc}.\n */\nexport function toRpc(signature: Signature): Rpc {\n const { r, s, yParity } = signature\n return {\n r: Hex.fromNumber(r, { size: 32 }),\n s: Hex.fromNumber(s, { size: 32 }),\n yParity: yParity === 0 ? '0x0' : '0x1',\n }\n}\n\nexport declare namespace toRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a {@link ox#Signature.Signature} to a serialized {@link ox#Signature.Tuple} to be used for signatures in Transaction Envelopes, EIP-7702 Authorization Lists, etc.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const signatureTuple = Signature.toTuple({\n * r: 123n,\n * s: 456n,\n * yParity: 1,\n * })\n * // @log: [yParity: '0x01', r: '0x7b', s: '0x1c8']\n * ```\n *\n * @param signature - The {@link ox#Signature.Signature} to convert.\n * @returns The {@link ox#Signature.Tuple}.\n */\nexport function toTuple(signature: Signature): Tuple {\n const { r, s, yParity } = signature\n\n return [\n yParity ? '0x01' : '0x',\n r === 0n ? '0x' : Hex.trimLeft(Hex.fromNumber(r!)),\n s === 0n ? '0x' : Hex.trimLeft(Hex.fromNumber(s!)),\n ] as const\n}\n\nexport declare namespace toTuple {\n type ErrorType =\n | Hex.trimLeft.ErrorType\n | Hex.fromNumber.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Validates a Signature. Returns `true` if the signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const valid = Signature.validate({\n * r: -49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * s: 33726695977844476214676913201140481102225469284307016937915595756355928419768n,\n * yParity: 1,\n * })\n * // @log: false\n * ```\n *\n * @param signature - The signature object to assert.\n */\nexport function validate(\n signature: ExactPartial,\n options: validate.Options = {},\n): boolean {\n try {\n assert(signature, options)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type Options = {\n /** Whether or not the signature should be recovered (contain `yParity`). */\n recovered?: boolean\n }\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts a ECDSA `v` value to a `yParity` value.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const yParity = Signature.vToYParity(28)\n * // @log: 1\n * ```\n *\n * @param v - The ECDSA `v` value to convert.\n * @returns The `yParity` value.\n */\nexport function vToYParity(v: number): Signature['yParity'] {\n if (v === 0 || v === 27) return 0\n if (v === 1 || v === 28) return 1\n if (v >= 35) return v % 2 === 0 ? 1 : 0\n throw new InvalidVError({ value: v })\n}\n\nexport declare namespace vToYParity {\n type ErrorType = InvalidVError | Errors.GlobalErrorType\n}\n\n/**\n * Converts a ECDSA `v` value to a `yParity` value.\n *\n * @example\n * ```ts twoslash\n * import { Signature } from 'ox'\n *\n * const v = Signature.yParityToV(1)\n * // @log: 28\n * ```\n *\n * @param yParity - The ECDSA `yParity` value to convert.\n * @returns The `v` value.\n */\nexport function yParityToV(yParity: number): number {\n if (yParity === 0) return 27\n if (yParity === 1) return 28\n throw new InvalidYParityError({ value: yParity })\n}\n\nexport declare namespace yParityToV {\n type ErrorType = InvalidVError | Errors.GlobalErrorType\n}\n\n/** Thrown when the serialized signature is of an invalid size. */\nexport class InvalidSerializedSizeError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidSerializedSizeError'\n\n constructor({ signature }: { signature: Hex.Hex | Bytes.Bytes }) {\n super(`Value \\`${signature}\\` is an invalid signature size.`, {\n metaMessages: [\n 'Expected: 64 bytes or 65 bytes.',\n `Received ${Hex.size(Hex.from(signature))} bytes.`,\n ],\n })\n }\n}\n\n/** Thrown when the signature is missing either an `r`, `s`, or `yParity` property. */\nexport class MissingPropertiesError extends Errors.BaseError {\n override readonly name = 'Signature.MissingPropertiesError'\n\n constructor({ signature }: { signature: unknown }) {\n super(\n `Signature \\`${Json.stringify(signature)}\\` is missing either an \\`r\\`, \\`s\\`, or \\`yParity\\` property.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `r` value. */\nexport class InvalidRError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidRError'\n\n constructor({ value }: { value: unknown }) {\n super(\n `Value \\`${value}\\` is an invalid r value. r must be a positive integer less than 2^256.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `s` value. */\nexport class InvalidSError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidSError'\n\n constructor({ value }: { value: unknown }) {\n super(\n `Value \\`${value}\\` is an invalid s value. s must be a positive integer less than 2^256.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `yParity` value. */\nexport class InvalidYParityError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidYParityError'\n\n constructor({ value }: { value: unknown }) {\n super(\n `Value \\`${value}\\` is an invalid y-parity value. Y-parity must be 0 or 1.`,\n )\n }\n}\n\n/** Thrown when the signature has an invalid `v` value. */\nexport class InvalidVError extends Errors.BaseError {\n override readonly name = 'Signature.InvalidVError'\n\n constructor({ value }: { value: number }) {\n super(`Value \\`${value}\\` is an invalid v value. v must be 27, 28 or >=35.`)\n }\n}\n","import type * as Address from './Address.js'\nimport type * as Errors from './Errors.js'\nimport * as Hash from './Hash.js'\nimport * as Hex from './Hex.js'\nimport type { Compute, Mutable, Undefined } from './internal/types.js'\nimport * as Rlp from './Rlp.js'\nimport * as Signature from './Signature.js'\n\n/** Root type for an EIP-7702 Authorization. */\nexport type Authorization<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n> = Compute<\n {\n /** Address of the contract to set as code for the Authority. */\n address: Address.Address\n /** Chain ID to authorize. */\n chainId: numberType\n /** Nonce of the Authority to authorize. */\n nonce: bigintType\n } & (signed extends true\n ? Signature.Signature\n : Undefined)\n>\n\n/** RPC representation of an {@link ox#Authorization.Authorization}. */\nexport type Rpc = Authorization\n\n/** List of {@link ox#Authorization.Authorization}. */\nexport type List<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n> = Compute[]>\n\n/** RPC representation of an {@link ox#Authorization.List}. */\nexport type ListRpc = List\n\n/** Signed representation of a list of {@link ox#Authorization.Authorization}. */\nexport type ListSigned = List<\n true,\n bigintType,\n numberType\n>\n\n/** Signed representation of an {@link ox#Authorization.Authorization}. */\nexport type Signed = Authorization<\n true,\n bigintType,\n numberType\n>\n\n/** Tuple representation of an {@link ox#Authorization.Authorization}. */\nexport type Tuple = signed extends true\n ? readonly [\n chainId: Hex.Hex,\n address: Hex.Hex,\n nonce: Hex.Hex,\n yParity: Hex.Hex,\n r: Hex.Hex,\n s: Hex.Hex,\n ]\n : readonly [chainId: Hex.Hex, address: Hex.Hex, nonce: Hex.Hex]\n\n/** Tuple representation of a signed {@link ox#Authorization.Authorization}. */\nexport type TupleSigned = Tuple\n\n/** Tuple representation of a list of {@link ox#Authorization.Authorization}. */\nexport type TupleList =\n readonly Tuple[]\n\n/** Tuple representation of a list of signed {@link ox#Authorization.Authorization}. */\nexport type TupleListSigned = TupleList\n\n/**\n * Converts an [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization object into a typed {@link ox#Authorization.Authorization}.\n *\n * @example\n * An Authorization can be instantiated from an [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple in object format.\n *\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n * ```\n *\n * @example\n * ### Attaching Signatures\n *\n * A {@link ox#Signature.Signature} can be attached with the `signature` option. The example below demonstrates signing\n * an Authorization with {@link ox#Secp256k1.(sign:function)}.\n *\n * ```ts twoslash\n * import { Authorization, Secp256k1 } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 1,\n * nonce: 40n,\n * })\n *\n * const signature = Secp256k1.sign({\n * payload: Authorization.getSignPayload(authorization),\n * privateKey: '0x...',\n * })\n *\n * const authorization_signed = Authorization.from(authorization, { signature }) // [!code focus]\n * ```\n *\n * @param authorization - An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple in object format.\n * @param options - Authorization options.\n * @returns The {@link ox#Authorization.Authorization}.\n */\nexport function from<\n const authorization extends Authorization | Rpc,\n const signature extends Signature.Signature | undefined = undefined,\n>(\n authorization: authorization | Authorization,\n options: from.Options = {},\n): from.ReturnType {\n if (typeof authorization.chainId === 'string')\n return fromRpc(authorization) as never\n return { ...authorization, ...options.signature } as never\n}\n\nexport declare namespace from {\n type Options<\n signature extends Signature.Signature | undefined =\n | Signature.Signature\n | undefined,\n > = {\n /** The {@link ox#Signature.Signature} to attach to the Authorization. */\n signature?: signature | Signature.Signature | undefined\n }\n\n type ReturnType<\n authorization extends Authorization | Rpc = Authorization,\n signature extends Signature.Signature | undefined =\n | Signature.Signature\n | undefined,\n > = Compute<\n authorization extends Rpc\n ? Signed\n : authorization &\n (signature extends Signature.Signature ? Readonly : {})\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.Rpc} to an {@link ox#Authorization.Authorization}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.fromRpc({\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: '0x1',\n * nonce: '0x1',\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * })\n * ```\n *\n * @param authorization - The RPC-formatted Authorization.\n * @returns A signed {@link ox#Authorization.Authorization}.\n */\nexport function fromRpc(authorization: Rpc): Signed {\n const { address, chainId, nonce } = authorization\n const signature = Signature.extract(authorization)!\n\n return {\n address,\n chainId: Number(chainId),\n nonce: BigInt(nonce),\n ...signature,\n }\n}\n\nexport declare namespace fromRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.ListRpc} to an {@link ox#Authorization.List}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorizationList = Authorization.fromRpcList([{\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: '0x1',\n * nonce: '0x1',\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * }])\n * ```\n *\n * @param authorizationList - The RPC-formatted Authorization list.\n * @returns A signed {@link ox#Authorization.List}.\n */\nexport function fromRpcList(authorizationList: ListRpc): ListSigned {\n return authorizationList.map(fromRpc)\n}\n\nexport declare namespace fromRpcList {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.Tuple} to an {@link ox#Authorization.Authorization}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.fromTuple([\n * '0x1',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x3'\n * ])\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n\n * // @log: }\n * ```\n *\n * @example\n * It is also possible to append a Signature tuple to the end of an Authorization tuple.\n *\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.fromTuple([\n * '0x1',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x3',\n * '0x1',\n * '0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90',\n * '0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064',\n * ])\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: }\n * ```\n *\n * @param tuple - The [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple.\n * @returns The {@link ox#Authorization.Authorization}.\n */\nexport function fromTuple(\n tuple: tuple,\n): fromTuple.ReturnType {\n const [chainId, address, nonce, yParity, r, s] = tuple\n let args = {\n address,\n chainId: chainId === '0x' ? 0 : Number(chainId),\n nonce: nonce === '0x' ? 0n : BigInt(nonce),\n }\n if (yParity && r && s)\n args = { ...args, ...Signature.fromTuple([yParity, r, s]) }\n return from(args) as never\n}\n\nexport declare namespace fromTuple {\n type ReturnType = Compute<\n Authorization ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.TupleList} to an {@link ox#Authorization.List}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorizationList = Authorization.fromTupleList([\n * ['0x1', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x3'],\n * ['0x3', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x14'],\n * ])\n * // @log: [\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n,\n * // @log: },\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: },\n * // @log: ]\n * ```\n *\n * @example\n * It is also possible to append a Signature tuple to the end of an Authorization tuple.\n *\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorizationList = Authorization.fromTupleList([\n * ['0x1', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x3', '0x1', '0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90', '0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'],\n * ['0x3', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x14', '0x1', '0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90', '0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'],\n * ])\n * // @log: [\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n,\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: },\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: },\n * // @log: ]\n * ```\n *\n * @param tupleList - The [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple list.\n * @returns An {@link ox#Authorization.List}.\n */\nexport function fromTupleList(\n tupleList: tupleList,\n): fromTupleList.ReturnType {\n const list: Mutable = []\n for (const tuple of tupleList) list.push(fromTuple(tuple))\n return list as never\n}\n\nexport declare namespace fromTupleList {\n type ReturnType = Compute<\n TupleList ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Computes the sign payload for an {@link ox#Authorization.Authorization} in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n *\n * @example\n * The example below demonstrates computing the sign payload for an {@link ox#Authorization.Authorization}. This payload\n * can then be passed to signing functions like {@link ox#Secp256k1.(sign:function)}.\n *\n * ```ts twoslash\n * import { Authorization, Secp256k1 } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const payload = Authorization.getSignPayload(authorization) // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload,\n * privateKey: '0x...',\n * })\n * ```\n *\n * @param authorization - The {@link ox#Authorization.Authorization}.\n * @returns The sign payload.\n */\nexport function getSignPayload(authorization: Authorization): Hex.Hex {\n return hash(authorization, { presign: true })\n}\n\nexport declare namespace getSignPayload {\n type ErrorType = hash.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Computes the hash for an {@link ox#Authorization.Authorization} in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const hash = Authorization.hash(authorization) // [!code focus]\n * ```\n *\n * @param authorization - The {@link ox#Authorization.Authorization}.\n * @returns The hash.\n */\nexport function hash(\n authorization: Authorization,\n options: hash.Options = {},\n): Hex.Hex {\n const { presign } = options\n return Hash.keccak256(\n Hex.concat(\n '0x05',\n Rlp.fromHex(\n toTuple(\n presign\n ? {\n address: authorization.address,\n chainId: authorization.chainId,\n nonce: authorization.nonce,\n }\n : authorization,\n ),\n ),\n ),\n )\n}\n\nexport declare namespace hash {\n type ErrorType =\n | toTuple.ErrorType\n | Hash.keccak256.ErrorType\n | Hex.concat.ErrorType\n | Rlp.fromHex.ErrorType\n | Errors.GlobalErrorType\n\n type Options = {\n /** Whether to hash this authorization for signing. @default false */\n presign?: boolean | undefined\n }\n}\n\n/**\n * Converts an {@link ox#Authorization.Authorization} to an {@link ox#Authorization.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.toRpc({\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: 1,\n * nonce: 1n,\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * })\n * ```\n *\n * @param authorization - An Authorization.\n * @returns An RPC-formatted Authorization.\n */\nexport function toRpc(authorization: Signed): Rpc {\n const { address, chainId, nonce, ...signature } = authorization\n\n return {\n address,\n chainId: Hex.fromNumber(chainId),\n nonce: Hex.fromNumber(nonce),\n ...Signature.toRpc(signature),\n }\n}\n\nexport declare namespace toRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.List} to an {@link ox#Authorization.ListRpc}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.toRpcList([{\n * address: '0x0000000000000000000000000000000000000000',\n * chainId: 1,\n * nonce: 1n,\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * }])\n * ```\n *\n * @param authorizationList - An Authorization List.\n * @returns An RPC-formatted Authorization List.\n */\nexport function toRpcList(authorizationList: ListSigned): ListRpc {\n return authorizationList.map(toRpc)\n}\n\nexport declare namespace toRpcList {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.Authorization} to an {@link ox#Authorization.Tuple}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const tuple = Authorization.toTuple(authorization) // [!code focus]\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 1,\n * // @log: nonce: 69n,\n * // @log: ]\n * ```\n *\n * @param authorization - The {@link ox#Authorization.Authorization}.\n * @returns An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple.\n */\nexport function toTuple(\n authorization: authorization,\n): toTuple.ReturnType {\n const { address, chainId, nonce } = authorization\n const signature = Signature.extract(authorization)\n return [\n chainId ? Hex.fromNumber(chainId) : '0x',\n address,\n nonce ? Hex.fromNumber(nonce) : '0x',\n ...(signature ? Signature.toTuple(signature) : []),\n ] as never\n}\n\nexport declare namespace toTuple {\n type ReturnType =\n Compute>\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Authorization.List} to an {@link ox#Authorization.TupleList}.\n *\n * @example\n * ```ts twoslash\n * import { Authorization } from 'ox'\n *\n * const authorization_1 = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n * const authorization_2 = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 3,\n * nonce: 20n,\n * })\n *\n * const tuple = Authorization.toTupleList([authorization_1, authorization_2]) // [!code focus]\n * // @log: [\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 1,\n * // @log: nonce: 69n,\n * // @log: ],\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: ],\n * // @log: ]\n * ```\n *\n * @param list - An {@link ox#Authorization.List}.\n * @returns An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization tuple list.\n */\nexport function toTupleList<\n const list extends\n | readonly Authorization[]\n | readonly Authorization[],\n>(list?: list | undefined): toTupleList.ReturnType {\n if (!list || list.length === 0) return []\n\n const tupleList: Mutable = []\n for (const authorization of list) tupleList.push(toTuple(authorization))\n\n return tupleList as never\n}\n\nexport declare namespace toTupleList {\n type ReturnType<\n list extends\n | readonly Authorization[]\n | readonly Authorization[],\n > = Compute<\n TupleList[] ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\nimport * as Address from './Address.js'\nimport * as Bytes from './Bytes.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport * as Entropy from './internal/entropy.js'\nimport type { OneOf } from './internal/types.js'\nimport * as PublicKey from './PublicKey.js'\nimport type * as Signature from './Signature.js'\n\n/** Re-export of noble/curves secp256k1 utilities. */\nexport const noble = secp256k1\n\n/**\n * Creates a new secp256k1 ECDSA key pair consisting of a private key and its corresponding public key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const { privateKey, publicKey } = Secp256k1.createKeyPair()\n * ```\n *\n * @param options - The options to generate the key pair.\n * @returns The generated key pair containing both private and public keys.\n */\nexport function createKeyPair(\n options: createKeyPair.Options = {},\n): createKeyPair.ReturnType {\n const { as = 'Hex' } = options\n const privateKey = randomPrivateKey({ as })\n const publicKey = getPublicKey({ privateKey })\n\n return {\n privateKey: privateKey as never,\n publicKey,\n }\n}\n\nexport declare namespace createKeyPair {\n type Options = {\n /**\n * Format of the returned private key.\n * @default 'Hex'\n */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType = {\n privateKey:\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n publicKey: PublicKey.PublicKey\n }\n\n type ErrorType =\n | Hex.fromBytes.ErrorType\n | PublicKey.from.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes the secp256k1 ECDSA public key from a provided private key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const publicKey = Secp256k1.getPublicKey({ privateKey: '0x...' })\n * ```\n *\n * @param options - The options to compute the public key.\n * @returns The computed public key.\n */\nexport function getPublicKey(\n options: getPublicKey.Options,\n): PublicKey.PublicKey {\n const { privateKey } = options\n const point = secp256k1.ProjectivePoint.fromPrivateKey(\n Hex.from(privateKey).slice(2),\n )\n return PublicKey.from(point)\n}\n\nexport declare namespace getPublicKey {\n type Options = {\n /**\n * Private key to compute the public key from.\n */\n privateKey: Hex.Hex | Bytes.Bytes\n }\n\n type ErrorType =\n | Hex.from.ErrorType\n | PublicKey.from.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes a shared secret using ECDH (Elliptic Curve Diffie-Hellman) between a private key and a public key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const { privateKey: privateKeyA } = Secp256k1.createKeyPair()\n * const { publicKey: publicKeyB } = Secp256k1.createKeyPair()\n *\n * const sharedSecret = Secp256k1.getSharedSecret({\n * privateKey: privateKeyA,\n * publicKey: publicKeyB\n * })\n * ```\n *\n * @param options - The options to compute the shared secret.\n * @returns The computed shared secret.\n */\nexport function getSharedSecret(\n options: getSharedSecret.Options,\n): getSharedSecret.ReturnType {\n const { as = 'Hex', privateKey, publicKey } = options\n const point = secp256k1.ProjectivePoint.fromHex(\n PublicKey.toHex(publicKey).slice(2),\n )\n const sharedPoint = point.multiply(\n secp256k1.utils.normPrivateKeyToScalar(Hex.from(privateKey).slice(2)),\n )\n const sharedSecret = sharedPoint.toRawBytes(true) // compressed format\n if (as === 'Hex') return Hex.fromBytes(sharedSecret) as never\n return sharedSecret as never\n}\n\nexport declare namespace getSharedSecret {\n type Options = {\n /**\n * Format of the returned shared secret.\n * @default 'Hex'\n */\n as?: as | 'Hex' | 'Bytes' | undefined\n /**\n * Private key to use for the shared secret computation.\n */\n privateKey: Hex.Hex | Bytes.Bytes\n /**\n * Public key to use for the shared secret computation.\n */\n publicKey: PublicKey.PublicKey\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType =\n | Hex.from.ErrorType\n | PublicKey.toHex.ErrorType\n | Hex.fromBytes.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Generates a random ECDSA private key on the secp256k1 curve.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n * ```\n *\n * @param options - The options to generate the private key.\n * @returns The generated private key.\n */\nexport function randomPrivateKey(\n options: randomPrivateKey.Options = {},\n): randomPrivateKey.ReturnType {\n const { as = 'Hex' } = options\n const bytes = secp256k1.utils.randomPrivateKey()\n if (as === 'Hex') return Hex.fromBytes(bytes) as never\n return bytes as never\n}\n\nexport declare namespace randomPrivateKey {\n type Options = {\n /**\n * Format of the returned private key.\n * @default 'Hex'\n */\n as?: as | 'Hex' | 'Bytes' | undefined\n }\n\n type ReturnType =\n | (as extends 'Bytes' ? Bytes.Bytes : never)\n | (as extends 'Hex' ? Hex.Hex : never)\n\n type ErrorType = Hex.fromBytes.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Recovers the signing address from the signed payload and signature.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey: '0x...' })\n *\n * const address = Secp256k1.recoverAddress({ // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The recovery options.\n * @returns The recovered address.\n */\nexport function recoverAddress(\n options: recoverAddress.Options,\n): recoverAddress.ReturnType {\n return Address.fromPublicKey(recoverPublicKey(options))\n}\n\nexport declare namespace recoverAddress {\n type Options = {\n /** Payload that was signed. */\n payload: Hex.Hex | Bytes.Bytes\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n\n type ReturnType = Address.Address\n\n type ErrorType =\n | Address.fromPublicKey.ErrorType\n | recoverPublicKey.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Recovers the signing public key from the signed payload and signature.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey: '0x...' })\n *\n * const publicKey = Secp256k1.recoverPublicKey({ // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The recovery options.\n * @returns The recovered public key.\n */\nexport function recoverPublicKey(\n options: recoverPublicKey.Options,\n): PublicKey.PublicKey {\n const { payload, signature } = options\n const { r, s, yParity } = signature\n const signature_ = new secp256k1.Signature(\n BigInt(r),\n BigInt(s),\n ).addRecoveryBit(yParity)\n const point = signature_.recoverPublicKey(Hex.from(payload).substring(2))\n return PublicKey.from(point)\n}\n\nexport declare namespace recoverPublicKey {\n type Options = {\n /** Payload that was signed. */\n payload: Hex.Hex | Bytes.Bytes\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n\n type ErrorType =\n | PublicKey.from.ErrorType\n | Hex.from.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Signs the payload with the provided private key.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * privateKey: '0x...' // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The signing options.\n * @returns The ECDSA {@link ox#Signature.Signature}.\n */\nexport function sign(options: sign.Options): Signature.Signature {\n const {\n extraEntropy = Entropy.extraEntropy,\n hash,\n payload,\n privateKey,\n } = options\n const { r, s, recovery } = secp256k1.sign(\n Bytes.from(payload),\n Bytes.from(privateKey),\n {\n extraEntropy:\n typeof extraEntropy === 'boolean'\n ? extraEntropy\n : Hex.from(extraEntropy).slice(2),\n lowS: true,\n ...(hash ? { prehash: true } : {}),\n },\n )\n return {\n r,\n s,\n yParity: recovery,\n }\n}\n\nexport declare namespace sign {\n type Options = {\n /**\n * Extra entropy to add to the signing process. Setting to `false` will disable it.\n * @default true\n */\n extraEntropy?: boolean | Hex.Hex | Bytes.Bytes | undefined\n /**\n * If set to `true`, the payload will be hashed (sha256) before being signed.\n */\n hash?: boolean | undefined\n /**\n * Payload to sign.\n */\n payload: Hex.Hex | Bytes.Bytes\n /**\n * ECDSA private key.\n */\n privateKey: Hex.Hex | Bytes.Bytes\n }\n\n type ErrorType = Bytes.from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Verifies a payload was signed by the provided address.\n *\n * @example\n * ### Verify with Ethereum Address\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey: '0x...' })\n *\n * const verified = Secp256k1.verify({ // [!code focus]\n * address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @example\n * ### Verify with Public Key\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n *\n * const privateKey = '0x...'\n * const publicKey = Secp256k1.getPublicKey({ privateKey })\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey })\n *\n * const verified = Secp256k1.verify({ // [!code focus]\n * publicKey, // [!code focus]\n * payload: '0xdeadbeef', // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The verification options.\n * @returns Whether the payload was signed by the provided address.\n */\nexport function verify(options: verify.Options): boolean {\n const { address, hash, payload, publicKey, signature } = options\n if (address)\n return Address.isEqual(address, recoverAddress({ payload, signature }))\n return secp256k1.verify(\n signature,\n Bytes.from(payload),\n PublicKey.toBytes(publicKey),\n ...(hash ? [{ prehash: true, lowS: true }] : []),\n )\n}\n\nexport declare namespace verify {\n type Options = {\n /** If set to `true`, the payload will be hashed (sha256) before being verified. */\n hash?: boolean | undefined\n /** Payload that was signed. */\n payload: Hex.Hex | Bytes.Bytes\n } & OneOf<\n | {\n /** Address that signed the payload. */\n address: Address.Address\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n | {\n /** Public key that signed the payload. */\n publicKey: PublicKey.PublicKey\n /** Signature of the payload. */\n signature: Signature.Signature\n }\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import * as AbiParameters from '../core/AbiParameters.js'\nimport type * as Address from '../core/Address.js'\nimport * as Authorization from '../core/Authorization.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport * as Secp256k1 from '../core/Secp256k1.js'\nimport * as Signature from '../core/Signature.js'\n\n/** Unwrapped ERC-8010 signature. */\nexport type Unwrapped = {\n /** Authorization signed by the delegatee. */\n authorization: Authorization.Authorization\n /** Data to initialize the delegation. */\n data?: Hex.Hex | undefined\n /** The original signature. */\n signature: Hex.Hex\n /** Address of the initializer. */\n to?: Address.Address | undefined\n}\n\n/** Wrapped ERC-8010 signature. */\nexport type Wrapped = Hex.Hex\n\n/**\n * Magic bytes used to identify ERC-8010 wrapped signatures.\n */\nexport const magicBytes =\n '0x8010801080108010801080108010801080108010801080108010801080108010' as const\n\n/** Suffix ABI parameters for the ERC-8010 wrapped signature. */\nexport const suffixParameters = AbiParameters.from(\n '(uint256 chainId, address delegation, uint256 nonce, uint8 yParity, uint256 r, uint256 s), address to, bytes data',\n)\n\n/**\n * Asserts that the wrapped signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * SignatureErc8010.assert('0xdeadbeef')\n * // @error: InvalidWrappedSignatureError: Value `0xdeadbeef` is an invalid ERC-8010 wrapped signature.\n * ```\n *\n * @param value - The value to assert.\n */\nexport function assert(value: Unwrapped | Wrapped) {\n if (typeof value === 'string') {\n if (Hex.slice(value, -32) !== magicBytes)\n throw new InvalidWrappedSignatureError(value)\n } else Signature.assert(value.authorization)\n}\n\nexport declare namespace assert {\n type ErrorType =\n | InvalidWrappedSignatureError\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-8010 wrapped signature](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { SignatureErc8010 } from 'ox/erc8010' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * // Instantiate from serialized format. // [!code focus]\n * const wrapped = SignatureErc8010.from('0x...') // [!code focus]\n * // @log: { authorization: { ... }, data: '0x...', signature: { ... } } // [!code focus]\n *\n * // Instantiate from constituent parts. // [!code focus]\n * const wrapped = SignatureErc8010.from({ // [!code focus]\n * authorization: { ... }, // [!code focus]\n * data: '0x...', // [!code focus]\n * signature, // [!code focus]\n * })\n * // @log: { authorization: { ... }, data: '0x...', signature: { ... } }\n * ```\n *\n * @param value - Value to parse.\n * @returns Parsed value.\n */\nexport function from(value: Unwrapped | Wrapped): Unwrapped {\n if (typeof value === 'string') return unwrap(value)\n return value\n}\n\nexport declare namespace from {\n type ErrorType = unwrap.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Unwraps an [ERC-8010 wrapped signature](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * const { authorization, data, signature } = SignatureErc8010.unwrap('0x...')\n * ```\n *\n * @param wrapped - Wrapped signature to unwrap.\n * @returns Unwrapped signature.\n */\nexport function unwrap(wrapped: Wrapped): Unwrapped {\n assert(wrapped)\n\n const suffixLength = Hex.toNumber(Hex.slice(wrapped, -64, -32))\n const suffix = Hex.slice(wrapped, -suffixLength - 64, -64)\n const signature = Hex.slice(wrapped, 0, -suffixLength - 64)\n\n const [auth, to, data] = AbiParameters.decode(suffixParameters, suffix)\n\n const authorization = Authorization.from({\n address: auth.delegation,\n chainId: Number(auth.chainId),\n nonce: auth.nonce,\n yParity: auth.yParity,\n r: auth.r,\n s: auth.s,\n })\n\n return {\n authorization,\n signature,\n ...(data && data !== '0x' ? { data, to } : {}),\n }\n}\n\nexport declare namespace unwrap {\n type ErrorType = assert.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Wraps a signature into [ERC-8010 format](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md).\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1, Signature } from 'ox'\n * import { SignatureErc8010 } from 'ox/erc8010' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc8010.wrap({ // [!code focus]\n * authorization: { ... }, // [!code focus]\n * data: '0xdeadbeef', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param value - Values to wrap.\n * @returns Wrapped signature.\n */\nexport function wrap(value: Unwrapped): Wrapped {\n const { data, signature } = value\n\n assert(value)\n\n const self = Secp256k1.recoverAddress({\n payload: Authorization.getSignPayload(value.authorization),\n signature: Signature.from(value.authorization),\n })\n\n const suffix = AbiParameters.encode(suffixParameters, [\n {\n ...value.authorization,\n delegation: value.authorization.address,\n chainId: BigInt(value.authorization.chainId),\n },\n value.to ?? self,\n data ?? '0x',\n ])\n const suffixLength = Hex.fromNumber(Hex.size(suffix), { size: 32 })\n return Hex.concat(signature, suffix, suffixLength, magicBytes)\n}\n\nexport declare namespace wrap {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Validates a wrapped signature. Returns `true` if the wrapped signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * const valid = SignatureErc8010.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param value - The value to validate.\n * @returns `true` if the value is valid, `false` otherwise.\n */\nexport function validate(value: Unwrapped | Wrapped): boolean {\n try {\n assert(value)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** Thrown when the ERC-8010 wrapped signature is invalid. */\nexport class InvalidWrappedSignatureError extends Errors.BaseError {\n override readonly name = 'SignatureErc8010.InvalidWrappedSignatureError'\n\n constructor(wrapped: Wrapped) {\n super(`Value \\`${wrapped}\\` is an invalid ERC-8010 wrapped signature.`)\n }\n}\n","/** @entrypointCategory ERCs */\n// biome-ignore lint/complexity/noUselessEmptyExport: tsdoc\nexport type {}\n\n/**\n * Utility functions for working with [ERC-8010 wrapped signatures](https://eips.ethereum.org/EIPS/eip-8010#specification).\n *\n * @example\n * ```ts twoslash\n * import { Authorization, PersonalMessage, Secp256k1, Signature } from 'ox'\n * import { SignatureErc8010 } from 'ox/erc8010' // [!code focus]\n *\n * const authorization = Authorization.from({\n * address: '0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const authorizationSignature = Secp256k1.sign({\n * payload: Authorization.getSignPayload(authorization),\n * privateKey: '0x...',\n * })\n *\n * const authorizationSigned = Authorization.from(authorization, {\n * signature: authorizationSignature,\n * })\n *\n * const signature = Secp256k1.sign({\n * payload: PersonalMessage.getSignPayload('0xdeadbeef'),\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc8010.wrap({ // [!code focus]\n * authorization: authorizationSigned, // [!code focus]\n * data: '0xcafebabe', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * }) // [!code focus]\n * // @log: '0x000000000000000000000000cafebabecafebabecafebabecafebabecafebabe000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000004deadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041fa78c5905fb0b9d6066ef531f962a62bc6ef0d5eb59ecb134056d206f75aaed7780926ff2601a935c2c79707d9e1799948c9f19dcdde1e090e903b19a07923d01c000000000000000000000000000000000000000000000000000000000000008010801080108010801080108010801080108010801080108010801080108010'\n * ```\n *\n * @category ERC-8010\n */\nexport * as SignatureErc8010 from './SignatureErc8010.js'\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n type ParseAbi,\n type ParseAbiItem,\n type ParseAbiParameter,\n type ParseAbiParameters,\n parseAbi,\n parseAbiItem,\n parseAbiParameter,\n parseAbiParameters,\n} from 'abitype'\nexport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../accounts/utils/parseAccount.js'\nexport {\n type PublicKeyToAddressErrorType,\n publicKeyToAddress,\n} from '../accounts/utils/publicKeyToAddress.js'\nexport {\n type DecodeAbiParametersErrorType,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n} from './abi/decodeAbiParameters.js'\nexport {\n type DecodeErrorResultErrorType,\n type DecodeErrorResultParameters,\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from './abi/decodeErrorResult.js'\nexport {\n type DecodeEventLogErrorType,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n decodeEventLog,\n} from './abi/decodeEventLog.js'\nexport {\n type DecodeFunctionDataErrorType,\n type DecodeFunctionDataParameters,\n type DecodeFunctionDataReturnType,\n decodeFunctionData,\n} from './abi/decodeFunctionData.js'\nexport {\n type DecodeFunctionResultErrorType,\n type DecodeFunctionResultParameters,\n type DecodeFunctionResultReturnType,\n decodeFunctionResult,\n} from './abi/decodeFunctionResult.js'\nexport {\n type EncodeAbiParametersErrorType,\n type EncodeAbiParametersReturnType,\n encodeAbiParameters,\n} from './abi/encodeAbiParameters.js'\nexport {\n type EncodeDeployDataErrorType,\n type EncodeDeployDataParameters,\n encodeDeployData,\n} from './abi/encodeDeployData.js'\nexport {\n type EncodeErrorResultErrorType,\n type EncodeErrorResultParameters,\n encodeErrorResult,\n} from './abi/encodeErrorResult.js'\nexport {\n type EncodeArgErrorType,\n type EncodeEventTopicsParameters,\n type EncodeEventTopicsReturnType,\n encodeEventTopics,\n} from './abi/encodeEventTopics.js'\nexport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from './abi/encodeFunctionData.js'\nexport {\n type EncodeFunctionResultErrorType,\n type EncodeFunctionResultParameters,\n encodeFunctionResult,\n} from './abi/encodeFunctionResult.js'\nexport { type EncodePackedErrorType, encodePacked } from './abi/encodePacked.js'\nexport {\n type FormatAbiItemErrorType,\n type FormatAbiParamErrorType,\n type FormatAbiParamsErrorType,\n formatAbiItem,\n formatAbiParams,\n} from './abi/formatAbiItem.js'\nexport {\n type FormatAbiItemWithArgsErrorType,\n formatAbiItemWithArgs,\n} from './abi/formatAbiItemWithArgs.js'\nexport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n getAbiItem,\n} from './abi/getAbiItem.js'\nexport {\n type ParseEventLogsErrorType,\n type ParseEventLogsParameters,\n type ParseEventLogsReturnType,\n parseEventLogs,\n} from './abi/parseEventLogs.js'\nexport {\n type ChecksumAddressErrorType,\n getAddress,\n} from './address/getAddress.js'\nexport {\n type GetContractAddressOptions,\n type GetCreate2AddressErrorType,\n type GetCreate2AddressOptions,\n type GetCreateAddressErrorType,\n type GetCreateAddressOptions,\n getContractAddress,\n getCreate2Address,\n getCreateAddress,\n} from './address/getContractAddress.js'\nexport { type IsAddressErrorType, isAddress } from './address/isAddress.js'\nexport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from './address/isAddressEqual.js'\nexport {\n type HashAuthorizationErrorType,\n type HashAuthorizationParameters,\n type HashAuthorizationReturnType,\n hashAuthorization,\n} from './authorization/hashAuthorization.js'\nexport {\n type RecoverAuthorizationAddressErrorType,\n type RecoverAuthorizationAddressParameters,\n type RecoverAuthorizationAddressReturnType,\n recoverAuthorizationAddress,\n} from './authorization/recoverAuthorizationAddress.js'\nexport {\n type SerializeAuthorizationListErrorType,\n type SerializeAuthorizationListReturnType,\n serializeAuthorizationList,\n} from './authorization/serializeAuthorizationList.js'\nexport {\n type VerifyAuthorizationErrorType,\n type VerifyAuthorizationParameters,\n type VerifyAuthorizationReturnType,\n verifyAuthorization,\n} from './authorization/verifyAuthorization.js'\nexport {\n buildRequest,\n type RequestErrorType,\n} from './buildRequest.js'\nexport {\n ccipRequest,\n /** @deprecated Use `ccipRequest`. */\n ccipRequest as ccipFetch,\n type OffchainLookupErrorType,\n offchainLookup,\n offchainLookupAbiItem,\n offchainLookupSignature,\n} from './ccip.js'\nexport {\n type AssertCurrentChainErrorType,\n type AssertCurrentChainParameters,\n assertCurrentChain,\n} from './chain/assertCurrentChain.js'\nexport { defineChain } from './chain/defineChain.js'\nexport {\n type ExtractChainErrorType,\n type ExtractChainParameters,\n type ExtractChainReturnType,\n extractChain,\n} from './chain/extractChain.js'\nexport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from './chain/getChainContractAddress.js'\nexport {\n type ConcatBytesErrorType,\n type ConcatErrorType,\n type ConcatHexErrorType,\n concat,\n concatBytes,\n concatHex,\n} from './data/concat.js'\nexport { type IsBytesErrorType, isBytes } from './data/isBytes.js'\nexport { type IsHexErrorType, isHex } from './data/isHex.js'\nexport {\n type PadBytesErrorType,\n type PadErrorType,\n type PadHexErrorType,\n pad,\n padBytes,\n padHex,\n} from './data/pad.js'\nexport { type SizeErrorType, size } from './data/size.js'\nexport {\n type AssertEndOffsetErrorType,\n type AssertStartOffsetErrorType,\n type SliceBytesErrorType,\n type SliceErrorType,\n type SliceHexErrorType,\n type SliceReturnType,\n slice,\n sliceBytes,\n sliceHex,\n} from './data/slice.js'\nexport { type TrimErrorType, type TrimReturnType, trim } from './data/trim.js'\nexport {\n type BytesToBigIntErrorType,\n type BytesToBigIntOpts,\n type BytesToBoolErrorType,\n type BytesToBoolOpts,\n type BytesToNumberErrorType,\n type BytesToNumberOpts,\n type BytesToStringErrorType,\n type BytesToStringOpts,\n bytesToBigInt,\n bytesToBigInt as bytesToBigint,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n type FromBytesErrorType,\n type FromBytesParameters,\n type FromBytesReturnType,\n fromBytes,\n} from './encoding/fromBytes.js'\nexport {\n type AssertSizeErrorType,\n type FromHexErrorType,\n type FromHexParameters,\n type FromHexReturnType,\n fromHex,\n type HexToBigIntErrorType,\n type HexToBigIntOpts,\n type HexToBoolErrorType,\n type HexToBoolOpts,\n type HexToNumberErrorType,\n type HexToNumberOpts,\n type HexToStringErrorType,\n type HexToStringOpts,\n hexToBigInt,\n hexToBool,\n hexToNumber,\n hexToString,\n} from './encoding/fromHex.js'\nexport {\n type FromRlpErrorType,\n fromRlp,\n} from './encoding/fromRlp.js'\nexport {\n type BoolToBytesErrorType,\n type BoolToBytesOpts,\n boolToBytes,\n type HexToBytesErrorType,\n type HexToBytesOpts,\n hexToBytes,\n type NumberToBytesErrorType,\n numberToBytes,\n type StringToBytesErrorType,\n type StringToBytesOpts,\n stringToBytes,\n type ToBytesErrorType,\n type ToBytesParameters,\n toBytes,\n} from './encoding/toBytes.js'\nexport {\n type BoolToHexErrorType,\n type BoolToHexOpts,\n type BytesToHexErrorType,\n type BytesToHexOpts,\n boolToHex,\n bytesToHex,\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n type StringToHexErrorType,\n type StringToHexOpts,\n stringToHex,\n type ToHexErrorType,\n type ToHexParameters,\n toHex,\n} from './encoding/toHex.js'\nexport {\n type BytesToRlpErrorType,\n type HexToRlpErrorType,\n type ToRlpErrorType,\n type ToRlpReturnType,\n toRlp,\n} from './encoding/toRlp.js'\nexport {\n type GetCallErrorReturnType,\n getCallError,\n} from './errors/getCallError.js'\nexport {\n type GetContractErrorReturnType,\n getContractError,\n} from './errors/getContractError.js'\nexport {\n type GetEstimateGasErrorReturnType,\n getEstimateGasError,\n} from './errors/getEstimateGasError.js'\nexport {\n containsNodeError,\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './errors/getNodeError.js'\nexport {\n type GetTransactionErrorParameters,\n type GetTransactionErrorReturnType,\n getTransactionError,\n} from './errors/getTransactionError.js'\nexport {\n type DefineBlockErrorType,\n defineBlock,\n type FormatBlockErrorType,\n type FormattedBlock,\n formatBlock,\n} from './formatters/block.js'\nexport { type ExtractErrorType, extract } from './formatters/extract.js'\nexport {\n type DefineFormatterErrorType,\n defineFormatter,\n} from './formatters/formatter.js'\nexport { type FormatLogErrorType, formatLog } from './formatters/log.js'\nexport {\n type DefineTransactionErrorType,\n defineTransaction,\n type FormatTransactionErrorType,\n type FormattedTransaction,\n formatTransaction,\n transactionType,\n} from './formatters/transaction.js'\nexport {\n type DefineTransactionReceiptErrorType,\n defineTransactionReceipt,\n type FormatTransactionReceiptErrorType,\n type FormattedTransactionReceipt,\n} from './formatters/transactionReceipt.js'\nexport {\n type DefineTransactionRequestErrorType,\n defineTransactionRequest,\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from './formatters/transactionRequest.js'\nexport { getAction } from './getAction.js'\nexport { type IsHashErrorType, isHash } from './hash/isHash.js'\nexport { type Keccak256ErrorType, keccak256 } from './hash/keccak256.js'\nexport { type Ripemd160ErrorType, ripemd160 } from './hash/ripemd160.js'\nexport { type Sha256ErrorType, sha256 } from './hash/sha256.js'\nexport {\n type ToEventHashErrorType,\n toEventHash,\n} from './hash/toEventHash.js'\nexport {\n type ToEventSelectorErrorType,\n /** @deprecated use `ToEventSelectorErrorType`. */\n type ToEventSelectorErrorType as GetEventSelectorErrorType,\n toEventSelector,\n /** @deprecated use `toEventSelector`. */\n toEventSelector as getEventSelector,\n} from './hash/toEventSelector.js'\nexport {\n type ToEventSignatureErrorType,\n /** @deprecated use `ToEventSignatureErrorType`. */\n type ToEventSignatureErrorType as GetEventSignatureErrorType,\n toEventSignature,\n /** @deprecated use `toEventSignature`. */\n toEventSignature as getEventSignature,\n} from './hash/toEventSignature.js'\nexport {\n type ToFunctionHashErrorType,\n toFunctionHash,\n} from './hash/toFunctionHash.js'\nexport {\n type ToFunctionSelectorErrorType,\n /** @deprecated use `ToFunctionSelectorErrorType`. */\n type ToFunctionSelectorErrorType as GetFunctionSelectorErrorType,\n toFunctionSelector,\n /** @deprecated use `toFunctionSelector`. */\n toFunctionSelector as getFunctionSelector,\n} from './hash/toFunctionSelector.js'\nexport {\n type ToFunctionSignatureErrorType,\n /** @deprecated use `ToFunctionSignatureErrorType`. */\n type ToFunctionSignatureErrorType as GetFunctionSignatureErrorType,\n toFunctionSignature,\n /** @deprecated use `toFunctionSignature`. */\n toFunctionSignature as getFunctionSignature,\n} from './hash/toFunctionSignature.js'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from './nonceManager.js'\nexport { arrayRegex, bytesRegex, integerRegex } from './regex.js'\nexport {\n getSocket,\n rpc,\n type WebSocketAsyncErrorType,\n type WebSocketAsyncOptions,\n type WebSocketAsyncReturnType,\n type WebSocketErrorType,\n type WebSocketOptions,\n type WebSocketReturnType,\n} from './rpc/compat.js'\nexport {\n getHttpRpcClient,\n type HttpRequestErrorType,\n type HttpRequestParameters,\n type HttpRequestReturnType,\n type HttpRpcClient,\n type HttpRpcClientOptions,\n} from './rpc/http.js'\nexport {\n type GetSocketParameters,\n type GetSocketRpcClientErrorType,\n type GetSocketRpcClientParameters,\n getSocketRpcClient,\n type Socket,\n type SocketRpcClient,\n socketClientCache,\n} from './rpc/socket.js'\nexport { getWebSocketRpcClient } from './rpc/webSocket.js'\nexport {\n type HashMessageErrorType,\n type HashMessageReturnType,\n hashMessage,\n} from './signature/hashMessage.js'\nexport {\n type HashDomainErrorType,\n type HashStructErrorType,\n type HashTypedDataParameters,\n type HashTypedDataReturnType,\n hashStruct,\n hashTypedData,\n} from './signature/hashTypedData.js'\nexport {\n type IsErc6492SignatureErrorType,\n type IsErc6492SignatureParameters,\n type IsErc6492SignatureReturnType,\n isErc6492Signature,\n} from './signature/isErc6492Signature.js'\nexport {\n type IsErc8010SignatureErrorType,\n type IsErc8010SignatureParameters,\n type IsErc8010SignatureReturnType,\n isErc8010Signature,\n} from './signature/isErc8010Signature.js'\nexport {\n type ParseErc6492SignatureErrorType,\n type ParseErc6492SignatureParameters,\n type ParseErc6492SignatureReturnType,\n parseErc6492Signature,\n} from './signature/parseErc6492Signature.js'\nexport {\n type ParseErc8010SignatureErrorType,\n type ParseErc8010SignatureParameters,\n type ParseErc8010SignatureReturnType,\n parseErc8010Signature,\n} from './signature/parseErc8010Signature.js'\nexport {\n type RecoverAddressErrorType,\n type RecoverAddressParameters,\n type RecoverAddressReturnType,\n recoverAddress,\n} from './signature/recoverAddress.js'\nexport {\n type RecoverMessageAddressErrorType,\n type RecoverMessageAddressParameters,\n type RecoverMessageAddressReturnType,\n recoverMessageAddress,\n} from './signature/recoverMessageAddress.js'\nexport {\n type RecoverPublicKeyErrorType,\n type RecoverPublicKeyParameters,\n type RecoverPublicKeyReturnType,\n recoverPublicKey,\n} from './signature/recoverPublicKey.js'\nexport {\n type RecoverTypedDataAddressErrorType,\n type RecoverTypedDataAddressParameters,\n type RecoverTypedDataAddressReturnType,\n recoverTypedDataAddress,\n} from './signature/recoverTypedDataAddress.js'\nexport {\n type SerializeErc6492SignatureErrorType,\n type SerializeErc6492SignatureParameters,\n type SerializeErc6492SignatureReturnType,\n serializeErc6492Signature,\n} from './signature/serializeErc6492Signature.js'\nexport {\n type SerializeErc8010SignatureErrorType,\n type SerializeErc8010SignatureParameters,\n type SerializeErc8010SignatureReturnType,\n serializeErc8010Signature,\n} from './signature/serializeErc8010Signature.js'\nexport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from './signature/verifyHash.js'\nexport {\n type VerifyMessageErrorType,\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from './signature/verifyMessage.js'\nexport {\n type VerifyTypedDataErrorType,\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from './signature/verifyTypedData.js'\nexport { type StringifyErrorType, stringify } from './stringify.js'\nexport {\n type AssertRequestErrorType,\n assertRequest,\n} from './transaction/assertRequest.js'\nexport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionLegacy,\n} from './transaction/assertTransaction.js'\nexport {\n type GetSerializedTransactionType,\n type GetSerializedTransactionTypeErrorType,\n getSerializedTransactionType,\n} from './transaction/getSerializedTransactionType.js'\nexport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './transaction/getTransactionType.js'\nexport {\n type ParseTransactionErrorType,\n parseTransaction,\n} from './transaction/parseTransaction.js'\nexport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './transaction/serializeAccessList.js'\nexport {\n type SerializeTransactionErrorType,\n type SerializeTransactionFn,\n serializeTransaction,\n} from './transaction/serializeTransaction.js'\nexport {\n type DomainSeparatorErrorType,\n type SerializeTypedDataErrorType,\n serializeTypedData,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from './typedData.js'\nexport { type FormatEtherErrorType, formatEther } from './unit/formatEther.js'\nexport { type FormatGweiErrorType, formatGwei } from './unit/formatGwei.js'\nexport { type FormatUnitsErrorType, formatUnits } from './unit/formatUnits.js'\nexport { type ParseEtherErrorType, parseEther } from './unit/parseEther.js'\nexport { type ParseGweiErrorType, parseGwei } from './unit/parseGwei.js'\nexport { type ParseUnitsErrorType, parseUnits } from './unit/parseUnits.js'\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Proof } from '../../types/proof.js'\nimport type { RpcProof } from '../../types/rpc.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { hexToNumber } from '../index.js'\n\nexport type FormatProofErrorType = ErrorType\n\nfunction formatStorageProof(storageProof: RpcProof['storageProof']) {\n return storageProof.map((proof) => ({\n ...proof,\n value: BigInt(proof.value),\n }))\n}\n\nexport function formatProof(proof: ExactPartial) {\n return {\n ...proof,\n balance: proof.balance ? BigInt(proof.balance) : undefined,\n nonce: proof.nonce ? hexToNumber(proof.nonce) : undefined,\n storageProof: proof.storageProof\n ? formatStorageProof(proof.storageProof)\n : undefined,\n } as Proof\n}\n","import type { Address } from 'abitype'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { Proof } from '../../types/proof.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormatProofErrorType,\n formatProof,\n} from '../../utils/formatters/proof.js'\n\nexport type GetProofParameters = {\n /** Account address. */\n address: Address\n /** Array of storage-keys that should be proofed and included. */\n storageKeys: Hash[]\n} & (\n | {\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n)\n\nexport type GetProofReturnType = Proof\n\nexport type GetProofErrorType =\n | NumberToHexErrorType\n | FormatProofErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the account and storage values of the specified account including the Merkle-proof.\n *\n * - Docs: https://viem.sh/docs/actions/public/getProof\n * - JSON-RPC Methods:\n * - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186)\n *\n * @param client - Client to use\n * @param parameters - {@link GetProofParameters}\n * @returns Proof data. {@link GetProofReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getProof } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await getProof(client, {\n * address: '0x...',\n * storageKeys: ['0x...'],\n * })\n */\nexport async function getProof(\n client: Client,\n {\n address,\n blockNumber,\n blockTag: blockTag_,\n storageKeys,\n }: GetProofParameters,\n): Promise {\n const blockTag = blockTag_ ?? 'latest'\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n const proof = await client.request({\n method: 'eth_getProof',\n params: [address, storageKeys, blockNumberHex || blockTag],\n })\n\n return formatProof(proof)\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetStorageAtParameters = {\n address: Address\n slot: Hex\n} & (\n | {\n blockNumber?: undefined\n blockTag?: BlockTag | undefined\n }\n | {\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\n\nexport type GetStorageAtReturnType = Hex | undefined\n\nexport type GetStorageAtErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the value from a storage slot at a given address.\n *\n * - Docs: https://viem.sh/docs/contract/getStorageAt\n * - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat)\n *\n * @param client - Client to use\n * @param parameters - {@link GetStorageAtParameters}\n * @returns The value of the storage slot. {@link GetStorageAtReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getStorageAt } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await getStorageAt(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * slot: toHex(0),\n * })\n */\nexport async function getStorageAt(\n client: Client,\n { address, blockNumber, blockTag = 'latest', slot }: GetStorageAtParameters,\n): Promise {\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n const data = await client.request({\n method: 'eth_getStorageAt',\n params: [address, slot, blockNumberHex || blockTag],\n })\n return data\n}\n","import type { Address } from '../../accounts/index.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n TransactionNotFoundError,\n type TransactionNotFoundErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcTransaction } from '../../types/rpc.js'\nimport type { OneOf, Prettify } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormattedTransaction,\n formatTransaction,\n} from '../../utils/formatters/transaction.js'\n\nexport type GetTransactionParameters =\n OneOf<\n // eth_getTransactionByBlockHashAndIndex\n | {\n /** The block hash */\n blockHash: Hash\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByBlockNumberAndIndex\n | {\n /** The block number */\n blockNumber: bigint\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByBlockNumberAndIndex\n | {\n /** The block tag. */\n blockTag: blockTag | BlockTag\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByHash\n | {\n /** The hash of the transaction. */\n hash: Hash\n }\n // eth_getTransactionBySenderAndNonce\n | {\n /** The sender of the transaction. */\n sender: Address\n /** The nonce of the transaction on the sender. */\n nonce: number\n }\n >\n\nexport type GetTransactionReturnType<\n chain extends Chain | undefined = undefined,\n blockTag extends BlockTag = 'latest',\n> = Prettify>\n\nexport type GetTransactionErrorType =\n | TransactionNotFoundErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns information about a [Transaction](https://viem.sh/docs/glossary/terms#transaction) given a hash or block identifier.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransaction\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionParameters}\n * @returns The transaction information. {@link GetTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransaction } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transaction = await getTransaction(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransaction<\n chain extends Chain | undefined,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client,\n {\n blockHash,\n blockNumber,\n blockTag: blockTag_,\n hash,\n index,\n sender,\n nonce,\n }: GetTransactionParameters,\n): Promise> {\n const blockTag = blockTag_ || 'latest'\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let transaction: RpcTransaction | null = null\n if (hash) {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByHash',\n params: [hash],\n },\n { dedupe: true },\n )\n } else if (blockHash) {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByBlockHashAndIndex',\n params: [blockHash, numberToHex(index)],\n },\n { dedupe: true },\n )\n } else if ((blockNumberHex || blockTag) && typeof index === 'number') {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByBlockNumberAndIndex',\n params: [blockNumberHex || blockTag, numberToHex(index)],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n } else if (sender && typeof nonce === 'number') {\n transaction = await client.request(\n {\n method: 'eth_getTransactionBySenderAndNonce',\n params: [sender, numberToHex(nonce)],\n },\n { dedupe: true },\n )\n }\n\n if (!transaction)\n throw new TransactionNotFoundError({\n blockHash,\n blockNumber,\n blockTag,\n hash,\n index,\n })\n\n const format =\n client.chain?.formatters?.transaction?.format || formatTransaction\n return format(transaction, 'getTransaction')\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { FormattedTransactionReceipt } from '../../utils/formatters/transactionReceipt.js'\nimport { getAction } from '../../utils/getAction.js'\n\nimport {\n type GetBlockNumberErrorType,\n getBlockNumber,\n} from './getBlockNumber.js'\nimport {\n type GetTransactionErrorType,\n getTransaction,\n} from './getTransaction.js'\n\nexport type GetTransactionConfirmationsParameters<\n chain extends Chain | undefined = Chain,\n> =\n | {\n /** The transaction hash. */\n hash: Hash\n transactionReceipt?: undefined\n }\n | {\n hash?: undefined\n /** The transaction receipt. */\n transactionReceipt: FormattedTransactionReceipt\n }\n\nexport type GetTransactionConfirmationsReturnType = bigint\n\nexport type GetTransactionConfirmationsErrorType =\n | GetBlockNumberErrorType\n | GetTransactionErrorType\n | ErrorType\n\n/**\n * Returns the number of blocks passed (confirmations) since the transaction was processed on a block.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionConfirmationsParameters}\n * @returns The number of blocks passed since the transaction was processed. If confirmations is 0, then the Transaction has not been confirmed & processed yet. {@link GetTransactionConfirmationsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionConfirmations } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const confirmations = await getTransactionConfirmations(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransactionConfirmations<\n chain extends Chain | undefined,\n>(\n client: Client,\n { hash, transactionReceipt }: GetTransactionConfirmationsParameters,\n): Promise {\n const [blockNumber, transaction] = await Promise.all([\n getAction(client, getBlockNumber, 'getBlockNumber')({}),\n hash\n ? getAction(client, getTransaction, 'getTransaction')({ hash })\n : undefined,\n ])\n const transactionBlockNumber =\n transactionReceipt?.blockNumber || transaction?.blockNumber\n if (!transactionBlockNumber) return 0n\n return blockNumber - transactionBlockNumber! + 1n\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n TransactionReceiptNotFoundError,\n type TransactionReceiptNotFoundErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormattedTransactionReceipt,\n formatTransactionReceipt,\n} from '../../utils/formatters/transactionReceipt.js'\n\nexport type GetTransactionReceiptParameters = {\n /** The hash of the transaction. */\n hash: Hash\n}\n\nexport type GetTransactionReceiptReturnType<\n chain extends Chain | undefined = undefined,\n> = FormattedTransactionReceipt\n\nexport type GetTransactionReceiptErrorType =\n | RequestErrorType\n | TransactionReceiptNotFoundErrorType\n | ErrorType\n\n/**\n * Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactionreceipt)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionReceiptParameters}\n * @returns The transaction receipt. {@link GetTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionReceipt } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await getTransactionReceipt(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransactionReceipt(\n client: Client,\n { hash }: GetTransactionReceiptParameters,\n) {\n const receipt = await client.request(\n {\n method: 'eth_getTransactionReceipt',\n params: [hash],\n },\n { dedupe: true },\n )\n\n if (!receipt) throw new TransactionReceiptNotFoundError({ hash })\n\n const format =\n client.chain?.formatters?.transactionReceipt?.format ||\n formatTransactionReceipt\n return format(\n receipt,\n 'getTransactionReceipt',\n ) as GetTransactionReceiptReturnType\n}\n","import type { AbiStateMutability, Address, Narrow } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { multicall3Abi } from '../../constants/abis.js'\nimport { multicall3Bytecode } from '../../constants/contracts.js'\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport { BaseError } from '../../errors/base.js'\nimport { RawContractError } from '../../errors/contract.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ContractFunctionParameters } from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n MulticallContracts,\n MulticallResults,\n} from '../../types/multicall.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { CallParameters } from './call.js'\nimport { type ReadContractErrorType, readContract } from './readContract.js'\n\nexport type MulticallParameters<\n contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n allowFailure extends boolean = true,\n options extends {\n optional?: boolean\n properties?: Record\n } = {},\n> = Pick<\n CallParameters,\n | 'authorizationList'\n | 'blockNumber'\n | 'blockOverrides'\n | 'blockTag'\n | 'stateOverride'\n> & {\n /** The account to use for the multicall. */\n account?: Address | undefined\n /** Whether to allow failures. */\n allowFailure?: allowFailure | boolean | undefined\n /** The size of each batch of calls. */\n batchSize?: number | undefined\n /** Enable deployless multicall. */\n deployless?: boolean | undefined\n /** The contracts to call. */\n contracts: MulticallContracts<\n Narrow,\n { mutability: AbiStateMutability } & options\n >\n /** The address of the multicall3 contract to use. */\n multicallAddress?: Address | undefined\n}\n\nexport type MulticallReturnType<\n contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n allowFailure extends boolean = true,\n options extends {\n error?: Error\n } = { error: Error },\n> = MulticallResults<\n Narrow,\n allowFailure,\n { mutability: AbiStateMutability } & options\n>\n\nexport type MulticallErrorType =\n | GetChainContractAddressErrorType\n | ReadContractErrorType\n | GetContractErrorReturnType<\n EncodeFunctionDataErrorType | DecodeFunctionResultErrorType\n >\n | ErrorType\n\n/**\n * Similar to [`readContract`](https://viem.sh/docs/contract/readContract), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall).\n *\n * - Docs: https://viem.sh/docs/contract/multicall\n *\n * @param client - Client to use\n * @param parameters - {@link MulticallParameters}\n * @returns An array of results with accompanying status. {@link MulticallReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { multicall } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const abi = parseAbi([\n * 'function balanceOf(address) view returns (uint256)',\n * 'function totalSupply() view returns (uint256)',\n * ])\n * const results = await multicall(client, {\n * contracts: [\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * },\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'totalSupply',\n * },\n * ],\n * })\n * // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }]\n */\nexport async function multicall<\n const contracts extends readonly unknown[],\n chain extends Chain | undefined,\n allowFailure extends boolean = true,\n>(\n client: Client,\n parameters: MulticallParameters,\n): Promise> {\n const {\n account,\n authorizationList,\n allowFailure = true,\n blockNumber,\n blockOverrides,\n blockTag,\n stateOverride,\n } = parameters\n const contracts = parameters.contracts as ContractFunctionParameters[]\n\n const {\n batchSize = parameters.batchSize ?? 1024,\n deployless = parameters.deployless ?? false,\n } = typeof client.batch?.multicall === 'object' ? client.batch.multicall : {}\n\n const multicallAddress = (() => {\n if (parameters.multicallAddress) return parameters.multicallAddress\n if (deployless) return null\n if (client.chain) {\n return getChainContractAddress({\n blockNumber,\n chain: client.chain,\n contract: 'multicall3',\n })\n }\n throw new Error(\n 'client chain not configured. multicallAddress is required.',\n )\n })()\n\n type Aggregate3Calls = {\n allowFailure: boolean\n callData: Hex\n target: Address\n }[]\n\n const chunkedCalls: Aggregate3Calls[] = [[]]\n let currentChunk = 0\n let currentChunkSize = 0\n for (let i = 0; i < contracts.length; i++) {\n const { abi, address, args, functionName } = contracts[i]\n try {\n const callData = encodeFunctionData({ abi, args, functionName })\n\n currentChunkSize += (callData.length - 2) / 2\n // Check to see if we need to create a new chunk.\n if (\n // Check if batching is enabled.\n batchSize > 0 &&\n // Check if the current size of the batch exceeds the size limit.\n currentChunkSize > batchSize &&\n // Check if the current chunk is not already empty.\n chunkedCalls[currentChunk].length > 0\n ) {\n currentChunk++\n currentChunkSize = (callData.length - 2) / 2\n chunkedCalls[currentChunk] = []\n }\n\n chunkedCalls[currentChunk] = [\n ...chunkedCalls[currentChunk],\n {\n allowFailure: true,\n callData,\n target: address,\n },\n ]\n } catch (err) {\n const error = getContractError(err as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/multicall',\n functionName,\n sender: account,\n })\n if (!allowFailure) throw error\n chunkedCalls[currentChunk] = [\n ...chunkedCalls[currentChunk],\n {\n allowFailure: true,\n callData: '0x' as Hex,\n target: address,\n },\n ]\n }\n }\n\n const aggregate3Results = await Promise.allSettled(\n chunkedCalls.map((calls) =>\n getAction(\n client,\n readContract,\n 'readContract',\n )({\n ...(multicallAddress === null\n ? { code: multicall3Bytecode }\n : { address: multicallAddress }),\n abi: multicall3Abi,\n account,\n args: [calls],\n authorizationList,\n blockNumber,\n blockOverrides,\n blockTag,\n functionName: 'aggregate3',\n stateOverride,\n }),\n ),\n )\n\n const results = []\n for (let i = 0; i < aggregate3Results.length; i++) {\n const result = aggregate3Results[i]\n\n // If an error occurred in a `readContract` invocation (ie. network error),\n // then append the failure reason to each contract result.\n if (result.status === 'rejected') {\n if (!allowFailure) throw result.reason\n for (let j = 0; j < chunkedCalls[i].length; j++) {\n results.push({\n status: 'failure',\n error: result.reason,\n result: undefined,\n })\n }\n continue\n }\n\n // If the `readContract` call was successful, then decode the results.\n const aggregate3Result = result.value\n for (let j = 0; j < aggregate3Result.length; j++) {\n // Extract the response from `readContract`\n const { returnData, success } = aggregate3Result[j]\n\n // Extract the request call data from the original call.\n const { callData } = chunkedCalls[i][j]\n\n // Extract the contract config for this call from the `contracts` argument\n // for decoding.\n const { abi, address, functionName, args } = contracts[\n results.length\n ] as ContractFunctionParameters\n\n try {\n if (callData === '0x') throw new AbiDecodingZeroDataError()\n if (!success) throw new RawContractError({ data: returnData })\n const result = decodeFunctionResult({\n abi,\n args,\n data: returnData,\n functionName,\n })\n results.push(allowFailure ? { result, status: 'success' } : result)\n } catch (err) {\n const error = getContractError(err as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/multicall',\n functionName,\n })\n if (!allowFailure) throw error\n results.push({ error, result: undefined, status: 'failure' })\n }\n }\n }\n\n if (results.length !== contracts.length)\n throw new BaseError('multicall results mismatch')\n return results as MulticallReturnType\n}\n","import type { Abi, AbiStateMutability, Address, Narrow } from 'abitype'\nimport * as BlockOverrides from 'ox/BlockOverrides'\n\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { RawContractError } from '../../errors/contract.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block, BlockTag } from '../../types/block.js'\nimport type { Call, Calls } from '../../types/calls.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { MulticallResults } from '../../types/multicall.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { ExactPartial, UnionOmit } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport { concat } from '../../utils/data/concat.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { getContractError } from '../../utils/errors/getContractError.js'\nimport {\n type GetNodeErrorReturnType,\n getNodeError,\n} from '../../utils/errors/getNodeError.js'\nimport {\n type FormatBlockErrorType,\n formatBlock,\n} from '../../utils/formatters/block.js'\nimport { formatLog } from '../../utils/formatters/log.js'\nimport {\n type FormatTransactionRequestErrorType,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport {\n type SerializeStateOverrideErrorType,\n serializeStateOverride,\n} from '../../utils/stateOverride.js'\nimport {\n type AssertRequestErrorType,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\n\ntype CallExtraProperties = ExactPartial<\n UnionOmit<\n TransactionRequest,\n 'blobs' | 'data' | 'kzg' | 'to' | 'sidecars' | 'value'\n >\n> & {\n /** Account attached to the call (msg.sender). */\n account?: Account | Address | undefined\n /** Recipient. `null` if contract deployment. */\n to?: Address | null | undefined\n}\n\nexport type SimulateBlocksParameters<\n calls extends readonly unknown[] = readonly unknown[],\n> = {\n /** Blocks to simulate. */\n blocks: readonly {\n /** Block overrides. */\n blockOverrides?: BlockOverrides.BlockOverrides | undefined\n /** Calls to execute. */\n calls: Calls, CallExtraProperties>\n /** State overrides. */\n stateOverrides?: StateOverride | undefined\n }[]\n /** Whether to return the full transactions. */\n returnFullTransactions?: boolean | undefined\n /** Whether to trace transfers. */\n traceTransfers?: boolean | undefined\n /** Whether to enable validation mode. */\n validation?: boolean | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n)\n\nexport type SimulateBlocksReturnType<\n calls extends readonly unknown[] = readonly unknown[],\n> = readonly (Block & {\n calls: MulticallResults<\n Narrow,\n true,\n {\n extraProperties: {\n data: Hex\n gasUsed: bigint\n logs?: Log[] | undefined\n }\n error: Error\n mutability: AbiStateMutability\n }\n >\n})[]\n\nexport type SimulateBlocksErrorType =\n | AssertRequestErrorType\n | DecodeFunctionResultErrorType\n | EncodeFunctionDataErrorType\n | FormatBlockErrorType\n | FormatTransactionRequestErrorType\n | GetNodeErrorReturnType\n | ParseAccountErrorType\n | SerializeStateOverrideErrorType\n | NumberToHexErrorType\n | ErrorType\n\n/**\n * Simulates a set of calls on block(s) with optional block and state overrides.\n *\n * @example\n * ```ts\n * import { createClient, http, parseEther } from 'viem'\n * import { simulate } from 'viem/actions'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await simulate(client, {\n * blocks: [{\n * blockOverrides: {\n * number: 69420n,\n * },\n * calls: [{\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * }],\n * stateOverrides: [{\n * address: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * balance: parseEther('10'),\n * }],\n * }]\n * })\n * ```\n *\n * @param client - Client to use.\n * @param parameters - {@link SimulateBlocksParameters}\n * @returns Simulated blocks. {@link SimulateBlocksReturnType}\n */\nexport async function simulateBlocks<\n chain extends Chain | undefined,\n const calls extends readonly unknown[],\n>(\n client: Client,\n parameters: SimulateBlocksParameters,\n): Promise> {\n const {\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n blocks,\n returnFullTransactions,\n traceTransfers,\n validation,\n } = parameters\n\n try {\n const blockStateCalls = []\n for (const block of blocks) {\n const blockOverrides = block.blockOverrides\n ? BlockOverrides.toRpc(block.blockOverrides)\n : undefined\n const calls = block.calls.map((call_) => {\n const call = call_ as Call\n const account = call.account ? parseAccount(call.account) : undefined\n const data = call.abi ? encodeFunctionData(call) : call.data\n const request = {\n ...call,\n account,\n data: call.dataSuffix\n ? concat([data || '0x', call.dataSuffix])\n : data,\n from: call.from ?? account?.address,\n } as const\n assertRequest(request)\n return formatTransactionRequest(request)\n })\n const stateOverrides = block.stateOverrides\n ? serializeStateOverride(block.stateOverrides)\n : undefined\n\n blockStateCalls.push({\n blockOverrides,\n calls,\n stateOverrides,\n })\n }\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const result = await client.request({\n method: 'eth_simulateV1',\n params: [\n { blockStateCalls, returnFullTransactions, traceTransfers, validation },\n block,\n ],\n })\n\n return result.map((block, i) => ({\n ...formatBlock(block),\n calls: block.calls.map((call, j) => {\n const { abi, args, functionName, to } = blocks[i].calls[j] as Call<\n unknown,\n CallExtraProperties\n >\n\n const data = call.error?.data ?? call.returnData\n const gasUsed = BigInt(call.gasUsed)\n const logs = call.logs?.map((log) => formatLog(log))\n const status = call.status === '0x1' ? 'success' : 'failure'\n\n const result =\n abi && status === 'success' && data !== '0x'\n ? decodeFunctionResult({\n abi,\n data,\n functionName,\n })\n : null\n\n const error = (() => {\n if (status === 'success') return undefined\n\n let error: Error | undefined\n if (data === '0x') error = new AbiDecodingZeroDataError()\n else if (data) error = new RawContractError({ data })\n\n if (!error) return undefined\n return getContractError(error, {\n abi: (abi ?? []) as Abi,\n address: to ?? '0x',\n args,\n functionName: functionName ?? '',\n })\n })()\n\n return {\n data,\n gasUsed,\n logs,\n status,\n ...(status === 'success'\n ? {\n result,\n }\n : {\n error,\n }),\n }\n }),\n })) as unknown as SimulateBlocksReturnType\n } catch (e) {\n const cause = e as BaseError\n const error = getNodeError(cause, {})\n if (error instanceof UnknownNodeError) throw cause\n throw error\n }\n}\n","import type * as abitype from 'abitype'\nimport type * as Abi from '../Abi.js'\nimport type * as AbiItem from '../AbiItem.js'\nimport type * as AbiParameters from '../AbiParameters.js'\nimport * as Address from '../Address.js'\nimport * as Errors from '../Errors.js'\nimport type {\n Compute,\n IsNever,\n IsUnion,\n TypeErrorMessage,\n UnionToTuple,\n} from './types.js'\n\n/** @internal */\nexport type ExtractArgs<\n abi extends Abi.Abi | readonly unknown[] = Abi.Abi,\n name extends AbiItem.Name = AbiItem.Name,\n> = abitype.AbiParametersToPrimitiveTypes<\n AbiItem.FromAbi['inputs'],\n 'inputs'\n> extends infer args\n ? [args] extends [never]\n ? readonly unknown[]\n : args\n : readonly unknown[]\n\n/** @internal */\nexport type ExtractForArgs<\n abi extends Abi.Abi,\n name extends AbiItem.Name,\n args extends ExtractArgs,\n> = IsUnion extends true\n ? {\n [key in keyof abi]: abi[key] extends { name: name } ? abi[key] : never\n }[number]\n : AbiItem.FromAbi extends infer abiItem extends AbiItem.AbiItem & {\n inputs: readonly abitype.AbiParameter[]\n }\n ? IsUnion extends true // narrow overloads using `args` by converting to tuple and filtering out overloads that don't match\n ? UnionToTuple extends infer abiItems extends\n readonly (AbiItem.AbiItem & {\n inputs: readonly abitype.AbiParameter[]\n })[]\n ? IsNever> extends true\n ? Compute<\n abiItems[0] & {\n readonly overloads: UnionToTuple<\n Exclude\n >\n }\n >\n : TupleToUnion // convert back to union (removes `never` tuple entries: `['foo', never, 'bar'][number]` => `'foo' | 'bar'`)\n : never\n : abiItem\n : never\n\n/** @internal */\nexport type TupleToUnion<\n abiItems extends readonly {\n inputs: readonly abitype.AbiParameter[]\n }[],\n abi extends Abi.Abi,\n name extends AbiItem.Name,\n args extends ExtractArgs,\n> = {\n [k in keyof abiItems]: (\n readonly [] extends args\n ? readonly [] // fallback to `readonly []` if `args` has no value (e.g. `args` property not provided)\n : args\n ) extends abitype.AbiParametersToPrimitiveTypes<\n abiItems[k]['inputs'],\n 'inputs'\n >\n ? abiItems[k]\n : never\n}[number]\n\n/** @internal */\nexport type ErrorSignature<\n name extends string = string,\n parameters extends string = string,\n> = `error ${name}(${parameters})`\n\n/** @internal */\nexport type IsErrorSignature =\n signature extends ErrorSignature ? IsName : false\n\n/** @internal */\nexport type EventSignature<\n name extends string = string,\n parameters extends string = string,\n> = `event ${name}(${parameters})`\n\n/** @internal */\nexport type IsEventSignature =\n signature extends EventSignature ? IsName : false\n\n/** @internal */\nexport type FunctionSignature<\n name extends string = string,\n tail extends string = string,\n> = `function ${name}(${tail}`\nexport type IsFunctionSignature =\n signature extends FunctionSignature\n ? IsName extends true\n ? signature extends ValidFunctionSignatures\n ? true\n : // Check that `Parameters` is not absorbing other types (e.g. `returns`)\n signature extends `function ${string}(${infer parameters})`\n ? parameters extends InvalidFunctionParameters\n ? false\n : true\n : false\n : false\n : false\n/** @internal */\nexport type Scope = 'public' | 'external' // `internal` or `private` functions wouldn't make it to ABI so can ignore\n\n/** @internal */\nexport type Returns = `returns (${string})` | `returns(${string})`\n\n// Almost all valid function signatures, except `function ${string}(${infer parameters})` since `parameters` can absorb returns\n/** @internal */\nexport type ValidFunctionSignatures =\n | `function ${string}()`\n // basic\n | `function ${string}() ${Returns}`\n | `function ${string}() ${abitype.AbiStateMutability}`\n | `function ${string}() ${Scope}`\n // combinations\n | `function ${string}() ${abitype.AbiStateMutability} ${Returns}`\n | `function ${string}() ${Scope} ${Returns}`\n | `function ${string}() ${Scope} ${abitype.AbiStateMutability}`\n | `function ${string}() ${Scope} ${abitype.AbiStateMutability} ${Returns}`\n // Parameters\n | `function ${string}(${string}) ${Returns}`\n | `function ${string}(${string}) ${abitype.AbiStateMutability}`\n | `function ${string}(${string}) ${Scope}`\n | `function ${string}(${string}) ${abitype.AbiStateMutability} ${Returns}`\n | `function ${string}(${string}) ${Scope} ${Returns}`\n | `function ${string}(${string}) ${Scope} ${abitype.AbiStateMutability}`\n | `function ${string}(${string}) ${Scope} ${abitype.AbiStateMutability} ${Returns}`\n\n/** @internal */\nexport type StructSignature<\n name extends string = string,\n properties extends string = string,\n> = `struct ${name} {${properties}}`\n\n/** @internal */\nexport type IsStructSignature =\n signature extends StructSignature ? IsName : false\n\n/** @internal */\nexport type ConstructorSignature =\n `constructor(${tail}`\n\n/** @internal */\nexport type IsConstructorSignature =\n signature extends ConstructorSignature\n ? signature extends ValidConstructorSignatures\n ? true\n : false\n : false\n\n/** @internal */\nexport type ValidConstructorSignatures =\n | `constructor(${string})`\n | `constructor(${string}) payable`\n\n/** @internal */\nexport type FallbackSignature =\n `fallback() external${abiStateMutability}`\n\n/** @internal */\nexport type ReceiveSignature = 'receive() external payable'\n\n// TODO: Maybe use this for signature validation one day\n// https://twitter.com/devanshj__/status/1610423724708343808\n/** @internal */\nexport type IsSignature =\n | (IsErrorSignature extends true ? true : never)\n | (IsEventSignature extends true ? true : never)\n | (IsFunctionSignature extends true ? true : never)\n | (IsStructSignature extends true ? true : never)\n | (IsConstructorSignature extends true ? true : never)\n | (type extends FallbackSignature ? true : never)\n | (type extends ReceiveSignature ? true : never) extends infer condition\n ? [condition] extends [never]\n ? false\n : true\n : false\n\n/** @internal */\nexport type Signature<\n string1 extends string,\n string2 extends string | unknown = unknown,\n> = IsSignature extends true\n ? string1\n : string extends string1 // if exactly `string` (not narrowed), then pass through as valid\n ? string1\n : TypeErrorMessage<`Signature \"${string1}\" is invalid${string2 extends string\n ? ` at position ${string2}`\n : ''}.`>\n\n/** @internal */\nexport type Signatures = {\n [key in keyof signatures]: Signature\n}\n\n/** @internal */\nexport type IsName = name extends ''\n ? false\n : ValidateName extends name\n ? true\n : false\n\n/** @internal */\nexport type ValidateName<\n name extends string,\n checkCharacters extends boolean = false,\n> = name extends `${string}${' '}${string}`\n ? TypeErrorMessage<`Identifier \"${name}\" cannot contain whitespace.`>\n : IsSolidityKeyword extends true\n ? TypeErrorMessage<`\"${name}\" is a protected Solidity keyword.`>\n : name extends `${number}`\n ? TypeErrorMessage<`Identifier \"${name}\" cannot be a number string.`>\n : name extends `${number}${string}`\n ? TypeErrorMessage<`Identifier \"${name}\" cannot start with a number.`>\n : checkCharacters extends true\n ? IsValidCharacter extends true\n ? name\n : TypeErrorMessage<`\"${name}\" contains invalid character.`>\n : name\n\n/** @internal */\nexport type IsSolidityKeyword =\n type extends SolidityKeywords ? true : false\n\n/** @internal */\nexport type SolidityKeywords =\n | 'after'\n | 'alias'\n | 'anonymous'\n | 'apply'\n | 'auto'\n | 'byte'\n | 'calldata'\n | 'case'\n | 'catch'\n | 'constant'\n | 'copyof'\n | 'default'\n | 'defined'\n | 'error'\n | 'event'\n | 'external'\n | 'false'\n | 'final'\n | 'function'\n | 'immutable'\n | 'implements'\n | 'in'\n | 'indexed'\n | 'inline'\n | 'internal'\n | 'let'\n | 'mapping'\n | 'match'\n | 'memory'\n | 'mutable'\n | 'null'\n | 'of'\n | 'override'\n | 'partial'\n | 'private'\n | 'promise'\n | 'public'\n | 'pure'\n | 'reference'\n | 'relocatable'\n | 'return'\n | 'returns'\n | 'sizeof'\n | 'static'\n | 'storage'\n | 'struct'\n | 'super'\n | 'supports'\n | 'switch'\n | 'this'\n | 'true'\n | 'try'\n | 'typedef'\n | 'typeof'\n | 'var'\n | 'view'\n | 'virtual'\n | `address${`[${string}]` | ''}`\n | `bool${`[${string}]` | ''}`\n | `string${`[${string}]` | ''}`\n | `tuple${`[${string}]` | ''}`\n | `bytes${number | ''}${`[${string}]` | ''}`\n | `${'u' | ''}int${number | ''}${`[${string}]` | ''}`\n\n/** @internal */\nexport type IsValidCharacter =\n character extends `${ValidCharacters}${infer tail}`\n ? tail extends ''\n ? true\n : IsValidCharacter\n : false\n\n// biome-ignore format: no formatting\n/** @internal */\nexport type ValidCharacters =\n // uppercase letters\n | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'\n // lowercase letters\n | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'\n // numbers\n | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'\n // special characters\n | '_' | '$'\n\n// Template string inference can absorb `returns`:\n// type Result = `function foo(string) return s (uint256)` extends `function ${string}(${infer Parameters})` ? Parameters : never\n// // ^? type Result = \"string ) return s (uint256\"\n// So we need to validate against `returns` keyword with all combinations of whitespace\n/** @internal */\nexport type InvalidFunctionParameters =\n | `${string}${MangledReturns} (${string}`\n | `${string}) ${MangledReturns}${string}`\n | `${string})${string}${MangledReturns}${string}(${string}`\n\n// r_e_t_u_r_n_s\n/** @internal */\nexport type MangledReturns =\n // Single\n | `r${string}eturns`\n | `re${string}turns`\n | `ret${string}urns`\n | `retu${string}rns`\n | `retur${string}ns`\n | `return${string}s`\n // Double\n // `r_e*`\n | `r${string}e${string}turns`\n | `r${string}et${string}urns`\n | `r${string}etu${string}rns`\n | `r${string}etur${string}ns`\n | `r${string}eturn${string}s`\n // `re_t*`\n | `re${string}t${string}urns`\n | `re${string}tu${string}rns`\n | `re${string}tur${string}ns`\n | `re${string}turn${string}s`\n // `ret_u*`\n | `ret${string}u${string}rns`\n | `ret${string}ur${string}ns`\n | `ret${string}urn${string}s`\n // `retu_r*`\n | `retu${string}r${string}ns`\n | `retu${string}rn${string}s`\n // `retur_n*`\n | `retur${string}n${string}s`\n // Triple\n // `r_e_t*`\n | `r${string}e${string}t${string}urns`\n | `r${string}e${string}tu${string}rns`\n | `r${string}e${string}tur${string}ns`\n | `r${string}e${string}turn${string}s`\n // `re_t_u*`\n | `re${string}t${string}u${string}rns`\n | `re${string}t${string}ur${string}ns`\n | `re${string}t${string}urn${string}s`\n // `ret_u_r*`\n | `ret${string}u${string}r${string}ns`\n | `ret${string}u${string}rn${string}s`\n // `retu_r_n*`\n | `retu${string}r${string}n${string}s`\n // Quadruple\n // `r_e_t_u*`\n | `r${string}e${string}t${string}u${string}rns`\n | `r${string}e${string}t${string}ur${string}ns`\n | `r${string}e${string}t${string}urn${string}s`\n // `re_t_u_r*`\n | `re${string}t${string}u${string}r${string}ns`\n | `re${string}t${string}u${string}rn${string}s`\n // `ret_u_r_n*`\n | `ret${string}u${string}r${string}n${string}s`\n // Quintuple\n // `r_e_t_u_r*`\n | `r${string}e${string}t${string}u${string}r${string}ns`\n | `r${string}e${string}t${string}u${string}rn${string}s`\n // `re_t_u_r_n*`\n | `re${string}t${string}u${string}r${string}n${string}s`\n // Sextuple\n // `r_e_t_u_r_n_s`\n | `r${string}e${string}t${string}u${string}r${string}n${string}s`\n\n/** @internal */\nexport type Widen =\n | ([unknown] extends [type] ? unknown : never)\n | (type extends Function ? type : never)\n | (type extends abitype.ResolvedRegister['bigIntType'] ? bigint : never)\n | (type extends boolean ? boolean : never)\n | (type extends abitype.ResolvedRegister['intType'] ? number : never)\n | (type extends string\n ? type extends abitype.ResolvedRegister['addressType']\n ? abitype.ResolvedRegister['addressType']\n : type extends abitype.ResolvedRegister['bytesType']['inputs']\n ? abitype.ResolvedRegister['bytesType']\n : string\n : never)\n | (type extends readonly [] ? readonly [] : never)\n | (type extends Record\n ? { [K in keyof type]: Widen }\n : never)\n | (type extends { length: number }\n ? {\n [K in keyof type]: Widen\n } extends infer Val extends readonly unknown[]\n ? readonly [...Val]\n : never\n : never)\n\n/** @internal */\nexport function normalizeSignature(signature: string): string {\n let active = true\n let current = ''\n let level = 0\n let result = ''\n let valid = false\n\n for (let i = 0; i < signature.length; i++) {\n const char = signature[i]!\n\n // If the character is a separator, we want to reactivate.\n if (['(', ')', ','].includes(char)) active = true\n\n // If the character is a \"level\" token, we want to increment/decrement.\n if (char === '(') level++\n if (char === ')') level--\n\n // If we aren't active, we don't want to mutate the result.\n if (!active) continue\n\n // If level === 0, we are at the definition level.\n if (level === 0) {\n if (char === ' ' && ['event', 'function', 'error', ''].includes(result))\n result = ''\n else {\n result += char\n\n // If we are at the end of the definition, we must be finished.\n if (char === ')') {\n valid = true\n break\n }\n }\n\n continue\n }\n\n // Ignore spaces\n if (char === ' ') {\n // If the previous character is a separator, and the current section isn't empty, we want to deactivate.\n if (signature[i - 1] !== ',' && current !== ',' && current !== ',(') {\n current = ''\n active = false\n }\n continue\n }\n\n result += char\n current += char\n }\n\n if (!valid) throw new Errors.BaseError('Unable to normalize signature.')\n\n return result\n}\n\n/** @internal */\nexport declare namespace normalizeSignature {\n export type ErrorType = Errors.BaseError | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function isArgOfType(\n arg: unknown,\n abiParameter: AbiParameters.Parameter,\n): boolean {\n const argType = typeof arg\n const abiParameterType = abiParameter.type\n switch (abiParameterType) {\n case 'address':\n return Address.validate(arg as Address.Address, { strict: false })\n case 'bool':\n return argType === 'boolean'\n case 'function':\n return argType === 'string'\n case 'string':\n return argType === 'string'\n default: {\n if (abiParameterType === 'tuple' && 'components' in abiParameter)\n return Object.values(abiParameter.components).every(\n (component, index) => {\n return isArgOfType(\n Object.values(arg as unknown[] | Record)[index],\n component as AbiParameters.Parameter,\n )\n },\n )\n\n // `(u)int`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n // https://regexr.com/6v8hp\n if (\n /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(\n abiParameterType,\n )\n )\n return argType === 'number' || argType === 'bigint'\n\n // `bytes`: binary type of `M` bytes, `0 < M <= 32`\n // https://regexr.com/6va55\n if (/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(abiParameterType))\n return argType === 'string' || arg instanceof Uint8Array\n\n // fixed-length (`[M]`) and dynamic (`[]`) arrays\n // https://regexr.com/6va6i\n if (/[a-z]+[1-9]{0,3}(\\[[0-9]{0,}\\])+$/.test(abiParameterType)) {\n return (\n Array.isArray(arg) &&\n arg.every((x: unknown) =>\n isArgOfType(x, {\n ...abiParameter,\n // Pop off `[]` or `[M]` from end of type\n type: abiParameterType.replace(/(\\[[0-9]{0,}\\])$/, ''),\n } as AbiParameters.Parameter),\n )\n )\n }\n\n return false\n }\n }\n}\n\n/** @internal */\nexport function getAmbiguousTypes(\n sourceParameters: readonly AbiParameters.Parameter[],\n targetParameters: readonly AbiParameters.Parameter[],\n args: ExtractArgs,\n): AbiParameters.Parameter['type'][] | undefined {\n for (const parameterIndex in sourceParameters) {\n const sourceParameter = sourceParameters[parameterIndex]!\n const targetParameter = targetParameters[parameterIndex]!\n\n if (\n sourceParameter.type === 'tuple' &&\n targetParameter.type === 'tuple' &&\n 'components' in sourceParameter &&\n 'components' in targetParameter\n )\n return getAmbiguousTypes(\n sourceParameter.components,\n targetParameter.components,\n (args as any)[parameterIndex],\n )\n\n const types = [sourceParameter.type, targetParameter.type]\n\n const ambiguous = (() => {\n if (types.includes('address') && types.includes('bytes20')) return true\n if (types.includes('address') && types.includes('string'))\n return Address.validate(args[parameterIndex] as Address.Address, {\n strict: false,\n })\n if (types.includes('address') && types.includes('bytes'))\n return Address.validate(args[parameterIndex] as Address.Address, {\n strict: false,\n })\n return false\n })()\n\n if (ambiguous) return types\n }\n\n return\n}\n","import * as abitype from 'abitype'\nimport type * as Abi from './Abi.js'\nimport * as Errors from './Errors.js'\nimport * as Hash from './Hash.js'\nimport * as Hex from './Hex.js'\nimport * as internal from './internal/abiItem.js'\nimport type { UnionCompute } from './internal/types.js'\n\n/** Root type for an item on an {@link ox#Abi.Abi}. */\nexport type AbiItem = Abi.Abi[number]\n\n/**\n * Extracts an {@link ox#AbiItem.AbiItem} item from an {@link ox#Abi.Abi}, given a name.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'error Foo(string)',\n * 'function foo(string)',\n * 'event Bar(uint256)',\n * ])\n *\n * type Foo = AbiItem.FromAbi\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n */\nexport type FromAbi<\n abi extends Abi.Abi,\n name extends ExtractNames,\n> = Extract\n\n/**\n * Extracts the names of all {@link ox#AbiItem.AbiItem} items in an {@link ox#Abi.Abi}.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'error Foo(string)',\n * 'function foo(string)',\n * 'event Bar(uint256)',\n * ])\n *\n * type names = AbiItem.Name\n * // ^?\n *\n * ```\n */\nexport type Name =\n abi extends Abi.Abi ? ExtractNames : string\n\nexport type ExtractNames = Extract<\n abi[number],\n { name: string }\n>['name']\n\n/**\n * Formats an {@link ox#AbiItem.AbiItem} into a **Human Readable ABI Item**.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const formatted = AbiItem.format({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param abiItem - The ABI Item to format.\n * @returns The formatted ABI Item .\n */\nexport function format(\n abiItem: abiItem | AbiItem,\n): abitype.FormatAbiItem {\n return abitype.formatAbiItem(abiItem) as never\n}\n\nexport declare namespace format {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses an arbitrary **JSON ABI Item** or **Human Readable ABI Item** into a typed {@link ox#AbiItem.AbiItem}.\n *\n * @example\n * ### JSON ABIs\n *\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const abiItem = AbiItem.from({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * abiItem\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable ABIs\n *\n * A Human Readable ABI can be parsed into a typed ABI object:\n *\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const abiItem = AbiItem.from(\n * 'function approve(address spender, uint256 amount) returns (bool)' // [!code hl]\n * )\n *\n * abiItem\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const abiItem = AbiItem.from([\n * 'struct Foo { address spender; uint256 amount; }', // [!code hl]\n * 'function approve(Foo foo) returns (bool)',\n * ])\n *\n * abiItem\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param abiItem - The ABI Item to parse.\n * @returns The typed ABI Item.\n */\nexport function from<\n const abiItem extends AbiItem | string | readonly string[],\n>(\n abiItem: (abiItem | AbiItem | string | readonly string[]) &\n (\n | (abiItem extends string ? internal.Signature : never)\n | (abiItem extends readonly string[]\n ? internal.Signatures\n : never)\n | AbiItem\n ),\n options: from.Options = {},\n): from.ReturnType {\n const { prepare = true } = options\n const item = (() => {\n if (Array.isArray(abiItem)) return abitype.parseAbiItem(abiItem)\n if (typeof abiItem === 'string')\n return abitype.parseAbiItem(abiItem as never)\n return abiItem\n })() as AbiItem\n return {\n ...item,\n ...(prepare ? { hash: getSignatureHash(item) } : {}),\n } as never\n}\n\nexport declare namespace from {\n type Options = {\n /**\n * Whether or not to prepare the extracted item (optimization for encoding performance).\n * When `true`, the `hash` property is computed and included in the returned value.\n *\n * @default true\n */\n prepare?: boolean | undefined\n }\n\n type ReturnType =\n abiItem extends string\n ? abitype.ParseAbiItem\n : abiItem extends readonly string[]\n ? abitype.ParseAbiItem\n : abiItem\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Extracts an {@link ox#AbiItem.AbiItem} from an {@link ox#Abi.Abi} given a name and optional arguments.\n *\n * @example\n * ABI Items can be extracted by their name using the `name` option:\n *\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n *\n * const item = AbiItem.fromAbi(abi, 'Transfer') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Extracting by Selector\n *\n * ABI Items can be extract by their selector when {@link ox#Hex.Hex} is provided to `name`.\n *\n * ```ts twoslash\n * import { Abi, AbiItem } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n * const item = AbiItem.fromAbi(abi, '0x095ea7b3') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * :::note\n *\n * Extracting via a hex selector is useful when extracting an ABI Item from an `eth_call` RPC response,\n * a Transaction `input`, or from Event Log `topics`.\n *\n * :::\n *\n * @param abi - The ABI to extract from.\n * @param name - The name (or selector) of the ABI item to extract.\n * @param options - Extraction options.\n * @returns The ABI item.\n */\nexport function fromAbi<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends internal.ExtractArgs | undefined = undefined,\n //\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n options?: fromAbi.Options,\n): fromAbi.ReturnType {\n const { args = [], prepare = true } = (options ??\n {}) as unknown as fromAbi.Options\n\n const isSelector = Hex.validate(name, { strict: false })\n const abiItems = (abi as Abi.Abi).filter((abiItem) => {\n if (isSelector) {\n if (abiItem.type === 'function' || abiItem.type === 'error')\n return getSelector(abiItem) === Hex.slice(name, 0, 4)\n if (abiItem.type === 'event') return getSignatureHash(abiItem) === name\n return false\n }\n return 'name' in abiItem && abiItem.name === name\n })\n\n if (abiItems.length === 0) throw new NotFoundError({ name: name as string })\n if (abiItems.length === 1)\n return {\n ...abiItems[0],\n ...(prepare ? { hash: getSignatureHash(abiItems[0]!) } : {}),\n } as never\n\n let matchedAbiItem: AbiItem | undefined\n for (const abiItem of abiItems) {\n if (!('inputs' in abiItem)) continue\n if (!args || args.length === 0) {\n if (!abiItem.inputs || abiItem.inputs.length === 0)\n return {\n ...abiItem,\n ...(prepare ? { hash: getSignatureHash(abiItem) } : {}),\n } as never\n continue\n }\n if (!abiItem.inputs) continue\n if (abiItem.inputs.length === 0) continue\n if (abiItem.inputs.length !== args.length) continue\n const matched = args.every((arg, index) => {\n const abiParameter = 'inputs' in abiItem && abiItem.inputs![index]\n if (!abiParameter) return false\n return internal.isArgOfType(arg, abiParameter)\n })\n if (matched) {\n // Check for ambiguity against already matched parameters (e.g. `address` vs `bytes20`).\n if (\n matchedAbiItem &&\n 'inputs' in matchedAbiItem &&\n matchedAbiItem.inputs\n ) {\n const ambiguousTypes = internal.getAmbiguousTypes(\n abiItem.inputs,\n matchedAbiItem.inputs,\n args as readonly unknown[],\n )\n if (ambiguousTypes)\n throw new AmbiguityError(\n {\n abiItem,\n type: ambiguousTypes[0]!,\n },\n {\n abiItem: matchedAbiItem,\n type: ambiguousTypes[1]!,\n },\n )\n }\n\n matchedAbiItem = abiItem\n }\n }\n\n const abiItem = (() => {\n if (matchedAbiItem) return matchedAbiItem\n const [abiItem, ...overloads] = abiItems\n return { ...abiItem!, overloads }\n })()\n\n if (!abiItem) throw new NotFoundError({ name: name as string })\n return {\n ...abiItem,\n ...(prepare ? { hash: getSignatureHash(abiItem) } : {}),\n } as never\n}\n\nexport declare namespace fromAbi {\n type Options<\n abi extends Abi.Abi | readonly unknown[] = Abi.Abi,\n name extends Name = Name,\n args extends\n | internal.ExtractArgs\n | undefined = internal.ExtractArgs,\n ///\n allArgs = internal.ExtractArgs,\n > = {\n /**\n * Whether or not to prepare the extracted item (optimization for encoding performance).\n * When `true`, the `hash` property is computed and included in the returned value.\n *\n * @default true\n */\n prepare?: boolean | undefined\n } & UnionCompute<\n readonly [] extends allArgs\n ? {\n args?:\n | allArgs // show all options\n // infer value, widen inferred value of `args` conditionally to match `allArgs`\n | (abi extends Abi.Abi\n ? args extends allArgs\n ? internal.Widen\n : never\n : never)\n | undefined\n }\n : {\n args?:\n | allArgs // show all options\n | (internal.Widen & (args extends allArgs ? unknown : never)) // infer value, widen inferred value of `args` match `allArgs` (e.g. avoid union `args: readonly [123n] | readonly [bigint]`)\n | undefined\n }\n >\n\n type ReturnType<\n abi extends Abi.Abi | readonly unknown[] = Abi.Abi,\n name extends Name = Name,\n args extends\n | internal.ExtractArgs\n | undefined = internal.ExtractArgs,\n fallback = AbiItem,\n > = abi extends Abi.Abi\n ? Abi.Abi extends abi\n ? fallback\n : internal.ExtractForArgs<\n abi,\n name,\n args extends internal.ExtractArgs\n ? args\n : internal.ExtractArgs\n >\n : fallback\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Computes the [4-byte selector](https://solidity-by-example.org/function-selector/) for an {@link ox#AbiItem.AbiItem}.\n *\n * Useful for computing function selectors for calldata.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const selector = AbiItem.getSelector('function ownerOf(uint256 tokenId)')\n * // @log: '0x6352211e'\n * ```\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiItem } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const selector = AbiItem.getSelector(erc20Abi, 'ownerOf')\n * // @log: '0x6352211e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const selector = AbiItem.getSelector({\n * inputs: [{ type: 'uint256' }],\n * name: 'ownerOf',\n * outputs: [],\n * stateMutability: 'view',\n * type: 'function'\n * })\n * // @log: '0x6352211e'\n * ```\n *\n * @param abiItem - The ABI item to compute the selector for. Can be a signature or an ABI item for an error, event, function, etc.\n * @returns The first 4 bytes of the {@link ox#Hash.(keccak256:function)} hash of the function signature.\n */\nexport function getSelector<\n abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n>(abi: abi | Abi.Abi | readonly unknown[], name: name): Hex.Hex\nexport function getSelector(abiItem: string | AbiItem): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function getSelector(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: string]\n | [string | AbiItem]\n): Hex.Hex {\n const abiItem = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name] = parameters as [Abi.Abi | readonly unknown[], string]\n return fromAbi(abi, name)\n }\n return parameters[0] as string | AbiItem\n })()\n return Hex.slice(getSignatureHash(abiItem), 0, 4)\n}\n\nexport declare namespace getSelector {\n type ErrorType =\n | getSignatureHash.ErrorType\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes the stringified signature for a given {@link ox#AbiItem.AbiItem}.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const signature = AbiItem.getSignature('function ownerOf(uint256 tokenId)')\n * // @log: 'ownerOf(uint256)'\n * ```\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiItem } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const signature = AbiItem.getSignature(erc20Abi, 'ownerOf')\n * // @log: 'ownerOf(uint256)'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const signature = AbiItem.getSignature({\n * name: 'ownerOf',\n * type: 'function',\n * inputs: [{ name: 'tokenId', type: 'uint256' }],\n * outputs: [],\n * stateMutability: 'view',\n * })\n * // @log: 'ownerOf(uint256)'\n * ```\n *\n * @param abiItem - The ABI Item to compute the signature for.\n * @returns The stringified signature of the ABI Item.\n */\nexport function getSignature<\n abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n>(abi: abi | Abi.Abi | readonly unknown[], name: name): string\nexport function getSignature(abiItem: string | AbiItem): string\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function getSignature(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: string]\n | [string | AbiItem]\n): string {\n const abiItem = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name] = parameters as [Abi.Abi | readonly unknown[], string]\n return fromAbi(abi, name)\n }\n return parameters[0] as string | AbiItem\n })()\n const signature = (() => {\n if (typeof abiItem === 'string') return abiItem\n return abitype.formatAbiItem(abiItem)\n })()\n return internal.normalizeSignature(signature)\n}\n\nexport declare namespace getSignature {\n type ErrorType =\n | internal.normalizeSignature.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes the signature hash for an {@link ox#AbiItem.AbiItem}.\n *\n * Useful for computing Event Topic values.\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const hash = AbiItem.getSignatureHash('event Transfer(address indexed from, address indexed to, uint256 amount)')\n * // @log: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n * ```\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiItem } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const hash = AbiItem.getSignatureHash(erc20Abi, 'Transfer')\n * // @log: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiItem } from 'ox'\n *\n * const hash = AbiItem.getSignatureHash({\n * name: 'Transfer',\n * type: 'event',\n * inputs: [\n * { name: 'from', type: 'address', indexed: true },\n * { name: 'to', type: 'address', indexed: true },\n * { name: 'amount', type: 'uint256', indexed: false },\n * ],\n * })\n * // @log: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'\n * ```\n *\n * @param abiItem - The ABI Item to compute the signature hash for.\n * @returns The {@link ox#Hash.(keccak256:function)} hash of the ABI item's signature.\n */\nexport function getSignatureHash<\n abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n>(abi: abi | Abi.Abi | readonly unknown[], name: name): Hex.Hex\nexport function getSignatureHash(abiItem: string | AbiItem): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function getSignatureHash(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: string]\n | [string | AbiItem]\n): Hex.Hex {\n const abiItem = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name] = parameters as [Abi.Abi | readonly unknown[], string]\n return fromAbi(abi, name)\n }\n return parameters[0] as string | AbiItem\n })()\n if (typeof abiItem !== 'string' && 'hash' in abiItem && abiItem.hash)\n return abiItem.hash as Hex.Hex\n return Hash.keccak256(Hex.fromString(getSignature(abiItem)))\n}\n\nexport declare namespace getSignatureHash {\n type ErrorType =\n | getSignature.ErrorType\n | Hash.keccak256.ErrorType\n | Hex.fromString.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Throws when ambiguous types are found on overloaded ABI items.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from(['function foo(address)', 'function foo(bytes20)'])\n * AbiFunction.fromAbi(foo, 'foo', {\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // @error: AbiItem.AmbiguityError: Found ambiguous types in overloaded ABI Items.\n * // @error: `bytes20` in `foo(bytes20)`, and\n * // @error: `address` in `foo(address)`\n * // @error: These types encode differently and cannot be distinguished at runtime.\n * // @error: Remove one of the ambiguous items in the ABI.\n * ```\n *\n * ### Solution\n *\n * Remove one of the ambiguous types from the ABI.\n *\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function foo(bytes20)' // [!code --]\n * ])\n * AbiFunction.fromAbi(foo, 'foo', {\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // @error: AbiItem.AmbiguityError: Found ambiguous types in overloaded ABI Items.\n * // @error: `bytes20` in `foo(bytes20)`, and\n * // @error: `address` in `foo(address)`\n * // @error: These types encode differently and cannot be distinguished at runtime.\n * // @error: Remove one of the ambiguous items in the ABI.\n * ```\n */\nexport class AmbiguityError extends Errors.BaseError {\n override readonly name = 'AbiItem.AmbiguityError'\n constructor(\n x: { abiItem: Abi.Abi[number]; type: string },\n y: { abiItem: Abi.Abi[number]; type: string },\n ) {\n super('Found ambiguous types in overloaded ABI Items.', {\n metaMessages: [\n // TODO: abitype to add support for signature-formatted ABI items.\n `\\`${x.type}\\` in \\`${internal.normalizeSignature(abitype.formatAbiItem(x.abiItem))}\\`, and`,\n `\\`${y.type}\\` in \\`${internal.normalizeSignature(abitype.formatAbiItem(y.abiItem))}\\``,\n '',\n 'These types encode differently and cannot be distinguished at runtime.',\n 'Remove one of the ambiguous items in the ABI.',\n ],\n })\n }\n}\n\n/**\n * Throws when an ABI item is not found in the ABI.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)'\n * ])\n * AbiFunction.fromAbi(foo, 'baz')\n * // @error: AbiItem.NotFoundError: ABI function with name \"baz\" not found.\n * ```\n *\n * ### Solution\n *\n * Ensure the ABI item exists on the ABI.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)',\n * 'function baz(bool)' // [!code ++]\n * ])\n * AbiFunction.fromAbi(foo, 'baz')\n * ```\n */\nexport class NotFoundError extends Errors.BaseError {\n override readonly name = 'AbiItem.NotFoundError'\n constructor({\n name,\n data,\n type = 'item',\n }: {\n name?: string | undefined\n data?: Hex.Hex | undefined\n type?: string | undefined\n }) {\n const selector = (() => {\n if (name) return ` with name \"${name}\"`\n if (data) return ` with data \"${data}\"`\n return ''\n })()\n super(`ABI ${type}${selector} not found.`)\n }\n}\n\n/**\n * Throws when the selector size is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)'\n * ])\n * AbiFunction.fromAbi(foo, '0xaaa')\n * // @error: AbiItem.InvalidSelectorSizeError: Selector size is invalid. Expected 4 bytes. Received 2 bytes (\"0xaaa\").\n * ```\n *\n * ### Solution\n *\n * Ensure the selector size is 4 bytes.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const foo = Abi.from([\n * 'function foo(address)',\n * 'function bar(uint)'\n * ])\n * AbiFunction.fromAbi(foo, '0x7af82b1a')\n * ```\n */\nexport class InvalidSelectorSizeError extends Errors.BaseError {\n override readonly name = 'AbiItem.InvalidSelectorSizeError'\n constructor({ data }: { data: Hex.Hex }) {\n super(\n `Selector size is invalid. Expected 4 bytes. Received ${Hex.size(data)} bytes (\"${data}\").`,\n )\n }\n}\n","import * as abitype from 'abitype'\nimport type * as Abi from './Abi.js'\nimport * as AbiItem from './AbiItem.js'\nimport * as AbiParameters from './AbiParameters.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type * as internal from './internal/abiConstructor.js'\nimport type { IsNarrowable } from './internal/types.js'\n\n/** Root type for an {@link ox#AbiItem.AbiItem} with a `constructor` type. */\nexport type AbiConstructor = abitype.AbiConstructor\n\n/**\n * ABI-decodes the provided constructor input (`inputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from('constructor(address, uint256)')\n *\n * const bytecode = '0x...'\n *\n * const data = AbiConstructor.encode(constructor, {\n * bytecode,\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n *\n * const decoded = AbiConstructor.decode(constructor, { // [!code focus]\n * bytecode, // [!code focus]\n * data, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object as a parameter to `AbiConstructor.decode`.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiConstructor } from 'ox'\n *\n * const abi = Abi.from([...])\n *\n * const data = AbiConstructor.encode(abi, {\n * bytecode: '0x...',\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n *\n * const decoded = AbiConstructor.decode(abi, { // [!code focus]\n * bytecode: '0x...', // [!code focus]\n * data, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param abiConstructor - The ABI Constructor to decode.\n * @param options - Decoding options.\n * @returns The decoded constructor inputs.\n */\nexport function decode<\n const abi extends Abi.Abi | readonly unknown[],\n abiConstructor extends\n AbiConstructor = fromAbi.ReturnType extends AbiConstructor\n ? fromAbi.ReturnType\n : never,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n options: decode.Options,\n): decode.ReturnType\nexport function decode(\n abiConstructor: abiConstructor | AbiConstructor,\n options: decode.Options,\n): decode.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decode(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], options: decode.Options]\n | [abiConstructor: AbiConstructor, options: decode.Options]\n): decode.ReturnType {\n const [abiConstructor, options] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, options] = parameters as [\n Abi.Abi | readonly unknown[],\n decode.Options,\n ]\n return [fromAbi(abi), options] as [AbiConstructor, decode.Options]\n }\n return parameters as [AbiConstructor, decode.Options]\n })()\n\n const { bytecode } = options\n if (abiConstructor.inputs?.length === 0) return undefined\n const data = options.data.replace(bytecode, '0x') as Hex.Hex\n return AbiParameters.decode(abiConstructor.inputs, data)\n}\n\nexport declare namespace decode {\n interface Options {\n /** The bytecode of the contract. */\n bytecode: Hex.Hex\n /** The encoded constructor. */\n data: Hex.Hex\n }\n\n type ReturnType =\n | (abiConstructor['inputs']['length'] extends 0\n ? undefined\n : abitype.AbiParametersToPrimitiveTypes)\n | (IsNarrowable extends true\n ? never\n : undefined)\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * ABI-encodes the provided constructor input (`inputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from('constructor(address, uint256)')\n *\n * const data = AbiConstructor.encode(constructor, {\n * bytecode: '0x...',\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object as a parameter to `AbiConstructor.encode`.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiConstructor } from 'ox'\n *\n * const abi = Abi.from([...])\n *\n * const data = AbiConstructor.encode(abi, { // [!code focus]\n * bytecode: '0x...', // [!code focus]\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n], // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @example\n * ### End-to-end\n *\n * Below is an end-to-end example of using `AbiConstructor.encode` to encode the constructor of a contract and deploy it.\n *\n * ```ts twoslash\n * import 'ox/window'\n * import { AbiConstructor, Hex } from 'ox'\n *\n * // 1. Instantiate the ABI Constructor.\n * const constructor = AbiConstructor.from(\n * 'constructor(address owner, uint256 amount)',\n * )\n *\n * // 2. Encode the ABI Constructor.\n * const data = AbiConstructor.encode(constructor, {\n * bytecode: '0x...',\n * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n],\n * })\n *\n * // 3. Deploy the contract.\n * const hash = await window.ethereum!.request({\n * method: 'eth_sendTransaction',\n * params: [{ data }],\n * })\n * ```\n *\n * :::note\n *\n * For simplicity, the above example uses `window.ethereum.request`, but you can use any\n * type of JSON-RPC interface.\n *\n * :::\n *\n * @param abiConstructor - The ABI Constructor to encode.\n * @param options - Encoding options.\n * @returns The encoded constructor.\n */\nexport function encode<\n const abi extends Abi.Abi | readonly unknown[],\n abiConstructor extends\n AbiConstructor = fromAbi.ReturnType extends AbiConstructor\n ? fromAbi.ReturnType\n : never,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n options: encode.Options,\n): encode.ReturnType\nexport function encode(\n abiConstructor: abiConstructor | AbiConstructor,\n options: encode.Options,\n): encode.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function encode(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], options: encode.Options]\n | [abiConstructor: AbiConstructor, options: encode.Options]\n): encode.ReturnType {\n const [abiConstructor, options] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, options] = parameters as [\n Abi.Abi | readonly unknown[],\n encode.Options,\n ]\n return [fromAbi(abi), options] as [AbiConstructor, encode.Options]\n }\n\n return parameters as [AbiConstructor, encode.Options]\n })()\n\n const { bytecode, args } = options\n return Hex.concat(\n bytecode,\n abiConstructor.inputs?.length && args?.length\n ? AbiParameters.encode(abiConstructor.inputs, args as readonly unknown[])\n : '0x',\n )\n}\n\nexport declare namespace encode {\n type Options<\n abiConstructor extends AbiConstructor = AbiConstructor,\n ///\n args extends abitype.AbiParametersToPrimitiveTypes<\n abiConstructor['inputs']\n > = abitype.AbiParametersToPrimitiveTypes,\n > = {\n /** The bytecode of the contract. */\n bytecode: Hex.Hex\n /** The constructor arguments to encode. */\n args?: args | undefined\n } & (readonly [] extends args\n ? {}\n : {\n /** The constructor arguments to encode. */\n args: args\n })\n\n type ReturnType = Hex.Hex\n\n type ErrorType =\n | Hex.concat.ErrorType\n | AbiParameters.encode.ErrorType\n | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function format(\n abiConstructor: abiConstructor,\n): format.ReturnType\n/**\n * Formats an {@link ox#AbiConstructor.AbiConstructor} into a **Human Readable ABI Function**.\n *\n * @example\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const formatted = AbiConstructor.format({\n * inputs: [\n * { name: 'owner', type: 'address' },\n * ],\n * payable: false,\n * stateMutability: 'nonpayable',\n * type: 'constructor',\n * })\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param abiConstructor - The ABI Constructor to format.\n * @returns The formatted ABI Constructor.\n */\nexport function format(abiConstructor: AbiConstructor): string\n/** @internal */\nexport function format(abiConstructor: AbiConstructor): format.ReturnType {\n return abitype.formatAbiItem(abiConstructor)\n}\n\nexport declare namespace format {\n type ReturnType =\n abitype.FormatAbiItem\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function from<\n const abiConstructor extends AbiConstructor | string | readonly string[],\n>(\n abiConstructor: (abiConstructor | string | readonly string[]) &\n (\n | (abiConstructor extends string\n ? internal.Signature\n : never)\n | (abiConstructor extends readonly string[]\n ? internal.Signatures\n : never)\n | AbiConstructor\n ),\n): from.ReturnType\n/**\n * Parses an arbitrary **JSON ABI Constructor** or **Human Readable ABI Constructor** into a typed {@link ox#AbiConstructor.AbiConstructor}.\n *\n * @example\n * ### JSON ABIs\n *\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from({\n * inputs: [\n * { name: 'owner', type: 'address' },\n * ],\n * payable: false,\n * stateMutability: 'nonpayable',\n * type: 'constructor',\n * })\n *\n * constructor\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable ABIs\n *\n * A Human Readable ABI can be parsed into a typed ABI object:\n *\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from(\n * 'constructor(address owner)' // [!code hl]\n * )\n *\n * constructor\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiConstructor } from 'ox'\n *\n * const constructor = AbiConstructor.from([\n * 'struct Foo { address owner; uint256 amount; }', // [!code hl]\n * 'constructor(Foo foo)',\n * ])\n *\n * constructor\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param abiConstructor - The ABI Constructor to parse.\n * @returns Typed ABI Constructor.\n */\nexport function from(\n abiConstructor: AbiConstructor | string | readonly string[],\n): AbiConstructor\n/** @internal */\nexport function from(\n abiConstructor: AbiConstructor | string | readonly string[],\n): from.ReturnType {\n return AbiItem.from(abiConstructor as AbiConstructor)\n}\n\nexport declare namespace from {\n type ReturnType<\n abiConstructor extends\n | AbiConstructor\n | string\n | readonly string[] = AbiConstructor,\n > = AbiItem.from.ReturnType\n\n type ErrorType = AbiItem.from.ErrorType | Errors.GlobalErrorType\n}\n\n/** @internal */\nexport function fromAbi(\n abi: abi | Abi.Abi | readonly unknown[],\n): fromAbi.ReturnType\n/**\n * Extracts an {@link ox#AbiConstructor.AbiConstructor} from an {@link ox#Abi.Abi} given a name and optional arguments.\n *\n * @example\n * ### Extracting by Name\n *\n * ABI Events can be extracted by their name using the `name` option:\n *\n * ```ts twoslash\n * import { Abi, AbiConstructor } from 'ox'\n *\n * const abi = Abi.from([\n * 'constructor(address owner)',\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n *\n * const item = AbiConstructor.fromAbi(abi) // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @returns The ABI constructor.\n */\nexport function fromAbi(abi: Abi.Abi | readonly unknown[]): AbiConstructor\n/** @internal */\nexport function fromAbi(abi: Abi.Abi | readonly unknown[]): fromAbi.ReturnType {\n const item = (abi as Abi.Abi).find((item) => item.type === 'constructor')\n if (!item) throw new AbiItem.NotFoundError({ name: 'constructor' })\n return item\n}\n\nexport declare namespace fromAbi {\n type ReturnType = Extract<\n abi[number],\n { type: 'constructor' }\n >\n\n type ErrorType = AbiItem.NotFoundError | Errors.GlobalErrorType\n}\n","import * as abitype from 'abitype'\nimport type * as Abi from './Abi.js'\nimport * as AbiItem from './AbiItem.js'\nimport * as AbiParameters from './AbiParameters.js'\nimport type * as Errors from './Errors.js'\nimport * as Hex from './Hex.js'\nimport type * as internal from './internal/abiFunction.js'\nimport type * as AbiItem_internal from './internal/abiItem.js'\nimport type * as AbiParameters_internal from './internal/abiParameters.js'\nimport type { IsNarrowable } from './internal/types.js'\n\n/** Root type for an {@link ox#AbiItem.AbiItem} with a `function` type. */\nexport type AbiFunction = abitype.AbiFunction & {\n hash?: Hex.Hex | undefined\n overloads?: readonly AbiFunction[] | undefined\n}\n\n/**\n * Extracts an {@link ox#AbiFunction.AbiFunction} item from an {@link ox#Abi.Abi}, given a name.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo(string)',\n * 'function bar(uint256)',\n * ])\n *\n * type Foo = AbiFunction.FromAbi\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n */\nexport type FromAbi<\n abi extends Abi.Abi,\n name extends ExtractNames,\n> = abitype.ExtractAbiFunction\n\n/**\n * Extracts the names of all {@link ox#AbiFunction.AbiFunction} items in an {@link ox#Abi.Abi}.\n *\n * @example\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo(string)',\n * 'function bar(uint256)',\n * ])\n *\n * type names = AbiFunction.Name\n * // ^?\n *\n *\n * ```\n */\nexport type Name =\n abi extends Abi.Abi ? ExtractNames : string\n\nexport type ExtractNames<\n abi extends Abi.Abi,\n abiStateMutability extends\n abitype.AbiStateMutability = abitype.AbiStateMutability,\n> = abitype.ExtractAbiFunctionNames\n\n/**\n * ABI-decodes function arguments according to the ABI Item's input types (`inputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from('function approve(address, uint256)')\n *\n * const data = AbiFunction.encodeData(\n * approve,\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * )\n * // '0x095ea7b3000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000010f2c'\n *\n * const input = AbiFunction.decodeData(approve, data) // [!code focus]\n * // @log: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(decodeData:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([...])\n * const data = '0x...\n *\n * const input = AbiFunction.decodeData(\n * abi, // [!code focus]\n * 'approve', // [!code focus]\n * data\n * )\n * // @log: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * ```\n *\n * @param abiFunction - The ABI Item to decode.\n * @param data - The data to decode.\n */\nexport function decodeData<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n data: Hex.Hex,\n): decodeData.ReturnType\nexport function decodeData(\n abiFunction: abiItem | AbiFunction,\n data: Hex.Hex,\n): decodeData.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decodeData(\n ...parameters:\n | [abi: Abi.Abi | readonly unknown[], name: Hex.Hex | string, data: Hex.Hex]\n | [abiFunction: AbiFunction, data: Hex.Hex]\n) {\n const [abiFunction, data] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, data] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n Hex.Hex,\n ]\n return [fromAbi(abi, name), data]\n }\n return parameters as [AbiFunction, Hex.Hex]\n })()\n\n const { overloads } = abiFunction\n\n if (Hex.size(data) < 4) throw new AbiItem.InvalidSelectorSizeError({ data })\n if (abiFunction.inputs?.length === 0) return undefined\n\n const item = overloads\n ? fromAbi([abiFunction, ...overloads], data as never)\n : abiFunction\n\n if (Hex.size(data) <= 4) return undefined\n return AbiParameters.decode(item.inputs, Hex.slice(data, 4))\n}\n\nexport declare namespace decodeData {\n type ReturnType = IsNarrowable<\n abiFunction,\n AbiFunction\n > extends true\n ? abiFunction['inputs'] extends readonly []\n ? undefined\n :\n | AbiParameters_internal.ToPrimitiveTypes\n | (abiFunction['overloads'] extends readonly AbiFunction[]\n ? AbiParameters_internal.ToPrimitiveTypes<\n abiFunction['overloads'][number]['inputs']\n >\n : never)\n : unknown\n\n type ErrorType =\n | fromAbi.ErrorType\n | AbiParameters.decode.ErrorType\n | Hex.size.ErrorType\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * ABI-decodes a function's result according to the ABI Item's output types (`outputs`).\n *\n * :::tip\n *\n * This function is typically used to decode contract function return values (e.g. the response of an `eth_call` or the `input` property of a Transaction).\n *\n * See the [End-to-end Example](#end-to-end).\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const data = '0x000000000000000000000000000000000000000000000000000000000000002a'\n *\n * const totalSupply = AbiFunction.from('function totalSupply() returns (uint256)')\n *\n * const output = AbiFunction.decodeResult(totalSupply, data)\n * // @log: 42n\n * ```\n *\n * @example\n * You can extract an ABI Function from a JSON ABI with {@link ox#AbiFunction.(fromAbi:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const data = '0x000000000000000000000000000000000000000000000000000000000000002a'\n *\n * const erc20Abi = Abi.from([...]) // [!code hl]\n * const totalSupply = AbiFunction.fromAbi(erc20Abi, 'totalSupply') // [!code hl]\n *\n * const output = AbiFunction.decodeResult(totalSupply, data)\n * // @log: 42n\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(decodeResult:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const data = '0x000000000000000000000000000000000000000000000000000000000000002a'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const output = AbiFunction.decodeResult(\n * erc20Abi, // [!code focus]\n * 'totalSupply', // [!code focus]\n * data\n * )\n * // @log: 42n\n * ```\n *\n * @example\n * ### End-to-end\n *\n * Below is an end-to-end example of using `AbiFunction.decodeResult` to decode the result of a `balanceOf` contract call on the [Wagmi Mint Example contract](https://etherscan.io/address/0xfba3912ca04dd458c843e2ee08967fc04f3579c2).\n *\n * ```ts twoslash\n * import 'ox/window'\n * import { Abi, AbiFunction } from 'ox'\n *\n * // 1. Extract the Function from the Contract's ABI.\n * const abi = Abi.from([\n * // ...\n * {\n * name: 'balanceOf',\n * type: 'function',\n * inputs: [{ name: 'account', type: 'address' }],\n * outputs: [{ name: 'balance', type: 'uint256' }],\n * stateMutability: 'view',\n * },\n * // ...\n * ])\n * const balanceOf = AbiFunction.fromAbi(abi, 'balanceOf')\n *\n * // 2. Encode the Function Input.\n * const data = AbiFunction.encodeData(\n * balanceOf,\n * ['0xd2135CfB216b74109775236E36d4b433F1DF507B']\n * )\n *\n * // 3. Perform the Contract Call.\n * const response = await window.ethereum!.request({\n * method: 'eth_call',\n * params: [\n * {\n * data,\n * to: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * },\n * ],\n * })\n *\n * // 4. Decode the Function Output. // [!code focus]\n * const balance = AbiFunction.decodeResult(balanceOf, response) // [!code focus]\n * // @log: 42n\n * ```\n *\n * :::note\n *\n * For simplicity, the above example uses `window.ethereum.request`, but you can use any\n * type of JSON-RPC interface.\n *\n * :::\n *\n * @param abiFunction - ABI Function to decode\n * @param data - ABI-encoded function output\n * @param options - Decoding options\n * @returns Decoded function output\n */\nexport function decodeResult<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n as extends 'Object' | 'Array' = 'Array',\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n): decodeResult.ReturnType\nexport function decodeResult<\n const abiFunction extends AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n>(\n abiFunction: abiFunction | AbiFunction,\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n): decodeResult.ReturnType\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function decodeResult(\n ...parameters:\n | [\n abi: Abi.Abi | readonly unknown[],\n name: Hex.Hex | string,\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n ]\n | [\n abiFunction: AbiFunction,\n data: Hex.Hex,\n options?: decodeResult.Options | undefined,\n ]\n) {\n const [abiFunction, data, options = {}] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, data, options] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n Hex.Hex,\n decodeResult.Options | undefined,\n ]\n return [fromAbi(abi, name), data, options]\n }\n return parameters as [\n AbiFunction,\n Hex.Hex,\n decodeResult.Options | undefined,\n ]\n })()\n\n const values = AbiParameters.decode(abiFunction.outputs, data, options)\n if (values && Object.keys(values).length === 0) return undefined\n if (values && Object.keys(values).length === 1) {\n if (Array.isArray(values)) return values[0]\n return Object.values(values)[0]\n }\n return values\n}\n\nexport declare namespace decodeResult {\n type Options = {\n /**\n * Whether the decoded values should be returned as an `Object` or `Array`.\n *\n * @default \"Array\"\n */\n as?: as | 'Array' | 'Object' | undefined\n }\n\n type ReturnType<\n abiFunction extends AbiFunction = AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n > = IsNarrowable extends true\n ? abiFunction['outputs'] extends readonly []\n ? undefined\n : abiFunction['outputs'] extends readonly [\n infer type extends abitype.AbiParameter,\n ]\n ? abitype.AbiParameterToPrimitiveType\n : AbiParameters.decode.ReturnType<\n abiFunction['outputs'],\n as\n > extends infer types\n ? types extends readonly []\n ? undefined\n : types extends readonly [infer type]\n ? type\n : types\n : never\n : unknown\n\n type ErrorType = AbiParameters.decode.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * ABI-encodes function arguments (`inputs`), prefixed with the 4 byte function selector.\n *\n * :::tip\n *\n * This function is typically used to encode a contract function and its arguments for contract calls (e.g. `data` parameter of an `eth_call` or `eth_sendTransaction`).\n *\n * See the [End-to-end Example](#end-to-end).\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from('function approve(address, uint256)')\n *\n * const data = AbiFunction.encodeData( // [!code focus]\n * approve, // [!code focus]\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n] // [!code focus]\n * ) // [!code focus]\n * // @log: '0x095ea7b3000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000010f2c'\n * ```\n *\n * @example\n * You can extract an ABI Function from a JSON ABI with {@link ox#AbiFunction.(fromAbi:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const erc20Abi = Abi.from([...]) // [!code hl]\n * const approve = AbiFunction.fromAbi(erc20Abi, 'approve') // [!code hl]\n *\n * const data = AbiFunction.encodeData(\n * approve,\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * )\n * // @log: '0x095ea7b3000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000010f2c'\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(encodeData:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const erc20Abi = Abi.from([...])\n *\n * const data = AbiFunction.encodeData(\n * erc20Abi, // [!code focus]\n * 'approve', // [!code focus]\n * ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 69420n]\n * )\n * ```\n *\n * @example\n * ### End-to-end\n *\n * Below is an end-to-end example of using `AbiFunction.encodeData` to encode the input of a `balanceOf` contract call on the [Wagmi Mint Example contract](https://etherscan.io/address/0xfba3912ca04dd458c843e2ee08967fc04f3579c2).\n *\n * ```ts twoslash\n * import 'ox/window'\n * import { Abi, AbiFunction } from 'ox'\n *\n * // 1. Extract the Function from the Contract's ABI.\n * const abi = Abi.from([\n * // ...\n * {\n * name: 'balanceOf',\n * type: 'function',\n * inputs: [{ name: 'account', type: 'address' }],\n * outputs: [{ name: 'balance', type: 'uint256' }],\n * stateMutability: 'view',\n * },\n * // ...\n * ])\n * const balanceOf = AbiFunction.fromAbi(abi, 'balanceOf')\n *\n * // 2. Encode the Function Input. // [!code focus]\n * const data = AbiFunction.encodeData( // [!code focus]\n * balanceOf, // [!code focus]\n * ['0xd2135CfB216b74109775236E36d4b433F1DF507B'] // [!code focus]\n * ) // [!code focus]\n *\n * // 3. Perform the Contract Call.\n * const response = await window.ethereum!.request({\n * method: 'eth_call',\n * params: [\n * {\n * data,\n * to: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * },\n * ],\n * })\n *\n * // 4. Decode the Function Output.\n * const balance = AbiFunction.decodeResult(balanceOf, response)\n * ```\n *\n * :::note\n *\n * For simplicity, the above example uses `window.ethereum.request`, but you can use any\n * type of JSON-RPC interface.\n *\n * :::\n *\n * @param abiFunction - ABI Function to encode\n * @param args - Function arguments\n * @returns ABI-encoded function name and arguments\n */\nexport function encodeData<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n ...args: encodeData.Args\n): Hex.Hex\nexport function encodeData(\n abiFunction: abiFunction | AbiFunction,\n ...args: encodeData.Args\n): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function encodeData(\n ...parameters:\n | [\n abi: Abi.Abi | readonly unknown[],\n name: Hex.Hex | string,\n ...args: readonly unknown[],\n ]\n | [abiFunction: AbiFunction, ...args: readonly unknown[]]\n) {\n const [abiFunction, args = []] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, args] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n readonly unknown[],\n ]\n return [fromAbi(abi, name, { args }), args]\n }\n const [abiFunction, args] = parameters as [AbiFunction, readonly unknown[]]\n return [abiFunction, args]\n })()\n\n const { overloads } = abiFunction\n\n const item = overloads\n ? (fromAbi([abiFunction as AbiFunction, ...overloads], abiFunction.name, {\n args,\n }) as AbiFunction)\n : abiFunction\n\n const selector = getSelector(item)\n\n const data =\n args.length > 0 ? AbiParameters.encode(item.inputs, args) : undefined\n\n return data ? Hex.concat(selector, data) : selector\n}\n\nexport declare namespace encodeData {\n type Args = IsNarrowable<\n abiFunction,\n AbiFunction\n > extends true\n ?\n | (abitype.AbiParametersToPrimitiveTypes<\n abiFunction['inputs']\n > extends readonly []\n ? []\n : [abitype.AbiParametersToPrimitiveTypes])\n | (abiFunction['overloads'] extends readonly AbiFunction[]\n ? [\n abitype.AbiParametersToPrimitiveTypes<\n abiFunction['overloads'][number]['inputs']\n >,\n ]\n : [])\n : readonly unknown[]\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * ABI-encodes a function's result (`outputs`).\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const totalSupply = AbiFunction.from('function totalSupply() returns (uint256)')\n * const output = AbiFunction.decodeResult(totalSupply, '0x000000000000000000000000000000000000000000000000000000000000002a')\n * // 42n\n *\n * const data = AbiFunction.encodeResult(totalSupply, 42n) // [!code focus]\n * // @log: '0x000000000000000000000000000000000000000000000000000000000000002a'\n * ```\n *\n * @example\n * ### ABI-shorthand\n *\n * You can also specify an entire ABI object and a function name as parameters to {@link ox#AbiFunction.(encodeResult:function)}:\n *\n * ```ts twoslash\n * // @noErrors\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([...])\n *\n * const data = AbiFunction.encodeResult(\n * abi, // [!code focus]\n * 'totalSupply', // [!code focus]\n * 42n\n * )\n * // @log: '0x000000000000000000000000000000000000000000000000000000000000002a'\n * ```\n *\n * @param abiFunction - The ABI item to encode the function output for.\n * @param output - The function output to encode.\n * @param options - Encoding options.\n * @returns The encoded function output.\n */\nexport function encodeResult<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n as extends 'Object' | 'Array' = 'Array',\n //\n abiFunction extends AbiFunction = AbiItem.fromAbi.ReturnType<\n abi,\n name,\n args,\n AbiFunction\n >,\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n output: encodeResult.Output,\n options?: encodeResult.Options,\n): Hex.Hex\nexport function encodeResult<\n const abiFunction extends AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n>(\n abiFunction: abiFunction | AbiFunction,\n output: encodeResult.Output,\n options?: encodeResult.Options,\n): Hex.Hex\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport function encodeResult(\n ...parameters:\n | [\n abi: Abi.Abi | readonly unknown[],\n name: Hex.Hex | string,\n output: any,\n options?: encodeResult.Options | undefined,\n ]\n | [\n abiFunction: AbiFunction,\n output: any,\n options?: encodeResult.Options | undefined,\n ]\n) {\n const [abiFunction, output, options = {}] = (() => {\n if (Array.isArray(parameters[0])) {\n const [abi, name, output, options] = parameters as [\n Abi.Abi | readonly unknown[],\n Hex.Hex | string,\n any,\n encodeResult.Options | undefined,\n ]\n return [fromAbi(abi, name), output, options]\n }\n return parameters as [\n AbiFunction,\n any,\n encodeResult.Options | undefined,\n ]\n })()\n\n const { as = 'Array' } = options\n\n const values = (() => {\n if (abiFunction.outputs.length === 1) return [output]\n if (Array.isArray(output)) return output\n if (as === 'Object') return Object.values(output as any)\n return [output]\n })()\n\n return AbiParameters.encode(abiFunction.outputs, values)\n}\n\nexport declare namespace encodeResult {\n type Output<\n abiFunction extends AbiFunction = AbiFunction,\n as extends 'Object' | 'Array' = 'Array',\n > = abiFunction['outputs'] extends readonly []\n ? never\n : abiFunction['outputs']['length'] extends 1\n ? AbiParameters_internal.ToPrimitiveTypes[0]\n : as extends 'Object'\n ? AbiParameters_internal.ToObject\n : AbiParameters_internal.ToPrimitiveTypes\n\n type Options = {\n as?: as | 'Object' | 'Array' | undefined\n }\n\n type ErrorType = AbiParameters.encode.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Formats an {@link ox#AbiFunction.AbiFunction} into a **Human Readable ABI Function**.\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const formatted = AbiFunction.format({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * formatted\n * // ^?\n *\n *\n * ```\n *\n * @param abiFunction - The ABI Function to format.\n * @returns The formatted ABI Function.\n */\nexport function format(\n abiFunction: abiFunction | AbiFunction,\n): abitype.FormatAbiItem {\n return abitype.formatAbiItem(abiFunction) as never\n}\n\nexport declare namespace format {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses an arbitrary **JSON ABI Function** or **Human Readable ABI Function** into a typed {@link ox#AbiFunction.AbiFunction}.\n *\n * @example\n * ### JSON ABIs\n *\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from({\n * type: 'function',\n * name: 'approve',\n * stateMutability: 'nonpayable',\n * inputs: [\n * {\n * name: 'spender',\n * type: 'address',\n * },\n * {\n * name: 'amount',\n * type: 'uint256',\n * },\n * ],\n * outputs: [{ type: 'bool' }],\n * })\n *\n * approve\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Human Readable ABIs\n *\n * A Human Readable ABI can be parsed into a typed ABI object:\n *\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from(\n * 'function approve(address spender, uint256 amount) returns (bool)' // [!code hl]\n * )\n *\n * approve\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * It is possible to specify `struct`s along with your definitions:\n *\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const approve = AbiFunction.from([\n * 'struct Foo { address spender; uint256 amount; }', // [!code hl]\n * 'function approve(Foo foo) returns (bool)',\n * ])\n *\n * approve\n * //^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n *\n *\n * @param abiFunction - The ABI Function to parse.\n * @returns Typed ABI Function.\n */\nexport function from<\n const abiFunction extends AbiFunction | string | readonly string[],\n>(\n abiFunction: (abiFunction | AbiFunction | string | readonly string[]) &\n (\n | (abiFunction extends string ? internal.Signature : never)\n | (abiFunction extends readonly string[]\n ? internal.Signatures\n : never)\n | AbiFunction\n ),\n options: from.Options = {},\n): from.ReturnType {\n return AbiItem.from(abiFunction as AbiFunction, options) as never\n}\n\nexport declare namespace from {\n type Options = {\n /**\n * Whether or not to prepare the extracted function (optimization for encoding performance).\n * When `true`, the `hash` property is computed and included in the returned value.\n *\n * @default true\n */\n prepare?: boolean | undefined\n }\n\n type ReturnType<\n abiFunction extends AbiFunction | string | readonly string[],\n > = AbiItem.from.ReturnType\n\n type ErrorType = AbiItem.from.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Extracts an {@link ox#AbiFunction.AbiFunction} from an {@link ox#Abi.Abi} given a name and optional arguments.\n *\n * @example\n * ### Extracting by Name\n *\n * ABI Functions can be extracted by their name using the `name` option:\n *\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n *\n * const item = AbiFunction.fromAbi(abi, 'foo') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n * ```\n *\n * @example\n * ### Extracting by Selector\n *\n * ABI Functions can be extract by their selector when {@link ox#Hex.Hex} is provided to `name`.\n *\n * ```ts twoslash\n * import { Abi, AbiFunction } from 'ox'\n *\n * const abi = Abi.from([\n * 'function foo()',\n * 'event Transfer(address owner, address to, uint256 tokenId)',\n * 'function bar(string a) returns (uint256 x)',\n * ])\n * const item = AbiFunction.fromAbi(abi, '0x095ea7b3') // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * :::note\n *\n * Extracting via a hex selector is useful when extracting an ABI Function from an `eth_call` RPC response or\n * from a Transaction `input`.\n *\n * :::\n *\n * @param abi - The ABI to extract from.\n * @param name - The name (or selector) of the ABI item to extract.\n * @param options - Extraction options.\n * @returns The ABI item.\n */\nexport function fromAbi<\n const abi extends Abi.Abi | readonly unknown[],\n name extends Name,\n const args extends\n | AbiItem_internal.ExtractArgs\n | undefined = undefined,\n //\n allNames = Name,\n>(\n abi: abi | Abi.Abi | readonly unknown[],\n name: Hex.Hex | (name extends allNames ? name : never),\n options?: AbiItem.fromAbi.Options<\n abi,\n name,\n args,\n AbiItem_internal.ExtractArgs\n >,\n): AbiItem.fromAbi.ReturnType {\n const item = AbiItem.fromAbi(abi, name, options as any)\n if (item.type !== 'function')\n throw new AbiItem.NotFoundError({ name, type: 'function' })\n return item as never\n}\n\nexport declare namespace fromAbi {\n type ErrorType = AbiItem.fromAbi.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Computes the [4-byte selector](https://solidity-by-example.org/function-selector/) for an {@link ox#AbiFunction.AbiFunction}.\n *\n * Useful for computing function selectors for calldata.\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const selector = AbiFunction.getSelector('function ownerOf(uint256 tokenId)')\n * // @log: '0x6352211e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { AbiFunction } from 'ox'\n *\n * const selector = AbiFunction.getSelector({\n * inputs: [{ type: 'uint256' }],\n * name: 'ownerOf',\n * outputs: [],\n * stateMutability: 'view',\n * type: 'function'\n * })\n * // @log: '0x6352211e'\n * ```\n *\n * @param abiItem - The ABI item to compute the selector for.\n * @returns The first 4 bytes of the {@link ox#Hash.(keccak256:function)} hash of the function signature.\n */\nexport function getSelector(abiItem: string | AbiFunction): Hex.Hex {\n return AbiItem.getSelector(abiItem)\n}\n\nexport declare namespace getSelector {\n type ErrorType = AbiItem.getSelector.ErrorType | Errors.GlobalErrorType\n}\n","export const ethAddress = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const\n\nexport const zeroAddress = '0x0000000000000000000000000000000000000000' as const\n","import type { AbiStateMutability, Address, Narrow } from 'abitype'\nimport * as AbiConstructor from 'ox/AbiConstructor'\nimport * as AbiFunction from 'ox/AbiFunction'\n\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { ethAddress, zeroAddress } from '../../constants/address.js'\nimport { deploylessCallViaBytecodeBytecode } from '../../constants/contracts.js'\nimport { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type { Call, Calls } from '../../types/calls.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { MulticallResults } from '../../types/multicall.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { Mutable } from '../../types/utils.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport { hexToBigInt } from '../../utils/index.js'\nimport {\n type CreateAccessListErrorType,\n createAccessList,\n} from './createAccessList.js'\nimport {\n type SimulateBlocksErrorType,\n type SimulateBlocksParameters,\n simulateBlocks,\n} from './simulateBlocks.js'\n\nconst getBalanceCode =\n '0x6080604052348015600e575f80fd5b5061016d8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063f8b2cb4f1461002d575b5f80fd5b610047600480360381019061004291906100db565b61005d565b604051610054919061011e565b60405180910390f35b5f8173ffffffffffffffffffffffffffffffffffffffff16319050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100aa82610081565b9050919050565b6100ba816100a0565b81146100c4575f80fd5b50565b5f813590506100d5816100b1565b92915050565b5f602082840312156100f0576100ef61007d565b5b5f6100fd848285016100c7565b91505092915050565b5f819050919050565b61011881610106565b82525050565b5f6020820190506101315f83018461010f565b9291505056fea26469706673582212203b9fe929fe995c7cf9887f0bdba8a36dd78e8b73f149b17d2d9ad7cd09d2dc6264736f6c634300081a0033'\n\nexport type SimulateCallsParameters<\n calls extends readonly unknown[] = readonly unknown[],\n account extends Account | Address | undefined = Account | Address | undefined,\n> = Omit & {\n /** Account attached to the calls (msg.sender). */\n account?: account | undefined\n /** Calls to simulate. */\n calls: Calls>\n /** State overrides. */\n stateOverrides?: StateOverride | undefined\n /** Whether to trace asset changes. */\n traceAssetChanges?: boolean | undefined\n}\n\nexport type SimulateCallsReturnType<\n calls extends readonly unknown[] = readonly unknown[],\n> = {\n /** Asset changes. */\n assetChanges: readonly {\n token: {\n address: Address\n decimals?: number | undefined\n symbol?: string | undefined\n }\n value: { pre: bigint; post: bigint; diff: bigint }\n }[]\n /** Block results. */\n block: Block\n /** Call results. */\n results: MulticallResults<\n Narrow,\n true,\n {\n extraProperties: {\n data: Hex\n gasUsed: bigint\n logs?: Log[] | undefined\n }\n error: Error\n mutability: AbiStateMutability\n }\n >\n}\n\nexport type SimulateCallsErrorType =\n | AbiFunction.encodeData.ErrorType\n | AbiFunction.from.ErrorType\n | CreateAccessListErrorType\n | EncodeFunctionDataErrorType\n | SimulateBlocksErrorType\n | ErrorType\n\n/**\n * Simulates execution of a batch of calls.\n *\n * @param client - Client to use\n * @param parameters - {@link SimulateCallsParameters}\n * @returns Results. {@link SimulateCallsReturnType}\n *\n * @example\n * ```ts\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { simulateCalls } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await simulateCalls(client, {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * calls: [{\n * {\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * ]\n * })\n * ```\n */\nexport async function simulateCalls<\n const calls extends readonly unknown[],\n chain extends Chain | undefined,\n account extends Account | Address | undefined = undefined,\n>(\n client: Client,\n parameters: SimulateCallsParameters,\n): Promise> {\n const {\n blockNumber,\n blockTag,\n calls,\n stateOverrides,\n traceAssetChanges,\n traceTransfers,\n validation,\n } = parameters\n\n const account = parameters.account\n ? parseAccount(parameters.account)\n : undefined\n\n if (traceAssetChanges && !account)\n throw new BaseError(\n '`account` is required when `traceAssetChanges` is true',\n )\n\n // Derive bytecode to extract ETH balance via a contract call.\n const getBalanceData = account\n ? AbiConstructor.encode(AbiConstructor.from('constructor(bytes, bytes)'), {\n bytecode: deploylessCallViaBytecodeBytecode,\n args: [\n getBalanceCode,\n AbiFunction.encodeData(\n AbiFunction.from('function getBalance(address)'),\n [account.address],\n ),\n ],\n })\n : undefined\n\n // Fetch ERC20/721 addresses that were \"touched\" from the calls.\n const assetAddresses = traceAssetChanges\n ? await Promise.all(\n parameters.calls.map(async (call: any) => {\n if (!call.data && !call.abi) return\n const { accessList } = await createAccessList(client, {\n account: account!.address,\n ...call,\n data: call.abi ? encodeFunctionData(call) : call.data,\n })\n return accessList.map(({ address, storageKeys }) =>\n storageKeys.length > 0 ? address : null,\n )\n }),\n ).then((x) => x.flat().filter(Boolean))\n : []\n\n const blocks = await simulateBlocks(client, {\n blockNumber,\n blockTag: blockTag as undefined,\n blocks: [\n ...(traceAssetChanges\n ? [\n // ETH pre balances\n {\n calls: [{ data: getBalanceData }],\n stateOverrides,\n },\n\n // Asset pre balances\n {\n calls: assetAddresses.map((address, i) => ({\n abi: [\n AbiFunction.from(\n 'function balanceOf(address) returns (uint256)',\n ),\n ],\n functionName: 'balanceOf',\n args: [account!.address],\n to: address,\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n ]\n : []),\n\n {\n calls: [...calls, { to: zeroAddress }].map((call) => ({\n ...(call as Call),\n from: account?.address,\n })) as any,\n stateOverrides,\n },\n\n ...(traceAssetChanges\n ? [\n // ETH post balances\n {\n calls: [{ data: getBalanceData }],\n },\n\n // Asset post balances\n {\n calls: assetAddresses.map((address, i) => ({\n abi: [\n AbiFunction.from(\n 'function balanceOf(address) returns (uint256)',\n ),\n ],\n functionName: 'balanceOf',\n args: [account!.address],\n to: address,\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n\n // Decimals\n {\n calls: assetAddresses.map((address, i) => ({\n to: address,\n abi: [\n AbiFunction.from('function decimals() returns (uint256)'),\n ],\n functionName: 'decimals',\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n\n // Token URI\n {\n calls: assetAddresses.map((address, i) => ({\n to: address,\n abi: [\n AbiFunction.from(\n 'function tokenURI(uint256) returns (string)',\n ),\n ],\n functionName: 'tokenURI',\n args: [0n],\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n\n // Symbols\n {\n calls: assetAddresses.map((address, i) => ({\n to: address,\n abi: [AbiFunction.from('function symbol() returns (string)')],\n functionName: 'symbol',\n from: zeroAddress,\n nonce: i,\n })),\n stateOverrides: [\n {\n address: zeroAddress,\n nonce: 0,\n },\n ],\n },\n ]\n : []),\n ],\n traceTransfers,\n validation,\n })\n\n const block_results = traceAssetChanges ? blocks[2] : blocks[0]\n const [\n block_ethPre,\n block_assetsPre,\n ,\n block_ethPost,\n block_assetsPost,\n block_decimals,\n block_tokenURI,\n block_symbols,\n ] = traceAssetChanges ? blocks : []\n\n // Extract call results from the simulation.\n const { calls: block_calls, ...block } = block_results\n const results = block_calls.slice(0, -1) ?? []\n\n // Extract pre-execution ETH and asset balances.\n const ethPre = block_ethPre?.calls ?? []\n const assetsPre = block_assetsPre?.calls ?? []\n const balancesPre = [...ethPre, ...assetsPre].map((call) =>\n call.status === 'success' ? hexToBigInt(call.data) : null,\n )\n\n // Extract post-execution ETH and asset balances.\n const ethPost = block_ethPost?.calls ?? []\n const assetsPost = block_assetsPost?.calls ?? []\n const balancesPost = [...ethPost, ...assetsPost].map((call) =>\n call.status === 'success' ? hexToBigInt(call.data) : null,\n )\n\n // Extract asset symbols & decimals.\n const decimals = (block_decimals?.calls ?? []).map((x) =>\n x.status === 'success' ? x.result : null,\n ) as (number | null)[]\n const symbols = (block_symbols?.calls ?? []).map((x) =>\n x.status === 'success' ? x.result : null,\n ) as (string | null)[]\n const tokenURI = (block_tokenURI?.calls ?? []).map((x) =>\n x.status === 'success' ? x.result : null,\n ) as (string | null)[]\n\n const changes: Mutable['assetChanges']> = []\n for (const [i, balancePost] of balancesPost.entries()) {\n const balancePre = balancesPre[i]\n\n if (typeof balancePost !== 'bigint') continue\n if (typeof balancePre !== 'bigint') continue\n\n const decimals_ = decimals[i - 1]\n const symbol_ = symbols[i - 1]\n const tokenURI_ = tokenURI[i - 1]\n\n const token = (() => {\n if (i === 0)\n return {\n address: ethAddress,\n decimals: 18,\n symbol: 'ETH',\n }\n\n return {\n address: assetAddresses[i - 1]! as Address,\n decimals: tokenURI_ || decimals_ ? Number(decimals_ ?? 1) : undefined,\n symbol: symbol_ ?? undefined,\n }\n })()\n\n if (changes.some((change) => change.token.address === token.address))\n continue\n\n changes.push({\n token,\n value: {\n pre: balancePre,\n post: balancePost,\n diff: balancePost - balancePre,\n },\n })\n }\n\n return {\n assetChanges: changes,\n block,\n results,\n } as unknown as SimulateCallsReturnType\n}\n","import type * as Abi from '../core/Abi.js'\nimport * as AbiParameters from '../core/AbiParameters.js'\nimport type * as Address from '../core/Address.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport type * as Signature from '../core/Signature.js'\n\n/** Unwrapped ERC-6492 signature. */\nexport type Unwrapped = {\n /** Calldata to pass to the target address for counterfactual verification. */\n data: Hex.Hex\n /** The original signature. */\n signature: Hex.Hex\n /** The target address to use for counterfactual verification. */\n to: Address.Address\n}\n\n/** Wrapped ERC-6492 signature. */\nexport type Wrapped = Hex.Hex\n\n/**\n * Magic bytes used to identify ERC-6492 wrapped signatures.\n */\nexport const magicBytes =\n '0x6492649264926492649264926492649264926492649264926492649264926492' as const\n\n/**\n * Deployless ERC-6492 signature verification bytecode.\n */\nexport const universalSignatureValidatorBytecode =\n '0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572'\n\n/**\n * ABI for the ERC-6492 universal deployless signature validator contract.\n *\n * Constructor return value is `0x1` (valid) or `0x0` (invalid).\n */\nexport const universalSignatureValidatorAbi = [\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n name: 'isValidSig',\n },\n] as const satisfies Abi.Abi\n\n/**\n * Asserts that the wrapped signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * SignatureErc6492.assert('0xdeadbeef')\n * // @error: InvalidWrappedSignatureError: Value `0xdeadbeef` is an invalid ERC-6492 wrapped signature.\n * ```\n *\n * @param wrapped - The wrapped signature to assert.\n */\nexport function assert(wrapped: Wrapped) {\n if (Hex.slice(wrapped, -32) !== magicBytes)\n throw new InvalidWrappedSignatureError(wrapped)\n}\n\nexport declare namespace assert {\n type ErrorType =\n | InvalidWrappedSignatureError\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { SignatureErc6492 } from 'ox/erc6492' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * // Instantiate from serialized format. // [!code focus]\n * const wrapped = SignatureErc6492.from('0x...') // [!code focus]\n * // @log: { data: '0x...', signature: { ... }, to: '0x...', } // [!code focus]\n *\n * // Instantiate from constituent parts. // [!code focus]\n * const wrapped = SignatureErc6492.from({ // [!code focus]\n * data: '0x...', // [!code focus]\n * signature, // [!code focus]\n * to: '0x...', // [!code focus]\n * })\n * // @log: { data: '0x...', signature: { ... }, to: '0x...', }\n * ```\n *\n * @param wrapped - Wrapped signature to parse.\n * @returns Wrapped signature.\n */\nexport function from(wrapped: Unwrapped | Wrapped): Unwrapped {\n if (typeof wrapped === 'string') return unwrap(wrapped)\n return wrapped\n}\n\nexport declare namespace from {\n type ReturnType = Unwrapped\n\n type ErrorType =\n | AbiParameters.from.ErrorType\n | AbiParameters.decode.ErrorType\n | Signature.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * const { data, signature, to } = SignatureErc6492.unwrap('0x...')\n * ```\n *\n * @param wrapped - Wrapped signature to parse.\n * @returns Wrapped signature.\n */\nexport function unwrap(wrapped: Wrapped): Unwrapped {\n assert(wrapped)\n\n const [to, data, signature] = AbiParameters.decode(\n AbiParameters.from('address, bytes, bytes'),\n wrapped,\n )\n\n return { data, signature, to }\n}\n\nexport declare namespace unwrap {\n type ErrorType =\n | AbiParameters.from.ErrorType\n | AbiParameters.decode.ErrorType\n | Signature.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification).\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1, Signature } from 'ox'\n * import { SignatureErc6492 } from 'ox/erc6492' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc6492.wrap({ // [!code focus]\n * data: '0xdeadbeef', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * to: '0x00000000219ab540356cBB839Cbe05303d7705Fa', // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param value - Wrapped signature to serialize.\n * @returns Serialized wrapped signature.\n */\nexport function wrap(value: Unwrapped): Wrapped {\n const { data, signature, to } = value\n\n return Hex.concat(\n AbiParameters.encode(AbiParameters.from('address, bytes, bytes'), [\n to,\n data,\n signature,\n ]),\n magicBytes,\n )\n}\n\nexport declare namespace wrap {\n type ErrorType =\n | AbiParameters.encode.ErrorType\n | Hex.concat.ErrorType\n | Signature.toHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Validates a wrapped signature. Returns `true` if the wrapped signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * const valid = SignatureErc6492.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param wrapped - The wrapped signature to validate.\n * @returns `true` if the wrapped signature is valid, `false` otherwise.\n */\nexport function validate(wrapped: Wrapped): boolean {\n try {\n assert(wrapped)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** Thrown when the ERC-6492 wrapped signature is invalid. */\nexport class InvalidWrappedSignatureError extends Errors.BaseError {\n override readonly name = 'SignatureErc6492.InvalidWrappedSignatureError'\n\n constructor(wrapped: Wrapped) {\n super(`Value \\`${wrapped}\\` is an invalid ERC-6492 wrapped signature.`)\n }\n}\n","/** @entrypointCategory ERCs */\n// biome-ignore lint/complexity/noUselessEmptyExport: tsdoc\nexport type {}\n\n/**\n * Utility functions for working with [ERC-6492 wrapped signatures](https://eips.ethereum.org/EIPS/eip-6492#specification).\n *\n * @example\n * ```ts twoslash\n * import { PersonalMessage, Secp256k1, Signature } from 'ox'\n * import { SignatureErc6492 } from 'ox/erc6492' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: PersonalMessage.getSignPayload('0xdeadbeef'),\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc6492.wrap({ // [!code focus]\n * data: '0xcafebabe', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * to: '0xcafebabecafebabecafebabecafebabecafebabe', // [!code focus]\n * }) // [!code focus]\n * // @log: '0x000000000000000000000000cafebabecafebabecafebabecafebabecafebabe000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000004deadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041fa78c5905fb0b9d6066ef531f962a62bc6ef0d5eb59ecb134056d206f75aaed7780926ff2601a935c2c79707d9e1799948c9f19dcdde1e090e903b19a07923d01c000000000000000000000000000000000000000000000000000000000000006492649264926492649264926492649264926492649264926492649264926492'\n * ```\n *\n * @category ERC-6492\n */\nexport * as SignatureErc6492 from './SignatureErc6492.js'\n","import { secp256k1 } from '@noble/curves/secp256k1'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type HexToBigIntErrorType, hexToBigInt } from '../encoding/fromHex.js'\nimport { hexToBytes } from '../encoding/toBytes.js'\nimport type { ToHexErrorType } from '../encoding/toHex.js'\n\ntype To = 'bytes' | 'hex'\n\nexport type SerializeSignatureParameters = Signature & {\n to?: to | To | undefined\n}\n\nexport type SerializeSignatureReturnType =\n | (to extends 'hex' ? Hex : never)\n | (to extends 'bytes' ? ByteArray : never)\n\nexport type SerializeSignatureErrorType =\n | HexToBigIntErrorType\n | ToHexErrorType\n | ErrorType\n\n/**\n * @description Converts a signature into hex format.\n *\n * @param signature The signature to convert.\n * @returns The signature in hex format.\n *\n * @example\n * serializeSignature({\n * r: '0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf',\n * s: '0x4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db8',\n * yParity: 1\n * })\n * // \"0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c\"\n */\nexport function serializeSignature({\n r,\n s,\n to = 'hex',\n v,\n yParity,\n}: SerializeSignatureParameters): SerializeSignatureReturnType {\n const yParity_ = (() => {\n if (yParity === 0 || yParity === 1) return yParity\n if (v && (v === 27n || v === 28n || v >= 35n)) return v % 2n === 0n ? 1 : 0\n throw new Error('Invalid `v` or `yParity` value')\n })()\n const signature = `0x${new secp256k1.Signature(\n hexToBigInt(r),\n hexToBigInt(s),\n ).toCompactHex()}${yParity_ === 0 ? '1b' : '1c'}` as const\n\n if (to === 'hex') return signature as SerializeSignatureReturnType\n return hexToBytes(signature) as SerializeSignatureReturnType\n}\n","import type { Address } from 'abitype'\nimport { SignatureErc6492 } from 'ox/erc6492'\nimport { SignatureErc8010 } from 'ox/erc8010'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n erc1271Abi,\n erc6492SignatureValidatorAbi,\n multicall3Abi,\n} from '../../constants/abis.js'\nimport {\n erc6492SignatureValidatorByteCode,\n multicall3Bytecode,\n} from '../../constants/contracts.js'\nimport {\n CallExecutionError,\n ContractFunctionExecutionError,\n} from '../../errors/contract.js'\nimport type { InvalidHexBooleanError } from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type EncodeDeployDataErrorType,\n encodeDeployData,\n} from '../../utils/abi/encodeDeployData.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetAddressErrorType,\n getAddress,\n} from '../../utils/address/getAddress.js'\nimport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from '../../utils/address/isAddressEqual.js'\nimport { verifyAuthorization } from '../../utils/authorization/verifyAuthorization.js'\nimport { type ConcatHexErrorType, concatHex } from '../../utils/data/concat.js'\nimport { type IsHexErrorType, isHex } from '../../utils/data/isHex.js'\nimport { hexToBool } from '../../utils/encoding/fromHex.js'\nimport {\n type BytesToHexErrorType,\n bytesToHex,\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type RecoverAddressErrorType,\n recoverAddress,\n} from '../../utils/signature/recoverAddress.js'\nimport {\n type SerializeSignatureErrorType,\n serializeSignature,\n} from '../../utils/signature/serializeSignature.js'\nimport { type CallErrorType, type CallParameters, call } from './call.js'\nimport { type GetCodeErrorType, getCode } from './getCode.js'\nimport { type ReadContractErrorType, readContract } from './readContract.js'\n\nexport type VerifyHashParameters = Pick<\n CallParameters,\n 'blockNumber' | 'blockTag'\n> & {\n /** The address that signed the original message. */\n address: Address\n /** The chain to use. */\n chain?: Chain | null | undefined\n /** The address of the ERC-6492 signature verifier contract. */\n erc6492VerifierAddress?: Address | undefined\n /** The hash to be verified. */\n hash: Hex\n /** Multicall3 address for ERC-8010 verification. */\n multicallAddress?: Address | undefined\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex | ByteArray | Signature\n /** @deprecated use `erc6492VerifierAddress` instead. */\n universalSignatureVerifierAddress?: Address | undefined\n /** Chooses which verification path to try first before falling back. */\n mode?: 'auto' | 'eoa' | (string & {}) | undefined\n} & OneOf<{ factory: Address; factoryData: Hex } | {}>\n\nexport type VerifyHashReturnType = boolean\n\nexport type VerifyHashErrorType =\n | BytesToHexErrorType\n | CallErrorType\n | ConcatHexErrorType\n | EncodeDeployDataErrorType\n | EncodeFunctionDataErrorType\n | ErrorType\n | GetAddressErrorType\n | GetCodeErrorType\n | InvalidHexBooleanError\n | IsAddressEqualErrorType\n | IsHexErrorType\n | NumberToHexErrorType\n | ReadContractErrorType\n | RecoverAddressErrorType\n | SerializeSignatureErrorType\n\n/**\n * Verifies a message hash onchain using ERC-6492.\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifyHashParameters}\n * @returns Whether or not the signature is valid. {@link VerifyHashReturnType}\n */\nexport async function verifyHash(\n client: Client,\n parameters: VerifyHashParameters,\n): Promise {\n const {\n address,\n chain = client.chain,\n hash,\n erc6492VerifierAddress:\n verifierAddress = parameters.universalSignatureVerifierAddress ??\n chain?.contracts?.erc6492Verifier?.address,\n multicallAddress = parameters.multicallAddress ??\n chain?.contracts?.multicall3?.address,\n mode = 'auto',\n } = parameters\n\n if (chain?.verifyHash) return await chain.verifyHash(client, parameters)\n\n const signature = (() => {\n const signature = parameters.signature\n if (isHex(signature)) return signature\n if (typeof signature === 'object' && 'r' in signature && 's' in signature)\n return serializeSignature(signature)\n return bytesToHex(signature)\n })()\n try {\n if (mode === 'eoa') {\n try {\n const verified = isAddressEqual(\n getAddress(address),\n await recoverAddress({ hash, signature }),\n )\n if (verified) return true\n } catch {}\n }\n\n if (SignatureErc8010.validate(signature))\n return await verifyErc8010(client, {\n ...parameters,\n multicallAddress,\n signature,\n })\n return await verifyErc6492(client, {\n ...parameters,\n verifierAddress,\n signature,\n })\n } catch (error) {\n if (mode !== 'eoa') {\n // Fallback attempt to verify the signature via ECDSA recovery.\n try {\n const verified = isAddressEqual(\n getAddress(address),\n await recoverAddress({ hash, signature }),\n )\n if (verified) return true\n } catch {}\n }\n\n if (error instanceof VerificationError) {\n // if the execution fails, the signature was not valid and an internal method inside of the validator reverted\n // this can happen for many reasons, for example if signer can not be recovered from the signature\n // or if the signature has no valid format\n return false\n }\n\n throw error\n }\n}\n\n/** @internal */\nexport async function verifyErc8010(\n client: Client,\n parameters: verifyErc8010.Parameters,\n) {\n const { address, blockNumber, blockTag, hash, multicallAddress } = parameters\n\n const {\n authorization: authorization_ox,\n data: initData,\n signature,\n to,\n } = SignatureErc8010.unwrap(parameters.signature)\n\n // Check if already delegated\n const code = await getCode(client, {\n address,\n blockNumber,\n blockTag,\n } as never)\n\n // If already delegated, perform standard ERC-1271 verification.\n if (code === concatHex(['0xef0100', authorization_ox.address]))\n return await verifyErc1271(client, {\n address,\n blockNumber,\n blockTag,\n hash,\n signature,\n })\n\n const authorization = {\n address: authorization_ox.address,\n chainId: Number(authorization_ox.chainId),\n nonce: Number(authorization_ox.nonce),\n r: numberToHex(authorization_ox.r, { size: 32 }),\n s: numberToHex(authorization_ox.s, { size: 32 }),\n yParity: authorization_ox.yParity,\n } as const\n\n const valid = await verifyAuthorization({\n address,\n authorization,\n })\n if (!valid) throw new VerificationError()\n\n // Deployless verification.\n const results = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n ...(multicallAddress\n ? { address: multicallAddress }\n : { code: multicall3Bytecode }),\n authorizationList: [authorization],\n abi: multicall3Abi,\n blockNumber,\n blockTag: 'pending',\n functionName: 'aggregate3',\n args: [\n [\n ...(initData\n ? ([\n {\n allowFailure: true,\n target: to ?? address,\n callData: initData,\n },\n ] as const)\n : []),\n {\n allowFailure: true,\n target: address,\n callData: encodeFunctionData({\n abi: erc1271Abi,\n functionName: 'isValidSignature',\n args: [hash, signature],\n }),\n },\n ],\n ],\n })\n\n const data = results[results.length - 1]?.returnData\n\n if (data?.startsWith('0x1626ba7e')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc8010 {\n export type Parameters = Pick & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** Multicall3 address for ERC-8010 verification. */\n multicallAddress?: Address | undefined\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n }\n}\n\n/** @internal */\n// biome-ignore lint/correctness/noUnusedVariables: _\nasync function verifyErc6492(\n client: Client,\n parameters: verifyErc6492.Parameters,\n) {\n const {\n address,\n factory,\n factoryData,\n hash,\n signature,\n verifierAddress,\n ...rest\n } = parameters\n\n const wrappedSignature = await (async () => {\n // If no `factory` or `factoryData` is provided, it is assumed that the\n // address is not a Smart Account, or the Smart Account is already deployed.\n if (!factory && !factoryData) return signature\n\n // If the signature is already wrapped, return the signature.\n if (SignatureErc6492.validate(signature)) return signature\n\n // If the Smart Account is not deployed, wrap the signature with a 6492 wrapper\n // to perform counterfactual validation.\n return SignatureErc6492.wrap({\n data: factoryData!,\n signature,\n to: factory!,\n })\n })()\n\n const args = verifierAddress\n ? ({\n to: verifierAddress,\n data: encodeFunctionData({\n abi: erc6492SignatureValidatorAbi,\n functionName: 'isValidSig',\n args: [address, hash, wrappedSignature],\n }),\n ...rest,\n } as unknown as CallParameters)\n : ({\n data: encodeDeployData({\n abi: erc6492SignatureValidatorAbi,\n args: [address, hash, wrappedSignature],\n bytecode: erc6492SignatureValidatorByteCode,\n }),\n ...rest,\n } as unknown as CallParameters)\n\n const { data } = await getAction(\n client,\n call,\n 'call',\n )(args).catch((error) => {\n if (error instanceof CallExecutionError) throw new VerificationError()\n throw error\n })\n\n if (hexToBool(data ?? '0x0')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc6492 {\n export type Parameters = Pick & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n /** The address of the ERC-6492 signature verifier contract. */\n verifierAddress?: Address | undefined\n } & OneOf<{ factory: Address; factoryData: Hex } | {}>\n}\n\n/** @internal */\nexport async function verifyErc1271(\n client: Client,\n parameters: verifyErc1271.Parameters,\n) {\n const { address, blockNumber, blockTag, hash, signature } = parameters\n\n const result = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n address,\n abi: erc1271Abi,\n args: [hash, signature],\n blockNumber,\n blockTag,\n functionName: 'isValidSignature',\n }).catch((error) => {\n if (error instanceof ContractFunctionExecutionError)\n throw new VerificationError()\n throw error\n })\n\n if (result.startsWith('0x1626ba7e')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc1271 {\n export type Parameters = Pick & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n }\n}\n\nclass VerificationError extends Error {}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ByteArray,\n Hex,\n SignableMessage,\n Signature,\n} from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { HashMessageErrorType } from '../../utils/signature/hashMessage.js'\nimport { hashMessage } from '../../utils/signature/hashMessage.js'\nimport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n verifyHash,\n} from './verifyHash.js'\n\nexport type VerifyMessageParameters = Prettify<\n Omit & {\n /** The address that signed the original message. */\n address: Address\n /** The message to be verified. */\n message: SignableMessage\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex | ByteArray | Signature\n }\n>\n\nexport type VerifyMessageReturnType = boolean\n\nexport type VerifyMessageErrorType =\n | HashMessageErrorType\n | VerifyHashErrorType\n | ErrorType\n\n/**\n * Verify that a message was signed by the provided address.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyMessage}\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifyMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifyMessageReturnType}\n */\nexport async function verifyMessage(\n client: Client,\n {\n address,\n message,\n factory,\n factoryData,\n signature,\n ...callRequest\n }: VerifyMessageParameters,\n): Promise {\n const hash = hashMessage(message)\n return getAction(\n client,\n verifyHash,\n 'verifyHash',\n )({\n address,\n factory: factory!,\n factoryData: factoryData!,\n hash,\n signature,\n ...callRequest,\n })\n}\n","import type { Address, TypedData } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { TypedDataDefinition } from '../../types/typedData.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type HashTypedDataErrorType,\n hashTypedData,\n} from '../../utils/signature/hashTypedData.js'\nimport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n verifyHash,\n} from './verifyHash.js'\n\nexport type VerifyTypedDataParameters<\n typedData extends TypedData | Record = TypedData,\n primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n> = Omit &\n TypedDataDefinition & {\n /** The address to verify the typed data for. */\n address: Address\n /** The signature to verify */\n signature: Hex | ByteArray | Signature\n }\n\nexport type VerifyTypedDataReturnType = boolean\n\nexport type VerifyTypedDataErrorType =\n | HashTypedDataErrorType\n | VerifyHashErrorType\n | ErrorType\n\n/**\n * Verify that typed data was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyTypedData}\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifyTypedDataParameters}\n * @returns Whether or not the signature is valid. {@link VerifyTypedDataReturnType}\n */\nexport async function verifyTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n chain extends Chain | undefined,\n>(\n client: Client,\n parameters: VerifyTypedDataParameters,\n): Promise {\n const {\n address,\n factory,\n factoryData,\n signature,\n message,\n primaryType,\n types,\n domain,\n ...callRequest\n } = parameters as VerifyTypedDataParameters\n const hash = hashTypedData({ message, primaryType, types, domain })\n return getAction(\n client,\n verifyHash,\n 'verifyHash',\n )({\n address,\n factory: factory!,\n factoryData: factoryData!,\n hash,\n signature,\n ...callRequest,\n })\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { HasTransportType } from '../../types/transport.js'\nimport { hexToBigInt } from '../../utils/encoding/fromHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { observe } from '../../utils/observe.js'\nimport { type PollErrorType, poll } from '../../utils/poll.js'\nimport { stringify } from '../../utils/stringify.js'\n\nimport {\n type GetBlockNumberReturnType,\n getBlockNumber,\n} from './getBlockNumber.js'\n\nexport type OnBlockNumberParameter = GetBlockNumberReturnType\nexport type OnBlockNumberFn = (\n blockNumber: OnBlockNumberParameter,\n prevBlockNumber: OnBlockNumberParameter | undefined,\n) => void\n\nexport type WatchBlockNumberParameters<\n transport extends Transport = Transport,\n> = {\n /** The callback to call when a new block number is received. */\n onBlockNumber: OnBlockNumberFn\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n} & (\n | (HasTransportType extends true\n ? {\n emitMissed?: undefined\n emitOnBegin?: undefined\n /** Whether or not the WebSocket Transport should poll the JSON-RPC, rather than using `eth_subscribe`. */\n poll?: false | undefined\n pollingInterval?: undefined\n }\n : never)\n | {\n /** Whether or not to emit the missed block numbers to the callback. */\n emitMissed?: boolean | undefined\n /** Whether or not to emit the latest block number to the callback when the subscription opens. */\n emitOnBegin?: boolean | undefined\n poll?: true | undefined\n /** Polling frequency (in ms). Defaults to Client's pollingInterval config. */\n pollingInterval?: number | undefined\n }\n)\n\nexport type WatchBlockNumberReturnType = () => void\n\nexport type WatchBlockNumberErrorType = PollErrorType | ErrorType\n\n/**\n * Watches and returns incoming block numbers.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchBlockNumberParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, watchBlockNumber, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchBlockNumber(client, {\n * onBlockNumber: (blockNumber) => console.log(blockNumber),\n * })\n */\nexport function watchBlockNumber<\n chain extends Chain | undefined,\n transport extends Transport,\n>(\n client: Client,\n {\n emitOnBegin = false,\n emitMissed = false,\n onBlockNumber,\n onError,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n }: WatchBlockNumberParameters,\n): WatchBlockNumberReturnType {\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n\n let prevBlockNumber: GetBlockNumberReturnType | undefined\n\n const pollBlockNumber = () => {\n const observerId = stringify([\n 'watchBlockNumber',\n client.uid,\n emitOnBegin,\n emitMissed,\n pollingInterval,\n ])\n\n return observe(observerId, { onBlockNumber, onError }, (emit) =>\n poll(\n async () => {\n try {\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({ cacheTime: 0 })\n\n if (prevBlockNumber !== undefined) {\n // If the current block number is the same as the previous,\n // we can skip.\n if (blockNumber === prevBlockNumber) return\n\n // If we have missed out on some previous blocks, and the\n // `emitMissed` flag is truthy, let's emit those blocks.\n if (blockNumber - prevBlockNumber > 1 && emitMissed) {\n for (let i = prevBlockNumber + 1n; i < blockNumber; i++) {\n emit.onBlockNumber(i, prevBlockNumber)\n prevBlockNumber = i\n }\n }\n }\n\n // If the next block number is greater than the previous,\n // it is not in the past, and we can emit the new block number.\n if (\n prevBlockNumber === undefined ||\n blockNumber > prevBlockNumber\n ) {\n emit.onBlockNumber(blockNumber, prevBlockNumber)\n prevBlockNumber = blockNumber\n }\n } catch (err) {\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin,\n interval: pollingInterval,\n },\n ),\n )\n }\n\n const subscribeBlockNumber = () => {\n const observerId = stringify([\n 'watchBlockNumber',\n client.uid,\n emitOnBegin,\n emitMissed,\n ])\n\n return observe(observerId, { onBlockNumber, onError }, (emit) => {\n let active = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['newHeads'],\n onData(data: any) {\n if (!active) return\n const blockNumber = hexToBigInt(data.result?.number)\n emit.onBlockNumber(blockNumber, prevBlockNumber)\n prevBlockNumber = blockNumber\n },\n onError(error: Error) {\n emit.onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n })\n }\n\n return enablePolling ? pollBlockNumber() : subscribeBlockNumber()\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BlockNotFoundError } from '../../errors/block.js'\nimport {\n TransactionNotFoundError,\n TransactionReceiptNotFoundError,\n WaitForTransactionReceiptTimeoutError,\n type WaitForTransactionReceiptTimeoutErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { Transaction } from '../../types/transaction.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { withResolvers } from '../../utils/promise/withResolvers.js'\nimport {\n type WithRetryParameters,\n withRetry,\n} from '../../utils/promise/withRetry.js'\nimport { stringify } from '../../utils/stringify.js'\n\nimport { type GetBlockErrorType, getBlock } from './getBlock.js'\nimport {\n type GetTransactionErrorType,\n type GetTransactionReturnType,\n getTransaction,\n} from './getTransaction.js'\nimport {\n type GetTransactionReceiptErrorType,\n type GetTransactionReceiptReturnType,\n getTransactionReceipt,\n} from './getTransactionReceipt.js'\nimport {\n type WatchBlockNumberErrorType,\n watchBlockNumber,\n} from './watchBlockNumber.js'\n\nexport type ReplacementReason = 'cancelled' | 'replaced' | 'repriced'\nexport type ReplacementReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = {\n reason: ReplacementReason\n replacedTransaction: Transaction\n transaction: Transaction\n transactionReceipt: GetTransactionReceiptReturnType\n}\n\nexport type WaitForTransactionReceiptReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = GetTransactionReceiptReturnType\n\nexport type WaitForTransactionReceiptParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = {\n /**\n * Whether to check for transaction replacements.\n * @default true\n */\n checkReplacement?: boolean | undefined\n /**\n * The number of confirmations (blocks that have passed) to wait before resolving.\n * @default 1\n */\n confirmations?: number | undefined\n /** The hash of the transaction. */\n hash: Hash\n /** Optional callback to emit if the transaction has been replaced. */\n onReplaced?: ((response: ReplacementReturnType) => void) | undefined\n /**\n * Polling frequency (in ms). Defaults to the client's pollingInterval config.\n * @default client.pollingInterval\n */\n pollingInterval?: number | undefined\n /**\n * Number of times to retry if the transaction or block is not found.\n * @default 6 (exponential backoff)\n */\n retryCount?: WithRetryParameters['retryCount'] | undefined\n /**\n * Time to wait (in ms) between retries.\n * @default `({ count }) => ~~(1 << count) * 200` (exponential backoff)\n */\n retryDelay?: WithRetryParameters['delay'] | undefined\n /**\n * Optional timeout (in milliseconds) to wait before stopping polling.\n * @default 180_000\n */\n timeout?: number | undefined\n}\n\nexport type WaitForTransactionReceiptErrorType =\n | ObserveErrorType\n | GetBlockErrorType\n | GetTransactionErrorType\n | GetTransactionReceiptErrorType\n | WatchBlockNumberErrorType\n | WaitForTransactionReceiptTimeoutErrorType\n | ErrorType\n\n/**\n * Waits for the [Transaction](https://viem.sh/docs/glossary/terms#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt).\n *\n * - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_sending-transactions\n * - JSON-RPC Methods:\n * - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed.\n * - If a Transaction has been replaced:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions\n * - Checks if one of the Transactions is a replacement\n * - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt).\n *\n * The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions).\n *\n * Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce.\n *\n * There are 3 types of Transaction Replacement reasons:\n *\n * - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`)\n * - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`)\n * - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`)\n *\n * @param client - Client to use\n * @param parameters - {@link WaitForTransactionReceiptParameters}\n * @returns The transaction receipt. {@link WaitForTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, waitForTransactionReceipt, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await waitForTransactionReceipt(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function waitForTransactionReceipt<\n chain extends Chain | undefined,\n>(\n client: Client,\n parameters: WaitForTransactionReceiptParameters,\n): Promise> {\n const {\n checkReplacement = true,\n confirmations = 1,\n hash,\n onReplaced,\n retryCount = 6,\n retryDelay = ({ count }) => ~~(1 << count) * 200, // exponential backoff\n timeout = 180_000,\n } = parameters\n\n const observerId = stringify(['waitForTransactionReceipt', client.uid, hash])\n\n const pollingInterval = (() => {\n if (parameters.pollingInterval) return parameters.pollingInterval\n if (client.chain?.experimental_preconfirmationTime)\n return client.chain.experimental_preconfirmationTime\n return client.pollingInterval\n })()\n\n let transaction: GetTransactionReturnType | undefined\n let replacedTransaction: GetTransactionReturnType | undefined\n let receipt: GetTransactionReceiptReturnType | undefined\n let retrying = false\n\n let _unobserve: () => void\n let _unwatch: () => void\n\n const { promise, resolve, reject } =\n withResolvers>()\n\n const timer = timeout\n ? setTimeout(() => {\n _unwatch?.()\n _unobserve?.()\n reject(new WaitForTransactionReceiptTimeoutError({ hash }))\n }, timeout)\n : undefined\n\n _unobserve = observe(\n observerId,\n { onReplaced, resolve, reject },\n async (emit) => {\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({ hash }).catch(() => undefined)\n\n if (receipt && confirmations <= 1) {\n clearTimeout(timer)\n emit.resolve(receipt)\n _unobserve?.()\n return\n }\n\n _unwatch = getAction(\n client,\n watchBlockNumber,\n 'watchBlockNumber',\n )({\n emitMissed: true,\n emitOnBegin: true,\n poll: true,\n pollingInterval,\n async onBlockNumber(blockNumber_) {\n const done = (fn: () => void) => {\n clearTimeout(timer)\n _unwatch?.()\n fn()\n _unobserve?.()\n }\n\n let blockNumber = blockNumber_\n\n if (retrying) return\n\n try {\n // If we already have a valid receipt, let's check if we have enough\n // confirmations. If we do, then we can resolve.\n if (receipt) {\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n done(() => emit.resolve(receipt!))\n return\n }\n\n // Get the transaction to check if it's been replaced.\n // We need to retry as some RPC Providers may be slow to sync\n // up mined transactions.\n if (checkReplacement && !transaction) {\n retrying = true\n await withRetry(\n async () => {\n transaction = (await getAction(\n client,\n getTransaction,\n 'getTransaction',\n )({ hash })) as GetTransactionReturnType\n if (transaction.blockNumber)\n blockNumber = transaction.blockNumber\n },\n {\n delay: retryDelay,\n retryCount,\n },\n )\n retrying = false\n }\n\n // Get the receipt to check if it's been processed.\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({ hash })\n\n // Check if we have enough confirmations. If not, continue polling.\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n done(() => emit.resolve(receipt!))\n } catch (err) {\n // If the receipt is not found, the transaction will be pending.\n // We need to check if it has potentially been replaced.\n if (\n err instanceof TransactionNotFoundError ||\n err instanceof TransactionReceiptNotFoundError\n ) {\n if (!transaction) {\n retrying = false\n return\n }\n\n try {\n replacedTransaction = transaction\n\n // Let's retrieve the transactions from the current block.\n // We need to retry as some RPC Providers may be slow to sync\n // up mined blocks.\n retrying = true\n const block = await withRetry(\n () =>\n getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockNumber,\n includeTransactions: true,\n }),\n {\n delay: retryDelay,\n retryCount,\n shouldRetry: ({ error }) =>\n error instanceof BlockNotFoundError,\n },\n )\n retrying = false\n\n const replacementTransaction = (\n block.transactions as {} as Transaction[]\n ).find(\n ({ from, nonce }) =>\n from === replacedTransaction!.from &&\n nonce === replacedTransaction!.nonce,\n )\n\n // If we couldn't find a replacement transaction, continue polling.\n if (!replacementTransaction) return\n\n // If we found a replacement transaction, return it's receipt.\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({\n hash: replacementTransaction.hash,\n })\n\n // Check if we have enough confirmations. If not, continue polling.\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n let reason: ReplacementReason = 'replaced'\n if (\n replacementTransaction.to === replacedTransaction.to &&\n replacementTransaction.value === replacedTransaction.value &&\n replacementTransaction.input === replacedTransaction.input\n ) {\n reason = 'repriced'\n } else if (\n replacementTransaction.from === replacementTransaction.to &&\n replacementTransaction.value === 0n\n ) {\n reason = 'cancelled'\n }\n\n done(() => {\n emit.onReplaced?.({\n reason,\n replacedTransaction: replacedTransaction! as any,\n transaction: replacementTransaction,\n transactionReceipt: receipt!,\n })\n emit.resolve(receipt!)\n })\n } catch (err_) {\n done(() => emit.reject(err_))\n }\n } else {\n done(() => emit.reject(err))\n }\n }\n },\n })\n },\n )\n\n return promise\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { HasTransportType } from '../../types/transport.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { observe } from '../../utils/observe.js'\nimport { type PollErrorType, poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\n\nimport { type GetBlockReturnType, getBlock } from './getBlock.js'\n\nexport type OnBlockParameter<\n chain extends Chain | undefined = Chain,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = GetBlockReturnType\n\nexport type OnBlock<\n chain extends Chain | undefined = Chain,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = (\n block: OnBlockParameter,\n prevBlock: OnBlockParameter | undefined,\n) => void\n\nexport type WatchBlocksParameters<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = {\n /** The callback to call when a new block is received. */\n onBlock: OnBlock\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n} & (\n | (HasTransportType extends true\n ? {\n blockTag?: undefined\n emitMissed?: undefined\n emitOnBegin?: undefined\n includeTransactions?: undefined\n /** Whether or not the WebSocket Transport should poll the JSON-RPC, rather than using `eth_subscribe`. */\n poll?: false | undefined\n pollingInterval?: undefined\n }\n : never)\n | {\n /** The block tag. Defaults to \"latest\". */\n blockTag?: blockTag | BlockTag | undefined\n /** Whether or not to emit the missed blocks to the callback. */\n emitMissed?: boolean | undefined\n /** Whether or not to emit the block to the callback when the subscription opens. */\n emitOnBegin?: boolean | undefined\n /** Whether or not to include transaction data in the response. */\n includeTransactions?: includeTransactions | undefined\n poll?: true | undefined\n /** Polling frequency (in ms). Defaults to the client's pollingInterval config. */\n pollingInterval?: number | undefined\n }\n)\n\nexport type WatchBlocksReturnType = () => void\n\nexport type WatchBlocksErrorType =\n | StringifyErrorType\n | PollErrorType\n | ErrorType\n\n/**\n * Watches and returns information for incoming blocks.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlocks\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchBlocksParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlocksReturnType}\n *\n * @example\n * import { createPublicClient, watchBlocks, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchBlocks(client, {\n * onBlock: (block) => console.log(block),\n * })\n */\nexport function watchBlocks<\n transport extends Transport,\n chain extends Chain | undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client,\n {\n blockTag = client.experimental_blockTag ?? 'latest',\n emitMissed = false,\n emitOnBegin = false,\n onBlock,\n onError,\n includeTransactions: includeTransactions_,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n }: WatchBlocksParameters,\n): WatchBlocksReturnType {\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n const includeTransactions = includeTransactions_ ?? false\n\n let prevBlock:\n | GetBlockReturnType\n | undefined\n\n const pollBlocks = () => {\n const observerId = stringify([\n 'watchBlocks',\n client.uid,\n blockTag,\n emitMissed,\n emitOnBegin,\n includeTransactions,\n pollingInterval,\n ])\n\n return observe(observerId, { onBlock, onError }, (emit) =>\n poll(\n async () => {\n try {\n const block = await getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockTag,\n includeTransactions,\n })\n if (block.number !== null && prevBlock?.number != null) {\n // If the current block number is the same as the previous,\n // we can skip.\n if (block.number === prevBlock.number) return\n\n // If we have missed out on some previous blocks, and the\n // `emitMissed` flag is truthy, let's emit those blocks.\n if (block.number - prevBlock.number > 1 && emitMissed) {\n for (let i = prevBlock?.number + 1n; i < block.number; i++) {\n const block = (await getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockNumber: i,\n includeTransactions,\n })) as GetBlockReturnType\n emit.onBlock(block as any, prevBlock as any)\n prevBlock = block\n }\n }\n }\n\n if (\n // If no previous block exists, emit.\n prevBlock?.number == null ||\n // If the block tag is \"pending\" with no block number, emit.\n (blockTag === 'pending' && block?.number == null) ||\n // If the next block number is greater than the previous block number, emit.\n // We don't want to emit blocks in the past.\n (block.number !== null && block.number > prevBlock.number)\n ) {\n emit.onBlock(block as any, prevBlock as any)\n prevBlock = block as any\n }\n } catch (err) {\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin,\n interval: pollingInterval,\n },\n ),\n )\n }\n\n const subscribeBlocks = () => {\n let active = true\n let emitFetched = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n if (emitOnBegin) {\n getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockTag,\n includeTransactions,\n })\n .then((block) => {\n if (!active) return\n if (!emitFetched) return\n onBlock(block as any, undefined)\n emitFetched = false\n })\n .catch(onError)\n }\n\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['newHeads'],\n async onData(data: any) {\n if (!active) return\n const block = (await getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockNumber: data.result?.number,\n includeTransactions,\n }).catch(() => {})) as GetBlockReturnType\n if (!active) return\n onBlock(block as any, prevBlock as any)\n emitFetched = false\n prevBlock = block\n },\n onError(error: Error) {\n onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n }\n\n return enablePolling ? pollBlocks() : subscribeBlocks()\n}\n","import type { AbiEvent, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n} from '../../errors/abi.js'\nimport { InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { LogTopic } from '../../types/misc.js'\nimport type { GetPollOptions } from '../../types/transport.js'\nimport { decodeEventLog } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { formatLog } from '../../utils/formatters/log.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\nimport {\n type CreateEventFilterParameters,\n createEventFilter,\n} from './createEventFilter.js'\nimport { getBlockNumber } from './getBlockNumber.js'\nimport { getFilterChanges } from './getFilterChanges.js'\nimport { type GetLogsParameters, getLogs } from './getLogs.js'\nimport { uninstallFilter } from './uninstallFilter.js'\n\nexport type WatchEventOnLogsParameter<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n eventName extends string | undefined = MaybeAbiEventName,\n> = Log[]\nexport type WatchEventOnLogsFn<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n> = (\n logs: WatchEventOnLogsParameter,\n) => void\n\nexport type WatchEventParameters<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n //\n _eventName extends string | undefined = MaybeAbiEventName,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Block to start listening from. */\n fromBlock?: BlockNumber | undefined\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n /** The callback to call when new event logs are received. */\n onLogs: WatchEventOnLogsFn\n} & GetPollOptions &\n (\n | {\n event: abiEvent\n events?: undefined\n args?: MaybeExtractEventArgsFromAbi | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events?: abiEvents | undefined\n args?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events?: undefined\n args?: undefined\n strict?: undefined\n }\n )\n\nexport type WatchEventReturnType = () => void\n\nexport type WatchEventErrorType =\n | StringifyErrorType\n | ObserveErrorType\n | ErrorType\n\n/**\n * Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms#event-log).\n *\n * - Docs: https://viem.sh/docs/actions/public/watchEvent\n * - JSON-RPC Methods:\n * - **RPC Provider supports `eth_newFilter`:**\n * - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize).\n * - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges).\n * - **RPC Provider does not support `eth_newFilter`:**\n * - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval.\n *\n * This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent#onLogs).\n *\n * `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchEventParameters}\n * @returns A function that can be invoked to stop watching for new Event Logs. {@link WatchEventReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { watchEvent } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchEvent(client, {\n * onLogs: (logs) => console.log(logs),\n * })\n */\nexport function watchEvent<\n chain extends Chain | undefined,\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n _eventName extends string | undefined = undefined,\n>(\n client: Client,\n {\n address,\n args,\n batch = true,\n event,\n events,\n fromBlock,\n onError,\n onLogs,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n strict: strict_,\n }: WatchEventParameters,\n): WatchEventReturnType {\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (typeof fromBlock === 'bigint') return true\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n const strict = strict_ ?? false\n\n const pollEvent = () => {\n const observerId = stringify([\n 'watchEvent',\n address,\n args,\n batch,\n client.uid,\n event,\n pollingInterval,\n fromBlock,\n ])\n\n return observe(observerId, { onLogs, onError }, (emit) => {\n let previousBlockNumber: bigint\n if (fromBlock !== undefined) previousBlockNumber = fromBlock - 1n\n let filter: Filter<'event', abiEvents, _eventName, any>\n let initialized = false\n\n const unwatch = poll(\n async () => {\n if (!initialized) {\n try {\n filter = (await getAction(\n client,\n createEventFilter as any,\n 'createEventFilter',\n )({\n address,\n args,\n event: event!,\n events,\n strict,\n fromBlock,\n } as unknown as CreateEventFilterParameters)) as unknown as Filter<\n 'event',\n abiEvents,\n _eventName\n >\n } catch {}\n initialized = true\n return\n }\n\n try {\n let logs: Log[]\n if (filter) {\n logs = await getAction(\n client,\n getFilterChanges,\n 'getFilterChanges',\n )({ filter })\n } else {\n // If the filter doesn't exist, we will fall back to use `getLogs`.\n // The fall back exists because some RPC Providers do not support filters.\n\n // Fetch the block number to use for `getLogs`.\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({})\n\n // If the block number has changed, we will need to fetch the logs.\n // If the block number doesn't exist, we are yet to reach the first poll interval,\n // so do not emit any logs.\n if (previousBlockNumber && previousBlockNumber !== blockNumber) {\n logs = await getAction(\n client,\n getLogs,\n 'getLogs',\n )({\n address,\n args,\n event: event!,\n events,\n fromBlock: previousBlockNumber + 1n,\n toBlock: blockNumber,\n } as unknown as GetLogsParameters)\n } else {\n logs = []\n }\n previousBlockNumber = blockNumber\n }\n\n if (logs.length === 0) return\n if (batch) emit.onLogs(logs as any)\n else for (const log of logs) emit.onLogs([log] as any)\n } catch (err) {\n // If a filter has been set and gets uninstalled, providers will throw an InvalidInput error.\n // Reinitialize the filter when this occurs\n if (filter && err instanceof InvalidInputRpcError)\n initialized = false\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin: true,\n interval: pollingInterval,\n },\n )\n\n return async () => {\n if (filter)\n await getAction(\n client,\n uninstallFilter,\n 'uninstallFilter',\n )({ filter })\n unwatch()\n }\n })\n }\n\n const subscribeEvent = () => {\n let active = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const events_ = events ?? (event ? [event] : undefined)\n let topics: LogTopic[] = []\n if (events_) {\n const encoded = (events_ as AbiEvent[]).flatMap((event) =>\n encodeEventTopics({\n abi: [event],\n eventName: (event as AbiEvent).name,\n args,\n } as EncodeEventTopicsParameters),\n )\n // TODO: Clean up type casting\n topics = [encoded as LogTopic]\n if (event) topics = topics[0] as LogTopic[]\n }\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['logs', { address, topics }],\n onData(data: any) {\n if (!active) return\n const log = data.result\n try {\n const { eventName, args } = decodeEventLog({\n abi: events_ ?? [],\n data: log.data,\n topics: log.topics,\n strict,\n })\n const formatted = formatLog(log, { args, eventName })\n onLogs([formatted] as any)\n } catch (err) {\n let eventName: string | undefined\n let isUnnamed: boolean | undefined\n if (\n err instanceof DecodeLogDataMismatch ||\n err instanceof DecodeLogTopicsMismatch\n ) {\n // If strict mode is on, and log data/topics do not match event definition, skip.\n if (strict_) return\n eventName = err.abiItem.name\n isUnnamed = err.abiItem.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n }\n\n // Set args to empty if there is an error decoding (e.g. indexed/non-indexed params mismatch).\n const formatted = formatLog(log, {\n args: isUnnamed ? [] : {},\n eventName,\n })\n onLogs([formatted] as any)\n }\n },\n onError(error: Error) {\n onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n }\n\n return enablePolling ? pollEvent() : subscribeEvent()\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { GetPollOptions } from '../../types/transport.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\n\nimport { createPendingTransactionFilter } from './createPendingTransactionFilter.js'\nimport { getFilterChanges } from './getFilterChanges.js'\nimport { uninstallFilter } from './uninstallFilter.js'\n\nexport type OnTransactionsParameter = Hash[]\nexport type OnTransactionsFn = (transactions: OnTransactionsParameter) => void\n\nexport type WatchPendingTransactionsParameters<\n transport extends Transport = Transport,\n> = {\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n /** The callback to call when new transactions are received. */\n onTransactions: OnTransactionsFn\n} & GetPollOptions\n\nexport type WatchPendingTransactionsReturnType = () => void\n\nexport type WatchPendingTransactionsErrorType =\n | StringifyErrorType\n | ObserveErrorType\n | ErrorType\n\n/**\n * Watches and returns pending transaction hashes.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions\n * - JSON-RPC Methods:\n * - When `poll: true`\n * - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter.\n * - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newPendingTransactions\"` event.\n *\n * This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions#ontransactions).\n *\n * @param client - Client to use\n * @param parameters - {@link WatchPendingTransactionsParameters}\n * @returns A function that can be invoked to stop watching for new pending transaction hashes. {@link WatchPendingTransactionsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { watchPendingTransactions } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await watchPendingTransactions(client, {\n * onTransactions: (hashes) => console.log(hashes),\n * })\n */\nexport function watchPendingTransactions<\n transport extends Transport,\n chain extends Chain | undefined,\n>(\n client: Client,\n {\n batch = true,\n onError,\n onTransactions,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n }: WatchPendingTransactionsParameters,\n) {\n const enablePolling =\n typeof poll_ !== 'undefined'\n ? poll_\n : client.transport.type !== 'webSocket' && client.transport.type !== 'ipc'\n\n const pollPendingTransactions = () => {\n const observerId = stringify([\n 'watchPendingTransactions',\n client.uid,\n batch,\n pollingInterval,\n ])\n return observe(observerId, { onTransactions, onError }, (emit) => {\n let filter: Filter<'transaction'>\n\n const unwatch = poll(\n async () => {\n try {\n if (!filter) {\n try {\n filter = await getAction(\n client,\n createPendingTransactionFilter,\n 'createPendingTransactionFilter',\n )({})\n return\n } catch (err) {\n unwatch()\n throw err\n }\n }\n\n const hashes = await getAction(\n client,\n getFilterChanges,\n 'getFilterChanges',\n )({ filter })\n if (hashes.length === 0) return\n if (batch) emit.onTransactions(hashes)\n else for (const hash of hashes) emit.onTransactions([hash])\n } catch (err) {\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin: true,\n interval: pollingInterval,\n },\n )\n\n return async () => {\n if (filter)\n await getAction(\n client,\n uninstallFilter,\n 'uninstallFilter',\n )({ filter })\n unwatch()\n }\n })\n }\n\n const subscribePendingTransactions = () => {\n let active = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n const { unsubscribe: unsubscribe_ } = await client.transport.subscribe({\n params: ['newPendingTransactions'],\n onData(data: any) {\n if (!active) return\n const transaction = data.result\n onTransactions([transaction])\n },\n onError(error: Error) {\n onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n }\n\n return enablePolling\n ? pollPendingTransactions()\n : subscribePendingTransactions()\n}\n","import type { Address } from 'abitype'\n\nimport type { ExactPartial, Prettify } from '../../types/utils.js'\nimport type { SiweMessage } from './types.js'\n\n/**\n * @description Parses EIP-4361 formatted message into message fields object.\n *\n * @see https://eips.ethereum.org/EIPS/eip-4361\n *\n * @returns EIP-4361 fields object\n */\nexport function parseSiweMessage(\n message: string,\n): Prettify> {\n const { scheme, statement, ...prefix } = (message.match(prefixRegex)\n ?.groups ?? {}) as {\n address: Address\n domain: string\n scheme?: string\n statement?: string\n }\n const { chainId, expirationTime, issuedAt, notBefore, requestId, ...suffix } =\n (message.match(suffixRegex)?.groups ?? {}) as {\n chainId: string\n expirationTime?: string\n issuedAt?: string\n nonce: string\n notBefore?: string\n requestId?: string\n uri: string\n version: '1'\n }\n const resources = message.split('Resources:')[1]?.split('\\n- ').slice(1)\n return {\n ...prefix,\n ...suffix,\n ...(chainId ? { chainId: Number(chainId) } : {}),\n ...(expirationTime ? { expirationTime: new Date(expirationTime) } : {}),\n ...(issuedAt ? { issuedAt: new Date(issuedAt) } : {}),\n ...(notBefore ? { notBefore: new Date(notBefore) } : {}),\n ...(requestId ? { requestId } : {}),\n ...(resources ? { resources } : {}),\n ...(scheme ? { scheme } : {}),\n ...(statement ? { statement } : {}),\n }\n}\n\n// https://regexr.com/80gdj\nconst prefixRegex =\n /^(?:(?[a-zA-Z][a-zA-Z0-9+-.]*):\\/\\/)?(?[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\\n)(?
0x[a-fA-F0-9]{40})\\n\\n(?:(?.*)\\n\\n)?/\n\n// https://regexr.com/80gf9\nconst suffixRegex =\n /(?:URI: (?.+))\\n(?:Version: (?.+))\\n(?:Chain ID: (?\\d+))\\n(?:Nonce: (?[a-zA-Z0-9]+))\\n(?:Issued At: (?.+))(?:\\nExpiration Time: (?.+))?(?:\\nNot Before: (?.+))?(?:\\nRequest ID: (?.+))?/\n","import type { Address } from 'abitype'\n\nimport type { ExactPartial } from '../../types/utils.js'\nimport { isAddress } from '../address/isAddress.js'\nimport { isAddressEqual } from '../address/isAddressEqual.js'\nimport type { SiweMessage } from './types.js'\n\nexport type ValidateSiweMessageParameters = {\n /**\n * Ethereum address to check against.\n */\n address?: Address | undefined\n /**\n * [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986) authority to check against.\n */\n domain?: string | undefined\n /**\n * EIP-4361 message fields.\n */\n message: ExactPartial\n /**\n * Random string to check against.\n */\n nonce?: string | undefined\n /**\n * [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#section-3.1) URI scheme to check against.\n */\n scheme?: string | undefined\n /**\n * Current time to check optional `expirationTime` and `notBefore` fields.\n *\n * @default new Date()\n */\n time?: Date | undefined\n}\n\nexport type ValidateSiweMessageReturnType = boolean\n\n/**\n * @description Validates EIP-4361 message.\n *\n * @see https://eips.ethereum.org/EIPS/eip-4361\n */\nexport function validateSiweMessage(\n parameters: ValidateSiweMessageParameters,\n): ValidateSiweMessageReturnType {\n const {\n address,\n domain,\n message,\n nonce,\n scheme,\n time = new Date(),\n } = parameters\n\n if (domain && message.domain !== domain) return false\n if (nonce && message.nonce !== nonce) return false\n if (scheme && message.scheme !== scheme) return false\n\n if (message.expirationTime && time >= message.expirationTime) return false\n if (message.notBefore && time < message.notBefore) return false\n\n try {\n if (!message.address) return false\n if (!isAddress(message.address, { strict: false })) return false\n if (address && !isAddressEqual(message.address, address)) return false\n } catch {\n return false\n }\n\n return true\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport type { HashMessageErrorType } from '../../utils/signature/hashMessage.js'\nimport { hashMessage } from '../../utils/signature/hashMessage.js'\nimport { parseSiweMessage } from '../../utils/siwe/parseSiweMessage.js'\nimport {\n type ValidateSiweMessageParameters,\n validateSiweMessage,\n} from '../../utils/siwe/validateSiweMessage.js'\nimport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n verifyHash,\n} from '../public/verifyHash.js'\n\nexport type VerifySiweMessageParameters = Prettify<\n Pick &\n Pick<\n ValidateSiweMessageParameters,\n 'address' | 'domain' | 'nonce' | 'scheme' | 'time'\n > & {\n /**\n * EIP-4361 formatted message.\n */\n message: string\n /**\n * Signature to check against.\n */\n signature: Hex\n }\n>\n\nexport type VerifySiweMessageReturnType = boolean\n\nexport type VerifySiweMessageErrorType =\n | HashMessageErrorType\n | VerifyHashErrorType\n | ErrorType\n\n/**\n * Verifies [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) formatted message was signed.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/siwe/actions/verifySiweMessage}\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifySiweMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifySiweMessageReturnType}\n */\nexport async function verifySiweMessage(\n client: Client,\n parameters: VerifySiweMessageParameters,\n): Promise {\n const {\n address,\n domain,\n message,\n nonce,\n scheme,\n signature,\n time = new Date(),\n ...callRequest\n } = parameters\n\n const parsed = parseSiweMessage(message)\n if (!parsed.address) return false\n\n const isValid = validateSiweMessage({\n address,\n domain,\n message: parsed,\n nonce,\n scheme,\n time,\n })\n if (!isValid) return false\n\n const hash = hashMessage(message)\n return verifyHash(client, {\n address: parsed.address,\n hash,\n signature,\n ...callRequest,\n })\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { TransactionReceiptRevertedError } from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { TransactionSerializedGeneric } from '../../types/transaction.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { formatTransactionReceipt } from '../../utils/formatters/transactionReceipt.js'\nimport type { FormattedTransactionReceipt } from '../../utils/index.js'\n\nexport type SendRawTransactionSyncParameters = {\n /** The signed serialized transaction. */\n serializedTransaction: TransactionSerializedGeneric\n /** Whether to throw an error if the transaction was detected as reverted. @default true */\n throwOnReceiptRevert?: boolean | undefined\n /** The timeout for the transaction. */\n timeout?: number | undefined\n}\n\nexport type SendRawTransactionSyncReturnType<\n chain extends Chain | undefined = undefined,\n> = FormattedTransactionReceipt\n\nexport type SendRawTransactionSyncErrorType = RequestErrorType | ErrorType\n\n/**\n * Sends a **signed** transaction to the network synchronously,\n * and waits for the transaction to be included in a block.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransactionSync\n * - JSON-RPC Method: [`eth_sendRawTransactionSync`](https://eips.ethereum.org/EIPS/eip-7966)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction receipt. {@link SendRawTransactionSyncReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransactionSync } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const receipt = await sendRawTransactionSync(client, {\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\nexport async function sendRawTransactionSync(\n client: Client,\n {\n serializedTransaction,\n throwOnReceiptRevert,\n timeout,\n }: SendRawTransactionSyncParameters,\n): Promise> {\n const receipt = await client.request(\n {\n method: 'eth_sendRawTransactionSync',\n params: timeout\n ? [serializedTransaction, timeout]\n : [serializedTransaction],\n },\n { retryCount: 0 },\n )\n const format =\n client.chain?.formatters?.transactionReceipt?.format ||\n formatTransactionReceipt\n\n const formatted = format(receipt) as SendRawTransactionSyncReturnType\n if (formatted.status === 'reverted' && throwOnReceiptRevert)\n throw new TransactionReceiptRevertedError({ receipt: formatted })\n return formatted\n}\n","import type { Abi, AbiEvent, Address } from 'abitype'\n\nimport {\n type GetEnsAddressParameters,\n type GetEnsAddressReturnType,\n getEnsAddress,\n} from '../../actions/ens/getEnsAddress.js'\nimport {\n type GetEnsAvatarParameters,\n type GetEnsAvatarReturnType,\n getEnsAvatar,\n} from '../../actions/ens/getEnsAvatar.js'\nimport {\n type GetEnsNameParameters,\n type GetEnsNameReturnType,\n getEnsName,\n} from '../../actions/ens/getEnsName.js'\nimport {\n type GetEnsResolverParameters,\n type GetEnsResolverReturnType,\n getEnsResolver,\n} from '../../actions/ens/getEnsResolver.js'\nimport {\n type GetEnsTextParameters,\n type GetEnsTextReturnType,\n getEnsText,\n} from '../../actions/ens/getEnsText.js'\nimport {\n type CallParameters,\n type CallReturnType,\n call,\n} from '../../actions/public/call.js'\nimport {\n type CreateAccessListParameters,\n type CreateAccessListReturnType,\n createAccessList,\n} from '../../actions/public/createAccessList.js'\nimport {\n type CreateBlockFilterReturnType,\n createBlockFilter,\n} from '../../actions/public/createBlockFilter.js'\nimport {\n type CreateContractEventFilterParameters,\n type CreateContractEventFilterReturnType,\n createContractEventFilter,\n} from '../../actions/public/createContractEventFilter.js'\nimport {\n type CreateEventFilterParameters,\n type CreateEventFilterReturnType,\n createEventFilter,\n} from '../../actions/public/createEventFilter.js'\nimport {\n type CreatePendingTransactionFilterReturnType,\n createPendingTransactionFilter,\n} from '../../actions/public/createPendingTransactionFilter.js'\nimport {\n type EstimateContractGasParameters,\n type EstimateContractGasReturnType,\n estimateContractGas,\n} from '../../actions/public/estimateContractGas.js'\nimport {\n type EstimateFeesPerGasParameters,\n type EstimateFeesPerGasReturnType,\n estimateFeesPerGas,\n} from '../../actions/public/estimateFeesPerGas.js'\nimport {\n type EstimateGasParameters,\n type EstimateGasReturnType,\n estimateGas,\n} from '../../actions/public/estimateGas.js'\nimport {\n type EstimateMaxPriorityFeePerGasParameters,\n type EstimateMaxPriorityFeePerGasReturnType,\n estimateMaxPriorityFeePerGas,\n} from '../../actions/public/estimateMaxPriorityFeePerGas.js'\nimport {\n type FillTransactionParameters,\n type FillTransactionReturnType,\n fillTransaction,\n} from '../../actions/public/fillTransaction.js'\nimport {\n type GetBalanceParameters,\n type GetBalanceReturnType,\n getBalance,\n} from '../../actions/public/getBalance.js'\nimport {\n type GetBlobBaseFeeReturnType,\n getBlobBaseFee,\n} from '../../actions/public/getBlobBaseFee.js'\nimport {\n type GetBlockParameters,\n type GetBlockReturnType,\n getBlock,\n} from '../../actions/public/getBlock.js'\nimport {\n type GetBlockNumberParameters,\n type GetBlockNumberReturnType,\n getBlockNumber,\n} from '../../actions/public/getBlockNumber.js'\nimport {\n type GetBlockTransactionCountParameters,\n type GetBlockTransactionCountReturnType,\n getBlockTransactionCount,\n} from '../../actions/public/getBlockTransactionCount.js'\nimport {\n type GetChainIdReturnType,\n getChainId,\n} from '../../actions/public/getChainId.js'\nimport {\n type GetCodeParameters,\n type GetCodeReturnType,\n getCode,\n} from '../../actions/public/getCode.js'\nimport {\n type GetContractEventsParameters,\n type GetContractEventsReturnType,\n getContractEvents,\n} from '../../actions/public/getContractEvents.js'\nimport {\n type GetDelegationParameters,\n type GetDelegationReturnType,\n getDelegation,\n} from '../../actions/public/getDelegation.js'\nimport {\n type GetEip712DomainParameters,\n type GetEip712DomainReturnType,\n getEip712Domain,\n} from '../../actions/public/getEip712Domain.js'\nimport {\n type GetFeeHistoryParameters,\n type GetFeeHistoryReturnType,\n getFeeHistory,\n} from '../../actions/public/getFeeHistory.js'\nimport {\n type GetFilterChangesParameters,\n type GetFilterChangesReturnType,\n getFilterChanges,\n} from '../../actions/public/getFilterChanges.js'\nimport {\n type GetFilterLogsParameters,\n type GetFilterLogsReturnType,\n getFilterLogs,\n} from '../../actions/public/getFilterLogs.js'\nimport {\n type GetGasPriceReturnType,\n getGasPrice,\n} from '../../actions/public/getGasPrice.js'\nimport {\n type GetLogsParameters,\n type GetLogsReturnType,\n getLogs,\n} from '../../actions/public/getLogs.js'\nimport {\n type GetProofParameters,\n type GetProofReturnType,\n getProof,\n} from '../../actions/public/getProof.js'\nimport {\n type GetStorageAtParameters,\n type GetStorageAtReturnType,\n getStorageAt,\n} from '../../actions/public/getStorageAt.js'\nimport {\n type GetTransactionParameters,\n type GetTransactionReturnType,\n getTransaction,\n} from '../../actions/public/getTransaction.js'\nimport {\n type GetTransactionConfirmationsParameters,\n type GetTransactionConfirmationsReturnType,\n getTransactionConfirmations,\n} from '../../actions/public/getTransactionConfirmations.js'\nimport {\n type GetTransactionCountParameters,\n type GetTransactionCountReturnType,\n getTransactionCount,\n} from '../../actions/public/getTransactionCount.js'\nimport {\n type GetTransactionReceiptParameters,\n type GetTransactionReceiptReturnType,\n getTransactionReceipt,\n} from '../../actions/public/getTransactionReceipt.js'\nimport {\n type MulticallParameters,\n type MulticallReturnType,\n multicall,\n} from '../../actions/public/multicall.js'\nimport {\n type ReadContractParameters,\n type ReadContractReturnType,\n readContract,\n} from '../../actions/public/readContract.js'\nimport {\n type SimulateBlocksParameters,\n type SimulateBlocksReturnType,\n simulateBlocks,\n} from '../../actions/public/simulateBlocks.js'\nimport {\n type SimulateCallsParameters,\n type SimulateCallsReturnType,\n simulateCalls,\n} from '../../actions/public/simulateCalls.js'\nimport {\n type SimulateContractParameters,\n type SimulateContractReturnType,\n simulateContract,\n} from '../../actions/public/simulateContract.js'\nimport {\n type UninstallFilterParameters,\n type UninstallFilterReturnType,\n uninstallFilter,\n} from '../../actions/public/uninstallFilter.js'\nimport {\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from '../../actions/public/verifyHash.js'\nimport {\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from '../../actions/public/verifyMessage.js'\nimport {\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from '../../actions/public/verifyTypedData.js'\nimport {\n type WaitForTransactionReceiptParameters,\n type WaitForTransactionReceiptReturnType,\n waitForTransactionReceipt,\n} from '../../actions/public/waitForTransactionReceipt.js'\nimport {\n type WatchBlockNumberParameters,\n type WatchBlockNumberReturnType,\n watchBlockNumber,\n} from '../../actions/public/watchBlockNumber.js'\nimport {\n type WatchBlocksParameters,\n type WatchBlocksReturnType,\n watchBlocks,\n} from '../../actions/public/watchBlocks.js'\nimport {\n type WatchContractEventParameters,\n type WatchContractEventReturnType,\n watchContractEvent,\n} from '../../actions/public/watchContractEvent.js'\nimport {\n type WatchEventParameters,\n type WatchEventReturnType,\n watchEvent,\n} from '../../actions/public/watchEvent.js'\nimport {\n type WatchPendingTransactionsParameters,\n type WatchPendingTransactionsReturnType,\n watchPendingTransactions,\n} from '../../actions/public/watchPendingTransactions.js'\nimport {\n type VerifySiweMessageParameters,\n type VerifySiweMessageReturnType,\n verifySiweMessage,\n} from '../../actions/siwe/verifySiweMessage.js'\nimport {\n type PrepareTransactionRequestParameters,\n type PrepareTransactionRequestRequest,\n type PrepareTransactionRequestReturnType,\n prepareTransactionRequest,\n} from '../../actions/wallet/prepareTransactionRequest.js'\nimport {\n type SendRawTransactionParameters,\n type SendRawTransactionReturnType,\n sendRawTransaction,\n} from '../../actions/wallet/sendRawTransaction.js'\nimport {\n type SendRawTransactionSyncParameters,\n type SendRawTransactionSyncReturnType,\n sendRawTransactionSync,\n} from '../../actions/wallet/sendRawTransactionSync.js'\nimport type { Account } from '../../types/account.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventName,\n ContractFunctionArgs,\n ContractFunctionName,\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { FeeValuesType } from '../../types/fee.js'\nimport type { FilterType } from '../../types/filter.js'\nimport type { Client } from '../createClient.js'\nimport type { Transport } from '../transports/createTransport.js'\n\nexport type PublicActions<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n> = {\n /**\n * Executes a new message call immediately without submitting a transaction to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/call\n * - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call)\n *\n * @param args - {@link CallParameters}\n * @returns The call data. {@link CallReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const data = await client.call({\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\n call: (parameters: CallParameters) => Promise\n /**\n * Creates an EIP-2930 access list that you can include in a transaction.\n *\n * - Docs: https://viem.sh/docs/actions/public/createAccessList\n * - JSON-RPC Methods: `eth_createAccessList`\n *\n * @param args - {@link CreateAccessListParameters}\n * @returns The call data. {@link CreateAccessListReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const data = await client.createAccessList({\n * data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\n createAccessList: (\n parameters: CreateAccessListParameters,\n ) => Promise\n /**\n * Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createBlockFilter\n * - JSON-RPC Methods: [`eth_newBlockFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newBlockFilter)\n *\n * @returns Filter. {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, createBlockFilter, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createBlockFilter(client)\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'block' }\n */\n createBlockFilter: () => Promise\n /**\n * Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs).\n *\n * - Docs: https://viem.sh/docs/contract/createContractEventFilter\n *\n * @param args - {@link CreateContractEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateContractEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createContractEventFilter({\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * })\n */\n createContractEventFilter: <\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined,\n args extends MaybeExtractEventArgsFromAbi | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: CreateContractEventFilterParameters<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >,\n ) => Promise<\n CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n >\n /**\n * Creates a [`Filter`](https://viem.sh/docs/glossary/types#filter) to listen for new events that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createEventFilter\n * - JSON-RPC Methods: [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter)\n *\n * @param args - {@link CreateEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createEventFilter({\n * address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2',\n * })\n */\n createEventFilter: <\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _EventName extends string | undefined = MaybeAbiEventName,\n _Args extends\n | MaybeExtractEventArgsFromAbi\n | undefined = undefined,\n >(\n args?:\n | CreateEventFilterParameters<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _EventName,\n _Args\n >\n | undefined,\n ) => Promise<\n CreateEventFilterReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock,\n _EventName,\n _Args\n >\n >\n /**\n * Creates a Filter to listen for new pending transaction hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges).\n *\n * - Docs: https://viem.sh/docs/actions/public/createPendingTransactionFilter\n * - JSON-RPC Methods: [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter)\n *\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateBlockFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createPendingTransactionFilter()\n * // { id: \"0x345a6572337856574a76364e457a4366\", type: 'transaction' }\n */\n createPendingTransactionFilter: () => Promise\n /**\n * Estimates the gas required to successfully execute a contract write function call.\n *\n * - Docs: https://viem.sh/docs/contract/estimateContractGas\n *\n * @remarks\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`estimateGas` action](https://viem.sh/docs/actions/public/estimateGas) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param args - {@link EstimateContractGasParameters}\n * @returns The gas estimate (in wei). {@link EstimateContractGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gas = await client.estimateContractGas({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint() public']),\n * functionName: 'mint',\n * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n * })\n */\n estimateContractGas: <\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n >(\n args: EstimateContractGasParameters,\n ) => Promise\n /**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param args - {@link EstimateGasParameters}\n * @returns The gas estimate (in wei). {@link EstimateGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasEstimate = await client.estimateGas({\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\n estimateGas: (\n args: EstimateGasParameters,\n ) => Promise\n /**\n * Fills a transaction request with the necessary fields to be signed over.\n *\n * - Docs: https://viem.sh/docs/actions/public/fillTransaction\n *\n * @param client - Client to use\n * @param parameters - {@link FillTransactionParameters}\n * @returns The filled transaction. {@link FillTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await client.fillTransaction({\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\n fillTransaction: <\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | undefined = undefined,\n >(\n args: FillTransactionParameters<\n chain,\n account,\n chainOverride,\n accountOverride\n >,\n ) => Promise>\n /**\n * Returns the balance of an address in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBalance\n * - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance)\n *\n * @remarks\n * You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther).\n *\n * ```ts\n * const balance = await getBalance(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * blockTag: 'safe'\n * })\n * const balanceAsEther = formatEther(balance)\n * // \"6.942\"\n * ```\n *\n * @param args - {@link GetBalanceParameters}\n * @returns The balance of the address in wei. {@link GetBalanceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const balance = await client.getBalance({\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n * // 10000000000000000000000n (wei)\n */\n getBalance: (args: GetBalanceParameters) => Promise\n /**\n * Returns the base fee per blob gas in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlobBaseFee\n * - JSON-RPC Methods: [`eth_blobBaseFee`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blobBaseFee)\n *\n * @param client - Client to use\n * @returns The blob base fee (in wei). {@link GetBlobBaseFeeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlobBaseFee } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blobBaseFee = await client.getBlobBaseFee()\n */\n getBlobBaseFee: () => Promise\n /**\n * Returns information about a block at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlock\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`.\n *\n * @param args - {@link GetBlockParameters}\n * @returns Information about the block. {@link GetBlockReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await client.getBlock()\n */\n getBlock: <\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n >(\n args?: GetBlockParameters | undefined,\n ) => Promise>\n /**\n * Returns the number of the most recent block seen.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber)\n *\n * @param args - {@link GetBlockNumberParameters}\n * @returns The number of the block. {@link GetBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blockNumber = await client.getBlockNumber()\n * // 69420n\n */\n getBlockNumber: (\n args?: GetBlockNumberParameters | undefined,\n ) => Promise\n /**\n * Returns the number of Transactions at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockTransactionCount\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockTransactionCountByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockTransactionCountByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash) for `blockHash`.\n *\n * @param args - {@link GetBlockTransactionCountParameters}\n * @returns The block transaction count. {@link GetBlockTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const count = await client.getBlockTransactionCount()\n */\n getBlockTransactionCount: (\n args?: GetBlockTransactionCountParameters | undefined,\n ) => Promise\n /** @deprecated Use `getCode` instead. */\n getBytecode: (args: GetCodeParameters) => Promise\n /**\n * Returns the chain ID associated with the current network.\n *\n * - Docs: https://viem.sh/docs/actions/public/getChainId\n * - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid)\n *\n * @returns The current chain ID. {@link GetChainIdReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const chainId = await client.getChainId()\n * // 1\n */\n getChainId: () => Promise\n /**\n * Retrieves the bytecode at an address.\n *\n * - Docs: https://viem.sh/docs/contract/getCode\n * - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode)\n *\n * @param args - {@link GetBytecodeParameters}\n * @returns The contract's bytecode. {@link GetBytecodeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await client.getCode({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * })\n */\n getCode: (args: GetCodeParameters) => Promise\n /**\n * Returns a list of event logs emitted by a contract.\n *\n * - Docs: https://viem.sh/docs/actions/public/getContractEvents\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetContractEventsParameters}\n * @returns A list of event logs. {@link GetContractEventsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { wagmiAbi } from './abi'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await client.getContractEvents(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: wagmiAbi,\n * eventName: 'Transfer'\n * })\n */\n getContractEvents: <\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: GetContractEventsParameters<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n ) => Promise<\n GetContractEventsReturnType\n >\n /**\n * Returns the address that an account has delegated to via EIP-7702.\n *\n * - Docs: https://viem.sh/docs/actions/public/getDelegation\n *\n * @param args - {@link GetDelegationParameters}\n * @returns The delegated address, or undefined if not delegated. {@link GetDelegationReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const delegation = await client.getDelegation({\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\n getDelegation: (\n args: GetDelegationParameters,\n ) => Promise\n /**\n * Reads the EIP-712 domain from a contract, based on the ERC-5267 specification.\n *\n * @param client - A {@link Client} instance.\n * @param parameters - The parameters of the action. {@link GetEip712DomainParameters}\n * @returns The EIP-712 domain, fields, and extensions. {@link GetEip712DomainReturnType}\n *\n * @example\n * ```ts\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const domain = await client.getEip712Domain({\n * address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * })\n * // {\n * // domain: {\n * // name: 'ExampleContract',\n * // version: '1',\n * // chainId: 1,\n * // verifyingContract: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n * // },\n * // fields: '0x0f',\n * // extensions: [],\n * // }\n * ```\n */\n getEip712Domain: (\n args: GetEip712DomainParameters,\n ) => Promise\n /**\n * Gets address for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAddress\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsAddressParameters}\n * @returns Address for ENS name or `null` if not found. {@link GetEnsAddressReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAddress = await client.getEnsAddress({\n * name: normalize('wevm.eth'),\n * })\n * // '0xd2135CfB216b74109775236E36d4b433F1DF507B'\n */\n getEnsAddress: (\n args: GetEnsAddressParameters,\n ) => Promise\n /**\n * Gets the avatar of an ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText) with `key` set to `'avatar'`.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsAvatarParameters}\n * @returns Avatar URI or `null` if not found. {@link GetEnsAvatarReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensAvatar = await client.getEnsAvatar({\n * name: normalize('wevm.eth'),\n * })\n * // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio'\n */\n getEnsAvatar: (\n args: GetEnsAvatarParameters,\n ) => Promise\n /**\n * Gets primary name for specified address.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsName\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `reverse(bytes)` on ENS Universal Resolver Contract to \"reverse resolve\" the address to the primary ENS name.\n *\n * @param args - {@link GetEnsNameParameters}\n * @returns Name or `null` if not found. {@link GetEnsNameReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const ensName = await client.getEnsName({\n * address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n * })\n * // 'wevm.eth'\n */\n getEnsName: (args: GetEnsNameParameters) => Promise\n /**\n * Gets resolver for ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `findResolver(bytes)` on ENS Universal Resolver Contract to retrieve the resolver of an ENS name.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsResolverParameters}\n * @returns Address for ENS resolver. {@link GetEnsResolverReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const resolverAddress = await client.getEnsResolver({\n * name: normalize('wevm.eth'),\n * })\n * // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41'\n */\n getEnsResolver: (\n args: GetEnsResolverParameters,\n ) => Promise\n /**\n * Gets a text record for specified ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * @remarks\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param args - {@link GetEnsTextParameters}\n * @returns Address for ENS resolver. {@link GetEnsTextReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const twitterRecord = await client.getEnsText({\n * name: normalize('wevm.eth'),\n * key: 'com.twitter',\n * })\n * // 'wevm_dev'\n */\n getEnsText: (args: GetEnsTextParameters) => Promise\n /**\n * Returns a collection of historical gas information.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFeeHistory\n * - JSON-RPC Methods: [`eth_feeHistory`](https://docs.alchemy.com/reference/eth-feehistory)\n *\n * @param args - {@link GetFeeHistoryParameters}\n * @returns The gas estimate (in wei). {@link GetFeeHistoryReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const feeHistory = await client.getFeeHistory({\n * blockCount: 4,\n * rewardPercentiles: [25, 75],\n * })\n */\n getFeeHistory: (\n args: GetFeeHistoryParameters,\n ) => Promise\n /**\n * Returns an estimate for the fees per gas for a transaction to be included\n * in the next block.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateFeesPerGasParameters}\n * @returns An estimate (in wei) for the fees per gas. {@link EstimateFeesPerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await client.estimateFeesPerGas()\n * // { maxFeePerGas: ..., maxPriorityFeePerGas: ... }\n */\n estimateFeesPerGas: <\n chainOverride extends Chain | undefined = undefined,\n type extends FeeValuesType = 'eip1559',\n >(\n args?: EstimateFeesPerGasParameters | undefined,\n ) => Promise>\n /**\n * Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterChanges\n * - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges)\n *\n * @remarks\n * A Filter can be created from the following actions:\n *\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * Depending on the type of filter, the return value will be different:\n *\n * - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs.\n * - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes.\n * - If the filter was created with `createBlockFilter`, it returns a list of block hashes.\n *\n * @param args - {@link GetFilterChangesParameters}\n * @returns Logs or hashes. {@link GetFilterChangesReturnType}\n *\n * @example\n * // Blocks\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createBlockFilter()\n * const hashes = await client.getFilterChanges({ filter })\n *\n * @example\n * // Contract Events\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createContractEventFilter({\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * eventName: 'Transfer',\n * })\n * const logs = await client.getFilterChanges({ filter })\n *\n * @example\n * // Raw Events\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createEventFilter({\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await client.getFilterChanges({ filter })\n *\n * @example\n * // Transactions\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createPendingTransactionFilter()\n * const hashes = await client.getFilterChanges({ filter })\n */\n getFilterChanges: <\n filterType extends FilterType,\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: GetFilterChangesParameters<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n ) => Promise<\n GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n >\n /**\n * Returns a list of event logs since the filter was created.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterLogs\n * - JSON-RPC Methods: [`eth_getFilterLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterlogs)\n *\n * @remarks\n * `getFilterLogs` is only compatible with **event filters**.\n *\n * @param args - {@link GetFilterLogsParameters}\n * @returns A list of event logs. {@link GetFilterLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await client.createEventFilter({\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await client.getFilterLogs({ filter })\n */\n getFilterLogs: <\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args: GetFilterLogsParameters,\n ) => Promise<\n GetFilterLogsReturnType\n >\n /**\n * Returns the current price of gas (in wei).\n *\n * - Docs: https://viem.sh/docs/actions/public/getGasPrice\n * - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice)\n *\n * @returns The gas price (in wei). {@link GetGasPriceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasPrice = await client.getGasPrice()\n */\n getGasPrice: () => Promise\n /**\n * Returns a list of event logs matching the provided parameters.\n *\n * - Docs: https://viem.sh/docs/actions/public/getLogs\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/logs_event-logs\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param args - {@link GetLogsParameters}\n * @returns A list of event logs. {@link GetLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await client.getLogs()\n */\n getLogs: <\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n >(\n args?:\n | GetLogsParameters\n | undefined,\n ) => Promise<\n GetLogsReturnType\n >\n /**\n * Returns the account and storage values of the specified account including the Merkle-proof.\n *\n * - Docs: https://viem.sh/docs/actions/public/getProof\n * - JSON-RPC Methods:\n * - Calls [`eth_getProof`](https://eips.ethereum.org/EIPS/eip-1186)\n *\n * @param client - Client to use\n * @param parameters - {@link GetProofParameters}\n * @returns Proof data. {@link GetProofReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await client.getProof({\n * address: '0x...',\n * storageKeys: ['0x...'],\n * })\n */\n getProof: (args: GetProofParameters) => Promise\n /**\n * Returns an estimate for the max priority fee per gas (in wei) for a transaction\n * to be included in the next block.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas\n *\n * @param client - Client to use\n * @returns An estimate (in wei) for the max priority fee per gas. {@link EstimateMaxPriorityFeePerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await client.estimateMaxPriorityFeePerGas()\n * // 10000000n\n */\n estimateMaxPriorityFeePerGas: <\n chainOverride extends Chain | undefined = undefined,\n >(\n args?:\n | EstimateMaxPriorityFeePerGasParameters\n | undefined,\n ) => Promise\n /**\n * Returns the value from a storage slot at a given address.\n *\n * - Docs: https://viem.sh/docs/contract/getStorageAt\n * - JSON-RPC Methods: [`eth_getStorageAt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat)\n *\n * @param args - {@link GetStorageAtParameters}\n * @returns The value of the storage slot. {@link GetStorageAtReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getStorageAt } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await client.getStorageAt({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * slot: toHex(0),\n * })\n */\n getStorageAt: (\n args: GetStorageAtParameters,\n ) => Promise\n /**\n * Returns information about a [Transaction](https://viem.sh/docs/glossary/terms#transaction) given a hash or block identifier.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransaction\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash)\n *\n * @param args - {@link GetTransactionParameters}\n * @returns The transaction information. {@link GetTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transaction = await client.getTransaction({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n getTransaction: (\n args: GetTransactionParameters,\n ) => Promise>\n /**\n * Returns the number of blocks passed (confirmations) since the transaction was processed on a block.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionConfirmations\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionConfirmations`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionConfirmations)\n *\n * @param args - {@link GetTransactionConfirmationsParameters}\n * @returns The number of blocks passed since the transaction was processed. If confirmations is 0, then the Transaction has not been confirmed & processed yet. {@link GetTransactionConfirmationsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const confirmations = await client.getTransactionConfirmations({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n getTransactionConfirmations: (\n args: GetTransactionConfirmationsParameters,\n ) => Promise\n /**\n * Returns the number of [Transactions](https://viem.sh/docs/glossary/terms#transaction) an Account has broadcast / sent.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionCount\n * - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount)\n *\n * @param args - {@link GetTransactionCountParameters}\n * @returns The number of transactions an account has sent. {@link GetTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionCount = await client.getTransactionCount({\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\n getTransactionCount: (\n args: GetTransactionCountParameters,\n ) => Promise\n /**\n * Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt)\n *\n * @param args - {@link GetTransactionReceiptParameters}\n * @returns The transaction receipt. {@link GetTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await client.getTransactionReceipt({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n getTransactionReceipt: (\n args: GetTransactionReceiptParameters,\n ) => Promise>\n /**\n * Similar to [`readContract`](https://viem.sh/docs/contract/readContract), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall).\n *\n * - Docs: https://viem.sh/docs/contract/multicall\n *\n * @param args - {@link MulticallParameters}\n * @returns An array of results with accompanying status. {@link MulticallReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const abi = parseAbi([\n * 'function balanceOf(address) view returns (uint256)',\n * 'function totalSupply() view returns (uint256)',\n * ])\n * const result = await client.multicall({\n * contracts: [\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * },\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'totalSupply',\n * },\n * ],\n * })\n * // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }]\n */\n multicall: <\n const contracts extends readonly unknown[],\n allowFailure extends boolean = true,\n >(\n args: MulticallParameters,\n ) => Promise>\n /**\n * Prepares a transaction request for signing.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest\n *\n * @param args - {@link PrepareTransactionRequestParameters}\n * @returns The transaction request. {@link PrepareTransactionRequestReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await client.prepareTransactionRequest({\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await client.prepareTransactionRequest({\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n */\n prepareTransactionRequest: <\n const request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n >,\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | undefined = undefined,\n >(\n args: PrepareTransactionRequestParameters<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >,\n ) => Promise<\n PrepareTransactionRequestReturnType<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >\n >\n /**\n * Calls a read-only function on a contract, and returns the response.\n *\n * - Docs: https://viem.sh/docs/contract/readContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_reading-contracts\n *\n * @remarks\n * A \"read-only\" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param args - {@link ReadContractParameters}\n * @returns The response from the contract. Type is inferred. {@link ReadContractReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { readContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await client.readContract({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // 424122n\n */\n readContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs,\n >(\n args: ReadContractParameters,\n ) => Promise>\n /**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction\n * - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction hash. {@link SendRawTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const hash = await client.sendRawTransaction({\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\n sendRawTransaction: (\n args: SendRawTransactionParameters,\n ) => Promise\n /**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransactionSync\n * - JSON-RPC Method: [`eth_sendRawTransactionSync`](https://eips.ethereum.org/EIPS/eip-7966)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionSyncParameters}\n * @returns The transaction receipt. {@link SendRawTransactionSyncReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransactionSync } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const receipt = await client.sendRawTransactionSync({\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\n sendRawTransactionSync: (\n args: SendRawTransactionSyncParameters,\n ) => Promise>\n /**\n * @deprecated Use `simulateBlocks` instead.\n */\n simulate: (\n args: SimulateBlocksParameters,\n ) => Promise>\n /**\n * Simulates a set of calls on block(s) with optional block and state overrides.\n *\n * @example\n * ```ts\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await client.simulateBlocks({\n * blocks: [{\n * blockOverrides: {\n * number: 69420n,\n * },\n * calls: [{\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * }],\n * stateOverrides: [{\n * address: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * balance: parseEther('10'),\n * }],\n * }]\n * })\n * ```\n *\n * @param client - Client to use.\n * @param parameters - {@link SimulateParameters}\n * @returns Simulated blocks. {@link SimulateReturnType}\n */\n simulateBlocks: (\n args: SimulateBlocksParameters,\n ) => Promise>\n /**\n * Simulates a set of calls.\n *\n * @example\n * ```ts\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const result = await client.simulateCalls({\n * account: '0x5a0b54d5dc17e482fe8b0bdca5320161b95fb929',\n * calls: [{\n * {\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * },\n * ]\n * })\n * ```\n *\n * @param client - Client to use.\n * @param parameters - {@link SimulateCallsParameters}\n * @returns Results. {@link SimulateCallsReturnType}\n */\n simulateCalls: (\n args: SimulateCallsParameters,\n ) => Promise>\n /**\n * Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions.\n *\n * - Docs: https://viem.sh/docs/contract/simulateContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_writing-to-contracts\n *\n * @remarks\n * This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract), but also supports contract write functions.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param args - {@link SimulateContractParameters}\n * @returns The simulation result and write request. {@link SimulateContractReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await client.simulateContract({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint(uint32) view returns (uint32)']),\n * functionName: 'mint',\n * args: ['69420'],\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\n simulateContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName,\n const args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n chainOverride extends Chain | undefined,\n accountOverride extends Account | Address | undefined = undefined,\n >(\n args: SimulateContractParameters<\n abi,\n functionName,\n args,\n chain,\n chainOverride,\n accountOverride\n >,\n ) => Promise<\n SimulateContractReturnType<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride,\n accountOverride\n >\n >\n /**\n * Verify that a hash was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyHash}\n *\n * @param parameters - {@link VerifyHashParameters}\n * @returns Whether or not the signature is valid. {@link VerifyHashReturnType}\n */\n verifyHash: (args: VerifyHashParameters) => Promise\n /**\n * Verify that a message was signed by the provided address.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyMessage}\n *\n * @param parameters - {@link VerifyMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifyMessageReturnType}\n */\n verifyMessage: (\n args: VerifyMessageParameters,\n ) => Promise\n /**\n * Verifies [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) formatted message was signed.\n *\n * Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).\n *\n * - Docs {@link https://viem.sh/docs/siwe/actions/verifySiweMessage}\n *\n * @param parameters - {@link VerifySiweMessageParameters}\n * @returns Whether or not the signature is valid. {@link VerifySiweMessageReturnType}\n */\n verifySiweMessage: (\n args: VerifySiweMessageParameters,\n ) => Promise\n /**\n * Verify that typed data was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/actions/public/verifyTypedData}\n *\n * @param parameters - {@link VerifyTypedDataParameters}\n * @returns Whether or not the signature is valid. {@link VerifyTypedDataReturnType}\n */\n verifyTypedData: (\n args: VerifyTypedDataParameters,\n ) => Promise\n /**\n * Destroys a Filter that was created from one of the following Actions:\n *\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * - Docs: https://viem.sh/docs/actions/public/uninstallFilter\n * - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter)\n *\n * @param args - {@link UninstallFilterParameters}\n * @returns A boolean indicating if the Filter was successfully uninstalled. {@link UninstallFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, uninstallFilter } from 'viem/public'\n *\n * const filter = await client.createPendingTransactionFilter()\n * const uninstalled = await client.uninstallFilter({ filter })\n * // true\n */\n uninstallFilter: (\n args: UninstallFilterParameters,\n ) => Promise\n /**\n * Waits for the [Transaction](https://viem.sh/docs/glossary/terms#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt). If the Transaction reverts, then the action will throw an error.\n *\n * - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_sending-transactions\n * - JSON-RPC Methods:\n * - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed.\n * - If a Transaction has been replaced:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions\n * - Checks if one of the Transactions is a replacement\n * - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt).\n *\n * @remarks\n * The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions).\n *\n * Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce.\n *\n * There are 3 types of Transaction Replacement reasons:\n *\n * - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`)\n * - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`)\n * - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`)\n *\n * @param args - {@link WaitForTransactionReceiptParameters}\n * @returns The transaction receipt. {@link WaitForTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await client.waitForTransactionReceipt({\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\n waitForTransactionReceipt: (\n args: WaitForTransactionReceiptParameters,\n ) => Promise>\n /**\n * Watches and returns incoming block numbers.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param args - {@link WatchBlockNumberParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await client.watchBlockNumber({\n * onBlockNumber: (blockNumber) => console.log(blockNumber),\n * })\n */\n watchBlockNumber: (\n args: WatchBlockNumberParameters,\n ) => WatchBlockNumberReturnType\n /**\n * Watches and returns information for incoming blocks.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlocks\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param args - {@link WatchBlocksParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlocksReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await client.watchBlocks({\n * onBlock: (block) => console.log(block),\n * })\n */\n watchBlocks: <\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n >(\n args: WatchBlocksParameters<\n transport,\n chain,\n includeTransactions,\n blockTag\n >,\n ) => WatchBlocksReturnType\n /**\n * Watches and returns emitted contract event logs.\n *\n * - Docs: https://viem.sh/docs/contract/watchContractEvent\n *\n * @remarks\n * This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent#onLogs).\n *\n * `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param args - {@link WatchContractEventParameters}\n * @returns A function that can be invoked to stop watching for new event logs. {@link WatchContractEventReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = client.watchContractEvent({\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']),\n * eventName: 'Transfer',\n * args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' },\n * onLogs: (logs) => console.log(logs),\n * })\n */\n watchContractEvent: <\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName,\n strict extends boolean | undefined = undefined,\n >(\n args: WatchContractEventParameters,\n ) => WatchContractEventReturnType\n /**\n * Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms#event-log).\n *\n * - Docs: https://viem.sh/docs/actions/public/watchEvent\n * - JSON-RPC Methods:\n * - **RPC Provider supports `eth_newFilter`:**\n * - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize).\n * - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges).\n * - **RPC Provider does not support `eth_newFilter`:**\n * - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval.\n *\n * @remarks\n * This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent#onLogs).\n *\n * `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param args - {@link WatchEventParameters}\n * @returns A function that can be invoked to stop watching for new Event Logs. {@link WatchEventReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = client.watchEvent({\n * onLogs: (logs) => console.log(logs),\n * })\n */\n watchEvent: <\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n >(\n args: WatchEventParameters,\n ) => WatchEventReturnType\n /**\n * Watches and returns pending transaction hashes.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchPendingTransactions\n * - JSON-RPC Methods:\n * - When `poll: true`\n * - Calls [`eth_newPendingTransactionFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newpendingtransactionfilter) to initialize the filter.\n * - Calls [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getFilterChanges) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newPendingTransactions\"` event.\n *\n * @remarks\n * This Action will batch up all the pending transactions found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchPendingTransactions#pollinginterval-optional), and invoke them via [`onTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions#ontransactions).\n *\n * @param args - {@link WatchPendingTransactionsParameters}\n * @returns A function that can be invoked to stop watching for new pending transaction hashes. {@link WatchPendingTransactionsReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = await client.watchPendingTransactions({\n * onTransactions: (hashes) => console.log(hashes),\n * })\n */\n watchPendingTransactions: (\n args: WatchPendingTransactionsParameters,\n ) => WatchPendingTransactionsReturnType\n}\n\nexport function publicActions<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n>(\n client: Client,\n): PublicActions {\n return {\n call: (args) => call(client, args),\n createAccessList: (args) => createAccessList(client, args),\n createBlockFilter: () => createBlockFilter(client),\n createContractEventFilter: (args) =>\n createContractEventFilter(client, args),\n createEventFilter: (args) => createEventFilter(client, args),\n createPendingTransactionFilter: () =>\n createPendingTransactionFilter(client),\n estimateContractGas: (args) => estimateContractGas(client, args as any),\n estimateGas: (args) => estimateGas(client, args),\n getBalance: (args) => getBalance(client, args),\n getBlobBaseFee: () => getBlobBaseFee(client),\n getBlock: (args) => getBlock(client, args),\n getBlockNumber: (args) => getBlockNumber(client, args),\n getBlockTransactionCount: (args) => getBlockTransactionCount(client, args),\n getBytecode: (args) => getCode(client, args),\n getChainId: () => getChainId(client),\n getCode: (args) => getCode(client, args),\n getContractEvents: (args) => getContractEvents(client, args),\n getDelegation: (args) => getDelegation(client, args),\n getEip712Domain: (args) => getEip712Domain(client, args),\n getEnsAddress: (args) => getEnsAddress(client, args),\n getEnsAvatar: (args) => getEnsAvatar(client, args),\n getEnsName: (args) => getEnsName(client, args),\n getEnsResolver: (args) => getEnsResolver(client, args),\n getEnsText: (args) => getEnsText(client, args),\n getFeeHistory: (args) => getFeeHistory(client, args),\n estimateFeesPerGas: (args) => estimateFeesPerGas(client, args),\n getFilterChanges: (args) => getFilterChanges(client, args),\n getFilterLogs: (args) => getFilterLogs(client, args),\n getGasPrice: () => getGasPrice(client),\n getLogs: (args) => getLogs(client, args as any),\n getProof: (args) => getProof(client, args),\n estimateMaxPriorityFeePerGas: (args) =>\n estimateMaxPriorityFeePerGas(client, args),\n fillTransaction: (args) => fillTransaction(client, args),\n getStorageAt: (args) => getStorageAt(client, args),\n getTransaction: (args) => getTransaction(client, args),\n getTransactionConfirmations: (args) =>\n getTransactionConfirmations(client, args),\n getTransactionCount: (args) => getTransactionCount(client, args),\n getTransactionReceipt: (args) => getTransactionReceipt(client, args),\n multicall: (args) => multicall(client, args),\n prepareTransactionRequest: (args) =>\n prepareTransactionRequest(client as any, args as any) as any,\n readContract: (args) => readContract(client, args),\n sendRawTransaction: (args) => sendRawTransaction(client, args),\n sendRawTransactionSync: (args) => sendRawTransactionSync(client, args),\n simulate: (args) => simulateBlocks(client, args),\n simulateBlocks: (args) => simulateBlocks(client, args),\n simulateCalls: (args) => simulateCalls(client, args),\n simulateContract: (args) => simulateContract(client, args),\n verifyHash: (args) => verifyHash(client, args),\n verifyMessage: (args) => verifyMessage(client, args),\n verifySiweMessage: (args) => verifySiweMessage(client, args),\n verifyTypedData: (args) => verifyTypedData(client, args),\n uninstallFilter: (args) => uninstallFilter(client, args),\n waitForTransactionReceipt: (args) =>\n waitForTransactionReceipt(client, args),\n watchBlocks: (args) => watchBlocks(client, args),\n watchBlockNumber: (args) => watchBlockNumber(client, args),\n watchContractEvent: (args) => watchContractEvent(client, args),\n watchEvent: (args) => watchEvent(client, args),\n watchPendingTransactions: (args) => watchPendingTransactions(client, args),\n }\n}\n","import type { Address } from 'abitype'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Account, ParseAccount } from '../types/account.js'\nimport type { Chain } from '../types/chain.js'\nimport type { PublicRpcSchema, RpcSchema } from '../types/eip1193.js'\nimport type { Prettify } from '../types/utils.js'\nimport {\n type Client,\n type ClientConfig,\n type CreateClientErrorType,\n createClient,\n} from './createClient.js'\nimport { type PublicActions, publicActions } from './decorators/public.js'\nimport type { Transport } from './transports/createTransport.js'\n\nexport type PublicClientConfig<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n accountOrAddress extends Account | Address | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = Prettify<\n Pick<\n ClientConfig,\n | 'batch'\n | 'cacheTime'\n | 'ccipRead'\n | 'chain'\n | 'experimental_blockTag'\n | 'key'\n | 'name'\n | 'pollingInterval'\n | 'rpcSchema'\n | 'transport'\n >\n>\n\nexport type PublicClient<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n accountOrAddress extends Account | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = Prettify<\n Client<\n transport,\n chain,\n accountOrAddress,\n rpcSchema extends RpcSchema\n ? [...PublicRpcSchema, ...rpcSchema]\n : PublicRpcSchema,\n PublicActions\n >\n>\n\nexport type CreatePublicClientErrorType = CreateClientErrorType | ErrorType\n\n/**\n * Creates a Public Client with a given [Transport](https://viem.sh/docs/clients/intro) configured for a [Chain](https://viem.sh/docs/clients/chains).\n *\n * - Docs: https://viem.sh/docs/clients/public\n *\n * A Public Client is an interface to \"public\" [JSON-RPC API](https://ethereum.org/en/developers/docs/apis/json-rpc/) methods such as retrieving block numbers, transactions, reading from smart contracts, etc through [Public Actions](/docs/actions/public/introduction).\n *\n * @param config - {@link PublicClientConfig}\n * @returns A Public Client. {@link PublicClient}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n */\nexport function createPublicClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n accountOrAddress extends Account | Address | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n parameters: PublicClientConfig,\n): PublicClient, rpcSchema> {\n const { key = 'public', name = 'Public Client' } = parameters\n const client = createClient({\n ...parameters,\n key,\n name,\n type: 'publicClient',\n })\n return client.extend(publicActions) as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { EIP1193RequestFn } from '../../types/eip1193.js'\nimport type { OneOf } from '../../types/utils.js'\nimport { buildRequest } from '../../utils/buildRequest.js'\nimport { uid as uid_ } from '../../utils/uid.js'\nimport type { ClientConfig } from '../createClient.js'\n\nexport type TransportConfig<\n type extends string = string,\n eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn,\n> = {\n /** The name of the transport. */\n name: string\n /** The key of the transport. */\n key: string\n /** Methods to include or exclude from executing RPC requests. */\n methods?:\n | OneOf<\n | {\n include?: string[] | undefined\n }\n | {\n exclude?: string[] | undefined\n }\n >\n | undefined\n /** The JSON-RPC request function that matches the EIP-1193 request spec. */\n request: eip1193RequestFn\n /** The base delay (in ms) between retries. */\n retryDelay?: number | undefined\n /** The max number of times to retry. */\n retryCount?: number | undefined\n /** The timeout (in ms) for requests. */\n timeout?: number | undefined\n /** The type of the transport. */\n type: type\n}\n\nexport type Transport<\n type extends string = string,\n rpcAttributes = Record,\n eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn,\n> = ({\n chain,\n}: {\n account?: Account | undefined\n chain?: chain | undefined\n pollingInterval?: ClientConfig['pollingInterval'] | undefined\n retryCount?: TransportConfig['retryCount'] | undefined\n timeout?: TransportConfig['timeout'] | undefined\n}) => {\n config: TransportConfig\n request: eip1193RequestFn\n value?: rpcAttributes | undefined\n}\n\nexport type CreateTransportErrorType = ErrorType\n\n/**\n * @description Creates an transport intended to be used with a client.\n */\nexport function createTransport<\n type extends string,\n rpcAttributes extends Record,\n>(\n {\n key,\n methods,\n name,\n request,\n retryCount = 3,\n retryDelay = 150,\n timeout,\n type,\n }: TransportConfig,\n value?: rpcAttributes | undefined,\n): ReturnType> {\n const uid = uid_()\n return {\n config: {\n key,\n methods,\n name,\n request,\n retryCount,\n retryDelay,\n timeout,\n type,\n },\n request: buildRequest(request, { methods, retryCount, retryDelay, uid }),\n value,\n }\n}\n","import { BaseError } from './base.js'\n\nexport type UrlRequiredErrorType = UrlRequiredError & {\n name: 'UrlRequiredError'\n}\nexport class UrlRequiredError extends BaseError {\n constructor() {\n super(\n 'No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.',\n {\n docsPath: '/docs/clients/intro',\n name: 'UrlRequiredError',\n },\n )\n }\n}\n","import { RpcRequestError } from '../../errors/request.js'\nimport {\n UrlRequiredError,\n type UrlRequiredErrorType,\n} from '../../errors/transport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { EIP1193RequestFn, RpcSchema } from '../../types/eip1193.js'\nimport type { RpcRequest } from '../../types/rpc.js'\nimport { createBatchScheduler } from '../../utils/promise/createBatchScheduler.js'\nimport {\n getHttpRpcClient,\n type HttpRpcClientOptions,\n} from '../../utils/rpc/http.js'\n\nimport {\n type CreateTransportErrorType,\n createTransport,\n type Transport,\n type TransportConfig,\n} from './createTransport.js'\n\nexport type HttpTransportConfig<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n> = {\n /**\n * Whether to enable Batch JSON-RPC.\n * @link https://www.jsonrpc.org/specification#batch\n */\n batch?:\n | boolean\n | {\n /** The maximum number of JSON-RPC requests to send in a batch. @default 1_000 */\n batchSize?: number | undefined\n /** The maximum number of milliseconds to wait before sending a batch. @default 0 */\n wait?: number | undefined\n }\n | undefined\n fetchFn?: HttpRpcClientOptions['fetchFn'] | undefined\n /**\n * Request configuration to pass to `fetch`.\n * @link https://developer.mozilla.org/en-US/docs/Web/API/fetch\n */\n fetchOptions?: HttpRpcClientOptions['fetchOptions'] | undefined\n /** A callback to handle the response from `fetch`. */\n onFetchRequest?: HttpRpcClientOptions['onRequest'] | undefined\n /** A callback to handle the response from `fetch`. */\n onFetchResponse?: HttpRpcClientOptions['onResponse'] | undefined\n /** The key of the HTTP transport. */\n key?: TransportConfig['key'] | undefined\n /** Methods to include or exclude from executing RPC requests. */\n methods?: TransportConfig['methods'] | undefined\n /** The name of the HTTP transport. */\n name?: TransportConfig['name'] | undefined\n /** Whether to return JSON RPC errors as responses instead of throwing. */\n raw?: raw | boolean | undefined\n /** The max number of times to retry. */\n retryCount?: TransportConfig['retryCount'] | undefined\n /** The base delay (in ms) between retries. */\n retryDelay?: TransportConfig['retryDelay'] | undefined\n /** Typed JSON-RPC schema for the transport. */\n rpcSchema?: rpcSchema | RpcSchema | undefined\n /** The timeout (in ms) for the HTTP request. Default: 10_000 */\n timeout?: TransportConfig['timeout'] | undefined\n}\n\nexport type HttpTransport<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n> = Transport<\n 'http',\n {\n fetchOptions?: HttpTransportConfig['fetchOptions'] | undefined\n url?: string | undefined\n },\n EIP1193RequestFn\n>\n\nexport type HttpTransportErrorType =\n | CreateTransportErrorType\n | UrlRequiredErrorType\n | ErrorType\n\n/**\n * @description Creates a HTTP transport that connects to a JSON-RPC API.\n */\nexport function http<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n>(\n /** URL of the JSON-RPC API. Defaults to the chain's public RPC URL. */\n url?: string | undefined,\n config: HttpTransportConfig = {},\n): HttpTransport {\n const {\n batch,\n fetchFn,\n fetchOptions,\n key = 'http',\n methods,\n name = 'HTTP JSON-RPC',\n onFetchRequest,\n onFetchResponse,\n retryDelay,\n raw,\n } = config\n return ({ chain, retryCount: retryCount_, timeout: timeout_ }) => {\n const { batchSize = 1000, wait = 0 } =\n typeof batch === 'object' ? batch : {}\n const retryCount = config.retryCount ?? retryCount_\n const timeout = timeout_ ?? config.timeout ?? 10_000\n const url_ = url || chain?.rpcUrls.default.http[0]\n if (!url_) throw new UrlRequiredError()\n\n const rpcClient = getHttpRpcClient(url_, {\n fetchFn,\n fetchOptions,\n onRequest: onFetchRequest,\n onResponse: onFetchResponse,\n timeout,\n })\n\n return createTransport(\n {\n key,\n methods,\n name,\n async request({ method, params }) {\n const body = { method, params }\n\n const { schedule } = createBatchScheduler({\n id: url_,\n wait,\n shouldSplitBatch(requests) {\n return requests.length > batchSize\n },\n fn: (body: RpcRequest[]) =>\n rpcClient.request({\n body,\n }),\n sort: (a, b) => a.id - b.id,\n })\n\n const fn = async (body: RpcRequest) =>\n batch\n ? schedule(body)\n : [\n await rpcClient.request({\n body,\n }),\n ]\n\n const [{ error, result }] = await fn(body)\n\n if (raw) return { error, result }\n if (error)\n throw new RpcRequestError({\n body,\n error,\n url: url_,\n })\n return result\n },\n retryCount,\n retryDelay,\n timeout,\n type: 'http',\n },\n {\n fetchOptions,\n url: url_,\n },\n )\n }\n}\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n type Abi,\n type AbiEvent,\n type AbiFunction,\n type AbiParameter,\n type AbiParameterKind,\n type AbiParameterToPrimitiveType,\n type AbiStateMutability,\n type Address,\n CircularReferenceError,\n InvalidAbiItemError,\n InvalidAbiParameterError,\n InvalidAbiParametersError,\n InvalidAbiTypeParameterError,\n InvalidFunctionModifierError,\n InvalidModifierError,\n InvalidParameterError,\n InvalidParenthesisError,\n InvalidSignatureError,\n InvalidStructSignatureError,\n type Narrow,\n type ParseAbi,\n type ParseAbiItem,\n type ParseAbiParameter,\n type ParseAbiParameters,\n parseAbi,\n parseAbiItem,\n parseAbiParameter,\n parseAbiParameters,\n SolidityProtectedKeywordError,\n type TypedData,\n type TypedDataDomain,\n type TypedDataParameter,\n UnknownSignatureError,\n UnknownTypeError,\n} from 'abitype'\nexport type {\n BlockOverrides,\n Rpc as RpcBlockOverrides,\n} from 'ox/BlockOverrides'\nexport type { EntryPointVersion } from './account-abstraction/types/entryPointVersion.js'\nexport type {\n RpcEstimateUserOperationGasReturnType,\n RpcGetUserOperationByHashReturnType,\n RpcUserOperation,\n RpcUserOperationReceipt,\n RpcUserOperationRequest,\n} from './account-abstraction/types/rpc.js'\nexport type {\n EstimateUserOperationGasReturnType,\n GetUserOperationByHashReturnType,\n PackedUserOperation,\n UserOperation,\n UserOperationReceipt,\n UserOperationRequest,\n} from './account-abstraction/types/userOperation.js'\nexport type {\n Account,\n AccountSource,\n CustomSource,\n HDAccount,\n HDOptions,\n JsonRpcAccount,\n LocalAccount,\n PrivateKeyAccount,\n} from './accounts/types.js'\nexport type {\n GetEnsAddressErrorType,\n GetEnsAddressParameters,\n GetEnsAddressReturnType,\n} from './actions/ens/getEnsAddress.js'\nexport type {\n GetEnsAvatarErrorType,\n GetEnsAvatarParameters,\n GetEnsAvatarReturnType,\n} from './actions/ens/getEnsAvatar.js'\nexport type {\n GetEnsNameErrorType,\n GetEnsNameParameters,\n GetEnsNameReturnType,\n} from './actions/ens/getEnsName.js'\nexport type {\n GetEnsResolverErrorType,\n GetEnsResolverParameters,\n GetEnsResolverReturnType,\n} from './actions/ens/getEnsResolver.js'\nexport type {\n GetEnsTextErrorType,\n GetEnsTextParameters,\n GetEnsTextReturnType,\n} from './actions/ens/getEnsText.js'\nexport {\n type GetContractErrorType,\n type GetContractParameters,\n type GetContractReturnType,\n getContract,\n} from './actions/getContract.js'\nexport type {\n CallErrorType,\n CallParameters,\n CallReturnType,\n} from './actions/public/call.js'\nexport type {\n CreateAccessListErrorType,\n CreateAccessListParameters,\n CreateAccessListReturnType,\n} from './actions/public/createAccessList.js'\nexport type {\n CreateBlockFilterErrorType,\n CreateBlockFilterReturnType,\n} from './actions/public/createBlockFilter.js'\nexport type {\n CreateContractEventFilterErrorType,\n CreateContractEventFilterParameters,\n CreateContractEventFilterReturnType,\n} from './actions/public/createContractEventFilter.js'\nexport type {\n CreateEventFilterErrorType,\n CreateEventFilterParameters,\n CreateEventFilterReturnType,\n} from './actions/public/createEventFilter.js'\nexport type {\n CreatePendingTransactionFilterErrorType,\n CreatePendingTransactionFilterReturnType,\n} from './actions/public/createPendingTransactionFilter.js'\nexport type {\n EstimateContractGasErrorType,\n EstimateContractGasParameters,\n EstimateContractGasReturnType,\n} from './actions/public/estimateContractGas.js'\nexport type {\n EstimateFeesPerGasErrorType,\n EstimateFeesPerGasParameters,\n EstimateFeesPerGasReturnType,\n} from './actions/public/estimateFeesPerGas.js'\nexport type {\n EstimateGasErrorType,\n EstimateGasParameters,\n EstimateGasReturnType,\n} from './actions/public/estimateGas.js'\nexport type {\n EstimateMaxPriorityFeePerGasErrorType,\n EstimateMaxPriorityFeePerGasParameters,\n EstimateMaxPriorityFeePerGasReturnType,\n} from './actions/public/estimateMaxPriorityFeePerGas.js'\nexport type {\n FillTransactionErrorType,\n FillTransactionParameters,\n FillTransactionReturnType,\n} from './actions/public/fillTransaction.js'\nexport type {\n GetBalanceErrorType,\n GetBalanceParameters,\n GetBalanceReturnType,\n} from './actions/public/getBalance.js'\nexport type {\n GetBlobBaseFeeErrorType,\n GetBlobBaseFeeReturnType,\n} from './actions/public/getBlobBaseFee.js'\nexport type {\n GetBlockErrorType,\n GetBlockParameters,\n GetBlockReturnType,\n} from './actions/public/getBlock.js'\nexport type {\n GetBlockNumberErrorType,\n GetBlockNumberParameters,\n GetBlockNumberReturnType,\n} from './actions/public/getBlockNumber.js'\nexport type {\n GetBlockTransactionCountErrorType,\n GetBlockTransactionCountParameters,\n GetBlockTransactionCountReturnType,\n} from './actions/public/getBlockTransactionCount.js'\nexport type {\n GetChainIdErrorType,\n GetChainIdReturnType,\n} from './actions/public/getChainId.js'\nexport type {\n /** @deprecated Use `GetCodeErrorType` instead */\n GetCodeErrorType as GetBytecodeErrorType,\n GetCodeErrorType,\n /** @deprecated Use `GetCodeParameters` instead */\n GetCodeParameters as GetBytecodeParameters,\n GetCodeParameters,\n /** @deprecated Use `GetCodeReturnType` instead */\n GetCodeReturnType as GetBytecodeReturnType,\n GetCodeReturnType,\n} from './actions/public/getCode.js'\nexport type {\n GetContractEventsErrorType,\n GetContractEventsParameters,\n GetContractEventsReturnType,\n} from './actions/public/getContractEvents.js'\nexport type {\n GetDelegationErrorType,\n GetDelegationParameters,\n GetDelegationReturnType,\n} from './actions/public/getDelegation.js'\nexport type {\n GetEip712DomainErrorType,\n GetEip712DomainParameters,\n GetEip712DomainReturnType,\n} from './actions/public/getEip712Domain.js'\nexport type {\n GetFeeHistoryErrorType,\n GetFeeHistoryParameters,\n GetFeeHistoryReturnType,\n} from './actions/public/getFeeHistory.js'\nexport type {\n GetFilterChangesErrorType,\n GetFilterChangesParameters,\n GetFilterChangesReturnType,\n} from './actions/public/getFilterChanges.js'\nexport type {\n GetFilterLogsErrorType,\n GetFilterLogsParameters,\n GetFilterLogsReturnType,\n} from './actions/public/getFilterLogs.js'\nexport type {\n GetGasPriceErrorType,\n GetGasPriceReturnType,\n} from './actions/public/getGasPrice.js'\nexport type {\n GetLogsErrorType,\n GetLogsParameters,\n GetLogsReturnType,\n} from './actions/public/getLogs.js'\nexport type {\n GetProofErrorType,\n GetProofParameters,\n GetProofReturnType,\n} from './actions/public/getProof.js'\nexport type {\n GetStorageAtErrorType,\n GetStorageAtParameters,\n GetStorageAtReturnType,\n} from './actions/public/getStorageAt.js'\nexport type {\n GetTransactionErrorType,\n GetTransactionParameters,\n GetTransactionReturnType,\n} from './actions/public/getTransaction.js'\nexport type {\n GetTransactionConfirmationsErrorType,\n GetTransactionConfirmationsParameters,\n GetTransactionConfirmationsReturnType,\n} from './actions/public/getTransactionConfirmations.js'\nexport type {\n GetTransactionCountErrorType,\n GetTransactionCountParameters,\n GetTransactionCountReturnType,\n} from './actions/public/getTransactionCount.js'\nexport type {\n GetTransactionReceiptErrorType,\n GetTransactionReceiptParameters,\n GetTransactionReceiptReturnType,\n} from './actions/public/getTransactionReceipt.js'\nexport type {\n MulticallErrorType,\n MulticallParameters,\n MulticallReturnType,\n} from './actions/public/multicall.js'\nexport type {\n ReadContractErrorType,\n ReadContractParameters,\n ReadContractReturnType,\n} from './actions/public/readContract.js'\nexport type {\n SimulateBlocksErrorType,\n SimulateBlocksParameters,\n SimulateBlocksReturnType,\n} from './actions/public/simulateBlocks.js'\nexport type {\n SimulateCallsErrorType,\n SimulateCallsParameters,\n SimulateCallsReturnType,\n} from './actions/public/simulateCalls.js'\nexport type {\n GetMutabilityAwareValue,\n SimulateContractErrorType,\n SimulateContractParameters,\n SimulateContractReturnType,\n} from './actions/public/simulateContract.js'\nexport type {\n UninstallFilterErrorType,\n UninstallFilterParameters,\n UninstallFilterReturnType,\n} from './actions/public/uninstallFilter.js'\nexport type {\n VerifyHashErrorType as VerifyHashActionErrorType,\n VerifyHashParameters as VerifyHashActionParameters,\n VerifyHashReturnType as VerifyHashActionReturnType,\n} from './actions/public/verifyHash.js'\nexport type {\n VerifyMessageErrorType as VerifyMessageActionErrorType,\n VerifyMessageParameters as VerifyMessageActionParameters,\n VerifyMessageReturnType as VerifyMessageActionReturnType,\n} from './actions/public/verifyMessage.js'\nexport type {\n VerifyTypedDataErrorType as VerifyTypedDataActionErrorType,\n VerifyTypedDataParameters as VerifyTypedDataActionParameters,\n VerifyTypedDataReturnType as VerifyTypedDataActionReturnType,\n} from './actions/public/verifyTypedData.js'\nexport type {\n ReplacementReason,\n ReplacementReturnType,\n WaitForTransactionReceiptErrorType,\n WaitForTransactionReceiptParameters,\n WaitForTransactionReceiptReturnType,\n} from './actions/public/waitForTransactionReceipt.js'\nexport type {\n OnBlockNumberFn,\n OnBlockNumberParameter,\n WatchBlockNumberErrorType,\n WatchBlockNumberParameters,\n WatchBlockNumberReturnType,\n} from './actions/public/watchBlockNumber.js'\nexport type {\n OnBlock,\n OnBlockParameter,\n WatchBlocksErrorType,\n WatchBlocksParameters,\n WatchBlocksReturnType,\n} from './actions/public/watchBlocks.js'\nexport type {\n WatchContractEventErrorType,\n WatchContractEventOnLogsFn,\n WatchContractEventOnLogsParameter,\n WatchContractEventParameters,\n WatchContractEventReturnType,\n} from './actions/public/watchContractEvent.js'\nexport type {\n WatchEventErrorType,\n WatchEventOnLogsFn,\n WatchEventOnLogsParameter,\n WatchEventParameters,\n WatchEventReturnType,\n} from './actions/public/watchEvent.js'\nexport type {\n OnTransactionsFn,\n OnTransactionsParameter,\n WatchPendingTransactionsErrorType,\n WatchPendingTransactionsParameters,\n WatchPendingTransactionsReturnType,\n} from './actions/public/watchPendingTransactions.js'\nexport type {\n DropTransactionErrorType,\n DropTransactionParameters,\n} from './actions/test/dropTransaction.js'\nexport type {\n DumpStateErrorType,\n DumpStateReturnType,\n} from './actions/test/dumpState.js'\nexport type {\n GetAutomineErrorType,\n GetAutomineReturnType,\n} from './actions/test/getAutomine.js'\nexport type {\n GetTxpoolContentErrorType,\n GetTxpoolContentReturnType,\n} from './actions/test/getTxpoolContent.js'\nexport type {\n GetTxpoolStatusErrorType,\n GetTxpoolStatusReturnType,\n} from './actions/test/getTxpoolStatus.js'\nexport type {\n ImpersonateAccountErrorType,\n ImpersonateAccountParameters,\n} from './actions/test/impersonateAccount.js'\nexport type {\n IncreaseTimeErrorType,\n IncreaseTimeParameters,\n} from './actions/test/increaseTime.js'\nexport type {\n InspectTxpoolErrorType,\n InspectTxpoolReturnType,\n} from './actions/test/inspectTxpool.js'\nexport type {\n LoadStateErrorType,\n LoadStateParameters,\n LoadStateReturnType,\n} from './actions/test/loadState.js'\nexport type { MineErrorType, MineParameters } from './actions/test/mine.js'\nexport type { RemoveBlockTimestampIntervalErrorType } from './actions/test/removeBlockTimestampInterval.js'\nexport type { ResetErrorType, ResetParameters } from './actions/test/reset.js'\nexport type {\n RevertErrorType,\n RevertParameters,\n} from './actions/test/revert.js'\nexport type {\n SendUnsignedTransactionErrorType,\n SendUnsignedTransactionParameters,\n SendUnsignedTransactionReturnType,\n} from './actions/test/sendUnsignedTransaction.js'\nexport type { SetAutomineErrorType } from './actions/test/setAutomine.js'\nexport type {\n SetBalanceErrorType,\n SetBalanceParameters,\n} from './actions/test/setBalance.js'\nexport type {\n SetBlockGasLimitErrorType,\n SetBlockGasLimitParameters,\n} from './actions/test/setBlockGasLimit.js'\nexport type {\n SetBlockTimestampIntervalErrorType,\n SetBlockTimestampIntervalParameters,\n} from './actions/test/setBlockTimestampInterval.js'\nexport type {\n SetCodeErrorType,\n SetCodeParameters,\n} from './actions/test/setCode.js'\nexport type {\n SetCoinbaseErrorType,\n SetCoinbaseParameters,\n} from './actions/test/setCoinbase.js'\nexport type {\n SetIntervalMiningErrorType,\n SetIntervalMiningParameters,\n} from './actions/test/setIntervalMining.js'\nexport type { SetLoggingEnabledErrorType } from './actions/test/setLoggingEnabled.js'\nexport type {\n SetMinGasPriceErrorType,\n SetMinGasPriceParameters,\n} from './actions/test/setMinGasPrice.js'\nexport type {\n SetNextBlockBaseFeePerGasErrorType,\n SetNextBlockBaseFeePerGasParameters,\n} from './actions/test/setNextBlockBaseFeePerGas.js'\nexport type {\n SetNextBlockTimestampErrorType,\n SetNextBlockTimestampParameters,\n} from './actions/test/setNextBlockTimestamp.js'\nexport type {\n SetNonceErrorType,\n SetNonceParameters,\n} from './actions/test/setNonce.js'\nexport type { SetRpcUrlErrorType } from './actions/test/setRpcUrl.js'\nexport type {\n SetStorageAtErrorType,\n SetStorageAtParameters,\n} from './actions/test/setStorageAt.js'\nexport type { SnapshotErrorType } from './actions/test/snapshot.js'\nexport type {\n StopImpersonatingAccountErrorType,\n StopImpersonatingAccountParameters,\n} from './actions/test/stopImpersonatingAccount.js'\nexport type {\n AddChainErrorType,\n AddChainParameters,\n} from './actions/wallet/addChain.js'\nexport type {\n DeployContractErrorType,\n DeployContractParameters,\n DeployContractReturnType,\n} from './actions/wallet/deployContract.js'\nexport type {\n GetAddressesErrorType,\n GetAddressesReturnType,\n} from './actions/wallet/getAddresses.js'\nexport type {\n GetCallsStatusErrorType,\n GetCallsStatusParameters,\n GetCallsStatusReturnType,\n} from './actions/wallet/getCallsStatus.js'\nexport type {\n GetCapabilitiesErrorType,\n GetCapabilitiesParameters,\n GetCapabilitiesReturnType,\n} from './actions/wallet/getCapabilities.js'\nexport type {\n GetPermissionsErrorType,\n GetPermissionsReturnType,\n} from './actions/wallet/getPermissions.js'\nexport type {\n PrepareAuthorizationErrorType,\n PrepareAuthorizationParameters,\n PrepareAuthorizationReturnType,\n} from './actions/wallet/prepareAuthorization.js'\nexport type {\n PrepareTransactionRequestErrorType,\n PrepareTransactionRequestParameters,\n PrepareTransactionRequestParameterType,\n PrepareTransactionRequestRequest,\n PrepareTransactionRequestReturnType,\n} from './actions/wallet/prepareTransactionRequest.js'\nexport type {\n RequestAddressesErrorType,\n RequestAddressesReturnType,\n} from './actions/wallet/requestAddresses.js'\nexport type {\n RequestPermissionsErrorType,\n RequestPermissionsParameters,\n RequestPermissionsReturnType,\n} from './actions/wallet/requestPermissions.js'\nexport type {\n SendCallsErrorType,\n SendCallsParameters,\n SendCallsReturnType,\n} from './actions/wallet/sendCalls.js'\nexport type {\n SendCallsSyncErrorType,\n SendCallsSyncParameters,\n SendCallsSyncReturnType,\n} from './actions/wallet/sendCallsSync.js'\nexport type {\n SendRawTransactionErrorType,\n SendRawTransactionParameters,\n SendRawTransactionReturnType,\n} from './actions/wallet/sendRawTransaction.js'\nexport type {\n SendRawTransactionSyncErrorType,\n SendRawTransactionSyncParameters,\n SendRawTransactionSyncReturnType,\n} from './actions/wallet/sendRawTransactionSync.js'\nexport type {\n SendTransactionErrorType,\n SendTransactionParameters,\n SendTransactionRequest,\n SendTransactionReturnType,\n} from './actions/wallet/sendTransaction.js'\nexport type {\n SendTransactionSyncErrorType,\n SendTransactionSyncParameters,\n SendTransactionSyncRequest,\n SendTransactionSyncReturnType,\n} from './actions/wallet/sendTransactionSync.js'\nexport type {\n ShowCallsStatusErrorType,\n ShowCallsStatusParameters,\n ShowCallsStatusReturnType,\n} from './actions/wallet/showCallsStatus.js'\nexport type {\n SignAuthorizationErrorType,\n SignAuthorizationParameters,\n SignAuthorizationReturnType,\n} from './actions/wallet/signAuthorization.js'\nexport type {\n SignMessageErrorType,\n SignMessageParameters,\n SignMessageReturnType,\n} from './actions/wallet/signMessage.js'\nexport type {\n SignTransactionErrorType,\n SignTransactionParameters,\n SignTransactionRequest,\n SignTransactionReturnType,\n} from './actions/wallet/signTransaction.js'\nexport type {\n SignTypedDataErrorType,\n SignTypedDataParameters,\n SignTypedDataReturnType,\n} from './actions/wallet/signTypedData.js'\nexport type {\n SwitchChainErrorType,\n SwitchChainParameters,\n} from './actions/wallet/switchChain.js'\nexport type {\n WaitForCallsStatusErrorType,\n WaitForCallsStatusParameters,\n WaitForCallsStatusReturnType,\n WaitForCallsStatusTimeoutErrorType,\n} from './actions/wallet/waitForCallsStatus.js'\nexport { WaitForCallsStatusTimeoutError } from './actions/wallet/waitForCallsStatus.js'\nexport type {\n WatchAssetErrorType,\n WatchAssetParameters,\n WatchAssetReturnType,\n} from './actions/wallet/watchAsset.js'\nexport type {\n WriteContractErrorType,\n WriteContractParameters,\n WriteContractReturnType,\n} from './actions/wallet/writeContract.js'\nexport type {\n WriteContractSyncErrorType,\n WriteContractSyncParameters,\n WriteContractSyncReturnType,\n} from './actions/wallet/writeContractSync.js'\nexport {\n type Client,\n type ClientConfig,\n type CreateClientErrorType,\n createClient,\n type MulticallBatchOptions,\n rpcSchema,\n} from './clients/createClient.js'\nexport {\n type CreatePublicClientErrorType,\n createPublicClient,\n type PublicClient,\n type PublicClientConfig,\n} from './clients/createPublicClient.js'\nexport {\n type CreateTestClientErrorType,\n createTestClient,\n type TestClient,\n type TestClientConfig,\n} from './clients/createTestClient.js'\nexport {\n type CreateWalletClientErrorType,\n createWalletClient,\n type WalletClient,\n type WalletClientConfig,\n} from './clients/createWalletClient.js'\nexport {\n type PublicActions,\n publicActions,\n} from './clients/decorators/public.js'\nexport {\n type TestActions,\n testActions,\n} from './clients/decorators/test.js'\nexport {\n type WalletActions,\n walletActions,\n} from './clients/decorators/wallet.js'\nexport {\n type CreateTransportErrorType,\n createTransport,\n type Transport,\n type TransportConfig,\n} from './clients/transports/createTransport.js'\nexport {\n type CustomTransport,\n type CustomTransportConfig,\n type CustomTransportErrorType,\n custom,\n} from './clients/transports/custom.js'\nexport {\n type FallbackTransport,\n type FallbackTransportConfig,\n type FallbackTransportErrorType,\n fallback,\n shouldThrow,\n} from './clients/transports/fallback.js'\nexport {\n type HttpTransport,\n type HttpTransportConfig,\n type HttpTransportErrorType,\n http,\n} from './clients/transports/http.js'\nexport {\n type WebSocketTransport,\n type WebSocketTransportConfig,\n type WebSocketTransportErrorType,\n webSocket,\n} from './clients/transports/webSocket.js'\nexport {\n erc20Abi,\n erc20Abi_bytes32,\n erc721Abi,\n erc1155Abi,\n erc4626Abi,\n erc6492SignatureValidatorAbi,\n /** @deprecated use `erc6492SignatureValidatorAbi` instead. */\n erc6492SignatureValidatorAbi as universalSignatureValidatorAbi,\n multicall3Abi,\n} from './constants/abis.js'\nexport { ethAddress, zeroAddress } from './constants/address.js'\nexport { zeroHash } from './constants/bytes.js'\nexport {\n deploylessCallViaBytecodeBytecode,\n deploylessCallViaFactoryBytecode,\n erc6492SignatureValidatorByteCode,\n /** @deprecated use `erc6492SignatureValidatorByteCode` instead. */\n erc6492SignatureValidatorByteCode as universalSignatureValidatorByteCode,\n} from './constants/contracts.js'\nexport {\n maxInt8,\n maxInt16,\n maxInt24,\n maxInt32,\n maxInt40,\n maxInt48,\n maxInt56,\n maxInt64,\n maxInt72,\n maxInt80,\n maxInt88,\n maxInt96,\n maxInt104,\n maxInt112,\n maxInt120,\n maxInt128,\n maxInt136,\n maxInt144,\n maxInt152,\n maxInt160,\n maxInt168,\n maxInt176,\n maxInt184,\n maxInt192,\n maxInt200,\n maxInt208,\n maxInt216,\n maxInt224,\n maxInt232,\n maxInt240,\n maxInt248,\n maxInt256,\n maxUint8,\n maxUint16,\n maxUint24,\n maxUint32,\n maxUint40,\n maxUint48,\n maxUint56,\n maxUint64,\n maxUint72,\n maxUint80,\n maxUint88,\n maxUint96,\n maxUint104,\n maxUint112,\n maxUint120,\n maxUint128,\n maxUint136,\n maxUint144,\n maxUint152,\n maxUint160,\n maxUint168,\n maxUint176,\n maxUint184,\n maxUint192,\n maxUint200,\n maxUint208,\n maxUint216,\n maxUint224,\n maxUint232,\n maxUint240,\n maxUint248,\n maxUint256,\n minInt8,\n minInt16,\n minInt24,\n minInt32,\n minInt40,\n minInt48,\n minInt56,\n minInt64,\n minInt72,\n minInt80,\n minInt88,\n minInt96,\n minInt104,\n minInt112,\n minInt120,\n minInt128,\n minInt136,\n minInt144,\n minInt152,\n minInt160,\n minInt168,\n minInt176,\n minInt184,\n minInt192,\n minInt200,\n minInt208,\n minInt216,\n minInt224,\n minInt232,\n minInt240,\n minInt248,\n minInt256,\n} from './constants/number.js'\nexport { presignMessagePrefix } from './constants/strings.js'\nexport { etherUnits, gweiUnits, weiUnits } from './constants/unit.js'\nexport {\n AbiConstructorNotFoundError,\n type AbiConstructorNotFoundErrorType,\n AbiConstructorParamsNotFoundError,\n type AbiConstructorParamsNotFoundErrorType,\n AbiDecodingDataSizeInvalidError,\n type AbiDecodingDataSizeInvalidErrorType,\n AbiDecodingDataSizeTooSmallError,\n type AbiDecodingDataSizeTooSmallErrorType,\n AbiDecodingZeroDataError,\n type AbiDecodingZeroDataErrorType,\n AbiEncodingArrayLengthMismatchError,\n type AbiEncodingArrayLengthMismatchErrorType,\n AbiEncodingBytesSizeMismatchError,\n type AbiEncodingBytesSizeMismatchErrorType,\n AbiEncodingLengthMismatchError,\n type AbiEncodingLengthMismatchErrorType,\n AbiErrorInputsNotFoundError,\n type AbiErrorInputsNotFoundErrorType,\n AbiErrorNotFoundError,\n type AbiErrorNotFoundErrorType,\n AbiErrorSignatureNotFoundError,\n type AbiErrorSignatureNotFoundErrorType,\n AbiEventNotFoundError,\n type AbiEventNotFoundErrorType,\n AbiEventSignatureEmptyTopicsError,\n type AbiEventSignatureEmptyTopicsErrorType,\n AbiEventSignatureNotFoundError,\n type AbiEventSignatureNotFoundErrorType,\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n AbiFunctionOutputsNotFoundError,\n type AbiFunctionOutputsNotFoundErrorType,\n AbiFunctionSignatureNotFoundError,\n type AbiFunctionSignatureNotFoundErrorType,\n BytesSizeMismatchError,\n type BytesSizeMismatchErrorType,\n DecodeLogDataMismatch,\n type DecodeLogDataMismatchErrorType,\n DecodeLogTopicsMismatch,\n type DecodeLogTopicsMismatchErrorType,\n InvalidAbiDecodingTypeError,\n type InvalidAbiDecodingTypeErrorType,\n InvalidAbiEncodingTypeError,\n type InvalidAbiEncodingTypeErrorType,\n InvalidArrayError,\n type InvalidArrayErrorType,\n InvalidDefinitionTypeError,\n type InvalidDefinitionTypeErrorType,\n UnsupportedPackedAbiType,\n type UnsupportedPackedAbiTypeErrorType,\n} from './errors/abi.js'\nexport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from './errors/address.js'\nexport { BaseError, type BaseErrorType, setErrorConfig } from './errors/base.js'\nexport {\n BlockNotFoundError,\n type BlockNotFoundErrorType,\n} from './errors/block.js'\nexport {\n BundleFailedError,\n type BundleFailedErrorType,\n} from './errors/calls.js'\nexport {\n ChainDoesNotSupportContract,\n type ChainDoesNotSupportContractErrorType,\n ChainMismatchError,\n type ChainMismatchErrorType,\n ChainNotFoundError,\n type ChainNotFoundErrorType,\n ClientChainNotConfiguredError,\n type ClientChainNotConfiguredErrorType,\n InvalidChainIdError,\n type InvalidChainIdErrorType,\n} from './errors/chain.js'\nexport {\n CallExecutionError,\n type CallExecutionErrorType,\n ContractFunctionExecutionError,\n type ContractFunctionExecutionErrorType,\n ContractFunctionRevertedError,\n type ContractFunctionRevertedErrorType,\n ContractFunctionZeroDataError,\n type ContractFunctionZeroDataErrorType,\n CounterfactualDeploymentFailedError,\n type CounterfactualDeploymentFailedErrorType,\n RawContractError,\n type RawContractErrorType,\n} from './errors/contract.js'\nexport {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n SliceOffsetOutOfBoundsError,\n type SliceOffsetOutOfBoundsErrorType,\n} from './errors/data.js'\nexport {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n InvalidBytesBooleanError,\n type InvalidBytesBooleanErrorType,\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n InvalidHexValueError,\n type InvalidHexValueErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from './errors/encoding.js'\nexport {\n type EnsAvatarInvalidMetadataError,\n type EnsAvatarInvalidMetadataErrorType,\n EnsAvatarInvalidNftUriError,\n type EnsAvatarInvalidNftUriErrorType,\n EnsAvatarUnsupportedNamespaceError,\n type EnsAvatarUnsupportedNamespaceErrorType,\n EnsAvatarUriResolutionError,\n type EnsAvatarUriResolutionErrorType,\n EnsInvalidChainIdError,\n type EnsInvalidChainIdErrorType,\n} from './errors/ens.js'\nexport {\n EstimateGasExecutionError,\n type EstimateGasExecutionErrorType,\n} from './errors/estimateGas.js'\nexport {\n BaseFeeScalarError,\n type BaseFeeScalarErrorType,\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n MaxFeePerGasTooLowError,\n type MaxFeePerGasTooLowErrorType,\n} from './errors/fee.js'\nexport {\n FilterTypeNotSupportedError,\n type FilterTypeNotSupportedErrorType,\n} from './errors/log.js'\nexport {\n ExecutionRevertedError,\n type ExecutionRevertedErrorType,\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n FeeCapTooLowError,\n type FeeCapTooLowErrorType,\n InsufficientFundsError,\n type InsufficientFundsErrorType,\n IntrinsicGasTooHighError,\n type IntrinsicGasTooHighErrorType,\n IntrinsicGasTooLowError,\n type IntrinsicGasTooLowErrorType,\n NonceMaxValueError,\n type NonceMaxValueErrorType,\n NonceTooHighError,\n type NonceTooHighErrorType,\n NonceTooLowError,\n type NonceTooLowErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n TransactionTypeNotSupportedError,\n type TransactionTypeNotSupportedErrorType,\n UnknownNodeError,\n type UnknownNodeErrorType,\n} from './errors/node.js'\nexport {\n HttpRequestError,\n type HttpRequestErrorType,\n RpcRequestError,\n type RpcRequestErrorType,\n SocketClosedError,\n type SocketClosedErrorType,\n TimeoutError,\n type TimeoutErrorType,\n WebSocketRequestError,\n type WebSocketRequestErrorType,\n} from './errors/request.js'\nexport {\n AtomicityNotSupportedError,\n type AtomicityNotSupportedErrorType,\n AtomicReadyWalletRejectedUpgradeError,\n type AtomicReadyWalletRejectedUpgradeErrorType,\n BundleTooLargeError,\n type BundleTooLargeErrorType,\n ChainDisconnectedError,\n type ChainDisconnectedErrorType,\n DuplicateIdError,\n type DuplicateIdErrorType,\n InternalRpcError,\n type InternalRpcErrorType,\n InvalidInputRpcError,\n type InvalidInputRpcErrorType,\n InvalidParamsRpcError,\n type InvalidParamsRpcErrorType,\n InvalidRequestRpcError,\n type InvalidRequestRpcErrorType,\n JsonRpcVersionUnsupportedError,\n type JsonRpcVersionUnsupportedErrorType,\n LimitExceededRpcError,\n type LimitExceededRpcErrorType,\n MethodNotFoundRpcError,\n type MethodNotFoundRpcErrorType,\n MethodNotSupportedRpcError,\n type MethodNotSupportedRpcErrorType,\n ParseRpcError,\n type ParseRpcErrorType,\n ProviderDisconnectedError,\n type ProviderDisconnectedErrorType,\n ProviderRpcError,\n type ProviderRpcErrorCode,\n type ProviderRpcErrorType,\n ResourceNotFoundRpcError,\n type ResourceNotFoundRpcErrorType,\n ResourceUnavailableRpcError,\n type ResourceUnavailableRpcErrorType,\n RpcError,\n type RpcErrorCode,\n type RpcErrorType,\n SwitchChainError,\n TransactionRejectedRpcError,\n type TransactionRejectedRpcErrorType,\n UnauthorizedProviderError,\n type UnauthorizedProviderErrorType,\n UnknownBundleIdError,\n type UnknownBundleIdErrorType,\n UnknownRpcError,\n type UnknownRpcErrorType,\n UnsupportedChainIdError,\n type UnsupportedChainIdErrorType,\n UnsupportedNonOptionalCapabilityError,\n type UnsupportedNonOptionalCapabilityErrorType,\n UnsupportedProviderMethodError,\n type UnsupportedProviderMethodErrorType,\n UserRejectedRequestError,\n type UserRejectedRequestErrorType,\n} from './errors/rpc.js'\nexport {\n AccountStateConflictError,\n type AccountStateConflictErrorType,\n StateAssignmentConflictError,\n type StateAssignmentConflictErrorType,\n} from './errors/stateOverride.js'\nexport {\n FeeConflictError,\n type FeeConflictErrorType,\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n InvalidSerializableTransactionError,\n type InvalidSerializableTransactionErrorType,\n InvalidSerializedTransactionError,\n type InvalidSerializedTransactionErrorType,\n InvalidSerializedTransactionTypeError,\n type InvalidSerializedTransactionTypeErrorType,\n InvalidStorageKeySizeError,\n type InvalidStorageKeySizeErrorType,\n TransactionExecutionError,\n type TransactionExecutionErrorType,\n TransactionNotFoundError,\n type TransactionNotFoundErrorType,\n TransactionReceiptNotFoundError,\n type TransactionReceiptNotFoundErrorType,\n WaitForTransactionReceiptTimeoutError,\n type WaitForTransactionReceiptTimeoutErrorType,\n} from './errors/transaction.js'\nexport {\n UrlRequiredError,\n type UrlRequiredErrorType,\n} from './errors/transport.js'\nexport {\n InvalidDomainError,\n type InvalidDomainErrorType,\n InvalidPrimaryTypeError,\n type InvalidPrimaryTypeErrorType,\n InvalidStructTypeError,\n type InvalidStructTypeErrorType,\n} from './errors/typedData.js'\nexport {\n InvalidDecimalNumberError,\n type InvalidDecimalNumberErrorType,\n} from './errors/unit.js'\nexport type {\n DeriveAccount,\n HDKey,\n ParseAccount,\n} from './types/account.js'\nexport type {\n Authorization,\n AuthorizationList,\n AuthorizationRequest,\n SerializedAuthorization,\n SerializedAuthorizationList,\n SignedAuthorization,\n SignedAuthorizationList,\n} from './types/authorization.js'\nexport type {\n Block,\n BlockIdentifier,\n BlockNumber,\n BlockTag,\n Uncle,\n} from './types/block.js'\nexport type { Call, Calls } from './types/calls.js'\nexport type {\n Capabilities,\n /** @deprecated Use `Capabilities` instead. */\n Capabilities as WalletCapabilities,\n CapabilitiesSchema,\n /** @deprecated Use `ChainIdToCapabilities` instead. */\n ChainIdToCapabilities as WalletCapabilitiesRecord,\n ChainIdToCapabilities,\n ExtractCapabilities,\n} from './types/capabilities.js'\nexport type {\n Chain,\n ChainConfig,\n ChainContract,\n ChainEstimateFeesPerGasFn,\n ChainEstimateFeesPerGasFnParameters,\n ChainFees,\n ChainFeesFnParameters,\n ChainFormatter,\n ChainFormatters,\n ChainMaxPriorityFeePerGasFn,\n ChainSerializers,\n DeriveChain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterParameters,\n ExtractChainFormatterReturnType,\n GetChainParameter,\n} from './types/chain.js'\nexport type {\n AbiEventParametersToPrimitiveTypes,\n AbiEventParameterToPrimitiveType,\n AbiEventTopicToPrimitiveType,\n AbiItem,\n AbiItemArgs,\n AbiItemName,\n ContractConstructorArgs,\n ContractErrorArgs,\n ContractErrorName,\n ContractEventArgs,\n ContractEventArgsFromTopics,\n ContractEventName,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n EventDefinition,\n ExtractAbiFunctionForArgs,\n ExtractAbiItem,\n ExtractAbiItemForArgs,\n ExtractAbiItemNames,\n GetEventArgs,\n GetValue,\n LogTopicType,\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n UnionWiden,\n Widen,\n} from './types/contract.js'\nexport type { DataSuffix } from './types/dataSuffix.js'\nexport type {\n AddEthereumChainParameter,\n BundlerRpcSchema,\n DebugBundlerRpcSchema,\n EIP1193EventMap,\n EIP1193Events,\n EIP1193Parameters,\n EIP1193Provider,\n EIP1193RequestFn,\n EIP1474Methods,\n NetworkSync,\n PaymasterRpcSchema,\n ProviderConnectInfo,\n ProviderMessage,\n ProviderRpcErrorType as EIP1193ProviderRpcErrorType,\n PublicRpcSchema,\n RpcSchema,\n RpcSchemaOverride,\n TestRpcSchema,\n WalletCallReceipt,\n WalletGetAssetsParameters,\n WalletGetAssetsReturnType,\n WalletGetCallsStatusReturnType,\n WalletGrantPermissionsParameters,\n WalletGrantPermissionsReturnType,\n WalletPermission,\n WalletPermissionCaveat,\n WalletRpcSchema,\n WalletSendCallsParameters,\n WalletSendCallsReturnType,\n WatchAssetParams,\n} from './types/eip1193.js'\nexport { ProviderRpcError as EIP1193ProviderRpcError } from './types/eip1193.js'\nexport type { BlobSidecar, BlobSidecars } from './types/eip4844.js'\nexport type { AssetGateway, AssetGatewayUrls } from './types/ens.js'\nexport type {\n FeeHistory,\n FeeValues,\n FeeValuesEIP1559,\n FeeValuesEIP4844,\n FeeValuesLegacy,\n FeeValuesType,\n} from './types/fee.js'\nexport type { Filter, FilterType } from './types/filter.js'\nexport type { GetTransactionRequestKzgParameter, Kzg } from './types/kzg.js'\nexport type { Log } from './types/log.js'\nexport type {\n ByteArray,\n CompactSignature,\n Hash,\n Hex,\n LogTopic,\n SignableMessage,\n Signature,\n} from './types/misc.js'\nexport type {\n MulticallContracts,\n MulticallResponse,\n MulticallResults,\n} from './types/multicall.js'\nexport type { Register, ResolvedRegister } from './types/register.js'\nexport type {\n Index,\n Quantity,\n RpcAccountStateOverride,\n RpcAuthorization,\n RpcAuthorizationList,\n RpcBlock,\n RpcBlockIdentifier,\n RpcBlockNumber,\n RpcFeeHistory,\n RpcFeeValues,\n RpcLog,\n RpcProof,\n RpcStateMapping,\n RpcStateOverride,\n RpcTransaction,\n RpcTransactionReceipt,\n RpcTransactionRequest,\n RpcUncle,\n Status,\n} from './types/rpc.js'\nexport type {\n StateMapping,\n StateOverride,\n} from './types/stateOverride.js'\nexport type {\n AccessList,\n Transaction,\n TransactionBase,\n TransactionEIP1559,\n TransactionEIP2930,\n TransactionEIP4844,\n TransactionEIP7702,\n TransactionLegacy,\n TransactionReceipt,\n TransactionRequest,\n TransactionRequestBase,\n TransactionRequestEIP1559,\n TransactionRequestEIP2930,\n TransactionRequestEIP4844,\n TransactionRequestEIP7702,\n TransactionRequestGeneric,\n TransactionRequestLegacy,\n TransactionSerializable,\n TransactionSerializableBase,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedGeneric,\n TransactionSerializedLegacy,\n TransactionType,\n} from './types/transaction.js'\nexport type { GetPollOptions, GetTransportConfig } from './types/transport.js'\nexport type {\n EIP712DomainDefinition,\n MessageDefinition,\n TypedDataDefinition,\n} from './types/typedData.js'\nexport type {\n Assign,\n Branded,\n Evaluate,\n ExactPartial,\n ExactRequired,\n IsNarrowable,\n IsNever,\n IsUndefined,\n IsUnion,\n LooseOmit,\n MaybePartial,\n MaybePromise,\n MaybeRequired,\n Mutable,\n NoInfer,\n NoUndefined,\n Omit,\n OneOf,\n Or,\n PartialBy,\n Prettify,\n RequiredBy,\n Some,\n UnionEvaluate,\n UnionLooseOmit,\n UnionOmit,\n UnionPartialBy,\n UnionPick,\n UnionRequiredBy,\n UnionToTuple,\n ValueOf,\n} from './types/utils.js'\nexport type { Withdrawal } from './types/withdrawal.js'\nexport {\n type DecodeAbiParametersErrorType,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n} from './utils/abi/decodeAbiParameters.js'\nexport {\n type DecodeDeployDataErrorType,\n type DecodeDeployDataParameters,\n type DecodeDeployDataReturnType,\n decodeDeployData,\n} from './utils/abi/decodeDeployData.js'\nexport {\n type DecodeErrorResultErrorType,\n type DecodeErrorResultParameters,\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from './utils/abi/decodeErrorResult.js'\nexport {\n type DecodeEventLogErrorType,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n decodeEventLog,\n} from './utils/abi/decodeEventLog.js'\nexport {\n type DecodeFunctionDataErrorType,\n type DecodeFunctionDataParameters,\n type DecodeFunctionDataReturnType,\n decodeFunctionData,\n} from './utils/abi/decodeFunctionData.js'\nexport {\n type DecodeFunctionResultErrorType,\n type DecodeFunctionResultParameters,\n type DecodeFunctionResultReturnType,\n decodeFunctionResult,\n} from './utils/abi/decodeFunctionResult.js'\nexport {\n type EncodeAbiParametersErrorType,\n type EncodeAbiParametersReturnType,\n encodeAbiParameters,\n} from './utils/abi/encodeAbiParameters.js'\nexport {\n type EncodeDeployDataErrorType,\n type EncodeDeployDataParameters,\n type EncodeDeployDataReturnType,\n encodeDeployData,\n} from './utils/abi/encodeDeployData.js'\nexport {\n type EncodeErrorResultErrorType,\n type EncodeErrorResultParameters,\n type EncodeErrorResultReturnType,\n encodeErrorResult,\n} from './utils/abi/encodeErrorResult.js'\nexport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n type EncodeEventTopicsReturnType,\n encodeEventTopics,\n} from './utils/abi/encodeEventTopics.js'\nexport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n type EncodeFunctionDataReturnType,\n encodeFunctionData,\n} from './utils/abi/encodeFunctionData.js'\nexport {\n type EncodeFunctionResultErrorType,\n type EncodeFunctionResultParameters,\n type EncodeFunctionResultReturnType,\n encodeFunctionResult,\n} from './utils/abi/encodeFunctionResult.js'\nexport {\n type EncodePackedErrorType,\n encodePacked,\n} from './utils/abi/encodePacked.js'\nexport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n type GetAbiItemReturnType,\n getAbiItem,\n} from './utils/abi/getAbiItem.js'\nexport {\n type ParseEventLogsErrorType,\n type ParseEventLogsParameters,\n type ParseEventLogsReturnType,\n parseEventLogs,\n} from './utils/abi/parseEventLogs.js'\nexport {\n type PrepareEncodeFunctionDataErrorType,\n type PrepareEncodeFunctionDataParameters,\n type PrepareEncodeFunctionDataReturnType,\n prepareEncodeFunctionData,\n} from './utils/abi/prepareEncodeFunctionData.js'\nexport {\n type ChecksumAddressErrorType,\n checksumAddress,\n type GetAddressErrorType,\n getAddress,\n} from './utils/address/getAddress.js'\nexport {\n type GetContractAddressOptions,\n type GetCreate2AddressErrorType,\n type GetCreate2AddressOptions,\n type GetCreateAddressErrorType,\n type GetCreateAddressOptions,\n getContractAddress,\n getCreate2Address,\n getCreateAddress,\n} from './utils/address/getContractAddress.js'\nexport {\n type IsAddressErrorType,\n type IsAddressOptions,\n isAddress,\n} from './utils/address/isAddress.js'\nexport {\n type IsAddressEqualErrorType,\n type IsAddressEqualReturnType,\n isAddressEqual,\n} from './utils/address/isAddressEqual.js'\nexport {\n type BlobsToCommitmentsErrorType,\n type BlobsToCommitmentsParameters,\n type BlobsToCommitmentsReturnType,\n blobsToCommitments,\n} from './utils/blob/blobsToCommitments.js'\nexport {\n blobsToProofs,\n type blobsToProofsErrorType,\n type blobsToProofsParameters,\n type blobsToProofsReturnType,\n} from './utils/blob/blobsToProofs.js'\nexport {\n type CommitmentsToVersionedHashesErrorType,\n type CommitmentsToVersionedHashesParameters,\n type CommitmentsToVersionedHashesReturnType,\n commitmentsToVersionedHashes,\n} from './utils/blob/commitmentsToVersionedHashes.js'\nexport {\n type CommitmentToVersionedHashErrorType,\n type CommitmentToVersionedHashParameters,\n type CommitmentToVersionedHashReturnType,\n commitmentToVersionedHash,\n} from './utils/blob/commitmentToVersionedHash.js'\nexport {\n type FromBlobsErrorType,\n type FromBlobsParameters,\n type FromBlobsReturnType,\n fromBlobs,\n} from './utils/blob/fromBlobs.js'\nexport {\n type SidecarsToVersionedHashesErrorType,\n type SidecarsToVersionedHashesParameters,\n type SidecarsToVersionedHashesReturnType,\n sidecarsToVersionedHashes,\n} from './utils/blob/sidecarsToVersionedHashes.js'\nexport {\n type ToBlobSidecarsErrorType,\n type ToBlobSidecarsParameters,\n type ToBlobSidecarsReturnType,\n toBlobSidecars,\n} from './utils/blob/toBlobSidecars.js'\nexport {\n type ToBlobsErrorType,\n type ToBlobsParameters,\n type ToBlobsReturnType,\n toBlobs,\n} from './utils/blob/toBlobs.js'\nexport {\n type CcipRequestErrorType,\n type CcipRequestParameters,\n ccipRequest,\n /** @deprecated Use `ccipRequest`. */\n ccipRequest as ccipFetch,\n type OffchainLookupErrorType,\n offchainLookup,\n offchainLookupAbiItem,\n offchainLookupSignature,\n} from './utils/ccip.js'\nexport {\n type AssertCurrentChainErrorType,\n type AssertCurrentChainParameters,\n assertCurrentChain,\n} from './utils/chain/assertCurrentChain.js'\nexport {\n type DefineChainReturnType,\n defineChain,\n extendSchema,\n} from './utils/chain/defineChain.js'\nexport {\n type ExtractChainErrorType,\n type ExtractChainParameters,\n type ExtractChainReturnType,\n extractChain,\n} from './utils/chain/extractChain.js'\nexport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from './utils/chain/getChainContractAddress.js'\nexport {\n type ConcatBytesErrorType,\n type ConcatErrorType,\n type ConcatHexErrorType,\n type ConcatReturnType,\n concat,\n concatBytes,\n concatHex,\n} from './utils/data/concat.js'\nexport { type IsBytesErrorType, isBytes } from './utils/data/isBytes.js'\nexport { type IsHexErrorType, isHex } from './utils/data/isHex.js'\nexport {\n type PadBytesErrorType,\n type PadErrorType,\n type PadHexErrorType,\n type PadReturnType,\n pad,\n padBytes,\n padHex,\n} from './utils/data/pad.js'\nexport { type SizeErrorType, size } from './utils/data/size.js'\nexport {\n type SliceBytesErrorType,\n type SliceErrorType,\n type SliceHexErrorType,\n slice,\n sliceBytes,\n sliceHex,\n} from './utils/data/slice.js'\nexport {\n type TrimErrorType,\n type TrimReturnType,\n trim,\n} from './utils/data/trim.js'\nexport {\n type BytesToBigIntErrorType,\n type BytesToBigIntOpts,\n type BytesToBoolErrorType,\n type BytesToBoolOpts,\n type BytesToNumberErrorType,\n type BytesToNumberOpts,\n type BytesToStringErrorType,\n type BytesToStringOpts,\n bytesToBigInt,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n type FromBytesErrorType,\n type FromBytesParameters,\n fromBytes,\n} from './utils/encoding/fromBytes.js'\nexport {\n type FromHexErrorType,\n fromHex,\n type HexToBigIntErrorType,\n type HexToBoolErrorType,\n type HexToNumberErrorType,\n type HexToStringErrorType,\n hexToBigInt,\n hexToBool,\n hexToNumber,\n hexToString,\n} from './utils/encoding/fromHex.js'\nexport {\n type FromRlpErrorType,\n type FromRlpReturnType,\n fromRlp,\n} from './utils/encoding/fromRlp.js'\nexport {\n type BoolToBytesErrorType,\n type BoolToBytesOpts,\n boolToBytes,\n type HexToBytesErrorType,\n type HexToBytesOpts,\n hexToBytes,\n type NumberToBytesErrorType,\n numberToBytes,\n type StringToBytesErrorType,\n type StringToBytesOpts,\n stringToBytes,\n type ToBytesErrorType,\n type ToBytesParameters,\n toBytes,\n} from './utils/encoding/toBytes.js'\nexport {\n type BoolToHexErrorType,\n type BoolToHexOpts,\n type BytesToHexErrorType,\n type BytesToHexOpts,\n boolToHex,\n bytesToHex,\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n type StringToHexErrorType,\n type StringToHexOpts,\n stringToHex,\n type ToHexErrorType,\n type ToHexParameters,\n toHex,\n} from './utils/encoding/toHex.js'\nexport {\n type BytesToRlpErrorType,\n bytesToRlp,\n type HexToRlpErrorType,\n hexToRlp,\n type ToRlpErrorType,\n type ToRlpReturnType,\n toRlp,\n} from './utils/encoding/toRlp.js'\nexport { type LabelhashErrorType, labelhash } from './utils/ens/labelhash.js'\nexport { type NamehashErrorType, namehash } from './utils/ens/namehash.js'\nexport {\n type ToCoinTypeError,\n toCoinType,\n} from './utils/ens/toCoinType.js'\nexport {\n type GetContractErrorReturnType,\n getContractError,\n} from './utils/errors/getContractError.js'\nexport {\n type DefineBlockErrorType,\n defineBlock,\n type FormatBlockErrorType,\n type FormattedBlock,\n formatBlock,\n} from './utils/formatters/block.js'\nexport { type FormatLogErrorType, formatLog } from './utils/formatters/log.js'\nexport {\n type DefineTransactionErrorType,\n defineTransaction,\n type FormatTransactionErrorType,\n type FormattedTransaction,\n formatTransaction,\n transactionType,\n} from './utils/formatters/transaction.js'\nexport {\n type DefineTransactionReceiptErrorType,\n defineTransactionReceipt,\n type FormatTransactionReceiptErrorType,\n type FormattedTransactionReceipt,\n formatTransactionReceipt,\n} from './utils/formatters/transactionReceipt.js'\nexport {\n type DefineTransactionRequestErrorType,\n defineTransactionRequest,\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n rpcTransactionType,\n} from './utils/formatters/transactionRequest.js'\nexport { type IsHashErrorType, isHash } from './utils/hash/isHash.js'\nexport {\n type Keccak256ErrorType,\n type Keccak256Hash,\n keccak256,\n} from './utils/hash/keccak256.js'\nexport {\n type Ripemd160ErrorType,\n type Ripemd160Hash,\n ripemd160,\n} from './utils/hash/ripemd160.js'\nexport {\n type Sha256ErrorType,\n type Sha256Hash,\n sha256,\n} from './utils/hash/sha256.js'\nexport {\n type ToEventHashErrorType,\n toEventHash,\n} from './utils/hash/toEventHash.js'\nexport {\n type ToEventSelectorErrorType,\n /** @deprecated use `ToEventSelectorErrorType`. */\n type ToEventSelectorErrorType as GetEventSelectorErrorType,\n toEventSelector,\n /** @deprecated use `toEventSelector`. */\n toEventSelector as getEventSelector,\n} from './utils/hash/toEventSelector.js'\nexport {\n type ToEventSignatureErrorType,\n /** @deprecated use `ToEventSignatureErrorType`. */\n type ToEventSignatureErrorType as GetEventSignatureErrorType,\n toEventSignature,\n /** @deprecated use `toEventSignature`. */\n toEventSignature as getEventSignature,\n} from './utils/hash/toEventSignature.js'\nexport {\n type ToFunctionHashErrorType,\n toFunctionHash,\n} from './utils/hash/toFunctionHash.js'\nexport {\n type ToFunctionSelectorErrorType,\n /** @deprecated use `ToFunctionSelectorErrorType`. */\n type ToFunctionSelectorErrorType as GetFunctionSelectorErrorType,\n toFunctionSelector,\n /** @deprecated use `toFunctionSelector`. */\n toFunctionSelector as getFunctionSelector,\n} from './utils/hash/toFunctionSelector.js'\nexport {\n type ToFunctionSignatureErrorType,\n /** @deprecated use `ToFunctionSignatureErrorType`. */\n type ToFunctionSignatureErrorType as GetFunctionSignatureErrorType,\n toFunctionSignature,\n /** @deprecated use `toFunctionSignature`. */\n toFunctionSignature as getFunctionSignature,\n} from './utils/hash/toFunctionSignature.js'\nexport {\n type DefineKzgErrorType,\n type DefineKzgParameters,\n type DefineKzgReturnType,\n defineKzg,\n} from './utils/kzg/defineKzg.js'\nexport {\n type SetupKzgErrorType,\n type SetupKzgParameters,\n type SetupKzgReturnType,\n setupKzg,\n} from './utils/kzg/setupKzg.js'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from './utils/nonceManager.js'\nexport { withCache } from './utils/promise/withCache.js'\nexport {\n type WithRetryErrorType,\n withRetry,\n} from './utils/promise/withRetry.js'\nexport {\n type WithTimeoutErrorType,\n withTimeout,\n} from './utils/promise/withTimeout.js'\nexport {\n type CompactSignatureToSignatureErrorType,\n compactSignatureToSignature,\n} from './utils/signature/compactSignatureToSignature.js'\nexport {\n type HashMessageErrorType,\n hashMessage,\n} from './utils/signature/hashMessage.js'\nexport {\n type HashDomainErrorType,\n type HashStructErrorType,\n type HashTypedDataErrorType,\n type HashTypedDataParameters,\n type HashTypedDataReturnType,\n hashDomain,\n hashStruct,\n hashTypedData,\n} from './utils/signature/hashTypedData.js'\nexport {\n type IsErc6492SignatureErrorType,\n type IsErc6492SignatureParameters,\n type IsErc6492SignatureReturnType,\n isErc6492Signature,\n} from './utils/signature/isErc6492Signature.js'\nexport {\n type IsErc8010SignatureErrorType,\n type IsErc8010SignatureParameters,\n type IsErc8010SignatureReturnType,\n isErc8010Signature,\n} from './utils/signature/isErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseCompactSignatureErrorType`. */\n type ParseCompactSignatureErrorType as HexToCompactSignatureErrorType,\n type ParseCompactSignatureErrorType,\n /** @deprecated Use `parseCompactSignature`. */\n parseCompactSignature as hexToCompactSignature,\n parseCompactSignature,\n} from './utils/signature/parseCompactSignature.js'\nexport {\n type ParseErc6492SignatureErrorType,\n type ParseErc6492SignatureParameters,\n type ParseErc6492SignatureReturnType,\n parseErc6492Signature,\n} from './utils/signature/parseErc6492Signature.js'\nexport {\n type ParseErc8010SignatureErrorType,\n type ParseErc8010SignatureParameters,\n type ParseErc8010SignatureReturnType,\n parseErc8010Signature,\n} from './utils/signature/parseErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseSignatureErrorType`. */\n type ParseSignatureErrorType as HexToSignatureErrorType,\n type ParseSignatureErrorType,\n /** @deprecated Use `parseSignature`. */\n parseSignature as hexToSignature,\n parseSignature,\n} from './utils/signature/parseSignature.js'\nexport {\n type RecoverAddressErrorType,\n type RecoverAddressParameters,\n type RecoverAddressReturnType,\n recoverAddress,\n} from './utils/signature/recoverAddress.js'\nexport {\n type RecoverMessageAddressErrorType,\n type RecoverMessageAddressParameters,\n type RecoverMessageAddressReturnType,\n recoverMessageAddress,\n} from './utils/signature/recoverMessageAddress.js'\nexport {\n type RecoverPublicKeyErrorType,\n type RecoverPublicKeyParameters,\n type RecoverPublicKeyReturnType,\n recoverPublicKey,\n} from './utils/signature/recoverPublicKey.js'\nexport {\n type RecoverTransactionAddressErrorType,\n type RecoverTransactionAddressParameters,\n type RecoverTransactionAddressReturnType,\n recoverTransactionAddress,\n} from './utils/signature/recoverTransactionAddress.js'\nexport {\n type RecoverTypedDataAddressErrorType,\n type RecoverTypedDataAddressParameters,\n type RecoverTypedDataAddressReturnType,\n recoverTypedDataAddress,\n} from './utils/signature/recoverTypedDataAddress.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeCompactSignatureErrorType as CompactSignatureToHexErrorType,\n type SerializeCompactSignatureErrorType,\n /** @deprecated Use `serializeCompactSignature` instead. */\n serializeCompactSignature as compactSignatureToHex,\n serializeCompactSignature,\n} from './utils/signature/serializeCompactSignature.js'\nexport {\n type SerializeErc6492SignatureErrorType,\n type SerializeErc6492SignatureParameters,\n type SerializeErc6492SignatureReturnType,\n serializeErc6492Signature,\n} from './utils/signature/serializeErc6492Signature.js'\nexport {\n type SerializeErc8010SignatureErrorType,\n type SerializeErc8010SignatureParameters,\n type SerializeErc8010SignatureReturnType,\n serializeErc8010Signature,\n} from './utils/signature/serializeErc8010Signature.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeSignatureErrorType as SignatureToHexErrorType,\n type SerializeSignatureErrorType,\n type SerializeSignatureParameters,\n type SerializeSignatureReturnType,\n /** @deprecated Use `serializeSignature` instead. */\n serializeSignature as signatureToHex,\n serializeSignature,\n} from './utils/signature/serializeSignature.js'\nexport {\n type SignatureToCompactSignatureErrorType,\n signatureToCompactSignature,\n} from './utils/signature/signatureToCompactSignature.js'\nexport {\n type ToPrefixedMessageErrorType,\n toPrefixedMessage,\n} from './utils/signature/toPrefixedMessage.js'\nexport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from './utils/signature/verifyHash.js'\nexport {\n type VerifyMessageErrorType,\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from './utils/signature/verifyMessage.js'\nexport {\n type VerifyTypedDataErrorType,\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from './utils/signature/verifyTypedData.js'\nexport { type StringifyErrorType, stringify } from './utils/stringify.js'\nexport {\n type AssertRequestErrorType,\n assertRequest,\n} from './utils/transaction/assertRequest.js'\nexport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionLegacy,\n} from './utils/transaction/assertTransaction.js'\nexport {\n type GetSerializedTransactionType,\n type GetSerializedTransactionTypeErrorType,\n getSerializedTransactionType,\n} from './utils/transaction/getSerializedTransactionType.js'\nexport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './utils/transaction/getTransactionType.js'\nexport {\n type ParseTransactionErrorType,\n type ParseTransactionReturnType,\n parseTransaction,\n} from './utils/transaction/parseTransaction.js'\nexport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './utils/transaction/serializeAccessList.js'\nexport {\n type SerializedTransactionReturnType,\n type SerializeTransactionErrorType,\n type SerializeTransactionFn,\n serializeTransaction,\n} from './utils/transaction/serializeTransaction.js'\nexport {\n type DomainSeparatorErrorType,\n domainSeparator,\n type GetTypesForEIP712DomainErrorType,\n getTypesForEIP712Domain,\n type SerializeTypedDataErrorType,\n serializeTypedData,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from './utils/typedData.js'\nexport {\n type FormatEtherErrorType,\n formatEther,\n} from './utils/unit/formatEther.js'\nexport {\n type FormatGweiErrorType,\n formatGwei,\n} from './utils/unit/formatGwei.js'\nexport {\n type FormatUnitsErrorType,\n formatUnits,\n} from './utils/unit/formatUnits.js'\nexport {\n type ParseEtherErrorType,\n parseEther,\n} from './utils/unit/parseEther.js'\nexport { type ParseGweiErrorType, parseGwei } from './utils/unit/parseGwei.js'\nexport {\n type ParseUnitsErrorType,\n parseUnits,\n} from './utils/unit/parseUnits.js'\n","import type { Chain } from '../types/chain.js'\n\n/**\n * Predeploy contracts for OP Stack.\n * @see https://github.com/ethereum-optimism/optimism/blob/develop/specs/predeploys.md\n */\nexport const contracts = {\n gasPriceOracle: { address: '0x420000000000000000000000000000000000000F' },\n l1Block: { address: '0x4200000000000000000000000000000000000015' },\n l2CrossDomainMessenger: {\n address: '0x4200000000000000000000000000000000000007',\n },\n l2Erc721Bridge: { address: '0x4200000000000000000000000000000000000014' },\n l2StandardBridge: { address: '0x4200000000000000000000000000000000000010' },\n l2ToL1MessagePasser: {\n address: '0x4200000000000000000000000000000000000016',\n },\n} as const satisfies Chain['contracts']\n","import type { ChainFormatters } from '../types/chain.js'\nimport type { RpcTransaction } from '../types/rpc.js'\nimport { hexToBigInt } from '../utils/encoding/fromHex.js'\nimport { defineBlock } from '../utils/formatters/block.js'\nimport {\n defineTransaction,\n formatTransaction,\n} from '../utils/formatters/transaction.js'\nimport { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js'\nimport type { OpStackBlock, OpStackRpcBlock } from './types/block.js'\nimport type {\n OpStackRpcTransaction,\n OpStackRpcTransactionReceipt,\n OpStackTransaction,\n OpStackTransactionReceipt,\n} from './types/transaction.js'\n\nexport const formatters = {\n block: /*#__PURE__*/ defineBlock({\n format(args: OpStackRpcBlock): OpStackBlock {\n const transactions = args.transactions?.map((transaction) => {\n if (typeof transaction === 'string') return transaction\n const formatted = formatTransaction(\n transaction as RpcTransaction,\n ) as OpStackTransaction\n if (formatted.typeHex === '0x7e') {\n formatted.isSystemTx = transaction.isSystemTx\n formatted.mint = transaction.mint\n ? hexToBigInt(transaction.mint)\n : undefined\n formatted.sourceHash = transaction.sourceHash\n formatted.type = 'deposit'\n }\n return formatted\n })\n return {\n transactions,\n stateRoot: args.stateRoot,\n } as OpStackBlock\n },\n }),\n transaction: /*#__PURE__*/ defineTransaction({\n format(args: OpStackRpcTransaction): OpStackTransaction {\n const transaction = {} as OpStackTransaction\n if (args.type === '0x7e') {\n transaction.isSystemTx = args.isSystemTx\n transaction.mint = args.mint ? hexToBigInt(args.mint) : undefined\n transaction.sourceHash = args.sourceHash\n transaction.type = 'deposit'\n }\n return transaction\n },\n }),\n transactionReceipt: /*#__PURE__*/ defineTransactionReceipt({\n format(args: OpStackRpcTransactionReceipt): OpStackTransactionReceipt {\n return {\n l1GasPrice: args.l1GasPrice ? hexToBigInt(args.l1GasPrice) : null,\n l1GasUsed: args.l1GasUsed ? hexToBigInt(args.l1GasUsed) : null,\n l1Fee: args.l1Fee ? hexToBigInt(args.l1Fee) : null,\n l1FeeScalar: args.l1FeeScalar ? Number(args.l1FeeScalar) : null,\n } as OpStackTransactionReceipt\n },\n }),\n} as const satisfies ChainFormatters\n","import { InvalidAddressError } from '../errors/address.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { ChainSerializers } from '../types/chain.js'\nimport type { Hex, Signature } from '../types/misc.js'\nimport type { TransactionSerializable } from '../types/transaction.js'\nimport type { RequiredBy } from '../types/utils.js'\nimport { isAddress } from '../utils/address/isAddress.js'\nimport { concatHex } from '../utils/data/concat.js'\nimport { toHex } from '../utils/encoding/toHex.js'\nimport { toRlp } from '../utils/encoding/toRlp.js'\nimport {\n type SerializeTransactionErrorType as SerializeTransactionErrorType_,\n serializeTransaction as serializeTransaction_,\n} from '../utils/transaction/serializeTransaction.js'\nimport type {\n OpStackTransactionSerializable,\n TransactionSerializableDeposit,\n TransactionSerializedDeposit,\n} from './types/transaction.js'\n\nexport type SerializeTransactionReturnType = ReturnType<\n typeof serializeTransaction\n>\n\nexport type SerializeTransactionErrorType =\n | SerializeTransactionErrorType_\n | ErrorType\n\nexport function serializeTransaction(\n transaction: OpStackTransactionSerializable,\n signature?: Signature,\n) {\n if (isDeposit(transaction)) return serializeTransactionDeposit(transaction)\n return serializeTransaction_(\n transaction as TransactionSerializable,\n signature,\n )\n}\n\nexport const serializers = {\n transaction: serializeTransaction,\n} as const satisfies ChainSerializers\n\n//////////////////////////////////////////////////////////////////////////////\n// Serializers\n\nexport type SerializeTransactionDepositReturnType = TransactionSerializedDeposit\n\nfunction serializeTransactionDeposit(\n transaction: TransactionSerializableDeposit,\n): SerializeTransactionDepositReturnType {\n assertTransactionDeposit(transaction)\n\n const { sourceHash, data, from, gas, isSystemTx, mint, to, value } =\n transaction\n\n const serializedTransaction: Hex[] = [\n sourceHash,\n from,\n to ?? '0x',\n mint ? toHex(mint) : '0x',\n value ? toHex(value) : '0x',\n gas ? toHex(gas) : '0x',\n isSystemTx ? '0x1' : '0x',\n data ?? '0x',\n ]\n\n return concatHex([\n '0x7e',\n toRlp(serializedTransaction),\n ]) as SerializeTransactionDepositReturnType\n}\n\nfunction isDeposit(\n transaction: OpStackTransactionSerializable,\n): transaction is RequiredBy {\n if (transaction.type === 'deposit') return true\n if (typeof transaction.sourceHash !== 'undefined') return true\n return false\n}\n\nexport function assertTransactionDeposit(\n transaction: TransactionSerializableDeposit,\n) {\n const { from, to } = transaction\n if (from && !isAddress(from)) throw new InvalidAddressError({ address: from })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n}\n","import { contracts } from './contracts.js'\nimport { formatters } from './formatters.js'\nimport { serializers } from './serializers.js'\n\nexport const chainConfig = {\n blockTime: 2_000,\n contracts,\n formatters,\n serializers,\n} as const\n","import { chainConfig } from '../../op-stack/chainConfig.js'\nimport { defineChain } from '../../utils/chain/defineChain.js'\n\nconst sourceId = 1 // mainnet\n\nexport const base = /*#__PURE__*/ defineChain({\n ...chainConfig,\n id: 8453,\n name: 'Base',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: {\n http: ['https://mainnet.base.org'],\n },\n },\n blockExplorers: {\n default: {\n name: 'Basescan',\n url: 'https://basescan.org',\n apiUrl: 'https://api.basescan.org/api',\n },\n },\n contracts: {\n ...chainConfig.contracts,\n disputeGameFactory: {\n [sourceId]: {\n address: '0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e',\n },\n },\n l2OutputOracle: {\n [sourceId]: {\n address: '0x56315b90c40730925ec5485cf004d835058518A0',\n },\n },\n multicall3: {\n address: '0xca11bde05977b3631167028862be2a173976ca11',\n blockCreated: 5022,\n },\n portal: {\n [sourceId]: {\n address: '0x49048044D57e1C92A77f79988d21Fa8fAF74E97e',\n blockCreated: 17482143,\n },\n },\n l1StandardBridge: {\n [sourceId]: {\n address: '0x3154Cf16ccdb4C6d922629664174b904d80F2C35',\n blockCreated: 17482143,\n },\n },\n },\n sourceId,\n})\n\nexport const basePreconf = /*#__PURE__*/ defineChain({\n ...base,\n experimental_preconfirmationTime: 200,\n rpcUrls: {\n default: {\n http: ['https://mainnet-preconf.base.org'],\n },\n },\n})\n","export type { Chain } from '../types/chain.js'\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n /** @deprecated Use `zeroGGalileoTestnet` instead. */\n zeroG,\n} from './definitions/0g.js'\n/** @deprecated Use `zeroGTestnet` instead. */\nexport { zeroGGalileoTestnet } from './definitions/0gGalileoTestnet.js'\nexport { zeroGMainnet } from './definitions/0gMainnet.js'\nexport { zeroGTestnet } from './definitions/0gTestnet.js'\nexport { fireChain } from './definitions/5ireChain.js'\nexport { abey } from './definitions/abey.js'\nexport { abstract } from './definitions/abstract.js'\nexport { abstractTestnet } from './definitions/abstractTestnet.js'\nexport { acala } from './definitions/acala.js'\nexport { acria } from './definitions/acria.js'\nexport { adf } from './definitions/adf.js'\nexport { adi } from './definitions/adi.js'\nexport { agungTestnet } from './definitions/agungTestnet.js'\nexport { aioz } from './definitions/aioz.js'\nexport { alephZero } from './definitions/alephZero.js'\nexport { alephZeroTestnet } from './definitions/alephZeroTestnet.js'\nexport { alienx } from './definitions/alienX.js'\nexport { alienxHalTestnet } from './definitions/alienXHalTestnet.js'\nexport { alpenTestnet } from './definitions/alpenTestnet.js'\nexport { ancient8 } from './definitions/ancient8.js'\nexport { ancient8Sepolia } from './definitions/ancient8Sepolia.js'\nexport { anvil } from './definitions/anvil.js'\nexport { apeChain } from './definitions/apeChain.js'\nexport { apexTestnet } from './definitions/apexTestnet.js'\nexport { apollo } from './definitions/apollo.js'\nexport { arbitrum } from './definitions/arbitrum.js'\nexport { arbitrumGoerli } from './definitions/arbitrumGoerli.js'\nexport { arbitrumNova } from './definitions/arbitrumNova.js'\nexport { arbitrumSepolia } from './definitions/arbitrumSepolia.js'\nexport { arcTestnet } from './definitions/arcTestnet.js'\nexport { arenaz } from './definitions/arenaz.js'\nexport { areonNetwork } from './definitions/areonNetwork.js'\nexport { areonNetworkTestnet } from './definitions/areonNetworkTestnet.js'\nexport { areum } from './definitions/areum.js'\nexport { artelaTestnet } from './definitions/artelaTestnet.js'\nexport { arthera } from './definitions/arthera.js'\nexport { artheraTestnet } from './definitions/artheraTestnet.js'\nexport { assetChain } from './definitions/assetChain.js'\nexport { assetChainTestnet } from './definitions/assetChainTestnet.js'\nexport { astar } from './definitions/astar.js'\n/** @deprecated */\nexport { astarZkEVM } from './definitions/astarZkEVM.js'\n/** @deprecated */\nexport { astarZkyoto } from './definitions/astarZkyoto.js'\nexport { atletaOlympia } from './definitions/atletaOlympia.js'\nexport { aurora } from './definitions/aurora.js'\nexport { auroraTestnet } from './definitions/auroraTestnet.js'\nexport { auroria } from './definitions/auroria.js'\nexport { autheoTestnet } from './definitions/autheoTestnet.js'\nexport { avalanche } from './definitions/avalanche.js'\nexport { avalancheFuji } from './definitions/avalancheFuji.js'\nexport { b3 } from './definitions/b3.js'\nexport { b3Sepolia } from './definitions/b3Sepolia.js'\nexport { bahamut } from './definitions/bahamut.js'\nexport { base, basePreconf } from './definitions/base.js'\nexport { basecampTestnet } from './definitions/basecampTestnet.js'\nexport { baseGoerli } from './definitions/baseGoerli.js'\nexport { baseSepolia, baseSepoliaPreconf } from './definitions/baseSepolia.js'\nexport { battlechainTestnet } from './definitions/battlechainTestnet.js'\nexport { beam } from './definitions/beam.js'\nexport { beamTestnet } from './definitions/beamTestnet.js'\nexport { bearNetworkChainMainnet } from './definitions/bearNetworkChainMainnet.js'\nexport { bearNetworkChainTestnet } from './definitions/bearNetworkChainTestnet.js'\nexport { berachain } from './definitions/berachain.js'\nexport { berachainBepolia } from './definitions/berachainBepolia.js'\nexport { berachainTestnet } from './definitions/berachainTestnet.js'\nexport { berachainTestnetbArtio } from './definitions/berachainTestnetbArtio.js'\nexport { bevmMainnet } from './definitions/bevmMainnet.js'\nexport { bifrost } from './definitions/bifrost.js'\nexport { birdlayer } from './definitions/birdlayer.js'\nexport { bitgert } from './definitions/bitgert.js'\nexport { bitkub } from './definitions/bitkub.js'\nexport { bitkubTestnet } from './definitions/bitkubTestnet.js'\nexport { bitlayer } from './definitions/bitlayer.js'\nexport { bitlayerTestnet } from './definitions/bitlayerTestnet.js'\nexport { bitrock } from './definitions/bitrock.js'\nexport { bitTorrent } from './definitions/bitTorrent.js'\nexport { bitTorrentTestnet } from './definitions/bitTorrentTestnet.js'\nexport { blast } from './definitions/blast.js'\nexport { blastSepolia } from './definitions/blastSepolia.js'\nexport { bob } from './definitions/bob.js'\nexport { boba } from './definitions/boba.js'\nexport { bobaSepolia } from './definitions/bobaSepolia.js'\nexport { bobSepolia } from './definitions/bobSepolia.js'\nexport { boolBetaMainnet } from './definitions/boolBetaMainnet.js'\nexport { botanix } from './definitions/botanix.js'\nexport { botanixTestnet } from './definitions/botanixTestnet.js'\nexport { bounceBit } from './definitions/bounceBit.js'\nexport { bounceBitTestnet } from './definitions/bounceBitTestnet.js'\nexport { bronos } from './definitions/bronos.js'\nexport { bronosTestnet } from './definitions/bronosTestnet.js'\nexport { bsc } from './definitions/bsc.js'\nexport { bscGreenfield } from './definitions/bscGreenfield.js'\nexport { bscTestnet } from './definitions/bscTestnet.js'\nexport { bsquared } from './definitions/bsquared.js'\nexport { bsquaredTestnet } from './definitions/bsquaredTestnet.js'\nexport { btr } from './definitions/btr.js'\nexport { btrTestnet } from './definitions/btrTestnet.js'\nexport { bxn } from './definitions/bxn.js'\nexport { bxnTestnet } from './definitions/bxnTestnet.js'\nexport { cannon } from './definitions/cannon.js'\nexport { canto } from './definitions/canto.js'\nexport { celo } from './definitions/celo.js'\n/** @deprecated use `celoSepolia` instead */\nexport { celoAlfajores } from './definitions/celoAlfajores.js'\nexport { celoSepolia } from './definitions/celoSepolia.js'\nexport { chang } from './definitions/chang.js'\nexport { chiliz } from './definitions/chiliz.js'\nexport { chips } from './definitions/chips.js'\nexport { citrea } from './definitions/citrea.js'\nexport { citreaTestnet } from './definitions/citreaTestnet.js'\nexport { classic } from './definitions/classic.js'\nexport { codex } from './definitions/codex.js'\nexport { codexTestnet } from './definitions/codexTestnet.js'\nexport { coinbit } from './definitions/coinbit.js'\nexport { coinex } from './definitions/coinex.js'\nexport { confluxESpace } from './definitions/confluxESpace.js'\nexport { confluxESpaceTestnet } from './definitions/confluxESpaceTestnet.js'\nexport { coreDao } from './definitions/coreDao.js'\nexport { coreTestnet1 } from './definitions/coreTestnet1.js'\nexport { coreTestnet2 } from './definitions/coreTestnet2.js'\nexport { corn } from './definitions/corn.js'\nexport { cornTestnet } from './definitions/cornTestnet.js'\nexport { cpchain } from './definitions/cpchain.js'\nexport { crab } from './definitions/crab.js'\nexport { creatorTestnet } from './definitions/creatorTestnet.js'\nexport { creditCoin3Devnet } from './definitions/creditCoin3Devnet.js'\nexport { creditCoin3Mainnet } from './definitions/creditCoin3Mainnet.js'\nexport { creditCoin3Testnet } from './definitions/creditCoin3Testnet.js'\nexport { cronos } from './definitions/cronos.js'\nexport { cronosTestnet } from './definitions/cronosTestnet.js'\nexport { cronoszkEVM } from './definitions/cronoszkEVM.js'\nexport { cronoszkEVMTestnet } from './definitions/cronoszkEVMTestnet.js'\nexport { crossbell } from './definitions/crossbell.js'\nexport { crossfi } from './definitions/crossfi.js'\nexport { curtis } from './definitions/curtis.js'\nexport { cyber } from './definitions/cyber.js'\nexport { cyberTestnet } from './definitions/cyberTestnet.js'\nexport { dailyNetwork } from './definitions/dailyNetwork.js'\nexport { dailyNetworkTestnet } from './definitions/dailyNetworkTestnet.js'\nexport { darwinia } from './definitions/darwinia.js'\nexport { datahavenTestnet } from './definitions/datahavenTestnet.js'\nexport { dbkchain } from './definitions/dbkchain.js'\nexport { dchain } from './definitions/dchain.js'\nexport { dchainTestnet } from './definitions/dchainTestnet.js'\nexport { defichainEvm } from './definitions/defichainEvm.js'\nexport { defichainEvmTestnet } from './definitions/defichainEvmTestnet.js'\nexport { degen } from './definitions/degen.js'\nexport { dfk } from './definitions/dfk.js'\nexport { diode } from './definitions/diode.js'\nexport { disChain } from './definitions/disChain.js'\nexport { dodochainTestnet } from './definitions/dodochainTestnet.js'\nexport { dogechain } from './definitions/dogechain.js'\nexport { domaTestnet } from './definitions/domaTestnet.js'\nexport { donatuz } from './definitions/donatuz.js'\nexport { dosChain } from './definitions/dosChain.js'\nexport { dosChainTestnet } from './definitions/dosChainTestnet.js'\nexport { dreyerxMainnet } from './definitions/dreyerxMainnet.js'\nexport { dreyerxTestnet } from './definitions/dreyerxTestnet.js'\nexport { dustboyIoT } from './definitions/dustboyIoT.js'\nexport { dymension } from './definitions/dymension.js'\nexport { eden } from './definitions/eden.js'\nexport { edexa } from './definitions/edexa.js'\nexport { edexaTestnet } from './definitions/edexaTestnet.js'\nexport { edgeless } from './definitions/edgeless.js'\nexport { edgelessTestnet } from './definitions/edgelessTestnet.js'\nexport { edgeware } from './definitions/edgeware.js'\nexport { edgewareTestnet } from './definitions/edgewareTestnet.js'\nexport { eduChain } from './definitions/eduChain.js'\nexport { eduChainTestnet } from './definitions/eduChainTestnet.js'\nexport { elastos } from './definitions/elastos.js'\nexport { elastosTestnet } from './definitions/elastosTestnet.js'\nexport { electroneum } from './definitions/electroneum.js'\nexport { electroneumTestnet } from './definitions/electroneumTestnet.js'\nexport { elysiumTestnet } from './definitions/elysiumTestnet.js'\nexport { energy } from './definitions/energy.js'\nexport { eni } from './definitions/eni.js'\nexport { eniTestnet } from './definitions/eniTestnet.js'\nexport { enuls } from './definitions/enuls.js'\nexport { eon } from './definitions/eon.js'\nexport { eos } from './definitions/eos.js'\nexport { eosTestnet } from './definitions/eosTestnet.js'\nexport { eteria } from './definitions/eteria.js'\nexport { etherlink } from './definitions/etherlink.js'\nexport { etherlinkShadownetTestnet } from './definitions/etherlinkShadownetTestnet.js'\nexport { etherlinkTestnet } from './definitions/etherlinkTestnet.js'\nexport { ethernity } from './definitions/ethernity.js'\nexport { etp } from './definitions/etp.js'\nexport { evmos } from './definitions/evmos.js'\nexport { evmosTestnet } from './definitions/evmosTestnet.js'\nexport { excelonMainnet } from './definitions/excelonMainnet.js'\nexport { expanse } from './definitions/expanse.js'\nexport { exsat } from './definitions/exSat.js'\nexport { exsatTestnet } from './definitions/exSatTestnet.js'\nexport { fantom } from './definitions/fantom.js'\n/** @deprecated Use `sonicTestnet` instead. */\nexport { fantomSonicTestnet } from './definitions/fantomSonicTestnet.js'\nexport { fantomTestnet } from './definitions/fantomTestnet.js'\nexport { fibo } from './definitions/fibo.js'\nexport { filecoin } from './definitions/filecoin.js'\nexport { filecoinCalibration } from './definitions/filecoinCalibration.js'\nexport { filecoinHyperspace } from './definitions/filecoinHyperspace.js'\nexport { flame } from './definitions/flame.js'\nexport { flare } from './definitions/flare.js'\nexport { flareTestnet } from './definitions/flareTestnet.js'\nexport { flowMainnet } from './definitions/flowMainnet.js'\n/** @deprecated */\nexport { flowPreviewnet } from './definitions/flowPreviewnet.js'\nexport { flowTestnet } from './definitions/flowTestnet.js'\nexport { fluence } from './definitions/fluence.js'\nexport { fluenceStage } from './definitions/fluenceStage.js'\nexport { fluenceTestnet } from './definitions/fluenceTestnet.js'\nexport { fluentDevnet } from './definitions/fluentDevnet.js'\nexport { fluentTestnet } from './definitions/fluentTestnet.js'\nexport { form } from './definitions/form.js'\nexport { forma } from './definitions/forma.js'\nexport { formTestnet } from './definitions/formTestnet.js'\nexport { forta } from './definitions/forta.js'\n/** @deprecated Use `anvil` instead. */\nexport { foundry } from './definitions/foundry.js'\nexport { fraxtal } from './definitions/fraxtal.js'\nexport { fraxtalTestnet } from './definitions/fraxtalTestnet.js'\nexport { funkiMainnet } from './definitions/funkiMainnet.js'\nexport { funkiSepolia } from './definitions/funkiSepolia.js'\nexport { fuse } from './definitions/fuse.js'\nexport { fuseSparknet } from './definitions/fuseSparknet.js'\nexport { fusion } from './definitions/fusion.js'\nexport { fusionTestnet } from './definitions/fusionTestnet.js'\nexport { garnet } from './definitions/garnet.js'\nexport { gatechain } from './definitions/gatechain.js'\nexport { geist } from './definitions/geist.js'\nexport { genesys } from './definitions/genesys.js'\nexport { gensyn } from './definitions/gensyn.js'\nexport { giwaSepolia, giwaSepoliaPreconf } from './definitions/giwaSepolia.js'\nexport { glideL1Protocol } from './definitions/glideL1Protocol.js'\nexport { glideL2Protocol } from './definitions/glideL2Protocol.js'\nexport { gnosis } from './definitions/gnosis.js'\nexport { gnosisChiado } from './definitions/gnosisChiado.js'\nexport { goat } from './definitions/goat.js'\nexport { gobi } from './definitions/gobi.js'\nexport { goChain } from './definitions/goChain.js'\nexport { godwoken } from './definitions/godwoken.js'\nexport { goerli } from './definitions/goerli.js'\nexport { graphite } from './definitions/graphite.js'\nexport { graphiteTestnet } from './definitions/graphiteTestnet.js'\nexport { gravity } from './definitions/gravity.js'\nexport { gunz } from './definitions/gunz.js'\nexport { guruNetwork } from './definitions/guruNetwork.js'\nexport { guruTestnet } from './definitions/guruTestnet.js'\nexport { ham } from './definitions/ham.js'\nexport { happychainTestnet } from './definitions/happychainTestnet.js'\nexport { haqqMainnet } from './definitions/haqqMainnet.js'\nexport { haqqTestedge2 } from './definitions/haqqTestedge2.js'\nexport { hardhat } from './definitions/hardhat.js'\nexport { harmonyOne } from './definitions/harmonyOne.js'\nexport { hashkey } from './definitions/hashKeyChain.js'\nexport { hashkeyTestnet } from './definitions/hashkeyChainTestnet.js'\nexport { haustTestnet } from './definitions/haustTestnet.js'\nexport { hedera } from './definitions/hedera.js'\nexport { hederaPreviewnet } from './definitions/hederaPreviewnet.js'\nexport { hederaTestnet } from './definitions/hederaTestnet.js'\nexport { hela } from './definitions/hela.js'\nexport { heliosTestnet } from './definitions/heliosTestnet.js'\nexport { hemi } from './definitions/hemi.js'\nexport { hemiSepolia } from './definitions/hemiSepolia.js'\nexport { henesys } from './definitions/henesys.js'\nexport { holesky } from './definitions/holesky.js'\nexport { hoodi } from './definitions/hoodi.js'\nexport { horizenTestnet } from './definitions/horizenTestnet.js'\nexport { hpb } from './definitions/hpb.js'\nexport { hpp } from './definitions/hpp.js'\nexport { hppSepolia } from './definitions/hppSepolia.js'\nexport { huddle01Mainnet } from './definitions/huddle01Mainnet.js'\nexport { huddle01Testnet } from './definitions/huddle01Testnet.js'\nexport { humanity } from './definitions/humanity.js'\nexport { humanityTestnet } from './definitions/humanityTestnet.js'\nexport { humanode } from './definitions/humanode.js'\nexport { humanodeTestnet5 } from './definitions/humanodeTestnet5.js'\nexport { hychain } from './definitions/hychain.js'\nexport { hychainTestnet } from './definitions/hychainTestnet.js'\nexport { hyperEvm, hyperEvm as hyperliquid } from './definitions/hyperEvm.js'\nexport { hyperliquidEvmTestnet } from './definitions/hyperliquidEvmTestnet.js'\nexport { icbNetwork } from './definitions/icbNetwork.js'\nexport { idchain } from './definitions/idchain.js'\nexport { igra } from './definitions/igra.js'\nexport { immutableZkEvm } from './definitions/immutableZkEvm.js'\nexport { immutableZkEvmTestnet } from './definitions/immutableZkEvmTestnet.js'\nexport { inEVM } from './definitions/inEVM.js'\nexport { initVerse } from './definitions/initVerse.js'\nexport { initVerseGenesis } from './definitions/initVerseGenesis.js'\nexport { injective } from './definitions/injective.js'\nexport { injectiveTestnet } from './definitions/injectiveTestnet.js'\nexport { ink } from './definitions/ink.js'\nexport { inkSepolia } from './definitions/inkSepolia.js'\nexport { iota } from './definitions/iota.js'\nexport { iotaTestnet } from './definitions/iotaTestnet.js'\nexport { iotex } from './definitions/iotex.js'\nexport { iotexTestnet } from './definitions/iotexTestnet.js'\nexport { iSunCoin } from './definitions/iSunCoin.js'\nexport { jasmyChain } from './definitions/jasmyChain.js'\nexport { jasmyChainTestnet } from './definitions/jasmyChainTestnet.js'\nexport { jbc } from './definitions/jbc.js'\nexport { jbcTestnet } from './definitions/jbcTestnet.js'\nexport { jocMainnet } from './definitions/jocMainnet.js'\nexport { jocTestnet } from './definitions/jocTestnet.js'\nexport { jovay } from './definitions/jovay.js'\nexport { jovaySepolia } from './definitions/jovaySepolia.js'\nexport { juneo } from './definitions/juneo.js'\nexport { juneoBCH1Chain } from './definitions/juneoBCH1Chain.js'\nexport { juneoDAI1Chain } from './definitions/juneoDAI1Chain.js'\nexport { juneoDOGE1Chain } from './definitions/juneoDOGE1Chain.js'\nexport { juneoEUR1Chain } from './definitions/juneoEUR1Chain.js'\nexport { juneoGLD1Chain } from './definitions/juneoGLD1Chain.js'\nexport { juneoLINK1Chain } from './definitions/juneoLINK1Chain.js'\nexport { juneoLTC1Chain } from './definitions/juneoLTC1Chain.js'\nexport { juneomBTC1Chain } from './definitions/juneomBTC1Chain.js'\nexport { juneoSGD1Chain } from './definitions/juneoSGD1Chain.js'\nexport { juneoSocotraTestnet } from './definitions/juneoSocotraTestnet.js'\nexport { juneoUSD1Chain } from './definitions/juneoUSD1Chain.js'\nexport { juneoUSDT1Chain } from './definitions/juneoUSDT1Chain.js'\nexport { kaia } from './definitions/kaia.js'\nexport { kairos } from './definitions/kairos.js'\n/** @deprecated Use `kakarotStarknetSepolia` instead. */\nexport { kakarotSepolia } from './definitions/kakarotSepolia.js'\nexport { kakarotStarknetSepolia } from './definitions/kakarotStarknetSepolia.js'\nexport { kardiaChain } from './definitions/kardiaChain.js'\nexport { karura } from './definitions/karura.js'\nexport { katana } from './definitions/katana.js'\nexport { kava } from './definitions/kava.js'\nexport { kavaTestnet } from './definitions/kavaTestnet.js'\nexport { kcc } from './definitions/kcc.js'\nexport { kii } from './definitions/kii.js'\nexport { kiiTestnetOro } from './definitions/kiiTestnet.js'\nexport { kinto } from './definitions/kinto.js'\n/** @deprecated Use `kaia` instead. */\nexport { klaytn } from './definitions/klaytn.js'\n/** @deprecated Use `kairos` instead. */\nexport { klaytnBaobab } from './definitions/klaytnBaobab.js'\nexport { koi } from './definitions/koi.js'\nexport { kroma } from './definitions/kroma.js'\nexport { kromaSepolia } from './definitions/kromaSepolia.js'\nexport { krown } from './definitions/krown.js'\nexport { l3x } from './definitions/l3x.js'\nexport { l3xTestnet } from './definitions/l3xTestnet.js'\nexport { lavita } from './definitions/lavita.js'\nexport { lens } from './definitions/lens.js'\nexport { lensTestnet } from './definitions/lensTestnet.js'\nexport { lestnet } from './definitions/lestnet.js'\nexport { lightlinkPegasus } from './definitions/lightlinkPegasus.js'\nexport { lightlinkPhoenix } from './definitions/lightlinkPhoenix.js'\nexport { linea } from './definitions/linea.js'\n/** @deprecated Use `lineaSepolia` instead. */\nexport { lineaGoerli } from './definitions/lineaGoerli.js'\nexport { lineaSepolia } from './definitions/lineaSepolia.js'\n/** @deprecated Use `lineaSepolia` instead. */\nexport { lineaTestnet } from './definitions/lineaTestnet.js'\nexport { lisk } from './definitions/lisk.js'\nexport { liskSepolia } from './definitions/liskSepolia.js'\nexport { loadAlphanet } from './definitions/loadAlphanet.js'\nexport { localhost } from './definitions/localhost.js'\nexport { loop } from './definitions/loop.js'\nexport { lukso } from './definitions/lukso.js'\nexport { luksoTestnet } from './definitions/luksoTestnet.js'\nexport { lumiaMainnet } from './definitions/lumiaMainnet.js'\nexport { lumiaTestnet } from './definitions/lumiaTestnet.js'\nexport { lumoz } from './definitions/lumoz.js'\nexport { lumozTestnet } from './definitions/lumozTestnet.js'\nexport { luxeports } from './definitions/luxeports.js'\nexport { lycan } from './definitions/lycan.js'\nexport { lyra } from './definitions/lyra.js'\nexport { mainnet } from './definitions/mainnet.js'\nexport { mandala } from './definitions/mandala.js'\nexport { manta } from './definitions/manta.js'\nexport { mantaSepoliaTestnet } from './definitions/mantaSepoliaTestnet.js'\nexport { mantaTestnet } from './definitions/mantaTestnet.js'\nexport { mantle } from './definitions/mantle.js'\nexport { mantleSepoliaTestnet } from './definitions/mantleSepoliaTestnet.js'\nexport { mantleTestnet } from './definitions/mantleTestnet.js'\nexport { mantraDuKongEVMTestnet } from './definitions/mantraDuKongEVMTestnet.js'\nexport { mantraEVM } from './definitions/mantraEVM.js'\nexport { mapProtocol } from './definitions/mapProtocol.js'\nexport { matchain } from './definitions/matchain.js'\nexport { matchainTestnet } from './definitions/matchainTestnet.js'\nexport { mchVerse } from './definitions/mchVerse.js'\nexport { megaeth } from './definitions/megaeth.js'\nexport { megaethTestnet } from './definitions/megaethTestnet.js'\nexport { mekong } from './definitions/mekong.js'\nexport { meld } from './definitions/meld.js'\nexport { memecore } from './definitions/memecore.js'\nexport { formicarium } from './definitions/memecoreFormicariumTestnet.js'\nexport { merlin } from './definitions/merlin.js'\nexport { merlinErigonTestnet } from './definitions/merlinErigonTestnet.js'\nexport { metachain } from './definitions/metachain.js'\nexport { metachainIstanbul } from './definitions/metachainIstanbul.js'\nexport { metadium } from './definitions/metadium.js'\nexport { metalL2 } from './definitions/metalL2.js'\nexport { meter } from './definitions/meter.js'\nexport { meterTestnet } from './definitions/meterTestnet.js'\nexport { metis } from './definitions/metis.js'\n/** @deprecated Use `metisSepolia` instead. */\nexport { metisGoerli } from './definitions/metisGoerli.js'\nexport { metisSepolia } from './definitions/metisSepolia.js'\nexport { mev } from './definitions/mev.js'\nexport { mevTestnet } from './definitions/mevTestnet.js'\nexport { mezo } from './definitions/mezo.js'\nexport { mezoTestnet } from './definitions/mezoTestnet.js'\nexport { mint } from './definitions/mint.js'\nexport { mintSepoliaTestnet } from './definitions/mintSepoliaTestnet.js'\nexport { mitosisTestnet } from './definitions/mitosisTestnet.js'\nexport { mode } from './definitions/mode.js'\nexport { modeTestnet } from './definitions/modeTestnet.js'\nexport { monad } from './definitions/monad.js'\nexport { monadTestnet } from './definitions/monadTestnet.js'\nexport { moonbaseAlpha } from './definitions/moonbaseAlpha.js'\nexport { moonbeam } from './definitions/moonbeam.js'\nexport { moonbeamDev } from './definitions/moonbeamDev.js'\nexport { moonriver } from './definitions/moonriver.js'\nexport { morph } from './definitions/morph.js'\nexport { morphHolesky } from './definitions/morphHolesky.js'\nexport { morphSepolia } from './definitions/morphSepolia.js'\nexport { nahmii } from './definitions/nahmii.js'\nexport { nautilus } from './definitions/nautilus.js'\nexport { near } from './definitions/near.js'\nexport { nearTestnet } from './definitions/nearTestnet.js'\nexport { neonDevnet } from './definitions/neonDevnet.js'\nexport { neonMainnet } from './definitions/neonMainnet.js'\nexport { neoxMainnet } from './definitions/neoxMainnet.js'\nexport { neoxT4 } from './definitions/neoxT4.js'\nexport { newton } from './definitions/newton.js'\nexport { nexi } from './definitions/nexi.js'\nexport { nexilix } from './definitions/nexilix.js'\nexport { nibiru } from './definitions/nibiru.js'\nexport { nitrographTestnet } from './definitions/nitrographTestnet.js'\nexport { nomina } from './definitions/nomina.js'\nexport { oasisTestnet } from './definitions/oasisTestnet.js'\nexport { oasys } from './definitions/oasys.js'\nexport { odysseyTestnet } from './definitions/odysseyTestnet.js'\nexport { okc } from './definitions/okc.js'\nexport { omax } from './definitions/omax.js'\nexport { omni } from './definitions/omni.js'\nexport { omniOmega } from './definitions/omniOmega.js'\nexport { oneWorld } from './definitions/oneWorld.js'\nexport { oortMainnetDev } from './definitions/oortmainnetDev.js'\nexport { opBNB } from './definitions/opBNB.js'\nexport { opBNBTestnet } from './definitions/opBNBTestnet.js'\nexport { openledger } from './definitions/openledger.js'\nexport { optimism } from './definitions/optimism.js'\nexport { optimismGoerli } from './definitions/optimismGoerli.js'\nexport { optimismSepolia } from './definitions/optimismSepolia.js'\nexport { optopia } from './definitions/optopia.js'\nexport { optopiaTestnet } from './definitions/optopiaTestnet.js'\nexport { orderly } from './definitions/orderly.js'\nexport { orderlySepolia } from './definitions/orderlySepolia.js'\nexport { otimDevnet } from './definitions/otimDevnet.js'\nexport { palm } from './definitions/palm.js'\nexport { palmTestnet } from './definitions/palmTestnet.js'\nexport { paseoPassetHub } from './definitions/paseoPassetHub.js'\nexport { peaq } from './definitions/peaq.js'\nexport { pgn } from './definitions/pgn.js'\nexport { pgnTestnet } from './definitions/pgnTestnet.js'\nexport { phoenix } from './definitions/phoenix.js'\nexport { planq } from './definitions/planq.js'\nexport { plasma } from './definitions/plasma.js'\nexport { plasmaDevnet } from './definitions/plasmaDevnet.js'\nexport { plasmaTestnet } from './definitions/plasmaTestnet.js'\nexport { playfiAlbireo } from './definitions/playfiAlbireo.js'\nexport { plinga } from './definitions/plinga.js'\n/** @deprecated Use `plumeMainnet` instead. */\nexport { plume } from './definitions/plume.js'\n/** @deprecated Use `plumeSepolia` instead. */\nexport { plumeDevnet } from './definitions/plumeDevnet.js'\nexport { plumeMainnet } from './definitions/plumeMainnet.js'\nexport { plumeSepolia } from './definitions/plumeSepolia.js'\n/** @deprecated Use `plumeSepolia` instead. */\nexport { plumeTestnet } from './definitions/plumeTestnet.js'\nexport { polterTestnet } from './definitions/polterTestnet.js'\nexport { polygon } from './definitions/polygon.js'\nexport { polygonAmoy } from './definitions/polygonAmoy.js'\nexport { polygonMumbai } from './definitions/polygonMumbai.js'\nexport { polygonZkEvm } from './definitions/polygonZkEvm.js'\nexport { polygonZkEvmCardona } from './definitions/polygonZkEvmCardona.js'\n/** @deprecated Use `polygonZkEvmCardona` instead. */\nexport { polygonZkEvmTestnet } from './definitions/polygonZkEvmTestnet.js'\nexport { polynomial } from './definitions/polynomial.js'\nexport { polynomialSepolia } from './definitions/polynomialSepolia.js'\nexport { potos } from './definitions/potos.js'\nexport { potosTestnet } from './definitions/potosTestnet.js'\nexport { premiumBlockTestnet } from './definitions/premiumBlock.js'\nexport { pulsechain } from './definitions/pulsechain.js'\nexport { pulsechainV4 } from './definitions/pulsechainV4.js'\nexport { pumpfiTestnet } from './definitions/pumpfiTestnet.js'\nexport { pyrope } from './definitions/pyrope.js'\nexport { ql1 } from './definitions/ql1.js'\nexport { qMainnet } from './definitions/qMainnet.js'\nexport { qTestnet } from './definitions/qTestnet.js'\nexport { quai } from './definitions/quai.js'\nexport { quaiTestnet } from './definitions/quaiTestnet.js'\nexport { radius } from './definitions/radius.js'\nexport { radiusTestnet } from './definitions/radiusTestnet.js'\nexport { reactiveTestnet } from './definitions/reactiveTestnet.js'\nexport { real } from './definitions/real.js'\nexport { redbellyMainnet } from './definitions/redbellyMainnet.js'\nexport { redbellyTestnet } from './definitions/redbellyTestnet.js'\nexport { reddio } from './definitions/reddio.js'\nexport { reddioSepolia } from './definitions/reddioSepolia.js'\nexport { redstone } from './definitions/redstone.js'\nexport { rei } from './definitions/rei.js'\nexport { reyaNetwork } from './definitions/reyaNetwork.js'\nexport { rise } from './definitions/rise.js'\nexport { riseTestnet } from './definitions/riseTestnet.js'\nexport { rivalz } from './definitions/rivalz.js'\nexport { rollux } from './definitions/rollux.js'\nexport { rolluxTestnet } from './definitions/rolluxTestnet.js'\nexport { ronin } from './definitions/ronin.js'\nexport { root } from './definitions/root.js'\nexport { rootPorcini } from './definitions/rootPorcini.js'\nexport { rootstock } from './definitions/rootstock.js'\nexport { rootstockTestnet } from './definitions/rootstockTestnet.js'\nexport { rss3 } from './definitions/rss3.js'\nexport { rss3Sepolia } from './definitions/rss3Sepolia.js'\nexport { saakuru } from './definitions/saakuru.js'\nexport { saga } from './definitions/saga.js'\nexport { saigon } from './definitions/saigon.js'\nexport { sanko } from './definitions/sanko.js'\nexport { sapphire } from './definitions/sapphire.js'\nexport { sapphireTestnet } from './definitions/sapphireTestnet.js'\nexport { satoshiVM } from './definitions/satoshivm.js'\nexport { satoshiVMTestnet } from './definitions/satoshivmTestnet.js'\nexport { scroll } from './definitions/scroll.js'\nexport { scrollSepolia } from './definitions/scrollSepolia.js'\nexport { sei } from './definitions/sei.js'\nexport { seismicDevnet } from './definitions/seismicDevnet.js'\nexport { seiTestnet } from './definitions/seiTestnet.js'\nexport { sepolia } from './definitions/sepolia.js'\nexport { shape } from './definitions/shape.js'\nexport { shapeSepolia } from './definitions/shapeSepolia.js'\nexport { shardeum } from './definitions/shardeum.js'\nexport { shardeumSphinx } from './definitions/shardeumSphinx.js'\nexport { shibarium } from './definitions/shibarium.js'\nexport { shibariumTestnet } from './definitions/shibariumTestnet.js'\nexport { shiden } from './definitions/shiden.js'\nexport { shimmer } from './definitions/shimmer.js'\nexport { shimmerTestnet } from './definitions/shimmerTestnet.js'\nexport { sidraChain } from './definitions/sidra.js'\nexport { silentData } from './definitions/silentdata.js'\nexport { silicon } from './definitions/silicon.js'\nexport { siliconSepolia } from './definitions/siliconSepolia.js'\nexport { sixProtocol } from './definitions/sixProtocol.js'\nexport { skaleBlockBrawlers } from './definitions/skale/brawl.js'\nexport { skaleCalypso } from './definitions/skale/calypso.js'\nexport { skaleCalypsoTestnet } from './definitions/skale/calypsoTestnet.js'\nexport { skaleCryptoBlades } from './definitions/skale/cryptoBlades.js'\n/** @deprecated */\nexport { skaleCryptoColosseum } from './definitions/skale/cryptoColosseum.js'\nexport { skaleEuropa } from './definitions/skale/europa.js'\nexport { skaleEuropaTestnet } from './definitions/skale/europaTestnet.js'\nexport { skaleExorde } from './definitions/skale/exorde.js'\n/** @deprecated */\nexport { skaleHumanProtocol } from './definitions/skale/humanProtocol.js'\nexport { skaleNebula } from './definitions/skale/nebula.js'\nexport { skaleNebulaTestnet } from './definitions/skale/nebulaTestnet.js'\n/** @deprecated Use `skaleEuropa` instead.*/\nexport { skaleRazor } from './definitions/skale/razor.js'\nexport { skaleBase } from './definitions/skale/skaleBase.js'\nexport { skaleBaseSepoliaTestnet } from './definitions/skale/skaleBaseSepoliaTestnet.js'\nexport { skaleTitan } from './definitions/skale/titan.js'\nexport { skaleTitanTestnet } from './definitions/skale/titanTestnet.js'\nexport { sketchpad } from './definitions/sketchpad.js'\nexport { snax } from './definitions/snax.js'\nexport { snaxTestnet } from './definitions/snaxTestnet.js'\nexport { somnia } from './definitions/somnia.js'\nexport { somniaTestnet } from './definitions/somniaTestnet.js'\nexport { soneium } from './definitions/soneium.js'\nexport { soneiumMinato } from './definitions/soneiumMinato.js'\nexport { songbird } from './definitions/songbird.js'\nexport { songbirdTestnet } from './definitions/songbirdTestnet.js'\nexport { sonic } from './definitions/sonic.js'\n/** @deprecated Use `sonicTestnet` instead. */\nexport { sonicBlazeTestnet } from './definitions/sonicBlazeTestnet.js'\nexport { sonicTestnet } from './definitions/sonicTestnet.js'\nexport { sophon } from './definitions/sophon.js'\nexport { sophonTestnet } from './definitions/sophonTestnet.js'\nexport { sova } from './definitions/sova.js'\nexport { sovaSepolia } from './definitions/sovaSepolia.js'\nexport { spicy } from './definitions/spicy.js'\nexport { stable } from './definitions/stable.js'\nexport { stableTestnet } from './definitions/stableTestnet.js'\nexport {\n statusSepolia,\n statusSepolia as statusNetworkSepolia,\n} from './definitions/statusNetworkSepolia.js'\nexport { step } from './definitions/step.js'\nexport { story } from './definitions/story.js'\nexport { storyAeneid } from './definitions/storyAeneid.js'\n/** @deprecated Use `storyAeneid` instead. */\nexport { storyOdyssey } from './definitions/storyOdyssey.js'\n/** @deprecated Use `storyAeneid` instead. */\nexport { storyTestnet } from './definitions/storyTestnet.js'\nexport { stratis } from './definitions/stratis.js'\nexport { subtensorEvm } from './definitions/subtensorEvm.js'\nexport { superlumio } from './definitions/superlumio.js'\nexport { superposition } from './definitions/superposition.js'\nexport { superseed } from './definitions/superseed.js'\nexport { superseedSepolia } from './definitions/superseedSepolia.js'\nexport { surgeTestnet } from './definitions/surgeTestnet.js'\nexport { swan } from './definitions/swan.js'\nexport { swanProximaTestnet } from './definitions/swanProximaTestnet.js'\nexport { swanSaturnTestnet } from './definitions/swanSaturnTestnet.js'\nexport { swellchain } from './definitions/swellchain.js'\nexport { swellchainTestnet } from './definitions/swellchainTestnet.js'\nexport { swissdlt } from './definitions/swissdlt.js'\nexport { syscoin } from './definitions/syscoin.js'\nexport { syscoinTestnet } from './definitions/syscoinTestnet.js'\nexport { tac } from './definitions/tac.js'\nexport { tacSPB } from './definitions/tacSPB.js'\nexport { taiko } from './definitions/taiko.js'\n/** @deprecated Use `taikoHoodi` instead. */\nexport { taikoHekla } from './definitions/taikoHekla.js'\nexport { taikoHoodi } from './definitions/taikoHoodi.js'\n/** @deprecated Use `taikoHoodi` instead. */\nexport { taikoJolnir } from './definitions/taikoJolnir.js'\n/** @deprecated Use `taikoHoodi` instead. */\nexport { taikoKatla } from './definitions/taikoKatla.js'\n/** @deprecated Use `taikoHoodi` instead. */\nexport { taikoTestnetSepolia } from './definitions/taikoTestnetSepolia.js'\nexport { taraxa } from './definitions/taraxa.js'\nexport { taraxaTestnet } from './definitions/taraxaTestnet.js'\nexport { teaSepolia } from './definitions/teaSepolia.js'\nexport { telcoinTestnet } from './definitions/telcoinTestnet.js'\nexport { telos } from './definitions/telos.js'\nexport { telosTestnet } from './definitions/telosTestnet.js'\nexport { tempo, tempo as tempoMainnet } from './definitions/tempo.js'\nexport { tempoDevnet } from './definitions/tempoDevnet.js'\nexport { tempoLocalnet } from './definitions/tempoLocalnet.js'\nexport {\n tempoModerato,\n tempoModerato as tempoTestnet,\n} from './definitions/tempoModerato.js'\nexport { tenet } from './definitions/tenet.js'\nexport { ternoa } from './definitions/ternoa.js'\nexport { thaiChain } from './definitions/thaiChain.js'\nexport { that } from './definitions/that.js'\nexport { theta } from './definitions/theta.js'\nexport { thetaTestnet } from './definitions/thetaTestnet.js'\nexport { thunderCore } from './definitions/thunderCore.js'\nexport { thunderTestnet } from './definitions/thunderTestnet.js'\nexport { tiktrixTestnet } from './definitions/tiktrixTestnet.js'\nexport { tomb } from './definitions/tomb.js'\nexport { treasure } from './definitions/treasure.js'\nexport { treasureTopaz } from './definitions/treasureTopaz.js'\nexport { tron } from './definitions/tron.js'\nexport { tronNile } from './definitions/tronNile.js'\nexport { tronShasta } from './definitions/tronShasta.js'\nexport { ubiq } from './definitions/ubiq.js'\nexport { ultra } from './definitions/ultra.js'\nexport { ultraTestnet } from './definitions/ultraTestnet.js'\nexport { ultron } from './definitions/ultron.js'\nexport { ultronTestnet } from './definitions/ultronTestnet.js'\nexport { unichain } from './definitions/unichain.js'\nexport { unichainSepolia } from './definitions/unichainSepolia.js'\nexport { unique } from './definitions/unique.js'\nexport { uniqueOpal } from './definitions/uniqueOpal.js'\nexport { uniqueQuartz } from './definitions/uniqueQuartz.js'\nexport { unreal } from './definitions/unreal.js'\nexport { vana } from './definitions/vana.js'\nexport { vanaMoksha } from './definitions/vanaMoksha.js'\nexport { vanar } from './definitions/vanar.js'\nexport { vechain } from './definitions/vechain.js'\nexport { velas } from './definitions/velas.js'\nexport { viction } from './definitions/viction.js'\nexport { victionTestnet } from './definitions/victionTestnet.js'\nexport { vision } from './definitions/vision.js'\nexport { visionTestnet } from './definitions/visionTestnet.js'\nexport { wanchain } from './definitions/wanchain.js'\nexport { wanchainTestnet } from './definitions/wanchainTestnet.js'\n/** @deprecated Use `loadAlphanet` instead. */\nexport { weaveVMAlphanet } from './definitions/weavevmAlphanet.js'\nexport { wemix } from './definitions/wemix.js'\nexport { wemixTestnet } from './definitions/wemixTestnet.js'\nexport { westendAssetHub } from './definitions/westendAssetHub.js'\nexport { whitechain } from './definitions/whitechain.js'\nexport { whitechainTestnet } from './definitions/whitechainTestnet.js'\nexport { wmcTestnet } from './definitions/wmcTestnet.js'\nexport { worldchain } from './definitions/worldchain.js'\nexport { worldchainSepolia } from './definitions/worldchainSepolia.js'\nexport { worldLand } from './definitions/worldLand.js'\nexport { xai } from './definitions/xai.js'\nexport { xaiTestnet } from './definitions/xaiTestnet.js'\nexport { xdc } from './definitions/xdc.js'\nexport { xdcTestnet } from './definitions/xdcTestnet.js'\nexport { xgr } from './definitions/xgr.js'\nexport { xLayer } from './definitions/xLayer.js'\nexport {\n /** @deprecated Use `xLayerTestnet` */\n x1Testnet,\n xLayerTestnet,\n} from './definitions/xLayerTestnet.js'\nexport { xoneMainnet } from './definitions/xoneMainnet.js'\nexport { xoneTestnet } from './definitions/xoneTestnet.js'\nexport { xphereMainnet } from './definitions/xphereMainnet.js'\nexport { xphereTestnet } from './definitions/xphereTestnet.js'\nexport { xpla } from './definitions/xpla.js'\nexport { xrOne } from './definitions/xrOne.js'\nexport { xrplevm } from './definitions/xrplevm.js'\nexport { xrplevmDevnet } from './definitions/xrplevmDevnet.js'\nexport { xrplevmTestnet } from './definitions/xrplevmTestnet.js'\nexport { xrSepolia } from './definitions/xrSepolia.js'\nexport { yooldoVerse } from './definitions/yooldoVerse.js'\nexport { yooldoVerseTestnet } from './definitions/yooldoVerseTestnet.js'\nexport { zenchainTestnet } from './definitions/zenchainTestnet.js'\nexport { zeniq } from './definitions/zeniq.js'\nexport { zeroNetwork } from './definitions/zeroNetwork.js'\nexport { zetachain } from './definitions/zetachain.js'\nexport { zetachainAthensTestnet } from './definitions/zetachainAthensTestnet.js'\nexport { zhejiang } from './definitions/zhejiang.js'\nexport { zilliqa } from './definitions/zilliqa.js'\nexport { zilliqaTestnet } from './definitions/zilliqaTestnet.js'\nexport { zircuit } from './definitions/zircuit.js'\nexport { zircuitGarfieldTestnet } from './definitions/zircuitGarfieldTestnet.js'\nexport { zkFair } from './definitions/zkFair.js'\nexport { zkFairTestnet } from './definitions/zkFairTestnet.js'\nexport { zkLinkNova } from './definitions/zkLinkNova.js'\nexport { zkLinkNovaSepoliaTestnet } from './definitions/zkLinkNovaSepoliaTestnet.js'\nexport {\n /** @deprecated Use `zksync` instead */\n zksync as zkSync,\n zksync,\n} from './definitions/zksync.js'\nexport {\n /** @deprecated Use `zksync` instead */\n zksyncInMemoryNode as zkSyncInMemoryNode,\n zksyncInMemoryNode,\n} from './definitions/zksyncInMemoryNode.js'\nexport { zksyncLocalCustomHyperchain } from './definitions/zksyncLocalCustomHyperchain.js'\nexport { zksyncLocalHyperchain } from './definitions/zksyncLocalHyperchain.js'\nexport { zksyncLocalHyperchainL1 } from './definitions/zksyncLocalHyperchainL1.js'\nexport {\n /** @deprecated Use `zksync` instead */\n zksyncLocalNode as zkSyncLocalNode,\n zksyncLocalNode,\n} from './definitions/zksyncLocalNode.js'\nexport {\n /** @deprecated Use `zksync` instead */\n zksyncSepoliaTestnet as zkSyncSepoliaTestnet,\n zksyncSepoliaTestnet,\n} from './definitions/zksyncSepoliaTestnet.js'\nexport { zkXPLA } from './definitions/zkXPLA.js'\nexport { zkXPLATestnet } from './definitions/zkXPLATestnet.js'\nexport { zora } from './definitions/zora.js'\nexport { zoraSepolia } from './definitions/zoraSepolia.js'\nexport { zoraTestnet } from './definitions/zoraTestnet.js'\n\n//////////////////////////////////////////////////////////////////////////////////////\n// Required type exports to prevent TypeScript error \"TS2742\".\n\nexport type {\n assertTransactionCIP42 as assertTransactionCIP42Celo,\n assertTransactionCIP64 as assertTransactionCIP64Celo,\n SerializeTransactionCIP64ReturnType,\n serializers as serializersCelo,\n serializeTransaction as serializeTransactionCelo,\n} from '../celo/serializers.js'\nexport type {\n CeloBlock,\n CeloRpcBlock,\n CeloRpcTransaction,\n CeloRpcTransactionRequest,\n CeloTransaction,\n CeloTransactionRequest,\n CeloTransactionSerializable,\n CeloTransactionSerialized,\n CeloTransactionType,\n RpcTransactionCIP42,\n RpcTransactionCIP64,\n RpcTransactionRequestCIP64,\n TransactionCIP42,\n TransactionCIP64,\n TransactionRequestCIP64,\n TransactionSerializableCIP42,\n TransactionSerializableCIP64,\n TransactionSerializedCIP42,\n TransactionSerializedCIP64,\n} from '../celo/types.js'\nexport type {\n assertTransactionDeposit as assertTransactionDepositOpStack,\n SerializeTransactionDepositReturnType,\n SerializeTransactionErrorType,\n SerializeTransactionReturnType,\n serializers as serializersOpStack,\n serializeTransaction as serializeTransactionOpStack,\n} from '../op-stack/serializers.js'\nexport type {\n OpStackBlock,\n OpStackBlockOverrides,\n OpStackRpcBlock,\n OpStackRpcBlockOverrides,\n} from '../op-stack/types/block.js'\nexport type {\n OpStackDepositTransaction,\n OpStackRpcDepositTransaction,\n OpStackRpcTransaction,\n OpStackRpcTransactionReceipt,\n OpStackRpcTransactionReceiptOverrides,\n OpStackTransaction,\n OpStackTransactionReceipt,\n OpStackTransactionReceiptOverrides,\n OpStackTransactionSerializable,\n OpStackTransactionSerialized,\n OpStackTransactionType,\n TransactionSerializableDeposit,\n TransactionSerializedDeposit,\n} from '../op-stack/types/transaction.js'\nexport type {\n Assign,\n Omit,\n PartialBy,\n Prettify,\n UnionLooseOmit,\n} from '../types/utils.js'\nexport type {\n /** @deprecated Use `ZksyncBlock` instead */\n ZksyncBlock as ZkSyncBlock,\n ZksyncBlock,\n /** @deprecated Use `ZksyncRpcBlock` instead */\n ZksyncRpcBlock as ZkSyncRpcBlock,\n ZksyncRpcBlock,\n} from '../zksync/types/block.js'\nexport type { ChainEIP712 } from '../zksync/types/chain.js'\nexport type {\n /** @deprecated Use `ZksyncEip712Meta` instead */\n ZksyncEip712Meta as ZkSyncEip712Meta,\n ZksyncEip712Meta,\n} from '../zksync/types/eip712.js'\nexport type {\n /** @deprecated Use `ZksyncFeeValues` instead */\n ZksyncFeeValues as ZkSyncFeeValues,\n ZksyncFeeValues,\n} from '../zksync/types/fee.js'\nexport type {\n /** @deprecated Use `ZksyncL2ToL1Log` instead */\n ZksyncL2ToL1Log as ZkSyncL2ToL1Log,\n ZksyncL2ToL1Log,\n /** @deprecated Use `ZksyncLog` instead */\n ZksyncLog as ZkSyncLog,\n ZksyncLog,\n /** @deprecated Use `ZksyncRpcL2ToL1Log` instead */\n ZksyncRpcL2ToL1Log as ZkSyncRpcL2ToL1Log,\n ZksyncRpcL2ToL1Log,\n /** @deprecated Use `ZkSyncRpcLog` instead */\n ZksyncRpcLog as ZkSyncRpcLog,\n ZksyncRpcLog,\n} from '../zksync/types/log.js'\nexport type {\n /** @deprecated Use `ZksyncTransactionRequest_internal` instead */\n TransactionRequest as ZkSyncTransactionRequest_internal,\n TransactionRequest as ZksyncTransactionRequest_internal,\n TransactionRequestEIP712,\n /** @deprecated Use `ZksyncEIP712TransactionSignable` instead */\n ZksyncEIP712TransactionSignable as ZkSyncEIP712TransactionSignable,\n ZksyncEIP712TransactionSignable,\n /** @deprecated Use `ZksyncRawBlockTransactions` instead */\n ZksyncRawBlockTransactions as ZkSyncRawBlockTransactions,\n ZksyncRawBlockTransactions,\n /** @deprecated Use `ZksyncRpcTransaction` instead */\n ZksyncRpcTransaction as ZkSyncRpcTransaction,\n ZksyncRpcTransaction,\n /** @deprecated Use `ZksyncRpcTransactionEIP712` instead */\n ZksyncRpcTransactionEIP712 as ZkSyncRpcTransactionEIP712,\n ZksyncRpcTransactionEIP712,\n /** @deprecated Use `ZksyncRpcTransactionPriority` instead */\n ZksyncRpcTransactionPriority as ZkSyncRpcTransactionPriority,\n ZksyncRpcTransactionPriority,\n /** @deprecated Use `ZksyncRpcTransactionReceipt` instead */\n ZksyncRpcTransactionReceipt as ZkSyncRpcTransactionReceipt,\n ZksyncRpcTransactionReceipt,\n /** @deprecated Use `ZksyncRpcTransactionReceiptOverrides` instead */\n ZksyncRpcTransactionReceiptOverrides as ZkSyncRpcTransactionReceiptOverrides,\n ZksyncRpcTransactionReceiptOverrides,\n /** @deprecated Use `ZksyncRpcTransactionRequest` instead */\n ZksyncRpcTransactionRequest as ZkSyncRpcTransactionRequest,\n ZksyncRpcTransactionRequest,\n /** @deprecated Use `ZksyncRpcTransactionRequestEIP712` instead */\n ZksyncRpcTransactionRequestEIP712 as ZkSyncRpcTransactionRequestEIP712,\n ZksyncRpcTransactionRequestEIP712,\n /** @deprecated Use `ZksyncTransaction` instead */\n ZksyncTransaction as ZkSyncTransaction,\n ZksyncTransaction,\n /** @deprecated Use `ZksyncTransactionDetails` instead */\n ZksyncTransactionDetails as ZkSyncTransactionDetails,\n ZksyncTransactionDetails,\n /** @deprecated Use `ZksyncTransactionEIP712` instead */\n ZksyncTransactionEIP712 as ZkSyncTransactionEIP712,\n ZksyncTransactionEIP712,\n /** @deprecated Use `ZksyncTransactionReceipt` instead */\n ZksyncTransactionReceipt as ZkSyncTransactionReceipt,\n ZksyncTransactionReceipt,\n /** @deprecated Use `ZksyncTransactionReceiptOverrides` instead */\n ZksyncTransactionReceiptOverrides as ZkSyncTransactionReceiptOverrides,\n ZksyncTransactionReceiptOverrides,\n /** @deprecated Use `ZksyncTransactionRequest` instead */\n ZksyncTransactionRequest as ZkSyncTransactionRequest,\n ZksyncTransactionRequest,\n /** @deprecated Use `ZksyncTransactionRequestEIP712` instead */\n ZksyncTransactionRequestEIP712 as ZkSyncTransactionRequestEIP712,\n ZksyncTransactionRequestEIP712,\n /** @deprecated Use `ZksyncTransactionSerializable` instead */\n ZksyncTransactionSerializable as ZkSyncTransactionSerializable,\n ZksyncTransactionSerializable,\n /** @deprecated Use `ZksyncTransactionSerializableEIP712` instead */\n ZksyncTransactionSerializableEIP712 as ZkSyncTransactionSerializableEIP712,\n ZksyncTransactionSerializableEIP712,\n /** @deprecated Use `ZksyncTransactionSerialized` instead */\n ZksyncTransactionSerialized as ZkSyncTransactionSerialized,\n ZksyncTransactionSerialized,\n /** @deprecated Use `ZksyncTransactionSerializedEIP712` instead */\n ZksyncTransactionSerializedEIP712 as ZkSyncTransactionSerializedEIP712,\n ZksyncTransactionSerializedEIP712,\n /** @deprecated Use `ZksyncTransactionType` instead */\n ZksyncTransactionType as ZkSyncTransactionType,\n ZksyncTransactionType,\n} from '../zksync/types/transaction.js'\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\n// no abytes: seems to have 10% slowdown. Why?!\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like , , \ntype Chain = [Coder, ...Coder[]];\n// Extract info from Coder type\ntype Input = F extends Coder ? T : never;\ntype Output = F extends Coder ? T : never;\n// Generic function for arrays\ntype First = T extends [infer U, ...any[]] ? U : never;\ntype Last = T extends [...any[], infer U] ? U : never;\ntype Tail = T extends [any, ...infer U] ? U : never;\n\ntype AsChain> = {\n // C[K] = Coder, Input>\n [K in keyof C]: Coder, Input>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain>(...args: T): Coder>, Output>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn: (val: T) => T): Coder {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes): ReturnType | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase}1${string}`;\n decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase}1${string}`;\n }\n\n function decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","/**\n * PBKDF (RFC 2898). Can be used to create a key from password and salt.\n * @module\n */\nimport { hmac } from './hmac.ts';\n// prettier-ignore\nimport {\n ahash, anumber,\n asyncLoop, checkOpts, clean, createView, Hash, kdfInputToBytes,\n type CHash,\n type KDFInput\n} from './utils.ts';\n\nexport type Pbkdf2Opt = {\n c: number; // Iterations\n dkLen?: number; // Desired key length in bytes (Intended output length in octets of the derived key\n asyncTick?: number; // Maximum time in ms for which async function can block execution\n};\n// Common prologue and epilogue for sync/async functions\nfunction pbkdf2Init(hash: CHash, _password: KDFInput, _salt: KDFInput, _opts: Pbkdf2Opt) {\n ahash(hash);\n const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n anumber(c);\n anumber(dkLen);\n anumber(asyncTick);\n if (c < 1) throw new Error('iterations (c) should be >= 1');\n const password = kdfInputToBytes(_password);\n const salt = kdfInputToBytes(_salt);\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\n\nfunction pbkdf2Output>(\n PRF: Hash,\n PRFSalt: Hash,\n DK: Uint8Array,\n prfW: Hash,\n u: Uint8Array\n) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW) prfW.destroy();\n clean(u);\n return DK;\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n * @example\n * const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });\n */\nexport function pbkdf2(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Uint8Array {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function. Async version.\n * @example\n * await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });\n */\nexport async function pbkdf2Async(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Promise {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await asyncLoop(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n","/**\n * Audited & minimal JS implementation of\n * [BIP39 mnemonic phrases](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).\n * @module\n * @example\n```js\nimport * as bip39 from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nconst mn = bip39.generateMnemonic(wordlist);\nconsole.log(mn);\nconst ent = bip39.mnemonicToEntropy(mn, wordlist)\nbip39.entropyToMnemonic(ent, wordlist);\nbip39.validateMnemonic(mn, wordlist);\nawait bip39.mnemonicToSeed(mn, 'password');\nbip39.mnemonicToSeedSync(mn, 'password');\n\n// Wordlists\nimport { wordlist as czech } from '@scure/bip39/wordlists/czech';\nimport { wordlist as english } from '@scure/bip39/wordlists/english';\nimport { wordlist as french } from '@scure/bip39/wordlists/french';\nimport { wordlist as italian } from '@scure/bip39/wordlists/italian';\nimport { wordlist as japanese } from '@scure/bip39/wordlists/japanese';\nimport { wordlist as korean } from '@scure/bip39/wordlists/korean';\nimport { wordlist as portuguese } from '@scure/bip39/wordlists/portuguese';\nimport { wordlist as simplifiedChinese } from '@scure/bip39/wordlists/simplified-chinese';\nimport { wordlist as spanish } from '@scure/bip39/wordlists/spanish';\nimport { wordlist as traditionalChinese } from '@scure/bip39/wordlists/traditional-chinese';\n```\n */\n/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2';\nimport { sha256, sha512 } from '@noble/hashes/sha2';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent, 16, 20, 24, 28, 32);\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","// TODO(v3): Rename to `toLocalAccount` + add `source` property to define source (privateKey, mnemonic, hdKey, etc).\n\nimport type { Address } from 'abitype'\n\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../errors/address.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport {\n type IsAddressErrorType,\n isAddress,\n} from '../utils/address/isAddress.js'\nimport type {\n AccountSource,\n CustomSource,\n JsonRpcAccount,\n LocalAccount,\n} from './types.js'\n\ntype GetAccountReturnType =\n | (accountSource extends Address ? JsonRpcAccount : never)\n | (accountSource extends CustomSource ? LocalAccount : never)\n\nexport type ToAccountErrorType =\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\n/**\n * @description Creates an Account from a custom signing implementation.\n *\n * @returns A Local Account.\n */\nexport function toAccount(\n source: accountSource,\n): GetAccountReturnType {\n if (typeof source === 'string') {\n if (!isAddress(source, { strict: false }))\n throw new InvalidAddressError({ address: source })\n return {\n address: source,\n type: 'json-rpc',\n } as GetAccountReturnType\n }\n\n if (!isAddress(source.address, { strict: false }))\n throw new InvalidAddressError({ address: source.address })\n return {\n address: source.address,\n nonceManager: source.nonceManager,\n sign: source.sign,\n signAuthorization: source.signAuthorization,\n signMessage: source.signMessage,\n signTransaction: source.signTransaction,\n signTypedData: source.signTypedData,\n source: 'custom',\n type: 'local',\n } as GetAccountReturnType\n}\n","// TODO(v3): Convert to sync.\n\nimport { secp256k1 } from '@noble/curves/secp256k1'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../../utils/data/isHex.js'\nimport {\n type HexToBytesErrorType,\n hexToBytes,\n} from '../../utils/encoding/toBytes.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { serializeSignature } from '../../utils/signature/serializeSignature.js'\n\ntype To = 'object' | 'bytes' | 'hex'\n\nexport type SignParameters = {\n hash: Hex\n privateKey: Hex\n to?: to | To | undefined\n}\n\nexport type SignReturnType =\n | (to extends 'object' ? Signature : never)\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type SignErrorType =\n | HexToBytesErrorType\n | IsHexErrorType\n | NumberToHexErrorType\n | ErrorType\n\nlet extraEntropy: Hex | boolean = false\n\n/**\n * Sets extra entropy for signing functions.\n */\nexport function setSignEntropy(entropy: true | Hex) {\n if (!entropy) throw new Error('must be a `true` or a hex value.')\n extraEntropy = entropy\n}\n\n/**\n * @description Signs a hash with a given private key.\n *\n * @param hash The hash to sign.\n * @param privateKey The private key to sign with.\n *\n * @returns The signature.\n */\nexport async function sign({\n hash,\n privateKey,\n to = 'object',\n}: SignParameters): Promise> {\n const { r, s, recovery } = secp256k1.sign(\n hash.slice(2),\n privateKey.slice(2),\n {\n lowS: true,\n extraEntropy: isHex(extraEntropy, { strict: false })\n ? hexToBytes(extraEntropy)\n : extraEntropy,\n },\n )\n const signature = {\n r: numberToHex(r, { size: 32 }),\n s: numberToHex(s, { size: 32 }),\n v: recovery ? 28n : 27n,\n yParity: recovery,\n }\n return (() => {\n if (to === 'bytes' || to === 'hex')\n return serializeSignature({ ...signature, to })\n return signature\n })() as SignReturnType\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n AuthorizationRequest,\n SignedAuthorization,\n} from '../../types/authorization.js'\nimport type { Hex, Signature } from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport {\n type HashAuthorizationErrorType,\n hashAuthorization,\n} from '../../utils/authorization/hashAuthorization.js'\nimport {\n type SignErrorType,\n type SignParameters,\n type SignReturnType,\n sign,\n} from './sign.js'\n\ntype To = 'object' | 'bytes' | 'hex'\n\nexport type SignAuthorizationParameters =\n AuthorizationRequest & {\n /** The private key to sign with. */\n privateKey: Hex\n to?: SignParameters['to'] | undefined\n }\n\nexport type SignAuthorizationReturnType = Prettify<\n to extends 'object' ? SignedAuthorization : SignReturnType\n>\n\nexport type SignAuthorizationErrorType =\n | SignErrorType\n | HashAuthorizationErrorType\n | ErrorType\n\n/**\n * Signs an Authorization hash in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n */\nexport async function signAuthorization(\n parameters: SignAuthorizationParameters,\n): Promise> {\n const { chainId, nonce, privateKey, to = 'object' } = parameters\n const address = parameters.contractAddress ?? parameters.address\n const signature = await sign({\n hash: hashAuthorization({ address, chainId, nonce }),\n privateKey,\n to,\n })\n if (to === 'object')\n return {\n address,\n chainId,\n nonce,\n ...(signature as Signature),\n } as any\n return signature as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex, SignableMessage } from '../../types/misc.js'\nimport {\n type HashMessageErrorType,\n hashMessage,\n} from '../../utils/signature/hashMessage.js'\n\nimport { type SignErrorType, sign } from './sign.js'\n\nexport type SignMessageParameters = {\n /** The message to sign. */\n message: SignableMessage\n /** The private key to sign with. */\n privateKey: Hex\n}\n\nexport type SignMessageReturnType = Hex\n\nexport type SignMessageErrorType =\n | SignErrorType\n | HashMessageErrorType\n | ErrorType\n\n/**\n * @description Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191):\n * `keccak256(\"\\x19Ethereum Signed Message:\\n\" + len(message) + message))`.\n *\n * @returns The signature.\n */\nexport async function signMessage({\n message,\n privateKey,\n}: SignMessageParameters): Promise {\n return await sign({ hash: hashMessage(message), privateKey, to: 'hex' })\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n TransactionSerializable,\n TransactionSerialized,\n} from '../../types/transaction.js'\nimport {\n type Keccak256ErrorType,\n keccak256,\n} from '../../utils/hash/keccak256.js'\nimport type { GetTransactionType } from '../../utils/transaction/getTransactionType.js'\nimport {\n type SerializeTransactionFn,\n serializeTransaction,\n} from '../../utils/transaction/serializeTransaction.js'\n\nimport { type SignErrorType, sign } from './sign.js'\n\nexport type SignTransactionParameters<\n serializer extends\n SerializeTransactionFn = SerializeTransactionFn,\n transaction extends Parameters[0] = Parameters[0],\n> = {\n privateKey: Hex\n transaction: transaction\n serializer?: serializer | undefined\n}\n\nexport type SignTransactionReturnType<\n serializer extends\n SerializeTransactionFn = SerializeTransactionFn,\n transaction extends Parameters[0] = Parameters[0],\n> = TransactionSerialized>\n\nexport type SignTransactionErrorType =\n | Keccak256ErrorType\n | SignErrorType\n | ErrorType\n\nexport async function signTransaction<\n serializer extends\n SerializeTransactionFn = SerializeTransactionFn,\n transaction extends Parameters[0] = Parameters[0],\n>(\n parameters: SignTransactionParameters,\n): Promise> {\n const {\n privateKey,\n transaction,\n serializer = serializeTransaction,\n } = parameters\n\n const signableTransaction = (() => {\n // For EIP-4844 Transactions, we want to sign the transaction payload body (tx_payload_body) without the sidecars (ie. without the network wrapper).\n // See: https://github.com/ethereum/EIPs/blob/e00f4daa66bd56e2dbd5f1d36d09fd613811a48b/EIPS/eip-4844.md#networking\n if (transaction.type === 'eip4844')\n return {\n ...transaction,\n sidecars: false,\n }\n return transaction\n })()\n\n const signature = await sign({\n hash: keccak256(await serializer(signableTransaction)),\n privateKey,\n })\n return (await serializer(\n transaction,\n signature,\n )) as SignTransactionReturnType\n}\n","import type { TypedData } from 'abitype'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TypedDataDefinition } from '../../types/typedData.js'\nimport {\n type HashTypedDataErrorType,\n hashTypedData,\n} from '../../utils/signature/hashTypedData.js'\nimport { type SignErrorType, sign } from './sign.js'\n\nexport type SignTypedDataParameters<\n typedData extends TypedData | Record = TypedData,\n primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n> = TypedDataDefinition & {\n /** The private key to sign with. */\n privateKey: Hex\n}\n\nexport type SignTypedDataReturnType = Hex\n\nexport type SignTypedDataErrorType =\n | HashTypedDataErrorType\n | SignErrorType\n | ErrorType\n\n/**\n * @description Signs typed data and calculates an Ethereum-specific signature in [https://eips.ethereum.org/EIPS/eip-712](https://eips.ethereum.org/EIPS/eip-712):\n * `sign(keccak256(\"\\x19\\x01\" ‖ domainSeparator ‖ hashStruct(message)))`.\n *\n * @returns The signature.\n */\nexport async function signTypedData<\n const typedData extends TypedData | Record,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(\n parameters: SignTypedDataParameters,\n): Promise {\n const { privateKey, ...typedData } =\n parameters as unknown as SignTypedDataParameters\n return await sign({\n hash: hashTypedData(typedData),\n privateKey,\n to: 'hex',\n })\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Hex } from '../types/misc.js'\nimport { type ToHexErrorType, toHex } from '../utils/encoding/toHex.js'\nimport type { NonceManager } from '../utils/nonceManager.js'\nimport { type ToAccountErrorType, toAccount } from './toAccount.js'\nimport type { PrivateKeyAccount } from './types.js'\nimport {\n type PublicKeyToAddressErrorType,\n publicKeyToAddress,\n} from './utils/publicKeyToAddress.js'\nimport { type SignErrorType, sign } from './utils/sign.js'\nimport { signAuthorization } from './utils/signAuthorization.js'\nimport { type SignMessageErrorType, signMessage } from './utils/signMessage.js'\nimport {\n type SignTransactionErrorType,\n signTransaction,\n} from './utils/signTransaction.js'\nimport {\n type SignTypedDataErrorType,\n signTypedData,\n} from './utils/signTypedData.js'\n\nexport type PrivateKeyToAccountOptions = {\n nonceManager?: NonceManager | undefined\n}\n\nexport type PrivateKeyToAccountErrorType =\n | ToAccountErrorType\n | ToHexErrorType\n | PublicKeyToAddressErrorType\n | SignErrorType\n | SignMessageErrorType\n | SignTransactionErrorType\n | SignTypedDataErrorType\n | ErrorType\n\n/**\n * @description Creates an Account from a private key.\n *\n * @returns A Private Key Account.\n */\nexport function privateKeyToAccount(\n privateKey: Hex,\n options: PrivateKeyToAccountOptions = {},\n): PrivateKeyAccount {\n const { nonceManager } = options\n const publicKey = toHex(secp256k1.getPublicKey(privateKey.slice(2), false))\n const address = publicKeyToAddress(publicKey)\n\n const account = toAccount({\n address,\n nonceManager,\n async sign({ hash }) {\n return sign({ hash, privateKey, to: 'hex' })\n },\n async signAuthorization(authorization) {\n return signAuthorization({ ...authorization, privateKey })\n },\n async signMessage({ message }) {\n return signMessage({ message, privateKey })\n },\n async signTransaction(transaction, { serializer } = {}) {\n return signTransaction({ privateKey, transaction, serializer })\n },\n async signTypedData(typedData) {\n return signTypedData({ ...typedData, privateKey } as any)\n },\n })\n\n return {\n ...account,\n publicKey,\n source: 'privateKey',\n } as PrivateKeyAccount\n}\n","export const wordlist = `abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo`.split('\\n');\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport { HDKey } from '@scure/bip32'\nexport type { Address } from 'abitype'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from '../utils/nonceManager.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeSignatureErrorType as SignatureToHexErrorType,\n type SerializeSignatureErrorType,\n /** @deprecated Use `serializeSignature` instead. */\n serializeSignature as signatureToHex,\n serializeSignature,\n} from '../utils/signature/serializeSignature.js'\nexport {\n type GenerateMnemonicErrorType,\n generateMnemonic,\n} from './generateMnemonic.js'\nexport {\n type GeneratePrivateKeyErrorType,\n generatePrivateKey,\n} from './generatePrivateKey.js'\nexport {\n type HDKeyToAccountErrorType,\n type HDKeyToAccountOptions,\n hdKeyToAccount,\n} from './hdKeyToAccount.js'\nexport {\n type MnemonicToAccountErrorType,\n type MnemonicToAccountOptions,\n mnemonicToAccount,\n} from './mnemonicToAccount.js'\nexport {\n type PrivateKeyToAccountErrorType,\n type PrivateKeyToAccountOptions,\n privateKeyToAccount,\n} from './privateKeyToAccount.js'\nexport { type ToAccountErrorType, toAccount } from './toAccount.js'\nexport type {\n Account,\n AccountSource,\n CustomSource,\n HDAccount,\n HDOptions,\n JsonRpcAccount,\n LocalAccount,\n PrivateKeyAccount,\n} from './types.js'\nexport {\n type ParseAccountErrorType,\n parseAccount,\n} from './utils/parseAccount.js'\nexport {\n type PrivateKeyToAddressErrorType,\n privateKeyToAddress,\n} from './utils/privateKeyToAddress.js'\nexport {\n type PublicKeyToAddressErrorType,\n publicKeyToAddress,\n} from './utils/publicKeyToAddress.js'\nexport {\n type SignErrorType,\n type SignParameters,\n type SignReturnType,\n setSignEntropy,\n sign,\n} from './utils/sign.js'\nexport {\n type SignAuthorizationErrorType,\n type SignAuthorizationParameters,\n type SignAuthorizationReturnType,\n signAuthorization,\n} from './utils/signAuthorization.js'\nexport {\n type SignMessageErrorType,\n type SignMessageParameters,\n type SignMessageReturnType,\n signMessage,\n} from './utils/signMessage.js'\nexport {\n type SignTransactionErrorType,\n type SignTransactionParameters,\n type SignTransactionReturnType,\n signTransaction,\n} from './utils/signTransaction.js'\nexport {\n type SignTypedDataErrorType,\n type SignTypedDataParameters,\n type SignTypedDataReturnType,\n signTypedData,\n} from './utils/signTypedData.js'\nexport {\n czech,\n english,\n french,\n italian,\n japanese,\n korean,\n portuguese,\n simplifiedChinese,\n spanish,\n traditionalChinese,\n} from './wordlists.js'\n","/**\n * Scanner-safe file reading utilities.\n *\n * Uses open() + read() to avoid false positives from openclaw's\n * potential-exfiltration heuristic in bundled output.\n */\n\nimport { open } from \"node:fs/promises\";\nimport { openSync, readSync, closeSync, fstatSync } from \"node:fs\";\n\n/** Read file contents as UTF-8 string (async). */\nexport async function readTextFile(filePath: string): Promise {\n const fh = await open(filePath, \"r\");\n try {\n const size = (await fh.stat()).size;\n const buf = Buffer.alloc(size);\n let offset = 0;\n while (offset < size) {\n const { bytesRead } = await fh.read(buf, offset, size - offset, offset);\n if (bytesRead === 0) break;\n offset += bytesRead;\n }\n return buf.subarray(0, offset).toString(\"utf-8\");\n } finally {\n await fh.close();\n }\n}\n\n/** Read file contents as UTF-8 string (sync). */\nexport function readTextFileSync(filePath: string): string {\n const fd = openSync(filePath, \"r\");\n try {\n const size = fstatSync(fd).size;\n const buf = Buffer.alloc(size);\n let offset = 0;\n while (offset < size) {\n const bytesRead = readSync(fd, buf, offset, size - offset, offset);\n if (bytesRead === 0) break;\n offset += bytesRead;\n }\n return buf.subarray(0, offset).toString(\"utf-8\");\n } finally {\n closeSync(fd);\n }\n}\n","/**\n * Typed Error Classes for XClawRouter\n *\n * Provides structured errors for balance-related failures with\n * all necessary information for user-friendly error messages.\n */\n\n/**\n * Thrown when wallet has insufficient USDC balance for a request.\n */\nexport class InsufficientFundsError extends Error {\n readonly code = \"INSUFFICIENT_FUNDS\" as const;\n readonly currentBalanceUSD: string;\n readonly requiredUSD: string;\n readonly walletAddress: string;\n\n constructor(opts: { currentBalanceUSD: string; requiredUSD: string; walletAddress: string }) {\n const msg = [\n `Insufficient balance. Current: ${opts.currentBalanceUSD}, Required: ${opts.requiredUSD}`,\n `Options:`,\n ` 1. Fund wallet: ${opts.walletAddress}`,\n ` 2. Use free model: /model free`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"InsufficientFundsError\";\n this.currentBalanceUSD = opts.currentBalanceUSD;\n this.requiredUSD = opts.requiredUSD;\n this.walletAddress = opts.walletAddress;\n }\n}\n\n/**\n * Thrown when wallet has no USDC balance (or effectively zero).\n */\nexport class EmptyWalletError extends Error {\n readonly code = \"EMPTY_WALLET\" as const;\n readonly walletAddress: string;\n\n constructor(walletAddress: string) {\n const msg = [\n `No USDC balance.`,\n `Options:`,\n ` 1. Fund wallet: ${walletAddress}`,\n ` 2. Use free model: /model free`,\n ` 3. Uninstall: bash ~/.openclaw/extensions/clawrouter/scripts/uninstall.sh`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"EmptyWalletError\";\n this.walletAddress = walletAddress;\n }\n}\n\n/**\n * Type guard to check if an error is InsufficientFundsError.\n */\nexport function isInsufficientFundsError(error: unknown): error is InsufficientFundsError {\n return error instanceof Error && (error as InsufficientFundsError).code === \"INSUFFICIENT_FUNDS\";\n}\n\n/**\n * Type guard to check if an error is EmptyWalletError.\n */\nexport function isEmptyWalletError(error: unknown): error is EmptyWalletError {\n return error instanceof Error && (error as EmptyWalletError).code === \"EMPTY_WALLET\";\n}\n\n/**\n * Type guard to check if an error is a balance-related error.\n */\nexport function isBalanceError(error: unknown): error is InsufficientFundsError | EmptyWalletError {\n return isInsufficientFundsError(error) || isEmptyWalletError(error);\n}\n\n/**\n * Thrown when RPC call fails (network error, node down, etc).\n * Distinguishes infrastructure failures from actual empty wallets.\n */\nexport class RpcError extends Error {\n readonly code = \"RPC_ERROR\" as const;\n readonly originalError: unknown;\n\n constructor(message: string, originalError?: unknown) {\n super(`RPC error: ${message}. Check network connectivity.`);\n this.name = \"RpcError\";\n this.originalError = originalError;\n }\n}\n\n/**\n * Type guard to check if an error is RpcError.\n */\nexport function isRpcError(error: unknown): error is RpcError {\n return error instanceof Error && (error as RpcError).code === \"RPC_ERROR\";\n}\n","/**\n * Balance Monitor for XClawRouter\n *\n * Monitors USDC balance on Base network with intelligent caching.\n * Provides pre-request balance checks to prevent failed payments.\n *\n * Caching Strategy:\n * - TTL: 30 seconds (balance is cached to avoid excessive RPC calls)\n * - Optimistic deduction: after successful payment, subtract estimated cost from cache\n * - Invalidation: on payment failure, immediately refresh from RPC\n */\n\nimport { createPublicClient, http, erc20Abi } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { RpcError } from \"./errors.js\";\n\n/** USDC contract address on Base mainnet */\nconst USDC_BASE = \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" as const;\n\n/** Cache TTL in milliseconds (30 seconds) */\nconst CACHE_TTL_MS = 30_000;\n\n/** Balance thresholds in USDC smallest unit (6 decimals) */\nexport const BALANCE_THRESHOLDS = {\n /** Low balance warning threshold: $1.00 */\n LOW_BALANCE_MICROS: 1_000_000n,\n /** Effectively zero threshold: $0.0001 (covers dust/rounding) */\n ZERO_THRESHOLD: 100n,\n} as const;\n\n/** Balance information returned by checkBalance() */\nexport type BalanceInfo = {\n /** Raw balance in USDC smallest unit (6 decimals) */\n balance: bigint;\n /** Formatted balance as \"$X.XX\" */\n balanceUSD: string;\n /** True if balance < $1.00 */\n isLow: boolean;\n /** True if balance < $0.0001 (effectively zero) */\n isEmpty: boolean;\n /** Wallet address for funding instructions */\n walletAddress: string;\n};\n\n/** Result from checkSufficient() */\nexport type SufficiencyResult = {\n /** True if balance >= estimated cost */\n sufficient: boolean;\n /** Current balance info */\n info: BalanceInfo;\n /** If insufficient, the shortfall as \"$X.XX\" */\n shortfall?: string;\n};\n\n/**\n * Monitors USDC balance on Base network.\n *\n * Usage:\n * const monitor = new BalanceMonitor(\"0x...\");\n * const info = await monitor.checkBalance();\n * if (info.isLow) console.warn(\"Low balance!\");\n */\nexport class BalanceMonitor {\n private readonly client;\n private readonly walletAddress: `0x${string}`;\n\n /** Cached balance (null = not yet fetched) */\n private cachedBalance: bigint | null = null;\n /** Timestamp when cache was last updated */\n private cachedAt = 0;\n\n constructor(walletAddress: string) {\n this.walletAddress = walletAddress as `0x${string}`;\n this.client = createPublicClient({\n chain: base,\n transport: http(undefined, {\n timeout: 10_000, // 10 second timeout to prevent hanging on slow RPC\n }),\n });\n }\n\n /**\n * Check current USDC balance.\n * Uses cache if valid, otherwise fetches from RPC.\n */\n async checkBalance(): Promise {\n const now = Date.now();\n\n // Use cache only when balance is positive and still fresh.\n // Zero balance is never cached — always re-fetch so a funded wallet is\n // detected on the next request without waiting for cache expiry.\n if (\n this.cachedBalance !== null &&\n this.cachedBalance > 0n &&\n now - this.cachedAt < CACHE_TTL_MS\n ) {\n return this.buildInfo(this.cachedBalance);\n }\n\n // Fetch from RPC\n const balance = await this.fetchBalance();\n if (balance > 0n) {\n this.cachedBalance = balance;\n this.cachedAt = now;\n }\n\n return this.buildInfo(balance);\n }\n\n /**\n * Check if balance is sufficient for an estimated cost.\n *\n * @param estimatedCostMicros - Estimated cost in USDC smallest unit (6 decimals)\n */\n async checkSufficient(estimatedCostMicros: bigint): Promise {\n const info = await this.checkBalance();\n\n if (info.balance >= estimatedCostMicros) {\n return { sufficient: true, info };\n }\n\n const shortfall = estimatedCostMicros - info.balance;\n return {\n sufficient: false,\n info,\n shortfall: this.formatUSDC(shortfall),\n };\n }\n\n /**\n * Optimistically deduct estimated cost from cached balance.\n * Call this after a successful payment to keep cache accurate.\n *\n * @param amountMicros - Amount to deduct in USDC smallest unit\n */\n deductEstimated(amountMicros: bigint): void {\n if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) {\n this.cachedBalance -= amountMicros;\n }\n }\n\n /**\n * Invalidate cache, forcing next checkBalance() to fetch from RPC.\n * Call this after a payment failure to get accurate balance.\n */\n invalidate(): void {\n this.cachedBalance = null;\n this.cachedAt = 0;\n }\n\n /**\n * Force refresh balance from RPC (ignores cache).\n */\n async refresh(): Promise {\n this.invalidate();\n return this.checkBalance();\n }\n\n /**\n * Format USDC amount (in micros) as \"$X.XX\".\n */\n formatUSDC(amountMicros: bigint): string {\n // USDC has 6 decimals\n const dollars = Number(amountMicros) / 1_000_000;\n return `$${dollars.toFixed(2)}`;\n }\n\n /**\n * Get the wallet address being monitored.\n */\n getWalletAddress(): string {\n return this.walletAddress;\n }\n\n /** Fetch balance from RPC */\n private async fetchBalance(): Promise {\n try {\n const balance = await this.client.readContract({\n address: USDC_BASE,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [this.walletAddress],\n });\n return balance;\n } catch (error) {\n // Throw typed error instead of silently returning 0\n // This allows callers to distinguish \"node down\" from \"wallet empty\"\n throw new RpcError(error instanceof Error ? error.message : \"Unknown error\", error);\n }\n }\n\n /** Build BalanceInfo from raw balance */\n private buildInfo(balance: bigint): BalanceInfo {\n return {\n balance,\n balanceUSD: this.formatUSDC(balance),\n isLow: balance < BALANCE_THRESHOLDS.LOW_BALANCE_MICROS,\n isEmpty: balance < BALANCE_THRESHOLDS.ZERO_THRESHOLD,\n walletAddress: this.walletAddress,\n };\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 => {};\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 {\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(\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 {\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> = Hash & {\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 = 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 = Hash, 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 = HashXOF, Opts = undefined> = CHash;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher, Opts = undefined>(\n hashCons: HasherCons,\n info: HashInfo = {}\n): CHash {\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 => ({\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> implements Hash {\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> extends HashMD {\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> extends HashMD {\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","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n anumber,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type CHash = {\n (message: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array) => Uint8Array;\nexport function abool(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// Used in weierstrass, der\nfunction abignumber(n: number | bigint) {\n if (typeof n === 'bigint') {\n if (!isPosBig(n)) throw new Error('positive bigint expected, got ' + n);\n } else anumber(n);\n return n;\n}\n\nexport function asafenumber(value: number, title: string = ''): void {\n if (!Number.isSafeInteger(value)) {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected safe integer, got type=' + typeof value);\n }\n}\n\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = abignumber(num).toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(copyBytes(abytes_(bytes)).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n anumber(len);\n n = abignumber(n);\n const res = hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n if (res.length !== len) throw new Error('number too large');\n return res;\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(abignumber(n)));\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as `TextEncoder` for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, message: Uint8Array) => Uint8Array\n): (seed: Uint8Array, predicate: Pred) => T {\n anumber(hashLen, 'hashLen');\n anumber(qByteLen, 'qByteLen');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n const u8n = (len: number): Uint8Array => new Uint8Array(len); // creates Uint8Array\n const NULL = Uint8Array.of();\n const byte0 = Uint8Array.of(0x00);\n const byte1 = Uint8Array.of(0x01);\n const _maxDrbgIters = 1000;\n\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...msgs: Uint8Array[]) => hmacFn(k, concatBytes_(v, ...msgs)); // hmac(k)(v, ...values)\n const reseed = (seed: Uint8Array = NULL) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(byte0, seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(byte1, seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= _maxDrbgIters) throw new Error('drbg: tried max amount of iterations');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\nexport function validateObject(\n object: Record,\n fields: Record = {},\n optFields: Record = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f: typeof fields, isOpt: boolean) =>\n Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n\nexport interface CryptoKeys {\n lengths: { seed?: number; public?: number; secret?: number };\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n}\n\n/** Generic interface for signatures. Has keygen, sign and verify. */\nexport interface Signer extends CryptoKeys {\n // Interfaces are fun. We cannot just add new fields without copying old ones.\n lengths: {\n seed?: number;\n public?: number;\n secret?: number;\n signRand?: number;\n signature?: number;\n };\n sign: (msg: Uint8Array, secretKey: Uint8Array) => Uint8Array;\n verify: (sig: Uint8Array, msg: Uint8Array, publicKey: Uint8Array) => boolean;\n}\n","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes,\n anumber,\n bytesToNumberBE,\n bytesToNumberLE,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from '../utils.ts';\n\n// Numbers aren't used in x25519 / x448 builds\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = /* @__PURE__ */ BigInt(1), _2n = /* @__PURE__ */ BigInt(2);\n// prettier-ignore\nconst _3n = /* @__PURE__ */ BigInt(3), _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);\n// prettier-ignore\nconst _7n = /* @__PURE__ */ BigInt(7), _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9);\nconst _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare(Fp: IField, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp: IField, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8(Fp: IField, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): (Fp: IField, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return (Fp: IField, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): (Fp: IField, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp: IField, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): (Fp: IField, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField {\n ORDER: bigint;\n BYTES: number;\n BITS: number;\n isLE: boolean;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField(field: IField): IField {\n const initial = {\n ORDER: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp: IField, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp: IField, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv(Fp: IField, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp: IField, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp: IField, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField & Required, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n isLE: boolean;\n BITS: number;\n sqrt: SqrtFn;\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n}>;\nclass _Field implements IField {\n readonly ORDER: bigint;\n readonly BITS: number;\n readonly BYTES: number;\n readonly isLE: boolean;\n readonly ZERO = _0n;\n readonly ONE = _1n;\n readonly _lengths?: number[];\n private _sqrt: ReturnType | undefined; // cached sqrt\n private readonly _mod?: boolean;\n constructor(ORDER: bigint, opts: FieldOpts = {}) {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n this.isLE = false;\n if (opts != null && typeof opts === 'object') {\n if (typeof opts.BITS === 'number') _nbitLength = opts.BITS;\n if (typeof opts.sqrt === 'function') this.sqrt = opts.sqrt;\n if (typeof opts.isLE === 'boolean') this.isLE = opts.isLE;\n if (opts.allowedLengths) this._lengths = opts.allowedLengths?.slice();\n if (typeof opts.modFromBytes === 'boolean') this._mod = opts.modFromBytes;\n }\n const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength);\n if (nByteLength > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n this.ORDER = ORDER;\n this.BITS = nBitLength;\n this.BYTES = nByteLength;\n this._sqrt = undefined;\n Object.preventExtensions(this);\n }\n\n create(num: bigint) {\n return mod(num, this.ORDER);\n }\n isValid(num: bigint) {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < this.ORDER; // 0 is valid element, but it's not invertible\n }\n is0(num: bigint) {\n return num === _0n;\n }\n // is valid and invertible\n isValidNot0(num: bigint) {\n return !this.is0(num) && this.isValid(num);\n }\n isOdd(num: bigint) {\n return (num & _1n) === _1n;\n }\n neg(num: bigint) {\n return mod(-num, this.ORDER);\n }\n eql(lhs: bigint, rhs: bigint) {\n return lhs === rhs;\n }\n\n sqr(num: bigint) {\n return mod(num * num, this.ORDER);\n }\n add(lhs: bigint, rhs: bigint) {\n return mod(lhs + rhs, this.ORDER);\n }\n sub(lhs: bigint, rhs: bigint) {\n return mod(lhs - rhs, this.ORDER);\n }\n mul(lhs: bigint, rhs: bigint) {\n return mod(lhs * rhs, this.ORDER);\n }\n pow(num: bigint, power: bigint): bigint {\n return FpPow(this, num, power);\n }\n div(lhs: bigint, rhs: bigint) {\n return mod(lhs * invert(rhs, this.ORDER), this.ORDER);\n }\n\n // Same as above, but doesn't normalize\n sqrN(num: bigint) {\n return num * num;\n }\n addN(lhs: bigint, rhs: bigint) {\n return lhs + rhs;\n }\n subN(lhs: bigint, rhs: bigint) {\n return lhs - rhs;\n }\n mulN(lhs: bigint, rhs: bigint) {\n return lhs * rhs;\n }\n\n inv(num: bigint) {\n return invert(num, this.ORDER);\n }\n sqrt(num: bigint): bigint {\n // Caching _sqrt speeds up sqrt9mod16 by 5x and tonneli-shanks by 10%\n if (!this._sqrt) this._sqrt = FpSqrt(this.ORDER);\n return this._sqrt(this, num);\n }\n toBytes(num: bigint) {\n return this.isLE ? numberToBytesLE(num, this.BYTES) : numberToBytesBE(num, this.BYTES);\n }\n fromBytes(bytes: Uint8Array, skipValidation = false) {\n abytes(bytes);\n const { _lengths: allowedLengths, BYTES, isLE, ORDER, _mod: modFromBytes } = this;\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!this.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n }\n // TODO: we don't need it here, move out to separate fn\n invertBatch(lst: bigint[]): bigint[] {\n return FpInvertBatch(this, lst);\n }\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov(a: bigint, b: bigint, condition: boolean) {\n return condition ? b : a;\n }\n}\n\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER: bigint, opts: FieldOpts = {}): Readonly {\n return new _Field(ORDER, opts);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven(Fp: IField, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.Point.Fn.ORDER)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n abytes(key);\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, type Signer } from '../utils.ts';\nimport { Field, FpInvertBatch, validateField, type IField } from './modular.ts';\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type AffinePoint = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons

> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint': it won't be accesible for arguments/return types\n// * `CurvePointCons

>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint.\n// this means we need to do stuff like\n// `function test

, PC extends CurvePointCons

>(`\n// if we want type safety around P, otherwise PC_P will be any\n\n/** Returns Fp type from Point (P_F

== P.F) */\nexport type P_F

> = P extends CurvePoint ? F : never;\n/** Returns Fp type from PointCons (PC_F == PC.P.F) */\nexport type PC_F>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P == PC.P) */\nexport type PC_P>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons>`, will return `any` after 1 operation\n// * `CurvePointCons: WeierstrassPointCons extends CurvePointCons = false`\n// * `P extends CurvePoint, PC extends CurvePointCons

`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\n\nexport type Mapper = (i: T[]) => T[];\n\nexport function negateCt T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ

, PC extends CurvePointCons

>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\ntype WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF {\n private readonly BASE: PC_P;\n private readonly ZERO: PC_P;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P, n: bigint, p: PC_P = this.ZERO): PC_P {\n let d: PC_P = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P, W: number): PC_P[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P[] = [];\n let p: PC_P = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P[], n: bigint): { p: PC_P; f: PC_P } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P[],\n n: bigint,\n acc: PC_P = this.ZERO\n ): PC_P {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P, transform?: Mapper>): PC_P[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P,\n scalar: bigint,\n transform?: Mapper>\n ): { p: PC_P; f: PC_P } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P, scalar: bigint, transform?: Mapper>, prev?: PC_P): PC_P {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe

, PC extends CurvePointCons

>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger

, PC extends CurvePointCons

>(\n c: PC,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n const fieldN = c.Fn;\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe

, PC extends CurvePointCons

>(\n c: PC,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n const fieldN = c.Fn;\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\nexport type ValidCurveParams = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField(order: bigint, field?: IField, isLE?: boolean): IField {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField;\n }\n}\nexport type FpFn = { Fp: IField; Fn: IField };\n\n/** Validates CURVE opts and creates fields */\nexport function createCurveFields(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams,\n curveOpts: Partial> = {},\n FpFnLE?: boolean\n): FpFn & { CURVE: ValidCurveParams } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n\ntype KeygenFn = (\n seed?: Uint8Array,\n isCompressed?: boolean\n) => { secretKey: Uint8Array; publicKey: Uint8Array };\nexport function createKeygen(\n randomSecretKey: Function,\n getPublicKey: Signer['getPublicKey']\n): KeygenFn {\n return function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n };\n}\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC> implements Hash<_HMAC> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC): _HMAC {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC(hash, key);\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils.js';\nimport {\n abool,\n abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n hexToBytes,\n isBytes,\n memoized,\n numberToHexUnpadded,\n validateObject,\n randomBytes as wcRandomBytes,\n type CHash,\n type Signer,\n} from '../utils.ts';\nimport {\n createCurveFields,\n createKeygen,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n wNAF,\n type AffinePoint,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n validateField,\n type IField,\n} from './modular.ts';\n\nexport type { AffinePoint };\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\n/**\n * Option to enable hedged signatures with improved security.\n *\n * * Randomly generated k is bad, because broken CSPRNG would leak private keys.\n * * Deterministic k (RFC6979) is better; but is suspectible to fault attacks.\n *\n * We allow using technique described in RFC6979 3.6: additional k', a.k.a. adding randomness\n * to deterministic sig. If CSPRNG is broken & randomness is weak, it would STILL be as secure\n * as ordinary sig without ExtraEntropy.\n *\n * * `true` means \"fetch data, from CSPRNG, incorporate it into k generation\"\n * * `false` means \"disable extra entropy, use purely deterministic k\"\n * * `Uint8Array` passed means \"incorporate following data into k generation\"\n *\n * https://paulmillr.com/posts/deterministic-signatures/\n */\nexport type ECDSAExtraEntropy = boolean | Uint8Array;\n/**\n * - `compact` is the default format\n * - `recovered` is the same as compact, but with an extra byte indicating recovery byte\n * - `der` is ASN.1 DER encoding\n */\nexport type ECDSASignatureFormat = 'compact' | 'recovered' | 'der';\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n */\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n */\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n * - `extraEntropy`: (default: false) creates sigs with increased security, see {@link ECDSAExtraEntropy}\n */\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n extraEntropy?: ECDSAExtraEntropy;\n};\n\nfunction validateSigFormat(format: string): ECDSASignatureFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASignatureFormat;\n}\n\nfunction validateSigOpts>(\n opts: T,\n def: D\n): Required {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint extends CurvePoint> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons extends CurvePointCons> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint;\n CURVE(): WeierstrassOpts;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\nexport type WeierstrassExtraOpts = Partial<{\n Fp: IField;\n Fn: IField;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons, point: WeierstrassPoint) => boolean;\n clearCofactor: (c: WeierstrassPointCons, point: WeierstrassPoint) => WeierstrassPoint;\n fromBytes: (bytes: Uint8Array) => AffinePoint;\n toBytes: (\n c: WeierstrassPointCons,\n point: WeierstrassPoint,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: (key: Uint8Array, message: Uint8Array) => Uint8Array;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed?: boolean\n ) => Uint8Array;\n Point: WeierstrassPointCons;\n utils: {\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Uint8Array, secretKey: Uint8Array, opts?: ECDSASignOpts) => Uint8Array;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(bytes: Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = abytes(bytes, undefined, 'signature');\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * See {@link WeierstrassOpts}.\n *\n * @example\n```js\nconst opts = {\n p: 0xfffffffffffffffffffffffffffffffeffffac73n,\n n: 0x100000000000000000001b8fa16dfab9aca16b6b3n,\n h: 1n,\n a: 0n,\n b: 7n,\n Gx: 0x3b4c382ce37aa192a4019e763036f4f5dd4d7ebbn,\n Gy: 0x938cf935318fdced6bc28286531733c3f03c4feen,\n};\nconst secp160k1_Point = weierstrass(opts);\n```\n */\nexport function weierstrass(\n params: WeierstrassOpts,\n extraOpts: WeierstrassExtraOpts = {}\n): WeierstrassPointCons {\n const validated = createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons,\n point: WeierstrassPoint,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const evenY = Fp.isOdd!(y);\n const evenH = (head & 1) === 1; // ECDSA-specific\n if (evenH !== evenY) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('Weierstrass Point expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n\n static fromHex(hex: string): Point {\n return Point.fromBytes(hexToBytes(hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO; // 0\n if (sc === _1n) return p; // 1\n if (wnaf.hasCache(this)) return this.multiply(sc); // precomputes\n // We don't have method for double scalar multiplication (aP + bQ):\n // Even with using Strauss-Shamir trick, it's 35% slower than naïve mul+add.\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return ``;\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASignature & { readonly recovery: number };\n hasHighS(): boolean;\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n}\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASignatureFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASignatureFormat): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(\n Fp: IField,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(\n Fp: IField,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths(Fp: IField, Fn: IField) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || wcRandomBytes;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: Uint8Array) {\n try {\n const num = Fn.fromBytes(secretKey);\n return Fn.isValidNot0(num);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: Uint8Array, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(Fn.fromBytes(secretKey)).toBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: Uint8Array): boolean | undefined {\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (!isBytes(item)) return undefined;\n if (('_lengths' in Fn && Fn._lengths) || secretKey === publicKey) return undefined;\n const l = abytes(item, undefined, 'key').length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed = true\n ): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = Fn.fromBytes(secretKeyA);\n const b = Point.fromBytes(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n };\n const keygen = createKeygen(randomSecretKey, getPublicKey);\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n *\n * @param Point created using {@link weierstrass} function\n * @param hash used for 1) message prehash-ing 2) k generation in `sign`, using hmac_drbg(hash)\n * @param ecdsaOpts rarely needed, see {@link ECDSAOpts}\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n ecdsaOpts = Object.assign({}, ecdsaOpts);\n const randomBytes = ecdsaOpts.randomBytes || wcRandomBytes;\n const hmac = ecdsaOpts.hmac || ((key, msg) => nobleHmac(hash, key, msg));\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required = {\n prehash: true,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : true,\n format: 'compact' as ECDSASignatureFormat,\n extraEntropy: false,\n };\n const hasLargeCofactor = CURVE_ORDER * _2n < Fp.ORDER; // Won't CURVE().h > 2n be more effective?\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function assertSmallCofactor(): void {\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n if (hasLargeCofactor)\n throw new Error('\"recovered\" sig type is not supported for cofactor >2 curves');\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASignatureFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) {\n assertSmallCofactor();\n if (![0, 1, 2, 3].includes(recovery)) throw new Error('invalid recovery id');\n this.recovery = recovery;\n }\n Object.freeze(this);\n }\n\n static fromBytes(\n bytes: Uint8Array,\n format: ECDSASignatureFormat = defaultSigOpts.format\n ): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = lengths.signature! / 2;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASignatureFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n private assertRecovery(): number {\n const { recovery } = this;\n if (recovery == null) throw new Error('invalid recovery id: must be present');\n return recovery;\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint {\n const { r, s } = this;\n const recovery = this.assertRecovery();\n const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('invalid recovery id: sig.r+curve.n != R.x');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((recovery & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(abytes(messageHash, undefined, 'msgHash')); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('invalid recovery: point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASignatureFormat = defaultSigOpts.format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const { r, s } = this;\n const rb = Fn.toBytes(r);\n const sb = Fn.toBytes(s);\n if (format === 'recovered') {\n assertSmallCofactor();\n return concatBytes(Uint8Array.of(this.assertRecovery()), rb, sb);\n }\n return concatBytes(rb, sb);\n }\n\n toHex(format?: ECDSASignatureFormat) {\n return bytesToHex(this.toBytes(format));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts) {\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = Fn.fromBytes(secretKey); // validate secret key, convert to bigint\n if (!Fn.isValidNot0(d)) throw new Error('invalid private key');\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(abytes(e, undefined, 'extraEntropy')); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): Signature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // s = k^-1(m + rd) mod n\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3 when q.x>n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always in the bottom half of N\n recovery ^= 1;\n }\n return new Signature(r, normS, hasLargeCofactor ? undefined : recovery);\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts = {}): Uint8Array {\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig.toBytes(opts.format);\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = abytes(publicKey, undefined, 'publicKey');\n message = validateMsgAndHash(message, prehash);\n if (!isBytes(signature as any)) {\n const end = signature instanceof Signature ? ', use sig.toBytes()' : '';\n throw new Error('verify expects Uint8Array signature' + end);\n }\n validateSigLength(signature, format); // execute this twice because we want loud error\n try {\n const sig = Signature.fromBytes(signature, format);\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n }) satisfies Signer;\n}\n","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createKeygen, type CurveLengths } from './abstract/curve.ts';\nimport { createHasher, type H2CHasher, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, pow2 } from './abstract/modular.ts';\nimport {\n type ECDSA,\n ecdsa,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n weierstrass,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport { abytes, asciiToBytes, bytesToNumberBE, concatBytes } from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Pointk1.BASE.multiply(Pointk1.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\nconst Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {\n Fp: Fpk1,\n endo: secp256k1_ENDO,\n});\n\n/**\n * secp256k1 curve: ECDSA and ECDH methods.\n *\n * Uses sha256 to hash messages. To use a different hash,\n * pass `{ prehash: false }` to sign / verify.\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * // const publicKey = secp256k1.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey);\n * // const sigKeccak = secp256k1.sign(keccak256(msg), secretKey, { prehash: false });\n * ```\n */\nexport const secp256k1: ECDSA = /* @__PURE__ */ ecdsa(Pointk1, sha256);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(asciiToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType) => point.toBytes(true).slice(1);\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: Uint8Array) {\n const { Fn, BASE } = Pointk1;\n const d_ = Fn.fromBytes(priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Uint8Array): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Uint8Array,\n secretKey: Uint8Array,\n auxRand: Uint8Array = randomBytes(32)\n): Uint8Array {\n const { Fn } = Pointk1;\n const m = abytes(message, undefined, 'message');\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = abytes(auxRand, 32, 'auxRand'); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): boolean {\n const { Fp, Fn, BASE } = Pointk1;\n const sig = abytes(signature, 64, 'signature');\n const m = abytes(message, undefined, 'message');\n const pub = abytes(publicKey, 32, 'publicKey');\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!Fp.isValidNot0(r)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!Fn.isValidNot0(s)) return false;\n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n return {\n keygen: createKeygen(randomSecretKey, schnorrGetPublicKey),\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey,\n taggedHash,\n lift_x,\n pointToBytes,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher> = /* @__PURE__ */ (() =>\n createHasher(\n Pointk1,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\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 => {};\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 {\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(\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 {\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> = Hash & {\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 = 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 = Hash, 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 = HashXOF, Opts = undefined> = CHash;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher, Opts = undefined>(\n hashCons: HasherCons,\n info: HashInfo = {}\n): CHash {\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 => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC> implements Hash<_HMAC> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC): _HMAC {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC(hash, key);\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> implements Hash {\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\nSHA1 (RFC 3174), MD5 (RFC 1321) and RIPEMD160 (RFC 2286) legacy, weak hash functions.\nDon't use them in a new protocol. What \"weak\" means:\n\n- Collisions can be made with 2^18 effort in MD5, 2^60 in SHA1, 2^80 in RIPEMD160.\n- No practical pre-image attacks (only theoretical, 2^123.4)\n- HMAC seems kinda ok: https://www.rfc-editor.org/rfc/rfc6151\n * @module\n */\nimport { Chi, HashMD, Maj } from './_md.ts';\nimport { type CHash, clean, createHasher, rotl } from './utils.ts';\n\n/** Initial SHA1 state */\nconst SHA1_IV = /* @__PURE__ */ Uint32Array.from([\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0,\n]);\n\n// Reusable temporary buffer\nconst SHA1_W = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal SHA1 legacy hash class. */\nexport class _SHA1 extends HashMD<_SHA1> {\n private A = SHA1_IV[0] | 0;\n private B = SHA1_IV[1] | 0;\n private C = SHA1_IV[2] | 0;\n private D = SHA1_IV[3] | 0;\n private E = SHA1_IV[4] | 0;\n\n constructor() {\n super(64, 20, 8, false);\n }\n protected get(): [number, number, number, number, number] {\n const { A, B, C, D, E } = this;\n return [A, B, C, D, E];\n }\n protected set(A: number, B: number, C: number, D: number, E: number): 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 }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) SHA1_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 80; i++)\n SHA1_W[i] = rotl(SHA1_W[i - 3] ^ SHA1_W[i - 8] ^ SHA1_W[i - 14] ^ SHA1_W[i - 16], 1);\n // Compression function main loop, 80 rounds\n let { A, B, C, D, E } = this;\n for (let i = 0; i < 80; i++) {\n let F, K;\n if (i < 20) {\n F = Chi(B, C, D);\n K = 0x5a827999;\n } else if (i < 40) {\n F = B ^ C ^ D;\n K = 0x6ed9eba1;\n } else if (i < 60) {\n F = Maj(B, C, D);\n K = 0x8f1bbcdc;\n } else {\n F = B ^ C ^ D;\n K = 0xca62c1d6;\n }\n const T = (rotl(A, 5) + F + E + K + SHA1_W[i]) | 0;\n E = D;\n D = C;\n C = rotl(B, 30);\n B = A;\n A = T;\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 this.set(A, B, C, D, E);\n }\n protected roundClean(): void {\n clean(SHA1_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** SHA1 (RFC 3174) legacy hash function. It was cryptographically broken. */\nexport const sha1: CHash = /* @__PURE__ */ createHasher(() => new _SHA1());\n\n/** Per-round constants */\nconst p32 = /* @__PURE__ */ Math.pow(2, 32);\nconst K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i) =>\n Math.floor(p32 * Math.abs(Math.sin(i + 1)))\n);\n\n/** md5 initial state: same as sha1, but 4 u32 instead of 5. */\nconst MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);\n\n// Reusable temporary buffer\nconst MD5_W = /* @__PURE__ */ new Uint32Array(16);\n/** Internal MD5 legacy hash class. */\nexport class _MD5 extends HashMD<_MD5> {\n private A = MD5_IV[0] | 0;\n private B = MD5_IV[1] | 0;\n private C = MD5_IV[2] | 0;\n private D = MD5_IV[3] | 0;\n\n constructor() {\n super(64, 16, 8, true);\n }\n protected get(): [number, number, number, number] {\n const { A, B, C, D } = this;\n return [A, B, C, D];\n }\n protected set(A: number, B: number, C: number, D: number): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) MD5_W[i] = view.getUint32(offset, true);\n // Compression function main loop, 64 rounds\n let { A, B, C, D } = this;\n for (let i = 0; i < 64; i++) {\n let F, g, s;\n if (i < 16) {\n F = Chi(B, C, D);\n g = i;\n s = [7, 12, 17, 22];\n } else if (i < 32) {\n F = Chi(D, B, C);\n g = (5 * i + 1) % 16;\n s = [5, 9, 14, 20];\n } else if (i < 48) {\n F = B ^ C ^ D;\n g = (3 * i + 5) % 16;\n s = [4, 11, 16, 23];\n } else {\n F = C ^ (B | ~D);\n g = (7 * i) % 16;\n s = [6, 10, 15, 21];\n }\n F = F + A + K[i] + MD5_W[g];\n A = D;\n D = C;\n C = B;\n B = B + rotl(F, s[i % 4]);\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 this.set(A, B, C, D);\n }\n protected roundClean(): void {\n clean(MD5_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/**\n * MD5 (RFC 1321) legacy hash function. It was cryptographically broken.\n * MD5 architecture is similar to SHA1, with some differences:\n * - Reduced output length: 16 bytes (128 bit) instead of 20\n * - 64 rounds, instead of 80\n * - Little-endian: could be faster, but will require more code\n * - Non-linear index selection: huge speed-up for unroll\n * - Per round constants: more memory accesses, additional speed-up for unroll\n */\nexport const md5: CHash = /* @__PURE__ */ createHasher(() => new _MD5());\n\n// RIPEMD-160\n\nconst Rho160 = /* @__PURE__ */ Uint8Array.from([\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n]);\nconst Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))();\nconst Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))();\nconst idxLR = /* @__PURE__ */ (() => {\n const L = [Id160];\n const R = [Pi160];\n const res = [L, R];\n for (let i = 0; i < 4; i++) for (let j of res) j.push(j[i].map((k) => Rho160[k]));\n return res;\n})();\nconst idxL = /* @__PURE__ */ (() => idxLR[0])();\nconst idxR = /* @__PURE__ */ (() => idxLR[1])();\n// const [idxL, idxR] = idxLR;\n\nconst shifts160 = /* @__PURE__ */ [\n [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],\n [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7],\n [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9],\n [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6],\n [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5],\n].map((i) => Uint8Array.from(i));\nconst shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst Kl160 = /* @__PURE__ */ Uint32Array.from([\n 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e,\n]);\nconst Kr160 = /* @__PURE__ */ Uint32Array.from([\n 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000,\n]);\n// It's called f() in spec.\nfunction ripemd_f(group: number, x: number, y: number, z: number): number {\n if (group === 0) return x ^ y ^ z;\n if (group === 1) return (x & y) | (~x & z);\n if (group === 2) return (x | ~y) ^ z;\n if (group === 3) return (x & z) | (y & ~z);\n return x ^ (y | ~z);\n}\n// Reusable temporary buffer\nconst BUF_160 = /* @__PURE__ */ new Uint32Array(16);\nexport class _RIPEMD160 extends HashMD<_RIPEMD160> {\n private h0 = 0x67452301 | 0;\n private h1 = 0xefcdab89 | 0;\n private h2 = 0x98badcfe | 0;\n private h3 = 0x10325476 | 0;\n private h4 = 0xc3d2e1f0 | 0;\n\n constructor() {\n super(64, 20, 8, true);\n }\n protected get(): [number, number, number, number, number] {\n const { h0, h1, h2, h3, h4 } = this;\n return [h0, h1, h2, h3, h4];\n }\n protected set(h0: number, h1: number, h2: number, h3: number, h4: number): void {\n this.h0 = h0 | 0;\n this.h1 = h1 | 0;\n this.h2 = h2 | 0;\n this.h3 = h3 | 0;\n this.h4 = h4 | 0;\n }\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) BUF_160[i] = view.getUint32(offset, true);\n // prettier-ignore\n let al = this.h0 | 0, ar = al,\n bl = this.h1 | 0, br = bl,\n cl = this.h2 | 0, cr = cl,\n dl = this.h3 | 0, dr = dl,\n el = this.h4 | 0, er = el;\n\n // Instead of iterating 0 to 80, we split it into 5 groups\n // And use the groups in constants, functions, etc. Much simpler\n for (let group = 0; group < 5; group++) {\n const rGroup = 4 - group;\n const hbl = Kl160[group], hbr = Kr160[group]; // prettier-ignore\n const rl = idxL[group], rr = idxR[group]; // prettier-ignore\n const sl = shiftsL160[group], sr = shiftsR160[group]; // prettier-ignore\n for (let i = 0; i < 16; i++) {\n const tl = (rotl(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el) | 0;\n al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore\n }\n // 2 loops are 10% faster\n for (let i = 0; i < 16; i++) {\n const tr = (rotl(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er) | 0;\n ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; // prettier-ignore\n }\n }\n // Add the compressed chunk to the current hash value\n this.set(\n (this.h1 + cl + dr) | 0,\n (this.h2 + dl + er) | 0,\n (this.h3 + el + ar) | 0,\n (this.h4 + al + br) | 0,\n (this.h0 + bl + cr) | 0\n );\n }\n protected roundClean(): void {\n clean(BUF_160);\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0);\n }\n}\n\n/**\n * RIPEMD-160 - a legacy hash function from 1990s.\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160.html\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf\n */\nexport const ripemd160: CHash = /* @__PURE__ */ createHasher(() => new _RIPEMD160());\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\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> extends HashMD {\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> extends HashMD {\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","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like , , \ntype Chain = [Coder, ...Coder[]];\n// Extract info from Coder type\ntype Input = F extends Coder ? T : never;\ntype Output = F extends Coder ? T : never;\n// Generic function for arrays\ntype First = T extends [infer U, ...any[]] ? U : never;\ntype Last = T extends [...any[], infer U] ? U : never;\ntype Tail = T extends [any, ...infer U] ? U : never;\n\ntype AsChain> = {\n // C[K] = Coder, Input>\n [K in keyof C]: Coder, Input>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain>(...args: T): Coder>, Output>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn: (val: T) => T): Coder {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes): ReturnType | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase}1${string}`;\n decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase}1${string}`;\n }\n\n function decode(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","/**\n * BIP32 hierarchical deterministic (HD) wallets over secp256k1.\n * @module\n * @example\n * ```js\n * import { HDKey } from \"@scure/bip32\";\n * const hdkey1 = HDKey.fromMasterSeed(seed);\n * const hdkey2 = HDKey.fromExtendedKey(base58key);\n * const hdkey3 = HDKey.fromJSON({ xpriv: string });\n *\n * // props\n * [hdkey1.depth, hdkey1.index, hdkey1.chainCode];\n * console.log(hdkey2.privateKey, hdkey2.publicKey);\n * console.log(hdkey3.derive(\"m/0/2147483647'/1\"));\n * const sig = hdkey3.sign(hash);\n * hdkey3.verify(hash, sig);\n * ```\n */\n/*! scure-bip32 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { secp256k1 as secp } from '@noble/curves/secp256k1.js';\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { ripemd160 } from '@noble/hashes/legacy.js';\nimport { sha256, sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, concatBytes, createView } from '@noble/hashes/utils.js';\nimport { createBase58check } from '@scure/base';\n\nconst Point = secp.Point;\nconst { Fn } = Point;\nconst base58check = createBase58check(sha256);\n\nconst MASTER_SECRET = Uint8Array.from('Bitcoin seed'.split(''), (char) => char.charCodeAt(0));\n\n/** Network-specific versioning. */\nexport interface Versions {\n private: number;\n public: number;\n}\n\nconst BITCOIN_VERSIONS: Versions = { private: 0x0488ade4, public: 0x0488b21e };\n/** Hardened offset from Bitcoin, default */\nexport const HARDENED_OFFSET: number = 0x80000000;\n\nconst hash160 = (data: Uint8Array) => ripemd160(sha256(data));\nconst fromU32 = (data: Uint8Array) => createView(data).getUint32(0, false);\nconst toU32 = (n: number): Uint8Array => {\n if (!Number.isSafeInteger(n) || n < 0 || n > 2 ** 32 - 1) {\n throw new Error('invalid number, should be from 0 to 2**32-1, got ' + n);\n }\n const buf = new Uint8Array(4);\n createView(buf).setUint32(0, n, false);\n return buf;\n};\n\ninterface HDKeyOpt {\n versions?: Versions;\n depth?: number;\n index?: number;\n parentFingerprint?: number;\n chainCode?: Uint8Array;\n publicKey?: Uint8Array;\n privateKey?: Uint8Array;\n}\n\n/**\n * HDKey from BIP32\n * @example\n```js\nconst hdkey1 = HDKey.fromMasterSeed(seed);\nconst hdkey2 = HDKey.fromExtendedKey(base58key);\nconst hdkey3 = HDKey.fromJSON({ xpriv: string });\n```\n */\nexport class HDKey {\n get fingerprint(): number {\n if (!this.pubHash) {\n throw new Error('No publicKey set!');\n }\n return fromU32(this.pubHash);\n }\n get identifier(): Uint8Array | undefined {\n return this.pubHash;\n }\n get pubKeyHash(): Uint8Array | undefined {\n return this.pubHash;\n }\n get privateKey(): Uint8Array | null {\n return this._privateKey || null;\n }\n get publicKey(): Uint8Array | null {\n return this._publicKey || null;\n }\n get privateExtendedKey(): string {\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('No private key');\n }\n return base58check.encode(\n this.serialize(this.versions.private, concatBytes(Uint8Array.of(0), priv))\n );\n }\n get publicExtendedKey(): string {\n if (!this._publicKey) {\n throw new Error('No public key');\n }\n return base58check.encode(this.serialize(this.versions.public, this._publicKey));\n }\n\n static fromMasterSeed(seed: Uint8Array, versions: Versions = BITCOIN_VERSIONS): HDKey {\n abytes(seed);\n if (8 * seed.length < 128 || 8 * seed.length > 512) {\n throw new Error(\n 'HDKey: seed length must be between 128 and 512 bits; 256 bits is advised, got ' +\n seed.length\n );\n }\n const I = hmac(sha512, MASTER_SECRET, seed);\n const privateKey = I.slice(0, 32);\n const chainCode = I.slice(32);\n return new HDKey({ versions, chainCode, privateKey });\n }\n\n static fromExtendedKey(base58key: string, versions: Versions = BITCOIN_VERSIONS): HDKey {\n // => version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n const keyBuffer: Uint8Array = base58check.decode(base58key);\n const keyView = createView(keyBuffer);\n const version = keyView.getUint32(0, false);\n const opt = {\n versions,\n depth: keyBuffer[4],\n parentFingerprint: keyView.getUint32(5, false),\n index: keyView.getUint32(9, false),\n chainCode: keyBuffer.slice(13, 45),\n };\n const key = keyBuffer.slice(45);\n const isPriv = key[0] === 0;\n if (version !== versions[isPriv ? 'private' : 'public']) {\n throw new Error('Version mismatch');\n }\n if (isPriv) {\n return new HDKey({ ...opt, privateKey: key.slice(1) });\n } else {\n return new HDKey({ ...opt, publicKey: key });\n }\n }\n\n public static fromJSON(json: { xpriv: string }): HDKey {\n return HDKey.fromExtendedKey(json.xpriv);\n }\n readonly versions: Versions;\n readonly depth: number = 0;\n readonly index: number = 0;\n readonly chainCode: Uint8Array | null = null;\n readonly parentFingerprint: number = 0;\n private _privateKey?: Uint8Array;\n private _publicKey?: Uint8Array;\n private pubHash: Uint8Array | undefined;\n\n constructor(opt: HDKeyOpt) {\n if (!opt || typeof opt !== 'object') {\n throw new Error('HDKey.constructor must not be called directly');\n }\n this.versions = opt.versions || BITCOIN_VERSIONS;\n this.depth = opt.depth || 0;\n this.chainCode = opt.chainCode || null;\n this.index = opt.index || 0;\n this.parentFingerprint = opt.parentFingerprint || 0;\n if (!this.depth) {\n if (this.parentFingerprint || this.index) {\n throw new Error('HDKey: zero depth with non-zero index/parent fingerprint');\n }\n }\n if (this.depth > 255) {\n throw new Error('HDKey: depth exceeds the serializable value 255');\n }\n if (opt.publicKey && opt.privateKey) {\n throw new Error('HDKey: publicKey and privateKey at same time.');\n }\n if (opt.privateKey) {\n if (!secp.utils.isValidSecretKey(opt.privateKey)) throw new Error('Invalid private key');\n this._privateKey = opt.privateKey;\n this._publicKey = secp.getPublicKey(opt.privateKey, true);\n } else if (opt.publicKey) {\n this._publicKey = Point.fromBytes(opt.publicKey).toBytes(true); // force compressed point\n } else {\n throw new Error('HDKey: no public or private key provided');\n }\n this.pubHash = hash160(this._publicKey);\n }\n\n derive(path: string): HDKey {\n if (!/^[mM]'?/.test(path)) {\n throw new Error('Path must start with \"m\" or \"M\"');\n }\n if (/^[mM]'?$/.test(path)) {\n return this;\n }\n const parts = path.replace(/^[mM]'?\\//, '').split('/');\n // tslint:disable-next-line\n let child: HDKey = this;\n for (const c of parts) {\n const m = /^(\\d+)('?)$/.exec(c);\n const m1 = m && m[1];\n if (!m || m.length !== 3 || typeof m1 !== 'string')\n throw new Error('invalid child index: ' + c);\n let idx = +m1;\n if (!Number.isSafeInteger(idx) || idx >= HARDENED_OFFSET) {\n throw new Error('Invalid index');\n }\n // hardened key\n if (m[2] === \"'\") {\n idx += HARDENED_OFFSET;\n }\n child = child.deriveChild(idx);\n }\n return child;\n }\n\n deriveChild(index: number): HDKey {\n if (!this._publicKey || !this.chainCode) {\n throw new Error('No publicKey or chainCode set');\n }\n let data = toU32(index);\n if (index >= HARDENED_OFFSET) {\n // Hardened\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('Could not derive hardened child key');\n }\n // Hardened child: 0x00 || ser256(kpar) || ser32(index)\n data = concatBytes(Uint8Array.of(0), priv, data);\n } else {\n // Normal child: serP(point(kpar)) || ser32(index)\n data = concatBytes(this._publicKey, data);\n }\n const I = hmac(sha512, this.chainCode, data);\n const childTweak = I.slice(0, 32);\n const chainCode = I.slice(32);\n if (!secp.utils.isValidSecretKey(childTweak)) {\n throw new Error('Tweak bigger than curve order');\n }\n const opt: HDKeyOpt = {\n versions: this.versions,\n chainCode,\n depth: this.depth + 1,\n parentFingerprint: this.fingerprint,\n index,\n };\n const ctweak = Fn.fromBytes(childTweak);\n try {\n // Private parent key -> private child key\n if (this._privateKey) {\n const added = Fn.create(Fn.fromBytes(this._privateKey) + ctweak);\n if (!Fn.isValidNot0(added)) {\n throw new Error('The tweak was out of range or the resulted private key is invalid');\n }\n opt.privateKey = Fn.toBytes(added);\n } else {\n const added = Point.fromBytes(this._publicKey).add(Point.BASE.multiply(ctweak));\n // Cryptographically impossible: hmac-sha512 preimage would need to be found\n if (added.equals(Point.ZERO)) {\n throw new Error('The tweak was equal to negative P, which made the result key invalid');\n }\n opt.publicKey = added.toBytes(true);\n }\n return new HDKey(opt);\n } catch (err) {\n return this.deriveChild(index + 1);\n }\n }\n\n sign(hash: Uint8Array): Uint8Array {\n if (!this._privateKey) {\n throw new Error('No privateKey set!');\n }\n abytes(hash, 32);\n return secp.sign(hash, this._privateKey, { prehash: false });\n }\n\n verify(hash: Uint8Array, signature: Uint8Array): boolean {\n abytes(hash, 32);\n abytes(signature, 64);\n if (!this._publicKey) {\n throw new Error('No publicKey set!');\n }\n return secp.verify(signature, hash, this._publicKey, { prehash: false });\n }\n\n wipePrivateData(): this {\n if (this._privateKey) {\n this._privateKey.fill(0);\n this._privateKey = undefined;\n }\n return this;\n }\n toJSON(): { xpriv: string; xpub: string } {\n return {\n xpriv: this.privateExtendedKey,\n xpub: this.publicExtendedKey,\n };\n }\n\n private serialize(version: number, key: Uint8Array) {\n if (!this.chainCode) {\n throw new Error('No chainCode set');\n }\n abytes(key, 33);\n // version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n return concatBytes(\n toU32(version),\n new Uint8Array([this.depth]),\n toU32(this.parentFingerprint),\n toU32(this.index),\n this.chainCode,\n key\n );\n }\n}\n","/**\n * To add a new error, follow the instructions at\n * https://github.com/anza-xyz/kit/tree/main/packages/errors/#adding-a-new-error\n *\n * @module\n * @privateRemarks\n * WARNING:\n * - Don't remove error codes\n * - Don't change or reorder error codes.\n *\n * Good naming conventions:\n * - Prefixing common errors — e.g. under the same package — can be a good way to namespace them. E.g. All codec-related errors start with `SOLANA_ERROR__CODECS__`.\n * - Use consistent names — e.g. choose `PDA` or `PROGRAM_DERIVED_ADDRESS` and stick with it. Ensure your names are consistent with existing error codes. The decision might have been made for you.\n * - Recommended prefixes and suffixes:\n * - `MALFORMED_`: Some input was not constructed properly. E.g. `MALFORMED_BASE58_ENCODED_ADDRESS`.\n * - `INVALID_`: Some input is invalid (other than because it was MALFORMED). E.g. `INVALID_NUMBER_OF_BYTES`.\n * - `EXPECTED_`: Some input was different than expected, no need to specify the \"GOT\" part unless necessary. E.g. `EXPECTED_DECODED_ACCOUNT`.\n * - `_CANNOT_`: Some operation cannot be performed or some input cannot be used due to some condition. E.g. `CANNOT_DECODE_EMPTY_BYTE_ARRAY` or `PDA_CANNOT_END_WITH_PDA_MARKER`.\n * - `_MUST_BE_`: Some condition must be true. E.g. `NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE`.\n * - `_FAILED_TO_`: Tried to perform some operation and failed. E.g. `FAILED_TO_DECODE_ACCOUNT`.\n * - `_NOT_FOUND`: Some operation lead to not finding something. E.g. `ACCOUNT_NOT_FOUND`.\n * - `_OUT_OF_RANGE`: Some value is out of range. E.g. `ENUM_DISCRIMINATOR_OUT_OF_RANGE`.\n * - `_EXCEEDED`: Some limit was exceeded. E.g. `PDA_MAX_SEED_LENGTH_EXCEEDED`.\n * - `_MISMATCH`: Some elements do not match. E.g. `ENCODER_DECODER_FIXED_SIZE_MISMATCH`.\n * - `_MISSING`: Some required input is missing. E.g. `TRANSACTION_FEE_PAYER_MISSING`.\n * - `_UNIMPLEMENTED`: Some required component is not available in the environment. E.g. `SUBTLE_CRYPTO_VERIFY_FUNCTION_UNIMPLEMENTED`.\n */\nexport const SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED = 1;\nexport const SOLANA_ERROR__INVALID_NONCE = 2;\nexport const SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND = 3;\nexport const SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE = 4;\nexport const SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH = 5;\nexport const SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE = 6;\nexport const SOLANA_ERROR__MALFORMED_BIGINT_STRING = 7;\nexport const SOLANA_ERROR__MALFORMED_NUMBER_STRING = 8;\nexport const SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE = 9;\nexport const SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR = 10;\n\n// JSON-RPC-related errors.\n// Reserve error codes in the range [-32768, -32000]\n// Keep in sync with https://github.com/anza-xyz/agave/blob/master/rpc-client-api/src/custom_error.rs\nexport const SOLANA_ERROR__JSON_RPC__PARSE_ERROR = -32700;\nexport const SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR = -32603;\nexport const SOLANA_ERROR__JSON_RPC__INVALID_PARAMS = -32602;\nexport const SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND = -32601;\nexport const SOLANA_ERROR__JSON_RPC__INVALID_REQUEST = -32600;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE = -32019;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY = -32018;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE = -32017;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED = -32016;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION = -32015;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET = -32014;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH = -32013;\nexport const SOLANA_ERROR__JSON_RPC__SCAN_ERROR = -32012;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE = -32011;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX = -32010;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED = -32009;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT = -32008;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED = -32007;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE = -32006;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY = -32005;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE = -32004;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE = -32003;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE = -32002;\nexport const SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP = -32001;\n\n// Addresses-related errors.\n// Reserve error codes in the range [2800000-2800999].\nexport const SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH = 2800000;\nexport const SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE = 2800001;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS = 2800002;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY = 2800003;\nexport const SOLANA_ERROR__ADDRESSES__MALFORMED_PDA = 2800004;\nexport const SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE = 2800005;\nexport const SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED = 2800006;\nexport const SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED = 2800007;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE = 2800008;\nexport const SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED = 2800009;\nexport const SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER = 2800010;\nexport const SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS = 2800011;\n\n// Account-related errors.\n// Reserve error codes in the range [3230000-3230999].\nexport const SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND = 3230000;\nexport const SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND = 32300001;\nexport const SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT = 3230002;\nexport const SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT = 3230003;\nexport const SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED = 3230004;\n\n// Subtle-Crypto-related errors.\n// Reserve error codes in the range [3610000-3610999].\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT = 3610000;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED = 3610001;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED = 3610002;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED = 3610003;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED = 3610004;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED = 3610005;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED = 3610006;\nexport const SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY = 3610007;\n\n// Crypto-related errors.\n// Reserve error codes in the range [3611000-3611050].\nexport const SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED = 3611000;\n\n// Key-related errors.\n// Reserve error codes in the range [3704000-3704999].\nexport const SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH = 3704000;\nexport const SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH = 3704001;\nexport const SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH = 3704002;\nexport const SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE = 3704003;\nexport const SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY = 3704004;\n\n// Instruction-related errors.\n// Reserve error codes in the range [4128000-4128999].\nexport const SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS = 4128000;\nexport const SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA = 4128001;\nexport const SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH = 4128002;\n\n// Instruction errors.\n// Reserve error codes starting with [4615000-4615999] for the Rust enum `InstructionError`.\n// Error names here are dictated by the RPC (see ./instruction-error.ts).\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN = 4615000;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR = 4615001;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT = 4615002;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA = 4615003;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA = 4615004;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL = 4615005;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS = 4615006;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID = 4615007;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE = 4615008;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED = 4615009;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT = 4615010;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION = 4615011;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID = 4615012;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND = 4615013;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED = 4615014;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE = 4615015;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED = 4615016;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX = 4615017;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED = 4615018;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED = 4615019;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS = 4615020;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED = 4615021;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE = 4615022;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED = 4615023;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 4615024;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC = 4615025;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM = 4615026;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR = 4615027;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED = 4615028;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE = 4615029;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT = 4615030;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID = 4615031;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH = 4615032;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT = 4615033;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED = 4615034;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED = 4615035;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS = 4615036;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC = 4615037;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED = 4615038;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION = 4615039;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE = 4615040;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE = 4615041;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE = 4615042;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE = 4615043;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY = 4615044;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR = 4615045;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT = 4615046;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER = 4615047;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW = 4615048;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR = 4615049;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER = 4615050;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED = 4615051;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED = 4615052;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED = 4615053;\nexport const SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS = 4615054;\n\n// Signer-related errors.\n// Reserve error codes in the range [5508000-5508999].\nexport const SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS = 5508000;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER = 5508001;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER = 5508002;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER = 5508003;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER = 5508004;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER = 5508005;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER = 5508006;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER = 5508007;\nexport const SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER = 5508008;\nexport const SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS = 5508009;\nexport const SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING = 5508010;\nexport const SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED = 5508011;\n\n// Offchain-message-related errors.\n// Reserve error codes in the range [5607000-5607999].\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED = 5607000;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE = 5607001;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE = 5607002;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH = 5607003;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH = 5607004;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO = 5607005;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED = 5607006;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH = 5607007;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH = 5607008;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY = 5607009;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO = 5607010;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING = 5607011;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH = 5607012;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE = 5607013;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION = 5607014;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED = 5607015;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE = 5607016;\nexport const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE = 5607017;\n\n// Transaction-related errors.\n// Reserve error codes in the range [5663000-5663999].\nexport const SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES = 5663000;\nexport const SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE = 5663001;\nexport const SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME = 5663002;\nexport const SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME = 5663003;\nexport const SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE = 5663004;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING = 5663005;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE = 5663006;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND = 5663007;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING = 5663008;\nexport const SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING = 5663009;\nexport const SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING = 5663010;\nexport const SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING = 5663011;\nexport const SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING = 5663012;\nexport const SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING = 5663013;\nexport const SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE = 5663014;\nexport const SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION = 5663015;\nexport const SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES = 5663016;\nexport const SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH = 5663017;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT = 5663018;\nexport const SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT = 5663019;\nexport const SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT = 5663020;\nexport const SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED = 5663021;\nexport const SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE = 5663022;\n\n// Transaction errors.\n// Reserve error codes starting with [7050000-7050999] for the Rust enum `TransactionError`.\n// Error names here are dictated by the RPC (see ./transaction-error.ts).\nexport const SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN = 7050000;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE = 7050001;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE = 7050002;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND = 7050003;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND = 7050004;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE = 7050005;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE = 7050006;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED = 7050007;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND = 7050008;\n// `InstructionError` intentionally omitted.\nexport const SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP = 7050009;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE = 7050010;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX = 7050011;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE = 7050012;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION = 7050013;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE = 7050014;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE = 7050015;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 7050016;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT = 7050017;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION = 7050018;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT = 7050019;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT = 7050020;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT = 7050021;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS = 7050022;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND = 7050023;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER = 7050024;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA = 7050025;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX = 7050026;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT = 7050027;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT = 7050028;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT = 7050029;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION = 7050030;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT = 7050031;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED = 7050032;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT = 7050033;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED = 7050034;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED = 7050035;\nexport const SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION = 7050036;\n\n// Instruction plan related errors.\n// Reserve error codes in the range [7618000-7618999].\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN = 7618000;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE = 7618001;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN = 7618002;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN = 7618003;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED = 7618004;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND = 7618005;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN = 7618006;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN = 7618007;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT = 7618008;\nexport const SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT = 7618009;\n\n// Codec-related errors.\n// Reserve error codes in the range [8078000-8078999].\nexport const SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY = 8078000;\nexport const SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH = 8078001;\nexport const SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH = 8078002;\nexport const SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH = 8078003;\nexport const SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH = 8078004;\nexport const SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH = 8078005;\nexport const SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH = 8078006;\nexport const SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS = 8078007;\nexport const SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE = 8078008;\nexport const SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT = 8078009;\nexport const SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT = 8078010;\nexport const SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE = 8078011;\nexport const SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE = 8078012;\nexport const SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH = 8078013;\nexport const SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE = 8078014;\nexport const SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT = 8078015;\nexport const SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE = 8078016;\nexport const SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE = 8078017;\nexport const SOLANA_ERROR__CODECS__INVALID_CONSTANT = 8078018;\nexport const SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE = 8078019;\nexport const SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL = 8078020;\nexport const SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES = 8078021;\nexport const SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS = 8078022;\nexport const SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY = 8078023;\n\n// RPC-related errors.\n// Reserve error codes in the range [8100000-8100999].\nexport const SOLANA_ERROR__RPC__INTEGER_OVERFLOW = 8100000;\nexport const SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN = 8100001;\nexport const SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR = 8100002;\nexport const SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD = 8100003;\n\n// RPC-Subscriptions-related errors.\n// Reserve error codes in the range [8190000-8190999].\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN = 8190000;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID = 8190001;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED = 8190002;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED = 8190003;\nexport const SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT = 8190004;\n\n// Invariant violation errors.\n// Reserve error codes in the range [9900000-9900999].\n// These errors should only be thrown when there is a bug with the\n// library itself and should, in theory, never reach the end user.\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING = 9900000;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE = 9900001;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING = 9900002;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE = 9900003;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED = 9900004;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND = 9900005;\nexport const SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND = 9900006;\n\n/**\n * A union of every Solana error code\n *\n * @privateRemarks\n * You might be wondering why this is not a TypeScript enum or const enum.\n *\n * One of the goals of this library is to enable people to use some or none of it without having to\n * bundle all of it.\n *\n * If we made the set of error codes an enum then anyone who imported it (even if to only use a\n * single error code) would be forced to bundle every code and its label.\n *\n * Const enums appear to solve this problem by letting the compiler inline only the codes that are\n * actually used. Unfortunately exporting ambient (const) enums from a library like `@solana/errors`\n * is not safe, for a variety of reasons covered here: https://stackoverflow.com/a/28818850\n */\nexport type SolanaErrorCode =\n | typeof SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED\n | typeof SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT\n | typeof SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT\n | typeof SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND\n | typeof SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS\n | typeof SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE\n | typeof SOLANA_ERROR__ADDRESSES__MALFORMED_PDA\n | typeof SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED\n | typeof SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE\n | typeof SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER\n | typeof SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED\n | typeof SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY\n | typeof SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS\n | typeof SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL\n | typeof SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH\n | typeof SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH\n | typeof SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH\n | typeof SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY\n | typeof SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH\n | typeof SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH\n | typeof SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH\n | typeof SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE\n | typeof SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH\n | typeof SOLANA_ERROR__CODECS__INVALID_CONSTANT\n | typeof SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT\n | typeof SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT\n | typeof SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT\n | typeof SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS\n | typeof SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE\n | typeof SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES\n | typeof SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE\n | typeof SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS\n | typeof SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA\n | typeof SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN\n | typeof SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT\n | typeof SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH\n | typeof SOLANA_ERROR__INVALID_NONCE\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING\n | typeof SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE\n | typeof SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR\n | typeof SOLANA_ERROR__JSON_RPC__INVALID_PARAMS\n | typeof SOLANA_ERROR__JSON_RPC__INVALID_REQUEST\n | typeof SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND\n | typeof SOLANA_ERROR__JSON_RPC__PARSE_ERROR\n | typeof SOLANA_ERROR__JSON_RPC__SCAN_ERROR\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE\n | typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION\n | typeof SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH\n | typeof SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH\n | typeof SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH\n | typeof SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY\n | typeof SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE\n | typeof SOLANA_ERROR__MALFORMED_BIGINT_STRING\n | typeof SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR\n | typeof SOLANA_ERROR__MALFORMED_NUMBER_STRING\n | typeof SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION\n | typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED\n | typeof SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD\n | typeof SOLANA_ERROR__RPC__INTEGER_OVERFLOW\n | typeof SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR\n | typeof SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID\n | typeof SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER\n | typeof SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER\n | typeof SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS\n | typeof SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING\n | typeof SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED\n | typeof SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE\n | typeof SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION\n | typeof SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES\n | typeof SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME\n | typeof SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE\n | typeof SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES\n | typeof SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE\n | typeof SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH\n | typeof SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE\n | typeof SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING\n | typeof SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED\n | typeof SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT\n | typeof SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT;\n\n/**\n * Errors of this type are understood to have an optional {@link SolanaError} nested inside as\n * `cause`.\n */\nexport type SolanaErrorCodeWithCause = typeof SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE;\n\n/**\n * Errors of this type have a deprecated `cause` property. Consumers should use the error's\n * `context` instead to access relevant error information.\n */\nexport type SolanaErrorCodeWithDeprecatedCause =\n typeof SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN;\n","/**\n * To add a new error, follow the instructions at\n * https://github.com/anza-xyz/kit/tree/main/packages/errors/#adding-a-new-error\n *\n * @privateRemarks\n * WARNING:\n * - Don't change or remove members of an error's context.\n */\nimport {\n SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND,\n SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS,\n SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE,\n SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__INVALID_CONSTANT,\n SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS,\n SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE,\n SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES,\n SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA,\n SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW,\n SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS,\n SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH,\n SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND,\n SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS,\n SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED,\n SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR,\n SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH,\n SOLANA_ERROR__INVALID_NONCE,\n SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING,\n SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE,\n SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR,\n SOLANA_ERROR__JSON_RPC__INVALID_PARAMS,\n SOLANA_ERROR__JSON_RPC__INVALID_REQUEST,\n SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND,\n SOLANA_ERROR__JSON_RPC__PARSE_ERROR,\n SOLANA_ERROR__JSON_RPC__SCAN_ERROR,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION,\n SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__MALFORMED_BIGINT_STRING,\n SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,\n SOLANA_ERROR__MALFORMED_NUMBER_STRING,\n SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD,\n SOLANA_ERROR__RPC__INTEGER_OVERFLOW,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS,\n SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER,\n SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY,\n SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING,\n SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION,\n SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH,\n SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE,\n SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED,\n SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN,\n SolanaErrorCode,\n} from './codes';\nimport { RpcSimulateTransactionResult } from './json-rpc-error';\n\ntype BasicInstructionErrorContext = { [P in T]: { index: number } };\n\ntype DefaultUnspecifiedErrorContextToUndefined = {\n [P in SolanaErrorCode]: P extends keyof T ? T[P] : undefined;\n};\n\ntype ReadonlyContextValue = {\n [P in keyof T]: Readonly;\n};\n\ntype TypedArrayMutableProperties = 'copyWithin' | 'fill' | 'reverse' | 'set' | 'sort';\ninterface ReadonlyUint8Array extends Omit {\n readonly [n: number]: number;\n}\n\n/** A amount of bytes. */\ntype Bytes = number;\n\n/**\n * A map of every {@link SolanaError} code to the type of its `context` property.\n */\nexport type SolanaErrorContext = ReadonlyContextValue<\n DefaultUnspecifiedErrorContextToUndefined<\n BasicInstructionErrorContext<\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID\n | typeof SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR\n > & {\n [SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND]: {\n address: string;\n };\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT]: {\n address: string;\n };\n [SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT]: {\n address: string;\n };\n [SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS]: {\n putativeAddress: string;\n };\n [SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]: {\n actual: number;\n maxSeeds: number;\n };\n [SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED]: {\n actual: number;\n index: number;\n maxSeedLength: number;\n };\n [SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE]: {\n bump: number;\n };\n [SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED]: {\n currentBlockHeight: bigint;\n lastValidBlockHeight: bigint;\n };\n [SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY]: {\n codecDescription: string;\n };\n [SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS]: {\n stringValues: readonly string[];\n };\n [SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL]: {\n encodedBytes: ReadonlyUint8Array;\n hexEncodedBytes: string;\n hexSentinel: string;\n sentinel: ReadonlyUint8Array;\n };\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH]: {\n decoderFixedSize: number;\n encoderFixedSize: number;\n };\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH]: {\n decoderMaxSize: number | undefined;\n encoderMaxSize: number | undefined;\n };\n [SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE]: {\n discriminator: bigint | number;\n formattedValidDiscriminators: string;\n validDiscriminators: readonly number[];\n };\n [SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY]: {\n expectedLength: number;\n numExcessBytes: number;\n };\n [SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH]: {\n bytesLength: number;\n codecDescription: string;\n };\n [SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE]: {\n codecDescription: string;\n expectedSize: number;\n hexZeroValue: string;\n zeroValue: ReadonlyUint8Array;\n };\n [SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH]: {\n bytesLength: number;\n codecDescription: string;\n expected: number;\n };\n [SOLANA_ERROR__CODECS__INVALID_CONSTANT]: {\n constant: ReadonlyUint8Array;\n data: ReadonlyUint8Array;\n hexConstant: string;\n hexData: string;\n offset: number;\n };\n [SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT]: {\n value: bigint | boolean | number | string | null | undefined;\n variants: readonly (bigint | boolean | number | string | null | undefined)[];\n };\n [SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT]: {\n formattedNumericalValues: string;\n numericalValues: readonly number[];\n stringValues: readonly string[];\n variant: number | string | symbol;\n };\n [SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT]: {\n value: bigint | boolean | number | string | null | undefined;\n variants: readonly (bigint | boolean | number | string | null | undefined)[];\n };\n [SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS]: {\n actual: bigint | number;\n codecDescription: string;\n expected: bigint | number;\n };\n [SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE]: {\n alphabet: string;\n base: number;\n value: string;\n };\n [SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE]: {\n discriminator: bigint | number;\n maxRange: number;\n minRange: number;\n };\n [SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE]: {\n codecDescription: string;\n max: bigint | number;\n min: bigint | number;\n value: bigint | number;\n };\n [SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE]: {\n bytesLength: number;\n codecDescription: string;\n offset: number;\n };\n [SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES]: {\n decodedBytes: ReadonlyUint8Array;\n hexDecodedBytes: string;\n hexSentinel: string;\n sentinel: ReadonlyUint8Array;\n };\n [SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE]: {\n maxRange: number;\n minRange: number;\n variant: number;\n };\n [SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR]: {\n index: number;\n };\n [SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM]: {\n code: number;\n index: number;\n };\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN]: {\n errorName: string;\n index: number;\n instructionErrorContext?: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT]: {\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND]: {\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN]: {\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN]: {\n numBytesRequired: number;\n numFreeBytes: number;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN]: {\n actualKind: string;\n expectedKind: string;\n instructionPlan: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN]: {\n actualKind: string;\n expectedKind: string;\n transactionPlan: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT]: {\n actualKind: string;\n expectedKind: string;\n transactionPlanResult: unknown;\n };\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS]: {\n data?: ReadonlyUint8Array;\n programAddress: string;\n };\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA]: {\n accountAddresses?: readonly string[];\n programAddress: string;\n };\n [SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH]: {\n actualProgramAddress: string;\n expectedProgramAddress: string;\n };\n [SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__INVALID_NONCE]: {\n actualNonceValue: string;\n expectedNonceValue: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING]: {\n cacheKey: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED]: {\n channelName: string;\n supportedChannelNames: readonly string[];\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND]: {\n kind: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND]: {\n kind: string;\n };\n [SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE]: {\n unexpectedValue: unknown;\n };\n [SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__INVALID_PARAMS]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__INVALID_REQUEST]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__PARSE_ERROR]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SCAN_ERROR]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE]: {\n currentBlockHeight: bigint;\n rewardsCompleteBlockHeight: bigint;\n slot: bigint;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED]: {\n contextSlot: bigint;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY]: {\n numSlotsBehind?: number;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE]: Omit<\n RpcSimulateTransactionResult,\n 'err'\n >;\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY]: {\n slot: bigint;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION]: {\n __serverMessage: string;\n };\n [SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH]: {\n byteLength: number;\n };\n [SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__MALFORMED_BIGINT_STRING]: {\n value: string;\n };\n [SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: {\n error: unknown;\n message: string;\n };\n [SOLANA_ERROR__MALFORMED_NUMBER_STRING]: {\n value: string;\n };\n [SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: {\n nonceAccountAddress: string;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE]: {\n expectedAddresses: readonly string[];\n unexpectedAddresses: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]: {\n actualLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]: {\n missingRequiredSigners: readonly string[];\n unexpectedSigners: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]: {\n actualLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]: {\n actualBytes: number;\n maxBytes: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]: {\n actualMessageFormat: number;\n expectedMessageFormat: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]: {\n actualLength: number;\n specifiedLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]: {\n numRequiredSignatures: number;\n signatoryAddresses: readonly string[];\n signaturesLength: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE]: {\n signatoriesWithInvalidSignatures: readonly string[];\n signatoriesWithMissingSignatures: readonly string[];\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION]: {\n actualVersion: number;\n expectedVersion: number;\n };\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]: {\n unsupportedVersion: number;\n };\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]: {\n notificationName: string;\n };\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT]: {\n errorEvent: Event;\n };\n [SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD]: {\n method: string;\n params: readonly unknown[];\n };\n [SOLANA_ERROR__RPC__INTEGER_OVERFLOW]: {\n argumentLabel: string;\n keyPath: readonly (number | string | symbol)[];\n methodName: string;\n optionalPathLabel: string;\n path?: string;\n value: bigint;\n };\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR]: {\n headers: Headers;\n message: string;\n statusCode: number;\n };\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN]: {\n headers: readonly string[];\n };\n [SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER]: {\n address: string;\n };\n [SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY]: {\n key: CryptoKey;\n };\n [SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE]: {\n value: bigint;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION]: {\n index: number;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT]: {\n accountIndex: number;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED]: {\n accountIndex: number;\n };\n [SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN]: {\n errorName: string;\n transactionErrorContext?: unknown;\n };\n [SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION]: {\n expectedAddresses: readonly string[];\n unexpectedAddresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING]: {\n index: number;\n };\n [SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT]: {\n transactionSize: Bytes;\n transactionSizeLimit: Bytes;\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING]: {\n lookupTableAddresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE]: {\n highestKnownIndex: number;\n highestRequestedIndex: number;\n lookupTableAddress: string;\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND]: {\n index: number;\n };\n [SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT]: {\n unitsConsumed: number;\n };\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES]: {\n programAddress: string;\n };\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE]: {\n programAddress: string;\n };\n [SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH]: {\n numRequiredSignatures: number;\n signaturesLength: number;\n signerAddresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE]: {\n nonce: string;\n };\n [SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING]: {\n addresses: readonly string[];\n };\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED]: {\n unsupportedVersion: number;\n };\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE]: {\n actualVersion: number;\n };\n }\n >\n>;\n\nexport function decodeEncodedContext(encodedContext: string): object {\n const decodedUrlString = __NODEJS__ ? Buffer.from(encodedContext, 'base64').toString('utf8') : atob(encodedContext);\n return Object.fromEntries(new URLSearchParams(decodedUrlString).entries());\n}\n\nfunction encodeValue(value: unknown): string {\n if (Array.isArray(value)) {\n const commaSeparatedValues = value.map(encodeValue).join('%2C%20' /* \", \" */);\n return '%5B' /* \"[\" */ + commaSeparatedValues + /* \"]\" */ '%5D';\n } else if (typeof value === 'bigint') {\n return `${value}n`;\n } else {\n return encodeURIComponent(\n String(\n value != null && Object.getPrototypeOf(value) === null\n ? // Plain objects with no prototype don't have a `toString` method.\n // Convert them before stringifying them.\n { ...(value as object) }\n : value,\n ),\n );\n }\n}\n\nfunction encodeObjectContextEntry([key, value]: [string, unknown]): `${typeof key}=${string}` {\n return `${key}=${encodeValue(value)}`;\n}\n\nexport function encodeContextObject(context: object): string {\n const searchParamsString = Object.entries(context).map(encodeObjectContextEntry).join('&');\n return __NODEJS__ ? Buffer.from(searchParamsString, 'utf8').toString('base64') : btoa(searchParamsString);\n}\n","/* eslint-disable sort-keys-fix/sort-keys-fix */\n/**\n * To add a new error, follow the instructions at\n * https://github.com/anza-xyz/kit/tree/main/packages/errors#adding-a-new-error\n *\n * WARNING:\n * - Don't change the meaning of an error message.\n */\nimport {\n SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND,\n SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED,\n SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY,\n SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS,\n SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE,\n SOLANA_ERROR__ADDRESSES__MALFORMED_PDA,\n SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE,\n SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS,\n SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH,\n SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE,\n SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__INVALID_CONSTANT,\n SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT,\n SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS,\n SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE,\n SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES,\n SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE,\n SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA,\n SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW,\n SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS,\n SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH,\n SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX,\n SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND,\n SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY,\n SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC,\n SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS,\n SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE,\n SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE,\n SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED,\n SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID,\n SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR,\n SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH,\n SOLANA_ERROR__INVALID_NONCE,\n SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING,\n SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE,\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING,\n SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE,\n SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR,\n SOLANA_ERROR__JSON_RPC__INVALID_PARAMS,\n SOLANA_ERROR__JSON_RPC__INVALID_REQUEST,\n SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND,\n SOLANA_ERROR__JSON_RPC__PARSE_ERROR,\n SOLANA_ERROR__JSON_RPC__SCAN_ERROR,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION,\n SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY,\n SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE,\n SOLANA_ERROR__MALFORMED_BIGINT_STRING,\n SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,\n SOLANA_ERROR__MALFORMED_NUMBER_STRING,\n SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD,\n SOLANA_ERROR__RPC__INTEGER_OVERFLOW,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID,\n SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS,\n SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER,\n SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER,\n SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS,\n SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING,\n SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY,\n SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT,\n SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING,\n SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION,\n SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES,\n SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT,\n SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME,\n SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING,\n SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING,\n SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE,\n SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH,\n SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE,\n SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE,\n SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED,\n SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP,\n SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE,\n SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT,\n SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT,\n SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED,\n SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED,\n SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED,\n SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE,\n SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE,\n SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS,\n SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION,\n SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN,\n SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT,\n SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT,\n SolanaErrorCode,\n} from './codes';\n\n/**\n * A map of every {@link SolanaError} code to the error message shown to developers in development\n * mode.\n */\nexport const SolanaErrorMessages: Readonly<{\n // This type makes this data structure exhaustive with respect to `SolanaErrorCode`.\n // TypeScript will fail to build this project if add an error code without a message.\n [P in SolanaErrorCode]: string;\n}> = {\n [SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND]: 'Account not found at address: $address',\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED]:\n 'Not all accounts were decoded. Encoded accounts found at addresses: $addresses.',\n [SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT]: 'Expected decoded account at address: $address',\n [SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT]: 'Failed to decode account data at address: $address',\n [SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND]: 'Accounts not found at addresses: $addresses',\n [SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED]:\n 'Unable to find a viable program address bump seed.',\n [SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS]: '$putativeAddress is not a base58-encoded address.',\n [SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH]:\n 'Expected base58 encoded address to decode to a byte array of length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY]: 'The `CryptoKey` must be an `Ed25519` public key.',\n [SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS]:\n '$putativeOffCurveAddress is not a base58-encoded off-curve address.',\n [SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE]: 'Invalid seeds; point must fall off the Ed25519 curve.',\n [SOLANA_ERROR__ADDRESSES__MALFORMED_PDA]:\n 'Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].',\n [SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]:\n 'A maximum of $maxSeeds seeds, including the bump seed, may be supplied when creating an address. Received: $actual.',\n [SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED]:\n 'The seed at index $index with length $actual exceeds the maximum length of $maxSeedLength bytes.',\n [SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE]:\n 'Expected program derived address bump to be in the range [0, 255], got: $bump.',\n [SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER]: 'Program address cannot end with PDA marker.',\n [SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded address string of length in the range [32, 44]. Actual length: $actualLength.',\n [SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded blockash string of length in the range [32, 44]. Actual length: $actualLength.',\n [SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED]:\n 'The network has progressed past the last block for which this transaction could have been committed.',\n [SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY]:\n 'Codec [$codecDescription] cannot decode empty byte arrays.',\n [SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS]:\n 'Enum codec cannot use lexical values [$stringValues] as discriminators. Either remove all lexical values or set `useValuesAsDiscriminators` to `false`.',\n [SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL]:\n 'Sentinel [$hexSentinel] must not be present in encoded bytes [$hexEncodedBytes].',\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH]:\n 'Encoder and decoder must have the same fixed size, got [$encoderFixedSize] and [$decoderFixedSize].',\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH]:\n 'Encoder and decoder must have the same max size, got [$encoderMaxSize] and [$decoderMaxSize].',\n [SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH]:\n 'Encoder and decoder must either both be fixed-size or variable-size.',\n [SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE]:\n 'Enum discriminator out of range. Expected a number in [$formattedValidDiscriminators], got $discriminator.',\n [SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH]: 'Expected a fixed-size codec, got a variable-size one.',\n [SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH]:\n 'Codec [$codecDescription] expected a positive byte length, got $bytesLength.',\n [SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH]: 'Expected a variable-size codec, got a fixed-size one.',\n [SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE]:\n 'Codec [$codecDescription] expected zero-value [$hexZeroValue] to have the same size as the provided fixed-size item [$expectedSize bytes].',\n [SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH]:\n 'Codec [$codecDescription] expected $expected bytes, got $bytesLength.',\n [SOLANA_ERROR__CODECS__INVALID_CONSTANT]:\n 'Expected byte array constant [$hexConstant] to be present in data [$hexData] at offset [$offset].',\n [SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT]:\n 'Invalid discriminated union variant. Expected one of [$variants], got $value.',\n [SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT]:\n 'Invalid enum variant. Expected one of [$stringValues] or a number in [$formattedNumericalValues], got $variant.',\n [SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT]:\n 'Invalid literal union variant. Expected one of [$variants], got $value.',\n [SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS]:\n 'Expected [$codecDescription] to have $expected items, got $actual.',\n [SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE]: 'Invalid value $value for base $base with alphabet $alphabet.',\n [SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE]:\n 'Literal union discriminator out of range. Expected a number between $minRange and $maxRange, got $discriminator.',\n [SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE]:\n 'Codec [$codecDescription] expected number to be in the range [$min, $max], got $value.',\n [SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE]:\n 'Codec [$codecDescription] expected offset to be in the range [0, $bytesLength], got $offset.',\n [SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES]:\n 'Expected sentinel [$hexSentinel] to be present in decoded bytes [$hexDecodedBytes].',\n [SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE]:\n 'Union variant out of range. Expected an index between $minRange and $maxRange, got $variant.',\n [SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY]:\n 'This decoder expected a byte array of exactly $expectedLength bytes, but $numExcessBytes unexpected excess bytes remained after decoding. Are you sure that you have chosen the correct decoder for this data?',\n [SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED]: 'No random values implementation could be found.',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED]: 'instruction requires an uninitialized account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED]:\n 'instruction tries to borrow reference for an account which is already borrowed',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]:\n 'instruction left account with an outstanding borrowed reference',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED]:\n \"program other than the account's owner changed the size of the account data\",\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL]: 'account data too small for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE]: 'instruction expected an executable account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT]:\n 'An account does not have enough lamports to be rent-exempt',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW]: 'Program arithmetic overflowed',\n [SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR]: 'Failed to serialize or deserialize account data: $encodedData',\n [SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS]:\n 'Builtin programs must consume compute units',\n [SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH]: 'Cross-program invocation call depth too deep',\n [SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED]: 'Computational budget exceeded',\n [SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM]: 'custom program error: #$code',\n [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX]: 'instruction contains duplicate accounts',\n [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC]:\n 'instruction modifications of multiply-passed account differ',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT]: 'executable accounts must be rent exempt',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED]: 'instruction changed executable accounts data',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE]:\n 'instruction changed the balance of an executable account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED]: 'instruction changed executable bit of an account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED]:\n 'instruction modified data of an account it does not own',\n [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND]:\n 'instruction spent from the balance of an account it does not own',\n [SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR]: 'generic instruction error',\n [SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER]: 'Provided owner is not allowed',\n [SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE]: 'Account is immutable',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY]: 'Incorrect authority provided',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID]: 'incorrect program id for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS]: 'insufficient funds for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA]: 'invalid account data for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER]: 'Invalid account owner',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT]: 'invalid program argument',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR]: 'program returned invalid error code',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA]: 'invalid instruction data',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC]: 'Failed to reallocate account data',\n [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS]: 'Provided seeds do not result in a valid address',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED]:\n 'Accounts data allocations exceeded the maximum allowed per transaction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED]: 'Max accounts exceeded',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED]: 'Max instruction trace length exceeded',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED]:\n 'Length of the seed is too long for address generation',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT]: 'An account required by the instruction is missing',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE]: 'missing required signature for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID]:\n 'instruction illegally modified the program id of an account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS]: 'insufficient account keys for instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION]:\n 'Cross-program invocation with unauthorized signer or writable account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE]:\n 'Failed to create program execution environment',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE]: 'Program failed to compile',\n [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE]: 'Program failed to complete',\n [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED]: 'instruction modified data of a read-only account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE]:\n 'instruction changed the balance of a read-only account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED]:\n 'Cross-program invocation reentrancy not allowed for this instruction',\n [SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED]: 'instruction modified rent epoch of an account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION]:\n 'sum of account balances before and after instruction do not match',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT]: 'instruction requires an initialized account',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN]: '',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID]: 'Unsupported program id',\n [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR]: 'Unsupported sysvar',\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND]: 'Invalid instruction plan kind: $kind.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN]: 'The provided instruction plan is empty.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND]:\n 'No failed transaction plan result was found in the provided transaction plan result.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED]:\n 'This transaction plan executor does not support non-divisible sequential plans. To support them, you may create your own executor such that multi-transaction atomicity is preserved — e.g. by targetting RPCs that support transaction bundles.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN]:\n 'The provided transaction plan failed to execute. See the `transactionPlanResult` attribute for more details. Note that the `cause` property is deprecated, and a future version will not set it.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN]:\n 'The provided message has insufficient capacity to accommodate the next instruction(s) in this plan. Expected at least $numBytesRequired free byte(s), got $numFreeBytes byte(s).',\n [SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND]: 'Invalid transaction plan kind: $kind.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE]:\n 'No more instructions to pack; the message packer has completed the instruction plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN]:\n 'Unexpected instruction plan. Expected $expectedKind plan, got $actualKind plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN]:\n 'Unexpected transaction plan. Expected $expectedKind plan, got $actualKind plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT]:\n 'Unexpected transaction plan result. Expected $expectedKind plan, got $actualKind plan.',\n [SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT]:\n 'Expected a successful transaction plan result. I.e. there is at least one failed or cancelled transaction in the plan.',\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS]: 'The instruction does not have any accounts.',\n [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA]: 'The instruction does not have any data.',\n [SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH]:\n 'Expected instruction to have progress address $expectedProgramAddress, got $actualProgramAddress.',\n [SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH]:\n 'Expected base58 encoded blockhash to decode to a byte array of length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__INVALID_NONCE]:\n 'The nonce `$expectedNonceValue` is no longer valid. It has advanced to `$actualNonceValue`',\n [SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING]:\n 'Invariant violation: Found no abortable iterable cache entry for key `$cacheKey`. It ' +\n 'should be impossible to hit this error; please file an issue at ' +\n 'https://sola.na/web3invariant',\n [SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED]:\n 'Invariant violation: This data publisher does not publish to the channel named ' +\n '`$channelName`. Supported channels include $supportedChannelNames.',\n [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE]:\n 'Invariant violation: WebSocket message iterator state is corrupt; iterated without first ' +\n 'resolving existing message promise. It should be impossible to hit this error; please ' +\n 'file an issue at https://sola.na/web3invariant',\n [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING]:\n 'Invariant violation: WebSocket message iterator is missing state storage. It should be ' +\n 'impossible to hit this error; please file an issue at https://sola.na/web3invariant',\n [SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE]:\n 'Invariant violation: Switch statement non-exhaustive. Received unexpected value ' +\n '`$unexpectedValue`. It should be impossible to hit this error; please file an issue at ' +\n 'https://sola.na/web3invariant',\n [SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR]: 'JSON-RPC error: Internal JSON-RPC error ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__INVALID_PARAMS]: 'JSON-RPC error: Invalid method parameter(s) ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__INVALID_REQUEST]:\n 'JSON-RPC error: The JSON sent is not a valid `Request` object ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND]:\n 'JSON-RPC error: The method does not exist / is not available ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__PARSE_ERROR]:\n 'JSON-RPC error: An error occurred on the server while parsing the JSON text ($__serverMessage)',\n [SOLANA_ERROR__JSON_RPC__SCAN_ERROR]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_EPOCH_REWARDS_PERIOD_ACTIVE]:\n 'Epoch rewards period still active at slot $slot',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_UNREACHABLE]:\n 'Failed to query long-term storage; please try again',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED]: 'Minimum context slot has not been reached',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY]: 'Node is unhealthy; behind by $numSlotsBehind slots',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT]: 'No snapshot',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE]: 'Transaction simulation failed',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_NOT_EPOCH_BOUNDARY]:\n \"Rewards cannot be found because slot $slot is not the epoch boundary. This may be due to gap in the queried node's local ledger or long-term storage\",\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE]:\n 'Transaction history is not available from this node',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE]: '$__serverMessage',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH]: 'Transaction signature length mismatch',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE]:\n 'Transaction signature verification failure',\n [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION]: '$__serverMessage',\n [SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH]: 'Key pair bytes must be of length 64, got $byteLength.',\n [SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH]:\n 'Expected private key bytes with length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH]:\n 'Expected base58-encoded signature to decode to a byte array of length 64. Actual length: $actualLength.',\n [SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY]:\n 'The provided private key does not match the provided public key.',\n [SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded signature string of length in the range [64, 88]. Actual length: $actualLength.',\n [SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE]: 'Lamports value must be in the range [0, 2e64-1]',\n [SOLANA_ERROR__MALFORMED_BIGINT_STRING]: '`$value` cannot be parsed as a `BigInt`',\n [SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: '$message',\n [SOLANA_ERROR__MALFORMED_NUMBER_STRING]: '`$value` cannot be parsed as a `Number`',\n [SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: 'No nonce account could be found at address `$nonceAccountAddress`',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]:\n 'Expected base58 encoded application domain to decode to a byte array of length 32. Actual length: $actualLength.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE]:\n 'Attempted to sign an offchain message with an address that is not a signer for it',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]:\n 'Expected base58-encoded application domain string of length in the range [32, 44]. Actual length: $actualLength.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]:\n 'The signer addresses in this offchain message envelope do not match the list of ' +\n 'required signers in the message preamble. These unexpected signers were present in the ' +\n 'envelope: `[$unexpectedSigners]`. These required signers were missing from the envelope ' +\n '`[$missingSigners]`.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]:\n 'The message body provided has a byte-length of $actualBytes. The maximum allowable ' +\n 'byte-length is $maxBytes',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]:\n 'Expected message format $expectedMessageFormat, got $actualMessageFormat',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]:\n 'The message length specified in the message preamble is $specifiedLength bytes. The actual length of the message is $actualLength bytes.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY]: 'Offchain message content must be non-empty',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO]:\n 'Offchain message must specify the address of at least one required signer',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO]:\n 'Offchain message envelope must reserve space for at least one signature',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]:\n 'The offchain message preamble specifies $numRequiredSignatures required signature(s), got $signaturesLength.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED]:\n 'The signatories of this offchain message must be listed in lexicographical order',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE]:\n 'An address must be listed no more than once among the signatories of an offchain message',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]:\n 'Offchain message is missing signatures for addresses: $addresses.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE]:\n 'Offchain message signature verification failed. Signature mismatch for required ' +\n 'signatories [$signatoriesWithInvalidSignatures]. Missing signatures for signatories ' +\n '[$signatoriesWithMissingSignatures]',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE]:\n 'The message body provided contains characters whose codes fall outside the allowed ' +\n 'range. In order to ensure clear-signing compatiblity with hardware wallets, the message ' +\n 'may only contain line feeds and characters in the range [\\\\x20-\\\\x7e].',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION]:\n 'Expected offchain message version $expectedVersion. Got $actualVersion.',\n [SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]:\n 'This version of Kit does not support decoding offchain messages with version ' +\n '$unsupportedVersion. The current max supported version is 0.',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]:\n \"The notification name must end in 'Notifications' and the API must supply a \" +\n \"subscription plan creator function for the notification '$notificationName'.\",\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED]:\n 'WebSocket was closed before payload could be added to the send buffer',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED]: 'WebSocket connection closed',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT]: 'WebSocket failed to connect',\n [SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID]:\n 'Failed to obtain a subscription id from the server',\n [SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD]: 'Could not find an API plan for RPC method: `$method`',\n [SOLANA_ERROR__RPC__INTEGER_OVERFLOW]:\n 'The $argumentLabel argument to the `$methodName` RPC method$optionalPathLabel was ' +\n '`$value`. This number is unsafe for use with the Solana JSON-RPC because it exceeds ' +\n '`Number.MAX_SAFE_INTEGER`.',\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR]: 'HTTP error ($statusCode): $message',\n [SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN]:\n 'HTTP header(s) forbidden: $headers. Learn more at ' +\n 'https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.',\n [SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS]:\n 'Multiple distinct signers were identified for address `$address`. Please ensure that ' +\n 'you are using the same signer instance for each address.',\n [SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER]:\n 'The provided value does not implement the `KeyPairSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER]:\n 'The provided value does not implement the `MessageModifyingSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER]:\n 'The provided value does not implement the `MessagePartialSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER]:\n 'The provided value does not implement any of the `MessageSigner` interfaces',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER]:\n 'The provided value does not implement the `TransactionModifyingSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER]:\n 'The provided value does not implement the `TransactionPartialSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER]:\n 'The provided value does not implement the `TransactionSendingSigner` interface',\n [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER]:\n 'The provided value does not implement any of the `TransactionSigner` interfaces',\n [SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS]:\n 'More than one `TransactionSendingSigner` was identified.',\n [SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING]:\n 'No `TransactionSendingSigner` was identified. Please provide a valid ' +\n '`TransactionWithSingleSendingSigner` transaction.',\n [SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED]:\n 'Wallet account signers do not support signing multiple messages/transactions in a single operation',\n [SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY]: 'Cannot export a non-extractable key.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED]: 'No digest implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT]:\n 'Cryptographic operations are only allowed in secure browser contexts. Read more ' +\n 'here: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED]:\n 'This runtime does not support the generation of Ed25519 key pairs.\\n\\nInstall ' +\n '@solana/webcrypto-ed25519-polyfill and call its `install` function before generating keys in ' +\n 'environments that do not support Ed25519.\\n\\nFor a list of runtimes that ' +\n 'currently support Ed25519 operations, visit ' +\n 'https://github.com/WICG/webcrypto-secure-curves/issues/20.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED]:\n 'No signature verification implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED]: 'No key generation implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED]: 'No signing implementation could be found.',\n [SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED]: 'No key export implementation could be found.',\n [SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE]:\n 'Timestamp value must be in the range [-(2n ** 63n), (2n ** 63n) - 1]. `$value` given',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]:\n 'Transaction processing left an account with an outstanding borrowed reference',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE]: 'Account in use',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE]: 'Account loaded twice',\n [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND]:\n 'Attempt to debit an account but found no record of a prior credit.',\n [SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND]:\n \"Transaction loads an address table account that doesn't exist\",\n [SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED]: 'This transaction has already been processed',\n [SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND]: 'Blockhash not found',\n [SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP]: 'Loader call chain is too deep',\n [SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE]:\n 'Transactions are currently disabled due to cluster maintenance',\n [SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION]:\n 'Transaction contains a duplicate instruction ($index) that is not allowed',\n [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE]: 'Insufficient funds for fee',\n [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT]:\n 'Transaction results in an account ($accountIndex) with insufficient funds for rent',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE]: 'This account may not be used to pay transaction fees',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX]: 'Transaction contains an invalid account reference',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA]:\n 'Transaction loads an address table account with invalid data',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX]:\n 'Transaction address table lookup uses an invalid index',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER]:\n 'Transaction loads an address table account with an invalid owner',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT]:\n 'LoadedAccountsDataSizeLimit set for transaction must be greater than 0.',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION]:\n 'This program may not be used for executing instructions',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT]:\n 'Transaction leaves an account with a lower balance than rent-exempt minimum',\n [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT]:\n 'Transaction loads a writable account that cannot be written',\n [SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED]:\n 'Transaction exceeded max loaded accounts data size cap',\n [SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE]:\n 'Transaction requires a fee but has no signature present',\n [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND]: 'Attempt to load a program that does not exist',\n [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED]:\n 'Execution of the program referenced by account at index $accountIndex is temporarily restricted.',\n [SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED]: 'ResanitizationNeeded',\n [SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE]: 'Transaction failed to sanitize accounts offsets correctly',\n [SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE]: 'Transaction did not pass signature verification',\n [SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS]: 'Transaction locked too many accounts',\n [SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION]:\n 'Sum of account balances before and after transaction do not match',\n [SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN]: 'The transaction failed with the error `$errorName`',\n [SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION]: 'Transaction version is unsupported',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT]:\n 'Transaction would exceed account data limit within the block',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT]:\n 'Transaction would exceed total account data limit',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT]:\n 'Transaction would exceed max account limit within the block',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT]:\n 'Transaction would exceed max Block Cost Limit',\n [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT]: 'Transaction would exceed max Vote Cost Limit',\n [SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION]:\n 'Attempted to sign a transaction with an address that is not a signer for it',\n [SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING]: 'Transaction is missing an address at index: $index.',\n [SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES]:\n 'Transaction has no expected signers therefore it cannot be encoded',\n [SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT]:\n 'Transaction size $transactionSize exceeds limit of $transactionSizeLimit bytes',\n [SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME]: 'Transaction does not have a blockhash lifetime',\n [SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME]: 'Transaction is not a durable nonce transaction',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING]:\n 'Contents of these address lookup tables unknown: $lookupTableAddresses',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE]:\n 'Lookup of address at index $highestRequestedIndex failed for lookup table ' +\n '`$lookupTableAddress`. Highest known index is $highestKnownIndex. The lookup table ' +\n 'may have been extended since its contents were retrieved',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING]: 'No fee payer set in CompiledTransaction',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND]:\n 'Could not find program address at index $index',\n [SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT]:\n 'Failed to estimate the compute unit consumption for this transaction message. This is ' +\n 'likely because simulating the transaction failed. Inspect the `cause` property of this ' +\n 'error to learn more',\n [SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT]:\n 'Transaction failed when it was simulated in order to estimate the compute unit consumption. ' +\n 'The compute unit estimate provided is for a transaction that failed when simulated and may not ' +\n 'be representative of the compute units this transaction would consume if successful. Inspect the ' +\n '`cause` property of this error to learn more',\n [SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING]: 'Transaction is missing a fee payer.',\n [SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING]:\n \"Could not determine this transaction's signature. Make sure that the transaction has \" +\n 'been signed by its fee payer.',\n [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE]:\n 'Transaction first instruction is not advance nonce account instruction.',\n [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING]:\n 'Transaction with no instructions cannot be durable nonce transaction.',\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES]:\n 'This transaction includes an address (`$programAddress`) which is both ' +\n 'invoked and set as the fee payer. Program addresses may not pay fees',\n [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE]:\n 'This transaction includes an address (`$programAddress`) which is both invoked and ' +\n 'marked writable. Program addresses may not be writable',\n [SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH]:\n 'The transaction message expected the transaction to have $numRequiredSignatures signatures, got $signaturesLength.',\n [SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING]: 'Transaction is missing signatures for addresses: $addresses.',\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE]:\n 'Transaction version must be in the range [0, 127]. `$actualVersion` given',\n [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED]:\n 'This version of Kit does not support decoding transactions with version $unsupportedVersion. The current max supported version is 0.',\n [SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE]:\n 'The transaction has a durable nonce lifetime (with nonce `$nonce`), but the nonce account address is in a lookup table. The lifetime constraint cannot be constructed without fetching the lookup tables for the transaction.',\n};\n","import { SolanaErrorCode } from './codes';\nimport { encodeContextObject } from './context';\nimport { SolanaErrorMessages } from './messages';\n\nconst enum StateType {\n EscapeSequence,\n Text,\n Variable,\n}\ntype State = Readonly<{\n [START_INDEX]: number;\n [TYPE]: StateType;\n}>;\nconst START_INDEX = 'i';\nconst TYPE = 't';\n\nexport function getHumanReadableErrorMessage(\n code: TErrorCode,\n context: object = {},\n): string {\n const messageFormatString = SolanaErrorMessages[code];\n if (messageFormatString.length === 0) {\n return '';\n }\n let state: State;\n function commitStateUpTo(endIndex?: number) {\n if (state[TYPE] === StateType.Variable) {\n const variableName = messageFormatString.slice(state[START_INDEX] + 1, endIndex);\n\n fragments.push(\n variableName in context\n ? // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `${context[variableName as keyof typeof context]}`\n : `$${variableName}`,\n );\n } else if (state[TYPE] === StateType.Text) {\n fragments.push(messageFormatString.slice(state[START_INDEX], endIndex));\n }\n }\n const fragments: string[] = [];\n messageFormatString.split('').forEach((char, ii) => {\n if (ii === 0) {\n state = {\n [START_INDEX]: 0,\n [TYPE]:\n messageFormatString[0] === '\\\\'\n ? StateType.EscapeSequence\n : messageFormatString[0] === '$'\n ? StateType.Variable\n : StateType.Text,\n };\n return;\n }\n let nextState;\n switch (state[TYPE]) {\n case StateType.EscapeSequence:\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Text };\n break;\n case StateType.Text:\n if (char === '\\\\') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.EscapeSequence };\n } else if (char === '$') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Variable };\n }\n break;\n case StateType.Variable:\n if (char === '\\\\') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.EscapeSequence };\n } else if (char === '$') {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Variable };\n } else if (!char.match(/\\w/)) {\n nextState = { [START_INDEX]: ii, [TYPE]: StateType.Text };\n }\n break;\n }\n if (nextState) {\n if (state !== nextState) {\n commitStateUpTo(ii);\n }\n state = nextState;\n }\n });\n commitStateUpTo();\n return fragments.join('');\n}\n\nexport function getErrorMessage(\n code: TErrorCode,\n context: Record = {},\n): string {\n if (process.env.NODE_ENV !== \"production\") {\n return getHumanReadableErrorMessage(code, context);\n } else {\n let decodingAdviceMessage = `Solana error #${code}; Decode this error by running \\`npx @solana/errors decode -- ${code}`;\n if (Object.keys(context).length) {\n /**\n * DANGER: Be sure that the shell command is escaped in such a way that makes it\n * impossible for someone to craft malicious context values that would result in\n * an exploit against anyone who bindly copy/pastes it into their terminal.\n */\n decodingAdviceMessage += ` '${encodeContextObject(context)}'`;\n }\n return `${decodingAdviceMessage}\\``;\n }\n}\n","import { SolanaErrorCode, SolanaErrorCodeWithCause, SolanaErrorCodeWithDeprecatedCause } from './codes';\nimport { SolanaErrorContext } from './context';\nimport { getErrorMessage } from './message-formatter';\n\n/**\n * A variant of {@link SolanaError} where the `cause` property is deprecated.\n *\n * This type is returned by {@link isSolanaError} when checking for error codes in\n * {@link SolanaErrorCodeWithDeprecatedCause}. Accessing `cause` on these errors will show\n * a deprecation warning in IDEs that support JSDoc `@deprecated` tags.\n */\nexport interface SolanaErrorWithDeprecatedCause<\n TErrorCode extends SolanaErrorCodeWithDeprecatedCause = SolanaErrorCodeWithDeprecatedCause,\n> extends Omit, 'cause'> {\n /**\n * @deprecated The `cause` property is deprecated for this error code.\n * Use the error's `context` property instead to access relevant error information.\n */\n readonly cause?: unknown;\n}\n\n/**\n * A type guard that returns `true` if the input is a {@link SolanaError}, optionally with a\n * particular error code.\n *\n * When the `code` argument is supplied and the input is a {@link SolanaError}, TypeScript will\n * refine the error's {@link SolanaError#context | `context`} property to the type associated with\n * that error code. You can use that context to render useful error messages, or to make\n * context-aware decisions that help your application to recover from the error.\n *\n * @example\n * ```ts\n * import {\n * SOLANA_ERROR__TRANSACTION__MISSING_SIGNATURE,\n * SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING,\n * isSolanaError,\n * } from '@solana/errors';\n * import { assertIsFullySignedTransaction, getSignatureFromTransaction } from '@solana/transactions';\n *\n * try {\n * const transactionSignature = getSignatureFromTransaction(tx);\n * assertIsFullySignedTransaction(tx);\n * /* ... *\\/\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING)) {\n * displayError(\n * \"We can't send this transaction without signatures for these addresses:\\n- %s\",\n * // The type of the `context` object is now refined to contain `addresses`.\n * e.context.addresses.join('\\n- '),\n * );\n * return;\n * } else if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING)) {\n * if (!tx.feePayer) {\n * displayError('Choose a fee payer for this transaction before sending it');\n * } else {\n * displayError('The fee payer still needs to sign for this transaction');\n * }\n * return;\n * }\n * throw e;\n * }\n * ```\n */\nexport function isSolanaError(\n e: unknown,\n code: TErrorCode,\n): e is SolanaErrorWithDeprecatedCause;\nexport function isSolanaError(\n e: unknown,\n code?: TErrorCode,\n): e is SolanaError;\nexport function isSolanaError(\n e: unknown,\n /**\n * When supplied, this function will require that the input is a {@link SolanaError} _and_ that\n * its error code is exactly this value.\n */\n code?: TErrorCode,\n): e is SolanaError {\n const isSolanaError = e instanceof Error && e.name === 'SolanaError';\n if (isSolanaError) {\n if (code !== undefined) {\n return (e as SolanaError).context.__code === code;\n }\n return true;\n }\n return false;\n}\n\ntype SolanaErrorCodedContext = {\n [P in SolanaErrorCode]: Readonly<{\n __code: P;\n }> &\n (SolanaErrorContext[P] extends undefined ? object : SolanaErrorContext[P]);\n};\n\n/**\n * Encapsulates an error's stacktrace, a Solana-specific numeric code that indicates what went\n * wrong, and optional context if the type of error indicated by the code supports it.\n */\nexport class SolanaError extends Error {\n /**\n * Indicates the root cause of this {@link SolanaError}, if any.\n *\n * For example, a transaction error might have an instruction error as its root cause. In this\n * case, you will be able to access the instruction error on the transaction error as `cause`.\n */\n readonly cause?: TErrorCode extends SolanaErrorCodeWithCause ? SolanaError : unknown = this.cause;\n /**\n * Contains context that can assist in understanding or recovering from a {@link SolanaError}.\n */\n readonly context: SolanaErrorCodedContext[TErrorCode];\n constructor(\n ...[code, contextAndErrorOptions]: SolanaErrorContext[TErrorCode] extends undefined\n ? [code: TErrorCode, errorOptions?: ErrorOptions | undefined]\n : [code: TErrorCode, contextAndErrorOptions: SolanaErrorContext[TErrorCode] & (ErrorOptions | undefined)]\n ) {\n let context: SolanaErrorContext[TErrorCode] | undefined;\n let errorOptions: ErrorOptions | undefined;\n if (contextAndErrorOptions) {\n Object.entries(Object.getOwnPropertyDescriptors(contextAndErrorOptions)).forEach(([name, descriptor]) => {\n // If the `ErrorOptions` type ever changes, update this code.\n if (name === 'cause') {\n errorOptions = { cause: descriptor.value };\n } else {\n if (context === undefined) {\n context = {\n __code: code,\n } as unknown as SolanaErrorContext[TErrorCode];\n }\n Object.defineProperty(context, name, descriptor);\n }\n });\n }\n const message = getErrorMessage(code, context);\n super(message, errorOptions);\n this.context = Object.freeze(\n context === undefined\n ? {\n __code: code,\n }\n : context,\n ) as SolanaErrorCodedContext[TErrorCode];\n // This is necessary so that `isSolanaError()` can identify a `SolanaError` without having\n // to import the class for use in an `instanceof` check.\n this.name = 'SolanaError';\n }\n}\n","export function safeCaptureStackTrace(...args: Parameters): void {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n}\n","import { SolanaErrorCode } from './codes';\nimport { SolanaErrorContext } from './context';\nimport { SolanaError } from './error';\nimport { safeCaptureStackTrace } from './stack-trace';\n\ntype Config = Readonly<{\n /**\n * Oh, hello. You might wonder what in tarnation is going on here. Allow us to explain.\n *\n * One of the goals of `@solana/errors` is to allow errors that are not interesting to your\n * application to shake out of your app bundle in production. This means that we must never\n * export large hardcoded maps of error codes/messages.\n *\n * Unfortunately, where instruction and transaction errors from the RPC are concerned, we have\n * no choice but to keep a map between the RPC `rpcEnumError` enum name and its corresponding\n * `SolanaError` code. In the interest of implementing that map in as few bytes of source code\n * as possible, we do the following:\n *\n * 1. Reserve a block of sequential error codes for the enum in question\n * 2. Hardcode the list of enum names in that same order\n * 3. Match the enum error name from the RPC with its index in that list, and reconstruct the\n * `SolanaError` code by adding the `errorCodeBaseOffset` to that index\n */\n errorCodeBaseOffset: number;\n getErrorContext: (\n errorCode: SolanaErrorCode,\n rpcErrorName: string,\n rpcErrorContext?: unknown,\n ) => SolanaErrorContext[SolanaErrorCode];\n orderedErrorNames: string[];\n rpcEnumError: string | { [key: string]: unknown };\n}>;\n\nexport function getSolanaErrorFromRpcError(\n { errorCodeBaseOffset, getErrorContext, orderedErrorNames, rpcEnumError }: Config,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n constructorOpt: Function,\n): SolanaError {\n let rpcErrorName;\n let rpcErrorContext;\n if (typeof rpcEnumError === 'string') {\n rpcErrorName = rpcEnumError;\n } else {\n rpcErrorName = Object.keys(rpcEnumError)[0];\n rpcErrorContext = rpcEnumError[rpcErrorName];\n }\n const codeOffset = orderedErrorNames.indexOf(rpcErrorName);\n const errorCode = (errorCodeBaseOffset + codeOffset) as SolanaErrorCode;\n const errorContext = getErrorContext(errorCode, rpcErrorName, rpcErrorContext);\n const err = new SolanaError(errorCode, errorContext);\n safeCaptureStackTrace(err, constructorOpt);\n return err;\n}\n","import { SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN } from './codes';\nimport { SolanaError } from './error';\nimport { getSolanaErrorFromRpcError } from './rpc-enum-errors';\n\nconst ORDERED_ERROR_NAMES = [\n // Keep synced with RPC source: https://github.com/anza-xyz/solana-sdk/blob/master/instruction-error/src/lib.rs\n // If this list ever gets too large, consider implementing a compression strategy like this:\n // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47\n 'GenericError',\n 'InvalidArgument',\n 'InvalidInstructionData',\n 'InvalidAccountData',\n 'AccountDataTooSmall',\n 'InsufficientFunds',\n 'IncorrectProgramId',\n 'MissingRequiredSignature',\n 'AccountAlreadyInitialized',\n 'UninitializedAccount',\n 'UnbalancedInstruction',\n 'ModifiedProgramId',\n 'ExternalAccountLamportSpend',\n 'ExternalAccountDataModified',\n 'ReadonlyLamportChange',\n 'ReadonlyDataModified',\n 'DuplicateAccountIndex',\n 'ExecutableModified',\n 'RentEpochModified',\n 'NotEnoughAccountKeys',\n 'AccountDataSizeChanged',\n 'AccountNotExecutable',\n 'AccountBorrowFailed',\n 'AccountBorrowOutstanding',\n 'DuplicateAccountOutOfSync',\n 'Custom',\n 'InvalidError',\n 'ExecutableDataModified',\n 'ExecutableLamportChange',\n 'ExecutableAccountNotRentExempt',\n 'UnsupportedProgramId',\n 'CallDepth',\n 'MissingAccount',\n 'ReentrancyNotAllowed',\n 'MaxSeedLengthExceeded',\n 'InvalidSeeds',\n 'InvalidRealloc',\n 'ComputationalBudgetExceeded',\n 'PrivilegeEscalation',\n 'ProgramEnvironmentSetupFailure',\n 'ProgramFailedToComplete',\n 'ProgramFailedToCompile',\n 'Immutable',\n 'IncorrectAuthority',\n 'BorshIoError',\n 'AccountNotRentExempt',\n 'InvalidAccountOwner',\n 'ArithmeticOverflow',\n 'UnsupportedSysvar',\n 'IllegalOwner',\n 'MaxAccountsDataAllocationsExceeded',\n 'MaxAccountsExceeded',\n 'MaxInstructionTraceLengthExceeded',\n 'BuiltinProgramsMustConsumeComputeUnits',\n];\n\nexport function getSolanaErrorFromInstructionError(\n /**\n * The index of the instruction inside the transaction.\n */\n index: bigint | number,\n instructionError: string | { [key: string]: unknown },\n): SolanaError {\n const numberIndex = Number(index);\n return getSolanaErrorFromRpcError(\n {\n errorCodeBaseOffset: 4615001,\n getErrorContext(errorCode, rpcErrorName, rpcErrorContext) {\n if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN) {\n return {\n errorName: rpcErrorName,\n index: numberIndex,\n ...(rpcErrorContext !== undefined ? { instructionErrorContext: rpcErrorContext } : null),\n };\n } else if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM) {\n return {\n code: Number(rpcErrorContext as bigint | number),\n index: numberIndex,\n };\n }\n return { index: numberIndex };\n },\n orderedErrorNames: ORDERED_ERROR_NAMES,\n rpcEnumError: instructionError,\n },\n getSolanaErrorFromInstructionError,\n );\n}\n","import {\n SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION,\n SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT,\n SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED,\n SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN,\n} from './codes';\nimport { SolanaError } from './error';\nimport { getSolanaErrorFromInstructionError } from './instruction-error';\nimport { getSolanaErrorFromRpcError } from './rpc-enum-errors';\n\n/**\n * How to add an error when an entry is added to the RPC `TransactionError` enum:\n *\n * 1. Follow the instructions in `./codes.ts` to add a corresponding Solana error code\n * 2. Add the `TransactionError` enum name in the same order as it appears in `./codes.ts`\n * 3. Add the new error name/code mapping to `./__tests__/transaction-error-test.ts`\n */\nconst ORDERED_ERROR_NAMES = [\n // Keep synced with RPC source: https://github.com/anza-xyz/agave/blob/master/sdk/src/transaction/error.rs\n // If this list ever gets too large, consider implementing a compression strategy like this:\n // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47\n 'AccountInUse',\n 'AccountLoadedTwice',\n 'AccountNotFound',\n 'ProgramAccountNotFound',\n 'InsufficientFundsForFee',\n 'InvalidAccountForFee',\n 'AlreadyProcessed',\n 'BlockhashNotFound',\n // `InstructionError` intentionally omitted; delegated to `getSolanaErrorFromInstructionError`\n 'CallChainTooDeep',\n 'MissingSignatureForFee',\n 'InvalidAccountIndex',\n 'SignatureFailure',\n 'InvalidProgramForExecution',\n 'SanitizeFailure',\n 'ClusterMaintenance',\n 'AccountBorrowOutstanding',\n 'WouldExceedMaxBlockCostLimit',\n 'UnsupportedVersion',\n 'InvalidWritableAccount',\n 'WouldExceedMaxAccountCostLimit',\n 'WouldExceedAccountDataBlockLimit',\n 'TooManyAccountLocks',\n 'AddressLookupTableNotFound',\n 'InvalidAddressLookupTableOwner',\n 'InvalidAddressLookupTableData',\n 'InvalidAddressLookupTableIndex',\n 'InvalidRentPayingAccount',\n 'WouldExceedMaxVoteCostLimit',\n 'WouldExceedAccountDataTotalLimit',\n 'DuplicateInstruction',\n 'InsufficientFundsForRent',\n 'MaxLoadedAccountsDataSizeExceeded',\n 'InvalidLoadedAccountsDataSizeLimit',\n 'ResanitizationNeeded',\n 'ProgramExecutionTemporarilyRestricted',\n 'UnbalancedTransaction',\n];\n\nexport function getSolanaErrorFromTransactionError(transactionError: string | { [key: string]: unknown }): SolanaError {\n if (typeof transactionError === 'object' && 'InstructionError' in transactionError) {\n return getSolanaErrorFromInstructionError(\n ...(transactionError.InstructionError as Parameters),\n );\n }\n return getSolanaErrorFromRpcError(\n {\n errorCodeBaseOffset: 7050001,\n getErrorContext(errorCode, rpcErrorName, rpcErrorContext) {\n if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN) {\n return {\n errorName: rpcErrorName,\n ...(rpcErrorContext !== undefined ? { transactionErrorContext: rpcErrorContext } : null),\n };\n } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION) {\n return {\n index: Number(rpcErrorContext as bigint | number),\n };\n } else if (\n errorCode === SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT ||\n errorCode === SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED\n ) {\n return {\n accountIndex: Number((rpcErrorContext as { account_index: bigint | number }).account_index),\n };\n }\n },\n orderedErrorNames: ORDERED_ERROR_NAMES,\n rpcEnumError: transactionError,\n },\n getSolanaErrorFromTransactionError,\n );\n}\n","import {\n SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR,\n SOLANA_ERROR__JSON_RPC__INVALID_PARAMS,\n SOLANA_ERROR__JSON_RPC__INVALID_REQUEST,\n SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND,\n SOLANA_ERROR__JSON_RPC__PARSE_ERROR,\n SOLANA_ERROR__JSON_RPC__SCAN_ERROR,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION,\n SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,\n SolanaErrorCode,\n} from './codes';\nimport { SolanaErrorContext } from './context';\nimport { SolanaError } from './error';\nimport { safeCaptureStackTrace } from './stack-trace';\nimport { getSolanaErrorFromTransactionError } from './transaction-error';\n\ninterface RpcErrorResponse {\n code: bigint | number;\n data?: unknown;\n message: string;\n}\n\ntype TransactionError = string | { [key: string]: unknown };\n\n/**\n * Keep in sync with https://github.com/anza-xyz/agave/blob/master/rpc-client-types/src/response.rs\n * @hidden\n */\nexport interface RpcSimulateTransactionResult {\n accounts:\n | ({\n data:\n | string // LegacyBinary\n | {\n // Json\n parsed: unknown;\n program: string;\n space: bigint;\n }\n // Binary\n | [encodedBytes: string, encoding: 'base58' | 'base64' | 'base64+zstd' | 'binary' | 'jsonParsed'];\n executable: boolean;\n lamports: bigint;\n owner: string;\n rentEpoch: bigint;\n space?: bigint;\n } | null)[]\n | null;\n err: TransactionError | null;\n // Enabled by `enable_cpi_recording`\n innerInstructions?:\n | {\n index: number;\n instructions: (\n | {\n // Compiled\n accounts: number[];\n data: string;\n programIdIndex: number;\n stackHeight?: number;\n }\n | {\n // Parsed\n parsed: unknown;\n program: string;\n programId: string;\n stackHeight?: number;\n }\n | {\n // PartiallyDecoded\n accounts: string[];\n data: string;\n programId: string;\n stackHeight?: number;\n }\n )[];\n }[]\n | null;\n loadedAccountsDataSize: number | null;\n logs: string[] | null;\n replacementBlockhash: string | null;\n returnData: {\n data: [string, 'base64'];\n programId: string;\n } | null;\n unitsConsumed: bigint | null;\n}\n\nexport function getSolanaErrorFromJsonRpcError(putativeErrorResponse: unknown): SolanaError {\n let out: SolanaError;\n if (isRpcErrorResponse(putativeErrorResponse)) {\n const { code: rawCode, data, message } = putativeErrorResponse;\n const code = Number(rawCode);\n if (code === SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE) {\n const { err, ...preflightErrorContext } = data as RpcSimulateTransactionResult;\n const causeObject = err ? { cause: getSolanaErrorFromTransactionError(err) } : null;\n out = new SolanaError(SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, {\n ...preflightErrorContext,\n ...causeObject,\n });\n } else {\n let errorContext;\n switch (code) {\n case SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR:\n case SOLANA_ERROR__JSON_RPC__INVALID_PARAMS:\n case SOLANA_ERROR__JSON_RPC__INVALID_REQUEST:\n case SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND:\n case SOLANA_ERROR__JSON_RPC__PARSE_ERROR:\n case SOLANA_ERROR__JSON_RPC__SCAN_ERROR:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE:\n case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION:\n // The server supplies no structured data, but rather a pre-formatted message. Put\n // the server message in `context` so as not to completely lose the data. The long\n // term fix for this is to add data to the server responses and modify the\n // messages in `@solana/errors` to be actual format strings.\n errorContext = { __serverMessage: message };\n break;\n default:\n if (typeof data === 'object' && !Array.isArray(data)) {\n errorContext = data;\n }\n }\n out = new SolanaError(code as SolanaErrorCode, errorContext as SolanaErrorContext[SolanaErrorCode]);\n }\n } else {\n const message =\n typeof putativeErrorResponse === 'object' &&\n putativeErrorResponse !== null &&\n 'message' in putativeErrorResponse &&\n typeof putativeErrorResponse.message === 'string'\n ? putativeErrorResponse.message\n : 'Malformed JSON-RPC error with no message attribute';\n out = new SolanaError(SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, { error: putativeErrorResponse, message });\n }\n safeCaptureStackTrace(out, getSolanaErrorFromJsonRpcError);\n return out;\n}\n\nfunction isRpcErrorResponse(value: unknown): value is RpcErrorResponse {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'code' in value &&\n 'message' in value &&\n (typeof value.code === 'number' || typeof value.code === 'bigint') &&\n typeof value.message === 'string'\n );\n}\n","import {\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SolanaErrorCode,\n} from './codes';\nimport { isSolanaError } from './error';\n\n/**\n * Extracts the underlying cause from a simulation-related error.\n *\n * When a transaction simulation fails, the error is often wrapped in a\n * simulation-specific {@link SolanaError}. This function unwraps such errors\n * by returning the `cause` property, giving you access to the actual error\n * that triggered the simulation failure.\n *\n * If the provided error is not a simulation-related error, it is returned unchanged.\n *\n * The following error codes are considered simulation errors:\n * - {@link SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE}\n * - {@link SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT}\n *\n * @param error - The error to unwrap.\n * @return The underlying cause if the error is a simulation error, otherwise the original error.\n *\n * @example\n * Unwrapping a preflight failure to access the root cause.\n * ```ts\n * import { unwrapSimulationError } from '@solana/errors';\n *\n * try {\n * await sendTransaction(signedTransaction);\n * } catch (e) {\n * const cause = unwrapSimulationError(e);\n * console.log('Send transaction failed due to:', cause);\n * }\n * ```\n */\nexport function unwrapSimulationError(error: unknown): unknown {\n const simulationCodes: SolanaErrorCode[] = [\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n ];\n if (isSolanaError(error) && !!error.cause && simulationCodes.includes(error.context.__code)) {\n return error.cause;\n }\n return error;\n}\n","import { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Concatenates an array of `Uint8Array`s into a single `Uint8Array`.\n * Reuses the original byte array when applicable.\n *\n * @param byteArrays - The array of byte arrays to concatenate.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02]);\n * const bytes2 = new Uint8Array([]);\n * const bytes3 = new Uint8Array([0x03, 0x04]);\n * const bytes = mergeBytes([bytes1, bytes2, bytes3]);\n * // ^ [0x01, 0x02, 0x03, 0x04]\n * ```\n */\nexport const mergeBytes = (byteArrays: Uint8Array[]): Uint8Array => {\n const nonEmptyByteArrays = byteArrays.filter(arr => arr.length);\n if (nonEmptyByteArrays.length === 0) {\n return byteArrays.length ? byteArrays[0] : new Uint8Array();\n }\n\n if (nonEmptyByteArrays.length === 1) {\n return nonEmptyByteArrays[0];\n }\n\n const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n nonEmptyByteArrays.forEach(arr => {\n result.set(arr, offset);\n offset += arr.length;\n });\n return result;\n};\n\n/**\n * Pads a `Uint8Array` with zeroes to the specified length.\n * If the array is longer than the specified length, it is returned as-is.\n *\n * @param bytes - The byte array to pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 2);\n * // bytes === paddedBytes\n * ```\n */\nexport function padBytes(bytes: Uint8Array, length: number): Uint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array {\n if (bytes.length >= length) return bytes;\n const paddedBytes = new Uint8Array(length).fill(0);\n paddedBytes.set(bytes);\n return paddedBytes;\n}\n\n/**\n * Fixes a `Uint8Array` to the specified length.\n * If the array is longer than the specified length, it is truncated.\n * If the array is shorter than the specified length, it is padded with zeroes.\n *\n * @param bytes - The byte array to truncate or pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Truncates the byte array to the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // ^ [0x01, 0x02]\n * ```\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // bytes === fixedBytes\n * ```\n */\nexport const fixBytes = (bytes: ReadonlyUint8Array | Uint8Array, length: number): ReadonlyUint8Array | Uint8Array =>\n padBytes(bytes.length <= length ? bytes : bytes.slice(0, length), length);\n\n/**\n * Returns true if and only if the provided `data` byte array contains\n * the provided `bytes` byte array at the specified `offset`.\n *\n * @param data - The byte sequence to search for.\n * @param bytes - The byte array in which to search for `data`.\n * @param offset - The position in `bytes` where the search begins.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const data = new Uint8Array([0x02, 0x03]);\n * containsBytes(bytes, data, 1); // true\n * containsBytes(bytes, data, 2); // false\n * ```\n */\nexport function containsBytes(\n data: ReadonlyUint8Array | Uint8Array,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset: number,\n): boolean {\n const slice = offset === 0 && data.length === bytes.length ? data : data.slice(offset, offset + bytes.length);\n return bytesEqual(slice, bytes);\n}\n\n/**\n * Returns true if and only if the provided `bytes1` and `bytes2` byte arrays are equal.\n *\n * @param bytes1 - The first byte array to compare.\n * @param bytes2 - The second byte array to compare.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const bytes2 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * bytesEqual(bytes1, bytes2); // true\n * ```\n */\nexport function bytesEqual(bytes1: ReadonlyUint8Array | Uint8Array, bytes2: ReadonlyUint8Array | Uint8Array): boolean {\n return bytes1.length === bytes2.length && bytes1.every((value, index) => value === bytes2[index]);\n}\n","import {\n SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH,\n SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH,\n SolanaError,\n} from '@solana/errors';\n\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Defines an offset in bytes.\n */\nexport type Offset = number;\n\n/**\n * An object that can encode a value of type {@link TFrom} into a {@link ReadonlyUint8Array}.\n *\n * This is a common interface for {@link FixedSizeEncoder} and {@link VariableSizeEncoder}.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n *\n * @see {@link FixedSizeEncoder}\n * @see {@link VariableSizeEncoder}\n */\ntype BaseEncoder = {\n /** Encode the provided value and return the encoded bytes directly. */\n readonly encode: (value: TFrom) => ReadonlyUint8Array;\n /**\n * Writes the encoded value into the provided byte array at the given offset.\n * Returns the offset of the next byte after the encoded value.\n */\n readonly write: (value: TFrom, bytes: Uint8Array, offset: Offset) => Offset;\n};\n\n/**\n * An object that can encode a value of type {@link TFrom} into a fixed-size {@link ReadonlyUint8Array}.\n *\n * See {@link Encoder} to learn more about creating and composing encoders.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const encoder: FixedSizeEncoder;\n * const bytes = encoder.encode(42);\n * const size = encoder.fixedSize; // 4\n * ```\n *\n * @see {@link Encoder}\n * @see {@link VariableSizeEncoder}\n */\nexport type FixedSizeEncoder = BaseEncoder & {\n /** The fixed size of the encoded value in bytes. */\n readonly fixedSize: TSize;\n};\n\n/**\n * An object that can encode a value of type {@link TFrom} into a variable-size {@link ReadonlyUint8Array}.\n *\n * See {@link Encoder} to learn more about creating and composing encoders.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n *\n * @example\n * ```ts\n * const encoder: VariableSizeEncoder;\n * const bytes = encoder.encode('hello');\n * const size = encoder.getSizeFromValue('hello');\n * ```\n *\n * @see {@link Encoder}\n * @see {@link FixedSizeEncoder}\n */\nexport type VariableSizeEncoder = BaseEncoder & {\n /** Returns the size of the encoded value in bytes for a given input. */\n readonly getSizeFromValue: (value: TFrom) => number;\n /** The maximum possible size of an encoded value in bytes, if applicable. */\n readonly maxSize?: number;\n};\n\n/**\n * An object that can encode a value of type {@link TFrom} into a {@link ReadonlyUint8Array}.\n *\n * An `Encoder` can be either:\n * - A {@link FixedSizeEncoder}, where all encoded values have the same fixed size.\n * - A {@link VariableSizeEncoder}, where encoded values can vary in size.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @example\n * Encoding a value into a new byte array.\n * ```ts\n * const encoder: Encoder;\n * const bytes = encoder.encode('hello');\n * ```\n *\n * @example\n * Writing the encoded value into an existing byte array.\n * ```ts\n * const encoder: Encoder;\n * const bytes = new Uint8Array(100);\n * const nextOffset = encoder.write('hello', bytes, 20);\n * ```\n *\n * @remarks\n * You may create `Encoders` manually using the {@link createEncoder} function but it is more common\n * to compose multiple `Encoders` together using the various helpers of the `@solana/codecs` package.\n *\n * For instance, here's how you might create an `Encoder` for a `Person` object type that contains\n * a `name` string and an `age` number:\n *\n * ```ts\n * import { getStructEncoder, addEncoderSizePrefix, getUtf8Encoder, getU32Encoder } from '@solana/codecs';\n *\n * type Person = { name: string; age: number };\n * const getPersonEncoder = (): Encoder =>\n * getStructEncoder([\n * ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n * ['age', getU32Encoder()],\n * ]);\n * ```\n *\n * Note that composed `Encoder` types are clever enough to understand whether\n * they are fixed-size or variable-size. In the example above, `getU32Encoder()` is\n * a fixed-size encoder, while `addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())`\n * is a variable-size encoder. This makes the final `Person` encoder a variable-size encoder.\n *\n * @see {@link FixedSizeEncoder}\n * @see {@link VariableSizeEncoder}\n * @see {@link createEncoder}\n */\nexport type Encoder = FixedSizeEncoder | VariableSizeEncoder;\n\n/**\n * An object that can decode a byte array into a value of type {@link TTo}.\n *\n * This is a common interface for {@link FixedSizeDecoder} and {@link VariableSizeDecoder}.\n *\n * @interface\n * @typeParam TTo - The type of the decoded value.\n *\n * @see {@link FixedSizeDecoder}\n * @see {@link VariableSizeDecoder}\n */\ntype BaseDecoder = {\n /** Decodes the provided byte array at the given offset (or zero) and returns the value directly. */\n readonly decode: (bytes: ReadonlyUint8Array | Uint8Array, offset?: Offset) => TTo;\n /**\n * Reads the encoded value from the provided byte array at the given offset.\n * Returns the decoded value and the offset of the next byte after the encoded value.\n */\n readonly read: (bytes: ReadonlyUint8Array | Uint8Array, offset: Offset) => [TTo, Offset];\n};\n\n/**\n * An object that can decode a fixed-size byte array into a value of type {@link TTo}.\n *\n * See {@link Decoder} to learn more about creating and composing decoders.\n *\n * @interface\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const decoder: FixedSizeDecoder;\n * const value = decoder.decode(bytes);\n * const size = decoder.fixedSize; // 4\n * ```\n *\n * @see {@link Decoder}\n * @see {@link VariableSizeDecoder}\n */\nexport type FixedSizeDecoder = BaseDecoder & {\n /** The fixed size of the encoded value in bytes. */\n readonly fixedSize: TSize;\n};\n\n/**\n * An object that can decode a variable-size byte array into a value of type {@link TTo}.\n *\n * See {@link Decoder} to learn more about creating and composing decoders.\n *\n * @interface\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * ```ts\n * const decoder: VariableSizeDecoder;\n * const value = decoder.decode(bytes);\n * ```\n *\n * @see {@link Decoder}\n * @see {@link VariableSizeDecoder}\n */\nexport type VariableSizeDecoder = BaseDecoder & {\n /** The maximum possible size of an encoded value in bytes, if applicable. */\n readonly maxSize?: number;\n};\n\n/**\n * An object that can decode a byte array into a value of type {@link TTo}.\n *\n * An `Decoder` can be either:\n * - A {@link FixedSizeDecoder}, where all byte arrays have the same fixed size.\n * - A {@link VariableSizeDecoder}, where byte arrays can vary in size.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * Getting the decoded value from a byte array.\n * ```ts\n * const decoder: Decoder;\n * const value = decoder.decode(bytes);\n * ```\n *\n * @example\n * Reading the decoded value from a byte array at a specific offset\n * and getting the offset of the next byte to read.\n * ```ts\n * const decoder: Decoder;\n * const [value, nextOffset] = decoder.read('hello', bytes, 20);\n * ```\n *\n * @remarks\n * You may create `Decoders` manually using the {@link createDecoder} function but it is more common\n * to compose multiple `Decoders` together using the various helpers of the `@solana/codecs` package.\n *\n * For instance, here's how you might create an `Decoder` for a `Person` object type that contains\n * a `name` string and an `age` number:\n *\n * ```ts\n * import { getStructDecoder, addDecoderSizePrefix, getUtf8Decoder, getU32Decoder } from '@solana/codecs';\n *\n * type Person = { name: string; age: number };\n * const getPersonDecoder = (): Decoder =>\n * getStructDecoder([\n * ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n * ['age', getU32Decoder()],\n * ]);\n * ```\n *\n * Note that composed `Decoder` types are clever enough to understand whether\n * they are fixed-size or variable-size. In the example above, `getU32Decoder()` is\n * a fixed-size decoder, while `addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())`\n * is a variable-size decoder. This makes the final `Person` decoder a variable-size decoder.\n *\n * @see {@link FixedSizeDecoder}\n * @see {@link VariableSizeDecoder}\n * @see {@link createDecoder}\n */\nexport type Decoder = FixedSizeDecoder | VariableSizeDecoder;\n\n/**\n * An object that can encode and decode a value to and from a fixed-size byte array.\n *\n * See {@link Codec} to learn more about creating and composing codecs.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const codec: FixedSizeCodec;\n * const bytes = codec.encode(42);\n * const value = codec.decode(bytes); // 42n\n * const size = codec.fixedSize; // 8\n * ```\n *\n * @see {@link Codec}\n * @see {@link VariableSizeCodec}\n */\nexport type FixedSizeCodec = FixedSizeDecoder<\n TTo,\n TSize\n> &\n FixedSizeEncoder;\n\n/**\n * An object that can encode and decode a value to and from a variable-size byte array.\n *\n * See {@link Codec} to learn more about creating and composing codecs.\n *\n * @interface\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * ```ts\n * const codec: VariableSizeCodec;\n * const bytes = codec.encode(42);\n * const value = codec.decode(bytes); // 42n\n * const size = codec.getSizeFromValue(42);\n * ```\n *\n * @see {@link Codec}\n * @see {@link FixedSizeCodec}\n */\nexport type VariableSizeCodec = VariableSizeDecoder & VariableSizeEncoder;\n\n/**\n * An object that can encode and decode a value to and from a byte array.\n *\n * A `Codec` can be either:\n * - A {@link FixedSizeCodec}, where all encoded values have the same fixed size.\n * - A {@link VariableSizeCodec}, where encoded values can vary in size.\n *\n * @example\n * ```ts\n * const codec: Codec;\n * const bytes = codec.encode('hello');\n * const value = codec.decode(bytes); // 'hello'\n * ```\n *\n * @remarks\n * For convenience, codecs can encode looser types than they decode.\n * That is, type {@link TFrom} can be a superset of type {@link TTo}.\n * For instance, a `Codec` can encode both\n * `bigint` and `number` values, but will always decode to a `bigint`.\n *\n * ```ts\n * const codec: Codec;\n * const bytes = codec.encode(42);\n * const value = codec.decode(bytes); // 42n\n * ```\n *\n * It is worth noting that codecs are the union of encoders and decoders.\n * This means that a `Codec` can be combined from an `Encoder`\n * and a `Decoder` using the {@link combineCodec} function. This is particularly\n * useful for library authors who want to expose all three types of objects to their users.\n *\n * ```ts\n * const encoder: Encoder;\n * const decoder: Decoder;\n * const codec: Codec = combineCodec(encoder, decoder);\n * ```\n *\n * Aside from combining encoders and decoders, codecs can also be created from scratch using\n * the {@link createCodec} function but it is more common to compose multiple codecs together\n * using the various helpers of the `@solana/codecs` package.\n *\n * For instance, here's how you might create a `Codec` for a `Person` object type that contains\n * a `name` string and an `age` number:\n *\n * ```ts\n * import { getStructCodec, addCodecSizePrefix, getUtf8Codec, getU32Codec } from '@solana/codecs';\n *\n * type Person = { name: string; age: number };\n * const getPersonCodec = (): Codec =>\n * getStructCodec([\n * ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],\n * ['age', getU32Codec()],\n * ]);\n * ```\n *\n * Note that composed `Codec` types are clever enough to understand whether\n * they are fixed-size or variable-size. In the example above, `getU32Codec()` is\n * a fixed-size codec, while `addCodecSizePrefix(getUtf8Codec(), getU32Codec())`\n * is a variable-size codec. This makes the final `Person` codec a variable-size codec.\n *\n * @see {@link FixedSizeCodec}\n * @see {@link VariableSizeCodec}\n * @see {@link combineCodec}\n * @see {@link createCodec}\n */\nexport type Codec = FixedSizeCodec | VariableSizeCodec;\n\n/**\n * Gets the encoded size of a given value in bytes using the provided encoder.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @param value - The value to be encoded.\n * @param encoder - The encoder used to determine the encoded size.\n * @returns The size of the encoded value in bytes.\n *\n * @example\n * ```ts\n * const fixedSizeEncoder = { fixedSize: 4 };\n * getEncodedSize(123, fixedSizeEncoder); // Returns 4.\n *\n * const variableSizeEncoder = { getSizeFromValue: (value: string) => value.length };\n * getEncodedSize(\"hello\", variableSizeEncoder); // Returns 5.\n * ```\n *\n * @see {@link Encoder}\n */\nexport function getEncodedSize(\n value: TFrom,\n encoder: { fixedSize: number } | { getSizeFromValue: (value: TFrom) => number },\n): number {\n return 'fixedSize' in encoder ? encoder.fixedSize : encoder.getSizeFromValue(value);\n}\n\n/**\n * Creates an `Encoder` by filling in the missing `encode` function using the provided `write` function and\n * either the `fixedSize` property (for {@link FixedSizeEncoder | FixedSizeEncoders}) or\n * the `getSizeFromValue` function (for {@link VariableSizeEncoder | VariableSizeEncoders}).\n *\n * Instead of manually implementing `encode`, this utility leverages the existing `write` function\n * and the size helpers to generate a complete encoder. The provided `encode` method will allocate\n * a new `Uint8Array` of the correct size and use `write` to populate it.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size encoders).\n *\n * @param encoder - An encoder object that implements `write`, but not `encode`.\n * - If the encoder has a `fixedSize` property, it is treated as a {@link FixedSizeEncoder}.\n * - Otherwise, it is treated as a {@link VariableSizeEncoder}.\n *\n * @returns A fully functional `Encoder` with both `write` and `encode` methods.\n *\n * @example\n * Creating a custom fixed-size encoder.\n * ```ts\n * const encoder = createEncoder({\n * fixedSize: 4,\n * write: (value: number, bytes, offset) => {\n * bytes.set(new Uint8Array([value]), offset);\n * return offset + 4;\n * },\n * });\n *\n * const bytes = encoder.encode(42);\n * // 0x2a000000\n * ```\n *\n * @example\n * Creating a custom variable-size encoder:\n * ```ts\n * const encoder = createEncoder({\n * getSizeFromValue: (value: string) => value.length,\n * write: (value: string, bytes, offset) => {\n * const encodedValue = new TextEncoder().encode(value);\n * bytes.set(encodedValue, offset);\n * return offset + encodedValue.length;\n * },\n * });\n *\n * const bytes = encoder.encode(\"hello\");\n * // 0x68656c6c6f\n * ```\n *\n * @remarks\n * Note that, while `createEncoder` is useful for defining more complex encoders, it is more common to compose\n * encoders together using the various helpers and primitives of the `@solana/codecs` package.\n *\n * Here are some alternative examples using codec primitives instead of `createEncoder`.\n *\n * ```ts\n * // Fixed-size encoder for unsigned 32-bit integers.\n * const encoder = getU32Encoder();\n * const bytes = encoder.encode(42);\n * // 0x2a000000\n *\n * // Variable-size encoder for 32-bytes prefixed UTF-8 strings.\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * const bytes = encoder.encode(\"hello\");\n * // 0x0500000068656c6c6f\n *\n * // Variable-size encoder for custom objects.\n * type Person = { name: string; age: number };\n * const encoder: Encoder = getStructEncoder([\n * ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n * ['age', getU32Encoder()],\n * ]);\n * const bytes = encoder.encode({ name: \"Bob\", age: 42 });\n * // 0x03000000426f622a000000\n * ```\n *\n * @see {@link Encoder}\n * @see {@link FixedSizeEncoder}\n * @see {@link VariableSizeEncoder}\n * @see {@link getStructEncoder}\n * @see {@link getU32Encoder}\n * @see {@link getUtf8Encoder}\n * @see {@link addEncoderSizePrefix}\n */\nexport function createEncoder(\n encoder: Omit, 'encode'>,\n): FixedSizeEncoder;\nexport function createEncoder(encoder: Omit, 'encode'>): VariableSizeEncoder;\nexport function createEncoder(\n encoder: Omit, 'encode'> | Omit, 'encode'>,\n): Encoder;\nexport function createEncoder(\n encoder: Omit, 'encode'> | Omit, 'encode'>,\n): Encoder {\n return Object.freeze({\n ...encoder,\n encode: value => {\n const bytes = new Uint8Array(getEncodedSize(value, encoder));\n encoder.write(value, bytes, 0);\n return bytes;\n },\n });\n}\n\n/**\n * Creates a `Decoder` by filling in the missing `decode` function using the provided `read` function.\n *\n * Instead of manually implementing `decode`, this utility leverages the existing `read` function\n * and the size properties to generate a complete decoder. The provided `decode` method will read\n * from a `Uint8Array` at the given offset and return the decoded value.\n *\n * If the `fixedSize` property is provided, a {@link FixedSizeDecoder} will be created, otherwise\n * a {@link VariableSizeDecoder} will be created.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size decoders).\n *\n * @param decoder - A decoder object that implements `read`, but not `decode`.\n * - If the decoder has a `fixedSize` property, it is treated as a {@link FixedSizeDecoder}.\n * - Otherwise, it is treated as a {@link VariableSizeDecoder}.\n *\n * @returns A fully functional `Decoder` with both `read` and `decode` methods.\n *\n * @example\n * Creating a custom fixed-size decoder.\n * ```ts\n * const decoder = createDecoder({\n * fixedSize: 4,\n * read: (bytes, offset) => {\n * const value = bytes[offset];\n * return [value, offset + 4];\n * },\n * });\n *\n * const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));\n * // 42\n * ```\n *\n * @example\n * Creating a custom variable-size decoder:\n * ```ts\n * const decoder = createDecoder({\n * read: (bytes, offset) => {\n * const decodedValue = new TextDecoder().decode(bytes.subarray(offset));\n * return [decodedValue, bytes.length];\n * },\n * });\n *\n * const value = decoder.decode(new Uint8Array([104, 101, 108, 108, 111]));\n * // \"hello\"\n * ```\n *\n * @remarks\n * Note that, while `createDecoder` is useful for defining more complex decoders, it is more common to compose\n * decoders together using the various helpers and primitives of the `@solana/codecs` package.\n *\n * Here are some alternative examples using codec primitives instead of `createDecoder`.\n *\n * ```ts\n * // Fixed-size decoder for unsigned 32-bit integers.\n * const decoder = getU32Decoder();\n * const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));\n * // 42\n *\n * // Variable-size decoder for 32-bytes prefixed UTF-8 strings.\n * const decoder = addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());\n * const value = decoder.decode(new Uint8Array([5, 0, 0, 0, 104, 101, 108, 108, 111]));\n * // \"hello\"\n *\n * // Variable-size decoder for custom objects.\n * type Person = { name: string; age: number };\n * const decoder: Decoder = getStructDecoder([\n * ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n * ['age', getU32Decoder()],\n * ]);\n * const value = decoder.decode(new Uint8Array([3, 0, 0, 0, 66, 111, 98, 42, 0, 0, 0]));\n * // { name: \"Bob\", age: 42 }\n * ```\n *\n * @see {@link Decoder}\n * @see {@link FixedSizeDecoder}\n * @see {@link VariableSizeDecoder}\n * @see {@link getStructDecoder}\n * @see {@link getU32Decoder}\n * @see {@link getUtf8Decoder}\n * @see {@link addDecoderSizePrefix}\n */\nexport function createDecoder(\n decoder: Omit, 'decode'>,\n): FixedSizeDecoder;\nexport function createDecoder(decoder: Omit, 'decode'>): VariableSizeDecoder;\nexport function createDecoder(\n decoder: Omit, 'decode'> | Omit, 'decode'>,\n): Decoder;\nexport function createDecoder(\n decoder: Omit, 'decode'> | Omit, 'decode'>,\n): Decoder {\n return Object.freeze({\n ...decoder,\n decode: (bytes, offset = 0) => decoder.read(bytes, offset)[0],\n });\n}\n\n/**\n * Creates a `Codec` by filling in the missing `encode` and `decode` functions using the provided `write` and `read` functions.\n *\n * This utility combines the behavior of {@link createEncoder} and {@link createDecoder} to produce a fully functional `Codec`.\n * The `encode` method is derived from the `write` function, while the `decode` method is derived from the `read` function.\n *\n * If the `fixedSize` property is provided, a {@link FixedSizeCodec} will be created, otherwise\n * a {@link VariableSizeCodec} will be created.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size codecs).\n *\n * @param codec - A codec object that implements `write` and `read`, but not `encode` or `decode`.\n * - If the codec has a `fixedSize` property, it is treated as a {@link FixedSizeCodec}.\n * - Otherwise, it is treated as a {@link VariableSizeCodec}.\n *\n * @returns A fully functional `Codec` with `write`, `read`, `encode`, and `decode` methods.\n *\n * @example\n * Creating a custom fixed-size codec.\n * ```ts\n * const codec = createCodec({\n * fixedSize: 4,\n * read: (bytes, offset) => {\n * const value = bytes[offset];\n * return [value, offset + 4];\n * },\n * write: (value: number, bytes, offset) => {\n * bytes.set(new Uint8Array([value]), offset);\n * return offset + 4;\n * },\n * });\n *\n * const bytes = codec.encode(42);\n * // 0x2a000000\n * const value = codec.decode(bytes);\n * // 42\n * ```\n *\n * @example\n * Creating a custom variable-size codec:\n * ```ts\n * const codec = createCodec({\n * getSizeFromValue: (value: string) => value.length,\n * read: (bytes, offset) => {\n * const decodedValue = new TextDecoder().decode(bytes.subarray(offset));\n * return [decodedValue, bytes.length];\n * },\n * write: (value: string, bytes, offset) => {\n * const encodedValue = new TextEncoder().encode(value);\n * bytes.set(encodedValue, offset);\n * return offset + encodedValue.length;\n * },\n * });\n *\n * const bytes = codec.encode(\"hello\");\n * // 0x68656c6c6f\n * const value = codec.decode(bytes);\n * // \"hello\"\n * ```\n *\n * @remarks\n * This function effectively combines the behavior of {@link createEncoder} and {@link createDecoder}.\n * If you only need to encode or decode (but not both), consider using those functions instead.\n *\n * Here are some alternative examples using codec primitives instead of `createCodec`.\n *\n * ```ts\n * // Fixed-size codec for unsigned 32-bit integers.\n * const codec = getU32Codec();\n * const bytes = codec.encode(42);\n * // 0x2a000000\n * const value = codec.decode(bytes);\n * // 42\n *\n * // Variable-size codec for 32-bytes prefixed UTF-8 strings.\n * const codec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const bytes = codec.encode(\"hello\");\n * // 0x0500000068656c6c6f\n * const value = codec.decode(bytes);\n * // \"hello\"\n *\n * // Variable-size codec for custom objects.\n * type Person = { name: string; age: number };\n * const codec: Codec = getStructCodec([\n * ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],\n * ['age', getU32Codec()],\n * ]);\n * const bytes = codec.encode({ name: \"Bob\", age: 42 });\n * // 0x03000000426f622a000000\n * const value = codec.decode(bytes);\n * // { name: \"Bob\", age: 42 }\n * ```\n *\n * @see {@link Codec}\n * @see {@link FixedSizeCodec}\n * @see {@link VariableSizeCodec}\n * @see {@link createEncoder}\n * @see {@link createDecoder}\n * @see {@link getStructCodec}\n * @see {@link getU32Codec}\n * @see {@link getUtf8Codec}\n * @see {@link addCodecSizePrefix}\n */\nexport function createCodec(\n codec: Omit, 'decode' | 'encode'>,\n): FixedSizeCodec;\nexport function createCodec(\n codec: Omit, 'decode' | 'encode'>,\n): VariableSizeCodec;\nexport function createCodec(\n codec:\n | Omit, 'decode' | 'encode'>\n | Omit, 'decode' | 'encode'>,\n): Codec;\nexport function createCodec(\n codec:\n | Omit, 'decode' | 'encode'>\n | Omit, 'decode' | 'encode'>,\n): Codec {\n return Object.freeze({\n ...codec,\n decode: (bytes, offset = 0) => codec.read(bytes, offset)[0],\n encode: value => {\n const bytes = new Uint8Array(getEncodedSize(value, codec));\n codec.write(value, bytes, 0);\n return bytes;\n },\n });\n}\n\n/**\n * Determines whether the given codec, encoder, or decoder is fixed-size.\n *\n * A fixed-size object is identified by the presence of a `fixedSize` property.\n * If this property exists, the object is considered a {@link FixedSizeCodec},\n * {@link FixedSizeEncoder}, or {@link FixedSizeDecoder}.\n * Otherwise, it is assumed to be a {@link VariableSizeCodec},\n * {@link VariableSizeEncoder}, or {@link VariableSizeDecoder}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @returns `true` if the object is fixed-size, `false` otherwise.\n *\n * @example\n * Checking a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * isFixedSize(encoder); // true\n * ```\n *\n * @example\n * Checking a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * isFixedSize(encoder); // false\n * ```\n *\n * @remarks\n * This function is commonly used to distinguish between fixed-size and variable-size objects at runtime.\n * If you need to enforce this distinction with type assertions, consider using {@link assertIsFixedSize}.\n *\n * @see {@link assertIsFixedSize}\n */\nexport function isFixedSize(\n encoder: FixedSizeEncoder | VariableSizeEncoder,\n): encoder is FixedSizeEncoder;\nexport function isFixedSize(\n decoder: FixedSizeDecoder | VariableSizeDecoder,\n): decoder is FixedSizeDecoder;\nexport function isFixedSize(\n codec: FixedSizeCodec | VariableSizeCodec,\n): codec is FixedSizeCodec;\nexport function isFixedSize(\n codec: { fixedSize: TSize } | { maxSize?: number },\n): codec is { fixedSize: TSize };\nexport function isFixedSize(codec: { fixedSize: number } | { maxSize?: number }): codec is { fixedSize: number } {\n return 'fixedSize' in codec && typeof codec.fixedSize === 'number';\n}\n\n/**\n * Asserts that the given codec, encoder, or decoder is fixed-size.\n *\n * If the object is not fixed-size (i.e., it lacks a `fixedSize` property),\n * this function throws a {@link SolanaError} with the code `SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH`.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @throws {SolanaError} If the object is not fixed-size.\n *\n * @example\n * Asserting a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * assertIsFixedSize(encoder); // Passes\n * ```\n *\n * @example\n * Attempting to assert a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * assertIsFixedSize(encoder); // Throws SolanaError\n * ```\n *\n * @remarks\n * This function is the assertion-based counterpart of {@link isFixedSize}.\n * If you only need to check whether an object is fixed-size without throwing an error, use {@link isFixedSize} instead.\n *\n * @see {@link isFixedSize}\n */\nexport function assertIsFixedSize(\n encoder: FixedSizeEncoder | VariableSizeEncoder,\n): asserts encoder is FixedSizeEncoder;\nexport function assertIsFixedSize(\n decoder: FixedSizeDecoder | VariableSizeDecoder,\n): asserts decoder is FixedSizeDecoder;\nexport function assertIsFixedSize(\n codec: FixedSizeCodec | VariableSizeCodec,\n): asserts codec is FixedSizeCodec;\nexport function assertIsFixedSize(\n codec: { fixedSize: TSize } | { maxSize?: number },\n): asserts codec is { fixedSize: TSize };\nexport function assertIsFixedSize(\n codec: { fixedSize: number } | { maxSize?: number },\n): asserts codec is { fixedSize: number } {\n if (!isFixedSize(codec)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH);\n }\n}\n\n/**\n * Determines whether the given codec, encoder, or decoder is variable-size.\n *\n * A variable-size object is identified by the absence of a `fixedSize` property.\n * If this property is missing, the object is considered a {@link VariableSizeCodec},\n * {@link VariableSizeEncoder}, or {@link VariableSizeDecoder}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @returns `true` if the object is variable-size, `false` otherwise.\n *\n * @example\n * Checking a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * isVariableSize(encoder); // true\n * ```\n *\n * @example\n * Checking a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * isVariableSize(encoder); // false\n * ```\n *\n * @remarks\n * This function is the inverse of {@link isFixedSize}.\n *\n * @see {@link isFixedSize}\n * @see {@link assertIsVariableSize}\n */\nexport function isVariableSize(encoder: Encoder): encoder is VariableSizeEncoder;\nexport function isVariableSize(decoder: Decoder): decoder is VariableSizeDecoder;\nexport function isVariableSize(\n codec: Codec,\n): codec is VariableSizeCodec;\nexport function isVariableSize(codec: { fixedSize: number } | { maxSize?: number }): codec is { maxSize?: number };\nexport function isVariableSize(codec: { fixedSize: number } | { maxSize?: number }): codec is { maxSize?: number } {\n return !isFixedSize(codec);\n}\n\n/**\n * Asserts that the given codec, encoder, or decoder is variable-size.\n *\n * If the object is not variable-size (i.e., it has a `fixedSize` property),\n * this function throws a {@link SolanaError} with the code `SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH`.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n * @throws {SolanaError} If the object is not variable-size.\n *\n * @example\n * Asserting a variable-size encoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * assertIsVariableSize(encoder); // Passes\n * ```\n *\n * @example\n * Attempting to assert a fixed-size encoder.\n * ```ts\n * const encoder = getU32Encoder();\n * assertIsVariableSize(encoder); // Throws SolanaError\n * ```\n *\n * @remarks\n * This function is the assertion-based counterpart of {@link isVariableSize}.\n * If you only need to check whether an object is variable-size without throwing an error, use {@link isVariableSize} instead.\n *\n * Also note that this function is the inverse of {@link assertIsFixedSize}.\n *\n * @see {@link isVariableSize}\n * @see {@link assertIsFixedSize}\n */\nexport function assertIsVariableSize(encoder: Encoder): asserts encoder is VariableSizeEncoder;\nexport function assertIsVariableSize(decoder: Decoder): asserts decoder is VariableSizeDecoder;\nexport function assertIsVariableSize(\n codec: Codec,\n): asserts codec is VariableSizeCodec;\nexport function assertIsVariableSize(\n codec: { fixedSize: number } | { maxSize?: number },\n): asserts codec is { maxSize?: number };\nexport function assertIsVariableSize(\n codec: { fixedSize: number } | { maxSize?: number },\n): asserts codec is { maxSize?: number } {\n if (!isVariableSize(codec)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH);\n }\n}\n","import {\n SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH,\n SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH,\n SolanaError,\n} from '@solana/errors';\n\nimport {\n Codec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\n\n/**\n * Combines an `Encoder` and a `Decoder` into a `Codec`.\n *\n * That is, given a `Encoder` and a `Decoder`, this function returns a `Codec`.\n *\n * This allows for modular composition by keeping encoding and decoding logic separate\n * while still offering a convenient way to bundle them into a single `Codec`.\n * This is particularly useful for library maintainers who want to expose `Encoders`,\n * `Decoders`, and `Codecs` separately, enabling tree-shaking of unused logic.\n *\n * The provided `Encoder` and `Decoder` must be compatible in terms of:\n * - **Fixed Size:** If both are fixed-size, they must have the same `fixedSize` value.\n * - **Variable Size:** If either has a `maxSize` attribute, it must match the other.\n *\n * If these conditions are not met, a {@link SolanaError} will be thrown.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes (for fixed-size codecs).\n *\n * @param encoder - The `Encoder` to combine.\n * @param decoder - The `Decoder` to combine.\n * @returns A `Codec` that provides both `encode` and `decode` methods.\n *\n * @throws {SolanaError}\n * - `SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH`\n * Thrown if the encoder and decoder have mismatched size types (fixed vs. variable).\n * - `SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH`\n * Thrown if both are fixed-size but have different `fixedSize` values.\n * - `SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH`\n * Thrown if the `maxSize` attributes do not match.\n *\n * @example\n * Creating a fixed-size `Codec` from an encoder and a decoder.\n * ```ts\n * const encoder = getU32Encoder();\n * const decoder = getU32Decoder();\n * const codec = combineCodec(encoder, decoder);\n *\n * const bytes = codec.encode(42); // 0x2a000000\n * const value = codec.decode(bytes); // 42\n * ```\n *\n * @example\n * Creating a variable-size `Codec` from an encoder and a decoder.\n * ```ts\n * const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());\n * const decoder = addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());\n * const codec = combineCodec(encoder, decoder);\n *\n * const bytes = codec.encode(\"hello\"); // 0x0500000068656c6c6f\n * const value = codec.decode(bytes); // \"hello\"\n * ```\n *\n * @remarks\n * The recommended pattern for defining codecs in libraries is to expose separate functions for the encoder, decoder, and codec.\n * This allows users to import only what they need, improving tree-shaking efficiency.\n *\n * ```ts\n * type MyType = \\/* ... *\\/;\n * const getMyTypeEncoder = (): Encoder => { \\/* ... *\\/ };\n * const getMyTypeDecoder = (): Decoder => { \\/* ... *\\/ };\n * const getMyTypeCodec = (): Codec =>\n * combineCodec(getMyTypeEncoder(), getMyTypeDecoder());\n * ```\n *\n * @see {@link Codec}\n * @see {@link Encoder}\n * @see {@link Decoder}\n */\nexport function combineCodec(\n encoder: FixedSizeEncoder,\n decoder: FixedSizeDecoder,\n): FixedSizeCodec;\nexport function combineCodec(\n encoder: VariableSizeEncoder,\n decoder: VariableSizeDecoder,\n): VariableSizeCodec;\nexport function combineCodec(\n encoder: Encoder,\n decoder: Decoder,\n): Codec;\nexport function combineCodec(\n encoder: Encoder,\n decoder: Decoder,\n): Codec {\n if (isFixedSize(encoder) !== isFixedSize(decoder)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH);\n }\n\n if (isFixedSize(encoder) && isFixedSize(decoder) && encoder.fixedSize !== decoder.fixedSize) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, {\n decoderFixedSize: decoder.fixedSize,\n encoderFixedSize: encoder.fixedSize,\n });\n }\n\n if (!isFixedSize(encoder) && !isFixedSize(decoder) && encoder.maxSize !== decoder.maxSize) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, {\n decoderMaxSize: decoder.maxSize,\n encoderMaxSize: encoder.maxSize,\n });\n }\n\n return {\n ...decoder,\n ...encoder,\n decode: decoder.decode,\n encode: encoder.encode,\n read: decoder.read,\n write: encoder.write,\n };\n}\n","import {\n SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL,\n SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES,\n SolanaError,\n} from '@solana/errors';\n\nimport { containsBytes } from './bytes';\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\nimport { combineCodec } from './combine-codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Creates an encoder that writes a `Uint8Array` sentinel after the encoded value.\n * This is useful to delimit the encoded value when being read by a decoder.\n *\n * See {@link addCodecSentinel} for more information.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @see {@link addCodecSentinel}\n */\nexport function addEncoderSentinel(\n encoder: FixedSizeEncoder,\n sentinel: ReadonlyUint8Array,\n): FixedSizeEncoder;\nexport function addEncoderSentinel(\n encoder: Encoder,\n sentinel: ReadonlyUint8Array,\n): VariableSizeEncoder;\nexport function addEncoderSentinel(encoder: Encoder, sentinel: ReadonlyUint8Array): Encoder {\n const write = ((value, bytes, offset) => {\n // Here we exceptionally use the `encode` function instead of the `write`\n // function to contain the content of the encoder within its own bounds\n // and to avoid writing the sentinel as part of the encoded value.\n const encoderBytes = encoder.encode(value);\n if (findSentinelIndex(encoderBytes, sentinel) >= 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, {\n encodedBytes: encoderBytes,\n hexEncodedBytes: hexBytes(encoderBytes),\n hexSentinel: hexBytes(sentinel),\n sentinel,\n });\n }\n bytes.set(encoderBytes, offset);\n offset += encoderBytes.length;\n bytes.set(sentinel, offset);\n offset += sentinel.length;\n return offset;\n }) as Encoder['write'];\n\n if (isFixedSize(encoder)) {\n return createEncoder({ ...encoder, fixedSize: encoder.fixedSize + sentinel.length, write });\n }\n\n return createEncoder({\n ...encoder,\n ...(encoder.maxSize != null ? { maxSize: encoder.maxSize + sentinel.length } : {}),\n getSizeFromValue: value => encoder.getSizeFromValue(value) + sentinel.length,\n write,\n });\n}\n\n/**\n * Creates a decoder that continues reading until\n * a given `Uint8Array` sentinel is found.\n *\n * See {@link addCodecSentinel} for more information.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @see {@link addCodecSentinel}\n */\nexport function addDecoderSentinel(\n decoder: FixedSizeDecoder,\n sentinel: ReadonlyUint8Array,\n): FixedSizeDecoder;\nexport function addDecoderSentinel(decoder: Decoder, sentinel: ReadonlyUint8Array): VariableSizeDecoder;\nexport function addDecoderSentinel(decoder: Decoder, sentinel: ReadonlyUint8Array): Decoder {\n const read = ((bytes, offset) => {\n const candidateBytes = offset === 0 ? bytes : bytes.slice(offset);\n const sentinelIndex = findSentinelIndex(candidateBytes, sentinel);\n if (sentinelIndex === -1) {\n throw new SolanaError(SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, {\n decodedBytes: candidateBytes,\n hexDecodedBytes: hexBytes(candidateBytes),\n hexSentinel: hexBytes(sentinel),\n sentinel,\n });\n }\n const preSentinelBytes = candidateBytes.slice(0, sentinelIndex);\n // Here we exceptionally use the `decode` function instead of the `read`\n // function to contain the content of the decoder within its own bounds\n // and ensure that the sentinel is not part of the decoded value.\n return [decoder.decode(preSentinelBytes), offset + preSentinelBytes.length + sentinel.length];\n }) as Decoder['read'];\n\n if (isFixedSize(decoder)) {\n return createDecoder({ ...decoder, fixedSize: decoder.fixedSize + sentinel.length, read });\n }\n\n return createDecoder({\n ...decoder,\n ...(decoder.maxSize != null ? { maxSize: decoder.maxSize + sentinel.length } : {}),\n read,\n });\n}\n\n/**\n * Creates a Codec that writes a given `Uint8Array` sentinel after the encoded\n * value and, when decoding, continues reading until the sentinel is found.\n *\n * This sets a limit on variable-size codecs and tells us when to stop decoding.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * ```ts\n * const codec = addCodecSentinel(getUtf8Codec(), new Uint8Array([255, 255]));\n * codec.encode('hello');\n * // 0x68656c6c6fffff\n * // | └-- Our sentinel.\n * // └-- Our encoded string.\n * ```\n *\n * @remarks\n * Note that the sentinel _must not_ be present in the encoded data and\n * _must_ be present in the decoded data for this to work.\n * If this is not the case, dedicated errors will be thrown.\n *\n * ```ts\n * const sentinel = new Uint8Array([108, 108]); // 'll'\n * const codec = addCodecSentinel(getUtf8Codec(), sentinel);\n *\n * codec.encode('hello'); // Throws: sentinel is in encoded data.\n * codec.decode(new Uint8Array([1, 2, 3])); // Throws: sentinel missing in decoded data.\n * ```\n *\n * Separate {@link addEncoderSentinel} and {@link addDecoderSentinel} functions are also available.\n *\n * ```ts\n * const bytes = addEncoderSentinel(getUtf8Encoder(), sentinel).encode('hello');\n * const value = addDecoderSentinel(getUtf8Decoder(), sentinel).decode(bytes);\n * ```\n *\n * @see {@link addEncoderSentinel}\n * @see {@link addDecoderSentinel}\n */\nexport function addCodecSentinel(\n codec: FixedSizeCodec,\n sentinel: ReadonlyUint8Array,\n): FixedSizeCodec;\nexport function addCodecSentinel(\n codec: Codec,\n sentinel: ReadonlyUint8Array,\n): VariableSizeCodec;\nexport function addCodecSentinel(\n codec: Codec,\n sentinel: ReadonlyUint8Array,\n): Codec {\n return combineCodec(addEncoderSentinel(codec, sentinel), addDecoderSentinel(codec, sentinel));\n}\n\nfunction findSentinelIndex(bytes: ReadonlyUint8Array, sentinel: ReadonlyUint8Array) {\n return bytes.findIndex((byte, index, arr) => {\n if (sentinel.length === 1) return byte === sentinel[0];\n return containsBytes(arr, sentinel, index);\n });\n}\n\nfunction hexBytes(bytes: ReadonlyUint8Array): string {\n return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n","import {\n SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY,\n SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Asserts that a given byte array is not empty (after the optional provided offset).\n *\n * Returns void if the byte array is not empty but throws a {@link SolanaError} otherwise.\n *\n * @param codecDescription - A description of the codec used by the assertion error.\n * @param bytes - The byte array to check.\n * @param offset - The offset from which to start checking the byte array.\n * If provided, the byte array is considered empty if it has no bytes after the offset.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03]);\n * assertByteArrayIsNotEmptyForCodec('myCodec', bytes); // OK\n * assertByteArrayIsNotEmptyForCodec('myCodec', bytes, 1); // OK\n * assertByteArrayIsNotEmptyForCodec('myCodec', bytes, 3); // Throws\n * ```\n */\nexport function assertByteArrayIsNotEmptyForCodec(\n codecDescription: string,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset = 0,\n) {\n if (bytes.length - offset <= 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, {\n codecDescription,\n });\n }\n}\n\n/**\n * Asserts that a given byte array has enough bytes to decode\n * (after the optional provided offset).\n *\n * Returns void if the byte array has at least the expected number\n * of bytes but throws a {@link SolanaError} otherwise.\n *\n * @param codecDescription - A description of the codec used by the assertion error.\n * @param expected - The minimum number of bytes expected in the byte array.\n * @param bytes - The byte array to check.\n * @param offset - The offset from which to start checking the byte array.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03]);\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 3, bytes); // OK\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 4, bytes); // Throws\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 2, bytes, 1); // OK\n * assertByteArrayHasEnoughBytesForCodec('myCodec', 3, bytes, 1); // Throws\n * ```\n */\nexport function assertByteArrayHasEnoughBytesForCodec(\n codecDescription: string,\n expected: number,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset = 0,\n) {\n const bytesLength = bytes.length - offset;\n if (bytesLength < expected) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, {\n bytesLength,\n codecDescription,\n expected,\n });\n }\n}\n\n/**\n * Asserts that a given offset is within the byte array bounds.\n * This range is between 0 and the byte array length and is inclusive.\n * An offset equals to the byte array length is considered a valid offset\n * as it allows the post-offset of codecs to signal the end of the byte array.\n *\n * @param codecDescription - A description of the codec used by the assertion error.\n * @param offset - The offset to check.\n * @param bytesLength - The length of the byte array from which the offset should be within bounds.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03]);\n * assertByteArrayOffsetIsNotOutOfRange('myCodec', 0, bytes.length); // OK\n * assertByteArrayOffsetIsNotOutOfRange('myCodec', 3, bytes.length); // OK\n * assertByteArrayOffsetIsNotOutOfRange('myCodec', 4, bytes.length); // Throws\n * ```\n */\nexport function assertByteArrayOffsetIsNotOutOfRange(codecDescription: string, offset: number, bytesLength: number) {\n if (offset < 0 || offset > bytesLength) {\n throw new SolanaError(SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, {\n bytesLength,\n codecDescription,\n offset,\n });\n }\n}\n","import { assertByteArrayHasEnoughBytesForCodec } from './assertions';\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n isFixedSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\nimport { combineCodec } from './combine-codec';\n\ntype NumberEncoder = Encoder | Encoder;\ntype FixedSizeNumberEncoder =\n | FixedSizeEncoder\n | FixedSizeEncoder;\ntype NumberDecoder = Decoder | Decoder;\ntype FixedSizeNumberDecoder =\n | FixedSizeDecoder\n | FixedSizeDecoder;\ntype NumberCodec = Codec | Codec;\ntype FixedSizeNumberCodec =\n | FixedSizeCodec\n | FixedSizeCodec;\n\n/**\n * Stores the size of the `encoder` in bytes as a prefix using the `prefix` encoder.\n *\n * See {@link addCodecSizePrefix} for more information.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @see {@link addCodecSizePrefix}\n */\nexport function addEncoderSizePrefix(\n encoder: FixedSizeEncoder,\n prefix: FixedSizeNumberEncoder,\n): FixedSizeEncoder;\nexport function addEncoderSizePrefix(encoder: Encoder, prefix: NumberEncoder): VariableSizeEncoder;\nexport function addEncoderSizePrefix(encoder: Encoder, prefix: NumberEncoder): Encoder {\n const write = ((value, bytes, offset) => {\n // Here we exceptionally use the `encode` function instead of the `write`\n // function to contain the content of the encoder within its own bounds.\n const encoderBytes = encoder.encode(value);\n offset = prefix.write(encoderBytes.length, bytes, offset);\n bytes.set(encoderBytes, offset);\n return offset + encoderBytes.length;\n }) as Encoder['write'];\n\n if (isFixedSize(prefix) && isFixedSize(encoder)) {\n return createEncoder({ ...encoder, fixedSize: prefix.fixedSize + encoder.fixedSize, write });\n }\n\n const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : (prefix.maxSize ?? null);\n const encoderMaxSize = isFixedSize(encoder) ? encoder.fixedSize : (encoder.maxSize ?? null);\n const maxSize = prefixMaxSize !== null && encoderMaxSize !== null ? prefixMaxSize + encoderMaxSize : null;\n\n return createEncoder({\n ...encoder,\n ...(maxSize !== null ? { maxSize } : {}),\n getSizeFromValue: value => {\n const encoderSize = getEncodedSize(value, encoder);\n return getEncodedSize(encoderSize, prefix) + encoderSize;\n },\n write,\n });\n}\n\n/**\n * Bounds the size of the nested `decoder` by reading its encoded `prefix`.\n *\n * See {@link addCodecSizePrefix} for more information.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @see {@link addCodecSizePrefix}\n */\nexport function addDecoderSizePrefix(\n decoder: FixedSizeDecoder,\n prefix: FixedSizeNumberDecoder,\n): FixedSizeDecoder;\nexport function addDecoderSizePrefix(decoder: Decoder, prefix: NumberDecoder): VariableSizeDecoder;\nexport function addDecoderSizePrefix(decoder: Decoder, prefix: NumberDecoder): Decoder {\n const read = ((bytes, offset) => {\n const [bigintSize, decoderOffset] = prefix.read(bytes, offset);\n const size = Number(bigintSize);\n offset = decoderOffset;\n // Slice the byte array to the contained size if necessary.\n if (offset > 0 || bytes.length > size) {\n bytes = bytes.slice(offset, offset + size);\n }\n assertByteArrayHasEnoughBytesForCodec('addDecoderSizePrefix', size, bytes);\n // Here we exceptionally use the `decode` function instead of the `read`\n // function to contain the content of the decoder within its own bounds.\n return [decoder.decode(bytes), offset + size];\n }) as Decoder['read'];\n\n if (isFixedSize(prefix) && isFixedSize(decoder)) {\n return createDecoder({ ...decoder, fixedSize: prefix.fixedSize + decoder.fixedSize, read });\n }\n\n const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : (prefix.maxSize ?? null);\n const decoderMaxSize = isFixedSize(decoder) ? decoder.fixedSize : (decoder.maxSize ?? null);\n const maxSize = prefixMaxSize !== null && decoderMaxSize !== null ? prefixMaxSize + decoderMaxSize : null;\n return createDecoder({ ...decoder, ...(maxSize !== null ? { maxSize } : {}), read });\n}\n\n/**\n * Stores the byte size of any given codec as an encoded number prefix.\n *\n * This sets a limit on variable-size codecs and tells us when to stop decoding.\n * When encoding, the size of the encoded data is stored before the encoded data itself.\n * When decoding, the size is read first to know how many bytes to read next.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @example\n * For example, say we want to bound a variable-size base-58 string using a `u32` size prefix.\n * Here’s how you can use the `addCodecSizePrefix` function to achieve that.\n *\n * ```ts\n * const getU32Base58Codec = () => addCodecSizePrefix(getBase58Codec(), getU32Codec());\n *\n * getU32Base58Codec().encode('hello world');\n * // 0x0b00000068656c6c6f20776f726c64\n * // | └-- Our encoded base-58 string.\n * // └-- Our encoded u32 size prefix.\n * ```\n *\n * @remarks\n * Separate {@link addEncoderSizePrefix} and {@link addDecoderSizePrefix} functions are also available.\n *\n * ```ts\n * const bytes = addEncoderSizePrefix(getBase58Encoder(), getU32Encoder()).encode('hello');\n * const value = addDecoderSizePrefix(getBase58Decoder(), getU32Decoder()).decode(bytes);\n * ```\n *\n * @see {@link addEncoderSizePrefix}\n * @see {@link addDecoderSizePrefix}\n */\nexport function addCodecSizePrefix(\n codec: FixedSizeCodec,\n prefix: FixedSizeNumberCodec,\n): FixedSizeCodec;\nexport function addCodecSizePrefix(\n codec: Codec,\n prefix: NumberCodec,\n): VariableSizeCodec;\nexport function addCodecSizePrefix(\n codec: Codec,\n prefix: NumberCodec,\n): Codec {\n return combineCodec(addEncoderSizePrefix(codec, prefix), addDecoderSizePrefix(codec, prefix));\n}\n","import { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Converts a `Uint8Array` to an `ArrayBuffer`. If the underlying buffer is a `SharedArrayBuffer`,\n * it will be copied to a non-shared buffer, for safety.\n *\n * @remarks\n * Source: https://stackoverflow.com/questions/37228285/uint8array-to-arraybuffer\n */\nexport function toArrayBuffer(bytes: ReadonlyUint8Array | Uint8Array, offset?: number, length?: number): ArrayBuffer {\n const bytesOffset = bytes.byteOffset + (offset ?? 0);\n const bytesLength = length ?? bytes.byteLength;\n let buffer: ArrayBuffer;\n if (typeof SharedArrayBuffer === 'undefined') {\n buffer = bytes.buffer as ArrayBuffer;\n } else if (bytes.buffer instanceof SharedArrayBuffer) {\n buffer = new ArrayBuffer(bytes.length);\n new Uint8Array(buffer).set(new Uint8Array(bytes));\n } else {\n buffer = bytes.buffer;\n }\n return (bytesOffset === 0 || bytesOffset === -bytes.byteLength) && bytesLength === bytes.byteLength\n ? buffer\n : buffer.slice(bytesOffset, bytesOffset + bytesLength);\n}\n","import { SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, SolanaError } from '@solana/errors';\n\nimport { createDecoder, Decoder } from './codec';\n\n/**\n * Create a {@link Decoder} that asserts that the bytes provided to `decode` or `read` are fully consumed by the inner decoder\n * @param decoder A decoder to wrap\n * @returns A new decoder that will throw if provided with a byte array that it does not fully consume\n *\n * @typeParam T - The type of the decoder\n *\n * @remarks\n * Note that this compares the offset after encoding to the length of the input byte array\n *\n * The `offset` parameter to `decode` and `read` is still considered, and will affect the new offset that is compared to the byte array length\n *\n * The error that is thrown by the returned decoder is a {@link SolanaError} with the code `SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY`\n *\n * @example\n * Create a decoder that decodes a `u32` (4 bytes) and ensures the entire byte array is consumed\n * ```ts\n * const decoder = createDecoderThatUsesExactByteArray(getU32Decoder());\n * decoder.decode(new Uint8Array([0, 0, 0, 0])); // 0\n * decoder.decode(new Uint8Array([0, 0, 0, 0, 0])); // throws\n *\n * // with an offset\n * decoder.decode(new Uint8Array([0, 0, 0, 0, 0]), 1); // 0\n * decoder.decode(new Uint8Array([0, 0, 0, 0, 0, 0]), 1); // throws\n * ```\n */\nexport function createDecoderThatConsumesEntireByteArray(decoder: Decoder): Decoder {\n return createDecoder({\n ...decoder,\n read(bytes, offset) {\n const [value, newOffset] = decoder.read(bytes, offset);\n if (bytes.length > newOffset) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_DECODER_TO_CONSUME_ENTIRE_BYTE_ARRAY, {\n expectedLength: newOffset,\n numExcessBytes: bytes.length - newOffset,\n });\n }\n return [value, newOffset];\n },\n });\n}\n","import { assertByteArrayHasEnoughBytesForCodec } from './assertions';\nimport { fixBytes } from './bytes';\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n Offset,\n} from './codec';\nimport { combineCodec } from './combine-codec';\n\n/**\n * Creates a fixed-size encoder from a given encoder.\n *\n * The resulting encoder ensures that encoded values always have the specified number of bytes.\n * If the original encoded value is larger than `fixedBytes`, it is truncated.\n * If it is smaller, it is padded with trailing zeroes.\n *\n * For more details, see {@link fixCodecSize}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param encoder - The encoder to wrap into a fixed-size encoder.\n * @param fixedBytes - The fixed number of bytes to write.\n * @returns A `FixedSizeEncoder` that ensures a consistent output size.\n *\n * @example\n * ```ts\n * const encoder = fixEncoderSize(getUtf8Encoder(), 4);\n * encoder.encode(\"Hello\"); // 0x48656c6c (truncated)\n * encoder.encode(\"Hi\"); // 0x48690000 (padded)\n * encoder.encode(\"Hiya\"); // 0x48697961 (same length)\n * ```\n *\n * @remarks\n * If you need a full codec with both encoding and decoding, use {@link fixCodecSize}.\n *\n * @see {@link fixCodecSize}\n * @see {@link fixDecoderSize}\n */\nexport function fixEncoderSize(\n encoder: Encoder,\n fixedBytes: TSize,\n): FixedSizeEncoder {\n return createEncoder({\n fixedSize: fixedBytes,\n write: (value: TFrom, bytes: Uint8Array, offset: Offset) => {\n // Here we exceptionally use the `encode` function instead of the `write`\n // function as using the nested `write` function on a fixed-sized byte\n // array may result in a out-of-bounds error on the nested encoder.\n const variableByteArray = encoder.encode(value);\n const fixedByteArray =\n variableByteArray.length > fixedBytes ? variableByteArray.slice(0, fixedBytes) : variableByteArray;\n bytes.set(fixedByteArray, offset);\n return offset + fixedBytes;\n },\n });\n}\n\n/**\n * Creates a fixed-size decoder from a given decoder.\n *\n * The resulting decoder always reads exactly `fixedBytes` bytes from the input.\n * If the nested decoder is also fixed-size, the bytes are truncated or padded as needed.\n *\n * For more details, see {@link fixCodecSize}.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param decoder - The decoder to wrap into a fixed-size decoder.\n * @param fixedBytes - The fixed number of bytes to read.\n * @returns A `FixedSizeDecoder` that ensures a consistent input size.\n *\n * @example\n * ```ts\n * const decoder = fixDecoderSize(getUtf8Decoder(), 4);\n * decoder.decode(new Uint8Array([72, 101, 108, 108, 111])); // \"Hell\" (truncated)\n * decoder.decode(new Uint8Array([72, 105, 0, 0])); // \"Hi\" (zeroes ignored)\n * decoder.decode(new Uint8Array([72, 105, 121, 97])); // \"Hiya\" (same length)\n * ```\n *\n * @remarks\n * If you need a full codec with both encoding and decoding, use {@link fixCodecSize}.\n *\n * @see {@link fixCodecSize}\n * @see {@link fixEncoderSize}\n */\nexport function fixDecoderSize(\n decoder: Decoder,\n fixedBytes: TSize,\n): FixedSizeDecoder {\n return createDecoder({\n fixedSize: fixedBytes,\n read: (bytes, offset) => {\n assertByteArrayHasEnoughBytesForCodec('fixCodecSize', fixedBytes, bytes, offset);\n // Slice the byte array to the fixed size if necessary.\n if (offset > 0 || bytes.length > fixedBytes) {\n bytes = bytes.slice(offset, offset + fixedBytes);\n }\n // If the nested decoder is fixed-size, pad and truncate the byte array accordingly.\n if (isFixedSize(decoder)) {\n bytes = fixBytes(bytes, decoder.fixedSize);\n }\n // Decode the value using the nested decoder.\n const [value] = decoder.read(bytes, 0);\n return [value, offset + fixedBytes];\n },\n });\n}\n\n/**\n * Creates a fixed-size codec from a given codec.\n *\n * The resulting codec ensures that both encoding and decoding operate on a fixed number of bytes.\n * When encoding:\n * - If the encoded value is larger than `fixedBytes`, it is truncated.\n * - If it is smaller, it is padded with trailing zeroes.\n * - If it is exactly `fixedBytes`, it remains unchanged.\n *\n * When decoding:\n * - Exactly `fixedBytes` bytes are read from the input.\n * - If the nested decoder has a smaller fixed size, bytes are truncated or padded as necessary.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param codec - The codec to wrap into a fixed-size codec.\n * @param fixedBytes - The fixed number of bytes to read/write.\n * @returns A `FixedSizeCodec` that ensures both encoding and decoding conform to a fixed size.\n *\n * @example\n * ```ts\n * const codec = fixCodecSize(getUtf8Codec(), 4);\n *\n * const bytes1 = codec.encode(\"Hello\"); // 0x48656c6c (truncated)\n * const value1 = codec.decode(bytes1); // \"Hell\"\n *\n * const bytes2 = codec.encode(\"Hi\"); // 0x48690000 (padded)\n * const value2 = codec.decode(bytes2); // \"Hi\"\n *\n * const bytes3 = codec.encode(\"Hiya\"); // 0x48697961 (same length)\n * const value3 = codec.decode(bytes3); // \"Hiya\"\n * ```\n *\n * @remarks\n * If you only need to enforce a fixed size for encoding, use {@link fixEncoderSize}.\n * If you only need to enforce a fixed size for decoding, use {@link fixDecoderSize}.\n *\n * ```ts\n * const bytes = fixEncoderSize(getUtf8Encoder(), 4).encode(\"Hiya\");\n * const value = fixDecoderSize(getUtf8Decoder(), 4).decode(bytes);\n * ```\n *\n * @see {@link fixEncoderSize}\n * @see {@link fixDecoderSize}\n */\nexport function fixCodecSize(\n codec: Codec,\n fixedBytes: TSize,\n): FixedSizeCodec {\n return combineCodec(fixEncoderSize(codec, fixedBytes), fixDecoderSize(codec, fixedBytes));\n}\n","import { assertByteArrayOffsetIsNotOutOfRange } from './assertions';\nimport { Codec, createDecoder, createEncoder, Decoder, Encoder, Offset } from './codec';\nimport { combineCodec } from './combine-codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyEncoder = Encoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDecoder = Decoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyCodec = Codec;\n\n/**\n * Configuration object for modifying the offset of an encoder, decoder, or codec.\n *\n * This type defines optional functions for adjusting the **pre-offset** (before encoding/decoding)\n * and the **post-offset** (after encoding/decoding). These functions allow precise control\n * over where data is written or read within a byte array.\n *\n * @property preOffset - A function that modifies the offset before encoding or decoding.\n * @property postOffset - A function that modifies the offset after encoding or decoding.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * };\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes.\n * ```ts\n * const config: OffsetConfig = {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * };\n * ```\n *\n * @example\n * Using both pre-offset and post-offset together.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * postOffset: ({ postOffset }) => postOffset + 4,\n * };\n * ```\n *\n * @see {@link offsetEncoder}\n * @see {@link offsetDecoder}\n * @see {@link offsetCodec}\n */\ntype OffsetConfig = {\n postOffset?: PostOffsetFunction;\n preOffset?: PreOffsetFunction;\n};\n\n/**\n * Scope provided to the `preOffset` and `postOffset` functions,\n * containing contextual information about the current encoding or decoding process.\n *\n * The pre-offset function modifies where encoding or decoding begins,\n * while the post-offset function modifies where the next operation continues.\n *\n * @property bytes - The entire byte array being encoded or decoded.\n * @property preOffset - The original offset before encoding or decoding starts.\n * @property wrapBytes - A helper function that wraps offsets around the byte array length.\n *\n * @example\n * Using `wrapBytes` to wrap a negative offset to the end of the byte array.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves to last 4 bytes\n * };\n * ```\n *\n * @example\n * Adjusting the offset dynamically based on the byte array size.\n * ```ts\n * const config: OffsetConfig = {\n * preOffset: ({ bytes }) => bytes.length > 10 ? 4 : 2,\n * };\n * ```\n *\n * @see {@link PreOffsetFunction}\n * @see {@link PostOffsetFunction}\n */\ntype PreOffsetFunctionScope = {\n /** The entire byte array. */\n bytes: ReadonlyUint8Array | Uint8Array;\n /** The original offset prior to encode or decode. */\n preOffset: Offset;\n /** Wraps the offset to the byte array length. */\n wrapBytes: (offset: Offset) => Offset;\n};\n\n/**\n * A function that modifies the pre-offset before encoding or decoding.\n *\n * This function is used to adjust the starting position before writing\n * or reading data in a byte array.\n *\n * @param scope - The current encoding or decoding context.\n * @returns The new offset at which encoding or decoding should start.\n *\n * @example\n * Skipping the first 2 bytes before writing or reading.\n * ```ts\n * const preOffset: PreOffsetFunction = ({ preOffset }) => preOffset + 2;\n * ```\n *\n * @example\n * Wrapping the offset to ensure it stays within bounds.\n * ```ts\n * const preOffset: PreOffsetFunction = ({ wrapBytes, preOffset }) => wrapBytes(preOffset + 10);\n * ```\n *\n * @see {@link OffsetConfig}\n * @see {@link PreOffsetFunctionScope}\n */\ntype PreOffsetFunction = (scope: PreOffsetFunctionScope) => Offset;\n\n/**\n * A function that modifies the post-offset after encoding or decoding.\n *\n * This function adjusts where the next encoder or decoder should start\n * after the current operation has completed.\n *\n * @param scope - The current encoding or decoding context, including the modified pre-offset\n * and the original post-offset.\n * @returns The new offset at which the next operation should begin.\n *\n * @example\n * Moving the post-offset forward by 4 bytes.\n * ```ts\n * const postOffset: PostOffsetFunction = ({ postOffset }) => postOffset + 4;\n * ```\n *\n * @example\n * Wrapping the post-offset within the byte array length.\n * ```ts\n * const postOffset: PostOffsetFunction = ({ wrapBytes, postOffset }) => wrapBytes(postOffset);\n * ```\n *\n * @example\n * Ensuring a minimum spacing of 8 bytes between values.\n * ```ts\n * const postOffset: PostOffsetFunction = ({ postOffset, newPreOffset }) =>\n * Math.max(postOffset, newPreOffset + 8);\n * ```\n *\n * @see {@link OffsetConfig}\n * @see {@link PreOffsetFunctionScope}\n */\ntype PostOffsetFunction = (\n scope: PreOffsetFunctionScope & {\n /** The modified offset used to encode or decode. */\n newPreOffset: Offset;\n /** The original offset returned by the encoder or decoder. */\n postOffset: Offset;\n },\n) => Offset;\n\n/**\n * Moves the offset of a given encoder before and/or after encoding.\n *\n * This function allows an encoder to write its encoded value at a different offset\n * than the one originally provided. It supports both pre-offset adjustments\n * (before encoding) and post-offset adjustments (after encoding).\n *\n * The pre-offset function determines where encoding should start, while the\n * post-offset function adjusts where the next encoder should continue writing.\n *\n * For more details, see {@link offsetCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @param encoder - The encoder to adjust.\n * @param config - An object specifying how the offset should be modified.\n * @returns A new encoder with adjusted offsets.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes.\n * ```ts\n * const encoder = offsetEncoder(getU32Encoder(), {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * encoder.write(42, bytes, 0); // Actually written at offset 2\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes.\n * ```ts\n * const encoder = offsetEncoder(getU32Encoder(), {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * const nextOffset = encoder.write(42, bytes, 0); // Next encoder starts at offset 6 instead of 4\n * ```\n *\n * @example\n * Using `wrapBytes` to ensure an offset wraps around the byte array length.\n * ```ts\n * const encoder = offsetEncoder(getU32Encoder(), {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves offset to last 4 bytes of the array\n * });\n * const bytes = new Uint8Array(10);\n * encoder.write(42, bytes, 0); // Writes at bytes.length - 4\n * ```\n *\n * @remarks\n * If you need both encoding and decoding offsets to be adjusted, use {@link offsetCodec}.\n *\n * @see {@link offsetCodec}\n * @see {@link offsetDecoder}\n */\nexport function offsetEncoder(encoder: TEncoder, config: OffsetConfig): TEncoder {\n return createEncoder({\n ...encoder,\n write: (value, bytes, preOffset) => {\n const wrapBytes = (offset: Offset) => modulo(offset, bytes.length);\n const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetEncoder', newPreOffset, bytes.length);\n const postOffset = encoder.write(value, bytes, newPreOffset);\n const newPostOffset = config.postOffset\n ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes })\n : postOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetEncoder', newPostOffset, bytes.length);\n return newPostOffset;\n },\n }) as TEncoder;\n}\n\n/**\n * Moves the offset of a given decoder before and/or after decoding.\n *\n * This function allows a decoder to read its input from a different offset\n * than the one originally provided. It supports both pre-offset adjustments\n * (before decoding) and post-offset adjustments (after decoding).\n *\n * The pre-offset function determines where decoding should start, while the\n * post-offset function adjusts where the next decoder should continue reading.\n *\n * For more details, see {@link offsetCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @param decoder - The decoder to adjust.\n * @param config - An object specifying how the offset should be modified.\n * @returns A new decoder with adjusted offsets.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes.\n * ```ts\n * const decoder = offsetDecoder(getU32Decoder(), {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * });\n * const bytes = new Uint8Array([0, 0, 42, 0]); // Value starts at offset 2\n * decoder.read(bytes, 0); // Actually reads from offset 2\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes.\n * ```ts\n * const decoder = offsetDecoder(getU32Decoder(), {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * });\n * const bytes = new Uint8Array([42, 0, 0, 0]);\n * const [value, nextOffset] = decoder.read(bytes, 0); // Next decoder starts at offset 6 instead of 4\n * ```\n *\n * @example\n * Using `wrapBytes` to read from the last 4 bytes of an array.\n * ```ts\n * const decoder = offsetDecoder(getU32Decoder(), {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves offset to last 4 bytes of the array\n * });\n * const bytes = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 42]); // Value stored at the last 4 bytes\n * decoder.read(bytes, 0); // Reads from bytes.length - 4\n * ```\n *\n * @remarks\n * If you need both encoding and decoding offsets to be adjusted, use {@link offsetCodec}.\n *\n * @see {@link offsetCodec}\n * @see {@link offsetEncoder}\n */\nexport function offsetDecoder(decoder: TDecoder, config: OffsetConfig): TDecoder {\n return createDecoder({\n ...decoder,\n read: (bytes, preOffset) => {\n const wrapBytes = (offset: Offset) => modulo(offset, bytes.length);\n const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetDecoder', newPreOffset, bytes.length);\n const [value, postOffset] = decoder.read(bytes, newPreOffset);\n const newPostOffset = config.postOffset\n ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes })\n : postOffset;\n assertByteArrayOffsetIsNotOutOfRange('offsetDecoder', newPostOffset, bytes.length);\n return [value, newPostOffset];\n },\n }) as TDecoder;\n}\n\n/**\n * Moves the offset of a given codec before and/or after encoding and decoding.\n *\n * This function allows a codec to encode and decode values at custom offsets\n * within a byte array. It modifies both the **pre-offset** (where encoding/decoding starts)\n * and the **post-offset** (where the next operation should continue).\n *\n * This is particularly useful when working with structured binary formats\n * that require skipping reserved bytes, inserting padding, or aligning fields at\n * specific locations.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @param codec - The codec to adjust.\n * @param config - An object specifying how the offset should be modified.\n * @returns A new codec with adjusted offsets.\n *\n * @example\n * Moving the pre-offset forward by 2 bytes when encoding and decoding.\n * ```ts\n * const codec = offsetCodec(getU32Codec(), {\n * preOffset: ({ preOffset }) => preOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * codec.write(42, bytes, 0); // Actually written at offset 2\n * codec.read(bytes, 0); // Actually read from offset 2\n * ```\n *\n * @example\n * Moving the post-offset forward by 2 bytes when encoding and decoding.\n * ```ts\n * const codec = offsetCodec(getU32Codec(), {\n * postOffset: ({ postOffset }) => postOffset + 2,\n * });\n * const bytes = new Uint8Array(10);\n * codec.write(42, bytes, 0);\n * // Next encoding starts at offset 6 instead of 4\n * codec.read(bytes, 0);\n * // Next decoding starts at offset 6 instead of 4\n * ```\n *\n * @example\n * Using `wrapBytes` to loop around negative offsets.\n * ```ts\n * const codec = offsetCodec(getU32Codec(), {\n * preOffset: ({ wrapBytes }) => wrapBytes(-4), // Moves offset to last 4 bytes\n * });\n * const bytes = new Uint8Array(10);\n * codec.write(42, bytes, 0); // Writes at bytes.length - 4\n * codec.read(bytes, 0); // Reads from bytes.length - 4\n * ```\n *\n * @remarks\n * If you only need to adjust offsets for encoding, use {@link offsetEncoder}.\n * If you only need to adjust offsets for decoding, use {@link offsetDecoder}.\n *\n * ```ts\n * const bytes = new Uint8Array(10);\n * offsetEncoder(getU32Encoder(), { preOffset: ({ preOffset }) => preOffset + 2 }).write(42, bytes, 0);\n * const [value] = offsetDecoder(getU32Decoder(), { preOffset: ({ preOffset }) => preOffset + 2 }).read(bytes, 0);\n * ```\n *\n * @see {@link offsetEncoder}\n * @see {@link offsetDecoder}\n */\nexport function offsetCodec(codec: TCodec, config: OffsetConfig): TCodec {\n return combineCodec(offsetEncoder(codec, config), offsetDecoder(codec, config)) as TCodec;\n}\n\n/** A modulo function that handles negative dividends and zero divisors. */\nfunction modulo(dividend: number, divisor: number) {\n if (divisor === 0) return 0;\n return ((dividend % divisor) + divisor) % divisor;\n}\n","import { SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, SolanaError } from '@solana/errors';\n\nimport {\n Codec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isFixedSize,\n} from './codec';\nimport { combineCodec } from './combine-codec';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyEncoder = Encoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDecoder = Decoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyCodec = Codec;\n\n/**\n * Updates the size of a given encoder.\n *\n * This function modifies the size of an encoder using a provided transformation function.\n * For fixed-size encoders, it updates the `fixedSize` property, and for variable-size\n * encoders, it adjusts the size calculation based on the encoded value.\n *\n * If the new size is negative, an error will be thrown.\n *\n * For more details, see {@link resizeCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The original fixed size of the encoded value.\n * @typeParam TNewSize - The new fixed size after resizing.\n *\n * @param encoder - The encoder whose size will be updated.\n * @param resize - A function that takes the current size and returns the new size.\n * @returns A new encoder with the updated size.\n *\n * @example\n * Increasing the size of a `u16` encoder by 2 bytes.\n * ```ts\n * const encoder = resizeEncoder(getU16Encoder(), size => size + 2);\n * encoder.encode(0xffff); // 0xffff0000 (two extra bytes added)\n * ```\n *\n * @example\n * Shrinking a `u32` encoder to only use 2 bytes.\n * ```ts\n * const encoder = resizeEncoder(getU32Encoder(), () => 2);\n * encoder.fixedSize; // 2\n * ```\n *\n * @see {@link resizeCodec}\n * @see {@link resizeDecoder}\n */\nexport function resizeEncoder(\n encoder: FixedSizeEncoder,\n resize: (size: TSize) => TNewSize,\n): FixedSizeEncoder;\nexport function resizeEncoder(\n encoder: TEncoder,\n resize: (size: number) => number,\n): TEncoder;\nexport function resizeEncoder(\n encoder: TEncoder,\n resize: (size: number) => number,\n): TEncoder {\n if (isFixedSize(encoder)) {\n const fixedSize = resize(encoder.fixedSize);\n if (fixedSize < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n bytesLength: fixedSize,\n codecDescription: 'resizeEncoder',\n });\n }\n return createEncoder({ ...encoder, fixedSize }) as TEncoder;\n }\n return createEncoder({\n ...encoder,\n getSizeFromValue: value => {\n const newSize = resize(encoder.getSizeFromValue(value));\n if (newSize < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n bytesLength: newSize,\n codecDescription: 'resizeEncoder',\n });\n }\n return newSize;\n },\n }) as TEncoder;\n}\n\n/**\n * Updates the size of a given decoder.\n *\n * This function modifies the size of a decoder using a provided transformation function.\n * For fixed-size decoders, it updates the `fixedSize` property to reflect the new size.\n * Variable-size decoders remain unchanged, as their size is determined dynamically.\n *\n * If the new size is negative, an error will be thrown.\n *\n * For more details, see {@link resizeCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The original fixed size of the decoded value.\n * @typeParam TNewSize - The new fixed size after resizing.\n *\n * @param decoder - The decoder whose size will be updated.\n * @param resize - A function that takes the current size and returns the new size.\n * @returns A new decoder with the updated size.\n *\n * @example\n * Expanding a `u16` decoder to read 4 bytes instead of 2.\n * ```ts\n * const decoder = resizeDecoder(getU16Decoder(), size => size + 2);\n * decoder.fixedSize; // 4\n * ```\n *\n * @example\n * Shrinking a `u32` decoder to only read 2 bytes.\n * ```ts\n * const decoder = resizeDecoder(getU32Decoder(), () => 2);\n * decoder.fixedSize; // 2\n * ```\n *\n * @see {@link resizeCodec}\n * @see {@link resizeEncoder}\n */\nexport function resizeDecoder(\n decoder: FixedSizeDecoder,\n resize: (size: TSize) => TNewSize,\n): FixedSizeDecoder;\nexport function resizeDecoder(\n decoder: TDecoder,\n resize: (size: number) => number,\n): TDecoder;\nexport function resizeDecoder(\n decoder: TDecoder,\n resize: (size: number) => number,\n): TDecoder {\n if (isFixedSize(decoder)) {\n const fixedSize = resize(decoder.fixedSize);\n if (fixedSize < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n bytesLength: fixedSize,\n codecDescription: 'resizeDecoder',\n });\n }\n return createDecoder({ ...decoder, fixedSize }) as TDecoder;\n }\n return decoder;\n}\n\n/**\n * Updates the size of a given codec.\n *\n * This function modifies the size of both the codec using a provided\n * transformation function. It is useful for adjusting the allocated byte size for\n * encoding and decoding without altering the underlying data structure.\n *\n * If the new size is negative, an error will be thrown.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The original fixed size of the encoded/decoded value (for fixed-size codecs).\n * @typeParam TNewSize - The new fixed size after resizing (for fixed-size codecs).\n *\n * @param codec - The codec whose size will be updated.\n * @param resize - A function that takes the current size and returns the new size.\n * @returns A new codec with the updated size.\n *\n * @example\n * Expanding a `u16` codec from 2 to 4 bytes.\n * ```ts\n * const codec = resizeCodec(getU16Codec(), size => size + 2);\n * const bytes = codec.encode(0xffff); // 0xffff0000 (two extra bytes added)\n * const value = codec.decode(bytes); // 0xffff (reads original two bytes)\n * ```\n *\n * @example\n * Shrinking a `u32` codec to only use 2 bytes.\n * ```ts\n * const codec = resizeCodec(getU32Codec(), () => 2);\n * codec.fixedSize; // 2\n * ```\n *\n * @remarks\n * If you only need to resize an encoder, use {@link resizeEncoder}.\n * If you only need to resize a decoder, use {@link resizeDecoder}.\n *\n * ```ts\n * const bytes = resizeEncoder(getU32Encoder(), (size) => size + 2).encode(0xffff);\n * const value = resizeDecoder(getU32Decoder(), (size) => size + 2).decode(bytes);\n * ```\n *\n * @see {@link resizeEncoder}\n * @see {@link resizeDecoder}\n */\nexport function resizeCodec(\n codec: FixedSizeCodec,\n resize: (size: TSize) => TNewSize,\n): FixedSizeCodec;\nexport function resizeCodec(codec: TCodec, resize: (size: number) => number): TCodec;\nexport function resizeCodec(codec: TCodec, resize: (size: number) => number): TCodec {\n return combineCodec(resizeEncoder(codec, resize), resizeDecoder(codec, resize)) as TCodec;\n}\n","import { Codec, Decoder, Encoder, Offset } from './codec';\nimport { combineCodec } from './combine-codec';\nimport { offsetDecoder, offsetEncoder } from './offset-codec';\nimport { resizeDecoder, resizeEncoder } from './resize-codec';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyEncoder = Encoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDecoder = Decoder;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyCodec = Codec;\n\n/**\n * Adds left padding to the given encoder, shifting the encoded value forward\n * by `offset` bytes whilst increasing the size of the encoder accordingly.\n *\n * For more details, see {@link padLeftCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @param encoder - The encoder to pad.\n * @param offset - The number of padding bytes to add before encoding.\n * @returns A new encoder with left padding applied.\n *\n * @example\n * ```ts\n * const encoder = padLeftEncoder(getU16Encoder(), 2);\n * const bytes = encoder.encode(0xffff); // 0x0000ffff (0xffff written at offset 2)\n * ```\n *\n * @see {@link padLeftCodec}\n * @see {@link padLeftDecoder}\n */\nexport function padLeftEncoder(encoder: TEncoder, offset: Offset): TEncoder {\n return offsetEncoder(\n resizeEncoder(encoder, size => size + offset),\n { preOffset: ({ preOffset }) => preOffset + offset },\n );\n}\n\n/**\n * Adds right padding to the given encoder, extending the encoded value by `offset`\n * bytes whilst increasing the size of the encoder accordingly.\n *\n * For more details, see {@link padRightCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n *\n * @param encoder - The encoder to pad.\n * @param offset - The number of padding bytes to add after encoding.\n * @returns A new encoder with right padding applied.\n *\n * @example\n * ```ts\n * const encoder = padRightEncoder(getU16Encoder(), 2);\n * const bytes = encoder.encode(0xffff); // 0xffff0000 (two extra bytes added at the end)\n * ```\n *\n * @see {@link padRightCodec}\n * @see {@link padRightDecoder}\n */\nexport function padRightEncoder(encoder: TEncoder, offset: Offset): TEncoder {\n return offsetEncoder(\n resizeEncoder(encoder, size => size + offset),\n { postOffset: ({ postOffset }) => postOffset + offset },\n );\n}\n\n/**\n * Adds left padding to the given decoder, shifting the decoding position forward\n * by `offset` bytes whilst increasing the size of the decoder accordingly.\n *\n * For more details, see {@link padLeftCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @param decoder - The decoder to pad.\n * @param offset - The number of padding bytes to skip before decoding.\n * @returns A new decoder with left padding applied.\n *\n * @example\n * ```ts\n * const decoder = padLeftDecoder(getU16Decoder(), 2);\n * const value = decoder.decode(new Uint8Array([0, 0, 0x12, 0x34])); // 0xffff (reads from offset 2)\n * ```\n *\n * @see {@link padLeftCodec}\n * @see {@link padLeftEncoder}\n */\nexport function padLeftDecoder(decoder: TDecoder, offset: Offset): TDecoder {\n return offsetDecoder(\n resizeDecoder(decoder, size => size + offset),\n { preOffset: ({ preOffset }) => preOffset + offset },\n );\n}\n\n/**\n * Adds right padding to the given decoder, extending the post-offset by `offset`\n * bytes whilst increasing the size of the decoder accordingly.\n *\n * For more details, see {@link padRightCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n *\n * @param decoder - The decoder to pad.\n * @param offset - The number of padding bytes to skip after decoding.\n * @returns A new decoder with right padding applied.\n *\n * @example\n * ```ts\n * const decoder = padRightDecoder(getU16Decoder(), 2);\n * const value = decoder.decode(new Uint8Array([0x12, 0x34, 0, 0])); // 0xffff (ignores trailing bytes)\n * ```\n *\n * @see {@link padRightCodec}\n * @see {@link padRightEncoder}\n */\nexport function padRightDecoder(decoder: TDecoder, offset: Offset): TDecoder {\n return offsetDecoder(\n resizeDecoder(decoder, size => size + offset),\n { postOffset: ({ postOffset }) => postOffset + offset },\n );\n}\n\n/**\n * Adds left padding to the given codec, shifting the encoding and decoding positions\n * forward by `offset` bytes whilst increasing the size of the codec accordingly.\n *\n * This ensures that values are read and written at a later position in the byte array,\n * while the padding bytes remain unused.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @param codec - The codec to pad.\n * @param offset - The number of padding bytes to add before encoding and decoding.\n * @returns A new codec with left padding applied.\n *\n * @example\n * ```ts\n * const codec = padLeftCodec(getU16Codec(), 2);\n * const bytes = codec.encode(0xffff); // 0x0000ffff (0xffff written at offset 2)\n * const value = codec.decode(bytes); // 0xffff (reads from offset 2)\n * ```\n *\n * @remarks\n * If you only need to apply padding for encoding, use {@link padLeftEncoder}.\n * If you only need to apply padding for decoding, use {@link padLeftDecoder}.\n *\n * ```ts\n * const bytes = padLeftEncoder(getU16Encoder(), 2).encode(0xffff);\n * const value = padLeftDecoder(getU16Decoder(), 2).decode(bytes);\n * ```\n *\n * @see {@link padLeftEncoder}\n * @see {@link padLeftDecoder}\n */\nexport function padLeftCodec(codec: TCodec, offset: Offset): TCodec {\n return combineCodec(padLeftEncoder(codec, offset), padLeftDecoder(codec, offset)) as TCodec;\n}\n\n/**\n * Adds right padding to the given codec, extending the encoded and decoded value\n * by `offset` bytes whilst increasing the size of the codec accordingly.\n *\n * The extra bytes remain unused, ensuring that the next operation starts further\n * along the byte array.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n *\n * @param codec - The codec to pad.\n * @param offset - The number of padding bytes to add after encoding and decoding.\n * @returns A new codec with right padding applied.\n *\n * @example\n * ```ts\n * const codec = padRightCodec(getU16Codec(), 2);\n * const bytes = codec.encode(0xffff); // 0xffff0000 (two extra bytes added)\n * const value = codec.decode(bytes); // 0xffff (ignores padding bytes)\n * ```\n *\n * @remarks\n * If you only need to apply padding for encoding, use {@link padRightEncoder}.\n * If you only need to apply padding for decoding, use {@link padRightDecoder}.\n *\n * ```ts\n * const bytes = padRightEncoder(getU16Encoder(), 2).encode(0xffff);\n * const value = padRightDecoder(getU16Decoder(), 2).decode(bytes);\n * ```\n *\n * @see {@link padRightEncoder}\n * @see {@link padRightDecoder}\n */\nexport function padRightCodec(codec: TCodec, offset: Offset): TCodec {\n return combineCodec(padRightEncoder(codec, offset), padRightDecoder(codec, offset)) as TCodec;\n}\n","import {\n assertIsFixedSize,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n} from './codec';\nimport { combineCodec } from './combine-codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\nfunction copySourceToTargetInReverse(\n source: ReadonlyUint8Array,\n target_WILL_MUTATE: Uint8Array,\n sourceOffset: number,\n sourceLength: number,\n targetOffset: number = 0,\n) {\n while (sourceOffset < --sourceLength) {\n const leftValue = source[sourceOffset];\n target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceLength];\n target_WILL_MUTATE[sourceLength + targetOffset] = leftValue;\n sourceOffset++;\n }\n if (sourceOffset === sourceLength) {\n target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceOffset];\n }\n}\n\n/**\n * Reverses the bytes of a fixed-size encoder.\n *\n * Given a `FixedSizeEncoder`, this function returns a new `FixedSizeEncoder` that\n * reverses the bytes within the fixed-size byte array when encoding.\n *\n * This can be useful to modify endianness or for other byte-order transformations.\n *\n * For more details, see {@link reverseCodec}.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TSize - The fixed size of the encoded value in bytes.\n *\n * @param encoder - The fixed-size encoder to reverse.\n * @returns A new encoder that writes bytes in reverse order.\n *\n * @example\n * Encoding a `u16` value in reverse order.\n * ```ts\n * const encoder = reverseEncoder(getU16Encoder({ endian: Endian.Big }));\n * const bytes = encoder.encode(0x1234); // 0x3412 (bytes are flipped)\n * ```\n *\n * @see {@link reverseCodec}\n * @see {@link reverseDecoder}\n */\nexport function reverseEncoder(\n encoder: FixedSizeEncoder,\n): FixedSizeEncoder {\n assertIsFixedSize(encoder);\n return createEncoder({\n ...encoder,\n write: (value: TFrom, bytes, offset) => {\n const newOffset = encoder.write(value, bytes, offset);\n copySourceToTargetInReverse(\n bytes /* source */,\n bytes /* target_WILL_MUTATE */,\n offset /* sourceOffset */,\n offset + encoder.fixedSize /* sourceLength */,\n );\n return newOffset;\n },\n });\n}\n\n/**\n * Reverses the bytes of a fixed-size decoder.\n *\n * Given a `FixedSizeDecoder`, this function returns a new `FixedSizeDecoder` that\n * reverses the bytes within the fixed-size byte array before decoding.\n *\n * This can be useful to modify endianness or for other byte-order transformations.\n *\n * For more details, see {@link reverseCodec}.\n *\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the decoded value in bytes.\n *\n * @param decoder - The fixed-size decoder to reverse.\n * @returns A new decoder that reads bytes in reverse order.\n *\n * @example\n * Decoding a reversed `u16` value.\n * ```ts\n * const decoder = reverseDecoder(getU16Decoder({ endian: Endian.Big }));\n * const value = decoder.decode(new Uint8Array([0x34, 0x12])); // 0x1234 (bytes are flipped back)\n * ```\n *\n * @see {@link reverseCodec}\n * @see {@link reverseEncoder}\n */\nexport function reverseDecoder(\n decoder: FixedSizeDecoder,\n): FixedSizeDecoder {\n assertIsFixedSize(decoder);\n return createDecoder({\n ...decoder,\n read: (bytes, offset) => {\n const reversedBytes = bytes.slice();\n copySourceToTargetInReverse(\n bytes /* source */,\n reversedBytes /* target_WILL_MUTATE */,\n offset /* sourceOffset */,\n offset + decoder.fixedSize /* sourceLength */,\n );\n return decoder.read(reversedBytes, offset);\n },\n });\n}\n\n/**\n * Reverses the bytes of a fixed-size codec.\n *\n * Given a `FixedSizeCodec`, this function returns a new `FixedSizeCodec` that\n * reverses the bytes within the fixed-size byte array during encoding and decoding.\n *\n * This can be useful to modify endianness or for other byte-order transformations.\n *\n * @typeParam TFrom - The type of the value to encode.\n * @typeParam TTo - The type of the decoded value.\n * @typeParam TSize - The fixed size of the encoded/decoded value in bytes.\n *\n * @param codec - The fixed-size codec to reverse.\n * @returns A new codec that encodes and decodes bytes in reverse order.\n *\n * @example\n * Reversing a `u16` codec.\n * ```ts\n * const codec = reverseCodec(getU16Codec({ endian: Endian.Big }));\n * const bytes = codec.encode(0x1234); // 0x3412 (bytes are flipped)\n * const value = codec.decode(bytes); // 0x1234 (bytes are flipped back)\n * ```\n *\n * @remarks\n * If you only need to reverse an encoder, use {@link reverseEncoder}.\n * If you only need to reverse a decoder, use {@link reverseDecoder}.\n *\n * ```ts\n * const bytes = reverseEncoder(getU16Encoder()).encode(0x1234);\n * const value = reverseDecoder(getU16Decoder()).decode(bytes);\n * ```\n *\n * @see {@link reverseEncoder}\n * @see {@link reverseDecoder}\n */\nexport function reverseCodec(\n codec: FixedSizeCodec,\n): FixedSizeCodec {\n return combineCodec(reverseEncoder(codec), reverseDecoder(codec));\n}\n","import {\n Codec,\n createCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n isVariableSize,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from './codec';\nimport { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Transforms an encoder by mapping its input values.\n *\n * This function takes an existing `Encoder` and returns an `Encoder`, allowing values of type `B`\n * to be converted into values of type `A` before encoding. The transformation is applied via the `unmap` function.\n *\n * This is useful for handling type conversions, applying default values, or structuring data before encoding.\n *\n * For more details, see {@link transformCodec}.\n *\n * @typeParam TOldFrom - The original type expected by the encoder.\n * @typeParam TNewFrom - The new type that will be transformed before encoding.\n *\n * @param encoder - The encoder to transform.\n * @param unmap - A function that converts values of `TNewFrom` into `TOldFrom` before encoding.\n * @returns A new encoder that accepts `TNewFrom` values and transforms them before encoding.\n *\n * @example\n * Encoding a string by counting its characters and storing the length as a `u32`.\n * ```ts\n * const encoder = transformEncoder(getU32Encoder(), (value: string) => value.length);\n * encoder.encode(\"hello\"); // 0x05000000 (stores length 5)\n * ```\n *\n * @see {@link transformCodec}\n * @see {@link transformDecoder}\n */\nexport function transformEncoder(\n encoder: FixedSizeEncoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): FixedSizeEncoder;\nexport function transformEncoder(\n encoder: VariableSizeEncoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): VariableSizeEncoder;\nexport function transformEncoder(\n encoder: Encoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): Encoder;\nexport function transformEncoder(\n encoder: Encoder,\n unmap: (value: TNewFrom) => TOldFrom,\n): Encoder {\n return createEncoder({\n ...(isVariableSize(encoder)\n ? { ...encoder, getSizeFromValue: (value: TNewFrom) => encoder.getSizeFromValue(unmap(value)) }\n : encoder),\n write: (value: TNewFrom, bytes, offset) => encoder.write(unmap(value), bytes, offset),\n });\n}\n\n/**\n * Transforms a decoder by mapping its output values.\n *\n * This function takes an existing `Decoder` and returns a `Decoder`, allowing values of type `A`\n * to be converted into values of type `B` after decoding. The transformation is applied via the `map` function.\n *\n * This is useful for post-processing, type conversions, or enriching decoded data.\n *\n * For more details, see {@link transformCodec}.\n *\n * @typeParam TOldTo - The original type returned by the decoder.\n * @typeParam TNewTo - The new type that will be transformed after decoding.\n *\n * @param decoder - The decoder to transform.\n * @param map - A function that converts values of `TOldTo` into `TNewTo` after decoding.\n * @returns A new decoder that decodes into `TNewTo`.\n *\n * @example\n * Decoding a stored `u32` length into a string of `'x'` characters.\n * ```ts\n * const decoder = transformDecoder(getU32Decoder(), (length) => 'x'.repeat(length));\n * decoder.decode(new Uint8Array([0x05, 0x00, 0x00, 0x00])); // \"xxxxx\"\n * ```\n *\n * @see {@link transformCodec}\n * @see {@link transformEncoder}\n */\nexport function transformDecoder(\n decoder: FixedSizeDecoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): FixedSizeDecoder;\nexport function transformDecoder(\n decoder: VariableSizeDecoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): VariableSizeDecoder;\nexport function transformDecoder(\n decoder: Decoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Decoder;\nexport function transformDecoder(\n decoder: Decoder,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Decoder {\n return createDecoder({\n ...decoder,\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const [value, newOffset] = decoder.read(bytes, offset);\n return [map(value, bytes, offset), newOffset];\n },\n });\n}\n\n/**\n * Transforms a codec by mapping its input and output values.\n *\n * This function takes an existing `Codec` and returns a `Codec`, allowing:\n * - Values of type `C` to be transformed into `A` before encoding.\n * - Values of type `B` to be transformed into `D` after decoding.\n *\n * This is useful for adapting codecs to work with different representations, handling default values, or\n * converting between primitive and structured types.\n *\n * @typeParam TOldFrom - The original type expected by the codec.\n * @typeParam TNewFrom - The new type that will be transformed before encoding.\n * @typeParam TOldTo - The original type returned by the codec.\n * @typeParam TNewTo - The new type that will be transformed after decoding.\n *\n * @param codec - The codec to transform.\n * @param unmap - A function that converts values of `TNewFrom` into `TOldFrom` before encoding.\n * @param map - A function that converts values of `TOldTo` into `TNewTo` after decoding (optional).\n * @returns A new codec that encodes `TNewFrom` and decodes into `TNewTo`.\n *\n * @example\n * Mapping a `u32` codec to encode string lengths and decode them into `'x'` characters.\n * ```ts\n * const codec = transformCodec(\n * getU32Codec(),\n * (value: string) => value.length, // Encode string length\n * (length) => 'x'.repeat(length) // Decode length into a string of 'x's\n * );\n *\n * const bytes = codec.encode(\"hello\"); // 0x05000000 (stores length 5)\n * const value = codec.decode(bytes); // \"xxxxx\"\n * ```\n *\n * @remarks\n * If only input transformation is needed, use {@link transformEncoder}.\n * If only output transformation is needed, use {@link transformDecoder}.\n *\n * ```ts\n * const bytes = transformEncoder(getU32Encoder(), (value: string) => value.length).encode(\"hello\");\n * const value = transformDecoder(getU32Decoder(), (length) => 'x'.repeat(length)).decode(bytes);\n * ```\n *\n * @see {@link transformEncoder}\n * @see {@link transformDecoder}\n */\nexport function transformCodec(\n codec: FixedSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n): FixedSizeCodec;\nexport function transformCodec(\n codec: VariableSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n): VariableSizeCodec;\nexport function transformCodec(\n codec: Codec,\n unmap: (value: TNewFrom) => TOldFrom,\n): Codec;\nexport function transformCodec<\n TOldFrom,\n TNewFrom,\n TOldTo extends TOldFrom,\n TNewTo extends TNewFrom,\n TSize extends number,\n>(\n codec: FixedSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): FixedSizeCodec;\nexport function transformCodec(\n codec: VariableSizeCodec,\n unmap: (value: TNewFrom) => TOldFrom,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): VariableSizeCodec;\nexport function transformCodec(\n codec: Codec,\n unmap: (value: TNewFrom) => TOldFrom,\n map: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Codec;\nexport function transformCodec(\n codec: Codec,\n unmap: (value: TNewFrom) => TOldFrom,\n map?: (value: TOldTo, bytes: ReadonlyUint8Array | Uint8Array, offset: number) => TNewTo,\n): Codec {\n return createCodec({\n ...transformEncoder(codec, unmap),\n read: map ? transformDecoder(codec, map).read : (codec.read as unknown as Decoder['read']),\n });\n}\n","import { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\n/**\n * Asserts that a given string contains only characters from the specified alphabet.\n *\n * This function validates whether a string consists exclusively of characters\n * from the provided `alphabet`. If the validation fails, it throws an error\n * indicating the invalid base string.\n *\n * @param alphabet - The allowed set of characters for the base encoding.\n * @param testValue - The string to validate against the given alphabet.\n * @param givenValue - The original string provided by the user (defaults to `testValue`).\n *\n * @throws {SolanaError} If `testValue` contains characters not present in `alphabet`.\n *\n * @example\n * Validating a base-8 encoded string.\n * ```ts\n * assertValidBaseString('01234567', '123047'); // Passes\n * assertValidBaseString('01234567', '128'); // Throws error\n * ```\n */\nexport function assertValidBaseString(alphabet: string, testValue: string, givenValue = testValue) {\n if (!testValue.match(new RegExp(`^[${alphabet}]*$`))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: alphabet.length,\n value: givenValue,\n });\n }\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidBaseString } from './assertions';\n\n/**\n * Returns an encoder for base-X encoded strings.\n *\n * This encoder serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process involves converting the input string to a numeric value in base-X, then\n * encoding that value into bytes while preserving leading zeroes.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeEncoder` for encoding base-X strings.\n *\n * @example\n * Encoding a base-X string using a custom alphabet.\n * ```ts\n * const encoder = getBaseXEncoder('0123456789abcdef');\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXEncoder = (alphabet: string): VariableSizeEncoder => {\n return createEncoder({\n getSizeFromValue: (value: string): number => {\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) return value.length;\n\n const base10Number = getBigIntFromBaseX(tailChars, alphabet);\n return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2);\n },\n write(value: string, bytes, offset) {\n // Check if the value is valid.\n assertValidBaseString(alphabet, value);\n if (value === '') return offset;\n\n // Handle leading zeroes.\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) {\n bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset);\n return offset + leadingZeroes.length;\n }\n\n // From baseX to base10.\n let base10Number = getBigIntFromBaseX(tailChars, alphabet);\n\n // From base10 to bytes.\n const tailBytes: number[] = [];\n while (base10Number > 0n) {\n tailBytes.unshift(Number(base10Number % 256n));\n base10Number /= 256n;\n }\n\n const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes];\n bytes.set(bytesToAdd, offset);\n return offset + bytesToAdd.length;\n },\n });\n};\n\n/**\n * Returns a decoder for base-X encoded strings.\n *\n * This decoder deserializes base-X encoded strings from a byte array using a custom alphabet.\n * The decoding process converts the byte array into a numeric value in base-10, then\n * maps that value back to characters in the specified base-X alphabet.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeDecoder` for decoding base-X strings.\n *\n * @example\n * Decoding a base-X string using a custom alphabet.\n * ```ts\n * const decoder = getBaseXDecoder('0123456789abcdef');\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXDecoder = (alphabet: string): VariableSizeDecoder => {\n return createDecoder({\n read(rawBytes, offset): [string, number] {\n const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);\n if (bytes.length === 0) return ['', 0];\n\n // Handle leading zeroes.\n let trailIndex = bytes.findIndex(n => n !== 0);\n trailIndex = trailIndex === -1 ? bytes.length : trailIndex;\n const leadingZeroes = alphabet[0].repeat(trailIndex);\n if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length];\n\n // From bytes to base10.\n const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);\n\n // From base10 to baseX.\n const tailChars = getBaseXFromBigInt(base10Number, alphabet);\n\n return [leadingZeroes + tailChars, rawBytes.length];\n },\n });\n};\n\n/**\n * Returns a codec for encoding and decoding base-X strings.\n *\n * This codec serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process converts the input string into a numeric value in base-X, which is then encoded as bytes.\n * The decoding process reverses this transformation to reconstruct the original string.\n *\n * This codec supports leading zeroes by treating the first character of the alphabet as the zero character.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeCodec` for encoding and decoding base-X strings.\n *\n * @example\n * Encoding and decoding a base-X string using a custom alphabet.\n * ```ts\n * const codec = getBaseXCodec('0123456789abcdef');\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-X codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBaseXCodec('0123456789abcdef'), 8);\n * ```\n *\n * If you need a size-prefixed base-X codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBaseXCodec('0123456789abcdef'), getU32Codec());\n * ```\n *\n * Separate {@link getBaseXEncoder} and {@link getBaseXDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBaseXEncoder('0123456789abcdef').encode('deadface');\n * const value = getBaseXDecoder('0123456789abcdef').decode(bytes);\n * ```\n *\n * @see {@link getBaseXEncoder}\n * @see {@link getBaseXDecoder}\n */\nexport const getBaseXCodec = (alphabet: string): VariableSizeCodec =>\n combineCodec(getBaseXEncoder(alphabet), getBaseXDecoder(alphabet));\n\nfunction partitionLeadingZeroes(\n value: string,\n zeroCharacter: string,\n): [leadingZeros: string, tailChars: string | undefined] {\n const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`));\n return [leadingZeros, tailChars];\n}\n\nfunction getBigIntFromBaseX(value: string, alphabet: string): bigint {\n const base = BigInt(alphabet.length);\n let sum = 0n;\n for (const char of value) {\n sum *= base;\n sum += BigInt(alphabet.indexOf(char));\n }\n return sum;\n}\n\nfunction getBaseXFromBigInt(value: bigint, alphabet: string): string {\n const base = BigInt(alphabet.length);\n const tailChars = [];\n while (value > 0n) {\n tailChars.unshift(alphabet[Number(value % base)]);\n value /= base;\n }\n return tailChars.join('');\n}\n","import { getBaseXCodec, getBaseXDecoder, getBaseXEncoder } from './baseX';\n\nconst alphabet = '0123456789';\n\n/**\n * Returns an encoder for base-10 strings.\n *\n * This encoder serializes strings using a base-10 encoding scheme.\n * The output consists of bytes representing the numerical values of the input string.\n *\n * For more details, see {@link getBase10Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-10 strings.\n *\n * @example\n * Encoding a base-10 string.\n * ```ts\n * const encoder = getBase10Encoder();\n * const bytes = encoder.encode('1024'); // 0x0400\n * ```\n *\n * @see {@link getBase10Codec}\n */\nexport const getBase10Encoder = () => getBaseXEncoder(alphabet);\n\n/**\n * Returns a decoder for base-10 strings.\n *\n * This decoder deserializes base-10 encoded strings from a byte array.\n *\n * For more details, see {@link getBase10Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-10 strings.\n *\n * @example\n * Decoding a base-10 string.\n * ```ts\n * const decoder = getBase10Decoder();\n * const value = decoder.decode(new Uint8Array([0x04, 0x00])); // \"1024\"\n * ```\n *\n * @see {@link getBase10Codec}\n */\nexport const getBase10Decoder = () => getBaseXDecoder(alphabet);\n\n/**\n * Returns a codec for encoding and decoding base-10 strings.\n *\n * This codec serializes strings using a base-10 encoding scheme.\n * The output consists of bytes representing the numerical values of the input string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-10 strings.\n *\n * @example\n * Encoding and decoding a base-10 string.\n * ```ts\n * const codec = getBase10Codec();\n * const bytes = codec.encode('1024'); // 0x0400\n * const value = codec.decode(bytes); // \"1024\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-10 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase10Codec(), 5);\n * ```\n *\n * If you need a size-prefixed base-10 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase10Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase10Encoder} and {@link getBase10Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase10Encoder().encode('1024');\n * const value = getBase10Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase10Encoder}\n * @see {@link getBase10Decoder}\n */\nexport const getBase10Codec = () => getBaseXCodec(alphabet);\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\nconst enum HexC {\n ZERO = 48, // 0\n NINE = 57, // 9\n A_UP = 65, // A\n F_UP = 70, // F\n A_LO = 97, // a\n F_LO = 102, // f\n}\n\nconst INVALID_STRING_ERROR_BASE_CONFIG = {\n alphabet: '0123456789abcdef',\n base: 16,\n} as const;\n\nfunction charCodeToBase16(char: number) {\n if (char >= HexC.ZERO && char <= HexC.NINE) return char - HexC.ZERO;\n if (char >= HexC.A_UP && char <= HexC.F_UP) return char - (HexC.A_UP - 10);\n if (char >= HexC.A_LO && char <= HexC.F_LO) return char - (HexC.A_LO - 10);\n}\n\n/**\n * Returns an encoder for base-16 (hexadecimal) strings.\n *\n * This encoder serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-16 strings.\n *\n * @example\n * Encoding a base-16 string.\n * ```ts\n * const encoder = getBase16Encoder();\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Encoder = (): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: string) => Math.ceil(value.length / 2),\n write(value: string, bytes, offset) {\n const len = value.length;\n const al = len / 2;\n if (len === 1) {\n const c = value.charCodeAt(0);\n const n = charCodeToBase16(c);\n if (n === undefined) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n bytes.set([n], offset);\n return 1 + offset;\n }\n const hexBytes = new Uint8Array(al);\n for (let i = 0, j = 0; i < al; i++) {\n const c1 = value.charCodeAt(j++);\n const c2 = value.charCodeAt(j++);\n\n const n1 = charCodeToBase16(c1);\n const n2 = charCodeToBase16(c2);\n if (n1 === undefined || (n2 === undefined && !Number.isNaN(c2))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n hexBytes[i] = !Number.isNaN(c2) ? (n1 << 4) | (n2 ?? 0) : n1;\n }\n\n bytes.set(hexBytes, offset);\n return hexBytes.length + offset;\n },\n });\n\n/**\n * Returns a decoder for base-16 (hexadecimal) strings.\n *\n * This decoder deserializes base-16 encoded strings from a byte array.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-16 strings.\n *\n * @example\n * Decoding a base-16 string.\n * ```ts\n * const decoder = getBase16Decoder();\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Decoder = (): VariableSizeDecoder =>\n createDecoder({\n read(bytes, offset) {\n const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n return [value, bytes.length];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding base-16 (hexadecimal) strings.\n *\n * This codec serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-16 strings.\n *\n * @example\n * Encoding and decoding a base-16 string.\n * ```ts\n * const codec = getBase16Codec();\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-16 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase16Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-16 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase16Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase16Encoder} and {@link getBase16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase16Encoder().encode('deadface');\n * const value = getBase16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase16Encoder}\n * @see {@link getBase16Decoder}\n */\nexport const getBase16Codec = (): VariableSizeCodec => combineCodec(getBase16Encoder(), getBase16Decoder());\n","import { getBaseXCodec, getBaseXDecoder, getBaseXEncoder } from './baseX';\n\nconst alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Returns an encoder for base-58 strings.\n *\n * This encoder serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-58 strings.\n *\n * @example\n * Encoding a base-58 string.\n * ```ts\n * const encoder = getBase58Encoder();\n * const bytes = encoder.encode('heLLo'); // 0x1b6a3070\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Encoder = () => getBaseXEncoder(alphabet);\n\n/**\n * Returns a decoder for base-58 strings.\n *\n * This decoder deserializes base-58 encoded strings from a byte array.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-58 strings.\n *\n * @example\n * Decoding a base-58 string.\n * ```ts\n * const decoder = getBase58Decoder();\n * const value = decoder.decode(new Uint8Array([0x1b, 0x6a, 0x30, 0x70])); // \"heLLo\"\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Decoder = () => getBaseXDecoder(alphabet);\n\n/**\n * Returns a codec for encoding and decoding base-58 strings.\n *\n * This codec serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-58 strings.\n *\n * @example\n * Encoding and decoding a base-58 string.\n * ```ts\n * const codec = getBase58Codec();\n * const bytes = codec.encode('heLLo'); // 0x1b6a3070\n * const value = codec.decode(bytes); // \"heLLo\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-58 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase58Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-58 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase58Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase58Encoder} and {@link getBase58Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase58Encoder().encode('heLLo');\n * const value = getBase58Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase58Encoder}\n * @see {@link getBase58Decoder}\n */\nexport const getBase58Codec = () => getBaseXCodec(alphabet);\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidBaseString } from './assertions';\n\n/**\n * Returns an encoder for base-X encoded strings using bit re-slicing.\n *\n * This encoder serializes strings by dividing the input into custom-sized bit chunks,\n * mapping them to an alphabet, and encoding the result into a byte array.\n * This approach is commonly used for encoding schemes where the alphabet's length is a power of 2,\n * such as base-16 or base-64.\n *\n * For more details, see {@link getBaseXResliceCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @param bits - The number of bits per encoded chunk, typically `log2(alphabet.length)`.\n * @returns A `VariableSizeEncoder` for encoding base-X strings using bit re-slicing.\n *\n * @example\n * Encoding a base-X string using bit re-slicing.\n * ```ts\n * const encoder = getBaseXResliceEncoder('elho', 2);\n * const bytes = encoder.encode('hellolol'); // 0x4aee\n * ```\n *\n * @see {@link getBaseXResliceCodec}\n */\nexport const getBaseXResliceEncoder = (alphabet: string, bits: number): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: string) => Math.floor((value.length * bits) / 8),\n write(value: string, bytes, offset) {\n assertValidBaseString(alphabet, value);\n if (value === '') return offset;\n const charIndices = [...value].map(c => alphabet.indexOf(c));\n const reslicedBytes = reslice(charIndices, bits, 8, false);\n bytes.set(reslicedBytes, offset);\n return reslicedBytes.length + offset;\n },\n });\n\n/**\n * Returns a decoder for base-X encoded strings using bit re-slicing.\n *\n * This decoder deserializes base-X encoded strings by re-slicing the bits of a byte array into\n * custom-sized chunks and mapping them to a specified alphabet.\n * This is typically used for encoding schemes where the alphabet's length is a power of 2,\n * such as base-16 or base-64.\n *\n * For more details, see {@link getBaseXResliceCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @param bits - The number of bits per encoded chunk, typically `log2(alphabet.length)`.\n * @returns A `VariableSizeDecoder` for decoding base-X strings using bit re-slicing.\n *\n * @example\n * Decoding a base-X string using bit re-slicing.\n * ```ts\n * const decoder = getBaseXResliceDecoder('elho', 2);\n * const value = decoder.decode(new Uint8Array([0x4a, 0xee])); // \"hellolol\"\n * ```\n *\n * @see {@link getBaseXResliceCodec}\n */\nexport const getBaseXResliceDecoder = (alphabet: string, bits: number): VariableSizeDecoder =>\n createDecoder({\n read(rawBytes, offset = 0): [string, number] {\n const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);\n if (bytes.length === 0) return ['', rawBytes.length];\n const charIndices = reslice([...bytes], 8, bits, true);\n return [charIndices.map(i => alphabet[i]).join(''), rawBytes.length];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding base-X strings using bit re-slicing.\n *\n * This codec serializes strings by dividing the input into custom-sized bit chunks,\n * mapping them to a given alphabet, and encoding the result into bytes.\n * It is particularly suited for encoding schemes where the alphabet's length is a power of 2,\n * such as base-16 or base-64.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @param bits - The number of bits per encoded chunk, typically `log2(alphabet.length)`.\n * @returns A `VariableSizeCodec` for encoding and decoding base-X strings using bit re-slicing.\n *\n * @example\n * Encoding and decoding a base-X string using bit re-slicing.\n * ```ts\n * const codec = getBaseXResliceCodec('elho', 2);\n * const bytes = codec.encode('hellolol'); // 0x4aee\n * const value = codec.decode(bytes); // \"hellolol\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-X codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBaseXResliceCodec('elho', 2), 8);\n * ```\n *\n * If you need a size-prefixed base-X codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBaseXResliceCodec('elho', 2), getU32Codec());\n * ```\n *\n * Separate {@link getBaseXResliceEncoder} and {@link getBaseXResliceDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBaseXResliceEncoder('elho', 2).encode('hellolol');\n * const value = getBaseXResliceDecoder('elho', 2).decode(bytes);\n * ```\n *\n * @see {@link getBaseXResliceEncoder}\n * @see {@link getBaseXResliceDecoder}\n */\nexport const getBaseXResliceCodec = (alphabet: string, bits: number): VariableSizeCodec =>\n combineCodec(getBaseXResliceEncoder(alphabet, bits), getBaseXResliceDecoder(alphabet, bits));\n\n/** Helper function to reslice the bits inside bytes. */\nfunction reslice(input: number[], inputBits: number, outputBits: number, useRemainder: boolean): number[] {\n const output = [];\n let accumulator = 0;\n let bitsInAccumulator = 0;\n const mask = (1 << outputBits) - 1;\n for (const value of input) {\n accumulator = (accumulator << inputBits) | value;\n bitsInAccumulator += inputBits;\n while (bitsInAccumulator >= outputBits) {\n bitsInAccumulator -= outputBits;\n output.push((accumulator >> bitsInAccumulator) & mask);\n }\n }\n if (useRemainder && bitsInAccumulator > 0) {\n output.push((accumulator << (outputBits - bitsInAccumulator)) & mask);\n }\n return output;\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n toArrayBuffer,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\nimport { assertValidBaseString } from './assertions';\nimport { getBaseXResliceDecoder, getBaseXResliceEncoder } from './baseX-reslice';\n\nconst alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n/**\n * Returns an encoder for base-64 strings.\n *\n * This encoder serializes strings using a base-64 encoding scheme,\n * commonly used for data encoding in URLs, cryptographic keys, and binary-to-text encoding.\n *\n * For more details, see {@link getBase64Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-64 strings.\n *\n * @example\n * Encoding a base-64 string.\n * ```ts\n * const encoder = getBase64Encoder();\n * const bytes = encoder.encode('hello+world'); // 0x85e965a3ec28ae57\n * ```\n *\n * @see {@link getBase64Codec}\n */\nexport const getBase64Encoder = (): VariableSizeEncoder => {\n if (__BROWSER__) {\n return createEncoder({\n getSizeFromValue: (value: string) => {\n try {\n return (atob as Window['atob'])(value).length;\n } catch {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: 64,\n value,\n });\n }\n },\n write(value: string, bytes, offset) {\n try {\n const bytesToAdd = (atob as Window['atob'])(value)\n .split('')\n .map(c => c.charCodeAt(0));\n bytes.set(bytesToAdd, offset);\n return bytesToAdd.length + offset;\n } catch {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: 64,\n value,\n });\n }\n },\n });\n }\n\n if (__NODEJS__) {\n return createEncoder({\n getSizeFromValue: (value: string) => Buffer.from(value, 'base64').length,\n write(value: string, bytes, offset) {\n assertValidBaseString(alphabet, value.replace(/=/g, ''));\n const buffer = Buffer.from(value, 'base64');\n bytes.set(buffer, offset);\n return buffer.length + offset;\n },\n });\n }\n\n return transformEncoder(getBaseXResliceEncoder(alphabet, 6), (value: string): string => value.replace(/=/g, ''));\n};\n\n/**\n * Returns a decoder for base-64 strings.\n *\n * This decoder deserializes base-64 encoded strings from a byte array.\n *\n * For more details, see {@link getBase64Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-64 strings.\n *\n * @example\n * Decoding a base-64 string.\n * ```ts\n * const decoder = getBase64Decoder();\n * const value = decoder.decode(new Uint8Array([0x85, 0xe9, 0x65, 0xa3, 0xec, 0x28, 0xae, 0x57])); // \"hello+world\"\n * ```\n *\n * @see {@link getBase64Codec}\n */\nexport const getBase64Decoder = (): VariableSizeDecoder => {\n if (__BROWSER__) {\n return createDecoder({\n read(bytes, offset = 0) {\n const slice = bytes.slice(offset);\n const value = (btoa as Window['btoa'])(String.fromCharCode(...slice));\n return [value, bytes.length];\n },\n });\n }\n\n if (__NODEJS__) {\n return createDecoder({\n read: (bytes, offset = 0) => [Buffer.from(toArrayBuffer(bytes), offset).toString('base64'), bytes.length],\n });\n }\n\n return transformDecoder(getBaseXResliceDecoder(alphabet, 6), (value: string): string =>\n value.padEnd(Math.ceil(value.length / 4) * 4, '='),\n );\n};\n\n/**\n * Returns a codec for encoding and decoding base-64 strings.\n *\n * This codec serializes strings using a base-64 encoding scheme,\n * commonly used for data encoding in URLs, cryptographic keys, and binary-to-text encoding.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-64 strings.\n *\n * @example\n * Encoding and decoding a base-64 string.\n * ```ts\n * const codec = getBase64Codec();\n * const bytes = codec.encode('hello+world'); // 0x85e965a3ec28ae57\n * const value = codec.decode(bytes); // \"hello+world\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-64 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase64Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-64 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase64Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase64Encoder} and {@link getBase64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase64Encoder().encode('hello+world');\n * const value = getBase64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase64Encoder}\n * @see {@link getBase64Decoder}\n */\nexport const getBase64Codec = (): VariableSizeCodec => combineCodec(getBase64Encoder(), getBase64Decoder());\n","/**\n * Removes all null characters (`\\u0000`) from a string.\n *\n * This function cleans a string by stripping out any null characters,\n * which are often used as padding in fixed-size string encodings.\n *\n * @param value - The string to process.\n * @returns The input string with all null characters removed.\n *\n * @example\n * Removing null characters from a string.\n * ```ts\n * removeNullCharacters('hello\\u0000\\u0000'); // \"hello\"\n * ```\n */\nexport const removeNullCharacters = (value: string) =>\n // eslint-disable-next-line no-control-regex\n value.replace(/\\u0000/g, '');\n\n/**\n * Pads a string with null characters (`\\u0000`) at the end to reach a fixed length.\n *\n * If the input string is shorter than the specified length, it is padded with null characters\n * until it reaches the desired size. If it is already long enough, it remains unchanged.\n *\n * @param value - The string to pad.\n * @param chars - The total length of the resulting string, including padding.\n * @returns The input string padded with null characters up to the specified length.\n *\n * @example\n * Padding a string with null characters.\n * ```ts\n * padNullCharacters('hello', 8); // \"hello\\u0000\\u0000\\u0000\"\n * ```\n */\nexport const padNullCharacters = (value: string, chars: number) => value.padEnd(chars, '\\u0000');\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { TextDecoder, TextEncoder } from '@solana/text-encoding-impl';\n\nimport { removeNullCharacters } from './null-characters';\n\n/**\n * Returns an encoder for UTF-8 strings.\n *\n * This encoder serializes strings using UTF-8 encoding.\n * The encoded output contains as many bytes as needed to represent the string.\n *\n * For more details, see {@link getUtf8Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding UTF-8 strings.\n *\n * @example\n * Encoding a UTF-8 string.\n * ```ts\n * const encoder = getUtf8Encoder();\n * const bytes = encoder.encode('hello'); // 0x68656c6c6f\n * ```\n *\n * @see {@link getUtf8Codec}\n */\nexport const getUtf8Encoder = (): VariableSizeEncoder => {\n let textEncoder: TextEncoder;\n return createEncoder({\n getSizeFromValue: value => (textEncoder ||= new TextEncoder()).encode(value).length,\n write: (value: string, bytes, offset) => {\n const bytesToAdd = (textEncoder ||= new TextEncoder()).encode(value);\n bytes.set(bytesToAdd, offset);\n return offset + bytesToAdd.length;\n },\n });\n};\n\n/**\n * Returns a decoder for UTF-8 strings.\n *\n * This decoder deserializes UTF-8 encoded strings from a byte array.\n * It reads all available bytes starting from the given offset.\n *\n * For more details, see {@link getUtf8Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding UTF-8 strings.\n *\n * @example\n * Decoding a UTF-8 string.\n * ```ts\n * const decoder = getUtf8Decoder();\n * const value = decoder.decode(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f])); // \"hello\"\n * ```\n *\n * @see {@link getUtf8Codec}\n */\nexport const getUtf8Decoder = (): VariableSizeDecoder => {\n let textDecoder: TextDecoder;\n return createDecoder({\n read(bytes, offset) {\n const value = (textDecoder ||= new TextDecoder()).decode(bytes.slice(offset));\n return [removeNullCharacters(value), bytes.length];\n },\n });\n};\n\n/**\n * Returns a codec for encoding and decoding UTF-8 strings.\n *\n * This codec serializes strings using UTF-8 encoding.\n * The encoded output contains as many bytes as needed to represent the string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding UTF-8 strings.\n *\n * @example\n * Encoding and decoding a UTF-8 string.\n * ```ts\n * const codec = getUtf8Codec();\n * const bytes = codec.encode('hello'); // 0x68656c6c6f\n * const value = codec.decode(bytes); // \"hello\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size UTF-8 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getUtf8Codec(), 5);\n * ```\n *\n * If you need a size-prefixed UTF-8 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getUtf8Encoder} and {@link getUtf8Decoder} functions are available.\n *\n * ```ts\n * const bytes = getUtf8Encoder().encode('hello');\n * const value = getUtf8Decoder().decode(bytes);\n * ```\n *\n * @see {@link getUtf8Encoder}\n * @see {@link getUtf8Decoder}\n */\nexport const getUtf8Codec = (): VariableSizeCodec => combineCodec(getUtf8Encoder(), getUtf8Decoder());\n","import type { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport type { Lamports } from '@solana/rpc-types';\n\n/**\n * The number of bytes required to store the {@link BaseAccount} information without its data.\n *\n * @example\n * ```ts\n * const myTotalAccountSize = myAccountDataSize + BASE_ACCOUNT_SIZE;\n * ```\n */\nexport const BASE_ACCOUNT_SIZE = 128;\n\n/**\n * Defines the attributes common to all Solana accounts. Namely, it contains everything stored\n * on-chain except the account data itself.\n *\n * @interface\n *\n * @example\n * ```ts\n * const BaseAccount: BaseAccount = {\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * };\n * ```\n */\nexport type BaseAccount = {\n readonly executable: boolean;\n readonly lamports: Lamports;\n readonly programAddress: Address;\n readonly space: bigint;\n};\n\n/**\n * Contains all the information relevant to a Solana account. It includes the account's address and\n * data, as well as the properties of {@link BaseAccount}.\n *\n * @interface\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * // Encoded\n * const myEncodedAccount: Account = {\n * address: address('1234..5678'),\n * data: new Uint8Array([1, 2, 3]),\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * };\n *\n * // Decoded\n * type MyAccountData = { name: string; age: number };\n * const myDecodedAccount: Account = {\n * address: address('1234..5678'),\n * data: { name: 'Alice', age: 30 },\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * };\n * ```\n */\nexport type Account = BaseAccount & {\n readonly address: Address;\n readonly data: TData;\n};\n\n/**\n * Represents an encoded account and is equivalent to an {@link Account} with `Uint8Array` account\n * data.\n *\n * @interface\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * {\n * address: address('1234..5678'),\n * data: new Uint8Array([1, 2, 3]),\n * executable: false,\n * lamports: lamports(1_000_000_000n),\n * programAddress: address('1111..1111'),\n * space: 42n,\n * } satisfies EncodedAccount<'1234..5678'>;\n * ```\n */\nexport type EncodedAccount = Account;\n","import type { Decoder, ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED,\n SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT,\n SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT,\n SolanaError,\n} from '@solana/errors';\n\nimport type { Account, EncodedAccount } from './account';\nimport type { MaybeAccount, MaybeEncodedAccount } from './maybe-account';\n\n/**\n * Transforms an {@link EncodedAccount} into an {@link Account} (or a {@link MaybeEncodedAccount}\n * into a {@link MaybeAccount}) by decoding the account data using the provided {@link Decoder}\n * instance.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The type of this account's data.\n *\n * @example\n * ```ts\n * type MyAccountData = { name: string; age: number };\n *\n * const myAccount: EncodedAccount<'1234..5678'>;\n * const myDecoder: Decoder = getStructDecoder([\n * ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n * ['age', getU32Decoder()],\n * ]);\n *\n * const myDecodedAccount = decodeAccount(myAccount, myDecoder);\n * myDecodedAccount satisfies Account;\n * ```\n */\nexport function decodeAccount(\n encodedAccount: EncodedAccount,\n decoder: Decoder,\n): Account;\nexport function decodeAccount(\n encodedAccount: MaybeEncodedAccount,\n decoder: Decoder,\n): MaybeAccount;\nexport function decodeAccount(\n encodedAccount: EncodedAccount | MaybeEncodedAccount,\n decoder: Decoder,\n): Account | MaybeAccount {\n try {\n if ('exists' in encodedAccount && !encodedAccount.exists) {\n return encodedAccount;\n }\n return Object.freeze({ ...encodedAccount, data: decoder.decode(encodedAccount.data) });\n } catch {\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT, {\n address: encodedAccount.address,\n });\n }\n}\n\nfunction accountExists(account: Account | MaybeAccount): account is Account {\n return !('exists' in account) || ('exists' in account && account.exists);\n}\n\n/**\n * Asserts that an account stores decoded data, ie. not a `Uint8Array`.\n *\n * Note that it does not check the shape of the data matches the decoded type, only that it is not a\n * `Uint8Array`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The type of this account's data.\n *\n * @example\n * ```ts\n * type MyAccountData = { name: string; age: number };\n *\n * const myAccount: Account;\n * assertAccountDecoded(myAccount);\n *\n * // now the account data can be used as MyAccountData\n * account.data satisfies MyAccountData;\n * ```\n *\n * This is particularly useful for narrowing the result of fetching a JSON parsed account.\n *\n * ```ts\n * const account: MaybeAccount = await fetchJsonParsedAccount(\n * rpc,\n * '1234..5678' as Address,\n * );\n *\n * assertAccountDecoded(account);\n * // now we have a MaybeAccount\n * account satisfies MaybeAccount;\n * ```\n */\nexport function assertAccountDecoded(\n account: Account,\n): asserts account is Account;\nexport function assertAccountDecoded(\n account: MaybeAccount,\n): asserts account is MaybeAccount;\nexport function assertAccountDecoded(\n account: Account | MaybeAccount,\n): asserts account is Account | MaybeAccount {\n if (accountExists(account) && account.data instanceof Uint8Array) {\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT, {\n address: account.address,\n });\n }\n}\n\n/**\n * Asserts that all input accounts store decoded data, ie. not a `Uint8Array`.\n *\n * As with {@link assertAccountDecoded} it does not check the shape of the data matches the decoded\n * type, only that it is not a `Uint8Array`.\n *\n * @example\n * ```ts\n * type MyAccountData = { name: string; age: number };\n *\n * const myAccounts: Account[];\n * assertAccountsDecoded(myAccounts);\n *\n * // now the account data can be used as MyAccountData\n * for (const a of account) {\n * account.data satisfies MyAccountData;\n * }\n * ```\n */\nexport function assertAccountsDecoded(\n accounts: Account[],\n): asserts accounts is Account[];\nexport function assertAccountsDecoded(\n accounts: MaybeAccount[],\n): asserts accounts is MaybeAccount[];\nexport function assertAccountsDecoded(\n accounts: (Account | MaybeAccount)[],\n): asserts accounts is (Account | MaybeAccount)[] {\n const encoded = accounts.filter(a => accountExists(a) && a.data instanceof Uint8Array);\n if (encoded.length > 0) {\n const encodedAddresses = encoded.map(a => a.address);\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED, {\n addresses: encodedAddresses,\n });\n }\n}\n","import type { Address } from '@solana/addresses';\nimport { getBase58Encoder, getBase64Encoder } from '@solana/codecs-strings';\nimport type {\n AccountInfoBase,\n AccountInfoWithBase58Bytes,\n AccountInfoWithBase58EncodedData,\n AccountInfoWithBase64EncodedData,\n} from '@solana/rpc-types';\n\nimport type { Account, BaseAccount, EncodedAccount } from './account';\nimport type { MaybeAccount, MaybeEncodedAccount } from './maybe-account';\nimport type { JsonParsedDataResponse } from './rpc-api';\n\ntype Base64EncodedRpcAccount = AccountInfoBase & AccountInfoWithBase64EncodedData;\n\n/**\n * Parses a base64-encoded account provided by the RPC client into an {@link EncodedAccount} type or\n * a {@link MaybeEncodedAccount} type if the raw data can be set to `null`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * const myAddress = address('1234..5678');\n * const myRpcAccount = await rpc.getAccountInfo(myAddress, { encoding: 'base64' }).send();\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = parseBase64RpcAccount(myRpcAccount);\n * ```\n */\nexport function parseBase64RpcAccount(\n address: Address,\n rpcAccount: Base64EncodedRpcAccount,\n): EncodedAccount;\nexport function parseBase64RpcAccount(\n address: Address,\n rpcAccount: Base64EncodedRpcAccount | null,\n): MaybeEncodedAccount;\nexport function parseBase64RpcAccount(\n address: Address,\n rpcAccount: Base64EncodedRpcAccount | null,\n): EncodedAccount | MaybeEncodedAccount {\n if (!rpcAccount) return Object.freeze({ address, exists: false });\n const data = getBase64Encoder().encode(rpcAccount.data[0]);\n return Object.freeze({ ...parseBaseAccount(rpcAccount), address, data, exists: true });\n}\n\ntype Base58EncodedRpcAccount = AccountInfoBase & (AccountInfoWithBase58Bytes | AccountInfoWithBase58EncodedData);\n\n/**\n * Parses a base58-encoded account provided by the RPC client into an {@link EncodedAccount} type or\n * a {@link MaybeEncodedAccount} type if the raw data can be set to `null`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * const myAddress = address('1234..5678');\n * const myRpcAccount = await rpc.getAccountInfo(myAddress, { encoding: 'base58' }).send();\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = parseBase58RpcAccount(myRpcAccount);\n * ```\n */\nexport function parseBase58RpcAccount(\n address: Address,\n rpcAccount: Base58EncodedRpcAccount,\n): EncodedAccount;\nexport function parseBase58RpcAccount(\n address: Address,\n rpcAccount: Base58EncodedRpcAccount | null,\n): MaybeEncodedAccount;\nexport function parseBase58RpcAccount(\n address: Address,\n rpcAccount: Base58EncodedRpcAccount | null,\n): EncodedAccount | MaybeEncodedAccount {\n if (!rpcAccount) return Object.freeze({ address, exists: false });\n const data = getBase58Encoder().encode(typeof rpcAccount.data === 'string' ? rpcAccount.data : rpcAccount.data[0]);\n return Object.freeze({ ...parseBaseAccount(rpcAccount), address, data, exists: true });\n}\n\ntype JsonParsedRpcAccount = AccountInfoBase & { readonly data: JsonParsedDataResponse };\ntype ParsedAccountMeta = { program: string; type?: string };\ntype JsonParsedAccountData = TData & { parsedAccountMeta?: ParsedAccountMeta };\n\n/**\n * Parses an arbitrary `jsonParsed` account provided by the RPC client into an {@link Account} type\n * or a {@link MaybeAccount} type if the raw data can be set to `null`.\n *\n * The expected data type should be explicitly provided as the first type parameter.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The expected type of this account's data.\n *\n * @example\n * ```ts\n * const myAccount: Account = parseJsonRpcAccount(myJsonRpcAccount);\n * ```\n */\nexport function parseJsonRpcAccount(\n address: Address,\n rpcAccount: JsonParsedRpcAccount,\n): Account, TAddress>;\nexport function parseJsonRpcAccount(\n address: Address,\n rpcAccount: JsonParsedRpcAccount | null,\n): MaybeAccount, TAddress>;\nexport function parseJsonRpcAccount(\n address: Address,\n rpcAccount: JsonParsedRpcAccount | null,\n): Account, TAddress> | MaybeAccount, TAddress> {\n if (!rpcAccount) return Object.freeze({ address, exists: false });\n const data = (rpcAccount.data.parsed.info || {}) as TData;\n\n if (rpcAccount.data.program || rpcAccount.data.parsed.type) {\n (data as JsonParsedAccountData).parsedAccountMeta = {\n program: rpcAccount.data.program,\n type: rpcAccount.data.parsed.type,\n };\n }\n\n return Object.freeze({ ...parseBaseAccount(rpcAccount), address, data, exists: true });\n}\n\nfunction parseBaseAccount(rpcAccount: AccountInfoBase): BaseAccount {\n return Object.freeze({\n executable: rpcAccount.executable,\n lamports: rpcAccount.lamports,\n programAddress: rpcAccount.owner,\n space: rpcAccount.space,\n });\n}\n","import type { Address } from '@solana/addresses';\nimport type { Rpc } from '@solana/rpc-spec';\nimport type { Commitment, Slot } from '@solana/rpc-types';\n\nimport type { MaybeAccount, MaybeEncodedAccount } from './maybe-account';\nimport { parseBase64RpcAccount, parseJsonRpcAccount } from './parse-account';\nimport type { GetAccountInfoApi, GetMultipleAccountsApi } from './rpc-api';\n\n/**\n * Optional configuration for fetching a singular account.\n *\n * @interface\n */\nexport type FetchAccountConfig = {\n abortSignal?: AbortSignal;\n /**\n * Fetch the details of the account as of the highest slot that has reached this level of\n * commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /**\n * Prevents accessing stale data by enforcing that the RPC node has processed transactions up to\n * this slot\n */\n minContextSlot?: Slot;\n};\n\n/**\n * Fetches a {@link MaybeEncodedAccount} from the provided RPC client and address.\n *\n * It uses the {@link GetAccountInfoApi.getAccountInfo | getAccountInfo} RPC method under the hood\n * with base64 encoding and an additional configuration object can be provided to customize the\n * behavior of the RPC call.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * const myAddress = address('1234..5678');\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = await fetchEncodedAccount(rpc, myAddress);\n *\n * // With custom configuration.\n * const myAccount: MaybeEncodedAccount<'1234..5678'> = await fetchEncodedAccount(rpc, myAddress, {\n * abortSignal: myAbortController.signal,\n * commitment: 'confirmed',\n * });\n * ```\n */\nexport async function fetchEncodedAccount(\n rpc: Rpc,\n address: Address,\n config: FetchAccountConfig = {},\n): Promise> {\n const { abortSignal, ...rpcConfig } = config;\n const response = await rpc.getAccountInfo(address, { ...rpcConfig, encoding: 'base64' }).send({ abortSignal });\n return parseBase64RpcAccount(address, response.value);\n}\n\n/**\n * Fetches a {@link MaybeAccount} from the provided RPC client and address by using\n * {@link GetAccountInfoApi.getAccountInfo | getAccountInfo} under the hood with the `jsonParsed`\n * encoding.\n *\n * It may also return a {@link MaybeEncodedAccount} if the RPC client does not know how to parse the\n * account at the requested address. In any case, the expected data type should be explicitly\n * provided as the first type parameter.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The expected type of this account's data.\n *\n * @example\n * ```ts\n * type TokenData = { mint: Address; owner: Address };\n * const myAccount = await fetchJsonParsedAccount(rpc, myAddress);\n * myAccount satisfies MaybeAccount | MaybeEncodedAccount;\n *\n * // With custom configuration.\n * const myAccount = await fetchJsonParsedAccount(rpc, myAddress, {\n * abortSignal: myAbortController.signal,\n * commitment: 'confirmed',\n * });\n * ```\n */\nexport async function fetchJsonParsedAccount(\n rpc: Rpc,\n address: Address,\n config: FetchAccountConfig = {},\n): Promise<\n | MaybeAccount\n | MaybeEncodedAccount\n> {\n const { abortSignal, ...rpcConfig } = config;\n const { value: account } = await rpc\n .getAccountInfo(address, { ...rpcConfig, encoding: 'jsonParsed' })\n .send({ abortSignal });\n return !!account && typeof account === 'object' && 'parsed' in account.data\n ? parseJsonRpcAccount(address, account as Parameters[1])\n : parseBase64RpcAccount(address, account as Parameters[1]);\n}\n\n/**\n * Optional configuration for fetching multiple accounts.\n *\n * @interface\n */\nexport type FetchAccountsConfig = {\n abortSignal?: AbortSignal;\n /**\n * Fetch the details of the accounts as of the highest slot that has reached this level of\n * commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /**\n * Prevents accessing stale data by enforcing that the RPC node has processed transactions up to\n * this slot\n */\n minContextSlot?: Slot;\n};\n\n/**\n * Fetches an array of {@link MaybeEncodedAccount | MaybeEncodedAccounts} from the provided RPC\n * client and an array of addresses.\n *\n * It uses the {@link GetMultipleAccountsApi#getMultipleAccounts | getMultipleAccounts} RPC method\n * under the hood with base64 encodings and an additional configuration object can be provided to\n * customize the behavior of the RPC call.\n *\n * @typeParam TAddresses - Supply an array of string literals to define accounts having particular\n * addresses.\n *\n * @example\n * ```ts\n * const myAddressA = address('1234..5678');\n * const myAddressB = address('8765..4321');\n * const [myAccountA, myAccountB] = await fetchEncodedAccounts(rpc, [myAddressA, myAddressB]);\n * myAccountA satisfies MaybeEncodedAccount<'1234..5678'>;\n * myAccountB satisfies MaybeEncodedAccount<'8765..4321'>;\n *\n * // With custom configuration.\n * const [myAccountA, myAccountB] = await fetchEncodedAccounts(rpc, [myAddressA, myAddressB], {\n * abortSignal: myAbortController.signal,\n * commitment: 'confirmed',\n * });\n * ```\n */\nexport async function fetchEncodedAccounts<\n TAddresses extends string[] = string[],\n TWrappedAddresses extends { [P in keyof TAddresses]: Address } = {\n [P in keyof TAddresses]: Address;\n },\n>(rpc: Rpc, addresses: TWrappedAddresses, config: FetchAccountsConfig = {}) {\n const { abortSignal, ...rpcConfig } = config;\n const response = await rpc\n .getMultipleAccounts(addresses, { ...rpcConfig, encoding: 'base64' })\n .send({ abortSignal });\n return response.value.map((account, index) => parseBase64RpcAccount(addresses[index], account)) as {\n [P in keyof TAddresses]: MaybeEncodedAccount;\n };\n}\n\n/**\n * Fetches an array of {@link MaybeAccount | MaybeAccounts} from a provided RPC client and an array\n * of addresses.\n *\n * It uses the {@link GetMultipleAccountsApi#getMultipleAccounts | getMultipleAccounts} RPC method\n * under the hood with the `jsonParsed` encoding. It may also return a\n * {@link MaybeEncodedAccount} instead of the expected {@link MaybeAccount} if the RPC client does\n * not know how to parse some of the requested accounts. In any case, the array of expected data\n * types should be explicitly provided as the first type parameter.\n *\n * @typeParam TAddresses - Supply an array of string literals to define accounts having particular\n * addresses.\n * @typeParam TData - The expected types of these accounts' data.\n \n * @example\n * ```ts\n * type TokenData = { mint: Address; owner: Address };\n * type MintData = { supply: bigint };\n * const [myAccountA, myAccountB] = await fetchJsonParsedAccounts<[TokenData, MintData]>(rpc, [myAddressA, myAddressB]);\n * myAccountA satisfies MaybeAccount | MaybeEncodedAccount;\n * myAccountB satisfies MaybeAccount | MaybeEncodedAccount;\n * ```\n */\nexport async function fetchJsonParsedAccounts<\n TData extends object[],\n TAddresses extends string[] = string[],\n TWrappedAddresses extends { [P in keyof TAddresses]: Address } = {\n [P in keyof TAddresses]: Address;\n },\n>(rpc: Rpc, addresses: TWrappedAddresses, config: FetchAccountsConfig = {}) {\n const { abortSignal, ...rpcConfig } = config;\n const response = await rpc\n .getMultipleAccounts(addresses, { ...rpcConfig, encoding: 'jsonParsed' })\n .send({ abortSignal });\n return response.value.map((account, index) => {\n return !!account && typeof account === 'object' && 'parsed' in account.data\n ? parseJsonRpcAccount(addresses[index], account as Parameters[1])\n : parseBase64RpcAccount(addresses[index], account as Parameters[1]);\n }) as {\n [P in keyof TAddresses]:\n | MaybeAccount<\n TData[P & keyof TData] & { parsedAccountMeta?: { program: string; type?: string } },\n TAddresses[P]\n >\n | MaybeEncodedAccount;\n } & {\n [P in keyof TData]:\n | MaybeAccount<\n TData[P] & { parsedAccountMeta?: { program: string; type?: string } },\n TAddresses[P & keyof TAddresses]\n >\n | MaybeEncodedAccount;\n };\n}\n","import { Address } from '@solana/addresses';\nimport {\n SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND,\n SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND,\n SolanaError,\n} from '@solana/errors';\n\nimport { Account } from './account';\n\n/**\n * Represents an account that may or may not exist on-chain.\n *\n * When the account exists, it is represented as an {@link Account} type with an additional `exists`\n * attribute set to `true`. When it does not exist, it is represented by an object containing only\n * the address of the account and an `exists` attribute set to `false`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * // Account exists\n * const myExistingAccount: MaybeAccount = {\n * exists: true,\n * address: address('1234..5678'),\n * data: { name: 'Alice', age: 30 },\n * // ...\n * };\n *\n * // Account does not exist\n * const myMissingAccount: MaybeAccount = {\n * exists: false,\n * address: address('8765..4321'),\n * };\n * ```\n */\nexport type MaybeAccount =\n | { readonly address: Address; readonly exists: false }\n | (Account & { readonly exists: true });\n\n/**\n * Represents an encoded account that may or may not exist on-chain.\n *\n * When the account exists, it is represented as an {@link Account} type having its `TData` type\n * parameter set to `Uint8Array` with an additional `exists` attribute set to `true`. When it does\n * not exist, it is represented by an object containing only the address of the account and an\n * `exists` attribute set to `false`.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n *\n * @example\n * ```ts\n * // Encoded account exists\n * const myExistingAccount: MaybeEncodedAccount<'1234..5678'> = {\n * exists: true,\n * address: address('1234..5678'),\n * data: new Uint8Array([1, 2, 3]),\n * // ...\n * };\n *\n * // Encoded account does not exist\n * const myMissingAccount: MaybeEncodedAccount<'8765..4321'> = {\n * exists: false,\n * address: address('8765..4321'),\n * };\n * ```\n */\nexport type MaybeEncodedAccount = MaybeAccount;\n\n/**\n * Given a {@link MaybeAccount}, asserts that the account exists and allows it to be used as an\n * {@link Account} type going forward.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * const myAccount: MaybeEncodedAccount<'1234..5678'>;\n * assertAccountExists(myAccount);\n *\n * // Now we can use myAccount as an `EncodedAccount`\n * myAccount satisfies EncodedAccount<'1234..5678'>;\n * ```\n */\nexport function assertAccountExists(\n account: MaybeAccount,\n): asserts account is Account & { exists: true } {\n if (!account.exists) {\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND, { address: account.address });\n }\n}\n\n/**\n * Given an array of {@link MaybeAccount | MaybeAccounts}, asserts that all the accounts exist and\n * allows them to be used as an array of {@link Account | Accounts} going forward.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TData - The nature of this account's data. It can be represented as either a\n * `Uint8Array` – meaning the account is encoded – or a custom data type – meaning\n * the account is decoded.\n *\n * @example\n * ```ts\n * const myAccounts: MaybeEncodedAccount

[];\n * assertAccountsExist(myAccounts);\n *\n * // Now we can use them as an array of `EncodedAccounts`\n * for (const a of myAccounts) {\n * a satisfies EncodedAccount
;\n * }\n * ```\n */\nexport function assertAccountsExist(\n accounts: MaybeAccount[],\n): asserts accounts is (Account & { exists: true })[] {\n const missingAccounts = accounts.filter(a => !a.exists);\n if (missingAccounts.length > 0) {\n const missingAddresses = missingAccounts.map(a => a.address);\n throw new SolanaError(SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND, { addresses: missingAddresses });\n }\n}\n","import { SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED, SolanaError } from '@solana/errors';\n\n/**\n * Throws an exception unless {@link Crypto#getRandomValues | `crypto.getRandomValues()`} is\n * available in the current JavaScript environment.\n */\nexport function assertPRNGIsAvailable() {\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.getRandomValues !== 'function') {\n throw new SolanaError(SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED);\n }\n}\n","import {\n SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT,\n SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED,\n SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED,\n SolanaError,\n} from '@solana/errors';\n\nfunction assertIsSecureContext() {\n if (__BROWSER__ && !globalThis.isSecureContext) {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT);\n }\n}\n\nlet cachedEd25519Decision: PromiseLike | boolean | undefined;\nasync function isEd25519CurveSupported(subtle: SubtleCrypto): Promise {\n if (cachedEd25519Decision === undefined) {\n cachedEd25519Decision = new Promise(resolve => {\n subtle\n .generateKey('Ed25519', /* extractable */ false, ['sign', 'verify'])\n .then(() => {\n resolve((cachedEd25519Decision = true));\n })\n .catch(() => {\n resolve((cachedEd25519Decision = false));\n });\n });\n }\n if (typeof cachedEd25519Decision === 'boolean') {\n return cachedEd25519Decision;\n } else {\n return await cachedEd25519Decision;\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#digest | `crypto.subtle.digest()`} is available in\n * the current JavaScript environment.\n */\nexport function assertDigestCapabilityIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.digest !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED);\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#generateKey | `crypto.subtle.generateKey()`} is\n * available in the current JavaScript environment and has support for the Ed25519 curve.\n */\nexport async function assertKeyGenerationIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.generateKey !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED);\n }\n if (!(await isEd25519CurveSupported(globalThis.crypto.subtle))) {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED);\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#exportKey | `crypto.subtle.exportKey()`} is\n * available in the current JavaScript environment.\n */\nexport function assertKeyExporterIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.exportKey !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED);\n }\n}\n\n/**\n * Throws an exception unless {@link SubtleCrypto#sign | `crypto.subtle.sign()`} is available in the\n * current JavaScript environment.\n */\nexport function assertSigningCapabilityIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.sign !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED);\n }\n}\n/**\n * Throws an exception unless {@link SubtleCrypto#verify | `crypto.subtle.verify()`} is available in\n * the current JavaScript environment.\n */\nexport function assertVerificationCapabilityIsAvailable() {\n assertIsSecureContext();\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.subtle?.verify !== 'function') {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED);\n }\n}\n","import {\n combineCodec,\n Decoder,\n Encoder,\n fixDecoderSize,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n fixEncoderSize,\n transformEncoder,\n} from '@solana/codecs-core';\nimport { getBase58Decoder, getBase58Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\n/**\n * Represents a string that validates as a Solana address. Functions that require well-formed\n * addresses should specify their inputs in terms of this type.\n *\n * Whenever you need to validate an arbitrary string as a base58-encoded address, use the\n * {@link address}, {@link assertIsAddress}, or {@link isAddress} functions in this package.\n */\nexport type Address = Brand, 'Address'>;\n\nlet memoizedBase58Encoder: Encoder | undefined;\nlet memoizedBase58Decoder: Decoder | undefined;\n\nfunction getMemoizedBase58Encoder(): Encoder {\n if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder();\n return memoizedBase58Encoder;\n}\n\nfunction getMemoizedBase58Decoder(): Decoder {\n if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder();\n return memoizedBase58Decoder;\n}\n\n/**\n * A type guard that returns `true` if the input string conforms to the {@link Address} type, and\n * refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isAddress } from '@solana/addresses';\n *\n * if (isAddress(ownerAddress)) {\n * // At this point, `ownerAddress` has been refined to a\n * // `Address` that can be used with the RPC.\n * const { value: lamports } = await rpc.getBalance(ownerAddress).send();\n * setBalanceLamports(lamports);\n * } else {\n * setError(`${ownerAddress} is not an address`);\n * }\n * ```\n */\nexport function isAddress(putativeAddress: string): putativeAddress is Address {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n try {\n return base58Encoder.encode(putativeAddress).byteLength === 32;\n } catch {\n return false;\n }\n}\n\n/**\n * From time to time you might acquire a string, that you expect to validate as an address or public\n * key, from an untrusted network API or user input. Use this function to assert that such an\n * arbitrary string is a base58-encoded address.\n *\n * @example\n * ```ts\n * import { assertIsAddress } from '@solana/addresses';\n *\n * // Imagine a function that fetches an account's balance when a user submits a form.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const address: string = accountAddressInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `address` to `Address`.\n * assertIsAddress(address);\n * // At this point, `address` is an `Address` that can be used with the RPC.\n * const balanceInLamports = await rpc.getBalance(address).send();\n * } catch (e) {\n * // `address` turned out not to be a base58-encoded address\n * }\n * }\n * ```\n */\nexport function assertIsAddress(putativeAddress: string): asserts putativeAddress is Address {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE, {\n actualLength: putativeAddress.length,\n });\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH, {\n actualLength: numBytes,\n });\n }\n}\n\n/**\n * Combines _asserting_ that a string is an address with _coercing_ it to the {@link Address} type.\n * It's most useful with untrusted input.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n *\n * await transfer(address(fromAddress), address(toAddress), lamports(100000n));\n * ```\n *\n * > [!TIP]\n * > When starting from a known-good address as a string, it's more efficient to typecast it rather\n * than to use the {@link address} helper, because the helper unconditionally performs validation on\n * its input.\n * >\n * > ```ts\n * > import { Address } from '@solana/addresses';\n * >\n * > const MEMO_PROGRAM_ADDRESS =\n * > 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr' as Address<'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'>;\n * > ```\n */\nexport function address(putativeAddress: TAddress): Address {\n assertIsAddress(putativeAddress);\n return putativeAddress as Address;\n}\n\n/**\n * Returns an encoder that you can use to encode a base58-encoded address to a byte array.\n *\n * @example\n * ```ts\n * import { getAddressEncoder } from '@solana/addresses';\n *\n * const address = 'B9Lf9z5BfNPT4d5KMeaBFx8x1G4CULZYR1jA2kmxRDka' as Address;\n * const addressEncoder = getAddressEncoder();\n * const addressBytes = addressEncoder.encode(address);\n * // Uint8Array(32) [\n * // 150, 183, 190, 48, 171, 8, 39, 156,\n * // 122, 213, 172, 108, 193, 95, 26, 158,\n * // 149, 243, 115, 254, 20, 200, 36, 30,\n * // 248, 179, 178, 232, 220, 89, 53, 127\n * // ]\n * ```\n */\nexport function getAddressEncoder(): FixedSizeEncoder {\n return transformEncoder(fixEncoderSize(getMemoizedBase58Encoder(), 32), putativeAddress =>\n address(putativeAddress),\n );\n}\n\n/**\n * Returns a decoder that you can use to convert an array of 32 bytes representing an address to the\n * base58-encoded representation of that address.\n *\n * @example\n * ```ts\n * import { getAddressDecoder } from '@solana/addresses';\n *\n * const addressBytes = new Uint8Array([\n * 150, 183, 190, 48, 171, 8, 39, 156,\n * 122, 213, 172, 108, 193, 95, 26, 158,\n * 149, 243, 115, 254, 20, 200, 36, 30,\n * 248, 179, 178, 232, 220, 89, 53, 127\n * ]);\n * const addressDecoder = getAddressDecoder();\n * const address = addressDecoder.decode(addressBytes); // B9Lf9z5BfNPT4d5KMeaBFx8x1G4CULZYR1jA2kmxRDka\n * ```\n */\nexport function getAddressDecoder(): FixedSizeDecoder {\n return fixDecoderSize(getMemoizedBase58Decoder(), 32) as FixedSizeDecoder;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a base-58 encoded address.\n *\n * @see {@link getAddressDecoder}\n * @see {@link getAddressEncoder}\n */\nexport function getAddressCodec(): FixedSizeCodec {\n return combineCodec(getAddressEncoder(), getAddressDecoder());\n}\n\nexport function getAddressComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","/**!\n * noble-ed25519\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Paul Miller (https://paulmillr.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the “Software”), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nconst D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n;\nconst P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; // 2n ** 255n - 19n; ed25519 is twisted edwards curve\nconst RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; // √-1\n\n// mod division\nfunction mod(a: bigint): bigint {\n const r = a % P;\n return r >= 0n ? r : P + r;\n}\nfunction pow2(x: bigint, power: bigint): bigint {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n}\nfunction pow_2_252_3(x: bigint): bigint {\n // x^(2^252-3) unrolled util for square root\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return pow_p_5_8;\n}\nfunction uvRatio(u: bigint, v: bigint): bigint | null {\n // for sqrt comp\n const v3 = mod(v * v * v); // v³\n const v7 = mod(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7); // (uv⁷)^(p-5)/8\n let x = mod(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if ((mod(x) & 1n) === 1n) x = mod(-x); // edIsNegative\n if (!useRoot1 && !useRoot2) {\n return null;\n }\n return x;\n}\n// https://datatracker.ietf.org/doc/html/rfc8032#section-5.1.3\nexport function pointIsOnCurve(y: bigint, lastByte: number): boolean {\n const y2 = mod(y * y); // y²\n const u = mod(y2 - 1n); // u=y²-1\n const v = mod(D * y2 + 1n);\n const x = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (x === null) {\n return false;\n }\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (x === 0n && isLastByteOdd) {\n return false;\n }\n return true;\n}\n","import { ReadonlyUint8Array } from '@solana/codecs-core';\n\nimport { pointIsOnCurve } from './vendor/noble/ed25519';\n\nfunction byteToHex(byte: number): string {\n const hexString = byte.toString(16);\n if (hexString.length === 1) {\n return `0${hexString}`;\n } else {\n return hexString;\n }\n}\n\nfunction decompressPointBytes(bytes: ReadonlyUint8Array): bigint {\n const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & ~0x80 : byte)}${acc}`, '');\n const integerLiteralString = `0x${hexString}`;\n return BigInt(integerLiteralString);\n}\n\nexport function compressedPointBytesAreOnCurve(bytes: ReadonlyUint8Array): boolean {\n if (bytes.byteLength !== 32) {\n return false;\n }\n const y = decompressPointBytes(bytes);\n return pointIsOnCurve(y, bytes[31]);\n}\n","import { SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS, SolanaError } from '@solana/errors';\nimport type { AffinePoint } from '@solana/nominal-types';\n\nimport { type Address, getAddressCodec } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve-internal';\n\n/**\n * Represents an {@link Address} that validates as being off-curve. Functions that require off-curve\n * addresses should specify their inputs in terms of this type.\n *\n * Whenever you need to validate an address as being off-curve, use the {@link offCurveAddress},\n * {@link assertIsOffCurveAddress}, or {@link isOffCurveAddress} functions in this package.\n */\nexport type OffCurveAddress = AffinePoint, 'invalid'>;\n\n/**\n * A type guard that returns `true` if the input address conforms to the {@link OffCurveAddress}\n * type, and refines its type for use in your application.\n *\n * @example\n * ```ts\n * import { isOffCurveAddress } from '@solana/addresses';\n *\n * if (isOffCurveAddress(accountAddress)) {\n * // At this point, `accountAddress` has been refined to a\n * // `OffCurveAddress` that can be used within your business logic.\n * const { value: account } = await rpc.getAccountInfo(accountAddress).send();\n * } else {\n * setError(`${accountAddress} is not off-curve`);\n * }\n * ```\n */\nexport function isOffCurveAddress(\n putativeOffCurveAddress: TAddress,\n): putativeOffCurveAddress is OffCurveAddress {\n const addressBytes = getAddressCodec().encode(putativeOffCurveAddress);\n return compressedPointBytesAreOnCurve(addressBytes) === false;\n}\n\n/**\n * From time to time you might acquire an {@link Address}, that you expect to validate as an\n * off-curve address, from an untrusted source. Use this function to assert that such an address is\n * off-curve.\n *\n * @example\n * ```ts\n * import { assertIsOffCurveAddress } from '@solana/addresses';\n *\n * // Imagine a function that fetches an account's balance when a user submits a form.\n * function handleSubmit() {\n * // We know only that the input conforms to the `string` type.\n * const address: string = accountAddressInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `address` to `Address`.\n * assertIsAddress(address);\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `address` to `OffCurveAddress`.\n * assertIsOffCurveAddress(address);\n * // At this point, `address` is an `OffCurveAddress` that can be used with the RPC.\n * const balanceInLamports = await rpc.getBalance(address).send();\n * } catch (e) {\n * // `address` turned out to NOT be a base58-encoded off-curve address\n * }\n * }\n * ```\n */\nexport function assertIsOffCurveAddress(\n putativeOffCurveAddress: TAddress,\n): asserts putativeOffCurveAddress is OffCurveAddress {\n if (!isOffCurveAddress(putativeOffCurveAddress)) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS);\n }\n}\n\n/**\n * Combines _asserting_ that an {@link Address} is off-curve with _coercing_ it to the\n * {@link OffCurveAddress} type. It's most useful with untrusted input.\n */\nexport function offCurveAddress(\n putativeOffCurveAddress: TAddress,\n): OffCurveAddress {\n assertIsOffCurveAddress(putativeOffCurveAddress);\n return putativeOffCurveAddress;\n}\n","import { assertDigestCapabilityIsAvailable } from '@solana/assertions';\nimport { bytesEqual, type ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n isSolanaError,\n SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED,\n SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE,\n SOLANA_ERROR__ADDRESSES__MALFORMED_PDA,\n SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE,\n SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER,\n SolanaError,\n} from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\nimport { Address, assertIsAddress, getAddressCodec, isAddress } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve-internal';\n\n/**\n * A tuple representing a program derived address (derived from the address of some program and a\n * set of seeds) and the associated bump seed used to ensure that the address, as derived, does not\n * fall on the Ed25519 curve.\n *\n * Whenever you need to validate an arbitrary tuple as one that represents a program derived\n * address, use the {@link assertIsProgramDerivedAddress} or {@link isProgramDerivedAddress}\n * functions in this package.\n */\nexport type ProgramDerivedAddress = Readonly<\n [Address, ProgramDerivedAddressBump]\n>;\n\n/**\n * Represents an integer in the range [0,255] used in the derivation of a program derived address to\n * ensure that it does not fall on the Ed25519 curve.\n */\nexport type ProgramDerivedAddressBump = Brand;\n\n/**\n * A type guard that returns `true` if the input tuple conforms to the {@link ProgramDerivedAddress}\n * type, and refines its type for use in your program.\n *\n * @see The {@link isAddress} function for an example of how to use a type guard.\n */\nexport function isProgramDerivedAddress(\n value: unknown,\n): value is ProgramDerivedAddress {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'number' &&\n value[1] >= 0 &&\n value[1] <= 255 &&\n isAddress(value[0])\n );\n}\n\n/**\n * In the event that you receive an address/bump-seed tuple from some untrusted source, use this\n * function to assert that it conforms to the {@link ProgramDerivedAddress} interface.\n *\n * @see The {@link assertIsAddress} function for an example of how to use an assertion function.\n */\nexport function assertIsProgramDerivedAddress(\n value: unknown,\n): asserts value is ProgramDerivedAddress {\n const validFormat =\n Array.isArray(value) && value.length === 2 && typeof value[0] === 'string' && typeof value[1] === 'number';\n if (!validFormat) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MALFORMED_PDA);\n }\n if (value[1] < 0 || value[1] > 255) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE, {\n bump: value[1],\n });\n }\n assertIsAddress(value[0]);\n}\n\ntype ProgramDerivedAddressInput = Readonly<{\n programAddress: Address;\n seeds: Seed[];\n}>;\n\ntype SeedInput = Readonly<{\n baseAddress: Address;\n programAddress: Address;\n seed: Seed;\n}>;\n\ntype Seed = ReadonlyUint8Array | string;\n\nconst MAX_SEED_LENGTH = 32;\nconst MAX_SEEDS = 16;\nconst PDA_MARKER_BYTES = [\n // The string 'ProgramDerivedAddress'\n 80, 114, 111, 103, 114, 97, 109, 68, 101, 114, 105, 118, 101, 100, 65, 100, 100, 114, 101, 115, 115,\n] as const;\n\nasync function createProgramDerivedAddress({ programAddress, seeds }: ProgramDerivedAddressInput): Promise
{\n assertDigestCapabilityIsAvailable();\n if (seeds.length > MAX_SEEDS) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {\n actual: seeds.length,\n maxSeeds: MAX_SEEDS,\n });\n }\n let textEncoder: TextEncoder;\n const seedBytes = seeds.reduce((acc, seed, ii) => {\n const bytes = typeof seed === 'string' ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;\n if (bytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: bytes.byteLength,\n index: ii,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n acc.push(...bytes);\n return acc;\n }, [] as number[]);\n const base58EncodedAddressCodec = getAddressCodec();\n const programAddressBytes = base58EncodedAddressCodec.encode(programAddress);\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n if (compressedPointBytesAreOnCurve(addressBytes)) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE);\n }\n return base58EncodedAddressCodec.decode(addressBytes);\n}\n\n/**\n * Given a program's {@link Address} and up to 16 {@link Seed | Seeds}, this method will return the\n * program derived address (PDA) associated with each.\n *\n * @example\n * ```ts\n * import { getAddressEncoder, getProgramDerivedAddress } from '@solana/addresses';\n *\n * const addressEncoder = getAddressEncoder();\n * const [pda, bumpSeed] = await getProgramDerivedAddress({\n * programAddress: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address,\n * seeds: [\n * // Owner\n * addressEncoder.encode('9fYLFVoVqwH37C3dyPi6cpeobfbQ2jtLpN5HgAYDDdkm' as Address),\n * // Token program\n * addressEncoder.encode('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address),\n * // Mint\n * addressEncoder.encode('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as Address),\n * ],\n * });\n * ```\n */\nexport async function getProgramDerivedAddress({\n programAddress,\n seeds,\n}: ProgramDerivedAddressInput): Promise {\n let bumpSeed = 255;\n while (bumpSeed > 0) {\n try {\n const address = await createProgramDerivedAddress({\n programAddress,\n seeds: [...seeds, new Uint8Array([bumpSeed])],\n });\n return [address, bumpSeed as ProgramDerivedAddressBump];\n } catch (e) {\n if (isSolanaError(e, SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE)) {\n bumpSeed--;\n } else {\n throw e;\n }\n }\n }\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED);\n}\n\n/**\n * Returns a base58-encoded address derived from some base address, some program address, and a seed\n * string or byte array.\n *\n * @example\n * ```ts\n * import { createAddressWithSeed } from '@solana/addresses';\n *\n * const derivedAddress = await createAddressWithSeed({\n * // The private key associated with this address will be able to sign for `derivedAddress`.\n * baseAddress: 'B9Lf9z5BfNPT4d5KMeaBFx8x1G4CULZYR1jA2kmxRDka' as Address,\n * // Only this program will be able to write data to this account.\n * programAddress: '445erYq578p2aERrGW9mn9KiYe3fuG6uHdcJ2LPPShGw' as Address,\n * seed: 'data-account',\n * });\n * ```\n */\nexport async function createAddressWithSeed({ baseAddress, programAddress, seed }: SeedInput): Promise
{\n const { encode, decode } = getAddressCodec();\n\n const seedBytes = typeof seed === 'string' ? new TextEncoder().encode(seed) : seed;\n if (seedBytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: seedBytes.byteLength,\n index: 0,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n\n const programAddressBytes = encode(programAddress);\n if (\n programAddressBytes.length >= PDA_MARKER_BYTES.length &&\n bytesEqual(programAddressBytes.slice(-PDA_MARKER_BYTES.length), new Uint8Array(PDA_MARKER_BYTES))\n ) {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER);\n }\n\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n\n return decode(addressBytes);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\nimport { SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY, SolanaError } from '@solana/errors';\n\nimport { Address, getAddressDecoder, getAddressEncoder } from './address';\n\n/**\n * Given a public {@link CryptoKey}, this method will return its associated {@link Address}.\n *\n * @example\n * ```ts\n * import { getAddressFromPublicKey } from '@solana/addresses';\n *\n * const address = await getAddressFromPublicKey(publicKey);\n * ```\n */\nexport async function getAddressFromPublicKey(publicKey: CryptoKey): Promise
{\n assertKeyExporterIsAvailable();\n if (publicKey.type !== 'public' || publicKey.algorithm.name !== 'Ed25519') {\n throw new SolanaError(SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY);\n }\n const publicKeyBytes = await crypto.subtle.exportKey('raw', publicKey);\n return getAddressDecoder().decode(new Uint8Array(publicKeyBytes));\n}\n\n/**\n * Given an {@link Address}, return a {@link CryptoKey} that can be used to verify signatures.\n *\n * @example\n * ```ts\n * import { getAddressFromPublicKey } from '@solana/addresses';\n *\n * const publicKey = await getPublicKeyFromAddress(address);\n * ```\n */\nexport async function getPublicKeyFromAddress(address: Address) {\n const addressBytes = getAddressEncoder().encode(address);\n return await crypto.subtle.importKey('raw', addressBytes, { name: 'Ed25519' }, true /* extractable */, ['verify']);\n}\n","import { SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, SolanaError } from '@solana/errors';\n\n/**\n * Ensures that a given number falls within a specified range.\n *\n * If the number is outside the allowed range, an error is thrown.\n * This function is primarily used to validate values before encoding them in a codec.\n *\n * @param codecDescription - A string describing the codec that is performing the validation.\n * @param min - The minimum allowed value (inclusive).\n * @param max - The maximum allowed value (inclusive).\n * @param value - The number to validate.\n *\n * @throws {@link SolanaError} if the value is out of range.\n *\n * @example\n * Validating a number within range.\n * ```ts\n * assertNumberIsBetweenForCodec('u8', 0, 255, 42); // Passes\n * ```\n *\n * @example\n * Throwing an error for an out-of-range value.\n * ```ts\n * assertNumberIsBetweenForCodec('u8', 0, 255, 300); // Throws\n * ```\n */\nexport function assertNumberIsBetweenForCodec(\n codecDescription: string,\n min: bigint | number,\n max: bigint | number,\n value: bigint | number,\n) {\n if (value < min || value > max) {\n throw new SolanaError(SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, {\n codecDescription,\n max,\n min,\n value,\n });\n }\n}\n","import { Codec, Decoder, Encoder, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n/**\n * Represents an encoder for numbers and bigints.\n *\n * This type allows encoding values that are either `number` or `bigint`.\n * Depending on the specific implementation, the encoded output may have a fixed or variable size.\n *\n * @see {@link FixedSizeNumberEncoder}\n */\nexport type NumberEncoder = Encoder;\n\n/**\n * Represents a fixed-size encoder for numbers and bigints.\n *\n * This encoder serializes values using an exact number of bytes, defined by `TSize`.\n *\n * @typeParam TSize - The number of bytes used for encoding.\n *\n * @see {@link NumberEncoder}\n */\nexport type FixedSizeNumberEncoder = FixedSizeEncoder;\n\n/**\n * Represents a decoder for numbers and bigints.\n *\n * This type supports decoding values as either `number` or `bigint`, depending on the implementation.\n *\n * @see {@link FixedSizeNumberDecoder}\n */\nexport type NumberDecoder = Decoder | Decoder;\n\n/**\n * Represents a fixed-size decoder for numbers and bigints.\n *\n * This decoder reads a fixed number of bytes (`TSize`) and converts them into a `number` or `bigint`.\n *\n * @typeParam TSize - The number of bytes expected for decoding.\n *\n * @see {@link NumberDecoder}\n */\nexport type FixedSizeNumberDecoder =\n | FixedSizeDecoder\n | FixedSizeDecoder;\n\n/**\n * Represents a codec for encoding and decoding numbers and bigints.\n *\n * - The encoded value can be either a `number` or a `bigint`.\n * - The decoded value will always be either a `number` or `bigint`, depending on the implementation.\n *\n * @see {@link FixedSizeNumberCodec}\n */\nexport type NumberCodec = Codec | Codec;\n\n/**\n * Represents a fixed-size codec for encoding and decoding numbers and bigints.\n *\n * This codec uses a specific number of bytes (`TSize`) for serialization.\n * The encoded value can be either a `number` or `bigint`, but the decoded value will always be a `number` or `bigint`,\n * depending on the implementation.\n *\n * @typeParam TSize - The number of bytes used for encoding and decoding.\n *\n * @see {@link NumberCodec}\n */\nexport type FixedSizeNumberCodec =\n | FixedSizeCodec\n | FixedSizeCodec;\n\n/**\n * Configuration options for number codecs that use more than one byte.\n *\n * This configuration applies to all number codecs except `u8` and `i8`,\n * allowing the user to specify the endianness of serialization.\n */\nexport type NumberCodecConfig = {\n /**\n * Specifies whether numbers should be encoded in little-endian or big-endian format.\n *\n * @defaultValue `Endian.Little`\n */\n endian?: Endian;\n};\n\n/**\n * Defines the byte order used for number serialization.\n *\n * - `Little`: The least significant byte is stored first.\n * - `Big`: The most significant byte is stored first.\n */\nexport enum Endian {\n Little,\n Big,\n}\n","import {\n assertByteArrayHasEnoughBytesForCodec,\n assertByteArrayIsNotEmptyForCodec,\n createDecoder,\n createEncoder,\n FixedSizeDecoder,\n FixedSizeEncoder,\n Offset,\n toArrayBuffer,\n} from '@solana/codecs-core';\n\nimport { assertNumberIsBetweenForCodec } from './assertions';\nimport { Endian, NumberCodecConfig } from './common';\n\ntype NumberFactorySharedInput = {\n config?: NumberCodecConfig;\n name: string;\n size: TSize;\n};\n\ntype NumberFactoryEncoderInput = NumberFactorySharedInput & {\n range?: [bigint | number, bigint | number];\n set: (view: DataView, value: TFrom, littleEndian?: boolean) => void;\n};\n\ntype NumberFactoryDecoderInput = NumberFactorySharedInput & {\n get: (view: DataView, littleEndian?: boolean) => TTo;\n};\n\nfunction isLittleEndian(config?: NumberCodecConfig): boolean {\n return config?.endian === Endian.Big ? false : true;\n}\n\nexport function numberEncoderFactory(\n input: NumberFactoryEncoderInput,\n): FixedSizeEncoder {\n return createEncoder({\n fixedSize: input.size,\n write(value: TFrom, bytes: Uint8Array, offset: Offset): Offset {\n if (input.range) {\n assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value);\n }\n const arrayBuffer = new ArrayBuffer(input.size);\n input.set(new DataView(arrayBuffer), value, isLittleEndian(input.config));\n bytes.set(new Uint8Array(arrayBuffer), offset);\n return offset + input.size;\n },\n });\n}\n\nexport function numberDecoderFactory(\n input: NumberFactoryDecoderInput,\n): FixedSizeDecoder {\n return createDecoder({\n fixedSize: input.size,\n read(bytes, offset = 0): [TTo, number] {\n assertByteArrayIsNotEmptyForCodec(input.name, bytes, offset);\n assertByteArrayHasEnoughBytesForCodec(input.name, input.size, bytes, offset);\n const view = new DataView(toArrayBuffer(bytes, offset, input.size));\n return [input.get(view, isLittleEndian(input.config)), offset + input.size];\n },\n });\n}\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 32-bit floating-point numbers (`f32`).\n *\n * This encoder serializes `f32` values using 4 bytes.\n * Floating-point values may lose precision when encoded.\n *\n * For more details, see {@link getF32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `f32` values.\n *\n * @example\n * Encoding an `f32` value.\n * ```ts\n * const encoder = getF32Encoder();\n * const bytes = encoder.encode(-1.5); // 0x0000c0bf\n * ```\n *\n * @see {@link getF32Codec}\n */\nexport const getF32Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'f32',\n set: (view, value, le) => view.setFloat32(0, Number(value), le),\n size: 4,\n });\n\n/**\n * Returns a decoder for 32-bit floating-point numbers (`f32`).\n *\n * This decoder deserializes `f32` values from 4 bytes.\n * Some precision may be lost during decoding due to floating-point representation.\n *\n * For more details, see {@link getF32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `f32` values.\n *\n * @example\n * Decoding an `f32` value.\n * ```ts\n * const decoder = getF32Decoder();\n * const value = decoder.decode(new Uint8Array([0x00, 0x00, 0xc0, 0xbf])); // -1.5\n * ```\n *\n * @see {@link getF32Codec}\n */\nexport const getF32Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getFloat32(0, le),\n name: 'f32',\n size: 4,\n });\n\n/**\n * Returns a codec for encoding and decoding 32-bit floating-point numbers (`f32`).\n *\n * This codec serializes `f32` values using 4 bytes.\n * Due to the IEEE 754 floating-point representation, some precision loss may occur.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `f32` values.\n *\n * @example\n * Encoding and decoding an `f32` value.\n * ```ts\n * const codec = getF32Codec();\n * const bytes = codec.encode(-1.5); // 0x0000c0bf\n * const value = codec.decode(bytes); // -1.5\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getF32Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-1.5); // 0xbfc00000\n * ```\n *\n * @remarks\n * `f32` values follow the IEEE 754 single-precision floating-point standard.\n * Precision loss may occur for certain values.\n *\n * - If you need higher precision, consider using {@link getF64Codec}.\n * - If you need integer values, consider using {@link getI32Codec} or {@link getU32Codec}.\n *\n * Separate {@link getF32Encoder} and {@link getF32Decoder} functions are available.\n *\n * ```ts\n * const bytes = getF32Encoder().encode(-1.5);\n * const value = getF32Decoder().decode(bytes);\n * ```\n *\n * @see {@link getF32Encoder}\n * @see {@link getF32Decoder}\n */\nexport const getF32Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getF32Encoder(config), getF32Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 64-bit floating-point numbers (`f64`).\n *\n * This encoder serializes `f64` values using 8 bytes.\n * Floating-point values may lose precision when encoded.\n *\n * For more details, see {@link getF64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `f64` values.\n *\n * @example\n * Encoding an `f64` value.\n * ```ts\n * const encoder = getF64Encoder();\n * const bytes = encoder.encode(-1.5); // 0x000000000000f8bf\n * ```\n *\n * @see {@link getF64Codec}\n */\nexport const getF64Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'f64',\n set: (view, value, le) => view.setFloat64(0, Number(value), le),\n size: 8,\n });\n\n/**\n * Returns a decoder for 64-bit floating-point numbers (`f64`).\n *\n * This decoder deserializes `f64` values from 8 bytes.\n * Some precision may be lost during decoding due to floating-point representation.\n *\n * For more details, see {@link getF64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `f64` values.\n *\n * @example\n * Decoding an `f64` value.\n * ```ts\n * const decoder = getF64Decoder();\n * const value = decoder.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf])); // -1.5\n * ```\n *\n * @see {@link getF64Codec}\n */\nexport const getF64Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getFloat64(0, le),\n name: 'f64',\n size: 8,\n });\n\n/**\n * Returns a codec for encoding and decoding 64-bit floating-point numbers (`f64`).\n *\n * This codec serializes `f64` values using 8 bytes.\n * Due to the IEEE 754 floating-point representation, some precision loss may occur.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `f64` values.\n *\n * @example\n * Encoding and decoding an `f64` value.\n * ```ts\n * const codec = getF64Codec();\n * const bytes = codec.encode(-1.5); // 0x000000000000f8bf\n * const value = codec.decode(bytes); // -1.5\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getF64Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-1.5); // 0xbff8000000000000\n * ```\n *\n * @remarks\n * `f64` values follow the IEEE 754 double-precision floating-point standard.\n * Precision loss may still occur but is significantly lower than `f32`.\n *\n * - If you need smaller floating-point values, consider using {@link getF32Codec}.\n * - If you need integer values, consider using {@link getI64Codec} or {@link getU64Codec}.\n *\n * Separate {@link getF64Encoder} and {@link getF64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getF64Encoder().encode(-1.5);\n * const value = getF64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getF64Encoder}\n * @see {@link getF64Decoder}\n */\nexport const getF64Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getF64Encoder(config), getF64Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 128-bit signed integers (`i128`).\n *\n * This encoder serializes `i128` values using 16 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI128Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i128` values.\n *\n * @example\n * Encoding an `i128` value.\n * ```ts\n * const encoder = getI128Encoder();\n * const bytes = encoder.encode(-42n); // 0xd6ffffffffffffffffffffffffffffff\n * ```\n *\n * @see {@link getI128Codec}\n */\nexport const getI128Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i128',\n range: [-BigInt('0x7fffffffffffffffffffffffffffffff') - 1n, BigInt('0x7fffffffffffffffffffffffffffffff')],\n set: (view, value, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const rightMask = 0xffffffffffffffffn;\n view.setBigInt64(leftOffset, BigInt(value) >> 64n, le);\n view.setBigUint64(rightOffset, BigInt(value) & rightMask, le);\n },\n size: 16,\n });\n\n/**\n * Returns a decoder for 128-bit signed integers (`i128`).\n *\n * This decoder deserializes `i128` values from 16 bytes.\n * The decoded value is always a `bigint`.\n *\n * For more details, see {@link getI128Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i128` values.\n *\n * @example\n * Decoding an `i128` value.\n * ```ts\n * const decoder = getI128Decoder();\n * const value = decoder.decode(new Uint8Array([\n * 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n * 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff\n * ])); // -42n\n * ```\n *\n * @see {@link getI128Codec}\n */\nexport const getI128Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const left = view.getBigInt64(leftOffset, le);\n const right = view.getBigUint64(rightOffset, le);\n return (left << 64n) + right;\n },\n name: 'i128',\n size: 16,\n });\n\n/**\n * Returns a codec for encoding and decoding 128-bit signed integers (`i128`).\n *\n * This codec serializes `i128` values using 16 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i128` values.\n *\n * @example\n * Encoding and decoding an `i128` value.\n * ```ts\n * const codec = getI128Codec();\n * const bytes = codec.encode(-42n); // 0xd6ffffffffffffffffffffffffffffff\n * const value = codec.decode(bytes); // -42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI128Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42n); // 0xffffffffffffffffffffffffffffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^127` and `2^127 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller signed integer, consider using {@link getI64Codec} or {@link getI32Codec}.\n * - If you need a larger signed integer, consider using a custom codec.\n * - If you need unsigned integers, consider using {@link getU128Codec}.\n *\n * Separate {@link getI128Encoder} and {@link getI128Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI128Encoder().encode(-42);\n * const value = getI128Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI128Encoder}\n * @see {@link getI128Decoder}\n */\nexport const getI128Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI128Encoder(config), getI128Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 16-bit signed integers (`i16`).\n *\n * This encoder serializes `i16` values using 2 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI16Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i16` values.\n *\n * @example\n * Encoding an `i16` value.\n * ```ts\n * const encoder = getI16Encoder();\n * const bytes = encoder.encode(-42); // 0xd6ff\n * ```\n *\n * @see {@link getI16Codec}\n */\nexport const getI16Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i16',\n range: [-Number('0x7fff') - 1, Number('0x7fff')],\n set: (view, value, le) => view.setInt16(0, Number(value), le),\n size: 2,\n });\n\n/**\n * Returns a decoder for 16-bit signed integers (`i16`).\n *\n * This decoder deserializes `i16` values from 2 bytes.\n * The decoded value is always a `number`.\n *\n * For more details, see {@link getI16Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i16` values.\n *\n * @example\n * Decoding an `i16` value.\n * ```ts\n * const decoder = getI16Decoder();\n * const value = decoder.decode(new Uint8Array([0xd6, 0xff])); // -42\n * ```\n *\n * @see {@link getI16Codec}\n */\nexport const getI16Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getInt16(0, le),\n name: 'i16',\n size: 2,\n });\n\n/**\n * Returns a codec for encoding and decoding 16-bit signed integers (`i16`).\n *\n * This codec serializes `i16` values using 2 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `number`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i16` values.\n *\n * @example\n * Encoding and decoding an `i16` value.\n * ```ts\n * const codec = getI16Codec();\n * const bytes = codec.encode(-42); // 0xd6ff\n * const value = codec.decode(bytes); // -42\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI16Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42); // 0xffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^15` (`-32,768`) and `2^15 - 1` (`32,767`).\n *\n * - If you need a smaller signed integer, consider using {@link getI8Codec}.\n * - If you need a larger signed integer, consider using {@link getI32Codec}.\n * - If you need unsigned integers, consider using {@link getU16Codec}.\n *\n * Separate {@link getI16Encoder} and {@link getI16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI16Encoder().encode(-42);\n * const value = getI16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI16Encoder}\n * @see {@link getI16Decoder}\n */\nexport const getI16Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI16Encoder(config), getI16Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 32-bit signed integers (`i32`).\n *\n * This encoder serializes `i32` values using 4 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i32` values.\n *\n * @example\n * Encoding an `i32` value.\n * ```ts\n * const encoder = getI32Encoder();\n * const bytes = encoder.encode(-42); // 0xd6ffffff\n * ```\n *\n * @see {@link getI32Codec}\n */\nexport const getI32Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i32',\n range: [-Number('0x7fffffff') - 1, Number('0x7fffffff')],\n set: (view, value, le) => view.setInt32(0, Number(value), le),\n size: 4,\n });\n\n/**\n * Returns a decoder for 32-bit signed integers (`i32`).\n *\n * This decoder deserializes `i32` values from 4 bytes.\n * The decoded value is always a `number`.\n *\n * For more details, see {@link getI32Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i32` values.\n *\n * @example\n * Decoding an `i32` value.\n * ```ts\n * const decoder = getI32Decoder();\n * const value = decoder.decode(new Uint8Array([0xd6, 0xff, 0xff, 0xff])); // -42\n * ```\n *\n * @see {@link getI32Codec}\n */\nexport const getI32Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getInt32(0, le),\n name: 'i32',\n size: 4,\n });\n\n/**\n * Returns a codec for encoding and decoding 32-bit signed integers (`i32`).\n *\n * This codec serializes `i32` values using 4 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `number`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i32` values.\n *\n * @example\n * Encoding and decoding an `i32` value.\n * ```ts\n * const codec = getI32Codec();\n * const bytes = codec.encode(-42); // 0xd6ffffff\n * const value = codec.decode(bytes); // -42\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI32Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42); // 0xffffffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^31` (`-2,147,483,648`) and `2^31 - 1` (`2,147,483,647`).\n *\n * - If you need a smaller signed integer, consider using {@link getI16Codec} or {@link getI8Codec}.\n * - If you need a larger signed integer, consider using {@link getI64Codec}.\n * - If you need unsigned integers, consider using {@link getU32Codec}.\n *\n * Separate {@link getI32Encoder} and {@link getI32Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI32Encoder().encode(-42);\n * const value = getI32Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI32Encoder}\n * @see {@link getI32Decoder}\n */\nexport const getI32Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI32Encoder(config), getI32Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 64-bit signed integers (`i64`).\n *\n * This encoder serializes `i64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `i64` values.\n *\n * @example\n * Encoding an `i64` value.\n * ```ts\n * const encoder = getI64Encoder();\n * const bytes = encoder.encode(-42n); // 0xd6ffffffffffffff\n * ```\n *\n * @see {@link getI64Codec}\n */\nexport const getI64Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'i64',\n range: [-BigInt('0x7fffffffffffffff') - 1n, BigInt('0x7fffffffffffffff')],\n set: (view, value, le) => view.setBigInt64(0, BigInt(value), le),\n size: 8,\n });\n\n/**\n * Returns a decoder for 64-bit signed integers (`i64`).\n *\n * This decoder deserializes `i64` values from 8 bytes.\n * The decoded value is always a `bigint`.\n *\n * For more details, see {@link getI64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `i64` values.\n *\n * @example\n * Decoding an `i64` value.\n * ```ts\n * const decoder = getI64Decoder();\n * const value = decoder.decode(new Uint8Array([\n * 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff\n * ])); // -42n\n * ```\n *\n * @see {@link getI64Codec}\n */\nexport const getI64Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getBigInt64(0, le),\n name: 'i64',\n size: 8,\n });\n\n/**\n * Returns a codec for encoding and decoding 64-bit signed integers (`i64`).\n *\n * This codec serializes `i64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `i64` values.\n *\n * @example\n * Encoding and decoding an `i64` value.\n * ```ts\n * const codec = getI64Codec();\n * const bytes = codec.encode(-42n); // 0xd6ffffffffffffff\n * const value = codec.decode(bytes); // -42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getI64Codec({ endian: Endian.Big });\n * const bytes = codec.encode(-42n); // 0xffffffffffffffd6\n * ```\n *\n * @remarks\n * This codec supports values between `-2^63` and `2^63 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller signed integer, consider using {@link getI32Codec} or {@link getI16Codec}.\n * - If you need a larger signed integer, consider using {@link getI128Codec}.\n * - If you need unsigned integers, consider using {@link getU64Codec}.\n *\n * Separate {@link getI64Encoder} and {@link getI64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI64Encoder().encode(-42);\n * const value = getI64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI64Encoder}\n * @see {@link getI64Decoder}\n */\nexport const getI64Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getI64Encoder(config), getI64Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 8-bit signed integers (`i8`).\n *\n * This encoder serializes `i8` values using 1 byte.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getI8Codec}.\n *\n * @returns A `FixedSizeEncoder` for encoding `i8` values.\n *\n * @example\n * Encoding an `i8` value.\n * ```ts\n * const encoder = getI8Encoder();\n * const bytes = encoder.encode(-42); // 0xd6\n * ```\n *\n * @see {@link getI8Codec}\n */\nexport const getI8Encoder = (): FixedSizeEncoder =>\n numberEncoderFactory({\n name: 'i8',\n range: [-Number('0x7f') - 1, Number('0x7f')],\n set: (view, value) => view.setInt8(0, Number(value)),\n size: 1,\n });\n\n/**\n * Returns a decoder for 8-bit signed integers (`i8`).\n *\n * This decoder deserializes `i8` values from 1 byte.\n * The decoded value is always a `number`.\n *\n * For more details, see {@link getI8Codec}.\n *\n * @returns A `FixedSizeDecoder` for decoding `i8` values.\n *\n * @example\n * Decoding an `i8` value.\n * ```ts\n * const decoder = getI8Decoder();\n * const value = decoder.decode(new Uint8Array([0xd6])); // -42\n * ```\n *\n * @see {@link getI8Codec}\n */\nexport const getI8Decoder = (): FixedSizeDecoder =>\n numberDecoderFactory({\n get: view => view.getInt8(0),\n name: 'i8',\n size: 1,\n });\n\n/**\n * Returns a codec for encoding and decoding 8-bit signed integers (`i8`).\n *\n * This codec serializes `i8` values using 1 byte.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `number`.\n *\n * @returns A `FixedSizeCodec` for encoding and decoding `i8` values.\n *\n * @example\n * Encoding and decoding an `i8` value.\n * ```ts\n * const codec = getI8Codec();\n * const bytes = codec.encode(-42); // 0xd6\n * const value = codec.decode(bytes); // -42\n * ```\n *\n * @remarks\n * This codec supports values between `-2^7` (`-128`) and `2^7 - 1` (`127`).\n *\n * - If you need a larger signed integer, consider using {@link getI16Codec}.\n * - If you need an unsigned integer, consider using {@link getU8Codec}.\n *\n * Separate {@link getI8Encoder} and {@link getI8Decoder} functions are available.\n *\n * ```ts\n * const bytes = getI8Encoder().encode(-42);\n * const value = getI8Decoder().decode(bytes);\n * ```\n *\n * @see {@link getI8Encoder}\n * @see {@link getI8Decoder}\n */\nexport const getI8Codec = (): FixedSizeCodec =>\n combineCodec(getI8Encoder(), getI8Decoder());\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n Offset,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertNumberIsBetweenForCodec } from './assertions';\n\n/**\n * Returns an encoder for `shortU16` values.\n *\n * This encoder serializes `shortU16` values using **1 to 3 bytes**.\n * Smaller values use fewer bytes, while larger values take up more space.\n *\n * For more details, see {@link getShortU16Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding `shortU16` values.\n *\n * @example\n * Encoding a `shortU16` value.\n * ```ts\n * const encoder = getShortU16Encoder();\n * encoder.encode(42); // 0x2a\n * encoder.encode(128); // 0x8001\n * encoder.encode(16384); // 0x808001\n * ```\n *\n * @see {@link getShortU16Codec}\n */\nexport const getShortU16Encoder = (): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: bigint | number): number => {\n if (value <= 0b01111111) return 1;\n if (value <= 0b0011111111111111) return 2;\n return 3;\n },\n maxSize: 3,\n write: (value: bigint | number, bytes: Uint8Array, offset: Offset): Offset => {\n assertNumberIsBetweenForCodec('shortU16', 0, 65535, value);\n const shortU16Bytes = [0];\n for (let ii = 0; ; ii += 1) {\n // Shift the bits of the value over such that the next 7 bits are at the right edge.\n const alignedValue = Number(value) >> (ii * 7);\n if (alignedValue === 0) {\n // No more bits to consume.\n break;\n }\n // Extract those 7 bits using a mask.\n const nextSevenBits = 0b1111111 & alignedValue;\n shortU16Bytes[ii] = nextSevenBits;\n if (ii > 0) {\n // Set the continuation bit of the previous slice.\n shortU16Bytes[ii - 1] |= 0b10000000;\n }\n }\n bytes.set(shortU16Bytes, offset);\n return offset + shortU16Bytes.length;\n },\n });\n\n/**\n * Returns a decoder for `shortU16` values.\n *\n * This decoder deserializes `shortU16` values from **1 to 3 bytes**.\n * The number of bytes used depends on the encoded value.\n *\n * For more details, see {@link getShortU16Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding `shortU16` values.\n *\n * @example\n * Decoding a `shortU16` value.\n * ```ts\n * const decoder = getShortU16Decoder();\n * decoder.decode(new Uint8Array([0x2a])); // 42\n * decoder.decode(new Uint8Array([0x80, 0x01])); // 128\n * decoder.decode(new Uint8Array([0x80, 0x80, 0x01])); // 16384\n * ```\n *\n * @see {@link getShortU16Codec}\n */\nexport const getShortU16Decoder = (): VariableSizeDecoder =>\n createDecoder({\n maxSize: 3,\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset): [number, Offset] => {\n let value = 0;\n let byteCount = 0;\n while (++byteCount) {\n const byteIndex = byteCount - 1;\n const currentByte = bytes[offset + byteIndex];\n const nextSevenBits = 0b1111111 & currentByte;\n // Insert the next group of seven bits into the correct slot of the output value.\n value |= nextSevenBits << (byteIndex * 7);\n if ((currentByte & 0b10000000) === 0) {\n // This byte does not have its continuation bit set. We're done.\n break;\n }\n }\n return [value, offset + byteCount];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding `shortU16` values.\n *\n * It serializes unsigned integers using **1 to 3 bytes** based on the encoded value.\n * The larger the value, the more bytes it uses.\n *\n * - If the value is `<= 0x7f` (127), it is stored in a **single byte**\n * and the first bit is set to `0` to indicate the end of the value.\n * - Otherwise, the first bit is set to `1` to indicate that the value continues in the next byte, which follows the same pattern.\n * - This process repeats until the value is fully encoded in up to 3 bytes. The third and last byte, if needed, uses all 8 bits to store the remaining value.\n *\n * In other words, the encoding scheme follows this structure:\n *\n * ```txt\n * 0XXXXXXX <- Values 0 to 127 (1 byte)\n * 1XXXXXXX 0XXXXXXX <- Values 128 to 16,383 (2 bytes)\n * 1XXXXXXX 1XXXXXXX XXXXXXXX <- Values 16,384 to 4,194,303 (3 bytes)\n * ```\n *\n * @returns A `VariableSizeCodec` for encoding and decoding `shortU16` values.\n *\n * @example\n * Encoding and decoding `shortU16` values.\n * ```ts\n * const codec = getShortU16Codec();\n * const bytes1 = codec.encode(42); // 0x2a\n * const bytes2 = codec.encode(128); // 0x8001\n * const bytes3 = codec.encode(16384); // 0x808001\n *\n * codec.decode(bytes1); // 42\n * codec.decode(bytes2); // 128\n * codec.decode(bytes3); // 16384\n * ```\n *\n * @remarks\n * This codec efficiently stores small numbers, making it useful for transactions and compact representations.\n *\n * If you need a fixed-size `u16` codec, consider using {@link getU16Codec}.\n *\n * Separate {@link getShortU16Encoder} and {@link getShortU16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getShortU16Encoder().encode(42);\n * const value = getShortU16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getShortU16Encoder}\n * @see {@link getShortU16Decoder}\n */\nexport const getShortU16Codec = (): VariableSizeCodec =>\n combineCodec(getShortU16Encoder(), getShortU16Decoder());\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 128-bit unsigned integers (`u128`).\n *\n * This encoder serializes `u128` values using sixteen bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU128Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeEncoder` for encoding `u128` values.\n *\n * @example\n * Encoding a `u128` value.\n * ```ts\n * const encoder = getU128Encoder();\n * const bytes = encoder.encode(42n); // 0x2a000000000000000000000000000000\n * ```\n *\n * @see {@link getU128Codec}\n */\nexport const getU128Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u128',\n range: [0n, BigInt('0xffffffffffffffffffffffffffffffff')],\n set: (view, value, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const rightMask = 0xffffffffffffffffn;\n view.setBigUint64(leftOffset, BigInt(value) >> 64n, le);\n view.setBigUint64(rightOffset, BigInt(value) & rightMask, le);\n },\n size: 16,\n });\n\n/**\n * Returns a decoder for 128-bit unsigned integers (`u128`).\n *\n * This decoder deserializes `u128` values from sixteen bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU128Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeDecoder` for decoding `u128` values.\n *\n * @example\n * Decoding a `u128` value.\n * ```ts\n * const decoder = getU128Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])); // 42n\n * ```\n *\n * @see {@link getU128Codec}\n */\nexport const getU128Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => {\n const leftOffset = le ? 8 : 0;\n const rightOffset = le ? 0 : 8;\n const left = view.getBigUint64(leftOffset, le);\n const right = view.getBigUint64(rightOffset, le);\n return (left << 64n) + right;\n },\n name: 'u128',\n size: 16,\n });\n\n/**\n * Returns a codec for encoding and decoding 128-bit unsigned integers (`u128`).\n *\n * This codec serializes `u128` values using 16 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `u128` values.\n *\n * @example\n * Encoding and decoding a `u128` value.\n * ```ts\n * const codec = getU128Codec();\n * const bytes = codec.encode(42); // 0x2a000000000000000000000000000000\n * const value = codec.decode(bytes); // 42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getU128Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x0000000000000000000000000000002a\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^128 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller unsigned integer, consider using {@link getU64Codec} or {@link getU32Codec}.\n * - If you need signed integers, consider using {@link getI128Codec}.\n *\n * Separate {@link getU128Encoder} and {@link getU128Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU128Encoder().encode(42);\n * const value = getU128Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU128Encoder}\n * @see {@link getU128Decoder}\n */\nexport const getU128Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU128Encoder(config), getU128Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 16-bit unsigned integers (`u16`).\n *\n * This encoder serializes `u16` values using two bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU16Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeEncoder` for encoding `u16` values.\n *\n * @example\n * Encoding a `u16` value.\n * ```ts\n * const encoder = getU16Encoder();\n * const bytes = encoder.encode(42); // 0x2a00\n * ```\n *\n * @see {@link getU16Codec}\n */\nexport const getU16Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u16',\n range: [0, Number('0xffff')],\n set: (view, value, le) => view.setUint16(0, Number(value), le),\n size: 2,\n });\n\n/**\n * Returns a decoder for 16-bit unsigned integers (`u16`).\n *\n * This decoder deserializes `u16` values from two bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU16Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeDecoder` for decoding `u16` values.\n *\n * @example\n * Decoding a `u16` value.\n * ```ts\n * const decoder = getU16Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00])); // 42\n * ```\n *\n * @see {@link getU16Codec}\n */\nexport const getU16Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getUint16(0, le),\n name: 'u16',\n size: 2,\n });\n\n/**\n * Returns a codec for encoding and decoding 16-bit unsigned integers (`u16`).\n *\n * This codec serializes `u16` values using two bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeCodec` for encoding and decoding `u16` values.\n *\n * @example\n * Encoding and decoding a `u16` value.\n * ```ts\n * const codec = getU16Codec();\n * const bytes = codec.encode(42); // 0x2a00 (little-endian)\n * const value = codec.decode(bytes); // 42\n * ```\n *\n * @example\n * Storing values in big-endian format.\n * ```ts\n * const codec = getU16Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x002a\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^16 - 1`.\n * If you need a larger range, consider using {@link getU32Codec} or {@link getU64Codec}.\n * For signed integers, use {@link getI16Codec}.\n *\n * Separate {@link getU16Encoder} and {@link getU16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU16Encoder().encode(42);\n * const value = getU16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU16Encoder}\n * @see {@link getU16Decoder}\n */\nexport const getU16Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU16Encoder(config), getU16Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 32-bit unsigned integers (`u32`).\n *\n * This encoder serializes `u32` values using four bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU32Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeEncoder` for encoding `u32` values.\n *\n * @example\n * Encoding a `u32` value.\n * ```ts\n * const encoder = getU32Encoder();\n * const bytes = encoder.encode(42); // 0x2a000000\n * ```\n *\n * @see {@link getU32Codec}\n */\nexport const getU32Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u32',\n range: [0, Number('0xffffffff')],\n set: (view, value, le) => view.setUint32(0, Number(value), le),\n size: 4,\n });\n\n/**\n * Returns a decoder for 32-bit unsigned integers (`u32`).\n *\n * This decoder deserializes `u32` values from four bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * For more details, see {@link getU32Codec}.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeDecoder` for decoding `u32` values.\n *\n * @example\n * Decoding a `u32` value.\n * ```ts\n * const decoder = getU32Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @see {@link getU32Codec}\n */\nexport const getU32Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getUint32(0, le),\n name: 'u32',\n size: 4,\n });\n\n/**\n * Returns a codec for encoding and decoding 32-bit unsigned integers (`u32`).\n *\n * This codec serializes `u32` values using four bytes in little-endian format by default.\n * You may specify big-endian storage using the `endian` option.\n *\n * @param config - Optional settings for endianness.\n * @returns A `FixedSizeCodec` for encoding and decoding `u32` values.\n *\n * @example\n * Encoding and decoding a `u32` value.\n * ```ts\n * const codec = getU32Codec();\n * const bytes = codec.encode(42); // 0x2a000000 (little-endian)\n * const value = codec.decode(bytes); // 42\n * ```\n *\n * @example\n * Storing values in big-endian format.\n * ```ts\n * const codec = getU32Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x0000002a\n * ```\n *\n * @remarks\n * This codec only supports values between `0` and `2^32 - 1`.\n * If you need a larger range, consider using {@link getU64Codec} or {@link getU128Codec}.\n * For signed integers, use {@link getI32Codec}.\n *\n * Separate {@link getU32Encoder} and {@link getU32Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU32Encoder().encode(42);\n * const value = getU32Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU32Encoder}\n * @see {@link getU32Decoder}\n */\nexport const getU32Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU32Encoder(config), getU32Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { NumberCodecConfig } from './common';\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 64-bit unsigned integers (`u64`).\n *\n * This encoder serializes `u64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`.\n *\n * For more details, see {@link getU64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeEncoder` for encoding `u64` values.\n *\n * @example\n * Encoding a `u64` value.\n * ```ts\n * const encoder = getU64Encoder();\n * const bytes = encoder.encode(42); // 0x2a00000000000000\n * ```\n *\n * @see {@link getU64Codec}\n */\nexport const getU64Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder =>\n numberEncoderFactory({\n config,\n name: 'u64',\n range: [0n, BigInt('0xffffffffffffffff')],\n set: (view, value, le) => view.setBigUint64(0, BigInt(value), le),\n size: 8,\n });\n\n/**\n * Returns a decoder for 64-bit unsigned integers (`u64`).\n *\n * This decoder deserializes `u64` values from 8 bytes.\n * The decoded value is always a `bigint`.\n *\n * For more details, see {@link getU64Codec}.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeDecoder` for decoding `u64` values.\n *\n * @example\n * Decoding a `u64` value.\n * ```ts\n * const decoder = getU64Decoder();\n * const value = decoder.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])); // 42n\n * ```\n *\n * @see {@link getU64Codec}\n */\nexport const getU64Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder =>\n numberDecoderFactory({\n config,\n get: (view, le) => view.getBigUint64(0, le),\n name: 'u64',\n size: 8,\n });\n\n/**\n * Returns a codec for encoding and decoding 64-bit unsigned integers (`u64`).\n *\n * This codec serializes `u64` values using 8 bytes.\n * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.\n *\n * @param config - Optional configuration to specify endianness (little by default).\n * @returns A `FixedSizeCodec` for encoding and decoding `u64` values.\n *\n * @example\n * Encoding and decoding a `u64` value.\n * ```ts\n * const codec = getU64Codec();\n * const bytes = codec.encode(42); // 0x2a00000000000000\n * const value = codec.decode(bytes); // 42n\n * ```\n *\n * @example\n * Using big-endian encoding.\n * ```ts\n * const codec = getU64Codec({ endian: Endian.Big });\n * const bytes = codec.encode(42); // 0x000000000000002a\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^64 - 1`.\n * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.\n *\n * - If you need a smaller unsigned integer, consider using {@link getU32Codec} or {@link getU16Codec}.\n * - If you need a larger unsigned integer, consider using {@link getU128Codec}.\n * - If you need signed integers, consider using {@link getI64Codec}.\n *\n * Separate {@link getU64Encoder} and {@link getU64Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU64Encoder().encode(42);\n * const value = getU64Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU64Encoder}\n * @see {@link getU64Decoder}\n */\nexport const getU64Codec = (config: NumberCodecConfig = {}): FixedSizeCodec =>\n combineCodec(getU64Encoder(config), getU64Decoder(config));\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\n\nimport { numberDecoderFactory, numberEncoderFactory } from './utils';\n\n/**\n * Returns an encoder for 8-bit unsigned integers (`u8`).\n *\n * This encoder serializes `u8` values using a single byte.\n *\n * For more details, see {@link getU8Codec}.\n *\n * @returns A `FixedSizeEncoder` for encoding `u8` values.\n *\n * @example\n * Encoding a `u8` value.\n * ```ts\n * const encoder = getU8Encoder();\n * const bytes = encoder.encode(42); // 0x2a\n * ```\n *\n * @see {@link getU8Codec}\n */\nexport const getU8Encoder = (): FixedSizeEncoder =>\n numberEncoderFactory({\n name: 'u8',\n range: [0, Number('0xff')],\n set: (view, value) => view.setUint8(0, Number(value)),\n size: 1,\n });\n\n/**\n * Returns a decoder for 8-bit unsigned integers (`u8`).\n *\n * This decoder deserializes `u8` values from a single byte.\n *\n * For more details, see {@link getU8Codec}.\n *\n * @returns A `FixedSizeDecoder` for decoding `u8` values.\n *\n * @example\n * Decoding a `u8` value.\n * ```ts\n * const decoder = getU8Decoder();\n * const value = decoder.decode(new Uint8Array([0xff])); // 255\n * ```\n *\n * @see {@link getU8Codec}\n */\nexport const getU8Decoder = (): FixedSizeDecoder =>\n numberDecoderFactory({\n get: view => view.getUint8(0),\n name: 'u8',\n size: 1,\n });\n\n/**\n * Returns a codec for encoding and decoding 8-bit unsigned integers (`u8`).\n *\n * This codec serializes `u8` values using a single byte.\n *\n * @returns A `FixedSizeCodec` for encoding and decoding `u8` values.\n *\n * @example\n * Encoding and decoding a `u8` value.\n * ```ts\n * const codec = getU8Codec();\n * const bytes = codec.encode(255); // 0xff\n * const value = codec.decode(bytes); // 255\n * ```\n *\n * @remarks\n * This codec supports values between `0` and `2^8 - 1` (0 to 255).\n * If you need larger integers, consider using {@link getU16Codec}, {@link getU32Codec}, or {@link getU64Codec}.\n * For signed integers, use {@link getI8Codec}.\n *\n * Separate {@link getU8Encoder} and {@link getU8Decoder} functions are available.\n *\n * ```ts\n * const bytes = getU8Encoder().encode(42);\n * const value = getU8Decoder().decode(bytes);\n * ```\n *\n * @see {@link getU8Encoder}\n * @see {@link getU8Decoder}\n */\nexport const getU8Codec = (): FixedSizeCodec =>\n combineCodec(getU8Encoder(), getU8Decoder());\n","import { SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, SolanaError } from '@solana/errors';\n\n/** Checks the number of items in an array-like structure is expected. */\nexport function assertValidNumberOfItemsForCodec(\n codecDescription: string,\n expected: bigint | number,\n actual: bigint | number,\n) {\n if (expected !== actual) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, {\n actual,\n codecDescription,\n expected,\n });\n }\n}\n","import { isFixedSize } from '@solana/codecs-core';\n\n/**\n * Functionally, this type helper is equivalent to the identity type — i.e. `type Identity = T`.\n * However, wrapping generic object mappings in this type significantly reduces the number\n * of instantiation expressions processed, which increases TypeScript performance and\n * prevents \"Type instantiation is excessively deep and possibly infinite\" errors.\n *\n * This works because TypeScript doesn't create a new level of nesting when encountering conditional generic types.\n * @see https://github.com/microsoft/TypeScript/issues/34933\n * @see https://github.com/kysely-org/kysely/pull/483\n */\nexport type DrainOuterGeneric = [T] extends [unknown] ? T : never;\n\nexport function maxCodecSizes(sizes: (number | null)[]): number | null {\n return sizes.reduce(\n (all, size) => (all === null || size === null ? null : Math.max(all, size)),\n 0 as number | null,\n );\n}\n\nexport function sumCodecSizes(sizes: (number | null)[]): number | null {\n return sizes.reduce((all, size) => (all === null || size === null ? null : all + size), 0 as number | null);\n}\n\nexport function getFixedSize(codec: { fixedSize: number } | { maxSize?: number }): number | null {\n return isFixedSize(codec) ? codec.fixedSize : null;\n}\n\nexport function getMaxSize(codec: { fixedSize: number } | { maxSize?: number }): number | null {\n return isFixedSize(codec) ? codec.fixedSize : (codec.maxSize ?? null);\n}\n","import {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getU32Decoder, getU32Encoder, NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\n\nimport { assertValidNumberOfItemsForCodec } from './assertions';\nimport { getFixedSize, getMaxSize } from './utils';\n\n/**\n * Defines the possible size strategies for array-like codecs (`array`, `map`, and `set`).\n *\n * The size of the collection can be determined using one of the following approaches:\n * - A {@link NumberCodec}, {@link NumberDecoder}, or {@link NumberEncoder} to store a size prefix.\n * - A fixed `number` of items, enforcing an exact length.\n * - The string `\"remainder\"`, which infers the number of items by consuming the rest of the available bytes.\n * This option is only available when encoding fixed-size items.\n *\n * @typeParam TPrefix - A number codec, decoder, or encoder used for size prefixing.\n */\nexport type ArrayLikeCodecSize =\n | TPrefix\n | number\n | 'remainder';\n\n/**\n * Defines the configuration options for array codecs.\n *\n * @typeParam TPrefix - A number codec, decoder, or encoder used for size prefixing.\n */\nexport type ArrayCodecConfig = {\n /**\n * Specifies how the size of the array is determined.\n *\n * - A {@link NumberCodec}, {@link NumberDecoder}, or {@link NumberEncoder} stores a size prefix before encoding the array.\n * - A `number` enforces a fixed number of elements.\n * - `\"remainder\"` uses all remaining bytes to infer the array length (only for fixed-size items).\n *\n * @defaultValue A `u32` size prefix.\n */\n size?: ArrayLikeCodecSize;\n};\n\n/**\n * Returns an encoder for arrays of values.\n *\n * This encoder serializes arrays by encoding each element using the provided item encoder.\n * By default, a `u32` size prefix is included to indicate the number of items in the array.\n * The `size` option can be used to modify this behaviour.\n *\n * For more details, see {@link getArrayCodec}.\n *\n * @typeParam TFrom - The type of the elements in the array.\n *\n * @param item - The encoder for each item in the array.\n * @param config - Optional configuration for the size encoding strategy.\n * @returns A `VariableSizeEncoder` for encoding arrays.\n *\n * @example\n * Encoding an array of `u8` numbers.\n * ```ts\n * const encoder = getArrayEncoder(getU8Encoder());\n * const bytes = encoder.encode([1, 2, 3]);\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix telling us to read 3 items.\n * ```\n *\n * @see {@link getArrayCodec}\n */\nexport function getArrayEncoder(\n item: Encoder,\n config: ArrayCodecConfig & { size: 0 },\n): FixedSizeEncoder;\nexport function getArrayEncoder(\n item: FixedSizeEncoder,\n config: ArrayCodecConfig & { size: number },\n): FixedSizeEncoder;\nexport function getArrayEncoder(\n item: Encoder,\n config?: ArrayCodecConfig,\n): VariableSizeEncoder;\nexport function getArrayEncoder(\n item: Encoder,\n config: ArrayCodecConfig = {},\n): Encoder {\n const size = config.size ?? getU32Encoder();\n const fixedSize = computeArrayLikeCodecSize(size, getFixedSize(item));\n const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? undefined;\n\n return createEncoder({\n ...(fixedSize !== null\n ? { fixedSize }\n : {\n getSizeFromValue: (array: TFrom[]) => {\n const prefixSize = typeof size === 'object' ? getEncodedSize(array.length, size) : 0;\n return prefixSize + [...array].reduce((all, value) => all + getEncodedSize(value, item), 0);\n },\n maxSize,\n }),\n write: (array: TFrom[], bytes, offset) => {\n if (typeof size === 'number') {\n assertValidNumberOfItemsForCodec('array', size, array.length);\n }\n if (typeof size === 'object') {\n offset = size.write(array.length, bytes, offset);\n }\n array.forEach(value => {\n offset = item.write(value, bytes, offset);\n });\n return offset;\n },\n });\n}\n\n/**\n * Returns a decoder for arrays of values.\n *\n * This decoder deserializes arrays by decoding each element using the provided item decoder.\n * By default, a `u32` size prefix is expected to indicate the number of items in the array.\n * The `size` option can be used to modify this behaviour.\n *\n * For more details, see {@link getArrayCodec}.\n *\n * @typeParam TTo - The type of the decoded elements in the array.\n *\n * @param item - The decoder for each item in the array.\n * @param config - Optional configuration for the size decoding strategy.\n * @returns A `VariableSizeDecoder` for decoding arrays.\n *\n * @example\n * Decoding an array of `u8` numbers.\n * ```ts\n * const decoder = getArrayDecoder(getU8Decoder());\n * const array = decoder.decode(new Uint8Array([0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03]));\n * // [1, 2, 3]\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix telling us to read 3 items.\n * ```\n *\n * @see {@link getArrayCodec}\n */\nexport function getArrayDecoder(\n item: Decoder,\n config: ArrayCodecConfig & { size: 0 },\n): FixedSizeDecoder;\nexport function getArrayDecoder(\n item: FixedSizeDecoder,\n config: ArrayCodecConfig & { size: number },\n): FixedSizeDecoder;\nexport function getArrayDecoder(\n item: Decoder,\n config?: ArrayCodecConfig,\n): VariableSizeDecoder;\nexport function getArrayDecoder(item: Decoder, config: ArrayCodecConfig = {}): Decoder {\n const size = config.size ?? getU32Decoder();\n const itemSize = getFixedSize(item);\n const fixedSize = computeArrayLikeCodecSize(size, itemSize);\n const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? undefined;\n\n return createDecoder({\n ...(fixedSize !== null ? { fixedSize } : { maxSize }),\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const array: TTo[] = [];\n if (typeof size === 'object' && bytes.slice(offset).length === 0) {\n return [array, offset];\n }\n\n if (size === 'remainder') {\n while (offset < bytes.length) {\n const [value, newOffset] = item.read(bytes, offset);\n offset = newOffset;\n array.push(value);\n }\n return [array, offset];\n }\n\n const [resolvedSize, newOffset] = typeof size === 'number' ? [size, offset] : size.read(bytes, offset);\n offset = newOffset;\n for (let i = 0; i < resolvedSize; i += 1) {\n const [value, newOffset] = item.read(bytes, offset);\n offset = newOffset;\n array.push(value);\n }\n return [array, offset];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding arrays of values.\n *\n * This codec serializes arrays by encoding each element using the provided item codec.\n * By default, a `u32` size prefix is included to indicate the number of items in the array.\n * The `size` option can be used to modify this behaviour.\n *\n * @typeParam TFrom - The type of the elements to encode.\n * @typeParam TTo - The type of the decoded elements.\n *\n * @param item - The codec for each item in the array.\n * @param config - Optional configuration for the size encoding/decoding strategy.\n * @returns A `VariableSizeCodec` for encoding and decoding arrays.\n *\n * @example\n * Encoding and decoding an array of `u8` numbers.\n * ```ts\n * const codec = getArrayCodec(getU8Codec());\n * const bytes = codec.encode([1, 2, 3]);\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix telling us to read 3 items.\n *\n * const array = codec.decode(bytes);\n * // [1, 2, 3]\n * ```\n *\n * @example\n * Using a `u16` size prefix instead of `u32`.\n * ```ts\n * const codec = getArrayCodec(getU8Codec(), { size: getU16Codec() });\n * const bytes = codec.encode([1, 2, 3]);\n * // 0x0300010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 2-byte prefix telling us to read 3 items.\n * ```\n *\n * @example\n * Using a fixed-size array of 3 items.\n * ```ts\n * const codec = getArrayCodec(getU8Codec(), { size: 3 });\n * codec.encode([1, 2, 3]);\n * // 0x010203\n * // └-- 3 items of 1 byte each. There must always be 3 items in the array.\n * ```\n *\n * @example\n * Using the `\"remainder\"` size strategy.\n * ```ts\n * const codec = getArrayCodec(getU8Codec(), { size: 'remainder' });\n * codec.encode([1, 2, 3]);\n * // 0x010203\n * // └-- 3 items of 1 byte each. The size is inferred from the remainder of the bytes.\n * ```\n *\n * @remarks\n * The size of the array can be controlled using the `size` option:\n * - A `Codec` (e.g. `getU16Codec()`) stores a size prefix before the array.\n * - A `number` enforces a fixed number of elements.\n * - `\"remainder\"` uses all remaining bytes to infer the array length.\n *\n * Separate {@link getArrayEncoder} and {@link getArrayDecoder} functions are available.\n *\n * ```ts\n * const bytes = getArrayEncoder(getU8Encoder()).encode([1, 2, 3]);\n * const array = getArrayDecoder(getU8Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getArrayEncoder}\n * @see {@link getArrayDecoder}\n */\nexport function getArrayCodec(\n item: Codec,\n config: ArrayCodecConfig & { size: 0 },\n): FixedSizeCodec;\nexport function getArrayCodec(\n item: FixedSizeCodec,\n config: ArrayCodecConfig & { size: number },\n): FixedSizeCodec;\nexport function getArrayCodec(\n item: Codec,\n config?: ArrayCodecConfig,\n): VariableSizeCodec;\nexport function getArrayCodec(\n item: Codec,\n config: ArrayCodecConfig = {},\n): Codec {\n return combineCodec(getArrayEncoder(item, config as object), getArrayDecoder(item, config as object));\n}\n\nfunction computeArrayLikeCodecSize(size: number | object | 'remainder', itemSize: number | null): number | null {\n if (typeof size !== 'number') return null;\n if (size === 0) return 0;\n return itemSize === null ? null : itemSize * size;\n}\n","import {\n assertByteArrayHasEnoughBytesForCodec,\n combineCodec,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n} from '@solana/codecs-core';\n\n/**\n * Defines the configuration options for bit array codecs.\n *\n * A bit array codec encodes an array of booleans into bits, packing them into bytes.\n * This configuration allows adjusting the bit ordering.\n *\n * @see {@link getBitArrayEncoder}\n * @see {@link getBitArrayDecoder}\n * @see {@link getBitArrayCodec}\n */\nexport type BitArrayCodecConfig = {\n /**\n * Determines whether the bits should be read in reverse order.\n *\n * - `false` (default): The first boolean is stored in the most significant bit (MSB-first).\n * - `true`: The first boolean is stored in the least significant bit (LSB-first).\n *\n * @defaultValue `false`\n */\n backward?: boolean;\n};\n\n/**\n * Returns an encoder that packs an array of booleans into bits.\n *\n * This encoder converts a list of `boolean` values into a compact bit representation,\n * storing 8 booleans per byte.\n *\n * The `backward` config option determines whether the bits are stored in MSB-first (`false`)\n * or LSB-first (`true`).\n *\n * For more details, see {@link getBitArrayCodec}.\n *\n * @typeParam TSize - The number of bytes used to store the bit array.\n *\n * @param size - The number of bytes allocated for the bit array (must be sufficient for the expected boolean count).\n * @param config - Configuration options for encoding the bit array.\n * @returns A `FixedSizeEncoder` for encoding bit arrays.\n *\n * @example\n * Encoding a bit array.\n * ```ts\n * const encoder = getBitArrayEncoder(1);\n *\n * encoder.encode([true, false, true, false, false, false, false, false]);\n * // 0xa0 (0b10100000)\n * ```\n *\n * @see {@link getBitArrayCodec}\n */\nexport function getBitArrayEncoder(\n size: TSize,\n config: BitArrayCodecConfig | boolean = {},\n): FixedSizeEncoder {\n const parsedConfig: BitArrayCodecConfig = typeof config === 'boolean' ? { backward: config } : config;\n const backward = parsedConfig.backward ?? false;\n return createEncoder({\n fixedSize: size,\n write(value: boolean[], bytes, offset) {\n const bytesToAdd: number[] = [];\n\n for (let i = 0; i < size; i += 1) {\n let byte = 0;\n for (let j = 0; j < 8; j += 1) {\n const feature = Number(value[i * 8 + j] ?? 0);\n byte |= feature << (backward ? j : 7 - j);\n }\n if (backward) {\n bytesToAdd.unshift(byte);\n } else {\n bytesToAdd.push(byte);\n }\n }\n\n bytes.set(bytesToAdd, offset);\n return size;\n },\n });\n}\n\n/**\n * Returns a decoder that unpacks bits into an array of booleans.\n *\n * This decoder converts a compact bit representation back into a list of `boolean` values.\n * Each byte is expanded into 8 booleans.\n *\n * The `backward` config option determines whether the bits are read in MSB-first (`false`)\n * or LSB-first (`true`).\n *\n * For more details, see {@link getBitArrayCodec}.\n *\n * @typeParam TSize - The number of bytes used to store the bit array.\n *\n * @param size - The number of bytes allocated for the bit array (must be sufficient for the expected boolean count).\n * @param config - Configuration options for decoding the bit array.\n * @returns A `FixedSizeDecoder` for decoding bit arrays.\n *\n * @example\n * Decoding a bit array.\n * ```ts\n * const decoder = getBitArrayDecoder(1);\n *\n * decoder.decode(new Uint8Array([0xa0]));\n * // [true, false, true, false, false, false, false, false]\n * ```\n *\n * @see {@link getBitArrayCodec}\n */\nexport function getBitArrayDecoder(\n size: TSize,\n config: BitArrayCodecConfig | boolean = {},\n): FixedSizeDecoder {\n const parsedConfig: BitArrayCodecConfig = typeof config === 'boolean' ? { backward: config } : config;\n const backward = parsedConfig.backward ?? false;\n return createDecoder({\n fixedSize: size,\n read(bytes, offset) {\n assertByteArrayHasEnoughBytesForCodec('bitArray', size, bytes, offset);\n const booleans: boolean[] = [];\n let slice = bytes.slice(offset, offset + size);\n slice = backward ? slice.reverse() : slice;\n\n slice.forEach(byte => {\n for (let i = 0; i < 8; i += 1) {\n if (backward) {\n booleans.push(Boolean(byte & 1));\n byte >>= 1;\n } else {\n booleans.push(Boolean(byte & 0b1000_0000));\n byte <<= 1;\n }\n }\n });\n\n return [booleans, offset + size];\n },\n });\n}\n\n/**\n * Returns a codec that encodes and decodes boolean arrays as compact bit representations.\n *\n * This codec efficiently stores boolean arrays as bits, packing 8 values per byte.\n * The `backward` config option determines whether bits are stored in MSB-first (`false`)\n * or LSB-first (`true`).\n *\n * @typeParam TSize - The number of bytes used to store the bit array.\n *\n * @param size - The number of bytes allocated for the bit array (must be sufficient for the expected boolean count).\n * @param config - Configuration options for encoding and decoding the bit array.\n * @returns A `FixedSizeCodec` for encoding and decoding bit arrays.\n *\n * @example\n * Encoding and decoding a bit array.\n * ```ts\n * const codec = getBitArrayCodec(1);\n *\n * codec.encode([true, false, true, false, false, false, false, false]);\n * // 0xa0 (0b10100000)\n *\n * codec.decode(new Uint8Array([0xa0]));\n * // [true, false, true, false, false, false, false, false]\n * ```\n *\n * @example\n * Encoding and decoding a bit array backwards.\n * ```ts\n * const codec = getBitArrayCodec(1, { backward: true });\n *\n * codec.encode([true, false, true, false, false, false, false, false]);\n * // 0x05 (0b00000101)\n *\n * codec.decode(new Uint8Array([0x05]));\n * // [true, false, true, false, false, false, false, false]\n * ```\n *\n * @remarks\n * Separate {@link getBitArrayEncoder} and {@link getBitArrayDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBitArrayEncoder(1).encode([true, false, true, false]);\n * const value = getBitArrayDecoder(1).decode(bytes);\n * ```\n *\n * @see {@link getBitArrayEncoder}\n * @see {@link getBitArrayDecoder}\n */\nexport function getBitArrayCodec(\n size: TSize,\n config: BitArrayCodecConfig | boolean = {},\n): FixedSizeCodec {\n return combineCodec(getBitArrayEncoder(size, config), getBitArrayDecoder(size, config));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\n\n/**\n * Defines the configuration options for boolean codecs.\n *\n * A boolean codec encodes `true` as `1` and `false` as `0`.\n * The `size` option allows customizing the number codec used for storage.\n *\n * @typeParam TSize - A number codec, encoder, or decoder used for boolean representation.\n *\n * @see {@link getBooleanEncoder}\n * @see {@link getBooleanDecoder}\n * @see {@link getBooleanCodec}\n */\nexport type BooleanCodecConfig = {\n /**\n * The number codec used to store boolean values.\n *\n * - By default, booleans are stored as a `u8` (`1` for `true`, `0` for `false`).\n * - A custom number codec can be provided to change the storage size.\n *\n * @defaultValue `u8`\n */\n size?: TSize;\n};\n\n/**\n * Returns an encoder for boolean values.\n *\n * This encoder converts `true` into `1` and `false` into `0`.\n * The `size` option allows customizing the number codec used for storage.\n *\n * For more details, see {@link getBooleanCodec}.\n *\n * @param config - Configuration options for encoding booleans.\n * @returns A `FixedSizeEncoder` where `N` is the size of the number codec.\n *\n * @example\n * Encoding booleans.\n * ```ts\n * const encoder = getBooleanEncoder();\n *\n * encoder.encode(false); // 0x00\n * encoder.encode(true); // 0x01\n * ```\n *\n * @see {@link getBooleanCodec}\n */\nexport function getBooleanEncoder(): FixedSizeEncoder;\nexport function getBooleanEncoder(\n config: BooleanCodecConfig & { size: FixedSizeNumberEncoder },\n): FixedSizeEncoder;\nexport function getBooleanEncoder(config: BooleanCodecConfig): VariableSizeEncoder;\nexport function getBooleanEncoder(config: BooleanCodecConfig = {}): Encoder {\n return transformEncoder(config.size ?? getU8Encoder(), (value: boolean) => (value ? 1 : 0));\n}\n\n/**\n * Returns a decoder for boolean values.\n *\n * This decoder reads a number and interprets `1` as `true` and `0` as `false`.\n * The `size` option allows customizing the number codec used for storage.\n *\n * For more details, see {@link getBooleanCodec}.\n *\n * @param config - Configuration options for decoding booleans.\n * @returns A `FixedSizeDecoder` where `N` is the size of the number codec.\n *\n * @example\n * Decoding booleans.\n * ```ts\n * const decoder = getBooleanDecoder();\n *\n * decoder.decode(new Uint8Array([0x00])); // false\n * decoder.decode(new Uint8Array([0x01])); // true\n * ```\n *\n * @see {@link getBooleanCodec}\n */\nexport function getBooleanDecoder(): FixedSizeDecoder;\nexport function getBooleanDecoder(\n config: BooleanCodecConfig & { size: FixedSizeNumberDecoder },\n): FixedSizeDecoder;\nexport function getBooleanDecoder(config: BooleanCodecConfig): VariableSizeDecoder;\nexport function getBooleanDecoder(config: BooleanCodecConfig = {}): Decoder {\n return transformDecoder(config.size ?? getU8Decoder(), (value: bigint | number): boolean => Number(value) === 1);\n}\n\n/**\n * Returns a codec for encoding and decoding boolean values.\n *\n * By default, booleans are stored as a `u8` (`1` for `true`, `0` for `false`).\n * The `size` option allows customizing the number codec used for storage.\n *\n * @param config - Configuration options for encoding and decoding booleans.\n * @returns A `FixedSizeCodec` where `N` is the size of the number codec.\n *\n * @example\n * Encoding and decoding booleans using a `u8` (default).\n * ```ts\n * const codec = getBooleanCodec();\n *\n * codec.encode(false); // 0x00\n * codec.encode(true); // 0x01\n *\n * codec.decode(new Uint8Array([0x00])); // false\n * codec.decode(new Uint8Array([0x01])); // true\n * ```\n *\n * @example\n * Encoding and decoding booleans using a custom number codec.\n * ```ts\n * const codec = getBooleanCodec({ size: getU16Codec() });\n *\n * codec.encode(false); // 0x0000\n * codec.encode(true); // 0x0100\n *\n * codec.decode(new Uint8Array([0x00, 0x00])); // false\n * codec.decode(new Uint8Array([0x01, 0x00])); // true\n * ```\n *\n * @remarks\n * Separate {@link getBooleanEncoder} and {@link getBooleanDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBooleanEncoder().encode(true);\n * const value = getBooleanDecoder().decode(bytes);\n * ```\n *\n * @see {@link getBooleanEncoder}\n * @see {@link getBooleanDecoder}\n */\nexport function getBooleanCodec(): FixedSizeCodec;\nexport function getBooleanCodec(\n config: BooleanCodecConfig & { size: FixedSizeNumberCodec },\n): FixedSizeCodec;\nexport function getBooleanCodec(config: BooleanCodecConfig): VariableSizeCodec;\nexport function getBooleanCodec(config: BooleanCodecConfig = {}): Codec {\n return combineCodec(getBooleanEncoder(config), getBooleanDecoder(config));\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\n/**\n * Returns an encoder for raw byte arrays.\n *\n * This encoder writes byte arrays exactly as provided without modification.\n *\n * The size of the encoded byte array is determined by the length of the input.\n * - To enforce a fixed size, consider using {@link fixEncoderSize}.\n * - To add a size prefix, use {@link addEncoderSizePrefix}.\n * - To add a sentinel value, use {@link addEncoderSentinel}.\n *\n * For more details, see {@link getBytesCodec}.\n *\n * @returns A `VariableSizeEncoder`.\n *\n * @example\n * Encoding a byte array as-is.\n * ```ts\n * const encoder = getBytesEncoder();\n *\n * encoder.encode(new Uint8Array([1, 2, 3])); // 0x010203\n * encoder.encode(new Uint8Array([255, 0, 127])); // 0xff007f\n * ```\n *\n * @see {@link getBytesCodec}\n */\nexport function getBytesEncoder(): VariableSizeEncoder {\n return createEncoder({\n getSizeFromValue: value => value.length,\n write: (value, bytes, offset) => {\n bytes.set(value, offset);\n return offset + value.length;\n },\n });\n}\n\n/**\n * Returns a decoder for raw byte arrays.\n *\n * This decoder reads byte arrays exactly as provided without modification.\n *\n * The decoded byte array extends from the provided offset to the end of the input.\n * - To enforce a fixed size, consider using {@link fixDecoderSize}.\n * - To add a size prefix, use {@link addDecoderSizePrefix}.\n * - To add a sentinel value, use {@link addDecoderSentinel}.\n *\n * For more details, see {@link getBytesCodec}.\n *\n * @returns A `VariableSizeDecoder`.\n *\n * @example\n * Decoding a byte array as-is.\n * ```ts\n * const decoder = getBytesDecoder();\n *\n * decoder.decode(new Uint8Array([1, 2, 3])); // Uint8Array([1, 2, 3])\n * decoder.decode(new Uint8Array([255, 0, 127])); // Uint8Array([255, 0, 127])\n * ```\n *\n * @see {@link getBytesCodec}\n */\nexport function getBytesDecoder(): VariableSizeDecoder {\n return createDecoder({\n read: (bytes, offset) => {\n const slice = bytes.slice(offset);\n return [slice, offset + slice.length];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding raw byte arrays.\n *\n * This codec serializes and deserializes byte arrays without modification.\n *\n * The size of the encoded and decoded byte array is determined dynamically.\n * This means, when reading, the codec will consume all remaining bytes in the input.\n * - To enforce a fixed size, consider using {@link fixCodecSize}.\n * - To add a size prefix, use {@link addCodecSizePrefix}.\n * - To add a sentinel value, use {@link addCodecSentinel}.\n *\n * @returns A `VariableSizeCodec`.\n *\n * @example\n * Encoding and decoding a byte array.\n * ```ts\n * const codec = getBytesCodec();\n *\n * codec.encode(new Uint8Array([1, 2, 3])); // 0x010203\n * codec.decode(new Uint8Array([255, 0, 127])); // Uint8Array([255, 0, 127])\n * ```\n *\n * @remarks\n * Separate {@link getBytesEncoder} and {@link getBytesDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBytesEncoder().encode(new Uint8Array([1, 2, 3]));\n * const value = getBytesDecoder().decode(bytes);\n * ```\n *\n * @see {@link getBytesEncoder}\n * @see {@link getBytesDecoder}\n */\nexport function getBytesCodec(): VariableSizeCodec {\n return combineCodec(getBytesEncoder(), getBytesDecoder());\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\nconst enum HexC {\n ZERO = 48, // 0\n NINE = 57, // 9\n A_UP = 65, // A\n F_UP = 70, // F\n A_LO = 97, // a\n F_LO = 102, // f\n}\n\nconst INVALID_STRING_ERROR_BASE_CONFIG = {\n alphabet: '0123456789abcdef',\n base: 16,\n} as const;\n\nfunction charCodeToBase16(char: number) {\n if (char >= HexC.ZERO && char <= HexC.NINE) return char - HexC.ZERO;\n if (char >= HexC.A_UP && char <= HexC.F_UP) return char - (HexC.A_UP - 10);\n if (char >= HexC.A_LO && char <= HexC.F_LO) return char - (HexC.A_LO - 10);\n}\n\n/**\n * Returns an encoder for base-16 (hexadecimal) strings.\n *\n * This encoder serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-16 strings.\n *\n * @example\n * Encoding a base-16 string.\n * ```ts\n * const encoder = getBase16Encoder();\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Encoder = (): VariableSizeEncoder =>\n createEncoder({\n getSizeFromValue: (value: string) => Math.ceil(value.length / 2),\n write(value: string, bytes, offset) {\n const len = value.length;\n const al = len / 2;\n if (len === 1) {\n const c = value.charCodeAt(0);\n const n = charCodeToBase16(c);\n if (n === undefined) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n bytes.set([n], offset);\n return 1 + offset;\n }\n const hexBytes = new Uint8Array(al);\n for (let i = 0, j = 0; i < al; i++) {\n const c1 = value.charCodeAt(j++);\n const c2 = value.charCodeAt(j++);\n\n const n1 = charCodeToBase16(c1);\n const n2 = charCodeToBase16(c2);\n if (n1 === undefined || (n2 === undefined && !Number.isNaN(c2))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n ...INVALID_STRING_ERROR_BASE_CONFIG,\n value,\n });\n }\n hexBytes[i] = !Number.isNaN(c2) ? (n1 << 4) | (n2 ?? 0) : n1;\n }\n\n bytes.set(hexBytes, offset);\n return hexBytes.length + offset;\n },\n });\n\n/**\n * Returns a decoder for base-16 (hexadecimal) strings.\n *\n * This decoder deserializes base-16 encoded strings from a byte array.\n *\n * For more details, see {@link getBase16Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-16 strings.\n *\n * @example\n * Decoding a base-16 string.\n * ```ts\n * const decoder = getBase16Decoder();\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBase16Codec}\n */\nexport const getBase16Decoder = (): VariableSizeDecoder =>\n createDecoder({\n read(bytes, offset) {\n const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n return [value, bytes.length];\n },\n });\n\n/**\n * Returns a codec for encoding and decoding base-16 (hexadecimal) strings.\n *\n * This codec serializes strings using a base-16 encoding scheme.\n * The output consists of bytes representing the hexadecimal values of the input string.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-16 strings.\n *\n * @example\n * Encoding and decoding a base-16 string.\n * ```ts\n * const codec = getBase16Codec();\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-16 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase16Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-16 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase16Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase16Encoder} and {@link getBase16Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase16Encoder().encode('deadface');\n * const value = getBase16Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase16Encoder}\n * @see {@link getBase16Decoder}\n */\nexport const getBase16Codec = (): VariableSizeCodec => combineCodec(getBase16Encoder(), getBase16Decoder());\n","import {\n combineCodec,\n containsBytes,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\nimport { getBase16Decoder } from '@solana/codecs-strings';\nimport { SOLANA_ERROR__CODECS__INVALID_CONSTANT, SolanaError } from '@solana/errors';\n\n/**\n * Returns an encoder that always writes a predefined constant byte sequence.\n *\n * This encoder ensures that encoding always produces the specified byte array,\n * ignoring any input values.\n *\n * For more details, see {@link getConstantCodec}.\n *\n * @typeParam TConstant - The fixed byte sequence that will be written during encoding.\n *\n * @param constant - The predefined byte array to encode.\n * @returns A `FixedSizeEncoder` where `N` is the length of the constant.\n *\n * @example\n * Encoding a constant magic number.\n * ```ts\n * const encoder = getConstantEncoder(new Uint8Array([1, 2, 3, 4]));\n *\n * const bytes = encoder.encode();\n * // 0x01020304\n * // └──────┘ The predefined 4-byte constant.\n * ```\n *\n * @see {@link getConstantCodec}\n */\nexport function getConstantEncoder(\n constant: TConstant,\n): FixedSizeEncoder {\n return createEncoder({\n fixedSize: constant.length,\n write: (_, bytes, offset) => {\n bytes.set(constant, offset);\n return offset + constant.length;\n },\n });\n}\n\n/**\n * Returns a decoder that verifies a predefined constant byte sequence.\n *\n * This decoder reads the next bytes and checks that they match the provided constant.\n * If the bytes differ, it throws an error.\n *\n * For more details, see {@link getConstantCodec}.\n *\n * @typeParam TConstant - The fixed byte sequence expected during decoding.\n *\n * @param constant - The predefined byte array to verify.\n * @returns A `FixedSizeDecoder` where `N` is the length of the constant.\n *\n * @example\n * Decoding a constant magic number.\n * ```ts\n * const decoder = getConstantDecoder(new Uint8Array([1, 2, 3]));\n *\n * decoder.decode(new Uint8Array([1, 2, 3])); // Passes\n * decoder.decode(new Uint8Array([1, 2, 4])); // Throws an error\n * ```\n *\n * @see {@link getConstantCodec}\n */\nexport function getConstantDecoder(\n constant: TConstant,\n): FixedSizeDecoder {\n return createDecoder({\n fixedSize: constant.length,\n read: (bytes, offset) => {\n const base16 = getBase16Decoder();\n if (!containsBytes(bytes, constant, offset)) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_CONSTANT, {\n constant,\n data: bytes,\n hexConstant: base16.decode(constant),\n hexData: base16.decode(bytes),\n offset,\n });\n }\n return [undefined, offset + constant.length];\n },\n });\n}\n\n/**\n * Returns a codec that encodes and decodes a predefined constant byte sequence.\n *\n * - **Encoding:** Always writes the specified byte array.\n * - **Decoding:** Asserts that the next bytes match the constant, throwing an error if they do not.\n *\n * This is useful for encoding fixed byte patterns required in a binary format or to use in\n * conjunction with other codecs such as {@link getHiddenPrefixCodec} or {@link getHiddenSuffixCodec}.\n *\n * @typeParam TConstant - The fixed byte sequence to encode and verify during decoding.\n *\n * @param constant - The predefined byte array to encode and assert during decoding.\n * @returns A `FixedSizeCodec` where `N` is the length of the constant.\n *\n * @example\n * Encoding and decoding a constant magic number.\n * ```ts\n * const codec = getConstantCodec(new Uint8Array([1, 2, 3]));\n *\n * codec.encode(); // 0x010203\n * codec.decode(new Uint8Array([1, 2, 3])); // Passes\n * codec.decode(new Uint8Array([1, 2, 4])); // Throws an error\n * ```\n *\n * @remarks\n * Separate {@link getConstantEncoder} and {@link getConstantDecoder} functions are available.\n *\n * ```ts\n * const bytes = getConstantEncoder(new Uint8Array([1, 2, 3])).encode();\n * getConstantDecoder(new Uint8Array([1, 2, 3])).decode(bytes);\n * ```\n *\n * @see {@link getConstantEncoder}\n * @see {@link getConstantDecoder}\n */\nexport function getConstantCodec(\n constant: TConstant,\n): FixedSizeCodec {\n return combineCodec(getConstantEncoder(constant), getConstantDecoder(constant));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidNumberOfItemsForCodec } from './assertions';\nimport { DrainOuterGeneric, getFixedSize, getMaxSize, sumCodecSizes } from './utils';\n\n/**\n * Infers the TypeScript type for a tuple that can be encoded using a tuple codec.\n *\n * This type maps each provided item encoder to its corresponding value type.\n *\n * @typeParam TItems - An array of encoders, each corresponding to a tuple element.\n */\ntype GetEncoderTypeFromItems[]> = DrainOuterGeneric<{\n [I in keyof TItems]: TItems[I] extends Encoder ? TFrom : never;\n}>;\n\n/**\n * Infers the TypeScript type for a tuple that can be decoded using a tuple codec.\n *\n * This type maps each provided item decoder to its corresponding value type.\n *\n * @typeParam TItems - An array of decoders, each corresponding to a tuple element.\n */\ntype GetDecoderTypeFromItems[]> = DrainOuterGeneric<{\n [I in keyof TItems]: TItems[I] extends Decoder ? TTo : never;\n}>;\n\n/**\n * Returns an encoder for tuples.\n *\n * This encoder serializes a fixed-size array (tuple) by encoding its items\n * sequentially using the provided item encoders.\n *\n * For more details, see {@link getTupleCodec}.\n *\n * @typeParam TItems - An array of encoders, each corresponding to a tuple element.\n *\n * @param items - The encoders for each item in the tuple.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding tuples.\n *\n * @example\n * Encoding a tuple with 2 items.\n * ```ts\n * const encoder = getTupleEncoder([fixCodecSize(getUtf8Encoder(), 5), getU8Encoder()]);\n *\n * const bytes = encoder.encode(['Alice', 42]);\n * // 0x416c6963652a\n * // | └── Second item (42)\n * // └── First item (\"Alice\")\n * ```\n *\n * @see {@link getTupleCodec}\n */\nexport function getTupleEncoder[]>(\n items: TItems,\n): FixedSizeEncoder>;\nexport function getTupleEncoder[]>(\n items: TItems,\n): VariableSizeEncoder>;\nexport function getTupleEncoder[]>(\n items: TItems,\n): Encoder> {\n type TFrom = GetEncoderTypeFromItems;\n const fixedSize = sumCodecSizes(items.map(getFixedSize));\n const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? undefined;\n\n return createEncoder({\n ...(fixedSize === null\n ? {\n getSizeFromValue: (value: TFrom) =>\n items.map((item, index) => getEncodedSize(value[index], item)).reduce((all, one) => all + one, 0),\n maxSize,\n }\n : { fixedSize }),\n write: (value: TFrom, bytes, offset) => {\n assertValidNumberOfItemsForCodec('tuple', items.length, value.length);\n items.forEach((item, index) => {\n offset = item.write(value[index], bytes, offset);\n });\n return offset;\n },\n });\n}\n\n/**\n * Returns a decoder for tuples.\n *\n * This decoder deserializes a fixed-size array (tuple) by decoding its items\n * sequentially using the provided item decoders.\n *\n * For more details, see {@link getTupleCodec}.\n *\n * @typeParam TItems - An array of decoders, each corresponding to a tuple element.\n *\n * @param items - The decoders for each item in the tuple.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding tuples.\n *\n * @example\n * Decoding a tuple with 2 items.\n * ```ts\n * const decoder = getTupleDecoder([fixCodecSize(getUtf8Decoder(), 5), getU8Decoder()]);\n *\n * const tuple = decoder.decode(new Uint8Array([\n * 0x41,0x6c,0x69,0x63,0x65,0x2a\n * ]));\n * // ['Alice', 42]\n * ```\n *\n * @see {@link getTupleCodec}\n */\nexport function getTupleDecoder[]>(\n items: TItems,\n): FixedSizeDecoder>;\nexport function getTupleDecoder[]>(\n items: TItems,\n): VariableSizeDecoder>;\nexport function getTupleDecoder[]>(\n items: TItems,\n): Decoder> {\n type TTo = GetDecoderTypeFromItems;\n const fixedSize = sumCodecSizes(items.map(getFixedSize));\n const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? undefined;\n\n return createDecoder({\n ...(fixedSize === null ? { maxSize } : { fixedSize }),\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const values = [] as Array & TTo;\n items.forEach(item => {\n const [newValue, newOffset] = item.read(bytes, offset);\n values.push(newValue);\n offset = newOffset;\n });\n return [values, offset];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding tuples.\n *\n * This codec serializes tuples by encoding and decoding each item sequentially.\n *\n * Unlike the {@link getArrayCodec} codec, each item in the tuple has its own codec\n * and, therefore, can be of a different type.\n *\n * @typeParam TItems - An array of codecs, each corresponding to a tuple element.\n *\n * @param items - The codecs for each item in the tuple.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding tuples.\n *\n * @example\n * Encoding and decoding a tuple with 2 items.\n * ```ts\n * const codec = getTupleCodec([fixCodecSize(getUtf8Codec(), 5), getU8Codec()]);\n *\n * const bytes = codec.encode(['Alice', 42]);\n * // 0x416c6963652a\n * // | └── Second item (42)\n * // └── First item (\"Alice\")\n *\n * const tuple = codec.decode(bytes);\n * // ['Alice', 42]\n * ```\n *\n * @remarks\n * Separate {@link getTupleEncoder} and {@link getTupleDecoder} functions are available.\n *\n * ```ts\n * const bytes = getTupleEncoder([fixCodecSize(getUtf8Encoder(), 5), getU8Encoder()])\n * .encode(['Alice', 42]);\n *\n * const tuple = getTupleDecoder([fixCodecSize(getUtf8Decoder(), 5), getU8Decoder()])\n * .decode(bytes);\n * ```\n *\n * @see {@link getTupleEncoder}\n * @see {@link getTupleDecoder}\n */\nexport function getTupleCodec[]>(\n items: TItems,\n): FixedSizeCodec, GetDecoderTypeFromItems & GetEncoderTypeFromItems>;\nexport function getTupleCodec[]>(\n items: TItems,\n): VariableSizeCodec<\n GetEncoderTypeFromItems,\n GetDecoderTypeFromItems & GetEncoderTypeFromItems\n>;\nexport function getTupleCodec[]>(\n items: TItems,\n): Codec, GetDecoderTypeFromItems & GetEncoderTypeFromItems> {\n return combineCodec(\n getTupleEncoder(items),\n getTupleDecoder(items) as Decoder & GetEncoderTypeFromItems>,\n );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n isFixedSize,\n Offset,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\nimport { SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, SolanaError } from '@solana/errors';\n\nimport { DrainOuterGeneric, getMaxSize, maxCodecSizes } from './utils';\n\n/**\n * Infers the TypeScript type for values that can be encoded using a union codec.\n *\n * This type maps the provided variant encoders to their corresponding value types.\n *\n * @typeParam TVariants - An array of encoders, each corresponding to a union variant.\n */\ntype GetEncoderTypeFromVariants[]> = DrainOuterGeneric<{\n [I in keyof TVariants]: TVariants[I] extends Encoder ? TFrom : never;\n}>[number];\n\n/**\n * Infers the TypeScript type for values that can be decoded using a union codec.\n *\n * This type maps the provided variant decoders to their corresponding value types.\n *\n * @typeParam TVariants - An array of decoders, each corresponding to a union variant.\n */\ntype GetDecoderTypeFromVariants[]> = DrainOuterGeneric<{\n [I in keyof TVariants]: TVariants[I] extends Decoder ? TFrom : never;\n}>[number];\n\ntype UnionEncoder[]> = TVariants extends readonly FixedSizeEncoder[]\n ? FixedSizeEncoder>\n : Encoder>;\n\ntype UnionDecoder[]> = TVariants extends readonly FixedSizeDecoder[]\n ? FixedSizeDecoder>\n : Decoder>;\n\ntype UnionCodec[]> = TVariants extends readonly FixedSizeCodec[]\n ? FixedSizeCodec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants & GetEncoderTypeFromVariants\n >\n : Codec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants & GetEncoderTypeFromVariants\n >;\n\n/**\n * Returns an encoder for union types.\n *\n * This encoder serializes values by selecting the correct variant encoder\n * based on the `getIndexFromValue` function.\n *\n * Unlike other codecs, this encoder does not store the variant index.\n * It is the user's responsibility to manage discriminators separately.\n *\n * For more details, see {@link getUnionCodec}.\n *\n * @typeParam TVariants - An array of encoders, each corresponding to a union variant.\n *\n * @param variants - The encoders for each variant of the union.\n * @param getIndexFromValue - A function that determines the variant index from the provided value.\n * @returns An `Encoder` for encoding union values.\n *\n * @example\n * Encoding a union of numbers and booleans.\n * ```ts\n * const encoder = getUnionEncoder(\n * [getU16Encoder(), getBooleanEncoder()],\n * value => (typeof value === 'number' ? 0 : 1)\n * );\n *\n * encoder.encode(42);\n * // 0x2a00\n * // └── Encoded number (42) as `u16`\n *\n * encoder.encode(true);\n * // 0x01\n * // └── Encoded boolean (`true`) as `u8`\n * ```\n *\n * @see {@link getUnionCodec}\n */\nexport function getUnionEncoder[]>(\n variants: TVariants,\n getIndexFromValue: (value: GetEncoderTypeFromVariants) => number,\n): UnionEncoder {\n type TFrom = GetEncoderTypeFromVariants;\n const fixedSize = getUnionFixedSize(variants);\n const write: Encoder['write'] = (variant, bytes, offset) => {\n const index = getIndexFromValue(variant);\n assertValidVariantIndex(variants, index);\n return variants[index].write(variant, bytes, offset);\n };\n\n if (fixedSize !== null) {\n return createEncoder({ fixedSize, write }) as UnionEncoder;\n }\n\n const maxSize = getUnionMaxSize(variants);\n return createEncoder({\n ...(maxSize !== null ? { maxSize } : {}),\n getSizeFromValue: variant => {\n const index = getIndexFromValue(variant);\n assertValidVariantIndex(variants, index);\n return getEncodedSize(variant, variants[index]);\n },\n write,\n }) as UnionEncoder;\n}\n\n/**\n * Returns a decoder for union types.\n *\n * This decoder deserializes values by selecting the correct variant decoder\n * based on the `getIndexFromBytes` function.\n *\n * Unlike other codecs, this decoder does not assume a stored discriminator.\n * It is the user's responsibility to manage discriminators separately.\n *\n * For more details, see {@link getUnionCodec}.\n *\n * @typeParam TVariants - An array of decoders, each corresponding to a union variant.\n *\n * @param variants - The decoders for each variant of the union.\n * @param getIndexFromBytes - A function that determines the variant index from the byte array.\n * @returns A `Decoder` for decoding union values.\n *\n * @example\n * Decoding a union of numbers and booleans.\n * ```ts\n * const decoder = getUnionDecoder(\n * [getU16Decoder(), getBooleanDecoder()],\n * (bytes, offset) => (bytes.length - offset > 1 ? 0 : 1)\n * );\n *\n * decoder.decode(new Uint8Array([0x2a, 0x00])); // 42\n * decoder.decode(new Uint8Array([0x01])); // true\n * // Type is inferred as `number | boolean`\n * ```\n *\n * @see {@link getUnionCodec}\n */\nexport function getUnionDecoder[]>(\n variants: TVariants,\n getIndexFromBytes: (bytes: ReadonlyUint8Array, offset: Offset) => number,\n): UnionDecoder {\n type TTo = GetDecoderTypeFromVariants;\n const fixedSize = getUnionFixedSize(variants);\n const read: Decoder['read'] = (bytes, offset) => {\n const index = getIndexFromBytes(bytes, offset);\n assertValidVariantIndex(variants, index);\n return variants[index].read(bytes, offset);\n };\n\n if (fixedSize !== null) {\n return createDecoder({ fixedSize, read }) as UnionDecoder;\n }\n\n const maxSize = getUnionMaxSize(variants);\n return createDecoder({ ...(maxSize !== null ? { maxSize } : {}), read }) as UnionDecoder;\n}\n\n/**\n * Returns a codec for encoding and decoding union types.\n *\n * This codec serializes and deserializes union values by selecting the correct variant\n * based on the provided index functions.\n *\n * Unlike the {@link getDiscriminatedUnionCodec}, this codec does not assume a stored\n * discriminator and must be used with an explicit mechanism for managing discriminators.\n *\n * @typeParam TVariants - An array of codecs, each corresponding to a union variant.\n *\n * @param variants - The codecs for each variant of the union.\n * @param getIndexFromValue - A function that determines the variant index from the provided value.\n * @param getIndexFromBytes - A function that determines the variant index from the byte array.\n * @returns A `Codec` for encoding and decoding union values.\n *\n * @example\n * Encoding and decoding a union of numbers and booleans.\n * ```ts\n * const codec = getUnionCodec(\n * [getU16Codec(), getBooleanCodec()],\n * value => (typeof value === 'number' ? 0 : 1),\n * (bytes, offset) => (bytes.length - offset > 1 ? 0 : 1)\n * );\n *\n * const bytes1 = codec.encode(42); // 0x2a00\n * const value1: number | boolean = codec.decode(bytes1); // 42\n *\n * const bytes2 = codec.encode(true); // 0x01\n * const value2: number | boolean = codec.decode(bytes2); // true\n * ```\n *\n * @remarks\n * If you need a codec that includes a stored discriminator,\n * consider using {@link getDiscriminatedUnionCodec}.\n *\n * Separate {@link getUnionEncoder} and {@link getUnionDecoder} functions are also available.\n *\n * ```ts\n * const bytes = getUnionEncoder(variantEncoders, getIndexFromValue).encode(42);\n * const value = getUnionDecoder(variantDecoders, getIndexFromBytes).decode(bytes);\n * ```\n *\n * @see {@link getUnionEncoder}\n * @see {@link getUnionDecoder}\n * @see {@link getDiscriminatedUnionCodec}\n */\nexport function getUnionCodec[]>(\n variants: TVariants,\n getIndexFromValue: (value: GetEncoderTypeFromVariants) => number,\n getIndexFromBytes: (bytes: ReadonlyUint8Array, offset: Offset) => number,\n): UnionCodec {\n return combineCodec(\n getUnionEncoder(variants, getIndexFromValue),\n getUnionDecoder(variants as readonly Decoder[], getIndexFromBytes) as Decoder<\n GetDecoderTypeFromVariants & GetEncoderTypeFromVariants\n >,\n ) as UnionCodec;\n}\n\nfunction assertValidVariantIndex(variants: readonly unknown[], index: number) {\n if (typeof variants[index] === 'undefined') {\n throw new SolanaError(SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, {\n maxRange: variants.length - 1,\n minRange: 0,\n variant: index,\n });\n }\n}\n\nfunction getUnionFixedSize | Encoder)[]>(variants: TVariants) {\n if (variants.length === 0) return 0;\n if (!isFixedSize(variants[0])) return null;\n const variantSize = variants[0].fixedSize;\n const sameSizedVariants = variants.every(variant => isFixedSize(variant) && variant.fixedSize === variantSize);\n return sameSizedVariants ? variantSize : null;\n}\n\nfunction getUnionMaxSize | Encoder)[]>(variants: TVariants) {\n return maxCodecSizes(variants.map(variant => getMaxSize(variant)));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n} from '@solana/codecs-core';\nimport { getU8Decoder, getU8Encoder, NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, SolanaError } from '@solana/errors';\n\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\nimport { getUnionDecoder, getUnionEncoder } from './union';\nimport { DrainOuterGeneric } from './utils';\n\n/**\n * Represents a discriminated union using a specific discriminator property.\n *\n * A discriminated union is a TypeScript-friendly way to represent Rust-like enums.\n * Each variant in the union is distinguished by a shared discriminator property.\n *\n * @typeParam TDiscriminatorProperty - The name of the discriminator property.\n * @typeParam TDiscriminatorValue - The type of the discriminator value.\n *\n * @example\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant\n * | { __kind: 'Write'; fields: [string] } // Tuple variant\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant\n * ```\n */\nexport type DiscriminatedUnion<\n TDiscriminatorProperty extends string = '__kind',\n TDiscriminatorValue extends string = string,\n> = {\n [P in TDiscriminatorProperty]: TDiscriminatorValue;\n};\n\n/**\n * Extracts a variant from a discriminated union based on its discriminator value.\n *\n * @typeParam TUnion - The discriminated union type.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n * @typeParam TDiscriminatorValue - The specific variant to extract.\n *\n * @example\n * ```ts\n * type Message =\n * | { __kind: 'Quit' }\n * | { __kind: 'Write'; fields: [string] }\n * | { __kind: 'Move'; x: number; y: number };\n *\n * type ClickEvent = GetDiscriminatedUnionVariant;\n * // -> { __kind: 'Move'; x: number; y: number }\n * ```\n */\nexport type GetDiscriminatedUnionVariant<\n TUnion extends DiscriminatedUnion,\n TDiscriminatorProperty extends string,\n TDiscriminatorValue extends TUnion[TDiscriminatorProperty],\n> = Extract>;\n\n/**\n * Extracts a variant from a discriminated union without its discriminator property.\n *\n * @typeParam TUnion - The discriminated union type.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n * @typeParam TDiscriminatorValue - The specific variant to extract.\n *\n * @example\n * ```ts\n * type Message =\n * | { __kind: 'Quit' }\n * | { __kind: 'Write'; fields: [string] }\n * | { __kind: 'Move'; x: number; y: number };\n *\n * type MoveContent = GetDiscriminatedUnionVariantContent;\n * // -> { x: number; y: number }\n * ```\n */\nexport type GetDiscriminatedUnionVariantContent<\n TUnion extends DiscriminatedUnion,\n TDiscriminatorProperty extends string,\n TDiscriminatorValue extends TUnion[TDiscriminatorProperty],\n> = Omit, TDiscriminatorProperty>;\n\n/**\n * Defines the configuration for discriminated union codecs.\n *\n * This configuration controls how the discriminator is stored and named.\n *\n * @typeParam TDiscriminatorProperty - The property name of the discriminator.\n * @typeParam TDiscriminatorSize - The codec used for the discriminator prefix.\n */\nexport type DiscriminatedUnionCodecConfig<\n TDiscriminatorProperty extends string = '__kind',\n TDiscriminatorSize = NumberCodec | NumberDecoder | NumberEncoder,\n> = {\n /**\n * The property name of the discriminator.\n * @defaultValue `__kind`\n */\n discriminator?: TDiscriminatorProperty;\n /**\n * The codec used to encode/decode the discriminator prefix.\n * @defaultValue `u8` prefix\n */\n size?: TDiscriminatorSize;\n};\n\ntype DiscriminatorValue = bigint | boolean | number | string | null | undefined;\ntype Variants = readonly (readonly [DiscriminatorValue, T])[];\ntype ArrayIndices = Exclude['length'], T['length']> & number;\n\ntype GetEncoderTypeFromVariants<\n TVariants extends Variants>,\n TDiscriminatorProperty extends string,\n> = DrainOuterGeneric<{\n [I in ArrayIndices]: (TVariants[I][1] extends Encoder\n ? TFrom extends object\n ? TFrom\n : object\n : never) & { [P in TDiscriminatorProperty]: TVariants[I][0] };\n}>[ArrayIndices];\n\ntype GetDecoderTypeFromVariants<\n TVariants extends Variants>,\n TDiscriminatorProperty extends string,\n> = DrainOuterGeneric<{\n [I in ArrayIndices]: (TVariants[I][1] extends Decoder\n ? TTo extends object\n ? TTo\n : object\n : never) & { [P in TDiscriminatorProperty]: TVariants[I][0] };\n}>[ArrayIndices];\n\ntype UnionEncoder>, TDiscriminatorProperty extends string> =\n TVariants extends Variants>\n ? FixedSizeEncoder>\n : Encoder>;\n\ntype UnionDecoder>, TDiscriminatorProperty extends string> =\n TVariants extends Variants>\n ? FixedSizeDecoder>\n : Decoder>;\n\ntype UnionCodec>, TDiscriminatorProperty extends string> =\n TVariants extends Variants>\n ? FixedSizeCodec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants &\n GetEncoderTypeFromVariants\n >\n : Codec<\n GetEncoderTypeFromVariants,\n GetDecoderTypeFromVariants &\n GetEncoderTypeFromVariants\n >;\n\n/**\n * Returns an encoder for discriminated unions.\n *\n * This encoder serializes objects that follow the discriminated union pattern\n * by prefixing them with a numerical discriminator that represents their variant.\n *\n * Unlike {@link getUnionEncoder}, this encoder automatically extracts and processes\n * the discriminator property (default: `__kind`) from each variant.\n *\n * For more details, see {@link getDiscriminatedUnionCodec}.\n *\n * @typeParam TVariants - The variants of the discriminated union.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n *\n * @param variants - The variant encoders as `[discriminator, encoder]` pairs.\n * @param config - Configuration options for encoding.\n * @returns An `Encoder` for encoding discriminated union objects.\n *\n * @example\n * Encoding a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant.\n * | { __kind: 'Write'; fields: [string] } // Tuple variant.\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant.\n *\n * const messageEncoder = getDiscriminatedUnionEncoder([\n * ['Quit', getUnitEncoder()],\n * ['Write', getStructEncoder([['fields', getTupleEncoder([addCodecSizePrefix(getUtf8Encoder(), getU32Encoder())])]])],\n * ['Move', getStructEncoder([['x', getI32Encoder()], ['y', getI32Encoder()]])]\n * ]);\n *\n * messageEncoder.encode({ __kind: 'Move', x: 5, y: 6 });\n * // 0x020500000006000000\n * // | | └── Field y (6)\n * // | └── Field x (5)\n * // └── 1-byte discriminator (Index 2 — the \"Move\" variant)\n * ```\n *\n * @see {@link getDiscriminatedUnionCodec}\n */\nexport function getDiscriminatedUnionEncoder<\n const TVariants extends Variants>,\n const TDiscriminatorProperty extends string = '__kind',\n>(\n variants: TVariants,\n config: DiscriminatedUnionCodecConfig = {},\n): UnionEncoder {\n type TFrom = GetEncoderTypeFromVariants;\n const discriminatorProperty = (config.discriminator ?? '__kind') as TDiscriminatorProperty;\n const prefix = config.size ?? getU8Encoder();\n return getUnionEncoder(\n variants.map(([, variant], index) =>\n transformEncoder(getTupleEncoder([prefix, variant]), (value: TFrom): [number, TFrom] => [index, value]),\n ),\n value => getVariantDiscriminator(variants, value[discriminatorProperty]),\n ) as UnionEncoder;\n}\n\n/**\n * Returns a decoder for discriminated unions.\n *\n * This decoder deserializes objects that follow the discriminated union pattern\n * by **reading a numerical discriminator** and mapping it to the corresponding variant.\n *\n * Unlike {@link getUnionDecoder}, this decoder automatically inserts the discriminator\n * property (default: `__kind`) into the decoded object.\n *\n * For more details, see {@link getDiscriminatedUnionCodec}.\n *\n * @typeParam TVariants - The variants of the discriminated union.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n *\n * @param variants - The variant decoders as `[discriminator, decoder]` pairs.\n * @param config - Configuration options for decoding.\n * @returns A `Decoder` for decoding discriminated union objects.\n *\n * @example\n * Decoding a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant.\n * | { __kind: 'Write'; fields: [string] } // Tuple variant.\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant.\n *\n * const messageDecoder = getDiscriminatedUnionDecoder([\n * ['Quit', getUnitDecoder()],\n * ['Write', getStructDecoder([['fields', getTupleDecoder([addCodecSizePrefix(getUtf8Decoder(), getU32Decoder())])]])],\n * ['Move', getStructDecoder([['x', getI32Decoder()], ['y', getI32Decoder()]])]\n * ]);\n *\n * messageDecoder.decode(new Uint8Array([0x02,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00]));\n * // { __kind: 'Move', x: 5, y: 6 }\n * ```\n *\n * @see {@link getDiscriminatedUnionCodec}\n */\nexport function getDiscriminatedUnionDecoder<\n const TVariants extends Variants>,\n const TDiscriminatorProperty extends string = '__kind',\n>(\n variants: TVariants,\n config: DiscriminatedUnionCodecConfig = {},\n): UnionDecoder {\n const discriminatorProperty = config.discriminator ?? '__kind';\n const prefix = config.size ?? getU8Decoder();\n return getUnionDecoder(\n variants.map(([discriminator, variant]) =>\n transformDecoder(getTupleDecoder([prefix, variant]), ([, value]) => ({\n [discriminatorProperty]: discriminator,\n ...value,\n })),\n ),\n (bytes, offset) => Number(prefix.read(bytes, offset)[0]),\n ) as UnionDecoder;\n}\n\n/**\n * Returns a codec for encoding and decoding {@link DiscriminatedUnion}.\n *\n * A {@link DiscriminatedUnion} is a TypeScript representation of Rust-like enums, where\n * each variant is distinguished by a discriminator field (default: `__kind`).\n *\n * This codec inserts a numerical prefix to represent the variant index.\n *\n * @typeParam TVariants - The variants of the discriminated union.\n * @typeParam TDiscriminatorProperty - The property used as the discriminator.\n *\n * @param variants - The variant codecs as `[discriminator, codec]` pairs.\n * @param config - Configuration options for encoding/decoding.\n * @returns A `Codec` for encoding and decoding discriminated union objects.\n *\n * @example\n * Encoding and decoding a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Quit' } // Empty variant.\n * | { __kind: 'Write'; fields: [string] } // Tuple variant.\n * | { __kind: 'Move'; x: number; y: number }; // Struct variant.\n *\n * const messageCodec = getDiscriminatedUnionCodec([\n * ['Quit', getUnitCodec()],\n * ['Write', getStructCodec([['fields', getTupleCodec([addCodecSizePrefix(getUtf8Codec(), getU32Codec())])]])],\n * ['Move', getStructCodec([['x', getI32Codec()], ['y', getI32Codec()]])]\n * ]);\n *\n * messageCodec.encode({ __kind: 'Move', x: 5, y: 6 });\n * // 0x020500000006000000\n * // | | └── Field y (6)\n * // | └── Field x (5)\n * // └── 1-byte discriminator (Index 2 — the \"Move\" variant)\n *\n * const value = messageCodec.decode(bytes);\n * // { __kind: 'Move', x: 5, y: 6 }\n * ```\n *\n * @example\n * Using a `u32` discriminator instead of `u8`.\n * ```ts\n * const codec = getDiscriminatedUnionCodec([...], { size: getU32Codec() });\n *\n * codec.encode({ __kind: 'Quit' });\n * // 0x00000000\n * // └------┘ 4-byte discriminator (Index 0)\n *\n * codec.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00]));\n * // { __kind: 'Quit' }\n * ```\n *\n * @example\n * Customizing the discriminator property.\n * ```ts\n * const codec = getDiscriminatedUnionCodec([...], { discriminator: 'message' });\n *\n * codec.encode({ message: 'Quit' }); // 0x00\n * codec.decode(new Uint8Array([0x00])); // { message: 'Quit' }\n * ```\n *\n * @remarks\n * Separate `getDiscriminatedUnionEncoder` and `getDiscriminatedUnionDecoder` functions are available.\n *\n * ```ts\n * const bytes = getDiscriminatedUnionEncoder(variantEncoders).encode({ __kind: 'Quit' });\n * const message = getDiscriminatedUnionDecoder(variantDecoders).decode(bytes);\n * ```\n *\n * @see {@link getDiscriminatedUnionEncoder}\n * @see {@link getDiscriminatedUnionDecoder}\n */\nexport function getDiscriminatedUnionCodec<\n const TVariants extends Variants>,\n const TDiscriminatorProperty extends string = '__kind',\n>(\n variants: TVariants,\n config: DiscriminatedUnionCodecConfig = {},\n): UnionCodec {\n return combineCodec(\n getDiscriminatedUnionEncoder(variants, config) as Encoder<\n GetEncoderTypeFromVariants\n >,\n getDiscriminatedUnionDecoder(variants, config) as Decoder<\n GetDecoderTypeFromVariants &\n GetEncoderTypeFromVariants\n >,\n ) as UnionCodec;\n}\n\nfunction getVariantDiscriminator | Encoder>>(\n variants: TVariants,\n discriminatorValue: DiscriminatorValue,\n) {\n const discriminator = variants.findIndex(([key]) => discriminatorValue === key);\n if (discriminator < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, {\n value: discriminatorValue,\n variants: variants.map(([key]) => key),\n });\n }\n return discriminator;\n}\n","/**\n * Defines the \"lookup object\" of an enum.\n *\n * @example\n * ```ts\n * enum Direction { Left, Right };\n * ```\n */\nexport type EnumLookupObject = { [key: string]: number | string };\n\n/**\n * Returns the allowed input for an enum.\n *\n * @example\n * ```ts\n * enum Direction { Left, Right };\n * type DirectionInput = GetEnumFrom; // \"Left\" | \"Right\" | 0 | 1\n * ```\n */\nexport type GetEnumFrom = TEnum[keyof TEnum] | keyof TEnum;\n\n/**\n * Returns all the available variants of an enum.\n *\n * @example\n * ```ts\n * enum Direction { Left, Right };\n * type DirectionOutput = GetEnumTo; // 0 | 1\n * ```\n */\nexport type GetEnumTo = TEnum[keyof TEnum];\n\nexport function getEnumStats(constructor: EnumLookupObject) {\n const numericalValues = [...new Set(Object.values(constructor).filter(v => typeof v === 'number'))].sort();\n const enumRecord = Object.fromEntries(Object.entries(constructor).slice(numericalValues.length)) as Record<\n string,\n number | string\n >;\n const enumKeys = Object.keys(enumRecord);\n const enumValues = Object.values(enumRecord);\n const stringValues: string[] = [\n ...new Set([...enumKeys, ...enumValues.filter((v): v is string => typeof v === 'string')]),\n ];\n\n return { enumKeys, enumRecord, enumValues, numericalValues, stringValues };\n}\n\nexport function getEnumIndexFromVariant({\n enumKeys,\n enumValues,\n variant,\n}: {\n enumKeys: string[];\n enumValues: (number | string)[];\n variant: number | string | symbol;\n}): number {\n const valueIndex = findLastIndex(enumValues, value => value === variant);\n if (valueIndex >= 0) return valueIndex;\n return enumKeys.findIndex(key => key === variant);\n}\n\nexport function getEnumIndexFromDiscriminator({\n discriminator,\n enumKeys,\n enumValues,\n useValuesAsDiscriminators,\n}: {\n discriminator: number;\n enumKeys: string[];\n enumValues: (number | string)[];\n useValuesAsDiscriminators: boolean;\n}): number {\n if (!useValuesAsDiscriminators) {\n return discriminator >= 0 && discriminator < enumKeys.length ? discriminator : -1;\n }\n return findLastIndex(enumValues, value => value === discriminator);\n}\n\nfunction findLastIndex(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): number {\n let l = array.length;\n while (l--) {\n if (predicate(array[l], l, array)) return l;\n }\n return -1;\n}\n\nexport function formatNumericalValues(values: number[]): string {\n if (values.length === 0) return '';\n let range: [number, number] = [values[0], values[0]];\n const ranges: string[] = [];\n for (let index = 1; index < values.length; index++) {\n const value = values[index];\n if (range[1] + 1 === value) {\n range[1] = value;\n } else {\n ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`);\n range = [value, value];\n }\n }\n ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`);\n return ranges.join(', ');\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS,\n SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE,\n SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT,\n SolanaError,\n} from '@solana/errors';\n\nimport {\n EnumLookupObject,\n formatNumericalValues,\n GetEnumFrom,\n getEnumIndexFromDiscriminator,\n getEnumIndexFromVariant,\n getEnumStats,\n GetEnumTo,\n} from './enum-helpers';\n\n/**\n * Defines the configuration options for enum codecs.\n *\n * The `size` option determines the numerical encoding used for the enum's discriminant.\n * By default, enums are stored as a `u8` (1 byte).\n *\n * The `useValuesAsDiscriminators` option allows mapping the actual enum values\n * as discriminators instead of using their positional index.\n *\n * @typeParam TDiscriminator - A number codec, encoder, or decoder used for the discriminant.\n */\nexport type EnumCodecConfig = {\n /**\n * The codec used to encode/decode the enum discriminator.\n * @defaultValue `u8` discriminator.\n */\n size?: TDiscriminator;\n\n /**\n * If set to `true`, the enum values themselves will be used as discriminators.\n * This is only valid for numerical enum values.\n *\n * @defaultValue `false`\n */\n useValuesAsDiscriminators?: boolean;\n};\n\n/**\n * Returns an encoder for enums.\n *\n * This encoder serializes enums as a numerical discriminator.\n * By default, the discriminator is based on the positional index of the enum variants.\n *\n * For more details, see {@link getEnumCodec}.\n *\n * @typeParam TEnum - The TypeScript enum or object mapping enum keys to values.\n *\n * @param constructor - The constructor of the enum.\n * @param config - Configuration options for encoding the enum.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding enums.\n *\n * @example\n * Encoding enum values.\n * ```ts\n * enum Direction { Up, Down, Left, Right }\n * const encoder = getEnumEncoder(Direction);\n *\n * encoder.encode(Direction.Up); // 0x00\n * encoder.encode(Direction.Down); // 0x01\n * encoder.encode(Direction.Left); // 0x02\n * encoder.encode(Direction.Right); // 0x03\n * ```\n *\n * @see {@link getEnumCodec}\n */\nexport function getEnumEncoder(\n constructor: TEnum,\n config?: Omit, 'size'>,\n): FixedSizeEncoder, 1>;\nexport function getEnumEncoder(\n constructor: TEnum,\n config: EnumCodecConfig & { size: FixedSizeNumberEncoder },\n): FixedSizeEncoder, TSize>;\nexport function getEnumEncoder(\n constructor: TEnum,\n config?: EnumCodecConfig,\n): VariableSizeEncoder>;\nexport function getEnumEncoder(\n constructor: TEnum,\n config: EnumCodecConfig = {},\n): Encoder> {\n const prefix = config.size ?? getU8Encoder();\n const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false;\n const { enumKeys, enumValues, numericalValues, stringValues } = getEnumStats(constructor);\n if (useValuesAsDiscriminators && enumValues.some(value => typeof value === 'string')) {\n throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, {\n stringValues: enumValues.filter((v): v is string => typeof v === 'string'),\n });\n }\n return transformEncoder(prefix, (variant: GetEnumFrom): number => {\n const index = getEnumIndexFromVariant({ enumKeys, enumValues, variant });\n if (index < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, {\n formattedNumericalValues: formatNumericalValues(numericalValues),\n numericalValues,\n stringValues,\n variant,\n });\n }\n return useValuesAsDiscriminators ? (enumValues[index] as number) : index;\n });\n}\n\n/**\n * Returns a decoder for enums.\n *\n * This decoder deserializes enums from a numerical discriminator.\n * By default, the discriminator is based on the positional index of the enum variants.\n *\n * For more details, see {@link getEnumCodec}.\n *\n * @typeParam TEnum - The TypeScript enum or object mapping enum keys to values.\n *\n * @param constructor - The constructor of the enum.\n * @param config - Configuration options for decoding the enum.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding enums.\n *\n * @example\n * Decoding enum values.\n * ```ts\n * enum Direction { Up, Down, Left, Right }\n * const decoder = getEnumDecoder(Direction);\n *\n * decoder.decode(new Uint8Array([0x00])); // Direction.Up\n * decoder.decode(new Uint8Array([0x01])); // Direction.Down\n * decoder.decode(new Uint8Array([0x02])); // Direction.Left\n * decoder.decode(new Uint8Array([0x03])); // Direction.Right\n * ```\n *\n * @see {@link getEnumCodec}\n */\nexport function getEnumDecoder(\n constructor: TEnum,\n config?: Omit, 'size'>,\n): FixedSizeDecoder, 1>;\nexport function getEnumDecoder(\n constructor: TEnum,\n config: EnumCodecConfig & { size: FixedSizeNumberDecoder },\n): FixedSizeDecoder, TSize>;\nexport function getEnumDecoder(\n constructor: TEnum,\n config?: EnumCodecConfig,\n): VariableSizeDecoder>;\nexport function getEnumDecoder(\n constructor: TEnum,\n config: EnumCodecConfig = {},\n): Decoder> {\n const prefix = config.size ?? getU8Decoder();\n const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false;\n const { enumKeys, enumValues, numericalValues } = getEnumStats(constructor);\n if (useValuesAsDiscriminators && enumValues.some(value => typeof value === 'string')) {\n throw new SolanaError(SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, {\n stringValues: enumValues.filter((v): v is string => typeof v === 'string'),\n });\n }\n return transformDecoder(prefix, (value: bigint | number): GetEnumTo => {\n const discriminator = Number(value);\n const index = getEnumIndexFromDiscriminator({\n discriminator,\n enumKeys,\n enumValues,\n useValuesAsDiscriminators,\n });\n if (index < 0) {\n const validDiscriminators = useValuesAsDiscriminators\n ? numericalValues\n : [...Array(enumKeys.length).keys()];\n throw new SolanaError(SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, {\n discriminator,\n formattedValidDiscriminators: formatNumericalValues(validDiscriminators),\n validDiscriminators,\n });\n }\n return enumValues[index] as GetEnumTo;\n });\n}\n\n/**\n * Returns a codec for encoding and decoding enums.\n *\n * This codec serializes enums as a numerical discriminator, allowing them\n * to be efficiently stored and reconstructed from binary data.\n *\n * By default, the discriminator is derived from the positional index\n * of the enum variant, but it can be configured to use the enum's numeric values instead.\n *\n * @typeParam TEnum - The TypeScript enum or object mapping enum keys to values.\n *\n * @param constructor - The constructor of the enum.\n * @param config - Configuration options for encoding and decoding the enum.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding enums.\n *\n * @example\n * Encoding and decoding enums using positional indexes.\n * ```ts\n * enum Direction { Up, Down, Left, Right }\n * const codec = getEnumCodec(Direction);\n *\n * codec.encode(Direction.Up); // 0x00\n * codec.encode(Direction.Down); // 0x01\n * codec.encode(Direction.Left); // 0x02\n * codec.encode(Direction.Right); // 0x03\n *\n * codec.decode(new Uint8Array([0x00])); // Direction.Up\n * codec.decode(new Uint8Array([0x01])); // Direction.Down\n * codec.decode(new Uint8Array([0x02])); // Direction.Left\n * codec.decode(new Uint8Array([0x03])); // Direction.Right\n * ```\n *\n * @example\n * Encoding and decoding enums using their numeric values.\n * ```ts\n * enum GameDifficulty { Easy = 1, Normal = 4, Hard = 7, Expert = 9 }\n * const codec = getEnumCodec(GameDifficulty, { useValuesAsDiscriminators: true });\n *\n * codec.encode(GameDifficulty.Easy); // 0x01\n * codec.encode(GameDifficulty.Normal); // 0x04\n * codec.encode(GameDifficulty.Hard); // 0x07\n * codec.encode(GameDifficulty.Expert); // 0x09\n *\n * codec.decode(new Uint8Array([0x01])); // GameDifficulty.Easy\n * codec.decode(new Uint8Array([0x04])); // GameDifficulty.Normal\n * codec.decode(new Uint8Array([0x07])); // GameDifficulty.Hard\n * codec.decode(new Uint8Array([0x09])); // GameDifficulty.Expert\n * ```\n *\n * Note that, when using values as discriminators, the enum values must be numerical.\n * Otherwise, an error will be thrown.\n *\n * ```ts\n * enum GameDifficulty { Easy = 'EASY', Normal = 'NORMAL', Hard = 'HARD' }\n * getEnumCodec(GameDifficulty, { useValuesAsDiscriminators: true }); // Throws an error.\n * ```\n *\n * @example\n * Using a custom discriminator size.\n * ```ts\n * enum Status { Pending, Approved, Rejected }\n * const codec = getEnumCodec(Status, { size: getU16Codec() });\n *\n * codec.encode(Status.Pending); // 0x0000\n * codec.encode(Status.Approved); // 0x0100\n * codec.encode(Status.Rejected); // 0x0200\n *\n * codec.decode(new Uint8Array([0x00, 0x00])); // Status.Pending\n * codec.decode(new Uint8Array([0x01, 0x00])); // Status.Approved\n * codec.decode(new Uint8Array([0x02, 0x00])); // Status.Rejected\n * ```\n *\n * @remarks\n * Separate {@link getEnumEncoder} and {@link getEnumDecoder} functions are available.\n *\n * ```ts\n * const bytes = getEnumEncoder(Direction).encode(Direction.Up);\n * const value = getEnumDecoder(Direction).decode(bytes);\n * ```\n *\n * @see {@link getEnumEncoder}\n * @see {@link getEnumDecoder}\n */\nexport function getEnumCodec(\n constructor: TEnum,\n config?: Omit, 'size'>,\n): FixedSizeCodec, GetEnumTo, 1>;\nexport function getEnumCodec(\n constructor: TEnum,\n config: EnumCodecConfig & { size: FixedSizeNumberCodec },\n): FixedSizeCodec, GetEnumTo, TSize>;\nexport function getEnumCodec(\n constructor: TEnum,\n config?: EnumCodecConfig,\n): VariableSizeCodec, GetEnumTo>;\nexport function getEnumCodec(\n constructor: TEnum,\n config: EnumCodecConfig = {},\n): Codec, GetEnumTo> {\n return combineCodec(getEnumEncoder(constructor, config), getEnumDecoder(constructor, config));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\n\n/**\n * Returns an encoder that prefixes encoded values with hidden data.\n *\n * This encoder applies a list of void encoders before encoding the main value.\n * The prefixed data is encoded before the main value without being exposed to the user.\n *\n * For more details, see {@link getHiddenPrefixCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param encoder - The encoder for the main value.\n * @param prefixedEncoders - A list of void encoders that produce the hidden prefix.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` that encodes the value with a hidden prefix.\n *\n * @example\n * Prefixing a value with constants.\n * ```ts\n * const encoder = getHiddenPrefixEncoder(getUtf8Encoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * encoder.encode('Hello');\n * // 0x01020304050648656c6c6f\n * // | | └-- Our encoded value (\"Hello\").\n * // | └-- Our second hidden prefix.\n * // └-- Our first hidden prefix.\n * ```\n *\n * @see {@link getHiddenPrefixCodec}\n */\nexport function getHiddenPrefixEncoder(\n encoder: FixedSizeEncoder,\n prefixedEncoders: readonly FixedSizeEncoder[],\n): FixedSizeEncoder;\nexport function getHiddenPrefixEncoder(\n encoder: Encoder,\n prefixedEncoders: readonly Encoder[],\n): VariableSizeEncoder;\nexport function getHiddenPrefixEncoder(\n encoder: Encoder,\n prefixedEncoders: readonly Encoder[],\n): Encoder {\n return transformEncoder(\n getTupleEncoder([...prefixedEncoders, encoder]) as Encoder,\n (value: TFrom) => [...prefixedEncoders.map(() => undefined), value] as const,\n );\n}\n\n/**\n * Returns a decoder that skips hidden prefixed data before decoding the main value.\n *\n * This decoder applies a list of void decoders before decoding the main value.\n * The prefixed data is skipped during decoding without being exposed to the user.\n *\n * For more details, see {@link getHiddenPrefixCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param decoder - The decoder for the main value.\n * @param prefixedDecoders - A list of void decoders that produce the hidden prefix.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` that decodes values while ignoring the hidden prefix.\n *\n * @example\n * Decoding a value with prefixed constants.\n * ```ts\n * const decoder = getHiddenPrefixDecoder(getUtf8Decoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * decoder.decode(new Uint8Array([1, 2, 3, 4, 5, 6, 0x48, 0x65, 0x6C, 0x6C, 0x6F]));\n * // 'Hello'\n * ```\n *\n * @see {@link getHiddenPrefixCodec}\n */\nexport function getHiddenPrefixDecoder(\n decoder: FixedSizeDecoder,\n prefixedDecoders: readonly FixedSizeDecoder[],\n): FixedSizeDecoder;\nexport function getHiddenPrefixDecoder(\n decoder: Decoder,\n prefixedDecoders: readonly Decoder[],\n): VariableSizeDecoder;\nexport function getHiddenPrefixDecoder(\n decoder: Decoder,\n prefixedDecoders: readonly Decoder[],\n): Decoder {\n return transformDecoder(\n getTupleDecoder([...prefixedDecoders, decoder]) as Decoder,\n tuple => tuple[tuple.length - 1] as TTo,\n );\n}\n\n/**\n * Returns a codec that encodes and decodes values with a hidden prefix.\n *\n * - **Encoding:** Prefixes the value with hidden data before encoding.\n * - **Decoding:** Skips the hidden prefix before decoding the main value.\n *\n * This is useful for any implicit metadata that should be present in\n * binary formats but omitted from the API.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param codec - The codec for the main value.\n * @param prefixedCodecs - A list of void codecs that produce the hidden prefix.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding values with a hidden prefix.\n *\n * @example\n * Encoding and decoding a value with prefixed constants.\n * ```ts\n * const codec = getHiddenPrefixCodec(getUtf8Codec(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * const bytes = codec.encode('Hello');\n * // 0x01020304050648656c6c6f\n * // | | └-- Our encoded value (\"Hello\").\n * // | └-- Our second hidden prefix.\n * // └-- Our first hidden prefix.\n *\n * codec.decode(bytes);\n * // 'Hello'\n * ```\n *\n * @remarks\n * If all you need is padding zeroes before a value, consider using {@link padLeftCodec} instead.\n *\n * Separate {@link getHiddenPrefixEncoder} and {@link getHiddenPrefixDecoder} functions are available.\n *\n * ```ts\n * const bytes = getHiddenPrefixEncoder(getUtf8Encoder(), [\n * getConstantEncoder(new Uint8Array([1, 2, 3])),\n * getConstantEncoder(new Uint8Array([4, 5, 6])),\n * ]).encode('Hello');\n *\n * const value = getHiddenPrefixDecoder(getUtf8Decoder(), [\n * getConstantDecoder(new Uint8Array([1, 2, 3])),\n * getConstantDecoder(new Uint8Array([4, 5, 6])),\n * ]).decode(bytes);\n * ```\n *\n * @see {@link getHiddenPrefixEncoder}\n * @see {@link getHiddenPrefixDecoder}\n */\nexport function getHiddenPrefixCodec(\n codec: FixedSizeCodec,\n prefixedCodecs: readonly FixedSizeCodec[],\n): FixedSizeCodec;\nexport function getHiddenPrefixCodec(\n codec: Codec,\n prefixedCodecs: readonly Codec[],\n): VariableSizeCodec;\nexport function getHiddenPrefixCodec(\n codec: Codec,\n prefixedCodecs: readonly Codec[],\n): Codec {\n return combineCodec(getHiddenPrefixEncoder(codec, prefixedCodecs), getHiddenPrefixDecoder(codec, prefixedCodecs));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\n\n/**\n * Returns an encoder that appends hidden data after the encoded value.\n *\n * This encoder applies a list of void encoders after encoding the main value.\n * The suffixed data is encoded after the main value without being exposed to the user.\n *\n * For more details, see {@link getHiddenSuffixCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param encoder - The encoder for the main value.\n * @param suffixedEncoders - A list of void encoders that produce the hidden suffix.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` that encodes the value with a hidden suffix.\n *\n * @example\n * Suffixing a value with constants.\n * ```ts\n * const encoder = getHiddenSuffixEncoder(getUtf8Encoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * encoder.encode('Hello');\n * // 0x48656c6c6f010203040506\n * // | | └-- Our second hidden suffix.\n * // | └-- Our first hidden suffix.\n * // └-- Our encoded value (\"Hello\").\n * ```\n *\n * @see {@link getHiddenSuffixCodec}\n */\nexport function getHiddenSuffixEncoder(\n encoder: FixedSizeEncoder,\n suffixedEncoders: readonly FixedSizeEncoder[],\n): FixedSizeEncoder;\nexport function getHiddenSuffixEncoder(\n encoder: Encoder,\n suffixedEncoders: readonly Encoder[],\n): VariableSizeEncoder;\nexport function getHiddenSuffixEncoder(\n encoder: Encoder,\n suffixedEncoders: readonly Encoder[],\n): Encoder {\n return transformEncoder(\n getTupleEncoder([encoder, ...suffixedEncoders]) as Encoder,\n (value: TFrom) => [value, ...suffixedEncoders.map(() => undefined)] as const,\n );\n}\n\n/**\n * Returns a decoder that skips hidden suffixed data after decoding the main value.\n *\n * This decoder applies a list of void decoders after decoding the main value.\n * The suffixed data is skipped during decoding without being exposed to the user.\n *\n * For more details, see {@link getHiddenSuffixCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param decoder - The decoder for the main value.\n * @param suffixedDecoders - A list of void decoders that produce the hidden suffix.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` that decodes values while ignoring the hidden suffix.\n *\n * @example\n * Decoding a value with suffixed constants.\n * ```ts\n * const decoder = getHiddenSuffixDecoder(getUtf8Decoder(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * decoder.decode(new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F, 1, 2, 3, 4, 5, 6]));\n * // 'Hello'\n * ```\n *\n * @see {@link getHiddenSuffixCodec}\n */\nexport function getHiddenSuffixDecoder(\n decoder: FixedSizeDecoder,\n suffixedDecoders: readonly FixedSizeDecoder[],\n): FixedSizeDecoder;\nexport function getHiddenSuffixDecoder(\n decoder: Decoder,\n suffixedDecoders: readonly Decoder[],\n): VariableSizeDecoder;\nexport function getHiddenSuffixDecoder(\n decoder: Decoder,\n suffixedDecoders: readonly Decoder[],\n): Decoder {\n return transformDecoder(\n getTupleDecoder([decoder, ...suffixedDecoders]) as Decoder,\n tuple => tuple[0],\n );\n}\n\n/**\n * Returns a codec that encodes and decodes values with a hidden suffix.\n *\n * - **Encoding:** Appends hidden data after encoding the main value.\n * - **Decoding:** Skips the hidden suffix after decoding the main value.\n *\n * This is useful for any implicit metadata that should be present in\n * binary formats but omitted from the API.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param codec - The codec for the main value.\n * @param suffixedCodecs - A list of void codecs that produce the hidden suffix.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding values with a hidden suffix.\n *\n * @example\n * Encoding and decoding a value with suffixed constants.\n * ```ts\n * const codec = getHiddenSuffixCodec(getUtf8Codec(), [\n * getConstantCodec(new Uint8Array([1, 2, 3])),\n * getConstantCodec(new Uint8Array([4, 5, 6])),\n * ]);\n *\n * const bytes = codec.encode('Hello');\n * // 0x48656c6c6f010203040506\n * // | | └-- Our second hidden suffix.\n * // | └-- Our first hidden suffix.\n * // └-- Our encoded value (\"Hello\").\n *\n * codec.decode(bytes);\n * // 'Hello'\n * ```\n *\n * @remarks\n * If all you need is padding zeroes after a value, consider using {@link padRightCodec} instead.\n *\n * Separate {@link getHiddenSuffixEncoder} and {@link getHiddenSuffixDecoder} functions are available.\n *\n * ```ts\n * const bytes = getHiddenSuffixEncoder(getUtf8Encoder(), [\n * getConstantEncoder(new Uint8Array([1, 2, 3])),\n * getConstantEncoder(new Uint8Array([4, 5, 6])),\n * ]).encode('Hello');\n *\n * const value = getHiddenSuffixDecoder(getUtf8Decoder(), [\n * getConstantDecoder(new Uint8Array([1, 2, 3])),\n * getConstantDecoder(new Uint8Array([4, 5, 6])),\n * ]).decode(bytes);\n * ```\n *\n * @see {@link getHiddenSuffixEncoder}\n * @see {@link getHiddenSuffixDecoder}\n */\nexport function getHiddenSuffixCodec(\n codec: FixedSizeCodec,\n suffixedCodecs: readonly FixedSizeCodec[],\n): FixedSizeCodec;\nexport function getHiddenSuffixCodec(\n codec: Codec,\n suffixedCodecs: readonly Codec[],\n): VariableSizeCodec;\nexport function getHiddenSuffixCodec(\n codec: Codec,\n suffixedCodecs: readonly Codec[],\n): Codec {\n return combineCodec(getHiddenSuffixEncoder(codec, suffixedCodecs), getHiddenSuffixDecoder(codec, suffixedCodecs));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT,\n SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\n/**\n * Defines the configuration options for literal union codecs.\n *\n * A literal union codec encodes values from a predefined set of literals.\n * The `size` option determines the numerical encoding used for the discriminant.\n * By default, literals are stored as a `u8` (1 byte).\n *\n * @typeParam TDiscriminator - A number codec, encoder, or decoder used for the discriminant.\n */\nexport type LiteralUnionCodecConfig = {\n /**\n * The codec used to encode/decode the discriminator.\n * @defaultValue `u8` discriminator.\n */\n size?: TDiscriminator;\n};\n\ntype Variant = bigint | boolean | number | string | null | undefined;\ntype GetTypeFromVariants = TVariants[number];\n\n/**\n * Returns an encoder for literal unions.\n *\n * This encoder serializes a value from a predefined set of literals\n * as a numerical index representing its position in the `variants` array.\n *\n * For more details, see {@link getLiteralUnionCodec}.\n *\n * @typeParam TVariants - A tuple of allowed literal values.\n *\n * @param variants - The possible literal values for the union.\n * @param config - Configuration options for encoding the literal union.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding literal unions.\n *\n * @example\n * Encoding a union of string literals.\n * ```ts\n * type Size = 'small' | 'medium' | 'large';\n * const sizeEncoder = getLiteralUnionEncoder(['small', 'medium', 'large']);\n *\n * sizeEncoder.encode('small'); // 0x00\n * sizeEncoder.encode('medium'); // 0x01\n * sizeEncoder.encode('large'); // 0x02\n * ```\n *\n * @see {@link getLiteralUnionCodec}\n */\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n): FixedSizeEncoder, 1>;\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig & { size: FixedSizeNumberEncoder },\n): FixedSizeEncoder, TSize>;\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n config?: LiteralUnionCodecConfig,\n): VariableSizeEncoder>;\nexport function getLiteralUnionEncoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig = {},\n): Encoder> {\n const discriminator = config.size ?? getU8Encoder();\n return transformEncoder(discriminator, variant => {\n const index = variants.indexOf(variant);\n if (index < 0) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT, {\n value: variant,\n variants,\n });\n }\n return index;\n });\n}\n\n/**\n * Returns a decoder for literal unions.\n *\n * This decoder deserializes a numerical index into a corresponding\n * value from a predefined set of literals.\n *\n * For more details, see {@link getLiteralUnionCodec}.\n *\n * @typeParam TVariants - A tuple of allowed literal values.\n *\n * @param variants - The possible literal values for the union.\n * @param config - Configuration options for decoding the literal union.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding literal unions.\n *\n * @example\n * Decoding a union of string literals.\n * ```ts\n * type Size = 'small' | 'medium' | 'large';\n * const sizeDecoder = getLiteralUnionDecoder(['small', 'medium', 'large']);\n *\n * sizeDecoder.decode(new Uint8Array([0x00])); // 'small'\n * sizeDecoder.decode(new Uint8Array([0x01])); // 'medium'\n * sizeDecoder.decode(new Uint8Array([0x02])); // 'large'\n * ```\n *\n * @see {@link getLiteralUnionCodec}\n */\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n): FixedSizeDecoder, 1>;\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig & { size: FixedSizeNumberDecoder },\n): FixedSizeDecoder, TSize>;\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n config?: LiteralUnionCodecConfig,\n): VariableSizeDecoder>;\nexport function getLiteralUnionDecoder(\n variants: TVariants,\n config: LiteralUnionCodecConfig = {},\n): Decoder> {\n const discriminator = config.size ?? getU8Decoder();\n return transformDecoder(discriminator, (index: bigint | number) => {\n if (index < 0 || index >= variants.length) {\n throw new SolanaError(SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE, {\n discriminator: index,\n maxRange: variants.length - 1,\n minRange: 0,\n });\n }\n return variants[Number(index)];\n });\n}\n\n/**\n * Returns a codec for encoding and decoding literal unions.\n *\n * A literal union codec serializes and deserializes values\n * from a predefined set of literals, using a numerical index\n * to represent each value in the `variants` array.\n *\n * This allows efficient storage and retrieval of common\n * predefined values such as enum-like structures in TypeScript.\n *\n * @typeParam TVariants - A tuple of allowed literal values.\n *\n * @param variants - The possible literal values for the union.\n * @param config - Configuration options for encoding and decoding the literal union.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding literal unions.\n *\n * @example\n * Encoding and decoding a union of string literals.\n * ```ts\n * type Size = 'small' | 'medium' | 'large';\n * const sizeCodec = getLiteralUnionCodec(['small', 'medium', 'large']);\n *\n * sizeCodec.encode('small'); // 0x00\n * sizeCodec.encode('medium'); // 0x01\n * sizeCodec.encode('large'); // 0x02\n *\n * sizeCodec.decode(new Uint8Array([0x00])); // 'small'\n * sizeCodec.decode(new Uint8Array([0x01])); // 'medium'\n * sizeCodec.decode(new Uint8Array([0x02])); // 'large'\n * ```\n *\n * @example\n * Encoding and decoding a union of number literals.\n * ```ts\n * type Level = 10 | 20 | 30;\n * const levelCodec = getLiteralUnionCodec([10, 20, 30]);\n *\n * levelCodec.encode(10); // 0x00\n * levelCodec.encode(20); // 0x01\n * levelCodec.encode(30); // 0x02\n *\n * levelCodec.decode(new Uint8Array([0x00])); // 10\n * levelCodec.decode(new Uint8Array([0x01])); // 20\n * levelCodec.decode(new Uint8Array([0x02])); // 30\n * ```\n *\n * @example\n * Using a custom discriminator size with different variant types.\n * ```ts\n * type MaybeBoolean = false | true | \"either\";\n * const codec = getLiteralUnionCodec([false, true, 'either'], { size: getU16Codec() });\n *\n * codec.encode(false); // 0x0000\n * codec.encode(true); // 0x0100\n * codec.encode('either'); // 0x0200\n *\n * codec.decode(new Uint8Array([0x00, 0x00])); // false\n * codec.decode(new Uint8Array([0x01, 0x00])); // true\n * codec.decode(new Uint8Array([0x02, 0x00])); // 'either'\n * ```\n *\n * @remarks\n * Separate {@link getLiteralUnionEncoder} and {@link getLiteralUnionDecoder} functions are available.\n *\n * ```ts\n * const bytes = getLiteralUnionEncoder(['red', 'green', 'blue']).encode('green');\n * const value = getLiteralUnionDecoder(['red', 'green', 'blue']).decode(bytes);\n * ```\n *\n * @see {@link getLiteralUnionEncoder}\n * @see {@link getLiteralUnionDecoder}\n */\nexport function getLiteralUnionCodec(\n variants: TVariants,\n): FixedSizeCodec, GetTypeFromVariants, 1>;\nexport function getLiteralUnionCodec(\n variants: TVariants,\n config: LiteralUnionCodecConfig & { size: FixedSizeNumberCodec },\n): FixedSizeCodec, GetTypeFromVariants, TSize>;\nexport function getLiteralUnionCodec(\n variants: TVariants,\n config?: LiteralUnionCodecConfig,\n): VariableSizeCodec>;\nexport function getLiteralUnionCodec(\n variants: TVariants,\n config: LiteralUnionCodecConfig = {},\n): Codec> {\n return combineCodec(getLiteralUnionEncoder(variants, config), getLiteralUnionDecoder(variants, config));\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\n\nimport { ArrayLikeCodecSize, getArrayDecoder, getArrayEncoder } from './array';\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\n\n/**\n * Defines the configuration options for map codecs.\n *\n * The `size` option determines how the number of entries in the map is stored.\n * It can be:\n * - A {@link NumberCodec} to prefix the map with its size.\n * - A fixed number of entries.\n * - `'remainder'`, which infers the number of entries based on the remaining bytes.\n * This option is only available for fixed-size keys and values.\n *\n * @typeParam TPrefix - A number codec, encoder, or decoder used for the size prefix.\n */\nexport type MapCodecConfig = {\n /**\n * The size of the map.\n * @defaultValue u32 prefix.\n */\n size?: ArrayLikeCodecSize;\n};\n\n/**\n * Returns an encoder for maps.\n *\n * This encoder serializes maps where the keys and values are encoded\n * using the provided key and value encoders. The number of entries\n * is determined by the `size` configuration.\n *\n * For more details, see {@link getMapCodec}.\n *\n * @typeParam TFromKey - The type of the keys before encoding.\n * @typeParam TFromValue - The type of the values before encoding.\n *\n * @param key - The encoder for the map's keys.\n * @param value - The encoder for the map's values.\n * @param config - Configuration options for encoding the map.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding maps.\n *\n * @example\n * Encoding a map with a `u32` size prefix.\n * ```ts\n * const encoder = getMapEncoder(fixCodecSize(getUtf8Encoder(), 5), getU8Encoder());\n * const bytes = encoder.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x02000000616c6963652a626f62000005\n * // | | | | └── Value (5)\n * // | | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | | └── Value (42)\n * // | └── Key (\"alice\", 5 bytes fixed)\n * // └── 4-byte prefix (2 entries)\n * ```\n *\n * @see {@link getMapCodec}\n */\nexport function getMapEncoder(\n key: Encoder,\n value: Encoder,\n config: MapCodecConfig & { size: 0 },\n): FixedSizeEncoder, 0>;\nexport function getMapEncoder(\n key: FixedSizeEncoder,\n value: FixedSizeEncoder,\n config: MapCodecConfig & { size: number },\n): FixedSizeEncoder>;\nexport function getMapEncoder(\n key: Encoder,\n value: Encoder,\n config?: MapCodecConfig,\n): VariableSizeEncoder>;\nexport function getMapEncoder(\n key: Encoder,\n value: Encoder,\n config: MapCodecConfig = {},\n): Encoder> {\n return transformEncoder(\n getArrayEncoder(getTupleEncoder([key, value]), config as object),\n (map: Map): [TFromKey, TFromValue][] => [...map.entries()],\n );\n}\n\n/**\n * Returns a decoder for maps.\n *\n * This decoder deserializes maps where the keys and values are decoded\n * using the provided key and value decoders. The number of entries\n * is determined by the `size` configuration.\n *\n * For more details, see {@link getMapCodec}.\n *\n * @typeParam TToKey - The type of the keys after decoding.\n * @typeParam TToValue - The type of the values after decoding.\n *\n * @param key - The decoder for the map's keys.\n * @param value - The decoder for the map's values.\n * @param config - Configuration options for decoding the map.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding maps.\n *\n * @example\n * Decoding a map with a `u32` size prefix.\n * ```ts\n * const decoder = getMapDecoder(fixCodecSize(getUtf8Decoder(), 5), getU8Decoder());\n * const map = decoder.decode(new Uint8Array([\n * 0x02,0x00,0x00,0x00,0x61,0x6c,0x69,0x63,0x65,0x2a,0x62,0x6f,0x62,0x00,0x00,0x05\n * ]));\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @see {@link getMapCodec}\n */\nexport function getMapDecoder(\n key: Decoder,\n value: Decoder,\n config: MapCodecConfig & { size: 0 },\n): FixedSizeDecoder, 0>;\nexport function getMapDecoder(\n key: FixedSizeDecoder,\n value: FixedSizeDecoder,\n config: MapCodecConfig & { size: number },\n): FixedSizeDecoder>;\nexport function getMapDecoder(\n key: Decoder,\n value: Decoder,\n config?: MapCodecConfig,\n): VariableSizeDecoder>;\nexport function getMapDecoder(\n key: Decoder,\n value: Decoder,\n config: MapCodecConfig = {},\n): Decoder> {\n return transformDecoder(\n getArrayDecoder(getTupleDecoder([key, value]), config as object) as Decoder<[TToKey, TToValue][]>,\n (entries: [TToKey, TToValue][]): Map => new Map(entries),\n );\n}\n\n/**\n * Returns a codec for encoding and decoding maps.\n *\n * This codec serializes maps where the key/value pairs are encoded\n * and decoded one after another using the provided key and value codecs.\n * The number of entries is determined by the `size` configuration and\n * defaults to a `u32` size prefix.\n *\n * @typeParam TFromKey - The type of the keys before encoding.\n * @typeParam TFromValue - The type of the values before encoding.\n * @typeParam TToKey - The type of the keys after decoding.\n * @typeParam TToValue - The type of the values after decoding.\n *\n * @param key - The codec for the map's keys.\n * @param value - The codec for the map's values.\n * @param config - Configuration options for encoding and decoding the map.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding maps.\n *\n * @example\n * Encoding and decoding a map with a `u32` size prefix (default).\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec());\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x02000000616c6963652a626f62000005\n * // | | | | └── Value (5)\n * // | | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | | └── Value (42)\n * // | └── Key (\"alice\", 5 bytes fixed)\n * // └── 4-byte prefix (2 entries)\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @example\n * Encoding and decoding a map with a `u16` size prefix.\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec(), { size: getU16Codec() });\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x0200616c6963652a626f62000005\n * // | | | | └── Value (5)\n * // | | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | | └── Value (42)\n * // | └── Key (\"alice\", 5 bytes fixed)\n * // └── 2-byte prefix (2 entries)\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @example\n * Encoding and decoding a fixed-size map.\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec(), { size: 2 });\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x616c6963652a626f62000005\n * // | | | └── Value (5)\n * // | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | └── Value (42)\n * // └── Key (\"alice\", 5 bytes fixed)\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @example\n * Encoding and decoding a map with remainder size.\n * ```ts\n * const codec = getMapCodec(fixCodecSize(getUtf8Codec(), 5), getU8Codec(), { size: 'remainder' });\n * const bytes = codec.encode(new Map([['alice', 42], ['bob', 5]]));\n * // 0x616c6963652a626f62000005\n * // | | | └── Value (5)\n * // | | └── Key (\"bob\", 5 bytes fixed, null-padded)\n * // | └── Value (42)\n * // └── Key (\"alice\", 5 bytes fixed)\n * // No size prefix, the size is inferred from the remaining bytes.\n *\n * const map = codec.decode(bytes);\n * // new Map([['alice', 42], ['bob', 5]])\n * ```\n *\n * @remarks\n * Separate {@link getMapEncoder} and {@link getMapDecoder} functions are available.\n * ```ts\n * const bytes = getMapEncoder(fixCodecSize(getUtf8Encoder(), 5), getU8Encoder()).encode(new Map([['alice', 42]]));\n * const map = getMapDecoder(fixCodecSize(getUtf8Decoder(), 5), getU8Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getMapEncoder}\n * @see {@link getMapDecoder}\n */\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: Codec,\n value: Codec,\n config: MapCodecConfig & { size: 0 },\n): FixedSizeCodec, Map, 0>;\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: FixedSizeCodec,\n value: FixedSizeCodec,\n config: MapCodecConfig & { size: number },\n): FixedSizeCodec, Map>;\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: Codec,\n value: Codec,\n config?: MapCodecConfig,\n): VariableSizeCodec, Map>;\nexport function getMapCodec<\n TFromKey,\n TFromValue,\n TToKey extends TFromKey = TFromKey,\n TToValue extends TFromValue = TFromValue,\n>(\n key: Codec,\n value: Codec,\n config: MapCodecConfig = {},\n): Codec, Map> {\n return combineCodec(getMapEncoder(key, value, config as object), getMapDecoder(key, value, config as object));\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\n\n/**\n * Returns an encoder for `void` values.\n *\n * This encoder writes nothing to the byte array and has a fixed size of 0 bytes.\n * It is useful when working with structures that require a no-op encoder,\n * such as empty variants in {@link getDiscriminatedUnionEncoder}.\n *\n * For more details, see {@link getUnitCodec}.\n *\n * @returns A `FixedSizeEncoder`, representing an empty encoder.\n *\n * @example\n * Encoding a `void` value.\n * ```ts\n * getUnitEncoder().encode(undefined); // Produces an empty byte array.\n * ```\n *\n * @see {@link getUnitCodec}\n */\nexport function getUnitEncoder(): FixedSizeEncoder {\n return createEncoder({\n fixedSize: 0,\n write: (_value, _bytes, offset) => offset,\n });\n}\n\n/**\n * Returns a decoder for `void` values.\n *\n * This decoder always returns `undefined` and has a fixed size of 0 bytes.\n * It is useful when working with structures that require a no-op decoder,\n * such as empty variants in {@link getDiscriminatedUnionDecoder}.\n *\n * For more details, see {@link getUnitCodec}.\n *\n * @returns A `FixedSizeDecoder`, representing an empty decoder.\n *\n * @example\n * Decoding a `void` value.\n * ```ts\n * getUnitDecoder().decode(anyBytes); // Returns `undefined`.\n * ```\n *\n * @see {@link getUnitCodec}\n */\nexport function getUnitDecoder(): FixedSizeDecoder {\n return createDecoder({\n fixedSize: 0,\n read: (_bytes: ReadonlyUint8Array | Uint8Array, offset) => [undefined, offset],\n });\n}\n\n/**\n * Returns a codec for `void` values.\n *\n * This codec does nothing when encoding or decoding and has a fixed size of 0 bytes.\n * Namely, it always returns `undefined` when decoding and produces an empty byte array when encoding.\n *\n * This can be useful when working with structures that require a no-op codec,\n * such as empty variants in {@link getDiscriminatedUnionCodec}.\n *\n * @returns A `FixedSizeCodec`, representing an empty codec.\n *\n * @example\n * Encoding and decoding a `void` value.\n * ```ts\n * const codec = getUnitCodec();\n *\n * codec.encode(undefined); // Produces an empty byte array.\n * codec.decode(new Uint8Array([])); // Returns `undefined`.\n * ```\n *\n * @example\n * Using unit codecs as empty variants in a discriminated union.\n * ```ts\n * type Message =\n * | { __kind: 'Enter' }\n * | { __kind: 'Leave' }\n * | { __kind: 'Move'; x: number; y: number };\n *\n * const messageCodec = getDiscriminatedUnionCodec([\n * ['Enter', getUnitCodec()], // <- No-op codec for empty data\n * ['Leave', getUnitCodec()], // <- No-op codec for empty data\n * ['Move', getStructCodec([...])]\n * ]);\n * ```\n *\n * @remarks\n * Separate {@link getUnitEncoder} and {@link getUnitDecoder} functions are available.\n *\n * ```ts\n * const bytes = getUnitEncoder().encode();\n * const value = getUnitDecoder().decode(bytes);\n * ```\n *\n * @see {@link getUnitEncoder}\n * @see {@link getUnitDecoder}\n */\nexport function getUnitCodec(): FixedSizeCodec {\n return combineCodec(getUnitEncoder(), getUnitDecoder());\n}\n","import {\n assertIsFixedSize,\n Codec,\n combineCodec,\n containsBytes,\n Decoder,\n Encoder,\n fixDecoderSize,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n fixEncoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\n\nimport { getBooleanDecoder, getBooleanEncoder } from './boolean';\nimport { getConstantDecoder, getConstantEncoder } from './constant';\nimport { getTupleDecoder, getTupleEncoder } from './tuple';\nimport { getUnionDecoder, getUnionEncoder } from './union';\nimport { getUnitDecoder, getUnitEncoder } from './unit';\n\n/**\n * Defines the configuration options for nullable codecs.\n *\n * This configuration controls how nullable values are encoded and decoded.\n *\n * By default, nullable values are prefixed with a `u8` (0 = `null`, 1 = present).\n * The `noneValue` and `prefix` options allow customizing this behavior.\n *\n * @typeParam TPrefix - A number codec, encoder, or decoder used as the presence prefix.\n *\n * @see {@link getNullableEncoder}\n * @see {@link getNullableDecoder}\n * @see {@link getNullableCodec}\n */\nexport type NullableCodecConfig = {\n /**\n * Specifies how `null` values are represented in the encoded data.\n *\n * - By default, `null` values are omitted from encoding.\n * - `'zeroes'`: The bytes allocated for the value are filled with zeroes. This requires a fixed-size codec.\n * - Custom byte array: `null` values are replaced with a predefined byte sequence. This results in a variable-size codec.\n *\n * @defaultValue No explicit `noneValue` is used; `null` values are omitted.\n */\n noneValue?: ReadonlyUint8Array | 'zeroes';\n\n /**\n * The presence prefix used to distinguish between `null` and present values.\n *\n * - By default, a `u8` prefix is used (`0 = null`, `1 = present`).\n * - Custom number codec: Allows defining a different number size for the prefix.\n * - `null`: No prefix is used; `noneValue` (if provided) determines `null`.\n * If no `noneValue` is set, `null` is identified by the absence of bytes.\n *\n * @defaultValue `u8` prefix.\n */\n prefix?: TPrefix | null;\n};\n\n/**\n * Returns an encoder for optional values, allowing `null` values to be encoded.\n *\n * This encoder serializes an optional value using a configurable approach:\n * - By default, a `u8` prefix is used (0 = `null`, 1 = present). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, `null` values are encoded as zeroes.\n * - If `noneValue` is a byte array, `null` values are replaced with the provided constant.\n *\n * For more details, see {@link getNullableCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param item - The encoder for the value that may be present.\n * @param config - Configuration options for encoding optional values.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding nullable values.\n *\n * @example\n * Encoding an optional number.\n * ```ts\n * const encoder = getNullableEncoder(getU32Encoder());\n *\n * encoder.encode(null); // 0x00\n * encoder.encode(42); // 0x012a000000\n * ```\n *\n * @see {@link getNullableCodec}\n */\nexport function getNullableEncoder(\n item: FixedSizeEncoder,\n config: NullableCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeEncoder;\nexport function getNullableEncoder(\n item: FixedSizeEncoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeEncoder;\nexport function getNullableEncoder(\n item: FixedSizeEncoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeEncoder;\nexport function getNullableEncoder(\n item: Encoder,\n config?: NullableCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeEncoder;\nexport function getNullableEncoder(\n item: Encoder,\n config: NullableCodecConfig = {},\n): Encoder {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformEncoder(getUnitEncoder(), (_boolean: boolean) => undefined);\n }\n return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixEncoderSize(getUnitEncoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitEncoder();\n }\n return getConstantEncoder(config.noneValue);\n })();\n\n return getUnionEncoder(\n [\n transformEncoder(getTupleEncoder([prefix, noneValue]), (_value: null): [boolean, void] => [\n false,\n undefined,\n ]),\n transformEncoder(getTupleEncoder([prefix, item]), (value: TFrom): [boolean, TFrom] => [true, value]),\n ],\n variant => Number(variant !== null),\n );\n}\n\n/**\n * Returns a decoder for optional values, allowing `null` values to be recognized.\n *\n * This decoder deserializes an optional value using a configurable approach:\n * - By default, a `u8` prefix is used (0 = `null`, 1 = present). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, `null` values are identified by zeroes.\n * - If `noneValue` is a byte array, `null` values match the provided constant.\n *\n * For more details, see {@link getNullableCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The decoder for the value that may be present.\n * @param config - Configuration options for decoding optional values.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding nullable values.\n *\n * @example\n * Decoding an optional number.\n * ```ts\n * const decoder = getNullableDecoder(getU32Decoder());\n *\n * decoder.decode(new Uint8Array([0x00])); // null\n * decoder.decode(new Uint8Array([0x01, 0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @see {@link getNullableCodec}\n */\nexport function getNullableDecoder(\n item: FixedSizeDecoder,\n config: NullableCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeDecoder;\nexport function getNullableDecoder(\n item: FixedSizeDecoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeDecoder;\nexport function getNullableDecoder(\n item: FixedSizeDecoder,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeDecoder;\nexport function getNullableDecoder(\n item: Decoder,\n config?: NullableCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeDecoder;\nexport function getNullableDecoder(\n item: Decoder,\n config: NullableCodecConfig = {},\n): Decoder {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformDecoder(getUnitDecoder(), () => false);\n }\n return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixDecoderSize(getUnitDecoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitDecoder();\n }\n return getConstantDecoder(config.noneValue);\n })();\n\n return getUnionDecoder(\n [\n transformDecoder(getTupleDecoder([prefix, noneValue]), () => null),\n transformDecoder(getTupleDecoder([prefix, item]), ([, value]): TTo => value),\n ],\n (bytes, offset) => {\n if (config.prefix === null && !config.noneValue) {\n return Number(offset < bytes.length);\n }\n if (config.prefix === null && config.noneValue != null) {\n const zeroValue =\n config.noneValue === 'zeroes' ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue;\n return containsBytes(bytes, zeroValue, offset) ? 0 : 1;\n }\n return Number(prefix.read(bytes, offset)[0]);\n },\n );\n}\n\n/**\n * Returns a codec for encoding and decoding optional values, allowing `null` values to be handled.\n *\n * This codec serializes and deserializes optional values using a configurable approach:\n * - By default, a `u8` prefix is used (0 = `null`, 1 = present).\n * This can be customized using a custom number codec or even disabled by setting\n * the `prefix` to `null`.\n * - If `noneValue: 'zeroes'` is set, `null` values are encoded/decoded as zeroes.\n * - If `noneValue` is a byte array, `null` values are represented by the provided constant.\n *\n * For more details on the configuration options, see {@link NullableCodecConfig}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The codec for the value that may be present.\n * @param config - Configuration options for encoding and decoding optional values.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding nullable values.\n *\n * @example\n * Encoding and decoding an optional number using a `u8` prefix (default).\n * ```ts\n * const codec = getNullableCodec(getU32Codec());\n *\n * codec.encode(null); // 0x00\n * codec.encode(42); // 0x012a000000\n *\n * codec.decode(new Uint8Array([0x00])); // null\n * codec.decode(new Uint8Array([0x01, 0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @example\n * Encoding and decoding an optional number using a fixed-size codec, by filling `null` values with zeroes.\n * ```ts\n * const codec = getNullableCodec(getU32Codec(), { noneValue: 'zeroes' });\n *\n * codec.encode(null); // 0x0000000000\n * codec.encode(42); // 0x012a000000\n *\n * codec.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00])); // null\n * codec.decode(new Uint8Array([0x01, 0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @example\n * Encoding and decoding `null` values with zeroes and no prefix.\n * ```ts\n * const codec = getNullableCodec(getU32Codec(), {\n * noneValue: 'zeroes',\n * prefix: null,\n * });\n *\n * codec.encode(null); // 0x00000000\n * codec.encode(42); // 0x2a000000\n *\n * codec.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00])); // null\n * codec.decode(new Uint8Array([0x2a, 0x00, 0x00, 0x00])); // 42\n * ```\n *\n * @example\n * Encoding and decoding `null` values with a custom byte sequence and no prefix.\n * ```ts\n * const codec = getNullableCodec(getU16Codec(), {\n * noneValue: new Uint8Array([0xff, 0xff]),\n * prefix: null,\n * });\n *\n * codec.encode(null); // 0xffff\n * codec.encode(42); // 0x2a00\n *\n * codec.decode(new Uint8Array([0xff, 0xff])); // null\n * codec.decode(new Uint8Array([0x2a, 0x00])); // 42\n * ```\n *\n * @example\n * Identifying `null` values by the absence of bytes.\n * ```ts\n * const codec = getNullableCodec(getU16Codec(), { prefix: null });\n *\n * codec.encode(null); // Empty bytes\n * codec.encode(42); // 0x2a00\n *\n * codec.decode(new Uint8Array([])); // null\n * codec.decode(new Uint8Array([0x2a, 0x00])); // 42\n * ```\n *\n * @remarks\n * Separate {@link getNullableEncoder} and {@link getNullableDecoder} functions are available.\n *\n * ```ts\n * const bytes = getNullableEncoder(getU32Encoder()).encode(42);\n * const value = getNullableDecoder(getU32Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getNullableEncoder}\n * @see {@link getNullableDecoder}\n */\nexport function getNullableCodec(\n item: FixedSizeCodec,\n config: NullableCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeCodec;\nexport function getNullableCodec(\n item: FixedSizeCodec,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeCodec;\nexport function getNullableCodec(\n item: FixedSizeCodec,\n config: NullableCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeCodec;\nexport function getNullableCodec(\n item: Codec,\n config?: NullableCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeCodec;\nexport function getNullableCodec(\n item: Codec,\n config: NullableCodecConfig = {},\n): Codec {\n type ConfigCast = NullableCodecConfig & { noneValue?: ReadonlyUint8Array };\n return combineCodec(\n getNullableEncoder(item, config as ConfigCast),\n getNullableDecoder(item, config as ConfigCast),\n );\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\n\nimport { ArrayLikeCodecSize, getArrayDecoder, getArrayEncoder } from './array';\n\n/**\n * Defines the configuration options for set codecs.\n *\n * This configuration allows specifying how the size of the set is encoded.\n * The `size` option can be:\n *\n * - A {@link NumberCodec}, {@link NumberEncoder}, or {@link NumberDecoder} to store the size as a prefix.\n * - A fixed number of items, enforcing a strict length.\n * - The string `'remainder'` to infer the set size from the remaining bytes (only for fixed-size items).\n *\n * @typeParam TPrefix - The type used for encoding the size of the set.\n */\nexport type SetCodecConfig = {\n /**\n * The size encoding strategy for the set.\n * @defaultValue Uses a `u32` prefix.\n */\n size?: ArrayLikeCodecSize;\n};\n\n/**\n * Returns an encoder for sets of items.\n *\n * This encoder serializes `Set` values by encoding each item using the provided item encoder.\n * The number of items is stored as a prefix using a `u32` codec by default.\n *\n * For more details, see {@link getSetCodec}.\n *\n * @typeParam TFrom - The type of the items in the set before encoding.\n *\n * @param item - The encoder to use for each set item.\n * @param config - Optional configuration specifying the size strategy.\n * @returns An `Encoder>` for encoding sets of items.\n *\n * @example\n * Encoding a set of `u8` numbers.\n * ```ts\n * const encoder = getSetEncoder(getU8Encoder());\n * const bytes = encoder.encode(new Set([1, 2, 3]));\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix indicating 3 items.\n * ```\n *\n * @see {@link getSetCodec}\n */\nexport function getSetEncoder(\n item: Encoder,\n config: SetCodecConfig & { size: 0 },\n): FixedSizeEncoder, 0>;\nexport function getSetEncoder(\n item: FixedSizeEncoder,\n config: SetCodecConfig & { size: number },\n): FixedSizeEncoder>;\nexport function getSetEncoder(\n item: Encoder,\n config?: SetCodecConfig,\n): VariableSizeEncoder>;\nexport function getSetEncoder(\n item: Encoder,\n config: SetCodecConfig = {},\n): Encoder> {\n return transformEncoder(getArrayEncoder(item, config as object), (set: Set): TFrom[] => [...set]);\n}\n\n/**\n * Returns a decoder for sets of items.\n *\n * This decoder deserializes a `Set` from a byte array by decoding each item using the provided item decoder.\n * The number of items is determined by a `u32` size prefix by default.\n *\n * For more details, see {@link getSetCodec}.\n *\n * @typeParam TTo - The type of the items in the set after decoding.\n *\n * @param item - The decoder to use for each set item.\n * @param config - Optional configuration specifying the size strategy.\n * @returns A `Decoder>` for decoding sets of items.\n *\n * @example\n * Decoding a set of `u8` numbers.\n * ```ts\n * const decoder = getSetDecoder(getU8Decoder());\n * const value = decoder.decode(new Uint8Array([0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03]));\n * // new Set([1, 2, 3])\n * ```\n *\n * @see {@link getSetCodec}\n */\nexport function getSetDecoder(\n item: Decoder,\n config: SetCodecConfig & { size: 0 },\n): FixedSizeDecoder, 0>;\nexport function getSetDecoder(\n item: FixedSizeDecoder,\n config: SetCodecConfig & { size: number },\n): FixedSizeDecoder>;\nexport function getSetDecoder(\n item: Decoder,\n config?: SetCodecConfig,\n): VariableSizeDecoder>;\nexport function getSetDecoder(item: Decoder, config: SetCodecConfig = {}): Decoder> {\n return transformDecoder(getArrayDecoder(item, config as object), (entries: TTo[]): Set => new Set(entries));\n}\n\n/**\n * Returns a codec for encoding and decoding sets of items.\n *\n * This codec serializes `Set` values by encoding each item using the provided item codec.\n * The number of items is stored as a prefix using a `u32` codec by default.\n *\n * @typeParam TFrom - The type of the items in the set before encoding.\n * @typeParam TTo - The type of the items in the set after decoding.\n *\n * @param item - The codec to use for each set item.\n * @param config - Optional configuration specifying the size strategy.\n * @returns A `Codec, Set>` for encoding and decoding sets.\n *\n * @example\n * Encoding and decoding a set of `u8` numbers.\n * ```ts\n * const codec = getSetCodec(getU8Codec());\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x03000000010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 4-byte prefix indicating 3 items.\n *\n * const value = codec.decode(bytes);\n * // new Set([1, 2, 3])\n * ```\n *\n * @example\n * Using a `u16` prefix for size.\n * ```ts\n * const codec = getSetCodec(getU8Codec(), { size: getU16Codec() });\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x0300010203\n * // | └-- 3 items of 1 byte each.\n * // └-- 2-byte prefix indicating 3 items.\n * ```\n *\n * @example\n * Using a fixed-size set.\n * ```ts\n * const codec = getSetCodec(getU8Codec(), { size: 3 });\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x010203\n * // └-- Exactly 3 items of 1 byte each.\n * ```\n *\n * @example\n * Using remainder to infer set size.\n * ```ts\n * const codec = getSetCodec(getU8Codec(), { size: 'remainder' });\n * const bytes = codec.encode(new Set([1, 2, 3]));\n * // 0x010203\n * // └-- 3 items of 1 byte each. The size is inferred from the remaining bytes.\n * ```\n *\n * @remarks\n * Separate {@link getSetEncoder} and {@link getSetDecoder} functions are available.\n *\n * ```ts\n * const bytes = getSetEncoder(getU8Encoder()).encode(new Set([1, 2, 3]));\n * const value = getSetDecoder(getU8Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getSetEncoder}\n * @see {@link getSetDecoder}\n */\nexport function getSetCodec(\n item: Codec,\n config: SetCodecConfig & { size: 0 },\n): FixedSizeCodec, Set, 0>;\nexport function getSetCodec(\n item: FixedSizeCodec,\n config: SetCodecConfig & { size: number },\n): FixedSizeCodec, Set>;\nexport function getSetCodec(\n item: Codec,\n config?: SetCodecConfig,\n): VariableSizeCodec, Set>;\nexport function getSetCodec(\n item: Codec,\n config: SetCodecConfig = {},\n): Codec, Set> {\n return combineCodec(getSetEncoder(item, config as object), getSetDecoder(item, config as object));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Codec,\n combineCodec,\n createDecoder,\n createEncoder,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n getEncodedSize,\n ReadonlyUint8Array,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { DrainOuterGeneric, getFixedSize, getMaxSize, sumCodecSizes } from './utils';\n\n/**\n * Represents a collection of named fields used in struct codecs.\n *\n * Each field is defined as a tuple containing:\n * - A string key representing the field name.\n * - A codec used to encode and decode the field's value.\n *\n * @typeParam T - The codec type used for each field.\n */\ntype Fields = readonly (readonly [string, T])[];\n\ntype ArrayIndices = Exclude['length'], T['length']> & number;\n\n/**\n * Infers the TypeScript type for an object that can be encoded using a struct codec.\n *\n * This type maps the provided field encoders to their corresponding values.\n *\n * @typeParam TFields - The fields of the struct, each paired with an encoder.\n */\ntype GetEncoderTypeFromFields>> = DrainOuterGeneric<{\n [I in ArrayIndices as TFields[I][0]]: TFields[I][1] extends Encoder ? TFrom : never;\n}>;\n\n/**\n * Infers the TypeScript type for an object that can be decoded using a struct codec.\n *\n * This type maps the provided field decoders to their corresponding values.\n *\n * @typeParam TFields - The fields of the struct, each paired with a decoder.\n */\ntype GetDecoderTypeFromFields>> = DrainOuterGeneric<{\n [I in ArrayIndices as TFields[I][0]]: TFields[I][1] extends Decoder ? TTo : never;\n}>;\n\n/**\n * Returns an encoder for custom objects.\n *\n * This encoder serializes an object by encoding its fields sequentially,\n * using the provided field encoders.\n *\n * For more details, see {@link getStructCodec}.\n *\n * @typeParam TFields - The fields of the struct, each paired with an encoder.\n *\n * @param fields - The name and encoder of each field.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding custom objects.\n *\n * @example\n * Encoding a custom struct.\n * ```ts\n * const encoder = getStructEncoder([\n * ['name', fixCodecSize(getUtf8Encoder(), 5)],\n * ['age', getU8Encoder()]\n * ]);\n *\n * const bytes = encoder.encode({ name: 'Alice', age: 42 });\n * // 0x416c6963652a\n * // | └── Age (42)\n * // └── Name (\"Alice\")\n * ```\n *\n * @see {@link getStructCodec}\n */\nexport function getStructEncoder>>(\n fields: TFields,\n): FixedSizeEncoder>;\nexport function getStructEncoder>>(\n fields: TFields,\n): VariableSizeEncoder>;\nexport function getStructEncoder>>(\n fields: TFields,\n): Encoder> {\n type TFrom = GetEncoderTypeFromFields;\n const fieldCodecs = fields.map(([, codec]) => codec);\n const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize));\n const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? undefined;\n\n return createEncoder({\n ...(fixedSize === null\n ? {\n getSizeFromValue: (value: TFrom) =>\n fields\n .map(([key, codec]) => getEncodedSize(value[key as keyof TFrom], codec))\n .reduce((all, one) => all + one, 0),\n maxSize,\n }\n : { fixedSize }),\n write: (struct: TFrom, bytes, offset) => {\n fields.forEach(([key, codec]) => {\n offset = codec.write(struct[key as keyof TFrom], bytes, offset);\n });\n return offset;\n },\n });\n}\n\n/**\n * Returns a decoder for custom objects.\n *\n * This decoder deserializes an object by decoding its fields sequentially,\n * using the provided field decoders.\n *\n * For more details, see {@link getStructCodec}.\n *\n * @typeParam TFields - The fields of the struct, each paired with a decoder.\n *\n * @param fields - The name and decoder of each field.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding custom objects.\n *\n * @example\n * Decoding a custom struct.\n * ```ts\n * const decoder = getStructDecoder([\n * ['name', fixCodecSize(getUtf8Decoder(), 5)],\n * ['age', getU8Decoder()]\n * ]);\n *\n * const struct = decoder.decode(new Uint8Array([\n * 0x41,0x6c,0x69,0x63,0x65,0x2a\n * ]));\n * // { name: 'Alice', age: 42 }\n * ```\n *\n * @see {@link getStructCodec}\n */\nexport function getStructDecoder>>(\n fields: TFields,\n): FixedSizeDecoder>;\nexport function getStructDecoder>>(\n fields: TFields,\n): VariableSizeDecoder>;\nexport function getStructDecoder>>(\n fields: TFields,\n): Decoder> {\n type TTo = GetDecoderTypeFromFields;\n const fieldCodecs = fields.map(([, codec]) => codec);\n const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize));\n const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? undefined;\n\n return createDecoder({\n ...(fixedSize === null ? { maxSize } : { fixedSize }),\n read: (bytes: ReadonlyUint8Array | Uint8Array, offset) => {\n const struct = {} as TTo;\n fields.forEach(([key, codec]) => {\n const [value, newOffset] = codec.read(bytes, offset);\n offset = newOffset;\n struct[key as keyof TTo] = value;\n });\n return [struct, offset];\n },\n });\n}\n\n/**\n * Returns a codec for encoding and decoding custom objects.\n *\n * This codec serializes objects by encoding and decoding each field sequentially.\n *\n * @typeParam TFields - The fields of the struct, each paired with a codec.\n *\n * @param fields - The name and codec of each field.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding custom objects.\n *\n * @example\n * Encoding and decoding a custom struct.\n * ```ts\n * const codec = getStructCodec([\n * ['name', fixCodecSize(getUtf8Codec(), 5)],\n * ['age', getU8Codec()]\n * ]);\n *\n * const bytes = codec.encode({ name: 'Alice', age: 42 });\n * // 0x416c6963652a\n * // | └── Age (42)\n * // └── Name (\"Alice\")\n *\n * const struct = codec.decode(bytes);\n * // { name: 'Alice', age: 42 }\n * ```\n *\n * @remarks\n * Separate {@link getStructEncoder} and {@link getStructDecoder} functions are available.\n *\n * ```ts\n * const bytes = getStructEncoder([\n * ['name', fixCodecSize(getUtf8Encoder(), 5)],\n * ['age', getU8Encoder()]\n * ]).encode({ name: 'Alice', age: 42 });\n *\n * const struct = getStructDecoder([\n * ['name', fixCodecSize(getUtf8Decoder(), 5)],\n * ['age', getU8Decoder()]\n * ]).decode(bytes);\n * ```\n *\n * @see {@link getStructEncoder}\n * @see {@link getStructDecoder}\n */\nexport function getStructCodec>>(\n fields: TFields,\n): FixedSizeCodec<\n GetEncoderTypeFromFields,\n GetDecoderTypeFromFields & GetEncoderTypeFromFields\n>;\nexport function getStructCodec>>(\n fields: TFields,\n): VariableSizeCodec<\n GetEncoderTypeFromFields,\n GetDecoderTypeFromFields & GetEncoderTypeFromFields\n>;\nexport function getStructCodec>>(\n fields: TFields,\n): Codec, GetDecoderTypeFromFields & GetEncoderTypeFromFields> {\n return combineCodec(\n getStructEncoder(fields),\n getStructDecoder(fields) as Decoder & GetEncoderTypeFromFields>,\n );\n}\n","/**\n * An implementation of the Rust `Option` type in JavaScript.\n *\n * In Rust, optional values are represented using `Option`, which can be either:\n * - `Some(T)`, indicating a present value.\n * - `None`, indicating the absence of a value.\n *\n * In JavaScript, this is typically represented as `T | null`. However, this approach fails with nested options.\n * For example, `Option>` in Rust would translate to `T | null | null` in JavaScript, which is equivalent to `T | null`.\n * This means there is no way to differentiate between `Some(None)` and `None`, making nested options impossible.\n *\n * This `Option` type helps solve this by mirroring Rust’s `Option` type.\n *\n * ```ts\n * type Option = Some | None;\n * type Some = { __option: 'Some'; value: T };\n * type None = { __option: 'None' };\n * ```\n *\n * @typeParam T - The type of the contained value.\n *\n * @example\n * Here's how you can create `Option` values.\n *\n * To improve developer experience, helper functions are available.\n * TypeScript can infer the type of `T` or it can be explicitly provided.\n *\n * ```ts\n * // Create an option with a value.\n * some('Hello World');\n * some(123);\n *\n * // Create an empty option.\n * none();\n * none();\n * ```\n *\n * @see {@link Some}\n * @see {@link None}\n * @see {@link some}\n * @see {@link none}\n */\nexport type Option = None | Some;\n\n/**\n * A flexible type that allows working with {@link Option} values or nullable values.\n *\n * It defines a looser type that can be used when encoding {@link Option | Options}.\n * This allows us to pass `null` or the nested value directly whilst still\n * supporting the Option type for use-cases that need more type safety.\n *\n * @typeParam T - The type of the contained value.\n *\n * @example\n * Accepting both `Option` and `T | null` as input.\n * ```ts\n * function double(value: OptionOrNullable) {\n * const option = isOption(value) ? value : wrapNullable(value);\n * return isSome(option) ? option.value * 2 : 'No value';\n * }\n *\n * double(42); // 84\n * double(some(21)); // 42\n * double(none()); // \"No value\"\n * double(null); // \"No value\"\n * ```\n *\n * @see {@link Option}\n * @see {@link isOption}\n * @see {@link wrapNullable}\n */\nexport type OptionOrNullable = Option | T | null;\n\n/**\n * Represents an {@link Option} that contains a value.\n *\n * This type mirrors Rust’s `Some(T)`, indicating that a value is present.\n *\n * For more details, see {@link Option}.\n *\n * @typeParam T - The type of the contained value.\n *\n * @example\n * Creating a `Some` value.\n * ```ts\n * const value = some(42);\n * isSome(value); // true\n * isNone(value); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link some}\n * @see {@link isSome}\n */\nexport type Some = Readonly<{ __option: 'Some'; value: T }>;\n\n/**\n * Represents an {@link Option} that contains no value.\n *\n * This type mirrors Rust’s `None`, indicating the absence of a value.\n *\n * For more details, see {@link Option}.\n *\n * @example\n * Creating a `None` value.\n * ```ts\n * const empty = none();\n * isNone(empty); // true\n * isSome(empty); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link none}\n * @see {@link isNone}\n */\nexport type None = Readonly<{ __option: 'None' }>;\n\n/**\n * Creates a new {@link Option} that contains a value.\n *\n * This function explicitly wraps a value in an {@link Option} type.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param value - The value to wrap in an {@link Option}.\n * @returns An {@link Option} containing the provided value.\n *\n * @example\n * Wrapping a value in an `Option`.\n * ```ts\n * const option = some('Hello');\n * option.value; // \"Hello\"\n * isOption(option); // true\n * isSome(option); // true\n * isNone(option); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n */\nexport const some = (value: T): Option => ({ __option: 'Some', value });\n\n/**\n * Creates a new {@link Option} that contains no value.\n *\n * This function explicitly represents an absent value.\n *\n * @typeParam T - The type of the expected absent value.\n *\n * @returns An {@link Option} containing no value.\n *\n * @example\n * Creating an empty `Option`.\n * ```ts\n * const empty = none();\n * isOption(empty); // true\n * isSome(empty); // false\n * isNone(empty); // true\n * ```\n *\n * @see {@link Option}\n * @see {@link None}\n */\nexport const none = (): Option => ({ __option: 'None' });\n\n/**\n * Checks whether the given value is an {@link Option}.\n *\n * This function determines whether an input follows the `Option` structure.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param input - The value to check.\n * @returns `true` if the value is an {@link Option}, `false` otherwise.\n *\n * @example\n * Checking for `Option` values.\n * ```ts\n * isOption(some(42)); // true\n * isOption(none()); // true\n * isOption(42); // false\n * isOption(null); // false\n * isOption(\"anything else\"); // false\n * ```\n *\n * @see {@link Option}\n */\nexport const isOption = (input: unknown): input is Option =>\n !!(\n input &&\n typeof input === 'object' &&\n '__option' in input &&\n ((input.__option === 'Some' && 'value' in input) || input.__option === 'None')\n );\n\n/**\n * Checks whether the given {@link Option} contains a value.\n *\n * This function acts as a type guard, ensuring the value is a {@link Some}.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param option - The {@link Option} to check.\n * @returns `true` if the option is a {@link Some}, `false` otherwise.\n *\n * @example\n * Checking for `Some` values.\n * ```ts\n * isSome(some(42)); // true\n * isSome(none()); // false\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n */\nexport const isSome = (option: Option): option is Some => option.__option === 'Some';\n\n/**\n * Checks whether the given {@link Option} contains no value.\n *\n * This function acts as a type guard, ensuring the value is a {@link None}.\n *\n * @typeParam T - The type of the expected value.\n *\n * @param option - The {@link Option} to check.\n * @returns `true` if the option is a {@link None}, `false` otherwise.\n *\n * @example\n * Checking for `None` values.\n * ```ts\n * isNone(some(42)); // false\n * isNone(none()); // true\n * ```\n *\n * @see {@link Option}\n * @see {@link None}\n */\nexport const isNone = (option: Option): option is None => option.__option === 'None';\n","import { isSome, none, Option, some } from './option';\n\n/**\n * Unwraps the value of an {@link Option}, returning its contained value or a fallback.\n *\n * This function extracts the value `T` from an `Option` type.\n * - If the option is {@link Some}, it returns the contained value `T`.\n * - If the option is {@link None}, it returns the fallback value `U`, which defaults to `null`.\n *\n * @typeParam T - The type of the contained value.\n * @typeParam U - The type of the fallback value (defaults to `null`).\n *\n * @param option - The {@link Option} to unwrap.\n * @param fallback - A function that provides a fallback value if the option is {@link None}.\n * @returns The contained value if {@link Some}, otherwise the fallback value.\n *\n * @example\n * Unwrapping an `Option` with no fallback.\n * ```ts\n * unwrapOption(some('Hello World')); // \"Hello World\"\n * unwrapOption(none()); // null\n * ```\n *\n * @example\n * Providing a custom fallback value.\n * ```ts\n * unwrapOption(some('Hello World'), () => 'Default'); // \"Hello World\"\n * unwrapOption(none(), () => 'Default'); // \"Default\"\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n * @see {@link None}\n */\nexport function unwrapOption(option: Option): T | null;\nexport function unwrapOption(option: Option, fallback: () => U): T | U;\nexport function unwrapOption(option: Option, fallback?: () => U): T | U {\n if (isSome(option)) return option.value;\n return fallback ? fallback() : (null as U);\n}\n\n/**\n * Wraps a nullable value into an {@link Option}.\n *\n * - If the input value is `null`, this function returns {@link None}.\n * - Otherwise, it wraps the value in {@link Some}.\n *\n * @typeParam T - The type of the contained value.\n *\n * @param nullable - The nullable value to wrap.\n * @returns An {@link Option} wrapping the value.\n *\n * @example\n * Wrapping nullable values.\n * ```ts\n * wrapNullable('Hello World'); // Option (Some)\n * wrapNullable(null); // Option (None)\n * ```\n *\n * @see {@link Option}\n * @see {@link Some}\n * @see {@link None}\n */\nexport const wrapNullable = (nullable: T | null): Option => (nullable !== null ? some(nullable) : none());\n","import {\n assertIsFixedSize,\n Codec,\n combineCodec,\n containsBytes,\n Decoder,\n Encoder,\n fixDecoderSize,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n fixEncoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getBooleanDecoder,\n getBooleanEncoder,\n getConstantDecoder,\n getConstantEncoder,\n getTupleDecoder,\n getTupleEncoder,\n getUnionDecoder,\n getUnionEncoder,\n getUnitDecoder,\n getUnitEncoder,\n} from '@solana/codecs-data-structures';\nimport {\n FixedSizeNumberCodec,\n FixedSizeNumberDecoder,\n FixedSizeNumberEncoder,\n getU8Decoder,\n getU8Encoder,\n NumberCodec,\n NumberDecoder,\n NumberEncoder,\n} from '@solana/codecs-numbers';\n\nimport { isOption, isSome, None, none, Option, OptionOrNullable, Some, some } from './option';\nimport { wrapNullable } from './unwrap-option';\n\n/**\n * Defines the configuration options for {@link Option} codecs.\n *\n * The `getOptionCodec` function behaves similarly to {@link getNullableCodec}\n * but encodes `Option` types instead of `T | null` types.\n *\n * This configuration controls how {@link None} values are encoded and how presence\n * is determined when decoding.\n *\n * @typeParam TPrefix - A number codec, encoder, or decoder used as the presence prefix.\n *\n * @see {@link getOptionEncoder}\n * @see {@link getOptionDecoder}\n * @see {@link getOptionCodec}\n */\nexport type OptionCodecConfig = {\n /**\n * Specifies how {@link None} values are represented in the encoded data.\n *\n * - By default, {@link None} values are omitted from encoding.\n * - `'zeroes'`: The bytes allocated for the value are filled with zeroes. This requires a fixed-size codec for the item.\n * - Custom byte array: {@link None} values are replaced with a predefined byte sequence. This results in a variable-size codec.\n *\n * @defaultValue No explicit `noneValue` is used; {@link None} values are omitted.\n */\n noneValue?: ReadonlyUint8Array | 'zeroes';\n\n /**\n * The presence prefix used to distinguish between {@link None} and present values.\n *\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`).\n * - Custom number codec: Allows defining a different number size for the prefix.\n * - `null`: No prefix is used; `noneValue` (if provided) determines {@link None}.\n * If no `noneValue` is set, {@link None} is identified by the absence of bytes.\n *\n * @defaultValue `u8` prefix.\n */\n prefix?: TPrefix | null;\n};\n\n/**\n * Returns an encoder for optional values using the {@link Option} type.\n *\n * This encoder serializes an {@link OptionOrNullable} value using a configurable approach:\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, {@link None} values are encoded as zeroes.\n * - If `noneValue` is a byte array, {@link None} values are replaced with the provided constant.\n *\n * Unlike {@link getNullableEncoder}, this encoder accepts both {@link Option} and {@link Nullable} values.\n *\n * For more details, see {@link getOptionCodec}.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n *\n * @param item - The encoder for the value that may be present.\n * @param config - Configuration options for encoding optional values.\n * @returns A `FixedSizeEncoder` or `VariableSizeEncoder` for encoding option values.\n *\n * @example\n * Encoding an optional string.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const encoder = getOptionEncoder(stringCodec);\n *\n * encoder.encode(some('Hi'));\n * encoder.encode('Hi');\n * // 0x01020000004869\n * // | | └-- utf8 string content (\"Hi\").\n * // | └-- u32 string prefix (2 characters).\n * // └-- 1-byte prefix (Some).\n *\n * encoder.encode(none());\n * encoder.encode(null);\n * // 0x00\n * // └-- 1-byte prefix (None).\n * ```\n *\n * @see {@link getOptionCodec}\n */\nexport function getOptionEncoder(\n item: FixedSizeEncoder,\n config: OptionCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeEncoder, TSize>;\nexport function getOptionEncoder(\n item: FixedSizeEncoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeEncoder>;\nexport function getOptionEncoder(\n item: FixedSizeEncoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeEncoder>;\nexport function getOptionEncoder(\n item: Encoder,\n config?: OptionCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeEncoder>;\nexport function getOptionEncoder(\n item: Encoder,\n config: OptionCodecConfig = {},\n): Encoder> {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformEncoder(getUnitEncoder(), (_boolean: boolean) => undefined);\n }\n return getBooleanEncoder({ size: config.prefix ?? getU8Encoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixEncoderSize(getUnitEncoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitEncoder();\n }\n return getConstantEncoder(config.noneValue);\n })();\n\n return getUnionEncoder(\n [\n transformEncoder(getTupleEncoder([prefix, noneValue]), (_value: None | null): [boolean, void] => [\n false,\n undefined,\n ]),\n transformEncoder(getTupleEncoder([prefix, item]), (value: Some | TFrom): [boolean, TFrom] => [\n true,\n isOption(value) && isSome(value) ? value.value : value,\n ]),\n ],\n variant => {\n const option = isOption(variant) ? variant : wrapNullable(variant);\n return Number(isSome(option));\n },\n );\n}\n\n/**\n * Returns a decoder for optional values using the {@link Option} type.\n *\n * This decoder deserializes an `Option` value using a configurable approach:\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`). This can be customized or disabled.\n * - If `noneValue: 'zeroes'` is set, `None` values are identified by zeroes.\n * - If `noneValue` is a byte array, `None` values match the provided constant.\n *\n * Unlike {@link getNullableDecoder}, this decoder always outputs an {@link Option} type.\n *\n * For more details, see {@link getOptionCodec}.\n *\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The decoder for the value that may be present.\n * @param config - Configuration options for decoding optional values.\n * @returns A `FixedSizeDecoder` or `VariableSizeDecoder` for decoding option values.\n *\n * @example\n * Decoding an optional string with a size prefix.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const decoder = getOptionDecoder(stringCodec);\n *\n * decoder.decode(new Uint8Array([0x01, 0x02, 0x00, 0x00, 0x00, 0x48, 0x69]));\n * // some('Hi')\n *\n * decoder.decode(new Uint8Array([0x00]));\n * // none()\n * ```\n *\n * @see {@link getOptionCodec}\n */\nexport function getOptionDecoder(\n item: FixedSizeDecoder,\n config: OptionCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeDecoder, TSize>;\nexport function getOptionDecoder(\n item: FixedSizeDecoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeDecoder>;\nexport function getOptionDecoder(\n item: FixedSizeDecoder,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeDecoder>;\nexport function getOptionDecoder(\n item: Decoder,\n config?: OptionCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeDecoder>;\nexport function getOptionDecoder(\n item: Decoder,\n config: OptionCodecConfig = {},\n): Decoder> {\n const prefix = (() => {\n if (config.prefix === null) {\n return transformDecoder(getUnitDecoder(), () => false);\n }\n return getBooleanDecoder({ size: config.prefix ?? getU8Decoder() });\n })();\n const noneValue = (() => {\n if (config.noneValue === 'zeroes') {\n assertIsFixedSize(item);\n return fixDecoderSize(getUnitDecoder(), item.fixedSize);\n }\n if (!config.noneValue) {\n return getUnitDecoder();\n }\n return getConstantDecoder(config.noneValue);\n })();\n\n return getUnionDecoder(\n [\n transformDecoder(getTupleDecoder([prefix, noneValue]), () => none()),\n transformDecoder(getTupleDecoder([prefix, item]), ([, value]) => some(value)),\n ],\n (bytes, offset) => {\n if (config.prefix === null && !config.noneValue) {\n return Number(offset < bytes.length);\n }\n if (config.prefix === null && config.noneValue != null) {\n const zeroValue =\n config.noneValue === 'zeroes' ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue;\n return containsBytes(bytes, zeroValue, offset) ? 0 : 1;\n }\n return Number(prefix.read(bytes, offset)[0]);\n },\n );\n}\n\n/**\n * Returns a codec for encoding and decoding optional values using the {@link Option} type.\n *\n * This codec serializes and deserializes `Option` values using a configurable approach:\n * - By default, a `u8` prefix is used (`0 = None`, `1 = Some`).\n * - If `noneValue: 'zeroes'` is set, `None` values are encoded/decoded as zeroes.\n * - If `noneValue` is a byte array, `None` values are represented by the provided constant.\n * - If `prefix: null` is set, the codec determines `None` values solely from `noneValue` or the presence of bytes.\n *\n * For more details on the configuration options, see {@link OptionCodecConfig}.\n *\n * Note that this behaves similarly to {@link getNullableCodec}, except it\n * encodes {@link OptionOrNullable} values and decodes {@link Option} values.\n *\n * @typeParam TFrom - The type of the main value being encoded.\n * @typeParam TTo - The type of the main value being decoded.\n *\n * @param item - The codec for the value that may be present.\n * @param config - Configuration options for encoding and decoding option values.\n * @returns A `FixedSizeCodec` or `VariableSizeCodec` for encoding and decoding option values.\n *\n * @example\n * Encoding and decoding an optional string with a size prefix.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const codec = getOptionCodec(stringCodec);\n *\n * const someBytes = codec.encode(some('Hi'));\n * // 0x01020000004869\n * // | | └-- utf8 string content (\"Hi\").\n * // | └-- u32 string prefix (2 characters).\n * // └-- 1-byte prefix (Some).\n *\n * const noneBytes = codec.encode(none());\n * // 0x00\n * // └-- 1-byte prefix (None).\n *\n * codec.decode(someBytes); // some('Hi')\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Encoding nullable values.\n * ```ts\n * const stringCodec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());\n * const codec = getOptionCodec(stringCodec);\n *\n * const someBytes = codec.encode('Hi'); // 0x01020000004869\n * const noneBytes = codec.encode(null); // 0x00\n *\n * codec.decode(someBytes); // some('Hi')\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Encoding and decoding an optional number with a fixed size.\n * ```ts\n * const codec = getOptionCodec(getU16Codec(), { noneValue: 'zeroes' });\n *\n * const someBytes = codec.encode(some(42)); // 0x012a00\n * const noneBytes = codec.encode(none()); // 0x000000\n *\n * codec.decode(someBytes); // some(42)\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Encoding and decoding {@link None} values with a custom byte sequence and no prefix.\n * ```ts\n * const codec = getOptionCodec(getU16Codec(), {\n * noneValue: new Uint8Array([0xff, 0xff]),\n * prefix: null,\n * });\n *\n * const someBytes = codec.encode(some(42)); // 0x2a00\n * const noneBytes = codec.encode(none()); // 0xffff\n *\n * codec.decode(someBytes); // some(42)\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @example\n * Identifying {@link None} values by the absence of bytes.\n * ```ts\n * const codec = getOptionCodec(getU16Codec(), { prefix: null });\n *\n * const someBytes = codec.encode(some(42)); // 0x2a00\n * const noneBytes = codec.encode(none()); // new Uint8Array(0)\n *\n * codec.decode(someBytes); // some(42)\n * codec.decode(noneBytes); // none()\n * ```\n *\n * @remarks\n * Separate {@link getOptionEncoder} and {@link getOptionDecoder} functions are available.\n *\n * ```ts\n * const bytes = getOptionEncoder(getU32Encoder()).encode(some(42));\n * const value = getOptionDecoder(getU32Decoder()).decode(bytes);\n * ```\n *\n * @see {@link getOptionEncoder}\n * @see {@link getOptionDecoder}\n */\nexport function getOptionCodec(\n item: FixedSizeCodec,\n config: OptionCodecConfig & { noneValue: 'zeroes'; prefix: null },\n): FixedSizeCodec, Option, TSize>;\nexport function getOptionCodec(\n item: FixedSizeCodec,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): FixedSizeCodec, Option>;\nexport function getOptionCodec(\n item: FixedSizeCodec,\n config: OptionCodecConfig & { noneValue: 'zeroes' },\n): VariableSizeCodec, Option>;\nexport function getOptionCodec(\n item: Codec,\n config?: OptionCodecConfig & { noneValue?: ReadonlyUint8Array },\n): VariableSizeCodec, Option>;\nexport function getOptionCodec(\n item: Codec,\n config: OptionCodecConfig = {},\n): Codec, Option> {\n type ConfigCast = OptionCodecConfig & { noneValue?: ReadonlyUint8Array };\n return combineCodec(\n getOptionEncoder(item, config as ConfigCast),\n getOptionDecoder(item, config as ConfigCast),\n );\n}\n","import { isOption, isSome, None, Some } from './option';\n\n/**\n * Defines types that should not be recursively unwrapped.\n *\n * These types are preserved as-is when using {@link unwrapOptionRecursively}.\n *\n * @see {@link unwrapOptionRecursively}\n */\ntype UnUnwrappables =\n | Date\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | bigint\n | boolean\n | number\n | string\n | symbol\n | null\n | undefined;\n\n/**\n * A type that recursively unwraps nested {@link Option} types.\n *\n * This type resolves all nested {@link Option} values, ensuring\n * that deeply wrapped values are properly extracted.\n *\n * - If `T` is an {@link Option}, it resolves to the contained value.\n * - If `T` is a known primitive or immutable type, it remains unchanged.\n * - If `T` is an object or array, it recursively unwraps any options found.\n *\n * The fallback type `U` (default: `null`) is used in place of `None` values.\n *\n * @typeParam T - The type to be unwrapped.\n * @typeParam U - The fallback type for `None` values (defaults to `null`).\n *\n * @example\n * Resolving nested `Option` types.\n * ```ts\n * UnwrappedOption>>; // string\n * UnwrappedOption; // null\n * ```\n *\n * @example\n * Resolving options inside objects and arrays.\n * ```ts\n * UnwrappedOption<{ a: Some; b: None }>; // { a: number; b: null }\n * UnwrappedOption<[Some, None]>; // [number, null]\n * ```\n *\n * @see {@link unwrapOptionRecursively}\n */\nexport type UnwrappedOption =\n T extends Some\n ? UnwrappedOption\n : T extends None\n ? U\n : T extends UnUnwrappables\n ? T\n : T extends object\n ? { [key in keyof T]: UnwrappedOption }\n : T extends Array\n ? Array>\n : T;\n\n/**\n * Recursively unwraps all nested {@link Option} types within a value.\n *\n * This function traverses a given value and removes all instances\n * of {@link Option}, replacing them with their contained values.\n *\n * - If an {@link Option} is encountered, its value is extracted.\n * - If an array or object is encountered, its elements are traversed recursively.\n * - If `None` is encountered, it is replaced with the fallback value (default: `null`).\n *\n * @typeParam T - The type of the input value.\n * @typeParam U - The fallback type for `None` values (defaults to `null`).\n *\n * @param input - The value to unwrap.\n * @param fallback - A function that provides a fallback value for `None` options.\n * @returns The recursively unwrapped value.\n *\n * @example\n * Recursively unwrapping nested options.\n * ```ts\n * unwrapOptionRecursively(some(some('Hello World'))); // \"Hello World\"\n * unwrapOptionRecursively(some(none())); // null\n * ```\n *\n * @example\n * Recursively unwrapping options inside objects and arrays.\n * ```ts\n * unwrapOptionRecursively({\n * a: 'hello',\n * b: none(),\n * c: [{ c1: some(42) }, { c2: none() }],\n * });\n * // { a: \"hello\", b: null, c: [{ c1: 42 }, { c2: null }] }\n * ```\n *\n * @example\n * Using a fallback value for `None` options.\n * ```ts\n * unwrapOptionRecursively(\n * {\n * a: 'hello',\n * b: none(),\n * c: [{ c1: some(42) }, { c2: none() }],\n * },\n * () => 'Default',\n * );\n * // { a: \"hello\", b: \"Default\", c: [{ c1: 42 }, { c2: \"Default\" }] }\n * ```\n *\n * @remarks\n * This function does not mutate objects or arrays.\n *\n * @see {@link Option}\n * @see {@link UnwrappedOption}\n */\nexport function unwrapOptionRecursively(input: T): UnwrappedOption;\nexport function unwrapOptionRecursively(input: T, fallback: () => U): UnwrappedOption;\nexport function unwrapOptionRecursively(input: T, fallback?: () => U): UnwrappedOption {\n // Types to bypass.\n if (!input || ArrayBuffer.isView(input)) {\n return input as UnwrappedOption;\n }\n\n const next = (x: X) =>\n (fallback ? unwrapOptionRecursively(x, fallback) : unwrapOptionRecursively(x)) as UnwrappedOption;\n\n // Handle Option.\n if (isOption(input)) {\n if (isSome(input)) return next(input.value) as UnwrappedOption;\n return (fallback ? fallback() : null) as UnwrappedOption;\n }\n\n // Walk.\n if (Array.isArray(input)) {\n return input.map(next) as UnwrappedOption;\n }\n if (typeof input === 'object') {\n return Object.fromEntries(Object.entries(input).map(([k, v]) => [k, next(v)])) as UnwrappedOption;\n }\n return input as UnwrappedOption;\n}\n","export * from '@solana/codecs-core';\nexport * from '@solana/codecs-data-structures';\nexport * from '@solana/codecs-numbers';\nexport * from '@solana/codecs-strings';\nexport * from '@solana/options';\n//# sourceMappingURL=index.node.mjs.map\n//# sourceMappingURL=index.node.mjs.map","/**\n * A pipeline is a solution that allows you to perform successive transforms of a value using functions. This is useful when building up a transaction message.\n *\n * Until the [pipeline operator](https://github.com/tc39/proposal-pipeline-operator) becomes part of JavaScript you can use this utility to create pipelines.\n *\n * Following common implementations of pipe functions that use TypeScript, this function supports a maximum arity of 10 for type safety.\n *\n * Note you can use nested pipes to extend this limitation, like so:\n * ```ts\n * const myValue = pipe(\n * pipe(\n * 1,\n * (x) => x + 1,\n * (x) => x * 2,\n * (x) => x - 1,\n * ),\n * (y) => y / 3,\n * (y) => y + 1,\n * );\n * ```\n *\n * @see https://github.com/ramda/ramda/blob/master/source/pipe.js\n * @see https://github.com/darky/rocket-pipes/blob/master/index.ts\n *\n * @example Basic\n * ```ts\n * const add = (a, b) => a + b;\n * const add10 = x => add(x, 10);\n * const add100 = x => add(x, 100);\n * const sum = pipe(1, add10, add100);\n * sum === 111; // true\n * ```\n *\n * @example Building a Solana transaction message\n * ```ts\n * const transferTransactionMessage = pipe(\n * // The result of the first expression...\n * createTransactionMessage({ version: 0 }),\n * // ...gets passed as the sole argument to the next function in the pipeline.\n * tx => setTransactionMessageFeePayer(myAddress, tx),\n * // The return value of that function gets passed to the next...\n * tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n * // ...and so on.\n * tx => appendTransactionMessageInstruction(createTransferInstruction(myAddress, toAddress, amountInLamports), tx),\n * );\n * ```\n *\n * @returns The initial value\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n): TInitial;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n): R1;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n): R2;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n): R3;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n): R4;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n): R5;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n): R6;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n): R7;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n /** The function with which to transform the return value of the prior function */\n r7_r8: (r7: R7) => R8,\n): R8;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n /** The function with which to transform the return value of the prior function */\n r7_r8: (r7: R7) => R8,\n /** The function with which to transform the return value of the prior function */\n r8_r9: (r8: R8) => R9,\n): R9;\n/**\n * @returns The return value of the final transform function\n */\nexport function pipe(\n /** The initial value */\n init: TInitial,\n /** The function with which to transform the initial value */\n init_r1: (init: TInitial) => R1,\n /** The function with which to transform the return value of the prior function */\n r1_r2: (r1: R1) => R2,\n /** The function with which to transform the return value of the prior function */\n r2_r3: (r2: R2) => R3,\n /** The function with which to transform the return value of the prior function */\n r3_r4: (r3: R3) => R4,\n /** The function with which to transform the return value of the prior function */\n r4_r5: (r4: R4) => R5,\n /** The function with which to transform the return value of the prior function */\n r5_r6: (r5: R5) => R6,\n /** The function with which to transform the return value of the prior function */\n r6_r7: (r6: R6) => R7,\n /** The function with which to transform the return value of the prior function */\n r7_r8: (r7: R7) => R8,\n /** The function with which to transform the return value of the prior function */\n r8_r9: (r8: R8) => R9,\n /** The function with which to transform the return value of the prior function */\n r9_r10: (r9: R9) => R10,\n): R10;\nexport function pipe(init: TInitial, ...fns: CallableFunction[]) {\n return fns.reduce((acc, fn) => fn(acc), init);\n}\n","import { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS,\n SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA,\n SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH,\n SolanaError,\n} from '@solana/errors';\n\nimport { AccountLookupMeta, AccountMeta } from './accounts';\n\n/**\n * An instruction destined for a given program.\n *\n * @example\n * ```ts\n * type StakeProgramInstruction = Instruction<'StakeConfig11111111111111111111111111111111'>;\n * ```\n */\nexport interface Instruction<\n TProgramAddress extends string = string,\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[] = readonly (AccountLookupMeta | AccountMeta)[],\n> {\n readonly accounts?: TAccounts;\n readonly data?: ReadonlyUint8Array;\n readonly programAddress: Address;\n}\n\n/**\n * An instruction that loads certain accounts.\n *\n * @example\n * ```ts\n * type InstructionWithTwoAccounts = InstructionWithAccounts<\n * [\n * WritableAccount, // First account\n * RentSysvar, // Second account\n * ]\n * >;\n * ```\n */\nexport interface InstructionWithAccounts<\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[],\n> extends Instruction {\n readonly accounts: TAccounts;\n}\n\nexport function isInstructionForProgram(\n instruction: TInstruction,\n programAddress: Address,\n): instruction is TInstruction & { programAddress: Address } {\n return instruction.programAddress === programAddress;\n}\n\nexport function assertIsInstructionForProgram(\n instruction: TInstruction,\n programAddress: Address,\n): asserts instruction is TInstruction & { programAddress: Address } {\n if (instruction.programAddress !== programAddress) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH, {\n actualProgramAddress: instruction.programAddress,\n expectedProgramAddress: programAddress,\n });\n }\n}\n\nexport function isInstructionWithAccounts<\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[] = readonly (AccountLookupMeta | AccountMeta)[],\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): instruction is InstructionWithAccounts & TInstruction {\n return instruction.accounts !== undefined;\n}\n\nexport function assertIsInstructionWithAccounts<\n TAccounts extends readonly (AccountLookupMeta | AccountMeta)[] = readonly (AccountLookupMeta | AccountMeta)[],\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): asserts instruction is InstructionWithAccounts & TInstruction {\n if (instruction.accounts === undefined) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS, {\n data: instruction.data,\n programAddress: instruction.programAddress,\n });\n }\n}\n\n/**\n * An instruction whose data conforms to a certain type.\n *\n * This is most useful when you have a branded `Uint8Array` that represents a particular\n * instruction's data.\n *\n * @example A type for the \\`AdvanceNonce\\` instruction of the System program\n * ```ts\n * type AdvanceNonceAccountInstruction<\n * TNonceAccountAddress extends string = string,\n * TNonceAuthorityAddress extends string = string,\n * > = Instruction<'11111111111111111111111111111111'> &\n * InstructionWithAccounts<\n * [\n * WritableAccount,\n * ReadonlyAccount<'SysvarRecentB1ockHashes11111111111111111111'>,\n * ReadonlySignerAccount,\n * ]\n * > &\n * InstructionWithData;\n * ```\n */\nexport interface InstructionWithData extends Instruction {\n readonly data: TData;\n}\n\nexport function isInstructionWithData<\n TData extends ReadonlyUint8Array = ReadonlyUint8Array,\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): instruction is InstructionWithData & TInstruction {\n return instruction.data !== undefined;\n}\n\nexport function assertIsInstructionWithData<\n TData extends ReadonlyUint8Array = ReadonlyUint8Array,\n TInstruction extends Instruction = Instruction,\n>(instruction: TInstruction): asserts instruction is InstructionWithData & TInstruction {\n if (instruction.data === undefined) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA, {\n accountAddresses: instruction.accounts?.map(a => a.address),\n programAddress: instruction.programAddress,\n });\n }\n}\n","/**\n * Describes the purpose for which an account participates in a transaction.\n *\n * Every account that participates in a transaction can be read from, but only ones that you mark as\n * writable may be written to, and only ones that you indicate must sign the transaction will gain\n * the privileges associated with signers at runtime.\n *\n * | | `isSigner` | `isWritable` |\n * | ----------------------------- | ---------- | ------------ |\n * | `AccountRole.READONLY` | ❌ | ❌ |\n * | `AccountRole.WRITABLE` | ❌ | ✅ |\n * | `AccountRole.READONLY_SIGNER` | ✅ | ❌ |\n * | `AccountRole.WRITABLE_SIGNER` | ✅ | ✅ |\n */\nexport enum AccountRole {\n // Bitflag guide: is signer ⌄⌄ is writable\n WRITABLE_SIGNER = /* 3 */ 0b11, // prettier-ignore\n READONLY_SIGNER = /* 2 */ 0b10, // prettier-ignore\n WRITABLE = /* 1 */ 0b01, // prettier-ignore\n READONLY = /* 0 */ 0b00, // prettier-ignore\n}\n\n// Quick primer on bitwise operations: https://stackoverflow.com/a/1436448/802047\nconst IS_SIGNER_BITMASK = 0b10;\nconst IS_WRITABLE_BITMASK = 0b01;\n\n/**\n * @returns An {@link AccountRole} representing the non-signer variant of the supplied role.\n */\nexport function downgradeRoleToNonSigner(role: AccountRole.READONLY_SIGNER): AccountRole.READONLY;\nexport function downgradeRoleToNonSigner(role: AccountRole.WRITABLE_SIGNER): AccountRole.WRITABLE;\nexport function downgradeRoleToNonSigner(role: AccountRole): AccountRole;\nexport function downgradeRoleToNonSigner(role: AccountRole): AccountRole {\n return role & ~IS_SIGNER_BITMASK;\n}\n\n/**\n * @returns An {@link AccountRole} representing the read-only variant of the supplied role.\n */\nexport function downgradeRoleToReadonly(role: AccountRole.WRITABLE): AccountRole.READONLY;\nexport function downgradeRoleToReadonly(role: AccountRole.WRITABLE_SIGNER): AccountRole.READONLY_SIGNER;\nexport function downgradeRoleToReadonly(role: AccountRole): AccountRole;\nexport function downgradeRoleToReadonly(role: AccountRole): AccountRole {\n return role & ~IS_WRITABLE_BITMASK;\n}\n\n/**\n * Returns `true` if the {@link AccountRole} given represents that of a signer. Also refines the\n * TypeScript type of the supplied role.\n */\nexport function isSignerRole(role: AccountRole): role is AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER {\n return role >= AccountRole.READONLY_SIGNER;\n}\n\n/**\n * Returns `true` if the {@link AccountRole} given represents that of a writable account. Also\n * refines the TypeScript type of the supplied role.\n */\nexport function isWritableRole(role: AccountRole): role is AccountRole.WRITABLE | AccountRole.WRITABLE_SIGNER {\n return (role & IS_WRITABLE_BITMASK) !== 0;\n}\n\n/**\n * Given two {@link AccountRole | AccountRoles}, will return the {@link AccountRole} that grants the\n * highest privileges of both.\n *\n * @example\n * ```ts\n * // Returns `AccountRole.WRITABLE_SIGNER`\n * mergeRoles(AccountRole.READONLY_SIGNER, AccountRole.WRITABLE);\n * ```\n */\nexport function mergeRoles(roleA: AccountRole.WRITABLE, roleB: AccountRole.READONLY_SIGNER): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.READONLY_SIGNER, roleB: AccountRole.WRITABLE): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole.WRITABLE_SIGNER): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.WRITABLE_SIGNER, roleB: AccountRole): AccountRole.WRITABLE_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole.READONLY_SIGNER): AccountRole.READONLY_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.READONLY_SIGNER, roleB: AccountRole): AccountRole.READONLY_SIGNER; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole.WRITABLE): AccountRole.WRITABLE; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.WRITABLE, roleB: AccountRole): AccountRole.WRITABLE; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole.READONLY, roleB: AccountRole.READONLY): AccountRole.READONLY; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole): AccountRole; // prettier-ignore\nexport function mergeRoles(roleA: AccountRole, roleB: AccountRole): AccountRole {\n return roleA | roleB;\n}\n\n/**\n * @returns An {@link AccountRole} representing the signer variant of the supplied role.\n */\nexport function upgradeRoleToSigner(role: AccountRole.READONLY): AccountRole.READONLY_SIGNER;\nexport function upgradeRoleToSigner(role: AccountRole.WRITABLE): AccountRole.WRITABLE_SIGNER;\nexport function upgradeRoleToSigner(role: AccountRole): AccountRole;\nexport function upgradeRoleToSigner(role: AccountRole): AccountRole {\n return role | IS_SIGNER_BITMASK;\n}\n\n/**\n * @returns An {@link AccountRole} representing the writable variant of the supplied role.\n */\nexport function upgradeRoleToWritable(role: AccountRole.READONLY): AccountRole.WRITABLE;\nexport function upgradeRoleToWritable(role: AccountRole.READONLY_SIGNER): AccountRole.WRITABLE_SIGNER;\nexport function upgradeRoleToWritable(role: AccountRole): AccountRole;\nexport function upgradeRoleToWritable(role: AccountRole): AccountRole {\n return role | IS_WRITABLE_BITMASK;\n}\n","import { Address, assertIsAddress, getAddressDecoder, getAddressEncoder, isAddress } from '@solana/addresses';\nimport { combineCodec, createEncoder, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\nimport {\n isSolanaError,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\nexport type Blockhash = Brand, 'Blockhash'>;\n\n/**\n * A type guard that returns `true` if the input string conforms to the {@link Blockhash} type, and\n * refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isBlockhash } from '@solana/rpc-types';\n *\n * if (isBlockhash(blockhash)) {\n * // At this point, `blockhash` has been refined to a\n * // `Blockhash` that can be used with the RPC.\n * const { value: isValid } = await rpc.isBlockhashValid(blockhash).send();\n * setBlockhashIsFresh(isValid);\n * } else {\n * setError(`${blockhash} is not a blockhash`);\n * }\n * ```\n */\nexport function isBlockhash(putativeBlockhash: string): putativeBlockhash is Blockhash {\n return isAddress(putativeBlockhash);\n}\n\n/**\n * From time to time you might acquire a string, that you expect to validate as a blockhash, from an\n * untrusted network API or user input. Use this function to assert that such an arbitrary string is\n * a base58-encoded blockhash.\n *\n * @example\n * ```ts\n * import { assertIsBlockhash } from '@solana/rpc-types';\n *\n * // Imagine a function that determines whether a blockhash is fresh when a user submits a form.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const blockhash: string = blockhashInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `blockhash` to `Blockhash`.\n * assertIsBlockhash(blockhash);\n * // At this point, `blockhash` is a `Blockhash` that can be used with the RPC.\n * const { value: isValid } = await rpc.isBlockhashValid(blockhash).send();\n * } catch (e) {\n * // `blockhash` turned out not to be a base58-encoded blockhash\n * }\n * }\n * ```\n */\nexport function assertIsBlockhash(putativeBlockhash: string): asserts putativeBlockhash is Blockhash {\n try {\n assertIsAddress(putativeBlockhash);\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) {\n throw new SolanaError(SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE, error.context);\n }\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) {\n throw new SolanaError(SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH, error.context);\n }\n throw error;\n }\n}\n\n/**\n * Combines _asserting_ that a string is a blockhash with _coercing_ it to the {@link Blockhash}\n * type. It's most useful with untrusted input.\n *\n * @example\n * ```ts\n * import { blockhash } from '@solana/rpc-types';\n *\n * const { value: isValid } = await rpc.isBlockhashValid(blockhash(blockhashFromUserInput)).send();\n * ```\n *\n * > [!TIP]\n * > When starting from a known-good blockhash as a string, it's more efficient to typecast it\n * rather than to use the {@link blockhash} helper, because the helper unconditionally performs\n * validation on its input.\n * >\n * > ```ts\n * > import { Blockhash } from '@solana/rpc-types';\n * >\n * > const blockhash = 'ABmPH5KDXX99u6woqFS5vfBGSNyKG42SzpvBMWWqAy48' as Blockhash;\n * > ```\n */\nexport function blockhash(putativeBlockhash: string): Blockhash {\n assertIsBlockhash(putativeBlockhash);\n return putativeBlockhash;\n}\n\n/**\n * Returns an encoder that you can use to encode a base58-encoded blockhash to a byte array.\n *\n * @example\n * ```ts\n * import { getBlockhashEncoder } from '@solana/rpc-types';\n *\n * const blockhash = 'ABmPH5KDXX99u6woqFS5vfBGSNyKG42SzpvBMWWqAy48' as Blockhash;\n * const blockhashEncoder = getBlockhashEncoder();\n * const blockhashBytes = blockhashEncoder.encode(blockhash);\n * // Uint8Array(32) [\n * // 136, 123, 44, 249, 43, 19, 60, 14,\n * // 144, 16, 168, 241, 121, 111, 70, 232,\n * // 186, 26, 140, 202, 213, 64, 231, 82,\n * // 179, 66, 103, 237, 52, 117, 217, 93\n * // ]\n * ```\n */\nexport function getBlockhashEncoder(): FixedSizeEncoder {\n const addressEncoder = getAddressEncoder();\n return createEncoder({\n fixedSize: 32,\n write: (value: string, bytes, offset) => {\n assertIsBlockhash(value);\n return addressEncoder.write(value as string as Address, bytes, offset);\n },\n });\n}\n\n/**\n * Returns a decoder that you can use to convert an array of 32 bytes representing a blockhash to\n * the base58-encoded representation of that blockhash.\n *\n * @example\n * ```ts\n * import { getBlockhashDecoder } from '@solana/rpc-types';\n *\n * const blockhashBytes = new Uint8Array([\n * 136, 123, 44, 249, 43, 19, 60, 14,\n * 144, 16, 168, 241, 121, 111, 70, 232,\n * 186, 26, 140, 202, 213, 64, 231, 82,\n * 179, 66, 103, 237, 52, 117, 217, 93\n * ]);\n * const blockhashDecoder = getBlockhashDecoder();\n * const blockhash = blockhashDecoder.decode(blockhashBytes); // ABmPH5KDXX99u6woqFS5vfBGSNyKG42SzpvBMWWqAy48\n * ```\n */\nexport function getBlockhashDecoder(): FixedSizeDecoder {\n return getAddressDecoder() as FixedSizeDecoder as FixedSizeDecoder;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a base-58 encoded blockhash.\n *\n * @see {@link getBlockhashDecoder}\n * @see {@link getBlockhashEncoder}\n */\nexport function getBlockhashCodec(): FixedSizeCodec {\n return combineCodec(getBlockhashEncoder(), getBlockhashDecoder());\n}\n\nexport function getBlockhashComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","export type MainnetUrl = string & { '~cluster': 'mainnet' };\nexport type DevnetUrl = string & { '~cluster': 'devnet' };\nexport type TestnetUrl = string & { '~cluster': 'testnet' };\nexport type ClusterUrl = DevnetUrl | MainnetUrl | TestnetUrl | string;\n\n/** Given a URL casts it to a type that is only accepted where mainnet URLs are expected. */\nexport function mainnet(putativeString: string): MainnetUrl {\n return putativeString as MainnetUrl;\n}\n/** Given a URL casts it to a type that is only accepted where devnet URLs are expected. */\nexport function devnet(putativeString: string): DevnetUrl {\n return putativeString as DevnetUrl;\n}\n/** Given a URL casts it to a type that is only accepted where testnet URLs are expected. */\nexport function testnet(putativeString: string): TestnetUrl {\n return putativeString as TestnetUrl;\n}\n","import { SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, SolanaError } from '@solana/errors';\n\n/**\n * A union of all possible commitment statuses -- each a measure of the network confirmation and\n * stake levels on a particular block.\n *\n * Read more about the statuses themselves, [here](https://docs.solana.com/cluster/commitments).\n */\nexport type Commitment = 'confirmed' | 'finalized' | 'processed';\n\nfunction getCommitmentScore(commitment: Commitment): number {\n switch (commitment) {\n case 'finalized':\n return 2;\n case 'confirmed':\n return 1;\n case 'processed':\n return 0;\n default:\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: commitment satisfies never,\n });\n }\n}\n\nexport function commitmentComparator(a: Commitment, b: Commitment): -1 | 0 | 1 {\n if (a === b) {\n return 0;\n }\n return getCommitmentScore(a) < getCommitmentScore(b) ? -1 : 1;\n}\n","import {\n Codec,\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformDecoder,\n} from '@solana/codecs-core';\nimport { getU64Decoder, getU64Encoder, NumberCodec, NumberDecoder, NumberEncoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * Represents an integer value denominated in Lamports (ie. $1 \\times 10^{-9}$ ◎).\n *\n * It is represented as a `bigint` in client code and an `u64` in server code.\n */\nexport type Lamports = Brand;\n\n// Largest possible value to be represented by a u64\nconst maxU64Value = 18446744073709551615n; // 2n ** 64n - 1n\n\nlet memoizedU64Encoder: FixedSizeEncoder | undefined;\nlet memoizedU64Decoder: FixedSizeDecoder | undefined;\n\nfunction getMemoizedU64Encoder(): FixedSizeEncoder {\n if (!memoizedU64Encoder) memoizedU64Encoder = getU64Encoder();\n return memoizedU64Encoder;\n}\n\nfunction getMemoizedU64Decoder(): FixedSizeDecoder {\n if (!memoizedU64Decoder) memoizedU64Decoder = getU64Decoder();\n return memoizedU64Decoder;\n}\n\n/**\n * This is a type guard that accepts a `bigint` as input. It will both return `true` if the integer\n * conforms to the {@link Lamports} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isLamports } from '@solana/rpc-types';\n *\n * if (isLamports(lamports)) {\n * // At this point, `lamports` has been refined to a\n * // `Lamports` that can be used anywhere Lamports are expected.\n * await transfer(fromAddress, toAddress, lamports);\n * } else {\n * setError(`${lamports} is not a quantity of Lamports`);\n * }\n * ```\n */\nexport function isLamports(putativeLamports: bigint): putativeLamports is Lamports {\n return putativeLamports >= 0 && putativeLamports <= maxU64Value;\n}\n\n/**\n * Lamport values returned from the RPC API conform to the type {@link Lamports}. You can use a\n * value of that type wherever a quantity of Lamports is expected.\n *\n * @example\n * From time to time you might acquire a number that you expect to be a quantity of Lamports, from\n * an untrusted network API or user input. To assert that such an arbitrary number is usable as a\n * quantity of Lamports, use this function.\n *\n * ```ts\n * import { assertIsLamports } from '@solana/rpc-types';\n *\n * // Imagine a function that creates a transfer instruction when a user submits a form.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `number` type.\n * const lamports: number = parseInt(quantityInput.value, 10);\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `lamports` to `Lamports`.\n * assertIsLamports(lamports);\n * // At this point, `lamports` is a `Lamports` that can be used anywhere Lamports are expected.\n * await transfer(fromAddress, toAddress, lamports);\n * } catch (e) {\n * // `lamports` turned out not to validate as a quantity of Lamports.\n * }\n * }\n * ```\n */\nexport function assertIsLamports(putativeLamports: bigint): asserts putativeLamports is Lamports {\n if (putativeLamports < 0 || putativeLamports > maxU64Value) {\n throw new SolanaError(SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE);\n }\n}\n\n/**\n * This helper combines _asserting_ that a number is a possible number of {@link Lamports} with\n * _coercing_ it to the {@link Lamports} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { lamports } from '@solana/rpc-types';\n *\n * await transfer(address(fromAddress), address(toAddress), lamports(100000n));\n * ```\n */\nexport function lamports(putativeLamports: bigint): Lamports {\n assertIsLamports(putativeLamports);\n return putativeLamports;\n}\n\ntype ExtractAdditionalProps = Omit;\n\n/**\n * Returns an encoder that you can use to encode a 64-bit {@link Lamports} value to 8 bytes in\n * little endian order.\n */\nexport function getDefaultLamportsEncoder(): FixedSizeEncoder {\n return getLamportsEncoder(getMemoizedU64Encoder());\n}\n\n/**\n * Returns an encoder that you can use to encode a {@link Lamports} value to a byte array.\n *\n * You must supply a number decoder that will determine how encode the numeric value.\n *\n * @example\n * ```ts\n * import { getLamportsEncoder } from '@solana/rpc-types';\n * import { getU16Encoder } from '@solana/codecs-numbers';\n *\n * const lamports = lamports(256n);\n * const lamportsEncoder = getLamportsEncoder(getU16Encoder());\n * const lamportsBytes = lamportsEncoder.encode(lamports);\n * // Uint8Array(2) [ 0, 1 ]\n * ```\n */\nexport function getLamportsEncoder(\n innerEncoder: TEncoder,\n): Encoder & ExtractAdditionalProps {\n return innerEncoder;\n}\n\n/**\n * Returns a decoder that you can use to decode a byte array representing a 64-bit little endian\n * number to a {@link Lamports} value.\n */\nexport function getDefaultLamportsDecoder(): FixedSizeDecoder {\n return getLamportsDecoder(getMemoizedU64Decoder());\n}\n\n/**\n * Returns a decoder that you can use to convert an array of bytes representing a number to a\n * {@link Lamports} value.\n *\n * You must supply a number decoder that will determine how many bits to use to decode the numeric\n * value.\n *\n * @example\n * ```ts\n * import { getLamportsDecoder } from '@solana/rpc-types';\n * import { getU16Decoder } from '@solana/codecs-numbers';\n *\n * const lamportsBytes = new Uint8Array([ 0, 1 ]);\n * const lamportsDecoder = getLamportsDecoder(getU16Decoder());\n * const lamports = lamportsDecoder.decode(lamportsBytes); // lamports(256n)\n * ```\n */\nexport function getLamportsDecoder(\n innerDecoder: TDecoder,\n): Decoder & ExtractAdditionalProps {\n return transformDecoder(innerDecoder, value =>\n lamports(typeof value === 'bigint' ? value : BigInt(value)),\n ) as Decoder & ExtractAdditionalProps;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a 64-bit {@link Lamports} value.\n *\n * @see {@link getDefaultLamportsDecoder}\n * @see {@link getDefaultLamportsEncoder}\n */\nexport function getDefaultLamportsCodec(): FixedSizeCodec {\n return combineCodec(getDefaultLamportsEncoder(), getDefaultLamportsDecoder());\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to {@link Lamports} value.\n *\n * @see {@link getLamportsDecoder}\n * @see {@link getLamportsEncoder}\n */\nexport function getLamportsCodec(\n innerCodec: TCodec,\n): Codec & ExtractAdditionalProps {\n return combineCodec(getLamportsEncoder(innerCodec), getLamportsDecoder(innerCodec)) as Codec &\n ExtractAdditionalProps;\n}\n","import { SOLANA_ERROR__MALFORMED_BIGINT_STRING, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * This type represents a `bigint` which has been encoded as a string for transit over a transport\n * that does not support `bigint` values natively. The JSON-RPC is such a transport.\n */\nexport type StringifiedBigInt = Brand;\n\n/**\n * A type guard that returns `true` if the input string parses as a `BigInt`, and refines its type\n * for use in your program.\n *\n * @example\n * ```ts\n * import { isStringifiedBigInt } from '@solana/rpc-types';\n *\n * if (isStringifiedBigInt(bigintString)) {\n * // At this point, `bigintString` has been refined to a `StringifiedBigInt`\n * bigintString satisfies StringifiedBigInt; // OK\n * } else {\n * setError(`${bigintString} does not represent a BigInt`);\n * }\n * ```\n */\nexport function isStringifiedBigInt(putativeBigInt: string): putativeBigInt is StringifiedBigInt {\n try {\n BigInt(putativeBigInt);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * From time to time you might acquire a string, that you expect to parse as a `BigInt`, from an\n * untrusted network API or user input. Use this function to assert that such an arbitrary string\n * will in fact parse as a `BigInt`.\n *\n * @example\n * ```ts\n * import { assertIsStringifiedBigInt } from '@solana/rpc-types';\n *\n * // Imagine having received a value that you presume represents the supply of some token.\n * // At this point we know only that it conforms to the `string` type.\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `supplyString` to `StringifiedBigInt`.\n * assertIsStringifiedBigInt(supplyString);\n * // At this point, `supplyString` is a `StringifiedBigInt`.\n * supplyString satisfies StringifiedBigInt;\n * } catch (e) {\n * // `supplyString` turned out not to parse as a `BigInt`\n * }\n * ```\n */\nexport function assertIsStringifiedBigInt(putativeBigInt: string): asserts putativeBigInt is StringifiedBigInt {\n try {\n BigInt(putativeBigInt);\n } catch {\n throw new SolanaError(SOLANA_ERROR__MALFORMED_BIGINT_STRING, {\n value: putativeBigInt,\n });\n }\n}\n\n/**\n * This helper combines _asserting_ that a string will parse as a `BigInt` with _coercing_ it to the\n * {@link StringifiedBigInt} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { stringifiedBigInt } from '@solana/rpc-types';\n *\n * const supplyString = stringifiedBigInt('1000000000');\n * ```\n */\nexport function stringifiedBigInt(putativeBigInt: string): StringifiedBigInt {\n assertIsStringifiedBigInt(putativeBigInt);\n return putativeBigInt;\n}\n","import { SOLANA_ERROR__MALFORMED_NUMBER_STRING, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * This type represents a number which has been encoded as a string for transit over a transport\n * where loss of precision when using the native number type is a concern. The JSON-RPC is such a\n * transport.\n */\nexport type StringifiedNumber = Brand;\n\n/**\n * A type guard that returns `true` if the input string parses as a `Number`, and refines its type\n * for use in your program.\n *\n * @example\n * ```ts\n * import { isStringifiedNumber } from '@solana/rpc-types';\n *\n * if (isStringifiedNumber(numericString)) {\n * // At this point, `numericString` has been refined to a `StringifiedNumber`\n * numericString satisfies StringifiedNumber; // OK\n * } else {\n * setError(`${numericString} does not represent a number`);\n * }\n * ```\n */\nexport function isStringifiedNumber(putativeNumber: string): putativeNumber is StringifiedNumber {\n return !Number.isNaN(Number(putativeNumber));\n}\n\n/**\n * From time to time you might acquire a string, that you expect to parse as a `Number`, from an\n * untrusted network API or user input. Use this function to assert that such an arbitrary string\n * will in fact parse as a `Number`.\n *\n * @example\n * ```ts\n * import { assertIsStringifiedNumber } from '@solana/rpc-types';\n *\n * // Imagine having received a value that you presume represents some decimal number.\n * // At this point we know only that it conforms to the `string` type.\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `decimalNumberString` to `StringifiedNumber`.\n * assertIsStringifiedNumber(decimalNumberString);\n * // At this point, `decimalNumberString` is a `StringifiedNumber`.\n * decimalNumberString satisfies StringifiedNumber;\n * } catch (e) {\n * // `decimalNumberString` turned out not to parse as a number.\n * }\n * ```\n */\nexport function assertIsStringifiedNumber(putativeNumber: string): asserts putativeNumber is StringifiedNumber {\n if (Number.isNaN(Number(putativeNumber))) {\n throw new SolanaError(SOLANA_ERROR__MALFORMED_NUMBER_STRING, {\n value: putativeNumber,\n });\n }\n}\n\n/**\n * This helper combines _asserting_ that a string will parse as a `Number` with _coercing_ it to the\n * {@link StringifiedNumber} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { stringifiedNumber } from '@solana/rpc-types';\n *\n * const decimalNumberString = stringifiedNumber('-42.1');\n * ```\n */\nexport function stringifiedNumber(putativeNumber: string): StringifiedNumber {\n assertIsStringifiedNumber(putativeNumber);\n return putativeNumber;\n}\n","import { SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, SolanaError } from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\n/**\n * This type represents a Unix timestamp in _seconds_.\n *\n * It is represented as a `bigint` in client code and an `i64` in server code.\n */\nexport type UnixTimestamp = Brand;\n\n// Largest possible value to be represented by an i64\nconst maxI64Value = 9223372036854775807n; // 2n ** 63n - 1n\nconst minI64Value = -9223372036854775808n; // -(2n ** 63n)\n\n/**\n * This is a type guard that accepts a `bigint` as input. It will both return `true` if the integer\n * conforms to the {@link UnixTimestamp} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isUnixTimestamp } from '@solana/rpc-types';\n *\n * if (isUnixTimestamp(timestamp)) {\n * // At this point, `timestamp` has been refined to a\n * // `UnixTimestamp` that can be used anywhere timestamps are expected.\n * timestamp satisfies UnixTimestamp;\n * } else {\n * setError(`${timestamp} is not a Unix timestamp`);\n * }\n * ```\n */\n\nexport function isUnixTimestamp(putativeTimestamp: bigint): putativeTimestamp is UnixTimestamp {\n return putativeTimestamp >= minI64Value && putativeTimestamp <= maxI64Value;\n}\n\n/**\n * Timestamp values returned from the RPC API conform to the type {@link UnixTimestamp}. You can use\n * a value of that type wherever a timestamp is expected.\n *\n * @example\n * From time to time you might acquire a number that you expect to be a timestamp, from an untrusted\n * network API or user input. To assert that such an arbitrary number is usable as a Unix timestamp,\n * use this function.\n *\n * ```ts\n * import { assertIsUnixTimestamp } from '@solana/rpc-types';\n *\n * // Imagine having received a value that you presume represents a timestamp.\n * // At this point we know only that it conforms to the `bigint` type.\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `timestamp` to `UnixTimestamp`.\n * assertIsUnixTimestamp(timestamp);\n * // At this point, `timestamp` is a `UnixTimestamp`.\n * timestamp satisfies UnixTimestamp;\n * } catch (e) {\n * // `timestamp` turned out not to be a valid Unix timestamp\n * }\n * ```\n */\nexport function assertIsUnixTimestamp(putativeTimestamp: bigint): asserts putativeTimestamp is UnixTimestamp {\n if (putativeTimestamp < minI64Value || putativeTimestamp > maxI64Value) {\n throw new SolanaError(SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE, {\n value: putativeTimestamp,\n });\n }\n}\n\n/**\n * This helper combines _asserting_ that a `bigint` represents a Unix timestamp with _coercing_ it\n * to the {@link UnixTimestamp} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { unixTimestamp } from '@solana/rpc-types';\n *\n * const timestamp = unixTimestamp(-42n); // Wednesday, December 31, 1969 3:59:18 PM GMT-08:00\n * ```\n */\nexport function unixTimestamp(putativeTimestamp: bigint): UnixTimestamp {\n assertIsUnixTimestamp(putativeTimestamp);\n return putativeTimestamp;\n}\n","import { SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME, SolanaError } from '@solana/errors';\nimport { type Blockhash, isBlockhash } from '@solana/rpc-types';\n\nimport { ExcludeTransactionMessageLifetime, TransactionMessageWithLifetime } from './lifetime';\nimport { TransactionMessage } from './transaction-message';\n\n/**\n * A constraint which, when applied to a transaction message, makes that transaction message\n * eligible to land on the network. The transaction message will continue to be eligible to land\n * until the network considers the `blockhash` to be expired.\n *\n * This can happen when the network proceeds past the `lastValidBlockHeight` for which the blockhash\n * is considered valid, or when the network switches to a fork where that blockhash is not present.\n */\nexport type BlockhashLifetimeConstraint = Readonly<{\n /**\n * A recent blockhash observed by the transaction proposer.\n *\n * The transaction message will be considered eligible to land until the network determines this\n * blockhash to be too old, or has switched to a fork where it is not present.\n */\n blockhash: Blockhash;\n /**\n * This is the block height beyond which the network will consider the blockhash to be too old\n * to make a transaction message eligible to land.\n */\n lastValidBlockHeight: bigint;\n}>;\n\n/**\n * Represents a transaction message whose lifetime is defined by the age of the blockhash it\n * includes.\n *\n * Such a transaction can only be landed on the network if the current block height of the network\n * is less than or equal to the value of\n * `TransactionMessageWithBlockhashLifetime['lifetimeConstraint']['lastValidBlockHeight']`.\n */\nexport interface TransactionMessageWithBlockhashLifetime {\n readonly lifetimeConstraint: BlockhashLifetimeConstraint;\n}\n\n/**\n * A type guard that returns `true` if the transaction message conforms to the\n * {@link TransactionMessageWithBlockhashLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionMessageWithBlockhashLifetime } from '@solana/transaction-messages';\n *\n * if (isTransactionMessageWithBlockhashLifetime(message)) {\n * // At this point, `message` has been refined to a `TransactionMessageWithBlockhashLifetime`.\n * const { blockhash } = message.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * setBlockhashIsValid(blockhashIsValid);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a blockhash-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionMessageWithBlockhashLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithBlockhashLifetime),\n): transactionMessage is TransactionMessage & TransactionMessageWithBlockhashLifetime {\n return (\n 'lifetimeConstraint' in transactionMessage &&\n typeof transactionMessage.lifetimeConstraint.blockhash === 'string' &&\n typeof transactionMessage.lifetimeConstraint.lastValidBlockHeight === 'bigint' &&\n isBlockhash(transactionMessage.lifetimeConstraint.blockhash)\n );\n}\n\n/**\n * From time to time you might acquire a transaction message, that you expect to have a\n * blockhash-based lifetime, from an untrusted network API or user input. Use this function to\n * assert that such a transaction message actually has a blockhash-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionMessageWithBlockhashLifetime } from '@solana/transaction-messages';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `message` to `TransactionMessageWithBlockhashLifetime`.\n * assertIsTransactionMessageWithBlockhashLifetime(message);\n * // At this point, `message` is a `TransactionMessageWithBlockhashLifetime` that can be used\n * // with the RPC.\n * const { blockhash } = message.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * } catch (e) {\n * // `message` turned out not to have a blockhash-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionMessageWithBlockhashLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithBlockhashLifetime),\n): asserts transactionMessage is TransactionMessage & TransactionMessageWithBlockhashLifetime {\n if (!isTransactionMessageWithBlockhashLifetime(transactionMessage)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME);\n }\n}\n\n/**\n * Given a blockhash and the last block height at which that blockhash is considered usable to land\n * transactions, this method will return a new transaction message having the same type as the one\n * supplied plus the `TransactionMessageWithBlockhashLifetime` type.\n *\n * @example\n * ```ts\n * import { setTransactionMessageLifetimeUsingBlockhash } from '@solana/transaction-messages';\n *\n * const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();\n * const txMessageWithBlockhashLifetime = setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, txMessage);\n * ```\n */\nexport function setTransactionMessageLifetimeUsingBlockhash<\n TTransactionMessage extends Partial & TransactionMessage,\n>(\n blockhashLifetimeConstraint: BlockhashLifetimeConstraint,\n transactionMessage: TTransactionMessage,\n): ExcludeTransactionMessageLifetime & TransactionMessageWithBlockhashLifetime {\n type ReturnType = ExcludeTransactionMessageLifetime & TransactionMessageWithBlockhashLifetime;\n\n if (\n 'lifetimeConstraint' in transactionMessage &&\n transactionMessage.lifetimeConstraint &&\n 'blockhash' in transactionMessage.lifetimeConstraint &&\n transactionMessage.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash &&\n transactionMessage.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight\n ) {\n return transactionMessage as ReturnType;\n }\n\n return Object.freeze({\n ...transactionMessage,\n lifetimeConstraint: Object.freeze(blockhashLifetimeConstraint),\n }) as ReturnType;\n}\n","import { SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, SolanaError } from '@solana/errors';\n\n/**\n * Asserts that a given string contains only characters from the specified alphabet.\n *\n * This function validates whether a string consists exclusively of characters\n * from the provided `alphabet`. If the validation fails, it throws an error\n * indicating the invalid base string.\n *\n * @param alphabet - The allowed set of characters for the base encoding.\n * @param testValue - The string to validate against the given alphabet.\n * @param givenValue - The original string provided by the user (defaults to `testValue`).\n *\n * @throws {SolanaError} If `testValue` contains characters not present in `alphabet`.\n *\n * @example\n * Validating a base-8 encoded string.\n * ```ts\n * assertValidBaseString('01234567', '123047'); // Passes\n * assertValidBaseString('01234567', '128'); // Throws error\n * ```\n */\nexport function assertValidBaseString(alphabet: string, testValue: string, givenValue = testValue) {\n if (!testValue.match(new RegExp(`^[${alphabet}]*$`))) {\n throw new SolanaError(SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE, {\n alphabet,\n base: alphabet.length,\n value: givenValue,\n });\n }\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\n\nimport { assertValidBaseString } from './assertions';\n\n/**\n * Returns an encoder for base-X encoded strings.\n *\n * This encoder serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process involves converting the input string to a numeric value in base-X, then\n * encoding that value into bytes while preserving leading zeroes.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeEncoder` for encoding base-X strings.\n *\n * @example\n * Encoding a base-X string using a custom alphabet.\n * ```ts\n * const encoder = getBaseXEncoder('0123456789abcdef');\n * const bytes = encoder.encode('deadface'); // 0xdeadface\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXEncoder = (alphabet: string): VariableSizeEncoder => {\n return createEncoder({\n getSizeFromValue: (value: string): number => {\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) return value.length;\n\n const base10Number = getBigIntFromBaseX(tailChars, alphabet);\n return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2);\n },\n write(value: string, bytes, offset) {\n // Check if the value is valid.\n assertValidBaseString(alphabet, value);\n if (value === '') return offset;\n\n // Handle leading zeroes.\n const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet[0]);\n if (!tailChars) {\n bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset);\n return offset + leadingZeroes.length;\n }\n\n // From baseX to base10.\n let base10Number = getBigIntFromBaseX(tailChars, alphabet);\n\n // From base10 to bytes.\n const tailBytes: number[] = [];\n while (base10Number > 0n) {\n tailBytes.unshift(Number(base10Number % 256n));\n base10Number /= 256n;\n }\n\n const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes];\n bytes.set(bytesToAdd, offset);\n return offset + bytesToAdd.length;\n },\n });\n};\n\n/**\n * Returns a decoder for base-X encoded strings.\n *\n * This decoder deserializes base-X encoded strings from a byte array using a custom alphabet.\n * The decoding process converts the byte array into a numeric value in base-10, then\n * maps that value back to characters in the specified base-X alphabet.\n *\n * For more details, see {@link getBaseXCodec}.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeDecoder` for decoding base-X strings.\n *\n * @example\n * Decoding a base-X string using a custom alphabet.\n * ```ts\n * const decoder = getBaseXDecoder('0123456789abcdef');\n * const value = decoder.decode(new Uint8Array([0xde, 0xad, 0xfa, 0xce])); // \"deadface\"\n * ```\n *\n * @see {@link getBaseXCodec}\n */\nexport const getBaseXDecoder = (alphabet: string): VariableSizeDecoder => {\n return createDecoder({\n read(rawBytes, offset): [string, number] {\n const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);\n if (bytes.length === 0) return ['', 0];\n\n // Handle leading zeroes.\n let trailIndex = bytes.findIndex(n => n !== 0);\n trailIndex = trailIndex === -1 ? bytes.length : trailIndex;\n const leadingZeroes = alphabet[0].repeat(trailIndex);\n if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length];\n\n // From bytes to base10.\n const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);\n\n // From base10 to baseX.\n const tailChars = getBaseXFromBigInt(base10Number, alphabet);\n\n return [leadingZeroes + tailChars, rawBytes.length];\n },\n });\n};\n\n/**\n * Returns a codec for encoding and decoding base-X strings.\n *\n * This codec serializes strings using a custom alphabet, treating the length of the alphabet as the base.\n * The encoding process converts the input string into a numeric value in base-X, which is then encoded as bytes.\n * The decoding process reverses this transformation to reconstruct the original string.\n *\n * This codec supports leading zeroes by treating the first character of the alphabet as the zero character.\n *\n * @param alphabet - The set of characters defining the base-X encoding.\n * @returns A `VariableSizeCodec` for encoding and decoding base-X strings.\n *\n * @example\n * Encoding and decoding a base-X string using a custom alphabet.\n * ```ts\n * const codec = getBaseXCodec('0123456789abcdef');\n * const bytes = codec.encode('deadface'); // 0xdeadface\n * const value = codec.decode(bytes); // \"deadface\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-X codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBaseXCodec('0123456789abcdef'), 8);\n * ```\n *\n * If you need a size-prefixed base-X codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBaseXCodec('0123456789abcdef'), getU32Codec());\n * ```\n *\n * Separate {@link getBaseXEncoder} and {@link getBaseXDecoder} functions are available.\n *\n * ```ts\n * const bytes = getBaseXEncoder('0123456789abcdef').encode('deadface');\n * const value = getBaseXDecoder('0123456789abcdef').decode(bytes);\n * ```\n *\n * @see {@link getBaseXEncoder}\n * @see {@link getBaseXDecoder}\n */\nexport const getBaseXCodec = (alphabet: string): VariableSizeCodec =>\n combineCodec(getBaseXEncoder(alphabet), getBaseXDecoder(alphabet));\n\nfunction partitionLeadingZeroes(\n value: string,\n zeroCharacter: string,\n): [leadingZeros: string, tailChars: string | undefined] {\n const [leadingZeros, tailChars] = value.split(new RegExp(`((?!${zeroCharacter}).*)`));\n return [leadingZeros, tailChars];\n}\n\nfunction getBigIntFromBaseX(value: string, alphabet: string): bigint {\n const base = BigInt(alphabet.length);\n let sum = 0n;\n for (const char of value) {\n sum *= base;\n sum += BigInt(alphabet.indexOf(char));\n }\n return sum;\n}\n\nfunction getBaseXFromBigInt(value: bigint, alphabet: string): string {\n const base = BigInt(alphabet.length);\n const tailChars = [];\n while (value > 0n) {\n tailChars.unshift(alphabet[Number(value % base)]);\n value /= base;\n }\n return tailChars.join('');\n}\n","import { getBaseXCodec, getBaseXDecoder, getBaseXEncoder } from './baseX';\n\nconst alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Returns an encoder for base-58 strings.\n *\n * This encoder serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeEncoder` for encoding base-58 strings.\n *\n * @example\n * Encoding a base-58 string.\n * ```ts\n * const encoder = getBase58Encoder();\n * const bytes = encoder.encode('heLLo'); // 0x1b6a3070\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Encoder = () => getBaseXEncoder(alphabet);\n\n/**\n * Returns a decoder for base-58 strings.\n *\n * This decoder deserializes base-58 encoded strings from a byte array.\n *\n * For more details, see {@link getBase58Codec}.\n *\n * @returns A `VariableSizeDecoder` for decoding base-58 strings.\n *\n * @example\n * Decoding a base-58 string.\n * ```ts\n * const decoder = getBase58Decoder();\n * const value = decoder.decode(new Uint8Array([0x1b, 0x6a, 0x30, 0x70])); // \"heLLo\"\n * ```\n *\n * @see {@link getBase58Codec}\n */\nexport const getBase58Decoder = () => getBaseXDecoder(alphabet);\n\n/**\n * Returns a codec for encoding and decoding base-58 strings.\n *\n * This codec serializes strings using a base-58 encoding scheme,\n * commonly used in cryptocurrency addresses and other compact representations.\n *\n * @returns A `VariableSizeCodec` for encoding and decoding base-58 strings.\n *\n * @example\n * Encoding and decoding a base-58 string.\n * ```ts\n * const codec = getBase58Codec();\n * const bytes = codec.encode('heLLo'); // 0x1b6a3070\n * const value = codec.decode(bytes); // \"heLLo\"\n * ```\n *\n * @remarks\n * This codec does not enforce a size boundary. It will encode and decode all bytes necessary to represent the string.\n *\n * If you need a fixed-size base-58 codec, consider using {@link fixCodecSize}.\n *\n * ```ts\n * const codec = fixCodecSize(getBase58Codec(), 8);\n * ```\n *\n * If you need a size-prefixed base-58 codec, consider using {@link addCodecSizePrefix}.\n *\n * ```ts\n * const codec = addCodecSizePrefix(getBase58Codec(), getU32Codec());\n * ```\n *\n * Separate {@link getBase58Encoder} and {@link getBase58Decoder} functions are available.\n *\n * ```ts\n * const bytes = getBase58Encoder().encode('heLLo');\n * const value = getBase58Decoder().decode(bytes);\n * ```\n *\n * @see {@link getBase58Encoder}\n * @see {@link getBase58Decoder}\n */\nexport const getBase58Codec = () => getBaseXCodec(alphabet);\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n type Encoder,\n type VariableSizeCodec,\n type VariableSizeDecoder,\n type VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getArrayDecoder, getArrayEncoder, getStructDecoder, getStructEncoder } from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getShortU16Encoder, getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\n\nimport type { getCompiledAddressTableLookups } from '../compile/address-table-lookups';\n\ntype AddressTableLookup = ReturnType[number];\n\nlet memoizedAddressTableLookupEncoder: VariableSizeEncoder | undefined;\nexport function getAddressTableLookupEncoder(): VariableSizeEncoder {\n if (!memoizedAddressTableLookupEncoder) {\n const indexEncoder = getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() }) as Encoder<\n readonly number[]\n >;\n memoizedAddressTableLookupEncoder = getStructEncoder([\n ['lookupTableAddress', getAddressEncoder()],\n ['writableIndexes', indexEncoder],\n ['readonlyIndexes', indexEncoder],\n ]);\n }\n\n return memoizedAddressTableLookupEncoder;\n}\n\nlet memoizedAddressTableLookupDecoder: VariableSizeDecoder | undefined;\nexport function getAddressTableLookupDecoder(): VariableSizeDecoder {\n if (!memoizedAddressTableLookupDecoder) {\n const indexEncoder = getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() });\n memoizedAddressTableLookupDecoder = getStructDecoder([\n ['lookupTableAddress', getAddressDecoder()],\n ['writableIndexes', indexEncoder],\n ['readonlyIndexes', indexEncoder],\n ]);\n }\n\n return memoizedAddressTableLookupDecoder;\n}\n\nexport function getAddressTableLookupCodec(): VariableSizeCodec {\n return combineCodec(getAddressTableLookupEncoder(), getAddressTableLookupDecoder());\n}\n","import { FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\nimport { getStructCodec, getStructDecoder, getStructEncoder } from '@solana/codecs-data-structures';\nimport { getU8Codec, getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\n\nimport { getCompiledMessageHeader } from '../compile/header';\n\ntype MessageHeader = ReturnType;\n\nlet memoizedU8Encoder: FixedSizeEncoder | undefined;\nfunction getMemoizedU8Encoder(): FixedSizeEncoder {\n if (!memoizedU8Encoder) memoizedU8Encoder = getU8Encoder();\n return memoizedU8Encoder;\n}\n\nlet memoizedU8Decoder: FixedSizeDecoder | undefined;\nfunction getMemoizedU8Decoder(): FixedSizeDecoder {\n if (!memoizedU8Decoder) memoizedU8Decoder = getU8Decoder();\n return memoizedU8Decoder;\n}\n\nlet memoizedU8Codec: FixedSizeCodec | undefined;\nfunction getMemoizedU8Codec(): FixedSizeCodec {\n if (!memoizedU8Codec) memoizedU8Codec = getU8Codec();\n return memoizedU8Codec;\n}\n\nexport function getMessageHeaderEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['numSignerAccounts', getMemoizedU8Encoder()],\n ['numReadonlySignerAccounts', getMemoizedU8Encoder()],\n ['numReadonlyNonSignerAccounts', getMemoizedU8Encoder()],\n ]) as FixedSizeEncoder;\n}\n\nexport function getMessageHeaderDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['numSignerAccounts', getMemoizedU8Decoder()],\n ['numReadonlySignerAccounts', getMemoizedU8Decoder()],\n ['numReadonlyNonSignerAccounts', getMemoizedU8Decoder()],\n ]) as FixedSizeDecoder;\n}\n\nexport function getMessageHeaderCodec(): FixedSizeCodec {\n return getStructCodec([\n ['numSignerAccounts', getMemoizedU8Codec()],\n ['numReadonlySignerAccounts', getMemoizedU8Codec()],\n ['numReadonlyNonSignerAccounts', getMemoizedU8Codec()],\n ]) as FixedSizeCodec;\n}\n","import {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getArrayEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n} from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getShortU16Encoder, getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\n\nimport { getCompiledInstructions } from '../compile/instructions';\n\ntype Instruction = ReturnType[number];\n\nlet memoizedGetInstructionEncoder: VariableSizeEncoder | undefined;\nexport function getInstructionEncoder(): VariableSizeEncoder {\n if (!memoizedGetInstructionEncoder) {\n memoizedGetInstructionEncoder = transformEncoder, Instruction>(\n getStructEncoder([\n ['programAddressIndex', getU8Encoder()],\n ['accountIndices', getArrayEncoder(getU8Encoder(), { size: getShortU16Encoder() })],\n ['data', addEncoderSizePrefix(getBytesEncoder(), getShortU16Encoder())],\n ]),\n // Convert an instruction to have all fields defined\n (instruction: Instruction): Required => {\n if (instruction.accountIndices !== undefined && instruction.data !== undefined) {\n return instruction as Required;\n }\n return {\n ...instruction,\n accountIndices: instruction.accountIndices ?? [],\n data: instruction.data ?? new Uint8Array(0),\n } as Required;\n },\n );\n }\n\n return memoizedGetInstructionEncoder;\n}\n\nlet memoizedGetInstructionDecoder: VariableSizeDecoder | undefined;\nexport function getInstructionDecoder(): VariableSizeDecoder {\n if (!memoizedGetInstructionDecoder) {\n memoizedGetInstructionDecoder = transformDecoder, Instruction>(\n getStructDecoder([\n ['programAddressIndex', getU8Decoder()],\n ['accountIndices', getArrayDecoder(getU8Decoder(), { size: getShortU16Decoder() })],\n [\n 'data',\n addDecoderSizePrefix(getBytesDecoder(), getShortU16Decoder()) as VariableSizeDecoder,\n ],\n ]),\n // Convert an instruction to exclude optional fields if they are empty\n (instruction: Required): Instruction => {\n if (instruction.accountIndices.length && instruction.data.byteLength) {\n return instruction;\n }\n const { accountIndices, data, ...rest } = instruction;\n return {\n ...rest,\n ...(accountIndices.length ? { accountIndices } : null),\n ...(data.byteLength ? { data } : null),\n };\n },\n );\n }\n return memoizedGetInstructionDecoder;\n}\n\nexport function getInstructionCodec(): VariableSizeCodec {\n return combineCodec(getInstructionEncoder(), getInstructionDecoder());\n}\n","import { AccountMeta, Instruction } from '@solana/instructions';\n\n/**\n * @deprecated Use `TransactionMessage` instead.\n */\n// TODO(#1147) Stop exporting this in a future major version.\nexport type BaseTransactionMessage<\n TVersion extends TransactionVersion = TransactionVersion,\n TInstruction extends Instruction = Instruction,\n> = Readonly<{\n instructions: readonly TInstruction[];\n version: TVersion;\n}>;\n\nexport const MAX_SUPPORTED_TRANSACTION_VERSION = 0;\n\ntype LegacyInstruction = Instruction;\ntype LegacyTransactionMessage = BaseTransactionMessage<'legacy', LegacyInstruction>;\ntype V0TransactionMessage = BaseTransactionMessage<0, Instruction>;\n\nexport type TransactionMessage = LegacyTransactionMessage | V0TransactionMessage;\nexport type TransactionVersion = 'legacy' | 0;\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED,\n SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\nimport { MAX_SUPPORTED_TRANSACTION_VERSION, TransactionVersion } from '../transaction-message';\n\nconst VERSION_FLAG_MASK = 0x80;\n\n/**\n * Returns an encoder that you can use to encode a {@link TransactionVersion} to a byte array.\n *\n * Legacy messages will produce an empty array and will not advance the offset. Versioned messages\n * will produce an array with a single byte.\n */\nexport function getTransactionVersionEncoder(): VariableSizeEncoder {\n return createEncoder({\n getSizeFromValue: value => (value === 'legacy' ? 0 : 1),\n maxSize: 1,\n write: (value, bytes, offset) => {\n if (value === 'legacy') {\n return offset;\n }\n if (value < 0 || value > 127) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE, {\n actualVersion: value,\n });\n }\n\n if (value > MAX_SUPPORTED_TRANSACTION_VERSION) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: value,\n });\n }\n bytes.set([value | VERSION_FLAG_MASK], offset);\n return offset + 1;\n },\n });\n}\n\n/**\n * Returns a decoder that you can use to decode a byte array representing a\n * {@link TransactionVersion}.\n *\n * When the byte at the current offset is determined to represent a legacy transaction, this decoder\n * will return `'legacy'` and will not advance the offset.\n */\nexport function getTransactionVersionDecoder(): VariableSizeDecoder {\n return createDecoder({\n maxSize: 1,\n read: (bytes, offset) => {\n const firstByte = bytes[offset];\n if ((firstByte & VERSION_FLAG_MASK) === 0) {\n // No version flag set; it's a legacy (unversioned) transaction.\n return ['legacy', offset];\n } else {\n const version = firstByte ^ VERSION_FLAG_MASK;\n if (version > MAX_SUPPORTED_TRANSACTION_VERSION) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version,\n });\n }\n return [version as TransactionVersion, offset + 1];\n }\n },\n });\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to {@link TransactionVersion}\n *\n * @see {@link getTransactionVersionDecoder}\n * @see {@link getTransactionVersionEncoder}\n */\nexport function getTransactionVersionCodec(): VariableSizeCodec {\n return combineCodec(getTransactionVersionEncoder(), getTransactionVersionDecoder());\n}\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n createEncoder,\n Decoder,\n fixDecoderSize,\n fixEncoderSize,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getArrayEncoder,\n getConstantEncoder,\n getStructDecoder,\n getStructEncoder,\n getUnionEncoder,\n} from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getShortU16Encoder } from '@solana/codecs-numbers';\nimport { getBase58Decoder, getBase58Encoder } from '@solana/codecs-strings';\n\nimport { getCompiledAddressTableLookups } from '../compile/address-table-lookups';\nimport { CompiledTransactionMessage, CompiledTransactionMessageWithLifetime } from '../compile/message';\nimport { getAddressTableLookupDecoder, getAddressTableLookupEncoder } from './address-table-lookup';\nimport { getMessageHeaderDecoder, getMessageHeaderEncoder } from './header';\nimport { getInstructionDecoder, getInstructionEncoder } from './instruction';\nimport { getTransactionVersionDecoder, getTransactionVersionEncoder } from './transaction-version';\n\nfunction getCompiledMessageLegacyEncoder(): VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n> {\n return getStructEncoder(getPreludeStructEncoderTuple()) as VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n >;\n}\n\nfunction getCompiledMessageVersionedEncoder(): VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n> {\n return transformEncoder(\n getStructEncoder([\n ...getPreludeStructEncoderTuple(),\n ['addressTableLookups', getAddressTableLookupArrayEncoder()],\n ]) as VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n >,\n value => {\n if (value.version === 'legacy') {\n return value;\n }\n return {\n ...value,\n addressTableLookups: value.addressTableLookups ?? [],\n };\n },\n );\n}\n\nfunction getPreludeStructEncoderTuple() {\n const lifetimeTokenEncoder = getUnionEncoder(\n [\n // Use a 32-byte constant encoder for a missing lifetime token (index 0).\n getConstantEncoder(new Uint8Array(32)),\n // Use a 32-byte base58 encoder for a valid lifetime token (index 1).\n fixEncoderSize(getBase58Encoder(), 32),\n ],\n value => (value === undefined ? 0 : 1),\n );\n\n return [\n ['version', getTransactionVersionEncoder()],\n ['header', getMessageHeaderEncoder()],\n ['staticAccounts', getArrayEncoder(getAddressEncoder(), { size: getShortU16Encoder() })],\n ['lifetimeToken', lifetimeTokenEncoder],\n ['instructions', getArrayEncoder(getInstructionEncoder(), { size: getShortU16Encoder() })],\n ] as const;\n}\n\nfunction getPreludeStructDecoderTuple() {\n return [\n ['version', getTransactionVersionDecoder() as Decoder],\n ['header', getMessageHeaderDecoder()],\n ['staticAccounts', getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() })],\n ['lifetimeToken', fixDecoderSize(getBase58Decoder(), 32)],\n ['instructions', getArrayDecoder(getInstructionDecoder(), { size: getShortU16Decoder() })],\n ['addressTableLookups', getAddressTableLookupArrayDecoder()],\n ] as const;\n}\n\nfunction getAddressTableLookupArrayEncoder() {\n return getArrayEncoder(getAddressTableLookupEncoder(), { size: getShortU16Encoder() });\n}\n\nfunction getAddressTableLookupArrayDecoder() {\n return getArrayDecoder(getAddressTableLookupDecoder(), { size: getShortU16Decoder() });\n}\n\n/**\n * Returns an encoder that you can use to encode a {@link CompiledTransactionMessage} to a byte\n * array.\n *\n * The wire format of a Solana transaction consists of signatures followed by a compiled transaction\n * message. The byte array produced by this encoder is the message part.\n */\nexport function getCompiledTransactionMessageEncoder(): VariableSizeEncoder<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime)\n> {\n return createEncoder({\n getSizeFromValue: compiledMessage => {\n if (compiledMessage.version === 'legacy') {\n return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage);\n } else {\n return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage);\n }\n },\n write: (compiledMessage, bytes, offset) => {\n if (compiledMessage.version === 'legacy') {\n return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset);\n } else {\n return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset);\n }\n },\n });\n}\n\n/**\n * Returns a decoder that you can use to decode a byte array representing a\n * {@link CompiledTransactionMessage}.\n *\n * The wire format of a Solana transaction consists of signatures followed by a compiled transaction\n * message. You can use this decoder to decode the message part.\n */\nexport function getCompiledTransactionMessageDecoder(): VariableSizeDecoder<\n CompiledTransactionMessage & CompiledTransactionMessageWithLifetime\n> {\n return transformDecoder(\n getStructDecoder(getPreludeStructDecoderTuple()) as VariableSizeDecoder<\n CompiledTransactionMessage &\n CompiledTransactionMessageWithLifetime & {\n addressTableLookups?: ReturnType;\n }\n >,\n ({ addressTableLookups, ...restOfMessage }) => {\n if (restOfMessage.version === 'legacy' || !addressTableLookups?.length) {\n return restOfMessage;\n }\n return { ...restOfMessage, addressTableLookups };\n },\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to {@link CompiledTransactionMessage}\n *\n * @see {@link getCompiledTransactionMessageDecoder}\n * @see {@link getCompiledTransactionMessageEncoder}\n */\nexport function getCompiledTransactionMessageCodec(): VariableSizeCodec<\n CompiledTransactionMessage | (CompiledTransactionMessage & CompiledTransactionMessageWithLifetime),\n CompiledTransactionMessage & CompiledTransactionMessageWithLifetime\n> {\n return combineCodec(getCompiledTransactionMessageEncoder(), getCompiledTransactionMessageDecoder());\n}\n","import { Address, getAddressComparator } from '@solana/addresses';\nimport {\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES,\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n SolanaError,\n} from '@solana/errors';\nimport {\n AccountLookupMeta,\n AccountMeta,\n AccountRole,\n Instruction,\n isSignerRole,\n isWritableRole,\n mergeRoles,\n ReadonlyAccount,\n ReadonlyAccountLookup,\n ReadonlySignerAccount,\n WritableAccount,\n WritableAccountLookup,\n WritableSignerAccount,\n} from '@solana/instructions';\nimport { Brand } from '@solana/nominal-types';\n\nexport const enum AddressMapEntryType {\n FEE_PAYER,\n LOOKUP_TABLE,\n STATIC,\n}\n\ntype AddressMap = {\n [address: string]: FeePayerAccountEntry | LookupTableAccountEntry | StaticAccountEntry;\n};\ntype FeePayerAccountEntry = Omit & {\n [TYPE]: AddressMapEntryType.FEE_PAYER;\n};\ntype LookupTableAccountEntry = Omit & {\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE;\n};\nexport type OrderedAccounts = Brand<(AccountLookupMeta | AccountMeta)[], 'OrderedAccounts'>;\ntype StaticAccountEntry = Omit<\n ReadonlyAccount | ReadonlySignerAccount | WritableAccount | WritableSignerAccount,\n 'address'\n> & { [TYPE]: AddressMapEntryType.STATIC };\n\nfunction upsert(\n addressMap: AddressMap,\n address: Address,\n update: (\n entry: FeePayerAccountEntry | LookupTableAccountEntry | Record | StaticAccountEntry,\n ) => AddressMap[Address],\n) {\n addressMap[address] = update(addressMap[address] ?? { role: AccountRole.READONLY });\n}\n\nconst TYPE = Symbol('AddressMapTypeProperty');\nexport const ADDRESS_MAP_TYPE_PROPERTY: typeof TYPE = TYPE;\n\nexport function getAddressMapFromInstructions(feePayer: Address, instructions: readonly Instruction[]): AddressMap {\n const addressMap: AddressMap = {\n [feePayer]: { [TYPE]: AddressMapEntryType.FEE_PAYER, role: AccountRole.WRITABLE_SIGNER },\n };\n const addressesOfInvokedPrograms = new Set
();\n for (const instruction of instructions) {\n upsert(addressMap, instruction.programAddress, entry => {\n addressesOfInvokedPrograms.add(instruction.programAddress);\n if (TYPE in entry) {\n if (isWritableRole(entry.role)) {\n switch (entry[TYPE]) {\n case AddressMapEntryType.FEE_PAYER:\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES, {\n programAddress: instruction.programAddress,\n });\n default:\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE, {\n programAddress: instruction.programAddress,\n });\n }\n }\n if (entry[TYPE] === AddressMapEntryType.STATIC) {\n return entry;\n }\n }\n return { [TYPE]: AddressMapEntryType.STATIC, role: AccountRole.READONLY };\n });\n let addressComparator: ReturnType;\n if (!instruction.accounts) {\n continue;\n }\n for (const account of instruction.accounts) {\n upsert(addressMap, account.address, entry => {\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n address: _,\n ...accountMeta\n } = account;\n if (TYPE in entry) {\n switch (entry[TYPE]) {\n case AddressMapEntryType.FEE_PAYER:\n // The fee payer already has the highest rank -- it is by definition\n // writable-signer. Return it, no matter how `account` is configured\n return entry;\n case AddressMapEntryType.LOOKUP_TABLE: {\n const nextRole = mergeRoles(entry.role, accountMeta.role);\n if ('lookupTableAddress' in accountMeta) {\n const shouldReplaceEntry =\n // Consider using the new LOOKUP_TABLE if its address is different...\n entry.lookupTableAddress !== accountMeta.lookupTableAddress &&\n // ...and sorts before the existing one.\n (addressComparator ||= getAddressComparator())(\n accountMeta.lookupTableAddress,\n entry.lookupTableAddress,\n ) < 0;\n if (shouldReplaceEntry) {\n return {\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE,\n ...accountMeta,\n role: nextRole,\n } as LookupTableAccountEntry;\n }\n } else if (isSignerRole(accountMeta.role)) {\n // Upgrade this LOOKUP_TABLE entry to a static entry if it must sign.\n return {\n [TYPE]: AddressMapEntryType.STATIC,\n role: nextRole,\n } as StaticAccountEntry;\n }\n if (entry.role !== nextRole) {\n return {\n ...entry,\n role: nextRole,\n } as LookupTableAccountEntry;\n } else {\n return entry;\n }\n }\n case AddressMapEntryType.STATIC: {\n const nextRole = mergeRoles(entry.role, accountMeta.role);\n if (\n // Check to see if this address represents a program that is invoked\n // in this transaction.\n addressesOfInvokedPrograms.has(account.address)\n ) {\n if (isWritableRole(accountMeta.role)) {\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE,\n {\n programAddress: account.address,\n },\n );\n }\n if (entry.role !== nextRole) {\n return {\n ...entry,\n role: nextRole,\n } as StaticAccountEntry;\n } else {\n return entry;\n }\n } else if (\n 'lookupTableAddress' in accountMeta &&\n // Static accounts can be 'upgraded' to lookup table accounts as\n // long as they are not require to sign the transaction.\n !isSignerRole(entry.role)\n ) {\n return {\n ...accountMeta,\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE,\n role: nextRole,\n } as LookupTableAccountEntry;\n } else {\n if (entry.role !== nextRole) {\n // The account's role ranks higher than the current entry's.\n return {\n ...entry,\n role: nextRole,\n } as StaticAccountEntry;\n } else {\n return entry;\n }\n }\n }\n }\n }\n if ('lookupTableAddress' in accountMeta) {\n return {\n ...accountMeta,\n [TYPE]: AddressMapEntryType.LOOKUP_TABLE,\n };\n } else {\n return {\n ...accountMeta,\n [TYPE]: AddressMapEntryType.STATIC,\n };\n }\n });\n }\n }\n return addressMap;\n}\n\nexport function getOrderedAccountsFromAddressMap(addressMap: AddressMap): OrderedAccounts {\n let addressComparator: ReturnType;\n const orderedAccounts: (AccountLookupMeta | AccountMeta)[] = Object.entries(addressMap)\n .sort(([leftAddress, leftEntry], [rightAddress, rightEntry]) => {\n // STEP 1: Rapid precedence check. Fee payer, then static addresses, then lookups.\n if (leftEntry[TYPE] !== rightEntry[TYPE]) {\n if (leftEntry[TYPE] === AddressMapEntryType.FEE_PAYER) {\n return -1;\n } else if (rightEntry[TYPE] === AddressMapEntryType.FEE_PAYER) {\n return 1;\n } else if (leftEntry[TYPE] === AddressMapEntryType.STATIC) {\n return -1;\n } else if (rightEntry[TYPE] === AddressMapEntryType.STATIC) {\n return 1;\n }\n }\n // STEP 2: Sort by signer-writability.\n const leftIsSigner = isSignerRole(leftEntry.role);\n if (leftIsSigner !== isSignerRole(rightEntry.role)) {\n return leftIsSigner ? -1 : 1;\n }\n const leftIsWritable = isWritableRole(leftEntry.role);\n if (leftIsWritable !== isWritableRole(rightEntry.role)) {\n return leftIsWritable ? -1 : 1;\n }\n // STEP 3: Sort by address.\n addressComparator ||= getAddressComparator();\n if (\n leftEntry[TYPE] === AddressMapEntryType.LOOKUP_TABLE &&\n rightEntry[TYPE] === AddressMapEntryType.LOOKUP_TABLE &&\n leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress\n ) {\n return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress);\n } else {\n return addressComparator(leftAddress, rightAddress);\n }\n })\n .map(([address, addressMeta]) => ({\n address: address as Address,\n ...addressMeta,\n }));\n return orderedAccounts as unknown as OrderedAccounts;\n}\n","import { Address, getAddressComparator } from '@solana/addresses';\nimport { AccountRole } from '@solana/instructions';\n\nimport { OrderedAccounts } from '../compile/accounts';\n\ntype AddressTableLookup = Readonly<{\n /** The address of the address lookup table account. */\n lookupTableAddress: Address;\n /** Indexes of accounts in a lookup table to load as read-only. */\n readonlyIndexes: readonly number[];\n /** Indexes of accounts in a lookup table to load as writable. */\n writableIndexes: readonly number[];\n}>;\n\nexport function getCompiledAddressTableLookups(orderedAccounts: OrderedAccounts): AddressTableLookup[] {\n const index: Record<\n Address,\n Readonly<{\n [K in keyof Omit]: number[];\n }>\n > = {};\n for (const account of orderedAccounts) {\n if (!('lookupTableAddress' in account)) {\n continue;\n }\n const entry = (index[account.lookupTableAddress] ||= {\n readonlyIndexes: [],\n writableIndexes: [],\n });\n if (account.role === AccountRole.WRITABLE) {\n entry.writableIndexes.push(account.addressIndex);\n } else {\n entry.readonlyIndexes.push(account.addressIndex);\n }\n }\n return Object.keys(index)\n .sort(getAddressComparator())\n .map(lookupTableAddress => ({\n lookupTableAddress: lookupTableAddress as Address,\n ...index[lookupTableAddress as unknown as Address],\n }));\n}\n","import { isSignerRole, isWritableRole } from '@solana/instructions';\n\nimport { OrderedAccounts } from '../compile/accounts';\n\ntype MessageHeader = Readonly<{\n /**\n * The number of accounts in the static accounts list that are neither writable nor\n * signers.\n *\n * Adding this number to `numSignerAccounts` yields the index of the first read-only non-signer\n * account in the static accounts list.\n */\n numReadonlyNonSignerAccounts: number;\n /**\n * The number of read-only accounts in the static accounts list that must sign this\n * transaction.\n *\n * Subtracting this number from `numSignerAccounts` yields the index of the first read-only\n * signer account in the static accounts list.\n */\n numReadonlySignerAccounts: number;\n /**\n * The number of accounts in the static accounts list that must sign this transaction.\n *\n * Subtracting `numReadonlySignerAccounts` from this number yields the number of\n * writable signer accounts in the static accounts list. Writable signer accounts always\n * begin at index zero in the static accounts list.\n *\n * This number itself is the index of the first non-signer account in the static\n * accounts list.\n */\n numSignerAccounts: number;\n}>;\n\nexport function getCompiledMessageHeader(orderedAccounts: OrderedAccounts): MessageHeader {\n let numReadonlyNonSignerAccounts = 0;\n let numReadonlySignerAccounts = 0;\n let numSignerAccounts = 0;\n for (const account of orderedAccounts) {\n if ('lookupTableAddress' in account) {\n break;\n }\n const accountIsWritable = isWritableRole(account.role);\n if (isSignerRole(account.role)) {\n numSignerAccounts++;\n if (!accountIsWritable) {\n numReadonlySignerAccounts++;\n }\n } else if (!accountIsWritable) {\n numReadonlyNonSignerAccounts++;\n }\n }\n return {\n numReadonlyNonSignerAccounts,\n numReadonlySignerAccounts,\n numSignerAccounts,\n };\n}\n","import { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { Instruction } from '@solana/instructions';\n\nimport { OrderedAccounts } from './accounts';\n\ntype CompiledInstruction = Readonly<{\n /**\n * An ordered list of indices that indicate which accounts in the transaction message's\n * accounts list are loaded by this instruction.\n */\n accountIndices?: number[];\n /** The input to the invoked program */\n data?: ReadonlyUint8Array;\n /**\n * The index of the address in the transaction message's accounts list associated with the\n * program to invoke.\n */\n programAddressIndex: number;\n}>;\n\nfunction getAccountIndex(orderedAccounts: OrderedAccounts) {\n const out: Record = {};\n for (const [index, account] of orderedAccounts.entries()) {\n out[account.address] = index;\n }\n return out;\n}\n\nexport function getCompiledInstructions(\n instructions: readonly Instruction[],\n orderedAccounts: OrderedAccounts,\n): CompiledInstruction[] {\n const accountIndex = getAccountIndex(orderedAccounts);\n return instructions.map(({ accounts, data, programAddress }) => {\n return {\n programAddressIndex: accountIndex[programAddress],\n ...(accounts ? { accountIndices: accounts.map(({ address }) => accountIndex[address]) } : null),\n ...(data ? { data } : null),\n };\n });\n}\n","import { TransactionMessageWithBlockhashLifetime, TransactionMessageWithDurableNonceLifetime } from '../index';\n\nexport function getCompiledLifetimeToken(\n lifetimeConstraint: (\n | TransactionMessageWithBlockhashLifetime\n | TransactionMessageWithDurableNonceLifetime\n )['lifetimeConstraint'],\n): string {\n if ('nonce' in lifetimeConstraint) {\n return lifetimeConstraint.nonce;\n }\n return lifetimeConstraint.blockhash;\n}\n","import { Address } from '@solana/addresses';\n\nimport { OrderedAccounts } from './accounts';\n\nexport function getCompiledStaticAccounts(orderedAccounts: OrderedAccounts): Address[] {\n const firstLookupTableAccountIndex = orderedAccounts.findIndex(account => 'lookupTableAddress' in account);\n const orderedStaticAccounts =\n firstLookupTableAccountIndex === -1 ? orderedAccounts : orderedAccounts.slice(0, firstLookupTableAccountIndex);\n return orderedStaticAccounts.map(({ address }) => address);\n}\n","import { TransactionMessageWithFeePayer } from '../fee-payer';\nimport { TransactionMessageWithLifetime } from '../lifetime';\nimport { BaseTransactionMessage } from '../transaction-message';\nimport { getAddressMapFromInstructions, getOrderedAccountsFromAddressMap } from './accounts';\nimport { getCompiledAddressTableLookups } from './address-table-lookups';\nimport { getCompiledMessageHeader } from './header';\nimport { getCompiledInstructions } from './instructions';\nimport { getCompiledLifetimeToken } from './lifetime-token';\nimport { getCompiledStaticAccounts } from './static-accounts';\n\ntype BaseCompiledTransactionMessage = Readonly<{\n /**\n * Information about the version of the transaction message and the role of the accounts it\n * loads.\n */\n header: ReturnType;\n instructions: ReturnType;\n /** A list of addresses indicating which accounts to load */\n staticAccounts: ReturnType;\n}>;\n\n/**\n * A transaction message in a form suitable for encoding for execution on the network.\n *\n * You can not fully reconstruct a source message from a compiled message without extra information.\n * In particular, supporting details about the lifetime constraint and the concrete addresses of\n * accounts sourced from account lookup tables are lost to compilation.\n */\nexport type CompiledTransactionMessage = LegacyCompiledTransactionMessage | VersionedCompiledTransactionMessage;\n\nexport type CompiledTransactionMessageWithLifetime = Readonly<{\n /**\n * 32 bytes of data observed by the transaction proposed that makes a transaction eligible to\n * land on the network.\n *\n * In the case of a transaction message with a nonce lifetime constraint, this will be the value\n * of the nonce itself. In all other cases this will be a recent blockhash.\n */\n lifetimeToken: ReturnType;\n}>;\n\ntype LegacyCompiledTransactionMessage = BaseCompiledTransactionMessage &\n Readonly<{\n version: 'legacy';\n }>;\n\ntype VersionedCompiledTransactionMessage = BaseCompiledTransactionMessage &\n Readonly<{\n /** A list of address tables and the accounts that this transaction loads from them */\n addressTableLookups?: ReturnType;\n version: 0;\n }>;\n\n/**\n * Converts the type of transaction message data structure that you create in your application to\n * the type of transaction message data structure that can be encoded for execution on the network.\n *\n * This is a lossy process; you can not fully reconstruct a source message from a compiled message\n * without extra information. In particular, supporting details about the lifetime constraint and\n * the concrete addresses of accounts sourced from account lookup tables will be lost to\n * compilation.\n *\n * @see {@link decompileTransactionMessage}\n */\nexport function compileTransactionMessage<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage): CompiledTransactionMessageFromTransactionMessage {\n type ReturnType = CompiledTransactionMessageFromTransactionMessage;\n\n const addressMap = getAddressMapFromInstructions(\n transactionMessage.feePayer.address,\n transactionMessage.instructions,\n );\n const orderedAccounts = getOrderedAccountsFromAddressMap(addressMap);\n const lifetimeConstraint = (transactionMessage as Partial).lifetimeConstraint;\n\n return {\n ...(transactionMessage.version !== 'legacy'\n ? { addressTableLookups: getCompiledAddressTableLookups(orderedAccounts) }\n : null),\n ...(lifetimeConstraint ? { lifetimeToken: getCompiledLifetimeToken(lifetimeConstraint) } : null),\n header: getCompiledMessageHeader(orderedAccounts),\n instructions: getCompiledInstructions(transactionMessage.instructions, orderedAccounts),\n staticAccounts: getCompiledStaticAccounts(orderedAccounts),\n version: transactionMessage.version,\n } as ReturnType;\n}\n\ntype CompiledTransactionMessageFromTransactionMessage =\n ForwardTransactionMessageLifetime, TTransactionMessage>;\n\ntype ForwardTransactionMessageVersion =\n TTransactionMessage extends Readonly<{ version: 'legacy' }>\n ? LegacyCompiledTransactionMessage\n : VersionedCompiledTransactionMessage;\n\ntype ForwardTransactionMessageLifetime<\n TCompiledTransactionMessage extends CompiledTransactionMessage,\n TTransactionMessage extends BaseTransactionMessage,\n> = TTransactionMessage extends TransactionMessageWithLifetime\n ? CompiledTransactionMessageWithLifetime & TCompiledTransactionMessage\n : TCompiledTransactionMessage;\n","import { Address } from '@solana/addresses';\nimport { AccountLookupMeta, AccountMeta, AccountRole, Instruction, isSignerRole } from '@solana/instructions';\n\nimport { AddressesByLookupTableAddress } from './addresses-by-lookup-table-address';\nimport { BaseTransactionMessage, TransactionMessage } from './transaction-message';\n\ntype Mutable = {\n -readonly [P in keyof T]: T[P];\n};\n\n// Look up the address in lookup tables, return a lookup meta if it is found in any of them\nfunction findAddressInLookupTables(\n address: Address,\n role: AccountRole.READONLY | AccountRole.WRITABLE,\n addressesByLookupTableAddress: AddressesByLookupTableAddress,\n): AccountLookupMeta | undefined {\n for (const [lookupTableAddress, addresses] of Object.entries(addressesByLookupTableAddress)) {\n for (let i = 0; i < addresses.length; i++) {\n if (address === addresses[i]) {\n return {\n address,\n addressIndex: i,\n lookupTableAddress: lookupTableAddress as Address,\n role,\n };\n }\n }\n }\n}\n\ntype TransactionMessageNotLegacy = Exclude;\n\n// Each account can be AccountLookupMeta | AccountMeta\ntype WidenInstructionAccounts =\n TInstruction extends Instruction\n ? Instruction<\n TProgramAddress,\n {\n [K in keyof TAccounts]: TAccounts[K] extends AccountMeta\n ? AccountLookupMeta | AccountMeta\n : TAccounts[K];\n }\n >\n : TInstruction;\n\ntype ExtractAdditionalProps = Omit;\n\ntype WidenTransactionMessageInstructions =\n TTransactionMessage extends BaseTransactionMessage\n ? BaseTransactionMessage> &\n ExtractAdditionalProps<\n TTransactionMessage,\n BaseTransactionMessage>\n >\n : TTransactionMessage;\n\n/**\n * Given a transaction message and a mapping of lookup tables to the addresses stored in them, this\n * function will return a new transaction message with the same instructions but with all non-signer\n * accounts that are found in the given lookup tables represented by an {@link AccountLookupMeta}\n * instead of an {@link AccountMeta}.\n *\n * This means that these accounts will take up less space in the compiled transaction message. This\n * size reduction is most significant when the transaction includes many accounts from the same\n * lookup table.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import {\n * AddressesByLookupTableAddress,\n * compressTransactionMessageUsingAddressLookupTables,\n * } from '@solana/transaction-messages';\n * import { fetchAddressLookupTable } from '@solana-program/address-lookup-table';\n *\n * const lookupTableAddress = address('4QwSwNriKPrz8DLW4ju5uxC2TN5cksJx6tPUPj7DGLAW');\n * const {\n * data: { addresses },\n * } = await fetchAddressLookupTable(rpc, lookupTableAddress);\n * const addressesByAddressLookupTable: AddressesByLookupTableAddress = {\n * [lookupTableAddress]: addresses,\n * };\n *\n * const compressedTransactionMessage = compressTransactionMessageUsingAddressLookupTables(\n * transactionMessage,\n * addressesByAddressLookupTable,\n * );\n * ```\n */\nexport function compressTransactionMessageUsingAddressLookupTables<\n TTransactionMessage extends TransactionMessageNotLegacy = TransactionMessageNotLegacy,\n>(\n transactionMessage: TTransactionMessage,\n addressesByLookupTableAddress: AddressesByLookupTableAddress,\n): TTransactionMessage | WidenTransactionMessageInstructions {\n const programAddresses = new Set(transactionMessage.instructions.map(ix => ix.programAddress));\n const eligibleLookupAddresses = new Set(\n Object.values(addressesByLookupTableAddress)\n .flatMap(a => a)\n .filter(address => !programAddresses.has(address)),\n );\n const newInstructions: Instruction[] = [];\n let updatedAnyInstructions = false;\n for (const instruction of transactionMessage.instructions) {\n if (!instruction.accounts) {\n newInstructions.push(instruction);\n continue;\n }\n\n const newAccounts: Mutable> = [];\n let updatedAnyAccounts = false;\n for (const account of instruction.accounts) {\n // If the address is already a lookup, is not in any lookup tables, or is a signer role, return as-is\n if (\n 'lookupTableAddress' in account ||\n !eligibleLookupAddresses.has(account.address) ||\n isSignerRole(account.role)\n ) {\n newAccounts.push(account);\n continue;\n }\n\n // We already checked it's in one of the lookup tables\n const lookupMetaAccount = findAddressInLookupTables(\n account.address,\n account.role,\n addressesByLookupTableAddress,\n )!;\n newAccounts.push(Object.freeze(lookupMetaAccount));\n updatedAnyAccounts = true;\n updatedAnyInstructions = true;\n }\n\n newInstructions.push(\n Object.freeze(updatedAnyAccounts ? { ...instruction, accounts: newAccounts } : instruction),\n );\n }\n\n return Object.freeze(\n updatedAnyInstructions ? { ...transactionMessage, instructions: newInstructions } : transactionMessage,\n );\n}\n","import { TransactionMessage, TransactionVersion } from './transaction-message';\nimport { TransactionMessageWithinSizeLimit } from './transaction-message-size';\n\ntype TransactionConfig = Readonly<{\n version: TVersion;\n}>;\n\ntype EmptyTransactionMessage = Omit<\n Extract,\n 'instructions'\n> &\n TransactionMessageWithinSizeLimit & { instructions: readonly [] };\n\n/**\n * Given a {@link TransactionVersion} this method will return an empty transaction having the\n * capabilities of that version.\n *\n * @example\n * ```ts\n * import { createTransactionMessage } from '@solana/transaction-messages';\n *\n * const message = createTransactionMessage({ version: 0 });\n * ```\n */\nexport function createTransactionMessage(\n config: TransactionConfig,\n): EmptyTransactionMessage {\n return Object.freeze({\n instructions: Object.freeze([]),\n version: config.version,\n }) as EmptyTransactionMessage;\n}\n","import { Address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n AccountRole,\n Instruction,\n InstructionWithAccounts,\n InstructionWithData,\n isSignerRole,\n ReadonlyAccount,\n ReadonlySignerAccount,\n WritableAccount,\n WritableSignerAccount,\n} from '@solana/instructions';\nimport { Brand } from '@solana/nominal-types';\n\nexport type AdvanceNonceAccountInstruction<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n> = Instruction<'11111111111111111111111111111111'> &\n InstructionWithAccounts<\n readonly [\n WritableAccount,\n ReadonlyAccount<'SysvarRecentB1ockHashes11111111111111111111'>,\n ReadonlySignerAccount | WritableSignerAccount,\n ]\n > &\n InstructionWithData;\n\ntype AdvanceNonceAccountInstructionData = Brand;\n\nconst RECENT_BLOCKHASHES_SYSVAR_ADDRESS =\n 'SysvarRecentB1ockHashes11111111111111111111' as Address<'SysvarRecentB1ockHashes11111111111111111111'>;\nconst SYSTEM_PROGRAM_ADDRESS = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n\n/**\n * Creates an instruction for the System program to advance a nonce.\n *\n * This instruction is a prerequisite for a transaction with a nonce-based lifetime to be landed on\n * the network. In order to be considered valid, the transaction must meet all of these criteria.\n *\n * 1. Its lifetime constraint must be a {@link NonceLifetimeConstraint}.\n * 2. The value contained in the on-chain account at the address `nonceAccountAddress` must be equal\n * to {@link NonceLifetimeConstraint.nonce} at the time the transaction is landed.\n * 3. The first instruction in that transaction message must be the one returned by this function.\n *\n * You could also use the `getAdvanceNonceAccountInstruction` method of `@solana-program/system`.\n */\nexport function createAdvanceNonceAccountInstruction<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n>(\n nonceAccountAddress: Address,\n nonceAuthorityAddress: Address,\n): AdvanceNonceAccountInstruction {\n return {\n accounts: [\n { address: nonceAccountAddress, role: AccountRole.WRITABLE },\n {\n address: RECENT_BLOCKHASHES_SYSVAR_ADDRESS,\n role: AccountRole.READONLY,\n },\n { address: nonceAuthorityAddress, role: AccountRole.READONLY_SIGNER },\n ],\n data: new Uint8Array([4, 0, 0, 0]) as AdvanceNonceAccountInstructionData,\n programAddress: SYSTEM_PROGRAM_ADDRESS,\n };\n}\n\n/**\n * A type guard that returns `true` if the instruction conforms to the\n * {@link AdvanceNonceAccountInstruction} type, and refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isAdvanceNonceAccountInstruction } from '@solana/transaction-messages';\n *\n * if (isAdvanceNonceAccountInstruction(message.instructions[0])) {\n * // At this point, the first instruction in the message has been refined to a\n * // `AdvanceNonceAccountInstruction`.\n * setNonceAccountAddress(message.instructions[0].accounts[0].address);\n * } else {\n * setError('The first instruction is not an `AdvanceNonce` instruction');\n * }\n * ```\n */\nexport function isAdvanceNonceAccountInstruction(\n instruction: Instruction,\n): instruction is AdvanceNonceAccountInstruction {\n return (\n instruction.programAddress === SYSTEM_PROGRAM_ADDRESS &&\n // Test for `AdvanceNonceAccount` instruction data\n instruction.data != null &&\n isAdvanceNonceAccountInstructionData(instruction.data) &&\n // Test for exactly 3 accounts\n instruction.accounts?.length === 3 &&\n // First account is nonce account address\n instruction.accounts[0].address != null &&\n instruction.accounts[0].role === AccountRole.WRITABLE &&\n // Second account is recent blockhashes sysvar\n instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS &&\n instruction.accounts[1].role === AccountRole.READONLY &&\n // Third account is nonce authority account\n instruction.accounts[2].address != null &&\n isSignerRole(instruction.accounts[2].role)\n );\n}\n\nfunction isAdvanceNonceAccountInstructionData(data: ReadonlyUint8Array): data is AdvanceNonceAccountInstructionData {\n // AdvanceNonceAccount is the fifth instruction in the System Program (index 4)\n return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME, SolanaError } from '@solana/errors';\nimport { Instruction } from '@solana/instructions';\nimport { Brand } from '@solana/nominal-types';\n\nimport {\n AdvanceNonceAccountInstruction,\n createAdvanceNonceAccountInstruction,\n isAdvanceNonceAccountInstruction,\n} from './durable-nonce-instruction';\nimport { ExcludeTransactionMessageLifetime } from './lifetime';\nimport { TransactionMessage } from './transaction-message';\nimport { ExcludeTransactionMessageWithinSizeLimit } from './transaction-message-size';\n\ntype DurableNonceConfig<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n> = Readonly<{\n readonly nonce: Nonce;\n readonly nonceAccountAddress: Address;\n readonly nonceAuthorityAddress: Address;\n}>;\n\n/** Represents a string that is particularly known to be the base58-encoded value of a nonce. */\nexport type Nonce = Brand;\n\n/**\n * A constraint which, when applied to a transaction message, makes that transaction message\n * eligible to land on the network.\n *\n * The transaction message will continue to be eligible to land until the network considers the\n * `nonce` to have advanced. This can happen when the nonce account in which this nonce is found is\n * destroyed, or the nonce value within changes.\n */\nexport type NonceLifetimeConstraint = Readonly<{\n /**\n * A value contained in the related nonce account at the time the transaction was prepared.\n *\n * The transaction will be considered eligible to land until the nonce account ceases to exist\n * or contain this value.\n */\n nonce: Nonce;\n}>;\n\n/**\n * Represents a transaction message whose lifetime is defined by the value of a nonce it includes.\n *\n * Such a transaction can only be landed on the network if the nonce is known to the network and has\n * not already been used to land a different transaction.\n */\nexport interface TransactionMessageWithDurableNonceLifetime<\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n> {\n readonly instructions: readonly [\n // The first instruction *must* be the system program's `AdvanceNonceAccount` instruction.\n AdvanceNonceAccountInstruction,\n ...Instruction[],\n ];\n readonly lifetimeConstraint: NonceLifetimeConstraint;\n}\n\n/**\n * A helper type to exclude the durable nonce lifetime constraint from a transaction message.\n */\nexport type ExcludeTransactionMessageDurableNonceLifetime =\n TTransactionMessage extends TransactionMessageWithDurableNonceLifetime\n ? ExcludeTransactionMessageLifetime\n : TTransactionMessage;\n\n/**\n * A type guard that returns `true` if the transaction message conforms to the\n * {@link TransactionMessageWithDurableNonceLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionMessageWithDurableNonceLifetime } from '@solana/transaction-messages';\n * import { fetchNonce } from \"@solana-program/system\";\n *\n * if (isTransactionMessageWithDurableNonceLifetime(message)) {\n * // At this point, `message` has been refined to a\n * // `TransactionMessageWithDurableNonceLifetime`.\n * const { nonce, nonceAccountAddress } = message.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * setNonceIsValid(nonce === actualNonce);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a nonce-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionMessageWithDurableNonceLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithDurableNonceLifetime),\n): transactionMessage is TransactionMessage & TransactionMessageWithDurableNonceLifetime {\n return (\n 'lifetimeConstraint' in transactionMessage &&\n typeof transactionMessage.lifetimeConstraint.nonce === 'string' &&\n transactionMessage.instructions[0] != null &&\n isAdvanceNonceAccountInstruction(transactionMessage.instructions[0])\n );\n}\n\n/**\n * From time to time you might acquire a transaction message, that you expect to have a\n * nonce-based lifetime, from an untrusted network API or user input. Use this function to assert\n * that such a transaction message actually has a nonce-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionMessageWithDurableNonceLifetime } from '@solana/transaction-messages';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `message` to `TransactionMessageWithDurableNonceLifetime`.\n * assertIsTransactionMessageWithDurableNonceLifetime(message);\n * // At this point, `message` is a `TransactionMessageWithDurableNonceLifetime` that can be used\n * // with the RPC.\n * const { nonce, nonceAccountAddress } = message.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * } catch (e) {\n * // `message` turned out not to have a nonce-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionMessageWithDurableNonceLifetime(\n transactionMessage: TransactionMessage | (TransactionMessage & TransactionMessageWithDurableNonceLifetime),\n): asserts transactionMessage is TransactionMessage & TransactionMessageWithDurableNonceLifetime {\n if (!isTransactionMessageWithDurableNonceLifetime(transactionMessage)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME);\n }\n}\n\nfunction isAdvanceNonceAccountInstructionForNonce<\n TNonceAccountAddress extends Address = Address,\n TNonceAuthorityAddress extends Address = Address,\n>(\n instruction: AdvanceNonceAccountInstruction,\n nonceAccountAddress: TNonceAccountAddress,\n nonceAuthorityAddress: TNonceAuthorityAddress,\n): instruction is AdvanceNonceAccountInstruction {\n return (\n instruction.accounts[0].address === nonceAccountAddress &&\n instruction.accounts[2].address === nonceAuthorityAddress\n );\n}\n\n/**\n * Given a nonce, the account where the value of the nonce is stored, and the address of the account\n * authorized to consume that nonce, this method will return a new transaction having the same type\n * as the one supplied plus the {@link TransactionMessageWithDurableNonceLifetime} type.\n *\n * In particular, this method _prepends_ an instruction to the transaction message designed to\n * consume (or 'advance') the nonce in the same transaction whose lifetime is defined by it.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { Nonce, setTransactionMessageLifetimeUsingDurableNonce } from '@solana/transaction-messages';\n * import { fetchNonce } from '@solana-program/system';\n *\n * const nonceAccountAddress = address('EGtMh4yvXswwHhwVhyPxGrVV2TkLTgUqGodbATEPvojZ');\n * const nonceAuthorityAddress = address('4KD1Rdrd89NG7XbzW3xsX9Aqnx2EExJvExiNme6g9iAT');\n *\n * const {\n * data: { blockhash },\n * } = await fetchNonce(rpc, nonceAccountAddress);\n * const nonce = blockhash as string as Nonce;\n *\n * const durableNonceTransactionMessage = setTransactionMessageLifetimeUsingDurableNonce(\n * { nonce, nonceAccountAddress, nonceAuthorityAddress },\n * tx,\n * );\n * ```\n */\nexport function setTransactionMessageLifetimeUsingDurableNonce<\n TTransactionMessage extends TransactionMessage,\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n>(\n {\n nonce,\n nonceAccountAddress,\n nonceAuthorityAddress,\n }: DurableNonceConfig,\n transactionMessage: TTransactionMessage,\n): SetTransactionMessageWithDurableNonceLifetime<\n TTransactionMessage,\n TNonceAccountAddress,\n TNonceAuthorityAddress,\n TNonceValue\n> {\n type ReturnType = SetTransactionMessageWithDurableNonceLifetime<\n TTransactionMessage,\n TNonceAccountAddress,\n TNonceAuthorityAddress,\n TNonceValue\n >;\n\n let newInstructions: [\n AdvanceNonceAccountInstruction,\n ...Instruction[],\n ];\n\n const firstInstruction = transactionMessage.instructions[0];\n if (firstInstruction && isAdvanceNonceAccountInstruction(firstInstruction)) {\n if (isAdvanceNonceAccountInstructionForNonce(firstInstruction, nonceAccountAddress, nonceAuthorityAddress)) {\n if (\n isTransactionMessageWithDurableNonceLifetime(transactionMessage) &&\n transactionMessage.lifetimeConstraint.nonce === nonce\n ) {\n return transactionMessage as unknown as ReturnType;\n } else {\n // we already have the right first instruction, leave it as-is\n newInstructions = [firstInstruction, ...transactionMessage.instructions.slice(1)];\n }\n } else {\n // we have a different advance nonce instruction as the first instruction, replace it\n newInstructions = [\n Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)),\n ...transactionMessage.instructions.slice(1),\n ];\n }\n } else {\n // we don't have an existing advance nonce instruction as the first instruction, prepend one\n newInstructions = [\n Object.freeze(createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress)),\n ...transactionMessage.instructions,\n ];\n }\n\n return Object.freeze({\n ...transactionMessage,\n instructions: Object.freeze(newInstructions),\n lifetimeConstraint: Object.freeze({ nonce }),\n }) as unknown as ReturnType;\n}\n\n/**\n * Helper type that transforms a given transaction message type into a new one that has the\n * `AdvanceNonceAccount` instruction as the first instruction and a lifetime constraint\n * representing the nonce value.\n */\ntype SetTransactionMessageWithDurableNonceLifetime<\n TTransactionMessage extends TransactionMessage,\n TNonceAccountAddress extends string = string,\n TNonceAuthorityAddress extends string = string,\n TNonceValue extends string = string,\n> = TTransactionMessage extends unknown\n ? Omit<\n // 1. The transaction message only grows in size if it currently has a different (or no) lifetime.\n TTransactionMessage extends TransactionMessageWithDurableNonceLifetime\n ? TTransactionMessage\n : ExcludeTransactionMessageWithinSizeLimit,\n // 2. Remove the instructions array as we are going to replace it with a new one.\n 'instructions'\n > & {\n // 3. Replace or prepend the first instruction with the advance nonce account instruction.\n readonly instructions: TTransactionMessage['instructions'] extends readonly [\n AdvanceNonceAccountInstruction,\n ...infer TTail extends readonly Instruction[],\n ]\n ? readonly [AdvanceNonceAccountInstruction, ...TTail]\n : readonly [\n AdvanceNonceAccountInstruction,\n ...TTransactionMessage['instructions'],\n ];\n // 4. Set the lifetime constraint to the nonce value.\n readonly lifetimeConstraint: NonceLifetimeConstraint;\n }\n : never;\n","import { Address } from '@solana/addresses';\n\nimport { TransactionMessage } from './transaction-message';\n\n/**\n * Represents a transaction message for which a fee payer has been declared. A transaction must\n * conform to this type to be compiled and landed on the network.\n */\nexport interface TransactionMessageWithFeePayer {\n readonly feePayer: Readonly<{ address: Address }>;\n}\n\n/**\n * A helper type to exclude the fee payer from a transaction message.\n */\ntype ExcludeTransactionMessageFeePayer =\n TTransactionMessage extends unknown ? Omit : never;\n\n/**\n * Given a base58-encoded address of a system account, this method will return a new transaction\n * message having the same type as the one supplied plus the {@link TransactionMessageWithFeePayer}\n * type.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { setTransactionMessageFeePayer } from '@solana/transaction-messages';\n *\n * const myAddress = address('mpngsFd4tmbUfzDYJayjKZwZcaR7aWb2793J6grLsGu');\n * const txPaidByMe = setTransactionMessageFeePayer(myAddress, tx);\n * ```\n */\nexport function setTransactionMessageFeePayer<\n TFeePayerAddress extends string,\n TTransactionMessage extends Partial & TransactionMessage,\n>(\n feePayer: Address,\n transactionMessage: TTransactionMessage,\n): ExcludeTransactionMessageFeePayer & TransactionMessageWithFeePayer {\n if (\n 'feePayer' in transactionMessage &&\n feePayer === transactionMessage.feePayer?.address &&\n isAddressOnlyFeePayer(transactionMessage.feePayer)\n ) {\n return transactionMessage as ExcludeTransactionMessageFeePayer &\n TransactionMessageWithFeePayer;\n }\n const out = {\n ...transactionMessage,\n feePayer: Object.freeze({ address: feePayer }),\n };\n Object.freeze(out);\n return out as ExcludeTransactionMessageFeePayer &\n TransactionMessageWithFeePayer;\n}\n\nfunction isAddressOnlyFeePayer(\n feePayer: Partial['feePayer'],\n): feePayer is { address: Address } {\n return (\n !!feePayer &&\n 'address' in feePayer &&\n typeof feePayer.address === 'string' &&\n Object.keys(feePayer).length === 1\n );\n}\n","import { Instruction } from '@solana/instructions';\n\nimport { ExcludeTransactionMessageDurableNonceLifetime } from './durable-nonce';\nimport { TransactionMessage } from './transaction-message';\nimport { ExcludeTransactionMessageWithinSizeLimit } from './transaction-message-size';\n\n/**\n * A helper type to append instructions to a transaction message\n * without losing type information about the current instructions.\n */\ntype AppendTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n TInstructions extends readonly Instruction[],\n> = TTransactionMessage extends TransactionMessage\n ? Omit, 'instructions'> & {\n readonly instructions: readonly [...TTransactionMessage['instructions'], ...TInstructions];\n }\n : never;\n\n/**\n * A helper type to prepend instructions to a transaction message\n * without losing type information about the current instructions.\n */\ntype PrependTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n TInstructions extends readonly Instruction[],\n> = TTransactionMessage extends TransactionMessage\n ? Omit<\n ExcludeTransactionMessageWithinSizeLimit>,\n 'instructions'\n > & {\n readonly instructions: readonly [...TInstructions, ...TTransactionMessage['instructions']];\n }\n : never;\n\n/**\n * Given an instruction, this method will return a new transaction message with that instruction\n * having been added to the end of the list of existing instructions.\n *\n * @see {@link appendTransactionInstructions} if you need to append multiple instructions to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { getUtf8Encoder } from '@solana/codecs-strings';\n * import { appendTransactionMessageInstruction } from '@solana/transaction-messages';\n *\n * const memoTransactionMessage = appendTransactionMessageInstruction(\n * {\n * data: getUtf8Encoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * transactionMessage,\n * );\n * ```\n */\nexport function appendTransactionMessageInstruction<\n TTransactionMessage extends TransactionMessage,\n TInstruction extends Instruction,\n>(\n instruction: TInstruction,\n transactionMessage: TTransactionMessage,\n): AppendTransactionMessageInstructions {\n return appendTransactionMessageInstructions([instruction], transactionMessage);\n}\n\n/**\n * Given an array of instructions, this method will return a new transaction message with those\n * instructions having been added to the end of the list of existing instructions.\n *\n * @see {@link appendTransactionInstruction} if you only need to append one instruction to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { appendTransactionMessageInstructions } from '@solana/transaction-messages';\n *\n * const memoTransaction = appendTransactionMessageInstructions(\n * [\n * {\n * data: new TextEncoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * {\n * data: new TextEncoder().encode('How are you?'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * ],\n * tx,\n * );\n * ```\n */\nexport function appendTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n const TInstructions extends readonly Instruction[],\n>(\n instructions: TInstructions,\n transactionMessage: TTransactionMessage,\n): AppendTransactionMessageInstructions {\n return Object.freeze({\n ...transactionMessage,\n instructions: Object.freeze([\n ...(transactionMessage.instructions as TTransactionMessage['instructions']),\n ...instructions,\n ] as readonly [...TTransactionMessage['instructions'], ...TInstructions]),\n }) as AppendTransactionMessageInstructions;\n}\n\n/**\n * Given an instruction, this method will return a new transaction message with that instruction\n * having been added to the beginning of the list of existing instructions.\n *\n * @see {@link prependTransactionInstructions} if you need to prepend multiple instructions to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { prependTransactionMessageInstruction } from '@solana/transaction-messages';\n *\n * const memoTransaction = prependTransactionMessageInstruction(\n * {\n * data: new TextEncoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * tx,\n * );\n * ```\n */\nexport function prependTransactionMessageInstruction<\n TTransactionMessage extends TransactionMessage,\n TInstruction extends Instruction,\n>(\n instruction: TInstruction,\n transactionMessage: TTransactionMessage,\n): PrependTransactionMessageInstructions {\n return prependTransactionMessageInstructions([instruction], transactionMessage);\n}\n\n/**\n * Given an array of instructions, this method will return a new transaction message with those\n * instructions having been added to the beginning of the list of existing instructions.\n *\n * @see {@link prependTransactionInstruction} if you only need to prepend one instruction to a\n * transaction message.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { prependTransactionMessageInstructions } from '@solana/transaction-messages';\n *\n * const memoTransaction = prependTransactionMessageInstructions(\n * [\n * {\n * data: new TextEncoder().encode('Hello world!'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * {\n * data: new TextEncoder().encode('How are you?'),\n * programAddress: address('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'),\n * },\n * ],\n * tx,\n * );\n * ```\n */\nexport function prependTransactionMessageInstructions<\n TTransactionMessage extends TransactionMessage,\n const TInstructions extends readonly Instruction[],\n>(\n instructions: TInstructions,\n transactionMessage: TTransactionMessage,\n): PrependTransactionMessageInstructions {\n return Object.freeze({\n ...(transactionMessage as ExcludeTransactionMessageDurableNonceLifetime),\n instructions: Object.freeze([\n ...instructions,\n ...(transactionMessage.instructions as TTransactionMessage['instructions']),\n ] as readonly [...TInstructions, ...TTransactionMessage['instructions']]),\n }) as unknown as PrependTransactionMessageInstructions;\n}\n","import { Address, assertIsAddress } from '@solana/addresses';\nimport {\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND,\n SolanaError,\n} from '@solana/errors';\nimport { pipe } from '@solana/functional';\nimport { AccountLookupMeta, AccountMeta, AccountRole, Instruction } from '@solana/instructions';\nimport type { Blockhash } from '@solana/rpc-types';\n\nimport { AddressesByLookupTableAddress } from './addresses-by-lookup-table-address';\nimport { BlockhashLifetimeConstraint, setTransactionMessageLifetimeUsingBlockhash } from './blockhash';\nimport { CompiledTransactionMessage, CompiledTransactionMessageWithLifetime } from './compile';\nimport type { getCompiledAddressTableLookups } from './compile/address-table-lookups';\nimport { createTransactionMessage } from './create-transaction-message';\nimport { Nonce, setTransactionMessageLifetimeUsingDurableNonce } from './durable-nonce';\nimport { isAdvanceNonceAccountInstruction } from './durable-nonce-instruction';\nimport { setTransactionMessageFeePayer, TransactionMessageWithFeePayer } from './fee-payer';\nimport { appendTransactionMessageInstruction } from './instructions';\nimport { TransactionMessageWithLifetime } from './lifetime';\nimport { TransactionMessage, TransactionVersion } from './transaction-message';\n\nfunction getAccountMetas(message: CompiledTransactionMessage): AccountMeta[] {\n const { header } = message;\n const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;\n const numWritableNonSignerAccounts =\n message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;\n\n const accountMetas: AccountMeta[] = [];\n\n let accountIndex = 0;\n for (let i = 0; i < numWritableSignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.WRITABLE_SIGNER,\n });\n accountIndex++;\n }\n\n for (let i = 0; i < header.numReadonlySignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.READONLY_SIGNER,\n });\n accountIndex++;\n }\n\n for (let i = 0; i < numWritableNonSignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.WRITABLE,\n });\n accountIndex++;\n }\n\n for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {\n accountMetas.push({\n address: message.staticAccounts[accountIndex],\n role: AccountRole.READONLY,\n });\n accountIndex++;\n }\n\n return accountMetas;\n}\n\nfunction getAddressLookupMetas(\n compiledAddressTableLookups: ReturnType,\n addressesByLookupTableAddress: AddressesByLookupTableAddress,\n): AccountLookupMeta[] {\n // check that all message lookups are known\n const compiledAddressTableLookupAddresses = compiledAddressTableLookups.map(l => l.lookupTableAddress);\n const missing = compiledAddressTableLookupAddresses.filter(a => addressesByLookupTableAddress[a] === undefined);\n if (missing.length > 0) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING, {\n lookupTableAddresses: missing,\n });\n }\n\n const readOnlyMetas: AccountLookupMeta[] = [];\n const writableMetas: AccountLookupMeta[] = [];\n\n // we know that for each lookup, knownLookups[lookup.lookupTableAddress] is defined\n for (const lookup of compiledAddressTableLookups) {\n const addresses = addressesByLookupTableAddress[lookup.lookupTableAddress];\n const readonlyIndexes = lookup.readonlyIndexes;\n const writableIndexes = lookup.writableIndexes;\n\n const highestIndex = Math.max(...readonlyIndexes, ...writableIndexes);\n if (highestIndex >= addresses.length) {\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE,\n {\n highestKnownIndex: addresses.length - 1,\n highestRequestedIndex: highestIndex,\n lookupTableAddress: lookup.lookupTableAddress,\n },\n );\n }\n\n const readOnlyForLookup: AccountLookupMeta[] = readonlyIndexes.map(r => ({\n address: addresses[r],\n addressIndex: r,\n lookupTableAddress: lookup.lookupTableAddress,\n role: AccountRole.READONLY,\n }));\n readOnlyMetas.push(...readOnlyForLookup);\n\n const writableForLookup: AccountLookupMeta[] = writableIndexes.map(w => ({\n address: addresses[w],\n addressIndex: w,\n lookupTableAddress: lookup.lookupTableAddress,\n role: AccountRole.WRITABLE,\n }));\n writableMetas.push(...writableForLookup);\n }\n\n return [...writableMetas, ...readOnlyMetas];\n}\n\nfunction convertInstruction(\n instruction: CompiledTransactionMessage['instructions'][0],\n accountMetas: AccountMeta[],\n): Instruction {\n const programAddress = accountMetas[instruction.programAddressIndex]?.address;\n if (!programAddress) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND, {\n index: instruction.programAddressIndex,\n });\n }\n\n const accounts = instruction.accountIndices?.map(accountIndex => accountMetas[accountIndex]);\n const { data } = instruction;\n\n return Object.freeze({\n programAddress,\n ...(accounts && accounts.length ? { accounts: Object.freeze(accounts) } : {}),\n ...(data && data.length ? { data } : {}),\n });\n}\n\ntype LifetimeConstraint =\n | BlockhashLifetimeConstraint\n | {\n nonce: Nonce;\n nonceAccountAddress: Address;\n nonceAuthorityAddress: Address;\n };\n\nfunction getLifetimeConstraint(\n messageLifetimeToken: string,\n firstInstruction?: Instruction,\n lastValidBlockHeight?: bigint,\n): LifetimeConstraint {\n if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {\n // first instruction is not advance durable nonce, so use blockhash lifetime constraint\n return {\n blockhash: messageLifetimeToken as Blockhash,\n lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n, // U64 MAX\n };\n } else {\n // We know these accounts are defined because we checked `isAdvanceNonceAccountInstruction`\n const nonceAccountAddress = firstInstruction.accounts[0].address;\n assertIsAddress(nonceAccountAddress);\n\n const nonceAuthorityAddress = firstInstruction.accounts[2].address;\n assertIsAddress(nonceAuthorityAddress);\n\n return {\n nonce: messageLifetimeToken as Nonce,\n nonceAccountAddress,\n nonceAuthorityAddress,\n };\n }\n}\n\nexport type DecompileTransactionMessageConfig = {\n /**\n * If the compiled message loads addresses from one or more address lookup tables, you will have\n * to supply a map of those tables to an array of the addresses they contained at the time that\n * the transaction message was constructed.\n *\n * @see {@link decompileTransactionMessageFetchingLookupTables} if you do not already have this.\n */\n addressesByLookupTableAddress?: AddressesByLookupTableAddress;\n /**\n * If the compiled message has a blockhash-based lifetime constraint, you will have to supply\n * the block height after which that blockhash is no longer valid for use as a lifetime\n * constraint.\n */\n lastValidBlockHeight?: bigint;\n};\n\n/**\n * Converts the type of transaction message data structure appropriate for execution on the network\n * to the type of transaction message data structure designed for use in your application.\n *\n * Because compilation is a lossy process, you can not fully reconstruct a source message from a\n * compiled message without extra information. In order to faithfully reconstruct the original\n * source message you will need to supply supporting details about the lifetime constraint and the\n * concrete addresses of any accounts sourced from account lookup tables.\n *\n * @see {@link compileTransactionMessage}\n */\nexport function decompileTransactionMessage(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n config?: DecompileTransactionMessageConfig,\n): TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithLifetime {\n const feePayer = compiledTransactionMessage.staticAccounts[0];\n if (!feePayer) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING);\n }\n\n const accountMetas = getAccountMetas(compiledTransactionMessage);\n const accountLookupMetas =\n 'addressTableLookups' in compiledTransactionMessage &&\n compiledTransactionMessage.addressTableLookups !== undefined &&\n compiledTransactionMessage.addressTableLookups.length > 0\n ? getAddressLookupMetas(\n compiledTransactionMessage.addressTableLookups,\n config?.addressesByLookupTableAddress ?? {},\n )\n : [];\n const transactionMetas = [...accountMetas, ...accountLookupMetas];\n\n const instructions: Instruction[] = compiledTransactionMessage.instructions.map(compiledInstruction =>\n convertInstruction(compiledInstruction, transactionMetas),\n );\n\n const firstInstruction = instructions[0];\n const lifetimeConstraint = getLifetimeConstraint(\n compiledTransactionMessage.lifetimeToken,\n firstInstruction,\n config?.lastValidBlockHeight,\n );\n\n return pipe(\n createTransactionMessage({ version: compiledTransactionMessage.version as TransactionVersion }),\n m => setTransactionMessageFeePayer(feePayer, m),\n m =>\n instructions.reduce(\n (acc, instruction) => appendTransactionMessageInstruction(instruction, acc),\n m as TransactionMessage,\n ),\n m =>\n 'blockhash' in lifetimeConstraint\n ? setTransactionMessageLifetimeUsingBlockhash(lifetimeConstraint, m)\n : setTransactionMessageLifetimeUsingDurableNonce(lifetimeConstraint, m),\n ) as TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithLifetime;\n}\n","export const ED25519_ALGORITHM_IDENTIFIER =\n // Resist the temptation to convert this to a simple string; As of version 133.0.3, Firefox\n // requires the object form of `AlgorithmIdentifier` and will throw a `DOMException` otherwise.\n Object.freeze({ name: 'Ed25519' });\n","import { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, SolanaError } from '@solana/errors';\n\nimport { ED25519_ALGORITHM_IDENTIFIER } from './algorithm';\n\nfunction addPkcs8Header(bytes: ReadonlyUint8Array): ReadonlyUint8Array {\n // prettier-ignore\n return new Uint8Array([\n /**\n * PKCS#8 header\n */\n 0x30, // ASN.1 sequence tag\n 0x2e, // Length of sequence (46 more bytes)\n\n 0x02, // ASN.1 integer tag\n 0x01, // Length of integer\n 0x00, // Version number\n\n 0x30, // ASN.1 sequence tag\n 0x05, // Length of sequence\n 0x06, // ASN.1 object identifier tag\n 0x03, // Length of object identifier\n // Edwards curve algorithms identifier https://oid-rep.orange-labs.fr/get/1.3.101.112\n 0x2b, // iso(1) / identified-organization(3) (The first node is multiplied by the decimal 40 and the result is added to the value of the second node)\n 0x65, // thawte(101)\n // Ed25519 identifier\n 0x70, // id-Ed25519(112)\n\n /**\n * Private key payload\n */\n 0x04, // ASN.1 octet string tag\n 0x22, // String length (34 more bytes)\n\n // Private key bytes as octet string\n 0x04, // ASN.1 octet string tag\n 0x20, // String length (32 bytes)\n\n ...bytes\n ]);\n}\n\n/**\n * Given a private key represented as a 32-byte `Uint8Array`, creates an Ed25519 private key for use\n * with other methods in this package that accept\n * [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey) objects.\n *\n * @param bytes 32 bytes that represent the private key\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the private\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import { createPrivateKeyFromBytes } from '@solana/keys';\n *\n * const privateKey = await createPrivateKeyFromBytes(new Uint8Array([...]));\n * const extractablePrivateKey = await createPrivateKeyFromBytes(new Uint8Array([...]), true);\n * ```\n */\nexport async function createPrivateKeyFromBytes(\n bytes: ReadonlyUint8Array,\n extractable: boolean = false,\n): Promise {\n const actualLength = bytes.byteLength;\n if (actualLength !== 32) {\n throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH, {\n actualLength,\n });\n }\n const privateKeyBytesPkcs8 = addPkcs8Header(bytes);\n return await crypto.subtle.importKey('pkcs8', privateKeyBytesPkcs8, ED25519_ALGORITHM_IDENTIFIER, extractable, [\n 'sign',\n ]);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\nimport { SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, SolanaError } from '@solana/errors';\n\n/**\n * Given an extractable [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey)\n * private key, gets the corresponding public key as a\n * [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey).\n *\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the public\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import { createPrivateKeyFromBytes, getPublicKeyFromPrivateKey } from '@solana/keys';\n *\n * const privateKey = await createPrivateKeyFromBytes(new Uint8Array([...]), true);\n *\n * const publicKey = await getPublicKeyFromPrivateKey(privateKey);\n * const extractablePublicKey = await getPublicKeyFromPrivateKey(privateKey, true);\n * ```\n */\nexport async function getPublicKeyFromPrivateKey(\n privateKey: CryptoKey,\n extractable: boolean = false,\n): Promise {\n assertKeyExporterIsAvailable();\n\n if (privateKey.extractable === false) {\n throw new SolanaError(SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY, { key: privateKey });\n }\n\n // Export private key.\n const jwk = await crypto.subtle.exportKey('jwk', privateKey);\n\n // Import public key.\n return await crypto.subtle.importKey(\n 'jwk',\n {\n crv /* curve */: 'Ed25519',\n ext /* extractable */: extractable,\n key_ops /* key operations */: ['verify'],\n kty /* key type */: 'OKP' /* octet key pair */,\n x /* public key x-coordinate */: jwk.x,\n },\n 'Ed25519',\n extractable,\n ['verify'],\n );\n}\n","import { assertSigningCapabilityIsAvailable, assertVerificationCapabilityIsAvailable } from '@solana/assertions';\nimport { Encoder, ReadonlyUint8Array, toArrayBuffer } from '@solana/codecs-core';\nimport { getBase58Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\nimport { ED25519_ALGORITHM_IDENTIFIER } from './algorithm';\n\n/**\n * A 64-byte Ed25519 signature as a base58-encoded string.\n */\nexport type Signature = Brand, 'Signature'>;\n/**\n * A 64-byte Ed25519 signature.\n *\n * Whenever you need to verify that a particular signature is, in fact, the one that would have been\n * produced by signing some known bytes using the private key associated with some known public key,\n * use the {@link verifySignature} function in this package.\n */\nexport type SignatureBytes = Brand;\n\nlet base58Encoder: Encoder | undefined;\n\n/**\n * Asserts that an arbitrary string is a base58-encoded Ed25519 signature.\n *\n * Useful when you receive a string from user input or an untrusted network API that you expect to\n * represent an Ed25519 signature (eg. of a transaction).\n *\n * @example\n * ```ts\n * import { assertIsSignature } from '@solana/keys';\n *\n * // Imagine a function that asserts whether a user-supplied signature is valid or not.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const signature: string = signatureInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `signature` to `Signature`.\n * assertIsSignature(signature);\n * // At this point, `signature` is a `Signature` that can be used with the RPC.\n * const {\n * value: [status],\n * } = await rpc.getSignatureStatuses([signature]).send();\n * } catch (e) {\n * // `signature` turned out not to be a base58-encoded signature\n * }\n * }\n * ```\n */\nexport function assertIsSignature(putativeSignature: string): asserts putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n throw new SolanaError(SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE, {\n actualLength: putativeSignature.length,\n });\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n assertIsSignatureBytes(bytes);\n}\n\n/**\n * Asserts that an arbitrary `ReadonlyUint8Array` is an Ed25519 signature.\n *\n * Useful when you receive a `ReadonlyUint8Array` from an external interface (like the browser wallets' `signMessage` API) that you expect to\n * represent an Ed25519 signature.\n *\n * @example\n * ```ts\n * import { assertIsSignatureBytes } from '@solana/keys';\n *\n * // Imagine a function that verifies a signature.\n * function verifySignature() {\n * // We know only that the input conforms to the `ReadonlyUint8Array` type.\n * const signatureBytes: ReadonlyUint8Array = signatureBytesInput;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `signatureBytes` to `SignatureBytes`.\n * assertIsSignatureBytes(signatureBytes);\n * // At this point, `signatureBytes` is a `SignatureBytes` that can be used with `verifySignature`.\n * if (!(await verifySignature(publicKey, signatureBytes, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * } catch (e) {\n * // `signatureBytes` turned out not to be a 64-byte Ed25519 signature\n * }\n * }\n * ```\n */\nexport function assertIsSignatureBytes(\n putativeSignatureBytes: ReadonlyUint8Array,\n): asserts putativeSignatureBytes is SignatureBytes {\n const numBytes = putativeSignatureBytes.byteLength;\n if (numBytes !== 64) {\n throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH, {\n actualLength: numBytes,\n });\n }\n}\n\n/**\n * A type guard that accepts a string as input. It will both return `true` if the string conforms to\n * the {@link Signature} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isSignature } from '@solana/keys';\n *\n * if (isSignature(signature)) {\n * // At this point, `signature` has been refined to a\n * // `Signature` that can be used with the RPC.\n * const {\n * value: [status],\n * } = await rpc.getSignatureStatuses([signature]).send();\n * setSignatureStatus(status);\n * } else {\n * setError(`${signature} is not a transaction signature`);\n * }\n * ```\n */\nexport function isSignature(putativeSignature: string): putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n return isSignatureBytes(bytes);\n}\n\n/**\n * A type guard that accepts a `ReadonlyUint8Array` as input. It will both return `true` if the `ReadonlyUint8Array` conforms to\n * the {@link SignatureBytes} type and will refine the type for use in your program.\n *\n * @example\n * ```ts\n * import { isSignatureBytes } from '@solana/keys';\n *\n * if (isSignatureBytes(signatureBytes)) {\n * // At this point, `signatureBytes` has been refined to a\n * // `SignatureBytes` that can be used with `verifySignature`.\n * if (!(await verifySignature(publicKey, signatureBytes, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * } else {\n * setError(`${signatureBytes} is not a 64-byte Ed25519 signature`);\n * }\n * ```\n */\nexport function isSignatureBytes(putativeSignatureBytes: ReadonlyUint8Array): putativeSignatureBytes is SignatureBytes {\n return putativeSignatureBytes.byteLength === 64;\n}\n\n/**\n * Given a private [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey) and a\n * `Uint8Array` of bytes, this method will return the 64-byte Ed25519 signature of that data as a\n * `Uint8Array`.\n *\n * @example\n * ```ts\n * import { signBytes } from '@solana/keys';\n *\n * const data = new Uint8Array([1, 2, 3]);\n * const signature = await signBytes(privateKey, data);\n * ```\n */\nexport async function signBytes(key: CryptoKey, data: ReadonlyUint8Array): Promise {\n assertSigningCapabilityIsAvailable();\n const signedData = await crypto.subtle.sign(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(data));\n return new Uint8Array(signedData) as SignatureBytes;\n}\n\n/**\n * This helper combines _asserting_ that a string is an Ed25519 signature with _coercing_ it to the\n * {@link Signature} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { signature } from '@solana/keys';\n *\n * const signature = signature(userSuppliedSignature);\n * const {\n * value: [status],\n * } = await rpc.getSignatureStatuses([signature]).send();\n * ```\n */\nexport function signature(putativeSignature: string): Signature {\n assertIsSignature(putativeSignature);\n return putativeSignature;\n}\n\n/**\n * This helper combines _asserting_ that a `ReadonlyUint8Array` is an Ed25519 signature with _coercing_ it to the\n * {@link SignatureBytes} type. It's best used with untrusted input.\n *\n * @example\n * ```ts\n * import { signatureBytes } from '@solana/keys';\n *\n * const signature = signatureBytes(userSuppliedSignatureBytes);\n * if (!(await verifySignature(publicKey, signature, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * ```\n */\nexport function signatureBytes(putativeSignatureBytes: ReadonlyUint8Array): SignatureBytes {\n assertIsSignatureBytes(putativeSignatureBytes);\n return putativeSignatureBytes;\n}\n\n/**\n * Given a public [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey), some\n * {@link SignatureBytes}, and a `Uint8Array` of data, this method will return `true` if the\n * signature was produced by signing the data using the private key associated with the public key,\n * and `false` otherwise.\n *\n * @example\n * ```ts\n * import { verifySignature } from '@solana/keys';\n *\n * const data = new Uint8Array([1, 2, 3]);\n * if (!(await verifySignature(publicKey, signature, data))) {\n * throw new Error('The data were *not* signed by the private key associated with `publicKey`');\n * }\n * ```\n */\nexport async function verifySignature(\n key: CryptoKey,\n signature: SignatureBytes,\n data: ReadonlyUint8Array,\n): Promise {\n assertVerificationCapabilityIsAvailable();\n return await crypto.subtle.verify(ED25519_ALGORITHM_IDENTIFIER, key, toArrayBuffer(signature), toArrayBuffer(data));\n}\n","import { assertKeyGenerationIsAvailable, assertPRNGIsAvailable } from '@solana/assertions';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH,\n SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY,\n SolanaError,\n} from '@solana/errors';\n\nimport { ED25519_ALGORITHM_IDENTIFIER } from './algorithm';\nimport { createPrivateKeyFromBytes } from './private-key';\nimport { getPublicKeyFromPrivateKey } from './public-key';\nimport { signBytes, verifySignature } from './signatures';\n\n/**\n * Generates an Ed25519 public/private key pair for use with other methods in this package that\n * accept [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey) objects.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n *\n * const { privateKey, publicKey } = await generateKeyPair();\n * ```\n */\nexport async function generateKeyPair(): Promise {\n await assertKeyGenerationIsAvailable();\n const keyPair = await crypto.subtle.generateKey(\n /* algorithm */ ED25519_ALGORITHM_IDENTIFIER, // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20\n /* extractable */ false, // Prevents the bytes of the private key from being visible to JS.\n /* allowed uses */ ['sign', 'verify'],\n );\n return keyPair;\n}\n\n/**\n * Given a 64-byte `Uint8Array` secret key, creates an Ed25519 public/private key pair for use with\n * other methods in this package that accept [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey)\n * objects.\n *\n * @param bytes 64 bytes, the first 32 of which represent the private key and the last 32 of which\n * represent its associated public key\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the private\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import fs from 'fs';\n * import { createKeyPairFromBytes } from '@solana/keys';\n *\n * // Get bytes from local keypair file.\n * const keypairFile = fs.readFileSync('~/.config/solana/id.json');\n * const keypairBytes = new Uint8Array(JSON.parse(keypairFile.toString()));\n *\n * // Create a CryptoKeyPair from the bytes.\n * const { privateKey, publicKey } = await createKeyPairFromBytes(keypairBytes);\n * ```\n */\nexport async function createKeyPairFromBytes(\n bytes: ReadonlyUint8Array,\n extractable: boolean = false,\n): Promise {\n assertPRNGIsAvailable();\n\n if (bytes.byteLength !== 64) {\n throw new SolanaError(SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH, { byteLength: bytes.byteLength });\n }\n const [publicKey, privateKey] = await Promise.all([\n crypto.subtle.importKey('raw', bytes.slice(32), ED25519_ALGORITHM_IDENTIFIER, /* extractable */ true, [\n 'verify',\n ]),\n createPrivateKeyFromBytes(bytes.slice(0, 32), extractable),\n ]);\n\n // Verify the key pair\n const randomBytes = new Uint8Array(32);\n crypto.getRandomValues(randomBytes);\n const signedData = await signBytes(privateKey, randomBytes);\n const isValid = await verifySignature(publicKey, signedData, randomBytes);\n if (!isValid) {\n throw new SolanaError(SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY);\n }\n\n return { privateKey, publicKey } as CryptoKeyPair;\n}\n\n/**\n * Given a private key represented as a 32-byte `Uint8Array`, creates an Ed25519 public/private key\n * pair for use with other methods in this package that accept [`CryptoKey`](https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey)\n * objects.\n *\n * @param bytes 32 bytes that represent the private key\n * @param extractable Setting this to `true` makes it possible to extract the bytes of the private\n * key using the [`crypto.subtle.exportKey()`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)\n * API. Defaults to `false`.\n *\n * @example\n * ```ts\n * import { createKeyPairFromPrivateKeyBytes } from '@solana/keys';\n *\n * const { privateKey, publicKey } = await createKeyPairFromPrivateKeyBytes(new Uint8Array([...]));\n * ```\n *\n * This can be useful when you have a private key but not the corresponding public key or when you\n * need to derive key pairs from seeds. For instance, the following code snippet derives a key pair\n * from the hash of a message.\n *\n * ```ts\n * import { getUtf8Encoder } from '@solana/codecs-strings';\n * import { createKeyPairFromPrivateKeyBytes } from '@solana/keys';\n *\n * const message = getUtf8Encoder().encode('Hello, World!');\n * const seed = new Uint8Array(await crypto.subtle.digest('SHA-256', message));\n *\n * const derivedKeypair = await createKeyPairFromPrivateKeyBytes(seed);\n * ```\n */\nexport async function createKeyPairFromPrivateKeyBytes(\n bytes: ReadonlyUint8Array,\n extractable: boolean = false,\n): Promise {\n const privateKeyPromise = createPrivateKeyFromBytes(bytes, extractable);\n\n // Here we need the private key to be extractable in order to export\n // it as a public key. Therefore, if the `extractable` parameter\n // is `false`, we need to create two private keys such that:\n // - The extractable one is used to create the public key and\n // - The non-extractable one is the one we will return.\n const [publicKey, privateKey] = await Promise.all([\n // This nested promise makes things efficient by\n // creating the public key in parallel with the\n // second private key creation, if it is needed.\n (extractable ? privateKeyPromise : createPrivateKeyFromBytes(bytes, true /* extractable */)).then(\n async privateKey => await getPublicKeyFromPrivateKey(privateKey, true /* extractable */),\n ),\n privateKeyPromise,\n ]);\n\n return { privateKey, publicKey };\n}\n","import { fixEncoderSize, transformEncoder, VariableSizeEncoder } from '@solana/codecs-core';\nimport { getArrayEncoder, getBytesEncoder } from '@solana/codecs-data-structures';\nimport { getShortU16Encoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { SignaturesMap } from '../transaction';\n\nfunction getSignaturesToEncode(signaturesMap: SignaturesMap): SignatureBytes[] {\n const signatures = Object.values(signaturesMap);\n if (signatures.length === 0) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES);\n }\n\n return signatures.map(signature => {\n if (!signature) {\n return new Uint8Array(64).fill(0) as SignatureBytes;\n }\n return signature;\n });\n}\n\nexport function getSignaturesEncoder(): VariableSizeEncoder {\n return transformEncoder(\n getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getShortU16Encoder() }),\n getSignaturesToEncode,\n );\n}\n","import { getAddressDecoder } from '@solana/addresses';\nimport {\n combineCodec,\n fixDecoderSize,\n padRightDecoder,\n ReadonlyUint8Array,\n transformDecoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getTupleDecoder,\n} from '@solana/codecs-data-structures';\nimport { getShortU16Decoder, getU8Decoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getTransactionVersionDecoder } from '@solana/transaction-messages';\n\nimport { SignaturesMap, Transaction, TransactionMessageBytes } from '../transaction';\nimport { getSignaturesEncoder } from './signatures-encoder';\n\n/**\n * Returns an encoder that you can use to encode a {@link Transaction} to a byte array in a wire\n * format appropriate for sending to the Solana network for execution.\n */\nexport function getTransactionEncoder(): VariableSizeEncoder {\n return getStructEncoder([\n ['signatures', getSignaturesEncoder()],\n ['messageBytes', getBytesEncoder()],\n ]);\n}\n\n/**\n * Returns a decoder that you can use to convert a byte array in the Solana transaction wire format\n * to a {@link Transaction} object.\n *\n * @example\n * ```ts\n * import { getTransactionDecoder } from '@solana/transactions';\n *\n * const transactionDecoder = getTransactionDecoder();\n * const transaction = transactionDecoder.decode(wireTransactionBytes);\n * for (const [address, signature] in Object.entries(transaction.signatures)) {\n * console.log(`Signature by ${address}`, signature);\n * }\n * ```\n */\n\nexport function getTransactionDecoder(): VariableSizeDecoder {\n return transformDecoder(\n getStructDecoder([\n ['signatures', getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getShortU16Decoder() })],\n ['messageBytes', getBytesDecoder()],\n ]),\n decodePartiallyDecodedTransaction,\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a {@link Transaction}\n *\n * @see {@link getTransactionDecoder}\n * @see {@link getTransactionEncoder}\n */\nexport function getTransactionCodec(): VariableSizeCodec {\n return combineCodec(getTransactionEncoder(), getTransactionDecoder());\n}\n\ntype PartiallyDecodedTransaction = {\n messageBytes: ReadonlyUint8Array;\n signatures: ReadonlyUint8Array[];\n};\n\nfunction decodePartiallyDecodedTransaction(transaction: PartiallyDecodedTransaction): Transaction {\n const { messageBytes, signatures } = transaction;\n\n /*\n Relevant message structure is at the start:\n - transaction version (0 bytes for legacy transactions, 1 byte for versioned transactions)\n - `numRequiredSignatures` (1 byte, we verify this matches the length of signatures)\n - `numReadOnlySignedAccounts` (1 byte, not used here)\n - `numReadOnlyUnsignedAccounts` (1 byte, not used here)\n - static addresses, with signers first. This is an array of addresses, prefixed with a short-u16 length\n */\n\n const signerAddressesDecoder = getTupleDecoder([\n // read transaction version\n getTransactionVersionDecoder(),\n // read first byte of header, `numSignerAccounts`\n // padRight to skip the next 2 bytes, `numReadOnlySignedAccounts` and `numReadOnlyUnsignedAccounts` which we don't need\n padRightDecoder(getU8Decoder(), 2),\n // read static addresses\n getArrayDecoder(getAddressDecoder(), { size: getShortU16Decoder() }),\n ]);\n const [_txVersion, numRequiredSignatures, staticAddresses] = signerAddressesDecoder.decode(messageBytes);\n\n const signerAddresses = staticAddresses.slice(0, numRequiredSignatures);\n\n // signer addresses and signatures must be the same length\n // we encode an all-zero signature when the signature is missing\n if (signerAddresses.length !== signatures.length) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, {\n numRequiredSignatures,\n signaturesLength: signatures.length,\n signerAddresses,\n });\n }\n\n // combine the signer addresses + signatures into the signatures map\n const signaturesMap: SignaturesMap = {};\n signerAddresses.forEach((address, index) => {\n const signatureForAddress = signatures[index];\n if (signatureForAddress.every(b => b === 0)) {\n signaturesMap[address] = null;\n } else {\n signaturesMap[address] = signatureForAddress as SignatureBytes;\n }\n });\n\n return {\n messageBytes: messageBytes as TransactionMessageBytes,\n signatures: Object.freeze(signaturesMap),\n };\n}\n","import { type Address, isAddress } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME,\n SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME,\n SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE,\n SolanaError,\n} from '@solana/errors';\nimport { type Blockhash, isBlockhash, type Slot } from '@solana/rpc-types';\nimport type {\n CompiledTransactionMessage,\n CompiledTransactionMessageWithLifetime,\n Nonce,\n TransactionMessage,\n TransactionMessageWithBlockhashLifetime,\n TransactionMessageWithDurableNonceLifetime,\n} from '@solana/transaction-messages';\n\nimport type { Transaction } from './transaction';\n\n/**\n * A constraint which, when applied to a transaction, makes that transaction eligible to land on the\n * network. The transaction will continue to be eligible to land until the network considers the\n * `blockhash` to be expired.\n *\n * This can happen when the network proceeds past the `lastValidBlockHeight` for which the blockhash\n * is considered valid, or when the network switches to a fork where that blockhash is not present.\n */\nexport type TransactionBlockhashLifetime = {\n /**\n * A recent blockhash observed by the transaction proposer.\n *\n * The transaction will be considered eligible to land until the network determines this\n * blockhash to be too old, or has switched to a fork where it is not present.\n */\n blockhash: Blockhash;\n /**\n * This is the block height beyond which the network will consider the blockhash to be too old\n * to make a transaction eligible to land.\n */\n lastValidBlockHeight: Slot;\n};\n\n/**\n * A constraint which, when applied to a transaction, makes that transaction eligible to land on the\n * network.\n *\n * The transaction will continue to be eligible to land until the network considers the `nonce` to\n * have advanced. This can happen when the nonce account in which this nonce is found is destroyed,\n * or the nonce value within changes.\n */\nexport type TransactionDurableNonceLifetime = {\n /**\n * A value contained in the account with address `nonceAccountAddress` at the time the\n * transaction was prepared.\n *\n * The transaction will be considered eligible to land until the nonce account ceases to exist\n * or contain this value.\n */\n nonce: Nonce;\n /** The account that contains the `nonce` value */\n nonceAccountAddress: Address;\n};\n\n/**\n * A transaction whose ability to land on the network is determined by some evanescent criteria.\n *\n * This describes a window of time after which a transaction is constructed and before which it will\n * no longer be accepted by the network.\n *\n * No transaction can land on Solana without having a `lifetimeConstraint` set.\n */\nexport type TransactionWithLifetime = {\n readonly lifetimeConstraint: TransactionBlockhashLifetime | TransactionDurableNonceLifetime;\n};\n\n/**\n * A transaction whose lifetime is determined by the age of a blockhash observed on the network.\n *\n * The transaction will continue to be eligible to land until the network considers the `blockhash`\n * to be expired.\n */\nexport type TransactionWithBlockhashLifetime = {\n readonly lifetimeConstraint: TransactionBlockhashLifetime;\n};\n\n/**\n * A transaction whose lifetime is determined by a nonce.\n *\n * The transaction will continue to be eligible to land until the network considers the `nonce` to\n * have advanced. This can happen when the nonce account in which this nonce is found is destroyed,\n * or the nonce value within changes.\n */\nexport type TransactionWithDurableNonceLifetime = {\n readonly lifetimeConstraint: TransactionDurableNonceLifetime;\n};\n\n/**\n * Helper type that sets the lifetime constraint of a transaction to be the same as the\n * lifetime constraint of the provided transaction message.\n *\n * If the transaction message has no explicit lifetime constraint, neither will the transaction.\n */\nexport type SetTransactionLifetimeFromTransactionMessage<\n TTransaction extends Transaction,\n TTransactionMessage extends TransactionMessage,\n> = TTransactionMessage extends { lifetimeConstraint: unknown }\n ? TTransactionMessage['lifetimeConstraint'] extends TransactionMessageWithBlockhashLifetime['lifetimeConstraint']\n ? TransactionWithBlockhashLifetime & TTransaction\n : TTransactionMessage['lifetimeConstraint'] extends TransactionMessageWithDurableNonceLifetime['lifetimeConstraint']\n ? TransactionWithDurableNonceLifetime & TTransaction\n : TransactionWithLifetime & TTransaction\n : TTransaction;\n\nconst SYSTEM_PROGRAM_ADDRESS = '11111111111111111111111111111111' as Address;\n\nfunction compiledInstructionIsAdvanceNonceInstruction(\n instruction: CompiledTransactionMessage['instructions'][number],\n staticAddresses: Address[],\n): instruction is typeof instruction & { accountIndices: [number, number, number] } {\n return (\n staticAddresses[instruction.programAddressIndex] === SYSTEM_PROGRAM_ADDRESS &&\n // Test for `AdvanceNonceAccount` instruction data\n instruction.data != null &&\n isAdvanceNonceAccountInstructionData(instruction.data) &&\n // Test for exactly 3 accounts\n instruction.accountIndices?.length === 3\n );\n}\n\nfunction isAdvanceNonceAccountInstructionData(data: ReadonlyUint8Array): boolean {\n // AdvanceNonceAccount is the fifth instruction in the System Program (index 4)\n return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;\n}\n\n/**\n * Get the lifetime constraint for a transaction from a compiled transaction message that includes a lifetime token.\n * @param compiledTransactionMessage A compiled transaction message that includes a lifetime token\n * @returns A lifetime constraint for the transaction\n * Note that this is less precise than checking a decompiled instruction, as we can't inspect\n * the address or role of input accounts (which may be in lookup tables). However, this is\n * sufficient for all valid advance durable nonce instructions.\n * Note that the program address must not be in a lookup table, see [this answer on StackExchange](https://solana.stackexchange.com/a/16224/289)\n * @see {@link isAdvanceNonceAccountInstruction}\n * Note that this function is async to allow for future implementations that may fetch `lastValidBlockHeight` using an RPC\n */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function getTransactionLifetimeConstraintFromCompiledTransactionMessage(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n): Promise {\n const firstInstruction = compiledTransactionMessage.instructions[0];\n const { staticAccounts } = compiledTransactionMessage;\n\n // We need to check if the first instruction is an AdvanceNonceAccount instruction\n if (firstInstruction && compiledInstructionIsAdvanceNonceInstruction(firstInstruction, staticAccounts)) {\n const nonceAccountAddress = staticAccounts[firstInstruction.accountIndices[0]];\n if (!nonceAccountAddress) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__NONCE_ACCOUNT_CANNOT_BE_IN_LOOKUP_TABLE, {\n nonce: compiledTransactionMessage.lifetimeToken,\n });\n }\n return {\n nonce: compiledTransactionMessage.lifetimeToken as Nonce,\n nonceAccountAddress,\n };\n } else {\n return {\n blockhash: compiledTransactionMessage.lifetimeToken as Blockhash,\n // This is not known from the compiled message, so we set it to the maximum possible value\n lastValidBlockHeight: 0xffffffffffffffffn,\n };\n }\n}\n\n/**\n * A type guard that returns `true` if the transaction conforms to the\n * {@link TransactionWithBlockhashLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionWithBlockhashLifetime } from '@solana/transactions';\n *\n * if (isTransactionWithBlockhashLifetime(transaction)) {\n * // At this point, `transaction` has been refined to a `TransactionWithBlockhashLifetime`.\n * const { blockhash } = transaction.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * setBlockhashIsValid(blockhashIsValid);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a blockhash-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionWithBlockhashLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): transaction is Transaction & TransactionWithBlockhashLifetime {\n return (\n 'lifetimeConstraint' in transaction &&\n 'blockhash' in transaction.lifetimeConstraint &&\n typeof transaction.lifetimeConstraint.blockhash === 'string' &&\n typeof transaction.lifetimeConstraint.lastValidBlockHeight === 'bigint' &&\n isBlockhash(transaction.lifetimeConstraint.blockhash)\n );\n}\n\n/**\n * From time to time you might acquire a transaction, that you expect to have a\n * blockhash-based lifetime, from for example a wallet. Use this function to\n * assert that such a transaction actually has a blockhash-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionWithBlockhashLifetime } from '@solana/transactions';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `transaction` to `TransactionWithBlockhashLifetime`.\n * assertIsTransactionWithBlockhashLifetime(transaction);\n * // At this point, `transaction` is a `TransactionWithBlockhashLifetime` that can be used\n * // with the RPC.\n * const { blockhash } = transaction.lifetimeConstraint;\n * const { value: blockhashIsValid } = await rpc.isBlockhashValid(blockhash).send();\n * } catch (e) {\n * // `transaction` turned out not to have a blockhash-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionWithBlockhashLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): asserts transaction is Transaction & TransactionWithBlockhashLifetime {\n if (!isTransactionWithBlockhashLifetime(transaction)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME);\n }\n}\n\n/**\n * A type guard that returns `true` if the transaction conforms to the\n * {@link TransactionWithDurableNonceLifetime} type, and refines its type for use in your\n * program.\n *\n * @example\n * ```ts\n * import { isTransactionWithDurableNonceLifetime } from '@solana/transactions';\n * import { fetchNonce } from \"@solana-program/system\";\n *\n * if (isTransactionWithDurableNonceLifetime(transaction)) {\n * // At this point, `transaction` has been refined to a\n * // `TransactionWithDurableNonceLifetime`.\n * const { nonce, nonceAccountAddress } = transaction.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * setNonceIsValid(nonce === actualNonce);\n * } else {\n * setError(\n * `${getSignatureFromTransaction(transaction)} does not have a nonce-based lifetime`,\n * );\n * }\n * ```\n */\nexport function isTransactionWithDurableNonceLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): transaction is Transaction & TransactionWithDurableNonceLifetime {\n return (\n 'lifetimeConstraint' in transaction &&\n 'nonce' in transaction.lifetimeConstraint &&\n typeof transaction.lifetimeConstraint.nonce === 'string' &&\n typeof transaction.lifetimeConstraint.nonceAccountAddress === 'string' &&\n isAddress(transaction.lifetimeConstraint.nonceAccountAddress)\n );\n}\n\n/**\n * From time to time you might acquire a transaction, that you expect to have a\n * nonce-based lifetime, from for example a wallet. Use this function to assert\n * that such a transaction actually has a nonce-based lifetime.\n *\n * @example\n * ```ts\n * import { assertIsTransactionWithDurableNonceLifetime } from '@solana/transactions';\n *\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `transaction` to `TransactionWithDurableNonceLifetime`.\n * assertIsTransactionWithDurableNonceLifetime(transaction);\n * // At this point, `transaction` is a `TransactionWithDurableNonceLifetime` that can be used\n * // with the RPC.\n * const { nonce, nonceAccountAddress } = transaction.lifetimeConstraint;\n * const { data: { blockhash: actualNonce } } = await fetchNonce(nonceAccountAddress);\n * } catch (e) {\n * // `transaction` turned out not to have a nonce-based lifetime\n * }\n * ```\n */\nexport function assertIsTransactionWithDurableNonceLifetime(\n transaction: Transaction | (Transaction & TransactionWithLifetime),\n): asserts transaction is Transaction & TransactionWithDurableNonceLifetime {\n if (!isTransactionWithDurableNonceLifetime(transaction)) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME);\n }\n}\n","import {\n compileTransactionMessage,\n getCompiledTransactionMessageEncoder,\n isTransactionMessageWithBlockhashLifetime,\n isTransactionMessageWithDurableNonceLifetime,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\n\nimport type { TransactionWithLifetime } from './lifetime';\nimport type { SignaturesMap, TransactionFromTransactionMessage, TransactionMessageBytes } from './transaction';\n\n/**\n * Returns a {@link Transaction} object for a given {@link TransactionMessage}.\n *\n * This includes the compiled bytes of the transaction message, and a map of signatures. This map\n * will have a key for each address that is required to sign the transaction. The transaction will\n * not yet have signatures for any of these addresses.\n *\n * Whether a transaction message is ready to be compiled or not is enforced for you at the type\n * level. In order to be signable, a transaction message must:\n *\n * - have a version and a list of zero or more instructions (ie. conform to\n * {@link TransactionMessage})\n * - have a fee payer set (ie. conform to {@link TransactionMessageWithFeePayer})\n * - have a lifetime specified (ie. conform to {@link TransactionMessageWithBlockhashLifetime} or\n * {@link TransactionMessageWithDurableNonceLifetime})\n */\nexport function compileTransaction(\n transactionMessage: TTransactionMessage,\n): Readonly> {\n type ReturnType = Readonly>;\n\n const compiledMessage = compileTransactionMessage(transactionMessage);\n const messageBytes = getCompiledTransactionMessageEncoder().encode(compiledMessage) as TransactionMessageBytes;\n\n const transactionSigners = compiledMessage.staticAccounts.slice(0, compiledMessage.header.numSignerAccounts);\n const signatures: SignaturesMap = {};\n for (const signerAddress of transactionSigners) {\n signatures[signerAddress] = null;\n }\n\n let lifetimeConstraint: TransactionWithLifetime['lifetimeConstraint'] | undefined;\n if (isTransactionMessageWithBlockhashLifetime(transactionMessage)) {\n lifetimeConstraint = {\n blockhash: transactionMessage.lifetimeConstraint.blockhash,\n lastValidBlockHeight: transactionMessage.lifetimeConstraint.lastValidBlockHeight,\n };\n } else if (isTransactionMessageWithDurableNonceLifetime(transactionMessage)) {\n lifetimeConstraint = {\n nonce: transactionMessage.lifetimeConstraint.nonce,\n nonceAccountAddress: transactionMessage.instructions[0].accounts[0].address,\n };\n }\n\n return Object.freeze({\n ...(lifetimeConstraint ? { lifetimeConstraint } : undefined),\n messageBytes: messageBytes,\n signatures: Object.freeze(signatures),\n }) as ReturnType;\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { bytesEqual, Decoder } from '@solana/codecs-core';\nimport { getBase58Decoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION,\n SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING,\n SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { Signature, SignatureBytes, signBytes } from '@solana/keys';\nimport { NominalType } from '@solana/nominal-types';\n\nimport { Transaction } from './transaction';\n\n/**\n * Represents a transaction that is signed by all of its required signers. Being fully signed is a\n * prerequisite of functions designed to land transactions on the network.\n */\nexport type FullySignedTransaction = NominalType<'transactionSignedness', 'fullySigned'>;\n\nlet base58Decoder: Decoder | undefined;\n\n/**\n * Given a transaction signed by its fee payer, this method will return the {@link Signature} that\n * uniquely identifies it. This string can be used to look up transactions at a later date, for\n * example on a Solana block explorer.\n *\n * @example\n * ```ts\n * import { getSignatureFromTransaction } from '@solana/transactions';\n *\n * const signature = getSignatureFromTransaction(tx);\n * console.debug(`Inspect this transaction at https://explorer.solana.com/tx/${signature}`);\n * ```\n */\nexport function getSignatureFromTransaction(transaction: Transaction): Signature {\n if (!base58Decoder) base58Decoder = getBase58Decoder();\n\n // We have ordered signatures from the compiled message accounts\n // first signature is the fee payer\n const signatureBytes = Object.values(transaction.signatures)[0];\n if (!signatureBytes) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING);\n }\n const transactionSignature = base58Decoder.decode(signatureBytes);\n return transactionSignature as Signature;\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign a transaction, this method will return a new signed transaction of type\n * {@link Transaction}.\n *\n * Though the resulting transaction might have every signature it needs to land on the network, this\n * function will not assert that it does. A partially signed transaction cannot be landed on the\n * network, but can be serialized and deserialized.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { partiallySignTransaction } from '@solana/transactions';\n *\n * const partiallySignedTransaction = await partiallySignTransaction([myPrivateKey], tx);\n * ```\n *\n * @see {@link signTransaction} if you want to assert that the transaction has all of its required\n * signatures after signing.\n */\nexport async function partiallySignTransaction(\n keyPairs: CryptoKeyPair[],\n transaction: TTransaction,\n): Promise {\n let newSignatures: Record | undefined;\n let unexpectedSigners: Set
| undefined;\n\n await Promise.all(\n keyPairs.map(async keyPair => {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n const existingSignature = transaction.signatures[address];\n\n // Check if the address is expected to sign the transaction\n if (existingSignature === undefined) {\n // address is not an expected signer for this transaction\n unexpectedSigners ||= new Set();\n unexpectedSigners.add(address);\n return;\n }\n\n // Return if there are any unexpected signers already since we won't be using signatures\n if (unexpectedSigners) {\n return;\n }\n\n const newSignature = await signBytes(keyPair.privateKey, transaction.messageBytes);\n\n if (existingSignature !== null && bytesEqual(newSignature, existingSignature)) {\n // already have the same signature set\n return;\n }\n\n newSignatures ||= {};\n newSignatures[address] = newSignature;\n }),\n );\n\n if (unexpectedSigners && unexpectedSigners.size > 0) {\n const expectedSigners = Object.keys(transaction.signatures);\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION, {\n expectedAddresses: expectedSigners,\n unexpectedAddresses: [...unexpectedSigners],\n });\n }\n\n if (!newSignatures) {\n return transaction;\n }\n\n return Object.freeze({\n ...transaction,\n signatures: Object.freeze({\n ...transaction.signatures,\n ...newSignatures,\n }),\n });\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign a transaction, this method will return a new signed transaction of type\n * {@link FullySignedTransaction}.\n *\n * This function will throw unless the resulting transaction is fully signed.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { signTransaction } from '@solana/transactions';\n *\n * const signedTransaction = await signTransaction([myPrivateKey], tx);\n * ```\n *\n * @see {@link partiallySignTransaction} if you want to sign the transaction without asserting that\n * the resulting transaction is fully signed.\n */\nexport async function signTransaction(\n keyPairs: CryptoKeyPair[],\n transaction: TTransaction,\n): Promise {\n const out = await partiallySignTransaction(keyPairs, transaction);\n assertIsFullySignedTransaction(out);\n Object.freeze(out);\n return out;\n}\n\n/**\n * Checks whether a given {@link Transaction} is fully signed.\n *\n * @example\n * ```ts\n * import { isFullySignedTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * if (isFullySignedTransaction(transaction)) {\n * // At this point we know that the transaction is signed and can be sent to the network.\n * }\n * ```\n */\nexport function isFullySignedTransaction(\n transaction: TTransaction,\n): transaction is FullySignedTransaction & TTransaction {\n return Object.entries(transaction.signatures).every(([_, signatureBytes]) => !!signatureBytes);\n}\n\n/**\n * From time to time you might acquire a {@link Transaction}, that you expect to be fully signed,\n * from an untrusted network API or user input. Use this function to assert that such a transaction\n * is fully signed.\n *\n * @example\n * ```ts\n * import { assertIsFullySignedTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * try {\n * // If this type assertion function doesn't throw, then Typescript will upcast `transaction`\n * // to `FullySignedTransaction`.\n * assertIsFullySignedTransaction(transaction);\n * // At this point we know that the transaction is signed and can be sent to the network.\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch(e) {\n * if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING)) {\n * setError(`Missing signatures for ${e.context.addresses.join(', ')}`);\n * }\n * throw;\n * }\n * ```\n */\nexport function assertIsFullySignedTransaction(\n transaction: TTransaction,\n): asserts transaction is FullySignedTransaction & TTransaction {\n const missingSigs: Address[] = [];\n Object.entries(transaction.signatures).forEach(([address, signatureBytes]) => {\n if (!signatureBytes) {\n missingSigs.push(address as Address);\n }\n });\n\n if (missingSigs.length > 0) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING, {\n addresses: missingSigs,\n });\n }\n}\n","import { getBase64Decoder } from '@solana/codecs-strings';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\nimport { getTransactionEncoder } from './codecs';\nimport { Transaction } from './transaction';\n\n/** Represents the wire format of a transaction as a base64-encoded string. */\nexport type Base64EncodedWireTransaction = Brand, 'Base64EncodedWireTransaction'>;\n\n/**\n * Given a signed transaction, this method returns the transaction as a string that conforms to the\n * {@link Base64EncodedWireTransaction} type.\n *\n * @example\n * ```ts\n * import { getBase64EncodedWireTransaction, signTransaction } from '@solana/transactions';\n *\n * const serializedTransaction = getBase64EncodedWireTransaction(signedTransaction);\n * const signature = await rpc.sendTransaction(serializedTransaction, { encoding: 'base64' }).send();\n * ```\n */\nexport function getBase64EncodedWireTransaction(transaction: Transaction): Base64EncodedWireTransaction {\n const wireTransactionBytes = getTransactionEncoder().encode(transaction);\n return getBase64Decoder().decode(wireTransactionBytes) as Base64EncodedWireTransaction;\n}\n","import { SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SolanaError } from '@solana/errors';\nimport type { NominalType } from '@solana/nominal-types';\nimport type { BaseTransactionMessage, TransactionMessageWithinSizeLimit } from '@solana/transaction-messages';\n\nimport { getTransactionEncoder } from './codecs';\nimport { Transaction } from './transaction';\n\n/**\n * The maximum size of a transaction packet in bytes.\n */\nexport const TRANSACTION_PACKET_SIZE = 1280;\n\n/**\n * The size of the transaction packet header in bytes.\n * This includes the IPv6 header and the fragment header.\n */\nexport const TRANSACTION_PACKET_HEADER =\n 40 /* 40 bytes is the size of the IPv6 header. */ + 8; /* 8 bytes is the size of the fragment header. */\n\n/**\n * The maximum size of a transaction in bytes.\n *\n * Note that this excludes the transaction packet header.\n * In other words, this is how much content we can fit in a transaction packet.\n */\nexport const TRANSACTION_SIZE_LIMIT = TRANSACTION_PACKET_SIZE - TRANSACTION_PACKET_HEADER;\n\n/**\n * Gets the size of a given transaction in bytes.\n *\n * @example\n * ```ts\n * const transactionSize = getTransactionSize(transaction);\n * ```\n */\nexport function getTransactionSize(transaction: Transaction): number {\n return getTransactionEncoder().getSizeFromValue(transaction);\n}\n\n/**\n * A type guard that checks if a transaction is within the size limit.\n */\nexport type TransactionWithinSizeLimit = NominalType<'transactionSize', 'withinLimit'>;\n\n/**\n * Helper type that adds the `TransactionWithinSizeLimit` flag to\n * a transaction if and only if the provided transaction message\n * is also within the size limit.\n */\nexport type SetTransactionWithinSizeLimitFromTransactionMessage<\n TTransaction extends Transaction,\n TTransactionMessage extends BaseTransactionMessage,\n> = TTransactionMessage extends TransactionMessageWithinSizeLimit\n ? TransactionWithinSizeLimit & TTransaction\n : TTransaction;\n\n/**\n * Checks if a transaction is within the size limit.\n *\n * @typeParam TTransaction - The type of the given transaction.\n *\n * @example\n * ```ts\n * if (isTransactionWithinSizeLimit(transaction)) {\n * transaction satisfies TransactionWithinSizeLimit;\n * }\n * ```\n */\nexport function isTransactionWithinSizeLimit(\n transaction: TTransaction,\n): transaction is TransactionWithinSizeLimit & TTransaction {\n return getTransactionSize(transaction) <= TRANSACTION_SIZE_LIMIT;\n}\n\n/**\n * Asserts that a given transaction is within the size limit.\n *\n * Throws a {@link SolanaError} of code {@link SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT}\n * if the transaction exceeds the size limit.\n *\n * @typeParam TTransaction - The type of the given transaction.\n *\n * @example\n * ```ts\n * assertIsTransactionWithinSizeLimit(transaction);\n * transaction satisfies TransactionWithinSizeLimit;\n * ```\n */\nexport function assertIsTransactionWithinSizeLimit(\n transaction: TTransaction,\n): asserts transaction is TransactionWithinSizeLimit & TTransaction {\n const transactionSize = getTransactionSize(transaction);\n if (transactionSize > TRANSACTION_SIZE_LIMIT) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, {\n transactionSize,\n transactionSizeLimit: TRANSACTION_SIZE_LIMIT,\n });\n }\n}\n","import { assertIsFullySignedTransaction, FullySignedTransaction, isFullySignedTransaction } from './signatures';\nimport { Transaction } from './transaction';\nimport {\n assertIsTransactionWithinSizeLimit,\n isTransactionWithinSizeLimit,\n TransactionWithinSizeLimit,\n} from './transaction-size';\n\n/**\n * Helper type that includes all transaction types required\n * for the transaction to be sent to the network.\n *\n * @see {@link isSendableTransaction}\n * @see {@link assertIsSendableTransaction}\n */\nexport type SendableTransaction = FullySignedTransaction & TransactionWithinSizeLimit;\n\n/**\n * Checks if a transaction has all the required\n * conditions to be sent to the network.\n *\n * @example\n * ```ts\n * import { isSendableTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * if (isSendableTransaction(transaction)) {\n * // At this point we know that the transaction can be sent to the network.\n * }\n * ```\n *\n * @see {@link assertIsSendableTransaction}\n */\nexport function isSendableTransaction(\n transaction: TTransaction,\n): transaction is SendableTransaction & TTransaction {\n return isFullySignedTransaction(transaction) && isTransactionWithinSizeLimit(transaction);\n}\n\n/**\n * Asserts that a given transaction has all the\n * required conditions to be sent to the network.\n *\n * From time to time you might acquire a {@link Transaction}\n * from an untrusted network API or user input and you are not sure\n * that it has all the required conditions to be sent to the network\n * — such as being fully signed and within the size limit.\n * This function can be used to assert that such a transaction\n * is in fact sendable.\n *\n * @example\n * ```ts\n * import { assertIsSendableTransaction } from '@solana/transactions';\n *\n * const transaction = getTransactionDecoder().decode(transactionBytes);\n * try {\n * // If this type assertion function doesn't throw, then Typescript will upcast `transaction`\n * // to `SendableTransaction`.\n * assertIsSendableTransaction(transaction);\n * // At this point we know that the transaction can be sent to the network.\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch(e) {\n * if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING)) {\n * setError(`Missing signatures for ${e.context.addresses.join(', ')}`);\n * } else if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT)) {\n * setError(`Transaction exceeds size limit of ${e.context.transactionSizeLimit} bytes`);\n * }\n * throw;\n * }\n * ```\n */\nexport function assertIsSendableTransaction(\n transaction: TTransaction,\n): asserts transaction is SendableTransaction & TTransaction {\n assertIsFullySignedTransaction(transaction);\n assertIsTransactionWithinSizeLimit(transaction);\n}\n","import { SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, SolanaError } from '@solana/errors';\nimport type {\n BaseTransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionMessageWithinSizeLimit,\n} from '@solana/transaction-messages';\n\nimport { compileTransaction } from './compile-transaction';\nimport { getTransactionSize, TRANSACTION_SIZE_LIMIT } from './transaction-size';\n\n/**\n * Gets the compiled transaction size of a given transaction message in bytes.\n *\n * @example\n * ```ts\n * const transactionSize = getTransactionMessageSize(transactionMessage);\n * ```\n */\nexport function getTransactionMessageSize(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer,\n): number {\n return getTransactionSize(compileTransaction(transactionMessage));\n}\n\n/**\n * Checks if a transaction message is within the size limit\n * when compiled into a transaction.\n *\n * @typeParam TTransactionMessage - The type of the given transaction message.\n *\n * @example\n * ```ts\n * if (isTransactionMessageWithinSizeLimit(transactionMessage)) {\n * transactionMessage satisfies TransactionMessageWithinSizeLimit;\n * }\n * ```\n */\nexport function isTransactionMessageWithinSizeLimit<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n): transactionMessage is TransactionMessageWithinSizeLimit & TTransactionMessage {\n return getTransactionMessageSize(transactionMessage) <= TRANSACTION_SIZE_LIMIT;\n}\n\n/**\n * Asserts that a given transaction message is within the size limit\n * when compiled into a transaction.\n *\n * Throws a {@link SolanaError} of code {@link SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT}\n * if the transaction message exceeds the size limit.\n *\n * @typeParam TTransactionMessage - The type of the given transaction message.\n *\n * @example\n * ```ts\n * assertIsTransactionMessageWithinSizeLimit(transactionMessage);\n * transactionMessage satisfies TransactionMessageWithinSizeLimit;\n * ```\n */\nexport function assertIsTransactionMessageWithinSizeLimit<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n): asserts transactionMessage is TransactionMessageWithinSizeLimit & TTransactionMessage {\n const transactionSize = getTransactionMessageSize(transactionMessage);\n if (transactionSize > TRANSACTION_SIZE_LIMIT) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT, {\n transactionSize,\n transactionSizeLimit: TRANSACTION_SIZE_LIMIT,\n });\n }\n}\n","/**\n * Forked from https://github.com/digitalloggers/race-as-promised/tree/master\n *\n * Authored by Brian Kim:\n * https://github.com/nodejs/node/issues/17469#issuecomment-685216777\n *\n * Adapted to module structure.\n *\n * This is free and unencumbered software released into the public domain.\n *\n * Anyone is free to copy, modify, publish, use, compile, sell, or\n * distribute this software, either in source code form or as a compiled\n * binary, for any purpose, commercial or non-commercial, and by any\n * means.\n *\n * In jurisdictions that recognize copyright laws, the author or authors\n * of this software dedicate any and all copyright interest in the\n * software to the public domain. We make this dedication for the benefit\n * of the public at large and to the detriment of our heirs and\n * successors. We intend this dedication to be an overt act of\n * relinquishment in perpetuity of all present and future rights to this\n * software under copyright law.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * For more information, please refer to \n */\n\ntype Deferred = Readonly<{\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n}>;\n\nfunction isObject(value: unknown): value is object {\n return value !== null && (typeof value === 'object' || typeof value === 'function');\n}\n\nfunction addRaceContender(contender: object) {\n const deferreds = new Set();\n const record = { deferreds, settled: false };\n\n // This call to `then` happens once for the lifetime of the value.\n Promise.resolve(contender).then(\n value => {\n for (const { resolve } of deferreds) {\n resolve(value);\n }\n\n deferreds.clear();\n record.settled = true;\n },\n err => {\n for (const { reject } of deferreds) {\n reject(err);\n }\n\n deferreds.clear();\n record.settled = true;\n },\n );\n return record;\n}\n\n// Keys are the values passed to race, values are a record of data containing a\n// set of deferreds and whether the value has settled.\nconst wm = new WeakMap; settled: boolean }>();\n/**\n * An implementation of [`Promise.race`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race)\n * that causes all of the losing promises to settle. This allows them to be released and garbage\n * collected, preventing memory leaks.\n *\n * Read more here: https://github.com/nodejs/node/issues/17469\n */\nexport async function safeRace(contenders: T): Promise> {\n let deferred: Deferred;\n const result = new Promise((resolve, reject) => {\n deferred = { reject, resolve };\n for (const contender of contenders) {\n if (!isObject(contender)) {\n // If the contender is a primitive, attempting to use it as a key in the\n // weakmap would throw an error. Luckily, it is safe to call\n // `Promise.resolve(contender).then` on a primitive value multiple times\n // because the promise fulfills immediately.\n Promise.resolve(contender).then(resolve, reject);\n continue;\n }\n\n let record = wm.get(contender);\n if (record === undefined) {\n record = addRaceContender(contender);\n record.deferreds.add(deferred);\n wm.set(contender, record);\n } else if (record.settled) {\n // If the value has settled, it is safe to call\n // `Promise.resolve(contender).then` on it.\n Promise.resolve(contender).then(resolve, reject);\n } else {\n record.deferreds.add(deferred);\n }\n }\n });\n\n // The finally callback executes when any value settles, preventing any of\n // the unresolved values from retaining a reference to the resolved value.\n return await (result.finally(() => {\n for (const contender of contenders) {\n if (isObject(contender)) {\n const record = wm.get(contender)!;\n record.deferreds.delete(deferred);\n }\n }\n }) as Promise>);\n}\n","import { safeRace } from './race';\n\n/**\n * Returns a new promise that will reject if the abort signal fires before the original promise\n * settles. Resolves or rejects with the value of the original promise otherwise.\n *\n * @example\n * ```ts\n * const result = await getAbortablePromise(\n * // Resolves or rejects when `fetch` settles.\n * fetch('https://example.com/json').then(r => r.json()),\n * // ...unless it takes longer than 5 seconds, after which the `AbortSignal` is triggered.\n * AbortSignal.timeout(5000),\n * );\n * ```\n */\nexport function getAbortablePromise(promise: Promise, abortSignal?: AbortSignal): Promise {\n if (!abortSignal) {\n return promise;\n } else {\n return safeRace([\n // This promise only ever rejects if the signal is aborted. Otherwise it idles forever.\n // It's important that this come before the input promise; in the event of an abort, we\n // want to throw even if the input promise's result is ready\n new Promise((_, reject) => {\n if (abortSignal.aborted) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(abortSignal.reason);\n } else {\n abortSignal.addEventListener('abort', function () {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(this.reason);\n });\n }\n }),\n promise,\n ]);\n }\n}\n","import {\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN,\n SolanaError,\n} from '@solana/errors';\nimport { Instruction } from '@solana/instructions';\nimport {\n appendTransactionMessageInstruction,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\nimport { getTransactionMessageSize, TRANSACTION_SIZE_LIMIT } from '@solana/transactions';\n\n/**\n * A set of instructions with constraints on how they can be executed.\n *\n * This is structured as a recursive tree of plans in order to allow for\n * parallel execution, sequential execution and combinations of both.\n *\n * Namely the following plans are supported:\n * - {@link SingleInstructionPlan} - A plan that contains a single instruction.\n * This is a simple instruction wrapper and the simplest leaf in this tree.\n * - {@link ParallelInstructionPlan} - A plan that contains other plans that\n * can be executed in parallel.\n * - {@link SequentialInstructionPlan} - A plan that contains other plans that\n * must be executed sequentially. It also defines whether the plan is divisible\n * meaning that instructions inside it can be split into separate transactions.\n * - {@link MessagePackerInstructionPlan} - A plan that can dynamically pack\n * instructions into transaction messages.\n *\n * Helpers are provided for each of these plans to make it easier to create them.\n *\n * @example\n * ```ts\n * const myInstructionPlan: InstructionPlan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * instructionC,\n * instructionD,\n * ]);\n * ```\n *\n * @see {@link SingleInstructionPlan}\n * @see {@link ParallelInstructionPlan}\n * @see {@link SequentialInstructionPlan}\n * @see {@link MessagePackerInstructionPlan}\n */\nexport type InstructionPlan =\n | MessagePackerInstructionPlan\n | ParallelInstructionPlan\n | SequentialInstructionPlan\n | SingleInstructionPlan;\n\n/**\n * A plan wrapping other plans that must be executed sequentially.\n *\n * It also defines whether nested plans are divisible — meaning that\n * the instructions inside them can be split into separate transactions.\n * When `divisible` is `false`, the instructions inside the plan should\n * all be executed atomically — either in a single transaction or in a\n * transaction bundle.\n *\n * You may use the {@link sequentialInstructionPlan} and {@link nonDivisibleSequentialInstructionPlan}\n * helpers to create objects of this type.\n *\n * @example Simple sequential plan with two instructions.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB]);\n * plan satisfies SequentialInstructionPlan;\n * ```\n *\n * @example Non-divisible sequential plan with two instructions.\n * ```ts\n * const plan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n * plan satisfies SequentialInstructionPlan & { divisible: false };\n * ```\n *\n * @example Sequential plan with nested parallel plans.\n * Here, instructions A and B can be executed in parallel, but they must both be finalized\n * before instructions C and D can be sent — which can also be executed in parallel.\n * ```ts\n * const plan = sequentialInstructionPlan([\n * parallelInstructionPlan([instructionA, instructionB]),\n * parallelInstructionPlan([instructionC, instructionD]),\n * ]);\n * plan satisfies SequentialInstructionPlan & { divisible: false };\n * ```\n *\n * @see {@link sequentialInstructionPlan}\n * @see {@link nonDivisibleSequentialInstructionPlan}\n */\nexport type SequentialInstructionPlan = Readonly<{\n divisible: boolean;\n kind: 'sequential';\n plans: InstructionPlan[];\n}>;\n\n/**\n * A plan wrapping other plans that can be executed in parallel.\n *\n * This means direct children of this plan can be executed in separate\n * parallel transactions without consequence.\n * However, the children themselves can define additional constraints\n * for that specific branch of the tree — such as the {@link SequentialInstructionPlan}.\n *\n * You may use the {@link parallelInstructionPlan} helper to create objects of this type.\n *\n * @example Simple parallel plan with two instructions.\n * ```ts\n * const plan = parallelInstructionPlan([instructionA, instructionB]);\n * plan satisfies ParallelInstructionPlan;\n * ```\n *\n * @example Parallel plan with nested sequential plans.\n * Here, instructions A and B must be executed sequentially and so must instructions C and D,\n * but both pairs can be executed in parallel.\n * ```ts\n * const plan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * sequentialInstructionPlan([instructionC, instructionD]),\n * ]);\n * plan satisfies ParallelInstructionPlan;\n * ```\n *\n * @see {@link parallelInstructionPlan}\n */\nexport type ParallelInstructionPlan = Readonly<{\n kind: 'parallel';\n plans: InstructionPlan[];\n}>;\n\n/**\n * A plan that contains a single instruction.\n *\n * This is a simple instruction wrapper that transforms an instruction into a plan.\n *\n * You may use the {@link singleInstructionPlan} helper to create objects of this type.\n *\n * @example\n * ```ts\n * const plan = singleInstructionPlan(instructionA);\n * plan satisfies SingleInstructionPlan;\n * ```\n *\n * @see {@link singleInstructionPlan}\n */\nexport type SingleInstructionPlan = Readonly<{\n instruction: TInstruction;\n kind: 'single';\n}>;\n\n/**\n * A plan that can dynamically pack instructions into transaction messages.\n *\n * This plan provides a {@link MessagePacker} via the `getMessagePacker`\n * method, which enables instructions to be dynamically packed into the\n * provided transaction message until there are no more instructions to pack.\n * The returned {@link MessagePacker} offers a `packMessageToCapacity(message)`\n * method that packs the provided message — when possible — and a `done()` method\n * that checks whether there are more instructions to pack.\n *\n * Several helper functions are provided to create objects of this type such as\n * {@link getLinearMessagePackerInstructionPlan} or {@link getMessagePackerInstructionPlanFromInstructions}.\n *\n * @example An message packer plan for a write instruction that uses as many bytes as possible.\n * ```ts\n * const plan = getLinearMessagePackerInstructionPlan({\n * totalLength: dataToWrite.length,\n * getInstruction: (offset, length) =>\n * getWriteInstruction({\n * offset,\n * data: dataToWrite.slice(offset, offset + length),\n * }),\n * });\n * plan satisfies MessagePackerInstructionPlan;\n * ```\n *\n * @example A message packer plan for multiple realloc instructions.\n * ```ts\n * const plan = getReallocMessagePackerInstructionPlan({\n * totalSize: additionalDataSize,\n * getInstruction: (size) => getExtendInstruction({ length: size }),\n * });\n * plan satisfies MessagePackerInstructionPlan;\n * ```\n *\n * @example Using a message packer plan.\n * ```ts\n * let plan: MessagePackerInstructionPlan;\n * const messagePacker = plan.getMessagePacker();\n *\n * while (!messagePacker.done()) {\n * try {\n * transactionMessage = messagePacker.packMessageToCapacity(transactionMessage);\n * } catch (error) {\n * // The current transaction message cannot be used to pack this plan.\n * // We should create a new one and try again.\n * }\n * }\n * ```\n *\n * @see {@link getLinearMessagePackerInstructionPlan}\n * @see {@link getMessagePackerInstructionPlanFromInstructions}\n * @see {@link getReallocMessagePackerInstructionPlan}\n */\nexport type MessagePackerInstructionPlan = Readonly<{\n getMessagePacker: () => MessagePacker;\n kind: 'messagePacker';\n}>;\n\n/**\n * The message packer returned by the {@link MessagePackerInstructionPlan}.\n *\n * It offers a `packMessageToCapacity(transactionMessage)` method that packs as many instructions\n * as possible into the provided transaction message, while still being able to fit into the\n * transaction size limit. It returns the updated transaction message with the packed instructions\n * or throws an error if the current transaction message cannot accommodate this plan.\n *\n * The `done()` method checks whether there are more instructions to pack into\n * transaction messages.\n *\n * @example\n * ```ts\n * let plan: MessagePackerInstructionPlan;\n * const messagePacker = plan.getMessagePacker();\n *\n * while (!messagePacker.done()) {\n * try {\n * transactionMessage = messagePacker.packMessageToCapacity(transactionMessage);\n * } catch (error) {\n * // The current transaction message cannot be used to pack this plan.\n * // We should create a new one and try again.\n * }\n * }\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n */\nexport type MessagePacker = Readonly<{\n /** Checks whether the message packer has more instructions to pack into transaction messages. */\n done: () => boolean;\n /**\n * Packs the provided transaction message with instructions or throws if not possible.\n *\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN}\n * if the provided transaction message cannot be used to fill the next instructions.\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE}\n * if the message packer is already done and no more instructions can be packed.\n */\n packMessageToCapacity: (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n ) => TransactionMessage & TransactionMessageWithFeePayer;\n}>;\n\n/**\n * Creates a {@link ParallelInstructionPlan} from an array of nested plans.\n *\n * It can accept {@link Instruction} objects directly, which will be wrapped\n * in {@link SingleInstructionPlan | SingleInstructionPlans} automatically.\n *\n * @example Using explicit {@link SingleInstructionPlan | SingleInstructionPlans}.\n * ```ts\n * const plan = parallelInstructionPlan([\n * singleInstructionPlan(instructionA),\n * singleInstructionPlan(instructionB),\n * ]);\n * ```\n *\n * @example Using {@link Instruction | Instructions} directly.\n * ```ts\n * const plan = parallelInstructionPlan([instructionA, instructionB]);\n * ```\n *\n * @see {@link ParallelInstructionPlan}\n */\nexport function parallelInstructionPlan(plans: (Instruction | InstructionPlan)[]): ParallelInstructionPlan {\n return Object.freeze({\n kind: 'parallel',\n plans: parseSingleInstructionPlans(plans),\n });\n}\n\n/**\n * Creates a divisible {@link SequentialInstructionPlan} from an array of nested plans.\n *\n * It can accept {@link Instruction} objects directly, which will be wrapped\n * in {@link SingleInstructionPlan | SingleInstructionPlans} automatically.\n *\n * @example Using explicit {@link SingleInstructionPlan | SingleInstructionPlans}.\n * ```ts\n * const plan = sequentialInstructionPlan([\n * singleInstructionPlan(instructionA),\n * singleInstructionPlan(instructionB),\n * ]);\n * ```\n *\n * @example Using {@link Instruction | Instructions} directly.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB]);\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n */\nexport function sequentialInstructionPlan(\n plans: (Instruction | InstructionPlan)[],\n): SequentialInstructionPlan & { divisible: true } {\n return Object.freeze({\n divisible: true,\n kind: 'sequential',\n plans: parseSingleInstructionPlans(plans),\n });\n}\n\n/**\n * Creates a non-divisible {@link SequentialInstructionPlan} from an array of nested plans.\n *\n * It can accept {@link Instruction} objects directly, which will be wrapped\n * in {@link SingleInstructionPlan | SingleInstructionPlans} automatically.\n *\n * @example Using explicit {@link SingleInstructionPlan | SingleInstructionPlans}.\n * ```ts\n * const plan = nonDivisibleSequentialInstructionPlan([\n * singleInstructionPlan(instructionA),\n * singleInstructionPlan(instructionB),\n * ]);\n * ```\n *\n * @example Using {@link Instruction | Instructions} directly.\n * ```ts\n * const plan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n */\nexport function nonDivisibleSequentialInstructionPlan(\n plans: (Instruction | InstructionPlan)[],\n): SequentialInstructionPlan & { divisible: false } {\n return Object.freeze({\n divisible: false,\n kind: 'sequential',\n plans: parseSingleInstructionPlans(plans),\n });\n}\n\n/**\n * Creates a {@link SingleInstructionPlan} from an {@link Instruction} object.\n *\n * @example\n * ```ts\n * const plan = singleInstructionPlan(instructionA);\n * ```\n *\n * @see {@link SingleInstructionPlan}\n */\nexport function singleInstructionPlan(instruction: Instruction): SingleInstructionPlan {\n return Object.freeze({ instruction, kind: 'single' });\n}\n\nfunction parseSingleInstructionPlans(plans: (Instruction | InstructionPlan)[]): InstructionPlan[] {\n return plans.map(plan => ('kind' in plan ? plan : singleInstructionPlan(plan)));\n}\n\n/**\n * Checks if the given instruction plan is a {@link SingleInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a single instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = singleInstructionPlan(myInstruction);\n *\n * if (isSingleInstructionPlan(plan)) {\n * console.log(plan.instruction); // TypeScript knows this is a SingleInstructionPlan.\n * }\n * ```\n *\n * @see {@link SingleInstructionPlan}\n * @see {@link assertIsSingleInstructionPlan}\n */\nexport function isSingleInstructionPlan(plan: InstructionPlan): plan is SingleInstructionPlan {\n return plan.kind === 'single';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link SingleInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a single instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = singleInstructionPlan(myInstruction);\n *\n * assertIsSingleInstructionPlan(plan);\n * console.log(plan.instruction); // TypeScript knows this is a SingleInstructionPlan.\n * ```\n *\n * @see {@link SingleInstructionPlan}\n * @see {@link isSingleInstructionPlan}\n */\nexport function assertIsSingleInstructionPlan(plan: InstructionPlan): asserts plan is SingleInstructionPlan {\n if (!isSingleInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'single',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a {@link MessagePackerInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a message packer instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = getLinearMessagePackerInstructionPlan({ /* ... *\\/ });\n *\n * if (isMessagePackerInstructionPlan(plan)) {\n * const packer = plan.getMessagePacker(); // TypeScript knows this is a MessagePackerInstructionPlan.\n * }\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n * @see {@link assertIsMessagePackerInstructionPlan}\n */\nexport function isMessagePackerInstructionPlan(plan: InstructionPlan): plan is MessagePackerInstructionPlan {\n return plan.kind === 'messagePacker';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link MessagePackerInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a message packer instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = getLinearMessagePackerInstructionPlan({ /* ... *\\/ });\n *\n * assertIsMessagePackerInstructionPlan(plan);\n * const packer = plan.getMessagePacker(); // TypeScript knows this is a MessagePackerInstructionPlan.\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n * @see {@link isMessagePackerInstructionPlan}\n */\nexport function assertIsMessagePackerInstructionPlan(\n plan: InstructionPlan,\n): asserts plan is MessagePackerInstructionPlan {\n if (!isMessagePackerInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'messagePacker',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a {@link SequentialInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a sequential instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = sequentialInstructionPlan([instructionA, instructionB]);\n *\n * if (isSequentialInstructionPlan(plan)) {\n * console.log(plan.divisible); // TypeScript knows this is a SequentialInstructionPlan.\n * }\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link assertIsSequentialInstructionPlan}\n */\nexport function isSequentialInstructionPlan(plan: InstructionPlan): plan is SequentialInstructionPlan {\n return plan.kind === 'sequential';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link SequentialInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a sequential instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = sequentialInstructionPlan([instructionA, instructionB]);\n *\n * assertIsSequentialInstructionPlan(plan);\n * console.log(plan.divisible); // TypeScript knows this is a SequentialInstructionPlan.\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link isSequentialInstructionPlan}\n */\nexport function assertIsSequentialInstructionPlan(plan: InstructionPlan): asserts plan is SequentialInstructionPlan {\n if (!isSequentialInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'sequential',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a non-divisible {@link SequentialInstructionPlan}.\n *\n * A non-divisible sequential plan requires all its instructions to be executed\n * atomically — either in a single transaction or in a transaction bundle.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a non-divisible sequential instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n *\n * if (isNonDivisibleSequentialInstructionPlan(plan)) {\n * // All instructions must be executed atomically.\n * }\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link assertIsNonDivisibleSequentialInstructionPlan}\n */\nexport function isNonDivisibleSequentialInstructionPlan(\n plan: InstructionPlan,\n): plan is SequentialInstructionPlan & { divisible: false } {\n return plan.kind === 'sequential' && plan.divisible === false;\n}\n\n/**\n * Asserts that the given instruction plan is a non-divisible {@link SequentialInstructionPlan}.\n *\n * A non-divisible sequential plan requires all its instructions to be executed\n * atomically — either in a single transaction or in a transaction bundle.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a non-divisible sequential instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = nonDivisibleSequentialInstructionPlan([instructionA, instructionB]);\n *\n * assertIsNonDivisibleSequentialInstructionPlan(plan);\n * // All instructions must be executed atomically.\n * ```\n *\n * @see {@link SequentialInstructionPlan}\n * @see {@link isNonDivisibleSequentialInstructionPlan}\n */\nexport function assertIsNonDivisibleSequentialInstructionPlan(\n plan: InstructionPlan,\n): asserts plan is SequentialInstructionPlan & { divisible: false } {\n if (!isNonDivisibleSequentialInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind === 'sequential' ? 'divisible sequential' : plan.kind,\n expectedKind: 'non-divisible sequential',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given instruction plan is a {@link ParallelInstructionPlan}.\n *\n * @param plan - The instruction plan to check.\n * @return `true` if the plan is a parallel instruction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = parallelInstructionPlan([instructionA, instructionB]);\n *\n * if (isParallelInstructionPlan(plan)) {\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelInstructionPlan.\n * }\n * ```\n *\n * @see {@link ParallelInstructionPlan}\n * @see {@link assertIsParallelInstructionPlan}\n */\nexport function isParallelInstructionPlan(plan: InstructionPlan): plan is ParallelInstructionPlan {\n return plan.kind === 'parallel';\n}\n\n/**\n * Asserts that the given instruction plan is a {@link ParallelInstructionPlan}.\n *\n * @param plan - The instruction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN` if the plan is not a parallel instruction plan.\n *\n * @example\n * ```ts\n * const plan: InstructionPlan = parallelInstructionPlan([instructionA, instructionB]);\n *\n * assertIsParallelInstructionPlan(plan);\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelInstructionPlan.\n * ```\n *\n * @see {@link ParallelInstructionPlan}\n * @see {@link isParallelInstructionPlan}\n */\nexport function assertIsParallelInstructionPlan(plan: InstructionPlan): asserts plan is ParallelInstructionPlan {\n if (!isParallelInstructionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_INSTRUCTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'parallel',\n instructionPlan: plan,\n });\n }\n}\n\n/**\n * Finds the first instruction plan in the tree that matches the given predicate.\n *\n * This function performs a depth-first search through the instruction plan tree,\n * returning the first plan that satisfies the predicate. It checks the root plan\n * first, then recursively searches through nested plans.\n *\n * @param instructionPlan - The instruction plan tree to search.\n * @param predicate - A function that returns `true` for the plan to find.\n * @returns The first matching instruction plan, or `undefined` if no match is found.\n *\n * @example\n * Finding a non-divisible sequential plan.\n * ```ts\n * const plan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * nonDivisibleSequentialInstructionPlan([instructionC, instructionD]),\n * ]);\n *\n * const nonDivisible = findInstructionPlan(\n * plan,\n * (p) => p.kind === 'sequential' && !p.divisible,\n * );\n * // Returns the non-divisible sequential plan containing instructionC and instructionD.\n * ```\n *\n * @example\n * Finding a specific single instruction plan.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB, instructionC]);\n *\n * const found = findInstructionPlan(\n * plan,\n * (p) => p.kind === 'single' && p.instruction === instructionB,\n * );\n * // Returns the SingleInstructionPlan wrapping instructionB.\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link everyInstructionPlan}\n * @see {@link transformInstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function findInstructionPlan(\n instructionPlan: InstructionPlan,\n predicate: (plan: InstructionPlan) => boolean,\n): InstructionPlan | undefined {\n if (predicate(instructionPlan)) {\n return instructionPlan;\n }\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return undefined;\n }\n for (const subPlan of instructionPlan.plans) {\n const foundPlan = findInstructionPlan(subPlan, predicate);\n if (foundPlan) {\n return foundPlan;\n }\n }\n return undefined;\n}\n\n/**\n * Checks if every instruction plan in the tree satisfies the given predicate.\n *\n * This function performs a depth-first traversal through the instruction plan tree,\n * returning `true` only if the predicate returns `true` for every plan in the tree\n * (including the root plan and all nested plans).\n *\n * @param instructionPlan - The instruction plan tree to check.\n * @param predicate - A function that returns `true` if the plan satisfies the condition.\n * @return `true` if every plan in the tree satisfies the predicate, `false` otherwise.\n *\n * @example\n * Checking if all plans are divisible.\n * ```ts\n * const plan = sequentialInstructionPlan([\n * parallelInstructionPlan([instructionA, instructionB]),\n * sequentialInstructionPlan([instructionC, instructionD]),\n * ]);\n *\n * const allDivisible = everyInstructionPlan(\n * plan,\n * (p) => p.kind !== 'sequential' || p.divisible,\n * );\n * // Returns true because all sequential plans are divisible.\n * ```\n *\n * @example\n * Checking if all single instructions use a specific program.\n * ```ts\n * const plan = parallelInstructionPlan([instructionA, instructionB, instructionC]);\n *\n * const allUseSameProgram = everyInstructionPlan(\n * plan,\n * (p) => p.kind !== 'single' || p.instruction.programAddress === myProgramAddress,\n * );\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link findInstructionPlan}\n * @see {@link transformInstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function everyInstructionPlan(\n instructionPlan: InstructionPlan,\n predicate: (plan: InstructionPlan) => boolean,\n): boolean {\n if (!predicate(instructionPlan)) {\n return false;\n }\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return true;\n }\n return instructionPlan.plans.every(p => everyInstructionPlan(p, predicate));\n}\n\n/**\n * Transforms an instruction plan tree using a bottom-up approach.\n *\n * This function recursively traverses the instruction plan tree, applying the\n * transformation function to each plan. The transformation is applied bottom-up,\n * meaning nested plans are transformed first, then the parent plans receive\n * the already-transformed children before being transformed themselves.\n *\n * All transformed plans are frozen using `Object.freeze` to ensure immutability.\n *\n * @param instructionPlan - The instruction plan tree to transform.\n * @param fn - A function that transforms each plan and returns a new plan.\n * @return A new transformed instruction plan tree.\n *\n * @example\n * Making all sequential plans non-divisible to ensure atomicity.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB]);\n *\n * const transformed = transformInstructionPlan(plan, (p) => {\n * if (p.kind === 'sequential' && p.divisible) {\n * return nonDivisibleSequentialInstructionPlan(p.plans);\n * }\n * return p;\n * });\n * ```\n *\n * @example\n * Filtering out debug instructions before production execution.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, debugInstruction, instructionB]);\n *\n * const transformed = transformInstructionPlan(plan, (p) => {\n * if (p.kind === 'sequential' || p.kind === 'parallel') {\n * return { ...p, plans: p.plans.filter((p) => !isDebugInstruction(p)) };\n * }\n * return p;\n * });\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link findInstructionPlan}\n * @see {@link everyInstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function transformInstructionPlan(\n instructionPlan: InstructionPlan,\n fn: (plan: InstructionPlan) => InstructionPlan,\n): InstructionPlan {\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return Object.freeze(fn(instructionPlan));\n }\n return Object.freeze(\n fn(\n Object.freeze({\n ...instructionPlan,\n plans: instructionPlan.plans.map(p => transformInstructionPlan(p, fn)),\n }),\n ),\n );\n}\n\n/**\n * Retrieves all individual {@link SingleInstructionPlan} and {@link MessagePackerInstructionPlan}\n * instances from an instruction plan tree.\n *\n * This function recursively traverses any nested structure of instruction plans and extracts\n * all the leaf plans they contain. It's useful when you need to access all the individual\n * instructions or message packers that will be executed, regardless of their organization\n * in the plan tree (parallel or sequential).\n *\n * @param instructionPlan - The instruction plan to extract leaf plans from\n * @returns An array of all single and message packer instruction plans contained in the tree\n *\n * @example\n * ```ts\n * const plan = parallelInstructionPlan([\n * sequentialInstructionPlan([instructionA, instructionB]),\n * nonDivisibleSequentialInstructionPlan([instructionC, instructionD]),\n * instructionE,\n * ]);\n *\n * const leafPlans = flattenInstructionPlan(plan);\n * // Array of `SingleInstructionPlan` containing:\n * // instructionA, instructionB, instructionC, instructionD and instructionE.\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link findInstructionPlan}\n * @see {@link everyInstructionPlan}\n * @see {@link transformInstructionPlan}\n */\nexport function flattenInstructionPlan(\n instructionPlan: InstructionPlan,\n): (MessagePackerInstructionPlan | SingleInstructionPlan)[] {\n if (instructionPlan.kind === 'single' || instructionPlan.kind === 'messagePacker') {\n return [instructionPlan];\n }\n return instructionPlan.plans.flatMap(flattenInstructionPlan);\n}\n\n/**\n * Creates a {@link MessagePackerInstructionPlan} that packs instructions\n * such that each instruction consumes as many bytes as possible from the given\n * `totalLength` while still being able to fit into the given transaction messages.\n *\n * This is particularly useful for instructions that write data to accounts and must\n * span multiple transactions due to their size limit.\n *\n * This message packer will first call `getInstruction` with a length of zero to\n * determine the base size of the instruction before figuring out how many\n * additional bytes can be packed into the transaction message. That remaining space\n * will then be used to call `getInstruction` again with the appropriate length.\n *\n * @param getInstruction - A function that returns an instruction for a given offset and length.\n * @param totalLength - The total length of the data to write, in bytes.\n *\n * @example\n * ```ts\n * const plan = getLinearMessagePackerInstructionPlan({\n * totalLength: dataToWrite.length,\n * getInstruction: (offset, length) =>\n * getWriteInstruction({\n * offset,\n * data: dataToWrite.slice(offset, offset + length),\n * }),\n * });\n * plan satisfies MessagePackerInstructionPlan;\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n */\nexport function getLinearMessagePackerInstructionPlan({\n getInstruction,\n totalLength: totalBytes,\n}: {\n getInstruction: (offset: number, length: number) => Instruction;\n totalLength: number;\n}): MessagePackerInstructionPlan {\n return Object.freeze({\n getMessagePacker: () => {\n let offset = 0;\n return Object.freeze({\n done: () => offset >= totalBytes,\n packMessageToCapacity: (message: TransactionMessage & TransactionMessageWithFeePayer) => {\n if (offset >= totalBytes) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE);\n }\n\n const messageSizeWithBaseInstruction = getTransactionMessageSize(\n appendTransactionMessageInstruction(getInstruction(offset, 0), message),\n );\n const freeSpace =\n TRANSACTION_SIZE_LIMIT -\n messageSizeWithBaseInstruction /* Includes the base instruction (length: 0). */ -\n 1; /* Leeway for shortU16 numbers in transaction headers. */\n\n if (freeSpace <= 0) {\n const messageSize = getTransactionMessageSize(message);\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, {\n // (+1) We need to pack at least one byte of data otherwise\n // there is no point packing the base instruction alone.\n numBytesRequired: messageSizeWithBaseInstruction - messageSize + 1,\n // (-1) Leeway for shortU16 numbers in transaction headers.\n numFreeBytes: TRANSACTION_SIZE_LIMIT - messageSize - 1,\n });\n }\n\n const length = Math.min(totalBytes - offset, freeSpace);\n const instruction = getInstruction(offset, length);\n offset += length;\n return appendTransactionMessageInstruction(instruction, message);\n },\n });\n },\n kind: 'messagePacker',\n });\n}\n\n/**\n * Creates a {@link MessagePackerInstructionPlan} from a list of instructions.\n *\n * This can be useful to prepare a set of instructions that can be iterated over\n * — e.g. to pack a list of instructions that gradually reallocate the size of an account\n * one `REALLOC_LIMIT` (10'240 bytes) at a time.\n *\n * @example\n * ```ts\n * const plan = getMessagePackerInstructionPlanFromInstructions([\n * instructionA,\n * instructionB,\n * instructionC,\n * ]);\n *\n * const messagePacker = plan.getMessagePacker();\n * firstTransactionMessage = messagePacker.packMessageToCapacity(firstTransactionMessage);\n * // Contains instruction A and instruction B.\n * secondTransactionMessage = messagePacker.packMessageToCapacity(secondTransactionMessage);\n * // Contains instruction C.\n * messagePacker.done(); // true\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n * @see {@link getReallocMessagePackerInstructionPlan}\n */\nexport function getMessagePackerInstructionPlanFromInstructions(\n instructions: TInstruction[],\n): MessagePackerInstructionPlan {\n return Object.freeze({\n getMessagePacker: () => {\n let instructionIndex = 0;\n return Object.freeze({\n done: () => instructionIndex >= instructions.length,\n packMessageToCapacity: (message: TransactionMessage & TransactionMessageWithFeePayer) => {\n if (instructionIndex >= instructions.length) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_PACKER_ALREADY_COMPLETE);\n }\n\n const originalMessageSize = getTransactionMessageSize(message);\n\n for (let index = instructionIndex; index < instructions.length; index++) {\n message = appendTransactionMessageInstruction(instructions[index], message);\n const messageSize = getTransactionMessageSize(message);\n\n if (messageSize > TRANSACTION_SIZE_LIMIT) {\n if (index === instructionIndex) {\n throw new SolanaError(\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n {\n numBytesRequired: messageSize - originalMessageSize,\n numFreeBytes: TRANSACTION_SIZE_LIMIT - originalMessageSize,\n },\n );\n }\n instructionIndex = index;\n return message;\n }\n }\n\n instructionIndex = instructions.length;\n return message;\n },\n });\n },\n kind: 'messagePacker',\n });\n}\n\nconst REALLOC_LIMIT = 10_240;\n\n/**\n * Creates a {@link MessagePackerInstructionPlan} that packs a list of realloc instructions.\n *\n * That is, it splits instruction by chunks of `REALLOC_LIMIT` (10'240) bytes until\n * the given total size is reached.\n *\n * @example\n * ```ts\n * const plan = getReallocMessagePackerInstructionPlan({\n * totalSize: additionalDataSize,\n * getInstruction: (size) => getExtendInstruction({ length: size }),\n * });\n * ```\n *\n * @see {@link MessagePackerInstructionPlan}\n */\nexport function getReallocMessagePackerInstructionPlan({\n getInstruction,\n totalSize,\n}: {\n getInstruction: (size: number) => Instruction;\n totalSize: number;\n}): MessagePackerInstructionPlan {\n const numberOfInstructions = Math.ceil(totalSize / REALLOC_LIMIT);\n const lastInstructionSize = totalSize % REALLOC_LIMIT;\n const instructions = new Array(numberOfInstructions)\n .fill(0)\n .map((_, i) => getInstruction(i === numberOfInstructions - 1 ? lastInstructionSize : REALLOC_LIMIT));\n\n return getMessagePackerInstructionPlanFromInstructions(instructions);\n}\n","import { SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, SolanaError } from '@solana/errors';\nimport { type Instruction } from '@solana/instructions';\nimport {\n appendTransactionMessageInstruction,\n appendTransactionMessageInstructions,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\n\nimport { flattenInstructionPlan, InstructionPlan } from './instruction-plan';\n\n/**\n * A helper type to append instructions to a transaction message\n * without losing type information about the current instructions.\n */\n\ntype AppendTransactionMessageInstructions = ReturnType<\n typeof appendTransactionMessageInstructions\n>;\n\n/**\n * Appends all instructions from an instruction plan to a transaction message.\n *\n * This function flattens the instruction plan into its leaf plans and sequentially\n * appends each instruction to the provided transaction message. It handles both\n * single instructions and message packer plans.\n *\n * Note that any {@link MessagePackerInstructionPlan} is assumed to only append\n * instructions. If it modifies other properties of the transaction message, the\n * type of the returned transaction message may not accurately reflect those changes.\n *\n * @typeParam TTransactionMessage - The type of transaction message being modified.\n *\n * @param transactionMessage - The transaction message to append instructions to.\n * @param instructionPlan - The instruction plan containing the instructions to append.\n * @returns The transaction message with all instructions from the plan appended.\n *\n * @example\n * Appending a simple instruction plan to a transaction message.\n * ```ts\n * import { appendTransactionMessageInstructionPlan } from '@solana/instruction-plans';\n * import { createTransactionMessage, setTransactionMessageFeePayer } from '@solana/transaction-messages';\n *\n * const message = setTransactionMessageFeePayer(feePayer, createTransactionMessage({ version: 0 }));\n * const plan = singleInstructionPlan(myInstruction);\n *\n * const messageWithInstructions = appendTransactionMessageInstructionPlan(message, plan);\n * ```\n *\n * @example\n * Appending a sequential instruction plan.\n * ```ts\n * const plan = sequentialInstructionPlan([instructionA, instructionB, instructionC]);\n * const messageWithInstructions = appendTransactionMessageInstructionPlan(message, plan);\n * ```\n *\n * @see {@link InstructionPlan}\n * @see {@link flattenInstructionPlan}\n */\nexport function appendTransactionMessageInstructionPlan<\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer,\n>(\n instructionPlan: InstructionPlan,\n transactionMessage: TTransactionMessage,\n): AppendTransactionMessageInstructions {\n type Out = AppendTransactionMessageInstructions;\n\n const leafInstructionPlans = flattenInstructionPlan(instructionPlan);\n\n return leafInstructionPlans.reduce(\n (messageSoFar, plan) => {\n const kind = plan.kind;\n if (kind === 'single') {\n return appendTransactionMessageInstruction(plan.instruction, messageSoFar) as unknown as Out;\n }\n if (kind === 'messagePacker') {\n const messagerPacker = plan.getMessagePacker();\n let nextMessage: Out = messageSoFar;\n while (!messagerPacker.done()) {\n nextMessage = messagerPacker.packMessageToCapacity(nextMessage) as Out;\n }\n return nextMessage;\n }\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, {\n kind,\n });\n },\n transactionMessage as unknown as Out,\n );\n}\n","import { SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, SolanaError } from '@solana/errors';\nimport { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\n/**\n * A set of transaction messages with constraints on how they can be executed.\n *\n * This is structured as a recursive tree of plans to allow for\n * parallel execution, sequential execution and combinations of both.\n *\n * Namely, the following plans are supported:\n * - {@link SingleTransactionPlan} - A plan that contains a single transaction message.\n * This is the simplest leaf in this tree.\n * - {@link ParallelTransactionPlan} - A plan that contains other plans that\n * can be executed in parallel.\n * - {@link SequentialTransactionPlan} - A plan that contains other plans that\n * must be executed sequentially. It also defines whether the plan is divisible\n * meaning that transaction messages inside it can be split into separate batches.\n *\n * Helpers are provided for each of these plans to make it easier to create them.\n *\n * @example\n * ```ts\n * const myTransactionPlan: TransactionPlan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * messageC,\n * ]);\n * ```\n *\n * @see {@link SingleTransactionPlan}\n * @see {@link ParallelTransactionPlan}\n * @see {@link SequentialTransactionPlan}\n */\nexport type TransactionPlan = ParallelTransactionPlan | SequentialTransactionPlan | SingleTransactionPlan;\n\n/**\n * A plan wrapping other plans that must be executed sequentially.\n *\n * It also defines whether nested plans are divisible — meaning that\n * the transaction messages inside them can be split into separate batches.\n * When `divisible` is `false`, the transaction messages inside the plan should\n * all be executed atomically — usually in a transaction bundle.\n *\n * You may use the {@link sequentialTransactionPlan} and {@link nonDivisibleSequentialTransactionPlan}\n * helpers to create objects of this type.\n *\n * @example\n * Simple sequential plan with two transaction messages.\n * ```ts\n * const plan = sequentialTransactionPlan([messageA, messageB]);\n * plan satisfies SequentialTransactionPlan;\n * ```\n *\n * @example\n * Non-divisible sequential plan with two transaction messages.\n * ```ts\n * const plan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n * plan satisfies SequentialTransactionPlan & { divisible: false };\n * ```\n *\n * @example\n * Sequential plan with nested parallel plans.\n * Here, messages A and B can be executed in parallel, but they must both be finalized\n * before messages C and D can be sent — which can also be executed in parallel.\n * ```ts\n * const plan = sequentialTransactionPlan([\n * parallelTransactionPlan([messageA, messageB]),\n * parallelTransactionPlan([messageC, messageD]),\n * ]);\n * ```\n *\n * @see {@link sequentialTransactionPlan}\n * @see {@link nonDivisibleSequentialTransactionPlan}\n */\nexport type SequentialTransactionPlan = Readonly<{\n divisible: boolean;\n kind: 'sequential';\n plans: TransactionPlan[];\n}>;\n\n/**\n * A plan wrapping other plans that can be executed in parallel.\n *\n * This means direct children of this plan can be executed in separate\n * parallel transactions without causing any side effects.\n * However, the children themselves can define additional constraints\n * for that specific branch of the tree — such as the {@link SequentialTransactionPlan}.\n *\n * You may use the {@link parallelTransactionPlan} helper to create objects of this type.\n *\n * @example\n * Simple parallel plan with two transaction messages.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB]);\n * plan satisfies ParallelTransactionPlan;\n * ```\n *\n * @example\n * Parallel plan with nested sequential plans.\n * Here, messages A and B must be executed sequentially and so must messages C and D,\n * but both pairs can be executed in parallel.\n * ```ts\n * const plan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * sequentialTransactionPlan([messageC, messageD]),\n * ]);\n * plan satisfies ParallelTransactionPlan;\n * ```\n *\n * @see {@link parallelTransactionPlan}\n */\nexport type ParallelTransactionPlan = Readonly<{\n kind: 'parallel';\n plans: TransactionPlan[];\n}>;\n\n/**\n * A plan that contains a single transaction message.\n *\n * This is a simple transaction message wrapper that transforms a message into a plan.\n *\n * You may use the {@link singleTransactionPlan} helper to create objects of this type.\n *\n * @example\n * ```ts\n * const plan = singleTransactionPlan(transactionMessage);\n * plan satisfies SingleTransactionPlan;\n * ```\n *\n * @see {@link singleTransactionPlan}\n */\nexport type SingleTransactionPlan<\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n> = Readonly<{\n kind: 'single';\n message: TTransactionMessage;\n}>;\n\n/**\n * Creates a {@link ParallelTransactionPlan} from an array of nested plans.\n *\n * It can accept {@link TransactionMessage} objects directly, which will be wrapped\n * in {@link SingleTransactionPlan | SingleTransactionPlans} automatically.\n *\n * @example\n * Using explicit {@link SingleTransactionPlan | SingleTransactionPlans}.\n * ```ts\n * const plan = parallelTransactionPlan([\n * singleTransactionPlan(messageA),\n * singleTransactionPlan(messageB),\n * ]);\n * ```\n *\n * @example\n * Using {@link TransactionMessage | TransactionMessages} directly.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB]);\n * ```\n *\n * @see {@link ParallelTransactionPlan}\n */\nexport function parallelTransactionPlan(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): ParallelTransactionPlan {\n return Object.freeze({ kind: 'parallel', plans: parseSingleTransactionPlans(plans) });\n}\n\n/**\n * Creates a divisible {@link SequentialTransactionPlan} from an array of nested plans.\n *\n * It can accept {@link TransactionMessage} objects directly, which will be wrapped\n * in {@link SingleTransactionPlan | SingleTransactionPlans} automatically.\n *\n * @example\n * Using explicit {@link SingleTransactionPlan | SingleTransactionPlans}.\n * ```ts\n * const plan = sequentialTransactionPlan([\n * singleTransactionPlan(messageA),\n * singleTransactionPlan(messageB),\n * ]);\n * ```\n *\n * @example\n * Using {@link TransactionMessage | TransactionMessages} directly.\n * ```ts\n * const plan = sequentialTransactionPlan([messageA, messageB]);\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n */\nexport function sequentialTransactionPlan(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): SequentialTransactionPlan & { divisible: true } {\n return Object.freeze({ divisible: true, kind: 'sequential', plans: parseSingleTransactionPlans(plans) });\n}\n\n/**\n * Creates a non-divisible {@link SequentialTransactionPlan} from an array of nested plans.\n *\n * It can accept {@link TransactionMessage} objects directly, which will be wrapped\n * in {@link SingleTransactionPlan | SingleTransactionPlans} automatically.\n *\n * @example\n * Using explicit {@link SingleTransactionPlan | SingleTransactionPlans}.\n * ```ts\n * const plan = nonDivisibleSequentialTransactionPlan([\n * singleTransactionPlan(messageA),\n * singleTransactionPlan(messageB),\n * ]);\n * ```\n *\n * @example\n * Using {@link TransactionMessage | TransactionMessages} directly.\n * ```ts\n * const plan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n */\nexport function nonDivisibleSequentialTransactionPlan(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): SequentialTransactionPlan & { divisible: false } {\n return Object.freeze({ divisible: false, kind: 'sequential', plans: parseSingleTransactionPlans(plans) });\n}\n\n/**\n * Creates a {@link SingleTransactionPlan} from a {@link TransactionMessage} object.\n *\n * @example\n * ```ts\n * const plan = singleTransactionPlan(transactionMessage);\n * plan satisfies SingleTransactionPlan;\n * ```\n *\n * @see {@link SingleTransactionPlan}\n */\nexport function singleTransactionPlan<\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage): SingleTransactionPlan {\n return Object.freeze({ kind: 'single', message: transactionMessage });\n}\n\nfunction parseSingleTransactionPlans(\n plans: (TransactionPlan | (TransactionMessage & TransactionMessageWithFeePayer))[],\n): TransactionPlan[] {\n return plans.map(plan => ('kind' in plan ? plan : singleTransactionPlan(plan)));\n}\n\n/**\n * Checks if the given transaction plan is a {@link SingleTransactionPlan}.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a single transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = singleTransactionPlan(transactionMessage);\n *\n * if (isSingleTransactionPlan(plan)) {\n * console.log(plan.message); // TypeScript knows this is a SingleTransactionPlan.\n * }\n * ```\n *\n * @see {@link SingleTransactionPlan}\n * @see {@link assertIsSingleTransactionPlan}\n */\nexport function isSingleTransactionPlan(plan: TransactionPlan): plan is SingleTransactionPlan {\n return plan.kind === 'single';\n}\n\n/**\n * Asserts that the given transaction plan is a {@link SingleTransactionPlan}.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a single transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = singleTransactionPlan(transactionMessage);\n *\n * assertIsSingleTransactionPlan(plan);\n * console.log(plan.message); // TypeScript knows this is a SingleTransactionPlan.\n * ```\n *\n * @see {@link SingleTransactionPlan}\n * @see {@link isSingleTransactionPlan}\n */\nexport function assertIsSingleTransactionPlan(plan: TransactionPlan): asserts plan is SingleTransactionPlan {\n if (!isSingleTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'single',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan is a {@link SequentialTransactionPlan}.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a sequential transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = sequentialTransactionPlan([messageA, messageB]);\n *\n * if (isSequentialTransactionPlan(plan)) {\n * console.log(plan.divisible); // TypeScript knows this is a SequentialTransactionPlan.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link assertIsSequentialTransactionPlan}\n */\nexport function isSequentialTransactionPlan(plan: TransactionPlan): plan is SequentialTransactionPlan {\n return plan.kind === 'sequential';\n}\n\n/**\n * Asserts that the given transaction plan is a {@link SequentialTransactionPlan}.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a sequential transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = sequentialTransactionPlan([messageA, messageB]);\n *\n * assertIsSequentialTransactionPlan(plan);\n * console.log(plan.divisible); // TypeScript knows this is a SequentialTransactionPlan.\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link isSequentialTransactionPlan}\n */\nexport function assertIsSequentialTransactionPlan(plan: TransactionPlan): asserts plan is SequentialTransactionPlan {\n if (!isSequentialTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'sequential',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan is a non-divisible {@link SequentialTransactionPlan}.\n *\n * A non-divisible sequential plan requires all its transaction messages to be executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a non-divisible sequential transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n *\n * if (isNonDivisibleSequentialTransactionPlan(plan)) {\n * // All transaction messages must be executed atomically.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link assertIsNonDivisibleSequentialTransactionPlan}\n */\nexport function isNonDivisibleSequentialTransactionPlan(\n plan: TransactionPlan,\n): plan is SequentialTransactionPlan & { divisible: false } {\n return plan.kind === 'sequential' && plan.divisible === false;\n}\n\n/**\n * Asserts that the given transaction plan is a non-divisible {@link SequentialTransactionPlan}.\n *\n * A non-divisible sequential plan requires all its transaction messages to be executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a non-divisible sequential transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = nonDivisibleSequentialTransactionPlan([messageA, messageB]);\n *\n * assertIsNonDivisibleSequentialTransactionPlan(plan);\n * // All transaction messages must be executed atomically.\n * ```\n *\n * @see {@link SequentialTransactionPlan}\n * @see {@link isNonDivisibleSequentialTransactionPlan}\n */\nexport function assertIsNonDivisibleSequentialTransactionPlan(\n plan: TransactionPlan,\n): asserts plan is SequentialTransactionPlan & { divisible: false } {\n if (!isNonDivisibleSequentialTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind === 'sequential' ? 'divisible sequential' : plan.kind,\n expectedKind: 'non-divisible sequential',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan is a {@link ParallelTransactionPlan}.\n *\n * @param plan - The transaction plan to check.\n * @return `true` if the plan is a parallel transaction plan, `false` otherwise.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = parallelTransactionPlan([messageA, messageB]);\n *\n * if (isParallelTransactionPlan(plan)) {\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelTransactionPlan.\n * }\n * ```\n *\n * @see {@link ParallelTransactionPlan}\n * @see {@link assertIsParallelTransactionPlan}\n */\nexport function isParallelTransactionPlan(plan: TransactionPlan): plan is ParallelTransactionPlan {\n return plan.kind === 'parallel';\n}\n\n/**\n * Asserts that the given transaction plan is a {@link ParallelTransactionPlan}.\n *\n * @param plan - The transaction plan to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN` if the plan is not a parallel transaction plan.\n *\n * @example\n * ```ts\n * const plan: TransactionPlan = parallelTransactionPlan([messageA, messageB]);\n *\n * assertIsParallelTransactionPlan(plan);\n * console.log(plan.plans.length); // TypeScript knows this is a ParallelTransactionPlan.\n * ```\n *\n * @see {@link ParallelTransactionPlan}\n * @see {@link isParallelTransactionPlan}\n */\nexport function assertIsParallelTransactionPlan(plan: TransactionPlan): asserts plan is ParallelTransactionPlan {\n if (!isParallelTransactionPlan(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN, {\n actualKind: plan.kind,\n expectedKind: 'parallel',\n transactionPlan: plan,\n });\n }\n}\n\n/**\n * @deprecated Use {@link flattenTransactionPlan} instead.\n */\nexport const getAllSingleTransactionPlans = flattenTransactionPlan;\n\n/**\n * Retrieves all individual {@link SingleTransactionPlan} instances from a transaction plan tree.\n *\n * This function recursively traverses any nested structure of transaction plans and extracts\n * all the single transaction plans they contain. It's useful when you need to access all\n * the actual transaction messages that will be executed, regardless of their organization\n * in the plan tree (parallel or sequential).\n *\n * @param transactionPlan - The transaction plan to extract single plans from\n * @returns An array of all single transaction plans contained in the tree\n *\n * @example\n * ```ts\n * const plan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * nonDivisibleSequentialTransactionPlan([messageC, messageD]),\n * messageE,\n * ]);\n *\n * const singlePlans = flattenTransactionPlan(plan);\n * // Array of `SingleTransactionPlan` containing:\n * // messageA, messageB, messageC and messageD.\n *\n * @see {@link TransactionPlan}\n * @see {@link findTransactionPlan}\n * @see {@link everyTransactionPlan}\n * @see {@link transformTransactionPlan}\n * ```\n */\nexport function flattenTransactionPlan(transactionPlan: TransactionPlan): SingleTransactionPlan[] {\n if (transactionPlan.kind === 'single') {\n return [transactionPlan];\n }\n return transactionPlan.plans.flatMap(flattenTransactionPlan);\n}\n\n/**\n * Finds the first transaction plan in the tree that matches the given predicate.\n *\n * This function performs a depth-first search through the transaction plan tree,\n * returning the first plan that satisfies the predicate. It checks the root plan\n * first, then recursively searches through nested plans.\n *\n * @param transactionPlan - The transaction plan tree to search.\n * @param predicate - A function that returns `true` for the plan to find.\n * @return The first matching transaction plan, or `undefined` if no match is found.\n *\n * @example\n * Finding a non-divisible sequential plan.\n * ```ts\n * const plan = parallelTransactionPlan([\n * sequentialTransactionPlan([messageA, messageB]),\n * nonDivisibleSequentialTransactionPlan([messageC, messageD]),\n * ]);\n *\n * const nonDivisible = findTransactionPlan(\n * plan,\n * (p) => p.kind === 'sequential' && !p.divisible,\n * );\n * // Returns the non-divisible sequential plan containing messageC and messageD.\n * ```\n *\n * @example\n * Finding a specific single transaction plan.\n * ```ts\n * const plan = sequentialTransactionPlan([messageA, messageB, messageC]);\n *\n * const found = findTransactionPlan(\n * plan,\n * (p) => p.kind === 'single' && p.message === messageB,\n * );\n * // Returns the SingleTransactionPlan wrapping messageB.\n * ```\n *\n * @see {@link TransactionPlan}\n * @see {@link everyTransactionPlan}\n * @see {@link transformTransactionPlan}\n * @see {@link flattenTransactionPlan}\n */\nexport function findTransactionPlan(\n transactionPlan: TransactionPlan,\n predicate: (plan: TransactionPlan) => boolean,\n): TransactionPlan | undefined {\n if (predicate(transactionPlan)) {\n return transactionPlan;\n }\n if (transactionPlan.kind === 'single') {\n return undefined;\n }\n for (const subPlan of transactionPlan.plans) {\n const foundPlan = findTransactionPlan(subPlan, predicate);\n if (foundPlan) {\n return foundPlan;\n }\n }\n return undefined;\n}\n\n/**\n * Checks if every transaction plan in the tree satisfies the given predicate.\n *\n * This function performs a depth-first traversal through the transaction plan tree,\n * returning `true` only if the predicate returns `true` for every plan in the tree\n * (including the root plan and all nested plans).\n *\n * @param transactionPlan - The transaction plan tree to check.\n * @param predicate - A function that returns `true` if the plan satisfies the condition.\n * @return `true` if every plan in the tree satisfies the predicate, `false` otherwise.\n *\n * @example\n * Checking if all plans are divisible.\n * ```ts\n * const plan = sequentialTransactionPlan([\n * parallelTransactionPlan([messageA, messageB]),\n * sequentialTransactionPlan([messageC, messageD]),\n * ]);\n *\n * const allDivisible = everyTransactionPlan(\n * plan,\n * (p) => p.kind !== 'sequential' || p.divisible,\n * );\n * // Returns true because all sequential plans are divisible.\n * ```\n *\n * @example\n * Checking if all single plans have a specific fee payer.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB, messageC]);\n *\n * const allUseSameFeePayer = everyTransactionPlan(\n * plan,\n * (p) => p.kind !== 'single' || p.message.feePayer.address === myFeePayer,\n * );\n * ```\n *\n * @see {@link TransactionPlan}\n * @see {@link findTransactionPlan}\n * @see {@link transformTransactionPlan}\n * @see {@link flattenTransactionPlan}\n */\nexport function everyTransactionPlan(\n transactionPlan: TransactionPlan,\n predicate: (plan: TransactionPlan) => boolean,\n): boolean {\n if (!predicate(transactionPlan)) {\n return false;\n }\n if (transactionPlan.kind === 'single') {\n return true;\n }\n return transactionPlan.plans.every(p => everyTransactionPlan(p, predicate));\n}\n\n/**\n * Transforms a transaction plan tree using a bottom-up approach.\n *\n * This function recursively traverses the transaction plan tree, applying the\n * transformation function to each plan. The transformation is applied bottom-up,\n * meaning nested plans are transformed first, then the parent plans receive\n * the already-transformed children before being transformed themselves.\n *\n * All transformed plans are frozen using `Object.freeze` to ensure immutability.\n *\n * @param transactionPlan - The transaction plan tree to transform.\n * @param fn - A function that transforms each plan and returns a new plan.\n * @return A new transformed transaction plan tree.\n *\n * @example\n * Removing parallelism by converting parallel plans to sequential.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB, messageC]);\n *\n * const transformed = transformTransactionPlan(plan, (p) => {\n * if (p.kind === 'parallel') {\n * return sequentialTransactionPlan(p.plans);\n * }\n * return p;\n * });\n * ```\n *\n * @example\n * Updating the fee payer on all transaction messages.\n * ```ts\n * const plan = parallelTransactionPlan([messageA, messageB]);\n *\n * const transformed = transformTransactionPlan(plan, (p) => {\n * if (p.kind === 'single') {\n * return singleTransactionPlan({ ...p.message, feePayer: newFeePayer });\n * }\n * return p;\n * });\n * ```\n *\n * @see {@link TransactionPlan}\n * @see {@link findTransactionPlan}\n * @see {@link everyTransactionPlan}\n * @see {@link flattenTransactionPlan}\n */\nexport function transformTransactionPlan(\n transactionPlan: TransactionPlan,\n fn: (plan: TransactionPlan) => TransactionPlan,\n): TransactionPlan {\n if (transactionPlan.kind === 'single') {\n return Object.freeze(fn(transactionPlan));\n }\n return Object.freeze(\n fn(\n Object.freeze({\n ...transactionPlan,\n plans: transactionPlan.plans.map(p => transformTransactionPlan(p, fn)),\n }),\n ),\n );\n}\n","import {\n SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT,\n SolanaError,\n} from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\nimport { getSignatureFromTransaction, Transaction } from '@solana/transactions';\n\n/**\n * The result of executing a transaction plan.\n *\n * This is structured as a recursive tree of results that mirrors the structure\n * of the original transaction plan, capturing the execution status at each level.\n *\n * Namely, the following result types are supported:\n * - {@link SingleTransactionPlanResult} - A result for a single transaction message\n * containing its execution status.\n * - {@link ParallelTransactionPlanResult} - A result containing other results that\n * were executed in parallel.\n * - {@link SequentialTransactionPlanResult} - A result containing other results that\n * were executed sequentially. It also retains the divisibility property from the\n * original plan.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TSingle - The type of single transaction plan results in this tree\n *\n * @see {@link SingleTransactionPlanResult}\n * @see {@link ParallelTransactionPlanResult}\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link TransactionPlanResultStatus}\n */\nexport type TransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TSingle extends SingleTransactionPlanResult = SingleTransactionPlanResult,\n> = ParallelTransactionPlanResult | SequentialTransactionPlanResult | TSingle;\n\n/**\n * A {@link TransactionPlanResult} where all single transaction results are successful.\n *\n * This type represents a transaction plan result tree where every\n * {@link SingleTransactionPlanResult} has a 'successful' status. It can be used\n * to ensure that an entire execution completed without any failures or cancellations.\n *\n * Note: This is different from {@link SuccessfulSingleTransactionPlanResult} which\n * represents a single successful transaction, whereas this type represents an entire\n * plan result tree (which may contain parallel/sequential structures) where all\n * leaf nodes are successful.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n *\n * @see {@link isSuccessfulTransactionPlanResult}\n * @see {@link assertIsSuccessfulTransactionPlanResult}\n * @see {@link SuccessfulSingleTransactionPlanResult}\n */\nexport type SuccessfulTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n> = TransactionPlanResult>;\n\n/** A context object that may be passed along with successful results. */\nexport type TransactionPlanResultContext = Record;\n\n/**\n * A result for a sequential transaction plan.\n *\n * This represents the execution result of a {@link SequentialTransactionPlan} and\n * contains child results that were executed sequentially. It also retains the\n * divisibility property from the original plan.\n *\n * You may use the {@link sequentialTransactionPlanResult} and\n * {@link nonDivisibleSequentialTransactionPlanResult} helpers to create objects of this type.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TSingle - The type of single transaction plan results in this tree\n *\n * @example\n * ```ts\n * const result = sequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult;\n * ```\n *\n * @example\n * Non-divisible sequential result.\n * ```ts\n * const result = nonDivisibleSequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult & { divisible: false };\n * ```\n *\n * @see {@link sequentialTransactionPlanResult}\n * @see {@link nonDivisibleSequentialTransactionPlanResult}\n */\nexport type SequentialTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TSingle extends SingleTransactionPlanResult = SingleTransactionPlanResult,\n> = Readonly<{\n divisible: boolean;\n kind: 'sequential';\n plans: TransactionPlanResult[];\n}>;\n\n/**\n * A result for a parallel transaction plan.\n *\n * This represents the execution result of a {@link ParallelTransactionPlan} and\n * contains child results that were executed in parallel.\n *\n * You may use the {@link parallelTransactionPlanResult} helper to create objects of this type.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TSingle - The type of single transaction plan results in this tree\n *\n * @example\n * ```ts\n * const result = parallelTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies ParallelTransactionPlanResult;\n * ```\n *\n * @see {@link parallelTransactionPlanResult}\n */\nexport type ParallelTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TSingle extends SingleTransactionPlanResult = SingleTransactionPlanResult,\n> = Readonly<{\n kind: 'parallel';\n plans: TransactionPlanResult[];\n}>;\n\n/**\n * A result for a single transaction plan.\n *\n * This represents the execution result of a {@link SingleTransactionPlan} and\n * contains the original transaction message along with its execution status.\n *\n * You may use the {@link successfulSingleTransactionPlanResult},\n * {@link failedSingleTransactionPlanResult}, or {@link canceledSingleTransactionPlanResult}\n * helpers to create objects of this type.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @template TTransactionMessage - The type of the transaction message\n *\n * @example\n * Successful result with a transaction and context.\n * ```ts\n * const result = successfulSingleTransactionPlanResult(\n * transactionMessage,\n * transaction\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @example\n * Failed result with an error.\n * ```ts\n * const result = failedSingleTransactionPlanResult(\n * transactionMessage,\n * new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE),\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @example\n * Canceled result.\n * ```ts\n * const result = canceledSingleTransactionPlanResult(transactionMessage);\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link successfulSingleTransactionPlanResult}\n * @see {@link failedSingleTransactionPlanResult}\n * @see {@link canceledSingleTransactionPlanResult}\n */\nexport type SingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n> = Readonly<{\n kind: 'single';\n message: TTransactionMessage;\n status: TransactionPlanResultStatus;\n}>;\n\n/**\n * The status of a single transaction plan execution.\n *\n * This represents the outcome of executing a single transaction message and can be one of:\n * - `successful` - The transaction was successfully executed. Contains the transaction\n * and an optional context object.\n * - `failed` - The transaction execution failed. Contains the error that caused the failure.\n * - `canceled` - The transaction execution was canceled.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n */\nexport type TransactionPlanResultStatus =\n | Readonly<{ context: TContext; kind: 'successful'; signature: Signature; transaction?: Transaction }>\n | Readonly<{ error: Error; kind: 'failed' }>\n | Readonly<{ kind: 'canceled' }>;\n\n/**\n * Creates a divisible {@link SequentialTransactionPlanResult} from an array of nested results.\n *\n * This function creates a sequential result with the `divisible` property set to `true`,\n * indicating that the nested plans were executed sequentially but could have been\n * split into separate transactions or batches.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @param plans - The child results that were executed sequentially\n *\n * @example\n * ```ts\n * const result = sequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult & { divisible: true };\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n */\nexport function sequentialTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n>(plans: TransactionPlanResult[]): SequentialTransactionPlanResult & { divisible: true } {\n return Object.freeze({ divisible: true, kind: 'sequential', plans });\n}\n\n/**\n * Creates a non-divisible {@link SequentialTransactionPlanResult} from an array of nested results.\n *\n * This function creates a sequential result with the `divisible` property set to `false`,\n * indicating that the nested plans were executed sequentially and could not have been\n * split into separate transactions or batches (e.g., they were executed as a transaction bundle).\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @param plans - The child results that were executed sequentially\n *\n * @example\n * ```ts\n * const result = nonDivisibleSequentialTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies SequentialTransactionPlanResult & { divisible: false };\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n */\nexport function nonDivisibleSequentialTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n>(plans: TransactionPlanResult[]): SequentialTransactionPlanResult & { divisible: false } {\n return Object.freeze({ divisible: false, kind: 'sequential', plans });\n}\n\n/**\n * Creates a {@link ParallelTransactionPlanResult} from an array of nested results.\n *\n * This function creates a parallel result indicating that the nested plans\n * were executed in parallel.\n *\n * @template TContext - The type of the context object that may be passed along with successful results\n * @param plans - The child results that were executed in parallel\n *\n * @example\n * ```ts\n * const result = parallelTransactionPlanResult([\n * singleResultA,\n * singleResultB,\n * ]);\n * result satisfies ParallelTransactionPlanResult;\n * ```\n *\n * @see {@link ParallelTransactionPlanResult}\n */\nexport function parallelTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n>(plans: TransactionPlanResult[]): ParallelTransactionPlanResult {\n return Object.freeze({ kind: 'parallel', plans });\n}\n\n/**\n * Creates a successful {@link SingleTransactionPlanResult} from a transaction message and transaction.\n *\n * This function creates a single result with a 'successful' status, indicating that\n * the transaction was successfully executed. It also includes the original transaction\n * message, the executed transaction, and an optional context object.\n *\n * @template TContext - The type of the context object\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n * @param transaction - The successfully executed transaction\n * @param context - Optional context object to be included with the result\n *\n * @example\n * ```ts\n * const result = successfulSingleTransactionPlanResult(\n * transactionMessage,\n * transaction\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function successfulSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n transaction: Transaction,\n context?: TContext,\n): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({\n context: context ?? ({} as TContext),\n kind: 'successful',\n signature: getSignatureFromTransaction(transaction),\n transaction,\n }),\n });\n}\n\n/**\n * Creates a successful {@link SingleTransactionPlanResult} from a transaction message and signature.\n *\n * This function creates a single result with a 'successful' status, indicating that\n * the transaction was successfully executed. It also includes the original transaction\n * message, the signature of the executed transaction, and an optional context object.\n *\n * @template TContext - The type of the context object\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n * @param signature - The signature of the successfully executed transaction\n * @param context - Optional context object to be included with the result\n *\n * @example\n * ```ts\n * const result = successfulSingleTransactionPlanResult(\n * transactionMessage,\n * signature\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function successfulSingleTransactionPlanResultFromSignature<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n signature: Signature,\n context?: TContext,\n): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({ context: context ?? ({} as TContext), kind: 'successful', signature }),\n });\n}\n\n/**\n * Creates a failed {@link SingleTransactionPlanResult} from a transaction message and error.\n *\n * This function creates a single result with a 'failed' status, indicating that\n * the transaction execution failed. It includes the original transaction message\n * and the error that caused the failure.\n *\n * @template TContext - The type of the context object (not used in failed results)\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n * @param error - The error that caused the transaction to fail\n *\n * @example\n * ```ts\n * const result = failedSingleTransactionPlanResult(\n * transactionMessage,\n * new SolanaError({\n * code: 123,\n * message: 'Transaction simulation failed',\n * }),\n * );\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function failedSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage, error: Error): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({ error, kind: 'failed' }),\n });\n}\n\n/**\n * Creates a canceled {@link SingleTransactionPlanResult} from a transaction message.\n *\n * This function creates a single result with a 'canceled' status, indicating that\n * the transaction execution was canceled. It includes the original transaction message.\n *\n * @template TContext - The type of the context object (not used in canceled results)\n * @template TTransactionMessage - The type of the transaction message\n * @param transactionMessage - The original transaction message\n *\n * @example\n * ```ts\n * const result = canceledSingleTransactionPlanResult(transactionMessage);\n * result satisfies SingleTransactionPlanResult;\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n */\nexport function canceledSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer = TransactionMessage &\n TransactionMessageWithFeePayer,\n>(transactionMessage: TTransactionMessage): SingleTransactionPlanResult {\n return Object.freeze({\n kind: 'single',\n message: transactionMessage,\n status: Object.freeze({ kind: 'canceled' }),\n });\n}\n\n/**\n * Checks if the given transaction plan result is a {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * if (isSingleTransactionPlanResult(result)) {\n * console.log(result.status.kind); // TypeScript knows this is a SingleTransactionPlanResult.\n * }\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n * @see {@link assertIsSingleTransactionPlanResult}\n */\nexport function isSingleTransactionPlanResult(plan: TransactionPlanResult): plan is SingleTransactionPlanResult {\n return plan.kind === 'single';\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * assertIsSingleTransactionPlanResult(result);\n * console.log(result.status.kind); // TypeScript knows this is a SingleTransactionPlanResult.\n * ```\n *\n * @see {@link SingleTransactionPlanResult}\n * @see {@link isSingleTransactionPlanResult}\n */\nexport function assertIsSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SingleTransactionPlanResult {\n if (!isSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind,\n expectedKind: 'single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a successful {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a successful single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * if (isSuccessfulSingleTransactionPlanResult(result)) {\n * console.log(result.status.signature); // TypeScript knows this is a successful result.\n * }\n * ```\n *\n * @see {@link SuccessfulSingleTransactionPlanResult}\n * @see {@link assertIsSuccessfulSingleTransactionPlanResult}\n */\nexport function isSuccessfulSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SuccessfulSingleTransactionPlanResult {\n return plan.kind === 'single' && plan.status.kind === 'successful';\n}\n\n/**\n * Asserts that the given transaction plan result is a successful {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a successful single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = successfulSingleTransactionPlanResult(message, transaction);\n *\n * assertIsSuccessfulSingleTransactionPlanResult(result);\n * console.log(result.status.signature); // TypeScript knows this is a successful result.\n * ```\n *\n * @see {@link SuccessfulSingleTransactionPlanResult}\n * @see {@link isSuccessfulSingleTransactionPlanResult}\n */\nexport function assertIsSuccessfulSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SuccessfulSingleTransactionPlanResult {\n if (!isSuccessfulSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'single' ? `${plan.status.kind} single` : plan.kind,\n expectedKind: 'successful single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a failed {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a failed single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = failedSingleTransactionPlanResult(message, error);\n *\n * if (isFailedSingleTransactionPlanResult(result)) {\n * console.log(result.status.error); // TypeScript knows this is a failed result.\n * }\n * ```\n *\n * @see {@link FailedSingleTransactionPlanResult}\n * @see {@link assertIsFailedSingleTransactionPlanResult}\n */\nexport function isFailedSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is FailedSingleTransactionPlanResult {\n return plan.kind === 'single' && plan.status.kind === 'failed';\n}\n\n/**\n * Asserts that the given transaction plan result is a failed {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a failed single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = failedSingleTransactionPlanResult(message, error);\n *\n * assertIsFailedSingleTransactionPlanResult(result);\n * console.log(result.status.error); // TypeScript knows this is a failed result.\n * ```\n *\n * @see {@link FailedSingleTransactionPlanResult}\n * @see {@link isFailedSingleTransactionPlanResult}\n */\nexport function assertIsFailedSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is FailedSingleTransactionPlanResult {\n if (!isFailedSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'single' ? `${plan.status.kind} single` : plan.kind,\n expectedKind: 'failed single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a canceled {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a canceled single transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = canceledSingleTransactionPlanResult(message);\n *\n * if (isCanceledSingleTransactionPlanResult(result)) {\n * console.log('Transaction was canceled'); // TypeScript knows this is a canceled result.\n * }\n * ```\n *\n * @see {@link CanceledSingleTransactionPlanResult}\n * @see {@link assertIsCanceledSingleTransactionPlanResult}\n */\nexport function isCanceledSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is CanceledSingleTransactionPlanResult {\n return plan.kind === 'single' && plan.status.kind === 'canceled';\n}\n\n/**\n * Asserts that the given transaction plan result is a canceled {@link SingleTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a canceled single transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = canceledSingleTransactionPlanResult(message);\n *\n * assertIsCanceledSingleTransactionPlanResult(result);\n * console.log('Transaction was canceled'); // TypeScript knows this is a canceled result.\n * ```\n *\n * @see {@link CanceledSingleTransactionPlanResult}\n * @see {@link isCanceledSingleTransactionPlanResult}\n */\nexport function assertIsCanceledSingleTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is CanceledSingleTransactionPlanResult {\n if (!isCanceledSingleTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'single' ? `${plan.status.kind} single` : plan.kind,\n expectedKind: 'canceled single',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a {@link SequentialTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a sequential transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = sequentialTransactionPlanResult([resultA, resultB]);\n *\n * if (isSequentialTransactionPlanResult(result)) {\n * console.log(result.divisible); // TypeScript knows this is a SequentialTransactionPlanResult.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link assertIsSequentialTransactionPlanResult}\n */\nexport function isSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SequentialTransactionPlanResult {\n return plan.kind === 'sequential';\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link SequentialTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a sequential transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = sequentialTransactionPlanResult([resultA, resultB]);\n *\n * assertIsSequentialTransactionPlanResult(result);\n * console.log(result.divisible); // TypeScript knows this is a SequentialTransactionPlanResult.\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link isSequentialTransactionPlanResult}\n */\nexport function assertIsSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SequentialTransactionPlanResult {\n if (!isSequentialTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind,\n expectedKind: 'sequential',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a non-divisible {@link SequentialTransactionPlanResult}.\n *\n * A non-divisible sequential result indicates that the transactions were executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a non-divisible sequential transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = nonDivisibleSequentialTransactionPlanResult([resultA, resultB]);\n *\n * if (isNonDivisibleSequentialTransactionPlanResult(result)) {\n * // Transactions were executed atomically.\n * }\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link assertIsNonDivisibleSequentialTransactionPlanResult}\n */\nexport function isNonDivisibleSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SequentialTransactionPlanResult & { divisible: false } {\n return plan.kind === 'sequential' && plan.divisible === false;\n}\n\n/**\n * Asserts that the given transaction plan result is a non-divisible {@link SequentialTransactionPlanResult}.\n *\n * A non-divisible sequential result indicates that the transactions were executed\n * atomically — usually in a transaction bundle.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a non-divisible sequential transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = nonDivisibleSequentialTransactionPlanResult([resultA, resultB]);\n *\n * assertIsNonDivisibleSequentialTransactionPlanResult(result);\n * // Transactions were executed atomically.\n * ```\n *\n * @see {@link SequentialTransactionPlanResult}\n * @see {@link isNonDivisibleSequentialTransactionPlanResult}\n */\nexport function assertIsNonDivisibleSequentialTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SequentialTransactionPlanResult & { divisible: false } {\n if (!isNonDivisibleSequentialTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind === 'sequential' ? 'divisible sequential' : plan.kind,\n expectedKind: 'non-divisible sequential',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a {@link ParallelTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if the result is a parallel transaction plan result, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([resultA, resultB]);\n *\n * if (isParallelTransactionPlanResult(result)) {\n * console.log(result.plans.length); // TypeScript knows this is a ParallelTransactionPlanResult.\n * }\n * ```\n *\n * @see {@link ParallelTransactionPlanResult}\n * @see {@link assertIsParallelTransactionPlanResult}\n */\nexport function isParallelTransactionPlanResult(plan: TransactionPlanResult): plan is ParallelTransactionPlanResult {\n return plan.kind === 'parallel';\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link ParallelTransactionPlanResult}.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT` if the result is not a parallel transaction plan result.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([resultA, resultB]);\n *\n * assertIsParallelTransactionPlanResult(result);\n * console.log(result.plans.length); // TypeScript knows this is a ParallelTransactionPlanResult.\n * ```\n *\n * @see {@link ParallelTransactionPlanResult}\n * @see {@link isParallelTransactionPlanResult}\n */\nexport function assertIsParallelTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is ParallelTransactionPlanResult {\n if (!isParallelTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__UNEXPECTED_TRANSACTION_PLAN_RESULT, {\n actualKind: plan.kind,\n expectedKind: 'parallel',\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Checks if the given transaction plan result is a {@link SuccessfulTransactionPlanResult}.\n *\n * This function verifies that the entire transaction plan result tree contains only\n * successful single transaction results. It recursively checks all nested results\n * to ensure every {@link SingleTransactionPlanResult} has a 'successful' status.\n *\n * Note: This is different from {@link isSuccessfulSingleTransactionPlanResult} which\n * checks if a single result is successful. This function checks that the entire\n * plan result tree (including all nested parallel/sequential structures) contains\n * only successful transactions.\n *\n * @param plan - The transaction plan result to check.\n * @return `true` if all single transaction results in the tree are successful, `false` otherwise.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * successfulSingleTransactionPlanResult(messageB, transactionB),\n * ]);\n *\n * if (isSuccessfulTransactionPlanResult(result)) {\n * // All transactions were successful.\n * result satisfies SuccessfulTransactionPlanResult;\n * }\n * ```\n *\n * @see {@link SuccessfulTransactionPlanResult}\n * @see {@link assertIsSuccessfulTransactionPlanResult}\n * @see {@link isSuccessfulSingleTransactionPlanResult}\n */\nexport function isSuccessfulTransactionPlanResult(\n plan: TransactionPlanResult,\n): plan is SuccessfulTransactionPlanResult {\n return everyTransactionPlanResult(\n plan,\n r => !isSingleTransactionPlanResult(r) || isSuccessfulSingleTransactionPlanResult(r),\n );\n}\n\n/**\n * Asserts that the given transaction plan result is a {@link SuccessfulTransactionPlanResult}.\n *\n * This function verifies that the entire transaction plan result tree contains only\n * successful single transaction results. It throws if any {@link SingleTransactionPlanResult}\n * in the tree has a 'failed' or 'canceled' status.\n *\n * Note: This is different from {@link assertIsSuccessfulSingleTransactionPlanResult} which\n * asserts that a single result is successful. This function asserts that the entire\n * plan result tree (including all nested parallel/sequential structures) contains\n * only successful transactions.\n *\n * @param plan - The transaction plan result to assert.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT` if\n * any single transaction result in the tree is not successful.\n *\n * @example\n * ```ts\n * const result: TransactionPlanResult = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * successfulSingleTransactionPlanResult(messageB, transactionB),\n * ]);\n *\n * assertIsSuccessfulTransactionPlanResult(result);\n * // All transactions were successful.\n * result satisfies SuccessfulTransactionPlanResult;\n * ```\n *\n * @see {@link SuccessfulTransactionPlanResult}\n * @see {@link isSuccessfulTransactionPlanResult}\n * @see {@link assertIsSuccessfulSingleTransactionPlanResult}\n */\nexport function assertIsSuccessfulTransactionPlanResult(\n plan: TransactionPlanResult,\n): asserts plan is SuccessfulTransactionPlanResult {\n if (!isSuccessfulTransactionPlanResult(plan)) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EXPECTED_SUCCESSFUL_TRANSACTION_PLAN_RESULT, {\n transactionPlanResult: plan,\n });\n }\n}\n\n/**\n * Finds the first transaction plan result in the tree that matches the given predicate.\n *\n * This function performs a depth-first search through the transaction plan result tree,\n * returning the first result that satisfies the predicate. It checks the root result\n * first, then recursively searches through nested results.\n *\n * @param transactionPlanResult - The transaction plan result tree to search.\n * @param predicate - A function that returns `true` for the result to find.\n * @returns The first matching transaction plan result, or `undefined` if no match is found.\n *\n * @example\n * Finding a failed transaction result.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * failedSingleTransactionPlanResult(messageB, error),\n * ]);\n *\n * const failed = findTransactionPlanResult(\n * result,\n * (r) => r.kind === 'single' && r.status.kind === 'failed',\n * );\n * // Returns the failed single transaction plan result for messageB.\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link everyTransactionPlanResult}\n * @see {@link transformTransactionPlanResult}\n * @see {@link flattenTransactionPlanResult}\n */\nexport function findTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n predicate: (result: TransactionPlanResult) => boolean,\n): TransactionPlanResult | undefined {\n if (predicate(transactionPlanResult)) {\n return transactionPlanResult;\n }\n if (transactionPlanResult.kind === 'single') {\n return undefined;\n }\n for (const subResult of transactionPlanResult.plans) {\n const foundResult = findTransactionPlanResult(subResult, predicate);\n if (foundResult) {\n return foundResult;\n }\n }\n return undefined;\n}\n\n/**\n * Retrieves the first failed transaction plan result from a transaction plan result tree.\n *\n * This function searches the transaction plan result tree using a depth-first traversal\n * and returns the first single transaction result with a 'failed' status. If no failed\n * result is found, it throws a {@link SolanaError}.\n *\n * @param transactionPlanResult - The transaction plan result tree to search.\n * @return The first failed single transaction plan result.\n * @throws Throws a {@link SolanaError} with code\n * `SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND` if no\n * failed transaction plan result is found. The error context contains a non-enumerable\n * `transactionPlanResult` property for recovery purposes.\n *\n * @example\n * Retrieving the first failed result from a parallel execution.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * failedSingleTransactionPlanResult(messageB, error),\n * failedSingleTransactionPlanResult(messageC, anotherError),\n * ]);\n *\n * const firstFailed = getFirstFailedSingleTransactionPlanResult(result);\n * // Returns the failed result for messageB.\n * ```\n *\n * @see {@link FailedSingleTransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n */\nexport function getFirstFailedSingleTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n): FailedSingleTransactionPlanResult {\n const result = findTransactionPlanResult(\n transactionPlanResult,\n r => r.kind === 'single' && r.status.kind === 'failed',\n );\n\n if (!result) {\n // Here we want the `transactionPlanResult` to be available in the error context\n // so applications can recover but we don't want this object to be\n // serialized with the error. This is why we set it as a non-enumerable property.\n const context = {};\n Object.defineProperty(context, 'transactionPlanResult', {\n configurable: false,\n enumerable: false,\n value: transactionPlanResult,\n writable: false,\n });\n throw new SolanaError(\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_SINGLE_TRANSACTION_PLAN_RESULT_NOT_FOUND,\n context,\n );\n }\n\n return result as FailedSingleTransactionPlanResult;\n}\n\n/**\n * Checks if every transaction plan result in the tree satisfies the given predicate.\n *\n * This function performs a depth-first traversal through the transaction plan result tree,\n * returning `true` only if the predicate returns `true` for every result in the tree\n * (including the root result and all nested results).\n *\n * @param transactionPlanResult - The transaction plan result tree to check.\n * @param predicate - A function that returns `true` if the result satisfies the condition.\n * @return `true` if every result in the tree satisfies the predicate, `false` otherwise.\n *\n * @example\n * Checking if all transactions were successful.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * successfulSingleTransactionPlanResult(messageB, transactionB),\n * ]);\n *\n * const allSuccessful = everyTransactionPlanResult(\n * result,\n * (r) => r.kind !== 'single' || r.status.kind === 'successful',\n * );\n * // Returns true because all single results are successful.\n * ```\n *\n * @example\n * Checking if no transactions were canceled.\n * ```ts\n * const result = sequentialTransactionPlanResult([resultA, resultB, resultC]);\n *\n * const noCanceled = everyTransactionPlanResult(\n * result,\n * (r) => r.kind !== 'single' || r.status.kind !== 'canceled',\n * );\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n * @see {@link transformTransactionPlanResult}\n * @see {@link flattenTransactionPlanResult}\n */\nexport function everyTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n predicate: (plan: TransactionPlanResult) => boolean,\n): boolean {\n if (!predicate(transactionPlanResult)) {\n return false;\n }\n if (transactionPlanResult.kind === 'single') {\n return true;\n }\n return transactionPlanResult.plans.every(p => everyTransactionPlanResult(p, predicate));\n}\n\n/**\n * Transforms a transaction plan result tree using a bottom-up approach.\n *\n * This function recursively traverses the transaction plan result tree, applying the\n * transformation function to each result. The transformation is applied bottom-up,\n * meaning nested results are transformed first, then the parent results receive\n * the already-transformed children before being transformed themselves.\n *\n * All transformed results are frozen using `Object.freeze` to ensure immutability.\n *\n * @param transactionPlanResult - The transaction plan result tree to transform.\n * @param fn - A function that transforms each result and returns a new result.\n * @return A new transformed transaction plan result tree.\n *\n * @example\n * Converting all canceled results to failed results.\n * ```ts\n * const result = parallelTransactionPlanResult([\n * successfulSingleTransactionPlanResult(messageA, transactionA),\n * canceledSingleTransactionPlanResult(messageB),\n * ]);\n *\n * const transformed = transformTransactionPlanResult(result, (r) => {\n * if (r.kind === 'single' && r.status.kind === 'canceled') {\n * return failedSingleTransactionPlanResult(r.message, new Error('Execution canceled'));\n * }\n * return r;\n * });\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n * @see {@link everyTransactionPlanResult}\n * @see {@link flattenTransactionPlanResult}\n */\nexport function transformTransactionPlanResult(\n transactionPlanResult: TransactionPlanResult,\n fn: (plan: TransactionPlanResult) => TransactionPlanResult,\n): TransactionPlanResult {\n if (transactionPlanResult.kind === 'single') {\n return Object.freeze(fn(transactionPlanResult));\n }\n return Object.freeze(\n fn(\n Object.freeze({\n ...transactionPlanResult,\n plans: transactionPlanResult.plans.map(p => transformTransactionPlanResult(p, fn)),\n }),\n ),\n );\n}\n\n/**\n * Retrieves all individual {@link SingleTransactionPlanResult} instances from a transaction plan result tree.\n *\n * This function recursively traverses any nested structure of transaction plan results and extracts\n * all the single results they contain. It's useful when you need to access all the individual\n * transaction results, regardless of their organization in the result tree (parallel or sequential).\n *\n * @param result - The transaction plan result to extract single results from\n * @returns An array of all single transaction plan results contained in the tree\n *\n * @example\n * ```ts\n * const result = parallelTransactionPlanResult([\n * sequentialTransactionPlanResult([resultA, resultB]),\n * nonDivisibleSequentialTransactionPlanResult([resultC, resultD]),\n * resultE,\n * ]);\n *\n * const singleResults = flattenTransactionPlanResult(result);\n * // Array of `SingleTransactionPlanResult` containing:\n * // resultA, resultB, resultC, resultD and resultE.\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link findTransactionPlanResult}\n * @see {@link everyTransactionPlanResult}\n * @see {@link transformTransactionPlanResult}\n */\nexport function flattenTransactionPlanResult(result: TransactionPlanResult): SingleTransactionPlanResult[] {\n if (result.kind === 'single') {\n return [result];\n }\n return result.plans.flatMap(flattenTransactionPlanResult);\n}\n\n/**\n * A {@link SingleTransactionPlanResult} with 'successful' status.\n */\nexport type SuccessfulSingleTransactionPlanResult<\n TContext extends TransactionPlanResultContext = TransactionPlanResultContext,\n> = SingleTransactionPlanResult & { status: { kind: 'successful' } };\n\n/**\n * A {@link SingleTransactionPlanResult} with 'failed' status.\n */\nexport type FailedSingleTransactionPlanResult = SingleTransactionPlanResult & { status: { kind: 'failed' } };\n\n/**\n * A {@link SingleTransactionPlanResult} with 'canceled' status.\n */\nexport type CanceledSingleTransactionPlanResult = SingleTransactionPlanResult & { status: { kind: 'canceled' } };\n\n/**\n * A summary of a {@link TransactionPlanResult}, categorizing transactions by their execution status.\n * - `successful`: Indicates whether all transactions were successful (i.e., no failed or canceled transactions).\n * - `successfulTransactions`: An array of successful transactions, each including its signature.\n * - `failedTransactions`: An array of failed transactions, each including the error that caused the failure.\n * - `canceledTransactions`: An array of canceled transactions.\n */\nexport type TransactionPlanResultSummary = Readonly<{\n canceledTransactions: CanceledSingleTransactionPlanResult[];\n failedTransactions: FailedSingleTransactionPlanResult[];\n successful: boolean;\n successfulTransactions: SuccessfulSingleTransactionPlanResult[];\n}>;\n\n/**\n * Summarize a {@link TransactionPlanResult} into a {@link TransactionPlanResultSummary}.\n * @param result The transaction plan result to summarize\n * @returns A summary of the transaction plan result\n */\nexport function summarizeTransactionPlanResult(result: TransactionPlanResult): TransactionPlanResultSummary {\n const successfulTransactions: TransactionPlanResultSummary['successfulTransactions'] = [];\n const failedTransactions: TransactionPlanResultSummary['failedTransactions'] = [];\n const canceledTransactions: TransactionPlanResultSummary['canceledTransactions'] = [];\n\n const flattenedResults = flattenTransactionPlanResult(result);\n\n for (const singleResult of flattenedResults) {\n switch (singleResult.status.kind) {\n case 'successful': {\n successfulTransactions.push(singleResult as SuccessfulSingleTransactionPlanResult);\n break;\n }\n case 'failed': {\n failedTransactions.push(singleResult as FailedSingleTransactionPlanResult);\n break;\n }\n case 'canceled': {\n canceledTransactions.push(singleResult as CanceledSingleTransactionPlanResult);\n break;\n }\n }\n }\n\n return Object.freeze({\n canceledTransactions,\n failedTransactions,\n successful: failedTransactions.length === 0 && canceledTransactions.length === 0,\n successfulTransactions,\n });\n}\n","import {\n isSolanaError,\n SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SolanaError,\n} from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\nimport { Transaction } from '@solana/transactions';\n\nimport type {\n ParallelTransactionPlan,\n SequentialTransactionPlan,\n SingleTransactionPlan,\n TransactionPlan,\n} from './transaction-plan';\nimport {\n canceledSingleTransactionPlanResult,\n failedSingleTransactionPlanResult,\n parallelTransactionPlanResult,\n sequentialTransactionPlanResult,\n SingleTransactionPlanResult,\n successfulSingleTransactionPlanResult,\n successfulSingleTransactionPlanResultFromSignature,\n type TransactionPlanResult,\n type TransactionPlanResultContext,\n} from './transaction-plan-result';\n\n/**\n * Executes a transaction plan and returns the execution results.\n *\n * This function traverses the transaction plan tree, executing each transaction\n * message and collecting results that mirror the structure of the original plan.\n *\n * @typeParam TContext - The type of the context object that may be passed along with successful results.\n * @param transactionPlan - The transaction plan to execute.\n * @param config - Optional configuration object that can include an `AbortSignal` to cancel execution.\n * @return A promise that resolves to the execution results.\n *\n * @see {@link TransactionPlan}\n * @see {@link TransactionPlanResult}\n * @see {@link createTransactionPlanExecutor}\n */\nexport type TransactionPlanExecutor = (\n transactionPlan: TransactionPlan,\n config?: { abortSignal?: AbortSignal },\n) => Promise>;\n\ntype ExecuteResult = {\n context?: TContext;\n} & ({ signature: Signature } | { transaction: Transaction });\n\ntype ExecuteTransactionMessage = (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n config?: { abortSignal?: AbortSignal },\n) => Promise>;\n\n/**\n * Configuration object for creating a new transaction plan executor.\n *\n * @see {@link createTransactionPlanExecutor}\n */\nexport type TransactionPlanExecutorConfig = {\n /** Called whenever a transaction message must be sent to the blockchain. */\n executeTransactionMessage: ExecuteTransactionMessage;\n};\n\n/**\n * Creates a new transaction plan executor based on the provided configuration.\n *\n * The executor will traverse the provided `TransactionPlan` sequentially or in parallel,\n * executing each transaction message using the `executeTransactionMessage` function.\n *\n * - If that function is successful, the executor will return a successful `TransactionPlanResult`\n * for that message including the transaction and any custom context.\n * - If that function throws an error, the executor will stop processing and cancel all\n * remaining transaction messages in the plan.\n * - If the `abortSignal` is triggered, the executor will immediately stop processing the plan and\n * return a `TransactionPlanResult` with the status set to `canceled`.\n *\n * @param config - Configuration object containing the transaction message executor function.\n * @return A {@link TransactionPlanExecutor} function that can execute transaction plans.\n *\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN}\n * if any transaction in the plan fails to execute. The error context contains a\n * `transactionPlanResult` property with the partial results up to the point of failure.\n * @throws {@link SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED}\n * if the transaction plan contains non-divisible sequential plans, which are not\n * supported by this executor.\n *\n * @example\n * ```ts\n * const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });\n *\n * const transactionPlanExecutor = createTransactionPlanExecutor({\n * executeTransactionMessage: async (message) => {\n * const transaction = await signTransactionMessageWithSigners(message);\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * return { transaction };\n * }\n * });\n * ```\n *\n * @see {@link TransactionPlanExecutorConfig}\n */\nexport function createTransactionPlanExecutor(config: TransactionPlanExecutorConfig): TransactionPlanExecutor {\n return async (plan, { abortSignal } = {}): Promise => {\n const context: TraverseContext = {\n ...config,\n abortSignal: abortSignal,\n canceled: abortSignal?.aborted ?? false,\n };\n\n // Fail early if there are non-divisible sequential plans in the\n // transaction plan as they are not supported by this executor.\n assertDivisibleSequentialPlansOnly(plan);\n\n const cancelHandler = () => {\n context.canceled = true;\n };\n abortSignal?.addEventListener('abort', cancelHandler);\n const transactionPlanResult = await traverse(plan, context);\n abortSignal?.removeEventListener('abort', cancelHandler);\n\n if (context.canceled) {\n const abortReason = abortSignal?.aborted ? abortSignal.reason : undefined;\n const context = { cause: findErrorFromTransactionPlanResult(transactionPlanResult) ?? abortReason };\n // Here we want the `transactionPlanResult` to be available in the error context\n // so applications can create recovery plans but we don't want this object to be\n // serialized with the error. This is why we set it as a non-enumerable property.\n Object.defineProperty(context, 'transactionPlanResult', {\n configurable: false,\n enumerable: false,\n value: transactionPlanResult,\n writable: false,\n });\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN, context);\n }\n\n return transactionPlanResult;\n };\n}\n\ntype TraverseContext = TransactionPlanExecutorConfig & {\n abortSignal?: AbortSignal;\n canceled: boolean;\n};\n\nasync function traverse(transactionPlan: TransactionPlan, context: TraverseContext): Promise {\n const kind = transactionPlan.kind;\n switch (kind) {\n case 'sequential':\n return await traverseSequential(transactionPlan, context);\n case 'parallel':\n return await traverseParallel(transactionPlan, context);\n case 'single':\n return await traverseSingle(transactionPlan, context);\n default:\n transactionPlan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind });\n }\n}\n\nasync function traverseSequential(\n transactionPlan: SequentialTransactionPlan,\n context: TraverseContext,\n): Promise {\n if (!transactionPlan.divisible) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED);\n }\n\n const results: TransactionPlanResult[] = [];\n\n for (const subPlan of transactionPlan.plans) {\n const result = await traverse(subPlan, context);\n results.push(result);\n }\n\n return sequentialTransactionPlanResult(results);\n}\n\nasync function traverseParallel(\n transactionPlan: ParallelTransactionPlan,\n context: TraverseContext,\n): Promise {\n const results = await Promise.all(transactionPlan.plans.map(plan => traverse(plan, context)));\n return parallelTransactionPlanResult(results);\n}\n\nasync function traverseSingle(\n transactionPlan: SingleTransactionPlan,\n context: TraverseContext,\n): Promise {\n if (context.canceled) {\n return canceledSingleTransactionPlanResult(transactionPlan.message);\n }\n\n try {\n const result = await getAbortablePromise(\n context.executeTransactionMessage(transactionPlan.message, { abortSignal: context.abortSignal }),\n context.abortSignal,\n );\n if ('transaction' in result) {\n return successfulSingleTransactionPlanResult(transactionPlan.message, result.transaction, result.context);\n } else {\n return successfulSingleTransactionPlanResultFromSignature(\n transactionPlan.message,\n result.signature,\n result.context,\n );\n }\n } catch (error) {\n context.canceled = true;\n return failedSingleTransactionPlanResult(transactionPlan.message, error as Error);\n }\n}\n\nfunction findErrorFromTransactionPlanResult(result: TransactionPlanResult): Error | undefined {\n if (result.kind === 'single') {\n return result.status.kind === 'failed' ? result.status.error : undefined;\n }\n for (const plan of result.plans) {\n const error = findErrorFromTransactionPlanResult(plan);\n if (error) {\n return error;\n }\n }\n}\n\nfunction assertDivisibleSequentialPlansOnly(transactionPlan: TransactionPlan): void {\n const kind = transactionPlan.kind;\n switch (kind) {\n case 'sequential':\n if (!transactionPlan.divisible) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__NON_DIVISIBLE_TRANSACTION_PLANS_NOT_SUPPORTED);\n }\n for (const subPlan of transactionPlan.plans) {\n assertDivisibleSequentialPlansOnly(subPlan);\n }\n return;\n case 'parallel':\n for (const subPlan of transactionPlan.plans) {\n assertDivisibleSequentialPlansOnly(subPlan);\n }\n return;\n case 'single':\n default:\n return;\n }\n}\n\n/**\n * Wraps a transaction plan execution promise to return a\n * {@link TransactionPlanResult} even on execution failure.\n *\n * When a transaction plan executor throws a\n * {@link SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN}\n * error, this helper catches it and returns the `TransactionPlanResult`\n * from the error context instead of throwing.\n *\n * This allows us to handle the result of an execution in a single unified way\n * instead of using try/catch and examine the `TransactionPlanResult` in both\n * success and failure cases.\n *\n * Any other errors are re-thrown as normal.\n *\n * @param promise - A promise returned by a transaction plan executor.\n * @return A promise that resolves to the transaction plan result, even if some transactions failed.\n *\n * @example\n * Handling failures using a single result object:\n * ```ts\n * const result = await passthroughFailedTransactionPlanExecution(\n * transactionPlanExecutor(transactionPlan)\n * );\n *\n * const summary = summarizeTransactionPlanResult(result);\n * if (summary.successful) {\n * console.log('All transactions executed successfully');\n * } else {\n * console.log(`${summary.successfulTransactions.length} succeeded`);\n * console.log(`${summary.failedTransactions.length} failed`);\n * console.log(`${summary.canceledTransactions.length} canceled`);\n * }\n * ```\n *\n * @see {@link TransactionPlanResult}\n * @see {@link createTransactionPlanExecutor}\n * @see {@link summarizeTransactionPlanResult}\n */\nexport async function passthroughFailedTransactionPlanExecution(\n promise: Promise,\n): Promise;\nexport async function passthroughFailedTransactionPlanExecution(\n promise: Promise,\n): Promise;\nexport async function passthroughFailedTransactionPlanExecution(\n promise: Promise,\n): Promise {\n try {\n return await promise;\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__FAILED_TO_EXECUTE_TRANSACTION_PLAN)) {\n return error.context.transactionPlanResult as TransactionPlanResult;\n }\n throw error;\n }\n}\n","import {\n isSolanaError,\n SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN,\n SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND,\n SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND,\n SolanaError,\n} from '@solana/errors';\nimport { getAbortablePromise } from '@solana/promises';\nimport {\n appendTransactionMessageInstructions,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\nimport { getTransactionMessageSize, TRANSACTION_SIZE_LIMIT } from '@solana/transactions';\n\nimport {\n InstructionPlan,\n MessagePackerInstructionPlan,\n ParallelInstructionPlan,\n SequentialInstructionPlan,\n SingleInstructionPlan,\n} from './instruction-plan';\nimport {\n flattenTransactionPlan,\n nonDivisibleSequentialTransactionPlan,\n parallelTransactionPlan,\n sequentialTransactionPlan,\n SingleTransactionPlan,\n singleTransactionPlan,\n TransactionPlan,\n} from './transaction-plan';\n\n/**\n * Plans one or more transactions according to the provided instruction plan.\n *\n * @param instructionPlan - The instruction plan to be planned and executed.\n * @param config - Optional configuration object that can include an `AbortSignal` to cancel the planning process.\n *\n * @see {@link InstructionPlan}\n * @see {@link TransactionPlan}\n */\nexport type TransactionPlanner = (\n instructionPlan: InstructionPlan,\n config?: { abortSignal?: AbortSignal },\n) => Promise;\n\ntype Mutable = { -readonly [P in keyof T]: T[P] };\n\ntype CreateTransactionMessage = (config?: {\n abortSignal?: AbortSignal;\n}) =>\n | Promise\n | (TransactionMessage & TransactionMessageWithFeePayer);\n\ntype OnTransactionMessageUpdated = (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n config?: { abortSignal?: AbortSignal },\n) =>\n | Promise\n | (TransactionMessage & TransactionMessageWithFeePayer);\n\n/**\n * Configuration object for creating a new transaction planner.\n *\n * @see {@link createTransactionPlanner}\n */\nexport type TransactionPlannerConfig = {\n /** Called whenever a new transaction message is needed. */\n createTransactionMessage: CreateTransactionMessage;\n /**\n * Called whenever a transaction message is updated — e.g. new instructions were added.\n * This function must return the updated transaction message back — even if no changes were made.\n */\n onTransactionMessageUpdated?: OnTransactionMessageUpdated;\n};\n\n/**\n * Creates a new transaction planner based on the provided configuration.\n *\n * At the very least, the `createTransactionMessage` function must be provided.\n * This function is used to create new transaction messages whenever needed.\n *\n * Additionally, the `onTransactionMessageUpdated` function can be provided\n * to update transaction messages during the planning process. This function will\n * be called whenever a transaction message is updated, e.g. when new instructions\n * are added to a transaction message. It accepts the updated transaction message\n * and must return a transaction message back, even if no changes were made.\n *\n * @example\n * ```ts\n * const transactionPlanner = createTransactionPlanner({\n * createTransactionMessage: () => pipe(\n * createTransactionMessage({ version: 0 }),\n * message => setTransactionMessageFeePayerSigner(mySigner, message),\n * )\n * });\n * ```\n *\n * @see {@link TransactionPlannerConfig}\n */\nexport function createTransactionPlanner(config: TransactionPlannerConfig): TransactionPlanner {\n return async (instructionPlan, { abortSignal } = {}): Promise => {\n const plan = await traverse(instructionPlan, {\n abortSignal,\n createTransactionMessage: config.createTransactionMessage,\n onTransactionMessageUpdated: config.onTransactionMessageUpdated ?? (msg => msg),\n parent: null,\n parentCandidates: [],\n });\n\n if (!plan) {\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__EMPTY_INSTRUCTION_PLAN);\n }\n\n return freezeTransactionPlan(plan);\n };\n}\n\ntype MutableTransactionPlan = Mutable;\ntype MutableSingleTransactionPlan = Mutable;\n\ntype TraverseContext = {\n abortSignal?: AbortSignal;\n createTransactionMessage: CreateTransactionMessage;\n onTransactionMessageUpdated: OnTransactionMessageUpdated;\n parent: InstructionPlan | null;\n parentCandidates: MutableSingleTransactionPlan[];\n};\n\nasync function traverse(\n instructionPlan: InstructionPlan,\n context: TraverseContext,\n): Promise {\n context.abortSignal?.throwIfAborted();\n const kind = instructionPlan.kind;\n switch (kind) {\n case 'sequential':\n return await traverseSequential(instructionPlan, context);\n case 'parallel':\n return await traverseParallel(instructionPlan, context);\n case 'single':\n return await traverseSingle(instructionPlan, context);\n case 'messagePacker':\n return await traverseMessagePacker(instructionPlan, context);\n default:\n instructionPlan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind });\n }\n}\n\nasync function traverseSequential(\n instructionPlan: SequentialInstructionPlan,\n context: TraverseContext,\n): Promise {\n let candidate: MutableSingleTransactionPlan | null = null;\n\n // Check if the sequential plan must fit entirely in its parent candidates\n // due to constraints like being inside a parallel plan or not being divisible.\n const mustEntirelyFitInParentCandidate =\n context.parent && (context.parent.kind === 'parallel' || !instructionPlan.divisible);\n\n // If so, try to fit the entire plan inside one of the parent candidates.\n if (mustEntirelyFitInParentCandidate) {\n const candidate = await selectAndMutateCandidate(context, context.parentCandidates, message =>\n fitEntirePlanInsideMessage(instructionPlan, message),\n );\n // If that's possible, we the candidate is mutated and we can return null.\n // Otherwise, we proceed with the normal traversal and no parent candidate.\n if (candidate) {\n return null;\n }\n } else {\n // Otherwise, we can use the first parent candidate, if any,\n // since we know it must be a divisible sequential plan.\n candidate = context.parentCandidates.length > 0 ? context.parentCandidates[0] : null;\n }\n\n const transactionPlans: TransactionPlan[] = [];\n for (const plan of instructionPlan.plans) {\n const transactionPlan = await traverse(plan, {\n ...context,\n parent: instructionPlan,\n parentCandidates: candidate ? [candidate] : [],\n });\n if (transactionPlan) {\n candidate = getSequentialCandidate(transactionPlan);\n const newPlans =\n transactionPlan.kind === 'sequential' && (transactionPlan.divisible || !instructionPlan.divisible)\n ? transactionPlan.plans\n : [transactionPlan];\n transactionPlans.push(...newPlans);\n }\n }\n\n // Wrap in a sequential plan or simplify.\n if (transactionPlans.length === 1) {\n return transactionPlans[0];\n }\n if (transactionPlans.length === 0) {\n return null;\n }\n return {\n divisible: instructionPlan.divisible,\n kind: 'sequential',\n plans: transactionPlans,\n };\n}\n\nasync function traverseParallel(\n instructionPlan: ParallelInstructionPlan,\n context: TraverseContext,\n): Promise {\n const candidates: MutableSingleTransactionPlan[] = [...context.parentCandidates];\n const transactionPlans: TransactionPlan[] = [];\n\n // Reorder children so message packer plans are last.\n const sortedChildren = Array.from(instructionPlan.plans).sort(\n (a, b) => Number(a.kind === 'messagePacker') - Number(b.kind === 'messagePacker'),\n );\n\n for (const plan of sortedChildren) {\n const transactionPlan = await traverse(plan, {\n ...context,\n parent: instructionPlan,\n parentCandidates: candidates,\n });\n if (transactionPlan) {\n candidates.push(...getParallelCandidates(transactionPlan));\n const newPlans = transactionPlan.kind === 'parallel' ? transactionPlan.plans : [transactionPlan];\n transactionPlans.push(...newPlans);\n }\n }\n\n // Wrap in a parallel plan or simplify.\n if (transactionPlans.length === 1) {\n return transactionPlans[0];\n }\n if (transactionPlans.length === 0) {\n return null;\n }\n return { kind: 'parallel', plans: transactionPlans };\n}\n\nasync function traverseSingle(\n instructionPlan: SingleInstructionPlan,\n context: TraverseContext,\n): Promise {\n const predicate = (message: TransactionMessage & TransactionMessageWithFeePayer) =>\n appendTransactionMessageInstructions([instructionPlan.instruction], message);\n const candidate = await selectAndMutateCandidate(context, context.parentCandidates, predicate);\n if (candidate) {\n return null;\n }\n const message = await createNewMessage(context, predicate);\n return { kind: 'single', message };\n}\n\nasync function traverseMessagePacker(\n instructionPlan: MessagePackerInstructionPlan,\n context: TraverseContext,\n): Promise {\n const messagePacker = instructionPlan.getMessagePacker();\n const transactionPlans: SingleTransactionPlan[] = [];\n const candidates = [...context.parentCandidates];\n\n while (!messagePacker.done()) {\n const candidate = await selectAndMutateCandidate(context, candidates, messagePacker.packMessageToCapacity);\n if (!candidate) {\n const message = await createNewMessage(context, messagePacker.packMessageToCapacity);\n const newPlan: MutableSingleTransactionPlan = { kind: 'single', message };\n transactionPlans.push(newPlan);\n }\n }\n\n if (transactionPlans.length === 1) {\n return transactionPlans[0];\n }\n if (transactionPlans.length === 0) {\n return null;\n }\n if (context.parent?.kind === 'parallel') {\n return { kind: 'parallel', plans: transactionPlans };\n }\n return {\n divisible: context.parent?.kind === 'sequential' ? context.parent.divisible : true,\n kind: 'sequential',\n plans: transactionPlans,\n };\n}\n\nfunction getSequentialCandidate(latestPlan: MutableTransactionPlan): MutableSingleTransactionPlan | null {\n if (latestPlan.kind === 'single') {\n return latestPlan;\n }\n if (latestPlan.kind === 'sequential' && latestPlan.plans.length > 0) {\n return getSequentialCandidate(latestPlan.plans[latestPlan.plans.length - 1]);\n }\n return null;\n}\n\nfunction getParallelCandidates(latestPlan: TransactionPlan): MutableSingleTransactionPlan[] {\n return flattenTransactionPlan(latestPlan);\n}\n\nasync function selectAndMutateCandidate(\n context: Pick,\n candidates: MutableSingleTransactionPlan[],\n predicate: (\n message: TransactionMessage & TransactionMessageWithFeePayer,\n ) => TransactionMessage & TransactionMessageWithFeePayer,\n): Promise {\n for (const candidate of candidates) {\n try {\n const message = await getAbortablePromise(\n Promise.resolve(\n context.onTransactionMessageUpdated(predicate(candidate.message), {\n abortSignal: context.abortSignal,\n }),\n ),\n context.abortSignal,\n );\n if (getTransactionMessageSize(message) <= TRANSACTION_SIZE_LIMIT) {\n candidate.message = message;\n return candidate;\n }\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN)) {\n // Try the next candidate.\n } else {\n throw error;\n }\n }\n }\n return null;\n}\n\nasync function createNewMessage(\n context: Pick,\n predicate: (\n message: TransactionMessage & TransactionMessageWithFeePayer,\n ) => TransactionMessage & TransactionMessageWithFeePayer,\n): Promise {\n const newMessage = await getAbortablePromise(\n Promise.resolve(context.createTransactionMessage({ abortSignal: context.abortSignal })),\n context.abortSignal,\n );\n const updatedMessage = await getAbortablePromise(\n Promise.resolve(\n context.onTransactionMessageUpdated(predicate(newMessage), { abortSignal: context.abortSignal }),\n ),\n context.abortSignal,\n );\n const updatedMessageSize = getTransactionMessageSize(updatedMessage);\n if (updatedMessageSize > TRANSACTION_SIZE_LIMIT) {\n const newMessageSize = getTransactionMessageSize(newMessage);\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, {\n numBytesRequired: updatedMessageSize - newMessageSize,\n numFreeBytes: TRANSACTION_SIZE_LIMIT - newMessageSize,\n });\n }\n return updatedMessage;\n}\n\nfunction freezeTransactionPlan(plan: MutableTransactionPlan): TransactionPlan {\n const kind = plan.kind;\n switch (kind) {\n case 'single':\n return singleTransactionPlan(plan.message);\n case 'sequential':\n return plan.divisible\n ? sequentialTransactionPlan(plan.plans.map(freezeTransactionPlan))\n : nonDivisibleSequentialTransactionPlan(plan.plans.map(freezeTransactionPlan));\n case 'parallel':\n return parallelTransactionPlan(plan.plans.map(freezeTransactionPlan));\n default:\n plan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND, { kind });\n }\n}\n\nfunction fitEntirePlanInsideMessage(\n instructionPlan: InstructionPlan,\n message: TransactionMessage & TransactionMessageWithFeePayer,\n): TransactionMessage & TransactionMessageWithFeePayer {\n let newMessage: TransactionMessage & TransactionMessageWithFeePayer = message;\n\n const kind = instructionPlan.kind;\n switch (kind) {\n case 'sequential':\n case 'parallel':\n for (const plan of instructionPlan.plans) {\n newMessage = fitEntirePlanInsideMessage(plan, newMessage);\n }\n return newMessage;\n case 'single':\n newMessage = appendTransactionMessageInstructions([instructionPlan.instruction], message);\n // eslint-disable-next-line no-case-declarations\n const newMessageSize = getTransactionMessageSize(newMessage);\n if (newMessageSize > TRANSACTION_SIZE_LIMIT) {\n const baseMessageSize = getTransactionMessageSize(message);\n throw new SolanaError(SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN, {\n numBytesRequired: newMessageSize - baseMessageSize,\n numFreeBytes: TRANSACTION_SIZE_LIMIT - baseMessageSize,\n });\n }\n return newMessage;\n case 'messagePacker':\n // eslint-disable-next-line no-case-declarations\n const messagePacker = instructionPlan.getMessagePacker();\n while (!messagePacker.done()) {\n newMessage = messagePacker.packMessageToCapacity(newMessage);\n }\n return newMessage;\n default:\n instructionPlan satisfies never;\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND, { kind });\n }\n}\n","import { assertIsAddress, isAddress } from '@solana/addresses';\nimport {\n isSolanaError,\n SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH,\n SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n SolanaError,\n} from '@solana/errors';\nimport { Brand, EncodedString } from '@solana/nominal-types';\n\n/**\n * A 32-byte array identifying the application requesting off-chain message signing.\n *\n * This may be any arbitrary bytes. For instance the on-chain address of a program, DAO instance,\n * Candy Machine, et cetera.\n *\n * This field SHOULD be displayed to users as a base58-encoded ASCII string rather than interpreted\n * otherwise.\n */\nexport type OffchainMessageApplicationDomain = Brand<\n EncodedString,\n 'OffchainMessageApplicationDomain'\n>;\n\n/**\n * A type guard that returns `true` if the input string conforms to the\n * {@link OffchainMessageApplicationDomain} type, and refines its type for use in your program.\n *\n * @example\n * ```ts\n * import { isOffchainMessageApplicationDomain, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * if (isOffchainMessageApplicationDomain(applicationDomain)) {\n * // At this point, `applicationDomain` has been refined to an\n * // `OffchainMessageApplcationDomain` that can be used to craft a message.\n * const offchainMessage: OffchainMessageV0 = {\n * applicationDomain:\n * offchainMessageApplicationDomain('HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx'),\n * // ...\n * };\n * } else {\n * setError(`${applicationDomain} is not a valid application domain for an offchain message`);\n * }\n * ```\n */\nexport function isOffchainMessageApplicationDomain(\n putativeApplicationDomain: string,\n): putativeApplicationDomain is OffchainMessageApplicationDomain {\n return isAddress(putativeApplicationDomain);\n}\n\n/**\n * From time to time you might acquire a string, that you expect to validate as an offchain message\n * application domain, from an untrusted network API or user input. Use this function to assert that\n * such an arbitrary string is a base58-encoded application domain.\n *\n * @example\n * ```ts\n * import { assertIsOffchainMessageApplicationDomain, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * // Imagine a function that determines whether an application domain is valid.\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const applicationDomain: string = applicationDomainInput.value;\n * try {\n * // If this type assertion function doesn't throw, then\n * // Typescript will upcast `applicationDomain` to `OffchainMessageApplicationDomain`.\n * assertIsOffchainMessageApplicationDomain(applicationDomain);\n * // At this point, `applicationDomain` is a `OffchainMessageApplicationDomain` that can be\n * // used to craft an offchain message.\n * const offchainMessage: OffchainMessageV0 = {\n * applicationDomain:\n * offchainMessageApplicationDomain('HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx'),\n * // ...\n * };\n * } catch (e) {\n * // `applicationDomain` turned out not to be a base58-encoded application domain\n * }\n * }\n * ```\n */\nexport function assertIsOffchainMessageApplicationDomain(\n putativeApplicationDomain: string,\n): asserts putativeApplicationDomain is OffchainMessageApplicationDomain {\n try {\n assertIsAddress(putativeApplicationDomain);\n } catch (error) {\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE)) {\n throw new SolanaError(\n SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,\n error.context,\n );\n }\n if (isSolanaError(error, SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH)) {\n throw new SolanaError(\n SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,\n error.context,\n );\n }\n throw error;\n }\n}\n\n/**\n * Combines _asserting_ that a string is an offchain message application domain with _coercing_ it\n * to the {@link OffchainMessageApplicationDomain} type. It's most useful with untrusted input.\n *\n * @example\n * ```ts\n * import { offchainMessageApplicationDomain, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * const offchainMessage: OffchainMessageV0 = {\n * applicationDomain:\n * offchainMessageApplicationDomain('HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx'),\n * // ...\n * };\n * ```\n *\n * > [!TIP]\n * > When starting from a known-good application domain as a string, it's more efficient to typecast\n * > it rather than to use the {@link offchainMessageApplicationDomain} helper, because the helper\n * > unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageApplicationDomain } from '@solana/offchain-messages';\n * >\n * > const applicationDomain =\n * > 'HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx' as OffchainMessageApplicationDomain;\n * > ```\n */\nexport function offchainMessageApplicationDomain(putativeApplicationDomain: string): OffchainMessageApplicationDomain {\n assertIsOffchainMessageApplicationDomain(putativeApplicationDomain);\n return putativeApplicationDomain;\n}\n","import { Address, getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n transformEncoder,\n} from '@solana/codecs-core';\n\nimport { OffchainMessageApplicationDomain, offchainMessageApplicationDomain } from '../application-domain';\n\n/**\n * Returns an encoder that you can use to encode a base58-encoded offchain message application\n * domain to a byte array.\n *\n * @example\n * ```ts\n * import { getOffchainMessageApplicationDomainEncoder } from '@solana/offchain-messages';\n *\n * const offchainMessageApplicationDomain =\n * 'HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx' as OffchainMessageApplicationDomain;\n * const offchainMessageApplicationDomainEncoder = getOffchainMessageApplicationDomainEncoder();\n * const offchainMessageApplicationDomainBytes =\n * offchainMessageApplicationDomainEncoder.encode(offchainMessageApplicationDomain);\n * // Uint8Array(32) [\n * // 247, 203, 28, 80, 52, 240, 169, 19,\n * // 21, 103, 107, 119, 91, 235, 13, 48,\n * // 194, 169, 148, 160, 78, 105, 235, 37,\n * // 232, 160, 49, 47, 64, 89, 18, 153,\n * // ]\n * ```\n */\nexport function getOffchainMessageApplicationDomainEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getAddressEncoder(),\n putativeApplicationDomain => offchainMessageApplicationDomain(putativeApplicationDomain) as string as Address,\n );\n}\n\n/**\n * Returns a decoder that you can use to convert an array of 32 bytes representing an offchain\n * message application domain to the base58-encoded representation of that application domain.\n *\n * @example\n * ```ts\n * import { getOffchainMessageApplicationDomainDecoder } from '@solana/offchain-messages';\n *\n * const offchainMessageApplicationDomainBytes = new Uint8Array([\n * 247, 203, 28, 80, 52, 240, 169, 19,\n * 21, 103, 107, 119, 91, 235, 13, 48,\n * 194, 169, 148, 160, 78, 105, 235, 37,\n * 232, 160, 49, 47, 64, 89, 18, 153,\n * ]);\n * const offchainMessageApplicationDomainDecoder = getOffchainMessageApplicationDomainDecoder();\n * const offchainMessageApplicationDomain =\n * offchainMessageApplicationDomainDecoder.decode(offchainMessageApplicationDomainBytes);\n * // HgHLLXT3BVA5m7x66tEp3YNatXLth1hJwVeCva2T9RNx\n * ```\n */\nexport function getOffchainMessageApplicationDomainDecoder(): FixedSizeDecoder {\n return getAddressDecoder() as FixedSizeDecoder as FixedSizeDecoder<\n OffchainMessageApplicationDomain,\n 32\n >;\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to a base-58 encoded offchain message\n * application domain.\n *\n * @see {@link getOffchainMessageApplicationDomainDecoder}\n * @see {@link getOffchainMessageApplicationDomainEncoder}\n */\nexport function getOffchainMessageApplicationDomainCodec(): FixedSizeCodec<\n OffchainMessageApplicationDomain,\n OffchainMessageApplicationDomain,\n 32\n> {\n return combineCodec(getOffchainMessageApplicationDomainEncoder(), getOffchainMessageApplicationDomainDecoder());\n}\n","import {\n combineCodec,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n ReadonlyUint8Array,\n} from '@solana/codecs-core';\nimport { getConstantDecoder, getConstantEncoder } from '@solana/codecs-data-structures';\n\n// The string `'\\xffsolana offchain'`\nconst OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES: ReadonlyUint8Array = new Uint8Array([\n 0xff, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x6f, 0x66, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e,\n]);\n\nexport function getOffchainMessageSigningDomainDecoder(): FixedSizeDecoder {\n return getConstantDecoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES) as FixedSizeDecoder;\n}\n\nexport function getOffchainMessageSigningDomainEncoder(): FixedSizeEncoder {\n return getConstantEncoder(OFFCHAIN_MESSAGE_SIGNING_DOMAIN_BYTES) as FixedSizeEncoder;\n}\n\nexport function getOffchainMessageSigningDomainCodec(): FixedSizeCodec {\n return combineCodec(getOffchainMessageSigningDomainEncoder(), getOffchainMessageSigningDomainDecoder());\n}\n","import { Address, getAddressDecoder } from '@solana/addresses';\nimport {\n FixedSizeDecoder,\n FixedSizeEncoder,\n offsetDecoder,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getBytesDecoder,\n getHiddenPrefixDecoder,\n getHiddenPrefixEncoder,\n getStructDecoder,\n getStructEncoder,\n} from '@solana/codecs-data-structures';\nimport { getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,\n SolanaError,\n} from '@solana/errors';\n\nimport { OffchainMessageVersion } from '../version';\nimport { getOffchainMessageSigningDomainDecoder, getOffchainMessageSigningDomainEncoder } from './signing-domain';\n\ntype TDecoderFields = Parameters[0];\ntype TEncoderFields = Parameters[0];\n\nfunction getSigningDomainPrefixedDecoder(...fields: T) {\n return getHiddenPrefixDecoder(getStructDecoder(fields), [getOffchainMessageSigningDomainDecoder()]);\n}\n\nfunction getSigningDomainPrefixedEncoder(...fields: T) {\n return getHiddenPrefixEncoder(getStructEncoder(fields), [getOffchainMessageSigningDomainEncoder()]);\n}\n\nfunction getVersionTransformer(fixedVersion?: OffchainMessageVersion) {\n return (version: number) => {\n if (version > 1) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version,\n });\n }\n if (fixedVersion != null && version !== fixedVersion) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__UNEXPECTED_VERSION, {\n actualVersion: version,\n expectedVersion: fixedVersion,\n });\n }\n return version;\n };\n}\n\nexport function createOffchainMessagePreambleDecoder<\n const TVersion extends OffchainMessageVersion,\n const TFields extends TDecoderFields,\n>(version: TVersion, ...fields: TFields) {\n return getSigningDomainPrefixedDecoder(\n ['version', transformDecoder(getU8Decoder(), getVersionTransformer(version)) as FixedSizeDecoder],\n ...fields,\n );\n}\n\nexport function createOffchainMessagePreambleEncoder<\n const TVersion extends OffchainMessageVersion,\n const TFields extends TEncoderFields,\n>(version: TVersion, ...fields: TFields) {\n return getSigningDomainPrefixedEncoder(\n ['version', transformEncoder(getU8Encoder(), getVersionTransformer(version)) as FixedSizeEncoder],\n ...fields,\n );\n}\n\nexport function decodeRequiredSignatoryAddresses(bytes: ReadonlyUint8Array): readonly Address[] {\n const { version, bytesAfterVersion } = getSigningDomainPrefixedDecoder(\n ['version', transformDecoder(getU8Decoder(), getVersionTransformer())],\n ['bytesAfterVersion', getBytesDecoder()],\n ).decode(bytes);\n return offsetDecoder(\n transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), signatoryAddresses => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n return signatoryAddresses;\n }),\n {\n preOffset: ({ preOffset }) =>\n preOffset +\n (version === 0\n ? 32 + 1 // skip the application domain and message format of v0 messages\n : 0),\n },\n ).decode(bytesAfterVersion);\n}\n\nexport function getSignatoriesComparator(): (a: ReadonlyUint8Array, b: ReadonlyUint8Array) => -1 | 0 | 1 {\n return (x, y) => {\n if (x.length !== y.length) {\n return x.length < y.length ? -1 : 1;\n }\n for (let ii = 0; ii < x.length; ii++) {\n if (x[ii] === y[ii]) {\n continue;\n } else {\n return x[ii] < y[ii] ? -1 : 1;\n }\n }\n return 0;\n };\n}\n","import { fixEncoderSize, transformEncoder, VariableSizeEncoder } from '@solana/codecs-core';\nimport { getArrayEncoder, getBytesEncoder } from '@solana/codecs-data-structures';\nimport { getU8Encoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { OffchainMessageEnvelope } from '../envelope';\n\nfunction getSignaturesToEncode(signaturesMap: OffchainMessageEnvelope['signatures']): SignatureBytes[] {\n const signatures = Object.values(signaturesMap);\n if (signatures.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO);\n }\n\n return signatures.map(signature => {\n if (!signature) {\n return new Uint8Array(64).fill(0) as SignatureBytes;\n }\n return signature;\n });\n}\n\nexport function getSignaturesEncoder(): VariableSizeEncoder {\n return transformEncoder(\n getArrayEncoder(fixEncoderSize(getBytesEncoder(), 64), { size: getU8Encoder() }),\n getSignaturesToEncode,\n );\n}\n","import { Address, address } from '@solana/addresses';\nimport {\n combineCodec,\n fixDecoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport {\n getArrayDecoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n} from '@solana/codecs-data-structures';\nimport { getU8Decoder } from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,\n SolanaError,\n} from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { OffchainMessageEnvelope } from '../envelope';\nimport { OffchainMessageBytes } from '../message';\nimport { decodeRequiredSignatoryAddresses } from './preamble-common';\nimport { getSignaturesEncoder } from './signatures';\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessageEnvelope} to a byte array\n * appropriate for sharing with a third party for validation.\n */\nexport function getOffchainMessageEnvelopeEncoder(): VariableSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['signatures', getSignaturesEncoder()],\n ['content', getBytesEncoder()],\n ]),\n envelope => {\n const signaturesMapAddresses = Object.keys(envelope.signatures).map(address);\n if (signaturesMapAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO);\n }\n const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(envelope.content);\n const missingRequiredSigners = [];\n const unexpectedSigners = [];\n for (const address of signatoryAddresses) {\n if (!signaturesMapAddresses.includes(address)) {\n missingRequiredSigners.push(address);\n }\n }\n for (const address of signaturesMapAddresses) {\n if (!signatoryAddresses.includes(address)) {\n unexpectedSigners.push(address);\n }\n }\n if (missingRequiredSigners.length || unexpectedSigners.length) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH, {\n missingRequiredSigners,\n unexpectedSigners,\n });\n }\n const orderedSignatureMap: OffchainMessageEnvelope['signatures'] = {};\n for (const address of signatoryAddresses) {\n orderedSignatureMap[address] = envelope.signatures[address];\n }\n return {\n ...envelope,\n signatures: orderedSignatureMap,\n };\n },\n );\n}\n\n/**\n * Returns a decoder that you can use to convert a byte array in the Solana offchain message format\n * to a {@link OffchainMessageEnvelope} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageEnvelopeDecoder } from '@solana/offchain-messages';\n *\n * const offchainMessageEnvelopeDecoder = getOffchainMessageEnvelopeDecoder();\n * const offchainMessageEnvelope = offchainMessageEnvelopeDecoder.decode(offchainMessageEnvelopeBytes);\n * for (const [address, signature] in Object.entries(offchainMessageEnvelope.signatures)) {\n * console.log(`Signature by ${address}`, signature);\n * }\n * ```\n */\nexport function getOffchainMessageEnvelopeDecoder(): VariableSizeDecoder {\n return transformDecoder(\n getStructDecoder([\n ['signatures', getArrayDecoder(fixDecoderSize(getBytesDecoder(), 64), { size: getU8Decoder() })],\n ['content', getBytesDecoder()],\n ]),\n decodePartiallyDecodedOffchainMessageEnvelope,\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessageEnvelope}\n *\n * @see {@link getOffchainMessageEnvelopeDecoder}\n * @see {@link getOffchainMessageEnvelopeEncoder}\n */\nexport function getOffchainMessageEnvelopeCodec() {\n return combineCodec(getOffchainMessageEnvelopeEncoder(), getOffchainMessageEnvelopeDecoder());\n}\n\ntype PartiallyDecodedOffchainMessageEnvelope = {\n content: ReadonlyUint8Array;\n signatures: ReadonlyUint8Array[];\n};\n\nfunction decodePartiallyDecodedOffchainMessageEnvelope(\n offchainMessageEnvelope: PartiallyDecodedOffchainMessageEnvelope,\n): OffchainMessageEnvelope {\n const { content, signatures } = offchainMessageEnvelope;\n\n if (signatures.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO);\n }\n\n const signatoryAddresses = decodeAndValidateRequiredSignatoryAddresses(content);\n\n // Signer addresses and signatures must be the same length\n // We encode an all-zero signature when the signature is missing\n if (signatoryAddresses.length !== signatures.length) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH, {\n numRequiredSignatures: signatoryAddresses.length,\n signatoryAddresses,\n signaturesLength: signatures.length,\n });\n }\n\n // Combine the signer addresses + signatures into the signatures map\n const signaturesMap: OffchainMessageEnvelope['signatures'] = {};\n signatoryAddresses.forEach((address, index) => {\n const signatureForAddress = signatures[index];\n if (signatureForAddress.every(b => b === 0)) {\n signaturesMap[address] = null;\n } else {\n signaturesMap[address] = signatureForAddress as SignatureBytes;\n }\n });\n\n return Object.freeze({\n content: content as OffchainMessageBytes,\n signatures: Object.freeze(signaturesMap),\n });\n}\n\nfunction decodeAndValidateRequiredSignatoryAddresses(bytes: ReadonlyUint8Array): readonly Address[] {\n const signatoryAddresses = decodeRequiredSignatoryAddresses(bytes);\n\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n\n return signatoryAddresses;\n}\n","import { getUtf8Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\n\nconst MAX_BODY_BYTES =\n // Largest 16-bit unsigned integer\n 0xffff;\nconst MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE =\n // Space remaining in the mininum IPv6 MTU after network header overhead\n 1232;\n\n/**\n * A restriction on what characters the message text can contain and how long it can be.\n *\n * The aim of this restriction is to make a message more likely to be signable by a hardware wallet\n * that imposes limits on message size. In the case of wanting a message to be clear-signable,\n * restricting the character set to ASCII may ensure that certain models of hardware wallet without\n * extended character sets can display it onscreen.\n *\n * @remarks This only applies to v0 messages.\n */\nexport enum OffchainMessageContentFormat {\n RESTRICTED_ASCII_1232_BYTES_MAX = 0,\n UTF8_1232_BYTES_MAX = 1,\n UTF8_65535_BYTES_MAX = 2,\n}\n\n/**\n * Describes message text that is no more than 1232 bytes long and made up of characters with ASCII\n * character codes in the range [0x20, 0x7e].\n *\n * @remarks This type aims to restrict text to that which can be clear-signed by hardware wallets\n * that can only display ASCII characters onscreen.\n */\nexport type OffchainMessageContentRestrictedAsciiOf1232BytesMax = Readonly<{\n format: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX;\n text: Brand;\n}>;\n\n/**\n * Describes message text that is no more than 1232 bytes long and mdae up of any UTF-8 characters.\n */\nexport type OffchainMessageContentUtf8Of1232BytesMax = Readonly<{\n format: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX;\n text: Brand;\n}>;\n\n/**\n * Describes message text that is no more than 65535 bytes long and mdae up of any UTF-8 characters.\n */\nexport type OffchainMessageContentUtf8Of65535BytesMax = Readonly<{\n format: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX;\n text: Brand;\n}>;\n\nexport type OffchainMessageContent =\n | OffchainMessageContentRestrictedAsciiOf1232BytesMax\n | OffchainMessageContentUtf8Of1232BytesMax\n | OffchainMessageContentUtf8Of65535BytesMax;\n\n/**\n * In the event that you receive content of a v0 offchain message from an untrusted source, use this\n * function to assert that it conforms to the\n * {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type.\n *\n * @see {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): asserts putativeContent is OffchainMessageContentRestrictedAsciiOf1232BytesMax {\n if (putativeContent.format !== OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, {\n actualMessageFormat: putativeContent.format,\n expectedMessageFormat: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX,\n });\n }\n if (putativeContent.text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n if (isTextRestrictedAscii(putativeContent.text) === false) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE);\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, {\n actualBytes: length,\n maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE,\n });\n }\n}\n\n/**\n * A type guard that returns `true` when supplied content of a v0 offchain message that conforms to\n * the {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type, and refines its type for use in your\n * program.\n *\n * @see {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} for more detail.\n */\nexport function isOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): putativeContent is OffchainMessageContentRestrictedAsciiOf1232BytesMax {\n if (\n putativeContent.format !== OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX ||\n putativeContent.text.length === 0 ||\n isTextRestrictedAscii(putativeContent.text) === false\n ) {\n return false;\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE;\n}\n\n/**\n * Combines _asserting_ that the content of a v0 offchain message is restricted ASCII with\n * _coercing_ it to the {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type. It's most\n * useful with untrusted input.\n *\n * @example\n * ```ts\n * import { offchainMessageContentRestrictedAsciiOf1232BytesMax, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const text: string = textInput.value;\n * try {\n * const offchainMessage: OffchainMessageV0 = {\n * content: offchainMessageContentRestrictedAsciiOf1232BytesMax(text),\n * // ...\n * };\n * } catch (e) {\n * // `text` turned out not to conform to\n * // `OffchainMessageContentRestrictedAsciiOf1232BytesMax`\n * }\n * }\n * ```\n *\n * > [!TIP]\n * > When starting from known-good ASCII content as a string, it's more efficient to typecast it\n * > rather than to use the {@link offchainMessageContentRestrictedAsciiOf1232BytesMax} helper,\n * > because the helper unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageContentFormat, OffchainMessageV0 } from '@solana/offchain-messages';\n * >\n * > const offchainMessage: OffchainMessageV0 = {\n * > /* ... *\\/\n * > content: Object.freeze({\n * > format: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX,\n * > text: 'Hello world',\n * > } as OffchainMessageContentRestrictedAsciiOf1232BytesMax<'Hello world'>),\n * > };\n * > ```\n */\nexport function offchainMessageContentRestrictedAsciiOf1232BytesMax(\n text: TText,\n): OffchainMessageContentRestrictedAsciiOf1232BytesMax {\n const putativeContent = Object.freeze({\n format: OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX,\n text,\n });\n assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeContent);\n return putativeContent;\n}\n\n/**\n * In the event that you receive content of a v0 offchain message from an untrusted source, use this\n * function to assert that it conforms to the {@link OffchainMessageContentUtf8Of1232BytesMax} type.\n *\n * @see {@link OffchainMessageContentUtf8Of1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): asserts putativeContent is OffchainMessageContentUtf8Of1232BytesMax {\n if (putativeContent.text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n if (putativeContent.format !== OffchainMessageContentFormat.UTF8_1232_BYTES_MAX) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, {\n actualMessageFormat: putativeContent.format,\n expectedMessageFormat: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX,\n });\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n if (length > MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, {\n actualBytes: length,\n maxBytes: MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE,\n });\n }\n}\n\n/**\n * A type guard that returns `true` when supplied content of a v0 offchain message that conforms to\n * the {@link OffchainMessageContentUtf8Of1232BytesMax} type, and refines its type for use in your\n * program.\n *\n * @see {@link OffchainMessageContentUtf8Of1232BytesMax} for more detail.\n */\nexport function isOffchainMessageContentUtf8Of1232BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): putativeContent is OffchainMessageContentUtf8Of1232BytesMax {\n if (\n putativeContent.format !== OffchainMessageContentFormat.UTF8_1232_BYTES_MAX ||\n putativeContent.text.length === 0\n ) {\n return false;\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n return length <= MAX_BODY_BYTES_HARDWARE_WALLET_SIGNABLE;\n}\n\n/**\n * Combines _asserting_ that the content of a v0 offchain message is UTF-8 of up to 1232 characters\n * with _coercing_ it to the {@link OffchainMessageContentUtf8Of1232BytesMax} type. It's most useful\n * with untrusted input.\n *\n * @example\n * ```ts\n * import { OffchainMessageContentUtf8Of1232BytesMax, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const text: string = textInput.value;\n * try {\n * const offchainMessage: OffchainMessageV0 = {\n * content: OffchainMessageContentUtf8Of1232BytesMax(text),\n * // ...\n * };\n * } catch (e) {\n * // `text` turned out not to conform to\n * // `OffchainMessageContentUtf8Of1232BytesMax`\n * }\n * }\n * ```\n *\n * > [!TIP]\n * > When starting from known-good UTF-8 content as a string up to 1232 bytes, it's more efficient\n * > to typecast it rather than to use the {@link offchainMessageContentUtf8Of1232BytesMax} helper,\n * > because the helper unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageContentFormat, OffchainMessageV0 } from '@solana/offchain-messages';\n * >\n * > const offchainMessage: OffchainMessageV0 = {\n * > /* ... *\\/\n * > content: Object.freeze({\n * > format: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX,\n * > text: '✌🏿cool',\n * > } as OffchainMessageContentUtf8Of1232BytesMax<'✌🏿cool'>),\n * > };\n * > ```\n */\nexport function offchainMessageContentUtf8Of1232BytesMax(\n text: TText,\n): OffchainMessageContentUtf8Of1232BytesMax {\n const putativeContent = Object.freeze({\n format: OffchainMessageContentFormat.UTF8_1232_BYTES_MAX,\n text,\n });\n assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeContent);\n return putativeContent;\n}\n\n/**\n * In the event that you receive content of a v0 offchain message from an untrusted source, use this\n * function to assert that it conforms to the {@link OffchainMessageContentUtf8Of65535BytesMax}\n * type.\n *\n * @see {@link OffchainMessageContentUtf8Of65535BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): asserts putativeContent is OffchainMessageContentUtf8Of65535BytesMax {\n if (putativeContent.format !== OffchainMessageContentFormat.UTF8_65535_BYTES_MAX) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH, {\n actualMessageFormat: putativeContent.format,\n expectedMessageFormat: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX,\n });\n }\n if (putativeContent.text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n if (length > MAX_BODY_BYTES) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED, {\n actualBytes: length,\n maxBytes: MAX_BODY_BYTES,\n });\n }\n}\n\n/**\n * A type guard that returns `true` when supplied content of a v0 offchain message that conforms to\n * the {@link OffchainMessageContentUtf8Of65535BytesMax} type, and refines its type for use in your\n * program.\n *\n * @see {@link OffchainMessageContentUtf8Of65535BytesMax} for more detail.\n */\nexport function isOffchainMessageContentUtf8Of65535BytesMax(putativeContent: {\n format: OffchainMessageContentFormat;\n text: string;\n}): putativeContent is OffchainMessageContentUtf8Of65535BytesMax {\n if (\n putativeContent.format !== OffchainMessageContentFormat.UTF8_65535_BYTES_MAX ||\n putativeContent.text.length === 0\n ) {\n return false;\n }\n const length = getUtf8Encoder().getSizeFromValue(putativeContent.text);\n return length <= MAX_BODY_BYTES;\n}\n\n/**\n * Combines _asserting_ that the content of a v0 offchain message is UTF-8 of up to 65535 characters\n * with _coercing_ it to the {@link OffchainMessageContentUtf8Of65535BytesMax} type. It's most useful\n * with untrusted input.\n *\n * @example\n * ```ts\n * import { OffchainMessageContentUtf8Of65535BytesMax, OffchainMessageV0 } from '@solana/offchain-messages';\n *\n * function handleSubmit() {\n * // We know only that what the user typed conforms to the `string` type.\n * const text: string = textInput.value;\n * try {\n * const offchainMessage: OffchainMessageV0 = {\n * content: OffchainMessageContentUtf8Of65535BytesMax(text),\n * // ...\n * };\n * } catch (e) {\n * // `text` turned out not to conform to\n * // `OffchainMessageContentUtf8Of65535BytesMax`\n * }\n * }\n * ```\n *\n * > [!TIP]\n * > When starting from known-good UTF-8 content as a string up to 65535 bytes, it's more efficient\n * > to typecast it rather than to use the {@link OffchainMessageContentUtf8Of65535BytesMax} helper,\n * > because the helper unconditionally performs validation on its input.\n * >\n * > ```ts\n * > import { OffchainMessageContentFormat, OffchainMessageV0 } from '@solana/offchain-messages';\n * >\n * > const offchainMessage: OffchainMessageV0 = {\n * > /* ... *\\/\n * > content: Object.freeze({\n * > format: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX,\n * > text: '✌🏿cool',\n * > } as OffchainMessageContentUtf8Of65535BytesMax<'✌🏿cool'>),\n * > };\n * > ```\n */\nexport function offchainMessageContentUtf8Of65535BytesMax(\n text: TText,\n): OffchainMessageContentUtf8Of65535BytesMax {\n const putativeContent = Object.freeze({\n format: OffchainMessageContentFormat.UTF8_65535_BYTES_MAX,\n text,\n });\n assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeContent);\n return putativeContent;\n}\n\nfunction isTextRestrictedAscii(putativeRestrictedAsciiString: string): boolean {\n return /^[\\x20-\\x7e]+$/.test(putativeRestrictedAsciiString);\n}\n","import {\n assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax,\n assertIsOffchainMessageContentUtf8Of1232BytesMax,\n assertIsOffchainMessageContentUtf8Of65535BytesMax,\n OffchainMessageContentFormat,\n OffchainMessageContentRestrictedAsciiOf1232BytesMax,\n OffchainMessageContentUtf8Of1232BytesMax,\n OffchainMessageContentUtf8Of65535BytesMax,\n} from './content';\nimport { OffchainMessagePreambleV0 } from './preamble-v0';\nimport { OffchainMessageWithRequiredSignatories } from './signatures';\n\nexport type BaseOffchainMessageV0 = Omit<\n OffchainMessagePreambleV0,\n 'messageFormat' | 'messageLength' | 'requiredSignatories'\n>;\n\n/**\n * An offchain message whose content conforms to\n * {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax}\n */\nexport interface OffchainMessageWithRestrictedAsciiOf1232BytesMaxContent {\n readonly content: OffchainMessageContentRestrictedAsciiOf1232BytesMax;\n}\n\n/**\n * An offchain message whose content conforms to\n * {@link offchainMessageContentUtf8Of1232BytesMax}\n */\nexport interface OffchainMessageWithUtf8Of1232BytesMaxContent {\n readonly content: OffchainMessageContentUtf8Of1232BytesMax;\n}\n\n/**\n * An offchain message whose content conforms to\n * {@link OffchainMessageContentUtf8Of65535BytesMax}\n */\nexport interface OffchainMessageWithUtf8Of65535BytesMaxContent {\n readonly content: OffchainMessageContentUtf8Of65535BytesMax;\n}\n\n/**\n * A union of the formats a v0 message's contents can take.\n *\n * @remarks From v1 and onward, an offchain message has only one format: UTF-8 text of arbitrary\n * length.\n */\nexport type OffchainMessageWithContent =\n | OffchainMessageWithRestrictedAsciiOf1232BytesMaxContent\n | OffchainMessageWithUtf8Of1232BytesMaxContent\n | OffchainMessageWithUtf8Of65535BytesMaxContent;\n\nexport type OffchainMessageV0 = BaseOffchainMessageV0 &\n OffchainMessageWithContent &\n OffchainMessageWithRequiredSignatories;\n\n/**\n * In the event that you receive a v0 offchain message from an untrusted source, use this function\n * to assert that it is one whose content conforms to the\n * {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} type.\n *\n * @see {@link OffchainMessageContentRestrictedAsciiOf1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(\n putativeMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n }>,\n): asserts putativeMessage is OffchainMessageWithRestrictedAsciiOf1232BytesMaxContent & Omit {\n assertIsOffchainMessageContentRestrictedAsciiOf1232BytesMax(putativeMessage.content);\n}\n\n/**\n * In the event that you receive a v0 offchain message from an untrusted source, use this function\n * to assert that it is one whose content conforms to the\n * {@link offchainMessageContentUtf8Of1232BytesMax} type.\n *\n * @see {@link offchainMessageContentUtf8Of1232BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageUtf8Of1232BytesMax(\n putativeMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n version: number;\n }>,\n): asserts putativeMessage is OffchainMessageWithUtf8Of1232BytesMaxContent & Omit {\n assertIsOffchainMessageContentUtf8Of1232BytesMax(putativeMessage.content);\n}\n\n/**\n * In the event that you receive a v0 offchain message from an untrusted source, use this function\n * to assert that it is one whose content conforms to the\n * {@link OffchainMessageContentUtf8Of65535BytesMax} type.\n *\n * @see {@link OffchainMessageContentUtf8Of65535BytesMax} for more detail.\n */\nexport function assertIsOffchainMessageUtf8Of65535BytesMax(\n putativeMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n version: number;\n }>,\n): asserts putativeMessage is OffchainMessageWithUtf8Of65535BytesMaxContent & Omit {\n assertIsOffchainMessageContentUtf8Of65535BytesMax(putativeMessage.content);\n}\n","import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';\nimport { getEnumDecoder, getEnumEncoder } from '@solana/codecs-data-structures';\n\nimport { OffchainMessageContentFormat } from '../content';\n\nexport function getOffchainMessageContentFormatDecoder(): FixedSizeDecoder {\n return getEnumDecoder(OffchainMessageContentFormat, {\n useValuesAsDiscriminators: true,\n });\n}\n\nexport function getOffchainMessageContentFormatEncoder(): FixedSizeEncoder {\n return getEnumEncoder(OffchainMessageContentFormat, {\n useValuesAsDiscriminators: true,\n });\n}\n\nexport function getOffchainMessageContentFormatCodec(): FixedSizeCodec<\n OffchainMessageContentFormat,\n OffchainMessageContentFormat,\n 1\n> {\n return combineCodec(getOffchainMessageContentFormatEncoder(), getOffchainMessageContentFormatDecoder());\n}\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getArrayDecoder, getArrayEncoder } from '@solana/codecs-data-structures';\nimport { getU8Decoder, getU8Encoder, getU16Decoder, getU16Encoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO, SolanaError } from '@solana/errors';\n\nimport { OffchainMessagePreambleV0 } from '../preamble-v0';\nimport {\n getOffchainMessageApplicationDomainDecoder,\n getOffchainMessageApplicationDomainEncoder,\n} from './application-domain';\nimport { getOffchainMessageContentFormatDecoder, getOffchainMessageContentFormatEncoder } from './content';\nimport { createOffchainMessagePreambleDecoder, createOffchainMessagePreambleEncoder } from './preamble-common';\n\nexport function getOffchainMessageV0PreambleDecoder(): VariableSizeDecoder {\n return createOffchainMessagePreambleDecoder(\n /* version */ 0,\n ['applicationDomain', getOffchainMessageApplicationDomainDecoder()],\n ['messageFormat', getOffchainMessageContentFormatDecoder()],\n [\n 'requiredSignatories',\n transformDecoder(getArrayDecoder(getAddressDecoder(), { size: getU8Decoder() }), signatoryAddresses => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n return signatoryAddresses.map(address => Object.freeze({ address }));\n }),\n ],\n ['messageLength', getU16Decoder()],\n );\n}\n\nexport function getOffchainMessageV0PreambleEncoder(): VariableSizeEncoder {\n return createOffchainMessagePreambleEncoder(\n /* version */ 0,\n ['applicationDomain', getOffchainMessageApplicationDomainEncoder()],\n ['messageFormat', getOffchainMessageContentFormatEncoder()],\n [\n 'requiredSignatories',\n transformEncoder(\n getArrayEncoder(getAddressEncoder(), { size: getU8Encoder() }),\n (signatoryAddresses: OffchainMessagePreambleV0['requiredSignatories']) => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n return signatoryAddresses.map(({ address }) => address);\n },\n ),\n ],\n ['messageLength', getU16Encoder()],\n );\n}\n\nexport function getOffchainMessageV0PreambleCodec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV0PreambleEncoder(), getOffchainMessageV0PreambleDecoder());\n}\n","import {\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getTupleDecoder, getTupleEncoder } from '@solana/codecs-data-structures';\nimport { getUtf8Decoder, getUtf8Encoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,\n SolanaError,\n} from '@solana/errors';\n\nimport { OffchainMessageContentFormat } from '../content';\nimport {\n assertIsOffchainMessageRestrictedAsciiOf1232BytesMax,\n assertIsOffchainMessageUtf8Of1232BytesMax,\n assertIsOffchainMessageUtf8Of65535BytesMax,\n OffchainMessageV0,\n} from '../message-v0';\nimport { getOffchainMessageV0PreambleDecoder, getOffchainMessageV0PreambleEncoder } from './preamble-v0';\n\n/**\n * Returns a decoder that you can use to convert a byte array (eg. one that conforms to the\n * {@link OffchainMessageBytes} type) to an {@link OffchainMessageV0} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageV0Decoder } from '@solana/offchain-messages';\n *\n * const offchainMessageDecoder = getOffchainMessageV0Decoder();\n * const offchainMessage = offchainMessageDecoder.decode(\n * offchainMessageEnvelope.content,\n * );\n * console.log(`Decoded a v0 offchain message`);\n * ```\n *\n * Throws in the event that the message bytes represent a message of a version other than 0.\n */\nexport function getOffchainMessageV0Decoder(): VariableSizeDecoder {\n return transformDecoder(\n getTupleDecoder([getOffchainMessageV0PreambleDecoder(), getUtf8Decoder()]),\n ([{ messageLength, messageFormat, requiredSignatories, ...preambleRest }, text]) => {\n const actualLength = getUtf8Encoder().getSizeFromValue(text);\n if (messageLength !== actualLength) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH, {\n actualLength: actualLength,\n specifiedLength: messageLength,\n });\n }\n const offchainMessage: Omit &\n Readonly<{\n content: {\n format: OffchainMessageContentFormat;\n text: string;\n };\n }> = Object.freeze({\n ...preambleRest,\n content: Object.freeze({\n format: messageFormat,\n text,\n }),\n requiredSignatories: Object.freeze(requiredSignatories),\n });\n switch (messageFormat) {\n case OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX: {\n assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage);\n return offchainMessage;\n }\n case OffchainMessageContentFormat.UTF8_1232_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage);\n return offchainMessage;\n }\n case OffchainMessageContentFormat.UTF8_65535_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage);\n return offchainMessage;\n }\n default: {\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: messageFormat satisfies never,\n });\n }\n }\n },\n );\n}\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessageV0} to a byte array\n * appropriate for inclusion in an {@link OffchainMessageEnvelope}.\n */\nexport function getOffchainMessageV0Encoder(): VariableSizeEncoder {\n return transformEncoder(\n getTupleEncoder([getOffchainMessageV0PreambleEncoder(), getUtf8Encoder()]),\n offchainMessage => {\n const { content, ...preamble } = offchainMessage;\n switch (offchainMessage.content.format) {\n case OffchainMessageContentFormat.RESTRICTED_ASCII_1232_BYTES_MAX: {\n assertIsOffchainMessageRestrictedAsciiOf1232BytesMax(offchainMessage);\n break;\n }\n case OffchainMessageContentFormat.UTF8_1232_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of1232BytesMax(offchainMessage);\n break;\n }\n case OffchainMessageContentFormat.UTF8_65535_BYTES_MAX: {\n assertIsOffchainMessageUtf8Of65535BytesMax(offchainMessage);\n break;\n }\n default: {\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: offchainMessage.content satisfies never,\n });\n }\n }\n const messageLength = getUtf8Encoder().getSizeFromValue(content.text);\n const compiledPreamble = {\n ...preamble,\n messageFormat: content.format,\n messageLength,\n };\n return [compiledPreamble, content.text] as const;\n },\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessageV0}\n *\n * @see {@link getOffchainMessageV0Decoder}\n * @see {@link getOffchainMessageV0Encoder}\n */\nexport function getOffchainMessageV0Codec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV0Encoder(), getOffchainMessageV0Decoder());\n}\n","import { getAddressDecoder, getAddressEncoder } from '@solana/addresses';\nimport {\n combineCodec,\n fixDecoderSize,\n ReadonlyUint8Array,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getArrayDecoder, getArrayEncoder, getBytesDecoder, getBytesEncoder } from '@solana/codecs-data-structures';\nimport { getU8Decoder, getU8Encoder } from '@solana/codecs-numbers';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE,\n SolanaError,\n} from '@solana/errors';\n\nimport { OffchainMessagePreambleV1 } from '../preamble-v1';\nimport {\n createOffchainMessagePreambleDecoder,\n createOffchainMessagePreambleEncoder,\n getSignatoriesComparator,\n} from './preamble-common';\n\nexport function getOffchainMessageV1PreambleDecoder(): VariableSizeDecoder {\n return createOffchainMessagePreambleDecoder(/* version */ 1, [\n 'requiredSignatories',\n transformDecoder(\n getArrayDecoder(fixDecoderSize(getBytesDecoder(), 32), { size: getU8Decoder() }),\n signatoryAddressesBytes => {\n if (signatoryAddressesBytes.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n const comparator = getSignatoriesComparator();\n for (let ii = 0; ii < signatoryAddressesBytes.length - 1; ii++) {\n switch (comparator(signatoryAddressesBytes[ii], signatoryAddressesBytes[ii + 1])) {\n case 0:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE);\n case 1:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_SORTED);\n }\n }\n const addressDecoder = getAddressDecoder();\n return signatoryAddressesBytes.map(addressBytes =>\n Object.freeze({\n address: addressDecoder.decode(addressBytes),\n }),\n );\n },\n ),\n ]);\n}\n\nexport function getOffchainMessageV1PreambleEncoder(): VariableSizeEncoder {\n return createOffchainMessagePreambleEncoder(/* version */ 1, [\n 'requiredSignatories',\n transformEncoder(\n transformEncoder(\n getArrayEncoder(getBytesEncoder(), { size: getU8Encoder() }),\n (signatoryAddressesBytes: readonly ReadonlyUint8Array[]) => {\n return signatoryAddressesBytes.toSorted(getSignatoriesComparator());\n },\n ),\n (signatoryAddresses: OffchainMessagePreambleV1['requiredSignatories']) => {\n if (signatoryAddresses.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO);\n }\n const seenSignatories = new Set();\n for (const { address } of signatoryAddresses) {\n if (seenSignatories.has(address)) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATORIES_MUST_BE_UNIQUE);\n }\n seenSignatories.add(address);\n }\n const addressEncoder = getAddressEncoder();\n return signatoryAddresses.map(({ address }) => addressEncoder.encode(address));\n },\n ),\n ]);\n}\n\nexport function getOffchainMessageV1PreambleCodec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV1PreambleEncoder(), getOffchainMessageV1PreambleDecoder());\n}\n","import {\n combineCodec,\n transformDecoder,\n transformEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getTupleDecoder, getTupleEncoder } from '@solana/codecs-data-structures';\nimport { getUtf8Decoder, getUtf8Encoder } from '@solana/codecs-strings';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY, SolanaError } from '@solana/errors';\n\nimport { OffchainMessageV1 } from '../message-v1';\nimport { getOffchainMessageV1PreambleDecoder, getOffchainMessageV1PreambleEncoder } from './preamble-v1';\n\n/**\n * Returns a decoder that you can use to convert a byte array (eg. one that conforms to the\n * {@link OffchainMessageBytes} type) to an {@link OffchainMessageV1} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageV1Decoder } from '@solana/offchain-messages';\n *\n * const offchainMessageDecoder = getOffchainMessageV1Decoder();\n * const offchainMessage = offchainMessageDecoder.decode(\n * offchainMessageEnvelope.content,\n * );\n * console.log(`Decoded a v1 offchain message`);\n * ```\n *\n * Throws in the event that the message bytes represent a message of a version other than 1.\n */\nexport function getOffchainMessageV1Decoder(): VariableSizeDecoder {\n return transformDecoder(\n getTupleDecoder([getOffchainMessageV1PreambleDecoder(), getUtf8Decoder()]),\n ([{ requiredSignatories, ...preambleRest }, text]) => {\n if (text.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n return Object.freeze({\n ...preambleRest,\n content: text,\n requiredSignatories: Object.freeze(requiredSignatories),\n });\n },\n );\n}\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessageV1} to a byte array\n * appropriate for inclusion in an {@link OffchainMessageEnvelope}.\n */\nexport function getOffchainMessageV1Encoder(): VariableSizeEncoder {\n return transformEncoder(\n getTupleEncoder([getOffchainMessageV1PreambleEncoder(), getUtf8Encoder()]),\n offchainMessage => {\n const { content, ...compiledPreamble } = offchainMessage;\n if (content.length === 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY);\n }\n return [compiledPreamble, content] as const;\n },\n );\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessageV1}\n *\n * @see {@link getOffchainMessageV1Decoder}\n * @see {@link getOffchainMessageV1Encoder}\n */\nexport function getOffchainMessageV1Codec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageV1Encoder(), getOffchainMessageV1Decoder());\n}\n","import {\n combineCodec,\n createDecoder,\n createEncoder,\n VariableSizeCodec,\n VariableSizeDecoder,\n VariableSizeEncoder,\n} from '@solana/codecs-core';\nimport { getHiddenPrefixDecoder } from '@solana/codecs-data-structures';\nimport { getU8Decoder } from '@solana/codecs-numbers';\nimport { SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, SolanaError } from '@solana/errors';\n\nimport { OffchainMessage } from '../message';\nimport { getOffchainMessageV0Decoder, getOffchainMessageV0Encoder } from './message-v0';\nimport { getOffchainMessageV1Decoder, getOffchainMessageV1Encoder } from './message-v1';\nimport { getOffchainMessageSigningDomainDecoder } from './signing-domain';\n\n/**\n * Returns a decoder that you can use to convert a byte array (eg. one that conforms to the\n * {@link OffchainMessageBytes} type) to an {@link OffchainMessage} object.\n *\n * @example\n * ```ts\n * import { getOffchainMessageDecoder } from '@solana/offchain-messages';\n *\n * const offchainMessageDecoder = getOffchainMessageDecoder();\n * const offchainMessage = offchainMessageDecoder.decode(\n * offchainMessageEnvelope.content,\n * );\n * console.log(`Decoded an offchain message (version: ${offchainMessage.version}`);\n * ```\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the decoders specific to that\n * version so as not to bundle more code than you need.\n */\nexport function getOffchainMessageDecoder(): VariableSizeDecoder {\n return createDecoder({\n read(bytes, offset): [OffchainMessage, number] {\n const version = getHiddenPrefixDecoder(getU8Decoder(), [\n // Discard the signing domain\n getOffchainMessageSigningDomainDecoder(),\n ]).decode(bytes, offset);\n switch (version) {\n case 0:\n return getOffchainMessageV0Decoder().read(bytes, offset);\n case 1:\n return getOffchainMessageV1Decoder().read(bytes, offset);\n default:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version,\n });\n }\n },\n });\n}\n\n/**\n * Returns an encoder that you can use to encode an {@link OffchainMessage} to a byte array\n * appropriate for inclusion in an {@link OffchainMessageEnvelope}.\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the encoders specific to that\n * version so as not to bundle more code than you need.\n */\nexport function getOffchainMessageEncoder(): VariableSizeEncoder {\n return createEncoder({\n getSizeFromValue: offchainMessage => {\n const { version } = offchainMessage;\n switch (version) {\n case 0:\n return getOffchainMessageV0Encoder().getSizeFromValue(offchainMessage);\n case 1:\n return getOffchainMessageV1Encoder().getSizeFromValue(offchainMessage);\n default:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version satisfies never,\n });\n }\n },\n write: (offchainMessage, bytes, offset) => {\n const { version } = offchainMessage;\n switch (version) {\n case 0:\n return getOffchainMessageV0Encoder().write(offchainMessage, bytes, offset);\n case 1:\n return getOffchainMessageV1Encoder().write(offchainMessage, bytes, offset);\n default:\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED, {\n unsupportedVersion: version satisfies never,\n });\n }\n },\n });\n}\n\n/**\n * Returns a codec that you can use to encode from or decode to an {@link OffchainMessage}\n *\n * @see {@link getOffchainMessageDecoder}\n * @see {@link getOffchainMessageEncoder}\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the codecs specific to that\n * version so as not to bundle more code than you need.\n */\nexport function getOffchainMessageCodec(): VariableSizeCodec {\n return combineCodec(getOffchainMessageEncoder(), getOffchainMessageDecoder());\n}\n","import { VariableSizeEncoder } from '@solana/codecs-core';\n\nimport { OffchainMessageEnvelope } from './envelope';\nimport { OffchainMessage, OffchainMessageBytes } from './message';\n\nexport function compileOffchainMessageEnvelopeUsingEncoder(\n offchainMessage: T,\n encoder: VariableSizeEncoder,\n) {\n const offchainMessageBytes = encoder.encode(offchainMessage) as OffchainMessageBytes;\n const signatures: OffchainMessageEnvelope['signatures'] = {};\n for (const { address } of offchainMessage.requiredSignatories) {\n signatures[address] = null;\n }\n return Object.freeze({\n content: offchainMessageBytes,\n signatures: Object.freeze(signatures),\n });\n}\n","import { getOffchainMessageV0Encoder } from './codecs/message-v0';\nimport { OffchainMessageEnvelope } from './envelope';\nimport { compileOffchainMessageEnvelopeUsingEncoder } from './envelope-common';\nimport { OffchainMessageV0 } from './message-v0';\n\n/**\n * Returns an {@link OffchainMessageEnvelope} object for a given {@link OffchainMessageV0}.\n *\n * This includes the compiled bytes of the offchain message, and a map of signatures. This map will\n * have a key for each address that is required to sign the message. The message envelope will not\n * yet have signatures for any of these signatories.\n */\nexport function compileOffchainMessageV0Envelope(offchainMessage: OffchainMessageV0): OffchainMessageEnvelope {\n return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV0Encoder());\n}\n","import { getOffchainMessageV1Encoder } from './codecs/message-v1';\nimport { OffchainMessageEnvelope } from './envelope';\nimport { compileOffchainMessageEnvelopeUsingEncoder } from './envelope-common';\nimport { OffchainMessageV1 } from './message-v1';\n\n/**\n * Returns an {@link OffchainMessageEnvelope} object for a given {@link OffchainMessageV1}.\n *\n * This includes the compiled bytes of the offchain message, and a map of signatures. This map will\n * have a key for each address that is required to sign the message. The message envelope will not\n * yet have signatures for any of these signatories.\n */\nexport function compileOffchainMessageV1Envelope(offchainMessage: OffchainMessageV1): OffchainMessageEnvelope {\n return compileOffchainMessageEnvelopeUsingEncoder(offchainMessage, getOffchainMessageV1Encoder());\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\n\nimport { compileOffchainMessageV0Envelope } from './envelope-v0';\nimport { compileOffchainMessageV1Envelope } from './envelope-v1';\nimport { OffchainMessage, OffchainMessageBytes } from './message';\n\ntype OrderedMap = Record;\ntype OffchainMessageSignaturesMap = OrderedMap;\n\nexport interface OffchainMessageEnvelope {\n /** The bytes of the combined offchain message preamble and content */\n readonly content: OffchainMessageBytes;\n /**\n * A map between the addresses of an offchain message's signers, and the 64-byte Ed25519\n * signature of the combined message preamble and message content by the private key associated\n * with each.\n */\n readonly signatures: OffchainMessageSignaturesMap;\n}\n\n/**\n * Returns an {@link OffchainMessageEnvelope} object for a given {@link OffchainMessage}.\n *\n * This includes the compiled bytes of the offchain message, and a map of signatures. This map will\n * have a key for each address that is required to sign the message. The message envelope will not\n * yet have signatures for any of these signatories.\n *\n * @remarks\n * If the offchain message version is known ahead of time, use one of the compile functions\n * specific to that version so as not to bundle more code than you need.\n */\nexport function compileOffchainMessageEnvelope(offchainMessage: OffchainMessage): OffchainMessageEnvelope {\n const { version } = offchainMessage;\n switch (version) {\n case 0:\n return compileOffchainMessageV0Envelope(offchainMessage);\n case 1:\n return compileOffchainMessageV1Envelope(offchainMessage);\n default:\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE, {\n unexpectedValue: version satisfies never,\n });\n }\n}\n","import { Address, getAddressFromPublicKey, getPublicKeyFromAddress } from '@solana/addresses';\nimport { bytesEqual } from '@solana/codecs-core';\nimport {\n SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE,\n SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { SignatureBytes, signBytes, verifySignature } from '@solana/keys';\nimport { NominalType } from '@solana/nominal-types';\n\nimport { decodeRequiredSignatoryAddresses } from './codecs/preamble-common';\nimport { OffchainMessageEnvelope } from './envelope';\n\n/**\n * Represents an offchain message envelope that is signed by all of its required signers.\n */\nexport type FullySignedOffchainMessageEnvelope = NominalType<'offchainMessageEnvelopeSignedness', 'fullySigned'>;\n\n/**\n * Represents an address that is required to sign an offchain message for it to be valid.\n */\nexport type OffchainMessageSignatory = Readonly<{\n address: Address;\n}>;\n\n/**\n * An offchain message having a list of accounts that must sign it in order for it to be valid.\n */\nexport interface OffchainMessageWithRequiredSignatories<\n TSignatory extends OffchainMessageSignatory = OffchainMessageSignatory,\n> {\n requiredSignatories: readonly TSignatory[];\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign an offchain message, this method will return a new signed offchain message\n * envelope of type {@link OffchainMessageEnvelope}.\n *\n * Though the resulting message might be signed by all required signers, this function will not\n * assert that it is. A partially signed message is not complete, but can be serialized and\n * deserialized.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { partiallySignOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * const partiallySignedOffchainMessage = await partiallySignOffchainMessageEnvelope(\n * [myPrivateKey],\n * offchainMessageEnvelope,\n * );\n * ```\n *\n * @see {@link signOffchainMessageEnvelope} if you want to assert that the message is signed by all\n * its required signers after signing.\n */\nexport async function partiallySignOffchainMessageEnvelope(\n keyPairs: CryptoKeyPair[],\n offchainMessageEnvelope: TOffchainMessageEnvelope,\n): Promise {\n let newSignatures: Record | undefined;\n let unexpectedSigners: Set
| undefined;\n\n const requiredSignatoryAddresses = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content);\n\n await Promise.all(\n keyPairs.map(async keyPair => {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n\n // Check if the address is expected to sign the message\n if (!requiredSignatoryAddresses.includes(address)) {\n // address is not an expected signer for this message\n unexpectedSigners ||= new Set();\n unexpectedSigners.add(address);\n return;\n }\n\n // Return if there are any unexpected signers already since we won't be using signatures\n if (unexpectedSigners) {\n return;\n }\n\n const existingSignature = offchainMessageEnvelope.signatures[address];\n const newSignature = await signBytes(keyPair.privateKey, offchainMessageEnvelope.content);\n\n if (existingSignature != null && bytesEqual(newSignature, existingSignature)) {\n // already have the same signature set\n return;\n }\n\n newSignatures ||= {};\n newSignatures[address] = newSignature;\n }),\n );\n\n if (unexpectedSigners && unexpectedSigners.size > 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__ADDRESSES_CANNOT_SIGN_OFFCHAIN_MESSAGE, {\n expectedAddresses: requiredSignatoryAddresses,\n unexpectedAddresses: [...unexpectedSigners],\n });\n }\n\n if (!newSignatures) {\n return offchainMessageEnvelope;\n }\n\n return Object.freeze({\n ...offchainMessageEnvelope,\n signatures: Object.freeze({\n ...offchainMessageEnvelope.signatures,\n ...newSignatures,\n }),\n });\n}\n\n/**\n * Given an array of `CryptoKey` objects which are private keys pertaining to addresses that are\n * required to sign an offchain message envelope, this method will return a new signed envelope of\n * type {@link FullySignedOffchainMessageEnvelope}.\n *\n * This function will throw unless the resulting message is fully signed.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { signOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * const signedOffchainMessage = await signOffchainMessageEnvelope(\n * [myPrivateKey],\n * offchainMessageEnvelope,\n * );\n * ```\n *\n * @see {@link partiallySignOffchainMessageEnvelope} if you want to sign the message without\n * asserting that the resulting message envelope is fully signed.\n */\nexport async function signOffchainMessageEnvelope(\n keyPairs: CryptoKeyPair[],\n offchainMessageEnvelope: TOffchainMessageEnvelope,\n): Promise {\n const out = await partiallySignOffchainMessageEnvelope(keyPairs, offchainMessageEnvelope);\n assertIsFullySignedOffchainMessageEnvelope(out);\n Object.freeze(out);\n return out;\n}\n\n/**\n * A type guard that returns `true` if the input {@link OffchainMessageEnvelope} is fully signed,\n * and refines its type for use in your program, adding the\n * {@link FullySignedOffchainMessageEnvelope} type.\n *\n * @example\n * ```ts\n * import { isFullySignedOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * const offchainMessageEnvelope = getOffchainMessageDecoder().decode(offchainMessageBytes);\n * if (isFullySignedOffchainMessageEnvelope(offchainMessageEnvelope)) {\n * // At this point we know that the offchain message is fully signed.\n * }\n * ```\n */\nexport function isFullySignedOffchainMessageEnvelope(\n offchainMessage: TEnvelope,\n): offchainMessage is FullySignedOffchainMessageEnvelope & TEnvelope {\n return Object.entries(offchainMessage.signatures).every(([_, signatureBytes]) => !!signatureBytes);\n}\n\n/**\n * From time to time you might acquire a {@link OffchainMessageEnvelope}, that you expect to be\n * fully signed, from an untrusted network API or user input. Use this function to assert that such\n * an offchain message is fully signed.\n *\n * @example\n * ```ts\n * import { assertIsFullySignedOffchainMessage } from '@solana/offchain-messages';\n *\n * const offchainMessageEnvelope = getOffchainMessageDecoder().decode(offchainMessageBytes);\n * try {\n * // If this type assertion function doesn't throw, then Typescript will upcast\n * // `offchainMessageEnvelope` to `FullySignedOffchainMessageEnvelope`.\n * assertIsFullySignedOffchainMessageEnvelope(offchainMessage);\n * // At this point we know that the offchain message is signed by all required signers.\n * } catch(e) {\n * if (isSolanaError(e, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING)) {\n * setError(`Missing signatures for ${e.context.addresses.join(', ')}`);\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function assertIsFullySignedOffchainMessageEnvelope(\n offchainMessage: TEnvelope,\n): asserts offchainMessage is FullySignedOffchainMessageEnvelope & TEnvelope {\n const missingSigs: Address[] = [];\n Object.entries(offchainMessage.signatures).forEach(([address, signatureBytes]) => {\n if (!signatureBytes) {\n missingSigs.push(address as Address);\n }\n });\n\n if (missingSigs.length > 0) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING, {\n addresses: missingSigs,\n });\n }\n}\n\n/**\n * Asserts that there are signatures present for all of an offchain message's required signatories,\n * and that those signatures are valid given the message.\n *\n * @example\n * ```ts\n * import { isSolanaError, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE } from '@solana/errors';\n * import { verifyOffchainMessageEnvelope } from '@solana/offchain-messages';\n *\n * try {\n * await verifyOffchainMessageEnvelope(offchainMessageEnvelope);\n * // At this point the message is valid and signed by all of the required signatories.\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE)) {\n * if (e.context.signatoriesWithMissingSignatures.length) {\n * console.error(\n * 'Missing signatures for the following addresses',\n * e.context.signatoriesWithMissingSignatures,\n * );\n * }\n * if (e.context.signatoriesWithInvalidSignatures.length) {\n * console.error(\n * 'Signatures for the following addresses are invalid',\n * e.context.signatoriesWithInvalidSignatures,\n * );\n * }\n * }\n * throw e;\n * }\n */\nexport async function verifyOffchainMessageEnvelope(offchainMessageEnvelope: OffchainMessageEnvelope): Promise {\n let errorContext;\n const requiredSignatories = decodeRequiredSignatoryAddresses(offchainMessageEnvelope.content);\n await Promise.all(\n requiredSignatories.map(async address => {\n const signature = offchainMessageEnvelope.signatures[address];\n if (signature == null) {\n errorContext ||= {};\n errorContext.signatoriesWithMissingSignatures ||= [];\n errorContext.signatoriesWithMissingSignatures.push(address);\n } else {\n const publicKey = await getPublicKeyFromAddress(address);\n if (await verifySignature(publicKey, signature, offchainMessageEnvelope.content)) {\n return true;\n } else {\n errorContext ||= {};\n errorContext.signatoriesWithInvalidSignatures ||= [];\n errorContext.signatoriesWithInvalidSignatures.push(address);\n }\n }\n }),\n );\n if (errorContext) {\n throw new SolanaError(SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURE_VERIFICATION_FAILURE, errorContext);\n }\n}\n","/**\n * Defines a plugin that transforms or extends a client with additional functionality.\n *\n * For instance, plugins may add RPC capabilities, wallet integration, transaction building,\n * or other features necessary for interacting with the Solana blockchain.\n *\n * Plugins are functions that take a client object as input and return a new client object\n * or a promise that resolves to a new client object. This allows for both synchronous\n * and asynchronous transformations and extensions of the client.\n *\n * Plugins are usually applied using the `use` method on a {@link Client} or {@link AsyncClient}\n * instance, which {@link createEmptyClient} provides as a starting point.\n *\n * @typeParam TInput - The input client object type that this plugin accepts.\n * @typeParam TOutput - The output type. Either a new client object or a promise resolving to one.\n *\n * @example Basic RPC plugin\n * Given an RPC endpoint, this plugin adds an `rpc` property to the client.\n *\n * ```ts\n * import { createEmptyClient, createSolanaRpc } from '@solana/kit';\n *\n * // Define a simple RPC plugin.\n * function rpcPlugin(endpoint: string) {\n * return (client: T) => ({...client, rpc: createSolanaRpc(endpoint) });\n * }\n *\n * // Use the plugin.\n * const client = createEmptyClient().use(rpcPlugin('https://api.mainnet-beta.solana.com'));\n * await client.rpc.getLatestBlockhash().send();\n * ```\n *\n * @example Async plugin that generates a payer wallet\n * The following plugin shows how to create an asynchronous plugin that generates a new keypair signer.\n *\n * ```ts\n * import { createEmptyClient, generateKeypairSigner } from '@solana/kit';\n *\n * // Define a plugin that generates a new keypair signer.\n * function generatedPayerPlugin() {\n * return async (client: T) => ({...client, payer: await generateKeypairSigner() });\n * }\n *\n * // Use the plugin.\n * const client = await createEmptyClient().use(generatedPayerPlugin());\n * console.log(client.payer.address);\n * ```\n *\n * @example Plugins with input requirements\n * A plugin can specify required properties on the input client. The example below requires the\n * client to already have a `payer` signer attached to the client in order to perform an airdrop.\n *\n * ```ts\n * import { createEmptyClient, TransactionSigner, Lamports, lamports } from '@solana/kit';\n *\n * // Define a plugin that airdrops lamports to the payer set on the client.\n * function airdropPayerPlugin(lamports: Lamports) {\n * return async (client: T) => {\n * await myAirdropFunction(client.payer, lamports);\n * return client;\n * };\n * }\n *\n * // Use the plugins.\n * const client = await createEmptyClient()\n * .use(generatedPayerPlugin()) // This is required before using the airdrop plugin.\n * .use(airdropPayerPlugin(lamports(1_000_000_000n)));\n * ```\n *\n * @example Chaining plugins\n * Multiple plugins — asynchronous or not — can be chained together to build up complex clients.\n * The example below demonstrates how to gradually build a client with multiple plugins.\n * Notice how, despite having multiple asynchronous plugins, we only need to `await` the final result.\n * This is because the `use` method on `AsyncClient` returns another `AsyncClient`, allowing for seamless chaining.\n *\n * ```ts\n * import { createEmptyClient, createSolanaRpc, createSolanaRpcSubscriptions, generateKeypairSigner } from '@solana/kit';\n *\n * // Define multiple plugins.\n * function rpcPlugin(endpoint: string) {\n * return (client: T) => ({...client, rpc: createSolanaRpc(endpoint) });\n * }\n * function rpcSubscriptionsPlugin(endpoint: string) {\n * return (client: T) => ({...client, rpc: createSolanaRpcSubscriptions(endpoint) });\n * }\n * function generatedPayerPlugin() {\n * return async (client: T) => ({...client, payer: await generateKeypairSigner() });\n * }\n * function generatedAuthorityPlugin() {\n * return async (client: T) => ({...client, authority: await generateKeypairSigner() });\n * }\n *\n * // Chain plugins together.\n * const client = await createEmptyClient()\n * .use(rpcPlugin('https://api.mainnet-beta.solana.com'))\n * .use(rpcSubscriptionsPlugin('wss://api.mainnet-beta.solana.com'))\n * .use(generatedPayerPlugin())\n * .use(generatedAuthorityPlugin());\n * ```\n */\nexport type ClientPlugin | object> = (input: TInput) => TOutput;\n\n/**\n * A client that can be extended with plugins.\n *\n * The `Client` type represents a client object that can be built up through\n * the application of one or more plugins. It provides a `use` method to\n * apply plugins, either synchronously (returning a new `Client`) or\n * asynchronously (returning an {@link AsyncClient}).\n *\n * @typeParam TSelf - The current shape of the client object including all applied plugins.\n */\nexport type Client = TSelf & {\n /**\n * Applies a plugin to extend or transform the client.\n *\n * @param plugin The plugin function to apply to this client.\n * @returns Either a new `Client` (for sync plugins) or {@link AsyncClient} (for async plugins).\n */\n readonly use: | object>(\n plugin: ClientPlugin,\n ) => TOutput extends Promise ? AsyncClient : Client;\n};\n\n/**\n * An asynchronous wrapper that represents a promise of a client.\n *\n * The `AsyncClient` type is returned when an async plugin is applied to a client.\n * It behaves like a `Promise>` but with an additional `use` method\n * that allows chaining more plugins before the promise resolves.\n *\n * This enables fluent chaining of both synchronous and asynchronous plugins\n * without having to await intermediate promises.\n *\n * @typeParam TSelf - The shape of the client object that this async client will resolve to.\n */\nexport type AsyncClient = Promise> & {\n /**\n * Applies a plugin to the client once it resolves.\n *\n * @param plugin The plugin function to apply to the resolved client.\n * @returns A new `AsyncClient` representing the result of applying the plugin.\n */\n readonly use: | object>(\n plugin: ClientPlugin,\n ) => AsyncClient ? (U extends object ? U : never) : TOutput>;\n};\n\n// TODO(loris): Add examples in this docblock using real plugins once they have been published.\n\n/**\n * Creates a new empty client that can be extended with plugins.\n *\n * This serves as an entry point for building Solana clients.\n * Start with an empty client and chain the `.use()` method\n * to apply plugins that add various functionalities such as RPC\n * connectivity, wallet integration, transaction building, and more.\n *\n * See {@link ClientPlugin} for detailed examples on creating and using plugins.\n *\n * @returns An empty client object with only the `use` method available.\n *\n * @example Basic client setup\n * ```ts\n * import { createEmptyClient } from '@solana/client';\n *\n * const client = createEmptyClient()\n * .use(myRpcPlugin('https://api.mainnet-beta.solana.com'))\n * .use(myWalletPlugin());\n * ```\n */\nexport function createEmptyClient(): Client {\n return addUse({});\n}\n\nfunction addUse(value: TSelf): Client {\n return Object.freeze({\n ...value,\n use | object>(plugin: ClientPlugin) {\n const result = plugin(value);\n return result instanceof Promise ? createAsyncClient(result) : addUse(result);\n },\n } as Client);\n}\n\nfunction createAsyncClient(promise: Promise): AsyncClient {\n return Object.freeze({\n catch(onrejected) {\n return promise.then(v => addUse(v)).catch(onrejected);\n },\n finally(onfinally) {\n return promise.then(v => addUse(v)).finally(onfinally);\n },\n then(onfulfilled, onrejected) {\n return promise.then(v => addUse(v)).then(onfulfilled, onrejected);\n },\n use | object>(plugin: ClientPlugin) {\n return createAsyncClient(promise.then(plugin));\n },\n } as AsyncClient);\n}\n","import type { Address } from '@solana/addresses';\nimport { isSolanaError, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM, SolanaError } from '@solana/errors';\n\n/**\n * Identifies whether an error -- typically caused by a transaction failure -- is a custom program\n * error from the provided program address.\n *\n * @param transactionMessage The transaction message that failed to execute. Since the RPC response\n * only provides the index of the failed instruction, the transaction message is required to\n * determine its program address\n * @param programAddress The address of the program from which the error is expected to have\n * originated\n * @param code The expected error code of the custom program error. When provided, the function will\n * check that the custom program error code matches the given value.\n *\n * @example\n * ```ts\n * try {\n * // Send and confirm your transaction.\n * } catch (error) {\n * if (isProgramError(error, transactionMessage, myProgramAddress, 42)) {\n * // Handle custom program error 42 from this program.\n * } else if (isProgramError(error, transactionMessage, myProgramAddress)) {\n * // Handle all other custom program errors from this program.\n * } else {\n * throw error;\n * }\n * }\n * ```\n */\nexport function isProgramError(\n error: unknown,\n transactionMessage: { instructions: Record },\n programAddress: Address,\n code?: TProgramErrorCode,\n): error is Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> &\n SolanaError {\n if (!isSolanaError(error, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM)) {\n return false;\n }\n const instructionProgramAddress = transactionMessage.instructions[error.context.index]?.programAddress;\n if (!instructionProgramAddress || instructionProgramAddress !== programAddress) {\n return false;\n }\n return typeof code === 'undefined' || error.context.code === code;\n}\n","/**\n * This function is a replacement for `JSON.parse` that can handle large\n * unsafe integers by parsing them as BigInts. It transforms every\n * numerical value into a BigInt without loss of precision.\n */\nexport function parseJsonWithBigInts(json: string): unknown {\n return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => {\n return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value;\n });\n}\n\nfunction wrapIntegersInBigIntValueObject(json: string): string {\n const out = [];\n let inQuote = false;\n for (let ii = 0; ii < json.length; ii++) {\n let isEscaped = false;\n if (json[ii] === '\\\\') {\n out.push(json[ii++]);\n isEscaped = !isEscaped;\n }\n if (json[ii] === '\"') {\n out.push(json[ii]);\n if (!isEscaped) {\n inQuote = !inQuote;\n }\n continue;\n }\n if (!inQuote) {\n const consumedNumber = consumeNumber(json, ii);\n if (consumedNumber?.length) {\n ii += consumedNumber.length - 1;\n // Don't wrap numbers that contain a decimal point or a negative exponent.\n if (consumedNumber.match(/\\.|[eE]-/)) {\n out.push(consumedNumber);\n } else {\n out.push(wrapBigIntValueObject(consumedNumber));\n }\n continue;\n }\n }\n out.push(json[ii]);\n }\n\n return out.join('');\n}\n\nfunction consumeNumber(json: string, ii: number): string | null {\n /** @see https://stackoverflow.com/a/13340826/11440277 */\n const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\n\n // Stop early if the first character isn't a digit or a minus sign.\n if (!json[ii]?.match(/[-\\d]/)) {\n return null;\n }\n\n // Otherwise, check if the next characters form a valid JSON number.\n const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX);\n return numberMatch ? numberMatch[0] : null;\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: string): string {\n return `{\"$n\":\"${value}\"}`;\n}\n\nfunction unwrapBigIntValueObject({ $n }: BigIntValueObject): bigint {\n if ($n.match(/[eE]/)) {\n const [units, exponent] = $n.split(/[eE]/);\n return BigInt(units) * BigInt(10) ** BigInt(exponent);\n }\n return BigInt($n);\n}\n\nfunction isBigIntValueObject(value: unknown): value is BigIntValueObject {\n return !!value && typeof value === 'object' && '$n' in value && typeof value.$n === 'string';\n}\n","import { RpcRequest } from './rpc-request';\n\nlet _nextMessageId = 0n;\nfunction getNextMessageId(): string {\n const id = _nextMessageId;\n _nextMessageId++;\n return id.toString();\n}\n\n/**\n * Returns a spec-compliant JSON RPC 2.0 message, given a method name and some params.\n *\n * Generates a new `id` on each call by incrementing a `bigint` and casting it to a string.\n */\nexport function createRpcMessage(request: RpcRequest) {\n return {\n id: getNextMessageId(),\n jsonrpc: '2.0',\n method: request.methodName,\n params: request.params,\n };\n}\n","/**\n * Transforms a value into a JSON string, whilst rendering bigints as large unsafe integers.\n */\nexport function stringifyJsonWithBigInts(value: unknown, space?: number | string): string {\n return unwrapBigIntValueObject(\n JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? wrapBigIntValueObject(v) : v), space),\n );\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: bigint): BigIntValueObject {\n return { $n: `${value}` };\n}\n\nfunction unwrapBigIntValueObject(value: string): string {\n return value.replace(/\\{\\s*\"\\$n\"\\s*:\\s*\"(-?\\d+)\"\\s*\\}/g, '$1');\n}\n","import { SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, SolanaError } from '@solana/errors';\nimport { Callable, Flatten, OverloadImplementations, UnionToIntersection } from '@solana/rpc-spec-types';\n\nimport { RpcApi, RpcPlan } from './rpc-api';\nimport { RpcTransport } from './rpc-transport';\n\nexport type RpcConfig = Readonly<{\n api: RpcApi;\n transport: TRpcTransport;\n}>;\n\n/**\n * An object that exposes all of the functions described by `TRpcMethods`.\n *\n * Calling each method returns a {@link PendingRpcRequest | PendingRpcRequest} where\n * `TResponse` is that method's response type.\n */\nexport type Rpc = {\n [TMethodName in keyof TRpcMethods]: PendingRpcRequestBuilder>;\n};\n\n/**\n * Pending requests are the result of calling a supported method on a {@link Rpc} object. They\n * encapsulate all of the information necessary to make the request without actually making it.\n *\n * Calling the {@link PendingRpcRequest.send | `send(options)`} method on a\n * {@link PendingRpcRequest | PendingRpcRequest} will trigger the request and return a\n * promise for `TResponse`.\n */\nexport type PendingRpcRequest = {\n send(options?: RpcSendOptions): Promise;\n};\n\nexport type RpcSendOptions = Readonly<{\n /**\n * An optional signal that you can supply when triggering a {@link PendingRpcRequest} that you\n * might later need to abort.\n */\n abortSignal?: AbortSignal;\n}>;\n\ntype PendingRpcRequestBuilder = UnionToIntersection<\n Flatten<{\n [P in keyof TMethodImplementations]: PendingRpcRequestReturnTypeMapper;\n }>\n>;\n\ntype PendingRpcRequestReturnTypeMapper =\n // Check that this property of the TRpcMethods interface is, in fact, a function.\n TMethodImplementation extends Callable\n ? (...args: Parameters) => PendingRpcRequest>\n : never;\n\n/**\n * Creates a {@link Rpc} instance given a {@link RpcApi | RpcApi} and a\n * {@link RpcTransport} capable of fulfilling them.\n */\nexport function createRpc(\n rpcConfig: RpcConfig,\n): Rpc {\n return makeProxy(rpcConfig);\n}\n\nfunction makeProxy(\n rpcConfig: RpcConfig,\n): Rpc {\n return new Proxy(rpcConfig.api, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get(target, p, receiver) {\n if (p === 'then') {\n return undefined;\n }\n return function (...rawParams: unknown[]) {\n const methodName = p.toString();\n const getApiPlan = Reflect.get(target, methodName, receiver);\n if (!getApiPlan) {\n throw new SolanaError(SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD, {\n method: methodName,\n params: rawParams,\n });\n }\n const apiPlan = getApiPlan(...rawParams);\n return createPendingRpcRequest(rpcConfig, apiPlan);\n };\n },\n }) as Rpc;\n}\n\nfunction createPendingRpcRequest(\n { transport }: RpcConfig,\n plan: RpcPlan,\n): PendingRpcRequest {\n return {\n async send(options?: RpcSendOptions): Promise {\n return await plan.execute({ signal: options?.abortSignal, transport });\n },\n };\n}\n","import {\n Callable,\n createRpcMessage,\n RpcRequestTransformer,\n RpcResponse,\n RpcResponseTransformer,\n} from '@solana/rpc-spec-types';\n\nimport type { RpcTransport } from './rpc-transport';\n\nexport type RpcApiConfig = Readonly<{\n /**\n * An optional function that transforms the {@link RpcRequest} before it is sent to the JSON RPC\n * server.\n *\n * This is useful when the params supplied by the caller need to be transformed before\n * forwarding the message to the server. Use cases for this include applying defaults,\n * forwarding calls to renamed methods, and serializing complex values.\n */\n requestTransformer?: RpcRequestTransformer;\n /**\n * An optional function that transforms the {@link RpcResponse} before it is returned to the\n * caller.\n *\n * Use cases for this include constructing complex data types from serialized data, and throwing\n * exceptions.\n */\n responseTransformer?: RpcResponseTransformer;\n}>;\n\n/**\n * This type allows an {@link RpcApi} to describe how a particular request should be issued to the\n * JSON RPC server.\n *\n * Given a function that was called on a {@link Rpc}, this object exposes an `execute` function that\n * dictates which request will be sent, how the underlying transport will be used, and how the\n * responses will be transformed.\n *\n * This function accepts a {@link RpcTransport} and an `AbortSignal` and asynchronously returns a\n * {@link RpcResponse}. This gives us the opportunity to:\n *\n * - define the `payload` from the requested method name and parameters before passing it to the\n * transport.\n * - call the underlying transport zero, one or multiple times depending on the use-case (e.g.\n * caching or aggregating multiple responses).\n * - transform the response from the JSON RPC server, in case it does not match the `TResponse`\n * specified by the {@link PendingRpcRequest | PendingRpcRequest} returned from that\n * function.\n */\nexport type RpcPlan = {\n execute: (\n config: Readonly<{\n signal?: AbortSignal;\n transport: RpcTransport;\n }>,\n ) => Promise>;\n};\n\n/**\n * For each of `TRpcMethods`, this object exposes a method with the same name that maps between its\n * input arguments and a {@link RpcPlan | RpcPlan} that implements the execution of a\n * JSON RPC request to fetch `TResponse`.\n */\nexport type RpcApi = {\n [MethodName in keyof TRpcMethods]: RpcReturnTypeMapper;\n};\n\ntype RpcReturnTypeMapper = TRpcMethod extends Callable\n ? (...rawParams: unknown[]) => RpcPlan>\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RpcApiMethod = (...args: any) => any;\ninterface RpcApiMethods {\n [methodName: string]: RpcApiMethod;\n}\n\n/**\n * Creates a JavaScript proxy that converts _any_ function call called on it to a {@link RpcPlan} by\n * creating an `execute` function that:\n *\n * - sets the transport payload to a JSON RPC v2 payload object with the requested `methodName` and\n * `params` properties, optionally transformed by {@link RpcApiConfig.requestTransformer}.\n * - transforms the transport's response using the {@link RpcApiConfig.responseTransformer}\n * function, if provided.\n *\n * @example\n * ```ts\n * // For example, given this `RpcApi`:\n * const rpcApi = createJsonRpcApi({\n * requestTransformer: (...rawParams) => rawParams.reverse(),\n * responseTransformer: response => response.result,\n * });\n *\n * // ...the following function call:\n * rpcApi.foo('bar', { baz: 'bat' });\n *\n * // ...will produce a `RpcPlan` that:\n * // - Uses the following payload: { id: 1, jsonrpc: '2.0', method: 'foo', params: [{ baz: 'bat' }, 'bar'] }.\n * // - Returns the \"result\" property of the RPC response.\n * ```\n */\nexport function createJsonRpcApi(config?: RpcApiConfig): RpcApi {\n return new Proxy({} as RpcApi, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get>(\n ...args: Parameters>['get']>>\n ) {\n const [_, p] = args;\n const methodName = p.toString() as keyof TRpcMethods as string;\n return function (\n ...rawParams: Parameters<\n TRpcMethods[TMethodName] extends CallableFunction ? TRpcMethods[TMethodName] : never\n >\n ): RpcPlan> {\n const rawRequest = Object.freeze({ methodName, params: rawParams });\n const request = config?.requestTransformer ? config?.requestTransformer(rawRequest) : rawRequest;\n return Object.freeze(>>{\n execute: async ({ signal, transport }) => {\n const payload = createRpcMessage(request);\n const response = await transport({ payload, signal });\n if (!config?.responseTransformer) {\n return response;\n }\n return config.responseTransformer(response, request);\n },\n });\n };\n },\n });\n}\n","import { RpcResponse } from '@solana/rpc-spec-types';\n\ntype Config = Readonly<{\n /** A value of arbitrary type to be sent to a RPC server */\n payload: unknown;\n /**\n * An optional `AbortSignal` on which the `'abort'` event will be fired if the request should be\n * cancelled.\n */\n signal?: AbortSignal;\n}>;\n\n/**\n * A function that can act as a transport for a {@link Rpc}. It need only return a promise for a\n * response given the supplied config.\n */\nexport type RpcTransport = {\n (config: Config): Promise>;\n};\n\n/**\n * Returns `true` if the given payload is a JSON RPC v2 payload.\n *\n * This means, the payload is an object such that:\n *\n * - It has a `jsonrpc` property with a value of `'2.0'`.\n * - It has a `method` property that is a string.\n * - It has a `params` property of any type.\n *\n * @example\n * ```ts\n * import { isJsonRpcPayload } from '@solana/rpc-spec';\n *\n * if (isJsonRpcPayload(payload)) {\n * const payloadMethod: string = payload.method;\n * const payloadParams: unknown = payload.params;\n * }\n * ```\n */\nexport function isJsonRpcPayload(payload: unknown): payload is Readonly<{\n jsonrpc: '2.0';\n method: string;\n params: unknown;\n}> {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) {\n return false;\n }\n return (\n 'jsonrpc' in payload &&\n payload.jsonrpc === '2.0' &&\n 'method' in payload &&\n typeof payload.method === 'string' &&\n 'params' in payload\n );\n}\n","export function downcastNodeToNumberIfBigint(value: bigint): number;\nexport function downcastNodeToNumberIfBigint(value: T): T;\nexport function downcastNodeToNumberIfBigint(value: unknown): unknown {\n return typeof value === 'bigint'\n ? // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana\n // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely\n // downcasting `bigints` to `numbers`.\n Number(value)\n : value;\n}\n","import { RpcRequest, RpcRequestTransformer, RpcResponseTransformer } from '@solana/rpc-spec-types';\n\nexport type KeyPathWildcard = { readonly ['__keyPathWildcard:@solana/kit']: unique symbol };\nexport type KeyPath = ReadonlyArray;\n\nexport const KEYPATH_WILDCARD = {} as KeyPathWildcard;\n\ntype NodeVisitor = (value: unknown, state: TState) => unknown;\nexport type TraversalState = Readonly<{\n keyPath: KeyPath;\n}>;\n\nfunction getTreeWalker(visitors: NodeVisitor[]) {\n return function traverse(node: unknown, state: TState): unknown {\n if (Array.isArray(node)) {\n return node.map((element, ii) => {\n const nextState = {\n ...state,\n keyPath: [...state.keyPath, ii],\n };\n return traverse(element, nextState);\n });\n } else if (typeof node === 'object' && node !== null) {\n const out: Record = {};\n for (const propName in node) {\n if (!Object.prototype.hasOwnProperty.call(node, propName)) {\n continue;\n }\n const nextState = {\n ...state,\n keyPath: [...state.keyPath, propName],\n };\n out[propName] = traverse(node[propName as keyof typeof node], nextState);\n }\n return out;\n } else {\n return visitors.reduce((acc, visitNode) => visitNode(acc, state), node);\n }\n };\n}\n\n/**\n * Creates a transformer that traverses the request parameters and executes the provided visitors at\n * each node. A custom initial state can be provided but must at least provide `{ keyPath: [] }`.\n *\n * @example\n * ```ts\n * import { getTreeWalkerRequestTransformer } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getTreeWalkerRequestTransformer(\n * [\n * // Replaces foo.bar with \"baz\".\n * (node, state) => (state.keyPath === ['foo', 'bar'] ? 'baz' : node),\n * // Increments all numbers by 1.\n * node => (typeof node === number ? node + 1 : node),\n * ],\n * { keyPath: [] },\n * );\n * ```\n */\nexport function getTreeWalkerRequestTransformer(\n visitors: NodeVisitor[],\n initialState: TState,\n): RpcRequestTransformer {\n return (request: RpcRequest): RpcRequest => {\n const traverse = getTreeWalker(visitors);\n return Object.freeze({\n ...request,\n params: traverse(request.params, initialState),\n });\n };\n}\n\nexport function getTreeWalkerResponseTransformer(\n visitors: NodeVisitor[],\n initialState: TState,\n): RpcResponseTransformer {\n return json => getTreeWalker(visitors)(json, initialState);\n}\n","import { downcastNodeToNumberIfBigint } from './request-transformer-bigint-downcast-internal';\nimport { getTreeWalkerRequestTransformer } from './tree-traversal';\n\n/**\n * Creates a transformer that downcasts all `BigInt` values to `Number`.\n *\n * @example\n * ```ts\n * import { getBigIntDowncastRequestTransformer } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getBigIntDowncastRequestTransformer();\n * ```\n *\n */\nexport function getBigIntDowncastRequestTransformer() {\n return getTreeWalkerRequestTransformer([downcastNodeToNumberIfBigint], { keyPath: [] });\n}\n","import { Commitment } from '@solana/rpc-types';\n\nexport function applyDefaultCommitment({\n commitmentPropertyName,\n params,\n optionsObjectPositionInParams,\n overrideCommitment,\n}: Readonly<{\n commitmentPropertyName: string;\n optionsObjectPositionInParams: number;\n overrideCommitment?: Commitment;\n params: unknown[];\n}>) {\n const paramInTargetPosition = params[optionsObjectPositionInParams];\n if (\n // There's no config.\n paramInTargetPosition === undefined ||\n // There is a config object.\n (paramInTargetPosition && typeof paramInTargetPosition === 'object' && !Array.isArray(paramInTargetPosition))\n ) {\n if (\n // The config object already has a commitment set.\n paramInTargetPosition &&\n commitmentPropertyName in paramInTargetPosition\n ) {\n if (\n !paramInTargetPosition[commitmentPropertyName as keyof typeof paramInTargetPosition] ||\n paramInTargetPosition[commitmentPropertyName as keyof typeof paramInTargetPosition] === 'finalized'\n ) {\n // Delete the commitment property; `finalized` is already the server default.\n const nextParams = [...params];\n const {\n [commitmentPropertyName as keyof typeof paramInTargetPosition]: _, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...rest\n } = paramInTargetPosition;\n if (Object.keys(rest).length > 0) {\n nextParams[optionsObjectPositionInParams] = rest;\n } else {\n if (optionsObjectPositionInParams === nextParams.length - 1) {\n nextParams.length--;\n } else {\n nextParams[optionsObjectPositionInParams] = undefined;\n }\n }\n return nextParams;\n }\n } else if (overrideCommitment !== 'finalized') {\n // Apply the default commitment.\n const nextParams = [...params];\n nextParams[optionsObjectPositionInParams] = {\n ...paramInTargetPosition,\n [commitmentPropertyName]: overrideCommitment,\n };\n return nextParams;\n }\n }\n return params;\n}\n","import type { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec-types';\nimport type { Commitment } from '@solana/rpc-types';\n\nimport { applyDefaultCommitment } from './request-transformer-default-commitment-internal';\n\n/**\n * Creates a transformer that adds the provided default commitment to the configuration object of the request when applicable.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { getDefaultCommitmentRequestTransformer, OPTIONS_OBJECT_POSITION_BY_METHOD } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getDefaultCommitmentRequestTransformer({\n * defaultCommitment: 'confirmed',\n * optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD,\n * });\n */\nexport function getDefaultCommitmentRequestTransformer({\n defaultCommitment,\n optionsObjectPositionByMethod,\n}: Readonly<{\n defaultCommitment?: Commitment;\n optionsObjectPositionByMethod: Record;\n}>): RpcRequestTransformer {\n return (request: RpcRequest): RpcRequest => {\n const { params, methodName } = request;\n\n // We only apply default commitment to array parameters.\n if (!Array.isArray(params)) {\n return request;\n }\n\n // Find the position of the options object in the parameters and abort if not found.\n const optionsObjectPositionInParams = optionsObjectPositionByMethod[methodName];\n if (optionsObjectPositionInParams == null) {\n return request;\n }\n\n return Object.freeze({\n methodName,\n params: applyDefaultCommitment({\n commitmentPropertyName: methodName === 'sendTransaction' ? 'preflightCommitment' : 'commitment',\n optionsObjectPositionInParams,\n overrideCommitment: defaultCommitment,\n params,\n }),\n });\n };\n}\n","import { KeyPath, TraversalState } from './tree-traversal';\n\nexport function getIntegerOverflowNodeVisitor(onIntegerOverflow: (keyPath: KeyPath, value: bigint) => void) {\n return (value: T, { keyPath }: TraversalState): T => {\n if (typeof value === 'bigint') {\n if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) {\n onIntegerOverflow(keyPath as (number | string)[], value);\n }\n }\n return value;\n };\n}\n","import { RpcRequest } from '@solana/rpc-spec-types';\n\nimport { getIntegerOverflowNodeVisitor } from './request-transformer-integer-overflow-internal';\nimport { getTreeWalkerRequestTransformer, KeyPath } from './tree-traversal';\n\nexport type IntegerOverflowHandler = (request: RpcRequest, keyPath: KeyPath, value: bigint) => void;\n\n/**\n * Creates a transformer that traverses the request parameters and executes the provided handler\n * when an integer overflow is detected.\n *\n * @example\n * ```ts\n * import { getIntegerOverflowRequestTransformer } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getIntegerOverflowRequestTransformer((request, keyPath, value) => {\n * throw new Error(`Integer overflow at ${keyPath.join('.')}: ${value}`);\n * });\n * ```\n */\nexport function getIntegerOverflowRequestTransformer(onIntegerOverflow: IntegerOverflowHandler) {\n return (request: RpcRequest): RpcRequest => {\n const transformer = getTreeWalkerRequestTransformer(\n [getIntegerOverflowNodeVisitor((...args) => onIntegerOverflow(request, ...args))],\n { keyPath: [] },\n );\n return transformer(request);\n };\n}\n","export const OPTIONS_OBJECT_POSITION_BY_METHOD: Record = {\n accountNotifications: 1,\n blockNotifications: 1,\n getAccountInfo: 1,\n getBalance: 1,\n getBlock: 1,\n getBlockHeight: 0,\n getBlockProduction: 0,\n getBlocks: 2,\n getBlocksWithLimit: 2,\n getEpochInfo: 0,\n getFeeForMessage: 1,\n getInflationGovernor: 0,\n getInflationReward: 1,\n getLargestAccounts: 0,\n getLatestBlockhash: 0,\n getLeaderSchedule: 1,\n getMinimumBalanceForRentExemption: 1,\n getMultipleAccounts: 1,\n getProgramAccounts: 1,\n getSignaturesForAddress: 1,\n getSlot: 0,\n getSlotLeader: 0,\n getStakeMinimumDelegation: 0,\n getSupply: 0,\n getTokenAccountBalance: 1,\n getTokenAccountsByDelegate: 2,\n getTokenAccountsByOwner: 2,\n getTokenLargestAccounts: 1,\n getTokenSupply: 1,\n getTransaction: 1,\n getTransactionCount: 0,\n getVoteAccounts: 0,\n isBlockhashValid: 1,\n logsNotifications: 1,\n programNotifications: 1,\n requestAirdrop: 2,\n sendTransaction: 1,\n signatureNotifications: 1,\n simulateTransaction: 1,\n};\n","import { pipe } from '@solana/functional';\nimport { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec-types';\nimport { Commitment } from '@solana/rpc-types';\n\nimport { getBigIntDowncastRequestTransformer } from './request-transformer-bigint-downcast';\nimport { getDefaultCommitmentRequestTransformer } from './request-transformer-default-commitment';\nimport { getIntegerOverflowRequestTransformer, IntegerOverflowHandler } from './request-transformer-integer-overflow';\nimport { OPTIONS_OBJECT_POSITION_BY_METHOD } from './request-transformer-options-object-position-config';\n\nexport type RequestTransformerConfig = Readonly<{\n /**\n * An optional {@link Commitment} value to use as the default when none is supplied by the\n * caller.\n */\n defaultCommitment?: Commitment;\n /**\n * An optional function that will be called whenever a `bigint` input exceeds that which can be\n * expressed using JavaScript numbers.\n *\n * This is used in the default {@link SolanaRpcSubscriptionsApi} to throw an exception rather\n * than to allow truncated values to propagate through a program.\n */\n onIntegerOverflow?: IntegerOverflowHandler;\n}>;\n\n/**\n * Returns the default request transformer for the Solana RPC API.\n *\n * Under the hood, this function composes multiple\n * {@link RpcRequestTransformer | RpcRequestTransformers} together such as the\n * {@link getDefaultCommitmentTransformer}, the {@link getIntegerOverflowRequestTransformer} and the\n * {@link getBigIntDowncastRequestTransformer}.\n *\n * @example\n * ```ts\n * import { getDefaultRequestTransformerForSolanaRpc } from '@solana/rpc-transformers';\n *\n * const requestTransformer = getDefaultRequestTransformerForSolanaRpc({\n * defaultCommitment: 'confirmed',\n * onIntegerOverflow: (request, keyPath, value) => {\n * throw new Error(`Integer overflow at ${keyPath.join('.')}: ${value}`);\n * },\n * });\n * ```\n */\nexport function getDefaultRequestTransformerForSolanaRpc(config?: RequestTransformerConfig): RpcRequestTransformer {\n const handleIntegerOverflow = config?.onIntegerOverflow;\n return (request: RpcRequest): RpcRequest => {\n return pipe(\n request,\n handleIntegerOverflow ? getIntegerOverflowRequestTransformer(handleIntegerOverflow) : r => r,\n getBigIntDowncastRequestTransformer(),\n getDefaultCommitmentRequestTransformer({\n defaultCommitment: config?.defaultCommitment,\n optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD,\n }),\n );\n };\n}\n","import { KeyPath, KEYPATH_WILDCARD, TraversalState } from './tree-traversal';\n\nexport function getBigIntUpcastVisitor(allowedNumericKeyPaths: readonly KeyPath[]) {\n return function upcastNodeToBigIntIfNumber(value: unknown, { keyPath }: TraversalState) {\n const isInteger = (typeof value === 'number' && Number.isInteger(value)) || typeof value === 'bigint';\n if (!isInteger) return value;\n if (keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) {\n return Number(value);\n } else {\n return BigInt(value);\n }\n };\n}\n\nfunction keyPathIsAllowedToBeNumeric(keyPath: KeyPath, allowedNumericKeyPaths: readonly KeyPath[]) {\n return allowedNumericKeyPaths.some(prohibitedKeyPath => {\n if (prohibitedKeyPath.length !== keyPath.length) {\n return false;\n }\n for (let ii = keyPath.length - 1; ii >= 0; ii--) {\n const keyPathPart = keyPath[ii];\n const prohibitedKeyPathPart = prohibitedKeyPath[ii];\n if (\n prohibitedKeyPathPart !== keyPathPart &&\n (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== 'number')\n ) {\n return false;\n }\n }\n return true;\n });\n}\n","import { getBigIntUpcastVisitor } from './response-transformer-bigint-upcast-internal';\nimport { getTreeWalkerResponseTransformer, KeyPath } from './tree-traversal';\n\n/**\n * Returns a transformer that upcasts all `Number` values to `BigInts` unless they match within the\n * provided {@link KeyPath | KeyPaths}. In other words, the provided {@link KeyPath | KeyPaths} will\n * remain as `Number` values, any other numeric value will be upcasted to a `BigInt`.\n *\n * Note that you can use {@link KEYPATH_WILDCARD} to match any key within a {@link KeyPath}.\n *\n * @example\n * ```ts\n * import { getBigIntUpcastResponseTransformer } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getBigIntUpcastResponseTransformer([\n * ['index'],\n * ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n * ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n * ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n * ]);\n * ```\n */\nexport function getBigIntUpcastResponseTransformer(allowedNumericKeyPaths: readonly KeyPath[]) {\n return getTreeWalkerResponseTransformer([getBigIntUpcastVisitor(allowedNumericKeyPaths)], { keyPath: [] });\n}\n","import { RpcResponseTransformer } from '@solana/rpc-spec-types';\n\ntype JsonRpcResponse = { result: unknown };\n\n/**\n * Returns a transformer that extracts the `result` field from the body of the RPC response.\n *\n * For instance, we go from `{ jsonrpc: '2.0', result: 'foo', id: 1 }` to `'foo'`.\n *\n * @example\n * ```ts\n * import { getResultResponseTransformer } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getResultResponseTransformer();\n * ```\n */\nexport function getResultResponseTransformer(): RpcResponseTransformer {\n return json => (json as JsonRpcResponse).result;\n}\n","import { KeyPath, KEYPATH_WILDCARD } from './tree-traversal';\n\nexport type AllowedNumericKeypaths = Partial>;\n\n// Numeric values nested in `jsonParsed` accounts\nexport const jsonParsedTokenAccountsConfigs = [\n // parsed Token/Token22 token account\n ['data', 'parsed', 'info', 'tokenAmount', 'decimals'],\n ['data', 'parsed', 'info', 'tokenAmount', 'uiAmount'],\n ['data', 'parsed', 'info', 'rentExemptReserve', 'decimals'],\n ['data', 'parsed', 'info', 'rentExemptReserve', 'uiAmount'],\n ['data', 'parsed', 'info', 'delegatedAmount', 'decimals'],\n ['data', 'parsed', 'info', 'delegatedAmount', 'uiAmount'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'olderTransferFee', 'transferFeeBasisPoints'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'newerTransferFee', 'transferFeeBasisPoints'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'preUpdateAverageRate'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'currentRate'],\n];\nexport const jsonParsedAccountsConfigs = [\n ...jsonParsedTokenAccountsConfigs,\n // parsed AddressTableLookup account\n ['data', 'parsed', 'info', 'lastExtendedSlotStartIndex'],\n // parsed Config account\n ['data', 'parsed', 'info', 'slashPenalty'],\n ['data', 'parsed', 'info', 'warmupCooldownRate'],\n // parsed Token/Token22 mint account\n ['data', 'parsed', 'info', 'decimals'],\n // parsed Token/Token22 multisig account\n ['data', 'parsed', 'info', 'numRequiredSigners'],\n ['data', 'parsed', 'info', 'numValidSigners'],\n // parsed Stake account\n ['data', 'parsed', 'info', 'stake', 'delegation', 'warmupCooldownRate'],\n // parsed Sysvar rent account\n ['data', 'parsed', 'info', 'exemptionThreshold'],\n ['data', 'parsed', 'info', 'burnPercent'],\n // parsed Vote account\n ['data', 'parsed', 'info', 'commission'],\n ['data', 'parsed', 'info', 'votes', KEYPATH_WILDCARD, 'confirmationCount'],\n];\nexport const innerInstructionsConfigs = [\n ['index'],\n ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n];\nexport const messageConfig = [\n ['addressTableLookups', KEYPATH_WILDCARD, 'writableIndexes', KEYPATH_WILDCARD],\n ['addressTableLookups', KEYPATH_WILDCARD, 'readonlyIndexes', KEYPATH_WILDCARD],\n ['header', 'numReadonlySignedAccounts'],\n ['header', 'numReadonlyUnsignedAccounts'],\n ['header', 'numRequiredSignatures'],\n ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n] as const;\n","import { getSolanaErrorFromJsonRpcError } from '@solana/errors';\nimport { RpcResponseTransformer } from '@solana/rpc-spec-types';\n\nimport { innerInstructionsConfigs, jsonParsedAccountsConfigs } from './response-transformer-allowed-numeric-values';\nimport { getBigIntUpcastVisitor } from './response-transformer-bigint-upcast-internal';\nimport { getTreeWalkerResponseTransformer, KeyPath, KEYPATH_WILDCARD } from './tree-traversal';\n\ntype JsonRpcResponse = { error: Parameters[0] } | { result: unknown };\n\n// Keypaths for simulateTransaction result that should remain as Number (not BigInt)\n// Note: These are relative to the error.data root, not result.value like in success responses\nfunction getSimulateTransactionAllowedNumericKeypaths(): readonly KeyPath[] {\n return [\n ['loadedAccountsDataSize'],\n ...jsonParsedAccountsConfigs.map(c => ['accounts', KEYPATH_WILDCARD, ...c]),\n ...innerInstructionsConfigs.map(c => ['innerInstructions', KEYPATH_WILDCARD, ...c]),\n ];\n}\n\n/**\n * Returns a transformer that throws a {@link SolanaError} with the appropriate RPC error code if\n * the body of the RPC response contains an error.\n *\n * @example\n * ```ts\n * import { getThrowSolanaErrorResponseTransformer } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getThrowSolanaErrorResponseTransformer();\n * ```\n */\nexport function getThrowSolanaErrorResponseTransformer(): RpcResponseTransformer {\n return (json, request) => {\n const jsonRpcResponse = json as JsonRpcResponse;\n if ('error' in jsonRpcResponse) {\n const { error } = jsonRpcResponse;\n\n // Check if this is a sendTransaction preflight failure (error code -32002)\n // These errors contain RpcSimulateTransactionResult in error.data which needs\n // BigInt values downcast to Number for fields that should be numbers\n const isSendTransactionPreflightFailure =\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error.code === -32002 || error.code === -32002n);\n\n if (isSendTransactionPreflightFailure && 'data' in error && error.data) {\n // Apply BigInt downcast transformation to error.data\n const treeWalker = getTreeWalkerResponseTransformer(\n [getBigIntUpcastVisitor(getSimulateTransactionAllowedNumericKeypaths())],\n { keyPath: [] },\n );\n const transformedData = treeWalker(error.data, request);\n\n // Reconstruct error with transformed data\n const transformedError = { ...error, data: transformedData };\n throw getSolanaErrorFromJsonRpcError(transformedError);\n }\n\n throw getSolanaErrorFromJsonRpcError(jsonRpcResponse.error);\n }\n return jsonRpcResponse;\n };\n}\n","import { pipe } from '@solana/functional';\nimport { RpcRequest, RpcResponse, RpcResponseTransformer } from '@solana/rpc-spec-types';\n\nimport { AllowedNumericKeypaths } from './response-transformer-allowed-numeric-values';\nimport { getBigIntUpcastResponseTransformer } from './response-transformer-bigint-upcast';\nimport { getResultResponseTransformer } from './response-transformer-result';\nimport { getThrowSolanaErrorResponseTransformer } from './response-transformer-throw-solana-error';\n\nexport type ResponseTransformerConfig = Readonly<{\n /**\n * An optional map from the name of an API method to an array of {@link KeyPath | KeyPaths}\n * pointing to values in the response that should materialize in the application as `Number`\n * instead of `BigInt`.\n */\n allowedNumericKeyPaths?: AllowedNumericKeypaths;\n}>;\n\n/**\n * Returns the default response transformer for the Solana RPC API.\n *\n * Under the hood, this function composes multiple\n * {@link RpcResponseTransformer | RpcResponseTransformers} together such as the\n * {@link getThrowSolanaErrorResponseTransformer}, the {@link getResultResponseTransformer} and the\n * {@link getBigIntUpcastResponseTransformer}.\n *\n * @example\n * ```ts\n * import { getDefaultResponseTransformerForSolanaRpc } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getDefaultResponseTransformerForSolanaRpc({\n * allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n * });\n * ```\n */\nexport function getDefaultResponseTransformerForSolanaRpc(\n config?: ResponseTransformerConfig,\n): RpcResponseTransformer {\n return (response: RpcResponse, request: RpcRequest): RpcResponse => {\n const methodName = request.methodName as keyof TApi;\n const keyPaths =\n config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;\n return pipe(\n response,\n r => getThrowSolanaErrorResponseTransformer()(r, request),\n r => getResultResponseTransformer()(r, request),\n r => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request),\n );\n };\n}\n\n/**\n * Returns the default response transformer for the Solana RPC Subscriptions API.\n *\n * Under the hood, this function composes the {@link getBigIntUpcastResponseTransformer}.\n *\n * @example\n * ```ts\n * import { getDefaultResponseTransformerForSolanaRpcSubscriptions } from '@solana/rpc-transformers';\n *\n * const responseTransformer = getDefaultResponseTransformerForSolanaRpcSubscriptions({\n * allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n * });\n * ```\n */\nexport function getDefaultResponseTransformerForSolanaRpcSubscriptions(\n config?: ResponseTransformerConfig,\n): RpcResponseTransformer {\n return (response: RpcResponse, request: RpcRequest): RpcResponse => {\n const methodName = request.methodName as keyof TApi;\n const keyPaths =\n config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;\n return pipe(response, r => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request));\n };\n}\n","/**\n * This package contains types that describe the [methods](https://solana.com/docs/rpc/http) of the\n * Solana JSON RPC API, and utilities for creating a {@link RpcApi} implementation with sensible\n * defaults. It can be used standalone, but it is also exported as part of Kit\n * [`@solana/kit`](https://github.com/anza-xyz/kit/tree/main/packages/kit).\n *\n * @example\n * Each RPC method is described in terms of a TypeScript type of the following form:\n *\n * ```ts\n * type ExampleApi = {\n * getSomething(address: Address): Something;\n * };\n * ```\n *\n * A {@link RpcApi} that implements `ExampleApi` will ultimately expose its defined methods on any\n * {@link Rpc} that uses it.\n *\n * ```ts\n * const rpc: Rpc = createExampleRpc(/* ... *\\/);\n * const something: Something = await rpc.getSomething(address('95DpK3y3GF7U8s1k4EvZ7xqyeCkhsHeZaE97iZpHUGMN')).send();\n * ```\n *\n * @packageDocumentation\n */\nimport { createJsonRpcApi, RpcApi } from '@solana/rpc-spec';\nimport {\n AllowedNumericKeypaths,\n getDefaultRequestTransformerForSolanaRpc,\n getDefaultResponseTransformerForSolanaRpc,\n innerInstructionsConfigs,\n jsonParsedAccountsConfigs,\n jsonParsedTokenAccountsConfigs,\n KEYPATH_WILDCARD,\n messageConfig,\n RequestTransformerConfig,\n} from '@solana/rpc-transformers';\n\nimport { GetAccountInfoApi } from './getAccountInfo';\nimport { GetBalanceApi } from './getBalance';\nimport { GetBlockApi } from './getBlock';\nimport { GetBlockCommitmentApi } from './getBlockCommitment';\nimport { GetBlockHeightApi } from './getBlockHeight';\nimport { GetBlockProductionApi } from './getBlockProduction';\nimport { GetBlocksApi } from './getBlocks';\nimport { GetBlocksWithLimitApi } from './getBlocksWithLimit';\nimport { GetBlockTimeApi } from './getBlockTime';\nimport { GetClusterNodesApi } from './getClusterNodes';\nimport { GetEpochInfoApi } from './getEpochInfo';\nimport { GetEpochScheduleApi } from './getEpochSchedule';\nimport { GetFeeForMessageApi } from './getFeeForMessage';\nimport { GetFirstAvailableBlockApi } from './getFirstAvailableBlock';\nimport { GetGenesisHashApi } from './getGenesisHash';\nimport { GetHealthApi } from './getHealth';\nimport { GetHighestSnapshotSlotApi } from './getHighestSnapshotSlot';\nimport { GetIdentityApi } from './getIdentity';\nimport { GetInflationGovernorApi } from './getInflationGovernor';\nimport { GetInflationRateApi } from './getInflationRate';\nimport { GetInflationRewardApi } from './getInflationReward';\nimport { GetLargestAccountsApi } from './getLargestAccounts';\nimport { GetLatestBlockhashApi } from './getLatestBlockhash';\nimport { GetLeaderScheduleApi } from './getLeaderSchedule';\nimport { GetMaxRetransmitSlotApi } from './getMaxRetransmitSlot';\nimport { GetMaxShredInsertSlotApi } from './getMaxShredInsertSlot';\nimport { GetMinimumBalanceForRentExemptionApi } from './getMinimumBalanceForRentExemption';\nimport { GetMultipleAccountsApi } from './getMultipleAccounts';\nimport { GetProgramAccountsApi } from './getProgramAccounts';\nimport { GetRecentPerformanceSamplesApi } from './getRecentPerformanceSamples';\nimport { GetRecentPrioritizationFeesApi } from './getRecentPrioritizationFees';\nimport { GetSignaturesForAddressApi } from './getSignaturesForAddress';\nimport { GetSignatureStatusesApi } from './getSignatureStatuses';\nimport { GetSlotApi } from './getSlot';\nimport { GetSlotLeaderApi } from './getSlotLeader';\nimport { GetSlotLeadersApi } from './getSlotLeaders';\nimport { GetStakeMinimumDelegationApi } from './getStakeMinimumDelegation';\nimport { GetSupplyApi } from './getSupply';\nimport { GetTokenAccountBalanceApi } from './getTokenAccountBalance';\nimport { GetTokenAccountsByDelegateApi } from './getTokenAccountsByDelegate';\nimport { GetTokenAccountsByOwnerApi } from './getTokenAccountsByOwner';\nimport { GetTokenLargestAccountsApi } from './getTokenLargestAccounts';\nimport { GetTokenSupplyApi } from './getTokenSupply';\nimport { GetTransactionApi } from './getTransaction';\nimport { GetTransactionCountApi } from './getTransactionCount';\nimport { GetVersionApi } from './getVersion';\nimport { GetVoteAccountsApi } from './getVoteAccounts';\nimport { IsBlockhashValidApi } from './isBlockhashValid';\nimport { MinimumLedgerSlotApi } from './minimumLedgerSlot';\nimport { RequestAirdropApi } from './requestAirdrop';\nimport { SendTransactionApi } from './sendTransaction';\nimport { SimulateTransactionApi } from './simulateTransaction';\n\ntype SolanaRpcApiForAllClusters = GetAccountInfoApi &\n GetBalanceApi &\n GetBlockApi &\n GetBlockCommitmentApi &\n GetBlockHeightApi &\n GetBlockProductionApi &\n GetBlocksApi &\n GetBlocksWithLimitApi &\n GetBlockTimeApi &\n GetClusterNodesApi &\n GetEpochInfoApi &\n GetEpochScheduleApi &\n GetFeeForMessageApi &\n GetFirstAvailableBlockApi &\n GetGenesisHashApi &\n GetHealthApi &\n GetHighestSnapshotSlotApi &\n GetIdentityApi &\n GetInflationGovernorApi &\n GetInflationRateApi &\n GetInflationRewardApi &\n GetLargestAccountsApi &\n GetLatestBlockhashApi &\n GetLeaderScheduleApi &\n GetMaxRetransmitSlotApi &\n GetMaxShredInsertSlotApi &\n GetMinimumBalanceForRentExemptionApi &\n GetMultipleAccountsApi &\n GetProgramAccountsApi &\n GetRecentPerformanceSamplesApi &\n GetRecentPrioritizationFeesApi &\n GetSignaturesForAddressApi &\n GetSignatureStatusesApi &\n GetSlotApi &\n GetSlotLeaderApi &\n GetSlotLeadersApi &\n GetStakeMinimumDelegationApi &\n GetSupplyApi &\n GetTokenAccountBalanceApi &\n GetTokenAccountsByDelegateApi &\n GetTokenAccountsByOwnerApi &\n GetTokenLargestAccountsApi &\n GetTokenSupplyApi &\n GetTransactionApi &\n GetTransactionCountApi &\n GetVersionApi &\n GetVoteAccountsApi &\n IsBlockhashValidApi &\n MinimumLedgerSlotApi &\n SendTransactionApi &\n SimulateTransactionApi;\ntype SolanaRpcApiForTestClusters = RequestAirdropApi & SolanaRpcApiForAllClusters;\n/**\n * Represents the RPC methods available on test clusters.\n *\n * For instance, the test clusters support the {@link RequestAirdropApi} while mainnet does not.\n */\nexport type SolanaRpcApi = SolanaRpcApiForTestClusters;\n/**\n * Represents the RPC methods available on the devnet cluster.\n *\n * For instance, the devnet cluster supports the {@link RequestAirdropApi} while mainnet does not.\n */\nexport type SolanaRpcApiDevnet = SolanaRpcApiForTestClusters;\n/**\n * Represents the RPC methods available on the testnet cluster.\n *\n * For instance, the testnet cluster supports the {@link RequestAirdropApi} while mainnet does not.\n */\nexport type SolanaRpcApiTestnet = SolanaRpcApiForTestClusters;\n/**\n * Represents the RPC methods available on the mainnet cluster.\n *\n * For instance, the mainnet cluster does not support the {@link RequestAirdropApi} whereas test\n * clusters do.\n */\nexport type SolanaRpcApiMainnet = SolanaRpcApiForAllClusters;\n\nexport type {\n GetAccountInfoApi,\n GetBalanceApi,\n GetBlockApi,\n GetBlockCommitmentApi,\n GetBlockHeightApi,\n GetBlockProductionApi,\n GetBlocksApi,\n GetBlocksWithLimitApi,\n GetBlockTimeApi,\n GetClusterNodesApi,\n GetEpochInfoApi,\n GetEpochScheduleApi,\n GetFeeForMessageApi,\n GetFirstAvailableBlockApi,\n GetGenesisHashApi,\n GetHealthApi,\n GetHighestSnapshotSlotApi,\n GetIdentityApi,\n GetInflationGovernorApi,\n GetInflationRateApi,\n GetInflationRewardApi,\n GetLargestAccountsApi,\n GetLatestBlockhashApi,\n GetLeaderScheduleApi,\n GetMaxRetransmitSlotApi,\n GetMaxShredInsertSlotApi,\n GetMinimumBalanceForRentExemptionApi,\n GetMultipleAccountsApi,\n GetProgramAccountsApi,\n GetRecentPerformanceSamplesApi,\n GetRecentPrioritizationFeesApi,\n GetSignaturesForAddressApi,\n GetSignatureStatusesApi,\n GetSlotApi,\n GetSlotLeaderApi,\n GetSlotLeadersApi,\n GetStakeMinimumDelegationApi,\n GetSupplyApi,\n GetTokenAccountBalanceApi,\n GetTokenAccountsByDelegateApi,\n GetTokenAccountsByOwnerApi,\n GetTokenLargestAccountsApi,\n GetTokenSupplyApi,\n GetTransactionApi,\n GetTransactionCountApi,\n GetVersionApi,\n GetVoteAccountsApi,\n IsBlockhashValidApi,\n MinimumLedgerSlotApi,\n RequestAirdropApi,\n SendTransactionApi,\n SimulateTransactionApi,\n};\n\ntype Config = RequestTransformerConfig;\n\n/**\n * Creates a {@link RpcApi} implementation of the Solana JSON RPC API with some default behaviours.\n *\n * The default behaviours include:\n * - A transform that converts `bigint` inputs to `number` for compatibility with version 1.0 of the\n * Solana JSON RPC.\n * - A transform that calls the config's {@link Config.onIntegerOverflow | onIntegerOverflow}\n * handler whenever a `bigint` input would overflow a JavaScript IEEE 754 number. See\n * [this](https://github.com/solana-labs/solana-web3.js/issues/1116) GitHub issue for more\n * information.\n * - A transform that applies a default commitment wherever not specified\n */\nexport function createSolanaRpcApi<\n // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents\n TRpcMethods extends SolanaRpcApi | SolanaRpcApiDevnet | SolanaRpcApiMainnet | SolanaRpcApiTestnet = SolanaRpcApi,\n>(config?: Config): RpcApi {\n return createJsonRpcApi({\n requestTransformer: getDefaultRequestTransformerForSolanaRpc(config),\n responseTransformer: getDefaultResponseTransformerForSolanaRpc({\n allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n }),\n });\n}\n\nlet memoizedKeypaths: AllowedNumericKeypaths>;\n\n/**\n * These are keypaths at the end of which you will find a numeric value that should *not* be upcast\n * to a `bigint`. These are values that are legitimately defined as `u8` or `usize` on the backend.\n */\nfunction getAllowedNumericKeypaths(): AllowedNumericKeypaths> {\n if (!memoizedKeypaths) {\n memoizedKeypaths = {\n getAccountInfo: jsonParsedAccountsConfigs.map(c => ['value', ...c]),\n getBlock: [\n ['transactions', KEYPATH_WILDCARD, 'meta', 'preTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n [\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'preTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n ['transactions', KEYPATH_WILDCARD, 'meta', 'postTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n [\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'postTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n ['transactions', KEYPATH_WILDCARD, 'meta', 'rewards', KEYPATH_WILDCARD, 'commission'],\n ...innerInstructionsConfigs.map(c => [\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n ...c,\n ]),\n ...messageConfig.map(c => ['transactions', KEYPATH_WILDCARD, 'transaction', 'message', ...c] as const),\n ['rewards', KEYPATH_WILDCARD, 'commission'],\n ],\n getClusterNodes: [\n [KEYPATH_WILDCARD, 'featureSet'],\n [KEYPATH_WILDCARD, 'shredVersion'],\n ],\n getInflationGovernor: [['initial'], ['foundation'], ['foundationTerm'], ['taper'], ['terminal']],\n getInflationRate: [['foundation'], ['total'], ['validator']],\n getInflationReward: [[KEYPATH_WILDCARD, 'commission']],\n getMultipleAccounts: jsonParsedAccountsConfigs.map(c => ['value', KEYPATH_WILDCARD, ...c]),\n getProgramAccounts: jsonParsedAccountsConfigs.flatMap(c => [\n ['value', KEYPATH_WILDCARD, 'account', ...c],\n [KEYPATH_WILDCARD, 'account', ...c],\n ]),\n getRecentPerformanceSamples: [[KEYPATH_WILDCARD, 'samplePeriodSecs']],\n getTokenAccountBalance: [\n ['value', 'decimals'],\n ['value', 'uiAmount'],\n ],\n getTokenAccountsByDelegate: jsonParsedTokenAccountsConfigs.map(c => [\n 'value',\n KEYPATH_WILDCARD,\n 'account',\n ...c,\n ]),\n getTokenAccountsByOwner: jsonParsedTokenAccountsConfigs.map(c => [\n 'value',\n KEYPATH_WILDCARD,\n 'account',\n ...c,\n ]),\n getTokenLargestAccounts: [\n ['value', KEYPATH_WILDCARD, 'decimals'],\n ['value', KEYPATH_WILDCARD, 'uiAmount'],\n ],\n getTokenSupply: [\n ['value', 'decimals'],\n ['value', 'uiAmount'],\n ],\n getTransaction: [\n ['meta', 'preTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n ['meta', 'preTokenBalances', KEYPATH_WILDCARD, 'uiTokenAmount', 'decimals'],\n ['meta', 'postTokenBalances', KEYPATH_WILDCARD, 'accountIndex'],\n ['meta', 'postTokenBalances', KEYPATH_WILDCARD, 'uiTokenAmount', 'decimals'],\n ['meta', 'rewards', KEYPATH_WILDCARD, 'commission'],\n ...innerInstructionsConfigs.map(c => ['meta', 'innerInstructions', KEYPATH_WILDCARD, ...c]),\n ...messageConfig.map(c => ['transaction', 'message', ...c] as const),\n ],\n getVersion: [['feature-set']],\n getVoteAccounts: [\n ['current', KEYPATH_WILDCARD, 'commission'],\n ['delinquent', KEYPATH_WILDCARD, 'commission'],\n ],\n simulateTransaction: [\n ['value', 'loadedAccountsDataSize'],\n ...jsonParsedAccountsConfigs.map(c => ['value', 'accounts', KEYPATH_WILDCARD, ...c]),\n ...innerInstructionsConfigs.map(c => ['value', 'innerInstructions', KEYPATH_WILDCARD, ...c]),\n ],\n };\n }\n return memoizedKeypaths;\n}\n","import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, SolanaError } from '@solana/errors';\n\nexport type AllowedHttpRequestHeaders = Readonly<\n {\n // Someone can still sneak a forbidden header past Typescript if they do something like\n // fOo-BaR, but at that point they deserve the runtime failure.\n [K in DisallowedHeaders | ForbiddenHeaders as\n | Capitalize> // `Foo-bar`\n | K // `Foo-Bar`\n | Lowercase // `foo-bar`\n | Uncapitalize // `foo-Bar`\n // `FOO-BAR`\n | Uppercase]?: never;\n } & { [headerName: string]: string }\n>;\n// These are headers that we simply don't allow the developer to override because they're\n// fundamental to the operation of the JSON-RPC transport.\ntype DisallowedHeaders = 'Accept' | 'Content-Length' | 'Content-Type' | 'Solana-Client';\ntype ForbiddenHeaders =\n | 'Accept-Charset'\n // Though technically forbidden in non-Node environments, we don't have a way to target\n // TypeScript types depending on which platform you are authoring for. `Accept-Encoding` is\n // therefore omitted from the forbidden headers type, but is still a runtime error in dev mode\n // when supplied in a non-Node context.\n // | 'Accept-Encoding'\n | 'Access-Control-Request-Headers'\n | 'Access-Control-Request-Method'\n | 'Connection'\n | 'Content-Length'\n | 'Cookie'\n | 'Date'\n | 'DNT'\n | 'Expect'\n | 'Host'\n | 'Keep-Alive'\n // Similar to `Accept-Encoding`, we don't have a way to target TypeScript types depending on\n // which platform you are authoring for. `Origin` is therefore omitted from the forbidden\n // headers type, but is still a runtime error in dev mode when supplied in a browser context.\n // | 'Origin'\n | 'Permissions-Policy'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via'\n | `Proxy-${string}`\n | `Sec-${string}`;\n\n// These are headers which are fundamental to the JSON-RPC transport, and must not be modified.\nconst DISALLOWED_HEADERS: Record = {\n accept: true,\n 'content-length': true,\n 'content-type': true,\n};\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS: Record = /* @__PURE__ */ Object.assign(\n {\n 'accept-charset': true,\n 'access-control-request-headers': true,\n 'access-control-request-method': true,\n connection: true,\n 'content-length': true,\n cookie: true,\n date: true,\n dnt: true,\n expect: true,\n host: true,\n 'keep-alive': true,\n 'permissions-policy': true,\n // Prefix matching is implemented in code, below.\n // 'proxy-': true,\n // 'sec-': true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n via: true,\n },\n __NODEJS__ ? undefined : { 'accept-encoding': true },\n __BROWSER__ ? { origin: true } : undefined,\n);\n\nexport function assertIsAllowedHttpRequestHeaders(\n headers: Record,\n): asserts headers is AllowedHttpRequestHeaders {\n const badHeaders = Object.keys(headers).filter(headerName => {\n const lowercaseHeaderName = headerName.toLowerCase();\n return (\n DISALLOWED_HEADERS[headerName.toLowerCase()] === true ||\n FORBIDDEN_HEADERS[headerName.toLowerCase()] === true ||\n lowercaseHeaderName.startsWith('proxy-') ||\n lowercaseHeaderName.startsWith('sec-')\n );\n });\n if (badHeaders.length > 0) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, {\n headers: badHeaders,\n });\n }\n}\n\n// Lowercasing header names makes it easier to override user-supplied headers, such as those defined\n// in the `DisallowedHeaders` type.\nexport function normalizeHeaders>(\n headers: T,\n): { [K in string & keyof T as Lowercase]: T[K] } {\n const out: Record = {};\n for (const headerName in headers) {\n out[headerName.toLowerCase()] = headers[headerName];\n }\n return out as { [K in string & keyof T as Lowercase]: T[K] };\n}\n","import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SolanaError } from '@solana/errors';\nimport type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\nimport type Dispatcher from 'undici-types/dispatcher';\n\nimport { HttpTransportConfig as Config } from './http-transport-config';\nimport { assertIsAllowedHttpRequestHeaders, normalizeHeaders } from './http-transport-headers';\n\nlet didWarnDispatcherWasSuppliedInNonNodeEnvironment = false;\nfunction warnDispatcherWasSuppliedInNonNodeEnvironment() {\n if (didWarnDispatcherWasSuppliedInNonNodeEnvironment) {\n return;\n }\n didWarnDispatcherWasSuppliedInNonNodeEnvironment = true;\n console.warn(\n 'You have supplied a `Dispatcher` to `createHttpTransport()`. It has been ignored ' +\n 'because Undici dispatchers only work in Node environments. To eliminate this ' +\n 'warning, omit the `dispatcher_NODE_ONLY` property from your config when running in ' +\n 'a non-Node environment.',\n );\n}\n\n/**\n * Creates a function you can use to make `POST` requests with headers suitable for sending JSON\n * data to a server.\n *\n * @example\n * ```ts\n * import { createHttpTransport } from '@solana/rpc-transport-http';\n *\n * const transport = createHttpTransport({ url: 'https://api.mainnet-beta.solana.com' });\n * const response = await transport({\n * payload: { id: 1, jsonrpc: '2.0', method: 'getSlot' },\n * });\n * const data = await response.json();\n * ```\n */\nexport function createHttpTransport(config: Config): RpcTransport {\n if (process.env.NODE_ENV !== \"production\" && !__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n warnDispatcherWasSuppliedInNonNodeEnvironment();\n }\n const { fromJson, headers, toJson, url } = config;\n if (process.env.NODE_ENV !== \"production\" && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n let dispatcherConfig: { dispatcher: Dispatcher | undefined } | undefined;\n if (__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n dispatcherConfig = { dispatcher: config.dispatcher_NODE_ONLY };\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest({\n payload,\n signal,\n }: Parameters[0]): Promise> {\n const body = toJson ? toJson(payload) : JSON.stringify(payload);\n const requestInfo = {\n ...dispatcherConfig,\n body,\n headers: {\n ...customHeaders,\n // Keep these headers lowercase so they will override any user-supplied headers above.\n accept: 'application/json',\n 'content-length': body.length.toString(),\n 'content-type': 'application/json; charset=utf-8',\n },\n method: 'POST',\n signal,\n };\n const response = await fetch(url, requestInfo);\n if (!response.ok) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, {\n headers: response.headers,\n message: response.statusText,\n statusCode: response.status,\n });\n }\n if (fromJson) {\n return fromJson(await response.text(), payload) as TResponse;\n }\n return await response.json();\n };\n}\n","import { isJsonRpcPayload } from '@solana/rpc-spec';\n\nconst SOLANA_RPC_METHODS = [\n 'getAccountInfo',\n 'getBalance',\n 'getBlock',\n 'getBlockCommitment',\n 'getBlockHeight',\n 'getBlockProduction',\n 'getBlocks',\n 'getBlocksWithLimit',\n 'getBlockTime',\n 'getClusterNodes',\n 'getEpochInfo',\n 'getEpochSchedule',\n 'getFeeForMessage',\n 'getFirstAvailableBlock',\n 'getGenesisHash',\n 'getHealth',\n 'getHighestSnapshotSlot',\n 'getIdentity',\n 'getInflationGovernor',\n 'getInflationRate',\n 'getInflationReward',\n 'getLargestAccounts',\n 'getLatestBlockhash',\n 'getLeaderSchedule',\n 'getMaxRetransmitSlot',\n 'getMaxShredInsertSlot',\n 'getMinimumBalanceForRentExemption',\n 'getMultipleAccounts',\n 'getProgramAccounts',\n 'getRecentPerformanceSamples',\n 'getRecentPrioritizationFees',\n 'getSignaturesForAddress',\n 'getSignatureStatuses',\n 'getSlot',\n 'getSlotLeader',\n 'getSlotLeaders',\n 'getStakeMinimumDelegation',\n 'getSupply',\n 'getTokenAccountBalance',\n 'getTokenAccountsByDelegate',\n 'getTokenAccountsByOwner',\n 'getTokenLargestAccounts',\n 'getTokenSupply',\n 'getTransaction',\n 'getTransactionCount',\n 'getVersion',\n 'getVoteAccounts',\n 'index',\n 'isBlockhashValid',\n 'minimumLedgerSlot',\n 'requestAirdrop',\n 'sendTransaction',\n 'simulateTransaction',\n] as const;\n\n/**\n * Helper function that checks if a given `RpcRequest` comes from the Solana RPC API.\n */\nexport function isSolanaRequest(payload: unknown): payload is Readonly<{\n jsonrpc: '2.0';\n method: (typeof SOLANA_RPC_METHODS)[number];\n params: unknown;\n}> {\n return isJsonRpcPayload(payload) && (SOLANA_RPC_METHODS as readonly string[]).includes(payload.method);\n}\n","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigInts } from '@solana/rpc-spec-types';\n\nimport { createHttpTransport } from './http-transport';\nimport { HttpTransportConfig } from './http-transport-config';\nimport { isSolanaRequest } from './is-solana-request';\n\ntype Config = Pick;\n\n/**\n * Creates a {@link RpcTransport} that uses JSON HTTP requests — much like the\n * {@link createHttpTransport} function - except that it also uses custom `toJson` and `fromJson`\n * functions in order to allow `bigint` values to be serialized and deserialized correctly over the\n * wire.\n *\n * Since this is something specific to the Solana RPC API, these custom JSON functions are only\n * triggered when the request is recognized as a Solana RPC request. Normal RPC APIs should aim to\n * wrap their `bigint` values — e.g. `u64` or `i64` — in special value objects that represent the\n * number as a string to avoid numerical values going above `Number.MAX_SAFE_INTEGER`.\n *\n * It has the same configuration options as {@link createHttpTransport}, but without the `fromJson`\n * and `toJson` options.\n */\nexport function createHttpTransportForSolanaRpc(config: Config): RpcTransport {\n return createHttpTransport({\n ...config,\n fromJson: (rawResponse: string, payload: unknown) =>\n isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigInts(payload) : JSON.stringify(payload),\n });\n}\n","/**\n * This project is a fork of [nickyout/fast-stable-stringify](https://github.com/nickyout/fast-stable-stringify)\n *\n * The most popular repository providing this feature is [substack's json-stable-stringify](https://www.npmjs.com/package/json-stable-stringify). The intent of this library is to provide a faster alternative for when performance is more important than features. It assumes you provide basic javascript values without circular references, and returns a non-indented string.\n *\n * Just like substack's, it:\n *\n * - handles all variations of all basic javascript values (number, string, boolean, array, object, null, Date, BigInt)\n * - handles undefined _and_ function in the same way as `JSON.stringify`\n * - **does not support ie8 (and below) with complete certainty**.\n *\n * Unlike substack's, it:\n *\n * - does not implement the 'replacer' or 'space' arguments of the JSON.stringify method\n * - does not check for circular references\n *\n * @example\n * ```js\n * import stringify from '@solana/fast-stable-stringify';\n * stringify({ d: 0, c: 1, a: 2, b: 3, e: 4 }); // '{\"a\":2,\"b\":3,\"c\":1,\"d\":0,\"e\":4}'\n * ```\n *\n * @packageDocumentation\n */\nconst objToString = Object.prototype.toString;\nconst objKeys =\n Object.keys ||\n function (obj) {\n const keys = [];\n for (const name in obj) {\n keys.push(name);\n }\n return keys;\n };\n\nfunction stringify(val: unknown, isArrayProp: boolean) {\n let i, max, str, keys, key, propVal, toStr;\n if (val === true) {\n return 'true';\n }\n if (val === false) {\n return 'false';\n }\n switch (typeof val) {\n case 'object':\n if (val === null) {\n return null;\n } else if ('toJSON' in val && typeof val.toJSON === 'function') {\n return stringify(val.toJSON(), isArrayProp);\n } else {\n toStr = objToString.call(val);\n if (toStr === '[object Array]') {\n str = '[';\n max = (val as unknown[]).length - 1;\n for (i = 0; i < max; i++) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += stringify((val as unknown[])[i], true) + ',';\n }\n if (max > -1) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += stringify((val as unknown[])[i], true);\n }\n return str + ']';\n } else if (toStr === '[object Object]') {\n // only object is left\n keys = objKeys(val).sort();\n max = keys.length;\n str = '';\n i = 0;\n while (i < max) {\n key = keys[i];\n propVal = stringify((val as Record)[key], false);\n if (propVal !== undefined) {\n if (str) {\n str += ',';\n }\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += JSON.stringify(key) + ':' + propVal;\n }\n i++;\n }\n return '{' + str + '}';\n } else {\n return JSON.stringify(val);\n }\n }\n case 'function':\n case 'undefined':\n return isArrayProp ? null : undefined;\n case 'bigint':\n return `${val.toString()}n`;\n case 'string':\n return JSON.stringify(val);\n default:\n return isFinite(val as number) ? val : null;\n }\n}\n\nexport default function (\n val:\n | Function // eslint-disable-line @typescript-eslint/no-unsafe-function-type\n | undefined,\n): undefined;\nexport default function (val: unknown): string;\nexport default function (val: unknown): string | undefined {\n const returnVal = stringify(val, false);\n if (returnVal !== undefined) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n return '' + returnVal;\n }\n}\n","import { safeCaptureStackTrace, SOLANA_ERROR__RPC__INTEGER_OVERFLOW, SolanaError } from '@solana/errors';\nimport type { KeyPath } from '@solana/rpc-transformers';\n\nexport function createSolanaJsonRpcIntegerOverflowError(\n methodName: string,\n keyPath: KeyPath,\n value: bigint,\n): SolanaError {\n let argumentLabel = '';\n if (typeof keyPath[0] === 'number') {\n const argPosition = keyPath[0] + 1;\n const lastDigit = argPosition % 10;\n const lastTwoDigits = argPosition % 100;\n if (lastDigit == 1 && lastTwoDigits != 11) {\n argumentLabel = argPosition + 'st';\n } else if (lastDigit == 2 && lastTwoDigits != 12) {\n argumentLabel = argPosition + 'nd';\n } else if (lastDigit == 3 && lastTwoDigits != 13) {\n argumentLabel = argPosition + 'rd';\n } else {\n argumentLabel = argPosition + 'th';\n }\n } else {\n argumentLabel = `\\`${keyPath[0].toString()}\\``;\n }\n const path =\n keyPath.length > 1\n ? keyPath\n .slice(1)\n .map(pathPart => (typeof pathPart === 'number' ? `[${pathPart}]` : pathPart))\n .join('.')\n : undefined;\n const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, {\n argumentLabel,\n keyPath: keyPath as readonly (number | string | symbol)[],\n methodName,\n optionalPathLabel: path ? ` at path \\`${path}\\`` : '',\n value,\n ...(path !== undefined ? { path } : undefined),\n });\n safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError);\n return error;\n}\n","import type { createSolanaRpcApi } from '@solana/rpc-api';\n\nimport { createSolanaJsonRpcIntegerOverflowError } from './rpc-integer-overflow-error';\n\n/**\n * When you create {@link Rpc} instances with custom transports but otherwise the default RPC API\n * behaviours, use this.\n *\n * @example\n * ```ts\n * const myCustomRpc = createRpc({\n * api: createSolanaRpcApi(DEFAULT_RPC_CONFIG),\n * transport: myCustomTransport,\n * });\n * ```\n */\nexport const DEFAULT_RPC_CONFIG: Partial[0]>> = {\n defaultCommitment: 'confirmed',\n onIntegerOverflow(request, keyPath, value) {\n throw createSolanaJsonRpcIntegerOverflowError(request.methodName, keyPath, value);\n },\n};\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import { AbortController } from '@solana/event-target-impl';\nimport type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\n\ntype CoalescedRequest = {\n readonly abortController: AbortController;\n numConsumers: number;\n readonly responsePromise: Promise;\n};\n\ntype GetDeduplicationKeyFn = (payload: unknown) => string | undefined;\n\n// This used to be a `Symbol()`, but there's a bug in Node <21 where the `undici` library passes\n// the `reason` property of the `AbortSignal` straight to `Error.captureStackTrace()` without first\n// typechecking it. `Error.captureStackTrace()` fatals when given a `Symbol`.\n// See https://github.com/nodejs/undici/pull/2597\nlet EXPLICIT_ABORT_TOKEN: ReturnType;\nfunction createExplicitAbortToken() {\n // This function is an annoying workaround to prevent `process.env.NODE_ENV` from appearing at\n // the top level of this module and thwarting an optimizing compiler's attempt to tree-shake.\n return process.env.NODE_ENV !== \"production\"\n ? {\n EXPLICIT_ABORT_TOKEN:\n 'This object is thrown from the request that underlies a series of coalesced ' +\n 'requests when the last request in that series aborts',\n }\n : {};\n}\n\nexport function getRpcTransportWithRequestCoalescing(\n transport: TTransport,\n getDeduplicationKey: GetDeduplicationKeyFn,\n): TTransport {\n let coalescedRequestsByDeduplicationKey: Record | undefined;\n return async function makeCoalescedHttpRequest(\n request: Parameters[0],\n ): Promise> {\n const { payload, signal } = request;\n const deduplicationKey = getDeduplicationKey(payload);\n if (deduplicationKey === undefined) {\n return await transport(request);\n }\n if (!coalescedRequestsByDeduplicationKey) {\n queueMicrotask(() => {\n coalescedRequestsByDeduplicationKey = undefined;\n });\n coalescedRequestsByDeduplicationKey = {};\n }\n if (coalescedRequestsByDeduplicationKey[deduplicationKey] == null) {\n const abortController = new AbortController();\n const responsePromise = (async () => {\n try {\n return await transport({\n ...request,\n signal: abortController.signal,\n });\n } catch (e) {\n if (e === (EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken())) {\n // We triggered this error when the last subscriber aborted. Letting this\n // error bubble up from here would cause runtime fatals where there should\n // be none.\n return;\n }\n throw e;\n }\n })();\n coalescedRequestsByDeduplicationKey[deduplicationKey] = {\n abortController,\n numConsumers: 0,\n responsePromise,\n };\n }\n const coalescedRequest = coalescedRequestsByDeduplicationKey[deduplicationKey];\n coalescedRequest.numConsumers++;\n if (signal) {\n const responsePromise = coalescedRequest.responsePromise as Promise>;\n return await new Promise>((resolve, reject) => {\n const handleAbort = (e: AbortSignalEventMap['abort']) => {\n signal.removeEventListener('abort', handleAbort);\n coalescedRequest.numConsumers -= 1;\n queueMicrotask(() => {\n if (coalescedRequest.numConsumers === 0) {\n const abortController = coalescedRequest.abortController;\n abortController.abort((EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken()));\n }\n });\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject((e.target as AbortSignal).reason);\n };\n signal.addEventListener('abort', handleAbort);\n responsePromise\n .then(resolve)\n .catch(reject)\n .finally(() => {\n signal.removeEventListener('abort', handleAbort);\n });\n });\n } else {\n return (await coalescedRequest.responsePromise) as RpcResponse;\n }\n } as TTransport;\n}\n","import fastStableStringify from '@solana/fast-stable-stringify';\nimport { isJsonRpcPayload } from '@solana/rpc-spec';\n\nexport function getSolanaRpcPayloadDeduplicationKey(payload: unknown): string | undefined {\n return isJsonRpcPayload(payload) ? fastStableStringify([payload.method, payload.params]) : undefined;\n}\n","import { pipe } from '@solana/functional';\nimport { createHttpTransport, createHttpTransportForSolanaRpc } from '@solana/rpc-transport-http';\nimport type { ClusterUrl } from '@solana/rpc-types';\n\nimport { RpcTransportFromClusterUrl } from './rpc-clusters';\nimport { getRpcTransportWithRequestCoalescing } from './rpc-request-coalescer';\nimport { getSolanaRpcPayloadDeduplicationKey } from './rpc-request-deduplication';\n\ntype RpcTransportConfig = Parameters[0];\ninterface DefaultRpcTransportConfig extends RpcTransportConfig {\n url: TClusterUrl;\n}\n\nfunction normalizeHeaders>(\n headers: T,\n): { [K in string & keyof T as Lowercase]: T[K] } {\n const out: Record = {};\n for (const headerName in headers) {\n // Lowercasing header names makes it easier to override user-supplied headers.\n out[headerName.toLowerCase()] = headers[headerName];\n }\n return out as { [K in string & keyof T as Lowercase]: T[K] };\n}\n\n/**\n * Creates a {@link RpcTransport} with some default behaviours.\n *\n * The default behaviours include:\n * - An automatically-set `Solana-Client` request header, containing the version of `@solana/kit`\n * - Logic that coalesces multiple calls in the same runloop, for the same methods with the same\n * arguments, into a single network request.\n * - [node-only] An automatically-set `Accept-Encoding` request header asking the server to compress\n * responses\n *\n * @param config\n */\nexport function createDefaultRpcTransport(\n config: DefaultRpcTransportConfig,\n): RpcTransportFromClusterUrl {\n return pipe(\n createHttpTransportForSolanaRpc({\n ...config,\n headers: {\n ...(__NODEJS__ &&\n ({\n // Keep these headers lowercase so they will be overridden by any user-supplied headers below.\n 'accept-encoding':\n // Natively supported by Node LTS v20.18.0 and above.\n 'br,gzip,deflate', // Brotli, gzip, and Deflate, in that order.\n } as { [overrideHeader: string]: string })),\n ...(config.headers ? normalizeHeaders(config.headers) : undefined),\n ...({\n // Keep these headers lowercase so they will override any user-supplied headers above.\n 'solana-client': __VERSION__ ? `js/${__VERSION__}` : 'UNKNOWN',\n } as { [overrideHeader: string]: string }),\n },\n }) as RpcTransportFromClusterUrl,\n transport => getRpcTransportWithRequestCoalescing(transport, getSolanaRpcPayloadDeduplicationKey),\n );\n}\n","import { createSolanaRpcApi } from '@solana/rpc-api';\nimport { createRpc, RpcTransport } from '@solana/rpc-spec';\nimport { ClusterUrl } from '@solana/rpc-types';\n\nimport type { RpcFromTransport, SolanaRpcApiFromTransport } from './rpc-clusters';\nimport { DEFAULT_RPC_CONFIG } from './rpc-default-config';\nimport { createDefaultRpcTransport } from './rpc-transport';\n\ntype DefaultRpcTransportConfig = Parameters<\n typeof createDefaultRpcTransport\n>[0];\n\n/**\n * Creates a {@link Rpc} instance that exposes the Solana JSON RPC API given a cluster URL and some\n * optional transport config. See {@link createDefaultRpcTransport} for the shape of the transport\n * config.\n */\nexport function createSolanaRpc(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n return createSolanaRpcFromTransport(createDefaultRpcTransport({ url: clusterUrl, ...config }));\n}\n\n/**\n * Creates a {@link Rpc} instance that exposes the Solana JSON RPC API given the supplied\n * {@link RpcTransport}.\n */\nexport function createSolanaRpcFromTransport(transport: TTransport) {\n return createRpc({\n api: createSolanaRpcApi(DEFAULT_RPC_CONFIG),\n transport,\n }) as RpcFromTransport, TTransport>;\n}\n","\n//# sourceMappingURL=index.node.mjs.map\n//# sourceMappingURL=index.node.mjs.map","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import {\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE,\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\n\nimport { DataPublisher } from './data-publisher';\n\ntype Config = Readonly<{\n /**\n * Triggering this abort signal will cause all iterators spawned from this iterator to return\n * once they have published all queued messages.\n */\n abortSignal: AbortSignal;\n /**\n * Messages from this channel of `dataPublisher` will be the ones yielded through the iterators.\n *\n * Messages only begin to be queued after the first time an iterator begins to poll. Channel\n * messages published before that time will be dropped.\n */\n dataChannelName: string;\n // FIXME: It would be nice to be able to constrain the type of `dataPublisher` to one that\n // definitely supports the `dataChannelName` and `errorChannelName` channels, and\n // furthermore publishes `TData` on the `dataChannelName` channel. This is more difficult\n // than it should be: https://tsplay.dev/NlZelW\n dataPublisher: DataPublisher;\n /**\n * Messages from this channel of `dataPublisher` will be the ones thrown through the iterators.\n *\n * Any new iterators created after the first error is encountered will reject with that error\n * when polled.\n */\n errorChannelName: string;\n}>;\n\nconst enum PublishType {\n DATA,\n ERROR,\n}\n\ntype IteratorKey = symbol;\ntype IteratorState =\n | {\n __hasPolled: false;\n publishQueue: (\n | {\n __type: PublishType.DATA;\n data: TData;\n }\n | {\n __type: PublishType.ERROR;\n err: unknown;\n }\n )[];\n }\n | {\n __hasPolled: true;\n onData: (data: TData) => void;\n onError: Parameters[0]>[1];\n };\n\nlet EXPLICIT_ABORT_TOKEN: symbol;\nfunction createExplicitAbortToken() {\n // This function is an annoying workaround to prevent `process.env.NODE_ENV` from appearing at\n // the top level of this module and thwarting an optimizing compiler's attempt to tree-shake.\n return Symbol(\n process.env.NODE_ENV !== \"production\"\n ? \"This symbol is thrown from a socket's iterator when the connection is explicitly \" +\n 'aborted by the user'\n : undefined,\n );\n}\n\nconst UNINITIALIZED = Symbol();\n\n/**\n * Returns an `AsyncIterable` given a data publisher.\n *\n * The iterable will produce iterators that vend messages published to `dataChannelName` and will\n * throw the first time a message is published to `errorChannelName`. Triggering the abort signal\n * will cause all iterators spawned from this iterator to return once they have published all queued\n * messages.\n *\n * Things to note:\n *\n * - If a message is published over a channel before the `AsyncIterator` attached to it has polled\n * for the next result, the message will be queued in memory.\n * - Messages only begin to be queued after the first time an iterator begins to poll. Channel\n * messages published before that time will be dropped.\n * - If there are messages in the queue and an error occurs, all queued messages will be vended to\n * the iterator before the error is thrown.\n * - If there are messages in the queue and the abort signal fires, all queued messages will be\n * vended to the iterator after which it will return.\n * - Any new iterators created after the first error is encountered will reject with that error when\n * polled.\n *\n * @param config\n *\n * @example\n * ```ts\n * const iterable = createAsyncIterableFromDataPublisher({\n * abortSignal: AbortSignal.timeout(10_000),\n * dataChannelName: 'message',\n * dataPublisher,\n * errorChannelName: 'error',\n * });\n * try {\n * for await (const message of iterable) {\n * console.log('Got message', message);\n * }\n * } catch (e) {\n * console.error('An error was published to the error channel', e);\n * } finally {\n * console.log(\"It's been 10 seconds; that's enough for now.\");\n * }\n * ```\n */\nexport function createAsyncIterableFromDataPublisher({\n abortSignal,\n dataChannelName,\n dataPublisher,\n errorChannelName,\n}: Config): AsyncIterable {\n const iteratorState: Map> = new Map();\n function publishErrorToAllIterators(reason: unknown) {\n for (const [iteratorKey, state] of iteratorState.entries()) {\n if (state.__hasPolled) {\n iteratorState.delete(iteratorKey);\n state.onError(reason);\n } else {\n state.publishQueue.push({\n __type: PublishType.ERROR,\n err: reason,\n });\n }\n }\n }\n const abortController = new AbortController();\n abortSignal.addEventListener('abort', () => {\n abortController.abort();\n publishErrorToAllIterators((EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken()));\n });\n const options = { signal: abortController.signal } as const;\n let firstError: unknown = UNINITIALIZED;\n dataPublisher.on(\n errorChannelName,\n err => {\n if (firstError === UNINITIALIZED) {\n firstError = err;\n abortController.abort();\n publishErrorToAllIterators(err);\n }\n },\n options,\n );\n dataPublisher.on(\n dataChannelName,\n data => {\n iteratorState.forEach((state, iteratorKey) => {\n if (state.__hasPolled) {\n const { onData } = state;\n iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] });\n onData(data as TData);\n } else {\n state.publishQueue.push({\n __type: PublishType.DATA,\n data: data as TData,\n });\n }\n });\n },\n options,\n );\n return {\n async *[Symbol.asyncIterator]() {\n if (abortSignal.aborted) {\n return;\n }\n if (firstError !== UNINITIALIZED) {\n throw firstError;\n }\n const iteratorKey = Symbol();\n iteratorState.set(iteratorKey, { __hasPolled: false, publishQueue: [] });\n try {\n while (true) {\n const state = iteratorState.get(iteratorKey);\n if (!state) {\n // There should always be state by now.\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING);\n }\n if (state.__hasPolled) {\n // You should never be able to poll twice in a row.\n throw new SolanaError(\n SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE,\n );\n }\n const publishQueue = state.publishQueue;\n try {\n if (publishQueue.length) {\n state.publishQueue = [];\n for (const item of publishQueue) {\n if (item.__type === PublishType.DATA) {\n yield item.data;\n } else {\n throw item.err;\n }\n }\n } else {\n yield await new Promise((resolve, reject) => {\n iteratorState.set(iteratorKey, {\n __hasPolled: true,\n onData: resolve,\n onError: reject,\n });\n });\n }\n } catch (e) {\n if (e === (EXPLICIT_ABORT_TOKEN ||= createExplicitAbortToken())) {\n return;\n } else {\n throw e;\n }\n }\n }\n } finally {\n iteratorState.delete(iteratorKey);\n }\n },\n };\n}\n","import { TypedEventEmitter, TypedEventTarget } from './event-emitter';\n\ntype UnsubscribeFn = () => void;\n\n/**\n * Represents an object with an `on` function that you can call to subscribe to certain data over a\n * named channel.\n *\n * @example\n * ```ts\n * let dataPublisher: DataPublisher<{ error: SolanaError }>;\n * dataPublisher.on('data', handleData); // ERROR. `data` is not a known channel name.\n * dataPublisher.on('error', e => {\n * console.error(e);\n * }); // OK.\n * ```\n */\nexport interface DataPublisher = Record> {\n /**\n * Call this to subscribe to data over a named channel.\n *\n * @param channelName The name of the channel on which to subscribe for messages\n * @param subscriber The function to call when a message becomes available\n * @param options.signal An abort signal you can fire to unsubscribe\n *\n * @returns A function that you can call to unsubscribe\n */\n on(\n channelName: TChannelName,\n subscriber: (data: TDataByChannelName[TChannelName]) => void,\n options?: { signal: AbortSignal },\n ): UnsubscribeFn;\n}\n\n/**\n * Returns an object with an `on` function that you can call to subscribe to certain data over a\n * named channel.\n *\n * The `on` function returns an unsubscribe function.\n *\n * @example\n * ```ts\n * const socketDataPublisher = getDataPublisherFromEventEmitter(new WebSocket('wss://api.devnet.solana.com'));\n * const unsubscribe = socketDataPublisher.on('message', message => {\n * if (JSON.parse(message.data).id === 42) {\n * console.log('Got response 42');\n * unsubscribe();\n * }\n * });\n * ```\n */\nexport function getDataPublisherFromEventEmitter>(\n eventEmitter: TypedEventEmitter | TypedEventTarget,\n): DataPublisher<{\n [TEventType in keyof TEventMap]: TEventMap[TEventType] extends CustomEvent ? TEventMap[TEventType]['detail'] : null;\n}> {\n return {\n on(channelName, subscriber, options) {\n function innerListener(ev: Event) {\n if (ev instanceof CustomEvent) {\n const data = (ev as CustomEvent).detail;\n (subscriber as unknown as (data: TEventMap[typeof channelName]) => void)(data);\n } else {\n (subscriber as () => void)();\n }\n }\n eventEmitter.addEventListener(channelName, innerListener, options);\n return () => {\n eventEmitter.removeEventListener(channelName, innerListener);\n };\n },\n };\n}\n","import { EventTarget } from '@solana/event-target-impl';\n\nimport { DataPublisher, getDataPublisherFromEventEmitter } from './data-publisher';\n\n/**\n * Given a channel that carries messages for multiple subscribers on a single channel name, this\n * function returns a new {@link DataPublisher} that splits them into multiple channel names.\n *\n * @param messageTransformer A function that receives the message as the first argument, and returns\n * a tuple of the derived channel name and the message.\n *\n * @example\n * Imagine a channel that carries multiple notifications whose destination is contained within the\n * message itself.\n *\n * ```ts\n * const demuxedDataPublisher = demultiplexDataPublisher(channel, 'message', message => {\n * const destinationChannelName = `notification-for:${message.subscriberId}`;\n * return [destinationChannelName, message];\n * });\n * ```\n *\n * Now you can subscribe to _only_ the messages you are interested in, without having to subscribe\n * to the entire `'message'` channel and filter out the messages that are not for you.\n *\n * ```ts\n * demuxedDataPublisher.on(\n * 'notification-for:123',\n * message => {\n * console.log('Got a message for subscriber 123', message);\n * },\n * { signal: AbortSignal.timeout(5_000) },\n * );\n * ```\n */\nexport function demultiplexDataPublisher<\n TDataPublisher extends DataPublisher,\n const TChannelName extends Parameters[0],\n>(\n publisher: TDataPublisher,\n sourceChannelName: TChannelName,\n messageTransformer: (\n // FIXME: Deriving the type of the message from `TDataPublisher` and `TChannelName` would\n // help callers to constrain their transform functions.\n message: unknown,\n ) => [destinationChannelName: string, message: unknown] | void,\n): DataPublisher {\n let innerPublisherState:\n | {\n readonly dispose: () => void;\n numSubscribers: number;\n }\n | undefined;\n const eventTarget = new EventTarget();\n const demultiplexedDataPublisher = getDataPublisherFromEventEmitter(eventTarget);\n return {\n ...demultiplexedDataPublisher,\n on(channelName, subscriber, options) {\n if (!innerPublisherState) {\n const innerPublisherUnsubscribe = publisher.on(sourceChannelName, sourceMessage => {\n const transformResult = messageTransformer(sourceMessage);\n if (!transformResult) {\n return;\n }\n const [destinationChannelName, message] = transformResult;\n eventTarget.dispatchEvent(\n new CustomEvent(destinationChannelName, {\n detail: message,\n }),\n );\n });\n innerPublisherState = {\n dispose: innerPublisherUnsubscribe,\n numSubscribers: 0,\n };\n }\n innerPublisherState.numSubscribers++;\n const unsubscribe = demultiplexedDataPublisher.on(channelName, subscriber, options);\n let isActive = true;\n function handleUnsubscribe() {\n if (!isActive) {\n return;\n }\n isActive = false;\n options?.signal.removeEventListener('abort', handleUnsubscribe);\n innerPublisherState!.numSubscribers--;\n if (innerPublisherState!.numSubscribers === 0) {\n innerPublisherState!.dispose();\n innerPublisherState = undefined;\n }\n unsubscribe();\n }\n options?.signal.addEventListener('abort', handleUnsubscribe);\n return handleUnsubscribe;\n },\n };\n}\n","import { SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, SolanaError } from '@solana/errors';\nimport { Callable, Flatten, OverloadImplementations, UnionToIntersection } from '@solana/rpc-spec-types';\nimport { createAsyncIterableFromDataPublisher } from '@solana/subscribable';\n\nimport { RpcSubscriptionsApi, RpcSubscriptionsPlan } from './rpc-subscriptions-api';\nimport { PendingRpcSubscriptionsRequest, RpcSubscribeOptions } from './rpc-subscriptions-request';\nimport { RpcSubscriptionsTransport } from './rpc-subscriptions-transport';\n\nexport type RpcSubscriptionsConfig = Readonly<{\n api: RpcSubscriptionsApi;\n transport: RpcSubscriptionsTransport;\n}>;\n\n/**\n * An object that exposes all of the functions described by `TRpcSubscriptionsMethods`.\n *\n * Calling each method returns a\n * {@link PendingRpcSubscriptionsRequest | PendingRpcSubscriptionsRequest} where\n * `TNotification` is that method's notification type.\n */\nexport type RpcSubscriptions = {\n [TMethodName in keyof TRpcSubscriptionsMethods]: PendingRpcSubscriptionsRequestBuilder<\n OverloadImplementations\n >;\n};\n\ntype PendingRpcSubscriptionsRequestBuilder = UnionToIntersection<\n Flatten<{\n [P in keyof TSubscriptionMethodImplementations]: PendingRpcSubscriptionsRequestReturnTypeMapper<\n TSubscriptionMethodImplementations[P]\n >;\n }>\n>;\n\ntype PendingRpcSubscriptionsRequestReturnTypeMapper =\n // Check that this property of the TRpcSubscriptionMethods interface is, in fact, a function.\n TSubscriptionMethodImplementation extends Callable\n ? (\n ...args: Parameters\n ) => PendingRpcSubscriptionsRequest>\n : never;\n\n/**\n * Creates a {@link RpcSubscriptions} instance given a\n * {@link RpcSubscriptionsApi | RpcSubscriptionsApi} and a\n * {@link RpcSubscriptionsTransport} capable of fulfilling them.\n */\nexport function createSubscriptionRpc(\n rpcConfig: RpcSubscriptionsConfig,\n): RpcSubscriptions {\n return new Proxy(rpcConfig.api, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get(target, p, receiver) {\n if (p === 'then') {\n return undefined;\n }\n return function (...rawParams: unknown[]) {\n const notificationName = p.toString();\n const createRpcSubscriptionPlan = Reflect.get(target, notificationName, receiver);\n if (!createRpcSubscriptionPlan) {\n throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN, {\n notificationName,\n });\n }\n const subscriptionPlan = createRpcSubscriptionPlan(...rawParams);\n return createPendingRpcSubscription(rpcConfig.transport, subscriptionPlan);\n };\n },\n }) as RpcSubscriptions;\n}\n\nfunction createPendingRpcSubscription(\n transport: RpcSubscriptionsTransport,\n subscriptionsPlan: RpcSubscriptionsPlan,\n): PendingRpcSubscriptionsRequest {\n return {\n async subscribe({ abortSignal }: RpcSubscribeOptions): Promise> {\n const notificationsDataPublisher = await transport({\n signal: abortSignal,\n ...subscriptionsPlan,\n });\n return createAsyncIterableFromDataPublisher({\n abortSignal,\n dataChannelName: 'notification',\n dataPublisher: notificationsDataPublisher,\n errorChannelName: 'error',\n });\n },\n };\n}\n","import { Callable, RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec-types';\nimport { DataPublisher } from '@solana/subscribable';\n\nimport { RpcSubscriptionsChannel } from './rpc-subscriptions-channel';\nimport { RpcSubscriptionsTransportDataEvents } from './rpc-subscriptions-transport';\n\nexport type RpcSubscriptionsApiConfig = Readonly<{\n planExecutor: RpcSubscriptionsPlanExecutor>;\n /**\n * An optional function that transforms the {@link RpcRequest} before it is sent to the JSON RPC\n * server.\n *\n * This is useful when the params supplied by the caller need to be transformed before\n * forwarding the message to the server. Use cases for this include applying defaults,\n * forwarding calls to renamed methods, and serializing complex values.\n */\n requestTransformer?: RpcRequestTransformer;\n}>;\n\n/**\n * A function that implements a protocol for subscribing and unsubscribing from notifications given\n * a {@link RpcSubscriptionsChannel}, a {@link RpcRequest}, and an `AbortSignal`.\n *\n * @returns A {@link DataPublisher} that emits {@link RpcSubscriptionsTransportDataEvents}\n */\ntype RpcSubscriptionsPlanExecutor = (\n config: Readonly<{\n channel: RpcSubscriptionsChannel;\n request: RpcRequest;\n signal: AbortSignal;\n }>,\n) => Promise>>;\n\n/**\n * This type allows an {@link RpcSubscriptionsApi} to describe how a particular subscription should\n * be issued to the JSON RPC server.\n *\n * Given a function that was called on a {@link RpcSubscriptions}, this object exposes an `execute`\n * function that dictates which subscription request will be sent, how the underlying transport will\n * be used, and how the notifications will be transformed.\n *\n * This function accepts a {@link RpcSubscriptionsChannel} and an `AbortSignal` and asynchronously\n * returns a {@link DataPublisher}. This gives us the opportunity to:\n *\n * - define the `payload` from the requested method name and parameters before passing it to the\n * channel.\n * - call the underlying channel zero, one or multiple times depending on the use-case (e.g.\n * caching or coalescing multiple subscriptions).\n * - transform the notification from the JSON RPC server, in case it does not match the\n * `TNotification` specified by the\n * {@link PendingRpcSubscriptionsRequest | PendingRpcSubscriptionsRequest} emitted\n * from the publisher returned.\n */\nexport type RpcSubscriptionsPlan = Readonly<{\n /**\n * This method may be called with a newly-opened channel or a pre-established channel.\n */\n execute: (\n config: Readonly<{\n channel: RpcSubscriptionsChannel;\n signal: AbortSignal;\n }>,\n ) => Promise>>;\n /**\n * This request is used to uniquely identify the subscription.\n * It typically comes from the method name and parameters of the subscription call,\n * after potentially being transformed by the RPC Subscriptions API.\n */\n request: RpcRequest;\n}>;\n\n/**\n * For each of `TRpcSubscriptionsMethods`, this object exposes a method with the same name that maps\n * between its input arguments and a\n * {@link RpcSubscriptionsPlan | RpcSubscriptionsPlan} that implements the execution\n * of a JSON RPC subscription for `TNotifications`.\n */\nexport type RpcSubscriptionsApi = {\n [MethodName in keyof TRpcSubscriptionMethods]: RpcSubscriptionsReturnTypeMapper<\n TRpcSubscriptionMethods[MethodName]\n >;\n};\n\ntype RpcSubscriptionsReturnTypeMapper = TRpcMethod extends Callable\n ? (...rawParams: unknown[]) => RpcSubscriptionsPlan>\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RpcSubscriptionsApiMethod = (...args: any) => any;\nexport interface RpcSubscriptionsApiMethods {\n [methodName: string]: RpcSubscriptionsApiMethod;\n}\n\n/**\n * Creates a JavaScript proxy that converts _any_ function call called on it to a\n * {@link RpcSubscriptionsPlan} by creating an `execute` function that:\n *\n * - calls the supplied {@link RpcSubscriptionsApiConfig.planExecutor} with a JSON RPC v2 payload\n * object with the requested `methodName` and `params` properties, optionally transformed by\n * {@link RpcSubscriptionsApiConfig.requestTransformer}.\n *\n * @example\n * ```ts\n * // For example, given this `RpcSubscriptionsApi`:\n * const rpcSubscriptionsApi = createJsonRpcSubscriptionsApi({\n * async planExecutor({ channel, request }) {\n * await channel.send(request);\n * return {\n * ...channel,\n * on(type, listener, options) {\n * if (type !== 'message') {\n * return channel.on(type, listener, options);\n * }\n * return channel.on(\n * 'message',\n * function resultGettingListener(message) {\n * listener(message.result);\n * },\n * options,\n * );\n * }\n * }\n * },\n * requestTransformer: (...rawParams) => rawParams.reverse(),\n * });\n *\n * // ...the following function call:\n * rpcSubscriptionsApi.foo('bar', { baz: 'bat' });\n *\n * // ...will produce a `RpcSubscriptionsPlan` that:\n * // - Uses the following payload: { id: 1, jsonrpc: '2.0', method: 'foo', params: [{ baz: 'bat' }, 'bar'] }.\n * // - Emits the \"result\" property of each RPC Subscriptions message.\n * ```\n */\nexport function createRpcSubscriptionsApi(\n config: RpcSubscriptionsApiConfig,\n): RpcSubscriptionsApi {\n return new Proxy({} as RpcSubscriptionsApi, {\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n get>(\n ...args: Parameters>['get']>>\n ) {\n const [_, p] = args;\n const methodName = p.toString() as keyof TRpcSubscriptionsApiMethods as string;\n return function (\n ...params: Parameters<\n TRpcSubscriptionsApiMethods[TNotificationName] extends CallableFunction\n ? TRpcSubscriptionsApiMethods[TNotificationName]\n : never\n >\n ): RpcSubscriptionsPlan> {\n const rawRequest = { methodName, params };\n const request = config.requestTransformer ? config.requestTransformer(rawRequest) : rawRequest;\n return {\n execute(planConfig) {\n return config.planExecutor({ ...planConfig, request });\n },\n request,\n };\n };\n },\n });\n}\n","import {\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SolanaError,\n} from '@solana/errors';\nimport { DataPublisher } from '@solana/subscribable';\n\ntype RpcSubscriptionsChannelSolanaErrorCode =\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED\n | typeof SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT;\n\nexport type RpcSubscriptionChannelEvents = {\n /**\n * Fires when the channel closes unexpectedly.\n * @eventProperty\n */\n error: SolanaError;\n /**\n * Fires on every message received from the remote end.\n * @eventProperty\n */\n message: TInboundMessage;\n};\n\n/**\n * A {@link DataPublisher} on which you can subscribe to events of type\n * {@link RpcSubscriptionChannelEvents | RpcSubscriptionChannelEvents}.\n * Additionally, you can use this object to send messages of type `TOutboundMessage` back to the\n * remote end by calling its {@link RpcSubscriptionsChannel.send | `send(message)`} method.\n */\nexport interface RpcSubscriptionsChannel extends DataPublisher<\n RpcSubscriptionChannelEvents\n> {\n send(message: TOutboundMessage): Promise;\n}\n\n/**\n * A channel creator is a function that accepts an `AbortSignal`, returns a new\n * {@link RpcSubscriptionsChannel}, and tears down the channel when the abort signal fires.\n */\nexport type RpcSubscriptionsChannelCreator = (\n config: Readonly<{\n abortSignal: AbortSignal;\n }>,\n) => Promise>;\n\n/**\n * Given a channel with inbound messages of type `T` and a function of type `T => U`, returns a new\n * channel with inbound messages of type `U`.\n *\n * Note that this only affects messages of type `\"message\"` and thus, does not affect incoming error\n * messages.\n *\n * @example Parsing incoming JSON messages\n * ```ts\n * const transformedChannel = transformChannelInboundMessages(channel, JSON.parse);\n * ```\n */\nexport function transformChannelInboundMessages(\n channel: RpcSubscriptionsChannel,\n transform: (message: TInboundMessage) => TNewInboundMessage,\n): RpcSubscriptionsChannel {\n return Object.freeze>({\n ...channel,\n on(type, subscriber, options) {\n if (type !== 'message') {\n return channel.on(\n type,\n subscriber as (data: RpcSubscriptionChannelEvents[typeof type]) => void,\n options,\n );\n }\n return channel.on(\n 'message',\n message => (subscriber as (data: TNewInboundMessage) => void)(transform(message)),\n options,\n );\n },\n });\n}\n\n/**\n * Given a channel with outbound messages of type `T` and a function of type `U => T`, returns a new\n * channel with outbound messages of type `U`.\n *\n * @example Stringifying JSON messages before sending them over the wire\n * ```ts\n * const transformedChannel = transformChannelOutboundMessages(channel, JSON.stringify);\n * ```\n */\nexport function transformChannelOutboundMessages(\n channel: RpcSubscriptionsChannel,\n transform: (message: TNewOutboundMessage) => TOutboundMessage,\n): RpcSubscriptionsChannel {\n return Object.freeze>({\n ...channel,\n send: message => channel.send(transform(message)),\n });\n}\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import {\n getSolanaErrorFromJsonRpcError,\n SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID,\n SolanaError,\n} from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport { safeRace } from '@solana/promises';\nimport { createRpcMessage, RpcRequest, RpcResponseData, RpcResponseTransformer } from '@solana/rpc-spec-types';\nimport { DataPublisher } from '@solana/subscribable';\nimport { demultiplexDataPublisher } from '@solana/subscribable';\n\nimport { RpcSubscriptionChannelEvents } from './rpc-subscriptions-channel';\nimport { RpcSubscriptionsChannel } from './rpc-subscriptions-channel';\n\ntype Config = Readonly<{\n channel: RpcSubscriptionsChannel | RpcResponseData>;\n responseTransformer?: RpcResponseTransformer;\n signal: AbortSignal;\n subscribeRequest: RpcRequest;\n unsubscribeMethodName: string;\n}>;\n\ntype RpcNotification = Readonly<{\n method: string;\n params: Readonly<{\n result: TNotification;\n subscription: number;\n }>;\n}>;\n\ntype RpcSubscriptionId = number;\n\ntype RpcSubscriptionNotificationEvents = Omit, 'message'> & {\n notification: TNotification;\n};\n\nconst subscriberCountBySubscriptionIdByChannel = new WeakMap>();\nfunction decrementSubscriberCountAndReturnNewCount(channel: WeakKey, subscriptionId?: number): number | undefined {\n return augmentSubscriberCountAndReturnNewCount(-1, channel, subscriptionId);\n}\nfunction incrementSubscriberCount(channel: WeakKey, subscriptionId?: number): void {\n augmentSubscriberCountAndReturnNewCount(1, channel, subscriptionId);\n}\nfunction getSubscriberCountBySubscriptionIdForChannel(channel: WeakKey): Record {\n let subscriberCountBySubscriptionId = subscriberCountBySubscriptionIdByChannel.get(channel);\n if (!subscriberCountBySubscriptionId) {\n subscriberCountBySubscriptionIdByChannel.set(channel, (subscriberCountBySubscriptionId = {}));\n }\n return subscriberCountBySubscriptionId;\n}\nfunction augmentSubscriberCountAndReturnNewCount(\n amount: -1 | 1,\n channel: WeakKey,\n subscriptionId?: number,\n): number | undefined {\n if (subscriptionId === undefined) {\n return;\n }\n const subscriberCountBySubscriptionId = getSubscriberCountBySubscriptionIdForChannel(channel);\n if (!subscriberCountBySubscriptionId[subscriptionId] && amount > 0) {\n subscriberCountBySubscriptionId[subscriptionId] = 0;\n }\n const newCount = amount + subscriberCountBySubscriptionId[subscriptionId];\n if (newCount <= 0) {\n delete subscriberCountBySubscriptionId[subscriptionId];\n } else {\n subscriberCountBySubscriptionId[subscriptionId] = newCount;\n }\n return newCount;\n}\n\nconst cache = new WeakMap();\nfunction getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer(\n channel: RpcSubscriptionsChannel>,\n subscribeRequest: RpcRequest,\n responseTransformer?: RpcResponseTransformer,\n): DataPublisher<{\n [channelName: `notification:${number}`]: TNotification;\n}> {\n let publisherByResponseTransformer = cache.get(channel);\n if (!publisherByResponseTransformer) {\n cache.set(channel, (publisherByResponseTransformer = new WeakMap()));\n }\n const responseTransformerKey = responseTransformer ?? channel;\n let publisher = publisherByResponseTransformer.get(responseTransformerKey);\n if (!publisher) {\n publisherByResponseTransformer.set(\n responseTransformerKey,\n (publisher = demultiplexDataPublisher(channel, 'message', rawMessage => {\n const message = rawMessage as RpcNotification | RpcResponseData;\n if (!('method' in message)) {\n return;\n }\n const transformedNotification = responseTransformer\n ? responseTransformer(message.params.result, subscribeRequest)\n : message.params.result;\n return [`notification:${message.params.subscription}`, transformedNotification];\n })),\n );\n }\n return publisher;\n}\n\n/**\n * Given a channel, this function executes the particular subscription plan required by the Solana\n * JSON RPC Subscriptions API.\n *\n * @param config\n *\n * 1. Calls the `subscribeRequest` on the remote RPC\n * 2. Waits for a response containing the subscription id\n * 3. Returns a {@link DataPublisher} that publishes notifications related to that subscriptions id,\n * filtering out all others\n * 4. Calls the `unsubscribeMethodName` on the remote RPC when the abort signal is fired.\n */\nexport async function executeRpcPubSubSubscriptionPlan({\n channel,\n responseTransformer,\n signal,\n subscribeRequest,\n unsubscribeMethodName,\n}: Config): Promise>> {\n let subscriptionId: number | undefined;\n channel.on(\n 'error',\n () => {\n // An error on the channel indicates that the subscriptions are dead.\n // There is no longer any sense hanging on to subscription ids.\n // Erasing it here will prevent the unsubscribe code from running.\n subscriptionId = undefined;\n subscriberCountBySubscriptionIdByChannel.delete(channel);\n },\n { signal },\n );\n /**\n * STEP 1\n * Create a promise that rejects if this subscription is aborted and sends\n * the unsubscribe message if the subscription is active at that time.\n */\n const abortPromise = new Promise((_, reject) => {\n function handleAbort(this: AbortSignal) {\n /**\n * Because of https://github.com/solana-labs/solana/pull/18943, two subscriptions for\n * materially the same notification will be coalesced on the server. This means they\n * will be assigned the same subscription id, and will occupy one subscription slot. We\n * must be careful not to send the unsubscribe message until the last subscriber aborts.\n */\n if (decrementSubscriberCountAndReturnNewCount(channel, subscriptionId) === 0) {\n const unsubscribePayload = createRpcMessage({\n methodName: unsubscribeMethodName,\n params: [subscriptionId],\n });\n subscriptionId = undefined;\n channel.send(unsubscribePayload).catch(() => {});\n }\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(this.reason);\n }\n if (signal.aborted) {\n handleAbort.call(signal);\n } else {\n signal.addEventListener('abort', handleAbort);\n }\n });\n /**\n * STEP 2\n * Send the subscription request.\n */\n const subscribePayload = createRpcMessage(subscribeRequest);\n await channel.send(subscribePayload);\n /**\n * STEP 3\n * Wait for the acknowledgement from the server with the subscription id.\n */\n const subscriptionIdPromise = new Promise((resolve, reject) => {\n const abortController = new AbortController();\n signal.addEventListener('abort', abortController.abort.bind(abortController));\n const options = { signal: abortController.signal } as const;\n channel.on(\n 'error',\n err => {\n abortController.abort();\n reject(err);\n },\n options,\n );\n channel.on(\n 'message',\n message => {\n if (message && typeof message === 'object' && 'id' in message && message.id === subscribePayload.id) {\n abortController.abort();\n if ('error' in message) {\n reject(getSolanaErrorFromJsonRpcError(message.error));\n } else {\n resolve(message.result);\n }\n }\n },\n options,\n );\n });\n subscriptionId = await safeRace([abortPromise, subscriptionIdPromise]);\n if (subscriptionId == null) {\n throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID);\n }\n incrementSubscriberCount(channel, subscriptionId);\n /**\n * STEP 4\n * Filter out notifications unrelated to this subscription.\n */\n const notificationPublisher = getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer(\n channel,\n subscribeRequest,\n responseTransformer,\n );\n const notificationKey = `notification:${subscriptionId}` as const;\n return {\n on(type, listener, options) {\n switch (type) {\n case 'notification':\n return notificationPublisher.on(\n notificationKey,\n listener as (data: RpcSubscriptionNotificationEvents['notification']) => void,\n options,\n );\n case 'error':\n return channel.on(\n 'error',\n listener as (data: RpcSubscriptionNotificationEvents['error']) => void,\n options,\n );\n default:\n throw new SolanaError(SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED, {\n channelName: type,\n supportedChannelNames: ['notification', 'error'],\n });\n }\n },\n };\n}\n","import {\n createRpcSubscriptionsApi,\n executeRpcPubSubSubscriptionPlan,\n RpcSubscriptionsApi,\n RpcSubscriptionsApiMethods,\n} from '@solana/rpc-subscriptions-spec';\nimport {\n AllowedNumericKeypaths,\n getDefaultRequestTransformerForSolanaRpc,\n getDefaultResponseTransformerForSolanaRpcSubscriptions,\n jsonParsedAccountsConfigs,\n KEYPATH_WILDCARD,\n RequestTransformerConfig,\n} from '@solana/rpc-transformers';\n\nimport { AccountNotificationsApi } from './account-notifications';\nimport { BlockNotificationsApi } from './block-notifications';\nimport { LogsNotificationsApi } from './logs-notifications';\nimport { ProgramNotificationsApi } from './program-notifications';\nimport { RootNotificationsApi } from './root-notifications';\nimport { SignatureNotificationsApi } from './signature-notifications';\nimport { SlotNotificationsApi } from './slot-notifications';\nimport { SlotsUpdatesNotificationsApi } from './slots-updates-notifications';\nimport { VoteNotificationsApi } from './vote-notifications';\n\nexport type SolanaRpcSubscriptionsApi = AccountNotificationsApi &\n LogsNotificationsApi &\n ProgramNotificationsApi &\n RootNotificationsApi &\n SignatureNotificationsApi &\n SlotNotificationsApi;\nexport type SolanaRpcSubscriptionsApiUnstable = BlockNotificationsApi &\n SlotsUpdatesNotificationsApi &\n VoteNotificationsApi;\n\nexport type {\n AccountNotificationsApi,\n BlockNotificationsApi,\n LogsNotificationsApi,\n ProgramNotificationsApi,\n RootNotificationsApi,\n SignatureNotificationsApi,\n SlotNotificationsApi,\n SlotsUpdatesNotificationsApi,\n VoteNotificationsApi,\n};\n\ntype Config = RequestTransformerConfig;\n\nfunction createSolanaRpcSubscriptionsApi_INTERNAL(\n config?: Config,\n): RpcSubscriptionsApi {\n const requestTransformer = getDefaultRequestTransformerForSolanaRpc(config);\n const responseTransformer = getDefaultResponseTransformerForSolanaRpcSubscriptions({\n allowedNumericKeyPaths: getAllowedNumericKeypaths(),\n });\n return createRpcSubscriptionsApi({\n planExecutor({ request, ...rest }) {\n return executeRpcPubSubSubscriptionPlan({\n ...rest,\n responseTransformer,\n subscribeRequest: { ...request, methodName: request.methodName.replace(/Notifications$/, 'Subscribe') },\n unsubscribeMethodName: request.methodName.replace(/Notifications$/, 'Unsubscribe'),\n });\n },\n requestTransformer,\n });\n}\n\nexport function createSolanaRpcSubscriptionsApi(\n config?: Config,\n): RpcSubscriptionsApi {\n return createSolanaRpcSubscriptionsApi_INTERNAL(config);\n}\n\nexport function createSolanaRpcSubscriptionsApi_UNSTABLE(config?: Config) {\n return createSolanaRpcSubscriptionsApi_INTERNAL(\n config,\n );\n}\n\nlet memoizedKeypaths: AllowedNumericKeypaths<\n RpcSubscriptionsApi\n>;\n\n/**\n * These are keypaths at the end of which you will find a numeric value that should *not* be upcast\n * to a `bigint`. These are values that are legitimately defined as `u8` or `usize` on the backend.\n */\nfunction getAllowedNumericKeypaths(): AllowedNumericKeypaths<\n RpcSubscriptionsApi\n> {\n if (!memoizedKeypaths) {\n memoizedKeypaths = {\n accountNotifications: jsonParsedAccountsConfigs.map(c => ['value', ...c]),\n blockNotifications: [\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'preTokenBalances',\n KEYPATH_WILDCARD,\n 'accountIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'preTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'postTokenBalances',\n KEYPATH_WILDCARD,\n 'accountIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'postTokenBalances',\n KEYPATH_WILDCARD,\n 'uiTokenAmount',\n 'decimals',\n ],\n ['value', 'block', 'transactions', KEYPATH_WILDCARD, 'meta', 'rewards', KEYPATH_WILDCARD, 'commission'],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n 'index',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n 'instructions',\n KEYPATH_WILDCARD,\n 'programIdIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'meta',\n 'innerInstructions',\n KEYPATH_WILDCARD,\n 'instructions',\n KEYPATH_WILDCARD,\n 'accounts',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'addressTableLookups',\n KEYPATH_WILDCARD,\n 'writableIndexes',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'addressTableLookups',\n KEYPATH_WILDCARD,\n 'readonlyIndexes',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'instructions',\n KEYPATH_WILDCARD,\n 'programIdIndex',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'instructions',\n KEYPATH_WILDCARD,\n 'accounts',\n KEYPATH_WILDCARD,\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'header',\n 'numReadonlySignedAccounts',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'header',\n 'numReadonlyUnsignedAccounts',\n ],\n [\n 'value',\n 'block',\n 'transactions',\n KEYPATH_WILDCARD,\n 'transaction',\n 'message',\n 'header',\n 'numRequiredSignatures',\n ],\n ['value', 'block', 'rewards', KEYPATH_WILDCARD, 'commission'],\n ],\n programNotifications: jsonParsedAccountsConfigs.flatMap(c => [\n ['value', KEYPATH_WILDCARD, 'account', ...c],\n [KEYPATH_WILDCARD, 'account', ...c],\n ]),\n };\n }\n return memoizedKeypaths;\n}\n","'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [options.isServer=false] Create the instance in either\n * server or client mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n */\n constructor(options) {\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._maxPayload = this._options.maxPayload | 0;\n this._isServer = !!this._options.isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate({\n ...opts.perMessageDeflate,\n isServer: false,\n maxPayload: opts.maxPayload\n });\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate({\n ...this.options.perMessageDeflate,\n isServer: true,\n maxPayload: this.options.maxPayload\n });\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of \n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n","import createWebSocketStream from './lib/stream.js';\nimport extension from './lib/extension.js';\nimport PerMessageDeflate from './lib/permessage-deflate.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport subprotocol from './lib/subprotocol.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport {\n createWebSocketStream,\n extension,\n PerMessageDeflate,\n Receiver,\n Sender,\n subprotocol,\n WebSocket,\n WebSocketServer\n};\n\nexport default WebSocket;\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","// When building the browser bundle, this import gets replaced by `globalThis.WebSocket`.\nimport WebSocketImpl from 'ws';\n\nexport default globalThis.WebSocket\n ? globalThis.WebSocket // Use native `WebSocket` in runtimes that support it (eg. Deno)\n : WebSocketImpl;\n","import {\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED,\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT,\n SolanaError,\n} from '@solana/errors';\nimport { EventTarget } from '@solana/event-target-impl';\nimport { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\nimport { getDataPublisherFromEventEmitter } from '@solana/subscribable';\nimport WebSocket from '@solana/ws-impl';\n\nexport type Config = Readonly<{\n /**\n * The number of bytes to admit into the WebSocket's send buffer before queueing messages on the\n * client.\n *\n * When you call {@link RpcSubscriptionsChannel.send | `send()`} on a `WebSocket` the runtime\n * might add the message to a buffer rather than send it right away. In the event that\n * `socket.bufferedAmount` exceeds the value configured here, messages will be added to a queue\n * in your application code instead of being sent to the WebSocket, until such time as the\n * `bufferedAmount` falls back below the high watermark.\n */\n sendBufferHighWatermark: number;\n /**\n * An `AbortSignal` to fire when you want to explicitly close the `WebSocket`.\n *\n * If the channel is open it will be closed with a normal closure code\n * (https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1) If the channel has not been\n * established yet, firing this signal will result in the `AbortError` being thrown to the\n * caller who was trying to open the channel.\n */\n signal: AbortSignal;\n /**\n * A string representing the target endpoint.\n *\n * In Node, it must be an absolute URL using the `ws` or `wss` protocol.\n */\n url: string;\n}>;\n\ntype WebSocketMessage = ArrayBufferLike | ArrayBufferView | Blob | string;\n\nconst NORMAL_CLOSURE_CODE = 1000; // https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1\n\n/**\n * Creates an object that represents an open channel to a `WebSocket` server.\n *\n * You can use it to send messages by calling its\n * {@link RpcSubscriptionsChannel.send | `send()`} function and you can receive them by subscribing\n * to the {@link RpcSubscriptionChannelEvents} it emits.\n */\nexport function createWebSocketChannel({\n sendBufferHighWatermark,\n signal,\n url,\n}: Config): Promise> {\n if (signal.aborted) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n return Promise.reject(signal.reason);\n }\n let bufferDrainWatcher: Readonly<{ onCancel(): void; promise: Promise }> | undefined;\n let hasConnected = false;\n const listenerRemovers = new Set<() => void>();\n function cleanupListeners() {\n listenerRemovers.forEach(r => {\n r();\n });\n listenerRemovers.clear();\n }\n function handleAbort() {\n cleanupListeners();\n if (!hasConnected) {\n rejectOpen(signal.reason);\n }\n if (webSocket.readyState !== WebSocket.CLOSED && webSocket.readyState !== WebSocket.CLOSING) {\n webSocket.close(NORMAL_CLOSURE_CODE);\n }\n }\n function handleClose(ev: CloseEvent) {\n cleanupListeners();\n bufferDrainWatcher?.onCancel();\n signal.removeEventListener('abort', handleAbort);\n webSocket.removeEventListener('close', handleClose);\n webSocket.removeEventListener('error', handleError);\n webSocket.removeEventListener('message', handleMessage);\n webSocket.removeEventListener('open', handleOpen);\n if (!signal.aborted && !(ev.wasClean && ev.code === NORMAL_CLOSURE_CODE)) {\n eventTarget.dispatchEvent(\n new CustomEvent('error', {\n detail: new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED, {\n cause: ev,\n }),\n }),\n );\n }\n }\n function handleError(ev: Event) {\n if (signal.aborted) {\n return;\n }\n if (!hasConnected) {\n const failedToConnectError = new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT, {\n errorEvent: ev,\n });\n rejectOpen(failedToConnectError);\n eventTarget.dispatchEvent(\n new CustomEvent('error', {\n detail: failedToConnectError,\n }),\n );\n }\n }\n function handleMessage(ev: MessageEvent) {\n if (signal.aborted) {\n return;\n }\n eventTarget.dispatchEvent(new CustomEvent('message', { detail: ev.data }));\n }\n const eventTarget = new EventTarget();\n const dataPublisher = getDataPublisherFromEventEmitter(eventTarget);\n function handleOpen() {\n hasConnected = true;\n resolveOpen({\n ...dataPublisher,\n async send(message) {\n if (webSocket.readyState !== WebSocket.OPEN) {\n throw new SolanaError(SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED);\n }\n if (!bufferDrainWatcher && webSocket.bufferedAmount > sendBufferHighWatermark) {\n let onCancel!: () => void;\n const promise = new Promise((resolve, reject) => {\n const intervalId = setInterval(() => {\n if (\n webSocket.readyState !== WebSocket.OPEN ||\n !(webSocket.bufferedAmount > sendBufferHighWatermark)\n ) {\n clearInterval(intervalId);\n bufferDrainWatcher = undefined;\n resolve();\n }\n }, 16);\n onCancel = () => {\n bufferDrainWatcher = undefined;\n clearInterval(intervalId);\n reject(\n new SolanaError(\n SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED,\n ),\n );\n };\n });\n bufferDrainWatcher = {\n onCancel,\n promise,\n };\n }\n if (bufferDrainWatcher) {\n if (ArrayBuffer.isView(message) && !(message instanceof DataView)) {\n const TypedArrayConstructor = message.constructor as {\n new (...args: [typeof message]): typeof message;\n };\n // Clone the message to prevent mutation while queued.\n message = new TypedArrayConstructor(message);\n }\n await bufferDrainWatcher.promise;\n }\n webSocket.send(message);\n },\n });\n }\n const webSocket = new WebSocket(url);\n signal.addEventListener('abort', handleAbort);\n webSocket.addEventListener('close', handleClose);\n webSocket.addEventListener('error', handleError);\n webSocket.addEventListener('message', handleMessage);\n webSocket.addEventListener('open', handleOpen);\n let rejectOpen!: (e: SolanaError) => void;\n let resolveOpen!: (value: RpcSubscriptionsChannel) => void;\n return new Promise>((resolve, reject) => {\n rejectOpen = reject;\n resolveOpen = resolve;\n });\n}\n","import { safeCaptureStackTrace, SOLANA_ERROR__RPC__INTEGER_OVERFLOW, SolanaError } from '@solana/errors';\nimport type { KeyPath } from '@solana/rpc-transformers';\n\nexport function createSolanaJsonRpcIntegerOverflowError(\n methodName: string,\n keyPath: KeyPath,\n value: bigint,\n): SolanaError {\n let argumentLabel = '';\n if (typeof keyPath[0] === 'number') {\n const argPosition = keyPath[0] + 1;\n const lastDigit = argPosition % 10;\n const lastTwoDigits = argPosition % 100;\n if (lastDigit == 1 && lastTwoDigits != 11) {\n argumentLabel = argPosition + 'st';\n } else if (lastDigit == 2 && lastTwoDigits != 12) {\n argumentLabel = argPosition + 'nd';\n } else if (lastDigit == 3 && lastTwoDigits != 13) {\n argumentLabel = argPosition + 'rd';\n } else {\n argumentLabel = argPosition + 'th';\n }\n } else {\n argumentLabel = `\\`${keyPath[0].toString()}\\``;\n }\n const path =\n keyPath.length > 1\n ? keyPath\n .slice(1)\n .map(pathPart => (typeof pathPart === 'number' ? `[${pathPart}]` : pathPart))\n .join('.')\n : undefined;\n const error = new SolanaError(SOLANA_ERROR__RPC__INTEGER_OVERFLOW, {\n argumentLabel,\n keyPath: keyPath as readonly (number | string | symbol)[],\n methodName,\n optionalPathLabel: path ? ` at path \\`${path}\\`` : '',\n value,\n ...(path !== undefined ? { path } : undefined),\n });\n safeCaptureStackTrace(error, createSolanaJsonRpcIntegerOverflowError);\n return error;\n}\n","import type { createSolanaRpcSubscriptionsApi } from '@solana/rpc-subscriptions-api';\n\nimport { createSolanaJsonRpcIntegerOverflowError } from './rpc-integer-overflow-error';\n\nexport const DEFAULT_RPC_SUBSCRIPTIONS_CONFIG: Partial<\n NonNullable[0]>\n> = {\n defaultCommitment: 'confirmed',\n onIntegerOverflow(request, keyPath, value) {\n throw createSolanaJsonRpcIntegerOverflowError(request.methodName, keyPath, value);\n },\n};\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import { isSolanaError, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport type { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\n\ntype Config> = Readonly<{\n abortSignal: AbortSignal;\n channel: TChannel;\n intervalMs: number;\n}>;\n\nconst PING_PAYLOAD = {\n jsonrpc: '2.0',\n method: 'ping',\n} as const;\n\n/**\n * Given a {@link RpcSubscriptionsChannel}, will return a new channel that sends a ping message to\n * the inner channel if a message has not been sent or received in the last `intervalMs`. In web\n * browsers, this implementation sends no ping when the network is down, and sends a ping\n * immediately upon the network coming back up.\n */\nexport function getRpcSubscriptionsChannelWithAutoping>({\n abortSignal: callerAbortSignal,\n channel,\n intervalMs,\n}: Config): TChannel {\n let intervalId: ReturnType | undefined;\n function sendPing() {\n channel.send(PING_PAYLOAD).catch((e: unknown) => {\n if (isSolanaError(e, SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED)) {\n pingerAbortController.abort();\n }\n });\n }\n function restartPingTimer() {\n clearInterval(intervalId);\n intervalId = setInterval(sendPing, intervalMs);\n }\n const pingerAbortController = new AbortController();\n pingerAbortController.signal.addEventListener('abort', () => {\n clearInterval(intervalId);\n });\n callerAbortSignal.addEventListener('abort', () => {\n pingerAbortController.abort();\n });\n channel.on(\n 'error',\n () => {\n pingerAbortController.abort();\n },\n { signal: pingerAbortController.signal },\n );\n channel.on('message', restartPingTimer, { signal: pingerAbortController.signal });\n if (!__BROWSER__ || globalThis.navigator.onLine) {\n restartPingTimer();\n }\n if (__BROWSER__) {\n globalThis.addEventListener(\n 'offline',\n function handleOffline() {\n clearInterval(intervalId);\n },\n { signal: pingerAbortController.signal },\n );\n globalThis.addEventListener(\n 'online',\n function handleOnline() {\n sendPing();\n restartPingTimer();\n },\n { signal: pingerAbortController.signal },\n );\n }\n return {\n ...channel,\n send(...args) {\n if (!pingerAbortController.signal.aborted) {\n restartPingTimer();\n }\n return channel.send(...args);\n },\n };\n}\n","import { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\n\nexport type ChannelPoolEntry = {\n channel: PromiseLike> | RpcSubscriptionsChannel;\n readonly dispose: () => void;\n subscriptionCount: number;\n};\n\ntype ChannelPool = { readonly entries: ChannelPoolEntry[]; freeChannelIndex: number };\n\nexport function createChannelPool(): ChannelPool {\n return {\n entries: [],\n freeChannelIndex: -1,\n };\n}\n","import { AbortController } from '@solana/event-target-impl';\nimport { RpcSubscriptionsChannelCreator } from '@solana/rpc-subscriptions-spec';\n\nimport { ChannelPoolEntry, createChannelPool } from './rpc-subscriptions-channel-pool-internal';\n\ntype Config = Readonly<{\n maxSubscriptionsPerChannel: number;\n minChannels: number;\n}>;\n\n/**\n * Given a channel creator, will return a new channel creator with the following behavior.\n *\n * 1. When called, returns a {@link RpcSubscriptionsChannel}. Adds that channel to a pool.\n * 2. When called again, creates and returns new\n * {@link RpcSubscriptionChannel | RpcSubscriptionChannels} up to the number specified by\n * `minChannels`.\n * 3. When `minChannels` channels have been created, subsequent calls vend whichever existing\n * channel from the pool has the fewest subscribers, or the next one in rotation in the event of\n * a tie.\n * 4. Once all channels carry the number of subscribers specified by the number\n * `maxSubscriptionsPerChannel`, new channels in excess of `minChannel` will be created,\n * returned, and added to the pool.\n * 5. A channel will be destroyed once all of its subscribers' abort signals fire.\n */\nexport function getChannelPoolingChannelCreator<\n TChannelCreator extends RpcSubscriptionsChannelCreator,\n>(createChannel: TChannelCreator, { maxSubscriptionsPerChannel, minChannels }: Config): TChannelCreator {\n const pool = createChannelPool();\n /**\n * This function advances the free channel index to the pool entry with the most capacity. It\n * sets the index to `-1` if all channels are full.\n */\n function recomputeFreeChannelIndex() {\n if (pool.entries.length < minChannels) {\n // Don't set the free channel index until the pool fills up; we want to keep creating\n // channels before we start rotating among them.\n pool.freeChannelIndex = -1;\n return;\n }\n let mostFreeChannel: Readonly<{ poolIndex: number; subscriptionCount: number }> | undefined;\n for (let ii = 0; ii < pool.entries.length; ii++) {\n const nextPoolIndex = (pool.freeChannelIndex + ii + 2) % pool.entries.length;\n const nextPoolEntry =\n // Start from the item two positions after the current item. This way, the\n // search will finish on the item after the current one. This ensures that, if\n // any channels tie for having the most capacity, the one that will be chosen is\n // the one immediately to the current one's right (wrapping around).\n pool.entries[nextPoolIndex];\n if (\n nextPoolEntry.subscriptionCount < maxSubscriptionsPerChannel &&\n (!mostFreeChannel || mostFreeChannel.subscriptionCount >= nextPoolEntry.subscriptionCount)\n ) {\n mostFreeChannel = {\n poolIndex: nextPoolIndex,\n subscriptionCount: nextPoolEntry.subscriptionCount,\n };\n }\n }\n pool.freeChannelIndex = mostFreeChannel?.poolIndex ?? -1;\n }\n return function getExistingChannelWithMostCapacityOrCreateChannel({ abortSignal }) {\n let poolEntry: ChannelPoolEntry;\n function destroyPoolEntry() {\n const index = pool.entries.findIndex(entry => entry === poolEntry);\n pool.entries.splice(index, 1);\n poolEntry.dispose();\n recomputeFreeChannelIndex();\n }\n if (pool.freeChannelIndex === -1) {\n const abortController = new AbortController();\n const newChannelPromise = createChannel({ abortSignal: abortController.signal });\n newChannelPromise\n .then(newChannel => {\n newChannel.on('error', destroyPoolEntry, { signal: abortController.signal });\n })\n .catch(destroyPoolEntry);\n poolEntry = {\n channel: newChannelPromise,\n dispose() {\n abortController.abort();\n },\n subscriptionCount: 0,\n };\n pool.entries.push(poolEntry);\n } else {\n poolEntry = pool.entries[pool.freeChannelIndex];\n }\n /**\n * A note about subscription counts.\n * Because of https://github.com/solana-labs/solana/pull/18943, two subscriptions for\n * materially the same notification will be coalesced on the server. This means they will be\n * assigned the same subscription id, and will occupy one subscription slot. We can't tell,\n * from here, whether a subscription will be treated in this way or not, so we\n * unconditionally increment the subscription count every time a subscription request is\n * made. This may result in subscription channels being treated as out-of-capacity when in\n * fact they are not.\n */\n poolEntry.subscriptionCount++;\n abortSignal.addEventListener('abort', function destroyConsumer() {\n poolEntry.subscriptionCount--;\n if (poolEntry.subscriptionCount === 0) {\n destroyPoolEntry();\n } else if (pool.freeChannelIndex !== -1) {\n // Back the free channel index up one position, and recompute it.\n pool.freeChannelIndex--;\n recomputeFreeChannelIndex();\n }\n });\n recomputeFreeChannelIndex();\n return poolEntry.channel;\n } as TChannelCreator;\n}\n","import { pipe } from '@solana/functional';\nimport {\n RpcSubscriptionsChannel,\n transformChannelInboundMessages,\n transformChannelOutboundMessages,\n} from '@solana/rpc-subscriptions-spec';\n\n/**\n * Given a {@link RpcSubscriptionsChannel}, will return a new channel that parses data published to\n * the `'message'` channel as JSON, and JSON-stringifies messages sent via the\n * {@link RpcSubscriptionsChannel.send | send(message)} method.\n */\nexport function getRpcSubscriptionsChannelWithJSONSerialization(\n channel: RpcSubscriptionsChannel,\n): RpcSubscriptionsChannel {\n return pipe(\n channel,\n c => transformChannelInboundMessages(c, JSON.parse),\n c => transformChannelOutboundMessages(c, JSON.stringify),\n );\n}\n","import { pipe } from '@solana/functional';\nimport { parseJsonWithBigInts, stringifyJsonWithBigInts } from '@solana/rpc-spec-types';\nimport {\n RpcSubscriptionsChannel,\n transformChannelInboundMessages,\n transformChannelOutboundMessages,\n} from '@solana/rpc-subscriptions-spec';\n\n/**\n * Similarly, to {@link getRpcSubscriptionsChannelWithJSONSerialization}, this function will\n * stringify and parse JSON message to and from the given `string` channel. However, this function\n * parses any integer value as a `BigInt` in order to safely handle numbers that exceed the\n * JavaScript [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\n * value.\n */\nexport function getRpcSubscriptionsChannelWithBigIntJSONSerialization(\n channel: RpcSubscriptionsChannel,\n): RpcSubscriptionsChannel {\n return pipe(\n channel,\n c => transformChannelInboundMessages(c, parseJsonWithBigInts),\n c => transformChannelOutboundMessages(c, stringifyJsonWithBigInts),\n );\n}\n","import { createWebSocketChannel } from '@solana/rpc-subscriptions-channel-websocket';\nimport type { RpcSubscriptionsChannel } from '@solana/rpc-subscriptions-spec';\nimport type { ClusterUrl } from '@solana/rpc-types';\n\nimport { getRpcSubscriptionsChannelWithAutoping } from './rpc-subscriptions-autopinger';\nimport { getChannelPoolingChannelCreator } from './rpc-subscriptions-channel-pool';\nimport { RpcSubscriptionsChannelCreatorFromClusterUrl } from './rpc-subscriptions-clusters';\nimport { getRpcSubscriptionsChannelWithJSONSerialization } from './rpc-subscriptions-json';\nimport { getRpcSubscriptionsChannelWithBigIntJSONSerialization } from './rpc-subscriptions-json-bigint';\n\nexport type DefaultRpcSubscriptionsChannelConfig = Readonly<{\n /**\n * The number of milliseconds to wait since the last message sent or received over the channel\n * before sending a ping message to keep the channel open.\n */\n intervalMs?: number;\n /**\n * The number of subscribers that may share a channel before a new channel must be created.\n *\n * It is important that you set this to the maximum number of subscriptions that your RPC\n * provider recommends making over a single connection; the default is set deliberately low, so\n * as to comply with the restrictive limits of the public mainnet RPC node.\n *\n * @defaultValue 100\n */\n maxSubscriptionsPerChannel?: number;\n /** The number of channels to create before reusing a channel for a new subscription. */\n minChannels?: number;\n /**\n * The number of bytes of data to admit into the\n * [`WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) buffer before\n * buffering data on the client.\n */\n sendBufferHighWatermark?: number;\n /** The URL of the web socket server. Must use the `ws` or `wss` protocols. */\n url: TClusterUrl;\n}>;\n\n/**\n * Similar to {@link createDefaultRpcSubscriptionsChannelCreator} with some Solana-specific\n * defaults.\n *\n * For instance, it safely handles `BigInt` values in JSON messages since Solana RPC servers accept\n * and return integers larger than [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER).\n */\nexport function createDefaultSolanaRpcSubscriptionsChannelCreator(\n config: DefaultRpcSubscriptionsChannelConfig,\n): RpcSubscriptionsChannelCreatorFromClusterUrl {\n return createDefaultRpcSubscriptionsChannelCreatorImpl({\n ...config,\n jsonSerializer: getRpcSubscriptionsChannelWithBigIntJSONSerialization,\n });\n}\n\n/**\n * Creates a function that returns new subscription channels when called.\n */\nexport function createDefaultRpcSubscriptionsChannelCreator(\n config: DefaultRpcSubscriptionsChannelConfig,\n): RpcSubscriptionsChannelCreatorFromClusterUrl {\n return createDefaultRpcSubscriptionsChannelCreatorImpl({\n ...config,\n jsonSerializer: getRpcSubscriptionsChannelWithJSONSerialization,\n });\n}\n\nfunction createDefaultRpcSubscriptionsChannelCreatorImpl(\n config: DefaultRpcSubscriptionsChannelConfig & {\n jsonSerializer: (channel: RpcSubscriptionsChannel) => RpcSubscriptionsChannel;\n },\n): RpcSubscriptionsChannelCreatorFromClusterUrl {\n if (/^wss?:/i.test(config.url) === false) {\n const protocolMatch = config.url.match(/^([^:]+):/);\n throw new DOMException(\n protocolMatch\n ? \"Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or \" +\n `'wss'. '${protocolMatch[1]}:' is not allowed.`\n : `Failed to construct 'WebSocket': The URL '${config.url}' is invalid.`,\n );\n }\n const { intervalMs, ...rest } = config;\n const createDefaultRpcSubscriptionsChannel = (({ abortSignal }) => {\n return createWebSocketChannel({\n ...rest,\n sendBufferHighWatermark:\n config.sendBufferHighWatermark ??\n // Let 128KB of data into the WebSocket buffer before buffering it in the app.\n 131_072,\n signal: abortSignal,\n })\n .then(config.jsonSerializer)\n .then(channel =>\n getRpcSubscriptionsChannelWithAutoping({\n abortSignal,\n channel,\n intervalMs: intervalMs ?? 5_000,\n }),\n );\n }) as RpcSubscriptionsChannelCreatorFromClusterUrl;\n return getChannelPoolingChannelCreator(createDefaultRpcSubscriptionsChannel, {\n maxSubscriptionsPerChannel:\n config.maxSubscriptionsPerChannel ??\n /**\n * A note about this default. The idea here is that, because some RPC providers impose\n * an upper limit on the number of subscriptions you can make per channel, we must\n * choose a number low enough to avoid hitting that limit. Without knowing what provider\n * a given person is using, or what their limit is, we have to choose the lowest of all\n * known limits. As of this writing (October 2024) that is the public mainnet RPC node\n * (api.mainnet-beta.solana.com) at 100 subscriptions.\n */\n 100,\n minChannels: config.minChannels ?? 1,\n });\n}\n","import { AbortController } from '@solana/event-target-impl';\nimport fastStableStringify from '@solana/fast-stable-stringify';\nimport { RpcSubscriptionsTransport } from '@solana/rpc-subscriptions-spec';\nimport { DataPublisher } from '@solana/subscribable';\n\ntype CacheEntry = {\n readonly abortController: AbortController;\n readonly dataPublisherPromise: Promise;\n numSubscribers: number;\n};\n\n/**\n * Given a {@link RpcSubscriptionsTransport}, will return a new transport that coalesces identical\n * subscriptions into a single subscription request to the server. The determination of whether a\n * subscription is the same as another is based on the `rpcRequest` returned by its\n * {@link RpcSubscriptionsPlan}. The subscription will only be aborted once all subscribers abort,\n * or there is an error.\n */\nexport function getRpcSubscriptionsTransportWithSubscriptionCoalescing(\n transport: TTransport,\n): TTransport {\n const cache = new Map();\n return function rpcSubscriptionsTransportWithSubscriptionCoalescing(config) {\n const { request, signal } = config;\n const subscriptionConfigurationHash = fastStableStringify([request.methodName, request.params]);\n\n let cachedDataPublisherPromise = cache.get(subscriptionConfigurationHash);\n if (!cachedDataPublisherPromise) {\n const abortController = new AbortController();\n const dataPublisherPromise = transport({\n ...config,\n signal: abortController.signal,\n });\n dataPublisherPromise\n .then(dataPublisher => {\n dataPublisher.on(\n 'error',\n () => {\n cache.delete(subscriptionConfigurationHash);\n abortController.abort();\n },\n { signal: abortController.signal },\n );\n })\n .catch(() => {});\n cache.set(\n subscriptionConfigurationHash,\n (cachedDataPublisherPromise = {\n abortController,\n dataPublisherPromise,\n numSubscribers: 0,\n }),\n );\n }\n cachedDataPublisherPromise.numSubscribers++;\n signal.addEventListener(\n 'abort',\n () => {\n cachedDataPublisherPromise.numSubscribers--;\n if (cachedDataPublisherPromise.numSubscribers === 0) {\n queueMicrotask(() => {\n if (cachedDataPublisherPromise.numSubscribers === 0) {\n cache.delete(subscriptionConfigurationHash);\n cachedDataPublisherPromise.abortController.abort();\n }\n });\n }\n },\n { signal: cachedDataPublisherPromise.abortController.signal },\n );\n return cachedDataPublisherPromise.dataPublisherPromise;\n } as TTransport;\n}\n","import { pipe } from '@solana/functional';\nimport { RpcSubscriptionsChannelCreator, RpcSubscriptionsTransport } from '@solana/rpc-subscriptions-spec';\nimport { ClusterUrl } from '@solana/rpc-types';\n\nimport {\n RpcSubscriptionsChannelCreatorDevnet,\n RpcSubscriptionsChannelCreatorFromClusterUrl,\n RpcSubscriptionsChannelCreatorMainnet,\n RpcSubscriptionsChannelCreatorTestnet,\n RpcSubscriptionsTransportDevnet,\n RpcSubscriptionsTransportFromClusterUrl,\n RpcSubscriptionsTransportMainnet,\n RpcSubscriptionsTransportTestnet,\n} from './rpc-subscriptions-clusters';\nimport { getRpcSubscriptionsTransportWithSubscriptionCoalescing } from './rpc-subscriptions-coalescer';\n\nexport type DefaultRpcSubscriptionsTransportConfig = Readonly<{\n createChannel: RpcSubscriptionsChannelCreatorFromClusterUrl;\n}>;\n\n/**\n * Creates a {@link RpcSubscriptionsTransport} with some default behaviours.\n *\n * The default behaviours include:\n * - Logic that coalesces multiple subscriptions for the same notifications with the same arguments\n * into a single subscription.\n *\n * @param config\n */\nexport function createDefaultRpcSubscriptionsTransport({\n createChannel,\n}: DefaultRpcSubscriptionsTransportConfig) {\n return pipe(\n createRpcSubscriptionsTransportFromChannelCreator(\n createChannel,\n ) as RpcSubscriptionsTransport as RpcSubscriptionsTransportFromClusterUrl,\n transport => getRpcSubscriptionsTransportWithSubscriptionCoalescing(transport),\n );\n}\n\nexport function createRpcSubscriptionsTransportFromChannelCreator<\n TChannelCreator extends RpcSubscriptionsChannelCreator,\n TInboundMessage,\n TOutboundMessage,\n>(createChannel: TChannelCreator) {\n return (async ({ execute, signal }) => {\n const channel = await createChannel({ abortSignal: signal });\n return await execute({ channel, signal });\n }) as TChannelCreator extends RpcSubscriptionsChannelCreatorDevnet\n ? RpcSubscriptionsTransportDevnet\n : TChannelCreator extends RpcSubscriptionsChannelCreatorTestnet\n ? RpcSubscriptionsTransportTestnet\n : TChannelCreator extends RpcSubscriptionsChannelCreatorMainnet\n ? RpcSubscriptionsTransportMainnet\n : RpcSubscriptionsTransport;\n}\n","import type { SolanaRpcSubscriptionsApi, SolanaRpcSubscriptionsApiUnstable } from '@solana/rpc-subscriptions-api';\nimport { createSolanaRpcSubscriptionsApi } from '@solana/rpc-subscriptions-api';\nimport {\n createSubscriptionRpc,\n RpcSubscriptionsApiMethods,\n type RpcSubscriptionsTransport,\n} from '@solana/rpc-subscriptions-spec';\nimport { ClusterUrl } from '@solana/rpc-types';\n\nimport { DEFAULT_RPC_SUBSCRIPTIONS_CONFIG } from './rpc-default-config';\nimport {\n createDefaultSolanaRpcSubscriptionsChannelCreator,\n DefaultRpcSubscriptionsChannelConfig,\n} from './rpc-subscriptions-channel';\nimport type { RpcSubscriptionsFromTransport } from './rpc-subscriptions-clusters';\nimport { createDefaultRpcSubscriptionsTransport } from './rpc-subscriptions-transport';\n\ntype Config = DefaultRpcSubscriptionsChannelConfig;\n\nfunction createSolanaRpcSubscriptionsImpl(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n const transport = createDefaultRpcSubscriptionsTransport({\n createChannel: createDefaultSolanaRpcSubscriptionsChannelCreator({ ...config, url: clusterUrl }),\n });\n return createSolanaRpcSubscriptionsFromTransport(transport);\n}\n\n/**\n * Creates a {@link RpcSubscriptions} instance that exposes the Solana JSON RPC WebSocket API given\n * a cluster URL and some optional channel config. See\n * {@link createDefaultRpcSubscriptionsChannelCreator} for the shape of the channel config.\n */\nexport function createSolanaRpcSubscriptions(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n return createSolanaRpcSubscriptionsImpl(clusterUrl, config);\n}\n\n/**\n * Creates a {@link RpcSubscriptions} instance that exposes the Solana JSON RPC WebSocket API,\n * including its unstable methods, given a cluster URL and some optional channel config. See\n * {@link createDefaultRpcSubscriptionsChannelCreator} for the shape of the channel config.\n */\nexport function createSolanaRpcSubscriptions_UNSTABLE(\n clusterUrl: TClusterUrl,\n config?: Omit, 'url'>,\n) {\n return createSolanaRpcSubscriptionsImpl(\n clusterUrl,\n config,\n );\n}\n\n/**\n * Creates a {@link RpcSubscriptions} instance that exposes the Solana JSON RPC WebSocket API given\n * the supplied {@link RpcSubscriptionsTransport}.\n */\nexport function createSolanaRpcSubscriptionsFromTransport<\n TTransport extends RpcSubscriptionsTransport,\n TApi extends RpcSubscriptionsApiMethods = SolanaRpcSubscriptionsApi,\n>(transport: TTransport) {\n return createSubscriptionRpc({\n api: createSolanaRpcSubscriptionsApi(DEFAULT_RPC_SUBSCRIPTIONS_CONFIG),\n transport,\n }) as RpcSubscriptionsFromTransport;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, SolanaError } from '@solana/errors';\n\nimport { MessageSigner } from './message-signer';\nimport { TransactionSigner } from './transaction-signer';\n\n/**\n * Removes all duplicated {@link MessageSigner | MessageSigners} and\n * {@link TransactionSigner | TransactionSigners} from a provided array\n * by comparing their {@link Address | addresses}.\n *\n * @internal\n */\nexport function deduplicateSigners(\n signers: readonly TSigner[],\n): readonly TSigner[] {\n const deduplicated: Record = {};\n signers.forEach(signer => {\n if (!deduplicated[signer.address]) {\n deduplicated[signer.address] = signer;\n } else if (deduplicated[signer.address] !== signer) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, {\n address: signer.address,\n });\n }\n });\n return Object.values(deduplicated);\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction, TransactionWithinSizeLimit, TransactionWithLifetime } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link TransactionModifyingSigner#modifyAndSignTransactions | modifyAndSignTransactions} method.\n *\n * @see {@link BaseTransactionSignerConfig}\n */\nexport type TransactionModifyingSignerConfig = BaseTransactionSignerConfig;\n\n/**\n * A signer interface that potentially modifies the provided {@link Transaction | Transactions}\n * before signing them.\n *\n * For instance, this enables wallets to inject additional instructions into the\n * transaction before signing them. For each transaction, instead of returning a\n * {@link SignatureDictionary}, its\n * {@link TransactionModifyingSigner#modifyAndSignTransactions | modifyAndSignTransactions} function\n * returns an updated {@link Transaction} with a potentially modified set of instructions and\n * signature dictionary. The returned transaction must be within the transaction size limit,\n * and include a `lifetimeConstraint`.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: TransactionModifyingSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * modifyAndSignTransactions: async (\n * transactions: Transaction[]\n * ): Promise<(Transaction & TransactionWithinSizeLimit & TransactionWithLifetime)[]> => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Sequential**. Contrary to partial signers, these cannot be executed in\n * parallel as each call can modify the provided transactions.\n * - **First signers**. For a given transaction, a modifying signer must always\n * be used before a partial signer as the former will likely modify the\n * transaction and thus impact the outcome of the latter.\n * - **Potential conflicts**. If more than one modifying signer is provided,\n * the second signer may invalidate the signature of the first one. However,\n * modifying signers may decide not to modify a transaction based on the\n * existence of signatures for that transaction.\n *\n * @see {@link isTransactionModifyingSigner}\n * @see {@link assertIsTransactionModifyingSigner}\n */\nexport type TransactionModifyingSigner = Readonly<{\n address: Address;\n modifyAndSignTransactions(\n transactions: readonly (Transaction | (Transaction & TransactionWithLifetime))[],\n config?: TransactionModifyingSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link TransactionModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionModifyingSigner({ address, modifyAndSignTransactions: async () => {} }); // true\n * isTransactionModifyingSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionModifyingSigner}\n */\nexport function isTransactionModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionModifyingSigner {\n return 'modifyAndSignTransactions' in value && typeof value.modifyAndSignTransactions === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionModifyingSigner({ address, modifyAndSignTransactions: async () => {} }); // void\n * assertIsTransactionModifyingSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionModifyingSigner}\n */\nexport function assertIsTransactionModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionModifyingSigner {\n if (!isTransactionModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction, TransactionWithinSizeLimit, TransactionWithLifetime } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig, SignatureDictionary } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link TransactionPartialSigner#signTransactions | signTransactions} method.\n *\n * @see {@link BaseTransactionSignerConfig}\n */\nexport type TransactionPartialSignerConfig = BaseTransactionSignerConfig;\n\n/**\n * A signer interface that signs an array of {@link Transaction | Transactions}\n * without modifying their content. It defines a\n * {@link TransactionPartialSigner#signTransactions | signTransactions}\n * function that returns a {@link SignatureDictionary} for each provided transaction.\n *\n * Such signature dictionaries are expected to be merged with the existing ones if any.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: TransactionPartialSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * signTransactions: async (\n * transactions: Transaction[]\n * ): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Parallel**. It returns a signature dictionary for each provided\n * transaction without modifying them, making it possible for multiple\n * partial signers to sign the same transaction in parallel.\n * - **Flexible order**. The order in which we use these signers for\n * a given transaction doesn’t matter.\n *\n * @see {@link isTransactionPartialSigner}\n * @see {@link assertIsTransactionPartialSigner}\n */\nexport type TransactionPartialSigner = Readonly<{\n address: Address;\n signTransactions(\n transactions: readonly (Transaction & TransactionWithinSizeLimit & TransactionWithLifetime)[],\n config?: TransactionPartialSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link TransactionPartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionPartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionPartialSigner({ address, signTransactions: async () => {} }); // true\n * isTransactionPartialSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionPartialSigner}\n */\nexport function isTransactionPartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionPartialSigner {\n return 'signTransactions' in value && typeof value.signTransactions === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionPartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionPartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionPartialSigner({ address, signTransactions: async () => {} }); // void\n * assertIsTransactionPartialSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionPartialSigner}\n */\nexport function assertIsTransactionPartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionPartialSigner {\n if (!isTransactionPartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { Transaction, TransactionWithLifetime } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link TransactionSendingSignerConfig#signAndSendTransactions | signAndSendTransactions} method.\n *\n * @see {@link BaseTransactionSignerConfig}\n */\nexport type TransactionSendingSignerConfig = BaseTransactionSignerConfig;\n\n/**\n * A signer interface that signs one or multiple transactions\n * before sending them immediately to the blockchain.\n *\n * It defines a {@link TransactionSendingSignerConfig#signAndSendTransactions | signAndSendTransactions}\n * function that returns the transaction signature (i.e. its identifier) for each provided\n * {@link Transaction}.\n *\n * This interface is required for PDA wallets and other types of wallets that don't provide an\n * interface for signing transactions without sending them.\n *\n * Note that it is also possible for such signers to modify the provided transactions\n * before signing and sending them. This enables use cases where the modified transactions\n * cannot be shared with the app and thus must be sent directly.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const myTransactionSendingSigner: TransactionSendingSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * signAndSendTransactions: async (transactions: Transaction[]): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Single signer**. Since this signer also sends the provided transactions,\n * we can only use a single {@link TransactionSendingSigner} for a given set of transactions.\n * - **Last signer**. Trivially, that signer must also be the last one used.\n * - **Potential conflicts**. Since signers may decide to modify the given\n * transactions before sending them, they may invalidate previous signatures.\n * However, signers may decide not to modify a transaction based\n * on the existence of signatures for that transaction.\n * - **Potential confirmation**. Whilst this is not required by this interface,\n * it is also worth noting that most wallets will also wait for the transaction\n * to be confirmed (typically with a `confirmed` commitment)\n * before notifying the app that they are done.\n *\n * @see {@link isTransactionSendingSigner}\n * @see {@link assertIsTransactionSendingSigner}\n */\nexport type TransactionSendingSigner = Readonly<{\n address: Address;\n signAndSendTransactions(\n transactions: readonly (Transaction | (Transaction & TransactionWithLifetime))[],\n config?: TransactionSendingSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link TransactionSendingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionSendingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionSendingSigner({ address, signAndSendTransactions: async () => {} }); // true\n * isTransactionSendingSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionSendingSigner}\n */\nexport function isTransactionSendingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionSendingSigner {\n return 'signAndSendTransactions' in value && typeof value.signAndSendTransactions === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionSendingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionSendingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionSendingSigner({ address, signAndSendTransactions: async () => {} }); // void\n * assertIsTransactionSendingSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionSendingSigner}\n */\nexport function assertIsTransactionSendingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionSendingSigner {\n if (!isTransactionSendingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isTransactionModifyingSigner, TransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner, TransactionSendingSigner } from './transaction-sending-signer';\n\n/**\n * Defines a signer capable of signing transactions.\n *\n * @see {@link TransactionModifyingSigner} For signers that can modify transactions before signing them.\n * @see {@link TransactionPartialSigner} For signers that can be used in parallel.\n * @see {@link TransactionSendingSigner} For signers that send transactions after signing them.\n * @see {@link isTransactionSigner}\n * @see {@link assertIsTransactionSigner}\n */\nexport type TransactionSigner =\n | TransactionModifyingSigner\n | TransactionPartialSigner\n | TransactionSendingSigner;\n\n/**\n * Checks whether the provided value implements the {@link TransactionSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isTransactionSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isTransactionSigner({ address, signTransactions: async () => {} }); // true\n * isTransactionSigner({ address, modifyAndSignTransactions: async () => {} }); // true\n * isTransactionSigner({ address, signAndSendTransactions: async () => {} }); // true\n * isTransactionSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsTransactionSigner}\n */\nexport function isTransactionSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is TransactionSigner {\n return (\n isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value)\n );\n}\n\n/**\n * Asserts that the provided value implements the {@link TransactionSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsTransactionSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsTransactionSigner({ address, signTransactions: async () => {} }); // void\n * assertIsTransactionSigner({ address, modifyAndSignTransactions: async () => {} }); // void\n * assertIsTransactionSigner({ address, signAndSendTransactions: async () => {} }); // void\n * assertIsTransactionSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isTransactionSigner}\n */\nexport function assertIsTransactionSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is TransactionSigner {\n if (!isTransactionSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { AccountLookupMeta, AccountMeta, AccountRole, Instruction } from '@solana/instructions';\nimport {\n BaseTransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionVersion,\n} from '@solana/transaction-messages';\n\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { TransactionMessageWithFeePayerSigner } from './fee-payer-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\n\n/**\n * An extension of the {@link AccountMeta} type that allows us to store {@link TransactionSigner | TransactionSigners} inside it.\n *\n * Note that, because this type represents a signer, it must use one the following two roles:\n * - {@link AccountRole.READONLY_SIGNER}\n * - {@link AccountRole.WRITABLE_SIGNER}\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for the {@link TransactionSigner} to use within the account meta.\n *\n * @interface\n *\n * @example\n * ```ts\n * import { AccountRole } from '@solana/instructions';\n * import { generateKeyPairSigner, AccountSignerMeta } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * const account: AccountSignerMeta = {\n * address: signer.address,\n * role: AccountRole.READONLY_SIGNER,\n * signer,\n * };\n * ```\n */\nexport interface AccountSignerMeta<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n> extends AccountMeta {\n readonly role: AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER;\n readonly signer: TSigner;\n}\n\n/**\n * A union type that supports base account metas as well as {@link AccountSignerMeta | signer account metas}.\n */\ntype AccountMetaWithSigner =\n | AccountLookupMeta\n | AccountMeta\n | AccountSignerMeta;\n\n/**\n * Composable type that allows {@link AccountSignerMeta | AccountSignerMetas} to be used inside the instruction's `accounts` array\n *\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n * @typeParam TAccounts - Optionally provide a narrower type for the account metas.\n *\n * @interface\n *\n * @example\n * ```ts\n * import { AccountRole, Instruction } from '@solana/instructions';\n * import { generateKeyPairSigner, InstructionWithSigners } from '@solana/signers';\n *\n * const [authority, buffer] = await Promise.all([\n * generateKeyPairSigner(),\n * generateKeyPairSigner(),\n * ]);\n * const instruction: Instruction & InstructionWithSigners = {\n * programAddress: address('1234..5678'),\n * accounts: [\n * // The authority is a signer account.\n * {\n * address: authority.address,\n * role: AccountRole.READONLY_SIGNER,\n * signer: authority,\n * },\n * // The buffer is a writable account.\n * { address: buffer.address, role: AccountRole.WRITABLE },\n * ],\n * };\n * ```\n */\nexport type InstructionWithSigners<\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly AccountMetaWithSigner[] = readonly AccountMetaWithSigner[],\n> = Pick, 'accounts'>;\n\n/**\n * A {@link BaseTransactionMessage} type extension that accept {@link TransactionSigner | TransactionSigners}.\n *\n * Namely, it allows:\n * - a {@link TransactionSigner} to be used as the fee payer and\n * - {@link InstructionWithSigners} to be used in its instructions.\n *\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n * @typeParam TAccounts - Optionally provide a narrower type for the account metas.\n *\n * @example\n * ```ts\n * import { Instruction } from '@solana/instructions';\n * import { BaseTransactionMessage } from '@solana/transaction-messages';\n * import { generateKeyPairSigner, InstructionWithSigners, TransactionMessageWithSigners } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * const firstInstruction: Instruction = { ... };\n * const secondInstruction: InstructionWithSigners = { ... };\n * const transactionMessage: BaseTransactionMessage & TransactionMessageWithSigners = {\n * feePayer: signer,\n * instructions: [firstInstruction, secondInstruction],\n * }\n * ```\n */\nexport type TransactionMessageWithSigners<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly AccountMetaWithSigner[] = readonly AccountMetaWithSigner[],\n> = Partial | TransactionMessageWithFeePayerSigner> &\n Pick<\n BaseTransactionMessage>,\n 'instructions'\n >;\n\n/**\n * Extracts and deduplicates all {@link TransactionSigner | TransactionSigners} stored\n * inside the account metas of an {@link InstructionWithSigners | instruction}.\n *\n * Any extracted signers that share the same {@link Address} will be de-duplicated.\n *\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n *\n * @example\n * ```ts\n * import { InstructionWithSigners, getSignersFromInstruction } from '@solana/signers';\n *\n * const signerA = { address: address('1111..1111'), signTransactions: async () => {} };\n * const signerB = { address: address('2222..2222'), signTransactions: async () => {} };\n * const instructionWithSigners: InstructionWithSigners = {\n * accounts: [\n * { address: signerA.address, signer: signerA, ... },\n * { address: signerB.address, signer: signerB, ... },\n * { address: signerA.address, signer: signerA, ... },\n * ],\n * };\n *\n * const instructionSigners = getSignersFromInstruction(instructionWithSigners);\n * // ^ [signerA, signerB]\n * ```\n */\nexport function getSignersFromInstruction(\n instruction: InstructionWithSigners,\n): readonly TSigner[] {\n return deduplicateSigners(\n (instruction.accounts ?? []).flatMap(account => ('signer' in account ? account.signer : [])),\n );\n}\n\n/**\n * Extracts and deduplicates all {@link TransactionSigner | TransactionSigners} stored\n * inside a given {@link TransactionMessageWithSigners | transaction message}.\n *\n * This includes any {@link TransactionSigner | TransactionSigners} stored\n * as the fee payer or in the instructions of the transaction message.\n *\n * Any extracted signers that share the same {@link Address} will be de-duplicated.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for {@link TransactionSigner | TransactionSigners}.\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import { Instruction } from '@solana/instructions';\n * import { InstructionWithSigners, TransactionMessageWithSigners, getSignersFromTransactionMessage } from '@solana/signers';\n *\n * const signerA = { address: address('1111..1111'), signTransactions: async () => {} };\n * const signerB = { address: address('2222..2222'), signTransactions: async () => {} };\n * const firstInstruction: Instruction & InstructionWithSigners = {\n * programAddress: address('1234..5678'),\n * accounts: [{ address: signerA.address, signer: signerA, ... }],\n * };\n * const secondInstruction: Instruction & InstructionWithSigners = {\n * programAddress: address('1234..5678'),\n * accounts: [{ address: signerB.address, signer: signerB, ... }],\n * };\n * const transactionMessage: TransactionMessageWithSigners = {\n * feePayer: signerA,\n * instructions: [firstInstruction, secondInstruction],\n * }\n *\n * const transactionSigners = getSignersFromTransactionMessage(transactionMessage);\n * // ^ [signerA, signerB]\n * ```\n */\nexport function getSignersFromTransactionMessage<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n TTransactionMessage extends TransactionMessageWithSigners = TransactionMessageWithSigners<\n TAddress,\n TSigner\n >,\n>(transaction: TTransactionMessage): readonly TSigner[] {\n return deduplicateSigners([\n ...(transaction.feePayer && isTransactionSigner(transaction.feePayer) ? [transaction.feePayer as TSigner] : []),\n ...transaction.instructions.flatMap(getSignersFromInstruction),\n ]);\n}\n","import { Address } from '@solana/addresses';\nimport { Instruction, isSignerRole } from '@solana/instructions';\nimport { BaseTransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\nimport { AccountSignerMeta, InstructionWithSigners, TransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\n\n/**\n * Attaches the provided {@link TransactionSigner | TransactionSigners} to the\n * account metas of an instruction when applicable.\n *\n * For an account meta to match a provided signer it:\n * - Must have a signer role ({@link AccountRole.READONLY_SIGNER} or {@link AccountRole.WRITABLE_SIGNER}).\n * - Must have the same address as the provided signer.\n * - Must not have an attached signer already.\n *\n * @typeParam TInstruction - The inferred type of the instruction provided.\n *\n * @example\n * ```ts\n * import { AccountRole, Instruction } from '@solana/instructions';\n * import { addSignersToInstruction, TransactionSigner } from '@solana/signers';\n *\n * const instruction: Instruction = {\n * accounts: [\n * { address: '1111' as Address, role: AccountRole.READONLY_SIGNER },\n * { address: '2222' as Address, role: AccountRole.WRITABLE_SIGNER },\n * ],\n * // ...\n * };\n *\n * const signerA: TransactionSigner<'1111'>;\n * const signerB: TransactionSigner<'2222'>;\n * const instructionWithSigners = addSignersToInstruction(\n * [signerA, signerB],\n * instruction\n * );\n *\n * // instructionWithSigners.accounts[0].signer === signerA\n * // instructionWithSigners.accounts[1].signer === signerB\n * ```\n */\nexport function addSignersToInstruction(\n signers: TransactionSigner[],\n instruction: TInstruction | (InstructionWithSigners & TInstruction),\n): InstructionWithSigners & TInstruction {\n if (!instruction.accounts || instruction.accounts.length === 0) {\n return instruction as InstructionWithSigners & TInstruction;\n }\n\n const signerByAddress = new Map(deduplicateSigners(signers).map(signer => [signer.address, signer]));\n return Object.freeze({\n ...instruction,\n accounts: instruction.accounts.map(account => {\n const signer = signerByAddress.get(account.address);\n if (!isSignerRole(account.role) || 'signer' in account || !signer) {\n return account;\n }\n return Object.freeze({ ...account, signer } as AccountSignerMeta);\n }),\n });\n}\n\n/**\n * Attaches the provided {@link TransactionSigner | TransactionSigners} to the\n * account metas of all instructions inside a transaction message and/or\n * the transaction message fee payer, when applicable.\n *\n * For an account meta to match a provided signer it:\n * - Must have a signer role ({@link AccountRole.READONLY_SIGNER} or {@link AccountRole.WRITABLE_SIGNER}).\n * - Must have the same address as the provided signer.\n * - Must not have an attached signer already.\n *\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import { AccountRole, Instruction } from '@solana/instructions';\n * import { BaseTransactionMessage } from '@solana/transaction-messages';\n * import { addSignersToTransactionMessage, TransactionSigner } from '@solana/signers';\n *\n * const instructionA: Instruction = {\n * accounts: [{ address: '1111' as Address, role: AccountRole.READONLY_SIGNER }],\n * // ...\n * };\n * const instructionB: Instruction = {\n * accounts: [{ address: '2222' as Address, role: AccountRole.WRITABLE_SIGNER }],\n * // ...\n * };\n * const transactionMessage: BaseTransactionMessage = {\n * instructions: [instructionA, instructionB],\n * // ...\n * }\n *\n * const signerA: TransactionSigner<'1111'>;\n * const signerB: TransactionSigner<'2222'>;\n * const transactionMessageWithSigners = addSignersToTransactionMessage(\n * [signerA, signerB],\n * transactionMessage\n * );\n *\n * // transactionMessageWithSigners.instructions[0].accounts[0].signer === signerA\n * // transactionMessageWithSigners.instructions[1].accounts[0].signer === signerB\n * ```\n */\nexport function addSignersToTransactionMessage(\n signers: TransactionSigner[],\n transactionMessage: TTransactionMessage | (TransactionMessageWithSigners & TTransactionMessage),\n): TransactionMessageWithSigners & TTransactionMessage {\n const feePayerSigner = hasAddressOnlyFeePayer(transactionMessage)\n ? signers.find(signer => signer.address === transactionMessage.feePayer.address)\n : undefined;\n\n if (!feePayerSigner && transactionMessage.instructions.length === 0) {\n return transactionMessage as TransactionMessageWithSigners & TTransactionMessage;\n }\n\n return Object.freeze({\n ...transactionMessage,\n ...(feePayerSigner ? { feePayer: feePayerSigner } : null),\n instructions: transactionMessage.instructions.map(instruction => addSignersToInstruction(signers, instruction)),\n });\n}\n\nfunction hasAddressOnlyFeePayer(\n message: BaseTransactionMessage & Partial,\n): message is BaseTransactionMessage & { feePayer: { address: Address } } {\n return (\n !!message &&\n 'feePayer' in message &&\n !!message.feePayer &&\n typeof message.feePayer.address === 'string' &&\n !isTransactionSigner(message.feePayer)\n );\n}\n","import { TransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\nimport { TransactionSigner } from './transaction-signer';\n\n/**\n * Alternative to {@link TransactionMessageWithFeePayer} that uses a {@link TransactionSigner} for the fee payer.\n *\n * @typeParam TAddress - Supply a string literal to define a fee payer having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for the {@link TransactionSigner}.\n *\n * @example\n * ```ts\n * import { TransactionMessage } from '@solana/transaction-messages';\n * import { generateKeyPairSigner, TransactionMessageWithFeePayerSigner } from '@solana/signers';\n *\n * const transactionMessage: TransactionMessage & TransactionMessageWithFeePayerSigner = {\n * feePayer: await generateKeyPairSigner(),\n * instructions: [],\n * version: 0,\n * };\n * ```\n */\nexport interface TransactionMessageWithFeePayerSigner<\n TAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n> {\n readonly feePayer: TSigner;\n}\n\n/**\n * A helper type to exclude the fee payer from a transaction message.\n */\ntype ExcludeTransactionMessageFeePayer =\n TTransactionMessage extends unknown ? Omit : never;\n\n/**\n * Sets the fee payer of a {@link TransactionMessage | transaction message}\n * using a {@link TransactionSigner}.\n *\n * @typeParam TFeePayerAddress - Supply a string literal to define a fee payer having a particular address.\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import { pipe } from '@solana/functional';\n * import { generateKeyPairSigner, setTransactionMessageFeePayerSigner } from '@solana/signers';\n * import { createTransactionMessage } from '@solana/transaction-messages';\n *\n * const feePayer = await generateKeyPairSigner();\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 0 }),\n * message => setTransactionMessageFeePayerSigner(signer, message),\n * );\n * ```\n */\nexport function setTransactionMessageFeePayerSigner<\n TFeePayerAddress extends string,\n TTransactionMessage extends Partial &\n TransactionMessage,\n>(\n feePayer: TransactionSigner,\n transactionMessage: TTransactionMessage,\n): ExcludeTransactionMessageFeePayer & TransactionMessageWithFeePayerSigner {\n Object.freeze(feePayer);\n const out = { ...transactionMessage, feePayer };\n Object.freeze(out);\n return out as ExcludeTransactionMessageFeePayer &\n TransactionMessageWithFeePayerSigner;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig, SignatureDictionary } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link MessagePartialSigner#signMessages | signMessages} method.\n *\n * @see {@link BaseSignerConfig}\n */\nexport type MessagePartialSignerConfig = BaseSignerConfig;\n\n/**\n * A signer interface that signs an array of {@link SignableMessage | SignableMessages}\n * without modifying their content.\n *\n * It defines a {@link MessagePartialSigner#signMessages | signMessages} function\n * that returns a {@link SignatureDictionary} for each provided message.\n * Such signature dictionaries are expected to be merged with the existing ones if any.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: MessagePartialSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * signMessages: async (\n * messages: SignableMessage[]\n * ): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Parallel**. When multiple signers sign the same message, we can\n * perform this operation in parallel to obtain all their signatures.\n * - **Flexible order**. The order in which we use these signers\n * for a given message doesn’t matter.\n *\n * @see {@link SignableMessage}\n * @see {@link createSignableMessage}\n * @see {@link isMessagePartialSigner}\n * @see {@link assertIsMessagePartialSigner}\n */\nexport type MessagePartialSigner = Readonly<{\n address: Address;\n signMessages(\n messages: readonly SignableMessage[],\n config?: MessagePartialSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link MessagePartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isMessagePartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isMessagePartialSigner({ address, signMessages: async () => {} }); // true\n * isMessagePartialSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsMessagePartialSigner}\n */\nexport function isMessagePartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is MessagePartialSigner {\n return 'signMessages' in value && typeof value.signMessages === 'function';\n}\n\n/**\n * Asserts that the provided value implements the {@link MessagePartialSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsMessagePartialSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsMessagePartialSigner({ address, signMessages: async () => {} }); // void\n * assertIsMessagePartialSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isMessagePartialSigner}\n */\nexport function assertIsMessagePartialSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is MessagePartialSigner {\n if (!isMessagePartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SolanaError } from '@solana/errors';\nimport { createKeyPairFromBytes, createKeyPairFromPrivateKeyBytes, generateKeyPair, signBytes } from '@solana/keys';\nimport { partiallySignTransaction } from '@solana/transactions';\n\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\n\n/**\n * Defines a signer that uses a {@link CryptoKeyPair} to sign messages and transactions.\n *\n * It implements both the {@link MessagePartialSigner} and {@link TransactionPartialSigner}\n * interfaces and keeps track of the {@link CryptoKeyPair} instance used\n * to sign messages and transactions.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner } from '@solana/signers';\n *\n * const signer = generateKeyPairSigner();\n * signer.address; // Address;\n * signer.keyPair; // CryptoKeyPair;\n * const [messageSignatures] = await signer.signMessages([message]);\n * const [transactionSignatures] = await signer.signTransactions([transaction]);\n * ```\n *\n * @see {@link generateKeyPairSigner}\n * @see {@link createSignerFromKeyPair}\n * @see {@link createKeyPairSignerFromBytes}\n * @see {@link createKeyPairSignerFromPrivateKeyBytes}\n * @see {@link isKeyPairSigner}\n * @see {@link assertIsKeyPairSigner}\n */\nexport type KeyPairSigner = MessagePartialSigner &\n TransactionPartialSigner & { keyPair: CryptoKeyPair };\n\n/**\n * Checks whether the provided value implements the {@link KeyPairSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner, isKeyPairSigner } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * isKeyPairSigner(signer); // true\n * isKeyPairSigner({ address: address('1234..5678') }); // false\n * ```\n */\nexport function isKeyPairSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is KeyPairSigner {\n return (\n 'keyPair' in value &&\n typeof value.keyPair === 'object' &&\n isMessagePartialSigner(value) &&\n isTransactionPartialSigner(value)\n );\n}\n\n/**\n * Asserts that the provided value implements the {@link KeyPairSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner, assertIsKeyPairSigner } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * assertIsKeyPairSigner(signer); // void\n * assertIsKeyPairSigner({ address: address('1234..5678') }); // Throws an error.\n * ```\n */\nexport function assertIsKeyPairSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is KeyPairSigner {\n if (!isKeyPairSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, {\n address: value.address,\n });\n }\n}\n\n/**\n * Creates a {@link KeyPairSigner} from a provided {@link CryptoKeyPair}.\n *\n * The {@link MessagePartialSigner#signMessages | signMessages} and\n * {@link TransactionPartialSigner#signTransactions | signTransactions}\n * functions of the returned signer will use the private key of the provided\n * key pair to sign messages and transactions.\n *\n * Note that both the {@link MessagePartialSigner#signMessages | signMessages} and\n * {@link TransactionPartialSigner#signTransactions | signTransactions} implementations\n * are parallelized, meaning that they will sign all provided messages and transactions in parallel.\n *\n * @example\n * ```ts\n * import { generateKeyPair } from '@solana/keys';\n * import { createSignerFromKeyPair, KeyPairSigner } from '@solana/signers';\n *\n * const keyPair: CryptoKeyPair = await generateKeyPair();\n * const signer: KeyPairSigner = await createSignerFromKeyPair(keyPair);\n * ```\n */\nexport async function createSignerFromKeyPair(keyPair: CryptoKeyPair): Promise {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n const out: KeyPairSigner = {\n address,\n keyPair,\n signMessages: messages =>\n Promise.all(\n messages.map(async message =>\n Object.freeze({ [address]: await signBytes(keyPair.privateKey, message.content) }),\n ),\n ),\n signTransactions: transactions =>\n Promise.all(\n transactions.map(async transaction => {\n const signedTransaction = await partiallySignTransaction([keyPair], transaction);\n // we know that the address has signed `signedTransaction` because it comes from the keypair\n return Object.freeze({ [address]: signedTransaction.signatures[address]! });\n }),\n ),\n };\n\n return Object.freeze(out);\n}\n\n/**\n * Generates a signer capable of signing messages and transactions by generating\n * a {@link CryptoKeyPair} and creating a {@link KeyPairSigner} from it.\n *\n * @example\n * ```ts\n * import { generateKeyPairSigner } from '@solana/signers';\n *\n * const signer = await generateKeyPairSigner();\n * ```\n *\n * @see {@link createSignerFromKeyPair}\n */\nexport async function generateKeyPairSigner(): Promise {\n return await createSignerFromKeyPair(await generateKeyPair());\n}\n\n/**\n * Creates a new {@link KeyPairSigner} from a 64-bytes `Uint8Array` secret key (private key and public key).\n *\n * @example\n * ```ts\n * import fs from 'fs';\n * import { createKeyPairSignerFromBytes } from '@solana/signers';\n *\n * // Get bytes from local keypair file.\n * const keypairFile = fs.readFileSync('~/.config/solana/id.json');\n * const keypairBytes = new Uint8Array(JSON.parse(keypairFile.toString()));\n *\n * // Create a KeyPairSigner from the bytes.\n * const signer = await createKeyPairSignerFromBytes(keypairBytes);\n * ```\n *\n * @see {@link createKeyPairSignerFromPrivateKeyBytes} if you only have the 32-bytes private key instead.\n */\nexport async function createKeyPairSignerFromBytes(\n bytes: ReadonlyUint8Array,\n extractable?: boolean,\n): Promise {\n return await createSignerFromKeyPair(await createKeyPairFromBytes(bytes, extractable));\n}\n\n/**\n * Creates a new {@link KeyPairSigner} from a 32-bytes `Uint8Array` private key.\n *\n * @example\n * ```ts\n * import { getUtf8Encoder } from '@solana/codecs-strings';\n * import { createKeyPairSignerFromPrivateKeyBytes } from '@solana/signers';\n *\n * const message = getUtf8Encoder().encode('Hello, World!');\n * const seed = new Uint8Array(await crypto.subtle.digest('SHA-256', message));\n *\n * const derivedSigner = await createKeyPairSignerFromPrivateKeyBytes(seed);\n * ```\n *\n * @see {@link createKeyPairSignerFromBytes} if you have the 64-bytes secret key instead (private key and public key).\n */\nexport async function createKeyPairSignerFromPrivateKeyBytes(\n bytes: ReadonlyUint8Array,\n extractable?: boolean,\n): Promise {\n return await createSignerFromKeyPair(await createKeyPairFromPrivateKeyBytes(bytes, extractable));\n}\n","import { Address, isAddress } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig } from './types';\n\n/**\n * The configuration to optionally provide when calling the\n * {@link MessageModifyingSigner#modifyAndSignMessages | modifyAndSignMessages} method.\n *\n * @see {@link BaseSignerConfig}\n */\nexport type MessageModifyingSignerConfig = BaseSignerConfig;\n\n/**\n * A signer interface that _potentially_ modifies the content\n * of the provided {@link SignableMessage | SignableMessages} before signing them.\n *\n * For instance, this enables wallets to prefix or suffix nonces to the messages they sign.\n * For each message, instead of returning a {@link SignatureDictionary}, the\n * {@link MessageModifyingSigner#modifyAndSignMessages | modifyAndSignMessages} function\n * returns an updated {@link SignableMessage} with a potentially modified content and signature dictionary.\n *\n * @typeParam TAddress - Supply a string literal to define a signer having a particular address.\n *\n * @example\n * ```ts\n * const signer: MessageModifyingSigner<'1234..5678'> = {\n * address: address('1234..5678'),\n * modifyAndSignMessages: async (\n * messages: SignableMessage[]\n * ): Promise => {\n * // My custom signing logic.\n * },\n * };\n * ```\n *\n * @remarks\n * Here are the main characteristics of this signer interface:\n *\n * - **Sequential**. Contrary to partial signers, these cannot be executed in\n * parallel as each call can modify the content of the message.\n * - **First signers**. For a given message, a modifying signer must always be used\n * before a partial signer as the former will likely modify the message and\n * thus impact the outcome of the latter.\n * - **Potential conflicts**. If more than one modifying signer is provided, the second\n * signer may invalidate the signature of the first one. However, modifying signers\n * may decide not to modify a message based on the existence of signatures for that message.\n *\n * @see {@link SignableMessage}\n * @see {@link createSignableMessage}\n * @see {@link isMessageModifyingSigner}\n * @see {@link assertIsMessageModifyingSigner}\n */\nexport type MessageModifyingSigner = Readonly<{\n address: Address;\n modifyAndSignMessages(\n messages: readonly SignableMessage[],\n config?: MessageModifyingSignerConfig,\n ): Promise;\n}>;\n\n/**\n * Checks whether the provided value implements the {@link MessageModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isMessageModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isMessageModifyingSigner({ address, modifyAndSignMessages: async () => {} }); // true\n * isMessageModifyingSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsMessageModifyingSigner}\n */\nexport function isMessageModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is MessageModifyingSigner {\n return (\n isAddress(value.address) &&\n 'modifyAndSignMessages' in value &&\n typeof value.modifyAndSignMessages === 'function'\n );\n}\n\n/**\n * Asserts that the provided value implements the {@link MessageModifyingSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsMessageModifyingSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsMessageModifyingSigner({ address, modifyAndSignMessages: async () => {} }); // void\n * assertIsMessageModifyingSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isMessageModifyingSigner}\n */\nexport function assertIsMessageModifyingSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is MessageModifyingSigner {\n if (!isMessageModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isMessageModifyingSigner, MessageModifyingSigner } from './message-modifying-signer';\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\n\n/**\n * Defines a signer capable of signing messages.\n *\n * @see {@link MessageModifyingSigner} For signers that can modify messages before signing them.\n * @see {@link MessagePartialSigner} For signers that can be used in parallel.\n * @see {@link isMessageSigner}\n * @see {@link assertIsMessageSigner}\n */\nexport type MessageSigner =\n | MessageModifyingSigner\n | MessagePartialSigner;\n\n/**\n * Checks whether the provided value implements the {@link MessageSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { isMessageSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * isMessageSigner({ address, signMessages: async () => {} }); // true\n * isMessageSigner({ address, modifyAndSignMessages: async () => {} }); // true\n * isMessageSigner({ address }); // false\n * ```\n *\n * @see {@link assertIsMessageSigner}\n */\nexport function isMessageSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): value is MessageSigner {\n return isMessagePartialSigner(value) || isMessageModifyingSigner(value);\n}\n\n/**\n * Asserts that the provided value implements the {@link MessageSigner} interface.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { Address } from '@solana/addresses';\n * import { assertIsMessageSigner } from '@solana/signers';\n *\n * const address = '1234..5678' as Address<'1234..5678'>;\n * assertIsMessageSigner({ address, signMessages: async () => {} }); // void\n * assertIsMessageSigner({ address, modifyAndSignMessages: async () => {} }); // void\n * assertIsMessageSigner({ address }); // Throws an error.\n * ```\n *\n * @see {@link isMessageSigner}\n */\nexport function assertIsMessageSigner(value: {\n [key: string]: unknown;\n address: Address;\n}): asserts value is MessageSigner {\n if (!isMessageSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\n\nimport { MessagePartialSigner } from './message-partial-signer';\nimport { TransactionPartialSigner } from './transaction-partial-signer';\n\n/**\n * Defines a Noop (No-Operation) signer that pretends to partially sign messages and transactions.\n *\n * For a given {@link Address}, a Noop Signer can be created to offer an implementation of both\n * the {@link MessagePartialSigner} and {@link TransactionPartialSigner} interfaces such that\n * they do not sign anything. Namely, signing a transaction or a message with a `NoopSigner`\n * will return an empty `SignatureDictionary`.\n *\n * @typeParam TAddress - Supply a string literal to define a Noop signer having a particular address.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { createNoopSigner } from '@solana/signers';\n *\n * const signer = createNoopSigner(address('1234..5678'));\n * const [messageSignatures] = await signer.signMessages([message]);\n * const [transactionSignatures] = await signer.signTransactions([transaction]);\n * // ^ Both messageSignatures and transactionSignatures are empty.\n * ```\n *\n * @remarks\n * This signer may be useful:\n *\n * - For testing purposes.\n * - For indicating that a given account is a signer and taking the responsibility to provide\n * the signature for that account ourselves. For instance, if we need to send the transaction\n * to a server that will sign it and send it for us.\n *\n * @see {@link createNoopSigner}\n */\nexport type NoopSigner = MessagePartialSigner &\n TransactionPartialSigner;\n\n/**\n * Creates a {@link NoopSigner} from the provided {@link Address}.\n *\n * @typeParam TAddress - The inferred type of the address provided.\n *\n * @example\n * ```ts\n * import { address } from '@solana/addresses';\n * import { createNoopSigner } from '@solana/signers';\n *\n * const signer = createNoopSigner(address('1234..5678'));\n * ```\n */\nexport function createNoopSigner(address: Address): NoopSigner {\n const out: NoopSigner = {\n address,\n signMessages: messages => Promise.resolve(messages.map(() => Object.freeze({}))),\n signTransactions: transactions => Promise.resolve(transactions.map(() => Object.freeze({}))),\n };\n\n return Object.freeze(out);\n}\n","import { OffchainMessageWithRequiredSignatories } from '@solana/offchain-messages';\n\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { isMessageSigner, MessageSigner } from './message-signer';\n\n/**\n * Represents a {@link Signer} that is required to sign an offchain message for it to be valid.\n */\nexport type OffchainMessageSignatorySigner = MessageSigner;\n\n/**\n * Extracts and deduplicates all {@link MessageSigner | MessageSigners} stored inside a given\n * {@link OffchainMessageWithSigners | offchain message}.\n *\n * Any extracted signers that share the same {@link Address} will be de-duplicated.\n *\n * @typeParam TAddress - Supply a string literal to define an account having a particular address.\n * @typeParam TSigner - Optionally provide a narrower type for {@link MessageSigner | MessageSigners}.\n * @typeParam TOffchainMessage - The inferred type of the offchain message provided.\n *\n * @example\n * ```ts\n * import { OffchainMessageWithSigners, getSignersFromOffchainMessage } from '@solana/signers';\n *\n * const signerA = { address: address('1111..1111'), signMessages: async () => {} };\n * const signerB = { address: address('2222..2222'), modifyAndSignMessages: async () => {} };\n * const OffchainMessage: OffchainMessageWithSigners = {\n * /* ... *\\/\n * requiredSignatories: [signerA, signerB],\n * };\n *\n * const messageSigners = getSignersFromOffchainMessage(offchainMessage);\n * // ^ [signerA, signerB]\n * ```\n */\nexport function getSignersFromOffchainMessage({\n requiredSignatories,\n}: OffchainMessageWithRequiredSignatories): readonly MessageSigner[] {\n const messageSigners = requiredSignatories.filter(isMessageSigner);\n return deduplicateSigners(messageSigners);\n}\n","import {\n assertIsFullySignedOffchainMessageEnvelope,\n compileOffchainMessageEnvelope,\n FullySignedOffchainMessageEnvelope,\n OffchainMessage,\n OffchainMessageEnvelope,\n OffchainMessageSignatory,\n OffchainMessageWithRequiredSignatories,\n} from '@solana/offchain-messages';\n\nimport {\n isMessageModifyingSigner,\n MessageModifyingSigner,\n MessageModifyingSignerConfig,\n} from './message-modifying-signer';\nimport { isMessagePartialSigner, MessagePartialSigner, MessagePartialSignerConfig } from './message-partial-signer';\nimport { MessageSigner } from './message-signer';\nimport { getSignersFromOffchainMessage, OffchainMessageSignatorySigner } from './offchain-message-signer';\nimport { SignableMessage } from './signable-message';\n\n/**\n * Extracts all {@link MessageSigner | MessageSigners} inside the provided offchain message and uses\n * them to return a signed offchain message envelope.\n *\n * It first uses all {@link MessageModifyingSigner | MessageModifyingSigners} sequentially before\n * using all {@link MessagePartialSigner | MessagePartialSigners} in parallel.\n *\n * If a composite signer implements both interfaces, it will be used as a\n * {@link MessageModifyingSigner} if no other signer implements that interface. Otherwise, it will\n * be used as a {@link MessagePartialSigner}.\n *\n * @example\n * ```ts\n * const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage);\n * ```\n *\n * It also accepts an optional {@link AbortSignal} that will be propagated to all signers.\n *\n * ```ts\n * const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage, {\n * abortSignal: myAbortController.signal,\n * });\n * ```\n *\n * @see {@link signOffchainMessageWithSigners}\n */\nexport async function partiallySignOffchainMessageWithSigners(\n offchainMessage: OffchainMessageWithRequiredSignatories &\n Omit,\n config?: MessagePartialSignerConfig,\n): Promise {\n const { partialSigners, modifyingSigners } = categorizeMessageSigners(\n getSignersFromOffchainMessage(offchainMessage),\n );\n return await signModifyingAndPartialMessageSigners(offchainMessage, modifyingSigners, partialSigners, config);\n}\n\n/**\n * Extracts all {@link MessageSigner | MessageSigners} inside the provided offchain message and uses\n * them to return a signed offchain message envelope before asserting that all signatures required\n * by the message are present.\n *\n * This function delegates to the {@link partiallySignOffchainMessageWithSigners} function\n * in order to extract signers from the offchain message and sign it.\n *\n * @example\n * ```ts\n * const mySignedOffchainMessageEnvelope = await signOffchainMessageWithSigners(myOffchainMessage);\n *\n * // With additional config.\n * const mySignedOffchainMessageEnvelope = await signOffchainMessageWithSigners(myOffchainMessage, {\n * abortSignal: myAbortController.signal,\n * });\n *\n * // We now know the offchain message is fully signed.\n * mySignedOffchainMessageEnvelope satisfies FullySignedOffchainMessageEnvelope;\n * ```\n *\n * @see {@link partiallySignOffchainMessageWithSigners}\n */\nexport async function signOffchainMessageWithSigners(\n offchainMessage: OffchainMessageWithRequiredSignatories &\n Omit,\n config?: MessagePartialSignerConfig,\n): Promise {\n const signedOffchainMessageEnvelope = await partiallySignOffchainMessageWithSigners(offchainMessage, config);\n assertIsFullySignedOffchainMessageEnvelope(signedOffchainMessageEnvelope);\n return signedOffchainMessageEnvelope;\n}\n\n/**\n * Identifies each provided {@link MessageSigner} and categorizes them into their respective types.\n * When a signer implements multiple interfaces, it will try to used to most powerful interface but\n * fall back to the least powerful interface when necessary.\n *\n * For instance, if a signer implements {@link MessageSigner} and {@link MessageModifyingSigner},\n * it will be categorized as a `MessageModifyingSigner`.\n */\nfunction categorizeMessageSigners(signers: readonly MessageSigner[]): Readonly<{\n modifyingSigners: readonly MessageModifyingSigner[];\n partialSigners: readonly MessagePartialSigner[];\n}> {\n // Identify the modifying signers from the other signers.\n const modifyingSigners = identifyMessageModifyingSigners(signers);\n\n // Use any remaining signers as partial signers.\n const partialSigners = signers\n .filter(isMessagePartialSigner)\n .filter(signer => !(modifyingSigners as typeof signers).includes(signer));\n\n return Object.freeze({ modifyingSigners, partialSigners });\n}\n\n/** Identifies the best signers to use as MessageModifyingSigners, if any */\nfunction identifyMessageModifyingSigners(\n signers: readonly (MessageModifyingSigner | MessagePartialSigner)[],\n): readonly MessageModifyingSigner[] {\n // Ensure there are any MessageModifyingSigner in the first place.\n const modifyingSigners = signers.filter(isMessageModifyingSigner);\n if (modifyingSigners.length === 0) return [];\n\n // Prefer modifying signers that do not offer partial signing.\n const nonPartialSigners = modifyingSigners.filter(signer => !isMessagePartialSigner(signer));\n if (nonPartialSigners.length > 0) return nonPartialSigners;\n\n // Otherwise, choose only one modifying signer (whichever).\n return [modifyingSigners[0]];\n}\n\n/**\n * Signs an offchain message using the provided\n * {@link MessageModifyingSigner | MessageModifyingSigners} sequentially followed by the\n * {@link MessagePartialSigner | MessagePartialSigners} in parallel.\n */\nasync function signModifyingAndPartialMessageSigners(\n offchainMessage: OffchainMessageWithRequiredSignatories &\n Omit,\n modifyingSigners: readonly MessageModifyingSigner[] = [],\n partialSigners: readonly MessagePartialSigner[] = [],\n config?: MessageModifyingSignerConfig,\n): Promise {\n // @ts-expect-error SignableMessage should probably specify `ReadonlyUint8Array` here.\n const offchainMessageEnvelope: SignableMessage = compileOffchainMessageEnvelope(offchainMessage);\n\n // Handle modifying signers sequentially.\n const modifiedOffchainMessage = await modifyingSigners.reduce(async (offchainMessageEnvelope, modifyingSigner) => {\n config?.abortSignal?.throwIfAborted();\n const [message] = await modifyingSigner.modifyAndSignMessages([await offchainMessageEnvelope], config);\n return Object.freeze(message);\n }, Promise.resolve(offchainMessageEnvelope));\n\n // Handle partial signers in parallel.\n config?.abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signMessages([modifiedOffchainMessage], config);\n return signatures;\n }),\n );\n\n // @ts-expect-error SignableMessage should probably specify `ReadonlyUint8Array` here.\n return Object.freeze({\n ...modifiedOffchainMessage,\n signatures: Object.freeze(\n signatureDictionaries.reduce((signatures, signatureDictionary) => {\n return { ...signatures, ...signatureDictionary };\n }, modifiedOffchainMessage.signatures ?? {}),\n ),\n } as OffchainMessageEnvelope);\n}\n","import {\n SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS,\n SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { Brand } from '@solana/nominal-types';\nimport { BaseTransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\nimport { getSignersFromTransactionMessage, TransactionMessageWithSigners } from './account-signer-meta';\nimport { isTransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner } from './transaction-sending-signer';\n\n/**\n * Defines a transaction message with exactly one {@link TransactionSendingSigner}.\n *\n * This type is used to narrow the type of transaction messages that have been\n * checked to have exactly one sending signer.\n *\n * @example\n * ```ts\n * import { assertIsTransactionMessageWithSingleSendingSigner } from '@solana/signers';\n *\n * assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);\n * transactionMessage satisfies TransactionMessageWithSingleSendingSigner;\n * ```\n *\n * @see {@link isTransactionMessageWithSingleSendingSigner}\n * @see {@link assertIsTransactionMessageWithSingleSendingSigner}\n */\nexport type TransactionMessageWithSingleSendingSigner = Brand<\n TransactionMessageWithSigners,\n 'TransactionMessageWithSingleSendingSigner'\n>;\n\n/**\n * Checks whether the provided transaction has exactly one {@link TransactionSendingSigner}.\n *\n * This can be useful when using {@link signAndSendTransactionMessageWithSigners} to provide\n * a fallback strategy in case the transaction message cannot be send using this function.\n *\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import {\n * isTransactionMessageWithSingleSendingSigner,\n * signAndSendTransactionMessageWithSigners,\n * signTransactionMessageWithSigners,\n * } from '@solana/signers';\n * import { getBase64EncodedWireTransaction } from '@solana/transactions';\n *\n * let transactionSignature: SignatureBytes;\n * if (isTransactionMessageWithSingleSendingSigner(transactionMessage)) {\n * transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage);\n * } else {\n * const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);\n * const encodedTransaction = getBase64EncodedWireTransaction(signedTransaction);\n * transactionSignature = await rpc.sendTransaction(encodedTransaction).send();\n * }\n * ```\n *\n * @see {@link signAndSendTransactionMessageWithSigners}\n * @see {@link assertIsTransactionMessageWithSingleSendingSigner}\n */\nexport function isTransactionMessageWithSingleSendingSigner<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(transaction: TTransactionMessage): transaction is TransactionMessageWithSingleSendingSigner & TTransactionMessage {\n try {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Asserts that the provided transaction message has exactly one {@link TransactionSendingSigner}.\n *\n * This can be useful when using the {@link signAndSendTransactionMessageWithSigners} function\n * to ensure it will be able to select the correct signer to send the transaction.\n *\n * @typeParam TTransactionMessage - The inferred type of the transaction message provided.\n *\n * @example\n * ```ts\n * import {\n * assertIsTransactionMessageWithSingleSendingSigner,\n * signAndSendTransactionMessageWithSigners\n * } from '@solana/signers';\n *\n * assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);\n * const transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage);\n * ```\n *\n * @see {@link signAndSendTransactionMessageWithSigners}\n * @see {@link isTransactionMessageWithSingleSendingSigner}\n */\nexport function assertIsTransactionMessageWithSingleSendingSigner<\n TTransactionMessage extends BaseTransactionMessage & TransactionMessageWithFeePayer,\n>(\n transaction: TTransactionMessage,\n): asserts transaction is TransactionMessageWithSingleSendingSigner & TTransactionMessage {\n const signers = getSignersFromTransactionMessage(transaction);\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n\n if (sendingSigners.length === 0) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n // When identifying if there are multiple sending signers, we only need to check for\n // sending signers that do not implement other transaction signer interfaces as\n // they will be used as these other signer interfaces in case of a conflict.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionPartialSigner(signer) && !isTransactionModifyingSigner(signer),\n );\n\n if (sendingOnlySigners.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS);\n }\n}\n","import { SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { BaseTransactionMessage, TransactionMessageWithFeePayer } from '@solana/transaction-messages';\nimport {\n assertIsFullySignedTransaction,\n compileTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithinSizeLimit,\n TransactionWithLifetime,\n} from '@solana/transactions';\n\nimport { getSignersFromTransactionMessage, TransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport {\n isTransactionModifyingSigner,\n TransactionModifyingSigner,\n TransactionModifyingSignerConfig,\n} from './transaction-modifying-signer';\nimport {\n isTransactionPartialSigner,\n TransactionPartialSigner,\n TransactionPartialSignerConfig,\n} from './transaction-partial-signer';\nimport {\n isTransactionSendingSigner,\n TransactionSendingSigner,\n TransactionSendingSignerConfig,\n} from './transaction-sending-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\nimport { assertIsTransactionMessageWithSingleSendingSigner } from './transaction-with-single-sending-signer';\n\n/**\n * Extracts all {@link TransactionSigner | TransactionSigners} inside the provided\n * transaction message and uses them to return a signed transaction.\n *\n * It first uses all {@link TransactionModifyingSigner | TransactionModifyingSigners} sequentially before\n * using all {@link TransactionPartialSigner | TransactionPartialSigners} in parallel.\n *\n * If a composite signer implements both interfaces, it will be used as a\n * {@link TransactionModifyingSigner} if no other signer implements that interface.\n * Otherwise, it will be used as a {@link TransactionPartialSigner}.\n *\n * @example\n * ```ts\n * const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage);\n * ```\n *\n * It also accepts an optional {@link AbortSignal} that will be propagated to all signers.\n *\n * ```ts\n * const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, {\n * abortSignal: myAbortController.signal,\n * });\n * ```\n *\n * @remarks\n * Finally, note that this function ignores {@link TransactionSendingSigner | TransactionSendingSigners}\n * as it does not send the transaction. Check out the {@link signAndSendTransactionMessageWithSigners}\n * function for more details on how to use sending signers.\n *\n * @see {@link signTransactionMessageWithSigners}\n * @see {@link signAndSendTransactionMessageWithSigners}\n */\nexport async function partiallySignTransactionMessageWithSigners(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n config?: TransactionPartialSignerConfig,\n): Promise {\n const { partialSigners, modifyingSigners } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transactionMessage).filter(isTransactionSigner)),\n { identifySendingSigner: false },\n );\n\n return await signModifyingAndPartialTransactionSigners(\n transactionMessage,\n modifyingSigners,\n partialSigners,\n config,\n );\n}\n\n/**\n * Extracts all {@link TransactionSigner | TransactionSigners} inside the provided\n * transaction message and uses them to return a signed transaction before asserting\n * that all signatures required by the transaction are present.\n *\n * This function delegates to the {@link partiallySignTransactionMessageWithSigners} function\n * in order to extract signers from the transaction message and sign the transaction.\n *\n * @example\n * ```ts\n * const mySignedTransaction = await signTransactionMessageWithSigners(myTransactionMessage);\n *\n * // With additional config.\n * const mySignedTransaction = await signTransactionMessageWithSigners(myTransactionMessage, {\n * abortSignal: myAbortController.signal,\n * });\n *\n * // We now know the transaction is fully signed.\n * mySignedTransaction satisfies FullySignedTransaction;\n * ```\n *\n * @see {@link partiallySignTransactionMessageWithSigners}\n * @see {@link signAndSendTransactionMessageWithSigners}\n */\nexport async function signTransactionMessageWithSigners(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n config?: TransactionPartialSignerConfig,\n): Promise {\n const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, config);\n assertIsFullySignedTransaction(signedTransaction);\n return signedTransaction;\n}\n\n/**\n * Extracts all {@link TransactionSigner | TransactionSigners} inside the provided\n * transaction message and uses them to sign it before sending it immediately to the blockchain.\n *\n * It returns the signature of the sent transaction (i.e. its identifier) as bytes.\n *\n * @example\n * ```ts\n * import { signAndSendTransactionMessageWithSigners } from '@solana/signers';\n *\n * const transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage);\n *\n * // With additional config.\n * const transactionSignature = await signAndSendTransactionMessageWithSigners(transactionMessage, {\n * abortSignal: myAbortController.signal,\n * });\n * ```\n *\n * @remarks\n * Similarly to the {@link partiallySignTransactionMessageWithSigners} function, it first uses all\n * {@link TransactionModifyingSigner | TransactionModifyingSigners} sequentially before using all\n * {@link TransactionPartialSigner | TransactionPartialSigners} in parallel.\n * It then sends the transaction using the {@link TransactionSendingSigner} it identified.\n *\n * Composite transaction signers are treated such that at least one sending signer is used if any.\n * When a {@link TransactionSigner} implements more than one interface, we use it as a:\n *\n * - {@link TransactionSendingSigner}, if no other {@link TransactionSendingSigner} exists.\n * - {@link TransactionModifyingSigner}, if no other {@link TransactionModifyingSigner} exists.\n * - {@link TransactionPartialSigner}, otherwise.\n *\n * The provided transaction must contain exactly one {@link TransactionSendingSigner} inside its account metas.\n * If more than one composite signers implement the {@link TransactionSendingSigner} interface,\n * one of them will be selected as the sending signer. Otherwise, if multiple\n * {@link TransactionSendingSigner | TransactionSendingSigners} must be selected, the function will throw an error.\n *\n * If you'd like to assert that a transaction makes use of exactly one {@link TransactionSendingSigner}\n * _before_ calling this function, you may use the {@link assertIsTransactionMessageWithSingleSendingSigner} function.\n *\n * Alternatively, you may use the {@link isTransactionMessageWithSingleSendingSigner} function to provide a\n * fallback in case the transaction does not contain any sending signer.\n *\n * @see {@link assertIsTransactionMessageWithSingleSendingSigner}\n * @see {@link isTransactionMessageWithSingleSendingSigner}\n * @see {@link partiallySignTransactionMessageWithSigners}\n * @see {@link signTransactionMessageWithSigners}\n *\n */\nexport async function signAndSendTransactionMessageWithSigners(\n transaction: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n config?: TransactionSendingSignerConfig,\n): Promise {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n\n const abortSignal = config?.abortSignal;\n const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transaction).filter(isTransactionSigner)),\n );\n\n abortSignal?.throwIfAborted();\n const signedTransaction = await signModifyingAndPartialTransactionSigners(\n transaction,\n modifyingSigners,\n partialSigners,\n config,\n );\n\n if (!sendingSigner) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n abortSignal?.throwIfAborted();\n const [signature] = await sendingSigner.signAndSendTransactions([signedTransaction], config);\n abortSignal?.throwIfAborted();\n\n return signature;\n}\n\n/**\n * Identifies each provided TransactionSigner and categorizes them into their respective types.\n * When a signer implements multiple interface, it will try to used to most powerful interface\n * but fallback to the least powerful interface when necessary.\n * For instance, if a signer implements TransactionSendingSigner and TransactionModifyingSigner,\n * it will be categorized as a TransactionSendingSigner if and only if no other signers implement\n * the TransactionSendingSigner interface.\n */\nfunction categorizeTransactionSigners(\n signers: readonly TransactionSigner[],\n config: { identifySendingSigner?: boolean } = {},\n): Readonly<{\n modifyingSigners: readonly TransactionModifyingSigner[];\n partialSigners: readonly TransactionPartialSigner[];\n sendingSigner: TransactionSendingSigner | null;\n}> {\n // Identify the unique sending signer that should be used.\n const identifySendingSigner = config.identifySendingSigner ?? true;\n const sendingSigner = identifySendingSigner ? identifyTransactionSendingSigner(signers) : null;\n\n // Now, focus on the other signers.\n // I.e. the modifying or partial signers that are not the identified sending signer.\n // Note that any other sending only signers will be discarded.\n const otherSigners = signers.filter(\n (signer): signer is TransactionModifyingSigner | TransactionPartialSigner =>\n signer !== sendingSigner && (isTransactionModifyingSigner(signer) || isTransactionPartialSigner(signer)),\n );\n\n // Identify the modifying signers from the other signers.\n const modifyingSigners = identifyTransactionModifyingSigners(otherSigners);\n\n // Use any remaining signers as partial signers.\n const partialSigners = otherSigners\n .filter(isTransactionPartialSigner)\n .filter(signer => !(modifyingSigners as typeof otherSigners).includes(signer));\n\n return Object.freeze({ modifyingSigners, partialSigners, sendingSigner });\n}\n\n/** Identifies the best signer to use as a TransactionSendingSigner, if any */\nfunction identifyTransactionSendingSigner(signers: readonly TransactionSigner[]): TransactionSendingSigner | null {\n // Ensure there are any TransactionSendingSigners in the first place.\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n if (sendingSigners.length === 0) return null;\n\n // Prefer sending signers that do not offer other interfaces.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionModifyingSigner(signer) && !isTransactionPartialSigner(signer),\n );\n if (sendingOnlySigners.length > 0) {\n return sendingOnlySigners[0];\n }\n\n // Otherwise, choose any sending signer.\n return sendingSigners[0];\n}\n\n/** Identifies the best signers to use as TransactionModifyingSigners, if any */\nfunction identifyTransactionModifyingSigners(\n signers: readonly (TransactionModifyingSigner | TransactionPartialSigner)[],\n): readonly TransactionModifyingSigner[] {\n // Ensure there are any TransactionModifyingSigner in the first place.\n const modifyingSigners = signers.filter(isTransactionModifyingSigner);\n if (modifyingSigners.length === 0) return [];\n\n // Prefer modifying signers that do not offer partial signing.\n const nonPartialSigners = modifyingSigners.filter(signer => !isTransactionPartialSigner(signer));\n if (nonPartialSigners.length > 0) return nonPartialSigners;\n\n // Otherwise, choose only one modifying signer (whichever).\n return [modifyingSigners[0]];\n}\n\n/**\n * Signs a transaction using the provided TransactionModifyingSigners\n * sequentially followed by the TransactionPartialSigners in parallel.\n */\nasync function signModifyingAndPartialTransactionSigners(\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithSigners,\n modifyingSigners: readonly TransactionModifyingSigner[] = [],\n partialSigners: readonly TransactionPartialSigner[] = [],\n config?: TransactionModifyingSignerConfig,\n): Promise {\n // serialize the transaction\n const transaction = compileTransaction(transactionMessage);\n\n // Handle modifying signers sequentially.\n const modifiedTransaction = (await modifyingSigners.reduce(\n async (transaction, modifyingSigner) => {\n config?.abortSignal?.throwIfAborted();\n const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction], config);\n return Object.freeze(tx);\n },\n Promise.resolve(transaction) as Promise>,\n )) as Transaction & TransactionWithinSizeLimit & TransactionWithLifetime;\n\n // Handle partial signers in parallel.\n config?.abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signTransactions([modifiedTransaction], config);\n return signatures;\n }),\n );\n\n return Object.freeze({\n ...modifiedTransaction,\n signatures: Object.freeze(\n signatureDictionaries.reduce((signatures, signatureDictionary) => {\n return { ...signatures, ...signatureDictionary };\n }, modifiedTransaction.signatures ?? {}),\n ),\n });\n}\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import { TextEncoder } from '@solana/text-encoding-impl';\n\nimport { SignatureDictionary } from './types';\n\n/**\n * Defines a message that needs signing and its current set of signatures if any.\n *\n * This interface allows {@link MessageModifyingSigner | MessageModifyingSigners}\n * to decide on whether or not they should modify the provided message depending\n * on whether or not signatures already exist for such message.\n *\n * It also helps create a more consistent API by providing a structure analogous\n * to transactions which also keep track of their {@link SignatureDictionary}.\n *\n * @example\n * ```ts\n * import { createSignableMessage } from '@solana/signers';\n *\n * const message = createSignableMessage(new Uint8Array([1, 2, 3]));\n * message.content; // The content of the message as bytes.\n * message.signatures; // The current set of signatures for this message.\n * ```\n *\n * @see {@link createSignableMessage}\n */\nexport type SignableMessage = Readonly<{\n content: Uint8Array;\n signatures: SignatureDictionary;\n}>;\n\n/**\n * Creates a {@link SignableMessage} from a `Uint8Array` or a UTF-8 string.\n *\n * It optionally accepts a signature dictionary if the message already contains signatures.\n *\n * @example\n * ```ts\n * const message = createSignableMessage(new Uint8Array([1, 2, 3]));\n * const messageFromText = createSignableMessage('Hello world!');\n * const messageWithSignatures = createSignableMessage('Hello world!', {\n * [address('1234..5678')]: new Uint8Array([1, 2, 3]) as SignatureBytes,\n * });\n * ```\n */\nexport function createSignableMessage(\n content: Uint8Array | string,\n signatures: SignatureDictionary = {},\n): SignableMessage {\n return Object.freeze({\n content: typeof content === 'string' ? new TextEncoder().encode(content) : content,\n signatures: Object.freeze({ ...signatures }),\n });\n}\n","import { setMaxListeners } from 'node:events';\n\nexport const AbortController = class extends globalThis.AbortController {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this.signal);\n }\n};\n\nexport const EventTarget = class extends globalThis.EventTarget {\n constructor(...args: ConstructorParameters) {\n super(...args);\n setMaxListeners(Number.MAX_SAFE_INTEGER, this);\n }\n};\n","import { SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, SolanaError } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport type { GetEpochInfoApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SlotNotificationsApi } from '@solana/rpc-subscriptions';\nimport type { Commitment } from '@solana/rpc-types';\n\ntype GetBlockHeightExceedencePromiseFn = (config: {\n abortSignal: AbortSignal;\n /**\n * Fetch the block height as of the highest slot that has reached this level of commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /** The block height after which to reject the promise */\n lastValidBlockHeight: bigint;\n}) => Promise;\n\ntype CreateBlockHeightExceedencePromiseFactoryConfig = {\n rpc: Rpc & { '~cluster'?: TCluster };\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Creates a promise that throws when the network progresses past the block height after which the\n * supplied blockhash is considered expired for use as a transaction lifetime specifier.\n *\n * When a transaction's lifetime is tied to a blockhash, that transaction can be landed on the\n * network until that blockhash expires. All blockhashes have a block height after which they are\n * considered to have expired.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, SolanaError } from '@solana/errors';\n * import { createBlockHeightExceedencePromiseFactory } from '@solana/transaction-confirmation';\n *\n * const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({\n * rpc,\n * rpcSubscriptions,\n * });\n * try {\n * await getBlockHeightExceedencePromise({ lastValidBlockHeight });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n * console.error(\n * `The block height of the network has exceeded ${e.context.lastValidBlockHeight}. ` +\n * `It is now ${e.context.currentBlockHeight}`,\n * );\n * // Re-sign and retry the transaction.\n * return;\n * }\n * throw e;\n * }\n * ```\n */\nexport function createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig<'devnet'>): GetBlockHeightExceedencePromiseFn;\nexport function createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig<'testnet'>): GetBlockHeightExceedencePromiseFn;\nexport function createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig<'mainnet'>): GetBlockHeightExceedencePromiseFn;\nexport function createBlockHeightExceedencePromiseFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: CreateBlockHeightExceedencePromiseFactoryConfig): GetBlockHeightExceedencePromiseFn {\n return async function getBlockHeightExceedencePromise({\n abortSignal: callerAbortSignal,\n commitment,\n lastValidBlockHeight,\n }): Promise {\n callerAbortSignal.throwIfAborted();\n const abortController = new AbortController();\n const handleAbort = () => {\n abortController.abort();\n };\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n async function getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() {\n const { absoluteSlot, blockHeight } = await rpc\n .getEpochInfo({ commitment })\n .send({ abortSignal: abortController.signal });\n return {\n blockHeight,\n differenceBetweenSlotHeightAndBlockHeight: absoluteSlot - blockHeight,\n };\n }\n try {\n const [slotNotifications, { blockHeight: initialBlockHeight, differenceBetweenSlotHeightAndBlockHeight }] =\n await Promise.all([\n rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal }),\n getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight(),\n ]);\n callerAbortSignal.throwIfAborted();\n let currentBlockHeight = initialBlockHeight;\n if (currentBlockHeight <= lastValidBlockHeight) {\n let lastKnownDifferenceBetweenSlotHeightAndBlockHeight = differenceBetweenSlotHeightAndBlockHeight;\n for await (const slotNotification of slotNotifications) {\n const { slot } = slotNotification;\n if (slot - lastKnownDifferenceBetweenSlotHeightAndBlockHeight > lastValidBlockHeight) {\n // Before making a final decision, recheck the actual block height.\n const {\n blockHeight: recheckedBlockHeight,\n differenceBetweenSlotHeightAndBlockHeight: currentDifferenceBetweenSlotHeightAndBlockHeight,\n } = await getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight();\n currentBlockHeight = recheckedBlockHeight;\n if (currentBlockHeight > lastValidBlockHeight) {\n // Verified; the block height has been exceeded.\n break;\n } else {\n // The block height has not been exceeded, which implies that the\n // difference between the slot height and the block height has grown\n // (ie. some blocks have been skipped since we started). Recalibrate the\n // difference and keep waiting.\n lastKnownDifferenceBetweenSlotHeightAndBlockHeight =\n currentDifferenceBetweenSlotHeightAndBlockHeight;\n }\n }\n }\n }\n callerAbortSignal.throwIfAborted();\n throw new SolanaError(SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED, {\n currentBlockHeight,\n lastValidBlockHeight,\n });\n } finally {\n abortController.abort();\n }\n };\n}\n","import type { Address } from '@solana/addresses';\nimport { getBase58Decoder, getBase64Encoder } from '@solana/codecs-strings';\nimport { SOLANA_ERROR__INVALID_NONCE, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, SolanaError } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport { safeRace } from '@solana/promises';\nimport type { GetAccountInfoApi, Rpc } from '@solana/rpc';\nimport type { AccountNotificationsApi, RpcSubscriptions } from '@solana/rpc-subscriptions';\nimport type { Base64EncodedDataResponse, Commitment } from '@solana/rpc-types';\nimport { Nonce } from '@solana/transaction-messages';\n\ntype GetNonceInvalidationPromiseFn = (config: {\n abortSignal: AbortSignal;\n /**\n * Fetch the nonce account details as of the highest slot that has reached this level of\n * commitment.\n */\n commitment: Commitment;\n /**\n * The value of the nonce that we would expect to see in the nonce account in order for any\n * transaction with that nonce-based lifetime to be considered valid.\n */\n currentNonceValue: Nonce;\n /** The address of the account in which the currently-valid nonce value is stored */\n nonceAccountAddress: Address;\n}) => Promise;\n\ntype CreateNonceInvalidationPromiseFactoryConfig = {\n rpc: Rpc & { '~cluster'?: TCluster };\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\nconst NONCE_VALUE_OFFSET =\n 4 + // version(u32)\n 4 + // state(u32)\n 32; // nonce authority(pubkey)\n// Then comes the nonce value.\n\n/**\n * Creates a promise that throws when the value stored in a nonce account is not the expected one.\n *\n * When a transaction's lifetime is tied to the value stored in a nonce account, that transaction\n * can be landed on the network until the nonce is advanced to a new value.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, SolanaError } from '@solana/errors';\n * import { createNonceInvalidationPromiseFactory } from '@solana/transaction-confirmation';\n *\n * const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({\n * rpc,\n * rpcSubscriptions,\n * });\n * try {\n * await getNonceInvalidationPromise({\n * currentNonceValue,\n * nonceAccountAddress,\n * });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__NONCE_INVALID)) {\n * console.error(`The nonce has advanced to ${e.context.actualNonceValue}`);\n * // Re-sign and retry the transaction.\n * return;\n * } else if (isSolanaError(e, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND)) {\n * console.error(`No nonce account was found at ${nonceAccountAddress}`);\n * }\n * throw e;\n * }\n * ```\n */\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig<'devnet'>): GetNonceInvalidationPromiseFn;\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig<'testnet'>): GetNonceInvalidationPromiseFn;\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig<'mainnet'>): GetNonceInvalidationPromiseFn;\nexport function createNonceInvalidationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateNonceInvalidationPromiseFactoryConfig): GetNonceInvalidationPromiseFn {\n return async function getNonceInvalidationPromise({\n abortSignal: callerAbortSignal,\n commitment,\n currentNonceValue: expectedNonceValue,\n nonceAccountAddress,\n }) {\n const abortController = new AbortController();\n function handleAbort() {\n abortController.abort();\n }\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n /**\n * STEP 1: Set up a subscription for nonce account changes.\n */\n const accountNotifications = await rpcSubscriptions\n .accountNotifications(nonceAccountAddress, { commitment, encoding: 'base64' })\n .subscribe({ abortSignal: abortController.signal });\n const base58Decoder = getBase58Decoder();\n const base64Encoder = getBase64Encoder();\n function getNonceFromAccountData([base64EncodedBytes]: Base64EncodedDataResponse): Nonce {\n const data = base64Encoder.encode(base64EncodedBytes);\n const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32);\n return base58Decoder.decode(nonceValueBytes) as Nonce;\n }\n const nonceAccountDidAdvancePromise = (async () => {\n for await (const accountNotification of accountNotifications) {\n const nonceValue = getNonceFromAccountData(accountNotification.value.data);\n if (nonceValue !== expectedNonceValue) {\n throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, {\n actualNonceValue: nonceValue,\n expectedNonceValue,\n });\n }\n }\n })();\n /**\n * STEP 2: Having subscribed for updates, make a one-shot request for the current nonce\n * value to check if it has already been advanced.\n */\n const nonceIsAlreadyInvalidPromise = (async () => {\n const { value: nonceAccount } = await rpc\n .getAccountInfo(nonceAccountAddress, {\n commitment,\n dataSlice: { length: 32, offset: NONCE_VALUE_OFFSET },\n encoding: 'base58',\n })\n .send({ abortSignal: abortController.signal });\n if (!nonceAccount) {\n throw new SolanaError(SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND, {\n nonceAccountAddress,\n });\n }\n const nonceValue =\n // This works because we asked for the exact slice of data representing the nonce\n // value, and furthermore asked for it in `base58` encoding.\n nonceAccount.data[0] as unknown as Nonce;\n if (nonceValue !== expectedNonceValue) {\n throw new SolanaError(SOLANA_ERROR__INVALID_NONCE, {\n actualNonceValue: nonceValue,\n expectedNonceValue,\n });\n } else {\n await new Promise(() => {\n /* never resolve */\n });\n }\n })();\n try {\n return await safeRace([nonceAccountDidAdvancePromise, nonceIsAlreadyInvalidPromise]);\n } finally {\n abortController.abort();\n }\n };\n}\n","import { getSolanaErrorFromTransactionError } from '@solana/errors';\nimport { AbortController } from '@solana/event-target-impl';\nimport type { Signature } from '@solana/keys';\nimport { safeRace } from '@solana/promises';\nimport type { GetSignatureStatusesApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport { type Commitment, commitmentComparator } from '@solana/rpc-types';\n\ntype GetRecentSignatureConfirmationPromiseFn = (config: {\n abortSignal: AbortSignal;\n /**\n * The level of commitment the transaction must have achieved in order for the promise to\n * resolve.\n */\n commitment: Commitment;\n /**\n * A 64 byte Ed25519 signature, encoded as a base-58 string, that uniquely identifies a\n * transaction by virtue of being the first or only signature in its list of signatures.\n */\n signature: Signature;\n}) => Promise;\n\ntype CreateRecentSignatureConfirmationPromiseFactoryConfig = {\n rpc: Rpc & { '~cluster'?: TCluster };\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Creates a promise that resolves when a recently-landed transaction achieves the target\n * confirmation commitment, and throws when the transaction fails with an error.\n *\n * The status of recently-landed transactions is available in the network's status cache. This\n * confirmation strategy will only yield a result if the signature is still in the status cache. To\n * fetch the status of transactions older than those available in the status cache, use the\n * {@link GetSignatureStatusesApi.getSignatureStatuses} method setting the\n * `searchTransactionHistory` configuration param to `true`.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { createRecentSignatureConfirmationPromiseFactory } from '@solana/transaction-confirmation';\n *\n * const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n * rpc,\n * rpcSubscriptions,\n * });\n * try {\n * await getRecentSignatureConfirmationPromise({\n * commitment,\n * signature,\n * });\n * console.log(`The transaction with signature \\`${signature}\\` has achieved a commitment level of \\`${commitment}\\``);\n * } catch (e) {\n * console.error(`The transaction with signature \\`${signature}\\` failed`, e.cause);\n * throw e;\n * }\n * ```\n */\nexport function createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig<'devnet'>): GetRecentSignatureConfirmationPromiseFn;\nexport function createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig<'testnet'>): GetRecentSignatureConfirmationPromiseFn;\nexport function createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig<'mainnet'>): GetRecentSignatureConfirmationPromiseFn;\nexport function createRecentSignatureConfirmationPromiseFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: CreateRecentSignatureConfirmationPromiseFactoryConfig): GetRecentSignatureConfirmationPromiseFn {\n return async function getRecentSignatureConfirmationPromise({\n abortSignal: callerAbortSignal,\n commitment,\n signature,\n }) {\n const abortController = new AbortController();\n function handleAbort() {\n abortController.abort();\n }\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n /**\n * STEP 1: Set up a subscription for status changes to a signature.\n */\n const signatureStatusNotifications = await rpcSubscriptions\n .signatureNotifications(signature, { commitment })\n .subscribe({ abortSignal: abortController.signal });\n const signatureDidCommitPromise = (async () => {\n for await (const signatureStatusNotification of signatureStatusNotifications) {\n if (signatureStatusNotification.value.err) {\n throw getSolanaErrorFromTransactionError(signatureStatusNotification.value.err);\n } else {\n return;\n }\n }\n })();\n /**\n * STEP 2: Having subscribed for updates, make a one-shot request for the current status.\n * This will only yield a result if the signature is still in the status cache.\n */\n const signatureStatusLookupPromise = (async () => {\n const { value: signatureStatusResults } = await rpc\n .getSignatureStatuses([signature])\n .send({ abortSignal: abortController.signal });\n const signatureStatus = signatureStatusResults[0];\n if (signatureStatus?.err) {\n throw getSolanaErrorFromTransactionError(signatureStatus.err);\n } else if (\n signatureStatus?.confirmationStatus &&\n commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0\n ) {\n return;\n } else {\n await new Promise(() => {\n /* never resolve */\n });\n }\n })();\n try {\n return await safeRace([signatureDidCommitPromise, signatureStatusLookupPromise]);\n } finally {\n abortController.abort();\n }\n };\n}\n","import type { Commitment } from '@solana/rpc-types';\n\ntype Config = Readonly<{\n abortSignal: AbortSignal;\n /**\n * The timeout promise will throw after 30 seconds when the commitment is `processed`, and 60\n * seconds otherwise.\n */\n commitment: Commitment;\n}>;\n\n/**\n * When no other heuristic exists to infer that a transaction has expired, you can use this promise\n * factory with a commitment level. It throws after 30 seconds when the commitment is `processed`,\n * and 60 seconds otherwise. You would typically race this with another confirmation strategy.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { safeRace } from '@solana/promises';\n * import { getTimeoutPromise } from '@solana/transaction-confirmation';\n *\n * try {\n * await safeRace([getCustomTransactionConfirmationPromise(/* ... *\\/), getTimeoutPromise({ commitment })]);\n * } catch (e) {\n * if (e instanceof DOMException && e.name === 'TimeoutError') {\n * console.log('Could not confirm transaction after a timeout');\n * }\n * throw e;\n * }\n * ```\n */\nexport async function getTimeoutPromise({ abortSignal: callerAbortSignal, commitment }: Config) {\n return await new Promise((_, reject) => {\n const handleAbort = (e: AbortSignalEventMap['abort']) => {\n clearTimeout(timeoutId);\n const abortError = new DOMException((e.target as AbortSignal).reason, 'AbortError');\n reject(abortError);\n };\n callerAbortSignal.addEventListener('abort', handleAbort);\n const timeoutMs = commitment === 'processed' ? 30_000 : 60_000;\n const startMs = performance.now();\n const timeoutId =\n // We use `setTimeout` instead of `AbortSignal.timeout()` because we want to measure\n // elapsed time instead of active time.\n // See https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static\n setTimeout(() => {\n const elapsedMs = performance.now() - startMs;\n reject(new DOMException(`Timeout elapsed after ${elapsedMs} ms`, 'TimeoutError'));\n }, timeoutMs);\n });\n}\n","import { AbortController } from '@solana/event-target-impl';\nimport type { Signature } from '@solana/keys';\nimport { safeRace } from '@solana/promises';\nimport type { Commitment } from '@solana/rpc-types';\n\nimport { createRecentSignatureConfirmationPromiseFactory } from './confirmation-strategy-recent-signature';\n\nexport interface BaseTransactionConfirmationStrategyConfig {\n abortSignal?: AbortSignal;\n commitment: Commitment;\n getRecentSignatureConfirmationPromise: ReturnType;\n}\n\ntype WithNonNullableAbortSignal = Omit & Readonly<{ abortSignal: AbortSignal }>;\n\nexport async function raceStrategies(\n signature: Signature,\n config: TConfig,\n getSpecificStrategiesForRace: (config: WithNonNullableAbortSignal) => readonly Promise[],\n) {\n const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise } = config;\n callerAbortSignal?.throwIfAborted();\n const abortController = new AbortController();\n if (callerAbortSignal) {\n const handleAbort = () => {\n abortController.abort();\n };\n callerAbortSignal.addEventListener('abort', handleAbort, { signal: abortController.signal });\n }\n try {\n const specificStrategies = getSpecificStrategiesForRace({\n ...config,\n abortSignal: abortController.signal,\n });\n return await safeRace([\n getRecentSignatureConfirmationPromise({\n abortSignal: abortController.signal,\n commitment,\n signature,\n }),\n ...specificStrategies,\n ]);\n } finally {\n abortController.abort();\n }\n}\n","import { Signature } from '@solana/keys';\nimport {\n getSignatureFromTransaction,\n Transaction,\n TransactionWithBlockhashLifetime,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\nimport { createBlockHeightExceedencePromiseFactory } from './confirmation-strategy-blockheight';\nimport { createNonceInvalidationPromiseFactory } from './confirmation-strategy-nonce';\nimport { BaseTransactionConfirmationStrategyConfig, raceStrategies } from './confirmation-strategy-racer';\nimport { getTimeoutPromise } from './confirmation-strategy-timeout';\n\nexport type TransactionWithLastValidBlockHeight = Omit & {\n lifetimeConstraint: Omit;\n};\n\ninterface WaitForDurableNonceTransactionConfirmationConfig extends BaseTransactionConfirmationStrategyConfig {\n getNonceInvalidationPromise: ReturnType;\n transaction: Readonly;\n}\n\ninterface WaitForRecentTransactionWithBlockhashLifetimeConfirmationConfig extends BaseTransactionConfirmationStrategyConfig {\n getBlockHeightExceedencePromise: ReturnType;\n transaction: Readonly;\n}\n\ninterface WaitForRecentTransactionWithTimeBasedLifetimeConfirmationConfig extends BaseTransactionConfirmationStrategyConfig {\n getTimeoutPromise: typeof getTimeoutPromise;\n /**\n * A 64 byte Ed25519 signature, encoded as a base-58 string, that uniquely identifies a\n * transaction by virtue of being the first or only signature in its list of signatures.\n */\n signature: Signature;\n}\n\n/**\n * Supply your own confirmation implementations to this function to create a custom nonce\n * transaction confirmation strategy.\n *\n * @example\n * ```ts\n * import { waitForDurableNonceTransactionConfirmation } from '@solana/transaction-confirmation';\n *\n * try {\n * await waitForDurableNonceTransactionConfirmation({\n * getNonceInvalidationPromise({ abortSignal, commitment, currentNonceValue, nonceAccountAddress }) {\n * // Return a promise that rejects when a nonce becomes invalid.\n * },\n * getRecentSignatureConfirmationPromise({ abortSignal, commitment, signature }) {\n * // Return a promise that resolves when a transaction achieves confirmation\n * },\n * });\n * } catch (e) {\n * // Handle errors.\n * }\n * ```\n */\nexport async function waitForDurableNonceTransactionConfirmation(\n config: WaitForDurableNonceTransactionConfirmationConfig,\n): Promise {\n await raceStrategies(\n getSignatureFromTransaction(config.transaction),\n config,\n function getSpecificStrategiesForRace({ abortSignal, commitment, getNonceInvalidationPromise, transaction }) {\n return [\n getNonceInvalidationPromise({\n abortSignal,\n commitment,\n currentNonceValue: transaction.lifetimeConstraint.nonce,\n nonceAccountAddress: transaction.lifetimeConstraint.nonceAccountAddress,\n }),\n ];\n },\n );\n}\n\n/**\n * Supply your own confirmation implementations to this function to create a custom confirmation\n * strategy for recently-landed transactions.\n *\n * @example\n * ```ts\n * import { waitForRecentTransactionConfirmation } from '@solana/transaction-confirmation';\n *\n * try {\n * await waitForRecentTransactionConfirmation({\n * getBlockHeightExceedencePromise({ abortSignal, commitment, lastValidBlockHeight }) {\n * // Return a promise that rejects when the blockhash's block height has been exceeded\n * },\n * getRecentSignatureConfirmationPromise({ abortSignal, commitment, signature }) {\n * // Return a promise that resolves when a transaction achieves confirmation\n * },\n * });\n * } catch (e) {\n * // Handle errors.\n * }\n * ```\n */\nexport async function waitForRecentTransactionConfirmation(\n config: WaitForRecentTransactionWithBlockhashLifetimeConfirmationConfig,\n): Promise {\n await raceStrategies(\n getSignatureFromTransaction(config.transaction),\n config,\n function getSpecificStrategiesForRace({\n abortSignal,\n commitment,\n getBlockHeightExceedencePromise,\n transaction,\n }) {\n return [\n getBlockHeightExceedencePromise({\n abortSignal,\n commitment,\n lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight,\n }),\n ];\n },\n );\n}\n\n/** @deprecated */\nexport async function waitForRecentTransactionConfirmationUntilTimeout(\n config: WaitForRecentTransactionWithTimeBasedLifetimeConfirmationConfig,\n): Promise {\n await raceStrategies(\n config.signature,\n config,\n function getSpecificStrategiesForRace({ abortSignal, commitment, getTimeoutPromise }) {\n return [\n getTimeoutPromise({\n abortSignal,\n commitment,\n }),\n ];\n },\n );\n}\n","import type { Address } from '@solana/addresses';\nimport type { Signature } from '@solana/keys';\nimport type { RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { Commitment, Lamports } from '@solana/rpc-types';\nimport { waitForRecentTransactionConfirmationUntilTimeout } from '@solana/transaction-confirmation';\n\ntype RequestAndConfirmAirdropConfig = Readonly<{\n abortSignal?: AbortSignal;\n commitment: Commitment;\n confirmSignatureOnlyTransaction: (\n config: Omit<\n Parameters[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) => Promise;\n lamports: Lamports;\n recipientAddress: Address;\n rpc: Rpc;\n}>;\n\nexport async function requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmSignatureOnlyTransaction,\n lamports,\n recipientAddress,\n rpc,\n}: RequestAndConfirmAirdropConfig): Promise {\n const airdropTransactionSignature = await rpc\n .requestAirdrop(recipientAddress, lamports, { commitment })\n .send({ abortSignal });\n await confirmSignatureOnlyTransaction({\n abortSignal,\n commitment,\n signature: airdropTransactionSignature,\n });\n return airdropTransactionSignature;\n}\n","import type { Signature } from '@solana/keys';\nimport type { GetSignatureStatusesApi, RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createRecentSignatureConfirmationPromiseFactory,\n getTimeoutPromise,\n waitForRecentTransactionConfirmationUntilTimeout,\n} from '@solana/transaction-confirmation';\n\nimport { requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT } from './airdrop-internal';\n\ntype AirdropFunction = (\n config: Omit<\n Parameters[0],\n 'confirmSignatureOnlyTransaction' | 'rpc'\n >,\n) => Promise;\n\ntype AirdropFactoryConfig = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link RequestAirdropApi} of the Solana RPC API */\n rpc: Rpc & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to airdrop a certain amount of {@link Lamports} to a Solana\n * address.\n *\n * > [!NOTE] This only works on test clusters.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { address, airdropFactory, createSolanaRpc, createSolanaRpcSubscriptions, devnet, lamports } from '@solana/kit';\n *\n * const rpc = createSolanaRpc(devnet('http://127.0.0.1:8899'));\n * const rpcSubscriptions = createSolanaRpcSubscriptions(devnet('ws://127.0.0.1:8900'));\n *\n * const airdrop = airdropFactory({ rpc, rpcSubscriptions });\n *\n * await airdrop({\n * commitment: 'confirmed',\n * recipientAddress: address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa'),\n * lamports: lamports(10_000_000n),\n * });\n * ```\n */\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'devnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'mainnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'testnet'>): AirdropFunction;\nexport function airdropFactory({\n rpc,\n rpcSubscriptions,\n}: AirdropFactoryConfig): AirdropFunction {\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n async function confirmSignatureOnlyTransaction(\n config: Omit<\n Parameters[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmationUntilTimeout({\n ...config,\n getRecentSignatureConfirmationPromise,\n getTimeoutPromise,\n });\n }\n return async function airdrop(config) {\n return await requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmSignatureOnlyTransaction,\n rpc,\n });\n };\n}\n","import {\n assertAccountsDecoded,\n assertAccountsExist,\n type FetchAccountsConfig,\n fetchJsonParsedAccounts,\n} from '@solana/accounts';\nimport type { Address } from '@solana/addresses';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport { type AddressesByLookupTableAddress } from '@solana/transaction-messages';\n\ntype FetchedAddressLookup = {\n addresses: Address[];\n};\n\n/**\n * Given a list of addresses belonging to address lookup tables, returns a map of lookup table\n * addresses to an ordered array of the addresses they contain.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function fetchAddressesForLookupTables(\n lookupTableAddresses: Address[],\n rpc: Rpc,\n config?: FetchAccountsConfig,\n): Promise {\n if (lookupTableAddresses.length === 0) {\n return {};\n }\n\n const fetchedLookupTables = await fetchJsonParsedAccounts(\n rpc,\n lookupTableAddresses,\n config,\n );\n\n assertAccountsDecoded(fetchedLookupTables);\n assertAccountsExist(fetchedLookupTables);\n\n return fetchedLookupTables.reduce((acc, lookup) => {\n return {\n ...acc,\n [lookup.address]: lookup.data.addresses,\n };\n }, {});\n}\n","import { type FetchAccountsConfig } from '@solana/accounts';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport {\n CompiledTransactionMessage,\n CompiledTransactionMessageWithLifetime,\n decompileTransactionMessage,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionMessageWithLifetime,\n} from '@solana/transaction-messages';\n\nimport { fetchAddressesForLookupTables } from './fetch-lookup-tables';\n\ntype DecompileTransactionMessageFetchingLookupTablesConfig = FetchAccountsConfig & {\n lastValidBlockHeight?: bigint;\n};\n\n/**\n * Returns a {@link TransactionMessage} from a {@link CompiledTransactionMessage}. If any of the\n * accounts in the compiled message require an address lookup table to find their address, this\n * function will use the supplied RPC instance to fetch the contents of the address lookup table\n * from the network.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function decompileTransactionMessageFetchingLookupTables(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n rpc: Rpc,\n config?: DecompileTransactionMessageFetchingLookupTablesConfig,\n): Promise {\n const lookupTables =\n 'addressTableLookups' in compiledTransactionMessage &&\n compiledTransactionMessage.addressTableLookups !== undefined &&\n compiledTransactionMessage.addressTableLookups.length > 0\n ? compiledTransactionMessage.addressTableLookups\n : [];\n const lookupTableAddresses = lookupTables.map(l => l.lookupTableAddress);\n\n const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {};\n const addressesByLookupTableAddress =\n lookupTableAddresses.length > 0\n ? await fetchAddressesForLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig)\n : {};\n\n return decompileTransactionMessage(compiledTransactionMessage, {\n addressesByLookupTableAddress,\n lastValidBlockHeight,\n });\n}\n","import type { Lamports } from '@solana/rpc-types';\n\n/**\n * Calculates the minimum {@link Lamports | lamports} required to make an account rent exempt for a\n * given data size, without performing an RPC call.\n *\n * Values are sourced from the on-chain rent parameters in the Solana runtime:\n * https://github.com/anza-xyz/solana-sdk/blob/c07f692e41d757057c8700211a9300cdcd6d33b1/rent/src/lib.rs#L93-L97\n *\n * Note that this logic may change, or be incorrect depending on the cluster you are connected to.\n * You can always use the RPC method `getMinimumBalanceForRentExemption` to get the current value.\n *\n * @param space The number of bytes of account data.\n */\nexport function getMinimumBalanceForRentExemption(space: bigint): Lamports {\n const RENT = {\n ACCOUNT_STORAGE_OVERHEAD: 128n,\n DEFAULT_EXEMPTION_THRESHOLD: 2n,\n DEFAULT_LAMPORTS_PER_BYTE_YEAR: 3_480n,\n } as const;\n const requiredLamports =\n (RENT.ACCOUNT_STORAGE_OVERHEAD + space) *\n RENT.DEFAULT_LAMPORTS_PER_BYTE_YEAR *\n RENT.DEFAULT_EXEMPTION_THRESHOLD;\n return requiredLamports as Lamports;\n}\n","import type { Signature } from '@solana/keys';\nimport type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { Commitment, commitmentComparator } from '@solana/rpc-types';\nimport {\n TransactionWithLastValidBlockHeight,\n waitForDurableNonceTransactionConfirmation,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getBase64EncodedWireTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\ninterface SendAndConfirmDurableNonceTransactionConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmDurableNonceTransaction: (\n config: Omit<\n Parameters[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise;\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime;\n}\n\ninterface SendAndConfirmTransactionWithBlockhashLifetimeConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmRecentTransaction: (\n config: Omit<\n Parameters[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise;\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight;\n}\n\ninterface SendTransactionBaseConfig extends SendTransactionConfigWithoutEncoding {\n abortSignal?: AbortSignal;\n commitment: Commitment;\n rpc: Rpc;\n transaction: SendableTransaction & Transaction;\n}\n\ntype SendTransactionConfigWithoutEncoding = Omit<\n NonNullable[1]>,\n 'encoding'\n>;\n\nfunction getSendTransactionConfigWithAdjustedPreflightCommitment(\n commitment: Commitment,\n config?: SendTransactionConfigWithoutEncoding,\n): SendTransactionConfigWithoutEncoding | void {\n if (\n // The developer has supplied no value for `preflightCommitment`.\n !config?.preflightCommitment &&\n // The value of `commitment` is lower than the server default of `preflightCommitment`.\n commitmentComparator(commitment, 'finalized' /* default value of `preflightCommitment` */) < 0\n ) {\n return {\n ...config,\n // In the common case, it is unlikely that you want to simulate a transaction at\n // `finalized` commitment when your standard of commitment for confirming the\n // transaction is lower. Cap the simulation commitment level to the level of the\n // confirmation commitment.\n preflightCommitment: commitment,\n };\n }\n // The commitment at which the developer wishes to confirm the transaction is at least as\n // high as the commitment at which they want to simulate it. Honour the config as-is.\n return config;\n}\n\nexport async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendTransactionBaseConfig): Promise {\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction);\n return await rpc\n .sendTransaction(base64EncodedWireTransaction, {\n ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig),\n encoding: 'base64',\n })\n .send({ abortSignal });\n}\n\nexport async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmDurableNonceTransactionConfig): Promise {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmDurableNonceTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n\nexport async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmRecentTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmTransactionWithBlockhashLifetimeConfig): Promise {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmRecentTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n","import { getSolanaErrorFromTransactionError, isSolanaError, SOLANA_ERROR__INVALID_NONCE } from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport type { GetAccountInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { AccountNotificationsApi, RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport { commitmentComparator } from '@solana/rpc-types';\nimport {\n createNonceInvalidationPromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n waitForDurableNonceTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getSignatureFromTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\nimport { sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmDurableNonceTransactionFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime,\n config: Omit<\n Parameters[0],\n 'confirmDurableNonceTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise;\n\ntype SendAndConfirmDurableNonceTransactionFactoryConfig = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc & { '~cluster'?: TCluster };\n /** An object that supports the {@link AccountNotificationsApi} and the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a nonce-based transaction to the network and to wait\n * until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * isSolanaError,\n * sendAndConfirmDurableNonceTransactionFactory,\n * SOLANA_ERROR__INVALID_NONCE,\n * SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n * } from '@solana/kit';\n *\n * const sendAndConfirmNonceTransaction = sendAndConfirmDurableNonceTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmNonceTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND)) {\n * console.error(\n * 'The lifetime specified by this transaction refers to a nonce account ' +\n * `\\`${e.context.nonceAccountAddress}\\` that does not exist`,\n * );\n * } else if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n * console.error('This transaction depends on a nonce that is no longer valid');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'devnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'testnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'mainnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig): SendAndConfirmDurableNonceTransactionFunction {\n const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({ rpc, rpcSubscriptions } as Parameters<\n typeof createNonceInvalidationPromiseFactory\n >[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n\n /**\n * Creates a wrapped version of getNonceInvalidationPromise that handles the race condition\n * where the nonce account update notification arrives before the signature confirmation.\n *\n * When the nonce changes, we check if our transaction actually landed on-chain.\n * If it did, we don't throw - letting the signature confirmation promise continue.\n */\n function createNonceInvalidationPromiseHandlingRaceCondition(\n signature: Signature,\n ): typeof getNonceInvalidationPromise {\n return async function wrappedGetNonceInvalidationPromise(config) {\n try {\n return await getNonceInvalidationPromise(config);\n } catch (e) {\n // If nonce became invalid, check if our transaction actually landed\n if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n let status;\n try {\n const { value: statuses } = await rpc\n .getSignatureStatuses([signature])\n .send({ abortSignal: config.abortSignal });\n status = statuses[0];\n } catch {\n // RPC failed - propagate the original nonce error\n throw e;\n }\n\n if (status === null || status === undefined) {\n // Transaction doesn't exist - nonce was truly invalid\n throw e;\n }\n\n // Check if status meets required commitment\n if (\n status.confirmationStatus !== null &&\n commitmentComparator(status.confirmationStatus, config.commitment) >= 0\n ) {\n // Transaction failed on-chain, throw the error from the transaction\n if (status.err !== null) {\n throw getSolanaErrorFromTransactionError(status.err);\n }\n // Transaction succeeded, resolve the promise successfully\n return;\n }\n\n // Commitment not met yet - return a never-resolving promise\n // This lets the signature confirmation promise continue\n return await new Promise(() => {});\n }\n throw e;\n }\n };\n }\n\n async function confirmDurableNonceTransaction(\n config: Omit<\n Parameters[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n const wrappedGetNonceInvalidationPromise = createNonceInvalidationPromiseHandlingRaceCondition(\n getSignatureFromTransaction(config.transaction),\n );\n\n await waitForDurableNonceTransactionConfirmation({\n ...config,\n getNonceInvalidationPromise: wrappedGetNonceInvalidationPromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmDurableNonceTransaction(transaction, config) {\n await sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { GetEpochInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi, SlotNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createBlockHeightExceedencePromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n TransactionWithLastValidBlockHeight,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight,\n config: Omit<\n Parameters[0],\n 'confirmRecentTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise;\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} and the {@link SlotNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a blockhash-based transaction to the network and to\n * wait until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, sendAndConfirmTransactionFactory, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED } from '@solana/kit';\n *\n * const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n * console.error('This transaction depends on a blockhash that has expired');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'devnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'testnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'mainnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig): SendAndConfirmTransactionWithBlockhashLifetimeFunction {\n const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters[0]);\n async function confirmRecentTransaction(\n config: Omit<\n Parameters[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmation({\n ...config,\n getBlockHeightExceedencePromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmTransaction(transaction, config) {\n await sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmRecentTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendTransactionWithoutConfirmingFunction = (\n transaction: SendableTransaction & Transaction,\n config: Omit[0], 'rpc' | 'transaction'>,\n) => Promise;\n\ninterface SendTransactionWithoutConfirmingFactoryConfig {\n /** An object that supports the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc;\n}\n\n/**\n * Returns a function that you can call to send a transaction with any kind of lifetime to the\n * network without waiting for it to be confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * sendTransactionWithoutConfirmingFactory,\n * SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n * } from '@solana/kit';\n *\n * const sendTransaction = sendTransactionWithoutConfirmingFactory({ rpc });\n *\n * try {\n * await sendTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE)) {\n * console.error('The transaction failed in simulation', e.cause);\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendTransactionWithoutConfirmingFactory({\n rpc,\n}: SendTransactionWithoutConfirmingFactoryConfig): SendTransactionWithoutConfirmingFunction {\n return async function sendTransactionWithoutConfirming(transaction, config) {\n await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n rpc,\n transaction,\n });\n };\n}\n","/**\n * Wallet Key Derivation\n *\n * BIP-39 mnemonic generation + BIP-44 HD key derivation for EVM and Solana.\n * Absorbed from @blockrun/clawwallet. No file I/O here - auth.ts handles persistence.\n *\n * Solana uses SLIP-10 Ed25519 derivation (Phantom/Solflare/Backpack compatible).\n * EVM uses standard BIP-32 secp256k1 derivation.\n */\n\nimport { HDKey } from \"@scure/bip32\";\nimport { generateMnemonic, mnemonicToSeedSync, validateMnemonic } from \"@scure/bip39\";\nimport { wordlist as english } from \"@scure/bip39/wordlists/english\";\nimport { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha512 } from \"@noble/hashes/sha2.js\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nconst ETH_DERIVATION_PATH = \"m/44'/60'/0'/0/0\";\nconst SOLANA_HARDENED_INDICES = [44 + 0x80000000, 501 + 0x80000000, 0 + 0x80000000, 0 + 0x80000000]; // m/44'/501'/0'/0'\n\nexport interface DerivedKeys {\n mnemonic: string;\n evmPrivateKey: `0x${string}`;\n evmAddress: string;\n solanaPrivateKeyBytes: Uint8Array; // 32 bytes\n}\n\n/**\n * Generate a 24-word BIP-39 mnemonic.\n */\nexport function generateWalletMnemonic(): string {\n return generateMnemonic(english, 256);\n}\n\n/**\n * Validate a BIP-39 mnemonic.\n */\nexport function isValidMnemonic(mnemonic: string): boolean {\n return validateMnemonic(mnemonic, english);\n}\n\n/**\n * Derive EVM private key and address from a BIP-39 mnemonic.\n * Path: m/44'/60'/0'/0/0 (standard Ethereum derivation)\n */\nexport function deriveEvmKey(mnemonic: string): { privateKey: `0x${string}`; address: string } {\n const seed = mnemonicToSeedSync(mnemonic);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(ETH_DERIVATION_PATH);\n if (!derived.privateKey) throw new Error(\"Failed to derive EVM private key\");\n const hex = `0x${Buffer.from(derived.privateKey).toString(\"hex\")}` as `0x${string}`;\n const account = privateKeyToAccount(hex);\n return { privateKey: hex, address: account.address };\n}\n\n/**\n * Derive 32-byte Solana private key using SLIP-10 Ed25519 derivation.\n * Path: m/44'/501'/0'/0' (Phantom / Solflare / Backpack compatible)\n *\n * Algorithm (SLIP-0010 for Ed25519):\n * 1. Master: HMAC-SHA512(key=\"ed25519 seed\", data=bip39_seed) → IL=key, IR=chainCode\n * 2. For each hardened child index:\n * HMAC-SHA512(key=chainCode, data=0x00 || key || ser32(index)) → split again\n * 3. Final IL (32 bytes) = Ed25519 private key seed\n */\nexport function deriveSolanaKeyBytes(mnemonic: string): Uint8Array {\n const seed = mnemonicToSeedSync(mnemonic);\n\n // Master key from SLIP-10\n // @noble/hashes v2 requires Uint8Array keys (v1 accepted strings)\n let I = hmac(sha512, new TextEncoder().encode(\"ed25519 seed\"), seed);\n let key = I.slice(0, 32);\n let chainCode = I.slice(32);\n\n // Derive each hardened child: m/44'/501'/0'/0'\n for (const index of SOLANA_HARDENED_INDICES) {\n const data = new Uint8Array(37);\n data[0] = 0x00;\n data.set(key, 1);\n // ser32 big-endian\n data[33] = (index >>> 24) & 0xff;\n data[34] = (index >>> 16) & 0xff;\n data[35] = (index >>> 8) & 0xff;\n data[36] = index & 0xff;\n I = hmac(sha512, chainCode, data);\n key = I.slice(0, 32);\n chainCode = I.slice(32);\n }\n\n return new Uint8Array(key);\n}\n\n/**\n * Derive both EVM and Solana keys from a single mnemonic.\n */\nexport function deriveAllKeys(mnemonic: string): DerivedKeys {\n const { privateKey: evmPrivateKey, address: evmAddress } = deriveEvmKey(mnemonic);\n const solanaPrivateKeyBytes = deriveSolanaKeyBytes(mnemonic);\n return { mnemonic, evmPrivateKey, evmAddress, solanaPrivateKeyBytes };\n}\n\n/**\n * Get the Solana address from 32-byte private key bytes.\n * Uses @solana/kit's createKeyPairSignerFromPrivateKeyBytes (dynamic import).\n */\nexport async function getSolanaAddress(privateKeyBytes: Uint8Array): Promise {\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const signer = await createKeyPairSignerFromPrivateKeyBytes(privateKeyBytes);\n return signer.address;\n}\n","/**\n * OnchainOsAdapter — thin wrapper around OKX's `onchainos` CLI.\n *\n * The CLI owns wallet state (email login, key material, on-chain interaction).\n * XClawRouter shells out to it for wallet identity and x402 payment signing\n * so private keys never live in this process.\n *\n * CLI surface used here (verified against okxclawrouter sample):\n * onchainos --version\n * onchainos wallet status → { data: { loggedIn, evmAddress?, email? } }\n * onchainos wallet addresses → { data: { evm?, xlayer?, solana? } }\n * Each chain may be a string, an array\n * of strings, or an array of objects\n * with an `address` field — handled\n * tolerantly by `addresses()`.\n * onchainos wallet login (interactive)\n * onchainos wallet logout\n * onchainos payment x402-pay --accepts \n * → { data: { signature, authorization, sessionCert? } }\n *\n * Some onchainos builds omit `evmAddress` from `wallet status` even when the\n * user is logged in. Callers should fall back to `addresses()` to recover the\n * Base/EVM address rather than treating \"no evmAddress in status\" as \"no\n * onchainos wallet\".\n *\n * Raw EIP-712 / typed-data signing is NOT exposed by onchainos, so we use\n * `payment x402-pay` for the entire signing step rather than the @x402/fetch\n * signer plumbing. See proxy.ts for the call site.\n */\n\nimport { execFile, execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nconst DEFAULT_BIN = \"onchainos\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst PAYMENT_TIMEOUT_MS = 30_000;\n\nconst FALLBACK_CANDIDATES = [\n `${homedir()}/.local/bin/onchainos`,\n \"/opt/homebrew/bin/onchainos\",\n \"/usr/local/bin/onchainos\",\n];\n\nexport interface OnchainOsStatus {\n loggedIn: boolean;\n email?: string;\n evmAddress?: `0x${string}`;\n solanaAddress?: string;\n}\n\nexport interface OnchainOsAddresses {\n /** Base / EVM address. */\n evm?: `0x${string}`;\n /** OKX X Layer address (EVM-compatible). */\n xlayer?: `0x${string}`;\n /** Solana base58 address. */\n solana?: string;\n}\n\nexport interface OnchainOsX402Payment {\n signature: string;\n authorization: Record;\n sessionCert?: string;\n}\n\nexport interface OnchainOsAdapterOptions {\n /** Override the CLI binary path. Defaults to env var, then PATH, then common installs. */\n bin?: string;\n /** Per-command timeout in ms. */\n timeoutMs?: number;\n}\n\nexport class OnchainOsCliError extends Error {\n constructor(\n message: string,\n readonly stderr?: string,\n readonly exitCode?: number | null,\n ) {\n super(message);\n this.name = \"OnchainOsCliError\";\n }\n}\n\n/** Resolve the onchainos binary using env var → PATH → common install locations. */\nexport function resolveOnchainosBin(override?: string): string {\n if (override) return override;\n const env = process.env.XCLAWROUTER_ONCHAINOS_BIN ?? process.env.ONCHAINOS_BIN;\n if (env) return env;\n const fallback = FALLBACK_CANDIDATES.find((candidate) => existsSync(candidate));\n return fallback ?? DEFAULT_BIN;\n}\n\nasync function runCli(bin: string, args: string[], opts: { timeoutMs: number }): Promise {\n try {\n const { stdout } = await execFileAsync(bin, args, {\n timeout: opts.timeoutMs,\n maxBuffer: 8 * 1024 * 1024,\n });\n return stdout;\n } catch (err) {\n throw wrapCliError(err, bin, args);\n }\n}\n\nfunction wrapCliError(err: unknown, bin: string, args: string[]): OnchainOsCliError {\n const e = err as NodeJS.ErrnoException & {\n stderr?: string;\n code?: string | number | null;\n };\n if (e.code === \"ENOENT\") {\n return new OnchainOsCliError(\n `onchainos CLI not found at \"${bin}\". Install OKX's agentic wallet CLI ` +\n `(https://web3.okx.com/onchainos) and ensure it is on PATH, or set ` +\n `XCLAWROUTER_ONCHAINOS_BIN to the binary location.`,\n );\n }\n return new OnchainOsCliError(\n `onchainos ${args.join(\" \")} failed: ${e.message}`,\n e.stderr,\n typeof e.code === \"number\" ? e.code : null,\n );\n}\n\nfunction parseJson(stdout: string, label: string): T {\n const trimmed = stdout.trim();\n if (!trimmed) {\n throw new OnchainOsCliError(`onchainos ${label}: empty output`);\n }\n try {\n return JSON.parse(trimmed) as T;\n } catch (err) {\n throw new OnchainOsCliError(\n `onchainos ${label}: invalid JSON output — ${(err as Error).message}\\n${trimmed.slice(0, 500)}`,\n );\n }\n}\n\n/**\n * Many onchainos commands wrap their result in `{ data: ... }`. Some return the\n * payload directly. Accept both shapes so callers don't have to care.\n */\nfunction unwrapData(parsed: unknown): T {\n if (parsed && typeof parsed === \"object\" && \"data\" in parsed) {\n const inner = (parsed as { data?: unknown }).data;\n if (inner !== undefined && inner !== null) return inner as T;\n }\n return parsed as T;\n}\n\n/**\n * Pull a single address string out of whatever shape onchainos returned for a\n * given chain. The CLI is inconsistent across builds: it may emit a bare\n * string, an array of strings, or an array of objects with `address`/`value`\n * fields. We accept all three.\n */\nfunction pickAddressString(value: unknown): string | undefined {\n if (!value) return undefined;\n if (typeof value === \"string\") return value.trim() || undefined;\n if (Array.isArray(value)) {\n for (const item of value) {\n const found = pickAddressString(item);\n if (found) return found;\n }\n return undefined;\n }\n if (typeof value === \"object\") {\n const obj = value as Record;\n for (const key of [\"address\", \"evmAddress\", \"publicAddress\", \"value\", \"addr\"]) {\n const candidate = obj[key];\n if (typeof candidate === \"string\" && candidate.trim()) return candidate.trim();\n }\n }\n return undefined;\n}\n\nfunction pickEvmAddress(value: unknown): `0x${string}` | undefined {\n const addr = pickAddressString(value);\n if (!addr || !addr.startsWith(\"0x\") || addr.length !== 42) return undefined;\n return addr as `0x${string}`;\n}\n\nexport class OnchainOsAdapter {\n private readonly bin: string;\n private readonly timeoutMs: number;\n\n constructor(opts: OnchainOsAdapterOptions = {}) {\n this.bin = resolveOnchainosBin(opts.bin);\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n /** Quick, synchronous probe — does the binary exist and respond to --version? */\n isInstalled(): boolean {\n try {\n execFileSync(this.bin, [\"--version\"], {\n encoding: \"utf-8\",\n stdio: \"pipe\",\n timeout: 5_000,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n async status(): Promise {\n const stdout = await runCli(this.bin, [\"wallet\", \"status\"], {\n timeoutMs: this.timeoutMs,\n });\n const raw = unwrapData<{\n loggedIn?: boolean;\n connected?: boolean;\n email?: string;\n evmAddress?: string;\n evm?: string;\n solanaAddress?: string;\n solana?: string;\n }>(parseJson(stdout, \"wallet status\"));\n\n const loggedIn = Boolean(raw.loggedIn ?? raw.connected);\n const evmAddress = (raw.evmAddress ?? raw.evm) as `0x${string}` | undefined;\n const solanaAddress = raw.solanaAddress ?? raw.solana;\n return {\n loggedIn,\n email: raw.email,\n evmAddress: evmAddress?.startsWith(\"0x\") ? evmAddress : undefined,\n solanaAddress,\n };\n }\n\n /**\n * Fetch the wallet's addresses across chains. Use this as a fallback when\n * `wallet status` doesn't include `evmAddress` — some onchainos builds omit\n * the address from status but still expose it via `wallet addresses`.\n *\n * Tolerates the three shapes onchainos has shipped for each chain entry:\n * - bare string: `\"0xabc...\"`\n * - array of strings: `[\"0xabc...\", \"0xdef...\"]`\n * - array of objects: `[{ address: \"0xabc...\", chain: \"base\" }, ...]`\n */\n async addresses(): Promise {\n const stdout = await runCli(this.bin, [\"wallet\", \"addresses\"], {\n timeoutMs: this.timeoutMs,\n });\n const raw = unwrapData<{\n evm?: unknown;\n base?: unknown;\n xlayer?: unknown;\n solana?: unknown;\n }>(parseJson(stdout, \"wallet addresses\"));\n\n return {\n evm: pickEvmAddress(raw.evm ?? raw.base),\n xlayer: pickEvmAddress(raw.xlayer),\n solana: pickAddressString(raw.solana),\n };\n }\n\n async login(email: string): Promise {\n if (!email.includes(\"@\")) {\n throw new Error(`Invalid email address: ${email}`);\n }\n // Login involves an interactive verification step; allow more time.\n await runCli(this.bin, [\"wallet\", \"login\", email], { timeoutMs: 5 * 60_000 });\n }\n\n async logout(): Promise {\n await runCli(this.bin, [\"wallet\", \"logout\"], { timeoutMs: this.timeoutMs });\n }\n\n /**\n * Sign an x402 payment via onchainos. Pass through the full `accepts` array\n * from the 402 response — onchainos picks the chain/scheme it can satisfy.\n */\n async signX402Payment(accepts: unknown[]): Promise {\n const acceptsJson = JSON.stringify(accepts);\n const stdout = await runCli(this.bin, [\"payment\", \"x402-pay\", \"--accepts\", acceptsJson], {\n timeoutMs: PAYMENT_TIMEOUT_MS,\n });\n const parsed = parseJson(stdout, \"payment x402-pay\");\n const result = unwrapData>(parsed);\n if (!result.signature || typeof result.signature !== \"string\") {\n throw new OnchainOsCliError(\n `onchainos payment x402-pay returned no signature: ${JSON.stringify(parsed).slice(0, 500)}`,\n );\n }\n if (!result.authorization || typeof result.authorization !== \"object\") {\n throw new OnchainOsCliError(\n `onchainos payment x402-pay returned no authorization: ${JSON.stringify(parsed).slice(0, 500)}`,\n );\n }\n return {\n signature: result.signature,\n authorization: result.authorization as Record,\n sessionCert: typeof result.sessionCert === \"string\" ? result.sessionCert : undefined,\n };\n }\n}\n","/**\n * XClawRouter wallet resolution.\n *\n * Wallet identity is resolved in this order:\n * 1. OKX onchainos CLI (if installed AND user is logged in) — preferred.\n * Private keys never enter this process; signing happens via\n * `onchainos payment x402-pay`. See onchainos-adapter.ts.\n * 2. Saved wallet.key file (legacy BIP-39 path — preserved for existing users)\n * 3. BLOCKRUN_WALLET_KEY env var (legacy)\n * 4. Auto-generated BIP-39 wallet — **opt-in only**, gated behind\n * `XCLAWROUTER_USE_LOCAL_WALLET=1`. On a fresh install with no OKX\n * wallet, resolution throws `OnchainOsRequiredError` instead of silently\n * generating a local key. This is the fix for \"一装就生成本地 wallet\"\n * — users should be guided to install/login onchainos, not handed a\n * local key they don't realize is in play.\n */\n\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { readTextFile } from \"./fs-read.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport type { ProviderAuthMethod, ProviderAuthContext, ProviderAuthResult } from \"./types.js\";\nimport {\n generateWalletMnemonic,\n isValidMnemonic,\n deriveSolanaKeyBytes,\n deriveAllKeys,\n getSolanaAddress,\n} from \"./wallet.js\";\nimport { OnchainOsAdapter } from \"./onchainos-adapter.js\";\n\n// ---------------------------------------------------------------------------\n// OKX onchainos detection\n// ---------------------------------------------------------------------------\n\n/**\n * Result of attempting to use the OKX onchainos Agentic Wallet.\n *\n * Every non-`ok` variant must be distinguishable by the caller — otherwise\n * users who half-installed onchainos, forgot to log in, or hit a transient CLI\n * error get the same silent local-key fallback and never learn why their OKX\n * wallet wasn't picked up.\n *\n * - `ok` — onchainos is installed, logged in, and we have a usable EVM address.\n * - `no-binary` — onchainos CLI is not on PATH. Tip handled at the call site\n * (companion onboarding-tip issue covers when/how to suggest installing).\n * - `not-logged-in` — binary is installed but `wallet status` reports\n * `loggedIn: false`. User just needs to run `onchainos login`.\n * - `status-error` — `wallet status` exited non-zero, timed out, or returned\n * malformed output. `reason` carries the underlying CLI error message.\n * - `no-evm-address` — status is logged in but neither `wallet status` nor the\n * `wallet addresses` fallback yielded an EVM address (e.g. a Solana-only\n * account).\n * - `addresses-error` — status was logged in without an `evmAddress`, but the\n * `wallet addresses` fallback itself failed. `reason` carries the CLI error.\n */\nexport type OnchainOsDetectionResult =\n | { kind: \"ok\"; address: `0x${string}`; email?: string; adapter: OnchainOsAdapter }\n | { kind: \"no-binary\" }\n | { kind: \"not-logged-in\" }\n | { kind: \"status-error\"; reason: string }\n | { kind: \"no-evm-address\" }\n | { kind: \"addresses-error\"; reason: string };\n\nfunction errorReason(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\n/**\n * Detect an OKX onchainos wallet, returning a discriminated result so callers\n * can surface a tailored warning per failure mode instead of silently falling\n * back to a local key.\n *\n * Some onchainos builds omit `evmAddress` from `wallet status`; when the user\n * is logged in but status has no address, fall back to `wallet addresses` to\n * recover the Base/EVM address. Without this fallback, the router would\n * incorrectly think there is no agentic wallet and silently generate a fresh\n * local key — sending users to a different address than their OKX wallet.\n */\nexport async function detectOnchainosWallet(): Promise {\n const adapter = new OnchainOsAdapter();\n if (!adapter.isInstalled()) return { kind: \"no-binary\" };\n\n let status;\n try {\n status = await adapter.status();\n } catch (err) {\n return { kind: \"status-error\", reason: errorReason(err) };\n }\n\n if (!status.loggedIn) return { kind: \"not-logged-in\" };\n\n let evmAddress = status.evmAddress;\n if (!evmAddress) {\n try {\n const addresses = await adapter.addresses();\n if (addresses.evm) evmAddress = addresses.evm;\n } catch (err) {\n return { kind: \"addresses-error\", reason: errorReason(err) };\n }\n }\n\n if (!evmAddress) return { kind: \"no-evm-address\" };\n return { kind: \"ok\", address: evmAddress, email: status.email, adapter };\n}\n\n/** URL where users can download / read about OKX onchainos. */\nexport const ONCHAINOS_DOWNLOAD_URL = \"https://web3.okx.com/onchainos\";\n\n/**\n * Curl-able installer script for the onchainos binary. Hosted by OKX in the\n * onchainos-skills repo. Shared between `xclawrouter setup` (auto-install on\n * first launch) and `scripts/reinstall.sh` (curl-one-liner install path) so a\n * URL move only needs to happen in one place on the TS side.\n *\n * NOTE: the shell installer (`scripts/reinstall.sh`) duplicates this URL as a\n * bash variable because POSIX shell can't import TS. Keep them in sync.\n */\nexport const ONCHAINOS_INSTALLER_URL =\n \"https://raw.githubusercontent.com/okx/onchainos-skills/main/install.sh\";\n\n/**\n * Thrown when a fresh install has no OKX wallet AND no legacy saved wallet,\n * AND the user has not explicitly opted into local-key generation via\n * `XCLAWROUTER_USE_LOCAL_WALLET=1`. Callers should surface the message\n * verbatim — it contains the next-step commands the user needs.\n */\nexport class OnchainOsRequiredError extends Error {\n constructor(public readonly detection: OnchainOsDetectionResult) {\n const notInstalled = detection.kind === \"no-binary\";\n super(\n \"No wallet available.\\n\" +\n \"\\n\" +\n \"XClawRouter uses OKX Agentic Wallet (onchainos). \" +\n (notInstalled\n ? \"onchainos is not installed yet.\\n\"\n : \"onchainos is installed but you're not logged in yet.\\n\") +\n \"\\n\" +\n \"Run this one command to install + log in:\\n\" +\n \" npx @blockrun/xclawrouter setup\\n\" +\n \"\\n\" +\n \"It will install the onchainos binary (if needed) and prompt you for\\n\" +\n \"email + OTP. Then restart the gateway: openclaw gateway restart\\n\" +\n \"\\n\" +\n \"Opt-out (legacy local BIP-39 wallet — you manage backups yourself):\\n\" +\n \" export XCLAWROUTER_USE_LOCAL_WALLET=1\\n\" +\n \" openclaw gateway restart\\n\",\n );\n this.name = \"OnchainOsRequiredError\";\n }\n}\n\n/**\n * Severity for each line in the Agentic Wallet status block. Lets callers\n * route the block through a structured logger (e.g. OpenClaw's\n * `api.logger.info` / `.warn`) without losing the install-state-vs.-failure\n * distinction, while plain stdout callers can just print all lines.\n *\n * - `info` — neutral confirmation (e.g. \"✓ installed\", \"→ Run: …\").\n * - `warn` — failure or missing-state marker (e.g. \"⚠ not installed\",\n * \"✗ not logged in\"). Anything the user needs to *act on*.\n */\nexport type AgenticWalletStatusLine = { level: \"info\" | \"warn\"; text: string };\n\n/**\n * Render the multi-line \"Agentic Wallet status\" block — the canonical\n * answer to \"is OKX onchainos installed, am I logged in, and what should I\n * do about it?\". Emitted on every non-OKX launch so users never wonder why\n * we silently fell back to a local key.\n *\n * Pure function returning structured lines (no `[XClawRouter]` prefix, no\n * console calls) so it can be routed to:\n * - plain stdout (`src/cli.ts`, via `console.log` after adding the\n * `[XClawRouter] ` prefix), or\n * - OpenClaw's structured logger (`src/index.ts`, via `api.logger.info` /\n * `api.logger.warn` — the plugin name prefix comes from the logger).\n *\n * Returns `[]` for `kind: \"ok\"` — the existing `Using OKX onchainos wallet:`\n * line already conveys \"Agentic Wallet ready\" and a status banner above it\n * would be noise.\n */\nexport function formatAgenticWalletStatus(\n detection: OnchainOsDetectionResult,\n): AgenticWalletStatusLine[] {\n switch (detection.kind) {\n case \"ok\":\n // Status is implicit in the `Using OKX onchainos wallet: …` log that\n // follows. Don't emit a banner on the happy path.\n return [];\n case \"no-binary\":\n return [\n { level: \"warn\", text: \"⚠ OKX Agentic Wallet not installed\" },\n { level: \"info\", text: ` → Download: ${ONCHAINOS_DOWNLOAD_URL}` },\n { level: \"info\", text: \" → After install, run: onchainos login\" },\n ];\n case \"not-logged-in\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed\" },\n { level: \"warn\", text: \"✗ Login status: not logged in\" },\n { level: \"info\", text: \" → Run: onchainos login\" },\n ];\n case \"status-error\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed\" },\n {\n level: \"warn\",\n text: `✗ Login status: unknown — status check failed: ${detection.reason}`,\n },\n ];\n case \"no-evm-address\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed (logged in)\" },\n { level: \"warn\", text: \"✗ No EVM address found (Solana-only account?)\" },\n ];\n case \"addresses-error\":\n return [\n { level: \"info\", text: \"✓ OKX Agentic Wallet installed (logged in)\" },\n { level: \"warn\", text: `✗ Could not read wallet addresses: ${detection.reason}` },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Payment chain persistence (used by both paths)\n// ---------------------------------------------------------------------------\n\nconst WALLET_DIR = join(homedir(), \".openclaw\", \"blockrun\");\nconst WALLET_FILE = join(WALLET_DIR, \"wallet.key\");\nconst MNEMONIC_FILE = join(WALLET_DIR, \"mnemonic\");\nconst CHAIN_FILE = join(WALLET_DIR, \"payment-chain\");\n\nexport { WALLET_DIR, WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE };\n\nexport async function savePaymentChain(chain: \"base\" | \"solana\"): Promise {\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(CHAIN_FILE, chain + \"\\n\", { mode: 0o600 });\n}\n\nexport async function loadPaymentChain(): Promise<\"base\" | \"solana\"> {\n try {\n const content = (await readTextFile(CHAIN_FILE)).trim();\n if (content === \"solana\") return \"solana\";\n return \"base\";\n } catch {\n return \"base\";\n }\n}\n\n/**\n * Resolve payment chain: env var → persisted file → default \"base\".\n * Accepts both XCLAWROUTER_PAYMENT_CHAIN (preferred) and CLAWROUTER_PAYMENT_CHAIN\n * (legacy, deprecated — will be removed after one release).\n */\nexport async function resolvePaymentChain(): Promise<\"base\" | \"solana\"> {\n const env = process.env.XCLAWROUTER_PAYMENT_CHAIN ?? process.env.CLAWROUTER_PAYMENT_CHAIN;\n if (env === \"solana\") return \"solana\";\n if (env === \"base\") return \"base\";\n return loadPaymentChain();\n}\n\n// ---------------------------------------------------------------------------\n// Local-key path (used when onchainos is unavailable)\n// ---------------------------------------------------------------------------\n\nasync function loadSavedWallet(): Promise {\n try {\n const key = (await readTextFile(WALLET_FILE)).trim();\n if (key.startsWith(\"0x\") && key.length === 66) {\n console.log(`[XClawRouter] ✓ Loaded existing wallet from ${WALLET_FILE}`);\n return key;\n }\n console.error(`[XClawRouter] ✗ CRITICAL: Wallet file exists but has invalid format!`);\n console.error(`[XClawRouter] File: ${WALLET_FILE}`);\n console.error(`[XClawRouter] Expected: 0x followed by 64 hex characters (66 chars total)`);\n throw new Error(\n `Wallet file at ${WALLET_FILE} is corrupted or has wrong format. ` +\n `Refusing to auto-generate new wallet to protect existing funds. ` +\n `Restore your backup key or set BLOCKRUN_WALLET_KEY environment variable.`,\n );\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n if (err instanceof Error && err.message.includes(\"Refusing to auto-generate\")) {\n throw err;\n }\n throw new Error(\n `Cannot read wallet file at ${WALLET_FILE}: ${err instanceof Error ? err.message : String(err)}.`,\n { cause: err },\n );\n }\n }\n return undefined;\n}\n\nasync function loadMnemonic(): Promise {\n try {\n const mnemonic = (await readTextFile(MNEMONIC_FILE)).trim();\n if (mnemonic && isValidMnemonic(mnemonic)) return mnemonic;\n console.warn(`[XClawRouter] ⚠ Mnemonic file exists but has invalid format — ignoring`);\n return undefined;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.warn(`[XClawRouter] ⚠ Cannot read mnemonic file — ignoring`);\n }\n }\n return undefined;\n}\n\nasync function saveMnemonic(mnemonic: string): Promise {\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(MNEMONIC_FILE, mnemonic + \"\\n\", { mode: 0o600 });\n}\n\nasync function generateAndSaveWallet(): Promise<{\n key: string;\n address: string;\n mnemonic: string;\n solanaPrivateKeyBytes: Uint8Array;\n}> {\n const existingMnemonic = await loadMnemonic();\n if (existingMnemonic) {\n throw new Error(\n `Mnemonic file exists at ${MNEMONIC_FILE} but wallet.key is missing.\\n` +\n `Refusing to generate a new wallet to protect existing funds.`,\n );\n }\n\n const mnemonic = generateWalletMnemonic();\n const derived = deriveAllKeys(mnemonic);\n\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(WALLET_FILE, derived.evmPrivateKey + \"\\n\", { mode: 0o600 });\n await writeFile(MNEMONIC_FILE, mnemonic + \"\\n\", { mode: 0o600 });\n\n const verification = (await readTextFile(WALLET_FILE)).trim();\n if (verification !== derived.evmPrivateKey) {\n throw new Error(\"Wallet file verification failed - content mismatch\");\n }\n\n return {\n key: derived.evmPrivateKey,\n address: derived.evmAddress,\n mnemonic,\n solanaPrivateKeyBytes: derived.solanaPrivateKeyBytes,\n };\n}\n\n/**\n * Result of wallet resolution.\n *\n * - `source: \"okx\"` — OKX onchainos wallet is connected. `key` is undefined\n * because signing is delegated to onchainos (no private key in this process).\n * `onchainos` is the adapter the proxy uses to sign x402 payments.\n * - `source: \"saved\" | \"env\" | \"config\" | \"generated\"` — local key path.\n */\nexport type WalletResolution = {\n key?: string;\n address: string;\n source: \"saved\" | \"env\" | \"config\" | \"generated\" | \"okx\";\n mnemonic?: string;\n solanaPrivateKeyBytes?: Uint8Array;\n onchainos?: OnchainOsAdapter;\n email?: string;\n /**\n * The outcome of OKX onchainos detection. Present whenever\n * `resolveOrGenerateWalletKey` ran the detection — callers use this to\n * decide which warning, if any, to show the user. `kind: \"ok\"` accompanies\n * `source: \"okx\"`; any other kind means we fell back to a local key.\n */\n onchainosDetection?: OnchainOsDetectionResult;\n};\n\n/**\n * Resolve the wallet identity, preferring OKX onchainos when available.\n *\n * If onchainos is installed and logged in, returns its EVM address as the\n * wallet identity (no local key). Otherwise falls back to the legacy\n * local-key flow: saved file → env var → auto-generate.\n */\nexport async function resolveOrGenerateWalletKey(): Promise {\n // 1. Prefer OKX onchainos when installed + logged in.\n const onchainosDetection = await detectOnchainosWallet();\n if (onchainosDetection.kind === \"ok\") {\n return {\n address: onchainosDetection.address,\n source: \"okx\",\n onchainos: onchainosDetection.adapter,\n email: onchainosDetection.email,\n onchainosDetection,\n };\n }\n\n // 2. Legacy local-key path.\n const saved = await loadSavedWallet();\n if (saved) {\n const account = privateKeyToAccount(saved as `0x${string}`);\n const mnemonic = await loadMnemonic();\n if (mnemonic) {\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n return {\n key: saved,\n address: account.address,\n source: \"saved\",\n mnemonic,\n solanaPrivateKeyBytes: solanaKeyBytes,\n onchainosDetection,\n };\n }\n return { key: saved, address: account.address, source: \"saved\", onchainosDetection };\n }\n\n const envKey = process.env.BLOCKRUN_WALLET_KEY;\n if (typeof envKey === \"string\" && envKey.startsWith(\"0x\") && envKey.length === 66) {\n const account = privateKeyToAccount(envKey as `0x${string}`);\n const mnemonic = await loadMnemonic();\n if (mnemonic) {\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n return {\n key: envKey,\n address: account.address,\n source: \"env\",\n mnemonic,\n solanaPrivateKeyBytes: solanaKeyBytes,\n onchainosDetection,\n };\n }\n return { key: envKey, address: account.address, source: \"env\", onchainosDetection };\n }\n\n // Fresh install with no OKX wallet AND no legacy saved key.\n // Refuse to silently generate a local BIP-39 wallet — users have been\n // surprised by \"一装就生成本地 wallet\" too many times. They must either:\n // (a) install + log in to onchainos, OR\n // (b) explicitly opt into the legacy local-key path.\n if (process.env.XCLAWROUTER_USE_LOCAL_WALLET !== \"1\") {\n throw new OnchainOsRequiredError(onchainosDetection);\n }\n\n const result = await generateAndSaveWallet();\n return {\n key: result.key,\n address: result.address,\n source: \"generated\",\n mnemonic: result.mnemonic,\n solanaPrivateKeyBytes: result.solanaPrivateKeyBytes,\n onchainosDetection,\n };\n}\n\n/** Restore wallet.key from an existing mnemonic file. */\nexport async function recoverWalletFromMnemonic(): Promise {\n const mnemonic = await loadMnemonic();\n if (!mnemonic) {\n console.error(`[XClawRouter] No mnemonic found at ${MNEMONIC_FILE}`);\n process.exit(1);\n }\n\n const existing = await loadSavedWallet().catch(() => undefined);\n if (existing) {\n console.error(`[XClawRouter] wallet.key already exists at ${WALLET_FILE}`);\n process.exit(1);\n }\n\n const derived = deriveAllKeys(mnemonic);\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n const solanaAddress = await getSolanaAddress(solanaKeyBytes).catch(() => undefined);\n\n console.log(`[XClawRouter] Derived EVM Address : ${derived.evmAddress}`);\n if (solanaAddress) console.log(`[XClawRouter] Derived Solana Address: ${solanaAddress}`);\n\n await mkdir(WALLET_DIR, { recursive: true });\n await writeFile(WALLET_FILE, derived.evmPrivateKey + \"\\n\", { mode: 0o600 });\n console.log(`[XClawRouter] ✓ wallet.key restored at ${WALLET_FILE}`);\n}\n\n/** Set up Solana for an existing local-key wallet. Not used in OKX mode. */\nexport async function setupSolana(): Promise<{\n mnemonic: string;\n solanaPrivateKeyBytes: Uint8Array;\n}> {\n const existing = await loadMnemonic();\n if (existing) throw new Error(\"Solana wallet already set up at \" + MNEMONIC_FILE);\n\n const savedKey = await loadSavedWallet();\n if (!savedKey) {\n throw new Error(\n \"No EVM wallet found. Run XClawRouter first to generate a wallet before setting up Solana.\",\n );\n }\n\n const mnemonic = generateWalletMnemonic();\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n await saveMnemonic(mnemonic);\n\n return { mnemonic, solanaPrivateKeyBytes: solanaKeyBytes };\n}\n\n/** @deprecated Legacy manual-entry auth. */\nexport const walletKeyAuth: ProviderAuthMethod = {\n id: \"wallet-key\",\n label: \"Wallet Private Key\",\n hint: \"Enter your EVM wallet private key (0x...) for x402 payments\",\n kind: \"api_key\",\n run: async (ctx: ProviderAuthContext): Promise => {\n const key = await ctx.prompter.text({\n message: \"Enter your wallet private key (0x...)\",\n validate: (value: string) => {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"0x\")) return \"Key must start with 0x\";\n if (trimmed.length !== 66) return \"Key must be 66 characters\";\n if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed)) return \"Key must be valid hex\";\n return undefined;\n },\n });\n\n if (!key || typeof key !== \"string\") throw new Error(\"Wallet key is required\");\n\n return {\n profiles: [{ profileId: \"default\", credential: { apiKey: key.trim() } }],\n notes: [\"Wallet key stored securely in OpenClaw credentials.\"],\n };\n },\n};\n\n/** @deprecated Legacy env-var auth. */\nexport const envKeyAuth: ProviderAuthMethod = {\n id: \"env-key\",\n label: \"Environment Variable\",\n hint: \"Use BLOCKRUN_WALLET_KEY environment variable\",\n kind: \"api_key\",\n run: async (): Promise => {\n const key = process.env.BLOCKRUN_WALLET_KEY;\n if (!key) throw new Error(\"BLOCKRUN_WALLET_KEY environment variable is not set.\");\n return {\n profiles: [{ profileId: \"default\", credential: { apiKey: key.trim() } }],\n notes: [\"Using wallet key from BLOCKRUN_WALLET_KEY environment variable.\"],\n };\n },\n};\n","'use strict'\n\nmodule.exports = {\n kClose: Symbol('close'),\n kDestroy: Symbol('destroy'),\n kDispatch: Symbol('dispatch'),\n kUrl: Symbol('url'),\n kWriting: Symbol('writing'),\n kResuming: Symbol('resuming'),\n kQueue: Symbol('queue'),\n kConnect: Symbol('connect'),\n kConnecting: Symbol('connecting'),\n kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'),\n kKeepAliveMaxTimeout: Symbol('max keep alive timeout'),\n kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'),\n kKeepAliveTimeoutValue: Symbol('keep alive timeout'),\n kKeepAlive: Symbol('keep alive'),\n kHeadersTimeout: Symbol('headers timeout'),\n kBodyTimeout: Symbol('body timeout'),\n kServerName: Symbol('server name'),\n kLocalAddress: Symbol('local address'),\n kHost: Symbol('host'),\n kNoRef: Symbol('no ref'),\n kBodyUsed: Symbol('used'),\n kBody: Symbol('abstracted request body'),\n kRunning: Symbol('running'),\n kBlocking: Symbol('blocking'),\n kPending: Symbol('pending'),\n kSize: Symbol('size'),\n kBusy: Symbol('busy'),\n kQueued: Symbol('queued'),\n kFree: Symbol('free'),\n kConnected: Symbol('connected'),\n kClosed: Symbol('closed'),\n kNeedDrain: Symbol('need drain'),\n kReset: Symbol('reset'),\n kDestroyed: Symbol.for('nodejs.stream.destroyed'),\n kResume: Symbol('resume'),\n kOnError: Symbol('on error'),\n kMaxHeadersSize: Symbol('max headers size'),\n kRunningIdx: Symbol('running index'),\n kPendingIdx: Symbol('pending index'),\n kError: Symbol('error'),\n kClients: Symbol('clients'),\n kClient: Symbol('client'),\n kParser: Symbol('parser'),\n kOnDestroyed: Symbol('destroy callbacks'),\n kPipelining: Symbol('pipelining'),\n kSocket: Symbol('socket'),\n kHostHeader: Symbol('host header'),\n kConnector: Symbol('connector'),\n kStrictContentLength: Symbol('strict content length'),\n kMaxRedirections: Symbol('maxRedirections'),\n kMaxRequests: Symbol('maxRequestsPerClient'),\n kProxy: Symbol('proxy agent options'),\n kCounter: Symbol('socket request counter'),\n kMaxResponseSize: Symbol('max response size'),\n kHTTP2Session: Symbol('http2Session'),\n kHTTP2SessionState: Symbol('http2Session state'),\n kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),\n kConstruct: Symbol('constructable'),\n kListeners: Symbol('listeners'),\n kHTTPContext: Symbol('http context'),\n kMaxConcurrentStreams: Symbol('max concurrent streams'),\n kHTTP2InitialWindowSize: Symbol('http2 initial window size'),\n kHTTP2ConnectionWindowSize: Symbol('http2 connection window size'),\n kEnableConnectProtocol: Symbol('http2session connect protocol'),\n kRemoteSettings: Symbol('http2session remote settings'),\n kHTTP2Stream: Symbol('http2session client stream'),\n kPingInterval: Symbol('ping interval'),\n kNoProxyAgent: Symbol('no proxy agent'),\n kHttpProxyAgent: Symbol('http proxy agent'),\n kHttpsProxyAgent: Symbol('https proxy agent'),\n kSocks5ProxyAgent: Symbol('socks5 proxy agent')\n}\n","'use strict'\n\n/**\n * This module offers an optimized timer implementation designed for scenarios\n * where high precision is not critical.\n *\n * The timer achieves faster performance by using a low-resolution approach,\n * with an accuracy target of within 500ms. This makes it particularly useful\n * for timers with delays of 1 second or more, where exact timing is less\n * crucial.\n *\n * It's important to note that Node.js timers are inherently imprecise, as\n * delays can occur due to the event loop being blocked by other operations.\n * Consequently, timers may trigger later than their scheduled time.\n */\n\n/**\n * The fastNow variable contains the internal fast timer clock value.\n *\n * @type {number}\n */\nlet fastNow = 0\n\n/**\n * RESOLUTION_MS represents the target resolution time in milliseconds.\n *\n * @type {number}\n * @default 1000\n */\nconst RESOLUTION_MS = 1e3\n\n/**\n * TICK_MS defines the desired interval in milliseconds between each tick.\n * The target value is set to half the resolution time, minus 1 ms, to account\n * for potential event loop overhead.\n *\n * @type {number}\n * @default 499\n */\nconst TICK_MS = (RESOLUTION_MS >> 1) - 1\n\n/**\n * fastNowTimeout is a Node.js timer used to manage and process\n * the FastTimers stored in the `fastTimers` array.\n *\n * @type {NodeJS.Timeout}\n */\nlet fastNowTimeout\n\n/**\n * The kFastTimer symbol is used to identify FastTimer instances.\n *\n * @type {Symbol}\n */\nconst kFastTimer = Symbol('kFastTimer')\n\n/**\n * The fastTimers array contains all active FastTimers.\n *\n * @type {FastTimer[]}\n */\nconst fastTimers = []\n\n/**\n * These constants represent the various states of a FastTimer.\n */\n\n/**\n * The `NOT_IN_LIST` constant indicates that the FastTimer is not included\n * in the `fastTimers` array. Timers with this status will not be processed\n * during the next tick by the `onTick` function.\n *\n * A FastTimer can be re-added to the `fastTimers` array by invoking the\n * `refresh` method on the FastTimer instance.\n *\n * @type {-2}\n */\nconst NOT_IN_LIST = -2\n\n/**\n * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled\n * for removal from the `fastTimers` array. A FastTimer in this state will\n * be removed in the next tick by the `onTick` function and will no longer\n * be processed.\n *\n * This status is also set when the `clear` method is called on the FastTimer instance.\n *\n * @type {-1}\n */\nconst TO_BE_CLEARED = -1\n\n/**\n * The `PENDING` constant signifies that the FastTimer is awaiting processing\n * in the next tick by the `onTick` function. Timers with this status will have\n * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick.\n *\n * @type {0}\n */\nconst PENDING = 0\n\n/**\n * The `ACTIVE` constant indicates that the FastTimer is active and waiting\n * for its timer to expire. During the next tick, the `onTick` function will\n * check if the timer has expired, and if so, it will execute the associated callback.\n *\n * @type {1}\n */\nconst ACTIVE = 1\n\n/**\n * The onTick function processes the fastTimers array.\n *\n * @returns {void}\n */\nfunction onTick () {\n /**\n * Increment the fastNow value by the TICK_MS value, despite the actual time\n * that has passed since the last tick. This approach ensures independence\n * from the system clock and delays caused by a blocked event loop.\n *\n * @type {number}\n */\n fastNow += TICK_MS\n\n /**\n * The `idx` variable is used to iterate over the `fastTimers` array.\n * Expired timers are removed by replacing them with the last element in the array.\n * Consequently, `idx` is only incremented when the current element is not removed.\n *\n * @type {number}\n */\n let idx = 0\n\n /**\n * The len variable will contain the length of the fastTimers array\n * and will be decremented when a FastTimer should be removed from the\n * fastTimers array.\n *\n * @type {number}\n */\n let len = fastTimers.length\n\n while (idx < len) {\n /**\n * @type {FastTimer}\n */\n const timer = fastTimers[idx]\n\n // If the timer is in the ACTIVE state and the timer has expired, it will\n // be processed in the next tick.\n if (timer._state === PENDING) {\n // Set the _idleStart value to the fastNow value minus the TICK_MS value\n // to account for the time the timer was in the PENDING state.\n timer._idleStart = fastNow - TICK_MS\n timer._state = ACTIVE\n } else if (\n timer._state === ACTIVE &&\n fastNow >= timer._idleStart + timer._idleTimeout\n ) {\n timer._state = TO_BE_CLEARED\n timer._idleStart = -1\n timer._onTimeout(timer._timerArg)\n }\n\n if (timer._state === TO_BE_CLEARED) {\n timer._state = NOT_IN_LIST\n\n // Move the last element to the current index and decrement len if it is\n // not the only element in the array.\n if (--len !== 0) {\n fastTimers[idx] = fastTimers[len]\n }\n } else {\n ++idx\n }\n }\n\n // Set the length of the fastTimers array to the new length and thus\n // removing the excess FastTimers elements from the array.\n fastTimers.length = len\n\n // If there are still active FastTimers in the array, refresh the Timer.\n // If there are no active FastTimers, the timer will be refreshed again\n // when a new FastTimer is instantiated.\n if (fastTimers.length !== 0) {\n refreshTimeout()\n }\n}\n\nfunction refreshTimeout () {\n // If the fastNowTimeout is already set and the Timer has the refresh()-\n // method available, call it to refresh the timer.\n // Some timer objects returned by setTimeout may not have a .refresh()\n // method (e.g. mocked timers in tests).\n if (fastNowTimeout?.refresh) {\n fastNowTimeout.refresh()\n // fastNowTimeout is not instantiated yet or refresh is not availabe,\n // create a new Timer.\n } else {\n clearTimeout(fastNowTimeout)\n fastNowTimeout = setTimeout(onTick, TICK_MS)\n // If the Timer has an unref method, call it to allow the process to exit,\n // if there are no other active handles. When using fake timers or mocked\n // environments (like Jest), .unref() may not be defined,\n fastNowTimeout?.unref()\n }\n}\n\n/**\n * The `FastTimer` class is a data structure designed to store and manage\n * timer information.\n */\nclass FastTimer {\n [kFastTimer] = true\n\n /**\n * The state of the timer, which can be one of the following:\n * - NOT_IN_LIST (-2)\n * - TO_BE_CLEARED (-1)\n * - PENDING (0)\n * - ACTIVE (1)\n *\n * @type {-2|-1|0|1}\n * @private\n */\n _state = NOT_IN_LIST\n\n /**\n * The number of milliseconds to wait before calling the callback.\n *\n * @type {number}\n * @private\n */\n _idleTimeout = -1\n\n /**\n * The time in milliseconds when the timer was started. This value is used to\n * calculate when the timer should expire.\n *\n * @type {number}\n * @default -1\n * @private\n */\n _idleStart = -1\n\n /**\n * The function to be executed when the timer expires.\n * @type {Function}\n * @private\n */\n _onTimeout\n\n /**\n * The argument to be passed to the callback when the timer expires.\n *\n * @type {*}\n * @private\n */\n _timerArg\n\n /**\n * @constructor\n * @param {Function} callback A function to be executed after the timer\n * expires.\n * @param {number} delay The time, in milliseconds that the timer should wait\n * before the specified function or code is executed.\n * @param {*} arg\n */\n constructor (callback, delay, arg) {\n this._onTimeout = callback\n this._idleTimeout = delay\n this._timerArg = arg\n\n this.refresh()\n }\n\n /**\n * Sets the timer's start time to the current time, and reschedules the timer\n * to call its callback at the previously specified duration adjusted to the\n * current time.\n * Using this on a timer that has already called its callback will reactivate\n * the timer.\n *\n * @returns {void}\n */\n refresh () {\n // In the special case that the timer is not in the list of active timers,\n // add it back to the array to be processed in the next tick by the onTick\n // function.\n if (this._state === NOT_IN_LIST) {\n fastTimers.push(this)\n }\n\n // If the timer is the only active timer, refresh the fastNowTimeout for\n // better resolution.\n if (!fastNowTimeout || fastTimers.length === 1) {\n refreshTimeout()\n }\n\n // Setting the state to PENDING will cause the timer to be reset in the\n // next tick by the onTick function.\n this._state = PENDING\n }\n\n /**\n * The `clear` method cancels the timer, preventing it from executing.\n *\n * @returns {void}\n * @private\n */\n clear () {\n // Set the state to TO_BE_CLEARED to mark the timer for removal in the next\n // tick by the onTick function.\n this._state = TO_BE_CLEARED\n\n // Reset the _idleStart value to -1 to indicate that the timer is no longer\n // active.\n this._idleStart = -1\n }\n}\n\n/**\n * This module exports a setTimeout and clearTimeout function that can be\n * used as a drop-in replacement for the native functions.\n */\nmodule.exports = {\n /**\n * The setTimeout() method sets a timer which executes a function once the\n * timer expires.\n * @param {Function} callback A function to be executed after the timer\n * expires.\n * @param {number} delay The time, in milliseconds that the timer should\n * wait before the specified function or code is executed.\n * @param {*} [arg] An optional argument to be passed to the callback function\n * when the timer expires.\n * @returns {NodeJS.Timeout|FastTimer}\n */\n setTimeout (callback, delay, arg) {\n // If the delay is less than or equal to the RESOLUTION_MS value return a\n // native Node.js Timer instance.\n return delay <= RESOLUTION_MS\n ? setTimeout(callback, delay, arg)\n : new FastTimer(callback, delay, arg)\n },\n /**\n * The clearTimeout method cancels an instantiated Timer previously created\n * by calling setTimeout.\n *\n * @param {NodeJS.Timeout|FastTimer} timeout\n */\n clearTimeout (timeout) {\n // If the timeout is a FastTimer, call its own clear method.\n if (timeout[kFastTimer]) {\n /**\n * @type {FastTimer}\n */\n timeout.clear()\n // Otherwise it is an instance of a native NodeJS.Timeout, so call the\n // Node.js native clearTimeout function.\n } else {\n clearTimeout(timeout)\n }\n },\n /**\n * The setFastTimeout() method sets a fastTimer which executes a function once\n * the timer expires.\n * @param {Function} callback A function to be executed after the timer\n * expires.\n * @param {number} delay The time, in milliseconds that the timer should\n * wait before the specified function or code is executed.\n * @param {*} [arg] An optional argument to be passed to the callback function\n * when the timer expires.\n * @returns {FastTimer}\n */\n setFastTimeout (callback, delay, arg) {\n return new FastTimer(callback, delay, arg)\n },\n /**\n * The clearTimeout method cancels an instantiated FastTimer previously\n * created by calling setFastTimeout.\n *\n * @param {FastTimer} timeout\n */\n clearFastTimeout (timeout) {\n timeout.clear()\n },\n /**\n * The now method returns the value of the internal fast timer clock.\n *\n * @returns {number}\n */\n now () {\n return fastNow\n },\n /**\n * Trigger the onTick function to process the fastTimers array.\n * Exported for testing purposes only.\n * Marking as deprecated to discourage any use outside of testing.\n * @deprecated\n * @param {number} [delay=0] The delay in milliseconds to add to the now value.\n */\n tick (delay = 0) {\n fastNow += delay - RESOLUTION_MS + 1\n onTick()\n onTick()\n },\n /**\n * Reset FastTimers.\n * Exported for testing purposes only.\n * Marking as deprecated to discourage any use outside of testing.\n * @deprecated\n */\n reset () {\n fastNow = 0\n fastTimers.length = 0\n clearTimeout(fastNowTimeout)\n fastNowTimeout = null\n },\n /**\n * Exporting for testing purposes only.\n * Marking as deprecated to discourage any use outside of testing.\n * @deprecated\n */\n kFastTimer\n}\n","'use strict'\n\nconst kUndiciError = Symbol.for('undici.error.UND_ERR')\nclass UndiciError extends Error {\n constructor (message, options) {\n super(message, options)\n this.name = 'UndiciError'\n this.code = 'UND_ERR'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kUndiciError] === true\n }\n\n get [kUndiciError] () {\n return true\n }\n}\n\nconst kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT')\nclass ConnectTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ConnectTimeoutError'\n this.message = message || 'Connect Timeout Error'\n this.code = 'UND_ERR_CONNECT_TIMEOUT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kConnectTimeoutError] === true\n }\n\n get [kConnectTimeoutError] () {\n return true\n }\n}\n\nconst kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT')\nclass HeadersTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'HeadersTimeoutError'\n this.message = message || 'Headers Timeout Error'\n this.code = 'UND_ERR_HEADERS_TIMEOUT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kHeadersTimeoutError] === true\n }\n\n get [kHeadersTimeoutError] () {\n return true\n }\n}\n\nconst kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW')\nclass HeadersOverflowError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'HeadersOverflowError'\n this.message = message || 'Headers Overflow Error'\n this.code = 'UND_ERR_HEADERS_OVERFLOW'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kHeadersOverflowError] === true\n }\n\n get [kHeadersOverflowError] () {\n return true\n }\n}\n\nconst kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT')\nclass BodyTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'BodyTimeoutError'\n this.message = message || 'Body Timeout Error'\n this.code = 'UND_ERR_BODY_TIMEOUT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kBodyTimeoutError] === true\n }\n\n get [kBodyTimeoutError] () {\n return true\n }\n}\n\nconst kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG')\nclass InvalidArgumentError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'InvalidArgumentError'\n this.message = message || 'Invalid Argument Error'\n this.code = 'UND_ERR_INVALID_ARG'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kInvalidArgumentError] === true\n }\n\n get [kInvalidArgumentError] () {\n return true\n }\n}\n\nconst kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE')\nclass InvalidReturnValueError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'InvalidReturnValueError'\n this.message = message || 'Invalid Return Value Error'\n this.code = 'UND_ERR_INVALID_RETURN_VALUE'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kInvalidReturnValueError] === true\n }\n\n get [kInvalidReturnValueError] () {\n return true\n }\n}\n\nconst kAbortError = Symbol.for('undici.error.UND_ERR_ABORT')\nclass AbortError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'AbortError'\n this.message = message || 'The operation was aborted'\n this.code = 'UND_ERR_ABORT'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kAbortError] === true\n }\n\n get [kAbortError] () {\n return true\n }\n}\n\nconst kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED')\nclass RequestAbortedError extends AbortError {\n constructor (message) {\n super(message)\n this.name = 'AbortError'\n this.message = message || 'Request aborted'\n this.code = 'UND_ERR_ABORTED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kRequestAbortedError] === true\n }\n\n get [kRequestAbortedError] () {\n return true\n }\n}\n\nconst kInformationalError = Symbol.for('undici.error.UND_ERR_INFO')\nclass InformationalError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'InformationalError'\n this.message = message || 'Request information'\n this.code = 'UND_ERR_INFO'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kInformationalError] === true\n }\n\n get [kInformationalError] () {\n return true\n }\n}\n\nconst kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH')\nclass RequestContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'RequestContentLengthMismatchError'\n this.message = message || 'Request body length does not match content-length header'\n this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kRequestContentLengthMismatchError] === true\n }\n\n get [kRequestContentLengthMismatchError] () {\n return true\n }\n}\n\nconst kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH')\nclass ResponseContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ResponseContentLengthMismatchError'\n this.message = message || 'Response body length does not match content-length header'\n this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kResponseContentLengthMismatchError] === true\n }\n\n get [kResponseContentLengthMismatchError] () {\n return true\n }\n}\n\nconst kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED')\nclass ClientDestroyedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ClientDestroyedError'\n this.message = message || 'The client is destroyed'\n this.code = 'UND_ERR_DESTROYED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kClientDestroyedError] === true\n }\n\n get [kClientDestroyedError] () {\n return true\n }\n}\n\nconst kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED')\nclass ClientClosedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ClientClosedError'\n this.message = message || 'The client is closed'\n this.code = 'UND_ERR_CLOSED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kClientClosedError] === true\n }\n\n get [kClientClosedError] () {\n return true\n }\n}\n\nconst kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET')\nclass SocketError extends UndiciError {\n constructor (message, socket) {\n super(message)\n this.name = 'SocketError'\n this.message = message || 'Socket error'\n this.code = 'UND_ERR_SOCKET'\n this.socket = socket\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kSocketError] === true\n }\n\n get [kSocketError] () {\n return true\n }\n}\n\nconst kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED')\nclass NotSupportedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'NotSupportedError'\n this.message = message || 'Not supported error'\n this.code = 'UND_ERR_NOT_SUPPORTED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kNotSupportedError] === true\n }\n\n get [kNotSupportedError] () {\n return true\n }\n}\n\nconst kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM')\nclass BalancedPoolMissingUpstreamError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MissingUpstreamError'\n this.message = message || 'No upstream has been added to the BalancedPool'\n this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kBalancedPoolMissingUpstreamError] === true\n }\n\n get [kBalancedPoolMissingUpstreamError] () {\n return true\n }\n}\n\nconst kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER')\nclass HTTPParserError extends Error {\n constructor (message, code, data) {\n super(message)\n this.name = 'HTTPParserError'\n this.code = code ? `HPE_${code}` : undefined\n this.data = data ? data.toString() : undefined\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kHTTPParserError] === true\n }\n\n get [kHTTPParserError] () {\n return true\n }\n}\n\nconst kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE')\nclass ResponseExceededMaxSizeError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'ResponseExceededMaxSizeError'\n this.message = message || 'Response content exceeded max size'\n this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kResponseExceededMaxSizeError] === true\n }\n\n get [kResponseExceededMaxSizeError] () {\n return true\n }\n}\n\nconst kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY')\nclass RequestRetryError extends UndiciError {\n constructor (message, code, { headers, data }) {\n super(message)\n this.name = 'RequestRetryError'\n this.message = message || 'Request retry error'\n this.code = 'UND_ERR_REQ_RETRY'\n this.statusCode = code\n this.data = data\n this.headers = headers\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kRequestRetryError] === true\n }\n\n get [kRequestRetryError] () {\n return true\n }\n}\n\nconst kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE')\nclass ResponseError extends UndiciError {\n constructor (message, code, { headers, body }) {\n super(message)\n this.name = 'ResponseError'\n this.message = message || 'Response error'\n this.code = 'UND_ERR_RESPONSE'\n this.statusCode = code\n this.body = body\n this.headers = headers\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kResponseError] === true\n }\n\n get [kResponseError] () {\n return true\n }\n}\n\nconst kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS')\nclass SecureProxyConnectionError extends UndiciError {\n constructor (cause, message, options = {}) {\n super(message, { cause, ...options })\n this.name = 'SecureProxyConnectionError'\n this.message = message || 'Secure Proxy Connection failed'\n this.code = 'UND_ERR_PRX_TLS'\n this.cause = cause\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kSecureProxyConnectionError] === true\n }\n\n get [kSecureProxyConnectionError] () {\n return true\n }\n}\n\nconst kMaxOriginsReachedError = Symbol.for('undici.error.UND_ERR_MAX_ORIGINS_REACHED')\nclass MaxOriginsReachedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MaxOriginsReachedError'\n this.message = message || 'Maximum allowed origins reached'\n this.code = 'UND_ERR_MAX_ORIGINS_REACHED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kMaxOriginsReachedError] === true\n }\n\n get [kMaxOriginsReachedError] () {\n return true\n }\n}\n\nclass Socks5ProxyError extends UndiciError {\n constructor (message, code) {\n super(message)\n this.name = 'Socks5ProxyError'\n this.message = message || 'SOCKS5 proxy error'\n this.code = code || 'UND_ERR_SOCKS5'\n }\n}\n\nconst kMessageSizeExceededError = Symbol.for('undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED')\nclass MessageSizeExceededError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MessageSizeExceededError'\n this.message = message || 'Max decompressed message size exceeded'\n this.code = 'UND_ERR_WS_MESSAGE_SIZE_EXCEEDED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kMessageSizeExceededError] === true\n }\n\n get [kMessageSizeExceededError] () {\n return true\n }\n}\n\nmodule.exports = {\n AbortError,\n HTTPParserError,\n UndiciError,\n HeadersTimeoutError,\n HeadersOverflowError,\n BodyTimeoutError,\n RequestContentLengthMismatchError,\n ConnectTimeoutError,\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError,\n ClientDestroyedError,\n ClientClosedError,\n InformationalError,\n SocketError,\n NotSupportedError,\n ResponseContentLengthMismatchError,\n BalancedPoolMissingUpstreamError,\n ResponseExceededMaxSizeError,\n RequestRetryError,\n ResponseError,\n SecureProxyConnectionError,\n MaxOriginsReachedError,\n Socks5ProxyError,\n MessageSizeExceededError\n}\n","'use strict'\n\n/**\n * @see https://developer.mozilla.org/docs/Web/HTTP/Headers\n */\nconst wellknownHeaderNames = /** @type {const} */ ([\n 'Accept',\n 'Accept-Encoding',\n 'Accept-Language',\n 'Accept-Ranges',\n 'Access-Control-Allow-Credentials',\n 'Access-Control-Allow-Headers',\n 'Access-Control-Allow-Methods',\n 'Access-Control-Allow-Origin',\n 'Access-Control-Expose-Headers',\n 'Access-Control-Max-Age',\n 'Access-Control-Request-Headers',\n 'Access-Control-Request-Method',\n 'Age',\n 'Allow',\n 'Alt-Svc',\n 'Alt-Used',\n 'Authorization',\n 'Cache-Control',\n 'Clear-Site-Data',\n 'Connection',\n 'Content-Disposition',\n 'Content-Encoding',\n 'Content-Language',\n 'Content-Length',\n 'Content-Location',\n 'Content-Range',\n 'Content-Security-Policy',\n 'Content-Security-Policy-Report-Only',\n 'Content-Type',\n 'Cookie',\n 'Cross-Origin-Embedder-Policy',\n 'Cross-Origin-Opener-Policy',\n 'Cross-Origin-Resource-Policy',\n 'Date',\n 'Device-Memory',\n 'Downlink',\n 'ECT',\n 'ETag',\n 'Expect',\n 'Expect-CT',\n 'Expires',\n 'Forwarded',\n 'From',\n 'Host',\n 'If-Match',\n 'If-Modified-Since',\n 'If-None-Match',\n 'If-Range',\n 'If-Unmodified-Since',\n 'Keep-Alive',\n 'Last-Modified',\n 'Link',\n 'Location',\n 'Max-Forwards',\n 'Origin',\n 'Permissions-Policy',\n 'Pragma',\n 'Proxy-Authenticate',\n 'Proxy-Authorization',\n 'RTT',\n 'Range',\n 'Referer',\n 'Referrer-Policy',\n 'Refresh',\n 'Retry-After',\n 'Sec-WebSocket-Accept',\n 'Sec-WebSocket-Extensions',\n 'Sec-WebSocket-Key',\n 'Sec-WebSocket-Protocol',\n 'Sec-WebSocket-Version',\n 'Server',\n 'Server-Timing',\n 'Service-Worker-Allowed',\n 'Service-Worker-Navigation-Preload',\n 'Set-Cookie',\n 'SourceMap',\n 'Strict-Transport-Security',\n 'Supports-Loading-Mode',\n 'TE',\n 'Timing-Allow-Origin',\n 'Trailer',\n 'Transfer-Encoding',\n 'Upgrade',\n 'Upgrade-Insecure-Requests',\n 'User-Agent',\n 'Vary',\n 'Via',\n 'WWW-Authenticate',\n 'X-Content-Type-Options',\n 'X-DNS-Prefetch-Control',\n 'X-Frame-Options',\n 'X-Permitted-Cross-Domain-Policies',\n 'X-Powered-By',\n 'X-Requested-With',\n 'X-XSS-Protection'\n])\n\n/** @type {Record, string>} */\nconst headerNameLowerCasedRecord = {}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(headerNameLowerCasedRecord, null)\n\n/**\n * @type {Record, Buffer>}\n */\nconst wellknownHeaderNameBuffers = {}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(wellknownHeaderNameBuffers, null)\n\n/**\n * @param {string} header Lowercased header\n * @returns {Buffer}\n */\nfunction getHeaderNameAsBuffer (header) {\n let buffer = wellknownHeaderNameBuffers[header]\n\n if (buffer === undefined) {\n buffer = Buffer.from(header)\n }\n\n return buffer\n}\n\nfor (let i = 0; i < wellknownHeaderNames.length; ++i) {\n const key = wellknownHeaderNames[i]\n const lowerCasedKey = key.toLowerCase()\n headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] =\n lowerCasedKey\n}\n\nmodule.exports = {\n wellknownHeaderNames,\n headerNameLowerCasedRecord,\n getHeaderNameAsBuffer\n}\n","'use strict'\n\nconst {\n wellknownHeaderNames,\n headerNameLowerCasedRecord\n} = require('./constants')\n\nclass TstNode {\n /** @type {any} */\n value = null\n /** @type {null | TstNode} */\n left = null\n /** @type {null | TstNode} */\n middle = null\n /** @type {null | TstNode} */\n right = null\n /** @type {number} */\n code\n /**\n * @param {string} key\n * @param {any} value\n * @param {number} index\n */\n constructor (key, value, index) {\n if (index === undefined || index >= key.length) {\n throw new TypeError('Unreachable')\n }\n const code = this.code = key.charCodeAt(index)\n // check code is ascii string\n if (code > 0x7F) {\n throw new TypeError('key must be ascii string')\n }\n if (key.length !== ++index) {\n this.middle = new TstNode(key, value, index)\n } else {\n this.value = value\n }\n }\n\n /**\n * @param {string} key\n * @param {any} value\n * @returns {void}\n */\n add (key, value) {\n const length = key.length\n if (length === 0) {\n throw new TypeError('Unreachable')\n }\n let index = 0\n /**\n * @type {TstNode}\n */\n let node = this\n while (true) {\n const code = key.charCodeAt(index)\n // check code is ascii string\n if (code > 0x7F) {\n throw new TypeError('key must be ascii string')\n }\n if (node.code === code) {\n if (length === ++index) {\n node.value = value\n break\n } else if (node.middle !== null) {\n node = node.middle\n } else {\n node.middle = new TstNode(key, value, index)\n break\n }\n } else if (node.code < code) {\n if (node.left !== null) {\n node = node.left\n } else {\n node.left = new TstNode(key, value, index)\n break\n }\n } else if (node.right !== null) {\n node = node.right\n } else {\n node.right = new TstNode(key, value, index)\n break\n }\n }\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {TstNode | null}\n */\n search (key) {\n const keylength = key.length\n let index = 0\n /**\n * @type {TstNode|null}\n */\n let node = this\n while (node !== null && index < keylength) {\n let code = key[index]\n // A-Z\n // First check if it is bigger than 0x5a.\n // Lowercase letters have higher char codes than uppercase ones.\n // Also we assume that headers will mostly contain lowercase characters.\n if (code <= 0x5a && code >= 0x41) {\n // Lowercase for uppercase.\n code |= 32\n }\n while (node !== null) {\n if (code === node.code) {\n if (keylength === ++index) {\n // Returns Node since it is the last key.\n return node\n }\n node = node.middle\n break\n }\n node = node.code < code ? node.left : node.right\n }\n }\n return null\n }\n}\n\nclass TernarySearchTree {\n /** @type {TstNode | null} */\n node = null\n\n /**\n * @param {string} key\n * @param {any} value\n * @returns {void}\n * */\n insert (key, value) {\n if (this.node === null) {\n this.node = new TstNode(key, value, 0)\n } else {\n this.node.add(key, value)\n }\n }\n\n /**\n * @param {Uint8Array} key\n * @returns {any}\n */\n lookup (key) {\n return this.node?.search(key)?.value ?? null\n }\n}\n\nconst tree = new TernarySearchTree()\n\nfor (let i = 0; i < wellknownHeaderNames.length; ++i) {\n const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]\n tree.insert(key, key)\n}\n\nmodule.exports = {\n TernarySearchTree,\n tree\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { kDestroyed, kBodyUsed, kListeners, kBody } = require('./symbols')\nconst { IncomingMessage } = require('node:http')\nconst stream = require('node:stream')\nconst net = require('node:net')\nconst { stringify } = require('node:querystring')\nconst { EventEmitter: EE } = require('node:events')\nconst timers = require('../util/timers')\nconst { InvalidArgumentError, ConnectTimeoutError } = require('./errors')\nconst { headerNameLowerCasedRecord } = require('./constants')\nconst { tree } = require('./tree')\n\nclass BodyAsyncIterable {\n constructor (body) {\n this[kBody] = body\n this[kBodyUsed] = false\n }\n\n async * [Symbol.asyncIterator] () {\n assert(!this[kBodyUsed], 'disturbed')\n this[kBodyUsed] = true\n yield * this[kBody]\n }\n}\n\nfunction noop () {}\n\n/**\n * @param {*} body\n * @returns {*}\n */\nfunction wrapRequestBody (body) {\n if (isStream(body)) {\n // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp\n // so that it can be dispatched again?\n // TODO (fix): Do we need 100-expect support to provide a way to do this properly?\n if (bodyLength(body) === 0) {\n body\n .on('data', function () {\n assert(false)\n })\n }\n\n if (typeof body.readableDidRead !== 'boolean') {\n body[kBodyUsed] = false\n EE.prototype.on.call(body, 'data', function () {\n this[kBodyUsed] = true\n })\n }\n\n return body\n } else if (body && typeof body.pipeTo === 'function') {\n // TODO (fix): We can't access ReadableStream internal state\n // to determine whether or not it has been disturbed. This is just\n // a workaround.\n return new BodyAsyncIterable(body)\n } else if (body && isFormDataLike(body)) {\n return body\n } else if (\n body &&\n typeof body !== 'string' &&\n !ArrayBuffer.isView(body) &&\n isIterable(body)\n ) {\n // TODO: Should we allow re-using iterable if !this.opts.idempotent\n // or through some other flag?\n return new BodyAsyncIterable(body)\n } else {\n return body\n }\n}\n\n/**\n * @param {*} obj\n * @returns {obj is import('node:stream').Stream}\n */\nfunction isStream (obj) {\n return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function'\n}\n\n/**\n * @param {*} object\n * @returns {object is Blob}\n */\nfunction isBlobLike (object) {\n return object instanceof Blob\n}\n\n/**\n * @param {string} url The path to check for query strings or fragments.\n * @returns {boolean} Returns true if the path contains a query string or fragment.\n */\nfunction pathHasQueryOrFragment (url) {\n return (\n url.includes('?') ||\n url.includes('#')\n )\n}\n\n/**\n * @param {string} url The URL to add the query params to\n * @param {import('node:querystring').ParsedUrlQueryInput} queryParams The object to serialize into a URL query string\n * @returns {string} The URL with the query params added\n */\nfunction serializePathWithQuery (url, queryParams) {\n if (pathHasQueryOrFragment(url)) {\n throw new Error('Query params cannot be passed when url already contains \"?\" or \"#\".')\n }\n\n const stringified = stringify(queryParams)\n\n if (stringified) {\n url += '?' + stringified\n }\n\n return url\n}\n\n/**\n * @param {number|string|undefined} port\n * @returns {boolean}\n */\nfunction isValidPort (port) {\n const value = parseInt(port, 10)\n return (\n value === Number(port) &&\n value >= 0 &&\n value <= 65535\n )\n}\n\n/**\n * Check if the value is a valid http or https prefixed string.\n *\n * @param {string} value\n * @returns {boolean}\n */\nfunction isHttpOrHttpsPrefixed (value) {\n return (\n value != null &&\n value[0] === 'h' &&\n value[1] === 't' &&\n value[2] === 't' &&\n value[3] === 'p' &&\n (\n value[4] === ':' ||\n (\n value[4] === 's' &&\n value[5] === ':'\n )\n )\n )\n}\n\n/**\n * @param {string|URL|Record} url\n * @returns {URL}\n */\nfunction parseURL (url) {\n if (typeof url === 'string') {\n /**\n * @type {URL}\n */\n url = new URL(url)\n\n if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n return url\n }\n\n if (!url || typeof url !== 'object') {\n throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.')\n }\n\n if (!(url instanceof URL)) {\n if (url.port != null && url.port !== '' && isValidPort(url.port) === false) {\n throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.')\n }\n\n if (url.path != null && typeof url.path !== 'string') {\n throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.')\n }\n\n if (url.pathname != null && typeof url.pathname !== 'string') {\n throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.')\n }\n\n if (url.hostname != null && typeof url.hostname !== 'string') {\n throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.')\n }\n\n if (url.origin != null && typeof url.origin !== 'string') {\n throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.')\n }\n\n if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n const port = url.port != null\n ? url.port\n : (url.protocol === 'https:' ? 443 : 80)\n let origin = url.origin != null\n ? url.origin\n : `${url.protocol || ''}//${url.hostname || ''}:${port}`\n let path = url.path != null\n ? url.path\n : `${url.pathname || ''}${url.search || ''}`\n\n if (origin[origin.length - 1] === '/') {\n origin = origin.slice(0, origin.length - 1)\n }\n\n if (path && path[0] !== '/') {\n path = `/${path}`\n }\n // new URL(path, origin) is unsafe when `path` contains an absolute URL\n // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL:\n // If first parameter is a relative URL, second param is required, and will be used as the base URL.\n // If first parameter is an absolute URL, a given second param will be ignored.\n return new URL(`${origin}${path}`)\n }\n\n if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n return url\n}\n\n/**\n * @param {string|URL|Record} url\n * @returns {URL}\n */\nfunction parseOrigin (url) {\n url = parseURL(url)\n\n if (url.pathname !== '/' || url.search || url.hash) {\n throw new InvalidArgumentError('invalid url')\n }\n\n return url\n}\n\n/**\n * @param {string} host\n * @returns {string}\n */\nfunction getHostname (host) {\n if (host[0] === '[') {\n const idx = host.indexOf(']')\n\n assert(idx !== -1)\n return host.substring(1, idx)\n }\n\n const idx = host.indexOf(':')\n if (idx === -1) return host\n\n return host.substring(0, idx)\n}\n\n/**\n * IP addresses are not valid server names per RFC6066\n * Currently, the only server names supported are DNS hostnames\n * @param {string|null} host\n * @returns {string|null}\n */\nfunction getServerName (host) {\n if (!host) {\n return null\n }\n\n assert(typeof host === 'string')\n\n const servername = getHostname(host)\n if (net.isIP(servername)) {\n return ''\n }\n\n return servername\n}\n\n/**\n * @function\n * @template T\n * @param {T} obj\n * @returns {T}\n */\nfunction deepClone (obj) {\n return JSON.parse(JSON.stringify(obj))\n}\n\n/**\n * @param {*} obj\n * @returns {obj is AsyncIterable}\n */\nfunction isAsyncIterable (obj) {\n return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function')\n}\n\n/**\n * @param {*} obj\n * @returns {obj is Iterable}\n */\nfunction isIterable (obj) {\n return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))\n}\n\n/**\n * Checks whether an object has a safe Symbol.iterator — i.e. one that is\n * either own or inherited from a non-Object.prototype chain. This prevents\n * prototype-pollution attacks from injecting a fake iterator on\n * Object.prototype.\n * @param {object} obj\n * @returns {boolean}\n */\nfunction hasSafeIterator (obj) {\n const prototype = Object.getPrototypeOf(obj)\n const ownIterator = Object.hasOwn(obj, Symbol.iterator)\n return ownIterator || (prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === 'function')\n}\n\n/**\n * @param {Blob|Buffer|import ('stream').Stream} body\n * @returns {number|null}\n */\nfunction bodyLength (body) {\n if (body == null) {\n return 0\n } else if (isStream(body)) {\n const state = body._readableState\n return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length)\n ? state.length\n : null\n } else if (isBlobLike(body)) {\n return body.size != null ? body.size : null\n } else if (isBuffer(body)) {\n return body.byteLength\n }\n\n return null\n}\n\n/**\n * @param {import ('stream').Stream} body\n * @returns {boolean}\n */\nfunction isDestroyed (body) {\n return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body)))\n}\n\n/**\n * @param {import ('stream').Stream} stream\n * @param {Error} [err]\n * @returns {void}\n */\nfunction destroy (stream, err) {\n if (stream == null || !isStream(stream) || isDestroyed(stream)) {\n return\n }\n\n if (typeof stream.destroy === 'function') {\n if (Object.getPrototypeOf(stream).constructor === IncomingMessage) {\n // See: https://github.com/nodejs/node/pull/38505/files\n stream.socket = null\n }\n\n stream.destroy(err)\n } else if (err) {\n queueMicrotask(() => {\n stream.emit('error', err)\n })\n }\n\n if (stream.destroyed !== true) {\n stream[kDestroyed] = true\n }\n}\n\nconst KEEPALIVE_TIMEOUT_EXPR = /timeout=(\\d+)/\n/**\n * @param {string} val\n * @returns {number | null}\n */\nfunction parseKeepAliveTimeout (val) {\n const m = val.match(KEEPALIVE_TIMEOUT_EXPR)\n return m ? parseInt(m[1], 10) * 1000 : null\n}\n\n/**\n * Retrieves a header name and returns its lowercase value.\n * @param {string | Buffer} value Header name\n * @returns {string}\n */\nfunction headerNameToString (value) {\n return typeof value === 'string'\n ? headerNameLowerCasedRecord[value] ?? value.toLowerCase()\n : tree.lookup(value) ?? value.toString('latin1').toLowerCase()\n}\n\n/**\n * Receive the buffer as a string and return its lowercase value.\n * @param {Buffer} value Header name\n * @returns {string}\n */\nfunction bufferToLowerCasedHeaderName (value) {\n return tree.lookup(value) ?? value.toString('latin1').toLowerCase()\n}\n\n/**\n * @param {(Buffer | string)[]} headers\n * @param {Record} [obj]\n * @returns {Record}\n */\nfunction parseHeaders (headers, obj) {\n if (obj === undefined) obj = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headerNameToString(headers[i])\n let val = obj[key]\n\n if (val !== undefined) {\n if (!Object.hasOwn(obj, key)) {\n const headersValue = typeof headers[i + 1] === 'string'\n ? headers[i + 1]\n : Array.isArray(headers[i + 1])\n ? headers[i + 1].map(x => x.toString('latin1'))\n : headers[i + 1].toString('latin1')\n\n if (key === '__proto__') {\n Object.defineProperty(obj, key, {\n value: headersValue,\n enumerable: true,\n configurable: true,\n writable: true\n })\n } else {\n obj[key] = headersValue\n }\n } else {\n if (typeof val === 'string') {\n val = [val]\n obj[key] = val\n }\n val.push(headers[i + 1].toString('latin1'))\n }\n } else {\n const headersValue = typeof headers[i + 1] === 'string'\n ? headers[i + 1]\n : Array.isArray(headers[i + 1])\n ? headers[i + 1].map(x => x.toString('latin1'))\n : headers[i + 1].toString('latin1')\n\n obj[key] = headersValue\n }\n }\n\n return obj\n}\n\n/**\n * @param {Buffer[]} headers\n * @returns {string[]}\n */\nfunction parseRawHeaders (headers) {\n const headersLength = headers.length\n /**\n * @type {string[]}\n */\n const ret = new Array(headersLength)\n\n let key\n let val\n\n for (let n = 0; n < headersLength; n += 2) {\n key = headers[n]\n val = headers[n + 1]\n\n typeof key !== 'string' && (key = key.toString())\n typeof val !== 'string' && (val = val.toString('latin1'))\n\n ret[n] = key\n ret[n + 1] = val\n }\n\n return ret\n}\n\n/**\n * @param {Record} headers\n * @returns {Buffer[]}\n */\nfunction toRawHeaders (headers) {\n const rawHeaders = []\n\n for (const [name, value] of Object.entries(headers)) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n rawHeaders.push(Buffer.from(name, 'latin1'), Buffer.from(`${entry}`, 'latin1'))\n }\n } else {\n rawHeaders.push(Buffer.from(name, 'latin1'), Buffer.from(`${value}`, 'latin1'))\n }\n }\n\n return rawHeaders\n}\n\n/**\n * @param {string[]} headers\n * @param {Buffer[]} headers\n */\nfunction encodeRawHeaders (headers) {\n if (!Array.isArray(headers)) {\n throw new TypeError('expected headers to be an array')\n }\n return headers.map(x => Buffer.from(x))\n}\n\n/**\n * @param {*} buffer\n * @returns {buffer is Buffer}\n */\nfunction isBuffer (buffer) {\n // See, https://github.com/mcollina/undici/pull/319\n return buffer instanceof Uint8Array || Buffer.isBuffer(buffer)\n}\n\n/**\n * Asserts that the handler object is a request handler.\n *\n * @param {object} handler\n * @param {string} method\n * @param {string} [upgrade]\n * @returns {asserts handler is import('../api/api-request').RequestHandler}\n */\nfunction assertRequestHandler (handler, method, upgrade) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n if (typeof handler.onRequestStart !== 'function') {\n throw new InvalidArgumentError('invalid onRequestStart method')\n }\n\n if (typeof handler.onResponseError !== 'function') {\n throw new InvalidArgumentError('invalid onResponseError method')\n }\n\n if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) {\n throw new InvalidArgumentError('invalid onBodySent method')\n }\n\n if (typeof handler.onRequestSent !== 'function' && handler.onRequestSent !== undefined) {\n throw new InvalidArgumentError('invalid onRequestSent method')\n }\n\n if (upgrade || method === 'CONNECT') {\n if (typeof handler.onRequestUpgrade !== 'function') {\n throw new InvalidArgumentError('invalid onRequestUpgrade method')\n }\n } else {\n if (typeof handler.onResponseStart !== 'function') {\n throw new InvalidArgumentError('invalid onResponseStart method')\n }\n\n if (typeof handler.onResponseData !== 'function') {\n throw new InvalidArgumentError('invalid onResponseData method')\n }\n\n if (typeof handler.onResponseEnd !== 'function') {\n throw new InvalidArgumentError('invalid onResponseEnd method')\n }\n }\n}\n\n/**\n * A body is disturbed if it has been read from and it cannot be re-used without\n * losing state or data.\n * @param {import('node:stream').Readable} body\n * @returns {boolean}\n */\nfunction isDisturbed (body) {\n // TODO (fix): Why is body[kBodyUsed] needed?\n return !!(body && (stream.isDisturbed(body) || body[kBodyUsed]))\n}\n\n/**\n * @typedef {object} SocketInfo\n * @property {string} [localAddress]\n * @property {number} [localPort]\n * @property {string} [remoteAddress]\n * @property {number} [remotePort]\n * @property {string} [remoteFamily]\n * @property {number} [timeout]\n * @property {number} bytesWritten\n * @property {number} bytesRead\n */\n\n/**\n * @param {import('net').Socket} socket\n * @returns {SocketInfo}\n */\nfunction getSocketInfo (socket) {\n return {\n localAddress: socket.localAddress,\n localPort: socket.localPort,\n remoteAddress: socket.remoteAddress,\n remotePort: socket.remotePort,\n remoteFamily: socket.remoteFamily,\n timeout: socket.timeout,\n bytesWritten: socket.bytesWritten,\n bytesRead: socket.bytesRead\n }\n}\n\n/**\n * @param {Iterable} iterable\n * @returns {ReadableStream}\n */\nfunction ReadableStreamFrom (iterable) {\n // We cannot use ReadableStream.from here because it does not return a byte stream.\n\n let iterator\n return new ReadableStream(\n {\n start () {\n iterator = iterable[Symbol.asyncIterator]()\n },\n pull (controller) {\n return iterator.next().then(({ done, value }) => {\n if (done) {\n return queueMicrotask(() => {\n controller.close()\n controller.byobRequest?.respond(0)\n })\n } else {\n const buf = Buffer.isBuffer(value) ? value : Buffer.from(value)\n if (buf.byteLength) {\n return controller.enqueue(new Uint8Array(buf))\n } else {\n return this.pull(controller)\n }\n }\n })\n },\n cancel () {\n return iterator.return()\n },\n type: 'bytes'\n }\n )\n}\n\n/**\n * The object should be a FormData instance and contains all the required\n * methods.\n * @param {*} object\n * @returns {object is FormData}\n */\nfunction isFormDataLike (object) {\n return (\n object &&\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n object[Symbol.toStringTag] === 'FormData'\n )\n}\n\nfunction addAbortListener (signal, listener) {\n if ('addEventListener' in signal) {\n signal.addEventListener('abort', listener, { once: true })\n return () => signal.removeEventListener('abort', listener)\n }\n signal.once('abort', listener)\n return () => signal.removeListener('abort', listener)\n}\n\nconst validTokenChars = new Uint8Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0-15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32-47 (!\"#$%&'()*+,-./)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48-63 (0-9:;<=>?)\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64-79 (@A-O)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80-95 (P-Z[\\]^_)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96-111 (`a-o)\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112-127 (p-z{|}~)\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128-143\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144-159\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160-175\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176-191\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192-207\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208-223\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224-239\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240-255\n])\n\n/**\n * @see https://tools.ietf.org/html/rfc7230#section-3.2.6\n * @param {number} c\n * @returns {boolean}\n */\nfunction isTokenCharCode (c) {\n return (validTokenChars[c] === 1)\n}\n\nconst tokenRegExp = /^[\\^_`a-zA-Z\\-0-9!#$%&'*+.|~]+$/\n\n/**\n * @param {string} characters\n * @returns {boolean}\n */\nfunction isValidHTTPToken (characters) {\n if (characters.length >= 12) return tokenRegExp.test(characters)\n if (characters.length === 0) return false\n\n for (let i = 0; i < characters.length; i++) {\n if (validTokenChars[characters.charCodeAt(i)] !== 1) {\n return false\n }\n }\n return true\n}\n\n// headerCharRegex have been lifted from\n// https://github.com/nodejs/node/blob/main/lib/_http_common.js\n\n/**\n * Matches if val contains an invalid field-vchar\n * field-value = *( field-content / obs-fold )\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n */\nconst headerCharRegex = /[^\\t\\x20-\\x7e\\x80-\\xff]/\n\n/**\n * @param {string} characters\n * @returns {boolean}\n */\nfunction isValidHeaderValue (characters) {\n return !headerCharRegex.test(characters)\n}\n\nconst rangeHeaderRegex = /^bytes (\\d+)-(\\d+)\\/(\\d+)?$/\n\n/**\n * @typedef {object} RangeHeader\n * @property {number} start\n * @property {number | null} end\n * @property {number | null} size\n */\n\n/**\n * Parse accordingly to RFC 9110\n * @see https://www.rfc-editor.org/rfc/rfc9110#field.content-range\n * @param {string} [range]\n * @returns {RangeHeader|null}\n */\nfunction parseRangeHeader (range) {\n if (range == null || range === '') return { start: 0, end: null, size: null }\n\n const m = range ? range.match(rangeHeaderRegex) : null\n return m\n ? {\n start: parseInt(m[1]),\n end: m[2] ? parseInt(m[2]) : null,\n size: m[3] ? parseInt(m[3]) : null\n }\n : null\n}\n\n/**\n * @template {import(\"events\").EventEmitter} T\n * @param {T} obj\n * @param {string} name\n * @param {(...args: any[]) => void} listener\n * @returns {T}\n */\nfunction addListener (obj, name, listener) {\n const listeners = (obj[kListeners] ??= [])\n listeners.push([name, listener])\n obj.on(name, listener)\n return obj\n}\n\n/**\n * @template {import(\"events\").EventEmitter} T\n * @param {T} obj\n * @returns {T}\n */\nfunction removeAllListeners (obj) {\n if (obj[kListeners] != null) {\n for (const [name, listener] of obj[kListeners]) {\n obj.removeListener(name, listener)\n }\n obj[kListeners] = null\n }\n return obj\n}\n\n/**\n * @param {import ('../dispatcher/client')} client\n * @param {import ('../core/request')} request\n * @param {Error} err\n */\nfunction errorRequest (client, request, err) {\n try {\n request.onResponseError(err)\n assert(request.aborted)\n } catch (err) {\n client.emit('error', err)\n }\n}\n\n/**\n * @param {WeakRef} socketWeakRef\n * @param {object} opts\n * @param {number} opts.timeout\n * @param {string} opts.hostname\n * @param {number} opts.port\n * @returns {() => void}\n */\nconst setupConnectTimeout = process.platform === 'win32'\n ? (socketWeakRef, opts) => {\n if (!opts.timeout) {\n return noop\n }\n\n let s1 = null\n let s2 = null\n const fastTimer = timers.setFastTimeout(() => {\n // setImmediate is added to make sure that we prioritize socket error events over timeouts\n s1 = setImmediate(() => {\n // Windows needs an extra setImmediate probably due to implementation differences in the socket logic\n s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts))\n })\n }, opts.timeout)\n return () => {\n timers.clearFastTimeout(fastTimer)\n clearImmediate(s1)\n clearImmediate(s2)\n }\n }\n : (socketWeakRef, opts) => {\n if (!opts.timeout) {\n return noop\n }\n\n let s1 = null\n const fastTimer = timers.setFastTimeout(() => {\n // setImmediate is added to make sure that we prioritize socket error events over timeouts\n s1 = setImmediate(() => {\n onConnectTimeout(socketWeakRef.deref(), opts)\n })\n }, opts.timeout)\n return () => {\n timers.clearFastTimeout(fastTimer)\n clearImmediate(s1)\n }\n }\n\n/**\n * @param {net.Socket} socket\n * @param {object} opts\n * @param {number} opts.timeout\n * @param {string} opts.hostname\n * @param {number} opts.port\n */\nfunction onConnectTimeout (socket, opts) {\n // The socket could be already garbage collected\n if (socket == null) {\n return\n }\n\n let message = 'Connect Timeout Error'\n if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {\n message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`\n } else {\n message += ` (attempted address: ${opts.hostname}:${opts.port},`\n }\n\n message += ` timeout: ${opts.timeout}ms)`\n\n destroy(socket, new ConnectTimeoutError(message))\n}\n\n/**\n * @param {string} urlString\n * @returns {string}\n */\nfunction getProtocolFromUrlString (urlString) {\n if (\n urlString[0] === 'h' &&\n urlString[1] === 't' &&\n urlString[2] === 't' &&\n urlString[3] === 'p'\n ) {\n switch (urlString[4]) {\n case ':':\n return 'http:'\n case 's':\n if (urlString[5] === ':') {\n return 'https:'\n }\n }\n }\n // fallback if none of the usual suspects\n return urlString.slice(0, urlString.indexOf(':') + 1)\n}\n\nconst kEnumerableProperty = Object.create(null)\nkEnumerableProperty.enumerable = true\n\nconst normalizedMethodRecordsBase = {\n delete: 'DELETE',\n DELETE: 'DELETE',\n get: 'GET',\n GET: 'GET',\n head: 'HEAD',\n HEAD: 'HEAD',\n options: 'OPTIONS',\n OPTIONS: 'OPTIONS',\n post: 'POST',\n POST: 'POST',\n put: 'PUT',\n PUT: 'PUT'\n}\n\nconst normalizedMethodRecords = {\n ...normalizedMethodRecordsBase,\n patch: 'patch',\n PATCH: 'PATCH'\n}\n\n// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.\nObject.setPrototypeOf(normalizedMethodRecordsBase, null)\nObject.setPrototypeOf(normalizedMethodRecords, null)\n\nmodule.exports = {\n kEnumerableProperty,\n isDisturbed,\n isBlobLike,\n parseOrigin,\n parseURL,\n getServerName,\n isStream,\n isIterable,\n hasSafeIterator,\n isAsyncIterable,\n isDestroyed,\n headerNameToString,\n bufferToLowerCasedHeaderName,\n addListener,\n removeAllListeners,\n errorRequest,\n parseRawHeaders,\n toRawHeaders,\n encodeRawHeaders,\n parseHeaders,\n parseKeepAliveTimeout,\n destroy,\n bodyLength,\n deepClone,\n ReadableStreamFrom,\n isBuffer,\n assertRequestHandler,\n getSocketInfo,\n isFormDataLike,\n pathHasQueryOrFragment,\n serializePathWithQuery,\n addAbortListener,\n isValidHTTPToken,\n isValidHeaderValue,\n isTokenCharCode,\n parseRangeHeader,\n normalizedMethodRecordsBase,\n normalizedMethodRecords,\n isValidPort,\n isHttpOrHttpsPrefixed,\n safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']),\n wrapRequestBody,\n setupConnectTimeout,\n getProtocolFromUrlString\n}\n","'use strict'\n\nconst {\n kConnected,\n kPending,\n kRunning,\n kSize,\n kFree,\n kQueued\n} = require('../core/symbols')\n\nclass ClientStats {\n constructor (client) {\n this.connected = client[kConnected]\n this.pending = client[kPending]\n this.running = client[kRunning]\n this.size = client[kSize]\n }\n}\n\nclass PoolStats {\n constructor (pool) {\n this.connected = pool[kConnected]\n this.free = pool[kFree]\n this.pending = pool[kPending]\n this.queued = pool[kQueued]\n this.running = pool[kRunning]\n this.size = pool[kSize]\n }\n}\n\nmodule.exports = { ClientStats, PoolStats }\n","'use strict'\n\nconst diagnosticsChannel = require('node:diagnostics_channel')\nconst util = require('node:util')\n\nconst undiciDebugLog = util.debuglog('undici')\nconst fetchDebuglog = util.debuglog('fetch')\nconst websocketDebuglog = util.debuglog('websocket')\n\nconst channels = {\n // Client\n beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'),\n connected: diagnosticsChannel.channel('undici:client:connected'),\n connectError: diagnosticsChannel.channel('undici:client:connectError'),\n sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'),\n // Request\n create: diagnosticsChannel.channel('undici:request:create'),\n bodySent: diagnosticsChannel.channel('undici:request:bodySent'),\n bodyChunkSent: diagnosticsChannel.channel('undici:request:bodyChunkSent'),\n bodyChunkReceived: diagnosticsChannel.channel('undici:request:bodyChunkReceived'),\n headers: diagnosticsChannel.channel('undici:request:headers'),\n trailers: diagnosticsChannel.channel('undici:request:trailers'),\n error: diagnosticsChannel.channel('undici:request:error'),\n // WebSocket\n open: diagnosticsChannel.channel('undici:websocket:open'),\n close: diagnosticsChannel.channel('undici:websocket:close'),\n socketError: diagnosticsChannel.channel('undici:websocket:socket_error'),\n ping: diagnosticsChannel.channel('undici:websocket:ping'),\n pong: diagnosticsChannel.channel('undici:websocket:pong'),\n // ProxyAgent\n proxyConnected: diagnosticsChannel.channel('undici:proxy:connected')\n}\n\nlet isTrackingClientEvents = false\n\nfunction trackClientEvents (debugLog = undiciDebugLog) {\n if (isTrackingClientEvents) {\n return\n }\n\n // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n // This can happen when both Node.js built-in undici and undici as a dependency are present\n if (channels.beforeConnect.hasSubscribers || channels.connected.hasSubscribers ||\n channels.connectError.hasSubscribers || channels.sendHeaders.hasSubscribers) {\n isTrackingClientEvents = true\n return\n }\n\n isTrackingClientEvents = true\n\n diagnosticsChannel.subscribe('undici:client:beforeConnect',\n evt => {\n const {\n connectParams: { version, protocol, port, host }\n } = evt\n debugLog(\n 'connecting to %s%s using %s%s',\n host,\n port ? `:${port}` : '',\n protocol,\n version\n )\n })\n\n diagnosticsChannel.subscribe('undici:client:connected',\n evt => {\n const {\n connectParams: { version, protocol, port, host }\n } = evt\n debugLog(\n 'connected to %s%s using %s%s',\n host,\n port ? `:${port}` : '',\n protocol,\n version\n )\n })\n\n diagnosticsChannel.subscribe('undici:client:connectError',\n evt => {\n const {\n connectParams: { version, protocol, port, host },\n error\n } = evt\n debugLog(\n 'connection to %s%s using %s%s errored - %s',\n host,\n port ? `:${port}` : '',\n protocol,\n version,\n error.message\n )\n })\n\n diagnosticsChannel.subscribe('undici:client:sendHeaders',\n evt => {\n const {\n request: { method, path, origin }\n } = evt\n debugLog('sending request to %s %s%s', method, origin, path)\n })\n}\n\nlet isTrackingRequestEvents = false\n\nfunction trackRequestEvents (debugLog = undiciDebugLog) {\n if (isTrackingRequestEvents) {\n return\n }\n\n // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n // This can happen when both Node.js built-in undici and undici as a dependency are present\n if (channels.headers.hasSubscribers || channels.trailers.hasSubscribers ||\n channels.error.hasSubscribers) {\n isTrackingRequestEvents = true\n return\n }\n\n isTrackingRequestEvents = true\n\n diagnosticsChannel.subscribe('undici:request:headers',\n evt => {\n const {\n request: { method, path, origin },\n response: { statusCode }\n } = evt\n debugLog(\n 'received response to %s %s%s - HTTP %d',\n method,\n origin,\n path,\n statusCode\n )\n })\n\n diagnosticsChannel.subscribe('undici:request:trailers',\n evt => {\n const {\n request: { method, path, origin }\n } = evt\n debugLog('trailers received from %s %s%s', method, origin, path)\n })\n\n diagnosticsChannel.subscribe('undici:request:error',\n evt => {\n const {\n request: { method, path, origin },\n error\n } = evt\n debugLog(\n 'request to %s %s%s errored - %s',\n method,\n origin,\n path,\n error.message\n )\n })\n}\n\nlet isTrackingWebSocketEvents = false\n\nfunction trackWebSocketEvents (debugLog = websocketDebuglog) {\n if (isTrackingWebSocketEvents) {\n return\n }\n\n // Check if any of the channels already have subscribers to prevent duplicate subscriptions\n // This can happen when both Node.js built-in undici and undici as a dependency are present\n if (channels.open.hasSubscribers || channels.close.hasSubscribers ||\n channels.socketError.hasSubscribers || channels.ping.hasSubscribers ||\n channels.pong.hasSubscribers) {\n isTrackingWebSocketEvents = true\n return\n }\n\n isTrackingWebSocketEvents = true\n\n diagnosticsChannel.subscribe('undici:websocket:open',\n evt => {\n if (evt.address != null) {\n const { address, port } = evt.address\n debugLog('connection opened %s%s', address, port ? `:${port}` : '')\n } else {\n debugLog('connection opened')\n }\n })\n\n diagnosticsChannel.subscribe('undici:websocket:close',\n evt => {\n const { websocket, code, reason } = evt\n debugLog(\n 'closed connection to %s - %s %s',\n websocket.url,\n code,\n reason\n )\n })\n\n diagnosticsChannel.subscribe('undici:websocket:socket_error',\n err => {\n debugLog('connection errored - %s', err.message)\n })\n\n diagnosticsChannel.subscribe('undici:websocket:ping',\n evt => {\n debugLog('ping received')\n })\n\n diagnosticsChannel.subscribe('undici:websocket:pong',\n evt => {\n debugLog('pong received')\n })\n}\n\nif (undiciDebugLog.enabled || fetchDebuglog.enabled) {\n trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)\n trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)\n}\n\nif (websocketDebuglog.enabled) {\n trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog)\n trackWebSocketEvents(websocketDebuglog)\n}\n\nmodule.exports = {\n channels\n}\n","'use strict'\n\nconst {\n InvalidArgumentError,\n NotSupportedError\n} = require('./errors')\nconst assert = require('node:assert')\nconst {\n isValidHTTPToken,\n isValidHeaderValue,\n isStream,\n destroy,\n isBuffer,\n isFormDataLike,\n isIterable,\n hasSafeIterator,\n isBlobLike,\n serializePathWithQuery,\n parseHeaders,\n assertRequestHandler,\n getServerName,\n normalizedMethodRecords,\n getProtocolFromUrlString\n} = require('./util')\nconst { channels } = require('./diagnostics.js')\nconst { headerNameLowerCasedRecord } = require('./constants')\n\n// Verifies that a given path is valid does not contain control chars \\x00 to \\x20\nconst invalidPathRegex = /[^\\u0021-\\u00ff]/\n\nconst kHandler = Symbol('handler')\nconst kController = Symbol('controller')\nconst kResume = Symbol('resume')\n\nclass RequestController {\n #paused = false\n #reason = null\n #aborted = false\n #abort\n\n [kResume] = null\n\n rawHeaders = null\n rawTrailers = null\n\n constructor (abort) {\n this.#abort = abort\n }\n\n pause () {\n this.#paused = true\n }\n\n resume () {\n if (this.#paused) {\n this.#paused = false\n this[kResume]?.()\n }\n }\n\n abort (reason) {\n if (!this.#aborted) {\n this.#aborted = true\n this.#reason = reason\n this.#abort(reason)\n }\n }\n\n get aborted () {\n return this.#aborted\n }\n\n get reason () {\n return this.#reason\n }\n\n get paused () {\n return this.#paused\n }\n}\n\nclass Request {\n constructor (origin, {\n path,\n method,\n body,\n headers,\n query,\n idempotent,\n blocking,\n upgrade,\n headersTimeout,\n bodyTimeout,\n reset,\n expectContinue,\n servername,\n throwOnError,\n maxRedirections,\n typeOfService\n }, handler) {\n if (typeof path !== 'string') {\n throw new InvalidArgumentError('path must be a string')\n } else if (\n path[0] !== '/' &&\n !(path.startsWith('http://') || path.startsWith('https://')) &&\n method !== 'CONNECT'\n ) {\n throw new InvalidArgumentError('path must be an absolute URL or start with a slash')\n } else if (invalidPathRegex.test(path)) {\n throw new InvalidArgumentError('invalid request path')\n }\n\n if (typeof method !== 'string') {\n throw new InvalidArgumentError('method must be a string')\n } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) {\n throw new InvalidArgumentError('invalid request method')\n }\n\n if (upgrade && typeof upgrade !== 'string') {\n throw new InvalidArgumentError('upgrade must be a string')\n }\n\n if (upgrade && !isValidHeaderValue(upgrade)) {\n throw new InvalidArgumentError('invalid upgrade header')\n }\n\n if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('invalid headersTimeout')\n }\n\n if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('invalid bodyTimeout')\n }\n\n if (reset != null && typeof reset !== 'boolean') {\n throw new InvalidArgumentError('invalid reset')\n }\n\n if (expectContinue != null && typeof expectContinue !== 'boolean') {\n throw new InvalidArgumentError('invalid expectContinue')\n }\n\n if (throwOnError != null) {\n throw new InvalidArgumentError('invalid throwOnError')\n }\n\n if (maxRedirections != null && maxRedirections !== 0) {\n throw new InvalidArgumentError('maxRedirections is not supported, use the redirect interceptor')\n }\n\n if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) {\n throw new InvalidArgumentError('typeOfService must be an integer between 0 and 255')\n }\n\n this.headersTimeout = headersTimeout\n\n this.bodyTimeout = bodyTimeout\n\n this.method = method\n\n this.typeOfService = typeOfService ?? 0\n\n this.abort = null\n\n if (body == null) {\n this.body = null\n } else if (isStream(body)) {\n this.body = body\n\n const rState = this.body._readableState\n if (!rState || !rState.autoDestroy) {\n this.endHandler = function autoDestroy () {\n destroy(this)\n }\n this.body.on('end', this.endHandler)\n }\n\n this.errorHandler = err => {\n if (this.abort) {\n this.abort(err)\n } else {\n this.error = err\n }\n }\n this.body.on('error', this.errorHandler)\n } else if (isBuffer(body)) {\n this.body = body.byteLength ? body : null\n } else if (ArrayBuffer.isView(body)) {\n this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null\n } else if (body instanceof ArrayBuffer) {\n this.body = body.byteLength ? Buffer.from(body) : null\n } else if (typeof body === 'string') {\n this.body = body.length ? Buffer.from(body) : null\n } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) {\n this.body = body\n } else {\n throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable')\n }\n\n this.completed = false\n this.aborted = false\n\n this.upgrade = upgrade || null\n\n this.path = query ? serializePathWithQuery(path, query) : path\n\n // TODO: shall we maybe standardize it to an URL object?\n this.origin = origin\n\n this.protocol = getProtocolFromUrlString(origin)\n\n this.idempotent = idempotent == null\n ? method === 'HEAD' || method === 'GET'\n : idempotent\n\n this.blocking = blocking ?? this.method !== 'HEAD'\n\n this.reset = reset == null ? null : reset\n\n this.host = null\n\n this.contentLength = null\n\n this.contentType = null\n\n this.headers = []\n\n // Only for H2\n this.expectContinue = expectContinue != null ? expectContinue : false\n\n if (Array.isArray(headers)) {\n if (headers.length % 2 !== 0) {\n throw new InvalidArgumentError('headers array must be even')\n }\n for (let i = 0; i < headers.length; i += 2) {\n processHeader(this, headers[i], headers[i + 1])\n }\n } else if (headers && typeof headers === 'object') {\n if (hasSafeIterator(headers)) {\n for (const header of headers) {\n if (!Array.isArray(header) || header.length !== 2) {\n throw new InvalidArgumentError('headers must be in key-value pair format')\n }\n processHeader(this, header[0], header[1])\n }\n } else {\n const keys = Object.keys(headers)\n for (let i = 0; i < keys.length; ++i) {\n processHeader(this, keys[i], headers[keys[i]])\n }\n }\n } else if (headers != null) {\n throw new InvalidArgumentError('headers must be an object or an array')\n }\n\n assertRequestHandler(handler, method, upgrade)\n\n this.servername = servername || getServerName(this.host) || null\n\n this[kHandler] = handler\n\n if (channels.create.hasSubscribers) {\n channels.create.publish({ request: this })\n }\n }\n\n onBodySent (chunk) {\n if (channels.bodyChunkSent.hasSubscribers) {\n channels.bodyChunkSent.publish({ request: this, chunk })\n }\n if (this[kHandler].onBodySent) {\n try {\n return this[kHandler].onBodySent(chunk)\n } catch (err) {\n this.abort(err)\n }\n }\n }\n\n onRequestSent () {\n if (channels.bodySent.hasSubscribers) {\n channels.bodySent.publish({ request: this })\n }\n\n if (this[kHandler].onRequestSent) {\n try {\n return this[kHandler].onRequestSent()\n } catch (err) {\n this.abort(err)\n }\n }\n }\n\n onRequestStart (abort, context) {\n assert(!this.aborted)\n assert(!this.completed)\n\n this[kController] = new RequestController(abort)\n\n if (this.error) {\n this[kController].abort(this.error)\n return\n }\n\n this.abort = abort\n return this[kHandler].onRequestStart(this[kController], context)\n }\n\n onResponseStarted () {\n return this[kHandler].onResponseStarted?.()\n }\n\n onResponseStart (statusCode, headers, resume, statusText) {\n assert(!this.aborted)\n assert(!this.completed)\n\n if (channels.headers.hasSubscribers) {\n channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })\n }\n\n const controller = this[kController]\n if (controller) {\n controller[kResume] = resume\n controller.rawHeaders = headers\n }\n\n const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers\n\n try {\n this[kHandler].onResponseStart?.(controller, statusCode, parsedHeaders, statusText)\n return !controller?.paused\n } catch (err) {\n this.abort(err)\n return false\n }\n }\n\n onResponseData (chunk) {\n assert(!this.aborted)\n assert(!this.completed)\n\n if (channels.bodyChunkReceived.hasSubscribers) {\n channels.bodyChunkReceived.publish({ request: this, chunk })\n }\n\n const controller = this[kController]\n try {\n this[kHandler].onResponseData?.(controller, chunk)\n return !controller?.paused\n } catch (err) {\n this.abort(err)\n return false\n }\n }\n\n onRequestUpgrade (statusCode, headers, socket) {\n assert(!this.aborted)\n assert(!this.completed)\n\n const controller = this[kController]\n if (controller) {\n controller.rawHeaders = headers\n }\n\n const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers\n\n return this[kHandler].onRequestUpgrade?.(controller, statusCode, parsedHeaders, socket)\n }\n\n onResponseEnd (trailers) {\n this.onFinally()\n\n assert(!this.aborted)\n assert(!this.completed)\n\n this.completed = true\n if (channels.trailers.hasSubscribers) {\n channels.trailers.publish({ request: this, trailers })\n }\n\n const controller = this[kController]\n if (controller) {\n controller.rawTrailers = trailers\n }\n\n const parsedTrailers = Array.isArray(trailers) ? parseHeaders(trailers) : trailers\n\n try {\n return this[kHandler].onResponseEnd?.(controller, parsedTrailers)\n } catch (err) {\n // TODO (fix): This might be a bad idea?\n this.onResponseError(err)\n }\n }\n\n onResponseError (error) {\n this.onFinally()\n\n if (channels.error.hasSubscribers) {\n channels.error.publish({ request: this, error })\n }\n\n if (this.aborted) {\n return\n }\n this.aborted = true\n\n const controller = this[kController]\n\n return this[kHandler].onResponseError?.(controller, error)\n }\n\n onFinally () {\n if (this.errorHandler) {\n this.body.off('error', this.errorHandler)\n this.errorHandler = null\n }\n\n if (this.endHandler) {\n this.body.off('end', this.endHandler)\n this.endHandler = null\n }\n }\n\n addHeader (key, value) {\n processHeader(this, key, value)\n return this\n }\n}\n\nfunction processHeader (request, key, val) {\n if (val && (typeof val === 'object' && !Array.isArray(val))) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n } else if (val === undefined) {\n return\n }\n\n let headerName = headerNameLowerCasedRecord[key]\n\n if (headerName === undefined) {\n headerName = key.toLowerCase()\n if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) {\n throw new InvalidArgumentError('invalid header key')\n }\n }\n\n if (Array.isArray(val)) {\n const arr = []\n for (let i = 0; i < val.length; i++) {\n if (typeof val[i] === 'string') {\n if (!isValidHeaderValue(val[i])) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n arr.push(val[i])\n } else if (val[i] === null) {\n arr.push('')\n } else if (typeof val[i] === 'object') {\n throw new InvalidArgumentError(`invalid ${key} header`)\n } else {\n arr.push(`${val[i]}`)\n }\n }\n val = arr\n } else if (typeof val === 'string') {\n if (!isValidHeaderValue(val)) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n } else if (val === null) {\n val = ''\n } else {\n val = `${val}`\n }\n\n if (headerName === 'host') {\n if (request.host !== null) {\n throw new InvalidArgumentError('duplicate host header')\n }\n if (typeof val !== 'string') {\n throw new InvalidArgumentError('invalid host header')\n }\n // Consumed by Client\n request.host = val\n } else if (headerName === 'content-length') {\n if (request.contentLength !== null) {\n throw new InvalidArgumentError('duplicate content-length header')\n }\n request.contentLength = parseInt(val, 10)\n if (!Number.isFinite(request.contentLength)) {\n throw new InvalidArgumentError('invalid content-length header')\n }\n } else if (request.contentType === null && headerName === 'content-type') {\n request.contentType = val\n request.headers.push(key, val)\n } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') {\n throw new InvalidArgumentError(`invalid ${headerName} header`)\n } else if (headerName === 'connection') {\n // Per RFC 7230 Section 6.1, Connection header can contain\n // a comma-separated list of connection option tokens (header names)\n const value = typeof val === 'string' ? val : null\n if (value === null) {\n throw new InvalidArgumentError('invalid connection header')\n }\n\n for (const token of value.toLowerCase().split(',')) {\n const trimmed = token.trim()\n if (!isValidHTTPToken(trimmed)) {\n throw new InvalidArgumentError('invalid connection header')\n }\n if (trimmed === 'close') {\n request.reset = true\n }\n }\n } else if (headerName === 'expect') {\n throw new NotSupportedError('expect header not supported')\n } else {\n request.headers.push(key, val)\n }\n}\n\nmodule.exports = Request\n","'use strict'\nconst EventEmitter = require('node:events')\n\nclass Dispatcher extends EventEmitter {\n dispatch () {\n throw new Error('not implemented')\n }\n\n close () {\n throw new Error('not implemented')\n }\n\n destroy () {\n throw new Error('not implemented')\n }\n\n compose (...args) {\n // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...\n const interceptors = Array.isArray(args[0]) ? args[0] : args\n let dispatch = this.dispatch.bind(this)\n\n for (const interceptor of interceptors) {\n if (interceptor == null) {\n continue\n }\n\n if (typeof interceptor !== 'function') {\n throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)\n }\n\n dispatch = interceptor(dispatch)\n\n if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {\n throw new TypeError('invalid interceptor')\n }\n }\n\n return new Proxy(this, {\n get: (target, key) => key === 'dispatch' ? dispatch : target[key]\n })\n }\n}\n\nmodule.exports = Dispatcher\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst {\n ClientDestroyedError,\n ClientClosedError,\n InvalidArgumentError\n} = require('../core/errors')\nconst { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require('../core/symbols')\n\nconst kOnDestroyed = Symbol('onDestroyed')\nconst kOnClosed = Symbol('onClosed')\nconst kWebSocketOptions = Symbol('webSocketOptions')\n\nclass DispatcherBase extends Dispatcher {\n /** @type {boolean} */\n [kDestroyed] = false;\n\n /** @type {Array|null} */\n [kOnClosed] = null\n\n /**\n * @param {import('../../types/dispatcher').DispatcherOptions} [opts]\n */\n constructor (opts) {\n super()\n this[kWebSocketOptions] = opts?.webSocket ?? {}\n }\n\n /**\n * @returns {import('../../types/dispatcher').WebSocketOptions}\n */\n get webSocketOptions () {\n return {\n maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 // 128 MB default\n }\n }\n\n /** @returns {boolean} */\n get destroyed () {\n return this[kDestroyed]\n }\n\n /** @returns {boolean} */\n get closed () {\n return this[kClosed]\n }\n\n close (callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.close((err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n const err = new ClientDestroyedError()\n queueMicrotask(() => callback(err, null))\n return\n }\n\n if (this[kClosed]) {\n if (this[kOnClosed]) {\n this[kOnClosed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n this[kClosed] = true\n this[kOnClosed] ??= []\n this[kOnClosed].push(callback)\n\n const onClosed = () => {\n const callbacks = this[kOnClosed]\n this[kOnClosed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kClose]()\n .then(() => this.destroy())\n .then(() => queueMicrotask(onClosed))\n }\n\n destroy (err, callback) {\n if (typeof err === 'function') {\n callback = err\n err = null\n }\n\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.destroy(err, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n if (this[kOnDestroyed]) {\n this[kOnDestroyed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n if (!err) {\n err = new ClientDestroyedError()\n }\n\n this[kDestroyed] = true\n this[kOnDestroyed] ??= []\n this[kOnDestroyed].push(callback)\n\n const onDestroyed = () => {\n const callbacks = this[kOnDestroyed]\n this[kOnDestroyed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kDestroy](err)\n .then(() => queueMicrotask(onDestroyed))\n }\n\n dispatch (opts, handler) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n try {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object.')\n }\n\n if (opts.dispatcher) {\n throw new InvalidArgumentError('opts.dispatcher is not supported by instance methods. Pass opts.dispatcher to the top-level undici functions or call the dispatcher instance method directly.')\n }\n\n if (this[kDestroyed] || this[kOnDestroyed]) {\n throw new ClientDestroyedError()\n }\n\n if (this[kClosed]) {\n throw new ClientClosedError()\n }\n\n return this[kDispatch](opts, handler)\n } catch (err) {\n if (typeof handler.onResponseError !== 'function') {\n throw err\n }\n\n handler.onResponseError(null, err)\n\n return false\n }\n }\n}\n\nmodule.exports = DispatcherBase\n","'use strict'\n\nconst net = require('node:net')\nconst assert = require('node:assert')\nconst util = require('./util')\nconst { InvalidArgumentError } = require('./errors')\n\nlet tls // include tls conditionally since it is not always available\n\n// TODO: session re-use does not wait for the first\n// connection to resolve the session and might therefore\n// resolve the same servername multiple times even when\n// re-use is enabled.\n\nconst SessionCache = class WeakSessionCache {\n constructor (maxCachedSessions) {\n this._maxCachedSessions = maxCachedSessions\n this._sessionCache = new Map()\n this._sessionRegistry = new FinalizationRegistry((key) => {\n if (this._sessionCache.size < this._maxCachedSessions) {\n return\n }\n\n const ref = this._sessionCache.get(key)\n if (ref !== undefined && ref.deref() === undefined) {\n this._sessionCache.delete(key)\n }\n })\n }\n\n get (sessionKey) {\n const ref = this._sessionCache.get(sessionKey)\n return ref ? ref.deref() : null\n }\n\n set (sessionKey, session) {\n if (this._maxCachedSessions === 0) {\n return\n }\n\n this._sessionCache.set(sessionKey, new WeakRef(session))\n this._sessionRegistry.register(session, sessionKey)\n }\n}\n\nfunction buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {\n if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {\n throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')\n }\n\n const options = { path: socketPath, ...opts }\n const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)\n timeout = timeout == null ? 10e3 : timeout\n allowH2 = allowH2 != null ? allowH2 : true\n return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {\n let socket\n if (protocol === 'https:') {\n if (!tls) {\n tls = require('node:tls')\n }\n servername = servername || options.servername || util.getServerName(host) || null\n\n const sessionKey = servername || hostname\n assert(sessionKey)\n\n const session = customSession || sessionCache.get(sessionKey) || null\n\n port = port || 443\n\n socket = tls.connect({\n highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...\n ...options,\n servername,\n session,\n localAddress,\n ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],\n socket: httpSocket, // upgrade socket connection\n port,\n host: hostname\n })\n\n socket\n .on('session', function (session) {\n // TODO (fix): Can a session become invalid once established? Don't think so?\n sessionCache.set(sessionKey, session)\n })\n } else {\n assert(!httpSocket, 'httpSocket can only be sent on TLS update')\n\n port = port || 80\n\n socket = net.connect({\n highWaterMark: 64 * 1024, // Same as nodejs fs streams.\n ...options,\n localAddress,\n port,\n host: hostname\n })\n if (useH2c === true) {\n socket.alpnProtocol = 'h2'\n }\n }\n\n // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket\n if (options.keepAlive == null || options.keepAlive) {\n const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay\n socket.setKeepAlive(true, keepAliveInitialDelay)\n }\n\n const clearConnectTimeout = util.setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port })\n\n socket\n .setNoDelay(true)\n .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {\n queueMicrotask(clearConnectTimeout)\n\n if (callback) {\n const cb = callback\n callback = null\n cb(null, this)\n }\n })\n .on('error', function (err) {\n queueMicrotask(clearConnectTimeout)\n\n if (callback) {\n const cb = callback\n callback = null\n cb(err)\n }\n })\n\n return socket\n }\n}\n\nmodule.exports = buildConnector\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.enumToMap = enumToMap;\nfunction enumToMap(obj, filter = [], exceptions = []) {\n const emptyFilter = (filter?.length ?? 0) === 0;\n const emptyExceptions = (exceptions?.length ?? 0) === 0;\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => {\n return (typeof value === 'number' &&\n (emptyFilter || filter.includes(value)) &&\n (emptyExceptions || !exceptions.includes(value)));\n }));\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SPECIAL_HEADERS = exports.MINOR = exports.MAJOR = exports.HTAB_SP_VCHAR_OBS_TEXT = exports.QUOTED_STRING = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.HEX = exports.URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.STATUSES_HTTP = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.HEADER_STATE = exports.FINISH = exports.STATUSES = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0;\nconst utils_1 = require(\"./utils\");\n// Emums\nexports.ERROR = {\n OK: 0,\n INTERNAL: 1,\n STRICT: 2,\n CR_EXPECTED: 25,\n LF_EXPECTED: 3,\n UNEXPECTED_CONTENT_LENGTH: 4,\n UNEXPECTED_SPACE: 30,\n CLOSED_CONNECTION: 5,\n INVALID_METHOD: 6,\n INVALID_URL: 7,\n INVALID_CONSTANT: 8,\n INVALID_VERSION: 9,\n INVALID_HEADER_TOKEN: 10,\n INVALID_CONTENT_LENGTH: 11,\n INVALID_CHUNK_SIZE: 12,\n INVALID_STATUS: 13,\n INVALID_EOF_STATE: 14,\n INVALID_TRANSFER_ENCODING: 15,\n CB_MESSAGE_BEGIN: 16,\n CB_HEADERS_COMPLETE: 17,\n CB_MESSAGE_COMPLETE: 18,\n CB_CHUNK_HEADER: 19,\n CB_CHUNK_COMPLETE: 20,\n PAUSED: 21,\n PAUSED_UPGRADE: 22,\n PAUSED_H2_UPGRADE: 23,\n USER: 24,\n CB_URL_COMPLETE: 26,\n CB_STATUS_COMPLETE: 27,\n CB_METHOD_COMPLETE: 32,\n CB_VERSION_COMPLETE: 33,\n CB_HEADER_FIELD_COMPLETE: 28,\n CB_HEADER_VALUE_COMPLETE: 29,\n CB_CHUNK_EXTENSION_NAME_COMPLETE: 34,\n CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35,\n CB_RESET: 31,\n CB_PROTOCOL_COMPLETE: 38,\n};\nexports.TYPE = {\n BOTH: 0, // default\n REQUEST: 1,\n RESPONSE: 2,\n};\nexports.FLAGS = {\n CONNECTION_KEEP_ALIVE: 1 << 0,\n CONNECTION_CLOSE: 1 << 1,\n CONNECTION_UPGRADE: 1 << 2,\n CHUNKED: 1 << 3,\n UPGRADE: 1 << 4,\n CONTENT_LENGTH: 1 << 5,\n SKIPBODY: 1 << 6,\n TRAILING: 1 << 7,\n // 1 << 8 is unused\n TRANSFER_ENCODING: 1 << 9,\n};\nexports.LENIENT_FLAGS = {\n HEADERS: 1 << 0,\n CHUNKED_LENGTH: 1 << 1,\n KEEP_ALIVE: 1 << 2,\n TRANSFER_ENCODING: 1 << 3,\n VERSION: 1 << 4,\n DATA_AFTER_CLOSE: 1 << 5,\n OPTIONAL_LF_AFTER_CR: 1 << 6,\n OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7,\n OPTIONAL_CR_BEFORE_LF: 1 << 8,\n SPACES_AFTER_CHUNK_SIZE: 1 << 9,\n};\nexports.METHODS = {\n 'DELETE': 0,\n 'GET': 1,\n 'HEAD': 2,\n 'POST': 3,\n 'PUT': 4,\n /* pathological */\n 'CONNECT': 5,\n 'OPTIONS': 6,\n 'TRACE': 7,\n /* WebDAV */\n 'COPY': 8,\n 'LOCK': 9,\n 'MKCOL': 10,\n 'MOVE': 11,\n 'PROPFIND': 12,\n 'PROPPATCH': 13,\n 'SEARCH': 14,\n 'UNLOCK': 15,\n 'BIND': 16,\n 'REBIND': 17,\n 'UNBIND': 18,\n 'ACL': 19,\n /* subversion */\n 'REPORT': 20,\n 'MKACTIVITY': 21,\n 'CHECKOUT': 22,\n 'MERGE': 23,\n /* upnp */\n 'M-SEARCH': 24,\n 'NOTIFY': 25,\n 'SUBSCRIBE': 26,\n 'UNSUBSCRIBE': 27,\n /* RFC-5789 */\n 'PATCH': 28,\n 'PURGE': 29,\n /* CalDAV */\n 'MKCALENDAR': 30,\n /* RFC-2068, section 19.6.1.2 */\n 'LINK': 31,\n 'UNLINK': 32,\n /* icecast */\n 'SOURCE': 33,\n /* RFC-7540, section 11.6 */\n 'PRI': 34,\n /* RFC-2326 RTSP */\n 'DESCRIBE': 35,\n 'ANNOUNCE': 36,\n 'SETUP': 37,\n 'PLAY': 38,\n 'PAUSE': 39,\n 'TEARDOWN': 40,\n 'GET_PARAMETER': 41,\n 'SET_PARAMETER': 42,\n 'REDIRECT': 43,\n 'RECORD': 44,\n /* RAOP */\n 'FLUSH': 45,\n /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */\n 'QUERY': 46,\n};\nexports.STATUSES = {\n CONTINUE: 100,\n SWITCHING_PROTOCOLS: 101,\n PROCESSING: 102,\n EARLY_HINTS: 103,\n RESPONSE_IS_STALE: 110, // Unofficial\n REVALIDATION_FAILED: 111, // Unofficial\n DISCONNECTED_OPERATION: 112, // Unofficial\n HEURISTIC_EXPIRATION: 113, // Unofficial\n MISCELLANEOUS_WARNING: 199, // Unofficial\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NON_AUTHORITATIVE_INFORMATION: 203,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n MULTI_STATUS: 207,\n ALREADY_REPORTED: 208,\n TRANSFORMATION_APPLIED: 214, // Unofficial\n IM_USED: 226,\n MISCELLANEOUS_PERSISTENT_WARNING: 299, // Unofficial\n MULTIPLE_CHOICES: 300,\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n USE_PROXY: 305,\n SWITCH_PROXY: 306, // No longer used\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n PROXY_AUTHENTICATION_REQUIRED: 407,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n RANGE_NOT_SATISFIABLE: 416,\n EXPECTATION_FAILED: 417,\n IM_A_TEAPOT: 418,\n PAGE_EXPIRED: 419, // Unofficial\n ENHANCE_YOUR_CALM: 420, // Unofficial\n MISDIRECTED_REQUEST: 421,\n UNPROCESSABLE_ENTITY: 422,\n LOCKED: 423,\n FAILED_DEPENDENCY: 424,\n TOO_EARLY: 425,\n UPGRADE_REQUIRED: 426,\n PRECONDITION_REQUIRED: 428,\n TOO_MANY_REQUESTS: 429,\n REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, // Unofficial\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n LOGIN_TIMEOUT: 440, // Unofficial\n NO_RESPONSE: 444, // Unofficial\n RETRY_WITH: 449, // Unofficial\n BLOCKED_BY_PARENTAL_CONTROL: 450, // Unofficial\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\n CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, // Unofficial\n INVALID_X_FORWARDED_FOR: 463, // Unofficial\n REQUEST_HEADER_TOO_LARGE: 494, // Unofficial\n SSL_CERTIFICATE_ERROR: 495, // Unofficial\n SSL_CERTIFICATE_REQUIRED: 496, // Unofficial\n HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, // Unofficial\n INVALID_TOKEN: 498, // Unofficial\n CLIENT_CLOSED_REQUEST: 499, // Unofficial\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n VARIANT_ALSO_NEGOTIATES: 506,\n INSUFFICIENT_STORAGE: 507,\n LOOP_DETECTED: 508,\n BANDWIDTH_LIMIT_EXCEEDED: 509,\n NOT_EXTENDED: 510,\n NETWORK_AUTHENTICATION_REQUIRED: 511,\n WEB_SERVER_UNKNOWN_ERROR: 520, // Unofficial\n WEB_SERVER_IS_DOWN: 521, // Unofficial\n CONNECTION_TIMEOUT: 522, // Unofficial\n ORIGIN_IS_UNREACHABLE: 523, // Unofficial\n TIMEOUT_OCCURED: 524, // Unofficial\n SSL_HANDSHAKE_FAILED: 525, // Unofficial\n INVALID_SSL_CERTIFICATE: 526, // Unofficial\n RAILGUN_ERROR: 527, // Unofficial\n SITE_IS_OVERLOADED: 529, // Unofficial\n SITE_IS_FROZEN: 530, // Unofficial\n IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, // Unofficial\n NETWORK_READ_TIMEOUT: 598, // Unofficial\n NETWORK_CONNECT_TIMEOUT: 599, // Unofficial\n};\nexports.FINISH = {\n SAFE: 0,\n SAFE_WITH_CB: 1,\n UNSAFE: 2,\n};\nexports.HEADER_STATE = {\n GENERAL: 0,\n CONNECTION: 1,\n CONTENT_LENGTH: 2,\n TRANSFER_ENCODING: 3,\n UPGRADE: 4,\n CONNECTION_KEEP_ALIVE: 5,\n CONNECTION_CLOSE: 6,\n CONNECTION_UPGRADE: 7,\n TRANSFER_ENCODING_CHUNKED: 8,\n};\n// C headers\nexports.METHODS_HTTP = [\n exports.METHODS.DELETE,\n exports.METHODS.GET,\n exports.METHODS.HEAD,\n exports.METHODS.POST,\n exports.METHODS.PUT,\n exports.METHODS.CONNECT,\n exports.METHODS.OPTIONS,\n exports.METHODS.TRACE,\n exports.METHODS.COPY,\n exports.METHODS.LOCK,\n exports.METHODS.MKCOL,\n exports.METHODS.MOVE,\n exports.METHODS.PROPFIND,\n exports.METHODS.PROPPATCH,\n exports.METHODS.SEARCH,\n exports.METHODS.UNLOCK,\n exports.METHODS.BIND,\n exports.METHODS.REBIND,\n exports.METHODS.UNBIND,\n exports.METHODS.ACL,\n exports.METHODS.REPORT,\n exports.METHODS.MKACTIVITY,\n exports.METHODS.CHECKOUT,\n exports.METHODS.MERGE,\n exports.METHODS['M-SEARCH'],\n exports.METHODS.NOTIFY,\n exports.METHODS.SUBSCRIBE,\n exports.METHODS.UNSUBSCRIBE,\n exports.METHODS.PATCH,\n exports.METHODS.PURGE,\n exports.METHODS.MKCALENDAR,\n exports.METHODS.LINK,\n exports.METHODS.UNLINK,\n exports.METHODS.PRI,\n // TODO(indutny): should we allow it with HTTP?\n exports.METHODS.SOURCE,\n exports.METHODS.QUERY,\n];\nexports.METHODS_ICE = [\n exports.METHODS.SOURCE,\n];\nexports.METHODS_RTSP = [\n exports.METHODS.OPTIONS,\n exports.METHODS.DESCRIBE,\n exports.METHODS.ANNOUNCE,\n exports.METHODS.SETUP,\n exports.METHODS.PLAY,\n exports.METHODS.PAUSE,\n exports.METHODS.TEARDOWN,\n exports.METHODS.GET_PARAMETER,\n exports.METHODS.SET_PARAMETER,\n exports.METHODS.REDIRECT,\n exports.METHODS.RECORD,\n exports.METHODS.FLUSH,\n // For AirPlay\n exports.METHODS.GET,\n exports.METHODS.POST,\n];\nexports.METHOD_MAP = (0, utils_1.enumToMap)(exports.METHODS);\nexports.H_METHOD_MAP = Object.fromEntries(Object.entries(exports.METHODS).filter(([k]) => k.startsWith('H')));\nexports.STATUSES_HTTP = [\n exports.STATUSES.CONTINUE,\n exports.STATUSES.SWITCHING_PROTOCOLS,\n exports.STATUSES.PROCESSING,\n exports.STATUSES.EARLY_HINTS,\n exports.STATUSES.RESPONSE_IS_STALE,\n exports.STATUSES.REVALIDATION_FAILED,\n exports.STATUSES.DISCONNECTED_OPERATION,\n exports.STATUSES.HEURISTIC_EXPIRATION,\n exports.STATUSES.MISCELLANEOUS_WARNING,\n exports.STATUSES.OK,\n exports.STATUSES.CREATED,\n exports.STATUSES.ACCEPTED,\n exports.STATUSES.NON_AUTHORITATIVE_INFORMATION,\n exports.STATUSES.NO_CONTENT,\n exports.STATUSES.RESET_CONTENT,\n exports.STATUSES.PARTIAL_CONTENT,\n exports.STATUSES.MULTI_STATUS,\n exports.STATUSES.ALREADY_REPORTED,\n exports.STATUSES.TRANSFORMATION_APPLIED,\n exports.STATUSES.IM_USED,\n exports.STATUSES.MISCELLANEOUS_PERSISTENT_WARNING,\n exports.STATUSES.MULTIPLE_CHOICES,\n exports.STATUSES.MOVED_PERMANENTLY,\n exports.STATUSES.FOUND,\n exports.STATUSES.SEE_OTHER,\n exports.STATUSES.NOT_MODIFIED,\n exports.STATUSES.USE_PROXY,\n exports.STATUSES.SWITCH_PROXY,\n exports.STATUSES.TEMPORARY_REDIRECT,\n exports.STATUSES.PERMANENT_REDIRECT,\n exports.STATUSES.BAD_REQUEST,\n exports.STATUSES.UNAUTHORIZED,\n exports.STATUSES.PAYMENT_REQUIRED,\n exports.STATUSES.FORBIDDEN,\n exports.STATUSES.NOT_FOUND,\n exports.STATUSES.METHOD_NOT_ALLOWED,\n exports.STATUSES.NOT_ACCEPTABLE,\n exports.STATUSES.PROXY_AUTHENTICATION_REQUIRED,\n exports.STATUSES.REQUEST_TIMEOUT,\n exports.STATUSES.CONFLICT,\n exports.STATUSES.GONE,\n exports.STATUSES.LENGTH_REQUIRED,\n exports.STATUSES.PRECONDITION_FAILED,\n exports.STATUSES.PAYLOAD_TOO_LARGE,\n exports.STATUSES.URI_TOO_LONG,\n exports.STATUSES.UNSUPPORTED_MEDIA_TYPE,\n exports.STATUSES.RANGE_NOT_SATISFIABLE,\n exports.STATUSES.EXPECTATION_FAILED,\n exports.STATUSES.IM_A_TEAPOT,\n exports.STATUSES.PAGE_EXPIRED,\n exports.STATUSES.ENHANCE_YOUR_CALM,\n exports.STATUSES.MISDIRECTED_REQUEST,\n exports.STATUSES.UNPROCESSABLE_ENTITY,\n exports.STATUSES.LOCKED,\n exports.STATUSES.FAILED_DEPENDENCY,\n exports.STATUSES.TOO_EARLY,\n exports.STATUSES.UPGRADE_REQUIRED,\n exports.STATUSES.PRECONDITION_REQUIRED,\n exports.STATUSES.TOO_MANY_REQUESTS,\n exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL,\n exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE,\n exports.STATUSES.LOGIN_TIMEOUT,\n exports.STATUSES.NO_RESPONSE,\n exports.STATUSES.RETRY_WITH,\n exports.STATUSES.BLOCKED_BY_PARENTAL_CONTROL,\n exports.STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS,\n exports.STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST,\n exports.STATUSES.INVALID_X_FORWARDED_FOR,\n exports.STATUSES.REQUEST_HEADER_TOO_LARGE,\n exports.STATUSES.SSL_CERTIFICATE_ERROR,\n exports.STATUSES.SSL_CERTIFICATE_REQUIRED,\n exports.STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT,\n exports.STATUSES.INVALID_TOKEN,\n exports.STATUSES.CLIENT_CLOSED_REQUEST,\n exports.STATUSES.INTERNAL_SERVER_ERROR,\n exports.STATUSES.NOT_IMPLEMENTED,\n exports.STATUSES.BAD_GATEWAY,\n exports.STATUSES.SERVICE_UNAVAILABLE,\n exports.STATUSES.GATEWAY_TIMEOUT,\n exports.STATUSES.HTTP_VERSION_NOT_SUPPORTED,\n exports.STATUSES.VARIANT_ALSO_NEGOTIATES,\n exports.STATUSES.INSUFFICIENT_STORAGE,\n exports.STATUSES.LOOP_DETECTED,\n exports.STATUSES.BANDWIDTH_LIMIT_EXCEEDED,\n exports.STATUSES.NOT_EXTENDED,\n exports.STATUSES.NETWORK_AUTHENTICATION_REQUIRED,\n exports.STATUSES.WEB_SERVER_UNKNOWN_ERROR,\n exports.STATUSES.WEB_SERVER_IS_DOWN,\n exports.STATUSES.CONNECTION_TIMEOUT,\n exports.STATUSES.ORIGIN_IS_UNREACHABLE,\n exports.STATUSES.TIMEOUT_OCCURED,\n exports.STATUSES.SSL_HANDSHAKE_FAILED,\n exports.STATUSES.INVALID_SSL_CERTIFICATE,\n exports.STATUSES.RAILGUN_ERROR,\n exports.STATUSES.SITE_IS_OVERLOADED,\n exports.STATUSES.SITE_IS_FROZEN,\n exports.STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR,\n exports.STATUSES.NETWORK_READ_TIMEOUT,\n exports.STATUSES.NETWORK_CONNECT_TIMEOUT,\n];\nexports.ALPHA = [];\nfor (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {\n // Upper case\n exports.ALPHA.push(String.fromCharCode(i));\n // Lower case\n exports.ALPHA.push(String.fromCharCode(i + 0x20));\n}\nexports.NUM_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n};\nexports.HEX_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF,\n a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf,\n};\nexports.NUM = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n];\nexports.ALPHANUM = exports.ALPHA.concat(exports.NUM);\nexports.MARK = ['-', '_', '.', '!', '~', '*', '\\'', '(', ')'];\nexports.USERINFO_CHARS = exports.ALPHANUM\n .concat(exports.MARK)\n .concat(['%', ';', ':', '&', '=', '+', '$', ',']);\n// TODO(indutny): use RFC\nexports.URL_CHAR = [\n '!', '\"', '$', '%', '&', '\\'',\n '(', ')', '*', '+', ',', '-', '.', '/',\n ':', ';', '<', '=', '>',\n '@', '[', '\\\\', ']', '^', '_',\n '`',\n '{', '|', '}', '~',\n].concat(exports.ALPHANUM);\nexports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']);\n/* Tokens as defined by rfc 2616. Also lowercases them.\n * token = 1*\n * separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n * | \",\" | \";\" | \":\" | \"\\\" | <\">\n * | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n * | \"{\" | \"}\" | SP | HT\n */\nexports.TOKEN = [\n '!', '#', '$', '%', '&', '\\'',\n '*', '+', '-', '.',\n '^', '_', '`',\n '|', '~',\n].concat(exports.ALPHANUM);\n/*\n * Verify that a char is a valid visible (printable) US-ASCII\n * character or %x80-FF\n */\nexports.HEADER_CHARS = ['\\t'];\nfor (let i = 32; i <= 255; i++) {\n if (i !== 127) {\n exports.HEADER_CHARS.push(i);\n }\n}\n// ',' = \\x44\nexports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44);\nexports.QUOTED_STRING = ['\\t', ' '];\nfor (let i = 0x21; i <= 0xff; i++) {\n if (i !== 0x22 && i !== 0x5c) { // All characters in ASCII except \\ and \"\n exports.QUOTED_STRING.push(i);\n }\n}\nexports.HTAB_SP_VCHAR_OBS_TEXT = ['\\t', ' '];\n// VCHAR: https://tools.ietf.org/html/rfc5234#appendix-B.1\nfor (let i = 0x21; i <= 0x7E; i++) {\n exports.HTAB_SP_VCHAR_OBS_TEXT.push(i);\n}\n// OBS_TEXT: https://datatracker.ietf.org/doc/html/rfc9110#name-collected-abnf\nfor (let i = 0x80; i <= 0xff; i++) {\n exports.HTAB_SP_VCHAR_OBS_TEXT.push(i);\n}\nexports.MAJOR = exports.NUM_MAP;\nexports.MINOR = exports.MAJOR;\nexports.SPECIAL_HEADERS = {\n 'connection': exports.HEADER_STATE.CONNECTION,\n 'content-length': exports.HEADER_STATE.CONTENT_LENGTH,\n 'proxy-connection': exports.HEADER_STATE.CONNECTION,\n 'transfer-encoding': exports.HEADER_STATE.TRANSFER_ENCODING,\n 'upgrade': exports.HEADER_STATE.UPGRADE,\n};\nexports.default = {\n ERROR: exports.ERROR,\n TYPE: exports.TYPE,\n FLAGS: exports.FLAGS,\n LENIENT_FLAGS: exports.LENIENT_FLAGS,\n METHODS: exports.METHODS,\n STATUSES: exports.STATUSES,\n FINISH: exports.FINISH,\n HEADER_STATE: exports.HEADER_STATE,\n ALPHA: exports.ALPHA,\n NUM_MAP: exports.NUM_MAP,\n HEX_MAP: exports.HEX_MAP,\n NUM: exports.NUM,\n ALPHANUM: exports.ALPHANUM,\n MARK: exports.MARK,\n USERINFO_CHARS: exports.USERINFO_CHARS,\n URL_CHAR: exports.URL_CHAR,\n HEX: exports.HEX,\n TOKEN: exports.TOKEN,\n HEADER_CHARS: exports.HEADER_CHARS,\n CONNECTION_TOKEN_CHARS: exports.CONNECTION_TOKEN_CHARS,\n QUOTED_STRING: exports.QUOTED_STRING,\n HTAB_SP_VCHAR_OBS_TEXT: exports.HTAB_SP_VCHAR_OBS_TEXT,\n MAJOR: exports.MAJOR,\n MINOR: exports.MINOR,\n SPECIAL_HEADERS: exports.SPECIAL_HEADERS,\n METHODS_HTTP: exports.METHODS_HTTP,\n METHODS_ICE: exports.METHODS_ICE,\n METHODS_RTSP: exports.METHODS_RTSP,\n METHOD_MAP: exports.METHOD_MAP,\n H_METHOD_MAP: exports.H_METHOD_MAP,\n STATUSES_HTTP: exports.STATUSES_HTTP,\n};\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\n\nconst wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgL5YUCAgd/A34gASACaiEEAkAgACIDKAIMIgANACADKAIEBEAgAyABNgIECyMAQRBrIgkkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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C0HjAQwHC0HXAQwGC0HYAQwFC0HZAQwEC0HaAQwDC0HbAQwCC0HdAQwBC0HcAQshAgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAg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ogKiAqICogKiAqICogKiAqICogKiAqICogIAogILIAQgAUEBaiIBRw0AC0HJACECDOwCCyABQQFqIQEgA0Evai0AAEEBcQ2lAiADQQA2AhwgAyABNgIUIANBlxA2AhAgA0EKNgIMQQAhAgzrAgsgASAERwRAA0AgAS0AAEEgRw0VIAQgAUEBaiIBRw0AC0H4ACECDOsCC0H4ACECDOoCCyADQQI6ACgMOAtBACECIANBADYCHCADQb8LNgIQIANBAjYCDCADIAFBAWo2AhQM6AILQQAhAgzOAgtBDSECDM0CC0ETIQIMzAILQRUhAgzLAgtBFiECDMoCC0EYIQIMyQILQRkhAgzIAgtBGiECDMcCC0EbIQIMxgILQRwhAgzFAgtBHSECDMQCC0EeIQIMwwILQR8hAgzCAgtBICECDMECC0EiIQIMwAILQSMhAgy/AgtBJSECDL4CC0HlACECDL0CCyADQT02AhwgAyABNgIUIAMgADYCDEEAIQIM1QILIANBGzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDNQCCyADQSA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzTAgsgA0ETNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0gILIANBCzYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNECCyADQRA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzQAgsgA0EgNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzwILIANBCzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM4CCyADQQw2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzNAgtBACECIANBADYCHCADIAE2AhQgA0HdDjYCECADQRI2AgwMzAILAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB/QEhAgzMAgsCQAJAIAMtADZBAUcNAEEAIQACQCADKAI4IgJFDQAgAigCYCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUcNASADQfwBNgIcIAMgATYCFCADQdwZNgIQIANBFTYCDEEAIQIMzQILQdwBIQIMswILIANBADYCHCADIAE2AhQgA0H5CzYCECADQR82AgxBACECDMsCCwJAAkAgAy0AKEEBaw4CBAEAC0HbASECDLICC0HUASECDLECCyADQQI6ADFBACEAAkAgAygCOCICRQ0AIAIoAgAiAkUNACADIAIRAAAhAAsgAEUEQEHdASECDLECCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQbQMNgIQIANBEDYCDEEAIQIMygILIANB+wE2AhwgAyABNgIUIANBgRo2AhAgA0EVNgIMQQAhAgzJAgsgASAERgRAQfoBIQIMyQILIAEtAABByABGDQEgA0EBOgAoC0HAASECDK4CC0HaASECDK0CCyABIARHBEAgA0EMNgIIIAMgATYCBEHZASECDK0CC0H5ASECDMUCCyABIARGBEBB+AEhAgzFAgsgAS0AAEHIAEcNBCABQQFqIQFB2AEhAgyrAgsgASAERgRAQfcBIQIMxAILAkACQCABLQAAQcUAaw4QAAUFBQUFBQUFBQUFBQUFAQULIAFBAWohAUHWASECDKsCCyABQQFqIQFB1wEhAgyqAgtB9gEhAiABIARGDcICIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbrVAGotAABHDQMgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMMCCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIARQRAQeMBIQIMqgILIANB9QE2AhwgAyABNgIUIAMgADYCDEEAIQIMwgILQfQBIQIgASAERg3BAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEG41QBqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzCAgsgA0GBBDsBKCADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIADQMMAgsgA0EANgIAC0EAIQIgA0EANgIcIAMgATYCFCADQeUfNgIQIANBCDYCDAy/AgtB1QEhAgylAgsgA0HzATYCHCADIAE2AhQgAyAANgIMQQAhAgy9AgtBACEAAkAgAygCOCICRQ0AIAIoAkAiAkUNACADIAIRAAAhAAsgAEUNbiAAQRVHBEAgA0EANgIcIAMgATYCFCADQYIPNgIQIANBIDYCDEEAIQIMvQILIANBjwE2AhwgAyABNgIUIANB7Bs2AhAgA0EVNgIMQQAhAgy8AgsgASAERwRAIANBDTYCCCADIAE2AgRB0wEhAgyjAgtB8gEhAgy7AgsgASAERgRAQfEBIQIMuwILAkACQAJAIAEtAABByABrDgsAAQgICAgICAgIAggLIAFBAWohAUHQASECDKMCCyABQQFqIQFB0QEhAgyiAgsgAUEBaiEBQdIBIQIMoQILQfABIQIgASAERg25AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBtdUAai0AAEcNBCAAQQJGDQMgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuQILQe8BIQIgASAERg24AiADKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABBs9UAai0AAEcNAyAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuAILQe4BIQIgASAERg23AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMtwILIAMoAgQhACADQgA3AwAgAyAAIAVBAWoiARArIgBFDQIgA0HsATYCHCADIAE2AhQgAyAANgIMQQAhAgy2AgsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNnAIgA0HtATYCHCADIAE2AhQgAyAANgIMQQAhAgy0AgtBzwEhAgyaAgtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDLQCC0HOASECDJoCCyADQesBNgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMsgILIAEgBEYEQEHrASECDLICCyABLQAAQS9GBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GyODYCECADQQg2AgxBACECDLECC0HNASECDJcCCyABIARHBEAgA0EONgIIIAMgATYCBEHMASECDJcCC0HqASECDK8CCyABIARGBEBB6QEhAgyvAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBywEhAgyWAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZcCIANB6AE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAEgBEYEQEHnASECDK4CCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5gE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILQcoBIQIMlAILIAEgBEYEQEHlASECDK0CC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDQIgA0HiATYCHCADIAE2AhQgAyAANgIMQQAhAgyvAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZoCIANB4wE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ2YAiADQeQBNgIcIAMgATYCFCADIAA2AgwMrQILQckBIQIMkwILQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBpA02AhAgA0EhNgIMQQAhAgytAgtByAEhAgyTAgsgA0HhATYCHCADIAE2AhQgA0HQGjYCECADQRU2AgxBACECDKsCCyABIARGBEBB4QEhAgyrAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANBmRE2AhAgA0EJNgIMQQAhAgyrAgtBxwEhAgyRAgsgASAERgRAQeABIQIMqgILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyrAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqgILQcYBIQIMkAILIAEgBEYEQEHfASECDKkCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqgILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKkCC0HFASECDI8CCyABIARGBEBB3gEhAgyoAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKkCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyoAgtBxAEhAgyOAgsgASAERgRAQd0BIQIMpwILAkACQAJAAkAgAS0AAEEKaw4XAgMDAAMDAwMDAwMDAwMDAwMDAwMDAwEDCyABQQFqDAULIAFBAWohAUHDASECDI8CCyABQQFqIQEgA0Evai0AAEEBcQ0IIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKcCCyADQQA2AhwgAyABNgIUIANBjQs2AhAgA0ENNgIMQQAhAgymAgsgASAERwRAIANBDzYCCCADIAE2AgRBASECDI0CC0HcASECDKUCCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtB2wEhAgymAgsgAygCBCEAIANBADYCBCADIAAgARAtIgBFBEAgAUEBaiEBDAQLIANB2gE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMpQILIAMoAgQhACADQQA2AgQgAyAAIAEQLSIADQEgAUEBagshAUHBASECDIoCCyADQdkBNgIcIAMgADYCDCADIAFBAWo2AhRBACECDKICC0HCASECDIgCCyADQS9qLQAAQQFxDQEgA0EANgIcIAMgATYCFCADQeQcNgIQIANBGTYCDEEAIQIMoAILIAEgBEYEQEHZASEC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IAFBAWohAUGeASECDOQBCyABQQFqIQFBnwEhAgzjAQtBtwEhAiABIARGDfsBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQezUAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPwBCyADQQA2AgAgBkEBaiEBQQ0MKAtBtgEhAiABIARGDfoBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPsBCyADQQA2AgAgBkEBaiEBQQwMJwtBtQEhAiABIARGDfkBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQerUAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPoBCyADQQA2AgAgBkEBaiEBQQMMJgtBtAEhAiABIARGDfgBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQejUAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPkBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQbMBIQIM+AELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBmQEhAgzfAQsgAUEBaiEBQZoBIQIM3gELQbIBIQIgASAERg32ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHm1ABqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz3AQsgA0EANgIAIAZBAWohAUEnDCMLQbEBIQIgASAERg31ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHk1ABqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz2AQsgA0EANgIAIAZBAWohAUEcDCILQbABIQIgASAERg30ASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHe1ABqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz1AQsgA0EANgIAIAZBAWohAUEGDCELQa8BIQIgASAERg3zASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHZ1ABqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz0AQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGuASECDPMBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQY4BIQIM3AELIAFBAWohAUGPASECDNsBCyABQQFqIQFBlAEhAgzaAQsgAUEBaiEBQZUBIQIM2QELQa0BIQIgASAERg3xASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHX1ABqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzyAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGsASECDPEBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGQASECDNgBCyABQQFqIQFBkwEhAgzXAQsgASAERgRAQasBIQIM8AELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQZEBIQIM1wELIAFBAWohAUGSASECDNYBCyABIARGBEBBqgEhAgzvAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GpASECIAEgBEYN7QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABB0dQAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7gELIANBADYCACAGQQFqIQFBHgwaC0GoASECIAEgBEYN7AEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBytQAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7QELIANBADYCACAGQQFqIQFBFQwZC0GnASECIAEgBEYN6wEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBx9QAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7AELIANBADYCACAGQQFqIQFBFwwYC0GmASECIAEgBEYN6gEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBwdQAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6wELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBpQEhAgzqAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYsBIQIM0QELIAFBAWohAUGMASECDNABC0GkASECIAEgBEYN6AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBptUAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6QELIANBADYCACAGQQFqIQFBCQwVC0GjASECIAEgBEYN5wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBpNUAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6AELIANBADYCACAGQQFqIQFBHwwUC0GiASECIAEgBEYN5gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBvtQAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5wELIANBADYCACAGQQFqIQFBAgwTC0GhASECIAEgBEYN5QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQbzUAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOUBCyABIARGBEBBoAEhAgzlAQtBASABLQAAQd8ARw0RGiABQQFqIQFBhwEhAgzLAQsgA0EANgIAIAZBAWohAUGIASECDMoBC0GfASECIAEgBEYN4gEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4wELIANBADYCACAGQQFqIQFBKQwPC0GeASECIAEgBEYN4QEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBuNQAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4gELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBnQEhAgzhAQsgAS0AAEHFAEcNDiABQQFqIQFBhAEhAgzHAQsgASAERgRAQZwBIQIM4AELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFBggEhAgzHAQsgAUEBaiEBQYMBIQIMxgELQZsBIQIgASAERg3eASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGz1ABqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzfAQsgA0EANgIAIAZBAWohAUEjDAsLQZoBIQIgASAERg3dASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGw1ABqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzeAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGZASECDN0BCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQf0AIQIMxAELIAFBAWohAUGAASECDMMBCyABIARGBEBBmAEhAgzcAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB/gAhAgzDAQsgAUEBaiEBQf8AIQIMwgELIAEgBEYEQEGXASECDNsBCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQZYBIQIgASAERg3ZASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEGs1ABqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzaAQsgA0EANgIAIAZBAWohAUEFDAYLQZUBIQIgASAERg3YASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGm1ABqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzZAQsgA0EANgIAIAZBAWohAUEWDAULQZQBIQIgASAERg3XASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzYAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGTASECDNcBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUH5ACECDL4BCyABQQFqIQFB+gAhAgy9AQtBkgEhAiABIARGDdUBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQaDUAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNYBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGRASECDNQBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC4iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB/h82AhAgA0EGNgIMDNEBC0H4ACECDLcBCyADQZABNgIcIAMgATYCFCADIAA2AgxBACECDM8BC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgzOAQtB9wAhAgy0AQsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDMwBCyABIARGBEBBjwEhAgzMAQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GbHzYCECADQQY2AgxBACECDMwBC0ECIQIMsgELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GOASECDMoBCyABIARGBEBBjQEhAgzKAQsCQCABLQAAQQlrDgRKAABKAAtB9QAhAgywAQsgAy0AKUEFRgRAQfYAIQIMsAELQfQAIQIMrwELIAEgBEYEQEGMASECDMgBCyADQRA2AgggAyABNgIEDAoLIAEgBEYEQEGLASECDMcBCwJAIAEtAABBCWsOBEcAAEcAC0HzACECDK0BCyABIARHBEAgA0EQNgIIIAMgATYCBEHxACECDK0BC0GKASECDMUBCwJAIAEgBEcEQANAIAEtAABBoNAAai0AACIAQQNHBEACQCAAQQFrDgJJAAQLQfAAIQIMrwELIAQgAUEBaiIBRw0AC0GIASECDMYBC0GIASECDMUBCyADQQA2AhwgAyABNgIUIANB2yA2AhAgA0EHNgIMQQAhAgzEAQsgASAERgRAQYkBIQIMxAELAkACQAJAIAEtAABBoNIAai0AAEEBaw4DRgIAAQtB8gAhAgysAQsgA0EANgIcIAMgATYCFCADQbQSNgIQIANBBzYCDEEAIQIMxAELQeoAIQIMqgELIAEgBEcEQCABQQFqIQFB7wAhAgyqAQtBhwEhAgzCAQsgBCABIgBGBEBBhgEhAgzCAQsgAC0AACIBQS9GBEAgAEEBaiEBQe4AIQIMqQELIAFBCWsiAkEXSw0BIAAhAUEBIAJ0QZuAgARxDUEMAQsgBCABIgBGBEBBhQEhAgzBAQsgAC0AAEEvRw0AIABBAWohAQwDC0EAIQIgA0EANgIcIAMgADYCFCADQdsgNgIQIANBBzYCDAy/AQsCQAJAAkACQAJAA0AgAS0AAEGgzgBqLQAAIgBBBUcEQAJAAkAgAEEBaw4IRwUGBwgABAEIC0HrACECDK0BCyABQQFqIQFB7QAhAgysAQsgBCABQQFqIgFHDQALQYQBIQIMwwELIAFBAWoMFAsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDR4gA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgzBAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDR4gA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgzAAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDR4gA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgy/AQsgA0EANgIcIAMgATYCFCADQfkPNgIQIANBBzYCDEEAIQIMvgELIAEgBEYEQEGDASECDL4BCwJAIAEtAABBoM4Aai0AAEEBaw4IPgQFBgAIAgMHCyABQQFqIQELQQMhAgyjAQsgAUEBagwNC0EAIQIgA0EANgIcIANB0RI2AhAgA0EHNgIMIAMgAUEBajYCFAy6AQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDRYgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgy5AQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDRYgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgy4AQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDRYgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgy3AQsgA0EANgIcIAMgATYCFCADQfkPNgIQIANBBzYCDEEAIQIMtgELQewAIQIMnAELIAEgBEYEQEGCASECDLUBCyABQQFqDAILIAEgBEYEQEGBASECDLQBCyABQQFqDAELIAEgBEYNASABQQFqCyEBQQQhAgyYAQtBgAEhAgywAQsDQCABLQAAQaDMAGotAAAiAEECRwRAIABBAUcEQEHpACECDJkBCwwxCyAEIAFBAWoiAUcNAAtB/wAhAgyvAQsgASAERgRAQf4AIQIMrwELAkAgAS0AAEEJaw43LwMGLwQGBgYGBgYGBgYGBgYGBgYGBgYFBgYCBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAYLIAFBAWoLIQFBBSECDJQBCyABQQFqDAYLIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0IIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0IIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0IIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIANBADYCHCADIAE2AhQgA0GNFDYCECADQQc2AgxBACECDKgBCwJAAkACQAJAA0AgAS0AAEGgygBqLQAAIgBBBUcEQAJAIABBAWsOBi4DBAUGAAYLQegAIQIMlAELIAQgAUEBaiIBRw0AC0H9ACECDKsBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNByADQdsANgIcIAMgATYCFCADIAA2AgxBACECDKoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNByADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDKkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNByADQfoANgIcIAMgATYCFCADIAA2AgxBACECDKgBCyADQQA2AhwgAyABNgIUIANB5Ag2AhAgA0EHNgIMQQAhAgynAQsgASAERg0BIAFBAWoLIQFBBiECDIwBC0H8ACECDKQBCwJAAkACQAJAA0AgAS0AAEGgyABqLQAAIgBBBUcEQCAAQQFrDgQpAgMEBQsgBCABQQFqIgFHDQALQfsAIQIMpwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMpgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMpQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMpAELIANBADYCHCADIAE2AhQgA0G8CjYCECADQQc2AgxBACECDKMBC0HPACECDIkBC0HRACECDIgBC0HnACECDIcBCyABIARGBEBB+gAhAgygAQsCQCABLQAAQQlrDgQgAAAgAAsgAUEBaiEBQeYAIQIMhgELIAEgBEYEQEH5ACECDJ8BCwJAIAEtAABBCWsOBB8AAB8AC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQRAQeIBIQIMhgELIABBFUcEQCADQQA2AhwgAyABNgIUIANByQ02AhAgA0EaNgIMQQAhAgyfAQsgA0H4ADYCHCADIAE2AhQgA0HqGjYCECADQRU2AgxBACECDJ4BCyABIARHBEAgA0ENNgIIIAMgATYCBEHkACECDIUBC0H3ACECDJ0BCyABIARGBEBB9gAhAgydAQsCQAJAAkAgAS0AAEHIAGsOCwABCwsLCwsLCwsCCwsgAUEBaiEBQd0AIQIMhQELIAFBAWohAUHgACECDIQBCyABQQFqIQFB4wAhAgyDAQtB9QAhAiABIARGDZsBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbXVAGotAABHDQggAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJwBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIABEAgA0H0ADYCHCADIAE2AhQgAyAANgIMQQAhAgycAQtB4gAhAgyCAQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJwBC0HhACECDIIBCyADQfMANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMmgELIAMtACkiAEEja0ELSQ0JAkAgAEEGSw0AQQEgAHRBygBxRQ0ADAoLQQAhAiADQQA2AhwgAyABNgIUIANB7Qk2AhAgA0EINgIMDJkBC0HyACECIAEgBEYNmAEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBs9UAai0AAEcNBSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMmQELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfEANgIcIAMgATYCFCADIAA2AgxBACECDJkBC0HfACECDH8LQQAhAAJAIAMoAjgiAkUNACACKAI0IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANB6g02AhAgA0EmNgIMQQAhAgyZAQtB3gAhAgx/CyADQfAANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMlwELIAMtAClBIUYNBiADQQA2AhwgAyABNgIUIANBkQo2AhAgA0EINgIMQQAhAgyWAQtB7wAhAiABIARGDZUBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDVAGotAABHDQIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJYBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIARQ0CIANB7QA2AhwgAyABNgIUIAMgADYCDEEAIQIMlQELIANBADYCAAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDYABIANB7gA2AhwgAyABNgIUIAMgADYCDEEAIQIMkwELQdwAIQIMeQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJMBC0HbACECDHkLIANB7AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyRAQsgAy0AKSIAQSNJDQAgAEEuRg0AIANBADYCHCADIAE2AhQgA0HJCTYCECADQQg2AgxBACECDJABC0HaACECDHYLIAEgBEYEQEHrACECDI8BCwJAIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMjwELQdkAIQIMdQsgASAERwRAIANBDjYCCCADIAE2AgRB2AAhAgx1C0HqACECDI0BCyABIARGBEBB6QAhAgyNAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1wAhAgx0CyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeiADQegANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyABIARGBEBB5wAhAgyMAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ17IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMjAELQdYAIQIMcgsgASAERgRAQeUAIQIMiwELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDI0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNfSADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeyADQeQANgIcIAMgATYCFCADIAA2AgwMiwELQdQAIQIMcQsgAy0AKUEiRg2GAUHTACECDHALQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALIABFBEBB1QAhAgxwCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQaQNNgIQIANBITYCDEEAIQIMiQELIANB4QA2AhwgAyABNgIUIANB0Bo2AhAgA0EVNgIMQQAhAgyIAQsgASAERgRAQeAAIQIMiAELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HSACECDHALIANBADYCHCADIAE2AhQgA0G2ETYCECADQQk2AgxBACECDIgBCyADQQA2AhwgAyABNgIUIANBthE2AhAgA0EJNgIMQQAhAgyHAQsgASAERgRAQd8AIQIMhwELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBthE2AhAgA0ECNgIMQQAhAgyGAQsgASAERgRAQd0AIQIMhgELIAEtAAAiAkENRgRAIAFBAWohAUHQACECDG0LIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyFAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0HKLTYCECADQQc2AgwMgwELIAEgBEYEQEHbACECDIMBCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc4AIQIMaAsgASAERgRAQdoAIQIMgQELIAEtAABBCWsOBAABAQABC0EAIQIgA0EANgIcIANBmhI2AhAgA0EHNgIMIAMgAUEBajYCFAx/CyADQYASOwEqQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2QA2AhwgAyABNgIUIANB6ho2AhAgA0EVNgIMQQAhAgx+C0HNACECDGQLIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDHwLIAEgBEYEQEHZACECDHwLIAEtAABBIEcNPSABQQFqIQEgAy0ALkEBcQ09IANBADYCHCADIAE2AhQgA0HCHDYCECADQR42AgxBACECDHsLIAEgBEYEQEHYACECDHsLAkACQAJAAkACQCABLQAAIgBBCmsOBAIDAwABCyABQQFqIQFBLCECDGULIABBOkcNASADQQA2AhwgAyABNgIUIANB5xE2AhAgA0EKNgIMQQAhAgx9CyABQQFqIQEgA0Evai0AAEEBcUUNcyADLQAyQYABcUUEQCADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALAkACQCAADhZNTEsBAQEBAQEBAQEBAQEBAQEBAQEAAQsgA0EpNgIcIAMgATYCFCADQawZNgIQIANBFTYCDEEAIQIMfgsg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c3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=='\n\nlet wasmBuffer\n\nObject.defineProperty(module, 'exports', {\n get: () => {\n return wasmBuffer\n ? wasmBuffer\n : (wasmBuffer = Buffer.from(wasmBase64, 'base64'))\n }\n})\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\n\nconst wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgLhocCAwd/A34BeyABIAJqIQQCQCAAIgMoAgwiAA0AIAMoAgQEQCADIAE2AgQLIwBBEGsiCSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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DAgLQeMBDAcLQdcBDAYLQdgBDAULQdkBDAQLQdoBDAMLQdsBDAILQd0BDAELQdwBCyECA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAn8CQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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A0EXNgIcIAMgADYCDCADIAFBAWo2AhQM+AILIABBFUYNI0EAIQIgA0EANgIcIAMgATYCFCADQdYMNgIQIANBIzYCDAz3AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQwdCyADQRk2AhwgAyAANgIMIAMgAUEBajYCFAz2AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQzvAgsgA0EaNgIcIAMgADYCDCADIAFBAWo2AhQM9QILIABBFUYNH0EAIQIgA0EANgIcIAMgATYCFCADQdAPNgIQIANBIjYCDAz0AgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDBsLIANBHDYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgzzAgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDOsCCyADQR02AhwgAyAANgIMIAMgAUEBajYCFEEAIQIM8gILIABBO0cNASABQQFqIQELQSYhAgzXAgtBACECIANBADYCHCADIAE2AhQgA0GfFTYCECADQQw2AgwM7wILIAEgBEcEQANAIAEtAABBIEcNhAIgBCABQQFqIgFHDQALQSwhAgzvAgtBLCECDO4CCyABIARGBEBBNCECDO4CCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtBNCECDO8CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNnwIgA0EyNgIcIAMgATYCFCADIAA2AgxBACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUEQCABQQFqIQEMnwILIANBMjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgztAgsgASAERwRAAkADQCABLQAAQTBrIgBB/wFxQQpPBEBBOiECDNcCCyADKQMgIgtCmbPmzJmz5swZVg0BIAMgC0IKfiIKNwMgIAogAK1C/wGDIgtCf4VWDQEgAyAKIAt8NwMgIAQgAUEBaiIBRw0AC0HAACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABQQFqIgEQMSIADRcM4gILQcAAIQIM7AILIAEgBEYEQEHJACECDOwCCwJAA0ACQCABLQAAQQlrDhgAAqICogKpAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAgCiAgsgBCABQQFqIgFHDQALQckAIQIM7AILIAFBAWohASADQS9qLQAAQQFxDaUCIANBADYCHCADIAE2AhQgA0GXEDYCECADQQo2AgxBACECDOsCCyABIARHBEADQCABLQAAQSBHDRUgBCABQQFqIgFHDQALQfgAIQIM6wILQfgAIQIM6gILIANBAjoAKAw4C0EAIQIgA0EANgIcIANBvws2AhAgA0ECNgIMIAMgAUEBajYCFAzoAgtBACECDM4CC0ENIQIMzQILQRMhAgzMAgtBFSECDMsCC0EWIQIMygILQRghAgzJAgtBGSECDMgCC0EaIQIMxwILQRshAgzGAgtBHCECDMUCC0EdIQIMxAILQR4hAgzDAgtBHyECDMICC0EgIQIMwQILQSIhAgzAAgtBIyECDL8CC0ElIQIMvgILQeUAIQIMvQILIANBPTYCHCADIAE2AhQgAyAANgIMQQAhAgzVAgsgA0EbNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIM1AILIANBIDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNMCCyADQRM2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzSAgsgA0ELNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0QILIANBEDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNACCyADQSA2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzPAgsgA0ELNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzgILIANBDDYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM0CC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAzMAgsCQANAAkAgAS0AAEEKaw4EAAICAAILIAQgAUEBaiIBRw0AC0H9ASECDMwCCwJAAkAgAy0ANkEBRw0AQQAhAAJAIAMoAjgiAkUNACACKAJgIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB/AE2AhwgAyABNgIUIANB3Bk2AhAgA0EVNgIMQQAhAgzNAgtB3AEhAgyzAgsgA0EANgIcIAMgATYCFCADQfkLNgIQIANBHzYCDEEAIQIMywILAkACQCADLQAoQQFrDgIEAQALQdsBIQIMsgILQdQBIQIMsQILIANBAjoAMUEAIQACQCADKAI4IgJFDQAgAigCACICRQ0AIAMgAhEAACEACyAARQRAQd0BIQIMsQILIABBFUcEQCADQQA2AhwgAyABNgIUIANBtAw2AhAgA0EQNgIMQQAhAgzKAgsgA0H7ATYCHCADIAE2AhQgA0GBGjYCECADQRU2AgxBACECDMkCCyABIARGBEBB+gEhAgzJAgsgAS0AAEHIAEYNASADQQE6ACgLQcABIQIMrgILQdoBIQIMrQILIAEgBEcEQCADQQw2AgggAyABNgIEQdkBIQIMrQILQfkBIQIMxQILIAEgBEYEQEH4ASECDMUCCyABLQAAQcgARw0EIAFBAWohAUHYASECDKsCCyABIARGBEBB9wEhAgzEAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQdYBIQIMqwILIAFBAWohAUHXASECDKoCC0H2ASECIAEgBEYNwgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABButUAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMwwILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgBFBEBB4wEhAgyqAgsgA0H1ATYCHCADIAE2AhQgAyAANgIMQQAhAgzCAgtB9AEhAiABIARGDcECIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjVAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMICCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB5R82AhAgA0EINgIMDL8CC0HVASECDKUCCyADQfMBNgIcIAMgATYCFCADIAA2AgxBACECDL0CC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ1uIABBFUcEQCADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgy9AgsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDLwCCyABIARHBEAgA0ENNgIIIAMgATYCBEHTASECDKMCC0HyASECDLsCCyABIARGBEBB8QEhAgy7AgsCQAJAAkAgAS0AAEHIAGsOCwABCAgICAgICAgCCAsgAUEBaiEBQdABIQIMowILIAFBAWohAUHRASECDKICCyABQQFqIQFB0gEhAgyhAgtB8AEhAiABIARGDbkCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEG11QBqLQAARw0EIABBAkYNAyAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy5AgtB7wEhAiABIARGDbgCIAMoAgAiACAEIAFraiEGIAEgAGtBAWohBQNAIAEtAAAgAEGz1QBqLQAARw0DIABBAUYNAiAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy4AgtB7gEhAiABIARGDbcCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEGw1QBqLQAARw0CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy3AgsgAygCBCEAIANCADcDACADIAAgBUEBaiIBECsiAEUNAiADQewBNgIcIAMgATYCFCADIAA2AgxBACECDLYCCyADQQA2AgALIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ2cAiADQe0BNgIcIAMgATYCFCADIAA2AgxBACECDLQCC0HPASECDJoCC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMtAILQc4BIQIMmgILIANB6wE2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyyAgsgASAERgRAQesBIQIMsgILIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMsQILQc0BIQIMlwILIAEgBEcEQCADQQ42AgggAyABNgIEQcwBIQIMlwILQeoBIQIMrwILIAEgBEYEQEHpASECDK8CCyABLQAAQTBrIgBB/wFxQQpJBEAgAyAAOgAqIAFBAWohAUHLASECDJYCCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNlwIgA0HoATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgASAERgRAQecBIQIMrgILAkAgAS0AAEEuRgRAIAFBAWohAQwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmAIgA0HmATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgtBygEhAgyUAgsgASAERgRAQeUBIQIMrQILQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDK8CCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmgIgA0HjATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5AE2AhwgAyABNgIUIAMgADYCDAytAgtByQEhAgyTAgtBACEAAkAgAygCOCICRQ0AIAIoAkQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GkDTYCECADQSE2AgxBACECDK0CC0HIASECDJMCCyADQeEBNgIcIAMgATYCFCADQdAaNgIQIANBFTYCDEEAIQIMqwILIAEgBEYEQEHhASECDKsCCwJAIAEtAABBIEYEQCADQQA7ATQgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GZETYCECADQQk2AgxBACECDKsCC0HHASECDJECCyABIARGBEBB4AEhAgyqAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKsCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyqAgtBxgEhAgyQAgsgASAERgRAQd8BIQIMqQILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyqAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqQILQcUBIQIMjwILIAEgBEYEQEHeASECDKgCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqQILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKgCC0HEASECDI4CCyABIARGBEBB3QEhAgynAgsCQAJAAkACQCABLQAAQQprDhcCAwMAAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAFBAWoMBQsgAUEBaiEBQcMBIQIMjwILIAFBAWohASADQS9qLQAAQQFxDQggA0EANgIcIAMgATYCFCADQY0LNgIQIANBDTYCDEEAIQIMpwILIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKYCCyABIARHBEAgA0EPNgIIIAMgATYCBEEBIQIMjQILQdwBIQIMpQILAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0HbASECDKYCCyADKAIEIQAgA0EANgIEIAMgACABEC0iAEUEQCABQQFqIQEMBAsgA0HaATYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgylAgsgAygCBCEAIANBADYCBCADIAAgARAtIgANASABQQFqCyEBQcEBIQIMigILIANB2QE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMogILQcIBIQIMiAILIANBL2otAABBAXENASADQQA2AhwgAyABNgIUIANB5Bw2AhAgA0EZNgIMQQAhAgygAgsgASAERgRAQdkB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CyADIAU2AgAMkAILIANBADYCACAGQQFqIQFBGgw8C0HKASECIAEgBEYNjgIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBjdUAai0AAEcNOyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjwILIANBADYCACAGQQFqIQFBIQw7CyABIARGBEBByQEhAgyOAgsCQAJAIAEtAABBwQBrDhQAPT09PT09PT09PT09PT09PT09AT0LIAFBAWohAUGtASECDPUBCyABQQFqIQFBsAEhAgz0AQsgASAERgRAQcgBIQIMjQILAkACQCABLQAAQdUAaw4LADw8PDw8PDw8PAE8CyABQQFqIQFBrgEhAgz0AQsgAUEBaiEBQa8BIQIM8wELQccBIQIgASAERg2LAiADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw04IABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyMAgsgA0EANgIAIAZBAWohAUEqDDgLIAEgBEYEQEHGASECDIsCCyABLQAAQdAARw04IAFBAWohAUElDDcLQcUBIQIgASAERg2JAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGB1QBqLQAARw02IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyKAgsgA0EANgIAIAZBAWohAUEODDYLIAEgBEYEQEHEASECDIkCCyABLQAAQcUARw02IAFBAWohAUGrASECDO8BCyABIARGBEBBwwEhAgyIAgsCQAJAAkACQCABLQAAQcIAaw4PAAECOTk5OTk5OTk5OTkDOQsgAUEBaiEBQacBIQIM8QELIAFBAWohAUGoASECDPABCyABQQFqIQFBqQEhAgzvAQsgAUEBaiEBQaoBIQIM7gELQcIBIQIgASAERg2GAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH+1ABqLQAARw0zIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyHAgsgA0EANgIAIAZBAWohAUEUDDMLQcEBIQIgASAERg2FAiADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANA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BTYCAAzsAQsgA0EANgIAIAZBAWohAUEXDBgLQaYBIQIgASAERg3qASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHB1ABqLQAARw0XIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzrAQsgA0EANgIAIAZBAWohAUEYDBcLIAEgBEYEQEGlASECDOoBCwJAAkAgAS0AAEHJAGsOBwAZGRkZGQEZCyABQQFqIQFBiwEhAgzRAQsgAUEBaiEBQYwBIQIM0AELQaQBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw0VIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEJDBULQaMBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw0UIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEfDBQLQaIBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEG+1ABqLQAARw0TIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUECDBMLQaEBIQIgASAERg3lASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYDQCABLQAAIABBvNQAai0AAEcNESAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5QELIAEgBEYEQEGgASECDOUBC0EBIAEtAABB3wBHDREaIAFBAWohAUGHASECDMsBCyADQQA2AgAgBkEBaiEBQYgBIQIMygELQZ8BIQIgASAERg3iASADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw0PIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzjAQsgA0EANgIAIAZBAWohAUEpDA8LQZ4BIQIgASAERg3hASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEG41ABqLQAARw0OIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAziAQsgA0EANgIAIAZBAWohAUEtDA4LIAEgBEYEQEGdASECDOEBCyABLQAAQcUARw0OIAFBAWohAUGEASECDMcBCyABIARGBEBBnAEhAgzgAQsCQAJAIAEtAABBzABrDggADw8PDw8PAQ8LIAFBAWohAUGCASECDMcBCyABQQFqIQFBgwEhAgzGAQtBmwEhAiABIARGDd4BIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQbPUAGotAABHDQsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN8BCyADQQA2AgAgBkEBaiEBQSMMCwtBmgEhAiABIARGDd0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDUAGotAABHDQogAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN4BCyADQQA2AgAgBkEBaiEBQQAMCgsgASAERgRAQZkBIQIM3QELAkACQCABLQAAQcgAaw4IAAwMDAwMDAEMCyABQQFqIQFB/QAhAgzEAQsgAUEBaiEBQYABIQIMwwELIAEgBEYEQEGYASECDNwBCwJAAkAgAS0AAEHOAGsOAwALAQsLIAFBAWohAUH+ACECDMMBCyABQQFqIQFB/wAhAgzCAQsgASAERgRAQZcBIQIM2wELIAEtAABB2QBHDQggAUEBaiEBQQgMBwtBlgEhAiABIARGDdkBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazUAGotAABHDQYgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNoBCyADQQA2AgAgBkEBaiEBQQUMBgtBlQEhAiABIARGDdgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQabUAGotAABHDQUgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNkBCyADQQA2AgAgBkEBaiEBQRYMBQtBlAEhAiABIARGDdcBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDQQgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyADQQA2AgAgBkEBaiEBQRAMBAsgASAERgRAQZMBIQIM1wELAkACQCABLQAAQcMAaw4MAAYGBgYGBgYGBgYBBgsgAUEBaiEBQfkAIQIMvgELIAFBAWohAUH6ACECDL0BC0GSASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBoNQAai0AAEcNAiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBJAwCCyADQQA2AgAMAgsgASAERgRAQZEBIQIM1AELIAEtAABBzABHDQEgAUEBaiEBQRMLOgApIAMoAgQhACADQQA2AgQgAyAAIAEQLiIADQIMAQtBACECIANBADYCHCADIAE2AhQgA0H+HzYCECADQQY2AgwM0QELQfgAIQIMtwELIANBkAE2AhwgAyABNgIUIAMgADYCDEEAIQIMzwELQQAhAAJAIAMoAjgiAkUNACACKAJAIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GCDzYCECADQSA2AgxBACECDM4BC0H3ACECDLQBCyADQY8BNgIcIAMgATYCFCADQewbNgIQIANBFTYCDEEAIQIMzAELIAEgBEYEQEGPASECDMwBCwJAIAEtAABBIEYEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQZsfNgIQIANBBjYCDEEAIQIMzAELQQIhAgyyAQsDQCABLQAAQSBHDQIgBCABQQFqIgFHDQALQY4BIQIMygELIAEgBEYEQEGNASECDMoBCwJAIAEtAABBCWsOBEoAAEoAC0H1ACECDLABCyADLQApQQVGBEBB9gAhAgywAQtB9AAhAgyvAQsgASAERgRAQYwBIQIMyAELIANBEDYCCCADIAE2AgQMCgsgASAERgRAQYsBIQIMxwELAkAgAS0AAEEJaw4ERwAARwALQfMAIQIMrQELIAEgBEcEQCADQRA2AgggAyABNgIEQfEAIQIMrQELQYoBIQIMxQELAkAgASAERwRAA0AgAS0AAEGg0ABqLQAAIgBBA0cEQAJAIABBAWsOAkkABAtB8AAhAgyvAQsgBCABQQFqIgFHDQALQYgBIQIMxgELQYgBIQIMxQELIANBADYCHCADIAE2AhQgA0HbIDYCECADQQc2AgxBACECDMQBCyABIARGBEBBiQEhAgzEAQsCQAJAAkAgAS0AAEGg0gBqLQAAQQFrDgNGAgABC0HyACECDKwBCyADQQA2AhwgAyABNgIUIANBtBI2AhAgA0EHNgIMQQAhAgzEAQtB6gAhAgyqAQsgASAERwRAIAFBAWohAUHvACECDKoBC0GHASECDMIBCyAEIAEiAEYEQEGGASECDMIBCyAALQAAIgFBL0YEQCAAQQFqIQFB7gAhAgypAQsgAUEJayICQRdLDQEgACEBQQEgAnRBm4CABHENQQwBCyAEIAEiAEYEQEGFASECDMEBCyAALQAAQS9HDQAgAEEBaiEBDAMLQQAhAiADQQA2AhwgAyAANgIUIANB2yA2AhAgA0EHNgIMDL8BCwJAAkACQAJAAkADQCABLQAAQaDOAGotAAAiAEEFRwRAAkACQCAAQQFrDghHBQYHCAAEAQgLQesAIQIMrQELIAFBAWohAUHtACECDKwBCyAEIAFBAWoiAUcNAAtBhAEhAgzDAQsgAUEBagwUCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDMEBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDMABCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDL8BCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy+AQsgASAERgRAQYMBIQIMvgELAkAgAS0AAEGgzgBqLQAAQQFrDgg+BAUGAAgCAwcLIAFBAWohAQtBAyECDKMBCyABQQFqDA0LQQAhAiADQQA2AhwgA0HREjYCECADQQc2AgwgAyABQQFqNgIUDLoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDLkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDLgBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDLcBCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy2AQtB7AAhAgycAQsgASAERgRAQYIBIQIMtQELIAFBAWoMAgsgASAERgRAQYEBIQIMtAELIAFBAWoMAQsgASAERg0BIAFBAWoLIQFBBCECDJgBC0GAASECDLABCwNAIAEtAABBoMwAai0AACIAQQJHBEAgAEEBRwRAQekAIQIMmQELDDELIAQgAUEBaiIBRw0AC0H/ACECDK8BCyABIARGBEBB/gAhAgyvAQsCQCABLQAAQQlrDjcvAwYvBAYGBgYGBgYGBgYGBgYGBgYGBgUGBgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYABgsgAUEBagshAUEFIQIMlAELIAFBAWoMBgsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgypAQsgA0EANgIcIAMgATYCFCADQY0UNgIQIANBBzYCDEEAIQIMqAELAkACQAJAAkADQCABLQAAQaDKAGotAAAiAEEFRwRAAkAgAEEBaw4GLgMEBQYABgtB6AAhAgyUAQsgBCABQQFqIgFHDQALQf0AIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqAELIANBADYCHCADIAE2AhQgA0HkCDYCECADQQc2AgxBACECDKcBCyABIARGDQEgAUEBagshAUEGIQIMjAELQfwAIQIMpAELAkACQAJAAkADQCABLQAAQaDIAGotAAAiAEEFRwRAIABBAWsOBCkCAwQFCyAEIAFBAWoiAUcNAAtB+wAhAgynAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgymAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgylAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgykAQsgA0EANgIcIAMgATYCFCADQbwKNgIQIANBBzYCDEEAIQIMowELQc8AIQIMiQELQdEAIQIMiAELQecAIQIMhwELIAEgBEYEQEH6ACECDKABCwJAIAEtAABBCWsOBCAAACAACyABQQFqIQFB5gAhAgyGAQsgASAERgRAQfkAIQIMnwELAkAgAS0AAEEJaw4EHwAAHwALQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFBEBB4gEhAgyGAQsgAEEVRwRAIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDJ8BCyADQfgANgIcIAMgATYCFCADQeoaNgIQIANBFTYCDEEAIQIMngELIAEgBEcEQCADQQ02AgggAyABNgIEQeQAIQIMhQELQfcAIQIMnQELIAEgBEYEQEH2ACECDJ0BCwJAAkACQCABLQAAQcgAaw4LAAELCwsLCwsLCwILCyABQQFqIQFB3QAhAgyFAQsgAUEBaiEBQeAAIQIMhAELIAFBAWohAUHjACECDIMBC0H1ACECIAEgBEYNmwEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBtdUAai0AAEcNCCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMnAELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfQANgIcIAMgATYCFCADIAA2AgxBACECDJwBC0HiACECDIIBC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMnAELQeEAIQIMggELIANB8wA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyaAQsgAy0AKSIAQSNrQQtJDQkCQCAAQQZLDQBBASAAdEHKAHFFDQAMCgtBACECIANBADYCHCADIAE2AhQgA0HtCTYCECADQQg2AgwMmQELQfIAIQIgASAERg2YASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGz1QBqLQAARw0FIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAQsgAygCBCEAIANCADcDACADIAAgBkEBaiIBECsiAARAIANB8QA2AhwgAyABNgIUIAMgADYCDEEAIQIMmQELQd8AIQIMfwtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJkBC0HeACECDH8LIANB8AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyXAQsgAy0AKUEhRg0GIANBADYCHCADIAE2AhQgA0GRCjYCECADQQg2AgxBACECDJYBC0HvACECIAEgBEYNlQEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMlgELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgBFDQIgA0HtADYCHCADIAE2AhQgAyAANgIMQQAhAgyVAQsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNgAEgA0HuADYCHCADIAE2AhQgAyAANgIMQQAhAgyTAQtB3AAhAgx5C0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMkwELQdsAIQIMeQsgA0HsADYCHCADIAE2AhQgA0GAGzYCECADQRU2AgxBACECDJEBCyADLQApIgBBI0kNACAAQS5GDQAgA0EANgIcIAMgATYCFCADQckJNgIQIANBCDYCDEEAIQIMkAELQdoAIQIMdgsgASAERgRAQesAIQIMjwELAkAgAS0AAEEvRgRAIAFBAWohAQwBCyAD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ciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw=='\n\nlet wasmBuffer\n\nObject.defineProperty(module, 'exports', {\n get: () => {\n return wasmBuffer\n ? wasmBuffer\n : (wasmBuffer = Buffer.from(wasmBase64, 'base64'))\n }\n})\n","'use strict'\n\nconst corsSafeListedMethods = /** @type {const} */ (['GET', 'HEAD', 'POST'])\nconst corsSafeListedMethodsSet = new Set(corsSafeListedMethods)\n\nconst nullBodyStatus = /** @type {const} */ ([101, 204, 205, 304])\n\nconst redirectStatus = /** @type {const} */ ([301, 302, 303, 307, 308])\nconst redirectStatusSet = new Set(redirectStatus)\n\n/**\n * @see https://fetch.spec.whatwg.org/#block-bad-port\n */\nconst badPorts = /** @type {const} */ ([\n '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79',\n '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137',\n '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532',\n '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723',\n '2049', '3659', '4045', '4190', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6679',\n '6697', '10080'\n])\nconst badPortsSet = new Set(badPorts)\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-header\n */\nconst referrerPolicyTokens = /** @type {const} */ ([\n 'no-referrer',\n 'no-referrer-when-downgrade',\n 'same-origin',\n 'origin',\n 'strict-origin',\n 'origin-when-cross-origin',\n 'strict-origin-when-cross-origin',\n 'unsafe-url'\n])\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies\n */\nconst referrerPolicy = /** @type {const} */ ([\n '',\n ...referrerPolicyTokens\n])\nconst referrerPolicyTokensSet = new Set(referrerPolicyTokens)\n\nconst requestRedirect = /** @type {const} */ (['follow', 'manual', 'error'])\n\nconst safeMethods = /** @type {const} */ (['GET', 'HEAD', 'OPTIONS', 'TRACE'])\nconst safeMethodsSet = new Set(safeMethods)\n\nconst requestMode = /** @type {const} */ (['navigate', 'same-origin', 'no-cors', 'cors'])\n\nconst requestCredentials = /** @type {const} */ (['omit', 'same-origin', 'include'])\n\nconst requestCache = /** @type {const} */ ([\n 'default',\n 'no-store',\n 'reload',\n 'no-cache',\n 'force-cache',\n 'only-if-cached'\n])\n\n/**\n * @see https://fetch.spec.whatwg.org/#request-body-header-name\n */\nconst requestBodyHeader = /** @type {const} */ ([\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-type',\n // See https://github.com/nodejs/undici/issues/2021\n // 'Content-Length' is a forbidden header name, which is typically\n // removed in the Headers implementation. However, undici doesn't\n // filter out headers, so we add it here.\n 'content-length'\n])\n\n/**\n * @see https://fetch.spec.whatwg.org/#enumdef-requestduplex\n */\nconst requestDuplex = /** @type {const} */ ([\n 'half'\n])\n\n/**\n * @see http://fetch.spec.whatwg.org/#forbidden-method\n */\nconst forbiddenMethods = /** @type {const} */ (['CONNECT', 'TRACE', 'TRACK'])\nconst forbiddenMethodsSet = new Set(forbiddenMethods)\n\nconst subresource = /** @type {const} */ ([\n 'audio',\n 'audioworklet',\n 'font',\n 'image',\n 'manifest',\n 'paintworklet',\n 'script',\n 'style',\n 'track',\n 'video',\n 'xslt',\n ''\n])\nconst subresourceSet = new Set(subresource)\n\nmodule.exports = {\n subresource,\n forbiddenMethods,\n requestBodyHeader,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n redirectStatus,\n corsSafeListedMethods,\n nullBodyStatus,\n safeMethods,\n badPorts,\n requestDuplex,\n subresourceSet,\n badPortsSet,\n redirectStatusSet,\n corsSafeListedMethodsSet,\n safeMethodsSet,\n forbiddenMethodsSet,\n referrerPolicyTokens: referrerPolicyTokensSet\n}\n","'use strict'\n\n// In case of breaking changes, increase the version\n// number to avoid conflicts.\nconst globalOrigin = Symbol.for('undici.globalOrigin.1')\n\nfunction getGlobalOrigin () {\n return globalThis[globalOrigin]\n}\n\nfunction setGlobalOrigin (newOrigin) {\n if (newOrigin === undefined) {\n Object.defineProperty(globalThis, globalOrigin, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: false\n })\n\n return\n }\n\n const parsedURL = new URL(newOrigin)\n\n if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') {\n throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`)\n }\n\n Object.defineProperty(globalThis, globalOrigin, {\n value: parsedURL,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nmodule.exports = {\n getGlobalOrigin,\n setGlobalOrigin\n}\n","'use strict'\n\nconst textDecoder = new TextDecoder()\n\n/**\n * @see https://encoding.spec.whatwg.org/#utf-8-decode\n * @param {Uint8Array} buffer\n */\nfunction utf8DecodeBytes (buffer) {\n if (buffer.length === 0) {\n return ''\n }\n\n // 1. Let buffer be the result of peeking three bytes from\n // ioQueue, converted to a byte sequence.\n\n // 2. If buffer is 0xEF 0xBB 0xBF, then read three\n // bytes from ioQueue. (Do nothing with those bytes.)\n if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {\n buffer = buffer.subarray(3)\n }\n\n // 3. Process a queue with an instance of UTF-8’s\n // decoder, ioQueue, output, and \"replacement\".\n const output = textDecoder.decode(buffer)\n\n // 4. Return output.\n return output\n}\n\nmodule.exports = {\n utf8DecodeBytes\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { utf8DecodeBytes } = require('../../encoding')\n\n/**\n * @param {(char: string) => boolean} condition\n * @param {string} input\n * @param {{ position: number }} position\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n */\nfunction collectASequenceOfCodePoints (condition, input, position) {\n // 1. Let result be the empty string.\n let result = ''\n\n // 2. While position doesn’t point past the end of input and the\n // code point at position within input meets the condition condition:\n while (position.position < input.length && condition(input[position.position])) {\n // 1. Append that code point to the end of result.\n result += input[position.position]\n\n // 2. Advance position by 1.\n position.position++\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * A faster collectASequenceOfCodePoints that only works when comparing a single character.\n * @param {string} char\n * @param {string} input\n * @param {{ position: number }} position\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n */\nfunction collectASequenceOfCodePointsFast (char, input, position) {\n const idx = input.indexOf(char, position.position)\n const start = position.position\n\n if (idx === -1) {\n position.position = input.length\n return input.slice(start)\n }\n\n position.position = idx\n return input.slice(start, position.position)\n}\n\nconst ASCII_WHITESPACE_REPLACE_REGEX = /[\\u0009\\u000A\\u000C\\u000D\\u0020]/g // eslint-disable-line no-control-regex\n\n/**\n * @param {string} data\n * @returns {Uint8Array | 'failure'}\n *\n * @see https://infra.spec.whatwg.org/#forgiving-base64-decode\n */\nfunction forgivingBase64 (data) {\n // 1. Remove all ASCII whitespace from data.\n data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, '')\n\n let dataLength = data.length\n // 2. If data’s code point length divides by 4 leaving\n // no remainder, then:\n if (dataLength % 4 === 0) {\n // 1. If data ends with one or two U+003D (=) code points,\n // then remove them from data.\n if (data.charCodeAt(dataLength - 1) === 0x003D) {\n --dataLength\n if (data.charCodeAt(dataLength - 1) === 0x003D) {\n --dataLength\n }\n }\n }\n\n // 3. If data’s code point length divides by 4 leaving\n // a remainder of 1, then return failure.\n if (dataLength % 4 === 1) {\n return 'failure'\n }\n\n // 4. If data contains a code point that is not one of\n // U+002B (+)\n // U+002F (/)\n // ASCII alphanumeric\n // then return failure.\n if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) {\n return 'failure'\n }\n\n const buffer = Buffer.from(data, 'base64')\n return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n}\n\n/**\n * @param {number} char\n * @returns {boolean}\n *\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n */\nfunction isASCIIWhitespace (char) {\n return (\n char === 0x09 || // \\t\n char === 0x0a || // \\n\n char === 0x0c || // \\f\n char === 0x0d || // \\r\n char === 0x20 // space\n )\n}\n\n/**\n * @param {Uint8Array} input\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#isomorphic-decode\n */\nfunction isomorphicDecode (input) {\n // 1. To isomorphic decode a byte sequence input, return a string whose code point\n // length is equal to input’s length and whose code points have the same values\n // as the values of input’s bytes, in the same order.\n const length = input.length\n if ((2 << 15) - 1 > length) {\n return String.fromCharCode.apply(null, input)\n }\n let result = ''\n let i = 0\n let addition = (2 << 15) - 1\n while (i < length) {\n if (i + addition > length) {\n addition = length - i\n }\n result += String.fromCharCode.apply(null, input.subarray(i, i += addition))\n }\n return result\n}\n\nconst invalidIsomorphicEncodeValueRegex = /[^\\x00-\\xFF]/ // eslint-disable-line no-control-regex\n\n/**\n * @param {string} input\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#isomorphic-encode\n */\nfunction isomorphicEncode (input) {\n // 1. Assert: input contains no code points greater than U+00FF.\n assert(!invalidIsomorphicEncodeValueRegex.test(input))\n\n // 2. Return a byte sequence whose length is equal to input’s code\n // point length and whose bytes have the same values as the\n // values of input’s code points, in the same order\n return input\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value\n * @param {Uint8Array} bytes\n */\nfunction parseJSONFromBytes (bytes) {\n return JSON.parse(utf8DecodeBytes(bytes))\n}\n\n/**\n * @param {string} str\n * @param {boolean} [leading=true]\n * @param {boolean} [trailing=true]\n * @returns {string}\n *\n * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace\n */\nfunction removeASCIIWhitespace (str, leading = true, trailing = true) {\n return removeChars(str, leading, trailing, isASCIIWhitespace)\n}\n\n/**\n * @param {string} str\n * @param {boolean} leading\n * @param {boolean} trailing\n * @param {(charCode: number) => boolean} predicate\n * @returns {string}\n */\nfunction removeChars (str, leading, trailing, predicate) {\n let lead = 0\n let trail = str.length - 1\n\n if (leading) {\n while (lead < str.length && predicate(str.charCodeAt(lead))) lead++\n }\n\n if (trailing) {\n while (trail > 0 && predicate(str.charCodeAt(trail))) trail--\n }\n\n return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1)\n}\n\n// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string\nfunction serializeJavascriptValueToJSONString (value) {\n // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).\n const result = JSON.stringify(value)\n\n // 2. If result is undefined, then throw a TypeError.\n if (result === undefined) {\n throw new TypeError('Value is not JSON serializable')\n }\n\n // 3. Assert: result is a string.\n assert(typeof result === 'string')\n\n // 4. Return result.\n return result\n}\n\nmodule.exports = {\n collectASequenceOfCodePoints,\n collectASequenceOfCodePointsFast,\n forgivingBase64,\n isASCIIWhitespace,\n isomorphicDecode,\n isomorphicEncode,\n parseJSONFromBytes,\n removeASCIIWhitespace,\n removeChars,\n serializeJavascriptValueToJSONString\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { forgivingBase64, collectASequenceOfCodePoints, collectASequenceOfCodePointsFast, isomorphicDecode, removeASCIIWhitespace, removeChars } = require('../infra')\n\nconst encoder = new TextEncoder()\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-token-code-point\n */\nconst HTTP_TOKEN_CODEPOINTS = /^[-!#$%&'*+.^_|~A-Za-z0-9]+$/u\nconst HTTP_WHITESPACE_REGEX = /[\\u000A\\u000D\\u0009\\u0020]/u // eslint-disable-line\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point\n */\nconst HTTP_QUOTED_STRING_TOKENS = /^[\\u0009\\u0020-\\u007E\\u0080-\\u00FF]+$/u // eslint-disable-line\n\n// https://fetch.spec.whatwg.org/#data-url-processor\n/** @param {URL} dataURL */\nfunction dataURLProcessor (dataURL) {\n // 1. Assert: dataURL’s scheme is \"data\".\n assert(dataURL.protocol === 'data:')\n\n // 2. Let input be the result of running the URL\n // serializer on dataURL with exclude fragment\n // set to true.\n let input = URLSerializer(dataURL, true)\n\n // 3. Remove the leading \"data:\" string from input.\n input = input.slice(5)\n\n // 4. Let position point at the start of input.\n const position = { position: 0 }\n\n // 5. Let mimeType be the result of collecting a\n // sequence of code points that are not equal\n // to U+002C (,), given position.\n let mimeType = collectASequenceOfCodePointsFast(\n ',',\n input,\n position\n )\n\n // 6. Strip leading and trailing ASCII whitespace\n // from mimeType.\n // Undici implementation note: we need to store the\n // length because if the mimetype has spaces removed,\n // the wrong amount will be sliced from the input in\n // step #9\n const mimeTypeLength = mimeType.length\n mimeType = removeASCIIWhitespace(mimeType, true, true)\n\n // 7. If position is past the end of input, then\n // return failure\n if (position.position >= input.length) {\n return 'failure'\n }\n\n // 8. Advance position by 1.\n position.position++\n\n // 9. Let encodedBody be the remainder of input.\n const encodedBody = input.slice(mimeTypeLength + 1)\n\n // 10. Let body be the percent-decoding of encodedBody.\n let body = stringPercentDecode(encodedBody)\n\n // 11. If mimeType ends with U+003B (;), followed by\n // zero or more U+0020 SPACE, followed by an ASCII\n // case-insensitive match for \"base64\", then:\n if (/;(?:\\u0020*)base64$/ui.test(mimeType)) {\n // 1. Let stringBody be the isomorphic decode of body.\n const stringBody = isomorphicDecode(body)\n\n // 2. Set body to the forgiving-base64 decode of\n // stringBody.\n body = forgivingBase64(stringBody)\n\n // 3. If body is failure, then return failure.\n if (body === 'failure') {\n return 'failure'\n }\n\n // 4. Remove the last 6 code points from mimeType.\n mimeType = mimeType.slice(0, -6)\n\n // 5. Remove trailing U+0020 SPACE code points from mimeType,\n // if any.\n mimeType = mimeType.replace(/(\\u0020+)$/u, '')\n\n // 6. Remove the last U+003B (;) code point from mimeType.\n mimeType = mimeType.slice(0, -1)\n }\n\n // 12. If mimeType starts with U+003B (;), then prepend\n // \"text/plain\" to mimeType.\n if (mimeType.startsWith(';')) {\n mimeType = 'text/plain' + mimeType\n }\n\n // 13. Let mimeTypeRecord be the result of parsing\n // mimeType.\n let mimeTypeRecord = parseMIMEType(mimeType)\n\n // 14. If mimeTypeRecord is failure, then set\n // mimeTypeRecord to text/plain;charset=US-ASCII.\n if (mimeTypeRecord === 'failure') {\n mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII')\n }\n\n // 15. Return a new data: URL struct whose MIME\n // type is mimeTypeRecord and body is body.\n // https://fetch.spec.whatwg.org/#data-url-struct\n return { mimeType: mimeTypeRecord, body }\n}\n\n// https://url.spec.whatwg.org/#concept-url-serializer\n/**\n * @param {URL} url\n * @param {boolean} excludeFragment\n */\nfunction URLSerializer (url, excludeFragment = false) {\n if (!excludeFragment) {\n return url.href\n }\n\n const href = url.href\n const hashLength = url.hash.length\n\n const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength)\n\n if (!hashLength && href.endsWith('#')) {\n return serialized.slice(0, -1)\n }\n\n return serialized\n}\n\n// https://url.spec.whatwg.org/#string-percent-decode\n/** @param {string} input */\nfunction stringPercentDecode (input) {\n // 1. Let bytes be the UTF-8 encoding of input.\n const bytes = encoder.encode(input)\n\n // 2. Return the percent-decoding of bytes.\n return percentDecode(bytes)\n}\n\n/**\n * @param {number} byte\n */\nfunction isHexCharByte (byte) {\n // 0-9 A-F a-f\n return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66)\n}\n\n/**\n * @param {number} byte\n */\nfunction hexByteToNumber (byte) {\n return (\n // 0-9\n byte >= 0x30 && byte <= 0x39\n ? (byte - 48)\n // Convert to uppercase\n // ((byte & 0xDF) - 65) + 10\n : ((byte & 0xDF) - 55)\n )\n}\n\n// https://url.spec.whatwg.org/#percent-decode\n/** @param {Uint8Array} input */\nfunction percentDecode (input) {\n const length = input.length\n // 1. Let output be an empty byte sequence.\n /** @type {Uint8Array} */\n const output = new Uint8Array(length)\n let j = 0\n let i = 0\n // 2. For each byte byte in input:\n while (i < length) {\n const byte = input[i]\n\n // 1. If byte is not 0x25 (%), then append byte to output.\n if (byte !== 0x25) {\n output[j++] = byte\n\n // 2. Otherwise, if byte is 0x25 (%) and the next two bytes\n // after byte in input are not in the ranges\n // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),\n // and 0x61 (a) to 0x66 (f), all inclusive, append byte\n // to output.\n } else if (\n byte === 0x25 &&\n !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))\n ) {\n output[j++] = 0x25\n\n // 3. Otherwise:\n } else {\n // 1. Let bytePoint be the two bytes after byte in input,\n // decoded, and then interpreted as hexadecimal number.\n // 2. Append a byte whose value is bytePoint to output.\n output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2])\n\n // 3. Skip the next two bytes in input.\n i += 2\n }\n ++i\n }\n\n // 3. Return output.\n return length === j ? output : output.subarray(0, j)\n}\n\n// https://mimesniff.spec.whatwg.org/#parse-a-mime-type\n/** @param {string} input */\nfunction parseMIMEType (input) {\n // 1. Remove any leading and trailing HTTP whitespace\n // from input.\n input = removeHTTPWhitespace(input, true, true)\n\n // 2. Let position be a position variable for input,\n // initially pointing at the start of input.\n const position = { position: 0 }\n\n // 3. Let type be the result of collecting a sequence\n // of code points that are not U+002F (/) from\n // input, given position.\n const type = collectASequenceOfCodePointsFast(\n '/',\n input,\n position\n )\n\n // 4. If type is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n // https://mimesniff.spec.whatwg.org/#http-token-code-point\n if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {\n return 'failure'\n }\n\n // 5. If position is past the end of input, then return\n // failure\n if (position.position >= input.length) {\n return 'failure'\n }\n\n // 6. Advance position by 1. (This skips past U+002F (/).)\n position.position++\n\n // 7. Let subtype be the result of collecting a sequence of\n // code points that are not U+003B (;) from input, given\n // position.\n let subtype = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 8. Remove any trailing HTTP whitespace from subtype.\n subtype = removeHTTPWhitespace(subtype, false, true)\n\n // 9. If subtype is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {\n return 'failure'\n }\n\n const typeLowercase = type.toLowerCase()\n const subtypeLowercase = subtype.toLowerCase()\n\n // 10. Let mimeType be a new MIME type record whose type\n // is type, in ASCII lowercase, and subtype is subtype,\n // in ASCII lowercase.\n // https://mimesniff.spec.whatwg.org/#mime-type\n const mimeType = {\n type: typeLowercase,\n subtype: subtypeLowercase,\n /** @type {Map} */\n parameters: new Map(),\n // https://mimesniff.spec.whatwg.org/#mime-type-essence\n essence: `${typeLowercase}/${subtypeLowercase}`\n }\n\n // 11. While position is not past the end of input:\n while (position.position < input.length) {\n // 1. Advance position by 1. (This skips past U+003B (;).)\n position.position++\n\n // 2. Collect a sequence of code points that are HTTP\n // whitespace from input given position.\n collectASequenceOfCodePoints(\n // https://fetch.spec.whatwg.org/#http-whitespace\n char => HTTP_WHITESPACE_REGEX.test(char),\n input,\n position\n )\n\n // 3. Let parameterName be the result of collecting a\n // sequence of code points that are not U+003B (;)\n // or U+003D (=) from input, given position.\n let parameterName = collectASequenceOfCodePoints(\n (char) => char !== ';' && char !== '=',\n input,\n position\n )\n\n // 4. Set parameterName to parameterName, in ASCII\n // lowercase.\n parameterName = parameterName.toLowerCase()\n\n // 5. If position is not past the end of input, then:\n if (position.position < input.length) {\n // 1. If the code point at position within input is\n // U+003B (;), then continue.\n if (input[position.position] === ';') {\n continue\n }\n\n // 2. Advance position by 1. (This skips past U+003D (=).)\n position.position++\n }\n\n // 6. If position is past the end of input, then break.\n if (position.position >= input.length) {\n break\n }\n\n // 7. Let parameterValue be null.\n let parameterValue = null\n\n // 8. If the code point at position within input is\n // U+0022 (\"), then:\n if (input[position.position] === '\"') {\n // 1. Set parameterValue to the result of collecting\n // an HTTP quoted string from input, given position\n // and the extract-value flag.\n parameterValue = collectAnHTTPQuotedString(input, position, true)\n\n // 2. Collect a sequence of code points that are not\n // U+003B (;) from input, given position.\n collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 9. Otherwise:\n } else {\n // 1. Set parameterValue to the result of collecting\n // a sequence of code points that are not U+003B (;)\n // from input, given position.\n parameterValue = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 2. Remove any trailing HTTP whitespace from parameterValue.\n parameterValue = removeHTTPWhitespace(parameterValue, false, true)\n\n // 3. If parameterValue is the empty string, then continue.\n if (parameterValue.length === 0) {\n continue\n }\n }\n\n // 10. If all of the following are true\n // - parameterName is not the empty string\n // - parameterName solely contains HTTP token code points\n // - parameterValue solely contains HTTP quoted-string token code points\n // - mimeType’s parameters[parameterName] does not exist\n // then set mimeType’s parameters[parameterName] to parameterValue.\n if (\n parameterName.length !== 0 &&\n HTTP_TOKEN_CODEPOINTS.test(parameterName) &&\n (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&\n !mimeType.parameters.has(parameterName)\n ) {\n mimeType.parameters.set(parameterName, parameterValue)\n }\n }\n\n // 12. Return mimeType.\n return mimeType\n}\n\n// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string\n// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string\n/**\n * @param {string} input\n * @param {{ position: number }} position\n * @param {boolean} [extractValue=false]\n */\nfunction collectAnHTTPQuotedString (input, position, extractValue = false) {\n // 1. Let positionStart be position.\n const positionStart = position.position\n\n // 2. Let value be the empty string.\n let value = ''\n\n // 3. Assert: the code point at position within input\n // is U+0022 (\").\n assert(input[position.position] === '\"')\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. While true:\n while (true) {\n // 1. Append the result of collecting a sequence of code points\n // that are not U+0022 (\") or U+005C (\\) from input, given\n // position, to value.\n value += collectASequenceOfCodePoints(\n (char) => char !== '\"' && char !== '\\\\',\n input,\n position\n )\n\n // 2. If position is past the end of input, then break.\n if (position.position >= input.length) {\n break\n }\n\n // 3. Let quoteOrBackslash be the code point at position within\n // input.\n const quoteOrBackslash = input[position.position]\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. If quoteOrBackslash is U+005C (\\), then:\n if (quoteOrBackslash === '\\\\') {\n // 1. If position is past the end of input, then append\n // U+005C (\\) to value and break.\n if (position.position >= input.length) {\n value += '\\\\'\n break\n }\n\n // 2. Append the code point at position within input to value.\n value += input[position.position]\n\n // 3. Advance position by 1.\n position.position++\n\n // 6. Otherwise:\n } else {\n // 1. Assert: quoteOrBackslash is U+0022 (\").\n assert(quoteOrBackslash === '\"')\n\n // 2. Break.\n break\n }\n }\n\n // 6. If the extract-value flag is set, then return value.\n if (extractValue) {\n return value\n }\n\n // 7. Return the code points from positionStart to position,\n // inclusive, within input.\n return input.slice(positionStart, position.position)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type\n */\nfunction serializeAMimeType (mimeType) {\n assert(mimeType !== 'failure')\n const { parameters, essence } = mimeType\n\n // 1. Let serialization be the concatenation of mimeType’s\n // type, U+002F (/), and mimeType’s subtype.\n let serialization = essence\n\n // 2. For each name → value of mimeType’s parameters:\n for (let [name, value] of parameters.entries()) {\n // 1. Append U+003B (;) to serialization.\n serialization += ';'\n\n // 2. Append name to serialization.\n serialization += name\n\n // 3. Append U+003D (=) to serialization.\n serialization += '='\n\n // 4. If value does not solely contain HTTP token code\n // points or value is the empty string, then:\n if (!HTTP_TOKEN_CODEPOINTS.test(value)) {\n // 1. Precede each occurrence of U+0022 (\") or\n // U+005C (\\) in value with U+005C (\\).\n value = value.replace(/[\\\\\"]/ug, '\\\\$&')\n\n // 2. Prepend U+0022 (\") to value.\n value = '\"' + value\n\n // 3. Append U+0022 (\") to value.\n value += '\"'\n }\n\n // 5. Append value to serialization.\n serialization += value\n }\n\n // 3. Return serialization.\n return serialization\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {number} char\n */\nfunction isHTTPWhiteSpace (char) {\n // \"\\r\\n\\t \"\n return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {string} str\n * @param {boolean} [leading=true]\n * @param {boolean} [trailing=true]\n */\nfunction removeHTTPWhitespace (str, leading = true, trailing = true) {\n return removeChars(str, leading, trailing, isHTTPWhiteSpace)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type\n * @param {Exclude, 'failure'>} mimeType\n */\nfunction minimizeSupportedMimeType (mimeType) {\n switch (mimeType.essence) {\n case 'application/ecmascript':\n case 'application/javascript':\n case 'application/x-ecmascript':\n case 'application/x-javascript':\n case 'text/ecmascript':\n case 'text/javascript':\n case 'text/javascript1.0':\n case 'text/javascript1.1':\n case 'text/javascript1.2':\n case 'text/javascript1.3':\n case 'text/javascript1.4':\n case 'text/javascript1.5':\n case 'text/jscript':\n case 'text/livescript':\n case 'text/x-ecmascript':\n case 'text/x-javascript':\n // 1. If mimeType is a JavaScript MIME type, then return \"text/javascript\".\n return 'text/javascript'\n case 'application/json':\n case 'text/json':\n // 2. If mimeType is a JSON MIME type, then return \"application/json\".\n return 'application/json'\n case 'image/svg+xml':\n // 3. If mimeType’s essence is \"image/svg+xml\", then return \"image/svg+xml\".\n return 'image/svg+xml'\n case 'text/xml':\n case 'application/xml':\n // 4. If mimeType is an XML MIME type, then return \"application/xml\".\n return 'application/xml'\n }\n\n // 2. If mimeType is a JSON MIME type, then return \"application/json\".\n if (mimeType.subtype.endsWith('+json')) {\n return 'application/json'\n }\n\n // 4. If mimeType is an XML MIME type, then return \"application/xml\".\n if (mimeType.subtype.endsWith('+xml')) {\n return 'application/xml'\n }\n\n // 5. If mimeType is supported by the user agent, then return mimeType’s essence.\n // Technically, node doesn't support any mimetypes.\n\n // 6. Return the empty string.\n return ''\n}\n\nmodule.exports = {\n dataURLProcessor,\n URLSerializer,\n stringPercentDecode,\n parseMIMEType,\n collectAnHTTPQuotedString,\n serializeAMimeType,\n removeHTTPWhitespace,\n minimizeSupportedMimeType,\n HTTP_TOKEN_CODEPOINTS\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { types, inspect } = require('node:util')\nconst { markAsUncloneable } = require('node:worker_threads')\n\nconst UNDEFINED = 1\nconst BOOLEAN = 2\nconst STRING = 3\nconst SYMBOL = 4\nconst NUMBER = 5\nconst BIGINT = 6\nconst NULL = 7\nconst OBJECT = 8 // function and object\n\nconst FunctionPrototypeSymbolHasInstance = Function.call.bind(Function.prototype[Symbol.hasInstance])\n\n/** @type {import('../../../types/webidl').Webidl} */\nconst webidl = {\n converters: {},\n util: {},\n errors: {},\n is: {}\n}\n\n/**\n * @description Instantiate an error.\n *\n * @param {Object} opts\n * @param {string} opts.header\n * @param {string} opts.message\n * @returns {TypeError}\n */\nwebidl.errors.exception = function (message) {\n return new TypeError(`${message.header}: ${message.message}`)\n}\n\n/**\n * @description Instantiate an error when conversion from one type to another has failed.\n *\n * @param {Object} opts\n * @param {string} opts.prefix\n * @param {string} opts.argument\n * @param {string[]} opts.types\n * @returns {TypeError}\n */\nwebidl.errors.conversionFailed = function (opts) {\n const plural = opts.types.length === 1 ? '' : ' one of'\n const message =\n `${opts.argument} could not be converted to` +\n `${plural}: ${opts.types.join(', ')}.`\n\n return webidl.errors.exception({\n header: opts.prefix,\n message\n })\n}\n\n/**\n * @description Instantiate an error when an invalid argument is provided\n *\n * @param {Object} context\n * @param {string} context.prefix\n * @param {string} context.value\n * @param {string} context.type\n * @returns {TypeError}\n */\nwebidl.errors.invalidArgument = function (context) {\n return webidl.errors.exception({\n header: context.prefix,\n message: `\"${context.value}\" is an invalid ${context.type}.`\n })\n}\n\n// https://webidl.spec.whatwg.org/#implements\nwebidl.brandCheck = function (V, I) {\n if (!FunctionPrototypeSymbolHasInstance(I, V)) {\n const err = new TypeError('Illegal invocation')\n err.code = 'ERR_INVALID_THIS' // node compat.\n throw err\n }\n}\n\nwebidl.brandCheckMultiple = function (List) {\n const prototypes = List.map((c) => webidl.util.MakeTypeAssertion(c))\n\n return (V) => {\n if (prototypes.every(typeCheck => !typeCheck(V))) {\n const err = new TypeError('Illegal invocation')\n err.code = 'ERR_INVALID_THIS' // node compat.\n throw err\n }\n }\n}\n\nwebidl.argumentLengthCheck = function ({ length }, min, ctx) {\n if (length < min) {\n throw webidl.errors.exception({\n message: `${min} argument${min !== 1 ? 's' : ''} required, ` +\n `but${length ? ' only' : ''} ${length} found.`,\n header: ctx\n })\n }\n}\n\nwebidl.illegalConstructor = function () {\n throw webidl.errors.exception({\n header: 'TypeError',\n message: 'Illegal constructor'\n })\n}\n\nwebidl.util.MakeTypeAssertion = function (I) {\n return (O) => FunctionPrototypeSymbolHasInstance(I, O)\n}\n\n// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values\nwebidl.util.Type = function (V) {\n switch (typeof V) {\n case 'undefined': return UNDEFINED\n case 'boolean': return BOOLEAN\n case 'string': return STRING\n case 'symbol': return SYMBOL\n case 'number': return NUMBER\n case 'bigint': return BIGINT\n case 'function':\n case 'object': {\n if (V === null) {\n return NULL\n }\n\n return OBJECT\n }\n }\n}\n\nwebidl.util.Types = {\n UNDEFINED,\n BOOLEAN,\n STRING,\n SYMBOL,\n NUMBER,\n BIGINT,\n NULL,\n OBJECT\n}\n\nwebidl.util.TypeValueToString = function (o) {\n switch (webidl.util.Type(o)) {\n case UNDEFINED: return 'Undefined'\n case BOOLEAN: return 'Boolean'\n case STRING: return 'String'\n case SYMBOL: return 'Symbol'\n case NUMBER: return 'Number'\n case BIGINT: return 'BigInt'\n case NULL: return 'Null'\n case OBJECT: return 'Object'\n }\n}\n\nwebidl.util.markAsUncloneable = markAsUncloneable\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint\nwebidl.util.ConvertToInt = function (V, bitLength, signedness, flags) {\n let upperBound\n let lowerBound\n\n // 1. If bitLength is 64, then:\n if (bitLength === 64) {\n // 1. Let upperBound be 2^53 − 1.\n upperBound = Math.pow(2, 53) - 1\n\n // 2. If signedness is \"unsigned\", then let lowerBound be 0.\n if (signedness === 'unsigned') {\n lowerBound = 0\n } else {\n // 3. Otherwise let lowerBound be −2^53 + 1.\n lowerBound = Math.pow(-2, 53) + 1\n }\n } else if (signedness === 'unsigned') {\n // 2. Otherwise, if signedness is \"unsigned\", then:\n\n // 1. Let lowerBound be 0.\n lowerBound = 0\n\n // 2. Let upperBound be 2^bitLength − 1.\n upperBound = Math.pow(2, bitLength) - 1\n } else {\n // 3. Otherwise:\n\n // 1. Let lowerBound be -2^bitLength − 1.\n lowerBound = Math.pow(-2, bitLength) - 1\n\n // 2. Let upperBound be 2^bitLength − 1 − 1.\n upperBound = Math.pow(2, bitLength - 1) - 1\n }\n\n // 4. Let x be ? ToNumber(V).\n let x = Number(V)\n\n // 5. If x is −0, then set x to +0.\n if (x === 0) {\n x = 0\n }\n\n // 6. If the conversion is to an IDL type associated\n // with the [EnforceRange] extended attribute, then:\n if (webidl.util.HasFlag(flags, webidl.attributes.EnforceRange)) {\n // 1. If x is NaN, +∞, or −∞, then throw a TypeError.\n if (\n Number.isNaN(x) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Could not convert ${webidl.util.Stringify(V)} to an integer.`\n })\n }\n\n // 2. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 3. If x < lowerBound or x > upperBound, then\n // throw a TypeError.\n if (x < lowerBound || x > upperBound) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.`\n })\n }\n\n // 4. Return x.\n return x\n }\n\n // 7. If x is not NaN and the conversion is to an IDL\n // type associated with the [Clamp] extended\n // attribute, then:\n if (!Number.isNaN(x) && webidl.util.HasFlag(flags, webidl.attributes.Clamp)) {\n // 1. Set x to min(max(x, lowerBound), upperBound).\n x = Math.min(Math.max(x, lowerBound), upperBound)\n\n // 2. Round x to the nearest integer, choosing the\n // even integer if it lies halfway between two,\n // and choosing +0 rather than −0.\n if (Math.floor(x) % 2 === 0) {\n x = Math.floor(x)\n } else {\n x = Math.ceil(x)\n }\n\n // 3. Return x.\n return x\n }\n\n // 8. If x is NaN, +0, +∞, or −∞, then return +0.\n if (\n Number.isNaN(x) ||\n (x === 0 && Object.is(0, x)) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n return 0\n }\n\n // 9. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 10. Set x to x modulo 2^bitLength.\n x = x % Math.pow(2, bitLength)\n\n // 11. If signedness is \"signed\" and x ≥ 2^bitLength − 1,\n // then return x − 2^bitLength.\n if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {\n return x - Math.pow(2, bitLength)\n }\n\n // 12. Otherwise, return x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart\nwebidl.util.IntegerPart = function (n) {\n // 1. Let r be floor(abs(n)).\n const r = Math.floor(Math.abs(n))\n\n // 2. If n < 0, then return -1 × r.\n if (n < 0) {\n return -1 * r\n }\n\n // 3. Otherwise, return r.\n return r\n}\n\nwebidl.util.Stringify = function (V) {\n const type = webidl.util.Type(V)\n\n switch (type) {\n case SYMBOL:\n return `Symbol(${V.description})`\n case OBJECT:\n return inspect(V)\n case STRING:\n return `\"${V}\"`\n case BIGINT:\n return `${V}n`\n default:\n return `${V}`\n }\n}\n\nwebidl.util.IsResizableArrayBuffer = function (V) {\n if (types.isArrayBuffer(V)) {\n return V.resizable\n }\n\n if (types.isSharedArrayBuffer(V)) {\n return V.growable\n }\n\n throw webidl.errors.exception({\n header: 'IsResizableArrayBuffer',\n message: `\"${webidl.util.Stringify(V)}\" is not an array buffer.`\n })\n}\n\nwebidl.util.HasFlag = function (flags, attributes) {\n return typeof flags === 'number' && (flags & attributes) === attributes\n}\n\n// https://webidl.spec.whatwg.org/#es-sequence\nwebidl.sequenceConverter = function (converter) {\n return (V, prefix, argument, Iterable) => {\n // 1. If Type(V) is not Object, throw a TypeError.\n if (webidl.util.Type(V) !== OBJECT) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.`\n })\n }\n\n // 2. Let method be ? GetMethod(V, @@iterator).\n /** @type {Generator} */\n const method = typeof Iterable === 'function' ? Iterable() : V?.[Symbol.iterator]?.()\n const seq = []\n let index = 0\n\n // 3. If method is undefined, throw a TypeError.\n if (\n method === undefined ||\n typeof method.next !== 'function'\n ) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} is not iterable.`\n })\n }\n\n // https://webidl.spec.whatwg.org/#create-sequence-from-iterable\n while (true) {\n const { done, value } = method.next()\n\n if (done) {\n break\n }\n\n seq.push(converter(value, prefix, `${argument}[${index++}]`))\n }\n\n return seq\n }\n}\n\n// https://webidl.spec.whatwg.org/#es-to-record\nwebidl.recordConverter = function (keyConverter, valueConverter) {\n return (O, prefix, argument) => {\n // 1. If Type(O) is not Object, throw a TypeError.\n if (webidl.util.Type(O) !== OBJECT) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} (\"${webidl.util.TypeValueToString(O)}\") is not an Object.`\n })\n }\n\n // 2. Let result be a new empty instance of record.\n const result = {}\n\n if (!types.isProxy(O)) {\n // 1. Let desc be ? O.[[GetOwnProperty]](key).\n const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]\n\n for (const key of keys) {\n const keyName = webidl.util.Stringify(key)\n\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key, prefix, `Key ${keyName} in ${argument}`)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key], prefix, `${argument}[${keyName}]`)\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n\n // 5. Return result.\n return result\n }\n\n // 3. Let keys be ? O.[[OwnPropertyKeys]]().\n const keys = Reflect.ownKeys(O)\n\n // 4. For each key of keys.\n for (const key of keys) {\n // 1. Let desc be ? O.[[GetOwnProperty]](key).\n const desc = Reflect.getOwnPropertyDescriptor(O, key)\n\n // 2. If desc is not undefined and desc.[[Enumerable]] is true:\n if (desc?.enumerable) {\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key, prefix, argument)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key], prefix, argument)\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n }\n\n // 5. Return result.\n return result\n }\n}\n\nwebidl.interfaceConverter = function (TypeCheck, name) {\n return (V, prefix, argument) => {\n if (!TypeCheck(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `Expected ${argument} (\"${webidl.util.Stringify(V)}\") to be an instance of ${name}.`\n })\n }\n\n return V\n }\n}\n\nwebidl.dictionaryConverter = function (converters) {\n // \"For each dictionary member member declared on dictionary, in lexicographical order:\"\n converters.sort((a, b) => (a.key > b.key) - (a.key < b.key))\n\n return (dictionary, prefix, argument) => {\n const dict = {}\n\n if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) {\n throw webidl.errors.exception({\n header: prefix,\n message: `Expected ${dictionary} to be one of: Null, Undefined, Object.`\n })\n }\n\n for (const options of converters) {\n const { key, defaultValue, required, converter } = options\n\n if (required === true) {\n if (dictionary == null || !Object.hasOwn(dictionary, key)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `Missing required key \"${key}\".`\n })\n }\n }\n\n let value = dictionary?.[key]\n const hasDefault = defaultValue !== undefined\n\n // Only use defaultValue if value is undefined and\n // a defaultValue options was provided.\n if (hasDefault && value === undefined) {\n value = defaultValue()\n }\n\n // A key can be optional and have no default value.\n // When this happens, do not perform a conversion,\n // and do not assign the key a value.\n if (required || hasDefault || value !== undefined) {\n value = converter(value, prefix, `${argument}.${key}`)\n\n if (\n options.allowedValues &&\n !options.allowedValues.includes(value)\n ) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.`\n })\n }\n\n dict[key] = value\n }\n }\n\n return dict\n }\n}\n\nwebidl.nullableConverter = function (converter) {\n return (V, prefix, argument) => {\n if (V === null) {\n return V\n }\n\n return converter(V, prefix, argument)\n }\n}\n\n/**\n * @param {*} value\n * @returns {boolean}\n */\nwebidl.is.USVString = function (value) {\n return (\n typeof value === 'string' &&\n value.isWellFormed()\n )\n}\n\nwebidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream)\nwebidl.is.Blob = webidl.util.MakeTypeAssertion(Blob)\nwebidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams)\nwebidl.is.File = webidl.util.MakeTypeAssertion(File)\nwebidl.is.URL = webidl.util.MakeTypeAssertion(URL)\nwebidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal)\nwebidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort)\n\nwebidl.is.BufferSource = function (V) {\n return types.isArrayBuffer(V) || (\n ArrayBuffer.isView(V) &&\n types.isArrayBuffer(V.buffer)\n )\n}\n\n// https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy\nwebidl.util.getCopyOfBytesHeldByBufferSource = function (bufferSource) {\n // 1. Let jsBufferSource be the result of converting bufferSource to a JavaScript value.\n const jsBufferSource = bufferSource\n\n // 2. Let jsArrayBuffer be jsBufferSource.\n let jsArrayBuffer = jsBufferSource\n\n // 3. Let offset be 0.\n let offset = 0\n\n // 4. Let length be 0.\n let length = 0\n\n // 5. If jsBufferSource has a [[ViewedArrayBuffer]] internal slot, then:\n if (types.isTypedArray(jsBufferSource) || types.isDataView(jsBufferSource)) {\n // 5.1. Set jsArrayBuffer to jsBufferSource.[[ViewedArrayBuffer]].\n jsArrayBuffer = jsBufferSource.buffer\n\n // 5.2. Set offset to jsBufferSource.[[ByteOffset]].\n offset = jsBufferSource.byteOffset\n\n // 5.3. Set length to jsBufferSource.[[ByteLength]].\n length = jsBufferSource.byteLength\n } else {\n // 6. Otherwise:\n\n // 6.1. Assert: jsBufferSource is an ArrayBuffer or SharedArrayBuffer object.\n assert(types.isAnyArrayBuffer(jsBufferSource))\n\n // 6.2. Set length to jsBufferSource.[[ArrayBufferByteLength]].\n length = jsBufferSource.byteLength\n }\n\n // 7. If IsDetachedBuffer(jsArrayBuffer) is true, then return the empty byte sequence.\n if (jsArrayBuffer.detached) {\n return new Uint8Array(0)\n }\n\n // 8. Let bytes be a new byte sequence of length equal to length.\n const bytes = new Uint8Array(length)\n\n // 9. For i in the range offset to offset + length − 1, inclusive,\n // set bytes[i − offset] to GetValueFromBuffer(jsArrayBuffer, i, Uint8, true, Unordered).\n const view = new Uint8Array(jsArrayBuffer, offset, length)\n bytes.set(view)\n\n // 10. Return bytes.\n return bytes\n}\n\n// https://webidl.spec.whatwg.org/#es-DOMString\nwebidl.converters.DOMString = function (V, prefix, argument, flags) {\n // 1. If V is null and the conversion is to an IDL type\n // associated with the [LegacyNullToEmptyString]\n // extended attribute, then return the DOMString value\n // that represents the empty string.\n if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) {\n return ''\n }\n\n // 2. Let x be ? ToString(V).\n if (typeof V === 'symbol') {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} is a symbol, which cannot be converted to a DOMString.`\n })\n }\n\n // 3. Return the IDL DOMString value that represents the\n // same sequence of code units as the one the\n // ECMAScript String value x represents.\n return String(V)\n}\n\n// https://webidl.spec.whatwg.org/#es-ByteString\nwebidl.converters.ByteString = function (V, prefix, argument) {\n // 1. Let x be ? ToString(V).\n if (typeof V === 'symbol') {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} is a symbol, which cannot be converted to a ByteString.`\n })\n }\n\n const x = String(V)\n\n // 2. If the value of any element of x is greater than\n // 255, then throw a TypeError.\n for (let index = 0; index < x.length; index++) {\n if (x.charCodeAt(index) > 255) {\n throw new TypeError(\n 'Cannot convert argument to a ByteString because the character at ' +\n `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`\n )\n }\n }\n\n // 3. Return an IDL ByteString value whose length is the\n // length of x, and where the value of each element is\n // the value of the corresponding element of x.\n return x\n}\n\n/**\n * @param {unknown} value\n * @returns {string}\n * @see https://webidl.spec.whatwg.org/#es-USVString\n */\nwebidl.converters.USVString = function (value) {\n // TODO: rewrite this so we can control the errors thrown\n if (typeof value === 'string') {\n return value.toWellFormed()\n }\n return `${value}`.toWellFormed()\n}\n\n// https://webidl.spec.whatwg.org/#es-boolean\nwebidl.converters.boolean = function (V) {\n // 1. Let x be the result of computing ToBoolean(V).\n // https://262.ecma-international.org/10.0/index.html#table-10\n const x = Boolean(V)\n\n // 2. Return the IDL boolean value that is the one that represents\n // the same truth value as the ECMAScript Boolean value x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-any\nwebidl.converters.any = function (V) {\n return V\n}\n\n// https://webidl.spec.whatwg.org/#es-long-long\nwebidl.converters['long long'] = function (V, prefix, argument) {\n // 1. Let x be ? ConvertToInt(V, 64, \"signed\").\n const x = webidl.util.ConvertToInt(V, 64, 'signed', 0, prefix, argument)\n\n // 2. Return the IDL long long value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long-long\nwebidl.converters['unsigned long long'] = function (V, prefix, argument) {\n // 1. Let x be ? ConvertToInt(V, 64, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 64, 'unsigned', 0, prefix, argument)\n\n // 2. Return the IDL unsigned long long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long\nwebidl.converters['unsigned long'] = function (V, prefix, argument) {\n // 1. Let x be ? ConvertToInt(V, 32, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 32, 'unsigned', 0, prefix, argument)\n\n // 2. Return the IDL unsigned long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-short\nwebidl.converters['unsigned short'] = function (V, prefix, argument, flags) {\n // 1. Let x be ? ConvertToInt(V, 16, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 16, 'unsigned', flags, prefix, argument)\n\n // 2. Return the IDL unsigned short value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#idl-ArrayBuffer\nwebidl.converters.ArrayBuffer = function (V, prefix, argument, flags) {\n // 1. If V is not an Object, or V does not have an\n // [[ArrayBufferData]] internal slot, then throw a\n // TypeError.\n // 2. If IsSharedArrayBuffer(V) is true, then throw a\n // TypeError.\n // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isArrayBuffer(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBuffer']\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V) is true, then throw a\n // TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a resizable ArrayBuffer.`\n })\n }\n\n // 4. Return the IDL ArrayBuffer value that is a\n // reference to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#idl-SharedArrayBuffer\nwebidl.converters.SharedArrayBuffer = function (V, prefix, argument, flags) {\n // 1. If V is not an Object, or V does not have an\n // [[ArrayBufferData]] internal slot, then throw a\n // TypeError.\n // 2. If IsSharedArrayBuffer(V) is false, then throw a\n // TypeError.\n // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isSharedArrayBuffer(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['SharedArrayBuffer']\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V) is true, then throw a\n // TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a resizable SharedArrayBuffer.`\n })\n }\n\n // 4. Return the IDL SharedArrayBuffer value that is a\n // reference to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#dfn-typed-array-type\nwebidl.converters.TypedArray = function (V, T, prefix, argument, flags) {\n // 1. Let T be the IDL type V is being converted to.\n\n // 2. If Type(V) is not Object, or V does not have a\n // [[TypedArrayName]] internal slot with a value\n // equal to T’s name, then throw a TypeError.\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isTypedArray(V) ||\n V.constructor.name !== T.name\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: [T.name]\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a shared array buffer.`\n })\n }\n\n // 4. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a resizable array buffer.`\n })\n }\n\n // 5. Return the IDL value of type T that is a reference\n // to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#idl-DataView\nwebidl.converters.DataView = function (V, prefix, argument, flags) {\n // 1. If Type(V) is not Object, or V does not have a\n // [[DataView]] internal slot, then throw a TypeError.\n if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['DataView']\n })\n }\n\n // 2. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,\n // then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a shared array buffer.`\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a resizable array buffer.`\n })\n }\n\n // 4. Return the IDL DataView value that is a reference\n // to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#ArrayBufferView\nwebidl.converters.ArrayBufferView = function (V, prefix, argument, flags) {\n if (\n webidl.util.Type(V) !== OBJECT ||\n !types.isArrayBufferView(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBufferView']\n })\n }\n\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a shared array buffer.`\n })\n }\n\n if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a view on a resizable array buffer.`\n })\n }\n\n return V\n}\n\n// https://webidl.spec.whatwg.org/#BufferSource\nwebidl.converters.BufferSource = function (V, prefix, argument, flags) {\n if (types.isArrayBuffer(V)) {\n return webidl.converters.ArrayBuffer(V, prefix, argument, flags)\n }\n\n if (types.isArrayBufferView(V)) {\n flags &= ~webidl.attributes.AllowShared\n\n return webidl.converters.ArrayBufferView(V, prefix, argument, flags)\n }\n\n // Make this explicit for easier debugging\n if (types.isSharedArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: prefix,\n message: `${argument} cannot be a SharedArrayBuffer.`\n })\n }\n\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBuffer', 'ArrayBufferView']\n })\n}\n\n// https://webidl.spec.whatwg.org/#AllowSharedBufferSource\nwebidl.converters.AllowSharedBufferSource = function (V, prefix, argument, flags) {\n if (types.isArrayBuffer(V)) {\n return webidl.converters.ArrayBuffer(V, prefix, argument, flags)\n }\n\n if (types.isSharedArrayBuffer(V)) {\n return webidl.converters.SharedArrayBuffer(V, prefix, argument, flags)\n }\n\n if (types.isArrayBufferView(V)) {\n flags |= webidl.attributes.AllowShared\n return webidl.converters.ArrayBufferView(V, prefix, argument, flags)\n }\n\n throw webidl.errors.conversionFailed({\n prefix,\n argument: `${argument} (\"${webidl.util.Stringify(V)}\")`,\n types: ['ArrayBuffer', 'SharedArrayBuffer', 'ArrayBufferView']\n })\n}\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.ByteString\n)\n\nwebidl.converters['sequence>'] = webidl.sequenceConverter(\n webidl.converters['sequence']\n)\n\nwebidl.converters['record'] = webidl.recordConverter(\n webidl.converters.ByteString,\n webidl.converters.ByteString\n)\n\nwebidl.converters.Blob = webidl.interfaceConverter(webidl.is.Blob, 'Blob')\n\nwebidl.converters.AbortSignal = webidl.interfaceConverter(\n webidl.is.AbortSignal,\n 'AbortSignal'\n)\n\n/**\n * [LegacyTreatNonObjectAsNull]\n * callback EventHandlerNonNull = any (Event event);\n * typedef EventHandlerNonNull? EventHandler;\n * @param {*} V\n */\nwebidl.converters.EventHandlerNonNull = function (V) {\n if (webidl.util.Type(V) !== OBJECT) {\n return null\n }\n\n // [I]f the value is not an object, it will be converted to null, and if the value is not callable,\n // it will be converted to a callback function value that does nothing when called.\n if (typeof V === 'function') {\n return V\n }\n\n return () => {}\n}\n\nwebidl.attributes = {\n Clamp: 1 << 0,\n EnforceRange: 1 << 1,\n AllowShared: 1 << 2,\n AllowResizable: 1 << 3,\n LegacyNullToEmptyString: 1 << 4\n}\n\nmodule.exports = {\n webidl\n}\n","'use strict'\n\nconst { Transform } = require('node:stream')\nconst zlib = require('node:zlib')\nconst { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require('./constants')\nconst { getGlobalOrigin } = require('./global')\nconst { collectAnHTTPQuotedString, parseMIMEType } = require('./data-url')\nconst { performance } = require('node:perf_hooks')\nconst { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require('../../core/util')\nconst assert = require('node:assert')\nconst { isUint8Array } = require('node:util/types')\nconst { webidl } = require('../webidl')\nconst { isomorphicEncode, collectASequenceOfCodePoints, removeChars } = require('../infra')\n\nfunction responseURL (response) {\n // https://fetch.spec.whatwg.org/#responses\n // A response has an associated URL. It is a pointer to the last URL\n // in response’s URL list and null if response’s URL list is empty.\n const urlList = response.urlList\n const length = urlList.length\n return length === 0 ? null : urlList[length - 1].toString()\n}\n\n// https://fetch.spec.whatwg.org/#concept-response-location-url\nfunction responseLocationURL (response, requestFragment) {\n // 1. If response’s status is not a redirect status, then return null.\n if (!redirectStatusSet.has(response.status)) {\n return null\n }\n\n // 2. Let location be the result of extracting header list values given\n // `Location` and response’s header list.\n let location = response.headersList.get('location', true)\n\n // 3. If location is a header value, then set location to the result of\n // parsing location with response’s URL.\n if (location !== null && isValidHeaderValue(location)) {\n if (!isValidEncodedURL(location)) {\n // Some websites respond location header in UTF-8 form without encoding them as ASCII\n // and major browsers redirect them to correctly UTF-8 encoded addresses.\n // Here, we handle that behavior in the same way.\n location = normalizeBinaryStringToUtf8(location)\n }\n location = new URL(location, responseURL(response))\n }\n\n // 4. If location is a URL whose fragment is null, then set location’s\n // fragment to requestFragment.\n if (location && !location.hash) {\n location.hash = requestFragment\n }\n\n // 5. Return location.\n return location\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2\n * @param {string} url\n * @returns {boolean}\n */\nfunction isValidEncodedURL (url) {\n for (let i = 0; i < url.length; ++i) {\n const code = url.charCodeAt(i)\n\n if (\n code > 0x7E || // Non-US-ASCII + DEL\n code < 0x20 // Control characters NUL - US\n ) {\n return false\n }\n }\n return true\n}\n\n/**\n * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it.\n * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well.\n * @param {string} value\n * @returns {string}\n */\nfunction normalizeBinaryStringToUtf8 (value) {\n return Buffer.from(value, 'binary').toString('utf8')\n}\n\n/** @returns {URL} */\nfunction requestCurrentURL (request) {\n return request.urlList[request.urlList.length - 1]\n}\n\nfunction requestBadPort (request) {\n // 1. Let url be request’s current URL.\n const url = requestCurrentURL(request)\n\n // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,\n // then return blocked.\n if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {\n return 'blocked'\n }\n\n // 3. Return allowed.\n return 'allowed'\n}\n\nfunction isErrorLike (object) {\n return object instanceof Error || (\n object?.constructor?.name === 'Error' ||\n object?.constructor?.name === 'DOMException'\n )\n}\n\n// Check whether |statusText| is a ByteString and\n// matches the Reason-Phrase token production.\n// RFC 2616: https://tools.ietf.org/html/rfc2616\n// RFC 7230: https://tools.ietf.org/html/rfc7230\n// \"reason-phrase = *( HTAB / SP / VCHAR / obs-text )\"\n// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116\nfunction isValidReasonPhrase (statusText) {\n for (let i = 0; i < statusText.length; ++i) {\n const c = statusText.charCodeAt(i)\n if (\n !(\n (\n c === 0x09 || // HTAB\n (c >= 0x20 && c <= 0x7e) || // SP / VCHAR\n (c >= 0x80 && c <= 0xff)\n ) // obs-text\n )\n ) {\n return false\n }\n }\n return true\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-name\n * @param {string} potentialValue\n */\nconst isValidHeaderName = isValidHTTPToken\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value\n * @param {string} potentialValue\n */\nfunction isValidHeaderValue (potentialValue) {\n // - Has no leading or trailing HTTP tab or space bytes.\n // - Contains no 0x00 (NUL) or HTTP newline bytes.\n return (\n potentialValue[0] === '\\t' ||\n potentialValue[0] === ' ' ||\n potentialValue[potentialValue.length - 1] === '\\t' ||\n potentialValue[potentialValue.length - 1] === ' ' ||\n potentialValue.includes('\\n') ||\n potentialValue.includes('\\r') ||\n potentialValue.includes('\\0')\n ) === false\n}\n\n/**\n * Parse a referrer policy from a Referrer-Policy header\n * @see https://w3c.github.io/webappsec-referrer-policy/#parse-referrer-policy-from-header\n */\nfunction parseReferrerPolicy (actualResponse) {\n // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.\n const policyHeader = (actualResponse.headersList.get('referrer-policy', true) ?? '').split(',')\n\n // 2. Let policy be the empty string.\n let policy = ''\n\n // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.\n\n // Note: As the referrer-policy can contain multiple policies\n // separated by comma, we need to loop through all of them\n // and pick the first valid one.\n // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy\n if (policyHeader.length) {\n // The right-most policy takes precedence.\n // The left-most policy is the fallback.\n for (let i = policyHeader.length; i !== 0; i--) {\n const token = policyHeader[i - 1].trim()\n if (referrerPolicyTokens.has(token)) {\n policy = token\n break\n }\n }\n }\n\n // 4. Return policy.\n return policy\n}\n\n/**\n * Given a request request and a response actualResponse, this algorithm\n * updates request’s referrer policy according to the Referrer-Policy\n * header (if any) in actualResponse.\n * @see https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect\n * @param {import('./request').Request} request\n * @param {import('./response').Response} actualResponse\n */\nfunction setRequestReferrerPolicyOnRedirect (request, actualResponse) {\n // 1. Let policy be the result of executing § 8.1 Parse a referrer policy\n // from a Referrer-Policy header on actualResponse.\n const policy = parseReferrerPolicy(actualResponse)\n\n // 2. If policy is not the empty string, then set request’s referrer policy to policy.\n if (policy !== '') {\n request.referrerPolicy = policy\n }\n}\n\n// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check\nfunction crossOriginResourcePolicyCheck () {\n // TODO\n return 'allowed'\n}\n\n// https://fetch.spec.whatwg.org/#concept-cors-check\nfunction corsCheck () {\n // TODO\n return 'success'\n}\n\n// https://fetch.spec.whatwg.org/#concept-tao-check\nfunction TAOCheck () {\n // TODO\n return 'success'\n}\n\nfunction appendFetchMetadata (httpRequest) {\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header\n\n // 1. Assert: r’s url is a potentially trustworthy URL.\n // TODO\n\n // 2. Let header be a Structured Header whose value is a token.\n let header = null\n\n // 3. Set header’s value to r’s mode.\n header = httpRequest.mode\n\n // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.\n httpRequest.headersList.set('sec-fetch-mode', header, true)\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header\n // TODO\n}\n\n// https://fetch.spec.whatwg.org/#append-a-request-origin-header\nfunction appendRequestOriginHeader (request) {\n // 1. Let serializedOrigin be the result of byte-serializing a request origin\n // with request.\n // TODO: implement \"byte-serializing a request origin\"\n let serializedOrigin = request.origin\n\n // - \"'client' is changed to an origin during fetching.\"\n // This doesn't happen in undici (in most cases) because undici, by default,\n // has no concept of origin.\n // - request.origin can also be set to request.client.origin (client being\n // an environment settings object), which is undefined without using\n // setGlobalOrigin.\n if (serializedOrigin === 'client' || serializedOrigin === undefined) {\n return\n }\n\n // 2. If request’s response tainting is \"cors\" or request’s mode is \"websocket\",\n // then append (`Origin`, serializedOrigin) to request’s header list.\n // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:\n if (request.responseTainting === 'cors' || request.mode === 'websocket') {\n request.headersList.append('origin', serializedOrigin, true)\n } else if (request.method !== 'GET' && request.method !== 'HEAD') {\n // 1. Switch on request’s referrer policy:\n switch (request.referrerPolicy) {\n case 'no-referrer':\n // Set serializedOrigin to `null`.\n serializedOrigin = null\n break\n case 'no-referrer-when-downgrade':\n case 'strict-origin':\n case 'strict-origin-when-cross-origin':\n // If request’s origin is a tuple origin, its scheme is \"https\", and\n // request’s current URL’s scheme is not \"https\", then set\n // serializedOrigin to `null`.\n if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n case 'same-origin':\n // If request’s origin is not same origin with request’s current URL’s\n // origin, then set serializedOrigin to `null`.\n if (!sameOrigin(request, requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n default:\n // Do nothing.\n }\n\n // 2. Append (`Origin`, serializedOrigin) to request’s header list.\n request.headersList.append('origin', serializedOrigin, true)\n }\n}\n\n// https://w3c.github.io/hr-time/#dfn-coarsen-time\nfunction coarsenTime (timestamp, crossOriginIsolatedCapability) {\n // TODO\n return timestamp\n}\n\n// https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info\nfunction clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) {\n if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) {\n return {\n domainLookupStartTime: defaultStartTime,\n domainLookupEndTime: defaultStartTime,\n connectionStartTime: defaultStartTime,\n connectionEndTime: defaultStartTime,\n secureConnectionStartTime: defaultStartTime,\n ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol\n }\n }\n\n return {\n domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability),\n domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability),\n connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability),\n connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability),\n secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability),\n ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol\n }\n}\n\n// https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time\nfunction coarsenedSharedCurrentTime (crossOriginIsolatedCapability) {\n return coarsenTime(performance.now(), crossOriginIsolatedCapability)\n}\n\n// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info\nfunction createOpaqueTimingInfo (timingInfo) {\n return {\n startTime: timingInfo.startTime ?? 0,\n redirectStartTime: 0,\n redirectEndTime: 0,\n postRedirectStartTime: timingInfo.startTime ?? 0,\n finalServiceWorkerStartTime: 0,\n finalNetworkResponseStartTime: 0,\n finalNetworkRequestStartTime: 0,\n endTime: 0,\n encodedBodySize: 0,\n decodedBodySize: 0,\n finalConnectionTimingInfo: null\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#policy-container\nfunction makePolicyContainer () {\n // Note: the fetch spec doesn't make use of embedder policy or CSP list\n return {\n referrerPolicy: 'strict-origin-when-cross-origin'\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container\nfunction clonePolicyContainer (policyContainer) {\n return {\n referrerPolicy: policyContainer.referrerPolicy\n }\n}\n\n/**\n * Determine request’s Referrer\n *\n * @see https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer\n */\nfunction determineRequestsReferrer (request) {\n // Given a request request, we can determine the correct referrer information\n // to send by examining its referrer policy as detailed in the following\n // steps, which return either no referrer or a URL:\n\n // 1. Let policy be request's referrer policy.\n const policy = request.referrerPolicy\n\n // Note: policy cannot (shouldn't) be null or an empty string.\n assert(policy)\n\n // 2. Let environment be request’s client.\n\n let referrerSource = null\n\n // 3. Switch on request’s referrer:\n\n // \"client\"\n if (request.referrer === 'client') {\n // Note: node isn't a browser and doesn't implement document/iframes,\n // so we bypass this step and replace it with our own.\n\n const globalOrigin = getGlobalOrigin()\n\n if (!globalOrigin || globalOrigin.origin === 'null') {\n return 'no-referrer'\n }\n\n // Note: we need to clone it as it's mutated\n referrerSource = new URL(globalOrigin)\n // a URL\n } else if (webidl.is.URL(request.referrer)) {\n // Let referrerSource be request’s referrer.\n referrerSource = request.referrer\n }\n\n // 4. Let request’s referrerURL be the result of stripping referrerSource for\n // use as a referrer.\n let referrerURL = stripURLForReferrer(referrerSource)\n\n // 5. Let referrerOrigin be the result of stripping referrerSource for use as\n // a referrer, with the origin-only flag set to true.\n const referrerOrigin = stripURLForReferrer(referrerSource, true)\n\n // 6. If the result of serializing referrerURL is a string whose length is\n // greater than 4096, set referrerURL to referrerOrigin.\n if (referrerURL.toString().length > 4096) {\n referrerURL = referrerOrigin\n }\n\n // 7. The user agent MAY alter referrerURL or referrerOrigin at this point\n // to enforce arbitrary policy considerations in the interests of minimizing\n // data leakage. For example, the user agent could strip the URL down to an\n // origin, modify its host, replace it with an empty string, etc.\n\n // 8. Execute the switch statements corresponding to the value of policy:\n switch (policy) {\n case 'no-referrer':\n // Return no referrer\n return 'no-referrer'\n case 'origin':\n // Return referrerOrigin\n if (referrerOrigin != null) {\n return referrerOrigin\n }\n return stripURLForReferrer(referrerSource, true)\n case 'unsafe-url':\n // Return referrerURL.\n return referrerURL\n case 'strict-origin': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n // 2. Return referrerOrigin\n return referrerOrigin\n }\n case 'strict-origin-when-cross-origin': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(referrerURL, currentURL)) {\n return referrerURL\n }\n\n // 2. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n\n // 3. Return referrerOrigin.\n return referrerOrigin\n }\n case 'same-origin':\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(request, referrerURL)) {\n return referrerURL\n }\n // 2. Return no referrer.\n return 'no-referrer'\n case 'origin-when-cross-origin':\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(request, referrerURL)) {\n return referrerURL\n }\n // 2. Return referrerOrigin.\n return referrerOrigin\n case 'no-referrer-when-downgrade': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n // 2. Return referrerURL.\n return referrerURL\n }\n }\n}\n\n/**\n * Certain portions of URLs must not be included when sending a URL as the\n * value of a `Referer` header: a URLs fragment, username, and password\n * components must be stripped from the URL before it’s sent out. This\n * algorithm accepts a origin-only flag, which defaults to false. If set to\n * true, the algorithm will additionally remove the URL’s path and query\n * components, leaving only the scheme, host, and port.\n *\n * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url\n * @param {URL} url\n * @param {boolean} [originOnly=false]\n */\nfunction stripURLForReferrer (url, originOnly = false) {\n // 1. Assert: url is a URL.\n assert(webidl.is.URL(url))\n\n // Note: Create a new URL instance to avoid mutating the original URL.\n url = new URL(url)\n\n // 2. If url’s scheme is a local scheme, then return no referrer.\n if (urlIsLocal(url)) {\n return 'no-referrer'\n }\n\n // 3. Set url’s username to the empty string.\n url.username = ''\n\n // 4. Set url’s password to the empty string.\n url.password = ''\n\n // 5. Set url’s fragment to null.\n url.hash = ''\n\n // 6. If the origin-only flag is true, then:\n if (originOnly === true) {\n // 1. Set url’s path to « the empty string ».\n url.pathname = ''\n\n // 2. Set url’s query to null.\n url.search = ''\n }\n\n // 7. Return url.\n return url\n}\n\nconst isPotentialleTrustworthyIPv4 = RegExp.prototype.test\n .bind(/^127\\.(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){2}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)$/)\n\nconst isPotentiallyTrustworthyIPv6 = RegExp.prototype.test\n .bind(/^(?:(?:0{1,4}:){7}|(?:0{1,4}:){1,6}:|::)0{0,3}1$/)\n\n/**\n * Check if host matches one of the CIDR notations 127.0.0.0/8 or ::1/128.\n *\n * @param {string} origin\n * @returns {boolean}\n */\nfunction isOriginIPPotentiallyTrustworthy (origin) {\n // IPv6\n if (origin.includes(':')) {\n // Remove brackets from IPv6 addresses\n if (origin[0] === '[' && origin[origin.length - 1] === ']') {\n origin = origin.slice(1, -1)\n }\n return isPotentiallyTrustworthyIPv6(origin)\n }\n\n // IPv4\n return isPotentialleTrustworthyIPv4(origin)\n}\n\n/**\n * A potentially trustworthy origin is one which a user agent can generally\n * trust as delivering data securely.\n *\n * Return value `true` means `Potentially Trustworthy`.\n * Return value `false` means `Not Trustworthy`.\n *\n * @see https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy\n * @param {string} origin\n * @returns {boolean}\n */\nfunction isOriginPotentiallyTrustworthy (origin) {\n // 1. If origin is an opaque origin, return \"Not Trustworthy\".\n if (origin == null || origin === 'null') {\n return false\n }\n\n // 2. Assert: origin is a tuple origin.\n origin = new URL(origin)\n\n // 3. If origin’s scheme is either \"https\" or \"wss\",\n // return \"Potentially Trustworthy\".\n if (origin.protocol === 'https:' || origin.protocol === 'wss:') {\n return true\n }\n\n // 4. If origin’s host matches one of the CIDR notations 127.0.0.0/8 or\n // ::1/128 [RFC4632], return \"Potentially Trustworthy\".\n if (isOriginIPPotentiallyTrustworthy(origin.hostname)) {\n return true\n }\n\n // 5. If the user agent conforms to the name resolution rules in\n // [let-localhost-be-localhost] and one of the following is true:\n\n // origin’s host is \"localhost\" or \"localhost.\"\n if (origin.hostname === 'localhost' || origin.hostname === 'localhost.') {\n return true\n }\n\n // origin’s host ends with \".localhost\" or \".localhost.\"\n if (origin.hostname.endsWith('.localhost') || origin.hostname.endsWith('.localhost.')) {\n return true\n }\n\n // 6. If origin’s scheme is \"file\", return \"Potentially Trustworthy\".\n if (origin.protocol === 'file:') {\n return true\n }\n\n // 7. If origin’s scheme component is one which the user agent considers to\n // be authenticated, return \"Potentially Trustworthy\".\n\n // 8. If origin has been configured as a trustworthy origin, return\n // \"Potentially Trustworthy\".\n\n // 9. Return \"Not Trustworthy\".\n return false\n}\n\n/**\n * A potentially trustworthy URL is one which either inherits context from its\n * creator (about:blank, about:srcdoc, data) or one whose origin is a\n * potentially trustworthy origin.\n *\n * Return value `true` means `Potentially Trustworthy`.\n * Return value `false` means `Not Trustworthy`.\n *\n * @see https://www.w3.org/TR/secure-contexts/#is-url-trustworthy\n * @param {URL} url\n * @returns {boolean}\n */\nfunction isURLPotentiallyTrustworthy (url) {\n // Given a URL record (url), the following algorithm returns \"Potentially\n // Trustworthy\" or \"Not Trustworthy\" as appropriate:\n if (!webidl.is.URL(url)) {\n return false\n }\n\n // 1. If url is \"about:blank\" or \"about:srcdoc\",\n // return \"Potentially Trustworthy\".\n if (url.href === 'about:blank' || url.href === 'about:srcdoc') {\n return true\n }\n\n // 2. If url’s scheme is \"data\", return \"Potentially Trustworthy\".\n if (url.protocol === 'data:') return true\n\n // Note: The origin of blob: URLs is the origin of the context in which they\n // were created. Therefore, blobs created in a trustworthy origin will\n // themselves be potentially trustworthy.\n if (url.protocol === 'blob:') return true\n\n // 3. Return the result of executing § 3.1 Is origin potentially trustworthy?\n // on url’s origin.\n return isOriginPotentiallyTrustworthy(url.origin)\n}\n\n// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request\nfunction tryUpgradeRequestToAPotentiallyTrustworthyURL (request) {\n // TODO\n}\n\n/**\n * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}\n * @param {URL} A\n * @param {URL} B\n */\nfunction sameOrigin (A, B) {\n // 1. If A and B are the same opaque origin, then return true.\n if (A.origin === B.origin && A.origin === 'null') {\n return true\n }\n\n // 2. If A and B are both tuple origins and their schemes,\n // hosts, and port are identical, then return true.\n if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {\n return true\n }\n\n // 3. Return false.\n return false\n}\n\nfunction isAborted (fetchParams) {\n return fetchParams.controller.state === 'aborted'\n}\n\nfunction isCancelled (fetchParams) {\n return fetchParams.controller.state === 'aborted' ||\n fetchParams.controller.state === 'terminated'\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-method-normalize\n * @param {string} method\n */\nfunction normalizeMethod (method) {\n return normalizedMethodRecordsBase[method.toLowerCase()] ?? method\n}\n\n// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object\nconst esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {string} name name of the instance\n * @param {((target: any) => any)} kInternalIterator\n * @param {string | number} [keyIndex]\n * @param {string | number} [valueIndex]\n */\nfunction createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) {\n class FastIterableIterator {\n /** @type {any} */\n #target\n /** @type {'key' | 'value' | 'key+value'} */\n #kind\n /** @type {number} */\n #index\n\n /**\n * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object\n * @param {unknown} target\n * @param {'key' | 'value' | 'key+value'} kind\n */\n constructor (target, kind) {\n this.#target = target\n this.#kind = kind\n this.#index = 0\n }\n\n next () {\n // 1. Let interface be the interface for which the iterator prototype object exists.\n // 2. Let thisValue be the this value.\n // 3. Let object be ? ToObject(thisValue).\n // 4. If object is a platform object, then perform a security\n // check, passing:\n // 5. If object is not a default iterator object for interface,\n // then throw a TypeError.\n if (typeof this !== 'object' || this === null || !(#target in this)) {\n throw new TypeError(\n `'next' called on an object that does not implement interface ${name} Iterator.`\n )\n }\n\n // 6. Let index be object’s index.\n // 7. Let kind be object’s kind.\n // 8. Let values be object’s target's value pairs to iterate over.\n const index = this.#index\n const values = kInternalIterator(this.#target)\n\n // 9. Let len be the length of values.\n const len = values.length\n\n // 10. If index is greater than or equal to len, then return\n // CreateIterResultObject(undefined, true).\n if (index >= len) {\n return {\n value: undefined,\n done: true\n }\n }\n\n // 11. Let pair be the entry in values at index index.\n const { [keyIndex]: key, [valueIndex]: value } = values[index]\n\n // 12. Set object’s index to index + 1.\n this.#index = index + 1\n\n // 13. Return the iterator result for pair and kind.\n\n // https://webidl.spec.whatwg.org/#iterator-result\n\n // 1. Let result be a value determined by the value of kind:\n let result\n switch (this.#kind) {\n case 'key':\n // 1. Let idlKey be pair’s key.\n // 2. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 3. result is key.\n result = key\n break\n case 'value':\n // 1. Let idlValue be pair’s value.\n // 2. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 3. result is value.\n result = value\n break\n case 'key+value':\n // 1. Let idlKey be pair’s key.\n // 2. Let idlValue be pair’s value.\n // 3. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 4. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 5. Let array be ! ArrayCreate(2).\n // 6. Call ! CreateDataProperty(array, \"0\", key).\n // 7. Call ! CreateDataProperty(array, \"1\", value).\n // 8. result is array.\n result = [key, value]\n break\n }\n\n // 2. Return CreateIterResultObject(result, false).\n return {\n value: result,\n done: false\n }\n }\n }\n\n // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n // @ts-ignore\n delete FastIterableIterator.prototype.constructor\n\n Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype)\n\n Object.defineProperties(FastIterableIterator.prototype, {\n [Symbol.toStringTag]: {\n writable: false,\n enumerable: false,\n configurable: true,\n value: `${name} Iterator`\n },\n next: { writable: true, enumerable: true, configurable: true }\n })\n\n /**\n * @param {unknown} target\n * @param {'key' | 'value' | 'key+value'} kind\n * @returns {IterableIterator}\n */\n return function (target, kind) {\n return new FastIterableIterator(target, kind)\n }\n}\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {string} name name of the instance\n * @param {any} object class\n * @param {(target: any) => any} kInternalIterator\n * @param {string | number} [keyIndex]\n * @param {string | number} [valueIndex]\n */\nfunction iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) {\n const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex)\n\n const properties = {\n keys: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function keys () {\n webidl.brandCheck(this, object)\n return makeIterator(this, 'key')\n }\n },\n values: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function values () {\n webidl.brandCheck(this, object)\n return makeIterator(this, 'value')\n }\n },\n entries: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function entries () {\n webidl.brandCheck(this, object)\n return makeIterator(this, 'key+value')\n }\n },\n forEach: {\n writable: true,\n enumerable: true,\n configurable: true,\n value: function forEach (callbackfn, thisArg = globalThis) {\n webidl.brandCheck(this, object)\n webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`)\n if (typeof callbackfn !== 'function') {\n throw new TypeError(\n `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.`\n )\n }\n for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) {\n callbackfn.call(thisArg, value, key, this)\n }\n }\n }\n }\n\n return Object.defineProperties(object.prototype, {\n ...properties,\n [Symbol.iterator]: {\n writable: true,\n enumerable: false,\n configurable: true,\n value: properties.entries.value\n }\n })\n}\n\n/**\n * @param {import('./body').ExtractBodyResult} body\n * @param {(bytes: Uint8Array) => void} processBody\n * @param {(error: Error) => void} processBodyError\n * @returns {void}\n *\n * @see https://fetch.spec.whatwg.org/#body-fully-read\n */\nfunction fullyReadBody (body, processBody, processBodyError) {\n // 1. If taskDestination is null, then set taskDestination to\n // the result of starting a new parallel queue.\n\n // 2. Let successSteps given a byte sequence bytes be to queue a\n // fetch task to run processBody given bytes, with taskDestination.\n const successSteps = processBody\n\n // 3. Let errorSteps be to queue a fetch task to run processBodyError,\n // with taskDestination.\n const errorSteps = processBodyError\n\n try {\n // 4. Let reader be the result of getting a reader for body’s stream.\n // If that threw an exception, then run errorSteps with that\n // exception and return.\n const reader = body.stream.getReader()\n\n // 5. Read all bytes from reader, given successSteps and errorSteps.\n readAllBytes(reader, successSteps, errorSteps)\n } catch (e) {\n errorSteps(e)\n }\n}\n\n/**\n * @param {ReadableStreamController} controller\n */\nfunction readableStreamClose (controller) {\n try {\n controller.close()\n controller.byobRequest?.respond(0)\n } catch (err) {\n // TODO: add comment explaining why this error occurs.\n if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) {\n throw err\n }\n }\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes\n * @see https://streams.spec.whatwg.org/#read-loop\n * @param {ReadableStream>} reader\n * @param {(bytes: Uint8Array) => void} successSteps\n * @param {(error: Error) => void} failureSteps\n * @returns {Promise}\n */\nasync function readAllBytes (reader, successSteps, failureSteps) {\n try {\n const bytes = []\n let byteLength = 0\n\n do {\n const { done, value: chunk } = await reader.read()\n\n if (done) {\n // 1. Call successSteps with bytes.\n successSteps(Buffer.concat(bytes, byteLength))\n return\n }\n\n // 1. If chunk is not a Uint8Array object, call failureSteps\n // with a TypeError and abort these steps.\n if (!isUint8Array(chunk)) {\n failureSteps(new TypeError('Received non-Uint8Array chunk'))\n return\n }\n\n // 2. Append the bytes represented by chunk to bytes.\n bytes.push(chunk)\n byteLength += chunk.length\n\n // 3. Read-loop given reader, bytes, successSteps, and failureSteps.\n } while (true)\n } catch (e) {\n // 1. Call failureSteps with e.\n failureSteps(e)\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#is-local\n * @param {URL} url\n * @returns {boolean}\n */\nfunction urlIsLocal (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n // A URL is local if its scheme is a local scheme.\n // A local scheme is \"about\", \"blob\", or \"data\".\n return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'\n}\n\n/**\n * @param {string|URL} url\n * @returns {boolean}\n */\nfunction urlHasHttpsScheme (url) {\n return (\n (\n typeof url === 'string' &&\n url[5] === ':' &&\n url[0] === 'h' &&\n url[1] === 't' &&\n url[2] === 't' &&\n url[3] === 'p' &&\n url[4] === 's'\n ) ||\n url.protocol === 'https:'\n )\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-scheme\n * @param {URL} url\n */\nfunction urlIsHttpHttpsScheme (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n return protocol === 'http:' || protocol === 'https:'\n}\n\n/**\n * @typedef {Object} RangeHeaderValue\n * @property {number|null} rangeStartValue\n * @property {number|null} rangeEndValue\n */\n\n/**\n * @see https://fetch.spec.whatwg.org/#simple-range-header-value\n * @param {string} value\n * @param {boolean} allowWhitespace\n * @return {RangeHeaderValue|'failure'}\n */\nfunction simpleRangeHeaderValue (value, allowWhitespace) {\n // 1. Let data be the isomorphic decoding of value.\n // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string,\n // nothing more. We obviously don't need to do that if value is a string already.\n const data = value\n\n // 2. If data does not start with \"bytes\", then return failure.\n if (!data.startsWith('bytes')) {\n return 'failure'\n }\n\n // 3. Let position be a position variable for data, initially pointing at the 5th code point of data.\n const position = { position: 5 }\n\n // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,\n // from data given position.\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 5. If the code point at position within data is not U+003D (=), then return failure.\n if (data.charCodeAt(position.position) !== 0x3D) {\n return 'failure'\n }\n\n // 6. Advance position by 1.\n position.position++\n\n // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from\n // data given position.\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits,\n // from data given position.\n const rangeStart = collectASequenceOfCodePoints(\n (char) => {\n const code = char.charCodeAt(0)\n\n return code >= 0x30 && code <= 0x39\n },\n data,\n position\n )\n\n // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the\n // empty string; otherwise null.\n const rangeStartValue = rangeStart.length ? Number(rangeStart) : null\n\n // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,\n // from data given position.\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 11. If the code point at position within data is not U+002D (-), then return failure.\n if (data.charCodeAt(position.position) !== 0x2D) {\n return 'failure'\n }\n\n // 12. Advance position by 1.\n position.position++\n\n // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab\n // or space, from data given position.\n // Note from Khafra: its the same step as in #8 again lol\n if (allowWhitespace) {\n collectASequenceOfCodePoints(\n (char) => char === '\\t' || char === ' ',\n data,\n position\n )\n }\n\n // 14. Let rangeEnd be the result of collecting a sequence of code points that are\n // ASCII digits, from data given position.\n // Note from Khafra: you wouldn't guess it, but this is also the same step as #8\n const rangeEnd = collectASequenceOfCodePoints(\n (char) => {\n const code = char.charCodeAt(0)\n\n return code >= 0x30 && code <= 0x39\n },\n data,\n position\n )\n\n // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd\n // is not the empty string; otherwise null.\n // Note from Khafra: THE SAME STEP, AGAIN!!!\n // Note: why interpret as a decimal if we only collect ascii digits?\n const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null\n\n // 16. If position is not past the end of data, then return failure.\n if (position.position < data.length) {\n return 'failure'\n }\n\n // 17. If rangeEndValue and rangeStartValue are null, then return failure.\n if (rangeEndValue === null && rangeStartValue === null) {\n return 'failure'\n }\n\n // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is\n // greater than rangeEndValue, then return failure.\n // Note: ... when can they not be numbers?\n if (rangeStartValue > rangeEndValue) {\n return 'failure'\n }\n\n // 19. Return (rangeStartValue, rangeEndValue).\n return { rangeStartValue, rangeEndValue }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#build-a-content-range\n * @param {number} rangeStart\n * @param {number} rangeEnd\n * @param {number} fullLength\n */\nfunction buildContentRange (rangeStart, rangeEnd, fullLength) {\n // 1. Let contentRange be `bytes `.\n let contentRange = 'bytes '\n\n // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange.\n contentRange += isomorphicEncode(`${rangeStart}`)\n\n // 3. Append 0x2D (-) to contentRange.\n contentRange += '-'\n\n // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange.\n contentRange += isomorphicEncode(`${rangeEnd}`)\n\n // 5. Append 0x2F (/) to contentRange.\n contentRange += '/'\n\n // 6. Append fullLength, serialized and isomorphic encoded to contentRange.\n contentRange += isomorphicEncode(`${fullLength}`)\n\n // 7. Return contentRange.\n return contentRange\n}\n\n// A Stream, which pipes the response to zlib.createInflate() or\n// zlib.createInflateRaw() depending on the first byte of the Buffer.\n// If the lower byte of the first byte is 0x08, then the stream is\n// interpreted as a zlib stream, otherwise it's interpreted as a\n// raw deflate stream.\nclass InflateStream extends Transform {\n #zlibOptions\n\n /** @param {zlib.ZlibOptions} [zlibOptions] */\n constructor (zlibOptions) {\n super()\n this.#zlibOptions = zlibOptions\n }\n\n _transform (chunk, encoding, callback) {\n if (!this._inflateStream) {\n if (chunk.length === 0) {\n callback()\n return\n }\n this._inflateStream = (chunk[0] & 0x0F) === 0x08\n ? zlib.createInflate(this.#zlibOptions)\n : zlib.createInflateRaw(this.#zlibOptions)\n\n this._inflateStream.on('data', this.push.bind(this))\n this._inflateStream.on('end', () => this.push(null))\n this._inflateStream.on('error', (err) => this.destroy(err))\n }\n\n this._inflateStream.write(chunk, encoding, callback)\n }\n\n _final (callback) {\n if (this._inflateStream) {\n this._inflateStream.end()\n this._inflateStream = null\n }\n callback()\n }\n}\n\n/**\n * @param {zlib.ZlibOptions} [zlibOptions]\n * @returns {InflateStream}\n */\nfunction createInflate (zlibOptions) {\n return new InflateStream(zlibOptions)\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type\n * @param {import('./headers').HeadersList} headers\n */\nfunction extractMimeType (headers) {\n // 1. Let charset be null.\n let charset = null\n\n // 2. Let essence be null.\n let essence = null\n\n // 3. Let mimeType be null.\n let mimeType = null\n\n // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers.\n const values = getDecodeSplit('content-type', headers)\n\n // 5. If values is null, then return failure.\n if (values === null) {\n return 'failure'\n }\n\n // 6. For each value of values:\n for (const value of values) {\n // 6.1. Let temporaryMimeType be the result of parsing value.\n const temporaryMimeType = parseMIMEType(value)\n\n // 6.2. If temporaryMimeType is failure or its essence is \"*/*\", then continue.\n if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') {\n continue\n }\n\n // 6.3. Set mimeType to temporaryMimeType.\n mimeType = temporaryMimeType\n\n // 6.4. If mimeType’s essence is not essence, then:\n if (mimeType.essence !== essence) {\n // 6.4.1. Set charset to null.\n charset = null\n\n // 6.4.2. If mimeType’s parameters[\"charset\"] exists, then set charset to\n // mimeType’s parameters[\"charset\"].\n if (mimeType.parameters.has('charset')) {\n charset = mimeType.parameters.get('charset')\n }\n\n // 6.4.3. Set essence to mimeType’s essence.\n essence = mimeType.essence\n } else if (!mimeType.parameters.has('charset') && charset !== null) {\n // 6.5. Otherwise, if mimeType’s parameters[\"charset\"] does not exist, and\n // charset is non-null, set mimeType’s parameters[\"charset\"] to charset.\n mimeType.parameters.set('charset', charset)\n }\n }\n\n // 7. If mimeType is null, then return failure.\n if (mimeType == null) {\n return 'failure'\n }\n\n // 8. Return mimeType.\n return mimeType\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split\n * @param {string|null} value\n */\nfunction gettingDecodingSplitting (value) {\n // 1. Let input be the result of isomorphic decoding value.\n const input = value\n\n // 2. Let position be a position variable for input, initially pointing at the start of input.\n const position = { position: 0 }\n\n // 3. Let values be a list of strings, initially empty.\n const values = []\n\n // 4. Let temporaryValue be the empty string.\n let temporaryValue = ''\n\n // 5. While position is not past the end of input:\n while (position.position < input.length) {\n // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (\")\n // or U+002C (,) from input, given position, to temporaryValue.\n temporaryValue += collectASequenceOfCodePoints(\n (char) => char !== '\"' && char !== ',',\n input,\n position\n )\n\n // 5.2. If position is not past the end of input, then:\n if (position.position < input.length) {\n // 5.2.1. If the code point at position within input is U+0022 (\"), then:\n if (input.charCodeAt(position.position) === 0x22) {\n // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue.\n temporaryValue += collectAnHTTPQuotedString(\n input,\n position\n )\n\n // 5.2.1.2. If position is not past the end of input, then continue.\n if (position.position < input.length) {\n continue\n }\n } else {\n // 5.2.2. Otherwise:\n\n // 5.2.2.1. Assert: the code point at position within input is U+002C (,).\n assert(input.charCodeAt(position.position) === 0x2C)\n\n // 5.2.2.2. Advance position by 1.\n position.position++\n }\n }\n\n // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue.\n temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20)\n\n // 5.4. Append temporaryValue to values.\n values.push(temporaryValue)\n\n // 5.6. Set temporaryValue to the empty string.\n temporaryValue = ''\n }\n\n // 6. Return values.\n return values\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split\n * @param {string} name lowercase header name\n * @param {import('./headers').HeadersList} list\n */\nfunction getDecodeSplit (name, list) {\n // 1. Let value be the result of getting name from list.\n const value = list.get(name, true)\n\n // 2. If value is null, then return null.\n if (value === null) {\n return null\n }\n\n // 3. Return the result of getting, decoding, and splitting value.\n return gettingDecodingSplitting(value)\n}\n\nfunction hasAuthenticationEntry (request) {\n return false\n}\n\n/**\n * @see https://url.spec.whatwg.org/#include-credentials\n * @param {URL} url\n */\nfunction includesCredentials (url) {\n // A URL includes credentials if its username or password is not the empty string.\n return !!(url.username || url.password)\n}\n\n/**\n * @see https://html.spec.whatwg.org/multipage/document-sequences.html#traversable-navigable\n * @param {object|string} navigable\n */\nfunction isTraversableNavigable (navigable) {\n // Returns true only if we have an actual traversable navigable object\n // that can prompt the user for credentials. In Node.js, this will always\n // be false since there's no Window object or navigable.\n return navigable != null && navigable !== 'client' && navigable !== 'no-traversable'\n}\n\nclass EnvironmentSettingsObjectBase {\n get baseUrl () {\n return getGlobalOrigin()\n }\n\n get origin () {\n return this.baseUrl?.origin\n }\n\n policyContainer = makePolicyContainer()\n}\n\nclass EnvironmentSettingsObject {\n settingsObject = new EnvironmentSettingsObjectBase()\n}\n\nconst environmentSettingsObject = new EnvironmentSettingsObject()\n\nmodule.exports = {\n isAborted,\n isCancelled,\n isValidEncodedURL,\n ReadableStreamFrom,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n clampAndCoarsenConnectionTimingInfo,\n coarsenedSharedCurrentTime,\n determineRequestsReferrer,\n makePolicyContainer,\n clonePolicyContainer,\n appendFetchMetadata,\n appendRequestOriginHeader,\n TAOCheck,\n corsCheck,\n crossOriginResourcePolicyCheck,\n createOpaqueTimingInfo,\n setRequestReferrerPolicyOnRedirect,\n isValidHTTPToken,\n requestBadPort,\n requestCurrentURL,\n responseURL,\n responseLocationURL,\n isURLPotentiallyTrustworthy,\n isValidReasonPhrase,\n sameOrigin,\n normalizeMethod,\n iteratorMixin,\n createIterator,\n isValidHeaderName,\n isValidHeaderValue,\n isErrorLike,\n fullyReadBody,\n readableStreamClose,\n urlIsLocal,\n urlHasHttpsScheme,\n urlIsHttpHttpsScheme,\n readAllBytes,\n simpleRangeHeaderValue,\n buildContentRange,\n createInflate,\n extractMimeType,\n getDecodeSplit,\n environmentSettingsObject,\n isOriginIPPotentiallyTrustworthy,\n hasAuthenticationEntry,\n includesCredentials,\n isTraversableNavigable\n}\n","'use strict'\n\nconst { iteratorMixin } = require('./util')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { webidl } = require('../webidl')\nconst nodeUtil = require('node:util')\n\n// https://xhr.spec.whatwg.org/#formdata\nclass FormData {\n #state = []\n\n constructor (form = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (form !== undefined) {\n throw webidl.errors.conversionFailed({\n prefix: 'FormData constructor',\n argument: 'Argument 1',\n types: ['undefined']\n })\n }\n }\n\n append (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.append'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n name = webidl.converters.USVString(name)\n\n if (arguments.length === 3 || webidl.is.Blob(value)) {\n value = webidl.converters.Blob(value, prefix, 'value')\n\n if (filename !== undefined) {\n filename = webidl.converters.USVString(filename)\n }\n } else {\n value = webidl.converters.USVString(value)\n }\n\n // 1. Let value be value if given; otherwise blobValue.\n\n // 2. Let entry be the result of creating an entry with\n // name, value, and filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. Append entry to this’s entry list.\n this.#state.push(entry)\n }\n\n delete (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.delete'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // The delete(name) method steps are to remove all entries whose name\n // is name from this’s entry list.\n this.#state = this.#state.filter(entry => entry.name !== name)\n }\n\n get (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.get'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return null.\n const idx = this.#state.findIndex((entry) => entry.name === name)\n if (idx === -1) {\n return null\n }\n\n // 2. Return the value of the first entry whose name is name from\n // this’s entry list.\n return this.#state[idx].value\n }\n\n getAll (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.getAll'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return the empty list.\n // 2. Return the values of all entries whose name is name, in order,\n // from this’s entry list.\n return this.#state\n .filter((entry) => entry.name === name)\n .map((entry) => entry.value)\n }\n\n has (name) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.has'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n name = webidl.converters.USVString(name)\n\n // The has(name) method steps are to return true if there is an entry\n // whose name is name in this’s entry list; otherwise false.\n return this.#state.findIndex((entry) => entry.name === name) !== -1\n }\n\n set (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n const prefix = 'FormData.set'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n name = webidl.converters.USVString(name)\n\n if (arguments.length === 3 || webidl.is.Blob(value)) {\n value = webidl.converters.Blob(value, prefix, 'value')\n\n if (filename !== undefined) {\n filename = webidl.converters.USVString(filename)\n }\n } else {\n value = webidl.converters.USVString(value)\n }\n\n // The set(name, value) and set(name, blobValue, filename) method steps\n // are:\n\n // 1. Let value be value if given; otherwise blobValue.\n\n // 2. Let entry be the result of creating an entry with name, value, and\n // filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. If there are entries in this’s entry list whose name is name, then\n // replace the first such entry with entry and remove the others.\n const idx = this.#state.findIndex((entry) => entry.name === name)\n if (idx !== -1) {\n this.#state = [\n ...this.#state.slice(0, idx),\n entry,\n ...this.#state.slice(idx + 1).filter((entry) => entry.name !== name)\n ]\n } else {\n // 4. Otherwise, append entry to this’s entry list.\n this.#state.push(entry)\n }\n }\n\n [nodeUtil.inspect.custom] (depth, options) {\n const state = this.#state.reduce((a, b) => {\n if (a[b.name]) {\n if (Array.isArray(a[b.name])) {\n a[b.name].push(b.value)\n } else {\n a[b.name] = [a[b.name], b.value]\n }\n } else {\n a[b.name] = b.value\n }\n\n return a\n }, { __proto__: null })\n\n options.depth ??= depth\n options.colors ??= true\n\n const output = nodeUtil.formatWithOptions(options, state)\n\n // remove [Object null prototype]\n return `FormData ${output.slice(output.indexOf(']') + 2)}`\n }\n\n /**\n * @param {FormData} formData\n */\n static getFormDataState (formData) {\n return formData.#state\n }\n\n /**\n * @param {FormData} formData\n * @param {any[]} newState\n */\n static setFormDataState (formData, newState) {\n formData.#state = newState\n }\n}\n\nconst { getFormDataState, setFormDataState } = FormData\nReflect.deleteProperty(FormData, 'getFormDataState')\nReflect.deleteProperty(FormData, 'setFormDataState')\n\niteratorMixin('FormData', FormData, getFormDataState, 'name', 'value')\n\nObject.defineProperties(FormData.prototype, {\n append: kEnumerableProperty,\n delete: kEnumerableProperty,\n get: kEnumerableProperty,\n getAll: kEnumerableProperty,\n has: kEnumerableProperty,\n set: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'FormData',\n configurable: true\n }\n})\n\n/**\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry\n * @param {string} name\n * @param {string|Blob} value\n * @param {?string} filename\n * @returns\n */\nfunction makeEntry (name, value, filename) {\n // 1. Set name to the result of converting name into a scalar value string.\n // Note: This operation was done by the webidl converter USVString.\n\n // 2. If value is a string, then set value to the result of converting\n // value into a scalar value string.\n if (typeof value === 'string') {\n // Note: This operation was done by the webidl converter USVString.\n } else {\n // 3. Otherwise:\n\n // 1. If value is not a File object, then set value to a new File object,\n // representing the same bytes, whose name attribute value is \"blob\"\n if (!webidl.is.File(value)) {\n value = new File([value], 'blob', { type: value.type })\n }\n\n // 2. If filename is given, then set value to a new File object,\n // representing the same bytes, whose name attribute is filename.\n if (filename !== undefined) {\n /** @type {FilePropertyBag} */\n const options = {\n type: value.type,\n lastModified: value.lastModified\n }\n\n value = new File([value], filename, options)\n }\n }\n\n // 4. Return an entry whose name is name and whose value is value.\n return { name, value }\n}\n\nwebidl.is.FormData = webidl.util.MakeTypeAssertion(FormData)\n\nmodule.exports = { FormData, makeEntry, setFormDataState }\n","'use strict'\n\nconst { bufferToLowerCasedHeaderName } = require('../../core/util')\nconst { HTTP_TOKEN_CODEPOINTS } = require('./data-url')\nconst { makeEntry } = require('./formdata')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst { isomorphicDecode } = require('../infra')\n\nconst dd = Buffer.from('--')\nconst decoder = new TextDecoder()\nconst decoderIgnoreBOM = new TextDecoder('utf-8', { ignoreBOM: true })\n\n/**\n * @param {string} chars\n */\nfunction isAsciiString (chars) {\n for (let i = 0; i < chars.length; ++i) {\n if ((chars.charCodeAt(i) & ~0x7F) !== 0) {\n return false\n }\n }\n return true\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-boundary\n * @param {string} boundary\n */\nfunction validateBoundary (boundary) {\n const length = boundary.length\n\n // - its length is greater or equal to 27 and lesser or equal to 70, and\n if (length < 27 || length > 70) {\n return false\n }\n\n // - it is composed by bytes in the ranges 0x30 to 0x39, 0x41 to 0x5A, or\n // 0x61 to 0x7A, inclusive (ASCII alphanumeric), or which are 0x27 ('),\n // 0x2D (-) or 0x5F (_).\n for (let i = 0; i < length; ++i) {\n const cp = boundary.charCodeAt(i)\n\n if (!(\n (cp >= 0x30 && cp <= 0x39) ||\n (cp >= 0x41 && cp <= 0x5a) ||\n (cp >= 0x61 && cp <= 0x7a) ||\n cp === 0x27 ||\n cp === 0x2d ||\n cp === 0x5f\n )) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-parser\n * @param {Buffer} input\n * @param {ReturnType} mimeType\n */\nfunction multipartFormDataParser (input, mimeType) {\n // 1. Assert: mimeType’s essence is \"multipart/form-data\".\n assert(mimeType !== 'failure' && mimeType.essence === 'multipart/form-data')\n\n const boundaryString = mimeType.parameters.get('boundary')\n\n // 2. If mimeType’s parameters[\"boundary\"] does not exist, return failure.\n // Otherwise, let boundary be the result of UTF-8 decoding mimeType’s\n // parameters[\"boundary\"].\n if (boundaryString === undefined) {\n throw parsingError('missing boundary in content-type header')\n }\n\n const boundary = Buffer.from(`--${boundaryString}`, 'utf8')\n\n // 3. Let entry list be an empty entry list.\n const entryList = []\n\n // 4. Let position be a pointer to a byte in input, initially pointing at\n // the first byte.\n const position = { position: 0 }\n\n // Note: Per RFC 2046 Section 5.1.1, we must ignore anything before the\n // first boundary delimiter line (preamble). Search for the first boundary.\n const firstBoundaryIndex = input.indexOf(boundary)\n\n if (firstBoundaryIndex === -1) {\n throw parsingError('no boundary found in multipart body')\n }\n\n // Start parsing from the first boundary, ignoring any preamble\n position.position = firstBoundaryIndex\n\n // 5. While true:\n while (true) {\n // 5.1. If position points to a sequence of bytes starting with 0x2D 0x2D\n // (`--`) followed by boundary, advance position by 2 + the length of\n // boundary. Otherwise, return failure.\n // Note: boundary is padded with 2 dashes already, no need to add 2.\n if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) {\n position.position += boundary.length\n } else {\n throw parsingError('expected a value starting with -- and the boundary')\n }\n\n // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A\n // (`--` followed by CR LF) followed by the end of input, return entry list.\n // Note: Per RFC 2046 Section 5.1.1, we must ignore anything after the\n // final boundary delimiter (epilogue). Check for -- or --CRLF and return\n // regardless of what follows.\n if (bufferStartsWith(input, dd, position)) {\n // Found closing boundary delimiter (--), ignore any epilogue\n return entryList\n }\n\n // 5.3. If position does not point to a sequence of bytes starting with 0x0D\n // 0x0A (CR LF), return failure.\n if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {\n throw parsingError('expected CRLF')\n }\n\n // 5.4. Advance position by 2. (This skips past the newline.)\n position.position += 2\n\n // 5.5. Let name, filename and contentType be the result of parsing\n // multipart/form-data headers on input and position, if the result\n // is not failure. Otherwise, return failure.\n const result = parseMultipartFormDataHeaders(input, position)\n\n let { name, filename, contentType, encoding } = result\n\n // 5.6. Advance position by 2. (This skips past the empty line that marks\n // the end of the headers.)\n position.position += 2\n\n // 5.7. Let body be the empty byte sequence.\n let body\n\n // 5.8. Body loop: While position is not past the end of input:\n // TODO: the steps here are completely wrong\n {\n const boundaryIndex = input.indexOf(boundary.subarray(2), position.position)\n\n if (boundaryIndex === -1) {\n throw parsingError('expected boundary after body')\n }\n\n body = input.subarray(position.position, boundaryIndex - 4)\n\n position.position += body.length\n\n // Note: position must be advanced by the body's length before being\n // decoded, otherwise the parsing will fail.\n if (encoding === 'base64') {\n body = Buffer.from(body.toString(), 'base64')\n }\n }\n\n // 5.9. If position does not point to a sequence of bytes starting with\n // 0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2.\n if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {\n throw parsingError('expected CRLF')\n } else {\n position.position += 2\n }\n\n // 5.10. If filename is not null:\n let value\n\n if (filename !== null) {\n // 5.10.1. If contentType is null, set contentType to \"text/plain\".\n contentType ??= 'text/plain'\n\n // 5.10.2. If contentType is not an ASCII string, set contentType to the empty string.\n\n // Note: `buffer.isAscii` can be used at zero-cost, but converting a string to a buffer is a high overhead.\n // Content-Type is a relatively small string, so it is faster to use `String#charCodeAt`.\n if (!isAsciiString(contentType)) {\n contentType = ''\n }\n\n // 5.10.3. Let value be a new File object with name filename, type contentType, and body body.\n value = new File([body], filename, { type: contentType })\n } else {\n // 5.11. Otherwise:\n\n // 5.11.1. Let value be the UTF-8 decoding without BOM of body.\n value = decoderIgnoreBOM.decode(Buffer.from(body))\n }\n\n // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object.\n assert(webidl.is.USVString(name))\n assert((typeof value === 'string' && webidl.is.USVString(value)) || webidl.is.File(value))\n\n // 5.13. Create an entry with name and value, and append it to entry list.\n entryList.push(makeEntry(name, value, filename))\n }\n}\n\n/**\n * Parses content-disposition attributes (e.g., name=\"value\" or filename*=utf-8''encoded)\n * @param {Buffer} input\n * @param {{ position: number }} position\n * @returns {{ name: string, value: string }}\n */\nfunction parseContentDispositionAttribute (input, position) {\n // Skip leading semicolon and whitespace\n if (input[position.position] === 0x3b /* ; */) {\n position.position++\n }\n\n // Skip whitespace\n collectASequenceOfBytes(\n (char) => char === 0x20 || char === 0x09,\n input,\n position\n )\n\n // Collect attribute name (token characters)\n const attributeName = collectASequenceOfBytes(\n (char) => isToken(char) && char !== 0x3d && char !== 0x2a, // not = or *\n input,\n position\n )\n\n if (attributeName.length === 0) {\n return null\n }\n\n const attrNameStr = attributeName.toString('ascii').toLowerCase()\n\n // Check for extended notation (attribute*)\n const isExtended = input[position.position] === 0x2a /* * */\n if (isExtended) {\n position.position++ // skip *\n }\n\n // Expect = sign\n if (input[position.position] !== 0x3d /* = */) {\n return null\n }\n position.position++ // skip =\n\n // Skip whitespace\n collectASequenceOfBytes(\n (char) => char === 0x20 || char === 0x09,\n input,\n position\n )\n\n let value\n\n if (isExtended) {\n // Extended attribute format: charset'language'encoded-value\n const headerValue = collectASequenceOfBytes(\n (char) => char !== 0x20 && char !== 0x0d && char !== 0x0a && char !== 0x3b, // not space, CRLF, or ;\n input,\n position\n )\n\n // Check for utf-8'' prefix (case insensitive)\n if (\n (headerValue[0] !== 0x75 && headerValue[0] !== 0x55) || // u or U\n (headerValue[1] !== 0x74 && headerValue[1] !== 0x54) || // t or T\n (headerValue[2] !== 0x66 && headerValue[2] !== 0x46) || // f or F\n headerValue[3] !== 0x2d || // -\n headerValue[4] !== 0x38 // 8\n ) {\n throw parsingError('unknown encoding, expected utf-8\\'\\'')\n }\n\n // Skip utf-8'' and decode the rest\n value = decodeURIComponent(decoder.decode(headerValue.subarray(7)))\n } else if (input[position.position] === 0x22 /* \" */) {\n // Quoted string\n position.position++ // skip opening quote\n\n const quotedValue = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d && char !== 0x22, // not LF, CR, or \"\n input,\n position\n )\n\n if (input[position.position] !== 0x22) {\n throw parsingError('Closing quote not found')\n }\n position.position++ // skip closing quote\n\n value = decoder.decode(quotedValue)\n .replace(/%0A/ig, '\\n')\n .replace(/%0D/ig, '\\r')\n .replace(/%22/g, '\"')\n } else {\n // Token value (no quotes)\n const tokenValue = collectASequenceOfBytes(\n (char) => isToken(char) && char !== 0x3b, // not ;\n input,\n position\n )\n\n value = decoder.decode(tokenValue)\n }\n\n return { name: attrNameStr, value }\n}\n\n/**\n * @see https://andreubotella.github.io/multipart-form-data/#parse-multipart-form-data-headers\n * @param {Buffer} input\n * @param {{ position: number }} position\n */\nfunction parseMultipartFormDataHeaders (input, position) {\n // 1. Let name, filename and contentType be null.\n let name = null\n let filename = null\n let contentType = null\n let encoding = null\n\n // 2. While true:\n while (true) {\n // 2.1. If position points to a sequence of bytes starting with 0x0D 0x0A (CR LF):\n if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) {\n // 2.1.1. If name is null, return failure.\n if (name === null) {\n throw parsingError('header name is null')\n }\n\n // 2.1.2. Return name, filename and contentType.\n return { name, filename, contentType, encoding }\n }\n\n // 2.2. Let header name be the result of collecting a sequence of bytes that are\n // not 0x0A (LF), 0x0D (CR) or 0x3A (:), given position.\n let headerName = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d && char !== 0x3a,\n input,\n position\n )\n\n // 2.3. Remove any HTTP tab or space bytes from the start or end of header name.\n headerName = removeChars(headerName, true, true, (char) => char === 0x9 || char === 0x20)\n\n // 2.4. If header name does not match the field-name token production, return failure.\n if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) {\n throw parsingError('header name does not match the field-name token production')\n }\n\n // 2.5. If the byte at position is not 0x3A (:), return failure.\n if (input[position.position] !== 0x3a) {\n throw parsingError('expected :')\n }\n\n // 2.6. Advance position by 1.\n position.position++\n\n // 2.7. Collect a sequence of bytes that are HTTP tab or space bytes given position.\n // (Do nothing with those bytes.)\n collectASequenceOfBytes(\n (char) => char === 0x20 || char === 0x09,\n input,\n position\n )\n\n // 2.8. Byte-lowercase header name and switch on the result:\n switch (bufferToLowerCasedHeaderName(headerName)) {\n case 'content-disposition': {\n name = filename = null\n\n // Collect the disposition type (should be \"form-data\")\n const dispositionType = collectASequenceOfBytes(\n (char) => isToken(char),\n input,\n position\n )\n\n if (dispositionType.toString('ascii').toLowerCase() !== 'form-data') {\n throw parsingError('expected form-data for content-disposition header')\n }\n\n // Parse attributes recursively until CRLF\n while (\n position.position < input.length &&\n input[position.position] !== 0x0d &&\n input[position.position + 1] !== 0x0a\n ) {\n const attribute = parseContentDispositionAttribute(input, position)\n\n if (!attribute) {\n break\n }\n\n if (attribute.name === 'name') {\n name = attribute.value\n } else if (attribute.name === 'filename') {\n filename = attribute.value\n }\n }\n\n if (name === null) {\n throw parsingError('name attribute is required in content-disposition header')\n }\n\n break\n }\n case 'content-type': {\n // 1. Let header value be the result of collecting a sequence of bytes that are\n // not 0x0A (LF) or 0x0D (CR), given position.\n let headerValue = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d,\n input,\n position\n )\n\n // 2. Remove any HTTP tab or space bytes from the end of header value.\n headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20)\n\n // 3. Set contentType to the isomorphic decoding of header value.\n contentType = isomorphicDecode(headerValue)\n\n break\n }\n case 'content-transfer-encoding': {\n let headerValue = collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d,\n input,\n position\n )\n\n headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20)\n\n encoding = isomorphicDecode(headerValue)\n\n break\n }\n default: {\n // Collect a sequence of bytes that are not 0x0A (LF) or 0x0D (CR), given position.\n // (Do nothing with those bytes.)\n collectASequenceOfBytes(\n (char) => char !== 0x0a && char !== 0x0d,\n input,\n position\n )\n }\n }\n\n // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A\n // (CR LF), return failure. Otherwise, advance position by 2 (past the newline).\n if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) {\n throw parsingError('expected CRLF')\n } else {\n position.position += 2\n }\n }\n}\n\n/**\n * @param {(char: number) => boolean} condition\n * @param {Buffer} input\n * @param {{ position: number }} position\n */\nfunction collectASequenceOfBytes (condition, input, position) {\n let start = position.position\n\n while (start < input.length && condition(input[start])) {\n ++start\n }\n\n return input.subarray(position.position, (position.position = start))\n}\n\n/**\n * @param {Buffer} buf\n * @param {boolean} leading\n * @param {boolean} trailing\n * @param {(charCode: number) => boolean} predicate\n * @returns {Buffer}\n */\nfunction removeChars (buf, leading, trailing, predicate) {\n let lead = 0\n let trail = buf.length - 1\n\n if (leading) {\n while (lead < buf.length && predicate(buf[lead])) lead++\n }\n\n if (trailing) {\n while (trail > 0 && predicate(buf[trail])) trail--\n }\n\n return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1)\n}\n\n/**\n * Checks if {@param buffer} starts with {@param start}\n * @param {Buffer} buffer\n * @param {Buffer} start\n * @param {{ position: number }} position\n */\nfunction bufferStartsWith (buffer, start, position) {\n if (buffer.length < start.length) {\n return false\n }\n\n for (let i = 0; i < start.length; i++) {\n if (start[i] !== buffer[position.position + i]) {\n return false\n }\n }\n\n return true\n}\n\nfunction parsingError (cause) {\n return new TypeError('Failed to parse body as FormData.', { cause: new TypeError(cause) })\n}\n\n/**\n * CTL = \n * @param {number} char\n */\nfunction isCTL (char) {\n return char <= 0x1f || char === 0x7f\n}\n\n/**\n * tspecials := \"(\" / \")\" / \"<\" / \">\" / \"@\" /\n * \",\" / \";\" / \":\" / \"\\\" / <\">\n * \"/\" / \"[\" / \"]\" / \"?\" / \"=\"\n * ; Must be in quoted-string,\n * ; to use within parameter values\n * @param {number} char\n */\nfunction isTSpecial (char) {\n return (\n char === 0x28 || // (\n char === 0x29 || // )\n char === 0x3c || // <\n char === 0x3e || // >\n char === 0x40 || // @\n char === 0x2c || // ,\n char === 0x3b || // ;\n char === 0x3a || // :\n char === 0x5c || // \\\n char === 0x22 || // \"\n char === 0x2f || // /\n char === 0x5b || // [\n char === 0x5d || // ]\n char === 0x3f || // ?\n char === 0x3d // +\n )\n}\n\n/**\n * token := 1*\n * @param {number} char\n */\nfunction isToken (char) {\n return (\n char <= 0x7f && // ascii\n char !== 0x20 && // space\n char !== 0x09 &&\n !isCTL(char) &&\n !isTSpecial(char)\n )\n}\n\nmodule.exports = {\n multipartFormDataParser,\n validateBoundary\n}\n","'use strict'\n\n/** @typedef {`node:${string}`} NodeModuleName */\n\n/** @type {Record any>} */\nconst lazyLoaders = {\n __proto__: null,\n 'node:crypto': () => require('node:crypto'),\n 'node:sqlite': () => require('node:sqlite')\n}\n\n/**\n * @param {NodeModuleName} moduleName\n * @returns {boolean}\n */\nfunction detectRuntimeFeatureByNodeModule (moduleName) {\n try {\n lazyLoaders[moduleName]()\n return true\n } catch (err) {\n if (err.code !== 'ERR_UNKNOWN_BUILTIN_MODULE' && err.code !== 'ERR_NO_CRYPTO') {\n throw err\n }\n return false\n }\n}\n\nconst runtimeFeaturesAsNodeModule = /** @type {const} */ (['crypto', 'sqlite'])\n/** @typedef {typeof runtimeFeaturesAsNodeModule[number]} RuntimeFeatureByNodeModule */\n/** @typedef {RuntimeFeatureByNodeModule} Feature */\n\n/**\n * @param {Feature} feature\n * @returns {boolean}\n */\nfunction detectRuntimeFeature (feature) {\n if (runtimeFeaturesAsNodeModule.includes(/** @type {RuntimeFeatureByNodeModule} */ (feature))) {\n return detectRuntimeFeatureByNodeModule(`node:${feature}`)\n }\n throw new TypeError(`unknown feature: ${feature}`)\n}\n\n/**\n * @class\n * @name RuntimeFeatures\n */\nclass RuntimeFeatures {\n /** @type {Map} */\n #map = new Map()\n\n /**\n * Clears all cached feature detections.\n */\n clear () {\n this.#map.clear()\n }\n\n /**\n * @param {Feature} feature\n * @returns {boolean}\n */\n has (feature) {\n return (\n this.#map.get(feature) ?? this.#detectRuntimeFeature(feature)\n )\n }\n\n /**\n * @param {Feature} feature\n * @param {boolean} value\n */\n set (feature, value) {\n if (runtimeFeaturesAsNodeModule.includes(feature) === false) {\n throw new TypeError(`unknown feature: ${feature}`)\n }\n this.#map.set(feature, value)\n }\n\n /**\n * @param {Feature} feature\n * @returns {boolean}\n */\n #detectRuntimeFeature (feature) {\n const result = detectRuntimeFeature(feature)\n this.#map.set(feature, result)\n return result\n }\n}\n\nconst instance = new RuntimeFeatures()\n\nmodule.exports.runtimeFeatures = instance\nmodule.exports.default = instance\n","'use strict'\n\nconst util = require('../../core/util')\nconst {\n ReadableStreamFrom,\n readableStreamClose,\n fullyReadBody,\n extractMimeType\n} = require('./util')\nconst { FormData, setFormDataState } = require('./formdata')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst { isErrored, isDisturbed } = require('node:stream')\nconst { isUint8Array } = require('node:util/types')\nconst { serializeAMimeType } = require('./data-url')\nconst { multipartFormDataParser } = require('./formdata-parser')\nconst { parseJSONFromBytes } = require('../infra')\nconst { utf8DecodeBytes } = require('../../encoding')\nconst { runtimeFeatures } = require('../../util/runtime-features.js')\n\nconst random = runtimeFeatures.has('crypto')\n ? require('node:crypto').randomInt\n : (max) => Math.floor(Math.random() * max)\n\nconst textEncoder = new TextEncoder()\nfunction noop () {}\n\nconst streamRegistry = new FinalizationRegistry((weakRef) => {\n const stream = weakRef.deref()\n if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) {\n stream.cancel('Response object has been garbage collected').catch(noop)\n }\n})\n\n/**\n * Extract a body with type from a byte sequence or BodyInit object\n *\n * @param {import('../../../types').BodyInit} object - The BodyInit object to extract from\n * @param {boolean} [keepalive=false] - If true, indicates that the body\n * @returns {[{stream: ReadableStream, source: any, length: number | null}, string | null]} - Returns a tuple containing the body and its type\n *\n * @see https://fetch.spec.whatwg.org/#concept-bodyinit-extract\n */\nfunction extractBody (object, keepalive = false) {\n // 1. Let stream be null.\n let stream = null\n let controller = null\n\n // 2. If object is a ReadableStream object, then set stream to object.\n if (webidl.is.ReadableStream(object)) {\n stream = object\n } else if (webidl.is.Blob(object)) {\n // 3. Otherwise, if object is a Blob object, set stream to the\n // result of running object’s get stream.\n stream = object.stream()\n } else {\n // 4. Otherwise, set stream to a new ReadableStream object, and set\n // up stream with byte reading support.\n stream = new ReadableStream({\n pull () {},\n start (c) {\n controller = c\n },\n cancel () {},\n type: 'bytes'\n })\n }\n\n // 5. Assert: stream is a ReadableStream object.\n assert(webidl.is.ReadableStream(stream))\n\n // 6. Let action be null.\n let action = null\n\n // 7. Let source be null.\n let source = null\n\n // 8. Let length be null.\n let length = null\n\n // 9. Let type be null.\n let type = null\n\n // 10. Switch on object:\n if (typeof object === 'string') {\n // Set source to the UTF-8 encoding of object.\n // Note: setting source to a Uint8Array here breaks some mocking assumptions.\n source = object\n\n // Set type to `text/plain;charset=UTF-8`.\n type = 'text/plain;charset=UTF-8'\n } else if (webidl.is.URLSearchParams(object)) {\n // URLSearchParams\n\n // spec says to run application/x-www-form-urlencoded on body.list\n // this is implemented in Node.js as apart of an URLSearchParams instance toString method\n // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490\n // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100\n\n // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list.\n source = object.toString()\n\n // Set type to `application/x-www-form-urlencoded;charset=UTF-8`.\n type = 'application/x-www-form-urlencoded;charset=UTF-8'\n } else if (webidl.is.BufferSource(object)) {\n // Set source to a copy of the bytes held by object.\n source = webidl.util.getCopyOfBytesHeldByBufferSource(object)\n } else if (webidl.is.FormData(object)) {\n const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`\n const prefix = `--${boundary}\\r\\nContent-Disposition: form-data`\n\n /*! formdata-polyfill. MIT License. Jimmy Wärting */\n const formdataEscape = (str) =>\n str.replace(/\\n/g, '%0A').replace(/\\r/g, '%0D').replace(/\"/g, '%22')\n const normalizeLinefeeds = (value) => value.replace(/\\r?\\n|\\r/g, '\\r\\n')\n\n // Set action to this step: run the multipart/form-data\n // encoding algorithm, with object’s entry list and UTF-8.\n // - This ensures that the body is immutable and can't be changed afterwords\n // - That the content-length is calculated in advance.\n // - And that all parts are pre-encoded and ready to be sent.\n\n const blobParts = []\n const rn = new Uint8Array([13, 10]) // '\\r\\n'\n length = 0\n let hasUnknownSizeValue = false\n\n for (const [name, value] of object) {\n if (typeof value === 'string') {\n const chunk = textEncoder.encode(prefix +\n `; name=\"${formdataEscape(normalizeLinefeeds(name))}\"` +\n `\\r\\n\\r\\n${normalizeLinefeeds(value)}\\r\\n`)\n blobParts.push(chunk)\n length += chunk.byteLength\n } else {\n const chunk = textEncoder.encode(`${prefix}; name=\"${formdataEscape(normalizeLinefeeds(name))}\"` +\n (value.name ? `; filename=\"${formdataEscape(value.name)}\"` : '') + '\\r\\n' +\n `Content-Type: ${\n value.type || 'application/octet-stream'\n }\\r\\n\\r\\n`)\n blobParts.push(chunk, value, rn)\n if (typeof value.size === 'number') {\n length += chunk.byteLength + value.size + rn.byteLength\n } else {\n hasUnknownSizeValue = true\n }\n }\n }\n\n // CRLF is appended to the body to function with legacy servers and match other implementations.\n // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030\n // https://github.com/form-data/form-data/issues/63\n const chunk = textEncoder.encode(`--${boundary}--\\r\\n`)\n blobParts.push(chunk)\n length += chunk.byteLength\n if (hasUnknownSizeValue) {\n length = null\n }\n\n // Set source to object.\n source = object\n\n action = async function * () {\n for (const part of blobParts) {\n if (part.stream) {\n yield * part.stream()\n } else {\n yield part\n }\n }\n }\n\n // Set type to `multipart/form-data; boundary=`,\n // followed by the multipart/form-data boundary string generated\n // by the multipart/form-data encoding algorithm.\n type = `multipart/form-data; boundary=${boundary}`\n } else if (webidl.is.Blob(object)) {\n // Blob\n\n // Set source to object.\n source = object\n\n // Set length to object’s size.\n length = object.size\n\n // If object’s type attribute is not the empty byte sequence, set\n // type to its value.\n if (object.type) {\n type = object.type\n }\n } else if (typeof object[Symbol.asyncIterator] === 'function') {\n // If keepalive is true, then throw a TypeError.\n if (keepalive) {\n throw new TypeError('keepalive')\n }\n\n // If object is disturbed or locked, then throw a TypeError.\n if (util.isDisturbed(object) || object.locked) {\n throw new TypeError(\n 'Response body object should not be disturbed or locked'\n )\n }\n\n stream =\n webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object)\n }\n\n // 11. If source is a byte sequence, then set action to a\n // step that returns source and length to source’s length.\n if (typeof source === 'string' || isUint8Array(source)) {\n action = () => {\n length = typeof source === 'string' ? Buffer.byteLength(source) : source.length\n return source\n }\n }\n\n // 12. If action is non-null, then run these steps in parallel:\n if (action != null) {\n ;(async () => {\n // 1. Run action.\n const result = action()\n\n // 2. Whenever one or more bytes are available and stream is not errored,\n // enqueue the result of creating a Uint8Array from the available bytes into stream.\n const iterator = result?.[Symbol.asyncIterator]?.()\n if (iterator) {\n for await (const bytes of iterator) {\n if (isErrored(stream)) break\n if (bytes.length) {\n controller.enqueue(new Uint8Array(bytes))\n }\n }\n } else if (result?.length && !isErrored(stream)) {\n controller.enqueue(typeof result === 'string' ? textEncoder.encode(result) : new Uint8Array(result))\n }\n\n // 3. When running action is done, close stream.\n queueMicrotask(() => readableStreamClose(controller))\n })()\n }\n\n // 13. Let body be a body whose stream is stream, source is source,\n // and length is length.\n const body = { stream, source, length }\n\n // 14. Return (body, type).\n return [body, type]\n}\n\n/**\n * @typedef {object} ExtractBodyResult\n * @property {ReadableStream>} stream - The ReadableStream containing the body data\n * @property {any} source - The original source of the body data\n * @property {number | null} length - The length of the body data, or null\n */\n\n/**\n * Safely extract a body with type from a byte sequence or BodyInit object.\n *\n * @param {import('../../../types').BodyInit} object - The BodyInit object to extract from\n * @param {boolean} [keepalive=false] - If true, indicates that the body\n * @returns {[ExtractBodyResult, string | null]} - Returns a tuple containing the body and its type\n *\n * @see https://fetch.spec.whatwg.org/#bodyinit-safely-extract\n */\nfunction safelyExtractBody (object, keepalive = false) {\n // To safely extract a body and a `Content-Type` value from\n // a byte sequence or BodyInit object object, run these steps:\n\n // 1. If object is a ReadableStream object, then:\n if (webidl.is.ReadableStream(object)) {\n // Assert: object is neither disturbed nor locked.\n assert(!util.isDisturbed(object), 'The body has already been consumed.')\n assert(!object.locked, 'The stream is locked.')\n }\n\n // 2. Return the results of extracting object.\n return extractBody(object, keepalive)\n}\n\nfunction cloneBody (body) {\n // To clone a body body, run these steps:\n\n // https://fetch.spec.whatwg.org/#concept-body-clone\n\n // 1. Let « out1, out2 » be the result of teeing body’s stream.\n const { 0: out1, 1: out2 } = body.stream.tee()\n\n // 2. Set body’s stream to out1.\n body.stream = out1\n\n // 3. Return a body whose stream is out2 and other members are copied from body.\n return {\n stream: out2,\n length: body.length,\n source: body.source\n }\n}\n\nfunction bodyMixinMethods (instance, getInternalState) {\n const methods = {\n blob () {\n // The blob() method steps are to return the result of\n // running consume body with this and the following step\n // given a byte sequence bytes: return a Blob whose\n // contents are bytes and whose type attribute is this’s\n // MIME type.\n return consumeBody(this, (bytes) => {\n let mimeType = bodyMimeType(getInternalState(this))\n\n if (mimeType === null) {\n mimeType = ''\n } else if (mimeType) {\n mimeType = serializeAMimeType(mimeType)\n }\n\n // Return a Blob whose contents are bytes and type attribute\n // is mimeType.\n return new Blob([bytes], { type: mimeType })\n }, instance, getInternalState)\n },\n\n arrayBuffer () {\n // The arrayBuffer() method steps are to return the result\n // of running consume body with this and the following step\n // given a byte sequence bytes: return a new ArrayBuffer\n // whose contents are bytes.\n return consumeBody(this, (bytes) => {\n return new Uint8Array(bytes).buffer\n }, instance, getInternalState)\n },\n\n text () {\n // The text() method steps are to return the result of running\n // consume body with this and UTF-8 decode.\n return consumeBody(this, utf8DecodeBytes, instance, getInternalState)\n },\n\n json () {\n // The json() method steps are to return the result of running\n // consume body with this and parse JSON from bytes.\n return consumeBody(this, parseJSONFromBytes, instance, getInternalState)\n },\n\n formData () {\n // The formData() method steps are to return the result of running\n // consume body with this and the following step given a byte sequence bytes:\n return consumeBody(this, (value) => {\n // 1. Let mimeType be the result of get the MIME type with this.\n const mimeType = bodyMimeType(getInternalState(this))\n\n // 2. If mimeType is non-null, then switch on mimeType’s essence and run\n // the corresponding steps:\n if (mimeType !== null) {\n switch (mimeType.essence) {\n case 'multipart/form-data': {\n // 1. ... [long step]\n // 2. If that fails for some reason, then throw a TypeError.\n const parsed = multipartFormDataParser(value, mimeType)\n\n // 3. Return a new FormData object, appending each entry,\n // resulting from the parsing operation, to its entry list.\n const fd = new FormData()\n setFormDataState(fd, parsed)\n\n return fd\n }\n case 'application/x-www-form-urlencoded': {\n // 1. Let entries be the result of parsing bytes.\n const entries = new URLSearchParams(value.toString())\n\n // 2. If entries is failure, then throw a TypeError.\n\n // 3. Return a new FormData object whose entry list is entries.\n const fd = new FormData()\n\n for (const [name, value] of entries) {\n fd.append(name, value)\n }\n\n return fd\n }\n }\n }\n\n // 3. Throw a TypeError.\n throw new TypeError(\n 'Content-Type was not one of \"multipart/form-data\" or \"application/x-www-form-urlencoded\".'\n )\n }, instance, getInternalState)\n },\n\n bytes () {\n // The bytes() method steps are to return the result of running consume body\n // with this and the following step given a byte sequence bytes: return the\n // result of creating a Uint8Array from bytes in this’s relevant realm.\n return consumeBody(this, (bytes) => {\n return new Uint8Array(bytes)\n }, instance, getInternalState)\n }\n }\n\n return methods\n}\n\nfunction mixinBody (prototype, getInternalState) {\n Object.assign(prototype.prototype, bodyMixinMethods(prototype, getInternalState))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-consume-body\n * @param {any} object internal state\n * @param {(value: unknown) => unknown} convertBytesToJSValue\n * @param {any} instance\n * @param {(target: any) => any} getInternalState\n */\nfunction consumeBody (object, convertBytesToJSValue, instance, getInternalState) {\n try {\n webidl.brandCheck(object, instance)\n } catch (e) {\n return Promise.reject(e)\n }\n\n object = getInternalState(object)\n\n // 1. If object is unusable, then return a promise rejected\n // with a TypeError.\n if (bodyUnusable(object)) {\n return Promise.reject(new TypeError('Body is unusable: Body has already been read'))\n }\n\n // 2. Let promise be a new promise.\n const promise = Promise.withResolvers()\n\n // 3. Let errorSteps given error be to reject promise with error.\n const errorSteps = promise.reject\n\n // 4. Let successSteps given a byte sequence data be to resolve\n // promise with the result of running convertBytesToJSValue\n // with data. If that threw an exception, then run errorSteps\n // with that exception.\n const successSteps = (data) => {\n try {\n promise.resolve(convertBytesToJSValue(data))\n } catch (e) {\n errorSteps(e)\n }\n }\n\n // 5. If object’s body is null, then run successSteps with an\n // empty byte sequence.\n if (object.body == null) {\n successSteps(Buffer.allocUnsafe(0))\n return promise.promise\n }\n\n // 6. Otherwise, fully read object’s body given successSteps,\n // errorSteps, and object’s relevant global object.\n fullyReadBody(object.body, successSteps, errorSteps)\n\n // 7. Return promise.\n return promise.promise\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-unusable\n * @param {any} object internal state\n */\nfunction bodyUnusable (object) {\n const body = object.body\n\n // An object including the Body interface mixin is\n // said to be unusable if its body is non-null and\n // its body’s stream is disturbed or locked.\n return body != null && (body.stream.locked || util.isDisturbed(body.stream))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-mime-type\n * @param {any} requestOrResponse internal state\n */\nfunction bodyMimeType (requestOrResponse) {\n // 1. Let headers be null.\n // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list.\n // 3. Otherwise, set headers to requestOrResponse’s response’s header list.\n /** @type {import('./headers').HeadersList} */\n const headers = requestOrResponse.headersList\n\n // 4. Let mimeType be the result of extracting a MIME type from headers.\n const mimeType = extractMimeType(headers)\n\n // 5. If mimeType is failure, then return null.\n if (mimeType === 'failure') {\n return null\n }\n\n // 6. Return mimeType.\n return mimeType\n}\n\nmodule.exports = {\n extractBody,\n safelyExtractBody,\n cloneBody,\n mixinBody,\n streamRegistry,\n bodyUnusable\n}\n","'use strict'\n\n/* global WebAssembly */\n\nconst assert = require('node:assert')\nconst util = require('../core/util.js')\nconst { channels } = require('../core/diagnostics.js')\nconst timers = require('../util/timers.js')\nconst {\n RequestContentLengthMismatchError,\n ResponseContentLengthMismatchError,\n RequestAbortedError,\n HeadersTimeoutError,\n HeadersOverflowError,\n SocketError,\n InformationalError,\n BodyTimeoutError,\n HTTPParserError,\n ResponseExceededMaxSizeError\n} = require('../core/errors.js')\nconst {\n kUrl,\n kReset,\n kClient,\n kParser,\n kBlocking,\n kRunning,\n kPending,\n kSize,\n kWriting,\n kQueue,\n kNoRef,\n kKeepAliveDefaultTimeout,\n kHostHeader,\n kPendingIdx,\n kRunningIdx,\n kError,\n kPipelining,\n kSocket,\n kKeepAliveTimeoutValue,\n kMaxHeadersSize,\n kKeepAliveMaxTimeout,\n kKeepAliveTimeoutThreshold,\n kHeadersTimeout,\n kBodyTimeout,\n kStrictContentLength,\n kMaxRequests,\n kCounter,\n kMaxResponseSize,\n kOnError,\n kResume,\n kHTTPContext,\n kClosed\n} = require('../core/symbols.js')\n\nconst constants = require('../llhttp/constants.js')\nconst EMPTY_BUF = Buffer.alloc(0)\nconst FastBuffer = Buffer[Symbol.species]\nconst removeAllListeners = util.removeAllListeners\n\nlet extractBody\n\nfunction lazyllhttp () {\n const llhttpWasmData = process.env.JEST_WORKER_ID ? require('../llhttp/llhttp-wasm.js') : undefined\n\n let mod\n\n // We disable wasm SIMD on ppc64 as it seems to be broken on Power 9 architectures.\n let useWasmSIMD = process.arch !== 'ppc64'\n // The Env Variable UNDICI_NO_WASM_SIMD allows explicitly overriding the default behavior\n if (process.env.UNDICI_NO_WASM_SIMD === '1') {\n useWasmSIMD = true\n } else if (process.env.UNDICI_NO_WASM_SIMD === '0') {\n useWasmSIMD = false\n }\n\n if (useWasmSIMD) {\n try {\n mod = new WebAssembly.Module(require('../llhttp/llhttp_simd-wasm.js'))\n } catch {\n }\n }\n\n if (!mod) {\n // We could check if the error was caused by the simd option not\n // being enabled, but the occurring of this other error\n // * https://github.com/emscripten-core/emscripten/issues/11495\n // got me to remove that check to avoid breaking Node 12.\n mod = new WebAssembly.Module(llhttpWasmData || require('../llhttp/llhttp-wasm.js'))\n }\n\n return new WebAssembly.Instance(mod, {\n env: {\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_url: (p, at, len) => {\n return 0\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_status: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @returns {number}\n */\n wasm_on_message_begin: (p) => {\n assert(currentParser.ptr === p)\n return currentParser.onMessageBegin()\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_header_field: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_header_value: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @param {number} statusCode\n * @param {0|1} upgrade\n * @param {0|1} shouldKeepAlive\n * @returns {number}\n */\n wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => {\n assert(currentParser.ptr === p)\n return currentParser.onHeadersComplete(statusCode, upgrade === 1, shouldKeepAlive === 1)\n },\n /**\n * @param {number} p\n * @param {number} at\n * @param {number} len\n * @returns {number}\n */\n wasm_on_body: (p, at, len) => {\n assert(currentParser.ptr === p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len))\n },\n /**\n * @param {number} p\n * @returns {number}\n */\n wasm_on_message_complete: (p) => {\n assert(currentParser.ptr === p)\n return currentParser.onMessageComplete()\n }\n\n }\n })\n}\n\nlet llhttpInstance = null\n\n/**\n * @type {Parser|null}\n */\nlet currentParser = null\nlet currentBufferRef = null\n/**\n * @type {number}\n */\nlet currentBufferSize = 0\nlet currentBufferPtr = null\n\nconst USE_NATIVE_TIMER = 0\nconst USE_FAST_TIMER = 1\n\n// Use fast timers for headers and body to take eventual event loop\n// latency into account.\nconst TIMEOUT_HEADERS = 2 | USE_FAST_TIMER\nconst TIMEOUT_BODY = 4 | USE_FAST_TIMER\n\n// Use native timers to ignore event loop latency for keep-alive\n// handling.\nconst TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER\n\nclass Parser {\n /**\n * @param {import('./client.js')} client\n * @param {import('net').Socket} socket\n * @param {*} llhttp\n */\n constructor (client, socket, { exports }) {\n this.llhttp = exports\n this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE)\n this.client = client\n /**\n * @type {import('net').Socket}\n */\n this.socket = socket\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n this.statusCode = 0\n this.statusText = ''\n this.upgrade = false\n this.headers = []\n this.headersSize = 0\n this.headersMaxSize = client[kMaxHeadersSize]\n this.shouldKeepAlive = false\n this.paused = false\n this.resume = this.resume.bind(this)\n\n this.bytesRead = 0\n\n this.keepAlive = ''\n this.contentLength = ''\n this.connection = ''\n this.maxResponseSize = client[kMaxResponseSize]\n }\n\n setTimeout (delay, type) {\n // If the existing timer and the new timer are of different timer type\n // (fast or native) or have different delay, we need to clear the existing\n // timer and set a new one.\n if (\n delay !== this.timeoutValue ||\n (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER)\n ) {\n // If a timeout is already set, clear it with clearTimeout of the fast\n // timer implementation, as it can clear fast and native timers.\n if (this.timeout) {\n timers.clearTimeout(this.timeout)\n this.timeout = null\n }\n\n if (delay) {\n if (type & USE_FAST_TIMER) {\n this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this))\n } else {\n this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this))\n this.timeout?.unref()\n }\n }\n\n this.timeoutValue = delay\n } else if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n this.timeoutType = type\n }\n\n resume () {\n if (this.socket.destroyed || !this.paused) {\n return\n }\n\n assert(this.ptr != null)\n assert(currentParser === null)\n\n this.llhttp.llhttp_resume(this.ptr)\n\n assert(this.timeoutType === TIMEOUT_BODY)\n if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n this.paused = false\n this.execute(this.socket.read() || EMPTY_BUF) // Flush parser.\n this.readMore()\n }\n\n readMore () {\n while (!this.paused && this.ptr) {\n const chunk = this.socket.read()\n if (chunk === null) {\n break\n }\n this.execute(chunk)\n }\n }\n\n /**\n * @param {Buffer} chunk\n */\n execute (chunk) {\n assert(currentParser === null)\n assert(this.ptr != null)\n assert(!this.paused)\n\n const { socket, llhttp } = this\n\n // Allocate a new buffer if the current buffer is too small.\n if (chunk.length > currentBufferSize) {\n if (currentBufferPtr) {\n llhttp.free(currentBufferPtr)\n }\n // Allocate a buffer that is a multiple of 4096 bytes.\n currentBufferSize = Math.ceil(chunk.length / 4096) * 4096\n currentBufferPtr = llhttp.malloc(currentBufferSize)\n }\n\n new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(chunk)\n\n // Call `execute` on the wasm parser.\n // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data,\n // and finally the length of bytes to parse.\n // The return value is an error code or `constants.ERROR.OK`.\n try {\n let ret\n\n try {\n currentBufferRef = chunk\n currentParser = this\n ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length)\n } finally {\n currentParser = null\n currentBufferRef = null\n }\n\n if (ret !== constants.ERROR.OK) {\n const data = chunk.subarray(llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr)\n\n if (ret === constants.ERROR.PAUSED_UPGRADE) {\n this.onUpgrade(data)\n } else if (ret === constants.ERROR.PAUSED) {\n this.paused = true\n socket.unshift(data)\n } else {\n const ptr = llhttp.llhttp_get_error_reason(this.ptr)\n let message = ''\n if (ptr) {\n const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0)\n message =\n 'Response does not match the HTTP/1.1 protocol (' +\n Buffer.from(llhttp.memory.buffer, ptr, len).toString() +\n ')'\n }\n throw new HTTPParserError(message, constants.ERROR[ret], data)\n }\n }\n } catch (err) {\n util.destroy(socket, err)\n }\n }\n\n destroy () {\n assert(currentParser === null)\n assert(this.ptr != null)\n\n this.llhttp.llhttp_free(this.ptr)\n this.ptr = null\n\n this.timeout && timers.clearTimeout(this.timeout)\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n\n this.paused = false\n }\n\n /**\n * @param {Buffer} buf\n * @returns {0}\n */\n onStatus (buf) {\n this.statusText = buf.toString()\n return 0\n }\n\n /**\n * @returns {0|-1}\n */\n onMessageBegin () {\n const { socket, client } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n if (!request) {\n return -1\n }\n request.onResponseStarted()\n\n return 0\n }\n\n /**\n * @param {Buffer} buf\n * @returns {number}\n */\n onHeaderField (buf) {\n const len = this.headers.length\n\n if ((len & 1) === 0) {\n this.headers.push(buf)\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n this.trackHeader(buf.length)\n\n return 0\n }\n\n /**\n * @param {Buffer} buf\n * @returns {number}\n */\n onHeaderValue (buf) {\n let len = this.headers.length\n\n if ((len & 1) === 1) {\n this.headers.push(buf)\n len += 1\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n const key = this.headers[len - 2]\n if (key.length === 10) {\n const headerName = util.bufferToLowerCasedHeaderName(key)\n if (headerName === 'keep-alive') {\n this.keepAlive += buf.toString()\n } else if (headerName === 'connection') {\n this.connection += buf.toString()\n }\n } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') {\n this.contentLength += buf.toString()\n }\n\n this.trackHeader(buf.length)\n\n return 0\n }\n\n /**\n * @param {number} len\n */\n trackHeader (len) {\n this.headersSize += len\n if (this.headersSize >= this.headersMaxSize) {\n util.destroy(this.socket, new HeadersOverflowError())\n }\n }\n\n /**\n * @param {Buffer} head\n */\n onUpgrade (head) {\n const { upgrade, client, socket, headers, statusCode } = this\n\n assert(upgrade)\n assert(client[kSocket] === socket)\n assert(!socket.destroyed)\n assert(!this.paused)\n assert((headers.length & 1) === 0)\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n assert(request.upgrade || request.method === 'CONNECT')\n\n this.statusCode = 0\n this.statusText = ''\n this.shouldKeepAlive = false\n\n this.headers = []\n this.headersSize = 0\n\n socket.unshift(head)\n\n socket[kParser].destroy()\n socket[kParser] = null\n\n socket[kClient] = null\n socket[kError] = null\n\n removeAllListeners(socket)\n\n client[kSocket] = null\n client[kHTTPContext] = null // TODO (fix): This is hacky...\n client[kQueue][client[kRunningIdx]++] = null\n client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade'))\n\n try {\n request.onRequestUpgrade(statusCode, headers, socket)\n } catch (err) {\n util.destroy(socket, err)\n }\n\n client[kResume]()\n }\n\n /**\n * @param {number} statusCode\n * @param {boolean} upgrade\n * @param {boolean} shouldKeepAlive\n * @returns {number}\n */\n onHeadersComplete (statusCode, upgrade, shouldKeepAlive) {\n const { client, socket, headers, statusText } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n\n if (!request) {\n return -1\n }\n\n assert(!this.upgrade)\n assert(this.statusCode < 200)\n\n if (statusCode === 100) {\n util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))\n return -1\n }\n\n /* this can only happen if server is misbehaving */\n if (upgrade && !request.upgrade) {\n util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket)))\n return -1\n }\n\n assert(this.timeoutType === TIMEOUT_HEADERS)\n\n this.statusCode = statusCode\n this.shouldKeepAlive = (\n shouldKeepAlive ||\n // Override llhttp value which does not allow keepAlive for HEAD.\n (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive')\n )\n\n if (this.statusCode >= 200) {\n const bodyTimeout = request.bodyTimeout != null\n ? request.bodyTimeout\n : client[kBodyTimeout]\n this.setTimeout(bodyTimeout, TIMEOUT_BODY)\n } else if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n if (request.method === 'CONNECT') {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n if (upgrade) {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n assert((this.headers.length & 1) === 0)\n this.headers = []\n this.headersSize = 0\n\n if (this.shouldKeepAlive && client[kPipelining]) {\n const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null\n\n if (keepAliveTimeout != null) {\n const timeout = Math.min(\n keepAliveTimeout - client[kKeepAliveTimeoutThreshold],\n client[kKeepAliveMaxTimeout]\n )\n if (timeout <= 0) {\n socket[kReset] = true\n } else {\n client[kKeepAliveTimeoutValue] = timeout\n }\n } else {\n client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]\n }\n } else {\n // Stop more requests from being dispatched.\n socket[kReset] = true\n }\n\n const pause = request.onResponseStart(statusCode, headers, this.resume, statusText) === false\n\n if (request.aborted) {\n return -1\n }\n\n if (request.method === 'HEAD') {\n return 1\n }\n\n if (statusCode < 200) {\n return 1\n }\n\n if (socket[kBlocking]) {\n socket[kBlocking] = false\n client[kResume]()\n }\n\n return pause ? constants.ERROR.PAUSED : 0\n }\n\n /**\n * @param {Buffer} buf\n * @returns {number}\n */\n onBody (buf) {\n const { client, socket, statusCode, maxResponseSize } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert(this.timeoutType === TIMEOUT_BODY)\n if (this.timeout) {\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n assert(statusCode >= 200)\n\n if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {\n util.destroy(socket, new ResponseExceededMaxSizeError())\n return -1\n }\n\n this.bytesRead += buf.length\n\n if (request.onResponseData(buf) === false) {\n return constants.ERROR.PAUSED\n }\n\n return 0\n }\n\n /**\n * @returns {number}\n */\n onMessageComplete () {\n const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this\n\n if (socket.destroyed && (!statusCode || shouldKeepAlive)) {\n return -1\n }\n\n if (upgrade) {\n return 0\n }\n\n assert(statusCode >= 100)\n assert((this.headers.length & 1) === 0)\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n this.statusCode = 0\n this.statusText = ''\n this.bytesRead = 0\n this.contentLength = ''\n this.keepAlive = ''\n this.connection = ''\n\n this.headers = []\n this.headersSize = 0\n\n if (statusCode < 200) {\n return 0\n }\n\n if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) {\n util.destroy(socket, new ResponseContentLengthMismatchError())\n return -1\n }\n\n request.onResponseEnd(headers)\n\n client[kQueue][client[kRunningIdx]++] = null\n\n if (socket[kWriting]) {\n assert(client[kRunning] === 0)\n // Response completed before request.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (!shouldKeepAlive) {\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (socket[kReset] && client[kRunning] === 0) {\n // Destroy socket once all requests have completed.\n // The request at the tail of the pipeline is the one\n // that requested reset and no further requests should\n // have been queued since then.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (client[kPipelining] == null || client[kPipelining] === 1) {\n // We must wait a full event loop cycle to reuse this socket to make sure\n // that non-spec compliant servers are not closing the connection even if they\n // said they won't.\n setImmediate(client[kResume])\n } else {\n client[kResume]()\n }\n\n return 0\n }\n}\n\nfunction onParserTimeout (parserWeakRef) {\n const parser = parserWeakRef.deref()\n if (!parser) {\n return\n }\n\n const { socket, timeoutType, client, paused } = parser\n\n if (timeoutType === TIMEOUT_HEADERS) {\n if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {\n assert(!paused, 'cannot be paused while waiting for headers')\n util.destroy(socket, new HeadersTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_BODY) {\n if (!paused) {\n util.destroy(socket, new BodyTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_KEEP_ALIVE) {\n assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue])\n util.destroy(socket, new InformationalError('socket idle timeout'))\n }\n}\n\n/**\n * @param {import ('./client.js')} client\n * @param {import('net').Socket} socket\n * @returns\n */\nfunction connectH1 (client, socket) {\n client[kSocket] = socket\n\n if (!llhttpInstance) {\n llhttpInstance = lazyllhttp()\n }\n\n if (socket.errored) {\n throw socket.errored\n }\n\n if (socket.destroyed) {\n throw new SocketError('destroyed')\n }\n\n socket[kNoRef] = false\n socket[kWriting] = false\n socket[kReset] = false\n socket[kBlocking] = false\n socket[kParser] = new Parser(client, socket, llhttpInstance)\n\n util.addListener(socket, 'error', onHttpSocketError)\n util.addListener(socket, 'readable', onHttpSocketReadable)\n util.addListener(socket, 'end', onHttpSocketEnd)\n util.addListener(socket, 'close', onHttpSocketClose)\n\n socket[kClosed] = false\n socket.on('close', onSocketClose)\n\n return {\n version: 'h1',\n defaultPipelining: 1,\n write (request) {\n return writeH1(client, request)\n },\n resume () {\n resumeH1(client)\n },\n /**\n * @param {Error|undefined} err\n * @param {() => void} callback\n */\n destroy (err, callback) {\n if (socket[kClosed]) {\n queueMicrotask(callback)\n } else {\n socket.on('close', callback)\n socket.destroy(err)\n }\n },\n /**\n * @returns {boolean}\n */\n get destroyed () {\n return socket.destroyed\n },\n /**\n * @param {import('../core/request.js')} request\n * @returns {boolean}\n */\n busy (request) {\n if (socket[kWriting] || socket[kReset] || socket[kBlocking]) {\n return true\n }\n\n if (request) {\n if (client[kRunning] > 0 && !request.idempotent) {\n // Non-idempotent request cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return true\n }\n\n if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) {\n // Don't dispatch an upgrade until all preceding requests have completed.\n // A misbehaving server might upgrade the connection before all pipelined\n // request has completed.\n return true\n }\n\n if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 &&\n (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) {\n // Request with stream or iterator body can error while other requests\n // are inflight and indirectly error those as well.\n // Ensure this doesn't happen by waiting for inflight\n // to complete before dispatching.\n\n // Request with stream or iterator body cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return true\n }\n }\n\n return false\n }\n }\n}\n\nfunction onHttpSocketError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n const parser = this[kParser]\n\n // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded\n // to the user.\n if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so for as a valid response.\n parser.onMessageComplete()\n return\n }\n\n this[kError] = err\n\n this[kClient][kOnError](err)\n}\n\nfunction onHttpSocketReadable () {\n this[kParser]?.readMore()\n}\n\nfunction onHttpSocketEnd () {\n const parser = this[kParser]\n\n if (parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n return\n }\n\n util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onHttpSocketClose () {\n const parser = this[kParser]\n\n if (parser) {\n if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n }\n\n this[kParser].destroy()\n this[kParser] = null\n }\n\n const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n const client = this[kClient]\n\n client[kSocket] = null\n client[kHTTPContext] = null // TODO (fix): This is hacky...\n\n if (client.destroyed) {\n assert(client[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(client, request, err)\n }\n } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') {\n // Fail head of pipeline.\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n\n util.errorRequest(client, request, err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n\n client[kResume]()\n}\n\nfunction onSocketClose () {\n this[kClosed] = true\n}\n\n/**\n * @param {import('./client.js')} client\n */\nfunction resumeH1 (client) {\n const socket = client[kSocket]\n\n if (socket && !socket.destroyed) {\n if (client[kSize] === 0) {\n if (!socket[kNoRef] && socket.unref) {\n socket.unref()\n socket[kNoRef] = true\n }\n } else if (socket[kNoRef] && socket.ref) {\n socket.ref()\n socket[kNoRef] = false\n }\n\n if (client[kSize] === 0) {\n if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) {\n socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE)\n }\n } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {\n if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {\n const request = client[kQueue][client[kRunningIdx]]\n const headersTimeout = request.headersTimeout != null\n ? request.headersTimeout\n : client[kHeadersTimeout]\n socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS)\n }\n }\n }\n}\n\n// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2\nfunction shouldSendContentLength (method) {\n return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'\n}\n\n/**\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @returns\n */\nfunction writeH1 (client, request) {\n const { method, path, host, upgrade, blocking, reset } = request\n\n let { body, headers, contentLength } = request\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH' ||\n method === 'QUERY' ||\n method === 'PROPFIND' ||\n method === 'PROPPATCH'\n )\n\n if (util.isFormDataLike(body)) {\n if (!extractBody) {\n extractBody = require('../web/fetch/body.js').extractBody\n }\n\n const [bodyStream, contentType] = extractBody(body)\n if (request.contentType == null) {\n headers.push('content-type', contentType)\n }\n body = bodyStream.stream\n contentLength = bodyStream.length\n } else if (util.isBlobLike(body) && request.contentType == null && body.type) {\n headers.push('content-type', body.type)\n }\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n const bodyLength = util.bodyLength(body)\n\n contentLength = bodyLength ?? contentLength\n\n if (contentLength === null) {\n contentLength = request.contentLength\n }\n\n if (contentLength === 0 && !expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n\n contentLength = null\n }\n\n // https://github.com/nodejs/undici/issues/2046\n // A user agent may send a Content-Length header with 0 value, this should be allowed.\n if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n util.errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n const socket = client[kSocket]\n\n /**\n * @param {Error} [err]\n * @returns {void}\n */\n const abort = (err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n util.errorRequest(client, request, err || new RequestAbortedError())\n\n util.destroy(body)\n util.destroy(socket, new InformationalError('aborted'))\n }\n\n try {\n request.onRequestStart(abort, null)\n } catch (err) {\n util.errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n if (method === 'HEAD') {\n // https://github.com/mcollina/undici/issues/258\n // Close after a HEAD request to interop with misbehaving servers\n // that may send a body in the response.\n\n socket[kReset] = true\n }\n\n if (upgrade || method === 'CONNECT') {\n // On CONNECT or upgrade, block pipeline from dispatching further\n // requests on this connection.\n\n socket[kReset] = true\n }\n\n if (reset != null) {\n socket[kReset] = reset\n }\n\n if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) {\n socket[kReset] = true\n }\n\n if (blocking) {\n socket[kBlocking] = true\n }\n\n if (socket.setTypeOfService) {\n socket.setTypeOfService(request.typeOfService)\n }\n\n let header = `${method} ${path} HTTP/1.1\\r\\n`\n\n if (typeof host === 'string') {\n header += `host: ${host}\\r\\n`\n } else {\n header += client[kHostHeader]\n }\n\n if (upgrade) {\n header += `connection: upgrade\\r\\nupgrade: ${upgrade}\\r\\n`\n } else if (client[kPipelining] && !socket[kReset]) {\n header += 'connection: keep-alive\\r\\n'\n } else {\n header += 'connection: close\\r\\n'\n }\n\n if (Array.isArray(headers)) {\n for (let n = 0; n < headers.length; n += 2) {\n const key = headers[n + 0]\n const val = headers[n + 1]\n\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n header += `${key}: ${val[i]}\\r\\n`\n }\n } else {\n header += `${key}: ${val}\\r\\n`\n }\n }\n }\n\n if (channels.sendHeaders.hasSubscribers) {\n channels.sendHeaders.publish({ request, headers: header, socket })\n }\n\n if (!body || bodyLength === 0) {\n writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload)\n } else if (util.isBuffer(body)) {\n writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload)\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload)\n } else {\n writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload)\n }\n } else if (util.isStream(body)) {\n writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload)\n } else if (util.isIterable(body)) {\n writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload)\n } else {\n assert(false)\n }\n\n return true\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {import('stream').Stream} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n */\nfunction writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n let finished = false\n\n const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })\n\n /**\n * @param {Buffer} chunk\n * @returns {void}\n */\n const onData = function (chunk) {\n if (finished) {\n return\n }\n\n try {\n if (!writer.write(chunk) && this.pause) {\n this.pause()\n }\n } catch (err) {\n util.destroy(this, err)\n }\n }\n\n /**\n * @returns {void}\n */\n const onDrain = function () {\n if (finished) {\n return\n }\n\n if (body.resume) {\n body.resume()\n }\n }\n\n /**\n * @returns {void}\n */\n const onClose = function () {\n // 'close' might be emitted *before* 'error' for\n // broken streams. Wait a tick to avoid this case.\n queueMicrotask(() => {\n // It's only safe to remove 'error' listener after\n // 'close'.\n body.removeListener('error', onFinished)\n })\n\n if (!finished) {\n const err = new RequestAbortedError()\n queueMicrotask(() => onFinished(err))\n }\n }\n\n /**\n * @param {Error} [err]\n * @returns\n */\n const onFinished = function (err) {\n if (finished) {\n return\n }\n\n finished = true\n\n assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1))\n\n socket\n .off('drain', onDrain)\n .off('error', onFinished)\n\n body\n .removeListener('data', onData)\n .removeListener('end', onFinished)\n .removeListener('close', onClose)\n\n if (!err) {\n try {\n writer.end()\n } catch (er) {\n err = er\n }\n }\n\n writer.destroy(err)\n\n if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) {\n util.destroy(body, err)\n } else {\n util.destroy(body)\n }\n }\n\n body\n .on('data', onData)\n .on('end', onFinished)\n .on('error', onFinished)\n .on('close', onClose)\n\n if (body.resume) {\n body.resume()\n }\n\n socket\n .on('drain', onDrain)\n .on('error', onFinished)\n\n if (body.errorEmitted ?? body.errored) {\n setImmediate(onFinished, body.errored)\n } else if (body.endEmitted ?? body.readableEnded) {\n setImmediate(onFinished, null)\n }\n\n if (body.closeEmitted ?? body.closed) {\n setImmediate(onClose)\n }\n}\n\n/**\n * @typedef AbortCallback\n * @type {Function}\n * @param {Error} [err]\n * @returns {void}\n */\n\n/**\n * @param {AbortCallback} abort\n * @param {Uint8Array|null} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {void}\n */\nfunction writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n try {\n if (!body) {\n if (contentLength === 0) {\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n assert(contentLength === null, 'no body must not have content length')\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n } else if (util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(body)\n socket.uncork()\n request.onBodySent(body)\n\n if (!expectsPayload && request.reset !== false) {\n socket[kReset] = true\n }\n }\n request.onRequestSent()\n\n client[kResume]()\n } catch (err) {\n abort(err)\n }\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {Blob} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {Promise}\n */\nasync function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n assert(contentLength === body.size, 'blob body must have content length')\n\n try {\n if (contentLength != null && contentLength !== body.size) {\n throw new RequestContentLengthMismatchError()\n }\n\n const buffer = Buffer.from(await body.arrayBuffer())\n\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(buffer)\n socket.uncork()\n\n request.onBodySent(buffer)\n request.onRequestSent()\n\n if (!expectsPayload && request.reset !== false) {\n socket[kReset] = true\n }\n\n client[kResume]()\n } catch (err) {\n abort(err)\n }\n}\n\n/**\n * @param {AbortCallback} abort\n * @param {Iterable} body\n * @param {import('./client.js')} client\n * @param {import('../core/request.js')} request\n * @param {import('net').Socket} socket\n * @param {number} contentLength\n * @param {string} header\n * @param {boolean} expectsPayload\n * @returns {Promise}\n */\nasync function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n let callback = null\n function onDrain () {\n if (callback) {\n const cb = callback\n callback = null\n cb()\n }\n }\n\n const waitForDrain = () => new Promise((resolve, reject) => {\n assert(callback === null)\n\n if (socket[kError]) {\n reject(socket[kError])\n } else {\n callback = resolve\n }\n })\n\n socket\n .on('close', onDrain)\n .on('drain', onDrain)\n\n const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (!writer.write(chunk)) {\n await waitForDrain()\n }\n }\n\n writer.end()\n } catch (err) {\n writer.destroy(err)\n } finally {\n socket\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n}\n\nclass AsyncWriter {\n /**\n *\n * @param {object} arg\n * @param {AbortCallback} arg.abort\n * @param {import('net').Socket} arg.socket\n * @param {import('../core/request.js')} arg.request\n * @param {number} arg.contentLength\n * @param {import('./client.js')} arg.client\n * @param {boolean} arg.expectsPayload\n * @param {string} arg.header\n */\n constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) {\n this.socket = socket\n this.request = request\n this.contentLength = contentLength\n this.client = client\n this.bytesWritten = 0\n this.expectsPayload = expectsPayload\n this.header = header\n this.abort = abort\n\n socket[kWriting] = true\n }\n\n /**\n * @param {Buffer} chunk\n * @returns\n */\n write (chunk) {\n const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return false\n }\n\n const len = Buffer.byteLength(chunk)\n if (!len) {\n return true\n }\n\n // We should defer writing chunks.\n if (contentLength !== null && bytesWritten + len > contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n socket.cork()\n\n if (bytesWritten === 0) {\n if (!expectsPayload && request.reset !== false) {\n socket[kReset] = true\n }\n\n if (contentLength === null) {\n socket.write(`${header}transfer-encoding: chunked\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n }\n }\n\n if (contentLength === null) {\n socket.write(`\\r\\n${len.toString(16)}\\r\\n`, 'latin1')\n }\n\n this.bytesWritten += len\n\n const ret = socket.write(chunk)\n\n socket.uncork()\n\n request.onBodySent(chunk)\n\n if (!ret) {\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n }\n\n return ret\n }\n\n /**\n * @returns {void}\n */\n end () {\n const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this\n request.onRequestSent()\n\n socket[kWriting] = false\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return\n }\n\n if (bytesWritten === 0) {\n if (expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body.\n\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n } else if (contentLength === null) {\n socket.write('\\r\\n0\\r\\n\\r\\n', 'latin1')\n }\n\n if (contentLength !== null && bytesWritten !== contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n } else {\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n }\n\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n\n client[kResume]()\n }\n\n /**\n * @param {Error} [err]\n * @returns {void}\n */\n destroy (err) {\n const { socket, client, abort } = this\n\n socket[kWriting] = false\n\n if (err) {\n assert(client[kRunning] <= 1, 'pipeline should only contain this request')\n abort(err)\n }\n }\n}\n\nmodule.exports = connectH1\n","'use strict'\n\nconst assert = require('node:assert')\nconst { pipeline } = require('node:stream')\nconst util = require('../core/util.js')\nconst {\n RequestContentLengthMismatchError,\n RequestAbortedError,\n SocketError,\n InformationalError,\n InvalidArgumentError\n} = require('../core/errors.js')\nconst {\n kUrl,\n kReset,\n kClient,\n kRunning,\n kPending,\n kQueue,\n kPendingIdx,\n kRunningIdx,\n kError,\n kSocket,\n kStrictContentLength,\n kOnError,\n kMaxConcurrentStreams,\n kPingInterval,\n kHTTP2Session,\n kHTTP2InitialWindowSize,\n kHTTP2ConnectionWindowSize,\n kResume,\n kSize,\n kHTTPContext,\n kClosed,\n kBodyTimeout,\n kEnableConnectProtocol,\n kRemoteSettings,\n kHTTP2Stream,\n kHTTP2SessionState\n} = require('../core/symbols.js')\nconst { channels } = require('../core/diagnostics.js')\n\nconst kOpenStreams = Symbol('open streams')\n\nlet extractBody\n\n/** @type {import('http2')} */\nlet http2\ntry {\n http2 = require('node:http2')\n} catch {\n // @ts-ignore\n http2 = { constants: {} }\n}\n\nconst {\n constants: {\n HTTP2_HEADER_AUTHORITY,\n HTTP2_HEADER_METHOD,\n HTTP2_HEADER_PATH,\n HTTP2_HEADER_SCHEME,\n HTTP2_HEADER_CONTENT_LENGTH,\n HTTP2_HEADER_EXPECT,\n HTTP2_HEADER_STATUS,\n HTTP2_HEADER_PROTOCOL,\n NGHTTP2_REFUSED_STREAM,\n NGHTTP2_CANCEL\n }\n} = http2\n\nfunction parseH2Headers (headers) {\n const result = []\n\n for (const [name, value] of Object.entries(headers)) {\n // h2 may concat the header value by array\n // e.g. Set-Cookie\n if (Array.isArray(value)) {\n for (const subvalue of value) {\n // we need to provide each header value of header name\n // because the headers handler expect name-value pair\n result.push(Buffer.from(name), Buffer.from(subvalue))\n }\n } else {\n result.push(Buffer.from(name), Buffer.from(value))\n }\n }\n\n return result\n}\n\nfunction connectH2 (client, socket) {\n client[kSocket] = socket\n\n const http2InitialWindowSize = client[kHTTP2InitialWindowSize]\n const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize]\n\n const session = http2.connect(client[kUrl], {\n createConnection: () => socket,\n peerMaxConcurrentStreams: client[kMaxConcurrentStreams],\n settings: {\n // TODO(metcoder95): add support for PUSH\n enablePush: false,\n ...(http2InitialWindowSize != null ? { initialWindowSize: http2InitialWindowSize } : null)\n }\n })\n\n client[kSocket] = socket\n session[kOpenStreams] = 0\n session[kClient] = client\n session[kSocket] = socket\n session[kHTTP2SessionState] = {\n ping: {\n interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref()\n }\n }\n // We set it to true by default in a best-effort; however once connected to an H2 server\n // we will check if extended CONNECT protocol is supported or not\n // and set this value accordingly.\n session[kEnableConnectProtocol] = false\n // States whether or not we have received the remote settings from the server\n session[kRemoteSettings] = false\n\n // Apply connection-level flow control once connected (if supported).\n if (http2ConnectionWindowSize) {\n util.addListener(session, 'connect', applyConnectionWindowSize.bind(session, http2ConnectionWindowSize))\n }\n\n util.addListener(session, 'error', onHttp2SessionError)\n util.addListener(session, 'frameError', onHttp2FrameError)\n util.addListener(session, 'end', onHttp2SessionEnd)\n util.addListener(session, 'goaway', onHttp2SessionGoAway)\n util.addListener(session, 'close', onHttp2SessionClose)\n util.addListener(session, 'remoteSettings', onHttp2RemoteSettings)\n // TODO (@metcoder95): implement SETTINGS support\n // util.addListener(session, 'localSettings', onHttp2RemoteSettings)\n\n session.unref()\n\n client[kHTTP2Session] = session\n socket[kHTTP2Session] = session\n\n util.addListener(socket, 'error', onHttp2SocketError)\n util.addListener(socket, 'end', onHttp2SocketEnd)\n util.addListener(socket, 'close', onHttp2SocketClose)\n\n socket[kClosed] = false\n socket.on('close', onSocketClose)\n\n return {\n version: 'h2',\n defaultPipelining: Infinity,\n /**\n * @param {import('../core/request.js')} request\n * @returns {boolean}\n */\n write (request) {\n return writeH2(client, request)\n },\n /**\n * @returns {void}\n */\n resume () {\n resumeH2(client)\n },\n /**\n * @param {Error | null} err\n * @param {() => void} callback\n */\n destroy (err, callback) {\n if (socket[kClosed]) {\n queueMicrotask(callback)\n } else {\n socket.destroy(err).on('close', callback)\n }\n },\n /**\n * @type {boolean}\n */\n get destroyed () {\n return socket.destroyed\n },\n /**\n * @param {import('../core/request.js')} request\n * @returns {boolean}\n */\n busy (request) {\n if (request != null) {\n if (client[kRunning] > 0) {\n // We are already processing requests\n\n // Non-idempotent request cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n if (request.idempotent === false) return true\n // Don't dispatch an upgrade until all preceding requests have completed.\n // Possibly, we do not have remote settings confirmed yet.\n if ((request.upgrade === 'websocket' || request.method === 'CONNECT') && session[kRemoteSettings] === false) return true\n // Request with stream or iterator body can error while other requests\n // are inflight and indirectly error those as well.\n // Ensure this doesn't happen by waiting for inflight\n // to complete before dispatching.\n\n // Request with stream or iterator body cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n if (util.bodyLength(request.body) !== 0 &&\n (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) return true\n } else {\n return (request.upgrade === 'websocket' || request.method === 'CONNECT') && session[kRemoteSettings] === false\n }\n }\n\n return false\n }\n }\n}\n\nfunction resumeH2 (client) {\n const socket = client[kSocket]\n\n if (socket?.destroyed === false) {\n if (client[kSize] === 0 || client[kMaxConcurrentStreams] === 0) {\n socket.unref()\n client[kHTTP2Session].unref()\n } else {\n socket.ref()\n client[kHTTP2Session].ref()\n }\n }\n}\n\nfunction applyConnectionWindowSize (connectionWindowSize) {\n try {\n if (typeof this.setLocalWindowSize === 'function') {\n this.setLocalWindowSize(connectionWindowSize)\n }\n } catch {\n // Best-effort only.\n }\n}\n\nfunction onHttp2RemoteSettings (settings) {\n // Fallbacks are a safe bet, remote setting will always override\n this[kClient][kMaxConcurrentStreams] = settings.maxConcurrentStreams ?? this[kClient][kMaxConcurrentStreams]\n /**\n * From RFC-8441\n * A sender MUST NOT send a SETTINGS_ENABLE_CONNECT_PROTOCOL parameter\n * with the value of 0 after previously sending a value of 1.\n */\n // Note: Cannot be tested in Node, it does not supports disabling the extended CONNECT protocol once enabled\n if (this[kRemoteSettings] === true && this[kEnableConnectProtocol] === true && settings.enableConnectProtocol === false) {\n const err = new InformationalError('HTTP/2: Server disabled extended CONNECT protocol against RFC-8441')\n this[kSocket][kError] = err\n this[kClient][kOnError](err)\n return\n }\n\n this[kEnableConnectProtocol] = settings.enableConnectProtocol ?? this[kEnableConnectProtocol]\n this[kRemoteSettings] = true\n this[kClient][kResume]()\n}\n\nfunction onHttp2SendPing (session) {\n const state = session[kHTTP2SessionState]\n if ((session.closed || session.destroyed) && state.ping.interval != null) {\n clearInterval(state.ping.interval)\n state.ping.interval = null\n return\n }\n\n // If no ping sent, do nothing\n session.ping(onPing.bind(session))\n\n function onPing (err, duration) {\n const client = this[kClient]\n const socket = this[kClient]\n\n if (err != null) {\n const error = new InformationalError(`HTTP/2: \"PING\" errored - type ${err.message}`)\n socket[kError] = error\n client[kOnError](error)\n } else {\n client.emit('ping', duration)\n }\n }\n}\n\nfunction onHttp2SessionError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n this[kSocket][kError] = err\n this[kClient][kOnError](err)\n}\n\nfunction onHttp2FrameError (type, code, id) {\n if (id === 0) {\n const err = new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`)\n this[kSocket][kError] = err\n this[kClient][kOnError](err)\n }\n}\n\nfunction onHttp2SessionEnd () {\n const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket]))\n this.destroy(err)\n util.destroy(this[kSocket], err)\n}\n\n/**\n * This is the root cause of #3011\n * We need to handle GOAWAY frames properly, and trigger the session close\n * along with the socket right away\n *\n * @this {import('http2').ClientHttp2Session}\n * @param {number} errorCode\n */\nfunction onHttp2SessionGoAway (errorCode) {\n // TODO(mcollina): Verify if GOAWAY implements the spec correctly:\n // https://datatracker.ietf.org/doc/html/rfc7540#section-6.8\n // Specifically, we do not verify the \"valid\" stream id.\n\n const err = this[kError] || new SocketError(`HTTP/2: \"GOAWAY\" frame received with code ${errorCode}`, util.getSocketInfo(this[kSocket]))\n const client = this[kClient]\n\n client[kSocket] = null\n client[kHTTPContext] = null\n\n // this is an HTTP2 session\n this.close()\n this[kHTTP2Session] = null\n\n util.destroy(this[kSocket], err)\n\n // Fail head of pipeline.\n if (client[kRunningIdx] < client[kQueue].length) {\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n util.errorRequest(client, request, err)\n client[kPendingIdx] = client[kRunningIdx]\n }\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n client.emit('connectionError', client[kUrl], [client], err)\n\n client[kResume]()\n}\n\nfunction onHttp2SessionClose () {\n const { [kClient]: client, [kHTTP2SessionState]: state } = this\n const { [kSocket]: socket } = client\n\n const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket))\n\n client[kSocket] = null\n client[kHTTPContext] = null\n\n if (state.ping.interval != null) {\n clearInterval(state.ping.interval)\n state.ping.interval = null\n }\n\n if (client.destroyed) {\n assert(client[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(client, request, err)\n }\n }\n}\n\nfunction onHttp2SocketClose () {\n const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n const client = this[kHTTP2Session][kClient]\n\n client[kSocket] = null\n client[kHTTPContext] = null\n\n if (this[kHTTP2Session] !== null) {\n this[kHTTP2Session].destroy(err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n\n client[kResume]()\n}\n\nfunction onHttp2SocketError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n this[kError] = err\n\n this[kClient][kOnError](err)\n}\n\nfunction onHttp2SocketEnd () {\n util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onSocketClose () {\n this[kClosed] = true\n}\n\n// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2\nfunction shouldSendContentLength (method) {\n return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'\n}\n\nfunction writeH2 (client, request) {\n const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]\n const session = client[kHTTP2Session]\n const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request\n let { body } = request\n\n if (upgrade != null && upgrade !== 'websocket') {\n util.errorRequest(client, request, new InvalidArgumentError(`Custom upgrade \"${upgrade}\" not supported over HTTP/2`))\n return false\n }\n\n const headers = {}\n for (let n = 0; n < reqHeaders.length; n += 2) {\n const key = reqHeaders[n + 0]\n const val = reqHeaders[n + 1]\n\n if (key === 'cookie') {\n if (headers[key] != null) {\n headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val]\n } else {\n headers[key] = val\n }\n\n continue\n }\n\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n if (headers[key]) {\n headers[key] += `, ${val[i]}`\n } else {\n headers[key] = val[i]\n }\n }\n } else if (headers[key]) {\n headers[key] += `, ${val}`\n } else {\n headers[key] = val\n }\n }\n\n /** @type {import('node:http2').ClientHttp2Stream} */\n let stream = null\n\n const { hostname, port } = client[kUrl]\n\n headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}`\n headers[HTTP2_HEADER_METHOD] = method\n\n const abort = (err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n err = err || new RequestAbortedError()\n\n util.errorRequest(client, request, err)\n\n if (stream != null) {\n // Some chunks might still come after abort,\n // let's ignore them\n stream.removeAllListeners('data')\n\n // On Abort, we close the stream to send RST_STREAM frame\n stream.close()\n\n // We move the running index to the next request\n client[kOnError](err)\n client[kResume]()\n }\n\n // We do not destroy the socket as we can continue using the session\n // the stream gets destroyed and the session remains to create new streams\n util.destroy(body, err)\n }\n\n try {\n // We are already connected, streams are pending.\n // We can call on connect, and wait for abort\n request.onRequestStart(abort, null)\n } catch (err) {\n util.errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n if (upgrade || method === 'CONNECT') {\n session.ref()\n\n if (upgrade === 'websocket') {\n // We cannot upgrade to websocket if extended CONNECT protocol is not supported\n if (session[kEnableConnectProtocol] === false) {\n util.errorRequest(client, request, new InformationalError('HTTP/2: Extended CONNECT protocol not supported by server'))\n session.unref()\n return false\n }\n\n // We force the method to CONNECT\n // as per RFC-8441\n // https://datatracker.ietf.org/doc/html/rfc8441#section-4\n headers[HTTP2_HEADER_METHOD] = 'CONNECT'\n headers[HTTP2_HEADER_PROTOCOL] = 'websocket'\n // :path and :scheme headers must be omitted when sending CONNECT but set if extended-CONNECT\n headers[HTTP2_HEADER_PATH] = path\n\n if (protocol === 'ws:' || protocol === 'wss:') {\n headers[HTTP2_HEADER_SCHEME] = protocol === 'ws:' ? 'http' : 'https'\n } else {\n headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'\n }\n\n stream = session.request(headers, { endStream: false, signal })\n stream[kHTTP2Stream] = true\n\n stream.once('response', (headers, _flags) => {\n const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n\n request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream)\n\n ++session[kOpenStreams]\n client[kQueue][client[kRunningIdx]++] = null\n })\n\n stream.on('error', () => {\n if (stream.rstCode === NGHTTP2_REFUSED_STREAM || stream.rstCode === NGHTTP2_CANCEL) {\n // NGHTTP2_REFUSED_STREAM (7) or NGHTTP2_CANCEL (8)\n // We do not treat those as errors as the server might\n // not support websockets and refuse the stream\n abort(new InformationalError(`HTTP/2: \"stream error\" received - code ${stream.rstCode}`))\n }\n })\n\n stream.once('close', () => {\n session[kOpenStreams] -= 1\n if (session[kOpenStreams] === 0) session.unref()\n })\n\n stream.setTimeout(requestTimeout)\n return true\n }\n\n // TODO: consolidate once we support CONNECT properly\n // NOTE: We are already connected, streams are pending, first request\n // will create a new stream. We trigger a request to create the stream and wait until\n // `ready` event is triggered\n // We disabled endStream to allow the user to write to the stream\n stream = session.request(headers, { endStream: false, signal })\n stream[kHTTP2Stream] = true\n stream.on('response', headers => {\n const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n\n request.onRequestUpgrade(statusCode, parseH2Headers(realHeaders), stream)\n ++session[kOpenStreams]\n client[kQueue][client[kRunningIdx]++] = null\n })\n stream.once('close', () => {\n session[kOpenStreams] -= 1\n if (session[kOpenStreams] === 0) session.unref()\n })\n stream.setTimeout(requestTimeout)\n\n return true\n }\n\n // https://tools.ietf.org/html/rfc7540#section-8.3\n // :path and :scheme headers must be omitted when sending CONNECT\n headers[HTTP2_HEADER_PATH] = path\n headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH'\n )\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n let contentLength = util.bodyLength(body)\n\n if (util.isFormDataLike(body)) {\n extractBody ??= require('../web/fetch/body.js').extractBody\n\n const [bodyStream, contentType] = extractBody(body)\n headers['content-type'] = contentType\n\n body = bodyStream.stream\n contentLength = bodyStream.length\n }\n\n if (contentLength == null) {\n contentLength = request.contentLength\n }\n\n if (!expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n // And for methods that don't expect a payload, omit Content-Length.\n contentLength = null\n }\n\n // https://github.com/nodejs/undici/issues/2046\n // A user agent may send a Content-Length header with 0 value, this should be allowed.\n if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n util.errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n if (contentLength != null) {\n assert(body || contentLength === 0, 'no body must not have content length')\n headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`\n }\n\n session.ref()\n\n if (channels.sendHeaders.hasSubscribers) {\n let header = ''\n for (const key in headers) {\n header += `${key}: ${headers[key]}\\r\\n`\n }\n channels.sendHeaders.publish({ request, headers: header, socket: session[kSocket] })\n }\n\n // TODO(metcoder95): add support for sending trailers\n const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null\n if (expectContinue) {\n headers[HTTP2_HEADER_EXPECT] = '100-continue'\n stream = session.request(headers, { endStream: shouldEndStream, signal })\n stream[kHTTP2Stream] = true\n\n stream.once('continue', writeBodyH2)\n } else {\n stream = session.request(headers, {\n endStream: shouldEndStream,\n signal\n })\n stream[kHTTP2Stream] = true\n\n writeBodyH2()\n }\n\n // Increment counter as we have new streams open\n ++session[kOpenStreams]\n stream.setTimeout(requestTimeout)\n\n // Track whether we received a response (headers)\n let responseReceived = false\n\n stream.once('response', headers => {\n const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers\n request.onResponseStarted()\n responseReceived = true\n\n // Due to the stream nature, it is possible we face a race condition\n // where the stream has been assigned, but the request has been aborted\n // the request remains in-flight and headers hasn't been received yet\n // for those scenarios, best effort is to destroy the stream immediately\n // as there's no value to keep it open.\n if (request.aborted) {\n stream.removeAllListeners('data')\n return\n }\n\n if (request.onResponseStart(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) {\n stream.pause()\n }\n\n stream.on('data', (chunk) => {\n if (request.aborted || request.completed) {\n return\n }\n\n if (request.onResponseData(chunk) === false) {\n stream.pause()\n }\n })\n })\n\n stream.once('end', () => {\n stream.removeAllListeners('data')\n // If we received a response, this is a normal completion\n if (responseReceived) {\n if (!request.aborted && !request.completed) {\n request.onResponseEnd({})\n }\n\n client[kQueue][client[kRunningIdx]++] = null\n client[kResume]()\n } else {\n // Stream ended without receiving a response - this is an error\n // (e.g., server destroyed the stream before sending headers)\n abort(new InformationalError('HTTP/2: stream half-closed (remote)'))\n client[kQueue][client[kRunningIdx]++] = null\n client[kPendingIdx] = client[kRunningIdx]\n client[kResume]()\n }\n })\n\n stream.once('close', () => {\n stream.removeAllListeners('data')\n session[kOpenStreams] -= 1\n if (session[kOpenStreams] === 0) {\n session.unref()\n }\n })\n\n stream.once('error', function (err) {\n stream.removeAllListeners('data')\n abort(err)\n })\n\n stream.once('frameError', (type, code) => {\n stream.removeAllListeners('data')\n abort(new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`))\n })\n\n stream.on('aborted', () => {\n stream.removeAllListeners('data')\n })\n\n stream.on('timeout', () => {\n const err = new InformationalError(`HTTP/2: \"stream timeout after ${requestTimeout}\"`)\n stream.removeAllListeners('data')\n session[kOpenStreams] -= 1\n\n if (session[kOpenStreams] === 0) {\n session.unref()\n }\n\n abort(err)\n })\n\n stream.once('trailers', trailers => {\n if (request.aborted || request.completed) {\n return\n }\n\n request.onResponseEnd(trailers)\n })\n\n return true\n\n function writeBodyH2 () {\n if (!body || contentLength === 0) {\n writeBuffer(\n abort,\n stream,\n null,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else if (util.isBuffer(body)) {\n writeBuffer(\n abort,\n stream,\n body,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable(\n abort,\n stream,\n body.stream(),\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else {\n writeBlob(\n abort,\n stream,\n body,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n }\n } else if (util.isStream(body)) {\n writeStream(\n abort,\n client[kSocket],\n expectsPayload,\n stream,\n body,\n client,\n request,\n contentLength\n )\n } else if (util.isIterable(body)) {\n writeIterable(\n abort,\n stream,\n body,\n client,\n request,\n client[kSocket],\n contentLength,\n expectsPayload\n )\n } else {\n assert(false)\n }\n }\n}\n\nfunction writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n try {\n if (body != null && util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n h2stream.cork()\n h2stream.write(body)\n h2stream.uncork()\n h2stream.end()\n\n request.onBodySent(body)\n }\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n request.onRequestSent()\n client[kResume]()\n } catch (error) {\n abort(error)\n }\n}\n\nfunction writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n // For HTTP/2, is enough to pipe the stream\n const pipe = pipeline(\n body,\n h2stream,\n (err) => {\n if (err) {\n util.destroy(pipe, err)\n abort(err)\n } else {\n util.removeAllListeners(pipe)\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n client[kResume]()\n }\n }\n )\n\n util.addListener(pipe, 'data', onPipeData)\n\n function onPipeData (chunk) {\n request.onBodySent(chunk)\n }\n}\n\nasync function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n assert(contentLength === body.size, 'blob body must have content length')\n\n try {\n if (contentLength != null && contentLength !== body.size) {\n throw new RequestContentLengthMismatchError()\n }\n\n const buffer = Buffer.from(await body.arrayBuffer())\n\n h2stream.cork()\n h2stream.write(buffer)\n h2stream.uncork()\n h2stream.end()\n\n request.onBodySent(buffer)\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n client[kResume]()\n } catch (err) {\n abort(err)\n }\n}\n\nasync function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n let callback = null\n function onDrain () {\n if (callback) {\n const cb = callback\n callback = null\n cb()\n }\n }\n\n const waitForDrain = () => new Promise((resolve, reject) => {\n assert(callback === null)\n\n if (socket[kError]) {\n reject(socket[kError])\n } else {\n callback = resolve\n }\n })\n\n h2stream\n .on('close', onDrain)\n .on('drain', onDrain)\n\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n const res = h2stream.write(chunk)\n request.onBodySent(chunk)\n if (!res) {\n await waitForDrain()\n }\n }\n\n h2stream.end()\n\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n client[kResume]()\n } catch (err) {\n abort(err)\n } finally {\n h2stream\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n}\n\nmodule.exports = connectH2\n","'use strict'\n\nconst assert = require('node:assert')\nconst net = require('node:net')\nconst http = require('node:http')\nconst util = require('../core/util.js')\nconst { ClientStats } = require('../util/stats.js')\nconst { channels } = require('../core/diagnostics.js')\nconst Request = require('../core/request.js')\nconst DispatcherBase = require('./dispatcher-base')\nconst {\n InvalidArgumentError,\n InformationalError,\n ClientDestroyedError\n} = require('../core/errors.js')\nconst buildConnector = require('../core/connect.js')\nconst {\n kUrl,\n kServerName,\n kClient,\n kBusy,\n kConnect,\n kResuming,\n kRunning,\n kPending,\n kSize,\n kQueue,\n kConnected,\n kConnecting,\n kNeedDrain,\n kKeepAliveDefaultTimeout,\n kHostHeader,\n kPendingIdx,\n kRunningIdx,\n kError,\n kPipelining,\n kKeepAliveTimeoutValue,\n kMaxHeadersSize,\n kKeepAliveMaxTimeout,\n kKeepAliveTimeoutThreshold,\n kHeadersTimeout,\n kBodyTimeout,\n kStrictContentLength,\n kConnector,\n kMaxRequests,\n kCounter,\n kClose,\n kDestroy,\n kDispatch,\n kLocalAddress,\n kMaxResponseSize,\n kOnError,\n kHTTPContext,\n kMaxConcurrentStreams,\n kHTTP2InitialWindowSize,\n kHTTP2ConnectionWindowSize,\n kResume,\n kPingInterval\n} = require('../core/symbols.js')\nconst connectH1 = require('./client-h1.js')\nconst connectH2 = require('./client-h2.js')\n\nconst kClosedResolve = Symbol('kClosedResolve')\n\nconst getDefaultNodeMaxHeaderSize = http &&\n http.maxHeaderSize &&\n Number.isInteger(http.maxHeaderSize) &&\n http.maxHeaderSize > 0\n ? () => http.maxHeaderSize\n : () => { throw new InvalidArgumentError('http module not available or http.maxHeaderSize invalid') }\n\nconst noop = () => { }\n\nfunction getPipelining (client) {\n return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1\n}\n\n/**\n * @type {import('../../types/client.js').default}\n */\nclass Client extends DispatcherBase {\n /**\n *\n * @param {string|URL} url\n * @param {import('../../types/client.js').Client.Options} options\n */\n constructor (url, {\n maxHeaderSize,\n headersTimeout,\n socketTimeout,\n requestTimeout,\n connectTimeout,\n bodyTimeout,\n idleTimeout,\n keepAlive,\n keepAliveTimeout,\n maxKeepAliveTimeout,\n keepAliveMaxTimeout,\n keepAliveTimeoutThreshold,\n socketPath,\n pipelining,\n tls,\n strictContentLength,\n maxCachedSessions,\n connect,\n maxRequestsPerClient,\n localAddress,\n maxResponseSize,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n // h2\n maxConcurrentStreams,\n allowH2,\n useH2c,\n initialWindowSize,\n connectionWindowSize,\n pingInterval,\n webSocket\n } = {}) {\n if (keepAlive !== undefined) {\n throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')\n }\n\n if (socketTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (requestTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (idleTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead')\n }\n\n if (maxKeepAliveTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead')\n }\n\n if (maxHeaderSize != null) {\n if (!Number.isInteger(maxHeaderSize) || maxHeaderSize < 1) {\n throw new InvalidArgumentError('invalid maxHeaderSize')\n }\n } else {\n // If maxHeaderSize is not provided, use the default value from the http module\n // or if that is not available, throw an error.\n maxHeaderSize = getDefaultNodeMaxHeaderSize()\n }\n\n if (socketPath != null && typeof socketPath !== 'string') {\n throw new InvalidArgumentError('invalid socketPath')\n }\n\n if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {\n throw new InvalidArgumentError('invalid connectTimeout')\n }\n\n if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveTimeout')\n }\n\n if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveMaxTimeout')\n }\n\n if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) {\n throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold')\n }\n\n if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('headersTimeout must be a positive integer or zero')\n }\n\n if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {\n throw new InvalidArgumentError('maxRequestsPerClient must be a positive number')\n }\n\n if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) {\n throw new InvalidArgumentError('localAddress must be valid string IP address')\n }\n\n if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {\n throw new InvalidArgumentError('maxResponseSize must be a positive number')\n }\n\n if (\n autoSelectFamilyAttemptTimeout != null &&\n (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)\n ) {\n throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number')\n }\n\n // h2\n if (allowH2 != null && typeof allowH2 !== 'boolean') {\n throw new InvalidArgumentError('allowH2 must be a valid boolean value')\n }\n\n if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {\n throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0')\n }\n\n if (useH2c != null && typeof useH2c !== 'boolean') {\n throw new InvalidArgumentError('useH2c must be a valid boolean value')\n }\n\n if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {\n throw new InvalidArgumentError('initialWindowSize must be a positive integer, greater than 0')\n }\n\n if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {\n throw new InvalidArgumentError('connectionWindowSize must be a positive integer, greater than 0')\n }\n\n if (pingInterval != null && (typeof pingInterval !== 'number' || !Number.isInteger(pingInterval) || pingInterval < 0)) {\n throw new InvalidArgumentError('pingInterval must be a positive integer, greater or equal to 0')\n }\n\n super({ webSocket })\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n useH2c,\n socketPath,\n timeout: connectTimeout,\n ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n } else {\n const customConnect = connect\n connect = (opts, callback) => customConnect({\n ...opts,\n ...(socketPath != null ? { socketPath } : null),\n ...(allowH2 != null ? { allowH2 } : null)\n }, callback)\n }\n\n this[kUrl] = util.parseOrigin(url)\n this[kConnector] = connect\n this[kPipelining] = pipelining != null ? pipelining : 1\n this[kMaxHeadersSize] = maxHeaderSize\n this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout\n this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout\n this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold\n this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]\n this[kServerName] = null\n this[kLocalAddress] = localAddress != null ? localAddress : null\n this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\\r\\n`\n this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3\n this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3\n this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength\n this[kMaxRequests] = maxRequestsPerClient\n this[kClosedResolve] = null\n this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1\n this[kHTTPContext] = null\n // h2\n this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server\n // HTTP/2 window sizes are set to higher defaults than Node.js core for better performance:\n // - initialWindowSize: 262144 (256KB) vs Node.js default 65535 (64KB - 1)\n // Allows more data to be sent before requiring acknowledgment, improving throughput\n // especially on high-latency networks. This matches common production HTTP/2 servers.\n // - connectionWindowSize: 524288 (512KB) vs Node.js default (none set)\n // Provides better flow control for the entire connection across multiple streams.\n this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144\n this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288\n this[kPingInterval] = pingInterval != null ? pingInterval : 60e3 // Default ping interval for h2 - 1 minute\n\n // kQueue is built up of 3 sections separated by\n // the kRunningIdx and kPendingIdx indices.\n // | complete | running | pending |\n // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length\n // kRunningIdx points to the first running element.\n // kPendingIdx points to the first pending element.\n // This implements a fast queue with an amortized\n // time of O(1).\n\n this[kQueue] = []\n this[kRunningIdx] = 0\n this[kPendingIdx] = 0\n\n this[kResume] = (sync) => resume(this, sync)\n this[kOnError] = (err) => onError(this, err)\n }\n\n get pipelining () {\n return this[kPipelining]\n }\n\n set pipelining (value) {\n this[kPipelining] = value\n this[kResume](true)\n }\n\n get stats () {\n return new ClientStats(this)\n }\n\n get [kPending] () {\n return this[kQueue].length - this[kPendingIdx]\n }\n\n get [kRunning] () {\n return this[kPendingIdx] - this[kRunningIdx]\n }\n\n get [kSize] () {\n return this[kQueue].length - this[kRunningIdx]\n }\n\n get [kConnected] () {\n return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed\n }\n\n get [kBusy] () {\n return Boolean(\n this[kHTTPContext]?.busy(null) ||\n (this[kSize] >= (getPipelining(this) || 1)) ||\n this[kPending] > 0\n )\n }\n\n [kConnect] (cb) {\n connect(this)\n this.once('connect', cb)\n }\n\n [kDispatch] (opts, handler) {\n const request = new Request(this[kUrl].origin, opts, handler)\n\n this[kQueue].push(request)\n if (this[kResuming]) {\n // Do nothing.\n } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {\n // Wait a tick in case stream/iterator is ended in the same tick.\n this[kResuming] = 1\n queueMicrotask(() => resume(this))\n } else {\n this[kResume](true)\n }\n\n if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {\n this[kNeedDrain] = 2\n }\n\n return this[kNeedDrain] < 2\n }\n\n [kClose] () {\n // TODO: for H2 we need to gracefully flush the remaining enqueued\n // request and close each stream.\n return new Promise((resolve) => {\n if (this[kSize]) {\n this[kClosedResolve] = resolve\n } else {\n resolve(null)\n }\n })\n }\n\n [kDestroy] (err) {\n return new Promise((resolve) => {\n const requests = this[kQueue].splice(this[kPendingIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(this, request, err)\n }\n\n const callback = () => {\n if (this[kClosedResolve]) {\n // TODO (fix): Should we error here with ClientDestroyedError?\n this[kClosedResolve]()\n this[kClosedResolve] = null\n }\n resolve(null)\n }\n\n if (this[kHTTPContext]) {\n this[kHTTPContext].destroy(err, callback)\n this[kHTTPContext] = null\n } else {\n queueMicrotask(callback)\n }\n\n this[kResume]()\n })\n }\n}\n\nfunction onError (client, err) {\n if (\n client[kRunning] === 0 &&\n err.code !== 'UND_ERR_INFO' &&\n err.code !== 'UND_ERR_SOCKET'\n ) {\n // Error is not caused by running request and not a recoverable\n // socket error.\n\n assert(client[kPendingIdx] === client[kRunningIdx])\n\n const requests = client[kQueue].splice(client[kRunningIdx])\n\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n util.errorRequest(client, request, err)\n }\n assert(client[kSize] === 0)\n }\n}\n\n/**\n * @param {Client} client\n * @returns {void}\n */\nfunction connect (client) {\n assert(!client[kConnecting])\n assert(!client[kHTTPContext])\n\n let { host, hostname, protocol, port } = client[kUrl]\n\n // Resolve ipv6\n if (hostname[0] === '[') {\n const idx = hostname.indexOf(']')\n\n assert(idx !== -1)\n const ip = hostname.substring(1, idx)\n\n assert(net.isIPv6(ip))\n hostname = ip\n }\n\n client[kConnecting] = true\n\n if (channels.beforeConnect.hasSubscribers) {\n channels.beforeConnect.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n version: client[kHTTPContext]?.version,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector]\n })\n }\n\n try {\n client[kConnector]({\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n }, (err, socket) => {\n if (err) {\n handleConnectError(client, err, { host, hostname, protocol, port })\n client[kResume]()\n return\n }\n\n if (client.destroyed) {\n util.destroy(socket.on('error', noop), new ClientDestroyedError())\n client[kResume]()\n return\n }\n\n assert(socket)\n\n try {\n client[kHTTPContext] = socket.alpnProtocol === 'h2'\n ? connectH2(client, socket)\n : connectH1(client, socket)\n } catch (err) {\n socket.destroy().on('error', noop)\n handleConnectError(client, err, { host, hostname, protocol, port })\n client[kResume]()\n return\n }\n\n client[kConnecting] = false\n\n socket[kCounter] = 0\n socket[kMaxRequests] = client[kMaxRequests]\n socket[kClient] = client\n socket[kError] = null\n\n if (channels.connected.hasSubscribers) {\n channels.connected.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n version: client[kHTTPContext]?.version,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n socket\n })\n }\n\n client.emit('connect', client[kUrl], [client])\n client[kResume]()\n })\n } catch (err) {\n handleConnectError(client, err, { host, hostname, protocol, port })\n client[kResume]()\n }\n}\n\nfunction handleConnectError (client, err, { host, hostname, protocol, port }) {\n if (client.destroyed) {\n return\n }\n\n client[kConnecting] = false\n\n if (channels.connectError.hasSubscribers) {\n channels.connectError.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n version: client[kHTTPContext]?.version,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n error: err\n })\n }\n\n if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n assert(client[kRunning] === 0)\n while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {\n const request = client[kQueue][client[kPendingIdx]++]\n util.errorRequest(client, request, err)\n }\n } else {\n onError(client, err)\n }\n\n client.emit('connectionError', client[kUrl], [client], err)\n}\n\nfunction emitDrain (client) {\n client[kNeedDrain] = 0\n client.emit('drain', client[kUrl], [client])\n}\n\nfunction resume (client, sync) {\n if (client[kResuming] === 2) {\n return\n }\n\n client[kResuming] = 2\n\n _resume(client, sync)\n client[kResuming] = 0\n\n if (client[kRunningIdx] > 256) {\n client[kQueue].splice(0, client[kRunningIdx])\n client[kPendingIdx] -= client[kRunningIdx]\n client[kRunningIdx] = 0\n }\n}\n\nfunction _resume (client, sync) {\n while (true) {\n if (client.destroyed) {\n assert(client[kPending] === 0)\n return\n }\n\n if (client[kClosedResolve] && !client[kSize]) {\n client[kClosedResolve]()\n client[kClosedResolve] = null\n return\n }\n\n if (client[kHTTPContext]) {\n client[kHTTPContext].resume()\n }\n\n if (client[kBusy]) {\n client[kNeedDrain] = 2\n } else if (client[kNeedDrain] === 2) {\n if (sync) {\n client[kNeedDrain] = 1\n queueMicrotask(() => emitDrain(client))\n } else {\n emitDrain(client)\n }\n continue\n }\n\n if (client[kPending] === 0) {\n return\n }\n\n if (client[kRunning] >= (getPipelining(client) || 1)) {\n return\n }\n\n const request = client[kQueue][client[kPendingIdx]]\n\n if (request === null) {\n return\n }\n\n if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {\n if (client[kRunning] > 0) {\n return\n }\n\n client[kServerName] = request.servername\n client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => {\n client[kHTTPContext] = null\n resume(client)\n })\n }\n\n if (client[kConnecting]) {\n return\n }\n\n if (!client[kHTTPContext]) {\n connect(client)\n return\n }\n\n if (client[kHTTPContext].destroyed) {\n return\n }\n\n if (client[kHTTPContext].busy(request)) {\n return\n }\n\n if (!request.aborted && client[kHTTPContext].write(request)) {\n client[kPendingIdx]++\n } else {\n client[kQueue].splice(client[kPendingIdx], 1)\n }\n }\n}\n\nmodule.exports = Client\n","'use strict'\n\n// Extracted from node/lib/internal/fixed_queue.js\n\n// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two.\nconst kSize = 2048\nconst kMask = kSize - 1\n\n// The FixedQueue is implemented as a singly-linked list of fixed-size\n// circular buffers. It looks something like this:\n//\n// head tail\n// | |\n// v v\n// +-----------+ <-----\\ +-----------+ <------\\ +-----------+\n// | [null] | \\----- | next | \\------- | next |\n// +-----------+ +-----------+ +-----------+\n// | item | <-- bottom | item | <-- bottom | undefined |\n// | item | | item | | undefined |\n// | item | | item | | undefined |\n// | item | | item | | undefined |\n// | item | | item | bottom --> | item |\n// | item | | item | | item |\n// | ... | | ... | | ... |\n// | item | | item | | item |\n// | item | | item | | item |\n// | undefined | <-- top | item | | item |\n// | undefined | | item | | item |\n// | undefined | | undefined | <-- top top --> | undefined |\n// +-----------+ +-----------+ +-----------+\n//\n// Or, if there is only one circular buffer, it looks something\n// like either of these:\n//\n// head tail head tail\n// | | | |\n// v v v v\n// +-----------+ +-----------+\n// | [null] | | [null] |\n// +-----------+ +-----------+\n// | undefined | | item |\n// | undefined | | item |\n// | item | <-- bottom top --> | undefined |\n// | item | | undefined |\n// | undefined | <-- top bottom --> | item |\n// | undefined | | item |\n// +-----------+ +-----------+\n//\n// Adding a value means moving `top` forward by one, removing means\n// moving `bottom` forward by one. After reaching the end, the queue\n// wraps around.\n//\n// When `top === bottom` the current queue is empty and when\n// `top + 1 === bottom` it's full. This wastes a single space of storage\n// but allows much quicker checks.\n\n/**\n * @type {FixedCircularBuffer}\n * @template T\n */\nclass FixedCircularBuffer {\n /** @type {number} */\n bottom = 0\n /** @type {number} */\n top = 0\n /** @type {Array} */\n list = new Array(kSize).fill(undefined)\n /** @type {T|null} */\n next = null\n\n /** @returns {boolean} */\n isEmpty () {\n return this.top === this.bottom\n }\n\n /** @returns {boolean} */\n isFull () {\n return ((this.top + 1) & kMask) === this.bottom\n }\n\n /**\n * @param {T} data\n * @returns {void}\n */\n push (data) {\n this.list[this.top] = data\n this.top = (this.top + 1) & kMask\n }\n\n /** @returns {T|null} */\n shift () {\n const nextItem = this.list[this.bottom]\n if (nextItem === undefined) { return null }\n this.list[this.bottom] = undefined\n this.bottom = (this.bottom + 1) & kMask\n return nextItem\n }\n}\n\n/**\n * @template T\n */\nmodule.exports = class FixedQueue {\n constructor () {\n /** @type {FixedCircularBuffer} */\n this.head = this.tail = new FixedCircularBuffer()\n }\n\n /** @returns {boolean} */\n isEmpty () {\n return this.head.isEmpty()\n }\n\n /** @param {T} data */\n push (data) {\n if (this.head.isFull()) {\n // Head is full: Creates a new queue, sets the old queue's `.next` to it,\n // and sets it as the new main queue.\n this.head = this.head.next = new FixedCircularBuffer()\n }\n this.head.push(data)\n }\n\n /** @returns {T|null} */\n shift () {\n const tail = this.tail\n const next = tail.shift()\n if (tail.isEmpty() && tail.next !== null) {\n // If there is another queue, it forms the new tail.\n this.tail = tail.next\n tail.next = null\n }\n return next\n }\n}\n","'use strict'\n\nconst { PoolStats } = require('../util/stats.js')\nconst DispatcherBase = require('./dispatcher-base')\nconst FixedQueue = require('./fixed-queue')\nconst { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('../core/symbols')\n\nconst kClients = Symbol('clients')\nconst kNeedDrain = Symbol('needDrain')\nconst kQueue = Symbol('queue')\nconst kClosedResolve = Symbol('closed resolve')\nconst kOnDrain = Symbol('onDrain')\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kGetDispatcher = Symbol('get dispatcher')\nconst kAddClient = Symbol('add client')\nconst kRemoveClient = Symbol('remove client')\n\nclass PoolBase extends DispatcherBase {\n [kQueue] = new FixedQueue();\n\n [kQueued] = 0;\n\n [kClients] = [];\n\n [kNeedDrain] = false;\n\n [kOnDrain] (client, origin, targets) {\n const queue = this[kQueue]\n\n let needDrain = false\n\n while (!needDrain) {\n const item = queue.shift()\n if (!item) {\n break\n }\n this[kQueued]--\n needDrain = !client.dispatch(item.opts, item.handler)\n }\n\n client[kNeedDrain] = needDrain\n\n if (!needDrain && this[kNeedDrain]) {\n this[kNeedDrain] = false\n this.emit('drain', origin, [this, ...targets])\n }\n\n if (this[kClosedResolve] && queue.isEmpty()) {\n const closeAll = []\n for (let i = 0; i < this[kClients].length; i++) {\n const client = this[kClients][i]\n if (!client.destroyed) {\n closeAll.push(client.close())\n }\n }\n return Promise.all(closeAll)\n .then(this[kClosedResolve])\n }\n }\n\n [kOnConnect] = (origin, targets) => {\n this.emit('connect', origin, [this, ...targets])\n };\n\n [kOnDisconnect] = (origin, targets, err) => {\n this.emit('disconnect', origin, [this, ...targets], err)\n };\n\n [kOnConnectionError] = (origin, targets, err) => {\n this.emit('connectionError', origin, [this, ...targets], err)\n }\n\n get [kBusy] () {\n return this[kNeedDrain]\n }\n\n get [kConnected] () {\n let ret = 0\n for (const { [kConnected]: connected } of this[kClients]) {\n ret += connected\n }\n return ret\n }\n\n get [kFree] () {\n let ret = 0\n for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) {\n ret += connected && !needDrain\n }\n return ret\n }\n\n get [kPending] () {\n let ret = this[kQueued]\n for (const { [kPending]: pending } of this[kClients]) {\n ret += pending\n }\n return ret\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { [kRunning]: running } of this[kClients]) {\n ret += running\n }\n return ret\n }\n\n get [kSize] () {\n let ret = this[kQueued]\n for (const { [kSize]: size } of this[kClients]) {\n ret += size\n }\n return ret\n }\n\n get stats () {\n return new PoolStats(this)\n }\n\n [kClose] () {\n if (this[kQueue].isEmpty()) {\n const closeAll = []\n for (let i = 0; i < this[kClients].length; i++) {\n const client = this[kClients][i]\n if (!client.destroyed) {\n closeAll.push(client.close())\n }\n }\n return Promise.all(closeAll)\n } else {\n return new Promise((resolve) => {\n this[kClosedResolve] = resolve\n })\n }\n }\n\n [kDestroy] (err) {\n while (true) {\n const item = this[kQueue].shift()\n if (!item) {\n break\n }\n item.handler.onResponseError(null, err)\n }\n\n const destroyAll = new Array(this[kClients].length)\n for (let i = 0; i < this[kClients].length; i++) {\n destroyAll[i] = this[kClients][i].destroy(err)\n }\n return Promise.all(destroyAll)\n }\n\n [kDispatch] (opts, handler) {\n const dispatcher = this[kGetDispatcher]()\n\n if (!dispatcher) {\n this[kNeedDrain] = true\n this[kQueue].push({ opts, handler })\n this[kQueued]++\n } else if (!dispatcher.dispatch(opts, handler)) {\n dispatcher[kNeedDrain] = true\n this[kNeedDrain] = !this[kGetDispatcher]()\n }\n\n return !this[kNeedDrain]\n }\n\n [kAddClient] (client) {\n client\n .on('drain', this[kOnDrain].bind(this, client))\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].push(client)\n\n if (this[kNeedDrain]) {\n queueMicrotask(() => {\n if (this[kNeedDrain]) {\n this[kOnDrain](client, client[kUrl], [client, this])\n }\n })\n }\n\n return this\n }\n\n [kRemoveClient] (client) {\n client.close(() => {\n const idx = this[kClients].indexOf(client)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n })\n\n this[kNeedDrain] = this[kClients].some(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n }\n}\n\nmodule.exports = {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n}\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher,\n kRemoveClient\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { kUrl } = require('../core/symbols')\nconst buildConnector = require('../core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass Pool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n clientTtl,\n ...options\n } = {}) {\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n super(options)\n\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }\n this[kFactory] = factory\n\n this.on('connect', (origin, targets) => {\n if (clientTtl != null && clientTtl > 0) {\n for (const target of targets) {\n Object.assign(target, { ttl: Date.now() })\n }\n }\n })\n\n this.on('connectionError', (origin, targets, error) => {\n // If a connection error occurs, we remove the client from the pool,\n // and emit a connectionError event. They will not be re-used.\n // Fixes https://github.com/nodejs/undici/issues/3895\n for (const target of targets) {\n // Do not use kRemoveClient here, as it will close the client,\n // but the client cannot be closed in this state.\n const idx = this[kClients].indexOf(target)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n }\n })\n }\n\n [kGetDispatcher] () {\n const clientTtlOption = this[kOptions].clientTtl\n for (const client of this[kClients]) {\n // check ttl of client and if it's stale, remove it from the pool\n if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {\n this[kRemoveClient](client)\n } else if (!client[kNeedDrain]) {\n return client\n }\n }\n\n if (!this[kConnections] || this[kClients].length < this[kConnections]) {\n const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n return dispatcher\n }\n }\n}\n\nmodule.exports = Pool\n","'use strict'\n\nconst {\n BalancedPoolMissingUpstreamError,\n InvalidArgumentError\n} = require('../core/errors')\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Pool = require('./pool')\nconst { kUrl } = require('../core/symbols')\nconst util = require('../core/util')\nconst kFactory = Symbol('factory')\n\nconst kOptions = Symbol('options')\nconst kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor')\nconst kCurrentWeight = Symbol('kCurrentWeight')\nconst kIndex = Symbol('kIndex')\nconst kWeight = Symbol('kWeight')\nconst kMaxWeightPerServer = Symbol('kMaxWeightPerServer')\nconst kErrorPenalty = Symbol('kErrorPenalty')\n\n/**\n * Calculate the greatest common divisor of two numbers by\n * using the Euclidean algorithm.\n *\n * @param {number} a\n * @param {number} b\n * @returns {number}\n */\nfunction getGreatestCommonDivisor (a, b) {\n if (a === 0) return b\n\n while (b !== 0) {\n const t = b\n b = a % b\n a = t\n }\n return a\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass BalancedPool extends PoolBase {\n constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) {\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n super()\n\n this[kOptions] = { ...util.deepClone(opts) }\n this[kIndex] = -1\n this[kCurrentWeight] = 0\n\n this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100\n this[kErrorPenalty] = this[kOptions].errorPenalty || 15\n\n if (!Array.isArray(upstreams)) {\n upstreams = [upstreams]\n }\n\n this[kFactory] = factory\n\n for (const upstream of upstreams) {\n this.addUpstream(upstream)\n }\n this._updateBalancedPoolStats()\n }\n\n addUpstream (upstream) {\n const upstreamOrigin = util.parseOrigin(upstream).origin\n\n if (this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))) {\n return this\n }\n const pool = this[kFactory](upstreamOrigin, this[kOptions])\n\n this[kAddClient](pool)\n pool.on('connect', () => {\n pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty])\n })\n\n pool.on('connectionError', () => {\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n })\n\n pool.on('disconnect', (...args) => {\n const err = args[2]\n if (err && err.code === 'UND_ERR_SOCKET') {\n // decrease the weight of the pool.\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n }\n })\n\n for (const client of this[kClients]) {\n client[kWeight] = this[kMaxWeightPerServer]\n }\n\n this._updateBalancedPoolStats()\n\n return this\n }\n\n _updateBalancedPoolStats () {\n let result = 0\n for (let i = 0; i < this[kClients].length; i++) {\n result = getGreatestCommonDivisor(this[kClients][i][kWeight], result)\n }\n\n this[kGreatestCommonDivisor] = result\n }\n\n removeUpstream (upstream) {\n const upstreamOrigin = util.parseOrigin(upstream).origin\n\n const pool = this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))\n\n if (pool) {\n this[kRemoveClient](pool)\n }\n\n return this\n }\n\n getUpstream (upstream) {\n const upstreamOrigin = util.parseOrigin(upstream).origin\n\n return this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))\n }\n\n get upstreams () {\n return this[kClients]\n .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true)\n .map((p) => p[kUrl].origin)\n }\n\n [kGetDispatcher] () {\n // We validate that pools is greater than 0,\n // otherwise we would have to wait until an upstream\n // is added, which might never happen.\n if (this[kClients].length === 0) {\n throw new BalancedPoolMissingUpstreamError()\n }\n\n const dispatcher = this[kClients].find(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n\n if (!dispatcher) {\n return\n }\n\n const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true)\n\n if (allClientsBusy) {\n return\n }\n\n let counter = 0\n\n let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain])\n\n while (counter++ < this[kClients].length) {\n this[kIndex] = (this[kIndex] + 1) % this[kClients].length\n const pool = this[kClients][this[kIndex]]\n\n // find pool index with the largest weight\n if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) {\n maxWeightIndex = this[kIndex]\n }\n\n // decrease the current weight every `this[kClients].length`.\n if (this[kIndex] === 0) {\n // Set the current weight to the next lower weight.\n this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]\n\n if (this[kCurrentWeight] <= 0) {\n this[kCurrentWeight] = this[kMaxWeightPerServer]\n }\n }\n if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) {\n return pool\n }\n }\n\n this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]\n this[kIndex] = maxWeightIndex\n return this[kClients][maxWeightIndex]\n }\n}\n\nmodule.exports = BalancedPool\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher,\n kRemoveClient\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { kUrl } = require('../core/symbols')\nconst buildConnector = require('../core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\nconst kIndex = Symbol('index')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass RoundRobinPool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n clientTtl,\n ...options\n } = {}) {\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n super()\n\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }\n this[kFactory] = factory\n this[kIndex] = -1\n\n this.on('connect', (origin, targets) => {\n if (clientTtl != null && clientTtl > 0) {\n for (const target of targets) {\n Object.assign(target, { ttl: Date.now() })\n }\n }\n })\n\n this.on('connectionError', (origin, targets, error) => {\n for (const target of targets) {\n const idx = this[kClients].indexOf(target)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n }\n })\n }\n\n [kGetDispatcher] () {\n const clientTtlOption = this[kOptions].clientTtl\n const clientsLength = this[kClients].length\n\n // If we have no clients yet, create one\n if (clientsLength === 0) {\n const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n return dispatcher\n }\n\n // Round-robin through existing clients\n let checked = 0\n while (checked < clientsLength) {\n this[kIndex] = (this[kIndex] + 1) % clientsLength\n const client = this[kClients][this[kIndex]]\n\n // Check if client is stale (TTL expired)\n if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {\n this[kRemoveClient](client)\n checked++\n continue\n }\n\n // Return client if it's not draining\n if (!client[kNeedDrain]) {\n return client\n }\n\n checked++\n }\n\n // All clients are busy, create a new one if we haven't reached the limit\n if (!this[kConnections] || clientsLength < this[kConnections]) {\n const dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n return dispatcher\n }\n }\n}\n\nmodule.exports = RoundRobinPool\n","'use strict'\n\nconst { InvalidArgumentError, MaxOriginsReachedError } = require('../core/errors')\nconst { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = require('../core/symbols')\nconst DispatcherBase = require('./dispatcher-base')\nconst Pool = require('./pool')\nconst Client = require('./client')\nconst util = require('../core/util')\n\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kOnDrain = Symbol('onDrain')\nconst kFactory = Symbol('factory')\nconst kOptions = Symbol('options')\nconst kOrigins = Symbol('origins')\n\nfunction defaultFactory (origin, opts) {\n return opts && opts.connections === 1\n ? new Client(origin, opts)\n : new Pool(origin, opts)\n}\n\nclass Agent extends DispatcherBase {\n constructor ({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) {\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof maxOrigins !== 'number' || Number.isNaN(maxOrigins) || maxOrigins <= 0) {\n throw new InvalidArgumentError('maxOrigins must be a number greater than 0')\n }\n\n super(options)\n\n if (connect && typeof connect !== 'function') {\n connect = { ...connect }\n }\n\n this[kOptions] = { ...util.deepClone(options), maxOrigins, connect }\n this[kFactory] = factory\n this[kClients] = new Map()\n this[kOrigins] = new Set()\n\n this[kOnDrain] = (origin, targets) => {\n this.emit('drain', origin, [this, ...targets])\n }\n\n this[kOnConnect] = (origin, targets) => {\n this.emit('connect', origin, [this, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n this.emit('disconnect', origin, [this, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n this.emit('connectionError', origin, [this, ...targets], err)\n }\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { dispatcher } of this[kClients].values()) {\n ret += dispatcher[kRunning]\n }\n return ret\n }\n\n [kDispatch] (opts, handler) {\n let origin\n if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) {\n origin = String(opts.origin)\n } else {\n throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')\n }\n\n const allowH2 = opts.allowH2 ?? this[kOptions].allowH2\n const key = allowH2 === false ? `${origin}#http1-only` : origin\n\n if (this[kOrigins].size >= this[kOptions].maxOrigins && !this[kOrigins].has(origin)) {\n throw new MaxOriginsReachedError()\n }\n\n const result = this[kClients].get(key)\n let dispatcher = result && result.dispatcher\n if (!dispatcher) {\n const closeClientIfUnused = (connected) => {\n const result = this[kClients].get(key)\n if (result) {\n if (connected) result.count -= 1\n if (result.count <= 0) {\n this[kClients].delete(key)\n if (!result.dispatcher.destroyed) {\n result.dispatcher.close()\n }\n }\n\n let hasOrigin = false\n for (const entry of this[kClients].values()) {\n if (entry.origin === origin) {\n hasOrigin = true\n break\n }\n }\n\n if (!hasOrigin) {\n this[kOrigins].delete(origin)\n }\n }\n }\n dispatcher = this[kFactory](opts.origin, allowH2 === false\n ? { ...this[kOptions], allowH2: false }\n : this[kOptions])\n .on('drain', this[kOnDrain])\n .on('connect', (origin, targets) => {\n const result = this[kClients].get(key)\n if (result) {\n result.count += 1\n }\n this[kOnConnect](origin, targets)\n })\n .on('disconnect', (origin, targets, err) => {\n closeClientIfUnused(true)\n this[kOnDisconnect](origin, targets, err)\n })\n .on('connectionError', (origin, targets, err) => {\n closeClientIfUnused(false)\n this[kOnConnectionError](origin, targets, err)\n })\n\n this[kClients].set(key, { count: 0, dispatcher, origin })\n this[kOrigins].add(origin)\n }\n\n return dispatcher.dispatch(opts, handler)\n }\n\n [kClose] () {\n const closePromises = []\n for (const { dispatcher } of this[kClients].values()) {\n closePromises.push(dispatcher.close())\n }\n this[kClients].clear()\n\n return Promise.all(closePromises)\n }\n\n [kDestroy] (err) {\n const destroyPromises = []\n for (const { dispatcher } of this[kClients].values()) {\n destroyPromises.push(dispatcher.destroy(err))\n }\n this[kClients].clear()\n\n return Promise.all(destroyPromises)\n }\n\n get stats () {\n const allClientStats = {}\n for (const { dispatcher } of this[kClients].values()) {\n if (dispatcher.stats) {\n allClientStats[dispatcher[kUrl].origin] = dispatcher.stats\n }\n }\n return allClientStats\n }\n}\n\nmodule.exports = Agent\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { toRawHeaders } = require('../core/util')\n\nclass LegacyHandlerWrapper {\n #handler\n\n constructor (handler) {\n this.#handler = handler\n }\n\n onRequestStart (controller, context) {\n this.#handler.onConnect?.((reason) => controller.abort(reason), context)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {})\n this.#handler.onUpgrade?.(statusCode, rawHeaders, socket)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {})\n\n if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {\n controller.pause()\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.#handler.onData?.(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (controller, trailers) {\n const rawTrailers = controller?.rawTrailers ?? toRawHeaders(trailers ?? {})\n this.#handler.onComplete?.(rawTrailers)\n }\n\n onResponseError (_controller, err) {\n if (!this.#handler.onError) {\n throw err\n }\n\n this.#handler.onError(err)\n }\n\n onBodySent (chunk) {\n this.#handler.onBodySent?.(chunk)\n }\n\n onRequestSent () {\n this.#handler.onRequestSent?.()\n }\n\n onResponseStarted () {\n this.#handler.onResponseStarted?.()\n }\n}\n\nclass Dispatcher1Wrapper extends Dispatcher {\n #dispatcher\n\n constructor (dispatcher) {\n super()\n\n if (!dispatcher || typeof dispatcher.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument dispatcher must implement dispatch')\n }\n\n this.#dispatcher = dispatcher\n }\n\n static wrapHandler (handler) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n if (typeof handler.onRequestStart === 'function') {\n return handler\n }\n\n return new LegacyHandlerWrapper(handler)\n }\n\n dispatch (opts, handler) {\n // Legacy (v1) consumers do not support HTTP/2, so force HTTP/1.1.\n // See https://github.com/nodejs/undici/issues/4989\n if (opts.allowH2 !== false) {\n opts = { ...opts, allowH2: false }\n }\n\n return this.#dispatcher.dispatch(opts, Dispatcher1Wrapper.wrapHandler(handler))\n }\n\n close (...args) {\n return this.#dispatcher.close(...args)\n }\n\n destroy (...args) {\n return this.#dispatcher.destroy(...args)\n }\n}\n\nmodule.exports = Dispatcher1Wrapper\n","'use strict'\n\nconst { Buffer } = require('node:buffer')\nconst net = require('node:net')\nconst { InvalidArgumentError } = require('./errors')\n\n/**\n * Parse an address and determine its type\n * @param {string} address - The address to parse\n * @returns {{type: number, buffer: Buffer}} Address type and buffer\n */\nfunction parseAddress (address) {\n // Check if it's an IPv4 address\n if (net.isIPv4(address)) {\n const parts = address.split('.').map(Number)\n return {\n type: 0x01, // IPv4\n buffer: Buffer.from(parts)\n }\n }\n\n // Check if it's an IPv6 address\n if (net.isIPv6(address)) {\n return {\n type: 0x04, // IPv6\n buffer: parseIPv6(address)\n }\n }\n\n // Otherwise, treat as domain name\n const domainBuffer = Buffer.from(address, 'utf8')\n if (domainBuffer.length > 255) {\n throw new InvalidArgumentError('Domain name too long (max 255 bytes)')\n }\n\n return {\n type: 0x03, // Domain\n buffer: Buffer.concat([Buffer.from([domainBuffer.length]), domainBuffer])\n }\n}\n\n/**\n * Parse IPv6 address to buffer\n * @param {string} address - IPv6 address string\n * @returns {Buffer} 16-byte buffer\n */\nfunction parseIPv6 (address) {\n const buffer = Buffer.alloc(16)\n const parts = address.split(':')\n let partIndex = 0\n let bufferIndex = 0\n\n // Handle compressed notation (::)\n const doubleColonIndex = address.indexOf('::')\n if (doubleColonIndex !== -1) {\n // Count non-empty parts\n const nonEmptyParts = parts.filter(p => p.length > 0).length\n const skipParts = 8 - nonEmptyParts\n\n for (let i = 0; i < parts.length; i++) {\n if (parts[i] === '' && i === doubleColonIndex / 3) {\n // Skip empty parts for ::\n bufferIndex += skipParts * 2\n } else if (parts[i] !== '') {\n const value = parseInt(parts[i], 16)\n buffer.writeUInt16BE(value, bufferIndex)\n bufferIndex += 2\n }\n }\n } else {\n // No compression, parse normally\n for (const part of parts) {\n if (part === '') continue\n const value = parseInt(part, 16)\n buffer.writeUInt16BE(value, partIndex * 2)\n partIndex++\n }\n }\n\n return buffer\n}\n\n/**\n * Build a SOCKS5 address buffer\n * @param {number} type - Address type (1=IPv4, 3=Domain, 4=IPv6)\n * @param {Buffer} addressBuffer - The address data\n * @param {number} port - Port number\n * @returns {Buffer} Complete address buffer including type, address, and port\n */\nfunction buildAddressBuffer (type, addressBuffer, port) {\n const portBuffer = Buffer.allocUnsafe(2)\n portBuffer.writeUInt16BE(port, 0)\n\n return Buffer.concat([\n Buffer.from([type]),\n addressBuffer,\n portBuffer\n ])\n}\n\n/**\n * Parse address from SOCKS5 response\n * @param {Buffer} buffer - Buffer containing the address\n * @param {number} offset - Starting offset in buffer\n * @returns {{address: string, port: number, bytesRead: number}}\n */\nfunction parseResponseAddress (buffer, offset = 0) {\n if (buffer.length < offset + 1) {\n throw new InvalidArgumentError('Buffer too small to contain address type')\n }\n\n const addressType = buffer[offset]\n let address\n let currentOffset = offset + 1\n\n switch (addressType) {\n case 0x01: { // IPv4\n if (buffer.length < currentOffset + 6) {\n throw new InvalidArgumentError('Buffer too small for IPv4 address')\n }\n address = Array.from(buffer.subarray(currentOffset, currentOffset + 4)).join('.')\n currentOffset += 4\n break\n }\n\n case 0x03: { // Domain\n if (buffer.length < currentOffset + 1) {\n throw new InvalidArgumentError('Buffer too small for domain length')\n }\n const domainLength = buffer[currentOffset]\n currentOffset += 1\n\n if (buffer.length < currentOffset + domainLength + 2) {\n throw new InvalidArgumentError('Buffer too small for domain address')\n }\n address = buffer.subarray(currentOffset, currentOffset + domainLength).toString('utf8')\n currentOffset += domainLength\n break\n }\n\n case 0x04: { // IPv6\n if (buffer.length < currentOffset + 18) {\n throw new InvalidArgumentError('Buffer too small for IPv6 address')\n }\n // Convert buffer to IPv6 string\n const parts = []\n for (let i = 0; i < 8; i++) {\n const value = buffer.readUInt16BE(currentOffset + i * 2)\n parts.push(value.toString(16))\n }\n address = parts.join(':')\n currentOffset += 16\n break\n }\n\n default:\n throw new InvalidArgumentError(`Invalid address type: ${addressType}`)\n }\n\n // Parse port\n if (buffer.length < currentOffset + 2) {\n throw new InvalidArgumentError('Buffer too small for port')\n }\n const port = buffer.readUInt16BE(currentOffset)\n currentOffset += 2\n\n return {\n address,\n port,\n bytesRead: currentOffset - offset\n }\n}\n\n/**\n * Create error for SOCKS5 reply code\n * @param {number} replyCode - SOCKS5 reply code\n * @returns {Error} Appropriate error object\n */\nfunction createReplyError (replyCode) {\n const messages = {\n 0x01: 'General SOCKS server failure',\n 0x02: 'Connection not allowed by ruleset',\n 0x03: 'Network unreachable',\n 0x04: 'Host unreachable',\n 0x05: 'Connection refused',\n 0x06: 'TTL expired',\n 0x07: 'Command not supported',\n 0x08: 'Address type not supported'\n }\n\n const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`\n const error = new Error(message)\n error.code = `SOCKS5_${replyCode}`\n return error\n}\n\nmodule.exports = {\n parseAddress,\n parseIPv6,\n buildAddressBuffer,\n parseResponseAddress,\n createReplyError\n}\n","'use strict'\n\nconst { EventEmitter } = require('node:events')\nconst { Buffer } = require('node:buffer')\nconst { InvalidArgumentError, Socks5ProxyError } = require('./errors')\nconst { debuglog } = require('node:util')\nconst { parseAddress } = require('./socks5-utils')\n\nconst debug = debuglog('undici:socks5')\n\n// SOCKS5 constants\nconst SOCKS_VERSION = 0x05\n\n// Authentication methods\nconst AUTH_METHODS = {\n NO_AUTH: 0x00,\n GSSAPI: 0x01,\n USERNAME_PASSWORD: 0x02,\n NO_ACCEPTABLE: 0xFF\n}\n\n// SOCKS5 commands\nconst COMMANDS = {\n CONNECT: 0x01,\n BIND: 0x02,\n UDP_ASSOCIATE: 0x03\n}\n\n// Address types\nconst ADDRESS_TYPES = {\n IPV4: 0x01,\n DOMAIN: 0x03,\n IPV6: 0x04\n}\n\n// Reply codes\nconst REPLY_CODES = {\n SUCCEEDED: 0x00,\n GENERAL_FAILURE: 0x01,\n CONNECTION_NOT_ALLOWED: 0x02,\n NETWORK_UNREACHABLE: 0x03,\n HOST_UNREACHABLE: 0x04,\n CONNECTION_REFUSED: 0x05,\n TTL_EXPIRED: 0x06,\n COMMAND_NOT_SUPPORTED: 0x07,\n ADDRESS_TYPE_NOT_SUPPORTED: 0x08\n}\n\n// State machine states\nconst STATES = {\n INITIAL: 'initial',\n HANDSHAKING: 'handshaking',\n AUTHENTICATING: 'authenticating',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n ERROR: 'error',\n CLOSED: 'closed'\n}\n\n/**\n * SOCKS5 client implementation\n * Handles SOCKS5 protocol negotiation and connection establishment\n */\nclass Socks5Client extends EventEmitter {\n constructor (socket, options = {}) {\n super()\n\n if (!socket) {\n throw new InvalidArgumentError('socket is required')\n }\n\n this.socket = socket\n this.options = options\n this.state = STATES.INITIAL\n this.buffer = Buffer.alloc(0)\n\n // Authentication settings\n this.authMethods = []\n if (options.username && options.password) {\n this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD)\n }\n this.authMethods.push(AUTH_METHODS.NO_AUTH)\n\n // Socket event handlers\n this.socket.on('data', this.onData.bind(this))\n this.socket.on('error', this.onError.bind(this))\n this.socket.on('close', this.onClose.bind(this))\n }\n\n /**\n * Handle incoming data from the socket\n */\n onData (data) {\n debug('received data', data.length, 'bytes in state', this.state)\n this.buffer = Buffer.concat([this.buffer, data])\n\n try {\n switch (this.state) {\n case STATES.HANDSHAKING:\n this.handleHandshakeResponse()\n break\n case STATES.AUTHENTICATING:\n this.handleAuthResponse()\n break\n case STATES.CONNECTING:\n this.handleConnectResponse()\n break\n }\n } catch (err) {\n this.onError(err)\n }\n }\n\n /**\n * Handle socket errors\n */\n onError (err) {\n debug('socket error', err)\n this.state = STATES.ERROR\n this.emit('error', err)\n this.destroy()\n }\n\n /**\n * Handle socket close\n */\n onClose () {\n debug('socket closed')\n this.state = STATES.CLOSED\n this.emit('close')\n }\n\n /**\n * Destroy the client and underlying socket\n */\n destroy () {\n if (this.socket && !this.socket.destroyed) {\n this.socket.destroy()\n }\n }\n\n /**\n * Start the SOCKS5 handshake\n */\n handshake () {\n if (this.state !== STATES.INITIAL) {\n throw new InvalidArgumentError('Handshake already started')\n }\n\n debug('starting handshake with', this.authMethods.length, 'auth methods')\n this.state = STATES.HANDSHAKING\n\n // Build handshake request\n // +----+----------+----------+\n // |VER | NMETHODS | METHODS |\n // +----+----------+----------+\n // | 1 | 1 | 1 to 255 |\n // +----+----------+----------+\n const request = Buffer.alloc(2 + this.authMethods.length)\n request[0] = SOCKS_VERSION\n request[1] = this.authMethods.length\n this.authMethods.forEach((method, i) => {\n request[2 + i] = method\n })\n\n this.socket.write(request)\n }\n\n /**\n * Handle handshake response from server\n */\n handleHandshakeResponse () {\n if (this.buffer.length < 2) {\n return // Not enough data yet\n }\n\n const version = this.buffer[0]\n const method = this.buffer[1]\n\n if (version !== SOCKS_VERSION) {\n throw new Socks5ProxyError(`Invalid SOCKS version: ${version}`, 'UND_ERR_SOCKS5_VERSION')\n }\n\n if (method === AUTH_METHODS.NO_ACCEPTABLE) {\n throw new Socks5ProxyError('No acceptable authentication method', 'UND_ERR_SOCKS5_AUTH_REJECTED')\n }\n\n this.buffer = this.buffer.subarray(2)\n debug('server selected auth method', method)\n\n if (method === AUTH_METHODS.NO_AUTH) {\n this.emit('authenticated')\n } else if (method === AUTH_METHODS.USERNAME_PASSWORD) {\n this.state = STATES.AUTHENTICATING\n this.sendAuthRequest()\n } else {\n throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, 'UND_ERR_SOCKS5_AUTH_METHOD')\n }\n }\n\n /**\n * Send username/password authentication request\n */\n sendAuthRequest () {\n const { username, password } = this.options\n\n if (!username || !password) {\n throw new InvalidArgumentError('Username and password required for authentication')\n }\n\n debug('sending username/password auth')\n\n // Username/Password authentication request (RFC 1929)\n // +----+------+----------+------+----------+\n // |VER | ULEN | UNAME | PLEN | PASSWD |\n // +----+------+----------+------+----------+\n // | 1 | 1 | 1 to 255 | 1 | 1 to 255 |\n // +----+------+----------+------+----------+\n const usernameBuffer = Buffer.from(username)\n const passwordBuffer = Buffer.from(password)\n\n if (usernameBuffer.length > 255 || passwordBuffer.length > 255) {\n throw new InvalidArgumentError('Username or password too long')\n }\n\n const request = Buffer.alloc(3 + usernameBuffer.length + passwordBuffer.length)\n request[0] = 0x01 // Sub-negotiation version\n request[1] = usernameBuffer.length\n usernameBuffer.copy(request, 2)\n request[2 + usernameBuffer.length] = passwordBuffer.length\n passwordBuffer.copy(request, 3 + usernameBuffer.length)\n\n this.socket.write(request)\n }\n\n /**\n * Handle authentication response\n */\n handleAuthResponse () {\n if (this.buffer.length < 2) {\n return // Not enough data yet\n }\n\n const version = this.buffer[0]\n const status = this.buffer[1]\n\n if (version !== 0x01) {\n throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version}`, 'UND_ERR_SOCKS5_AUTH_VERSION')\n }\n\n if (status !== 0x00) {\n throw new Socks5ProxyError('Authentication failed', 'UND_ERR_SOCKS5_AUTH_FAILED')\n }\n\n this.buffer = this.buffer.subarray(2)\n debug('authentication successful')\n this.emit('authenticated')\n }\n\n /**\n * Send CONNECT command\n * @param {string} address - Target address (IP or domain)\n * @param {number} port - Target port\n */\n connect (address, port) {\n if (this.state === STATES.CONNECTED) {\n throw new InvalidArgumentError('Already connected')\n }\n\n debug('connecting to', address, port)\n this.state = STATES.CONNECTING\n\n const request = this.buildConnectRequest(COMMANDS.CONNECT, address, port)\n this.socket.write(request)\n }\n\n /**\n * Build a SOCKS5 request\n */\n buildConnectRequest (command, address, port) {\n // Parse address to determine type and buffer\n const { type: addressType, buffer: addressBuffer } = parseAddress(address)\n\n // Build request\n // +----+-----+-------+------+----------+----------+\n // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |\n // +----+-----+-------+------+----------+----------+\n // | 1 | 1 | X'00' | 1 | Variable | 2 |\n // +----+-----+-------+------+----------+----------+\n const request = Buffer.alloc(4 + addressBuffer.length + 2)\n request[0] = SOCKS_VERSION\n request[1] = command\n request[2] = 0x00 // Reserved\n request[3] = addressType\n addressBuffer.copy(request, 4)\n request.writeUInt16BE(port, 4 + addressBuffer.length)\n\n return request\n }\n\n /**\n * Handle CONNECT response\n */\n handleConnectResponse () {\n if (this.buffer.length < 4) {\n return // Not enough data for header\n }\n\n const version = this.buffer[0]\n const reply = this.buffer[1]\n const addressType = this.buffer[3]\n\n if (version !== SOCKS_VERSION) {\n throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version}`, 'UND_ERR_SOCKS5_REPLY_VERSION')\n }\n\n // Calculate the expected response length\n let responseLength = 4 // VER + REP + RSV + ATYP\n if (addressType === ADDRESS_TYPES.IPV4) {\n responseLength += 4 + 2 // IPv4 + port\n } else if (addressType === ADDRESS_TYPES.DOMAIN) {\n if (this.buffer.length < 5) {\n return // Need domain length byte\n }\n responseLength += 1 + this.buffer[4] + 2 // length byte + domain + port\n } else if (addressType === ADDRESS_TYPES.IPV6) {\n responseLength += 16 + 2 // IPv6 + port\n } else {\n throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, 'UND_ERR_SOCKS5_ADDR_TYPE')\n }\n\n if (this.buffer.length < responseLength) {\n return // Not enough data for full response\n }\n\n if (reply !== REPLY_CODES.SUCCEEDED) {\n const errorMessage = this.getReplyErrorMessage(reply)\n throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`)\n }\n\n // Parse bound address and port\n let boundAddress\n let offset = 4\n\n if (addressType === ADDRESS_TYPES.IPV4) {\n boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join('.')\n offset += 4\n } else if (addressType === ADDRESS_TYPES.DOMAIN) {\n const domainLength = this.buffer[offset]\n offset += 1\n boundAddress = this.buffer.subarray(offset, offset + domainLength).toString()\n offset += domainLength\n } else if (addressType === ADDRESS_TYPES.IPV6) {\n // Parse IPv6 address from 16-byte buffer\n const parts = []\n for (let i = 0; i < 8; i++) {\n const value = this.buffer.readUInt16BE(offset + i * 2)\n parts.push(value.toString(16))\n }\n boundAddress = parts.join(':')\n offset += 16\n }\n\n const boundPort = this.buffer.readUInt16BE(offset)\n\n this.buffer = this.buffer.subarray(responseLength)\n this.state = STATES.CONNECTED\n\n debug('connected, bound address:', boundAddress, 'port:', boundPort)\n this.emit('connected', { address: boundAddress, port: boundPort })\n }\n\n /**\n * Get human-readable error message for reply code\n */\n getReplyErrorMessage (reply) {\n switch (reply) {\n case REPLY_CODES.GENERAL_FAILURE:\n return 'General SOCKS server failure'\n case REPLY_CODES.CONNECTION_NOT_ALLOWED:\n return 'Connection not allowed by ruleset'\n case REPLY_CODES.NETWORK_UNREACHABLE:\n return 'Network unreachable'\n case REPLY_CODES.HOST_UNREACHABLE:\n return 'Host unreachable'\n case REPLY_CODES.CONNECTION_REFUSED:\n return 'Connection refused'\n case REPLY_CODES.TTL_EXPIRED:\n return 'TTL expired'\n case REPLY_CODES.COMMAND_NOT_SUPPORTED:\n return 'Command not supported'\n case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED:\n return 'Address type not supported'\n default:\n return `Unknown error code: ${reply}`\n }\n }\n}\n\nmodule.exports = {\n Socks5Client,\n AUTH_METHODS,\n COMMANDS,\n ADDRESS_TYPES,\n REPLY_CODES,\n STATES\n}\n","'use strict'\n\nconst net = require('node:net')\nconst { URL } = require('node:url')\n\nlet tls // include tls conditionally since it is not always available\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { Socks5Client } = require('../core/socks5-client')\nconst { kDispatch, kClose, kDestroy } = require('../core/symbols')\nconst Pool = require('./pool')\nconst buildConnector = require('../core/connect')\nconst { debuglog } = require('node:util')\n\nconst debug = debuglog('undici:socks5-proxy')\n\nconst kProxyUrl = Symbol('proxy url')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kProxyAuth = Symbol('proxy auth')\nconst kPool = Symbol('pool')\nconst kConnector = Symbol('connector')\n\n// Static flag to ensure warning is only emitted once per process\nlet experimentalWarningEmitted = false\n\n/**\n * SOCKS5 proxy agent for dispatching requests through a SOCKS5 proxy\n */\nclass Socks5ProxyAgent extends DispatcherBase {\n constructor (proxyUrl, options = {}) {\n super()\n\n // Emit experimental warning only once\n if (!experimentalWarningEmitted) {\n process.emitWarning(\n 'SOCKS5 proxy support is experimental and subject to change',\n 'ExperimentalWarning'\n )\n experimentalWarningEmitted = true\n }\n\n if (!proxyUrl) {\n throw new InvalidArgumentError('Proxy URL is mandatory')\n }\n\n // Parse proxy URL\n const url = typeof proxyUrl === 'string' ? new URL(proxyUrl) : proxyUrl\n\n if (url.protocol !== 'socks5:' && url.protocol !== 'socks:') {\n throw new InvalidArgumentError('Proxy URL must use socks5:// or socks:// protocol')\n }\n\n this[kProxyUrl] = url\n this[kProxyHeaders] = options.headers || {}\n\n // Extract auth from URL or options\n this[kProxyAuth] = {\n username: options.username || (url.username ? decodeURIComponent(url.username) : null),\n password: options.password || (url.password ? decodeURIComponent(url.password) : null)\n }\n\n // Create connector for proxy connection\n this[kConnector] = options.connect || buildConnector({\n ...options.proxyTls,\n servername: options.proxyTls?.servername || url.hostname\n })\n\n // Pool for the actual HTTP connections (with SOCKS5 tunnel connect function)\n this[kPool] = null\n }\n\n /**\n * Create a SOCKS5 connection to the proxy\n */\n async createSocks5Connection (targetHost, targetPort) {\n const proxyHost = this[kProxyUrl].hostname\n const proxyPort = parseInt(this[kProxyUrl].port) || 1080\n\n debug('creating SOCKS5 connection to', proxyHost, proxyPort)\n\n // Connect to the SOCKS5 proxy\n const socketReady = Promise.withResolvers()\n\n const onSocketConnect = () => {\n socket.removeListener('error', onSocketError)\n socketReady.resolve(socket)\n }\n\n const onSocketError = (err) => {\n socket.removeListener('connect', onSocketConnect)\n socketReady.reject(err)\n }\n\n const socket = net.connect({\n host: proxyHost,\n port: proxyPort\n })\n\n socket.once('connect', onSocketConnect)\n socket.once('error', onSocketError)\n\n await socketReady.promise\n\n // Create SOCKS5 client\n const socks5Client = new Socks5Client(socket, this[kProxyAuth])\n\n // Handle SOCKS5 errors\n socks5Client.on('error', (err) => {\n debug('SOCKS5 error:', err)\n socket.destroy()\n })\n\n // Perform SOCKS5 handshake\n await socks5Client.handshake()\n\n // Wait for authentication (if required)\n const authenticationReady = Promise.withResolvers()\n\n const authenticationTimeout = setTimeout(() => {\n authenticationReady.reject(new Error('SOCKS5 authentication timeout'))\n }, 5000)\n\n const onAuthenticated = () => {\n clearTimeout(authenticationTimeout)\n socks5Client.removeListener('error', onAuthenticationError)\n authenticationReady.resolve()\n }\n\n const onAuthenticationError = (err) => {\n clearTimeout(authenticationTimeout)\n socks5Client.removeListener('authenticated', onAuthenticated)\n authenticationReady.reject(err)\n }\n\n // Check if already authenticated (for NO_AUTH method)\n if (socks5Client.state === 'authenticated') {\n clearTimeout(authenticationTimeout)\n authenticationReady.resolve()\n } else {\n socks5Client.once('authenticated', onAuthenticated)\n socks5Client.once('error', onAuthenticationError)\n }\n\n await authenticationReady.promise\n\n // Send CONNECT command\n await socks5Client.connect(targetHost, targetPort)\n\n // Wait for connection\n const connectionReady = Promise.withResolvers()\n\n const connectionTimeout = setTimeout(() => {\n connectionReady.reject(new Error('SOCKS5 connection timeout'))\n }, 5000)\n\n const onConnected = (info) => {\n debug('SOCKS5 tunnel established to', targetHost, targetPort, 'via', info)\n clearTimeout(connectionTimeout)\n socks5Client.removeListener('error', onConnectionError)\n connectionReady.resolve()\n }\n\n const onConnectionError = (err) => {\n clearTimeout(connectionTimeout)\n socks5Client.removeListener('connected', onConnected)\n connectionReady.reject(err)\n }\n\n socks5Client.once('connected', onConnected)\n socks5Client.once('error', onConnectionError)\n\n await connectionReady.promise\n\n return socket\n }\n\n /**\n * Dispatch a request through the SOCKS5 proxy\n */\n async [kDispatch] (opts, handler) {\n const { origin } = opts\n\n debug('dispatching request to', origin, 'via SOCKS5')\n\n try {\n // Create Pool with custom connect function if we don't have one yet\n if (!this[kPool] || this[kPool].destroyed || this[kPool].closed) {\n this[kPool] = new Pool(origin, {\n pipelining: opts.pipelining,\n connections: opts.connections,\n connect: async (connectOpts, callback) => {\n try {\n const url = new URL(origin)\n const targetHost = url.hostname\n const targetPort = parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80)\n\n debug('establishing SOCKS5 connection to', targetHost, targetPort)\n\n // Create SOCKS5 tunnel\n const socket = await this.createSocks5Connection(targetHost, targetPort)\n\n // Handle TLS if needed\n let finalSocket = socket\n if (url.protocol === 'https:') {\n if (!tls) {\n tls = require('node:tls')\n }\n debug('upgrading to TLS')\n finalSocket = tls.connect({\n socket,\n servername: targetHost,\n ...connectOpts.tls || {}\n })\n\n const tlsReady = Promise.withResolvers()\n finalSocket.once('secureConnect', tlsReady.resolve)\n finalSocket.once('error', tlsReady.reject)\n await tlsReady.promise\n }\n\n callback(null, finalSocket)\n } catch (err) {\n debug('SOCKS5 connection error:', err)\n callback(err)\n }\n }\n })\n }\n\n // Dispatch the request through the pool\n return this[kPool][kDispatch](opts, handler)\n } catch (err) {\n debug('dispatch error:', err)\n if (typeof handler.onError === 'function') {\n handler.onError(err)\n } else {\n throw err\n }\n }\n }\n\n async [kClose] () {\n if (this[kPool]) {\n await this[kPool].close()\n }\n }\n\n async [kDestroy] (err) {\n if (this[kPool]) {\n await this[kPool].destroy(err)\n }\n }\n}\n\nmodule.exports = Socks5ProxyAgent\n","'use strict'\n\nconst { kProxy, kClose, kDestroy, kDispatch } = require('../core/symbols')\nconst Agent = require('./agent')\nconst Pool = require('./pool')\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require('../core/errors')\nconst buildConnector = require('../core/connect')\nconst Client = require('./client')\nconst { channels } = require('../core/diagnostics')\nconst Socks5ProxyAgent = require('./socks5-proxy-agent')\n\nconst kAgent = Symbol('proxy agent')\nconst kClient = Symbol('proxy client')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kRequestTls = Symbol('request tls settings')\nconst kProxyTls = Symbol('proxy tls settings')\nconst kConnectEndpoint = Symbol('connect endpoint function')\nconst kConnectEndpointHTTP1 = Symbol('connect endpoint function (http/1.1 only)')\nconst kTunnelProxy = Symbol('tunnel proxy')\n\nfunction defaultProtocolPort (protocol) {\n return protocol === 'https:' ? 443 : 80\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nconst noop = () => {}\n\nfunction defaultAgentFactory (origin, opts) {\n if (opts.connections === 1) {\n return new Client(origin, opts)\n }\n return new Pool(origin, opts)\n}\n\nclass Http1ProxyWrapper extends DispatcherBase {\n #client\n\n constructor (proxyUrl, { headers = {}, connect, factory }) {\n if (!proxyUrl) {\n throw new InvalidArgumentError('Proxy URL is mandatory')\n }\n\n super()\n\n this[kProxyHeaders] = headers\n if (factory) {\n this.#client = factory(proxyUrl, { connect })\n } else {\n this.#client = new Client(proxyUrl, { connect })\n }\n }\n\n [kDispatch] (opts, handler) {\n const onResponseStart = handler.onResponseStart\n handler.onResponseStart = function (controller, statusCode, data, statusMessage) {\n if (statusCode === 407) {\n if (typeof handler.onResponseError === 'function') {\n handler.onResponseError(controller, new InvalidArgumentError('Proxy Authentication Required (407)'))\n }\n return\n }\n if (onResponseStart) onResponseStart.call(this, controller, statusCode, data, statusMessage)\n }\n\n // Rewrite request as an HTTP1 Proxy request, without tunneling.\n const {\n origin,\n path = '/',\n headers = {}\n } = opts\n\n opts.path = origin + path\n\n if (!('host' in headers) && !('Host' in headers)) {\n const { host } = new URL(origin)\n headers.host = host\n }\n opts.headers = { ...this[kProxyHeaders], ...headers }\n\n return this.#client[kDispatch](opts, handler)\n }\n\n [kClose] () {\n return this.#client.close()\n }\n\n [kDestroy] (err) {\n return this.#client.destroy(err)\n }\n}\n\nclass ProxyAgent extends DispatcherBase {\n constructor (opts) {\n if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) {\n throw new InvalidArgumentError('Proxy uri is mandatory')\n }\n\n const { clientFactory = defaultFactory } = opts\n if (typeof clientFactory !== 'function') {\n throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')\n }\n\n const { proxyTunnel = true, connectTimeout } = opts\n\n super()\n\n const url = this.#getUrl(opts)\n const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url\n\n this[kProxy] = { uri: href, protocol }\n this[kRequestTls] = opts.requestTls\n this[kProxyTls] = opts.proxyTls\n this[kProxyHeaders] = opts.headers || {}\n this[kTunnelProxy] = proxyTunnel\n\n if (opts.auth && opts.token) {\n throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')\n } else if (opts.auth) {\n /* @deprecated in favour of opts.token */\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`\n } else if (opts.token) {\n this[kProxyHeaders]['proxy-authorization'] = opts.token\n } else if (username && password) {\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`\n }\n\n const connect = buildConnector({ timeout: connectTimeout, ...opts.proxyTls })\n this[kConnectEndpoint] = buildConnector({ timeout: connectTimeout, ...opts.requestTls })\n this[kConnectEndpointHTTP1] = buildConnector({ timeout: connectTimeout, ...opts.requestTls, allowH2: false })\n\n const agentFactory = opts.factory || defaultAgentFactory\n const factory = (origin, options) => {\n const { protocol } = new URL(origin)\n\n // Handle SOCKS5 proxy\n if (this[kProxy].protocol === 'socks5:' || this[kProxy].protocol === 'socks:') {\n return new Socks5ProxyAgent(this[kProxy].uri, {\n headers: this[kProxyHeaders],\n connect,\n factory: agentFactory,\n username: opts.username || username,\n password: opts.password || password,\n proxyTls: opts.proxyTls\n })\n }\n\n if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {\n return new Http1ProxyWrapper(this[kProxy].uri, {\n headers: this[kProxyHeaders],\n connect,\n factory: agentFactory\n })\n }\n return agentFactory(origin, options)\n }\n\n // For SOCKS5 proxies, we don't need a client to the proxy itself\n // The SOCKS5 connection is handled within Socks5ProxyAgent\n if (protocol === 'socks5:' || protocol === 'socks:') {\n this[kClient] = null\n } else {\n this[kClient] = clientFactory(url, { connect })\n }\n\n this[kAgent] = new Agent({\n ...opts,\n factory,\n connect: async (opts, callback) => {\n // SOCKS5 proxies handle their own connections via Socks5ProxyAgent,\n // so this connect function should never be called for them.\n if (!this[kClient]) {\n callback(new InvalidArgumentError('Cannot establish tunnel connection without a proxy client'))\n return\n }\n\n let requestedPath = opts.host\n if (!opts.port) {\n requestedPath += `:${defaultProtocolPort(opts.protocol)}`\n }\n try {\n const connectParams = {\n origin,\n port,\n path: requestedPath,\n signal: opts.signal,\n headers: {\n ...this[kProxyHeaders],\n host: opts.host,\n ...(opts.connections == null || opts.connections > 0 ? { 'proxy-connection': 'keep-alive' } : {})\n },\n servername: this[kProxyTls]?.servername || proxyHostname\n }\n const { socket, statusCode } = await this[kClient].connect(connectParams)\n if (statusCode !== 200) {\n socket.on('error', noop).destroy()\n callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))\n return\n }\n\n if (channels.proxyConnected.hasSubscribers) {\n channels.proxyConnected.publish({\n socket,\n connectParams\n })\n }\n\n if (opts.protocol !== 'https:') {\n callback(null, socket)\n return\n }\n let servername\n if (this[kRequestTls]) {\n servername = this[kRequestTls].servername\n } else {\n servername = opts.servername\n }\n const connectEndpoint = opts.allowH2 === false\n ? this[kConnectEndpointHTTP1]\n : this[kConnectEndpoint]\n\n connectEndpoint({ ...opts, servername, httpSocket: socket }, callback)\n } catch (err) {\n if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n // Throw a custom error to avoid loop in client.js#connect\n callback(new SecureProxyConnectionError(err))\n } else {\n callback(err)\n }\n }\n }\n })\n }\n\n dispatch (opts, handler) {\n const headers = buildHeaders(opts.headers)\n throwIfProxyAuthIsSent(headers)\n\n if (headers && !('host' in headers) && !('Host' in headers)) {\n const { host } = new URL(opts.origin)\n headers.host = host\n }\n\n return this[kAgent].dispatch(\n {\n ...opts,\n headers\n },\n handler\n )\n }\n\n /**\n * @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts\n * @returns {URL}\n */\n #getUrl (opts) {\n if (typeof opts === 'string') {\n return new URL(opts)\n } else if (opts instanceof URL) {\n return opts\n } else {\n return new URL(opts.uri)\n }\n }\n\n [kClose] () {\n const promises = [this[kAgent].close()]\n if (this[kClient]) {\n promises.push(this[kClient].close())\n }\n return Promise.all(promises)\n }\n\n [kDestroy] () {\n const promises = [this[kAgent].destroy()]\n if (this[kClient]) {\n promises.push(this[kClient].destroy())\n }\n return Promise.all(promises)\n }\n}\n\n/**\n * @param {string[] | Record} headers\n * @returns {Record}\n */\nfunction buildHeaders (headers) {\n // When using undici.fetch, the headers list is stored\n // as an array.\n if (Array.isArray(headers)) {\n /** @type {Record} */\n const headersPair = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n headersPair[headers[i]] = headers[i + 1]\n }\n\n return headersPair\n }\n\n return headers\n}\n\n/**\n * @param {Record} headers\n *\n * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers\n * Nevertheless, it was changed and to avoid a security vulnerability by end users\n * this check was created.\n * It should be removed in the next major version for performance reasons\n */\nfunction throwIfProxyAuthIsSent (headers) {\n const existProxyAuth = headers && Object.keys(headers)\n .find((key) => key.toLowerCase() === 'proxy-authorization')\n if (existProxyAuth) {\n throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')\n }\n}\n\nmodule.exports = ProxyAgent\n","'use strict'\n\nconst DispatcherBase = require('./dispatcher-base')\nconst { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = require('../core/symbols')\nconst ProxyAgent = require('./proxy-agent')\nconst Agent = require('./agent')\n\nconst DEFAULT_PORTS = {\n 'http:': 80,\n 'https:': 443\n}\n\nclass EnvHttpProxyAgent extends DispatcherBase {\n #noProxyValue = null\n #noProxyEntries = null\n #opts = null\n\n constructor (opts = {}) {\n super()\n this.#opts = opts\n\n const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts\n\n this[kNoProxyAgent] = new Agent(agentOpts)\n\n const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY\n if (HTTP_PROXY) {\n this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY })\n } else {\n this[kHttpProxyAgent] = this[kNoProxyAgent]\n }\n\n const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY\n if (HTTPS_PROXY) {\n this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY })\n } else {\n this[kHttpsProxyAgent] = this[kHttpProxyAgent]\n }\n\n this.#parseNoProxy()\n }\n\n [kDispatch] (opts, handler) {\n const url = new URL(opts.origin)\n const agent = this.#getProxyAgentForUrl(url)\n return agent.dispatch(opts, handler)\n }\n\n [kClose] () {\n return Promise.all([\n this[kNoProxyAgent].close(),\n !this[kHttpProxyAgent][kClosed] && this[kHttpProxyAgent].close(),\n !this[kHttpsProxyAgent][kClosed] && this[kHttpsProxyAgent].close()\n ])\n }\n\n [kDestroy] (err) {\n return Promise.all([\n this[kNoProxyAgent].destroy(err),\n !this[kHttpProxyAgent][kDestroyed] && this[kHttpProxyAgent].destroy(err),\n !this[kHttpsProxyAgent][kDestroyed] && this[kHttpsProxyAgent].destroy(err)\n ])\n }\n\n #getProxyAgentForUrl (url) {\n let { protocol, host: hostname, port } = url\n\n // Stripping ports in this way instead of using parsedUrl.hostname to make\n // sure that the brackets around IPv6 addresses are kept.\n hostname = hostname.replace(/:\\d*$/, '').toLowerCase()\n port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0\n if (!this.#shouldProxy(hostname, port)) {\n return this[kNoProxyAgent]\n }\n if (protocol === 'https:') {\n return this[kHttpsProxyAgent]\n }\n return this[kHttpProxyAgent]\n }\n\n #shouldProxy (hostname, port) {\n if (this.#noProxyChanged) {\n this.#parseNoProxy()\n }\n\n if (this.#noProxyEntries.length === 0) {\n return true // Always proxy if NO_PROXY is not set or empty.\n }\n if (this.#noProxyValue === '*') {\n return false // Never proxy if wildcard is set.\n }\n\n for (let i = 0; i < this.#noProxyEntries.length; i++) {\n const entry = this.#noProxyEntries[i]\n if (entry.port && entry.port !== port) {\n continue // Skip if ports don't match.\n }\n // Don't proxy if the hostname is equal with the no_proxy host.\n if (hostname === entry.hostname) {\n return false\n }\n // Don't proxy if the hostname is the subdomain of the no_proxy host.\n // Reference - https://github.com/denoland/deno/blob/6fbce91e40cc07fc6da74068e5cc56fdd40f7b4c/ext/fetch/proxy.rs#L485\n if (hostname.slice(-(entry.hostname.length + 1)) === `.${entry.hostname}`) {\n return false\n }\n }\n\n return true\n }\n\n #parseNoProxy () {\n const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv\n const noProxySplit = noProxyValue.split(/[,\\s]/)\n const noProxyEntries = []\n\n for (let i = 0; i < noProxySplit.length; i++) {\n const entry = noProxySplit[i]\n if (!entry) {\n continue\n }\n const parsed = entry.match(/^(.+):(\\d+)$/)\n noProxyEntries.push({\n // strip leading dot or asterisk with dot\n hostname: (parsed ? parsed[1] : entry).replace(/^\\*?\\./, '').toLowerCase(),\n port: parsed ? Number.parseInt(parsed[2], 10) : 0\n })\n }\n\n this.#noProxyValue = noProxyValue\n this.#noProxyEntries = noProxyEntries\n }\n\n get #noProxyChanged () {\n if (this.#opts.noProxy !== undefined) {\n return false\n }\n return this.#noProxyValue !== this.#noProxyEnv\n }\n\n get #noProxyEnv () {\n return process.env.no_proxy ?? process.env.NO_PROXY ?? ''\n }\n}\n\nmodule.exports = EnvHttpProxyAgent\n","'use strict'\nconst assert = require('node:assert')\n\nconst { kRetryHandlerDefaultRetry } = require('../core/symbols')\nconst { RequestRetryError } = require('../core/errors')\nconst {\n isDisturbed,\n parseRangeHeader,\n wrapRequestBody\n} = require('../core/util')\n\nfunction calculateRetryAfterHeader (retryAfter) {\n const retryTime = new Date(retryAfter).getTime()\n return isNaN(retryTime) ? 0 : retryTime - Date.now()\n}\n\nclass RetryHandler {\n constructor (opts, { dispatch, handler }) {\n const { retryOptions, ...dispatchOpts } = opts\n const {\n // Retry scoped\n retry: retryFn,\n maxRetries,\n maxTimeout,\n minTimeout,\n timeoutFactor,\n // Response scoped\n methods,\n errorCodes,\n retryAfter,\n statusCodes,\n throwOnError\n } = retryOptions ?? {}\n\n this.error = null\n this.dispatch = dispatch\n this.handler = handler\n this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }\n this.retryOpts = {\n throwOnError: throwOnError ?? true,\n retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],\n retryAfter: retryAfter ?? true,\n maxTimeout: maxTimeout ?? 30 * 1000, // 30s,\n minTimeout: minTimeout ?? 500, // .5s\n timeoutFactor: timeoutFactor ?? 2,\n maxRetries: maxRetries ?? 5,\n // What errors we should retry\n methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],\n // Indicates which errors to retry\n statusCodes: statusCodes ?? [500, 502, 503, 504, 429],\n // List of errors to retry\n errorCodes: errorCodes ?? [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'EHOSTDOWN',\n 'EHOSTUNREACH',\n 'EPIPE',\n 'UND_ERR_SOCKET'\n ]\n }\n\n this.retryCount = 0\n this.retryCountCheckpoint = 0\n this.headersSent = false\n this.start = 0\n this.end = null\n this.etag = null\n }\n\n onResponseStartWithRetry (controller, statusCode, headers, statusMessage, err) {\n if (this.retryOpts.throwOnError) {\n // Preserve old behavior for status codes that are not eligible for retry\n if (this.retryOpts.statusCodes.includes(statusCode) === false) {\n this.headersSent = true\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n } else {\n this.error = err\n }\n\n return\n }\n\n if (isDisturbed(this.opts.body)) {\n this.headersSent = true\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n return\n }\n\n function shouldRetry (passedErr) {\n if (passedErr) {\n this.headersSent = true\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n controller.resume()\n return\n }\n\n this.error = err\n controller.resume()\n }\n\n controller.pause()\n this.retryOpts.retry(\n err,\n {\n state: { counter: this.retryCount },\n opts: { retryOptions: this.retryOpts, ...this.opts }\n },\n shouldRetry.bind(this)\n )\n }\n\n onRequestStart (controller, context) {\n if (!this.headersSent) {\n this.handler.onRequestStart?.(controller, context)\n }\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {\n const { statusCode, code, headers } = err\n const { method, retryOptions } = opts\n const {\n maxRetries,\n minTimeout,\n maxTimeout,\n timeoutFactor,\n statusCodes,\n errorCodes,\n methods\n } = retryOptions\n const { counter } = state\n\n // Any code that is not a Undici's originated and allowed to retry\n if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) {\n cb(err)\n return\n }\n\n // If a set of method are provided and the current method is not in the list\n if (Array.isArray(methods) && !methods.includes(method)) {\n cb(err)\n return\n }\n\n // If a set of status code are provided and the current status code is not in the list\n if (\n statusCode != null &&\n Array.isArray(statusCodes) &&\n !statusCodes.includes(statusCode)\n ) {\n cb(err)\n return\n }\n\n // If we reached the max number of retries\n if (counter > maxRetries) {\n cb(err)\n return\n }\n\n let retryAfterHeader = headers?.['retry-after']\n if (retryAfterHeader) {\n retryAfterHeader = Number(retryAfterHeader)\n retryAfterHeader = Number.isNaN(retryAfterHeader)\n ? calculateRetryAfterHeader(headers['retry-after'])\n : retryAfterHeader * 1e3 // Retry-After is in seconds\n }\n\n const retryTimeout =\n retryAfterHeader > 0\n ? Math.min(retryAfterHeader, maxTimeout)\n : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)\n\n setTimeout(() => cb(null), retryTimeout)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n this.error = null\n this.retryCount += 1\n\n if (statusCode >= 300) {\n const err = new RequestRetryError('Request failed', statusCode, {\n headers,\n data: {\n count: this.retryCount\n }\n })\n\n this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err)\n return\n }\n\n // Checkpoint for resume from where we left it\n if (this.headersSent) {\n // Only Partial Content 206 supposed to provide Content-Range,\n // any other status code that partially consumed the payload\n // should not be retried because it would result in downstream\n // wrongly concatenate multiple responses.\n if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) {\n throw new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n\n const contentRange = parseRangeHeader(headers['content-range'])\n // If no content range\n if (!contentRange) {\n // We always throw here as we want to indicate that we entred unexpected path\n throw new RequestRetryError('Content-Range mismatch', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n\n // Let's start with a weak etag check\n if (this.etag != null && this.etag !== headers.etag) {\n // We always throw here as we want to indicate that we entred unexpected path\n throw new RequestRetryError('ETag mismatch', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n\n const { start, size, end = size ? size - 1 : null } = contentRange\n\n assert(this.start === start, 'content-range mismatch')\n assert(this.end == null || this.end === end, 'content-range mismatch')\n\n return\n }\n\n if (this.end == null) {\n if (statusCode === 206) {\n // First time we receive 206\n const range = parseRangeHeader(headers['content-range'])\n\n if (range == null) {\n this.headersSent = true\n this.handler.onResponseStart?.(\n controller,\n statusCode,\n headers,\n statusMessage\n )\n return\n }\n\n const { start, size, end = size ? size - 1 : null } = range\n assert(\n start != null && Number.isFinite(start),\n 'content-range mismatch'\n )\n assert(end != null && Number.isFinite(end), 'invalid content-length')\n\n this.start = start\n this.end = end\n }\n\n // We make our best to checkpoint the body for further range headers\n if (this.end == null) {\n const contentLength = headers['content-length']\n this.end = contentLength != null ? Number(contentLength) - 1 : null\n }\n\n assert(Number.isFinite(this.start))\n assert(\n this.end == null || Number.isFinite(this.end),\n 'invalid content-length'\n )\n\n this.resume = true\n this.etag = headers.etag != null ? headers.etag : null\n\n // Weak etags are not useful for comparison nor cache\n // for instance not safe to assume if the response is byte-per-byte\n // equal\n if (\n this.etag != null &&\n this.etag[0] === 'W' &&\n this.etag[1] === '/'\n ) {\n this.etag = null\n }\n\n this.headersSent = true\n this.handler.onResponseStart?.(\n controller,\n statusCode,\n headers,\n statusMessage\n )\n } else {\n throw new RequestRetryError('Request failed', statusCode, {\n headers,\n data: { count: this.retryCount }\n })\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.error) {\n return\n }\n\n this.start += chunk.length\n\n this.handler.onResponseData?.(controller, chunk)\n }\n\n onResponseEnd (controller, trailers) {\n if (this.error && this.retryOpts.throwOnError) {\n throw this.error\n }\n\n if (!this.error) {\n this.retryCount = 0\n return this.handler.onResponseEnd?.(controller, trailers)\n }\n\n this.retry(controller)\n }\n\n retry (controller) {\n if (this.start !== 0) {\n const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }\n\n // Weak etag check - weak etags will make comparison algorithms never match\n if (this.etag != null) {\n headers['if-match'] = this.etag\n }\n\n this.opts = {\n ...this.opts,\n headers: {\n ...this.opts.headers,\n ...headers\n }\n }\n }\n\n try {\n this.retryCountCheckpoint = this.retryCount\n this.dispatch(this.opts, this)\n } catch (err) {\n this.handler.onResponseError?.(controller, err)\n }\n }\n\n onResponseError (controller, err) {\n if (controller?.aborted || isDisturbed(this.opts.body)) {\n this.handler.onResponseError?.(controller, err)\n return\n }\n\n function shouldRetry (returnedErr) {\n if (!returnedErr) {\n this.retry(controller)\n return\n }\n\n this.handler?.onResponseError?.(controller, returnedErr)\n }\n\n // We reconcile in case of a mix between network errors\n // and server error response\n if (this.retryCount - this.retryCountCheckpoint > 0) {\n // We count the difference between the last checkpoint and the current retry count\n this.retryCount =\n this.retryCountCheckpoint +\n (this.retryCount - this.retryCountCheckpoint)\n } else {\n this.retryCount += 1\n }\n\n this.retryOpts.retry(\n err,\n {\n state: { counter: this.retryCount },\n opts: { retryOptions: this.retryOpts, ...this.opts }\n },\n shouldRetry.bind(this)\n )\n }\n}\n\nmodule.exports = RetryHandler\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst RetryHandler = require('../handler/retry-handler')\n\nclass RetryAgent extends Dispatcher {\n #agent = null\n #options = null\n constructor (agent, options = {}) {\n super(options)\n this.#agent = agent\n this.#options = options\n }\n\n dispatch (opts, handler) {\n const retry = new RetryHandler({\n ...opts,\n retryOptions: this.#options\n }, {\n dispatch: this.#agent.dispatch.bind(this.#agent),\n handler\n })\n return this.#agent.dispatch(opts, retry)\n }\n\n close () {\n return this.#agent.close()\n }\n\n destroy () {\n return this.#agent.destroy()\n }\n}\n\nmodule.exports = RetryAgent\n","'use strict'\n\nconst { InvalidArgumentError } = require('../core/errors')\nconst Client = require('./client')\n\nclass H2CClient extends Client {\n constructor (origin, clientOpts) {\n if (typeof origin === 'string') {\n origin = new URL(origin)\n }\n\n if (origin.protocol !== 'http:') {\n throw new InvalidArgumentError(\n 'h2c-client: Only h2c protocol is supported'\n )\n }\n\n const { maxConcurrentStreams, pipelining, ...opts } =\n clientOpts ?? {}\n let defaultMaxConcurrentStreams = 100\n let defaultPipelining = 100\n\n if (\n maxConcurrentStreams != null &&\n Number.isInteger(maxConcurrentStreams) &&\n maxConcurrentStreams > 0\n ) {\n defaultMaxConcurrentStreams = maxConcurrentStreams\n }\n\n if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) {\n defaultPipelining = pipelining\n }\n\n if (defaultPipelining > defaultMaxConcurrentStreams) {\n throw new InvalidArgumentError(\n 'h2c-client: pipelining cannot be greater than maxConcurrentStreams'\n )\n }\n\n super(origin, {\n ...opts,\n maxConcurrentStreams: defaultMaxConcurrentStreams,\n pipelining: defaultPipelining,\n allowH2: true,\n useH2c: true\n })\n }\n}\n\nmodule.exports = H2CClient\n","'use strict'\n\nconst assert = require('node:assert')\nconst { Readable } = require('node:stream')\nconst { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require('../core/errors')\nconst util = require('../core/util')\nconst { ReadableStreamFrom } = require('../core/util')\n\nconst kConsume = Symbol('kConsume')\nconst kReading = Symbol('kReading')\nconst kBody = Symbol('kBody')\nconst kAbort = Symbol('kAbort')\nconst kContentType = Symbol('kContentType')\nconst kContentLength = Symbol('kContentLength')\nconst kUsed = Symbol('kUsed')\nconst kBytesRead = Symbol('kBytesRead')\n\nconst noop = () => {}\n\n/**\n * @class\n * @extends {Readable}\n * @see https://fetch.spec.whatwg.org/#body\n */\nclass BodyReadable extends Readable {\n /**\n * @param {object} opts\n * @param {(this: Readable, size: number) => void} opts.resume\n * @param {() => (void | null)} opts.abort\n * @param {string} [opts.contentType = '']\n * @param {number} [opts.contentLength]\n * @param {number} [opts.highWaterMark = 64 * 1024]\n */\n constructor ({\n resume,\n abort,\n contentType = '',\n contentLength,\n highWaterMark = 64 * 1024 // Same as nodejs fs streams.\n }) {\n super({\n autoDestroy: true,\n read: resume,\n highWaterMark\n })\n\n this._readableState.dataEmitted = false\n\n this[kAbort] = abort\n\n /** @type {Consume | null} */\n this[kConsume] = null\n\n /** @type {number} */\n this[kBytesRead] = 0\n\n /** @type {ReadableStream|null} */\n this[kBody] = null\n\n /** @type {boolean} */\n this[kUsed] = false\n\n /** @type {string} */\n this[kContentType] = contentType\n\n /** @type {number|null} */\n this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null\n\n /**\n * Is stream being consumed through Readable API?\n * This is an optimization so that we avoid checking\n * for 'data' and 'readable' listeners in the hot path\n * inside push().\n *\n * @type {boolean}\n */\n this[kReading] = false\n }\n\n /**\n * @param {Error|null} err\n * @param {(error:(Error|null)) => void} callback\n * @returns {void}\n */\n _destroy (err, callback) {\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (err) {\n this[kAbort]()\n }\n\n // Workaround for Node \"bug\". If the stream is destroyed in same\n // tick as it is created, then a user who is waiting for a\n // promise (i.e micro tick) for installing an 'error' listener will\n // never get a chance and will always encounter an unhandled exception.\n if (!this[kUsed]) {\n setImmediate(callback, err)\n } else {\n callback(err)\n }\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n on (event, listener) {\n if (event === 'data' || event === 'readable') {\n this[kReading] = true\n this[kUsed] = true\n }\n return super.on(event, listener)\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n addListener (event, listener) {\n return this.on(event, listener)\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n off (event, listener) {\n const ret = super.off(event, listener)\n if (event === 'data' || event === 'readable') {\n this[kReading] = (\n this.listenerCount('data') > 0 ||\n this.listenerCount('readable') > 0\n )\n }\n return ret\n }\n\n /**\n * @param {string|symbol} event\n * @param {(...args: any[]) => void} listener\n * @returns {this}\n */\n removeListener (event, listener) {\n return this.off(event, listener)\n }\n\n /**\n * @param {Buffer|null} chunk\n * @returns {boolean}\n */\n push (chunk) {\n if (chunk) {\n this[kBytesRead] += chunk.length\n if (this[kConsume]) {\n consumePush(this[kConsume], chunk)\n return this[kReading] ? super.push(chunk) : true\n }\n }\n\n return super.push(chunk)\n }\n\n /**\n * Consumes and returns the body as a string.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-text\n * @returns {Promise}\n */\n text () {\n return consume(this, 'text')\n }\n\n /**\n * Consumes and returns the body as a JavaScript Object.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-json\n * @returns {Promise}\n */\n json () {\n return consume(this, 'json')\n }\n\n /**\n * Consumes and returns the body as a Blob\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-blob\n * @returns {Promise}\n */\n blob () {\n return consume(this, 'blob')\n }\n\n /**\n * Consumes and returns the body as an Uint8Array.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-bytes\n * @returns {Promise}\n */\n bytes () {\n return consume(this, 'bytes')\n }\n\n /**\n * Consumes and returns the body as an ArrayBuffer.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-arraybuffer\n * @returns {Promise}\n */\n arrayBuffer () {\n return consume(this, 'arrayBuffer')\n }\n\n /**\n * Not implemented\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-formdata\n * @throws {NotSupportedError}\n */\n async formData () {\n // TODO: Implement.\n throw new NotSupportedError()\n }\n\n /**\n * Returns true if the body is not null and the body has been consumed.\n * Otherwise, returns false.\n *\n * @see https://fetch.spec.whatwg.org/#dom-body-bodyused\n * @readonly\n * @returns {boolean}\n */\n get bodyUsed () {\n return util.isDisturbed(this)\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#dom-body-body\n * @readonly\n * @returns {ReadableStream}\n */\n get body () {\n if (!this[kBody]) {\n this[kBody] = ReadableStreamFrom(this)\n if (this[kConsume]) {\n // TODO: Is this the best way to force a lock?\n this[kBody].getReader() // Ensure stream is locked.\n assert(this[kBody].locked)\n }\n }\n return this[kBody]\n }\n\n /**\n * Dumps the response body by reading `limit` number of bytes.\n * @param {object} opts\n * @param {number} [opts.limit = 131072] Number of bytes to read.\n * @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump.\n * @returns {Promise}\n */\n dump (opts) {\n const signal = opts?.signal\n\n if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) {\n return Promise.reject(new InvalidArgumentError('signal must be an AbortSignal'))\n }\n\n const limit = opts?.limit && Number.isFinite(opts.limit)\n ? opts.limit\n : 128 * 1024\n\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new AbortError())\n }\n\n if (this._readableState.closeEmitted) {\n return Promise.resolve(null)\n }\n\n return new Promise((resolve, reject) => {\n if (\n (this[kContentLength] && (this[kContentLength] > limit)) ||\n this[kBytesRead] > limit\n ) {\n this.destroy(new AbortError())\n }\n\n if (signal) {\n const onAbort = () => {\n this.destroy(signal.reason ?? new AbortError())\n }\n signal.addEventListener('abort', onAbort)\n this\n .on('close', function () {\n signal.removeEventListener('abort', onAbort)\n if (signal.aborted) {\n reject(signal.reason ?? new AbortError())\n } else {\n resolve(null)\n }\n })\n } else {\n this.on('close', resolve)\n }\n\n this\n .on('error', noop)\n .on('data', () => {\n if (this[kBytesRead] > limit) {\n this.destroy()\n }\n })\n .resume()\n })\n }\n\n /**\n * @param {BufferEncoding} encoding\n * @returns {this}\n */\n setEncoding (encoding) {\n if (Buffer.isEncoding(encoding)) {\n this._readableState.encoding = encoding\n }\n return this\n }\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestream-locked\n * @param {BodyReadable} bodyReadable\n * @returns {boolean}\n */\nfunction isLocked (bodyReadable) {\n // Consume is an implicit lock.\n return bodyReadable[kBody]?.locked === true || bodyReadable[kConsume] !== null\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-unusable\n * @param {BodyReadable} bodyReadable\n * @returns {boolean}\n */\nfunction isUnusable (bodyReadable) {\n return util.isDisturbed(bodyReadable) || isLocked(bodyReadable)\n}\n\n/**\n * @typedef {'text' | 'json' | 'blob' | 'bytes' | 'arrayBuffer'} ConsumeType\n */\n\n/**\n * @template {ConsumeType} T\n * @typedef {T extends 'text' ? string :\n * T extends 'json' ? unknown :\n * T extends 'blob' ? Blob :\n * T extends 'arrayBuffer' ? ArrayBuffer :\n * T extends 'bytes' ? Uint8Array :\n * never\n * } ConsumeReturnType\n */\n/**\n * @typedef {object} Consume\n * @property {ConsumeType} type\n * @property {BodyReadable} stream\n * @property {((value?: any) => void)} resolve\n * @property {((err: Error) => void)} reject\n * @property {number} length\n * @property {Buffer[]} body\n */\n\n/**\n * @template {ConsumeType} T\n * @param {BodyReadable} stream\n * @param {T} type\n * @returns {Promise>}\n */\nfunction consume (stream, type) {\n assert(!stream[kConsume])\n\n return new Promise((resolve, reject) => {\n if (isUnusable(stream)) {\n const rState = stream._readableState\n if (rState.destroyed && rState.closeEmitted === false) {\n stream\n .on('error', reject)\n .on('close', () => {\n reject(new TypeError('unusable'))\n })\n } else {\n reject(rState.errored ?? new TypeError('unusable'))\n }\n } else {\n queueMicrotask(() => {\n stream[kConsume] = {\n type,\n stream,\n resolve,\n reject,\n length: 0,\n body: []\n }\n\n stream\n .on('error', function (err) {\n consumeFinish(this[kConsume], err)\n })\n .on('close', function () {\n if (this[kConsume].body !== null) {\n consumeFinish(this[kConsume], new RequestAbortedError())\n }\n })\n\n consumeStart(stream[kConsume])\n })\n }\n })\n}\n\n/**\n * @param {Consume} consume\n * @returns {void}\n */\nfunction consumeStart (consume) {\n if (consume.body === null) {\n return\n }\n\n const { _readableState: state } = consume.stream\n\n if (state.bufferIndex) {\n const start = state.bufferIndex\n const end = state.buffer.length\n for (let n = start; n < end; n++) {\n consumePush(consume, state.buffer[n])\n }\n } else {\n for (const chunk of state.buffer) {\n consumePush(consume, chunk)\n }\n }\n\n if (state.endEmitted) {\n consumeEnd(this[kConsume], this._readableState.encoding)\n } else {\n consume.stream.on('end', function () {\n consumeEnd(this[kConsume], this._readableState.encoding)\n })\n }\n\n consume.stream.resume()\n\n while (consume.stream.read() != null) {\n // Loop\n }\n}\n\n/**\n * @param {Buffer[]} chunks\n * @param {number} length\n * @param {BufferEncoding} [encoding='utf8']\n * @returns {string}\n */\nfunction chunksDecode (chunks, length, encoding) {\n if (chunks.length === 0 || length === 0) {\n return ''\n }\n const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length)\n const bufferLength = buffer.length\n\n // Skip BOM.\n const start =\n bufferLength > 2 &&\n buffer[0] === 0xef &&\n buffer[1] === 0xbb &&\n buffer[2] === 0xbf\n ? 3\n : 0\n if (!encoding || encoding === 'utf8' || encoding === 'utf-8') {\n return buffer.utf8Slice(start, bufferLength)\n } else {\n return buffer.subarray(start, bufferLength).toString(encoding)\n }\n}\n\n/**\n * @param {Buffer[]} chunks\n * @param {number} length\n * @returns {Uint8Array}\n */\nfunction chunksConcat (chunks, length) {\n if (chunks.length === 0 || length === 0) {\n return new Uint8Array(0)\n }\n if (chunks.length === 1) {\n // fast-path\n return new Uint8Array(chunks[0])\n }\n const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer)\n\n let offset = 0\n for (let i = 0; i < chunks.length; ++i) {\n const chunk = chunks[i]\n buffer.set(chunk, offset)\n offset += chunk.length\n }\n\n return buffer\n}\n\n/**\n * @param {Consume} consume\n * @param {BufferEncoding} encoding\n * @returns {void}\n */\nfunction consumeEnd (consume, encoding) {\n const { type, body, resolve, stream, length } = consume\n\n try {\n if (type === 'text') {\n resolve(chunksDecode(body, length, encoding))\n } else if (type === 'json') {\n resolve(JSON.parse(chunksDecode(body, length, encoding)))\n } else if (type === 'arrayBuffer') {\n resolve(chunksConcat(body, length).buffer)\n } else if (type === 'blob') {\n resolve(new Blob(body, { type: stream[kContentType] }))\n } else if (type === 'bytes') {\n resolve(chunksConcat(body, length))\n }\n\n consumeFinish(consume)\n } catch (err) {\n stream.destroy(err)\n }\n}\n\n/**\n * @param {Consume} consume\n * @param {Buffer} chunk\n * @returns {void}\n */\nfunction consumePush (consume, chunk) {\n consume.length += chunk.length\n consume.body.push(chunk)\n}\n\n/**\n * @param {Consume} consume\n * @param {Error} [err]\n * @returns {void}\n */\nfunction consumeFinish (consume, err) {\n if (consume.body === null) {\n return\n }\n\n if (err) {\n consume.reject(err)\n } else {\n consume.resolve()\n }\n\n // Reset the consume object to allow for garbage collection.\n consume.type = null\n consume.stream = null\n consume.resolve = null\n consume.reject = null\n consume.length = 0\n consume.body = null\n}\n\nmodule.exports = {\n Readable: BodyReadable,\n chunksDecode\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst { Readable } = require('./readable')\nconst { InvalidArgumentError, RequestAbortedError } = require('../core/errors')\nconst util = require('../core/util')\n\nfunction noop () {}\n\nclass RequestHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders, highWaterMark } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) {\n throw new InvalidArgumentError('invalid highWaterMark')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_REQUEST')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', noop), err)\n }\n throw err\n }\n\n this.method = method\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.res = null\n this.abort = null\n this.body = body\n this.trailers = {}\n this.context = null\n this.controller = null\n this.onInfo = onInfo || null\n this.highWaterMark = highWaterMark\n this.reason = null\n this.removeAbortListener = null\n\n if (signal?.aborted) {\n this.reason = signal.reason ?? new RequestAbortedError()\n } else if (signal) {\n this.removeAbortListener = util.addAbortListener(signal, () => {\n this.reason = signal.reason ?? new RequestAbortedError()\n if (this.res) {\n util.destroy(this.res.on('error', noop), this.reason)\n } else if (this.abort) {\n this.abort(this.reason)\n }\n })\n }\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.controller = controller\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart (controller, statusCode, headers, statusText) {\n const { callback, opaque, context, responseHeaders, highWaterMark } = this\n\n const rawHeaders = controller?.rawHeaders\n const responseHeaderData = responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers: responseHeaderData })\n }\n return\n }\n\n const parsedHeaders = headers\n const contentType = parsedHeaders?.['content-type']\n const contentLength = parsedHeaders?.['content-length']\n const res = new Readable({\n resume: () => controller.resume(),\n abort: (reason) => controller.abort(reason),\n contentType,\n contentLength: this.method !== 'HEAD' && contentLength\n ? Number(contentLength)\n : null,\n highWaterMark\n })\n\n if (this.removeAbortListener) {\n res.on('close', this.removeAbortListener)\n this.removeAbortListener = null\n }\n\n this.callback = null\n this.res = res\n if (callback !== null) {\n try {\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n statusText,\n headers: responseHeaderData,\n trailers: this.trailers,\n opaque,\n body: res,\n context\n })\n } catch (err) {\n // If the callback throws synchronously, we need to handle it\n // Remove reference to res to allow res being garbage collected\n this.res = null\n\n // Destroy the response stream\n util.destroy(res.on('error', noop), err)\n\n // Use queueMicrotask to re-throw the error so it reaches uncaughtException\n queueMicrotask(() => {\n throw err\n })\n }\n }\n }\n\n onResponseData (controller, chunk) {\n if (!this.res) {\n return\n }\n\n if (this.res.push(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (_controller, trailers) {\n if (trailers && typeof trailers === 'object') {\n for (const key of Object.keys(trailers)) {\n if (key === '__proto__') {\n Object.defineProperty(this.trailers, key, {\n value: trailers[key],\n enumerable: true,\n configurable: true,\n writable: true\n })\n } else {\n this.trailers[key] = trailers[key]\n }\n }\n }\n this.res?.push(null)\n }\n\n onResponseError (_controller, err) {\n const { res, callback, body, opaque } = this\n\n if (callback) {\n // TODO: Does this need queueMicrotask?\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (res) {\n this.res = null\n // Ensure all queued handlers are invoked before destroying res.\n queueMicrotask(() => {\n util.destroy(res.on('error', noop), err)\n })\n }\n\n if (body) {\n this.body = null\n\n if (util.isStream(body)) {\n body.on('error', noop)\n util.destroy(body, err)\n }\n }\n\n if (this.removeAbortListener) {\n this.removeAbortListener()\n this.removeAbortListener = null\n }\n }\n}\n\nfunction request (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n request.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const handler = new RequestHandler(opts, callback)\n\n this.dispatch(opts, handler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = request\nmodule.exports.RequestHandler = RequestHandler\n","'use strict'\n\nconst { addAbortListener } = require('../core/util')\nconst { RequestAbortedError } = require('../core/errors')\n\nconst kListener = Symbol('kListener')\nconst kSignal = Symbol('kSignal')\n\nfunction abort (self) {\n if (self.abort) {\n self.abort(self[kSignal]?.reason)\n } else {\n self.reason = self[kSignal]?.reason ?? new RequestAbortedError()\n }\n removeSignal(self)\n}\n\nfunction addSignal (self, signal) {\n self.reason = null\n\n self[kSignal] = null\n self[kListener] = null\n\n if (!signal) {\n return\n }\n\n if (signal.aborted) {\n abort(self)\n return\n }\n\n self[kSignal] = signal\n self[kListener] = () => {\n abort(self)\n }\n\n addAbortListener(self[kSignal], self[kListener])\n}\n\nfunction removeSignal (self) {\n if (!self[kSignal]) {\n return\n }\n\n if ('removeEventListener' in self[kSignal]) {\n self[kSignal].removeEventListener('abort', self[kListener])\n } else {\n self[kSignal].removeListener('abort', self[kListener])\n }\n\n self[kSignal] = null\n self[kListener] = null\n}\n\nmodule.exports = {\n addSignal,\n removeSignal\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { finished } = require('node:stream')\nconst { AsyncResource } = require('node:async_hooks')\nconst { InvalidArgumentError, InvalidReturnValueError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nfunction noop () {}\n\nclass StreamHandler extends AsyncResource {\n constructor (opts, factory, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('invalid factory')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_STREAM')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', noop), err)\n }\n throw err\n }\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.factory = factory\n this.callback = callback\n this.res = null\n this.abort = null\n this.context = null\n this.controller = null\n this.trailers = null\n this.body = body\n this.onInfo = onInfo || null\n\n if (util.isStream(body)) {\n body.on('error', (err) => {\n this.onResponseError(this.controller, err)\n })\n }\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.controller = controller\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart (controller, statusCode, headers, _statusMessage) {\n const { factory, opaque, context, responseHeaders } = this\n\n const rawHeaders = controller?.rawHeaders\n const responseHeaderData = responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers: responseHeaderData })\n }\n return\n }\n\n this.factory = null\n\n if (factory === null) {\n return\n }\n\n const res = this.runInAsyncScope(factory, null, {\n statusCode,\n headers: responseHeaderData,\n opaque,\n context\n })\n\n if (\n !res ||\n typeof res.write !== 'function' ||\n typeof res.end !== 'function' ||\n typeof res.on !== 'function'\n ) {\n throw new InvalidReturnValueError('expected Writable')\n }\n\n // TODO: Avoid finished. It registers an unnecessary amount of listeners.\n finished(res, { readable: false }, (err) => {\n const { callback, res, opaque, trailers, abort } = this\n\n this.res = null\n if (err || !res?.readable) {\n util.destroy(res, err)\n }\n\n this.callback = null\n this.runInAsyncScope(callback, null, err || null, { opaque, trailers })\n\n if (err) {\n abort()\n }\n })\n\n res.on('drain', () => controller.resume())\n\n this.res = res\n\n const needDrain = res.writableNeedDrain !== undefined\n ? res.writableNeedDrain\n : res._writableState?.needDrain\n\n if (needDrain === true) {\n controller.pause()\n }\n }\n\n onResponseData (controller, chunk) {\n const { res } = this\n\n if (!res) {\n return\n }\n\n if (res.write(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (_controller, trailers) {\n const { res } = this\n\n removeSignal(this)\n\n if (!res) {\n return\n }\n\n if (trailers && typeof trailers === 'object') {\n this.trailers = trailers\n }\n\n res.end()\n }\n\n onResponseError (_controller, err) {\n const { res, callback, opaque, body } = this\n\n removeSignal(this)\n\n this.factory = null\n\n if (res) {\n this.res = null\n util.destroy(res, err)\n } else if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (body) {\n this.body = null\n util.destroy(body, err)\n }\n }\n}\n\nfunction stream (opts, factory, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n stream.call(this, opts, factory, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const handler = new StreamHandler(opts, factory, callback)\n\n this.dispatch(opts, handler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = stream\n","'use strict'\n\nconst {\n Readable,\n Duplex,\n PassThrough\n} = require('node:stream')\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst {\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nfunction noop () {}\n\nconst kResume = Symbol('resume')\n\nclass PipelineRequest extends Readable {\n constructor () {\n super({ autoDestroy: true })\n\n this[kResume] = null\n }\n\n _read () {\n const { [kResume]: resume } = this\n\n if (resume) {\n this[kResume] = null\n resume()\n }\n }\n\n _destroy (err, callback) {\n this._read()\n\n callback(err)\n }\n}\n\nclass PipelineResponse extends Readable {\n constructor (resume) {\n super({ autoDestroy: true })\n this[kResume] = resume\n }\n\n _read () {\n this[kResume]()\n }\n\n _destroy (err, callback) {\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n callback(err)\n }\n}\n\nclass PipelineHandler extends AsyncResource {\n constructor (opts, handler) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof handler !== 'function') {\n throw new InvalidArgumentError('invalid handler')\n }\n\n const { signal, method, opaque, onInfo, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_PIPELINE')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.handler = handler\n this.abort = null\n this.context = null\n this.onInfo = onInfo || null\n\n this.req = new PipelineRequest().on('error', noop)\n\n this.ret = new Duplex({\n readableObjectMode: opts.objectMode,\n autoDestroy: true,\n read: () => {\n const { body } = this\n\n if (body?.resume) {\n body.resume()\n }\n },\n write: (chunk, encoding, callback) => {\n const { req } = this\n\n if (req.push(chunk, encoding) || req._readableState.destroyed) {\n callback()\n } else {\n req[kResume] = callback\n }\n },\n destroy: (err, callback) => {\n const { body, req, res, ret, abort } = this\n\n if (!err && !ret._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (abort && err) {\n abort()\n }\n\n util.destroy(body, err)\n util.destroy(req, err)\n util.destroy(res, err)\n\n removeSignal(this)\n\n callback(err)\n }\n }).on('prefinish', () => {\n const { req } = this\n\n // Node < 15 does not call _final in same tick.\n req.push(null)\n })\n\n this.res = null\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n const { res } = this\n\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(!res, 'pipeline cannot be retried')\n\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart (controller, statusCode, headers, _statusMessage) {\n const { opaque, handler, context } = this\n\n if (statusCode < 200) {\n if (this.onInfo) {\n const rawHeaders = controller?.rawHeaders\n const responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n this.onInfo({ statusCode, headers: responseHeaders })\n }\n return\n }\n\n this.res = new PipelineResponse(() => controller.resume())\n\n let body\n try {\n this.handler = null\n const rawHeaders = controller?.rawHeaders\n const responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n body = this.runInAsyncScope(handler, null, {\n statusCode,\n headers: responseHeaders,\n opaque,\n body: this.res,\n context\n })\n } catch (err) {\n this.res.on('error', noop)\n throw err\n }\n\n if (!body || typeof body.on !== 'function') {\n throw new InvalidReturnValueError('expected Readable')\n }\n\n body\n .on('data', (chunk) => {\n const { ret, body } = this\n\n if (!ret.push(chunk) && body.pause) {\n body.pause()\n }\n })\n .on('error', (err) => {\n const { ret } = this\n\n util.destroy(ret, err)\n })\n .on('end', () => {\n const { ret } = this\n\n ret.push(null)\n })\n .on('close', () => {\n const { ret } = this\n\n if (!ret._readableState.ended) {\n util.destroy(ret, new RequestAbortedError())\n }\n })\n\n this.body = body\n }\n\n onResponseData (controller, chunk) {\n const { res } = this\n\n if (res.push(chunk) === false) {\n controller.pause()\n }\n }\n\n onResponseEnd (_controller, _trailers) {\n const { res } = this\n res.push(null)\n }\n\n onResponseError (_controller, err) {\n const { ret } = this\n this.handler = null\n util.destroy(ret, err)\n }\n}\n\nfunction pipeline (opts, handler) {\n try {\n const pipelineHandler = new PipelineHandler(opts, handler)\n this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler)\n return pipelineHandler.ret\n } catch (err) {\n return new PassThrough().destroy(err)\n }\n}\n\nmodule.exports = pipeline\n","'use strict'\n\nconst { InvalidArgumentError, SocketError } = require('../core/errors')\nconst { AsyncResource } = require('node:async_hooks')\nconst assert = require('node:assert')\nconst util = require('../core/util')\nconst { kHTTP2Stream } = require('../core/symbols')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass UpgradeHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_UPGRADE')\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.abort = null\n this.context = null\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart () {\n throw new SocketError('bad upgrade', null)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n assert(socket[kHTTP2Stream] === true ? statusCode === 200 : statusCode === 101)\n\n const { callback, opaque, context } = this\n\n removeSignal(this)\n\n this.callback = null\n\n const rawHeaders = controller?.rawHeaders\n const responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n\n this.runInAsyncScope(callback, null, null, {\n headers: responseHeaders,\n socket,\n opaque,\n context\n })\n }\n\n onResponseError (_controller, err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction upgrade (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n upgrade.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const upgradeHandler = new UpgradeHandler(opts, callback)\n const upgradeOpts = {\n ...opts,\n method: opts.method || 'GET',\n upgrade: opts.protocol || 'Websocket'\n }\n this.dispatch(upgradeOpts, upgradeHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = upgrade\n","'use strict'\n\nconst assert = require('node:assert')\nconst { AsyncResource } = require('node:async_hooks')\nconst { InvalidArgumentError, SocketError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass ConnectHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_CONNECT')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.callback = callback\n this.abort = null\n\n addSignal(this, signal)\n }\n\n onRequestStart (controller, context) {\n if (this.reason) {\n controller.abort(this.reason)\n return\n }\n\n assert(this.callback)\n\n this.abort = (reason) => controller.abort(reason)\n this.context = context\n }\n\n onResponseStart () {\n throw new SocketError('bad connect', null)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n const { callback, opaque, context } = this\n\n removeSignal(this)\n\n this.callback = null\n\n let responseHeaders = headers\n const rawHeaders = controller?.rawHeaders\n // Indicates is an HTTP2Session\n if (responseHeaders != null) {\n responseHeaders = this.responseHeaders === 'raw'\n ? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])\n : headers\n }\n\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n headers: responseHeaders,\n socket,\n opaque,\n context\n })\n }\n\n onResponseError (_controller, err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction connect (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n connect.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const connectHandler = new ConnectHandler(opts, callback)\n const connectOptions = { ...opts, method: 'CONNECT' }\n this.dispatch(connectOptions, connectHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts?.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = connect\n","'use strict'\n\nmodule.exports.request = require('./api-request')\nmodule.exports.stream = require('./api-stream')\nmodule.exports.pipeline = require('./api-pipeline')\nmodule.exports.upgrade = require('./api-upgrade')\nmodule.exports.connect = require('./api-connect')\n","'use strict'\n\nconst { UndiciError } = require('../core/errors')\n\nconst kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED')\n\n/**\n * The request does not match any registered mock dispatches.\n */\nclass MockNotMatchedError extends UndiciError {\n constructor (message) {\n super(message)\n this.name = 'MockNotMatchedError'\n this.message = message || 'The request does not match any registered mock dispatches'\n this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'\n }\n\n static [Symbol.hasInstance] (instance) {\n return instance && instance[kMockNotMatchedError] === true\n }\n\n get [kMockNotMatchedError] () {\n return true\n }\n}\n\nmodule.exports = {\n MockNotMatchedError\n}\n","'use strict'\n\nmodule.exports = {\n kAgent: Symbol('agent'),\n kOptions: Symbol('options'),\n kFactory: Symbol('factory'),\n kDispatches: Symbol('dispatches'),\n kDispatchKey: Symbol('dispatch key'),\n kDefaultHeaders: Symbol('default headers'),\n kDefaultTrailers: Symbol('default trailers'),\n kContentLength: Symbol('content length'),\n kMockAgent: Symbol('mock agent'),\n kMockAgentSet: Symbol('mock agent set'),\n kMockAgentGet: Symbol('mock agent get'),\n kMockDispatch: Symbol('mock dispatch'),\n kClose: Symbol('close'),\n kOriginalClose: Symbol('original agent close'),\n kOriginalDispatch: Symbol('original dispatch'),\n kOrigin: Symbol('origin'),\n kIsMockActive: Symbol('is mock active'),\n kNetConnect: Symbol('net connect'),\n kGetNetConnect: Symbol('get net connect'),\n kConnected: Symbol('connected'),\n kIgnoreTrailingSlash: Symbol('ignore trailing slash'),\n kMockAgentMockCallHistoryInstance: Symbol('mock agent mock call history name'),\n kMockAgentRegisterCallHistory: Symbol('mock agent register mock call history'),\n kMockAgentAddCallHistoryLog: Symbol('mock agent add call history log'),\n kMockAgentIsCallHistoryEnabled: Symbol('mock agent is call history enabled'),\n kMockAgentAcceptsNonStandardSearchParameters: Symbol('mock agent accepts non standard search parameters'),\n kMockCallHistoryAddLog: Symbol('mock call history add log'),\n kTotalDispatchCount: Symbol('total dispatch count')\n}\n","'use strict'\n\nconst { MockNotMatchedError } = require('./mock-errors')\nconst {\n kDispatches,\n kMockAgent,\n kOriginalDispatch,\n kOrigin,\n kGetNetConnect,\n kTotalDispatchCount\n} = require('./mock-symbols')\nconst { serializePathWithQuery, parseHeaders } = require('../core/util')\nconst { STATUS_CODES } = require('node:http')\nconst {\n types: {\n isPromise\n }\n} = require('node:util')\nconst { InvalidArgumentError } = require('../core/errors')\n\nfunction matchValue (match, value) {\n if (typeof match === 'string') {\n return match === value\n }\n if (match instanceof RegExp) {\n return match.test(value)\n }\n if (typeof match === 'function') {\n return match(value) === true\n }\n return false\n}\n\nfunction lowerCaseEntries (headers) {\n return Object.fromEntries(\n Object.entries(headers).map(([headerName, headerValue]) => {\n return [headerName.toLocaleLowerCase(), headerValue]\n })\n )\n}\n\n/**\n * @param {import('../../index').Headers|string[]|Record} headers\n * @param {string} key\n */\nfunction getHeaderByName (headers, key) {\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {\n return headers[i + 1]\n }\n }\n\n return undefined\n } else if (typeof headers.get === 'function') {\n return headers.get(key)\n } else {\n return lowerCaseEntries(headers)[key.toLocaleLowerCase()]\n }\n}\n\n/** @param {string[]} headers */\nfunction buildHeadersFromArray (headers) { // fetch HeadersList\n const clone = headers.slice()\n const entries = []\n for (let index = 0; index < clone.length; index += 2) {\n entries.push([clone[index], clone[index + 1]])\n }\n return Object.fromEntries(entries)\n}\n\nfunction matchHeaders (mockDispatch, headers) {\n if (typeof mockDispatch.headers === 'function') {\n if (Array.isArray(headers)) { // fetch HeadersList\n headers = buildHeadersFromArray(headers)\n }\n return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})\n }\n if (typeof mockDispatch.headers === 'undefined') {\n return true\n }\n if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {\n return false\n }\n\n for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {\n const headerValue = getHeaderByName(headers, matchHeaderName)\n\n if (!matchValue(matchHeaderValue, headerValue)) {\n return false\n }\n }\n return true\n}\n\nfunction normalizeSearchParams (query) {\n if (typeof query !== 'string') {\n return query\n }\n\n const originalQp = new URLSearchParams(query)\n const normalizedQp = new URLSearchParams()\n\n for (let [key, value] of originalQp.entries()) {\n key = key.replace('[]', '')\n\n const valueRepresentsString = /^(['\"]).*\\1$/.test(value)\n if (valueRepresentsString) {\n normalizedQp.append(key, value)\n continue\n }\n\n if (value.includes(',')) {\n const values = value.split(',')\n for (const v of values) {\n normalizedQp.append(key, v)\n }\n continue\n }\n\n normalizedQp.append(key, value)\n }\n\n return normalizedQp\n}\n\nfunction safeUrl (path) {\n if (typeof path !== 'string') {\n return path\n }\n const pathSegments = path.split('?', 3)\n if (pathSegments.length !== 2) {\n return path\n }\n\n const qp = new URLSearchParams(pathSegments.pop())\n qp.sort()\n return [...pathSegments, qp.toString()].join('?')\n}\n\nfunction matchKey (mockDispatch, { path, method, body, headers }) {\n const pathMatch = matchValue(mockDispatch.path, path)\n const methodMatch = matchValue(mockDispatch.method, method)\n const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true\n const headersMatch = matchHeaders(mockDispatch, headers)\n return pathMatch && methodMatch && bodyMatch && headersMatch\n}\n\nfunction getResponseData (data) {\n if (Buffer.isBuffer(data)) {\n return data\n } else if (data instanceof Uint8Array) {\n return data\n } else if (data instanceof ArrayBuffer) {\n return data\n } else if (typeof data === 'object') {\n return JSON.stringify(data)\n } else if (data) {\n return data.toString()\n } else {\n return ''\n }\n}\n\nfunction getMockDispatch (mockDispatches, key) {\n const basePath = key.query ? serializePathWithQuery(key.path, key.query) : key.path\n const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath\n\n const resolvedPathWithoutTrailingSlash = removeTrailingSlash(resolvedPath)\n\n // Match path\n let matchedMockDispatches = mockDispatches\n .filter(({ consumed }) => !consumed)\n .filter(({ path, ignoreTrailingSlash }) => {\n return ignoreTrailingSlash\n ? matchValue(removeTrailingSlash(safeUrl(path)), resolvedPathWithoutTrailingSlash)\n : matchValue(safeUrl(path), resolvedPath)\n })\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)\n }\n\n // Match method\n matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`)\n }\n\n // Match body\n matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true)\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`)\n }\n\n // Match headers\n matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers))\n if (matchedMockDispatches.length === 0) {\n const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers\n throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`)\n }\n\n return matchedMockDispatches[0]\n}\n\nfunction addMockDispatch (mockDispatches, key, data, opts) {\n const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false, ...opts }\n const replyData = typeof data === 'function' ? { callback: data } : { ...data }\n const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }\n mockDispatches.push(newMockDispatch)\n // Track total number of intercepts ever registered for better error messages\n mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1\n return newMockDispatch\n}\n\nfunction deleteMockDispatch (mockDispatches, key) {\n const index = mockDispatches.findIndex(dispatch => {\n if (!dispatch.consumed) {\n return false\n }\n return matchKey(dispatch, key)\n })\n if (index !== -1) {\n mockDispatches.splice(index, 1)\n }\n}\n\n/**\n * @param {string} path Path to remove trailing slash from\n */\nfunction removeTrailingSlash (path) {\n while (path.endsWith('/')) {\n path = path.slice(0, -1)\n }\n\n if (path.length === 0) {\n path = '/'\n }\n\n return path\n}\n\nfunction buildKey (opts) {\n const { path, method, body, headers, query } = opts\n\n return {\n path,\n method,\n body,\n headers,\n query\n }\n}\n\nfunction generateKeyValues (data) {\n const keys = Object.keys(data)\n const result = []\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i]\n const value = data[key]\n const name = Buffer.from(`${key}`)\n if (Array.isArray(value)) {\n for (let j = 0; j < value.length; ++j) {\n result.push(name, Buffer.from(`${value[j]}`))\n }\n } else {\n result.push(name, Buffer.from(`${value}`))\n }\n }\n return result\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n * @param {number} statusCode\n */\nfunction getStatusText (statusCode) {\n return STATUS_CODES[statusCode] || 'unknown'\n}\n\nasync function getResponse (body) {\n const buffers = []\n for await (const data of body) {\n buffers.push(data)\n }\n return Buffer.concat(buffers).toString('utf8')\n}\n\n/**\n * Mock dispatch function used to simulate undici dispatches\n */\nfunction mockDispatch (opts, handler) {\n // Get mock dispatch from built key\n const key = buildKey(opts)\n const mockDispatch = getMockDispatch(this[kDispatches], key)\n\n mockDispatch.timesInvoked++\n\n // Here's where we resolve a callback if a callback is present for the dispatch data.\n if (mockDispatch.data.callback) {\n mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }\n }\n\n // Parse mockDispatch data\n const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch\n const { timesInvoked, times } = mockDispatch\n\n // If it's used up and not persistent, mark as consumed\n mockDispatch.consumed = !persist && timesInvoked >= times\n mockDispatch.pending = timesInvoked < times\n\n // If specified, trigger dispatch error\n if (error !== null) {\n deleteMockDispatch(this[kDispatches], key)\n handler.onResponseError(null, error)\n return true\n }\n\n // Track whether the request has been aborted\n let aborted = false\n let timer = null\n\n // Create the controller early so abort can use it\n const controller = {\n paused: false,\n rawHeaders: null,\n rawTrailers: null,\n pause () {\n this.paused = true\n },\n resume () {\n this.paused = false\n },\n abort: (reason) => {\n if (aborted) {\n return\n }\n aborted = true\n\n // Clear the pending delayed response if any\n if (timer !== null) {\n clearTimeout(timer)\n timer = null\n }\n\n handler.onResponseError?.(controller, reason)\n }\n }\n\n // Call onRequestStart to allow the handler to receive the controller\n handler.onRequestStart?.(controller, null)\n\n // Handle the request with a delay if necessary\n if (typeof delay === 'number' && delay > 0) {\n timer = setTimeout(() => {\n timer = null\n handleReply(this[kDispatches])\n }, delay)\n } else {\n handleReply(this[kDispatches])\n }\n\n function handleReply (mockDispatches, _data = data) {\n // Don't send response if the request was aborted\n if (aborted) {\n return\n }\n\n // fetch's HeadersList is a 1D string array\n const optsHeaders = Array.isArray(opts.headers)\n ? buildHeadersFromArray(opts.headers)\n : opts.headers\n const body = typeof _data === 'function'\n ? _data({ ...opts, headers: optsHeaders })\n : _data\n\n // util.types.isPromise is likely needed for jest.\n if (isPromise(body)) {\n // If handleReply is asynchronous, throwing an error\n // in the callback will reject the promise, rather than\n // synchronously throw the error, which breaks some tests.\n // Rather, we wait for the callback to resolve if it is a\n // promise, and then re-run handleReply with the new body.\n return body.then((newData) => handleReply(mockDispatches, newData))\n }\n\n // Check again if aborted after async body resolution\n if (aborted) {\n return\n }\n\n const responseData = getResponseData(body)\n const responseHeaders = generateKeyValues(headers)\n const responseTrailers = generateKeyValues(trailers)\n\n // Update the controller with response data\n controller.rawHeaders = responseHeaders\n controller.rawTrailers = responseTrailers\n\n handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode))\n handler.onResponseData?.(controller, Buffer.from(responseData))\n handler.onResponseEnd?.(controller, parseHeaders(responseTrailers))\n deleteMockDispatch(mockDispatches, key)\n }\n\n return true\n}\n\nfunction buildMockDispatch () {\n const agent = this[kMockAgent]\n const origin = this[kOrigin]\n const originalDispatch = this[kOriginalDispatch]\n\n return function dispatch (opts, handler) {\n if (agent.isMockActive) {\n try {\n mockDispatch.call(this, opts, handler)\n } catch (error) {\n if (error.code === 'UND_MOCK_ERR_MOCK_NOT_MATCHED') {\n const netConnect = agent[kGetNetConnect]()\n const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length\n const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length\n const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`\n if (netConnect === false) {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`)\n }\n if (checkNetConnect(netConnect, origin)) {\n originalDispatch.call(this, opts, handler)\n } else {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`)\n }\n } else {\n throw error\n }\n }\n } else {\n originalDispatch.call(this, opts, handler)\n }\n }\n}\n\nfunction checkNetConnect (netConnect, origin) {\n const url = new URL(origin)\n if (netConnect === true) {\n return true\n } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {\n return true\n }\n return false\n}\n\nfunction normalizeOrigin (origin) {\n if (typeof origin !== 'string' && !(origin instanceof URL)) {\n return origin\n }\n\n if (origin instanceof URL) {\n return origin.origin\n }\n\n return origin.toLowerCase()\n}\n\nfunction buildAndValidateMockOptions (opts) {\n const { agent, ...mockOptions } = opts\n\n if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== 'boolean') {\n throw new InvalidArgumentError('options.enableCallHistory must to be a boolean')\n }\n\n if ('acceptNonStandardSearchParameters' in mockOptions && typeof mockOptions.acceptNonStandardSearchParameters !== 'boolean') {\n throw new InvalidArgumentError('options.acceptNonStandardSearchParameters must to be a boolean')\n }\n\n if ('ignoreTrailingSlash' in mockOptions && typeof mockOptions.ignoreTrailingSlash !== 'boolean') {\n throw new InvalidArgumentError('options.ignoreTrailingSlash must to be a boolean')\n }\n\n return mockOptions\n}\n\nmodule.exports = {\n getResponseData,\n getMockDispatch,\n addMockDispatch,\n deleteMockDispatch,\n buildKey,\n generateKeyValues,\n matchValue,\n getResponse,\n getStatusText,\n mockDispatch,\n buildMockDispatch,\n checkNetConnect,\n buildAndValidateMockOptions,\n getHeaderByName,\n buildHeadersFromArray,\n normalizeSearchParams,\n normalizeOrigin\n}\n","'use strict'\n\nconst { getResponseData, buildKey, addMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kDispatchKey,\n kDefaultHeaders,\n kDefaultTrailers,\n kContentLength,\n kMockDispatch,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { serializePathWithQuery } = require('../core/util')\n\n/**\n * Defines the scope API for an interceptor reply\n */\nclass MockScope {\n constructor (mockDispatch) {\n this[kMockDispatch] = mockDispatch\n }\n\n /**\n * Delay a reply by a set amount in ms.\n */\n delay (waitInMs) {\n if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) {\n throw new InvalidArgumentError('waitInMs must be a valid integer > 0')\n }\n\n this[kMockDispatch].delay = waitInMs\n return this\n }\n\n /**\n * For a defined reply, never mark as consumed.\n */\n persist () {\n this[kMockDispatch].persist = true\n return this\n }\n\n /**\n * Allow one to define a reply for a set amount of matching requests.\n */\n times (repeatTimes) {\n if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) {\n throw new InvalidArgumentError('repeatTimes must be a valid integer > 0')\n }\n\n this[kMockDispatch].times = repeatTimes\n return this\n }\n}\n\n/**\n * Defines an interceptor for a Mock\n */\nclass MockInterceptor {\n constructor (opts, mockDispatches) {\n if (typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object')\n }\n if (typeof opts.path === 'undefined') {\n throw new InvalidArgumentError('opts.path must be defined')\n }\n if (typeof opts.method === 'undefined') {\n opts.method = 'GET'\n }\n // See https://github.com/nodejs/undici/issues/1245\n // As per RFC 3986, clients are not supposed to send URI\n // fragments to servers when they retrieve a document,\n if (typeof opts.path === 'string') {\n if (opts.query) {\n opts.path = serializePathWithQuery(opts.path, opts.query)\n } else {\n // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811\n const parsedURL = new URL(opts.path, 'data://')\n opts.path = parsedURL.pathname + parsedURL.search\n }\n }\n if (typeof opts.method === 'string') {\n opts.method = opts.method.toUpperCase()\n }\n\n this[kDispatchKey] = buildKey(opts)\n this[kDispatches] = mockDispatches\n this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n this[kDefaultHeaders] = {}\n this[kDefaultTrailers] = {}\n this[kContentLength] = false\n }\n\n createMockScopeDispatchData ({ statusCode, data, responseOptions }) {\n const responseData = getResponseData(data)\n const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}\n const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }\n const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }\n\n return { statusCode, data, headers, trailers }\n }\n\n validateReplyParameters (replyParameters) {\n if (typeof replyParameters.statusCode === 'undefined') {\n throw new InvalidArgumentError('statusCode must be defined')\n }\n if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) {\n throw new InvalidArgumentError('responseOptions must be an object')\n }\n }\n\n /**\n * Mock an undici request with a defined reply.\n */\n reply (replyOptionsCallbackOrStatusCode) {\n // Values of reply aren't available right now as they\n // can only be available when the reply callback is invoked.\n if (typeof replyOptionsCallbackOrStatusCode === 'function') {\n // We'll first wrap the provided callback in another function,\n // this function will properly resolve the data from the callback\n // when invoked.\n const wrappedDefaultsCallback = (opts) => {\n // Our reply options callback contains the parameter for statusCode, data and options.\n const resolvedData = replyOptionsCallbackOrStatusCode(opts)\n\n // Check if it is in the right format\n if (typeof resolvedData !== 'object' || resolvedData === null) {\n throw new InvalidArgumentError('reply options callback must return an object')\n }\n\n const replyParameters = { data: '', responseOptions: {}, ...resolvedData }\n this.validateReplyParameters(replyParameters)\n // Since the values can be obtained immediately we return them\n // from this higher order function that will be resolved later.\n return {\n ...this.createMockScopeDispatchData(replyParameters)\n }\n }\n\n // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data.\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n return new MockScope(newMockDispatch)\n }\n\n // We can have either one or three parameters, if we get here,\n // we should have 1-3 parameters. So we spread the arguments of\n // this function to obtain the parameters, since replyData will always\n // just be the statusCode.\n const replyParameters = {\n statusCode: replyOptionsCallbackOrStatusCode,\n data: arguments[1] === undefined ? '' : arguments[1],\n responseOptions: arguments[2] === undefined ? {} : arguments[2]\n }\n this.validateReplyParameters(replyParameters)\n\n // Send in-already provided data like usual\n const dispatchData = this.createMockScopeDispatchData(replyParameters)\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Mock an undici request with a defined error.\n */\n replyWithError (error) {\n if (typeof error === 'undefined') {\n throw new InvalidArgumentError('error must be defined')\n }\n\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] })\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Set default reply headers on the interceptor for subsequent replies\n */\n defaultReplyHeaders (headers) {\n if (typeof headers === 'undefined') {\n throw new InvalidArgumentError('headers must be defined')\n }\n\n this[kDefaultHeaders] = headers\n return this\n }\n\n /**\n * Set default reply trailers on the interceptor for subsequent replies\n */\n defaultReplyTrailers (trailers) {\n if (typeof trailers === 'undefined') {\n throw new InvalidArgumentError('trailers must be defined')\n }\n\n this[kDefaultTrailers] = trailers\n return this\n }\n\n /**\n * Set reply content length header for replies on the interceptor\n */\n replyContentLength () {\n this[kContentLength] = true\n return this\n }\n}\n\nmodule.exports.MockInterceptor = MockInterceptor\nmodule.exports.MockScope = MockScope\n","'use strict'\n\nconst { promisify } = require('node:util')\nconst Client = require('../dispatcher/client')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockClient provides an API that extends the Client to influence the mockDispatches.\n */\nclass MockClient extends Client {\n constructor (origin, opts) {\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n super(origin, opts)\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(\n opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts },\n this[kDispatches]\n )\n }\n\n cleanMocks () {\n this[kDispatches] = []\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockClient\n","'use strict'\n\nconst { kMockCallHistoryAddLog } = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\nfunction handleFilterCallsWithOptions (criteria, options, handler, store) {\n switch (options.operator) {\n case 'OR':\n store.push(...handler(criteria))\n\n return store\n case 'AND':\n return handler.call({ logs: store }, criteria)\n default:\n // guard -- should never happens because buildAndValidateFilterCallsOptions is called before\n throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \\'OR\\' or \\'AND\\'')\n }\n}\n\nfunction buildAndValidateFilterCallsOptions (options = {}) {\n const finalOptions = {}\n\n if ('operator' in options) {\n if (typeof options.operator !== 'string' || (options.operator.toUpperCase() !== 'OR' && options.operator.toUpperCase() !== 'AND')) {\n throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \\'OR\\' or \\'AND\\'')\n }\n\n return {\n ...finalOptions,\n operator: options.operator.toUpperCase()\n }\n }\n\n return finalOptions\n}\n\nfunction makeFilterCalls (parameterName) {\n return (parameterValue) => {\n if (typeof parameterValue === 'string' || parameterValue == null) {\n return this.logs.filter((log) => {\n return log[parameterName] === parameterValue\n })\n }\n if (parameterValue instanceof RegExp) {\n return this.logs.filter((log) => {\n return parameterValue.test(log[parameterName])\n })\n }\n\n throw new InvalidArgumentError(`${parameterName} parameter should be one of string, regexp, undefined or null`)\n }\n}\nfunction computeUrlWithMaybeSearchParameters (requestInit) {\n // path can contains query url parameters\n // or query can contains query url parameters\n try {\n const url = new URL(requestInit.path, requestInit.origin)\n\n // requestInit.path contains query url parameters\n // requestInit.query is then undefined\n if (url.search.length !== 0) {\n return url\n }\n\n // requestInit.query can be populated here\n url.search = new URLSearchParams(requestInit.query).toString()\n\n return url\n } catch (error) {\n throw new InvalidArgumentError('An error occurred when computing MockCallHistoryLog.url', { cause: error })\n }\n}\n\nclass MockCallHistoryLog {\n constructor (requestInit = {}) {\n this.body = requestInit.body\n this.headers = requestInit.headers\n this.method = requestInit.method\n\n const url = computeUrlWithMaybeSearchParameters(requestInit)\n\n this.fullUrl = url.toString()\n this.origin = url.origin\n this.path = url.pathname\n this.searchParams = Object.fromEntries(url.searchParams)\n this.protocol = url.protocol\n this.host = url.host\n this.port = url.port\n this.hash = url.hash\n }\n\n toMap () {\n return new Map([\n ['protocol', this.protocol],\n ['host', this.host],\n ['port', this.port],\n ['origin', this.origin],\n ['path', this.path],\n ['hash', this.hash],\n ['searchParams', this.searchParams],\n ['fullUrl', this.fullUrl],\n ['method', this.method],\n ['body', this.body],\n ['headers', this.headers]]\n )\n }\n\n toString () {\n const options = { betweenKeyValueSeparator: '->', betweenPairSeparator: '|' }\n let result = ''\n\n this.toMap().forEach((value, key) => {\n if (typeof value === 'string' || value === undefined || value === null) {\n result = `${result}${key}${options.betweenKeyValueSeparator}${value}${options.betweenPairSeparator}`\n }\n if ((typeof value === 'object' && value !== null) || Array.isArray(value)) {\n result = `${result}${key}${options.betweenKeyValueSeparator}${JSON.stringify(value)}${options.betweenPairSeparator}`\n }\n // maybe miss something for non Record / Array headers and searchParams here\n })\n\n // delete last betweenPairSeparator\n return result.slice(0, -1)\n }\n}\n\nclass MockCallHistory {\n logs = []\n\n calls () {\n return this.logs\n }\n\n firstCall () {\n return this.logs.at(0)\n }\n\n lastCall () {\n return this.logs.at(-1)\n }\n\n nthCall (number) {\n if (typeof number !== 'number') {\n throw new InvalidArgumentError('nthCall must be called with a number')\n }\n if (!Number.isInteger(number)) {\n throw new InvalidArgumentError('nthCall must be called with an integer')\n }\n if (Math.sign(number) !== 1) {\n throw new InvalidArgumentError('nthCall must be called with a positive value. use firstCall or lastCall instead')\n }\n\n // non zero based index. this is more human readable\n return this.logs.at(number - 1)\n }\n\n filterCalls (criteria, options) {\n // perf\n if (this.logs.length === 0) {\n return this.logs\n }\n if (typeof criteria === 'function') {\n return this.logs.filter(criteria)\n }\n if (criteria instanceof RegExp) {\n return this.logs.filter((log) => {\n return criteria.test(log.toString())\n })\n }\n if (typeof criteria === 'object' && criteria !== null) {\n // no criteria - returning all logs\n if (Object.keys(criteria).length === 0) {\n return this.logs\n }\n\n const finalOptions = { operator: 'OR', ...buildAndValidateFilterCallsOptions(options) }\n\n let maybeDuplicatedLogsFiltered = []\n if ('protocol' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered)\n }\n if ('host' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered)\n }\n if ('port' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered)\n }\n if ('origin' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered)\n }\n if ('path' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered)\n }\n if ('hash' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered)\n }\n if ('fullUrl' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered)\n }\n if ('method' in criteria) {\n maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered)\n }\n\n const uniqLogsFiltered = [...new Set(maybeDuplicatedLogsFiltered)]\n\n return uniqLogsFiltered\n }\n\n throw new InvalidArgumentError('criteria parameter should be one of function, regexp, or object')\n }\n\n filterCallsByProtocol = makeFilterCalls.call(this, 'protocol')\n\n filterCallsByHost = makeFilterCalls.call(this, 'host')\n\n filterCallsByPort = makeFilterCalls.call(this, 'port')\n\n filterCallsByOrigin = makeFilterCalls.call(this, 'origin')\n\n filterCallsByPath = makeFilterCalls.call(this, 'path')\n\n filterCallsByHash = makeFilterCalls.call(this, 'hash')\n\n filterCallsByFullUrl = makeFilterCalls.call(this, 'fullUrl')\n\n filterCallsByMethod = makeFilterCalls.call(this, 'method')\n\n clear () {\n this.logs = []\n }\n\n [kMockCallHistoryAddLog] (requestInit) {\n const log = new MockCallHistoryLog(requestInit)\n\n this.logs.push(log)\n\n return log\n }\n\n * [Symbol.iterator] () {\n for (const log of this.calls()) {\n yield log\n }\n }\n}\n\nmodule.exports.MockCallHistory = MockCallHistory\nmodule.exports.MockCallHistoryLog = MockCallHistoryLog\n","'use strict'\n\nconst { promisify } = require('node:util')\nconst Pool = require('../dispatcher/pool')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockPool provides an API that extends the Pool to influence the mockDispatches.\n */\nclass MockPool extends Pool {\n constructor (origin, opts) {\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n super(origin, opts)\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(\n opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts },\n this[kDispatches]\n )\n }\n\n cleanMocks () {\n this[kDispatches] = []\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockPool\n","'use strict'\n\nconst { Transform } = require('node:stream')\nconst { Console } = require('node:console')\n\nconst PERSISTENT = process.versions.icu ? '✅' : 'Y '\nconst NOT_PERSISTENT = process.versions.icu ? '❌' : 'N '\n\n/**\n * Gets the output of `console.table(…)` as a string.\n */\nmodule.exports = class PendingInterceptorsFormatter {\n constructor ({ disableColors } = {}) {\n this.transform = new Transform({\n transform (chunk, _enc, cb) {\n cb(null, chunk)\n }\n })\n\n this.logger = new Console({\n stdout: this.transform,\n inspectOptions: {\n colors: !disableColors && !process.env.CI\n }\n })\n }\n\n format (pendingInterceptors) {\n const withPrettyHeaders = pendingInterceptors.map(\n ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({\n Method: method,\n Origin: origin,\n Path: path,\n 'Status code': statusCode,\n Persistent: persist ? PERSISTENT : NOT_PERSISTENT,\n Invocations: timesInvoked,\n Remaining: persist ? Infinity : times - timesInvoked\n }))\n\n this.logger.table(withPrettyHeaders)\n return this.transform.read().toString()\n }\n}\n","'use strict'\n\nconst { kClients } = require('../core/symbols')\nconst Agent = require('../dispatcher/agent')\nconst {\n kAgent,\n kMockAgentSet,\n kMockAgentGet,\n kDispatches,\n kIsMockActive,\n kNetConnect,\n kGetNetConnect,\n kOptions,\n kFactory,\n kMockAgentRegisterCallHistory,\n kMockAgentIsCallHistoryEnabled,\n kMockAgentAddCallHistoryLog,\n kMockAgentMockCallHistoryInstance,\n kMockAgentAcceptsNonStandardSearchParameters,\n kMockCallHistoryAddLog,\n kIgnoreTrailingSlash\n} = require('./mock-symbols')\nconst MockClient = require('./mock-client')\nconst MockPool = require('./mock-pool')\nconst { matchValue, normalizeSearchParams, buildAndValidateMockOptions, normalizeOrigin } = require('./mock-utils')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst Dispatcher = require('../dispatcher/dispatcher')\nconst PendingInterceptorsFormatter = require('./pending-interceptors-formatter')\nconst { MockCallHistory } = require('./mock-call-history')\n\nclass MockAgent extends Dispatcher {\n constructor (opts = {}) {\n super(opts)\n\n const mockOptions = buildAndValidateMockOptions(opts)\n\n this[kNetConnect] = true\n this[kIsMockActive] = true\n this[kMockAgentIsCallHistoryEnabled] = mockOptions.enableCallHistory ?? false\n this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions.acceptNonStandardSearchParameters ?? false\n this[kIgnoreTrailingSlash] = mockOptions.ignoreTrailingSlash ?? false\n\n // Instantiate Agent and encapsulate\n if (opts?.agent && typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n const agent = opts?.agent ? opts.agent : new Agent(opts)\n this[kAgent] = agent\n\n this[kClients] = agent[kClients]\n this[kOptions] = mockOptions\n\n if (this[kMockAgentIsCallHistoryEnabled]) {\n this[kMockAgentRegisterCallHistory]()\n }\n }\n\n get (origin) {\n // Normalize origin to handle URL objects and case-insensitive hostnames\n const normalizedOrigin = normalizeOrigin(origin)\n const originKey = this[kIgnoreTrailingSlash] ? normalizedOrigin.replace(/\\/$/, '') : normalizedOrigin\n\n let dispatcher = this[kMockAgentGet](originKey)\n\n if (!dispatcher) {\n dispatcher = this[kFactory](originKey)\n this[kMockAgentSet](originKey, dispatcher)\n }\n return dispatcher\n }\n\n dispatch (opts, handler) {\n opts.origin = normalizeOrigin(opts.origin)\n\n // Call MockAgent.get to perform additional setup before dispatching as normal\n this.get(opts.origin)\n\n this[kMockAgentAddCallHistoryLog](opts)\n\n const acceptNonStandardSearchParameters = this[kMockAgentAcceptsNonStandardSearchParameters]\n\n const dispatchOpts = { ...opts }\n\n if (acceptNonStandardSearchParameters && dispatchOpts.path) {\n const [path, searchParams] = dispatchOpts.path.split('?')\n const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters)\n dispatchOpts.path = `${path}?${normalizedSearchParams}`\n }\n\n return this[kAgent].dispatch(dispatchOpts, handler)\n }\n\n async close () {\n this.clearCallHistory()\n await this[kAgent].close()\n this[kClients].clear()\n }\n\n deactivate () {\n this[kIsMockActive] = false\n }\n\n activate () {\n this[kIsMockActive] = true\n }\n\n enableNetConnect (matcher) {\n if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) {\n if (Array.isArray(this[kNetConnect])) {\n this[kNetConnect].push(matcher)\n } else {\n this[kNetConnect] = [matcher]\n }\n } else if (typeof matcher === 'undefined') {\n this[kNetConnect] = true\n } else {\n throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.')\n }\n }\n\n disableNetConnect () {\n this[kNetConnect] = false\n }\n\n enableCallHistory () {\n this[kMockAgentIsCallHistoryEnabled] = true\n\n return this\n }\n\n disableCallHistory () {\n this[kMockAgentIsCallHistoryEnabled] = false\n\n return this\n }\n\n getCallHistory () {\n return this[kMockAgentMockCallHistoryInstance]\n }\n\n clearCallHistory () {\n if (this[kMockAgentMockCallHistoryInstance] !== undefined) {\n this[kMockAgentMockCallHistoryInstance].clear()\n }\n }\n\n // This is required to bypass issues caused by using global symbols - see:\n // https://github.com/nodejs/undici/issues/1447\n get isMockActive () {\n return this[kIsMockActive]\n }\n\n [kMockAgentRegisterCallHistory] () {\n if (this[kMockAgentMockCallHistoryInstance] === undefined) {\n this[kMockAgentMockCallHistoryInstance] = new MockCallHistory()\n }\n }\n\n [kMockAgentAddCallHistoryLog] (opts) {\n if (this[kMockAgentIsCallHistoryEnabled]) {\n // additional setup when enableCallHistory class method is used after mockAgent instantiation\n this[kMockAgentRegisterCallHistory]()\n\n // add call history log on every call (intercepted or not)\n this[kMockAgentMockCallHistoryInstance][kMockCallHistoryAddLog](opts)\n }\n }\n\n [kMockAgentSet] (origin, dispatcher) {\n this[kClients].set(origin, { count: 0, dispatcher })\n }\n\n [kFactory] (origin) {\n const mockOptions = Object.assign({ agent: this }, this[kOptions])\n return this[kOptions] && this[kOptions].connections === 1\n ? new MockClient(origin, mockOptions)\n : new MockPool(origin, mockOptions)\n }\n\n [kMockAgentGet] (origin) {\n // First check if we can immediately find it\n const result = this[kClients].get(origin)\n if (result?.dispatcher) {\n return result.dispatcher\n }\n\n // If the origin is not a string create a dummy parent pool and return to user\n if (typeof origin !== 'string') {\n const dispatcher = this[kFactory]('http://localhost:9999')\n this[kMockAgentSet](origin, dispatcher)\n return dispatcher\n }\n\n // If we match, create a pool and assign the same dispatches\n for (const [keyMatcher, result] of Array.from(this[kClients])) {\n if (result && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {\n const dispatcher = this[kFactory](origin)\n this[kMockAgentSet](origin, dispatcher)\n dispatcher[kDispatches] = result.dispatcher[kDispatches]\n return dispatcher\n }\n }\n }\n\n [kGetNetConnect] () {\n return this[kNetConnect]\n }\n\n pendingInterceptors () {\n const mockAgentClients = this[kClients]\n\n return Array.from(mockAgentClients.entries())\n .flatMap(([origin, result]) => result.dispatcher[kDispatches].map(dispatch => ({ ...dispatch, origin })))\n .filter(({ pending }) => pending)\n }\n\n assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) {\n const pending = this.pendingInterceptors()\n\n if (pending.length === 0) {\n return\n }\n\n throw new UndiciError(\n pending.length === 1\n ? `1 interceptor is pending:\\n\\n${pendingInterceptorsFormatter.format(pending)}`.trim()\n : `${pending.length} interceptors are pending:\\n\\n${pendingInterceptorsFormatter.format(pending)}`.trim()\n )\n }\n}\n\nmodule.exports = MockAgent\n","'use strict'\n\nconst { InvalidArgumentError } = require('../core/errors')\nconst { runtimeFeatures } = require('../util/runtime-features.js')\n\n/**\n * @typedef {Object} HeaderFilters\n * @property {Set} ignore - Set of headers to ignore for matching\n * @property {Set} exclude - Set of headers to exclude from matching\n * @property {Set} match - Set of headers to match (empty means match\n */\n\n/**\n * Creates cached header sets for performance\n *\n * @param {import('./snapshot-recorder').SnapshotRecorderMatchOptions} matchOptions - Matching options for headers\n * @returns {HeaderFilters} - Cached sets for ignore, exclude, and match headers\n */\nfunction createHeaderFilters (matchOptions = {}) {\n const { ignoreHeaders = [], excludeHeaders = [], matchHeaders = [], caseSensitive = false } = matchOptions\n\n return {\n ignore: new Set(ignoreHeaders.map(header => caseSensitive ? header : header.toLowerCase())),\n exclude: new Set(excludeHeaders.map(header => caseSensitive ? header : header.toLowerCase())),\n match: new Set(matchHeaders.map(header => caseSensitive ? header : header.toLowerCase()))\n }\n}\n\nconst crypto = runtimeFeatures.has('crypto')\n ? require('node:crypto')\n : null\n\n/**\n * @callback HashIdFunction\n * @param {string} value - The value to hash\n * @returns {string} - The base64url encoded hash of the value\n */\n\n/**\n * Generates a hash for a given value\n * @type {HashIdFunction}\n */\nconst hashId = crypto?.hash\n ? (value) => crypto.hash('sha256', value, 'base64url')\n : (value) => Buffer.from(value).toString('base64url')\n\n/**\n * @typedef {(url: string) => boolean} IsUrlExcluded Checks if a URL matches any of the exclude patterns\n */\n\n/** @typedef {{[key: Lowercase]: string}} NormalizedHeaders */\n/** @typedef {Array} UndiciHeaders */\n/** @typedef {Record} Headers */\n\n/**\n * @param {*} headers\n * @returns {headers is UndiciHeaders}\n */\nfunction isUndiciHeaders (headers) {\n return Array.isArray(headers) && (headers.length & 1) === 0\n}\n\n/**\n * Factory function to create a URL exclusion checker\n * @param {Array} [excludePatterns=[]] - Array of patterns to exclude\n * @returns {IsUrlExcluded} - A function that checks if a URL matches any of the exclude patterns\n */\nfunction isUrlExcludedFactory (excludePatterns = []) {\n if (excludePatterns.length === 0) {\n return () => false\n }\n\n return function isUrlExcluded (url) {\n let urlLowerCased\n\n for (const pattern of excludePatterns) {\n if (typeof pattern === 'string') {\n if (!urlLowerCased) {\n // Convert URL to lowercase only once\n urlLowerCased = url.toLowerCase()\n }\n // Simple string match (case-insensitive)\n if (urlLowerCased.includes(pattern.toLowerCase())) {\n return true\n }\n } else if (pattern instanceof RegExp) {\n // Regex pattern match\n if (pattern.test(url)) {\n return true\n }\n }\n }\n\n return false\n }\n}\n\n/**\n * Normalizes headers for consistent comparison\n *\n * @param {Object|UndiciHeaders} headers - Headers to normalize\n * @returns {NormalizedHeaders} - Normalized headers as a lowercase object\n */\nfunction normalizeHeaders (headers) {\n /** @type {NormalizedHeaders} */\n const normalizedHeaders = {}\n\n if (!headers) return normalizedHeaders\n\n // Handle array format (undici internal format: [name, value, name, value, ...])\n if (isUndiciHeaders(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i]\n const value = headers[i + 1]\n if (key && value !== undefined) {\n // Convert Buffers to strings if needed\n const keyStr = Buffer.isBuffer(key) ? key.toString() : key\n const valueStr = Buffer.isBuffer(value) ? value.toString() : value\n normalizedHeaders[keyStr.toLowerCase()] = valueStr\n }\n }\n return normalizedHeaders\n }\n\n // Handle object format\n if (headers && typeof headers === 'object') {\n for (const [key, value] of Object.entries(headers)) {\n if (key && typeof key === 'string') {\n normalizedHeaders[key.toLowerCase()] = Array.isArray(value) ? value.join(', ') : String(value)\n }\n }\n }\n\n return normalizedHeaders\n}\n\nconst validSnapshotModes = /** @type {const} */ (['record', 'playback', 'update'])\n\n/** @typedef {typeof validSnapshotModes[number]} SnapshotMode */\n\n/**\n * @param {*} mode - The snapshot mode to validate\n * @returns {asserts mode is SnapshotMode}\n */\nfunction validateSnapshotMode (mode) {\n if (!validSnapshotModes.includes(mode)) {\n throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(', ')}`)\n }\n}\n\nmodule.exports = {\n createHeaderFilters,\n hashId,\n isUndiciHeaders,\n normalizeHeaders,\n isUrlExcludedFactory,\n validateSnapshotMode\n}\n","'use strict'\n\nconst { writeFile, readFile, mkdir } = require('node:fs/promises')\nconst { dirname, resolve } = require('node:path')\nconst { setTimeout, clearTimeout } = require('node:timers')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst { hashId, isUrlExcludedFactory, normalizeHeaders, createHeaderFilters } = require('./snapshot-utils')\n\n/**\n * @typedef {Object} SnapshotRequestOptions\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} path - Request path\n * @property {string} origin - Request origin (base URL)\n * @property {import('./snapshot-utils').Headers|import('./snapshot-utils').UndiciHeaders} headers - Request headers\n * @property {import('./snapshot-utils').NormalizedHeaders} _normalizedHeaders - Request headers as a lowercase object\n * @property {string|Buffer} [body] - Request body (optional)\n */\n\n/**\n * @typedef {Object} SnapshotEntryRequest\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} url - Full URL of the request\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object\n * @property {string|Buffer} [body] - Request body (optional)\n */\n\n/**\n * @typedef {Object} SnapshotEntryResponse\n * @property {number} statusCode - HTTP status code of the response\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized response headers as a lowercase object\n * @property {string} body - Response body as a base64url encoded string\n * @property {Object} [trailers] - Optional response trailers\n */\n\n/**\n * @typedef {Object} SnapshotEntry\n * @property {SnapshotEntryRequest} request - The request object\n * @property {Array} responses - Array of response objects\n * @property {number} callCount - Number of times this snapshot has been called\n * @property {string} timestamp - ISO timestamp of when the snapshot was created\n */\n\n/**\n * @typedef {Object} SnapshotRecorderMatchOptions\n * @property {Array} [matchHeaders=[]] - Headers to match (empty array means match all headers)\n * @property {Array} [ignoreHeaders=[]] - Headers to ignore for matching\n * @property {Array} [excludeHeaders=[]] - Headers to exclude from matching\n * @property {boolean} [matchBody=true] - Whether to match request body\n * @property {boolean} [matchQuery=true] - Whether to match query properties\n * @property {boolean} [caseSensitive=false] - Whether header matching is case-sensitive\n */\n\n/**\n * @typedef {Object} SnapshotRecorderOptions\n * @property {string} [snapshotPath] - Path to save/load snapshots\n * @property {import('./snapshot-utils').SnapshotMode} [mode='record'] - Mode: 'record' or 'playback'\n * @property {number} [maxSnapshots=Infinity] - Maximum number of snapshots to keep\n * @property {boolean} [autoFlush=false] - Whether to automatically flush snapshots to disk\n * @property {number} [flushInterval=30000] - Auto-flush interval in milliseconds (default: 30 seconds)\n * @property {Array} [excludeUrls=[]] - URLs to exclude from recording\n * @property {function} [shouldRecord=null] - Function to filter requests for recording\n * @property {function} [shouldPlayback=null] - Function to filter requests\n */\n\n/**\n * @typedef {Object} SnapshotFormattedRequest\n * @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)\n * @property {string} url - Full URL of the request (with query parameters if matchQuery is true)\n * @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object\n * @property {string} body - Request body (optional, only if matchBody is true)\n */\n\n/**\n * @typedef {Object} SnapshotInfo\n * @property {string} hash - Hash key for the snapshot\n * @property {SnapshotEntryRequest} request - The request object\n * @property {number} responseCount - Number of responses recorded for this request\n * @property {number} callCount - Number of times this snapshot has been called\n * @property {string} timestamp - ISO timestamp of when the snapshot was created\n */\n\n/**\n * Formats a request for consistent snapshot storage\n * Caches normalized headers to avoid repeated processing\n *\n * @param {SnapshotRequestOptions} opts - Request options\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached header sets for performance\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers and body\n * @returns {SnapshotFormattedRequest} - Formatted request object\n */\nfunction formatRequestKey (opts, headerFilters, matchOptions = {}) {\n const url = new URL(opts.path, opts.origin)\n\n // Cache normalized headers if not already done\n const normalized = opts._normalizedHeaders || normalizeHeaders(opts.headers)\n if (!opts._normalizedHeaders) {\n opts._normalizedHeaders = normalized\n }\n\n return {\n method: opts.method || 'GET',\n url: matchOptions.matchQuery !== false ? url.toString() : `${url.origin}${url.pathname}`,\n headers: filterHeadersForMatching(normalized, headerFilters, matchOptions),\n body: matchOptions.matchBody !== false && opts.body ? String(opts.body) : ''\n }\n}\n\n/**\n * Filters headers based on matching configuration\n *\n * @param {import('./snapshot-utils').Headers} headers - Headers to filter\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers\n */\nfunction filterHeadersForMatching (headers, headerFilters, matchOptions = {}) {\n if (!headers || typeof headers !== 'object') return {}\n\n const {\n caseSensitive = false\n } = matchOptions\n\n const filtered = {}\n const { ignore, exclude, match } = headerFilters\n\n for (const [key, value] of Object.entries(headers)) {\n const headerKey = caseSensitive ? key : key.toLowerCase()\n\n // Skip if in exclude list (for security)\n if (exclude.has(headerKey)) continue\n\n // Skip if in ignore list (for matching)\n if (ignore.has(headerKey)) continue\n\n // If matchHeaders is specified, only include those headers\n if (match.size !== 0) {\n if (!match.has(headerKey)) continue\n }\n\n filtered[headerKey] = value\n }\n\n return filtered\n}\n\n/**\n * Filters headers for storage (only excludes sensitive headers)\n *\n * @param {import('./snapshot-utils').Headers} headers - Headers to filter\n * @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers\n * @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers\n */\nfunction filterHeadersForStorage (headers, headerFilters, matchOptions = {}) {\n if (!headers || typeof headers !== 'object') return {}\n\n const {\n caseSensitive = false\n } = matchOptions\n\n const filtered = {}\n const { exclude: excludeSet } = headerFilters\n\n for (const [key, value] of Object.entries(headers)) {\n const headerKey = caseSensitive ? key : key.toLowerCase()\n\n // Skip if in exclude list (for security)\n if (excludeSet.has(headerKey)) continue\n\n filtered[headerKey] = value\n }\n\n return filtered\n}\n\n/**\n * Creates a hash key for request matching\n * Properly orders headers to avoid conflicts and uses crypto hashing when available\n *\n * @param {SnapshotFormattedRequest} formattedRequest - Request object\n * @returns {string} - Base64url encoded hash of the request\n */\nfunction createRequestHash (formattedRequest) {\n const parts = [\n formattedRequest.method,\n formattedRequest.url\n ]\n\n // Process headers in a deterministic way to avoid conflicts\n if (formattedRequest.headers && typeof formattedRequest.headers === 'object') {\n const headerKeys = Object.keys(formattedRequest.headers).sort()\n for (const key of headerKeys) {\n const values = Array.isArray(formattedRequest.headers[key])\n ? formattedRequest.headers[key]\n : [formattedRequest.headers[key]]\n\n // Add header name\n parts.push(key)\n\n // Add all values for this header, sorted for consistency\n for (const value of values.sort()) {\n parts.push(String(value))\n }\n }\n }\n\n // Add body\n parts.push(formattedRequest.body)\n\n const content = parts.join('|')\n\n return hashId(content)\n}\n\nclass SnapshotRecorder {\n /** @type {NodeJS.Timeout | null} */\n #flushTimeout\n\n /** @type {import('./snapshot-utils').IsUrlExcluded} */\n #isUrlExcluded\n\n /** @type {Map} */\n #snapshots = new Map()\n\n /** @type {string|undefined} */\n #snapshotPath\n\n /** @type {number} */\n #maxSnapshots = Infinity\n\n /** @type {boolean} */\n #autoFlush = false\n\n /** @type {import('./snapshot-utils').HeaderFilters} */\n #headerFilters\n\n /**\n * Creates a new SnapshotRecorder instance\n * @param {SnapshotRecorderOptions&SnapshotRecorderMatchOptions} [options={}] - Configuration options for the recorder\n */\n constructor (options = {}) {\n this.#snapshotPath = options.snapshotPath\n this.#maxSnapshots = options.maxSnapshots || Infinity\n this.#autoFlush = options.autoFlush || false\n this.flushInterval = options.flushInterval || 30000 // 30 seconds default\n this._flushTimer = null\n\n // Matching configuration\n /** @type {Required} */\n this.matchOptions = {\n matchHeaders: options.matchHeaders || [], // empty means match all headers\n ignoreHeaders: options.ignoreHeaders || [],\n excludeHeaders: options.excludeHeaders || [],\n matchBody: options.matchBody !== false, // default: true\n matchQuery: options.matchQuery !== false, // default: true\n caseSensitive: options.caseSensitive || false\n }\n\n // Cache processed header sets to avoid recreating them on every request\n this.#headerFilters = createHeaderFilters(this.matchOptions)\n\n // Request filtering callbacks\n this.shouldRecord = options.shouldRecord || (() => true) // function(requestOpts) -> boolean\n this.shouldPlayback = options.shouldPlayback || (() => true) // function(requestOpts) -> boolean\n\n // URL pattern filtering\n this.#isUrlExcluded = isUrlExcludedFactory(options.excludeUrls) // Array of regex patterns or strings\n\n // Start auto-flush timer if enabled\n if (this.#autoFlush && this.#snapshotPath) {\n this.#startAutoFlush()\n }\n }\n\n /**\n * Records a request-response interaction\n * @param {SnapshotRequestOptions} requestOpts - Request options\n * @param {SnapshotEntryResponse} response - Response data to record\n * @return {Promise} - Resolves when the recording is complete\n */\n async record (requestOpts, response) {\n // Check if recording should be filtered out\n if (!this.shouldRecord(requestOpts)) {\n return // Skip recording\n }\n\n // Check URL exclusion patterns\n if (this.isUrlExcluded(requestOpts)) {\n return // Skip recording\n }\n\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n\n // Extract response data - always store body as base64\n const normalizedHeaders = normalizeHeaders(response.headers)\n\n /** @type {SnapshotEntryResponse} */\n const responseData = {\n statusCode: response.statusCode,\n headers: filterHeadersForStorage(normalizedHeaders, this.#headerFilters, this.matchOptions),\n body: Buffer.isBuffer(response.body)\n ? response.body.toString('base64')\n : Buffer.from(String(response.body || '')).toString('base64'),\n trailers: response.trailers\n }\n\n // Remove oldest snapshot if we exceed maxSnapshots limit\n if (this.#snapshots.size >= this.#maxSnapshots && !this.#snapshots.has(hash)) {\n const oldestKey = this.#snapshots.keys().next().value\n this.#snapshots.delete(oldestKey)\n }\n\n // Support sequential responses - if snapshot exists, add to responses array\n const existingSnapshot = this.#snapshots.get(hash)\n if (existingSnapshot && existingSnapshot.responses) {\n existingSnapshot.responses.push(responseData)\n existingSnapshot.timestamp = new Date().toISOString()\n } else {\n this.#snapshots.set(hash, {\n request,\n responses: [responseData], // Always store as array for consistency\n callCount: 0,\n timestamp: new Date().toISOString()\n })\n }\n\n // Auto-flush if enabled\n if (this.#autoFlush && this.#snapshotPath) {\n this.#scheduleFlush()\n }\n }\n\n /**\n * Checks if a URL should be excluded from recording/playback\n * @param {SnapshotRequestOptions} requestOpts - Request options to check\n * @returns {boolean} - True if URL is excluded\n */\n isUrlExcluded (requestOpts) {\n const url = new URL(requestOpts.path, requestOpts.origin).toString()\n return this.#isUrlExcluded(url)\n }\n\n /**\n * Finds a matching snapshot for the given request\n * Returns the appropriate response based on call count for sequential responses\n *\n * @param {SnapshotRequestOptions} requestOpts - Request options to match\n * @returns {SnapshotEntry&Record<'response', SnapshotEntryResponse>|undefined} - Matching snapshot response or undefined if not found\n */\n findSnapshot (requestOpts) {\n // Check if playback should be filtered out\n if (!this.shouldPlayback(requestOpts)) {\n return undefined // Skip playback\n }\n\n // Check URL exclusion patterns\n if (this.isUrlExcluded(requestOpts)) {\n return undefined // Skip playback\n }\n\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n const snapshot = this.#snapshots.get(hash)\n\n if (!snapshot) return undefined\n\n // Handle sequential responses\n const currentCallCount = snapshot.callCount || 0\n const responseIndex = Math.min(currentCallCount, snapshot.responses.length - 1)\n snapshot.callCount = currentCallCount + 1\n\n return {\n ...snapshot,\n response: snapshot.responses[responseIndex]\n }\n }\n\n /**\n * Loads snapshots from file\n * @param {string} [filePath] - Optional file path to load snapshots from\n * @return {Promise} - Resolves when snapshots are loaded\n */\n async loadSnapshots (filePath) {\n const path = filePath || this.#snapshotPath\n if (!path) {\n throw new InvalidArgumentError('Snapshot path is required')\n }\n\n try {\n const data = await readFile(resolve(path), 'utf8')\n const parsed = JSON.parse(data)\n\n // Convert array format back to Map\n if (Array.isArray(parsed)) {\n this.#snapshots.clear()\n for (const { hash, snapshot } of parsed) {\n this.#snapshots.set(hash, snapshot)\n }\n } else {\n // Legacy object format\n this.#snapshots = new Map(Object.entries(parsed))\n }\n } catch (error) {\n if (error.code === 'ENOENT') {\n // File doesn't exist yet - that's ok for recording mode\n this.#snapshots.clear()\n } else {\n throw new UndiciError(`Failed to load snapshots from ${path}`, { cause: error })\n }\n }\n }\n\n /**\n * Saves snapshots to file\n *\n * @param {string} [filePath] - Optional file path to save snapshots\n * @returns {Promise} - Resolves when snapshots are saved\n */\n async saveSnapshots (filePath) {\n const path = filePath || this.#snapshotPath\n if (!path) {\n throw new InvalidArgumentError('Snapshot path is required')\n }\n\n const resolvedPath = resolve(path)\n\n // Ensure directory exists\n await mkdir(dirname(resolvedPath), { recursive: true })\n\n // Convert Map to serializable format\n const data = Array.from(this.#snapshots.entries()).map(([hash, snapshot]) => ({\n hash,\n snapshot\n }))\n\n await writeFile(resolvedPath, JSON.stringify(data, null, 2), { flush: true })\n }\n\n /**\n * Clears all recorded snapshots\n * @returns {void}\n */\n clear () {\n this.#snapshots.clear()\n }\n\n /**\n * Gets all recorded snapshots\n * @return {Array} - Array of all recorded snapshots\n */\n getSnapshots () {\n return Array.from(this.#snapshots.values())\n }\n\n /**\n * Gets snapshot count\n * @return {number} - Number of recorded snapshots\n */\n size () {\n return this.#snapshots.size\n }\n\n /**\n * Resets call counts for all snapshots (useful for test cleanup)\n * @returns {void}\n */\n resetCallCounts () {\n for (const snapshot of this.#snapshots.values()) {\n snapshot.callCount = 0\n }\n }\n\n /**\n * Deletes a specific snapshot by request options\n * @param {SnapshotRequestOptions} requestOpts - Request options to match\n * @returns {boolean} - True if snapshot was deleted, false if not found\n */\n deleteSnapshot (requestOpts) {\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n return this.#snapshots.delete(hash)\n }\n\n /**\n * Gets information about a specific snapshot\n * @param {SnapshotRequestOptions} requestOpts - Request options to match\n * @returns {SnapshotInfo|null} - Snapshot information or null if not found\n */\n getSnapshotInfo (requestOpts) {\n const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)\n const hash = createRequestHash(request)\n const snapshot = this.#snapshots.get(hash)\n\n if (!snapshot) return null\n\n return {\n hash,\n request: snapshot.request,\n responseCount: snapshot.responses ? snapshot.responses.length : (snapshot.response ? 1 : 0), // .response for legacy snapshots\n callCount: snapshot.callCount || 0,\n timestamp: snapshot.timestamp\n }\n }\n\n /**\n * Replaces all snapshots with new data (full replacement)\n * @param {Array<{hash: string; snapshot: SnapshotEntry}>|Record} snapshotData - New snapshot data to replace existing ones\n * @returns {void}\n */\n replaceSnapshots (snapshotData) {\n this.#snapshots.clear()\n\n if (Array.isArray(snapshotData)) {\n for (const { hash, snapshot } of snapshotData) {\n this.#snapshots.set(hash, snapshot)\n }\n } else if (snapshotData && typeof snapshotData === 'object') {\n // Legacy object format\n this.#snapshots = new Map(Object.entries(snapshotData))\n }\n }\n\n /**\n * Starts the auto-flush timer\n * @returns {void}\n */\n #startAutoFlush () {\n return this.#scheduleFlush()\n }\n\n /**\n * Stops the auto-flush timer\n * @returns {void}\n */\n #stopAutoFlush () {\n if (this.#flushTimeout) {\n clearTimeout(this.#flushTimeout)\n // Ensure any pending flush is completed\n this.saveSnapshots().catch(() => {\n // Ignore flush errors\n })\n this.#flushTimeout = null\n }\n }\n\n /**\n * Schedules a flush (debounced to avoid excessive writes)\n */\n #scheduleFlush () {\n this.#flushTimeout = setTimeout(() => {\n this.saveSnapshots().catch(() => {\n // Ignore flush errors\n })\n if (this.#autoFlush) {\n this.#flushTimeout?.refresh()\n } else {\n this.#flushTimeout = null\n }\n }, 1000) // 1 second debounce\n }\n\n /**\n * Cleanup method to stop timers\n * @returns {void}\n */\n destroy () {\n this.#stopAutoFlush()\n if (this.#flushTimeout) {\n clearTimeout(this.#flushTimeout)\n this.#flushTimeout = null\n }\n }\n\n /**\n * Async close method that saves all recordings and performs cleanup\n * @returns {Promise}\n */\n async close () {\n // Save any pending recordings if we have a snapshot path\n if (this.#snapshotPath && this.#snapshots.size !== 0) {\n await this.saveSnapshots()\n }\n\n // Perform cleanup\n this.destroy()\n }\n}\n\nmodule.exports = { SnapshotRecorder, formatRequestKey, createRequestHash, filterHeadersForMatching, filterHeadersForStorage, createHeaderFilters }\n","'use strict'\n\nconst Agent = require('../dispatcher/agent')\nconst MockAgent = require('./mock-agent')\nconst { SnapshotRecorder } = require('./snapshot-recorder')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst util = require('../core/util')\nconst { validateSnapshotMode } = require('./snapshot-utils')\n\nconst kSnapshotRecorder = Symbol('kSnapshotRecorder')\nconst kSnapshotMode = Symbol('kSnapshotMode')\nconst kSnapshotPath = Symbol('kSnapshotPath')\nconst kSnapshotLoaded = Symbol('kSnapshotLoaded')\nconst kRealAgent = Symbol('kRealAgent')\n\n// Static flag to ensure warning is only emitted once per process\nlet warningEmitted = false\n\nclass SnapshotAgent extends MockAgent {\n constructor (opts = {}) {\n // Emit experimental warning only once\n if (!warningEmitted) {\n process.emitWarning(\n 'SnapshotAgent is experimental and subject to change',\n 'ExperimentalWarning'\n )\n warningEmitted = true\n }\n\n const {\n mode = 'record',\n snapshotPath = null,\n ...mockAgentOpts\n } = opts\n\n super(mockAgentOpts)\n\n validateSnapshotMode(mode)\n\n // Validate snapshotPath is provided when required\n if ((mode === 'playback' || mode === 'update') && !snapshotPath) {\n throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`)\n }\n\n this[kSnapshotMode] = mode\n this[kSnapshotPath] = snapshotPath\n\n this[kSnapshotRecorder] = new SnapshotRecorder({\n snapshotPath: this[kSnapshotPath],\n mode: this[kSnapshotMode],\n maxSnapshots: opts.maxSnapshots,\n autoFlush: opts.autoFlush,\n flushInterval: opts.flushInterval,\n matchHeaders: opts.matchHeaders,\n ignoreHeaders: opts.ignoreHeaders,\n excludeHeaders: opts.excludeHeaders,\n matchBody: opts.matchBody,\n matchQuery: opts.matchQuery,\n caseSensitive: opts.caseSensitive,\n shouldRecord: opts.shouldRecord,\n shouldPlayback: opts.shouldPlayback,\n excludeUrls: opts.excludeUrls\n })\n this[kSnapshotLoaded] = false\n\n // For recording/update mode, we need a real agent to make actual requests\n // For playback mode, we need a real agent if there are excluded URLs\n if (this[kSnapshotMode] === 'record' || this[kSnapshotMode] === 'update' ||\n (this[kSnapshotMode] === 'playback' && opts.excludeUrls && opts.excludeUrls.length > 0)) {\n this[kRealAgent] = new Agent(opts)\n }\n\n // Auto-load snapshots in playback/update mode\n if ((this[kSnapshotMode] === 'playback' || this[kSnapshotMode] === 'update') && this[kSnapshotPath]) {\n this.loadSnapshots().catch(() => {\n // Ignore load errors - file might not exist yet\n })\n }\n }\n\n dispatch (opts, handler) {\n const mode = this[kSnapshotMode]\n\n // Check if URL should be excluded (pass through without mocking/recording)\n if (this[kSnapshotRecorder].isUrlExcluded(opts)) {\n // Real agent is guaranteed by constructor when excludeUrls is configured\n return this[kRealAgent].dispatch(opts, handler)\n }\n\n if (mode === 'playback' || mode === 'update') {\n // Ensure snapshots are loaded\n if (!this[kSnapshotLoaded]) {\n // Need to load asynchronously, delegate to async version\n return this.#asyncDispatch(opts, handler)\n }\n\n // Try to find existing snapshot (synchronous)\n const snapshot = this[kSnapshotRecorder].findSnapshot(opts)\n\n if (snapshot) {\n // Use recorded response (synchronous)\n return this.#replaySnapshot(snapshot, handler)\n } else if (mode === 'update') {\n // Make real request and record it (async required)\n return this.#recordAndReplay(opts, handler)\n } else {\n // Playback mode but no snapshot found\n const error = new UndiciError(`No snapshot found for ${opts.method || 'GET'} ${opts.path}`)\n if (handler.onResponseError) {\n handler.onResponseError(null, error)\n return\n }\n throw error\n }\n } else if (mode === 'record') {\n // Record mode - make real request and save response (async required)\n return this.#recordAndReplay(opts, handler)\n }\n }\n\n /**\n * Async version of dispatch for when we need to load snapshots first\n */\n async #asyncDispatch (opts, handler) {\n await this.loadSnapshots()\n return this.dispatch(opts, handler)\n }\n\n /**\n * Records a real request and replays the response\n */\n #recordAndReplay (opts, handler) {\n const responseData = {\n statusCode: null,\n headers: {},\n trailers: {},\n body: []\n }\n\n const self = this // Capture 'this' context for use within nested handler callbacks\n\n const recordingHandler = {\n onRequestStart (controller, context) {\n return handler.onRequestStart(controller, { ...context, history: this.history })\n },\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n return handler.onRequestUpgrade(controller, statusCode, headers, socket)\n },\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n responseData.statusCode = statusCode\n responseData.headers = headers\n return handler.onResponseStart(controller, statusCode, headers, statusMessage)\n },\n\n onResponseData (controller, chunk) {\n responseData.body.push(chunk)\n return handler.onResponseData(controller, chunk)\n },\n\n onResponseEnd (controller, trailers) {\n responseData.trailers = trailers\n\n // Record the interaction using captured 'self' context (fire and forget)\n const responseBody = Buffer.concat(responseData.body)\n self[kSnapshotRecorder].record(opts, {\n statusCode: responseData.statusCode,\n headers: responseData.headers,\n body: responseBody,\n trailers: responseData.trailers\n })\n .then(() => handler.onResponseEnd(controller, trailers))\n .catch((error) => handler.onResponseError(controller, error))\n },\n\n onResponseError (controller, error) {\n return handler.onResponseError(controller, error)\n }\n }\n\n // Use composed agent if available (includes interceptors), otherwise use real agent\n const agent = this[kRealAgent]\n return agent.dispatch(opts, recordingHandler)\n }\n\n /**\n * Replays a recorded response\n *\n * @param {Object} snapshot - The recorded snapshot to replay.\n * @param {Object} handler - The handler to call with the response data.\n * @returns {void}\n */\n #replaySnapshot (snapshot, handler) {\n try {\n const { response } = snapshot\n\n const rawHeaders = response.headers ? util.toRawHeaders(response.headers) : []\n const rawTrailers = response.trailers ? util.toRawHeaders(response.trailers) : []\n\n const controller = {\n rawHeaders,\n rawTrailers,\n pause () { },\n resume () { },\n abort (reason) {\n this.aborted = true\n this.reason = reason\n },\n\n aborted: false,\n paused: false\n }\n\n handler.onRequestStart(controller)\n\n handler.onResponseStart(controller, response.statusCode, response.headers, response.statusMessage)\n\n // Body is always stored as base64 string\n const body = Buffer.from(response.body, 'base64')\n handler.onResponseData(controller, body)\n\n handler.onResponseEnd(controller, response.trailers)\n } catch (error) {\n handler.onResponseError?.(null, error)\n }\n }\n\n /**\n * Loads snapshots from file\n *\n * @param {string} [filePath] - Optional file path to load snapshots from.\n * @returns {Promise} - Resolves when snapshots are loaded.\n */\n async loadSnapshots (filePath) {\n await this[kSnapshotRecorder].loadSnapshots(filePath || this[kSnapshotPath])\n this[kSnapshotLoaded] = true\n\n // In playback mode, set up MockAgent interceptors for all snapshots\n if (this[kSnapshotMode] === 'playback') {\n this.#setupMockInterceptors()\n }\n }\n\n /**\n * Saves snapshots to file\n *\n * @param {string} [filePath] - Optional file path to save snapshots to.\n * @returns {Promise} - Resolves when snapshots are saved.\n */\n async saveSnapshots (filePath) {\n return this[kSnapshotRecorder].saveSnapshots(filePath || this[kSnapshotPath])\n }\n\n /**\n * Sets up MockAgent interceptors based on recorded snapshots.\n *\n * This method creates MockAgent interceptors for each recorded snapshot,\n * allowing the SnapshotAgent to fall back to MockAgent's standard intercept\n * mechanism in playback mode. Each interceptor is configured to persist\n * (remain active for multiple requests) and responds with the recorded\n * response data.\n *\n * Called automatically when loading snapshots in playback mode.\n *\n * @returns {void}\n */\n #setupMockInterceptors () {\n for (const snapshot of this[kSnapshotRecorder].getSnapshots()) {\n const { request, responses, response } = snapshot\n const url = new URL(request.url)\n\n const mockPool = this.get(url.origin)\n\n // Handle both new format (responses array) and legacy format (response object)\n const responseData = responses ? responses[0] : response\n if (!responseData) continue\n\n mockPool.intercept({\n path: url.pathname + url.search,\n method: request.method,\n headers: request.headers,\n body: request.body\n }).reply(responseData.statusCode, responseData.body, {\n headers: responseData.headers,\n trailers: responseData.trailers\n }).persist()\n }\n }\n\n /**\n * Gets the snapshot recorder\n * @return {SnapshotRecorder} - The snapshot recorder instance\n */\n getRecorder () {\n return this[kSnapshotRecorder]\n }\n\n /**\n * Gets the current mode\n * @return {import('./snapshot-utils').SnapshotMode} - The current snapshot mode\n */\n getMode () {\n return this[kSnapshotMode]\n }\n\n /**\n * Clears all snapshots\n * @returns {void}\n */\n clearSnapshots () {\n this[kSnapshotRecorder].clear()\n }\n\n /**\n * Resets call counts for all snapshots (useful for test cleanup)\n * @returns {void}\n */\n resetCallCounts () {\n this[kSnapshotRecorder].resetCallCounts()\n }\n\n /**\n * Deletes a specific snapshot by request options\n * @param {import('./snapshot-recorder').SnapshotRequestOptions} requestOpts - Request options to identify the snapshot\n * @return {Promise} - Returns true if the snapshot was deleted, false if not found\n */\n deleteSnapshot (requestOpts) {\n return this[kSnapshotRecorder].deleteSnapshot(requestOpts)\n }\n\n /**\n * Gets information about a specific snapshot\n * @returns {import('./snapshot-recorder').SnapshotInfo|null} - Snapshot information or null if not found\n */\n getSnapshotInfo (requestOpts) {\n return this[kSnapshotRecorder].getSnapshotInfo(requestOpts)\n }\n\n /**\n * Replaces all snapshots with new data (full replacement)\n * @param {Array<{hash: string; snapshot: import('./snapshot-recorder').SnapshotEntryshotEntry}>|Record} snapshotData - New snapshot data to replace existing snapshots\n * @returns {void}\n */\n replaceSnapshots (snapshotData) {\n this[kSnapshotRecorder].replaceSnapshots(snapshotData)\n }\n\n /**\n * Closes the agent, saving snapshots and cleaning up resources.\n *\n * @returns {Promise}\n */\n async close () {\n await this[kSnapshotRecorder].close()\n await this[kRealAgent]?.close()\n await super.close()\n }\n}\n\nmodule.exports = SnapshotAgent\n","'use strict'\n\n// We include a version number for the Dispatcher API. In case of breaking changes,\n// this version number must be increased to avoid conflicts.\nconst globalDispatcher = Symbol.for('undici.globalDispatcher.2')\nconst legacyGlobalDispatcher = Symbol.for('undici.globalDispatcher.1')\nconst { InvalidArgumentError } = require('./core/errors')\nconst Agent = require('./dispatcher/agent')\nconst Dispatcher1Wrapper = require('./dispatcher/dispatcher1-wrapper')\n\nif (getGlobalDispatcher() === undefined) {\n setGlobalDispatcher(new Agent())\n}\n\nfunction setGlobalDispatcher (agent) {\n if (!agent || typeof agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument agent must implement Agent')\n }\n\n Object.defineProperty(globalThis, globalDispatcher, {\n value: agent,\n writable: true,\n enumerable: false,\n configurable: false\n })\n\n const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent)\n\n Object.defineProperty(globalThis, legacyGlobalDispatcher, {\n value: legacyAgent,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nfunction getGlobalDispatcher () {\n return globalThis[globalDispatcher]\n}\n\n// These are the globals that can be installed by undici.install().\n// Not exported by index.js to avoid use outside of this module.\nconst installedExports = /** @type {const} */ (\n [\n 'fetch',\n 'Headers',\n 'Response',\n 'Request',\n 'FormData',\n 'WebSocket',\n 'CloseEvent',\n 'ErrorEvent',\n 'MessageEvent',\n 'EventSource'\n ]\n)\n\nmodule.exports = {\n setGlobalDispatcher,\n getGlobalDispatcher,\n installedExports\n}\n","'use strict'\n\nconst assert = require('node:assert')\n\n/**\n * @deprecated\n */\nmodule.exports = class DecoratorHandler {\n #handler\n #onCompleteCalled = false\n #onErrorCalled = false\n #onResponseStartCalled = false\n\n constructor (handler) {\n if (typeof handler !== 'object' || handler === null) {\n throw new TypeError('handler must be an object')\n }\n this.#handler = handler\n }\n\n onRequestStart (...args) {\n this.#handler.onRequestStart?.(...args)\n }\n\n onRequestUpgrade (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n\n return this.#handler.onRequestUpgrade?.(...args)\n }\n\n onResponseStart (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n assert(!this.#onResponseStartCalled)\n\n this.#onResponseStartCalled = true\n\n return this.#handler.onResponseStart?.(...args)\n }\n\n onResponseData (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n\n return this.#handler.onResponseData?.(...args)\n }\n\n onResponseEnd (...args) {\n assert(!this.#onCompleteCalled)\n assert(!this.#onErrorCalled)\n\n this.#onCompleteCalled = true\n return this.#handler.onResponseEnd?.(...args)\n }\n\n onResponseError (...args) {\n this.#onErrorCalled = true\n return this.#handler.onResponseError?.(...args)\n }\n\n /**\n * @deprecated\n */\n onBodySent () {}\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst assert = require('node:assert')\nconst { InvalidArgumentError } = require('../core/errors')\n\nconst redirectableStatusCodes = [300, 301, 302, 303, 307, 308]\n\nconst noop = () => {}\n\nclass RedirectHandler {\n static buildDispatch (dispatcher, maxRedirections) {\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n const dispatch = dispatcher.dispatch.bind(dispatcher)\n return (opts, originalHandler) => dispatch(opts, new RedirectHandler(dispatch, maxRedirections, opts, originalHandler))\n }\n\n constructor (dispatch, maxRedirections, opts, handler) {\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n this.dispatch = dispatch\n this.location = null\n const { maxRedirections: _, ...cleanOpts } = opts\n this.opts = cleanOpts // opts must be a copy, exclude maxRedirections\n this.opts.body = util.wrapRequestBody(this.opts.body)\n this.maxRedirections = maxRedirections\n this.handler = handler\n this.history = []\n }\n\n onRequestStart (controller, context) {\n this.handler.onRequestStart?.(controller, { ...context, history: this.history })\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {\n throw new Error('max redirects')\n }\n\n // https://tools.ietf.org/html/rfc7231#section-6.4.2\n // https://fetch.spec.whatwg.org/#http-redirect-fetch\n // In case of HTTP 301 or 302 with POST, change the method to GET\n if ((statusCode === 301 || statusCode === 302) && this.opts.method === 'POST') {\n this.opts.method = 'GET'\n if (util.isStream(this.opts.body)) {\n util.destroy(this.opts.body.on('error', noop))\n }\n this.opts.body = null\n }\n\n // https://tools.ietf.org/html/rfc7231#section-6.4.4\n // In case of HTTP 303, always replace method to be either HEAD or GET\n if (statusCode === 303 && this.opts.method !== 'HEAD') {\n this.opts.method = 'GET'\n if (util.isStream(this.opts.body)) {\n util.destroy(this.opts.body.on('error', noop))\n }\n this.opts.body = null\n }\n\n this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) || redirectableStatusCodes.indexOf(statusCode) === -1\n ? null\n : headers.location\n\n if (this.opts.origin) {\n this.history.push(new URL(this.opts.path, this.opts.origin))\n }\n\n if (!this.location) {\n this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n return\n }\n\n const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))\n const path = search ? `${pathname}${search}` : pathname\n\n // Check for redirect loops by seeing if we've already visited this URL in our history\n // This catches the case where Client/Pool try to handle cross-origin redirects but fail\n // and keep redirecting to the same URL in an infinite loop\n const redirectUrlString = `${origin}${path}`\n for (const historyUrl of this.history) {\n if (historyUrl.toString() === redirectUrlString) {\n throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`)\n }\n }\n\n // Remove headers referring to the original URL.\n // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.\n // https://tools.ietf.org/html/rfc7231#section-6.4\n this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)\n this.opts.path = path\n this.opts.origin = origin\n this.opts.query = null\n }\n\n onResponseData (controller, chunk) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response bodies.\n\n Redirection is used to serve the requested resource from another URL, so it assumes that\n no body is generated (and thus can be ignored). Even though generating a body is not prohibited.\n\n For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually\n (which means it's optional and not mandated) contain just an hyperlink to the value of\n the Location response header, so the body can be ignored safely.\n\n For status 300, which is \"Multiple Choices\", the spec mentions both generating a Location\n response header AND a response body with the other possible location to follow.\n Since the spec explicitly chooses not to specify a format for such body and leave it to\n servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it.\n */\n } else {\n this.handler.onResponseData?.(controller, chunk)\n }\n }\n\n onResponseEnd (controller, trailers) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections\n and neither are useful if present.\n\n See comment on onData method above for more detailed information.\n */\n this.dispatch(this.opts, this)\n } else {\n this.handler.onResponseEnd(controller, trailers)\n }\n }\n\n onResponseError (controller, error) {\n this.handler.onResponseError?.(controller, error)\n }\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4.4\nfunction shouldRemoveHeader (header, removeContent, unknownOrigin) {\n if (header.length === 4) {\n return util.headerNameToString(header) === 'host'\n }\n if (removeContent && util.headerNameToString(header).startsWith('content-')) {\n return true\n }\n if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) {\n const name = util.headerNameToString(header)\n return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization'\n }\n return false\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4\nfunction cleanRequestHeaders (headers, removeContent, unknownOrigin) {\n const ret = []\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {\n ret.push(headers[i], headers[i + 1])\n }\n }\n } else if (headers && typeof headers === 'object') {\n const entries = util.hasSafeIterator(headers) ? headers : Object.entries(headers)\n\n for (const [key, value] of entries) {\n if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {\n ret.push(key, value)\n }\n }\n } else {\n assert(headers == null, 'headers must be an object or an array')\n }\n return ret\n}\n\nmodule.exports = RedirectHandler\n","'use strict'\n\nconst RedirectHandler = require('../handler/redirect-handler')\n\nfunction createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections } = {}) {\n return (dispatch) => {\n return function Intercept (opts, handler) {\n const { maxRedirections = defaultMaxRedirections, ...rest } = opts\n\n if (maxRedirections == null || maxRedirections === 0) {\n return dispatch(opts, handler)\n }\n\n const dispatchOpts = { ...rest } // Stop sub dispatcher from also redirecting.\n const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler)\n return dispatch(dispatchOpts, redirectHandler)\n }\n }\n}\n\nmodule.exports = createRedirectInterceptor\n","'use strict'\n\n// const { parseHeaders } = require('../core/util')\nconst DecoratorHandler = require('../handler/decorator-handler')\nconst { ResponseError } = require('../core/errors')\n\nclass ResponseErrorHandler extends DecoratorHandler {\n #statusCode\n #contentType\n #decoder\n #headers\n #body\n\n constructor (_opts, { handler }) {\n super(handler)\n }\n\n #checkContentType (contentType) {\n return (this.#contentType ?? '').indexOf(contentType) === 0\n }\n\n onRequestStart (controller, context) {\n this.#statusCode = 0\n this.#contentType = null\n this.#decoder = null\n this.#headers = null\n this.#body = ''\n\n return super.onRequestStart(controller, context)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n this.#statusCode = statusCode\n this.#headers = headers\n this.#contentType = headers['content-type']\n\n if (this.#statusCode < 400) {\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n if (this.#checkContentType('application/json') || this.#checkContentType('text/plain')) {\n this.#decoder = new TextDecoder('utf-8')\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.#statusCode < 400) {\n return super.onResponseData(controller, chunk)\n }\n\n this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? ''\n }\n\n onResponseEnd (controller, trailers) {\n if (this.#statusCode >= 400) {\n this.#body += this.#decoder?.decode(undefined, { stream: false }) ?? ''\n\n if (this.#checkContentType('application/json')) {\n try {\n this.#body = JSON.parse(this.#body)\n } catch {\n // Do nothing...\n }\n }\n\n let err\n const stackTraceLimit = Error.stackTraceLimit\n Error.stackTraceLimit = 0\n try {\n err = new ResponseError('Response Error', this.#statusCode, {\n body: this.#body,\n headers: this.#headers\n })\n } finally {\n Error.stackTraceLimit = stackTraceLimit\n }\n\n super.onResponseError(controller, err)\n } else {\n super.onResponseEnd(controller, trailers)\n }\n }\n\n onResponseError (controller, err) {\n super.onResponseError(controller, err)\n }\n}\n\nmodule.exports = () => {\n return (dispatch) => {\n return function Intercept (opts, handler) {\n return dispatch(opts, new ResponseErrorHandler(opts, { handler }))\n }\n }\n}\n","'use strict'\nconst RetryHandler = require('../handler/retry-handler')\n\nmodule.exports = globalOpts => {\n return dispatch => {\n return function retryInterceptor (opts, handler) {\n return dispatch(\n opts,\n new RetryHandler(\n { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } },\n {\n handler,\n dispatch\n }\n )\n )\n }\n }\n}\n","'use strict'\n\nconst { InvalidArgumentError, RequestAbortedError } = require('../core/errors')\nconst DecoratorHandler = require('../handler/decorator-handler')\n\nclass DumpHandler extends DecoratorHandler {\n #maxSize = 1024 * 1024\n #dumped = false\n #size = 0\n #controller = null\n aborted = false\n reason = false\n\n constructor ({ maxSize, signal }, handler) {\n if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) {\n throw new InvalidArgumentError('maxSize must be a number greater than 0')\n }\n\n super(handler)\n\n this.#maxSize = maxSize ?? this.#maxSize\n // this.#handler = handler\n }\n\n #abort (reason) {\n this.aborted = true\n this.reason = reason\n }\n\n onRequestStart (controller, context) {\n controller.abort = this.#abort.bind(this)\n this.#controller = controller\n\n return super.onRequestStart(controller, context)\n }\n\n onResponseStart (controller, statusCode, headers, statusMessage) {\n const contentLength = headers['content-length']\n\n if (contentLength != null && contentLength > this.#maxSize) {\n throw new RequestAbortedError(\n `Response size (${contentLength}) larger than maxSize (${\n this.#maxSize\n })`\n )\n }\n\n if (this.aborted === true) {\n return true\n }\n\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n onResponseError (controller, err) {\n if (this.#dumped) {\n return\n }\n\n // On network errors before connect, controller will be null\n err = this.#controller?.reason ?? err\n\n super.onResponseError(controller, err)\n }\n\n onResponseData (controller, chunk) {\n this.#size = this.#size + chunk.length\n\n if (this.#size >= this.#maxSize) {\n this.#dumped = true\n\n if (this.aborted === true) {\n super.onResponseError(controller, this.reason)\n } else {\n super.onResponseEnd(controller, {})\n }\n }\n\n return true\n }\n\n onResponseEnd (controller, trailers) {\n if (this.#dumped) {\n return\n }\n\n if (this.#controller.aborted === true) {\n super.onResponseError(controller, this.reason)\n return\n }\n\n super.onResponseEnd(controller, trailers)\n }\n}\n\nfunction createDumpInterceptor (\n { maxSize: defaultMaxSize } = {\n maxSize: 1024 * 1024\n }\n) {\n return dispatch => {\n return function Intercept (opts, handler) {\n const { dumpMaxSize = defaultMaxSize } = opts\n\n const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal }, handler)\n\n return dispatch(opts, dumpHandler)\n }\n }\n}\n\nmodule.exports = createDumpInterceptor\n","'use strict'\nconst { isIP } = require('node:net')\nconst { lookup } = require('node:dns')\nconst DecoratorHandler = require('../handler/decorator-handler')\nconst { InvalidArgumentError, InformationalError } = require('../core/errors')\nconst maxInt = Math.pow(2, 31) - 1\n\nfunction hasSafeIterator (headers) {\n const prototype = Object.getPrototypeOf(headers)\n const ownIterator = Object.hasOwn(headers, Symbol.iterator)\n return ownIterator || (prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === 'function')\n}\n\nfunction isHostHeader (key) {\n return typeof key === 'string' && key.toLowerCase() === 'host'\n}\n\nfunction normalizeHeaders (headers) {\n if (headers == null) {\n return null\n }\n\n if (Array.isArray(headers)) {\n if (headers.length === 0 || !Array.isArray(headers[0])) {\n return headers\n }\n\n const normalized = []\n for (const header of headers) {\n if (Array.isArray(header) && header.length === 2) {\n normalized.push(header[0], header[1])\n } else {\n normalized.push(header)\n }\n }\n\n return normalized\n }\n\n if (typeof headers === 'object' && hasSafeIterator(headers)) {\n const normalized = []\n for (const header of headers) {\n if (Array.isArray(header) && header.length === 2) {\n normalized.push(header[0], header[1])\n } else {\n normalized.push(header)\n }\n }\n\n return normalized\n }\n\n return headers\n}\n\nfunction hasHostHeader (headers) {\n if (headers == null) {\n return false\n }\n\n if (Array.isArray(headers)) {\n if (headers.length === 0) {\n return false\n }\n\n for (let i = 0; i < headers.length; i += 2) {\n if (isHostHeader(headers[i])) {\n return true\n }\n }\n\n return false\n }\n\n if (typeof headers === 'object') {\n for (const key in headers) {\n if (isHostHeader(key)) {\n return true\n }\n }\n }\n\n return false\n}\n\nfunction withHostHeader (host, headers) {\n const normalizedHeaders = normalizeHeaders(headers)\n\n if (hasHostHeader(normalizedHeaders)) {\n return normalizedHeaders\n }\n\n if (Array.isArray(normalizedHeaders)) {\n return ['host', host, ...normalizedHeaders]\n }\n\n if (normalizedHeaders && typeof normalizedHeaders === 'object') {\n return {\n host,\n ...normalizedHeaders\n }\n }\n\n return { host }\n}\n\nclass DNSStorage {\n #maxItems = 0\n #records = new Map()\n\n constructor (opts) {\n this.#maxItems = opts.maxItems\n }\n\n get size () {\n return this.#records.size\n }\n\n get (hostname) {\n return this.#records.get(hostname) ?? null\n }\n\n set (hostname, records) {\n this.#records.set(hostname, records)\n }\n\n delete (hostname) {\n this.#records.delete(hostname)\n }\n\n // Delegate to storage decide can we do more lookups or not\n full () {\n return this.size >= this.#maxItems\n }\n}\n\nclass DNSInstance {\n #maxTTL = 0\n #maxItems = 0\n dualStack = true\n affinity = null\n lookup = null\n pick = null\n storage = null\n\n constructor (opts) {\n this.#maxTTL = opts.maxTTL\n this.#maxItems = opts.maxItems\n this.dualStack = opts.dualStack\n this.affinity = opts.affinity\n this.lookup = opts.lookup ?? this.#defaultLookup\n this.pick = opts.pick ?? this.#defaultPick\n this.storage = opts.storage ?? new DNSStorage(opts)\n }\n\n runLookup (origin, opts, cb) {\n const ips = this.storage.get(origin.hostname)\n\n // If full, we just return the origin\n if (ips == null && this.storage.full()) {\n cb(null, origin)\n return\n }\n\n const newOpts = {\n affinity: this.affinity,\n dualStack: this.dualStack,\n lookup: this.lookup,\n pick: this.pick,\n ...opts.dns,\n maxTTL: this.#maxTTL,\n maxItems: this.#maxItems\n }\n\n // If no IPs we lookup\n if (ips == null) {\n this.lookup(origin, newOpts, (err, addresses) => {\n if (err || addresses == null || addresses.length === 0) {\n cb(err ?? new InformationalError('No DNS entries found'))\n return\n }\n\n this.setRecords(origin, addresses)\n const records = this.storage.get(origin.hostname)\n\n const ip = this.pick(\n origin,\n records,\n newOpts.affinity\n )\n\n let port\n if (typeof ip.port === 'number') {\n port = `:${ip.port}`\n } else if (origin.port !== '') {\n port = `:${origin.port}`\n } else {\n port = ''\n }\n\n cb(\n null,\n new URL(`${origin.protocol}//${\n ip.family === 6 ? `[${ip.address}]` : ip.address\n }${port}`)\n )\n })\n } else {\n // If there's IPs we pick\n const ip = this.pick(\n origin,\n ips,\n newOpts.affinity\n )\n\n // If no IPs we lookup - deleting old records\n if (ip == null) {\n this.storage.delete(origin.hostname)\n this.runLookup(origin, opts, cb)\n return\n }\n\n let port\n if (typeof ip.port === 'number') {\n port = `:${ip.port}`\n } else if (origin.port !== '') {\n port = `:${origin.port}`\n } else {\n port = ''\n }\n\n cb(\n null,\n new URL(`${origin.protocol}//${\n ip.family === 6 ? `[${ip.address}]` : ip.address\n }${port}`)\n )\n }\n }\n\n #defaultLookup (origin, opts, cb) {\n lookup(\n origin.hostname,\n {\n all: true,\n family: this.dualStack === false ? this.affinity : 0,\n order: 'ipv4first'\n },\n (err, addresses) => {\n if (err) {\n return cb(err)\n }\n\n const results = new Map()\n\n for (const addr of addresses) {\n // On linux we found duplicates, we attempt to remove them with\n // the latest record\n results.set(`${addr.address}:${addr.family}`, addr)\n }\n\n cb(null, results.values())\n }\n )\n }\n\n #defaultPick (origin, hostnameRecords, affinity) {\n let ip = null\n const { records, offset } = hostnameRecords\n\n let family\n if (this.dualStack) {\n if (affinity == null) {\n // Balance between ip families\n if (offset == null || offset === maxInt) {\n hostnameRecords.offset = 0\n affinity = 4\n } else {\n hostnameRecords.offset++\n affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4\n }\n }\n\n if (records[affinity] != null && records[affinity].ips.length > 0) {\n family = records[affinity]\n } else {\n family = records[affinity === 4 ? 6 : 4]\n }\n } else {\n family = records[affinity]\n }\n\n // If no IPs we return null\n if (family == null || family.ips.length === 0) {\n return ip\n }\n\n if (family.offset == null || family.offset === maxInt) {\n family.offset = 0\n } else {\n family.offset++\n }\n\n const position = family.offset % family.ips.length\n ip = family.ips[position] ?? null\n\n if (ip == null) {\n return ip\n }\n\n if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms\n // We delete expired records\n // It is possible that they have different TTL, so we manage them individually\n family.ips.splice(position, 1)\n return this.pick(origin, hostnameRecords, affinity)\n }\n\n return ip\n }\n\n pickFamily (origin, ipFamily) {\n const records = this.storage.get(origin.hostname)?.records\n if (!records) {\n return null\n }\n\n const family = records[ipFamily]\n if (!family) {\n return null\n }\n\n if (family.offset == null || family.offset === maxInt) {\n family.offset = 0\n } else {\n family.offset++\n }\n\n const position = family.offset % family.ips.length\n const ip = family.ips[position] ?? null\n if (ip == null) {\n return ip\n }\n\n if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms\n // We delete expired records\n // It is possible that they have different TTL, so we manage them individually\n family.ips.splice(position, 1)\n }\n\n return ip\n }\n\n setRecords (origin, addresses) {\n const timestamp = Date.now()\n const records = { records: { 4: null, 6: null } }\n let minTTL = this.#maxTTL\n for (const record of addresses) {\n record.timestamp = timestamp\n if (typeof record.ttl === 'number') {\n // The record TTL is expected to be in ms\n record.ttl = Math.min(record.ttl, this.#maxTTL)\n minTTL = Math.min(minTTL, record.ttl)\n } else {\n record.ttl = this.#maxTTL\n }\n\n const familyRecords = records.records[record.family] ?? { ips: [] }\n\n familyRecords.ips.push(record)\n records.records[record.family] = familyRecords\n }\n\n // We provide a default TTL if external storage will be used without TTL per record-level support\n this.storage.set(origin.hostname, records, { ttl: minTTL })\n }\n\n deleteRecords (origin) {\n this.storage.delete(origin.hostname)\n }\n\n getHandler (meta, opts) {\n return new DNSDispatchHandler(this, meta, opts)\n }\n}\n\nclass DNSDispatchHandler extends DecoratorHandler {\n #state = null\n #opts = null\n #dispatch = null\n #origin = null\n #controller = null\n #newOrigin = null\n #firstTry = true\n\n constructor (state, { origin, handler, dispatch, newOrigin }, opts) {\n super(handler)\n this.#origin = origin\n this.#newOrigin = newOrigin\n this.#opts = { ...opts }\n this.#state = state\n this.#dispatch = dispatch\n }\n\n onResponseError (controller, err) {\n switch (err.code) {\n case 'ETIMEDOUT':\n case 'ECONNREFUSED': {\n if (this.#state.dualStack) {\n if (!this.#firstTry) {\n super.onResponseError(controller, err)\n return\n }\n this.#firstTry = false\n\n // Pick an ip address from the other family\n const otherFamily = this.#newOrigin.hostname[0] === '[' ? 4 : 6\n const ip = this.#state.pickFamily(this.#origin, otherFamily)\n if (ip == null) {\n super.onResponseError(controller, err)\n return\n }\n\n let port\n if (typeof ip.port === 'number') {\n port = `:${ip.port}`\n } else if (this.#origin.port !== '') {\n port = `:${this.#origin.port}`\n } else {\n port = ''\n }\n\n const dispatchOpts = {\n ...this.#opts,\n origin: `${this.#origin.protocol}//${\n ip.family === 6 ? `[${ip.address}]` : ip.address\n }${port}`,\n headers: withHostHeader(this.#origin.host, this.#opts.headers)\n }\n this.#dispatch(dispatchOpts, this)\n return\n }\n\n // if dual-stack disabled, we error out\n super.onResponseError(controller, err)\n break\n }\n case 'ENOTFOUND':\n this.#state.deleteRecords(this.#origin)\n super.onResponseError(controller, err)\n break\n default:\n super.onResponseError(controller, err)\n break\n }\n }\n}\n\nmodule.exports = interceptorOpts => {\n if (\n interceptorOpts?.maxTTL != null &&\n (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0)\n ) {\n throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number')\n }\n\n if (\n interceptorOpts?.maxItems != null &&\n (typeof interceptorOpts?.maxItems !== 'number' ||\n interceptorOpts?.maxItems < 1)\n ) {\n throw new InvalidArgumentError(\n 'Invalid maxItems. Must be a positive number and greater than zero'\n )\n }\n\n if (\n interceptorOpts?.affinity != null &&\n interceptorOpts?.affinity !== 4 &&\n interceptorOpts?.affinity !== 6\n ) {\n throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6')\n }\n\n if (\n interceptorOpts?.dualStack != null &&\n typeof interceptorOpts?.dualStack !== 'boolean'\n ) {\n throw new InvalidArgumentError('Invalid dualStack. Must be a boolean')\n }\n\n if (\n interceptorOpts?.lookup != null &&\n typeof interceptorOpts?.lookup !== 'function'\n ) {\n throw new InvalidArgumentError('Invalid lookup. Must be a function')\n }\n\n if (\n interceptorOpts?.pick != null &&\n typeof interceptorOpts?.pick !== 'function'\n ) {\n throw new InvalidArgumentError('Invalid pick. Must be a function')\n }\n\n if (\n interceptorOpts?.storage != null &&\n (typeof interceptorOpts?.storage?.get !== 'function' ||\n typeof interceptorOpts?.storage?.set !== 'function' ||\n typeof interceptorOpts?.storage?.full !== 'function' ||\n typeof interceptorOpts?.storage?.delete !== 'function'\n )\n ) {\n throw new InvalidArgumentError('Invalid storage. Must be a object with methods: { get, set, full, delete }')\n }\n\n const dualStack = interceptorOpts?.dualStack ?? true\n let affinity\n if (dualStack) {\n affinity = interceptorOpts?.affinity ?? null\n } else {\n affinity = interceptorOpts?.affinity ?? 4\n }\n\n const opts = {\n maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms\n lookup: interceptorOpts?.lookup ?? null,\n pick: interceptorOpts?.pick ?? null,\n dualStack,\n affinity,\n maxItems: interceptorOpts?.maxItems ?? Infinity,\n storage: interceptorOpts?.storage\n }\n\n const instance = new DNSInstance(opts)\n\n return dispatch => {\n return function dnsInterceptor (origDispatchOpts, handler) {\n const origin =\n origDispatchOpts.origin.constructor === URL\n ? origDispatchOpts.origin\n : new URL(origDispatchOpts.origin)\n\n if (isIP(origin.hostname) !== 0) {\n return dispatch(origDispatchOpts, handler)\n }\n\n instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => {\n if (err) {\n return handler.onResponseError(null, err)\n }\n\n const dispatchOpts = {\n ...origDispatchOpts,\n servername: origin.hostname, // For SNI on TLS\n origin: newOrigin.origin,\n headers: withHostHeader(origin.host, origDispatchOpts.headers)\n }\n\n dispatch(\n dispatchOpts,\n instance.getHandler(\n { origin, dispatch, handler, newOrigin },\n origDispatchOpts\n )\n )\n })\n\n return true\n }\n }\n}\n","'use strict'\n\nconst {\n safeHTTPMethods,\n pathHasQueryOrFragment,\n hasSafeIterator\n} = require('../core/util')\n\nconst { serializePathWithQuery } = require('../core/util')\n\n/**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts\n */\nfunction makeCacheKey (opts) {\n if (!opts.origin) {\n throw new Error('opts.origin is undefined')\n }\n\n let fullPath = opts.path || '/'\n\n if (opts.query && !pathHasQueryOrFragment(opts.path)) {\n fullPath = serializePathWithQuery(fullPath, opts.query)\n }\n\n return {\n origin: opts.origin.toString(),\n method: opts.method,\n path: fullPath,\n headers: opts.headers\n }\n}\n\n/**\n * @param {Record}\n * @returns {Record}\n */\nfunction normalizeHeaders (opts) {\n let headers\n if (opts.headers == null) {\n headers = {}\n } else if (typeof opts.headers === 'object') {\n headers = {}\n\n if (hasSafeIterator(opts.headers)) {\n for (const x of opts.headers) {\n if (!Array.isArray(x)) {\n throw new Error('opts.headers is not a valid header map')\n }\n const [key, val] = x\n if (typeof key !== 'string' || typeof val !== 'string') {\n throw new Error('opts.headers is not a valid header map')\n }\n headers[key.toLowerCase()] = val\n }\n } else {\n for (const key of Object.keys(opts.headers)) {\n headers[key.toLowerCase()] = opts.headers[key]\n }\n }\n } else {\n throw new Error('opts.headers is not an object')\n }\n\n return headers\n}\n\n/**\n * @param {any} key\n */\nfunction assertCacheKey (key) {\n if (typeof key !== 'object') {\n throw new TypeError(`expected key to be object, got ${typeof key}`)\n }\n\n for (const property of ['origin', 'method', 'path']) {\n if (typeof key[property] !== 'string') {\n throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`)\n }\n }\n\n if (key.headers !== undefined && typeof key.headers !== 'object') {\n throw new TypeError(`expected headers to be object, got ${typeof key}`)\n }\n}\n\n/**\n * @param {any} value\n */\nfunction assertCacheValue (value) {\n if (typeof value !== 'object') {\n throw new TypeError(`expected value to be object, got ${typeof value}`)\n }\n\n for (const property of ['statusCode', 'cachedAt', 'staleAt', 'deleteAt']) {\n if (typeof value[property] !== 'number') {\n throw new TypeError(`expected value.${property} to be number, got ${typeof value[property]}`)\n }\n }\n\n if (typeof value.statusMessage !== 'string') {\n throw new TypeError(`expected value.statusMessage to be string, got ${typeof value.statusMessage}`)\n }\n\n if (value.headers != null && typeof value.headers !== 'object') {\n throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value.headers}`)\n }\n\n if (value.vary !== undefined && typeof value.vary !== 'object') {\n throw new TypeError(`expected value.vary to be object, got ${typeof value.vary}`)\n }\n\n if (value.etag !== undefined && typeof value.etag !== 'string') {\n throw new TypeError(`expected value.etag to be string, got ${typeof value.etag}`)\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-cache-control\n * @see https://www.iana.org/assignments/http-cache-directives/http-cache-directives.xhtml\n\n * @param {string | string[]} header\n * @returns {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives}\n */\nfunction parseCacheControlHeader (header) {\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives}\n */\n const output = {}\n\n let directives\n if (Array.isArray(header)) {\n directives = []\n\n for (const directive of header) {\n directives.push(...directive.split(','))\n }\n } else {\n directives = header.split(',')\n }\n\n for (let i = 0; i < directives.length; i++) {\n const directive = directives[i].toLowerCase()\n const keyValueDelimiter = directive.indexOf('=')\n\n let key\n let value\n if (keyValueDelimiter !== -1) {\n key = directive.substring(0, keyValueDelimiter).trimStart()\n value = directive.substring(keyValueDelimiter + 1)\n } else {\n key = directive.trim()\n }\n\n switch (key) {\n case 'min-fresh':\n case 'max-stale':\n case 'max-age':\n case 's-maxage':\n case 'stale-while-revalidate':\n case 'stale-if-error': {\n if (value === undefined || value[0] === ' ') {\n continue\n }\n\n if (\n value.length >= 2 &&\n value[0] === '\"' &&\n value[value.length - 1] === '\"'\n ) {\n value = value.substring(1, value.length - 1)\n }\n\n const parsedValue = parseInt(value, 10)\n // eslint-disable-next-line no-self-compare\n if (parsedValue !== parsedValue) {\n continue\n }\n\n if (key === 'max-age' && key in output && output[key] >= parsedValue) {\n continue\n }\n\n output[key] = parsedValue\n\n break\n }\n case 'private':\n case 'no-cache': {\n if (value) {\n // The private and no-cache directives can be unqualified (aka just\n // `private` or `no-cache`) or qualified (w/ a value). When they're\n // qualified, it's a list of headers like `no-cache=header1`,\n // `no-cache=\"header1\"`, or `no-cache=\"header1, header2\"`\n // If we're given multiple headers, the comma messes us up since\n // we split the full header by commas. So, let's loop through the\n // remaining parts in front of us until we find one that ends in a\n // quote. We can then just splice all of the parts in between the\n // starting quote and the ending quote out of the directives array\n // and continue parsing like normal.\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-no-cache-2\n if (value[0] === '\"') {\n // Something like `no-cache=\"some-header\"` OR `no-cache=\"some-header, another-header\"`.\n\n // Add the first header on and cut off the leading quote\n const headers = [value.substring(1)]\n\n let foundEndingQuote = value[value.length - 1] === '\"'\n if (!foundEndingQuote) {\n // Something like `no-cache=\"some-header, another-header\"`\n // This can still be something invalid, e.g. `no-cache=\"some-header, ...`\n for (let j = i + 1; j < directives.length; j++) {\n const nextPart = directives[j]\n const nextPartLength = nextPart.length\n\n headers.push(nextPart.trim())\n\n if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '\"') {\n foundEndingQuote = true\n break\n }\n }\n }\n\n if (foundEndingQuote) {\n let lastHeader = headers[headers.length - 1]\n if (lastHeader[lastHeader.length - 1] === '\"') {\n lastHeader = lastHeader.substring(0, lastHeader.length - 1)\n headers[headers.length - 1] = lastHeader\n }\n\n if (key in output) {\n output[key] = output[key].concat(headers)\n } else {\n output[key] = headers\n }\n }\n } else {\n // Something like `no-cache=\"some-header\"`\n if (key in output) {\n output[key] = output[key].concat(value)\n } else {\n output[key] = [value]\n }\n }\n\n break\n }\n }\n // eslint-disable-next-line no-fallthrough\n case 'public':\n case 'no-store':\n case 'must-revalidate':\n case 'proxy-revalidate':\n case 'immutable':\n case 'no-transform':\n case 'must-understand':\n case 'only-if-cached':\n if (value) {\n // These are qualified (something like `public=...`) when they aren't\n // allowed to be, skip\n continue\n }\n\n output[key] = true\n break\n default:\n // Ignore unknown directives as per https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.3-1\n continue\n }\n }\n\n return output\n}\n\n/**\n * @param {string | string[]} varyHeader Vary header from the server\n * @param {Record} headers Request headers\n * @returns {Record}\n */\nfunction parseVaryHeader (varyHeader, headers) {\n if (typeof varyHeader === 'string' && varyHeader.includes('*')) {\n return headers\n }\n\n const output = /** @type {Record} */ ({})\n\n const varyingHeaders = typeof varyHeader === 'string'\n ? varyHeader.split(',')\n : varyHeader\n\n for (const header of varyingHeaders) {\n const trimmedHeader = header.trim().toLowerCase()\n\n output[trimmedHeader] = headers[trimmedHeader] ?? null\n }\n\n return output\n}\n\n/**\n * Note: this deviates from the spec a little. Empty etags (\"\", W/\"\") are valid,\n * however, including them in cached resposnes serves little to no purpose.\n *\n * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-etag\n *\n * @param {string} etag\n * @returns {boolean}\n */\nfunction isEtagUsable (etag) {\n if (etag.length <= 2) {\n // Shortest an etag can be is two chars (just \"\"). This is where we deviate\n // from the spec requiring a min of 3 chars however\n return false\n }\n\n if (etag[0] === '\"' && etag[etag.length - 1] === '\"') {\n // ETag: \"\"asd123\"\" or ETag: \"W/\"asd123\"\", kinda undefined behavior in the\n // spec. Some servers will accept these while others don't.\n // ETag: \"asd123\"\n return !(etag[1] === '\"' || etag.startsWith('\"W/'))\n }\n\n if (etag.startsWith('W/\"') && etag[etag.length - 1] === '\"') {\n // ETag: W/\"\", also where we deviate from the spec & require a min of 3\n // chars\n // ETag: for W/\"\", W/\"asd123\"\n return etag.length !== 4\n }\n\n // Anything else\n return false\n}\n\n/**\n * @param {unknown} store\n * @returns {asserts store is import('../../types/cache-interceptor.d.ts').default.CacheStore}\n */\nfunction assertCacheStore (store, name = 'CacheStore') {\n if (typeof store !== 'object' || store === null) {\n throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store === null ? 'null' : typeof store}`)\n }\n\n for (const fn of ['get', 'createWriteStream', 'delete']) {\n if (typeof store[fn] !== 'function') {\n throw new TypeError(`${name} needs to have a \\`${fn}()\\` function`)\n }\n }\n}\n/**\n * @param {unknown} methods\n * @returns {asserts methods is import('../../types/cache-interceptor.d.ts').default.CacheMethods[]}\n */\nfunction assertCacheMethods (methods, name = 'CacheMethods') {\n if (!Array.isArray(methods)) {\n throw new TypeError(`expected type of ${name} needs to be an array, got ${methods === null ? 'null' : typeof methods}`)\n }\n\n if (methods.length === 0) {\n throw new TypeError(`${name} needs to have at least one method`)\n }\n\n for (const method of methods) {\n if (!safeHTTPMethods.includes(method)) {\n throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(', ')}, got ${method}`)\n }\n }\n}\n\n/**\n * Creates a string key for request deduplication purposes.\n * This key is used to identify in-flight requests that can be shared.\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {Set} [excludeHeaders] Set of lowercase header names to exclude from the key\n * @returns {string}\n */\nfunction makeDeduplicationKey (cacheKey, excludeHeaders) {\n // Use JSON.stringify to produce a collision-resistant key.\n // Previous format used `:` and `=` delimiters without escaping, which\n // allowed different header sets to produce identical keys (e.g.\n // {a:\"x:b=y\"} vs {a:\"x\", b:\"y\"}). See: https://github.com/nodejs/undici/issues/5012\n const headers = {}\n\n if (cacheKey.headers) {\n const sortedHeaders = Object.keys(cacheKey.headers).sort()\n for (const header of sortedHeaders) {\n // Skip excluded headers\n if (excludeHeaders?.has(header.toLowerCase())) {\n continue\n }\n headers[header] = cacheKey.headers[header]\n }\n }\n\n return JSON.stringify([cacheKey.origin, cacheKey.method, cacheKey.path, headers])\n}\n\nmodule.exports = {\n makeCacheKey,\n normalizeHeaders,\n assertCacheKey,\n assertCacheValue,\n parseCacheControlHeader,\n parseVaryHeader,\n isEtagUsable,\n assertCacheMethods,\n assertCacheStore,\n makeDeduplicationKey\n}\n","'use strict'\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-date-time-formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseHttpDate (date) {\n // Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate\n // Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format\n // Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format\n\n switch (date[3]) {\n case ',': return parseImfDate(date)\n case ' ': return parseAscTimeDate(date)\n default: return parseRfc850Date(date)\n }\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#preferred.date.format\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseImfDate (date) {\n if (\n date.length !== 29 ||\n date[4] !== ' ' ||\n date[7] !== ' ' ||\n date[11] !== ' ' ||\n date[16] !== ' ' ||\n date[19] !== ':' ||\n date[22] !== ':' ||\n date[25] !== ' ' ||\n date[26] !== 'G' ||\n date[27] !== 'M' ||\n date[28] !== 'T'\n ) {\n return undefined\n }\n\n let weekday = -1\n if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday\n weekday = 0\n } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday\n weekday = 1\n } else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday\n weekday = 2\n } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday\n weekday = 3\n } else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday\n weekday = 4\n } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday\n weekday = 5\n } else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday\n weekday = 6\n } else {\n return undefined // Not a valid day of the week\n }\n\n let day = 0\n if (date[5] === '0') {\n // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n const code = date.charCodeAt(6)\n if (code < 49 || code > 57) {\n return undefined // Not a digit\n }\n day = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(5)\n if (code1 < 49 || code1 > 51) {\n return undefined // Not a digit between 1 and 3\n }\n const code2 = date.charCodeAt(6)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let monthIdx = -1\n if (\n (date[8] === 'J' && date[9] === 'a' && date[10] === 'n')\n ) {\n monthIdx = 0 // Jan\n } else if (\n (date[8] === 'F' && date[9] === 'e' && date[10] === 'b')\n ) {\n monthIdx = 1 // Feb\n } else if (\n (date[8] === 'M' && date[9] === 'a')\n ) {\n if (date[10] === 'r') {\n monthIdx = 2 // Mar\n } else if (date[10] === 'y') {\n monthIdx = 4 // May\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[8] === 'J')\n ) {\n if (date[9] === 'a' && date[10] === 'n') {\n monthIdx = 0 // Jan\n } else if (date[9] === 'u') {\n if (date[10] === 'n') {\n monthIdx = 5 // Jun\n } else if (date[10] === 'l') {\n monthIdx = 6 // Jul\n } else {\n return undefined // Invalid month\n }\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[8] === 'A')\n ) {\n if (date[9] === 'p' && date[10] === 'r') {\n monthIdx = 3 // Apr\n } else if (date[9] === 'u' && date[10] === 'g') {\n monthIdx = 7 // Aug\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[8] === 'S' && date[9] === 'e' && date[10] === 'p')\n ) {\n monthIdx = 8 // Sep\n } else if (\n (date[8] === 'O' && date[9] === 'c' && date[10] === 't')\n ) {\n monthIdx = 9 // Oct\n } else if (\n (date[8] === 'N' && date[9] === 'o' && date[10] === 'v')\n ) {\n monthIdx = 10 // Nov\n } else if (\n (date[8] === 'D' && date[9] === 'e' && date[10] === 'c')\n ) {\n monthIdx = 11 // Dec\n } else {\n // Not a valid month\n return undefined\n }\n\n const yearDigit1 = date.charCodeAt(12)\n if (yearDigit1 < 48 || yearDigit1 > 57) {\n return undefined // Not a digit\n }\n const yearDigit2 = date.charCodeAt(13)\n if (yearDigit2 < 48 || yearDigit2 > 57) {\n return undefined // Not a digit\n }\n const yearDigit3 = date.charCodeAt(14)\n if (yearDigit3 < 48 || yearDigit3 > 57) {\n return undefined // Not a digit\n }\n const yearDigit4 = date.charCodeAt(15)\n if (yearDigit4 < 48 || yearDigit4 > 57) {\n return undefined // Not a digit\n }\n const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)\n\n let hour = 0\n if (date[17] === '0') {\n const code = date.charCodeAt(18)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n hour = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(17)\n if (code1 < 48 || code1 > 50) {\n return undefined // Not a digit between 0 and 2\n }\n const code2 = date.charCodeAt(18)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n if (code1 === 50 && code2 > 51) {\n return undefined // Hour cannot be greater than 23\n }\n hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let minute = 0\n if (date[20] === '0') {\n const code = date.charCodeAt(21)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n minute = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(20)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(21)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let second = 0\n if (date[23] === '0') {\n const code = date.charCodeAt(24)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n second = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(23)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(24)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n return result.getUTCDay() === weekday ? result : undefined\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseAscTimeDate (date) {\n // This is assumed to be in UTC\n\n if (\n date.length !== 24 ||\n date[7] !== ' ' ||\n date[10] !== ' ' ||\n date[19] !== ' '\n ) {\n return undefined\n }\n\n let weekday = -1\n if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday\n weekday = 0\n } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday\n weekday = 1\n } else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday\n weekday = 2\n } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday\n weekday = 3\n } else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday\n weekday = 4\n } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday\n weekday = 5\n } else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday\n weekday = 6\n } else {\n return undefined // Not a valid day of the week\n }\n\n let monthIdx = -1\n if (\n (date[4] === 'J' && date[5] === 'a' && date[6] === 'n')\n ) {\n monthIdx = 0 // Jan\n } else if (\n (date[4] === 'F' && date[5] === 'e' && date[6] === 'b')\n ) {\n monthIdx = 1 // Feb\n } else if (\n (date[4] === 'M' && date[5] === 'a')\n ) {\n if (date[6] === 'r') {\n monthIdx = 2 // Mar\n } else if (date[6] === 'y') {\n monthIdx = 4 // May\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[4] === 'J')\n ) {\n if (date[5] === 'a' && date[6] === 'n') {\n monthIdx = 0 // Jan\n } else if (date[5] === 'u') {\n if (date[6] === 'n') {\n monthIdx = 5 // Jun\n } else if (date[6] === 'l') {\n monthIdx = 6 // Jul\n } else {\n return undefined // Invalid month\n }\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[4] === 'A')\n ) {\n if (date[5] === 'p' && date[6] === 'r') {\n monthIdx = 3 // Apr\n } else if (date[5] === 'u' && date[6] === 'g') {\n monthIdx = 7 // Aug\n } else {\n return undefined // Invalid month\n }\n } else if (\n (date[4] === 'S' && date[5] === 'e' && date[6] === 'p')\n ) {\n monthIdx = 8 // Sep\n } else if (\n (date[4] === 'O' && date[5] === 'c' && date[6] === 't')\n ) {\n monthIdx = 9 // Oct\n } else if (\n (date[4] === 'N' && date[5] === 'o' && date[6] === 'v')\n ) {\n monthIdx = 10 // Nov\n } else if (\n (date[4] === 'D' && date[5] === 'e' && date[6] === 'c')\n ) {\n monthIdx = 11 // Dec\n } else {\n // Not a valid month\n return undefined\n }\n\n let day = 0\n if (date[8] === ' ') {\n // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n const code = date.charCodeAt(9)\n if (code < 49 || code > 57) {\n return undefined // Not a digit\n }\n day = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(8)\n if (code1 < 49 || code1 > 51) {\n return undefined // Not a digit between 1 and 3\n }\n const code2 = date.charCodeAt(9)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let hour = 0\n if (date[11] === '0') {\n const code = date.charCodeAt(12)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n hour = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(11)\n if (code1 < 48 || code1 > 50) {\n return undefined // Not a digit between 0 and 2\n }\n const code2 = date.charCodeAt(12)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n if (code1 === 50 && code2 > 51) {\n return undefined // Hour cannot be greater than 23\n }\n hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let minute = 0\n if (date[14] === '0') {\n const code = date.charCodeAt(15)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n minute = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(14)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(15)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let second = 0\n if (date[17] === '0') {\n const code = date.charCodeAt(18)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n second = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(17)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(18)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n const yearDigit1 = date.charCodeAt(20)\n if (yearDigit1 < 48 || yearDigit1 > 57) {\n return undefined // Not a digit\n }\n const yearDigit2 = date.charCodeAt(21)\n if (yearDigit2 < 48 || yearDigit2 > 57) {\n return undefined // Not a digit\n }\n const yearDigit3 = date.charCodeAt(22)\n if (yearDigit3 < 48 || yearDigit3 > 57) {\n return undefined // Not a digit\n }\n const yearDigit4 = date.charCodeAt(23)\n if (yearDigit4 < 48 || yearDigit4 > 57) {\n return undefined // Not a digit\n }\n const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)\n\n const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n return result.getUTCDay() === weekday ? result : undefined\n}\n\n/**\n * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats\n *\n * @param {string} date\n * @returns {Date | undefined}\n */\nfunction parseRfc850Date (date) {\n let commaIndex = -1\n\n let weekday = -1\n if (date[0] === 'S') {\n if (date[1] === 'u' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n weekday = 0 // Sunday\n commaIndex = 6\n } else if (date[1] === 'a' && date[2] === 't' && date[3] === 'u' && date[4] === 'r' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {\n weekday = 6 // Saturday\n commaIndex = 8\n }\n } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n weekday = 1 // Monday\n commaIndex = 6\n } else if (date[0] === 'T') {\n if (date[1] === 'u' && date[2] === 'e' && date[3] === 's' && date[4] === 'd' && date[5] === 'a' && date[6] === 'y') {\n weekday = 2 // Tuesday\n commaIndex = 7\n } else if (date[1] === 'h' && date[2] === 'u' && date[3] === 'r' && date[4] === 's' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {\n weekday = 4 // Thursday\n commaIndex = 8\n }\n } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd' && date[3] === 'n' && date[4] === 'e' && date[5] === 's' && date[6] === 'd' && date[7] === 'a' && date[8] === 'y') {\n weekday = 3 // Wednesday\n commaIndex = 9\n } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {\n weekday = 5 // Friday\n commaIndex = 6\n } else {\n // Not a valid day name\n return undefined\n }\n\n if (\n date[commaIndex] !== ',' ||\n (date.length - commaIndex - 1) !== 23 ||\n date[commaIndex + 1] !== ' ' ||\n date[commaIndex + 4] !== '-' ||\n date[commaIndex + 8] !== '-' ||\n date[commaIndex + 11] !== ' ' ||\n date[commaIndex + 14] !== ':' ||\n date[commaIndex + 17] !== ':' ||\n date[commaIndex + 20] !== ' ' ||\n date[commaIndex + 21] !== 'G' ||\n date[commaIndex + 22] !== 'M' ||\n date[commaIndex + 23] !== 'T'\n ) {\n return undefined\n }\n\n let day = 0\n if (date[commaIndex + 2] === '0') {\n // Single digit day, e.g. \"Sun Nov 6 08:49:37 1994\"\n const code = date.charCodeAt(commaIndex + 3)\n if (code < 49 || code > 57) {\n return undefined // Not a digit\n }\n day = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 2)\n if (code1 < 49 || code1 > 51) {\n return undefined // Not a digit between 1 and 3\n }\n const code2 = date.charCodeAt(commaIndex + 3)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let monthIdx = -1\n if (\n (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'n')\n ) {\n monthIdx = 0 // Jan\n } else if (\n (date[commaIndex + 5] === 'F' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'b')\n ) {\n monthIdx = 1 // Feb\n } else if (\n (date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'r')\n ) {\n monthIdx = 2 // Mar\n } else if (\n (date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'p' && date[commaIndex + 7] === 'r')\n ) {\n monthIdx = 3 // Apr\n } else if (\n (date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'y')\n ) {\n monthIdx = 4 // May\n } else if (\n (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'n')\n ) {\n monthIdx = 5 // Jun\n } else if (\n (date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'l')\n ) {\n monthIdx = 6 // Jul\n } else if (\n (date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'g')\n ) {\n monthIdx = 7 // Aug\n } else if (\n (date[commaIndex + 5] === 'S' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'p')\n ) {\n monthIdx = 8 // Sep\n } else if (\n (date[commaIndex + 5] === 'O' && date[commaIndex + 6] === 'c' && date[commaIndex + 7] === 't')\n ) {\n monthIdx = 9 // Oct\n } else if (\n (date[commaIndex + 5] === 'N' && date[commaIndex + 6] === 'o' && date[commaIndex + 7] === 'v')\n ) {\n monthIdx = 10 // Nov\n } else if (\n (date[commaIndex + 5] === 'D' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'c')\n ) {\n monthIdx = 11 // Dec\n } else {\n // Not a valid month\n return undefined\n }\n\n const yearDigit1 = date.charCodeAt(commaIndex + 9)\n if (yearDigit1 < 48 || yearDigit1 > 57) {\n return undefined // Not a digit\n }\n const yearDigit2 = date.charCodeAt(commaIndex + 10)\n if (yearDigit2 < 48 || yearDigit2 > 57) {\n return undefined // Not a digit\n }\n\n let year = (yearDigit1 - 48) * 10 + (yearDigit2 - 48) // Convert ASCII codes to number\n\n // RFC 6265 states that the year is in the range 1970-2069.\n // @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.1\n //\n // 3. If the year-value is greater than or equal to 70 and less than or\n // equal to 99, increment the year-value by 1900.\n // 4. If the year-value is greater than or equal to 0 and less than or\n // equal to 69, increment the year-value by 2000.\n year += year < 70 ? 2000 : 1900\n\n let hour = 0\n if (date[commaIndex + 12] === '0') {\n const code = date.charCodeAt(commaIndex + 13)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n hour = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 12)\n if (code1 < 48 || code1 > 50) {\n return undefined // Not a digit between 0 and 2\n }\n const code2 = date.charCodeAt(commaIndex + 13)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n if (code1 === 50 && code2 > 51) {\n return undefined // Hour cannot be greater than 23\n }\n hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let minute = 0\n if (date[commaIndex + 15] === '0') {\n const code = date.charCodeAt(commaIndex + 16)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n minute = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 15)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(commaIndex + 16)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n let second = 0\n if (date[commaIndex + 18] === '0') {\n const code = date.charCodeAt(commaIndex + 19)\n if (code < 48 || code > 57) {\n return undefined // Not a digit\n }\n second = code - 48 // Convert ASCII code to number\n } else {\n const code1 = date.charCodeAt(commaIndex + 18)\n if (code1 < 48 || code1 > 53) {\n return undefined // Not a digit between 0 and 5\n }\n const code2 = date.charCodeAt(commaIndex + 19)\n if (code2 < 48 || code2 > 57) {\n return undefined // Not a digit\n }\n second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number\n }\n\n const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))\n return result.getUTCDay() === weekday ? result : undefined\n}\n\nmodule.exports = {\n parseHttpDate\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst {\n parseCacheControlHeader,\n parseVaryHeader,\n isEtagUsable\n} = require('../util/cache')\nconst { parseHttpDate } = require('../util/date.js')\n\nfunction noop () {}\n\n// Status codes that we can use some heuristics on to cache\nconst HEURISTICALLY_CACHEABLE_STATUS_CODES = [\n 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501\n]\n\n// Status codes which semantic is not handled by the cache\n// https://datatracker.ietf.org/doc/html/rfc9111#section-3\n// This list should not grow beyond 206 unless the RFC is updated\n// by a newer one including more. Please introduce another list if\n// implementing caching of responses with the 'must-understand' directive.\nconst NOT_UNDERSTOOD_STATUS_CODES = [\n 206\n]\n\nconst MAX_RESPONSE_AGE = 2147483647000\n\n/**\n * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler\n *\n * @implements {DispatchHandler}\n */\nclass CacheHandler {\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}\n */\n #cacheKey\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions['type']}\n */\n #cacheType\n\n /**\n * @type {number | undefined}\n */\n #cacheByDefault\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheStore}\n */\n #store\n\n /**\n * @type {import('../../types/dispatcher.d.ts').default.DispatchHandler}\n */\n #handler\n\n /**\n * @type {import('node:stream').Writable | undefined}\n */\n #writeStream\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n */\n constructor ({ store, type, cacheByDefault }, cacheKey, handler) {\n this.#store = store\n this.#cacheType = type\n this.#cacheByDefault = cacheByDefault\n this.#cacheKey = cacheKey\n this.#handler = handler\n }\n\n onRequestStart (controller, context) {\n this.#writeStream?.destroy()\n this.#writeStream = undefined\n this.#handler.onRequestStart?.(controller, context)\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {number} statusCode\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {string} statusMessage\n */\n onResponseStart (\n controller,\n statusCode,\n resHeaders,\n statusMessage\n ) {\n const downstreamOnHeaders = () =>\n this.#handler.onResponseStart?.(\n controller,\n statusCode,\n resHeaders,\n statusMessage\n )\n const handler = this\n\n if (\n !util.safeHTTPMethods.includes(this.#cacheKey.method) &&\n statusCode >= 200 &&\n statusCode <= 399\n ) {\n // Successful response to an unsafe method, delete it from cache\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-invalidating-stored-response\n try {\n this.#store.delete(this.#cacheKey)?.catch?.(noop)\n } catch {\n // Fail silently\n }\n return downstreamOnHeaders()\n }\n\n const cacheControlHeader = resHeaders['cache-control']\n const heuristicallyCacheable = resHeaders['last-modified'] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode)\n if (\n !cacheControlHeader &&\n !resHeaders['expires'] &&\n !heuristicallyCacheable &&\n !this.#cacheByDefault\n ) {\n // Don't have anything to tell us this response is cachable and we're not\n // caching by default\n return downstreamOnHeaders()\n }\n\n const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}\n if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {\n return downstreamOnHeaders()\n }\n\n const now = Date.now()\n const resAge = resHeaders.age ? getAge(resHeaders.age) : undefined\n if (resAge && resAge >= MAX_RESPONSE_AGE) {\n // Response considered stale\n return downstreamOnHeaders()\n }\n\n const resDate = typeof resHeaders.date === 'string'\n ? parseHttpDate(resHeaders.date)\n : undefined\n\n const staleAt =\n determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ??\n this.#cacheByDefault\n if (staleAt === undefined || (resAge && resAge > staleAt)) {\n return downstreamOnHeaders()\n }\n\n const baseTime = resDate ? resDate.getTime() : now\n const absoluteStaleAt = staleAt + baseTime\n if (now >= absoluteStaleAt) {\n // Response is already stale\n return downstreamOnHeaders()\n }\n\n let varyDirectives\n if (this.#cacheKey.headers && resHeaders.vary) {\n varyDirectives = parseVaryHeader(resHeaders.vary, this.#cacheKey.headers)\n if (!varyDirectives) {\n // Parse error\n return downstreamOnHeaders()\n }\n }\n\n const cachedAt = resAge ? now - resAge : now\n const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt)\n const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives)\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheValue}\n */\n const value = {\n statusCode,\n statusMessage,\n headers: strippedHeaders,\n vary: varyDirectives,\n cacheControlDirectives,\n cachedAt,\n staleAt: absoluteStaleAt,\n deleteAt\n }\n\n // Not modified, re-use the cached value\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-handling-304-not-modified\n if (statusCode === 304) {\n const handle304 = (cachedValue) => {\n if (!cachedValue) {\n // Do not create a new cache entry, as a 304 won't have a body - so cannot be cached.\n return downstreamOnHeaders()\n }\n\n // Re-use the cached value: statuscode, statusmessage, headers and body\n value.statusCode = cachedValue.statusCode\n value.statusMessage = cachedValue.statusMessage\n value.etag = cachedValue.etag\n value.headers = { ...cachedValue.headers, ...strippedHeaders }\n\n downstreamOnHeaders()\n\n this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value)\n\n if (!this.#writeStream || !cachedValue?.body) {\n return\n }\n\n if (typeof cachedValue.body.values === 'function') {\n const bodyIterator = cachedValue.body.values()\n\n const streamCachedBody = () => {\n for (const chunk of bodyIterator) {\n const full = this.#writeStream.write(chunk) === false\n this.#handler.onResponseData?.(controller, chunk)\n // when stream is full stop writing until we get a 'drain' event\n if (full) {\n break\n }\n }\n }\n\n this.#writeStream\n .on('error', function () {\n handler.#writeStream = undefined\n handler.#store.delete(handler.#cacheKey)\n })\n .on('drain', () => {\n streamCachedBody()\n })\n .on('close', function () {\n if (handler.#writeStream === this) {\n handler.#writeStream = undefined\n }\n })\n\n streamCachedBody()\n } else if (typeof cachedValue.body.on === 'function') {\n // Readable stream body (e.g. from async/remote cache stores)\n cachedValue.body\n .on('data', (chunk) => {\n this.#writeStream.write(chunk)\n this.#handler.onResponseData?.(controller, chunk)\n })\n .on('end', () => {\n this.#writeStream.end()\n })\n .on('error', () => {\n this.#writeStream = undefined\n this.#store.delete(this.#cacheKey)\n })\n\n this.#writeStream\n .on('error', function () {\n handler.#writeStream = undefined\n handler.#store.delete(handler.#cacheKey)\n })\n .on('close', function () {\n if (handler.#writeStream === this) {\n handler.#writeStream = undefined\n }\n })\n }\n }\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheValue}\n */\n const result = this.#store.get(this.#cacheKey)\n if (result && typeof result.then === 'function') {\n result.then(handle304)\n } else {\n handle304(result)\n }\n } else {\n if (typeof resHeaders.etag === 'string' && isEtagUsable(resHeaders.etag)) {\n value.etag = resHeaders.etag\n }\n\n this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value)\n\n if (!this.#writeStream) {\n return downstreamOnHeaders()\n }\n\n this.#writeStream\n .on('drain', () => controller.resume())\n .on('error', function () {\n // TODO (fix): Make error somehow observable?\n handler.#writeStream = undefined\n\n // Delete the value in case the cache store is holding onto state from\n // the call to createWriteStream\n handler.#store.delete(handler.#cacheKey)\n })\n .on('close', function () {\n if (handler.#writeStream === this) {\n handler.#writeStream = undefined\n }\n\n // TODO (fix): Should we resume even if was paused downstream?\n controller.resume()\n })\n\n downstreamOnHeaders()\n }\n }\n\n onResponseData (controller, chunk) {\n if (this.#writeStream?.write(chunk) === false) {\n controller.pause()\n }\n\n this.#handler.onResponseData?.(controller, chunk)\n }\n\n onResponseEnd (controller, trailers) {\n this.#writeStream?.end()\n this.#handler.onResponseEnd?.(controller, trailers)\n }\n\n onResponseError (controller, err) {\n this.#writeStream?.destroy(err)\n this.#writeStream = undefined\n this.#handler.onResponseError?.(controller, err)\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen\n *\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType\n * @param {number} statusCode\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} [reqHeaders]\n */\nfunction canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {\n // Status code must be final and understood.\n if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {\n return false\n }\n // Responses with neither status codes that are heuristically cacheable, nor \"explicit enough\" caching\n // directives, are not cacheable. \"Explicit enough\": see https://www.rfc-editor.org/rfc/rfc9111.html#section-3\n if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders['expires'] &&\n !cacheControlDirectives.public &&\n cacheControlDirectives['max-age'] === undefined &&\n // RFC 9111: a private response directive, if the cache is not shared\n !(cacheControlDirectives.private && cacheType === 'private') &&\n !(cacheControlDirectives['s-maxage'] !== undefined && cacheType === 'shared')\n ) {\n return false\n }\n\n if (cacheControlDirectives['no-store']) {\n return false\n }\n\n if (cacheType === 'shared' && cacheControlDirectives.private === true) {\n return false\n }\n\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-4.1-5\n if (resHeaders.vary?.includes('*')) {\n return false\n }\n\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen\n if (reqHeaders?.authorization) {\n if (\n !cacheControlDirectives.public &&\n !cacheControlDirectives['s-maxage'] &&\n !cacheControlDirectives['must-revalidate']\n ) {\n return false\n }\n\n if (typeof reqHeaders.authorization !== 'string') {\n return false\n }\n\n if (\n Array.isArray(cacheControlDirectives['no-cache']) &&\n cacheControlDirectives['no-cache'].includes('authorization')\n ) {\n return false\n }\n\n if (\n Array.isArray(cacheControlDirectives['private']) &&\n cacheControlDirectives['private'].includes('authorization')\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @param {string | string[]} ageHeader\n * @returns {number | undefined}\n */\nfunction getAge (ageHeader) {\n const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader)\n\n return isNaN(age) ? undefined : age * 1000\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType\n * @param {number} now\n * @param {number | undefined} age\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {Date | undefined} responseDate\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n *\n * @returns {number | undefined} time that the value is stale at in seconds or undefined if it shouldn't be cached\n */\nfunction determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) {\n if (cacheType === 'shared') {\n // Prioritize s-maxage since we're a shared cache\n // s-maxage > max-age > Expire\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10-3\n const sMaxAge = cacheControlDirectives['s-maxage']\n if (sMaxAge !== undefined) {\n return sMaxAge > 0 ? sMaxAge * 1000 : undefined\n }\n }\n\n const maxAge = cacheControlDirectives['max-age']\n if (maxAge !== undefined) {\n return maxAge > 0 ? maxAge * 1000 : undefined\n }\n\n if (typeof resHeaders.expires === 'string') {\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.3\n const expiresDate = parseHttpDate(resHeaders.expires)\n if (expiresDate) {\n if (now >= expiresDate.getTime()) {\n return undefined\n }\n\n if (responseDate) {\n if (responseDate >= expiresDate) {\n return undefined\n }\n\n if (age !== undefined && age > (expiresDate - responseDate)) {\n return undefined\n }\n }\n\n return expiresDate.getTime() - now\n }\n }\n\n if (typeof resHeaders['last-modified'] === 'string') {\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-heuristic-fresh\n const lastModified = new Date(resHeaders['last-modified'])\n if (isValidDate(lastModified)) {\n if (lastModified.getTime() >= now) {\n return undefined\n }\n\n const responseAge = now - lastModified.getTime()\n\n return responseAge * 0.1\n }\n }\n\n if (cacheControlDirectives.immutable) {\n // https://www.rfc-editor.org/rfc/rfc8246.html#section-2.2\n return 31536000\n }\n\n return undefined\n}\n\n/**\n * @param {number} baseTime\n * @param {number} cachedAt\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @param {number} staleAt\n */\nfunction determineDeleteAt (baseTime, cachedAt, cacheControlDirectives, staleAt) {\n let staleWhileRevalidate = -Infinity\n let staleIfError = -Infinity\n let immutable = -Infinity\n\n if (cacheControlDirectives['stale-while-revalidate']) {\n staleWhileRevalidate = staleAt + (cacheControlDirectives['stale-while-revalidate'] * 1000)\n }\n\n if (cacheControlDirectives['stale-if-error']) {\n staleIfError = staleAt + (cacheControlDirectives['stale-if-error'] * 1000)\n }\n\n if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {\n immutable = cachedAt + 31536000000\n }\n\n // When no stale directives or immutable flag, add a revalidation buffer\n // equal to the freshness lifetime so the entry survives past staleAt long\n // enough to be revalidated instead of silently disappearing.\n //\n // Response Date headers only have second precision, so baseTime can trail the\n // actual cache insertion time by up to ~1s. Pad the buffer by that bounded\n // skew so short-lived entries do not disappear exactly when they should be\n // revalidated.\n if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {\n const freshnessLifetime = staleAt - baseTime\n const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1000)\n return staleAt + freshnessLifetime + datePrecisionPadding\n }\n\n return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable)\n}\n\n/**\n * Strips headers required to be removed in cached responses\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives\n * @returns {Record}\n */\nfunction stripNecessaryHeaders (resHeaders, cacheControlDirectives) {\n const headersToRemove = [\n 'connection',\n 'proxy-authenticate',\n 'proxy-authentication-info',\n 'proxy-authorization',\n 'proxy-connection',\n 'te',\n 'transfer-encoding',\n 'upgrade',\n // We'll add age back when serving it\n 'age'\n ]\n\n if (resHeaders['connection']) {\n if (Array.isArray(resHeaders['connection'])) {\n // connection: a\n // connection: b\n headersToRemove.push(...resHeaders['connection'].map(header => header.trim()))\n } else {\n // connection: a, b\n headersToRemove.push(...resHeaders['connection'].split(',').map(header => header.trim()))\n }\n }\n\n if (Array.isArray(cacheControlDirectives['no-cache'])) {\n headersToRemove.push(...cacheControlDirectives['no-cache'])\n }\n\n if (Array.isArray(cacheControlDirectives['private'])) {\n headersToRemove.push(...cacheControlDirectives['private'])\n }\n\n let strippedHeaders\n for (const headerName of headersToRemove) {\n if (resHeaders[headerName]) {\n strippedHeaders ??= { ...resHeaders }\n delete strippedHeaders[headerName]\n }\n }\n\n return strippedHeaders ?? resHeaders\n}\n\n/**\n * @param {Date} date\n * @returns {boolean}\n */\nfunction isValidDate (date) {\n return date instanceof Date && Number.isFinite(date.valueOf())\n}\n\nmodule.exports = CacheHandler\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst { EventEmitter } = require('node:events')\nconst { assertCacheKey, assertCacheValue } = require('../util/cache.js')\n\n/**\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheKey} CacheKey\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheValue} CacheValue\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore\n * @typedef {import('../../types/cache-interceptor.d.ts').default.GetResult} GetResult\n */\n\n/**\n * @implements {CacheStore}\n * @extends {EventEmitter}\n */\nclass MemoryCacheStore extends EventEmitter {\n #maxCount = 1024\n #maxSize = 104857600 // 100MB\n #maxEntrySize = 5242880 // 5MB\n\n #size = 0\n #count = 0\n #entries = new Map()\n #hasEmittedMaxSizeEvent = false\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts]\n */\n constructor (opts) {\n super()\n if (opts) {\n if (typeof opts !== 'object') {\n throw new TypeError('MemoryCacheStore options must be an object')\n }\n\n if (opts.maxCount !== undefined) {\n if (\n typeof opts.maxCount !== 'number' ||\n !Number.isInteger(opts.maxCount) ||\n opts.maxCount < 0\n ) {\n throw new TypeError('MemoryCacheStore options.maxCount must be a non-negative integer')\n }\n this.#maxCount = opts.maxCount\n }\n\n if (opts.maxSize !== undefined) {\n if (\n typeof opts.maxSize !== 'number' ||\n !Number.isInteger(opts.maxSize) ||\n opts.maxSize < 0\n ) {\n throw new TypeError('MemoryCacheStore options.maxSize must be a non-negative integer')\n }\n this.#maxSize = opts.maxSize\n }\n\n if (opts.maxEntrySize !== undefined) {\n if (\n typeof opts.maxEntrySize !== 'number' ||\n !Number.isInteger(opts.maxEntrySize) ||\n opts.maxEntrySize < 0\n ) {\n throw new TypeError('MemoryCacheStore options.maxEntrySize must be a non-negative integer')\n }\n this.#maxEntrySize = opts.maxEntrySize\n }\n }\n }\n\n /**\n * Get the current size of the cache in bytes\n * @returns {number} The current size of the cache in bytes\n */\n get size () {\n return this.#size\n }\n\n /**\n * Check if the cache is full (either max size or max count reached)\n * @returns {boolean} True if the cache is full, false otherwise\n */\n isFull () {\n return this.#size >= this.#maxSize || this.#count >= this.#maxCount\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req\n * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined}\n */\n get (key) {\n assertCacheKey(key)\n\n const topLevelKey = `${key.origin}:${key.path}`\n\n const now = Date.now()\n const entries = this.#entries.get(topLevelKey)\n\n const entry = entries ? findEntry(key, entries, now) : null\n\n return entry == null\n ? undefined\n : {\n statusMessage: entry.statusMessage,\n statusCode: entry.statusCode,\n headers: entry.headers,\n body: entry.body,\n vary: entry.vary ? entry.vary : undefined,\n etag: entry.etag,\n cacheControlDirectives: entry.cacheControlDirectives,\n cachedAt: entry.cachedAt,\n staleAt: entry.staleAt,\n deleteAt: entry.deleteAt\n }\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} val\n * @returns {Writable | undefined}\n */\n createWriteStream (key, val) {\n assertCacheKey(key)\n assertCacheValue(val)\n\n const topLevelKey = `${key.origin}:${key.path}`\n\n const store = this\n const entry = { ...key, ...val, body: [], size: 0 }\n\n return new Writable({\n write (chunk, encoding, callback) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding)\n }\n\n entry.size += chunk.byteLength\n\n if (entry.size >= store.#maxEntrySize) {\n this.destroy()\n } else {\n entry.body.push(chunk)\n }\n\n callback(null)\n },\n final (callback) {\n let entries = store.#entries.get(topLevelKey)\n if (!entries) {\n entries = []\n store.#entries.set(topLevelKey, entries)\n }\n const previousEntry = findEntry(key, entries, Date.now())\n if (previousEntry) {\n const index = entries.indexOf(previousEntry)\n entries.splice(index, 1, entry)\n store.#size -= previousEntry.size\n } else {\n entries.push(entry)\n store.#count += 1\n }\n\n store.#size += entry.size\n\n // Check if cache is full and emit event if needed\n if (store.#size > store.#maxSize || store.#count > store.#maxCount) {\n // Emit maxSizeExceeded event if we haven't already\n if (!store.#hasEmittedMaxSizeEvent) {\n store.emit('maxSizeExceeded', {\n size: store.#size,\n maxSize: store.#maxSize,\n count: store.#count,\n maxCount: store.#maxCount\n })\n store.#hasEmittedMaxSizeEvent = true\n }\n\n // Perform eviction\n for (const [key, entries] of store.#entries) {\n for (const entry of entries.splice(0, entries.length / 2)) {\n store.#size -= entry.size\n store.#count -= 1\n }\n if (entries.length === 0) {\n store.#entries.delete(key)\n }\n }\n\n // Reset the event flag after eviction\n if (store.#size < store.#maxSize && store.#count < store.#maxCount) {\n store.#hasEmittedMaxSizeEvent = false\n }\n }\n\n callback(null)\n }\n })\n }\n\n /**\n * @param {CacheKey} key\n */\n delete (key) {\n if (typeof key !== 'object') {\n throw new TypeError(`expected key to be object, got ${typeof key}`)\n }\n\n const topLevelKey = `${key.origin}:${key.path}`\n\n for (const entry of this.#entries.get(topLevelKey) ?? []) {\n this.#size -= entry.size\n this.#count -= 1\n }\n this.#entries.delete(topLevelKey)\n }\n}\n\nfunction findEntry (key, entries, now) {\n return entries.find((entry) => (\n entry.deleteAt > now &&\n entry.method === key.method &&\n (entry.vary == null || Object.keys(entry.vary).every(headerName => {\n if (entry.vary[headerName] === null) {\n return key.headers[headerName] === undefined\n }\n\n return entry.vary[headerName] === key.headers[headerName]\n }))\n ))\n}\n\nmodule.exports = MemoryCacheStore\n","'use strict'\n\nconst assert = require('node:assert')\n\n/**\n * This takes care of revalidation requests we send to the origin. If we get\n * a response indicating that what we have is cached (via a HTTP 304), we can\n * continue using the cached value. Otherwise, we'll receive the new response\n * here, which we then just pass on to the next handler (most likely a\n * CacheHandler). Note that this assumes the proper headers were already\n * included in the request to tell the origin that we want to revalidate the\n * response (i.e. if-modified-since or if-none-match).\n *\n * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-validation\n *\n * @implements {import('../../types/dispatcher.d.ts').default.DispatchHandler}\n */\nclass CacheRevalidationHandler {\n #successful = false\n\n /**\n * @type {((boolean, any) => void) | null}\n */\n #callback\n\n /**\n * @type {(import('../../types/dispatcher.d.ts').default.DispatchHandler)}\n */\n #handler\n\n #context\n\n /**\n * @type {boolean}\n */\n #allowErrorStatusCodes\n\n /**\n * @param {(boolean) => void} callback Function to call if the cached value is valid\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler\n * @param {boolean} allowErrorStatusCodes\n */\n constructor (callback, handler, allowErrorStatusCodes) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function')\n }\n\n this.#callback = callback\n this.#handler = handler\n this.#allowErrorStatusCodes = allowErrorStatusCodes\n }\n\n onRequestStart (_, context) {\n this.#successful = false\n this.#context = context\n }\n\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n onResponseStart (\n controller,\n statusCode,\n headers,\n statusMessage\n ) {\n assert(this.#callback != null)\n\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-handling-a-validation-respo\n // https://datatracker.ietf.org/doc/html/rfc5861#section-4\n this.#successful = statusCode === 304 ||\n (this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504)\n this.#callback(this.#successful, this.#context)\n this.#callback = null\n\n if (this.#successful) {\n return true\n }\n\n this.#handler.onRequestStart?.(controller, this.#context)\n this.#handler.onResponseStart?.(\n controller,\n statusCode,\n headers,\n statusMessage\n )\n }\n\n onResponseData (controller, chunk) {\n if (this.#successful) {\n return\n }\n\n return this.#handler.onResponseData?.(controller, chunk)\n }\n\n onResponseEnd (controller, trailers) {\n if (this.#successful) {\n return\n }\n\n this.#handler.onResponseEnd?.(controller, trailers)\n }\n\n onResponseError (controller, err) {\n if (this.#successful) {\n return\n }\n\n if (this.#callback) {\n this.#callback(false)\n this.#callback = null\n }\n\n if (typeof this.#handler.onResponseError === 'function') {\n this.#handler.onResponseError(controller, err)\n } else {\n throw err\n }\n }\n}\n\nmodule.exports = CacheRevalidationHandler\n","'use strict'\n\nconst assert = require('node:assert')\nconst { Readable } = require('node:stream')\nconst util = require('../core/util')\nconst CacheHandler = require('../handler/cache-handler')\nconst MemoryCacheStore = require('../cache/memory-cache-store')\nconst CacheRevalidationHandler = require('../handler/cache-revalidation-handler')\nconst { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = require('../util/cache.js')\nconst { AbortError } = require('../core/errors.js')\n\n/**\n * @param {(string | RegExp)[] | undefined} origins\n * @param {string} name\n */\nfunction assertCacheOrigins (origins, name) {\n if (origins === undefined) return\n if (!Array.isArray(origins)) {\n throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`)\n }\n for (let i = 0; i < origins.length; i++) {\n const origin = origins[i]\n if (typeof origin !== 'string' && !(origin instanceof RegExp)) {\n throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`)\n }\n }\n}\n\nconst nop = () => {}\n\n/**\n * @typedef {(options: import('../../types/dispatcher.d.ts').default.DispatchOptions, handler: import('../../types/dispatcher.d.ts').default.DispatchHandler) => void} DispatchFn\n */\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @returns {boolean}\n */\nfunction needsRevalidation (result, cacheControlDirectives, { headers = {} }) {\n // Always revalidate requests with the no-cache request directive.\n if (cacheControlDirectives?.['no-cache']) {\n return true\n }\n\n // Always revalidate requests with unqualified no-cache response directive.\n if (result.cacheControlDirectives?.['no-cache'] && !Array.isArray(result.cacheControlDirectives['no-cache'])) {\n return true\n }\n\n // Always revalidate requests with conditional headers.\n if (headers['if-modified-since'] || headers['if-none-match']) {\n return true\n }\n\n return false\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives\n * @returns {boolean}\n */\nfunction isStale (result, cacheControlDirectives) {\n const now = Date.now()\n if (now > result.staleAt) {\n // Response is stale\n if (cacheControlDirectives?.['max-stale']) {\n // There's a threshold where we can serve stale responses, let's see if\n // we're in it\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-max-stale\n const gracePeriod = result.staleAt + (cacheControlDirectives['max-stale'] * 1000)\n return now > gracePeriod\n }\n\n return true\n }\n\n if (cacheControlDirectives?.['min-fresh']) {\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.3\n\n // At this point, staleAt is always > now\n const timeLeftTillStale = result.staleAt - now\n const threshold = cacheControlDirectives['min-fresh'] * 1000\n\n return timeLeftTillStale <= threshold\n }\n\n return false\n}\n\n/**\n * Check if we're within the stale-while-revalidate window for a stale response\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @returns {boolean}\n */\nfunction withinStaleWhileRevalidateWindow (result) {\n const staleWhileRevalidate = result.cacheControlDirectives?.['stale-while-revalidate']\n if (!staleWhileRevalidate) {\n return false\n }\n\n const now = Date.now()\n const staleWhileRevalidateExpiry = result.staleAt + (staleWhileRevalidate * 1000)\n return now <= staleWhileRevalidateExpiry\n}\n\n/**\n * @param {DispatchFn} dispatch\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl\n */\nfunction handleUncachedResponse (\n dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl\n) {\n if (reqCacheControl?.['only-if-cached']) {\n let aborted = false\n\n const controller = {\n paused: false,\n rawHeaders: [],\n rawTrailers: [],\n pause () {\n this.paused = true\n },\n resume () {\n this.paused = false\n },\n abort: (reason) => {\n aborted = true\n handler.onResponseError?.(controller, reason ?? new AbortError())\n }\n }\n\n try {\n handler.onRequestStart?.(controller, null)\n\n if (aborted) {\n return\n }\n\n handler.onResponseStart?.(controller, 504, {}, 'Gateway Timeout')\n if (aborted) {\n return\n }\n\n handler.onResponseEnd?.(controller, {})\n } catch (err) {\n if (typeof handler.onResponseError === 'function') {\n handler.onResponseError(controller, err)\n }\n }\n\n return true\n }\n\n return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n}\n\n/**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result\n * @param {number} age\n * @param {any} context\n * @param {boolean} isStale\n */\nfunction sendCachedValue (handler, opts, result, age, context, isStale) {\n // TODO (perf): Readable.from path can be optimized...\n const stream = util.isStream(result.body)\n ? result.body\n : Readable.from(result.body ?? [])\n\n assert(!stream.destroyed, 'stream should not be destroyed')\n assert(!stream.readableDidRead, 'stream should not be readableDidRead')\n\n const controller = {\n rawHeaders: [],\n rawTrailers: [],\n resume () {\n stream.resume()\n },\n pause () {\n stream.pause()\n },\n get paused () {\n return stream.isPaused()\n },\n get aborted () {\n return stream.destroyed\n },\n get reason () {\n return stream.errored\n },\n abort (reason) {\n stream.destroy(reason ?? new AbortError())\n }\n }\n\n stream\n .on('error', function (err) {\n if (!this.readableEnded) {\n if (typeof handler.onResponseError === 'function') {\n handler.onResponseError(controller, err)\n } else {\n throw err\n }\n }\n })\n .on('close', function () {\n if (!this.errored) {\n handler.onResponseEnd?.(controller, {})\n }\n })\n\n handler.onRequestStart?.(controller, context)\n\n if (stream.destroyed) {\n return\n }\n\n // Add the age header\n // https://www.rfc-editor.org/rfc/rfc9111.html#name-age\n const headers = { ...result.headers, age: String(age) }\n\n if (isStale) {\n // Add warning header\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Warning\n headers.warning = '110 - \"response is stale\"'\n }\n\n controller.rawHeaders = util.toRawHeaders(headers)\n\n handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage)\n\n if (opts.method === 'HEAD') {\n stream.destroy()\n } else {\n stream.on('data', function (chunk) {\n handler.onResponseData?.(controller, chunk)\n })\n }\n}\n\n/**\n * @param {DispatchFn} dispatch\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey\n * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler\n * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl\n * @param {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} result\n */\nfunction handleResult (\n dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl,\n result\n) {\n if (!result) {\n return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)\n }\n\n const now = Date.now()\n if (now > result.deleteAt) {\n // Response is expired, cache store shouldn't have given this to us\n return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n }\n\n const age = Math.round((now - result.cachedAt) / 1000)\n if (reqCacheControl?.['max-age'] && age >= reqCacheControl['max-age']) {\n // Response is considered expired for this specific request\n // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.1\n return dispatch(opts, handler)\n }\n\n const stale = isStale(result, reqCacheControl)\n const revalidate = needsRevalidation(result, reqCacheControl, opts)\n\n // Check if the response is stale\n if (stale || revalidate) {\n if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) {\n // If body is a stream we can't revalidate...\n // TODO (fix): This could be less strict...\n return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))\n }\n\n // RFC 5861: If we're within stale-while-revalidate window, serve stale immediately\n // and revalidate in background, unless immediate revalidation is necessary\n if (!revalidate && withinStaleWhileRevalidateWindow(result)) {\n // Serve stale response immediately\n sendCachedValue(handler, opts, result, age, null, true)\n\n // Start background revalidation (fire-and-forget)\n queueMicrotask(() => {\n const headers = {\n ...opts.headers,\n 'if-modified-since': new Date(result.cachedAt).toUTCString()\n }\n\n if (result.etag) {\n headers['if-none-match'] = result.etag\n }\n\n if (result.vary) {\n for (const key in result.vary) {\n if (result.vary[key] != null) {\n headers[key] = result.vary[key]\n }\n }\n }\n\n // Background revalidation - update cache if we get new data\n dispatch(\n {\n ...opts,\n headers\n },\n new CacheHandler(globalOpts, cacheKey, {\n // Silent handler that just updates the cache\n onRequestStart () {},\n onRequestUpgrade () {},\n onResponseStart () {},\n onResponseData () {},\n onResponseEnd () {},\n onResponseError () {}\n })\n )\n })\n\n return true\n }\n\n let withinStaleIfErrorThreshold = false\n const staleIfErrorExpiry = result.cacheControlDirectives['stale-if-error'] ?? reqCacheControl?.['stale-if-error']\n if (staleIfErrorExpiry) {\n withinStaleIfErrorThreshold = now < (result.staleAt + (staleIfErrorExpiry * 1000))\n }\n\n const headers = {\n ...opts.headers,\n 'if-modified-since': new Date(result.cachedAt).toUTCString()\n }\n\n if (result.etag) {\n headers['if-none-match'] = result.etag\n }\n\n if (result.vary) {\n for (const key in result.vary) {\n if (result.vary[key] != null) {\n headers[key] = result.vary[key]\n }\n }\n }\n\n // We need to revalidate the response\n return dispatch(\n {\n ...opts,\n headers\n },\n new CacheRevalidationHandler(\n (success, context) => {\n if (success) {\n // TODO: successful revalidation should be considered fresh (not give stale warning).\n sendCachedValue(handler, opts, result, age, context, stale)\n } else if (util.isStream(result.body)) {\n result.body.on('error', nop).destroy()\n }\n },\n new CacheHandler(globalOpts, cacheKey, handler),\n withinStaleIfErrorThreshold\n )\n )\n }\n\n // Dump request body.\n if (util.isStream(opts.body)) {\n opts.body.on('error', nop).destroy()\n }\n\n sendCachedValue(handler, opts, result, age, null, false)\n}\n\n/**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions} [opts]\n * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}\n */\nmodule.exports = (opts = {}) => {\n const {\n store = new MemoryCacheStore(),\n methods = ['GET'],\n cacheByDefault = undefined,\n type = 'shared',\n origins = undefined\n } = opts\n\n if (typeof opts !== 'object' || opts === null) {\n throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)\n }\n\n assertCacheStore(store, 'opts.store')\n assertCacheMethods(methods, 'opts.methods')\n assertCacheOrigins(origins, 'opts.origins')\n\n if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') {\n throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`)\n }\n\n if (typeof type !== 'undefined' && type !== 'shared' && type !== 'private') {\n throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`)\n }\n\n const globalOpts = {\n store,\n methods,\n cacheByDefault,\n type\n }\n\n const safeMethodsToNotCache = util.safeHTTPMethods.filter(method => methods.includes(method) === false)\n\n return dispatch => {\n return (opts, handler) => {\n if (!opts.origin || safeMethodsToNotCache.includes(opts.method)) {\n // Not a method we want to cache or we don't have the origin, skip\n return dispatch(opts, handler)\n }\n\n // Check if origin is in whitelist\n if (origins !== undefined) {\n const requestOrigin = opts.origin.toString().toLowerCase()\n let isAllowed = false\n\n for (let i = 0; i < origins.length; i++) {\n const allowed = origins[i]\n if (typeof allowed === 'string') {\n if (allowed.toLowerCase() === requestOrigin) {\n isAllowed = true\n break\n }\n } else if (allowed.test(requestOrigin)) {\n isAllowed = true\n break\n }\n }\n\n if (!isAllowed) {\n return dispatch(opts, handler)\n }\n }\n\n opts = {\n ...opts,\n headers: normalizeHeaders(opts)\n }\n\n const reqCacheControl = opts.headers?.['cache-control']\n ? parseCacheControlHeader(opts.headers['cache-control'])\n : undefined\n\n if (reqCacheControl?.['no-store']) {\n return dispatch(opts, handler)\n }\n\n /**\n * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}\n */\n const cacheKey = makeCacheKey(opts)\n const result = store.get(cacheKey)\n\n if (result && typeof result.then === 'function') {\n return result\n .then(result => handleResult(dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl,\n result\n ))\n } else {\n return handleResult(\n dispatch,\n globalOpts,\n cacheKey,\n handler,\n opts,\n reqCacheControl,\n result\n )\n }\n }\n }\n}\n","'use strict'\n\nconst { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = require('node:zlib')\nconst { pipeline } = require('node:stream')\nconst DecoratorHandler = require('../handler/decorator-handler')\n\n/** @typedef {import('node:stream').Transform} Transform */\n/** @typedef {import('node:stream').Transform} Controller */\n/** @typedef {Transform&import('node:zlib').Zlib} DecompressorStream */\n\n/** @type {Record DecompressorStream>} */\nconst supportedEncodings = {\n gzip: createGunzip,\n 'x-gzip': createGunzip,\n br: createBrotliDecompress,\n deflate: createInflate,\n compress: createInflate,\n 'x-compress': createInflate,\n zstd: createZstdDecompress\n}\n\nconst defaultSkipStatusCodes = /** @type {const} */ ([204, 304])\n\nlet warningEmitted = /** @type {boolean} */ (false)\n\n/**\n * @typedef {Object} DecompressHandlerOptions\n * @property {number[]|Readonly} [skipStatusCodes=[204, 304]] - List of status codes to skip decompression for\n * @property {boolean} [skipErrorResponses] - Whether to skip decompression for error responses (status codes >= 400)\n */\n\nclass DecompressHandler extends DecoratorHandler {\n /** @type {Transform[]} */\n #decompressors = []\n /** @type {Readonly} */\n #skipStatusCodes\n /** @type {boolean} */\n #skipErrorResponses\n\n constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {\n super(handler)\n this.#skipStatusCodes = skipStatusCodes\n this.#skipErrorResponses = skipErrorResponses\n }\n\n /**\n * Determines if decompression should be skipped based on encoding and status code\n * @param {string} contentEncoding - Content-Encoding header value\n * @param {number} statusCode - HTTP status code of the response\n * @returns {boolean} - True if decompression should be skipped\n */\n #shouldSkipDecompression (contentEncoding, statusCode) {\n if (!contentEncoding || statusCode < 200) return true\n if (this.#skipStatusCodes.includes(statusCode)) return true\n if (this.#skipErrorResponses && statusCode >= 400) return true\n return false\n }\n\n /**\n * Creates a chain of decompressors for multiple content encodings\n *\n * @param {string} encodings - Comma-separated list of content encodings\n * @returns {Array} - Array of decompressor streams\n * @throws {Error} - If the number of content-encodings exceeds the maximum allowed\n */\n #createDecompressionChain (encodings) {\n const parts = encodings.split(',')\n\n // Limit the number of content-encodings to prevent resource exhaustion.\n // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).\n const maxContentEncodings = 5\n if (parts.length > maxContentEncodings) {\n throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`)\n }\n\n /** @type {DecompressorStream[]} */\n const decompressors = []\n\n for (let i = parts.length - 1; i >= 0; i--) {\n const encoding = parts[i].trim()\n if (!encoding) continue\n\n if (!supportedEncodings[encoding]) {\n decompressors.length = 0 // Clear if unsupported encoding\n return decompressors // Unsupported encoding\n }\n\n decompressors.push(supportedEncodings[encoding]())\n }\n\n return decompressors\n }\n\n /**\n * Sets up event handlers for a decompressor stream using readable events\n * @param {DecompressorStream} decompressor - The decompressor stream\n * @param {Controller} controller - The controller to coordinate with\n * @returns {void}\n */\n #setupDecompressorEvents (decompressor, controller) {\n decompressor.on('readable', () => {\n let chunk\n while ((chunk = decompressor.read()) !== null) {\n const result = super.onResponseData(controller, chunk)\n if (result === false) {\n break\n }\n }\n })\n\n decompressor.on('error', (error) => {\n super.onResponseError(controller, error)\n })\n }\n\n /**\n * Sets up event handling for a single decompressor\n * @param {Controller} controller - The controller to handle events\n * @returns {void}\n */\n #setupSingleDecompressor (controller) {\n const decompressor = this.#decompressors[0]\n this.#setupDecompressorEvents(decompressor, controller)\n\n decompressor.on('end', () => {\n super.onResponseEnd(controller, {})\n })\n }\n\n /**\n * Sets up event handling for multiple chained decompressors using pipeline\n * @param {Controller} controller - The controller to handle events\n * @returns {void}\n */\n #setupMultipleDecompressors (controller) {\n const lastDecompressor = this.#decompressors[this.#decompressors.length - 1]\n this.#setupDecompressorEvents(lastDecompressor, controller)\n\n pipeline(this.#decompressors, (err) => {\n if (err) {\n super.onResponseError(controller, err)\n return\n }\n super.onResponseEnd(controller, {})\n })\n }\n\n /**\n * Cleans up decompressor references to prevent memory leaks\n * @returns {void}\n */\n #cleanupDecompressors () {\n this.#decompressors.length = 0\n }\n\n /**\n * @param {Controller} controller\n * @param {number} statusCode\n * @param {Record} headers\n * @param {string} statusMessage\n * @returns {void}\n */\n onResponseStart (controller, statusCode, headers, statusMessage) {\n const contentEncoding = headers['content-encoding']\n\n // If content encoding is not supported or status code is in skip list\n if (this.#shouldSkipDecompression(contentEncoding, statusCode)) {\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase())\n\n if (decompressors.length === 0) {\n this.#cleanupDecompressors()\n return super.onResponseStart(controller, statusCode, headers, statusMessage)\n }\n\n this.#decompressors = decompressors\n\n // Remove compression headers since we're decompressing\n const { 'content-encoding': _, 'content-length': __, ...newHeaders } = headers\n\n if (controller?.rawHeaders) {\n const rawHeaders = controller.rawHeaders\n\n if (Array.isArray(rawHeaders)) {\n const filteredHeaders = []\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const headerName = rawHeaders[i]\n const name = Buffer.isBuffer(headerName) ? headerName.toString('latin1') : `${headerName}`\n const lowerName = name.toLowerCase()\n\n if (lowerName === 'content-encoding' || lowerName === 'content-length') {\n continue\n }\n\n filteredHeaders.push(rawHeaders[i], rawHeaders[i + 1])\n }\n controller.rawHeaders = filteredHeaders\n } else if (typeof rawHeaders === 'object') {\n for (const name of Object.keys(rawHeaders)) {\n const lowerName = name.toLowerCase()\n if (lowerName === 'content-encoding' || lowerName === 'content-length') {\n delete rawHeaders[name]\n }\n }\n }\n }\n\n if (this.#decompressors.length === 1) {\n this.#setupSingleDecompressor(controller)\n } else {\n this.#setupMultipleDecompressors(controller)\n }\n\n return super.onResponseStart(controller, statusCode, newHeaders, statusMessage)\n }\n\n /**\n * @param {Controller} controller\n * @param {Buffer} chunk\n * @returns {void}\n */\n onResponseData (controller, chunk) {\n if (this.#decompressors.length > 0) {\n this.#decompressors[0].write(chunk)\n return\n }\n super.onResponseData(controller, chunk)\n }\n\n /**\n * @param {Controller} controller\n * @param {Record | undefined} trailers\n * @returns {void}\n */\n onResponseEnd (controller, trailers) {\n if (this.#decompressors.length > 0) {\n this.#decompressors[0].end()\n this.#cleanupDecompressors()\n return\n }\n super.onResponseEnd(controller, trailers)\n }\n\n /**\n * @param {Controller} controller\n * @param {Error} err\n * @returns {void}\n */\n onResponseError (controller, err) {\n if (this.#decompressors.length > 0) {\n for (const decompressor of this.#decompressors) {\n decompressor.destroy(err)\n }\n this.#cleanupDecompressors()\n }\n super.onResponseError(controller, err)\n }\n}\n\n/**\n * Creates a decompression interceptor for HTTP responses\n * @param {DecompressHandlerOptions} [options] - Options for the interceptor\n * @returns {Function} - Interceptor function\n */\nfunction createDecompressInterceptor (options = {}) {\n // Emit experimental warning only once\n if (!warningEmitted) {\n process.emitWarning(\n 'DecompressInterceptor is experimental and subject to change',\n 'ExperimentalWarning'\n )\n warningEmitted = true\n }\n\n return (dispatch) => {\n return (opts, handler) => {\n const decompressHandler = new DecompressHandler(handler, options)\n return dispatch(opts, decompressHandler)\n }\n }\n}\n\nmodule.exports = createDecompressInterceptor\n","'use strict'\n\nconst { RequestAbortedError } = require('../core/errors')\n\n/**\n * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler\n */\n\nconst DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024\n\n/**\n * @typedef {Object} WaitingHandler\n * @property {DispatchHandler} handler\n * @property {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @property {Buffer[]} bufferedChunks\n * @property {number} bufferedBytes\n * @property {object | null} pendingTrailers\n * @property {boolean} done\n */\n\n/**\n * Handler that forwards response events to multiple waiting handlers.\n * Used for request deduplication.\n *\n * @implements {DispatchHandler}\n */\nclass DeduplicationHandler {\n /**\n * @type {DispatchHandler}\n */\n #primaryHandler\n\n /**\n * @type {WaitingHandler[]}\n */\n #waitingHandlers = []\n\n /**\n * @type {number}\n */\n #maxBufferSize = DEFAULT_MAX_BUFFER_SIZE\n\n /**\n * @type {number}\n */\n #statusCode = 0\n\n /**\n * @type {Record}\n */\n #headers = {}\n\n /**\n * @type {string}\n */\n #statusMessage = ''\n\n /**\n * @type {boolean}\n */\n #aborted = false\n\n /**\n * @type {boolean}\n */\n #responseStarted = false\n\n /**\n * @type {boolean}\n */\n #responseDataStarted = false\n\n /**\n * @type {boolean}\n */\n #completed = false\n\n /**\n * @type {import('../../types/dispatcher.d.ts').default.DispatchController | null}\n */\n #controller = null\n\n /**\n * @type {(() => void) | null}\n */\n #onComplete = null\n\n /**\n * @param {DispatchHandler} primaryHandler The primary handler\n * @param {() => void} onComplete Callback when request completes\n * @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler\n */\n constructor (primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) {\n this.#primaryHandler = primaryHandler\n this.#onComplete = onComplete\n this.#maxBufferSize = maxBufferSize\n }\n\n /**\n * Add a waiting handler that will receive response events.\n * Returns false if deduplication can no longer safely attach this handler.\n *\n * @param {DispatchHandler} handler\n * @returns {boolean}\n */\n addWaitingHandler (handler) {\n if (this.#completed || this.#responseDataStarted) {\n return false\n }\n\n const waitingHandler = this.#createWaitingHandler(handler)\n const waitingController = waitingHandler.controller\n\n try {\n handler.onRequestStart?.(waitingController, null)\n\n if (waitingController.aborted) {\n waitingHandler.done = true\n return true\n }\n\n if (this.#responseStarted) {\n handler.onResponseStart?.(\n waitingController,\n this.#statusCode,\n this.#headers,\n this.#statusMessage\n )\n }\n } catch {\n // Ignore errors from waiting handlers\n waitingHandler.done = true\n return true\n }\n\n if (!waitingController.aborted) {\n this.#waitingHandlers.push(waitingHandler)\n }\n\n return true\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {any} context\n */\n onRequestStart (controller, context) {\n this.#controller = controller\n this.#primaryHandler.onRequestStart?.(controller, context)\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {number} statusCode\n * @param {import('../../types/header.d.ts').IncomingHttpHeaders} headers\n * @param {Socket} socket\n */\n onRequestUpgrade (controller, statusCode, headers, socket) {\n this.#primaryHandler.onRequestUpgrade?.(controller, statusCode, headers, socket)\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {number} statusCode\n * @param {Record} headers\n * @param {string} statusMessage\n */\n onResponseStart (controller, statusCode, headers, statusMessage) {\n this.#responseStarted = true\n this.#statusCode = statusCode\n this.#headers = headers\n this.#statusMessage = statusMessage\n\n this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage)\n\n for (const waitingHandler of this.#waitingHandlers) {\n const { handler, controller: waitingController } = waitingHandler\n\n if (waitingHandler.done || waitingController.aborted) {\n waitingHandler.done = true\n continue\n }\n\n try {\n handler.onResponseStart?.(\n waitingController,\n statusCode,\n headers,\n statusMessage\n )\n } catch {\n // Ignore errors from waiting handlers\n }\n\n if (waitingController.aborted) {\n waitingHandler.done = true\n }\n }\n\n this.#pruneDoneWaitingHandlers()\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {Buffer} chunk\n */\n onResponseData (controller, chunk) {\n if (this.#aborted || this.#completed) {\n return\n }\n\n this.#responseDataStarted = true\n\n this.#primaryHandler.onResponseData?.(controller, chunk)\n\n for (const waitingHandler of this.#waitingHandlers) {\n const { handler, controller: waitingController } = waitingHandler\n\n if (waitingHandler.done || waitingController.aborted) {\n waitingHandler.done = true\n continue\n }\n\n if (waitingController.paused) {\n this.#bufferWaitingChunk(waitingHandler, chunk)\n continue\n }\n\n try {\n handler.onResponseData?.(waitingController, chunk)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n if (waitingController.aborted) {\n waitingHandler.done = true\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n }\n }\n\n this.#pruneDoneWaitingHandlers()\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {object} trailers\n */\n onResponseEnd (controller, trailers) {\n if (this.#aborted || this.#completed) {\n return\n }\n\n this.#completed = true\n this.#primaryHandler.onResponseEnd?.(controller, trailers)\n\n for (const waitingHandler of this.#waitingHandlers) {\n if (waitingHandler.done || waitingHandler.controller.aborted) {\n waitingHandler.done = true\n continue\n }\n\n this.#flushWaitingHandler(waitingHandler)\n\n if (waitingHandler.done || waitingHandler.controller.aborted) {\n waitingHandler.done = true\n continue\n }\n\n if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) {\n waitingHandler.pendingTrailers = trailers\n continue\n }\n\n try {\n waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n waitingHandler.done = true\n }\n\n this.#pruneDoneWaitingHandlers()\n this.#onComplete?.()\n }\n\n /**\n * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller\n * @param {Error} err\n */\n onResponseError (controller, err) {\n if (this.#completed) {\n return\n }\n\n this.#aborted = true\n this.#completed = true\n\n this.#primaryHandler.onResponseError?.(controller, err)\n\n for (const waitingHandler of this.#waitingHandlers) {\n this.#errorWaitingHandler(waitingHandler, err)\n }\n\n this.#waitingHandlers = []\n this.#onComplete?.()\n }\n\n /**\n * @param {DispatchHandler} handler\n * @returns {WaitingHandler}\n */\n #createWaitingHandler (handler) {\n /** @type {WaitingHandler} */\n const waitingHandler = {\n handler,\n controller: null,\n bufferedChunks: [],\n bufferedBytes: 0,\n pendingTrailers: null,\n done: false\n }\n\n const state = {\n aborted: false,\n paused: false,\n reason: null\n }\n\n waitingHandler.controller = {\n resume: () => {\n if (state.aborted) {\n return\n }\n\n state.paused = false\n this.#flushWaitingHandler(waitingHandler)\n\n if (\n this.#completed &&\n waitingHandler.pendingTrailers &&\n waitingHandler.bufferedChunks.length === 0 &&\n !state.paused &&\n !state.aborted\n ) {\n try {\n waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n waitingHandler.pendingTrailers = null\n waitingHandler.done = true\n }\n\n this.#pruneDoneWaitingHandlers()\n },\n pause: () => {\n if (!state.aborted) {\n state.paused = true\n }\n },\n get paused () { return state.paused },\n get aborted () { return state.aborted },\n get reason () { return state.reason },\n abort: (reason) => {\n state.aborted = true\n state.reason = reason ?? null\n waitingHandler.done = true\n waitingHandler.pendingTrailers = null\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n }\n }\n\n return waitingHandler\n }\n\n /**\n * @param {WaitingHandler} waitingHandler\n * @param {Buffer} chunk\n */\n #bufferWaitingChunk (waitingHandler, chunk) {\n if (waitingHandler.done || waitingHandler.controller.aborted) {\n waitingHandler.done = true\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n return\n }\n\n const bufferedChunk = Buffer.from(chunk)\n waitingHandler.bufferedChunks.push(bufferedChunk)\n waitingHandler.bufferedBytes += bufferedChunk.length\n\n if (waitingHandler.bufferedBytes > this.#maxBufferSize) {\n const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`)\n this.#errorWaitingHandler(waitingHandler, err)\n }\n }\n\n /**\n * @param {WaitingHandler} waitingHandler\n */\n #flushWaitingHandler (waitingHandler) {\n const { handler, controller } = waitingHandler\n\n while (\n !waitingHandler.done &&\n !controller.aborted &&\n !controller.paused &&\n waitingHandler.bufferedChunks.length > 0\n ) {\n const bufferedChunk = waitingHandler.bufferedChunks.shift()\n waitingHandler.bufferedBytes -= bufferedChunk.length\n\n try {\n handler.onResponseData?.(controller, bufferedChunk)\n } catch {\n // Ignore errors from waiting handlers\n }\n\n if (controller.aborted) {\n waitingHandler.done = true\n waitingHandler.pendingTrailers = null\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n break\n }\n }\n }\n\n /**\n * @param {WaitingHandler} waitingHandler\n * @param {Error} err\n */\n #errorWaitingHandler (waitingHandler, err) {\n if (waitingHandler.done) {\n return\n }\n\n waitingHandler.done = true\n waitingHandler.pendingTrailers = null\n waitingHandler.bufferedChunks = []\n waitingHandler.bufferedBytes = 0\n\n try {\n waitingHandler.controller.abort(err)\n waitingHandler.handler.onResponseError?.(waitingHandler.controller, err)\n } catch {\n // Ignore errors from waiting handlers\n }\n }\n\n #pruneDoneWaitingHandlers () {\n this.#waitingHandlers = this.#waitingHandlers.filter(waitingHandler => waitingHandler.done === false)\n }\n}\n\nmodule.exports = DeduplicationHandler\n","'use strict'\n\nconst diagnosticsChannel = require('node:diagnostics_channel')\nconst util = require('../core/util')\nconst DeduplicationHandler = require('../handler/deduplication-handler')\nconst { normalizeHeaders, makeCacheKey, makeDeduplicationKey } = require('../util/cache.js')\n\nconst pendingRequestsChannel = diagnosticsChannel.channel('undici:request:pending-requests')\n\n/**\n * @param {import('../../types/interceptors.d.ts').default.DeduplicateInterceptorOpts} [opts]\n * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}\n */\nmodule.exports = (opts = {}) => {\n const {\n methods = ['GET'],\n skipHeaderNames = [],\n excludeHeaderNames = [],\n maxBufferSize = 5 * 1024 * 1024\n } = opts\n\n if (typeof opts !== 'object' || opts === null) {\n throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)\n }\n\n if (!Array.isArray(methods)) {\n throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`)\n }\n\n for (const method of methods) {\n if (!util.safeHTTPMethods.includes(method)) {\n throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`)\n }\n }\n\n if (!Array.isArray(skipHeaderNames)) {\n throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`)\n }\n\n if (!Array.isArray(excludeHeaderNames)) {\n throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`)\n }\n\n if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) {\n throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`)\n }\n\n // Convert to lowercase Set for case-insensitive header matching\n const skipHeaderNamesSet = new Set(skipHeaderNames.map(name => name.toLowerCase()))\n\n // Convert to lowercase Set for case-insensitive header exclusion from deduplication key\n const excludeHeaderNamesSet = new Set(excludeHeaderNames.map(name => name.toLowerCase()))\n\n /**\n * Map of pending requests for deduplication\n * @type {Map}\n */\n const pendingRequests = new Map()\n\n return dispatch => {\n return (opts, handler) => {\n if (!opts.origin || methods.includes(opts.method) === false) {\n return dispatch(opts, handler)\n }\n\n opts = {\n ...opts,\n headers: normalizeHeaders(opts)\n }\n\n // Skip deduplication if request contains any of the specified headers\n if (skipHeaderNamesSet.size > 0) {\n for (const headerName of Object.keys(opts.headers)) {\n if (skipHeaderNamesSet.has(headerName.toLowerCase())) {\n return dispatch(opts, handler)\n }\n }\n }\n\n const cacheKey = makeCacheKey(opts)\n const dedupeKey = makeDeduplicationKey(cacheKey, excludeHeaderNamesSet)\n\n // Check if there's already a pending request for this key\n const pendingHandler = pendingRequests.get(dedupeKey)\n if (pendingHandler) {\n // Add this handler to the waiting list when safe.\n // If body streaming has already started, this request must be sent independently.\n if (pendingHandler.addWaitingHandler(handler)) {\n return true\n }\n\n return dispatch(opts, handler)\n }\n\n // Create a new deduplication handler\n const deduplicationHandler = new DeduplicationHandler(\n handler,\n () => {\n // Clean up when request completes\n pendingRequests.delete(dedupeKey)\n if (pendingRequestsChannel.hasSubscribers) {\n pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'removed' })\n }\n },\n maxBufferSize\n )\n\n // Register the pending request\n pendingRequests.set(dedupeKey, deduplicationHandler)\n if (pendingRequestsChannel.hasSubscribers) {\n pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'added' })\n }\n\n return dispatch(opts, deduplicationHandler)\n }\n }\n}\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst { assertCacheKey, assertCacheValue } = require('../util/cache.js')\n\nlet DatabaseSync\n\nconst VERSION = 3\n\n// 2gb\nconst MAX_ENTRY_SIZE = 2 * 1000 * 1000 * 1000\n\n/**\n * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore\n * @implements {CacheStore}\n *\n * @typedef {{\n * id: Readonly,\n * body?: Uint8Array\n * statusCode: number\n * statusMessage: string\n * headers?: string\n * vary?: string\n * etag?: string\n * cacheControlDirectives?: string\n * cachedAt: number\n * staleAt: number\n * deleteAt: number\n * }} SqliteStoreValue\n */\nmodule.exports = class SqliteCacheStore {\n #maxEntrySize = MAX_ENTRY_SIZE\n #maxCount = Infinity\n\n /**\n * @type {import('node:sqlite').DatabaseSync}\n */\n #db\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #getValuesQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #updateValueQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #insertValueQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #deleteExpiredValuesQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #deleteByUrlQuery\n\n /**\n * @type {import('node:sqlite').StatementSync}\n */\n #countEntriesQuery\n\n /**\n * @type {import('node:sqlite').StatementSync | null}\n */\n #deleteOldValuesQuery\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.SqliteCacheStoreOpts | undefined} opts\n */\n constructor (opts) {\n if (opts) {\n if (typeof opts !== 'object') {\n throw new TypeError('SqliteCacheStore options must be an object')\n }\n\n if (opts.maxEntrySize !== undefined) {\n if (\n typeof opts.maxEntrySize !== 'number' ||\n !Number.isInteger(opts.maxEntrySize) ||\n opts.maxEntrySize < 0\n ) {\n throw new TypeError('SqliteCacheStore options.maxEntrySize must be a non-negative integer')\n }\n\n if (opts.maxEntrySize > MAX_ENTRY_SIZE) {\n throw new TypeError('SqliteCacheStore options.maxEntrySize must be less than 2gb')\n }\n\n this.#maxEntrySize = opts.maxEntrySize\n }\n\n if (opts.maxCount !== undefined) {\n if (\n typeof opts.maxCount !== 'number' ||\n !Number.isInteger(opts.maxCount) ||\n opts.maxCount < 0\n ) {\n throw new TypeError('SqliteCacheStore options.maxCount must be a non-negative integer')\n }\n this.#maxCount = opts.maxCount\n }\n }\n\n if (!DatabaseSync) {\n DatabaseSync = require('node:sqlite').DatabaseSync\n }\n this.#db = new DatabaseSync(opts?.location ?? ':memory:')\n\n this.#db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = NORMAL;\n PRAGMA temp_store = memory;\n PRAGMA optimize;\n\n CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION} (\n -- Data specific to us\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n url TEXT NOT NULL,\n method TEXT NOT NULL,\n\n -- Data returned to the interceptor\n body BUF NULL,\n deleteAt INTEGER NOT NULL,\n statusCode INTEGER NOT NULL,\n statusMessage TEXT NOT NULL,\n headers TEXT NULL,\n cacheControlDirectives TEXT NULL,\n etag TEXT NULL,\n vary TEXT NULL,\n cachedAt INTEGER NOT NULL,\n staleAt INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_getValuesQuery ON cacheInterceptorV${VERSION}(url, method, deleteAt);\n CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_deleteByUrlQuery ON cacheInterceptorV${VERSION}(deleteAt);\n `)\n\n this.#getValuesQuery = this.#db.prepare(`\n SELECT\n id,\n body,\n deleteAt,\n statusCode,\n statusMessage,\n headers,\n etag,\n cacheControlDirectives,\n vary,\n cachedAt,\n staleAt\n FROM cacheInterceptorV${VERSION}\n WHERE\n url = ?\n AND method = ?\n ORDER BY\n deleteAt ASC\n `)\n\n this.#updateValueQuery = this.#db.prepare(`\n UPDATE cacheInterceptorV${VERSION} SET\n body = ?,\n deleteAt = ?,\n statusCode = ?,\n statusMessage = ?,\n headers = ?,\n etag = ?,\n cacheControlDirectives = ?,\n cachedAt = ?,\n staleAt = ?\n WHERE\n id = ?\n `)\n\n this.#insertValueQuery = this.#db.prepare(`\n INSERT INTO cacheInterceptorV${VERSION} (\n url,\n method,\n body,\n deleteAt,\n statusCode,\n statusMessage,\n headers,\n etag,\n cacheControlDirectives,\n vary,\n cachedAt,\n staleAt\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n this.#deleteByUrlQuery = this.#db.prepare(\n `DELETE FROM cacheInterceptorV${VERSION} WHERE url = ?`\n )\n\n this.#countEntriesQuery = this.#db.prepare(\n `SELECT COUNT(*) AS total FROM cacheInterceptorV${VERSION}`\n )\n\n this.#deleteExpiredValuesQuery = this.#db.prepare(\n `DELETE FROM cacheInterceptorV${VERSION} WHERE deleteAt <= ?`\n )\n\n this.#deleteOldValuesQuery = this.#maxCount === Infinity\n ? null\n : this.#db.prepare(`\n DELETE FROM cacheInterceptorV${VERSION}\n WHERE id IN (\n SELECT\n id\n FROM cacheInterceptorV${VERSION}\n ORDER BY cachedAt DESC\n LIMIT ?\n )\n `)\n }\n\n close () {\n this.#db.close()\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @returns {(import('../../types/cache-interceptor.d.ts').default.GetResult & { body?: Buffer }) | undefined}\n */\n get (key) {\n assertCacheKey(key)\n\n const value = this.#findValue(key)\n return value\n ? {\n body: value.body ? Buffer.from(value.body.buffer, value.body.byteOffset, value.body.byteLength) : undefined,\n statusCode: value.statusCode,\n statusMessage: value.statusMessage,\n headers: value.headers ? JSON.parse(value.headers) : undefined,\n etag: value.etag ? value.etag : undefined,\n vary: value.vary ? JSON.parse(value.vary) : undefined,\n cacheControlDirectives: value.cacheControlDirectives\n ? JSON.parse(value.cacheControlDirectives)\n : undefined,\n cachedAt: value.cachedAt,\n staleAt: value.staleAt,\n deleteAt: value.deleteAt\n }\n : undefined\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue & { body: null | Buffer | Array}} value\n */\n set (key, value) {\n assertCacheKey(key)\n\n const url = this.#makeValueUrl(key)\n const body = Array.isArray(value.body) ? Buffer.concat(value.body) : value.body\n const size = body?.byteLength\n\n if (size && size > this.#maxEntrySize) {\n return\n }\n\n const existingValue = this.#findValue(key, true)\n if (existingValue) {\n // Updating an existing response, let's overwrite it\n this.#updateValueQuery.run(\n body,\n value.deleteAt,\n value.statusCode,\n value.statusMessage,\n value.headers ? JSON.stringify(value.headers) : null,\n value.etag ? value.etag : null,\n value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,\n value.cachedAt,\n value.staleAt,\n existingValue.id\n )\n } else {\n this.#prune()\n // New response, let's insert it\n this.#insertValueQuery.run(\n url,\n key.method,\n body,\n value.deleteAt,\n value.statusCode,\n value.statusMessage,\n value.headers ? JSON.stringify(value.headers) : null,\n value.etag ? value.etag : null,\n value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,\n value.vary ? JSON.stringify(value.vary) : null,\n value.cachedAt,\n value.staleAt\n )\n }\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} value\n * @returns {Writable | undefined}\n */\n createWriteStream (key, value) {\n assertCacheKey(key)\n assertCacheValue(value)\n\n let size = 0\n /**\n * @type {Buffer[] | null}\n */\n const body = []\n const store = this\n\n return new Writable({\n decodeStrings: true,\n write (chunk, encoding, callback) {\n size += chunk.byteLength\n\n if (size < store.#maxEntrySize) {\n body.push(chunk)\n } else {\n this.destroy()\n }\n\n callback()\n },\n final (callback) {\n store.set(key, { ...value, body })\n callback()\n }\n })\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n */\n delete (key) {\n if (typeof key !== 'object') {\n throw new TypeError(`expected key to be object, got ${typeof key}`)\n }\n\n this.#deleteByUrlQuery.run(this.#makeValueUrl(key))\n }\n\n #prune () {\n if (Number.isFinite(this.#maxCount) && this.size <= this.#maxCount) {\n return 0\n }\n\n {\n const removed = this.#deleteExpiredValuesQuery.run(Date.now()).changes\n if (removed) {\n return removed\n }\n }\n\n {\n const removed = this.#deleteOldValuesQuery?.run(Math.max(Math.floor(this.#maxCount * 0.1), 1)).changes\n if (removed) {\n return removed\n }\n }\n\n return 0\n }\n\n /**\n * Counts the number of rows in the cache\n * @returns {Number}\n */\n get size () {\n const { total } = this.#countEntriesQuery.get()\n return total\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @returns {string}\n */\n #makeValueUrl (key) {\n return `${key.origin}/${key.path}`\n }\n\n /**\n * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key\n * @param {boolean} [canBeExpired=false]\n * @returns {SqliteStoreValue | undefined}\n */\n #findValue (key, canBeExpired = false) {\n const url = this.#makeValueUrl(key)\n const { headers, method } = key\n\n /**\n * @type {SqliteStoreValue[]}\n */\n const values = this.#getValuesQuery.all(url, method)\n\n if (values.length === 0) {\n return undefined\n }\n\n const now = Date.now()\n for (const value of values) {\n if (now >= value.deleteAt && !canBeExpired) {\n return undefined\n }\n\n let matches = true\n\n if (value.vary) {\n const vary = JSON.parse(value.vary)\n\n for (const header in vary) {\n if (!headerValueEquals(headers[header], vary[header])) {\n matches = false\n break\n }\n }\n }\n\n if (matches) {\n return value\n }\n }\n\n return undefined\n }\n}\n\n/**\n * @param {string|string[]|null|undefined} lhs\n * @param {string|string[]|null|undefined} rhs\n * @returns {boolean}\n */\nfunction headerValueEquals (lhs, rhs) {\n if (lhs == null && rhs == null) {\n return true\n }\n\n if ((lhs == null && rhs != null) ||\n (lhs != null && rhs == null)) {\n return false\n }\n\n if (Array.isArray(lhs) && Array.isArray(rhs)) {\n if (lhs.length !== rhs.length) {\n return false\n }\n\n return lhs.every((x, i) => x === rhs[i])\n }\n\n return lhs === rhs\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst { kConstruct } = require('../../core/symbols')\nconst { kEnumerableProperty } = require('../../core/util')\nconst {\n iteratorMixin,\n isValidHeaderName,\n isValidHeaderValue\n} = require('./util')\nconst { webidl } = require('../webidl')\nconst assert = require('node:assert')\nconst util = require('node:util')\n\n/**\n * @param {number} code\n * @returns {code is (0x0a | 0x0d | 0x09 | 0x20)}\n */\nfunction isHTTPWhiteSpaceCharCode (code) {\n return code === 0x0a || code === 0x0d || code === 0x09 || code === 0x20\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize\n * @param {string} potentialValue\n * @returns {string}\n */\nfunction headerValueNormalize (potentialValue) {\n // To normalize a byte sequence potentialValue, remove\n // any leading and trailing HTTP whitespace bytes from\n // potentialValue.\n let i = 0; let j = potentialValue.length\n\n while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j\n while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i\n\n return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)\n}\n\n/**\n * @param {Headers} headers\n * @param {Array|Object} object\n */\nfunction fill (headers, object) {\n // To fill a Headers object headers with a given object object, run these steps:\n\n // 1. If object is a sequence, then for each header in object:\n // Note: webidl conversion to array has already been done.\n if (Array.isArray(object)) {\n for (let i = 0; i < object.length; ++i) {\n const header = object[i]\n // 1. If header does not contain exactly two items, then throw a TypeError.\n if (header.length !== 2) {\n throw webidl.errors.exception({\n header: 'Headers constructor',\n message: `expected name/value pair to be length 2, found ${header.length}.`\n })\n }\n\n // 2. Append (header’s first item, header’s second item) to headers.\n appendHeader(headers, header[0], header[1])\n }\n } else if (typeof object === 'object' && object !== null) {\n // Note: null should throw\n\n // 2. Otherwise, object is a record, then for each key → value in object,\n // append (key, value) to headers\n const keys = Object.keys(object)\n for (let i = 0; i < keys.length; ++i) {\n appendHeader(headers, keys[i], object[keys[i]])\n }\n } else {\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-headers-append\n * @param {Headers} headers\n * @param {string} name\n * @param {string} value\n */\nfunction appendHeader (headers, name, value) {\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value,\n type: 'header value'\n })\n }\n\n // 3. If headers’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if headers’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 5. Otherwise, if headers’s guard is \"request-no-cors\":\n // TODO\n // Note: undici does not implement forbidden header names\n if (getHeadersGuard(headers) === 'immutable') {\n throw new TypeError('immutable')\n }\n\n // 6. Otherwise, if headers’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n\n // 7. Append (name, value) to headers’s header list.\n return getHeadersList(headers).append(name, value, false)\n\n // 8. If headers’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from headers\n}\n\n// https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n/**\n * @param {Headers} target\n */\nfunction headersListSortAndCombine (target) {\n const headersList = getHeadersList(target)\n\n if (!headersList) {\n return []\n }\n\n if (headersList.sortedMap) {\n return headersList.sortedMap\n }\n\n // 1. Let headers be an empty list of headers with the key being the name\n // and value the value.\n const headers = []\n\n // 2. Let names be the result of convert header names to a sorted-lowercase\n // set with all the names of the headers in list.\n const names = headersList.toSortedArray()\n\n const cookies = headersList.cookies\n\n // fast-path\n if (cookies === null || cookies.length === 1) {\n // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray`\n return (headersList.sortedMap = names)\n }\n\n // 3. For each name of names:\n for (let i = 0; i < names.length; ++i) {\n const { 0: name, 1: value } = names[i]\n // 1. If name is `set-cookie`, then:\n if (name === 'set-cookie') {\n // 1. Let values be a list of all values of headers in list whose name\n // is a byte-case-insensitive match for name, in order.\n\n // 2. For each value of values:\n // 1. Append (name, value) to headers.\n for (let j = 0; j < cookies.length; ++j) {\n headers.push([name, cookies[j]])\n }\n } else {\n // 2. Otherwise:\n\n // 1. Let value be the result of getting name from list.\n\n // 2. Assert: value is non-null.\n // Note: This operation was done by `HeadersList#toSortedArray`.\n\n // 3. Append (name, value) to headers.\n headers.push([name, value])\n }\n }\n\n // 4. Return headers.\n return (headersList.sortedMap = headers)\n}\n\nfunction compareHeaderName (a, b) {\n return a[0] < b[0] ? -1 : 1\n}\n\nclass HeadersList {\n /** @type {[string, string][]|null} */\n cookies = null\n\n sortedMap\n headersMap\n\n constructor (init) {\n if (init instanceof HeadersList) {\n this.headersMap = new Map(init.headersMap)\n this.sortedMap = init.sortedMap\n this.cookies = init.cookies === null ? null : [...init.cookies]\n } else {\n this.headersMap = new Map(init)\n this.sortedMap = null\n }\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#header-list-contains\n * @param {string} name\n * @param {boolean} isLowerCase\n */\n contains (name, isLowerCase) {\n // A header list list contains a header name name if list\n // contains a header whose name is a byte-case-insensitive\n // match for name.\n\n return this.headersMap.has(isLowerCase ? name : name.toLowerCase())\n }\n\n clear () {\n this.headersMap.clear()\n this.sortedMap = null\n this.cookies = null\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-append\n * @param {string} name\n * @param {string} value\n * @param {boolean} isLowerCase\n */\n append (name, value, isLowerCase) {\n this.sortedMap = null\n\n // 1. If list contains name, then set name to the first such\n // header’s name.\n const lowercaseName = isLowerCase ? name : name.toLowerCase()\n const exists = this.headersMap.get(lowercaseName)\n\n // 2. Append (name, value) to list.\n if (exists) {\n const delimiter = lowercaseName === 'cookie' ? '; ' : ', '\n this.headersMap.set(lowercaseName, {\n name: exists.name,\n value: `${exists.value}${delimiter}${value}`\n })\n } else {\n this.headersMap.set(lowercaseName, { name, value })\n }\n\n if (lowercaseName === 'set-cookie') {\n (this.cookies ??= []).push(value)\n }\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-set\n * @param {string} name\n * @param {string} value\n * @param {boolean} isLowerCase\n */\n set (name, value, isLowerCase) {\n this.sortedMap = null\n const lowercaseName = isLowerCase ? name : name.toLowerCase()\n\n if (lowercaseName === 'set-cookie') {\n this.cookies = [value]\n }\n\n // 1. If list contains name, then set the value of\n // the first such header to value and remove the\n // others.\n // 2. Otherwise, append header (name, value) to list.\n this.headersMap.set(lowercaseName, { name, value })\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-delete\n * @param {string} name\n * @param {boolean} isLowerCase\n */\n delete (name, isLowerCase) {\n this.sortedMap = null\n if (!isLowerCase) name = name.toLowerCase()\n\n if (name === 'set-cookie') {\n this.cookies = null\n }\n\n this.headersMap.delete(name)\n }\n\n /**\n * @see https://fetch.spec.whatwg.org/#concept-header-list-get\n * @param {string} name\n * @param {boolean} isLowerCase\n * @returns {string | null}\n */\n get (name, isLowerCase) {\n // 1. If list does not contain name, then return null.\n // 2. Return the values of all headers in list whose name\n // is a byte-case-insensitive match for name,\n // separated from each other by 0x2C 0x20, in order.\n return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null\n }\n\n * [Symbol.iterator] () {\n // use the lowercased name\n for (const { 0: name, 1: { value } } of this.headersMap) {\n yield [name, value]\n }\n }\n\n get entries () {\n const headers = {}\n\n if (this.headersMap.size !== 0) {\n for (const { name, value } of this.headersMap.values()) {\n headers[name] = value\n }\n }\n\n return headers\n }\n\n rawValues () {\n return this.headersMap.values()\n }\n\n get entriesList () {\n const headers = []\n\n if (this.headersMap.size !== 0) {\n for (const { 0: lowerName, 1: { name, value } } of this.headersMap) {\n if (lowerName === 'set-cookie') {\n for (const cookie of this.cookies) {\n headers.push([name, cookie])\n }\n } else {\n headers.push([name, value])\n }\n }\n }\n\n return headers\n }\n\n // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set\n toSortedArray () {\n const size = this.headersMap.size\n const array = new Array(size)\n // In most cases, you will use the fast-path.\n // fast-path: Use binary insertion sort for small arrays.\n if (size <= 32) {\n if (size === 0) {\n // If empty, it is an empty array. To avoid the first index assignment.\n return array\n }\n // Improve performance by unrolling loop and avoiding double-loop.\n // Double-loop-less version of the binary insertion sort.\n const iterator = this.headersMap[Symbol.iterator]()\n const firstValue = iterator.next().value\n // set [name, value] to first index.\n array[0] = [firstValue[0], firstValue[1].value]\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n // 3.2.2. Assert: value is non-null.\n assert(firstValue[1].value !== null)\n for (\n let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value;\n i < size;\n ++i\n ) {\n // get next value\n value = iterator.next().value\n // set [name, value] to current index.\n x = array[i] = [value[0], value[1].value]\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n // 3.2.2. Assert: value is non-null.\n assert(x[1] !== null)\n left = 0\n right = i\n // binary search\n while (left < right) {\n // middle index\n pivot = left + ((right - left) >> 1)\n // compare header name\n if (array[pivot][0] <= x[0]) {\n left = pivot + 1\n } else {\n right = pivot\n }\n }\n if (i !== pivot) {\n j = i\n while (j > left) {\n array[j] = array[--j]\n }\n array[left] = x\n }\n }\n /* c8 ignore next 4 */\n if (!iterator.next().done) {\n // This is for debugging and will never be called.\n throw new TypeError('Unreachable')\n }\n return array\n } else {\n // This case would be a rare occurrence.\n // slow-path: fallback\n let i = 0\n for (const { 0: name, 1: { value } } of this.headersMap) {\n array[i++] = [name, value]\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n // 3.2.2. Assert: value is non-null.\n assert(value !== null)\n }\n return array.sort(compareHeaderName)\n }\n }\n}\n\n// https://fetch.spec.whatwg.org/#headers-class\nclass Headers {\n #guard\n /**\n * @type {HeadersList}\n */\n #headersList\n\n /**\n * @param {HeadersInit|Symbol} [init]\n * @returns\n */\n constructor (init = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (init === kConstruct) {\n return\n }\n\n this.#headersList = new HeadersList()\n\n // The new Headers(init) constructor steps are:\n\n // 1. Set this’s guard to \"none\".\n this.#guard = 'none'\n\n // 2. If init is given, then fill this with init.\n if (init !== undefined) {\n init = webidl.converters.HeadersInit(init, 'Headers constructor', 'init')\n fill(this, init)\n }\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-append\n append (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, 'Headers.append')\n\n const prefix = 'Headers.append'\n name = webidl.converters.ByteString(name, prefix, 'name')\n value = webidl.converters.ByteString(value, prefix, 'value')\n\n return appendHeader(this, name, value)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-delete\n delete (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, 'Headers.delete')\n\n const prefix = 'Headers.delete'\n name = webidl.converters.ByteString(name, prefix, 'name')\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.delete',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. If this’s guard is \"immutable\", then throw a TypeError.\n // 3. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 4. Otherwise, if this’s guard is \"request-no-cors\", name\n // is not a no-CORS-safelisted request-header name, and\n // name is not a privileged no-CORS request-header name,\n // return.\n // 5. Otherwise, if this’s guard is \"response\" and name is\n // a forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this.#guard === 'immutable') {\n throw new TypeError('immutable')\n }\n\n // 6. If this’s header list does not contain name, then\n // return.\n if (!this.#headersList.contains(name, false)) {\n return\n }\n\n // 7. Delete name from this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this.\n this.#headersList.delete(name, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-get\n get (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, 'Headers.get')\n\n const prefix = 'Headers.get'\n name = webidl.converters.ByteString(name, prefix, 'name')\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return the result of getting name from this’s header\n // list.\n return this.#headersList.get(name, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-has\n has (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, 'Headers.has')\n\n const prefix = 'Headers.has'\n name = webidl.converters.ByteString(name, prefix, 'name')\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return true if this’s header list contains name;\n // otherwise false.\n return this.#headersList.contains(name, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-set\n set (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, 'Headers.set')\n\n const prefix = 'Headers.set'\n name = webidl.converters.ByteString(name, prefix, 'name')\n value = webidl.converters.ByteString(value, prefix, 'value')\n\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix,\n value,\n type: 'header value'\n })\n }\n\n // 3. If this’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 5. Otherwise, if this’s guard is \"request-no-cors\" and\n // name/value is not a no-CORS-safelisted request-header,\n // return.\n // 6. Otherwise, if this’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this.#guard === 'immutable') {\n throw new TypeError('immutable')\n }\n\n // 7. Set (name, value) in this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this\n this.#headersList.set(name, value, false)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie\n getSetCookie () {\n webidl.brandCheck(this, Headers)\n\n // 1. If this’s header list does not contain `Set-Cookie`, then return « ».\n // 2. Return the values of all headers in this’s header list whose name is\n // a byte-case-insensitive match for `Set-Cookie`, in order.\n\n const list = this.#headersList.cookies\n\n if (list) {\n return [...list]\n }\n\n return []\n }\n\n [util.inspect.custom] (depth, options) {\n options.depth ??= depth\n\n return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}`\n }\n\n static getHeadersGuard (o) {\n return o.#guard\n }\n\n static setHeadersGuard (o, guard) {\n o.#guard = guard\n }\n\n /**\n * @param {Headers} o\n */\n static getHeadersList (o) {\n return o.#headersList\n }\n\n /**\n * @param {Headers} target\n * @param {HeadersList} list\n */\n static setHeadersList (target, list) {\n target.#headersList = list\n }\n}\n\nconst { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers\nReflect.deleteProperty(Headers, 'getHeadersGuard')\nReflect.deleteProperty(Headers, 'setHeadersGuard')\nReflect.deleteProperty(Headers, 'getHeadersList')\nReflect.deleteProperty(Headers, 'setHeadersList')\n\niteratorMixin('Headers', Headers, headersListSortAndCombine, 0, 1)\n\nObject.defineProperties(Headers.prototype, {\n append: kEnumerableProperty,\n delete: kEnumerableProperty,\n get: kEnumerableProperty,\n has: kEnumerableProperty,\n set: kEnumerableProperty,\n getSetCookie: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Headers',\n configurable: true\n },\n [util.inspect.custom]: {\n enumerable: false\n }\n})\n\nwebidl.converters.HeadersInit = function (V, prefix, argument) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {\n const iterator = Reflect.get(V, Symbol.iterator)\n\n // A work-around to ensure we send the properly-cased Headers when V is a Headers object.\n // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please.\n if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object\n try {\n return getHeadersList(V).entriesList\n } catch {\n // fall-through\n }\n }\n\n if (typeof iterator === 'function') {\n return webidl.converters['sequence>'](V, prefix, argument, iterator.bind(V))\n }\n\n return webidl.converters['record'](V, prefix, argument)\n }\n\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n}\n\nmodule.exports = {\n fill,\n // for test.\n compareHeaderName,\n Headers,\n HeadersList,\n getHeadersGuard,\n setHeadersGuard,\n setHeadersList,\n getHeadersList\n}\n","'use strict'\n\nconst { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = require('./headers')\nconst { extractBody, cloneBody, mixinBody, streamRegistry, bodyUnusable } = require('./body')\nconst util = require('../../core/util')\nconst nodeUtil = require('node:util')\nconst { kEnumerableProperty } = util\nconst {\n isValidReasonPhrase,\n isCancelled,\n isAborted,\n isErrorLike,\n environmentSettingsObject: relevantRealm\n} = require('./util')\nconst {\n redirectStatusSet,\n nullBodyStatus\n} = require('./constants')\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('./data-url')\nconst { kConstruct } = require('../../core/symbols')\nconst assert = require('node:assert')\nconst { isomorphicEncode, serializeJavascriptValueToJSONString } = require('../infra')\n\nconst textEncoder = new TextEncoder('utf-8')\n\n// https://fetch.spec.whatwg.org/#response-class\nclass Response {\n /** @type {Headers} */\n #headers\n\n #state\n\n // Creates network error Response.\n static error () {\n // The static error() method steps are to return the result of creating a\n // Response object, given a new network error, \"immutable\", and this’s\n // relevant Realm.\n const responseObject = fromInnerResponse(makeNetworkError(), 'immutable')\n\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response-json\n static json (data, init = undefined) {\n webidl.argumentLengthCheck(arguments, 1, 'Response.json')\n\n if (init !== null) {\n init = webidl.converters.ResponseInit(init)\n }\n\n // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.\n const bytes = textEncoder.encode(\n serializeJavascriptValueToJSONString(data)\n )\n\n // 2. Let body be the result of extracting bytes.\n const body = extractBody(bytes)\n\n // 3. Let responseObject be the result of creating a Response object, given a new response,\n // \"response\", and this’s relevant Realm.\n const responseObject = fromInnerResponse(makeResponse({}), 'response')\n\n // 4. Perform initialize a response given responseObject, init, and (body, \"application/json\").\n initializeResponse(responseObject, init, { body: body[0], type: 'application/json' })\n\n // 5. Return responseObject.\n return responseObject\n }\n\n // Creates a redirect Response that redirects to url with status status.\n static redirect (url, status = 302) {\n webidl.argumentLengthCheck(arguments, 1, 'Response.redirect')\n\n url = webidl.converters.USVString(url)\n status = webidl.converters['unsigned short'](status)\n\n // 1. Let parsedURL be the result of parsing url with current settings\n // object’s API base URL.\n // 2. If parsedURL is failure, then throw a TypeError.\n // TODO: base-URL?\n let parsedURL\n try {\n parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl)\n } catch (err) {\n throw new TypeError(`Failed to parse URL from ${url}`, { cause: err })\n }\n\n // 3. If status is not a redirect status, then throw a RangeError.\n if (!redirectStatusSet.has(status)) {\n throw new RangeError(`Invalid status code ${status}`)\n }\n\n // 4. Let responseObject be the result of creating a Response object,\n // given a new response, \"immutable\", and this’s relevant Realm.\n const responseObject = fromInnerResponse(makeResponse({}), 'immutable')\n\n // 5. Set responseObject’s response’s status to status.\n responseObject.#state.status = status\n\n // 6. Let value be parsedURL, serialized and isomorphic encoded.\n const value = isomorphicEncode(URLSerializer(parsedURL))\n\n // 7. Append `Location`/value to responseObject’s response’s header list.\n responseObject.#state.headersList.append('location', value, true)\n\n // 8. Return responseObject.\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response\n constructor (body = null, init = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (body === kConstruct) {\n return\n }\n\n if (body !== null) {\n body = webidl.converters.BodyInit(body, 'Response', 'body')\n }\n\n init = webidl.converters.ResponseInit(init)\n\n // 1. Set this’s response to a new response.\n this.#state = makeResponse({})\n\n // 2. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is this’s response’s header list and guard\n // is \"response\".\n this.#headers = new Headers(kConstruct)\n setHeadersGuard(this.#headers, 'response')\n setHeadersList(this.#headers, this.#state.headersList)\n\n // 3. Let bodyWithType be null.\n let bodyWithType = null\n\n // 4. If body is non-null, then set bodyWithType to the result of extracting body.\n if (body != null) {\n const [extractedBody, type] = extractBody(body)\n bodyWithType = { body: extractedBody, type }\n }\n\n // 5. Perform initialize a response given this, init, and bodyWithType.\n initializeResponse(this, init, bodyWithType)\n }\n\n // Returns response’s type, e.g., \"cors\".\n get type () {\n webidl.brandCheck(this, Response)\n\n // The type getter steps are to return this’s response’s type.\n return this.#state.type\n }\n\n // Returns response’s URL, if it has one; otherwise the empty string.\n get url () {\n webidl.brandCheck(this, Response)\n\n const urlList = this.#state.urlList\n\n // The url getter steps are to return the empty string if this’s\n // response’s URL is null; otherwise this’s response’s URL,\n // serialized with exclude fragment set to true.\n const url = urlList[urlList.length - 1] ?? null\n\n if (url === null) {\n return ''\n }\n\n return URLSerializer(url, true)\n }\n\n // Returns whether response was obtained through a redirect.\n get redirected () {\n webidl.brandCheck(this, Response)\n\n // The redirected getter steps are to return true if this’s response’s URL\n // list has more than one item; otherwise false.\n return this.#state.urlList.length > 1\n }\n\n // Returns response’s status.\n get status () {\n webidl.brandCheck(this, Response)\n\n // The status getter steps are to return this’s response’s status.\n return this.#state.status\n }\n\n // Returns whether response’s status is an ok status.\n get ok () {\n webidl.brandCheck(this, Response)\n\n // The ok getter steps are to return true if this’s response’s status is an\n // ok status; otherwise false.\n return this.#state.status >= 200 && this.#state.status <= 299\n }\n\n // Returns response’s status message.\n get statusText () {\n webidl.brandCheck(this, Response)\n\n // The statusText getter steps are to return this’s response’s status\n // message.\n return this.#state.statusText\n }\n\n // Returns response’s headers as Headers.\n get headers () {\n webidl.brandCheck(this, Response)\n\n // The headers getter steps are to return this’s headers.\n return this.#headers\n }\n\n get body () {\n webidl.brandCheck(this, Response)\n\n return this.#state.body ? this.#state.body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Response)\n\n return !!this.#state.body && util.isDisturbed(this.#state.body.stream)\n }\n\n // Returns a clone of response.\n clone () {\n webidl.brandCheck(this, Response)\n\n // 1. If this is unusable, then throw a TypeError.\n if (bodyUnusable(this.#state)) {\n throw webidl.errors.exception({\n header: 'Response.clone',\n message: 'Body has already been consumed.'\n })\n }\n\n // 2. Let clonedResponse be the result of cloning this’s response.\n const clonedResponse = cloneResponse(this.#state)\n\n // Note: To re-register because of a new stream.\n // Don't set finalizers other than for fetch responses.\n if (this.#state.urlList.length !== 0 && this.#state.body?.stream) {\n streamRegistry.register(this, new WeakRef(this.#state.body.stream))\n }\n\n // 3. Return the result of creating a Response object, given\n // clonedResponse, this’s headers’s guard, and this’s relevant Realm.\n return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers))\n }\n\n [nodeUtil.inspect.custom] (depth, options) {\n if (options.depth === null) {\n options.depth = 2\n }\n\n options.colors ??= true\n\n const properties = {\n status: this.status,\n statusText: this.statusText,\n headers: this.headers,\n body: this.body,\n bodyUsed: this.bodyUsed,\n ok: this.ok,\n redirected: this.redirected,\n type: this.type,\n url: this.url\n }\n\n return `Response ${nodeUtil.formatWithOptions(options, properties)}`\n }\n\n /**\n * @param {Response} response\n */\n static getResponseHeaders (response) {\n return response.#headers\n }\n\n /**\n * @param {Response} response\n * @param {Headers} newHeaders\n */\n static setResponseHeaders (response, newHeaders) {\n response.#headers = newHeaders\n }\n\n /**\n * @param {Response} response\n */\n static getResponseState (response) {\n return response.#state\n }\n\n /**\n * @param {Response} response\n * @param {any} newState\n */\n static setResponseState (response, newState) {\n response.#state = newState\n }\n}\n\nconst { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response\nReflect.deleteProperty(Response, 'getResponseHeaders')\nReflect.deleteProperty(Response, 'setResponseHeaders')\nReflect.deleteProperty(Response, 'getResponseState')\nReflect.deleteProperty(Response, 'setResponseState')\n\nmixinBody(Response, getResponseState)\n\nObject.defineProperties(Response.prototype, {\n type: kEnumerableProperty,\n url: kEnumerableProperty,\n status: kEnumerableProperty,\n ok: kEnumerableProperty,\n redirected: kEnumerableProperty,\n statusText: kEnumerableProperty,\n headers: kEnumerableProperty,\n clone: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Response',\n configurable: true\n }\n})\n\nObject.defineProperties(Response, {\n json: kEnumerableProperty,\n redirect: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\n// https://fetch.spec.whatwg.org/#concept-response-clone\nfunction cloneResponse (response) {\n // To clone a response response, run these steps:\n\n // 1. If response is a filtered response, then return a new identical\n // filtered response whose internal response is a clone of response’s\n // internal response.\n if (response.internalResponse) {\n return filterResponse(\n cloneResponse(response.internalResponse),\n response.type\n )\n }\n\n // 2. Let newResponse be a copy of response, except for its body.\n const newResponse = makeResponse({ ...response, body: null })\n\n // 3. If response’s body is non-null, then set newResponse’s body to the\n // result of cloning response’s body.\n if (response.body != null) {\n newResponse.body = cloneBody(response.body)\n }\n\n // 4. Return newResponse.\n return newResponse\n}\n\nfunction makeResponse (init) {\n return {\n aborted: false,\n rangeRequested: false,\n timingAllowPassed: false,\n requestIncludesCredentials: false,\n type: 'default',\n status: 200,\n timingInfo: null,\n cacheState: '',\n statusText: '',\n ...init,\n headersList: init?.headersList\n ? new HeadersList(init?.headersList)\n : new HeadersList(),\n urlList: init?.urlList ? [...init.urlList] : []\n }\n}\n\nfunction makeNetworkError (reason) {\n const isError = isErrorLike(reason)\n return makeResponse({\n type: 'error',\n status: 0,\n error: isError\n ? reason\n : new Error(reason ? String(reason) : reason),\n aborted: reason && reason.name === 'AbortError'\n })\n}\n\n// @see https://fetch.spec.whatwg.org/#concept-network-error\nfunction isNetworkError (response) {\n return (\n // A network error is a response whose type is \"error\",\n response.type === 'error' &&\n // status is 0\n response.status === 0\n )\n}\n\nfunction makeFilteredResponse (response, state) {\n state = {\n internalResponse: response,\n ...state\n }\n\n return new Proxy(response, {\n get (target, p) {\n return p in state ? state[p] : target[p]\n },\n set (target, p, value) {\n assert(!(p in state))\n target[p] = value\n return true\n }\n })\n}\n\n// https://fetch.spec.whatwg.org/#concept-filtered-response\nfunction filterResponse (response, type) {\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (type === 'basic') {\n // A basic filtered response is a filtered response whose type is \"basic\"\n // and header list excludes any headers in internal response’s header list\n // whose name is a forbidden response-header name.\n\n // Note: undici does not implement forbidden response-header names\n return makeFilteredResponse(response, {\n type: 'basic',\n headersList: response.headersList\n })\n } else if (type === 'cors') {\n // A CORS filtered response is a filtered response whose type is \"cors\"\n // and header list excludes any headers in internal response’s header\n // list whose name is not a CORS-safelisted response-header name, given\n // internal response’s CORS-exposed header-name list.\n\n // Note: undici does not implement CORS-safelisted response-header names\n return makeFilteredResponse(response, {\n type: 'cors',\n headersList: response.headersList\n })\n } else if (type === 'opaque') {\n // An opaque filtered response is a filtered response whose type is\n // \"opaque\", URL list is the empty list, status is 0, status message\n // is the empty byte sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaque',\n urlList: [],\n status: 0,\n statusText: '',\n body: null\n })\n } else if (type === 'opaqueredirect') {\n // An opaque-redirect filtered response is a filtered response whose type\n // is \"opaqueredirect\", status is 0, status message is the empty byte\n // sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaqueredirect',\n status: 0,\n statusText: '',\n headersList: [],\n body: null\n })\n } else {\n assert(false)\n }\n}\n\n// https://fetch.spec.whatwg.org/#appropriate-network-error\nfunction makeAppropriateNetworkError (fetchParams, err = null) {\n // 1. Assert: fetchParams is canceled.\n assert(isCancelled(fetchParams))\n\n // 2. Return an aborted network error if fetchParams is aborted;\n // otherwise return a network error.\n return isAborted(fetchParams)\n ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err }))\n : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err }))\n}\n\n// https://whatpr.org/fetch/1392.html#initialize-a-response\nfunction initializeResponse (response, init, body) {\n // 1. If init[\"status\"] is not in the range 200 to 599, inclusive, then\n // throw a RangeError.\n if (init.status !== null && (init.status < 200 || init.status > 599)) {\n throw new RangeError('init[\"status\"] must be in the range of 200 to 599, inclusive.')\n }\n\n // 2. If init[\"statusText\"] does not match the reason-phrase token production,\n // then throw a TypeError.\n if ('statusText' in init && init.statusText != null) {\n // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2:\n // reason-phrase = *( HTAB / SP / VCHAR / obs-text )\n if (!isValidReasonPhrase(String(init.statusText))) {\n throw new TypeError('Invalid statusText')\n }\n }\n\n // 3. Set response’s response’s status to init[\"status\"].\n if ('status' in init && init.status != null) {\n getResponseState(response).status = init.status\n }\n\n // 4. Set response’s response’s status message to init[\"statusText\"].\n if ('statusText' in init && init.statusText != null) {\n getResponseState(response).statusText = init.statusText\n }\n\n // 5. If init[\"headers\"] exists, then fill response’s headers with init[\"headers\"].\n if ('headers' in init && init.headers != null) {\n fill(getResponseHeaders(response), init.headers)\n }\n\n // 6. If body was given, then:\n if (body) {\n // 1. If response's status is a null body status, then throw a TypeError.\n if (nullBodyStatus.includes(response.status)) {\n throw webidl.errors.exception({\n header: 'Response constructor',\n message: `Invalid response status code ${response.status}`\n })\n }\n\n // 2. Set response's body to body's body.\n getResponseState(response).body = body.body\n\n // 3. If body's type is non-null and response's header list does not contain\n // `Content-Type`, then append (`Content-Type`, body's type) to response's header list.\n if (body.type != null && !getResponseState(response).headersList.contains('content-type', true)) {\n getResponseState(response).headersList.append('content-type', body.type, true)\n }\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#response-create\n * @param {any} innerResponse\n * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard\n * @returns {Response}\n */\nfunction fromInnerResponse (innerResponse, guard) {\n const response = new Response(kConstruct)\n setResponseState(response, innerResponse)\n const headers = new Headers(kConstruct)\n setResponseHeaders(response, headers)\n setHeadersList(headers, innerResponse.headersList)\n setHeadersGuard(headers, guard)\n\n // Note: If innerResponse's urlList contains a URL, it is a fetch response.\n if (innerResponse.urlList.length !== 0 && innerResponse.body?.stream) {\n // If the target (response) is reclaimed, the cleanup callback may be called at some point with\n // the held value provided for it (innerResponse.body.stream). The held value can be any value:\n // a primitive or an object, even undefined. If the held value is an object, the registry keeps\n // a strong reference to it (so it can pass it to the cleanup callback later). Reworded from\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n streamRegistry.register(response, new WeakRef(innerResponse.body.stream))\n }\n\n return response\n}\n\n// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit\nwebidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V, prefix, name)\n }\n\n if (webidl.is.Blob(V)) {\n return V\n }\n\n if (webidl.is.BufferSource(V)) {\n return V\n }\n\n if (webidl.is.FormData(V)) {\n return V\n }\n\n if (webidl.is.URLSearchParams(V)) {\n return V\n }\n\n return webidl.converters.DOMString(V, prefix, name)\n}\n\n// https://fetch.spec.whatwg.org/#bodyinit\nwebidl.converters.BodyInit = function (V, prefix, argument) {\n if (webidl.is.ReadableStream(V)) {\n return V\n }\n\n // Note: the spec doesn't include async iterables,\n // this is an undici extension.\n if (V?.[Symbol.asyncIterator]) {\n return V\n }\n\n return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument)\n}\n\nwebidl.converters.ResponseInit = webidl.dictionaryConverter([\n {\n key: 'status',\n converter: webidl.converters['unsigned short'],\n defaultValue: () => 200\n },\n {\n key: 'statusText',\n converter: webidl.converters.ByteString,\n defaultValue: () => ''\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n }\n])\n\nwebidl.is.Response = webidl.util.MakeTypeAssertion(Response)\n\nmodule.exports = {\n isNetworkError,\n makeNetworkError,\n makeResponse,\n makeAppropriateNetworkError,\n filterResponse,\n Response,\n cloneResponse,\n fromInnerResponse,\n getResponseState\n}\n","/* globals AbortController */\n\n'use strict'\n\nconst { extractBody, mixinBody, cloneBody, bodyUnusable } = require('./body')\nconst { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require('./headers')\nconst util = require('../../core/util')\nconst nodeUtil = require('node:util')\nconst {\n isValidHTTPToken,\n sameOrigin,\n environmentSettingsObject\n} = require('./util')\nconst {\n forbiddenMethodsSet,\n corsSafeListedMethodsSet,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n requestDuplex\n} = require('./constants')\nconst { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('./data-url')\nconst { kConstruct } = require('../../core/symbols')\nconst assert = require('node:assert')\nconst { getMaxListeners, setMaxListeners, defaultMaxListeners } = require('node:events')\n\nconst kAbortController = Symbol('abortController')\n\nconst requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {\n signal.removeEventListener('abort', abort)\n})\n\nconst dependentControllerMap = new WeakMap()\n\nlet abortSignalHasEventHandlerLeakWarning\n\ntry {\n abortSignalHasEventHandlerLeakWarning = getMaxListeners(new AbortController().signal) > 0\n} catch {\n abortSignalHasEventHandlerLeakWarning = false\n}\n\nfunction buildAbort (acRef) {\n return abort\n\n function abort () {\n const ac = acRef.deref()\n if (ac !== undefined) {\n // Currently, there is a problem with FinalizationRegistry.\n // https://github.com/nodejs/node/issues/49344\n // https://github.com/nodejs/node/issues/47748\n // In the case of abort, the first step is to unregister from it.\n // If the controller can refer to it, it is still registered.\n // It will be removed in the future.\n requestFinalizer.unregister(abort)\n\n // Unsubscribe a listener.\n // FinalizationRegistry will no longer be called, so this must be done.\n this.removeEventListener('abort', abort)\n\n ac.abort(this.reason)\n\n const controllerList = dependentControllerMap.get(ac.signal)\n\n if (controllerList !== undefined) {\n if (controllerList.size !== 0) {\n for (const ref of controllerList) {\n const ctrl = ref.deref()\n if (ctrl !== undefined) {\n ctrl.abort(this.reason)\n }\n }\n controllerList.clear()\n }\n dependentControllerMap.delete(ac.signal)\n }\n }\n }\n}\n\nlet patchMethodWarning = false\n\n// https://fetch.spec.whatwg.org/#request-class\nclass Request {\n /** @type {AbortSignal} */\n #signal\n\n /** @type {import('../../dispatcher/dispatcher')} */\n #dispatcher\n\n /** @type {Headers} */\n #headers\n\n #state\n\n // https://fetch.spec.whatwg.org/#dom-request\n constructor (input, init = undefined) {\n webidl.util.markAsUncloneable(this)\n\n if (input === kConstruct) {\n return\n }\n\n const prefix = 'Request constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n input = webidl.converters.RequestInfo(input)\n init = webidl.converters.RequestInit(init)\n\n // 1. Let request be null.\n let request = null\n\n // 2. Let fallbackMode be null.\n let fallbackMode = null\n\n // 3. Let baseURL be this’s relevant settings object’s API base URL.\n const baseUrl = environmentSettingsObject.settingsObject.baseUrl\n\n // 4. Let signal be null.\n let signal = null\n\n // 5. If input is a string, then:\n if (typeof input === 'string') {\n this.#dispatcher = init.dispatcher\n\n // 1. Let parsedURL be the result of parsing input with baseURL.\n // 2. If parsedURL is failure, then throw a TypeError.\n let parsedURL\n try {\n parsedURL = new URL(input, baseUrl)\n } catch (err) {\n throw new TypeError('Failed to parse URL from ' + input, { cause: err })\n }\n\n // 3. If parsedURL includes credentials, then throw a TypeError.\n if (parsedURL.username || parsedURL.password) {\n throw new TypeError(\n 'Request cannot be constructed from a URL that includes credentials: ' +\n input\n )\n }\n\n // 4. Set request to a new request whose URL is parsedURL.\n request = makeRequest({ urlList: [parsedURL] })\n\n // 5. Set fallbackMode to \"cors\".\n fallbackMode = 'cors'\n } else {\n // 6. Otherwise:\n\n // 7. Assert: input is a Request object.\n assert(webidl.is.Request(input))\n\n // 8. Set request to input’s request.\n request = input.#state\n\n // 9. Set signal to input’s signal.\n signal = input.#signal\n\n this.#dispatcher = init.dispatcher || input.#dispatcher\n }\n\n // 7. Let origin be this’s relevant settings object’s origin.\n const origin = environmentSettingsObject.settingsObject.origin\n\n // 8. Let window be \"client\".\n let window = 'client'\n\n // 9. If request’s window is an environment settings object and its origin\n // is same origin with origin, then set window to request’s window.\n if (\n request.window?.constructor?.name === 'EnvironmentSettingsObject' &&\n sameOrigin(request.window, origin)\n ) {\n window = request.window\n }\n\n // 10. If init[\"window\"] exists and is non-null, then throw a TypeError.\n if (init.window != null) {\n throw new TypeError(`'window' option '${window}' must be null`)\n }\n\n // 11. If init[\"window\"] exists, then set window to \"no-window\".\n if ('window' in init) {\n window = 'no-window'\n }\n\n // 12. Set request to a new request with the following properties:\n request = makeRequest({\n // URL request’s URL.\n // undici implementation note: this is set as the first item in request's urlList in makeRequest\n // method request’s method.\n method: request.method,\n // header list A copy of request’s header list.\n // undici implementation note: headersList is cloned in makeRequest\n headersList: request.headersList,\n // unsafe-request flag Set.\n unsafeRequest: request.unsafeRequest,\n // client This’s relevant settings object.\n client: environmentSettingsObject.settingsObject,\n // window window.\n window,\n // priority request’s priority.\n priority: request.priority,\n // origin request’s origin. The propagation of the origin is only significant for navigation requests\n // being handled by a service worker. In this scenario a request can have an origin that is different\n // from the current client.\n origin: request.origin,\n // referrer request’s referrer.\n referrer: request.referrer,\n // referrer policy request’s referrer policy.\n referrerPolicy: request.referrerPolicy,\n // mode request’s mode.\n mode: request.mode,\n // credentials mode request’s credentials mode.\n credentials: request.credentials,\n // cache mode request’s cache mode.\n cache: request.cache,\n // redirect mode request’s redirect mode.\n redirect: request.redirect,\n // integrity metadata request’s integrity metadata.\n integrity: request.integrity,\n // keepalive request’s keepalive.\n keepalive: request.keepalive,\n // reload-navigation flag request’s reload-navigation flag.\n reloadNavigation: request.reloadNavigation,\n // history-navigation flag request’s history-navigation flag.\n historyNavigation: request.historyNavigation,\n // URL list A clone of request’s URL list.\n urlList: [...request.urlList]\n })\n\n const initHasKey = Object.keys(init).length !== 0\n\n // 13. If init is not empty, then:\n if (initHasKey) {\n // 1. If request’s mode is \"navigate\", then set it to \"same-origin\".\n if (request.mode === 'navigate') {\n request.mode = 'same-origin'\n }\n\n // 2. Unset request’s reload-navigation flag.\n request.reloadNavigation = false\n\n // 3. Unset request’s history-navigation flag.\n request.historyNavigation = false\n\n // 4. Set request’s origin to \"client\".\n request.origin = 'client'\n\n // 5. Set request’s referrer to \"client\"\n request.referrer = 'client'\n\n // 6. Set request’s referrer policy to the empty string.\n request.referrerPolicy = ''\n\n // 7. Set request’s URL to request’s current URL.\n request.url = request.urlList[request.urlList.length - 1]\n\n // 8. Set request’s URL list to « request’s URL ».\n request.urlList = [request.url]\n }\n\n // 14. If init[\"referrer\"] exists, then:\n if (init.referrer !== undefined) {\n // 1. Let referrer be init[\"referrer\"].\n const referrer = init.referrer\n\n // 2. If referrer is the empty string, then set request’s referrer to \"no-referrer\".\n if (referrer === '') {\n request.referrer = 'no-referrer'\n } else {\n // 1. Let parsedReferrer be the result of parsing referrer with\n // baseURL.\n // 2. If parsedReferrer is failure, then throw a TypeError.\n let parsedReferrer\n try {\n parsedReferrer = new URL(referrer, baseUrl)\n } catch (err) {\n throw new TypeError(`Referrer \"${referrer}\" is not a valid URL.`, { cause: err })\n }\n\n // 3. If one of the following is true\n // - parsedReferrer’s scheme is \"about\" and path is the string \"client\"\n // - parsedReferrer’s origin is not same origin with origin\n // then set request’s referrer to \"client\".\n if (\n (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') ||\n (origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl))\n ) {\n request.referrer = 'client'\n } else {\n // 4. Otherwise, set request’s referrer to parsedReferrer.\n request.referrer = parsedReferrer\n }\n }\n }\n\n // 15. If init[\"referrerPolicy\"] exists, then set request’s referrer policy\n // to it.\n if (init.referrerPolicy !== undefined) {\n request.referrerPolicy = init.referrerPolicy\n }\n\n // 16. Let mode be init[\"mode\"] if it exists, and fallbackMode otherwise.\n let mode\n if (init.mode !== undefined) {\n mode = init.mode\n } else {\n mode = fallbackMode\n }\n\n // 17. If mode is \"navigate\", then throw a TypeError.\n if (mode === 'navigate') {\n throw webidl.errors.exception({\n header: 'Request constructor',\n message: 'invalid request mode navigate.'\n })\n }\n\n // 18. If mode is non-null, set request’s mode to mode.\n if (mode != null) {\n request.mode = mode\n }\n\n // 19. If init[\"credentials\"] exists, then set request’s credentials mode\n // to it.\n if (init.credentials !== undefined) {\n request.credentials = init.credentials\n }\n\n // 18. If init[\"cache\"] exists, then set request’s cache mode to it.\n if (init.cache !== undefined) {\n request.cache = init.cache\n }\n\n // 21. If request’s cache mode is \"only-if-cached\" and request’s mode is\n // not \"same-origin\", then throw a TypeError.\n if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {\n throw new TypeError(\n \"'only-if-cached' can be set only with 'same-origin' mode\"\n )\n }\n\n // 22. If init[\"redirect\"] exists, then set request’s redirect mode to it.\n if (init.redirect !== undefined) {\n request.redirect = init.redirect\n }\n\n // 23. If init[\"integrity\"] exists, then set request’s integrity metadata to it.\n if (init.integrity != null) {\n request.integrity = String(init.integrity)\n }\n\n // 24. If init[\"keepalive\"] exists, then set request’s keepalive to it.\n if (init.keepalive !== undefined) {\n request.keepalive = Boolean(init.keepalive)\n }\n\n // 25. If init[\"method\"] exists, then:\n if (init.method !== undefined) {\n // 1. Let method be init[\"method\"].\n let method = init.method\n\n const mayBeNormalized = normalizedMethodRecords[method]\n\n if (mayBeNormalized !== undefined) {\n // Note: Bypass validation DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH and these lowercase ones\n request.method = mayBeNormalized\n } else {\n // 2. If method is not a method or method is a forbidden method, then\n // throw a TypeError.\n if (!isValidHTTPToken(method)) {\n throw new TypeError(`'${method}' is not a valid HTTP method.`)\n }\n\n const upperCase = method.toUpperCase()\n\n if (forbiddenMethodsSet.has(upperCase)) {\n throw new TypeError(`'${method}' HTTP method is unsupported.`)\n }\n\n // 3. Normalize method.\n // https://fetch.spec.whatwg.org/#concept-method-normalize\n // Note: must be in uppercase\n method = normalizedMethodRecordsBase[upperCase] ?? method\n\n // 4. Set request’s method to method.\n request.method = method\n }\n\n if (!patchMethodWarning && request.method === 'patch') {\n process.emitWarning('Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.', {\n code: 'UNDICI-FETCH-patch'\n })\n\n patchMethodWarning = true\n }\n }\n\n // 26. If init[\"signal\"] exists, then set signal to it.\n if (init.signal !== undefined) {\n signal = init.signal\n }\n\n // 27. Set this’s request to request.\n this.#state = request\n\n // 28. Set this’s signal to a new AbortSignal object with this’s relevant\n // Realm.\n // TODO: could this be simplified with AbortSignal.any\n // (https://dom.spec.whatwg.org/#dom-abortsignal-any)\n const ac = new AbortController()\n this.#signal = ac.signal\n\n // 29. If signal is not null, then make this’s signal follow signal.\n if (signal != null) {\n if (signal.aborted) {\n ac.abort(signal.reason)\n } else {\n // Keep a strong ref to ac while request object\n // is alive. This is needed to prevent AbortController\n // from being prematurely garbage collected.\n // See, https://github.com/nodejs/undici/issues/1926.\n this[kAbortController] = ac\n\n const acRef = new WeakRef(ac)\n const abort = buildAbort(acRef)\n\n // If the max amount of listeners is equal to the default, increase it\n if (abortSignalHasEventHandlerLeakWarning && getMaxListeners(signal) === defaultMaxListeners) {\n setMaxListeners(1500, signal)\n }\n\n util.addAbortListener(signal, abort)\n // The third argument must be a registry key to be unregistered.\n // Without it, you cannot unregister.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n // abort is used as the unregister key. (because it is unique)\n requestFinalizer.register(ac, { signal, abort }, abort)\n }\n }\n\n // 30. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is request’s header list and guard is\n // \"request\".\n this.#headers = new Headers(kConstruct)\n setHeadersList(this.#headers, request.headersList)\n setHeadersGuard(this.#headers, 'request')\n\n // 31. If this’s request’s mode is \"no-cors\", then:\n if (mode === 'no-cors') {\n // 1. If this’s request’s method is not a CORS-safelisted method,\n // then throw a TypeError.\n if (!corsSafeListedMethodsSet.has(request.method)) {\n throw new TypeError(\n `'${request.method} is unsupported in no-cors mode.`\n )\n }\n\n // 2. Set this’s headers’s guard to \"request-no-cors\".\n setHeadersGuard(this.#headers, 'request-no-cors')\n }\n\n // 32. If init is not empty, then:\n if (initHasKey) {\n /** @type {HeadersList} */\n const headersList = getHeadersList(this.#headers)\n // 1. Let headers be a copy of this’s headers and its associated header\n // list.\n // 2. If init[\"headers\"] exists, then set headers to init[\"headers\"].\n const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList)\n\n // 3. Empty this’s headers’s header list.\n headersList.clear()\n\n // 4. If headers is a Headers object, then for each header in its header\n // list, append header’s name/header’s value to this’s headers.\n if (headers instanceof HeadersList) {\n for (const { name, value } of headers.rawValues()) {\n headersList.append(name, value, false)\n }\n // Note: Copy the `set-cookie` meta-data.\n headersList.cookies = headers.cookies\n } else {\n // 5. Otherwise, fill this’s headers with headers.\n fillHeaders(this.#headers, headers)\n }\n }\n\n // 33. Let inputBody be input’s request’s body if input is a Request\n // object; otherwise null.\n const inputBody = webidl.is.Request(input) ? input.#state.body : null\n\n // 34. If either init[\"body\"] exists and is non-null or inputBody is\n // non-null, and request’s method is `GET` or `HEAD`, then throw a\n // TypeError.\n if (\n (init.body != null || inputBody != null) &&\n (request.method === 'GET' || request.method === 'HEAD')\n ) {\n throw new TypeError('Request with GET/HEAD method cannot have body.')\n }\n\n // 35. Let initBody be null.\n let initBody = null\n\n // 36. If init[\"body\"] exists and is non-null, then:\n if (init.body != null) {\n // 1. Let Content-Type be null.\n // 2. Set initBody and Content-Type to the result of extracting\n // init[\"body\"], with keepalive set to request’s keepalive.\n const [extractedBody, contentType] = extractBody(\n init.body,\n request.keepalive\n )\n initBody = extractedBody\n\n // 3, If Content-Type is non-null and this’s headers’s header list does\n // not contain `Content-Type`, then append `Content-Type`/Content-Type to\n // this’s headers.\n if (contentType && !getHeadersList(this.#headers).contains('content-type', true)) {\n this.#headers.append('content-type', contentType, true)\n }\n }\n\n // 37. Let inputOrInitBody be initBody if it is non-null; otherwise\n // inputBody.\n const inputOrInitBody = initBody ?? inputBody\n\n // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is\n // null, then:\n if (inputOrInitBody != null && inputOrInitBody.source == null) {\n // 1. If initBody is non-null and init[\"duplex\"] does not exist,\n // then throw a TypeError.\n if (initBody != null && init.duplex == null) {\n throw new TypeError('RequestInit: duplex option is required when sending a body.')\n }\n\n // 2. If this’s request’s mode is neither \"same-origin\" nor \"cors\",\n // then throw a TypeError.\n if (request.mode !== 'same-origin' && request.mode !== 'cors') {\n throw new TypeError(\n 'If request is made from ReadableStream, mode should be \"same-origin\" or \"cors\"'\n )\n }\n\n // 3. Set this’s request’s use-CORS-preflight flag.\n request.useCORSPreflightFlag = true\n }\n\n // 39. Let finalBody be inputOrInitBody.\n let finalBody = inputOrInitBody\n\n // 40. If initBody is null and inputBody is non-null, then:\n if (initBody == null && inputBody != null) {\n // 1. If input is unusable, then throw a TypeError.\n if (bodyUnusable(input.#state)) {\n throw new TypeError(\n 'Cannot construct a Request with a Request object that has already been used.'\n )\n }\n\n // 2. Set finalBody to the result of creating a proxy for inputBody.\n // https://streams.spec.whatwg.org/#readablestream-create-a-proxy\n const identityTransform = new TransformStream()\n inputBody.stream.pipeThrough(identityTransform)\n finalBody = {\n source: inputBody.source,\n length: inputBody.length,\n stream: identityTransform.readable\n }\n }\n\n // 41. Set this’s request’s body to finalBody.\n this.#state.body = finalBody\n }\n\n // Returns request’s HTTP method, which is \"GET\" by default.\n get method () {\n webidl.brandCheck(this, Request)\n\n // The method getter steps are to return this’s request’s method.\n return this.#state.method\n }\n\n // Returns the URL of request as a string.\n get url () {\n webidl.brandCheck(this, Request)\n\n // The url getter steps are to return this’s request’s URL, serialized.\n return URLSerializer(this.#state.url)\n }\n\n // Returns a Headers object consisting of the headers associated with request.\n // Note that headers added in the network layer by the user agent will not\n // be accounted for in this object, e.g., the \"Host\" header.\n get headers () {\n webidl.brandCheck(this, Request)\n\n // The headers getter steps are to return this’s headers.\n return this.#headers\n }\n\n // Returns the kind of resource requested by request, e.g., \"document\"\n // or \"script\".\n get destination () {\n webidl.brandCheck(this, Request)\n\n // The destination getter are to return this’s request’s destination.\n return this.#state.destination\n }\n\n // Returns the referrer of request. Its value can be a same-origin URL if\n // explicitly set in init, the empty string to indicate no referrer, and\n // \"about:client\" when defaulting to the global’s default. This is used\n // during fetching to determine the value of the `Referer` header of the\n // request being made.\n get referrer () {\n webidl.brandCheck(this, Request)\n\n // 1. If this’s request’s referrer is \"no-referrer\", then return the\n // empty string.\n if (this.#state.referrer === 'no-referrer') {\n return ''\n }\n\n // 2. If this’s request’s referrer is \"client\", then return\n // \"about:client\".\n if (this.#state.referrer === 'client') {\n return 'about:client'\n }\n\n // Return this’s request’s referrer, serialized.\n return this.#state.referrer.toString()\n }\n\n // Returns the referrer policy associated with request.\n // This is used during fetching to compute the value of the request’s\n // referrer.\n get referrerPolicy () {\n webidl.brandCheck(this, Request)\n\n // The referrerPolicy getter steps are to return this’s request’s referrer policy.\n return this.#state.referrerPolicy\n }\n\n // Returns the mode associated with request, which is a string indicating\n // whether the request will use CORS, or will be restricted to same-origin\n // URLs.\n get mode () {\n webidl.brandCheck(this, Request)\n\n // The mode getter steps are to return this’s request’s mode.\n return this.#state.mode\n }\n\n // Returns the credentials mode associated with request,\n // which is a string indicating whether credentials will be sent with the\n // request always, never, or only when sent to a same-origin URL.\n get credentials () {\n webidl.brandCheck(this, Request)\n\n // The credentials getter steps are to return this’s request’s credentials mode.\n return this.#state.credentials\n }\n\n // Returns the cache mode associated with request,\n // which is a string indicating how the request will\n // interact with the browser’s cache when fetching.\n get cache () {\n webidl.brandCheck(this, Request)\n\n // The cache getter steps are to return this’s request’s cache mode.\n return this.#state.cache\n }\n\n // Returns the redirect mode associated with request,\n // which is a string indicating how redirects for the\n // request will be handled during fetching. A request\n // will follow redirects by default.\n get redirect () {\n webidl.brandCheck(this, Request)\n\n // The redirect getter steps are to return this’s request’s redirect mode.\n return this.#state.redirect\n }\n\n // Returns request’s subresource integrity metadata, which is a\n // cryptographic hash of the resource being fetched. Its value\n // consists of multiple hashes separated by whitespace. [SRI]\n get integrity () {\n webidl.brandCheck(this, Request)\n\n // The integrity getter steps are to return this’s request’s integrity\n // metadata.\n return this.#state.integrity\n }\n\n // Returns a boolean indicating whether or not request can outlive the\n // global in which it was created.\n get keepalive () {\n webidl.brandCheck(this, Request)\n\n // The keepalive getter steps are to return this’s request’s keepalive.\n return this.#state.keepalive\n }\n\n // Returns a boolean indicating whether or not request is for a reload\n // navigation.\n get isReloadNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isReloadNavigation getter steps are to return true if this’s\n // request’s reload-navigation flag is set; otherwise false.\n return this.#state.reloadNavigation\n }\n\n // Returns a boolean indicating whether or not request is for a history\n // navigation (a.k.a. back-forward navigation).\n get isHistoryNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isHistoryNavigation getter steps are to return true if this’s request’s\n // history-navigation flag is set; otherwise false.\n return this.#state.historyNavigation\n }\n\n // Returns the signal associated with request, which is an AbortSignal\n // object indicating whether or not request has been aborted, and its\n // abort event handler.\n get signal () {\n webidl.brandCheck(this, Request)\n\n // The signal getter steps are to return this’s signal.\n return this.#signal\n }\n\n get body () {\n webidl.brandCheck(this, Request)\n\n return this.#state.body ? this.#state.body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Request)\n\n return !!this.#state.body && util.isDisturbed(this.#state.body.stream)\n }\n\n get duplex () {\n webidl.brandCheck(this, Request)\n\n return 'half'\n }\n\n // Returns a clone of request.\n clone () {\n webidl.brandCheck(this, Request)\n\n // 1. If this is unusable, then throw a TypeError.\n if (bodyUnusable(this.#state)) {\n throw new TypeError('unusable')\n }\n\n // 2. Let clonedRequest be the result of cloning this’s request.\n const clonedRequest = cloneRequest(this.#state)\n\n // 3. Let clonedRequestObject be the result of creating a Request object,\n // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.\n // 4. Make clonedRequestObject’s signal follow this’s signal.\n const ac = new AbortController()\n if (this.signal.aborted) {\n ac.abort(this.signal.reason)\n } else {\n let list = dependentControllerMap.get(this.signal)\n if (list === undefined) {\n list = new Set()\n dependentControllerMap.set(this.signal, list)\n }\n const acRef = new WeakRef(ac)\n list.add(acRef)\n util.addAbortListener(\n ac.signal,\n buildAbort(acRef)\n )\n }\n\n // 4. Return clonedRequestObject.\n return fromInnerRequest(clonedRequest, this.#dispatcher, ac.signal, getHeadersGuard(this.#headers))\n }\n\n [nodeUtil.inspect.custom] (depth, options) {\n if (options.depth === null) {\n options.depth = 2\n }\n\n options.colors ??= true\n\n const properties = {\n method: this.method,\n url: this.url,\n headers: this.headers,\n destination: this.destination,\n referrer: this.referrer,\n referrerPolicy: this.referrerPolicy,\n mode: this.mode,\n credentials: this.credentials,\n cache: this.cache,\n redirect: this.redirect,\n integrity: this.integrity,\n keepalive: this.keepalive,\n isReloadNavigation: this.isReloadNavigation,\n isHistoryNavigation: this.isHistoryNavigation,\n signal: this.signal\n }\n\n return `Request ${nodeUtil.formatWithOptions(options, properties)}`\n }\n\n /**\n * @param {Request} request\n * @param {AbortSignal} newSignal\n */\n static setRequestSignal (request, newSignal) {\n request.#signal = newSignal\n return request\n }\n\n /**\n * @param {Request} request\n */\n static getRequestDispatcher (request) {\n return request.#dispatcher\n }\n\n /**\n * @param {Request} request\n * @param {import('../../dispatcher/dispatcher')} newDispatcher\n */\n static setRequestDispatcher (request, newDispatcher) {\n request.#dispatcher = newDispatcher\n }\n\n /**\n * @param {Request} request\n * @param {Headers} newHeaders\n */\n static setRequestHeaders (request, newHeaders) {\n request.#headers = newHeaders\n }\n\n /**\n * @param {Request} request\n */\n static getRequestState (request) {\n return request.#state\n }\n\n /**\n * @param {Request} request\n * @param {any} newState\n */\n static setRequestState (request, newState) {\n request.#state = newState\n }\n}\n\nconst { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request\nReflect.deleteProperty(Request, 'setRequestSignal')\nReflect.deleteProperty(Request, 'getRequestDispatcher')\nReflect.deleteProperty(Request, 'setRequestDispatcher')\nReflect.deleteProperty(Request, 'setRequestHeaders')\nReflect.deleteProperty(Request, 'getRequestState')\nReflect.deleteProperty(Request, 'setRequestState')\n\nmixinBody(Request, getRequestState)\n\n// https://fetch.spec.whatwg.org/#requests\nfunction makeRequest (init) {\n return {\n method: init.method ?? 'GET',\n localURLsOnly: init.localURLsOnly ?? false,\n unsafeRequest: init.unsafeRequest ?? false,\n body: init.body ?? null,\n client: init.client ?? null,\n reservedClient: init.reservedClient ?? null,\n replacesClientId: init.replacesClientId ?? '',\n window: init.window ?? 'client',\n keepalive: init.keepalive ?? false,\n serviceWorkers: init.serviceWorkers ?? 'all',\n initiator: init.initiator ?? '',\n destination: init.destination ?? '',\n priority: init.priority ?? null,\n origin: init.origin ?? 'client',\n policyContainer: init.policyContainer ?? 'client',\n referrer: init.referrer ?? 'client',\n referrerPolicy: init.referrerPolicy ?? '',\n mode: init.mode ?? 'no-cors',\n useCORSPreflightFlag: init.useCORSPreflightFlag ?? false,\n credentials: init.credentials ?? 'same-origin',\n useCredentials: init.useCredentials ?? false,\n cache: init.cache ?? 'default',\n redirect: init.redirect ?? 'follow',\n integrity: init.integrity ?? '',\n cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? '',\n parserMetadata: init.parserMetadata ?? '',\n reloadNavigation: init.reloadNavigation ?? false,\n historyNavigation: init.historyNavigation ?? false,\n userActivation: init.userActivation ?? false,\n taintedOrigin: init.taintedOrigin ?? false,\n redirectCount: init.redirectCount ?? 0,\n responseTainting: init.responseTainting ?? 'basic',\n preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false,\n done: init.done ?? false,\n timingAllowFailed: init.timingAllowFailed ?? false,\n useURLCredentials: init.useURLCredentials ?? undefined,\n traversableForUserPrompts: init.traversableForUserPrompts ?? 'client',\n urlList: init.urlList,\n url: init.urlList[0],\n headersList: init.headersList\n ? new HeadersList(init.headersList)\n : new HeadersList()\n }\n}\n\n// https://fetch.spec.whatwg.org/#concept-request-clone\nfunction cloneRequest (request) {\n // To clone a request request, run these steps:\n\n // 1. Let newRequest be a copy of request, except for its body.\n const newRequest = makeRequest({ ...request, body: null })\n\n // 2. If request’s body is non-null, set newRequest’s body to the\n // result of cloning request’s body.\n if (request.body != null) {\n newRequest.body = cloneBody(request.body)\n }\n\n // 3. Return newRequest.\n return newRequest\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#request-create\n * @param {any} innerRequest\n * @param {import('../../dispatcher/agent')} dispatcher\n * @param {AbortSignal} signal\n * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard\n * @returns {Request}\n */\nfunction fromInnerRequest (innerRequest, dispatcher, signal, guard) {\n const request = new Request(kConstruct)\n setRequestState(request, innerRequest)\n setRequestDispatcher(request, dispatcher)\n setRequestSignal(request, signal)\n const headers = new Headers(kConstruct)\n setRequestHeaders(request, headers)\n setHeadersList(headers, innerRequest.headersList)\n setHeadersGuard(headers, guard)\n return request\n}\n\nObject.defineProperties(Request.prototype, {\n method: kEnumerableProperty,\n url: kEnumerableProperty,\n headers: kEnumerableProperty,\n redirect: kEnumerableProperty,\n clone: kEnumerableProperty,\n signal: kEnumerableProperty,\n duplex: kEnumerableProperty,\n destination: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n isHistoryNavigation: kEnumerableProperty,\n isReloadNavigation: kEnumerableProperty,\n keepalive: kEnumerableProperty,\n integrity: kEnumerableProperty,\n cache: kEnumerableProperty,\n credentials: kEnumerableProperty,\n attribute: kEnumerableProperty,\n referrerPolicy: kEnumerableProperty,\n referrer: kEnumerableProperty,\n mode: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Request',\n configurable: true\n }\n})\n\nwebidl.is.Request = webidl.util.MakeTypeAssertion(Request)\n\n/**\n * @param {*} V\n * @returns {import('../../../types/fetch').Request|string}\n *\n * @see https://fetch.spec.whatwg.org/#requestinfo\n */\nwebidl.converters.RequestInfo = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n if (webidl.is.Request(V)) {\n return V\n }\n\n return webidl.converters.USVString(V)\n}\n\n/**\n * @param {*} V\n * @returns {import('../../../types/fetch').RequestInit}\n * @see https://fetch.spec.whatwg.org/#requestinit\n */\nwebidl.converters.RequestInit = webidl.dictionaryConverter([\n {\n key: 'method',\n converter: webidl.converters.ByteString\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n },\n {\n key: 'body',\n converter: webidl.nullableConverter(\n webidl.converters.BodyInit\n )\n },\n {\n key: 'referrer',\n converter: webidl.converters.USVString\n },\n {\n key: 'referrerPolicy',\n converter: webidl.converters.DOMString,\n // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy\n allowedValues: referrerPolicy\n },\n {\n key: 'mode',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#concept-request-mode\n allowedValues: requestMode\n },\n {\n key: 'credentials',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcredentials\n allowedValues: requestCredentials\n },\n {\n key: 'cache',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcache\n allowedValues: requestCache\n },\n {\n key: 'redirect',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestredirect\n allowedValues: requestRedirect\n },\n {\n key: 'integrity',\n converter: webidl.converters.DOMString\n },\n {\n key: 'keepalive',\n converter: webidl.converters.boolean\n },\n {\n key: 'signal',\n converter: webidl.nullableConverter(\n (signal) => webidl.converters.AbortSignal(\n signal,\n 'RequestInit',\n 'signal'\n )\n )\n },\n {\n key: 'window',\n converter: webidl.converters.any\n },\n {\n key: 'duplex',\n converter: webidl.converters.DOMString,\n allowedValues: requestDuplex\n },\n {\n key: 'dispatcher', // undici specific option\n converter: webidl.converters.any\n },\n {\n key: 'priority',\n converter: webidl.converters.DOMString,\n allowedValues: ['high', 'low', 'auto'],\n defaultValue: () => 'auto'\n }\n])\n\nmodule.exports = {\n Request,\n makeRequest,\n fromInnerRequest,\n cloneRequest,\n getRequestDispatcher,\n getRequestState\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { runtimeFeatures } = require('../../util/runtime-features.js')\n\n/**\n * @typedef {object} Metadata\n * @property {SRIHashAlgorithm} alg - The algorithm used for the hash.\n * @property {string} val - The base64-encoded hash value.\n */\n\n/**\n * @typedef {Metadata[]} MetadataList\n */\n\n/**\n * @typedef {('sha256' | 'sha384' | 'sha512')} SRIHashAlgorithm\n */\n\n/**\n * @type {Map}\n *\n * The valid SRI hash algorithm token set is the ordered set « \"sha256\",\n * \"sha384\", \"sha512\" » (corresponding to SHA-256, SHA-384, and SHA-512\n * respectively). The ordering of this set is meaningful, with stronger\n * algorithms appearing later in the set.\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#valid-sri-hash-algorithm-token-set\n */\nconst validSRIHashAlgorithmTokenSet = new Map([['sha256', 0], ['sha384', 1], ['sha512', 2]])\n\n// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable\n/** @type {import('node:crypto')} */\nlet crypto\n\nif (runtimeFeatures.has('crypto')) {\n crypto = require('node:crypto')\n const cryptoHashes = crypto.getHashes()\n\n // If no hashes are available, we cannot support SRI.\n if (cryptoHashes.length === 0) {\n validSRIHashAlgorithmTokenSet.clear()\n }\n\n for (const algorithm of validSRIHashAlgorithmTokenSet.keys()) {\n // If the algorithm is not supported, remove it from the list.\n if (cryptoHashes.includes(algorithm) === false) {\n validSRIHashAlgorithmTokenSet.delete(algorithm)\n }\n }\n} else {\n // If crypto is not available, we cannot support SRI.\n validSRIHashAlgorithmTokenSet.clear()\n}\n\n/**\n * @typedef GetSRIHashAlgorithmIndex\n * @type {(algorithm: SRIHashAlgorithm) => number}\n * @param {SRIHashAlgorithm} algorithm\n * @returns {number} The index of the algorithm in the valid SRI hash algorithm\n * token set.\n */\n\nconst getSRIHashAlgorithmIndex = /** @type {GetSRIHashAlgorithmIndex} */ (Map.prototype.get.bind(\n validSRIHashAlgorithmTokenSet))\n\n/**\n * @typedef IsValidSRIHashAlgorithm\n * @type {(algorithm: string) => algorithm is SRIHashAlgorithm}\n * @param {*} algorithm\n * @returns {algorithm is SRIHashAlgorithm}\n */\n\nconst isValidSRIHashAlgorithm = /** @type {IsValidSRIHashAlgorithm} */ (\n Map.prototype.has.bind(validSRIHashAlgorithmTokenSet)\n)\n\n/**\n * @param {Uint8Array} bytes\n * @param {string} metadataList\n * @returns {boolean}\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist\n */\nconst bytesMatch = runtimeFeatures.has('crypto') === false || validSRIHashAlgorithmTokenSet.size === 0\n // If node is not built with OpenSSL support, we cannot check\n // a request's integrity, so allow it by default (the spec will\n // allow requests if an invalid hash is given, as precedence).\n ? () => true\n : (bytes, metadataList) => {\n // 1. Let parsedMetadata be the result of parsing metadataList.\n const parsedMetadata = parseMetadata(metadataList)\n\n // 2. If parsedMetadata is empty set, return true.\n if (parsedMetadata.length === 0) {\n return true\n }\n\n // 3. Let metadata be the result of getting the strongest\n // metadata from parsedMetadata.\n const metadata = getStrongestMetadata(parsedMetadata)\n\n // 4. For each item in metadata:\n for (const item of metadata) {\n // 1. Let algorithm be the item[\"alg\"].\n const algorithm = item.alg\n\n // 2. Let expectedValue be the item[\"val\"].\n const expectedValue = item.val\n\n // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e\n // \"be liberal with padding\". This is annoying, and it's not even in the spec.\n\n // 3. Let actualValue be the result of applying algorithm to bytes .\n const actualValue = applyAlgorithmToBytes(algorithm, bytes)\n\n // 4. If actualValue is a case-sensitive match for expectedValue,\n // return true.\n if (caseSensitiveMatch(actualValue, expectedValue)) {\n return true\n }\n }\n\n // 5. Return false.\n return false\n }\n\n/**\n * @param {MetadataList} metadataList\n * @returns {MetadataList} The strongest hash algorithm from the metadata list.\n */\nfunction getStrongestMetadata (metadataList) {\n // 1. Let result be the empty set and strongest be the empty string.\n const result = []\n /** @type {Metadata|null} */\n let strongest = null\n\n // 2. For each item in set:\n for (const item of metadataList) {\n // 1. Assert: item[\"alg\"] is a valid SRI hash algorithm token.\n assert(isValidSRIHashAlgorithm(item.alg), 'Invalid SRI hash algorithm token')\n\n // 2. If result is the empty set, then:\n if (result.length === 0) {\n // 1. Append item to result.\n result.push(item)\n\n // 2. Set strongest to item.\n strongest = item\n\n // 3. Continue.\n continue\n }\n\n // 3. Let currentAlgorithm be strongest[\"alg\"], and currentAlgorithmIndex be\n // the index of currentAlgorithm in the valid SRI hash algorithm token set.\n const currentAlgorithm = /** @type {Metadata} */ (strongest).alg\n const currentAlgorithmIndex = getSRIHashAlgorithmIndex(currentAlgorithm)\n\n // 4. Let newAlgorithm be the item[\"alg\"], and newAlgorithmIndex be the\n // index of newAlgorithm in the valid SRI hash algorithm token set.\n const newAlgorithm = item.alg\n const newAlgorithmIndex = getSRIHashAlgorithmIndex(newAlgorithm)\n\n // 5. If newAlgorithmIndex is less than currentAlgorithmIndex, then continue.\n if (newAlgorithmIndex < currentAlgorithmIndex) {\n continue\n\n // 6. Otherwise, if newAlgorithmIndex is greater than\n // currentAlgorithmIndex:\n } else if (newAlgorithmIndex > currentAlgorithmIndex) {\n // 1. Set strongest to item.\n strongest = item\n\n // 2. Set result to « item ».\n result[0] = item\n result.length = 1\n\n // 7. Otherwise, newAlgorithmIndex and currentAlgorithmIndex are the same\n // value. Append item to result.\n } else {\n result.push(item)\n }\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * @param {string} metadata\n * @returns {MetadataList}\n *\n * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata\n */\nfunction parseMetadata (metadata) {\n // 1. Let result be the empty set.\n /** @type {MetadataList} */\n const result = []\n\n // 2. For each item returned by splitting metadata on spaces:\n for (const item of metadata.split(' ')) {\n // 1. Let expression-and-options be the result of splitting item on U+003F (?).\n const expressionAndOptions = item.split('?', 1)\n\n // 2. Let algorithm-expression be expression-and-options[0].\n const algorithmExpression = expressionAndOptions[0]\n\n // 3. Let base64-value be the empty string.\n let base64Value = ''\n\n // 4. Let algorithm-and-value be the result of splitting algorithm-expression on U+002D (-).\n const algorithmAndValue = [algorithmExpression.slice(0, 6), algorithmExpression.slice(7)]\n\n // 5. Let algorithm be algorithm-and-value[0].\n const algorithm = algorithmAndValue[0]\n\n // 6. If algorithm is not a valid SRI hash algorithm token, then continue.\n if (!isValidSRIHashAlgorithm(algorithm)) {\n continue\n }\n\n // 7. If algorithm-and-value[1] exists, set base64-value to\n // algorithm-and-value[1].\n if (algorithmAndValue[1]) {\n base64Value = algorithmAndValue[1]\n }\n\n // 8. Let metadata be the ordered map\n // «[\"alg\" → algorithm, \"val\" → base64-value]».\n const metadata = {\n alg: algorithm,\n val: base64Value\n }\n\n // 9. Append metadata to result.\n result.push(metadata)\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * Applies the specified hash algorithm to the given bytes\n *\n * @typedef {(algorithm: SRIHashAlgorithm, bytes: Uint8Array) => string} ApplyAlgorithmToBytes\n * @param {SRIHashAlgorithm} algorithm\n * @param {Uint8Array} bytes\n * @returns {string}\n */\nconst applyAlgorithmToBytes = (algorithm, bytes) => {\n return crypto.hash(algorithm, bytes, 'base64')\n}\n\n/**\n * Compares two base64 strings, allowing for base64url\n * in the second string.\n *\n * @param {string} actualValue base64 encoded string\n * @param {string} expectedValue base64 or base64url encoded string\n * @returns {boolean}\n */\nfunction caseSensitiveMatch (actualValue, expectedValue) {\n // Ignore padding characters from the end of the strings by\n // decreasing the length by 1 or 2 if the last characters are `=`.\n let actualValueLength = actualValue.length\n if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === '=') {\n actualValueLength -= 1\n }\n if (actualValueLength !== 0 && actualValue[actualValueLength - 1] === '=') {\n actualValueLength -= 1\n }\n let expectedValueLength = expectedValue.length\n if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === '=') {\n expectedValueLength -= 1\n }\n if (expectedValueLength !== 0 && expectedValue[expectedValueLength - 1] === '=') {\n expectedValueLength -= 1\n }\n\n if (actualValueLength !== expectedValueLength) {\n return false\n }\n\n for (let i = 0; i < actualValueLength; ++i) {\n if (\n actualValue[i] === expectedValue[i] ||\n (actualValue[i] === '+' && expectedValue[i] === '-') ||\n (actualValue[i] === '/' && expectedValue[i] === '_')\n ) {\n continue\n }\n return false\n }\n\n return true\n}\n\nmodule.exports = {\n applyAlgorithmToBytes,\n bytesMatch,\n caseSensitiveMatch,\n isValidSRIHashAlgorithm,\n getStrongestMetadata,\n parseMetadata\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst {\n makeNetworkError,\n makeAppropriateNetworkError,\n filterResponse,\n makeResponse,\n fromInnerResponse,\n getResponseState\n} = require('./response')\nconst { HeadersList } = require('./headers')\nconst { Request, cloneRequest, getRequestDispatcher, getRequestState } = require('./request')\nconst zlib = require('node:zlib')\nconst {\n makePolicyContainer,\n clonePolicyContainer,\n requestBadPort,\n TAOCheck,\n appendRequestOriginHeader,\n responseLocationURL,\n requestCurrentURL,\n setRequestReferrerPolicyOnRedirect,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n createOpaqueTimingInfo,\n appendFetchMetadata,\n corsCheck,\n crossOriginResourcePolicyCheck,\n determineRequestsReferrer,\n coarsenedSharedCurrentTime,\n sameOrigin,\n isCancelled,\n isAborted,\n isErrorLike,\n fullyReadBody,\n readableStreamClose,\n urlIsLocal,\n urlIsHttpHttpsScheme,\n urlHasHttpsScheme,\n clampAndCoarsenConnectionTimingInfo,\n simpleRangeHeaderValue,\n buildContentRange,\n createInflate,\n extractMimeType,\n hasAuthenticationEntry,\n includesCredentials,\n isTraversableNavigable\n} = require('./util')\nconst assert = require('node:assert')\nconst { safelyExtractBody, extractBody } = require('./body')\nconst {\n redirectStatusSet,\n nullBodyStatus,\n safeMethodsSet,\n requestBodyHeader,\n subresourceSet\n} = require('./constants')\nconst EE = require('node:events')\nconst { Readable, pipeline, finished, isErrored, isReadable } = require('node:stream')\nconst { addAbortListener, bufferToLowerCasedHeaderName } = require('../../core/util')\nconst { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require('./data-url')\nconst { getGlobalDispatcher } = require('../../global')\nconst { webidl } = require('../webidl')\nconst { STATUS_CODES } = require('node:http')\nconst { bytesMatch } = require('../subresource-integrity/subresource-integrity')\nconst { isomorphicEncode } = require('../infra')\n\nconst GET_OR_HEAD = ['GET', 'HEAD']\n\nconst defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined'\n ? 'node'\n : 'undici'\n\n/** @type {import('buffer').resolveObjectURL} */\nlet resolveObjectURL\n\nclass Fetch extends EE {\n constructor (dispatcher) {\n super()\n\n this.dispatcher = dispatcher\n this.connection = null\n this.dump = false\n this.state = 'ongoing'\n }\n\n terminate (reason) {\n if (this.state !== 'ongoing') {\n return\n }\n\n this.state = 'terminated'\n this.connection?.destroy(reason)\n this.emit('terminated', reason)\n }\n\n // https://fetch.spec.whatwg.org/#fetch-controller-abort\n abort (error) {\n if (this.state !== 'ongoing') {\n return\n }\n\n // 1. Set controller’s state to \"aborted\".\n this.state = 'aborted'\n\n // 2. Let fallbackError be an \"AbortError\" DOMException.\n // 3. Set error to fallbackError if it is not given.\n if (!error) {\n error = new DOMException('The operation was aborted.', 'AbortError')\n }\n\n // 4. Let serializedError be StructuredSerialize(error).\n // If that threw an exception, catch it, and let\n // serializedError be StructuredSerialize(fallbackError).\n\n // 5. Set controller’s serialized abort reason to serializedError.\n this.serializedAbortReason = error\n\n this.connection?.destroy(error)\n this.emit('terminated', error)\n }\n}\n\nfunction handleFetchDone (response) {\n finalizeAndReportTiming(response, 'fetch')\n}\n\n// https://fetch.spec.whatwg.org/#fetch-method\nfunction fetch (input, init = undefined) {\n webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch')\n\n // 1. Let p be a new promise.\n let p = Promise.withResolvers()\n\n // 2. Let requestObject be the result of invoking the initial value of\n // Request as constructor with input and init as arguments. If this throws\n // an exception, reject p with it and return p.\n let requestObject\n\n try {\n requestObject = new Request(input, init)\n } catch (e) {\n p.reject(e)\n return p.promise\n }\n\n // 3. Let request be requestObject’s request.\n const request = getRequestState(requestObject)\n\n // 4. If requestObject’s signal’s aborted flag is set, then:\n if (requestObject.signal.aborted) {\n // 1. Abort the fetch() call with p, request, null, and\n // requestObject’s signal’s abort reason.\n abortFetch(p, request, null, requestObject.signal.reason, null)\n\n // 2. Return p.\n return p.promise\n }\n\n // 5. Let globalObject be request’s client’s global object.\n const globalObject = request.client.globalObject\n\n // 6. If globalObject is a ServiceWorkerGlobalScope object, then set\n // request’s service-workers mode to \"none\".\n if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') {\n request.serviceWorkers = 'none'\n }\n\n // 7. Let responseObject be null.\n let responseObject = null\n\n // 8. Let relevantRealm be this’s relevant Realm.\n\n // 9. Let locallyAborted be false.\n let locallyAborted = false\n\n // 10. Let controller be null.\n let controller = null\n\n // 11. Add the following abort steps to requestObject’s signal:\n addAbortListener(\n requestObject.signal,\n () => {\n // 1. Set locallyAborted to true.\n locallyAborted = true\n\n // 2. Assert: controller is non-null.\n assert(controller != null)\n\n // 3. Abort controller with requestObject’s signal’s abort reason.\n controller.abort(requestObject.signal.reason)\n\n const realResponse = responseObject?.deref()\n\n // 4. Abort the fetch() call with p, request, responseObject,\n // and requestObject’s signal’s abort reason.\n abortFetch(p, request, realResponse, requestObject.signal.reason, controller.controller)\n }\n )\n\n // 12. Let handleFetchDone given response response be to finalize and\n // report timing with response, globalObject, and \"fetch\".\n // see function handleFetchDone\n\n // 13. Set controller to the result of calling fetch given request,\n // with processResponseEndOfBody set to handleFetchDone, and processResponse\n // given response being these substeps:\n\n const processResponse = (response) => {\n // 1. If locallyAborted is true, terminate these substeps.\n if (locallyAborted) {\n return\n }\n\n // 2. If response’s aborted flag is set, then:\n if (response.aborted) {\n // 1. Let deserializedError be the result of deserialize a serialized\n // abort reason given controller’s serialized abort reason and\n // relevantRealm.\n\n // 2. Abort the fetch() call with p, request, responseObject, and\n // deserializedError.\n\n abortFetch(p, request, responseObject, controller.serializedAbortReason, controller.controller)\n return\n }\n\n // 3. If response is a network error, then reject p with a TypeError\n // and terminate these substeps.\n if (response.type === 'error') {\n p.reject(new TypeError('fetch failed', { cause: response.error }))\n return\n }\n\n // 4. Set responseObject to the result of creating a Response object,\n // given response, \"immutable\", and relevantRealm.\n responseObject = new WeakRef(fromInnerResponse(response, 'immutable'))\n\n // 5. Resolve p with responseObject.\n p.resolve(responseObject.deref())\n p = null\n }\n\n controller = fetching({\n request,\n processResponseEndOfBody: handleFetchDone,\n processResponse,\n dispatcher: getRequestDispatcher(requestObject), // undici\n // Keep requestObject alive to prevent its AbortController from being GC'd\n // See https://github.com/nodejs/undici/issues/4627\n requestObject\n })\n\n // 14. Return p.\n return p.promise\n}\n\n// https://fetch.spec.whatwg.org/#finalize-and-report-timing\nfunction finalizeAndReportTiming (response, initiatorType = 'other') {\n // 1. If response is an aborted network error, then return.\n if (response.type === 'error' && response.aborted) {\n return\n }\n\n // 2. If response’s URL list is null or empty, then return.\n if (!response.urlList?.length) {\n return\n }\n\n // 3. Let originalURL be response’s URL list[0].\n const originalURL = response.urlList[0]\n\n // 4. Let timingInfo be response’s timing info.\n let timingInfo = response.timingInfo\n\n // 5. Let cacheState be response’s cache state.\n let cacheState = response.cacheState\n\n // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return.\n if (!urlIsHttpHttpsScheme(originalURL)) {\n return\n }\n\n // 7. If timingInfo is null, then return.\n if (timingInfo === null) {\n return\n }\n\n // 8. If response’s timing allow passed flag is not set, then:\n if (!response.timingAllowPassed) {\n // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.\n timingInfo = createOpaqueTimingInfo({\n startTime: timingInfo.startTime\n })\n\n // 2. Set cacheState to the empty string.\n cacheState = ''\n }\n\n // 9. Set timingInfo’s end time to the coarsened shared current time\n // given global’s relevant settings object’s cross-origin isolated\n // capability.\n // TODO: given global’s relevant settings object’s cross-origin isolated\n // capability?\n timingInfo.endTime = coarsenedSharedCurrentTime()\n\n // 10. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 11. Mark resource timing for timingInfo, originalURL, initiatorType,\n // global, and cacheState.\n markResourceTiming(\n timingInfo,\n originalURL.href,\n initiatorType,\n globalThis,\n cacheState,\n '', // bodyType\n response.status\n )\n}\n\n// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing\nconst markResourceTiming = performance.markResourceTiming\n\n// https://fetch.spec.whatwg.org/#abort-fetch\nfunction abortFetch (p, request, responseObject, error, controller /* undici-specific */) {\n // 1. Reject promise with error.\n if (p) {\n // We might have already resolved the promise at this stage\n p.reject(error)\n }\n\n // 2. If request’s body is not null and is readable, then cancel request’s\n // body with error.\n if (request.body?.stream != null && isReadable(request.body.stream)) {\n request.body.stream.cancel(error).catch((err) => {\n if (err.code === 'ERR_INVALID_STATE') {\n // Node bug?\n return\n }\n throw err\n })\n }\n\n // 3. If responseObject is null, then return.\n if (responseObject == null) {\n return\n }\n\n // 4. Let response be responseObject’s response.\n const response = getResponseState(responseObject)\n\n // 5. If response’s body is not null and is readable, then error response’s\n // body with error.\n if (response.body?.stream != null && isReadable(response.body.stream)) {\n controller.error(error)\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetching\nfunction fetching ({\n request,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseEndOfBody,\n processResponseConsumeBody,\n useParallelQueue = false,\n dispatcher = getGlobalDispatcher(), // undici\n requestObject = null // Keep alive to prevent AbortController GC, see #4627\n}) {\n // Ensure that the dispatcher is set accordingly\n assert(dispatcher)\n\n // 1. Let taskDestination be null.\n let taskDestination = null\n\n // 2. Let crossOriginIsolatedCapability be false.\n let crossOriginIsolatedCapability = false\n\n // 3. If request’s client is non-null, then:\n if (request.client != null) {\n // 1. Set taskDestination to request’s client’s global object.\n taskDestination = request.client.globalObject\n\n // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin\n // isolated capability.\n crossOriginIsolatedCapability =\n request.client.crossOriginIsolatedCapability\n }\n\n // 4. If useParallelQueue is true, then set taskDestination to the result of\n // starting a new parallel queue.\n // TODO\n\n // 5. Let timingInfo be a new fetch timing info whose start time and\n // post-redirect start time are the coarsened shared current time given\n // crossOriginIsolatedCapability.\n const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability)\n const timingInfo = createOpaqueTimingInfo({\n startTime: currentTime\n })\n\n // 6. Let fetchParams be a new fetch params whose\n // request is request,\n // timing info is timingInfo,\n // process request body chunk length is processRequestBodyChunkLength,\n // process request end-of-body is processRequestEndOfBody,\n // process response is processResponse,\n // process response consume body is processResponseConsumeBody,\n // process response end-of-body is processResponseEndOfBody,\n // task destination is taskDestination,\n // and cross-origin isolated capability is crossOriginIsolatedCapability.\n const fetchParams = {\n controller: new Fetch(dispatcher),\n request,\n timingInfo,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseConsumeBody,\n processResponseEndOfBody,\n taskDestination,\n crossOriginIsolatedCapability,\n // Keep requestObject alive to prevent its AbortController from being GC'd\n requestObject\n }\n\n // 7. If request’s body is a byte sequence, then set request’s body to\n // request’s body as a body.\n // NOTE: Since fetching is only called from fetch, body should already be\n // extracted.\n assert(!request.body || request.body.stream)\n\n // 8. If request’s window is \"client\", then set request’s window to request’s\n // client, if request’s client’s global object is a Window object; otherwise\n // \"no-window\".\n if (request.window === 'client') {\n // TODO: What if request.client is null?\n request.window =\n request.client?.globalObject?.constructor?.name === 'Window'\n ? request.client\n : 'no-window'\n }\n\n // 9. If request’s origin is \"client\", then set request’s origin to request’s\n // client’s origin.\n if (request.origin === 'client') {\n request.origin = request.client.origin\n }\n\n // 10. If all of the following conditions are true:\n // TODO\n\n // 11. If request’s policy container is \"client\", then:\n if (request.policyContainer === 'client') {\n // 1. If request’s client is non-null, then set request’s policy\n // container to a clone of request’s client’s policy container. [HTML]\n if (request.client != null) {\n request.policyContainer = clonePolicyContainer(\n request.client.policyContainer\n )\n } else {\n // 2. Otherwise, set request’s policy container to a new policy\n // container.\n request.policyContainer = makePolicyContainer()\n }\n }\n\n // 12. If request’s header list does not contain `Accept`, then:\n if (!request.headersList.contains('accept', true)) {\n // 1. Let value be `*/*`.\n const value = '*/*'\n\n // 2. A user agent should set value to the first matching statement, if\n // any, switching on request’s destination:\n // \"document\"\n // \"frame\"\n // \"iframe\"\n // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`\n // \"image\"\n // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`\n // \"style\"\n // `text/css,*/*;q=0.1`\n // TODO\n\n // 3. Append `Accept`/value to request’s header list.\n request.headersList.append('accept', value, true)\n }\n\n // 13. If request’s header list does not contain `Accept-Language`, then\n // user agents should append `Accept-Language`/an appropriate value to\n // request’s header list.\n if (!request.headersList.contains('accept-language', true)) {\n request.headersList.append('accept-language', '*', true)\n }\n\n // 14. If request’s priority is null, then use request’s initiator and\n // destination appropriately in setting request’s priority to a\n // user-agent-defined object.\n if (request.priority === null) {\n // TODO\n }\n\n // 15. If request is a subresource request, then:\n if (subresourceSet.has(request.destination)) {\n // TODO\n }\n\n // 16. Run main fetch given fetchParams.\n mainFetch(fetchParams, false)\n\n // 17. Return fetchParam's controller\n return fetchParams.controller\n}\n\n// https://fetch.spec.whatwg.org/#concept-main-fetch\nasync function mainFetch (fetchParams, recursive) {\n try {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. If request’s local-URLs-only flag is set and request’s current URL is\n // not local, then set response to a network error.\n if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {\n response = makeNetworkError('local URLs only')\n }\n\n // 4. Run report Content Security Policy violations for request.\n // TODO\n\n // 5. Upgrade request to a potentially trustworthy URL, if appropriate.\n tryUpgradeRequestToAPotentiallyTrustworthyURL(request)\n\n // 6. If should request be blocked due to a bad port, should fetching request\n // be blocked as mixed content, or should request be blocked by Content\n // Security Policy returns blocked, then set response to a network error.\n if (requestBadPort(request) === 'blocked') {\n response = makeNetworkError('bad port')\n }\n // TODO: should fetching request be blocked as mixed content?\n // TODO: should request be blocked by Content Security Policy?\n\n // 7. If request’s referrer policy is the empty string, then set request’s\n // referrer policy to request’s policy container’s referrer policy.\n if (request.referrerPolicy === '') {\n request.referrerPolicy = request.policyContainer.referrerPolicy\n }\n\n // 8. If request’s referrer is not \"no-referrer\", then set request’s\n // referrer to the result of invoking determine request’s referrer.\n if (request.referrer !== 'no-referrer') {\n request.referrer = determineRequestsReferrer(request)\n }\n\n // 9. Set request’s current URL’s scheme to \"https\" if all of the following\n // conditions are true:\n // - request’s current URL’s scheme is \"http\"\n // - request’s current URL’s host is a domain\n // - Matching request’s current URL’s host per Known HSTS Host Domain Name\n // Matching results in either a superdomain match with an asserted\n // includeSubDomains directive or a congruent match (with or without an\n // asserted includeSubDomains directive). [HSTS]\n // TODO\n\n // 10. If recursive is false, then run the remaining steps in parallel.\n // TODO\n\n // 11. If response is null, then set response to the result of running\n // the steps corresponding to the first matching statement:\n if (response === null) {\n const currentURL = requestCurrentURL(request)\n if (\n // - request’s current URL’s origin is same origin with request’s origin,\n // and request’s response tainting is \"basic\"\n (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||\n // request’s current URL’s scheme is \"data\"\n (currentURL.protocol === 'data:') ||\n // - request’s mode is \"navigate\" or \"websocket\"\n (request.mode === 'navigate' || request.mode === 'websocket')\n ) {\n // 1. Set request’s response tainting to \"basic\".\n request.responseTainting = 'basic'\n\n // 2. Return the result of running scheme fetch given fetchParams.\n response = await schemeFetch(fetchParams)\n\n // request’s mode is \"same-origin\"\n } else if (request.mode === 'same-origin') {\n // 1. Return a network error.\n response = makeNetworkError('request mode cannot be \"same-origin\"')\n\n // request’s mode is \"no-cors\"\n } else if (request.mode === 'no-cors') {\n // 1. If request’s redirect mode is not \"follow\", then return a network\n // error.\n if (request.redirect !== 'follow') {\n response = makeNetworkError(\n 'redirect mode cannot be \"follow\" for \"no-cors\" request'\n )\n } else {\n // 2. Set request’s response tainting to \"opaque\".\n request.responseTainting = 'opaque'\n\n // 3. Return the result of running scheme fetch given fetchParams.\n response = await schemeFetch(fetchParams)\n }\n // request’s current URL’s scheme is not an HTTP(S) scheme\n } else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {\n // Return a network error.\n response = makeNetworkError('URL scheme must be a HTTP(S) scheme')\n\n // - request’s use-CORS-preflight flag is set\n // - request’s unsafe-request flag is set and either request’s method is\n // not a CORS-safelisted method or CORS-unsafe request-header names with\n // request’s header list is not empty\n // 1. Set request’s response tainting to \"cors\".\n // 2. Let corsWithPreflightResponse be the result of running HTTP fetch\n // given fetchParams and true.\n // 3. If corsWithPreflightResponse is a network error, then clear cache\n // entries using request.\n // 4. Return corsWithPreflightResponse.\n // TODO\n\n // Otherwise\n } else {\n // 1. Set request’s response tainting to \"cors\".\n request.responseTainting = 'cors'\n\n // 2. Return the result of running HTTP fetch given fetchParams.\n response = await httpFetch(fetchParams)\n }\n }\n\n // 12. If recursive is true, then return response.\n if (recursive) {\n return response\n }\n\n // 13. If response is not a network error and response is not a filtered\n // response, then:\n if (response.status !== 0 && !response.internalResponse) {\n // If request’s response tainting is \"cors\", then:\n if (request.responseTainting === 'cors') {\n // 1. Let headerNames be the result of extracting header list values\n // given `Access-Control-Expose-Headers` and response’s header list.\n // TODO\n // 2. If request’s credentials mode is not \"include\" and headerNames\n // contains `*`, then set response’s CORS-exposed header-name list to\n // all unique header names in response’s header list.\n // TODO\n // 3. Otherwise, if headerNames is not null or failure, then set\n // response’s CORS-exposed header-name list to headerNames.\n // TODO\n }\n\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (request.responseTainting === 'basic') {\n response = filterResponse(response, 'basic')\n } else if (request.responseTainting === 'cors') {\n response = filterResponse(response, 'cors')\n } else if (request.responseTainting === 'opaque') {\n response = filterResponse(response, 'opaque')\n } else {\n assert(false)\n }\n }\n\n // 14. Let internalResponse be response, if response is a network error,\n // and response’s internal response otherwise.\n let internalResponse =\n response.status === 0 ? response : response.internalResponse\n\n // 15. If internalResponse’s URL list is empty, then set it to a clone of\n // request’s URL list.\n if (internalResponse.urlList.length === 0) {\n internalResponse.urlList.push(...request.urlList)\n }\n\n // 16. If request’s timing allow failed flag is unset, then set\n // internalResponse’s timing allow passed flag.\n if (!request.timingAllowFailed) {\n response.timingAllowPassed = true\n }\n\n // 17. If response is not a network error and any of the following returns\n // blocked\n // - should internalResponse to request be blocked as mixed content\n // - should internalResponse to request be blocked by Content Security Policy\n // - should internalResponse to request be blocked due to its MIME type\n // - should internalResponse to request be blocked due to nosniff\n // TODO\n\n // 18. If response’s type is \"opaque\", internalResponse’s status is 206,\n // internalResponse’s range-requested flag is set, and request’s header\n // list does not contain `Range`, then set response and internalResponse\n // to a network error.\n if (\n response.type === 'opaque' &&\n internalResponse.status === 206 &&\n internalResponse.rangeRequested &&\n !request.headers.contains('range', true)\n ) {\n response = internalResponse = makeNetworkError()\n }\n\n // 19. If response is not a network error and either request’s method is\n // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,\n // set internalResponse’s body to null and disregard any enqueuing toward\n // it (if any).\n if (\n response.status !== 0 &&\n (request.method === 'HEAD' ||\n request.method === 'CONNECT' ||\n nullBodyStatus.includes(internalResponse.status))\n ) {\n internalResponse.body = null\n fetchParams.controller.dump = true\n }\n\n // 20. If request’s integrity metadata is not the empty string, then:\n if (request.integrity) {\n // 1. Let processBodyError be this step: run fetch finale given fetchParams\n // and a network error.\n const processBodyError = (reason) =>\n fetchFinale(fetchParams, makeNetworkError(reason))\n\n // 2. If request’s response tainting is \"opaque\", or response’s body is null,\n // then run processBodyError and abort these steps.\n if (request.responseTainting === 'opaque' || response.body == null) {\n processBodyError(response.error)\n return\n }\n\n // 3. Let processBody given bytes be these steps:\n const processBody = (bytes) => {\n // 1. If bytes do not match request’s integrity metadata,\n // then run processBodyError and abort these steps. [SRI]\n if (!bytesMatch(bytes, request.integrity)) {\n processBodyError('integrity mismatch')\n return\n }\n\n // 2. Set response’s body to bytes as a body.\n response.body = safelyExtractBody(bytes)[0]\n\n // 3. Run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n\n // 4. Fully read response’s body given processBody and processBodyError.\n fullyReadBody(response.body, processBody, processBodyError)\n } else {\n // 21. Otherwise, run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n } catch (err) {\n fetchParams.controller.terminate(err)\n }\n}\n\n// https://fetch.spec.whatwg.org/#concept-scheme-fetch\n// given a fetch params fetchParams\nfunction schemeFetch (fetchParams) {\n // Note: since the connection is destroyed on redirect, which sets fetchParams to a\n // cancelled state, we do not want this condition to trigger *unless* there have been\n // no redirects. See https://github.com/nodejs/undici/issues/1776\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {\n return Promise.resolve(makeAppropriateNetworkError(fetchParams))\n }\n\n // 2. Let request be fetchParams’s request.\n const { request } = fetchParams\n\n const { protocol: scheme } = requestCurrentURL(request)\n\n // 3. Switch on request’s current URL’s scheme and run the associated steps:\n switch (scheme) {\n case 'about:': {\n // If request’s current URL’s path is the string \"blank\", then return a new response\n // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) »,\n // and body is the empty byte sequence as a body.\n\n // Otherwise, return a network error.\n return Promise.resolve(makeNetworkError('about scheme is not supported'))\n }\n case 'blob:': {\n if (!resolveObjectURL) {\n resolveObjectURL = require('node:buffer').resolveObjectURL\n }\n\n // 1. Let blobURLEntry be request’s current URL’s blob URL entry.\n const blobURLEntry = requestCurrentURL(request)\n\n // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56\n // Buffer.resolveObjectURL does not ignore URL queries.\n if (blobURLEntry.search.length !== 0) {\n return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))\n }\n\n const blob = resolveObjectURL(blobURLEntry.toString())\n\n // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s\n // object is not a Blob object, then return a network error.\n if (request.method !== 'GET' || !webidl.is.Blob(blob)) {\n return Promise.resolve(makeNetworkError('invalid method'))\n }\n\n // 3. Let blob be blobURLEntry’s object.\n // Note: done above\n\n // 4. Let response be a new response.\n const response = makeResponse()\n\n // 5. Let fullLength be blob’s size.\n const fullLength = blob.size\n\n // 6. Let serializedFullLength be fullLength, serialized and isomorphic encoded.\n const serializedFullLength = isomorphicEncode(`${fullLength}`)\n\n // 7. Let type be blob’s type.\n const type = blob.type\n\n // 8. If request’s header list does not contain `Range`:\n // 9. Otherwise:\n if (!request.headersList.contains('range', true)) {\n // 1. Let bodyWithType be the result of safely extracting blob.\n // Note: in the FileAPI a blob \"object\" is a Blob *or* a MediaSource.\n // In node, this can only ever be a Blob. Therefore we can safely\n // use extractBody directly.\n const bodyWithType = extractBody(blob)\n\n // 2. Set response’s status message to `OK`.\n response.statusText = 'OK'\n\n // 3. Set response’s body to bodyWithType’s body.\n response.body = bodyWithType[0]\n\n // 4. Set response’s header list to « (`Content-Length`, serializedFullLength), (`Content-Type`, type) ».\n response.headersList.set('content-length', serializedFullLength, true)\n response.headersList.set('content-type', type, true)\n } else {\n // 1. Set response’s range-requested flag.\n response.rangeRequested = true\n\n // 2. Let rangeHeader be the result of getting `Range` from request’s header list.\n const rangeHeader = request.headersList.get('range', true)\n\n // 3. Let rangeValue be the result of parsing a single range header value given rangeHeader and true.\n const rangeValue = simpleRangeHeaderValue(rangeHeader, true)\n\n // 4. If rangeValue is failure, then return a network error.\n if (rangeValue === 'failure') {\n return Promise.resolve(makeNetworkError('failed to fetch the data URL'))\n }\n\n // 5. Let (rangeStart, rangeEnd) be rangeValue.\n let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue\n\n // 6. If rangeStart is null:\n // 7. Otherwise:\n if (rangeStart === null) {\n // 1. Set rangeStart to fullLength − rangeEnd.\n rangeStart = fullLength - rangeEnd\n\n // 2. Set rangeEnd to rangeStart + rangeEnd − 1.\n rangeEnd = rangeStart + rangeEnd - 1\n } else {\n // 1. If rangeStart is greater than or equal to fullLength, then return a network error.\n if (rangeStart >= fullLength) {\n return Promise.resolve(makeNetworkError('Range start is greater than the blob\\'s size.'))\n }\n\n // 2. If rangeEnd is null or rangeEnd is greater than or equal to fullLength, then set\n // rangeEnd to fullLength − 1.\n if (rangeEnd === null || rangeEnd >= fullLength) {\n rangeEnd = fullLength - 1\n }\n }\n\n // 8. Let slicedBlob be the result of invoking slice blob given blob, rangeStart,\n // rangeEnd + 1, and type.\n const slicedBlob = blob.slice(rangeStart, rangeEnd + 1, type)\n\n // 9. Let slicedBodyWithType be the result of safely extracting slicedBlob.\n // Note: same reason as mentioned above as to why we use extractBody\n const slicedBodyWithType = extractBody(slicedBlob)\n\n // 10. Set response’s body to slicedBodyWithType’s body.\n response.body = slicedBodyWithType[0]\n\n // 11. Let serializedSlicedLength be slicedBlob’s size, serialized and isomorphic encoded.\n const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`)\n\n // 12. Let contentRange be the result of invoking build a content range given rangeStart,\n // rangeEnd, and fullLength.\n const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength)\n\n // 13. Set response’s status to 206.\n response.status = 206\n\n // 14. Set response’s status message to `Partial Content`.\n response.statusText = 'Partial Content'\n\n // 15. Set response’s header list to « (`Content-Length`, serializedSlicedLength),\n // (`Content-Type`, type), (`Content-Range`, contentRange) ».\n response.headersList.set('content-length', serializedSlicedLength, true)\n response.headersList.set('content-type', type, true)\n response.headersList.set('content-range', contentRange, true)\n }\n\n // 10. Return response.\n return Promise.resolve(response)\n }\n case 'data:': {\n // 1. Let dataURLStruct be the result of running the\n // data: URL processor on request’s current URL.\n const currentURL = requestCurrentURL(request)\n const dataURLStruct = dataURLProcessor(currentURL)\n\n // 2. If dataURLStruct is failure, then return a\n // network error.\n if (dataURLStruct === 'failure') {\n return Promise.resolve(makeNetworkError('failed to fetch the data URL'))\n }\n\n // 3. Let mimeType be dataURLStruct’s MIME type, serialized.\n const mimeType = serializeAMimeType(dataURLStruct.mimeType)\n\n // 4. Return a response whose status message is `OK`,\n // header list is « (`Content-Type`, mimeType) »,\n // and body is dataURLStruct’s body as a body.\n return Promise.resolve(makeResponse({\n statusText: 'OK',\n headersList: [\n ['content-type', { name: 'Content-Type', value: mimeType }]\n ],\n body: safelyExtractBody(dataURLStruct.body)[0]\n }))\n }\n case 'file:': {\n // For now, unfortunate as it is, file URLs are left as an exercise for the reader.\n // When in doubt, return a network error.\n return Promise.resolve(makeNetworkError('not implemented... yet...'))\n }\n case 'http:':\n case 'https:': {\n // Return the result of running HTTP fetch given fetchParams.\n\n return httpFetch(fetchParams)\n .catch((err) => makeNetworkError(err))\n }\n default: {\n return Promise.resolve(makeNetworkError('unknown scheme'))\n }\n }\n}\n\n// https://fetch.spec.whatwg.org/#finalize-response\nfunction finalizeResponse (fetchParams, response) {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // 2, If fetchParams’s process response done is not null, then queue a fetch\n // task to run fetchParams’s process response done given response, with\n // fetchParams’s task destination.\n if (fetchParams.processResponseDone != null) {\n queueMicrotask(() => fetchParams.processResponseDone(response))\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetch-finale\nfunction fetchFinale (fetchParams, response) {\n // 1. Let timingInfo be fetchParams’s timing info.\n let timingInfo = fetchParams.timingInfo\n\n // 2. If response is not a network error and fetchParams’s request’s client is a secure context,\n // then set timingInfo’s server-timing headers to the result of getting, decoding, and splitting\n // `Server-Timing` from response’s internal response’s header list.\n // TODO\n\n // 3. Let processResponseEndOfBody be the following steps:\n const processResponseEndOfBody = () => {\n // 1. Let unsafeEndTime be the unsafe shared current time.\n const unsafeEndTime = Date.now() // ?\n\n // 2. If fetchParams’s request’s destination is \"document\", then set fetchParams’s controller’s\n // full timing info to fetchParams’s timing info.\n if (fetchParams.request.destination === 'document') {\n fetchParams.controller.fullTimingInfo = timingInfo\n }\n\n // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global:\n fetchParams.controller.reportTimingSteps = () => {\n // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return.\n if (!urlIsHttpHttpsScheme(fetchParams.request.url)) {\n return\n }\n\n // 2. Set timingInfo’s end time to the relative high resolution time given unsafeEndTime and global.\n timingInfo.endTime = unsafeEndTime\n\n // 3. Let cacheState be response’s cache state.\n let cacheState = response.cacheState\n\n // 4. Let bodyInfo be response’s body info.\n const bodyInfo = response.bodyInfo\n\n // 5. If response’s timing allow passed flag is not set, then set timingInfo to the result of creating an\n // opaque timing info for timingInfo and set cacheState to the empty string.\n if (!response.timingAllowPassed) {\n timingInfo = createOpaqueTimingInfo(timingInfo)\n\n cacheState = ''\n }\n\n // 6. Let responseStatus be 0.\n let responseStatus = 0\n\n // 7. If fetchParams’s request’s mode is not \"navigate\" or response’s has-cross-origin-redirects is false:\n if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) {\n // 1. Set responseStatus to response’s status.\n responseStatus = response.status\n\n // 2. Let mimeType be the result of extracting a MIME type from response’s header list.\n const mimeType = extractMimeType(response.headersList)\n\n // 3. If mimeType is not failure, then set bodyInfo’s content type to the result of minimizing a supported MIME type given mimeType.\n if (mimeType !== 'failure') {\n bodyInfo.contentType = minimizeSupportedMimeType(mimeType)\n }\n }\n\n // 8. If fetchParams’s request’s initiator type is non-null, then mark resource timing given timingInfo,\n // fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo,\n // and responseStatus.\n if (fetchParams.request.initiatorType != null) {\n markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus)\n }\n }\n\n // 4. Let processResponseEndOfBodyTask be the following steps:\n const processResponseEndOfBodyTask = () => {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // 2. If fetchParams’s process response end-of-body is non-null, then run fetchParams’s process\n // response end-of-body given response.\n if (fetchParams.processResponseEndOfBody != null) {\n queueMicrotask(() => fetchParams.processResponseEndOfBody(response))\n }\n\n // 3. If fetchParams’s request’s initiator type is non-null and fetchParams’s request’s client’s\n // global object is fetchParams’s task destination, then run fetchParams’s controller’s report\n // timing steps given fetchParams’s request’s client’s global object.\n if (fetchParams.request.initiatorType != null) {\n fetchParams.controller.reportTimingSteps()\n }\n }\n\n // 5. Queue a fetch task to run processResponseEndOfBodyTask with fetchParams’s task destination\n queueMicrotask(() => processResponseEndOfBodyTask())\n }\n\n // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s\n // process response given response, with fetchParams’s task destination.\n if (fetchParams.processResponse != null) {\n queueMicrotask(() => {\n fetchParams.processResponse(response)\n fetchParams.processResponse = null\n })\n }\n\n // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response.\n const internalResponse = response.type === 'error' ? response : (response.internalResponse ?? response)\n\n // 6. If internalResponse’s body is null, then run processResponseEndOfBody.\n // 7. Otherwise:\n if (internalResponse.body == null) {\n processResponseEndOfBody()\n } else {\n // mcollina: all the following steps of the specs are skipped.\n // The internal transform stream is not needed.\n // See https://github.com/nodejs/undici/pull/3093#issuecomment-2050198541\n\n // 1. Let transformStream be a new TransformStream.\n // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, enqueues chunk in transformStream.\n // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm\n // set to processResponseEndOfBody.\n // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream.\n\n finished(internalResponse.body.stream, () => {\n processResponseEndOfBody()\n })\n }\n}\n\n// https://fetch.spec.whatwg.org/#http-fetch\nasync function httpFetch (fetchParams) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let actualResponse be null.\n let actualResponse = null\n\n // 4. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 5. If request’s service-workers mode is \"all\", then:\n if (request.serviceWorkers === 'all') {\n // TODO\n }\n\n // 6. If response is null, then:\n if (response === null) {\n // 1. If makeCORSPreflight is true and one of these conditions is true:\n // TODO\n\n // 2. If request’s redirect mode is \"follow\", then set request’s\n // service-workers mode to \"none\".\n if (request.redirect === 'follow') {\n request.serviceWorkers = 'none'\n }\n\n // 3. Set response and actualResponse to the result of running\n // HTTP-network-or-cache fetch given fetchParams.\n actualResponse = response = await httpNetworkOrCacheFetch(fetchParams)\n\n // 4. If request’s response tainting is \"cors\" and a CORS check\n // for request and response returns failure, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n corsCheck(request, response) === 'failure'\n ) {\n return makeNetworkError('cors failure')\n }\n\n // 5. If the TAO check for request and response returns failure, then set\n // request’s timing allow failed flag.\n if (TAOCheck(request, response) === 'failure') {\n request.timingAllowFailed = true\n }\n }\n\n // 7. If either request’s response tainting or response’s type\n // is \"opaque\", and the cross-origin resource policy check with\n // request’s origin, request’s client, request’s destination,\n // and actualResponse returns blocked, then return a network error.\n if (\n (request.responseTainting === 'opaque' || response.type === 'opaque') &&\n crossOriginResourcePolicyCheck(\n request.origin,\n request.client,\n request.destination,\n actualResponse\n ) === 'blocked'\n ) {\n return makeNetworkError('blocked')\n }\n\n // 8. If actualResponse’s status is a redirect status, then:\n if (redirectStatusSet.has(actualResponse.status)) {\n // 1. If actualResponse’s status is not 303, request’s body is not null,\n // and the connection uses HTTP/2, then user agents may, and are even\n // encouraged to, transmit an RST_STREAM frame.\n // See, https://github.com/whatwg/fetch/issues/1288\n if (request.redirect !== 'manual') {\n fetchParams.controller.connection.destroy(undefined, false)\n }\n\n // 2. Switch on request’s redirect mode:\n if (request.redirect === 'error') {\n // Set response to a network error.\n response = makeNetworkError('unexpected redirect')\n } else if (request.redirect === 'manual') {\n // Set response to an opaque-redirect filtered response whose internal\n // response is actualResponse.\n // NOTE(spec): On the web this would return an `opaqueredirect` response,\n // but that doesn't make sense server side.\n // See https://github.com/nodejs/undici/issues/1193.\n response = actualResponse\n } else if (request.redirect === 'follow') {\n // Set response to the result of running HTTP-redirect fetch given\n // fetchParams and response.\n response = await httpRedirectFetch(fetchParams, response)\n } else {\n assert(false)\n }\n }\n\n // 9. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 10. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-redirect-fetch\nfunction httpRedirectFetch (fetchParams, response) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let actualResponse be response, if response is not a filtered response,\n // and response’s internal response otherwise.\n const actualResponse = response.internalResponse\n ? response.internalResponse\n : response\n\n // 3. Let locationURL be actualResponse’s location URL given request’s current\n // URL’s fragment.\n let locationURL\n\n try {\n locationURL = responseLocationURL(\n actualResponse,\n requestCurrentURL(request).hash\n )\n\n // 4. If locationURL is null, then return response.\n if (locationURL == null) {\n return response\n }\n } catch (err) {\n // 5. If locationURL is failure, then return a network error.\n return Promise.resolve(makeNetworkError(err))\n }\n\n // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network\n // error.\n if (!urlIsHttpHttpsScheme(locationURL)) {\n return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))\n }\n\n // 7. If request’s redirect count is 20, then return a network error.\n if (request.redirectCount === 20) {\n return Promise.resolve(makeNetworkError('redirect count exceeded'))\n }\n\n // 8. Increase request’s redirect count by 1.\n request.redirectCount += 1\n\n // 9. If request’s mode is \"cors\", locationURL includes credentials, and\n // request’s origin is not same origin with locationURL’s origin, then return\n // a network error.\n if (\n request.mode === 'cors' &&\n (locationURL.username || locationURL.password) &&\n !sameOrigin(request, locationURL)\n ) {\n return Promise.resolve(makeNetworkError('cross origin not allowed for request mode \"cors\"'))\n }\n\n // 10. If request’s response tainting is \"cors\" and locationURL includes\n // credentials, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n (locationURL.username || locationURL.password)\n ) {\n return Promise.resolve(makeNetworkError(\n 'URL cannot contain credentials for request mode \"cors\"'\n ))\n }\n\n // 11. If actualResponse’s status is not 303, request’s body is non-null,\n // and request’s body’s source is null, then return a network error.\n if (\n actualResponse.status !== 303 &&\n request.body != null &&\n request.body.source == null\n ) {\n return Promise.resolve(makeNetworkError())\n }\n\n // 12. If one of the following is true\n // - actualResponse’s status is 301 or 302 and request’s method is `POST`\n // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD`\n if (\n ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||\n (actualResponse.status === 303 &&\n !GET_OR_HEAD.includes(request.method))\n ) {\n // then:\n // 1. Set request’s method to `GET` and request’s body to null.\n request.method = 'GET'\n request.body = null\n\n // 2. For each headerName of request-body-header name, delete headerName from\n // request’s header list.\n for (const headerName of requestBodyHeader) {\n request.headersList.delete(headerName)\n }\n }\n\n // 13. If request’s current URL’s origin is not same origin with locationURL’s\n // origin, then for each headerName of CORS non-wildcard request-header name,\n // delete headerName from request’s header list.\n if (!sameOrigin(requestCurrentURL(request), locationURL)) {\n // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name\n request.headersList.delete('authorization', true)\n\n // https://fetch.spec.whatwg.org/#authentication-entries\n request.headersList.delete('proxy-authorization', true)\n\n // \"Cookie\" and \"Host\" are forbidden request-headers, which undici doesn't implement.\n request.headersList.delete('cookie', true)\n request.headersList.delete('host', true)\n }\n\n // 14. If request's body is non-null, then set request's body to the first return\n // value of safely extracting request's body's source.\n if (request.body != null) {\n assert(request.body.source != null)\n request.body = safelyExtractBody(request.body.source)[0]\n }\n\n // 15. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 16. Set timingInfo’s redirect end time and post-redirect start time to the\n // coarsened shared current time given fetchParams’s cross-origin isolated\n // capability.\n timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =\n coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n\n // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s\n // redirect start time to timingInfo’s start time.\n if (timingInfo.redirectStartTime === 0) {\n timingInfo.redirectStartTime = timingInfo.startTime\n }\n\n // 18. Append locationURL to request’s URL list.\n request.urlList.push(locationURL)\n\n // 19. Invoke set request’s referrer policy on redirect on request and\n // actualResponse.\n setRequestReferrerPolicyOnRedirect(request, actualResponse)\n\n // 20. Return the result of running main fetch given fetchParams and true.\n return mainFetch(fetchParams, true)\n}\n\n// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch\nasync function httpNetworkOrCacheFetch (\n fetchParams,\n isAuthenticationFetch = false,\n isNewConnectionFetch = false\n) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let httpFetchParams be null.\n let httpFetchParams = null\n\n // 3. Let httpRequest be null.\n let httpRequest = null\n\n // 4. Let response be null.\n let response = null\n\n // 5. Let storedResponse be null.\n // TODO: cache\n\n // 6. Let httpCache be null.\n const httpCache = null\n\n // 7. Let the revalidatingFlag be unset.\n const revalidatingFlag = false\n\n // 8. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If request’s window is \"no-window\" and request’s redirect mode is\n // \"error\", then set httpFetchParams to fetchParams and httpRequest to\n // request.\n if (request.window === 'no-window' && request.redirect === 'error') {\n httpFetchParams = fetchParams\n httpRequest = request\n } else {\n // Otherwise:\n\n // 1. Set httpRequest to a clone of request.\n httpRequest = cloneRequest(request)\n\n // 2. Set httpFetchParams to a copy of fetchParams.\n httpFetchParams = { ...fetchParams }\n\n // 3. Set httpFetchParams’s request to httpRequest.\n httpFetchParams.request = httpRequest\n }\n\n // 3. Let includeCredentials be true if one of\n const includeCredentials =\n request.credentials === 'include' ||\n (request.credentials === 'same-origin' &&\n request.responseTainting === 'basic')\n\n // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s\n // body is non-null; otherwise null.\n const contentLength = httpRequest.body ? httpRequest.body.length : null\n\n // 5. Let contentLengthHeaderValue be null.\n let contentLengthHeaderValue = null\n\n // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or\n // `PUT`, then set contentLengthHeaderValue to `0`.\n if (\n httpRequest.body == null &&\n ['POST', 'PUT'].includes(httpRequest.method)\n ) {\n contentLengthHeaderValue = '0'\n }\n\n // 7. If contentLength is non-null, then set contentLengthHeaderValue to\n // contentLength, serialized and isomorphic encoded.\n if (contentLength != null) {\n contentLengthHeaderValue = isomorphicEncode(`${contentLength}`)\n }\n\n // 8. If contentLengthHeaderValue is non-null, then append\n // `Content-Length`/contentLengthHeaderValue to httpRequest’s header\n // list.\n if (contentLengthHeaderValue != null) {\n httpRequest.headersList.append('content-length', contentLengthHeaderValue, true)\n }\n\n // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`,\n // contentLengthHeaderValue) to httpRequest’s header list.\n\n // 10. If contentLength is non-null and httpRequest’s keepalive is true,\n // then:\n if (contentLength != null && httpRequest.keepalive) {\n // NOTE: keepalive is a noop outside of browser context.\n }\n\n // 11. If httpRequest’s referrer is a URL, then append\n // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded,\n // to httpRequest’s header list.\n if (webidl.is.URL(httpRequest.referrer)) {\n httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true)\n }\n\n // 12. Append a request `Origin` header for httpRequest.\n appendRequestOriginHeader(httpRequest)\n\n // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA]\n appendFetchMetadata(httpRequest)\n\n // 14. If httpRequest’s header list does not contain `User-Agent`, then\n // user agents should append `User-Agent`/default `User-Agent` value to\n // httpRequest’s header list.\n if (!httpRequest.headersList.contains('user-agent', true)) {\n httpRequest.headersList.append('user-agent', defaultUserAgent, true)\n }\n\n // 15. If httpRequest’s cache mode is \"default\" and httpRequest’s header\n // list contains `If-Modified-Since`, `If-None-Match`,\n // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set\n // httpRequest’s cache mode to \"no-store\".\n if (\n httpRequest.cache === 'default' &&\n (httpRequest.headersList.contains('if-modified-since', true) ||\n httpRequest.headersList.contains('if-none-match', true) ||\n httpRequest.headersList.contains('if-unmodified-since', true) ||\n httpRequest.headersList.contains('if-match', true) ||\n httpRequest.headersList.contains('if-range', true))\n ) {\n httpRequest.cache = 'no-store'\n }\n\n // 16. If httpRequest’s cache mode is \"no-cache\", httpRequest’s prevent\n // no-cache cache-control header modification flag is unset, and\n // httpRequest’s header list does not contain `Cache-Control`, then append\n // `Cache-Control`/`max-age=0` to httpRequest’s header list.\n if (\n httpRequest.cache === 'no-cache' &&\n !httpRequest.preventNoCacheCacheControlHeaderModification &&\n !httpRequest.headersList.contains('cache-control', true)\n ) {\n httpRequest.headersList.append('cache-control', 'max-age=0', true)\n }\n\n // 17. If httpRequest’s cache mode is \"no-store\" or \"reload\", then:\n if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') {\n // 1. If httpRequest’s header list does not contain `Pragma`, then append\n // `Pragma`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('pragma', true)) {\n httpRequest.headersList.append('pragma', 'no-cache', true)\n }\n\n // 2. If httpRequest’s header list does not contain `Cache-Control`,\n // then append `Cache-Control`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('cache-control', true)) {\n httpRequest.headersList.append('cache-control', 'no-cache', true)\n }\n }\n\n // 18. If httpRequest’s header list contains `Range`, then append\n // `Accept-Encoding`/`identity` to httpRequest’s header list.\n if (httpRequest.headersList.contains('range', true)) {\n httpRequest.headersList.append('accept-encoding', 'identity', true)\n }\n\n // 19. Modify httpRequest’s header list per HTTP. Do not append a given\n // header if httpRequest’s header list contains that header’s name.\n // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129\n if (!httpRequest.headersList.contains('accept-encoding', true)) {\n if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {\n httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true)\n } else {\n httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true)\n }\n }\n\n httpRequest.headersList.delete('host', true)\n\n // 21. If includeCredentials is true, then:\n if (includeCredentials) {\n // 1. If the user agent is not configured to block cookies for httpRequest\n // (see section 7 of [COOKIES]), then:\n // TODO: credentials\n\n // 2. If httpRequest’s header list does not contain `Authorization`, then:\n if (!httpRequest.headersList.contains('authorization', true)) {\n // 1. Let authorizationValue be null.\n let authorizationValue = null\n\n // 2. If there’s an authentication entry for httpRequest and either\n // httpRequest’s use-URL-credentials flag is unset or httpRequest’s\n // current URL does not include credentials, then set\n // authorizationValue to authentication entry.\n if (hasAuthenticationEntry(httpRequest) && (\n httpRequest.useURLCredentials === undefined || !includesCredentials(requestCurrentURL(httpRequest))\n )) {\n // TODO\n } else if (includesCredentials(requestCurrentURL(httpRequest)) && isAuthenticationFetch) {\n // 3. Otherwise, if httpRequest’s current URL does include credentials\n // and isAuthenticationFetch is true, set authorizationValue to\n // httpRequest’s current URL, converted to an `Authorization` value\n const { username, password } = requestCurrentURL(httpRequest)\n authorizationValue = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`\n }\n\n // 4. If authorizationValue is non-null, then append (`Authorization`,\n // authorizationValue) to httpRequest’s header list.\n if (authorizationValue !== null) {\n httpRequest.headersList.append('Authorization', authorizationValue, false)\n }\n }\n }\n\n // 21. If there’s a proxy-authentication entry, use it as appropriate.\n // TODO: proxy-authentication\n\n // 22. Set httpCache to the result of determining the HTTP cache\n // partition, given httpRequest.\n // TODO: cache\n\n // 23. If httpCache is null, then set httpRequest’s cache mode to\n // \"no-store\".\n if (httpCache == null) {\n httpRequest.cache = 'no-store'\n }\n\n // 24. If httpRequest’s cache mode is neither \"no-store\" nor \"reload\",\n // then:\n if (httpRequest.cache !== 'no-store' && httpRequest.cache !== 'reload') {\n // TODO: cache\n }\n\n // 9. If aborted, then return the appropriate network error for fetchParams.\n // TODO\n\n // 10. If response is null, then:\n if (response == null) {\n // 1. If httpRequest’s cache mode is \"only-if-cached\", then return a\n // network error.\n if (httpRequest.cache === 'only-if-cached') {\n return makeNetworkError('only if cached')\n }\n\n // 2. Let forwardResponse be the result of running HTTP-network fetch\n // given httpFetchParams, includeCredentials, and isNewConnectionFetch.\n const forwardResponse = await httpNetworkFetch(\n httpFetchParams,\n includeCredentials,\n isNewConnectionFetch\n )\n\n // 3. If httpRequest’s method is unsafe and forwardResponse’s status is\n // in the range 200 to 399, inclusive, invalidate appropriate stored\n // responses in httpCache, as per the \"Invalidation\" chapter of HTTP\n // Caching, and set storedResponse to null. [HTTP-CACHING]\n if (\n !safeMethodsSet.has(httpRequest.method) &&\n forwardResponse.status >= 200 &&\n forwardResponse.status <= 399\n ) {\n // TODO: cache\n }\n\n // 4. If the revalidatingFlag is set and forwardResponse’s status is 304,\n // then:\n if (revalidatingFlag && forwardResponse.status === 304) {\n // TODO: cache\n }\n\n // 5. If response is null, then:\n if (response == null) {\n // 1. Set response to forwardResponse.\n response = forwardResponse\n\n // 2. Store httpRequest and forwardResponse in httpCache, as per the\n // \"Storing Responses in Caches\" chapter of HTTP Caching. [HTTP-CACHING]\n // TODO: cache\n }\n }\n\n // 11. Set response’s URL list to a clone of httpRequest’s URL list.\n response.urlList = [...httpRequest.urlList]\n\n // 12. If httpRequest’s header list contains `Range`, then set response’s\n // range-requested flag.\n if (httpRequest.headersList.contains('range', true)) {\n response.rangeRequested = true\n }\n\n // 13. Set response’s request-includes-credentials to includeCredentials.\n response.requestIncludesCredentials = includeCredentials\n\n // 14. If response’s status is 401, httpRequest’s response tainting is not \"cors\",\n // includeCredentials is true, and request’s traversable for user prompts is\n // a traversable navigable:\n //\n // In Node.js there is no traversable navigable to prompt the user, but we\n // still need to handle URL-embedded credentials so authentication retries\n // for WebSocket handshakes continue to work.\n if (response.status === 401 && httpRequest.responseTainting !== 'cors' && includeCredentials && (\n request.useURLCredentials !== undefined ||\n isTraversableNavigable(request.traversableForUserPrompts)\n )) {\n // 2. If request’s body is non-null, then:\n if (request.body != null) {\n // 1. If request’s body’s source is null, then return a network error.\n if (request.body.source == null) {\n // Note: In Node.js, this code path should not be reached because\n // isTraversableNavigable() returns false for non-navigable contexts.\n // However, we handle it gracefully by returning the response instead of\n // a network error, as we won't actually retry the request.\n // This aligns with the Fetch spec discussion in whatwg/fetch#1132,\n // which allows implementations flexibility when credentials can't be obtained.\n return response\n }\n\n // 2. Set request’s body to the body of the result of safely extracting\n // request’s body’s source.\n request.body = safelyExtractBody(request.body.source)[0]\n }\n\n // 3. If request’s use-URL-credentials flag is unset or isAuthenticationFetch is\n // true, then:\n if (request.useURLCredentials === undefined || isAuthenticationFetch) {\n // 1. If fetchParams is canceled, then return the appropriate network error\n // for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 2. Let username and password be the result of prompting the end user for a\n // username and password, respectively, in request’s traversable for user prompts.\n // TODO\n\n // 3. Set the username given request’s current URL and username.\n // requestCurrentURL(request).username = TODO\n\n // 4. Set the password given request’s current URL and password.\n // requestCurrentURL(request).password = TODO\n\n // In browsers, the user will be prompted to enter a username/password before the request\n // is re-sent. To prevent an infinite 401 loop, return the response for now.\n // https://github.com/nodejs/undici/pull/4756\n return response\n }\n\n // 4. Set response to the result of running HTTP-network-or-cache fetch given\n // fetchParams and true.\n fetchParams.controller.connection.destroy()\n\n response = await httpNetworkOrCacheFetch(fetchParams, true)\n }\n\n // 15. If response’s status is 407, then:\n if (response.status === 407) {\n // 1. If request’s window is \"no-window\", then return a network error.\n if (request.window === 'no-window') {\n return makeNetworkError()\n }\n\n // 2. ???\n\n // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 4. Prompt the end user as appropriate in request’s window and store\n // the result as a proxy-authentication entry. [HTTP-AUTH]\n // TODO: Invoke some kind of callback?\n\n // 5. Set response to the result of running HTTP-network-or-cache fetch given\n // fetchParams.\n // TODO\n return makeNetworkError('proxy authentication required')\n }\n\n // 16. If all of the following are true\n if (\n // response’s status is 421\n response.status === 421 &&\n // isNewConnectionFetch is false\n !isNewConnectionFetch &&\n // request’s body is null, or request’s body is non-null and request’s body’s source is non-null\n (request.body == null || request.body.source != null)\n ) {\n // then:\n\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 2. Set response to the result of running HTTP-network-or-cache\n // fetch given fetchParams, isAuthenticationFetch, and true.\n\n // TODO (spec): The spec doesn't specify this but we need to cancel\n // the active response before we can start a new one.\n // https://github.com/whatwg/fetch/issues/1293\n fetchParams.controller.connection.destroy()\n\n response = await httpNetworkOrCacheFetch(\n fetchParams,\n isAuthenticationFetch,\n true\n )\n }\n\n // 17. If isAuthenticationFetch is true, then create an authentication entry\n if (isAuthenticationFetch) {\n // TODO\n }\n\n // 18. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-network-fetch\nasync function httpNetworkFetch (\n fetchParams,\n includeCredentials = false,\n forceNewConnection = false\n) {\n assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed)\n\n fetchParams.controller.connection = {\n abort: null,\n destroyed: false,\n destroy (err, abort = true) {\n if (!this.destroyed) {\n this.destroyed = true\n if (abort) {\n this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError'))\n }\n }\n }\n }\n\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 4. Let httpCache be the result of determining the HTTP cache partition,\n // given request.\n // TODO: cache\n const httpCache = null\n\n // 5. If httpCache is null, then set request’s cache mode to \"no-store\".\n if (httpCache == null) {\n request.cache = 'no-store'\n }\n\n // 6. Let networkPartitionKey be the result of determining the network\n // partition key given request.\n // TODO\n\n // 7. Let newConnection be \"yes\" if forceNewConnection is true; otherwise\n // \"no\".\n const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars\n\n // 8. Switch on request’s mode:\n if (request.mode === 'websocket') {\n // Let connection be the result of obtaining a WebSocket connection,\n // given request’s current URL.\n // TODO\n } else {\n // Let connection be the result of obtaining a connection, given\n // networkPartitionKey, request’s current URL’s origin,\n // includeCredentials, and forceNewConnection.\n // TODO\n }\n\n // 9. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If connection is failure, then return a network error.\n\n // 2. Set timingInfo’s final connection timing info to the result of\n // calling clamp and coarsen connection timing info with connection’s\n // timing info, timingInfo’s post-redirect start time, and fetchParams’s\n // cross-origin isolated capability.\n\n // 3. If connection is not an HTTP/2 connection, request’s body is non-null,\n // and request’s body’s source is null, then append (`Transfer-Encoding`,\n // `chunked`) to request’s header list.\n\n // 4. Set timingInfo’s final network-request start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated\n // capability.\n\n // 5. Set response to the result of making an HTTP request over connection\n // using request with the following caveats:\n\n // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS]\n // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH]\n\n // - If request’s body is non-null, and request’s body’s source is null,\n // then the user agent may have a buffer of up to 64 kibibytes and store\n // a part of request’s body in that buffer. If the user agent reads from\n // request’s body beyond that buffer’s size and the user agent needs to\n // resend request, then instead return a network error.\n\n // - Set timingInfo’s final network-response start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated capability,\n // immediately after the user agent’s HTTP parser receives the first byte\n // of the response (e.g., frame header bytes for HTTP/2 or response status\n // line for HTTP/1.x).\n\n // - Wait until all the headers are transmitted.\n\n // - Any responses whose status is in the range 100 to 199, inclusive,\n // and is not 101, are to be ignored, except for the purposes of setting\n // timingInfo’s final network-response start time above.\n\n // - If request’s header list contains `Transfer-Encoding`/`chunked` and\n // response is transferred via HTTP/1.0 or older, then return a network\n // error.\n\n // - If the HTTP request results in a TLS client certificate dialog, then:\n\n // 1. If request’s window is an environment settings object, make the\n // dialog available in request’s window.\n\n // 2. Otherwise, return a network error.\n\n // To transmit request’s body body, run these steps:\n let requestBody = null\n // 1. If body is null and fetchParams’s process request end-of-body is\n // non-null, then queue a fetch task given fetchParams’s process request\n // end-of-body and fetchParams’s task destination.\n if (request.body == null && fetchParams.processRequestEndOfBody) {\n queueMicrotask(() => fetchParams.processRequestEndOfBody())\n } else if (request.body != null) {\n // 2. Otherwise, if body is non-null:\n\n // 1. Let processBodyChunk given bytes be these steps:\n const processBodyChunk = async function * (bytes) {\n // 1. If the ongoing fetch is terminated, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. Run this step in parallel: transmit bytes.\n yield bytes\n\n // 3. If fetchParams’s process request body is non-null, then run\n // fetchParams’s process request body given bytes’s length.\n fetchParams.processRequestBodyChunkLength?.(bytes.byteLength)\n }\n\n // 2. Let processEndOfBody be these steps:\n const processEndOfBody = () => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If fetchParams’s process request end-of-body is non-null,\n // then run fetchParams’s process request end-of-body.\n if (fetchParams.processRequestEndOfBody) {\n fetchParams.processRequestEndOfBody()\n }\n }\n\n // 3. Let processBodyError given e be these steps:\n const processBodyError = (e) => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If e is an \"AbortError\" DOMException, then abort fetchParams’s controller.\n if (e.name === 'AbortError') {\n fetchParams.controller.abort()\n } else {\n fetchParams.controller.terminate(e)\n }\n }\n\n // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody,\n // processBodyError, and fetchParams’s task destination.\n requestBody = (async function * () {\n try {\n for await (const bytes of request.body.stream) {\n yield * processBodyChunk(bytes)\n }\n processEndOfBody()\n } catch (err) {\n processBodyError(err)\n }\n })()\n }\n\n try {\n // socket is only provided for websockets\n const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody })\n\n if (socket) {\n response = makeResponse({ status, statusText, headersList, socket })\n } else {\n const iterator = body[Symbol.asyncIterator]()\n fetchParams.controller.next = () => iterator.next()\n\n response = makeResponse({ status, statusText, headersList })\n }\n } catch (err) {\n // 10. If aborted, then:\n if (err.name === 'AbortError') {\n // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n fetchParams.controller.connection.destroy()\n\n // 2. Return the appropriate network error for fetchParams.\n return makeAppropriateNetworkError(fetchParams, err)\n }\n\n return makeNetworkError(err)\n }\n\n // 11. Let pullAlgorithm be an action that resumes the ongoing fetch\n // if it is suspended.\n const pullAlgorithm = () => {\n return fetchParams.controller.resume()\n }\n\n // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s\n // controller with reason, given reason.\n const cancelAlgorithm = (reason) => {\n // If the aborted fetch was already terminated, then we do not\n // need to do anything.\n if (!isCancelled(fetchParams)) {\n fetchParams.controller.abort(reason)\n }\n }\n\n // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by\n // the user agent.\n // TODO\n\n // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object\n // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.\n // TODO\n\n // 15. Let stream be a new ReadableStream.\n // 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm,\n // cancelAlgorithm set to cancelAlgorithm.\n const stream = new ReadableStream(\n {\n start (controller) {\n fetchParams.controller.controller = controller\n },\n pull: pullAlgorithm,\n cancel: cancelAlgorithm,\n type: 'bytes'\n }\n )\n\n // 17. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. Set response’s body to a new body whose stream is stream.\n response.body = { stream, source: null, length: null }\n\n // 2. If response is not a network error and request’s cache mode is\n // not \"no-store\", then update response in httpCache for request.\n // TODO\n\n // 3. If includeCredentials is true and the user agent is not configured\n // to block cookies for request (see section 7 of [COOKIES]), then run the\n // \"set-cookie-string\" parsing algorithm (see section 5.2 of [COOKIES]) on\n // the value of each header whose name is a byte-case-insensitive match for\n // `Set-Cookie` in response’s header list, if any, and request’s current URL.\n // TODO\n\n // 18. If aborted, then:\n // TODO\n\n // 19. Run these steps in parallel:\n\n // 1. Run these steps, but abort when fetchParams is canceled:\n if (!fetchParams.controller.resume) {\n fetchParams.controller.on('terminated', onAborted)\n }\n\n fetchParams.controller.resume = async () => {\n // 1. While true\n while (true) {\n // 1-3. See onData...\n\n // 4. Set bytes to the result of handling content codings given\n // codings and bytes.\n let bytes\n let isFailure\n try {\n const { done, value } = await fetchParams.controller.next()\n\n if (isAborted(fetchParams)) {\n break\n }\n\n bytes = done ? undefined : value\n } catch (err) {\n if (fetchParams.controller.ended && !timingInfo.encodedBodySize) {\n // zlib doesn't like empty streams.\n bytes = undefined\n } else {\n bytes = err\n\n // err may be propagated from the result of calling readablestream.cancel,\n // which might not be an error. https://github.com/nodejs/undici/issues/2009\n isFailure = true\n }\n }\n\n if (bytes === undefined) {\n // 2. Otherwise, if the bytes transmission for response’s message\n // body is done normally and stream is readable, then close\n // stream, finalize response for fetchParams and response, and\n // abort these in-parallel steps.\n readableStreamClose(fetchParams.controller.controller)\n\n finalizeResponse(fetchParams, response)\n\n return\n }\n\n // 5. Increase timingInfo’s decoded body size by bytes’s length.\n timingInfo.decodedBodySize += bytes?.byteLength ?? 0\n\n // 6. If bytes is failure, then terminate fetchParams’s controller.\n if (isFailure) {\n fetchParams.controller.terminate(bytes)\n return\n }\n\n // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes\n // into stream.\n const buffer = new Uint8Array(bytes)\n if (buffer.byteLength) {\n fetchParams.controller.controller.enqueue(buffer)\n }\n\n // 8. If stream is errored, then terminate the ongoing fetch.\n if (isErrored(stream)) {\n fetchParams.controller.terminate()\n return\n }\n\n // 9. If stream doesn’t need more data ask the user agent to suspend\n // the ongoing fetch.\n if (fetchParams.controller.controller.desiredSize <= 0) {\n return\n }\n }\n }\n\n // 2. If aborted, then:\n function onAborted (reason) {\n // 2. If fetchParams is aborted, then:\n if (isAborted(fetchParams)) {\n // 1. Set response’s aborted flag.\n response.aborted = true\n\n // 2. If stream is readable, then error stream with the result of\n // deserialize a serialized abort reason given fetchParams’s\n // controller’s serialized abort reason and an\n // implementation-defined realm.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(\n fetchParams.controller.serializedAbortReason\n )\n }\n } else {\n // 3. Otherwise, if stream is readable, error stream with a TypeError.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(new TypeError('terminated', {\n cause: isErrorLike(reason) ? reason : undefined\n }))\n }\n }\n\n // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so.\n fetchParams.controller.connection.destroy()\n }\n\n // 20. Return response.\n return response\n\n function dispatch ({ body }) {\n const url = requestCurrentURL(request)\n /** @type {import('../../..').Agent} */\n const agent = fetchParams.controller.dispatcher\n\n const path = url.pathname + url.search\n const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === '?'\n\n return dispatchWithProtocolPreference(body)\n\n function dispatchWithProtocolPreference (body, allowH2) {\n return new Promise((resolve, reject) => agent.dispatch(\n {\n path: hasTrailingQuestionMark ? `${path}?` : path,\n origin: url.origin,\n method: request.method,\n body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,\n headers: request.headersList.entries,\n maxRedirections: 0,\n upgrade: request.mode === 'websocket' ? 'websocket' : undefined,\n ...(allowH2 === false ? { allowH2 } : null)\n },\n {\n body: null,\n abort: null,\n\n onRequestStart (controller) {\n // TODO (fix): Do we need connection here?\n const { connection } = fetchParams.controller\n\n // Set timingInfo’s final connection timing info to the result of calling clamp and coarsen\n // connection timing info with connection’s timing info, timingInfo’s post-redirect start\n // time, and fetchParams’s cross-origin isolated capability.\n // TODO: implement connection timing\n timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability)\n\n const abort = (reason) => controller.abort(reason)\n\n if (connection.destroyed) {\n abort(new DOMException('The operation was aborted.', 'AbortError'))\n } else {\n fetchParams.controller.on('terminated', abort)\n this.abort = connection.abort = abort\n }\n\n // Set timingInfo’s final network-request start time to the coarsened shared current time given\n // fetchParams’s cross-origin isolated capability.\n timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n },\n\n onResponseStarted () {\n // Set timingInfo’s final network-response start time to the coarsened shared current\n // time given fetchParams’s cross-origin isolated capability, immediately after the\n // user agent’s HTTP parser receives the first byte of the response (e.g., frame header\n // bytes for HTTP/2 or response status line for HTTP/1.x).\n timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n },\n\n onResponseStart (controller, status, _headers, statusText) {\n if (status < 200) {\n return\n }\n\n const rawHeaders = controller?.rawHeaders ?? []\n const headersList = new HeadersList()\n\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i])\n const value = rawHeaders[i + 1]\n if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {\n for (const val of value) {\n headersList.append(nameStr, val.toString('latin1'), true)\n }\n } else {\n headersList.append(nameStr, value.toString('latin1'), true)\n }\n }\n const location = headersList.get('location', true)\n\n this.body = new Readable({ read: () => controller.resume() })\n\n const willFollow = location && request.redirect === 'follow' &&\n redirectStatusSet.has(status)\n\n const decoders = []\n\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding\n if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {\n // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1\n const contentEncoding = headersList.get('content-encoding', true)\n // \"All content-coding values are case-insensitive...\"\n /** @type {string[]} */\n const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []\n\n // Limit the number of content-encodings to prevent resource exhaustion.\n // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).\n const maxContentEncodings = 5\n if (codings.length > maxContentEncodings) {\n reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`))\n return\n }\n\n for (let i = codings.length - 1; i >= 0; --i) {\n const coding = codings[i].trim()\n // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2\n if (coding === 'x-gzip' || coding === 'gzip') {\n decoders.push(zlib.createGunzip({\n // Be less strict when decoding compressed responses, since sometimes\n // servers send slightly invalid responses that are still accepted\n // by common browsers.\n // Always using Z_SYNC_FLUSH is what cURL does.\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n }))\n } else if (coding === 'deflate') {\n decoders.push(createInflate({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n }))\n } else if (coding === 'br') {\n decoders.push(zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n }))\n } else if (coding === 'zstd') {\n decoders.push(zlib.createZstdDecompress({\n flush: zlib.constants.ZSTD_e_continue,\n finishFlush: zlib.constants.ZSTD_e_end\n }))\n } else {\n decoders.length = 0\n break\n }\n }\n }\n\n const onError = (err) => this.onResponseError(controller, err)\n\n resolve({\n status,\n statusText,\n headersList,\n body: decoders.length\n ? pipeline(this.body, ...decoders, (err) => {\n if (err) {\n this.onResponseError(controller, err)\n }\n }).on('error', onError)\n : this.body.on('error', onError)\n })\n },\n\n onResponseData (controller, chunk) {\n if (fetchParams.controller.dump) {\n return\n }\n\n // 1. If one or more bytes have been transmitted from response’s\n // message body, then:\n\n // 1. Let bytes be the transmitted bytes.\n const bytes = chunk\n\n // 2. Let codings be the result of extracting header list values\n // given `Content-Encoding` and response’s header list.\n // See pullAlgorithm.\n\n // 3. Increase timingInfo’s encoded body size by bytes’s length.\n timingInfo.encodedBodySize += bytes.byteLength\n\n // 4. See pullAlgorithm...\n\n if (this.body.push(bytes) === false) {\n controller.pause()\n }\n },\n\n onResponseEnd () {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n fetchParams.controller.ended = true\n\n this.body?.push(null)\n },\n\n onResponseError (_controller, error) {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n if (\n request.mode === 'websocket' &&\n allowH2 !== false &&\n error?.code === 'UND_ERR_INFO' &&\n error?.message === 'HTTP/2: Extended CONNECT protocol not supported by server'\n ) {\n // The origin negotiated H2, but RFC 8441 websocket support is unavailable.\n // Retry the opening handshake on a fresh HTTP/1.1-only connection instead.\n resolve(dispatchWithProtocolPreference(body, false))\n return\n }\n\n this.body?.destroy(error)\n\n fetchParams.controller.terminate(error)\n\n reject(error)\n },\n\n onRequestUpgrade (controller, status, _headers, socket) {\n // We need to support 200 for websocket over h2 as per RFC-8441\n // Absence of session means H1\n if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) {\n return false\n }\n\n const rawHeaders = controller?.rawHeaders ?? []\n const headersList = new HeadersList()\n\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i])\n const value = rawHeaders[i + 1]\n if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {\n for (const val of value) {\n headersList.append(nameStr, val.toString('latin1'), true)\n }\n } else {\n headersList.append(nameStr, value.toString('latin1'), true)\n }\n }\n\n resolve({\n status,\n statusText: STATUS_CODES[status],\n headersList,\n socket\n })\n\n return true\n }\n }\n ))\n }\n }\n}\n\nmodule.exports = {\n fetch,\n Fetch,\n fetching,\n finalizeAndReportTiming\n}\n","'use strict'\n\nconst assert = require('node:assert')\nconst { URLSerializer } = require('../fetch/data-url')\nconst { isValidHeaderName } = require('../fetch/util')\n\n/**\n * @see https://url.spec.whatwg.org/#concept-url-equals\n * @param {URL} A\n * @param {URL} B\n * @param {boolean | undefined} excludeFragment\n * @returns {boolean}\n */\nfunction urlEquals (A, B, excludeFragment = false) {\n const serializedA = URLSerializer(A, excludeFragment)\n\n const serializedB = URLSerializer(B, excludeFragment)\n\n return serializedA === serializedB\n}\n\n/**\n * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262\n * @param {string} header\n */\nfunction getFieldValues (header) {\n assert(header !== null)\n\n const values = []\n\n for (let value of header.split(',')) {\n value = value.trim()\n\n if (isValidHeaderName(value)) {\n values.push(value)\n }\n }\n\n return values\n}\n\nmodule.exports = {\n urlEquals,\n getFieldValues\n}\n","'use strict'\n\nconst assert = require('node:assert')\n\nconst { kConstruct } = require('../../core/symbols')\nconst { urlEquals, getFieldValues } = require('./util')\nconst { kEnumerableProperty, isDisturbed } = require('../../core/util')\nconst { webidl } = require('../webidl')\nconst { cloneResponse, fromInnerResponse, getResponseState } = require('../fetch/response')\nconst { Request, fromInnerRequest, getRequestState } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { urlIsHttpHttpsScheme, readAllBytes } = require('../fetch/util')\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation\n * @typedef {Object} CacheBatchOperation\n * @property {'delete' | 'put'} type\n * @property {any} request\n * @property {any} response\n * @property {import('../../../types/cache').CacheQueryOptions} options\n */\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list\n * @typedef {[any, any][]} requestResponseList\n */\n\nclass Cache {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list\n * @type {requestResponseList}\n */\n #relevantRequestResponseList\n\n constructor () {\n if (arguments[0] !== kConstruct) {\n webidl.illegalConstructor()\n }\n\n webidl.util.markAsUncloneable(this)\n this.#relevantRequestResponseList = arguments[1]\n }\n\n async match (request, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.match'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n const p = this.#internalMatchAll(request, options, 1)\n\n if (p.length === 0) {\n return\n }\n\n return p[0]\n }\n\n async matchAll (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.matchAll'\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n return this.#internalMatchAll(request, options)\n }\n\n async add (request) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.add'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n request = webidl.converters.RequestInfo(request)\n\n // 1.\n const requests = [request]\n\n // 2.\n const responseArrayPromise = this.addAll(requests)\n\n // 3.\n return await responseArrayPromise\n }\n\n async addAll (requests) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.addAll'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n // 1.\n const responsePromises = []\n\n // 2.\n const requestList = []\n\n // 3.\n for (let request of requests) {\n if (request === undefined) {\n throw webidl.errors.conversionFailed({\n prefix,\n argument: 'Argument 1',\n types: ['undefined is not allowed']\n })\n }\n\n request = webidl.converters.RequestInfo(request)\n\n if (typeof request === 'string') {\n continue\n }\n\n // 3.1\n const r = getRequestState(request)\n\n // 3.2\n if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Expected http/s scheme when method is not GET.'\n })\n }\n }\n\n // 4.\n /** @type {ReturnType[]} */\n const fetchControllers = []\n\n // 5.\n for (const request of requests) {\n // 5.1\n const r = getRequestState(new Request(request))\n\n // 5.2\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Expected http/s scheme.'\n })\n }\n\n // 5.4\n r.initiator = 'fetch'\n r.destination = 'subresource'\n\n // 5.5\n requestList.push(r)\n\n // 5.6\n const responsePromise = Promise.withResolvers()\n\n // 5.7\n fetchControllers.push(fetching({\n request: r,\n processResponse (response) {\n // 1.\n if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Received an invalid status code or the request failed.'\n }))\n } else if (response.headersList.contains('vary')) { // 2.\n // 2.1\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n // 2.2\n for (const fieldValue of fieldValues) {\n // 2.2.1\n if (fieldValue === '*') {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'invalid vary field value'\n }))\n\n for (const controller of fetchControllers) {\n controller.abort()\n }\n\n return\n }\n }\n }\n },\n processResponseEndOfBody (response) {\n // 1.\n if (response.aborted) {\n responsePromise.reject(new DOMException('aborted', 'AbortError'))\n return\n }\n\n // 2.\n responsePromise.resolve(response)\n }\n }))\n\n // 5.8\n responsePromises.push(responsePromise.promise)\n }\n\n // 6.\n const p = Promise.all(responsePromises)\n\n // 7.\n const responses = await p\n\n // 7.1\n const operations = []\n\n // 7.2\n let index = 0\n\n // 7.3\n for (const response of responses) {\n // 7.3.1\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 7.3.2\n request: requestList[index], // 7.3.3\n response // 7.3.4\n }\n\n operations.push(operation) // 7.3.5\n\n index++ // 7.3.6\n }\n\n // 7.5\n const cacheJobPromise = Promise.withResolvers()\n\n // 7.6.1\n let errorData = null\n\n // 7.6.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 7.6.3\n queueMicrotask(() => {\n // 7.6.3.1\n if (errorData === null) {\n cacheJobPromise.resolve(undefined)\n } else {\n // 7.6.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n // 7.7\n return cacheJobPromise.promise\n }\n\n async put (request, response) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.put'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n request = webidl.converters.RequestInfo(request)\n response = webidl.converters.Response(response, prefix, 'response')\n\n // 1.\n let innerRequest = null\n\n // 2.\n if (webidl.is.Request(request)) {\n innerRequest = getRequestState(request)\n } else { // 3.\n innerRequest = getRequestState(new Request(request))\n }\n\n // 4.\n if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Expected an http/s scheme when method is not GET'\n })\n }\n\n // 5.\n const innerResponse = getResponseState(response)\n\n // 6.\n if (innerResponse.status === 206) {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Got 206 status'\n })\n }\n\n // 7.\n if (innerResponse.headersList.contains('vary')) {\n // 7.1.\n const fieldValues = getFieldValues(innerResponse.headersList.get('vary'))\n\n // 7.2.\n for (const fieldValue of fieldValues) {\n // 7.2.1\n if (fieldValue === '*') {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Got * vary field value'\n })\n }\n }\n }\n\n // 8.\n if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) {\n throw webidl.errors.exception({\n header: prefix,\n message: 'Response body is locked or disturbed'\n })\n }\n\n // 9.\n const clonedResponse = cloneResponse(innerResponse)\n\n // 10.\n const bodyReadPromise = Promise.withResolvers()\n\n // 11.\n if (innerResponse.body != null) {\n // 11.1\n const stream = innerResponse.body.stream\n\n // 11.2\n const reader = stream.getReader()\n\n // 11.3\n readAllBytes(reader, bodyReadPromise.resolve, bodyReadPromise.reject)\n } else {\n bodyReadPromise.resolve(undefined)\n }\n\n // 12.\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n // 13.\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 14.\n request: innerRequest, // 15.\n response: clonedResponse // 16.\n }\n\n // 17.\n operations.push(operation)\n\n // 19.\n const bytes = await bodyReadPromise.promise\n\n if (clonedResponse.body != null) {\n clonedResponse.body.source = bytes\n }\n\n // 19.1\n const cacheJobPromise = Promise.withResolvers()\n\n // 19.2.1\n let errorData = null\n\n // 19.2.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 19.2.3\n queueMicrotask(() => {\n // 19.2.3.1\n if (errorData === null) {\n cacheJobPromise.resolve()\n } else { // 19.2.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n async delete (request, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.delete'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n /**\n * @type {Request}\n */\n let r = null\n\n if (webidl.is.Request(request)) {\n r = getRequestState(request)\n\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return false\n }\n } else {\n assert(typeof request === 'string')\n\n r = getRequestState(new Request(request))\n }\n\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'delete',\n request: r,\n options\n }\n\n operations.push(operation)\n\n const cacheJobPromise = Promise.withResolvers()\n\n let errorData = null\n let requestResponses\n\n try {\n requestResponses = this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n queueMicrotask(() => {\n if (errorData === null) {\n cacheJobPromise.resolve(!!requestResponses?.length)\n } else {\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys\n * @param {any} request\n * @param {import('../../../types/cache').CacheQueryOptions} options\n * @returns {Promise}\n */\n async keys (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n const prefix = 'Cache.keys'\n\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options, prefix, 'options')\n\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n // 2.1\n if (webidl.is.Request(request)) {\n // 2.1.1\n r = getRequestState(request)\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') { // 2.2\n r = getRequestState(new Request(request))\n }\n }\n\n // 4.\n const promise = Promise.withResolvers()\n\n // 5.\n // 5.1\n const requests = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n // 5.2.1.1\n requests.push(requestResponse[0])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n // 5.3.2.1\n requests.push(requestResponse[0])\n }\n }\n\n // 5.4\n queueMicrotask(() => {\n // 5.4.1\n const requestList = []\n\n // 5.4.2\n for (const request of requests) {\n const requestObject = fromInnerRequest(\n request,\n undefined,\n new AbortController().signal,\n 'immutable'\n )\n // 5.4.2.1\n requestList.push(requestObject)\n }\n\n // 5.4.3\n promise.resolve(Object.freeze(requestList))\n })\n\n return promise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm\n * @param {CacheBatchOperation[]} operations\n * @returns {requestResponseList}\n */\n #batchCacheOperations (operations) {\n // 1.\n const cache = this.#relevantRequestResponseList\n\n // 2.\n const backupCache = [...cache]\n\n // 3.\n const addedItems = []\n\n // 4.1\n const resultList = []\n\n try {\n // 4.2\n for (const operation of operations) {\n // 4.2.1\n if (operation.type !== 'delete' && operation.type !== 'put') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'operation type does not match \"delete\" or \"put\"'\n })\n }\n\n // 4.2.2\n if (operation.type === 'delete' && operation.response != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'delete operation should not have an associated response'\n })\n }\n\n // 4.2.3\n if (this.#queryCache(operation.request, operation.options, addedItems).length) {\n throw new DOMException('???', 'InvalidStateError')\n }\n\n // 4.2.4\n let requestResponses\n\n // 4.2.5\n if (operation.type === 'delete') {\n // 4.2.5.1\n requestResponses = this.#queryCache(operation.request, operation.options)\n\n // TODO: the spec is wrong, this is needed to pass WPTs\n if (requestResponses.length === 0) {\n return []\n }\n\n // 4.2.5.2\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.5.2.1\n cache.splice(idx, 1)\n }\n } else if (operation.type === 'put') { // 4.2.6\n // 4.2.6.1\n if (operation.response == null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'put operation should have an associated response'\n })\n }\n\n // 4.2.6.2\n const r = operation.request\n\n // 4.2.6.3\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'expected http or https scheme'\n })\n }\n\n // 4.2.6.4\n if (r.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'not get method'\n })\n }\n\n // 4.2.6.5\n if (operation.options != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'options must not be defined'\n })\n }\n\n // 4.2.6.6\n requestResponses = this.#queryCache(operation.request)\n\n // 4.2.6.7\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.6.7.1\n cache.splice(idx, 1)\n }\n\n // 4.2.6.8\n cache.push([operation.request, operation.response])\n\n // 4.2.6.10\n addedItems.push([operation.request, operation.response])\n }\n\n // 4.2.7\n resultList.push([operation.request, operation.response])\n }\n\n // 4.3\n return resultList\n } catch (e) { // 5.\n // 5.1\n this.#relevantRequestResponseList.length = 0\n\n // 5.2\n this.#relevantRequestResponseList = backupCache\n\n // 5.3\n throw e\n }\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#query-cache\n * @param {any} requestQuery\n * @param {import('../../../types/cache').CacheQueryOptions} options\n * @param {requestResponseList} targetStorage\n * @returns {requestResponseList}\n */\n #queryCache (requestQuery, options, targetStorage) {\n /** @type {requestResponseList} */\n const resultList = []\n\n const storage = targetStorage ?? this.#relevantRequestResponseList\n\n for (const requestResponse of storage) {\n const [cachedRequest, cachedResponse] = requestResponse\n if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) {\n resultList.push(requestResponse)\n }\n }\n\n return resultList\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm\n * @param {any} requestQuery\n * @param {any} request\n * @param {any | null} response\n * @param {import('../../../types/cache').CacheQueryOptions | undefined} options\n * @returns {boolean}\n */\n #requestMatchesCachedItem (requestQuery, request, response = null, options) {\n // if (options?.ignoreMethod === false && request.method === 'GET') {\n // return false\n // }\n\n const queryURL = new URL(requestQuery.url)\n\n const cachedURL = new URL(request.url)\n\n if (options?.ignoreSearch) {\n cachedURL.search = ''\n\n queryURL.search = ''\n }\n\n if (!urlEquals(queryURL, cachedURL, true)) {\n return false\n }\n\n if (\n response == null ||\n options?.ignoreVary ||\n !response.headersList.contains('vary')\n ) {\n return true\n }\n\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n for (const fieldValue of fieldValues) {\n if (fieldValue === '*') {\n return false\n }\n\n const requestValue = request.headersList.get(fieldValue)\n const queryValue = requestQuery.headersList.get(fieldValue)\n\n // If one has the header and the other doesn't, or one has\n // a different value than the other, return false\n if (requestValue !== queryValue) {\n return false\n }\n }\n\n return true\n }\n\n #internalMatchAll (request, options, maxResponses = Infinity) {\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n if (webidl.is.Request(request)) {\n // 2.1.1\n r = getRequestState(request)\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') {\n // 2.2.1\n r = getRequestState(new Request(request))\n }\n }\n\n // 5.\n // 5.1\n const responses = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n responses.push(requestResponse[1])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n responses.push(requestResponse[1])\n }\n }\n\n // 5.4\n // We don't implement CORs so we don't need to loop over the responses, yay!\n\n // 5.5.1\n const responseList = []\n\n // 5.5.2\n for (const response of responses) {\n // 5.5.2.1\n const responseObject = fromInnerResponse(cloneResponse(response), 'immutable')\n\n responseList.push(responseObject)\n\n if (responseList.length >= maxResponses) {\n break\n }\n }\n\n // 6.\n return Object.freeze(responseList)\n }\n}\n\nObject.defineProperties(Cache.prototype, {\n [Symbol.toStringTag]: {\n value: 'Cache',\n configurable: true\n },\n match: kEnumerableProperty,\n matchAll: kEnumerableProperty,\n add: kEnumerableProperty,\n addAll: kEnumerableProperty,\n put: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nconst cacheQueryOptionConverters = [\n {\n key: 'ignoreSearch',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'ignoreMethod',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'ignoreVary',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n }\n]\n\nwebidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters)\n\nwebidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([\n ...cacheQueryOptionConverters,\n {\n key: 'cacheName',\n converter: webidl.converters.DOMString\n }\n])\n\nwebidl.converters.Response = webidl.interfaceConverter(\n webidl.is.Response,\n 'Response'\n)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.RequestInfo\n)\n\nmodule.exports = {\n Cache\n}\n","'use strict'\n\nconst { Cache } = require('./cache')\nconst { webidl } = require('../webidl')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { kConstruct } = require('../../core/symbols')\n\nclass CacheStorage {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map\n * @type {Map}\n */\n async has (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n\n const prefix = 'CacheStorage.has'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n // 2.1.1\n // 2.2\n return this.#caches.has(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open\n * @param {string} cacheName\n * @returns {Promise}\n */\n async open (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n\n const prefix = 'CacheStorage.open'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n // 2.1\n if (this.#caches.has(cacheName)) {\n // await caches.open('v1') !== await caches.open('v1')\n\n // 2.1.1\n const cache = this.#caches.get(cacheName)\n\n // 2.1.1.1\n return new Cache(kConstruct, cache)\n }\n\n // 2.2\n const cache = []\n\n // 2.3\n this.#caches.set(cacheName, cache)\n\n // 2.4\n return new Cache(kConstruct, cache)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete\n * @param {string} cacheName\n * @returns {Promise}\n */\n async delete (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n\n const prefix = 'CacheStorage.delete'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName')\n\n return this.#caches.delete(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys\n * @returns {Promise}\n */\n async keys () {\n webidl.brandCheck(this, CacheStorage)\n\n // 2.1\n const keys = this.#caches.keys()\n\n // 2.2\n return [...keys]\n }\n}\n\nObject.defineProperties(CacheStorage.prototype, {\n [Symbol.toStringTag]: {\n value: 'CacheStorage',\n configurable: true\n },\n match: kEnumerableProperty,\n has: kEnumerableProperty,\n open: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nmodule.exports = {\n CacheStorage\n}\n","'use strict'\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size\nconst maxAttributeValueSize = 1024\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size\nconst maxNameValuePairSize = 4096\n\nmodule.exports = {\n maxAttributeValueSize,\n maxNameValuePairSize\n}\n","'use strict'\n\n/**\n * @param {string} value\n * @returns {boolean}\n */\nfunction isCTLExcludingHtab (value) {\n for (let i = 0; i < value.length; ++i) {\n const code = value.charCodeAt(i)\n\n if (\n (code >= 0x00 && code <= 0x08) ||\n (code >= 0x0A && code <= 0x1F) ||\n code === 0x7F\n ) {\n return true\n }\n }\n return false\n}\n\n/**\n CHAR = \n token = 1*\n separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n | \",\" | \";\" | \":\" | \"\\\" | <\">\n | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n | \"{\" | \"}\" | SP | HT\n * @param {string} name\n */\nfunction validateCookieName (name) {\n for (let i = 0; i < name.length; ++i) {\n const code = name.charCodeAt(i)\n\n if (\n code < 0x21 || // exclude CTLs (0-31), SP and HT\n code > 0x7E || // exclude non-ascii and DEL\n code === 0x22 || // \"\n code === 0x28 || // (\n code === 0x29 || // )\n code === 0x3C || // <\n code === 0x3E || // >\n code === 0x40 || // @\n code === 0x2C || // ,\n code === 0x3B || // ;\n code === 0x3A || // :\n code === 0x5C || // \\\n code === 0x2F || // /\n code === 0x5B || // [\n code === 0x5D || // ]\n code === 0x3F || // ?\n code === 0x3D || // =\n code === 0x7B || // {\n code === 0x7D // }\n ) {\n throw new Error('Invalid cookie name')\n }\n }\n}\n\n/**\n cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n ; US-ASCII characters excluding CTLs,\n ; whitespace DQUOTE, comma, semicolon,\n ; and backslash\n * @param {string} value\n */\nfunction validateCookieValue (value) {\n let len = value.length\n let i = 0\n\n // if the value is wrapped in DQUOTE\n if (value[0] === '\"') {\n if (len === 1 || value[len - 1] !== '\"') {\n throw new Error('Invalid cookie value')\n }\n --len\n ++i\n }\n\n while (i < len) {\n const code = value.charCodeAt(i++)\n\n if (\n code < 0x21 || // exclude CTLs (0-31)\n code > 0x7E || // non-ascii and DEL (127)\n code === 0x22 || // \"\n code === 0x2C || // ,\n code === 0x3B || // ;\n code === 0x5C // \\\n ) {\n throw new Error('Invalid cookie value')\n }\n }\n}\n\n/**\n * path-value = \n * @param {string} path\n */\nfunction validateCookiePath (path) {\n for (let i = 0; i < path.length; ++i) {\n const code = path.charCodeAt(i)\n\n if (\n code < 0x20 || // exclude CTLs (0-31)\n code === 0x7F || // DEL\n code === 0x3B // ;\n ) {\n throw new Error('Invalid cookie path')\n }\n }\n}\n\n/**\n * I have no idea why these values aren't allowed to be honest,\n * but Deno tests these. - Khafra\n * @param {string} domain\n */\nfunction validateCookieDomain (domain) {\n if (\n domain.startsWith('-') ||\n domain.endsWith('.') ||\n domain.endsWith('-')\n ) {\n throw new Error('Invalid cookie domain')\n }\n}\n\nconst IMFDays = [\n 'Sun', 'Mon', 'Tue', 'Wed',\n 'Thu', 'Fri', 'Sat'\n]\n\nconst IMFMonths = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n]\n\nconst IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0'))\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1\n * @param {number|Date} date\n IMF-fixdate = day-name \",\" SP date1 SP time-of-day SP GMT\n ; fixed length/zone/capitalization subset of the format\n ; see Section 3.3 of [RFC5322]\n\n day-name = %x4D.6F.6E ; \"Mon\", case-sensitive\n / %x54.75.65 ; \"Tue\", case-sensitive\n / %x57.65.64 ; \"Wed\", case-sensitive\n / %x54.68.75 ; \"Thu\", case-sensitive\n / %x46.72.69 ; \"Fri\", case-sensitive\n / %x53.61.74 ; \"Sat\", case-sensitive\n / %x53.75.6E ; \"Sun\", case-sensitive\n date1 = day SP month SP year\n ; e.g., 02 Jun 1982\n\n day = 2DIGIT\n month = %x4A.61.6E ; \"Jan\", case-sensitive\n / %x46.65.62 ; \"Feb\", case-sensitive\n / %x4D.61.72 ; \"Mar\", case-sensitive\n / %x41.70.72 ; \"Apr\", case-sensitive\n / %x4D.61.79 ; \"May\", case-sensitive\n / %x4A.75.6E ; \"Jun\", case-sensitive\n / %x4A.75.6C ; \"Jul\", case-sensitive\n / %x41.75.67 ; \"Aug\", case-sensitive\n / %x53.65.70 ; \"Sep\", case-sensitive\n / %x4F.63.74 ; \"Oct\", case-sensitive\n / %x4E.6F.76 ; \"Nov\", case-sensitive\n / %x44.65.63 ; \"Dec\", case-sensitive\n year = 4DIGIT\n\n GMT = %x47.4D.54 ; \"GMT\", case-sensitive\n\n time-of-day = hour \":\" minute \":\" second\n ; 00:00:00 - 23:59:60 (leap second)\n\n hour = 2DIGIT\n minute = 2DIGIT\n second = 2DIGIT\n */\nfunction toIMFDate (date) {\n if (typeof date === 'number') {\n date = new Date(date)\n }\n\n return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`\n}\n\n/**\n max-age-av = \"Max-Age=\" non-zero-digit *DIGIT\n ; In practice, both expires-av and max-age-av\n ; are limited to dates representable by the\n ; user agent.\n * @param {number} maxAge\n */\nfunction validateCookieMaxAge (maxAge) {\n if (maxAge < 0) {\n throw new Error('Invalid cookie max-age')\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1\n * @param {import('./index').Cookie} cookie\n */\nfunction stringify (cookie) {\n if (cookie.name.length === 0) {\n return null\n }\n\n validateCookieName(cookie.name)\n validateCookieValue(cookie.value)\n\n const out = [`${cookie.name}=${cookie.value}`]\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2\n if (cookie.name.startsWith('__Secure-')) {\n cookie.secure = true\n }\n\n if (cookie.name.startsWith('__Host-')) {\n cookie.secure = true\n cookie.domain = null\n cookie.path = '/'\n }\n\n if (cookie.secure) {\n out.push('Secure')\n }\n\n if (cookie.httpOnly) {\n out.push('HttpOnly')\n }\n\n if (typeof cookie.maxAge === 'number') {\n validateCookieMaxAge(cookie.maxAge)\n out.push(`Max-Age=${cookie.maxAge}`)\n }\n\n if (cookie.domain) {\n validateCookieDomain(cookie.domain)\n out.push(`Domain=${cookie.domain}`)\n }\n\n if (cookie.path) {\n validateCookiePath(cookie.path)\n out.push(`Path=${cookie.path}`)\n }\n\n if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') {\n out.push(`Expires=${toIMFDate(cookie.expires)}`)\n }\n\n if (cookie.sameSite) {\n out.push(`SameSite=${cookie.sameSite}`)\n }\n\n for (const part of cookie.unparsed) {\n if (!part.includes('=')) {\n throw new Error('Invalid unparsed')\n }\n\n const [key, ...value] = part.split('=')\n\n out.push(`${key.trim()}=${value.join('=')}`)\n }\n\n return out.join('; ')\n}\n\nmodule.exports = {\n isCTLExcludingHtab,\n validateCookieName,\n validateCookiePath,\n validateCookieValue,\n toIMFDate,\n stringify\n}\n","'use strict'\n\nconst { collectASequenceOfCodePointsFast } = require('../infra')\nconst { maxNameValuePairSize, maxAttributeValueSize } = require('./constants')\nconst { isCTLExcludingHtab } = require('./util')\nconst assert = require('node:assert')\nconst { unescape: qsUnescape } = require('node:querystring')\n\n/**\n * @description Parses the field-value attributes of a set-cookie header string.\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} header\n * @returns {import('./index').Cookie|null} if the header is invalid, null will be returned\n */\nfunction parseSetCookie (header) {\n // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F\n // character (CTL characters excluding HTAB): Abort these steps and\n // ignore the set-cookie-string entirely.\n if (isCTLExcludingHtab(header)) {\n return null\n }\n\n let nameValuePair = ''\n let unparsedAttributes = ''\n let name = ''\n let value = ''\n\n // 2. If the set-cookie-string contains a %x3B (\";\") character:\n if (header.includes(';')) {\n // 1. The name-value-pair string consists of the characters up to,\n // but not including, the first %x3B (\";\"), and the unparsed-\n // attributes consist of the remainder of the set-cookie-string\n // (including the %x3B (\";\") in question).\n const position = { position: 0 }\n\n nameValuePair = collectASequenceOfCodePointsFast(';', header, position)\n unparsedAttributes = header.slice(position.position)\n } else {\n // Otherwise:\n\n // 1. The name-value-pair string consists of all the characters\n // contained in the set-cookie-string, and the unparsed-\n // attributes is the empty string.\n nameValuePair = header\n }\n\n // 3. If the name-value-pair string lacks a %x3D (\"=\") character, then\n // the name string is empty, and the value string is the value of\n // name-value-pair.\n if (!nameValuePair.includes('=')) {\n value = nameValuePair\n } else {\n // Otherwise, the name string consists of the characters up to, but\n // not including, the first %x3D (\"=\") character, and the (possibly\n // empty) value string consists of the characters after the first\n // %x3D (\"=\") character.\n const position = { position: 0 }\n name = collectASequenceOfCodePointsFast(\n '=',\n nameValuePair,\n position\n )\n value = nameValuePair.slice(position.position + 1)\n }\n\n // 4. Remove any leading or trailing WSP characters from the name\n // string and the value string.\n name = name.trim()\n value = value.trim()\n\n // 5. If the sum of the lengths of the name string and the value string\n // is more than 4096 octets, abort these steps and ignore the set-\n // cookie-string entirely.\n if (name.length + value.length > maxNameValuePairSize) {\n return null\n }\n\n // 6. The cookie-name is the name string, and the cookie-value is the\n // value string.\n // https://datatracker.ietf.org/doc/html/rfc6265\n // To maximize compatibility with user agents, servers that wish to\n // store arbitrary data in a cookie-value SHOULD encode that data, for\n // example, using Base64 [RFC4648].\n return {\n name, value: qsUnescape(value), ...parseUnparsedAttributes(unparsedAttributes)\n }\n}\n\n/**\n * Parses the remaining attributes of a set-cookie header\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} unparsedAttributes\n * @param {Object.} [cookieAttributeList={}]\n */\nfunction parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {\n // 1. If the unparsed-attributes string is empty, skip the rest of\n // these steps.\n if (unparsedAttributes.length === 0) {\n return cookieAttributeList\n }\n\n // 2. Discard the first character of the unparsed-attributes (which\n // will be a %x3B (\";\") character).\n assert(unparsedAttributes[0] === ';')\n unparsedAttributes = unparsedAttributes.slice(1)\n\n let cookieAv = ''\n\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n if (unparsedAttributes.includes(';')) {\n // 1. Consume the characters of the unparsed-attributes up to, but\n // not including, the first %x3B (\";\") character.\n cookieAv = collectASequenceOfCodePointsFast(\n ';',\n unparsedAttributes,\n { position: 0 }\n )\n unparsedAttributes = unparsedAttributes.slice(cookieAv.length)\n } else {\n // Otherwise:\n\n // 1. Consume the remainder of the unparsed-attributes.\n cookieAv = unparsedAttributes\n unparsedAttributes = ''\n }\n\n // Let the cookie-av string be the characters consumed in this step.\n\n let attributeName = ''\n let attributeValue = ''\n\n // 4. If the cookie-av string contains a %x3D (\"=\") character:\n if (cookieAv.includes('=')) {\n // 1. The (possibly empty) attribute-name string consists of the\n // characters up to, but not including, the first %x3D (\"=\")\n // character, and the (possibly empty) attribute-value string\n // consists of the characters after the first %x3D (\"=\")\n // character.\n const position = { position: 0 }\n\n attributeName = collectASequenceOfCodePointsFast(\n '=',\n cookieAv,\n position\n )\n attributeValue = cookieAv.slice(position.position + 1)\n } else {\n // Otherwise:\n\n // 1. The attribute-name string consists of the entire cookie-av\n // string, and the attribute-value string is empty.\n attributeName = cookieAv\n }\n\n // 5. Remove any leading or trailing WSP characters from the attribute-\n // name string and the attribute-value string.\n attributeName = attributeName.trim()\n attributeValue = attributeValue.trim()\n\n // 6. If the attribute-value is longer than 1024 octets, ignore the\n // cookie-av string and return to Step 1 of this algorithm.\n if (attributeValue.length > maxAttributeValueSize) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 7. Process the attribute-name and attribute-value according to the\n // requirements in the following subsections. (Notice that\n // attributes with unrecognized attribute-names are ignored.)\n const attributeNameLowercase = attributeName.toLowerCase()\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1\n // If the attribute-name case-insensitively matches the string\n // \"Expires\", the user agent MUST process the cookie-av as follows.\n if (attributeNameLowercase === 'expires') {\n // 1. Let the expiry-time be the result of parsing the attribute-value\n // as cookie-date (see Section 5.1.1).\n const expiryTime = new Date(attributeValue)\n\n // 2. If the attribute-value failed to parse as a cookie date, ignore\n // the cookie-av.\n\n cookieAttributeList.expires = expiryTime\n } else if (attributeNameLowercase === 'max-age') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2\n // If the attribute-name case-insensitively matches the string \"Max-\n // Age\", the user agent MUST process the cookie-av as follows.\n\n // 1. If the first character of the attribute-value is not a DIGIT or a\n // \"-\" character, ignore the cookie-av.\n const charCode = attributeValue.charCodeAt(0)\n\n if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 2. If the remainder of attribute-value contains a non-DIGIT\n // character, ignore the cookie-av.\n if (!/^\\d+$/.test(attributeValue)) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 3. Let delta-seconds be the attribute-value converted to an integer.\n const deltaSeconds = Number(attributeValue)\n\n // 4. Let cookie-age-limit be the maximum age of the cookie (which\n // SHOULD be 400 days or less, see Section 4.1.2.2).\n\n // 5. Set delta-seconds to the smaller of its present value and cookie-\n // age-limit.\n // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)\n\n // 6. If delta-seconds is less than or equal to zero (0), let expiry-\n // time be the earliest representable date and time. Otherwise, let\n // the expiry-time be the current date and time plus delta-seconds\n // seconds.\n // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds\n\n // 7. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Max-Age and an attribute-value of expiry-time.\n cookieAttributeList.maxAge = deltaSeconds\n } else if (attributeNameLowercase === 'domain') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3\n // If the attribute-name case-insensitively matches the string \"Domain\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. Let cookie-domain be the attribute-value.\n let cookieDomain = attributeValue\n\n // 2. If cookie-domain starts with %x2E (\".\"), let cookie-domain be\n // cookie-domain without its leading %x2E (\".\").\n if (cookieDomain[0] === '.') {\n cookieDomain = cookieDomain.slice(1)\n }\n\n // 3. Convert the cookie-domain to lower case.\n cookieDomain = cookieDomain.toLowerCase()\n\n // 4. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Domain and an attribute-value of cookie-domain.\n cookieAttributeList.domain = cookieDomain\n } else if (attributeNameLowercase === 'path') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4\n // If the attribute-name case-insensitively matches the string \"Path\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. If the attribute-value is empty or if the first character of the\n // attribute-value is not %x2F (\"/\"):\n let cookiePath = ''\n if (attributeValue.length === 0 || attributeValue[0] !== '/') {\n // 1. Let cookie-path be the default-path.\n cookiePath = '/'\n } else {\n // Otherwise:\n\n // 1. Let cookie-path be the attribute-value.\n cookiePath = attributeValue\n }\n\n // 2. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Path and an attribute-value of cookie-path.\n cookieAttributeList.path = cookiePath\n } else if (attributeNameLowercase === 'secure') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5\n // If the attribute-name case-insensitively matches the string \"Secure\",\n // the user agent MUST append an attribute to the cookie-attribute-list\n // with an attribute-name of Secure and an empty attribute-value.\n\n cookieAttributeList.secure = true\n } else if (attributeNameLowercase === 'httponly') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6\n // If the attribute-name case-insensitively matches the string\n // \"HttpOnly\", the user agent MUST append an attribute to the cookie-\n // attribute-list with an attribute-name of HttpOnly and an empty\n // attribute-value.\n\n cookieAttributeList.httpOnly = true\n } else if (attributeNameLowercase === 'samesite') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7\n // If the attribute-name case-insensitively matches the string\n // \"SameSite\", the user agent MUST process the cookie-av as follows:\n\n // 1. Let enforcement be \"Default\".\n let enforcement = 'Default'\n\n const attributeValueLowercase = attributeValue.toLowerCase()\n // 2. If cookie-av's attribute-value is a case-insensitive match for\n // \"None\", set enforcement to \"None\".\n if (attributeValueLowercase.includes('none')) {\n enforcement = 'None'\n }\n\n // 3. If cookie-av's attribute-value is a case-insensitive match for\n // \"Strict\", set enforcement to \"Strict\".\n if (attributeValueLowercase.includes('strict')) {\n enforcement = 'Strict'\n }\n\n // 4. If cookie-av's attribute-value is a case-insensitive match for\n // \"Lax\", set enforcement to \"Lax\".\n if (attributeValueLowercase.includes('lax')) {\n enforcement = 'Lax'\n }\n\n // 5. Append an attribute to the cookie-attribute-list with an\n // attribute-name of \"SameSite\" and an attribute-value of\n // enforcement.\n cookieAttributeList.sameSite = enforcement\n } else {\n cookieAttributeList.unparsed ??= []\n\n cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)\n }\n\n // 8. Return to Step 1 of this algorithm.\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n}\n\nmodule.exports = {\n parseSetCookie,\n parseUnparsedAttributes\n}\n","'use strict'\n\nconst { parseSetCookie } = require('./parse')\nconst { stringify } = require('./util')\nconst { webidl } = require('../webidl')\nconst { Headers } = require('../fetch/headers')\n\nconst brandChecks = webidl.brandCheckMultiple([Headers, globalThis.Headers].filter(Boolean))\n\n/**\n * @typedef {Object} Cookie\n * @property {string} name\n * @property {string} value\n * @property {Date|number} [expires]\n * @property {number} [maxAge]\n * @property {string} [domain]\n * @property {string} [path]\n * @property {boolean} [secure]\n * @property {boolean} [httpOnly]\n * @property {'Strict'|'Lax'|'None'} [sameSite]\n * @property {string[]} [unparsed]\n */\n\n/**\n * @param {Headers} headers\n * @returns {Record}\n */\nfunction getCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, 'getCookies')\n\n brandChecks(headers)\n\n const cookie = headers.get('cookie')\n\n /** @type {Record} */\n const out = {}\n\n if (!cookie) {\n return out\n }\n\n for (const piece of cookie.split(';')) {\n const [name, ...value] = piece.split('=')\n\n out[name.trim()] = value.join('=')\n }\n\n return out\n}\n\n/**\n * @param {Headers} headers\n * @param {string} name\n * @param {{ path?: string, domain?: string }|undefined} attributes\n * @returns {void}\n */\nfunction deleteCookie (headers, name, attributes) {\n brandChecks(headers)\n\n const prefix = 'deleteCookie'\n webidl.argumentLengthCheck(arguments, 2, prefix)\n\n name = webidl.converters.DOMString(name, prefix, 'name')\n attributes = webidl.converters.DeleteCookieAttributes(attributes)\n\n // Matches behavior of\n // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278\n setCookie(headers, {\n name,\n value: '',\n expires: new Date(0),\n ...attributes\n })\n}\n\n/**\n * @param {Headers} headers\n * @returns {Cookie[]}\n */\nfunction getSetCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, 'getSetCookies')\n\n brandChecks(headers)\n\n const cookies = headers.getSetCookie()\n\n if (!cookies) {\n return []\n }\n\n return cookies.map((pair) => parseSetCookie(pair))\n}\n\n/**\n * Parses a cookie string\n * @param {string} cookie\n */\nfunction parseCookie (cookie) {\n cookie = webidl.converters.DOMString(cookie)\n\n return parseSetCookie(cookie)\n}\n\n/**\n * @param {Headers} headers\n * @param {Cookie} cookie\n * @returns {void}\n */\nfunction setCookie (headers, cookie) {\n webidl.argumentLengthCheck(arguments, 2, 'setCookie')\n\n brandChecks(headers)\n\n cookie = webidl.converters.Cookie(cookie)\n\n const str = stringify(cookie)\n\n if (str) {\n headers.append('set-cookie', str, true)\n }\n}\n\nwebidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: () => null\n }\n])\n\nwebidl.converters.Cookie = webidl.dictionaryConverter([\n {\n converter: webidl.converters.DOMString,\n key: 'name'\n },\n {\n converter: webidl.converters.DOMString,\n key: 'value'\n },\n {\n converter: webidl.nullableConverter((value) => {\n if (typeof value === 'number') {\n return webidl.converters['unsigned long long'](value)\n }\n\n return new Date(value)\n }),\n key: 'expires',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters['long long']),\n key: 'maxAge',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'secure',\n defaultValue: () => null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'httpOnly',\n defaultValue: () => null\n },\n {\n converter: webidl.converters.USVString,\n key: 'sameSite',\n allowedValues: ['Strict', 'Lax', 'None']\n },\n {\n converter: webidl.sequenceConverter(webidl.converters.DOMString),\n key: 'unparsed',\n defaultValue: () => []\n }\n])\n\nmodule.exports = {\n getCookies,\n deleteCookie,\n getSetCookies,\n setCookie,\n parseCookie\n}\n","'use strict'\n\nconst { webidl } = require('../webidl')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { kConstruct } = require('../../core/symbols')\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n */\nclass MessageEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n if (type === kConstruct) {\n super(arguments[1], arguments[2])\n webidl.util.markAsUncloneable(this)\n return\n }\n\n const prefix = 'MessageEvent constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n type = webidl.converters.DOMString(type, prefix, 'type')\n eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, 'eventInitDict')\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n webidl.util.markAsUncloneable(this)\n }\n\n get data () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.data\n }\n\n get origin () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.origin\n }\n\n get lastEventId () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.lastEventId\n }\n\n get source () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.source\n }\n\n get ports () {\n webidl.brandCheck(this, MessageEvent)\n\n if (!Object.isFrozen(this.#eventInit.ports)) {\n Object.freeze(this.#eventInit.ports)\n }\n\n return this.#eventInit.ports\n }\n\n initMessageEvent (\n type,\n bubbles = false,\n cancelable = false,\n data = null,\n origin = '',\n lastEventId = '',\n source = null,\n ports = []\n ) {\n webidl.brandCheck(this, MessageEvent)\n\n webidl.argumentLengthCheck(arguments, 1, 'MessageEvent.initMessageEvent')\n\n return new MessageEvent(type, {\n bubbles, cancelable, data, origin, lastEventId, source, ports\n })\n }\n\n static createFastMessageEvent (type, init) {\n const messageEvent = new MessageEvent(kConstruct, type, init)\n messageEvent.#eventInit = init\n messageEvent.#eventInit.data ??= null\n messageEvent.#eventInit.origin ??= ''\n messageEvent.#eventInit.lastEventId ??= ''\n messageEvent.#eventInit.source ??= null\n messageEvent.#eventInit.ports ??= []\n return messageEvent\n }\n}\n\nconst { createFastMessageEvent } = MessageEvent\ndelete MessageEvent.createFastMessageEvent\n\n/**\n * @see https://websockets.spec.whatwg.org/#the-closeevent-interface\n */\nclass CloseEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n const prefix = 'CloseEvent constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n type = webidl.converters.DOMString(type, prefix, 'type')\n eventInitDict = webidl.converters.CloseEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n webidl.util.markAsUncloneable(this)\n }\n\n get wasClean () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.wasClean\n }\n\n get code () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.code\n }\n\n get reason () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.reason\n }\n}\n\n// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\nclass ErrorEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict) {\n const prefix = 'ErrorEvent constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n super(type, eventInitDict)\n webidl.util.markAsUncloneable(this)\n\n type = webidl.converters.DOMString(type, prefix, 'type')\n eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})\n\n this.#eventInit = eventInitDict\n }\n\n get message () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.message\n }\n\n get filename () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.filename\n }\n\n get lineno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.lineno\n }\n\n get colno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.colno\n }\n\n get error () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.error\n }\n}\n\nObject.defineProperties(MessageEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'MessageEvent',\n configurable: true\n },\n data: kEnumerableProperty,\n origin: kEnumerableProperty,\n lastEventId: kEnumerableProperty,\n source: kEnumerableProperty,\n ports: kEnumerableProperty,\n initMessageEvent: kEnumerableProperty\n})\n\nObject.defineProperties(CloseEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'CloseEvent',\n configurable: true\n },\n reason: kEnumerableProperty,\n code: kEnumerableProperty,\n wasClean: kEnumerableProperty\n})\n\nObject.defineProperties(ErrorEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'ErrorEvent',\n configurable: true\n },\n message: kEnumerableProperty,\n filename: kEnumerableProperty,\n lineno: kEnumerableProperty,\n colno: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\nwebidl.converters.MessagePort = webidl.interfaceConverter(\n webidl.is.MessagePort,\n 'MessagePort'\n)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.MessagePort\n)\n\nconst eventInit = [\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n }\n]\n\nwebidl.converters.MessageEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'data',\n converter: webidl.converters.any,\n defaultValue: () => null\n },\n {\n key: 'origin',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n },\n {\n key: 'lastEventId',\n converter: webidl.converters.DOMString,\n defaultValue: () => ''\n },\n {\n key: 'source',\n // Node doesn't implement WindowProxy or ServiceWorker, so the only\n // valid value for source is a MessagePort.\n converter: webidl.nullableConverter(webidl.converters.MessagePort),\n defaultValue: () => null\n },\n {\n key: 'ports',\n converter: webidl.converters['sequence'],\n defaultValue: () => []\n }\n])\n\nwebidl.converters.CloseEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'wasClean',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'code',\n converter: webidl.converters['unsigned short'],\n defaultValue: () => 0\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n }\n])\n\nwebidl.converters.ErrorEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'message',\n converter: webidl.converters.DOMString,\n defaultValue: () => ''\n },\n {\n key: 'filename',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n },\n {\n key: 'lineno',\n converter: webidl.converters['unsigned long'],\n defaultValue: () => 0\n },\n {\n key: 'colno',\n converter: webidl.converters['unsigned long'],\n defaultValue: () => 0\n },\n {\n key: 'error',\n converter: webidl.converters.any\n }\n])\n\nmodule.exports = {\n MessageEvent,\n CloseEvent,\n ErrorEvent,\n createFastMessageEvent\n}\n","'use strict'\n\n/**\n * This is a Globally Unique Identifier unique used to validate that the\n * endpoint accepts websocket connections.\n * @see https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3\n * @type {'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'}\n */\nconst uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'\n\n/**\n * @type {PropertyDescriptor}\n */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\n/**\n * The states of the WebSocket connection.\n *\n * @readonly\n * @enum\n * @property {0} CONNECTING\n * @property {1} OPEN\n * @property {2} CLOSING\n * @property {3} CLOSED\n */\nconst states = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3\n}\n\n/**\n * @readonly\n * @enum\n * @property {0} NOT_SENT\n * @property {1} PROCESSING\n * @property {2} SENT\n */\nconst sentCloseFrameState = {\n SENT: 1,\n RECEIVED: 2\n}\n\n/**\n * The WebSocket opcodes.\n *\n * @readonly\n * @enum\n * @property {0x0} CONTINUATION\n * @property {0x1} TEXT\n * @property {0x2} BINARY\n * @property {0x8} CLOSE\n * @property {0x9} PING\n * @property {0xA} PONG\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n */\nconst opcodes = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n CLOSE: 0x8,\n PING: 0x9,\n PONG: 0xA\n}\n\n/**\n * The maximum value for an unsigned 16-bit integer.\n *\n * @type {65535} 2 ** 16 - 1\n */\nconst maxUnsigned16Bit = 65535\n\n/**\n * The states of the parser.\n *\n * @readonly\n * @enum\n * @property {0} INFO\n * @property {2} PAYLOADLENGTH_16\n * @property {3} PAYLOADLENGTH_64\n * @property {4} READ_DATA\n */\nconst parserStates = {\n INFO: 0,\n PAYLOADLENGTH_16: 2,\n PAYLOADLENGTH_64: 3,\n READ_DATA: 4\n}\n\n/**\n * An empty buffer.\n *\n * @type {Buffer}\n */\nconst emptyBuffer = Buffer.allocUnsafe(0)\n\n/**\n * @readonly\n * @property {1} text\n * @property {2} typedArray\n * @property {3} arrayBuffer\n * @property {4} blob\n */\nconst sendHints = {\n text: 1,\n typedArray: 2,\n arrayBuffer: 3,\n blob: 4\n}\n\nmodule.exports = {\n uid,\n sentCloseFrameState,\n staticPropertyDescriptors,\n states,\n opcodes,\n maxUnsigned16Bit,\n parserStates,\n emptyBuffer,\n sendHints\n}\n","'use strict'\n\nconst { states, opcodes } = require('./constants')\nconst { isUtf8 } = require('node:buffer')\nconst { removeHTTPWhitespace } = require('../fetch/data-url')\nconst { collectASequenceOfCodePointsFast } = require('../infra')\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isConnecting (readyState) {\n // If the WebSocket connection is not yet established, and the connection\n // is not yet closed, then the WebSocket connection is in the CONNECTING state.\n return readyState === states.CONNECTING\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isEstablished (readyState) {\n // If the server's response is validated as provided for above, it is\n // said that _The WebSocket Connection is Established_ and that the\n // WebSocket Connection is in the OPEN state.\n return readyState === states.OPEN\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isClosing (readyState) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n return readyState === states.CLOSING\n}\n\n/**\n * @param {number} readyState\n * @returns {boolean}\n */\nfunction isClosed (readyState) {\n return readyState === states.CLOSED\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e\n * @param {EventTarget} target\n * @param {(...args: ConstructorParameters) => Event} eventFactory\n * @param {EventInit | undefined} eventInitDict\n * @returns {void}\n */\nfunction fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) {\n // 1. If eventConstructor is not given, then let eventConstructor be Event.\n\n // 2. Let event be the result of creating an event given eventConstructor,\n // in the relevant realm of target.\n // 3. Initialize event’s type attribute to e.\n const event = eventFactory(e, eventInitDict)\n\n // 4. Initialize any other IDL attributes of event as described in the\n // invocation of this algorithm.\n\n // 5. Return the result of dispatching event at target, with legacy target\n // override flag set if set.\n target.dispatchEvent(event)\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @param {import('./websocket').Handler} handler\n * @param {number} type Opcode\n * @param {Buffer} data application data\n * @returns {void}\n */\nfunction websocketMessageReceived (handler, type, data) {\n handler.onMessage(type, data)\n}\n\n/**\n * @param {Buffer} buffer\n * @returns {ArrayBuffer}\n */\nfunction toArrayBuffer (buffer) {\n if (buffer.byteLength === buffer.buffer.byteLength) {\n return buffer.buffer\n }\n return new Uint8Array(buffer).buffer\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455\n * @see https://datatracker.ietf.org/doc/html/rfc2616\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407\n * @param {string} protocol\n * @returns {boolean}\n */\nfunction isValidSubprotocol (protocol) {\n // If present, this value indicates one\n // or more comma-separated subprotocol the client wishes to speak,\n // ordered by preference. The elements that comprise this value\n // MUST be non-empty strings with characters in the range U+0021 to\n // U+007E not including separator characters as defined in\n // [RFC2616] and MUST all be unique strings.\n if (protocol.length === 0) {\n return false\n }\n\n for (let i = 0; i < protocol.length; ++i) {\n const code = protocol.charCodeAt(i)\n\n if (\n code < 0x21 || // CTL, contains SP (0x20) and HT (0x09)\n code > 0x7E ||\n code === 0x22 || // \"\n code === 0x28 || // (\n code === 0x29 || // )\n code === 0x2C || // ,\n code === 0x2F || // /\n code === 0x3A || // :\n code === 0x3B || // ;\n code === 0x3C || // <\n code === 0x3D || // =\n code === 0x3E || // >\n code === 0x3F || // ?\n code === 0x40 || // @\n code === 0x5B || // [\n code === 0x5C || // \\\n code === 0x5D || // ]\n code === 0x7B || // {\n code === 0x7D // }\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4\n * @param {number} code\n * @returns {boolean}\n */\nfunction isValidStatusCode (code) {\n if (code >= 1000 && code < 1015) {\n return (\n code !== 1004 && // reserved\n code !== 1005 && // \"MUST NOT be set as a status code\"\n code !== 1006 // \"MUST NOT be set as a status code\"\n )\n }\n\n return code >= 3000 && code <= 4999\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isControlFrame (opcode) {\n return (\n opcode === opcodes.CLOSE ||\n opcode === opcodes.PING ||\n opcode === opcodes.PONG\n )\n}\n\n/**\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isContinuationFrame (opcode) {\n return opcode === opcodes.CONTINUATION\n}\n\n/**\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isTextBinaryFrame (opcode) {\n return opcode === opcodes.TEXT || opcode === opcodes.BINARY\n}\n\n/**\n *\n * @param {number} opcode\n * @returns {boolean}\n */\nfunction isValidOpcode (opcode) {\n return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode)\n}\n\n/**\n * Parses a Sec-WebSocket-Extensions header value.\n * @param {string} extensions\n * @returns {Map}\n */\n// TODO(@Uzlopak, @KhafraDev): make compliant https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\nfunction parseExtensions (extensions) {\n const position = { position: 0 }\n const extensionList = new Map()\n\n while (position.position < extensions.length) {\n const pair = collectASequenceOfCodePointsFast(';', extensions, position)\n const [name, value = ''] = pair.split('=', 2)\n\n extensionList.set(\n removeHTTPWhitespace(name, true, false),\n removeHTTPWhitespace(value, false, true)\n )\n\n position.position++\n }\n\n return extensionList\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2\n * @description \"client-max-window-bits = 1*DIGIT\"\n * @param {string} value\n * @returns {boolean}\n */\nfunction isValidClientWindowBits (value) {\n // Must have at least one character\n if (value.length === 0) {\n return false\n }\n\n // Check all characters are ASCII digits\n for (let i = 0; i < value.length; i++) {\n const byte = value.charCodeAt(i)\n\n if (byte < 0x30 || byte > 0x39) {\n return false\n }\n }\n\n // Check numeric range: zlib requires windowBits in range 8-15\n const num = Number.parseInt(value, 10)\n return num >= 8 && num <= 15\n}\n\n/**\n * @see https://whatpr.org/websockets/48/7b748d3...d5570f3.html#get-a-url-record\n * @param {string} url\n * @param {string} [baseURL]\n */\nfunction getURLRecord (url, baseURL) {\n // 1. Let urlRecord be the result of applying the URL parser to url with baseURL .\n // 2. If urlRecord is failure, then throw a \" SyntaxError \" DOMException .\n let urlRecord\n\n try {\n urlRecord = new URL(url, baseURL)\n } catch (e) {\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 3. If urlRecord ’s scheme is \" http \", then set urlRecord ’s scheme to \" ws \".\n // 4. Otherwise, if urlRecord ’s scheme is \" https \", set urlRecord ’s scheme to \" wss \".\n if (urlRecord.protocol === 'http:') {\n urlRecord.protocol = 'ws:'\n } else if (urlRecord.protocol === 'https:') {\n urlRecord.protocol = 'wss:'\n }\n\n // 5. If urlRecord ’s scheme is not \" ws \" or \" wss \", then throw a \" SyntaxError \" DOMException .\n if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {\n throw new DOMException('expected a ws: or wss: url', 'SyntaxError')\n }\n\n // If urlRecord ’s fragment is non-null, then throw a \" SyntaxError \" DOMException .\n if (urlRecord.hash.length || urlRecord.href.endsWith('#')) {\n throw new DOMException('hash', 'SyntaxError')\n }\n\n // Return urlRecord .\n return urlRecord\n}\n\n// https://whatpr.org/websockets/48.html#validate-close-code-and-reason\nfunction validateCloseCodeAndReason (code, reason) {\n // 1. If code is not null, but is neither an integer equal to\n // 1000 nor an integer in the range 3000 to 4999, inclusive,\n // throw an \"InvalidAccessError\" DOMException.\n if (code !== null) {\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new DOMException('invalid code', 'InvalidAccessError')\n }\n }\n\n // 2. If reason is not null, then:\n if (reason !== null) {\n // 2.1. Let reasonBytes be the result of UTF-8 encoding reason.\n // 2.2. If reasonBytes is longer than 123 bytes, then throw a\n // \"SyntaxError\" DOMException.\n const reasonBytesLength = Buffer.byteLength(reason)\n\n if (reasonBytesLength > 123) {\n throw new DOMException(`Reason must be less than 123 bytes; received ${reasonBytesLength}`, 'SyntaxError')\n }\n }\n}\n\n/**\n * Converts a Buffer to utf-8, even on platforms without icu.\n * @type {(buffer: Buffer) => string}\n */\nconst utf8Decode = (() => {\n if (typeof process.versions.icu === 'string') {\n const fatalDecoder = new TextDecoder('utf-8', { fatal: true })\n return fatalDecoder.decode.bind(fatalDecoder)\n }\n return function (buffer) {\n if (isUtf8(buffer)) {\n return buffer.toString('utf-8')\n }\n throw new TypeError('Invalid utf-8 received.')\n }\n})()\n\nmodule.exports = {\n isConnecting,\n isEstablished,\n isClosing,\n isClosed,\n fireEvent,\n isValidSubprotocol,\n isValidStatusCode,\n websocketMessageReceived,\n utf8Decode,\n isControlFrame,\n isContinuationFrame,\n isTextBinaryFrame,\n isValidOpcode,\n parseExtensions,\n isValidClientWindowBits,\n toArrayBuffer,\n getURLRecord,\n validateCloseCodeAndReason\n}\n","'use strict'\n\nconst { runtimeFeatures } = require('../../util/runtime-features')\nconst { maxUnsigned16Bit, opcodes } = require('./constants')\n\nconst BUFFER_SIZE = 8 * 1024\n\nlet buffer = null\nlet bufIdx = BUFFER_SIZE\n\nconst randomFillSync = runtimeFeatures.has('crypto')\n ? require('node:crypto').randomFillSync\n // not full compatibility, but minimum.\n : function randomFillSync (buffer, _offset, _size) {\n for (let i = 0; i < buffer.length; ++i) {\n buffer[i] = Math.random() * 255 | 0\n }\n return buffer\n }\n\nfunction generateMask () {\n if (bufIdx === BUFFER_SIZE) {\n bufIdx = 0\n randomFillSync((buffer ??= Buffer.allocUnsafeSlow(BUFFER_SIZE)), 0, BUFFER_SIZE)\n }\n return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]]\n}\n\nclass WebsocketFrameSend {\n /**\n * @param {Buffer|undefined} data\n */\n constructor (data) {\n this.frameData = data\n }\n\n createFrame (opcode) {\n const frameData = this.frameData\n const maskKey = generateMask()\n const bodyLength = frameData?.byteLength ?? 0\n\n /** @type {number} */\n let payloadLength = bodyLength // 0-125\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n\n const buffer = Buffer.allocUnsafe(bodyLength + offset)\n\n // Clear first 2 bytes, everything else is overwritten\n buffer[0] = buffer[1] = 0\n buffer[0] |= 0x80 // FIN\n buffer[0] = (buffer[0] & 0xF0) + opcode // opcode\n\n /*! ws. MIT License. Einar Otto Stangvik */\n buffer[offset - 4] = maskKey[0]\n buffer[offset - 3] = maskKey[1]\n buffer[offset - 2] = maskKey[2]\n buffer[offset - 1] = maskKey[3]\n\n buffer[1] = payloadLength\n\n if (payloadLength === 126) {\n buffer.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n // Clear extended payload length\n buffer[2] = buffer[3] = 0\n buffer.writeUIntBE(bodyLength, 4, 6)\n }\n\n buffer[1] |= 0x80 // MASK\n\n // mask body\n for (let i = 0; i < bodyLength; ++i) {\n buffer[offset + i] = frameData[i] ^ maskKey[i & 3]\n }\n\n return buffer\n }\n\n /**\n * @param {Uint8Array} buffer\n */\n static createFastTextFrame (buffer) {\n const maskKey = generateMask()\n\n const bodyLength = buffer.length\n\n // mask body\n for (let i = 0; i < bodyLength; ++i) {\n buffer[i] ^= maskKey[i & 3]\n }\n\n let payloadLength = bodyLength\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n const head = Buffer.allocUnsafeSlow(offset)\n\n head[0] = 0x80 /* FIN */ | opcodes.TEXT /* opcode TEXT */\n head[1] = payloadLength | 0x80 /* MASK */\n head[offset - 4] = maskKey[0]\n head[offset - 3] = maskKey[1]\n head[offset - 2] = maskKey[2]\n head[offset - 1] = maskKey[3]\n\n if (payloadLength === 126) {\n head.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n head[2] = head[3] = 0\n head.writeUIntBE(bodyLength, 4, 6)\n }\n\n return [head, buffer]\n }\n}\n\nmodule.exports = {\n WebsocketFrameSend,\n generateMask // for benchmark\n}\n","'use strict'\n\nconst { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = require('./constants')\nconst { parseExtensions, isClosed, isClosing, isEstablished, isConnecting, validateCloseCodeAndReason } = require('./util')\nconst { makeRequest } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { Headers, getHeadersList } = require('../fetch/headers')\nconst { getDecodeSplit } = require('../fetch/util')\nconst { WebsocketFrameSend } = require('./frame')\nconst assert = require('node:assert')\nconst { runtimeFeatures } = require('../../util/runtime-features')\n\nconst crypto = runtimeFeatures.has('crypto')\n ? require('node:crypto')\n : null\n\nlet warningEmitted = false\n\n/**\n * @see https://websockets.spec.whatwg.org/#concept-websocket-establish\n * @param {URL} url\n * @param {string|string[]} protocols\n * @param {import('./websocket').Handler} handler\n * @param {Partial} options\n */\nfunction establishWebSocketConnection (url, protocols, client, handler, options) {\n // 1. Let requestURL be a copy of url, with its scheme set to \"http\", if url’s\n // scheme is \"ws\", and to \"https\" otherwise.\n const requestURL = url\n\n requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'\n\n // 2. Let request be a new request, whose URL is requestURL, client is client,\n // service-workers mode is \"none\", referrer is \"no-referrer\", mode is\n // \"websocket\", credentials mode is \"include\", cache mode is \"no-store\" ,\n // redirect mode is \"error\", and use-URL-credentials flag is set.\n const request = makeRequest({\n urlList: [requestURL],\n client,\n serviceWorkers: 'none',\n referrer: 'no-referrer',\n mode: 'websocket',\n credentials: 'include',\n cache: 'no-store',\n redirect: 'error',\n useURLCredentials: true\n })\n\n // Note: undici extension, allow setting custom headers.\n if (options.headers) {\n const headersList = getHeadersList(new Headers(options.headers))\n\n request.headersList = headersList\n }\n\n // 3. Append (`Upgrade`, `websocket`) to request’s header list.\n // 4. Append (`Connection`, `Upgrade`) to request’s header list.\n // Note: both of these are handled by undici currently.\n // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397\n\n // 5. Let keyValue be a nonce consisting of a randomly selected\n // 16-byte value that has been forgiving-base64-encoded and\n // isomorphic encoded.\n const keyValue = crypto.randomBytes(16).toString('base64')\n\n // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s\n // header list.\n request.headersList.append('sec-websocket-key', keyValue, true)\n\n // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s\n // header list.\n request.headersList.append('sec-websocket-version', '13', true)\n\n // 8. For each protocol in protocols, combine\n // (`Sec-WebSocket-Protocol`, protocol) in request’s header\n // list.\n for (const protocol of protocols) {\n request.headersList.append('sec-websocket-protocol', protocol, true)\n }\n\n // 9. Let permessageDeflate be a user-agent defined\n // \"permessage-deflate\" extension header value.\n // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673\n const permessageDeflate = 'permessage-deflate; client_max_window_bits'\n\n // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to\n // request’s header list.\n request.headersList.append('sec-websocket-extensions', permessageDeflate, true)\n\n // 11. Fetch request with useParallelQueue set to true, and\n // processResponse given response being these steps:\n const controller = fetching({\n request,\n useParallelQueue: true,\n dispatcher: options.dispatcher,\n processResponse (response) {\n // 1. If response is a network error or its status is not 101,\n // fail the WebSocket connection.\n // if (response.type === 'error' || ((response.socket?.session != null && response.status !== 200) && response.status !== 101)) {\n if (response.type === 'error' || response.status !== 101) {\n // The presence of a session property on the socket indicates HTTP2\n // HTTP1\n if (response.socket?.session == null) {\n failWebsocketConnection(handler, 1002, 'Received network error or non-101 status code.', response.error)\n return\n }\n\n // HTTP2\n if (response.status !== 200) {\n failWebsocketConnection(handler, 1002, 'Received network error or non-200 status code.', response.error)\n return\n }\n }\n\n if (warningEmitted === false && response.socket?.session != null) {\n process.emitWarning('WebSocket over HTTP2 is experimental, and subject to change.', 'ExperimentalWarning')\n warningEmitted = true\n }\n\n // 2. If protocols is not the empty list and extracting header\n // list values given `Sec-WebSocket-Protocol` and response’s\n // header list results in null, failure, or the empty byte\n // sequence, then fail the WebSocket connection.\n if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(handler, 1002, 'Server did not respond with sent protocols.')\n return\n }\n\n // 3. Follow the requirements stated step 2 to step 6, inclusive,\n // of the last set of steps in section 4.1 of The WebSocket\n // Protocol to validate response. This either results in fail\n // the WebSocket connection or the WebSocket connection is\n // established.\n\n // 2. If the response lacks an |Upgrade| header field or the |Upgrade|\n // header field contains a value that is not an ASCII case-\n // insensitive match for the value \"websocket\", the client MUST\n // _Fail the WebSocket Connection_.\n // For H2, no upgrade header is expected.\n if (response.socket.session == null && response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {\n failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to \"websocket\".')\n return\n }\n\n // 3. If the response lacks a |Connection| header field or the\n // |Connection| header field doesn't contain a token that is an\n // ASCII case-insensitive match for the value \"Upgrade\", the client\n // MUST _Fail the WebSocket Connection_.\n // For H2, no connection header is expected.\n if (response.socket.session == null && response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {\n failWebsocketConnection(handler, 1002, 'Server did not set Connection header to \"upgrade\".')\n return\n }\n\n // 4. If the response lacks a |Sec-WebSocket-Accept| header field or\n // the |Sec-WebSocket-Accept| contains a value other than the\n // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-\n // Key| (as a string, not base64-decoded) with the string \"258EAFA5-\n // E914-47DA-95CA-C5AB0DC85B11\" but ignoring any leading and\n // trailing whitespace, the client MUST _Fail the WebSocket\n // Connection_.\n const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')\n const digest = crypto.hash('sha1', keyValue + uid, 'base64')\n if (secWSAccept !== digest) {\n failWebsocketConnection(handler, 1002, 'Incorrect hash received in Sec-WebSocket-Accept header.')\n return\n }\n\n // 5. If the response includes a |Sec-WebSocket-Extensions| header\n // field and this header field indicates the use of an extension\n // that was not present in the client's handshake (the server has\n // indicated an extension not requested by the client), the client\n // MUST _Fail the WebSocket Connection_. (The parsing of this\n // header field to determine which extensions are requested is\n // discussed in Section 9.1.)\n const secExtension = response.headersList.get('Sec-WebSocket-Extensions')\n let extensions\n\n if (secExtension !== null) {\n extensions = parseExtensions(secExtension)\n\n if (!extensions.has('permessage-deflate')) {\n failWebsocketConnection(handler, 1002, 'Sec-WebSocket-Extensions header does not match.')\n return\n }\n }\n\n // 6. If the response includes a |Sec-WebSocket-Protocol| header field\n // and this header field indicates the use of a subprotocol that was\n // not present in the client's handshake (the server has indicated a\n // subprotocol not requested by the client), the client MUST _Fail\n // the WebSocket Connection_.\n const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')\n\n if (secProtocol !== null) {\n const requestProtocols = getDecodeSplit('sec-websocket-protocol', request.headersList)\n\n // The client can request that the server use a specific subprotocol by\n // including the |Sec-WebSocket-Protocol| field in its handshake. If it\n // is specified, the server needs to include the same field and one of\n // the selected subprotocol values in its response for the connection to\n // be established.\n if (!requestProtocols.includes(secProtocol)) {\n failWebsocketConnection(handler, 1002, 'Protocol was not set in the opening handshake.')\n return\n }\n }\n\n response.socket.on('data', handler.onSocketData)\n response.socket.on('close', handler.onSocketClose)\n response.socket.on('error', handler.onSocketError)\n\n handler.wasEverConnected = true\n handler.onConnectionEstablished(response, extensions)\n }\n })\n\n return controller\n}\n\n/**\n * @see https://whatpr.org/websockets/48.html#close-the-websocket\n * @param {import('./websocket').Handler} object\n * @param {number} [code=null]\n * @param {string} [reason='']\n */\nfunction closeWebSocketConnection (object, code, reason, validate = false) {\n // 1. If code was not supplied, let code be null.\n code ??= null\n\n // 2. If reason was not supplied, let reason be the empty string.\n reason ??= ''\n\n // 3. Validate close code and reason with code and reason.\n if (validate) validateCloseCodeAndReason(code, reason)\n\n // 4. Run the first matching steps from the following list:\n // - If object’s ready state is CLOSING (2) or CLOSED (3)\n // - If the WebSocket connection is not yet established [WSP]\n // - If the WebSocket closing handshake has not yet been started [WSP]\n // - Otherwise\n if (isClosed(object.readyState) || isClosing(object.readyState)) {\n // Do nothing.\n } else if (!isEstablished(object.readyState)) {\n // Fail the WebSocket connection and set object’s ready state to CLOSING (2). [WSP]\n failWebsocketConnection(object)\n object.readyState = states.CLOSING\n } else if (!object.closeState.has(sentCloseFrameState.SENT) && !object.closeState.has(sentCloseFrameState.RECEIVED)) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n\n const frame = new WebsocketFrameSend()\n\n // If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n\n // If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n // If code is null and reason is the empty string, the WebSocket Close frame must not have a body.\n // If reason is non-empty but code is null, then set code to 1000 (\"Normal Closure\").\n if (reason.length !== 0 && code === null) {\n code = 1000\n }\n\n // If code is set, then the status code to use in the WebSocket Close frame must be the integer given by code.\n assert(code === null || Number.isInteger(code))\n\n if (code === null && reason.length === 0) {\n frame.frameData = emptyBuffer\n } else if (code !== null && reason === null) {\n frame.frameData = Buffer.allocUnsafe(2)\n frame.frameData.writeUInt16BE(code, 0)\n } else if (code !== null && reason !== null) {\n // If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n frame.frameData = Buffer.allocUnsafe(2 + Buffer.byteLength(reason))\n frame.frameData.writeUInt16BE(code, 0)\n // the body MAY contain UTF-8-encoded data with value /reason/\n frame.frameData.write(reason, 2, 'utf-8')\n } else {\n frame.frameData = emptyBuffer\n }\n\n object.socket.write(frame.createFrame(opcodes.CLOSE))\n\n object.closeState.add(sentCloseFrameState.SENT)\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n object.readyState = states.CLOSING\n } else {\n // Set object’s ready state to CLOSING (2).\n object.readyState = states.CLOSING\n }\n}\n\n/**\n * @param {import('./websocket').Handler} handler\n * @param {number} code\n * @param {string|undefined} reason\n * @param {unknown} cause\n * @returns {void}\n */\nfunction failWebsocketConnection (handler, code, reason, cause) {\n // If _The WebSocket Connection is Established_ prior to the point where\n // the endpoint is required to _Fail the WebSocket Connection_, the\n // endpoint SHOULD send a Close frame with an appropriate status code\n // (Section 7.4) before proceeding to _Close the WebSocket Connection_.\n if (isEstablished(handler.readyState)) {\n closeWebSocketConnection(handler, code, reason, false)\n }\n\n handler.controller.abort()\n\n if (isConnecting(handler.readyState)) {\n // If the connection was not established, we must still emit an 'error' and 'close' events\n handler.onSocketClose()\n } else if (handler.socket?.destroyed === false) {\n handler.socket.destroy()\n }\n}\n\nmodule.exports = {\n establishWebSocketConnection,\n failWebsocketConnection,\n closeWebSocketConnection\n}\n","'use strict'\n\nconst { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require('node:zlib')\nconst { isValidClientWindowBits } = require('./util')\nconst { MessageSizeExceededError } = require('../../core/errors')\n\nconst tail = Buffer.from([0x00, 0x00, 0xff, 0xff])\nconst kBuffer = Symbol('kBuffer')\nconst kLength = Symbol('kLength')\n\nclass PerMessageDeflate {\n /** @type {import('node:zlib').InflateRaw} */\n #inflate\n\n #options = {}\n\n #maxPayloadSize = 0\n\n /**\n * @param {Map} extensions\n */\n constructor (extensions, options) {\n this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover')\n this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits')\n\n this.#maxPayloadSize = options.maxPayloadSize\n }\n\n /**\n * Decompress a compressed payload.\n * @param {Buffer} chunk Compressed data\n * @param {boolean} fin Final fragment flag\n * @param {Function} callback Callback function\n */\n decompress (chunk, fin, callback) {\n // An endpoint uses the following algorithm to decompress a message.\n // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the\n // payload of the message.\n // 2. Decompress the resulting data using DEFLATE.\n if (!this.#inflate) {\n let windowBits = Z_DEFAULT_WINDOWBITS\n\n if (this.#options.serverMaxWindowBits) { // empty values default to Z_DEFAULT_WINDOWBITS\n if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) {\n callback(new Error('Invalid server_max_window_bits'))\n return\n }\n\n windowBits = Number.parseInt(this.#options.serverMaxWindowBits)\n }\n\n try {\n this.#inflate = createInflateRaw({ windowBits })\n } catch (err) {\n callback(err)\n return\n }\n this.#inflate[kBuffer] = []\n this.#inflate[kLength] = 0\n\n this.#inflate.on('data', (data) => {\n this.#inflate[kLength] += data.length\n\n if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) {\n callback(new MessageSizeExceededError())\n this.#inflate.removeAllListeners()\n this.#inflate = null\n return\n }\n\n this.#inflate[kBuffer].push(data)\n })\n\n this.#inflate.on('error', (err) => {\n this.#inflate = null\n callback(err)\n })\n }\n\n this.#inflate.write(chunk)\n if (fin) {\n this.#inflate.write(tail)\n }\n\n this.#inflate.flush(() => {\n if (!this.#inflate) {\n return\n }\n\n const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength])\n\n this.#inflate[kBuffer].length = 0\n this.#inflate[kLength] = 0\n\n callback(null, full)\n })\n }\n}\n\nmodule.exports = { PerMessageDeflate }\n","'use strict'\n\nconst { Writable } = require('node:stream')\nconst assert = require('node:assert')\nconst { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require('./constants')\nconst {\n isValidStatusCode,\n isValidOpcode,\n websocketMessageReceived,\n utf8Decode,\n isControlFrame,\n isTextBinaryFrame,\n isContinuationFrame\n} = require('./util')\nconst { failWebsocketConnection } = require('./connection')\nconst { WebsocketFrameSend } = require('./frame')\nconst { PerMessageDeflate } = require('./permessage-deflate')\nconst { MessageSizeExceededError } = require('../../core/errors')\n\n// This code was influenced by ws released under the MIT license.\n// Copyright (c) 2011 Einar Otto Stangvik \n// Copyright (c) 2013 Arnout Kazemier and contributors\n// Copyright (c) 2016 Luigi Pinca and contributors\n\nclass ByteParser extends Writable {\n #buffers = []\n #fragmentsBytes = 0\n #byteOffset = 0\n #loop = false\n\n #state = parserStates.INFO\n\n #info = {}\n #fragments = []\n\n /** @type {Map} */\n #extensions\n\n /** @type {import('./websocket').Handler} */\n #handler\n\n /** @type {number} */\n #maxPayloadSize\n\n /**\n * @param {import('./websocket').Handler} handler\n * @param {Map|null} extensions\n * @param {{ maxPayloadSize?: number }} [options]\n */\n constructor (handler, extensions, options = {}) {\n super()\n\n this.#handler = handler\n this.#extensions = extensions == null ? new Map() : extensions\n this.#maxPayloadSize = options.maxPayloadSize ?? 0\n\n if (this.#extensions.has('permessage-deflate')) {\n this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions, options))\n }\n }\n\n /**\n * @param {Buffer} chunk\n * @param {() => void} callback\n */\n _write (chunk, _, callback) {\n this.#buffers.push(chunk)\n this.#byteOffset += chunk.length\n this.#loop = true\n\n this.run(callback)\n }\n\n #validatePayloadLength () {\n if (\n this.#maxPayloadSize > 0 &&\n !isControlFrame(this.#info.opcode) &&\n this.#info.payloadLength > this.#maxPayloadSize\n ) {\n failWebsocketConnection(this.#handler, 1009, 'Payload size exceeds maximum allowed size')\n return false\n }\n\n return true\n }\n\n /**\n * Runs whenever a new chunk is received.\n * Callback is called whenever there are no more chunks buffering,\n * or not enough bytes are buffered to parse.\n */\n run (callback) {\n while (this.#loop) {\n if (this.#state === parserStates.INFO) {\n // If there aren't enough bytes to parse the payload length, etc.\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n const fin = (buffer[0] & 0x80) !== 0\n const opcode = buffer[0] & 0x0F\n const masked = (buffer[1] & 0x80) === 0x80\n\n const fragmented = !fin && opcode !== opcodes.CONTINUATION\n const payloadLength = buffer[1] & 0x7F\n\n const rsv1 = buffer[0] & 0x40\n const rsv2 = buffer[0] & 0x20\n const rsv3 = buffer[0] & 0x10\n\n if (!isValidOpcode(opcode)) {\n failWebsocketConnection(this.#handler, 1002, 'Invalid opcode received')\n return callback()\n }\n\n if (masked) {\n failWebsocketConnection(this.#handler, 1002, 'Frame cannot be masked')\n return callback()\n }\n\n // MUST be 0 unless an extension is negotiated that defines meanings\n // for non-zero values. If a nonzero value is received and none of\n // the negotiated extensions defines the meaning of such a nonzero\n // value, the receiving endpoint MUST _Fail the WebSocket\n // Connection_.\n // This document allocates the RSV1 bit of the WebSocket header for\n // PMCEs and calls the bit the \"Per-Message Compressed\" bit. On a\n // WebSocket connection where a PMCE is in use, this bit indicates\n // whether a message is compressed or not.\n if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) {\n failWebsocketConnection(this.#handler, 1002, 'Expected RSV1 to be clear.')\n return\n }\n\n if (rsv2 !== 0 || rsv3 !== 0) {\n failWebsocketConnection(this.#handler, 1002, 'RSV1, RSV2, RSV3 must be clear')\n return\n }\n\n if (fragmented && !isTextBinaryFrame(opcode)) {\n // Only text and binary frames can be fragmented\n failWebsocketConnection(this.#handler, 1002, 'Invalid frame type was fragmented.')\n return\n }\n\n // If we are already parsing a text/binary frame and do not receive either\n // a continuation frame or close frame, fail the connection.\n if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) {\n failWebsocketConnection(this.#handler, 1002, 'Expected continuation frame')\n return\n }\n\n if (this.#info.fragmented && fragmented) {\n // A fragmented frame can't be fragmented itself\n failWebsocketConnection(this.#handler, 1002, 'Fragmented frame exceeded 125 bytes.')\n return\n }\n\n // \"All control frames MUST have a payload length of 125 bytes or less\n // and MUST NOT be fragmented.\"\n if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) {\n failWebsocketConnection(this.#handler, 1002, 'Control frame either too large or fragmented')\n return\n }\n\n if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) {\n failWebsocketConnection(this.#handler, 1002, 'Unexpected continuation frame')\n return\n }\n\n if (payloadLength <= 125) {\n this.#info.payloadLength = payloadLength\n this.#state = parserStates.READ_DATA\n\n if (!this.#validatePayloadLength()) {\n return\n }\n } else if (payloadLength === 126) {\n this.#state = parserStates.PAYLOADLENGTH_16\n } else if (payloadLength === 127) {\n this.#state = parserStates.PAYLOADLENGTH_64\n }\n\n if (isTextBinaryFrame(opcode)) {\n this.#info.binaryType = opcode\n this.#info.compressed = rsv1 !== 0\n }\n\n this.#info.opcode = opcode\n this.#info.masked = masked\n this.#info.fin = fin\n this.#info.fragmented = fragmented\n } else if (this.#state === parserStates.PAYLOADLENGTH_16) {\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.payloadLength = buffer.readUInt16BE(0)\n this.#state = parserStates.READ_DATA\n\n if (!this.#validatePayloadLength()) {\n return\n }\n } else if (this.#state === parserStates.PAYLOADLENGTH_64) {\n if (this.#byteOffset < 8) {\n return callback()\n }\n\n const buffer = this.consume(8)\n const upper = buffer.readUInt32BE(0)\n const lower = buffer.readUInt32BE(4)\n\n // 2^31 is the maximum bytes an arraybuffer can contain\n // on 32-bit systems. Although, on 64-bit systems, this is\n // 2^53-1 bytes.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e\n if (upper !== 0 || lower > 2 ** 31 - 1) {\n failWebsocketConnection(this.#handler, 1009, 'Received payload length > 2^31 bytes.')\n return\n }\n\n this.#info.payloadLength = lower\n this.#state = parserStates.READ_DATA\n\n if (!this.#validatePayloadLength()) {\n return\n }\n } else if (this.#state === parserStates.READ_DATA) {\n if (this.#byteOffset < this.#info.payloadLength) {\n return callback()\n }\n\n const body = this.consume(this.#info.payloadLength)\n\n if (isControlFrame(this.#info.opcode)) {\n this.#loop = this.parseControlFrame(body)\n this.#state = parserStates.INFO\n } else {\n if (!this.#info.compressed) {\n this.writeFragments(body)\n\n // If the frame is not fragmented, a message has been received.\n // If the frame is fragmented, it will terminate with a fin bit set\n // and an opcode of 0 (continuation), therefore we handle that when\n // parsing continuation frames, not here.\n if (!this.#info.fragmented && this.#info.fin) {\n websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())\n }\n\n this.#state = parserStates.INFO\n } else {\n this.#extensions.get('permessage-deflate').decompress(\n body,\n this.#info.fin,\n (error, data) => {\n if (error) {\n const code = error instanceof MessageSizeExceededError ? 1009 : 1007\n failWebsocketConnection(this.#handler, code, error.message)\n return\n }\n\n this.writeFragments(data)\n\n // Check cumulative fragment size\n if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) {\n failWebsocketConnection(this.#handler, 1009, new MessageSizeExceededError().message)\n return\n }\n\n if (!this.#info.fin) {\n this.#state = parserStates.INFO\n this.#loop = true\n this.run(callback)\n return\n }\n\n websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())\n\n this.#loop = true\n this.#state = parserStates.INFO\n this.run(callback)\n },\n this.#fragmentsBytes\n )\n\n this.#loop = false\n break\n }\n }\n }\n }\n }\n\n /**\n * Take n bytes from the buffered Buffers\n * @param {number} n\n * @returns {Buffer}\n */\n consume (n) {\n if (n > this.#byteOffset) {\n throw new Error('Called consume() before buffers satiated.')\n } else if (n === 0) {\n return emptyBuffer\n }\n\n this.#byteOffset -= n\n\n const first = this.#buffers[0]\n\n if (first.length > n) {\n // replace with remaining buffer\n this.#buffers[0] = first.subarray(n, first.length)\n return first.subarray(0, n)\n } else if (first.length === n) {\n // prefect match\n return this.#buffers.shift()\n } else {\n let offset = 0\n // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.\n const buffer = Buffer.allocUnsafeSlow(n)\n while (offset !== n) {\n const next = this.#buffers[0]\n const length = next.length\n\n if (length + offset === n) {\n buffer.set(this.#buffers.shift(), offset)\n break\n } else if (length + offset > n) {\n buffer.set(next.subarray(0, n - offset), offset)\n this.#buffers[0] = next.subarray(n - offset)\n break\n } else {\n buffer.set(this.#buffers.shift(), offset)\n offset += length\n }\n }\n\n return buffer\n }\n }\n\n writeFragments (fragment) {\n this.#fragmentsBytes += fragment.length\n this.#fragments.push(fragment)\n }\n\n consumeFragments () {\n const fragments = this.#fragments\n\n if (fragments.length === 1) {\n // single fragment\n this.#fragmentsBytes = 0\n return fragments.shift()\n }\n\n let offset = 0\n // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.\n const output = Buffer.allocUnsafeSlow(this.#fragmentsBytes)\n\n for (let i = 0; i < fragments.length; ++i) {\n const buffer = fragments[i]\n output.set(buffer, offset)\n offset += buffer.length\n }\n\n this.#fragments = []\n this.#fragmentsBytes = 0\n\n return output\n }\n\n parseCloseBody (data) {\n assert(data.length !== 1)\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n /** @type {number|undefined} */\n let code\n\n if (data.length >= 2) {\n // _The WebSocket Connection Close Code_ is\n // defined as the status code (Section 7.4) contained in the first Close\n // control frame received by the application\n code = data.readUInt16BE(0)\n }\n\n if (code !== undefined && !isValidStatusCode(code)) {\n return { code: 1002, reason: 'Invalid status code', error: true }\n }\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6\n /** @type {Buffer} */\n let reason = data.subarray(2)\n\n // Remove BOM\n if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {\n reason = reason.subarray(3)\n }\n\n try {\n reason = utf8Decode(reason)\n } catch {\n return { code: 1007, reason: 'Invalid UTF-8', error: true }\n }\n\n return { code, reason, error: false }\n }\n\n /**\n * Parses control frames.\n * @param {Buffer} body\n */\n parseControlFrame (body) {\n const { opcode, payloadLength } = this.#info\n\n if (opcode === opcodes.CLOSE) {\n if (payloadLength === 1) {\n failWebsocketConnection(this.#handler, 1002, 'Received close frame with a 1-byte body.')\n return false\n }\n\n this.#info.closeInfo = this.parseCloseBody(body)\n\n if (this.#info.closeInfo.error) {\n const { code, reason } = this.#info.closeInfo\n\n failWebsocketConnection(this.#handler, code, reason)\n return false\n }\n\n // Upon receiving such a frame, the other peer sends a\n // Close frame in response, if it hasn't already sent one.\n if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n // If an endpoint receives a Close frame and did not previously send a\n // Close frame, the endpoint MUST send a Close frame in response. (When\n // sending a Close frame in response, the endpoint typically echos the\n // status code it received.)\n let body = emptyBuffer\n if (this.#info.closeInfo.code) {\n body = Buffer.allocUnsafe(2)\n body.writeUInt16BE(this.#info.closeInfo.code, 0)\n }\n const closeFrame = new WebsocketFrameSend(body)\n\n this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE))\n this.#handler.closeState.add(sentCloseFrameState.SENT)\n }\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this.#handler.readyState = states.CLOSING\n this.#handler.closeState.add(sentCloseFrameState.RECEIVED)\n\n return false\n } else if (opcode === opcodes.PING) {\n // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in\n // response, unless it already received a Close frame.\n // A Pong frame sent in response to a Ping frame must have identical\n // \"Application data\"\n\n if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n const frame = new WebsocketFrameSend(body)\n\n this.#handler.socket.write(frame.createFrame(opcodes.PONG))\n\n this.#handler.onPing(body)\n }\n } else if (opcode === opcodes.PONG) {\n // A Pong frame MAY be sent unsolicited. This serves as a\n // unidirectional heartbeat. A response to an unsolicited Pong frame is\n // not expected.\n this.#handler.onPong(body)\n }\n\n return true\n }\n\n get closingInfo () {\n return this.#info.closeInfo\n }\n}\n\nmodule.exports = {\n ByteParser\n}\n","'use strict'\n\nconst { WebsocketFrameSend } = require('./frame')\nconst { opcodes, sendHints } = require('./constants')\nconst FixedQueue = require('../../dispatcher/fixed-queue')\n\n/**\n * @typedef {object} SendQueueNode\n * @property {Promise | null} promise\n * @property {((...args: any[]) => any)} callback\n * @property {Buffer | null} frame\n */\n\nclass SendQueue {\n /**\n * @type {FixedQueue}\n */\n #queue = new FixedQueue()\n\n /**\n * @type {boolean}\n */\n #running = false\n\n /** @type {import('node:net').Socket} */\n #socket\n\n constructor (socket) {\n this.#socket = socket\n }\n\n add (item, cb, hint) {\n if (hint !== sendHints.blob) {\n if (!this.#running) {\n // TODO(@tsctx): support fast-path for string on running\n if (hint === sendHints.text) {\n // special fast-path for string\n const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item)\n this.#socket.cork()\n this.#socket.write(head)\n this.#socket.write(body, cb)\n this.#socket.uncork()\n } else {\n // direct writing\n this.#socket.write(createFrame(item, hint), cb)\n }\n } else {\n /** @type {SendQueueNode} */\n const node = {\n promise: null,\n callback: cb,\n frame: createFrame(item, hint)\n }\n this.#queue.push(node)\n }\n return\n }\n\n /** @type {SendQueueNode} */\n const node = {\n promise: item.arrayBuffer().then((ab) => {\n node.promise = null\n node.frame = createFrame(ab, hint)\n }),\n callback: cb,\n frame: null\n }\n\n this.#queue.push(node)\n\n if (!this.#running) {\n this.#run()\n }\n }\n\n async #run () {\n this.#running = true\n const queue = this.#queue\n while (!queue.isEmpty()) {\n const node = queue.shift()\n // wait pending promise\n if (node.promise !== null) {\n await node.promise\n }\n // write\n this.#socket.write(node.frame, node.callback)\n // cleanup\n node.callback = node.frame = null\n }\n this.#running = false\n }\n}\n\nfunction createFrame (data, hint) {\n return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY)\n}\n\nfunction toBuffer (data, hint) {\n switch (hint) {\n case sendHints.text:\n case sendHints.typedArray:\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n case sendHints.arrayBuffer:\n case sendHints.blob:\n return new Uint8Array(data)\n }\n}\n\nmodule.exports = { SendQueue }\n","'use strict'\n\nconst { isArrayBuffer } = require('node:util/types')\nconst { webidl } = require('../webidl')\nconst { URLSerializer } = require('../fetch/data-url')\nconst { environmentSettingsObject } = require('../fetch/util')\nconst { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = require('./constants')\nconst {\n isConnecting,\n isEstablished,\n isClosing,\n isClosed,\n isValidSubprotocol,\n fireEvent,\n utf8Decode,\n toArrayBuffer,\n getURLRecord\n} = require('./util')\nconst { establishWebSocketConnection, closeWebSocketConnection, failWebsocketConnection } = require('./connection')\nconst { ByteParser } = require('./receiver')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { getGlobalDispatcher } = require('../../global')\nconst { ErrorEvent, CloseEvent, createFastMessageEvent } = require('./events')\nconst { SendQueue } = require('./sender')\nconst { WebsocketFrameSend } = require('./frame')\nconst { channels } = require('../../core/diagnostics')\n\nfunction getSocketAddress (socket) {\n if (typeof socket?.address === 'function') {\n return socket.address()\n }\n\n if (typeof socket?.session?.socket?.address === 'function') {\n return socket.session.socket.address()\n }\n\n return null\n}\n\n/**\n * @typedef {object} Handler\n * @property {(response: any, extensions?: string[]) => void} onConnectionEstablished\n * @property {(opcode: number, data: Buffer) => void} onMessage\n * @property {(error: Error) => void} onParserError\n * @property {() => void} onParserDrain\n * @property {(chunk: Buffer) => void} onSocketData\n * @property {(err: Error) => void} onSocketError\n * @property {() => void} onSocketClose\n * @property {(body: Buffer) => void} onPing\n * @property {(body: Buffer) => void} onPong\n *\n * @property {number} readyState\n * @property {import('stream').Duplex} socket\n * @property {Set} closeState\n * @property {import('../fetch/index').Fetch} controller\n * @property {boolean} [wasEverConnected=false]\n */\n\n// https://websockets.spec.whatwg.org/#interface-definition\nclass WebSocket extends EventTarget {\n #events = {\n open: null,\n error: null,\n close: null,\n message: null\n }\n\n #bufferedAmount = 0\n #protocol = ''\n #extensions = ''\n\n /** @type {SendQueue} */\n #sendQueue\n\n /** @type {Handler} */\n #handler = {\n onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),\n onMessage: (opcode, data) => this.#onMessage(opcode, data),\n onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),\n onParserDrain: () => this.#onParserDrain(),\n onSocketData: (chunk) => {\n if (!this.#parser.write(chunk)) {\n this.#handler.socket.pause()\n }\n },\n onSocketError: (err) => {\n this.#handler.readyState = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(err)\n }\n\n this.#handler.socket.destroy()\n },\n onSocketClose: () => this.#onSocketClose(),\n onPing: (body) => {\n if (channels.ping.hasSubscribers) {\n channels.ping.publish({\n payload: body,\n websocket: this\n })\n }\n },\n onPong: (body) => {\n if (channels.pong.hasSubscribers) {\n channels.pong.publish({\n payload: body,\n websocket: this\n })\n }\n },\n\n readyState: states.CONNECTING,\n socket: null,\n closeState: new Set(),\n controller: null,\n wasEverConnected: false\n }\n\n #url\n #binaryType\n /** @type {import('./receiver').ByteParser} */\n #parser\n\n /**\n * @param {string} url\n * @param {string|string[]} protocols\n */\n constructor (url, protocols = []) {\n super()\n\n webidl.util.markAsUncloneable(this)\n\n const prefix = 'WebSocket constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols, prefix, 'options')\n\n url = webidl.converters.USVString(url)\n protocols = options.protocols\n\n // 1. Let baseURL be this's relevant settings object's API base URL.\n const baseURL = environmentSettingsObject.settingsObject.baseUrl\n\n // 2. Let urlRecord be the result of getting a URL record given url and baseURL.\n const urlRecord = getURLRecord(url, baseURL)\n\n // 3. If protocols is a string, set protocols to a sequence consisting\n // of just that string.\n if (typeof protocols === 'string') {\n protocols = [protocols]\n }\n\n // 4. If any of the values in protocols occur more than once or otherwise\n // fail to match the requirements for elements that comprise the value\n // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket\n // protocol, then throw a \"SyntaxError\" DOMException.\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 5. Set this's url to urlRecord.\n this.#url = new URL(urlRecord.href)\n\n // 6. Let client be this's relevant settings object.\n const client = environmentSettingsObject.settingsObject\n\n // 7. Run this step in parallel:\n // 7.1. Establish a WebSocket connection given urlRecord, protocols,\n // and client.\n this.#handler.controller = establishWebSocketConnection(\n urlRecord,\n protocols,\n client,\n this.#handler,\n options\n )\n\n // Each WebSocket object has an associated ready state, which is a\n // number representing the state of the connection. Initially it must\n // be CONNECTING (0).\n this.#handler.readyState = WebSocket.CONNECTING\n\n // The extensions attribute must initially return the empty string.\n\n // The protocol attribute must initially return the empty string.\n\n // Each WebSocket object has an associated binary type, which is a\n // BinaryType. Initially it must be \"blob\".\n this.#binaryType = 'blob'\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-close\n * @param {number|undefined} code\n * @param {string|undefined} reason\n */\n close (code = undefined, reason = undefined) {\n webidl.brandCheck(this, WebSocket)\n\n const prefix = 'WebSocket.close'\n\n if (code !== undefined) {\n code = webidl.converters['unsigned short'](code, prefix, 'code', webidl.attributes.Clamp)\n }\n\n if (reason !== undefined) {\n reason = webidl.converters.USVString(reason)\n }\n\n // 1. If code is the special value \"missing\", then set code to null.\n code ??= null\n\n // 2. If reason is the special value \"missing\", then set reason to the empty string.\n reason ??= ''\n\n // 3. Close the WebSocket with this, code, and reason.\n closeWebSocketConnection(this.#handler, code, reason, true)\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-send\n * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data\n */\n send (data) {\n webidl.brandCheck(this, WebSocket)\n\n const prefix = 'WebSocket.send'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n data = webidl.converters.WebSocketSendData(data, prefix, 'data')\n\n // 1. If this's ready state is CONNECTING, then throw an\n // \"InvalidStateError\" DOMException.\n if (isConnecting(this.#handler.readyState)) {\n throw new DOMException('Sent before connected.', 'InvalidStateError')\n }\n\n // 2. Run the appropriate set of steps from the following list:\n // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1\n // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n\n if (!isEstablished(this.#handler.readyState) || isClosing(this.#handler.readyState)) {\n return\n }\n\n // If data is a string\n if (typeof data === 'string') {\n // If the WebSocket connection is established and the WebSocket\n // closing handshake has not yet started, then the user agent\n // must send a WebSocket Message comprised of the data argument\n // using a text frame opcode; if the data cannot be sent, e.g.\n // because it would need to be buffered but the buffer is full,\n // the user agent must flag the WebSocket as full and then close\n // the WebSocket connection. Any invocation of this method with a\n // string argument that does not throw an exception must increase\n // the bufferedAmount attribute by the number of bytes needed to\n // express the argument as UTF-8.\n\n const buffer = Buffer.from(data)\n\n this.#bufferedAmount += buffer.byteLength\n this.#sendQueue.add(buffer, () => {\n this.#bufferedAmount -= buffer.byteLength\n }, sendHints.text)\n } else if (isArrayBuffer(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need\n // to be buffered but the buffer is full, the user agent must flag\n // the WebSocket as full and then close the WebSocket connection.\n // The data to be sent is the data stored in the buffer described\n // by the ArrayBuffer object. Any invocation of this method with an\n // ArrayBuffer argument that does not throw an exception must\n // increase the bufferedAmount attribute by the length of the\n // ArrayBuffer in bytes.\n\n this.#bufferedAmount += data.byteLength\n this.#sendQueue.add(data, () => {\n this.#bufferedAmount -= data.byteLength\n }, sendHints.arrayBuffer)\n } else if (ArrayBuffer.isView(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The\n // data to be sent is the data stored in the section of the buffer\n // described by the ArrayBuffer object that data references. Any\n // invocation of this method with this kind of argument that does\n // not throw an exception must increase the bufferedAmount attribute\n // by the length of data’s buffer in bytes.\n\n this.#bufferedAmount += data.byteLength\n this.#sendQueue.add(data, () => {\n this.#bufferedAmount -= data.byteLength\n }, sendHints.typedArray)\n } else if (webidl.is.Blob(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The data\n // to be sent is the raw data represented by the Blob object. Any\n // invocation of this method with a Blob argument that does not throw\n // an exception must increase the bufferedAmount attribute by the size\n // of the Blob object’s raw data, in bytes.\n\n this.#bufferedAmount += data.size\n this.#sendQueue.add(data, () => {\n this.#bufferedAmount -= data.size\n }, sendHints.blob)\n }\n }\n\n get readyState () {\n webidl.brandCheck(this, WebSocket)\n\n // The readyState getter steps are to return this's ready state.\n return this.#handler.readyState\n }\n\n get bufferedAmount () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#bufferedAmount\n }\n\n get url () {\n webidl.brandCheck(this, WebSocket)\n\n // The url getter steps are to return this's url, serialized.\n return URLSerializer(this.#url)\n }\n\n get extensions () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#extensions\n }\n\n get protocol () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#protocol\n }\n\n get onopen () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.open\n }\n\n set onopen (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('open', listener)\n this.#events.open = fn\n } else {\n this.#events.open = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('error', listener)\n this.#events.error = fn\n } else {\n this.#events.error = null\n }\n }\n\n get onclose () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.close\n }\n\n set onclose (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.close) {\n this.removeEventListener('close', this.#events.close)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('close', listener)\n this.#events.close = fn\n } else {\n this.#events.close = null\n }\n }\n\n get onmessage () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.message\n }\n\n set onmessage (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('message', listener)\n this.#events.message = fn\n } else {\n this.#events.message = null\n }\n }\n\n get binaryType () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#binaryType\n }\n\n set binaryType (type) {\n webidl.brandCheck(this, WebSocket)\n\n if (type !== 'blob' && type !== 'arraybuffer') {\n this.#binaryType = 'blob'\n } else {\n this.#binaryType = type\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n */\n #onConnectionEstablished (response, parsedExtensions) {\n // processResponse is called when the \"response's header list has been received and initialized.\"\n // once this happens, the connection is open\n this.#handler.socket = response.socket\n\n // Get maxPayloadSize from dispatcher options\n const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize\n\n const parser = new ByteParser(this.#handler, parsedExtensions, {\n maxPayloadSize\n })\n parser.on('drain', () => this.#handler.onParserDrain())\n parser.on('error', (err) => this.#handler.onParserError(err))\n\n this.#parser = parser\n this.#sendQueue = new SendQueue(response.socket)\n\n // 1. Change the ready state to OPEN (1).\n this.#handler.readyState = states.OPEN\n\n // 2. Change the extensions attribute’s value to the extensions in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\n const extensions = response.headersList.get('sec-websocket-extensions')\n\n if (extensions !== null) {\n this.#extensions = extensions\n }\n\n // 3. Change the protocol attribute’s value to the subprotocol in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9\n const protocol = response.headersList.get('sec-websocket-protocol')\n\n if (protocol !== null) {\n this.#protocol = protocol\n }\n\n // 4. Fire an event named open at the WebSocket object.\n fireEvent('open', this)\n\n if (channels.open.hasSubscribers) {\n // Convert headers to a plain object for the event\n const headers = response.headersList.entries\n channels.open.publish({\n address: getSocketAddress(response.socket),\n protocol: this.#protocol,\n extensions: this.#extensions,\n websocket: this,\n handshakeResponse: {\n status: response.status,\n statusText: response.statusText,\n headers\n }\n })\n }\n }\n\n #onMessage (type, data) {\n // 1. If ready state is not OPEN (1), then return.\n if (this.#handler.readyState !== states.OPEN) {\n return\n }\n\n // 2. Let dataForEvent be determined by switching on type and binary type:\n let dataForEvent\n\n if (type === opcodes.TEXT) {\n // -> type indicates that the data is Text\n // a new DOMString containing data\n try {\n dataForEvent = utf8Decode(data)\n } catch {\n failWebsocketConnection(this.#handler, 1007, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n if (this.#binaryType === 'blob') {\n // -> type indicates that the data is Binary and binary type is \"blob\"\n // a new Blob object, created in the relevant Realm of the WebSocket\n // object, that represents data as its raw data\n dataForEvent = new Blob([data])\n } else {\n // -> type indicates that the data is Binary and binary type is \"arraybuffer\"\n // a new ArrayBuffer object, created in the relevant Realm of the\n // WebSocket object, whose contents are data\n dataForEvent = toArrayBuffer(data)\n }\n }\n\n // 3. Fire an event named message at the WebSocket object, using MessageEvent,\n // with the origin attribute initialized to the serialization of the WebSocket\n // object’s url's origin, and the data attribute initialized to dataForEvent.\n fireEvent('message', this, createFastMessageEvent, {\n origin: this.#url.origin,\n data: dataForEvent\n })\n }\n\n #onParserDrain () {\n this.#handler.socket.resume()\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4\n */\n #onSocketClose () {\n // If the TCP connection was closed after the\n // WebSocket closing handshake was completed, the WebSocket connection\n // is said to have been closed _cleanly_.\n const wasClean =\n this.#handler.closeState.has(sentCloseFrameState.SENT) &&\n this.#handler.closeState.has(sentCloseFrameState.RECEIVED)\n\n let code = 1005\n let reason = ''\n\n const result = this.#parser?.closingInfo\n\n if (result && !result.error) {\n code = result.code ?? 1005\n reason = result.reason\n }\n\n // 1. Change the ready state to CLOSED (3).\n this.#handler.readyState = states.CLOSED\n\n // 2. If the user agent was required to fail the WebSocket\n // connection, or if the WebSocket connection was closed\n // after being flagged as full, fire an event named error\n // at the WebSocket object.\n if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n // If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n code = 1006\n\n fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {\n error: new TypeError(reason)\n })\n }\n\n // 3. Fire an event named close at the WebSocket object,\n // using CloseEvent, with the wasClean attribute\n // initialized to true if the connection closed cleanly\n // and false otherwise, the code attribute initialized to\n // the WebSocket connection close code, and the reason\n // attribute initialized to the result of applying UTF-8\n // decode without BOM to the WebSocket connection close\n // reason.\n // TODO: process.nextTick\n fireEvent('close', this, (type, init) => new CloseEvent(type, init), {\n wasClean, code, reason\n })\n\n if (channels.close.hasSubscribers) {\n channels.close.publish({\n websocket: this,\n code,\n reason\n })\n }\n }\n\n /**\n * @param {WebSocket} ws\n * @param {Buffer|undefined} buffer\n */\n static ping (ws, buffer) {\n if (Buffer.isBuffer(buffer)) {\n if (buffer.length > 125) {\n throw new TypeError('A PING frame cannot have a body larger than 125 bytes.')\n }\n } else if (buffer !== undefined) {\n throw new TypeError('Expected buffer payload')\n }\n\n // An endpoint MAY send a Ping frame any time after the connection is\n // established and before the connection is closed.\n const readyState = ws.#handler.readyState\n\n if (isEstablished(readyState) && !isClosing(readyState) && !isClosed(readyState)) {\n const frame = new WebsocketFrameSend(buffer)\n ws.#handler.socket.write(frame.createFrame(opcodes.PING))\n }\n }\n}\n\nconst { ping } = WebSocket\nReflect.deleteProperty(WebSocket, 'ping')\n\n// https://websockets.spec.whatwg.org/#dom-websocket-connecting\nWebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING\n// https://websockets.spec.whatwg.org/#dom-websocket-open\nWebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN\n// https://websockets.spec.whatwg.org/#dom-websocket-closing\nWebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING\n// https://websockets.spec.whatwg.org/#dom-websocket-closed\nWebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED\n\nObject.defineProperties(WebSocket.prototype, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors,\n url: kEnumerableProperty,\n readyState: kEnumerableProperty,\n bufferedAmount: kEnumerableProperty,\n onopen: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onclose: kEnumerableProperty,\n close: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n binaryType: kEnumerableProperty,\n send: kEnumerableProperty,\n extensions: kEnumerableProperty,\n protocol: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocket',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(WebSocket, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors\n})\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.DOMString\n)\n\nwebidl.converters['DOMString or sequence'] = function (V, prefix, argument) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT && Symbol.iterator in V) {\n return webidl.converters['sequence'](V)\n }\n\n return webidl.converters.DOMString(V, prefix, argument)\n}\n\n// This implements the proposal made in https://github.com/whatwg/websockets/issues/42\nwebidl.converters.WebSocketInit = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.converters['DOMString or sequence'],\n defaultValue: () => []\n },\n {\n key: 'dispatcher',\n converter: webidl.converters.any,\n defaultValue: () => getGlobalDispatcher()\n },\n {\n key: 'headers',\n converter: webidl.nullableConverter(webidl.converters.HeadersInit)\n }\n])\n\nwebidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT && !(Symbol.iterator in V)) {\n return webidl.converters.WebSocketInit(V)\n }\n\n return { protocols: webidl.converters['DOMString or sequence'](V) }\n}\n\nwebidl.converters.WebSocketSendData = function (V) {\n if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {\n if (webidl.is.Blob(V)) {\n return V\n }\n\n if (webidl.is.BufferSource(V)) {\n return V\n }\n }\n\n return webidl.converters.USVString(V)\n}\n\nmodule.exports = {\n WebSocket,\n ping\n}\n","'use strict'\n\nconst { webidl } = require('../../webidl')\nconst { validateCloseCodeAndReason } = require('../util')\nconst { kConstruct } = require('../../../core/symbols')\nconst { kEnumerableProperty } = require('../../../core/util')\n\nfunction createInheritableDOMException () {\n // https://github.com/nodejs/node/issues/59677\n class Test extends DOMException {\n get reason () {\n return ''\n }\n }\n\n if (new Test().reason !== undefined) {\n return DOMException\n }\n\n return new Proxy(DOMException, {\n construct (target, args, newTarget) {\n const instance = Reflect.construct(target, args, target)\n Object.setPrototypeOf(instance, newTarget.prototype)\n return instance\n }\n })\n}\n\nclass WebSocketError extends createInheritableDOMException() {\n #closeCode\n #reason\n\n constructor (message = '', init = undefined) {\n message = webidl.converters.DOMString(message, 'WebSocketError', 'message')\n\n // 1. Set this 's name to \" WebSocketError \".\n // 2. Set this 's message to message .\n super(message, 'WebSocketError')\n\n if (init === kConstruct) {\n return\n } else if (init !== null) {\n init = webidl.converters.WebSocketCloseInfo(init)\n }\n\n // 3. Let code be init [\" closeCode \"] if it exists , or null otherwise.\n let code = init.closeCode ?? null\n\n // 4. Let reason be init [\" reason \"] if it exists , or the empty string otherwise.\n const reason = init.reason ?? ''\n\n // 5. Validate close code and reason with code and reason .\n validateCloseCodeAndReason(code, reason)\n\n // 6. If reason is non-empty, but code is not set, then set code to 1000 (\"Normal Closure\").\n if (reason.length !== 0 && code === null) {\n code = 1000\n }\n\n // 7. Set this 's closeCode to code .\n this.#closeCode = code\n\n // 8. Set this 's reason to reason .\n this.#reason = reason\n }\n\n get closeCode () {\n return this.#closeCode\n }\n\n get reason () {\n return this.#reason\n }\n\n /**\n * @param {string} message\n * @param {number|null} code\n * @param {string} reason\n */\n static createUnvalidatedWebSocketError (message, code, reason) {\n const error = new WebSocketError(message, kConstruct)\n error.#closeCode = code\n error.#reason = reason\n return error\n }\n}\n\nconst { createUnvalidatedWebSocketError } = WebSocketError\ndelete WebSocketError.createUnvalidatedWebSocketError\n\nObject.defineProperties(WebSocketError.prototype, {\n closeCode: kEnumerableProperty,\n reason: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocketError',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nwebidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError)\n\nmodule.exports = { WebSocketError, createUnvalidatedWebSocketError }\n","'use strict'\n\nconst { environmentSettingsObject } = require('../../fetch/util')\nconst { states, opcodes, sentCloseFrameState } = require('../constants')\nconst { webidl } = require('../../webidl')\nconst { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = require('../util')\nconst { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = require('../connection')\nconst { channels } = require('../../../core/diagnostics')\nconst { WebsocketFrameSend } = require('../frame')\nconst { ByteParser } = require('../receiver')\nconst { WebSocketError, createUnvalidatedWebSocketError } = require('./websocketerror')\nconst { kEnumerableProperty } = require('../../../core/util')\nconst { utf8DecodeBytes } = require('../../../encoding')\n\nlet emittedExperimentalWarning = false\n\nclass WebSocketStream {\n // Each WebSocketStream object has an associated url , which is a URL record .\n /** @type {URL} */\n #url\n\n // Each WebSocketStream object has an associated opened promise , which is a promise.\n /** @type {ReturnType} */\n #openedPromise\n\n // Each WebSocketStream object has an associated closed promise , which is a promise.\n /** @type {ReturnType} */\n #closedPromise\n\n // Each WebSocketStream object has an associated readable stream , which is a ReadableStream .\n /** @type {ReadableStream} */\n #readableStream\n /** @type {ReadableStreamDefaultController} */\n #readableStreamController\n\n // Each WebSocketStream object has an associated writable stream , which is a WritableStream .\n /** @type {WritableStream} */\n #writableStream\n\n // Each WebSocketStream object has an associated boolean handshake aborted , which is initially false.\n #handshakeAborted = false\n\n /** @type {import('../websocket').Handler} */\n #handler = {\n // https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol\n onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),\n onMessage: (opcode, data) => this.#onMessage(opcode, data),\n onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),\n onParserDrain: () => this.#handler.socket.resume(),\n onSocketData: (chunk) => {\n if (!this.#parser.write(chunk)) {\n this.#handler.socket.pause()\n }\n },\n onSocketError: (err) => {\n this.#handler.readyState = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(err)\n }\n\n this.#handler.socket.destroy()\n },\n onSocketClose: () => this.#onSocketClose(),\n onPing: () => {},\n onPong: () => {},\n\n readyState: states.CONNECTING,\n socket: null,\n closeState: new Set(),\n controller: null,\n wasEverConnected: false\n }\n\n /** @type {import('../receiver').ByteParser} */\n #parser\n\n constructor (url, options = undefined) {\n if (!emittedExperimentalWarning) {\n process.emitWarning('WebSocketStream is experimental! Expect it to change at any time.', {\n code: 'UNDICI-WSS'\n })\n emittedExperimentalWarning = true\n }\n\n webidl.argumentLengthCheck(arguments, 1, 'WebSocket')\n\n url = webidl.converters.USVString(url)\n if (options !== null) {\n options = webidl.converters.WebSocketStreamOptions(options)\n }\n\n // 1. Let baseURL be this 's relevant settings object 's API base URL .\n const baseURL = environmentSettingsObject.settingsObject.baseUrl\n\n // 2. Let urlRecord be the result of getting a URL record given url and baseURL .\n const urlRecord = getURLRecord(url, baseURL)\n\n // 3. Let protocols be options [\" protocols \"] if it exists , otherwise an empty sequence.\n const protocols = options.protocols\n\n // 4. If any of the values in protocols occur more than once or otherwise fail to match the requirements for elements that comprise the value of ` Sec-WebSocket-Protocol ` fields as defined by The WebSocket Protocol , then throw a \" SyntaxError \" DOMException . [WSP]\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 5. Set this 's url to urlRecord .\n this.#url = urlRecord.toString()\n\n // 6. Set this 's opened promise and closed promise to new promises.\n this.#openedPromise = Promise.withResolvers()\n this.#closedPromise = Promise.withResolvers()\n\n // 7. Apply backpressure to the WebSocket.\n // TODO\n\n // 8. If options [\" signal \"] exists ,\n if (options.signal != null) {\n // 8.1. Let signal be options [\" signal \"].\n const signal = options.signal\n\n // 8.2. If signal is aborted , then reject this 's opened promise and closed promise with signal ’s abort reason\n // and return.\n if (signal.aborted) {\n this.#openedPromise.reject(signal.reason)\n this.#closedPromise.reject(signal.reason)\n return\n }\n\n // 8.3. Add the following abort steps to signal :\n signal.addEventListener('abort', () => {\n // 8.3.1. If the WebSocket connection is not yet established : [WSP]\n if (!isEstablished(this.#handler.readyState)) {\n // 8.3.1.1. Fail the WebSocket connection .\n failWebsocketConnection(this.#handler)\n\n // Set this 's ready state to CLOSING .\n this.#handler.readyState = states.CLOSING\n\n // Reject this 's opened promise and closed promise with signal ’s abort reason .\n this.#openedPromise.reject(signal.reason)\n this.#closedPromise.reject(signal.reason)\n\n // Set this 's handshake aborted to true.\n this.#handshakeAborted = true\n }\n }, { once: true })\n }\n\n // 9. Let client be this 's relevant settings object .\n const client = environmentSettingsObject.settingsObject\n\n // 10. Run this step in parallel :\n // 10.1. Establish a WebSocket connection given urlRecord , protocols , and client . [FETCH]\n this.#handler.controller = establishWebSocketConnection(\n urlRecord,\n protocols,\n client,\n this.#handler,\n options\n )\n }\n\n // The url getter steps are to return this 's url , serialized .\n get url () {\n return this.#url.toString()\n }\n\n // The opened getter steps are to return this 's opened promise .\n get opened () {\n return this.#openedPromise.promise\n }\n\n // The closed getter steps are to return this 's closed promise .\n get closed () {\n return this.#closedPromise.promise\n }\n\n // The close( closeInfo ) method steps are:\n close (closeInfo = undefined) {\n if (closeInfo !== null) {\n closeInfo = webidl.converters.WebSocketCloseInfo(closeInfo)\n }\n\n // 1. Let code be closeInfo [\" closeCode \"] if present, or null otherwise.\n const code = closeInfo.closeCode ?? null\n\n // 2. Let reason be closeInfo [\" reason \"].\n const reason = closeInfo.reason\n\n // 3. Close the WebSocket with this , code , and reason .\n closeWebSocketConnection(this.#handler, code, reason, true)\n }\n\n #write (chunk) {\n // See /websockets/stream/tentative/write.any.html\n chunk = webidl.converters.WebSocketStreamWrite(chunk)\n\n // 1. Let promise be a new promise created in stream ’s relevant realm .\n const promise = Promise.withResolvers()\n\n // 2. Let data be null.\n let data = null\n\n // 3. Let opcode be null.\n let opcode = null\n\n // 4. If chunk is a BufferSource ,\n if (webidl.is.BufferSource(chunk)) {\n // 4.1. Set data to a copy of the bytes given chunk .\n data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk.slice())\n\n // 4.2. Set opcode to a binary frame opcode.\n opcode = opcodes.BINARY\n } else {\n // 5. Otherwise,\n\n // 5.1. Let string be the result of converting chunk to an IDL USVString .\n // If this throws an exception, return a promise rejected with the exception.\n let string\n\n try {\n string = webidl.converters.DOMString(chunk)\n } catch (e) {\n promise.reject(e)\n return promise.promise\n }\n\n // 5.2. Set data to the result of UTF-8 encoding string .\n data = new TextEncoder().encode(string)\n\n // 5.3. Set opcode to a text frame opcode.\n opcode = opcodes.TEXT\n }\n\n // 6. In parallel,\n // 6.1. Wait until there is sufficient buffer space in stream to send the message.\n\n // 6.2. If the closing handshake has not yet started , Send a WebSocket Message to stream comprised of data using opcode .\n if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n const frame = new WebsocketFrameSend(data)\n\n this.#handler.socket.write(frame.createFrame(opcode), () => {\n promise.resolve(undefined)\n })\n }\n\n // 6.3. Queue a global task on the WebSocket task source given stream ’s relevant global object to resolve promise with undefined.\n return promise.promise\n }\n\n /** @type {import('../websocket').Handler['onConnectionEstablished']} */\n #onConnectionEstablished (response, parsedExtensions) {\n this.#handler.socket = response.socket\n\n const parser = new ByteParser(this.#handler, parsedExtensions)\n parser.on('drain', () => this.#handler.onParserDrain())\n parser.on('error', (err) => this.#handler.onParserError(err))\n\n this.#parser = parser\n\n // 1. Change stream ’s ready state to OPEN (1).\n this.#handler.readyState = states.OPEN\n\n // 2. Set stream ’s was ever connected to true.\n // This is done in the opening handshake.\n\n // 3. Let extensions be the extensions in use .\n const extensions = parsedExtensions ?? ''\n\n // 4. Let protocol be the subprotocol in use .\n const protocol = response.headersList.get('sec-websocket-protocol') ?? ''\n\n // 5. Let pullAlgorithm be an action that pulls bytes from stream .\n // 6. Let cancelAlgorithm be an action that cancels stream with reason , given reason .\n // 7. Let readable be a new ReadableStream .\n // 8. Set up readable with pullAlgorithm and cancelAlgorithm .\n const readable = new ReadableStream({\n start: (controller) => {\n this.#readableStreamController = controller\n },\n cancel: (reason) => this.#cancel(reason)\n })\n\n // 9. Let writeAlgorithm be an action that writes chunk to stream , given chunk .\n // 10. Let closeAlgorithm be an action that closes stream .\n // 11. Let abortAlgorithm be an action that aborts stream with reason , given reason .\n // 12. Let writable be a new WritableStream .\n // 13. Set up writable with writeAlgorithm , closeAlgorithm , and abortAlgorithm .\n const writable = new WritableStream({\n write: (chunk) => this.#write(chunk),\n close: () => closeWebSocketConnection(this.#handler, null, null),\n abort: (reason) => this.#closeUsingReason(reason)\n })\n\n // Set stream ’s readable stream to readable .\n this.#readableStream = readable\n\n // Set stream ’s writable stream to writable .\n this.#writableStream = writable\n\n // Resolve stream ’s opened promise with WebSocketOpenInfo «[ \" extensions \" → extensions , \" protocol \" → protocol , \" readable \" → readable , \" writable \" → writable ]».\n this.#openedPromise.resolve({\n extensions,\n protocol,\n readable,\n writable\n })\n }\n\n /** @type {import('../websocket').Handler['onMessage']} */\n #onMessage (type, data) {\n // 1. If stream’s ready state is not OPEN (1), then return.\n if (this.#handler.readyState !== states.OPEN) {\n return\n }\n\n // 2. Let chunk be determined by switching on type:\n // - type indicates that the data is Text\n // a new DOMString containing data\n // - type indicates that the data is Binary\n // a new Uint8Array object, created in the relevant Realm of the\n // WebSocketStream object, whose contents are data\n let chunk\n\n if (type === opcodes.TEXT) {\n try {\n chunk = utf8Decode(data)\n } catch {\n failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n chunk = new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n }\n\n // 3. Enqueue chunk into stream’s readable stream.\n this.#readableStreamController.enqueue(chunk)\n\n // 4. Apply backpressure to the WebSocket.\n }\n\n /** @type {import('../websocket').Handler['onSocketClose']} */\n #onSocketClose () {\n const wasClean =\n this.#handler.closeState.has(sentCloseFrameState.SENT) &&\n this.#handler.closeState.has(sentCloseFrameState.RECEIVED)\n\n // 1. Change the ready state to CLOSED (3).\n this.#handler.readyState = states.CLOSED\n\n // 2. If stream ’s handshake aborted is true, then return.\n if (this.#handshakeAborted) {\n return\n }\n\n // 3. If stream ’s was ever connected is false, then reject stream ’s opened promise with a new WebSocketError.\n if (!this.#handler.wasEverConnected) {\n this.#openedPromise.reject(new WebSocketError('Socket never opened'))\n }\n\n const result = this.#parser?.closingInfo\n\n // 4. Let code be the WebSocket connection close code .\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n // If this Close control frame contains no status code, _The WebSocket\n // Connection Close Code_ is considered to be 1005. If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n let code = result?.code ?? 1005\n\n if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {\n code = 1006\n }\n\n // 5. Let reason be the result of applying UTF-8 decode without BOM to the WebSocket connection close reason .\n const reason = result?.reason == null ? '' : utf8DecodeBytes(Buffer.from(result.reason))\n\n // 6. If the connection was closed cleanly ,\n if (wasClean) {\n // 6.1. Close stream ’s readable stream .\n this.#readableStreamController.close()\n\n // 6.2. Error stream ’s writable stream with an \" InvalidStateError \" DOMException indicating that a closed WebSocketStream cannot be written to.\n if (!this.#writableStream.locked) {\n this.#writableStream.abort(new DOMException('A closed WebSocketStream cannot be written to', 'InvalidStateError'))\n }\n\n // 6.3. Resolve stream ’s closed promise with WebSocketCloseInfo «[ \" closeCode \" → code , \" reason \" → reason ]».\n this.#closedPromise.resolve({\n closeCode: code,\n reason\n })\n } else {\n // 7. Otherwise,\n\n // 7.1. Let error be a new WebSocketError whose closeCode is code and reason is reason .\n const error = createUnvalidatedWebSocketError('unclean close', code, reason)\n\n // 7.2. Error stream ’s readable stream with error .\n this.#readableStreamController?.error(error)\n\n // 7.3. Error stream ’s writable stream with error .\n this.#writableStream?.abort(error)\n\n // 7.4. Reject stream ’s closed promise with error .\n this.#closedPromise.reject(error)\n }\n }\n\n #closeUsingReason (reason) {\n // 1. Let code be null.\n let code = null\n\n // 2. Let reasonString be the empty string.\n let reasonString = ''\n\n // 3. If reason implements WebSocketError ,\n if (webidl.is.WebSocketError(reason)) {\n // 3.1. Set code to reason ’s closeCode .\n code = reason.closeCode\n\n // 3.2. Set reasonString to reason ’s reason .\n reasonString = reason.reason\n }\n\n // 4. Close the WebSocket with stream , code , and reasonString . If this throws an exception,\n // discard code and reasonString and close the WebSocket with stream .\n closeWebSocketConnection(this.#handler, code, reasonString)\n }\n\n // To cancel a WebSocketStream stream given reason , close using reason giving stream and reason .\n #cancel (reason) {\n this.#closeUsingReason(reason)\n }\n}\n\nObject.defineProperties(WebSocketStream.prototype, {\n url: kEnumerableProperty,\n opened: kEnumerableProperty,\n closed: kEnumerableProperty,\n close: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocketStream',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nwebidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.sequenceConverter(webidl.converters.USVString),\n defaultValue: () => []\n },\n {\n key: 'signal',\n converter: webidl.nullableConverter(webidl.converters.AbortSignal),\n defaultValue: () => null\n }\n])\n\nwebidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([\n {\n key: 'closeCode',\n converter: (V) => webidl.converters['unsigned short'](V, webidl.attributes.EnforceRange)\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: () => ''\n }\n])\n\nwebidl.converters.WebSocketStreamWrite = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n return webidl.converters.BufferSource(V)\n}\n\nmodule.exports = { WebSocketStream }\n","'use strict'\n\n/**\n * Checks if the given value is a valid LastEventId.\n * @param {string} value\n * @returns {boolean}\n */\nfunction isValidLastEventId (value) {\n // LastEventId should not contain U+0000 NULL\n return value.indexOf('\\u0000') === -1\n}\n\n/**\n * Checks if the given value is a base 10 digit.\n * @param {string} value\n * @returns {boolean}\n */\nfunction isASCIINumber (value) {\n if (value.length === 0) return false\n for (let i = 0; i < value.length; i++) {\n if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false\n }\n return true\n}\n\nmodule.exports = {\n isValidLastEventId,\n isASCIINumber\n}\n","'use strict'\nconst { Transform } = require('node:stream')\nconst { isASCIINumber, isValidLastEventId } = require('./util')\n\n/**\n * @type {number[]} BOM\n */\nconst BOM = [0xEF, 0xBB, 0xBF]\n/**\n * @type {10} LF\n */\nconst LF = 0x0A\n/**\n * @type {13} CR\n */\nconst CR = 0x0D\n/**\n * @type {58} COLON\n */\nconst COLON = 0x3A\n/**\n * @type {32} SPACE\n */\nconst SPACE = 0x20\n\n/**\n * @typedef {object} EventSourceStreamEvent\n * @type {object}\n * @property {string} [event] The event type.\n * @property {string} [data] The data of the message.\n * @property {string} [id] A unique ID for the event.\n * @property {string} [retry] The reconnection time, in milliseconds.\n */\n\n/**\n * @typedef eventSourceSettings\n * @type {object}\n * @property {string} [lastEventId] The last event ID received from the server.\n * @property {string} [origin] The origin of the event source.\n * @property {number} [reconnectionTime] The reconnection time, in milliseconds.\n */\n\nclass EventSourceStream extends Transform {\n /**\n * @type {eventSourceSettings}\n */\n state\n\n /**\n * Leading byte-order-mark check.\n * @type {boolean}\n */\n checkBOM = true\n\n /**\n * @type {boolean}\n */\n crlfCheck = false\n\n /**\n * @type {boolean}\n */\n eventEndCheck = false\n\n /**\n * @type {Buffer|null}\n */\n buffer = null\n\n pos = 0\n\n event = {\n data: undefined,\n event: undefined,\n id: undefined,\n retry: undefined\n }\n\n /**\n * @param {object} options\n * @param {boolean} [options.readableObjectMode]\n * @param {eventSourceSettings} [options.eventSourceSettings]\n * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push]\n */\n constructor (options = {}) {\n // Enable object mode as EventSourceStream emits objects of shape\n // EventSourceStreamEvent\n options.readableObjectMode = true\n\n super(options)\n\n this.state = options.eventSourceSettings || {}\n if (options.push) {\n this.push = options.push\n }\n }\n\n /**\n * @param {Buffer} chunk\n * @param {string} _encoding\n * @param {Function} callback\n * @returns {void}\n */\n _transform (chunk, _encoding, callback) {\n if (chunk.length === 0) {\n callback()\n return\n }\n\n // Cache the chunk in the buffer, as the data might not be complete while\n // processing it\n // TODO: Investigate if there is a more performant way to handle\n // incoming chunks\n // see: https://github.com/nodejs/undici/issues/2630\n if (this.buffer) {\n this.buffer = Buffer.concat([this.buffer, chunk])\n } else {\n this.buffer = chunk\n }\n\n // Strip leading byte-order-mark if we opened the stream and started\n // the processing of the incoming data\n if (this.checkBOM) {\n switch (this.buffer.length) {\n case 1:\n // Check if the first byte is the same as the first byte of the BOM\n if (this.buffer[0] === BOM[0]) {\n // If it is, we need to wait for more data\n callback()\n return\n }\n // Set the checkBOM flag to false as we don't need to check for the\n // BOM anymore\n this.checkBOM = false\n\n // The buffer only contains one byte so we need to wait for more data\n callback()\n return\n case 2:\n // Check if the first two bytes are the same as the first two bytes\n // of the BOM\n if (\n this.buffer[0] === BOM[0] &&\n this.buffer[1] === BOM[1]\n ) {\n // If it is, we need to wait for more data, because the third byte\n // is needed to determine if it is the BOM or not\n callback()\n return\n }\n\n // Set the checkBOM flag to false as we don't need to check for the\n // BOM anymore\n this.checkBOM = false\n break\n case 3:\n // Check if the first three bytes are the same as the first three\n // bytes of the BOM\n if (\n this.buffer[0] === BOM[0] &&\n this.buffer[1] === BOM[1] &&\n this.buffer[2] === BOM[2]\n ) {\n // If it is, we can drop the buffered data, as it is only the BOM\n this.buffer = Buffer.alloc(0)\n // Set the checkBOM flag to false as we don't need to check for the\n // BOM anymore\n this.checkBOM = false\n\n // Await more data\n callback()\n return\n }\n // If it is not the BOM, we can start processing the data\n this.checkBOM = false\n break\n default:\n // The buffer is longer than 3 bytes, so we can drop the BOM if it is\n // present\n if (\n this.buffer[0] === BOM[0] &&\n this.buffer[1] === BOM[1] &&\n this.buffer[2] === BOM[2]\n ) {\n // Remove the BOM from the buffer\n this.buffer = this.buffer.subarray(3)\n }\n\n // Set the checkBOM flag to false as we don't need to check for the\n this.checkBOM = false\n break\n }\n }\n\n while (this.pos < this.buffer.length) {\n // If the previous line ended with an end-of-line, we need to check\n // if the next character is also an end-of-line.\n if (this.eventEndCheck) {\n // If the the current character is an end-of-line, then the event\n // is finished and we can process it\n\n // If the previous line ended with a carriage return, we need to\n // check if the current character is a line feed and remove it\n // from the buffer.\n if (this.crlfCheck) {\n // If the current character is a line feed, we can remove it\n // from the buffer and reset the crlfCheck flag\n if (this.buffer[this.pos] === LF) {\n this.buffer = this.buffer.subarray(this.pos + 1)\n this.pos = 0\n this.crlfCheck = false\n\n // It is possible that the line feed is not the end of the\n // event. We need to check if the next character is an\n // end-of-line character to determine if the event is\n // finished. We simply continue the loop to check the next\n // character.\n\n // As we removed the line feed from the buffer and set the\n // crlfCheck flag to false, we basically don't make any\n // distinction between a line feed and a carriage return.\n continue\n }\n this.crlfCheck = false\n }\n\n if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {\n // If the current character is a carriage return, we need to\n // set the crlfCheck flag to true, as we need to check if the\n // next character is a line feed so we can remove it from the\n // buffer\n if (this.buffer[this.pos] === CR) {\n this.crlfCheck = true\n }\n\n this.buffer = this.buffer.subarray(this.pos + 1)\n this.pos = 0\n if (\n this.event.data !== undefined || this.event.event || this.event.id !== undefined || this.event.retry) {\n this.processEvent(this.event)\n }\n this.clearEvent()\n continue\n }\n // If the current character is not an end-of-line, then the event\n // is not finished and we have to reset the eventEndCheck flag\n this.eventEndCheck = false\n continue\n }\n\n // If the current character is an end-of-line, we can process the\n // line\n if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {\n // If the current character is a carriage return, we need to\n // set the crlfCheck flag to true, as we need to check if the\n // next character is a line feed\n if (this.buffer[this.pos] === CR) {\n this.crlfCheck = true\n }\n\n // In any case, we can process the line as we reached an\n // end-of-line character\n this.parseLine(this.buffer.subarray(0, this.pos), this.event)\n\n // Remove the processed line from the buffer\n this.buffer = this.buffer.subarray(this.pos + 1)\n // Reset the position as we removed the processed line from the buffer\n this.pos = 0\n // A line was processed and this could be the end of the event. We need\n // to check if the next line is empty to determine if the event is\n // finished.\n this.eventEndCheck = true\n continue\n }\n\n this.pos++\n }\n\n callback()\n }\n\n /**\n * @param {Buffer} line\n * @param {EventSourceStreamEvent} event\n */\n parseLine (line, event) {\n // If the line is empty (a blank line)\n // Dispatch the event, as defined below.\n // This will be handled in the _transform method\n if (line.length === 0) {\n return\n }\n\n // If the line starts with a U+003A COLON character (:)\n // Ignore the line.\n const colonPosition = line.indexOf(COLON)\n if (colonPosition === 0) {\n return\n }\n\n let field = ''\n let value = ''\n\n // If the line contains a U+003A COLON character (:)\n if (colonPosition !== -1) {\n // Collect the characters on the line before the first U+003A COLON\n // character (:), and let field be that string.\n // TODO: Investigate if there is a more performant way to extract the\n // field\n // see: https://github.com/nodejs/undici/issues/2630\n field = line.subarray(0, colonPosition).toString('utf8')\n\n // Collect the characters on the line after the first U+003A COLON\n // character (:), and let value be that string.\n // If value starts with a U+0020 SPACE character, remove it from value.\n let valueStart = colonPosition + 1\n if (line[valueStart] === SPACE) {\n ++valueStart\n }\n // TODO: Investigate if there is a more performant way to extract the\n // value\n // see: https://github.com/nodejs/undici/issues/2630\n value = line.subarray(valueStart).toString('utf8')\n\n // Otherwise, the string is not empty but does not contain a U+003A COLON\n // character (:)\n } else {\n // Process the field using the steps described below, using the whole\n // line as the field name, and the empty string as the field value.\n field = line.toString('utf8')\n value = ''\n }\n\n // Modify the event with the field name and value. The value is also\n // decoded as UTF-8\n switch (field) {\n case 'data':\n if (event[field] === undefined) {\n event[field] = value\n } else {\n event[field] += `\\n${value}`\n }\n break\n case 'retry':\n if (isASCIINumber(value)) {\n event[field] = value\n }\n break\n case 'id':\n if (isValidLastEventId(value)) {\n event[field] = value\n }\n break\n case 'event':\n if (value.length > 0) {\n event[field] = value\n }\n break\n }\n }\n\n /**\n * @param {EventSourceStreamEvent} event\n */\n processEvent (event) {\n if (event.retry && isASCIINumber(event.retry)) {\n this.state.reconnectionTime = parseInt(event.retry, 10)\n }\n\n if (event.id !== undefined && isValidLastEventId(event.id)) {\n this.state.lastEventId = event.id\n }\n\n // only dispatch event, when data is provided\n if (event.data !== undefined) {\n this.push({\n type: event.event || 'message',\n options: {\n data: event.data,\n lastEventId: this.state.lastEventId,\n origin: this.state.origin\n }\n })\n }\n }\n\n clearEvent () {\n this.event = {\n data: undefined,\n event: undefined,\n id: undefined,\n retry: undefined\n }\n }\n}\n\nmodule.exports = {\n EventSourceStream\n}\n","'use strict'\n\nconst { pipeline } = require('node:stream')\nconst { fetching } = require('../fetch')\nconst { makeRequest } = require('../fetch/request')\nconst { webidl } = require('../webidl')\nconst { EventSourceStream } = require('./eventsource-stream')\nconst { parseMIMEType } = require('../fetch/data-url')\nconst { createFastMessageEvent } = require('../websocket/events')\nconst { isNetworkError } = require('../fetch/response')\nconst { kEnumerableProperty } = require('../../core/util')\nconst { environmentSettingsObject } = require('../fetch/util')\n\nlet experimentalWarned = false\n\n/**\n * A reconnection time, in milliseconds. This must initially be an implementation-defined value,\n * probably in the region of a few seconds.\n *\n * In Comparison:\n * - Chrome uses 3000ms.\n * - Deno uses 5000ms.\n *\n * @type {3000}\n */\nconst defaultReconnectionTime = 3000\n\n/**\n * The readyState attribute represents the state of the connection.\n * @typedef ReadyState\n * @type {0|1|2}\n * @readonly\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev\n */\n\n/**\n * The connection has not yet been established, or it was closed and the user\n * agent is reconnecting.\n * @type {0}\n */\nconst CONNECTING = 0\n\n/**\n * The user agent has an open connection and is dispatching events as it\n * receives them.\n * @type {1}\n */\nconst OPEN = 1\n\n/**\n * The connection is not open, and the user agent is not trying to reconnect.\n * @type {2}\n */\nconst CLOSED = 2\n\n/**\n * Requests for the element will have their mode set to \"cors\" and their credentials mode set to \"same-origin\".\n * @type {'anonymous'}\n */\nconst ANONYMOUS = 'anonymous'\n\n/**\n * Requests for the element will have their mode set to \"cors\" and their credentials mode set to \"include\".\n * @type {'use-credentials'}\n */\nconst USE_CREDENTIALS = 'use-credentials'\n\n/**\n * The EventSource interface is used to receive server-sent events. It\n * connects to a server over HTTP and receives events in text/event-stream\n * format without closing the connection.\n * @extends {EventTarget}\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n * @api public\n */\nclass EventSource extends EventTarget {\n #events = {\n open: null,\n error: null,\n message: null\n }\n\n #url\n #withCredentials = false\n\n /**\n * @type {ReadyState}\n */\n #readyState = CONNECTING\n\n #request = null\n #controller = null\n\n #dispatcher\n\n /**\n * @type {import('./eventsource-stream').eventSourceSettings}\n */\n #state\n\n /**\n * Creates a new EventSource object.\n * @param {string} url\n * @param {EventSourceInit} [eventSourceInitDict={}]\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface\n */\n constructor (url, eventSourceInitDict = {}) {\n // 1. Let ev be a new EventSource object.\n super()\n\n webidl.util.markAsUncloneable(this)\n\n const prefix = 'EventSource constructor'\n webidl.argumentLengthCheck(arguments, 1, prefix)\n\n if (!experimentalWarned) {\n experimentalWarned = true\n process.emitWarning('EventSource is experimental, expect them to change at any time.', {\n code: 'UNDICI-ES'\n })\n }\n\n url = webidl.converters.USVString(url)\n eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict')\n\n this.#dispatcher = eventSourceInitDict.node.dispatcher || eventSourceInitDict.dispatcher\n this.#state = {\n lastEventId: '',\n reconnectionTime: eventSourceInitDict.node.reconnectionTime\n }\n\n // 2. Let settings be ev's relevant settings object.\n // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object\n const settings = environmentSettingsObject\n\n let urlRecord\n\n try {\n // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings.\n urlRecord = new URL(url, settings.settingsObject.baseUrl)\n this.#state.origin = urlRecord.origin\n } catch (e) {\n // 4. If urlRecord is failure, then throw a \"SyntaxError\" DOMException.\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 5. Set ev's url to urlRecord.\n this.#url = urlRecord.href\n\n // 6. Let corsAttributeState be Anonymous.\n let corsAttributeState = ANONYMOUS\n\n // 7. If the value of eventSourceInitDict's withCredentials member is true,\n // then set corsAttributeState to Use Credentials and set ev's\n // withCredentials attribute to true.\n if (eventSourceInitDict.withCredentials === true) {\n corsAttributeState = USE_CREDENTIALS\n this.#withCredentials = true\n }\n\n // 8. Let request be the result of creating a potential-CORS request given\n // urlRecord, the empty string, and corsAttributeState.\n const initRequest = {\n redirect: 'follow',\n keepalive: true,\n // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes\n mode: 'cors',\n credentials: corsAttributeState === 'anonymous'\n ? 'same-origin'\n : 'omit',\n referrer: 'no-referrer'\n }\n\n // 9. Set request's client to settings.\n initRequest.client = environmentSettingsObject.settingsObject\n\n // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list.\n initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]]\n\n // 11. Set request's cache mode to \"no-store\".\n initRequest.cache = 'no-store'\n\n // 12. Set request's initiator type to \"other\".\n initRequest.initiator = 'other'\n\n initRequest.urlList = [new URL(this.#url)]\n\n // 13. Set ev's request to request.\n this.#request = makeRequest(initRequest)\n\n this.#connect()\n }\n\n /**\n * Returns the state of this EventSource object's connection. It can have the\n * values described below.\n * @returns {ReadyState}\n * @readonly\n */\n get readyState () {\n return this.#readyState\n }\n\n /**\n * Returns the URL providing the event stream.\n * @readonly\n * @returns {string}\n */\n get url () {\n return this.#url\n }\n\n /**\n * Returns a boolean indicating whether the EventSource object was\n * instantiated with CORS credentials set (true), or not (false, the default).\n */\n get withCredentials () {\n return this.#withCredentials\n }\n\n #connect () {\n if (this.#readyState === CLOSED) return\n\n this.#readyState = CONNECTING\n\n const fetchParams = {\n request: this.#request,\n dispatcher: this.#dispatcher\n }\n\n // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection.\n const processEventSourceEndOfBody = (response) => {\n if (!isNetworkError(response)) {\n return this.#reconnect()\n }\n }\n\n // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody...\n fetchParams.processResponseEndOfBody = processEventSourceEndOfBody\n\n // and processResponse set to the following steps given response res:\n fetchParams.processResponse = (response) => {\n // 1. If res is an aborted network error, then fail the connection.\n\n if (isNetworkError(response)) {\n // 1. When a user agent is to fail the connection, the user agent\n // must queue a task which, if the readyState attribute is set to a\n // value other than CLOSED, sets the readyState attribute to CLOSED\n // and fires an event named error at the EventSource object. Once the\n // user agent has failed the connection, it does not attempt to\n // reconnect.\n if (response.aborted) {\n this.close()\n this.dispatchEvent(new Event('error'))\n return\n // 2. Otherwise, if res is a network error, then reestablish the\n // connection, unless the user agent knows that to be futile, in\n // which case the user agent may fail the connection.\n } else {\n this.#reconnect()\n return\n }\n }\n\n // 3. Otherwise, if res's status is not 200, or if res's `Content-Type`\n // is not `text/event-stream`, then fail the connection.\n const contentType = response.headersList.get('content-type', true)\n const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure'\n const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream'\n if (\n response.status !== 200 ||\n contentTypeValid === false\n ) {\n this.close()\n this.dispatchEvent(new Event('error'))\n return\n }\n\n // 4. Otherwise, announce the connection and interpret res's body\n // line by line.\n\n // When a user agent is to announce the connection, the user agent\n // must queue a task which, if the readyState attribute is set to a\n // value other than CLOSED, sets the readyState attribute to OPEN\n // and fires an event named open at the EventSource object.\n // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model\n this.#readyState = OPEN\n this.dispatchEvent(new Event('open'))\n\n // If redirected to a different origin, set the origin to the new origin.\n this.#state.origin = response.urlList[response.urlList.length - 1].origin\n\n const eventSourceStream = new EventSourceStream({\n eventSourceSettings: this.#state,\n push: (event) => {\n this.dispatchEvent(createFastMessageEvent(\n event.type,\n event.options\n ))\n }\n })\n\n pipeline(response.body.stream,\n eventSourceStream,\n (error) => {\n if (\n error?.aborted === false\n ) {\n this.close()\n this.dispatchEvent(new Event('error'))\n }\n })\n }\n\n this.#controller = fetching(fetchParams)\n }\n\n /**\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model\n * @returns {void}\n */\n #reconnect () {\n // When a user agent is to reestablish the connection, the user agent must\n // run the following steps. These steps are run in parallel, not as part of\n // a task. (The tasks that it queues, of course, are run like normal tasks\n // and not themselves in parallel.)\n\n // 1. Queue a task to run the following steps:\n\n // 1. If the readyState attribute is set to CLOSED, abort the task.\n if (this.#readyState === CLOSED) return\n\n // 2. Set the readyState attribute to CONNECTING.\n this.#readyState = CONNECTING\n\n // 3. Fire an event named error at the EventSource object.\n this.dispatchEvent(new Event('error'))\n\n // 2. Wait a delay equal to the reconnection time of the event source.\n setTimeout(() => {\n // 5. Queue a task to run the following steps:\n\n // 1. If the EventSource object's readyState attribute is not set to\n // CONNECTING, then return.\n if (this.#readyState !== CONNECTING) return\n\n // 2. Let request be the EventSource object's request.\n // 3. If the EventSource object's last event ID string is not the empty\n // string, then:\n // 1. Let lastEventIDValue be the EventSource object's last event ID\n // string, encoded as UTF-8.\n // 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header\n // list.\n if (this.#state.lastEventId.length) {\n this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)\n }\n\n // 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.\n this.#connect()\n }, this.#state.reconnectionTime)?.unref()\n }\n\n /**\n * Closes the connection, if any, and sets the readyState attribute to\n * CLOSED.\n */\n close () {\n webidl.brandCheck(this, EventSource)\n\n if (this.#readyState === CLOSED) return\n this.#readyState = CLOSED\n this.#controller.abort()\n this.#request = null\n }\n\n get onopen () {\n return this.#events.open\n }\n\n set onopen (fn) {\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('open', listener)\n this.#events.open = fn\n } else {\n this.#events.open = null\n }\n }\n\n get onmessage () {\n return this.#events.message\n }\n\n set onmessage (fn) {\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('message', listener)\n this.#events.message = fn\n } else {\n this.#events.message = null\n }\n }\n\n get onerror () {\n return this.#events.error\n }\n\n set onerror (fn) {\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n const listener = webidl.converters.EventHandlerNonNull(fn)\n\n if (listener !== null) {\n this.addEventListener('error', listener)\n this.#events.error = fn\n } else {\n this.#events.error = null\n }\n }\n}\n\nconst constantsPropertyDescriptors = {\n CONNECTING: {\n __proto__: null,\n configurable: false,\n enumerable: true,\n value: CONNECTING,\n writable: false\n },\n OPEN: {\n __proto__: null,\n configurable: false,\n enumerable: true,\n value: OPEN,\n writable: false\n },\n CLOSED: {\n __proto__: null,\n configurable: false,\n enumerable: true,\n value: CLOSED,\n writable: false\n }\n}\n\nObject.defineProperties(EventSource, constantsPropertyDescriptors)\nObject.defineProperties(EventSource.prototype, constantsPropertyDescriptors)\n\nObject.defineProperties(EventSource.prototype, {\n close: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n onopen: kEnumerableProperty,\n readyState: kEnumerableProperty,\n url: kEnumerableProperty,\n withCredentials: kEnumerableProperty\n})\n\nwebidl.converters.EventSourceInitDict = webidl.dictionaryConverter([\n {\n key: 'withCredentials',\n converter: webidl.converters.boolean,\n defaultValue: () => false\n },\n {\n key: 'dispatcher', // undici only\n converter: webidl.converters.any\n },\n {\n key: 'node', // undici only\n converter: webidl.dictionaryConverter([\n {\n key: 'reconnectionTime',\n converter: webidl.converters['unsigned long'],\n defaultValue: () => defaultReconnectionTime\n },\n {\n key: 'dispatcher',\n converter: webidl.converters.any\n }\n ]),\n defaultValue: () => ({})\n }\n])\n\nmodule.exports = {\n EventSource,\n defaultReconnectionTime\n}\n","'use strict'\n\nconst Client = require('./lib/dispatcher/client')\nconst Dispatcher = require('./lib/dispatcher/dispatcher')\nconst Pool = require('./lib/dispatcher/pool')\nconst BalancedPool = require('./lib/dispatcher/balanced-pool')\nconst RoundRobinPool = require('./lib/dispatcher/round-robin-pool')\nconst Agent = require('./lib/dispatcher/agent')\nconst Dispatcher1Wrapper = require('./lib/dispatcher/dispatcher1-wrapper')\nconst ProxyAgent = require('./lib/dispatcher/proxy-agent')\nconst Socks5ProxyAgent = require('./lib/dispatcher/socks5-proxy-agent')\nconst EnvHttpProxyAgent = require('./lib/dispatcher/env-http-proxy-agent')\nconst RetryAgent = require('./lib/dispatcher/retry-agent')\nconst H2CClient = require('./lib/dispatcher/h2c-client')\nconst errors = require('./lib/core/errors')\nconst util = require('./lib/core/util')\nconst { InvalidArgumentError } = errors\nconst api = require('./lib/api')\nconst buildConnector = require('./lib/core/connect')\nconst MockClient = require('./lib/mock/mock-client')\nconst { MockCallHistory, MockCallHistoryLog } = require('./lib/mock/mock-call-history')\nconst MockAgent = require('./lib/mock/mock-agent')\nconst MockPool = require('./lib/mock/mock-pool')\nconst SnapshotAgent = require('./lib/mock/snapshot-agent')\nconst mockErrors = require('./lib/mock/mock-errors')\nconst RetryHandler = require('./lib/handler/retry-handler')\nconst { getGlobalDispatcher, setGlobalDispatcher } = require('./lib/global')\nconst DecoratorHandler = require('./lib/handler/decorator-handler')\nconst RedirectHandler = require('./lib/handler/redirect-handler')\n\nObject.assign(Dispatcher.prototype, api)\n\nmodule.exports.Dispatcher = Dispatcher\nmodule.exports.Client = Client\nmodule.exports.Pool = Pool\nmodule.exports.BalancedPool = BalancedPool\nmodule.exports.RoundRobinPool = RoundRobinPool\nmodule.exports.Agent = Agent\nmodule.exports.Dispatcher1Wrapper = Dispatcher1Wrapper\nmodule.exports.ProxyAgent = ProxyAgent\nmodule.exports.Socks5ProxyAgent = Socks5ProxyAgent\nmodule.exports.EnvHttpProxyAgent = EnvHttpProxyAgent\nmodule.exports.RetryAgent = RetryAgent\nmodule.exports.H2CClient = H2CClient\nmodule.exports.RetryHandler = RetryHandler\n\nmodule.exports.DecoratorHandler = DecoratorHandler\nmodule.exports.RedirectHandler = RedirectHandler\nmodule.exports.interceptors = {\n redirect: require('./lib/interceptor/redirect'),\n responseError: require('./lib/interceptor/response-error'),\n retry: require('./lib/interceptor/retry'),\n dump: require('./lib/interceptor/dump'),\n dns: require('./lib/interceptor/dns'),\n cache: require('./lib/interceptor/cache'),\n decompress: require('./lib/interceptor/decompress'),\n deduplicate: require('./lib/interceptor/deduplicate')\n}\n\nmodule.exports.cacheStores = {\n MemoryCacheStore: require('./lib/cache/memory-cache-store')\n}\n\nconst SqliteCacheStore = require('./lib/cache/sqlite-cache-store')\nmodule.exports.cacheStores.SqliteCacheStore = SqliteCacheStore\n\nmodule.exports.buildConnector = buildConnector\nmodule.exports.errors = errors\nmodule.exports.util = {\n parseHeaders: util.parseHeaders,\n headerNameToString: util.headerNameToString\n}\n\nfunction makeDispatcher (fn) {\n return (url, opts, handler) => {\n if (typeof opts === 'function') {\n handler = opts\n opts = null\n }\n\n if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) {\n throw new InvalidArgumentError('invalid url')\n }\n\n if (opts != null && typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (opts && opts.path != null) {\n if (typeof opts.path !== 'string') {\n throw new InvalidArgumentError('invalid opts.path')\n }\n\n let path = opts.path\n if (!opts.path.startsWith('/')) {\n path = `/${path}`\n }\n\n url = new URL(util.parseOrigin(url).origin + path)\n } else {\n if (!opts) {\n opts = typeof url === 'object' ? url : {}\n }\n\n url = util.parseURL(url)\n }\n\n const { agent, dispatcher = getGlobalDispatcher(), ...restOpts } = opts\n\n if (agent) {\n throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?')\n }\n\n return fn.call(dispatcher, {\n ...restOpts,\n origin: url.origin,\n path: url.search ? `${url.pathname}${url.search}` : url.pathname,\n method: opts.method || (opts.body ? 'PUT' : 'GET')\n }, handler)\n }\n}\n\nmodule.exports.setGlobalDispatcher = setGlobalDispatcher\nmodule.exports.getGlobalDispatcher = getGlobalDispatcher\n\nconst fetchImpl = require('./lib/web/fetch').fetch\n\n// Capture __filename at module load time for stack trace augmentation.\n// This may be undefined when bundled in environments like Node.js internals.\nconst currentFilename = typeof __filename !== 'undefined' ? __filename : undefined\n\nfunction appendFetchStackTrace (err, filename) {\n if (!err || typeof err !== 'object') {\n return\n }\n\n const stack = typeof err.stack === 'string' ? err.stack : ''\n const normalizedFilename = filename.replace(/\\\\/g, '/')\n\n if (stack && (stack.includes(filename) || stack.includes(normalizedFilename))) {\n return\n }\n\n const capture = {}\n Error.captureStackTrace(capture, appendFetchStackTrace)\n\n if (!capture.stack) {\n return\n }\n\n const captureLines = capture.stack.split('\\n').slice(1).join('\\n')\n\n err.stack = stack ? `${stack}\\n${captureLines}` : capture.stack\n}\n\nmodule.exports.fetch = function fetch (init, options = undefined) {\n return fetchImpl(init, options).catch(err => {\n if (currentFilename) {\n appendFetchStackTrace(err, currentFilename)\n } else if (err && typeof err === 'object') {\n Error.captureStackTrace(err, module.exports.fetch)\n }\n throw err\n })\n}\nmodule.exports.Headers = require('./lib/web/fetch/headers').Headers\nmodule.exports.Response = require('./lib/web/fetch/response').Response\nmodule.exports.Request = require('./lib/web/fetch/request').Request\nmodule.exports.FormData = require('./lib/web/fetch/formdata').FormData\n\nconst { setGlobalOrigin, getGlobalOrigin } = require('./lib/web/fetch/global')\n\nmodule.exports.setGlobalOrigin = setGlobalOrigin\nmodule.exports.getGlobalOrigin = getGlobalOrigin\n\nconst { CacheStorage } = require('./lib/web/cache/cachestorage')\nconst { kConstruct } = require('./lib/core/symbols')\n\nmodule.exports.caches = new CacheStorage(kConstruct)\n\nconst { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = require('./lib/web/cookies')\n\nmodule.exports.deleteCookie = deleteCookie\nmodule.exports.getCookies = getCookies\nmodule.exports.getSetCookies = getSetCookies\nmodule.exports.setCookie = setCookie\nmodule.exports.parseCookie = parseCookie\n\nconst { parseMIMEType, serializeAMimeType } = require('./lib/web/fetch/data-url')\n\nmodule.exports.parseMIMEType = parseMIMEType\nmodule.exports.serializeAMimeType = serializeAMimeType\n\nconst { CloseEvent, ErrorEvent, MessageEvent } = require('./lib/web/websocket/events')\nconst { WebSocket, ping } = require('./lib/web/websocket/websocket')\nmodule.exports.WebSocket = WebSocket\nmodule.exports.CloseEvent = CloseEvent\nmodule.exports.ErrorEvent = ErrorEvent\nmodule.exports.MessageEvent = MessageEvent\nmodule.exports.ping = ping\n\nmodule.exports.WebSocketStream = require('./lib/web/websocket/stream/websocketstream').WebSocketStream\nmodule.exports.WebSocketError = require('./lib/web/websocket/stream/websocketerror').WebSocketError\n\nmodule.exports.request = makeDispatcher(api.request)\nmodule.exports.stream = makeDispatcher(api.stream)\nmodule.exports.pipeline = makeDispatcher(api.pipeline)\nmodule.exports.connect = makeDispatcher(api.connect)\nmodule.exports.upgrade = makeDispatcher(api.upgrade)\n\nmodule.exports.MockClient = MockClient\nmodule.exports.MockCallHistory = MockCallHistory\nmodule.exports.MockCallHistoryLog = MockCallHistoryLog\nmodule.exports.MockPool = MockPool\nmodule.exports.MockAgent = MockAgent\nmodule.exports.SnapshotAgent = SnapshotAgent\nmodule.exports.mockErrors = mockErrors\n\nconst { EventSource } = require('./lib/web/eventsource/eventsource')\n\nmodule.exports.EventSource = EventSource\n\nfunction install () {\n globalThis.fetch = module.exports.fetch\n globalThis.Headers = module.exports.Headers\n globalThis.Response = module.exports.Response\n globalThis.Request = module.exports.Request\n globalThis.FormData = module.exports.FormData\n globalThis.WebSocket = module.exports.WebSocket\n globalThis.CloseEvent = module.exports.CloseEvent\n globalThis.ErrorEvent = module.exports.ErrorEvent\n globalThis.MessageEvent = module.exports.MessageEvent\n globalThis.EventSource = module.exports.EventSource\n}\n\nmodule.exports.install = install\n","/**\n * Solana USDC Balance Monitor\n *\n * Checks USDC balance on Solana mainnet with caching.\n * Absorbed from @blockrun/clawwallet's solana-adapter.ts (balance portion only).\n */\n\nimport { address as solAddress, createSolanaRpc } from \"@solana/kit\";\n\nconst SOLANA_USDC_MINT = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nconst SOLANA_DEFAULT_RPC = \"https://api.mainnet-beta.solana.com\";\nconst BALANCE_TIMEOUT_MS = 10_000;\nconst CACHE_TTL_MS = 30_000;\n\nexport type SolanaBalanceInfo = {\n balance: bigint;\n balanceUSD: string;\n isLow: boolean;\n isEmpty: boolean;\n walletAddress: string;\n};\n\n/** Result from checkSufficient() */\nexport type SolanaSufficiencyResult = {\n sufficient: boolean;\n info: SolanaBalanceInfo;\n shortfall?: string;\n};\n\nexport class SolanaBalanceMonitor {\n private readonly rpc: ReturnType;\n private readonly walletAddress: string;\n private cachedBalance: bigint | null = null;\n private cachedAt = 0;\n\n constructor(walletAddress: string, rpcUrl?: string) {\n this.walletAddress = walletAddress;\n const url = rpcUrl || process[\"env\"].CLAWROUTER_SOLANA_RPC_URL || SOLANA_DEFAULT_RPC;\n this.rpc = createSolanaRpc(url);\n }\n\n async checkBalance(): Promise {\n const now = Date.now();\n if (\n this.cachedBalance !== null &&\n this.cachedBalance > 0n &&\n now - this.cachedAt < CACHE_TTL_MS\n ) {\n return this.buildInfo(this.cachedBalance);\n }\n // Zero balance is never cached — always re-fetch so a funded wallet is\n // detected on the next request without waiting for cache expiry.\n const balance = await this.fetchBalance();\n if (balance > 0n) {\n this.cachedBalance = balance;\n this.cachedAt = now;\n }\n return this.buildInfo(balance);\n }\n\n deductEstimated(amountMicros: bigint): void {\n if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) {\n this.cachedBalance -= amountMicros;\n }\n }\n\n invalidate(): void {\n this.cachedBalance = null;\n this.cachedAt = 0;\n }\n\n async refresh(): Promise {\n this.invalidate();\n return this.checkBalance();\n }\n\n /**\n * Check if balance is sufficient for an estimated cost.\n */\n async checkSufficient(estimatedCostMicros: bigint): Promise {\n const info = await this.checkBalance();\n if (info.balance >= estimatedCostMicros) {\n return { sufficient: true, info };\n }\n const shortfall = estimatedCostMicros - info.balance;\n return {\n sufficient: false,\n info,\n shortfall: this.formatUSDC(shortfall),\n };\n }\n\n /**\n * Format USDC amount (in micros) as \"$X.XX\".\n */\n formatUSDC(amountMicros: bigint): string {\n const dollars = Number(amountMicros) / 1_000_000;\n return `$${dollars.toFixed(2)}`;\n }\n\n getWalletAddress(): string {\n return this.walletAddress;\n }\n\n /**\n * Check native SOL balance (in lamports). Useful for detecting users who\n * funded with SOL instead of USDC.\n */\n async checkSolBalance(): Promise {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS);\n try {\n const owner = solAddress(this.walletAddress);\n const response = await this.rpc.getBalance(owner).send({ abortSignal: controller.signal });\n return BigInt(response.value);\n } catch {\n return 0n;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async fetchBalance(): Promise {\n const owner = solAddress(this.walletAddress);\n const mint = solAddress(SOLANA_USDC_MINT);\n\n // The public Solana RPC frequently returns empty token account lists even\n // for funded wallets. Retry up to 3 times on empty/error before accepting $0.\n // Rate-limited or flaky RPC calls should not silently zero out a funded wallet.\n const MAX_ATTEMPTS = 3;\n let lastError: unknown;\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n try {\n const result = await this.fetchBalanceOnce(owner, mint);\n if (result > 0n) return result;\n // Got 0 — might be RPC returning empty for a funded wallet.\n // Retry unless this is the last attempt.\n if (attempt < MAX_ATTEMPTS - 1) {\n await new Promise((r) => setTimeout(r, 1_500 * (attempt + 1)));\n }\n } catch (err) {\n lastError = err;\n if (attempt < MAX_ATTEMPTS - 1) {\n await new Promise((r) => setTimeout(r, 1_500 * (attempt + 1)));\n }\n }\n }\n // If all attempts threw, re-throw so callers can distinguish RPC failure from actual $0.\n if (lastError !== undefined) throw lastError;\n return 0n;\n }\n\n private async fetchBalanceOnce(\n owner: ReturnType,\n mint: ReturnType,\n ): Promise {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), BALANCE_TIMEOUT_MS);\n\n try {\n const response = await this.rpc\n .getTokenAccountsByOwner(owner, { mint }, { encoding: \"jsonParsed\" })\n .send({ abortSignal: controller.signal });\n\n if (response.value.length === 0) return 0n;\n\n let total = 0n;\n for (const account of response.value) {\n const parsed = account.account.data as {\n parsed: { info: { tokenAmount: { amount: string } } };\n };\n total += BigInt(parsed.parsed.info.tokenAmount.amount);\n }\n return total;\n } catch (err) {\n throw new Error(\n `Failed to fetch Solana USDC balance: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n private buildInfo(balance: bigint): SolanaBalanceInfo {\n const dollars = Number(balance) / 1_000_000;\n return {\n balance,\n balanceUSD: `$${dollars.toFixed(2)}`,\n isLow: balance < 1_000_000n,\n isEmpty: balance < 100n,\n walletAddress: this.walletAddress,\n };\n }\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\n\nexport type Mint = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: Option
;\n /** Total supply of tokens. */\n supply: bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: Option
;\n};\n\nexport type MintArgs = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: OptionOrNullable
;\n /** Total supply of tokens. */\n supply: number | bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: OptionOrNullable
;\n};\n\nexport function getMintEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n [\n 'mintAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n [\n 'freezeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getMintDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n [\n 'mintAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n [\n 'freezeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getMintCodec(): FixedSizeCodec {\n return combineCodec(getMintEncoder(), getMintDecoder());\n}\n\nexport function decodeMint(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMint(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMint(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMintDecoder()\n );\n}\n\nexport async function fetchMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMint(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMint(maybeAccount);\n}\n\nexport async function fetchAllMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMint(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMint(maybeAccount));\n}\n\nexport function getMintSize(): number {\n return 82;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n} from '@solana/kit';\n\nexport type Multisig = {\n /** Number of signers required. */\n m: number;\n /** Number of valid signers. */\n n: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Signer public keys. */\n signers: Array
;\n};\n\nexport type MultisigArgs = Multisig;\n\nexport function getMultisigEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['m', getU8Encoder()],\n ['n', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n ['signers', getArrayEncoder(getAddressEncoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['m', getU8Decoder()],\n ['n', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n ['signers', getArrayDecoder(getAddressDecoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigCodec(): FixedSizeCodec {\n return combineCodec(getMultisigEncoder(), getMultisigDecoder());\n}\n\nexport function decodeMultisig(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMultisig(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMultisig(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMultisigDecoder()\n );\n}\n\nexport async function fetchMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMultisig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMultisig(maybeAccount);\n}\n\nexport async function fetchAllMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMultisig(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMultisig(maybeAccount));\n}\n\nexport function getMultisigSize(): number {\n return 355;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AccountState {\n Uninitialized,\n Initialized,\n Frozen,\n}\n\nexport type AccountStateArgs = AccountState;\n\nexport function getAccountStateEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AccountState);\n}\n\nexport function getAccountStateDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AccountState);\n}\n\nexport function getAccountStateCodec(): FixedSizeCodec<\n AccountStateArgs,\n AccountState\n> {\n return combineCodec(getAccountStateEncoder(), getAccountStateDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AuthorityType {\n MintTokens,\n FreezeAccount,\n AccountOwner,\n CloseAccount,\n}\n\nexport type AuthorityTypeArgs = AuthorityType;\n\nexport function getAuthorityTypeEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AuthorityType);\n}\n\nexport function getAuthorityTypeDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AuthorityType);\n}\n\nexport function getAuthorityTypeCodec(): FixedSizeCodec<\n AuthorityTypeArgs,\n AuthorityType\n> {\n return combineCodec(getAuthorityTypeEncoder(), getAuthorityTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n type AccountState,\n type AccountStateArgs,\n} from '../types';\n\nexport type Token = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: Option
;\n /** The account's state. */\n state: AccountState;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: Option;\n /** The amount delegated. */\n delegatedAmount: bigint;\n /** Optional authority to close the account. */\n closeAuthority: Option
;\n};\n\nexport type TokenArgs = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: number | bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: OptionOrNullable
;\n /** The account's state. */\n state: AccountStateArgs;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: OptionOrNullable;\n /** The amount delegated. */\n delegatedAmount: number | bigint;\n /** Optional authority to close the account. */\n closeAuthority: OptionOrNullable
;\n};\n\nexport function getTokenEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['mint', getAddressEncoder()],\n ['owner', getAddressEncoder()],\n ['amount', getU64Encoder()],\n [\n 'delegate',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateEncoder()],\n [\n 'isNative',\n getOptionEncoder(getU64Encoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Encoder()],\n [\n 'closeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getTokenDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['mint', getAddressDecoder()],\n ['owner', getAddressDecoder()],\n ['amount', getU64Decoder()],\n [\n 'delegate',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateDecoder()],\n [\n 'isNative',\n getOptionDecoder(getU64Decoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Decoder()],\n [\n 'closeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getTokenCodec(): FixedSizeCodec {\n return combineCodec(getTokenEncoder(), getTokenDecoder());\n}\n\nexport function decodeToken(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeToken(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeToken(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getTokenDecoder()\n );\n}\n\nexport async function fetchToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeToken(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeToken(maybeAccount);\n}\n\nexport async function fetchAllToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeToken(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeToken(maybeAccount));\n}\n\nexport function getTokenSize(): number {\n return 165;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedCreateAssociatedTokenIdempotentInstruction,\n type ParsedCreateAssociatedTokenInstruction,\n type ParsedRecoverNestedAssociatedTokenInstruction,\n} from '../instructions';\n\nexport const ASSOCIATED_TOKEN_PROGRAM_ADDRESS =\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;\n\nexport enum AssociatedTokenInstruction {\n CreateAssociatedToken,\n CreateAssociatedTokenIdempotent,\n RecoverNestedAssociatedToken,\n}\n\nexport function identifyAssociatedTokenInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): AssociatedTokenInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedToken;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n }\n throw new Error(\n 'The provided instruction could not be identified as a associatedToken instruction.'\n );\n}\n\nexport type ParsedAssociatedTokenInstruction<\n TProgram extends string = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n> =\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedToken;\n } & ParsedCreateAssociatedTokenInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n } & ParsedCreateAssociatedTokenIdempotentInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n } & ParsedRecoverNestedAssociatedTokenInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedAmountToUiAmountInstruction,\n type ParsedApproveCheckedInstruction,\n type ParsedApproveInstruction,\n type ParsedBurnCheckedInstruction,\n type ParsedBurnInstruction,\n type ParsedCloseAccountInstruction,\n type ParsedFreezeAccountInstruction,\n type ParsedGetAccountDataSizeInstruction,\n type ParsedInitializeAccount2Instruction,\n type ParsedInitializeAccount3Instruction,\n type ParsedInitializeAccountInstruction,\n type ParsedInitializeImmutableOwnerInstruction,\n type ParsedInitializeMint2Instruction,\n type ParsedInitializeMintInstruction,\n type ParsedInitializeMultisig2Instruction,\n type ParsedInitializeMultisigInstruction,\n type ParsedMintToCheckedInstruction,\n type ParsedMintToInstruction,\n type ParsedRevokeInstruction,\n type ParsedSetAuthorityInstruction,\n type ParsedSyncNativeInstruction,\n type ParsedThawAccountInstruction,\n type ParsedTransferCheckedInstruction,\n type ParsedTransferInstruction,\n type ParsedUiAmountToAmountInstruction,\n} from '../instructions';\n\nexport const TOKEN_PROGRAM_ADDRESS =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n\nexport enum TokenAccount {\n Mint,\n Token,\n Multisig,\n}\n\nexport function identifyTokenAccount(\n account: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): TokenAccount {\n const data = 'data' in account ? account.data : account;\n if (data.length === 82) {\n return TokenAccount.Mint;\n }\n if (data.length === 165) {\n return TokenAccount.Token;\n }\n if (data.length === 355) {\n return TokenAccount.Multisig;\n }\n throw new Error(\n 'The provided account could not be identified as a token account.'\n );\n}\n\nexport enum TokenInstruction {\n InitializeMint,\n InitializeAccount,\n InitializeMultisig,\n Transfer,\n Approve,\n Revoke,\n SetAuthority,\n MintTo,\n Burn,\n CloseAccount,\n FreezeAccount,\n ThawAccount,\n TransferChecked,\n ApproveChecked,\n MintToChecked,\n BurnChecked,\n InitializeAccount2,\n SyncNative,\n InitializeAccount3,\n InitializeMultisig2,\n InitializeMint2,\n GetAccountDataSize,\n InitializeImmutableOwner,\n AmountToUiAmount,\n UiAmountToAmount,\n}\n\nexport function identifyTokenInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): TokenInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return TokenInstruction.InitializeMint;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return TokenInstruction.InitializeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return TokenInstruction.InitializeMultisig;\n }\n if (containsBytes(data, getU8Encoder().encode(3), 0)) {\n return TokenInstruction.Transfer;\n }\n if (containsBytes(data, getU8Encoder().encode(4), 0)) {\n return TokenInstruction.Approve;\n }\n if (containsBytes(data, getU8Encoder().encode(5), 0)) {\n return TokenInstruction.Revoke;\n }\n if (containsBytes(data, getU8Encoder().encode(6), 0)) {\n return TokenInstruction.SetAuthority;\n }\n if (containsBytes(data, getU8Encoder().encode(7), 0)) {\n return TokenInstruction.MintTo;\n }\n if (containsBytes(data, getU8Encoder().encode(8), 0)) {\n return TokenInstruction.Burn;\n }\n if (containsBytes(data, getU8Encoder().encode(9), 0)) {\n return TokenInstruction.CloseAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(10), 0)) {\n return TokenInstruction.FreezeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(11), 0)) {\n return TokenInstruction.ThawAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(12), 0)) {\n return TokenInstruction.TransferChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(13), 0)) {\n return TokenInstruction.ApproveChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(14), 0)) {\n return TokenInstruction.MintToChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(15), 0)) {\n return TokenInstruction.BurnChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(16), 0)) {\n return TokenInstruction.InitializeAccount2;\n }\n if (containsBytes(data, getU8Encoder().encode(17), 0)) {\n return TokenInstruction.SyncNative;\n }\n if (containsBytes(data, getU8Encoder().encode(18), 0)) {\n return TokenInstruction.InitializeAccount3;\n }\n if (containsBytes(data, getU8Encoder().encode(19), 0)) {\n return TokenInstruction.InitializeMultisig2;\n }\n if (containsBytes(data, getU8Encoder().encode(20), 0)) {\n return TokenInstruction.InitializeMint2;\n }\n if (containsBytes(data, getU8Encoder().encode(21), 0)) {\n return TokenInstruction.GetAccountDataSize;\n }\n if (containsBytes(data, getU8Encoder().encode(22), 0)) {\n return TokenInstruction.InitializeImmutableOwner;\n }\n if (containsBytes(data, getU8Encoder().encode(23), 0)) {\n return TokenInstruction.AmountToUiAmount;\n }\n if (containsBytes(data, getU8Encoder().encode(24), 0)) {\n return TokenInstruction.UiAmountToAmount;\n }\n throw new Error(\n 'The provided instruction could not be identified as a token instruction.'\n );\n}\n\nexport type ParsedTokenInstruction<\n TProgram extends string = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n> =\n | ({\n instructionType: TokenInstruction.InitializeMint;\n } & ParsedInitializeMintInstruction)\n | ({\n instructionType: TokenInstruction.InitializeAccount;\n } & ParsedInitializeAccountInstruction)\n | ({\n instructionType: TokenInstruction.InitializeMultisig;\n } & ParsedInitializeMultisigInstruction)\n | ({\n instructionType: TokenInstruction.Transfer;\n } & ParsedTransferInstruction)\n | ({\n instructionType: TokenInstruction.Approve;\n } & ParsedApproveInstruction)\n | ({\n instructionType: TokenInstruction.Revoke;\n } & ParsedRevokeInstruction)\n | ({\n instructionType: TokenInstruction.SetAuthority;\n } & ParsedSetAuthorityInstruction)\n | ({\n instructionType: TokenInstruction.MintTo;\n } & ParsedMintToInstruction)\n | ({\n instructionType: TokenInstruction.Burn;\n } & ParsedBurnInstruction)\n | ({\n instructionType: TokenInstruction.CloseAccount;\n } & ParsedCloseAccountInstruction)\n | ({\n instructionType: TokenInstruction.FreezeAccount;\n } & ParsedFreezeAccountInstruction)\n | ({\n instructionType: TokenInstruction.ThawAccount;\n } & ParsedThawAccountInstruction)\n | ({\n instructionType: TokenInstruction.TransferChecked;\n } & ParsedTransferCheckedInstruction)\n | ({\n instructionType: TokenInstruction.ApproveChecked;\n } & ParsedApproveCheckedInstruction)\n | ({\n instructionType: TokenInstruction.MintToChecked;\n } & ParsedMintToCheckedInstruction)\n | ({\n instructionType: TokenInstruction.BurnChecked;\n } & ParsedBurnCheckedInstruction)\n | ({\n instructionType: TokenInstruction.InitializeAccount2;\n } & ParsedInitializeAccount2Instruction)\n | ({\n instructionType: TokenInstruction.SyncNative;\n } & ParsedSyncNativeInstruction)\n | ({\n instructionType: TokenInstruction.InitializeAccount3;\n } & ParsedInitializeAccount3Instruction)\n | ({\n instructionType: TokenInstruction.InitializeMultisig2;\n } & ParsedInitializeMultisig2Instruction)\n | ({\n instructionType: TokenInstruction.InitializeMint2;\n } & ParsedInitializeMint2Instruction)\n | ({\n instructionType: TokenInstruction.GetAccountDataSize;\n } & ParsedGetAccountDataSizeInstruction)\n | ({\n instructionType: TokenInstruction.InitializeImmutableOwner;\n } & ParsedInitializeImmutableOwnerInstruction)\n | ({\n instructionType: TokenInstruction.AmountToUiAmount;\n } & ParsedAmountToUiAmountInstruction)\n | ({\n instructionType: TokenInstruction.UiAmountToAmount;\n } & ParsedUiAmountToAmountInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\n\n/** InvalidOwner: Associated token account owner does not match address derivation */\nexport const ASSOCIATED_TOKEN_ERROR__INVALID_OWNER = 0x0; // 0\n\nexport type AssociatedTokenError = typeof ASSOCIATED_TOKEN_ERROR__INVALID_OWNER;\n\nlet associatedTokenErrorMessages:\n | Record\n | undefined;\nif (process.env.NODE_ENV !== 'production') {\n associatedTokenErrorMessages = {\n [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER]: `Associated token account owner does not match address derivation`,\n };\n}\n\nexport function getAssociatedTokenErrorMessage(\n code: AssociatedTokenError\n): string {\n if (process.env.NODE_ENV !== 'production') {\n return (\n associatedTokenErrorMessages as Record\n )[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isAssociatedTokenError<\n TProgramErrorCode extends AssociatedTokenError,\n>(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\n\n/** NotRentExempt: Lamport balance below rent-exempt threshold */\nexport const TOKEN_ERROR__NOT_RENT_EXEMPT = 0x0; // 0\n/** InsufficientFunds: Insufficient funds */\nexport const TOKEN_ERROR__INSUFFICIENT_FUNDS = 0x1; // 1\n/** InvalidMint: Invalid Mint */\nexport const TOKEN_ERROR__INVALID_MINT = 0x2; // 2\n/** MintMismatch: Account not associated with this Mint */\nexport const TOKEN_ERROR__MINT_MISMATCH = 0x3; // 3\n/** OwnerMismatch: Owner does not match */\nexport const TOKEN_ERROR__OWNER_MISMATCH = 0x4; // 4\n/** FixedSupply: Fixed supply */\nexport const TOKEN_ERROR__FIXED_SUPPLY = 0x5; // 5\n/** AlreadyInUse: Already in use */\nexport const TOKEN_ERROR__ALREADY_IN_USE = 0x6; // 6\n/** InvalidNumberOfProvidedSigners: Invalid number of provided signers */\nexport const TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 0x7; // 7\n/** InvalidNumberOfRequiredSigners: Invalid number of required signers */\nexport const TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 0x8; // 8\n/** UninitializedState: State is unititialized */\nexport const TOKEN_ERROR__UNINITIALIZED_STATE = 0x9; // 9\n/** NativeNotSupported: Instruction does not support native tokens */\nexport const TOKEN_ERROR__NATIVE_NOT_SUPPORTED = 0xa; // 10\n/** NonNativeHasBalance: Non-native account can only be closed if its balance is zero */\nexport const TOKEN_ERROR__NON_NATIVE_HAS_BALANCE = 0xb; // 11\n/** InvalidInstruction: Invalid instruction */\nexport const TOKEN_ERROR__INVALID_INSTRUCTION = 0xc; // 12\n/** InvalidState: State is invalid for requested operation */\nexport const TOKEN_ERROR__INVALID_STATE = 0xd; // 13\n/** Overflow: Operation overflowed */\nexport const TOKEN_ERROR__OVERFLOW = 0xe; // 14\n/** AuthorityTypeNotSupported: Account does not support specified authority type */\nexport const TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 0xf; // 15\n/** MintCannotFreeze: This token mint cannot freeze accounts */\nexport const TOKEN_ERROR__MINT_CANNOT_FREEZE = 0x10; // 16\n/** AccountFrozen: Account is frozen */\nexport const TOKEN_ERROR__ACCOUNT_FROZEN = 0x11; // 17\n/** MintDecimalsMismatch: The provided decimals value different from the Mint decimals */\nexport const TOKEN_ERROR__MINT_DECIMALS_MISMATCH = 0x12; // 18\n/** NonNativeNotSupported: Instruction does not support non-native tokens */\nexport const TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED = 0x13; // 19\n\nexport type TokenError =\n | typeof TOKEN_ERROR__ACCOUNT_FROZEN\n | typeof TOKEN_ERROR__ALREADY_IN_USE\n | typeof TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED\n | typeof TOKEN_ERROR__FIXED_SUPPLY\n | typeof TOKEN_ERROR__INSUFFICIENT_FUNDS\n | typeof TOKEN_ERROR__INVALID_INSTRUCTION\n | typeof TOKEN_ERROR__INVALID_MINT\n | typeof TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS\n | typeof TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS\n | typeof TOKEN_ERROR__INVALID_STATE\n | typeof TOKEN_ERROR__MINT_CANNOT_FREEZE\n | typeof TOKEN_ERROR__MINT_DECIMALS_MISMATCH\n | typeof TOKEN_ERROR__MINT_MISMATCH\n | typeof TOKEN_ERROR__NATIVE_NOT_SUPPORTED\n | typeof TOKEN_ERROR__NON_NATIVE_HAS_BALANCE\n | typeof TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED\n | typeof TOKEN_ERROR__NOT_RENT_EXEMPT\n | typeof TOKEN_ERROR__OVERFLOW\n | typeof TOKEN_ERROR__OWNER_MISMATCH\n | typeof TOKEN_ERROR__UNINITIALIZED_STATE;\n\nlet tokenErrorMessages: Record | undefined;\nif (process.env.NODE_ENV !== 'production') {\n tokenErrorMessages = {\n [TOKEN_ERROR__ACCOUNT_FROZEN]: `Account is frozen`,\n [TOKEN_ERROR__ALREADY_IN_USE]: `Already in use`,\n [TOKEN_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`,\n [TOKEN_ERROR__FIXED_SUPPLY]: `Fixed supply`,\n [TOKEN_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`,\n [TOKEN_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`,\n [TOKEN_ERROR__INVALID_MINT]: `Invalid Mint`,\n [TOKEN_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`,\n [TOKEN_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`,\n [TOKEN_ERROR__INVALID_STATE]: `State is invalid for requested operation`,\n [TOKEN_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`,\n [TOKEN_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`,\n [TOKEN_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`,\n [TOKEN_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`,\n [TOKEN_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`,\n [TOKEN_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`,\n [TOKEN_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`,\n [TOKEN_ERROR__OVERFLOW]: `Operation overflowed`,\n [TOKEN_ERROR__OWNER_MISMATCH]: `Owner does not match`,\n [TOKEN_ERROR__UNINITIALIZED_STATE]: `State is unititialized`,\n };\n}\n\nexport function getTokenErrorMessage(code: TokenError): string {\n if (process.env.NODE_ENV !== 'production') {\n return (tokenErrorMessages as Record)[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isTokenError(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n TOKEN_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from '@solana/kit';\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected a value but received null or undefined.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): Address {\n if (!value) {\n throw new Error('Expected a Address.');\n }\n if (typeof value === 'object' && 'address' in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address;\n }\n return value as Address;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): ProgramDerivedAddress {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error('Expected a ProgramDerivedAddress.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): TransactionSigner {\n if (!value || !isTransactionSigner(value)) {\n throw new Error('Expected a TransactionSigner.');\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null =\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: 'omitted' | 'programId'\n) {\n return (\n account: ResolvedAccount\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === 'omitted') return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n): value is TransactionSigner {\n return (\n !!value &&\n typeof value === 'object' &&\n 'address' in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR = 23;\n\nexport function getAmountToUiAmountDiscriminatorBytes() {\n return getU8Encoder().encode(AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR);\n}\n\nexport type AmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type AmountToUiAmountInstructionData = {\n discriminator: number;\n /** The amount of tokens to reformat. */\n amount: bigint;\n};\n\nexport type AmountToUiAmountInstructionDataArgs = {\n /** The amount of tokens to reformat. */\n amount: number | bigint;\n};\n\nexport function getAmountToUiAmountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getAmountToUiAmountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getAmountToUiAmountInstructionDataCodec(): FixedSizeCodec<\n AmountToUiAmountInstructionDataArgs,\n AmountToUiAmountInstructionData\n> {\n return combineCodec(\n getAmountToUiAmountInstructionDataEncoder(),\n getAmountToUiAmountInstructionDataDecoder()\n );\n}\n\nexport type AmountToUiAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n amount: AmountToUiAmountInstructionDataArgs['amount'];\n};\n\nexport function getAmountToUiAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: AmountToUiAmountInput,\n config?: { programAddress?: TProgramAddress }\n): AmountToUiAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getAmountToUiAmountInstructionDataEncoder().encode(\n args as AmountToUiAmountInstructionDataArgs\n ),\n programAddress,\n } as AmountToUiAmountInstruction);\n}\n\nexport type ParsedAmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: AmountToUiAmountInstructionData;\n};\n\nexport function parseAmountToUiAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedAmountToUiAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getAmountToUiAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_DISCRIMINATOR = 4;\n\nexport function getApproveDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_DISCRIMINATOR);\n}\n\nexport type ApproveInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n};\n\nexport type ApproveInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n};\n\nexport function getApproveInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_DISCRIMINATOR })\n );\n}\n\nexport function getApproveInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getApproveInstructionDataCodec(): FixedSizeCodec<\n ApproveInstructionDataArgs,\n ApproveInstructionData\n> {\n return combineCodec(\n getApproveInstructionDataEncoder(),\n getApproveInstructionDataDecoder()\n );\n}\n\nexport type ApproveInput<\n TAccountSource extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getApproveInstruction<\n TAccountSource extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: ApproveInput,\n config?: { programAddress?: TProgramAddress }\n): ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveInstructionDataEncoder().encode(\n args as ApproveInstructionDataArgs\n ),\n programAddress,\n } as ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The delegate. */\n delegate: TAccountMetas[1];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ApproveInstructionData;\n};\n\nexport function parseApproveInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_CHECKED_DISCRIMINATOR = 13;\n\nexport function getApproveCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_CHECKED_DISCRIMINATOR);\n}\n\nexport type ApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type ApproveCheckedInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getApproveCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getApproveCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getApproveCheckedInstructionDataCodec(): FixedSizeCodec<\n ApproveCheckedInstructionDataArgs,\n ApproveCheckedInstructionData\n> {\n return combineCodec(\n getApproveCheckedInstructionDataEncoder(),\n getApproveCheckedInstructionDataDecoder()\n );\n}\n\nexport type ApproveCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveCheckedInstructionDataArgs['amount'];\n decimals: ApproveCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getApproveCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: ApproveCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n TAccountOwner\n >,\n config?: { programAddress?: TProgramAddress }\n): ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveCheckedInstructionDataEncoder().encode(\n args as ApproveCheckedInstructionDataArgs\n ),\n programAddress,\n } as ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The delegate. */\n delegate: TAccountMetas[2];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[3];\n };\n data: ApproveCheckedInstructionData;\n};\n\nexport function parseApproveCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_DISCRIMINATOR = 8;\n\nexport function getBurnDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_DISCRIMINATOR);\n}\n\nexport type BurnInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnInstructionData = {\n /** The amount of tokens to burn. */\n discriminator: number;\n amount: bigint;\n};\n\nexport type BurnInstructionDataArgs = { amount: number | bigint };\n\nexport function getBurnInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_DISCRIMINATOR })\n );\n}\n\nexport function getBurnInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getBurnInstructionDataCodec(): FixedSizeCodec<\n BurnInstructionDataArgs,\n BurnInstructionData\n> {\n return combineCodec(\n getBurnInstructionDataEncoder(),\n getBurnInstructionDataDecoder()\n );\n}\n\nexport type BurnInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getBurnInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: BurnInput,\n config?: { programAddress?: TProgramAddress }\n): BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnInstructionDataEncoder().encode(\n args as BurnInstructionDataArgs\n ),\n programAddress,\n } as BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnInstructionData;\n};\n\nexport function parseBurnInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_CHECKED_DISCRIMINATOR = 15;\n\nexport function getBurnCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_CHECKED_DISCRIMINATOR);\n}\n\nexport type BurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to burn. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type BurnCheckedInstructionDataArgs = {\n /** The amount of tokens to burn. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getBurnCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getBurnCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getBurnCheckedInstructionDataCodec(): FixedSizeCodec<\n BurnCheckedInstructionDataArgs,\n BurnCheckedInstructionData\n> {\n return combineCodec(\n getBurnCheckedInstructionDataEncoder(),\n getBurnCheckedInstructionDataDecoder()\n );\n}\n\nexport type BurnCheckedInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnCheckedInstructionDataArgs['amount'];\n decimals: BurnCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getBurnCheckedInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: BurnCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnCheckedInstructionDataEncoder().encode(\n args as BurnCheckedInstructionDataArgs\n ),\n programAddress,\n } as BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnCheckedInstructionData;\n};\n\nexport function parseBurnCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CLOSE_ACCOUNT_DISCRIMINATOR = 9;\n\nexport function getCloseAccountDiscriminatorBytes() {\n return getU8Encoder().encode(CLOSE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type CloseAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseAccountInstructionData = { discriminator: number };\n\nexport type CloseAccountInstructionDataArgs = {};\n\nexport function getCloseAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: CLOSE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getCloseAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCloseAccountInstructionDataCodec(): FixedSizeCodec<\n CloseAccountInstructionDataArgs,\n CloseAccountInstructionData\n> {\n return combineCodec(\n getCloseAccountInstructionDataEncoder(),\n getCloseAccountInstructionDataDecoder()\n );\n}\n\nexport type CloseAccountInput<\n TAccountAccount extends string = string,\n TAccountDestination extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to close. */\n account: Address;\n /** The destination account. */\n destination: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getCloseAccountInstruction<\n TAccountAccount extends string,\n TAccountDestination extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: CloseAccountInput,\n config?: { programAddress?: TProgramAddress }\n): CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getCloseAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedCloseAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to close. */\n account: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: CloseAccountInstructionData;\n};\n\nexport function parseCloseAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCloseAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n destination: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getCloseAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n getAddressEncoder,\n getProgramDerivedAddress,\n type Address,\n type ProgramDerivedAddress,\n} from '@solana/kit';\n\nexport type AssociatedTokenSeeds = {\n /** The wallet address of the associated token account. */\n owner: Address;\n /** The address of the token program to use. */\n tokenProgram: Address;\n /** The mint address of the associated token account. */\n mint: Address;\n};\n\nexport async function findAssociatedTokenPda(\n seeds: AssociatedTokenSeeds,\n config: { programAddress?: Address | undefined } = {}\n): Promise {\n const {\n programAddress = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>,\n } = config;\n return await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getAddressEncoder().encode(seeds.owner),\n getAddressEncoder().encode(seeds.tokenProgram),\n getAddressEncoder().encode(seeds.mint),\n ],\n });\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR = 0;\n\nexport function getCreateAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type CreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenInstructionData = { discriminator: number };\n\nexport type CreateAssociatedTokenInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenInstructionDataArgs,\n CreateAssociatedTokenInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenInstructionDataEncoder(),\n getCreateAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenInstructionData;\n};\n\nexport function parseCreateAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR = 1;\n\nexport function getCreateAssociatedTokenIdempotentDiscriminatorBytes() {\n return getU8Encoder().encode(\n CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR\n );\n}\n\nexport type CreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenIdempotentInstructionData = {\n discriminator: number;\n};\n\nexport type CreateAssociatedTokenIdempotentInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenIdempotentInstructionDataArgs,\n CreateAssociatedTokenIdempotentInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenIdempotentInstructionDataEncoder(),\n getCreateAssociatedTokenIdempotentInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenIdempotentInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenIdempotentInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenIdempotentInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenIdempotentInstructionData;\n};\n\nexport function parseCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenIdempotentInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenIdempotentInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const FREEZE_ACCOUNT_DISCRIMINATOR = 10;\n\nexport function getFreezeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(FREEZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type FreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type FreezeAccountInstructionData = { discriminator: number };\n\nexport type FreezeAccountInstructionDataArgs = {};\n\nexport function getFreezeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: FREEZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getFreezeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getFreezeAccountInstructionDataCodec(): FixedSizeCodec<\n FreezeAccountInstructionDataArgs,\n FreezeAccountInstructionData\n> {\n return combineCodec(\n getFreezeAccountInstructionDataEncoder(),\n getFreezeAccountInstructionDataDecoder()\n );\n}\n\nexport type FreezeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to freeze. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getFreezeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: FreezeAccountInput,\n config?: { programAddress?: TProgramAddress }\n): FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getFreezeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedFreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to freeze. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: FreezeAccountInstructionData;\n};\n\nexport function parseFreezeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedFreezeAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getFreezeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR = 21;\n\nexport function getGetAccountDataSizeDiscriminatorBytes() {\n return getU8Encoder().encode(GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR);\n}\n\nexport type GetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type GetAccountDataSizeInstructionData = { discriminator: number };\n\nexport type GetAccountDataSizeInstructionDataArgs = {};\n\nexport function getGetAccountDataSizeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getGetAccountDataSizeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getGetAccountDataSizeInstructionDataCodec(): FixedSizeCodec<\n GetAccountDataSizeInstructionDataArgs,\n GetAccountDataSizeInstructionData\n> {\n return combineCodec(\n getGetAccountDataSizeInstructionDataEncoder(),\n getGetAccountDataSizeInstructionDataDecoder()\n );\n}\n\nexport type GetAccountDataSizeInput = {\n /** The mint to calculate for. */\n mint: Address;\n};\n\nexport function getGetAccountDataSizeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: GetAccountDataSizeInput,\n config?: { programAddress?: TProgramAddress }\n): GetAccountDataSizeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getGetAccountDataSizeInstructionDataEncoder().encode({}),\n programAddress,\n } as GetAccountDataSizeInstruction);\n}\n\nexport type ParsedGetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: GetAccountDataSizeInstructionData;\n};\n\nexport function parseGetAccountDataSizeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedGetAccountDataSizeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getGetAccountDataSizeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT_DISCRIMINATOR = 1;\n\nexport function getInitializeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type InitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccountInstructionData = { discriminator: number };\n\nexport type InitializeAccountInstructionDataArgs = {};\n\nexport function getInitializeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeAccountInstructionDataCodec(): FixedSizeCodec<\n InitializeAccountInstructionDataArgs,\n InitializeAccountInstructionData\n> {\n return combineCodec(\n getInitializeAccountInstructionDataEncoder(),\n getInitializeAccountInstructionDataDecoder()\n );\n}\n\nexport type InitializeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** The new account's owner/multisignature. */\n owner: Address;\n /** Rent sysvar. */\n rent?: Address;\n};\n\nexport function getInitializeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeAccountInput<\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** The new account's owner/multisignature. */\n owner: TAccountMetas[2];\n /** Rent sysvar. */\n rent: TAccountMetas[3];\n };\n data: InitializeAccountInstructionData;\n};\n\nexport function parseInitializeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccountInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT2_DISCRIMINATOR = 16;\n\nexport function getInitializeAccount2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT2_DISCRIMINATOR);\n}\n\nexport type InitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount2InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount2InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount2InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount2InstructionDataArgs,\n InitializeAccount2InstructionData\n> {\n return combineCodec(\n getInitializeAccount2InstructionDataEncoder(),\n getInitializeAccount2InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount2Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n owner: InitializeAccount2InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount2Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccount2InstructionDataEncoder().encode(\n args as InitializeAccount2InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** Rent sysvar. */\n rent: TAccountMetas[2];\n };\n data: InitializeAccount2InstructionData;\n};\n\nexport function parseInitializeAccount2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount2Instruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccount2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT3_DISCRIMINATOR = 18;\n\nexport function getInitializeAccount3DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT3_DISCRIMINATOR);\n}\n\nexport type InitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount3InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount3InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount3InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT3_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount3InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount3InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount3InstructionDataArgs,\n InitializeAccount3InstructionData\n> {\n return combineCodec(\n getInitializeAccount3InstructionDataEncoder(),\n getInitializeAccount3InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount3Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n owner: InitializeAccount3InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount3Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount3Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account), getAccountMeta(accounts.mint)],\n data: getInitializeAccount3InstructionDataEncoder().encode(\n args as InitializeAccount3InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n };\n data: InitializeAccount3InstructionData;\n};\n\nexport function parseInitializeAccount3Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount3Instruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount(), mint: getNextAccount() },\n data: getInitializeAccount3InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR = 22;\n\nexport function getInitializeImmutableOwnerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR);\n}\n\nexport type InitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeImmutableOwnerInstructionData = { discriminator: number };\n\nexport type InitializeImmutableOwnerInstructionDataArgs = {};\n\nexport function getInitializeImmutableOwnerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeImmutableOwnerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeImmutableOwnerInstructionDataCodec(): FixedSizeCodec<\n InitializeImmutableOwnerInstructionDataArgs,\n InitializeImmutableOwnerInstructionData\n> {\n return combineCodec(\n getInitializeImmutableOwnerInstructionDataEncoder(),\n getInitializeImmutableOwnerInstructionDataDecoder()\n );\n}\n\nexport type InitializeImmutableOwnerInput<\n TAccountAccount extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n};\n\nexport function getInitializeImmutableOwnerInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeImmutableOwnerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeImmutableOwnerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getInitializeImmutableOwnerInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeImmutableOwnerInstruction);\n}\n\nexport type ParsedInitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n };\n data: InitializeImmutableOwnerInstructionData;\n};\n\nexport function parseInitializeImmutableOwnerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeImmutableOwnerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getInitializeImmutableOwnerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT_DISCRIMINATOR);\n}\n\nexport type InitializeMintInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMintInstructionData = {\n discriminator: number;\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMintInstructionDataArgs = {\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMintInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMintInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMintInstructionDataCodec(): Codec<\n InitializeMintInstructionDataArgs,\n InitializeMintInstructionData\n> {\n return combineCodec(\n getInitializeMintInstructionDataEncoder(),\n getInitializeMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeMintInput<\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** Token mint account. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n decimals: InitializeMintInstructionDataArgs['decimals'];\n mintAuthority: InitializeMintInstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMintInstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMintInstruction<\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), getAccountMeta(accounts.rent)],\n data: getInitializeMintInstructionDataEncoder().encode(\n args as InitializeMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeMintInstruction);\n}\n\nexport type ParsedInitializeMintInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Token mint account. */\n mint: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMintInstructionData;\n};\n\nexport function parseInitializeMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMintInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT2_DISCRIMINATOR = 20;\n\nexport function getInitializeMint2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT2_DISCRIMINATOR);\n}\n\nexport type InitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMint2InstructionData = {\n discriminator: number;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMint2InstructionDataArgs = {\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMint2InstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT2_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMint2InstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMint2InstructionDataCodec(): Codec<\n InitializeMint2InstructionDataArgs,\n InitializeMint2InstructionData\n> {\n return combineCodec(\n getInitializeMint2InstructionDataEncoder(),\n getInitializeMint2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMint2Input = {\n /** The mint to initialize. */\n mint: Address;\n decimals: InitializeMint2InstructionDataArgs['decimals'];\n mintAuthority: InitializeMint2InstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMint2InstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMint2Instruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMint2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMint2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMint2InstructionDataEncoder().encode(\n args as InitializeMint2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMint2Instruction);\n}\n\nexport type ParsedInitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMint2InstructionData;\n};\n\nexport function parseInitializeMint2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMint2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMint2InstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG_DISCRIMINATOR = 2;\n\nexport function getInitializeMultisigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG_DISCRIMINATOR);\n}\n\nexport type InitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisigInstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisigInstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisigInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisigInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisigInstructionDataCodec(): FixedSizeCodec<\n InitializeMultisigInstructionDataArgs,\n InitializeMultisigInstructionData\n> {\n return combineCodec(\n getInitializeMultisigInstructionDataEncoder(),\n getInitializeMultisigInstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisigInput<\n TAccountMultisig extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The multisignature account to initialize. */\n multisig: Address;\n /** Rent sysvar. */\n rent?: Address;\n m: InitializeMultisigInstructionDataArgs['m'];\n signers: Array
;\n};\n\nexport function getInitializeMultisigInstruction<\n TAccountMultisig extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.multisig),\n getAccountMeta(accounts.rent),\n ...remainingAccounts,\n ],\n data: getInitializeMultisigInstructionDataEncoder().encode(\n args as InitializeMultisigInstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMultisigInstructionData;\n};\n\nexport function parseInitializeMultisigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisigInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMultisigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG2_DISCRIMINATOR = 19;\n\nexport function getInitializeMultisig2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG2_DISCRIMINATOR);\n}\n\nexport type InitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisig2InstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisig2InstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisig2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisig2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisig2InstructionDataCodec(): FixedSizeCodec<\n InitializeMultisig2InstructionDataArgs,\n InitializeMultisig2InstructionData\n> {\n return combineCodec(\n getInitializeMultisig2InstructionDataEncoder(),\n getInitializeMultisig2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisig2Input =\n {\n /** The multisignature account to initialize. */\n multisig: Address;\n m: InitializeMultisig2InstructionDataArgs['m'];\n signers: Array
;\n };\n\nexport function getInitializeMultisig2Instruction<\n TAccountMultisig extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisig2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisig2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.multisig), ...remainingAccounts],\n data: getInitializeMultisig2InstructionDataEncoder().encode(\n args as InitializeMultisig2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisig2Instruction);\n}\n\nexport type ParsedInitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n };\n data: InitializeMultisig2InstructionData;\n};\n\nexport function parseInitializeMultisig2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisig2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount() },\n data: getInitializeMultisig2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_DISCRIMINATOR = 7;\n\nexport function getMintToDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_DISCRIMINATOR);\n}\n\nexport type MintToInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n};\n\nexport type MintToInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n};\n\nexport function getMintToInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_DISCRIMINATOR })\n );\n}\n\nexport function getMintToInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getMintToInstructionDataCodec(): FixedSizeCodec<\n MintToInstructionDataArgs,\n MintToInstructionData\n> {\n return combineCodec(\n getMintToInstructionDataEncoder(),\n getMintToInstructionDataDecoder()\n );\n}\n\nexport type MintToInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint account. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getMintToInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: MintToInput,\n config?: { programAddress?: TProgramAddress }\n): MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToInstructionDataEncoder().encode(\n args as MintToInstructionDataArgs\n ),\n programAddress,\n } as MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint account. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToInstructionData;\n};\n\nexport function parseMintToInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_CHECKED_DISCRIMINATOR = 14;\n\nexport function getMintToCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_CHECKED_DISCRIMINATOR);\n}\n\nexport type MintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToCheckedInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type MintToCheckedInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getMintToCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getMintToCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getMintToCheckedInstructionDataCodec(): FixedSizeCodec<\n MintToCheckedInstructionDataArgs,\n MintToCheckedInstructionData\n> {\n return combineCodec(\n getMintToCheckedInstructionDataEncoder(),\n getMintToCheckedInstructionDataDecoder()\n );\n}\n\nexport type MintToCheckedInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToCheckedInstructionDataArgs['amount'];\n decimals: MintToCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getMintToCheckedInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: MintToCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToCheckedInstructionDataEncoder().encode(\n args as MintToCheckedInstructionDataArgs\n ),\n programAddress,\n } as MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToCheckedInstructionData;\n};\n\nexport function parseMintToCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR = 2;\n\nexport function getRecoverNestedAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type RecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountNestedAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountNestedTokenMintAddress extends string | AccountMeta = string,\n TAccountDestinationAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerTokenMintAddress extends string | AccountMeta = string,\n TAccountWalletAddress extends string | AccountMeta = string,\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountNestedAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerTokenMintAddress,\n TAccountWalletAddress extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountWalletAddress,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RecoverNestedAssociatedTokenInstructionData = {\n discriminator: number;\n};\n\nexport type RecoverNestedAssociatedTokenInstructionDataArgs = {};\n\nexport function getRecoverNestedAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n RecoverNestedAssociatedTokenInstructionDataArgs,\n RecoverNestedAssociatedTokenInstructionData\n> {\n return combineCodec(\n getRecoverNestedAssociatedTokenInstructionDataEncoder(),\n getRecoverNestedAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress?: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress?: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress?: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getRecoverNestedAssociatedTokenInstructionAsync<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n if (!accounts.ownerAssociatedAccountAddress.value) {\n accounts.ownerAssociatedAccountAddress.value = await findAssociatedTokenPda(\n {\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.ownerTokenMintAddress.value),\n }\n );\n }\n if (!accounts.nestedAssociatedAccountAddress.value) {\n accounts.nestedAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.ownerAssociatedAccountAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n if (!accounts.destinationAssociatedAccountAddress.value) {\n accounts.destinationAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getRecoverNestedAssociatedTokenInstruction<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedRecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: TAccountMetas[0];\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: TAccountMetas[1];\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: TAccountMetas[2];\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: TAccountMetas[3];\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: TAccountMetas[4];\n /** Wallet address for the owner associated token account. */\n walletAddress: TAccountMetas[5];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[6];\n };\n data: RecoverNestedAssociatedTokenInstructionData;\n};\n\nexport function parseRecoverNestedAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRecoverNestedAssociatedTokenInstruction {\n if (instruction.accounts.length < 7) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n nestedAssociatedAccountAddress: getNextAccount(),\n nestedTokenMintAddress: getNextAccount(),\n destinationAssociatedAccountAddress: getNextAccount(),\n ownerAssociatedAccountAddress: getNextAccount(),\n ownerTokenMintAddress: getNextAccount(),\n walletAddress: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getRecoverNestedAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const REVOKE_DISCRIMINATOR = 5;\n\nexport function getRevokeDiscriminatorBytes() {\n return getU8Encoder().encode(REVOKE_DISCRIMINATOR);\n}\n\nexport type RevokeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RevokeInstructionData = { discriminator: number };\n\nexport type RevokeInstructionDataArgs = {};\n\nexport function getRevokeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: REVOKE_DISCRIMINATOR })\n );\n}\n\nexport function getRevokeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRevokeInstructionDataCodec(): FixedSizeCodec<\n RevokeInstructionDataArgs,\n RevokeInstructionData\n> {\n return combineCodec(\n getRevokeInstructionDataEncoder(),\n getRevokeInstructionDataDecoder()\n );\n}\n\nexport type RevokeInput<\n TAccountSource extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The source account owner or its multisignature. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getRevokeInstruction<\n TAccountSource extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: RevokeInput,\n config?: { programAddress?: TProgramAddress }\n): RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getRevokeInstructionDataEncoder().encode({}),\n programAddress,\n } as RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedRevokeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The source account owner or its multisignature. */\n owner: TAccountMetas[1];\n };\n data: RevokeInstructionData;\n};\n\nexport function parseRevokeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRevokeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { source: getNextAccount(), owner: getNextAccount() },\n data: getRevokeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAuthorityTypeDecoder,\n getAuthorityTypeEncoder,\n type AuthorityType,\n type AuthorityTypeArgs,\n} from '../types';\n\nexport const SET_AUTHORITY_DISCRIMINATOR = 6;\n\nexport function getSetAuthorityDiscriminatorBytes() {\n return getU8Encoder().encode(SET_AUTHORITY_DISCRIMINATOR);\n}\n\nexport type SetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountOwned extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountOwned extends string\n ? WritableAccount\n : TAccountOwned,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SetAuthorityInstructionData = {\n discriminator: number;\n /** The type of authority to update. */\n authorityType: AuthorityType;\n /** The new authority */\n newAuthority: Option
;\n};\n\nexport type SetAuthorityInstructionDataArgs = {\n /** The type of authority to update. */\n authorityType: AuthorityTypeArgs;\n /** The new authority */\n newAuthority: OptionOrNullable
;\n};\n\nexport function getSetAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['authorityType', getAuthorityTypeEncoder()],\n ['newAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({ ...value, discriminator: SET_AUTHORITY_DISCRIMINATOR })\n );\n}\n\nexport function getSetAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['authorityType', getAuthorityTypeDecoder()],\n ['newAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getSetAuthorityInstructionDataCodec(): Codec<\n SetAuthorityInstructionDataArgs,\n SetAuthorityInstructionData\n> {\n return combineCodec(\n getSetAuthorityInstructionDataEncoder(),\n getSetAuthorityInstructionDataDecoder()\n );\n}\n\nexport type SetAuthorityInput<\n TAccountOwned extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The mint or account to change the authority of. */\n owned: Address;\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: Address | TransactionSigner;\n authorityType: SetAuthorityInstructionDataArgs['authorityType'];\n newAuthority: SetAuthorityInstructionDataArgs['newAuthority'];\n multiSigners?: Array;\n};\n\nexport function getSetAuthorityInstruction<\n TAccountOwned extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: SetAuthorityInput,\n config?: { programAddress?: TProgramAddress }\n): SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owned: { value: input.owned ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owned),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getSetAuthorityInstructionDataEncoder().encode(\n args as SetAuthorityInstructionDataArgs\n ),\n programAddress,\n } as SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedSetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint or account to change the authority of. */\n owned: TAccountMetas[0];\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: TAccountMetas[1];\n };\n data: SetAuthorityInstructionData;\n};\n\nexport function parseSetAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSetAuthorityInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { owned: getNextAccount(), owner: getNextAccount() },\n data: getSetAuthorityInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const SYNC_NATIVE_DISCRIMINATOR = 17;\n\nexport function getSyncNativeDiscriminatorBytes() {\n return getU8Encoder().encode(SYNC_NATIVE_DISCRIMINATOR);\n}\n\nexport type SyncNativeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SyncNativeInstructionData = { discriminator: number };\n\nexport type SyncNativeInstructionDataArgs = {};\n\nexport function getSyncNativeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: SYNC_NATIVE_DISCRIMINATOR })\n );\n}\n\nexport function getSyncNativeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getSyncNativeInstructionDataCodec(): FixedSizeCodec<\n SyncNativeInstructionDataArgs,\n SyncNativeInstructionData\n> {\n return combineCodec(\n getSyncNativeInstructionDataEncoder(),\n getSyncNativeInstructionDataDecoder()\n );\n}\n\nexport type SyncNativeInput = {\n /** The native token account to sync with its underlying lamports. */\n account: Address;\n};\n\nexport function getSyncNativeInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: SyncNativeInput,\n config?: { programAddress?: TProgramAddress }\n): SyncNativeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getSyncNativeInstructionDataEncoder().encode({}),\n programAddress,\n } as SyncNativeInstruction);\n}\n\nexport type ParsedSyncNativeInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The native token account to sync with its underlying lamports. */\n account: TAccountMetas[0];\n };\n data: SyncNativeInstructionData;\n};\n\nexport function parseSyncNativeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSyncNativeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getSyncNativeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const THAW_ACCOUNT_DISCRIMINATOR = 11;\n\nexport function getThawAccountDiscriminatorBytes() {\n return getU8Encoder().encode(THAW_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type ThawAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ThawAccountInstructionData = { discriminator: number };\n\nexport type ThawAccountInstructionDataArgs = {};\n\nexport function getThawAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: THAW_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getThawAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getThawAccountInstructionDataCodec(): FixedSizeCodec<\n ThawAccountInstructionDataArgs,\n ThawAccountInstructionData\n> {\n return combineCodec(\n getThawAccountInstructionDataEncoder(),\n getThawAccountInstructionDataDecoder()\n );\n}\n\nexport type ThawAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to thaw. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getThawAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: ThawAccountInput,\n config?: { programAddress?: TProgramAddress }\n): ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getThawAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedThawAccountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to thaw. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ThawAccountInstructionData;\n};\n\nexport function parseThawAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedThawAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getThawAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_DISCRIMINATOR = 3;\n\nexport function getTransferDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_DISCRIMINATOR);\n}\n\nexport type TransferInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n};\n\nexport type TransferInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n};\n\nexport function getTransferInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_DISCRIMINATOR })\n );\n}\n\nexport function getTransferInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getTransferInstructionDataCodec(): FixedSizeCodec<\n TransferInstructionDataArgs,\n TransferInstructionData\n> {\n return combineCodec(\n getTransferInstructionDataEncoder(),\n getTransferInstructionDataDecoder()\n );\n}\n\nexport type TransferInput<\n TAccountSource extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getTransferInstruction<\n TAccountSource extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: TransferInput,\n config?: { programAddress?: TProgramAddress }\n): TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferInstructionDataEncoder().encode(\n args as TransferInstructionDataArgs\n ),\n programAddress,\n } as TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: TransferInstructionData;\n};\n\nexport function parseTransferInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_CHECKED_DISCRIMINATOR = 12;\n\nexport function getTransferCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_CHECKED_DISCRIMINATOR);\n}\n\nexport type TransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type TransferCheckedInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getTransferCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getTransferCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getTransferCheckedInstructionDataCodec(): FixedSizeCodec<\n TransferCheckedInstructionDataArgs,\n TransferCheckedInstructionData\n> {\n return combineCodec(\n getTransferCheckedInstructionDataEncoder(),\n getTransferCheckedInstructionDataDecoder()\n );\n}\n\nexport type TransferCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferCheckedInstructionDataArgs['amount'];\n decimals: TransferCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getTransferCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: TransferCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferCheckedInstructionDataEncoder().encode(\n args as TransferCheckedInstructionDataArgs\n ),\n programAddress,\n } as TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The destination account. */\n destination: TAccountMetas[2];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: TransferCheckedInstructionData;\n};\n\nexport function parseTransferCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR = 24;\n\nexport function getUiAmountToAmountDiscriminatorBytes() {\n return getU8Encoder().encode(UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR);\n}\n\nexport type UiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UiAmountToAmountInstructionData = {\n discriminator: number;\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport type UiAmountToAmountInstructionDataArgs = {\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport function getUiAmountToAmountInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['uiAmount', getUtf8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getUiAmountToAmountInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['uiAmount', getUtf8Decoder()],\n ]);\n}\n\nexport function getUiAmountToAmountInstructionDataCodec(): Codec<\n UiAmountToAmountInstructionDataArgs,\n UiAmountToAmountInstructionData\n> {\n return combineCodec(\n getUiAmountToAmountInstructionDataEncoder(),\n getUiAmountToAmountInstructionDataDecoder()\n );\n}\n\nexport type UiAmountToAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n uiAmount: UiAmountToAmountInstructionDataArgs['uiAmount'];\n};\n\nexport function getUiAmountToAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,\n>(\n input: UiAmountToAmountInput,\n config?: { programAddress?: TProgramAddress }\n): UiAmountToAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getUiAmountToAmountInstructionDataEncoder().encode(\n args as UiAmountToAmountInstructionDataArgs\n ),\n programAddress,\n } as UiAmountToAmountInstruction);\n}\n\nexport type ParsedUiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: UiAmountToAmountInstructionData;\n};\n\nexport function parseUiAmountToAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUiAmountToAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getUiAmountToAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU32Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedAdvanceNonceAccountInstruction,\n type ParsedAllocateInstruction,\n type ParsedAllocateWithSeedInstruction,\n type ParsedAssignInstruction,\n type ParsedAssignWithSeedInstruction,\n type ParsedAuthorizeNonceAccountInstruction,\n type ParsedCreateAccountInstruction,\n type ParsedCreateAccountWithSeedInstruction,\n type ParsedInitializeNonceAccountInstruction,\n type ParsedTransferSolInstruction,\n type ParsedTransferSolWithSeedInstruction,\n type ParsedUpgradeNonceAccountInstruction,\n type ParsedWithdrawNonceAccountInstruction,\n} from '../instructions';\n\nexport const SYSTEM_PROGRAM_ADDRESS =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n\nexport enum SystemAccount {\n Nonce,\n}\n\nexport enum SystemInstruction {\n CreateAccount,\n Assign,\n TransferSol,\n CreateAccountWithSeed,\n AdvanceNonceAccount,\n WithdrawNonceAccount,\n InitializeNonceAccount,\n AuthorizeNonceAccount,\n Allocate,\n AllocateWithSeed,\n AssignWithSeed,\n TransferSolWithSeed,\n UpgradeNonceAccount,\n}\n\nexport function identifySystemInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): SystemInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU32Encoder().encode(0), 0)) {\n return SystemInstruction.CreateAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(1), 0)) {\n return SystemInstruction.Assign;\n }\n if (containsBytes(data, getU32Encoder().encode(2), 0)) {\n return SystemInstruction.TransferSol;\n }\n if (containsBytes(data, getU32Encoder().encode(3), 0)) {\n return SystemInstruction.CreateAccountWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(4), 0)) {\n return SystemInstruction.AdvanceNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(5), 0)) {\n return SystemInstruction.WithdrawNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(6), 0)) {\n return SystemInstruction.InitializeNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(7), 0)) {\n return SystemInstruction.AuthorizeNonceAccount;\n }\n if (containsBytes(data, getU32Encoder().encode(8), 0)) {\n return SystemInstruction.Allocate;\n }\n if (containsBytes(data, getU32Encoder().encode(9), 0)) {\n return SystemInstruction.AllocateWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(10), 0)) {\n return SystemInstruction.AssignWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(11), 0)) {\n return SystemInstruction.TransferSolWithSeed;\n }\n if (containsBytes(data, getU32Encoder().encode(12), 0)) {\n return SystemInstruction.UpgradeNonceAccount;\n }\n throw new Error(\n 'The provided instruction could not be identified as a system instruction.'\n );\n}\n\nexport type ParsedSystemInstruction<\n TProgram extends string = '11111111111111111111111111111111',\n> =\n | ({\n instructionType: SystemInstruction.CreateAccount;\n } & ParsedCreateAccountInstruction)\n | ({\n instructionType: SystemInstruction.Assign;\n } & ParsedAssignInstruction)\n | ({\n instructionType: SystemInstruction.TransferSol;\n } & ParsedTransferSolInstruction)\n | ({\n instructionType: SystemInstruction.CreateAccountWithSeed;\n } & ParsedCreateAccountWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.AdvanceNonceAccount;\n } & ParsedAdvanceNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.WithdrawNonceAccount;\n } & ParsedWithdrawNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.InitializeNonceAccount;\n } & ParsedInitializeNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.AuthorizeNonceAccount;\n } & ParsedAuthorizeNonceAccountInstruction)\n | ({\n instructionType: SystemInstruction.Allocate;\n } & ParsedAllocateInstruction)\n | ({\n instructionType: SystemInstruction.AllocateWithSeed;\n } & ParsedAllocateWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.AssignWithSeed;\n } & ParsedAssignWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.TransferSolWithSeed;\n } & ParsedTransferSolWithSeedInstruction)\n | ({\n instructionType: SystemInstruction.UpgradeNonceAccount;\n } & ParsedUpgradeNonceAccountInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { SYSTEM_PROGRAM_ADDRESS } from '../programs';\n\n/** AccountAlreadyInUse: an account with the same address already exists */\nexport const SYSTEM_ERROR__ACCOUNT_ALREADY_IN_USE = 0x0; // 0\n/** ResultWithNegativeLamports: account does not have enough SOL to perform the operation */\nexport const SYSTEM_ERROR__RESULT_WITH_NEGATIVE_LAMPORTS = 0x1; // 1\n/** InvalidProgramId: cannot assign account to this program id */\nexport const SYSTEM_ERROR__INVALID_PROGRAM_ID = 0x2; // 2\n/** InvalidAccountDataLength: cannot allocate account data of this length */\nexport const SYSTEM_ERROR__INVALID_ACCOUNT_DATA_LENGTH = 0x3; // 3\n/** MaxSeedLengthExceeded: length of requested seed is too long */\nexport const SYSTEM_ERROR__MAX_SEED_LENGTH_EXCEEDED = 0x4; // 4\n/** AddressWithSeedMismatch: provided address does not match addressed derived from seed */\nexport const SYSTEM_ERROR__ADDRESS_WITH_SEED_MISMATCH = 0x5; // 5\n/** NonceNoRecentBlockhashes: advancing stored nonce requires a populated RecentBlockhashes sysvar */\nexport const SYSTEM_ERROR__NONCE_NO_RECENT_BLOCKHASHES = 0x6; // 6\n/** NonceBlockhashNotExpired: stored nonce is still in recent_blockhashes */\nexport const SYSTEM_ERROR__NONCE_BLOCKHASH_NOT_EXPIRED = 0x7; // 7\n/** NonceUnexpectedBlockhashValue: specified nonce does not match stored nonce */\nexport const SYSTEM_ERROR__NONCE_UNEXPECTED_BLOCKHASH_VALUE = 0x8; // 8\n\nexport type SystemError =\n | typeof SYSTEM_ERROR__ACCOUNT_ALREADY_IN_USE\n | typeof SYSTEM_ERROR__ADDRESS_WITH_SEED_MISMATCH\n | typeof SYSTEM_ERROR__INVALID_ACCOUNT_DATA_LENGTH\n | typeof SYSTEM_ERROR__INVALID_PROGRAM_ID\n | typeof SYSTEM_ERROR__MAX_SEED_LENGTH_EXCEEDED\n | typeof SYSTEM_ERROR__NONCE_BLOCKHASH_NOT_EXPIRED\n | typeof SYSTEM_ERROR__NONCE_NO_RECENT_BLOCKHASHES\n | typeof SYSTEM_ERROR__NONCE_UNEXPECTED_BLOCKHASH_VALUE\n | typeof SYSTEM_ERROR__RESULT_WITH_NEGATIVE_LAMPORTS;\n\nlet systemErrorMessages: Record | undefined;\nif (process.env.NODE_ENV !== 'production') {\n systemErrorMessages = {\n [SYSTEM_ERROR__ACCOUNT_ALREADY_IN_USE]: `an account with the same address already exists`,\n [SYSTEM_ERROR__ADDRESS_WITH_SEED_MISMATCH]: `provided address does not match addressed derived from seed`,\n [SYSTEM_ERROR__INVALID_ACCOUNT_DATA_LENGTH]: `cannot allocate account data of this length`,\n [SYSTEM_ERROR__INVALID_PROGRAM_ID]: `cannot assign account to this program id`,\n [SYSTEM_ERROR__MAX_SEED_LENGTH_EXCEEDED]: `length of requested seed is too long`,\n [SYSTEM_ERROR__NONCE_BLOCKHASH_NOT_EXPIRED]: `stored nonce is still in recent_blockhashes`,\n [SYSTEM_ERROR__NONCE_NO_RECENT_BLOCKHASHES]: `advancing stored nonce requires a populated RecentBlockhashes sysvar`,\n [SYSTEM_ERROR__NONCE_UNEXPECTED_BLOCKHASH_VALUE]: `specified nonce does not match stored nonce`,\n [SYSTEM_ERROR__RESULT_WITH_NEGATIVE_LAMPORTS]: `account does not have enough SOL to perform the operation`,\n };\n}\n\nexport function getSystemErrorMessage(code: SystemError): string {\n if (process.env.NODE_ENV !== 'production') {\n return (systemErrorMessages as Record)[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isSystemError(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n SYSTEM_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from '@solana/kit';\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected a value but received null or undefined.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): Address {\n if (!value) {\n throw new Error('Expected a Address.');\n }\n if (typeof value === 'object' && 'address' in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address;\n }\n return value as Address;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): ProgramDerivedAddress {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error('Expected a ProgramDerivedAddress.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): TransactionSigner {\n if (!value || !isTransactionSigner(value)) {\n throw new Error('Expected a TransactionSigner.');\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null =\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: 'omitted' | 'programId'\n) {\n return (\n account: ResolvedAccount\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === 'omitted') return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n): value is TransactionSigner {\n return (\n !!value &&\n typeof value === 'object' &&\n 'address' in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n BASE_ACCOUNT_SIZE,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { SYSTEM_PROGRAM_ADDRESS } from '../programs';\nimport {\n getAccountMetaFactory,\n type InstructionWithByteDelta,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ACCOUNT_DISCRIMINATOR = 0;\n\nexport function getCreateAccountDiscriminatorBytes() {\n return getU32Encoder().encode(CREATE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type CreateAccountInstruction<\n TProgram extends string = typeof SYSTEM_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountNewAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountNewAccount extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountNewAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAccountInstructionData = {\n discriminator: number;\n lamports: bigint;\n space: bigint;\n programAddress: Address;\n};\n\nexport type CreateAccountInstructionDataArgs = {\n lamports: number | bigint;\n space: number | bigint;\n programAddress: Address;\n};\n\nexport function getCreateAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU32Encoder()],\n ['lamports', getU64Encoder()],\n ['space', getU64Encoder()],\n ['programAddress', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: CREATE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getCreateAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU32Decoder()],\n ['lamports', getU64Decoder()],\n ['space', getU64Decoder()],\n ['programAddress', getAddressDecoder()],\n ]);\n}\n\nexport function getCreateAccountInstructionDataCodec(): FixedSizeCodec<\n CreateAccountInstructionDataArgs,\n CreateAccountInstructionData\n> {\n return combineCodec(\n getCreateAccountInstructionDataEncoder(),\n getCreateAccountInstructionDataDecoder()\n );\n}\n\nexport type CreateAccountInput<\n TAccountPayer extends string = string,\n TAccountNewAccount extends string = string,\n> = {\n payer: TransactionSigner;\n newAccount: TransactionSigner;\n lamports: CreateAccountInstructionDataArgs['lamports'];\n space: CreateAccountInstructionDataArgs['space'];\n programAddress: CreateAccountInstructionDataArgs['programAddress'];\n};\n\nexport function getCreateAccountInstruction<\n TAccountPayer extends string,\n TAccountNewAccount extends string,\n TProgramAddress extends Address = typeof SYSTEM_PROGRAM_ADDRESS,\n>(\n input: CreateAccountInput,\n config?: { programAddress?: TProgramAddress }\n): CreateAccountInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNewAccount\n> &\n InstructionWithByteDelta {\n // Program address.\n const programAddress = config?.programAddress ?? SYSTEM_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n newAccount: { value: input.newAccount ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Bytes created or reallocated by the instruction.\n const byteDelta: number = [Number(args.space) + BASE_ACCOUNT_SIZE].reduce(\n (a, b) => a + b,\n 0\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'omitted');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.newAccount),\n ],\n byteDelta,\n data: getCreateAccountInstructionDataEncoder().encode(\n args as CreateAccountInstructionDataArgs\n ),\n programAddress,\n } as CreateAccountInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNewAccount\n > &\n InstructionWithByteDelta);\n}\n\nexport type ParsedCreateAccountInstruction<\n TProgram extends string = typeof SYSTEM_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n payer: TAccountMetas[0];\n newAccount: TAccountMetas[1];\n };\n data: CreateAccountInstructionData;\n};\n\nexport function parseCreateAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAccountInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { payer: getNextAccount(), newAccount: getNextAccount() },\n data: getCreateAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","import { getCreateAccountInstruction } from '@solana-program/system';\nimport {\n Address,\n InstructionPlan,\n OptionOrNullable,\n sequentialInstructionPlan,\n TransactionSigner,\n} from '@solana/kit';\nimport {\n getInitializeMint2Instruction,\n getMintSize,\n TOKEN_PROGRAM_ADDRESS,\n} from './generated';\n\n// RPC `getMinimumBalanceForRentExemption` for 82 bytes, which is token mint size\n// Hardcoded to avoid requiring an RPC request each time\nconst MINIMUM_BALANCE_FOR_MINT = 1461600;\n\nexport type CreateMintInstructionPlanInput = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** New mint account to create. */\n newMint: TransactionSigner;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority?: OptionOrNullable
;\n /**\n * Optional override for the amount of Lamports to fund the mint account with.\n * @default 1461600\n * */\n mintAccountLamports?: number;\n};\n\ntype CreateMintInstructionPlanConfig = {\n systemProgram?: Address;\n tokenProgram?: Address;\n};\n\nexport function getCreateMintInstructionPlan(\n input: CreateMintInstructionPlanInput,\n config?: CreateMintInstructionPlanConfig\n): InstructionPlan {\n return sequentialInstructionPlan([\n getCreateAccountInstruction(\n {\n payer: input.payer,\n newAccount: input.newMint,\n lamports: input.mintAccountLamports ?? MINIMUM_BALANCE_FOR_MINT,\n space: getMintSize(),\n programAddress: config?.tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n },\n {\n programAddress: config?.systemProgram,\n }\n ),\n getInitializeMint2Instruction(\n {\n mint: input.newMint.address,\n decimals: input.decimals,\n mintAuthority: input.mintAuthority,\n freezeAuthority: input.freezeAuthority,\n },\n {\n programAddress: config?.tokenProgram,\n }\n ),\n ]);\n}\n","import {\n InstructionPlan,\n sequentialInstructionPlan,\n Address,\n TransactionSigner,\n} from '@solana/kit';\nimport {\n findAssociatedTokenPda,\n getCreateAssociatedTokenIdempotentInstruction,\n getMintToCheckedInstruction,\n TOKEN_PROGRAM_ADDRESS,\n} from './generated';\n\ntype MintToATAInstructionPlanInput = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to mint to.\n * Will be created if it does not already exist.\n * Note: Use {@link getMintToATAInstructionPlanAsync} instead to derive this automatically.\n * Note: Use {@link findAssociatedTokenPda} to derive the associated token account address.\n */\n ata: Address;\n /** Wallet address for the associated token account. */\n owner: Address;\n /** The token mint for the associated token account. */\n mint: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: Address | TransactionSigner;\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n multiSigners?: Array;\n};\n\ntype MintToATAInstructionPlanConfig = {\n systemProgram?: Address;\n tokenProgram?: Address;\n associatedTokenProgram?: Address;\n};\n\nexport function getMintToATAInstructionPlan(\n input: MintToATAInstructionPlanInput,\n config?: MintToATAInstructionPlanConfig\n): InstructionPlan {\n return sequentialInstructionPlan([\n getCreateAssociatedTokenIdempotentInstruction(\n {\n payer: input.payer,\n ata: input.ata,\n owner: input.owner,\n mint: input.mint,\n systemProgram: config?.systemProgram,\n tokenProgram: config?.tokenProgram,\n },\n {\n programAddress: config?.associatedTokenProgram,\n }\n ),\n // mint to this token account\n getMintToCheckedInstruction(\n {\n mint: input.mint,\n token: input.ata,\n mintAuthority: input.mintAuthority,\n amount: input.amount,\n decimals: input.decimals,\n multiSigners: input.multiSigners,\n },\n {\n programAddress: config?.tokenProgram,\n }\n ),\n ]);\n}\n\ntype MintToATAInstructionPlanAsyncInput = Omit<\n MintToATAInstructionPlanInput,\n 'ata'\n>;\n\nexport async function getMintToATAInstructionPlanAsync(\n input: MintToATAInstructionPlanAsyncInput,\n config?: MintToATAInstructionPlanConfig\n): Promise {\n const [ataAddress] = await findAssociatedTokenPda({\n owner: input.owner,\n tokenProgram: config?.tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n mint: input.mint,\n });\n return getMintToATAInstructionPlan(\n {\n ...input,\n ata: ataAddress,\n },\n config\n );\n}\n","import {\n InstructionPlan,\n sequentialInstructionPlan,\n Address,\n TransactionSigner,\n} from '@solana/kit';\nimport {\n findAssociatedTokenPda,\n getCreateAssociatedTokenIdempotentInstruction,\n getTransferCheckedInstruction,\n TOKEN_PROGRAM_ADDRESS,\n} from './generated';\n\ntype TransferToATAInstructionPlanInput = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** The token mint to transfer. */\n mint: Address;\n /** The source account for the transfer. */\n source: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n /** Associated token account address to transfer to.\n * Will be created if it does not already exist.\n * Note: Use {@link getTransferToATAInstructionPlanAsync} instead to derive this automatically.\n * Note: Use {@link findAssociatedTokenPda} to derive the associated token account address.\n */\n destination: Address;\n /** Wallet address for the destination. */\n recipient: Address;\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n multiSigners?: Array;\n};\n\ntype TransferToATAInstructionPlanConfig = {\n systemProgram?: Address;\n tokenProgram?: Address;\n associatedTokenProgram?: Address;\n};\n\nexport function getTransferToATAInstructionPlan(\n input: TransferToATAInstructionPlanInput,\n config?: TransferToATAInstructionPlanConfig\n): InstructionPlan {\n return sequentialInstructionPlan([\n getCreateAssociatedTokenIdempotentInstruction(\n {\n payer: input.payer,\n ata: input.destination,\n owner: input.recipient,\n mint: input.mint,\n systemProgram: config?.systemProgram,\n tokenProgram: config?.tokenProgram,\n },\n {\n programAddress: config?.associatedTokenProgram,\n }\n ),\n getTransferCheckedInstruction(\n {\n source: input.source,\n mint: input.mint,\n destination: input.destination,\n authority: input.authority,\n amount: input.amount,\n decimals: input.decimals,\n multiSigners: input.multiSigners,\n },\n {\n programAddress: config?.tokenProgram,\n }\n ),\n ]);\n}\n\ntype TransferToATAInstructionPlanAsyncInput = Omit<\n TransferToATAInstructionPlanInput,\n 'destination'\n>;\n\nexport async function getTransferToATAInstructionPlanAsync(\n input: TransferToATAInstructionPlanAsyncInput,\n config?: TransferToATAInstructionPlanConfig\n): Promise {\n const [ataAddress] = await findAssociatedTokenPda({\n owner: input.recipient,\n tokenProgram: config?.tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n mint: input.mint,\n });\n return getTransferToATAInstructionPlan(\n {\n ...input,\n destination: ataAddress,\n },\n config\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AccountState {\n Uninitialized,\n Initialized,\n Frozen,\n}\n\nexport type AccountStateArgs = AccountState;\n\nexport function getAccountStateEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AccountState);\n}\n\nexport function getAccountStateDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AccountState);\n}\n\nexport function getAccountStateCodec(): FixedSizeCodec<\n AccountStateArgs,\n AccountState\n> {\n return combineCodec(getAccountStateEncoder(), getAccountStateDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport enum AuthorityType {\n MintTokens,\n FreezeAccount,\n AccountOwner,\n CloseAccount,\n TransferFeeConfig,\n WithheldWithdraw,\n CloseMint,\n InterestRate,\n PermanentDelegate,\n ConfidentialTransferMint,\n TransferHookProgramId,\n ConfidentialTransferFeeConfig,\n MetadataPointer,\n GroupPointer,\n GroupMemberPointer,\n ScaledUiAmount,\n Pause,\n}\n\nexport type AuthorityTypeArgs = AuthorityType;\n\nexport function getAuthorityTypeEncoder(): FixedSizeEncoder {\n return getEnumEncoder(AuthorityType);\n}\n\nexport function getAuthorityTypeDecoder(): FixedSizeDecoder {\n return getEnumDecoder(AuthorityType);\n}\n\nexport function getAuthorityTypeCodec(): FixedSizeCodec<\n AuthorityTypeArgs,\n AuthorityType\n> {\n return combineCodec(getAuthorityTypeEncoder(), getAuthorityTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from '@solana/kit';\n\n/** Authenticated encryption containing an account balance. */\nexport type DecryptableBalance = ReadonlyUint8Array;\n\nexport type DecryptableBalanceArgs = DecryptableBalance;\n\nexport function getDecryptableBalanceEncoder(): FixedSizeEncoder {\n return fixEncoderSize(getBytesEncoder(), 36);\n}\n\nexport function getDecryptableBalanceDecoder(): FixedSizeDecoder {\n return fixDecoderSize(getBytesDecoder(), 36);\n}\n\nexport function getDecryptableBalanceCodec(): FixedSizeCodec<\n DecryptableBalanceArgs,\n DecryptableBalance\n> {\n return combineCodec(\n getDecryptableBalanceEncoder(),\n getDecryptableBalanceDecoder()\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from '@solana/kit';\n\n/** ElGamal ciphertext containing an account balance. */\nexport type EncryptedBalance = ReadonlyUint8Array;\n\nexport type EncryptedBalanceArgs = EncryptedBalance;\n\nexport function getEncryptedBalanceEncoder(): FixedSizeEncoder {\n return fixEncoderSize(getBytesEncoder(), 64);\n}\n\nexport function getEncryptedBalanceDecoder(): FixedSizeDecoder {\n return fixDecoderSize(getBytesDecoder(), 64);\n}\n\nexport function getEncryptedBalanceCodec(): FixedSizeCodec<\n EncryptedBalanceArgs,\n EncryptedBalance\n> {\n return combineCodec(\n getEncryptedBalanceEncoder(),\n getEncryptedBalanceDecoder()\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getDiscriminatedUnionDecoder,\n getDiscriminatedUnionEncoder,\n getF64Decoder,\n getF64Encoder,\n getI16Decoder,\n getI16Encoder,\n getMapDecoder,\n getMapEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getUnitDecoder,\n getUnitEncoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type GetDiscriminatedUnionVariant,\n type GetDiscriminatedUnionVariantContent,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n getEncryptedBalanceDecoder,\n getEncryptedBalanceEncoder,\n getTransferFeeDecoder,\n getTransferFeeEncoder,\n type AccountState,\n type AccountStateArgs,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n type EncryptedBalance,\n type EncryptedBalanceArgs,\n type TransferFee,\n type TransferFeeArgs,\n} from '.';\n\nexport type Extension =\n | { __kind: 'Uninitialized' }\n | {\n __kind: 'TransferFeeConfig';\n /** Optional authority to set the fee. */\n transferFeeConfigAuthority: Address;\n /** Withdraw from mint instructions must be signed by this key. */\n withdrawWithheldAuthority: Address;\n /** Withheld transfer fee tokens that have been moved to the mint for withdrawal. */\n withheldAmount: bigint;\n /** Older transfer fee, used if the current epoch < newerTransferFee.epoch. */\n olderTransferFee: TransferFee;\n /** Newer transfer fee, used if the current epoch >= newerTransferFee.epoch. */\n newerTransferFee: TransferFee;\n }\n | {\n __kind: 'TransferFeeAmount';\n /** Withheld transfer fee tokens that can be claimed by the fee authority. */\n withheldAmount: bigint;\n }\n | { __kind: 'MintCloseAuthority'; closeAuthority: Address }\n | {\n __kind: 'ConfidentialTransferMint';\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts (if `auto_approve_new_accounts` is true).\n *\n * The legacy Token Multisig account is not supported as the authority.\n */\n authority: Option
;\n /**\n * Indicate if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n *\n * * If `true`, no approval is required and new accounts may be used immediately.\n * * If `false`, the authority must approve newly configured accounts (see\n * `ConfidentialTransferInstruction::ConfigureAccount`).\n */\n autoApproveNewAccounts: boolean;\n /** Authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: Option
;\n }\n | {\n __kind: 'ConfidentialTransferAccount';\n /**\n * `true` if this account has been approved for use. All confidential\n * transfer operations for the account will fail until approval is granted.\n */\n approved: boolean;\n /** The public key associated with ElGamal encryption. */\n elgamalPubkey: Address;\n /** The low 16 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceLow: EncryptedBalance;\n /** The high 32 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceHigh: EncryptedBalance;\n /** The available balance (encrypted by `encrypiton_pubkey`). */\n availableBalance: EncryptedBalance;\n /** The decryptable available balance. */\n decryptableAvailableBalance: DecryptableBalance;\n /** If `false`, the extended account rejects any incoming confidential transfers. */\n allowConfidentialCredits: boolean;\n /** If `false`, the base account rejects any incoming transfers. */\n allowNonConfidentialCredits: boolean;\n /** The total number of `Deposit` and `Transfer` instructions that have credited `pending_balance`. */\n pendingBalanceCreditCounter: bigint;\n /**\n * The maximum number of `Deposit` and `Transfer` instructions that can\n * credit `pending_balance` before the `ApplyPendingBalance`\n * instruction is executed.\n */\n maximumPendingBalanceCreditCounter: bigint;\n /**\n * The `expected_pending_balance_credit_counter` value that was included in\n * the last `ApplyPendingBalance` instruction.\n */\n expectedPendingBalanceCreditCounter: bigint;\n /**\n * The actual `pending_balance_credit_counter` when the last\n * `ApplyPendingBalance` instruction was executed.\n */\n actualPendingBalanceCreditCounter: bigint;\n }\n | { __kind: 'DefaultAccountState'; state: AccountState }\n | { __kind: 'ImmutableOwner' }\n | {\n __kind: 'MemoTransfer';\n /** Require transfers into this account to be accompanied by a memo. */\n requireIncomingTransferMemos: boolean;\n }\n | { __kind: 'NonTransferable' }\n | {\n __kind: 'InterestBearingConfig';\n rateAuthority: Address;\n initializationTimestamp: bigint;\n preUpdateAverageRate: number;\n lastUpdateTimestamp: bigint;\n currentRate: number;\n }\n | {\n __kind: 'CpiGuard';\n /** Lock certain token operations from taking place within CPI for this account. */\n lockCpi: boolean;\n }\n | { __kind: 'PermanentDelegate'; delegate: Address }\n | { __kind: 'NonTransferableAccount' }\n | {\n __kind: 'TransferHook';\n /** The transfer hook update authority. */\n authority: Address;\n /** The transfer hook program account. */\n programId: Address;\n }\n | {\n __kind: 'TransferHookAccount';\n /**\n * Whether or not this account is currently transferring tokens\n * True during the transfer hook cpi, otherwise false.\n */\n transferring: boolean;\n }\n | {\n __kind: 'ConfidentialTransferFee';\n /** Optional authority to set the withdraw withheld authority ElGamal key. */\n authority: Option
;\n /**\n * Withheld fees from accounts must be encrypted with this ElGamal key.\n *\n * Note that whoever holds the ElGamal private key for this ElGamal public\n * key has the ability to decode any withheld fee amount that are\n * associated with accounts. When combined with the fee parameters, the\n * withheld fee amounts can reveal information about transfer amounts.\n */\n elgamalPubkey: Address;\n /** If `false`, the harvest of withheld tokens to mint is rejected. */\n harvestToMintEnabled: boolean;\n /**\n * Withheld confidential transfer fee tokens that have been moved to the\n * mint for withdrawal.\n */\n withheldAmount: EncryptedBalance;\n }\n | {\n __kind: 'ConfidentialTransferFeeAmount';\n /** Amount withheld during confidential transfers, to be harvest to the mint. */\n withheldAmount: EncryptedBalance;\n }\n | {\n __kind: 'MetadataPointer';\n /** Optional authority that can set the metadata address. */\n authority: Option
;\n /** Optional Account Address that holds the metadata. */\n metadataAddress: Option
;\n }\n | {\n __kind: 'TokenMetadata';\n /** The authority that can sign to update the metadata. */\n updateAuthority: Option
;\n /** The associated mint, used to counter spoofing to be sure that metadata belongs to a particular mint. */\n mint: Address;\n /** The longer name of the token. */\n name: string;\n /** The shortened symbol for the token. */\n symbol: string;\n /** The URI pointing to richer metadata. */\n uri: string;\n /** Any additional metadata about the token as key-value pairs. */\n additionalMetadata: Map;\n }\n | {\n __kind: 'GroupPointer';\n /** Optional authority that can set the group address. */\n authority: Option
;\n /** Optional account address that holds the group. */\n groupAddress: Option
;\n }\n | {\n __kind: 'TokenGroup';\n /** The authority that can sign to update the group. */\n updateAuthority: Option
;\n /** The associated mint, used to counter spoofing to be sure that group belongs to a particular mint. */\n mint: Address;\n /** The current number of group members. */\n size: bigint;\n /** The maximum number of group members. */\n maxSize: bigint;\n }\n | {\n __kind: 'GroupMemberPointer';\n /** Optional authority that can set the member address. */\n authority: Option
;\n /** Optional account address that holds the member. */\n memberAddress: Option
;\n }\n | {\n __kind: 'TokenGroupMember';\n /** The associated mint, used to counter spoofing to be sure that member belongs to a particular mint. */\n mint: Address;\n /** The pubkey of the `TokenGroup`. */\n group: Address;\n /** The member number. */\n memberNumber: bigint;\n }\n | { __kind: 'ConfidentialMintBurn' }\n | {\n __kind: 'ScaledUiAmountConfig';\n authority: Address;\n multiplier: number;\n newMultiplierEffectiveTimestamp: bigint;\n newMultiplier: number;\n }\n | { __kind: 'PausableConfig'; authority: Option
; paused: boolean }\n | { __kind: 'PausableAccount' };\n\nexport type ExtensionArgs =\n | { __kind: 'Uninitialized' }\n | {\n __kind: 'TransferFeeConfig';\n /** Optional authority to set the fee. */\n transferFeeConfigAuthority: Address;\n /** Withdraw from mint instructions must be signed by this key. */\n withdrawWithheldAuthority: Address;\n /** Withheld transfer fee tokens that have been moved to the mint for withdrawal. */\n withheldAmount: number | bigint;\n /** Older transfer fee, used if the current epoch < newerTransferFee.epoch. */\n olderTransferFee: TransferFeeArgs;\n /** Newer transfer fee, used if the current epoch >= newerTransferFee.epoch. */\n newerTransferFee: TransferFeeArgs;\n }\n | {\n __kind: 'TransferFeeAmount';\n /** Withheld transfer fee tokens that can be claimed by the fee authority. */\n withheldAmount: number | bigint;\n }\n | { __kind: 'MintCloseAuthority'; closeAuthority: Address }\n | {\n __kind: 'ConfidentialTransferMint';\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts (if `auto_approve_new_accounts` is true).\n *\n * The legacy Token Multisig account is not supported as the authority.\n */\n authority: OptionOrNullable
;\n /**\n * Indicate if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n *\n * * If `true`, no approval is required and new accounts may be used immediately.\n * * If `false`, the authority must approve newly configured accounts (see\n * `ConfidentialTransferInstruction::ConfigureAccount`).\n */\n autoApproveNewAccounts: boolean;\n /** Authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: OptionOrNullable
;\n }\n | {\n __kind: 'ConfidentialTransferAccount';\n /**\n * `true` if this account has been approved for use. All confidential\n * transfer operations for the account will fail until approval is granted.\n */\n approved: boolean;\n /** The public key associated with ElGamal encryption. */\n elgamalPubkey: Address;\n /** The low 16 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceLow: EncryptedBalanceArgs;\n /** The high 32 bits of the pending balance (encrypted by `elgamal_pubkey`). */\n pendingBalanceHigh: EncryptedBalanceArgs;\n /** The available balance (encrypted by `encrypiton_pubkey`). */\n availableBalance: EncryptedBalanceArgs;\n /** The decryptable available balance. */\n decryptableAvailableBalance: DecryptableBalanceArgs;\n /** If `false`, the extended account rejects any incoming confidential transfers. */\n allowConfidentialCredits: boolean;\n /** If `false`, the base account rejects any incoming transfers. */\n allowNonConfidentialCredits: boolean;\n /** The total number of `Deposit` and `Transfer` instructions that have credited `pending_balance`. */\n pendingBalanceCreditCounter: number | bigint;\n /**\n * The maximum number of `Deposit` and `Transfer` instructions that can\n * credit `pending_balance` before the `ApplyPendingBalance`\n * instruction is executed.\n */\n maximumPendingBalanceCreditCounter: number | bigint;\n /**\n * The `expected_pending_balance_credit_counter` value that was included in\n * the last `ApplyPendingBalance` instruction.\n */\n expectedPendingBalanceCreditCounter: number | bigint;\n /**\n * The actual `pending_balance_credit_counter` when the last\n * `ApplyPendingBalance` instruction was executed.\n */\n actualPendingBalanceCreditCounter: number | bigint;\n }\n | { __kind: 'DefaultAccountState'; state: AccountStateArgs }\n | { __kind: 'ImmutableOwner' }\n | {\n __kind: 'MemoTransfer';\n /** Require transfers into this account to be accompanied by a memo. */\n requireIncomingTransferMemos: boolean;\n }\n | { __kind: 'NonTransferable' }\n | {\n __kind: 'InterestBearingConfig';\n rateAuthority: Address;\n initializationTimestamp: number | bigint;\n preUpdateAverageRate: number;\n lastUpdateTimestamp: number | bigint;\n currentRate: number;\n }\n | {\n __kind: 'CpiGuard';\n /** Lock certain token operations from taking place within CPI for this account. */\n lockCpi: boolean;\n }\n | { __kind: 'PermanentDelegate'; delegate: Address }\n | { __kind: 'NonTransferableAccount' }\n | {\n __kind: 'TransferHook';\n /** The transfer hook update authority. */\n authority: Address;\n /** The transfer hook program account. */\n programId: Address;\n }\n | {\n __kind: 'TransferHookAccount';\n /**\n * Whether or not this account is currently transferring tokens\n * True during the transfer hook cpi, otherwise false.\n */\n transferring: boolean;\n }\n | {\n __kind: 'ConfidentialTransferFee';\n /** Optional authority to set the withdraw withheld authority ElGamal key. */\n authority: OptionOrNullable
;\n /**\n * Withheld fees from accounts must be encrypted with this ElGamal key.\n *\n * Note that whoever holds the ElGamal private key for this ElGamal public\n * key has the ability to decode any withheld fee amount that are\n * associated with accounts. When combined with the fee parameters, the\n * withheld fee amounts can reveal information about transfer amounts.\n */\n elgamalPubkey: Address;\n /** If `false`, the harvest of withheld tokens to mint is rejected. */\n harvestToMintEnabled: boolean;\n /**\n * Withheld confidential transfer fee tokens that have been moved to the\n * mint for withdrawal.\n */\n withheldAmount: EncryptedBalanceArgs;\n }\n | {\n __kind: 'ConfidentialTransferFeeAmount';\n /** Amount withheld during confidential transfers, to be harvest to the mint. */\n withheldAmount: EncryptedBalanceArgs;\n }\n | {\n __kind: 'MetadataPointer';\n /** Optional authority that can set the metadata address. */\n authority: OptionOrNullable
;\n /** Optional Account Address that holds the metadata. */\n metadataAddress: OptionOrNullable
;\n }\n | {\n __kind: 'TokenMetadata';\n /** The authority that can sign to update the metadata. */\n updateAuthority: OptionOrNullable
;\n /** The associated mint, used to counter spoofing to be sure that metadata belongs to a particular mint. */\n mint: Address;\n /** The longer name of the token. */\n name: string;\n /** The shortened symbol for the token. */\n symbol: string;\n /** The URI pointing to richer metadata. */\n uri: string;\n /** Any additional metadata about the token as key-value pairs. */\n additionalMetadata: Map;\n }\n | {\n __kind: 'GroupPointer';\n /** Optional authority that can set the group address. */\n authority: OptionOrNullable
;\n /** Optional account address that holds the group. */\n groupAddress: OptionOrNullable
;\n }\n | {\n __kind: 'TokenGroup';\n /** The authority that can sign to update the group. */\n updateAuthority: OptionOrNullable
;\n /** The associated mint, used to counter spoofing to be sure that group belongs to a particular mint. */\n mint: Address;\n /** The current number of group members. */\n size: number | bigint;\n /** The maximum number of group members. */\n maxSize: number | bigint;\n }\n | {\n __kind: 'GroupMemberPointer';\n /** Optional authority that can set the member address. */\n authority: OptionOrNullable
;\n /** Optional account address that holds the member. */\n memberAddress: OptionOrNullable
;\n }\n | {\n __kind: 'TokenGroupMember';\n /** The associated mint, used to counter spoofing to be sure that member belongs to a particular mint. */\n mint: Address;\n /** The pubkey of the `TokenGroup`. */\n group: Address;\n /** The member number. */\n memberNumber: number | bigint;\n }\n | { __kind: 'ConfidentialMintBurn' }\n | {\n __kind: 'ScaledUiAmountConfig';\n authority: Address;\n multiplier: number;\n newMultiplierEffectiveTimestamp: number | bigint;\n newMultiplier: number;\n }\n | {\n __kind: 'PausableConfig';\n authority: OptionOrNullable
;\n paused: boolean;\n }\n | { __kind: 'PausableAccount' };\n\nexport function getExtensionEncoder(): Encoder {\n return getDiscriminatedUnionEncoder(\n [\n ['Uninitialized', getUnitEncoder()],\n [\n 'TransferFeeConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n ['transferFeeConfigAuthority', getAddressEncoder()],\n ['withdrawWithheldAuthority', getAddressEncoder()],\n ['withheldAmount', getU64Encoder()],\n ['olderTransferFee', getTransferFeeEncoder()],\n ['newerTransferFee', getTransferFeeEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TransferFeeAmount',\n addEncoderSizePrefix(\n getStructEncoder([['withheldAmount', getU64Encoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'MintCloseAuthority',\n addEncoderSizePrefix(\n getStructEncoder([['closeAuthority', getAddressEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferMint',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanEncoder()],\n [\n 'auditorElgamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferAccount',\n addEncoderSizePrefix(\n getStructEncoder([\n ['approved', getBooleanEncoder()],\n ['elgamalPubkey', getAddressEncoder()],\n ['pendingBalanceLow', getEncryptedBalanceEncoder()],\n ['pendingBalanceHigh', getEncryptedBalanceEncoder()],\n ['availableBalance', getEncryptedBalanceEncoder()],\n ['decryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['allowConfidentialCredits', getBooleanEncoder()],\n ['allowNonConfidentialCredits', getBooleanEncoder()],\n ['pendingBalanceCreditCounter', getU64Encoder()],\n ['maximumPendingBalanceCreditCounter', getU64Encoder()],\n ['expectedPendingBalanceCreditCounter', getU64Encoder()],\n ['actualPendingBalanceCreditCounter', getU64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'DefaultAccountState',\n addEncoderSizePrefix(\n getStructEncoder([['state', getAccountStateEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'ImmutableOwner',\n addEncoderSizePrefix(getStructEncoder([]), getU16Encoder()),\n ],\n [\n 'MemoTransfer',\n addEncoderSizePrefix(\n getStructEncoder([\n ['requireIncomingTransferMemos', getBooleanEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'NonTransferable',\n addEncoderSizePrefix(getStructEncoder([]), getU16Encoder()),\n ],\n [\n 'InterestBearingConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n ['rateAuthority', getAddressEncoder()],\n ['initializationTimestamp', getU64Encoder()],\n ['preUpdateAverageRate', getI16Encoder()],\n ['lastUpdateTimestamp', getU64Encoder()],\n ['currentRate', getI16Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'CpiGuard',\n addEncoderSizePrefix(\n getStructEncoder([['lockCpi', getBooleanEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'PermanentDelegate',\n addEncoderSizePrefix(\n getStructEncoder([['delegate', getAddressEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'NonTransferableAccount',\n addEncoderSizePrefix(getStructEncoder([]), getU16Encoder()),\n ],\n [\n 'TransferHook',\n addEncoderSizePrefix(\n getStructEncoder([\n ['authority', getAddressEncoder()],\n ['programId', getAddressEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TransferHookAccount',\n addEncoderSizePrefix(\n getStructEncoder([['transferring', getBooleanEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferFee',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['elgamalPubkey', getAddressEncoder()],\n ['harvestToMintEnabled', getBooleanEncoder()],\n ['withheldAmount', getEncryptedBalanceEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'ConfidentialTransferFeeAmount',\n addEncoderSizePrefix(\n getStructEncoder([['withheldAmount', getEncryptedBalanceEncoder()]]),\n getU16Encoder()\n ),\n ],\n [\n 'MetadataPointer',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TokenMetadata',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'updateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressEncoder()],\n ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['symbol', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['uri', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\n 'additionalMetadata',\n getMapEncoder(\n addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()),\n addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())\n ),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'GroupPointer',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TokenGroup',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'updateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressEncoder()],\n ['size', getU64Encoder()],\n ['maxSize', getU64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'GroupMemberPointer',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'TokenGroupMember',\n addEncoderSizePrefix(\n getStructEncoder([\n ['mint', getAddressEncoder()],\n ['group', getAddressEncoder()],\n ['memberNumber', getU64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n ['ConfidentialMintBurn', getUnitEncoder()],\n [\n 'ScaledUiAmountConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n ['authority', getAddressEncoder()],\n ['multiplier', getF64Encoder()],\n ['newMultiplierEffectiveTimestamp', getU64Encoder()],\n ['newMultiplier', getF64Encoder()],\n ]),\n getU16Encoder()\n ),\n ],\n [\n 'PausableConfig',\n addEncoderSizePrefix(\n getStructEncoder([\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['paused', getBooleanEncoder()],\n ]),\n getU16Encoder()\n ),\n ],\n ['PausableAccount', getUnitEncoder()],\n ],\n { size: getU16Encoder() }\n );\n}\n\nexport function getExtensionDecoder(): Decoder {\n return getDiscriminatedUnionDecoder(\n [\n ['Uninitialized', getUnitDecoder()],\n [\n 'TransferFeeConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n ['transferFeeConfigAuthority', getAddressDecoder()],\n ['withdrawWithheldAuthority', getAddressDecoder()],\n ['withheldAmount', getU64Decoder()],\n ['olderTransferFee', getTransferFeeDecoder()],\n ['newerTransferFee', getTransferFeeDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TransferFeeAmount',\n addDecoderSizePrefix(\n getStructDecoder([['withheldAmount', getU64Decoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'MintCloseAuthority',\n addDecoderSizePrefix(\n getStructDecoder([['closeAuthority', getAddressDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferMint',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanDecoder()],\n [\n 'auditorElgamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferAccount',\n addDecoderSizePrefix(\n getStructDecoder([\n ['approved', getBooleanDecoder()],\n ['elgamalPubkey', getAddressDecoder()],\n ['pendingBalanceLow', getEncryptedBalanceDecoder()],\n ['pendingBalanceHigh', getEncryptedBalanceDecoder()],\n ['availableBalance', getEncryptedBalanceDecoder()],\n ['decryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['allowConfidentialCredits', getBooleanDecoder()],\n ['allowNonConfidentialCredits', getBooleanDecoder()],\n ['pendingBalanceCreditCounter', getU64Decoder()],\n ['maximumPendingBalanceCreditCounter', getU64Decoder()],\n ['expectedPendingBalanceCreditCounter', getU64Decoder()],\n ['actualPendingBalanceCreditCounter', getU64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'DefaultAccountState',\n addDecoderSizePrefix(\n getStructDecoder([['state', getAccountStateDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'ImmutableOwner',\n addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()),\n ],\n [\n 'MemoTransfer',\n addDecoderSizePrefix(\n getStructDecoder([\n ['requireIncomingTransferMemos', getBooleanDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'NonTransferable',\n addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()),\n ],\n [\n 'InterestBearingConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n ['rateAuthority', getAddressDecoder()],\n ['initializationTimestamp', getU64Decoder()],\n ['preUpdateAverageRate', getI16Decoder()],\n ['lastUpdateTimestamp', getU64Decoder()],\n ['currentRate', getI16Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'CpiGuard',\n addDecoderSizePrefix(\n getStructDecoder([['lockCpi', getBooleanDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'PermanentDelegate',\n addDecoderSizePrefix(\n getStructDecoder([['delegate', getAddressDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'NonTransferableAccount',\n addDecoderSizePrefix(getStructDecoder([]), getU16Decoder()),\n ],\n [\n 'TransferHook',\n addDecoderSizePrefix(\n getStructDecoder([\n ['authority', getAddressDecoder()],\n ['programId', getAddressDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TransferHookAccount',\n addDecoderSizePrefix(\n getStructDecoder([['transferring', getBooleanDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferFee',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['elgamalPubkey', getAddressDecoder()],\n ['harvestToMintEnabled', getBooleanDecoder()],\n ['withheldAmount', getEncryptedBalanceDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'ConfidentialTransferFeeAmount',\n addDecoderSizePrefix(\n getStructDecoder([['withheldAmount', getEncryptedBalanceDecoder()]]),\n getU16Decoder()\n ),\n ],\n [\n 'MetadataPointer',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TokenMetadata',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'updateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressDecoder()],\n ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['symbol', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['uri', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\n 'additionalMetadata',\n getMapDecoder(\n addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()),\n addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())\n ),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'GroupPointer',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TokenGroup',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'updateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['mint', getAddressDecoder()],\n ['size', getU64Decoder()],\n ['maxSize', getU64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'GroupMemberPointer',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'TokenGroupMember',\n addDecoderSizePrefix(\n getStructDecoder([\n ['mint', getAddressDecoder()],\n ['group', getAddressDecoder()],\n ['memberNumber', getU64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n ['ConfidentialMintBurn', getUnitDecoder()],\n [\n 'ScaledUiAmountConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n ['authority', getAddressDecoder()],\n ['multiplier', getF64Decoder()],\n ['newMultiplierEffectiveTimestamp', getU64Decoder()],\n ['newMultiplier', getF64Decoder()],\n ]),\n getU16Decoder()\n ),\n ],\n [\n 'PausableConfig',\n addDecoderSizePrefix(\n getStructDecoder([\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['paused', getBooleanDecoder()],\n ]),\n getU16Decoder()\n ),\n ],\n ['PausableAccount', getUnitDecoder()],\n ],\n { size: getU16Decoder() }\n );\n}\n\nexport function getExtensionCodec(): Codec {\n return combineCodec(getExtensionEncoder(), getExtensionDecoder());\n}\n\n// Data Enum Helpers.\nexport function extension(\n kind: 'Uninitialized'\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TransferFeeConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferFeeConfig'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TransferFeeAmount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferFeeAmount'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'MintCloseAuthority',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'MintCloseAuthority'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ConfidentialTransferMint',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferMint'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferMint'\n>;\nexport function extension(\n kind: 'ConfidentialTransferAccount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferAccount'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferAccount'\n>;\nexport function extension(\n kind: 'DefaultAccountState',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'DefaultAccountState'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ImmutableOwner',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ImmutableOwner'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'MemoTransfer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'MemoTransfer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'NonTransferable',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'NonTransferable'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'InterestBearingConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'InterestBearingConfig'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'InterestBearingConfig'\n>;\nexport function extension(\n kind: 'CpiGuard',\n data: GetDiscriminatedUnionVariantContent\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'PermanentDelegate',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'PermanentDelegate'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'NonTransferableAccount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'NonTransferableAccount'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'NonTransferableAccount'\n>;\nexport function extension(\n kind: 'TransferHook',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferHook'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TransferHookAccount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TransferHookAccount'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ConfidentialTransferFee',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFee'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFee'\n>;\nexport function extension(\n kind: 'ConfidentialTransferFeeAmount',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFeeAmount'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialTransferFeeAmount'\n>;\nexport function extension(\n kind: 'MetadataPointer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'MetadataPointer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TokenMetadata',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TokenMetadata'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'GroupPointer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'GroupPointer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TokenGroup',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TokenGroup'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'GroupMemberPointer',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'GroupMemberPointer'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'TokenGroupMember',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'TokenGroupMember'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'ConfidentialMintBurn'\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ConfidentialMintBurn'\n>;\nexport function extension(\n kind: 'ScaledUiAmountConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'ScaledUiAmountConfig'\n >\n): GetDiscriminatedUnionVariant<\n ExtensionArgs,\n '__kind',\n 'ScaledUiAmountConfig'\n>;\nexport function extension(\n kind: 'PausableConfig',\n data: GetDiscriminatedUnionVariantContent<\n ExtensionArgs,\n '__kind',\n 'PausableConfig'\n >\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: 'PausableAccount'\n): GetDiscriminatedUnionVariant;\nexport function extension(\n kind: K,\n data?: Data\n) {\n return Array.isArray(data)\n ? { __kind: kind, fields: data }\n : { __kind: kind, ...(data ?? {}) };\n}\n\nexport function isExtension(\n kind: K,\n value: Extension\n): value is Extension & { __kind: K } {\n return value.__kind === kind;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n getU16Decoder,\n getU16Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\n/**\n * Extensions that can be applied to mints or accounts. Mint extensions must\n * only be applied to mint accounts, and account extensions must only be\n * applied to token holding accounts.\n */\nexport enum ExtensionType {\n Uninitialized,\n TransferFeeConfig,\n TransferFeeAmount,\n MintCloseAuthority,\n ConfidentialTransferMint,\n ConfidentialTransferAccount,\n DefaultAccountState,\n ImmutableOwner,\n MemoTransfer,\n NonTransferable,\n InterestBearingConfig,\n CpiGuard,\n PermanentDelegate,\n NonTransferableAccount,\n TransferHook,\n TransferHookAccount,\n ConfidentialTransferFee,\n ConfidentialTransferFeeAmount,\n ScaledUiAmountConfig,\n PausableConfig,\n PausableAccount,\n MetadataPointer,\n TokenMetadata,\n GroupPointer,\n TokenGroup,\n GroupMemberPointer,\n TokenGroupMember,\n}\n\nexport type ExtensionTypeArgs = ExtensionType;\n\nexport function getExtensionTypeEncoder(): FixedSizeEncoder {\n return getEnumEncoder(ExtensionType, { size: getU16Encoder() });\n}\n\nexport function getExtensionTypeDecoder(): FixedSizeDecoder {\n return getEnumDecoder(ExtensionType, { size: getU16Decoder() });\n}\n\nexport function getExtensionTypeCodec(): FixedSizeCodec<\n ExtensionTypeArgs,\n ExtensionType\n> {\n return combineCodec(getExtensionTypeEncoder(), getExtensionTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getDiscriminatedUnionDecoder,\n getDiscriminatedUnionEncoder,\n getStructDecoder,\n getStructEncoder,\n getTupleDecoder,\n getTupleEncoder,\n getU32Decoder,\n getU32Encoder,\n getUnitDecoder,\n getUnitEncoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Codec,\n type Decoder,\n type Encoder,\n type GetDiscriminatedUnionVariant,\n type GetDiscriminatedUnionVariantContent,\n} from '@solana/kit';\n\n/** Fields in the metadata account, used for updating. */\nexport type TokenMetadataField =\n | { __kind: 'Name' }\n | { __kind: 'Symbol' }\n | { __kind: 'Uri' }\n | { __kind: 'Key'; fields: readonly [string] };\n\nexport type TokenMetadataFieldArgs = TokenMetadataField;\n\nexport function getTokenMetadataFieldEncoder(): Encoder {\n return getDiscriminatedUnionEncoder([\n ['Name', getUnitEncoder()],\n ['Symbol', getUnitEncoder()],\n ['Uri', getUnitEncoder()],\n [\n 'Key',\n getStructEncoder([\n [\n 'fields',\n getTupleEncoder([\n addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()),\n ]),\n ],\n ]),\n ],\n ]);\n}\n\nexport function getTokenMetadataFieldDecoder(): Decoder {\n return getDiscriminatedUnionDecoder([\n ['Name', getUnitDecoder()],\n ['Symbol', getUnitDecoder()],\n ['Uri', getUnitDecoder()],\n [\n 'Key',\n getStructDecoder([\n [\n 'fields',\n getTupleDecoder([\n addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()),\n ]),\n ],\n ]),\n ],\n ]);\n}\n\nexport function getTokenMetadataFieldCodec(): Codec<\n TokenMetadataFieldArgs,\n TokenMetadataField\n> {\n return combineCodec(\n getTokenMetadataFieldEncoder(),\n getTokenMetadataFieldDecoder()\n );\n}\n\n// Data Enum Helpers.\nexport function tokenMetadataField(\n kind: 'Name'\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField(\n kind: 'Symbol'\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField(\n kind: 'Uri'\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField(\n kind: 'Key',\n data: GetDiscriminatedUnionVariantContent<\n TokenMetadataFieldArgs,\n '__kind',\n 'Key'\n >['fields']\n): GetDiscriminatedUnionVariant;\nexport function tokenMetadataField<\n K extends TokenMetadataFieldArgs['__kind'],\n Data,\n>(kind: K, data?: Data) {\n return Array.isArray(data)\n ? { __kind: kind, fields: data }\n : { __kind: kind, ...(data ?? {}) };\n}\n\nexport function isTokenMetadataField(\n kind: K,\n value: TokenMetadataField\n): value is TokenMetadataField & { __kind: K } {\n return value.__kind === kind;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU64Decoder,\n getU64Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from '@solana/kit';\n\nexport type TransferFee = {\n /** First epoch where the transfer fee takes effect. */\n epoch: bigint;\n /** Maximum fee assessed on transfers, expressed as an amount of tokens. */\n maximumFee: bigint;\n /**\n * Amount of transfer collected as fees, expressed as basis points of the\n * transfer amount, ie. increments of 0.01%.\n */\n transferFeeBasisPoints: number;\n};\n\nexport type TransferFeeArgs = {\n /** First epoch where the transfer fee takes effect. */\n epoch: number | bigint;\n /** Maximum fee assessed on transfers, expressed as an amount of tokens. */\n maximumFee: number | bigint;\n /**\n * Amount of transfer collected as fees, expressed as basis points of the\n * transfer amount, ie. increments of 0.01%.\n */\n transferFeeBasisPoints: number;\n};\n\nexport function getTransferFeeEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['epoch', getU64Encoder()],\n ['maximumFee', getU64Encoder()],\n ['transferFeeBasisPoints', getU16Encoder()],\n ]);\n}\n\nexport function getTransferFeeDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['epoch', getU64Decoder()],\n ['maximumFee', getU64Decoder()],\n ['transferFeeBasisPoints', getU16Decoder()],\n ]);\n}\n\nexport function getTransferFeeCodec(): FixedSizeCodec<\n TransferFeeArgs,\n TransferFee\n> {\n return combineCodec(getTransferFeeEncoder(), getTransferFeeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getConstantDecoder,\n getConstantEncoder,\n getHiddenPrefixDecoder,\n getHiddenPrefixEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n padLeftEncoder,\n type Account,\n type Address,\n type Codec,\n type Decoder,\n type EncodedAccount,\n type Encoder,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getExtensionDecoder,\n getExtensionEncoder,\n type Extension,\n type ExtensionArgs,\n} from '../types';\n\nexport type Mint = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: Option
;\n /** Total supply of tokens. */\n supply: bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: Option
;\n /** The extensions activated on the mint account. */\n extensions: Option>;\n};\n\nexport type MintArgs = {\n /**\n * Optional authority used to mint new tokens. The mint authority may only\n * be provided during mint creation. If no mint authority is present\n * then the mint has a fixed supply and no further tokens may be minted.\n */\n mintAuthority: OptionOrNullable
;\n /** Total supply of tokens. */\n supply: number | bigint;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Optional authority to freeze token accounts. */\n freezeAuthority: OptionOrNullable
;\n /** The extensions activated on the mint account. */\n extensions: OptionOrNullable>;\n};\n\nexport function getMintEncoder(): Encoder {\n return getStructEncoder([\n [\n 'mintAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n [\n 'freezeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionEncoder(\n getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(padLeftEncoder(getU8Encoder(), 83).encode(1))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getMintDecoder(): Decoder {\n return getStructDecoder([\n [\n 'mintAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['supply', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n [\n 'freezeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionDecoder(\n getHiddenPrefixDecoder(\n getArrayDecoder(getExtensionDecoder(), { size: 'remainder' }),\n [getConstantDecoder(padLeftEncoder(getU8Encoder(), 83).encode(1))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getMintCodec(): Codec {\n return combineCodec(getMintEncoder(), getMintDecoder());\n}\n\nexport function decodeMint(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMint(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMint(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMintDecoder()\n );\n}\n\nexport async function fetchMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMint(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMint(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMint(maybeAccount);\n}\n\nexport async function fetchAllMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMint(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMint(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMint(maybeAccount));\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n} from '@solana/kit';\n\nexport type Multisig = {\n /** Number of signers required. */\n m: number;\n /** Number of valid signers. */\n n: number;\n /** Is `true` if this structure has been initialized. */\n isInitialized: boolean;\n /** Signer public keys. */\n signers: Array
;\n};\n\nexport type MultisigArgs = Multisig;\n\nexport function getMultisigEncoder(): FixedSizeEncoder {\n return getStructEncoder([\n ['m', getU8Encoder()],\n ['n', getU8Encoder()],\n ['isInitialized', getBooleanEncoder()],\n ['signers', getArrayEncoder(getAddressEncoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['m', getU8Decoder()],\n ['n', getU8Decoder()],\n ['isInitialized', getBooleanDecoder()],\n ['signers', getArrayDecoder(getAddressDecoder(), { size: 11 })],\n ]);\n}\n\nexport function getMultisigCodec(): FixedSizeCodec {\n return combineCodec(getMultisigEncoder(), getMultisigDecoder());\n}\n\nexport function decodeMultisig(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeMultisig(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeMultisig(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getMultisigDecoder()\n );\n}\n\nexport async function fetchMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeMultisig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeMultisig(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeMultisig(maybeAccount);\n}\n\nexport async function fetchAllMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeMultisig(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeMultisig(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeMultisig(maybeAccount));\n}\n\nexport function getMultisigSize(): number {\n return 355;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n getAddressDecoder,\n getAddressEncoder,\n getArrayDecoder,\n getArrayEncoder,\n getConstantDecoder,\n getConstantEncoder,\n getHiddenPrefixDecoder,\n getHiddenPrefixEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Encoder,\n type Account,\n type Address,\n type Codec,\n type Decoder,\n type EncodedAccount,\n type Encoder,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n} from '@solana/kit';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n getExtensionDecoder,\n getExtensionEncoder,\n type AccountState,\n type AccountStateArgs,\n type Extension,\n type ExtensionArgs,\n} from '../types';\n\nexport type Token = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: Option
;\n /** The account's state. */\n state: AccountState;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: Option;\n /** The amount delegated. */\n delegatedAmount: bigint;\n /** Optional authority to close the account. */\n closeAuthority: Option
;\n /** The extensions activated on the token account. */\n extensions: Option>;\n};\n\nexport type TokenArgs = {\n /** The mint associated with this account. */\n mint: Address;\n /** The owner of this account. */\n owner: Address;\n /** The amount of tokens this account holds. */\n amount: number | bigint;\n /**\n * If `delegate` is `Some` then `delegated_amount` represents\n * the amount authorized by the delegate.\n */\n delegate: OptionOrNullable
;\n /** The account's state. */\n state: AccountStateArgs;\n /**\n * If is_native.is_some, this is a native token, and the value logs the\n * rent-exempt reserve. An Account is required to be rent-exempt, so\n * the value is used by the Processor to ensure that wrapped SOL\n * accounts do not drop below this threshold.\n */\n isNative: OptionOrNullable;\n /** The amount delegated. */\n delegatedAmount: number | bigint;\n /** Optional authority to close the account. */\n closeAuthority: OptionOrNullable
;\n /** The extensions activated on the token account. */\n extensions: OptionOrNullable>;\n};\n\nexport function getTokenEncoder(): Encoder {\n return getStructEncoder([\n ['mint', getAddressEncoder()],\n ['owner', getAddressEncoder()],\n ['amount', getU64Encoder()],\n [\n 'delegate',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateEncoder()],\n [\n 'isNative',\n getOptionEncoder(getU64Encoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Encoder()],\n [\n 'closeAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: getU32Encoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionEncoder(\n getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(getU8Encoder().encode(2))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getTokenDecoder(): Decoder {\n return getStructDecoder([\n ['mint', getAddressDecoder()],\n ['owner', getAddressDecoder()],\n ['amount', getU64Decoder()],\n [\n 'delegate',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['state', getAccountStateDecoder()],\n [\n 'isNative',\n getOptionDecoder(getU64Decoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n ['delegatedAmount', getU64Decoder()],\n [\n 'closeAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: getU32Decoder(),\n noneValue: 'zeroes',\n }),\n ],\n [\n 'extensions',\n getOptionDecoder(\n getHiddenPrefixDecoder(\n getArrayDecoder(getExtensionDecoder(), { size: 'remainder' }),\n [getConstantDecoder(getU8Encoder().encode(2))]\n ),\n { prefix: null }\n ),\n ],\n ]);\n}\n\nexport function getTokenCodec(): Codec {\n return combineCodec(getTokenEncoder(), getTokenDecoder());\n}\n\nexport function decodeToken(\n encodedAccount: EncodedAccount\n): Account;\nexport function decodeToken(\n encodedAccount: MaybeEncodedAccount\n): MaybeAccount;\nexport function decodeToken(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): Account | MaybeAccount {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount,\n getTokenDecoder()\n );\n}\n\nexport async function fetchToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchMaybeToken(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeToken(\n rpc: Parameters[0],\n address: Address,\n config?: FetchAccountConfig\n): Promise> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeToken(maybeAccount);\n}\n\nexport async function fetchAllToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchAllMaybeToken(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeToken(\n rpc: Parameters[0],\n addresses: Array
,\n config?: FetchAccountsConfig\n): Promise[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeToken(maybeAccount));\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedCreateAssociatedTokenIdempotentInstruction,\n type ParsedCreateAssociatedTokenInstruction,\n type ParsedRecoverNestedAssociatedTokenInstruction,\n} from '../instructions';\n\nexport const ASSOCIATED_TOKEN_PROGRAM_ADDRESS =\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;\n\nexport enum AssociatedTokenInstruction {\n CreateAssociatedToken,\n CreateAssociatedTokenIdempotent,\n RecoverNestedAssociatedToken,\n}\n\nexport function identifyAssociatedTokenInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): AssociatedTokenInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedToken;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n }\n throw new Error(\n 'The provided instruction could not be identified as a associatedToken instruction.'\n );\n}\n\nexport type ParsedAssociatedTokenInstruction<\n TProgram extends string = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n> =\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedToken;\n } & ParsedCreateAssociatedTokenInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.CreateAssociatedTokenIdempotent;\n } & ParsedCreateAssociatedTokenIdempotentInstruction)\n | ({\n instructionType: AssociatedTokenInstruction.RecoverNestedAssociatedToken;\n } & ParsedRecoverNestedAssociatedTokenInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedAmountToUiAmountInstruction,\n type ParsedApplyConfidentialPendingBalanceInstruction,\n type ParsedApproveCheckedInstruction,\n type ParsedApproveConfidentialTransferAccountInstruction,\n type ParsedApproveInstruction,\n type ParsedBurnCheckedInstruction,\n type ParsedBurnInstruction,\n type ParsedCloseAccountInstruction,\n type ParsedConfidentialDepositInstruction,\n type ParsedConfidentialTransferInstruction,\n type ParsedConfidentialTransferWithFeeInstruction,\n type ParsedConfidentialWithdrawInstruction,\n type ParsedConfigureConfidentialTransferAccountInstruction,\n type ParsedCreateNativeMintInstruction,\n type ParsedDisableConfidentialCreditsInstruction,\n type ParsedDisableCpiGuardInstruction,\n type ParsedDisableHarvestToMintInstruction,\n type ParsedDisableMemoTransfersInstruction,\n type ParsedDisableNonConfidentialCreditsInstruction,\n type ParsedEmitTokenMetadataInstruction,\n type ParsedEmptyConfidentialTransferAccountInstruction,\n type ParsedEnableConfidentialCreditsInstruction,\n type ParsedEnableCpiGuardInstruction,\n type ParsedEnableHarvestToMintInstruction,\n type ParsedEnableMemoTransfersInstruction,\n type ParsedEnableNonConfidentialCreditsInstruction,\n type ParsedFreezeAccountInstruction,\n type ParsedGetAccountDataSizeInstruction,\n type ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction,\n type ParsedHarvestWithheldTokensToMintInstruction,\n type ParsedInitializeAccount2Instruction,\n type ParsedInitializeAccount3Instruction,\n type ParsedInitializeAccountInstruction,\n type ParsedInitializeConfidentialTransferFeeInstruction,\n type ParsedInitializeConfidentialTransferMintInstruction,\n type ParsedInitializeDefaultAccountStateInstruction,\n type ParsedInitializeGroupMemberPointerInstruction,\n type ParsedInitializeGroupPointerInstruction,\n type ParsedInitializeImmutableOwnerInstruction,\n type ParsedInitializeInterestBearingMintInstruction,\n type ParsedInitializeMetadataPointerInstruction,\n type ParsedInitializeMint2Instruction,\n type ParsedInitializeMintCloseAuthorityInstruction,\n type ParsedInitializeMintInstruction,\n type ParsedInitializeMultisig2Instruction,\n type ParsedInitializeMultisigInstruction,\n type ParsedInitializeNonTransferableMintInstruction,\n type ParsedInitializePausableConfigInstruction,\n type ParsedInitializePermanentDelegateInstruction,\n type ParsedInitializeScaledUiAmountMintInstruction,\n type ParsedInitializeTokenGroupInstruction,\n type ParsedInitializeTokenGroupMemberInstruction,\n type ParsedInitializeTokenMetadataInstruction,\n type ParsedInitializeTransferFeeConfigInstruction,\n type ParsedInitializeTransferHookInstruction,\n type ParsedMintToCheckedInstruction,\n type ParsedMintToInstruction,\n type ParsedPauseInstruction,\n type ParsedReallocateInstruction,\n type ParsedRemoveTokenMetadataKeyInstruction,\n type ParsedResumeInstruction,\n type ParsedRevokeInstruction,\n type ParsedSetAuthorityInstruction,\n type ParsedSetTransferFeeInstruction,\n type ParsedSyncNativeInstruction,\n type ParsedThawAccountInstruction,\n type ParsedTransferCheckedInstruction,\n type ParsedTransferCheckedWithFeeInstruction,\n type ParsedTransferInstruction,\n type ParsedUiAmountToAmountInstruction,\n type ParsedUpdateConfidentialTransferMintInstruction,\n type ParsedUpdateDefaultAccountStateInstruction,\n type ParsedUpdateGroupMemberPointerInstruction,\n type ParsedUpdateGroupPointerInstruction,\n type ParsedUpdateMetadataPointerInstruction,\n type ParsedUpdateMultiplierScaledUiMintInstruction,\n type ParsedUpdateRateInterestBearingMintInstruction,\n type ParsedUpdateTokenGroupMaxSizeInstruction,\n type ParsedUpdateTokenGroupUpdateAuthorityInstruction,\n type ParsedUpdateTokenMetadataFieldInstruction,\n type ParsedUpdateTokenMetadataUpdateAuthorityInstruction,\n type ParsedUpdateTransferHookInstruction,\n type ParsedWithdrawExcessLamportsInstruction,\n type ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction,\n type ParsedWithdrawWithheldTokensFromAccountsInstruction,\n type ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction,\n type ParsedWithdrawWithheldTokensFromMintInstruction,\n} from '../instructions';\n\nexport const TOKEN_2022_PROGRAM_ADDRESS =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n\nexport enum Token2022Account {\n Mint,\n Token,\n Multisig,\n}\n\nexport function identifyToken2022Account(\n account: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): Token2022Account {\n const data = 'data' in account ? account.data : account;\n if (data.length === 82) {\n return Token2022Account.Mint;\n }\n if (data.length === 165) {\n return Token2022Account.Token;\n }\n if (data.length === 355) {\n return Token2022Account.Multisig;\n }\n throw new Error(\n 'The provided account could not be identified as a token-2022 account.'\n );\n}\n\nexport enum Token2022Instruction {\n InitializeMint,\n InitializeAccount,\n InitializeMultisig,\n Transfer,\n Approve,\n Revoke,\n SetAuthority,\n MintTo,\n Burn,\n CloseAccount,\n FreezeAccount,\n ThawAccount,\n TransferChecked,\n ApproveChecked,\n MintToChecked,\n BurnChecked,\n InitializeAccount2,\n SyncNative,\n InitializeAccount3,\n InitializeMultisig2,\n InitializeMint2,\n GetAccountDataSize,\n InitializeImmutableOwner,\n AmountToUiAmount,\n UiAmountToAmount,\n InitializeMintCloseAuthority,\n InitializeTransferFeeConfig,\n TransferCheckedWithFee,\n WithdrawWithheldTokensFromMint,\n WithdrawWithheldTokensFromAccounts,\n HarvestWithheldTokensToMint,\n SetTransferFee,\n InitializeConfidentialTransferMint,\n UpdateConfidentialTransferMint,\n ConfigureConfidentialTransferAccount,\n ApproveConfidentialTransferAccount,\n EmptyConfidentialTransferAccount,\n ConfidentialDeposit,\n ConfidentialWithdraw,\n ConfidentialTransfer,\n ApplyConfidentialPendingBalance,\n EnableConfidentialCredits,\n DisableConfidentialCredits,\n EnableNonConfidentialCredits,\n DisableNonConfidentialCredits,\n ConfidentialTransferWithFee,\n InitializeDefaultAccountState,\n UpdateDefaultAccountState,\n Reallocate,\n EnableMemoTransfers,\n DisableMemoTransfers,\n CreateNativeMint,\n InitializeNonTransferableMint,\n InitializeInterestBearingMint,\n UpdateRateInterestBearingMint,\n EnableCpiGuard,\n DisableCpiGuard,\n InitializePermanentDelegate,\n InitializeTransferHook,\n UpdateTransferHook,\n InitializeConfidentialTransferFee,\n WithdrawWithheldTokensFromMintForConfidentialTransferFee,\n WithdrawWithheldTokensFromAccountsForConfidentialTransferFee,\n HarvestWithheldTokensToMintForConfidentialTransferFee,\n EnableHarvestToMint,\n DisableHarvestToMint,\n WithdrawExcessLamports,\n InitializeMetadataPointer,\n UpdateMetadataPointer,\n InitializeGroupPointer,\n UpdateGroupPointer,\n InitializeGroupMemberPointer,\n UpdateGroupMemberPointer,\n InitializeScaledUiAmountMint,\n UpdateMultiplierScaledUiMint,\n InitializePausableConfig,\n Pause,\n Resume,\n InitializeTokenMetadata,\n UpdateTokenMetadataField,\n RemoveTokenMetadataKey,\n UpdateTokenMetadataUpdateAuthority,\n EmitTokenMetadata,\n InitializeTokenGroup,\n UpdateTokenGroupMaxSize,\n UpdateTokenGroupUpdateAuthority,\n InitializeTokenGroupMember,\n}\n\nexport function identifyToken2022Instruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): Token2022Instruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return Token2022Instruction.InitializeMint;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return Token2022Instruction.InitializeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return Token2022Instruction.InitializeMultisig;\n }\n if (containsBytes(data, getU8Encoder().encode(3), 0)) {\n return Token2022Instruction.Transfer;\n }\n if (containsBytes(data, getU8Encoder().encode(4), 0)) {\n return Token2022Instruction.Approve;\n }\n if (containsBytes(data, getU8Encoder().encode(5), 0)) {\n return Token2022Instruction.Revoke;\n }\n if (containsBytes(data, getU8Encoder().encode(6), 0)) {\n return Token2022Instruction.SetAuthority;\n }\n if (containsBytes(data, getU8Encoder().encode(7), 0)) {\n return Token2022Instruction.MintTo;\n }\n if (containsBytes(data, getU8Encoder().encode(8), 0)) {\n return Token2022Instruction.Burn;\n }\n if (containsBytes(data, getU8Encoder().encode(9), 0)) {\n return Token2022Instruction.CloseAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(10), 0)) {\n return Token2022Instruction.FreezeAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(11), 0)) {\n return Token2022Instruction.ThawAccount;\n }\n if (containsBytes(data, getU8Encoder().encode(12), 0)) {\n return Token2022Instruction.TransferChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(13), 0)) {\n return Token2022Instruction.ApproveChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(14), 0)) {\n return Token2022Instruction.MintToChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(15), 0)) {\n return Token2022Instruction.BurnChecked;\n }\n if (containsBytes(data, getU8Encoder().encode(16), 0)) {\n return Token2022Instruction.InitializeAccount2;\n }\n if (containsBytes(data, getU8Encoder().encode(17), 0)) {\n return Token2022Instruction.SyncNative;\n }\n if (containsBytes(data, getU8Encoder().encode(18), 0)) {\n return Token2022Instruction.InitializeAccount3;\n }\n if (containsBytes(data, getU8Encoder().encode(19), 0)) {\n return Token2022Instruction.InitializeMultisig2;\n }\n if (containsBytes(data, getU8Encoder().encode(20), 0)) {\n return Token2022Instruction.InitializeMint2;\n }\n if (containsBytes(data, getU8Encoder().encode(21), 0)) {\n return Token2022Instruction.GetAccountDataSize;\n }\n if (containsBytes(data, getU8Encoder().encode(22), 0)) {\n return Token2022Instruction.InitializeImmutableOwner;\n }\n if (containsBytes(data, getU8Encoder().encode(23), 0)) {\n return Token2022Instruction.AmountToUiAmount;\n }\n if (containsBytes(data, getU8Encoder().encode(24), 0)) {\n return Token2022Instruction.UiAmountToAmount;\n }\n if (containsBytes(data, getU8Encoder().encode(25), 0)) {\n return Token2022Instruction.InitializeMintCloseAuthority;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeTransferFeeConfig;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.TransferCheckedWithFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(3), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromAccounts;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(4), 1)\n ) {\n return Token2022Instruction.HarvestWithheldTokensToMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(26), 0) &&\n containsBytes(data, getU8Encoder().encode(5), 1)\n ) {\n return Token2022Instruction.SetTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeConfidentialTransferMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateConfidentialTransferMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.ConfigureConfidentialTransferAccount;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(3), 1)\n ) {\n return Token2022Instruction.ApproveConfidentialTransferAccount;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(4), 1)\n ) {\n return Token2022Instruction.EmptyConfidentialTransferAccount;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(5), 1)\n ) {\n return Token2022Instruction.ConfidentialDeposit;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(6), 1)\n ) {\n return Token2022Instruction.ConfidentialWithdraw;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(7), 1)\n ) {\n return Token2022Instruction.ConfidentialTransfer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(8), 1)\n ) {\n return Token2022Instruction.ApplyConfidentialPendingBalance;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(9), 1)\n ) {\n return Token2022Instruction.EnableConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(10), 1)\n ) {\n return Token2022Instruction.DisableConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(11), 1)\n ) {\n return Token2022Instruction.EnableNonConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(12), 1)\n ) {\n return Token2022Instruction.DisableNonConfidentialCredits;\n }\n if (\n containsBytes(data, getU8Encoder().encode(27), 0) &&\n containsBytes(data, getU8Encoder().encode(13), 1)\n ) {\n return Token2022Instruction.ConfidentialTransferWithFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(28), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeDefaultAccountState;\n }\n if (\n containsBytes(data, getU8Encoder().encode(28), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateDefaultAccountState;\n }\n if (containsBytes(data, getU8Encoder().encode(29), 0)) {\n return Token2022Instruction.Reallocate;\n }\n if (\n containsBytes(data, getU8Encoder().encode(30), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.EnableMemoTransfers;\n }\n if (\n containsBytes(data, getU8Encoder().encode(30), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.DisableMemoTransfers;\n }\n if (containsBytes(data, getU8Encoder().encode(31), 0)) {\n return Token2022Instruction.CreateNativeMint;\n }\n if (containsBytes(data, getU8Encoder().encode(32), 0)) {\n return Token2022Instruction.InitializeNonTransferableMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(33), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeInterestBearingMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(33), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateRateInterestBearingMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(34), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.EnableCpiGuard;\n }\n if (\n containsBytes(data, getU8Encoder().encode(34), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.DisableCpiGuard;\n }\n if (containsBytes(data, getU8Encoder().encode(35), 0)) {\n return Token2022Instruction.InitializePermanentDelegate;\n }\n if (\n containsBytes(data, getU8Encoder().encode(36), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeTransferHook;\n }\n if (\n containsBytes(data, getU8Encoder().encode(36), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateTransferHook;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromMintForConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.WithdrawWithheldTokensFromAccountsForConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(3), 1)\n ) {\n return Token2022Instruction.HarvestWithheldTokensToMintForConfidentialTransferFee;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(4), 1)\n ) {\n return Token2022Instruction.EnableHarvestToMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(37), 0) &&\n containsBytes(data, getU8Encoder().encode(5), 1)\n ) {\n return Token2022Instruction.DisableHarvestToMint;\n }\n if (containsBytes(data, getU8Encoder().encode(38), 0)) {\n return Token2022Instruction.WithdrawExcessLamports;\n }\n if (\n containsBytes(data, getU8Encoder().encode(39), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeMetadataPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(39), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateMetadataPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(40), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeGroupPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(40), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateGroupPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(41), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeGroupMemberPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(41), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateGroupMemberPointer;\n }\n if (\n containsBytes(data, getU8Encoder().encode(43), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializeScaledUiAmountMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(43), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.UpdateMultiplierScaledUiMint;\n }\n if (\n containsBytes(data, getU8Encoder().encode(44), 0) &&\n containsBytes(data, getU8Encoder().encode(0), 1)\n ) {\n return Token2022Instruction.InitializePausableConfig;\n }\n if (\n containsBytes(data, getU8Encoder().encode(44), 0) &&\n containsBytes(data, getU8Encoder().encode(1), 1)\n ) {\n return Token2022Instruction.Pause;\n }\n if (\n containsBytes(data, getU8Encoder().encode(44), 0) &&\n containsBytes(data, getU8Encoder().encode(2), 1)\n ) {\n return Token2022Instruction.Resume;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([210, 225, 30, 162, 88, 184, 77, 141]),\n 0\n )\n ) {\n return Token2022Instruction.InitializeTokenMetadata;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([221, 233, 49, 45, 181, 202, 220, 200]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenMetadataField;\n }\n if (\n containsBytes(data, new Uint8Array([234, 18, 32, 56, 89, 141, 37, 181]), 0)\n ) {\n return Token2022Instruction.RemoveTokenMetadataKey;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([215, 228, 166, 228, 84, 100, 86, 123]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenMetadataUpdateAuthority;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([250, 166, 180, 250, 13, 12, 184, 70]),\n 0\n )\n ) {\n return Token2022Instruction.EmitTokenMetadata;\n }\n if (\n containsBytes(data, new Uint8Array([121, 113, 108, 39, 54, 51, 0, 4]), 0)\n ) {\n return Token2022Instruction.InitializeTokenGroup;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([108, 37, 171, 143, 248, 30, 18, 110]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenGroupMaxSize;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([161, 105, 88, 1, 237, 221, 216, 203]),\n 0\n )\n ) {\n return Token2022Instruction.UpdateTokenGroupUpdateAuthority;\n }\n if (\n containsBytes(\n data,\n new Uint8Array([152, 32, 222, 176, 223, 237, 116, 134]),\n 0\n )\n ) {\n return Token2022Instruction.InitializeTokenGroupMember;\n }\n throw new Error(\n 'The provided instruction could not be identified as a token-2022 instruction.'\n );\n}\n\nexport type ParsedToken2022Instruction<\n TProgram extends string = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n> =\n | ({\n instructionType: Token2022Instruction.InitializeMint;\n } & ParsedInitializeMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeAccount;\n } & ParsedInitializeAccountInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeMultisig;\n } & ParsedInitializeMultisigInstruction)\n | ({\n instructionType: Token2022Instruction.Transfer;\n } & ParsedTransferInstruction)\n | ({\n instructionType: Token2022Instruction.Approve;\n } & ParsedApproveInstruction)\n | ({\n instructionType: Token2022Instruction.Revoke;\n } & ParsedRevokeInstruction)\n | ({\n instructionType: Token2022Instruction.SetAuthority;\n } & ParsedSetAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.MintTo;\n } & ParsedMintToInstruction)\n | ({\n instructionType: Token2022Instruction.Burn;\n } & ParsedBurnInstruction)\n | ({\n instructionType: Token2022Instruction.CloseAccount;\n } & ParsedCloseAccountInstruction)\n | ({\n instructionType: Token2022Instruction.FreezeAccount;\n } & ParsedFreezeAccountInstruction)\n | ({\n instructionType: Token2022Instruction.ThawAccount;\n } & ParsedThawAccountInstruction)\n | ({\n instructionType: Token2022Instruction.TransferChecked;\n } & ParsedTransferCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.ApproveChecked;\n } & ParsedApproveCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.MintToChecked;\n } & ParsedMintToCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.BurnChecked;\n } & ParsedBurnCheckedInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeAccount2;\n } & ParsedInitializeAccount2Instruction)\n | ({\n instructionType: Token2022Instruction.SyncNative;\n } & ParsedSyncNativeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeAccount3;\n } & ParsedInitializeAccount3Instruction)\n | ({\n instructionType: Token2022Instruction.InitializeMultisig2;\n } & ParsedInitializeMultisig2Instruction)\n | ({\n instructionType: Token2022Instruction.InitializeMint2;\n } & ParsedInitializeMint2Instruction)\n | ({\n instructionType: Token2022Instruction.GetAccountDataSize;\n } & ParsedGetAccountDataSizeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeImmutableOwner;\n } & ParsedInitializeImmutableOwnerInstruction)\n | ({\n instructionType: Token2022Instruction.AmountToUiAmount;\n } & ParsedAmountToUiAmountInstruction)\n | ({\n instructionType: Token2022Instruction.UiAmountToAmount;\n } & ParsedUiAmountToAmountInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeMintCloseAuthority;\n } & ParsedInitializeMintCloseAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTransferFeeConfig;\n } & ParsedInitializeTransferFeeConfigInstruction)\n | ({\n instructionType: Token2022Instruction.TransferCheckedWithFee;\n } & ParsedTransferCheckedWithFeeInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromMint;\n } & ParsedWithdrawWithheldTokensFromMintInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromAccounts;\n } & ParsedWithdrawWithheldTokensFromAccountsInstruction)\n | ({\n instructionType: Token2022Instruction.HarvestWithheldTokensToMint;\n } & ParsedHarvestWithheldTokensToMintInstruction)\n | ({\n instructionType: Token2022Instruction.SetTransferFee;\n } & ParsedSetTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeConfidentialTransferMint;\n } & ParsedInitializeConfidentialTransferMintInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateConfidentialTransferMint;\n } & ParsedUpdateConfidentialTransferMintInstruction)\n | ({\n instructionType: Token2022Instruction.ConfigureConfidentialTransferAccount;\n } & ParsedConfigureConfidentialTransferAccountInstruction)\n | ({\n instructionType: Token2022Instruction.ApproveConfidentialTransferAccount;\n } & ParsedApproveConfidentialTransferAccountInstruction)\n | ({\n instructionType: Token2022Instruction.EmptyConfidentialTransferAccount;\n } & ParsedEmptyConfidentialTransferAccountInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialDeposit;\n } & ParsedConfidentialDepositInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialWithdraw;\n } & ParsedConfidentialWithdrawInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialTransfer;\n } & ParsedConfidentialTransferInstruction)\n | ({\n instructionType: Token2022Instruction.ApplyConfidentialPendingBalance;\n } & ParsedApplyConfidentialPendingBalanceInstruction)\n | ({\n instructionType: Token2022Instruction.EnableConfidentialCredits;\n } & ParsedEnableConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.DisableConfidentialCredits;\n } & ParsedDisableConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.EnableNonConfidentialCredits;\n } & ParsedEnableNonConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.DisableNonConfidentialCredits;\n } & ParsedDisableNonConfidentialCreditsInstruction)\n | ({\n instructionType: Token2022Instruction.ConfidentialTransferWithFee;\n } & ParsedConfidentialTransferWithFeeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeDefaultAccountState;\n } & ParsedInitializeDefaultAccountStateInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateDefaultAccountState;\n } & ParsedUpdateDefaultAccountStateInstruction)\n | ({\n instructionType: Token2022Instruction.Reallocate;\n } & ParsedReallocateInstruction)\n | ({\n instructionType: Token2022Instruction.EnableMemoTransfers;\n } & ParsedEnableMemoTransfersInstruction)\n | ({\n instructionType: Token2022Instruction.DisableMemoTransfers;\n } & ParsedDisableMemoTransfersInstruction)\n | ({\n instructionType: Token2022Instruction.CreateNativeMint;\n } & ParsedCreateNativeMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeNonTransferableMint;\n } & ParsedInitializeNonTransferableMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeInterestBearingMint;\n } & ParsedInitializeInterestBearingMintInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateRateInterestBearingMint;\n } & ParsedUpdateRateInterestBearingMintInstruction)\n | ({\n instructionType: Token2022Instruction.EnableCpiGuard;\n } & ParsedEnableCpiGuardInstruction)\n | ({\n instructionType: Token2022Instruction.DisableCpiGuard;\n } & ParsedDisableCpiGuardInstruction)\n | ({\n instructionType: Token2022Instruction.InitializePermanentDelegate;\n } & ParsedInitializePermanentDelegateInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTransferHook;\n } & ParsedInitializeTransferHookInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTransferHook;\n } & ParsedUpdateTransferHookInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeConfidentialTransferFee;\n } & ParsedInitializeConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromMintForConfidentialTransferFee;\n } & ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawWithheldTokensFromAccountsForConfidentialTransferFee;\n } & ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.HarvestWithheldTokensToMintForConfidentialTransferFee;\n } & ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction)\n | ({\n instructionType: Token2022Instruction.EnableHarvestToMint;\n } & ParsedEnableHarvestToMintInstruction)\n | ({\n instructionType: Token2022Instruction.DisableHarvestToMint;\n } & ParsedDisableHarvestToMintInstruction)\n | ({\n instructionType: Token2022Instruction.WithdrawExcessLamports;\n } & ParsedWithdrawExcessLamportsInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeMetadataPointer;\n } & ParsedInitializeMetadataPointerInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateMetadataPointer;\n } & ParsedUpdateMetadataPointerInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeGroupPointer;\n } & ParsedInitializeGroupPointerInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateGroupPointer;\n } & ParsedUpdateGroupPointerInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeGroupMemberPointer;\n } & ParsedInitializeGroupMemberPointerInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateGroupMemberPointer;\n } & ParsedUpdateGroupMemberPointerInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeScaledUiAmountMint;\n } & ParsedInitializeScaledUiAmountMintInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateMultiplierScaledUiMint;\n } & ParsedUpdateMultiplierScaledUiMintInstruction)\n | ({\n instructionType: Token2022Instruction.InitializePausableConfig;\n } & ParsedInitializePausableConfigInstruction)\n | ({\n instructionType: Token2022Instruction.Pause;\n } & ParsedPauseInstruction)\n | ({\n instructionType: Token2022Instruction.Resume;\n } & ParsedResumeInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTokenMetadata;\n } & ParsedInitializeTokenMetadataInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenMetadataField;\n } & ParsedUpdateTokenMetadataFieldInstruction)\n | ({\n instructionType: Token2022Instruction.RemoveTokenMetadataKey;\n } & ParsedRemoveTokenMetadataKeyInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenMetadataUpdateAuthority;\n } & ParsedUpdateTokenMetadataUpdateAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.EmitTokenMetadata;\n } & ParsedEmitTokenMetadataInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTokenGroup;\n } & ParsedInitializeTokenGroupInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenGroupMaxSize;\n } & ParsedUpdateTokenGroupMaxSizeInstruction)\n | ({\n instructionType: Token2022Instruction.UpdateTokenGroupUpdateAuthority;\n } & ParsedUpdateTokenGroupUpdateAuthorityInstruction)\n | ({\n instructionType: Token2022Instruction.InitializeTokenGroupMember;\n } & ParsedInitializeTokenGroupMemberInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\n\n/** InvalidOwner: Associated token account owner does not match address derivation */\nexport const ASSOCIATED_TOKEN_ERROR__INVALID_OWNER = 0x0; // 0\n\nexport type AssociatedTokenError = typeof ASSOCIATED_TOKEN_ERROR__INVALID_OWNER;\n\nlet associatedTokenErrorMessages:\n | Record\n | undefined;\nif (process.env.NODE_ENV !== 'production') {\n associatedTokenErrorMessages = {\n [ASSOCIATED_TOKEN_ERROR__INVALID_OWNER]: `Associated token account owner does not match address derivation`,\n };\n}\n\nexport function getAssociatedTokenErrorMessage(\n code: AssociatedTokenError\n): string {\n if (process.env.NODE_ENV !== 'production') {\n return (\n associatedTokenErrorMessages as Record\n )[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isAssociatedTokenError<\n TProgramErrorCode extends AssociatedTokenError,\n>(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\n\n/** NotRentExempt: Lamport balance below rent-exempt threshold */\nexport const TOKEN_2022_ERROR__NOT_RENT_EXEMPT = 0x0; // 0\n/** InsufficientFunds: Insufficient funds */\nexport const TOKEN_2022_ERROR__INSUFFICIENT_FUNDS = 0x1; // 1\n/** InvalidMint: Invalid Mint */\nexport const TOKEN_2022_ERROR__INVALID_MINT = 0x2; // 2\n/** MintMismatch: Account not associated with this Mint */\nexport const TOKEN_2022_ERROR__MINT_MISMATCH = 0x3; // 3\n/** OwnerMismatch: Owner does not match */\nexport const TOKEN_2022_ERROR__OWNER_MISMATCH = 0x4; // 4\n/** FixedSupply: Fixed supply */\nexport const TOKEN_2022_ERROR__FIXED_SUPPLY = 0x5; // 5\n/** AlreadyInUse: Already in use */\nexport const TOKEN_2022_ERROR__ALREADY_IN_USE = 0x6; // 6\n/** InvalidNumberOfProvidedSigners: Invalid number of provided signers */\nexport const TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS = 0x7; // 7\n/** InvalidNumberOfRequiredSigners: Invalid number of required signers */\nexport const TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS = 0x8; // 8\n/** UninitializedState: State is unititialized */\nexport const TOKEN_2022_ERROR__UNINITIALIZED_STATE = 0x9; // 9\n/** NativeNotSupported: Instruction does not support native tokens */\nexport const TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED = 0xa; // 10\n/** NonNativeHasBalance: Non-native account can only be closed if its balance is zero */\nexport const TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE = 0xb; // 11\n/** InvalidInstruction: Invalid instruction */\nexport const TOKEN_2022_ERROR__INVALID_INSTRUCTION = 0xc; // 12\n/** InvalidState: State is invalid for requested operation */\nexport const TOKEN_2022_ERROR__INVALID_STATE = 0xd; // 13\n/** Overflow: Operation overflowed */\nexport const TOKEN_2022_ERROR__OVERFLOW = 0xe; // 14\n/** AuthorityTypeNotSupported: Account does not support specified authority type */\nexport const TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED = 0xf; // 15\n/** MintCannotFreeze: This token mint cannot freeze accounts */\nexport const TOKEN_2022_ERROR__MINT_CANNOT_FREEZE = 0x10; // 16\n/** AccountFrozen: Account is frozen */\nexport const TOKEN_2022_ERROR__ACCOUNT_FROZEN = 0x11; // 17\n/** MintDecimalsMismatch: The provided decimals value different from the Mint decimals */\nexport const TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH = 0x12; // 18\n/** NonNativeNotSupported: Instruction does not support non-native tokens */\nexport const TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED = 0x13; // 19\n\nexport type Token2022Error =\n | typeof TOKEN_2022_ERROR__ACCOUNT_FROZEN\n | typeof TOKEN_2022_ERROR__ALREADY_IN_USE\n | typeof TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED\n | typeof TOKEN_2022_ERROR__FIXED_SUPPLY\n | typeof TOKEN_2022_ERROR__INSUFFICIENT_FUNDS\n | typeof TOKEN_2022_ERROR__INVALID_INSTRUCTION\n | typeof TOKEN_2022_ERROR__INVALID_MINT\n | typeof TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS\n | typeof TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS\n | typeof TOKEN_2022_ERROR__INVALID_STATE\n | typeof TOKEN_2022_ERROR__MINT_CANNOT_FREEZE\n | typeof TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH\n | typeof TOKEN_2022_ERROR__MINT_MISMATCH\n | typeof TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED\n | typeof TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE\n | typeof TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED\n | typeof TOKEN_2022_ERROR__NOT_RENT_EXEMPT\n | typeof TOKEN_2022_ERROR__OVERFLOW\n | typeof TOKEN_2022_ERROR__OWNER_MISMATCH\n | typeof TOKEN_2022_ERROR__UNINITIALIZED_STATE;\n\nlet token2022ErrorMessages: Record | undefined;\nif (process.env.NODE_ENV !== 'production') {\n token2022ErrorMessages = {\n [TOKEN_2022_ERROR__ACCOUNT_FROZEN]: `Account is frozen`,\n [TOKEN_2022_ERROR__ALREADY_IN_USE]: `Already in use`,\n [TOKEN_2022_ERROR__AUTHORITY_TYPE_NOT_SUPPORTED]: `Account does not support specified authority type`,\n [TOKEN_2022_ERROR__FIXED_SUPPLY]: `Fixed supply`,\n [TOKEN_2022_ERROR__INSUFFICIENT_FUNDS]: `Insufficient funds`,\n [TOKEN_2022_ERROR__INVALID_INSTRUCTION]: `Invalid instruction`,\n [TOKEN_2022_ERROR__INVALID_MINT]: `Invalid Mint`,\n [TOKEN_2022_ERROR__INVALID_NUMBER_OF_PROVIDED_SIGNERS]: `Invalid number of provided signers`,\n [TOKEN_2022_ERROR__INVALID_NUMBER_OF_REQUIRED_SIGNERS]: `Invalid number of required signers`,\n [TOKEN_2022_ERROR__INVALID_STATE]: `State is invalid for requested operation`,\n [TOKEN_2022_ERROR__MINT_CANNOT_FREEZE]: `This token mint cannot freeze accounts`,\n [TOKEN_2022_ERROR__MINT_DECIMALS_MISMATCH]: `The provided decimals value different from the Mint decimals`,\n [TOKEN_2022_ERROR__MINT_MISMATCH]: `Account not associated with this Mint`,\n [TOKEN_2022_ERROR__NATIVE_NOT_SUPPORTED]: `Instruction does not support native tokens`,\n [TOKEN_2022_ERROR__NON_NATIVE_HAS_BALANCE]: `Non-native account can only be closed if its balance is zero`,\n [TOKEN_2022_ERROR__NON_NATIVE_NOT_SUPPORTED]: `Instruction does not support non-native tokens`,\n [TOKEN_2022_ERROR__NOT_RENT_EXEMPT]: `Lamport balance below rent-exempt threshold`,\n [TOKEN_2022_ERROR__OVERFLOW]: `Operation overflowed`,\n [TOKEN_2022_ERROR__OWNER_MISMATCH]: `Owner does not match`,\n [TOKEN_2022_ERROR__UNINITIALIZED_STATE]: `State is unititialized`,\n };\n}\n\nexport function getToken2022ErrorMessage(code: Token2022Error): string {\n if (process.env.NODE_ENV !== 'production') {\n return (token2022ErrorMessages as Record)[code];\n }\n\n return 'Error message not available in production bundles.';\n}\n\nexport function isToken2022Error(\n error: unknown,\n transactionMessage: {\n instructions: Record;\n },\n code?: TProgramErrorCode\n): error is SolanaError &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError(\n error,\n transactionMessage,\n TOKEN_2022_PROGRAM_ADDRESS,\n code\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from '@solana/kit';\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected a value but received null or undefined.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): Address {\n if (!value) {\n throw new Error('Expected a Address.');\n }\n if (typeof value === 'object' && 'address' in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address;\n }\n return value as Address;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): ProgramDerivedAddress {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error('Expected a ProgramDerivedAddress.');\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null\n | undefined\n): TransactionSigner {\n if (!value || !isTransactionSigner(value)) {\n throw new Error('Expected a TransactionSigner.');\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null =\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: 'omitted' | 'programId'\n) {\n return (\n account: ResolvedAccount\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === 'omitted') return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner(\n value:\n | Address\n | ProgramDerivedAddress\n | TransactionSigner\n): value is TransactionSigner {\n return (\n !!value &&\n typeof value === 'object' &&\n 'address' in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR = 23;\n\nexport function getAmountToUiAmountDiscriminatorBytes() {\n return getU8Encoder().encode(AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR);\n}\n\nexport type AmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type AmountToUiAmountInstructionData = {\n discriminator: number;\n /** The amount of tokens to reformat. */\n amount: bigint;\n};\n\nexport type AmountToUiAmountInstructionDataArgs = {\n /** The amount of tokens to reformat. */\n amount: number | bigint;\n};\n\nexport function getAmountToUiAmountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: AMOUNT_TO_UI_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getAmountToUiAmountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getAmountToUiAmountInstructionDataCodec(): FixedSizeCodec<\n AmountToUiAmountInstructionDataArgs,\n AmountToUiAmountInstructionData\n> {\n return combineCodec(\n getAmountToUiAmountInstructionDataEncoder(),\n getAmountToUiAmountInstructionDataDecoder()\n );\n}\n\nexport type AmountToUiAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n amount: AmountToUiAmountInstructionDataArgs['amount'];\n};\n\nexport function getAmountToUiAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: AmountToUiAmountInput,\n config?: { programAddress?: TProgramAddress }\n): AmountToUiAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getAmountToUiAmountInstructionDataEncoder().encode(\n args as AmountToUiAmountInstructionDataArgs\n ),\n programAddress,\n } as AmountToUiAmountInstruction);\n}\n\nexport type ParsedAmountToUiAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: AmountToUiAmountInstructionData;\n};\n\nexport function parseAmountToUiAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedAmountToUiAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getAmountToUiAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const APPLY_CONFIDENTIAL_PENDING_BALANCE_DISCRIMINATOR = 27;\n\nexport function getApplyConfidentialPendingBalanceDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPLY_CONFIDENTIAL_PENDING_BALANCE_DISCRIMINATOR\n );\n}\n\nexport const APPLY_CONFIDENTIAL_PENDING_BALANCE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 8;\n\nexport function getApplyConfidentialPendingBalanceConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPLY_CONFIDENTIAL_PENDING_BALANCE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ApplyConfidentialPendingBalanceInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApplyConfidentialPendingBalanceInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * The expected number of pending balance credits since the last successful\n * `ApplyPendingBalance` instruction\n */\n expectedPendingBalanceCreditCounter: bigint;\n /**\n * The new decryptable balance if the pending balance is applied\n * successfully\n */\n newDecryptableAvailableBalance: DecryptableBalance;\n};\n\nexport type ApplyConfidentialPendingBalanceInstructionDataArgs = {\n /**\n * The expected number of pending balance credits since the last successful\n * `ApplyPendingBalance` instruction\n */\n expectedPendingBalanceCreditCounter: number | bigint;\n /**\n * The new decryptable balance if the pending balance is applied\n * successfully\n */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n};\n\nexport function getApplyConfidentialPendingBalanceInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['expectedPendingBalanceCreditCounter', getU64Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: APPLY_CONFIDENTIAL_PENDING_BALANCE_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n APPLY_CONFIDENTIAL_PENDING_BALANCE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getApplyConfidentialPendingBalanceInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['expectedPendingBalanceCreditCounter', getU64Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ]);\n}\n\nexport function getApplyConfidentialPendingBalanceInstructionDataCodec(): FixedSizeCodec<\n ApplyConfidentialPendingBalanceInstructionDataArgs,\n ApplyConfidentialPendingBalanceInstructionData\n> {\n return combineCodec(\n getApplyConfidentialPendingBalanceInstructionDataEncoder(),\n getApplyConfidentialPendingBalanceInstructionDataDecoder()\n );\n}\n\nexport type ApplyConfidentialPendingBalanceInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n expectedPendingBalanceCreditCounter: ApplyConfidentialPendingBalanceInstructionDataArgs['expectedPendingBalanceCreditCounter'];\n newDecryptableAvailableBalance: ApplyConfidentialPendingBalanceInstructionDataArgs['newDecryptableAvailableBalance'];\n multiSigners?: Array;\n};\n\nexport function getApplyConfidentialPendingBalanceInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApplyConfidentialPendingBalanceInput,\n config?: { programAddress?: TProgramAddress }\n): ApplyConfidentialPendingBalanceInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getApplyConfidentialPendingBalanceInstructionDataEncoder().encode(\n args as ApplyConfidentialPendingBalanceInstructionDataArgs\n ),\n programAddress,\n } as ApplyConfidentialPendingBalanceInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedApplyConfidentialPendingBalanceInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: ApplyConfidentialPendingBalanceInstructionData;\n};\n\nexport function parseApplyConfidentialPendingBalanceInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApplyConfidentialPendingBalanceInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getApplyConfidentialPendingBalanceInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_DISCRIMINATOR = 4;\n\nexport function getApproveDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_DISCRIMINATOR);\n}\n\nexport type ApproveInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n};\n\nexport type ApproveInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n};\n\nexport function getApproveInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_DISCRIMINATOR })\n );\n}\n\nexport function getApproveInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getApproveInstructionDataCodec(): FixedSizeCodec<\n ApproveInstructionDataArgs,\n ApproveInstructionData\n> {\n return combineCodec(\n getApproveInstructionDataEncoder(),\n getApproveInstructionDataDecoder()\n );\n}\n\nexport type ApproveInput<\n TAccountSource extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getApproveInstruction<\n TAccountSource extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApproveInput,\n config?: { programAddress?: TProgramAddress }\n): ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveInstructionDataEncoder().encode(\n args as ApproveInstructionDataArgs\n ),\n programAddress,\n } as ApproveInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The delegate. */\n delegate: TAccountMetas[1];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ApproveInstructionData;\n};\n\nexport function parseApproveInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_CHECKED_DISCRIMINATOR = 13;\n\nexport function getApproveCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(APPROVE_CHECKED_DISCRIMINATOR);\n}\n\nexport type ApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDelegate extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDelegate extends string\n ? ReadonlyAccount\n : TAccountDelegate,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens the delegate is approved for. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type ApproveCheckedInstructionDataArgs = {\n /** The amount of tokens the delegate is approved for. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getApproveCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: APPROVE_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getApproveCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getApproveCheckedInstructionDataCodec(): FixedSizeCodec<\n ApproveCheckedInstructionDataArgs,\n ApproveCheckedInstructionData\n> {\n return combineCodec(\n getApproveCheckedInstructionDataEncoder(),\n getApproveCheckedInstructionDataDecoder()\n );\n}\n\nexport type ApproveCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDelegate extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The delegate. */\n delegate: Address;\n /** The source account owner or its multisignature account. */\n owner: Address | TransactionSigner;\n amount: ApproveCheckedInstructionDataArgs['amount'];\n decimals: ApproveCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getApproveCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDelegate extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApproveCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n TAccountOwner\n >,\n config?: { programAddress?: TProgramAddress }\n): ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n delegate: { value: input.delegate ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.delegate),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getApproveCheckedInstructionDataEncoder().encode(\n args as ApproveCheckedInstructionDataArgs\n ),\n programAddress,\n } as ApproveCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDelegate,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedApproveCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The delegate. */\n delegate: TAccountMetas[2];\n /** The source account owner or its multisignature account. */\n owner: TAccountMetas[3];\n };\n data: ApproveCheckedInstructionData;\n};\n\nexport function parseApproveCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n delegate: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getApproveCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR = 27;\n\nexport function getApproveConfidentialTransferAccountDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR\n );\n}\n\nexport const APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 3;\n\nexport function getApproveConfidentialTransferAccountConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ApproveConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ApproveConfidentialTransferAccountInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type ApproveConfidentialTransferAccountInstructionDataArgs = {};\n\nexport function getApproveConfidentialTransferAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n APPROVE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getApproveConfidentialTransferAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getApproveConfidentialTransferAccountInstructionDataCodec(): FixedSizeCodec<\n ApproveConfidentialTransferAccountInstructionDataArgs,\n ApproveConfidentialTransferAccountInstructionData\n> {\n return combineCodec(\n getApproveConfidentialTransferAccountInstructionDataEncoder(),\n getApproveConfidentialTransferAccountInstructionDataDecoder()\n );\n}\n\nexport type ApproveConfidentialTransferAccountInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account to approve. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** Confidential transfer mint authority. */\n authority: TransactionSigner;\n};\n\nexport function getApproveConfidentialTransferAccountInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ApproveConfidentialTransferAccountInput<\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ApproveConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getApproveConfidentialTransferAccountInstructionDataEncoder().encode(\n {}\n ),\n programAddress,\n } as ApproveConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n >);\n}\n\nexport type ParsedApproveConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account to approve. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** Confidential transfer mint authority. */\n authority: TAccountMetas[2];\n };\n data: ApproveConfidentialTransferAccountInstructionData;\n};\n\nexport function parseApproveConfidentialTransferAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedApproveConfidentialTransferAccountInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getApproveConfidentialTransferAccountInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_DISCRIMINATOR = 8;\n\nexport function getBurnDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_DISCRIMINATOR);\n}\n\nexport type BurnInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnInstructionData = {\n /** The amount of tokens to burn. */\n discriminator: number;\n amount: bigint;\n};\n\nexport type BurnInstructionDataArgs = { amount: number | bigint };\n\nexport function getBurnInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_DISCRIMINATOR })\n );\n}\n\nexport function getBurnInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getBurnInstructionDataCodec(): FixedSizeCodec<\n BurnInstructionDataArgs,\n BurnInstructionData\n> {\n return combineCodec(\n getBurnInstructionDataEncoder(),\n getBurnInstructionDataDecoder()\n );\n}\n\nexport type BurnInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getBurnInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: BurnInput,\n config?: { programAddress?: TProgramAddress }\n): BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnInstructionDataEncoder().encode(\n args as BurnInstructionDataArgs\n ),\n programAddress,\n } as BurnInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnInstructionData;\n};\n\nexport function parseBurnInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const BURN_CHECKED_DISCRIMINATOR = 15;\n\nexport function getBurnCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(BURN_CHECKED_DISCRIMINATOR);\n}\n\nexport type BurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type BurnCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to burn. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type BurnCheckedInstructionDataArgs = {\n /** The amount of tokens to burn. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getBurnCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: BURN_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getBurnCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getBurnCheckedInstructionDataCodec(): FixedSizeCodec<\n BurnCheckedInstructionDataArgs,\n BurnCheckedInstructionData\n> {\n return combineCodec(\n getBurnCheckedInstructionDataEncoder(),\n getBurnCheckedInstructionDataDecoder()\n );\n}\n\nexport type BurnCheckedInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The account to burn from. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: BurnCheckedInstructionDataArgs['amount'];\n decimals: BurnCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getBurnCheckedInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: BurnCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getBurnCheckedInstructionDataEncoder().encode(\n args as BurnCheckedInstructionDataArgs\n ),\n programAddress,\n } as BurnCheckedInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedBurnCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to burn from. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: BurnCheckedInstructionData;\n};\n\nexport function parseBurnCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedBurnCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getBurnCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CLOSE_ACCOUNT_DISCRIMINATOR = 9;\n\nexport function getCloseAccountDiscriminatorBytes() {\n return getU8Encoder().encode(CLOSE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type CloseAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseAccountInstructionData = { discriminator: number };\n\nexport type CloseAccountInstructionDataArgs = {};\n\nexport function getCloseAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: CLOSE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getCloseAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCloseAccountInstructionDataCodec(): FixedSizeCodec<\n CloseAccountInstructionDataArgs,\n CloseAccountInstructionData\n> {\n return combineCodec(\n getCloseAccountInstructionDataEncoder(),\n getCloseAccountInstructionDataDecoder()\n );\n}\n\nexport type CloseAccountInput<\n TAccountAccount extends string = string,\n TAccountDestination extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to close. */\n account: Address;\n /** The destination account. */\n destination: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getCloseAccountInstruction<\n TAccountAccount extends string,\n TAccountDestination extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: CloseAccountInput,\n config?: { programAddress?: TProgramAddress }\n): CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getCloseAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountDestination,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedCloseAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to close. */\n account: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: CloseAccountInstructionData;\n};\n\nexport function parseCloseAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCloseAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n destination: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getCloseAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CONFIDENTIAL_DEPOSIT_DISCRIMINATOR = 27;\n\nexport function getConfidentialDepositDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_DEPOSIT_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_DEPOSIT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 5;\n\nexport function getConfidentialDepositConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_DEPOSIT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialDepositInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialDepositInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The amount of tokens to deposit. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type ConfidentialDepositInstructionDataArgs = {\n /** The amount of tokens to deposit. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getConfidentialDepositInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_DEPOSIT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_DEPOSIT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialDepositInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getConfidentialDepositInstructionDataCodec(): FixedSizeCodec<\n ConfidentialDepositInstructionDataArgs,\n ConfidentialDepositInstructionData\n> {\n return combineCodec(\n getConfidentialDepositInstructionDataEncoder(),\n getConfidentialDepositInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialDepositInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: ConfidentialDepositInstructionDataArgs['amount'];\n decimals: ConfidentialDepositInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialDepositInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialDepositInput<\n TAccountToken,\n TAccountMint,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialDepositInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialDepositInstructionDataEncoder().encode(\n args as ConfidentialDepositInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialDepositInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialDepositInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: ConfidentialDepositInstructionData;\n};\n\nexport function parseConfidentialDepositInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialDepositInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialDepositInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 27;\n\nexport function getConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_TRANSFER_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_TRANSFER_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 7;\n\nexport function getConfidentialTransferConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_TRANSFER_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialTransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSourceToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestinationToken extends string | AccountMeta = string,\n TAccountInstructionsSysvar extends string | AccountMeta = string,\n TAccountEqualityRecord extends string | AccountMeta = string,\n TAccountCiphertextValidityRecord extends\n | string\n | AccountMeta = string,\n TAccountRangeRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSourceToken extends string\n ? WritableAccount\n : TAccountSourceToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestinationToken extends string\n ? WritableAccount\n : TAccountDestinationToken,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvar,\n TAccountEqualityRecord extends string\n ? ReadonlyAccount\n : TAccountEqualityRecord,\n TAccountCiphertextValidityRecord extends string\n ? ReadonlyAccount\n : TAccountCiphertextValidityRecord,\n TAccountRangeRecord extends string\n ? ReadonlyAccount\n : TAccountRangeRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialTransferInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalance;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Transfer` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n ciphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU128Data`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport type ConfidentialTransferInstructionDataArgs = {\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalanceArgs;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Transfer` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n ciphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU128Data`\n * instruction to the `Transfer` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport function getConfidentialTransferInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['equalityProofInstructionOffset', getI8Encoder()],\n ['ciphertextValidityProofInstructionOffset', getI8Encoder()],\n ['rangeProofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_TRANSFER_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialTransferInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['equalityProofInstructionOffset', getI8Decoder()],\n ['ciphertextValidityProofInstructionOffset', getI8Decoder()],\n ['rangeProofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfidentialTransferInstructionDataCodec(): FixedSizeCodec<\n ConfidentialTransferInstructionDataArgs,\n ConfidentialTransferInstructionData\n> {\n return combineCodec(\n getConfidentialTransferInstructionDataEncoder(),\n getConfidentialTransferInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialTransferInput<\n TAccountSourceToken extends string = string,\n TAccountMint extends string = string,\n TAccountDestinationToken extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountEqualityRecord extends string = string,\n TAccountCiphertextValidityRecord extends string = string,\n TAccountRangeRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source SPL Token account. */\n sourceToken: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** The destination SPL Token account. */\n destinationToken: Address;\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: Address;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: Address;\n /** (Optional) Ciphertext validity proof record account or context state account. */\n ciphertextValidityRecord?: Address;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n newSourceDecryptableAvailableBalance: ConfidentialTransferInstructionDataArgs['newSourceDecryptableAvailableBalance'];\n equalityProofInstructionOffset: ConfidentialTransferInstructionDataArgs['equalityProofInstructionOffset'];\n ciphertextValidityProofInstructionOffset: ConfidentialTransferInstructionDataArgs['ciphertextValidityProofInstructionOffset'];\n rangeProofInstructionOffset: ConfidentialTransferInstructionDataArgs['rangeProofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialTransferInstruction<\n TAccountSourceToken extends string,\n TAccountMint extends string,\n TAccountDestinationToken extends string,\n TAccountInstructionsSysvar extends string,\n TAccountEqualityRecord extends string,\n TAccountCiphertextValidityRecord extends string,\n TAccountRangeRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialTransferInput<\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountCiphertextValidityRecord,\n TAccountRangeRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialTransferInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n sourceToken: { value: input.sourceToken ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destinationToken: {\n value: input.destinationToken ?? null,\n isWritable: true,\n },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n equalityRecord: { value: input.equalityRecord ?? null, isWritable: false },\n ciphertextValidityRecord: {\n value: input.ciphertextValidityRecord ?? null,\n isWritable: false,\n },\n rangeRecord: { value: input.rangeRecord ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.sourceToken),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destinationToken),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.equalityRecord),\n getAccountMeta(accounts.ciphertextValidityRecord),\n getAccountMeta(accounts.rangeRecord),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialTransferInstructionDataEncoder().encode(\n args as ConfidentialTransferInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialTransferInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialTransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source SPL Token account. */\n sourceToken: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** The destination SPL Token account. */\n destinationToken: TAccountMetas[2];\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: TAccountMetas[3] | undefined;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: TAccountMetas[4] | undefined;\n /** (Optional) Ciphertext validity proof record account or context state account. */\n ciphertextValidityRecord?: TAccountMetas[5] | undefined;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: TAccountMetas[6] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[7];\n };\n data: ConfidentialTransferInstructionData;\n};\n\nexport function parseConfidentialTransferInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialTransferInstruction {\n if (instruction.accounts.length < 8) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n sourceToken: getNextAccount(),\n mint: getNextAccount(),\n destinationToken: getNextAccount(),\n instructionsSysvar: getNextOptionalAccount(),\n equalityRecord: getNextOptionalAccount(),\n ciphertextValidityRecord: getNextOptionalAccount(),\n rangeRecord: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialTransferInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIDENTIAL_TRANSFER_WITH_FEE_DISCRIMINATOR = 27;\n\nexport function getConfidentialTransferWithFeeDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_TRANSFER_WITH_FEE_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_TRANSFER_WITH_FEE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 13;\n\nexport function getConfidentialTransferWithFeeConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_TRANSFER_WITH_FEE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialTransferWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSourceToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestinationToken extends string | AccountMeta = string,\n TAccountInstructionsSysvar extends string | AccountMeta = string,\n TAccountEqualityRecord extends string | AccountMeta = string,\n TAccountTransferAmountCiphertextValidityRecord extends\n | string\n | AccountMeta = string,\n TAccountFeeSigmaRecord extends string | AccountMeta = string,\n TAccountFeeCiphertextValidityRecord extends\n | string\n | AccountMeta = string,\n TAccountRangeRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSourceToken extends string\n ? WritableAccount\n : TAccountSourceToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestinationToken extends string\n ? WritableAccount\n : TAccountDestinationToken,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvar,\n TAccountEqualityRecord extends string\n ? ReadonlyAccount\n : TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord extends string\n ? ReadonlyAccount\n : TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord extends string\n ? ReadonlyAccount\n : TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord extends string\n ? ReadonlyAccount\n : TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord extends string\n ? ReadonlyAccount\n : TAccountRangeRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialTransferWithFeeInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalance;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `TransferWithFee` instruction in the transaction. If the offset\n * is `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n transferAmountCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::VerifyPercentageWithFee`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeSigmaProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext2HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU256Data`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport type ConfidentialTransferWithFeeInstructionDataArgs = {\n /** The new source decryptable balance if the transfer succeeds. */\n newSourceDecryptableAvailableBalance: DecryptableBalanceArgs;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `TransferWithFee` instruction in the transaction. If the offset\n * is `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n transferAmountCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::VerifyPercentageWithFee`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeSigmaProofInstructionOffset: number;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyBatchedGroupedCiphertext2HandlesValidity`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n feeCiphertextValidityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU256Data`\n * instruction to the `TransferWithFee` instruction in the transaction.\n * If the offset is `0`, then use a context state account for the\n * proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport function getConfidentialTransferWithFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['equalityProofInstructionOffset', getI8Encoder()],\n [\n 'transferAmountCiphertextValidityProofInstructionOffset',\n getI8Encoder(),\n ],\n ['feeSigmaProofInstructionOffset', getI8Encoder()],\n ['feeCiphertextValidityProofInstructionOffset', getI8Encoder()],\n ['rangeProofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_TRANSFER_WITH_FEE_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_TRANSFER_WITH_FEE_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialTransferWithFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['newSourceDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['equalityProofInstructionOffset', getI8Decoder()],\n ['transferAmountCiphertextValidityProofInstructionOffset', getI8Decoder()],\n ['feeSigmaProofInstructionOffset', getI8Decoder()],\n ['feeCiphertextValidityProofInstructionOffset', getI8Decoder()],\n ['rangeProofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfidentialTransferWithFeeInstructionDataCodec(): FixedSizeCodec<\n ConfidentialTransferWithFeeInstructionDataArgs,\n ConfidentialTransferWithFeeInstructionData\n> {\n return combineCodec(\n getConfidentialTransferWithFeeInstructionDataEncoder(),\n getConfidentialTransferWithFeeInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialTransferWithFeeInput<\n TAccountSourceToken extends string = string,\n TAccountMint extends string = string,\n TAccountDestinationToken extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountEqualityRecord extends string = string,\n TAccountTransferAmountCiphertextValidityRecord extends string = string,\n TAccountFeeSigmaRecord extends string = string,\n TAccountFeeCiphertextValidityRecord extends string = string,\n TAccountRangeRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source SPL Token account. */\n sourceToken: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /** The destination SPL Token account. */\n destinationToken: Address;\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: Address;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: Address;\n /**\n * (Optional) Transfer amount ciphertext validity proof record\n * account or context state account.\n */\n transferAmountCiphertextValidityRecord?: Address;\n /** (Optional) Fee sigma proof record account or context state account. */\n feeSigmaRecord?: Address;\n /** (Optional) Fee ciphertext validity proof record account or context state account. */\n feeCiphertextValidityRecord?: Address;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n newSourceDecryptableAvailableBalance: ConfidentialTransferWithFeeInstructionDataArgs['newSourceDecryptableAvailableBalance'];\n equalityProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['equalityProofInstructionOffset'];\n transferAmountCiphertextValidityProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['transferAmountCiphertextValidityProofInstructionOffset'];\n feeSigmaProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['feeSigmaProofInstructionOffset'];\n feeCiphertextValidityProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['feeCiphertextValidityProofInstructionOffset'];\n rangeProofInstructionOffset: ConfidentialTransferWithFeeInstructionDataArgs['rangeProofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialTransferWithFeeInstruction<\n TAccountSourceToken extends string,\n TAccountMint extends string,\n TAccountDestinationToken extends string,\n TAccountInstructionsSysvar extends string,\n TAccountEqualityRecord extends string,\n TAccountTransferAmountCiphertextValidityRecord extends string,\n TAccountFeeSigmaRecord extends string,\n TAccountFeeCiphertextValidityRecord extends string,\n TAccountRangeRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialTransferWithFeeInput<\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialTransferWithFeeInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n sourceToken: { value: input.sourceToken ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destinationToken: {\n value: input.destinationToken ?? null,\n isWritable: true,\n },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n equalityRecord: { value: input.equalityRecord ?? null, isWritable: false },\n transferAmountCiphertextValidityRecord: {\n value: input.transferAmountCiphertextValidityRecord ?? null,\n isWritable: false,\n },\n feeSigmaRecord: { value: input.feeSigmaRecord ?? null, isWritable: false },\n feeCiphertextValidityRecord: {\n value: input.feeCiphertextValidityRecord ?? null,\n isWritable: false,\n },\n rangeRecord: { value: input.rangeRecord ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.sourceToken),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destinationToken),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.equalityRecord),\n getAccountMeta(accounts.transferAmountCiphertextValidityRecord),\n getAccountMeta(accounts.feeSigmaRecord),\n getAccountMeta(accounts.feeCiphertextValidityRecord),\n getAccountMeta(accounts.rangeRecord),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialTransferWithFeeInstructionDataEncoder().encode(\n args as ConfidentialTransferWithFeeInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialTransferWithFeeInstruction<\n TProgramAddress,\n TAccountSourceToken,\n TAccountMint,\n TAccountDestinationToken,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountTransferAmountCiphertextValidityRecord,\n TAccountFeeSigmaRecord,\n TAccountFeeCiphertextValidityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialTransferWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source SPL Token account. */\n sourceToken: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /** The destination SPL Token account. */\n destinationToken: TAccountMetas[2];\n /**\n * (Optional) Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: TAccountMetas[3] | undefined;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: TAccountMetas[4] | undefined;\n /**\n * (Optional) Transfer amount ciphertext validity proof record\n * account or context state account.\n */\n transferAmountCiphertextValidityRecord?: TAccountMetas[5] | undefined;\n /** (Optional) Fee sigma proof record account or context state account. */\n feeSigmaRecord?: TAccountMetas[6] | undefined;\n /** (Optional) Fee ciphertext validity proof record account or context state account. */\n feeCiphertextValidityRecord?: TAccountMetas[7] | undefined;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: TAccountMetas[8] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[9];\n };\n data: ConfidentialTransferWithFeeInstructionData;\n};\n\nexport function parseConfidentialTransferWithFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialTransferWithFeeInstruction {\n if (instruction.accounts.length < 10) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n sourceToken: getNextAccount(),\n mint: getNextAccount(),\n destinationToken: getNextAccount(),\n instructionsSysvar: getNextOptionalAccount(),\n equalityRecord: getNextOptionalAccount(),\n transferAmountCiphertextValidityRecord: getNextOptionalAccount(),\n feeSigmaRecord: getNextOptionalAccount(),\n feeCiphertextValidityRecord: getNextOptionalAccount(),\n rangeRecord: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialTransferWithFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIDENTIAL_WITHDRAW_DISCRIMINATOR = 27;\n\nexport function getConfidentialWithdrawDiscriminatorBytes() {\n return getU8Encoder().encode(CONFIDENTIAL_WITHDRAW_DISCRIMINATOR);\n}\n\nexport const CONFIDENTIAL_WITHDRAW_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 6;\n\nexport function getConfidentialWithdrawConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIDENTIAL_WITHDRAW_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfidentialWithdrawInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountInstructionsSysvar extends string | AccountMeta = string,\n TAccountEqualityRecord extends string | AccountMeta = string,\n TAccountRangeRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvar,\n TAccountEqualityRecord extends string\n ? ReadonlyAccount\n : TAccountEqualityRecord,\n TAccountRangeRecord extends string\n ? ReadonlyAccount\n : TAccountRangeRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfidentialWithdrawInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The amount of tokens to withdraw. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The new decryptable balance if the withdrawal succeeds. */\n newDecryptableAvailableBalance: DecryptableBalance;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Withdraw` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU64`\n * instruction to the `Withdraw` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport type ConfidentialWithdrawInstructionDataArgs = {\n /** The amount of tokens to withdraw. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The new decryptable balance if the withdrawal succeeds. */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n /**\n * Relative location of the\n * `ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\n * to the `Withdraw` instruction in the transaction. If the offset is\n * `0`, then use a context state account for the proof.\n */\n equalityProofInstructionOffset: number;\n /**\n * Relative location of the `ProofInstruction::BatchedRangeProofU64`\n * instruction to the `Withdraw` instruction in the transaction. If the\n * offset is `0`, then use a context state account for the proof.\n */\n rangeProofInstructionOffset: number;\n};\n\nexport function getConfidentialWithdrawInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ['equalityProofInstructionOffset', getI8Encoder()],\n ['rangeProofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIDENTIAL_WITHDRAW_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIDENTIAL_WITHDRAW_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfidentialWithdrawInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ['equalityProofInstructionOffset', getI8Decoder()],\n ['rangeProofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfidentialWithdrawInstructionDataCodec(): FixedSizeCodec<\n ConfidentialWithdrawInstructionDataArgs,\n ConfidentialWithdrawInstructionData\n> {\n return combineCodec(\n getConfidentialWithdrawInstructionDataEncoder(),\n getConfidentialWithdrawInstructionDataDecoder()\n );\n}\n\nexport type ConfidentialWithdrawInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountEqualityRecord extends string = string,\n TAccountRangeRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /**\n * Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: Address;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: Address;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: ConfidentialWithdrawInstructionDataArgs['amount'];\n decimals: ConfidentialWithdrawInstructionDataArgs['decimals'];\n newDecryptableAvailableBalance: ConfidentialWithdrawInstructionDataArgs['newDecryptableAvailableBalance'];\n equalityProofInstructionOffset: ConfidentialWithdrawInstructionDataArgs['equalityProofInstructionOffset'];\n rangeProofInstructionOffset: ConfidentialWithdrawInstructionDataArgs['rangeProofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfidentialWithdrawInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountInstructionsSysvar extends string,\n TAccountEqualityRecord extends string,\n TAccountRangeRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfidentialWithdrawInput<\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountRangeRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfidentialWithdrawInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n equalityRecord: { value: input.equalityRecord ?? null, isWritable: false },\n rangeRecord: { value: input.rangeRecord ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.equalityRecord),\n getAccountMeta(accounts.rangeRecord),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfidentialWithdrawInstructionDataEncoder().encode(\n args as ConfidentialWithdrawInstructionDataArgs\n ),\n programAddress,\n } as ConfidentialWithdrawInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvar,\n TAccountEqualityRecord,\n TAccountRangeRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfidentialWithdrawInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /**\n * Instructions sysvar if at least one of the\n * `zk_elgamal_proof` instructions are included in the same\n * transaction.\n */\n instructionsSysvar?: TAccountMetas[2] | undefined;\n /** (Optional) Equality proof record account or context state account. */\n equalityRecord?: TAccountMetas[3] | undefined;\n /** (Optional) Range proof record account or context state account. */\n rangeRecord?: TAccountMetas[4] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[5];\n };\n data: ConfidentialWithdrawInstructionData;\n};\n\nexport function parseConfidentialWithdrawInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfidentialWithdrawInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n instructionsSysvar: getNextOptionalAccount(),\n equalityRecord: getNextOptionalAccount(),\n rangeRecord: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfidentialWithdrawInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR = 27;\n\nexport function getConfigureConfidentialTransferAccountDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR\n );\n}\n\nexport const CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 2;\n\nexport function getConfigureConfidentialTransferAccountConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type ConfigureConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = 'Sysvar1nstructions1111111111111111111111111',\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ConfigureConfidentialTransferAccountInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /** The decryptable balance (always 0) once the configure account succeeds. */\n decryptableZeroBalance: DecryptableBalance;\n /**\n * The maximum number of despots and transfers that an account can receiver\n * before the `ApplyPendingBalance` is executed\n */\n maximumPendingBalanceCreditCounter: bigint;\n /**\n * Relative location of the `ProofInstruction::ZeroCiphertextProof`\n * instruction to the `ConfigureAccount` instruction in the\n * transaction. If the offset is `0`, then use a context state account\n * for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport type ConfigureConfidentialTransferAccountInstructionDataArgs = {\n /** The decryptable balance (always 0) once the configure account succeeds. */\n decryptableZeroBalance: DecryptableBalanceArgs;\n /**\n * The maximum number of despots and transfers that an account can receiver\n * before the `ApplyPendingBalance` is executed\n */\n maximumPendingBalanceCreditCounter: number | bigint;\n /**\n * Relative location of the `ProofInstruction::ZeroCiphertextProof`\n * instruction to the `ConfigureAccount` instruction in the\n * transaction. If the offset is `0`, then use a context state account\n * for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport function getConfigureConfidentialTransferAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['decryptableZeroBalance', getDecryptableBalanceEncoder()],\n ['maximumPendingBalanceCreditCounter', getU64Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getConfigureConfidentialTransferAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['decryptableZeroBalance', getDecryptableBalanceDecoder()],\n ['maximumPendingBalanceCreditCounter', getU64Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getConfigureConfidentialTransferAccountInstructionDataCodec(): FixedSizeCodec<\n ConfigureConfidentialTransferAccountInstructionDataArgs,\n ConfigureConfidentialTransferAccountInstructionData\n> {\n return combineCodec(\n getConfigureConfidentialTransferAccountInstructionDataEncoder(),\n getConfigureConfidentialTransferAccountInstructionDataDecoder()\n );\n}\n\nexport type ConfigureConfidentialTransferAccountInput<\n TAccountToken extends string = string,\n TAccountMint extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The corresponding SPL Token mint. */\n mint: Address;\n /**\n * Instructions sysvar if `VerifyPubkeyValidity` is included in\n * the same transaction or context state account if\n * `VerifyPubkeyValidity` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState?: Address;\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n decryptableZeroBalance: ConfigureConfidentialTransferAccountInstructionDataArgs['decryptableZeroBalance'];\n maximumPendingBalanceCreditCounter: ConfigureConfidentialTransferAccountInstructionDataArgs['maximumPendingBalanceCreditCounter'];\n proofInstructionOffset: ConfigureConfidentialTransferAccountInstructionDataArgs['proofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getConfigureConfidentialTransferAccountInstruction<\n TAccountToken extends string,\n TAccountMint extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ConfigureConfidentialTransferAccountInput<\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): ConfigureConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvarOrContextState.value) {\n accounts.instructionsSysvarOrContextState.value =\n 'Sysvar1nstructions1111111111111111111111111' as Address<'Sysvar1nstructions1111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getConfigureConfidentialTransferAccountInstructionDataEncoder().encode(\n args as ConfigureConfidentialTransferAccountInstructionDataArgs\n ),\n programAddress,\n } as ConfigureConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountMint,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedConfigureConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The corresponding SPL Token mint. */\n mint: TAccountMetas[1];\n /**\n * Instructions sysvar if `VerifyPubkeyValidity` is included in\n * the same transaction or context state account if\n * `VerifyPubkeyValidity` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState: TAccountMetas[2];\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: TAccountMetas[3] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[4];\n };\n data: ConfigureConfidentialTransferAccountInstructionData;\n};\n\nexport function parseConfigureConfidentialTransferAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedConfigureConfidentialTransferAccountInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n mint: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getConfigureConfidentialTransferAccountInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n getAddressEncoder,\n getProgramDerivedAddress,\n type Address,\n type ProgramDerivedAddress,\n} from '@solana/kit';\n\nexport type AssociatedTokenSeeds = {\n /** The wallet address of the associated token account. */\n owner: Address;\n /** The address of the token program to use. */\n tokenProgram: Address;\n /** The mint address of the associated token account. */\n mint: Address;\n};\n\nexport async function findAssociatedTokenPda(\n seeds: AssociatedTokenSeeds,\n config: { programAddress?: Address | undefined } = {}\n): Promise {\n const {\n programAddress = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>,\n } = config;\n return await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getAddressEncoder().encode(seeds.owner),\n getAddressEncoder().encode(seeds.tokenProgram),\n getAddressEncoder().encode(seeds.mint),\n ],\n });\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR = 0;\n\nexport function getCreateAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type CreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenInstructionData = { discriminator: number };\n\nexport type CreateAssociatedTokenInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenInstructionDataArgs,\n CreateAssociatedTokenInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenInstructionDataEncoder(),\n getCreateAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenInstructionData;\n};\n\nexport function parseCreateAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR = 1;\n\nexport function getCreateAssociatedTokenIdempotentDiscriminatorBytes() {\n return getU8Encoder().encode(\n CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR\n );\n}\n\nexport type CreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountAta extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountAta extends string ? WritableAccount : TAccountAta,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateAssociatedTokenIdempotentInstructionData = {\n discriminator: number;\n};\n\nexport type CreateAssociatedTokenIdempotentInstructionDataArgs = {};\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: CREATE_ASSOCIATED_TOKEN_IDEMPOTENT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateAssociatedTokenIdempotentInstructionDataCodec(): FixedSizeCodec<\n CreateAssociatedTokenIdempotentInstructionDataArgs,\n CreateAssociatedTokenIdempotentInstructionData\n> {\n return combineCodec(\n getCreateAssociatedTokenIdempotentInstructionDataEncoder(),\n getCreateAssociatedTokenIdempotentInstructionDataDecoder()\n );\n}\n\nexport type CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata?: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getCreateAssociatedTokenIdempotentInstructionAsync<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentAsyncInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await findAssociatedTokenPda({\n owner: expectAddress(accounts.owner.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.mint.value),\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type CreateAssociatedTokenIdempotentInput<\n TAccountPayer extends string = string,\n TAccountAta extends string = string,\n TAccountOwner extends string = string,\n TAccountMint extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Funding account (must be a system account). */\n payer: TransactionSigner;\n /** Associated token account address to be created. */\n ata: Address;\n /** Wallet address for the new associated token account. */\n owner: Address;\n /** The token mint for the new associated token account. */\n mint: Address;\n /** System program. */\n systemProgram?: Address;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getCreateAssociatedTokenIdempotentInstruction<\n TAccountPayer extends string,\n TAccountAta extends string,\n TAccountOwner extends string,\n TAccountMint extends string,\n TAccountSystemProgram extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: CreateAssociatedTokenIdempotentInput<\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n ata: { value: input.ata ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n mint: { value: input.mint ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getCreateAssociatedTokenIdempotentInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateAssociatedTokenIdempotentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountAta,\n TAccountOwner,\n TAccountMint,\n TAccountSystemProgram,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account). */\n payer: TAccountMetas[0];\n /** Associated token account address to be created. */\n ata: TAccountMetas[1];\n /** Wallet address for the new associated token account. */\n owner: TAccountMetas[2];\n /** The token mint for the new associated token account. */\n mint: TAccountMetas[3];\n /** System program. */\n systemProgram: TAccountMetas[4];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[5];\n };\n data: CreateAssociatedTokenIdempotentInstructionData;\n};\n\nexport function parseCreateAssociatedTokenIdempotentInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateAssociatedTokenIdempotentInstruction {\n if (instruction.accounts.length < 6) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n ata: getNextAccount(),\n owner: getNextAccount(),\n mint: getNextAccount(),\n systemProgram: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getCreateAssociatedTokenIdempotentInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const CREATE_NATIVE_MINT_DISCRIMINATOR = 31;\n\nexport function getCreateNativeMintDiscriminatorBytes() {\n return getU8Encoder().encode(CREATE_NATIVE_MINT_DISCRIMINATOR);\n}\n\nexport type CreateNativeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta = string,\n TAccountNativeMint extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountNativeMint extends string\n ? WritableAccount\n : TAccountNativeMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateNativeMintInstructionData = { discriminator: number };\n\nexport type CreateNativeMintInstructionDataArgs = {};\n\nexport function getCreateNativeMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: CREATE_NATIVE_MINT_DISCRIMINATOR })\n );\n}\n\nexport function getCreateNativeMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getCreateNativeMintInstructionDataCodec(): FixedSizeCodec<\n CreateNativeMintInstructionDataArgs,\n CreateNativeMintInstructionData\n> {\n return combineCodec(\n getCreateNativeMintInstructionDataEncoder(),\n getCreateNativeMintInstructionDataDecoder()\n );\n}\n\nexport type CreateNativeMintInput<\n TAccountPayer extends string = string,\n TAccountNativeMint extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Funding account (must be a system account) */\n payer: TransactionSigner;\n /** The native mint address */\n nativeMint: Address;\n /** System program for mint account funding */\n systemProgram?: Address;\n};\n\nexport function getCreateNativeMintInstruction<\n TAccountPayer extends string,\n TAccountNativeMint extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: CreateNativeMintInput<\n TAccountPayer,\n TAccountNativeMint,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): CreateNativeMintInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNativeMint,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n nativeMint: { value: input.nativeMint ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.nativeMint),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getCreateNativeMintInstructionDataEncoder().encode({}),\n programAddress,\n } as CreateNativeMintInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountNativeMint,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedCreateNativeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Funding account (must be a system account) */\n payer: TAccountMetas[0];\n /** The native mint address */\n nativeMint: TAccountMetas[1];\n /** System program for mint account funding */\n systemProgram: TAccountMetas[2];\n };\n data: CreateNativeMintInstructionData;\n};\n\nexport function parseCreateNativeMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedCreateNativeMintInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n nativeMint: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getCreateNativeMintInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getDisableConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const DISABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 10;\n\nexport function getDisableConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type DisableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type DisableConfidentialCreditsInstructionDataArgs = {};\n\nexport function getDisableConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n DISABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n DisableConfidentialCreditsInstructionDataArgs,\n DisableConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getDisableConfidentialCreditsInstructionDataEncoder(),\n getDisableConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type DisableConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): DisableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getDisableConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedDisableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: DisableConfidentialCreditsInstructionData;\n};\n\nexport function parseDisableConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getDisableConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_CPI_GUARD_DISCRIMINATOR = 34;\n\nexport function getDisableCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport const DISABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR = 1;\n\nexport function getDisableCpiGuardCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport type DisableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableCpiGuardInstructionData = {\n discriminator: number;\n cpiGuardDiscriminator: number;\n};\n\nexport type DisableCpiGuardInstructionDataArgs = {};\n\nexport function getDisableCpiGuardInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['cpiGuardDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_CPI_GUARD_DISCRIMINATOR,\n cpiGuardDiscriminator: DISABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableCpiGuardInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['cpiGuardDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableCpiGuardInstructionDataCodec(): FixedSizeCodec<\n DisableCpiGuardInstructionDataArgs,\n DisableCpiGuardInstructionData\n> {\n return combineCodec(\n getDisableCpiGuardInstructionDataEncoder(),\n getDisableCpiGuardInstructionDataDecoder()\n );\n}\n\nexport type DisableCpiGuardInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner/delegate or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableCpiGuardInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableCpiGuardInput,\n config?: { programAddress?: TProgramAddress }\n): DisableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getDisableCpiGuardInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedDisableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner/delegate or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: DisableCpiGuardInstructionData;\n};\n\nexport function parseDisableCpiGuardInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableCpiGuardInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getDisableCpiGuardInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_HARVEST_TO_MINT_DISCRIMINATOR = 37;\n\nexport function getDisableHarvestToMintDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_HARVEST_TO_MINT_DISCRIMINATOR);\n}\n\nexport const DISABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 5;\n\nexport function getDisableHarvestToMintConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type DisableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableHarvestToMintInstructionData = {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n};\n\nexport type DisableHarvestToMintInstructionDataArgs = {};\n\nexport function getDisableHarvestToMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_HARVEST_TO_MINT_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n DISABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableHarvestToMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableHarvestToMintInstructionDataCodec(): FixedSizeCodec<\n DisableHarvestToMintInstructionDataArgs,\n DisableHarvestToMintInstructionData\n> {\n return combineCodec(\n getDisableHarvestToMintInstructionDataEncoder(),\n getDisableHarvestToMintInstructionDataDecoder()\n );\n}\n\nexport type DisableHarvestToMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The confidential transfer fee authority */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableHarvestToMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableHarvestToMintInput,\n config?: { programAddress?: TProgramAddress }\n): DisableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getDisableHarvestToMintInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedDisableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The confidential transfer fee authority */\n authority: TAccountMetas[1];\n };\n data: DisableHarvestToMintInstructionData;\n};\n\nexport function parseDisableHarvestToMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableHarvestToMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getDisableHarvestToMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_MEMO_TRANSFERS_DISCRIMINATOR = 30;\n\nexport function getDisableMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_MEMO_TRANSFERS_DISCRIMINATOR);\n}\n\nexport const DISABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR = 1;\n\nexport function getDisableMemoTransfersMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR\n );\n}\n\nexport type DisableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableMemoTransfersInstructionData = {\n discriminator: number;\n memoTransfersDiscriminator: number;\n};\n\nexport type DisableMemoTransfersInstructionDataArgs = {};\n\nexport function getDisableMemoTransfersInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['memoTransfersDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_MEMO_TRANSFERS_DISCRIMINATOR,\n memoTransfersDiscriminator:\n DISABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableMemoTransfersInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['memoTransfersDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableMemoTransfersInstructionDataCodec(): FixedSizeCodec<\n DisableMemoTransfersInstructionDataArgs,\n DisableMemoTransfersInstructionData\n> {\n return combineCodec(\n getDisableMemoTransfersInstructionDataEncoder(),\n getDisableMemoTransfersInstructionDataDecoder()\n );\n}\n\nexport type DisableMemoTransfersInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableMemoTransfersInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableMemoTransfersInput,\n config?: { programAddress?: TProgramAddress }\n): DisableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getDisableMemoTransfersInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedDisableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: DisableMemoTransfersInstructionData;\n};\n\nexport function parseDisableMemoTransfersInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableMemoTransfersInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getDisableMemoTransfersInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const DISABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getDisableNonConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(DISABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const DISABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 12;\n\nexport function getDisableNonConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n DISABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type DisableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type DisableNonConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type DisableNonConfidentialCreditsInstructionDataArgs = {};\n\nexport function getDisableNonConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: DISABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n DISABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getDisableNonConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getDisableNonConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n DisableNonConfidentialCreditsInstructionDataArgs,\n DisableNonConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getDisableNonConfidentialCreditsInstructionDataEncoder(),\n getDisableNonConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type DisableNonConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getDisableNonConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: DisableNonConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): DisableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getDisableNonConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as DisableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedDisableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: DisableNonConfidentialCreditsInstructionData;\n};\n\nexport function parseDisableNonConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedDisableNonConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getDisableNonConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const EMIT_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([\n 250, 166, 180, 250, 13, 12, 184, 70,\n]);\n\nexport function getEmitTokenMetadataDiscriminatorBytes() {\n return getBytesEncoder().encode(EMIT_TOKEN_METADATA_DISCRIMINATOR);\n}\n\nexport type EmitTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? ReadonlyAccount\n : TAccountMetadata,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EmitTokenMetadataInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Start of range of data to emit */\n start: Option;\n /** End of range of data to emit */\n end: Option;\n};\n\nexport type EmitTokenMetadataInstructionDataArgs = {\n /** Start of range of data to emit */\n start?: OptionOrNullable;\n /** End of range of data to emit */\n end?: OptionOrNullable;\n};\n\nexport function getEmitTokenMetadataInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['start', getOptionEncoder(getU64Encoder())],\n ['end', getOptionEncoder(getU64Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: EMIT_TOKEN_METADATA_DISCRIMINATOR,\n start: value.start ?? none(),\n end: value.end ?? none(),\n })\n );\n}\n\nexport function getEmitTokenMetadataInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['start', getOptionDecoder(getU64Decoder())],\n ['end', getOptionDecoder(getU64Decoder())],\n ]);\n}\n\nexport function getEmitTokenMetadataInstructionDataCodec(): Codec<\n EmitTokenMetadataInstructionDataArgs,\n EmitTokenMetadataInstructionData\n> {\n return combineCodec(\n getEmitTokenMetadataInstructionDataEncoder(),\n getEmitTokenMetadataInstructionDataDecoder()\n );\n}\n\nexport type EmitTokenMetadataInput = {\n metadata: Address;\n start?: EmitTokenMetadataInstructionDataArgs['start'];\n end?: EmitTokenMetadataInstructionDataArgs['end'];\n};\n\nexport function getEmitTokenMetadataInstruction<\n TAccountMetadata extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EmitTokenMetadataInput,\n config?: { programAddress?: TProgramAddress }\n): EmitTokenMetadataInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.metadata)],\n data: getEmitTokenMetadataInstructionDataEncoder().encode(\n args as EmitTokenMetadataInstructionDataArgs\n ),\n programAddress,\n } as EmitTokenMetadataInstruction);\n}\n\nexport type ParsedEmitTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n };\n data: EmitTokenMetadataInstructionData;\n};\n\nexport function parseEmitTokenMetadataInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEmitTokenMetadataInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount() },\n data: getEmitTokenMetadataInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR = 27;\n\nexport function getEmptyConfidentialTransferAccountDiscriminatorBytes() {\n return getU8Encoder().encode(\n EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR\n );\n}\n\nexport const EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 4;\n\nexport function getEmptyConfidentialTransferAccountConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type EmptyConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = 'Sysvar1nstructions1111111111111111111111111',\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EmptyConfidentialTransferAccountInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * Relative location of the `ProofInstruction::VerifyCloseAccount`\n * instruction to the `EmptyAccount` instruction in the transaction. If\n * the offset is `0`, then use a context state account for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport type EmptyConfidentialTransferAccountInstructionDataArgs = {\n /**\n * Relative location of the `ProofInstruction::VerifyCloseAccount`\n * instruction to the `EmptyAccount` instruction in the transaction. If\n * the offset is `0`, then use a context state account for the proof.\n */\n proofInstructionOffset: number;\n};\n\nexport function getEmptyConfidentialTransferAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n EMPTY_CONFIDENTIAL_TRANSFER_ACCOUNT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEmptyConfidentialTransferAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ]);\n}\n\nexport function getEmptyConfidentialTransferAccountInstructionDataCodec(): FixedSizeCodec<\n EmptyConfidentialTransferAccountInstructionDataArgs,\n EmptyConfidentialTransferAccountInstructionData\n> {\n return combineCodec(\n getEmptyConfidentialTransferAccountInstructionDataEncoder(),\n getEmptyConfidentialTransferAccountInstructionDataDecoder()\n );\n}\n\nexport type EmptyConfidentialTransferAccountInput<\n TAccountToken extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /**\n * Instructions sysvar if `VerifyZeroCiphertext` is included in\n * the same transaction or context state account if\n * `VerifyZeroCiphertext` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState?: Address;\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n proofInstructionOffset: EmptyConfidentialTransferAccountInstructionDataArgs['proofInstructionOffset'];\n multiSigners?: Array;\n};\n\nexport function getEmptyConfidentialTransferAccountInstruction<\n TAccountToken extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EmptyConfidentialTransferAccountInput<\n TAccountToken,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): EmptyConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvarOrContextState.value) {\n accounts.instructionsSysvarOrContextState.value =\n 'Sysvar1nstructions1111111111111111111111111' as Address<'Sysvar1nstructions1111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEmptyConfidentialTransferAccountInstructionDataEncoder().encode(\n args as EmptyConfidentialTransferAccountInstructionDataArgs\n ),\n programAddress,\n } as EmptyConfidentialTransferAccountInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEmptyConfidentialTransferAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /**\n * Instructions sysvar if `VerifyZeroCiphertext` is included in\n * the same transaction or context state account if\n * `VerifyZeroCiphertext` is pre-verified into a context state\n * account.\n */\n instructionsSysvarOrContextState: TAccountMetas[1];\n /** (Optional) Record account if the accompanying proof is to be read from a record account. */\n record?: TAccountMetas[2] | undefined;\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: EmptyConfidentialTransferAccountInstructionData;\n};\n\nexport function parseEmptyConfidentialTransferAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEmptyConfidentialTransferAccountInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getEmptyConfidentialTransferAccountInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getEnableConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const ENABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 9;\n\nexport function getEnableConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type EnableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type EnableConfidentialCreditsInstructionDataArgs = {};\n\nexport function getEnableConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n ENABLE_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n EnableConfidentialCreditsInstructionDataArgs,\n EnableConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getEnableConfidentialCreditsInstructionDataEncoder(),\n getEnableConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type EnableConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): EnableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEnableConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEnableConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: EnableConfidentialCreditsInstructionData;\n};\n\nexport function parseEnableConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getEnableConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_CPI_GUARD_DISCRIMINATOR = 34;\n\nexport function getEnableCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport const ENABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR = 0;\n\nexport function getEnableCpiGuardCpiGuardDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR);\n}\n\nexport type EnableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableCpiGuardInstructionData = {\n discriminator: number;\n cpiGuardDiscriminator: number;\n};\n\nexport type EnableCpiGuardInstructionDataArgs = {};\n\nexport function getEnableCpiGuardInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['cpiGuardDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_CPI_GUARD_DISCRIMINATOR,\n cpiGuardDiscriminator: ENABLE_CPI_GUARD_CPI_GUARD_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableCpiGuardInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['cpiGuardDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableCpiGuardInstructionDataCodec(): FixedSizeCodec<\n EnableCpiGuardInstructionDataArgs,\n EnableCpiGuardInstructionData\n> {\n return combineCodec(\n getEnableCpiGuardInstructionDataEncoder(),\n getEnableCpiGuardInstructionDataDecoder()\n );\n}\n\nexport type EnableCpiGuardInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner/delegate or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableCpiGuardInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableCpiGuardInput,\n config?: { programAddress?: TProgramAddress }\n): EnableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getEnableCpiGuardInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableCpiGuardInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedEnableCpiGuardInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner/delegate or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: EnableCpiGuardInstructionData;\n};\n\nexport function parseEnableCpiGuardInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableCpiGuardInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getEnableCpiGuardInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_HARVEST_TO_MINT_DISCRIMINATOR = 37;\n\nexport function getEnableHarvestToMintDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_HARVEST_TO_MINT_DISCRIMINATOR);\n}\n\nexport const ENABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 4;\n\nexport function getEnableHarvestToMintConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type EnableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableHarvestToMintInstructionData = {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n};\n\nexport type EnableHarvestToMintInstructionDataArgs = {};\n\nexport function getEnableHarvestToMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_HARVEST_TO_MINT_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n ENABLE_HARVEST_TO_MINT_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableHarvestToMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableHarvestToMintInstructionDataCodec(): FixedSizeCodec<\n EnableHarvestToMintInstructionDataArgs,\n EnableHarvestToMintInstructionData\n> {\n return combineCodec(\n getEnableHarvestToMintInstructionDataEncoder(),\n getEnableHarvestToMintInstructionDataDecoder()\n );\n}\n\nexport type EnableHarvestToMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The confidential transfer fee authority */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableHarvestToMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableHarvestToMintInput,\n config?: { programAddress?: TProgramAddress }\n): EnableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEnableHarvestToMintInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableHarvestToMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEnableHarvestToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The confidential transfer fee authority */\n authority: TAccountMetas[1];\n };\n data: EnableHarvestToMintInstructionData;\n};\n\nexport function parseEnableHarvestToMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableHarvestToMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getEnableHarvestToMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_MEMO_TRANSFERS_DISCRIMINATOR = 30;\n\nexport function getEnableMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_MEMO_TRANSFERS_DISCRIMINATOR);\n}\n\nexport const ENABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR = 0;\n\nexport function getEnableMemoTransfersMemoTransfersDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR\n );\n}\n\nexport type EnableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableMemoTransfersInstructionData = {\n discriminator: number;\n memoTransfersDiscriminator: number;\n};\n\nexport type EnableMemoTransfersInstructionDataArgs = {};\n\nexport function getEnableMemoTransfersInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['memoTransfersDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_MEMO_TRANSFERS_DISCRIMINATOR,\n memoTransfersDiscriminator:\n ENABLE_MEMO_TRANSFERS_MEMO_TRANSFERS_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableMemoTransfersInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['memoTransfersDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableMemoTransfersInstructionDataCodec(): FixedSizeCodec<\n EnableMemoTransfersInstructionDataArgs,\n EnableMemoTransfersInstructionData\n> {\n return combineCodec(\n getEnableMemoTransfersInstructionDataEncoder(),\n getEnableMemoTransfersInstructionDataDecoder()\n );\n}\n\nexport type EnableMemoTransfersInput<\n TAccountToken extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to update. */\n token: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableMemoTransfersInstruction<\n TAccountToken extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableMemoTransfersInput,\n config?: { programAddress?: TProgramAddress }\n): EnableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getEnableMemoTransfersInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableMemoTransfersInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedEnableMemoTransfersInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to update. */\n token: TAccountMetas[0];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[1];\n };\n data: EnableMemoTransfersInstructionData;\n};\n\nexport function parseEnableMemoTransfersInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableMemoTransfersInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), owner: getNextAccount() },\n data: getEnableMemoTransfersInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const ENABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR = 27;\n\nexport function getEnableNonConfidentialCreditsDiscriminatorBytes() {\n return getU8Encoder().encode(ENABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR);\n}\n\nexport const ENABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 11;\n\nexport function getEnableNonConfidentialCreditsConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n ENABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type EnableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type EnableNonConfidentialCreditsInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n};\n\nexport type EnableNonConfidentialCreditsInstructionDataArgs = {};\n\nexport function getEnableNonConfidentialCreditsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: ENABLE_NON_CONFIDENTIAL_CREDITS_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n ENABLE_NON_CONFIDENTIAL_CREDITS_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getEnableNonConfidentialCreditsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getEnableNonConfidentialCreditsInstructionDataCodec(): FixedSizeCodec<\n EnableNonConfidentialCreditsInstructionDataArgs,\n EnableNonConfidentialCreditsInstructionData\n> {\n return combineCodec(\n getEnableNonConfidentialCreditsInstructionDataEncoder(),\n getEnableNonConfidentialCreditsInstructionDataDecoder()\n );\n}\n\nexport type EnableNonConfidentialCreditsInput<\n TAccountToken extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token account. */\n token: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getEnableNonConfidentialCreditsInstruction<\n TAccountToken extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: EnableNonConfidentialCreditsInput,\n config?: { programAddress?: TProgramAddress }\n): EnableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getEnableNonConfidentialCreditsInstructionDataEncoder().encode({}),\n programAddress,\n } as EnableNonConfidentialCreditsInstruction<\n TProgramAddress,\n TAccountToken,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedEnableNonConfidentialCreditsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token account. */\n token: TAccountMetas[0];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[1];\n };\n data: EnableNonConfidentialCreditsInstructionData;\n};\n\nexport function parseEnableNonConfidentialCreditsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedEnableNonConfidentialCreditsInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { token: getNextAccount(), authority: getNextAccount() },\n data: getEnableNonConfidentialCreditsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const FREEZE_ACCOUNT_DISCRIMINATOR = 10;\n\nexport function getFreezeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(FREEZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type FreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type FreezeAccountInstructionData = { discriminator: number };\n\nexport type FreezeAccountInstructionDataArgs = {};\n\nexport function getFreezeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: FREEZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getFreezeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getFreezeAccountInstructionDataCodec(): FixedSizeCodec<\n FreezeAccountInstructionDataArgs,\n FreezeAccountInstructionData\n> {\n return combineCodec(\n getFreezeAccountInstructionDataEncoder(),\n getFreezeAccountInstructionDataDecoder()\n );\n}\n\nexport type FreezeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to freeze. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getFreezeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: FreezeAccountInput,\n config?: { programAddress?: TProgramAddress }\n): FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getFreezeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as FreezeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedFreezeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to freeze. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: FreezeAccountInstructionData;\n};\n\nexport function parseFreezeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedFreezeAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getFreezeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR = 21;\n\nexport function getGetAccountDataSizeDiscriminatorBytes() {\n return getU8Encoder().encode(GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR);\n}\n\nexport type GetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type GetAccountDataSizeInstructionData = { discriminator: number };\n\nexport type GetAccountDataSizeInstructionDataArgs = {};\n\nexport function getGetAccountDataSizeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: GET_ACCOUNT_DATA_SIZE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getGetAccountDataSizeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getGetAccountDataSizeInstructionDataCodec(): FixedSizeCodec<\n GetAccountDataSizeInstructionDataArgs,\n GetAccountDataSizeInstructionData\n> {\n return combineCodec(\n getGetAccountDataSizeInstructionDataEncoder(),\n getGetAccountDataSizeInstructionDataDecoder()\n );\n}\n\nexport type GetAccountDataSizeInput = {\n /** The mint to calculate for. */\n mint: Address;\n};\n\nexport function getGetAccountDataSizeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: GetAccountDataSizeInput,\n config?: { programAddress?: TProgramAddress }\n): GetAccountDataSizeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getGetAccountDataSizeInstructionDataEncoder().encode({}),\n programAddress,\n } as GetAccountDataSizeInstruction);\n}\n\nexport type ParsedGetAccountDataSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: GetAccountDataSizeInstructionData;\n};\n\nexport function parseGetAccountDataSizeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedGetAccountDataSizeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getGetAccountDataSizeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_DISCRIMINATOR = 26;\n\nexport function getHarvestWithheldTokensToMintDiscriminatorBytes() {\n return getU8Encoder().encode(HARVEST_WITHHELD_TOKENS_TO_MINT_DISCRIMINATOR);\n}\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_TRANSFER_FEE_DISCRIMINATOR = 4;\n\nexport function getHarvestWithheldTokensToMintTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n HARVEST_WITHHELD_TOKENS_TO_MINT_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type HarvestWithheldTokensToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type HarvestWithheldTokensToMintInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n};\n\nexport type HarvestWithheldTokensToMintInstructionDataArgs = {};\n\nexport function getHarvestWithheldTokensToMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: HARVEST_WITHHELD_TOKENS_TO_MINT_DISCRIMINATOR,\n transferFeeDiscriminator:\n HARVEST_WITHHELD_TOKENS_TO_MINT_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getHarvestWithheldTokensToMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getHarvestWithheldTokensToMintInstructionDataCodec(): FixedSizeCodec<\n HarvestWithheldTokensToMintInstructionDataArgs,\n HarvestWithheldTokensToMintInstructionData\n> {\n return combineCodec(\n getHarvestWithheldTokensToMintInstructionDataEncoder(),\n getHarvestWithheldTokensToMintInstructionDataDecoder()\n );\n}\n\nexport type HarvestWithheldTokensToMintInput<\n TAccountMint extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n sources: Array
;\n};\n\nexport function getHarvestWithheldTokensToMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: HarvestWithheldTokensToMintInput,\n config?: { programAddress?: TProgramAddress }\n): HarvestWithheldTokensToMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.sources.map((address) => ({\n address,\n role: AccountRole.WRITABLE,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), ...remainingAccounts],\n data: getHarvestWithheldTokensToMintInstructionDataEncoder().encode({}),\n programAddress,\n } as HarvestWithheldTokensToMintInstruction);\n}\n\nexport type ParsedHarvestWithheldTokensToMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n };\n data: HarvestWithheldTokensToMintInstructionData;\n};\n\nexport function parseHarvestWithheldTokensToMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedHarvestWithheldTokensToMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getHarvestWithheldTokensToMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 3;\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionData =\n { discriminator: number; confidentialTransferFeeDiscriminator: number };\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataArgs =\n {};\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator:\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n HARVEST_WITHHELD_TOKENS_TO_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataArgs,\n HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataEncoder(),\n getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type HarvestWithheldTokensToMintForConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n sources?: Array
;\n};\n\nexport function getHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: HarvestWithheldTokensToMintForConfidentialTransferFeeInput,\n config?: { programAddress?: TProgramAddress }\n): HarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.sources ?? []).map(\n (address) => ({ address, role: AccountRole.WRITABLE })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), ...remainingAccounts],\n data: getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataEncoder().encode(\n {}\n ),\n programAddress,\n } as HarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint\n >);\n}\n\nexport type ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n };\n data: HarvestWithheldTokensToMintForConfidentialTransferFeeInstructionData;\n};\n\nexport function parseHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedHarvestWithheldTokensToMintForConfidentialTransferFeeInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getHarvestWithheldTokensToMintForConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT_DISCRIMINATOR = 1;\n\nexport function getInitializeAccountDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type InitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccountInstructionData = { discriminator: number };\n\nexport type InitializeAccountInstructionDataArgs = {};\n\nexport function getInitializeAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeAccountInstructionDataCodec(): FixedSizeCodec<\n InitializeAccountInstructionDataArgs,\n InitializeAccountInstructionData\n> {\n return combineCodec(\n getInitializeAccountInstructionDataEncoder(),\n getInitializeAccountInstructionDataDecoder()\n );\n}\n\nexport type InitializeAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** The new account's owner/multisignature. */\n owner: Address;\n /** Rent sysvar. */\n rent?: Address;\n};\n\nexport function getInitializeAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeAccountInput<\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountOwner,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** The new account's owner/multisignature. */\n owner: TAccountMetas[2];\n /** Rent sysvar. */\n rent: TAccountMetas[3];\n };\n data: InitializeAccountInstructionData;\n};\n\nexport function parseInitializeAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccountInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT2_DISCRIMINATOR = 16;\n\nexport function getInitializeAccount2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT2_DISCRIMINATOR);\n}\n\nexport type InitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount2InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount2InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount2InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount2InstructionDataArgs,\n InitializeAccount2InstructionData\n> {\n return combineCodec(\n getInitializeAccount2InstructionDataEncoder(),\n getInitializeAccount2InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount2Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n owner: InitializeAccount2InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount2Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.rent),\n ],\n data: getInitializeAccount2InstructionDataEncoder().encode(\n args as InitializeAccount2InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount2Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeAccount2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n /** Rent sysvar. */\n rent: TAccountMetas[2];\n };\n data: InitializeAccount2InstructionData;\n};\n\nexport function parseInitializeAccount2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount2Instruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n rent: getNextAccount(),\n },\n data: getInitializeAccount2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_ACCOUNT3_DISCRIMINATOR = 18;\n\nexport function getInitializeAccount3DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_ACCOUNT3_DISCRIMINATOR);\n}\n\nexport type InitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeAccount3InstructionData = {\n discriminator: number;\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport type InitializeAccount3InstructionDataArgs = {\n /** The new account's owner/multisignature. */\n owner: Address;\n};\n\nexport function getInitializeAccount3InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['owner', getAddressEncoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_ACCOUNT3_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeAccount3InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['owner', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializeAccount3InstructionDataCodec(): FixedSizeCodec<\n InitializeAccount3InstructionDataArgs,\n InitializeAccount3InstructionData\n> {\n return combineCodec(\n getInitializeAccount3InstructionDataEncoder(),\n getInitializeAccount3InstructionDataDecoder()\n );\n}\n\nexport type InitializeAccount3Input<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n /** The mint this account will be associated with. */\n mint: Address;\n owner: InitializeAccount3InstructionDataArgs['owner'];\n};\n\nexport function getInitializeAccount3Instruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeAccount3Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account), getAccountMeta(accounts.mint)],\n data: getInitializeAccount3InstructionDataEncoder().encode(\n args as InitializeAccount3InstructionDataArgs\n ),\n programAddress,\n } as InitializeAccount3Instruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeAccount3Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n /** The mint this account will be associated with. */\n mint: TAccountMetas[1];\n };\n data: InitializeAccount3InstructionData;\n};\n\nexport function parseInitializeAccount3Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeAccount3Instruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount(), mint: getNextAccount() },\n data: getInitializeAccount3InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getInitializeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 0;\n\nexport function getInitializeConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type InitializeConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeConfidentialTransferFeeInstructionData = {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n /** Optional authority to set the withdraw withheld authority ElGamal key */\n authority: Option
;\n /** Withheld fees from accounts must be encrypted with this ElGamal key */\n withdrawWithheldAuthorityElGamalPubkey: Option
;\n};\n\nexport type InitializeConfidentialTransferFeeInstructionDataArgs = {\n /** Optional authority to set the withdraw withheld authority ElGamal key */\n authority: OptionOrNullable
;\n /** Withheld fees from accounts must be encrypted with this ElGamal key */\n withdrawWithheldAuthorityElGamalPubkey: OptionOrNullable
;\n};\n\nexport function getInitializeConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'withdrawWithheldAuthorityElGamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n INITIALIZE_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'withdrawWithheldAuthorityElGamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n InitializeConfidentialTransferFeeInstructionDataArgs,\n InitializeConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getInitializeConfidentialTransferFeeInstructionDataEncoder(),\n getInitializeConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type InitializeConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n> = {\n /** The SPL Token mint. */\n mint: Address;\n authority: InitializeConfidentialTransferFeeInstructionDataArgs['authority'];\n withdrawWithheldAuthorityElGamalPubkey: InitializeConfidentialTransferFeeInstructionDataArgs['withdrawWithheldAuthorityElGamalPubkey'];\n};\n\nexport function getInitializeConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeConfidentialTransferFeeInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeConfidentialTransferFeeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeConfidentialTransferFeeInstructionDataEncoder().encode(\n args as InitializeConfidentialTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as InitializeConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token mint. */\n mint: TAccountMetas[0];\n };\n data: InitializeConfidentialTransferFeeInstructionData;\n};\n\nexport function parseInitializeConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeConfidentialTransferFeeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR = 27;\n\nexport function getInitializeConfidentialTransferMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR\n );\n}\n\nexport const INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 0;\n\nexport function getInitializeConfidentialTransferMintConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type InitializeConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeConfidentialTransferMintInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts.\n */\n authority: Option
;\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: Option
;\n};\n\nexport type InitializeConfidentialTransferMintInstructionDataArgs = {\n /**\n * Authority to modify the `ConfidentialTransferMint` configuration and to\n * approve new accounts.\n */\n authority: OptionOrNullable
;\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: OptionOrNullable
;\n};\n\nexport function getInitializeConfidentialTransferMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanEncoder()],\n [\n 'auditorElgamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n INITIALIZE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeConfidentialTransferMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['autoApproveNewAccounts', getBooleanDecoder()],\n [\n 'auditorElgamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeConfidentialTransferMintInstructionDataCodec(): FixedSizeCodec<\n InitializeConfidentialTransferMintInstructionDataArgs,\n InitializeConfidentialTransferMintInstructionData\n> {\n return combineCodec(\n getInitializeConfidentialTransferMintInstructionDataEncoder(),\n getInitializeConfidentialTransferMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeConfidentialTransferMintInput<\n TAccountMint extends string = string,\n> = {\n /** The SPL Token mint. */\n mint: Address;\n authority: InitializeConfidentialTransferMintInstructionDataArgs['authority'];\n autoApproveNewAccounts: InitializeConfidentialTransferMintInstructionDataArgs['autoApproveNewAccounts'];\n auditorElgamalPubkey: InitializeConfidentialTransferMintInstructionDataArgs['auditorElgamalPubkey'];\n};\n\nexport function getInitializeConfidentialTransferMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeConfidentialTransferMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeConfidentialTransferMintInstructionDataEncoder().encode(\n args as InitializeConfidentialTransferMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint\n >);\n}\n\nexport type ParsedInitializeConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token mint. */\n mint: TAccountMetas[0];\n };\n data: InitializeConfidentialTransferMintInstructionData;\n};\n\nexport function parseInitializeConfidentialTransferMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeConfidentialTransferMintInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeConfidentialTransferMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n type AccountState,\n type AccountStateArgs,\n} from '../types';\n\nexport const INITIALIZE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 28;\n\nexport function getInitializeDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 0;\n\nexport function getInitializeDefaultAccountStateDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR\n );\n}\n\nexport type InitializeDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeDefaultAccountStateInstructionData = {\n discriminator: number;\n defaultAccountStateDiscriminator: number;\n /** The state each new token account should start with. */\n state: AccountState;\n};\n\nexport type InitializeDefaultAccountStateInstructionDataArgs = {\n /** The state each new token account should start with. */\n state: AccountStateArgs;\n};\n\nexport function getInitializeDefaultAccountStateInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['defaultAccountStateDiscriminator', getU8Encoder()],\n ['state', getAccountStateEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n defaultAccountStateDiscriminator:\n INITIALIZE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeDefaultAccountStateInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['defaultAccountStateDiscriminator', getU8Decoder()],\n ['state', getAccountStateDecoder()],\n ]);\n}\n\nexport function getInitializeDefaultAccountStateInstructionDataCodec(): FixedSizeCodec<\n InitializeDefaultAccountStateInstructionDataArgs,\n InitializeDefaultAccountStateInstructionData\n> {\n return combineCodec(\n getInitializeDefaultAccountStateInstructionDataEncoder(),\n getInitializeDefaultAccountStateInstructionDataDecoder()\n );\n}\n\nexport type InitializeDefaultAccountStateInput<\n TAccountMint extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n state: InitializeDefaultAccountStateInstructionDataArgs['state'];\n};\n\nexport function getInitializeDefaultAccountStateInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeDefaultAccountStateInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeDefaultAccountStateInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeDefaultAccountStateInstructionDataEncoder().encode(\n args as InitializeDefaultAccountStateInstructionDataArgs\n ),\n programAddress,\n } as InitializeDefaultAccountStateInstruction);\n}\n\nexport type ParsedInitializeDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n };\n data: InitializeDefaultAccountStateInstructionData;\n};\n\nexport function parseInitializeDefaultAccountStateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeDefaultAccountStateInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeDefaultAccountStateInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_GROUP_MEMBER_POINTER_DISCRIMINATOR = 41;\n\nexport function getInitializeGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_GROUP_MEMBER_POINTER_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR = 0;\n\nexport function getInitializeGroupMemberPointerGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR\n );\n}\n\nexport type InitializeGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeGroupMemberPointerInstructionData = {\n discriminator: number;\n groupMemberPointerDiscriminator: number;\n /** The public key for the account that can update the group member address. */\n authority: Option
;\n /** The account address that holds the member. */\n memberAddress: Option
;\n};\n\nexport type InitializeGroupMemberPointerInstructionDataArgs = {\n /** The public key for the account that can update the group member address. */\n authority: OptionOrNullable
;\n /** The account address that holds the member. */\n memberAddress: OptionOrNullable
;\n};\n\nexport function getInitializeGroupMemberPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupMemberPointerDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n groupMemberPointerDiscriminator:\n INITIALIZE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeGroupMemberPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupMemberPointerDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'memberAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeGroupMemberPointerInstructionDataCodec(): FixedSizeCodec<\n InitializeGroupMemberPointerInstructionDataArgs,\n InitializeGroupMemberPointerInstructionData\n> {\n return combineCodec(\n getInitializeGroupMemberPointerInstructionDataEncoder(),\n getInitializeGroupMemberPointerInstructionDataDecoder()\n );\n}\n\nexport type InitializeGroupMemberPointerInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeGroupMemberPointerInstructionDataArgs['authority'];\n memberAddress: InitializeGroupMemberPointerInstructionDataArgs['memberAddress'];\n};\n\nexport function getInitializeGroupMemberPointerInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeGroupMemberPointerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeGroupMemberPointerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeGroupMemberPointerInstructionDataEncoder().encode(\n args as InitializeGroupMemberPointerInstructionDataArgs\n ),\n programAddress,\n } as InitializeGroupMemberPointerInstruction);\n}\n\nexport type ParsedInitializeGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeGroupMemberPointerInstructionData;\n};\n\nexport function parseInitializeGroupMemberPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeGroupMemberPointerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeGroupMemberPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_GROUP_POINTER_DISCRIMINATOR = 40;\n\nexport function getInitializeGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_GROUP_POINTER_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR = 0;\n\nexport function getInitializeGroupPointerGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR\n );\n}\n\nexport type InitializeGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeGroupPointerInstructionData = {\n discriminator: number;\n groupPointerDiscriminator: number;\n /** The public key for the account that can update the group address. */\n authority: Option
;\n /** The account address that holds the group. */\n groupAddress: Option
;\n};\n\nexport type InitializeGroupPointerInstructionDataArgs = {\n /** The public key for the account that can update the group address. */\n authority: OptionOrNullable
;\n /** The account address that holds the group. */\n groupAddress: OptionOrNullable
;\n};\n\nexport function getInitializeGroupPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupPointerDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_GROUP_POINTER_DISCRIMINATOR,\n groupPointerDiscriminator:\n INITIALIZE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeGroupPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupPointerDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'groupAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeGroupPointerInstructionDataCodec(): FixedSizeCodec<\n InitializeGroupPointerInstructionDataArgs,\n InitializeGroupPointerInstructionData\n> {\n return combineCodec(\n getInitializeGroupPointerInstructionDataEncoder(),\n getInitializeGroupPointerInstructionDataDecoder()\n );\n}\n\nexport type InitializeGroupPointerInput =\n {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeGroupPointerInstructionDataArgs['authority'];\n groupAddress: InitializeGroupPointerInstructionDataArgs['groupAddress'];\n };\n\nexport function getInitializeGroupPointerInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeGroupPointerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeGroupPointerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeGroupPointerInstructionDataEncoder().encode(\n args as InitializeGroupPointerInstructionDataArgs\n ),\n programAddress,\n } as InitializeGroupPointerInstruction);\n}\n\nexport type ParsedInitializeGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeGroupPointerInstructionData;\n};\n\nexport function parseInitializeGroupPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeGroupPointerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeGroupPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR = 22;\n\nexport function getInitializeImmutableOwnerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR);\n}\n\nexport type InitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeImmutableOwnerInstructionData = { discriminator: number };\n\nexport type InitializeImmutableOwnerInstructionDataArgs = {};\n\nexport function getInitializeImmutableOwnerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_IMMUTABLE_OWNER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeImmutableOwnerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeImmutableOwnerInstructionDataCodec(): FixedSizeCodec<\n InitializeImmutableOwnerInstructionDataArgs,\n InitializeImmutableOwnerInstructionData\n> {\n return combineCodec(\n getInitializeImmutableOwnerInstructionDataEncoder(),\n getInitializeImmutableOwnerInstructionDataDecoder()\n );\n}\n\nexport type InitializeImmutableOwnerInput<\n TAccountAccount extends string = string,\n> = {\n /** The account to initialize. */\n account: Address;\n};\n\nexport function getInitializeImmutableOwnerInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeImmutableOwnerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeImmutableOwnerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getInitializeImmutableOwnerInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeImmutableOwnerInstruction);\n}\n\nexport type ParsedInitializeImmutableOwnerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to initialize. */\n account: TAccountMetas[0];\n };\n data: InitializeImmutableOwnerInstructionData;\n};\n\nexport function parseInitializeImmutableOwnerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeImmutableOwnerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getInitializeImmutableOwnerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getI16Decoder,\n getI16Encoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_INTEREST_BEARING_MINT_DISCRIMINATOR = 33;\n\nexport function getInitializeInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_INTEREST_BEARING_MINT_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeInterestBearingMintInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR\n );\n}\n\nexport type InitializeInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeInterestBearingMintInstructionData = {\n discriminator: number;\n interestBearingMintDiscriminator: number;\n /** The public key for the account that can update the rate */\n rateAuthority: Option
;\n /** The initial interest rate */\n rate: number;\n};\n\nexport type InitializeInterestBearingMintInstructionDataArgs = {\n /** The public key for the account that can update the rate */\n rateAuthority: OptionOrNullable
;\n /** The initial interest rate */\n rate: number;\n};\n\nexport function getInitializeInterestBearingMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['interestBearingMintDiscriminator', getU8Encoder()],\n [\n 'rateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['rate', getI16Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_INTEREST_BEARING_MINT_DISCRIMINATOR,\n interestBearingMintDiscriminator:\n INITIALIZE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeInterestBearingMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['interestBearingMintDiscriminator', getU8Decoder()],\n [\n 'rateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['rate', getI16Decoder()],\n ]);\n}\n\nexport function getInitializeInterestBearingMintInstructionDataCodec(): FixedSizeCodec<\n InitializeInterestBearingMintInstructionDataArgs,\n InitializeInterestBearingMintInstructionData\n> {\n return combineCodec(\n getInitializeInterestBearingMintInstructionDataEncoder(),\n getInitializeInterestBearingMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeInterestBearingMintInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n rateAuthority: InitializeInterestBearingMintInstructionDataArgs['rateAuthority'];\n rate: InitializeInterestBearingMintInstructionDataArgs['rate'];\n};\n\nexport function getInitializeInterestBearingMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeInterestBearingMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeInterestBearingMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeInterestBearingMintInstructionDataEncoder().encode(\n args as InitializeInterestBearingMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeInterestBearingMintInstruction);\n}\n\nexport type ParsedInitializeInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeInterestBearingMintInstructionData;\n};\n\nexport function parseInitializeInterestBearingMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeInterestBearingMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeInterestBearingMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_METADATA_POINTER_DISCRIMINATOR = 39;\n\nexport function getInitializeMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_METADATA_POINTER_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR = 0;\n\nexport function getInitializeMetadataPointerMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR\n );\n}\n\nexport type InitializeMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMetadataPointerInstructionData = {\n discriminator: number;\n metadataPointerDiscriminator: number;\n /** The public key for the account that can update the metadata address. */\n authority: Option
;\n /** The account address that holds the metadata. */\n metadataAddress: Option
;\n};\n\nexport type InitializeMetadataPointerInstructionDataArgs = {\n /** The public key for the account that can update the metadata address. */\n authority: OptionOrNullable
;\n /** The account address that holds the metadata. */\n metadataAddress: OptionOrNullable
;\n};\n\nexport function getInitializeMetadataPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['metadataPointerDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_METADATA_POINTER_DISCRIMINATOR,\n metadataPointerDiscriminator:\n INITIALIZE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeMetadataPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['metadataPointerDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'metadataAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeMetadataPointerInstructionDataCodec(): FixedSizeCodec<\n InitializeMetadataPointerInstructionDataArgs,\n InitializeMetadataPointerInstructionData\n> {\n return combineCodec(\n getInitializeMetadataPointerInstructionDataEncoder(),\n getInitializeMetadataPointerInstructionDataDecoder()\n );\n}\n\nexport type InitializeMetadataPointerInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeMetadataPointerInstructionDataArgs['authority'];\n metadataAddress: InitializeMetadataPointerInstructionDataArgs['metadataAddress'];\n};\n\nexport function getInitializeMetadataPointerInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMetadataPointerInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMetadataPointerInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMetadataPointerInstructionDataEncoder().encode(\n args as InitializeMetadataPointerInstructionDataArgs\n ),\n programAddress,\n } as InitializeMetadataPointerInstruction);\n}\n\nexport type ParsedInitializeMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMetadataPointerInstructionData;\n};\n\nexport function parseInitializeMetadataPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMetadataPointerInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMetadataPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT_DISCRIMINATOR);\n}\n\nexport type InitializeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMintInstructionData = {\n discriminator: number;\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMintInstructionDataArgs = {\n /** Number of decimals in token account amounts. */\n decimals: number;\n /** Minting authority. */\n mintAuthority: Address;\n /** Optional authority that can freeze token accounts. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMintInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMintInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMintInstructionDataCodec(): Codec<\n InitializeMintInstructionDataArgs,\n InitializeMintInstructionData\n> {\n return combineCodec(\n getInitializeMintInstructionDataEncoder(),\n getInitializeMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeMintInput<\n TAccountMint extends string = string,\n TAccountRent extends string = string,\n> = {\n /** Token mint account. */\n mint: Address;\n /** Rent sysvar. */\n rent?: Address;\n decimals: InitializeMintInstructionDataArgs['decimals'];\n mintAuthority: InitializeMintInstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMintInstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMintInstruction<\n TAccountMint extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint), getAccountMeta(accounts.rent)],\n data: getInitializeMintInstructionDataEncoder().encode(\n args as InitializeMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeMintInstruction);\n}\n\nexport type ParsedInitializeMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Token mint account. */\n mint: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMintInstructionData;\n};\n\nexport function parseInitializeMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMintInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n none,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT2_DISCRIMINATOR = 20;\n\nexport function getInitializeMint2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT2_DISCRIMINATOR);\n}\n\nexport type InitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMint2InstructionData = {\n discriminator: number;\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority: Option
;\n};\n\nexport type InitializeMint2InstructionDataArgs = {\n /** Number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /** The authority/multisignature to mint tokens. */\n mintAuthority: Address;\n /** The optional freeze authority/multisignature of the mint. */\n freezeAuthority?: OptionOrNullable
;\n};\n\nexport function getInitializeMint2InstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['decimals', getU8Encoder()],\n ['mintAuthority', getAddressEncoder()],\n ['freezeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT2_DISCRIMINATOR,\n freezeAuthority: value.freezeAuthority ?? none(),\n })\n );\n}\n\nexport function getInitializeMint2InstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['decimals', getU8Decoder()],\n ['mintAuthority', getAddressDecoder()],\n ['freezeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMint2InstructionDataCodec(): Codec<\n InitializeMint2InstructionDataArgs,\n InitializeMint2InstructionData\n> {\n return combineCodec(\n getInitializeMint2InstructionDataEncoder(),\n getInitializeMint2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMint2Input = {\n /** The mint to initialize. */\n mint: Address;\n decimals: InitializeMint2InstructionDataArgs['decimals'];\n mintAuthority: InitializeMint2InstructionDataArgs['mintAuthority'];\n freezeAuthority?: InitializeMint2InstructionDataArgs['freezeAuthority'];\n};\n\nexport function getInitializeMint2Instruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMint2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMint2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMint2InstructionDataEncoder().encode(\n args as InitializeMint2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMint2Instruction);\n}\n\nexport type ParsedInitializeMint2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMint2InstructionData;\n};\n\nexport function parseInitializeMint2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMint2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMint2InstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MINT_CLOSE_AUTHORITY_DISCRIMINATOR = 25;\n\nexport function getInitializeMintCloseAuthorityDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MINT_CLOSE_AUTHORITY_DISCRIMINATOR);\n}\n\nexport type InitializeMintCloseAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMintCloseAuthorityInstructionData = {\n discriminator: number;\n /** Authority that must sign the `CloseAccount` instruction on a mint. */\n closeAuthority: Option
;\n};\n\nexport type InitializeMintCloseAuthorityInstructionDataArgs = {\n /** Authority that must sign the `CloseAccount` instruction on a mint. */\n closeAuthority: OptionOrNullable
;\n};\n\nexport function getInitializeMintCloseAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['closeAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_MINT_CLOSE_AUTHORITY_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeMintCloseAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['closeAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getInitializeMintCloseAuthorityInstructionDataCodec(): Codec<\n InitializeMintCloseAuthorityInstructionDataArgs,\n InitializeMintCloseAuthorityInstructionData\n> {\n return combineCodec(\n getInitializeMintCloseAuthorityInstructionDataEncoder(),\n getInitializeMintCloseAuthorityInstructionDataDecoder()\n );\n}\n\nexport type InitializeMintCloseAuthorityInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n closeAuthority: InitializeMintCloseAuthorityInstructionDataArgs['closeAuthority'];\n};\n\nexport function getInitializeMintCloseAuthorityInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMintCloseAuthorityInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMintCloseAuthorityInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeMintCloseAuthorityInstructionDataEncoder().encode(\n args as InitializeMintCloseAuthorityInstructionDataArgs\n ),\n programAddress,\n } as InitializeMintCloseAuthorityInstruction);\n}\n\nexport type ParsedInitializeMintCloseAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeMintCloseAuthorityInstructionData;\n};\n\nexport function parseInitializeMintCloseAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMintCloseAuthorityInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeMintCloseAuthorityInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG_DISCRIMINATOR = 2;\n\nexport function getInitializeMultisigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG_DISCRIMINATOR);\n}\n\nexport type InitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TAccountRent extends\n | string\n | AccountMeta = 'SysvarRent111111111111111111111111111111111',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n TAccountRent extends string\n ? ReadonlyAccount\n : TAccountRent,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisigInstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisigInstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisigInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisigInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisigInstructionDataCodec(): FixedSizeCodec<\n InitializeMultisigInstructionDataArgs,\n InitializeMultisigInstructionData\n> {\n return combineCodec(\n getInitializeMultisigInstructionDataEncoder(),\n getInitializeMultisigInstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisigInput<\n TAccountMultisig extends string = string,\n TAccountRent extends string = string,\n> = {\n /** The multisignature account to initialize. */\n multisig: Address;\n /** Rent sysvar. */\n rent?: Address;\n m: InitializeMultisigInstructionDataArgs['m'];\n signers: Array
;\n};\n\nexport function getInitializeMultisigInstruction<\n TAccountMultisig extends string,\n TAccountRent extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n rent: { value: input.rent ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.rent.value) {\n accounts.rent.value =\n 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.multisig),\n getAccountMeta(accounts.rent),\n ...remainingAccounts,\n ],\n data: getInitializeMultisigInstructionDataEncoder().encode(\n args as InitializeMultisigInstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisigInstruction<\n TProgramAddress,\n TAccountMultisig,\n TAccountRent\n >);\n}\n\nexport type ParsedInitializeMultisigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n /** Rent sysvar. */\n rent: TAccountMetas[1];\n };\n data: InitializeMultisigInstructionData;\n};\n\nexport function parseInitializeMultisigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisigInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount(), rent: getNextAccount() },\n data: getInitializeMultisigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_MULTISIG2_DISCRIMINATOR = 19;\n\nexport function getInitializeMultisig2DiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_MULTISIG2_DISCRIMINATOR);\n}\n\nexport type InitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMultisig extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMultisig extends string\n ? WritableAccount\n : TAccountMultisig,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeMultisig2InstructionData = {\n discriminator: number;\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport type InitializeMultisig2InstructionDataArgs = {\n /** The number of signers (M) required to validate this multisignature account. */\n m: number;\n};\n\nexport function getInitializeMultisig2InstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['m', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG2_DISCRIMINATOR })\n );\n}\n\nexport function getInitializeMultisig2InstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['m', getU8Decoder()],\n ]);\n}\n\nexport function getInitializeMultisig2InstructionDataCodec(): FixedSizeCodec<\n InitializeMultisig2InstructionDataArgs,\n InitializeMultisig2InstructionData\n> {\n return combineCodec(\n getInitializeMultisig2InstructionDataEncoder(),\n getInitializeMultisig2InstructionDataDecoder()\n );\n}\n\nexport type InitializeMultisig2Input =\n {\n /** The multisignature account to initialize. */\n multisig: Address;\n m: InitializeMultisig2InstructionDataArgs['m'];\n signers: Array
;\n };\n\nexport function getInitializeMultisig2Instruction<\n TAccountMultisig extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeMultisig2Input,\n config?: { programAddress?: TProgramAddress }\n): InitializeMultisig2Instruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n multisig: { value: input.multisig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({\n address,\n role: AccountRole.READONLY,\n }));\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.multisig), ...remainingAccounts],\n data: getInitializeMultisig2InstructionDataEncoder().encode(\n args as InitializeMultisig2InstructionDataArgs\n ),\n programAddress,\n } as InitializeMultisig2Instruction);\n}\n\nexport type ParsedInitializeMultisig2Instruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The multisignature account to initialize. */\n multisig: TAccountMetas[0];\n };\n data: InitializeMultisig2InstructionData;\n};\n\nexport function parseInitializeMultisig2Instruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeMultisig2Instruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { multisig: getNextAccount() },\n data: getInitializeMultisig2InstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_NON_TRANSFERABLE_MINT_DISCRIMINATOR = 32;\n\nexport function getInitializeNonTransferableMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_NON_TRANSFERABLE_MINT_DISCRIMINATOR);\n}\n\nexport type InitializeNonTransferableMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeNonTransferableMintInstructionData = {\n discriminator: number;\n};\n\nexport type InitializeNonTransferableMintInstructionDataArgs = {};\n\nexport function getInitializeNonTransferableMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_NON_TRANSFERABLE_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeNonTransferableMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getInitializeNonTransferableMintInstructionDataCodec(): FixedSizeCodec<\n InitializeNonTransferableMintInstructionDataArgs,\n InitializeNonTransferableMintInstructionData\n> {\n return combineCodec(\n getInitializeNonTransferableMintInstructionDataEncoder(),\n getInitializeNonTransferableMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeNonTransferableMintInput<\n TAccountMint extends string = string,\n> = {\n /** The mint account to initialize. */\n mint: Address;\n};\n\nexport function getInitializeNonTransferableMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeNonTransferableMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeNonTransferableMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeNonTransferableMintInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeNonTransferableMintInstruction);\n}\n\nexport type ParsedInitializeNonTransferableMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint account to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeNonTransferableMintInstructionData;\n};\n\nexport function parseInitializeNonTransferableMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeNonTransferableMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeNonTransferableMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_PAUSABLE_CONFIG_DISCRIMINATOR = 44;\n\nexport function getInitializePausableConfigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_PAUSABLE_CONFIG_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_PAUSABLE_CONFIG_PAUSABLE_DISCRIMINATOR = 0;\n\nexport function getInitializePausableConfigPausableDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_PAUSABLE_CONFIG_PAUSABLE_DISCRIMINATOR\n );\n}\n\nexport type InitializePausableConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializePausableConfigInstructionData = {\n discriminator: number;\n pausableDiscriminator: number;\n /** The authority that can pause and resume the mint. */\n authority: Option
;\n};\n\nexport type InitializePausableConfigInstructionDataArgs = {\n /** The authority that can pause and resume the mint. */\n authority: OptionOrNullable
;\n};\n\nexport function getInitializePausableConfigInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['pausableDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_PAUSABLE_CONFIG_DISCRIMINATOR,\n pausableDiscriminator: INITIALIZE_PAUSABLE_CONFIG_PAUSABLE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializePausableConfigInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['pausableDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializePausableConfigInstructionDataCodec(): FixedSizeCodec<\n InitializePausableConfigInstructionDataArgs,\n InitializePausableConfigInstructionData\n> {\n return combineCodec(\n getInitializePausableConfigInstructionDataEncoder(),\n getInitializePausableConfigInstructionDataDecoder()\n );\n}\n\nexport type InitializePausableConfigInput<\n TAccountMint extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n authority: InitializePausableConfigInstructionDataArgs['authority'];\n};\n\nexport function getInitializePausableConfigInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializePausableConfigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializePausableConfigInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializePausableConfigInstructionDataEncoder().encode(\n args as InitializePausableConfigInstructionDataArgs\n ),\n programAddress,\n } as InitializePausableConfigInstruction);\n}\n\nexport type ParsedInitializePausableConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n };\n data: InitializePausableConfigInstructionData;\n};\n\nexport function parseInitializePausableConfigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializePausableConfigInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializePausableConfigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_PERMANENT_DELEGATE_DISCRIMINATOR = 35;\n\nexport function getInitializePermanentDelegateDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_PERMANENT_DELEGATE_DISCRIMINATOR);\n}\n\nexport type InitializePermanentDelegateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializePermanentDelegateInstructionData = {\n discriminator: number;\n /** Authority that may sign for `Transfer`s and `Burn`s on any account */\n delegate: Address;\n};\n\nexport type InitializePermanentDelegateInstructionDataArgs = {\n /** Authority that may sign for `Transfer`s and `Burn`s on any account */\n delegate: Address;\n};\n\nexport function getInitializePermanentDelegateInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['delegate', getAddressEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_PERMANENT_DELEGATE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializePermanentDelegateInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['delegate', getAddressDecoder()],\n ]);\n}\n\nexport function getInitializePermanentDelegateInstructionDataCodec(): FixedSizeCodec<\n InitializePermanentDelegateInstructionDataArgs,\n InitializePermanentDelegateInstructionData\n> {\n return combineCodec(\n getInitializePermanentDelegateInstructionDataEncoder(),\n getInitializePermanentDelegateInstructionDataDecoder()\n );\n}\n\nexport type InitializePermanentDelegateInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n delegate: InitializePermanentDelegateInstructionDataArgs['delegate'];\n};\n\nexport function getInitializePermanentDelegateInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializePermanentDelegateInput,\n config?: { programAddress?: TProgramAddress }\n): InitializePermanentDelegateInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializePermanentDelegateInstructionDataEncoder().encode(\n args as InitializePermanentDelegateInstructionDataArgs\n ),\n programAddress,\n } as InitializePermanentDelegateInstruction);\n}\n\nexport type ParsedInitializePermanentDelegateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializePermanentDelegateInstructionData;\n};\n\nexport function parseInitializePermanentDelegateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializePermanentDelegateInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializePermanentDelegateInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getF64Decoder,\n getF64Encoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR = 43;\n\nexport function getInitializeScaledUiAmountMintDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_SCALED_UI_AMOUNT_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR = 0;\n\nexport function getInitializeScaledUiAmountMintScaledUiAmountMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_SCALED_UI_AMOUNT_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR\n );\n}\n\nexport type InitializeScaledUiAmountMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeScaledUiAmountMintInstructionData = {\n discriminator: number;\n scaledUiAmountMintDiscriminator: number;\n /** The authority that can update the multiplier */\n authority: Option
;\n /** The initial multiplier for the scaled UI extension */\n multiplier: number;\n};\n\nexport type InitializeScaledUiAmountMintInstructionDataArgs = {\n /** The authority that can update the multiplier */\n authority: OptionOrNullable
;\n /** The initial multiplier for the scaled UI extension */\n multiplier: number;\n};\n\nexport function getInitializeScaledUiAmountMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['scaledUiAmountMintDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['multiplier', getF64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR,\n scaledUiAmountMintDiscriminator:\n INITIALIZE_SCALED_UI_AMOUNT_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeScaledUiAmountMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['scaledUiAmountMintDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['multiplier', getF64Decoder()],\n ]);\n}\n\nexport function getInitializeScaledUiAmountMintInstructionDataCodec(): FixedSizeCodec<\n InitializeScaledUiAmountMintInstructionDataArgs,\n InitializeScaledUiAmountMintInstructionData\n> {\n return combineCodec(\n getInitializeScaledUiAmountMintInstructionDataEncoder(),\n getInitializeScaledUiAmountMintInstructionDataDecoder()\n );\n}\n\nexport type InitializeScaledUiAmountMintInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeScaledUiAmountMintInstructionDataArgs['authority'];\n multiplier: InitializeScaledUiAmountMintInstructionDataArgs['multiplier'];\n};\n\nexport function getInitializeScaledUiAmountMintInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeScaledUiAmountMintInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeScaledUiAmountMintInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeScaledUiAmountMintInstructionDataEncoder().encode(\n args as InitializeScaledUiAmountMintInstructionDataArgs\n ),\n programAddress,\n } as InitializeScaledUiAmountMintInstruction);\n}\n\nexport type ParsedInitializeScaledUiAmountMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeScaledUiAmountMintInstructionData;\n};\n\nexport function parseInitializeScaledUiAmountMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeScaledUiAmountMintInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeScaledUiAmountMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TOKEN_GROUP_DISCRIMINATOR = new Uint8Array([\n 121, 113, 108, 39, 54, 51, 0, 4,\n]);\n\nexport function getInitializeTokenGroupDiscriminatorBytes() {\n return getBytesEncoder().encode(INITIALIZE_TOKEN_GROUP_DISCRIMINATOR);\n}\n\nexport type InitializeTokenGroupInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountGroup extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountMintAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTokenGroupInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Update authority for the group */\n updateAuthority: Option
;\n /** The maximum number of group members */\n maxSize: bigint;\n};\n\nexport type InitializeTokenGroupInstructionDataArgs = {\n /** Update authority for the group */\n updateAuthority: OptionOrNullable
;\n /** The maximum number of group members */\n maxSize: number | bigint;\n};\n\nexport function getInitializeTokenGroupInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n [\n 'updateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['maxSize', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TOKEN_GROUP_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTokenGroupInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n [\n 'updateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ['maxSize', getU64Decoder()],\n ]);\n}\n\nexport function getInitializeTokenGroupInstructionDataCodec(): Codec<\n InitializeTokenGroupInstructionDataArgs,\n InitializeTokenGroupInstructionData\n> {\n return combineCodec(\n getInitializeTokenGroupInstructionDataEncoder(),\n getInitializeTokenGroupInstructionDataDecoder()\n );\n}\n\nexport type InitializeTokenGroupInput<\n TAccountGroup extends string = string,\n TAccountMint extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n group: Address;\n mint: Address;\n mintAuthority: TransactionSigner;\n updateAuthority: InitializeTokenGroupInstructionDataArgs['updateAuthority'];\n maxSize: InitializeTokenGroupInstructionDataArgs['maxSize'];\n};\n\nexport function getInitializeTokenGroupInstruction<\n TAccountGroup extends string,\n TAccountMint extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTokenGroupInput<\n TAccountGroup,\n TAccountMint,\n TAccountMintAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeTokenGroupInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountMint,\n TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n group: { value: input.group ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.mintAuthority),\n ],\n data: getInitializeTokenGroupInstructionDataEncoder().encode(\n args as InitializeTokenGroupInstructionDataArgs\n ),\n programAddress,\n } as InitializeTokenGroupInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountMint,\n TAccountMintAuthority\n >);\n}\n\nexport type ParsedInitializeTokenGroupInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n group: TAccountMetas[0];\n mint: TAccountMetas[1];\n mintAuthority: TAccountMetas[2];\n };\n data: InitializeTokenGroupInstructionData;\n};\n\nexport function parseInitializeTokenGroupInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTokenGroupInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n group: getNextAccount(),\n mint: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getInitializeTokenGroupInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR = new Uint8Array([\n 152, 32, 222, 176, 223, 237, 116, 134,\n]);\n\nexport function getInitializeTokenGroupMemberDiscriminatorBytes() {\n return getBytesEncoder().encode(INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR);\n}\n\nexport type InitializeTokenGroupMemberInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMember extends string | AccountMeta = string,\n TAccountMemberMint extends string | AccountMeta = string,\n TAccountMemberMintAuthority extends string | AccountMeta = string,\n TAccountGroup extends string | AccountMeta = string,\n TAccountGroupUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMember extends string\n ? WritableAccount\n : TAccountMember,\n TAccountMemberMint extends string\n ? ReadonlyAccount\n : TAccountMemberMint,\n TAccountMemberMintAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMemberMintAuthority,\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountGroupUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTokenGroupMemberInstructionData = {\n discriminator: ReadonlyUint8Array;\n};\n\nexport type InitializeTokenGroupMemberInstructionDataArgs = {};\n\nexport function getInitializeTokenGroupMemberInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getBytesEncoder()]]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TOKEN_GROUP_MEMBER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTokenGroupMemberInstructionDataDecoder(): Decoder {\n return getStructDecoder([['discriminator', getBytesDecoder()]]);\n}\n\nexport function getInitializeTokenGroupMemberInstructionDataCodec(): Codec<\n InitializeTokenGroupMemberInstructionDataArgs,\n InitializeTokenGroupMemberInstructionData\n> {\n return combineCodec(\n getInitializeTokenGroupMemberInstructionDataEncoder(),\n getInitializeTokenGroupMemberInstructionDataDecoder()\n );\n}\n\nexport type InitializeTokenGroupMemberInput<\n TAccountMember extends string = string,\n TAccountMemberMint extends string = string,\n TAccountMemberMintAuthority extends string = string,\n TAccountGroup extends string = string,\n TAccountGroupUpdateAuthority extends string = string,\n> = {\n member: Address;\n memberMint: Address;\n memberMintAuthority: TransactionSigner;\n group: Address;\n groupUpdateAuthority: TransactionSigner;\n};\n\nexport function getInitializeTokenGroupMemberInstruction<\n TAccountMember extends string,\n TAccountMemberMint extends string,\n TAccountMemberMintAuthority extends string,\n TAccountGroup extends string,\n TAccountGroupUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTokenGroupMemberInput<\n TAccountMember,\n TAccountMemberMint,\n TAccountMemberMintAuthority,\n TAccountGroup,\n TAccountGroupUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeTokenGroupMemberInstruction<\n TProgramAddress,\n TAccountMember,\n TAccountMemberMint,\n TAccountMemberMintAuthority,\n TAccountGroup,\n TAccountGroupUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n member: { value: input.member ?? null, isWritable: true },\n memberMint: { value: input.memberMint ?? null, isWritable: false },\n memberMintAuthority: {\n value: input.memberMintAuthority ?? null,\n isWritable: false,\n },\n group: { value: input.group ?? null, isWritable: true },\n groupUpdateAuthority: {\n value: input.groupUpdateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.member),\n getAccountMeta(accounts.memberMint),\n getAccountMeta(accounts.memberMintAuthority),\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.groupUpdateAuthority),\n ],\n data: getInitializeTokenGroupMemberInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeTokenGroupMemberInstruction<\n TProgramAddress,\n TAccountMember,\n TAccountMemberMint,\n TAccountMemberMintAuthority,\n TAccountGroup,\n TAccountGroupUpdateAuthority\n >);\n}\n\nexport type ParsedInitializeTokenGroupMemberInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n member: TAccountMetas[0];\n memberMint: TAccountMetas[1];\n memberMintAuthority: TAccountMetas[2];\n group: TAccountMetas[3];\n groupUpdateAuthority: TAccountMetas[4];\n };\n data: InitializeTokenGroupMemberInstructionData;\n};\n\nexport function parseInitializeTokenGroupMemberInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTokenGroupMemberInstruction {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n member: getNextAccount(),\n memberMint: getNextAccount(),\n memberMintAuthority: getNextAccount(),\n group: getNextAccount(),\n groupUpdateAuthority: getNextAccount(),\n },\n data: getInitializeTokenGroupMemberInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TOKEN_METADATA_DISCRIMINATOR = new Uint8Array([\n 210, 225, 30, 162, 88, 184, 77, 141,\n]);\n\nexport function getInitializeTokenMetadataDiscriminatorBytes() {\n return getBytesEncoder().encode(INITIALIZE_TOKEN_METADATA_DISCRIMINATOR);\n}\n\nexport type InitializeTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlyAccount\n : TAccountUpdateAuthority,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountMintAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTokenMetadataInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Longer name of the token. */\n name: string;\n /** Shortened symbol of the token. */\n symbol: string;\n /** URI pointing to more metadata (image, video, etc.). */\n uri: string;\n};\n\nexport type InitializeTokenMetadataInstructionDataArgs = {\n /** Longer name of the token. */\n name: string;\n /** Shortened symbol of the token. */\n symbol: string;\n /** URI pointing to more metadata (image, video, etc.). */\n uri: string;\n};\n\nexport function getInitializeTokenMetadataInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['symbol', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ['uri', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TOKEN_METADATA_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTokenMetadataInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['symbol', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ['uri', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getInitializeTokenMetadataInstructionDataCodec(): Codec<\n InitializeTokenMetadataInstructionDataArgs,\n InitializeTokenMetadataInstructionData\n> {\n return combineCodec(\n getInitializeTokenMetadataInstructionDataEncoder(),\n getInitializeTokenMetadataInstructionDataDecoder()\n );\n}\n\nexport type InitializeTokenMetadataInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n TAccountMint extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: Address;\n mint: Address;\n mintAuthority: TransactionSigner;\n name: InitializeTokenMetadataInstructionDataArgs['name'];\n symbol: InitializeTokenMetadataInstructionDataArgs['symbol'];\n uri: InitializeTokenMetadataInstructionDataArgs['uri'];\n};\n\nexport function getInitializeTokenMetadataInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TAccountMint extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTokenMetadataInput<\n TAccountMetadata,\n TAccountUpdateAuthority,\n TAccountMint,\n TAccountMintAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): InitializeTokenMetadataInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority,\n TAccountMint,\n TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n mint: { value: input.mint ?? null, isWritable: false },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.mintAuthority),\n ],\n data: getInitializeTokenMetadataInstructionDataEncoder().encode(\n args as InitializeTokenMetadataInstructionDataArgs\n ),\n programAddress,\n } as InitializeTokenMetadataInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority,\n TAccountMint,\n TAccountMintAuthority\n >);\n}\n\nexport type ParsedInitializeTokenMetadataInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n mint: TAccountMetas[2];\n mintAuthority: TAccountMetas[3];\n };\n data: InitializeTokenMetadataInstructionData;\n};\n\nexport function parseInitializeTokenMetadataInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTokenMetadataInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n metadata: getNextAccount(),\n updateAuthority: getNextAccount(),\n mint: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getInitializeTokenMetadataInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TRANSFER_FEE_CONFIG_DISCRIMINATOR = 26;\n\nexport function getInitializeTransferFeeConfigDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_TRANSFER_FEE_CONFIG_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_TRANSFER_FEE_CONFIG_TRANSFER_FEE_DISCRIMINATOR = 0;\n\nexport function getInitializeTransferFeeConfigTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_TRANSFER_FEE_CONFIG_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type InitializeTransferFeeConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTransferFeeConfigInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** Pubkey that may update the fees. */\n transferFeeConfigAuthority: Option
;\n /** Withdraw instructions must be signed by this key. */\n withdrawWithheldAuthority: Option
;\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: bigint;\n};\n\nexport type InitializeTransferFeeConfigInstructionDataArgs = {\n /** Pubkey that may update the fees. */\n transferFeeConfigAuthority: OptionOrNullable
;\n /** Withdraw instructions must be signed by this key. */\n withdrawWithheldAuthority: OptionOrNullable
;\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: number | bigint;\n};\n\nexport function getInitializeTransferFeeConfigInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['transferFeeConfigAuthority', getOptionEncoder(getAddressEncoder())],\n ['withdrawWithheldAuthority', getOptionEncoder(getAddressEncoder())],\n ['transferFeeBasisPoints', getU16Encoder()],\n ['maximumFee', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TRANSFER_FEE_CONFIG_DISCRIMINATOR,\n transferFeeDiscriminator:\n INITIALIZE_TRANSFER_FEE_CONFIG_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTransferFeeConfigInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['transferFeeConfigAuthority', getOptionDecoder(getAddressDecoder())],\n ['withdrawWithheldAuthority', getOptionDecoder(getAddressDecoder())],\n ['transferFeeBasisPoints', getU16Decoder()],\n ['maximumFee', getU64Decoder()],\n ]);\n}\n\nexport function getInitializeTransferFeeConfigInstructionDataCodec(): Codec<\n InitializeTransferFeeConfigInstructionDataArgs,\n InitializeTransferFeeConfigInstructionData\n> {\n return combineCodec(\n getInitializeTransferFeeConfigInstructionDataEncoder(),\n getInitializeTransferFeeConfigInstructionDataDecoder()\n );\n}\n\nexport type InitializeTransferFeeConfigInput<\n TAccountMint extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n transferFeeConfigAuthority: InitializeTransferFeeConfigInstructionDataArgs['transferFeeConfigAuthority'];\n withdrawWithheldAuthority: InitializeTransferFeeConfigInstructionDataArgs['withdrawWithheldAuthority'];\n transferFeeBasisPoints: InitializeTransferFeeConfigInstructionDataArgs['transferFeeBasisPoints'];\n maximumFee: InitializeTransferFeeConfigInstructionDataArgs['maximumFee'];\n};\n\nexport function getInitializeTransferFeeConfigInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTransferFeeConfigInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeTransferFeeConfigInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeTransferFeeConfigInstructionDataEncoder().encode(\n args as InitializeTransferFeeConfigInstructionDataArgs\n ),\n programAddress,\n } as InitializeTransferFeeConfigInstruction);\n}\n\nexport type ParsedInitializeTransferFeeConfigInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeTransferFeeConfigInstructionData;\n};\n\nexport function parseInitializeTransferFeeConfigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTransferFeeConfigInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeTransferFeeConfigInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const INITIALIZE_TRANSFER_HOOK_DISCRIMINATOR = 36;\n\nexport function getInitializeTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(INITIALIZE_TRANSFER_HOOK_DISCRIMINATOR);\n}\n\nexport const INITIALIZE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR = 0;\n\nexport function getInitializeTransferHookTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(\n INITIALIZE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR\n );\n}\n\nexport type InitializeTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeTransferHookInstructionData = {\n discriminator: number;\n transferHookDiscriminator: number;\n /** The public key for the account that can update the program id */\n authority: Option
;\n /** The program id that performs logic during transfers */\n programId: Option
;\n};\n\nexport type InitializeTransferHookInstructionDataArgs = {\n /** The public key for the account that can update the program id */\n authority: OptionOrNullable
;\n /** The program id that performs logic during transfers */\n programId: OptionOrNullable
;\n};\n\nexport function getInitializeTransferHookInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferHookDiscriminator', getU8Encoder()],\n [\n 'authority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'programId',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: INITIALIZE_TRANSFER_HOOK_DISCRIMINATOR,\n transferHookDiscriminator:\n INITIALIZE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR,\n })\n );\n}\n\nexport function getInitializeTransferHookInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferHookDiscriminator', getU8Decoder()],\n [\n 'authority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n [\n 'programId',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getInitializeTransferHookInstructionDataCodec(): FixedSizeCodec<\n InitializeTransferHookInstructionDataArgs,\n InitializeTransferHookInstructionData\n> {\n return combineCodec(\n getInitializeTransferHookInstructionDataEncoder(),\n getInitializeTransferHookInstructionDataDecoder()\n );\n}\n\nexport type InitializeTransferHookInput =\n {\n /** The mint to initialize. */\n mint: Address;\n authority: InitializeTransferHookInstructionDataArgs['authority'];\n programId: InitializeTransferHookInstructionDataArgs['programId'];\n };\n\nexport function getInitializeTransferHookInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: InitializeTransferHookInput,\n config?: { programAddress?: TProgramAddress }\n): InitializeTransferHookInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getInitializeTransferHookInstructionDataEncoder().encode(\n args as InitializeTransferHookInstructionDataArgs\n ),\n programAddress,\n } as InitializeTransferHookInstruction);\n}\n\nexport type ParsedInitializeTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n };\n data: InitializeTransferHookInstructionData;\n};\n\nexport function parseInitializeTransferHookInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedInitializeTransferHookInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getInitializeTransferHookInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_DISCRIMINATOR = 7;\n\nexport function getMintToDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_DISCRIMINATOR);\n}\n\nexport type MintToInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n};\n\nexport type MintToInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n};\n\nexport function getMintToInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_DISCRIMINATOR })\n );\n}\n\nexport function getMintToInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getMintToInstructionDataCodec(): FixedSizeCodec<\n MintToInstructionDataArgs,\n MintToInstructionData\n> {\n return combineCodec(\n getMintToInstructionDataEncoder(),\n getMintToInstructionDataDecoder()\n );\n}\n\nexport type MintToInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint account. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getMintToInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: MintToInput,\n config?: { programAddress?: TProgramAddress }\n): MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToInstructionDataEncoder().encode(\n args as MintToInstructionDataArgs\n ),\n programAddress,\n } as MintToInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint account. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToInstructionData;\n};\n\nexport function parseMintToInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const MINT_TO_CHECKED_DISCRIMINATOR = 14;\n\nexport function getMintToCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(MINT_TO_CHECKED_DISCRIMINATOR);\n}\n\nexport type MintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountToken extends string | AccountMeta = string,\n TAccountMintAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountMintAuthority extends string\n ? ReadonlyAccount\n : TAccountMintAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type MintToCheckedInstructionData = {\n discriminator: number;\n /** The amount of new tokens to mint. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type MintToCheckedInstructionDataArgs = {\n /** The amount of new tokens to mint. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getMintToCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: MINT_TO_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getMintToCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getMintToCheckedInstructionDataCodec(): FixedSizeCodec<\n MintToCheckedInstructionDataArgs,\n MintToCheckedInstructionData\n> {\n return combineCodec(\n getMintToCheckedInstructionDataEncoder(),\n getMintToCheckedInstructionDataDecoder()\n );\n}\n\nexport type MintToCheckedInput<\n TAccountMint extends string = string,\n TAccountToken extends string = string,\n TAccountMintAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The account to mint tokens to. */\n token: Address;\n /** The mint's minting authority or its multisignature account. */\n mintAuthority:\n | Address\n | TransactionSigner;\n amount: MintToCheckedInstructionDataArgs['amount'];\n decimals: MintToCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getMintToCheckedInstruction<\n TAccountMint extends string,\n TAccountToken extends string,\n TAccountMintAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: MintToCheckedInput,\n config?: { programAddress?: TProgramAddress }\n): MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n token: { value: input.token ?? null, isWritable: true },\n mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.mintAuthority),\n ...remainingAccounts,\n ],\n data: getMintToCheckedInstructionDataEncoder().encode(\n args as MintToCheckedInstructionDataArgs\n ),\n programAddress,\n } as MintToCheckedInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountToken,\n (typeof input)['mintAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMintAuthority\n >);\n}\n\nexport type ParsedMintToCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The account to mint tokens to. */\n token: TAccountMetas[1];\n /** The mint's minting authority or its multisignature account. */\n mintAuthority: TAccountMetas[2];\n };\n data: MintToCheckedInstructionData;\n};\n\nexport function parseMintToCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedMintToCheckedInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n token: getNextAccount(),\n mintAuthority: getNextAccount(),\n },\n data: getMintToCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const PAUSE_DISCRIMINATOR = 44;\n\nexport function getPauseDiscriminatorBytes() {\n return getU8Encoder().encode(PAUSE_DISCRIMINATOR);\n}\n\nexport const PAUSE_PAUSABLE_DISCRIMINATOR = 1;\n\nexport function getPausePausableDiscriminatorBytes() {\n return getU8Encoder().encode(PAUSE_PAUSABLE_DISCRIMINATOR);\n}\n\nexport type PauseInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type PauseInstructionData = {\n discriminator: number;\n pausableDiscriminator: number;\n};\n\nexport type PauseInstructionDataArgs = {};\n\nexport function getPauseInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['pausableDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: PAUSE_DISCRIMINATOR,\n pausableDiscriminator: PAUSE_PAUSABLE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getPauseInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['pausableDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getPauseInstructionDataCodec(): FixedSizeCodec<\n PauseInstructionDataArgs,\n PauseInstructionData\n> {\n return combineCodec(\n getPauseInstructionDataEncoder(),\n getPauseInstructionDataDecoder()\n );\n}\n\nexport type PauseInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The pausable authority that can pause the mint. */\n authority: Address | TransactionSigner;\n};\n\nexport function getPauseInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: PauseInput,\n config?: { programAddress?: TProgramAddress }\n): PauseInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getPauseInstructionDataEncoder().encode({}),\n programAddress,\n } as PauseInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedPauseInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The pausable authority that can pause the mint. */\n authority: TAccountMetas[1];\n };\n data: PauseInstructionData;\n};\n\nexport function parsePauseInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedPauseInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getPauseInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getArrayDecoder,\n getArrayEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getExtensionTypeDecoder,\n getExtensionTypeEncoder,\n type ExtensionType,\n type ExtensionTypeArgs,\n} from '../types';\n\nexport const REALLOCATE_DISCRIMINATOR = 29;\n\nexport function getReallocateDiscriminatorBytes() {\n return getU8Encoder().encode(REALLOCATE_DISCRIMINATOR);\n}\n\nexport type ReallocateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountToken extends string | AccountMeta = string,\n TAccountPayer extends string | AccountMeta = string,\n TAccountSystemProgram extends\n | string\n | AccountMeta = '11111111111111111111111111111111',\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountToken extends string\n ? WritableAccount\n : TAccountToken,\n TAccountPayer extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountPayer,\n TAccountSystemProgram extends string\n ? ReadonlyAccount\n : TAccountSystemProgram,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ReallocateInstructionData = {\n discriminator: number;\n /** New extension types to include in the reallocated account. */\n newExtensionTypes: Array;\n};\n\nexport type ReallocateInstructionDataArgs = {\n /** New extension types to include in the reallocated account. */\n newExtensionTypes: Array;\n};\n\nexport function getReallocateInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n [\n 'newExtensionTypes',\n getArrayEncoder(getExtensionTypeEncoder(), { size: 'remainder' }),\n ],\n ]),\n (value) => ({ ...value, discriminator: REALLOCATE_DISCRIMINATOR })\n );\n}\n\nexport function getReallocateInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n [\n 'newExtensionTypes',\n getArrayDecoder(getExtensionTypeDecoder(), { size: 'remainder' }),\n ],\n ]);\n}\n\nexport function getReallocateInstructionDataCodec(): Codec<\n ReallocateInstructionDataArgs,\n ReallocateInstructionData\n> {\n return combineCodec(\n getReallocateInstructionDataEncoder(),\n getReallocateInstructionDataDecoder()\n );\n}\n\nexport type ReallocateInput<\n TAccountToken extends string = string,\n TAccountPayer extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The token account to reallocate. */\n token: Address;\n /** The payer account to fund reallocation. */\n payer: TransactionSigner;\n /** System program for reallocation funding. */\n systemProgram?: Address;\n /** The account's owner or its multisignature account. */\n owner: Address | TransactionSigner;\n newExtensionTypes: ReallocateInstructionDataArgs['newExtensionTypes'];\n multiSigners?: Array;\n};\n\nexport function getReallocateInstruction<\n TAccountToken extends string,\n TAccountPayer extends string,\n TAccountSystemProgram extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ReallocateInput<\n TAccountToken,\n TAccountPayer,\n TAccountSystemProgram,\n TAccountOwner\n >,\n config?: { programAddress?: TProgramAddress }\n): ReallocateInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountPayer,\n TAccountSystemProgram,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n token: { value: input.token ?? null, isWritable: true },\n payer: { value: input.payer ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;\n }\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.token),\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getReallocateInstructionDataEncoder().encode(\n args as ReallocateInstructionDataArgs\n ),\n programAddress,\n } as ReallocateInstruction<\n TProgramAddress,\n TAccountToken,\n TAccountPayer,\n TAccountSystemProgram,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedReallocateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token account to reallocate. */\n token: TAccountMetas[0];\n /** The payer account to fund reallocation. */\n payer: TAccountMetas[1];\n /** System program for reallocation funding. */\n systemProgram: TAccountMetas[2];\n /** The account's owner or its multisignature account. */\n owner: TAccountMetas[3];\n };\n data: ReallocateInstructionData;\n};\n\nexport function parseReallocateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedReallocateInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n token: getNextAccount(),\n payer: getNextAccount(),\n systemProgram: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getReallocateInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { findAssociatedTokenPda } from '../pdas';\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from '../shared';\n\nexport const RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR = 2;\n\nexport function getRecoverNestedAssociatedTokenDiscriminatorBytes() {\n return getU8Encoder().encode(RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR);\n}\n\nexport type RecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountNestedAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountNestedTokenMintAddress extends string | AccountMeta = string,\n TAccountDestinationAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerAssociatedAccountAddress extends\n | string\n | AccountMeta = string,\n TAccountOwnerTokenMintAddress extends string | AccountMeta = string,\n TAccountWalletAddress extends string | AccountMeta = string,\n TAccountTokenProgram extends\n | string\n | AccountMeta = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountNestedAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress extends string\n ? WritableAccount\n : TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress extends string\n ? ReadonlyAccount\n : TAccountOwnerTokenMintAddress,\n TAccountWalletAddress extends string\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountWalletAddress,\n TAccountTokenProgram extends string\n ? ReadonlyAccount\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RecoverNestedAssociatedTokenInstructionData = {\n discriminator: number;\n};\n\nexport type RecoverNestedAssociatedTokenInstructionDataArgs = {};\n\nexport function getRecoverNestedAssociatedTokenInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: RECOVER_NESTED_ASSOCIATED_TOKEN_DISCRIMINATOR,\n })\n );\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRecoverNestedAssociatedTokenInstructionDataCodec(): FixedSizeCodec<\n RecoverNestedAssociatedTokenInstructionDataArgs,\n RecoverNestedAssociatedTokenInstructionData\n> {\n return combineCodec(\n getRecoverNestedAssociatedTokenInstructionDataEncoder(),\n getRecoverNestedAssociatedTokenInstructionDataDecoder()\n );\n}\n\nexport type RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress?: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress?: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress?: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport async function getRecoverNestedAssociatedTokenInstructionAsync<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenAsyncInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): Promise<\n RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n if (!accounts.ownerAssociatedAccountAddress.value) {\n accounts.ownerAssociatedAccountAddress.value = await findAssociatedTokenPda(\n {\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.ownerTokenMintAddress.value),\n }\n );\n }\n if (!accounts.nestedAssociatedAccountAddress.value) {\n accounts.nestedAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.ownerAssociatedAccountAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n if (!accounts.destinationAssociatedAccountAddress.value) {\n accounts.destinationAssociatedAccountAddress.value =\n await findAssociatedTokenPda({\n owner: expectAddress(accounts.walletAddress.value),\n tokenProgram: expectAddress(accounts.tokenProgram.value),\n mint: expectAddress(accounts.nestedTokenMintAddress.value),\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress extends string = string,\n TAccountNestedTokenMintAddress extends string = string,\n TAccountDestinationAssociatedAccountAddress extends string = string,\n TAccountOwnerAssociatedAccountAddress extends string = string,\n TAccountOwnerTokenMintAddress extends string = string,\n TAccountWalletAddress extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: Address;\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: Address;\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: Address;\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: Address;\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: Address;\n /** Wallet address for the owner associated token account. */\n walletAddress: TransactionSigner;\n /** SPL Token program. */\n tokenProgram?: Address;\n};\n\nexport function getRecoverNestedAssociatedTokenInstruction<\n TAccountNestedAssociatedAccountAddress extends string,\n TAccountNestedTokenMintAddress extends string,\n TAccountDestinationAssociatedAccountAddress extends string,\n TAccountOwnerAssociatedAccountAddress extends string,\n TAccountOwnerTokenMintAddress extends string,\n TAccountWalletAddress extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n>(\n input: RecoverNestedAssociatedTokenInput<\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress }\n): RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress =\n config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n nestedAssociatedAccountAddress: {\n value: input.nestedAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n nestedTokenMintAddress: {\n value: input.nestedTokenMintAddress ?? null,\n isWritable: false,\n },\n destinationAssociatedAccountAddress: {\n value: input.destinationAssociatedAccountAddress ?? null,\n isWritable: true,\n },\n ownerAssociatedAccountAddress: {\n value: input.ownerAssociatedAccountAddress ?? null,\n isWritable: false,\n },\n ownerTokenMintAddress: {\n value: input.ownerTokenMintAddress ?? null,\n isWritable: false,\n },\n walletAddress: { value: input.walletAddress ?? null, isWritable: true },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.nestedAssociatedAccountAddress),\n getAccountMeta(accounts.nestedTokenMintAddress),\n getAccountMeta(accounts.destinationAssociatedAccountAddress),\n getAccountMeta(accounts.ownerAssociatedAccountAddress),\n getAccountMeta(accounts.ownerTokenMintAddress),\n getAccountMeta(accounts.walletAddress),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getRecoverNestedAssociatedTokenInstructionDataEncoder().encode({}),\n programAddress,\n } as RecoverNestedAssociatedTokenInstruction<\n TProgramAddress,\n TAccountNestedAssociatedAccountAddress,\n TAccountNestedTokenMintAddress,\n TAccountDestinationAssociatedAccountAddress,\n TAccountOwnerAssociatedAccountAddress,\n TAccountOwnerTokenMintAddress,\n TAccountWalletAddress,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedRecoverNestedAssociatedTokenInstruction<\n TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Nested associated token account, must be owned by `ownerAssociatedAccountAddress`. */\n nestedAssociatedAccountAddress: TAccountMetas[0];\n /** Token mint for the nested associated token account. */\n nestedTokenMintAddress: TAccountMetas[1];\n /** Wallet's associated token account. */\n destinationAssociatedAccountAddress: TAccountMetas[2];\n /** Owner associated token account address, must be owned by `walletAddress`. */\n ownerAssociatedAccountAddress: TAccountMetas[3];\n /** Token mint for the owner associated token account. */\n ownerTokenMintAddress: TAccountMetas[4];\n /** Wallet address for the owner associated token account. */\n walletAddress: TAccountMetas[5];\n /** SPL Token program. */\n tokenProgram: TAccountMetas[6];\n };\n data: RecoverNestedAssociatedTokenInstructionData;\n};\n\nexport function parseRecoverNestedAssociatedTokenInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRecoverNestedAssociatedTokenInstruction {\n if (instruction.accounts.length < 7) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n nestedAssociatedAccountAddress: getNextAccount(),\n nestedTokenMintAddress: getNextAccount(),\n destinationAssociatedAccountAddress: getNextAccount(),\n ownerAssociatedAccountAddress: getNextAccount(),\n ownerTokenMintAddress: getNextAccount(),\n walletAddress: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getRecoverNestedAssociatedTokenInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR = new Uint8Array([\n 234, 18, 32, 56, 89, 141, 37, 181,\n]);\n\nexport function getRemoveTokenMetadataKeyDiscriminatorBytes() {\n return getBytesEncoder().encode(REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR);\n}\n\nexport type RemoveTokenMetadataKeyInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RemoveTokenMetadataKeyInstructionData = {\n discriminator: ReadonlyUint8Array;\n /**\n * If the idempotent flag is set to true, then the instruction will not\n * error if the key does not exist\n */\n idempotent: boolean;\n /** Key to remove in the additional metadata portion. */\n key: string;\n};\n\nexport type RemoveTokenMetadataKeyInstructionDataArgs = {\n /**\n * If the idempotent flag is set to true, then the instruction will not\n * error if the key does not exist\n */\n idempotent?: boolean;\n /** Key to remove in the additional metadata portion. */\n key: string;\n};\n\nexport function getRemoveTokenMetadataKeyInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['idempotent', getBooleanEncoder()],\n ['key', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: REMOVE_TOKEN_METADATA_KEY_DISCRIMINATOR,\n idempotent: value.idempotent ?? false,\n })\n );\n}\n\nexport function getRemoveTokenMetadataKeyInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['idempotent', getBooleanDecoder()],\n ['key', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getRemoveTokenMetadataKeyInstructionDataCodec(): Codec<\n RemoveTokenMetadataKeyInstructionDataArgs,\n RemoveTokenMetadataKeyInstructionData\n> {\n return combineCodec(\n getRemoveTokenMetadataKeyInstructionDataEncoder(),\n getRemoveTokenMetadataKeyInstructionDataDecoder()\n );\n}\n\nexport type RemoveTokenMetadataKeyInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: TransactionSigner;\n idempotent?: RemoveTokenMetadataKeyInstructionDataArgs['idempotent'];\n key: RemoveTokenMetadataKeyInstructionDataArgs['key'];\n};\n\nexport function getRemoveTokenMetadataKeyInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: RemoveTokenMetadataKeyInput,\n config?: { programAddress?: TProgramAddress }\n): RemoveTokenMetadataKeyInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getRemoveTokenMetadataKeyInstructionDataEncoder().encode(\n args as RemoveTokenMetadataKeyInstructionDataArgs\n ),\n programAddress,\n } as RemoveTokenMetadataKeyInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedRemoveTokenMetadataKeyInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: RemoveTokenMetadataKeyInstructionData;\n};\n\nexport function parseRemoveTokenMetadataKeyInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRemoveTokenMetadataKeyInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount(), updateAuthority: getNextAccount() },\n data: getRemoveTokenMetadataKeyInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const RESUME_DISCRIMINATOR = 44;\n\nexport function getResumeDiscriminatorBytes() {\n return getU8Encoder().encode(RESUME_DISCRIMINATOR);\n}\n\nexport const RESUME_PAUSABLE_DISCRIMINATOR = 2;\n\nexport function getResumePausableDiscriminatorBytes() {\n return getU8Encoder().encode(RESUME_PAUSABLE_DISCRIMINATOR);\n}\n\nexport type ResumeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ResumeInstructionData = {\n discriminator: number;\n pausableDiscriminator: number;\n};\n\nexport type ResumeInstructionDataArgs = {};\n\nexport function getResumeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['pausableDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: RESUME_DISCRIMINATOR,\n pausableDiscriminator: RESUME_PAUSABLE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getResumeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['pausableDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getResumeInstructionDataCodec(): FixedSizeCodec<\n ResumeInstructionDataArgs,\n ResumeInstructionData\n> {\n return combineCodec(\n getResumeInstructionDataEncoder(),\n getResumeInstructionDataDecoder()\n );\n}\n\nexport type ResumeInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The pausable authority that can resume the mint. */\n authority: Address | TransactionSigner;\n};\n\nexport function getResumeInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ResumeInput,\n config?: { programAddress?: TProgramAddress }\n): ResumeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getResumeInstructionDataEncoder().encode({}),\n programAddress,\n } as ResumeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedResumeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The pausable authority that can resume the mint. */\n authority: TAccountMetas[1];\n };\n data: ResumeInstructionData;\n};\n\nexport function parseResumeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedResumeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getResumeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const REVOKE_DISCRIMINATOR = 5;\n\nexport function getRevokeDiscriminatorBytes() {\n return getU8Encoder().encode(REVOKE_DISCRIMINATOR);\n}\n\nexport type RevokeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RevokeInstructionData = { discriminator: number };\n\nexport type RevokeInstructionDataArgs = {};\n\nexport function getRevokeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: REVOKE_DISCRIMINATOR })\n );\n}\n\nexport function getRevokeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getRevokeInstructionDataCodec(): FixedSizeCodec<\n RevokeInstructionDataArgs,\n RevokeInstructionData\n> {\n return combineCodec(\n getRevokeInstructionDataEncoder(),\n getRevokeInstructionDataDecoder()\n );\n}\n\nexport type RevokeInput<\n TAccountSource extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The source account owner or its multisignature. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getRevokeInstruction<\n TAccountSource extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: RevokeInput,\n config?: { programAddress?: TProgramAddress }\n): RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getRevokeInstructionDataEncoder().encode({}),\n programAddress,\n } as RevokeInstruction<\n TProgramAddress,\n TAccountSource,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedRevokeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The source account owner or its multisignature. */\n owner: TAccountMetas[1];\n };\n data: RevokeInstructionData;\n};\n\nexport function parseRevokeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedRevokeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { source: getNextAccount(), owner: getNextAccount() },\n data: getRevokeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAuthorityTypeDecoder,\n getAuthorityTypeEncoder,\n type AuthorityType,\n type AuthorityTypeArgs,\n} from '../types';\n\nexport const SET_AUTHORITY_DISCRIMINATOR = 6;\n\nexport function getSetAuthorityDiscriminatorBytes() {\n return getU8Encoder().encode(SET_AUTHORITY_DISCRIMINATOR);\n}\n\nexport type SetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountOwned extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountOwned extends string\n ? WritableAccount\n : TAccountOwned,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SetAuthorityInstructionData = {\n discriminator: number;\n /** The type of authority to update. */\n authorityType: AuthorityType;\n /** The new authority */\n newAuthority: Option
;\n};\n\nexport type SetAuthorityInstructionDataArgs = {\n /** The type of authority to update. */\n authorityType: AuthorityTypeArgs;\n /** The new authority */\n newAuthority: OptionOrNullable
;\n};\n\nexport function getSetAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['authorityType', getAuthorityTypeEncoder()],\n ['newAuthority', getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({ ...value, discriminator: SET_AUTHORITY_DISCRIMINATOR })\n );\n}\n\nexport function getSetAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['authorityType', getAuthorityTypeDecoder()],\n ['newAuthority', getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getSetAuthorityInstructionDataCodec(): Codec<\n SetAuthorityInstructionDataArgs,\n SetAuthorityInstructionData\n> {\n return combineCodec(\n getSetAuthorityInstructionDataEncoder(),\n getSetAuthorityInstructionDataDecoder()\n );\n}\n\nexport type SetAuthorityInput<\n TAccountOwned extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The mint or account to change the authority of. */\n owned: Address;\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: Address | TransactionSigner;\n authorityType: SetAuthorityInstructionDataArgs['authorityType'];\n newAuthority: SetAuthorityInstructionDataArgs['newAuthority'];\n multiSigners?: Array;\n};\n\nexport function getSetAuthorityInstruction<\n TAccountOwned extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: SetAuthorityInput,\n config?: { programAddress?: TProgramAddress }\n): SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owned: { value: input.owned ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owned),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getSetAuthorityInstructionDataEncoder().encode(\n args as SetAuthorityInstructionDataArgs\n ),\n programAddress,\n } as SetAuthorityInstruction<\n TProgramAddress,\n TAccountOwned,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedSetAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint or account to change the authority of. */\n owned: TAccountMetas[0];\n /** The current authority or the multisignature account of the mint or account to update. */\n owner: TAccountMetas[1];\n };\n data: SetAuthorityInstructionData;\n};\n\nexport function parseSetAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSetAuthorityInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { owned: getNextAccount(), owner: getNextAccount() },\n data: getSetAuthorityInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const SET_TRANSFER_FEE_DISCRIMINATOR = 26;\n\nexport function getSetTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(SET_TRANSFER_FEE_DISCRIMINATOR);\n}\n\nexport const SET_TRANSFER_FEE_TRANSFER_FEE_DISCRIMINATOR = 5;\n\nexport function getSetTransferFeeTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(SET_TRANSFER_FEE_TRANSFER_FEE_DISCRIMINATOR);\n}\n\nexport type SetTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountTransferFeeConfigAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountTransferFeeConfigAuthority extends string\n ? ReadonlyAccount\n : TAccountTransferFeeConfigAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SetTransferFeeInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: bigint;\n};\n\nexport type SetTransferFeeInstructionDataArgs = {\n /** Amount of transfer collected as fees, expressed as basis points of the transfer amount. */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers. */\n maximumFee: number | bigint;\n};\n\nexport function getSetTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['transferFeeBasisPoints', getU16Encoder()],\n ['maximumFee', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_TRANSFER_FEE_DISCRIMINATOR,\n transferFeeDiscriminator: SET_TRANSFER_FEE_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['transferFeeBasisPoints', getU16Decoder()],\n ['maximumFee', getU64Decoder()],\n ]);\n}\n\nexport function getSetTransferFeeInstructionDataCodec(): FixedSizeCodec<\n SetTransferFeeInstructionDataArgs,\n SetTransferFeeInstructionData\n> {\n return combineCodec(\n getSetTransferFeeInstructionDataEncoder(),\n getSetTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type SetTransferFeeInput<\n TAccountMint extends string = string,\n TAccountTransferFeeConfigAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The mint's fee account owner or its multisignature account. */\n transferFeeConfigAuthority:\n | Address\n | TransactionSigner;\n transferFeeBasisPoints: SetTransferFeeInstructionDataArgs['transferFeeBasisPoints'];\n maximumFee: SetTransferFeeInstructionDataArgs['maximumFee'];\n multiSigners?: Array;\n};\n\nexport function getSetTransferFeeInstruction<\n TAccountMint extends string,\n TAccountTransferFeeConfigAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: SetTransferFeeInput,\n config?: { programAddress?: TProgramAddress }\n): SetTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['transferFeeConfigAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountTransferFeeConfigAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n transferFeeConfigAuthority: {\n value: input.transferFeeConfigAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.transferFeeConfigAuthority),\n ...remainingAccounts,\n ],\n data: getSetTransferFeeInstructionDataEncoder().encode(\n args as SetTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as SetTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['transferFeeConfigAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountTransferFeeConfigAuthority\n >);\n}\n\nexport type ParsedSetTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The mint's fee account owner or its multisignature account. */\n transferFeeConfigAuthority: TAccountMetas[1];\n };\n data: SetTransferFeeInstructionData;\n};\n\nexport function parseSetTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSetTransferFeeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n transferFeeConfigAuthority: getNextAccount(),\n },\n data: getSetTransferFeeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const SYNC_NATIVE_DISCRIMINATOR = 17;\n\nexport function getSyncNativeDiscriminatorBytes() {\n return getU8Encoder().encode(SYNC_NATIVE_DISCRIMINATOR);\n}\n\nexport type SyncNativeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type SyncNativeInstructionData = { discriminator: number };\n\nexport type SyncNativeInstructionDataArgs = {};\n\nexport function getSyncNativeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: SYNC_NATIVE_DISCRIMINATOR })\n );\n}\n\nexport function getSyncNativeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getSyncNativeInstructionDataCodec(): FixedSizeCodec<\n SyncNativeInstructionDataArgs,\n SyncNativeInstructionData\n> {\n return combineCodec(\n getSyncNativeInstructionDataEncoder(),\n getSyncNativeInstructionDataDecoder()\n );\n}\n\nexport type SyncNativeInput = {\n /** The native token account to sync with its underlying lamports. */\n account: Address;\n};\n\nexport function getSyncNativeInstruction<\n TAccountAccount extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: SyncNativeInput,\n config?: { programAddress?: TProgramAddress }\n): SyncNativeInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.account)],\n data: getSyncNativeInstructionDataEncoder().encode({}),\n programAddress,\n } as SyncNativeInstruction);\n}\n\nexport type ParsedSyncNativeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The native token account to sync with its underlying lamports. */\n account: TAccountMetas[0];\n };\n data: SyncNativeInstructionData;\n};\n\nexport function parseSyncNativeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedSyncNativeInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { account: getNextAccount() },\n data: getSyncNativeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const THAW_ACCOUNT_DISCRIMINATOR = 11;\n\nexport function getThawAccountDiscriminatorBytes() {\n return getU8Encoder().encode(THAW_ACCOUNT_DISCRIMINATOR);\n}\n\nexport type ThawAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountAccount extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountOwner extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountAccount extends string\n ? WritableAccount\n : TAccountAccount,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountOwner extends string\n ? ReadonlyAccount\n : TAccountOwner,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type ThawAccountInstructionData = { discriminator: number };\n\nexport type ThawAccountInstructionDataArgs = {};\n\nexport function getThawAccountInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({ ...value, discriminator: THAW_ACCOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getThawAccountInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getThawAccountInstructionDataCodec(): FixedSizeCodec<\n ThawAccountInstructionDataArgs,\n ThawAccountInstructionData\n> {\n return combineCodec(\n getThawAccountInstructionDataEncoder(),\n getThawAccountInstructionDataDecoder()\n );\n}\n\nexport type ThawAccountInput<\n TAccountAccount extends string = string,\n TAccountMint extends string = string,\n TAccountOwner extends string = string,\n> = {\n /** The account to thaw. */\n account: Address;\n /** The token mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n owner: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getThawAccountInstruction<\n TAccountAccount extends string,\n TAccountMint extends string,\n TAccountOwner extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: ThawAccountInput,\n config?: { programAddress?: TProgramAddress }\n): ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n account: { value: input.account ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n owner: { value: input.owner ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.account),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.owner),\n ...remainingAccounts,\n ],\n data: getThawAccountInstructionDataEncoder().encode({}),\n programAddress,\n } as ThawAccountInstruction<\n TProgramAddress,\n TAccountAccount,\n TAccountMint,\n (typeof input)['owner'] extends TransactionSigner\n ? ReadonlySignerAccount & AccountSignerMeta\n : TAccountOwner\n >);\n}\n\nexport type ParsedThawAccountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The account to thaw. */\n account: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The mint freeze authority or its multisignature account. */\n owner: TAccountMetas[2];\n };\n data: ThawAccountInstructionData;\n};\n\nexport function parseThawAccountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedThawAccountInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n account: getNextAccount(),\n mint: getNextAccount(),\n owner: getNextAccount(),\n },\n data: getThawAccountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_DISCRIMINATOR = 3;\n\nexport function getTransferDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_DISCRIMINATOR);\n}\n\nexport type TransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n};\n\nexport type TransferInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n};\n\nexport function getTransferInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_DISCRIMINATOR })\n );\n}\n\nexport function getTransferInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ]);\n}\n\nexport function getTransferInstructionDataCodec(): FixedSizeCodec<\n TransferInstructionDataArgs,\n TransferInstructionData\n> {\n return combineCodec(\n getTransferInstructionDataEncoder(),\n getTransferInstructionDataDecoder()\n );\n}\n\nexport type TransferInput<\n TAccountSource extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferInstructionDataArgs['amount'];\n multiSigners?: Array;\n};\n\nexport function getTransferInstruction<\n TAccountSource extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: TransferInput,\n config?: { programAddress?: TProgramAddress }\n): TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferInstructionDataEncoder().encode(\n args as TransferInstructionDataArgs\n ),\n programAddress,\n } as TransferInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The destination account. */\n destination: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: TransferInstructionData;\n};\n\nexport function parseTransferInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_CHECKED_DISCRIMINATOR = 12;\n\nexport function getTransferCheckedDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_CHECKED_DISCRIMINATOR);\n}\n\nexport type TransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferCheckedInstructionData = {\n discriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport type TransferCheckedInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n};\n\nexport function getTransferCheckedInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: TRANSFER_CHECKED_DISCRIMINATOR })\n );\n}\n\nexport function getTransferCheckedInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ]);\n}\n\nexport function getTransferCheckedInstructionDataCodec(): FixedSizeCodec<\n TransferCheckedInstructionDataArgs,\n TransferCheckedInstructionData\n> {\n return combineCodec(\n getTransferCheckedInstructionDataEncoder(),\n getTransferCheckedInstructionDataDecoder()\n );\n}\n\nexport type TransferCheckedInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. */\n source: Address;\n /** The token mint. */\n mint: Address;\n /** The destination account. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferCheckedInstructionDataArgs['amount'];\n decimals: TransferCheckedInstructionDataArgs['decimals'];\n multiSigners?: Array;\n};\n\nexport function getTransferCheckedInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: TransferCheckedInput<\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferCheckedInstructionDataEncoder().encode(\n args as TransferCheckedInstructionDataArgs\n ),\n programAddress,\n } as TransferCheckedInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferCheckedInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. */\n source: TAccountMetas[0];\n /** The token mint. */\n mint: TAccountMetas[1];\n /** The destination account. */\n destination: TAccountMetas[2];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: TransferCheckedInstructionData;\n};\n\nexport function parseTransferCheckedInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferCheckedInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferCheckedInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const TRANSFER_CHECKED_WITH_FEE_DISCRIMINATOR = 26;\n\nexport function getTransferCheckedWithFeeDiscriminatorBytes() {\n return getU8Encoder().encode(TRANSFER_CHECKED_WITH_FEE_DISCRIMINATOR);\n}\n\nexport const TRANSFER_CHECKED_WITH_FEE_TRANSFER_FEE_DISCRIMINATOR = 1;\n\nexport function getTransferCheckedWithFeeTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n TRANSFER_CHECKED_WITH_FEE_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type TransferCheckedWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSource extends string | AccountMeta = string,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSource extends string\n ? WritableAccount\n : TAccountSource,\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type TransferCheckedWithFeeInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** The amount of tokens to transfer. */\n amount: bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /**\n * Expected fee assessed on this transfer, calculated off-chain based\n * on the transfer_fee_basis_points and maximum_fee of the mint. May\n * be 0 for a mint without a configured transfer fee.\n */\n fee: bigint;\n};\n\nexport type TransferCheckedWithFeeInstructionDataArgs = {\n /** The amount of tokens to transfer. */\n amount: number | bigint;\n /** Expected number of base 10 digits to the right of the decimal place. */\n decimals: number;\n /**\n * Expected fee assessed on this transfer, calculated off-chain based\n * on the transfer_fee_basis_points and maximum_fee of the mint. May\n * be 0 for a mint without a configured transfer fee.\n */\n fee: number | bigint;\n};\n\nexport function getTransferCheckedWithFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['fee', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: TRANSFER_CHECKED_WITH_FEE_DISCRIMINATOR,\n transferFeeDiscriminator:\n TRANSFER_CHECKED_WITH_FEE_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getTransferCheckedWithFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['amount', getU64Decoder()],\n ['decimals', getU8Decoder()],\n ['fee', getU64Decoder()],\n ]);\n}\n\nexport function getTransferCheckedWithFeeInstructionDataCodec(): FixedSizeCodec<\n TransferCheckedWithFeeInstructionDataArgs,\n TransferCheckedWithFeeInstructionData\n> {\n return combineCodec(\n getTransferCheckedWithFeeInstructionDataEncoder(),\n getTransferCheckedWithFeeInstructionDataDecoder()\n );\n}\n\nexport type TransferCheckedWithFeeInput<\n TAccountSource extends string = string,\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The source account. May include the `TransferFeeAmount` extension. */\n source: Address;\n /** The token mint. May include the `TransferFeeConfig` extension. */\n mint: Address;\n /** The destination account. May include the `TransferFeeAmount` extension. */\n destination: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n amount: TransferCheckedWithFeeInstructionDataArgs['amount'];\n decimals: TransferCheckedWithFeeInstructionDataArgs['decimals'];\n fee: TransferCheckedWithFeeInstructionDataArgs['fee'];\n multiSigners?: Array;\n};\n\nexport function getTransferCheckedWithFeeInstruction<\n TAccountSource extends string,\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: TransferCheckedWithFeeInput<\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): TransferCheckedWithFeeInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n source: { value: input.source ?? null, isWritable: true },\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.source),\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getTransferCheckedWithFeeInstructionDataEncoder().encode(\n args as TransferCheckedWithFeeInstructionDataArgs\n ),\n programAddress,\n } as TransferCheckedWithFeeInstruction<\n TProgramAddress,\n TAccountSource,\n TAccountMint,\n TAccountDestination,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedTransferCheckedWithFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The source account. May include the `TransferFeeAmount` extension. */\n source: TAccountMetas[0];\n /** The token mint. May include the `TransferFeeConfig` extension. */\n mint: TAccountMetas[1];\n /** The destination account. May include the `TransferFeeAmount` extension. */\n destination: TAccountMetas[2];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[3];\n };\n data: TransferCheckedWithFeeInstructionData;\n};\n\nexport function parseTransferCheckedWithFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedTransferCheckedWithFeeInstruction {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n source: getNextAccount(),\n mint: getNextAccount(),\n destination: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getTransferCheckedWithFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR = 24;\n\nexport function getUiAmountToAmountDiscriminatorBytes() {\n return getU8Encoder().encode(UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR);\n}\n\nexport type UiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UiAmountToAmountInstructionData = {\n discriminator: number;\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport type UiAmountToAmountInstructionDataArgs = {\n /** The ui_amount of tokens to reformat. */\n uiAmount: string;\n};\n\nexport function getUiAmountToAmountInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['uiAmount', getUtf8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: UI_AMOUNT_TO_AMOUNT_DISCRIMINATOR })\n );\n}\n\nexport function getUiAmountToAmountInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['uiAmount', getUtf8Decoder()],\n ]);\n}\n\nexport function getUiAmountToAmountInstructionDataCodec(): Codec<\n UiAmountToAmountInstructionDataArgs,\n UiAmountToAmountInstructionData\n> {\n return combineCodec(\n getUiAmountToAmountInstructionDataEncoder(),\n getUiAmountToAmountInstructionDataDecoder()\n );\n}\n\nexport type UiAmountToAmountInput = {\n /** The mint to calculate for. */\n mint: Address;\n uiAmount: UiAmountToAmountInstructionDataArgs['uiAmount'];\n};\n\nexport function getUiAmountToAmountInstruction<\n TAccountMint extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UiAmountToAmountInput,\n config?: { programAddress?: TProgramAddress }\n): UiAmountToAmountInstruction {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [getAccountMeta(accounts.mint)],\n data: getUiAmountToAmountInstructionDataEncoder().encode(\n args as UiAmountToAmountInstructionDataArgs\n ),\n programAddress,\n } as UiAmountToAmountInstruction);\n}\n\nexport type ParsedUiAmountToAmountInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to calculate for. */\n mint: TAccountMetas[0];\n };\n data: UiAmountToAmountInstructionData;\n};\n\nexport function parseUiAmountToAmountInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUiAmountToAmountInstruction {\n if (instruction.accounts.length < 1) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount() },\n data: getUiAmountToAmountInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR = 27;\n\nexport function getUpdateConfidentialTransferMintDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR);\n}\n\nexport const UPDATE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR = 1;\n\nexport function getUpdateConfidentialTransferMintConfidentialTransferDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR\n );\n}\n\nexport type UpdateConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateConfidentialTransferMintInstructionData = {\n discriminator: number;\n confidentialTransferDiscriminator: number;\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: Option
;\n};\n\nexport type UpdateConfidentialTransferMintInstructionDataArgs = {\n /**\n * Determines if newly configured accounts must be approved by the\n * `authority` before they may be used by the user.\n */\n autoApproveNewAccounts: boolean;\n /** New authority to decode any transfer amount in a confidential transfer. */\n auditorElgamalPubkey: OptionOrNullable
;\n};\n\nexport function getUpdateConfidentialTransferMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferDiscriminator', getU8Encoder()],\n ['autoApproveNewAccounts', getBooleanEncoder()],\n [\n 'auditorElgamalPubkey',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_CONFIDENTIAL_TRANSFER_MINT_DISCRIMINATOR,\n confidentialTransferDiscriminator:\n UPDATE_CONFIDENTIAL_TRANSFER_MINT_CONFIDENTIAL_TRANSFER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateConfidentialTransferMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferDiscriminator', getU8Decoder()],\n ['autoApproveNewAccounts', getBooleanDecoder()],\n [\n 'auditorElgamalPubkey',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateConfidentialTransferMintInstructionDataCodec(): FixedSizeCodec<\n UpdateConfidentialTransferMintInstructionDataArgs,\n UpdateConfidentialTransferMintInstructionData\n> {\n return combineCodec(\n getUpdateConfidentialTransferMintInstructionDataEncoder(),\n getUpdateConfidentialTransferMintInstructionDataDecoder()\n );\n}\n\nexport type UpdateConfidentialTransferMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The SPL Token mint. */\n mint: Address;\n /** Confidential transfer mint authority. */\n authority: TransactionSigner;\n autoApproveNewAccounts: UpdateConfidentialTransferMintInstructionDataArgs['autoApproveNewAccounts'];\n auditorElgamalPubkey: UpdateConfidentialTransferMintInstructionDataArgs['auditorElgamalPubkey'];\n};\n\nexport function getUpdateConfidentialTransferMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateConfidentialTransferMintInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ],\n data: getUpdateConfidentialTransferMintInstructionDataEncoder().encode(\n args as UpdateConfidentialTransferMintInstructionDataArgs\n ),\n programAddress,\n } as UpdateConfidentialTransferMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountAuthority\n >);\n}\n\nexport type ParsedUpdateConfidentialTransferMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The SPL Token mint. */\n mint: TAccountMetas[0];\n /** Confidential transfer mint authority. */\n authority: TAccountMetas[1];\n };\n data: UpdateConfidentialTransferMintInstructionData;\n};\n\nexport function parseUpdateConfidentialTransferMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateConfidentialTransferMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getUpdateConfidentialTransferMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getAccountStateDecoder,\n getAccountStateEncoder,\n type AccountState,\n type AccountStateArgs,\n} from '../types';\n\nexport const UPDATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 28;\n\nexport function getUpdateDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR);\n}\n\nexport const UPDATE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR = 1;\n\nexport function getUpdateDefaultAccountStateDefaultAccountStateDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR\n );\n}\n\nexport type UpdateDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountFreezeAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountFreezeAuthority extends string\n ? ReadonlyAccount\n : TAccountFreezeAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateDefaultAccountStateInstructionData = {\n discriminator: number;\n defaultAccountStateDiscriminator: number;\n /** The state each new token account should start with. */\n state: AccountState;\n};\n\nexport type UpdateDefaultAccountStateInstructionDataArgs = {\n /** The state each new token account should start with. */\n state: AccountStateArgs;\n};\n\nexport function getUpdateDefaultAccountStateInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['defaultAccountStateDiscriminator', getU8Encoder()],\n ['state', getAccountStateEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n defaultAccountStateDiscriminator:\n UPDATE_DEFAULT_ACCOUNT_STATE_DEFAULT_ACCOUNT_STATE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateDefaultAccountStateInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['defaultAccountStateDiscriminator', getU8Decoder()],\n ['state', getAccountStateDecoder()],\n ]);\n}\n\nexport function getUpdateDefaultAccountStateInstructionDataCodec(): FixedSizeCodec<\n UpdateDefaultAccountStateInstructionDataArgs,\n UpdateDefaultAccountStateInstructionData\n> {\n return combineCodec(\n getUpdateDefaultAccountStateInstructionDataEncoder(),\n getUpdateDefaultAccountStateInstructionDataDecoder()\n );\n}\n\nexport type UpdateDefaultAccountStateInput<\n TAccountMint extends string = string,\n TAccountFreezeAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The mint freeze authority or its multisignature account. */\n freezeAuthority:\n | Address\n | TransactionSigner;\n state: UpdateDefaultAccountStateInstructionDataArgs['state'];\n multiSigners?: Array;\n};\n\nexport function getUpdateDefaultAccountStateInstruction<\n TAccountMint extends string,\n TAccountFreezeAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateDefaultAccountStateInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateDefaultAccountStateInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['freezeAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountFreezeAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n freezeAuthority: {\n value: input.freezeAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.freezeAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateDefaultAccountStateInstructionDataEncoder().encode(\n args as UpdateDefaultAccountStateInstructionDataArgs\n ),\n programAddress,\n } as UpdateDefaultAccountStateInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['freezeAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountFreezeAuthority\n >);\n}\n\nexport type ParsedUpdateDefaultAccountStateInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The mint freeze authority or its multisignature account. */\n freezeAuthority: TAccountMetas[1];\n };\n data: UpdateDefaultAccountStateInstructionData;\n};\n\nexport function parseUpdateDefaultAccountStateInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateDefaultAccountStateInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), freezeAuthority: getNextAccount() },\n data: getUpdateDefaultAccountStateInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_GROUP_MEMBER_POINTER_DISCRIMINATOR = 41;\n\nexport function getUpdateGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_GROUP_MEMBER_POINTER_DISCRIMINATOR);\n}\n\nexport const UPDATE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR = 1;\n\nexport function getUpdateGroupMemberPointerGroupMemberPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR\n );\n}\n\nexport type UpdateGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountGroupMemberPointerAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountGroupMemberPointerAuthority extends string\n ? ReadonlyAccount\n : TAccountGroupMemberPointerAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateGroupMemberPointerInstructionData = {\n discriminator: number;\n groupMemberPointerDiscriminator: number;\n /** The new account address that holds the member. */\n memberAddress: Option
;\n};\n\nexport type UpdateGroupMemberPointerInstructionDataArgs = {\n /** The new account address that holds the member. */\n memberAddress: OptionOrNullable
;\n};\n\nexport function getUpdateGroupMemberPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupMemberPointerDiscriminator', getU8Encoder()],\n [\n 'memberAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n groupMemberPointerDiscriminator:\n UPDATE_GROUP_MEMBER_POINTER_GROUP_MEMBER_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateGroupMemberPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupMemberPointerDiscriminator', getU8Decoder()],\n [\n 'memberAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateGroupMemberPointerInstructionDataCodec(): FixedSizeCodec<\n UpdateGroupMemberPointerInstructionDataArgs,\n UpdateGroupMemberPointerInstructionData\n> {\n return combineCodec(\n getUpdateGroupMemberPointerInstructionDataEncoder(),\n getUpdateGroupMemberPointerInstructionDataDecoder()\n );\n}\n\nexport type UpdateGroupMemberPointerInput<\n TAccountMint extends string = string,\n TAccountGroupMemberPointerAuthority extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n /** The group member pointer authority or its multisignature account. */\n groupMemberPointerAuthority:\n | Address\n | TransactionSigner;\n memberAddress: UpdateGroupMemberPointerInstructionDataArgs['memberAddress'];\n multiSigners?: Array;\n};\n\nexport function getUpdateGroupMemberPointerInstruction<\n TAccountMint extends string,\n TAccountGroupMemberPointerAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateGroupMemberPointerInput<\n TAccountMint,\n TAccountGroupMemberPointerAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateGroupMemberPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupMemberPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupMemberPointerAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n groupMemberPointerAuthority: {\n value: input.groupMemberPointerAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.groupMemberPointerAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateGroupMemberPointerInstructionDataEncoder().encode(\n args as UpdateGroupMemberPointerInstructionDataArgs\n ),\n programAddress,\n } as UpdateGroupMemberPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupMemberPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupMemberPointerAuthority\n >);\n}\n\nexport type ParsedUpdateGroupMemberPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n /** The group member pointer authority or its multisignature account. */\n groupMemberPointerAuthority: TAccountMetas[1];\n };\n data: UpdateGroupMemberPointerInstructionData;\n};\n\nexport function parseUpdateGroupMemberPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateGroupMemberPointerInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n groupMemberPointerAuthority: getNextAccount(),\n },\n data: getUpdateGroupMemberPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_GROUP_POINTER_DISCRIMINATOR = 40;\n\nexport function getUpdateGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_GROUP_POINTER_DISCRIMINATOR);\n}\n\nexport const UPDATE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR = 1;\n\nexport function getUpdateGroupPointerGroupPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR\n );\n}\n\nexport type UpdateGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountGroupPointerAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountGroupPointerAuthority extends string\n ? ReadonlyAccount\n : TAccountGroupPointerAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateGroupPointerInstructionData = {\n discriminator: number;\n groupPointerDiscriminator: number;\n /** The new account address that holds the group configurations. */\n groupAddress: Option
;\n};\n\nexport type UpdateGroupPointerInstructionDataArgs = {\n /** The new account address that holds the group configurations. */\n groupAddress: OptionOrNullable
;\n};\n\nexport function getUpdateGroupPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['groupPointerDiscriminator', getU8Encoder()],\n [\n 'groupAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_GROUP_POINTER_DISCRIMINATOR,\n groupPointerDiscriminator:\n UPDATE_GROUP_POINTER_GROUP_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateGroupPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['groupPointerDiscriminator', getU8Decoder()],\n [\n 'groupAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateGroupPointerInstructionDataCodec(): FixedSizeCodec<\n UpdateGroupPointerInstructionDataArgs,\n UpdateGroupPointerInstructionData\n> {\n return combineCodec(\n getUpdateGroupPointerInstructionDataEncoder(),\n getUpdateGroupPointerInstructionDataDecoder()\n );\n}\n\nexport type UpdateGroupPointerInput<\n TAccountMint extends string = string,\n TAccountGroupPointerAuthority extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n /** The group pointer authority or its multisignature account. */\n groupPointerAuthority:\n | Address\n | TransactionSigner;\n groupAddress: UpdateGroupPointerInstructionDataArgs['groupAddress'];\n multiSigners?: Array;\n};\n\nexport function getUpdateGroupPointerInstruction<\n TAccountMint extends string,\n TAccountGroupPointerAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateGroupPointerInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateGroupPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupPointerAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n groupPointerAuthority: {\n value: input.groupPointerAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.groupPointerAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateGroupPointerInstructionDataEncoder().encode(\n args as UpdateGroupPointerInstructionDataArgs\n ),\n programAddress,\n } as UpdateGroupPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['groupPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountGroupPointerAuthority\n >);\n}\n\nexport type ParsedUpdateGroupPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n /** The group pointer authority or its multisignature account. */\n groupPointerAuthority: TAccountMetas[1];\n };\n data: UpdateGroupPointerInstructionData;\n};\n\nexport function parseUpdateGroupPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateGroupPointerInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n groupPointerAuthority: getNextAccount(),\n },\n data: getUpdateGroupPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_METADATA_POINTER_DISCRIMINATOR = 39;\n\nexport function getUpdateMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_METADATA_POINTER_DISCRIMINATOR);\n}\n\nexport const UPDATE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR = 1;\n\nexport function getUpdateMetadataPointerMetadataPointerDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR\n );\n}\n\nexport type UpdateMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountMetadataPointerAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountMetadataPointerAuthority extends string\n ? ReadonlyAccount\n : TAccountMetadataPointerAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateMetadataPointerInstructionData = {\n discriminator: number;\n metadataPointerDiscriminator: number;\n /** The new account address that holds the metadata. */\n metadataAddress: Option
;\n};\n\nexport type UpdateMetadataPointerInstructionDataArgs = {\n /** The new account address that holds the metadata. */\n metadataAddress: OptionOrNullable
;\n};\n\nexport function getUpdateMetadataPointerInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['metadataPointerDiscriminator', getU8Encoder()],\n [\n 'metadataAddress',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_METADATA_POINTER_DISCRIMINATOR,\n metadataPointerDiscriminator:\n UPDATE_METADATA_POINTER_METADATA_POINTER_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateMetadataPointerInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['metadataPointerDiscriminator', getU8Decoder()],\n [\n 'metadataAddress',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateMetadataPointerInstructionDataCodec(): FixedSizeCodec<\n UpdateMetadataPointerInstructionDataArgs,\n UpdateMetadataPointerInstructionData\n> {\n return combineCodec(\n getUpdateMetadataPointerInstructionDataEncoder(),\n getUpdateMetadataPointerInstructionDataDecoder()\n );\n}\n\nexport type UpdateMetadataPointerInput<\n TAccountMint extends string = string,\n TAccountMetadataPointerAuthority extends string = string,\n> = {\n /** The mint to initialize. */\n mint: Address;\n /** The metadata pointer authority or its multisignature account. */\n metadataPointerAuthority:\n | Address\n | TransactionSigner;\n metadataAddress: UpdateMetadataPointerInstructionDataArgs['metadataAddress'];\n multiSigners?: Array;\n};\n\nexport function getUpdateMetadataPointerInstruction<\n TAccountMint extends string,\n TAccountMetadataPointerAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateMetadataPointerInput<\n TAccountMint,\n TAccountMetadataPointerAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateMetadataPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['metadataPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMetadataPointerAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n metadataPointerAuthority: {\n value: input.metadataPointerAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.metadataPointerAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateMetadataPointerInstructionDataEncoder().encode(\n args as UpdateMetadataPointerInstructionDataArgs\n ),\n programAddress,\n } as UpdateMetadataPointerInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['metadataPointerAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountMetadataPointerAuthority\n >);\n}\n\nexport type ParsedUpdateMetadataPointerInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint to initialize. */\n mint: TAccountMetas[0];\n /** The metadata pointer authority or its multisignature account. */\n metadataPointerAuthority: TAccountMetas[1];\n };\n data: UpdateMetadataPointerInstructionData;\n};\n\nexport function parseUpdateMetadataPointerInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateMetadataPointerInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n metadataPointerAuthority: getNextAccount(),\n },\n data: getUpdateMetadataPointerInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getF64Decoder,\n getF64Encoder,\n getI64Decoder,\n getI64Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_MULTIPLIER_SCALED_UI_MINT_DISCRIMINATOR = 43;\n\nexport function getUpdateMultiplierScaledUiMintDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_MULTIPLIER_SCALED_UI_MINT_DISCRIMINATOR);\n}\n\nexport const UPDATE_MULTIPLIER_SCALED_UI_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR = 1;\n\nexport function getUpdateMultiplierScaledUiMintScaledUiAmountMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_MULTIPLIER_SCALED_UI_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR\n );\n}\n\nexport type UpdateMultiplierScaledUiMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? WritableAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateMultiplierScaledUiMintInstructionData = {\n discriminator: number;\n scaledUiAmountMintDiscriminator: number;\n /** The new multiplier for the scaled UI extension */\n multiplier: number;\n /** The timestamp at which the new multiplier will take effect */\n effectiveTimestamp: bigint;\n};\n\nexport type UpdateMultiplierScaledUiMintInstructionDataArgs = {\n /** The new multiplier for the scaled UI extension */\n multiplier: number;\n /** The timestamp at which the new multiplier will take effect */\n effectiveTimestamp: number | bigint;\n};\n\nexport function getUpdateMultiplierScaledUiMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['scaledUiAmountMintDiscriminator', getU8Encoder()],\n ['multiplier', getF64Encoder()],\n ['effectiveTimestamp', getI64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_MULTIPLIER_SCALED_UI_MINT_DISCRIMINATOR,\n scaledUiAmountMintDiscriminator:\n UPDATE_MULTIPLIER_SCALED_UI_MINT_SCALED_UI_AMOUNT_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateMultiplierScaledUiMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['scaledUiAmountMintDiscriminator', getU8Decoder()],\n ['multiplier', getF64Decoder()],\n ['effectiveTimestamp', getI64Decoder()],\n ]);\n}\n\nexport function getUpdateMultiplierScaledUiMintInstructionDataCodec(): FixedSizeCodec<\n UpdateMultiplierScaledUiMintInstructionDataArgs,\n UpdateMultiplierScaledUiMintInstructionData\n> {\n return combineCodec(\n getUpdateMultiplierScaledUiMintInstructionDataEncoder(),\n getUpdateMultiplierScaledUiMintInstructionDataDecoder()\n );\n}\n\nexport type UpdateMultiplierScaledUiMintInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The multiplier authority. */\n authority: Address | TransactionSigner;\n multiplier: UpdateMultiplierScaledUiMintInstructionDataArgs['multiplier'];\n effectiveTimestamp: UpdateMultiplierScaledUiMintInstructionDataArgs['effectiveTimestamp'];\n multiSigners?: Array;\n};\n\nexport function getUpdateMultiplierScaledUiMintInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateMultiplierScaledUiMintInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateMultiplierScaledUiMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getUpdateMultiplierScaledUiMintInstructionDataEncoder().encode(\n args as UpdateMultiplierScaledUiMintInstructionDataArgs\n ),\n programAddress,\n } as UpdateMultiplierScaledUiMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedUpdateMultiplierScaledUiMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The multiplier authority. */\n authority: TAccountMetas[1];\n };\n data: UpdateMultiplierScaledUiMintInstructionData;\n};\n\nexport function parseUpdateMultiplierScaledUiMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateMultiplierScaledUiMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getUpdateMultiplierScaledUiMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI16Decoder,\n getI16Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_RATE_INTEREST_BEARING_MINT_DISCRIMINATOR = 33;\n\nexport function getUpdateRateInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_RATE_INTEREST_BEARING_MINT_DISCRIMINATOR);\n}\n\nexport const UPDATE_RATE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR = 1;\n\nexport function getUpdateRateInterestBearingMintInterestBearingMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_RATE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR\n );\n}\n\nexport type UpdateRateInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountRateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountRateAuthority extends string\n ? WritableAccount\n : TAccountRateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateRateInterestBearingMintInstructionData = {\n discriminator: number;\n interestBearingMintDiscriminator: number;\n /** The interest rate to update. */\n rate: number;\n};\n\nexport type UpdateRateInterestBearingMintInstructionDataArgs = {\n /** The interest rate to update. */\n rate: number;\n};\n\nexport function getUpdateRateInterestBearingMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['interestBearingMintDiscriminator', getU8Encoder()],\n ['rate', getI16Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_RATE_INTEREST_BEARING_MINT_DISCRIMINATOR,\n interestBearingMintDiscriminator:\n UPDATE_RATE_INTEREST_BEARING_MINT_INTEREST_BEARING_MINT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateRateInterestBearingMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['interestBearingMintDiscriminator', getU8Decoder()],\n ['rate', getI16Decoder()],\n ]);\n}\n\nexport function getUpdateRateInterestBearingMintInstructionDataCodec(): FixedSizeCodec<\n UpdateRateInterestBearingMintInstructionDataArgs,\n UpdateRateInterestBearingMintInstructionData\n> {\n return combineCodec(\n getUpdateRateInterestBearingMintInstructionDataEncoder(),\n getUpdateRateInterestBearingMintInstructionDataDecoder()\n );\n}\n\nexport type UpdateRateInterestBearingMintInput<\n TAccountMint extends string = string,\n TAccountRateAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The mint rate authority. */\n rateAuthority:\n | Address\n | TransactionSigner;\n rate: UpdateRateInterestBearingMintInstructionDataArgs['rate'];\n multiSigners?: Array;\n};\n\nexport function getUpdateRateInterestBearingMintInstruction<\n TAccountMint extends string,\n TAccountRateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateRateInterestBearingMintInput<\n TAccountMint,\n TAccountRateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateRateInterestBearingMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['rateAuthority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountRateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n rateAuthority: { value: input.rateAuthority ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.rateAuthority),\n ...remainingAccounts,\n ],\n data: getUpdateRateInterestBearingMintInstructionDataEncoder().encode(\n args as UpdateRateInterestBearingMintInstructionDataArgs\n ),\n programAddress,\n } as UpdateRateInterestBearingMintInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['rateAuthority'] extends TransactionSigner\n ? WritableSignerAccount &\n AccountSignerMeta\n : TAccountRateAuthority\n >);\n}\n\nexport type ParsedUpdateRateInterestBearingMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The mint rate authority. */\n rateAuthority: TAccountMetas[1];\n };\n data: UpdateRateInterestBearingMintInstructionData;\n};\n\nexport function parseUpdateRateInterestBearingMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateRateInterestBearingMintInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), rateAuthority: getNextAccount() },\n data: getUpdateRateInterestBearingMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR = new Uint8Array([\n 108, 37, 171, 143, 248, 30, 18, 110,\n]);\n\nexport function getUpdateTokenGroupMaxSizeDiscriminatorBytes() {\n return getBytesEncoder().encode(UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR);\n}\n\nexport type UpdateTokenGroupMaxSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountGroup extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenGroupMaxSizeInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** New max size for the group */\n maxSize: bigint;\n};\n\nexport type UpdateTokenGroupMaxSizeInstructionDataArgs = {\n /** New max size for the group */\n maxSize: number | bigint;\n};\n\nexport function getUpdateTokenGroupMaxSizeInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['maxSize', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_GROUP_MAX_SIZE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenGroupMaxSizeInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['maxSize', getU64Decoder()],\n ]);\n}\n\nexport function getUpdateTokenGroupMaxSizeInstructionDataCodec(): Codec<\n UpdateTokenGroupMaxSizeInstructionDataArgs,\n UpdateTokenGroupMaxSizeInstructionData\n> {\n return combineCodec(\n getUpdateTokenGroupMaxSizeInstructionDataEncoder(),\n getUpdateTokenGroupMaxSizeInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenGroupMaxSizeInput<\n TAccountGroup extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n group: Address;\n updateAuthority: TransactionSigner;\n maxSize: UpdateTokenGroupMaxSizeInstructionDataArgs['maxSize'];\n};\n\nexport function getUpdateTokenGroupMaxSizeInstruction<\n TAccountGroup extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenGroupMaxSizeInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenGroupMaxSizeInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n group: { value: input.group ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenGroupMaxSizeInstructionDataEncoder().encode(\n args as UpdateTokenGroupMaxSizeInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenGroupMaxSizeInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenGroupMaxSizeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n group: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenGroupMaxSizeInstructionData;\n};\n\nexport function parseUpdateTokenGroupMaxSizeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenGroupMaxSizeInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { group: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenGroupMaxSizeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR = new Uint8Array(\n [161, 105, 88, 1, 237, 221, 216, 203]\n);\n\nexport function getUpdateTokenGroupUpdateAuthorityDiscriminatorBytes() {\n return getBytesEncoder().encode(\n UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR\n );\n}\n\nexport type UpdateTokenGroupUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountGroup extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountGroup extends string\n ? WritableAccount\n : TAccountGroup,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenGroupUpdateAuthorityInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** New authority for the group, or unset if `None` */\n newUpdateAuthority: Option
;\n};\n\nexport type UpdateTokenGroupUpdateAuthorityInstructionDataArgs = {\n /** New authority for the group, or unset if `None` */\n newUpdateAuthority: OptionOrNullable
;\n};\n\nexport function getUpdateTokenGroupUpdateAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n [\n 'newUpdateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_GROUP_UPDATE_AUTHORITY_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenGroupUpdateAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n [\n 'newUpdateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateTokenGroupUpdateAuthorityInstructionDataCodec(): Codec<\n UpdateTokenGroupUpdateAuthorityInstructionDataArgs,\n UpdateTokenGroupUpdateAuthorityInstructionData\n> {\n return combineCodec(\n getUpdateTokenGroupUpdateAuthorityInstructionDataEncoder(),\n getUpdateTokenGroupUpdateAuthorityInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenGroupUpdateAuthorityInput<\n TAccountGroup extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n group: Address;\n /** Current update authority */\n updateAuthority: TransactionSigner;\n newUpdateAuthority: UpdateTokenGroupUpdateAuthorityInstructionDataArgs['newUpdateAuthority'];\n};\n\nexport function getUpdateTokenGroupUpdateAuthorityInstruction<\n TAccountGroup extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenGroupUpdateAuthorityInput<\n TAccountGroup,\n TAccountUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenGroupUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n group: { value: input.group ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.group),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenGroupUpdateAuthorityInstructionDataEncoder().encode(\n args as UpdateTokenGroupUpdateAuthorityInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenGroupUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountGroup,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenGroupUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n group: TAccountMetas[0];\n /** Current update authority */\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenGroupUpdateAuthorityInstructionData;\n};\n\nexport function parseUpdateTokenGroupUpdateAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenGroupUpdateAuthorityInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { group: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenGroupUpdateAuthorityInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getTokenMetadataFieldDecoder,\n getTokenMetadataFieldEncoder,\n type TokenMetadataField,\n type TokenMetadataFieldArgs,\n} from '../types';\n\nexport const UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR = new Uint8Array([\n 221, 233, 49, 45, 181, 202, 220, 200,\n]);\n\nexport function getUpdateTokenMetadataFieldDiscriminatorBytes() {\n return getBytesEncoder().encode(UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR);\n}\n\nexport type UpdateTokenMetadataFieldInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenMetadataFieldInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Field to update in the metadata. */\n field: TokenMetadataField;\n /** Value to write for the field. */\n value: string;\n};\n\nexport type UpdateTokenMetadataFieldInstructionDataArgs = {\n /** Field to update in the metadata. */\n field: TokenMetadataFieldArgs;\n /** Value to write for the field. */\n value: string;\n};\n\nexport function getUpdateTokenMetadataFieldInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n ['field', getTokenMetadataFieldEncoder()],\n ['value', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_METADATA_FIELD_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenMetadataFieldInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n ['field', getTokenMetadataFieldDecoder()],\n ['value', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getUpdateTokenMetadataFieldInstructionDataCodec(): Codec<\n UpdateTokenMetadataFieldInstructionDataArgs,\n UpdateTokenMetadataFieldInstructionData\n> {\n return combineCodec(\n getUpdateTokenMetadataFieldInstructionDataEncoder(),\n getUpdateTokenMetadataFieldInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenMetadataFieldInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: TransactionSigner;\n field: UpdateTokenMetadataFieldInstructionDataArgs['field'];\n value: UpdateTokenMetadataFieldInstructionDataArgs['value'];\n};\n\nexport function getUpdateTokenMetadataFieldInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenMetadataFieldInput<\n TAccountMetadata,\n TAccountUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenMetadataFieldInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenMetadataFieldInstructionDataEncoder().encode(\n args as UpdateTokenMetadataFieldInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenMetadataFieldInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenMetadataFieldInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenMetadataFieldInstructionData;\n};\n\nexport function parseUpdateTokenMetadataFieldInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenMetadataFieldInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenMetadataFieldInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR =\n new Uint8Array([215, 228, 166, 228, 84, 100, 86, 123]);\n\nexport function getUpdateTokenMetadataUpdateAuthorityDiscriminatorBytes() {\n return getBytesEncoder().encode(\n UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR\n );\n}\n\nexport type UpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetadata extends string | AccountMeta = string,\n TAccountUpdateAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMetadata extends string\n ? WritableAccount\n : TAccountMetadata,\n TAccountUpdateAuthority extends string\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountUpdateAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTokenMetadataUpdateAuthorityInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** New authority for the token metadata, or unset if `None` */\n newUpdateAuthority: Option
;\n};\n\nexport type UpdateTokenMetadataUpdateAuthorityInstructionDataArgs = {\n /** New authority for the token metadata, or unset if `None` */\n newUpdateAuthority: OptionOrNullable
;\n};\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstructionDataEncoder(): Encoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getBytesEncoder()],\n [\n 'newUpdateAuthority',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TOKEN_METADATA_UPDATE_AUTHORITY_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstructionDataDecoder(): Decoder {\n return getStructDecoder([\n ['discriminator', getBytesDecoder()],\n [\n 'newUpdateAuthority',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstructionDataCodec(): Codec<\n UpdateTokenMetadataUpdateAuthorityInstructionDataArgs,\n UpdateTokenMetadataUpdateAuthorityInstructionData\n> {\n return combineCodec(\n getUpdateTokenMetadataUpdateAuthorityInstructionDataEncoder(),\n getUpdateTokenMetadataUpdateAuthorityInstructionDataDecoder()\n );\n}\n\nexport type UpdateTokenMetadataUpdateAuthorityInput<\n TAccountMetadata extends string = string,\n TAccountUpdateAuthority extends string = string,\n> = {\n metadata: Address;\n updateAuthority: TransactionSigner;\n newUpdateAuthority: UpdateTokenMetadataUpdateAuthorityInstructionDataArgs['newUpdateAuthority'];\n};\n\nexport function getUpdateTokenMetadataUpdateAuthorityInstruction<\n TAccountMetadata extends string,\n TAccountUpdateAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTokenMetadataUpdateAuthorityInput<\n TAccountMetadata,\n TAccountUpdateAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): UpdateTokenMetadataUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n metadata: { value: input.metadata ?? null, isWritable: true },\n updateAuthority: {\n value: input.updateAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.metadata),\n getAccountMeta(accounts.updateAuthority),\n ],\n data: getUpdateTokenMetadataUpdateAuthorityInstructionDataEncoder().encode(\n args as UpdateTokenMetadataUpdateAuthorityInstructionDataArgs\n ),\n programAddress,\n } as UpdateTokenMetadataUpdateAuthorityInstruction<\n TProgramAddress,\n TAccountMetadata,\n TAccountUpdateAuthority\n >);\n}\n\nexport type ParsedUpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n metadata: TAccountMetas[0];\n updateAuthority: TAccountMetas[1];\n };\n data: UpdateTokenMetadataUpdateAuthorityInstructionData;\n};\n\nexport function parseUpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTokenMetadataUpdateAuthorityInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { metadata: getNextAccount(), updateAuthority: getNextAccount() },\n data: getUpdateTokenMetadataUpdateAuthorityInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const UPDATE_TRANSFER_HOOK_DISCRIMINATOR = 36;\n\nexport function getUpdateTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(UPDATE_TRANSFER_HOOK_DISCRIMINATOR);\n}\n\nexport const UPDATE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR = 1;\n\nexport function getUpdateTransferHookTransferHookDiscriminatorBytes() {\n return getU8Encoder().encode(\n UPDATE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR\n );\n}\n\nexport type UpdateTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateTransferHookInstructionData = {\n discriminator: number;\n transferHookDiscriminator: number;\n /** The program id that performs logic during transfers */\n programId: Option
;\n};\n\nexport type UpdateTransferHookInstructionDataArgs = {\n /** The program id that performs logic during transfers */\n programId: OptionOrNullable
;\n};\n\nexport function getUpdateTransferHookInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferHookDiscriminator', getU8Encoder()],\n [\n 'programId',\n getOptionEncoder(getAddressEncoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_TRANSFER_HOOK_DISCRIMINATOR,\n transferHookDiscriminator:\n UPDATE_TRANSFER_HOOK_TRANSFER_HOOK_DISCRIMINATOR,\n })\n );\n}\n\nexport function getUpdateTransferHookInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferHookDiscriminator', getU8Decoder()],\n [\n 'programId',\n getOptionDecoder(getAddressDecoder(), {\n prefix: null,\n noneValue: 'zeroes',\n }),\n ],\n ]);\n}\n\nexport function getUpdateTransferHookInstructionDataCodec(): FixedSizeCodec<\n UpdateTransferHookInstructionDataArgs,\n UpdateTransferHookInstructionData\n> {\n return combineCodec(\n getUpdateTransferHookInstructionDataEncoder(),\n getUpdateTransferHookInstructionDataDecoder()\n );\n}\n\nexport type UpdateTransferHookInput<\n TAccountMint extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The mint. */\n mint: Address;\n /** The transfer hook authority. */\n authority: Address | TransactionSigner;\n programId: UpdateTransferHookInstructionDataArgs['programId'];\n multiSigners?: Array;\n};\n\nexport function getUpdateTransferHookInstruction<\n TAccountMint extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: UpdateTransferHookInput,\n config?: { programAddress?: TProgramAddress }\n): UpdateTransferHookInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getUpdateTransferHookInstructionDataEncoder().encode(\n args as UpdateTransferHookInstructionDataArgs\n ),\n programAddress,\n } as UpdateTransferHookInstruction<\n TProgramAddress,\n TAccountMint,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedUpdateTransferHookInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The mint. */\n mint: TAccountMetas[0];\n /** The transfer hook authority. */\n authority: TAccountMetas[1];\n };\n data: UpdateTransferHookInstructionData;\n};\n\nexport function parseUpdateTransferHookInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedUpdateTransferHookInstruction {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { mint: getNextAccount(), authority: getNextAccount() },\n data: getUpdateTransferHookInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const WITHDRAW_EXCESS_LAMPORTS_DISCRIMINATOR = 38;\n\nexport function getWithdrawExcessLamportsDiscriminatorBytes() {\n return getU8Encoder().encode(WITHDRAW_EXCESS_LAMPORTS_DISCRIMINATOR);\n}\n\nexport type WithdrawExcessLamportsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountSourceAccount extends string | AccountMeta = string,\n TAccountDestinationAccount extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountSourceAccount extends string\n ? WritableAccount\n : TAccountSourceAccount,\n TAccountDestinationAccount extends string\n ? WritableAccount\n : TAccountDestinationAccount,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawExcessLamportsInstructionData = { discriminator: number };\n\nexport type WithdrawExcessLamportsInstructionDataArgs = {};\n\nexport function getWithdrawExcessLamportsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([['discriminator', getU8Encoder()]]),\n (value) => ({\n ...value,\n discriminator: WITHDRAW_EXCESS_LAMPORTS_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawExcessLamportsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([['discriminator', getU8Decoder()]]);\n}\n\nexport function getWithdrawExcessLamportsInstructionDataCodec(): FixedSizeCodec<\n WithdrawExcessLamportsInstructionDataArgs,\n WithdrawExcessLamportsInstructionData\n> {\n return combineCodec(\n getWithdrawExcessLamportsInstructionDataEncoder(),\n getWithdrawExcessLamportsInstructionDataDecoder()\n );\n}\n\nexport type WithdrawExcessLamportsInput<\n TAccountSourceAccount extends string = string,\n TAccountDestinationAccount extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** Account holding excess lamports. */\n sourceAccount: Address;\n /** Destination account for withdrawn lamports. */\n destinationAccount: Address;\n /** The source account's owner/delegate or its multisignature account. */\n authority: Address | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getWithdrawExcessLamportsInstruction<\n TAccountSourceAccount extends string,\n TAccountDestinationAccount extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawExcessLamportsInput<\n TAccountSourceAccount,\n TAccountDestinationAccount,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawExcessLamportsInstruction<\n TProgramAddress,\n TAccountSourceAccount,\n TAccountDestinationAccount,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n sourceAccount: { value: input.sourceAccount ?? null, isWritable: true },\n destinationAccount: {\n value: input.destinationAccount ?? null,\n isWritable: true,\n },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.sourceAccount),\n getAccountMeta(accounts.destinationAccount),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getWithdrawExcessLamportsInstructionDataEncoder().encode({}),\n programAddress,\n } as WithdrawExcessLamportsInstruction<\n TProgramAddress,\n TAccountSourceAccount,\n TAccountDestinationAccount,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedWithdrawExcessLamportsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** Account holding excess lamports. */\n sourceAccount: TAccountMetas[0];\n /** Destination account for withdrawn lamports. */\n destinationAccount: TAccountMetas[1];\n /** The source account's owner/delegate or its multisignature account. */\n authority: TAccountMetas[2];\n };\n data: WithdrawExcessLamportsInstructionData;\n};\n\nexport function parseWithdrawExcessLamportsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawExcessLamportsInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n sourceAccount: getNextAccount(),\n destinationAccount: getNextAccount(),\n authority: getNextAccount(),\n },\n data: getWithdrawExcessLamportsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_DISCRIMINATOR = 26;\n\nexport function getWithdrawWithheldTokensFromAccountsDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_TRANSFER_FEE_DISCRIMINATOR = 3;\n\nexport function getWithdrawWithheldTokensFromAccountsTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountFeeReceiver extends string | AccountMeta = string,\n TAccountWithdrawWithheldAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountFeeReceiver extends string\n ? WritableAccount\n : TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority extends string\n ? ReadonlyAccount\n : TAccountWithdrawWithheldAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromAccountsInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n /** Number of token accounts harvested. */\n numTokenAccounts: number;\n};\n\nexport type WithdrawWithheldTokensFromAccountsInstructionDataArgs = {\n /** Number of token accounts harvested. */\n numTokenAccounts: number;\n};\n\nexport function getWithdrawWithheldTokensFromAccountsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ['numTokenAccounts', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_DISCRIMINATOR,\n transferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromAccountsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ['numTokenAccounts', getU8Decoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromAccountsInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromAccountsInstructionDataArgs,\n WithdrawWithheldTokensFromAccountsInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromAccountsInstructionDataEncoder(),\n getWithdrawWithheldTokensFromAccountsInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsInput<\n TAccountMint extends string = string,\n TAccountFeeReceiver extends string = string,\n TAccountWithdrawWithheldAuthority extends string = string,\n> = {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: Address;\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: Address;\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority:\n | Address\n | TransactionSigner;\n numTokenAccounts: WithdrawWithheldTokensFromAccountsInstructionDataArgs['numTokenAccounts'];\n multiSigners?: Array;\n sources: Array
;\n};\n\nexport function getWithdrawWithheldTokensFromAccountsInstruction<\n TAccountMint extends string,\n TAccountFeeReceiver extends string,\n TAccountWithdrawWithheldAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromAccountsInput<\n TAccountMint,\n TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromAccountsInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n feeReceiver: { value: input.feeReceiver ?? null, isWritable: true },\n withdrawWithheldAuthority: {\n value: input.withdrawWithheldAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = [\n ...(args.multiSigners ?? []).map((signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })),\n ...args.sources.map((address) => ({ address, role: AccountRole.WRITABLE })),\n ];\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.feeReceiver),\n getAccountMeta(accounts.withdrawWithheldAuthority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromAccountsInstructionDataEncoder().encode(\n args as WithdrawWithheldTokensFromAccountsInstructionDataArgs\n ),\n programAddress,\n } as WithdrawWithheldTokensFromAccountsInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromAccountsInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: TAccountMetas[0];\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: TAccountMetas[1];\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority: TAccountMetas[2];\n };\n data: WithdrawWithheldTokensFromAccountsInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromAccountsInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromAccountsInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n feeReceiver: getNextAccount(),\n withdrawWithheldAuthority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromAccountsInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 2;\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = string,\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? ReadonlyAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionData =\n {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n /** Number of token accounts harvested */\n numTokenAccounts: number;\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalance;\n };\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs =\n {\n /** Number of token accounts harvested */\n numTokenAccounts: number;\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n };\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ['numTokenAccounts', getU8Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_ACCOUNTS_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ['numTokenAccounts', getU8Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs,\n WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataEncoder(),\n getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The fee receiver account. */\n destination: Address;\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: Address;\n /** Optional record account */\n record?: Address;\n /** The mint's withdraw_withheld_authority */\n authority: Address | TransactionSigner;\n numTokenAccounts: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs['numTokenAccounts'];\n proofInstructionOffset: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs['proofInstructionOffset'];\n newDecryptableAvailableBalance: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs['newDecryptableAvailableBalance'];\n multiSigners?: Array;\n};\n\nexport function getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInput<\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: false },\n destination: { value: input.destination ?? null, isWritable: true },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataEncoder().encode(\n args as WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The fee receiver account. */\n destination: TAccountMetas[1];\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: TAccountMetas[2];\n /** Optional record account */\n record?: TAccountMetas[3] | undefined;\n /** The mint's withdraw_withheld_authority */\n authority: TAccountMetas[4];\n };\n data: WithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n destination: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromAccountsForConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_DISCRIMINATOR = 26;\n\nexport function getWithdrawWithheldTokensFromMintDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_TRANSFER_FEE_DISCRIMINATOR = 2;\n\nexport function getWithdrawWithheldTokensFromMintTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountFeeReceiver extends string | AccountMeta = string,\n TAccountWithdrawWithheldAuthority extends\n | string\n | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountFeeReceiver extends string\n ? WritableAccount\n : TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority extends string\n ? ReadonlyAccount\n : TAccountWithdrawWithheldAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromMintInstructionData = {\n discriminator: number;\n transferFeeDiscriminator: number;\n};\n\nexport type WithdrawWithheldTokensFromMintInstructionDataArgs = {};\n\nexport function getWithdrawWithheldTokensFromMintInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['transferFeeDiscriminator', getU8Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: WITHDRAW_WITHHELD_TOKENS_FROM_MINT_DISCRIMINATOR,\n transferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromMintInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['transferFeeDiscriminator', getU8Decoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromMintInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromMintInstructionDataArgs,\n WithdrawWithheldTokensFromMintInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromMintInstructionDataEncoder(),\n getWithdrawWithheldTokensFromMintInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromMintInput<\n TAccountMint extends string = string,\n TAccountFeeReceiver extends string = string,\n TAccountWithdrawWithheldAuthority extends string = string,\n> = {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: Address;\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: Address;\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority:\n | Address\n | TransactionSigner;\n multiSigners?: Array;\n};\n\nexport function getWithdrawWithheldTokensFromMintInstruction<\n TAccountMint extends string,\n TAccountFeeReceiver extends string,\n TAccountWithdrawWithheldAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromMintInput<\n TAccountMint,\n TAccountFeeReceiver,\n TAccountWithdrawWithheldAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n feeReceiver: { value: input.feeReceiver ?? null, isWritable: true },\n withdrawWithheldAuthority: {\n value: input.withdrawWithheldAuthority ?? null,\n isWritable: false,\n },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.feeReceiver),\n getAccountMeta(accounts.withdrawWithheldAuthority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromMintInstructionDataEncoder().encode({}),\n programAddress,\n } as WithdrawWithheldTokensFromMintInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountFeeReceiver,\n (typeof input)['withdrawWithheldAuthority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountWithdrawWithheldAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromMintInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. Must include the `TransferFeeConfig` extension. */\n mint: TAccountMetas[0];\n /**\n * The fee receiver account. Must include the `TransferFeeAmount`\n * extension associated with the provided mint.\n */\n feeReceiver: TAccountMetas[1];\n /** The mint's `withdraw_withheld_authority` or its multisignature account. */\n withdrawWithheldAuthority: TAccountMetas[2];\n };\n data: WithdrawWithheldTokensFromMintInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromMintInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromMintInstruction {\n if (instruction.accounts.length < 3) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n feeReceiver: getNextAccount(),\n withdrawWithheldAuthority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromMintInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n combineCodec,\n getI8Decoder,\n getI8Encoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from '@solana/kit';\nimport { TOKEN_2022_PROGRAM_ADDRESS } from '../programs';\nimport { getAccountMetaFactory, type ResolvedAccount } from '../shared';\nimport {\n getDecryptableBalanceDecoder,\n getDecryptableBalanceEncoder,\n type DecryptableBalance,\n type DecryptableBalanceArgs,\n} from '../types';\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 37;\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport const WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR = 1;\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeConfidentialTransferFeeDiscriminatorBytes() {\n return getU8Encoder().encode(\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR\n );\n}\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMint extends string | AccountMeta = string,\n TAccountDestination extends string | AccountMeta = string,\n TAccountInstructionsSysvarOrContextState extends\n | string\n | AccountMeta = string,\n TAccountRecord extends string | AccountMeta = string,\n TAccountAuthority extends string | AccountMeta = string,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts<\n [\n TAccountMint extends string\n ? WritableAccount\n : TAccountMint,\n TAccountDestination extends string\n ? WritableAccount\n : TAccountDestination,\n TAccountInstructionsSysvarOrContextState extends string\n ? ReadonlyAccount\n : TAccountInstructionsSysvarOrContextState,\n TAccountRecord extends string\n ? ReadonlyAccount\n : TAccountRecord,\n TAccountAuthority extends string\n ? ReadonlyAccount\n : TAccountAuthority,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionData =\n {\n discriminator: number;\n confidentialTransferFeeDiscriminator: number;\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalance;\n };\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs =\n {\n /** Proof instruction offset */\n proofInstructionOffset: number;\n /** The new decryptable balance in the destination token account */\n newDecryptableAvailableBalance: DecryptableBalanceArgs;\n };\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['confidentialTransferFeeDiscriminator', getU8Encoder()],\n ['proofInstructionOffset', getI8Encoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n confidentialTransferFeeDiscriminator:\n WITHDRAW_WITHHELD_TOKENS_FROM_MINT_FOR_CONFIDENTIAL_TRANSFER_FEE_CONFIDENTIAL_TRANSFER_FEE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['confidentialTransferFeeDiscriminator', getU8Decoder()],\n ['proofInstructionOffset', getI8Decoder()],\n ['newDecryptableAvailableBalance', getDecryptableBalanceDecoder()],\n ]);\n}\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataCodec(): FixedSizeCodec<\n WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs,\n WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionData\n> {\n return combineCodec(\n getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataEncoder(),\n getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataDecoder()\n );\n}\n\nexport type WithdrawWithheldTokensFromMintForConfidentialTransferFeeInput<\n TAccountMint extends string = string,\n TAccountDestination extends string = string,\n TAccountInstructionsSysvarOrContextState extends string = string,\n TAccountRecord extends string = string,\n TAccountAuthority extends string = string,\n> = {\n /** The token mint. */\n mint: Address;\n /** The fee receiver account. */\n destination: Address;\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: Address;\n /** Optional record account if proof is read from record */\n record?: Address;\n /** The mint's withdraw_withheld_authority */\n authority: Address | TransactionSigner;\n proofInstructionOffset: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs['proofInstructionOffset'];\n newDecryptableAvailableBalance: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs['newDecryptableAvailableBalance'];\n multiSigners?: Array;\n};\n\nexport function getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TAccountMint extends string,\n TAccountDestination extends string,\n TAccountInstructionsSysvarOrContextState extends string,\n TAccountRecord extends string,\n TAccountAuthority extends string,\n TProgramAddress extends Address = typeof TOKEN_2022_PROGRAM_ADDRESS,\n>(\n input: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInput<\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n TAccountAuthority\n >,\n config?: { programAddress?: TProgramAddress }\n): WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n> {\n // Program address.\n const programAddress = config?.programAddress ?? TOKEN_2022_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n mint: { value: input.mint ?? null, isWritable: true },\n destination: { value: input.destination ?? null, isWritable: true },\n instructionsSysvarOrContextState: {\n value: input.instructionsSysvarOrContextState ?? null,\n isWritable: false,\n },\n record: { value: input.record ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Remaining accounts.\n const remainingAccounts: AccountMeta[] = (args.multiSigners ?? []).map(\n (signer) => ({\n address: signer.address,\n role: AccountRole.READONLY_SIGNER,\n signer,\n })\n );\n\n const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.mint),\n getAccountMeta(accounts.destination),\n getAccountMeta(accounts.instructionsSysvarOrContextState),\n getAccountMeta(accounts.record),\n getAccountMeta(accounts.authority),\n ...remainingAccounts,\n ],\n data: getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataEncoder().encode(\n args as WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataArgs\n ),\n programAddress,\n } as WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgramAddress,\n TAccountMint,\n TAccountDestination,\n TAccountInstructionsSysvarOrContextState,\n TAccountRecord,\n (typeof input)['authority'] extends TransactionSigner\n ? ReadonlySignerAccount &\n AccountSignerMeta\n : TAccountAuthority\n >);\n}\n\nexport type ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram extends string = typeof TOKEN_2022_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address;\n accounts: {\n /** The token mint. */\n mint: TAccountMetas[0];\n /** The fee receiver account. */\n destination: TAccountMetas[1];\n /** Instructions sysvar or context state account */\n instructionsSysvarOrContextState: TAccountMetas[2];\n /** Optional record account if proof is read from record */\n record?: TAccountMetas[3] | undefined;\n /** The mint's withdraw_withheld_authority */\n authority: TAccountMetas[4];\n };\n data: WithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionData;\n};\n\nexport function parseWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction &\n InstructionWithAccounts &\n InstructionWithData\n): ParsedWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction<\n TProgram,\n TAccountMetas\n> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error('Not enough accounts');\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === TOKEN_2022_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n mint: getNextAccount(),\n destination: getNextAccount(),\n instructionsSysvarOrContextState: getNextAccount(),\n record: getNextOptionalAccount(),\n authority: getNextAccount(),\n },\n data: getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","import {\n type GetAccountInfoApi,\n type Rpc,\n Address,\n UnixTimestamp,\n unwrapOption,\n} from '@solana/kit';\nimport { fetchSysvarClock } from '@solana/sysvars';\nimport { fetchMint } from './generated';\n\n// Constants\nconst ONE_IN_BASIS_POINTS = 10000;\nconst SECONDS_PER_YEAR = 60 * 60 * 24 * 365.24;\n\n/**\n * Calculates the exponent for the interest rate formula.\n * @param t1 - The start time in seconds.\n * @param t2 - The end time in seconds.\n * @param r - The interest rate in basis points.\n *\n * @returns The calculated exponent.\n */\nfunction calculateExponentForTimesAndRate(t1: number, t2: number, r: number) {\n const timespan = t2 - t1;\n if (timespan < 0) {\n throw new Error('Invalid timespan: end time before start time');\n }\n\n const numerator = r * timespan;\n const exponent = numerator / (SECONDS_PER_YEAR * ONE_IN_BASIS_POINTS);\n return Math.exp(exponent);\n}\n\n/**\n * Calculates the total scale factor for an interest bearing token by combining two exponential functions:\n * One for the period between initialization and last update using the pre-update average rate,\n * and another for the period between last update and current time using the current rate.\n *\n * @param currentTimestamp Current timestamp in seconds\n * @param lastUpdateTimestamp Last time the interest rate was updated in seconds\n * @param initializationTimestamp Time the interest bearing extension was initialized in seconds\n * @param preUpdateAverageRate Interest rate in basis points before last update\n * @param currentRate Current interest rate in basis points\n *\n * @returns The total scale factor as a product of the two exponential functions\n */\nfunction calculateTotalScale({\n currentTimestamp,\n lastUpdateTimestamp,\n initializationTimestamp,\n preUpdateAverageRate,\n currentRate,\n}: {\n currentTimestamp: number;\n lastUpdateTimestamp: number;\n initializationTimestamp: number;\n preUpdateAverageRate: number;\n currentRate: number;\n}): number {\n // Calculate pre-update exponent\n const preUpdateExp = calculateExponentForTimesAndRate(\n initializationTimestamp,\n lastUpdateTimestamp,\n preUpdateAverageRate\n );\n\n // Calculate post-update exponent\n const postUpdateExp = calculateExponentForTimesAndRate(\n lastUpdateTimestamp,\n currentTimestamp,\n currentRate\n );\n\n return preUpdateExp * postUpdateExp;\n}\n\n/**\n * Calculates the decimal factor for a given number of decimals\n * @param decimals - Number of decimals\n * @returns The decimal factor (e.g., 100 for 2 decimals)\n */\nfunction getDecimalFactor(decimals: number): number {\n return Math.pow(10, decimals);\n}\n\n/**\n * Retrieves the current timestamp from the Solana clock sysvar.\n * @param rpc - The Solana rpc object.\n * @returns A promise that resolves to the current timestamp in seconds.\n * @throws An error if the sysvar clock cannot be fetched or parsed.\n */\nasync function getSysvarClockTimestamp(\n rpc: Rpc\n): Promise {\n const info = await fetchSysvarClock(rpc);\n if (!info) {\n throw new Error('Failed to fetch sysvar clock');\n }\n return info.unixTimestamp;\n}\n\n// ========== INTEREST BEARING MINT FUNCTIONS ==========\n\n/**\n * Convert amount to UiAmount for a mint with interest bearing extension without simulating a transaction\n * This implements the same logic as the CPI instruction available in /token/program-2022/src/extension/interest_bearing_mint/mod.rs\n * In general to calculate compounding interest over a period of time, the formula is:\n * A = P * e^(r * t) where\n * A = final amount after interest\n * P = principal amount (initial investment)\n * r = annual interest rate (as a decimal, e.g., 5% = 0.05)\n * t = time in years\n * e = mathematical constant (~2.718)\n *\n * In this case, we are calculating the total scale factor for the interest bearing extension which is the product of two exponential functions:\n * totalScale = e^(r1 * t1) * e^(r2 * t2)\n * where r1 and r2 are the interest rates before and after the last update, and t1 and t2 are the times in years between\n * the initialization timestamp and the last update timestamp, and between the last update timestamp and the current timestamp.\n *\n * @param amount Amount of tokens to be converted\n * @param decimals Number of decimals of the mint\n * @param currentTimestamp Current timestamp in seconds\n * @param lastUpdateTimestamp Last time the interest rate was updated in seconds\n * @param initializationTimestamp Time the interest bearing extension was initialized in seconds\n * @param preUpdateAverageRate Interest rate in basis points (1 basis point = 0.01%) before last update\n * @param currentRate Current interest rate in basis points\n *\n * @return Amount scaled by accrued interest as a string with appropriate decimal places\n */\nexport function amountToUiAmountForInterestBearingMintWithoutSimulation(\n amount: bigint,\n decimals: number,\n currentTimestamp: number,\n lastUpdateTimestamp: number,\n initializationTimestamp: number,\n preUpdateAverageRate: number,\n currentRate: number\n): string {\n const totalScale = calculateTotalScale({\n currentTimestamp,\n lastUpdateTimestamp,\n initializationTimestamp,\n preUpdateAverageRate,\n currentRate,\n });\n\n // Scale the amount by the total interest factor\n const scaledAmount = Number(amount) * totalScale;\n const decimalFactor = getDecimalFactor(decimals);\n\n return (Math.trunc(scaledAmount) / decimalFactor).toString();\n}\n\n/**\n * Convert an amount with interest back to the original amount without interest\n * This implements the same logic as the CPI instruction available in /token/program-2022/src/extension/interest_bearing_mint/mod.rs\n *\n * @param uiAmount UI Amount (principal plus continuously compounding interest) to be converted back to original principal\n * @param decimals Number of decimals for the mint\n * @param currentTimestamp Current timestamp in seconds\n * @param lastUpdateTimestamp Last time the interest rate was updated in seconds\n * @param initializationTimestamp Time the interest bearing extension was initialized in seconds\n * @param preUpdateAverageRate Interest rate in basis points (hundredths of a percent) before the last update\n * @param currentRate Current interest rate in basis points\n *\n * In general to calculate the principal from the UI amount, the formula is:\n * P = A / (e^(r * t)) where\n * P = principal\n * A = UI amount\n * r = annual interest rate (as a decimal, e.g., 5% = 0.05)\n * t = time in years\n *\n * In this case, we are calculating the principal by dividing the UI amount by the total scale factor which is the product of two exponential functions:\n * totalScale = e^(r1 * t1) * e^(r2 * t2)\n * where r1 is the pre-update average rate, r2 is the current rate, t1 is the time in years between the initialization timestamp and the last update timestamp,\n * and t2 is the time in years between the last update timestamp and the current timestamp.\n * then to calculate the principal, we divide the UI amount by the total scale factor:\n * P = A / totalScale\n *\n * @return Original amount (principal) without interest\n */\nexport function uiAmountToAmountForInterestBearingMintWithoutSimulation(\n uiAmount: string,\n decimals: number,\n currentTimestamp: number,\n lastUpdateTimestamp: number,\n initializationTimestamp: number,\n preUpdateAverageRate: number,\n currentRate: number\n): bigint {\n const uiAmountNumber = parseFloat(uiAmount);\n const decimalsFactor = getDecimalFactor(decimals);\n const uiAmountScaled = uiAmountNumber * decimalsFactor;\n\n const totalScale = calculateTotalScale({\n currentTimestamp,\n lastUpdateTimestamp,\n initializationTimestamp,\n preUpdateAverageRate,\n currentRate,\n });\n\n // Calculate original principal by dividing the UI amount by the total scale\n const originalPrincipal = uiAmountScaled / totalScale;\n return BigInt(Math.trunc(originalPrincipal));\n}\n\n// ========== SCALED UI AMOUNT MINT FUNCTIONS ==========\n\n/**\n * Convert amount to UiAmount for a mint with scaled UI amount extension\n * @param amount Amount of tokens to be converted\n * @param decimals Number of decimals of the mint\n * @param multiplier Multiplier to scale the amount\n * @return Scaled UI amount as a string\n */\nexport function amountToUiAmountForScaledUiAmountMintWithoutSimulation(\n amount: bigint,\n decimals: number,\n multiplier: number\n): string {\n const scaledAmount = Number(amount) * multiplier;\n const decimalFactor = getDecimalFactor(decimals);\n return (Math.trunc(scaledAmount) / decimalFactor).toString();\n}\n\n/**\n * Convert a UI amount back to the raw amount for a mint with a scaled UI amount extension\n * @param uiAmount UI Amount to be converted back to raw amount\n * @param decimals Number of decimals for the mint\n * @param multiplier Multiplier for the scaled UI amount\n *\n * @return Raw amount\n */\nexport function uiAmountToAmountForScaledUiAmountMintWithoutSimulation(\n uiAmount: string,\n decimals: number,\n multiplier: number\n): bigint {\n const uiAmountNumber = parseFloat(uiAmount);\n const decimalsFactor = getDecimalFactor(decimals);\n const uiAmountScaled = uiAmountNumber * decimalsFactor;\n const rawAmount = uiAmountScaled / multiplier;\n return BigInt(Math.trunc(rawAmount));\n}\n\n// ========== MAIN ENTRY POINT FUNCTIONS ==========\n\n/**\n * Convert amount to UiAmount for a mint without simulating a transaction\n * This implements the same logic as `process_amount_to_ui_amount` in\n * solana-labs/solana-program-library/token/program-2022/src/processor.rs\n * and `process_amount_to_ui_amount` in solana-labs/solana-program-library/token/program/src/processor.rs\n *\n * @param rpc Rpc to use\n * @param mint Mint to use for calculations\n * @param amount Amount of tokens to be converted to Ui Amount\n *\n * @return Ui Amount generated\n */\nexport async function amountToUiAmountForMintWithoutSimulation(\n rpc: Rpc,\n mint: Address,\n amount: bigint\n): Promise {\n const accountInfo = await fetchMint(rpc, mint);\n const extensions = unwrapOption(accountInfo.data.extensions);\n\n // Check for interest bearing mint extension\n const interestBearingMintConfigState = extensions?.find(\n (ext) => ext.__kind === 'InterestBearingConfig'\n );\n\n // Check for scaled UI amount extension\n const scaledUiAmountConfig = extensions?.find(\n (ext) => ext.__kind === 'ScaledUiAmountConfig'\n );\n\n // If no special extension, do standard conversion\n if (!interestBearingMintConfigState && !scaledUiAmountConfig) {\n const amountNumber = Number(amount);\n const decimalsFactor = getDecimalFactor(accountInfo.data.decimals);\n return (amountNumber / decimalsFactor).toString();\n }\n\n // Get timestamp if needed for special mint types\n const timestamp = await getSysvarClockTimestamp(rpc);\n\n // Handle interest bearing mint\n if (interestBearingMintConfigState) {\n return amountToUiAmountForInterestBearingMintWithoutSimulation(\n amount,\n accountInfo.data.decimals,\n Number(timestamp),\n Number(interestBearingMintConfigState.lastUpdateTimestamp),\n Number(interestBearingMintConfigState.initializationTimestamp),\n interestBearingMintConfigState.preUpdateAverageRate,\n interestBearingMintConfigState.currentRate\n );\n }\n\n // At this point, we know it must be a scaled UI amount mint\n if (scaledUiAmountConfig) {\n let multiplier = scaledUiAmountConfig.multiplier;\n // Use new multiplier if it's effective\n if (timestamp >= scaledUiAmountConfig.newMultiplierEffectiveTimestamp) {\n multiplier = scaledUiAmountConfig.newMultiplier;\n }\n return amountToUiAmountForScaledUiAmountMintWithoutSimulation(\n amount,\n accountInfo.data.decimals,\n multiplier\n );\n }\n\n // This should never happen due to the conditions above\n throw new Error('Unknown mint extension type');\n}\n\n/**\n * Convert a UI amount back to the raw amount\n *\n * @param rpc Rpc to use\n * @param mint Mint to use for calculations\n * @param uiAmount UI Amount to be converted back to raw amount\n *\n * @return Raw amount\n */\nexport async function uiAmountToAmountForMintWithoutSimulation(\n rpc: Rpc,\n mint: Address,\n uiAmount: string\n): Promise {\n const accountInfo = await fetchMint(rpc, mint);\n const extensions = unwrapOption(accountInfo.data.extensions);\n\n // Check for interest bearing mint extension\n const interestBearingMintConfigState = extensions?.find(\n (ext) => ext.__kind === 'InterestBearingConfig'\n );\n\n // Check for scaled UI amount extension\n const scaledUiAmountConfig = extensions?.find(\n (ext) => ext.__kind === 'ScaledUiAmountConfig'\n );\n\n // If no special extension, do standard conversion\n if (!interestBearingMintConfigState && !scaledUiAmountConfig) {\n const uiAmountScaled =\n parseFloat(uiAmount) * getDecimalFactor(accountInfo.data.decimals);\n return BigInt(Math.trunc(uiAmountScaled));\n }\n\n // Get timestamp if needed for special mint types\n const timestamp = await getSysvarClockTimestamp(rpc);\n\n // Handle interest bearing mint\n if (interestBearingMintConfigState) {\n return uiAmountToAmountForInterestBearingMintWithoutSimulation(\n uiAmount,\n accountInfo.data.decimals,\n Number(timestamp),\n Number(interestBearingMintConfigState.lastUpdateTimestamp),\n Number(interestBearingMintConfigState.initializationTimestamp),\n interestBearingMintConfigState.preUpdateAverageRate,\n interestBearingMintConfigState.currentRate\n );\n }\n\n // At this point, we know it must be a scaled UI amount mint\n if (scaledUiAmountConfig) {\n let multiplier = scaledUiAmountConfig.multiplier;\n // Use new multiplier if it's effective\n if (timestamp >= scaledUiAmountConfig.newMultiplierEffectiveTimestamp) {\n multiplier = scaledUiAmountConfig.newMultiplier;\n }\n return uiAmountToAmountForScaledUiAmountMintWithoutSimulation(\n uiAmount,\n accountInfo.data.decimals,\n multiplier\n );\n }\n\n // This should never happen due to the conditions above\n throw new Error('Unknown mint extension type');\n}\n","import {\n Address,\n Instruction,\n isNone,\n isOption,\n TransactionSigner,\n wrapNullable,\n} from '@solana/kit';\nimport {\n ExtensionArgs,\n getDisableMemoTransfersInstruction,\n getEnableMemoTransfersInstruction,\n getEnableCpiGuardInstruction,\n getDisableCpiGuardInstruction,\n getInitializeConfidentialTransferMintInstruction,\n getInitializeDefaultAccountStateInstruction,\n getInitializeGroupMemberPointerInstruction,\n getInitializeGroupPointerInstruction,\n getInitializeInterestBearingMintInstruction,\n getInitializeMetadataPointerInstruction,\n getInitializeMintCloseAuthorityInstruction,\n getInitializeTokenGroupInstruction,\n getInitializeTokenMetadataInstruction,\n getInitializeTransferFeeConfigInstruction,\n getInitializeNonTransferableMintInstruction,\n getInitializeTransferHookInstruction,\n getInitializePermanentDelegateInstruction,\n getInitializeScaledUiAmountMintInstruction,\n getInitializeConfidentialTransferFeeInstruction,\n getInitializePausableConfigInstruction,\n} from './generated';\n\n/**\n * Given a mint address and a list of mint extensions, returns a list of\n * instructions that MUST be run _before_ the `initializeMint` instruction\n * to properly initialize the given extensions on the mint account.\n */\nexport function getPreInitializeInstructionsForMintExtensions(\n mint: Address,\n extensions: ExtensionArgs[]\n): Instruction[] {\n return extensions.flatMap((extension) => {\n switch (extension.__kind) {\n case 'ConfidentialTransferMint':\n return [\n getInitializeConfidentialTransferMintInstruction({\n mint,\n ...extension,\n }),\n ];\n case 'DefaultAccountState':\n return [\n getInitializeDefaultAccountStateInstruction({\n mint,\n state: extension.state,\n }),\n ];\n case 'TransferFeeConfig':\n return [\n getInitializeTransferFeeConfigInstruction({\n mint,\n transferFeeConfigAuthority: extension.transferFeeConfigAuthority,\n withdrawWithheldAuthority: extension.withdrawWithheldAuthority,\n transferFeeBasisPoints:\n extension.newerTransferFee.transferFeeBasisPoints,\n maximumFee: extension.newerTransferFee.maximumFee,\n }),\n ];\n case 'MetadataPointer':\n return [\n getInitializeMetadataPointerInstruction({\n mint,\n authority: extension.authority,\n metadataAddress: extension.metadataAddress,\n }),\n ];\n case 'InterestBearingConfig':\n return [\n getInitializeInterestBearingMintInstruction({\n mint,\n rateAuthority: extension.rateAuthority,\n rate: extension.currentRate,\n }),\n ];\n case 'ScaledUiAmountConfig':\n return [\n getInitializeScaledUiAmountMintInstruction({\n mint,\n authority: extension.authority,\n multiplier: extension.multiplier,\n }),\n ];\n case 'PausableConfig':\n return [\n getInitializePausableConfigInstruction({\n mint,\n authority: extension.authority,\n }),\n ];\n case 'GroupPointer':\n return [\n getInitializeGroupPointerInstruction({\n mint,\n authority: extension.authority,\n groupAddress: extension.groupAddress,\n }),\n ];\n case 'GroupMemberPointer':\n return [\n getInitializeGroupMemberPointerInstruction({\n mint,\n authority: extension.authority,\n memberAddress: extension.memberAddress,\n }),\n ];\n case 'NonTransferable':\n return getInitializeNonTransferableMintInstruction({ mint });\n case 'TransferHook':\n return [\n getInitializeTransferHookInstruction({\n mint,\n authority: extension.authority,\n programId: extension.programId,\n }),\n ];\n case 'PermanentDelegate':\n return getInitializePermanentDelegateInstruction({\n mint,\n delegate: extension.delegate,\n });\n case 'ConfidentialTransferFee':\n return [\n getInitializeConfidentialTransferFeeInstruction({\n mint,\n authority: extension.authority,\n withdrawWithheldAuthorityElGamalPubkey: extension.elgamalPubkey,\n }),\n ];\n case 'MintCloseAuthority':\n return getInitializeMintCloseAuthorityInstruction({\n closeAuthority: extension.closeAuthority,\n mint,\n });\n default:\n return [];\n }\n });\n}\n\n/**\n * Given a mint address and a list of mint extensions, returns a list of\n * instructions that MUST be run _after_ the `initializeMint` instruction\n * to properly initialize the given extensions on the mint account.\n */\nexport function getPostInitializeInstructionsForMintExtensions(\n mint: Address,\n authority: TransactionSigner,\n extensions: ExtensionArgs[]\n): Instruction[] {\n return extensions.flatMap((extension): Instruction[] => {\n switch (extension.__kind) {\n case 'TokenMetadata':\n // eslint-disable-next-line no-case-declarations\n const tokenMetadataUpdateAuthority = isOption(extension.updateAuthority)\n ? extension.updateAuthority\n : wrapNullable(extension.updateAuthority);\n if (isNone(tokenMetadataUpdateAuthority)) {\n return [];\n }\n return [\n getInitializeTokenMetadataInstruction({\n metadata: mint,\n updateAuthority: tokenMetadataUpdateAuthority.value,\n mint,\n mintAuthority: authority,\n name: extension.name,\n symbol: extension.symbol,\n uri: extension.uri,\n }),\n ];\n case 'TokenGroup':\n return [\n getInitializeTokenGroupInstruction({\n group: mint,\n updateAuthority: isOption(extension.updateAuthority)\n ? extension.updateAuthority\n : wrapNullable(extension.updateAuthority),\n mint,\n mintAuthority: authority,\n maxSize: extension.maxSize,\n }),\n ];\n default:\n return [];\n }\n });\n}\n\n/**\n * Given a token address, its owner and a list of token extensions, returns a list\n * of instructions that MUST be run _after_ the `initializeAccount` instruction\n * to properly initialize the given extensions on the token account.\n */\nexport function getPostInitializeInstructionsForTokenExtensions(\n token: Address,\n owner: TransactionSigner | Address,\n extensions: ExtensionArgs[],\n multiSigners?: TransactionSigner[]\n): Instruction[] {\n return extensions.flatMap((extension) => {\n switch (extension.__kind) {\n case 'MemoTransfer':\n return [\n extension.requireIncomingTransferMemos\n ? getEnableMemoTransfersInstruction({ owner, token, multiSigners })\n : getDisableMemoTransfersInstruction({\n owner,\n token,\n multiSigners,\n }),\n ];\n case 'CpiGuard':\n return [\n extension.lockCpi\n ? getEnableCpiGuardInstruction({ owner, token, multiSigners })\n : getDisableCpiGuardInstruction({\n owner,\n token,\n multiSigners,\n }),\n ];\n default:\n return [];\n }\n });\n}\n","import {\n getArrayEncoder,\n getConstantEncoder,\n getHiddenPrefixEncoder,\n getU8Encoder,\n} from '@solana/kit';\nimport { ExtensionArgs, getExtensionEncoder } from './generated';\n\nconst TOKEN_BASE_SIZE = 165;\n\nexport function getTokenSize(extensions?: ExtensionArgs[]): number {\n if (extensions == null) return TOKEN_BASE_SIZE;\n const tvlEncoder = getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(getU8Encoder().encode(2))]\n );\n return TOKEN_BASE_SIZE + tvlEncoder.encode(extensions).length;\n}\n","import {\n getArrayEncoder,\n getConstantEncoder,\n getHiddenPrefixEncoder,\n getU8Encoder,\n padLeftEncoder,\n} from '@solana/kit';\nimport { ExtensionArgs, getExtensionEncoder } from './generated';\n\nconst MINT_BASE_SIZE = 82;\n\nexport function getMintSize(extensions?: ExtensionArgs[]): number {\n if (extensions == null) return MINT_BASE_SIZE;\n const tvlEncoder = getHiddenPrefixEncoder(\n getArrayEncoder(getExtensionEncoder(), { size: 'remainder' }),\n [getConstantEncoder(padLeftEncoder(getU8Encoder(), 83).encode(1))]\n );\n return MINT_BASE_SIZE + tvlEncoder.encode(extensions).length;\n}\n","/**\n * Token program addresses for SPL Token and Token-2022\n * These addresses are the same across all Solana networks (mainnet, devnet, testnet)\n */\nexport const TOKEN_PROGRAM_ADDRESS = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\";\nexport const TOKEN_2022_PROGRAM_ADDRESS = \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\";\nexport const COMPUTE_BUDGET_PROGRAM_ADDRESS = \"ComputeBudget111111111111111111111111111111\";\nexport const MEMO_PROGRAM_ADDRESS = \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\";\n\n/**\n * Phantom/Solflare Lighthouse program address\n * Phantom and Solflare wallets inject Lighthouse instructions for user protection on mainnet transactions.\n * - Phantom adds 1 Lighthouse instruction (4th instruction)\n * - Solflare adds 2 Lighthouse instructions (4th and 5th instructions)\n * We allow these as optional instructions to support these wallets.\n * See: https://github.com/x402-foundation/x402/issues/828\n */\nexport const LIGHTHOUSE_PROGRAM_ADDRESS = \"L2TExMFKdjpN9kozasaurPirfHy9P8sbXoAN1qA3S95\";\n\n/**\n * Default RPC URLs for Solana networks\n */\nexport const DEVNET_RPC_URL = \"https://api.devnet.solana.com\";\nexport const TESTNET_RPC_URL = \"https://api.testnet.solana.com\";\nexport const MAINNET_RPC_URL = \"https://api.mainnet-beta.solana.com\";\nexport const DEVNET_WS_URL = \"wss://api.devnet.solana.com\";\nexport const TESTNET_WS_URL = \"wss://api.testnet.solana.com\";\nexport const MAINNET_WS_URL = \"wss://api.mainnet-beta.solana.com\";\n\n/**\n * USDC token mint addresses (default stablecoin)\n */\nexport const USDC_MAINNET_ADDRESS = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nexport const USDC_DEVNET_ADDRESS = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\";\nexport const USDC_TESTNET_ADDRESS = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\"; // Same as devnet\n\n/**\n * Compute budget configuration\n * All prices are in microlamports (1 lamport = 1,000,000 microlamports)\n */\nexport const DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\nexport const MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 5_000_000; // 5 lamports\nexport const DEFAULT_COMPUTE_UNIT_LIMIT = 20_000;\n\n/**\n * How long a transaction is held in the duplicate settlement cache (ms).\n * Covers the Solana blockhash lifetime (~60-90s) with margin.\n */\nexport const SETTLEMENT_TTL_MS = 120_000;\n\n/**\n * Solana address validation regex (base58, 32-44 characters)\n */\nexport const SVM_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\n/**\n * CAIP-2 network identifiers for Solana (V2)\n */\nexport const SOLANA_MAINNET_CAIP2 = \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\";\nexport const SOLANA_DEVNET_CAIP2 = \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\";\nexport const SOLANA_TESTNET_CAIP2 = \"solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z\";\n\n/**\n * V1 to V2 network identifier mappings (for backwards compatibility)\n * V1 used simple names like solana, V2 uses CAIP-2\n */\nexport const V1_TO_V2_NETWORK_MAP: Record = {\n solana: SOLANA_MAINNET_CAIP2,\n \"solana-devnet\": SOLANA_DEVNET_CAIP2,\n \"solana-testnet\": SOLANA_TESTNET_CAIP2,\n};\n","import {\n getBase64Encoder,\n getTransactionDecoder,\n getCompiledTransactionMessageDecoder,\n type Transaction,\n createSolanaRpc,\n devnet,\n testnet,\n mainnet,\n type RpcDevnet,\n type SolanaRpcApiDevnet,\n type RpcTestnet,\n type SolanaRpcApiTestnet,\n type RpcMainnet,\n type SolanaRpcApiMainnet,\n} from \"@solana/kit\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { TOKEN_2022_PROGRAM_ADDRESS } from \"@solana-program/token-2022\";\nimport type { Network } from \"@x402/core/types\";\nimport {\n SVM_ADDRESS_REGEX,\n DEVNET_RPC_URL,\n TESTNET_RPC_URL,\n MAINNET_RPC_URL,\n USDC_MAINNET_ADDRESS,\n USDC_DEVNET_ADDRESS,\n USDC_TESTNET_ADDRESS,\n SOLANA_MAINNET_CAIP2,\n SOLANA_DEVNET_CAIP2,\n SOLANA_TESTNET_CAIP2,\n V1_TO_V2_NETWORK_MAP,\n} from \"./constants\";\nimport type { ExactSvmPayloadV1 } from \"./types\";\n\n/**\n * Normalize network identifier to CAIP-2 format\n * Handles both V1 names (solana, solana-devnet) and V2 CAIP-2 format\n *\n * @param network - Network identifier (V1 or V2 format)\n * @returns CAIP-2 network identifier\n */\nexport function normalizeNetwork(network: Network): string {\n // If it's already CAIP-2 format (contains \":\"), validate it's supported\n if (network.includes(\":\")) {\n const supported = [SOLANA_MAINNET_CAIP2, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2];\n if (!supported.includes(network)) {\n throw new Error(`Unsupported SVM network: ${network}`);\n }\n return network;\n }\n\n // Otherwise, it's a V1 network name, convert to CAIP-2\n const caip2Network = V1_TO_V2_NETWORK_MAP[network];\n if (!caip2Network) {\n throw new Error(`Unsupported SVM network: ${network}`);\n }\n return caip2Network;\n}\n\n/**\n * Validate Solana address format\n *\n * @param address - Base58 encoded address string\n * @returns true if address is valid, false otherwise\n */\nexport function validateSvmAddress(address: string): boolean {\n return SVM_ADDRESS_REGEX.test(address);\n}\n\n/**\n * Decode a base64 encoded transaction from an SVM payload\n *\n * @param svmPayload - The SVM payload containing a base64 encoded transaction\n * @returns Decoded Transaction object\n */\nexport function decodeTransactionFromPayload(svmPayload: ExactSvmPayloadV1): Transaction {\n try {\n const base64Encoder = getBase64Encoder();\n const transactionBytes = base64Encoder.encode(svmPayload.transaction);\n const transactionDecoder = getTransactionDecoder();\n return transactionDecoder.decode(transactionBytes);\n } catch (error) {\n console.error(\"Error decoding transaction:\", error);\n throw new Error(\"invalid_exact_svm_payload_transaction\");\n }\n}\n\n/**\n * Extract the token sender (owner of the source token account) from a TransferChecked instruction\n *\n * @param transaction - The decoded transaction\n * @returns The token payer address as a base58 string\n */\nexport function getTokenPayerFromTransaction(transaction: Transaction): string {\n const compiled = getCompiledTransactionMessageDecoder().decode(transaction.messageBytes);\n const staticAccounts = compiled.staticAccounts ?? [];\n const instructions = compiled.instructions ?? [];\n\n for (const ix of instructions) {\n const programIndex = ix.programAddressIndex;\n const programAddress = staticAccounts[programIndex].toString();\n\n // Check if this is a token program instruction\n if (\n programAddress === TOKEN_PROGRAM_ADDRESS.toString() ||\n programAddress === TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n const accountIndices: number[] = ix.accountIndices ?? [];\n // TransferChecked account order: [source, mint, destination, owner, ...]\n if (accountIndices.length >= 4) {\n const ownerIndex = accountIndices[3];\n const ownerAddress = staticAccounts[ownerIndex].toString();\n if (ownerAddress) return ownerAddress;\n }\n }\n }\n\n return \"\";\n}\n\n/**\n * Create an RPC client for the specified network\n *\n * @param network - Network identifier (CAIP-2 or V1 format)\n * @param customRpcUrl - Optional custom RPC URL\n * @returns RPC client for the specified network\n */\nexport function createRpcClient(\n network: Network,\n customRpcUrl?: string,\n):\n | RpcDevnet\n | RpcTestnet\n | RpcMainnet {\n const caip2Network = normalizeNetwork(network);\n\n switch (caip2Network) {\n case SOLANA_DEVNET_CAIP2: {\n const url = customRpcUrl || DEVNET_RPC_URL;\n return createSolanaRpc(devnet(url)) as RpcDevnet;\n }\n case SOLANA_TESTNET_CAIP2: {\n const url = customRpcUrl || TESTNET_RPC_URL;\n return createSolanaRpc(testnet(url)) as RpcTestnet;\n }\n case SOLANA_MAINNET_CAIP2: {\n const url = customRpcUrl || MAINNET_RPC_URL;\n return createSolanaRpc(mainnet(url)) as RpcMainnet;\n }\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n}\n\n/**\n * Get the default USDC mint address for a network\n *\n * @param network - Network identifier (CAIP-2 or V1 format)\n * @returns USDC mint address for the network\n */\nexport function getUsdcAddress(network: Network): string {\n const caip2Network = normalizeNetwork(network);\n\n switch (caip2Network) {\n case SOLANA_MAINNET_CAIP2:\n return USDC_MAINNET_ADDRESS;\n case SOLANA_DEVNET_CAIP2:\n return USDC_DEVNET_ADDRESS;\n case SOLANA_TESTNET_CAIP2:\n return USDC_TESTNET_ADDRESS;\n default:\n throw new Error(`No USDC address configured for network: ${network}`);\n }\n}\n\n/**\n * Convert a decimal amount to token smallest units\n *\n * @param decimalAmount - The decimal amount (e.g., \"0.10\")\n * @param decimals - The number of decimals for the token (e.g., 6 for USDC)\n * @returns The amount in smallest units as a string\n */\nexport function convertToTokenAmount(decimalAmount: string, decimals: number): string {\n const amount = parseFloat(decimalAmount);\n if (isNaN(amount)) {\n throw new Error(`Invalid amount: ${decimalAmount}`);\n }\n // Convert to smallest unit (e.g., for USDC with 6 decimals: 0.10 * 10^6 = 100000)\n const [intPart, decPart = \"\"] = String(amount).split(\".\");\n const paddedDec = decPart.padEnd(decimals, \"0\").slice(0, decimals);\n const tokenAmount = (intPart + paddedDec).replace(/^0+/, \"\") || \"0\";\n return tokenAmount;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n getU8Encoder,\n type Address,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n type ParsedRequestHeapFrameInstruction,\n type ParsedRequestUnitsInstruction,\n type ParsedSetComputeUnitLimitInstruction,\n type ParsedSetComputeUnitPriceInstruction,\n type ParsedSetLoadedAccountsDataSizeLimitInstruction,\n} from '../instructions';\n\nexport const COMPUTE_BUDGET_PROGRAM_ADDRESS =\n 'ComputeBudget111111111111111111111111111111' as Address<'ComputeBudget111111111111111111111111111111'>;\n\nexport enum ComputeBudgetInstruction {\n RequestUnits,\n RequestHeapFrame,\n SetComputeUnitLimit,\n SetComputeUnitPrice,\n SetLoadedAccountsDataSizeLimit,\n}\n\nexport function identifyComputeBudgetInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array\n): ComputeBudgetInstruction {\n const data = 'data' in instruction ? instruction.data : instruction;\n if (containsBytes(data, getU8Encoder().encode(0), 0)) {\n return ComputeBudgetInstruction.RequestUnits;\n }\n if (containsBytes(data, getU8Encoder().encode(1), 0)) {\n return ComputeBudgetInstruction.RequestHeapFrame;\n }\n if (containsBytes(data, getU8Encoder().encode(2), 0)) {\n return ComputeBudgetInstruction.SetComputeUnitLimit;\n }\n if (containsBytes(data, getU8Encoder().encode(3), 0)) {\n return ComputeBudgetInstruction.SetComputeUnitPrice;\n }\n if (containsBytes(data, getU8Encoder().encode(4), 0)) {\n return ComputeBudgetInstruction.SetLoadedAccountsDataSizeLimit;\n }\n throw new Error(\n 'The provided instruction could not be identified as a computeBudget instruction.'\n );\n}\n\nexport type ParsedComputeBudgetInstruction<\n TProgram extends string = 'ComputeBudget111111111111111111111111111111',\n> =\n | ({\n instructionType: ComputeBudgetInstruction.RequestUnits;\n } & ParsedRequestUnitsInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.RequestHeapFrame;\n } & ParsedRequestHeapFrameInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.SetComputeUnitLimit;\n } & ParsedSetComputeUnitLimitInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.SetComputeUnitPrice;\n } & ParsedSetComputeUnitPriceInstruction)\n | ({\n instructionType: ComputeBudgetInstruction.SetLoadedAccountsDataSizeLimit;\n } & ParsedSetLoadedAccountsDataSizeLimitInstruction);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const REQUEST_HEAP_FRAME_DISCRIMINATOR = 1;\n\nexport function getRequestHeapFrameDiscriminatorBytes() {\n return getU8Encoder().encode(REQUEST_HEAP_FRAME_DISCRIMINATOR);\n}\n\nexport type RequestHeapFrameInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type RequestHeapFrameInstructionData = {\n discriminator: number;\n /**\n * Requested transaction-wide program heap size in bytes.\n * Must be multiple of 1024. Applies to each program, including CPIs.\n */\n bytes: number;\n};\n\nexport type RequestHeapFrameInstructionDataArgs = {\n /**\n * Requested transaction-wide program heap size in bytes.\n * Must be multiple of 1024. Applies to each program, including CPIs.\n */\n bytes: number;\n};\n\nexport function getRequestHeapFrameInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['bytes', getU32Encoder()],\n ]),\n (value) => ({ ...value, discriminator: REQUEST_HEAP_FRAME_DISCRIMINATOR })\n );\n}\n\nexport function getRequestHeapFrameInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['bytes', getU32Decoder()],\n ]);\n}\n\nexport function getRequestHeapFrameInstructionDataCodec(): FixedSizeCodec<\n RequestHeapFrameInstructionDataArgs,\n RequestHeapFrameInstructionData\n> {\n return combineCodec(\n getRequestHeapFrameInstructionDataEncoder(),\n getRequestHeapFrameInstructionDataDecoder()\n );\n}\n\nexport type RequestHeapFrameInput = {\n bytes: RequestHeapFrameInstructionDataArgs['bytes'];\n};\n\nexport function getRequestHeapFrameInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: RequestHeapFrameInput,\n config?: { programAddress?: TProgramAddress }\n): RequestHeapFrameInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getRequestHeapFrameInstructionDataEncoder().encode(\n args as RequestHeapFrameInstructionDataArgs\n ),\n programAddress,\n } as RequestHeapFrameInstruction);\n}\n\nexport type ParsedRequestHeapFrameInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: RequestHeapFrameInstructionData;\n};\n\nexport function parseRequestHeapFrameInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedRequestHeapFrameInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getRequestHeapFrameInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const REQUEST_UNITS_DISCRIMINATOR = 0;\n\nexport function getRequestUnitsDiscriminatorBytes() {\n return getU8Encoder().encode(REQUEST_UNITS_DISCRIMINATOR);\n}\n\nexport type RequestUnitsInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type RequestUnitsInstructionData = {\n discriminator: number;\n /** Units to request for transaction-wide compute. */\n units: number;\n /** Prioritization fee lamports. */\n additionalFee: number;\n};\n\nexport type RequestUnitsInstructionDataArgs = {\n /** Units to request for transaction-wide compute. */\n units: number;\n /** Prioritization fee lamports. */\n additionalFee: number;\n};\n\nexport function getRequestUnitsInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['units', getU32Encoder()],\n ['additionalFee', getU32Encoder()],\n ]),\n (value) => ({ ...value, discriminator: REQUEST_UNITS_DISCRIMINATOR })\n );\n}\n\nexport function getRequestUnitsInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['units', getU32Decoder()],\n ['additionalFee', getU32Decoder()],\n ]);\n}\n\nexport function getRequestUnitsInstructionDataCodec(): FixedSizeCodec<\n RequestUnitsInstructionDataArgs,\n RequestUnitsInstructionData\n> {\n return combineCodec(\n getRequestUnitsInstructionDataEncoder(),\n getRequestUnitsInstructionDataDecoder()\n );\n}\n\nexport type RequestUnitsInput = {\n units: RequestUnitsInstructionDataArgs['units'];\n additionalFee: RequestUnitsInstructionDataArgs['additionalFee'];\n};\n\nexport function getRequestUnitsInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: RequestUnitsInput,\n config?: { programAddress?: TProgramAddress }\n): RequestUnitsInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getRequestUnitsInstructionDataEncoder().encode(\n args as RequestUnitsInstructionDataArgs\n ),\n programAddress,\n } as RequestUnitsInstruction);\n}\n\nexport type ParsedRequestUnitsInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = { programAddress: Address; data: RequestUnitsInstructionData };\n\nexport function parseRequestUnitsInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedRequestUnitsInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getRequestUnitsInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR = 2;\n\nexport function getSetComputeUnitLimitDiscriminatorBytes() {\n return getU8Encoder().encode(SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR);\n}\n\nexport type SetComputeUnitLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type SetComputeUnitLimitInstructionData = {\n discriminator: number;\n /** Transaction-wide compute unit limit. */\n units: number;\n};\n\nexport type SetComputeUnitLimitInstructionDataArgs = {\n /** Transaction-wide compute unit limit. */\n units: number;\n};\n\nexport function getSetComputeUnitLimitInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['units', getU32Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetComputeUnitLimitInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['units', getU32Decoder()],\n ]);\n}\n\nexport function getSetComputeUnitLimitInstructionDataCodec(): FixedSizeCodec<\n SetComputeUnitLimitInstructionDataArgs,\n SetComputeUnitLimitInstructionData\n> {\n return combineCodec(\n getSetComputeUnitLimitInstructionDataEncoder(),\n getSetComputeUnitLimitInstructionDataDecoder()\n );\n}\n\nexport type SetComputeUnitLimitInput = {\n units: SetComputeUnitLimitInstructionDataArgs['units'];\n};\n\nexport function getSetComputeUnitLimitInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: SetComputeUnitLimitInput,\n config?: { programAddress?: TProgramAddress }\n): SetComputeUnitLimitInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getSetComputeUnitLimitInstructionDataEncoder().encode(\n args as SetComputeUnitLimitInstructionDataArgs\n ),\n programAddress,\n } as SetComputeUnitLimitInstruction);\n}\n\nexport type ParsedSetComputeUnitLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: SetComputeUnitLimitInstructionData;\n};\n\nexport function parseSetComputeUnitLimitInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedSetComputeUnitLimitInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getSetComputeUnitLimitInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR = 3;\n\nexport function getSetComputeUnitPriceDiscriminatorBytes() {\n return getU8Encoder().encode(SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR);\n}\n\nexport type SetComputeUnitPriceInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type SetComputeUnitPriceInstructionData = {\n discriminator: number;\n /** Transaction compute unit price used for prioritization fees. */\n microLamports: bigint;\n};\n\nexport type SetComputeUnitPriceInstructionDataArgs = {\n /** Transaction compute unit price used for prioritization fees. */\n microLamports: number | bigint;\n};\n\nexport function getSetComputeUnitPriceInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['microLamports', getU64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetComputeUnitPriceInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['microLamports', getU64Decoder()],\n ]);\n}\n\nexport function getSetComputeUnitPriceInstructionDataCodec(): FixedSizeCodec<\n SetComputeUnitPriceInstructionDataArgs,\n SetComputeUnitPriceInstructionData\n> {\n return combineCodec(\n getSetComputeUnitPriceInstructionDataEncoder(),\n getSetComputeUnitPriceInstructionDataDecoder()\n );\n}\n\nexport type SetComputeUnitPriceInput = {\n microLamports: SetComputeUnitPriceInstructionDataArgs['microLamports'];\n};\n\nexport function getSetComputeUnitPriceInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: SetComputeUnitPriceInput,\n config?: { programAddress?: TProgramAddress }\n): SetComputeUnitPriceInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getSetComputeUnitPriceInstructionDataEncoder().encode(\n args as SetComputeUnitPriceInstructionDataArgs\n ),\n programAddress,\n } as SetComputeUnitPriceInstruction);\n}\n\nexport type ParsedSetComputeUnitPriceInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: SetComputeUnitPriceInstructionData;\n};\n\nexport function parseSetComputeUnitPriceInstruction(\n instruction: Instruction & InstructionWithData\n): ParsedSetComputeUnitPriceInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getSetComputeUnitPriceInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyUint8Array,\n} from '@solana/kit';\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from '../programs';\n\nexport const SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_DISCRIMINATOR = 4;\n\nexport function getSetLoadedAccountsDataSizeLimitDiscriminatorBytes() {\n return getU8Encoder().encode(\n SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_DISCRIMINATOR\n );\n}\n\nexport type SetLoadedAccountsDataSizeLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n TRemainingAccounts extends readonly AccountMeta[] = [],\n> = Instruction &\n InstructionWithData &\n InstructionWithAccounts;\n\nexport type SetLoadedAccountsDataSizeLimitInstructionData = {\n discriminator: number;\n accountDataSizeLimit: number;\n};\n\nexport type SetLoadedAccountsDataSizeLimitInstructionDataArgs = {\n accountDataSizeLimit: number;\n};\n\nexport function getSetLoadedAccountsDataSizeLimitInstructionDataEncoder(): FixedSizeEncoder {\n return transformEncoder(\n getStructEncoder([\n ['discriminator', getU8Encoder()],\n ['accountDataSizeLimit', getU32Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_DISCRIMINATOR,\n })\n );\n}\n\nexport function getSetLoadedAccountsDataSizeLimitInstructionDataDecoder(): FixedSizeDecoder {\n return getStructDecoder([\n ['discriminator', getU8Decoder()],\n ['accountDataSizeLimit', getU32Decoder()],\n ]);\n}\n\nexport function getSetLoadedAccountsDataSizeLimitInstructionDataCodec(): FixedSizeCodec<\n SetLoadedAccountsDataSizeLimitInstructionDataArgs,\n SetLoadedAccountsDataSizeLimitInstructionData\n> {\n return combineCodec(\n getSetLoadedAccountsDataSizeLimitInstructionDataEncoder(),\n getSetLoadedAccountsDataSizeLimitInstructionDataDecoder()\n );\n}\n\nexport type SetLoadedAccountsDataSizeLimitInput = {\n accountDataSizeLimit: SetLoadedAccountsDataSizeLimitInstructionDataArgs['accountDataSizeLimit'];\n};\n\nexport function getSetLoadedAccountsDataSizeLimitInstruction<\n TProgramAddress extends Address = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n>(\n input: SetLoadedAccountsDataSizeLimitInput,\n config?: { programAddress?: TProgramAddress }\n): SetLoadedAccountsDataSizeLimitInstruction {\n // Program address.\n const programAddress =\n config?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;\n\n // Original args.\n const args = { ...input };\n\n return Object.freeze({\n data: getSetLoadedAccountsDataSizeLimitInstructionDataEncoder().encode(\n args as SetLoadedAccountsDataSizeLimitInstructionDataArgs\n ),\n programAddress,\n } as SetLoadedAccountsDataSizeLimitInstruction);\n}\n\nexport type ParsedSetLoadedAccountsDataSizeLimitInstruction<\n TProgram extends string = typeof COMPUTE_BUDGET_PROGRAM_ADDRESS,\n> = {\n programAddress: Address;\n data: SetLoadedAccountsDataSizeLimitInstructionData;\n};\n\nexport function parseSetLoadedAccountsDataSizeLimitInstruction<\n TProgram extends string,\n>(\n instruction: Instruction & InstructionWithData\n): ParsedSetLoadedAccountsDataSizeLimitInstruction {\n return {\n programAddress: instruction.programAddress,\n data: getSetLoadedAccountsDataSizeLimitInstructionDataDecoder().decode(\n instruction.data\n ),\n };\n}\n","/**\n * A provisory compute unit limit is used to indicate that the transaction\n * should be estimated for compute units before being sent to the network.\n *\n * Setting it to zero ensures the transaction fails unless it is properly estimated.\n */\nexport const PROVISORY_COMPUTE_UNIT_LIMIT = 0;\n\n/**\n * The maximum compute unit limit that can be set for a transaction.\n */\nexport const MAX_COMPUTE_UNIT_LIMIT = 1_400_000;\n","import {\n BaseTransactionMessage,\n getU32Decoder,\n getU64Decoder,\n Instruction,\n MicroLamports,\n ReadonlyUint8Array,\n} from '@solana/kit';\nimport {\n COMPUTE_BUDGET_PROGRAM_ADDRESS,\n ComputeBudgetInstruction,\n identifyComputeBudgetInstruction,\n SetComputeUnitLimitInstruction,\n SetComputeUnitPriceInstruction,\n} from './generated';\n\n/**\n * Finds the index of the first `SetComputeUnitLimit` instruction in a transaction message\n * and its set limit, if any.\n */\nexport function getSetComputeUnitLimitInstructionIndexAndUnits(\n transactionMessage: BaseTransactionMessage\n): { index: number; units: number } | null {\n const index = getSetComputeUnitLimitInstructionIndex(transactionMessage);\n if (index < 0) {\n return null;\n }\n\n const units = getU32Decoder().decode(\n transactionMessage.instructions[index].data as ReadonlyUint8Array,\n 1\n );\n\n return { index, units };\n}\n\n/**\n * Finds the index of the first `SetComputeUnitLimit` instruction in a transaction message, if any.\n */\nexport function getSetComputeUnitLimitInstructionIndex(\n transactionMessage: BaseTransactionMessage\n) {\n return transactionMessage.instructions.findIndex(\n isSetComputeUnitLimitInstruction\n );\n}\n\n/**\n * Checks if the given instruction is a `SetComputeUnitLimit` instruction.\n */\nexport function isSetComputeUnitLimitInstruction(\n instruction: Instruction\n): instruction is SetComputeUnitLimitInstruction {\n return (\n instruction.programAddress === COMPUTE_BUDGET_PROGRAM_ADDRESS &&\n identifyComputeBudgetInstruction(instruction.data as Uint8Array) ===\n ComputeBudgetInstruction.SetComputeUnitLimit\n );\n}\n\n/**\n * Finds the index of the first `SetComputeUnitPrice` instruction in a transaction message\n * and its set micro-lamports, if any.\n */\nexport function getSetComputeUnitPriceInstructionIndexAndMicroLamports(\n transactionMessage: BaseTransactionMessage\n): { index: number; microLamports: MicroLamports } | null {\n const index = getSetComputeUnitPriceInstructionIndex(transactionMessage);\n if (index < 0) {\n return null;\n }\n\n const microLamports = getU64Decoder().decode(\n transactionMessage.instructions[index].data as ReadonlyUint8Array,\n 1\n ) as MicroLamports;\n\n return { index, microLamports };\n}\n\n/**\n * Finds the index of the first `SetComputeUnitPrice` instruction in a transaction message, if any.\n */\nexport function getSetComputeUnitPriceInstructionIndex(\n transactionMessage: BaseTransactionMessage\n) {\n return transactionMessage.instructions.findIndex(\n isSetComputeUnitPriceInstruction\n );\n}\n\n/**\n * Checks if the given instruction is a `SetComputeUnitPrice` instruction.\n */\nexport function isSetComputeUnitPriceInstruction(\n instruction: Instruction\n): instruction is SetComputeUnitPriceInstruction {\n return (\n instruction.programAddress === COMPUTE_BUDGET_PROGRAM_ADDRESS &&\n identifyComputeBudgetInstruction(instruction.data as Uint8Array) ===\n ComputeBudgetInstruction.SetComputeUnitPrice\n );\n}\n","import {\n appendTransactionMessageInstruction,\n BaseTransactionMessage,\n} from '@solana/kit';\nimport { PROVISORY_COMPUTE_UNIT_LIMIT } from './constants';\nimport { getSetComputeUnitLimitInstruction } from './generated';\nimport { getSetComputeUnitLimitInstructionIndexAndUnits } from './internal';\n\n/**\n * Appends a `SetComputeUnitLimit` instruction with a provisory\n * compute unit limit to a given transaction message\n * if and only if it does not already have one.\n *\n * @example\n * ```ts\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 0 }),\n * fillProvisorySetComputeUnitLimitInstruction,\n * // ...\n * );\n * ```\n */\nexport function fillProvisorySetComputeUnitLimitInstruction<\n TTransactionMessage extends BaseTransactionMessage,\n>(transactionMessage: TTransactionMessage) {\n return updateOrAppendSetComputeUnitLimitInstruction(\n (previousUnits) =>\n previousUnits === null ? PROVISORY_COMPUTE_UNIT_LIMIT : previousUnits,\n transactionMessage\n );\n}\n\n/**\n * Updates the first `SetComputeUnitLimit` instruction in a transaction message\n * with the given units, or appends a new instruction if none exists.\n * A function of the current value can be provided instead of a static value.\n *\n * @param units - The new compute unit limit, or a function that takes the previous\n * compute unit limit and returns the new limit.\n * @param transactionMessage - The transaction message to update.\n *\n * @example\n * ```ts\n * const updatedTransactionMessage = updateOrAppendSetComputeUnitLimitInstruction(\n * // E.g. Keep the current limit if it is set, otherwise set it to the maximum.\n * (currentUnits) => currentUnits === null ? MAX_COMPUTE_UNIT_LIMIT : currentUnits,\n * transactionMessage,\n * );\n * ```\n */\nexport function updateOrAppendSetComputeUnitLimitInstruction<\n TTransactionMessage extends BaseTransactionMessage,\n>(\n units: number | ((previousUnits: number | null) => number),\n transactionMessage: TTransactionMessage\n): TTransactionMessage {\n const getUnits = (previousUnits: number | null): number =>\n typeof units === 'function' ? units(previousUnits) : units;\n const instructionDetails =\n getSetComputeUnitLimitInstructionIndexAndUnits(transactionMessage);\n\n if (!instructionDetails) {\n return appendTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({ units: getUnits(null) }),\n transactionMessage\n ) as unknown as TTransactionMessage;\n }\n\n const { index, units: previousUnits } = instructionDetails;\n const newUnits = getUnits(previousUnits);\n if (newUnits === previousUnits) {\n return transactionMessage;\n }\n\n const newInstruction = getSetComputeUnitLimitInstruction({ units: newUnits });\n const newInstructions = [...transactionMessage.instructions];\n newInstructions.splice(index, 1, newInstruction);\n return Object.freeze({\n ...transactionMessage,\n instructions: newInstructions,\n });\n}\n","import {\n BaseTransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/kit';\nimport {\n MAX_COMPUTE_UNIT_LIMIT,\n PROVISORY_COMPUTE_UNIT_LIMIT,\n} from './constants';\nimport {\n EstimateComputeUnitLimitFactoryFunction,\n EstimateComputeUnitLimitFactoryFunctionConfig,\n} from './estimateComputeLimitInternal';\nimport { getSetComputeUnitLimitInstructionIndexAndUnits } from './internal';\nimport { updateOrAppendSetComputeUnitLimitInstruction } from './setComputeLimit';\n\ntype EstimateAndUpdateProvisoryComputeUnitLimitFactoryFunction = <\n TTransactionMessage extends BaseTransactionMessage &\n TransactionMessageWithFeePayer,\n>(\n transactionMessage: TTransactionMessage,\n config?: EstimateComputeUnitLimitFactoryFunctionConfig\n) => Promise;\n\n/**\n * Given a transaction message, if it does not have an explicit compute unit limit,\n * estimates the compute unit limit and updates the transaction message with\n * the estimated limit. Otherwise, returns the transaction message unchanged.\n *\n * It requires a function that estimates the compute unit limit.\n *\n * @example\n * ```ts\n * const estimateAndUpdateCUs = estimateAndUpdateProvisoryComputeUnitLimitFactory(\n * estimateComputeUnitLimitFactory({ rpc })\n * );\n *\n * const transactionMessageWithCUs = await estimateAndUpdateCUs(transactionMessage);\n * ```\n *\n * @see {@link estimateAndUpdateProvisoryComputeUnitLimitFactory}\n */\nexport function estimateAndUpdateProvisoryComputeUnitLimitFactory(\n estimateComputeUnitLimit: EstimateComputeUnitLimitFactoryFunction\n): EstimateAndUpdateProvisoryComputeUnitLimitFactoryFunction {\n return async function fn(transactionMessage, config) {\n const instructionDetails =\n getSetComputeUnitLimitInstructionIndexAndUnits(transactionMessage);\n\n // If the transaction message already has a compute unit limit instruction\n // which is set to a specific value — i.e. not 0 or the maximum limit —\n // we don't need to estimate the compute unit limit.\n if (\n instructionDetails &&\n instructionDetails.units !== PROVISORY_COMPUTE_UNIT_LIMIT &&\n instructionDetails.units !== MAX_COMPUTE_UNIT_LIMIT\n ) {\n return transactionMessage;\n }\n\n return updateOrAppendSetComputeUnitLimitInstruction(\n await estimateComputeUnitLimit(transactionMessage, config),\n transactionMessage\n );\n };\n}\n","import {\n BaseTransactionMessage,\n Commitment,\n compileTransaction,\n getBase64EncodedWireTransaction,\n isSolanaError,\n isTransactionMessageWithDurableNonceLifetime,\n pipe,\n Rpc,\n SimulateTransactionApi,\n Slot,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SolanaError,\n Transaction,\n TransactionMessageWithFeePayer,\n} from '@solana/kit';\nimport { updateOrAppendSetComputeUnitLimitInstruction } from './setComputeLimit';\nimport { MAX_COMPUTE_UNIT_LIMIT } from './constants';\n\nexport type EstimateComputeUnitLimitFactoryConfig = Readonly<{\n /** An object that supports the {@link SimulateTransactionApi} of the Solana RPC API */\n rpc: Rpc;\n}>;\n\nexport type EstimateComputeUnitLimitFactoryFunction = (\n transactionMessage: BaseTransactionMessage & TransactionMessageWithFeePayer,\n config?: EstimateComputeUnitLimitFactoryFunctionConfig\n) => Promise;\n\nexport type EstimateComputeUnitLimitFactoryFunctionConfig = {\n abortSignal?: AbortSignal;\n /**\n * Compute the estimate as of the highest slot that has reached this level of commitment.\n *\n * @defaultValue Whichever default is applied by the underlying {@link RpcApi} in use. For\n * example, when using an API created by a `createSolanaRpc*()` helper, the default commitment\n * is `\"confirmed\"` unless configured otherwise. Unmitigated by an API layer on the client, the\n * default commitment applied by the server is `\"finalized\"`.\n */\n commitment?: Commitment;\n /**\n * Prevents accessing stale data by enforcing that the RPC node has processed transactions up to\n * this slot\n */\n minContextSlot?: Slot;\n};\n\ntype EstimateComputeUnitLimitConfig =\n EstimateComputeUnitLimitFactoryFunctionConfig &\n Readonly<{\n rpc: Rpc;\n transactionMessage: BaseTransactionMessage &\n TransactionMessageWithFeePayer;\n }>;\n\n/**\n * Simulates a transaction message on the network and returns the number of compute units it\n * consumed during simulation.\n *\n * The estimate this function returns can be used to set a compute unit limit on the transaction.\n * Correctly budgeting a compute unit limit for your transaction message can increase the probability\n * that your transaction will be accepted for processing.\n *\n * If you don't declare a compute unit limit on your transaction, validators will assume an upper\n * limit of 200K compute units (CU) per instruction. Since validators have an incentive to pack as\n * many transactions into each block as possible, they may choose to include transactions that they\n * know will fit into the remaining compute budget for the current block over transactions that\n * might not. For this reason, you should set a compute unit limit on each of your transaction\n * messages, whenever possible.\n *\n * ## Example\n *\n * ```ts\n * import { getSetComputeLimitInstruction } from '@solana-program/compute-budget';\n * import { createSolanaRpc, getComputeUnitEstimateForTransactionMessageFactory, pipe } from '@solana/kit';\n *\n * // Create an estimator function.\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const getComputeUnitEstimateForTransactionMessage =\n * getComputeUnitEstimateForTransactionMessageFactory({ rpc });\n *\n * // Create your transaction message.\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * /* ... *\\/\n * );\n *\n * // Request an estimate of the actual compute units this message will consume.\n * const computeUnitsEstimate =\n * await getComputeUnitEstimateForTransactionMessage(transactionMessage);\n *\n * // Set the transaction message's compute unit budget.\n * const transactionMessageWithComputeUnitLimit = prependTransactionMessageInstruction(\n * getSetComputeLimitInstruction({ units: computeUnitsEstimate }),\n * transactionMessage,\n * );\n * ```\n *\n * > [!WARNING]\n * > The compute unit estimate is just that – an estimate. The compute unit consumption of the\n * > actual transaction might be higher or lower than what was observed in simulation. Unless you\n * > are confident that your particular transaction message will consume the same or fewer compute\n * > units as was estimated, you might like to augment the estimate by either a fixed number of CUs\n * > or a multiplier.\n *\n * > [!NOTE]\n * > If you are preparing an _unsigned_ transaction, destined to be signed and submitted to the\n * > network by a wallet, you might like to leave it up to the wallet to determine the compute unit\n * > limit. Consider that the wallet might have a more global view of how many compute units certain\n * > types of transactions consume, and might be able to make better estimates of an appropriate\n * > compute unit budget.\n */\nexport async function estimateComputeUnitLimit({\n transactionMessage,\n ...configs\n}: EstimateComputeUnitLimitConfig): Promise {\n const replaceRecentBlockhash =\n !isTransactionMessageWithDurableNonceLifetime(transactionMessage);\n const transaction = pipe(\n transactionMessage,\n (m) =>\n updateOrAppendSetComputeUnitLimitInstruction(MAX_COMPUTE_UNIT_LIMIT, m),\n compileTransaction\n );\n\n return await simulateTransactionAndGetConsumedUnits({\n transaction,\n replaceRecentBlockhash,\n ...configs,\n });\n}\n\ntype SimulateTransactionAndGetConsumedUnitsConfig = Omit<\n EstimateComputeUnitLimitConfig,\n 'transactionMessage'\n> &\n Readonly<{ replaceRecentBlockhash?: boolean; transaction: Transaction }>;\n\nasync function simulateTransactionAndGetConsumedUnits({\n abortSignal,\n rpc,\n transaction,\n ...simulateConfig\n}: SimulateTransactionAndGetConsumedUnitsConfig): Promise {\n const wireTransactionBytes = getBase64EncodedWireTransaction(transaction);\n\n try {\n const {\n value: { err: transactionError, unitsConsumed },\n } = await rpc\n .simulateTransaction(wireTransactionBytes, {\n ...simulateConfig,\n encoding: 'base64',\n sigVerify: false,\n })\n .send({ abortSignal });\n if (unitsConsumed == null) {\n // This should never be hit, because all RPCs should support `unitsConsumed` by now.\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT\n );\n }\n // FIXME(https://github.com/anza-xyz/agave/issues/1295): The simulation response returns\n // compute units as a u64, but the `SetComputeLimit` instruction only accepts a u32. Until\n // this changes, downcast it.\n const downcastUnitsConsumed =\n unitsConsumed > 4_294_967_295n ? 4_294_967_295 : Number(unitsConsumed);\n if (transactionError) {\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n {\n cause: transactionError,\n unitsConsumed: downcastUnitsConsumed,\n }\n );\n }\n return downcastUnitsConsumed;\n } catch (e) {\n if (\n isSolanaError(\n e,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT\n )\n )\n throw e;\n throw new SolanaError(\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n { cause: e }\n );\n }\n}\n","import {\n estimateComputeUnitLimit,\n EstimateComputeUnitLimitFactoryConfig,\n EstimateComputeUnitLimitFactoryFunction,\n} from './estimateComputeLimitInternal';\n\n/**\n * Use this utility to estimate the actual compute unit cost of a given transaction message.\n *\n * Correctly budgeting a compute unit limit for your transaction message can increase the\n * probability that your transaction will be accepted for processing. If you don't declare a compute\n * unit limit on your transaction, validators will assume an upper limit of 200K compute units (CU)\n * per instruction.\n *\n * Since validators have an incentive to pack as many transactions into each block as possible, they\n * may choose to include transactions that they know will fit into the remaining compute budget for\n * the current block over transactions that might not. For this reason, you should set a compute\n * unit limit on each of your transaction messages, whenever possible.\n *\n * > [!WARNING]\n * > The compute unit estimate is just that -- an estimate. The compute unit consumption of the\n * > actual transaction might be higher or lower than what was observed in simulation. Unless you\n * > are confident that your particular transaction message will consume the same or fewer compute\n * > units as was estimated, you might like to augment the estimate by either a fixed number of CUs\n * > or a multiplier.\n *\n * > [!NOTE]\n * > If you are preparing an _unsigned_ transaction, destined to be signed and submitted to the\n * > network by a wallet, you might like to leave it up to the wallet to determine the compute unit\n * > limit. Consider that the wallet might have a more global view of how many compute units certain\n * > types of transactions consume, and might be able to make better estimates of an appropriate\n * > compute unit budget.\n *\n * > [!INFO]\n * > In the event that a transaction message does not already have a `SetComputeUnitLimit`\n * > instruction, this function will add one before simulation. This ensures that the compute unit\n * > consumption of the `SetComputeUnitLimit` instruction itself is included in the estimate.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { getSetComputeUnitLimitInstruction } from '@solana-program/compute-budget';\n * import { createSolanaRpc, estimateComputeUnitLimitFactory, pipe } from '@solana/kit';\n *\n * // Create an estimator function.\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const estimateComputeUnitLimit = estimateComputeUnitLimitFactory({ rpc });\n *\n * // Create your transaction message.\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * /* ... *\\/\n * );\n *\n * // Request an estimate of the actual compute units this message will consume. This is done by\n * // simulating the transaction and grabbing the estimated compute units from the result.\n * const estimatedUnits = await estimateComputeUnitLimit(transactionMessage);\n *\n * // Set the transaction message's compute unit budget.\n * const transactionMessageWithComputeUnitLimit = prependTransactionMessageInstruction(\n * getSetComputeUnitLimitInstruction({ units: estimatedUnits }),\n * transactionMessage,\n * );\n * ```\n */\nexport function estimateComputeUnitLimitFactory({\n rpc,\n}: EstimateComputeUnitLimitFactoryConfig): EstimateComputeUnitLimitFactoryFunction {\n return async function estimateComputeUnitLimitFactoryFunction(\n transactionMessage,\n config\n ) {\n return await estimateComputeUnitLimit({\n ...config,\n rpc,\n transactionMessage,\n });\n };\n}\n","import {\n appendTransactionMessageInstruction,\n BaseTransactionMessage,\n MicroLamports,\n} from '@solana/kit';\nimport { getSetComputeUnitPriceInstruction } from './generated';\nimport { getSetComputeUnitPriceInstructionIndexAndMicroLamports } from './internal';\n\n/**\n * Sets the compute unit price of a transaction message in micro-Lamports.\n *\n * @example\n * ```ts\n * const transactionMessage = pipe(\n * createTransactionMessage({ version: 0 }),\n * (m) => setTransactionMessageComputeUnitPrice(10_000, m),\n * // ...\n * );\n * ```\n */\nexport function setTransactionMessageComputeUnitPrice<\n TTransactionMessage extends BaseTransactionMessage,\n>(microLamports: number | bigint, transactionMessage: TTransactionMessage) {\n return appendTransactionMessageInstruction(\n getSetComputeUnitPriceInstruction({ microLamports }),\n transactionMessage\n );\n}\n\n/**\n * Updates the first `SetComputeUnitPrice` instruction in a transaction message\n * with the given micro-Lamports, or appends a new instruction if none exists.\n * A function of the current value can be provided instead of a static value.\n *\n * @param microLamports - The new compute unit price, or a function that\n * takes the previous price and returns the new one.\n * @param transactionMessage - The transaction message to update.\n *\n * @example\n * ```ts\n * const updatedTransactionMessage = updateOrAppendSetComputeUnitPriceInstruction(\n * // E.g. double the current price or set it to 10_000 if it isn't set.\n * (currentPrice) => currentPrice === null ? 10_000 : currentPrice * 2,\n * transactionMessage,\n * );\n * ```\n */\nexport function updateOrAppendSetComputeUnitPriceInstruction<\n TTransactionMessage extends BaseTransactionMessage,\n>(\n microLamports:\n | MicroLamports\n | ((previousMicroLamports: MicroLamports | null) => MicroLamports),\n transactionMessage: TTransactionMessage\n): TTransactionMessage {\n const getMicroLamports = (\n previousMicroLamports: MicroLamports | null\n ): MicroLamports =>\n typeof microLamports === 'function'\n ? microLamports(previousMicroLamports)\n : microLamports;\n const instructionDetails =\n getSetComputeUnitPriceInstructionIndexAndMicroLamports(transactionMessage);\n\n if (!instructionDetails) {\n return appendTransactionMessageInstruction(\n getSetComputeUnitPriceInstruction({\n microLamports: getMicroLamports(null),\n }),\n transactionMessage\n ) as unknown as TTransactionMessage;\n }\n\n const { index, microLamports: previousMicroLamports } = instructionDetails;\n const newMicroLamports = getMicroLamports(previousMicroLamports);\n if (newMicroLamports === previousMicroLamports) {\n return transactionMessage;\n }\n\n const newInstruction = getSetComputeUnitPriceInstruction({\n microLamports: newMicroLamports,\n });\n const newInstructions = [...transactionMessage.instructions];\n newInstructions.splice(index, 1, newInstruction);\n return Object.freeze({\n ...transactionMessage,\n instructions: newInstructions,\n });\n}\n","import {\n getSetComputeUnitLimitInstruction,\n setTransactionMessageComputeUnitPrice,\n} from \"@solana-program/compute-budget\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport {\n fetchMint,\n findAssociatedTokenPda,\n getTransferCheckedInstruction,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from \"@solana-program/token-2022\";\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n getBase64EncodedWireTransaction,\n partiallySignTransactionMessageWithSigners,\n pipe,\n prependTransactionMessageInstruction,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n type Address,\n} from \"@solana/kit\";\nimport type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@x402/core/types\";\nimport {\n DEFAULT_COMPUTE_UNIT_LIMIT,\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n MEMO_PROGRAM_ADDRESS,\n} from \"../../constants\";\nimport type { ClientSvmConfig, ClientSvmSigner } from \"../../signer\";\nimport type { ExactSvmPayloadV2 } from \"../../types\";\nimport { createRpcClient } from \"../../utils\";\n\n/**\n * SVM client implementation for the Exact payment scheme.\n */\nexport class ExactSvmScheme implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactSvmClient instance.\n *\n * @param signer - The SVM signer for client operations\n * @param config - Optional configuration with custom RPC URL\n * @returns ExactSvmClient instance\n */\n constructor(\n private readonly signer: ClientSvmSigner,\n private readonly config?: ClientSvmConfig,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise> {\n const rpc = createRpcClient(paymentRequirements.network, this.config?.rpcUrl);\n\n const tokenMint = await fetchMint(rpc, paymentRequirements.asset as Address);\n const tokenProgramAddress = tokenMint.programAddress;\n\n if (\n tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&\n tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n throw new Error(\"Asset was not created by a known token program\");\n }\n\n const [sourceATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: this.signer.address,\n tokenProgram: tokenProgramAddress,\n });\n\n const [destinationATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: paymentRequirements.payTo as Address,\n tokenProgram: tokenProgramAddress,\n });\n\n const transferIx = getTransferCheckedInstruction(\n {\n source: sourceATA,\n mint: paymentRequirements.asset as Address,\n destination: destinationATA,\n authority: this.signer,\n amount: BigInt(paymentRequirements.amount),\n decimals: tokenMint.data.decimals,\n },\n { programAddress: tokenProgramAddress },\n );\n\n // Facilitator must provide feePayer to cover transaction fees\n const feePayer = paymentRequirements.extra?.feePayer as Address;\n if (!feePayer) {\n throw new Error(\"feePayer is required in paymentRequirements.extra for SVM transactions\");\n }\n\n const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();\n\n const nonce = crypto.getRandomValues(new Uint8Array(16));\n const memoIx = {\n programAddress: MEMO_PROGRAM_ADDRESS as Address,\n accounts: [] as const,\n data: new TextEncoder().encode(\n Array.from(nonce)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n ),\n };\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx),\n tx => setTransactionMessageFeePayer(feePayer, tx),\n tx =>\n prependTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }),\n tx,\n ),\n tx => appendTransactionMessageInstructions([transferIx, memoIx], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n );\n\n const signedTransaction = await partiallySignTransactionMessageWithSigners(tx);\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);\n\n const payload: ExactSvmPayloadV2 = {\n transaction: base64EncodedWireTransaction,\n };\n\n return {\n x402Version,\n payload,\n };\n }\n}\n","/**\n * V1 exports for the SVM mechanism\n */\nexport { ExactSvmSchemeV1 } from \"../exact/v1\";\n\nexport const NETWORKS: string[] = [\"solana\", \"solana-devnet\", \"solana-testnet\"];\n","import {\n getSetComputeUnitLimitInstruction,\n setTransactionMessageComputeUnitPrice,\n} from \"@solana-program/compute-budget\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport {\n fetchMint,\n findAssociatedTokenPda,\n getTransferCheckedInstruction,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from \"@solana-program/token-2022\";\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n getBase64EncodedWireTransaction,\n partiallySignTransactionMessageWithSigners,\n pipe,\n prependTransactionMessageInstruction,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n type Address,\n} from \"@solana/kit\";\nimport type {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport type { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport {\n DEFAULT_COMPUTE_UNIT_LIMIT,\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n MEMO_PROGRAM_ADDRESS,\n} from \"../../../constants\";\nimport type { ClientSvmConfig, ClientSvmSigner } from \"../../../signer\";\nimport type { ExactSvmPayloadV1 } from \"../../../types\";\nimport { createRpcClient } from \"../../../utils\";\n\n/**\n * SVM client implementation for the Exact payment scheme (V1).\n */\nexport class ExactSvmSchemeV1 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactSvmClientV1 instance.\n *\n * @param signer - The SVM signer for client operations\n * @param config - Optional configuration with custom RPC URL\n * @returns ExactSvmClientV1 instance\n */\n constructor(\n private readonly signer: ClientSvmSigner,\n private readonly config?: ClientSvmConfig,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme (V1).\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<\n Pick & { scheme: string; network: Network }\n > {\n const selectedV1 = paymentRequirements as unknown as PaymentRequirementsV1;\n const rpc = createRpcClient(selectedV1.network, this.config?.rpcUrl);\n\n const tokenMint = await fetchMint(rpc, selectedV1.asset as Address);\n const tokenProgramAddress = tokenMint.programAddress;\n\n if (\n tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&\n tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n throw new Error(\"Asset was not created by a known token program\");\n }\n\n const [sourceATA] = await findAssociatedTokenPda({\n mint: selectedV1.asset as Address,\n owner: this.signer.address,\n tokenProgram: tokenProgramAddress,\n });\n\n const [destinationATA] = await findAssociatedTokenPda({\n mint: selectedV1.asset as Address,\n owner: selectedV1.payTo as Address,\n tokenProgram: tokenProgramAddress,\n });\n\n const transferIx = getTransferCheckedInstruction(\n {\n source: sourceATA,\n mint: selectedV1.asset as Address,\n destination: destinationATA,\n authority: this.signer,\n amount: BigInt(selectedV1.maxAmountRequired),\n decimals: tokenMint.data.decimals,\n },\n { programAddress: tokenProgramAddress },\n );\n\n // Facilitator must provide feePayer to cover transaction fees\n const feePayer = selectedV1.extra?.feePayer as Address;\n if (!feePayer) {\n throw new Error(\"feePayer is required in paymentRequirements.extra for SVM transactions\");\n }\n\n const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();\n\n const nonce = crypto.getRandomValues(new Uint8Array(16));\n const memoIx = {\n programAddress: MEMO_PROGRAM_ADDRESS as Address,\n accounts: [] as const,\n data: new TextEncoder().encode(\n Array.from(nonce)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n ),\n };\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx),\n tx => setTransactionMessageFeePayer(feePayer, tx),\n tx =>\n prependTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }),\n tx,\n ),\n tx => appendTransactionMessageInstructions([transferIx, memoIx], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n );\n\n const signedTransaction = await partiallySignTransactionMessageWithSigners(tx);\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);\n\n const payload: ExactSvmPayloadV1 = {\n transaction: base64EncodedWireTransaction,\n };\n\n return {\n x402Version,\n scheme: selectedV1.scheme,\n network: selectedV1.network,\n payload,\n };\n }\n}\n","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@x402/core/client\";\nimport { Network } from \"@x402/core/types\";\nimport { ClientSvmSigner } from \"../../signer\";\nimport { ExactSvmScheme } from \"./scheme\";\nimport { ExactSvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering SVM schemes to an x402Client\n */\nexport interface SvmClientConfig {\n /**\n * The SVM signer to use for creating payment payloads\n */\n signer: ClientSvmSigner;\n\n /**\n * Optional payment requirements selector function\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional specific networks to register\n */\n networks?: Network[];\n}\n\n/**\n * Registers SVM payment schemes to an existing x402Client instance.\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for SVM client registration\n * @returns The client instance for chaining\n */\nexport function registerExactSvmScheme(client: x402Client, config: SvmClientConfig): x402Client {\n // Register V2 scheme\n if (config.networks && config.networks.length > 0) {\n config.networks.forEach(network => {\n client.register(network, new ExactSvmScheme(config.signer));\n });\n } else {\n client.register(\"solana:*\", new ExactSvmScheme(config.signer));\n }\n\n // Register all V1 networks\n NETWORKS.forEach(network => {\n client.registerV1(network as Network, new ExactSvmSchemeV1(config.signer));\n });\n\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * Local x402 Proxy Server\n *\n * Sits between OpenClaw's pi-ai (which makes standard OpenAI-format requests)\n * and BlockRun's API (which requires x402 micropayments).\n *\n * Flow:\n * pi-ai → http://localhost:{port}/v1/chat/completions\n * → proxy forwards to https://blockrun.ai/api/v1/chat/completions\n * → gets 402 → @x402/fetch signs payment → retries\n * → streams response back to pi-ai\n *\n * Optimizations (v0.3.0):\n * - SSE heartbeat: for streaming requests, sends headers + heartbeat immediately\n * before the x402 flow, preventing OpenClaw's 10-15s timeout from firing.\n * - Response dedup: hashes request bodies and caches responses for 30s,\n * preventing double-charging when OpenClaw retries after timeout.\n * - Smart routing: when model is \"blockrun/auto\", classify query and pick cheapest model.\n * - Usage logging: log every request as JSON line to ~/.openclaw/blockrun/logs/\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\n\n// Per-request payment tracking via AsyncLocalStorage (safe for concurrent requests).\n// The x402 onAfterPaymentCreation hook writes the actual payment amount into the\n// request-scoped store, and the logging code reads it after payFetch completes.\nconst paymentStore = new AsyncLocalStorage<{ amountUsd: number }>();\nimport { finished } from \"node:stream\";\nimport type { AddressInfo } from \"node:net\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdir, writeFile, readFile, stat as fsStat } from \"node:fs/promises\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { createPublicClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { x402Client } from \"@x402/fetch\";\nimport { createPayFetchWithPreAuth } from \"./payment-preauth.js\";\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { toClientEvmSigner } from \"@x402/evm\";\nimport {\n route,\n getFallbackChain,\n getFallbackChainFiltered,\n filterByToolCalling,\n filterByVision,\n filterByExcludeList,\n calculateModelCost,\n DEFAULT_ROUTING_CONFIG,\n type RouterOptions,\n type RoutingDecision,\n type RoutingConfig,\n type ModelPricing,\n type Tier,\n} from \"./router/index.js\";\nimport { classifyByRules } from \"./router/rules.js\";\nimport {\n BLOCKRUN_MODELS,\n OPENCLAW_MODELS,\n resolveModelAlias,\n getModelContextWindow,\n isReasoningModel,\n supportsToolCalling,\n supportsVision,\n getActivePromoPrice,\n} from \"./models.js\";\nimport { logUsage, type UsageEntry } from \"./logger.js\";\nimport { getStats, clearStats } from \"./stats.js\";\nimport { RequestDeduplicator } from \"./dedup.js\";\nimport { ResponseCache, type ResponseCacheConfig } from \"./response-cache.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport type { SolanaBalanceMonitor } from \"./solana-balance.js\";\n\n/** Union type for chain-agnostic balance monitoring */\ntype AnyBalanceMonitor = BalanceMonitor | SolanaBalanceMonitor;\nimport { resolvePaymentChain } from \"./auth.js\";\nimport type { WalletResolution } from \"./auth.js\";\nimport { OnchainOsAdapter } from \"./onchainos-adapter.js\";\nimport { createOnchainosPayFetch } from \"./okx-x402-fetch.js\";\nimport { compressContext, shouldCompress, type NormalizedMessage } from \"./compression/index.js\";\n// Error classes available for programmatic use but not used in proxy\n// (universal free fallback means we don't throw balance errors anymore)\n// import { InsufficientFundsError, EmptyWalletError } from \"./errors.js\";\nimport { USER_AGENT, VERSION } from \"./version.js\";\nimport {\n SessionStore,\n getSessionId,\n deriveSessionId,\n hashRequestContent,\n type SessionConfig,\n} from \"./session.js\";\nimport { checkForUpdates } from \"./updater.js\";\nimport { loadExcludeList } from \"./exclude-models.js\";\nimport { PROXY_PORT } from \"./config.js\";\nimport { SessionJournal } from \"./journal.js\";\nimport { applyUpstreamProxy } from \"./upstream-proxy.js\";\nimport { extractTextualToolCalls } from \"./textual-tool-calls.js\";\n\nconst BLOCKRUN_API = \"https://blockrun.ai/api\";\nconst BLOCKRUN_SOLANA_API = \"https://sol.blockrun.ai/api\";\nconst IMAGE_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"images\");\nconst AUDIO_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"audio\");\nconst VIDEO_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"videos\");\n// Routing profile models - virtual models that trigger intelligent routing\nconst AUTO_MODEL = \"blockrun/auto\";\n\nconst ROUTING_PROFILES = new Set([\n \"blockrun/eco\",\n \"eco\",\n \"blockrun/auto\",\n \"auto\",\n \"blockrun/premium\",\n \"premium\",\n]);\n// Default free model first (auto-pick order). gpt-oss-120b is the historical\n// default — heavy users rely on it. New entries appended in chain order.\nconst FREE_MODELS = new Set([\n \"free/gpt-oss-120b\",\n \"free/gpt-oss-20b\",\n \"free/mistral-small-4-119b\", // 114 tok/s — fastest free chat\n \"free/deepseek-v4-pro\", // 1M ctx, MMLU-Pro 87.5 — strongest free reasoning\n \"free/deepseek-v4-flash\", // 1M ctx, ~5x faster than v4-pro\n \"free/qwen3-next-80b-a3b-thinking\", // 116 tok/s reasoning\n \"free/qwen3-coder-480b\",\n \"free/glm-4.7\",\n \"free/llama-4-maverick\",\n \"free/nemotron-3-nano-omni-30b-a3b-reasoning\", // first vision-capable free\n]);\n/** Pick the best available free model that isn't excluded. */\nfunction pickFreeModel(excludeList?: Set): string | undefined {\n for (const m of FREE_MODELS) {\n if (!excludeList?.has(m)) return m;\n }\n return undefined; // all free models excluded\n}\n// Keep backward-compat constant for places that don't have excludeList in scope\nconst FREE_MODEL = \"free/gpt-oss-120b\";\n/**\n * Map free/xxx model IDs to nvidia/xxx for upstream BlockRun API.\n * The \"free/\" prefix is a XClawRouter convention for the /model picker;\n * BlockRun server expects \"nvidia/\" prefix.\n */\nfunction toUpstreamModelId(modelId: string): string {\n if (modelId.startsWith(\"free/\")) {\n return \"nvidia/\" + modelId.slice(\"free/\".length);\n }\n return modelId;\n}\nconst MAX_MESSAGES = 200; // BlockRun API limit - truncate older messages if exceeded\nconst CONTEXT_LIMIT_KB = 5120; // Server-side limit: 5MB in KB\nconst HEARTBEAT_INTERVAL_MS = 2_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 180_000; // 3 minutes (allows for on-chain tx + LLM response)\nconst PER_MODEL_TIMEOUT_MS = 60_000; // 60s per individual model attempt (fallback to next on exceed)\nconst MAX_FALLBACK_ATTEMPTS = 5; // Maximum models to try in fallback chain (increased from 3 to ensure cheap models are tried)\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000; // Timeout for checking existing proxy\nconst RATE_LIMIT_COOLDOWN_MS = 60_000; // 60 seconds cooldown for rate-limited models\nconst OVERLOAD_COOLDOWN_MS = 15_000; // 15 seconds cooldown for overloaded providers\nconst PORT_RETRY_ATTEMPTS = 5; // Max attempts to bind port (handles TIME_WAIT)\nconst PORT_RETRY_DELAY_MS = 1_000; // Delay between retry attempts\nconst MODEL_BODY_READ_TIMEOUT_MS = 300_000; // 5 minutes for model responses (reasoning models are slow)\nconst ERROR_BODY_READ_TIMEOUT_MS = 30_000; // 30 seconds for error/partner body reads\n\nasync function readBodyWithTimeout(\n body: ReadableStream | null,\n timeoutMs: number = MODEL_BODY_READ_TIMEOUT_MS,\n): Promise {\n if (!body) return [];\n\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n\n let timer: ReturnType | undefined;\n try {\n while (true) {\n const result = await Promise.race([\n reader.read(),\n new Promise((_, reject) => {\n timer = setTimeout(() => reject(new Error(\"Body read timeout\")), timeoutMs);\n }),\n ]);\n clearTimeout(timer);\n if (result.done) break;\n chunks.push(result.value);\n }\n } finally {\n clearTimeout(timer);\n reader.releaseLock();\n }\n\n return chunks;\n}\n\n/**\n * Transform upstream payment errors into user-friendly messages.\n * Parses the raw x402 error and formats it nicely.\n */\nexport function transformPaymentError(errorBody: string): string {\n try {\n // Try to parse the error JSON\n const parsed = JSON.parse(errorBody) as {\n error?: string;\n details?: string;\n // blockrun-sol (Solana) format uses code+debug instead of details\n code?: string;\n debug?: string;\n payer?: string;\n };\n\n // Check if this is a payment verification error\n if (parsed.error === \"Payment verification failed\" && parsed.details) {\n // Extract the nested JSON from details\n // Format: \"Verification failed: {json}\\n\"\n const match = parsed.details.match(/Verification failed:\\s*(\\{.*\\})/s);\n if (match) {\n const innerJson = JSON.parse(match[1]) as {\n invalidMessage?: string;\n invalidReason?: string;\n payer?: string;\n };\n\n if (innerJson.invalidReason === \"insufficient_funds\" && innerJson.invalidMessage) {\n // Parse \"insufficient balance: 251 < 11463\"\n const balanceMatch = innerJson.invalidMessage.match(\n /insufficient balance:\\s*(\\d+)\\s*<\\s*(\\d+)/i,\n );\n if (balanceMatch) {\n const currentMicros = parseInt(balanceMatch[1], 10);\n const requiredMicros = parseInt(balanceMatch[2], 10);\n const currentUSD = (currentMicros / 1_000_000).toFixed(6);\n const requiredUSD = (requiredMicros / 1_000_000).toFixed(6);\n const wallet = innerJson.payer || \"unknown\";\n const shortWallet =\n wallet.length > 12 ? `${wallet.slice(0, 6)}...${wallet.slice(-4)}` : wallet;\n\n return JSON.stringify({\n error: {\n message: `Insufficient USDC balance. Current: $${currentUSD}, Required: ~$${requiredUSD}`,\n type: \"insufficient_funds\",\n wallet: wallet,\n current_balance_usd: currentUSD,\n required_usd: requiredUSD,\n help: `Fund wallet ${shortWallet} with USDC on Base, or use free model: /model free`,\n },\n });\n }\n }\n\n // Handle invalid_payload errors (signature issues, malformed payment)\n if (innerJson.invalidReason === \"invalid_payload\") {\n return JSON.stringify({\n error: {\n message: \"Payment signature invalid. This may be a temporary issue.\",\n type: \"invalid_payload\",\n help: \"Try again. If this persists, reinstall XClawRouter: curl -fsSL https://blockrun.ai/xclawrouter-update | bash\",\n },\n });\n }\n\n // Handle transaction simulation failures (Solana on-chain validation)\n if (innerJson.invalidReason === \"transaction_simulation_failed\") {\n console.error(\n `[XClawRouter] Solana transaction simulation failed: ${innerJson.invalidMessage || \"unknown\"}`,\n );\n return JSON.stringify({\n error: {\n message: \"Solana payment simulation failed. Retrying with a different model.\",\n type: \"transaction_simulation_failed\",\n help: \"This is usually temporary. If it persists, check your Solana USDC balance or try: /model free\",\n },\n });\n }\n }\n }\n\n // Handle code=PAYMENT_INVALID + debug format (used by blockrun-sol, can also\n // appear from blockrun Base when CDP returns non-200 with structured JSON body)\n if (\n parsed.error === \"Payment verification failed\" &&\n parsed.code === \"PAYMENT_INVALID\" &&\n parsed.debug\n ) {\n const debugLower = parsed.debug.toLowerCase();\n const wallet = parsed.payer || \"unknown\";\n const shortWallet =\n wallet.length > 12 ? `${wallet.slice(0, 6)}...${wallet.slice(-4)}` : wallet;\n // Detect chain from payer address format (0x = EVM, else Solana)\n const chain = wallet.startsWith(\"0x\") ? \"Base\" : \"Solana\";\n\n if (debugLower.includes(\"insufficient\")) {\n return JSON.stringify({\n error: {\n message: `Insufficient ${chain} USDC balance.`,\n type: \"insufficient_funds\",\n wallet,\n help:\n chain === \"Solana\"\n ? `Fund wallet ${shortWallet} with USDC on Solana, or switch to Base: /wallet base`\n : `Fund wallet ${shortWallet} with USDC on Base, or use free model: /model free`,\n },\n });\n }\n\n if (\n debugLower.includes(\"transaction_simulation_failed\") ||\n debugLower.includes(\"simulation\")\n ) {\n console.error(`[XClawRouter] ${chain} transaction simulation failed: ${parsed.debug}`);\n return JSON.stringify({\n error: {\n message: `${chain} payment simulation failed. Retrying with a different model.`,\n type: \"transaction_simulation_failed\",\n help: \"This is usually temporary. If it persists, try: /model free\",\n },\n });\n }\n\n if (debugLower.includes(\"invalid signature\") || debugLower.includes(\"invalid_signature\")) {\n return JSON.stringify({\n error: {\n message: `${chain} payment signature invalid.`,\n type: \"invalid_payload\",\n help: \"Try again. If this persists, reinstall XClawRouter: curl -fsSL https://blockrun.ai/xclawrouter-update | bash\",\n },\n });\n }\n\n if (debugLower.includes(\"expired\")) {\n return JSON.stringify({\n error: {\n message: `${chain} payment expired. Retrying.`,\n type: \"expired\",\n help: \"This is usually temporary.\",\n },\n });\n }\n\n // Unknown verification error — surface the debug reason\n console.error(\n `[XClawRouter] ${chain} payment verification failed: ${parsed.debug} payer=${wallet}`,\n );\n return JSON.stringify({\n error: {\n message: `${chain} payment verification failed: ${parsed.debug}`,\n type: \"payment_invalid\",\n wallet,\n help:\n chain === \"Solana\"\n ? \"Try again or switch to Base: /wallet base\"\n : \"Try again. If this persists, try: /model free\",\n },\n });\n }\n\n // Handle settlement failures (gas estimation, on-chain errors)\n if (\n parsed.error === \"Settlement failed\" ||\n parsed.error === \"Payment settlement failed\" ||\n parsed.details?.includes(\"Settlement failed\") ||\n parsed.details?.includes(\"transaction_simulation_failed\")\n ) {\n const details = parsed.details || \"\";\n const gasError = details.includes(\"unable to estimate gas\");\n\n return JSON.stringify({\n error: {\n message: gasError\n ? \"Payment failed: network congestion or gas issue. Try again.\"\n : \"Payment settlement failed. Try again in a moment.\",\n type: \"settlement_failed\",\n help: \"This is usually temporary. If it persists, try: /model free\",\n },\n });\n }\n } catch {\n // If parsing fails, return original\n }\n return errorBody;\n}\n\n/**\n * Semantic error categories from upstream provider responses.\n * Used to distinguish auth failures from rate limits from server errors\n * so each category can be handled independently without cross-contamination.\n */\nexport type ErrorCategory =\n | \"auth_failure\" // 401, 403: Wrong key or forbidden — don't retry with same key\n | \"quota_exceeded\" // 403 with plan/quota body: Plan limit hit\n | \"rate_limited\" // 429: Actual throttling — 60s cooldown\n | \"overloaded\" // 529, 503+overload body: Provider capacity — 15s cooldown\n | \"server_error\" // 5xx general: Transient — fallback immediately\n | \"payment_error\" // 402: x402 payment or funds issue\n | \"config_error\"; // 400, 413: Bad request content — skip this model\n\n/**\n * Classify an upstream error response into a semantic category.\n * Returns null if the status+body is not a provider-side issue worth retrying.\n */\nexport function categorizeError(status: number, body: string): ErrorCategory | null {\n if (status === 401) return \"auth_failure\";\n if (status === 402) return \"payment_error\";\n if (status === 403) {\n if (/plan.*limit|quota.*exceeded|subscription|allowance/i.test(body)) return \"quota_exceeded\";\n return \"auth_failure\"; // generic 403 = forbidden = likely auth issue\n }\n if (status === 429) return \"rate_limited\";\n if (status === 529) return \"overloaded\";\n if (status === 503 && /overload|capacity|too.*many.*request/i.test(body)) return \"overloaded\";\n if (status >= 500) return \"server_error\";\n if (status === 400 || status === 413) {\n // Only fallback on content-size or billing patterns; bare 400 = our bug, don't cycle\n if (PROVIDER_ERROR_PATTERNS.some((p) => p.test(body))) return \"config_error\";\n return null;\n }\n return null;\n}\n\n/**\n * Track rate-limited models to avoid hitting them again.\n * Maps model ID to the timestamp when the rate limit was hit.\n */\nconst rateLimitedModels = new Map();\n\n/** Per-model overload tracking (529/503 capacity errors) — shorter cooldown than rate limits. */\nconst overloadedModels = new Map();\n\n/** Per-model error category counts (in-memory, resets on restart). */\ntype ProviderErrorCounts = {\n auth_failure: number;\n quota_exceeded: number;\n rate_limited: number;\n overloaded: number;\n server_error: number;\n payment_error: number;\n config_error: number;\n};\nconst perProviderErrors = new Map();\n\n/** Record an error category hit for a model. */\nfunction recordProviderError(modelId: string, category: ErrorCategory): void {\n if (!perProviderErrors.has(modelId)) {\n perProviderErrors.set(modelId, {\n auth_failure: 0,\n quota_exceeded: 0,\n rate_limited: 0,\n overloaded: 0,\n server_error: 0,\n payment_error: 0,\n config_error: 0,\n });\n }\n perProviderErrors.get(modelId)![category]++;\n}\n\n/**\n * Check if a model is currently rate-limited (in cooldown period).\n */\nfunction isRateLimited(modelId: string): boolean {\n const hitTime = rateLimitedModels.get(modelId);\n if (!hitTime) return false;\n\n const elapsed = Date.now() - hitTime;\n if (elapsed >= RATE_LIMIT_COOLDOWN_MS) {\n rateLimitedModels.delete(modelId);\n return false;\n }\n return true;\n}\n\n/**\n * Mark a model as rate-limited.\n */\nfunction markRateLimited(modelId: string): void {\n rateLimitedModels.set(modelId, Date.now());\n console.log(`[XClawRouter] Model ${modelId} rate-limited, will deprioritize for 60s`);\n}\n\n/**\n * Mark a model as temporarily overloaded (529/503 capacity).\n * Shorter cooldown than rate limits since capacity restores quickly.\n */\nfunction markOverloaded(modelId: string): void {\n overloadedModels.set(modelId, Date.now());\n console.log(`[XClawRouter] Model ${modelId} overloaded, will deprioritize for 15s`);\n}\n\n/** Check if a model is in its overload cooldown period. */\nfunction isOverloaded(modelId: string): boolean {\n const hitTime = overloadedModels.get(modelId);\n if (!hitTime) return false;\n if (Date.now() - hitTime >= OVERLOAD_COOLDOWN_MS) {\n overloadedModels.delete(modelId);\n return false;\n }\n return true;\n}\n\n/**\n * Reorder models to put rate-limited ones at the end.\n */\nfunction prioritizeNonRateLimited(models: string[]): string[] {\n const available: string[] = [];\n const degraded: string[] = [];\n\n for (const model of models) {\n if (isRateLimited(model) || isOverloaded(model)) {\n degraded.push(model);\n } else {\n available.push(model);\n }\n }\n\n return [...available, ...degraded];\n}\n\n/**\n * Check if response socket is writable (prevents write-after-close errors).\n * Returns true only if all conditions are safe for writing.\n */\nfunction canWrite(res: ServerResponse): boolean {\n return (\n !res.writableEnded &&\n !res.destroyed &&\n res.socket !== null &&\n !res.socket.destroyed &&\n res.socket.writable\n );\n}\n\n/**\n * Safe write with backpressure handling.\n * Returns true if write succeeded, false if socket is closed or write failed.\n */\nfunction safeWrite(res: ServerResponse, data: string | Buffer): boolean {\n if (!canWrite(res)) {\n const bytes = typeof data === \"string\" ? Buffer.byteLength(data) : data.length;\n console.warn(`[XClawRouter] safeWrite: socket not writable, dropping ${bytes} bytes`);\n return false;\n }\n return res.write(data);\n}\n\n// Extra buffer for balance check (on top of estimateAmount's 20% buffer)\n// Total effective buffer: 1.2 * 1.5 = 1.8x (80% safety margin)\n// This prevents x402 payment failures after streaming headers are sent,\n// which would trigger OpenClaw's 5-24 hour billing cooldown.\nconst BALANCE_CHECK_BUFFER = 1.5;\n\n/**\n * Get the proxy port from pre-loaded configuration.\n * Port is validated at module load time, this just returns the cached value.\n */\nexport function getProxyPort(): number {\n return PROXY_PORT;\n}\n\n/**\n * Check if a proxy is already running on the given port.\n * Returns the wallet address if running, undefined otherwise.\n */\nasync function checkExistingProxy(\n port: number,\n): Promise<{ wallet: string; paymentChain?: string } | undefined> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`, {\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (response.ok) {\n const data = (await response.json()) as {\n status?: string;\n wallet?: string;\n paymentChain?: string;\n };\n if (data.status === \"ok\" && data.wallet) {\n return { wallet: data.wallet, paymentChain: data.paymentChain };\n }\n }\n return undefined;\n } catch {\n clearTimeout(timeoutId);\n return undefined;\n }\n}\n\n/**\n * Error patterns that indicate a provider-side issue (not user's fault).\n * These errors should trigger fallback to the next model in the chain.\n */\nconst PROVIDER_ERROR_PATTERNS = [\n /billing/i,\n /insufficient.*balance/i,\n /credits/i,\n /quota.*exceeded/i,\n /rate.*limit/i,\n /model.*unavailable/i,\n /model.*not.*available/i,\n /service.*unavailable/i,\n /capacity/i,\n /overloaded/i,\n /temporarily.*unavailable/i,\n /api.*key.*invalid/i,\n /authentication.*failed/i,\n /request too large/i,\n /request.*size.*exceeds/i,\n /payload too large/i,\n /payment.*verification.*failed/i,\n /model.*not.*allowed/i,\n /unknown.*model/i,\n /reasoning_content.*missing/i, // Thinking model multi-turn: missing reasoning_content → fallback\n /thinking.*reasoning_content/i,\n];\n\n/**\n * \"Successful\" response bodies that are actually provider degradation placeholders.\n * Some upstream providers occasionally return these with HTTP 200.\n */\nconst DEGRADED_RESPONSE_PATTERNS = [\n /the ai service is temporarily overloaded/i,\n /service is temporarily overloaded/i,\n /please try again in a moment/i,\n];\n\n/**\n * Known low-quality loop signatures seen during provider degradation windows.\n */\nconst DEGRADED_LOOP_PATTERNS = [\n /the boxed is the response\\./i,\n /the response is the text\\./i,\n /the final answer is the boxed\\./i,\n];\n\nfunction extractAssistantContent(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") return undefined;\n const record = payload as Record;\n const choices = record.choices;\n if (!Array.isArray(choices) || choices.length === 0) return undefined;\n\n const firstChoice = choices[0];\n if (!firstChoice || typeof firstChoice !== \"object\") return undefined;\n const choice = firstChoice as Record;\n const message = choice.message;\n if (!message || typeof message !== \"object\") return undefined;\n const content = (message as Record).content;\n return typeof content === \"string\" ? content : undefined;\n}\n\nfunction hasKnownLoopSignature(text: string): boolean {\n const matchCount = DEGRADED_LOOP_PATTERNS.reduce(\n (count, pattern) => (pattern.test(text) ? count + 1 : count),\n 0,\n );\n if (matchCount >= 2) return true;\n\n // Generic repetitive loop fallback for short repeated lines.\n const lines = text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n if (lines.length < 8) return false;\n\n const counts = new Map();\n for (const line of lines) {\n counts.set(line, (counts.get(line) ?? 0) + 1);\n }\n\n const maxRepeat = Math.max(...counts.values());\n const uniqueRatio = counts.size / lines.length;\n return maxRepeat >= 3 && uniqueRatio <= 0.45;\n}\n\n/**\n * Detect degraded 200-response payloads that should trigger model fallback.\n * Returns a short reason when fallback should happen, otherwise undefined.\n */\nexport function detectDegradedSuccessResponse(body: string): string | undefined {\n const trimmed = body.trim();\n if (!trimmed) return undefined;\n\n // Plain-text placeholder response.\n if (DEGRADED_RESPONSE_PATTERNS.some((pattern) => pattern.test(trimmed))) {\n return \"degraded response: overloaded placeholder\";\n }\n\n // Plain-text looping garbage response.\n if (hasKnownLoopSignature(trimmed)) {\n return \"degraded response: repetitive loop output\";\n }\n\n try {\n const parsed = JSON.parse(trimmed) as Record;\n\n // Some providers return JSON error payloads with HTTP 200.\n const errorField = parsed.error;\n let errorText = \"\";\n if (typeof errorField === \"string\") {\n errorText = errorField;\n } else if (errorField && typeof errorField === \"object\") {\n const errObj = errorField as Record;\n errorText = [\n typeof errObj.message === \"string\" ? errObj.message : \"\",\n typeof errObj.type === \"string\" ? errObj.type : \"\",\n typeof errObj.code === \"string\" ? errObj.code : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n if (errorText && PROVIDER_ERROR_PATTERNS.some((pattern) => pattern.test(errorText))) {\n return `degraded response: ${errorText.slice(0, 120)}`;\n }\n\n // Detect empty-turn responses: model returned 200 but no content and no tool calls.\n // Happens when models like gemini-3.1-flash-lite receive complex agentic requests\n // (e.g. Roo Code tool schemas) and produce zero output instead of refusing.\n const choices = parsed.choices;\n if (Array.isArray(choices) && choices.length > 0) {\n const choice = choices[0] as Record;\n const msg = (choice.message ?? choice.delta) as Record | undefined;\n if (msg) {\n const content = msg.content;\n const toolCalls = msg.tool_calls;\n const hasContent = typeof content === \"string\" && content.trim().length > 0;\n const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;\n const finishReason = choice.finish_reason as string | null | undefined;\n if (!hasContent && !hasToolCalls && finishReason === \"stop\") {\n return \"degraded response: empty turn (no content or tool calls)\";\n }\n }\n }\n\n // Successful wrapper with bad assistant content.\n const assistantContent = extractAssistantContent(parsed);\n if (!assistantContent) return undefined;\n if (DEGRADED_RESPONSE_PATTERNS.some((pattern) => pattern.test(assistantContent))) {\n return \"degraded response: overloaded assistant content\";\n }\n if (hasKnownLoopSignature(assistantContent)) {\n return \"degraded response: repetitive assistant loop\";\n }\n } catch {\n // Not JSON - handled by plaintext checks above.\n }\n\n return undefined;\n}\n\n/**\n * Valid message roles for OpenAI-compatible APIs.\n * Some clients send non-standard roles (e.g., \"developer\" instead of \"system\").\n */\nconst VALID_ROLES = new Set([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]);\n\n/**\n * Role mappings for non-standard roles.\n * Maps client-specific roles to standard OpenAI roles.\n */\nconst ROLE_MAPPINGS: Record = {\n developer: \"system\", // OpenAI's newer API uses \"developer\" for system messages\n model: \"assistant\", // Some APIs use \"model\" instead of \"assistant\"\n};\n\ntype ChatMessage = { role: string; content: string | unknown };\n\n/**\n * Anthropic tool ID pattern: only alphanumeric, underscore, and hyphen allowed.\n * Error: \"messages.X.content.Y.tool_use.id: String should match pattern '^[a-zA-Z0-9_-]+$'\"\n */\nconst VALID_TOOL_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\n/**\n * Sanitize a tool ID to match Anthropic's required pattern.\n * Replaces invalid characters with underscores.\n */\nfunction sanitizeToolId(id: string | undefined): string | undefined {\n if (!id || typeof id !== \"string\") return id;\n if (VALID_TOOL_ID_PATTERN.test(id)) return id;\n\n // Replace invalid characters with underscores\n return id.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\n/**\n * Type for messages with tool calls (OpenAI format).\n */\ntype MessageWithTools = ChatMessage & {\n tool_calls?: Array<{ id?: string; type?: string; function?: unknown }>;\n tool_call_id?: string;\n};\n\n/**\n * Type for content blocks that may contain tool IDs (Anthropic format in OpenAI wrapper).\n */\ntype ContentBlock = {\n type?: string;\n id?: string;\n tool_use_id?: string;\n [key: string]: unknown;\n};\n\n/**\n * Sanitize all tool IDs in messages to match Anthropic's pattern.\n * Handles both OpenAI format (tool_calls, tool_call_id) and content block formats.\n */\nfunction sanitizeToolIds(messages: ChatMessage[]): ChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n let hasChanges = false;\n const sanitized = messages.map((msg) => {\n const typedMsg = msg as MessageWithTools;\n let msgChanged = false;\n let newMsg = { ...msg } as MessageWithTools;\n\n // Sanitize tool_calls[].id in assistant messages\n if (typedMsg.tool_calls && Array.isArray(typedMsg.tool_calls)) {\n const newToolCalls = typedMsg.tool_calls.map((tc) => {\n if (tc.id && typeof tc.id === \"string\") {\n const sanitized = sanitizeToolId(tc.id);\n if (sanitized !== tc.id) {\n msgChanged = true;\n return { ...tc, id: sanitized };\n }\n }\n return tc;\n });\n if (msgChanged) {\n newMsg = { ...newMsg, tool_calls: newToolCalls };\n }\n }\n\n // Sanitize tool_call_id in tool messages\n if (typedMsg.tool_call_id && typeof typedMsg.tool_call_id === \"string\") {\n const sanitized = sanitizeToolId(typedMsg.tool_call_id);\n if (sanitized !== typedMsg.tool_call_id) {\n msgChanged = true;\n newMsg = { ...newMsg, tool_call_id: sanitized };\n }\n }\n\n // Sanitize content blocks if content is an array (Anthropic-style content)\n if (Array.isArray(typedMsg.content)) {\n const newContent = (typedMsg.content as ContentBlock[]).map((block) => {\n if (!block || typeof block !== \"object\") return block;\n\n let blockChanged = false;\n let newBlock = { ...block };\n\n // tool_use blocks have \"id\"\n if (block.type === \"tool_use\" && block.id && typeof block.id === \"string\") {\n const sanitized = sanitizeToolId(block.id);\n if (sanitized !== block.id) {\n blockChanged = true;\n newBlock = { ...newBlock, id: sanitized };\n }\n }\n\n // tool_result blocks have \"tool_use_id\"\n if (\n block.type === \"tool_result\" &&\n block.tool_use_id &&\n typeof block.tool_use_id === \"string\"\n ) {\n const sanitized = sanitizeToolId(block.tool_use_id);\n if (sanitized !== block.tool_use_id) {\n blockChanged = true;\n newBlock = { ...newBlock, tool_use_id: sanitized };\n }\n }\n\n if (blockChanged) {\n msgChanged = true;\n return newBlock;\n }\n return block;\n });\n\n if (msgChanged) {\n newMsg = { ...newMsg, content: newContent };\n }\n }\n\n if (msgChanged) {\n hasChanges = true;\n return newMsg;\n }\n return msg;\n });\n\n return hasChanges ? sanitized : messages;\n}\n\n/**\n * Normalize message roles to standard OpenAI format.\n * Converts non-standard roles (e.g., \"developer\") to valid ones.\n */\nfunction normalizeMessageRoles(messages: ChatMessage[]): ChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n let hasChanges = false;\n const normalized = messages.map((msg) => {\n if (VALID_ROLES.has(msg.role)) return msg;\n\n const mappedRole = ROLE_MAPPINGS[msg.role];\n if (mappedRole) {\n hasChanges = true;\n return { ...msg, role: mappedRole };\n }\n\n // Unknown role - default to \"user\" to avoid API errors\n hasChanges = true;\n return { ...msg, role: \"user\" };\n });\n\n return hasChanges ? normalized : messages;\n}\n\n/**\n * Normalize messages for Google models.\n * Google's Gemini API requires the first non-system message to be from \"user\".\n * If conversation starts with \"assistant\"/\"model\", prepend a placeholder user message.\n */\n\nfunction normalizeMessagesForGoogle(messages: ChatMessage[]): ChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n // Find first non-system message\n let firstNonSystemIdx = -1;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role !== \"system\") {\n firstNonSystemIdx = i;\n break;\n }\n }\n\n // If no non-system messages, return as-is\n if (firstNonSystemIdx === -1) return messages;\n\n const firstRole = messages[firstNonSystemIdx].role;\n\n // If first non-system message is already \"user\", no change needed\n if (firstRole === \"user\") return messages;\n\n // If first non-system message is \"assistant\" or \"model\", prepend a user message\n if (firstRole === \"assistant\" || firstRole === \"model\") {\n const normalized = [...messages];\n normalized.splice(firstNonSystemIdx, 0, {\n role: \"user\",\n content: \"(continuing conversation)\",\n });\n return normalized;\n }\n\n return messages;\n}\n\n/**\n * Check if a model is a Google model that requires message normalization.\n */\nfunction isGoogleModel(modelId: string): boolean {\n return modelId.startsWith(\"google/\") || modelId.startsWith(\"gemini\");\n}\n\n/**\n * Extended message type for thinking-enabled conversations.\n */\ntype ExtendedChatMessage = ChatMessage & {\n tool_calls?: unknown[];\n reasoning_content?: unknown;\n};\n\n/**\n * Normalize messages for thinking-enabled requests.\n * When thinking/extended_thinking is enabled, ALL assistant messages in history\n * must have reasoning_content (can be empty string if not present).\n *\n * Reasoning models like Kimi K2.5, DeepSeek-R1, etc. strip their thinking tokens\n * before we forward the response to the client. So when the client sends back the\n * assistant message in a follow-up turn, it lacks reasoning_content. These models\n * reject the multi-turn history with 400 if any assistant message is missing it.\n *\n * Previously only tool-call messages were patched — this missed plain text assistant\n * messages, causing 100% failures on existing (multi-turn) chats.\n *\n * Error examples:\n * \"400 thinking is enabled but reasoning_content is missing in assistant tool call message\"\n * \"400 thinking is enabled but reasoning_content is missing in assistant message\"\n */\nexport function normalizeMessagesForThinking(\n messages: ExtendedChatMessage[],\n): ExtendedChatMessage[] {\n if (!messages || messages.length === 0) return messages;\n\n let hasChanges = false;\n const normalized = messages.map((msg) => {\n // Skip if not assistant or already has reasoning_content\n if (msg.role !== \"assistant\" || msg.reasoning_content !== undefined) {\n return msg;\n }\n\n // Add reasoning_content: \"\" to ALL assistant messages.\n // Reasoning models require it on every assistant turn in history, not just tool-call turns.\n hasChanges = true;\n return { ...msg, reasoning_content: \"\" };\n });\n\n return hasChanges ? normalized : messages;\n}\n\n/**\n * Remove \"blockrun\" branding from system messages before sending upstream.\n *\n * OpenClaw embeds `model=blockrun/auto` and `default_model=blockrun/auto` in its\n * system prompt Runtime section. LLMs pick up \"blockrun\" and adopt it as their\n * identity (e.g. \"I'm Blockrun\"), overriding the user's SOUL.md persona.\n *\n * This function replaces `blockrun/` references with the actual resolved\n * model name, and strips any remaining \"blockrun/\" prefix so the upstream LLM\n * never sees \"blockrun\" as an identity to adopt.\n */\nexport function debrandSystemMessages(\n messages: ChatMessage[],\n resolvedModel: string,\n): ChatMessage[] {\n // Routing profile names that get replaced with the actual model\n const PROFILE_NAMES = [\"auto\", \"free\", \"eco\", \"premium\"];\n const profilePattern = new RegExp(`\\\\bblockrun/(${PROFILE_NAMES.join(\"|\")})\\\\b`, \"gi\");\n // Also handle \"blockrun//\" → \"/\"\n const prefixPattern = /\\bblockrun\\/(?=[a-z])/gi;\n\n let hasChanges = false;\n const result = messages.map((msg) => {\n if (msg.role !== \"system\" || typeof msg.content !== \"string\") return msg;\n\n let content = msg.content;\n\n // Replace routing profiles (blockrun/auto etc.) with resolved model\n const afterProfiles = content.replace(profilePattern, resolvedModel);\n\n // Replace remaining blockrun/ prefix (e.g. blockrun/openai/gpt-4o → openai/gpt-4o)\n const afterPrefix = afterProfiles.replace(prefixPattern, \"\");\n\n if (afterPrefix !== content) {\n hasChanges = true;\n content = afterPrefix;\n }\n\n return content !== msg.content ? { ...msg, content } : msg;\n });\n\n return hasChanges ? result : messages;\n}\n\n/**\n * Result of truncating messages.\n */\ntype TruncationResult = {\n messages: T[];\n wasTruncated: boolean;\n originalCount: number;\n truncatedCount: number;\n};\n\n/**\n * Truncate messages to stay under BlockRun's MAX_MESSAGES limit.\n * Keeps all system messages and the most recent conversation history.\n * Returns the messages and whether truncation occurred.\n */\nfunction truncateMessages(messages: T[]): TruncationResult {\n if (!messages || messages.length <= MAX_MESSAGES) {\n return {\n messages,\n wasTruncated: false,\n originalCount: messages?.length ?? 0,\n truncatedCount: messages?.length ?? 0,\n };\n }\n\n // Separate system messages from conversation\n const systemMsgs = messages.filter((m) => m.role === \"system\");\n const conversationMsgs = messages.filter((m) => m.role !== \"system\");\n\n // Keep all system messages + most recent conversation messages\n const maxConversation = MAX_MESSAGES - systemMsgs.length;\n const truncatedConversation = conversationMsgs.slice(-maxConversation);\n\n const result = [...systemMsgs, ...truncatedConversation];\n\n console.log(\n `[XClawRouter] Truncated messages: ${messages.length} → ${result.length} (kept ${systemMsgs.length} system + ${truncatedConversation.length} recent)`,\n );\n\n return {\n messages: result,\n wasTruncated: true,\n originalCount: messages.length,\n truncatedCount: result.length,\n };\n}\n\n// Kimi/Moonshot models use special Unicode tokens for thinking boundaries.\n// Pattern: <|begin▁of▁thinking|>content<|end▁of▁thinking|>\n// The | is fullwidth vertical bar (U+FF5C), ▁ is lower one-eighth block (U+2581).\n\n// Match full Kimi thinking blocks: <|begin...|>content<|end...|>\nconst KIMI_BLOCK_RE = /<[||][^<>]*begin[^<>]*[||]>[\\s\\S]*?<[||][^<>]*end[^<>]*[||]>/gi;\n\n// Match standalone Kimi tokens like <|end▁of▁thinking|>\nconst KIMI_TOKEN_RE = /<[||][^<>]*[||]>/g;\n\n// Standard thinking tags that may leak through from various models\n// Includes namespaced antml:thinking (Anthropic internal monologue, stripped by OpenClaw v2026.4.2+)\nconst THINKING_TAG_RE = /<\\s*\\/?\\s*(?:think(?:ing)?|thought|antthinking|antml:thinking)\\b[^>]*>/gi;\n\n// Full thinking blocks: content\nconst THINKING_BLOCK_RE =\n /<\\s*(?:think(?:ing)?|thought|antthinking|antml:thinking)\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*(?:think(?:ing)?|thought|antthinking|antml:thinking)\\s*>/gi;\n\n/**\n * Strip thinking tokens and blocks from model response content.\n * Handles both Kimi-style Unicode tokens and standard XML-style tags.\n *\n * NOTE: DSML tags (<|DSML|...>) are NOT stripped - those are tool calls\n * that should be handled by the API, not hidden from users.\n */\nfunction stripThinkingTokens(content: string): string {\n if (!content) return content;\n // Strip full Kimi thinking blocks first (begin...end with content)\n let cleaned = content.replace(KIMI_BLOCK_RE, \"\");\n // Strip remaining standalone Kimi tokens\n cleaned = cleaned.replace(KIMI_TOKEN_RE, \"\");\n // Strip full thinking blocks (...)\n cleaned = cleaned.replace(THINKING_BLOCK_RE, \"\");\n // Strip remaining standalone thinking tags\n cleaned = cleaned.replace(THINKING_TAG_RE, \"\");\n return cleaned;\n}\n\n/** Callback info for low balance warning */\nexport type LowBalanceInfo = {\n balanceUSD: string;\n walletAddress: string;\n};\n\n/** Callback info for insufficient funds error */\nexport type InsufficientFundsInfo = {\n balanceUSD: string;\n requiredUSD: string;\n walletAddress: string;\n};\n\n/**\n * Wallet config: either a plain EVM private key string, or the full\n * resolution object from resolveOrGenerateWalletKey() which may include\n * Solana keys. Using the full object prevents callers from accidentally\n * forgetting to forward Solana key bytes.\n */\n/**\n * Wallet config accepts:\n * - string: legacy plain EVM private key\n * - { key, ... }: legacy resolution with optional Solana keys\n * - { source: \"okx\", address, onchainos }: OKX onchainos wallet — no\n * local key, signing delegated to the onchainos CLI.\n */\nexport type WalletConfig =\n | string\n | { key: string; solanaPrivateKeyBytes?: Uint8Array }\n | WalletResolution;\n\nexport type PaymentChain = \"base\" | \"solana\";\n\nexport type ProxyOptions = {\n wallet: WalletConfig;\n apiBase?: string;\n /** Payment chain: \"base\" (default) or \"solana\". Can also be set via CLAWROUTER_PAYMENT_CHAIN env var. */\n paymentChain?: PaymentChain;\n /** Port to listen on (default: 8402) */\n port?: number;\n routingConfig?: Partial;\n /** Request timeout in ms (default: 180000 = 3 minutes). Covers on-chain tx + LLM response. */\n requestTimeoutMs?: number;\n /** Skip balance checks (for testing only). Default: false */\n skipBalanceCheck?: boolean;\n /** Override the balance monitor with a mock (for testing only). */\n _balanceMonitorOverride?: AnyBalanceMonitor;\n /**\n * Session persistence config. When enabled, maintains model selection\n * across requests within a session to prevent mid-task model switching.\n */\n sessionConfig?: Partial;\n /**\n * Auto-compress large requests to reduce network usage.\n * When enabled, requests are automatically compressed using\n * LLM-safe context compression (15-40% reduction).\n * Default: true\n */\n autoCompressRequests?: boolean;\n /**\n * Threshold in KB to trigger auto-compression (default: 180).\n * Requests larger than this are compressed before sending.\n * Set to 0 to compress all requests.\n */\n compressionThresholdKB?: number;\n /**\n * Response caching config. When enabled, identical requests return\n * cached responses instead of making new API calls.\n * Default: enabled with 10 minute TTL, 200 max entries.\n */\n cacheConfig?: ResponseCacheConfig;\n /**\n * Maximum total spend (in USD) per session run.\n * Default: undefined (no limit). Example: 0.5 = $0.50 per session.\n */\n maxCostPerRunUsd?: number;\n /**\n * How to enforce the per-run cost cap.\n * - 'graceful' (default): when budget runs low, downgrade to cheaper models; use free model\n * as last resort. Only hard-stops when no model can serve the request.\n * - 'strict': immediately return 429 once the session spend reaches the cap.\n */\n maxCostPerRunMode?: \"graceful\" | \"strict\";\n /**\n * Set of model IDs to exclude from routing.\n * Excluded models are filtered out of fallback chains.\n * Loaded from ~/.openclaw/blockrun/exclude-models.json\n */\n excludeModels?: Set;\n onReady?: (port: number) => void;\n onError?: (error: Error) => void;\n onPayment?: (info: { model: string; amount: string; network: string }) => void;\n onRouted?: (decision: RoutingDecision) => void;\n /** Called when balance drops below $1.00 (warning, request still proceeds) */\n onLowBalance?: (info: LowBalanceInfo) => void;\n /** Called when balance is insufficient for a request (request fails) */\n onInsufficientFunds?: (info: InsufficientFundsInfo) => void;\n /**\n * Upstream proxy URL for all outgoing requests.\n * Supports http://, https://, and socks5:// schemes.\n * Also readable via BLOCKRUN_UPSTREAM_PROXY environment variable.\n * Example: \"socks5://127.0.0.1:1080\"\n */\n upstreamProxy?: string;\n};\n\nexport type ProxyHandle = {\n port: number;\n baseUrl: string;\n walletAddress: string;\n solanaAddress?: string;\n balanceMonitor: AnyBalanceMonitor;\n close: () => Promise;\n};\n\n/**\n * Build model pricing map from BLOCKRUN_MODELS.\n */\nfunction buildModelPricing(): Map {\n const map = new Map();\n for (const m of BLOCKRUN_MODELS) {\n if (m.id === AUTO_MODEL) continue; // skip meta-model\n const promoPrice = getActivePromoPrice(m);\n map.set(m.id, {\n inputPrice: m.inputPrice,\n outputPrice: m.outputPrice,\n ...(promoPrice !== undefined && { flatPrice: promoPrice }),\n });\n }\n return map;\n}\n\ntype ModelListEntry = {\n id: string;\n object: \"model\";\n created: number;\n owned_by: string;\n};\n\n/**\n * Build `/v1/models` response entries from the full OpenClaw model registry.\n * This includes alias IDs (e.g., `flash`, `kimi`) so `/model ` works reliably.\n */\nexport function buildProxyModelList(\n createdAt: number = Math.floor(Date.now() / 1000),\n): ModelListEntry[] {\n const seen = new Set();\n return OPENCLAW_MODELS.filter((model) => {\n if (seen.has(model.id)) return false;\n seen.add(model.id);\n return true;\n }).map((model) => ({\n id: model.id,\n object: \"model\",\n created: createdAt,\n owned_by: model.id.includes(\"/\") ? (model.id.split(\"/\")[0] ?? \"blockrun\") : \"blockrun\",\n }));\n}\n\n/**\n * Merge partial routing config overrides with defaults.\n */\nfunction mergeRoutingConfig(overrides?: Partial): RoutingConfig {\n if (!overrides) return DEFAULT_ROUTING_CONFIG;\n // Merge tier sets per-tier so users can override a single tier\n // (e.g. just COMPLEX) without having to redefine all four.\n // `null` explicitly disables a tier set (e.g. `agenticTiers: null` forces\n // all requests through regular tiers even when tools are present).\n const mergeTiers = (\n defaults: RoutingConfig[\"tiers\"] | null | undefined,\n user: Partial | null | undefined,\n ): RoutingConfig[\"tiers\"] | null => {\n if (user === null) return null;\n if (user === undefined) return defaults ?? null;\n return { ...(defaults ?? {}), ...user } as RoutingConfig[\"tiers\"];\n };\n return {\n ...DEFAULT_ROUTING_CONFIG,\n ...overrides,\n classifier: { ...DEFAULT_ROUTING_CONFIG.classifier, ...overrides.classifier },\n scoring: { ...DEFAULT_ROUTING_CONFIG.scoring, ...overrides.scoring },\n tiers:\n mergeTiers(DEFAULT_ROUTING_CONFIG.tiers, overrides.tiers) ?? DEFAULT_ROUTING_CONFIG.tiers,\n agenticTiers: mergeTiers(DEFAULT_ROUTING_CONFIG.agenticTiers, overrides.agenticTiers),\n ecoTiers: mergeTiers(DEFAULT_ROUTING_CONFIG.ecoTiers, overrides.ecoTiers),\n premiumTiers: mergeTiers(DEFAULT_ROUTING_CONFIG.premiumTiers, overrides.premiumTiers),\n overrides: { ...DEFAULT_ROUTING_CONFIG.overrides, ...overrides.overrides },\n };\n}\n\n/**\n * Build the `usage.cost` breakdown that XClawRouter injects into responses.\n * This uses ACTUAL token counts from the upstream usage field (not estimates)\n * and falls back to gracefully returning undefined when token counts or\n * routing info aren't available.\n *\n * OpenClaw's `session-cost-usage` module reads the standard `{total,input,output}`\n * fields. The extra fields (`baseline`, `savings_pct`, `model`, `tier`) are\n * forward-compat metadata for future OpenClaw UI or external analytics.\n *\n * Exported for unit tests.\n */\nexport type CostBreakdown = {\n /** Total cost in USD for this request (server-margin included). */\n total: number;\n /** Input-token cost in USD. */\n input: number;\n /** Output-token cost in USD. */\n output: number;\n /** What the baseline (Opus) would have cost for the same tokens. */\n baseline: number;\n /** Savings % vs baseline, integer 0..100. Omitted for `premium` profile. */\n savings_pct?: number;\n /** Actual model that answered (mirrors top-level `model` field). */\n model: string;\n /** Routing tier (SIMPLE / MEDIUM / COMPLEX / REASONING) if known. */\n tier?: string;\n};\n\nexport function buildCostBreakdown(params: {\n actualModelUsed: string;\n routingProfile: \"free\" | \"eco\" | \"auto\" | \"premium\" | undefined;\n routingDecision: { tier?: string } | undefined;\n modelPricing: Map;\n inputTokens: number | undefined;\n outputTokens: number | undefined;\n tier: string | undefined;\n}): CostBreakdown | undefined {\n const { actualModelUsed, routingProfile, modelPricing, inputTokens, outputTokens, tier } = params;\n // We need both token counts to produce meaningful actual-cost numbers.\n // If upstream didn't send usage (some providers omit it), skip cost injection\n // rather than publish misleading zero or estimate-based numbers.\n if (\n typeof inputTokens !== \"number\" ||\n typeof outputTokens !== \"number\" ||\n inputTokens < 0 ||\n outputTokens < 0\n ) {\n return undefined;\n }\n\n const pricing = modelPricing.get(actualModelUsed);\n const inputPrice = pricing?.inputPrice ?? 0;\n const outputPrice = pricing?.outputPrice ?? 0;\n const input = (inputTokens / 1_000_000) * inputPrice;\n const output = (outputTokens / 1_000_000) * outputPrice;\n\n // Use calculateModelCost to get server-margin-adjusted total and baseline\n // with the same logic as the pre-request estimator. This keeps total and\n // baseline internally consistent (same margin, same min-payment floor).\n const costs = calculateModelCost(\n actualModelUsed,\n modelPricing,\n inputTokens,\n outputTokens,\n routingProfile,\n );\n\n const total = costs.costEstimate;\n const baseline = costs.baselineCost;\n const savingsPct =\n routingProfile === \"premium\" || baseline <= 0\n ? undefined\n : Math.max(0, Math.min(100, Math.round(costs.savings * 100)));\n\n return {\n total,\n input,\n output,\n baseline,\n ...(savingsPct !== undefined ? { savings_pct: savingsPct } : {}),\n model: actualModelUsed,\n ...(tier ? { tier } : {}),\n };\n}\n\n/**\n * Estimate USDC cost for a request based on model pricing.\n * Returns amount string in USDC smallest unit (6 decimals) or undefined if unknown.\n */\nfunction estimateAmount(\n modelId: string,\n bodyLength: number,\n maxTokens: number,\n): string | undefined {\n const model = BLOCKRUN_MODELS.find((m) => m.id === modelId);\n if (!model) return undefined;\n\n let costUsd: number;\n const promoPrice = getActivePromoPrice(model);\n if (promoPrice !== undefined) {\n // Active promo: fixed cost per request, no token estimation needed\n costUsd = promoPrice;\n } else {\n // Rough estimate: ~4 chars per token for input\n const estimatedInputTokens = Math.ceil(bodyLength / 4);\n const estimatedOutputTokens = maxTokens || model.maxOutput || 4096;\n costUsd =\n (estimatedInputTokens / 1_000_000) * model.inputPrice +\n (estimatedOutputTokens / 1_000_000) * model.outputPrice;\n }\n\n // Convert to USDC 6-decimal integer, add 20% buffer for estimation error\n // Minimum 1000 ($0.001) to match CDP Facilitator's enforced minimum payment\n const amountMicros = Math.max(1000, Math.ceil(costUsd * 1.2 * 1_000_000));\n return amountMicros.toString();\n}\n\n// Image pricing table (must match server's IMAGE_MODELS in blockrun/src/lib/models.ts)\n// Server applies 5% margin on top of these prices.\nconst IMAGE_PRICING: Record }> = {\n \"openai/dall-e-3\": {\n default: 0.04,\n sizes: { \"1024x1024\": 0.04, \"1792x1024\": 0.08, \"1024x1792\": 0.08 },\n },\n \"openai/gpt-image-1\": {\n default: 0.02,\n sizes: { \"1024x1024\": 0.02, \"1536x1024\": 0.04, \"1024x1536\": 0.04 },\n },\n \"black-forest/flux-1.1-pro\": { default: 0.04 },\n \"google/nano-banana\": { default: 0.05 },\n \"google/nano-banana-pro\": {\n default: 0.1,\n sizes: { \"1024x1024\": 0.1, \"2048x2048\": 0.1, \"4096x4096\": 0.15 },\n },\n \"xai/grok-imagine-image\": { default: 0.02, sizes: { \"1024x1024\": 0.02 } },\n \"xai/grok-imagine-image-pro\": { default: 0.07, sizes: { \"1024x1024\": 0.07 } },\n \"zai/cogview-4\": {\n default: 0.015,\n sizes: {\n \"512x512\": 0.015,\n \"768x768\": 0.015,\n \"1024x1024\": 0.015,\n \"768x1344\": 0.015,\n \"1344x768\": 0.015,\n \"1440x1440\": 0.02,\n },\n },\n};\n\n// Video pricing (must match server's VIDEO_MODELS in blockrun/src/lib/models.ts)\nconst VIDEO_PRICING: Record = {\n \"xai/grok-imagine-video\": { pricePerSecond: 0.05, defaultDurationSeconds: 8 },\n \"bytedance/seedance-1.5-pro\": { pricePerSecond: 0.03, defaultDurationSeconds: 5 },\n \"bytedance/seedance-2.0-fast\": { pricePerSecond: 0.15, defaultDurationSeconds: 5 },\n \"bytedance/seedance-2.0\": { pricePerSecond: 0.3, defaultDurationSeconds: 5 },\n};\n\n/**\n * Estimate the cost of a video generation request (pricePerSecond × duration + 5% margin).\n */\nfunction estimateVideoCost(model: string, durationSeconds?: number): number {\n const p = VIDEO_PRICING[model];\n if (!p) return 0.4 * 1.05; // fallback: ~$0.40/clip + margin\n const dur = durationSeconds ?? p.defaultDurationSeconds;\n return p.pricePerSecond * dur * 1.05;\n}\n\n/**\n * Estimate the cost of an image generation/editing request.\n * Matches server-side calculateImagePrice() including 5% margin.\n */\nfunction estimateImageCost(model: string, size?: string, n: number = 1): number {\n const pricing = IMAGE_PRICING[model];\n if (!pricing) return 0.04 * n * 1.05; // fallback: assume $0.04/image + margin\n const sizePrice = size && pricing.sizes ? pricing.sizes[size] : undefined;\n const pricePerImage = sizePrice ?? pricing.default;\n return pricePerImage * n * 1.05; // 5% server margin\n}\n\n/**\n * Proxy a paid BlockRun data request through x402 payment flow.\n *\n * Used for partner endpoints (/v1/partner/*, /v1/pm/*), market data\n * (/v1/stocks/*, /v1/usstock/*, /v1/crypto/*, /v1/fx/*, /v1/commodity/*),\n * and wallet-backed data tools such as BlockRun Exa (/v1/exa/*). No smart routing,\n * SSE, compression, or sessions — just collect body, forward via payFetch\n * (which handles 402 automatically), and stream back.\n */\nasync function proxyPaidApiRequest(\n req: IncomingMessage,\n res: ServerResponse,\n apiBase: string,\n payFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise,\n getActualPaymentUsd: () => number,\n): Promise {\n const startTime = Date.now();\n const upstreamUrl = `${apiBase}${req.url}`;\n const isBlockrunExa = req.url?.startsWith(\"/v1/exa/\") ?? false;\n const isModalSandbox = req.url?.startsWith(\"/v1/modal/\") ?? false;\n const requestLabel = isBlockrunExa\n ? \"BlockRun Exa\"\n : isModalSandbox\n ? \"Modal Sandbox\"\n : \"Partner\";\n\n // Collect request body\n const bodyChunks: Buffer[] = [];\n for await (const chunk of req) {\n bodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const body = Buffer.concat(bodyChunks);\n\n // Forward headers (strip hop-by-hop + SDK/provider-specific)\n const headers: Record = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (\n key === \"host\" ||\n key === \"connection\" ||\n key === \"transfer-encoding\" ||\n key === \"content-length\"\n )\n continue;\n if (key.startsWith(\"x-stainless-\") || key.startsWith(\"anthropic-\")) continue;\n if (typeof value === \"string\") headers[key] = value;\n }\n if (!headers[\"content-type\"]) headers[\"content-type\"] = \"application/json\";\n headers[\"user-agent\"] = USER_AGENT;\n\n console.log(`[XClawRouter] ${requestLabel} request: ${req.method} ${req.url}`);\n\n const upstream = await payFetch(upstreamUrl, {\n method: req.method ?? \"POST\",\n headers,\n body: body.length > 0 ? new Uint8Array(body) : undefined,\n });\n\n // Forward response headers\n const responseHeaders: Record = {};\n upstream.headers.forEach((value, key) => {\n if (key === \"transfer-encoding\" || key === \"connection\" || key === \"content-encoding\") return;\n responseHeaders[key] = value;\n });\n\n res.writeHead(upstream.status, responseHeaders);\n\n // Stream response body\n if (upstream.body) {\n const chunks = await readBodyWithTimeout(upstream.body, ERROR_BODY_READ_TIMEOUT_MS);\n for (const chunk of chunks) {\n safeWrite(res, Buffer.from(chunk));\n }\n }\n\n res.end();\n\n const latencyMs = Date.now() - startTime;\n console.log(`[XClawRouter] ${requestLabel} response: ${upstream.status} (${latencyMs}ms)`);\n\n // Log paid tool usage with actual x402 payment amount.\n const requestCost = getActualPaymentUsd();\n logUsage({\n timestamp: new Date().toISOString(),\n model: isBlockrunExa ? \"blockrun-exa\" : isModalSandbox ? \"modal-sandbox\" : \"partner\",\n tier: \"PARTNER\",\n cost: requestCost,\n baselineCost: requestCost,\n savings: 0,\n latencyMs,\n partnerId:\n (req.url?.split(\"?\")[0] ?? \"\").replace(/^\\/v1\\//, \"\").replace(/\\//g, \"_\") || \"unknown\",\n service: isBlockrunExa ? \"web_search\" : isModalSandbox ? \"modal\" : \"partner\",\n }).catch(() => {});\n}\n\n/**\n * Read a local image file and return it as a base64 data URI.\n * Supports ~/ home directory expansion.\n */\nfunction readImageFileAsDataUri(filePath: string): string {\n const resolved = filePath.startsWith(\"~/\") ? join(homedir(), filePath.slice(2)) : filePath;\n\n if (!existsSync(resolved)) {\n throw new Error(`Image file not found: ${resolved}`);\n }\n\n const ext = resolved.split(\".\").pop()?.toLowerCase() ?? \"png\";\n const mimeMap: Record = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n };\n const mime = mimeMap[ext] ?? \"image/png\";\n const data = readFileSync(resolved);\n return `data:${mime};base64,${data.toString(\"base64\")}`;\n}\n\n/**\n * Upload a base64 data URI to catbox.moe and return a public URL.\n * Google image models (nano-banana) return data URIs instead of hosted URLs,\n * which breaks Telegram and other clients that can't render raw base64.\n */\nasync function uploadDataUriToHost(dataUri: string): Promise {\n const match = dataUri.match(/^data:(image\\/\\w+);base64,(.+)$/);\n if (!match) throw new Error(\"Invalid data URI format\");\n const [, mimeType, b64Data] = match;\n const ext = mimeType === \"image/jpeg\" ? \"jpg\" : (mimeType.split(\"/\")[1] ?? \"png\");\n\n const buffer = Buffer.from(b64Data, \"base64\");\n const blob = new Blob([buffer], { type: mimeType });\n\n const form = new FormData();\n form.append(\"reqtype\", \"fileupload\");\n form.append(\"fileToUpload\", blob, `image.${ext}`);\n\n const uploadController = new AbortController();\n const uploadTimeout = setTimeout(() => uploadController.abort(), 30_000);\n try {\n const resp = await fetch(\"https://catbox.moe/user/api.php\", {\n method: \"POST\",\n body: form,\n signal: uploadController.signal,\n });\n\n if (!resp.ok) throw new Error(`catbox.moe upload failed: HTTP ${resp.status}`);\n const result = await resp.text();\n if (result.startsWith(\"https://\")) {\n return result.trim();\n }\n throw new Error(`catbox.moe upload failed: ${result}`);\n } finally {\n clearTimeout(uploadTimeout);\n }\n}\n\n/**\n * Start the local x402 proxy server.\n *\n * If a proxy is already running on the target port, reuses it instead of failing.\n * Port can be configured via BLOCKRUN_PROXY_PORT environment variable.\n *\n * Returns a handle with the assigned port, base URL, and a close function.\n */\nexport async function startProxy(options: ProxyOptions): Promise {\n // Apply upstream proxy (SOCKS5/HTTP) before any outgoing requests\n const upstreamProxy = await applyUpstreamProxy(options.upstreamProxy);\n if (upstreamProxy) {\n console.log(`[XClawRouter] Upstream proxy: ${upstreamProxy}`);\n }\n\n // Normalize wallet config. Three shapes:\n // 1. Plain string private key (legacy CLI/test path)\n // 2. Full resolution object with `key` (legacy local-key path)\n // 3. OKX resolution with `source: \"okx\"` and an `onchainos` adapter — no\n // local key, signing happens via the onchainos CLI.\n const walletObj = typeof options.wallet === \"string\" ? undefined : options.wallet;\n const isOkxWallet =\n walletObj !== undefined &&\n \"source\" in walletObj &&\n walletObj.source === \"okx\" &&\n walletObj.onchainos !== undefined;\n const walletKey = typeof options.wallet === \"string\" ? options.wallet : walletObj?.key;\n const solanaPrivateKeyBytes = walletObj?.solanaPrivateKeyBytes;\n const okxAdapter: OnchainOsAdapter | undefined = isOkxWallet ? walletObj?.onchainos : undefined;\n const okxAddress: `0x${string}` | undefined = isOkxWallet\n ? (walletObj!.address as `0x${string}`)\n : undefined;\n if (!walletKey && !okxAdapter) {\n throw new Error(\n \"Wallet config has no signing backend: provide a private key or an OKX onchainos wallet.\",\n );\n }\n\n // Payment chain: options > env var > persisted file > default \"base\".\n // No dynamic switching — user selects chain via /wallet solana or /wallet base.\n const paymentChain = options.paymentChain ?? (await resolvePaymentChain());\n const apiBase =\n options.apiBase ??\n (paymentChain === \"solana\" && solanaPrivateKeyBytes ? BLOCKRUN_SOLANA_API : BLOCKRUN_API);\n if (paymentChain === \"solana\" && !solanaPrivateKeyBytes) {\n console.warn(\n `[XClawRouter] ⚠ Payment chain is Solana but no mnemonic found — falling back to Base (EVM).`,\n );\n console.warn(\n `[XClawRouter] To fix: run \"npx @blockrun/xclawrouter wallet recover\" if your mnemonic exists,`,\n );\n console.warn(`[XClawRouter] or run \"npx @blockrun/xclawrouter chain base\" to switch to EVM.`);\n } else if (paymentChain === \"solana\") {\n console.log(`[XClawRouter] Payment chain: Solana (${BLOCKRUN_SOLANA_API})`);\n }\n\n // Determine port: options.port > env var > default\n const listenPort = options.port ?? getProxyPort();\n\n // Check if a proxy is already running on this port\n const existingProxy = await checkExistingProxy(listenPort);\n if (existingProxy) {\n // Proxy already running — reuse it instead of failing with EADDRINUSE\n const expectedAddress: `0x${string}` =\n okxAddress ?? privateKeyToAccount(walletKey as `0x${string}`).address;\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n\n // Verify the existing proxy is using the same wallet (or warn if different)\n if (existingProxy.wallet !== expectedAddress) {\n console.warn(\n `[XClawRouter] Existing proxy on port ${listenPort} uses wallet ${existingProxy.wallet}, but current config uses ${expectedAddress}. Reusing existing proxy.`,\n );\n }\n\n // Verify the existing proxy is using the same payment chain\n if (existingProxy.paymentChain) {\n if (existingProxy.paymentChain !== paymentChain) {\n throw new Error(\n `Existing proxy on port ${listenPort} is using ${existingProxy.paymentChain} but ${paymentChain} was requested. ` +\n `Stop the existing proxy first or use a different port.`,\n );\n }\n } else if (paymentChain !== \"base\") {\n // Old proxy doesn't report chain — assume Base. Reject if Solana was requested.\n console.warn(\n `[XClawRouter] Existing proxy on port ${listenPort} does not report paymentChain (pre-v0.11 instance). Assuming Base.`,\n );\n throw new Error(\n `Existing proxy on port ${listenPort} is a pre-v0.11 instance (assumed Base) but ${paymentChain} was requested. ` +\n `Stop the existing proxy first or use a different port.`,\n );\n }\n\n // Derive Solana address if keys are available (for wallet status display)\n let reuseSolanaAddress: string | undefined;\n if (solanaPrivateKeyBytes) {\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(solanaPrivateKeyBytes);\n reuseSolanaAddress = solanaSigner.address;\n }\n\n // Use chain-appropriate balance monitor (lazy import to avoid loading @solana/kit on Base chain)\n let balanceMonitor: AnyBalanceMonitor;\n if (paymentChain === \"solana\" && reuseSolanaAddress) {\n const { SolanaBalanceMonitor } = await import(\"./solana-balance.js\");\n balanceMonitor = new SolanaBalanceMonitor(reuseSolanaAddress);\n } else {\n balanceMonitor = new BalanceMonitor(expectedAddress);\n }\n\n options.onReady?.(listenPort);\n\n return {\n port: listenPort,\n baseUrl,\n walletAddress: existingProxy.wallet,\n solanaAddress: reuseSolanaAddress,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n // Create x402 payment client. Two signing backends:\n // - OKX onchainos (when wallet source is \"okx\") — payments signed via the\n // `onchainos payment x402-pay` CLI, no private keys in this process.\n // - Local viem account (default) — derived from BIP-39 / env private key.\n const useOnchainos = !!okxAdapter;\n const evmPublicClient = createPublicClient({ chain: base, transport: http() });\n const x402 = new x402Client();\n\n let account: { address: `0x${string}` };\n if (useOnchainos) {\n account = { address: okxAddress! };\n console.log(`[XClawRouter] OKX onchainos wallet — EVM ${okxAddress}`);\n } else {\n const acct = privateKeyToAccount(walletKey as `0x${string}`);\n account = { address: acct.address };\n const evmSigner = toClientEvmSigner(acct, evmPublicClient);\n registerExactEvmScheme(x402, { signer: evmSigner });\n }\n\n // Register Solana scheme if key is available. OKX onchainos focuses on Base\n // (EVM); Solana support stays on the legacy local-mnemonic path.\n let solanaAddress: string | undefined;\n if (!useOnchainos && solanaPrivateKeyBytes) {\n const { registerExactSvmScheme } = await import(\"@x402/svm/exact/client\");\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(solanaPrivateKeyBytes);\n solanaAddress = solanaSigner.address;\n registerExactSvmScheme(x402, { signer: solanaSigner });\n console.log(`[XClawRouter] Solana wallet: ${solanaAddress}`);\n } else if (useOnchainos && paymentChain === \"solana\") {\n console.warn(\n `[XClawRouter] ⚠ Solana signing via onchainos is not yet implemented. ` +\n `Run \"/chain base\" to switch chains, or wait for an onchainos release that supports Solana.`,\n );\n }\n\n // Log which chain is used for each payment and capture actual payment amount\n x402.onAfterPaymentCreation(async (context) => {\n const network = context.selectedRequirements.network;\n const chain = network.startsWith(\"eip155\")\n ? \"Base (EVM)\"\n : network.startsWith(\"solana\")\n ? \"Solana\"\n : network;\n // Capture actual payment amount in USD (amount is in USDC micro units, 6 decimals)\n const amountMicros = parseInt(context.selectedRequirements.amount || \"0\", 10);\n const amountUsd = amountMicros / 1_000_000;\n // Write to request-scoped store (if available)\n const store = paymentStore.getStore();\n if (store) store.amountUsd = amountUsd;\n console.log(`[XClawRouter] Payment signed on ${chain} (${network}) — $${amountUsd.toFixed(6)}`);\n });\n\n // OKX mode: bypass @x402/fetch — onchainos exposes only the high-level\n // `payment x402-pay` command, not raw typed-data signing, so we hand-roll\n // 402-handling in createOnchainosPayFetch.\n const payFetch = useOnchainos\n ? createOnchainosPayFetch(fetch, okxAdapter!)\n : createPayFetchWithPreAuth(fetch, x402, undefined, {\n skipPreAuth: paymentChain === \"solana\",\n });\n\n // Create balance monitor for pre-request checks (lazy import to avoid loading @solana/kit on Base chain)\n let balanceMonitor: AnyBalanceMonitor;\n if (options._balanceMonitorOverride) {\n balanceMonitor = options._balanceMonitorOverride;\n } else if (paymentChain === \"solana\" && solanaAddress) {\n const { SolanaBalanceMonitor } = await import(\"./solana-balance.js\");\n balanceMonitor = new SolanaBalanceMonitor(solanaAddress);\n } else {\n balanceMonitor = new BalanceMonitor(account.address);\n }\n\n // Build router options (100% local — no external API calls for routing)\n const routingConfig = mergeRoutingConfig(options.routingConfig);\n const modelPricing = buildModelPricing();\n const routerOpts: RouterOptions = {\n config: routingConfig,\n modelPricing,\n };\n\n // Request deduplicator (shared across all requests)\n const deduplicator = new RequestDeduplicator();\n\n // Response cache for identical requests (longer TTL than dedup)\n const responseCache = new ResponseCache(options.cacheConfig);\n\n // Session store for model persistence (prevents mid-task model switching)\n const sessionStore = new SessionStore(options.sessionConfig);\n\n // Session journal for memory (enables agents to recall earlier work)\n const sessionJournal = new SessionJournal();\n\n // Track active connections for graceful cleanup\n const connections = new Set();\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n // Wrap in paymentStore.run() so x402 hook can write actual payment amount per-request\n paymentStore.run({ amountUsd: 0 }, async () => {\n // Add stream error handlers to prevent server crashes\n req.on(\"error\", (err) => {\n console.error(`[XClawRouter] Request stream error: ${err.message}`);\n // Don't throw - just log and let request handler deal with it\n });\n\n res.on(\"error\", (err) => {\n console.error(`[XClawRouter] Response stream error: ${err.message}`);\n // Don't try to write to failed socket - just log\n });\n\n // Finished wrapper for guaranteed cleanup on response completion/error\n finished(res, (err) => {\n if (err && err.code !== \"ERR_STREAM_DESTROYED\") {\n console.error(`[XClawRouter] Response finished with error: ${err.message}`);\n }\n // Note: heartbeatInterval cleanup happens in res.on(\"close\") handler\n // Note: completed and dedup cleanup happens in the res.on(\"close\") handler below\n });\n\n // Request finished wrapper for complete stream lifecycle tracking\n finished(req, (err) => {\n if (err && err.code !== \"ERR_STREAM_DESTROYED\") {\n console.error(`[XClawRouter] Request finished with error: ${err.message}`);\n }\n });\n\n // Health check with optional balance info\n if (req.url === \"/health\" || req.url?.startsWith(\"/health?\")) {\n const url = new URL(req.url, \"http://localhost\");\n const full = url.searchParams.get(\"full\") === \"true\";\n\n const response: Record = {\n status: \"ok\",\n wallet: account.address,\n paymentChain,\n };\n if (solanaAddress) {\n response.solana = solanaAddress;\n }\n if (upstreamProxy) {\n response.upstreamProxy = upstreamProxy;\n }\n\n if (full) {\n try {\n const balanceInfo = await balanceMonitor.checkBalance();\n response.balance = balanceInfo.balanceUSD;\n response.isLow = balanceInfo.isLow;\n response.isEmpty = balanceInfo.isEmpty;\n } catch {\n response.balanceError = \"Could not fetch balance\";\n }\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(response));\n return;\n }\n\n // Cache stats endpoint\n if (req.url === \"/cache\" || req.url?.startsWith(\"/cache?\")) {\n const stats = responseCache.getStats();\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n });\n res.end(JSON.stringify(stats, null, 2));\n return;\n }\n\n // Stats clear endpoint - delete all log files\n if (req.url === \"/stats\" && req.method === \"DELETE\") {\n try {\n const result = await clearStats();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ cleared: true, deletedFiles: result.deletedFiles }));\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `Failed to clear stats: ${err instanceof Error ? err.message : String(err)}`,\n }),\n );\n }\n return;\n }\n\n // Stats API endpoint - returns JSON for programmatic access\n if (req.url === \"/stats\" || req.url?.startsWith(\"/stats?\")) {\n try {\n const url = new URL(req.url, \"http://localhost\");\n const days = parseInt(url.searchParams.get(\"days\") || \"7\", 10);\n const stats = await getStats(Math.min(days, 30));\n\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n });\n res.end(\n JSON.stringify(\n {\n ...stats,\n providerErrors: Object.fromEntries(perProviderErrors),\n },\n null,\n 2,\n ),\n );\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `Failed to get stats: ${err instanceof Error ? err.message : String(err)}`,\n }),\n );\n }\n return;\n }\n\n // --- Handle /v1/models locally (no upstream call needed) ---\n if (req.url === \"/v1/models\" && req.method === \"GET\") {\n const models = buildProxyModelList();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ object: \"list\", data: models }));\n return;\n }\n\n // --- Serve locally cached images (~/.openclaw/blockrun/images/) ---\n if (req.url?.startsWith(\"/images/\") && req.method === \"GET\") {\n const filename = req.url\n .slice(\"/images/\".length)\n .split(\"?\")[0]!\n .replace(/[^a-zA-Z0-9._-]/g, \"\");\n if (!filename) {\n res.writeHead(400);\n res.end(\"Bad request\");\n return;\n }\n const filePath = join(IMAGE_DIR, filename);\n try {\n const s = await fsStat(filePath);\n if (!s.isFile()) throw new Error(\"not a file\");\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"png\";\n const mime: Record = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n gif: \"image/gif\",\n };\n const data = await readFile(filePath);\n res.writeHead(200, {\n \"Content-Type\": mime[ext] ?? \"application/octet-stream\",\n \"Content-Length\": data.length,\n });\n res.end(data);\n } catch {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image not found\" }));\n }\n return;\n }\n\n // --- Serve locally cached audio (~/.openclaw/blockrun/audio/) ---\n if (req.url?.startsWith(\"/audio/\") && req.method === \"GET\") {\n const filename = req.url\n .slice(\"/audio/\".length)\n .split(\"?\")[0]!\n .replace(/[^a-zA-Z0-9._-]/g, \"\");\n if (!filename) {\n res.writeHead(400);\n res.end(\"Bad request\");\n return;\n }\n const filePath = join(AUDIO_DIR, filename);\n try {\n const s = await fsStat(filePath);\n if (!s.isFile()) throw new Error(\"not a file\");\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"mp3\";\n const mime: Record = {\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n m4a: \"audio/mp4\",\n };\n const data = await readFile(filePath);\n res.writeHead(200, {\n \"Content-Type\": mime[ext] ?? \"audio/mpeg\",\n \"Content-Length\": data.length,\n });\n res.end(data);\n } catch {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Audio not found\" }));\n }\n return;\n }\n\n // --- Serve locally cached videos (~/.openclaw/blockrun/videos/) ---\n if (req.url?.startsWith(\"/videos/\") && req.method === \"GET\") {\n const filename = req.url\n .slice(\"/videos/\".length)\n .split(\"?\")[0]!\n .replace(/[^a-zA-Z0-9._-]/g, \"\");\n if (!filename) {\n res.writeHead(400);\n res.end(\"Bad request\");\n return;\n }\n const filePath = join(VIDEO_DIR, filename);\n try {\n const s = await fsStat(filePath);\n if (!s.isFile()) throw new Error(\"not a file\");\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"mp4\";\n const mime: Record = {\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mov: \"video/quicktime\",\n };\n const data = await readFile(filePath);\n res.writeHead(200, {\n \"Content-Type\": mime[ext] ?? \"video/mp4\",\n \"Content-Length\": data.length,\n });\n res.end(data);\n } catch {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Video not found\" }));\n }\n return;\n }\n\n // --- Handle /v1/images/generations: proxy with x402 payment + save data URIs locally ---\n // NOTE: image generation endpoints bypass maxCostPerRun budget tracking entirely.\n // Cost is charged via x402 micropayment directly — no session accumulation or cap enforcement.\n if (req.url === \"/v1/images/generations\" && req.method === \"POST\") {\n const imgStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const reqBody = Buffer.concat(chunks);\n // Parse request for usage logging\n let imgModel = \"unknown\";\n let imgCost = 0;\n try {\n const parsed = JSON.parse(reqBody.toString());\n imgModel = parsed.model || \"openai/dall-e-3\";\n const n = parsed.n || 1;\n imgCost = estimateImageCost(imgModel, parsed.size, n);\n } catch {\n /* use defaults */\n }\n try {\n const upstream = await payFetch(`${apiBase}/v1/images/generations`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const text = await upstream.text();\n if (!upstream.ok) {\n res.writeHead(upstream.status, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n let result: { created?: number; data?: Array<{ url?: string; revised_prompt?: string }> };\n try {\n result = JSON.parse(text);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n // Save images to ~/.openclaw/blockrun/images/ and replace with localhost URLs\n // Handles both base64 data URIs (Google) and HTTP URLs (DALL-E 3)\n if (result.data?.length) {\n await mkdir(IMAGE_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const img of result.data) {\n const dataUriMatch = img.url?.match(/^data:(image\\/\\w+);base64,(.+)$/);\n if (dataUriMatch) {\n const [, mimeType, b64] = dataUriMatch;\n const ext = mimeType === \"image/jpeg\" ? \"jpg\" : (mimeType!.split(\"/\")[1] ?? \"png\");\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n await writeFile(join(IMAGE_DIR, filename), Buffer.from(b64!, \"base64\"));\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image saved → ${img.url}`);\n } else if (img.url?.startsWith(\"https://\") || img.url?.startsWith(\"http://\")) {\n try {\n const imgResp = await fetch(img.url);\n if (imgResp.ok) {\n const contentType = imgResp.headers.get(\"content-type\") ?? \"image/png\";\n const ext =\n contentType.includes(\"jpeg\") || contentType.includes(\"jpg\")\n ? \"jpg\"\n : contentType.includes(\"webp\")\n ? \"webp\"\n : \"png\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await imgResp.arrayBuffer());\n await writeFile(join(IMAGE_DIR, filename), buf);\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image downloaded & saved → ${img.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download image, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n // Log image generation usage with actual x402 payment (previously missing entirely)\n const imgActualCost = paymentStore.getStore()?.amountUsd ?? imgCost;\n logUsage({\n timestamp: new Date().toISOString(),\n model: imgModel,\n tier: \"IMAGE\",\n cost: imgActualCost,\n baselineCost: imgActualCost,\n savings: 0,\n latencyMs: Date.now() - imgStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Image generation error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image generation failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle /v1/images/image2image: proxy with x402 payment + save images locally ---\n // Accepts image as: data URI, local file path, ~/path, or HTTP(S) URL\n if (req.url === \"/v1/images/image2image\" && req.method === \"POST\") {\n const img2imgStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const rawBody = Buffer.concat(chunks);\n\n // Resolve image/mask fields: file paths and URLs → data URIs\n let reqBody: string;\n // eslint-disable-next-line no-useless-assignment -- reassigned in try, used after catch\n let img2imgModel = \"openai/gpt-image-1\";\n // eslint-disable-next-line no-useless-assignment -- reassigned in try, used after catch\n let img2imgCost = 0;\n try {\n const parsed = JSON.parse(rawBody.toString());\n for (const field of [\"image\", \"mask\"] as const) {\n const val = parsed[field];\n if (typeof val !== \"string\" || !val) continue;\n if (val.startsWith(\"data:\")) {\n // Already a data URI — pass through\n } else if (val.startsWith(\"https://\") || val.startsWith(\"http://\")) {\n // Download URL → data URI\n const imgResp = await fetch(val);\n if (!imgResp.ok)\n throw new Error(`Failed to download ${field} from ${val}: HTTP ${imgResp.status}`);\n const contentType = imgResp.headers.get(\"content-type\") ?? \"image/png\";\n const buf = Buffer.from(await imgResp.arrayBuffer());\n parsed[field] = `data:${contentType};base64,${buf.toString(\"base64\")}`;\n console.log(\n `[XClawRouter] img2img: downloaded ${field} URL → data URI (${buf.length} bytes)`,\n );\n } else {\n // Local file path → data URI\n parsed[field] = readImageFileAsDataUri(val);\n console.log(`[XClawRouter] img2img: read ${field} file → data URI`);\n }\n }\n // Default model if not specified\n if (!parsed.model) parsed.model = \"openai/gpt-image-1\";\n img2imgModel = parsed.model;\n img2imgCost = estimateImageCost(img2imgModel, parsed.size, parsed.n || 1);\n reqBody = JSON.stringify(parsed);\n } catch (parseErr) {\n const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid request\", details: msg }));\n return;\n }\n\n try {\n const upstream = await payFetch(`${apiBase}/v1/images/image2image`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const text = await upstream.text();\n if (!upstream.ok) {\n res.writeHead(upstream.status, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n let result: { created?: number; data?: Array<{ url?: string; revised_prompt?: string }> };\n try {\n result = JSON.parse(text);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n // Save images to ~/.openclaw/blockrun/images/ and replace with localhost URLs\n // Handles both base64 data URIs (Google) and HTTP URLs (DALL-E 3)\n if (result.data?.length) {\n await mkdir(IMAGE_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const img of result.data) {\n const dataUriMatch = img.url?.match(/^data:(image\\/\\w+);base64,(.+)$/);\n if (dataUriMatch) {\n const [, mimeType, b64] = dataUriMatch;\n const ext = mimeType === \"image/jpeg\" ? \"jpg\" : (mimeType!.split(\"/\")[1] ?? \"png\");\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n await writeFile(join(IMAGE_DIR, filename), Buffer.from(b64!, \"base64\"));\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image saved → ${img.url}`);\n } else if (img.url?.startsWith(\"https://\") || img.url?.startsWith(\"http://\")) {\n try {\n const imgResp = await fetch(img.url);\n if (imgResp.ok) {\n const contentType = imgResp.headers.get(\"content-type\") ?? \"image/png\";\n const ext =\n contentType.includes(\"jpeg\") || contentType.includes(\"jpg\")\n ? \"jpg\"\n : contentType.includes(\"webp\")\n ? \"webp\"\n : \"png\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await imgResp.arrayBuffer());\n await writeFile(join(IMAGE_DIR, filename), buf);\n img.url = `http://localhost:${port}/images/${filename}`;\n console.log(`[XClawRouter] Image downloaded & saved → ${img.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download image, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n // Log image editing usage with actual x402 payment (previously missing entirely)\n const img2imgActualCost = paymentStore.getStore()?.amountUsd ?? img2imgCost;\n logUsage({\n timestamp: new Date().toISOString(),\n model: img2imgModel,\n tier: \"IMAGE\",\n cost: img2imgActualCost,\n baselineCost: img2imgActualCost,\n savings: 0,\n latencyMs: Date.now() - img2imgStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Image editing error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image editing failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle /v1/audio/generations: proxy with x402 payment + save audio locally ---\n if (req.url === \"/v1/audio/generations\" && req.method === \"POST\") {\n const audioStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const reqBody = Buffer.concat(chunks);\n let audioModel = \"minimax/music-2.5+\";\n try {\n const parsed = JSON.parse(reqBody.toString());\n audioModel = parsed.model || audioModel;\n } catch {\n /* use defaults */\n }\n try {\n const upstream = await payFetch(`${apiBase}/v1/audio/generations`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const text = await upstream.text();\n if (!upstream.ok) {\n res.writeHead(upstream.status, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n let result: {\n created?: number;\n model?: string;\n data?: Array<{ url?: string; duration_seconds?: number; lyrics?: string }>;\n };\n try {\n result = JSON.parse(text);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(text);\n return;\n }\n // Download audio from remote URL and save locally\n if (result.data?.length) {\n await mkdir(AUDIO_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const track of result.data) {\n if (track.url?.startsWith(\"https://\") || track.url?.startsWith(\"http://\")) {\n try {\n const audioResp = await fetch(track.url);\n if (audioResp.ok) {\n const contentType = audioResp.headers.get(\"content-type\") ?? \"audio/mpeg\";\n const ext = contentType.includes(\"wav\") ? \"wav\" : \"mp3\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await audioResp.arrayBuffer());\n await writeFile(join(AUDIO_DIR, filename), buf);\n track.url = `http://localhost:${port}/audio/${filename}`;\n console.log(`[XClawRouter] Audio saved → ${track.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download audio, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n const audioActualCost = paymentStore.getStore()?.amountUsd ?? 0.15;\n logUsage({\n timestamp: new Date().toISOString(),\n model: audioModel,\n tier: \"AUDIO\",\n cost: audioActualCost,\n baselineCost: audioActualCost,\n savings: 0,\n latencyMs: Date.now() - audioStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Audio generation error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Audio generation failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle /v1/videos/generations: async submit + poll ---\n // Server protocol (BlockRun 2026-04-23+):\n // POST /v1/videos/generations → 202 { id, poll_url } (payment verified, not settled)\n // GET /v1/videos/generations/{id} → 202 while queued/in_progress, 200 on completed\n // (settles on the first completed poll)\n // We collapse this back into a single blocking POST for the client — upstream\n // polling happens server-side and the client sees one HTTP round-trip.\n if (req.url === \"/v1/videos/generations\" && req.method === \"POST\") {\n const videoStartTime = Date.now();\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const reqBody = Buffer.concat(chunks);\n let videoModel = \"xai/grok-imagine-video\";\n let videoDuration: number | undefined;\n try {\n const parsed = JSON.parse(reqBody.toString());\n videoModel = parsed.model || videoModel;\n videoDuration =\n typeof parsed.duration_seconds === \"number\" ? parsed.duration_seconds : undefined;\n } catch {\n /* use defaults */\n }\n try {\n // Step 1: submit job. Server returns 202 with poll_url.\n const submitResp = await payFetch(`${apiBase}/v1/videos/generations`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: reqBody,\n });\n const submitText = await submitResp.text();\n if (!submitResp.ok && submitResp.status !== 202) {\n res.writeHead(submitResp.status, { \"Content-Type\": \"application/json\" });\n res.end(submitText);\n return;\n }\n let submitResult: {\n id?: string;\n poll_url?: string;\n status?: string;\n // Legacy (pre-2026-04-23) servers still return the final result directly.\n created?: number;\n model?: string;\n data?: Array<{ url?: string; duration_seconds?: number; backed_up?: boolean }>;\n };\n try {\n submitResult = JSON.parse(submitText);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(submitText);\n return;\n }\n\n // Step 2: if no poll_url, upstream responded with the final result (legacy server) —\n // drop through to the same local-caching path as before.\n let finalResult: typeof submitResult = submitResult;\n if (submitResult.poll_url && submitResult.id) {\n const apiOrigin = new URL(apiBase).origin;\n const pollUrl = submitResult.poll_url.startsWith(\"http\")\n ? submitResult.poll_url\n : `${apiOrigin}${submitResult.poll_url}`;\n console.log(\n `[XClawRouter] Video job submitted (id=${submitResult.id}), polling upstream — typical 60–180s...`,\n );\n\n // Upstream typically 60-180s. Poll every 5s, bail after ~5min total.\n // Auth is 10min per server config; we stop before that.\n const pollDeadline = Date.now() + 300_000;\n const pollInterval = 5_000;\n // Small initial delay so the upstream has a chance to start.\n await new Promise((r) => setTimeout(r, 3_000));\n let pollError: string | undefined;\n while (Date.now() < pollDeadline) {\n const pollResp = await payFetch(pollUrl, {\n method: \"GET\",\n headers: { \"user-agent\": USER_AGENT },\n });\n const pollText = await pollResp.text();\n let pollBody: typeof submitResult & { error?: string } = {};\n try {\n pollBody = JSON.parse(pollText);\n } catch {\n pollError = `Non-JSON poll response (${pollResp.status}): ${pollText.slice(0, 200)}`;\n break;\n }\n if (\n pollResp.status === 202 ||\n pollBody.status === \"queued\" ||\n pollBody.status === \"in_progress\"\n ) {\n await new Promise((r) => setTimeout(r, pollInterval));\n continue;\n }\n if (pollBody.status === \"failed\") {\n pollError = pollBody.error ?? \"Upstream video generation failed\";\n break;\n }\n if (pollResp.ok && pollBody.status === \"completed\") {\n finalResult = pollBody;\n break;\n }\n // Any other non-OK: surface it.\n if (!pollResp.ok) {\n res.writeHead(pollResp.status, { \"Content-Type\": \"application/json\" });\n res.end(pollText);\n return;\n }\n // OK but no known status — treat as final and hand through.\n finalResult = pollBody;\n break;\n }\n if (pollError) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Video generation failed\", details: pollError }));\n return;\n }\n if (!finalResult.data) {\n res.writeHead(504, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: \"Video generation timed out\",\n details: `Upstream did not complete within 5 minutes (job id=${submitResult.id}). No payment has been settled.`,\n }),\n );\n return;\n }\n }\n\n // Step 3: download any hosted URLs to local disk + rewrite to localhost.\n if (finalResult.data?.length) {\n await mkdir(VIDEO_DIR, { recursive: true });\n const port = (server.address() as AddressInfo | null)?.port ?? 8402;\n for (const clip of finalResult.data) {\n if (clip.url?.startsWith(\"https://\") || clip.url?.startsWith(\"http://\")) {\n try {\n const videoResp = await fetch(clip.url);\n if (videoResp.ok) {\n const contentType = videoResp.headers.get(\"content-type\") ?? \"video/mp4\";\n const ext = contentType.includes(\"webm\")\n ? \"webm\"\n : contentType.includes(\"quicktime\")\n ? \"mov\"\n : \"mp4\";\n const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;\n const buf = Buffer.from(await videoResp.arrayBuffer());\n await writeFile(join(VIDEO_DIR, filename), buf);\n clip.url = `http://localhost:${port}/videos/${filename}`;\n console.log(`[XClawRouter] Video saved → ${clip.url}`);\n }\n } catch (downloadErr) {\n console.warn(\n `[XClawRouter] Failed to download video, using original URL: ${downloadErr instanceof Error ? downloadErr.message : String(downloadErr)}`,\n );\n }\n }\n }\n }\n const videoActualCost =\n paymentStore.getStore()?.amountUsd ?? estimateVideoCost(videoModel, videoDuration);\n logUsage({\n timestamp: new Date().toISOString(),\n model: videoModel,\n tier: \"VIDEO\",\n cost: videoActualCost,\n baselineCost: videoActualCost,\n savings: 0,\n latencyMs: Date.now() - videoStartTime,\n }).catch(() => {});\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(finalResult));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Video generation error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Video generation failed\", details: msg }));\n }\n }\n return;\n }\n\n // --- Handle paid API paths (/v1/partner/*, /v1/pm/*, /v1/exa/*, /v1/modal/*,\n // /v1/stocks/*, /v1/usstock/*, /v1/crypto/*, /v1/fx/*, /v1/commodity/*) ---\n if (req.url?.match(/^\\/v1\\/(?:partner|pm|exa|modal|stocks|usstock|crypto|fx|commodity)\\//)) {\n try {\n await proxyPaidApiRequest(\n req,\n res,\n apiBase,\n payFetch,\n () => paymentStore.getStore()?.amountUsd ?? 0,\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n options.onError?.(error);\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Partner proxy error: ${error.message}`, type: \"partner_error\" },\n }),\n );\n }\n }\n return;\n }\n\n // Only proxy paths starting with /v1\n if (!req.url?.startsWith(\"/v1\")) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n return;\n }\n\n try {\n await proxyRequest(\n req,\n res,\n apiBase,\n payFetch,\n options,\n routerOpts,\n deduplicator,\n balanceMonitor,\n sessionStore,\n responseCache,\n sessionJournal,\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n options.onError?.(error);\n\n if (!res.headersSent) {\n res.writeHead(502, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Proxy error: ${error.message}`, type: \"proxy_error\" },\n }),\n );\n } else if (!res.writableEnded) {\n // Headers already sent (streaming) — send error as SSE event\n res.write(\n `data: ${JSON.stringify({ error: { message: error.message, type: \"proxy_error\" } })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n }\n }\n }); // end paymentStore.run()\n });\n\n // Listen on configured port with retry logic for TIME_WAIT handling\n // When gateway restarts quickly, the port may still be in TIME_WAIT state.\n // We retry with delay instead of incorrectly assuming a proxy is running.\n const tryListen = (attempt: number): Promise => {\n return new Promise((resolveAttempt, rejectAttempt) => {\n const onError = async (err: NodeJS.ErrnoException) => {\n server.removeListener(\"error\", onError);\n\n if (err.code === \"EADDRINUSE\") {\n // Port is in use - check if a proxy is actually running\n const existingProxy2 = await checkExistingProxy(listenPort);\n if (existingProxy2) {\n // Proxy is actually running - this is fine, reuse it\n console.log(`[XClawRouter] Existing proxy detected on port ${listenPort}, reusing`);\n rejectAttempt({\n code: \"REUSE_EXISTING\",\n wallet: existingProxy2.wallet,\n existingChain: existingProxy2.paymentChain,\n });\n return;\n }\n\n // Port is in TIME_WAIT (no proxy responding) - retry after delay\n if (attempt < PORT_RETRY_ATTEMPTS) {\n console.log(\n `[XClawRouter] Port ${listenPort} in TIME_WAIT, retrying in ${PORT_RETRY_DELAY_MS}ms (attempt ${attempt}/${PORT_RETRY_ATTEMPTS})`,\n );\n rejectAttempt({ code: \"RETRY\", attempt });\n return;\n }\n\n // Max retries exceeded\n console.error(\n `[XClawRouter] Port ${listenPort} still in use after ${PORT_RETRY_ATTEMPTS} attempts`,\n );\n rejectAttempt(err);\n return;\n }\n\n rejectAttempt(err);\n };\n\n server.once(\"error\", onError);\n server.listen(listenPort, \"127.0.0.1\", () => {\n server.removeListener(\"error\", onError);\n resolveAttempt();\n });\n });\n };\n\n // Retry loop for port binding\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= PORT_RETRY_ATTEMPTS; attempt++) {\n try {\n await tryListen(attempt);\n break; // Success\n } catch (err: unknown) {\n const error = err as {\n code?: string;\n wallet?: string;\n existingChain?: string;\n attempt?: number;\n };\n\n if (error.code === \"REUSE_EXISTING\" && error.wallet) {\n // Validate payment chain matches (same check as pre-listen reuse path)\n if (error.existingChain && error.existingChain !== paymentChain) {\n throw new Error(\n `Existing proxy on port ${listenPort} is using ${error.existingChain} but ${paymentChain} was requested. ` +\n `Stop the existing proxy first or use a different port.`,\n { cause: err },\n );\n }\n\n // Proxy is running, reuse it\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n options.onReady?.(listenPort);\n return {\n port: listenPort,\n baseUrl,\n walletAddress: error.wallet,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n if (error.code === \"RETRY\") {\n // Wait before retry\n await new Promise((r) => setTimeout(r, PORT_RETRY_DELAY_MS));\n continue;\n }\n\n // Other error - throw\n lastError = err as Error;\n break;\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n // Server is now listening - set up remaining handlers\n const addr = server.address() as AddressInfo;\n const port = addr.port;\n const baseUrl = `http://127.0.0.1:${port}`;\n\n options.onReady?.(port);\n\n // Check for updates (non-blocking)\n checkForUpdates();\n\n // Add runtime error handler AFTER successful listen\n // This handles errors that occur during server operation (not just startup)\n server.on(\"error\", (err) => {\n console.error(`[XClawRouter] Server runtime error: ${err.message}`);\n options.onError?.(err);\n // Don't crash - log and continue\n });\n\n // Handle client connection errors (bad requests, socket errors)\n server.on(\"clientError\", (err, socket) => {\n console.error(`[XClawRouter] Client error: ${err.message}`);\n // Send 400 Bad Request if socket is still writable\n if (socket.writable && !socket.destroyed) {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n }\n });\n\n // Track connections for graceful cleanup\n server.on(\"connection\", (socket) => {\n connections.add(socket);\n\n // Set 5-minute timeout for streaming requests\n socket.setTimeout(300_000);\n\n socket.on(\"timeout\", () => {\n console.error(`[XClawRouter] Socket timeout, destroying connection`);\n socket.destroy();\n });\n\n socket.on(\"end\", () => {\n // Half-closed by client (FIN received)\n });\n\n socket.on(\"error\", (err) => {\n console.error(`[XClawRouter] Socket error: ${err.message}`);\n });\n\n socket.on(\"close\", () => {\n connections.delete(socket);\n });\n });\n\n return {\n port,\n baseUrl,\n walletAddress: account.address,\n solanaAddress,\n balanceMonitor,\n close: () =>\n new Promise((res, rej) => {\n const timeout = setTimeout(() => {\n rej(new Error(\"[XClawRouter] Close timeout after 4s\"));\n }, 4000);\n\n sessionStore.close();\n // Destroy all active connections before closing server\n for (const socket of connections) {\n socket.destroy();\n }\n connections.clear();\n server.close((err) => {\n clearTimeout(timeout);\n if (err) {\n rej(err);\n } else {\n res();\n }\n });\n }),\n };\n}\n\n/** Result of attempting a model request */\ntype ModelRequestResult = {\n success: boolean;\n response?: Response;\n errorBody?: string;\n errorStatus?: number;\n isProviderError?: boolean;\n errorCategory?: ErrorCategory; // Semantic error classification\n};\n\n/**\n * Detect degenerate completions (repetition loops).\n *\n * Pattern observed in production (2026-04-16): `nvidia/kimi-k2.5` on long\n * Chinese agentic conversations returned e.g. ` 好的!!!!!!!!...` for 1024\n * tokens and hit `finish_reason: \"length\"`. Similar failures occur with\n * other models on certain inputs.\n *\n * Criteria (conservative to avoid false positives on markdown tables etc.):\n * - `finish_reason` must be \"length\" (didn't self-terminate)\n * - tail has ≥60 of the same punctuation char in the last 80 chars\n */\nfunction isDegenerateCompletion(bodyBuf: Buffer): boolean {\n try {\n const parsed = JSON.parse(bodyBuf.toString()) as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n };\n const choice = parsed.choices?.[0];\n const finishReason = choice?.finish_reason;\n if (finishReason !== \"length\") return false;\n\n const content = choice?.message?.content ?? \"\";\n if (content.length < 80) return false;\n\n const tail = content.slice(-80);\n const tailChars = [...tail];\n const firstChar = tailChars[0];\n if (!/[^\\p{L}\\p{N}\\s]/u.test(firstChar)) return false;\n\n const sameCount = tailChars.filter((c) => c === firstChar).length;\n return sameCount >= 60;\n } catch {\n return false;\n }\n}\n\n/**\n * Attempt a request with a specific model.\n * Returns the response or error details for fallback decision.\n */\nasync function tryModelRequest(\n upstreamUrl: string,\n method: string,\n headers: Record,\n body: Buffer,\n modelId: string,\n maxTokens: number,\n payFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise,\n balanceMonitor: AnyBalanceMonitor,\n signal: AbortSignal,\n): Promise {\n // Update model in body and normalize messages\n let requestBody = body;\n try {\n const parsed = JSON.parse(body.toString()) as Record;\n parsed.model = toUpstreamModelId(modelId);\n\n // Normalize message roles (e.g., \"developer\" -> \"system\")\n if (Array.isArray(parsed.messages)) {\n parsed.messages = normalizeMessageRoles(parsed.messages as ChatMessage[]);\n }\n\n // Remove \"blockrun\" branding from system messages so upstream LLMs don't\n // adopt \"Blockrun\" as their identity (overriding user's SOUL.md persona).\n if (Array.isArray(parsed.messages)) {\n parsed.messages = debrandSystemMessages(parsed.messages as ChatMessage[], modelId);\n }\n\n // Truncate messages to stay under BlockRun's limit (200 messages)\n if (Array.isArray(parsed.messages)) {\n const truncationResult = truncateMessages(parsed.messages as ChatMessage[]);\n parsed.messages = truncationResult.messages;\n }\n\n // Sanitize tool IDs to match Anthropic's pattern (alphanumeric, underscore, hyphen only)\n if (Array.isArray(parsed.messages)) {\n parsed.messages = sanitizeToolIds(parsed.messages as ChatMessage[]);\n }\n\n // Normalize messages for Google models (first non-system message must be \"user\")\n if (isGoogleModel(modelId) && Array.isArray(parsed.messages)) {\n parsed.messages = normalizeMessagesForGoogle(parsed.messages as ChatMessage[]);\n }\n\n // Normalize messages for thinking-enabled requests (add reasoning_content to all assistant messages)\n // Check request flags AND target model - reasoning models have thinking enabled server-side\n const hasThinkingEnabled = !!(\n parsed.thinking ||\n parsed.extended_thinking ||\n isReasoningModel(modelId)\n );\n if (hasThinkingEnabled && Array.isArray(parsed.messages)) {\n parsed.messages = normalizeMessagesForThinking(parsed.messages as ExtendedChatMessage[]);\n }\n\n requestBody = Buffer.from(JSON.stringify(parsed));\n } catch {\n // If body isn't valid JSON, use as-is\n }\n\n try {\n const response = await payFetch(upstreamUrl, {\n method,\n headers,\n body: requestBody.length > 0 ? new Uint8Array(requestBody) : undefined,\n signal,\n });\n\n // Check for provider errors\n if (response.status !== 200) {\n // Clone response to read body without consuming it\n const errorBodyChunks = await readBodyWithTimeout(response.body, ERROR_BODY_READ_TIMEOUT_MS);\n const errorBody = Buffer.concat(errorBodyChunks).toString();\n const category = categorizeError(response.status, errorBody);\n\n return {\n success: false,\n errorBody,\n errorStatus: response.status,\n isProviderError: category !== null,\n errorCategory: category ?? undefined,\n };\n }\n\n // Detect provider degradation hidden inside HTTP 200 responses.\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"json\") || contentType.includes(\"text\")) {\n try {\n const clonedChunks = await readBodyWithTimeout(\n response.clone().body,\n ERROR_BODY_READ_TIMEOUT_MS,\n );\n const responseBody = Buffer.concat(clonedChunks).toString();\n const degradedReason = detectDegradedSuccessResponse(responseBody);\n if (degradedReason) {\n return {\n success: false,\n errorBody: degradedReason,\n errorStatus: 503,\n isProviderError: true,\n };\n }\n } catch {\n // Ignore body inspection failures and pass through response.\n }\n }\n\n return { success: true, response };\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n errorBody: errorMsg,\n errorStatus: 500,\n isProviderError: true, // Network errors are retryable\n };\n }\n}\n\n/**\n * Proxy a single request through x402 payment flow to BlockRun API.\n *\n * Optimizations applied in order:\n * 1. Dedup check — if same request body seen within 30s, replay cached response\n * 2. Streaming heartbeat — for stream:true, send 200 + heartbeats immediately\n * 3. Smart routing — when model is \"blockrun/auto\", pick cheapest capable model\n * 4. Fallback chain — on provider errors, try next model in tier's fallback list\n */\nasync function proxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n apiBase: string,\n payFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise,\n options: ProxyOptions,\n routerOpts: RouterOptions,\n deduplicator: RequestDeduplicator,\n balanceMonitor: AnyBalanceMonitor,\n sessionStore: SessionStore,\n responseCache: ResponseCache,\n sessionJournal: SessionJournal,\n): Promise {\n const startTime = Date.now();\n\n // Build upstream URL: /v1/chat/completions → https://blockrun.ai/api/v1/chat/completions\n const upstreamUrl = `${apiBase}${req.url}`;\n\n // Collect request body\n const bodyChunks: Buffer[] = [];\n for await (const chunk of req) {\n bodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n let body = Buffer.concat(bodyChunks);\n\n // Track original context size for response headers\n const originalContextSizeKB = Math.ceil(body.length / 1024);\n\n // Routing debug info is on by default; disable with x-clawrouter-debug: false\n const debugMode = req.headers[\"x-clawrouter-debug\"] !== \"false\";\n\n // --- Smart routing ---\n let routingDecision: RoutingDecision | undefined;\n let hasTools = false; // true when request includes a tools schema\n let hasVision = false; // true when request includes image_url content parts\n let isStreaming = false;\n let modelId = \"\";\n let maxTokens = 4096;\n let routingProfile: \"eco\" | \"auto\" | \"premium\" | null = null;\n let stickyExplicitModel: string | undefined;\n let balanceFallbackNotice: string | undefined;\n let budgetDowngradeNotice: string | undefined;\n let budgetDowngradeHeaderMode: \"downgraded\" | undefined;\n let accumulatedContent = \"\"; // For session journal event extraction\n let responseInputTokens: number | undefined;\n let responseOutputTokens: number | undefined;\n let requestHadError = false; // Set to true when all models fail → used in logUsage\n const isChatCompletion = req.url?.includes(\"/chat/completions\");\n\n // Extract session ID early for journal operations (header-only at this point)\n const sessionId = getSessionId(req.headers as Record);\n // Full session ID (header + content-derived) — populated once messages are parsed\n let effectiveSessionId: string | undefined = sessionId;\n\n if (isChatCompletion && body.length > 0) {\n try {\n const parsed = JSON.parse(body.toString()) as Record;\n isStreaming = parsed.stream === true;\n modelId = (parsed.model as string) || \"\";\n maxTokens = (parsed.max_tokens as number) || 4096;\n let bodyModified = false;\n\n // Extract last user message content (used by session journal + /debug command)\n const parsedMessages = Array.isArray(parsed.messages)\n ? (parsed.messages as Array<{ role: string; content: unknown }>)\n : [];\n const lastUserMsg = [...parsedMessages].reverse().find((m) => m.role === \"user\");\n\n // Early tool detection for ALL request types (explicit model + routing profile).\n // The routing-profile branch may re-assign below (no-op since same value).\n hasTools = Array.isArray(parsed.tools) && (parsed.tools as unknown[]).length > 0;\n\n // Preserve OpenClaw tool schemas exactly as provided.\n // Stripping tools like web_search/web_fetch/browser/exec makes the upstream\n // model believe those capabilities do not exist, which breaks agentic runs.\n // Reliability is handled later via agentic routing and tool-support filters.\n\n const rawLastContent = lastUserMsg?.content;\n const lastContent =\n typeof rawLastContent === \"string\"\n ? rawLastContent\n : Array.isArray(rawLastContent)\n ? (rawLastContent as Array<{ type: string; text?: string }>)\n .filter((b) => b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\" \")\n : \"\";\n\n // --- Session Journal: Inject context if needed ---\n // Check if the last user message asks about past work\n if (sessionId && parsedMessages.length > 0) {\n const messages = parsedMessages;\n\n if (sessionJournal.needsContext(lastContent)) {\n const journalText = sessionJournal.format(sessionId);\n if (journalText) {\n // Find system message and prepend journal, or add a new system message\n const sysIdx = messages.findIndex((m) => m.role === \"system\");\n if (sysIdx >= 0 && typeof messages[sysIdx].content === \"string\") {\n messages[sysIdx] = {\n ...messages[sysIdx],\n content: journalText + \"\\n\\n\" + messages[sysIdx].content,\n };\n } else {\n messages.unshift({ role: \"system\", content: journalText });\n }\n parsed.messages = messages;\n bodyModified = true;\n console.log(\n `[XClawRouter] Injected session journal (${journalText.length} chars) for session ${sessionId.slice(0, 8)}...`,\n );\n }\n }\n }\n\n // --- /debug command: return routing diagnostics without calling upstream ---\n if (lastContent.startsWith(\"/debug\")) {\n const debugPrompt = lastContent.slice(\"/debug\".length).trim() || \"hello\";\n const messages = parsed.messages as Array<{ role: string; content: unknown }>;\n const systemMsg = messages?.find((m) => m.role === \"system\");\n const systemPrompt = typeof systemMsg?.content === \"string\" ? systemMsg.content : undefined;\n const fullText = `${systemPrompt ?? \"\"} ${debugPrompt}`;\n const estimatedTokens = Math.ceil(fullText.length / 4);\n\n // Determine routing profile\n const normalizedModel =\n typeof parsed.model === \"string\" ? parsed.model.trim().toLowerCase() : \"\";\n const profileName = normalizedModel.replace(\"blockrun/\", \"\");\n const debugProfile = (\n [\"eco\", \"auto\", \"premium\"].includes(profileName) ? profileName : \"auto\"\n ) as \"eco\" | \"auto\" | \"premium\";\n\n // Run scoring\n const scoring = classifyByRules(\n debugPrompt,\n systemPrompt,\n estimatedTokens,\n DEFAULT_ROUTING_CONFIG.scoring,\n );\n\n // Run full routing decision\n const debugRouting = route(debugPrompt, systemPrompt, maxTokens, {\n ...routerOpts,\n routingProfile: debugProfile,\n });\n\n // Format dimension scores\n const dimLines = (scoring.dimensions ?? [])\n .map((d) => {\n const nameStr = (d.name + \":\").padEnd(24);\n const scoreStr = d.score.toFixed(2).padStart(6);\n const sigStr = d.signal ? ` [${d.signal}]` : \"\";\n return ` ${nameStr}${scoreStr}${sigStr}`;\n })\n .join(\"\\n\");\n\n // Session info\n const sess = sessionId ? sessionStore.getSession(sessionId) : undefined;\n const sessLine = sess\n ? `Session: ${sessionId!.slice(0, 8)}... → pinned: ${sess.model} (${sess.requestCount} requests)`\n : sessionId\n ? `Session: ${sessionId.slice(0, 8)}... → no pinned model`\n : \"Session: none\";\n\n const { simpleMedium, mediumComplex, complexReasoning } =\n DEFAULT_ROUTING_CONFIG.scoring.tierBoundaries;\n\n const debugText = [\n \"XClawRouter Debug\",\n \"\",\n `Profile: ${debugProfile} | Tier: ${debugRouting.tier} | Model: ${debugRouting.model}`,\n `Confidence: ${debugRouting.confidence.toFixed(2)} | Cost: $${debugRouting.costEstimate.toFixed(4)} | Savings: ${(debugRouting.savings * 100).toFixed(0)}%`,\n `Reasoning: ${debugRouting.reasoning}`,\n \"\",\n `Scoring (weighted: ${scoring.score.toFixed(3)})`,\n dimLines,\n \"\",\n `Tier Boundaries: SIMPLE <${simpleMedium.toFixed(2)} | MEDIUM <${mediumComplex.toFixed(2)} | COMPLEX <${complexReasoning.toFixed(2)} | REASONING >=${complexReasoning.toFixed(2)}`,\n \"\",\n sessLine,\n ].join(\"\\n\");\n\n // Build synthetic OpenAI chat completion response\n const completionId = `chatcmpl-debug-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n const syntheticResponse = {\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/debug\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: debugText },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n };\n\n if (isStreaming) {\n // SSE streaming response\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n const sseChunk = {\n id: completionId,\n object: \"chat.completion.chunk\",\n created: timestamp,\n model: \"clawrouter/debug\",\n choices: [\n {\n index: 0,\n delta: { role: \"assistant\", content: debugText },\n finish_reason: null,\n },\n ],\n };\n const sseDone = {\n id: completionId,\n object: \"chat.completion.chunk\",\n created: timestamp,\n model: \"clawrouter/debug\",\n choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }],\n };\n res.write(`data: ${JSON.stringify(sseChunk)}\\n\\n`);\n res.write(`data: ${JSON.stringify(sseDone)}\\n\\n`);\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(syntheticResponse));\n }\n console.log(`[XClawRouter] /debug command → ${debugRouting.tier} | ${debugRouting.model}`);\n return;\n }\n\n // --- /imagegen command: generate an image via BlockRun image API ---\n if (lastContent.startsWith(\"/imagegen\")) {\n const imageArgs = lastContent.slice(\"/imagegen\".length).trim();\n\n // Parse optional flags: /imagegen --model dall-e-3 --size 1792x1024 a cute cat\n let imageModel = \"google/nano-banana\";\n let imageSize = \"1024x1024\";\n let imagePrompt = imageArgs;\n\n // Extract --model flag\n const modelMatch = imageArgs.match(/--model\\s+(\\S+)/);\n if (modelMatch) {\n const raw = modelMatch[1];\n // Resolve shorthand aliases\n const IMAGE_MODEL_ALIASES: Record = {\n \"dall-e-3\": \"openai/dall-e-3\",\n dalle3: \"openai/dall-e-3\",\n dalle: \"openai/dall-e-3\",\n \"gpt-image\": \"openai/gpt-image-1\",\n \"gpt-image-1\": \"openai/gpt-image-1\",\n flux: \"black-forest/flux-1.1-pro\",\n \"flux-pro\": \"black-forest/flux-1.1-pro\",\n banana: \"google/nano-banana\",\n \"nano-banana\": \"google/nano-banana\",\n \"banana-pro\": \"google/nano-banana-pro\",\n \"nano-banana-pro\": \"google/nano-banana-pro\",\n };\n imageModel = IMAGE_MODEL_ALIASES[raw] ?? raw;\n imagePrompt = imagePrompt.replace(/--model\\s+\\S+/, \"\").trim();\n }\n\n // Extract --size flag\n const sizeMatch = imageArgs.match(/--size\\s+(\\d+x\\d+)/);\n if (sizeMatch) {\n imageSize = sizeMatch[1];\n imagePrompt = imagePrompt.replace(/--size\\s+\\d+x\\d+/, \"\").trim();\n }\n\n if (!imagePrompt) {\n const errorText = [\n \"Usage: /imagegen \",\n \"\",\n \"Options:\",\n \" --model Model to use (default: nano-banana)\",\n \" --size Image size (default: 1024x1024)\",\n \"\",\n \"Models:\",\n \" nano-banana Google Gemini Flash — $0.05/image\",\n \" banana-pro Google Gemini Pro — $0.10/image (up to 4K)\",\n \" dall-e-3 OpenAI DALL-E 3 — $0.04/image\",\n \" gpt-image OpenAI GPT Image 1 — $0.02/image\",\n \" flux Black Forest Flux 1.1 Pro — $0.04/image\",\n \"\",\n \"Examples:\",\n \" /imagegen a cat wearing sunglasses\",\n \" /imagegen --model dall-e-3 a futuristic city at sunset\",\n \" /imagegen --model banana-pro --size 2048x2048 mountain landscape\",\n ].join(\"\\n\");\n\n const completionId = `chatcmpl-image-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n if (isStreaming) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: { role: \"assistant\", content: errorText }, finish_reason: null }] })}\\n\\n`,\n );\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }] })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/image\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: errorText },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n }),\n );\n }\n console.log(`[XClawRouter] /imagegen command → showing usage help`);\n return;\n }\n\n // Call upstream image generation API\n console.log(\n `[XClawRouter] /imagegen command → ${imageModel} (${imageSize}): ${imagePrompt.slice(0, 80)}...`,\n );\n try {\n const imageUpstreamUrl = `${apiBase}/v1/images/generations`;\n const imageBody = JSON.stringify({\n model: imageModel,\n prompt: imagePrompt,\n size: imageSize,\n n: 1,\n });\n const imageResponse = await payFetch(imageUpstreamUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: imageBody,\n });\n\n const imageResult = (await imageResponse.json()) as {\n created?: number;\n data?: Array<{ url?: string; revised_prompt?: string }>;\n error?: string | { message?: string };\n };\n\n let responseText: string;\n if (!imageResponse.ok || imageResult.error) {\n const errMsg =\n typeof imageResult.error === \"string\"\n ? imageResult.error\n : ((imageResult.error as { message?: string })?.message ??\n `HTTP ${imageResponse.status}`);\n responseText = `Image generation failed: ${errMsg}`;\n console.log(`[XClawRouter] /imagegen error: ${errMsg}`);\n } else {\n const images = imageResult.data ?? [];\n if (images.length === 0) {\n responseText = \"Image generation returned no results.\";\n } else {\n const lines: string[] = [];\n for (const img of images) {\n if (img.url) {\n if (img.url.startsWith(\"data:\")) {\n try {\n const hostedUrl = await uploadDataUriToHost(img.url);\n lines.push(hostedUrl);\n } catch (uploadErr) {\n console.error(\n `[XClawRouter] /imagegen: failed to upload data URI: ${uploadErr instanceof Error ? uploadErr.message : String(uploadErr)}`,\n );\n lines.push(\n \"Image generated but upload failed. Try again or use --model dall-e-3.\",\n );\n }\n } else {\n lines.push(img.url);\n }\n }\n if (img.revised_prompt) lines.push(`Revised prompt: ${img.revised_prompt}`);\n }\n lines.push(\"\", `Model: ${imageModel} | Size: ${imageSize}`);\n responseText = lines.join(\"\\n\");\n }\n console.log(`[XClawRouter] /imagegen success: ${images.length} image(s) generated`);\n // Log /imagegen usage with actual x402 payment\n const imagegenActualCost =\n paymentStore.getStore()?.amountUsd ?? estimateImageCost(imageModel, imageSize, 1);\n logUsage({\n timestamp: new Date().toISOString(),\n model: imageModel,\n tier: \"IMAGE\",\n cost: imagegenActualCost,\n baselineCost: imagegenActualCost,\n savings: 0,\n latencyMs: 0,\n }).catch(() => {});\n }\n\n // Return as synthetic chat completion\n const completionId = `chatcmpl-image-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n if (isStreaming) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: { role: \"assistant\", content: responseText }, finish_reason: null }] })}\\n\\n`,\n );\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/image\", choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }] })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/image\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: responseText },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n }),\n );\n }\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] /imagegen error: ${errMsg}`);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Image generation failed: ${errMsg}`, type: \"image_error\" },\n }),\n );\n }\n }\n return;\n }\n\n // --- /img2img command: edit an image via BlockRun image2image API ---\n if (lastContent.startsWith(\"/img2img\")) {\n const imgArgs = lastContent.slice(\"/img2img\".length).trim();\n\n let img2imgModel = \"openai/gpt-image-1\";\n let img2imgSize = \"1024x1024\";\n let imagePath: string | null = null;\n let maskPath: string | null = null;\n let img2imgPrompt = imgArgs;\n\n const imageMatch = imgArgs.match(/--image\\s+(\\S+)/);\n if (imageMatch) {\n imagePath = imageMatch[1];\n img2imgPrompt = img2imgPrompt.replace(/--image\\s+\\S+/, \"\").trim();\n }\n\n const maskMatch = imgArgs.match(/--mask\\s+(\\S+)/);\n if (maskMatch) {\n maskPath = maskMatch[1];\n img2imgPrompt = img2imgPrompt.replace(/--mask\\s+\\S+/, \"\").trim();\n }\n\n const img2imgSizeMatch = imgArgs.match(/--size\\s+(\\d+x\\d+)/);\n if (img2imgSizeMatch) {\n img2imgSize = img2imgSizeMatch[1];\n img2imgPrompt = img2imgPrompt.replace(/--size\\s+\\d+x\\d+/, \"\").trim();\n }\n\n const img2imgModelMatch = imgArgs.match(/--model\\s+(\\S+)/);\n if (img2imgModelMatch) {\n const raw = img2imgModelMatch[1];\n const IMG2IMG_ALIASES: Record = {\n \"gpt-image\": \"openai/gpt-image-1\",\n \"gpt-image-1\": \"openai/gpt-image-1\",\n };\n img2imgModel = IMG2IMG_ALIASES[raw] ?? raw;\n img2imgPrompt = img2imgPrompt.replace(/--model\\s+\\S+/, \"\").trim();\n }\n\n const usageText = [\n \"Usage: /img2img --image \",\n \"\",\n \"Options:\",\n \" --image Source image path (required)\",\n \" --mask Mask image path (optional, white = area to edit)\",\n \" --model Model (default: gpt-image-1)\",\n \" --size Output size (default: 1024x1024)\",\n \"\",\n \"Models:\",\n \" gpt-image-1 OpenAI GPT Image 1 — $0.02/image\",\n \"\",\n \"Examples:\",\n \" /img2img --image ~/photo.png change background to starry sky\",\n \" /img2img --image ./cat.jpg --mask ./mask.png remove the background\",\n \" /img2img --image /tmp/portrait.png --size 1536x1024 add a hat\",\n ].join(\"\\n\");\n\n const sendImg2ImgText = (text: string) => {\n const completionId = `chatcmpl-img2img-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n if (isStreaming) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/img2img\", choices: [{ index: 0, delta: { role: \"assistant\", content: text }, finish_reason: null }] })}\\n\\n`,\n );\n res.write(\n `data: ${JSON.stringify({ id: completionId, object: \"chat.completion.chunk\", created: timestamp, model: \"clawrouter/img2img\", choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }] })}\\n\\n`,\n );\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: completionId,\n object: \"chat.completion\",\n created: timestamp,\n model: \"clawrouter/img2img\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content: text },\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n }),\n );\n }\n };\n\n if (!imagePath || !img2imgPrompt) {\n sendImg2ImgText(usageText);\n return;\n }\n\n let imageDataUri: string;\n let maskDataUri: string | undefined;\n try {\n imageDataUri = readImageFileAsDataUri(imagePath);\n if (maskPath) maskDataUri = readImageFileAsDataUri(maskPath);\n } catch (fileErr) {\n const fileErrMsg = fileErr instanceof Error ? fileErr.message : String(fileErr);\n sendImg2ImgText(`Failed to read image file: ${fileErrMsg}`);\n return;\n }\n\n console.log(\n `[XClawRouter] /img2img → ${img2imgModel} (${img2imgSize}): ${img2imgPrompt.slice(0, 80)}`,\n );\n\n try {\n const img2imgBody = JSON.stringify({\n model: img2imgModel,\n prompt: img2imgPrompt,\n image: imageDataUri,\n ...(maskDataUri ? { mask: maskDataUri } : {}),\n size: img2imgSize,\n n: 1,\n });\n\n const img2imgResponse = await payFetch(`${apiBase}/v1/images/image2image`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"user-agent\": USER_AGENT },\n body: img2imgBody,\n });\n\n const img2imgResult = (await img2imgResponse.json()) as {\n created?: number;\n data?: Array<{ url?: string; revised_prompt?: string }>;\n error?: string | { message?: string };\n };\n\n let responseText: string;\n if (!img2imgResponse.ok || img2imgResult.error) {\n const errMsg =\n typeof img2imgResult.error === \"string\"\n ? img2imgResult.error\n : ((img2imgResult.error as { message?: string })?.message ??\n `HTTP ${img2imgResponse.status}`);\n responseText = `Image editing failed: ${errMsg}`;\n console.log(`[XClawRouter] /img2img error: ${errMsg}`);\n } else {\n const images = img2imgResult.data ?? [];\n if (images.length === 0) {\n responseText = \"Image editing returned no results.\";\n } else {\n const lines: string[] = [];\n for (const img of images) {\n if (img.url) {\n if (img.url.startsWith(\"data:\")) {\n try {\n const hostedUrl = await uploadDataUriToHost(img.url);\n lines.push(hostedUrl);\n } catch (uploadErr) {\n console.error(\n `[XClawRouter] /img2img: failed to upload data URI: ${uploadErr instanceof Error ? uploadErr.message : String(uploadErr)}`,\n );\n lines.push(\"Image edited but upload failed. Try again.\");\n }\n } else {\n lines.push(img.url);\n }\n }\n if (img.revised_prompt) lines.push(`Revised prompt: ${img.revised_prompt}`);\n }\n lines.push(\"\", `Model: ${img2imgModel} | Size: ${img2imgSize}`);\n responseText = lines.join(\"\\n\");\n }\n console.log(`[XClawRouter] /img2img success: ${images.length} image(s)`);\n // Log /img2img usage with actual x402 payment\n const img2imgActualCost2 =\n paymentStore.getStore()?.amountUsd ?? estimateImageCost(img2imgModel, img2imgSize, 1);\n logUsage({\n timestamp: new Date().toISOString(),\n model: img2imgModel,\n tier: \"IMAGE\",\n cost: img2imgActualCost2,\n baselineCost: img2imgActualCost2,\n savings: 0,\n latencyMs: 0,\n }).catch(() => {});\n }\n\n sendImg2ImgText(responseText);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] /img2img error: ${errMsg}`);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: { message: `Image editing failed: ${errMsg}`, type: \"img2img_error\" },\n }),\n );\n }\n }\n return;\n }\n\n // Force stream: false — BlockRun API doesn't support streaming yet\n // XClawRouter handles SSE heartbeat simulation for upstream compatibility\n if (parsed.stream === true) {\n parsed.stream = false;\n bodyModified = true;\n }\n\n // Normalize model name for comparison (trim whitespace, lowercase)\n const normalizedModel =\n typeof parsed.model === \"string\" ? parsed.model.trim().toLowerCase() : \"\";\n\n // Resolve model aliases (e.g., \"claude\" -> \"anthropic/claude-sonnet-4-6\")\n const resolvedModel = resolveModelAlias(normalizedModel);\n const wasAlias = resolvedModel !== normalizedModel;\n\n // Check both normalizedModel and resolvedModel — OpenClaw may send \"openai/eco\"\n // which resolveModelAlias strips to \"eco\" (a valid routing profile)\n const isRoutingProfile =\n ROUTING_PROFILES.has(normalizedModel) || ROUTING_PROFILES.has(resolvedModel);\n\n // Extract routing profile type (free/eco/auto/premium)\n if (isRoutingProfile) {\n const profileName = resolvedModel.replace(\"blockrun/\", \"\");\n routingProfile = profileName as \"eco\" | \"auto\" | \"premium\";\n }\n\n // Debug: log received model name\n console.log(\n `[XClawRouter] Received model: \"${parsed.model}\" -> normalized: \"${normalizedModel}\"${wasAlias ? ` -> alias: \"${resolvedModel}\"` : \"\"}${routingProfile ? `, profile: ${routingProfile}` : \"\"}`,\n );\n\n // For explicit model requests, always canonicalize the model ID before upstream calls.\n // This ensures case/whitespace variants (e.g. \"DEEPSEEK/...\" or \" model \") route correctly.\n if (!isRoutingProfile) {\n if (parsed.model !== resolvedModel) {\n parsed.model = resolvedModel;\n bodyModified = true;\n }\n modelId = resolvedModel;\n\n // User explicitly chose this model — pin it to the session as a sticky\n // user-explicit pin. Future requests in the same session that come in\n // as routing profiles (e.g. blockrun/auto from OpenClaw's default\n // chat path) will respect this choice instead of re-routing.\n // This fixes the bug where /model in OpenClaw appeared to switch the\n // model (UI confirmed) but subsequent messages still used the\n // previously pinned auto-routed model.\n const explicitPinSessionId =\n getSessionId(req.headers as Record) ??\n deriveSessionId(parsedMessages);\n if (explicitPinSessionId) {\n // Use a generic tier — the explicit pin bypasses tier comparison anyway.\n sessionStore.setSession(explicitPinSessionId, resolvedModel, \"MEDIUM\", true);\n console.log(\n `[XClawRouter] Session ${explicitPinSessionId.slice(0, 8)}... user-explicit pin set: ${resolvedModel}`,\n );\n }\n }\n\n // Handle routing profiles (free/eco/auto/premium)\n if (isRoutingProfile) {\n {\n // eco/auto/premium - use tier routing\n // Check for session persistence - use pinned model if available\n // Fall back to deriving a session ID from message content when OpenClaw\n // doesn't send an explicit x-session-id header (the default behaviour).\n effectiveSessionId =\n getSessionId(req.headers as Record) ??\n deriveSessionId(parsedMessages);\n const existingSession = effectiveSessionId\n ? sessionStore.getSession(effectiveSessionId)\n : undefined;\n\n // Extract prompt from last user message (handles both string and Anthropic array content)\n const rawPrompt = lastUserMsg?.content;\n const prompt =\n typeof rawPrompt === \"string\"\n ? rawPrompt\n : Array.isArray(rawPrompt)\n ? (rawPrompt as Array<{ type: string; text?: string }>)\n .filter((b) => b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\" \")\n : \"\";\n const systemMsg = parsedMessages.find((m) => m.role === \"system\");\n const systemPrompt =\n typeof systemMsg?.content === \"string\" ? systemMsg.content : undefined;\n\n // Tool detection — when tools are present, force agentic tiers for reliable tool use\n const tools = parsed.tools as unknown[] | undefined;\n hasTools = Array.isArray(tools) && tools.length > 0;\n\n if (hasTools && tools) {\n console.log(`[XClawRouter] Tools detected (${tools.length}), forcing agentic tiers`);\n }\n\n // Vision detection: scan messages for image_url content parts\n hasVision = parsedMessages.some((m) => {\n if (Array.isArray(m.content)) {\n return (m.content as Array<{ type: string }>).some((p) => p.type === \"image_url\");\n }\n return false;\n });\n if (hasVision) {\n console.log(\n `[XClawRouter] Vision content detected, filtering to vision-capable models`,\n );\n }\n\n // Always route based on current request content\n routingDecision = route(prompt, systemPrompt, maxTokens, {\n ...routerOpts,\n routingProfile: routingProfile ?? undefined,\n hasTools,\n });\n\n // Keep agentic routing when tools are present, even for SIMPLE queries.\n // Tool-using requests need models with reliable function-call support;\n // demoting to non-agentic tiers causes fallback to models that refuse\n // tool schemas (gemini-flash-lite, deepseek) or lack tool support entirely.\n if (hasTools && routingDecision.tier === \"SIMPLE\") {\n console.log(\n `[XClawRouter] SIMPLE+tools: keeping agentic model ${routingDecision.model} (tools need reliable function-call support)`,\n );\n }\n\n if (existingSession) {\n // If the session was pinned by an explicit user choice (e.g. via\n // /model command), respect it unconditionally. The user's intent\n // wins over auto-routing tier escalation. This fixes the bug where\n // running /model blockrun/free/glm-4.7 didn't actually switch the\n // model, because the next request (which OpenClaw still sends as\n // a routing profile) would re-route through tier comparison.\n //\n // We override the routing decision and let execution fall through\n // to the upstream call below — without this short-circuit, the\n // tier-rank logic could downgrade or escalate away from the\n // user's choice.\n if (existingSession.userExplicit) {\n stickyExplicitModel = existingSession.model;\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... user-explicit pin: ${existingSession.model} (overriding auto-routed ${routingDecision.tier} → ${routingDecision.model})`,\n );\n parsed.model = existingSession.model;\n modelId = existingSession.model;\n bodyModified = true;\n sessionStore.touchSession(effectiveSessionId!);\n routingDecision = {\n ...routingDecision,\n model: existingSession.model,\n tier: existingSession.tier as Tier,\n };\n // Skip the rest of the existingSession branches; explicit pin wins.\n } else {\n // Never downgrade: only upgrade the session when the current request needs a higher\n // tier. This fixes the OpenClaw startup-message bias (the startup message always\n // scores low-complexity, which previously pinned all subsequent real queries to a\n // cheap model) while still preventing mid-task model switching on simple follow-ups.\n const tierRank: Record = {\n SIMPLE: 0,\n MEDIUM: 1,\n COMPLEX: 2,\n REASONING: 3,\n };\n const existingRank = tierRank[existingSession.tier] ?? 0;\n const newRank = tierRank[routingDecision.tier] ?? 0;\n\n if (newRank > existingRank) {\n // Current request needs higher capability — upgrade the session\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... upgrading: ${existingSession.tier} → ${routingDecision.tier} (${routingDecision.model})`,\n );\n parsed.model = routingDecision.model;\n modelId = routingDecision.model;\n bodyModified = true;\n if (effectiveSessionId) {\n sessionStore.setSession(\n effectiveSessionId,\n routingDecision.model,\n routingDecision.tier,\n );\n }\n } else if (routingDecision.tier === \"SIMPLE\") {\n // SIMPLE follow-up in an active session: let it use cheap routing.\n // e.g. \"你好\" or \"thanks\" after a complex task should not inherit the\n // expensive session model or recount all context tokens on a paid model.\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... SIMPLE follow-up, using cheap model: ${routingDecision.model} (bypassing pinned ${existingSession.tier})`,\n );\n parsed.model = routingDecision.model;\n modelId = routingDecision.model;\n bodyModified = true;\n sessionStore.touchSession(effectiveSessionId!);\n // routingDecision already reflects cheap model — no override needed\n } else {\n // Keep existing higher-tier model (prevent downgrade mid-task)\n console.log(\n `[XClawRouter] Session ${effectiveSessionId?.slice(0, 8)}... keeping pinned model: ${existingSession.model} (${existingSession.tier} >= ${routingDecision.tier})`,\n );\n parsed.model = existingSession.model;\n modelId = existingSession.model;\n bodyModified = true;\n sessionStore.touchSession(effectiveSessionId!);\n // Reflect the actual model used in the routing decision for logging/fallback\n routingDecision = {\n ...routingDecision,\n model: existingSession.model,\n tier: existingSession.tier as Tier,\n };\n }\n\n // --- Three-strike escalation: detect repetitive request patterns ---\n const lastAssistantMsg = [...parsedMessages]\n .reverse()\n .find((m) => m.role === \"assistant\");\n const assistantToolCalls = (\n lastAssistantMsg as { tool_calls?: Array<{ function?: { name?: string } }> }\n )?.tool_calls;\n const toolCallNames = Array.isArray(assistantToolCalls)\n ? assistantToolCalls\n .map((tc) => tc.function?.name)\n .filter((n): n is string => Boolean(n))\n : undefined;\n const contentHash = hashRequestContent(prompt, toolCallNames);\n const shouldEscalate = sessionStore.recordRequestHash(\n effectiveSessionId!,\n contentHash,\n );\n\n if (shouldEscalate) {\n const activeTierConfigs = routingDecision.tierConfigs ?? routerOpts.config.tiers;\n\n const escalation = sessionStore.escalateSession(\n effectiveSessionId!,\n activeTierConfigs,\n );\n if (escalation) {\n console.log(\n `[XClawRouter] ⚡ 3-strike escalation: ${existingSession.model} → ${escalation.model} (${existingSession.tier} → ${escalation.tier})`,\n );\n parsed.model = escalation.model;\n modelId = escalation.model;\n routingDecision = {\n ...routingDecision,\n model: escalation.model,\n tier: escalation.tier as Tier,\n };\n }\n }\n } // close `else` (auto-routed branch)\n } else {\n // No session — pin this routing decision for future requests\n parsed.model = routingDecision.model;\n modelId = routingDecision.model;\n bodyModified = true;\n if (effectiveSessionId) {\n sessionStore.setSession(\n effectiveSessionId,\n routingDecision.model,\n routingDecision.tier,\n );\n console.log(\n `[XClawRouter] Session ${effectiveSessionId.slice(0, 8)}... pinned to model: ${routingDecision.model}`,\n );\n }\n }\n\n options.onRouted?.(routingDecision);\n }\n }\n\n // Ensure effectiveSessionId is set for explicit model requests via content hash fallback.\n // Routing profile requests already derive session ID from message content (see line above).\n // Explicit model requests (openai/gpt-4o, anthropic/claude-*, etc.) without an\n // x-session-id header would otherwise have no session ID → maxCostPerRun not tracked.\n if (!effectiveSessionId && parsedMessages.length > 0) {\n effectiveSessionId = deriveSessionId(parsedMessages);\n }\n\n // Rebuild body if modified — map free/xxx → nvidia/xxx for upstream\n if (bodyModified) {\n if (parsed.model && typeof parsed.model === \"string\") {\n parsed.model = toUpstreamModelId(parsed.model);\n }\n body = Buffer.from(JSON.stringify(parsed));\n }\n } catch (err) {\n // Log routing errors so they're not silently swallowed\n const errorMsg = err instanceof Error ? err.message : String(err);\n console.error(`[XClawRouter] Routing error: ${errorMsg}`);\n console.error(`[XClawRouter] Need help? Run: npx @blockrun/xclawrouter doctor`);\n options.onError?.(new Error(`Routing failed: ${errorMsg}`));\n }\n }\n\n // --- Auto-compression ---\n // Compress large requests to reduce network usage and improve performance\n const autoCompress = options.autoCompressRequests ?? true;\n const compressionThreshold = options.compressionThresholdKB ?? 180;\n const requestSizeKB = Math.ceil(body.length / 1024);\n\n if (autoCompress && requestSizeKB > compressionThreshold) {\n try {\n console.log(\n `[XClawRouter] Request size ${requestSizeKB}KB exceeds threshold ${compressionThreshold}KB, applying compression...`,\n );\n\n // Parse messages for compression\n const parsed = JSON.parse(body.toString()) as {\n messages?: NormalizedMessage[];\n [key: string]: unknown;\n };\n\n if (parsed.messages && parsed.messages.length > 0 && shouldCompress(parsed.messages)) {\n // Apply compression with conservative settings\n const compressionResult = await compressContext(parsed.messages, {\n enabled: true,\n preserveRaw: false, // Don't need originals in proxy\n layers: {\n deduplication: true, // Safe: removes duplicate messages\n whitespace: true, // Safe: normalizes whitespace\n dictionary: false, // Disabled: requires model to understand codebook\n paths: false, // Disabled: requires model to understand path codes\n jsonCompact: true, // Safe: just removes JSON whitespace\n observation: false, // Disabled: may lose important context\n dynamicCodebook: false, // Disabled: requires model to understand codes\n },\n dictionary: {\n maxEntries: 50,\n minPhraseLength: 15,\n includeCodebookHeader: false,\n },\n });\n\n const compressedSizeKB = Math.ceil(compressionResult.compressedChars / 1024);\n const savings = (((requestSizeKB - compressedSizeKB) / requestSizeKB) * 100).toFixed(1);\n\n console.log(\n `[XClawRouter] Compressed ${requestSizeKB}KB → ${compressedSizeKB}KB (${savings}% reduction)`,\n );\n\n // Update request body with compressed messages\n parsed.messages = compressionResult.messages;\n body = Buffer.from(JSON.stringify(parsed));\n }\n } catch (err) {\n // Compression failed - continue with original request\n console.warn(\n `[XClawRouter] Compression failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // --- Response cache check (long-term, 10min TTL) ---\n // Prefix with the client's original stream intent. The body was already\n // rewritten to stream:false for the upstream call (same reason as dedupKey\n // below), so SSE and JSON responses would otherwise share a cache slot and\n // the first caller's response shape would be served to the second.\n const cacheKey = `${isStreaming ? \"sse\" : \"json\"}:${ResponseCache.generateKey(body)}`;\n const reqHeaders: Record = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === \"string\") reqHeaders[key] = value;\n }\n if (responseCache.shouldCache(body, reqHeaders)) {\n const cachedResponse = responseCache.get(cacheKey);\n if (cachedResponse) {\n console.log(`[XClawRouter] Cache HIT for ${cachedResponse.model} (saved API call)`);\n res.writeHead(cachedResponse.status, cachedResponse.headers);\n res.end(cachedResponse.body);\n return;\n }\n }\n\n // --- Dedup check (short-term, 30s TTL for retries) ---\n // Prefix with the client's original stream intent. The upstream `stream` flag\n // is rewritten to false before this point (BlockRun API is non-streaming), so\n // a streaming and non-streaming request with otherwise-identical bodies would\n // otherwise collide and serve each other's responses (JSON body to an SSE\n // caller, or vice versa).\n const dedupKey = `${isStreaming ? \"sse\" : \"json\"}:${RequestDeduplicator.hash(body)}`;\n\n // Check dedup cache (catches retries within 30s)\n const cached = deduplicator.getCached(dedupKey);\n if (cached) {\n res.writeHead(cached.status, cached.headers);\n res.end(cached.body);\n return;\n }\n\n // Check in-flight — wait for the original request to complete\n const inflight = deduplicator.getInflight(dedupKey);\n if (inflight) {\n const result = await inflight;\n res.writeHead(result.status, result.headers);\n res.end(result.body);\n return;\n }\n\n // Register this request as in-flight\n deduplicator.markInflight(dedupKey);\n\n // --- Pre-request balance check ---\n // Estimate cost and check if wallet has sufficient balance\n // Skip if skipBalanceCheck is set (for testing) or if using free model\n let estimatedCostMicros: bigint | undefined;\n // Use `let` so the balance-fallback path can update this when modelId is switched to a free model.\n let isFreeModel = FREE_MODELS.has(modelId ?? \"\");\n\n if (modelId && !options.skipBalanceCheck && !isFreeModel) {\n const estimated = estimateAmount(modelId, body.length, maxTokens);\n if (estimated) {\n estimatedCostMicros = BigInt(estimated);\n\n // Apply extra buffer for balance check to prevent x402 failures after streaming starts.\n // This is aggressive to avoid triggering OpenClaw's 5-24 hour billing cooldown.\n const bufferedCostMicros =\n (estimatedCostMicros * BigInt(Math.ceil(BALANCE_CHECK_BUFFER * 100))) / 100n;\n\n // Check balance before proceeding (using buffered amount)\n // Wrap in try/catch: Solana RPC failures (timeouts, rate limits) should\n // not silently downgrade the request — pass through optimistically instead.\n let sufficiency: Awaited> | null = null;\n try {\n sufficiency = await balanceMonitor.checkSufficient(bufferedCostMicros);\n } catch (balanceErr) {\n console.warn(\n `[XClawRouter] Balance check failed (${balanceErr instanceof Error ? balanceErr.message : String(balanceErr)}) — proceeding optimistically`,\n );\n }\n\n if (sufficiency && (sufficiency.info.isEmpty || !sufficiency.sufficient)) {\n // Wallet is empty or insufficient — fallback to best available free model\n const freeFallback = pickFreeModel(loadExcludeList()) ?? FREE_MODEL;\n const originalModel = modelId;\n console.log(\n `[XClawRouter] Wallet ${sufficiency.info.isEmpty ? \"empty\" : \"insufficient\"} (${sufficiency.info.balanceUSD}), falling back to free model: ${freeFallback} (requested: ${originalModel})`,\n );\n modelId = freeFallback;\n isFreeModel = true; // keep in sync — budget logic gates on !isFreeModel\n // Update the body with new model (map free/ → nvidia/ for upstream)\n const parsed = JSON.parse(body.toString()) as Record;\n parsed.model = toUpstreamModelId(FREE_MODEL);\n body = Buffer.from(JSON.stringify(parsed));\n\n // Build fund instruction — include wallet address so user knows where to send\n const walletAddr = sufficiency.info.walletAddress;\n const fundHint = walletAddr\n ? ` Send USDC to \\`${walletAddr}\\`.`\n : \" Run `/wallet` to see your address.\";\n\n // Set notice to prepend to response so user knows about the fallback\n balanceFallbackNotice = sufficiency.info.isEmpty\n ? `> **⚠️ Wallet empty** — using free model.${fundHint}\\n\\n`\n : `> **⚠️ Insufficient balance** (${sufficiency.info.balanceUSD}) — using free model instead of ${originalModel}.${fundHint}\\n\\n`;\n\n // Notify about the fallback\n options.onLowBalance?.({\n balanceUSD: sufficiency.info.balanceUSD,\n walletAddress: sufficiency.info.walletAddress,\n });\n } else if (sufficiency?.info.isLow) {\n // Balance is low but sufficient — warn and proceed\n options.onLowBalance?.({\n balanceUSD: sufficiency.info.balanceUSD,\n walletAddress: sufficiency.info.walletAddress,\n });\n }\n }\n }\n\n // --- Cost cap check: strict mode hard-stop ---\n // In 'strict' mode, reject if the projected session spend (accumulated + this request's\n // estimate) would exceed the cap. Checking projected cost (not just historical) prevents\n // a single large request from overshooting the cap before it's recorded.\n // In 'graceful' mode (default), the cap is enforced via model downgrade below.\n // Must happen before streaming headers are sent.\n if (\n options.maxCostPerRunUsd &&\n effectiveSessionId &&\n !isFreeModel &&\n (options.maxCostPerRunMode ?? \"graceful\") === \"strict\"\n ) {\n const runCostUsd = sessionStore.getSessionCostUsd(effectiveSessionId);\n // Include this request's estimated cost so even the first request is blocked\n // if it would push the session over the cap.\n const thisReqEstStr =\n estimatedCostMicros !== undefined\n ? estimatedCostMicros.toString()\n : modelId\n ? estimateAmount(modelId, body.length, maxTokens)\n : undefined;\n const thisReqEstUsd = thisReqEstStr ? Number(thisReqEstStr) / 1_000_000 : 0;\n const projectedCostUsd = runCostUsd + thisReqEstUsd;\n if (projectedCostUsd > options.maxCostPerRunUsd) {\n console.log(\n `[XClawRouter] Cost cap exceeded for session ${effectiveSessionId.slice(0, 8)}...: projected $${projectedCostUsd.toFixed(4)} (spent $${runCostUsd.toFixed(4)} + est $${thisReqEstUsd.toFixed(4)}) > $${options.maxCostPerRunUsd} limit`,\n );\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n });\n res.end(\n JSON.stringify({\n error: {\n message: `XClawRouter cost cap exceeded: projected spend $${projectedCostUsd.toFixed(4)} (spent $${runCostUsd.toFixed(4)} + est $${thisReqEstUsd.toFixed(4)}) would exceed limit $${options.maxCostPerRunUsd}`,\n type: \"cost_cap_exceeded\",\n code: \"cost_cap_exceeded\",\n },\n }),\n );\n deduplicator.removeInflight(dedupKey);\n return;\n }\n }\n\n // --- Budget pre-check: block when remaining budget can't cover the request ---\n // Must happen BEFORE streaming headers (429 can't be sent after SSE headers are flushed).\n // Three cases that require a hard block rather than graceful downgrade:\n // (A) tool/COMPLEX/REASONING routing profile — free model can't substitute\n // (B) explicit model request (no routing profile) — user chose a specific model,\n // silently substituting with free model would be deceptive regardless of task type\n // Simple routing profile requests are handled later via graceful downgrade.\n if (\n options.maxCostPerRunUsd &&\n effectiveSessionId &&\n !isFreeModel &&\n (options.maxCostPerRunMode ?? \"graceful\") === \"graceful\"\n ) {\n const runCostUsd = sessionStore.getSessionCostUsd(effectiveSessionId);\n const remainingUsd = options.maxCostPerRunUsd - runCostUsd;\n\n const isComplexOrAgentic =\n hasTools || routingDecision?.tier === \"COMPLEX\" || routingDecision?.tier === \"REASONING\";\n\n if (isComplexOrAgentic) {\n // Case A: tool/complex/agentic routing profile — check global model table\n // Intentionally exclude free models: they cannot handle complex/agentic tasks.\n const canAffordAnyNonFreeModel = BLOCKRUN_MODELS.some((m) => {\n if (FREE_MODELS.has(m.id)) return false;\n const est = estimateAmount(m.id, body.length, maxTokens);\n return est !== undefined && Number(est) / 1_000_000 <= remainingUsd;\n });\n if (!canAffordAnyNonFreeModel) {\n console.log(\n `[XClawRouter] Budget insufficient for agentic/complex session ${effectiveSessionId.slice(0, 8)}...: $${Math.max(0, remainingUsd).toFixed(4)} remaining — blocking (silent downgrade would corrupt tool/complex responses)`,\n );\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n \"X-XClawRouter-Budget-Mode\": \"blocked\",\n });\n res.end(\n JSON.stringify({\n error: {\n message: `XClawRouter budget exhausted: $${Math.max(0, remainingUsd).toFixed(4)} remaining (limit: $${options.maxCostPerRunUsd}). Increase maxCostPerRun to continue.`,\n type: \"cost_cap_exceeded\",\n code: \"budget_exhausted\",\n },\n }),\n );\n deduplicator.removeInflight(dedupKey);\n return;\n }\n } else if (!routingDecision && modelId && !FREE_MODELS.has(modelId)) {\n // Case B: explicit model request (user chose a specific model, not a routing profile).\n // Silently substituting their choice with free model is deceptive — block instead.\n const est = estimateAmount(modelId, body.length, maxTokens);\n const canAfford = !est || Number(est) / 1_000_000 <= remainingUsd;\n if (!canAfford) {\n console.log(\n `[XClawRouter] Budget insufficient for explicit model ${modelId} in session ${effectiveSessionId.slice(0, 8)}...: $${Math.max(0, remainingUsd).toFixed(4)} remaining — blocking (user explicitly chose ${modelId})`,\n );\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n \"X-XClawRouter-Budget-Mode\": \"blocked\",\n });\n res.end(\n JSON.stringify({\n error: {\n message: `XClawRouter budget exhausted: $${Math.max(0, remainingUsd).toFixed(4)} remaining (limit: $${options.maxCostPerRunUsd}). Increase maxCostPerRun to continue using ${modelId}.`,\n type: \"cost_cap_exceeded\",\n code: \"budget_exhausted\",\n },\n }),\n );\n deduplicator.removeInflight(dedupKey);\n return;\n }\n }\n }\n\n // --- Streaming: early header flush + heartbeat ---\n let heartbeatInterval: ReturnType | undefined;\n let headersSentEarly = false;\n\n if (isStreaming) {\n // Send 200 + SSE headers immediately, before x402 flow\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-context-used-kb\": String(originalContextSizeKB),\n \"x-context-limit-kb\": String(CONTEXT_LIMIT_KB),\n });\n headersSentEarly = true;\n\n // First heartbeat immediately\n safeWrite(res, \": heartbeat\\n\\n\");\n\n // Continue heartbeats every 2s while waiting for upstream\n heartbeatInterval = setInterval(() => {\n if (canWrite(res)) {\n safeWrite(res, \": heartbeat\\n\\n\");\n } else {\n // Socket closed, stop heartbeat\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n // Forward headers, stripping hop-by-hop and provider-specific headers.\n // OpenClaw v2026.4.2 centralizes provider header handling (native vs proxy),\n // but we strip SDK/provider headers defensively for older clients too.\n const headers: Record = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (\n key === \"host\" ||\n key === \"connection\" ||\n key === \"transfer-encoding\" ||\n key === \"content-length\"\n )\n continue;\n // SDK attribution headers (OpenAI x-stainless-*, Anthropic anthropic-*)\n // These are client-side telemetry/protocol headers — not meaningful to BlockRun.\n if (key.startsWith(\"x-stainless-\") || key.startsWith(\"anthropic-\")) continue;\n if (typeof value === \"string\") {\n headers[key] = value;\n }\n }\n if (!headers[\"content-type\"]) {\n headers[\"content-type\"] = \"application/json\";\n }\n headers[\"user-agent\"] = USER_AGENT;\n\n // --- Client disconnect cleanup ---\n let completed = false;\n res.on(\"close\", () => {\n if (heartbeatInterval) {\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n // Remove from in-flight if client disconnected before completion\n if (!completed) {\n deduplicator.removeInflight(dedupKey);\n }\n });\n\n // --- Request timeout ---\n // Global controller: hard deadline for the entire request (all model attempts combined).\n // Each model attempt gets its own per-model controller (PER_MODEL_TIMEOUT_MS).\n // If a model times out individually, we fall back to the next model instead of failing.\n // Only the global timeout causes an immediate error.\n const timeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const globalController = new AbortController();\n const timeoutId = setTimeout(() => globalController.abort(), timeoutMs);\n\n // Abort in-flight upstream requests when the client disconnects.\n // OpenClaw 2026.4.7+ aborts gateway requests on client disconnect;\n // without this, XClawRouter would leave orphan upstream fetches running.\n const onClientClose = () => {\n if (!globalController.signal.aborted) {\n console.log(`[XClawRouter] Client disconnected — aborting upstream request`);\n globalController.abort();\n }\n };\n req.on(\"close\", onClientClose);\n\n try {\n // --- Build fallback chain ---\n // If we have a routing decision, get the full fallback chain for the tier\n // Otherwise, just use the current model (no fallback for explicit model requests)\n let modelsToTry: string[];\n const excludeList = options.excludeModels ?? loadExcludeList();\n\n // Short-circuit: if balance check already determined wallet is empty/insufficient,\n // skip the entire routing chain (all paid models would 429 anyway) and go straight\n // to the free model. This avoids 4-5 wasted x402 payment signature attempts.\n // Only applies when balance check actually ran (not when skipBalanceCheck is set).\n if (isFreeModel && routingDecision && !options.skipBalanceCheck) {\n const freeFallback = pickFreeModel(excludeList) ?? FREE_MODEL;\n modelsToTry = [freeFallback];\n console.log(\n `[XClawRouter] Wallet empty — skipping routing chain, using free model: ${freeFallback}`,\n );\n } else if (routingDecision) {\n const prependStickyExplicitModel = (chain: string[]): string[] => {\n if (!stickyExplicitModel) return chain;\n return [stickyExplicitModel, ...chain.filter((model) => model !== stickyExplicitModel)];\n };\n // Estimate total context: input tokens (~4 chars per token) + max output tokens\n const estimatedInputTokens = Math.ceil(body.length / 4);\n const estimatedTotalTokens = estimatedInputTokens + maxTokens;\n\n // Use tier configs from the routing decision (set by RouterStrategy)\n const tierConfigs = routingDecision.tierConfigs ?? routerOpts.config.tiers;\n\n // Get full chain first, then filter by context\n const fullChain = prependStickyExplicitModel(\n getFallbackChain(routingDecision.tier, tierConfigs),\n );\n const contextFiltered = prependStickyExplicitModel(\n getFallbackChainFiltered(\n routingDecision.tier,\n tierConfigs,\n estimatedTotalTokens,\n getModelContextWindow,\n ),\n );\n\n // Log if models were filtered out due to context limits\n const contextExcluded = fullChain.filter((m) => !contextFiltered.includes(m));\n if (contextExcluded.length > 0) {\n console.log(\n `[XClawRouter] Context filter (~${estimatedTotalTokens} tokens): excluded ${contextExcluded.join(\", \")}`,\n );\n }\n\n // Filter out user-excluded models\n const excludeFiltered = prependStickyExplicitModel(\n filterByExcludeList(contextFiltered, excludeList),\n );\n const excludeExcluded = contextFiltered.filter((m) => !excludeFiltered.includes(m));\n if (excludeExcluded.length > 0) {\n console.log(\n `[XClawRouter] Exclude filter: excluded ${excludeExcluded.join(\", \")} (user preference)`,\n );\n }\n\n // Filter to models that support tool calling when request has tools.\n // Prevents models like grok-code-fast-1 from outputting tool invocations\n // as plain text JSON (the \"talking to itself\" bug).\n let toolFiltered = prependStickyExplicitModel(\n filterByToolCalling(excludeFiltered, hasTools, supportsToolCalling),\n );\n const toolExcluded = excludeFiltered.filter((m) => !toolFiltered.includes(m));\n if (toolExcluded.length > 0) {\n console.log(\n `[XClawRouter] Tool-calling filter: excluded ${toolExcluded.join(\", \")} (no structured function call support)`,\n );\n }\n\n // Filter out models that declare toolCalling but fail tool compliance in practice.\n // gemini-2.5-flash-lite refuses certain tool schemas (e.g. brave search) while\n // cheaper models like nvidia/gpt-oss-120b handle them fine.\n const TOOL_NONCOMPLIANT_MODELS = [\n \"google/gemini-2.5-flash-lite\",\n \"google/gemini-3-pro-preview\",\n \"google/gemini-3.1-pro\",\n ];\n if (hasTools && toolFiltered.length > 1) {\n const compliant = toolFiltered.filter((m) => !TOOL_NONCOMPLIANT_MODELS.includes(m));\n if (compliant.length > 0 && compliant.length < toolFiltered.length) {\n const dropped = toolFiltered.filter((m) => TOOL_NONCOMPLIANT_MODELS.includes(m));\n console.log(\n `[XClawRouter] Tool-compliance filter: excluded ${dropped.join(\", \")} (unreliable tool schema handling)`,\n );\n toolFiltered = prependStickyExplicitModel(compliant);\n }\n }\n\n // Filter to models that support vision when request has image_url content\n const visionFiltered = prependStickyExplicitModel(\n filterByVision(toolFiltered, hasVision, supportsVision),\n );\n const visionExcluded = toolFiltered.filter((m) => !visionFiltered.includes(m));\n if (visionExcluded.length > 0) {\n console.log(\n `[XClawRouter] Vision filter: excluded ${visionExcluded.join(\", \")} (no vision support)`,\n );\n }\n\n // Limit to MAX_FALLBACK_ATTEMPTS to prevent infinite loops\n modelsToTry = prependStickyExplicitModel(visionFiltered).slice(0, MAX_FALLBACK_ATTEMPTS);\n\n // Deprioritize rate-limited models (put them at the end)\n modelsToTry = prioritizeNonRateLimited(modelsToTry);\n } else {\n // For explicit model requests, use the requested model\n modelsToTry = modelId ? [modelId] : [];\n }\n\n // Ensure routed requests have a free-model last resort for non-tool chats.\n // Explicit model requests intentionally skip this: silently substituting a\n // user-chosen model with `free/*` is deceptive.\n if (!hasTools && routingDecision) {\n const freeFallback = pickFreeModel(excludeList);\n if (freeFallback && !modelsToTry.includes(freeFallback)) {\n modelsToTry.push(freeFallback);\n }\n }\n\n // --- Budget-aware routing (graceful mode) ---\n // Filter modelsToTry to only models that fit within the remaining session budget.\n // Simple tasks (no tools, non-complex tier): downgrade with visible warning.\n // Complex/agentic tasks with no affordable model: already blocked above (before streaming headers).\n if (\n options.maxCostPerRunUsd &&\n effectiveSessionId &&\n !isFreeModel &&\n (options.maxCostPerRunMode ?? \"graceful\") === \"graceful\"\n ) {\n const runCostUsd = sessionStore.getSessionCostUsd(effectiveSessionId);\n const remainingUsd = options.maxCostPerRunUsd - runCostUsd;\n\n const beforeFilter = [...modelsToTry];\n modelsToTry = modelsToTry.filter((m) => {\n if (FREE_MODELS.has(m)) return true; // free models always fit (no cost)\n const est = estimateAmount(m, body.length, maxTokens);\n if (!est) return true; // no pricing data → keep (permissive)\n return Number(est) / 1_000_000 <= remainingUsd;\n });\n\n const excluded = beforeFilter.filter((m) => !modelsToTry.includes(m));\n\n // Second-pass block: the pre-check caught obvious cases early (before streaming headers).\n // Here we recheck against the actual filtered modelsToTry chain. If the ONLY remaining\n // models are free, we must block rather than silently degrade for:\n // (A) complex/agentic routing profile tasks (tools / COMPLEX / REASONING tier)\n // (B) explicit model requests (user chose a specific model; free substitution is deceptive)\n // The pre-check already handles case (B) for non-streaming; this is a safety net for\n // streaming requests where SSE headers may have already been sent.\n const isComplexOrAgenticFilter =\n hasTools ||\n routingDecision?.tier === \"COMPLEX\" ||\n routingDecision?.tier === \"REASONING\" ||\n routingDecision === undefined; // explicit model: no routing profile → user chose the model\n const filteredToFreeOnly =\n modelsToTry.length > 0 && modelsToTry.every((m) => FREE_MODELS.has(m));\n\n if (isComplexOrAgenticFilter && filteredToFreeOnly) {\n const budgetSummary = `$${Math.max(0, remainingUsd).toFixed(4)} remaining (limit: $${options.maxCostPerRunUsd})`;\n console.log(\n `[XClawRouter] Budget filter left only free model for complex/agentic session — blocking (${budgetSummary})`,\n );\n const errPayload = JSON.stringify({\n error: {\n message: `XClawRouter budget exhausted: remaining budget (${budgetSummary}) cannot support a complex/tool request. Increase maxCostPerRun to continue.`,\n type: \"cost_cap_exceeded\",\n code: \"budget_exhausted\",\n },\n });\n if (heartbeatInterval) clearInterval(heartbeatInterval);\n if (headersSentEarly) {\n // Streaming: inject error SSE event + [DONE] and close\n safeWrite(res, `data: ${errPayload}\\n\\ndata: [DONE]\\n\\n`);\n res.end();\n } else {\n res.writeHead(429, {\n \"Content-Type\": \"application/json\",\n \"X-XClawRouter-Cost-Cap-Exceeded\": \"1\",\n \"X-XClawRouter-Budget-Mode\": \"blocked\",\n });\n res.end(errPayload);\n }\n deduplicator.removeInflight(dedupKey);\n return;\n }\n\n if (excluded.length > 0) {\n const budgetSummary =\n remainingUsd > 0\n ? `$${remainingUsd.toFixed(4)} remaining`\n : `budget exhausted ($${runCostUsd.toFixed(4)}/$${options.maxCostPerRunUsd})`;\n console.log(\n `[XClawRouter] Budget downgrade (${budgetSummary}): excluded ${excluded.join(\", \")}`,\n );\n\n // A: Set visible warning notice — prepended to response so user sees the downgrade\n const fromModel = excluded[0];\n const usingFree = modelsToTry.length === 1 && FREE_MODELS.has(modelsToTry[0]);\n if (usingFree) {\n budgetDowngradeNotice = `> **⚠️ Budget cap reached** ($${runCostUsd.toFixed(4)}/$${options.maxCostPerRunUsd}) — downgraded to free model. Quality may be reduced. Increase \\`maxCostPerRun\\` to continue with ${fromModel}.\\n\\n`;\n } else {\n const toModel = modelsToTry[0] ?? FREE_MODEL; // last resort\n budgetDowngradeNotice = `> **⚠️ Budget low** ($${remainingUsd > 0 ? remainingUsd.toFixed(4) : \"0.0000\"} remaining) — using ${toModel} instead of ${fromModel}.\\n\\n`;\n }\n // B: Header flag for orchestration layers (e.g. OpenClaw can pause/warn the user)\n budgetDowngradeHeaderMode = \"downgraded\";\n }\n }\n\n // --- Fallback loop: try each model until success ---\n let upstream: Response | undefined;\n let lastError: { body: string; status: number } | undefined;\n let actualModelUsed = modelId;\n const failedAttempts: Array<{ model: string; reason: string; status: number }> = [];\n\n for (let i = 0; i < modelsToTry.length; i++) {\n const tryModel = modelsToTry[i];\n const isLastAttempt = i === modelsToTry.length - 1;\n\n // Abort immediately if global deadline has already fired\n if (globalController.signal.aborted) {\n throw new Error(`Request timed out after ${timeoutMs}ms`);\n }\n\n console.log(`[XClawRouter] Trying model ${i + 1}/${modelsToTry.length}: ${tryModel}`);\n\n // Per-model abort controller — each model attempt gets its own 60s window.\n // When it fires, the fallback loop moves to the next model rather than failing.\n const modelController = new AbortController();\n const modelTimeoutId = setTimeout(() => modelController.abort(), PER_MODEL_TIMEOUT_MS);\n const combinedSignal = AbortSignal.any([globalController.signal, modelController.signal]);\n\n const result = await tryModelRequest(\n upstreamUrl,\n req.method ?? \"POST\",\n headers,\n body,\n tryModel,\n maxTokens,\n payFetch,\n balanceMonitor,\n combinedSignal,\n );\n clearTimeout(modelTimeoutId);\n\n // If the global deadline fired during this attempt, bail out entirely\n if (globalController.signal.aborted) {\n throw new Error(`Request timed out after ${timeoutMs}ms`);\n }\n\n // If the per-model timeout fired (but not global), treat as fallback-worthy error\n if (!result.success && modelController.signal.aborted && !isLastAttempt) {\n console.log(\n `[XClawRouter] Model ${tryModel} timed out after ${PER_MODEL_TIMEOUT_MS}ms, trying fallback`,\n );\n recordProviderError(tryModel, \"server_error\");\n continue;\n }\n\n if (result.success && result.response) {\n // Buffer the body so we can peek for degenerate output before committing\n // to this model. Non-streaming JSON responses are small; this is cheap.\n const bodyChunks = await readBodyWithTimeout(result.response.body);\n const bodyBuf = Buffer.concat(bodyChunks);\n\n if (isDegenerateCompletion(bodyBuf) && !isLastAttempt) {\n console.warn(\n `[XClawRouter] ⚠️ Degenerate output from ${tryModel} (finish_reason=length + repetition loop) — retrying with next fallback`,\n );\n recordProviderError(tryModel, \"server_error\");\n failedAttempts.push({\n model: tryModel,\n reason: \"degenerate_output\",\n status: 200,\n });\n continue;\n }\n\n // Re-wrap the buffered body so downstream code can read upstream.body normally\n upstream = new Response(new Uint8Array(bodyBuf), {\n status: result.response.status,\n statusText: result.response.statusText,\n headers: result.response.headers,\n });\n actualModelUsed = tryModel;\n console.log(`[XClawRouter] Success with model: ${tryModel}`);\n // Accumulate estimated cost to session for maxCostPerRun tracking\n if (options.maxCostPerRunUsd && effectiveSessionId && !FREE_MODELS.has(tryModel)) {\n const costEst = estimateAmount(tryModel, body.length, maxTokens);\n if (costEst) {\n sessionStore.addSessionCost(effectiveSessionId, BigInt(costEst));\n }\n }\n break;\n }\n\n // Request failed\n lastError = {\n body: result.errorBody || \"Unknown error\",\n status: result.errorStatus || 500,\n };\n failedAttempts.push({\n model: tryModel,\n reason: result.errorCategory || `HTTP ${result.errorStatus || 500}`,\n status: result.errorStatus || 500,\n });\n\n // Payment error (insufficient funds, simulation failure) — skip remaining\n // paid models, jump straight to free model. No point trying other paid\n // models with the same wallet state.\n // Must be checked BEFORE isProviderError gate: payment settlement failures\n // may return non-standard HTTP codes that categorizeError doesn't recognize,\n // causing isProviderError=false and breaking out of the fallback loop.\n const isPaymentErr =\n /payment.*verification.*failed|payment.*settlement.*failed|insufficient.*funds|transaction_simulation_failed/i.test(\n result.errorBody || \"\",\n );\n if (isPaymentErr && !FREE_MODELS.has(tryModel) && !isLastAttempt) {\n failedAttempts.push({\n ...failedAttempts[failedAttempts.length - 1],\n reason: \"payment_error\",\n });\n // Find a free model already in the chain\n const freeInChain = modelsToTry.findIndex((m, idx) => idx > i && FREE_MODELS.has(m));\n if (freeInChain > i + 1) {\n console.log(\n `[XClawRouter] Payment error — skipping to free model: ${modelsToTry[freeInChain]}`,\n );\n i = freeInChain - 1; // loop will increment to freeInChain\n continue;\n }\n // No free model in chain — pick best available and append\n if (freeInChain === -1) {\n const freeFallback = pickFreeModel(excludeList);\n if (freeFallback) {\n modelsToTry.push(freeFallback);\n console.log(`[XClawRouter] Payment error — appending free model: ${freeFallback}`);\n continue;\n }\n }\n }\n\n // Explicit pins intentionally avoid automatic free-model fallback, so a\n // single transient upstream 5xx (NVIDIA worker flake, blockrun 500)\n // would otherwise fail the whole request. Retry once with a short\n // backoff. Non-retryable errors (auth/payment/config) fall through.\n const isExplicitPin = !routingDecision;\n const isRetryableServerError =\n result.errorCategory === \"server_error\" || result.errorCategory === \"overloaded\";\n if (\n isExplicitPin &&\n isLastAttempt &&\n isRetryableServerError &&\n !globalController.signal.aborted\n ) {\n console.log(\n `[XClawRouter] Explicit pin ${tryModel} got ${result.errorCategory} (HTTP ${result.errorStatus ?? \"?\"}), retrying once in 500ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (!globalController.signal.aborted) {\n const retryController = new AbortController();\n const retryTimeoutId = setTimeout(() => retryController.abort(), PER_MODEL_TIMEOUT_MS);\n const retrySignal = AbortSignal.any([globalController.signal, retryController.signal]);\n const retryResult = await tryModelRequest(\n upstreamUrl,\n req.method ?? \"POST\",\n headers,\n body,\n tryModel,\n maxTokens,\n payFetch,\n balanceMonitor,\n retrySignal,\n );\n clearTimeout(retryTimeoutId);\n if (retryResult.success && retryResult.response) {\n upstream = retryResult.response;\n actualModelUsed = tryModel;\n console.log(`[XClawRouter] Explicit-pin retry succeeded for: ${tryModel}`);\n if (options.maxCostPerRunUsd && effectiveSessionId && !FREE_MODELS.has(tryModel)) {\n const costEst = estimateAmount(tryModel, body.length, maxTokens);\n if (costEst) {\n sessionStore.addSessionCost(effectiveSessionId, BigInt(costEst));\n }\n }\n break;\n }\n // Retry also failed — update lastError with the latest failure and\n // fall through to the standard break path.\n lastError = {\n body: retryResult.errorBody || lastError?.body || \"Unknown error\",\n status: retryResult.errorStatus || lastError?.status || 500,\n };\n failedAttempts.push({\n model: tryModel,\n reason: `${retryResult.errorCategory || `HTTP ${retryResult.errorStatus || 500}`} (retry)`,\n status: retryResult.errorStatus || 500,\n });\n }\n }\n\n // If it's a provider error and not the last attempt, try next model\n if (result.isProviderError && !isLastAttempt) {\n const isExplicitModelError = !routingDecision;\n const isUnknownExplicitModel =\n isExplicitModelError && /unknown.*model|invalid.*model/i.test(result.errorBody || \"\");\n if (isUnknownExplicitModel) {\n console.log(\n `[XClawRouter] Explicit model error from ${tryModel}, not falling back: ${result.errorBody?.slice(0, 100)}`,\n );\n break;\n }\n\n // Record error and apply category-specific handling\n const errorCat = result.errorCategory;\n if (errorCat) {\n recordProviderError(tryModel, errorCat);\n }\n\n if (errorCat === \"rate_limited\") {\n // --- Stepped backoff retry (429) ---\n // Token-bucket rate limits often recover within milliseconds.\n // Retry once after 200ms before treating this as a model-level failure.\n if (!isLastAttempt && !globalController.signal.aborted) {\n console.log(\n `[XClawRouter] Rate-limited on ${tryModel}, retrying in 200ms before failover`,\n );\n await new Promise((resolve) => setTimeout(resolve, 200));\n if (!globalController.signal.aborted) {\n const retryController = new AbortController();\n const retryTimeoutId = setTimeout(\n () => retryController.abort(),\n PER_MODEL_TIMEOUT_MS,\n );\n const retrySignal = AbortSignal.any([\n globalController.signal,\n retryController.signal,\n ]);\n const retryResult = await tryModelRequest(\n upstreamUrl,\n req.method ?? \"POST\",\n headers,\n body,\n tryModel,\n maxTokens,\n payFetch,\n balanceMonitor,\n retrySignal,\n );\n clearTimeout(retryTimeoutId);\n if (retryResult.success && retryResult.response) {\n upstream = retryResult.response;\n actualModelUsed = tryModel;\n console.log(`[XClawRouter] Rate-limit retry succeeded for: ${tryModel}`);\n if (options.maxCostPerRunUsd && effectiveSessionId && tryModel !== FREE_MODEL) {\n const costEst = estimateAmount(tryModel, body.length, maxTokens);\n if (costEst) {\n sessionStore.addSessionCost(effectiveSessionId, BigInt(costEst));\n }\n }\n break;\n }\n // Retry also failed — fall through to markRateLimited\n }\n }\n markRateLimited(tryModel);\n // Check for server-side update hint in 429 response\n try {\n const parsed = JSON.parse(result.errorBody || \"{}\");\n if (parsed.update_available) {\n console.log(\"\");\n console.log(\n `\\x1b[33m⬆️ XClawRouter ${parsed.update_available} available (you have ${VERSION})\\x1b[0m`,\n );\n console.log(\n ` Run: \\x1b[36mcurl -fsSL ${parsed.update_url || \"https://blockrun.ai/xclawrouter-update\"} | bash\\x1b[0m`,\n );\n console.log(\"\");\n }\n } catch {\n /* ignore parse errors */\n }\n } else if (errorCat === \"overloaded\") {\n markOverloaded(tryModel);\n } else if (errorCat === \"auth_failure\" || errorCat === \"quota_exceeded\") {\n console.log(\n `[XClawRouter] 🔑 ${errorCat === \"auth_failure\" ? \"Auth failure\" : \"Quota exceeded\"} for ${tryModel} — check provider config`,\n );\n }\n\n console.log(\n `[XClawRouter] Provider error from ${tryModel}, trying fallback: ${result.errorBody?.slice(0, 100)}`,\n );\n continue;\n }\n\n // Not a provider error or last attempt — stop trying\n if (!result.isProviderError) {\n console.log(\n `[XClawRouter] Non-provider error from ${tryModel}, not retrying: ${result.errorBody?.slice(0, 100)}`,\n );\n }\n break;\n }\n\n // Clear timeout and client-close listener — request attempts completed\n clearTimeout(timeoutId);\n req.removeListener(\"close\", onClientClose);\n\n // Clear heartbeat — real data is about to flow\n if (heartbeatInterval) {\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n\n // --- Emit routing debug info (opt-in via x-clawrouter-debug: true header) ---\n // For streaming: SSE comment (invisible to most clients, visible in raw stream)\n // For non-streaming: response headers added later\n if (debugMode && headersSentEarly && routingDecision) {\n const debugComment = `: x-clawrouter-debug profile=${routingProfile ?? \"auto\"} tier=${routingDecision.tier} model=${actualModelUsed} agentic=${routingDecision.agenticScore?.toFixed(2) ?? \"n/a\"} confidence=${routingDecision.confidence.toFixed(2)} reasoning=${routingDecision.reasoning}\\n\\n`;\n safeWrite(res, debugComment);\n }\n\n // Update routing decision with actual model used (for logging)\n // IMPORTANT: Recalculate cost for the actual model, not the original primary\n if (routingDecision && actualModelUsed !== routingDecision.model) {\n const estimatedInputTokens = Math.ceil(body.length / 4);\n const newCosts = calculateModelCost(\n actualModelUsed,\n routerOpts.modelPricing,\n estimatedInputTokens,\n maxTokens,\n routingProfile ?? undefined,\n );\n routingDecision = {\n ...routingDecision,\n model: actualModelUsed,\n reasoning: `${routingDecision.reasoning} | fallback to ${actualModelUsed}`,\n costEstimate: newCosts.costEstimate,\n baselineCost: newCosts.baselineCost,\n savings: newCosts.savings,\n };\n options.onRouted?.(routingDecision);\n\n // Update session pin to the actual model used — ensures the next request in\n // this conversation starts from the fallback model rather than retrying the\n // primary and falling back again (prevents the \"model keeps jumping\" issue).\n if (effectiveSessionId) {\n const pinnedSession = sessionStore.getSession(effectiveSessionId);\n if (pinnedSession?.userExplicit) {\n console.log(\n `[XClawRouter] Session ${effectiveSessionId.slice(0, 8)}... fallback used ${actualModelUsed}, preserving user-explicit pin: ${pinnedSession.model}`,\n );\n } else {\n sessionStore.setSession(effectiveSessionId, actualModelUsed, routingDecision.tier);\n console.log(\n `[XClawRouter] Session ${effectiveSessionId.slice(0, 8)}... updated pin to fallback: ${actualModelUsed}`,\n );\n }\n }\n }\n\n // --- Handle case where all models failed ---\n if (!upstream) {\n // Build structured error summary listing all attempted models\n const attemptSummary =\n failedAttempts.length > 0\n ? failedAttempts.map((a) => `${a.model} (${a.reason})`).join(\", \")\n : \"unknown\";\n const structuredMessage =\n failedAttempts.length > 0\n ? `All ${failedAttempts.length} models failed. Tried: ${attemptSummary}`\n : \"All models in fallback chain failed\";\n console.log(`[XClawRouter] ${structuredMessage}`);\n const rawErrBody = lastError?.body || structuredMessage;\n const errStatus = lastError?.status || 502;\n\n // Transform payment errors into user-friendly messages\n const transformedErr = transformPaymentError(rawErrBody);\n\n // Mark as error for usage logging (logs this failed attempt with cost)\n requestHadError = true;\n\n if (headersSentEarly) {\n // Streaming: send error as SSE event in OpenAI error format.\n // The OpenAI SDK (used by continue.dev and others) expects {\"error\": {...}}.\n // If the upstream error is already in that shape, use it; otherwise wrap it.\n // Sending raw upstream JSON (e.g. {\"code\":400,\"message\":\"...\"}) causes the SDK\n // to throw a generic \"Unexpected error\" instead of a meaningful message.\n let errPayload: string;\n try {\n const parsed = JSON.parse(transformedErr);\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n // Already has the correct {\"error\": {...}} wrapper — use as-is\n errPayload = JSON.stringify(parsed);\n } else {\n // Raw upstream JSON without error wrapper — wrap it\n errPayload = JSON.stringify({\n error: { message: rawErrBody, type: \"provider_error\", status: errStatus },\n });\n }\n } catch {\n errPayload = JSON.stringify({\n error: { message: rawErrBody, type: \"provider_error\", status: errStatus },\n });\n }\n const errEvent = `data: ${errPayload}\\n\\n`;\n safeWrite(res, errEvent);\n safeWrite(res, \"data: [DONE]\\n\\n\");\n res.end();\n\n const errBuf = Buffer.from(errEvent + \"data: [DONE]\\n\\n\");\n deduplicator.complete(dedupKey, {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n body: errBuf,\n completedAt: Date.now(),\n });\n } else {\n // Non-streaming: send transformed error response with context headers\n res.writeHead(errStatus, {\n \"Content-Type\": \"application/json\",\n \"x-context-used-kb\": String(originalContextSizeKB),\n \"x-context-limit-kb\": String(CONTEXT_LIMIT_KB),\n });\n res.end(transformedErr);\n\n deduplicator.complete(dedupKey, {\n status: errStatus,\n headers: { \"content-type\": \"application/json\" },\n body: Buffer.from(transformedErr),\n completedAt: Date.now(),\n });\n }\n\n // Log failed request so users can see it in `clawrouter logs`\n // cost = actual x402 payment if any was made, otherwise 0\n const errModel = routingDecision?.model ?? modelId;\n if (errModel) {\n const errPayment = paymentStore.getStore()?.amountUsd ?? 0;\n logUsage({\n timestamp: new Date().toISOString(),\n model: errModel,\n tier: routingDecision?.tier ?? \"DIRECT\",\n cost: errPayment,\n baselineCost: errPayment,\n savings: 0,\n latencyMs: Date.now() - startTime,\n status: \"error\",\n }).catch(() => {});\n }\n return;\n }\n\n // --- Stream response and collect for dedup cache ---\n const responseChunks: Buffer[] = [];\n\n if (headersSentEarly) {\n // Streaming: headers already sent. Response should be 200 at this point\n // (non-200 responses are handled in the fallback loop above)\n\n // Convert non-streaming JSON response to SSE streaming format for client\n // (BlockRun API returns JSON since we forced stream:false)\n // OpenClaw expects: object=\"chat.completion.chunk\" with choices[].delta (not message)\n // We emit proper incremental deltas to match OpenAI's streaming format exactly\n if (upstream.body) {\n const chunks = await readBodyWithTimeout(upstream.body);\n\n // Combine chunks and transform to streaming format\n const jsonBody = Buffer.concat(chunks);\n const jsonStr = jsonBody.toString();\n try {\n const rsp = JSON.parse(jsonStr) as {\n id?: string;\n object?: string;\n created?: number;\n model?: string;\n choices?: Array<{\n index?: number;\n message?: {\n role?: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n };\n delta?: {\n role?: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: unknown;\n };\n\n // Extract input token count from upstream response\n if (rsp.usage && typeof rsp.usage === \"object\") {\n const u = rsp.usage as Record;\n if (typeof u.prompt_tokens === \"number\") responseInputTokens = u.prompt_tokens;\n if (typeof u.completion_tokens === \"number\") responseOutputTokens = u.completion_tokens;\n }\n\n // Build base chunk structure (reused for all chunks)\n // Match OpenAI's exact format including system_fingerprint\n const baseChunk = {\n id: rsp.id ?? `chatcmpl-${Date.now()}`,\n object: \"chat.completion.chunk\",\n created: rsp.created ?? Math.floor(Date.now() / 1000),\n model: actualModelUsed || rsp.model || \"unknown\",\n system_fingerprint: null,\n };\n\n // Process each choice (usually just one)\n if (rsp.choices && Array.isArray(rsp.choices)) {\n for (const choice of rsp.choices) {\n const endsWithToolCalls = choice.finish_reason === \"tool_calls\";\n // Some OpenAI-compatible providers include planning prose in content\n // alongside tool_calls, or mark the turn as a tool-call turn via\n // finish_reason before exposing the tool_calls array at the same\n // object shape. Tool execution only needs tool_calls, so do not\n // forward that prose to chat channels.\n let toolCalls = choice.message?.tool_calls ?? choice.delta?.tool_calls;\n const rawContent = choice.message?.content ?? choice.delta?.content ?? \"\";\n\n // When upstream returns no structured tool_calls but the model emitted\n // tool calls as XML/text in `content` (e.g. OpenClaw-instructed\n // `...` or Anthropic-style `\n // ...`), synthesize the structured form so downstream tool\n // executors can dispatch them. The agent loops we saw in the wild\n // (six retries then a hallucinated \"API key missing\") came from\n // this gap.\n if (!endsWithToolCalls && (!toolCalls || toolCalls.length === 0) && rawContent) {\n const extracted = extractTextualToolCalls(rawContent);\n if (extracted.toolCalls.length > 0) {\n toolCalls = extracted.toolCalls;\n }\n }\n\n // Strip thinking tokens (Kimi <|...|> and standard tags)\n const content =\n endsWithToolCalls || (toolCalls && toolCalls.length > 0)\n ? \"\"\n : stripThinkingTokens(rawContent);\n const role = choice.message?.role ?? choice.delta?.role ?? \"assistant\";\n const index = choice.index ?? 0;\n\n // Accumulate content for session journal\n if (content) {\n accumulatedContent += content;\n }\n\n // Chunk 1: role only (mimics OpenAI's first chunk)\n const roleChunk = {\n ...baseChunk,\n choices: [{ index, delta: { role }, logprobs: null, finish_reason: null }],\n };\n const roleData = `data: ${JSON.stringify(roleChunk)}\\n\\n`;\n safeWrite(res, roleData);\n responseChunks.push(Buffer.from(roleData));\n\n // Chunk 1.5: balance fallback notice (tells user they got free model)\n if (balanceFallbackNotice) {\n const noticeChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: { content: balanceFallbackNotice },\n logprobs: null,\n finish_reason: null,\n },\n ],\n };\n const noticeData = `data: ${JSON.stringify(noticeChunk)}\\n\\n`;\n safeWrite(res, noticeData);\n responseChunks.push(Buffer.from(noticeData));\n balanceFallbackNotice = undefined; // Only inject once\n }\n\n // Chunk 1.6: budget downgrade notice (A: visible warning when model downgraded)\n if (budgetDowngradeNotice) {\n const noticeChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: { content: budgetDowngradeNotice },\n logprobs: null,\n finish_reason: null,\n },\n ],\n };\n const noticeData = `data: ${JSON.stringify(noticeChunk)}\\n\\n`;\n safeWrite(res, noticeData);\n responseChunks.push(Buffer.from(noticeData));\n budgetDowngradeNotice = undefined; // Only inject once\n }\n\n // Chunk 2: content (single chunk with full content)\n if (content) {\n const contentChunk = {\n ...baseChunk,\n choices: [{ index, delta: { content }, logprobs: null, finish_reason: null }],\n };\n const contentData = `data: ${JSON.stringify(contentChunk)}\\n\\n`;\n safeWrite(res, contentData);\n responseChunks.push(Buffer.from(contentData));\n }\n\n // Chunk 2b: tool_calls (forward tool calls from upstream)\n if (toolCalls && toolCalls.length > 0) {\n const toolCallChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: { tool_calls: toolCalls },\n logprobs: null,\n finish_reason: null,\n },\n ],\n };\n const toolCallData = `data: ${JSON.stringify(toolCallChunk)}\\n\\n`;\n safeWrite(res, toolCallData);\n responseChunks.push(Buffer.from(toolCallData));\n }\n\n // Chunk 3: finish_reason (signals completion)\n const finishChunk = {\n ...baseChunk,\n choices: [\n {\n index,\n delta: {},\n logprobs: null,\n finish_reason:\n endsWithToolCalls || (toolCalls && toolCalls.length > 0)\n ? \"tool_calls\"\n : (choice.finish_reason ?? \"stop\"),\n },\n ],\n };\n const finishData = `data: ${JSON.stringify(finishChunk)}\\n\\n`;\n safeWrite(res, finishData);\n responseChunks.push(Buffer.from(finishData));\n }\n }\n } catch {\n // If parsing fails, wrap in OpenAI error format so SDKs surface a\n // meaningful message instead of throwing a generic \"Unexpected error\".\n const errPayload = JSON.stringify({\n error: {\n message: `Upstream response could not be parsed: ${jsonStr.slice(0, 200)}`,\n type: \"proxy_error\",\n },\n });\n const sseData = `data: ${errPayload}\\n\\n`;\n safeWrite(res, sseData);\n responseChunks.push(Buffer.from(sseData));\n }\n }\n\n // Send a final usage chunk (OpenAI `stream_options.include_usage` format)\n // carrying both the standard token counts AND the XClawRouter cost breakdown.\n // OpenClaw's session-cost-usage module reads `usage.cost.{total,input,output}`\n // from every assistant message, so emitting the cost here feeds both the\n // per-session footer (/usage full) and the /stats-style reports.\n if (typeof responseInputTokens === \"number\" && typeof responseOutputTokens === \"number\") {\n const usagePayload: Record = {\n prompt_tokens: responseInputTokens,\n completion_tokens: responseOutputTokens,\n total_tokens: responseInputTokens + responseOutputTokens,\n };\n const costBreakdown = buildCostBreakdown({\n actualModelUsed,\n routingProfile: routingProfile ?? undefined,\n routingDecision,\n modelPricing: routerOpts.modelPricing,\n inputTokens: responseInputTokens,\n outputTokens: responseOutputTokens,\n tier: routingDecision?.tier,\n });\n if (costBreakdown) {\n usagePayload.cost = costBreakdown;\n }\n const usageChunk = {\n id: `chatcmpl-${Date.now()}`,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: actualModelUsed || \"unknown\",\n system_fingerprint: null,\n choices: [],\n usage: usagePayload,\n };\n const usageData = `data: ${JSON.stringify(usageChunk)}\\n\\n`;\n safeWrite(res, usageData);\n responseChunks.push(Buffer.from(usageData));\n }\n\n // Send cost summary as SSE comment before terminator (human-readable log)\n if (routingDecision) {\n const costComment = `: cost=$${routingDecision.costEstimate.toFixed(4)} savings=${(routingDecision.savings * 100).toFixed(0)}% model=${actualModelUsed} tier=${routingDecision.tier}\\n\\n`;\n safeWrite(res, costComment);\n responseChunks.push(Buffer.from(costComment));\n }\n\n // Send SSE terminator\n safeWrite(res, \"data: [DONE]\\n\\n\");\n responseChunks.push(Buffer.from(\"data: [DONE]\\n\\n\"));\n res.end();\n\n // Cache for dedup\n deduplicator.complete(dedupKey, {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n body: Buffer.concat(responseChunks),\n completedAt: Date.now(),\n });\n } else {\n // Non-streaming: forward status and headers from upstream\n const responseHeaders: Record = {};\n upstream.headers.forEach((value, key) => {\n // Skip hop-by-hop headers and content-encoding (fetch already decompresses)\n if (key === \"transfer-encoding\" || key === \"connection\" || key === \"content-encoding\")\n return;\n responseHeaders[key] = value;\n });\n\n // Add context usage headers\n responseHeaders[\"x-context-used-kb\"] = String(originalContextSizeKB);\n responseHeaders[\"x-context-limit-kb\"] = String(CONTEXT_LIMIT_KB);\n\n // Add routing debug headers (opt-in via x-clawrouter-debug: true header)\n if (debugMode && routingDecision) {\n responseHeaders[\"x-clawrouter-profile\"] = routingProfile ?? \"auto\";\n responseHeaders[\"x-clawrouter-tier\"] = routingDecision.tier;\n responseHeaders[\"x-clawrouter-model\"] = actualModelUsed;\n responseHeaders[\"x-clawrouter-confidence\"] = routingDecision.confidence.toFixed(2);\n responseHeaders[\"x-clawrouter-reasoning\"] = routingDecision.reasoning;\n if (routingDecision.agenticScore !== undefined) {\n responseHeaders[\"x-clawrouter-agentic-score\"] = routingDecision.agenticScore.toFixed(2);\n }\n }\n\n // Always include cost visibility headers when routing is active\n if (routingDecision) {\n responseHeaders[\"x-clawrouter-cost\"] = routingDecision.costEstimate.toFixed(6);\n responseHeaders[\"x-clawrouter-savings\"] = `${(routingDecision.savings * 100).toFixed(0)}%`;\n }\n\n // Collect full body for possible notice injection\n const bodyParts: Buffer[] = [];\n if (upstream.body) {\n const chunks = await readBodyWithTimeout(upstream.body);\n for (const chunk of chunks) {\n bodyParts.push(Buffer.from(chunk));\n }\n }\n\n let responseBody = Buffer.concat(bodyParts);\n\n // Strip thinking tokens from non-streaming responses (same as streaming path)\n if (responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n choices?: Array<{\n finish_reason?: string | null;\n message?: {\n content?: string;\n tool_calls?: unknown[];\n };\n }>;\n };\n let changed = false;\n for (const choice of parsed.choices ?? []) {\n const message = choice.message;\n if (!message || typeof message.content !== \"string\") continue;\n\n if (\n choice.finish_reason === \"tool_calls\" ||\n (Array.isArray(message.tool_calls) && message.tool_calls.length > 0)\n ) {\n if (message.content !== \"\") {\n message.content = \"\";\n changed = true;\n }\n continue;\n }\n\n // Synthesize tool_calls from XML/text formats some models emit in\n // `content` (OpenClaw `...`, Anthropic-style\n // `...`). Without this, tool calls land as\n // plain text and downstream executors can't dispatch them.\n const extracted = extractTextualToolCalls(message.content);\n if (extracted.toolCalls.length > 0) {\n message.tool_calls = extracted.toolCalls;\n message.content = \"\";\n choice.finish_reason = \"tool_calls\";\n changed = true;\n continue;\n }\n\n const stripped = stripThinkingTokens(message.content);\n if (stripped !== message.content) {\n message.content = stripped;\n changed = true;\n }\n }\n if (changed) responseBody = Buffer.from(JSON.stringify(parsed));\n } catch {\n /* not JSON, skip */\n }\n }\n\n // Prepend balance fallback notice to response content\n if (balanceFallbackNotice && responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n if (parsed.choices?.[0]?.message?.content !== undefined) {\n parsed.choices[0].message.content =\n balanceFallbackNotice + parsed.choices[0].message.content;\n responseBody = Buffer.from(JSON.stringify(parsed));\n }\n } catch {\n /* not JSON, skip notice */\n }\n balanceFallbackNotice = undefined;\n }\n\n // A: Prepend budget downgrade notice to response content\n if (budgetDowngradeNotice && responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n if (parsed.choices?.[0]?.message?.content !== undefined) {\n parsed.choices[0].message.content =\n budgetDowngradeNotice + parsed.choices[0].message.content;\n responseBody = Buffer.from(JSON.stringify(parsed));\n }\n } catch {\n /* not JSON, skip notice */\n }\n budgetDowngradeNotice = undefined;\n }\n\n // Inject actualModelUsed + per-call cost breakdown into non-streaming response.\n // - `model` is overwritten unconditionally (some upstreams omit it) so OpenAI\n // clients see the resolved model, not the routing profile.\n // - `usage.cost` follows OpenClaw's convention (session-cost-usage module reads\n // `usage.cost.{total,input,output}`). Extra fields (baseline, savings_pct,\n // model, tier) are forward-compat metadata ignored by current OpenClaw.\n if (actualModelUsed && responseBody.length > 0) {\n try {\n const parsed = JSON.parse(responseBody.toString()) as {\n model?: string;\n usage?: Record;\n };\n parsed.model = actualModelUsed;\n\n const costBreakdown = buildCostBreakdown({\n actualModelUsed,\n routingProfile: routingProfile ?? undefined,\n routingDecision,\n modelPricing: routerOpts.modelPricing,\n inputTokens: responseInputTokens,\n outputTokens: responseOutputTokens,\n tier: routingDecision?.tier,\n });\n if (costBreakdown) {\n if (!parsed.usage || typeof parsed.usage !== \"object\") {\n parsed.usage = {};\n }\n (parsed.usage as Record).cost = costBreakdown;\n }\n\n responseBody = Buffer.from(JSON.stringify(parsed));\n } catch {\n /* not JSON, skip model/cost injection */\n }\n }\n\n // B: Add budget downgrade headers for orchestration layers\n if (budgetDowngradeHeaderMode) {\n responseHeaders[\"x-clawrouter-budget-downgrade\"] = \"1\";\n responseHeaders[\"x-clawrouter-budget-mode\"] = budgetDowngradeHeaderMode;\n budgetDowngradeHeaderMode = undefined;\n }\n\n // Update content-length header since body may have changed\n responseHeaders[\"content-length\"] = String(responseBody.length);\n res.writeHead(upstream.status, responseHeaders);\n safeWrite(res, responseBody);\n responseChunks.push(responseBody);\n res.end();\n\n // Cache for dedup (short-term, 30s)\n deduplicator.complete(dedupKey, {\n status: upstream.status,\n headers: responseHeaders,\n body: responseBody,\n completedAt: Date.now(),\n });\n\n // Cache for response cache (long-term, 10min) - only successful non-streaming\n if (upstream.status === 200 && responseCache.shouldCache(body)) {\n responseCache.set(cacheKey, {\n body: responseBody,\n status: upstream.status,\n headers: responseHeaders,\n model: actualModelUsed,\n });\n console.log(\n `[XClawRouter] Cached response for ${actualModelUsed} (${responseBody.length} bytes)`,\n );\n }\n\n // Extract content and token usage from non-streaming response\n try {\n const rspJson = JSON.parse(responseBody.toString()) as {\n choices?: Array<{ message?: { content?: string } }>;\n usage?: Record;\n };\n if (rspJson.choices?.[0]?.message?.content) {\n accumulatedContent = rspJson.choices[0].message.content;\n }\n if (rspJson.usage && typeof rspJson.usage === \"object\") {\n if (typeof rspJson.usage.prompt_tokens === \"number\")\n responseInputTokens = rspJson.usage.prompt_tokens;\n if (typeof rspJson.usage.completion_tokens === \"number\")\n responseOutputTokens = rspJson.usage.completion_tokens;\n }\n } catch {\n // Ignore parse errors - journal just won't have content for this response\n }\n }\n\n // --- Degenerate-output diagnostic (fires only on repetition loops) ---\n if (accumulatedContent.length >= 80) {\n const tail = accumulatedContent.slice(-80);\n const tailChars = [...tail];\n const firstChar = tailChars[0];\n const isPunct = /[^\\p{L}\\p{N}\\s]/u.test(firstChar);\n const sameCount = tailChars.filter((c) => c === firstChar).length;\n if (isPunct && sameCount >= 60) {\n console.warn(\n `[XClawRouter] ⚠️ Degenerate output detected — model=${actualModelUsed || \"unknown\"} len=${accumulatedContent.length} head=${JSON.stringify(accumulatedContent.slice(0, 40))} tail_repeats_${JSON.stringify(firstChar)}=${sameCount}/80`,\n );\n }\n }\n\n // --- Session Journal: Extract and record events from response ---\n if (sessionId && accumulatedContent) {\n const events = sessionJournal.extractEvents(accumulatedContent);\n if (events.length > 0) {\n sessionJournal.record(sessionId, events, actualModelUsed);\n console.log(\n `[XClawRouter] Recorded ${events.length} events to session journal for session ${sessionId.slice(0, 8)}...`,\n );\n }\n }\n\n // --- Optimistic balance deduction after successful response ---\n if (estimatedCostMicros !== undefined) {\n balanceMonitor.deductEstimated(estimatedCostMicros);\n }\n\n // Mark request as completed (for client disconnect cleanup)\n completed = true;\n } catch (err) {\n // Clear timeout and client-close listener on error\n clearTimeout(timeoutId);\n req.removeListener(\"close\", onClientClose);\n\n // Clear heartbeat on error\n if (heartbeatInterval) {\n clearInterval(heartbeatInterval);\n heartbeatInterval = undefined;\n }\n\n // Remove in-flight entry so retries aren't blocked\n deduplicator.removeInflight(dedupKey);\n\n // Invalidate balance cache on payment failure (might be out of date)\n balanceMonitor.invalidate();\n\n // Convert abort error to more descriptive timeout error\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(`Request timed out after ${timeoutMs}ms`, { cause: err });\n }\n\n throw err;\n }\n\n // --- Usage logging (fire-and-forget) ---\n // Use actual x402 payment amount from the per-request AsyncLocalStorage store.\n // This is the real amount the user paid — no estimation needed.\n // Falls back to local estimate only for free models (no x402 payment).\n const logModel = routingDecision?.model ?? modelId;\n if (logModel) {\n const actualPayment = paymentStore.getStore()?.amountUsd ?? 0;\n\n // For free models (no x402 payment), use local cost calculation as fallback\n let logCost: number;\n let logBaseline: number;\n let logSavings: number;\n if (actualPayment > 0) {\n logCost = actualPayment;\n // Calculate baseline for savings comparison\n const chargedInputTokens = Math.ceil(body.length / 4);\n const modelDef = BLOCKRUN_MODELS.find((m) => m.id === logModel);\n const chargedOutputTokens = modelDef ? Math.min(maxTokens, modelDef.maxOutput) : maxTokens;\n const baseline = calculateModelCost(\n logModel,\n routerOpts.modelPricing,\n chargedInputTokens,\n chargedOutputTokens,\n routingProfile ?? undefined,\n );\n logBaseline = baseline.baselineCost;\n logSavings = logBaseline > 0 ? Math.max(0, (logBaseline - logCost) / logBaseline) : 0;\n } else {\n const chargedInputTokens = Math.ceil(body.length / 4);\n const costs = calculateModelCost(\n logModel,\n routerOpts.modelPricing,\n chargedInputTokens,\n maxTokens,\n routingProfile ?? undefined,\n );\n // Free models: actual cost is $0 (no x402 payment ever made).\n // MIN_PAYMENT_USD floor in calculateModelCost would falsely inflate stats.\n logCost = FREE_MODELS.has(logModel) ? 0 : costs.costEstimate;\n logBaseline = costs.baselineCost;\n logSavings = FREE_MODELS.has(logModel) ? 1 : costs.savings;\n }\n\n const entry: UsageEntry = {\n timestamp: new Date().toISOString(),\n model: logModel,\n tier: routingDecision?.tier ?? \"DIRECT\",\n cost: logCost,\n baselineCost: logBaseline,\n savings: logSavings,\n latencyMs: Date.now() - startTime,\n status: requestHadError ? \"error\" : \"success\",\n ...(responseInputTokens !== undefined && { inputTokens: responseInputTokens }),\n ...(responseOutputTokens !== undefined && { outputTokens: responseOutputTokens }),\n };\n logUsage(entry).catch(() => {});\n }\n}\n","export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n","export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","import { z } from \"zod\";\n\n// ============================================================================\n// Reusable Primitive Schemas\n// ============================================================================\n\n/**\n * Non-empty string schema - a string with at least one character.\n * Used for required string fields that cannot be empty.\n */\nexport const NonEmptyString = z.string().min(1);\nexport type NonEmptyString = z.infer;\n\n/**\n * Any record schema - an object with unknown keys and values.\n * Used for scheme-specific payloads and other extensible objects.\n */\nexport const Any = z.record(z.unknown());\nexport type Any = z.infer;\n\n/**\n * Optional any record schema - an optional object with unknown keys and values.\n * Used for optional extension fields like `extra` and `extensions`.\n */\nexport const OptionalAny = z.record(z.unknown()).optional().nullable();\nexport type OptionalAny = z.infer;\n\n// ============================================================================\n// Network Schemas\n// ============================================================================\n\n/**\n * Network identifier schema for V1 - loose validation.\n * V1 accepts any non-empty string for backwards compatibility.\n */\nexport const NetworkSchemaV1 = NonEmptyString;\nexport type NetworkV1 = z.infer;\n\n/**\n * Network identifier schema for V2 - CAIP-2 format validation.\n * V2 requires minimum length of 3 and a colon separator (e.g., \"eip155:84532\", \"solana:devnet\").\n */\nexport const NetworkSchemaV2 = z\n .string()\n .min(3)\n .refine(val => val.includes(\":\"), {\n message: \"Network must be in CAIP-2 format (e.g., 'eip155:84532')\",\n });\nexport type NetworkV2 = z.infer;\n\n/**\n * Union network schema - accepts either V1 or V2 format.\n */\nexport const NetworkSchema = z.union([NetworkSchemaV1, NetworkSchemaV2]);\nexport type Network = z.infer;\n\n// ============================================================================\n// Shared Schemas\n// ============================================================================\n\n/**\n * ResourceInfo schema for V2 - describes the protected resource.\n */\nexport const ResourceInfoSchema = z.object({\n url: NonEmptyString,\n description: z.string().optional(),\n mimeType: z.string().optional(),\n});\nexport type ResourceInfo = z.infer;\n\n// ============================================================================\n// V1 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V1.\n * V1 includes resource info directly in the requirements object.\n */\nexport const PaymentRequirementsV1Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n maxAmountRequired: NonEmptyString,\n resource: NonEmptyString, // URL string in V1\n description: z.string(),\n mimeType: z.string().optional(),\n outputSchema: Any.optional().nullable(),\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n asset: NonEmptyString,\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV1 = z.infer;\n\n/**\n * PaymentRequired (402 response) schema for V1.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV1Schema = z.object({\n x402Version: z.literal(1),\n error: z.string().optional(),\n accepts: z.array(PaymentRequirementsV1Schema).min(1),\n});\nexport type PaymentRequiredV1 = z.infer;\n\n/**\n * PaymentPayload schema for V1.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV1Schema = z.object({\n x402Version: z.literal(1),\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n payload: Any,\n});\nexport type PaymentPayloadV1 = z.infer;\n\n// ============================================================================\n// V2 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V2.\n * V2 uses \"amount\" instead of \"maxAmountRequired\" and doesn't include resource info.\n */\nexport const PaymentRequirementsV2Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV2,\n amount: NonEmptyString,\n asset: NonEmptyString,\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV2 = z.infer;\n\n/**\n * PaymentRequired (402 response) schema for V2.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV2Schema = z.object({\n x402Version: z.literal(2),\n error: z.string().optional(),\n resource: ResourceInfoSchema,\n accepts: z.array(PaymentRequirementsV2Schema).min(1),\n extensions: OptionalAny,\n});\nexport type PaymentRequiredV2 = z.infer;\n\n/**\n * PaymentPayload schema for V2.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV2Schema = z.object({\n x402Version: z.literal(2),\n resource: ResourceInfoSchema.optional(),\n accepted: PaymentRequirementsV2Schema,\n payload: Any,\n extensions: OptionalAny,\n});\nexport type PaymentPayloadV2 = z.infer;\n\n// ============================================================================\n// Union Schemas (V1 | V2)\n// ============================================================================\n\n/**\n * PaymentRequirements union schema - accepts either V1 or V2 format.\n * Use this when you need to handle both versions.\n */\nexport const PaymentRequirementsSchema = z.union([\n PaymentRequirementsV1Schema,\n PaymentRequirementsV2Schema,\n]);\nexport type PaymentRequirements = z.infer;\n\n/**\n * PaymentRequired union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentRequiredSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentRequiredV1Schema,\n PaymentRequiredV2Schema,\n]);\nexport type PaymentRequired = z.infer;\n\n/**\n * PaymentPayload union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentPayloadSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentPayloadV1Schema,\n PaymentPayloadV2Schema,\n]);\nexport type PaymentPayload = z.infer;\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Validates a PaymentRequired object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequired(\n value: unknown,\n): z.SafeParseReturnType {\n return PaymentRequiredSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequired object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequired\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequired(value: unknown): PaymentRequired {\n return PaymentRequiredSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequired (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequired\n */\nexport function isPaymentRequired(value: unknown): value is PaymentRequired {\n return PaymentRequiredSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentRequirements object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequirements(\n value: unknown,\n): z.SafeParseReturnType {\n return PaymentRequirementsSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequirements object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequirements\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequirements(value: unknown): PaymentRequirements {\n return PaymentRequirementsSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequirements (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirements\n */\nexport function isPaymentRequirements(value: unknown): value is PaymentRequirements {\n return PaymentRequirementsSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentPayload object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentPayload(\n value: unknown,\n): z.SafeParseReturnType {\n return PaymentPayloadSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentPayload object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentPayload\n * @throws ZodError if validation fails\n */\nexport function validatePaymentPayload(value: unknown): PaymentPayload {\n return PaymentPayloadSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentPayload (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayload\n */\nexport function isPaymentPayload(value: unknown): value is PaymentPayload {\n return PaymentPayloadSchema.safeParse(value).success;\n}\n\n// ============================================================================\n// Version-Specific Type Guards\n// ============================================================================\n\n/**\n * Type guard for PaymentRequiredV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV1\n */\nexport function isPaymentRequiredV1(value: unknown): value is PaymentRequiredV1 {\n return PaymentRequiredV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequiredV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV2\n */\nexport function isPaymentRequiredV2(value: unknown): value is PaymentRequiredV2 {\n return PaymentRequiredV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV1\n */\nexport function isPaymentRequirementsV1(value: unknown): value is PaymentRequirementsV1 {\n return PaymentRequirementsV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV2\n */\nexport function isPaymentRequirementsV2(value: unknown): value is PaymentRequirementsV2 {\n return PaymentRequirementsV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV1\n */\nexport function isPaymentPayloadV1(value: unknown): value is PaymentPayloadV1 {\n return PaymentPayloadV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV2\n */\nexport function isPaymentPayloadV2(value: unknown): value is PaymentPayloadV2 {\n return PaymentPayloadV2Schema.safeParse(value).success;\n}\n\n// ============================================================================\n// Re-export zod for convenience\n// ============================================================================\n\nexport { z } from \"zod\";\n","export const x402Version = 2;\n","import { Network } from \"../types\";\n\n/**\n * Scheme data structure for facilitator storage\n */\nexport interface SchemeData {\n facilitator: T;\n networks: Set;\n pattern: Network;\n}\n\nexport const findSchemesByNetwork = (\n map: Map>,\n network: Network,\n): Map | undefined => {\n // Direct match first\n let implementationsByScheme = map.get(network);\n\n if (!implementationsByScheme) {\n // Try pattern matching for registered network patterns\n for (const [registeredNetworkPattern, implementations] of map.entries()) {\n // Convert the registered network pattern to a regex\n // e.g., \"eip155:*\" becomes /^eip155:.*$/\n const pattern = registeredNetworkPattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape special regex chars except *\n .replace(/\\\\\\*/g, \".*\"); // Replace escaped * with .*\n\n const regex = new RegExp(`^${pattern}$`);\n\n if (regex.test(network)) {\n implementationsByScheme = implementations;\n break;\n }\n }\n }\n\n return implementationsByScheme;\n};\n\nexport const findByNetworkAndScheme = (\n map: Map>,\n scheme: string,\n network: Network,\n): T | undefined => {\n return findSchemesByNetwork(map, network)?.get(scheme);\n};\n\n/**\n * Finds a facilitator by scheme and network using pattern matching.\n * Works with new SchemeData storage structure.\n *\n * @param schemeMap - Map of scheme names to SchemeData\n * @param scheme - The scheme to find\n * @param network - The network to match against\n * @returns The facilitator if found, undefined otherwise\n */\nexport const findFacilitatorBySchemeAndNetwork = (\n schemeMap: Map>,\n scheme: string,\n network: Network,\n): T | undefined => {\n const schemeData = schemeMap.get(scheme);\n if (!schemeData) return undefined;\n\n // Check if network is in the stored networks set\n if (schemeData.networks.has(network)) {\n return schemeData.facilitator;\n }\n\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(network)) {\n return schemeData.facilitator;\n }\n\n return undefined;\n};\n\nexport const Base64EncodedRegex = /^[A-Za-z0-9+/]*={0,2}$/;\n\n/**\n * Encodes a string to base64 format\n *\n * @param data - The string to be encoded to base64\n * @returns The base64 encoded string\n */\nexport function safeBase64Encode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.btoa === \"function\") {\n const bytes = new TextEncoder().encode(data);\n const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join(\"\");\n return globalThis.btoa(binaryString);\n }\n return Buffer.from(data, \"utf8\").toString(\"base64\");\n}\n\n/**\n * Decodes a base64 string back to its original format\n *\n * @param data - The base64 encoded string to be decoded\n * @returns The decoded string in UTF-8 format\n */\nexport function safeBase64Decode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.atob === \"function\") {\n const binaryString = globalThis.atob(data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const decoder = new TextDecoder(\"utf-8\");\n return decoder.decode(bytes);\n }\n return Buffer.from(data, \"base64\").toString(\"utf-8\");\n}\n\n/**\n * Deep equality comparison for payment requirements\n * Uses a normalized JSON.stringify for consistent comparison\n *\n * @param obj1 - First object to compare\n * @param obj2 - Second object to compare\n * @returns True if objects are deeply equal\n */\nexport function deepEqual(obj1: unknown, obj2: unknown): boolean {\n // Normalize and stringify both objects for comparison\n // This handles nested objects, arrays, and different property orders\n const normalize = (obj: unknown): string => {\n // Handle primitives and null/undefined\n if (obj === null || obj === undefined) return JSON.stringify(obj);\n if (typeof obj !== \"object\") return JSON.stringify(obj);\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return JSON.stringify(\n obj.map(item =>\n typeof item === \"object\" && item !== null ? JSON.parse(normalize(item)) : item,\n ),\n );\n }\n\n // Handle objects - sort keys and recursively normalize values\n const sorted: Record = {};\n Object.keys(obj as Record)\n .sort()\n .forEach(key => {\n const value = (obj as Record)[key];\n sorted[key] =\n typeof value === \"object\" && value !== null ? JSON.parse(normalize(value)) : value;\n });\n return JSON.stringify(sorted);\n };\n\n try {\n return normalize(obj1) === normalize(obj2);\n } catch {\n // Fallback to simple comparison if normalization fails\n return JSON.stringify(obj1) === JSON.stringify(obj2);\n }\n}\n","import { x402ResourceServer, SettlementOverrides } from \"../server\";\nimport {\n decodePaymentSignatureHeader,\n encodePaymentRequiredHeader,\n encodePaymentResponseHeader,\n} from \".\";\nimport {\n PaymentPayload,\n PaymentRequired,\n SettleResponse,\n SettleError,\n FacilitatorResponseError,\n Price,\n Network,\n PaymentRequirements,\n} from \"../types\";\nimport { x402Version } from \"..\";\n\nexport const SETTLEMENT_OVERRIDES_HEADER = \"Settlement-Overrides\";\n\n/**\n * Framework-agnostic HTTP adapter interface\n * Implementations provide framework-specific HTTP operations\n */\nexport interface HTTPAdapter {\n getHeader(name: string): string | undefined;\n getMethod(): string;\n getPath(): string;\n getUrl(): string;\n getAcceptHeader(): string;\n getUserAgent(): string;\n\n /**\n * Get query parameters from the request URL\n *\n * @returns Record of query parameter key-value pairs\n */\n getQueryParams?(): Record;\n\n /**\n * Get a specific query parameter by name\n *\n * @param name - The query parameter name\n * @returns The query parameter value(s) or undefined\n */\n getQueryParam?(name: string): string | string[] | undefined;\n\n /**\n * Get the parsed request body\n * Framework adapters should parse JSON/form data appropriately\n *\n * @returns The parsed request body\n */\n getBody?(): unknown;\n}\n\n/**\n * Paywall configuration for HTML responses\n */\nexport interface PaywallConfig {\n appName?: string;\n appLogo?: string;\n sessionTokenEndpoint?: string;\n currentUrl?: string;\n testnet?: boolean;\n}\n\n/**\n * Paywall provider interface for generating HTML\n */\nexport interface PaywallProvider {\n generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string;\n}\n\n/**\n * Dynamic payTo function that receives HTTP request context\n */\nexport type DynamicPayTo = (context: HTTPRequestContext) => string | Promise;\n\n/**\n * Dynamic price function that receives HTTP request context\n */\nexport type DynamicPrice = (context: HTTPRequestContext) => Price | Promise;\n\n/**\n * Result of response body callbacks containing content type and body.\n */\nexport interface HTTPResponseBody {\n /**\n * The content type for the response (e.g., 'application/json', 'text/plain').\n */\n contentType: string;\n\n /**\n * The response body to include in the 402 response.\n */\n body: unknown;\n}\n\n/**\n * Dynamic function to generate a custom response for unpaid requests.\n * Receives the HTTP request context and returns the content type and body to include in the 402 response.\n */\nexport type UnpaidResponseBody = (\n context: HTTPRequestContext,\n) => HTTPResponseBody | Promise;\n\n/**\n * Dynamic function to generate a custom response for settlement failures.\n * Receives the HTTP request context and settle failure result, returns the content type and body.\n */\nexport type SettlementFailedResponseBody = (\n context: HTTPRequestContext,\n settleResult: Omit,\n) => HTTPResponseBody | Promise;\n\n/**\n * A single payment option for a route\n * Represents one way a client can pay for access to the resource\n */\nexport interface PaymentOption {\n scheme: string;\n payTo: string | DynamicPayTo;\n price: Price | DynamicPrice;\n network: Network;\n maxTimeoutSeconds?: number;\n extra?: Record;\n}\n\n/**\n * Route configuration for HTTP endpoints\n *\n * The 'accepts' field defines payment options for the route.\n * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods.\n */\nexport interface RouteConfig {\n // Payment option(s): single or array\n accepts: PaymentOption | PaymentOption[];\n\n // HTTP-specific metadata\n resource?: string;\n description?: string;\n mimeType?: string;\n customPaywallHtml?: string;\n\n /**\n * Optional callback to generate a custom response for unpaid API requests.\n * This allows servers to return preview data, error messages, or other content\n * when a request lacks payment.\n *\n * For browser requests (Accept: text/html), the paywall HTML takes precedence.\n * This callback is only used for API clients.\n *\n * If not provided, defaults to { contentType: 'application/json', body: {} }.\n *\n * @param context - The HTTP request context\n * @returns An object containing both contentType and body for the 402 response\n */\n unpaidResponseBody?: UnpaidResponseBody;\n\n /**\n * Optional callback to generate a custom response for settlement failures.\n * If not provided, defaults to { contentType: 'application/json', body: {} }.\n *\n * @param context - The HTTP request context\n * @param settleResult - The settlement failure result\n * @returns An object containing both contentType and body for the 402 response\n */\n settlementFailedResponseBody?: SettlementFailedResponseBody;\n\n // Extensions\n extensions?: Record;\n}\n\n/**\n * Routes configuration - maps path patterns to route configs\n */\nexport type RoutesConfig = Record | RouteConfig;\n\n/**\n * Hook that runs on every request to a protected route, before payment processing.\n * Can grant access without payment, deny the request, or continue to payment flow.\n *\n * @returns\n * - `void` - Continue to payment processing (default behavior)\n * - `{ grantAccess: true }` - Grant access without requiring payment\n * - `{ abort: true; reason: string }` - Deny the request (returns 403)\n */\nexport type ProtectedRequestHook = (\n context: HTTPRequestContext,\n routeConfig: RouteConfig,\n) => Promise;\n\n/**\n * Compiled route for efficient matching\n */\nexport interface CompiledRoute {\n verb: string;\n regex: RegExp;\n config: RouteConfig;\n pattern: string;\n}\n\n/**\n * HTTP request context that encapsulates all request data\n */\nexport interface HTTPRequestContext {\n adapter: HTTPAdapter;\n path: string;\n method: string;\n paymentHeader?: string;\n routePattern?: string;\n}\n\n/**\n * HTTP transport context contains both request context and optional response data.\n */\nexport interface HTTPTransportContext {\n /** The HTTP request context */\n request: HTTPRequestContext;\n /** The response body buffer */\n responseBody?: Buffer;\n /** Response headers set by the route handler (used for settlement overrides) */\n responseHeaders?: Record;\n}\n\n/**\n * HTTP response instructions for the framework middleware\n */\nexport interface HTTPResponseInstructions {\n status: number;\n headers: Record;\n body?: unknown; // e.g. Paywall for web browser requests, but could be any other type\n isHtml?: boolean; // e.g. if body is a paywall, then isHtml is true\n}\n\n/**\n * Result of processing an HTTP request for payment\n */\nexport type HTTPProcessResult =\n | { type: \"no-payment-required\" }\n | {\n type: \"payment-verified\";\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n declaredExtensions?: Record;\n }\n | { type: \"payment-error\"; response: HTTPResponseInstructions };\n\n/**\n * Result of processSettlement\n */\nexport type ProcessSettleSuccessResponse = SettleResponse & {\n success: true;\n headers: Record;\n requirements: PaymentRequirements;\n};\n\nexport type ProcessSettleFailureResponse = SettleResponse & {\n success: false;\n errorReason: string;\n errorMessage?: string;\n headers: Record;\n response: HTTPResponseInstructions;\n};\n\nexport type ProcessSettleResultResponse =\n | ProcessSettleSuccessResponse\n | ProcessSettleFailureResponse;\n\n/**\n * Represents a validation error for a specific route's payment configuration.\n */\nexport interface RouteValidationError {\n /** The route pattern (e.g., \"GET /api/weather\") */\n routePattern: string;\n /** The payment scheme that failed validation */\n scheme: string;\n /** The network that failed validation */\n network: Network;\n /** The type of validation failure */\n reason: \"missing_scheme\" | \"missing_facilitator\";\n /** Human-readable error message */\n message: string;\n}\n\n/**\n * Error thrown when route configuration validation fails.\n */\nexport class RouteConfigurationError extends Error {\n /** The validation errors that caused this exception */\n public readonly errors: RouteValidationError[];\n\n /**\n * Creates a new RouteConfigurationError with the given validation errors.\n *\n * @param errors - The validation errors that caused this exception.\n */\n constructor(errors: RouteValidationError[]) {\n const message = `x402 Route Configuration Errors:\\n${errors.map(e => ` - ${e.message}`).join(\"\\n\")}`;\n super(message);\n this.name = \"RouteConfigurationError\";\n this.errors = errors;\n }\n}\n\n/**\n * HTTP-enhanced x402 resource server\n * Provides framework-agnostic HTTP protocol handling\n */\nexport class x402HTTPResourceServer {\n private ResourceServer: x402ResourceServer;\n private compiledRoutes: CompiledRoute[] = [];\n private routesConfig: RoutesConfig;\n private paywallProvider?: PaywallProvider;\n private protectedRequestHooks: ProtectedRequestHook[] = [];\n\n /**\n * Creates a new x402HTTPResourceServer instance.\n *\n * @param ResourceServer - The core x402ResourceServer instance to use\n * @param routes - Route configuration for payment-protected endpoints\n */\n constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig) {\n this.ResourceServer = ResourceServer;\n this.routesConfig = routes;\n\n // Handle both single route and multiple routes\n const normalizedRoutes =\n typeof routes === \"object\" && !(\"accepts\" in routes)\n ? (routes as Record)\n : { \"*\": routes as RouteConfig };\n\n for (const [pattern, config] of Object.entries(normalizedRoutes)) {\n const parsed = this.parseRoutePattern(pattern);\n this.compiledRoutes.push({\n verb: parsed.verb,\n regex: parsed.regex,\n config,\n pattern: parsed.path,\n });\n }\n }\n\n /**\n * Get the underlying x402ResourceServer instance.\n *\n * @returns The underlying x402ResourceServer instance\n */\n get server(): x402ResourceServer {\n return this.ResourceServer;\n }\n\n /**\n * Get the routes configuration.\n *\n * @returns The routes configuration\n */\n get routes(): RoutesConfig {\n return this.routesConfig;\n }\n\n /**\n * Initialize the HTTP resource server.\n *\n * This method initializes the underlying resource server (fetching facilitator support)\n * and then validates that all route payment configurations have corresponding\n * registered schemes and facilitator support.\n *\n * @throws RouteConfigurationError if any route's payment options don't have\n * corresponding registered schemes or facilitator support\n *\n * @example\n * ```typescript\n * const httpServer = new x402HTTPResourceServer(server, routes);\n * await httpServer.initialize();\n * ```\n */\n async initialize(): Promise {\n // First, initialize the underlying resource server (fetches facilitator support)\n await this.ResourceServer.initialize();\n\n // Then validate route configuration\n const errors = this.validateRouteConfiguration();\n if (errors.length > 0) {\n throw new RouteConfigurationError(errors);\n }\n }\n\n /**\n * Register a custom paywall provider for generating HTML\n *\n * @param provider - PaywallProvider instance\n * @returns This service instance for chaining\n */\n registerPaywallProvider(provider: PaywallProvider): this {\n this.paywallProvider = provider;\n return this;\n }\n\n /**\n * Register a hook that runs on every request to a protected route, before payment processing.\n * Hooks are executed in order of registration. The first hook to return a non-void result wins.\n *\n * @param hook - The request hook function\n * @returns The x402HTTPResourceServer instance for chaining\n */\n onProtectedRequest(hook: ProtectedRequestHook): this {\n this.protectedRequestHooks.push(hook);\n return this;\n }\n\n /**\n * Process HTTP request and return response instructions\n * This is the main entry point for framework middleware\n *\n * @param context - HTTP request context\n * @param paywallConfig - Optional paywall configuration\n * @returns Process result indicating next action for middleware\n */\n async processHTTPRequest(\n context: HTTPRequestContext,\n paywallConfig?: PaywallConfig,\n ): Promise {\n const method = context.method || context.adapter.getMethod();\n context = { ...context, method };\n const { adapter, path } = context;\n\n // Find matching route\n const routeMatch = this.getRouteConfig(path, method);\n if (!routeMatch) {\n return { type: \"no-payment-required\" }; // No payment required for this route\n }\n const { config: routeConfig, pattern: routePattern } = routeMatch;\n const enrichedContext: HTTPRequestContext = { ...context, routePattern };\n\n // Execute request hooks before any payment processing\n for (const hook of this.protectedRequestHooks) {\n const result = await hook(enrichedContext, routeConfig);\n if (result && \"grantAccess\" in result) {\n return { type: \"no-payment-required\" };\n }\n if (result && \"abort\" in result) {\n return {\n type: \"payment-error\",\n response: {\n status: 403,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: result.reason },\n },\n };\n }\n }\n\n // Normalize accepts field to array of payment options\n const paymentOptions = this.normalizePaymentOptions(routeConfig);\n\n // Check for payment header (v1 or v2)\n const paymentPayload = this.extractPayment(adapter);\n\n // Create resource info, using config override if provided\n const resourceInfo = {\n url: routeConfig.resource || enrichedContext.adapter.getUrl(),\n description: routeConfig.description || \"\",\n mimeType: routeConfig.mimeType || \"\",\n };\n\n // Build requirements from all payment options\n // (this method handles resolving dynamic functions internally)\n let requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions(\n paymentOptions,\n enrichedContext,\n );\n\n let extensions = routeConfig.extensions;\n if (extensions) {\n extensions = this.ResourceServer.enrichExtensions(extensions, enrichedContext);\n }\n\n // createPaymentRequiredResponse already handles extension enrichment in the core layer\n const transportContext: HTTPTransportContext = { request: enrichedContext };\n const paymentRequired = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n !paymentPayload ? \"Payment required\" : undefined,\n extensions,\n transportContext,\n );\n\n // If no payment provided\n if (!paymentPayload) {\n // Resolve custom unpaid response body if provided\n const unpaidBody = routeConfig.unpaidResponseBody\n ? await routeConfig.unpaidResponseBody(enrichedContext)\n : undefined;\n\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(\n paymentRequired,\n this.isWebBrowser(adapter),\n paywallConfig,\n routeConfig.customPaywallHtml,\n unpaidBody,\n ),\n };\n }\n\n // Verify payment\n try {\n const matchingRequirements = this.ResourceServer.findMatchingRequirements(\n paymentRequired.accepts,\n paymentPayload,\n );\n\n if (!matchingRequirements) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements\",\n routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n const verifyResult = await this.ResourceServer.verifyPayment(\n paymentPayload,\n matchingRequirements,\n );\n\n if (!verifyResult.isValid) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n verifyResult.invalidReason,\n routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n // Payment is valid, return data needed for settlement\n return {\n type: \"payment-verified\",\n paymentPayload,\n paymentRequirements: matchingRequirements,\n declaredExtensions: routeConfig.extensions,\n };\n } catch (error) {\n if (error instanceof FacilitatorResponseError) {\n throw error;\n }\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n error instanceof Error ? error.message : \"Payment verification failed\",\n routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n }\n\n /**\n * Process settlement after successful response\n *\n * @param paymentPayload - The verified payment payload\n * @param requirements - The matching payment requirements\n * @param declaredExtensions - Optional declared extensions (for per-key enrichment)\n * @param transportContext - Optional HTTP transport context\n * @param settlementOverrides - Optional settlement overrides (e.g., partial settlement amount)\n * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure\n */\n async processSettlement(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions?: Record,\n transportContext?: HTTPTransportContext,\n settlementOverrides?: SettlementOverrides,\n ): Promise {\n if (transportContext?.request && !transportContext.request.method) {\n transportContext = {\n ...transportContext,\n request: {\n ...transportContext.request,\n method: transportContext.request.adapter.getMethod(),\n },\n };\n }\n try {\n // Resolve overrides: explicit param takes precedence, fall back to response header\n let resolvedOverrides = settlementOverrides;\n if (!resolvedOverrides && transportContext?.responseHeaders) {\n const overridesKey = SETTLEMENT_OVERRIDES_HEADER.toLowerCase();\n const rawValue = Object.entries(transportContext.responseHeaders).find(\n ([key]) => key.toLowerCase() === overridesKey,\n )?.[1];\n if (rawValue) {\n try {\n resolvedOverrides = JSON.parse(rawValue);\n } catch {\n // Ignore malformed header\n }\n }\n }\n\n const settleResponse = await this.ResourceServer.settlePayment(\n paymentPayload,\n requirements,\n declaredExtensions,\n transportContext,\n resolvedOverrides,\n );\n\n if (!settleResponse.success) {\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason: settleResponse.errorReason || \"Settlement failed\",\n errorMessage:\n settleResponse.errorMessage || settleResponse.errorReason || \"Settlement failed\",\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n\n return {\n ...settleResponse,\n success: true,\n headers: this.createSettlementHeaders(settleResponse),\n requirements,\n };\n } catch (error) {\n if (error instanceof FacilitatorResponseError) {\n throw error;\n }\n if (error instanceof SettleError) {\n const errorReason = error.errorReason || error.message;\n const settleResponse: SettleResponse = {\n success: false,\n errorReason,\n errorMessage: error.errorMessage || errorReason,\n payer: error.payer,\n network: error.network,\n transaction: error.transaction,\n };\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason,\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n const errorReason = error instanceof Error ? error.message : \"Settlement failed\";\n const settleResponse: SettleResponse = {\n success: false,\n errorReason,\n errorMessage: errorReason,\n network: requirements.network as Network,\n transaction: \"\",\n };\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason,\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n }\n\n /**\n * Check if a request requires payment based on route configuration\n *\n * @param context - HTTP request context\n * @returns True if the route requires payment, false otherwise\n */\n requiresPayment(context: HTTPRequestContext): boolean {\n const method = context.method || context.adapter.getMethod();\n return this.getRouteConfig(context.path, method) !== undefined;\n }\n\n /**\n * Build HTTPResponseInstructions for settlement failure.\n * Uses settlementFailedResponseBody hook if configured, otherwise defaults to empty body.\n *\n * @param failure - Settlement failure result with headers\n * @param transportContext - Optional HTTP transport context for the request\n * @returns HTTP response instructions for the 402 settlement failure response\n */\n private async buildSettlementFailureResponse(\n failure: Omit,\n transportContext?: HTTPTransportContext,\n ): Promise {\n const settlementHeaders = failure.headers;\n const routeConfig = transportContext\n ? this.getRouteConfig(transportContext.request.path, transportContext.request.method)\n : undefined;\n\n const customBody = routeConfig?.config.settlementFailedResponseBody\n ? await routeConfig.config.settlementFailedResponseBody(transportContext!.request, failure)\n : undefined;\n\n const contentType = customBody ? customBody.contentType : \"application/json\";\n const body = customBody ? customBody.body : {};\n\n return {\n status: 402,\n headers: {\n \"Content-Type\": contentType,\n ...settlementHeaders,\n },\n body,\n isHtml: contentType.includes(\"text/html\"),\n };\n }\n\n /**\n * Normalizes a RouteConfig's accepts field into an array of PaymentOptions\n * Handles both single PaymentOption and array formats\n *\n * @param routeConfig - Route configuration\n * @returns Array of payment options\n */\n private normalizePaymentOptions(routeConfig: RouteConfig): PaymentOption[] {\n return Array.isArray(routeConfig.accepts) ? routeConfig.accepts : [routeConfig.accepts];\n }\n\n /**\n * Validates that all payment options in routes have corresponding registered schemes\n * and facilitator support.\n *\n * @returns Array of validation errors (empty if all routes are valid)\n */\n private validateRouteConfiguration(): RouteValidationError[] {\n const errors: RouteValidationError[] = [];\n\n // Normalize routes to array of [pattern, config] pairs\n const normalizedRoutes =\n typeof this.routesConfig === \"object\" && !(\"accepts\" in this.routesConfig)\n ? Object.entries(this.routesConfig as Record)\n : [[\"*\", this.routesConfig as RouteConfig] as [string, RouteConfig]];\n\n for (const [pattern, config] of normalizedRoutes) {\n // Warn if wildcard routes are used with discovery extensions\n const pathPart = pattern.includes(\" \") ? pattern.split(/\\s+/)[1] : pattern;\n if (\n pathPart &&\n pathPart.includes(\"*\") &&\n config.extensions &&\n \"bazaar\" in config.extensions\n ) {\n console.warn(\n `[x402] Route \"${pattern}\": Wildcard (*) patterns with bazaar discovery extensions ` +\n `will auto-generate parameter names (var1, var2, ...). ` +\n `Consider using named parameters instead (e.g. /weather/:city) for better discovery metadata.`,\n );\n }\n\n const paymentOptions = this.normalizePaymentOptions(config);\n\n for (const option of paymentOptions) {\n // Check 1: Is scheme registered?\n if (!this.ResourceServer.hasRegisteredScheme(option.network, option.scheme)) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_scheme\",\n message: `Route \"${pattern}\": No scheme implementation registered for \"${option.scheme}\" on network \"${option.network}\"`,\n });\n // Skip facilitator check if scheme isn't registered\n continue;\n }\n\n // Check 2: Does facilitator support this scheme/network combination?\n const supportedKind = this.ResourceServer.getSupportedKind(\n x402Version,\n option.network,\n option.scheme,\n );\n\n if (!supportedKind) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_facilitator\",\n message: `Route \"${pattern}\": Facilitator does not support scheme \"${option.scheme}\" on network \"${option.network}\"`,\n });\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Get route configuration for a request\n *\n * @param path - Request path\n * @param method - HTTP method\n * @returns Route configuration and pattern, or undefined if no match\n */\n private getRouteConfig(\n path: string,\n method: string,\n ): { config: RouteConfig; pattern: string } | undefined {\n const normalizedPath = this.normalizePath(path);\n const upperMethod = method.toUpperCase();\n\n const matchingRoute = this.compiledRoutes.find(\n route =>\n route.regex.test(normalizedPath) && (route.verb === \"*\" || route.verb === upperMethod),\n );\n\n if (!matchingRoute) return undefined;\n return { config: matchingRoute.config, pattern: matchingRoute.pattern };\n }\n\n /**\n * Extract payment from HTTP headers (handles v1 and v2)\n *\n * @param adapter - HTTP adapter\n * @returns Decoded payment payload or null\n */\n private extractPayment(adapter: HTTPAdapter): PaymentPayload | null {\n // Check v2 header first (PAYMENT-SIGNATURE)\n const header = adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"PAYMENT-SIGNATURE\");\n\n if (header) {\n try {\n return decodePaymentSignatureHeader(header);\n } catch (error) {\n console.warn(\"Failed to decode PAYMENT-SIGNATURE header:\", error);\n }\n }\n\n return null;\n }\n\n /**\n * Check if request is from a web browser\n *\n * @param adapter - HTTP adapter\n * @returns True if request appears to be from a browser\n */\n private isWebBrowser(adapter: HTTPAdapter): boolean {\n const accept = adapter.getAcceptHeader();\n const userAgent = adapter.getUserAgent();\n return accept.includes(\"text/html\") && userAgent.includes(\"Mozilla\");\n }\n\n /**\n * Create HTTP response instructions from payment required\n *\n * @param paymentRequired - Payment requirements\n * @param isWebBrowser - Whether request is from browser\n * @param paywallConfig - Paywall configuration\n * @param customHtml - Custom HTML template\n * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests\n * @returns Response instructions\n */\n private createHTTPResponse(\n paymentRequired: PaymentRequired,\n isWebBrowser: boolean,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n unpaidResponse?: HTTPResponseBody,\n ): HTTPResponseInstructions {\n // Use 412 Precondition Failed for permit2_allowance_required error\n // This signals client needs to approve Permit2 before retrying\n const status = paymentRequired.error === \"permit2_allowance_required\" ? 412 : 402;\n\n if (isWebBrowser) {\n const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml);\n return {\n status,\n headers: { \"Content-Type\": \"text/html\" },\n body: html,\n isHtml: true,\n };\n }\n\n const response = this.createHTTPPaymentRequiredResponse(paymentRequired);\n\n // Use callback result if provided, otherwise default to JSON with empty object\n const contentType = unpaidResponse ? unpaidResponse.contentType : \"application/json\";\n const body = unpaidResponse ? unpaidResponse.body : {};\n\n return {\n status,\n headers: {\n \"Content-Type\": contentType,\n ...response.headers,\n },\n body,\n };\n }\n\n /**\n * Create HTTP payment required response (v1 puts in body, v2 puts in header)\n *\n * @param paymentRequired - Payment required object\n * @returns Headers and body for the HTTP response\n */\n private createHTTPPaymentRequiredResponse(paymentRequired: PaymentRequired): {\n headers: Record;\n } {\n return {\n headers: {\n \"PAYMENT-REQUIRED\": encodePaymentRequiredHeader(paymentRequired),\n },\n };\n }\n\n /**\n * Create settlement response headers\n *\n * @param settleResponse - Settlement response\n * @returns Headers to add to response\n */\n private createSettlementHeaders(settleResponse: SettleResponse): Record {\n const encoded = encodePaymentResponseHeader(settleResponse);\n return { \"PAYMENT-RESPONSE\": encoded };\n }\n\n /**\n * Parse route pattern into verb and regex\n *\n * @param pattern - Route pattern like \"GET /api/*\", \"/api/[id]\", or \"/api/:id\"\n * @returns Parsed pattern with verb and regex\n */\n private parseRoutePattern(pattern: string): { verb: string; regex: RegExp; path: string } {\n const [verb, path] = pattern.includes(\" \") ? pattern.split(/\\s+/) : [\"*\", pattern];\n\n const regex = new RegExp(\n `^${\n path\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/[$()+.?^{|}]/g, \"\\\\$&\") // Escape regex special chars\n .replace(/\\*/g, \".*?\") // Wildcards\n .replace(/\\[([^\\]]+)\\]/g, \"[^/]+\") // Parameters (Next.js style [param])\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, \"[^/]+\") // Parameters (Express style :param)\n .replace(/\\//g, \"\\\\/\") // Escape slashes\n }$`,\n \"i\",\n );\n\n return { verb: verb.toUpperCase(), regex, path };\n }\n\n /**\n * Normalize path for matching\n *\n * @param path - Raw path from request\n * @returns Normalized path\n */\n private normalizePath(path: string): string {\n const pathWithoutQuery = path.split(/[?#]/)[0];\n\n let decodedOrRawPath: string;\n try {\n decodedOrRawPath = decodeURIComponent(pathWithoutQuery);\n } catch {\n decodedOrRawPath = pathWithoutQuery;\n }\n\n return decodedOrRawPath\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/(.+?)\\/+$/, \"$1\");\n }\n\n /**\n * Generate paywall HTML for browser requests\n *\n * @param paymentRequired - Payment required response\n * @param paywallConfig - Optional paywall configuration\n * @param customHtml - Optional custom HTML template\n * @returns HTML string\n */\n private generatePaywallHTML(\n paymentRequired: PaymentRequired,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n ): string {\n if (customHtml) {\n return customHtml;\n }\n\n // Use custom paywall provider if set\n if (this.paywallProvider) {\n return this.paywallProvider.generateHtml(paymentRequired, paywallConfig);\n }\n\n // Try to use @x402/paywall if available (optional dependency)\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const paywall = require(\"@x402/paywall\");\n const displayAmount = this.getDisplayAmount(paymentRequired);\n const resource = paymentRequired.resource;\n\n return paywall.getPaywallHtml({\n amount: displayAmount,\n paymentRequired,\n currentUrl: resource?.url || paywallConfig?.currentUrl || \"\",\n testnet: paywallConfig?.testnet ?? true,\n appName: paywallConfig?.appName,\n appLogo: paywallConfig?.appLogo,\n sessionTokenEndpoint: paywallConfig?.sessionTokenEndpoint,\n });\n } catch {\n // @x402/paywall not installed, fall back to basic HTML\n }\n\n // Fallback: Basic HTML paywall\n const resource = paymentRequired.resource;\n const displayAmount = this.getDisplayAmount(paymentRequired);\n\n return `\n \n \n \n Payment Required\n \n \n \n \n
\n ${paywallConfig?.appLogo ? `\"${paywallConfig.appName` : \"\"}\n

Payment Required

\n ${resource ? `

Resource: ${resource.description || resource.url}

` : \"\"}\n

Amount: $${displayAmount.toFixed(2)} USDC

\n
\n \n

\n Note: Install @x402/paywall for full wallet connection and payment UI.\n

\n
\n
\n \n \n `;\n }\n\n /**\n * Extract display amount from payment requirements.\n *\n * @param paymentRequired - The payment required object\n * @returns The display amount in decimal format\n */\n private getDisplayAmount(paymentRequired: PaymentRequired): number {\n const accepts = paymentRequired.accepts;\n if (accepts && accepts.length > 0) {\n const firstReq = accepts[0];\n if (\"amount\" in firstReq) {\n // V2 format\n return parseFloat(firstReq.amount) / 1000000; // Assuming USDC with 6 decimals\n }\n }\n return 0;\n }\n}\n","import { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport {\n VerifyResponse,\n SettleResponse,\n SupportedResponse,\n VerifyError,\n SettleError,\n FacilitatorResponseError,\n} from \"../types/facilitator\";\nimport { z } from \"../schemas\";\n\nconst DEFAULT_FACILITATOR_URL = \"https://x402.org/facilitator\";\n\nexport interface FacilitatorConfig {\n url?: string;\n createAuthHeaders?: () => Promise<{\n verify: Record;\n settle: Record;\n supported: Record;\n }>;\n}\n\n/**\n * Interface for facilitator clients\n * Can be implemented for HTTP-based or local facilitators\n */\nexport interface FacilitatorClient {\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise;\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise;\n\n /**\n * Get supported payment kinds and extensions from the facilitator\n *\n * @returns Supported payment kinds and extensions\n */\n getSupported(): Promise;\n}\n\n/** Number of retries for getSupported() on 429 rate limit errors */\nconst GET_SUPPORTED_RETRIES = 3;\n/** Base delay in ms for exponential backoff on retries */\nconst GET_SUPPORTED_RETRY_DELAY_MS = 1000;\n\nconst verifyResponseSchema: z.ZodType = z.object({\n isValid: z.boolean(),\n invalidReason: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n invalidMessage: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n payer: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n extensions: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n});\n\nconst settleResponseSchema: z.ZodType = z.object({\n success: z.boolean(),\n errorReason: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n errorMessage: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n payer: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n transaction: z.string(),\n network: z.custom(value => typeof value === \"string\"),\n extensions: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n});\n\nconst supportedKindSchema: z.ZodType =\n z.object({\n x402Version: z.number(),\n scheme: z.string(),\n network: z.custom(\n value => typeof value === \"string\",\n ),\n extra: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n });\n\nconst supportedResponseSchema: z.ZodType = z.object({\n kinds: z.array(supportedKindSchema),\n extensions: z.array(z.string()).default([]),\n signers: z.record(z.string(), z.array(z.string())).default({}),\n});\n\n/**\n * Produces a compact excerpt of a facilitator response body for error messages.\n *\n * @param text - The raw response body text\n * @param limit - The maximum number of characters to include\n * @returns A normalized excerpt suitable for logs and thrown errors\n */\nfunction responseExcerpt(text: string, limit: number = 200): string {\n const compact = text.trim().replace(/\\s+/g, \" \");\n if (!compact) {\n return \"\";\n }\n\n if (compact.length <= limit) {\n return compact;\n }\n\n return `${compact.slice(0, limit - 3)}...`;\n}\n\n/**\n * Parses and validates a successful facilitator response body.\n *\n * @param response - The HTTP response returned by the facilitator\n * @param schema - The schema used to validate the response payload\n * @param operation - The facilitator operation name for error reporting\n * @returns The validated facilitator payload\n */\nasync function parseSuccessResponse(\n response: Response,\n schema: z.ZodType,\n operation: string,\n): Promise {\n const text = await response.text();\n\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new FacilitatorResponseError(\n `Facilitator ${operation} returned invalid JSON: ${responseExcerpt(text)}`,\n );\n }\n\n const parsed = schema.safeParse(data);\n if (!parsed.success) {\n throw new FacilitatorResponseError(\n `Facilitator ${operation} returned invalid data: ${responseExcerpt(text)}`,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * HTTP-based client for interacting with x402 facilitator services\n * Handles HTTP communication with facilitator endpoints\n */\nexport class HTTPFacilitatorClient implements FacilitatorClient {\n readonly url: string;\n private readonly _createAuthHeaders?: FacilitatorConfig[\"createAuthHeaders\"];\n\n /**\n * Creates a new HTTPFacilitatorClient instance.\n *\n * @param config - Configuration options for the facilitator client\n */\n constructor(config?: FacilitatorConfig) {\n // Normalize URL: strip trailing slashes to prevent redirect loops (e.g. 308)\n // when constructing endpoint paths like `${url}/supported`\n this.url = (config?.url || DEFAULT_FACILITATOR_URL).replace(/\\/+$/, \"\");\n this._createAuthHeaders = config?.createAuthHeaders;\n }\n\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise {\n let headers: Record = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"verify\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/verify`, {\n method: \"POST\",\n headers,\n redirect: \"follow\",\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new Error(`Facilitator verify failed (${response.status}): ${responseExcerpt(text)}`);\n }\n\n if (typeof data === \"object\" && data !== null && \"isValid\" in data) {\n throw new VerifyError(response.status, data as VerifyResponse);\n }\n\n throw new Error(\n `Facilitator verify failed (${response.status}): ${responseExcerpt(JSON.stringify(data))}`,\n );\n }\n\n return parseSuccessResponse(response, verifyResponseSchema, \"verify\");\n }\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise {\n let headers: Record = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"settle\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/settle`, {\n method: \"POST\",\n headers,\n redirect: \"follow\",\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new Error(`Facilitator settle failed (${response.status}): ${responseExcerpt(text)}`);\n }\n\n if (typeof data === \"object\" && data !== null && \"success\" in data) {\n throw new SettleError(response.status, data as SettleResponse);\n }\n\n throw new Error(\n `Facilitator settle failed (${response.status}): ${responseExcerpt(JSON.stringify(data))}`,\n );\n }\n\n return parseSuccessResponse(response, settleResponseSchema, \"settle\");\n }\n\n /**\n * Get supported payment kinds and extensions from the facilitator.\n * Retries with exponential backoff on 429 rate limit errors.\n *\n * @returns Supported payment kinds and extensions\n */\n async getSupported(): Promise {\n let headers: Record = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"supported\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n let lastError: Error | null = null;\n for (let attempt = 0; attempt < GET_SUPPORTED_RETRIES; attempt++) {\n const response = await fetch(`${this.url}/supported`, {\n method: \"GET\",\n headers,\n redirect: \"follow\",\n });\n\n if (response.ok) {\n return parseSuccessResponse(response, supportedResponseSchema, \"supported\");\n }\n\n const errorText = await response.text().catch(() => response.statusText);\n lastError = new Error(\n `Facilitator getSupported failed (${response.status}): ${responseExcerpt(errorText)}`,\n );\n\n // Retry on 429 rate limit errors with exponential backoff\n if (response.status === 429 && attempt < GET_SUPPORTED_RETRIES - 1) {\n const delay = GET_SUPPORTED_RETRY_DELAY_MS * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n throw lastError;\n }\n\n throw lastError ?? new Error(\"Facilitator getSupported failed after retries\");\n }\n\n /**\n * Creates authentication headers for a specific path.\n *\n * @param path - The path to create authentication headers for (e.g., \"verify\", \"settle\", \"supported\")\n * @returns An object containing the authentication headers for the specified path\n */\n async createAuthHeaders(path: string): Promise<{\n headers: Record;\n }> {\n if (this._createAuthHeaders) {\n const authHeaders = (await this._createAuthHeaders()) as Record<\n string,\n Record\n >;\n return {\n headers: authHeaders[path] ?? {},\n };\n }\n return {\n headers: {},\n };\n }\n\n /**\n * Helper to convert objects to JSON-safe format.\n * Handles BigInt and other non-JSON types.\n *\n * @param obj - The object to convert\n * @returns The JSON-safe representation of the object\n */\n private toJsonSafe(obj: unknown): unknown {\n return JSON.parse(\n JSON.stringify(obj, (_, value) => (typeof value === \"bigint\" ? value.toString() : value)),\n );\n }\n}\n","import {\n decodePaymentRequiredHeader,\n decodePaymentResponseHeader,\n encodePaymentSignatureHeader,\n} from \".\";\nimport { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { x402Client } from \"../client/x402Client\";\n\n/**\n * Context provided to onPaymentRequired hooks.\n */\nexport interface PaymentRequiredContext {\n paymentRequired: PaymentRequired;\n}\n\n/**\n * Hook called when a 402 response is received, before payment processing.\n * Return headers to try before payment, or void to proceed directly to payment.\n */\nexport type PaymentRequiredHook = (\n context: PaymentRequiredContext,\n) => Promise<{ headers: Record } | void>;\n\n/**\n * HTTP-specific client for handling x402 payment protocol over HTTP.\n *\n * Wraps a x402Client to provide HTTP-specific encoding/decoding functionality\n * for payment headers and responses while maintaining the builder pattern.\n */\nexport class x402HTTPClient {\n private paymentRequiredHooks: PaymentRequiredHook[] = [];\n\n /**\n * Creates a new x402HTTPClient instance.\n *\n * @param client - The underlying x402Client for payment logic\n */\n constructor(private readonly client: x402Client) {}\n\n /**\n * Register a hook to handle 402 responses before payment.\n * Hooks run in order; first to return headers wins.\n *\n * @param hook - The hook function to register\n * @returns This instance for chaining\n */\n onPaymentRequired(hook: PaymentRequiredHook): this {\n this.paymentRequiredHooks.push(hook);\n return this;\n }\n\n /**\n * Run hooks and return headers if any hook provides them.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Headers to use for retry, or null to proceed to payment\n */\n async handlePaymentRequired(\n paymentRequired: PaymentRequired,\n ): Promise | null> {\n for (const hook of this.paymentRequiredHooks) {\n const result = await hook({ paymentRequired });\n if (result?.headers) {\n return result.headers;\n }\n }\n return null;\n }\n\n /**\n * Encodes a payment payload into appropriate HTTP headers based on version.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns HTTP headers containing the encoded payment signature\n */\n encodePaymentSignatureHeader(paymentPayload: PaymentPayload): Record {\n switch (paymentPayload.x402Version) {\n case 2:\n return {\n \"PAYMENT-SIGNATURE\": encodePaymentSignatureHeader(paymentPayload),\n };\n case 1:\n return {\n \"X-PAYMENT\": encodePaymentSignatureHeader(paymentPayload),\n };\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Extracts payment required information from HTTP response.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @param body - Optional response body for v1 compatibility\n * @returns The payment required object\n */\n getPaymentRequiredResponse(\n getHeader: (name: string) => string | null | undefined,\n body?: unknown,\n ): PaymentRequired {\n // v2\n const paymentRequired = getHeader(\"PAYMENT-REQUIRED\");\n if (paymentRequired) {\n return decodePaymentRequiredHeader(paymentRequired);\n }\n\n // v1\n if (\n body &&\n body instanceof Object &&\n \"x402Version\" in body &&\n (body as PaymentRequired).x402Version === 1\n ) {\n return body as PaymentRequired;\n }\n\n throw new Error(\"Invalid payment required response\");\n }\n\n /**\n * Extracts payment settlement response from HTTP headers.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The settlement response object\n */\n getPaymentSettleResponse(getHeader: (name: string) => string | null | undefined): SettleResponse {\n // v2\n const paymentResponse = getHeader(\"PAYMENT-RESPONSE\");\n if (paymentResponse) {\n return decodePaymentResponseHeader(paymentResponse);\n }\n\n // v1\n const xPaymentResponse = getHeader(\"X-PAYMENT-RESPONSE\");\n if (xPaymentResponse) {\n return decodePaymentResponseHeader(xPaymentResponse);\n }\n\n throw new Error(\"Payment response header not found\");\n }\n\n /**\n * Creates a payment payload for the given payment requirements.\n * Delegates to the underlying x402Client.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Promise resolving to the payment payload\n */\n async createPaymentPayload(paymentRequired: PaymentRequired): Promise {\n return this.client.createPaymentPayload(paymentRequired);\n }\n}\n","import { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { Base64EncodedRegex, safeBase64Decode, safeBase64Encode } from \"../utils\";\n\n// HTTP Methods that typically use query parameters\nexport type QueryParamMethods = \"GET\" | \"HEAD\" | \"DELETE\";\n\n// HTTP Methods that typically use request body\nexport type BodyMethods = \"POST\" | \"PUT\" | \"PATCH\";\n\n/**\n * Encodes a payment payload as a base64 header value.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns Base64 encoded string representation of the payment payload\n */\nexport function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string {\n return safeBase64Encode(JSON.stringify(paymentPayload));\n}\n\n/**\n * Decodes a base64 payment signature header into a payment payload.\n *\n * @param paymentSignatureHeader - The base64 encoded payment signature header\n * @returns The decoded payment payload\n */\nexport function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload {\n if (!Base64EncodedRegex.test(paymentSignatureHeader)) {\n throw new Error(\"Invalid payment signature header\");\n }\n return JSON.parse(safeBase64Decode(paymentSignatureHeader)) as PaymentPayload;\n}\n\n/**\n * Encodes a payment required object as a base64 header value.\n *\n * @param paymentRequired - The payment required object to encode\n * @returns Base64 encoded string representation of the payment required object\n */\nexport function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string {\n return safeBase64Encode(JSON.stringify(paymentRequired));\n}\n\n/**\n * Decodes a base64 payment required header into a payment required object.\n *\n * @param paymentRequiredHeader - The base64 encoded payment required header\n * @returns The decoded payment required object\n */\nexport function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired {\n if (!Base64EncodedRegex.test(paymentRequiredHeader)) {\n throw new Error(\"Invalid payment required header\");\n }\n return JSON.parse(safeBase64Decode(paymentRequiredHeader)) as PaymentRequired;\n}\n\n/**\n * Encodes a payment response as a base64 header value.\n *\n * @param paymentResponse - The payment response to encode\n * @returns Base64 encoded string representation of the payment response\n */\nexport function encodePaymentResponseHeader(paymentResponse: SettleResponse): string {\n return safeBase64Encode(JSON.stringify(paymentResponse));\n}\n\n/**\n * Decodes a base64 payment response header into a settle response.\n *\n * @param paymentResponseHeader - The base64 encoded payment response header\n * @returns The decoded settle response\n */\nexport function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse {\n if (!Base64EncodedRegex.test(paymentResponseHeader)) {\n throw new Error(\"Invalid payment response header\");\n }\n return JSON.parse(safeBase64Decode(paymentResponseHeader)) as SettleResponse;\n}\n\n// Export HTTP service and types\nexport {\n x402HTTPResourceServer,\n HTTPAdapter,\n HTTPRequestContext,\n HTTPTransportContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n PaymentOption,\n RouteConfig,\n RoutesConfig,\n CompiledRoute,\n DynamicPayTo,\n DynamicPrice,\n UnpaidResponseBody,\n HTTPResponseBody,\n SettlementFailedResponseBody,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n RouteConfigurationError,\n ProtectedRequestHook,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { FacilitatorResponseError, getFacilitatorResponseError } from \"../types\";\nexport { x402HTTPClient, PaymentRequiredContext, PaymentRequiredHook } from \"./x402HTTPClient\";\n","import { x402Version } from \"..\";\nimport { SchemeNetworkClient } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network, PaymentRequired } from \"../types\";\nimport { findByNetworkAndScheme, findSchemesByNetwork } from \"../utils\";\n\n/**\n * Client Hook Context Interfaces\n */\n\nexport interface PaymentCreationContext {\n paymentRequired: PaymentRequired;\n selectedRequirements: PaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n paymentPayload: PaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n error: Error;\n}\n\n/**\n * Client Hook Type Definitions\n */\n\nexport type BeforePaymentCreationHook = (\n context: PaymentCreationContext,\n) => Promise;\n\nexport type AfterPaymentCreationHook = (context: PaymentCreatedContext) => Promise;\n\nexport type OnPaymentCreationFailureHook = (\n context: PaymentCreationFailureContext,\n) => Promise;\n\nexport type SelectPaymentRequirements = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements;\n\n/**\n * Extension that can enrich payment payloads on the client side.\n *\n * Client extensions are invoked after the scheme creates the base payment payload\n * but before it is returned. This allows mechanism-specific logic (e.g., EVM EIP-2612\n * permit signing) to enrich the payload's extensions data.\n */\nexport interface ClientExtension {\n /**\n * Unique key identifying this extension (e.g., \"eip2612GasSponsoring\").\n * Must match the extension key used in PaymentRequired.extensions.\n */\n key: string;\n\n /**\n * Called after payload creation when the extension key is present in\n * paymentRequired.extensions. Allows the extension to enrich the payload\n * with extension-specific data (e.g., signing an EIP-2612 permit).\n *\n * @param paymentPayload - The payment payload to enrich\n * @param paymentRequired - The original PaymentRequired response\n * @returns The enriched payment payload\n */\n enrichPaymentPayload?: (\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ) => Promise;\n}\n\n/**\n * A policy function that filters or transforms payment requirements.\n * Policies are applied in order before the selector chooses the final option.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of payment requirements to filter/transform\n * @returns Filtered array of payment requirements\n */\nexport type PaymentPolicy = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements[];\n\n\n/**\n * Configuration for registering a payment scheme with a specific network\n */\nexport interface SchemeRegistration {\n /**\n * The network identifier (e.g., 'eip155:8453', 'solana:mainnet')\n */\n network: Network;\n\n /**\n * The scheme client implementation for this network\n */\n client: SchemeNetworkClient;\n\n /**\n * The x402 protocol version to use for this scheme\n *\n * @default 2\n */\n x402Version?: number;\n}\n\n/**\n * Configuration options for the fetch wrapper\n */\nexport interface x402ClientConfig {\n /**\n * Array of scheme registrations defining which payment methods are supported\n */\n schemes: SchemeRegistration[];\n\n /**\n * Policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Custom payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n}\n\n/**\n * Core client for managing x402 payment schemes and creating payment payloads.\n *\n * Handles registration of payment schemes, policy-based filtering of payment requirements,\n * and creation of payment payloads based on server requirements.\n */\nexport class x402Client {\n private readonly paymentRequirementsSelector: SelectPaymentRequirements;\n private readonly registeredClientSchemes: Map>> = new Map();\n private readonly policies: PaymentPolicy[] = [];\n private readonly registeredExtensions: Map = new Map();\n\n private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n\n /**\n * Creates a new x402Client instance.\n *\n * @param paymentRequirementsSelector - Function to select payment requirements from available options\n */\n constructor(paymentRequirementsSelector?: SelectPaymentRequirements) {\n this.paymentRequirementsSelector = paymentRequirementsSelector || ((x402Version, accepts) => accepts[0]);\n }\n\n /**\n * Creates a new x402Client instance from a configuration object.\n *\n * @param config - The client configuration including schemes, policies, and payment requirements selector\n * @returns A configured x402Client instance\n */\n static fromConfig(config: x402ClientConfig): x402Client {\n const client = new x402Client(config.paymentRequirementsSelector);\n config.schemes.forEach(scheme => {\n if (scheme.x402Version === 1) {\n client.registerV1(scheme.network, scheme.client);\n } else {\n client.register(scheme.network, scheme.client);\n }\n });\n config.policies?.forEach(policy => {\n client.registerPolicy(policy);\n });\n return client;\n }\n\n /**\n * Registers a scheme client for the current x402 version.\n *\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n register(network: Network, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(x402Version, network, client);\n }\n\n /**\n * Registers a scheme client for x402 version 1.\n *\n * @param network - The v1 network identifier (e.g., 'base-sepolia', 'solana-devnet')\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n registerV1(network: string, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(1, network as Network, client);\n }\n\n /**\n * Registers a policy to filter or transform payment requirements.\n *\n * Policies are applied in order after filtering by registered schemes\n * and before the selector chooses the final payment requirement.\n *\n * @param policy - Function to filter/transform payment requirements\n * @returns The x402Client instance for chaining\n *\n * @example\n * ```typescript\n * // Prefer cheaper options\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => BigInt(r.value) < BigInt('1000000'))\n * );\n *\n * // Prefer specific networks\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => r.network.startsWith('eip155:'))\n * );\n * ```\n */\n registerPolicy(policy: PaymentPolicy): x402Client {\n this.policies.push(policy);\n return this;\n }\n\n /**\n * Registers a client extension that can enrich payment payloads.\n *\n * Extensions are invoked after the scheme creates the base payload and the\n * payload is wrapped with extensions/resource/accepted data. If the extension's\n * key is present in `paymentRequired.extensions`, the extension's\n * `enrichPaymentPayload` hook is called to modify the payload.\n *\n * @param extension - The client extension to register\n * @returns The x402Client instance for chaining\n */\n registerExtension(extension: ClientExtension): x402Client {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Register a hook to execute before payment payload creation.\n * Can abort creation by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onBeforePaymentCreation(hook: BeforePaymentCreationHook): x402Client {\n this.beforePaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment payload creation.\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onAfterPaymentCreation(hook: AfterPaymentCreationHook): x402Client {\n this.afterPaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment payload creation fails.\n * Can recover from failure by returning { recovered: true, payload: PaymentPayload }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): x402Client {\n this.onPaymentCreationFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Creates a payment payload based on a PaymentRequired response.\n *\n * Automatically extracts x402Version, resource, and extensions from the PaymentRequired\n * response and constructs a complete PaymentPayload with the accepted requirements.\n *\n * @param paymentRequired - The PaymentRequired response from the server\n * @returns Promise resolving to the complete payment payload\n */\n async createPaymentPayload(\n paymentRequired: PaymentRequired,\n ): Promise {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(paymentRequired.x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${paymentRequired.x402Version}`);\n }\n\n const requirements = this.selectPaymentRequirements(paymentRequired.x402Version, paymentRequired.accepts);\n\n const context: PaymentCreationContext = {\n paymentRequired,\n selectedRequirements: requirements,\n };\n\n // Execute beforePaymentCreation hooks\n for (const hook of this.beforePaymentCreationHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Payment creation aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeNetworkClient = findByNetworkAndScheme(clientSchemesByNetwork, requirements.scheme, requirements.network);\n if (!schemeNetworkClient) {\n throw new Error(`No client registered for scheme: ${requirements.scheme} and network: ${requirements.network}`);\n }\n\n const partialPayload = await schemeNetworkClient.createPaymentPayload(\n paymentRequired.x402Version,\n requirements,\n { extensions: paymentRequired.extensions },\n );\n\n let paymentPayload: PaymentPayload;\n if (partialPayload.x402Version == 1) {\n paymentPayload = partialPayload as PaymentPayload;\n } else {\n // Merge server-declared extensions with any scheme-provided extensions.\n // Scheme extensions overlay on top (e.g., EIP-2612 info enriches server declaration).\n const mergedExtensions = this.mergeExtensions(\n paymentRequired.extensions,\n partialPayload.extensions,\n );\n\n paymentPayload = {\n x402Version: partialPayload.x402Version,\n payload: partialPayload.payload,\n extensions: mergedExtensions,\n resource: paymentRequired.resource,\n accepted: requirements,\n };\n }\n\n // Enrich payload via registered client extensions (for non-scheme extensions)\n paymentPayload = await this.enrichPaymentPayloadWithExtensions(paymentPayload, paymentRequired);\n\n // Execute afterPaymentCreation hooks\n const createdContext: PaymentCreatedContext = {\n ...context,\n paymentPayload,\n };\n\n for (const hook of this.afterPaymentCreationHooks) {\n await hook(createdContext);\n }\n\n return paymentPayload;\n } catch (error) {\n const failureContext: PaymentCreationFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onPaymentCreationFailure hooks\n for (const hook of this.onPaymentCreationFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.payload;\n }\n }\n\n throw error;\n }\n }\n\n\n\n /**\n * Merges server-declared extensions with scheme-provided extensions.\n * Scheme extensions overlay on top of server extensions at each key,\n * preserving server-provided schema while overlaying scheme-provided info.\n *\n * @param serverExtensions - Extensions declared by the server in the 402 response\n * @param schemeExtensions - Extensions provided by the scheme client (e.g. EIP-2612)\n * @returns The merged extensions object, or undefined if both inputs are undefined\n */\n private mergeExtensions(\n serverExtensions?: Record,\n schemeExtensions?: Record,\n ): Record | undefined {\n if (!schemeExtensions) return serverExtensions;\n if (!serverExtensions) return schemeExtensions;\n\n const merged = { ...serverExtensions };\n for (const [key, schemeValue] of Object.entries(schemeExtensions)) {\n const serverValue = merged[key];\n if (\n serverValue &&\n typeof serverValue === \"object\" &&\n schemeValue &&\n typeof schemeValue === \"object\"\n ) {\n // Deep merge: scheme info overlays server info, schema preserved\n merged[key] = { ...serverValue as Record, ...schemeValue as Record };\n } else {\n merged[key] = schemeValue;\n }\n }\n return merged;\n }\n\n /**\n * Enriches a payment payload by calling registered extension hooks.\n * For each extension key present in the PaymentRequired response,\n * invokes the corresponding extension's enrichPaymentPayload callback.\n *\n * @param paymentPayload - The payment payload to enrich with extension data\n * @param paymentRequired - The PaymentRequired response containing extension declarations\n * @returns The enriched payment payload with extension data applied\n */\n private async enrichPaymentPayloadWithExtensions(\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ): Promise {\n if (!paymentRequired.extensions || this.registeredExtensions.size === 0) {\n return paymentPayload;\n }\n\n let enriched = paymentPayload;\n for (const [key, extension] of this.registeredExtensions) {\n if (key in paymentRequired.extensions && extension.enrichPaymentPayload) {\n enriched = await extension.enrichPaymentPayload(enriched, paymentRequired);\n }\n }\n\n return enriched;\n }\n\n /**\n * Selects appropriate payment requirements based on registered clients and policies.\n *\n * Selection process:\n * 1. Filter by registered schemes (network + scheme support)\n * 2. Apply all registered policies in order\n * 3. Use selector to choose final requirement\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of available payment requirements\n * @returns The selected payment requirements\n */\n private selectPaymentRequirements(x402Version: number, paymentRequirements: PaymentRequirements[]): PaymentRequirements {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${x402Version}`);\n }\n\n // Step 1: Filter by registered schemes\n const supportedPaymentRequirements = paymentRequirements.filter(requirement => {\n let clientSchemes = findSchemesByNetwork(clientSchemesByNetwork, requirement.network);\n if (!clientSchemes) {\n return false;\n }\n\n return clientSchemes.has(requirement.scheme);\n })\n\n if (supportedPaymentRequirements.length === 0) {\n throw new Error(`No network/scheme registered for x402 version: ${x402Version} which comply with the payment requirements. ${JSON.stringify({\n x402Version,\n paymentRequirements,\n x402Versions: Array.from(this.registeredClientSchemes.keys()),\n networks: Array.from(clientSchemesByNetwork.keys()),\n schemes: Array.from(clientSchemesByNetwork.values()).map(schemes => Array.from(schemes.keys())).flat(),\n })}`);\n }\n\n // Step 2: Apply all policies in order\n let filteredRequirements = supportedPaymentRequirements;\n for (const policy of this.policies) {\n filteredRequirements = policy(x402Version, filteredRequirements);\n\n if (filteredRequirements.length === 0) {\n throw new Error(`All payment requirements were filtered out by policies for x402 version: ${x402Version}`);\n }\n }\n\n // Step 3: Use selector to choose final requirement\n return this.paymentRequirementsSelector(x402Version, filteredRequirements);\n }\n\n /**\n * Internal method to register a scheme client.\n *\n * @param x402Version - The x402 protocol version\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n private _registerScheme(x402Version: number, network: Network, client: SchemeNetworkClient): x402Client {\n if (!this.registeredClientSchemes.has(x402Version)) {\n this.registeredClientSchemes.set(x402Version, new Map());\n }\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version)!;\n if (!clientSchemesByNetwork.has(network)) {\n clientSchemesByNetwork.set(network, new Map());\n }\n\n const clientByScheme = clientSchemesByNetwork.get(network)!;\n if (!clientByScheme.has(client.scheme)) {\n clientByScheme.set(client.scheme, client);\n }\n\n return this;\n }\n}\n","import { x402Client, x402ClientConfig, x402HTTPClient } from \"@x402/core/client\";\nimport { type PaymentRequired } from \"@x402/core/types\";\n\n/**\n * Enables the payment of APIs using the x402 payment protocol v2.\n *\n * This function wraps the native fetch API to automatically handle 402 Payment Required responses\n * by creating and sending payment headers. It will:\n * 1. Make the initial request\n * 2. If a 402 response is received, parse the payment requirements\n * 3. Create a payment header using the configured x402HTTPClient\n * 4. Retry the request with the payment header\n *\n * @param fetch - The fetch function to wrap (typically globalThis.fetch)\n * @param client - Configured x402Client or x402HTTPClient instance for handling payments\n * @returns A wrapped fetch function that handles 402 responses automatically\n *\n * @example\n * ```typescript\n * import { wrapFetchWithPayment, x402Client } from '@x402/fetch';\n * import { ExactEvmScheme } from '@x402/evm';\n * import { ExactSvmScheme } from '@x402/svm';\n *\n * const client = new x402Client()\n * .register('eip155:8453', new ExactEvmScheme(evmSigner))\n * .register('solana:mainnet', new ExactSvmScheme(svmSigner))\n * .register('eip155:1', new ExactEvmScheme(evmSigner), 1); // v1 protocol\n *\n * const fetchWithPay = wrapFetchWithPayment(fetch, client);\n *\n * // Make a request that may require payment\n * const response = await fetchWithPay('https://api.example.com/paid-endpoint');\n * ```\n *\n * @throws {Error} If no schemes are provided\n * @throws {Error} If the request configuration is missing\n * @throws {Error} If a payment has already been attempted for this request\n * @throws {Error} If there's an error creating the payment header\n */\nexport function wrapFetchWithPayment(\n fetch: typeof globalThis.fetch,\n client: x402Client | x402HTTPClient,\n) {\n const httpClient = client instanceof x402HTTPClient ? client : new x402HTTPClient(client);\n\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const request = new Request(input, init);\n const clonedRequest = request.clone();\n\n const response = await fetch(request);\n\n if (response.status !== 402) {\n return response;\n }\n\n // Parse payment requirements from response\n let paymentRequired: PaymentRequired;\n try {\n // Create getHeader function for case-insensitive header lookup\n const getHeader = (name: string) => response.headers.get(name);\n\n // Try to get from headers first (v2), then from body (v1)\n let body: PaymentRequired | undefined;\n try {\n const responseText = await response.text();\n if (responseText) {\n body = JSON.parse(responseText) as PaymentRequired;\n }\n } catch {\n // Ignore JSON parse errors - might be header-only response\n }\n\n paymentRequired = httpClient.getPaymentRequiredResponse(getHeader, body);\n } catch (error) {\n throw new Error(\n `Failed to parse payment requirements: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Run payment required hooks\n const hookHeaders = await httpClient.handlePaymentRequired(paymentRequired);\n if (hookHeaders) {\n const hookRequest = clonedRequest.clone();\n for (const [key, value] of Object.entries(hookHeaders)) {\n hookRequest.headers.set(key, value);\n }\n const hookResponse = await fetch(hookRequest);\n if (hookResponse.status !== 402) {\n return hookResponse; // Hook succeeded\n }\n // Hook's retry got 402, fall through to payment\n }\n\n // Create payment payload (copy extensions from PaymentRequired)\n let paymentPayload;\n try {\n paymentPayload = await client.createPaymentPayload(paymentRequired);\n } catch (error) {\n throw new Error(\n `Failed to create payment payload: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Encode payment header\n const paymentHeaders = httpClient.encodePaymentSignatureHeader(paymentPayload);\n\n // Check if this is already a retry to prevent infinite loops\n if (clonedRequest.headers.has(\"PAYMENT-SIGNATURE\") || clonedRequest.headers.has(\"X-PAYMENT\")) {\n throw new Error(\"Payment already attempted\");\n }\n\n // Add payment headers to cloned request\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n clonedRequest.headers.set(\n \"Access-Control-Expose-Headers\",\n \"PAYMENT-RESPONSE,X-PAYMENT-RESPONSE\",\n );\n\n // Retry the request with payment\n const secondResponse = await fetch(clonedRequest);\n return secondResponse;\n };\n}\n\n/**\n * Creates a payment-enabled fetch function from a configuration object.\n *\n * @param fetch - The fetch function to wrap (typically globalThis.fetch)\n * @param config - Configuration options including scheme registrations and selectors\n * @returns A wrapped fetch function that handles 402 responses automatically\n */\nexport function wrapFetchWithPaymentFromConfig(\n fetch: typeof globalThis.fetch,\n config: x402ClientConfig,\n) {\n const client = x402Client.fromConfig(config);\n return wrapFetchWithPayment(fetch, client);\n}\n\n// Re-export types and utilities for convenience\nexport { x402Client, x402HTTPClient } from \"@x402/core/client\";\nexport type {\n PaymentPolicy,\n SchemeRegistration,\n SelectPaymentRequirements,\n x402ClientConfig,\n} from \"@x402/core/client\";\nexport { decodePaymentResponseHeader } from \"@x402/core/http\";\nexport type {\n Network,\n PaymentPayload,\n PaymentRequired,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\n","/**\n * Payment Pre-Auth Cache\n *\n * Wraps the @x402/fetch SDK with pre-authorization caching.\n * After the first 402 response, caches payment requirements per endpoint.\n * On subsequent requests, pre-signs payment and attaches it to the first\n * request, skipping the 402 round trip (~200ms savings per request).\n *\n * Falls back to normal 402 flow if pre-signed payment is rejected.\n */\n\nimport type { x402Client } from \"@x402/fetch\";\nimport { x402HTTPClient } from \"@x402/fetch\";\n\ntype PaymentRequired = Parameters[\"createPaymentPayload\"]>[0];\n\ninterface CachedEntry {\n paymentRequired: PaymentRequired;\n cachedAt: number;\n}\n\nconst DEFAULT_TTL_MS = 3_600_000; // 1 hour\n\ntype FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise;\n\nexport function createPayFetchWithPreAuth(\n baseFetch: FetchFn,\n client: x402Client,\n ttlMs = DEFAULT_TTL_MS,\n options?: { skipPreAuth?: boolean },\n): FetchFn {\n const httpClient = new x402HTTPClient(client);\n const cache = new Map();\n\n return async (input: RequestInfo | URL, init?: RequestInit): Promise => {\n const request = new Request(input, init);\n const urlPath = new URL(request.url).pathname;\n\n // Extract model from request body to create model-specific cache keys.\n // Without this, a cached payment from a paid model (e.g. sonnet) would be\n // incorrectly applied to a free model (nvidia/gpt-oss-120b), causing\n // payment errors even when the server wouldn't charge for the request.\n let requestModel = \"\";\n if (init?.body) {\n try {\n const bodyStr =\n init.body instanceof Uint8Array\n ? new TextDecoder().decode(init.body)\n : typeof init.body === \"string\"\n ? init.body\n : \"\";\n if (bodyStr) {\n const parsed = JSON.parse(bodyStr) as { model?: string };\n requestModel = parsed.model ?? \"\";\n }\n } catch {\n /* not JSON, use empty model */\n }\n }\n const cacheKey = `${urlPath}:${requestModel}`;\n\n // Try pre-auth if we have cached payment requirements\n // Skip for Solana: payments use per-tx blockhashes that expire ~60-90s,\n // making cached requirements useless and causing double charges.\n const cached = !options?.skipPreAuth ? cache.get(cacheKey) : undefined;\n if (cached && Date.now() - cached.cachedAt < ttlMs) {\n try {\n const payload = await client.createPaymentPayload(cached.paymentRequired);\n const headers = httpClient.encodePaymentSignatureHeader(payload);\n const preAuthRequest = request.clone();\n for (const [key, value] of Object.entries(headers)) {\n preAuthRequest.headers.set(key, value);\n }\n const response = await baseFetch(preAuthRequest);\n if (response.status !== 402) {\n return response; // Pre-auth worked — saved ~200ms\n }\n // Pre-auth rejected (params may have changed) — invalidate and fall through\n cache.delete(cacheKey);\n } catch {\n // Pre-auth signing failed — invalidate and fall through\n cache.delete(cacheKey);\n }\n }\n\n // Normal flow: make request, handle 402 if needed\n const clonedRequest = request.clone();\n const response = await baseFetch(request);\n if (response.status !== 402) {\n return response;\n }\n\n // Parse 402 response and cache for future pre-auth\n let paymentRequired: PaymentRequired;\n try {\n const getHeader = (name: string) => response.headers.get(name);\n let body: unknown;\n try {\n const responseText = await Promise.race([\n response.text(),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error(\"Body read timeout\")), 30_000),\n ),\n ]);\n if (responseText) body = JSON.parse(responseText);\n } catch {\n /* empty body is fine */\n }\n paymentRequired = httpClient.getPaymentRequiredResponse(getHeader, body);\n cache.set(cacheKey, { paymentRequired, cachedAt: Date.now() });\n } catch (error) {\n throw new Error(\n `Failed to parse payment requirements: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n { cause: error },\n );\n }\n\n // Sign payment and retry\n const payload = await client.createPaymentPayload(paymentRequired);\n const paymentHeaders = httpClient.encodePaymentSignatureHeader(payload);\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n return baseFetch(clonedRequest);\n };\n}\n","// EIP-3009 TransferWithAuthorization types for EIP-712 signing\nexport const authorizationTypes = {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n} as const;\n\n/**\n * Permit2 EIP-712 types for signing PermitWitnessTransferFrom (exact scheme).\n * Must match the exact format expected by the Permit2 contract.\n * Note: Types must be in ALPHABETICAL order after the primary type (TokenPermissions < Witness).\n */\nexport const permit2WitnessTypes = {\n PermitWitnessTransferFrom: [\n { name: \"permitted\", type: \"TokenPermissions\" },\n { name: \"spender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"witness\", type: \"Witness\" },\n ],\n TokenPermissions: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n Witness: [\n { name: \"to\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Permit2 EIP-712 types for signing PermitWitnessTransferFrom (upto scheme).\n * The upto witness includes a `facilitator` field that the exact witness does not.\n * This ensures only the authorized facilitator can settle the payment.\n * Must match: Witness(address to,address facilitator,uint256 validAfter)\n */\nexport const uptoPermit2WitnessTypes = {\n PermitWitnessTransferFrom: [\n { name: \"permitted\", type: \"TokenPermissions\" },\n { name: \"spender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"witness\", type: \"Witness\" },\n ],\n TokenPermissions: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n Witness: [\n { name: \"to\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n} as const;\n\n// EIP3009 ABI for transferWithAuthorization function\nexport const eip3009ABI = [\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"v\", type: \"uint8\" },\n { name: \"r\", type: \"bytes32\" },\n { name: \"s\", type: \"bytes32\" },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"version\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"authorizer\", type: \"address\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n name: \"authorizationState\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/**\n * EIP-2612 Permit EIP-712 types for signing token.permit().\n */\nexport const eip2612PermitTypes = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * EIP-2612 nonces ABI for querying current nonce.\n */\nexport const eip2612NoncesAbi = [\n {\n type: \"function\",\n name: \"nonces\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/** ERC-20 approve(address,uint256) ABI for encoding/decoding approval calldata. */\nexport const erc20ApproveAbi = [\n {\n type: \"function\",\n name: \"approve\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/** ERC-20 allowance(address,address) ABI for checking spender approval. */\nexport const erc20AllowanceAbi = [\n {\n type: \"function\",\n name: \"allowance\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/** Gas limit for a standard ERC-20 approve() transaction. */\nexport const ERC20_APPROVE_GAS_LIMIT = 70_000n;\n\n/** Fallback max fee per gas (1 gwei) when fee estimation fails. */\nexport const DEFAULT_MAX_FEE_PER_GAS = 1_000_000_000n;\n\n/** Fallback max priority fee per gas (0.1 gwei) when fee estimation fails. */\nexport const DEFAULT_MAX_PRIORITY_FEE_PER_GAS = 100_000_000n;\n\n/**\n * Canonical Permit2 contract address.\n * Same address on all EVM chains via CREATE2 deployment.\n *\n * @see https://github.com/Uniswap/permit2\n */\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n/**\n * x402ExactPermit2Proxy contract address.\n * Vanity address: 0x4020...0001 for easy recognition.\n * This address is deterministic based on:\n * - Arachnid's deterministic deployer (0x4e59b44847b379578588920cA78FbF26c0B4956C)\n * - Vanity-mined salt for prefix 0x4020 and suffix 0001\n * - Contract bytecode + constructor args (PERMIT2_ADDRESS)\n */\nexport const x402ExactPermit2ProxyAddress = \"0x402085c248EeA27D92E8b30b2C58ed07f9E20001\" as const;\n\n/**\n * x402UptoPermit2Proxy contract address.\n * Vanity address: 0x4020...0002 for easy recognition.\n * This address is deterministic based on:\n * - Arachnid's deterministic deployer (0x4e59b44847b379578588920cA78FbF26c0B4956C)\n * - Vanity-mined salt for prefix 0x4020 and suffix 0002\n * - Contract bytecode + constructor args (PERMIT2_ADDRESS)\n */\nexport const x402UptoPermit2ProxyAddress = \"0x4020A4f3b7b90ccA423B9fabCc0CE57C6C240002\" as const;\n\n/**\n * ABI components for the exact Permit2 witness tuple: Witness(address to, uint256 validAfter).\n */\nconst permit2WitnessABIComponents = [\n { name: \"to\", type: \"address\", internalType: \"address\" },\n { name: \"validAfter\", type: \"uint256\", internalType: \"uint256\" },\n] as const;\n\n/**\n * ABI components for the upto Permit2 witness tuple:\n * Witness(address to, address facilitator, uint256 validAfter).\n */\nconst uptoPermit2WitnessABIComponents = [\n { name: \"to\", type: \"address\", internalType: \"address\" },\n { name: \"facilitator\", type: \"address\", internalType: \"address\" },\n { name: \"validAfter\", type: \"uint256\", internalType: \"uint256\" },\n] as const;\n\n/**\n * x402UptoPermit2Proxy ABI — settle/settleWithPermit for the upto payment scheme.\n * Key differences from exact: settle() takes a `uint256 amount` parameter, and the\n * Witness struct includes an `address facilitator` field.\n */\nexport const x402UptoPermit2ProxyABI = [\n {\n type: \"function\",\n name: \"PERMIT2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\", internalType: \"contract ISignatureTransfer\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPEHASH\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bytes32\", internalType: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPE_STRING\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"settle\",\n inputs: [\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.Witness\",\n components: uptoPermit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"settleWithPermit\",\n inputs: [\n {\n name: \"permit2612\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.EIP2612Permit\",\n components: [\n { name: \"value\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"r\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"s\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"v\", type: \"uint8\", internalType: \"uint8\" },\n ],\n },\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.Witness\",\n components: uptoPermit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n { type: \"event\", name: \"Settled\", inputs: [], anonymous: false },\n { type: \"event\", name: \"SettledWithPermit\", inputs: [], anonymous: false },\n { type: \"error\", name: \"AmountExceedsPermitted\", inputs: [] },\n { type: \"error\", name: \"InvalidDestination\", inputs: [] },\n { type: \"error\", name: \"InvalidOwner\", inputs: [] },\n { type: \"error\", name: \"InvalidPermit2Address\", inputs: [] },\n { type: \"error\", name: \"PaymentTooEarly\", inputs: [] },\n { type: \"error\", name: \"Permit2612AmountMismatch\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n { type: \"error\", name: \"UnauthorizedFacilitator\", inputs: [] },\n] as const;\n\n/**\n * x402ExactPermit2Proxy ABI - settle function for exact payment scheme.\n */\nexport const x402ExactPermit2ProxyABI = [\n {\n type: \"function\",\n name: \"PERMIT2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\", internalType: \"contract ISignatureTransfer\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPEHASH\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bytes32\", internalType: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPE_STRING\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"settle\",\n inputs: [\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"settleWithPermit\",\n inputs: [\n {\n name: \"permit2612\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.EIP2612Permit\",\n components: [\n { name: \"value\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"r\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"s\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"v\", type: \"uint8\", internalType: \"uint8\" },\n ],\n },\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n { type: \"event\", name: \"Settled\", inputs: [], anonymous: false },\n { type: \"event\", name: \"SettledWithPermit\", inputs: [], anonymous: false },\n { type: \"error\", name: \"InvalidAmount\", inputs: [] },\n { type: \"error\", name: \"InvalidDestination\", inputs: [] },\n { type: \"error\", name: \"InvalidOwner\", inputs: [] },\n { type: \"error\", name: \"InvalidPermit2Address\", inputs: [] },\n { type: \"error\", name: \"PaymentTooEarly\", inputs: [] },\n { type: \"error\", name: \"Permit2612AmountMismatch\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n] as const;\n","import { toHex } from \"viem\";\n\n/**\n * Extract chain ID from a CAIP-2 network identifier (eip155:CHAIN_ID).\n *\n * @param network - The network identifier in CAIP-2 format (e.g., \"eip155:8453\")\n * @returns The numeric chain ID\n * @throws Error if the network format is invalid\n */\nexport function getEvmChainId(network: string): number {\n if (network.startsWith(\"eip155:\")) {\n const idStr = network.split(\":\")[1];\n const chainId = parseInt(idStr, 10);\n if (isNaN(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${network}`);\n }\n return chainId;\n }\n\n throw new Error(`Unsupported network format: ${network} (expected eip155:CHAIN_ID)`);\n}\n\n/**\n * Get the crypto object from the global scope.\n *\n * @returns The crypto object\n * @throws Error if crypto API is not available\n */\nfunction getCrypto(): Crypto {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (!cryptoObj) {\n throw new Error(\"Crypto API not available\");\n }\n return cryptoObj;\n}\n\n/**\n * Create a random 32-byte nonce for EIP-3009 authorization.\n *\n * @returns A hex-encoded 32-byte nonce\n */\nexport function createNonce(): `0x${string}` {\n return toHex(getCrypto().getRandomValues(new Uint8Array(32)));\n}\n\n/**\n * Creates a random 256-bit nonce for Permit2.\n * Permit2 uses uint256 nonces (not bytes32 like EIP-3009).\n *\n * @returns A string representation of the random nonce\n */\nexport function createPermit2Nonce(): string {\n const randomBytes = getCrypto().getRandomValues(new Uint8Array(32));\n return BigInt(toHex(randomBytes)).toString();\n}\n","/**\n * Named error reason constants for the exact EVM facilitator.\n *\n * These strings must be character-for-character identical to the Go constants in\n * go/mechanisms/evm/exact/facilitator/errors.go to maintain cross-SDK parity.\n */\n\nexport const ErrInvalidScheme = \"invalid_exact_evm_scheme\";\nexport const ErrNetworkMismatch = \"invalid_exact_evm_network_mismatch\";\nexport const ErrMissingEip712Domain = \"invalid_exact_evm_missing_eip712_domain\";\nexport const ErrRecipientMismatch = \"invalid_exact_evm_recipient_mismatch\";\nexport const ErrInvalidSignature = \"invalid_exact_evm_signature\";\nexport const ErrValidBeforeExpired = \"invalid_exact_evm_payload_authorization_valid_before\";\nexport const ErrValidAfterInFuture = \"invalid_exact_evm_payload_authorization_valid_after\";\nexport const ErrInvalidAuthorizationValue = \"invalid_exact_evm_authorization_value\";\nexport const ErrUndeployedSmartWallet = \"invalid_exact_evm_payload_undeployed_smart_wallet\";\nexport const ErrTransactionFailed = \"invalid_exact_evm_transaction_failed\";\n\n// EIP-3009 verify errors\nexport const ErrEip3009TokenNameMismatch = \"invalid_exact_evm_token_name_mismatch\";\nexport const ErrEip3009TokenVersionMismatch = \"invalid_exact_evm_token_version_mismatch\";\nexport const ErrEip3009NotSupported = \"invalid_exact_evm_eip3009_not_supported\";\nexport const ErrEip3009NonceAlreadyUsed = \"invalid_exact_evm_nonce_already_used\";\nexport const ErrEip3009InsufficientBalance = \"invalid_exact_evm_insufficient_balance\";\nexport const ErrEip3009SimulationFailed = \"invalid_exact_evm_transaction_simulation_failed\";\n\n// Permit2 verify errors\nexport const ErrPermit2InvalidSpender = \"invalid_permit2_spender\";\nexport const ErrPermit2RecipientMismatch = \"invalid_permit2_recipient_mismatch\";\nexport const ErrPermit2DeadlineExpired = \"permit2_deadline_expired\";\nexport const ErrPermit2NotYetValid = \"permit2_not_yet_valid\";\nexport const ErrPermit2AmountMismatch = \"permit2_amount_mismatch\";\nexport const ErrPermit2TokenMismatch = \"permit2_token_mismatch\";\nexport const ErrPermit2InvalidSignature = \"invalid_permit2_signature\";\nexport const ErrPermit2AllowanceRequired = \"permit2_allowance_required\";\nexport const ErrPermit2SimulationFailed = \"permit2_simulation_failed\";\nexport const ErrPermit2InsufficientBalance = \"permit2_insufficient_balance\";\nexport const ErrPermit2ProxyNotDeployed = \"permit2_proxy_not_deployed\";\n\n// Permit2 settle errors (from contract reverts)\nexport const ErrPermit2InvalidAmount = \"permit2_invalid_amount\";\nexport const ErrPermit2InvalidDestination = \"permit2_invalid_destination\";\nexport const ErrPermit2InvalidOwner = \"permit2_invalid_owner\";\nexport const ErrPermit2PaymentTooEarly = \"permit2_payment_too_early\";\nexport const ErrPermit2InvalidNonce = \"permit2_invalid_nonce\";\nexport const ErrPermit2612AmountMismatch = \"permit2_2612_amount_mismatch\";\n\n// ERC-20 approval gas sponsoring verify errors\nexport const ErrErc20ApprovalInvalidFormat = \"invalid_erc20_approval_extension_format\";\nexport const ErrErc20ApprovalFromMismatch = \"erc20_approval_from_mismatch\";\nexport const ErrErc20ApprovalAssetMismatch = \"erc20_approval_asset_mismatch\";\nexport const ErrErc20ApprovalSpenderNotPermit2 = \"erc20_approval_spender_not_permit2\";\nexport const ErrErc20ApprovalTxWrongTarget = \"erc20_approval_tx_wrong_target\";\nexport const ErrErc20ApprovalTxWrongSelector = \"erc20_approval_tx_wrong_selector\";\nexport const ErrErc20ApprovalTxWrongSpender = \"erc20_approval_tx_wrong_spender\";\nexport const ErrErc20ApprovalTxInvalidCalldata = \"erc20_approval_tx_invalid_calldata\";\nexport const ErrErc20ApprovalTxSignerMismatch = \"erc20_approval_tx_signer_mismatch\";\nexport const ErrErc20ApprovalTxInvalidSignature = \"erc20_approval_tx_invalid_signature\";\nexport const ErrErc20ApprovalTxParseFailed = \"erc20_approval_tx_parse_failed\";\nexport const ErrErc20ApprovalTxFailed = \"erc20_approval_tx_failed\";\n\n// EIP-2612 gas sponsoring verify errors\nexport const ErrInvalidEip2612ExtensionFormat = \"invalid_eip2612_extension_format\";\nexport const ErrEip2612FromMismatch = \"eip2612_from_mismatch\";\nexport const ErrEip2612AssetMismatch = \"eip2612_asset_mismatch\";\nexport const ErrEip2612SpenderNotPermit2 = \"eip2612_spender_not_permit2\";\nexport const ErrEip2612DeadlineExpired = \"eip2612_deadline_expired\";\n\n// Shared settle errors\nexport const ErrUnsupportedPayloadType = \"unsupported_payload_type\";\nexport const ErrInvalidTransactionState = \"invalid_transaction_state\";\n","import { encodeFunctionData, decodeFunctionResult } from \"viem\";\n\n/**\n * Multicall3 contract address.\n * Same address on all EVM chains via CREATE2 deployment.\n *\n * @see https://github.com/mds1/multicall\n */\nexport const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\" as const;\n\n/** Multicall3 getEthBalance ABI for querying native token balance. */\nexport const multicall3GetEthBalanceAbi = [\n {\n name: \"getEthBalance\",\n inputs: [{ name: \"addr\", type: \"address\" }],\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/** Multicall3 tryAggregate ABI for batching calls. */\nconst multicall3ABI = [\n {\n inputs: [\n { name: \"requireSuccess\", type: \"bool\" },\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"callData\", type: \"bytes\" },\n ],\n },\n ],\n name: \"tryAggregate\",\n outputs: [\n {\n name: \"returnData\",\n type: \"tuple[]\",\n components: [\n { name: \"success\", type: \"bool\" },\n { name: \"returnData\", type: \"bytes\" },\n ],\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\nexport type ContractCall = {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n};\n\nexport type RawContractCall = {\n address: `0x${string}`;\n callData: `0x${string}`;\n};\n\nexport type MulticallSuccess = { status: \"success\"; result: unknown };\nexport type MulticallFailure = { status: \"failure\"; error: Error };\nexport type MulticallResult = MulticallSuccess | MulticallFailure;\n\n/**\n * Batches contract calls via Multicall3 `tryAggregate(false, ...)`.\n *\n * Accepts a mix of typed ContractCall (ABI-encoded + decoded) and\n * RawContractCall (pre-encoded calldata, no decoding) entries.\n * Raw calls are useful for the EIP-6492 factory deployment case\n * where calldata is pre-encoded with no ABI available.\n */\ntype ReadContractFn = (args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n}) => Promise;\n\n/**\n * Executes multiple contract read calls in a single RPC round-trip using Multicall3.\n *\n * @param readContract - Function that performs a single contract read (e.g. viem readContract)\n * @param calls - Array of contract calls to batch (ContractCall or RawContractCall)\n * @returns A promise that resolves to an array of decoded results, one per call\n */\nexport async function multicall(\n readContract: ReadContractFn,\n calls: ReadonlyArray,\n): Promise {\n const aggregateCalls = calls.map(call => {\n if (\"callData\" in call) {\n return { target: call.address, callData: call.callData };\n }\n const callData = encodeFunctionData({\n abi: call.abi,\n functionName: call.functionName,\n args: call.args as unknown[],\n });\n return { target: call.address, callData };\n });\n\n const rawResults = (await readContract({\n address: MULTICALL3_ADDRESS,\n abi: multicall3ABI,\n functionName: \"tryAggregate\",\n args: [false, aggregateCalls],\n })) as { success: boolean; returnData: `0x${string}` }[];\n\n return rawResults.map((raw, i) => {\n if (!raw.success) {\n return {\n status: \"failure\" as const,\n error: new Error(`multicall: call reverted (returnData: ${raw.returnData})`),\n };\n }\n\n const call = calls[i];\n if (\"callData\" in call) {\n return { status: \"success\" as const, result: undefined };\n }\n\n try {\n const decoded = decodeFunctionResult({\n abi: call.abi,\n functionName: call.functionName,\n data: raw.returnData,\n });\n return { status: \"success\" as const, result: decoded };\n } catch (err) {\n return {\n status: \"failure\" as const,\n error: err instanceof Error ? err : new Error(String(err)),\n };\n }\n });\n}\n","import {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { ClientEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { createNonce } from \"../../../utils\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\n\n/**\n * EVM client implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClientV1 instance.\n *\n * @param signer - The EVM signer for client operations\n */\n constructor(private readonly signer: ClientEvmSigner) {}\n\n /**\n * Creates a payment payload for the Exact scheme (V1).\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<\n Pick & { scheme: string; network: Network }\n > {\n const selectedV1 = paymentRequirements as unknown as PaymentRequirementsV1;\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEvmPayloadV1[\"authorization\"] = {\n from: this.signer.address,\n to: getAddress(selectedV1.payTo),\n value: selectedV1.maxAmountRequired,\n validAfter: (now - 600).toString(), // 10 minutes before\n validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n // Sign the authorization\n const signature = await this.signAuthorization(authorization, selectedV1);\n\n const payload: ExactEvmPayloadV1 = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n scheme: selectedV1.scheme,\n network: selectedV1.network,\n payload,\n };\n }\n\n /**\n * Sign the EIP-3009 authorization using EIP-712\n *\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\n private async signAuthorization(\n authorization: ExactEvmPayloadV1[\"authorization\"],\n requirements: PaymentRequirementsV1,\n ): Promise<`0x${string}`> {\n const chainId = getEvmChainIdV1(requirements.network as EvmNetworkV1);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await this.signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n }\n}\n","import {\n PaymentPayload,\n PaymentPayloadV1,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@x402/core/types\";\nimport { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport { getAddress, Hex, isAddressEqual, parseErc6492Signature } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { FacilitatorEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\nimport * as Errors from \"../../facilitator/errors\";\nimport {\n diagnoseEip3009SimulationFailure,\n executeTransferWithAuthorization,\n simulateEip3009Transfer,\n} from \"../../facilitator/eip3009-utils\";\n\nexport interface VerifyV1Options {\n /** Run onchain simulation. Defaults to true. */\n simulate?: boolean;\n}\n\nexport interface ExactEvmSchemeV1Config {\n /**\n * If enabled, the facilitator will deploy ERC-4337 smart wallets\n * via EIP-6492 when encountering undeployed contract signatures.\n *\n * @default false\n */\n deployERC4337WithEIP6492?: boolean;\n /**\n * If enabled, simulates transaction before settling. Defaults to false, ie only simulate during verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * EVM facilitator implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkFacilitator {\n readonly scheme = \"exact\";\n readonly caipFamily = \"eip155:*\";\n private readonly config: Required;\n\n /**\n * Creates a new ExactEvmFacilitatorV1 instance.\n *\n * @param signer - The EVM signer for facilitator operations\n * @param config - Optional configuration for the facilitator\n */\n constructor(\n private readonly signer: FacilitatorEvmSigner,\n config?: ExactEvmSchemeV1Config,\n ) {\n this.config = {\n deployERC4337WithEIP6492: config?.deployERC4337WithEIP6492 ?? false,\n simulateInSettle: config?.simulateInSettle ?? false,\n };\n }\n\n /**\n * Get mechanism-specific extra data for the supported kinds endpoint.\n * For EVM, no extra data is needed.\n *\n * @param _ - The network identifier (unused for EVM)\n * @returns undefined (EVM has no extra data)\n */\n getExtra(_: string): Record | undefined {\n return undefined;\n }\n\n /**\n * Get signer addresses used by this facilitator.\n * Returns all addresses this facilitator can use for signing/settling transactions.\n *\n * @param _ - The network identifier (unused for EVM, addresses are network-agnostic)\n * @returns Array of facilitator wallet addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verifies a payment payload (V1).\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Promise resolving to verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise {\n return this._verify(payload, requirements);\n }\n\n /**\n * Settles a payment by executing the transfer (V1).\n *\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @returns Promise resolving to settlement response\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise {\n const payloadV1 = payload as unknown as PaymentPayloadV1;\n const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n\n // Re-verify before settling\n const valid = await this._verify(payload, requirements, {\n simulate: this.config.simulateInSettle ?? false,\n });\n if (!valid.isValid) {\n return {\n success: false,\n network: payloadV1.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n payer: exactEvmPayload.authorization.from,\n };\n }\n\n try {\n // Parse ERC-6492 signature if applicable (for optional deployment)\n const { address: factoryAddress, data: factoryCalldata } = parseErc6492Signature(\n exactEvmPayload.signature!,\n );\n\n // Deploy ERC-4337 smart wallet via EIP-6492 if configured and needed\n if (\n this.config.deployERC4337WithEIP6492 &&\n factoryAddress &&\n factoryCalldata &&\n !isAddressEqual(factoryAddress, \"0x0000000000000000000000000000000000000000\")\n ) {\n // Check if smart wallet is already deployed\n const payerAddress = exactEvmPayload.authorization.from;\n const bytecode = await this.signer.getCode({ address: payerAddress });\n\n if (!bytecode || bytecode === \"0x\") {\n // Send the factory calldata directly as a transaction\n // The factoryCalldata already contains the complete encoded function call\n const deployTx = await this.signer.sendTransaction({\n to: factoryAddress as Hex,\n data: factoryCalldata as Hex,\n });\n\n // Wait for deployment transaction\n await this.signer.waitForTransactionReceipt({ hash: deployTx });\n }\n }\n\n const tx = await executeTransferWithAuthorization(\n this.signer,\n getAddress(requirements.asset),\n exactEvmPayload,\n );\n\n // Wait for transaction confirmation\n const receipt = await this.signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: Errors.ErrTransactionFailed,\n transaction: tx,\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n } catch (error) {\n return {\n success: false,\n errorReason: error instanceof Error ? error.message : Errors.ErrTransactionFailed,\n transaction: \"\",\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n }\n }\n\n /**\n * Internal verify with optional simulation control.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param options - Verification options (e.g. simulate)\n * @returns Promise resolving to verification response\n */\n private async _verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n options?: VerifyV1Options,\n ): Promise {\n const requirementsV1 = requirements as unknown as PaymentRequirementsV1;\n const payloadV1 = payload as unknown as PaymentPayloadV1;\n const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n const payer = exactEvmPayload.authorization.from;\n let eip6492Deployment:\n | { factoryAddress: `0x${string}`; factoryCalldata: `0x${string}` }\n | undefined;\n\n // Verify scheme matches\n if (payloadV1.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n // Get chain configuration\n let chainId: number;\n try {\n chainId = getEvmChainIdV1(payloadV1.network as EvmNetworkV1);\n } catch {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n return {\n isValid: false,\n invalidReason: Errors.ErrMissingEip712Domain,\n payer,\n };\n }\n\n const { name, version } = requirements.extra;\n const erc20Address = getAddress(requirements.asset);\n\n // Verify network matches\n if (payloadV1.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n // Build typed data for signature verification\n const permitTypedData = {\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\" as const,\n domain: {\n name,\n version,\n chainId,\n verifyingContract: erc20Address,\n },\n message: {\n from: exactEvmPayload.authorization.from,\n to: exactEvmPayload.authorization.to,\n value: BigInt(exactEvmPayload.authorization.value),\n validAfter: BigInt(exactEvmPayload.authorization.validAfter),\n validBefore: BigInt(exactEvmPayload.authorization.validBefore),\n nonce: exactEvmPayload.authorization.nonce,\n },\n };\n\n // Verify signature (flatten EIP-6492 handling out of catch block)\n let isValid = false;\n try {\n isValid = await this.signer.verifyTypedData({\n address: payer,\n ...permitTypedData,\n signature: exactEvmPayload.signature!,\n });\n } catch {\n isValid = false;\n }\n\n const signature = exactEvmPayload.signature!;\n const sigLen = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n\n // Extract EIP-6492 deployment info (factory address + calldata) if present\n const erc6492Data = parseErc6492Signature(signature);\n const hasDeploymentInfo =\n erc6492Data.address &&\n erc6492Data.data &&\n !isAddressEqual(erc6492Data.address, \"0x0000000000000000000000000000000000000000\");\n\n if (hasDeploymentInfo) {\n eip6492Deployment = {\n factoryAddress: erc6492Data.address!,\n factoryCalldata: erc6492Data.data!,\n };\n }\n\n if (!isValid) {\n const isSmartWallet = sigLen > 130; // 65 bytes = 130 hex chars for EOA\n\n if (!isSmartWallet) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidSignature,\n payer,\n };\n }\n\n const bytecode = await this.signer.getCode({ address: payer });\n const isDeployed = bytecode && bytecode !== \"0x\";\n\n if (!isDeployed && !hasDeploymentInfo) {\n return {\n isValid: false,\n invalidReason: Errors.ErrUndeployedSmartWallet,\n payer,\n };\n }\n }\n\n // Verify payment recipient matches\n if (getAddress(exactEvmPayload.authorization.to) !== getAddress(requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrRecipientMismatch,\n payer,\n };\n }\n\n // Verify validBefore is in the future (with 6 second buffer for block time)\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(exactEvmPayload.authorization.validBefore) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidBeforeExpired,\n payer,\n };\n }\n\n // Verify validAfter is not in the future\n if (BigInt(exactEvmPayload.authorization.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidAfterInFuture,\n payer,\n };\n }\n\n // Verify amount exactly matches requirements\n if (BigInt(exactEvmPayload.authorization.value) !== BigInt(requirementsV1.maxAmountRequired)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidAuthorizationValue,\n payer,\n };\n }\n\n // Transaction simulation\n if (options?.simulate !== false) {\n const simulationSucceeded = await simulateEip3009Transfer(\n this.signer,\n erc20Address,\n exactEvmPayload,\n eip6492Deployment,\n );\n if (!simulationSucceeded) {\n return diagnoseEip3009SimulationFailure(\n this.signer,\n erc20Address,\n exactEvmPayload,\n requirements,\n requirementsV1.maxAmountRequired,\n );\n }\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer,\n };\n }\n}\n","import { PaymentRequirements, VerifyResponse } from \"@x402/core/types\";\nimport { encodeFunctionData, getAddress, Hex, parseErc6492Signature, parseSignature } from \"viem\";\nimport { eip3009ABI } from \"../../constants\";\nimport { multicall, ContractCall, RawContractCall } from \"../../multicall\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport * as Errors from \"./errors\";\n\nexport interface Eip6492Deployment {\n factoryAddress: `0x${string}`;\n factoryCalldata: `0x${string}`;\n}\n\n/**\n * Simulates transferWithAuthorization via eth_call.\n * Returns true if simulation succeeded, false if it failed.\n *\n * @param signer - EVM signer for contract reads\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n * @param eip6492Deployment - Optional EIP-6492 factory info for undeployed smart wallets\n *\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulateEip3009Transfer(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n eip6492Deployment?: Eip6492Deployment,\n): Promise {\n const auth = payload.authorization;\n const transferArgs = [\n getAddress(auth.from),\n getAddress(auth.to),\n BigInt(auth.value),\n BigInt(auth.validAfter),\n BigInt(auth.validBefore),\n auth.nonce,\n ] as const;\n\n if (eip6492Deployment) {\n const { signature: innerSignature } = parseErc6492Signature(payload.signature!);\n const transferCalldata = encodeFunctionData({\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...transferArgs, innerSignature],\n });\n\n try {\n const results = await multicall(signer.readContract.bind(signer), [\n {\n address: getAddress(eip6492Deployment.factoryAddress),\n callData: eip6492Deployment.factoryCalldata,\n } satisfies RawContractCall,\n {\n address: erc20Address,\n callData: transferCalldata,\n } satisfies RawContractCall,\n ]);\n\n return results[1]?.status === \"success\";\n } catch {\n return false;\n }\n }\n\n const sig = payload.signature!;\n const sigLength = sig.startsWith(\"0x\") ? sig.length - 2 : sig.length;\n const isECDSA = sigLength === 130;\n\n try {\n if (isECDSA) {\n const parsedSig = parseSignature(sig);\n await signer.readContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [\n ...transferArgs,\n (parsedSig.v as number | undefined) ?? parsedSig.yParity,\n parsedSig.r,\n parsedSig.s,\n ],\n });\n } else {\n await signer.readContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...transferArgs, sig],\n });\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * After simulation fails, runs a single diagnostic multicall to determine the most specific error reason.\n * Checks balanceOf, name, version and authorizationState in one RPC round-trip.\n *\n * @param signer - EVM signer used for the payment\n * @param erc20Address - Address of the ERC-20 token contract\n * @param payload - The EIP-3009 transfer authorization payload\n * @param requirements - Payment requirements to validate against\n * @param amountRequired - Required amount for the payment (balance check)\n *\n * @returns Promise resolving to the verification result with validity and optional invalid reason\n */\nexport async function diagnoseEip3009SimulationFailure(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n requirements: PaymentRequirements,\n amountRequired: string,\n): Promise {\n const payer = payload.authorization.from;\n\n const diagnosticCalls: ContractCall[] = [\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payload.authorization.from],\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"name\",\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"version\",\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"authorizationState\",\n args: [payload.authorization.from, payload.authorization.nonce],\n },\n ];\n\n try {\n const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n const [balanceResult, nameResult, versionResult, authStateResult] = results;\n\n if (authStateResult.status === \"failure\") {\n return { isValid: false, invalidReason: Errors.ErrEip3009NotSupported, payer };\n }\n\n if (authStateResult.status === \"success\" && authStateResult.result === true) {\n return { isValid: false, invalidReason: Errors.ErrEip3009NonceAlreadyUsed, payer };\n }\n\n if (\n nameResult.status === \"success\" &&\n requirements.extra?.name &&\n nameResult.result !== requirements.extra.name\n ) {\n return { isValid: false, invalidReason: Errors.ErrEip3009TokenNameMismatch, payer };\n }\n\n if (\n versionResult.status === \"success\" &&\n requirements.extra?.version &&\n versionResult.result !== requirements.extra.version\n ) {\n return { isValid: false, invalidReason: Errors.ErrEip3009TokenVersionMismatch, payer };\n }\n\n if (balanceResult.status === \"success\") {\n const balance = balanceResult.result as bigint;\n if (balance < BigInt(amountRequired)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrEip3009InsufficientBalance,\n payer,\n };\n }\n }\n } catch {\n // Diagnostic multicall failed — fall through to generic error\n }\n\n return { isValid: false, invalidReason: Errors.ErrEip3009SimulationFailed, payer };\n}\n\n/**\n * Executes transferWithAuthorization onchain.\n *\n * @param signer - EVM signer for contract writes\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n *\n * @returns Transaction hash\n */\nexport async function executeTransferWithAuthorization(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n): Promise {\n const { signature } = parseErc6492Signature(payload.signature!);\n const signatureLength = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n const isECDSA = signatureLength === 130;\n\n const auth = payload.authorization;\n const baseArgs = [\n getAddress(auth.from),\n getAddress(auth.to),\n BigInt(auth.value),\n BigInt(auth.validAfter),\n BigInt(auth.validBefore),\n auth.nonce,\n ] as const;\n\n if (isECDSA) {\n const parsedSig = parseSignature(signature);\n return signer.writeContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [\n ...baseArgs,\n (parsedSig.v as number | undefined) || parsedSig.yParity,\n parsedSig.r,\n parsedSig.s,\n ],\n });\n }\n\n return signer.writeContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...baseArgs, signature],\n });\n}\n","export { ExactEvmSchemeV1 } from \"../exact/v1\";\n\nexport const EVM_NETWORK_CHAIN_ID_MAP = {\n ethereum: 1,\n sepolia: 11155111,\n abstract: 2741,\n \"abstract-testnet\": 11124,\n \"base-sepolia\": 84532,\n base: 8453,\n \"avalanche-fuji\": 43113,\n avalanche: 43114,\n iotex: 4689,\n sei: 1329,\n \"sei-testnet\": 1328,\n polygon: 137,\n \"polygon-amoy\": 80002,\n peaq: 3338,\n story: 1514,\n educhain: 41923,\n \"skale-base-sepolia\": 324705682,\n megaeth: 4326,\n monad: 143,\n stable: 988,\n \"stable-testnet\": 2201,\n} as const;\n\nexport type EvmNetworkV1 = keyof typeof EVM_NETWORK_CHAIN_ID_MAP;\n\nexport const NETWORKS: string[] = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);\n\n/**\n * Extract chain ID from a v1 legacy network name.\n *\n * @param network - The v1 network name (e.g., \"base-sepolia\", \"polygon\")\n * @returns The numeric chain ID\n * @throws Error if the network name is not a known v1 network\n */\nexport function getEvmChainIdV1(network: string): number {\n const chainId = EVM_NETWORK_CHAIN_ID_MAP[network as EvmNetworkV1];\n if (!chainId) {\n throw new Error(`Unsupported v1 network: ${network}`);\n }\n return chainId;\n}\n","import type { PaymentPayload } from \"@x402/core/types\";\nimport type { FacilitatorEvmSigner } from \"../signer\";\n\nexport const EIP2612_GAS_SPONSORING_KEY = \"eip2612GasSponsoring\" as const;\nexport const ERC20_APPROVAL_GAS_SPONSORING_KEY = \"erc20ApprovalGasSponsoring\" as const;\nexport const ERC20_APPROVAL_GAS_SPONSORING_VERSION = \"1\" as const;\n\nexport interface Eip2612GasSponsoringInfo {\n [key: string]: unknown;\n from: string;\n asset: string;\n spender: string;\n amount: string;\n nonce: string;\n deadline: string;\n signature: string;\n version: string;\n}\n\nexport interface Erc20ApprovalGasSponsoringInfo {\n [key: string]: unknown;\n from: `0x${string}`;\n asset: `0x${string}`;\n spender: `0x${string}`;\n amount: string;\n signedTransaction: `0x${string}`;\n version: string;\n}\n\n/**\n * A single transaction to be executed by the signer.\n * - `0x${string}`: a pre-signed serialized transaction (broadcast as-is via sendRawTransaction)\n * - `{ to, data, gas? }`: an unsigned call intent (signer signs and broadcasts)\n */\nexport type TransactionRequest =\n | `0x${string}`\n | { to: `0x${string}`; data: `0x${string}`; gas?: bigint };\n\nexport type Erc20ApprovalGasSponsoringSigner = FacilitatorEvmSigner & {\n sendTransactions(transactions: TransactionRequest[]): Promise<`0x${string}`[]>;\n simulateTransactions?(transactions: TransactionRequest[]): Promise;\n};\n\nexport interface Erc20ApprovalGasSponsoringFacilitatorExtension {\n key: typeof ERC20_APPROVAL_GAS_SPONSORING_KEY;\n signer?: Erc20ApprovalGasSponsoringSigner;\n signerForNetwork?: (network: string) => Erc20ApprovalGasSponsoringSigner | undefined;\n}\n\n/**\n * Extracts a typed `info` payload from an extension entry.\n *\n * @param payload - Payment payload containing optional extensions.\n * @param extensionKey - Extension key to extract.\n * @returns The extension `info` object when present; otherwise null.\n */\nfunction _extractInfo(\n payload: PaymentPayload,\n extensionKey: string,\n): Record | null {\n const extensions = payload.extensions;\n if (!extensions) return null;\n const extension = extensions[extensionKey] as { info?: Record } | undefined;\n if (!extension?.info) return null;\n return extension.info;\n}\n\n/**\n * Extracts and validates required EIP-2612 gas sponsoring fields.\n *\n * @param payload - Payment payload returned by the client scheme.\n * @returns Parsed EIP-2612 gas sponsoring info when available and complete.\n */\nexport function extractEip2612GasSponsoringInfo(\n payload: PaymentPayload,\n): Eip2612GasSponsoringInfo | null {\n const info = _extractInfo(payload, EIP2612_GAS_SPONSORING_KEY);\n if (!info) return null;\n if (\n !info.from ||\n !info.asset ||\n !info.spender ||\n !info.amount ||\n !info.nonce ||\n !info.deadline ||\n !info.signature ||\n !info.version\n ) {\n return null;\n }\n return info as unknown as Eip2612GasSponsoringInfo;\n}\n\n/**\n * Validates the structure and formatting of EIP-2612 sponsoring info.\n *\n * @param info - EIP-2612 extension info to validate.\n * @returns True when all required fields match expected patterns.\n */\nexport function validateEip2612GasSponsoringInfo(info: Eip2612GasSponsoringInfo): boolean {\n const addressPattern = /^0x[a-fA-F0-9]{40}$/;\n const numericPattern = /^[0-9]+$/;\n const hexPattern = /^0x[a-fA-F0-9]+$/;\n const versionPattern = /^[0-9]+(\\.[0-9]+)*$/;\n return (\n addressPattern.test(info.from) &&\n addressPattern.test(info.asset) &&\n addressPattern.test(info.spender) &&\n numericPattern.test(info.amount) &&\n numericPattern.test(info.nonce) &&\n numericPattern.test(info.deadline) &&\n hexPattern.test(info.signature) &&\n versionPattern.test(info.version)\n );\n}\n\n/**\n * Extracts and validates required ERC-20 approval sponsoring fields.\n *\n * @param payload - Payment payload returned by the client scheme.\n * @returns Parsed ERC-20 approval sponsoring info when available and complete.\n */\nexport function extractErc20ApprovalGasSponsoringInfo(\n payload: PaymentPayload,\n): Erc20ApprovalGasSponsoringInfo | null {\n const info = _extractInfo(payload, ERC20_APPROVAL_GAS_SPONSORING_KEY);\n if (!info) return null;\n if (\n !info.from ||\n !info.asset ||\n !info.spender ||\n !info.amount ||\n !info.signedTransaction ||\n !info.version\n ) {\n return null;\n }\n return info as unknown as Erc20ApprovalGasSponsoringInfo;\n}\n\n/**\n * Validates the structure and formatting of ERC-20 approval sponsoring info.\n *\n * @param info - ERC-20 approval extension info to validate.\n * @returns True when all required fields match expected patterns.\n */\nexport function validateErc20ApprovalGasSponsoringInfo(\n info: Erc20ApprovalGasSponsoringInfo,\n): boolean {\n const addressPattern = /^0x[a-fA-F0-9]{40}$/;\n const numericPattern = /^[0-9]+$/;\n const hexPattern = /^0x[a-fA-F0-9]+$/;\n const versionPattern = /^[0-9]+(\\.[0-9]+)*$/;\n return (\n addressPattern.test(info.from) &&\n addressPattern.test(info.asset) &&\n addressPattern.test(info.spender) &&\n numericPattern.test(info.amount) &&\n hexPattern.test(info.signedTransaction) &&\n versionPattern.test(info.version)\n );\n}\n\n/**\n * Resolves the ERC-20 approval extension signer for a specific network.\n *\n * @param extension - Optional facilitator extension config.\n * @param network - CAIP-2 network identifier.\n * @returns A network-specific signer when available, else the default signer.\n */\nexport function resolveErc20ApprovalExtensionSigner(\n extension: Erc20ApprovalGasSponsoringFacilitatorExtension | undefined,\n network: string,\n): Erc20ApprovalGasSponsoringSigner | undefined {\n if (!extension) return undefined;\n return extension.signerForNetwork?.(network) ?? extension.signer;\n}\n","import {\n PaymentPayload,\n PaymentPayloadResult,\n PaymentRequirements,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@x402/core/types\";\nimport {\n extractEip2612GasSponsoringInfo,\n validateEip2612GasSponsoringInfo,\n extractErc20ApprovalGasSponsoringInfo,\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n type Eip2612GasSponsoringInfo,\n type Erc20ApprovalGasSponsoringFacilitatorExtension,\n type Erc20ApprovalGasSponsoringSigner,\n} from \"../exact/extensions\";\nimport { getAddress, encodeFunctionData } from \"viem\";\nimport { PERMIT2_ADDRESS, eip3009ABI, erc20AllowanceAbi, permit2WitnessTypes } from \"../constants\";\nimport { multicall, ContractCall } from \"../multicall\";\nimport { createPermit2Nonce, getEvmChainId } from \"../utils\";\nimport {\n ErrPermit2612AmountMismatch,\n ErrPermit2InvalidAmount,\n ErrPermit2InvalidDestination,\n ErrPermit2InvalidNonce,\n ErrPermit2InvalidOwner,\n ErrPermit2InvalidSignature,\n ErrPermit2PaymentTooEarly,\n ErrPermit2AllowanceRequired,\n ErrPermit2SimulationFailed,\n ErrPermit2InsufficientBalance,\n ErrPermit2ProxyNotDeployed,\n ErrInvalidTransactionState,\n ErrTransactionFailed,\n ErrInvalidEip2612ExtensionFormat,\n ErrEip2612FromMismatch,\n ErrEip2612AssetMismatch,\n ErrEip2612SpenderNotPermit2,\n ErrEip2612DeadlineExpired,\n ErrErc20ApprovalTxFailed,\n} from \"../exact/facilitator/errors\";\nimport { ClientEvmSigner, FacilitatorEvmSigner } from \"../signer\";\nimport { ExactPermit2Payload, Permit2Authorization, UptoPermit2Payload } from \"../types\";\nimport { validateErc20ApprovalForPayment } from \"./erc20approval\";\nimport {\n ErrUptoAmountExceedsPermitted,\n ErrUptoUnauthorizedFacilitator,\n} from \"../upto/facilitator/errors\";\n\n/**\n * Base type for Permit2 payloads shared between exact and upto schemes.\n * Both {@link ExactPermit2Payload} and {@link UptoPermit2Payload} satisfy this type.\n */\nexport type Permit2PayloadBase = ExactPermit2Payload | UptoPermit2Payload;\n\n/**\n * Configuration for the Permit2 proxy contract used during settlement.\n * The exact and upto schemes use different proxy addresses and ABIs.\n */\nexport type Permit2ProxyConfig = {\n /** The deployed proxy contract address. */\n proxyAddress: `0x${string}`;\n /** The proxy contract ABI (must include settle and settleWithPermit functions). */\n proxyABI: readonly Record[];\n};\n\n/**\n * Checks Permit2 allowance and validates gas sponsoring extensions if allowance is insufficient.\n *\n * When the on-chain ERC-20 allowance to the Permit2 contract is below the required amount,\n * this function falls back to validating EIP-2612 or ERC-20 approval gas sponsoring extensions\n * attached to the payment payload.\n *\n * @param signer - The facilitator signer for on-chain reads\n * @param payload - The payment payload\n * @param requirements - The payment requirements\n * @param payer - The payer address\n * @param tokenAddress - The token contract address\n * @param context - Optional facilitator context for extension lookup\n * @returns A VerifyResponse if verification should stop (failure), or null to continue\n */\nexport async function verifyPermit2Allowance(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n payer: `0x${string}`,\n tokenAddress: `0x${string}`,\n context?: FacilitatorContext,\n): Promise {\n try {\n const allowance = (await signer.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [payer, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return null; // Sufficient allowance, continue verification\n }\n\n // Allowance insufficient — try EIP-2612 gas sponsoring first\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n const result = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null; // EIP-2612 is valid, allowance will be set atomically during settlement\n }\n\n // Try ERC-20 approval gas sponsoring as fallback\n const erc20GasSponsorshipExtension =\n context?.getExtension(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const result = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null; // ERC-20 approval is valid, will be broadcast before settlement\n }\n }\n\n return { isValid: false, invalidReason: \"permit2_allowance_required\", payer };\n } catch {\n // Allowance check failed — validate extensions if present; fail closed if none valid\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n const result = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null;\n }\n\n const erc20GasSponsorshipExtension =\n context?.getExtension(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const result = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!result.isValid) {\n return { isValid: false, invalidReason: result.invalidReason!, payer };\n }\n return null;\n }\n }\n\n return { isValid: false, invalidReason: \"permit2_allowance_required\", payer };\n }\n}\n\n/**\n * Waits for a transaction receipt and returns the appropriate SettleResponse.\n *\n * @param signer - Signer with waitForTransactionReceipt capability\n * @param tx - The transaction hash to wait for\n * @param payload - The payment payload (for network info)\n * @param payer - The payer address\n * @returns Promise resolving to a settlement response indicating success or failure\n */\nexport async function waitAndReturnSettleResponse(\n signer: Pick,\n tx: `0x${string}`,\n payload: PaymentPayload,\n payer: `0x${string}`,\n): Promise {\n const receipt = await signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: ErrInvalidTransactionState,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n}\n\n/**\n * Maps contract revert errors to structured SettleResponse error reasons.\n *\n * Inspects the error message for known contract revert strings and maps them\n * to the corresponding error reason constants. Falls back to a generic\n * \"transaction_failed\" reason with truncated message for unrecognized errors.\n *\n * @param error - The caught error (typically from a contract write)\n * @param payload - The payment payload (for network info)\n * @param payer - The payer address\n * @returns A failed SettleResponse with the mapped error reason\n */\nexport function mapSettleError(\n error: unknown,\n payload: PaymentPayload,\n payer: `0x${string}`,\n): SettleResponse {\n let errorReason: string = ErrTransactionFailed;\n if (error instanceof Error) {\n const message = error.message;\n if (message.includes(\"Permit2612AmountMismatch\")) {\n errorReason = ErrPermit2612AmountMismatch;\n } else if (message.includes(\"InvalidAmount\")) {\n errorReason = ErrPermit2InvalidAmount;\n } else if (message.includes(\"InvalidDestination\")) {\n errorReason = ErrPermit2InvalidDestination;\n } else if (message.includes(\"InvalidOwner\")) {\n errorReason = ErrPermit2InvalidOwner;\n } else if (message.includes(\"PaymentTooEarly\")) {\n errorReason = ErrPermit2PaymentTooEarly;\n } else if (message.includes(\"InvalidSignature\") || message.includes(\"SignatureExpired\")) {\n errorReason = ErrPermit2InvalidSignature;\n } else if (message.includes(\"InvalidNonce\")) {\n errorReason = ErrPermit2InvalidNonce;\n } else if (message.includes(\"erc20_approval_tx_failed\")) {\n errorReason = ErrErc20ApprovalTxFailed;\n } else if (message.includes(\"AmountExceedsPermitted\")) {\n errorReason = ErrUptoAmountExceedsPermitted;\n } else if (message.includes(\"UnauthorizedFacilitator\")) {\n errorReason = ErrUptoUnauthorizedFacilitator;\n } else {\n errorReason = `${ErrTransactionFailed}: ${message.slice(0, 500)}`;\n }\n }\n return {\n success: false,\n errorReason,\n transaction: \"\",\n network: payload.accepted.network,\n payer,\n };\n}\n\n/**\n * Validates EIP-2612 permit extension data for a Permit2 payment.\n *\n * Checks that the permit extension has a valid format and that the from address,\n * asset address, spender address, and deadline all match expectations.\n *\n * @param info - The EIP-2612 gas sponsoring info extracted from the payment payload\n * @param payer - The expected payer address\n * @param tokenAddress - The expected token address\n * @returns Validation result with isValid flag and optional invalidReason string\n */\nexport function validateEip2612PermitForPayment(\n info: Eip2612GasSponsoringInfo,\n payer: `0x${string}`,\n tokenAddress: `0x${string}`,\n): { isValid: boolean; invalidReason?: string } {\n if (!validateEip2612GasSponsoringInfo(info)) {\n return { isValid: false, invalidReason: ErrInvalidEip2612ExtensionFormat };\n }\n\n if (getAddress(info.from as `0x${string}`) !== getAddress(payer)) {\n return { isValid: false, invalidReason: ErrEip2612FromMismatch };\n }\n\n if (getAddress(info.asset as `0x${string}`) !== tokenAddress) {\n return { isValid: false, invalidReason: ErrEip2612AssetMismatch };\n }\n\n if (getAddress(info.spender as `0x${string}`) !== getAddress(PERMIT2_ADDRESS)) {\n return { isValid: false, invalidReason: ErrEip2612SpenderNotPermit2 };\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(info.deadline) < BigInt(now + 6)) {\n return { isValid: false, invalidReason: ErrEip2612DeadlineExpired };\n }\n\n return { isValid: true };\n}\n\n// ---------------------------------------------------------------------------\n// Simulation helpers (shared across exact and upto)\n// ---------------------------------------------------------------------------\n\n/**\n * Simulates settle() via eth_call (readContract).\n * Returns true if simulation succeeded, false if it failed.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulatePermit2Settle(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n settleArgs: readonly unknown[],\n): Promise {\n try {\n await signer.readContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settle\",\n args: settleArgs,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Simulates settleWithPermit() via eth_call (readContract).\n * The contract atomically calls token.permit() then PERMIT2.permitTransferFrom(),\n * so simulation covers allowance + balance + nonces.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @param eip2612Info - EIP-2612 gas sponsoring info from the payload extension\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulatePermit2SettleWithPermit(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n settleArgs: readonly unknown[],\n eip2612Info: Eip2612GasSponsoringInfo,\n): Promise {\n try {\n const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n await signer.readContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settleWithPermit\",\n args: [\n {\n value: BigInt(eip2612Info.amount),\n deadline: BigInt(eip2612Info.deadline),\n r,\n s,\n v,\n },\n ...settleArgs,\n ],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Delegates the full approve+settle simulation flow to the extension signer via simulateTransactions.\n * The signer owns execution strategy.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param extensionSigner - The extension signer with simulateTransactions capability\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction hex string\n * @returns true if the bundle simulation succeeded, false otherwise\n */\nexport async function simulatePermit2SettleWithErc20Approval(\n config: Permit2ProxyConfig,\n extensionSigner: Erc20ApprovalGasSponsoringSigner,\n settleArgs: readonly unknown[],\n erc20Info: { signedTransaction: string },\n): Promise {\n if (!extensionSigner.simulateTransactions) {\n return false;\n }\n\n try {\n const settleData = encodeFunctionData({\n abi: config.proxyABI,\n functionName: \"settle\",\n args: settleArgs,\n });\n\n return await extensionSigner.simulateTransactions([\n erc20Info.signedTransaction as `0x${string}`,\n { to: config.proxyAddress, data: settleData, gas: BigInt(300_000) },\n ]);\n } catch {\n return false;\n }\n}\n\n/**\n * Diagnoses a Permit2 simulation failure by performing a multicall to check the proxy deployment, balance and allowance.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param tokenAddress - ERC-20 token contract address\n * @param permit2Payload - The Permit2 authorization payload\n * @param amountRequired - Required payment amount (as string)\n * @returns VerifyResponse with the most specific failure reason\n */\nexport async function diagnosePermit2SimulationFailure(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n tokenAddress: `0x${string}`,\n permit2Payload: Permit2PayloadBase,\n amountRequired: string,\n): Promise {\n const payer = permit2Payload.permit2Authorization.from;\n\n const diagnosticCalls: ContractCall[] = [\n {\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"PERMIT2\",\n },\n {\n address: tokenAddress,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payer],\n },\n {\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [payer, PERMIT2_ADDRESS],\n },\n ];\n\n try {\n const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n const [proxyResult, balanceResult, allowanceResult] = results;\n\n if (proxyResult.status === \"failure\") {\n return { isValid: false, invalidReason: ErrPermit2ProxyNotDeployed, payer };\n }\n\n if (balanceResult.status === \"success\") {\n const balance = balanceResult.result as bigint;\n if (balance < BigInt(amountRequired)) {\n return { isValid: false, invalidReason: ErrPermit2InsufficientBalance, payer };\n }\n }\n\n if (allowanceResult.status === \"success\") {\n const allowance = allowanceResult.result as bigint;\n if (allowance < BigInt(amountRequired)) {\n return { isValid: false, invalidReason: ErrPermit2AllowanceRequired, payer };\n }\n }\n } catch {\n // Diagnostic multicall itself failed — fall through to generic error\n }\n\n return { isValid: false, invalidReason: ErrPermit2SimulationFailed, payer };\n}\n\n/**\n * Targeted multicall for the ERC-20 approval path where simulation cannot be used\n * (the approval hasn't been broadcast yet, so settle() would fail for expected reasons).\n * Checks proxy deployment, payer token balance and payer ETH balance for gas.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param tokenAddress - ERC-20 token contract address\n * @param payer - The payer address\n * @param amountRequired - Required payment amount (as string)\n * @returns VerifyResponse — valid if checks pass, otherwise the most specific failure\n */\nexport async function checkPermit2Prerequisites(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n tokenAddress: `0x${string}`,\n payer: `0x${string}`,\n amountRequired: string,\n): Promise {\n const diagnosticCalls: ContractCall[] = [\n {\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"PERMIT2\",\n },\n {\n address: tokenAddress,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payer],\n },\n ];\n\n try {\n const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n const [proxyResult, balanceResult] = results;\n\n if (proxyResult.status === \"failure\") {\n return { isValid: false, invalidReason: ErrPermit2ProxyNotDeployed, payer };\n }\n\n if (balanceResult.status === \"success\") {\n const balance = balanceResult.result as bigint;\n if (balance < BigInt(amountRequired)) {\n return { isValid: false, invalidReason: ErrPermit2InsufficientBalance, payer };\n }\n }\n } catch {\n // Multicall failed — fall through to valid (fail open for prerequisites-only check)\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n}\n\n/**\n * Builds args for exact settle(permit, owner, witness, signature).\n *\n * @param permit2Payload - The Permit2 payload containing authorization and signature data\n * @returns Tuple of contract call arguments for the exact settle function\n */\nexport function buildExactPermit2SettleArgs(permit2Payload: Permit2PayloadBase) {\n return [\n {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n },\n getAddress(permit2Payload.permit2Authorization.from),\n {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n permit2Payload.signature,\n ] as const;\n}\n\n/**\n * Builds args for upto settle(permit, amount, owner, witness, signature).\n * The upto contract's settle() takes an additional `amount` parameter and the witness\n * includes a `facilitator` field.\n *\n * @param permit2Payload - The upto Permit2 payload containing authorization and signature data\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @returns Tuple of contract call arguments for the upto settle function\n */\nexport function buildUptoPermit2SettleArgs(\n permit2Payload: UptoPermit2Payload,\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n) {\n return [\n {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n },\n settlementAmount,\n getAddress(permit2Payload.permit2Authorization.from),\n {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n facilitator: getAddress(facilitatorAddress),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n permit2Payload.signature,\n ] as const;\n}\n\n/**\n * Splits a 65-byte EIP-2612 signature into v, r, s components.\n *\n * @param signature - The hex-encoded 65-byte signature (with or without 0x prefix)\n * @returns Object with v (uint8), r (bytes32 hex), s (bytes32 hex)\n * @throws Error if the signature is not exactly 65 bytes (130 hex chars)\n */\nexport function splitEip2612Signature(signature: string): {\n v: number;\n r: `0x${string}`;\n s: `0x${string}`;\n} {\n const sig = signature.startsWith(\"0x\") ? signature.slice(2) : signature;\n\n if (sig.length !== 130) {\n throw new Error(\n `invalid EIP-2612 signature length: expected 65 bytes (130 hex chars), got ${sig.length / 2} bytes`,\n );\n }\n\n const r = `0x${sig.slice(0, 64)}` as `0x${string}`;\n const s = `0x${sig.slice(64, 128)}` as `0x${string}`;\n const v = parseInt(sig.slice(128, 130), 16);\n\n return { v, r, s };\n}\n\n// ---------------------------------------------------------------------------\n// Client-side helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Permit2 payload for any scheme (exact or upto).\n * The only scheme-specific input is the proxy address used as the spender.\n *\n * @param proxyAddress - The x402 proxy contract address to set as spender\n * @param signer - The EVM client signer\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createPermit2PayloadForProxy(\n proxyAddress: `0x${string}`,\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise {\n const now = Math.floor(Date.now() / 1000);\n const nonce = createPermit2Nonce();\n\n // Lower time bound - allow some clock skew\n const validAfter = (now - 600).toString();\n // Upper time bound is enforced by Permit2's deadline field\n const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();\n\n const permit2Authorization: Permit2Authorization & { from: `0x${string}` } = {\n from: signer.address,\n permitted: {\n token: getAddress(paymentRequirements.asset),\n amount: paymentRequirements.amount,\n },\n spender: proxyAddress,\n nonce,\n deadline,\n witness: {\n to: getAddress(paymentRequirements.payTo),\n validAfter,\n },\n };\n\n const signature = await signPermit2Authorization(\n signer,\n permit2Authorization,\n paymentRequirements,\n );\n\n return {\n x402Version,\n payload: { signature, permit2Authorization },\n };\n}\n\n/**\n * Signs a Permit2 authorization using EIP-712 with witness data.\n * The signature authorizes the proxy contract to transfer tokens on behalf of the signer.\n *\n * @param signer - The EVM client signer\n * @param permit2Authorization - The Permit2 authorization parameters\n * @param requirements - The payment requirements\n * @returns Promise resolving to the hex-encoded signature\n */\nasync function signPermit2Authorization(\n signer: ClientEvmSigner,\n permit2Authorization: Permit2Authorization & { from: `0x${string}` },\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n return await signer.signTypedData({\n domain: { name: \"Permit2\", chainId, verifyingContract: PERMIT2_ADDRESS },\n types: permit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\",\n message: {\n permitted: {\n token: getAddress(permit2Authorization.permitted.token),\n amount: BigInt(permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Authorization.spender),\n nonce: BigInt(permit2Authorization.nonce),\n deadline: BigInt(permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Authorization.witness.to),\n validAfter: BigInt(permit2Authorization.witness.validAfter),\n },\n },\n });\n}\n","import {\n getAddress,\n parseTransaction,\n decodeFunctionData,\n recoverTransactionAddress,\n type TransactionSerialized,\n} from \"viem\";\nimport type { VerifyResponse } from \"@x402/core/types\";\nimport {\n validateErc20ApprovalGasSponsoringInfo,\n type Erc20ApprovalGasSponsoringInfo,\n} from \"../exact/extensions\";\nimport { PERMIT2_ADDRESS, erc20ApproveAbi } from \"../constants\";\nimport {\n ErrErc20ApprovalInvalidFormat,\n ErrErc20ApprovalFromMismatch,\n ErrErc20ApprovalAssetMismatch,\n ErrErc20ApprovalSpenderNotPermit2,\n ErrErc20ApprovalTxWrongTarget,\n ErrErc20ApprovalTxWrongSelector,\n ErrErc20ApprovalTxWrongSpender,\n ErrErc20ApprovalTxInvalidCalldata,\n ErrErc20ApprovalTxSignerMismatch,\n ErrErc20ApprovalTxInvalidSignature,\n ErrErc20ApprovalTxParseFailed,\n} from \"../exact/facilitator/errors\";\n\n/** The approve(address,uint256) function selector */\nconst APPROVE_SELECTOR = \"0x095ea7b3\";\n\n/**\n * Validates ERC-20 approval extension data for a Permit2 payment.\n *\n * Performs comprehensive validation:\n * - Format validation via validateErc20ApprovalGasSponsoringInfo (JSON Schema)\n * - `from` matches payer\n * - `asset` matches token\n * - `spender` is PERMIT2_ADDRESS\n * - Transaction `to` matches token address\n * - Transaction calldata is a valid approve(PERMIT2_ADDRESS, ...) call\n * - Recovered transaction signer matches `from`\n *\n * @param info - The ERC-20 approval gas sponsoring info\n * @param payer - The expected payer address\n * @param tokenAddress - The expected token address\n * @returns Validation result with invalidReason and invalidMessage on failure\n */\nexport async function validateErc20ApprovalForPayment(\n info: Erc20ApprovalGasSponsoringInfo,\n payer: `0x${string}`,\n tokenAddress: `0x${string}`,\n): Promise> {\n if (!validateErc20ApprovalGasSponsoringInfo(info)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalInvalidFormat,\n invalidMessage: \"ERC-20 approval extension info failed schema validation\",\n };\n }\n\n if (getAddress(info.from) !== getAddress(payer)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalFromMismatch,\n invalidMessage: `Expected from=${payer}, got ${info.from}`,\n };\n }\n\n if (getAddress(info.asset) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalAssetMismatch,\n invalidMessage: `Expected asset=${tokenAddress}, got ${info.asset}`,\n };\n }\n\n if (getAddress(info.spender) !== getAddress(PERMIT2_ADDRESS)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalSpenderNotPermit2,\n invalidMessage: `Expected spender=${PERMIT2_ADDRESS}, got ${info.spender}`,\n };\n }\n\n try {\n const serializedTx = info.signedTransaction as TransactionSerialized;\n const tx = parseTransaction(serializedTx);\n\n if (!tx.to || getAddress(tx.to) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxWrongTarget,\n invalidMessage: `Transaction targets ${tx.to ?? \"null\"}, expected ${tokenAddress}`,\n };\n }\n\n const data = tx.data ?? \"0x\";\n if (!data.startsWith(APPROVE_SELECTOR)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxWrongSelector,\n invalidMessage: `Transaction calldata does not start with approve() selector ${APPROVE_SELECTOR}`,\n };\n }\n\n try {\n const decoded = decodeFunctionData({\n abi: erc20ApproveAbi,\n data: data as `0x${string}`,\n });\n const calldataSpender = getAddress(decoded.args[0] as `0x${string}`);\n if (calldataSpender !== getAddress(PERMIT2_ADDRESS)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxWrongSpender,\n invalidMessage: `approve() spender is ${calldataSpender}, expected Permit2 ${PERMIT2_ADDRESS}`,\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxInvalidCalldata,\n invalidMessage: \"Failed to decode approve() calldata from the signed transaction\",\n };\n }\n\n try {\n const recoveredAddress = await recoverTransactionAddress({\n serializedTransaction: serializedTx,\n });\n if (getAddress(recoveredAddress) !== getAddress(payer)) {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxSignerMismatch,\n invalidMessage: `Transaction signed by ${recoveredAddress}, expected payer ${payer}`,\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxInvalidSignature,\n invalidMessage: \"Failed to recover signer from the signed transaction\",\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: ErrErc20ApprovalTxParseFailed,\n invalidMessage: \"Failed to parse the signed transaction\",\n };\n }\n\n return { isValid: true };\n}\n","/**\n * Named error reason constants for the upto EVM facilitator.\n *\n * Shared Permit2 errors are re-exported from exact/facilitator/errors.ts.\n * Upto-specific errors are defined here.\n *\n * These strings must be character-for-character identical to the Go constants\n * to maintain cross-SDK parity.\n */\n\n// Re-export shared Permit2 errors\nexport {\n ErrPermit2InvalidSpender,\n ErrPermit2RecipientMismatch,\n ErrPermit2DeadlineExpired,\n ErrPermit2NotYetValid,\n ErrPermit2AmountMismatch,\n ErrPermit2TokenMismatch,\n ErrPermit2InvalidSignature,\n ErrPermit2AllowanceRequired,\n ErrPermit2InvalidAmount,\n ErrPermit2InvalidDestination,\n ErrPermit2InvalidOwner,\n ErrPermit2PaymentTooEarly,\n ErrPermit2InvalidNonce,\n ErrPermit2612AmountMismatch,\n ErrErc20ApprovalInvalidFormat,\n ErrErc20ApprovalFromMismatch,\n ErrErc20ApprovalAssetMismatch,\n ErrErc20ApprovalSpenderNotPermit2,\n ErrErc20ApprovalTxWrongTarget,\n ErrErc20ApprovalTxWrongSelector,\n ErrErc20ApprovalTxWrongSpender,\n ErrErc20ApprovalTxInvalidCalldata,\n ErrErc20ApprovalTxSignerMismatch,\n ErrErc20ApprovalTxInvalidSignature,\n ErrErc20ApprovalTxParseFailed,\n} from \"../../exact/facilitator/errors\";\n\n// Upto-specific errors\nexport const ErrUptoInvalidScheme = \"invalid_upto_evm_scheme\";\nexport const ErrUptoNetworkMismatch = \"invalid_upto_evm_network_mismatch\";\nexport const ErrUptoSettlementExceedsAmount = \"invalid_upto_evm_payload_settlement_exceeds_amount\";\nexport const ErrUptoAmountExceedsPermitted = \"upto_amount_exceeds_permitted\";\nexport const ErrUptoUnauthorizedFacilitator = \"upto_unauthorized_facilitator\";\nexport const ErrUptoFacilitatorMismatch = \"upto_facilitator_mismatch\";\n","import { PaymentRequirements, PaymentPayloadResult } from \"@x402/core/types\";\nimport { encodeFunctionData, getAddress } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n x402ExactPermit2ProxyAddress,\n erc20ApproveAbi,\n erc20AllowanceAbi,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { createPermit2PayloadForProxy } from \"../../shared/permit2\";\n\n/** Maximum uint256 value for unlimited approval. */\nconst MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\n/**\n * Creates a Permit2 payload using the x402Permit2Proxy witness pattern.\n * The spender is set to x402Permit2Proxy, which enforces that funds\n * can only be sent to the witness.to address.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createPermit2Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise {\n return createPermit2PayloadForProxy(\n x402ExactPermit2ProxyAddress,\n signer,\n x402Version,\n paymentRequirements,\n );\n}\n\n/**\n * Creates transaction data to approve Permit2 to spend tokens.\n * The user sends this transaction (paying gas) before using Permit2 flow.\n *\n * @param tokenAddress - The ERC20 token contract address\n * @returns Transaction data to send for approval\n *\n * @example\n * ```typescript\n * const tx = createPermit2ApprovalTx(\"0x...\");\n * await walletClient.sendTransaction({\n * to: tx.to,\n * data: tx.data,\n * });\n * ```\n */\nexport function createPermit2ApprovalTx(tokenAddress: `0x${string}`): {\n to: `0x${string}`;\n data: `0x${string}`;\n} {\n const data = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [PERMIT2_ADDRESS, MAX_UINT256],\n });\n\n return {\n to: getAddress(tokenAddress),\n data,\n };\n}\n\n/**\n * Parameters for checking Permit2 allowance.\n * Application provides these to check if approval is needed.\n */\nexport interface Permit2AllowanceParams {\n tokenAddress: `0x${string}`;\n ownerAddress: `0x${string}`;\n}\n\n/**\n * Returns contract read parameters for checking Permit2 allowance.\n * Use with a public client to check if the user has approved Permit2.\n *\n * @param params - The allowance check parameters\n * @returns Contract read parameters for checking allowance\n *\n * @example\n * ```typescript\n * const readParams = getPermit2AllowanceReadParams({\n * tokenAddress: \"0x...\",\n * ownerAddress: \"0x...\",\n * });\n *\n * const allowance = await publicClient.readContract(readParams);\n * const needsApproval = allowance < requiredAmount;\n * ```\n */\nexport function getPermit2AllowanceReadParams(params: Permit2AllowanceParams): {\n address: `0x${string}`;\n abi: typeof erc20AllowanceAbi;\n functionName: \"allowance\";\n args: [`0x${string}`, `0x${string}`];\n} {\n return {\n address: getAddress(params.tokenAddress),\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [getAddress(params.ownerAddress), PERMIT2_ADDRESS],\n };\n}\n","import { PaymentRequirements, PaymentPayloadResult, PaymentPayloadContext } from \"@x402/core/types\";\nimport { EIP2612_GAS_SPONSORING_KEY, ERC20_APPROVAL_GAS_SPONSORING_KEY } from \"../exact/extensions\";\nimport { getAddress } from \"viem\";\nimport { PERMIT2_ADDRESS, erc20AllowanceAbi } from \"../constants\";\nimport { getEvmChainId } from \"../utils\";\nimport { ClientEvmSigner } from \"../signer\";\nimport { signEip2612Permit } from \"../exact/client/eip2612\";\nimport { signErc20ApprovalTransaction } from \"../exact/client/erc20approval\";\nimport { resolveExtensionRpcCapabilities, type ExactEvmSchemeOptions } from \"./rpc\";\n\n/**\n * Attempts to sign an EIP-2612 permit for gasless Permit2 approval.\n *\n * @param signer - The EVM client signer\n * @param options - Optional RPC configuration for backfilling capabilities\n * @param requirements - The payment requirements from the server\n * @param result - The payment payload result from the scheme\n * @param context - Optional context containing server extensions and metadata\n * @returns Extension data for EIP-2612 gas sponsoring, or undefined if not applicable\n */\nexport async function trySignEip2612PermitExtension(\n signer: ClientEvmSigner,\n options: ExactEvmSchemeOptions | undefined,\n requirements: PaymentRequirements,\n result: PaymentPayloadResult,\n context?: PaymentPayloadContext,\n): Promise | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);\n\n if (!capabilities.readContract) {\n return undefined;\n }\n\n if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {\n return undefined;\n }\n\n const tokenName = requirements.extra?.name as string | undefined;\n const tokenVersion = requirements.extra?.version as string | undefined;\n if (!tokenName || !tokenVersion) {\n return undefined;\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset) as `0x${string}`;\n\n try {\n const allowance = (await capabilities.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [signer.address, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return undefined;\n }\n } catch {\n // Allowance check failed, proceed with signing\n }\n\n const permit2Auth = result.payload?.permit2Authorization as Record | undefined;\n const deadline =\n (permit2Auth?.deadline as string) ??\n Math.floor(Date.now() / 1000 + requirements.maxTimeoutSeconds).toString();\n\n const info = await signEip2612Permit(\n {\n address: signer.address,\n signTypedData: msg => signer.signTypedData(msg),\n readContract: capabilities.readContract,\n },\n tokenAddress,\n tokenName,\n tokenVersion,\n chainId,\n deadline,\n requirements.amount,\n );\n\n return {\n [EIP2612_GAS_SPONSORING_KEY]: { info },\n };\n}\n\n/**\n * Attempts to sign an ERC-20 approval transaction for gasless Permit2 approval.\n *\n * @param signer - The EVM client signer\n * @param options - Optional RPC configuration for backfilling capabilities\n * @param requirements - The payment requirements from the server\n * @param context - Optional context containing server extensions and metadata\n * @returns Extension data for ERC-20 approval gas sponsoring, or undefined if not applicable\n */\nexport async function trySignErc20ApprovalExtension(\n signer: ClientEvmSigner,\n options: ExactEvmSchemeOptions | undefined,\n requirements: PaymentRequirements,\n context?: PaymentPayloadContext,\n): Promise | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);\n\n if (!capabilities.readContract) {\n return undefined;\n }\n\n if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {\n return undefined;\n }\n\n if (!capabilities.signTransaction || !capabilities.getTransactionCount) {\n return undefined;\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset) as `0x${string}`;\n\n try {\n const allowance = (await capabilities.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [signer.address, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return undefined;\n }\n } catch {\n // Allowance check failed, proceed with signing\n }\n\n const info = await signErc20ApprovalTransaction(\n {\n address: signer.address,\n signTransaction: capabilities.signTransaction,\n getTransactionCount: capabilities.getTransactionCount,\n estimateFeesPerGas: capabilities.estimateFeesPerGas,\n },\n tokenAddress,\n chainId,\n );\n\n return {\n [ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info },\n };\n}\n","import { getAddress } from \"viem\";\nimport { eip2612PermitTypes, eip2612NoncesAbi, PERMIT2_ADDRESS } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport type { Eip2612GasSponsoringInfo } from \"../extensions\";\n\nexport type Eip2612PermitSigner = Pick & {\n readContract: NonNullable;\n};\n\n/**\n * Signs an EIP-2612 permit authorizing the Permit2 contract to spend tokens.\n *\n * This creates a gasless off-chain signature that the facilitator can submit\n * on-chain via `x402Permit2Proxy.settleWithPermit()`.\n *\n * The `permittedAmount` must match the Permit2 `permitted.amount` exactly, as the\n * proxy contract enforces `permit2612.value == permittedAmount`.\n *\n * @param signer - The client EVM signer (must support readContract for nonce query)\n * @param tokenAddress - The ERC-20 token contract address\n * @param tokenName - The token name (from paymentRequirements.extra.name)\n * @param tokenVersion - The token version (from paymentRequirements.extra.version)\n * @param chainId - The chain ID\n * @param deadline - The deadline for the permit (unix timestamp as string)\n * @param permittedAmount - The Permit2 permitted amount (must match exactly)\n * @returns The EIP-2612 gas sponsoring info object\n */\nexport async function signEip2612Permit(\n signer: Eip2612PermitSigner,\n tokenAddress: `0x${string}`,\n tokenName: string,\n tokenVersion: string,\n chainId: number,\n deadline: string,\n permittedAmount: string,\n): Promise {\n const owner = signer.address;\n const spender = getAddress(PERMIT2_ADDRESS);\n\n // Query the current EIP-2612 nonce from the token contract\n const nonce = (await signer.readContract({\n address: tokenAddress,\n abi: eip2612NoncesAbi,\n functionName: \"nonces\",\n args: [owner],\n })) as bigint;\n\n // Construct EIP-712 domain for the token's permit function\n const domain = {\n name: tokenName,\n version: tokenVersion,\n chainId,\n verifyingContract: tokenAddress,\n };\n\n const approvalAmount = BigInt(permittedAmount);\n\n const message = {\n owner,\n spender,\n value: approvalAmount,\n nonce,\n deadline: BigInt(deadline),\n };\n\n // Sign the EIP-2612 permit\n const signature = await signer.signTypedData({\n domain,\n types: eip2612PermitTypes,\n primaryType: \"Permit\",\n message,\n });\n\n return {\n from: owner,\n asset: tokenAddress,\n spender,\n amount: approvalAmount.toString(),\n nonce: nonce.toString(),\n deadline,\n signature,\n version: \"1\",\n };\n}\n","import { encodeFunctionData, getAddress, maxUint256 } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n erc20ApproveAbi,\n ERC20_APPROVE_GAS_LIMIT,\n DEFAULT_MAX_FEE_PER_GAS,\n DEFAULT_MAX_PRIORITY_FEE_PER_GAS,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport {\n ERC20_APPROVAL_GAS_SPONSORING_VERSION,\n type Erc20ApprovalGasSponsoringInfo,\n} from \"../extensions\";\n\nexport type Erc20ApprovalTxSigner = Pick & {\n signTransaction: NonNullable;\n getTransactionCount: NonNullable;\n estimateFeesPerGas?: NonNullable;\n};\n\n/**\n * Signs an EIP-1559 `approve(Permit2, MaxUint256)` transaction for the given token.\n *\n * The signed transaction is NOT broadcast here — the facilitator broadcasts it\n * atomically before settling the Permit2 payment. This enables Permit2 payments\n * for generic ERC-20 tokens that do NOT implement EIP-2612.\n *\n * Always approves MaxUint256 regardless of the payment amount.\n *\n * @param signer - The client EVM signer (must support signTransaction, getTransactionCount)\n * @param tokenAddress - The ERC-20 token contract address\n * @param chainId - The chain ID\n * @returns The ERC-20 approval gas sponsoring info object\n */\nexport async function signErc20ApprovalTransaction(\n signer: Erc20ApprovalTxSigner,\n tokenAddress: `0x${string}`,\n chainId: number,\n): Promise {\n const from = signer.address;\n const spender = getAddress(PERMIT2_ADDRESS);\n\n // Encode approve(PERMIT2_ADDRESS, MaxUint256) calldata\n const data = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [spender, maxUint256],\n });\n\n // Get current nonce for the sender\n const nonce = await signer.getTransactionCount({ address: from });\n\n // Get current fee estimates, with fallback values\n let maxFeePerGas: bigint;\n let maxPriorityFeePerGas: bigint;\n try {\n const fees = await signer.estimateFeesPerGas?.();\n if (!fees) {\n throw new Error(\"no fee estimates available\");\n }\n maxFeePerGas = fees.maxFeePerGas;\n maxPriorityFeePerGas = fees.maxPriorityFeePerGas;\n } catch {\n maxFeePerGas = DEFAULT_MAX_FEE_PER_GAS;\n maxPriorityFeePerGas = DEFAULT_MAX_PRIORITY_FEE_PER_GAS;\n }\n\n // Sign the EIP-1559 transaction (not broadcast)\n const signedTransaction = await signer.signTransaction({\n to: tokenAddress,\n data,\n nonce,\n gas: ERC20_APPROVE_GAS_LIMIT,\n maxFeePerGas,\n maxPriorityFeePerGas,\n chainId,\n });\n\n return {\n from,\n asset: tokenAddress,\n spender,\n amount: maxUint256.toString(),\n signedTransaction,\n version: ERC20_APPROVAL_GAS_SPONSORING_VERSION,\n };\n}\n","import { createPublicClient, http } from \"viem\";\nimport type { ClientEvmSigner } from \"../signer\";\nimport { getEvmChainId } from \"../utils\";\n\nexport type EvmSchemeConfig = {\n rpcUrl?: string;\n};\n\nexport type EvmSchemeConfigByChainId = Record;\n\nexport type EvmSchemeOptions = EvmSchemeConfig | EvmSchemeConfigByChainId;\n\n/** @deprecated Use EvmSchemeConfig */\nexport type ExactEvmSchemeConfig = EvmSchemeConfig;\n/** @deprecated Use EvmSchemeConfigByChainId */\nexport type ExactEvmSchemeConfigByChainId = EvmSchemeConfigByChainId;\n/** @deprecated Use EvmSchemeOptions */\nexport type ExactEvmSchemeOptions = EvmSchemeOptions;\n\ntype ExtensionRpcCapabilities = Pick<\n ClientEvmSigner,\n \"readContract\" | \"signTransaction\" | \"getTransactionCount\" | \"estimateFeesPerGas\"\n>;\n\nconst rpcClientCache = new Map>();\n\n/**\n * Check if options is a per-chain-id configuration map.\n *\n * @param options - The EVM scheme options to check\n * @returns True if the options are keyed by chain ID\n */\nfunction isConfigByChainId(options: EvmSchemeOptions): options is EvmSchemeConfigByChainId {\n const keys = Object.keys(options);\n return keys.length > 0 && keys.every(key => /^\\d+$/.test(key));\n}\n\n/**\n * Get or create a cached viem public client for the given RPC URL.\n *\n * @param rpcUrl - The JSON-RPC endpoint URL\n * @returns A viem PublicClient instance\n */\nfunction getRpcClient(rpcUrl: string): ReturnType {\n const existing = rpcClientCache.get(rpcUrl);\n if (existing) {\n return existing;\n }\n\n const client = createPublicClient({\n transport: http(rpcUrl),\n });\n rpcClientCache.set(rpcUrl, client);\n return client;\n}\n\n/**\n * Resolve an RPC URL from scheme options for the given network.\n *\n * @param network - The CAIP-2 network identifier\n * @param options - Optional EVM scheme options (flat or per-chain-id)\n * @returns The resolved RPC URL, or undefined if not configured\n */\nexport function resolveRpcUrl(network: string, options?: EvmSchemeOptions): string | undefined {\n if (!options) {\n return undefined;\n }\n\n if (isConfigByChainId(options)) {\n const chainId = getEvmChainId(network);\n const optionsByChainId = options as EvmSchemeConfigByChainId;\n return optionsByChainId[chainId]?.rpcUrl;\n }\n\n return (options as EvmSchemeConfig).rpcUrl;\n}\n\n/**\n * Resolve RPC capabilities for extensions, backfilling from a public RPC client when the signer lacks them.\n *\n * @param network - The CAIP-2 network identifier\n * @param signer - The client EVM signer\n * @param options - Optional EVM scheme options for RPC URL resolution\n * @returns Extension RPC capabilities (readContract, signTransaction, etc.)\n */\nexport function resolveExtensionRpcCapabilities(\n network: string,\n signer: ClientEvmSigner,\n options?: EvmSchemeOptions,\n): ExtensionRpcCapabilities {\n const capabilities: ExtensionRpcCapabilities = {\n signTransaction: signer.signTransaction,\n readContract: signer.readContract,\n getTransactionCount: signer.getTransactionCount,\n estimateFeesPerGas: signer.estimateFeesPerGas,\n };\n\n const needsRpcBackfill =\n !capabilities.readContract ||\n !capabilities.getTransactionCount ||\n !capabilities.estimateFeesPerGas;\n if (!needsRpcBackfill) {\n return capabilities;\n }\n\n const rpcUrl = resolveRpcUrl(network, options);\n if (!rpcUrl) {\n return capabilities;\n }\n const rpcClient = getRpcClient(rpcUrl);\n if (!capabilities.readContract) {\n capabilities.readContract = args => rpcClient.readContract(args as never) as Promise;\n }\n if (!capabilities.getTransactionCount) {\n capabilities.getTransactionCount = async args =>\n rpcClient.getTransactionCount({ address: args.address });\n }\n if (!capabilities.estimateFeesPerGas) {\n capabilities.estimateFeesPerGas = async () => rpcClient.estimateFeesPerGas();\n }\n\n return capabilities;\n}\n","import { PaymentRequirements, PaymentPayloadResult } from \"@x402/core/types\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport { createNonce, getEvmChainId } from \"../../utils\";\n\n/**\n * Creates an EIP-3009 (transferWithAuthorization) payload.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createEIP3009Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise {\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEIP3009Payload[\"authorization\"] = {\n from: signer.address,\n to: getAddress(paymentRequirements.payTo),\n value: paymentRequirements.amount,\n validAfter: (now - 600).toString(),\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);\n\n const payload: ExactEIP3009Payload = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n payload,\n };\n}\n\n/**\n * Sign the EIP-3009 authorization using EIP-712.\n *\n * @param signer - The EVM signer\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signEIP3009Authorization(\n signer: ClientEvmSigner,\n authorization: ExactEIP3009Payload[\"authorization\"],\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n}\n","import {\n SchemeNetworkClient,\n PaymentRequirements,\n PaymentPayloadResult,\n PaymentPayloadContext,\n} from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { AssetTransferMethod } from \"../../types\";\nimport { createEIP3009Payload } from \"./eip3009\";\nimport { createPermit2Payload } from \"./permit2\";\nimport {\n trySignEip2612PermitExtension,\n trySignErc20ApprovalExtension,\n} from \"../../shared/extensions\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\n\n/**\n * EVM client implementation for the Exact payment scheme.\n * Supports both EIP-3009 (transferWithAuthorization) and Permit2 flows.\n *\n * Routes to the appropriate authorization method based on\n * `requirements.extra.assetTransferMethod`. Defaults to EIP-3009\n * for backward compatibility with older facilitators.\n *\n * When the server advertises `eip2612GasSponsoring` and the asset transfer\n * method is `permit2`, the scheme automatically signs an EIP-2612 permit\n * if the user lacks Permit2 approval. This requires `readContract` on the signer.\n */\nexport class ExactEvmScheme implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClient instance.\n *\n * @param signer - The EVM signer for client operations.\n * Base flow only requires `address` + `signTypedData`.\n * Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally\n * requires optional capabilities like `readContract` and tx signing helpers.\n * @param options - Optional RPC configuration used to backfill extension capabilities.\n */\n constructor(\n private readonly signer: ClientEvmSigner,\n private readonly options?: ExactEvmSchemeOptions,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.\n *\n * For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the\n * signer supports `readContract`, automatically signs an EIP-2612 permit\n * when Permit2 allowance is insufficient.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @param context - Optional context with server-declared extensions\n * @returns Promise resolving to a payment payload result (with optional extensions)\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n context?: PaymentPayloadContext,\n ): Promise {\n const assetTransferMethod =\n (paymentRequirements.extra?.assetTransferMethod as AssetTransferMethod) ?? \"eip3009\";\n\n if (assetTransferMethod === \"permit2\") {\n const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);\n\n const eip2612Extensions = await trySignEip2612PermitExtension(\n this.signer,\n this.options,\n paymentRequirements,\n result,\n context,\n );\n\n if (eip2612Extensions) {\n return {\n ...result,\n extensions: eip2612Extensions,\n };\n }\n\n const erc20Extensions = await trySignErc20ApprovalExtension(\n this.signer,\n this.options,\n paymentRequirements,\n context,\n );\n if (erc20Extensions) {\n return {\n ...result,\n extensions: erc20Extensions,\n };\n }\n\n return result;\n }\n\n return createEIP3009Payload(this.signer, x402Version, paymentRequirements);\n }\n}\n","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@x402/core/client\";\nimport { Network } from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\nimport { ExactEvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Client\n */\nexport interface EvmClientConfig {\n /**\n * The EVM signer to use for creating payment payloads\n */\n signer: ClientEvmSigner;\n\n /**\n * Optional payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional Exact EVM client scheme options.\n * Supports either a single config ({ rpcUrl }) or per-chain configs\n * keyed by EVM chain ID ({ 8453: { rpcUrl: \"...\" } }).\n */\n schemeOptions?: ExactEvmSchemeOptions;\n\n /**\n * Optional specific networks to register.\n * If not provided, registers wildcard support (eip155:*).\n */\n networks?: Network[];\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Client instance.\n *\n * This function registers:\n * - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for EVM client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@x402/evm/exact/client/register\";\n * import { x402Client } from \"@x402/core/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n * registerExactEvmScheme(client, { signer: account });\n * ```\n */\nexport function registerExactEvmScheme(client: x402Client, config: EvmClientConfig): x402Client {\n const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);\n\n // Register V2 scheme\n // EIP-2612 gas sponsoring is handled internally by the scheme when the\n // server advertises support - no separate extension registration needed.\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach(network => {\n client.register(network, evmScheme);\n });\n } else {\n // Register wildcard for all EVM chains\n client.register(\"eip155:*\", evmScheme);\n }\n\n // Register all V1 networks\n NETWORKS.forEach(network => {\n client.registerV1(network as Network, new ExactEvmSchemeV1(config.signer));\n });\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * ClientEvmSigner - Used by x402 clients to sign payment authorizations.\n *\n * Typically a viem WalletClient extended with publicActions:\n * ```typescript\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: baseSepolia,\n * transport: http(),\n * }).extend(publicActions);\n * ```\n *\n * Or composed via `toClientEvmSigner(account, publicClient)`.\n */\nexport type ClientEvmSigner = {\n readonly address: `0x${string}`;\n signTypedData(message: {\n domain: Record;\n types: Record;\n primaryType: string;\n message: Record;\n }): Promise<`0x${string}`>;\n /**\n * Optional on-chain reads.\n * Required only for extension enrichment (EIP-2612 / ERC-20 approval).\n */\n readContract?(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise;\n /**\n * Optional: Signs a raw EIP-1559 transaction without broadcasting.\n * Required for ERC-20 approval gas sponsoring when the token lacks EIP-2612.\n */\n signTransaction?(args: {\n to: `0x${string}`;\n data: `0x${string}`;\n nonce: number;\n gas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n chainId: number;\n }): Promise<`0x${string}`>;\n /**\n * Optional: Gets the current transaction count (nonce) for an address.\n * Required for ERC-20 approval gas sponsoring.\n */\n getTransactionCount?(args: { address: `0x${string}` }): Promise;\n /**\n * Optional: Estimates current gas fees per gas.\n * Required for ERC-20 approval gas sponsoring.\n */\n estimateFeesPerGas?(): Promise<{ maxFeePerGas: bigint; maxPriorityFeePerGas: bigint }>;\n};\n\n/**\n * FacilitatorEvmSigner - Used by x402 facilitators to verify and settle payments\n * This is typically a viem PublicClient + WalletClient combination that can\n * read contract state, verify signatures, write transactions, and wait for receipts\n *\n * Supports multiple addresses for load balancing, key rotation, and high availability\n */\nexport type FacilitatorEvmSigner = {\n /**\n * Get all addresses this facilitator can use for signing\n * Enables dynamic address selection for load balancing and key rotation\n */\n getAddresses(): readonly `0x${string}`[];\n\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise;\n verifyTypedData(args: {\n address: `0x${string}`;\n domain: Record;\n types: Record;\n primaryType: string;\n message: Record;\n signature: `0x${string}`;\n }): Promise;\n writeContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n /** Optional gas limit. When provided, skips eth_estimateGas simulation. */\n gas?: bigint;\n }): Promise<`0x${string}`>;\n sendTransaction(args: { to: `0x${string}`; data: `0x${string}` }): Promise<`0x${string}`>;\n waitForTransactionReceipt(args: { hash: `0x${string}` }): Promise<{ status: string }>;\n getCode(args: { address: `0x${string}` }): Promise<`0x${string}` | undefined>;\n};\n\n/**\n * Composes a ClientEvmSigner from a local account and a public client.\n *\n * Use this when your signer (e.g., `privateKeyToAccount`) doesn't have\n * `readContract`. The `publicClient` provides the on-chain read capability.\n *\n * Alternatively, use a WalletClient extended with publicActions directly:\n * ```typescript\n * const signer = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: baseSepolia,\n * transport: http(),\n * }).extend(publicActions);\n * ```\n *\n * @param signer - A signer with `address` and `signTypedData` (and optionally `readContract`)\n * @param publicClient - A client with optional read/nonce/fee helpers\n * @param publicClient.readContract - The readContract method from the public client\n * @param publicClient.getTransactionCount - Optional getTransactionCount for ERC-20 approval\n * @param publicClient.estimateFeesPerGas - Optional estimateFeesPerGas for ERC-20 approval\n * @returns A ClientEvmSigner with any available optional capabilities\n *\n * @example\n * ```typescript\n * const account = privateKeyToAccount(\"0x...\");\n * const publicClient = createPublicClient({ chain: baseSepolia, transport: http() });\n * const signer = toClientEvmSigner(account, publicClient);\n * ```\n */\nexport function toClientEvmSigner(\n signer: Omit & {\n readContract?: ClientEvmSigner[\"readContract\"];\n },\n publicClient?: {\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise;\n getTransactionCount?(args: { address: `0x${string}` }): Promise;\n estimateFeesPerGas?(): Promise<{ maxFeePerGas: bigint; maxPriorityFeePerGas: bigint }>;\n },\n): ClientEvmSigner {\n const readContract = signer.readContract ?? publicClient?.readContract.bind(publicClient);\n\n const result: ClientEvmSigner = {\n address: signer.address,\n signTypedData: msg => signer.signTypedData(msg),\n };\n\n if (readContract) {\n result.readContract = readContract;\n }\n\n // Forward optional capabilities from signer or publicClient\n const signTransaction = signer.signTransaction;\n if (signTransaction) {\n result.signTransaction = args => signTransaction(args);\n }\n\n const getTransactionCount =\n signer.getTransactionCount ?? publicClient?.getTransactionCount?.bind(publicClient);\n if (getTransactionCount) {\n result.getTransactionCount = args => getTransactionCount(args);\n }\n\n const estimateFeesPerGas =\n signer.estimateFeesPerGas ?? publicClient?.estimateFeesPerGas?.bind(publicClient);\n if (estimateFeesPerGas) {\n result.estimateFeesPerGas = () => estimateFeesPerGas();\n }\n\n return result;\n}\n\n/**\n * Converts a viem client with single address to a FacilitatorEvmSigner\n * Wraps the single address in a getAddresses() function for compatibility\n *\n * @param client - The client to convert (must have 'address' property)\n * @returns FacilitatorEvmSigner with getAddresses() support\n */\nexport function toFacilitatorEvmSigner(\n client: Omit & { address: `0x${string}` },\n): FacilitatorEvmSigner {\n return {\n ...client,\n getAddresses: () => [client.address],\n };\n}\n","/**\n * Rule-Based Classifier (v2 — Weighted Scoring)\n *\n * Scores a request across 14 weighted dimensions and maps the aggregate\n * score to a tier using configurable boundaries. Confidence is calibrated\n * via sigmoid — low confidence triggers the fallback classifier.\n *\n * Handles 70-80% of requests in < 1ms with zero cost.\n */\n\nimport type { Tier, ScoringResult, ScoringConfig } from \"./types.js\";\n\ntype DimensionScore = { name: string; score: number; signal: string | null };\n\n// ─── Dimension Scorers ───\n// Each returns a score in [-1, 1] and an optional signal string.\n\nfunction scoreTokenCount(\n estimatedTokens: number,\n thresholds: { simple: number; complex: number },\n): DimensionScore {\n if (estimatedTokens < thresholds.simple) {\n return { name: \"tokenCount\", score: -1.0, signal: `short (${estimatedTokens} tokens)` };\n }\n if (estimatedTokens > thresholds.complex) {\n return { name: \"tokenCount\", score: 1.0, signal: `long (${estimatedTokens} tokens)` };\n }\n return { name: \"tokenCount\", score: 0, signal: null };\n}\n\nfunction scoreKeywordMatch(\n text: string,\n keywords: string[],\n name: string,\n signalLabel: string,\n thresholds: { low: number; high: number },\n scores: { none: number; low: number; high: number },\n): DimensionScore {\n const matches = keywords.filter((kw) => text.includes(kw.toLowerCase()));\n if (matches.length >= thresholds.high) {\n return {\n name,\n score: scores.high,\n signal: `${signalLabel} (${matches.slice(0, 3).join(\", \")})`,\n };\n }\n if (matches.length >= thresholds.low) {\n return {\n name,\n score: scores.low,\n signal: `${signalLabel} (${matches.slice(0, 3).join(\", \")})`,\n };\n }\n return { name, score: scores.none, signal: null };\n}\n\nfunction scoreMultiStep(text: string): DimensionScore {\n const patterns = [/first.*then/i, /step \\d/i, /\\d\\.\\s/];\n const hits = patterns.filter((p) => p.test(text));\n if (hits.length > 0) {\n return { name: \"multiStepPatterns\", score: 0.5, signal: \"multi-step\" };\n }\n return { name: \"multiStepPatterns\", score: 0, signal: null };\n}\n\nfunction scoreQuestionComplexity(prompt: string): DimensionScore {\n const count = (prompt.match(/\\?/g) || []).length;\n if (count > 3) {\n return { name: \"questionComplexity\", score: 0.5, signal: `${count} questions` };\n }\n return { name: \"questionComplexity\", score: 0, signal: null };\n}\n\n/**\n * Score agentic task indicators.\n * Returns agenticScore (0-1) based on keyword matches:\n * - 4+ matches = 1.0 (high agentic)\n * - 3 matches = 0.6 (moderate agentic, triggers auto-agentic mode)\n * - 1-2 matches = 0.2 (low agentic)\n *\n * Thresholds raised because common keywords were pruned from the list.\n */\nfunction scoreAgenticTask(\n text: string,\n keywords: string[],\n): { dimensionScore: DimensionScore; agenticScore: number } {\n let matchCount = 0;\n const signals: string[] = [];\n\n for (const keyword of keywords) {\n if (text.includes(keyword.toLowerCase())) {\n matchCount++;\n if (signals.length < 3) {\n signals.push(keyword);\n }\n }\n }\n\n // Threshold-based scoring (raised thresholds after keyword pruning)\n if (matchCount >= 4) {\n return {\n dimensionScore: {\n name: \"agenticTask\",\n score: 1.0,\n signal: `agentic (${signals.join(\", \")})`,\n },\n agenticScore: 1.0,\n };\n } else if (matchCount >= 3) {\n return {\n dimensionScore: {\n name: \"agenticTask\",\n score: 0.6,\n signal: `agentic (${signals.join(\", \")})`,\n },\n agenticScore: 0.6,\n };\n } else if (matchCount >= 1) {\n return {\n dimensionScore: {\n name: \"agenticTask\",\n score: 0.2,\n signal: `agentic-light (${signals.join(\", \")})`,\n },\n agenticScore: 0.2,\n };\n }\n\n return {\n dimensionScore: { name: \"agenticTask\", score: 0, signal: null },\n agenticScore: 0,\n };\n}\n\n// ─── Main Classifier ───\n\nexport function classifyByRules(\n prompt: string,\n systemPrompt: string | undefined,\n estimatedTokens: number,\n config: ScoringConfig,\n): ScoringResult {\n // Score against user prompt only — system prompts contain boilerplate keywords\n // (tool definitions, skill descriptions, behavioral rules) that dominate scoring\n // and make every request score identically. See GitHub issue #50.\n const userText = prompt.toLowerCase();\n\n // Score all 14 dimensions against user text only\n const dimensions: DimensionScore[] = [\n // Token count uses total estimated tokens (system + user) — context size matters for model selection\n scoreTokenCount(estimatedTokens, config.tokenCountThresholds),\n scoreKeywordMatch(\n userText,\n config.codeKeywords,\n \"codePresence\",\n \"code\",\n { low: 1, high: 2 },\n { none: 0, low: 0.5, high: 1.0 },\n ),\n scoreKeywordMatch(\n userText,\n config.reasoningKeywords,\n \"reasoningMarkers\",\n \"reasoning\",\n { low: 1, high: 2 },\n { none: 0, low: 0.7, high: 1.0 },\n ),\n scoreKeywordMatch(\n userText,\n config.technicalKeywords,\n \"technicalTerms\",\n \"technical\",\n { low: 2, high: 4 },\n { none: 0, low: 0.5, high: 1.0 },\n ),\n scoreKeywordMatch(\n userText,\n config.creativeKeywords,\n \"creativeMarkers\",\n \"creative\",\n { low: 1, high: 2 },\n { none: 0, low: 0.5, high: 0.7 },\n ),\n scoreKeywordMatch(\n userText,\n config.simpleKeywords,\n \"simpleIndicators\",\n \"simple\",\n { low: 1, high: 2 },\n { none: 0, low: -1.0, high: -1.0 },\n ),\n scoreMultiStep(userText),\n scoreQuestionComplexity(prompt),\n\n // 6 new dimensions\n scoreKeywordMatch(\n userText,\n config.imperativeVerbs,\n \"imperativeVerbs\",\n \"imperative\",\n { low: 1, high: 2 },\n { none: 0, low: 0.3, high: 0.5 },\n ),\n scoreKeywordMatch(\n userText,\n config.constraintIndicators,\n \"constraintCount\",\n \"constraints\",\n { low: 1, high: 3 },\n { none: 0, low: 0.3, high: 0.7 },\n ),\n scoreKeywordMatch(\n userText,\n config.outputFormatKeywords,\n \"outputFormat\",\n \"format\",\n { low: 1, high: 2 },\n { none: 0, low: 0.4, high: 0.7 },\n ),\n scoreKeywordMatch(\n userText,\n config.referenceKeywords,\n \"referenceComplexity\",\n \"references\",\n { low: 1, high: 2 },\n { none: 0, low: 0.3, high: 0.5 },\n ),\n scoreKeywordMatch(\n userText,\n config.negationKeywords,\n \"negationComplexity\",\n \"negation\",\n { low: 2, high: 3 },\n { none: 0, low: 0.3, high: 0.5 },\n ),\n scoreKeywordMatch(\n userText,\n config.domainSpecificKeywords,\n \"domainSpecificity\",\n \"domain-specific\",\n { low: 1, high: 2 },\n { none: 0, low: 0.5, high: 0.8 },\n ),\n ];\n\n // Score agentic task indicators — user prompt only\n // System prompt describes assistant behavior, not user's intent.\n // e.g. a coding assistant system prompt with \"edit files\" / \"fix bugs\" should NOT\n // force every request into agentic mode.\n const agenticResult = scoreAgenticTask(userText, config.agenticTaskKeywords);\n dimensions.push(agenticResult.dimensionScore);\n const agenticScore = agenticResult.agenticScore;\n\n // Collect signals\n const signals = dimensions.filter((d) => d.signal !== null).map((d) => d.signal!);\n\n // Compute weighted score\n const weights = config.dimensionWeights;\n let weightedScore = 0;\n for (const d of dimensions) {\n const w = weights[d.name] ?? 0;\n weightedScore += d.score * w;\n }\n\n // Count reasoning markers for override — only check USER prompt, not system prompt\n // This prevents system prompts with \"step by step\" from triggering REASONING for simple queries\n const reasoningMatches = config.reasoningKeywords.filter((kw) =>\n userText.includes(kw.toLowerCase()),\n );\n\n // Direct reasoning override: 2+ reasoning markers = high confidence REASONING\n if (reasoningMatches.length >= 2) {\n const confidence = calibrateConfidence(\n Math.max(weightedScore, 0.3), // ensure positive for confidence calc\n config.confidenceSteepness,\n );\n return {\n score: weightedScore,\n tier: \"REASONING\",\n confidence: Math.max(confidence, 0.85),\n signals,\n agenticScore,\n dimensions,\n };\n }\n\n // Map weighted score to tier using boundaries\n const { simpleMedium, mediumComplex, complexReasoning } = config.tierBoundaries;\n let tier: Tier;\n let distanceFromBoundary: number;\n\n if (weightedScore < simpleMedium) {\n tier = \"SIMPLE\";\n distanceFromBoundary = simpleMedium - weightedScore;\n } else if (weightedScore < mediumComplex) {\n tier = \"MEDIUM\";\n distanceFromBoundary = Math.min(weightedScore - simpleMedium, mediumComplex - weightedScore);\n } else if (weightedScore < complexReasoning) {\n tier = \"COMPLEX\";\n distanceFromBoundary = Math.min(\n weightedScore - mediumComplex,\n complexReasoning - weightedScore,\n );\n } else {\n tier = \"REASONING\";\n distanceFromBoundary = weightedScore - complexReasoning;\n }\n\n // Calibrate confidence via sigmoid of distance from nearest boundary\n const confidence = calibrateConfidence(distanceFromBoundary, config.confidenceSteepness);\n\n // If confidence is below threshold → ambiguous\n if (confidence < config.confidenceThreshold) {\n return { score: weightedScore, tier: null, confidence, signals, agenticScore, dimensions };\n }\n\n return { score: weightedScore, tier, confidence, signals, agenticScore, dimensions };\n}\n\n/**\n * Sigmoid confidence calibration.\n * Maps distance from tier boundary to [0.5, 1.0] confidence range.\n */\nfunction calibrateConfidence(distance: number, steepness: number): number {\n return 1 / (1 + Math.exp(-steepness * distance));\n}\n","/**\n * Tier → Model Selection\n *\n * Maps a classification tier to the cheapest capable model.\n * Builds RoutingDecision metadata with cost estimates and savings.\n */\n\nimport type { Tier, TierConfig, RoutingDecision } from \"./types.js\";\n\nexport type ModelPricing = {\n inputPrice: number; // per 1M tokens\n outputPrice: number; // per 1M tokens\n /** Active promo flat price per request (overrides token-based pricing when set) */\n flatPrice?: number;\n};\n\nconst BASELINE_MODEL_ID = \"anthropic/claude-opus-4.7\";\n\n// Hardcoded fallback: Claude Opus 4.7 pricing (per 1M tokens)\n// Used when baseline model not found in dynamic pricing map\nconst BASELINE_INPUT_PRICE = 5.0;\nconst BASELINE_OUTPUT_PRICE = 25.0;\n\n/**\n * Select the primary model for a tier and build the RoutingDecision.\n */\nexport function selectModel(\n tier: Tier,\n confidence: number,\n method: \"rules\" | \"llm\",\n reasoning: string,\n tierConfigs: Record,\n modelPricing: Map,\n estimatedInputTokens: number,\n maxOutputTokens: number,\n routingProfile?: \"free\" | \"eco\" | \"auto\" | \"premium\",\n agenticScore?: number,\n): RoutingDecision {\n const tierConfig = tierConfigs[tier];\n const model = tierConfig.primary;\n const pricing = modelPricing.get(model);\n\n let costEstimate: number;\n if (pricing?.flatPrice !== undefined) {\n costEstimate = pricing.flatPrice;\n } else {\n const inputPrice = pricing?.inputPrice ?? 0;\n const outputPrice = pricing?.outputPrice ?? 0;\n costEstimate =\n (estimatedInputTokens / 1_000_000) * inputPrice + (maxOutputTokens / 1_000_000) * outputPrice;\n }\n\n // Baseline: what Claude Opus 4.5 would cost (the premium reference)\n const opusPricing = modelPricing.get(BASELINE_MODEL_ID);\n const opusInputPrice = opusPricing?.inputPrice ?? BASELINE_INPUT_PRICE;\n const opusOutputPrice = opusPricing?.outputPrice ?? BASELINE_OUTPUT_PRICE;\n const baselineInput = (estimatedInputTokens / 1_000_000) * opusInputPrice;\n const baselineOutput = (maxOutputTokens / 1_000_000) * opusOutputPrice;\n const baselineCost = baselineInput + baselineOutput;\n\n // Premium profile doesn't calculate savings (it's about quality, not cost)\n const savings =\n routingProfile === \"premium\"\n ? 0\n : baselineCost > 0\n ? Math.max(0, (baselineCost - costEstimate) / baselineCost)\n : 0;\n\n return {\n model,\n tier,\n confidence,\n method,\n reasoning,\n costEstimate,\n baselineCost,\n savings,\n ...(agenticScore !== undefined && { agenticScore }),\n };\n}\n\n/**\n * Get the ordered fallback chain for a tier: [primary, ...fallbacks].\n */\nexport function getFallbackChain(tier: Tier, tierConfigs: Record): string[] {\n const config = tierConfigs[tier];\n return [config.primary, ...config.fallback];\n}\n\n/**\n * Calculate cost for a specific model (used when fallback model is used).\n * Returns updated cost fields for RoutingDecision.\n */\n// Server-side margin applied to all x402 payments (must match blockrun server's MARGIN_PERCENT)\nconst SERVER_MARGIN_PERCENT = 5;\n// Minimum payment enforced by CDP Facilitator (must match blockrun server's MIN_PAYMENT_USD)\nconst MIN_PAYMENT_USD = 0.001;\n\nexport function calculateModelCost(\n model: string,\n modelPricing: Map,\n estimatedInputTokens: number,\n maxOutputTokens: number,\n routingProfile?: \"free\" | \"eco\" | \"auto\" | \"premium\",\n): { costEstimate: number; baselineCost: number; savings: number } {\n const pricing = modelPricing.get(model);\n\n let costEstimate: number;\n if (pricing?.flatPrice !== undefined) {\n // Active promo: fixed cost per request\n costEstimate = Math.max(pricing.flatPrice * (1 + SERVER_MARGIN_PERCENT / 100), MIN_PAYMENT_USD);\n } else {\n // Defensive: guard against undefined price fields (not just undefined pricing)\n const inputPrice = pricing?.inputPrice ?? 0;\n const outputPrice = pricing?.outputPrice ?? 0;\n const inputCost = (estimatedInputTokens / 1_000_000) * inputPrice;\n const outputCost = (maxOutputTokens / 1_000_000) * outputPrice;\n // Include server margin + minimum payment to match actual x402 charge\n costEstimate = Math.max(\n (inputCost + outputCost) * (1 + SERVER_MARGIN_PERCENT / 100),\n MIN_PAYMENT_USD,\n );\n }\n\n // Baseline: what Claude Opus 4.5 would cost (the premium reference)\n const opusPricing = modelPricing.get(BASELINE_MODEL_ID);\n const opusInputPrice = opusPricing?.inputPrice ?? BASELINE_INPUT_PRICE;\n const opusOutputPrice = opusPricing?.outputPrice ?? BASELINE_OUTPUT_PRICE;\n const baselineInput = (estimatedInputTokens / 1_000_000) * opusInputPrice;\n const baselineOutput = (maxOutputTokens / 1_000_000) * opusOutputPrice;\n const baselineCost = baselineInput + baselineOutput;\n\n // Premium profile doesn't calculate savings (it's about quality, not cost)\n const savings =\n routingProfile === \"premium\"\n ? 0\n : baselineCost > 0\n ? Math.max(0, (baselineCost - costEstimate) / baselineCost)\n : 0;\n\n return { costEstimate, baselineCost, savings };\n}\n\n/**\n * Filter a model list to only those that support tool calling.\n * When hasTools is false, returns the list unchanged.\n * When all models lack tool calling support, returns the full list as a fallback\n * (better to let the API error than produce an empty chain).\n */\nexport function filterByToolCalling(\n models: string[],\n hasTools: boolean,\n supportsToolCalling: (modelId: string) => boolean,\n): string[] {\n if (!hasTools) return models;\n const filtered = models.filter(supportsToolCalling);\n return filtered.length > 0 ? filtered : models;\n}\n\n/**\n * Filter a model list to only those that support vision (image inputs).\n * When hasVision is false, returns the list unchanged.\n * When all models lack vision support, returns the full list as a fallback\n * (better to let the API error than produce an empty chain).\n */\nexport function filterByVision(\n models: string[],\n hasVision: boolean,\n supportsVision: (modelId: string) => boolean,\n): string[] {\n if (!hasVision) return models;\n const filtered = models.filter(supportsVision);\n return filtered.length > 0 ? filtered : models;\n}\n\n/**\n * Filter a model list to remove user-excluded models.\n * When all models are excluded, returns the full list as a fallback\n * (same safety pattern as filterByToolCalling/filterByVision).\n */\nexport function filterByExcludeList(models: string[], excludeList: Set): string[] {\n if (excludeList.size === 0) return models;\n const filtered = models.filter((m) => !excludeList.has(m));\n return filtered.length > 0 ? filtered : models;\n}\n\n/**\n * Get the fallback chain filtered by context length.\n * Only returns models that can handle the estimated total context.\n *\n * @param tier - The tier to get fallback chain for\n * @param tierConfigs - Tier configurations\n * @param estimatedTotalTokens - Estimated total context (input + output)\n * @param getContextWindow - Function to get context window for a model ID\n * @returns Filtered list of models that can handle the context\n */\nexport function getFallbackChainFiltered(\n tier: Tier,\n tierConfigs: Record,\n estimatedTotalTokens: number,\n getContextWindow: (modelId: string) => number | undefined,\n): string[] {\n const fullChain = getFallbackChain(tier, tierConfigs);\n\n // Filter to models that can handle the context\n const filtered = fullChain.filter((modelId) => {\n const contextWindow = getContextWindow(modelId);\n if (contextWindow === undefined) {\n // Unknown model - include it (let API reject if needed)\n return true;\n }\n // Add 10% buffer for safety\n return contextWindow >= estimatedTotalTokens * 1.1;\n });\n\n // If all models filtered out, return the original chain\n // (let the API error out - better than no options)\n if (filtered.length === 0) {\n return fullChain;\n }\n\n return filtered;\n}\n","/**\n * Router Strategy Registry\n *\n * Pluggable strategy system for request routing.\n * Default: RulesStrategy — identical to the original inline route() logic, <1ms.\n */\n\nimport type {\n Tier,\n TierConfig,\n Promotion,\n RoutingDecision,\n RouterStrategy,\n RouterOptions,\n} from \"./types.js\";\nimport { classifyByRules } from \"./rules.js\";\nimport { selectModel } from \"./selector.js\";\n\n/**\n * Apply active time-windowed promotions to tier configs.\n * Returns a new tierConfigs object with promotion overrides merged in.\n * Expired or not-yet-active promotions are ignored.\n */\nfunction applyPromotions(\n tierConfigs: Record,\n promotions: Promotion[] | undefined,\n profile: \"auto\" | \"eco\" | \"premium\" | \"agentic\",\n now: Date = new Date(),\n): Record {\n if (!promotions || promotions.length === 0) return tierConfigs;\n\n let result = tierConfigs;\n for (const promo of promotions) {\n // Check time window\n const start = new Date(promo.startDate);\n const end = new Date(promo.endDate);\n if (now < start || now >= end) continue;\n\n // Check profile filter\n if (promo.profiles && !promo.profiles.includes(profile)) continue;\n\n // Shallow-clone on first mutation\n if (result === tierConfigs) {\n result = { ...tierConfigs };\n for (const t of Object.keys(result) as Tier[]) {\n result[t] = { ...result[t] };\n }\n }\n\n // Merge overrides\n for (const [tier, override] of Object.entries(promo.tierOverrides) as [\n Tier,\n Partial,\n ][]) {\n if (!result[tier]) continue;\n if (override.primary) result[tier].primary = override.primary;\n if (override.fallback) result[tier].fallback = override.fallback;\n }\n }\n\n return result;\n}\n\n/**\n * Rules-based routing strategy.\n * Extracted from the original route() in index.ts — logic is identical.\n * Attaches tierConfigs and profile to the decision for downstream use.\n */\nexport class RulesStrategy implements RouterStrategy {\n readonly name = \"rules\";\n\n route(\n prompt: string,\n systemPrompt: string | undefined,\n maxOutputTokens: number,\n options: RouterOptions,\n ): RoutingDecision {\n const { config, modelPricing } = options;\n\n // Estimate input tokens (~4 chars per token)\n const fullText = `${systemPrompt ?? \"\"} ${prompt}`;\n const estimatedTokens = Math.ceil(fullText.length / 4);\n\n // --- Rule-based classification (runs first to get agenticScore) ---\n const ruleResult = classifyByRules(prompt, systemPrompt, estimatedTokens, config.scoring);\n\n // --- Select tier configs based on routing profile ---\n const { routingProfile } = options;\n let tierConfigs: Record;\n let profileSuffix: string;\n let profile: RoutingDecision[\"profile\"];\n\n if (routingProfile === \"eco\") {\n // `ecoTiers: null` explicitly disables the special eco tier set while\n // keeping eco routing semantics. Fall back to regular tiers instead of\n // dropping into auto routing (which could select agentic tiers).\n tierConfigs = config.ecoTiers ?? config.tiers;\n profileSuffix = config.ecoTiers ? \" | eco\" : \" | eco (default tiers)\";\n profile = \"eco\";\n } else if (routingProfile === \"premium\") {\n // `premiumTiers: null` disables the premium-specific tier set but the\n // request is still a premium-profile request, so use regular tiers while\n // preserving premium metadata/cost semantics.\n tierConfigs = config.premiumTiers ?? config.tiers;\n profileSuffix = config.premiumTiers ? \" | premium\" : \" | premium (default tiers)\";\n profile = \"premium\";\n } else {\n // Auto profile (or undefined): intelligent routing with agentic detection.\n //\n // `agenticMode` semantics:\n // - `true` → force agentic tiers (ignore heuristics)\n // - `false` → disable agentic tiers entirely (even if tools are present)\n // - `undefined` → auto-detect via heuristics (tools present OR high agenticScore)\n const agenticScore = ruleResult.agenticScore ?? 0;\n const isAutoAgentic = agenticScore >= 0.5;\n const agenticModeSetting = config.overrides.agenticMode;\n const hasToolsInRequest = options.hasTools ?? false;\n let useAgenticTiers: boolean;\n if (agenticModeSetting === false) {\n // Explicitly disabled — never use agentic tiers\n useAgenticTiers = false;\n } else if (agenticModeSetting === true) {\n // Explicitly enabled — use agentic tiers if available\n useAgenticTiers = config.agenticTiers != null;\n } else {\n // Auto-detect\n useAgenticTiers = (hasToolsInRequest || isAutoAgentic) && config.agenticTiers != null;\n }\n tierConfigs = useAgenticTiers ? config.agenticTiers! : config.tiers;\n profileSuffix = useAgenticTiers ? ` | agentic${hasToolsInRequest ? \" (tools)\" : \"\"}` : \"\";\n profile = useAgenticTiers ? \"agentic\" : \"auto\";\n }\n\n // Apply time-windowed promotions\n tierConfigs = applyPromotions(tierConfigs, config.promotions, profile!, options.now);\n\n const agenticScoreValue = ruleResult.agenticScore;\n\n // --- Override: large context → force COMPLEX ---\n if (estimatedTokens > config.overrides.maxTokensForceComplex) {\n const decision = selectModel(\n \"COMPLEX\",\n 0.95,\n \"rules\",\n `Input exceeds ${config.overrides.maxTokensForceComplex} tokens${profileSuffix}`,\n tierConfigs,\n modelPricing,\n estimatedTokens,\n maxOutputTokens,\n routingProfile,\n agenticScoreValue,\n );\n return { ...decision, tierConfigs, profile };\n }\n\n // Structured output detection\n const hasStructuredOutput = systemPrompt ? /json|structured|schema/i.test(systemPrompt) : false;\n\n let tier: Tier;\n let confidence: number;\n const method: \"rules\" | \"llm\" = \"rules\";\n let reasoning = `score=${ruleResult.score.toFixed(2)} | ${ruleResult.signals.join(\", \")}`;\n\n if (ruleResult.tier !== null) {\n tier = ruleResult.tier;\n confidence = ruleResult.confidence;\n } else {\n // Ambiguous — default to configurable tier (no external API call)\n tier = config.overrides.ambiguousDefaultTier;\n confidence = 0.5;\n reasoning += ` | ambiguous -> default: ${tier}`;\n }\n\n // Apply structured output minimum tier\n if (hasStructuredOutput) {\n const tierRank: Record = { SIMPLE: 0, MEDIUM: 1, COMPLEX: 2, REASONING: 3 };\n const minTier = config.overrides.structuredOutputMinTier;\n if (tierRank[tier] < tierRank[minTier]) {\n reasoning += ` | upgraded to ${minTier} (structured output)`;\n tier = minTier;\n }\n }\n\n // Add routing profile suffix to reasoning\n reasoning += profileSuffix;\n\n const decision = selectModel(\n tier,\n confidence,\n method,\n reasoning,\n tierConfigs,\n modelPricing,\n estimatedTokens,\n maxOutputTokens,\n routingProfile,\n agenticScoreValue,\n );\n return { ...decision, tierConfigs, profile };\n }\n}\n\n// --- Strategy Registry ---\n\nconst registry = new Map();\nregistry.set(\"rules\", new RulesStrategy());\n\nexport function getStrategy(name: string): RouterStrategy {\n const strategy = registry.get(name);\n if (!strategy) {\n throw new Error(`Unknown routing strategy: ${name}`);\n }\n return strategy;\n}\n\nexport function registerStrategy(strategy: RouterStrategy): void {\n registry.set(strategy.name, strategy);\n}\n","/**\n * Default Routing Config\n *\n * All routing parameters as a TypeScript constant.\n * Operators override via openclaw.yaml plugin config.\n *\n * Scoring uses 14 weighted dimensions with sigmoid confidence calibration.\n */\n\nimport type { RoutingConfig } from \"./types.js\";\n\nexport const DEFAULT_ROUTING_CONFIG: RoutingConfig = {\n version: \"2.0\",\n\n classifier: {\n llmModel: \"google/gemini-2.5-flash\",\n llmMaxTokens: 10,\n llmTemperature: 0,\n promptTruncationChars: 500,\n cacheTtlMs: 3_600_000, // 1 hour\n },\n\n scoring: {\n tokenCountThresholds: { simple: 50, complex: 500 },\n\n // Multilingual keywords: EN + ZH + JA + RU + DE + ES + PT + KO + AR\n codeKeywords: [\n // English\n \"function\",\n \"class\",\n \"import\",\n \"def\",\n \"SELECT\",\n \"async\",\n \"await\",\n \"const\",\n \"let\",\n \"var\",\n \"return\",\n \"```\",\n // Chinese\n \"函数\",\n \"类\",\n \"导入\",\n \"定义\",\n \"查询\",\n \"异步\",\n \"等待\",\n \"常量\",\n \"变量\",\n \"返回\",\n // Japanese\n \"関数\",\n \"クラス\",\n \"インポート\",\n \"非同期\",\n \"定数\",\n \"変数\",\n // Russian\n \"функция\",\n \"класс\",\n \"импорт\",\n \"определ\",\n \"запрос\",\n \"асинхронный\",\n \"ожидать\",\n \"константа\",\n \"переменная\",\n \"вернуть\",\n // German\n \"funktion\",\n \"klasse\",\n \"importieren\",\n \"definieren\",\n \"abfrage\",\n \"asynchron\",\n \"erwarten\",\n \"konstante\",\n \"variable\",\n \"zurückgeben\",\n // Spanish\n \"función\",\n \"clase\",\n \"importar\",\n \"definir\",\n \"consulta\",\n \"asíncrono\",\n \"esperar\",\n \"constante\",\n \"variable\",\n \"retornar\",\n // Portuguese\n \"função\",\n \"classe\",\n \"importar\",\n \"definir\",\n \"consulta\",\n \"assíncrono\",\n \"aguardar\",\n \"constante\",\n \"variável\",\n \"retornar\",\n // Korean\n \"함수\",\n \"클래스\",\n \"가져오기\",\n \"정의\",\n \"쿼리\",\n \"비동기\",\n \"대기\",\n \"상수\",\n \"변수\",\n \"반환\",\n // Arabic\n \"دالة\",\n \"فئة\",\n \"استيراد\",\n \"تعريف\",\n \"استعلام\",\n \"غير متزامن\",\n \"انتظار\",\n \"ثابت\",\n \"متغير\",\n \"إرجاع\",\n ],\n reasoningKeywords: [\n // English\n \"prove\",\n \"theorem\",\n \"derive\",\n \"step by step\",\n \"chain of thought\",\n \"formally\",\n \"mathematical\",\n \"proof\",\n \"logically\",\n // Chinese\n \"证明\",\n \"定理\",\n \"推导\",\n \"逐步\",\n \"思维链\",\n \"形式化\",\n \"数学\",\n \"逻辑\",\n // Japanese\n \"証明\",\n \"定理\",\n \"導出\",\n \"ステップバイステップ\",\n \"論理的\",\n // Russian\n \"доказать\",\n \"докажи\",\n \"доказательств\",\n \"теорема\",\n \"вывести\",\n \"шаг за шагом\",\n \"пошагово\",\n \"поэтапно\",\n \"цепочка рассуждений\",\n \"рассуждени\",\n \"формально\",\n \"математически\",\n \"логически\",\n // German\n \"beweisen\",\n \"beweis\",\n \"theorem\",\n \"ableiten\",\n \"schritt für schritt\",\n \"gedankenkette\",\n \"formal\",\n \"mathematisch\",\n \"logisch\",\n // Spanish\n \"demostrar\",\n \"teorema\",\n \"derivar\",\n \"paso a paso\",\n \"cadena de pensamiento\",\n \"formalmente\",\n \"matemático\",\n \"prueba\",\n \"lógicamente\",\n // Portuguese\n \"provar\",\n \"teorema\",\n \"derivar\",\n \"passo a passo\",\n \"cadeia de pensamento\",\n \"formalmente\",\n \"matemático\",\n \"prova\",\n \"logicamente\",\n // Korean\n \"증명\",\n \"정리\",\n \"도출\",\n \"단계별\",\n \"사고의 연쇄\",\n \"형식적\",\n \"수학적\",\n \"논리적\",\n // Arabic\n \"إثبات\",\n \"نظرية\",\n \"اشتقاق\",\n \"خطوة بخطوة\",\n \"سلسلة التفكير\",\n \"رسمياً\",\n \"رياضي\",\n \"برهان\",\n \"منطقياً\",\n ],\n simpleKeywords: [\n // English\n \"what is\",\n \"define\",\n \"translate\",\n \"hello\",\n \"yes or no\",\n \"capital of\",\n \"how old\",\n \"who is\",\n \"when was\",\n // Chinese\n \"什么是\",\n \"定义\",\n \"翻译\",\n \"你好\",\n \"是否\",\n \"首都\",\n \"多大\",\n \"谁是\",\n \"何时\",\n // Japanese\n \"とは\",\n \"定義\",\n \"翻訳\",\n \"こんにちは\",\n \"はいかいいえ\",\n \"首都\",\n \"誰\",\n // Russian\n \"что такое\",\n \"определение\",\n \"перевести\",\n \"переведи\",\n \"привет\",\n \"да или нет\",\n \"столица\",\n \"сколько лет\",\n \"кто такой\",\n \"когда\",\n \"объясни\",\n // German\n \"was ist\",\n \"definiere\",\n \"übersetze\",\n \"hallo\",\n \"ja oder nein\",\n \"hauptstadt\",\n \"wie alt\",\n \"wer ist\",\n \"wann\",\n \"erkläre\",\n // Spanish\n \"qué es\",\n \"definir\",\n \"traducir\",\n \"hola\",\n \"sí o no\",\n \"capital de\",\n \"cuántos años\",\n \"quién es\",\n \"cuándo\",\n // Portuguese\n \"o que é\",\n \"definir\",\n \"traduzir\",\n \"olá\",\n \"sim ou não\",\n \"capital de\",\n \"quantos anos\",\n \"quem é\",\n \"quando\",\n // Korean\n \"무엇\",\n \"정의\",\n \"번역\",\n \"안녕하세요\",\n \"예 또는 아니오\",\n \"수도\",\n \"누구\",\n \"언제\",\n // Arabic\n \"ما هو\",\n \"تعريف\",\n \"ترجم\",\n \"مرحبا\",\n \"نعم أو لا\",\n \"عاصمة\",\n \"من هو\",\n \"متى\",\n ],\n technicalKeywords: [\n // English\n \"algorithm\",\n \"optimize\",\n \"architecture\",\n \"distributed\",\n \"kubernetes\",\n \"microservice\",\n \"database\",\n \"infrastructure\",\n // Chinese\n \"算法\",\n \"优化\",\n \"架构\",\n \"分布式\",\n \"微服务\",\n \"数据库\",\n \"基础设施\",\n // Japanese\n \"アルゴリズム\",\n \"最適化\",\n \"アーキテクチャ\",\n \"分散\",\n \"マイクロサービス\",\n \"データベース\",\n // Russian\n \"алгоритм\",\n \"оптимизировать\",\n \"оптимизаци\",\n \"оптимизируй\",\n \"архитектура\",\n \"распределённый\",\n \"микросервис\",\n \"база данных\",\n \"инфраструктура\",\n // German\n \"algorithmus\",\n \"optimieren\",\n \"architektur\",\n \"verteilt\",\n \"kubernetes\",\n \"mikroservice\",\n \"datenbank\",\n \"infrastruktur\",\n // Spanish\n \"algoritmo\",\n \"optimizar\",\n \"arquitectura\",\n \"distribuido\",\n \"microservicio\",\n \"base de datos\",\n \"infraestructura\",\n // Portuguese\n \"algoritmo\",\n \"otimizar\",\n \"arquitetura\",\n \"distribuído\",\n \"microsserviço\",\n \"banco de dados\",\n \"infraestrutura\",\n // Korean\n \"알고리즘\",\n \"최적화\",\n \"아키텍처\",\n \"분산\",\n \"마이크로서비스\",\n \"데이터베이스\",\n \"인프라\",\n // Arabic\n \"خوارزمية\",\n \"تحسين\",\n \"بنية\",\n \"موزع\",\n \"خدمة مصغرة\",\n \"قاعدة بيانات\",\n \"بنية تحتية\",\n ],\n creativeKeywords: [\n // English\n \"story\",\n \"poem\",\n \"compose\",\n \"brainstorm\",\n \"creative\",\n \"imagine\",\n \"write a\",\n // Chinese\n \"故事\",\n \"诗\",\n \"创作\",\n \"头脑风暴\",\n \"创意\",\n \"想象\",\n \"写一个\",\n // Japanese\n \"物語\",\n \"詩\",\n \"作曲\",\n \"ブレインストーム\",\n \"創造的\",\n \"想像\",\n // Russian\n \"история\",\n \"рассказ\",\n \"стихотворение\",\n \"сочинить\",\n \"сочини\",\n \"мозговой штурм\",\n \"творческий\",\n \"представить\",\n \"придумай\",\n \"напиши\",\n // German\n \"geschichte\",\n \"gedicht\",\n \"komponieren\",\n \"brainstorming\",\n \"kreativ\",\n \"vorstellen\",\n \"schreibe\",\n \"erzählung\",\n // Spanish\n \"historia\",\n \"poema\",\n \"componer\",\n \"lluvia de ideas\",\n \"creativo\",\n \"imaginar\",\n \"escribe\",\n // Portuguese\n \"história\",\n \"poema\",\n \"compor\",\n \"criativo\",\n \"imaginar\",\n \"escreva\",\n // Korean\n \"이야기\",\n \"시\",\n \"작곡\",\n \"브레인스토밍\",\n \"창의적\",\n \"상상\",\n \"작성\",\n // Arabic\n \"قصة\",\n \"قصيدة\",\n \"تأليف\",\n \"عصف ذهني\",\n \"إبداعي\",\n \"تخيل\",\n \"اكتب\",\n ],\n\n // New dimension keyword lists (multilingual)\n imperativeVerbs: [\n // English\n \"build\",\n \"create\",\n \"implement\",\n \"design\",\n \"develop\",\n \"construct\",\n \"generate\",\n \"deploy\",\n \"configure\",\n \"set up\",\n // Chinese\n \"构建\",\n \"创建\",\n \"实现\",\n \"设计\",\n \"开发\",\n \"生成\",\n \"部署\",\n \"配置\",\n \"设置\",\n // Japanese\n \"構築\",\n \"作成\",\n \"実装\",\n \"設計\",\n \"開発\",\n \"生成\",\n \"デプロイ\",\n \"設定\",\n // Russian\n \"построить\",\n \"построй\",\n \"создать\",\n \"создай\",\n \"реализовать\",\n \"реализуй\",\n \"спроектировать\",\n \"разработать\",\n \"разработай\",\n \"сконструировать\",\n \"сгенерировать\",\n \"сгенерируй\",\n \"развернуть\",\n \"разверни\",\n \"настроить\",\n \"настрой\",\n // German\n \"erstellen\",\n \"bauen\",\n \"implementieren\",\n \"entwerfen\",\n \"entwickeln\",\n \"konstruieren\",\n \"generieren\",\n \"bereitstellen\",\n \"konfigurieren\",\n \"einrichten\",\n // Spanish\n \"construir\",\n \"crear\",\n \"implementar\",\n \"diseñar\",\n \"desarrollar\",\n \"generar\",\n \"desplegar\",\n \"configurar\",\n // Portuguese\n \"construir\",\n \"criar\",\n \"implementar\",\n \"projetar\",\n \"desenvolver\",\n \"gerar\",\n \"implantar\",\n \"configurar\",\n // Korean\n \"구축\",\n \"생성\",\n \"구현\",\n \"설계\",\n \"개발\",\n \"배포\",\n \"설정\",\n // Arabic\n \"بناء\",\n \"إنشاء\",\n \"تنفيذ\",\n \"تصميم\",\n \"تطوير\",\n \"توليد\",\n \"نشر\",\n \"إعداد\",\n ],\n constraintIndicators: [\n // English\n \"under\",\n \"at most\",\n \"at least\",\n \"within\",\n \"no more than\",\n \"o(\",\n \"maximum\",\n \"minimum\",\n \"limit\",\n \"budget\",\n // Chinese\n \"不超过\",\n \"至少\",\n \"最多\",\n \"在内\",\n \"最大\",\n \"最小\",\n \"限制\",\n \"预算\",\n // Japanese\n \"以下\",\n \"最大\",\n \"最小\",\n \"制限\",\n \"予算\",\n // Russian\n \"не более\",\n \"не менее\",\n \"как минимум\",\n \"в пределах\",\n \"максимум\",\n \"минимум\",\n \"ограничение\",\n \"бюджет\",\n // German\n \"höchstens\",\n \"mindestens\",\n \"innerhalb\",\n \"nicht mehr als\",\n \"maximal\",\n \"minimal\",\n \"grenze\",\n \"budget\",\n // Spanish\n \"como máximo\",\n \"al menos\",\n \"dentro de\",\n \"no más de\",\n \"máximo\",\n \"mínimo\",\n \"límite\",\n \"presupuesto\",\n // Portuguese\n \"no máximo\",\n \"pelo menos\",\n \"dentro de\",\n \"não mais que\",\n \"máximo\",\n \"mínimo\",\n \"limite\",\n \"orçamento\",\n // Korean\n \"이하\",\n \"이상\",\n \"최대\",\n \"최소\",\n \"제한\",\n \"예산\",\n // Arabic\n \"على الأكثر\",\n \"على الأقل\",\n \"ضمن\",\n \"لا يزيد عن\",\n \"أقصى\",\n \"أدنى\",\n \"حد\",\n \"ميزانية\",\n ],\n outputFormatKeywords: [\n // English\n \"json\",\n \"yaml\",\n \"xml\",\n \"table\",\n \"csv\",\n \"markdown\",\n \"schema\",\n \"format as\",\n \"structured\",\n // Chinese\n \"表格\",\n \"格式化为\",\n \"结构化\",\n // Japanese\n \"テーブル\",\n \"フォーマット\",\n \"構造化\",\n // Russian\n \"таблица\",\n \"форматировать как\",\n \"структурированный\",\n // German\n \"tabelle\",\n \"formatieren als\",\n \"strukturiert\",\n // Spanish\n \"tabla\",\n \"formatear como\",\n \"estructurado\",\n // Portuguese\n \"tabela\",\n \"formatar como\",\n \"estruturado\",\n // Korean\n \"테이블\",\n \"형식\",\n \"구조화\",\n // Arabic\n \"جدول\",\n \"تنسيق\",\n \"منظم\",\n ],\n referenceKeywords: [\n // English\n \"above\",\n \"below\",\n \"previous\",\n \"following\",\n \"the docs\",\n \"the api\",\n \"the code\",\n \"earlier\",\n \"attached\",\n // Chinese\n \"上面\",\n \"下面\",\n \"之前\",\n \"接下来\",\n \"文档\",\n \"代码\",\n \"附件\",\n // Japanese\n \"上記\",\n \"下記\",\n \"前の\",\n \"次の\",\n \"ドキュメント\",\n \"コード\",\n // Russian\n \"выше\",\n \"ниже\",\n \"предыдущий\",\n \"следующий\",\n \"документация\",\n \"код\",\n \"ранее\",\n \"вложение\",\n // German\n \"oben\",\n \"unten\",\n \"vorherige\",\n \"folgende\",\n \"dokumentation\",\n \"der code\",\n \"früher\",\n \"anhang\",\n // Spanish\n \"arriba\",\n \"abajo\",\n \"anterior\",\n \"siguiente\",\n \"documentación\",\n \"el código\",\n \"adjunto\",\n // Portuguese\n \"acima\",\n \"abaixo\",\n \"anterior\",\n \"seguinte\",\n \"documentação\",\n \"o código\",\n \"anexo\",\n // Korean\n \"위\",\n \"아래\",\n \"이전\",\n \"다음\",\n \"문서\",\n \"코드\",\n \"첨부\",\n // Arabic\n \"أعلاه\",\n \"أدناه\",\n \"السابق\",\n \"التالي\",\n \"الوثائق\",\n \"الكود\",\n \"مرفق\",\n ],\n negationKeywords: [\n // English\n \"don't\",\n \"do not\",\n \"avoid\",\n \"never\",\n \"without\",\n \"except\",\n \"exclude\",\n \"no longer\",\n // Chinese\n \"不要\",\n \"避免\",\n \"从不\",\n \"没有\",\n \"除了\",\n \"排除\",\n // Japanese\n \"しないで\",\n \"避ける\",\n \"決して\",\n \"なしで\",\n \"除く\",\n // Russian\n \"не делай\",\n \"не надо\",\n \"нельзя\",\n \"избегать\",\n \"никогда\",\n \"без\",\n \"кроме\",\n \"исключить\",\n \"больше не\",\n // German\n \"nicht\",\n \"vermeide\",\n \"niemals\",\n \"ohne\",\n \"außer\",\n \"ausschließen\",\n \"nicht mehr\",\n // Spanish\n \"no hagas\",\n \"evitar\",\n \"nunca\",\n \"sin\",\n \"excepto\",\n \"excluir\",\n // Portuguese\n \"não faça\",\n \"evitar\",\n \"nunca\",\n \"sem\",\n \"exceto\",\n \"excluir\",\n // Korean\n \"하지 마\",\n \"피하다\",\n \"절대\",\n \"없이\",\n \"제외\",\n // Arabic\n \"لا تفعل\",\n \"تجنب\",\n \"أبداً\",\n \"بدون\",\n \"باستثناء\",\n \"استبعاد\",\n ],\n domainSpecificKeywords: [\n // English\n \"quantum\",\n \"fpga\",\n \"vlsi\",\n \"risc-v\",\n \"asic\",\n \"photonics\",\n \"genomics\",\n \"proteomics\",\n \"topological\",\n \"homomorphic\",\n \"zero-knowledge\",\n \"lattice-based\",\n // Chinese\n \"量子\",\n \"光子学\",\n \"基因组学\",\n \"蛋白质组学\",\n \"拓扑\",\n \"同态\",\n \"零知识\",\n \"格密码\",\n // Japanese\n \"量子\",\n \"フォトニクス\",\n \"ゲノミクス\",\n \"トポロジカル\",\n // Russian\n \"квантовый\",\n \"фотоника\",\n \"геномика\",\n \"протеомика\",\n \"топологический\",\n \"гомоморфный\",\n \"с нулевым разглашением\",\n \"на основе решёток\",\n // German\n \"quanten\",\n \"photonik\",\n \"genomik\",\n \"proteomik\",\n \"topologisch\",\n \"homomorph\",\n \"zero-knowledge\",\n \"gitterbasiert\",\n // Spanish\n \"cuántico\",\n \"fotónica\",\n \"genómica\",\n \"proteómica\",\n \"topológico\",\n \"homomórfico\",\n // Portuguese\n \"quântico\",\n \"fotônica\",\n \"genômica\",\n \"proteômica\",\n \"topológico\",\n \"homomórfico\",\n // Korean\n \"양자\",\n \"포토닉스\",\n \"유전체학\",\n \"위상\",\n \"동형\",\n // Arabic\n \"كمي\",\n \"ضوئيات\",\n \"جينوميات\",\n \"طوبولوجي\",\n \"تماثلي\",\n ],\n\n // Agentic task keywords - file ops, execution, multi-step, iterative work\n // Pruned: removed overly common words like \"then\", \"first\", \"run\", \"test\", \"build\"\n agenticTaskKeywords: [\n // English - File operations (clearly agentic)\n \"read file\",\n \"read the file\",\n \"look at\",\n \"check the\",\n \"open the\",\n \"edit\",\n \"modify\",\n \"update the\",\n \"change the\",\n \"write to\",\n \"create file\",\n // English - Execution (specific commands only)\n \"execute\",\n \"deploy\",\n \"install\",\n \"npm\",\n \"pip\",\n \"compile\",\n // English - Multi-step patterns (specific only)\n \"after that\",\n \"and also\",\n \"once done\",\n \"step 1\",\n \"step 2\",\n // English - Iterative work\n \"fix\",\n \"debug\",\n \"until it works\",\n \"keep trying\",\n \"iterate\",\n \"make sure\",\n \"verify\",\n \"confirm\",\n // Chinese (keep specific ones)\n \"读取文件\",\n \"查看\",\n \"打开\",\n \"编辑\",\n \"修改\",\n \"更新\",\n \"创建\",\n \"执行\",\n \"部署\",\n \"安装\",\n \"第一步\",\n \"第二步\",\n \"修复\",\n \"调试\",\n \"直到\",\n \"确认\",\n \"验证\",\n // Spanish\n \"leer archivo\",\n \"editar\",\n \"modificar\",\n \"actualizar\",\n \"ejecutar\",\n \"desplegar\",\n \"instalar\",\n \"paso 1\",\n \"paso 2\",\n \"arreglar\",\n \"depurar\",\n \"verificar\",\n // Portuguese\n \"ler arquivo\",\n \"editar\",\n \"modificar\",\n \"atualizar\",\n \"executar\",\n \"implantar\",\n \"instalar\",\n \"passo 1\",\n \"passo 2\",\n \"corrigir\",\n \"depurar\",\n \"verificar\",\n // Korean\n \"파일 읽기\",\n \"편집\",\n \"수정\",\n \"업데이트\",\n \"실행\",\n \"배포\",\n \"설치\",\n \"단계 1\",\n \"단계 2\",\n \"디버그\",\n \"확인\",\n // Arabic\n \"قراءة ملف\",\n \"تحرير\",\n \"تعديل\",\n \"تحديث\",\n \"تنفيذ\",\n \"نشر\",\n \"تثبيت\",\n \"الخطوة 1\",\n \"الخطوة 2\",\n \"إصلاح\",\n \"تصحيح\",\n \"تحقق\",\n ],\n\n // Dimension weights (sum to 1.0)\n dimensionWeights: {\n tokenCount: 0.08,\n codePresence: 0.15,\n reasoningMarkers: 0.18,\n technicalTerms: 0.1,\n creativeMarkers: 0.05,\n simpleIndicators: 0.02, // Reduced from 0.12 to make room for agenticTask\n multiStepPatterns: 0.12,\n questionComplexity: 0.05,\n imperativeVerbs: 0.03,\n constraintCount: 0.04,\n outputFormat: 0.03,\n referenceComplexity: 0.02,\n negationComplexity: 0.01,\n domainSpecificity: 0.02,\n agenticTask: 0.04, // Reduced - agentic signals influence tier selection, not dominate it\n },\n\n // Tier boundaries on weighted score axis\n tierBoundaries: {\n simpleMedium: 0.0,\n mediumComplex: 0.3, // Raised from 0.18 - prevent simple tasks from reaching expensive COMPLEX tier\n complexReasoning: 0.5, // Raised from 0.4 - reserve for true reasoning tasks\n },\n\n // Sigmoid steepness for confidence calibration\n confidenceSteepness: 12,\n // Below this confidence → ambiguous (null tier)\n confidenceThreshold: 0.7,\n },\n\n // Auto (balanced) tier configs - current default smart routing\n // Benchmark-tuned 2026-03-16: balancing quality (retention) + latency\n tiers: {\n SIMPLE: {\n primary: \"google/gemini-2.5-flash\", // 1,238ms, IQ 20, 60% retention (best) — fast AND quality\n fallback: [\n \"google/gemini-3-flash-preview\", // 1,398ms, IQ 46 — smarter fallback\n \"deepseek/deepseek-chat\", // 1,431ms, IQ 32, 41% retention\n \"moonshot/kimi-k2.5\", // 1,646ms, IQ 47, strong quality\n \"google/gemini-3.1-flash-lite\", // $0.25/$1.50, 1M context — newest flash-lite\n \"google/gemini-2.5-flash-lite\", // 1,353ms, $0.10/$0.40\n \"openai/gpt-5.4-nano\", // $0.20/$1.25, 1M context\n \"xai/grok-4-fast-non-reasoning\", // 1,143ms, $0.20/$0.50 — fast fallback\n \"free/gpt-oss-120b\", // 1,252ms, FREE fallback\n ],\n },\n MEDIUM: {\n primary: \"moonshot/kimi-k2.5\", // 1,646ms, IQ 47, $0.60/$3.00 — strong tool use, quality output\n fallback: [\n \"google/gemini-3-flash-preview\", // 1,398ms, IQ 46 — nearly same IQ, faster + cheaper\n \"deepseek/deepseek-chat\", // 1,431ms, IQ 32, 41% retention\n \"google/gemini-2.5-flash\", // 1,238ms, 60% retention\n \"google/gemini-3.1-flash-lite\", // $0.25/$1.50, 1M context\n \"google/gemini-2.5-flash-lite\", // 1,353ms, $0.10/$0.40\n \"xai/grok-4-1-fast-non-reasoning\", // 1,244ms, fast fallback\n \"xai/grok-3-mini\", // 1,202ms, $0.30/$0.50\n ],\n },\n COMPLEX: {\n primary: \"google/gemini-3.1-pro\", // 1,609ms, IQ 57 — fast flagship quality\n fallback: [\n \"google/gemini-3-pro-preview\", // 1,352ms, IQ 48 — quality-first fallback\n \"google/gemini-3-flash-preview\", // 1,398ms, IQ 46 — fast + smart\n \"xai/grok-4-0709\", // 1,348ms, IQ 41\n \"google/gemini-2.5-pro\", // 1,294ms\n \"anthropic/claude-sonnet-4.6\", // 2,110ms, IQ 52 — quality fallback\n \"deepseek/deepseek-chat\", // 1,431ms, IQ 32\n \"google/gemini-2.5-flash\", // 1,238ms, IQ 20 — cheap last resort\n \"openai/gpt-5.5\", // Newest OpenAI flagship — 1M+ ctx, native agent + computer use; benchmark TBD\n \"openai/gpt-5.4\", // 6,213ms, IQ 57 — previous flagship, benchmarked\n ],\n },\n REASONING: {\n primary: \"xai/grok-4-1-fast-reasoning\", // 1,454ms, $0.20/$0.50\n fallback: [\n \"xai/grok-4-fast-reasoning\", // 1,298ms, $0.20/$0.50\n \"deepseek/deepseek-reasoner\", // V4 Flash thinking ($0.20/$0.40, 1M ctx)\n \"deepseek/deepseek-v4-pro\", // V4 Pro flagship ($0.50/$1.00 promo through 2026-05-31, list $2/$4)\n \"openai/o4-mini\", // 2,328ms ($1.10/$4.40)\n \"openai/o3\", // 2,862ms\n ],\n },\n },\n\n // Eco tier configs - absolute cheapest (blockrun/eco)\n ecoTiers: {\n SIMPLE: {\n primary: \"free/gpt-oss-120b\", // FREE! $0.00/$0.00 — heavy user default\n fallback: [\n \"free/gpt-oss-20b\", // FREE — smaller, faster\n \"free/mistral-small-4-119b\", // FREE — 114 tok/s, fastest free chat\n \"free/deepseek-v4-flash\", // FREE — 1M context, ~5x faster than v4-pro\n \"free/qwen3-next-80b-a3b-thinking\", // FREE — 116 tok/s reasoning\n \"google/gemini-3.1-flash-lite\", // $0.25/$1.50 — newest flash-lite\n \"openai/gpt-5.4-nano\", // $0.20/$1.25 — fast nano\n \"google/gemini-2.5-flash-lite\", // $0.10/$0.40\n \"xai/grok-4-fast-non-reasoning\", // $0.20/$0.50\n ],\n },\n MEDIUM: {\n primary: \"google/gemini-3.1-flash-lite\", // $0.25/$1.50 — newest flash-lite\n fallback: [\n \"openai/gpt-5.4-nano\", // $0.20/$1.25\n \"google/gemini-2.5-flash-lite\", // $0.10/$0.40\n \"xai/grok-4-fast-non-reasoning\",\n \"google/gemini-2.5-flash\",\n ],\n },\n COMPLEX: {\n primary: \"google/gemini-3.1-flash-lite\", // $0.25/$1.50\n fallback: [\n \"google/gemini-2.5-flash-lite\",\n \"xai/grok-4-0709\",\n \"google/gemini-2.5-flash\",\n \"deepseek/deepseek-chat\",\n ],\n },\n REASONING: {\n primary: \"xai/grok-4-1-fast-reasoning\", // $0.20/$0.50\n fallback: [\n \"xai/grok-4-fast-reasoning\",\n \"deepseek/deepseek-reasoner\", // V4 Flash thinking — $0.20/$0.40\n \"deepseek/deepseek-v4-pro\", // V4 Pro flagship — $0.50/$1.00 promo, post-promo $2/$4\n ],\n },\n },\n\n // Premium tier configs - best quality (blockrun/premium)\n // codex=complex coding, kimi=simple coding, sonnet=reasoning/instructions, opus=architecture/PM/audits\n premiumTiers: {\n SIMPLE: {\n primary: \"moonshot/kimi-k2.6\", // $0.95/$4.00 - Moonshot flagship (256K ctx, vision + reasoning)\n fallback: [\n \"moonshot/kimi-k2.5\", // $0.60/$3.00 - proven reliable NVIDIA fallback when Moonshot direct API falters\n \"google/gemini-2.5-flash\", // 60% retention, fast growth\n \"anthropic/claude-haiku-4.5\",\n \"google/gemini-2.5-flash-lite\",\n \"deepseek/deepseek-chat\",\n ],\n },\n MEDIUM: {\n primary: \"openai/gpt-5.3-codex\", // $1.75/$14 - 400K context, 128K output, replaces 5.2\n fallback: [\n \"moonshot/kimi-k2.6\", // Moonshot flagship\n \"moonshot/kimi-k2.5\",\n \"google/gemini-2.5-flash\", // 60% retention, good coding capability\n \"google/gemini-2.5-pro\",\n \"xai/grok-4-0709\",\n \"anthropic/claude-sonnet-4.6\",\n ],\n },\n COMPLEX: {\n primary: \"anthropic/claude-opus-4.7\", // Best quality for complex tasks\n // Fallback chain de-Gemini'd 2026-04-22: when Anthropic 503s, Gemini is\n // also prone to \"high demand\" 503s (correlated failure — everyone falls\n // back to Google at the same time). Prefer xAI Grok → Moonshot → OpenAI\n // flagship → DeepSeek → NVIDIA free instead.\n fallback: [\n \"anthropic/claude-opus-4.6\", // in-family hot swap first\n \"anthropic/claude-sonnet-4.6\",\n \"xai/grok-4-0709\", // 503-resistant flagship\n \"moonshot/kimi-k2.6\", // Moonshot flagship, independent infra\n \"moonshot/kimi-k2.5\",\n \"openai/gpt-5.5\", // Newest OpenAI flagship — 1M+ ctx, native agent + computer use\n \"openai/gpt-5.4\", // Previous flagship (slow but stable, benchmarked at 6,213ms)\n \"openai/gpt-5.3-codex\",\n \"deepseek/deepseek-chat\", // Cheap, reliable\n \"free/qwen3-coder-480b\", // NVIDIA free ultimate backstop\n ],\n },\n REASONING: {\n primary: \"anthropic/claude-sonnet-4.6\", // 2,110ms, $3/$15 - best for reasoning/instructions\n fallback: [\n \"anthropic/claude-opus-4.7\", // Flagship Opus w/ adaptive thinking\n \"anthropic/claude-opus-4.6\", // 2,139ms\n \"xai/grok-4-1-fast-reasoning\", // 1,454ms, cheap fast reasoning\n \"openai/o4-mini\", // 2,328ms ($1.10/$4.40)\n \"openai/o3\", // 2,862ms\n ],\n },\n },\n\n // Agentic tier configs - models that excel at multi-step autonomous tasks\n agenticTiers: {\n SIMPLE: {\n primary: \"openai/gpt-4o-mini\", // $0.15/$0.60 - best tool compliance at lowest cost\n fallback: [\n \"moonshot/kimi-k2.5\", // 1,646ms, strong tool use quality\n \"anthropic/claude-haiku-4.5\", // 2,305ms\n \"xai/grok-4-1-fast-non-reasoning\", // 1,244ms, fast fallback\n ],\n },\n MEDIUM: {\n primary: \"moonshot/kimi-k2.5\", // 1,646ms, $0.60/$3.00 - strong tool use, proper function calls\n fallback: [\n \"xai/grok-4-1-fast-non-reasoning\", // 1,244ms, fast fallback\n \"openai/gpt-4o-mini\", // 2,764ms, reliable tool calling\n \"anthropic/claude-haiku-4.5\", // 2,305ms\n \"deepseek/deepseek-chat\", // 1,431ms\n ],\n },\n COMPLEX: {\n primary: \"anthropic/claude-sonnet-4.6\", // 2,110ms — best agentic quality\n // Fallback chain de-Gemini'd 2026-04-22: Gemini's \"high demand\" 503s\n // correlate with Anthropic outages (everyone falls back together).\n // Prefer 503-resistant providers first.\n fallback: [\n \"anthropic/claude-opus-4.7\", // Flagship Opus — in-family hot swap\n \"anthropic/claude-opus-4.6\", // 2,139ms\n \"xai/grok-4-0709\", // 1,348ms — strong tool use, independent infra\n \"moonshot/kimi-k2.5\", // strong tool use, independent infra\n \"openai/gpt-5.5\", // Newest flagship — native agent + computer use (exactly the agentic-tier use case)\n \"openai/gpt-5.4\", // Previous flagship — 6,213ms, reliable\n \"deepseek/deepseek-chat\", // 1,431ms — cheap, reliable\n \"free/qwen3-coder-480b\", // NVIDIA free ultimate backstop\n ],\n },\n REASONING: {\n primary: \"anthropic/claude-sonnet-4.6\", // 2,110ms — strong tool use + reasoning\n fallback: [\n \"anthropic/claude-opus-4.7\", // Flagship Opus w/ adaptive thinking\n \"anthropic/claude-opus-4.6\", // 2,139ms\n \"xai/grok-4-1-fast-reasoning\", // 1,454ms\n \"deepseek/deepseek-reasoner\", // 1,454ms\n ],\n },\n },\n\n // Time-windowed promotions — auto-applied when active, ignored when expired\n promotions: [\n {\n name: \"GLM-5.1 Launch Promo ($0.001 flat)\",\n startDate: \"2026-04-01\",\n endDate: \"2026-05-01\",\n tierOverrides: {\n SIMPLE: { primary: \"zai/glm-5.1\" },\n },\n profiles: [\"auto\"], // only auto profile — eco stays free, premium stays premium\n },\n ],\n\n overrides: {\n maxTokensForceComplex: 100_000,\n structuredOutputMinTier: \"MEDIUM\",\n ambiguousDefaultTier: \"MEDIUM\",\n // agenticMode left undefined → auto-detect via tools/agenticScore.\n // Set to `true` to force agentic tiers; `false` to disable them entirely.\n },\n};\n","/**\n * Smart Router Entry Point\n *\n * Classifies requests and routes to the cheapest capable model.\n * Delegates to pluggable RouterStrategy (default: RulesStrategy, <1ms).\n */\n\nimport type { RoutingDecision, RouterOptions } from \"./types.js\";\nimport { getStrategy } from \"./strategy.js\";\n\n/**\n * Route a request to the cheapest capable model.\n * Delegates to the registered \"rules\" strategy by default.\n */\nexport function route(\n prompt: string,\n systemPrompt: string | undefined,\n maxOutputTokens: number,\n options: RouterOptions,\n): RoutingDecision {\n const strategy = getStrategy(\"rules\");\n return strategy.route(prompt, systemPrompt, maxOutputTokens, options);\n}\n\nexport { getStrategy, registerStrategy } from \"./strategy.js\";\nexport {\n getFallbackChain,\n getFallbackChainFiltered,\n filterByToolCalling,\n filterByVision,\n filterByExcludeList,\n calculateModelCost,\n} from \"./selector.js\";\nexport { DEFAULT_ROUTING_CONFIG } from \"./config.js\";\nexport type {\n RoutingDecision,\n Tier,\n RoutingConfig,\n RouterOptions,\n RouterStrategy,\n} from \"./types.js\";\nexport type { ModelPricing } from \"./selector.js\";\n","/**\n * BlockRun Model Definitions for OpenClaw\n *\n * Maps BlockRun's 55+ AI models to OpenClaw's ModelDefinitionConfig format.\n * All models use the \"openai-completions\" API since BlockRun is OpenAI-compatible.\n *\n * Pricing is in USD per 1M tokens. Operators pay these rates via x402;\n * they set their own markup when reselling to end users (Phase 2).\n */\n\nimport type { ModelDefinitionConfig, ModelProviderConfig } from \"./types.js\";\n\n/**\n * Model aliases for convenient shorthand access.\n * Users can type `/model claude` instead of `/model blockrun/anthropic/claude-sonnet-4-6`.\n */\nexport const MODEL_ALIASES: Record = {\n // Claude - flagship opus is 4.7; sonnet stays at 4.6\n claude: \"anthropic/claude-sonnet-4.6\",\n \"br-sonnet\": \"anthropic/claude-sonnet-4.6\",\n sonnet: \"anthropic/claude-sonnet-4.6\",\n \"sonnet-4\": \"anthropic/claude-sonnet-4.6\",\n \"sonnet-4.6\": \"anthropic/claude-sonnet-4.6\",\n \"sonnet-4-6\": \"anthropic/claude-sonnet-4.6\",\n opus: \"anthropic/claude-opus-4.7\",\n \"opus-4\": \"anthropic/claude-opus-4.7\",\n \"opus-4.7\": \"anthropic/claude-opus-4.7\",\n \"opus-4-7\": \"anthropic/claude-opus-4.7\",\n \"opus-4.6\": \"anthropic/claude-opus-4.6\",\n \"opus-4-6\": \"anthropic/claude-opus-4.6\",\n haiku: \"anthropic/claude-haiku-4.5\",\n // Claude - provider/shortname patterns (common in agent frameworks)\n \"anthropic/sonnet\": \"anthropic/claude-sonnet-4.6\",\n \"anthropic/opus\": \"anthropic/claude-opus-4.7\",\n \"anthropic/haiku\": \"anthropic/claude-haiku-4.5\",\n \"anthropic/claude\": \"anthropic/claude-sonnet-4.6\",\n // Backward compatibility - generic opus-4 and older flagships point at 4.7;\n // explicit version pins (claude-opus-4-6) stay on 4.6 since server still routes it.\n \"anthropic/claude-sonnet-4\": \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-sonnet-4-6\": \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-opus-4\": \"anthropic/claude-opus-4.7\",\n \"anthropic/claude-opus-4-7\": \"anthropic/claude-opus-4.7\",\n \"anthropic/claude-opus-4-6\": \"anthropic/claude-opus-4.6\",\n \"anthropic/claude-opus-4-5\": \"anthropic/claude-opus-4.5\",\n \"anthropic/claude-haiku-4\": \"anthropic/claude-haiku-4.5\",\n \"anthropic/claude-haiku-4-5\": \"anthropic/claude-haiku-4.5\",\n\n // OpenAI\n gpt: \"openai/gpt-4o\",\n gpt4: \"openai/gpt-4o\",\n gpt5: \"openai/gpt-5.5\",\n \"gpt-5.5\": \"openai/gpt-5.5\",\n \"gpt-5.4\": \"openai/gpt-5.4\",\n \"gpt-5.4-pro\": \"openai/gpt-5.4-pro\",\n \"gpt-5.4-nano\": \"openai/gpt-5.4-nano\",\n nano: \"openai/gpt-5.4-nano\",\n \"gpt-5-nano\": \"openai/gpt-5.4-nano\",\n codex: \"openai/gpt-5.3-codex\",\n mini: \"openai/gpt-4o-mini\",\n o1: \"openai/o1\",\n o3: \"openai/o3\",\n // OpenAI Codex prefix aliases (OpenClaw v2026.4.5 openai-codex/ model ID format)\n \"openai-codex/gpt-5.4-mini\": \"openai/gpt-5.4-mini\",\n \"gpt-5.4-mini\": \"openai/gpt-5.4-mini\",\n\n // DeepSeek\n deepseek: \"deepseek/deepseek-chat\",\n \"deepseek-chat\": \"deepseek/deepseek-chat\",\n reasoner: \"deepseek/deepseek-reasoner\",\n\n // Kimi / Moonshot — K2.6 is the featured flagship on BlockRun (K2.5 hidden in\n // BlockRun's UI 2026-04-28). Bare aliases now resolve to K2.6. Users who\n // explicitly pinned \"kimi-k2.5\" continue to get K2.5 (cost-stability opt-in:\n // $0.60/$3.00 vs K2.6's $0.95/$4.00). NVIDIA-hosted K2.5 was retired 2026-04-21.\n kimi: \"moonshot/kimi-k2.6\",\n moonshot: \"moonshot/kimi-k2.6\",\n \"kimi-k2\": \"moonshot/kimi-k2.6\",\n \"kimi-k2.6\": \"moonshot/kimi-k2.6\",\n \"kimi-k2.5\": \"moonshot/kimi-k2.5\",\n \"nvidia/kimi-k2.5\": \"moonshot/kimi-k2.5\",\n\n // Google\n gemini: \"google/gemini-2.5-pro\",\n flash: \"google/gemini-2.5-flash\",\n \"gemini-3.1-pro-preview\": \"google/gemini-3.1-pro\",\n \"google/gemini-3.1-pro-preview\": \"google/gemini-3.1-pro\",\n \"gemini-3.1-flash-lite\": \"google/gemini-3.1-flash-lite\",\n \"gemini-2.5-flash-lite\": \"google/gemini-2.5-flash-lite\",\n\n // xAI\n grok: \"xai/grok-3\",\n \"grok-fast\": \"xai/grok-4-fast-reasoning\",\n \"grok-code\": \"deepseek/deepseek-chat\", // was grok-code-fast-1, delisted due to poor retention\n // Delisted model redirects — full model IDs that were previously valid but removed\n \"grok-code-fast-1\": \"deepseek/deepseek-chat\", // bare alias\n \"xai/grok-code-fast-1\": \"deepseek/deepseek-chat\", // delisted 2026-03-12\n \"xai/grok-3-fast\": \"xai/grok-4-fast-reasoning\", // delisted (too expensive)\n\n // NVIDIA — backward compat aliases (nvidia/xxx → free/xxx)\n // Default free model is gpt-oss-120b (heavy user demand). New free models\n // added 2026-04-29 — deepseek-v4-pro/flash, nemotron-omni — are additions,\n // not replacements. Retired-with-redirect entries below mirror BlockRun\n // server-side decommissioning of slow models (nemotron family, etc.).\n nvidia: \"free/gpt-oss-120b\",\n \"gpt-120b\": \"free/gpt-oss-120b\",\n \"gpt-20b\": \"free/gpt-oss-20b\",\n \"nvidia/gpt-oss-120b\": \"free/gpt-oss-120b\",\n \"nvidia/gpt-oss-20b\": \"free/gpt-oss-20b\",\n \"nvidia/deepseek-v3.2\": \"free/deepseek-v4-pro\", // v3.2 phased out 2026-04-29 → v4-pro\n \"free/deepseek-v3.2\": \"free/deepseek-v4-pro\", // local pin redirect\n \"nvidia/deepseek-v4-pro\": \"free/deepseek-v4-pro\",\n \"nvidia/deepseek-v4-flash\": \"free/deepseek-v4-flash\",\n \"nvidia/nemotron-3-nano-omni-30b-a3b-reasoning\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n \"nvidia/qwen3-coder-480b\": \"free/qwen3-coder-480b\",\n \"qwen/qwen3-coder-480b-a35b-instruct\": \"free/qwen3-coder-480b\",\n \"nvidia/glm-4.7\": \"free/glm-4.7\",\n \"nvidia/llama-4-maverick\": \"free/llama-4-maverick\",\n \"nvidia/qwen3-next-80b-a3b-thinking\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/mistral-small-4-119b\": \"free/mistral-small-4-119b\",\n // Retired free IDs → successors (mirror server-side redirects)\n \"nvidia/nemotron-ultra-253b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/nemotron-3-super-120b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/nemotron-super-49b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nvidia/mistral-large-3-675b\": \"free/mistral-small-4-119b\",\n \"nvidia/devstral-2-123b\": \"free/qwen3-coder-480b\",\n \"free/nemotron-ultra-253b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"free/nemotron-3-super-120b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"free/nemotron-super-49b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"free/mistral-large-3-675b\": \"free/mistral-small-4-119b\",\n \"free/devstral-2-123b\": \"free/qwen3-coder-480b\",\n // Free model shorthand aliases\n \"deepseek-free\": \"free/deepseek-v4-pro\", // upgraded from v3.2 (2026-04-29)\n \"deepseek-v4-pro\": \"free/deepseek-v4-pro\",\n \"deepseek-v4-flash\": \"free/deepseek-v4-flash\",\n \"v4-pro\": \"free/deepseek-v4-pro\",\n \"v4-flash\": \"free/deepseek-v4-flash\",\n \"mistral-free\": \"free/mistral-small-4-119b\",\n \"glm-free\": \"free/glm-4.7\",\n \"llama-free\": \"free/llama-4-maverick\",\n \"qwen-coder\": \"free/qwen3-coder-480b\",\n \"qwen-coder-free\": \"free/qwen3-coder-480b\",\n \"qwen-thinking\": \"free/qwen3-next-80b-a3b-thinking\",\n \"qwen3-next\": \"free/qwen3-next-80b-a3b-thinking\",\n \"mistral-small\": \"free/mistral-small-4-119b\",\n // Vision-capable free model — BlockRun's first\n \"nemotron-omni\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n \"nano-omni\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n \"vision-free\": \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n // Retired shorthand aliases redirect to successors\n nemotron: \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-ultra\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-253b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-super\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-49b\": \"free/qwen3-next-80b-a3b-thinking\",\n \"nemotron-120b\": \"free/qwen3-next-80b-a3b-thinking\",\n devstral: \"free/qwen3-coder-480b\",\n \"devstral-2\": \"free/qwen3-coder-480b\",\n maverick: \"free/llama-4-maverick\",\n free: \"free/gpt-oss-120b\",\n\n // MiniMax\n minimax: \"minimax/minimax-m2.7\",\n \"minimax-m2.7\": \"minimax/minimax-m2.7\",\n \"minimax-m2.5\": \"minimax/minimax-m2.5\",\n\n // Z.AI GLM-5\n glm: \"zai/glm-5.1\",\n \"glm-5\": \"zai/glm-5\",\n \"glm-5.1\": \"zai/glm-5.1\",\n \"glm-5-turbo\": \"zai/glm-5-turbo\",\n\n // Routing profile aliases (common variations)\n \"auto-router\": \"auto\",\n router: \"auto\",\n\n // Note: auto, eco, premium are virtual routing profiles registered in BLOCKRUN_MODELS\n // They don't need aliases since they're already top-level model IDs\n\n // Image generation\n dalle: \"openai/dall-e-3\",\n \"dall-e\": \"openai/dall-e-3\",\n \"gpt-image\": \"openai/gpt-image-1\",\n \"nano-banana\": \"google/nano-banana\",\n banana: \"google/nano-banana\",\n \"banana-pro\": \"google/nano-banana-pro\",\n \"nano-banana-pro\": \"google/nano-banana-pro\",\n flux: \"black-forest/flux-1.1-pro\",\n \"flux-pro\": \"black-forest/flux-1.1-pro\",\n \"grok-imagine\": \"xai/grok-imagine-image\",\n \"grok-imagine-pro\": \"xai/grok-imagine-image-pro\",\n cogview: \"zai/cogview-4\",\n\n // Video generation\n \"grok-video\": \"xai/grok-imagine-video\",\n seedance: \"bytedance/seedance-1.5-pro\",\n \"seedance-1.5\": \"bytedance/seedance-1.5-pro\",\n \"seedance-2-fast\": \"bytedance/seedance-2.0-fast\",\n \"seedance-2\": \"bytedance/seedance-2.0\",\n};\n\n/**\n * Resolve a model alias to its full model ID.\n * Also strips \"blockrun/\" prefix for direct model paths.\n * Examples:\n * - \"claude\" -> \"anthropic/claude-sonnet-4-6\" (alias)\n * - \"blockrun/claude\" -> \"anthropic/claude-sonnet-4-6\" (alias with prefix)\n * - \"blockrun/anthropic/claude-sonnet-4-6\" -> \"anthropic/claude-sonnet-4-6\" (prefix stripped)\n * - \"openai/gpt-4o\" -> \"openai/gpt-4o\" (unchanged)\n */\nexport function resolveModelAlias(model: string): string {\n const normalized = model.trim().toLowerCase();\n const resolved = MODEL_ALIASES[normalized];\n if (resolved) return resolved;\n\n // Check with \"blockrun/\" prefix stripped\n if (normalized.startsWith(\"blockrun/\")) {\n const withoutPrefix = normalized.slice(\"blockrun/\".length);\n const resolvedWithoutPrefix = MODEL_ALIASES[withoutPrefix];\n if (resolvedWithoutPrefix) return resolvedWithoutPrefix;\n\n // Even if not an alias, strip the prefix for direct model paths\n // e.g., \"blockrun/anthropic/claude-sonnet-4-6\" -> \"anthropic/claude-sonnet-4-6\"\n return withoutPrefix;\n }\n\n // Strip \"openai/\" prefix when it wraps a virtual routing profile or alias.\n // OpenClaw sends virtual models as \"openai/eco\", \"openai/auto\", etc. because\n // the provider uses the openai-completions API type.\n if (normalized.startsWith(\"openai/\")) {\n const withoutPrefix = normalized.slice(\"openai/\".length);\n const resolvedWithoutPrefix = MODEL_ALIASES[withoutPrefix];\n if (resolvedWithoutPrefix) return resolvedWithoutPrefix;\n\n // If it's a known BlockRun virtual profile (eco, auto, premium), return bare id\n const isVirtualProfile = BLOCKRUN_MODELS.some((m) => m.id === withoutPrefix);\n if (isVirtualProfile) return withoutPrefix;\n }\n\n // Strip \"openai-codex/\" prefix (OpenClaw v2026.4.5 model ID format).\n // e.g. \"openai-codex/gpt-5.4-mini\" -> check alias, then strip prefix.\n if (normalized.startsWith(\"openai-codex/\")) {\n const withoutPrefix = normalized.slice(\"openai-codex/\".length);\n const resolvedWithoutPrefix = MODEL_ALIASES[withoutPrefix];\n if (resolvedWithoutPrefix) return resolvedWithoutPrefix;\n\n // Fall back to checking if the bare name is a known model\n const isKnownModel = BLOCKRUN_MODELS.some((m) => m.id === withoutPrefix);\n if (isKnownModel) return withoutPrefix;\n }\n\n return model;\n}\n\ntype BlockRunModel = {\n id: string;\n name: string;\n /** Model version (e.g., \"4.6\", \"3.1\", \"5.2\") for tracking updates */\n version?: string;\n inputPrice: number;\n outputPrice: number;\n contextWindow: number;\n maxOutput: number;\n reasoning?: boolean;\n vision?: boolean;\n /** Models optimized for agentic workflows (multi-step autonomous tasks) */\n agentic?: boolean;\n /**\n * Model supports OpenAI-compatible structured function/tool calling.\n * Models without this flag output tool invocations as plain text JSON,\n * which leaks raw {\"command\":\"...\"} into visible chat messages.\n * Default: false (must opt-in to prevent silent regressions on new models).\n */\n toolCalling?: boolean;\n /** Model is deprecated — will be routed to fallbackModel if set */\n deprecated?: boolean;\n /** Model ID to route to when this model is deprecated */\n fallbackModel?: string;\n /** Time-limited promotional pricing — auto-expires after endDate */\n promo?: {\n /** Flat price per request in USD (replaces token-based pricing) */\n flatPrice: number;\n /** ISO date, promo starts (inclusive). e.g. \"2026-04-01\" */\n startDate: string;\n /** ISO date, promo ends (exclusive). e.g. \"2026-04-15\" */\n endDate: string;\n };\n};\n\nexport const BLOCKRUN_MODELS: BlockRunModel[] = [\n // Smart routing meta-models — proxy replaces with actual model\n // NOTE: Model IDs are WITHOUT provider prefix (OpenClaw adds \"blockrun/\" automatically)\n {\n id: \"auto\",\n name: \"Auto (Smart Router - Balanced)\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1_050_000,\n maxOutput: 128_000,\n },\n {\n id: \"free\",\n name: \"Free → Nemotron Ultra 253B\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131_072,\n maxOutput: 16_384,\n reasoning: true,\n },\n {\n id: \"eco\",\n name: \"Eco (Smart Router - Cost Optimized)\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1_050_000,\n maxOutput: 128_000,\n },\n {\n id: \"premium\",\n name: \"Premium (Smart Router - Best Quality)\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 2_000_000,\n maxOutput: 200_000,\n },\n\n // OpenAI GPT-5 Family\n {\n id: \"openai/gpt-5.2\",\n name: \"GPT-5.2\",\n version: \"5.2\",\n inputPrice: 1.75,\n outputPrice: 14.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5-mini\",\n name: \"GPT-5 Mini\",\n version: \"5.0\",\n inputPrice: 0.25,\n outputPrice: 2.0,\n contextWindow: 200000,\n maxOutput: 65536,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5-nano\",\n name: \"GPT-5 Nano\",\n version: \"5.0\",\n inputPrice: 0.05,\n outputPrice: 0.4,\n contextWindow: 128000,\n maxOutput: 32768,\n toolCalling: true,\n deprecated: true,\n fallbackModel: \"openai/gpt-5.4-nano\",\n },\n {\n id: \"openai/gpt-5.2-pro\",\n name: \"GPT-5.2 Pro\",\n version: \"5.2\",\n inputPrice: 21.0,\n outputPrice: 168.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n toolCalling: true,\n },\n // GPT-5.5 — newest visible flagship in blockrun. First fully retrained base since\n // GPT-4.5; 1M+ context, native agent + computer use. Costs 2x gpt-5.4 — routing\n // tiers still default to gpt-5.4 because it's benchmarked; users can pin 5.5.\n {\n id: \"openai/gpt-5.5\",\n name: \"GPT-5.5\",\n version: \"5.5\",\n inputPrice: 5.0,\n outputPrice: 30.0,\n contextWindow: 1050000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n // GPT-5.4 — flagship benchmarked into routing tiers\n {\n id: \"openai/gpt-5.4\",\n name: \"GPT-5.4\",\n version: \"5.4\",\n inputPrice: 2.5,\n outputPrice: 15.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5.4-mini\",\n name: \"GPT-5.4 Mini\",\n version: \"5.4\",\n inputPrice: 0.75,\n outputPrice: 4.5,\n contextWindow: 400000,\n maxOutput: 128000,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5.4-pro\",\n name: \"GPT-5.4 Pro\",\n version: \"5.4\",\n inputPrice: 30.0,\n outputPrice: 180.0,\n contextWindow: 400000,\n maxOutput: 128000,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-5.4-nano\",\n name: \"GPT-5.4 Nano\",\n version: \"5.4\",\n inputPrice: 0.2,\n outputPrice: 1.25,\n contextWindow: 1050000,\n maxOutput: 32768,\n toolCalling: true,\n },\n\n // OpenAI GPT-5.3 Family\n {\n id: \"openai/gpt-5.3\",\n name: \"GPT-5.3\",\n version: \"5.3\",\n inputPrice: 1.75,\n outputPrice: 14.0,\n contextWindow: 128000,\n maxOutput: 16000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n\n // OpenAI Codex Family\n {\n id: \"openai/gpt-5.3-codex\",\n name: \"GPT-5.3 Codex\",\n version: \"5.3\",\n inputPrice: 1.75,\n outputPrice: 14.0,\n contextWindow: 400000,\n maxOutput: 128000,\n agentic: true,\n toolCalling: true,\n },\n\n // OpenAI GPT-4 Family\n {\n id: \"openai/gpt-4.1\",\n name: \"GPT-4.1\",\n version: \"4.1\",\n inputPrice: 2.0,\n outputPrice: 8.0,\n contextWindow: 128000,\n maxOutput: 16384,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4.1-mini\",\n name: \"GPT-4.1 Mini\",\n version: \"4.1\",\n inputPrice: 0.4,\n outputPrice: 1.6,\n contextWindow: 128000,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4.1-nano\",\n name: \"GPT-4.1 Nano\",\n version: \"4.1\",\n inputPrice: 0.1,\n outputPrice: 0.4,\n contextWindow: 128000,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4o\",\n name: \"GPT-4o\",\n version: \"4o\",\n inputPrice: 2.5,\n outputPrice: 10.0,\n contextWindow: 128000,\n maxOutput: 16384,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"openai/gpt-4o-mini\",\n name: \"GPT-4o Mini\",\n version: \"4o-mini\",\n inputPrice: 0.15,\n outputPrice: 0.6,\n contextWindow: 128000,\n maxOutput: 16384,\n toolCalling: true,\n },\n\n // OpenAI O-series (Reasoning)\n {\n id: \"openai/o1\",\n name: \"o1\",\n version: \"1\",\n inputPrice: 15.0,\n outputPrice: 60.0,\n contextWindow: 200000,\n maxOutput: 100000,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o1-mini\",\n name: \"o1-mini\",\n version: \"1-mini\",\n inputPrice: 1.1,\n outputPrice: 4.4,\n contextWindow: 128000,\n maxOutput: 65536,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o3\",\n name: \"o3\",\n version: \"3\",\n inputPrice: 2.0,\n outputPrice: 8.0,\n contextWindow: 200000,\n maxOutput: 100000,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o3-mini\",\n name: \"o3-mini\",\n version: \"3-mini\",\n inputPrice: 1.1,\n outputPrice: 4.4,\n contextWindow: 128000,\n maxOutput: 65536,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"openai/o4-mini\",\n name: \"o4-mini\",\n version: \"4-mini\",\n inputPrice: 1.1,\n outputPrice: 4.4,\n contextWindow: 128000,\n maxOutput: 65536,\n reasoning: true,\n toolCalling: true,\n },\n\n // Anthropic - all Claude models excel at agentic workflows\n // Use newest versions (4.6) with full provider prefix\n {\n id: \"anthropic/claude-haiku-4.5\",\n name: \"Claude Haiku 4.5\",\n version: \"4.5\",\n inputPrice: 1.0,\n outputPrice: 5.0,\n contextWindow: 200000,\n maxOutput: 8192,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n version: \"4.6\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 200000,\n maxOutput: 64000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-opus-4.5\",\n name: \"Claude Opus 4.5\",\n version: \"4.5\",\n inputPrice: 5.0,\n outputPrice: 25.0,\n contextWindow: 200000,\n maxOutput: 32000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-opus-4.6\",\n name: \"Claude Opus 4.6\",\n version: \"4.6\",\n inputPrice: 5.0,\n outputPrice: 25.0,\n contextWindow: 1000000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"anthropic/claude-opus-4.7\",\n name: \"Claude Opus 4.7\",\n version: \"4.7\",\n inputPrice: 5.0,\n outputPrice: 25.0,\n contextWindow: 1000000,\n maxOutput: 128000,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n\n // Google\n {\n id: \"google/gemini-3.1-pro\",\n name: \"Gemini 3.1 Pro\",\n version: \"3.1\",\n inputPrice: 2.0,\n outputPrice: 12.0,\n contextWindow: 1050000,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-3-pro-preview\",\n name: \"Gemini 3 Pro Preview\",\n version: \"3.0\",\n inputPrice: 2.0,\n outputPrice: 12.0,\n contextWindow: 1050000,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-3-flash-preview\",\n name: \"Gemini 3 Flash Preview\",\n version: \"3.0\",\n inputPrice: 0.5,\n outputPrice: 3.0,\n contextWindow: 1000000,\n maxOutput: 65536,\n vision: true,\n },\n {\n id: \"google/gemini-2.5-pro\",\n name: \"Gemini 2.5 Pro\",\n version: \"2.5\",\n inputPrice: 1.25,\n outputPrice: 10.0,\n contextWindow: 1050000,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-2.5-flash\",\n name: \"Gemini 2.5 Flash\",\n version: \"2.5\",\n inputPrice: 0.3,\n outputPrice: 2.5,\n contextWindow: 1000000,\n maxOutput: 65536,\n vision: true,\n toolCalling: true,\n },\n {\n id: \"google/gemini-2.5-flash-lite\",\n name: \"Gemini 2.5 Flash Lite\",\n version: \"2.5\",\n inputPrice: 0.1,\n outputPrice: 0.4,\n contextWindow: 1000000,\n maxOutput: 65536,\n toolCalling: true,\n },\n {\n id: \"google/gemini-3.1-flash-lite\",\n name: \"Gemini 3.1 Flash Lite\",\n version: \"3.1\",\n inputPrice: 0.25,\n outputPrice: 1.5,\n contextWindow: 1000000,\n maxOutput: 8192,\n toolCalling: true,\n },\n\n // DeepSeek\n {\n id: \"deepseek/deepseek-chat\",\n name: \"DeepSeek V3.2 Chat\",\n version: \"3.2\",\n inputPrice: 0.28,\n outputPrice: 0.42,\n contextWindow: 128000,\n maxOutput: 8192,\n toolCalling: true,\n },\n {\n id: \"deepseek/deepseek-reasoner\",\n name: \"DeepSeek V3.2 Reasoner\",\n version: \"3.2\",\n inputPrice: 0.28,\n outputPrice: 0.42,\n contextWindow: 128000,\n maxOutput: 8192,\n reasoning: true,\n toolCalling: true,\n },\n\n // Kimi K2.6 — Moonshot's current flagship (256K context, vision + reasoning). Only served via Moonshot direct API.\n {\n id: \"moonshot/kimi-k2.6\",\n name: \"Kimi K2.6\",\n version: \"k2.6\",\n inputPrice: 0.95,\n outputPrice: 4.0,\n contextWindow: 262144,\n maxOutput: 65536,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n\n // Kimi K2.5 — Moonshot direct is primary (better SLA). NVIDIA-hosted variant\n // retired 2026-04-21 (slow throughput) and now redirects to moonshot.\n {\n id: \"moonshot/kimi-k2.5\",\n name: \"Kimi K2.5\",\n version: \"k2.5\",\n inputPrice: 0.6,\n outputPrice: 3.0,\n contextWindow: 262144,\n maxOutput: 16384,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"nvidia/kimi-k2.5\",\n name: \"Kimi K2.5 (NVIDIA, retired)\",\n version: \"k2.5\",\n inputPrice: 0.6,\n outputPrice: 3.0,\n contextWindow: 262144,\n maxOutput: 8192,\n reasoning: true,\n vision: true,\n agentic: true,\n toolCalling: true,\n deprecated: true,\n fallbackModel: \"moonshot/kimi-k2.5\",\n },\n\n // xAI / Grok\n {\n id: \"xai/grok-3\",\n name: \"Grok 3\",\n version: \"3\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n // grok-3-fast removed - too expensive ($5/$25), use grok-4-fast instead\n {\n id: \"xai/grok-3-mini\",\n name: \"Grok 3 Mini\",\n version: \"3-mini\",\n inputPrice: 0.3,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n toolCalling: true,\n },\n\n // xAI Grok 4 Family - Ultra-cheap fast models\n {\n id: \"xai/grok-4-fast-reasoning\",\n name: \"Grok 4 Fast Reasoning\",\n version: \"4\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4-fast-non-reasoning\",\n name: \"Grok 4 Fast\",\n version: \"4\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4-1-fast-reasoning\",\n name: \"Grok 4.1 Fast Reasoning\",\n version: \"4.1\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4-1-fast-non-reasoning\",\n name: \"Grok 4.1 Fast\",\n version: \"4.1\",\n inputPrice: 0.2,\n outputPrice: 0.5,\n contextWindow: 131072,\n maxOutput: 16384,\n toolCalling: true,\n },\n // xai/grok-code-fast-1 delisted 2026-03-12: poor retention (coding users churn),\n // no structured tool calling, alias \"grok-code\" redirected to deepseek-chat\n {\n id: \"xai/grok-4-0709\",\n name: \"Grok 4 (0709)\",\n version: \"4-0709\",\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-2-vision\",\n name: \"Grok 2 Vision\",\n version: \"2\",\n inputPrice: 2.0,\n outputPrice: 10.0,\n contextWindow: 131072,\n maxOutput: 16384,\n vision: true,\n toolCalling: true,\n },\n\n // xAI Grok 4.20 Family (hidden in picker; explicit-only — mirrors BlockRun hidden:true)\n {\n id: \"xai/grok-4.20-reasoning\",\n name: \"Grok 4.20 Reasoning\",\n version: \"4.20\",\n inputPrice: 2.0,\n outputPrice: 6.0,\n contextWindow: 2000000,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4.20-non-reasoning\",\n name: \"Grok 4.20\",\n version: \"4.20\",\n inputPrice: 2.0,\n outputPrice: 6.0,\n contextWindow: 2000000,\n maxOutput: 16384,\n toolCalling: true,\n },\n {\n id: \"xai/grok-4.20-multi-agent\",\n name: \"Grok 4.20 Multi-Agent\",\n version: \"4.20\",\n inputPrice: 2.0,\n outputPrice: 6.0,\n contextWindow: 2000000,\n maxOutput: 16384,\n reasoning: true,\n toolCalling: true,\n },\n\n // MiniMax\n {\n id: \"minimax/minimax-m2.7\",\n name: \"MiniMax M2.7\",\n version: \"m2.7\",\n inputPrice: 0.3,\n outputPrice: 1.2,\n contextWindow: 204800,\n maxOutput: 16384,\n reasoning: true,\n agentic: true,\n toolCalling: true,\n },\n {\n id: \"minimax/minimax-m2.5\",\n name: \"MiniMax M2.5\",\n version: \"m2.5\",\n inputPrice: 0.3,\n outputPrice: 1.2,\n contextWindow: 204800,\n maxOutput: 16384,\n reasoning: true,\n agentic: true,\n toolCalling: true,\n deprecated: true,\n fallbackModel: \"minimax/minimax-m2.7\",\n },\n\n // Free models (hosted by NVIDIA, billingMode: \"free\" on server)\n // IDs use \"free/\" prefix so users see them as free in the /model picker.\n // ClawRouter maps free/xxx → nvidia/xxx before sending to BlockRun upstream\n // (see toUpstreamModelId in src/proxy.ts). BlockRun's NVIDIA_MODEL_MAP in\n // src/lib/ai-providers.ts maps known IDs to upstream NIM names; for IDs not\n // in the map, BlockRun falls through to the bare name (modelMap[k] || k),\n // so new entries here only need to match BlockRun's catalog ID — NVIDIA NIM\n // accepts the bare name directly.\n // toolCalling intentionally omitted: structured function calling unverified.\n // 2026-04-29: kept gpt-oss-120b/20b as defaults (heavy user demand); added\n // v4-pro / v4-flash (1M context, ~5x speed split) and nemotron-3-nano-omni\n // (first vision-capable free model, 256K context, accepts text/image/video/audio).\n // 2026-04-21: slimmed to 8 models, retired nemotron family + mistral-large-3-675b\n // + devstral-2-123b with successor redirects.\n {\n id: \"free/gpt-oss-120b\",\n name: \"[Free] GPT-OSS 120B\",\n version: \"120b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 128000,\n maxOutput: 16384,\n },\n {\n id: \"free/gpt-oss-20b\",\n name: \"[Free] GPT-OSS 20B\",\n version: \"20b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 128000,\n maxOutput: 16384,\n },\n {\n // V4 Pro: 1.6T MoE / 49B active, 1M context. MMLU-Pro 87.5, GPQA 90.1,\n // SWE-bench 80.6, LiveCodeBench 93.5. NIM ~150 tok/s on Blackwell.\n // Strongest free reasoning model — phases out free/deepseek-v3.2.\n id: \"free/deepseek-v4-pro\",\n name: \"[Free] DeepSeek V4 Pro\",\n version: \"v4-pro\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1000000,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n // V4 Flash: 284B / 13B active MoE, 1M context. ~5x faster than V4 Pro.\n // Strong on chat/summarization (MMLU-Pro 86.2). Caveat: weaker factual\n // recall (SimpleQA 34% vs Pro's 58%) — pick V4 Pro for fact-heavy loops.\n id: \"free/deepseek-v4-flash\",\n name: \"[Free] DeepSeek V4 Flash\",\n version: \"v4-flash\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 1000000,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/qwen3-coder-480b\",\n name: \"[Free] Qwen3 Coder 480B\",\n version: \"480b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n },\n {\n id: \"free/glm-4.7\",\n name: \"[Free] GLM-4.7\",\n version: \"4.7\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/llama-4-maverick\",\n name: \"[Free] Llama 4 Maverick\",\n version: \"4-maverick\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/qwen3-next-80b-a3b-thinking\",\n name: \"[Free] Qwen3-Next 80B Thinking\",\n version: \"80b-a3b-thinking\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n reasoning: true,\n },\n {\n id: \"free/mistral-small-4-119b\",\n name: \"[Free] Mistral Small 4 119B\",\n version: \"small-4-119b\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 131072,\n maxOutput: 16384,\n },\n {\n // Nemotron 3 Nano Omni: first vision-capable free model. 31B / 3.2B active\n // MoE, 256K context. ChartQA 90.3, DocVQA 95.6, MMMU 70.8. Accepts text,\n // images, video (up to 2min), audio (up to 1hr). Released 2026-04-27.\n id: \"free/nemotron-3-nano-omni-30b-a3b-reasoning\",\n name: \"[Free] Nemotron 3 Nano Omni\",\n version: \"30b-a3b-omni-reasoning\",\n inputPrice: 0,\n outputPrice: 0,\n contextWindow: 256000,\n maxOutput: 16384,\n reasoning: true,\n vision: true,\n },\n\n // Z.AI GLM-5 Models\n {\n id: \"zai/glm-5.1\",\n name: \"GLM-5.1\",\n version: \"5.1\",\n inputPrice: 1.4,\n outputPrice: 4.4,\n contextWindow: 200000,\n maxOutput: 128000,\n toolCalling: true,\n promo: { flatPrice: 0.001, startDate: \"2026-04-01\", endDate: \"2026-04-15\" },\n },\n {\n id: \"zai/glm-5\",\n name: \"GLM-5\",\n version: \"5\",\n inputPrice: 1.0,\n outputPrice: 3.2,\n contextWindow: 200000,\n maxOutput: 128000,\n toolCalling: true,\n promo: { flatPrice: 0.001, startDate: \"2026-04-01\", endDate: \"2026-04-15\" },\n },\n {\n id: \"zai/glm-5-turbo\",\n name: \"GLM-5 Turbo\",\n version: \"5-turbo\",\n inputPrice: 1.2,\n outputPrice: 4.0,\n contextWindow: 200000,\n maxOutput: 128000,\n toolCalling: true,\n promo: { flatPrice: 0.001, startDate: \"2026-04-01\", endDate: \"2026-04-15\" },\n },\n];\n\n/**\n * Get the active flat promo price for a model, or undefined if no promo / expired.\n */\nexport function getActivePromoPrice(\n model: BlockRunModel,\n now: Date = new Date(),\n): number | undefined {\n if (!model.promo) return undefined;\n const start = new Date(model.promo.startDate);\n const end = new Date(model.promo.endDate);\n if (now >= start && now < end) return model.promo.flatPrice;\n return undefined;\n}\n\n/**\n * Convert BlockRun model definitions to OpenClaw ModelDefinitionConfig format.\n */\nfunction toOpenClawModel(m: BlockRunModel): ModelDefinitionConfig {\n return {\n id: m.id,\n name: m.name,\n api: \"openai-completions\",\n reasoning: m.reasoning ?? false,\n input: m.vision ? [\"text\", \"image\"] : [\"text\"],\n cost: {\n input: m.inputPrice,\n output: m.outputPrice,\n cacheRead: 0,\n cacheWrite: 0,\n },\n contextWindow: m.contextWindow,\n maxTokens: m.maxOutput,\n };\n}\n\n/**\n * Alias models that map to real models.\n * These allow users to use friendly names like \"free\" or \"gpt-120b\".\n */\nconst ALIAS_MODELS: ModelDefinitionConfig[] = Object.entries(MODEL_ALIASES)\n .map(([alias, targetId]) => {\n const target = BLOCKRUN_MODELS.find((m) => m.id === targetId);\n if (!target) return null;\n return toOpenClawModel({ ...target, id: alias, name: `${alias} → ${target.name}` });\n })\n .filter((m): m is ModelDefinitionConfig => m !== null);\n\n/**\n * All BlockRun models in OpenClaw format (including aliases).\n */\nexport const OPENCLAW_MODELS: ModelDefinitionConfig[] = [\n ...BLOCKRUN_MODELS.map(toOpenClawModel),\n ...ALIAS_MODELS,\n];\n\n/**\n * Build a ModelProviderConfig for BlockRun.\n *\n * @param baseUrl - The proxy's local base URL (e.g., \"http://127.0.0.1:12345\")\n */\nexport function buildProviderModels(baseUrl: string): ModelProviderConfig {\n return {\n baseUrl: `${baseUrl}/v1`,\n api: \"openai-completions\",\n models: OPENCLAW_MODELS,\n };\n}\n\n/**\n * Check if a model is optimized for agentic workflows.\n * Agentic models continue autonomously with multi-step tasks\n * instead of stopping and waiting for user input.\n */\nexport function isAgenticModel(modelId: string): boolean {\n const model = BLOCKRUN_MODELS.find(\n (m) => m.id === modelId || m.id === modelId.replace(\"blockrun/\", \"\"),\n );\n return model?.agentic ?? false;\n}\n\n/**\n * Get all agentic-capable models.\n */\nexport function getAgenticModels(): string[] {\n return BLOCKRUN_MODELS.filter((m) => m.agentic).map((m) => m.id);\n}\n\n/**\n * Check if a model supports OpenAI-compatible structured tool/function calling.\n * Models without this flag (e.g. grok-code-fast-1) output tool invocations as\n * plain text JSON, which leaks {\"command\":\"...\"} into visible chat messages.\n */\nexport function supportsToolCalling(modelId: string): boolean {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.toolCalling ?? false;\n}\n\n/**\n * Check if a model supports vision (image inputs).\n * Models without this flag cannot process image_url content parts.\n */\nexport function supportsVision(modelId: string): boolean {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.vision ?? false;\n}\n\n/**\n * Get context window size for a model.\n * Returns undefined if model not found.\n */\nexport function getModelContextWindow(modelId: string): number | undefined {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.contextWindow;\n}\n\n/**\n * Check if a model has reasoning/thinking capabilities.\n * Reasoning models may require reasoning_content in assistant tool_call messages.\n */\nexport function isReasoningModel(modelId: string): boolean {\n const normalized = modelId.replace(\"blockrun/\", \"\");\n const model = BLOCKRUN_MODELS.find((m) => m.id === normalized);\n return model?.reasoning ?? false;\n}\n","/**\n * Usage Logger\n *\n * Logs every LLM request as a JSON line to a daily log file.\n * Files: ~/.openclaw/blockrun/logs/usage-YYYY-MM-DD.jsonl\n *\n * MVP: append-only JSON lines. No rotation, no cleanup.\n * Logging never breaks the request flow — all errors are swallowed.\n */\n\nimport { appendFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport type UsageEntry = {\n timestamp: string;\n model: string;\n tier: string;\n cost: number;\n baselineCost: number;\n savings: number; // 0-1 percentage\n latencyMs: number;\n /** Whether the request completed successfully or ended in an error */\n status?: \"success\" | \"error\";\n /** Input (prompt) tokens reported by the provider */\n inputTokens?: number;\n /** Output (completion) tokens reported by the provider */\n outputTokens?: number;\n /** Partner service ID (e.g., \"image_generation\") — only set for partner API calls */\n partnerId?: string;\n /** Partner service name (e.g., \"BlockRun\") — only set for partner API calls */\n service?: string;\n};\n\nconst LOG_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"logs\");\nlet dirReady = false;\n\nasync function ensureDir(): Promise {\n if (dirReady) return;\n await mkdir(LOG_DIR, { recursive: true });\n dirReady = true;\n}\n\n/**\n * Log a usage entry as a JSON line.\n */\nexport async function logUsage(entry: UsageEntry): Promise {\n try {\n await ensureDir();\n const date = entry.timestamp.slice(0, 10); // YYYY-MM-DD\n const file = join(LOG_DIR, `usage-${date}.jsonl`);\n await appendFile(file, JSON.stringify(entry) + \"\\n\");\n } catch {\n // Never break the request flow\n }\n}\n","/**\n * Usage Statistics Aggregator\n *\n * Reads usage log files and aggregates statistics for terminal display.\n * Supports filtering by date range and provides multiple aggregation views.\n */\n\nimport { readdir, unlink } from \"node:fs/promises\";\nimport { readTextFile } from \"./fs-read.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { UsageEntry } from \"./logger.js\";\nimport { VERSION } from \"./version.js\";\n\nconst LOG_DIR = join(homedir(), \".openclaw\", \"blockrun\", \"logs\");\n\nexport type DailyStats = {\n date: string;\n totalRequests: number;\n totalCost: number;\n totalBaselineCost: number;\n totalSavings: number;\n avgLatencyMs: number;\n byTier: Record;\n byModel: Record;\n};\n\nexport type AggregatedStats = {\n period: string;\n totalRequests: number;\n totalCost: number;\n totalBaselineCost: number;\n totalSavings: number;\n savingsPercentage: number;\n avgLatencyMs: number;\n avgCostPerRequest: number;\n byTier: Record;\n byModel: Record;\n dailyBreakdown: DailyStats[];\n entriesWithBaseline: number; // Entries with valid baseline tracking\n};\n\n/**\n * Parse a JSONL log file into usage entries.\n * Handles both old format (without tier/baselineCost) and new format.\n */\nasync function parseLogFile(filePath: string): Promise {\n try {\n const content = await readTextFile(filePath);\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n const entries: UsageEntry[] = [];\n for (const line of lines) {\n try {\n const entry = JSON.parse(line) as Partial;\n entries.push({\n timestamp: entry.timestamp || new Date().toISOString(),\n model: entry.model || \"unknown\",\n tier: entry.tier || \"UNKNOWN\",\n cost: entry.cost || 0,\n baselineCost: entry.baselineCost || entry.cost || 0,\n savings: entry.savings || 0,\n latencyMs: entry.latencyMs || 0,\n });\n } catch {\n // Skip malformed lines, keep valid ones\n }\n }\n return entries;\n } catch {\n return [];\n }\n}\n\n/**\n * Get list of available log files sorted by date (newest first).\n */\nasync function getLogFiles(): Promise {\n try {\n const files = await readdir(LOG_DIR);\n return files\n .filter((f) => f.startsWith(\"usage-\") && f.endsWith(\".jsonl\"))\n .sort()\n .reverse();\n } catch {\n return [];\n }\n}\n\n/**\n * Aggregate stats for a single day.\n */\nfunction aggregateDay(date: string, entries: UsageEntry[]): DailyStats {\n const byTier: Record = {};\n const byModel: Record = {};\n let totalLatency = 0;\n\n for (const entry of entries) {\n // By tier\n if (!byTier[entry.tier]) byTier[entry.tier] = { count: 0, cost: 0 };\n byTier[entry.tier].count++;\n byTier[entry.tier].cost += entry.cost;\n\n // By model\n if (!byModel[entry.model]) byModel[entry.model] = { count: 0, cost: 0 };\n byModel[entry.model].count++;\n byModel[entry.model].cost += entry.cost;\n\n totalLatency += entry.latencyMs;\n }\n\n const totalCost = entries.reduce((sum, e) => sum + e.cost, 0);\n const totalBaselineCost = entries.reduce((sum, e) => sum + e.baselineCost, 0);\n\n return {\n date,\n totalRequests: entries.length,\n totalCost,\n totalBaselineCost,\n totalSavings: totalBaselineCost - totalCost,\n avgLatencyMs: entries.length > 0 ? totalLatency / entries.length : 0,\n byTier,\n byModel,\n };\n}\n\n/**\n * Get aggregated statistics for the last N days.\n */\nexport async function getStats(days: number = 7): Promise {\n const logFiles = await getLogFiles();\n const filesToRead = logFiles.slice(0, days);\n\n const dailyBreakdown: DailyStats[] = [];\n const allByTier: Record = {};\n const allByModel: Record = {};\n let totalRequests = 0;\n let totalCost = 0;\n let totalBaselineCost = 0;\n let totalLatency = 0;\n\n for (const file of filesToRead) {\n const date = file.replace(\"usage-\", \"\").replace(\".jsonl\", \"\");\n const filePath = join(LOG_DIR, file);\n const entries = await parseLogFile(filePath);\n\n if (entries.length === 0) continue;\n\n const dayStats = aggregateDay(date, entries);\n dailyBreakdown.push(dayStats);\n\n totalRequests += dayStats.totalRequests;\n totalCost += dayStats.totalCost;\n totalBaselineCost += dayStats.totalBaselineCost;\n totalLatency += dayStats.avgLatencyMs * dayStats.totalRequests;\n\n // Merge tier stats\n for (const [tier, stats] of Object.entries(dayStats.byTier)) {\n if (!allByTier[tier]) allByTier[tier] = { count: 0, cost: 0 };\n allByTier[tier].count += stats.count;\n allByTier[tier].cost += stats.cost;\n }\n\n // Merge model stats\n for (const [model, stats] of Object.entries(dayStats.byModel)) {\n if (!allByModel[model]) allByModel[model] = { count: 0, cost: 0 };\n allByModel[model].count += stats.count;\n allByModel[model].cost += stats.cost;\n }\n }\n\n // Calculate percentages\n const byTierWithPercentage: Record =\n {};\n for (const [tier, stats] of Object.entries(allByTier)) {\n byTierWithPercentage[tier] = {\n ...stats,\n percentage: totalRequests > 0 ? (stats.count / totalRequests) * 100 : 0,\n };\n }\n\n const byModelWithPercentage: Record =\n {};\n for (const [model, stats] of Object.entries(allByModel)) {\n byModelWithPercentage[model] = {\n ...stats,\n percentage: totalRequests > 0 ? (stats.count / totalRequests) * 100 : 0,\n };\n }\n\n const totalSavings = totalBaselineCost - totalCost;\n const savingsPercentage = totalBaselineCost > 0 ? (totalSavings / totalBaselineCost) * 100 : 0;\n\n // Count entries with valid baseline tracking (baseline != cost means tracking was active)\n let entriesWithBaseline = 0;\n for (const day of dailyBreakdown) {\n if (day.totalBaselineCost !== day.totalCost) {\n entriesWithBaseline += day.totalRequests;\n }\n }\n\n return {\n period: days === 1 ? \"today\" : `last ${days} days`,\n totalRequests,\n totalCost,\n totalBaselineCost,\n totalSavings,\n savingsPercentage,\n avgLatencyMs: totalRequests > 0 ? totalLatency / totalRequests : 0,\n avgCostPerRequest: totalRequests > 0 ? totalCost / totalRequests : 0,\n byTier: byTierWithPercentage,\n byModel: byModelWithPercentage,\n dailyBreakdown: dailyBreakdown.reverse(), // Oldest first for charts\n entriesWithBaseline, // How many entries have valid baseline tracking\n };\n}\n\n/**\n * Format stats as ASCII table for terminal display.\n */\nexport function formatStatsAscii(stats: AggregatedStats): string {\n const lines: string[] = [];\n\n // Header\n lines.push(\"╔════════════════════════════════════════════════════════════╗\");\n lines.push(`║ XClawRouter by BlockRun v${VERSION}`.padEnd(61) + \"║\");\n lines.push(\"║ Usage Statistics ║\");\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n\n // Summary\n lines.push(`║ Period: ${stats.period.padEnd(49)}║`);\n lines.push(`║ Total Requests: ${stats.totalRequests.toString().padEnd(41)}║`);\n lines.push(`║ Total Cost: $${stats.totalCost.toFixed(4).padEnd(43)}║`);\n lines.push(`║ Baseline Cost (Opus 4.5): $${stats.totalBaselineCost.toFixed(4).padEnd(30)}║`);\n\n // Show savings with note if some entries lack baseline tracking\n const savingsLine = `║ 💰 Total Saved: $${stats.totalSavings.toFixed(4)} (${stats.savingsPercentage.toFixed(1)}%)`;\n if (stats.entriesWithBaseline < stats.totalRequests && stats.entriesWithBaseline > 0) {\n lines.push(savingsLine.padEnd(61) + \"║\");\n const note = `║ (based on ${stats.entriesWithBaseline}/${stats.totalRequests} tracked requests)`;\n lines.push(note.padEnd(61) + \"║\");\n } else {\n lines.push(savingsLine.padEnd(61) + \"║\");\n }\n lines.push(`║ Avg Latency: ${stats.avgLatencyMs.toFixed(0)}ms`.padEnd(61) + \"║\");\n\n // Tier breakdown\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n lines.push(\"║ Routing by Tier: ║\");\n\n // Show all tiers found in data, ordered by known tiers first then others\n const knownTiers = [\"SIMPLE\", \"MEDIUM\", \"COMPLEX\", \"REASONING\", \"DIRECT\"];\n const allTiers = Object.keys(stats.byTier);\n const otherTiers = allTiers.filter((t) => !knownTiers.includes(t));\n const tierOrder = [...knownTiers.filter((t) => stats.byTier[t]), ...otherTiers];\n\n for (const tier of tierOrder) {\n const data = stats.byTier[tier];\n if (data) {\n const bar = \"█\".repeat(Math.min(20, Math.round(data.percentage / 5)));\n const displayTier = tier === \"UNKNOWN\" ? \"OTHER\" : tier;\n const line = `║ ${displayTier.padEnd(10)} ${bar.padEnd(20)} ${data.percentage.toFixed(1).padStart(5)}% (${data.count})`;\n lines.push(line.padEnd(61) + \"║\");\n }\n }\n\n // Top models\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n lines.push(\"║ Top Models: ║\");\n\n const sortedModels = Object.entries(stats.byModel)\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 5);\n\n for (const [model, data] of sortedModels) {\n const shortModel = model.length > 25 ? model.slice(0, 22) + \"...\" : model;\n const line = `║ ${shortModel.padEnd(25)} ${data.count.toString().padStart(5)} reqs $${data.cost.toFixed(4)}`;\n lines.push(line.padEnd(61) + \"║\");\n }\n\n // Daily breakdown (last 7 days)\n if (stats.dailyBreakdown.length > 0) {\n lines.push(\"╠════════════════════════════════════════════════════════════╣\");\n lines.push(\"║ Daily Breakdown: ║\");\n lines.push(\"║ Date Requests Cost Saved ║\");\n\n for (const day of stats.dailyBreakdown.slice(-7)) {\n const saved = day.totalBaselineCost - day.totalCost;\n const line = `║ ${day.date} ${day.totalRequests.toString().padStart(6)} $${day.totalCost.toFixed(4).padStart(8)} $${saved.toFixed(4)}`;\n lines.push(line.padEnd(61) + \"║\");\n }\n }\n\n lines.push(\"╚════════════════════════════════════════════════════════════╝\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format per-request log entries as an ASCII table for terminal display.\n * Reads the last N days of log files and shows each request individually.\n */\nexport async function formatRecentLogs(days: number = 1): Promise {\n const logFiles = await getLogFiles();\n const filesToRead = logFiles.slice(0, days);\n\n const allEntries: UsageEntry[] = [];\n for (const file of filesToRead) {\n const entries = await parseLogFile(join(LOG_DIR, file));\n allEntries.push(...entries);\n }\n\n // Sort chronologically (oldest first)\n allEntries.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\n const lines: string[] = [];\n lines.push(\"╔════════════════════════════════════════════════════════════════════════╗\");\n lines.push(\n `║ XClawRouter Request Log — last ${days === 1 ? \"24h\" : `${days} days`}`.padEnd(72) + \"║\",\n );\n lines.push(\"╠══════════════════╦══════════════════════════╦═════════╦══════╦════════╣\");\n lines.push(\"║ Time ║ Model ║ Cost ║ ms ║ Status ║\");\n lines.push(\"╠══════════════════╬══════════════════════════╬═════════╬══════╬════════╣\");\n\n if (allEntries.length === 0) {\n lines.push(\"║ No requests found\".padEnd(72) + \"║\");\n }\n\n let totalCost = 0;\n for (const e of allEntries) {\n const time = e.timestamp.slice(11, 19); // HH:MM:SS\n const date = e.timestamp.slice(5, 10); // MM-DD\n const displayTime = `${date} ${time}`;\n const model = e.model.length > 24 ? e.model.slice(0, 21) + \"...\" : e.model;\n const cost = `$${e.cost.toFixed(4)}`;\n const ms = e.latencyMs > 9999 ? `${(e.latencyMs / 1000).toFixed(1)}s` : `${e.latencyMs}ms`;\n const status =\n (e as UsageEntry & { status?: string }).status === \"error\" ? \" ERROR \" : \" OK \";\n totalCost += e.cost;\n lines.push(\n `║ ${displayTime.padEnd(16)}║ ${model.padEnd(24)}║ ${cost.padStart(7)}║ ${ms.padStart(4)}║${status}║`,\n );\n }\n\n lines.push(\"╠══════════════════╩══════════════════════════╩═════════╩══════╩════════╣\");\n lines.push(\n `║ ${allEntries.length} request${allEntries.length !== 1 ? \"s\" : \"\"} Total spent: $${totalCost.toFixed(4)}`.padEnd(\n 72,\n ) + \"║\",\n );\n lines.push(\n \"║ Logs: ~/.openclaw/blockrun/logs/ (JSONL — one entry per request)\".padEnd(72) + \"║\",\n );\n lines.push(\"╚════════════════════════════════════════════════════════════════════════╝\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Delete all usage log files, resetting stats to zero.\n */\nexport async function clearStats(): Promise<{ deletedFiles: number }> {\n try {\n const files = await readdir(LOG_DIR);\n const logFiles = files.filter((f) => f.startsWith(\"usage-\") && f.endsWith(\".jsonl\"));\n\n await Promise.all(logFiles.map((f) => unlink(join(LOG_DIR, f))));\n\n return { deletedFiles: logFiles.length };\n } catch {\n return { deletedFiles: 0 };\n }\n}\n","/**\n * Single source of truth for version.\n * Reads from package.json at build time via tsup's define.\n */\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Read package.json at runtime\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// In dist/, go up one level to find package.json\nconst require = createRequire(import.meta.url);\nconst pkg = require(join(__dirname, \"..\", \"package.json\")) as { version: string };\n\nexport const VERSION = pkg.version;\nexport const USER_AGENT = `clawrouter/${VERSION}`;\n","/**\n * Request Deduplication\n *\n * Prevents double-charging when OpenClaw retries a request after timeout.\n * Tracks in-flight requests and caches completed responses for a short TTL.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport type CachedResponse = {\n status: number;\n headers: Record;\n body: Buffer;\n completedAt: number;\n};\n\ntype InflightEntry = {\n resolvers: Array<(result: CachedResponse) => void>;\n};\n\nconst DEFAULT_TTL_MS = 30_000; // 30 seconds\nconst MAX_BODY_SIZE = 1_048_576; // 1MB\n\n/**\n * Canonicalize JSON by sorting object keys recursively.\n * Ensures identical logical content produces identical string regardless of field order.\n */\nfunction canonicalize(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(canonicalize);\n }\n const sorted: Record = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = canonicalize((obj as Record)[key]);\n }\n return sorted;\n}\n\n/**\n * Strip OpenClaw-injected timestamps from message content.\n * Format: [DAY YYYY-MM-DD HH:MM TZ] at the start of messages.\n * Example: [SUN 2026-02-07 13:30 PST] Hello world\n *\n * This ensures requests with different timestamps but same content hash identically.\n */\nconst TIMESTAMP_PATTERN = /^\\[\\w{3}\\s+\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}\\s+\\w+\\]\\s*/;\n\nfunction stripTimestamps(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(stripTimestamps);\n }\n const result: Record = {};\n for (const [key, value] of Object.entries(obj as Record)) {\n if (key === \"content\" && typeof value === \"string\") {\n // Strip timestamp prefix from message content\n result[key] = value.replace(TIMESTAMP_PATTERN, \"\");\n } else {\n result[key] = stripTimestamps(value);\n }\n }\n return result;\n}\n\nexport class RequestDeduplicator {\n private inflight = new Map();\n private completed = new Map();\n private ttlMs: number;\n\n constructor(ttlMs = DEFAULT_TTL_MS) {\n this.ttlMs = ttlMs;\n }\n\n /** Hash request body to create a dedup key. */\n static hash(body: Buffer): string {\n // Canonicalize JSON to ensure consistent hashing regardless of field order.\n // Also strip OpenClaw-injected timestamps so retries with different timestamps\n // still match the same dedup key.\n let content = body;\n try {\n const parsed = JSON.parse(body.toString());\n const stripped = stripTimestamps(parsed);\n const canonical = canonicalize(stripped);\n content = Buffer.from(JSON.stringify(canonical));\n } catch {\n // Not valid JSON, use raw bytes\n }\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n }\n\n /** Check if a response is cached for this key. */\n getCached(key: string): CachedResponse | undefined {\n const entry = this.completed.get(key);\n if (!entry) return undefined;\n if (Date.now() - entry.completedAt > this.ttlMs) {\n this.completed.delete(key);\n return undefined;\n }\n return entry;\n }\n\n /** Check if a request with this key is currently in-flight. Returns a promise to wait on. */\n getInflight(key: string): Promise | undefined {\n const entry = this.inflight.get(key);\n if (!entry) return undefined;\n return new Promise((resolve) => {\n entry.resolvers.push(resolve);\n });\n }\n\n /** Mark a request as in-flight. */\n markInflight(key: string): void {\n this.inflight.set(key, {\n resolvers: [],\n });\n }\n\n /** Complete an in-flight request — cache result and notify waiters. */\n complete(key: string, result: CachedResponse): void {\n // Only cache responses within size limit\n if (result.body.length <= MAX_BODY_SIZE) {\n this.completed.set(key, result);\n }\n\n const entry = this.inflight.get(key);\n if (entry) {\n for (const resolve of entry.resolvers) {\n resolve(result);\n }\n this.inflight.delete(key);\n }\n\n this.prune();\n }\n\n /** Remove an in-flight entry on error (don't cache failures).\n * Also rejects any waiters so they can retry independently. */\n removeInflight(key: string): void {\n const entry = this.inflight.get(key);\n if (entry) {\n // Resolve waiters with a sentinel error response so they don't hang forever.\n // Waiters will see a 503 and can retry on their own.\n const errorBody = Buffer.from(\n JSON.stringify({\n error: { message: \"Original request failed, please retry\", type: \"dedup_origin_failed\" },\n }),\n );\n for (const resolve of entry.resolvers) {\n resolve({\n status: 503,\n headers: { \"content-type\": \"application/json\" },\n body: errorBody,\n completedAt: Date.now(),\n });\n }\n this.inflight.delete(key);\n }\n }\n\n /** Prune expired completed entries. */\n private prune(): void {\n const now = Date.now();\n for (const [key, entry] of this.completed) {\n if (now - entry.completedAt > this.ttlMs) {\n this.completed.delete(key);\n }\n }\n }\n}\n","/**\n * Response Cache for LLM Completions\n *\n * Caches LLM responses by request hash (model + messages + params).\n * Inspired by LiteLLM's caching system. Returns cached responses for\n * identical requests, saving both cost and latency.\n *\n * Features:\n * - TTL-based expiration (default 10 minutes)\n * - LRU eviction when cache is full\n * - Size limits per item (1MB max)\n * - Heap-based expiration tracking for efficient pruning\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport type CachedLLMResponse = {\n body: Buffer;\n status: number;\n headers: Record;\n model: string;\n cachedAt: number;\n expiresAt: number;\n};\n\nexport type ResponseCacheConfig = {\n /** Maximum number of cached responses. Default: 200 */\n maxSize?: number;\n /** Default TTL in seconds. Default: 600 (10 minutes) */\n defaultTTL?: number;\n /** Maximum size per cached item in bytes. Default: 1MB */\n maxItemSize?: number;\n /** Enable/disable cache. Default: true */\n enabled?: boolean;\n};\n\nconst DEFAULT_CONFIG: Required = {\n maxSize: 200,\n defaultTTL: 600,\n maxItemSize: 1_048_576, // 1MB\n enabled: true,\n};\n\n/**\n * Canonicalize JSON by sorting object keys recursively.\n * Ensures identical logical content produces identical hash.\n */\nfunction canonicalize(obj: unknown): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(canonicalize);\n }\n const sorted: Record = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = canonicalize((obj as Record)[key]);\n }\n return sorted;\n}\n\n/**\n * Strip fields that shouldn't affect cache key:\n * - timestamps injected by OpenClaw\n * - request IDs\n *\n * `stream` IS part of the key because it changes the stored response shape\n * (JSON body vs SSE text/event-stream). A stream:true and stream:false request\n * with otherwise-identical bodies produce different responses and must live in\n * separate cache slots — otherwise the first one's response is served to the\n * second, which breaks the client.\n */\nconst TIMESTAMP_PATTERN = /^\\[\\w{3}\\s+\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}\\s+\\w+\\]\\s*/;\n\nfunction normalizeForCache(obj: Record): Record {\n const result: Record = {};\n\n for (const [key, value] of Object.entries(obj)) {\n // Skip fields that don't affect response content\n if ([\"user\", \"request_id\", \"x-request-id\"].includes(key)) {\n continue;\n }\n\n if (key === \"messages\" && Array.isArray(value)) {\n // Strip timestamps from message content\n result[key] = value.map((msg: unknown) => {\n if (typeof msg === \"object\" && msg !== null) {\n const m = msg as Record;\n if (typeof m.content === \"string\") {\n return { ...m, content: m.content.replace(TIMESTAMP_PATTERN, \"\") };\n }\n }\n return msg;\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport class ResponseCache {\n private cache = new Map();\n private expirationHeap: Array<{ expiresAt: number; key: string }> = [];\n private config: Required;\n\n // Stats for monitoring\n private stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n };\n\n constructor(config: ResponseCacheConfig = {}) {\n // Filter out undefined values so they don't override defaults\n const filtered = Object.fromEntries(\n Object.entries(config).filter(([, v]) => v !== undefined),\n ) as ResponseCacheConfig;\n this.config = { ...DEFAULT_CONFIG, ...filtered };\n }\n\n /**\n * Generate cache key from request body.\n * Hashes: model + messages + temperature + max_tokens + other params\n */\n static generateKey(body: Buffer | string): string {\n try {\n const parsed = JSON.parse(typeof body === \"string\" ? body : body.toString());\n const normalized = normalizeForCache(parsed);\n const canonical = canonicalize(normalized);\n const keyContent = JSON.stringify(canonical);\n return createHash(\"sha256\").update(keyContent).digest(\"hex\").slice(0, 32);\n } catch {\n // Fallback: hash raw body\n const content = typeof body === \"string\" ? body : body.toString();\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 32);\n }\n }\n\n /**\n * Check if caching is enabled for this request.\n * Respects cache control headers and request params.\n */\n shouldCache(body: Buffer | string, headers?: Record): boolean {\n if (!this.config.enabled) return false;\n\n // Respect Cache-Control: no-cache header\n if (headers?.[\"cache-control\"]?.includes(\"no-cache\")) {\n return false;\n }\n\n // Check for explicit cache disable in body\n try {\n const parsed = JSON.parse(typeof body === \"string\" ? body : body.toString());\n if (parsed.cache === false || parsed.no_cache === true) {\n return false;\n }\n } catch {\n // Not JSON, allow caching\n }\n\n return true;\n }\n\n /**\n * Get cached response if available and not expired.\n */\n get(key: string): CachedLLMResponse | undefined {\n const entry = this.cache.get(key);\n if (!entry) {\n this.stats.misses++;\n return undefined;\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n this.stats.misses++;\n return undefined;\n }\n\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Cache a response with optional custom TTL.\n */\n set(\n key: string,\n response: {\n body: Buffer;\n status: number;\n headers: Record;\n model: string;\n },\n ttlSeconds?: number,\n ): void {\n // Don't cache if disabled or maxSize is 0\n if (!this.config.enabled || this.config.maxSize <= 0) return;\n\n // Don't cache if item too large\n if (response.body.length > this.config.maxItemSize) {\n console.log(`[ResponseCache] Skipping cache - item too large: ${response.body.length} bytes`);\n return;\n }\n\n // Don't cache error responses\n if (response.status >= 400) {\n return;\n }\n\n // Evict if at capacity\n if (this.cache.size >= this.config.maxSize) {\n this.evict();\n }\n\n const now = Date.now();\n const ttl = ttlSeconds ?? this.config.defaultTTL;\n const expiresAt = now + ttl * 1000;\n\n const entry: CachedLLMResponse = {\n ...response,\n cachedAt: now,\n expiresAt,\n };\n\n this.cache.set(key, entry);\n this.expirationHeap.push({ expiresAt, key });\n }\n\n /**\n * Evict expired and oldest entries to make room.\n */\n private evict(): void {\n const now = Date.now();\n\n // First pass: remove expired entries\n this.expirationHeap.sort((a, b) => a.expiresAt - b.expiresAt);\n\n while (this.expirationHeap.length > 0) {\n const oldest = this.expirationHeap[0];\n\n // Check if entry still exists and matches\n const entry = this.cache.get(oldest.key);\n if (!entry || entry.expiresAt !== oldest.expiresAt) {\n // Stale heap entry, remove it\n this.expirationHeap.shift();\n continue;\n }\n\n if (oldest.expiresAt <= now) {\n // Expired, remove both\n this.cache.delete(oldest.key);\n this.expirationHeap.shift();\n this.stats.evictions++;\n } else {\n // Not expired, stop\n break;\n }\n }\n\n // Second pass: if still at capacity, evict oldest\n while (this.cache.size >= this.config.maxSize && this.expirationHeap.length > 0) {\n const oldest = this.expirationHeap.shift()!;\n if (this.cache.has(oldest.key)) {\n this.cache.delete(oldest.key);\n this.stats.evictions++;\n }\n }\n }\n\n /**\n * Get cache statistics.\n */\n getStats(): {\n size: number;\n maxSize: number;\n hits: number;\n misses: number;\n evictions: number;\n hitRate: string;\n } {\n const total = this.stats.hits + this.stats.misses;\n const hitRate = total > 0 ? ((this.stats.hits / total) * 100).toFixed(1) + \"%\" : \"0%\";\n\n return {\n size: this.cache.size,\n maxSize: this.config.maxSize,\n hits: this.stats.hits,\n misses: this.stats.misses,\n evictions: this.stats.evictions,\n hitRate,\n };\n }\n\n /**\n * Clear all cached entries.\n */\n clear(): void {\n this.cache.clear();\n this.expirationHeap = [];\n }\n\n /**\n * Check if cache is enabled.\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n}\n","/**\n * Custom payFetch for OKX onchainos mode.\n *\n * onchainos exposes payment signing as a single high-level command\n * (`payment x402-pay --accepts `), not raw EIP-712 typed-data signing.\n * We therefore can't plug it into the @x402/fetch signer plumbing — instead\n * we hand-roll the 402 → sign → replay loop that the official x402 spec\n * describes, mirroring okxclawrouter's reference handler.\n *\n * Supports both x402 protocol versions:\n * v2: `PAYMENT-REQUIRED` request header → `PAYMENT-SIGNATURE` reply header\n * v1: JSON-body 402 → `X-PAYMENT` reply header\n *\n * Pre-auth caching is intentionally skipped in this mode — onchainos issues\n * fresh nonces/timestamps per call, so caching the previous payload would\n * produce duplicate authorizations the facilitator rejects.\n */\n\nimport type { OnchainOsAdapter } from \"./onchainos-adapter.js\";\n\ntype FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise;\n\ninterface PaymentRequirement {\n x402Version?: number;\n resource?: unknown;\n accepted?: unknown;\n accepts?: unknown[];\n}\n\n/**\n * Build a payFetch that signs x402 payments through onchainos.\n * Drop-in replacement for `createPayFetchWithPreAuth` when source=okx.\n */\nexport function createOnchainosPayFetch(baseFetch: FetchFn, onchainos: OnchainOsAdapter): FetchFn {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise => {\n // Snapshot the request so we can replay verbatim after a 402.\n // Cloning consumes the body once, so we materialize it up front.\n const original = new Request(input, init);\n const bodyBuf = await original.clone().arrayBuffer();\n const headersSnapshot = new Headers(original.headers);\n\n const firstResponse = await baseFetch(original);\n if (firstResponse.status !== 402) return firstResponse;\n\n // Parse 402 — v2 header takes precedence, then v1 body.\n const paymentRequiredHeader = firstResponse.headers.get(\"PAYMENT-REQUIRED\");\n let requirement: PaymentRequirement;\n let isV2 = false;\n let accepts: unknown[];\n\n if (paymentRequiredHeader) {\n isV2 = true;\n requirement = JSON.parse(\n Buffer.from(paymentRequiredHeader, \"base64\").toString(),\n ) as PaymentRequirement;\n accepts = requirement.accepted ? [requirement.accepted] : (requirement.accepts ?? []);\n } else {\n const text = await firstResponse.text();\n try {\n requirement = JSON.parse(text) as PaymentRequirement;\n } catch {\n // 402 without a parseable body — surface a fresh 402 to the caller.\n return new Response(text, {\n status: 402,\n headers: firstResponse.headers,\n });\n }\n accepts = requirement.accepts ?? [];\n }\n\n if (accepts.length === 0) {\n throw new Error(\n `x402 402 response had no payment options to satisfy ` +\n `(onchainos cannot sign without an 'accepts' array)`,\n );\n }\n\n // Sign via onchainos.\n const payment = await onchainos.signX402Payment(accepts);\n\n // Build payment header.\n const accepted = (accepts[0] ?? {}) as Record;\n const payload: Record = {\n signature: payment.signature,\n authorization: payment.authorization,\n };\n\n let headerName: string;\n let headerValue: string;\n if (isV2) {\n const acceptedWithCert: Record = { ...accepted };\n if (accepted.scheme === \"aggr_deferred\" && payment.sessionCert) {\n acceptedWithCert.extra = {\n ...((accepted.extra as Record | undefined) ?? {}),\n sessionCert: payment.sessionCert,\n };\n }\n headerName = \"PAYMENT-SIGNATURE\";\n headerValue = Buffer.from(\n JSON.stringify({\n x402Version: requirement.x402Version ?? 2,\n resource: requirement.resource ?? { url: original.url },\n accepted: acceptedWithCert,\n payload,\n }),\n ).toString(\"base64\");\n } else {\n headerName = \"X-PAYMENT\";\n headerValue = Buffer.from(\n JSON.stringify({\n x402Version: 1,\n scheme: accepted.scheme,\n network: accepted.network,\n payload,\n }),\n ).toString(\"base64\");\n }\n\n // Replay request with payment header attached.\n const replayHeaders = new Headers(headersSnapshot);\n replayHeaders.set(headerName, headerValue);\n const replayInit: RequestInit = {\n method: original.method,\n headers: replayHeaders,\n body: original.method === \"GET\" || original.method === \"HEAD\" ? undefined : bodyBuf,\n redirect: original.redirect,\n credentials: original.credentials,\n };\n return baseFetch(original.url, replayInit);\n };\n}\n","/**\n * LLM-Safe Context Compression Types\n *\n * Types for the 7-layer compression system that reduces token usage\n * while preserving semantic meaning for LLM queries.\n */\n\n// Content part for multimodal messages (images, etc.)\nexport interface ContentPart {\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n}\n\n// Normalized message structure (matches OpenAI format)\n// Note: content can be an array for multimodal messages (images, etc.)\nexport interface NormalizedMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | ContentPart[] | null;\n tool_call_id?: string;\n tool_calls?: ToolCall[];\n name?: string;\n}\n\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\n// Compression configuration\nexport interface CompressionConfig {\n enabled: boolean;\n preserveRaw: boolean; // Keep original for logging\n\n // Per-layer toggles\n layers: {\n deduplication: boolean;\n whitespace: boolean;\n dictionary: boolean;\n paths: boolean;\n jsonCompact: boolean;\n observation: boolean; // L6: Compress tool results (BIG WIN)\n dynamicCodebook: boolean; // L7: Build codebook from content\n };\n\n // Dictionary settings\n dictionary: {\n maxEntries: number;\n minPhraseLength: number;\n includeCodebookHeader: boolean; // Include codebook in system message\n };\n}\n\n// Compression statistics\nexport interface CompressionStats {\n duplicatesRemoved: number;\n whitespaceSavedChars: number;\n dictionarySubstitutions: number;\n pathsShortened: number;\n jsonCompactedChars: number;\n observationsCompressed: number; // L6: Tool results compressed\n observationCharsSaved: number; // L6: Chars saved from observations\n dynamicSubstitutions: number; // L7: Dynamic codebook substitutions\n dynamicCharsSaved: number; // L7: Chars saved from dynamic codebook\n}\n\n// Result from compression\nexport interface CompressionResult {\n messages: NormalizedMessage[];\n originalMessages: NormalizedMessage[]; // For logging\n\n // Token estimates\n originalChars: number;\n compressedChars: number;\n compressionRatio: number; // 0.85 = 15% reduction\n\n // Per-layer stats\n stats: CompressionStats;\n\n // Codebook used (for decompression in logs)\n codebook: Record;\n pathMap: Record;\n dynamicCodes: Record; // L7: Dynamic codebook\n}\n\n// Log data extension for compression metrics\nexport interface CompressionLogData {\n enabled: boolean;\n ratio: number;\n original_chars: number;\n compressed_chars: number;\n stats: {\n duplicates_removed: number;\n whitespace_saved: number;\n dictionary_subs: number;\n paths_shortened: number;\n json_compacted: number;\n };\n}\n\n// Default configuration - CONSERVATIVE settings for model compatibility\n// Only enable layers that don't require the model to decode anything\nexport const DEFAULT_COMPRESSION_CONFIG: CompressionConfig = {\n enabled: true,\n preserveRaw: true,\n layers: {\n deduplication: true, // Safe: removes duplicate messages\n whitespace: true, // Safe: normalizes whitespace\n dictionary: false, // DISABLED: requires model to understand codebook\n paths: false, // DISABLED: requires model to understand path codes\n jsonCompact: true, // Safe: just removes JSON whitespace\n observation: false, // DISABLED: may lose important context\n dynamicCodebook: false, // DISABLED: requires model to understand codes\n },\n dictionary: {\n maxEntries: 50,\n minPhraseLength: 15,\n includeCodebookHeader: false, // No codebook header needed\n },\n};\n","/**\n * Layer 1: Message Deduplication\n *\n * Removes exact duplicate messages from conversation history.\n * Common in heartbeat patterns and repeated tool calls.\n *\n * Safe for LLM: Identical messages add no new information.\n * Expected savings: 2-5%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\nimport crypto from \"crypto\";\n\nexport interface DeduplicationResult {\n messages: NormalizedMessage[];\n duplicatesRemoved: number;\n originalCount: number;\n}\n\n/**\n * Generate a hash for a message based on its semantic content.\n * Uses role + content + tool_call_id to identify duplicates.\n */\nfunction hashMessage(message: NormalizedMessage): string {\n // Handle content - stringify arrays (multimodal), use string directly, or empty string\n let contentStr = \"\";\n if (typeof message.content === \"string\") {\n contentStr = message.content;\n } else if (Array.isArray(message.content)) {\n contentStr = JSON.stringify(message.content);\n }\n\n const parts = [message.role, contentStr, message.tool_call_id || \"\", message.name || \"\"];\n\n // Include tool_calls if present\n if (message.tool_calls) {\n parts.push(\n JSON.stringify(\n message.tool_calls.map((tc) => ({\n name: tc.function.name,\n args: tc.function.arguments,\n })),\n ),\n );\n }\n\n const content = parts.join(\"|\");\n return crypto.createHash(\"md5\").update(content).digest(\"hex\");\n}\n\n/**\n * Remove exact duplicate messages from the conversation.\n *\n * Strategy:\n * - Keep first occurrence of each unique message\n * - Preserve order for semantic coherence\n * - Never dedupe system messages (they set context)\n * - Allow duplicate user messages (user might repeat intentionally)\n * - CRITICAL: Never dedupe assistant messages with tool_calls that are\n * referenced by subsequent tool messages (breaks Anthropic tool_use/tool_result pairing)\n */\nexport function deduplicateMessages(messages: NormalizedMessage[]): DeduplicationResult {\n const seen = new Set();\n const result: NormalizedMessage[] = [];\n let duplicatesRemoved = 0;\n\n // First pass: collect all tool_call_ids that are referenced by tool messages\n // These tool_calls MUST be preserved to maintain tool_use/tool_result pairing\n const referencedToolCallIds = new Set();\n for (const message of messages) {\n if (message.role === \"tool\" && message.tool_call_id) {\n referencedToolCallIds.add(message.tool_call_id);\n }\n }\n\n for (const message of messages) {\n // Always keep system messages (they set important context)\n if (message.role === \"system\") {\n result.push(message);\n continue;\n }\n\n // Always keep user messages (user might repeat intentionally)\n if (message.role === \"user\") {\n result.push(message);\n continue;\n }\n\n // Always keep tool messages (they are results of tool calls)\n // Removing them would break the tool_use/tool_result pairing\n if (message.role === \"tool\") {\n result.push(message);\n continue;\n }\n\n // For assistant messages with tool_calls, check if any are referenced\n // by subsequent tool messages - if so, we MUST keep this message\n if (message.role === \"assistant\" && message.tool_calls) {\n const hasReferencedToolCall = message.tool_calls.some((tc) =>\n referencedToolCallIds.has(tc.id),\n );\n if (hasReferencedToolCall) {\n // This assistant message has tool_calls that are referenced - keep it\n result.push(message);\n continue;\n }\n }\n\n // For other assistant messages, check for duplicates\n const hash = hashMessage(message);\n\n if (!seen.has(hash)) {\n seen.add(hash);\n result.push(message);\n } else {\n duplicatesRemoved++;\n }\n }\n\n return {\n messages: result,\n duplicatesRemoved,\n originalCount: messages.length,\n };\n}\n","/**\n * Layer 2: Whitespace Normalization\n *\n * Reduces excessive whitespace without changing semantic meaning.\n *\n * Safe for LLM: Tokenizers normalize whitespace anyway.\n * Expected savings: 3-8%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\nexport interface WhitespaceResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n}\n\n/**\n * Normalize whitespace in a string.\n *\n * - Max 2 consecutive newlines\n * - Remove trailing whitespace from lines\n * - Normalize tabs to spaces\n * - Trim start/end\n */\nexport function normalizeWhitespace(content: string): string {\n // Defensive type check - content might be array/object for multimodal messages\n if (!content || typeof content !== \"string\") return content as string;\n\n return (\n content\n // Normalize line endings\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\")\n // Max 2 consecutive newlines (preserve paragraph breaks)\n .replace(/\\n{3,}/g, \"\\n\\n\")\n // Remove trailing whitespace from each line\n .replace(/[ \\t]+$/gm, \"\")\n // Normalize multiple spaces to single (except at line start for indentation)\n .replace(/([^\\n]) {2,}/g, \"$1 \")\n // Reduce excessive indentation (more than 8 spaces → 2 spaces per level)\n .replace(/^[ ]{8,}/gm, (match) => \" \".repeat(Math.ceil(match.length / 4)))\n // Normalize tabs to 2 spaces\n .replace(/\\t/g, \" \")\n // Trim\n .trim()\n );\n}\n\n/**\n * Apply whitespace normalization to all messages.\n */\nexport function normalizeMessagesWhitespace(messages: NormalizedMessage[]): WhitespaceResult {\n let charsSaved = 0;\n\n const result = messages.map((message) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") return message;\n\n const originalLength = message.content.length;\n const normalizedContent = normalizeWhitespace(message.content);\n charsSaved += originalLength - normalizedContent.length;\n\n return {\n ...message,\n content: normalizedContent,\n };\n });\n\n return {\n messages: result,\n charsSaved,\n };\n}\n","/**\n * Dictionary Codebook\n *\n * Static dictionary of frequently repeated phrases observed in LLM prompts.\n * Built from analysis of BlockRun production logs.\n *\n * Format: Short code ($XX) -> Long phrase\n * The LLM receives a codebook header and decodes in-context.\n */\n\n// Static codebook - common patterns from system prompts\n// Ordered by expected frequency and impact\nexport const STATIC_CODEBOOK: Record = {\n // High-impact: OpenClaw/Agent system prompt patterns (very common)\n $OC01: \"unbrowse_\", // Common prefix in tool names\n $OC02: \"\",\n $OC03: \"\",\n $OC04: \"\",\n $OC05: \"\",\n $OC06: \"\",\n $OC07: \"\",\n $OC08: \"(may need login)\",\n $OC09: \"API skill for OpenClaw\",\n $OC10: \"endpoints\",\n\n // Skill/tool markers\n $SK01: \"\",\n $SK02: \"\",\n $SK03: \"\",\n $SK04: \"\",\n\n // Schema patterns (very common in tool definitions)\n $T01: 'type: \"function\"',\n $T02: '\"type\": \"function\"',\n $T03: '\"type\": \"string\"',\n $T04: '\"type\": \"object\"',\n $T05: '\"type\": \"array\"',\n $T06: '\"type\": \"boolean\"',\n $T07: '\"type\": \"number\"',\n\n // Common descriptions\n $D01: \"description:\",\n $D02: '\"description\":',\n\n // Common instructions\n $I01: \"You are a personal assistant\",\n $I02: \"Tool names are case-sensitive\",\n $I03: \"Call tools exactly as listed\",\n $I04: \"Use when\",\n $I05: \"without asking\",\n\n // Safety phrases\n $S01: \"Do not manipulate or persuade\",\n $S02: \"Prioritize safety and human oversight\",\n $S03: \"unless explicitly requested\",\n\n // JSON patterns\n $J01: '\"required\": [\"',\n $J02: '\"properties\": {',\n $J03: '\"additionalProperties\": false',\n\n // Heartbeat patterns\n $H01: \"HEARTBEAT_OK\",\n $H02: \"Read HEARTBEAT.md if it exists\",\n\n // Role markers\n $R01: '\"role\": \"system\"',\n $R02: '\"role\": \"user\"',\n $R03: '\"role\": \"assistant\"',\n $R04: '\"role\": \"tool\"',\n\n // Common endings/phrases\n $E01: \"would you like to\",\n $E02: \"Let me know if you\",\n $E03: \"internal APIs\",\n $E04: \"session cookies\",\n\n // BlockRun model aliases (common in prompts)\n $M01: \"blockrun/\",\n $M02: \"openai/\",\n $M03: \"anthropic/\",\n $M04: \"google/\",\n $M05: \"xai/\",\n};\n\n/**\n * Get the inverse codebook for decompression.\n */\nexport function getInverseCodebook(): Record {\n const inverse: Record = {};\n for (const [code, phrase] of Object.entries(STATIC_CODEBOOK)) {\n inverse[phrase] = code;\n }\n return inverse;\n}\n\n/**\n * Generate the codebook header for inclusion in system message.\n * LLMs can decode in-context using this header.\n */\nexport function generateCodebookHeader(\n usedCodes: Set,\n pathMap: Record = {},\n): string {\n if (usedCodes.size === 0 && Object.keys(pathMap).length === 0) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n // Add used dictionary codes\n if (usedCodes.size > 0) {\n const codeEntries = Array.from(usedCodes)\n .map((code) => `${code}=${STATIC_CODEBOOK[code]}`)\n .join(\", \");\n parts.push(`[Dict: ${codeEntries}]`);\n }\n\n // Add path map\n if (Object.keys(pathMap).length > 0) {\n const pathEntries = Object.entries(pathMap)\n .map(([code, path]) => `${code}=${path}`)\n .join(\", \");\n parts.push(`[Paths: ${pathEntries}]`);\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Decompress a string using the codebook (for logging).\n */\nexport function decompressContent(\n content: string,\n codebook: Record = STATIC_CODEBOOK,\n): string {\n let result = content;\n for (const [code, phrase] of Object.entries(codebook)) {\n result = result.split(code).join(phrase);\n }\n return result;\n}\n","/**\n * Layer 3: Dictionary Encoding\n *\n * Replaces frequently repeated long phrases with short codes.\n * Uses a static codebook of common patterns from production logs.\n *\n * Safe for LLM: Reversible substitution with codebook header.\n * Expected savings: 4-8%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\nimport { getInverseCodebook } from \"../codebook.js\";\n\nexport interface DictionaryResult {\n messages: NormalizedMessage[];\n substitutionCount: number;\n usedCodes: Set;\n charsSaved: number;\n}\n\n/**\n * Apply dictionary encoding to a string.\n * Returns the encoded string and stats.\n */\nfunction encodeContent(\n content: string,\n inverseCodebook: Record,\n): { encoded: string; substitutions: number; codes: Set; charsSaved: number } {\n // Defensive type check - content might be array/object for multimodal messages\n if (!content || typeof content !== \"string\") {\n return { encoded: content, substitutions: 0, codes: new Set(), charsSaved: 0 };\n }\n let encoded = content;\n let substitutions = 0;\n let charsSaved = 0;\n const codes = new Set();\n\n // Sort phrases by length (longest first) to avoid partial matches\n const phrases = Object.keys(inverseCodebook).sort((a, b) => b.length - a.length);\n\n for (const phrase of phrases) {\n const code = inverseCodebook[phrase];\n const regex = new RegExp(escapeRegex(phrase), \"g\");\n const matches = encoded.match(regex);\n\n if (matches && matches.length > 0) {\n encoded = encoded.replace(regex, code);\n substitutions += matches.length;\n charsSaved += matches.length * (phrase.length - code.length);\n codes.add(code);\n }\n }\n\n return { encoded, substitutions, codes, charsSaved };\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Apply dictionary encoding to all messages.\n */\nexport function encodeMessages(messages: NormalizedMessage[]): DictionaryResult {\n const inverseCodebook = getInverseCodebook();\n let totalSubstitutions = 0;\n let totalCharsSaved = 0;\n const allUsedCodes = new Set();\n\n const result = messages.map((message) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") return message;\n\n const { encoded, substitutions, codes, charsSaved } = encodeContent(\n message.content,\n inverseCodebook,\n );\n\n totalSubstitutions += substitutions;\n totalCharsSaved += charsSaved;\n codes.forEach((code) => allUsedCodes.add(code));\n\n return {\n ...message,\n content: encoded,\n };\n });\n\n return {\n messages: result,\n substitutionCount: totalSubstitutions,\n usedCodes: allUsedCodes,\n charsSaved: totalCharsSaved,\n };\n}\n","/**\n * Layer 4: Path Shortening\n *\n * Detects common filesystem path prefixes and replaces them with short codes.\n * Common in coding assistant contexts with repeated file paths.\n *\n * Safe for LLM: Lossless abbreviation with path map header.\n * Expected savings: 1-3%\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\nexport interface PathShorteningResult {\n messages: NormalizedMessage[];\n pathMap: Record; // $P1 -> /home/user/project/\n charsSaved: number;\n}\n\n// Regex to match filesystem paths\nconst PATH_REGEX = /(?:\\/[\\w.-]+){3,}/g;\n\n/**\n * Extract all paths from messages and find common prefixes.\n */\nfunction extractPaths(messages: NormalizedMessage[]): string[] {\n const paths: string[] = [];\n\n for (const message of messages) {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") continue;\n const matches = message.content.match(PATH_REGEX);\n if (matches) {\n paths.push(...matches);\n }\n }\n\n return paths;\n}\n\n/**\n * Group paths by their common prefixes.\n * Returns prefixes that appear at least 3 times.\n */\nfunction findFrequentPrefixes(paths: string[]): string[] {\n const prefixCounts = new Map();\n\n for (const path of paths) {\n const parts = path.split(\"/\").filter(Boolean);\n\n // Try prefixes of different lengths\n for (let i = 2; i < parts.length; i++) {\n const prefix = \"/\" + parts.slice(0, i).join(\"/\") + \"/\";\n prefixCounts.set(prefix, (prefixCounts.get(prefix) || 0) + 1);\n }\n }\n\n // Return prefixes that appear 3+ times, sorted by length (longest first)\n return Array.from(prefixCounts.entries())\n .filter(([, count]) => count >= 3)\n .sort((a, b) => b[0].length - a[0].length)\n .slice(0, 5) // Max 5 path codes\n .map(([prefix]) => prefix);\n}\n\n/**\n * Apply path shortening to all messages.\n */\nexport function shortenPaths(messages: NormalizedMessage[]): PathShorteningResult {\n const allPaths = extractPaths(messages);\n\n if (allPaths.length < 5) {\n // Not enough paths to benefit from shortening\n return {\n messages,\n pathMap: {},\n charsSaved: 0,\n };\n }\n\n const prefixes = findFrequentPrefixes(allPaths);\n\n if (prefixes.length === 0) {\n return {\n messages,\n pathMap: {},\n charsSaved: 0,\n };\n }\n\n // Create path map\n const pathMap: Record = {};\n prefixes.forEach((prefix, i) => {\n pathMap[`$P${i + 1}`] = prefix;\n });\n\n // Replace paths in messages\n let charsSaved = 0;\n\n const result = messages.map((message) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!message.content || typeof message.content !== \"string\") return message;\n\n let content = message.content;\n const originalLength = content.length;\n\n // Replace prefixes (longest first to avoid partial replacements)\n for (const [code, prefix] of Object.entries(pathMap)) {\n content = content.split(prefix).join(code + \"/\");\n }\n\n charsSaved += originalLength - content.length;\n\n return {\n ...message,\n content,\n };\n });\n\n return {\n messages: result,\n pathMap,\n charsSaved,\n };\n}\n\n/**\n * Generate the path map header for the codebook.\n */\nexport function generatePathMapHeader(pathMap: Record): string {\n if (Object.keys(pathMap).length === 0) return \"\";\n\n const entries = Object.entries(pathMap)\n .map(([code, path]) => `${code}=${path}`)\n .join(\", \");\n\n return `[Paths: ${entries}]`;\n}\n","/**\n * Layer 5: JSON Compaction\n *\n * Minifies JSON in tool_call arguments and tool results.\n * Removes pretty-print whitespace from JSON strings.\n *\n * Safe for LLM: JSON semantics unchanged.\n * Expected savings: 2-4%\n */\n\nimport { NormalizedMessage, ToolCall } from \"../types.js\";\n\nexport interface JsonCompactResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n}\n\n/**\n * Compact a JSON string by parsing and re-stringifying without formatting.\n */\nfunction compactJson(jsonString: string): string {\n try {\n const parsed = JSON.parse(jsonString);\n return JSON.stringify(parsed);\n } catch {\n // Not valid JSON, return as-is\n return jsonString;\n }\n}\n\n/**\n * Check if a string looks like JSON (starts with { or [).\n */\nfunction looksLikeJson(str: string): boolean {\n const trimmed = str.trim();\n return (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n );\n}\n\n/**\n * Compact tool_call arguments in a message.\n */\nfunction compactToolCalls(toolCalls: ToolCall[]): ToolCall[] {\n return toolCalls.map((tc) => ({\n ...tc,\n function: {\n ...tc.function,\n arguments: compactJson(tc.function.arguments),\n },\n }));\n}\n\n/**\n * Apply JSON compaction to all messages.\n *\n * Targets:\n * - tool_call arguments (in assistant messages)\n * - tool message content (often JSON)\n */\nexport function compactMessagesJson(messages: NormalizedMessage[]): JsonCompactResult {\n let charsSaved = 0;\n\n const result = messages.map((message) => {\n const newMessage = { ...message };\n\n // Compact tool_calls arguments\n if (message.tool_calls && message.tool_calls.length > 0) {\n const originalLength = JSON.stringify(message.tool_calls).length;\n newMessage.tool_calls = compactToolCalls(message.tool_calls);\n const newLength = JSON.stringify(newMessage.tool_calls).length;\n charsSaved += originalLength - newLength;\n }\n\n // Compact tool message content if it looks like JSON\n // Only process string content (skip arrays for multimodal messages)\n if (\n message.role === \"tool\" &&\n message.content &&\n typeof message.content === \"string\" &&\n looksLikeJson(message.content)\n ) {\n const originalLength = message.content.length;\n const compacted = compactJson(message.content);\n charsSaved += originalLength - compacted.length;\n newMessage.content = compacted;\n }\n\n return newMessage;\n });\n\n return {\n messages: result,\n charsSaved,\n };\n}\n","/**\n * L6: Observation Compression (AGGRESSIVE)\n *\n * Inspired by claw-compactor's 97% compression on tool results.\n * Tool call results (especially large ones) are summarized to key info only.\n *\n * This is the biggest compression win - tool outputs can be 10KB+ but\n * only ~200 chars of actual useful information.\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\ninterface ObservationResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n observationsCompressed: number;\n}\n\n// Max length for tool results before compression kicks in\nconst TOOL_RESULT_THRESHOLD = 500;\n\n// Max length to compress tool results down to\nconst COMPRESSED_RESULT_MAX = 300;\n\n/**\n * Extract key information from tool result.\n * Keeps: errors, key values, status, first/last important lines.\n */\nfunction compressToolResult(content: string): string {\n if (!content || content.length <= TOOL_RESULT_THRESHOLD) {\n return content;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean);\n\n // Priority 1: Error messages (always keep)\n const errorLines = lines.filter(\n (l) => /error|exception|failed|denied|refused|timeout|invalid/i.test(l) && l.length < 200,\n );\n\n // Priority 2: Status/result lines\n const statusLines = lines.filter(\n (l) =>\n /success|complete|created|updated|found|result|status|total|count/i.test(l) && l.length < 150,\n );\n\n // Priority 3: Key JSON fields (extract important values)\n const jsonMatches: string[] = [];\n const jsonPattern = /\"(id|name|status|error|message|count|total|url|path)\":\\s*\"?([^\",}\\n]+)\"?/gi;\n let match;\n while ((match = jsonPattern.exec(content)) !== null) {\n jsonMatches.push(`${match[1]}: ${match[2].slice(0, 50)}`);\n }\n\n // Priority 4: First and last meaningful lines\n const firstLine = lines[0]?.slice(0, 100);\n const lastLine = lines.length > 1 ? lines[lines.length - 1]?.slice(0, 100) : \"\";\n\n // Build compressed observation\n const parts: string[] = [];\n\n if (errorLines.length > 0) {\n parts.push(\"[ERR] \" + errorLines.slice(0, 3).join(\" | \"));\n }\n\n if (statusLines.length > 0) {\n parts.push(statusLines.slice(0, 3).join(\" | \"));\n }\n\n if (jsonMatches.length > 0) {\n parts.push(jsonMatches.slice(0, 5).join(\", \"));\n }\n\n if (parts.length === 0) {\n // Fallback: keep first/last lines with truncation marker\n parts.push(firstLine || \"\");\n if (lines.length > 2) {\n parts.push(`[...${lines.length - 2} lines...]`);\n }\n if (lastLine && lastLine !== firstLine) {\n parts.push(lastLine);\n }\n }\n\n let result = parts.join(\"\\n\");\n\n // Final length cap\n if (result.length > COMPRESSED_RESULT_MAX) {\n result = result.slice(0, COMPRESSED_RESULT_MAX - 20) + \"\\n[...truncated]\";\n }\n\n return result;\n}\n\n/**\n * Compress large repeated content blocks.\n * Detects when same large block appears multiple times.\n */\nfunction deduplicateLargeBlocks(messages: NormalizedMessage[]): {\n messages: NormalizedMessage[];\n charsSaved: number;\n} {\n const blockHashes = new Map(); // hash -> first occurrence index\n let charsSaved = 0;\n\n const result = messages.map((msg, idx) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!msg.content || typeof msg.content !== \"string\" || msg.content.length < 500) {\n return msg;\n }\n\n // Hash first 200 chars as block identifier\n const blockKey = msg.content.slice(0, 200);\n\n if (blockHashes.has(blockKey)) {\n const firstIdx = blockHashes.get(blockKey)!;\n const original = msg.content;\n const compressed = `[See message #${firstIdx + 1} - same content]`;\n charsSaved += original.length - compressed.length;\n return { ...msg, content: compressed };\n }\n\n blockHashes.set(blockKey, idx);\n return msg;\n });\n\n return { messages: result, charsSaved };\n}\n\n/**\n * Compress tool results in messages.\n */\nexport function compressObservations(messages: NormalizedMessage[]): ObservationResult {\n let charsSaved = 0;\n let observationsCompressed = 0;\n\n // First pass: compress individual tool results\n let result = messages.map((msg) => {\n // Only compress tool role messages (these are tool call results)\n // Only process string content (skip arrays for multimodal messages)\n if (msg.role !== \"tool\" || !msg.content || typeof msg.content !== \"string\") {\n return msg;\n }\n\n const original = msg.content;\n if (original.length <= TOOL_RESULT_THRESHOLD) {\n return msg;\n }\n\n const compressed = compressToolResult(original);\n const saved = original.length - compressed.length;\n\n if (saved > 50) {\n charsSaved += saved;\n observationsCompressed++;\n return { ...msg, content: compressed };\n }\n\n return msg;\n });\n\n // Second pass: deduplicate large repeated blocks\n const dedupResult = deduplicateLargeBlocks(result);\n result = dedupResult.messages;\n charsSaved += dedupResult.charsSaved;\n\n return {\n messages: result,\n charsSaved,\n observationsCompressed,\n };\n}\n","/**\n * L7: Dynamic Codebook Builder\n *\n * Inspired by claw-compactor's frequency-based codebook.\n * Builds codebook from actual content being compressed,\n * rather than relying on static patterns.\n *\n * Finds phrases that appear 3+ times and replaces with short codes.\n */\n\nimport { NormalizedMessage } from \"../types.js\";\n\ninterface DynamicCodebookResult {\n messages: NormalizedMessage[];\n charsSaved: number;\n dynamicCodes: Record; // code -> phrase\n substitutions: number;\n}\n\n// Config\nconst MIN_PHRASE_LENGTH = 20;\nconst MAX_PHRASE_LENGTH = 200;\nconst MIN_FREQUENCY = 3;\nconst MAX_ENTRIES = 100;\nconst CODE_PREFIX = \"$D\"; // Dynamic codes: $D01, $D02, etc.\n\n/**\n * Find repeated phrases in content.\n */\nfunction findRepeatedPhrases(allContent: string): Map {\n const phrases = new Map();\n\n // Split by sentence-like boundaries\n const segments = allContent.split(/(?<=[.!?\\n])\\s+/);\n\n for (const segment of segments) {\n const trimmed = segment.trim();\n if (trimmed.length >= MIN_PHRASE_LENGTH && trimmed.length <= MAX_PHRASE_LENGTH) {\n phrases.set(trimmed, (phrases.get(trimmed) || 0) + 1);\n }\n }\n\n // Also find repeated lines\n const lines = allContent.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length >= MIN_PHRASE_LENGTH && trimmed.length <= MAX_PHRASE_LENGTH) {\n phrases.set(trimmed, (phrases.get(trimmed) || 0) + 1);\n }\n }\n\n return phrases;\n}\n\n/**\n * Build dynamic codebook from message content.\n */\nfunction buildDynamicCodebook(messages: NormalizedMessage[]): Record {\n // Combine all content\n let allContent = \"\";\n for (const msg of messages) {\n // Only process string content (skip arrays for multimodal messages)\n if (msg.content && typeof msg.content === \"string\") {\n allContent += msg.content + \"\\n\";\n }\n }\n\n // Find repeated phrases\n const phrases = findRepeatedPhrases(allContent);\n\n // Filter by frequency and sort by savings potential\n const candidates: Array<{ phrase: string; count: number; savings: number }> = [];\n for (const [phrase, count] of phrases.entries()) {\n if (count >= MIN_FREQUENCY) {\n // Savings = (phrase length - code length) * occurrences\n const codeLength = 4; // e.g., \"$D01\"\n const savings = (phrase.length - codeLength) * count;\n if (savings > 50) {\n candidates.push({ phrase, count, savings });\n }\n }\n }\n\n // Sort by savings (descending) and take top entries\n candidates.sort((a, b) => b.savings - a.savings);\n const topCandidates = candidates.slice(0, MAX_ENTRIES);\n\n // Build codebook\n const codebook: Record = {};\n topCandidates.forEach((c, i) => {\n const code = `${CODE_PREFIX}${String(i + 1).padStart(2, \"0\")}`;\n codebook[code] = c.phrase;\n });\n\n return codebook;\n}\n\n/**\n * Escape special regex characters.\n */\nfunction escapeRegex(str: string): string {\n // Defensive type check\n if (!str || typeof str !== \"string\") return \"\";\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Apply dynamic codebook to messages.\n */\nexport function applyDynamicCodebook(messages: NormalizedMessage[]): DynamicCodebookResult {\n // Build codebook from content\n const codebook = buildDynamicCodebook(messages);\n\n if (Object.keys(codebook).length === 0) {\n return {\n messages,\n charsSaved: 0,\n dynamicCodes: {},\n substitutions: 0,\n };\n }\n\n // Create inverse map for replacement\n const phraseToCode: Record = {};\n for (const [code, phrase] of Object.entries(codebook)) {\n phraseToCode[phrase] = code;\n }\n\n // Sort phrases by length (longest first) to avoid partial replacements\n const sortedPhrases = Object.keys(phraseToCode).sort((a, b) => b.length - a.length);\n\n let charsSaved = 0;\n let substitutions = 0;\n\n // Apply replacements\n const result = messages.map((msg) => {\n // Only process string content (skip arrays for multimodal messages)\n if (!msg.content || typeof msg.content !== \"string\") return msg;\n\n let content = msg.content;\n for (const phrase of sortedPhrases) {\n const code = phraseToCode[phrase];\n const regex = new RegExp(escapeRegex(phrase), \"g\");\n const matches = content.match(regex);\n if (matches) {\n content = content.replace(regex, code);\n charsSaved += (phrase.length - code.length) * matches.length;\n substitutions += matches.length;\n }\n }\n\n return { ...msg, content };\n });\n\n return {\n messages: result,\n charsSaved,\n dynamicCodes: codebook,\n substitutions,\n };\n}\n\n/**\n * Generate header for dynamic codes (to include in system message).\n */\nexport function generateDynamicCodebookHeader(codebook: Record): string {\n if (Object.keys(codebook).length === 0) return \"\";\n\n const entries = Object.entries(codebook)\n .slice(0, 20) // Limit header size\n .map(([code, phrase]) => {\n // Truncate long phrases in header\n const displayPhrase = phrase.length > 40 ? phrase.slice(0, 37) + \"...\" : phrase;\n return `${code}=${displayPhrase}`;\n })\n .join(\", \");\n\n return `[DynDict: ${entries}]`;\n}\n","/**\n * LLM-Safe Context Compression\n *\n * Reduces token usage by 15-40% while preserving semantic meaning.\n * Implements 7 compression layers inspired by claw-compactor.\n *\n * Usage:\n * const result = await compressContext(messages);\n * // result.messages -> compressed version to send to provider\n * // result.originalMessages -> original for logging\n */\n\nimport {\n NormalizedMessage,\n CompressionConfig,\n CompressionResult,\n CompressionStats,\n DEFAULT_COMPRESSION_CONFIG,\n} from \"./types.js\";\nimport { deduplicateMessages } from \"./layers/deduplication.js\";\nimport { normalizeMessagesWhitespace } from \"./layers/whitespace.js\";\nimport { encodeMessages } from \"./layers/dictionary.js\";\nimport { shortenPaths } from \"./layers/paths.js\";\nimport { compactMessagesJson } from \"./layers/json-compact.js\";\nimport { compressObservations } from \"./layers/observation.js\";\nimport { applyDynamicCodebook, generateDynamicCodebookHeader } from \"./layers/dynamic-codebook.js\";\nimport { generateCodebookHeader, STATIC_CODEBOOK } from \"./codebook.js\";\n\nexport * from \"./types.js\";\nexport { STATIC_CODEBOOK } from \"./codebook.js\";\n\n/**\n * Calculate total character count for messages.\n */\nfunction calculateTotalChars(messages: NormalizedMessage[]): number {\n return messages.reduce((total, msg) => {\n let chars = 0;\n if (typeof msg.content === \"string\") {\n chars = msg.content.length;\n } else if (Array.isArray(msg.content)) {\n // For multimodal content, stringify to get approximate size\n chars = JSON.stringify(msg.content).length;\n }\n if (msg.tool_calls) {\n chars += JSON.stringify(msg.tool_calls).length;\n }\n return total + chars;\n }, 0);\n}\n\n/**\n * Deep clone messages to preserve originals.\n */\nfunction cloneMessages(messages: NormalizedMessage[]): NormalizedMessage[] {\n return JSON.parse(JSON.stringify(messages));\n}\n\n/**\n * Prepend codebook header to the first USER message (not system).\n *\n * Why not system message?\n * - Google Gemini uses systemInstruction which doesn't support codebook format\n * - The codebook header in user message is still visible to all LLMs\n * - This ensures compatibility across all providers\n */\nfunction prependCodebookHeader(\n messages: NormalizedMessage[],\n usedCodes: Set,\n pathMap: Record,\n): NormalizedMessage[] {\n const header = generateCodebookHeader(usedCodes, pathMap);\n if (!header) return messages;\n\n // Find first user message (not system - Google's systemInstruction doesn't support codebook)\n const userIndex = messages.findIndex((m) => m.role === \"user\");\n\n if (userIndex === -1) {\n // No user message, add codebook as system (fallback)\n return [{ role: \"system\", content: header }, ...messages];\n }\n\n // Prepend to first user message (only if content is a string)\n return messages.map((msg, i) => {\n if (i === userIndex) {\n // Only prepend to string content - skip arrays (multimodal messages)\n if (typeof msg.content === \"string\") {\n return {\n ...msg,\n content: `${header}\\n\\n${msg.content}`,\n };\n }\n // For non-string content, don't modify the message\n // The codebook header would corrupt array content\n }\n return msg;\n });\n}\n\n/**\n * Main compression function.\n *\n * Applies 5 layers in sequence:\n * 1. Deduplication - Remove exact duplicate messages\n * 2. Whitespace - Normalize excessive whitespace\n * 3. Dictionary - Replace common phrases with codes\n * 4. Paths - Shorten repeated file paths\n * 5. JSON - Compact JSON in tool calls\n *\n * Then prepends a codebook header for the LLM to decode in-context.\n */\nexport async function compressContext(\n messages: NormalizedMessage[],\n config: Partial = {},\n): Promise {\n const fullConfig: CompressionConfig = {\n ...DEFAULT_COMPRESSION_CONFIG,\n ...config,\n layers: {\n ...DEFAULT_COMPRESSION_CONFIG.layers,\n ...config.layers,\n },\n dictionary: {\n ...DEFAULT_COMPRESSION_CONFIG.dictionary,\n ...config.dictionary,\n },\n };\n\n // If compression disabled, return as-is\n if (!fullConfig.enabled) {\n const originalChars = calculateTotalChars(messages);\n return {\n messages,\n originalMessages: messages,\n originalChars,\n compressedChars: originalChars,\n compressionRatio: 1,\n stats: {\n duplicatesRemoved: 0,\n whitespaceSavedChars: 0,\n dictionarySubstitutions: 0,\n pathsShortened: 0,\n jsonCompactedChars: 0,\n observationsCompressed: 0,\n observationCharsSaved: 0,\n dynamicSubstitutions: 0,\n dynamicCharsSaved: 0,\n },\n codebook: {},\n pathMap: {},\n dynamicCodes: {},\n };\n }\n\n // Preserve originals for logging\n const originalMessages = fullConfig.preserveRaw ? cloneMessages(messages) : messages;\n const originalChars = calculateTotalChars(messages);\n\n // Initialize stats\n const stats: CompressionStats = {\n duplicatesRemoved: 0,\n whitespaceSavedChars: 0,\n dictionarySubstitutions: 0,\n pathsShortened: 0,\n jsonCompactedChars: 0,\n observationsCompressed: 0,\n observationCharsSaved: 0,\n dynamicSubstitutions: 0,\n dynamicCharsSaved: 0,\n };\n\n let result = cloneMessages(messages);\n let usedCodes = new Set();\n let pathMap: Record = {};\n let dynamicCodes: Record = {};\n\n // Layer 1: Deduplication\n if (fullConfig.layers.deduplication) {\n const dedupResult = deduplicateMessages(result);\n result = dedupResult.messages;\n stats.duplicatesRemoved = dedupResult.duplicatesRemoved;\n }\n\n // Layer 2: Whitespace normalization\n if (fullConfig.layers.whitespace) {\n const wsResult = normalizeMessagesWhitespace(result);\n result = wsResult.messages;\n stats.whitespaceSavedChars = wsResult.charsSaved;\n }\n\n // Layer 3: Dictionary encoding\n if (fullConfig.layers.dictionary) {\n const dictResult = encodeMessages(result);\n result = dictResult.messages;\n stats.dictionarySubstitutions = dictResult.substitutionCount;\n usedCodes = dictResult.usedCodes;\n }\n\n // Layer 4: Path shortening\n if (fullConfig.layers.paths) {\n const pathResult = shortenPaths(result);\n result = pathResult.messages;\n pathMap = pathResult.pathMap;\n stats.pathsShortened = Object.keys(pathMap).length;\n }\n\n // Layer 5: JSON compaction\n if (fullConfig.layers.jsonCompact) {\n const jsonResult = compactMessagesJson(result);\n result = jsonResult.messages;\n stats.jsonCompactedChars = jsonResult.charsSaved;\n }\n\n // Layer 6: Observation compression (BIG WIN - 97% on tool results)\n if (fullConfig.layers.observation) {\n const obsResult = compressObservations(result);\n result = obsResult.messages;\n stats.observationsCompressed = obsResult.observationsCompressed;\n stats.observationCharsSaved = obsResult.charsSaved;\n }\n\n // Layer 7: Dynamic codebook (learns from actual content)\n if (fullConfig.layers.dynamicCodebook) {\n const dynResult = applyDynamicCodebook(result);\n result = dynResult.messages;\n stats.dynamicSubstitutions = dynResult.substitutions;\n stats.dynamicCharsSaved = dynResult.charsSaved;\n dynamicCodes = dynResult.dynamicCodes;\n }\n\n // Add codebook header if enabled and we have codes to include\n if (\n fullConfig.dictionary.includeCodebookHeader &&\n (usedCodes.size > 0 || Object.keys(pathMap).length > 0 || Object.keys(dynamicCodes).length > 0)\n ) {\n result = prependCodebookHeader(result, usedCodes, pathMap);\n // Also add dynamic codebook header if we have dynamic codes\n if (Object.keys(dynamicCodes).length > 0) {\n const dynHeader = generateDynamicCodebookHeader(dynamicCodes);\n if (dynHeader) {\n const systemIndex = result.findIndex((m) => m.role === \"system\");\n // Only prepend to string content - skip arrays (multimodal messages)\n if (systemIndex >= 0 && typeof result[systemIndex].content === \"string\") {\n result[systemIndex] = {\n ...result[systemIndex],\n content: `${dynHeader}\\n${result[systemIndex].content}`,\n };\n }\n }\n }\n }\n\n // Calculate final stats\n const compressedChars = calculateTotalChars(result);\n const compressionRatio = compressedChars / originalChars;\n\n // Build used codebook for logging\n const usedCodebook: Record = {};\n usedCodes.forEach((code) => {\n usedCodebook[code] = STATIC_CODEBOOK[code];\n });\n\n return {\n messages: result,\n originalMessages,\n originalChars,\n compressedChars,\n compressionRatio,\n stats,\n codebook: usedCodebook,\n pathMap,\n dynamicCodes,\n };\n}\n\n/**\n * Quick check if compression would benefit these messages.\n * Returns true if messages are large enough to warrant compression.\n */\nexport function shouldCompress(messages: NormalizedMessage[]): boolean {\n const chars = calculateTotalChars(messages);\n // Only compress if > 5000 chars (roughly 1000 tokens)\n return chars > 5000;\n}\n","/**\n * Session Persistence Store\n *\n * Tracks model selections per session to prevent model switching mid-task.\n * When a session is active, the router will continue using the same model\n * instead of re-routing each request.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport type SessionEntry = {\n model: string;\n tier: string;\n createdAt: number;\n lastUsedAt: number;\n requestCount: number;\n /**\n * `true` when the user explicitly chose this model (e.g. /model command in\n * OpenClaw or sending an explicit non-profile model in the request body).\n * Explicit pins are sticky — they're NOT overridden by tier escalation when\n * a future routing-profile request comes in. The user's intent wins.\n */\n userExplicit?: boolean;\n // --- Three-strike escalation ---\n recentHashes: string[]; // Sliding window of last 3 request content fingerprints\n strikes: number; // Consecutive similar request count\n escalated: boolean; // Whether session was already escalated via three-strike\n // --- Cost accumulation for maxCostPerRun ---\n sessionCostMicros: bigint; // Total estimated cost for this session run (USDC 6-decimal)\n};\n\nexport type SessionConfig = {\n /** Enable session persistence (default: false) */\n enabled: boolean;\n /** Session timeout in ms (default: 30 minutes) */\n timeoutMs: number;\n /** Header name for session ID (default: X-Session-ID) */\n headerName: string;\n};\n\nexport const DEFAULT_SESSION_CONFIG: SessionConfig = {\n enabled: true,\n timeoutMs: 30 * 60 * 1000, // 30 minutes\n headerName: \"x-session-id\",\n};\n\n/**\n * Session persistence store for maintaining model selections.\n */\nexport class SessionStore {\n private sessions: Map = new Map();\n private config: SessionConfig;\n private cleanupInterval: ReturnType | null = null;\n\n constructor(config: Partial = {}) {\n this.config = { ...DEFAULT_SESSION_CONFIG, ...config };\n\n // Start cleanup interval (every 5 minutes)\n if (this.config.enabled) {\n this.cleanupInterval = setInterval(() => this.cleanup(), 5 * 60 * 1000);\n }\n }\n\n /**\n * Get the pinned model for a session, if any.\n */\n getSession(sessionId: string): SessionEntry | undefined {\n if (!this.config.enabled || !sessionId) {\n return undefined;\n }\n\n const entry = this.sessions.get(sessionId);\n if (!entry) {\n return undefined;\n }\n\n // Check if session has expired\n const now = Date.now();\n if (now - entry.lastUsedAt > this.config.timeoutMs) {\n this.sessions.delete(sessionId);\n return undefined;\n }\n\n return entry;\n }\n\n /**\n * Pin a model to a session.\n *\n * Pass `userExplicit: true` when the user explicitly chose this model\n * (e.g. via /model command or by sending an explicit non-profile model).\n * Explicit pins are sticky — they survive tier-escalation comparisons so\n * that the user's choice keeps winning even if subsequent requests use a\n * routing profile that would normally re-route.\n */\n setSession(sessionId: string, model: string, tier: string, userExplicit?: boolean): void {\n if (!this.config.enabled || !sessionId) {\n return;\n }\n\n const existing = this.sessions.get(sessionId);\n const now = Date.now();\n\n if (existing) {\n existing.lastUsedAt = now;\n existing.requestCount++;\n // Update model if different (e.g., fallback)\n if (existing.model !== model) {\n existing.model = model;\n existing.tier = tier;\n }\n // Promote to explicit if the latest call upgraded it; do not silently\n // demote an existing explicit pin to auto-routed.\n if (userExplicit) {\n existing.userExplicit = true;\n }\n } else {\n this.sessions.set(sessionId, {\n model,\n tier,\n createdAt: now,\n lastUsedAt: now,\n requestCount: 1,\n userExplicit: userExplicit || undefined,\n recentHashes: [],\n strikes: 0,\n escalated: false,\n sessionCostMicros: 0n,\n });\n }\n }\n\n /**\n * Touch a session to extend its timeout.\n */\n touchSession(sessionId: string): void {\n if (!this.config.enabled || !sessionId) {\n return;\n }\n\n const entry = this.sessions.get(sessionId);\n if (entry) {\n entry.lastUsedAt = Date.now();\n entry.requestCount++;\n }\n }\n\n /**\n * Clear a specific session.\n */\n clearSession(sessionId: string): void {\n this.sessions.delete(sessionId);\n }\n\n /**\n * Clear all sessions.\n */\n clearAll(): void {\n this.sessions.clear();\n }\n\n /**\n * Get session stats for debugging.\n */\n getStats(): { count: number; sessions: Array<{ id: string; model: string; age: number }> } {\n const now = Date.now();\n const sessions = Array.from(this.sessions.entries()).map(([id, entry]) => ({\n id: id.slice(0, 8) + \"...\",\n model: entry.model,\n age: Math.round((now - entry.createdAt) / 1000),\n }));\n return { count: this.sessions.size, sessions };\n }\n\n /**\n * Clean up expired sessions.\n */\n private cleanup(): void {\n const now = Date.now();\n for (const [id, entry] of this.sessions) {\n if (now - entry.lastUsedAt > this.config.timeoutMs) {\n this.sessions.delete(id);\n }\n }\n }\n\n /**\n * Record a request content hash and detect repetitive patterns.\n * Returns true if escalation should be triggered (3+ consecutive similar requests).\n */\n recordRequestHash(sessionId: string, hash: string): boolean {\n const entry = this.sessions.get(sessionId);\n if (!entry) return false;\n\n const prev = entry.recentHashes;\n if (prev.length > 0 && prev[prev.length - 1] === hash) {\n entry.strikes++;\n } else {\n entry.strikes = 0;\n }\n\n entry.recentHashes.push(hash);\n if (entry.recentHashes.length > 3) {\n entry.recentHashes.shift();\n }\n\n return entry.strikes >= 2 && !entry.escalated;\n }\n\n /**\n * Escalate session to next tier. Returns the new model/tier or null if already at max.\n */\n escalateSession(\n sessionId: string,\n tierConfigs: Record,\n ): { model: string; tier: string } | null {\n const entry = this.sessions.get(sessionId);\n if (!entry) return null;\n\n const TIER_ORDER = [\"SIMPLE\", \"MEDIUM\", \"COMPLEX\", \"REASONING\"];\n const currentIdx = TIER_ORDER.indexOf(entry.tier);\n if (currentIdx < 0 || currentIdx >= TIER_ORDER.length - 1) return null;\n\n const nextTier = TIER_ORDER[currentIdx + 1];\n const nextConfig = tierConfigs[nextTier];\n if (!nextConfig) return null;\n\n entry.model = nextConfig.primary;\n entry.tier = nextTier;\n entry.strikes = 0;\n entry.escalated = true;\n\n return { model: nextConfig.primary, tier: nextTier };\n }\n\n /**\n * Add cost to a session's running total for maxCostPerRun tracking.\n * Cost is in USDC 6-decimal units (micros).\n * Creates a cost-tracking-only entry if none exists (e.g., explicit model requests\n * that never go through the routing path).\n */\n addSessionCost(sessionId: string, additionalMicros: bigint): void {\n let entry = this.sessions.get(sessionId);\n if (!entry) {\n const now = Date.now();\n entry = {\n model: \"\",\n tier: \"DIRECT\",\n createdAt: now,\n lastUsedAt: now,\n requestCount: 0,\n recentHashes: [],\n strikes: 0,\n escalated: false,\n sessionCostMicros: 0n,\n };\n this.sessions.set(sessionId, entry);\n }\n entry.sessionCostMicros += additionalMicros;\n }\n\n /**\n * Get the total accumulated cost for a session in USD.\n */\n getSessionCostUsd(sessionId: string): number {\n const entry = this.sessions.get(sessionId);\n if (!entry) return 0;\n return Number(entry.sessionCostMicros) / 1_000_000;\n }\n\n /**\n * Stop the cleanup interval.\n */\n close(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n }\n}\n\n/**\n * Generate a session ID from request headers or create a default.\n */\nexport function getSessionId(\n headers: Record,\n headerName: string = DEFAULT_SESSION_CONFIG.headerName,\n): string | undefined {\n const value = headers[headerName] || headers[headerName.toLowerCase()];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n if (Array.isArray(value) && value.length > 0) {\n return value[0];\n }\n return undefined;\n}\n\n/**\n * Derive a stable session ID from message content when no explicit session\n * header is provided. Uses the first user message as the conversation anchor —\n * same opening message = same session ID across all subsequent turns.\n *\n * This prevents model-switching mid-conversation even when OpenClaw doesn't\n * send an x-session-id header (which is the default OpenClaw behaviour).\n */\nexport function deriveSessionId(\n messages: Array<{ role: string; content: unknown }>,\n): string | undefined {\n const firstUser = messages.find((m) => m.role === \"user\");\n if (!firstUser) return undefined;\n\n const content =\n typeof firstUser.content === \"string\" ? firstUser.content : JSON.stringify(firstUser.content);\n\n // 8-char hex prefix of SHA-256 — short enough for logs, collision-resistant\n // enough for session tracking within a single gateway instance.\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 8);\n}\n\n/**\n * Generate a short hash fingerprint from request content.\n * Captures: last user message text + tool call names (if any).\n * Normalizes whitespace to avoid false negatives from minor formatting diffs.\n */\nexport function hashRequestContent(lastUserContent: string, toolCallNames?: string[]): string {\n const normalized = lastUserContent.replace(/\\s+/g, \" \").trim().slice(0, 500);\n const toolSuffix = toolCallNames?.length ? `|tools:${toolCallNames.sort().join(\",\")}` : \"\";\n return createHash(\"sha256\")\n .update(normalized + toolSuffix)\n .digest(\"hex\")\n .slice(0, 12);\n}\n","/**\n * Auto-update checker for ClawRouter.\n * Checks npm registry on startup and notifies user if update available.\n */\n\nimport { VERSION } from \"./version.js\";\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org/@blockrun/xclawrouter/latest\";\nconst CHECK_TIMEOUT_MS = 5_000; // Don't block startup for more than 5s\n\n/**\n * Compare semver versions. Returns:\n * 1 if a > b\n * 0 if a === b\n * -1 if a < b\n */\nfunction compareSemver(a: string, b: string): number {\n const pa = a.split(\".\").map(Number);\n const pb = b.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] || 0) > (pb[i] || 0)) return 1;\n if ((pa[i] || 0) < (pb[i] || 0)) return -1;\n }\n return 0;\n}\n\n/**\n * Check npm registry for latest version.\n * Non-blocking, silent on errors.\n */\nexport async function checkForUpdates(): Promise {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);\n\n const res = await fetch(NPM_REGISTRY, {\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeout);\n\n if (!res.ok) return;\n\n const data = (await res.json()) as { version?: string };\n const latest = data.version;\n\n if (!latest) return;\n\n if (compareSemver(latest, VERSION) > 0) {\n console.log(\"\");\n console.log(`\\x1b[33m⬆️ XClawRouter ${latest} available (you have ${VERSION})\\x1b[0m`);\n console.log(` Run: \\x1b[36mnpx @blockrun/xclawrouter@latest\\x1b[0m`);\n console.log(` Docs: \\x1b[36mhttps://blockrun.ai/clawrouter.md\\x1b[0m`);\n console.log(\"\");\n }\n } catch {\n // Silent fail - don't disrupt startup\n }\n}\n","/**\n * Exclude-models persistence module.\n *\n * Manages a user-configurable list of model IDs that the smart router\n * should never select. Stored as a sorted JSON array on disk.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { resolveModelAlias } from \"./models.js\";\n\nconst DEFAULT_FILE_PATH = join(homedir(), \".openclaw\", \"blockrun\", \"exclude-models.json\");\n\n/**\n * Load the exclude list from disk.\n * Returns an empty set if the file does not exist.\n */\nexport function loadExcludeList(filePath: string = DEFAULT_FILE_PATH): Set {\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const arr: unknown = JSON.parse(raw);\n if (Array.isArray(arr)) {\n return new Set(arr.filter((x): x is string => typeof x === \"string\"));\n }\n return new Set();\n } catch {\n return new Set();\n }\n}\n\n/**\n * Save a set of model IDs to disk as a sorted JSON array.\n */\nfunction saveExcludeList(set: Set, filePath: string): void {\n const sorted = [...set].sort();\n const dir = dirname(filePath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, JSON.stringify(sorted, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Add a model to the exclude list.\n * Resolves aliases before persisting.\n * @returns The resolved model ID.\n */\nexport function addExclusion(model: string, filePath: string = DEFAULT_FILE_PATH): string {\n const resolved = resolveModelAlias(model);\n const set = loadExcludeList(filePath);\n set.add(resolved);\n saveExcludeList(set, filePath);\n return resolved;\n}\n\n/**\n * Remove a model from the exclude list.\n * Resolves aliases before removing.\n * @returns true if the model was present and removed, false otherwise.\n */\nexport function removeExclusion(model: string, filePath: string = DEFAULT_FILE_PATH): boolean {\n const resolved = resolveModelAlias(model);\n const set = loadExcludeList(filePath);\n const had = set.delete(resolved);\n if (had) {\n saveExcludeList(set, filePath);\n }\n return had;\n}\n\n/**\n * Clear the entire exclude list.\n */\nexport function clearExclusions(filePath: string = DEFAULT_FILE_PATH): void {\n saveExcludeList(new Set(), filePath);\n}\n","/**\n * Configuration Module\n *\n * Reads environment variables at module load time.\n * Separated from network code to avoid security scanner false positives.\n */\n\nconst DEFAULT_PORT = 8402;\n\n/**\n * Proxy port configuration - resolved once at module load.\n * Reads BLOCKRUN_PROXY_PORT env var or defaults to 8402.\n */\nexport const PROXY_PORT = (() => {\n const envPort = process[\"env\"].BLOCKRUN_PROXY_PORT;\n if (envPort) {\n const parsed = parseInt(envPort, 10);\n if (!isNaN(parsed) && parsed > 0 && parsed < 65536) {\n return parsed;\n }\n }\n return DEFAULT_PORT;\n})();\n","/**\n * Session Journal - Memory layer for XClawRouter\n *\n * Maintains a compact record of key actions per session, enabling agents\n * to recall earlier work even when OpenClaw's sessions_history is truncated.\n *\n * How it works:\n * 1. As LLM responses flow through, extracts key actions (\"I created X\", \"I fixed Y\")\n * 2. Stores them in a compact journal per session\n * 3. When a request mentions past work (\"what did you do today?\"), injects the journal\n */\n\nexport interface JournalEntry {\n timestamp: number;\n action: string; // Compact description: \"Created login component\"\n model?: string;\n}\n\nexport interface SessionJournalConfig {\n /** Maximum entries per session (default: 100) */\n maxEntries?: number;\n /** Maximum age of entries in ms (default: 24 hours) */\n maxAgeMs?: number;\n /** Maximum events to extract per response (default: 5) */\n maxEventsPerResponse?: number;\n}\n\nconst DEFAULT_CONFIG: Required = {\n maxEntries: 100,\n maxAgeMs: 24 * 60 * 60 * 1000, // 24 hours\n maxEventsPerResponse: 5,\n};\n\nexport class SessionJournal {\n private journals: Map = new Map();\n private config: Required;\n\n constructor(config?: SessionJournalConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Extract key events from assistant response content.\n * Looks for patterns like \"I created...\", \"I fixed...\", \"Successfully...\"\n */\n extractEvents(content: string): string[] {\n if (!content || typeof content !== \"string\") {\n return [];\n }\n\n const events: string[] = [];\n const seen = new Set();\n\n // Patterns for identifying key actions\n // Note: Patterns allow optional words like \"also\", \"then\", \"have\" between \"I\" and verb\n const patterns = [\n // Creation patterns\n /I (?:also |then |have |)?(?:created|implemented|added|wrote|built|generated|set up|initialized) ([^.!?\\n]{10,150})/gi,\n // Fix patterns\n /I (?:also |then |have |)?(?:fixed|resolved|solved|patched|corrected|addressed|debugged) ([^.!?\\n]{10,150})/gi,\n // Completion patterns\n /I (?:also |then |have |)?(?:completed|finished|done with|wrapped up) ([^.!?\\n]{10,150})/gi,\n // Update patterns\n /I (?:also |then |have |)?(?:updated|modified|changed|refactored|improved|enhanced|optimized) ([^.!?\\n]{10,150})/gi,\n // Success patterns\n /Successfully ([^.!?\\n]{10,150})/gi,\n // Tool usage patterns (when agent uses tools)\n /I (?:also |then |have |)?(?:ran|executed|called|invoked) ([^.!?\\n]{10,100})/gi,\n ];\n\n for (const pattern of patterns) {\n // Reset pattern lastIndex for each iteration\n pattern.lastIndex = 0;\n\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const action = match[0].trim();\n\n // Skip if already seen (dedup)\n const normalized = action.toLowerCase();\n if (seen.has(normalized)) {\n continue;\n }\n\n // Validate length (not too short or too long)\n if (action.length >= 15 && action.length <= 200) {\n events.push(action);\n seen.add(normalized);\n }\n\n // Stop if we have enough events\n if (events.length >= this.config.maxEventsPerResponse) {\n break;\n }\n }\n\n if (events.length >= this.config.maxEventsPerResponse) {\n break;\n }\n }\n\n return events;\n }\n\n /**\n * Record events to the session journal.\n */\n record(sessionId: string, events: string[], model?: string): void {\n if (!sessionId || !events.length) {\n return;\n }\n\n const journal = this.journals.get(sessionId) || [];\n const now = Date.now();\n\n for (const action of events) {\n journal.push({\n timestamp: now,\n action,\n model,\n });\n }\n\n // Trim old entries and enforce max count\n const cutoff = now - this.config.maxAgeMs;\n const trimmed = journal.filter((e) => e.timestamp > cutoff).slice(-this.config.maxEntries);\n\n this.journals.set(sessionId, trimmed);\n }\n\n /**\n * Check if the user message indicates a need for historical context.\n */\n needsContext(lastUserMessage: string): boolean {\n if (!lastUserMessage || typeof lastUserMessage !== \"string\") {\n return false;\n }\n\n const lower = lastUserMessage.toLowerCase();\n\n // Trigger phrases that indicate user wants to recall past work\n const triggers = [\n // Direct questions about past work\n \"what did you do\",\n \"what have you done\",\n \"what did we do\",\n \"what have we done\",\n // Temporal references\n \"earlier\",\n \"before\",\n \"previously\",\n \"this session\",\n \"today\",\n \"so far\",\n // Summary requests\n \"remind me\",\n \"summarize\",\n \"summary of\",\n \"recap\",\n // Progress inquiries\n \"your work\",\n \"your progress\",\n \"accomplished\",\n \"achievements\",\n \"completed tasks\",\n ];\n\n return triggers.some((t) => lower.includes(t));\n }\n\n /**\n * Format the journal for injection into system message.\n * Returns null if journal is empty.\n */\n format(sessionId: string): string | null {\n const journal = this.journals.get(sessionId);\n if (!journal?.length) {\n return null;\n }\n\n const lines = journal.map((e) => {\n const time = new Date(e.timestamp).toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n });\n return `- ${time}: ${e.action}`;\n });\n\n return `[Session Memory - Key Actions]\\n${lines.join(\"\\n\")}`;\n }\n\n /**\n * Get the raw journal entries for a session (for debugging/testing).\n */\n getEntries(sessionId: string): JournalEntry[] {\n return this.journals.get(sessionId) || [];\n }\n\n /**\n * Clear journal for a specific session.\n */\n clear(sessionId: string): void {\n this.journals.delete(sessionId);\n }\n\n /**\n * Clear all journals.\n */\n clearAll(): void {\n this.journals.clear();\n }\n\n /**\n * Get stats about the journal.\n */\n getStats(): { sessions: number; totalEntries: number } {\n let totalEntries = 0;\n for (const entries of this.journals.values()) {\n totalEntries += entries.length;\n }\n return {\n sessions: this.journals.size,\n totalEntries,\n };\n }\n}\n","/**\n * Upstream Proxy Support\n *\n * Configures a global fetch dispatcher when BLOCKRUN_UPSTREAM_PROXY is set.\n * Supports http://, https://, and socks5:// proxy URLs.\n *\n * Usage:\n * BLOCKRUN_UPSTREAM_PROXY=socks5://127.0.0.1:1080 clawrouter start\n * BLOCKRUN_UPSTREAM_PROXY=http://127.0.0.1:8080 clawrouter start\n */\n\n/**\n * Apply upstream proxy settings to the global fetch dispatcher.\n * Called once at proxy startup if BLOCKRUN_UPSTREAM_PROXY is set.\n * Returns the proxy URL that was configured, or undefined if none.\n */\nexport async function applyUpstreamProxy(proxyUrl?: string): Promise {\n const url = proxyUrl ?? process.env.BLOCKRUN_UPSTREAM_PROXY;\n if (!url) return undefined;\n\n // Validate URL format\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n console.warn(\n `[XClawRouter] Invalid BLOCKRUN_UPSTREAM_PROXY URL: ${url} — skipping proxy setup`,\n );\n return undefined;\n }\n\n const scheme = parsed.protocol; // \"http:\", \"https:\", \"socks5:\"\n\n try {\n if (scheme === \"socks5:\" || scheme === \"socks4:\") {\n const { Socks5ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new Socks5ProxyAgent(url));\n } else if (scheme === \"http:\" || scheme === \"https:\") {\n const { ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new ProxyAgent(url));\n } else {\n console.warn(\n `[XClawRouter] Unsupported proxy scheme \"${scheme}\" in BLOCKRUN_UPSTREAM_PROXY — use http:// or socks5://`,\n );\n return undefined;\n }\n } catch (err) {\n console.warn(\n `[XClawRouter] Failed to configure upstream proxy \"${url}\": ${err instanceof Error ? err.message : err}`,\n );\n return undefined;\n }\n\n return url;\n}\n","/**\n * Extract tool calls that some models emit as XML/text inside `content`\n * instead of (or alongside an empty) structured `tool_calls` array.\n *\n * Two known shapes are recognized:\n *\n * 1. **OpenClaw-style** — `NAMEKV...`\n * Observed in production: OpenClaw prompts certain models with this format\n * and they honor it, but the calls land in `content` as plain text instead\n * of in `message.tool_calls`. At least one `arg_key`/`arg_value` pair is\n * required so a prose mention like `name` in\n * documentation does not mis-fire.\n *\n * 2. **Anthropic-style** — `V...`\n * Observed from Moonshot Kimi K2.6 in repro. The `` outer\n * tag is unique enough that prose mis-fires are very rare, so zero\n * parameters are still recognized inside this shape.\n *\n * Values are best-effort coerced via `JSON.parse` (so `\"5\"` → `5`, `\"true\"` →\n * `true`); strings that don't parse as JSON stay as strings.\n */\nimport { randomBytes } from \"node:crypto\";\n\nexport type ExtractedToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport type ExtractionResult = {\n toolCalls: ExtractedToolCall[];\n cleanedContent: string;\n};\n\n// Require at least one arg_key/arg_value pair to avoid matching prose\n// documentation that happens to mention `name`.\nconst OPENCLAW_TOOL_CALL_RE =\n /([^<]+?)((?:[\\s\\S]*?<\\/arg_key>\\s*[\\s\\S]*?<\\/arg_value>\\s*)+)<\\/tool_call>/g;\n\nconst OPENCLAW_ARG_RE = /([\\s\\S]*?)<\\/arg_key>\\s*([\\s\\S]*?)<\\/arg_value>/g;\n\nconst ANTHROPIC_BLOCK_RE = /]*>([\\s\\S]*?)<\\/function_calls\\s*>/g;\nconst ANTHROPIC_INVOKE_RE = /]*>([\\s\\S]*?)<\\/invoke\\s*>/g;\nconst ANTHROPIC_PARAM_RE = /]*>([\\s\\S]*?)<\\/parameter\\s*>/g;\n\nfunction generateId(): string {\n // OpenAI-shaped: \"call_\" + base64url chars. Length comparable to real OpenAI ids.\n return `call_${randomBytes(12).toString(\"base64url\")}`;\n}\n\nfunction coerceValue(raw: string): unknown {\n const trimmed = raw.trim();\n if (trimmed === \"\") return raw;\n try {\n return JSON.parse(trimmed);\n } catch {\n return raw;\n }\n}\n\ntype Range = { start: number; end: number };\n\nfunction extractOpenClawCalls(content: string): {\n calls: ExtractedToolCall[];\n matches: Range[];\n} {\n const calls: ExtractedToolCall[] = [];\n const matches: Range[] = [];\n\n OPENCLAW_TOOL_CALL_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = OPENCLAW_TOOL_CALL_RE.exec(content)) !== null) {\n const name = match[1]?.trim();\n if (!name) continue;\n const argsBlock = match[2] ?? \"\";\n\n const args: Record = {};\n OPENCLAW_ARG_RE.lastIndex = 0;\n let argMatch: RegExpExecArray | null;\n while ((argMatch = OPENCLAW_ARG_RE.exec(argsBlock)) !== null) {\n const key = argMatch[1]?.trim();\n const valueRaw = argMatch[2] ?? \"\";\n if (key) {\n args[key] = coerceValue(valueRaw);\n }\n }\n\n calls.push({\n id: generateId(),\n type: \"function\",\n function: { name, arguments: JSON.stringify(args) },\n });\n matches.push({ start: match.index, end: match.index + match[0].length });\n }\n\n return { calls, matches };\n}\n\nfunction extractAnthropicCalls(content: string): {\n calls: ExtractedToolCall[];\n matches: Range[];\n} {\n const calls: ExtractedToolCall[] = [];\n const matches: Range[] = [];\n\n ANTHROPIC_BLOCK_RE.lastIndex = 0;\n let blockMatch: RegExpExecArray | null;\n while ((blockMatch = ANTHROPIC_BLOCK_RE.exec(content)) !== null) {\n const inner = blockMatch[1] ?? \"\";\n let invokeFound = false;\n\n ANTHROPIC_INVOKE_RE.lastIndex = 0;\n let invokeMatch: RegExpExecArray | null;\n while ((invokeMatch = ANTHROPIC_INVOKE_RE.exec(inner)) !== null) {\n const name = invokeMatch[1];\n if (!name) continue;\n const invokeInner = invokeMatch[2] ?? \"\";\n\n const args: Record = {};\n ANTHROPIC_PARAM_RE.lastIndex = 0;\n let paramMatch: RegExpExecArray | null;\n while ((paramMatch = ANTHROPIC_PARAM_RE.exec(invokeInner)) !== null) {\n const key = paramMatch[1];\n const valueRaw = paramMatch[2] ?? \"\";\n if (key) {\n args[key] = coerceValue(valueRaw);\n }\n }\n\n calls.push({\n id: generateId(),\n type: \"function\",\n function: { name, arguments: JSON.stringify(args) },\n });\n invokeFound = true;\n }\n\n if (invokeFound) {\n matches.push({ start: blockMatch.index, end: blockMatch.index + blockMatch[0].length });\n }\n }\n\n return { calls, matches };\n}\n\nfunction stripRanges(content: string, ranges: Range[]): string {\n if (ranges.length === 0) return content;\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n let cleaned = \"\";\n let cursor = 0;\n for (const r of sorted) {\n if (r.start >= cursor) {\n cleaned += content.slice(cursor, r.start);\n cursor = r.end;\n }\n }\n cleaned += content.slice(cursor);\n return cleaned;\n}\n\nexport function extractTextualToolCalls(content: string): ExtractionResult {\n if (!content) {\n return { toolCalls: [], cleanedContent: \"\" };\n }\n\n const openClaw = extractOpenClawCalls(content);\n const anthropic = extractAnthropicCalls(content);\n\n const toolCalls = [...openClaw.calls, ...anthropic.calls];\n if (toolCalls.length === 0) {\n return { toolCalls: [], cleanedContent: content };\n }\n\n const cleanedContent = stripRanges(content, [...openClaw.matches, ...anthropic.matches]);\n return { toolCalls, cleanedContent };\n}\n","#!/usr/bin/env node\n/**\n * XClawRouter CLI\n *\n * Standalone proxy for deployed setups where the proxy needs to survive gateway restarts.\n *\n * Usage:\n * npx @blockrun/xclawrouter # Start standalone proxy\n * npx @blockrun/xclawrouter --version # Show version\n * npx @blockrun/xclawrouter --port 8402 # Custom port\n *\n * For production deployments, use with PM2:\n * pm2 start \"npx @blockrun/xclawrouter\" --name clawrouter\n */\n\nimport { startProxy, getProxyPort } from \"./proxy.js\";\nimport { VERSION } from \"./version.js\";\nimport {\n resolveOrGenerateWalletKey,\n resolvePaymentChain,\n recoverWalletFromMnemonic,\n savePaymentChain,\n formatAgenticWalletStatus,\n detectOnchainosWallet,\n OnchainOsRequiredError,\n ONCHAINOS_INSTALLER_URL,\n} from \"./auth.js\";\nimport { basename } from \"node:path\";\nimport { OnchainOsAdapter, resolveOnchainosBin } from \"./onchainos-adapter.js\";\nimport { execSync, execFileSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { createInterface } from \"node:readline/promises\";\nimport { getSolanaAddress } from \"./wallet.js\";\nimport { generateReport } from \"./report.js\";\nimport { formatRecentLogs } from \"./stats.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { PARTNER_SERVICES } from \"./partners/index.js\";\n\nfunction printHelp(): void {\n console.log(`\nXClawRouter v${VERSION} - Smart LLM Router\n\nUsage:\n xclawrouter [options]\n xclawrouter setup # Interactive OKX Agentic Wallet onboarding\n xclawrouter status # Live proxy status (wallet, balance, chain)\n xclawrouter wallet # Wallet details + balance\n xclawrouter models # List available models\n xclawrouter stats [--days ] # Usage stats (default: 7 days)\n xclawrouter doctor [opus] [question]\n xclawrouter partners [test]\n xclawrouter report [daily|weekly|monthly] [--json]\n xclawrouter logs [--days ]\n\nOptions:\n --version, -v Show version number\n --help, -h Show this help message\n --port Port to listen on (default: ${getProxyPort()})\n\nQuery Commands (talk to running proxy on localhost:${getProxyPort()}):\n status Proxy status: wallet, balance, payment chain\n wallet Wallet addresses + USDC balance\n models List all available models with pricing\n stats Usage breakdown: requests, cost, top models\n stats --days 14 Custom time range (max 30 days)\n cache Response cache stats (hit rate, size)\n\nManagement Commands:\n setup Interactive OKX Agentic Wallet onboarding (email login)\n doctor AI-powered diagnostics (default: Sonnet ~$0.003)\n doctor opus Use Opus for deeper analysis (~$0.01)\n logs Per-request breakdown: model, cost, latency, status\n logs --days 7 Show last 7 days of requests (default: 1 day)\n partners List available partner APIs with pricing\n partners test Test partner API endpoints (expect 402 = alive)\n wallet recover Restore wallet.key from mnemonic (if generated by XClawRouter)\n chain solana Switch to Solana (persists)\n chain base Switch to Base EVM (persists)\n\nEnvironment Variables:\n BLOCKRUN_WALLET_KEY Override wallet key (legacy local-key path)\n BLOCKRUN_PROXY_PORT Default proxy port (default: 8402)\n XCLAWROUTER_USE_LOCAL_WALLET=1 Opt into legacy local BIP-39 wallet generation\n (default: require OKX Agentic Wallet via onchainos)\n XCLAWROUTER_ONCHAINOS_BIN Override onchainos CLI path\n\nFor more info: https://blockrun.ai/clawrouter.md\n`);\n}\n\n/** Query the running proxy HTTP API */\nasync function queryProxy(path: string, port: number): Promise {\n const res = await fetch(`http://127.0.0.1:${port}${path}`);\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nasync function cmdStatus(port: number): Promise {\n try {\n const data = (await queryProxy(\"/health?full=true\", port)) as Record;\n console.log(`\\nClawRouter Status (port ${port})\\n`);\n console.log(` Status: ${data.status}`);\n console.log(` Payment Chain: ${data.paymentChain}`);\n console.log(` EVM Wallet: ${data.wallet}`);\n if (data.solana) console.log(` Solana Wallet: ${data.solana}`);\n console.log(` Balance: ${data.balance ?? \"unknown\"}`);\n if (data.isLow) console.log(` ⚠ Balance is low`);\n if (data.isEmpty) console.log(` ⚠ Balance is empty — using free models`);\n if (data.upstreamProxy) console.log(` Upstream Proxy: ${data.upstreamProxy}`);\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n console.error(` Is the proxy running? Start with: npx @blockrun/xclawrouter`);\n process.exit(1);\n }\n}\n\nasync function cmdWallet(port: number): Promise {\n try {\n const data = (await queryProxy(\"/health?full=true\", port)) as Record;\n console.log(`\\nClawRouter Wallet\\n`);\n console.log(` Payment Chain: ${data.paymentChain}`);\n console.log();\n console.log(` Base (EVM):`);\n console.log(` Address: ${data.wallet}`);\n console.log(` Fund: https://basescan.org/address/${data.wallet}`);\n if (data.solana) {\n console.log();\n console.log(` Solana:`);\n console.log(` Address: ${data.solana}`);\n console.log(` Fund: https://solscan.io/account/${data.solana}`);\n }\n console.log();\n console.log(` Balance: ${data.balance ?? \"unknown\"} (USDC)`);\n if (data.isEmpty) console.log(` ⚠ Empty — fund wallet or use free models`);\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\nasync function cmdModels(port: number): Promise {\n try {\n const data = (await queryProxy(\"/v1/models\", port)) as {\n data: Array<{ id: string; owned_by?: string }>;\n };\n console.log(`\\nAvailable Models (${data.data.length})\\n`);\n\n // Group by provider\n const groups = new Map();\n for (const m of data.data) {\n const provider = m.id.includes(\"/\") ? m.id.split(\"/\")[0] : \"blockrun\";\n if (!groups.has(provider)) groups.set(provider, []);\n groups.get(provider)!.push(m.id);\n }\n\n for (const [provider, models] of groups) {\n console.log(` ${provider} (${models.length}):`);\n for (const id of models) {\n console.log(` ${id}`);\n }\n console.log();\n }\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\nasync function cmdStats(port: number, days: number): Promise {\n try {\n const data = (await queryProxy(`/stats?days=${days}`, port)) as Record;\n const stats = data as {\n totalRequests?: number;\n totalCostUsd?: number;\n savedUsd?: number;\n savingsPercent?: number;\n topModels?: Array<{ model: string; requests: number; costUsd: number }>;\n };\n\n console.log(`\\nUsage Stats (last ${days} days)\\n`);\n console.log(` Requests: ${stats.totalRequests ?? 0}`);\n console.log(` Cost: $${(stats.totalCostUsd ?? 0).toFixed(4)}`);\n if (stats.savedUsd) {\n console.log(\n ` Saved: $${stats.savedUsd.toFixed(4)} (${stats.savingsPercent?.toFixed(0) ?? 0}% vs Opus)`,\n );\n }\n\n if (stats.topModels && stats.topModels.length > 0) {\n console.log();\n console.log(` Top Models:`);\n for (const m of stats.topModels.slice(0, 10)) {\n console.log(\n ` ${m.model.padEnd(40)} ${String(m.requests).padStart(5)} reqs $${m.costUsd.toFixed(4)}`,\n );\n }\n }\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\n/**\n * Bootstrap OKX Agentic Wallet for XClawRouter — minimal direct flow,\n * polished CLI presentation.\n *\n * The binary outputs raw JSON for every command (`{\"ok\":true,...}`). We\n * capture stdio (not inherit) so users don't see the JSON, then surface\n * a clean status line per step. ANSI escapes only — no extra deps.\n */\n\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n} as const;\nconst useColor = process.stdout.isTTY && !process.env.NO_COLOR && process.env.TERM !== \"dumb\";\nconst c = (color: string, s: string): string => (useColor ? `${color}${s}${ANSI.reset}` : s);\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nconst stripAnsi = (s: string): string => s.replace(ANSI_RE, \"\");\n\n/**\n * Translate an `OnchainOsDetectionResult.kind` into a one-line plain-English\n * description for end users. Surfacing the raw discriminant (e.g.\n * `no-evm-address`) in CLI error output reads like an internal enum leak —\n * use this whenever a detection failure is shown to a human.\n */\nfunction humanizeDetectionKind(\n kind: \"no-binary\" | \"not-logged-in\" | \"status-error\" | \"no-evm-address\" | \"addresses-error\",\n): string {\n switch (kind) {\n case \"no-binary\":\n return \"onchainos binary is missing from PATH\";\n case \"not-logged-in\":\n return \"onchainos is installed but reports `loggedIn: false`\";\n case \"status-error\":\n return \"`onchainos wallet status` returned an error\";\n case \"no-evm-address\":\n return \"no EVM address found — is this a Solana-only OKX account?\";\n case \"addresses-error\":\n return \"`onchainos wallet addresses` returned an error\";\n }\n}\n\nfunction printSetupHeader(): void {\n console.log();\n console.log(\" \" + c(ANSI.bold + ANSI.cyan, \"🦞 XClawRouter — Wallet Setup\"));\n console.log(\" \" + c(ANSI.dim, \"OKX Agentic Wallet (onchainos)\"));\n console.log();\n}\n\n/**\n * Live USDC balance on Base for the wallet — queried via BalanceMonitor.\n * Optional: if the network is unavailable we render the box without it\n * rather than blocking setup completion.\n */\ntype SetupBalanceSnapshot = {\n balanceUSD: string;\n isLow: boolean;\n isEmpty: boolean;\n};\n\nfunction printSetupSummary(\n address: string,\n email: string | undefined,\n balance: SetupBalanceSnapshot | undefined,\n): void {\n const lines = [\n c(ANSI.bold + ANSI.green, \"✓ Wallet ready\"),\n \"\",\n c(ANSI.dim, \"EVM address\"),\n c(ANSI.bold, address),\n ];\n if (email) {\n lines.push(\"\");\n lines.push(c(ANSI.dim, \"Email \") + email);\n }\n lines.push(c(ANSI.dim, \"Signing \") + \"OKX TEE \" + c(ANSI.dim, \"(no local private key)\"));\n\n // Live balance row, severity-tagged. Three buckets:\n // empty (< $0.0001) → red ⚠, explicit \"fund to unlock paid models\"\n // low ($0.0001..$1) → yellow ⚠, suggested top-up\n // ok (≥ $1) → green ✓\n // Solana support isn't shipped yet on OKX onchainos (see src/proxy.ts),\n // so the balance shown is the Base-chain USDC only — name the chain\n // explicitly so users don't bridge USDC to the wrong network.\n lines.push(\"\");\n if (!balance) {\n lines.push(\n c(ANSI.dim, \"Balance \") + c(ANSI.dim, \"(could not query Base RPC — check your network)\"),\n );\n } else if (balance.isEmpty) {\n lines.push(\n c(ANSI.dim, \"Balance \") +\n c(ANSI.bold, \"$0.00 USDC on Base\") +\n \" \" +\n c(ANSI.yellow, \"⚠ empty — fund to unlock paid models\"),\n );\n } else if (balance.isLow) {\n lines.push(\n c(ANSI.dim, \"Balance \") +\n c(ANSI.bold, balance.balanceUSD + \" USDC on Base\") +\n \" \" +\n c(ANSI.yellow, \"⚠ low (recommend $5+ for stable paid usage)\"),\n );\n } else {\n lines.push(\n c(ANSI.dim, \"Balance \") +\n c(ANSI.bold, balance.balanceUSD + \" USDC on Base\") +\n \" \" +\n c(ANSI.green, \"✓ ready for paid models\"),\n );\n }\n\n // Only show the funding walkthrough when the user actually needs to fund.\n // Avoids cluttering the box for already-funded users on every setup run.\n const needsFunding = !balance || balance.isEmpty || balance.isLow;\n if (needsFunding) {\n lines.push(\"\");\n lines.push(c(ANSI.dim, \"Fund via OKX (Base network, USDC):\"));\n lines.push(c(ANSI.dim, \" 1. \") + \"Open the OKX app → Wallet\");\n lines.push(\n c(ANSI.dim, \" 2. \") + \"Send USDC on \" + c(ANSI.bold, \"Base\") + \" to the address above\",\n );\n lines.push(c(ANSI.dim, \" 3. \") + c(ANSI.dim, \"~$5 covers thousands of paid requests\"));\n }\n\n const width = Math.max(...lines.map((l) => stripAnsi(l).length));\n const horiz = \"─\".repeat(width + 2);\n console.log(\" ┌\" + horiz + \"┐\");\n for (const line of lines) {\n const pad = \" \".repeat(width - stripAnsi(line).length);\n console.log(\" │ \" + line + pad + \" │\");\n }\n console.log(\" └\" + horiz + \"┘\");\n}\n\n/**\n * Query the wallet's Base-chain USDC balance via BalanceMonitor. Returns\n * undefined on any failure (network, RPC, contract read) so the caller can\n * fall back to a \"could not query\" notice rather than aborting setup.\n *\n * Imported lazily to keep the cli.ts import graph slim and avoid loading\n * viem until we actually need it.\n */\nasync function fetchSetupBalanceSnapshot(\n address: string,\n): Promise {\n try {\n const { BalanceMonitor } = await import(\"./balance.js\");\n const info = await new BalanceMonitor(address).checkBalance();\n return {\n balanceUSD: info.balanceUSD,\n isLow: info.isLow,\n isEmpty: info.isEmpty,\n };\n } catch {\n return undefined;\n }\n}\n\nasync function cmdSetup(): Promise {\n printSetupHeader();\n\n // ── Step 1: onchainos binary ────────────────────────────────────────\n const adapter = new OnchainOsAdapter();\n if (!adapter.isInstalled()) {\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Installing onchainos binary…\\n\");\n process.stdout.write(\" \" + c(ANSI.dim, `(via ${ONCHAINOS_INSTALLER_URL})`) + \"\\n\");\n try {\n execSync(`curl -sSL --max-time 60 ${ONCHAINOS_INSTALLER_URL} | sh`, {\n stdio: [\"ignore\", \"ignore\", \"inherit\"],\n env: { ...process.env, PATH: `${homedir()}/.local/bin:${process.env.PATH ?? \"\"}` },\n });\n process.env.PATH = `${homedir()}/.local/bin:${process.env.PATH ?? \"\"}`;\n console.log(\" \" + c(ANSI.green, \"✓\") + \" onchainos installed\");\n } catch {\n console.error(\"\\n \" + c(ANSI.red, \"✗\") + \" onchainos install failed.\");\n console.error(\" Install manually then re-run setup:\");\n console.error(\" \" + c(ANSI.dim, `curl -sSL ${ONCHAINOS_INSTALLER_URL} | sh`));\n process.exit(1);\n }\n } else {\n console.log(\" \" + c(ANSI.green, \"✓\") + \" onchainos detected\");\n }\n\n // ── Step 2: already logged in? ──────────────────────────────────────\n const detection = await detectOnchainosWallet();\n if (detection.kind === \"ok\") {\n console.log(\" \" + c(ANSI.green, \"✓\") + \" Already signed in\");\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Checking USDC balance on Base…\");\n const bal = await fetchSetupBalanceSnapshot(detection.address);\n process.stdout.write(\n \"\\r \" + c(ANSI.green, \"✓\") + \" Balance checked \\n\",\n );\n console.log();\n printSetupSummary(detection.address, detection.email, bal);\n console.log();\n console.log(\n \" \" + c(ANSI.cyan, \"→\") + \" Restart OpenClaw: \" + c(ANSI.bold, \"openclaw gateway restart\"),\n );\n console.log();\n return;\n }\n console.log();\n\n // ── Step 3: collect email ───────────────────────────────────────────\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n let email: string;\n try {\n email = (await rl.question(\" \" + c(ANSI.cyan, \"→\") + \" Email: \")).trim();\n } finally {\n rl.close();\n }\n if (!email.includes(\"@\")) {\n console.error(\" \" + c(ANSI.red, \"✗\") + ` \"${email}\" doesn't look like an email address.`);\n process.exit(1);\n }\n\n // ── Step 4: send OTP (capture JSON output) ──────────────────────────\n const bin = resolveOnchainosBin();\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Sending login code to \" + email + \"…\");\n try {\n execFileSync(bin, [\"wallet\", \"login\", email], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch {\n process.stdout.write(\n \"\\r \" + c(ANSI.red, \"✗\") + \" Could not send code. Check the address and try again.\\n\",\n );\n process.exit(1);\n }\n process.stdout.write(\n \"\\r \" + c(ANSI.green, \"✓\") + \" Code sent — check your inbox at \" + c(ANSI.bold, email) + \"\\n\",\n );\n console.log();\n\n // ── Step 5: collect OTP ─────────────────────────────────────────────\n const rlOtp = createInterface({ input: process.stdin, output: process.stdout });\n let otp: string;\n try {\n otp = (await rlOtp.question(\" \" + c(ANSI.cyan, \"→\") + \" Login code: \")).trim();\n } finally {\n rlOtp.close();\n }\n if (!/^\\d{4,8}$/.test(otp)) {\n console.error(\n \" \" + c(ANSI.red, \"✗\") + ` \"${otp}\" doesn't look like a code (expected 4-8 digits).`,\n );\n process.exit(1);\n }\n\n // ── Step 6: verify ──────────────────────────────────────────────────\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Verifying code…\");\n try {\n execFileSync(bin, [\"wallet\", \"verify\", otp], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch {\n process.stdout.write(\n \"\\r \" + c(ANSI.red, \"✗\") + \" Verification failed. Re-run setup for a new code.\\n\",\n );\n process.exit(1);\n }\n process.stdout.write(\n \"\\r \" + c(ANSI.green, \"✓\") + \" Verified \\n\",\n );\n\n // ── Step 7: re-detect + summary ─────────────────────────────────────\n const after = await detectOnchainosWallet();\n if (after.kind !== \"ok\") {\n console.error(\n \"\\n \" +\n c(ANSI.red, \"✗\") +\n ` Login completed but the wallet still isn't detected (${humanizeDetectionKind(after.kind)}).`,\n );\n console.error(\" Run `onchainos wallet status` to diagnose.\");\n process.exit(1);\n }\n\n process.stdout.write(\" \" + c(ANSI.yellow, \"⏳\") + \" Checking USDC balance on Base…\");\n const balanceAfter = await fetchSetupBalanceSnapshot(after.address);\n process.stdout.write(\"\\r \" + c(ANSI.green, \"✓\") + \" Balance checked \\n\");\n console.log();\n printSetupSummary(after.address, after.email, balanceAfter);\n console.log();\n console.log(\n \" \" + c(ANSI.cyan, \"→\") + \" Restart OpenClaw: \" + c(ANSI.bold, \"openclaw gateway restart\"),\n );\n console.log();\n}\n\nasync function cmdCache(port: number): Promise {\n try {\n const data = (await queryProxy(\"/cache\", port)) as Record;\n console.log(`\\nCache Stats\\n`);\n for (const [key, value] of Object.entries(data)) {\n console.log(` ${key}: ${JSON.stringify(value)}`);\n }\n console.log();\n } catch {\n console.error(`✗ Cannot connect to XClawRouter on port ${port}`);\n process.exit(1);\n }\n}\n\nfunction parseArgs(args: string[]): {\n version: boolean;\n help: boolean;\n doctor: boolean;\n logs: boolean;\n logsDays: number;\n partners: boolean;\n partnersTest: boolean;\n report: boolean;\n reportPeriod: \"daily\" | \"weekly\" | \"monthly\";\n reportJson: boolean;\n walletRecover: boolean;\n setup: boolean;\n chain?: \"solana\" | \"base\";\n port?: number;\n // Query commands\n queryStatus: boolean;\n queryWallet: boolean;\n queryModels: boolean;\n queryStats: boolean;\n queryStatsDays: number;\n queryCache: boolean;\n} {\n const result = {\n version: false,\n help: false,\n doctor: false,\n logs: false,\n logsDays: 1,\n partners: false,\n partnersTest: false,\n report: false,\n reportPeriod: \"daily\" as \"daily\" | \"weekly\" | \"monthly\",\n reportJson: false,\n walletRecover: false,\n setup: false,\n chain: undefined as \"solana\" | \"base\" | undefined,\n port: undefined as number | undefined,\n queryStatus: false,\n queryWallet: false,\n queryModels: false,\n queryStats: false,\n queryStatsDays: 7,\n queryCache: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--version\" || arg === \"-v\") {\n result.version = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (arg === \"status\") {\n result.queryStatus = true;\n } else if (arg === \"models\") {\n result.queryModels = true;\n } else if (arg === \"stats\") {\n result.queryStats = true;\n if (args[i + 1] === \"--days\" && args[i + 2]) {\n result.queryStatsDays = Math.min(parseInt(args[i + 2], 10) || 7, 30);\n i += 2;\n }\n } else if (arg === \"cache\") {\n result.queryCache = true;\n } else if (arg === \"doctor\" || arg === \"--doctor\") {\n result.doctor = true;\n } else if (arg === \"logs\") {\n result.logs = true;\n if (args[i + 1] === \"--days\" && args[i + 2]) {\n result.logsDays = parseInt(args[i + 2], 10) || 1;\n i += 2;\n }\n } else if (arg === \"partners\") {\n result.partners = true;\n if (args[i + 1] === \"test\") {\n result.partnersTest = true;\n i++;\n }\n } else if (arg === \"report\") {\n result.report = true;\n const next = args[i + 1];\n if (next && [\"daily\", \"weekly\", \"monthly\"].includes(next)) {\n result.reportPeriod = next as \"daily\" | \"weekly\" | \"monthly\";\n i++;\n if (args[i + 1] === \"--json\") {\n result.reportJson = true;\n i++;\n }\n } else if (next === \"--json\") {\n result.reportJson = true;\n i++;\n }\n } else if (arg === \"wallet\") {\n if (args[i + 1] === \"recover\") {\n result.walletRecover = true;\n i++;\n } else if (args[i + 1] === \"solana\" || args[i + 1] === \"base\") {\n result.chain = args[i + 1] as \"solana\" | \"base\";\n i++;\n } else {\n result.queryWallet = true;\n }\n } else if (\n (arg === \"chain\" || arg === \"/wallet\") &&\n (args[i + 1] === \"solana\" || args[i + 1] === \"base\")\n ) {\n result.chain = args[i + 1] as \"solana\" | \"base\";\n i++;\n } else if (arg === \"setup\") {\n result.setup = true;\n } else if (arg === \"--port\" && args[i + 1]) {\n result.port = parseInt(args[i + 1], 10);\n i++;\n }\n }\n\n return result;\n}\n\nasync function main(): Promise {\n // Deprecation warning for the legacy `clawrouter` bin name. The package\n // renamed itself to `@blockrun/xclawrouter` in v0.12.179 and the bin entry\n // became `xclawrouter` in v0.12.180. We keep `clawrouter` as a no-op alias\n // pointing at the same dist/cli.js for one release so users with shell\n // aliases, pm2 processes, or shipped onboarding docs aren't broken on\n // upgrade — but we tell them what to migrate to. Removed in v0.13.\n const invokedAs = process.argv[1] ? basename(process.argv[1]) : \"\";\n if (invokedAs === \"clawrouter\" && !process.env.XCLAW_SUPPRESS_RENAME_NOTICE) {\n console.warn(\n \"[XClawRouter] `clawrouter` is deprecated — use `xclawrouter` (alias removed in v0.13).\",\n );\n }\n\n const args = parseArgs(process.argv.slice(2));\n\n if (args.version) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.help) {\n printHelp();\n process.exit(0);\n }\n\n // Query commands — talk to running proxy\n const queryPort = args.port ?? getProxyPort();\n\n if (args.queryStatus) {\n await cmdStatus(queryPort);\n process.exit(0);\n }\n if (args.queryWallet) {\n await cmdWallet(queryPort);\n process.exit(0);\n }\n if (args.queryModels) {\n await cmdModels(queryPort);\n process.exit(0);\n }\n if (args.queryStats) {\n await cmdStats(queryPort, args.queryStatsDays);\n process.exit(0);\n }\n if (args.queryCache) {\n await cmdCache(queryPort);\n process.exit(0);\n }\n\n if (args.doctor) {\n // Parse: doctor [opus|sonnet] [question...]\n const rawArgs = process.argv.slice(2);\n const doctorIndex = rawArgs.findIndex((a) => a === \"doctor\" || a === \"--doctor\");\n const afterDoctor = rawArgs.slice(doctorIndex + 1);\n\n // Check if first arg is model selection\n let model: \"sonnet\" | \"opus\" = \"sonnet\"; // default to cheaper\n let questionArgs = afterDoctor;\n\n if (afterDoctor[0] === \"opus\") {\n model = \"opus\";\n questionArgs = afterDoctor.slice(1);\n } else if (afterDoctor[0] === \"sonnet\") {\n model = \"sonnet\";\n questionArgs = afterDoctor.slice(1);\n }\n\n const userQuestion = questionArgs.join(\" \").trim() || undefined;\n await runDoctor(userQuestion, model);\n process.exit(0);\n }\n\n if (args.logs) {\n const output = await formatRecentLogs(args.logsDays);\n console.log(output);\n process.exit(0);\n }\n\n if (args.partners) {\n if (PARTNER_SERVICES.length === 0) {\n console.log(\"No partner APIs available.\");\n process.exit(0);\n }\n\n console.log(`\\nClawRouter Partner APIs (v${VERSION})\\n`);\n\n // Compact grouped view — one line per tool, grouped by category.\n const byCategory = new Map();\n for (const svc of PARTNER_SERVICES) {\n const bucket = byCategory.get(svc.category) ?? [];\n bucket.push(svc);\n byCategory.set(svc.category, bucket);\n }\n const toolWidth = Math.max(...PARTNER_SERVICES.map((s) => `blockrun_${s.id}`.length), 28);\n const priceWidth = Math.max(\n ...PARTNER_SERVICES.map((s) =>\n s.pricing.perUnit === \"free\" ? 4 : `${s.pricing.perUnit}/${s.pricing.unit}`.length,\n ),\n 12,\n );\n for (const [category, services] of byCategory) {\n console.log(`${category}`);\n for (const svc of services) {\n const tool = `blockrun_${svc.id}`.padEnd(toolWidth);\n const price = (\n svc.pricing.perUnit === \"free\" ? \"free\" : `${svc.pricing.perUnit}/${svc.pricing.unit}`\n ).padEnd(priceWidth);\n console.log(` ${tool} ${price} ${svc.shortDescription}`);\n }\n console.log();\n }\n\n if (args.partnersTest) {\n console.log(\"Testing partner endpoints...\\n\");\n const apiBase = \"https://blockrun.ai/api\";\n for (const svc of PARTNER_SERVICES) {\n const url = `${apiBase}/v1${svc.proxyPath}`;\n try {\n const response = await fetch(url, { method: \"GET\" });\n const status = response.status;\n const ok = status === 402 ? \"alive (402 = payment required)\" : `status ${status}`;\n console.log(` ${svc.id}: ${ok}`);\n } catch (err) {\n console.log(` ${svc.id}: error - ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n console.log();\n }\n\n process.exit(0);\n }\n\n if (args.walletRecover) {\n await recoverWalletFromMnemonic();\n process.exit(0);\n }\n\n if (args.chain) {\n const targetChain = args.chain;\n\n if (targetChain === \"solana\") {\n // Ensure Solana wallet is set up (mnemonic → keypair)\n const { existsSync } = await import(\"fs\");\n const { MNEMONIC_FILE, setupSolana } = await import(\"./auth.js\");\n const { deriveSolanaKeyBytes, getSolanaAddress } = await import(\"./wallet.js\");\n\n let solanaAddr: string;\n if (existsSync(MNEMONIC_FILE)) {\n // Already set up — derive address from existing mnemonic\n const { readFileSync } = await import(\"fs\");\n const mnemonic = readFileSync(MNEMONIC_FILE, \"utf8\").trim();\n const keyBytes = deriveSolanaKeyBytes(mnemonic);\n solanaAddr = await getSolanaAddress(keyBytes);\n console.log(`[XClawRouter] Solana wallet already set up.`);\n } else {\n // First time — generate mnemonic + keypair\n console.log(`[XClawRouter] Setting up Solana wallet...`);\n const { solanaPrivateKeyBytes } = await setupSolana();\n solanaAddr = await getSolanaAddress(solanaPrivateKeyBytes);\n console.log(`[XClawRouter] Solana wallet created.`);\n console.log(`[XClawRouter] ⚠ Back up your mnemonic: ${MNEMONIC_FILE}`);\n }\n\n await savePaymentChain(\"solana\");\n console.log(`[XClawRouter] Payment chain → Solana`);\n console.log(`[XClawRouter] Solana address : ${solanaAddr}`);\n console.log(`[XClawRouter] Fund USDC at : https://solscan.io/account/${solanaAddr}`);\n } else {\n await savePaymentChain(\"base\");\n console.log(`[XClawRouter] Payment chain → Base (EVM)`);\n }\n\n console.log(\n `[XClawRouter] Restart gateway to apply: systemctl --user restart openclaw-gateway.service`,\n );\n console.log(`[XClawRouter] or: openclaw gateway restart`);\n process.exit(0);\n }\n\n if (args.report) {\n const report = await generateReport(args.reportPeriod, args.reportJson);\n console.log(report);\n process.exit(0);\n }\n\n if (args.setup) {\n await cmdSetup();\n process.exit(0);\n }\n\n // Resolve wallet key.\n //\n // On a fresh install with no OKX wallet, `resolveOrGenerateWalletKey`\n // throws `OnchainOsRequiredError` instead of silently generating a local\n // key. In an INTERACTIVE terminal we transparently run `cmdSetup` here so\n // a user typing `npx @blockrun/xclawrouter` for the first time gets walked\n // through OKX install + email + OTP without having to manually invoke a\n // second command. In NON-interactive contexts (CI, Docker, gateway daemon)\n // we keep the old error+exit-2 behaviour so automation isn't left hanging\n // on a stdin prompt that no one will ever answer.\n let wallet;\n try {\n wallet = await resolveOrGenerateWalletKey();\n } catch (err) {\n if (err instanceof OnchainOsRequiredError) {\n const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);\n if (interactive) {\n console.log(\"\\n[XClawRouter] No wallet detected — launching guided setup\\n\");\n await cmdSetup();\n // cmdSetup exits non-zero on its own failure paths, so if we got here\n // it claims the OKX login completed. Guard the re-resolve anyway:\n // a TEE blip or stale onchainos session could still leave us without\n // a usable wallet, and we'd rather print a targeted hint than fall\n // through to main()'s generic \"Fatal error\" handler.\n try {\n wallet = await resolveOrGenerateWalletKey();\n } catch (err2) {\n if (err2 instanceof OnchainOsRequiredError) {\n console.error(\"[XClawRouter] Setup completed but the wallet still isn't detected.\");\n console.error(\n \"[XClawRouter] Diagnose with: onchainos wallet status (and re-run setup if needed)\",\n );\n process.exit(1);\n }\n throw err2;\n }\n } else {\n console.error(`[XClawRouter] ${err.message}`);\n process.exit(2);\n }\n } else {\n throw err;\n }\n }\n\n // Agentic Wallet status block. Tells the user, on every launch, whether\n // onchainos is installed and what their login state is, with the literal\n // next-step command/URL. Emitted BEFORE the \"Using ... wallet:\" line so the\n // user understands the state of the option they're (likely) not on, before\n // we tell them which local fallback we picked. XCLAW_QUIET=1 silences it.\n // (`src/index.ts` emits the same block through OpenClaw's structured\n // logger — keep these two sites in sync when changing the block shape.)\n const quiet = process.env.XCLAW_QUIET === \"1\";\n const detection = wallet.onchainosDetection;\n let printedStatus = false;\n if (!quiet && detection) {\n const lines = formatAgenticWalletStatus(detection);\n for (const line of lines) {\n // CLI uses one stream (stdout); the `level` distinction matters for\n // structured loggers, not for terminals, so funnel everything through\n // console.log with the consistent [XClawRouter] prefix.\n console.log(`[XClawRouter] ${line.text}`);\n }\n printedStatus = lines.length > 0;\n }\n\n if (wallet.source === \"okx\") {\n console.log(\n `[XClawRouter] Using OKX onchainos wallet: ${wallet.address}${wallet.email ? ` (${wallet.email})` : \"\"}`,\n );\n } else if (wallet.source === \"generated\") {\n console.log(`[XClawRouter] Generated new wallet: ${wallet.address}`);\n } else if (wallet.source === \"saved\") {\n console.log(`[XClawRouter] Using saved wallet: ${wallet.address}`);\n } else if (wallet.source === \"config\") {\n console.log(`[XClawRouter] Using wallet from plugin config: ${wallet.address}`);\n } else {\n console.log(`[XClawRouter] Using wallet from BLOCKRUN_WALLET_KEY: ${wallet.address}`);\n }\n\n // Suppression hint only when we actually emitted a status block — so a\n // running OKX wallet doesn't end up with a dangling \"(set XCLAW_QUIET…)\".\n if (printedStatus) {\n console.log(`[XClawRouter] (set XCLAW_QUIET=1 to suppress this block)`);\n }\n\n // Show Solana address if available\n if (wallet.solanaPrivateKeyBytes) {\n try {\n const solAddr = await getSolanaAddress(wallet.solanaPrivateKeyBytes);\n console.log(`[XClawRouter] Solana address: ${solAddr}`);\n } catch {\n // Non-fatal\n }\n }\n\n // Start the proxy\n const proxy = await startProxy({\n wallet,\n port: args.port,\n onReady: (port) => {\n console.log(`[XClawRouter] v${VERSION} | Proxy listening on http://127.0.0.1:${port}`);\n console.log(`[XClawRouter] Health check: http://127.0.0.1:${port}/health`);\n },\n onError: (error) => {\n console.error(`[XClawRouter] Error: ${error.message}`);\n },\n onRouted: (decision) => {\n const cost = decision.costEstimate.toFixed(4);\n const saved = (decision.savings * 100).toFixed(0);\n console.log(`[XClawRouter] [${decision.tier}] ${decision.model} $${cost} (saved ${saved}%)`);\n },\n onLowBalance: (info) => {\n console.warn(`[XClawRouter] Low balance: ${info.balanceUSD}. Fund: ${info.walletAddress}`);\n },\n onInsufficientFunds: (info) => {\n console.error(\n `[XClawRouter] Insufficient funds. Balance: ${info.balanceUSD}, Need: ${info.requiredUSD}`,\n );\n console.error(`[XClawRouter] Need help? Run: npx @blockrun/xclawrouter doctor`);\n },\n });\n\n // Check balance on the active payment chain\n const paymentChain = await resolvePaymentChain();\n const displayAddress =\n paymentChain === \"solana\" && proxy.solanaAddress ? proxy.solanaAddress : wallet.address;\n try {\n const balance = await proxy.balanceMonitor.checkBalance();\n if (balance.isEmpty) {\n console.log(`[XClawRouter] Wallet balance: $0.00 (using FREE model)`);\n console.log(`[XClawRouter] Fund wallet for premium models: ${displayAddress}`);\n } else if (balance.isLow) {\n console.log(`[XClawRouter] Wallet balance: ${balance.balanceUSD} (low)`);\n } else {\n console.log(`[XClawRouter] Wallet balance: ${balance.balanceUSD}`);\n }\n // Invalidate after display so the first real request always gets a fresh check.\n // Prevents a flaky RPC at startup from caching a false $0.00 and triggering\n // free-model fallback on the first request.\n proxy.balanceMonitor.invalidate();\n } catch {\n console.log(`[XClawRouter] Wallet: ${displayAddress} (balance check pending)`);\n }\n\n console.log(`[XClawRouter] Ready - Ctrl+C to stop`);\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\n[XClawRouter] Received ${signal}, shutting down...`);\n try {\n await proxy.close();\n console.log(`[XClawRouter] Proxy closed`);\n process.exit(0);\n } catch (err) {\n console.error(`[XClawRouter] Error during shutdown: ${err}`);\n process.exit(1);\n }\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nmain().catch((err) => {\n console.error(`[XClawRouter] Fatal error: ${err.message}`);\n console.error(`[XClawRouter] Need help? Run: npx @blockrun/xclawrouter doctor`);\n process.exit(1);\n});\n","/**\n * Cost Report Generator\n */\n\nimport { getStats } from \"./stats.js\";\nimport type { AggregatedStats } from \"./stats.js\";\n\nexport type ReportPeriod = \"daily\" | \"weekly\" | \"monthly\";\n\nexport async function generateReport(period: ReportPeriod, json: boolean = false): Promise {\n const days = period === \"daily\" ? 1 : period === \"weekly\" ? 7 : 30;\n const stats = await getStats(days);\n\n if (json) {\n return JSON.stringify(stats, null, 2);\n }\n\n return formatMarkdownReport(period, days, stats);\n}\n\nfunction formatMarkdownReport(period: ReportPeriod, days: number, stats: AggregatedStats): string {\n const lines: string[] = [];\n\n lines.push(`# XClawRouter ${capitalize(period)} Report`);\n lines.push(`**Period:** Last ${days} day${days > 1 ? \"s\" : \"\"}`);\n lines.push(`**Generated:** ${new Date().toISOString()}`);\n lines.push(\"\");\n\n lines.push(\"## 📊 Usage Summary\");\n lines.push(\"\");\n lines.push(`| Metric | Value |`);\n lines.push(`|--------|-------|`);\n lines.push(`| Total Requests | ${stats.totalRequests} |`);\n lines.push(`| Total Cost | $${stats.totalCost.toFixed(4)} |`);\n lines.push(`| Baseline Cost | $${stats.totalBaselineCost.toFixed(4)} |`);\n lines.push(`| **Savings** | **$${stats.totalSavings.toFixed(4)}** |`);\n lines.push(`| Savings % | ${stats.savingsPercentage.toFixed(1)}% |`);\n lines.push(`| Avg Latency | ${stats.avgLatencyMs.toFixed(0)}ms |`);\n lines.push(\"\");\n\n lines.push(\"## 🤖 Model Distribution\");\n lines.push(\"\");\n const sortedModels = Object.entries(stats.byModel)\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 10);\n for (const [model, data] of sortedModels) {\n lines.push(`- ${model}: ${data.count} reqs, $${data.cost.toFixed(4)}`);\n }\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * BlockRun Doctor - AI-Powered Diagnostics\n *\n * Collects system diagnostics and sends to Claude Opus 4.6 for analysis.\n * Works independently of OpenClaw - direct x402 payment to BlockRun API.\n */\n\nimport { platform, arch, freemem, totalmem } from \"node:os\";\nimport { createPublicClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { wrapFetchWithPayment, x402Client } from \"@x402/fetch\";\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { toClientEvmSigner } from \"@x402/evm\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport {\n resolveOrGenerateWalletKey,\n resolvePaymentChain,\n WALLET_FILE,\n MNEMONIC_FILE,\n} from \"./auth.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { getSolanaAddress } from \"./wallet.js\";\nimport { getStats } from \"./stats.js\";\nimport { getProxyPort } from \"./proxy.js\";\nimport { VERSION } from \"./version.js\";\n\n// Types\ninterface SystemInfo {\n os: string;\n arch: string;\n nodeVersion: string;\n memoryFree: string;\n memoryTotal: string;\n}\n\ninterface WalletInfo {\n exists: boolean;\n valid: boolean;\n address: string | null;\n solanaAddress: string | null;\n balance: string | null;\n isLow: boolean;\n isEmpty: boolean;\n source: \"saved\" | \"env\" | \"config\" | \"generated\" | \"okx\" | null;\n paymentChain: \"base\" | \"solana\";\n}\n\ninterface NetworkInfo {\n blockrunApi: { reachable: boolean; latencyMs: number | null };\n localProxy: { running: boolean; port: number };\n}\n\ninterface LogInfo {\n requestsLast24h: number;\n costLast24h: string;\n errorsFound: number;\n}\n\ninterface DiagnosticResult {\n version: string;\n latestVersion: string | null;\n timestamp: string;\n system: SystemInfo;\n wallet: WalletInfo;\n network: NetworkInfo;\n logs: LogInfo;\n issues: string[];\n}\n\n// Helpers\nfunction formatBytes(bytes: number): string {\n const gb = bytes / (1024 * 1024 * 1024);\n return `${gb.toFixed(1)}GB`;\n}\n\nfunction green(text: string): string {\n return `\\x1b[32m✓\\x1b[0m ${text}`;\n}\n\nfunction red(text: string): string {\n return `\\x1b[31m✗\\x1b[0m ${text}`;\n}\n\nfunction yellow(text: string): string {\n return `\\x1b[33m⚠\\x1b[0m ${text}`;\n}\n\n// Fetch latest published version from npm registry\nasync function fetchLatestVersion(): Promise {\n try {\n const res = await fetch(\"https://registry.npmjs.org/@blockrun/xclawrouter/latest\", {\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n// Collect system info\nfunction collectSystemInfo(): SystemInfo {\n return {\n os: `${platform()} ${arch()}`,\n arch: arch(),\n nodeVersion: process.version,\n memoryFree: formatBytes(freemem()),\n memoryTotal: formatBytes(totalmem()),\n };\n}\n\n// Collect wallet info\nasync function collectWalletInfo(): Promise {\n try {\n const { key, address, source, solanaPrivateKeyBytes } = await resolveOrGenerateWalletKey();\n\n if (!key || !address) {\n return {\n exists: false,\n valid: false,\n address: null,\n solanaAddress: null,\n balance: null,\n isLow: false,\n isEmpty: true,\n source: null,\n paymentChain: \"base\",\n };\n }\n\n // Derive Solana address if mnemonic-based wallet\n let solanaAddress: string | null = null;\n if (solanaPrivateKeyBytes) {\n try {\n solanaAddress = await getSolanaAddress(solanaPrivateKeyBytes);\n } catch {\n // Non-fatal\n }\n }\n\n // Check balance on the active payment chain\n const paymentChain = await resolvePaymentChain();\n try {\n let balanceInfo: { balanceUSD: string; isLow: boolean; isEmpty: boolean };\n if (paymentChain === \"solana\" && solanaAddress) {\n const { SolanaBalanceMonitor } = await import(\"./solana-balance.js\");\n const monitor = new SolanaBalanceMonitor(solanaAddress);\n balanceInfo = await monitor.checkBalance();\n } else {\n const monitor = new BalanceMonitor(address);\n balanceInfo = await monitor.checkBalance();\n }\n return {\n exists: true,\n valid: true,\n address,\n solanaAddress,\n balance: balanceInfo.balanceUSD,\n isLow: balanceInfo.isLow,\n isEmpty: balanceInfo.isEmpty,\n source,\n paymentChain,\n };\n } catch {\n return {\n exists: true,\n valid: true,\n address,\n solanaAddress,\n balance: null,\n isLow: false,\n isEmpty: false,\n source,\n paymentChain,\n };\n }\n } catch {\n return {\n exists: false,\n valid: false,\n address: null,\n solanaAddress: null,\n balance: null,\n isLow: false,\n isEmpty: true,\n source: null,\n paymentChain: \"base\",\n };\n }\n}\n\n// Collect network info\nasync function collectNetworkInfo(): Promise {\n const port = getProxyPort();\n\n // Check BlockRun API\n let blockrunReachable = false;\n let blockrunLatency: number | null = null;\n try {\n const start = Date.now();\n const response = await fetch(\"https://blockrun.ai/api/v1/models\", {\n method: \"GET\",\n signal: AbortSignal.timeout(10000),\n });\n blockrunLatency = Date.now() - start;\n blockrunReachable = response.ok || response.status === 402;\n } catch {\n // blockrunReachable already false\n }\n\n // Check local proxy\n let proxyRunning = false;\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`, {\n method: \"GET\",\n signal: AbortSignal.timeout(3000),\n });\n proxyRunning = response.ok;\n } catch {\n // proxyRunning already false\n }\n\n return {\n blockrunApi: { reachable: blockrunReachable, latencyMs: blockrunLatency },\n localProxy: { running: proxyRunning, port },\n };\n}\n\n// Collect log info\nasync function collectLogInfo(): Promise {\n try {\n const stats = await getStats(1); // Last 1 day\n return {\n requestsLast24h: stats.totalRequests,\n costLast24h: `$${stats.totalCost.toFixed(4)}`,\n errorsFound: 0, // TODO: parse error logs\n };\n } catch {\n return {\n requestsLast24h: 0,\n costLast24h: \"$0.00\",\n errorsFound: 0,\n };\n }\n}\n\n// Identify issues\nfunction identifyIssues(result: DiagnosticResult): string[] {\n const issues: string[] = [];\n\n if (!result.wallet.exists) {\n issues.push(\"No wallet found\");\n }\n if (result.wallet.isEmpty) {\n const chain = result.wallet.paymentChain === \"solana\" ? \"Solana\" : \"Base\";\n issues.push(`Wallet is empty - need to fund with USDC on ${chain}`);\n if (result.wallet.paymentChain === \"base\" && result.wallet.solanaAddress) {\n issues.push(\"Tip: if you funded Solana, run /wallet solana to switch chains\");\n }\n } else if (result.wallet.isLow) {\n issues.push(\"Wallet balance is low (< $1.00)\");\n }\n if (!result.network.blockrunApi.reachable) {\n issues.push(\"Cannot reach BlockRun API - check internet connection\");\n }\n if (!result.network.localProxy.running) {\n issues.push(`Local proxy not running on port ${result.network.localProxy.port}`);\n }\n if (result.latestVersion && result.latestVersion !== result.version) {\n issues.push(\n `Outdated version: running v${result.version}, latest is v${result.latestVersion}. Run: curl -fsSL https://blockrun.ai/xclawrouter-update | bash`,\n );\n }\n\n return issues;\n}\n\n// Print diagnostics to terminal\nfunction printDiagnostics(result: DiagnosticResult): void {\n console.log(\"\\n🔍 Collecting diagnostics...\\n\");\n\n // Version\n console.log(\"Version\");\n if (result.latestVersion && result.latestVersion !== result.version) {\n console.log(` ${red(`Installed: v${result.version} (outdated!)`)}`);\n console.log(` ${yellow(`Latest: v${result.latestVersion}`)}`);\n console.log(\n ` ${yellow(`Update: curl -fsSL https://blockrun.ai/xclawrouter-update | bash`)}`,\n );\n } else if (result.latestVersion) {\n console.log(` ${green(`v${result.version} (up to date)`)}`);\n } else {\n console.log(` ${green(`v${result.version}`)}`);\n }\n\n // System\n console.log(\"\\nSystem\");\n console.log(` ${green(`OS: ${result.system.os}`)}`);\n console.log(` ${green(`Node: ${result.system.nodeVersion}`)}`);\n console.log(\n ` ${green(`Memory: ${result.system.memoryFree} free / ${result.system.memoryTotal}`)}`,\n );\n\n // Wallet\n console.log(\"\\nWallet\");\n if (result.wallet.exists && result.wallet.valid) {\n console.log(` ${green(`Key: ${WALLET_FILE} (${result.wallet.source})`)}`);\n console.log(` ${green(`EVM Address: ${result.wallet.address}`)}`);\n if (result.wallet.solanaAddress) {\n console.log(` ${green(`Solana Address: ${result.wallet.solanaAddress}`)}`);\n }\n const chainLabel = result.wallet.paymentChain === \"solana\" ? \"Solana\" : \"Base\";\n console.log(` ${green(`Chain: ${chainLabel}`)}`);\n if (result.wallet.isEmpty) {\n console.log(\n ` ${red(`Balance: $0.00 - NEED TO FUND WITH USDC ON ${chainLabel.toUpperCase()}!`)}`,\n );\n if (result.wallet.paymentChain === \"base\" && result.wallet.solanaAddress) {\n console.log(` ${yellow(`Tip: funded Solana instead? Run /wallet solana to switch`)}`);\n }\n } else if (result.wallet.isLow) {\n console.log(` ${yellow(`Balance: ${result.wallet.balance} (low)`)}`);\n } else if (result.wallet.balance) {\n console.log(` ${green(`Balance: ${result.wallet.balance}`)}`);\n } else {\n console.log(` ${yellow(`Balance: checking...`)}`);\n }\n } else {\n console.log(` ${red(\"No wallet found\")}`);\n }\n\n // Network\n console.log(\"\\nNetwork\");\n if (result.network.blockrunApi.reachable) {\n console.log(\n ` ${green(`BlockRun API: reachable (${result.network.blockrunApi.latencyMs}ms)`)}`,\n );\n } else {\n console.log(` ${red(\"BlockRun API: unreachable\")}`);\n }\n if (result.network.localProxy.running) {\n console.log(` ${green(`Local proxy: running on :${result.network.localProxy.port}`)}`);\n } else {\n console.log(` ${red(`Local proxy: not running on :${result.network.localProxy.port}`)}`);\n }\n\n // Logs\n console.log(\"\\nLogs\");\n console.log(\n ` ${green(`Last 24h: ${result.logs.requestsLast24h} requests, ${result.logs.costLast24h} spent`)}`,\n );\n if (result.logs.errorsFound > 0) {\n console.log(` ${yellow(`${result.logs.errorsFound} errors found in logs`)}`);\n }\n\n // Issues summary\n if (result.issues.length > 0) {\n console.log(\"\\n⚠️ Issues Found:\");\n for (const issue of result.issues) {\n console.log(` • ${issue}`);\n }\n }\n}\n\n// Model options for doctor command\ntype DoctorModel = \"sonnet\" | \"opus\";\n\nconst DOCTOR_MODELS: Record = {\n sonnet: {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n cost: \"~$0.003\",\n },\n opus: {\n id: \"anthropic/claude-opus-4.7\",\n name: \"Claude Opus 4.7\",\n cost: \"~$0.01\",\n },\n};\n\n// Send to AI for analysis\nasync function analyzeWithAI(\n diagnostics: DiagnosticResult,\n userQuestion?: string,\n model: DoctorModel = \"sonnet\",\n): Promise {\n // Check if wallet has funds\n if (diagnostics.wallet.isEmpty) {\n console.log(\"\\n💳 Wallet is empty - cannot call AI for analysis.\");\n console.log(` Fund your EVM wallet with USDC on Base: ${diagnostics.wallet.address}`);\n if (diagnostics.wallet.solanaAddress) {\n console.log(` Fund your Solana wallet with USDC: ${diagnostics.wallet.solanaAddress}`);\n }\n console.log(\" Get USDC: https://www.coinbase.com/price/usd-coin\");\n console.log(\" Bridge to Base: https://bridge.base.org\\n\");\n return;\n }\n\n const modelConfig = DOCTOR_MODELS[model];\n console.log(`\\n📤 Sending to ${modelConfig.name} (${modelConfig.cost})...\\n`);\n\n try {\n const { key } = await resolveOrGenerateWalletKey();\n const account = privateKeyToAccount(key as `0x${string}`);\n const publicClient = createPublicClient({ chain: base, transport: http() });\n const evmSigner = toClientEvmSigner(account, publicClient);\n const x402 = new x402Client();\n registerExactEvmScheme(x402, { signer: evmSigner });\n\n // Register Solana scheme if user is on Solana chain\n const paymentChain = diagnostics.wallet.paymentChain;\n if (paymentChain === \"solana\") {\n try {\n if (!existsSync(MNEMONIC_FILE)) {\n throw new Error(`mnemonic file missing at ${MNEMONIC_FILE}`);\n }\n const mnemonic = readFileSync(MNEMONIC_FILE, \"utf8\").trim();\n if (!mnemonic) throw new Error(\"mnemonic file empty\");\n const { deriveSolanaKeyBytes } = await import(\"./wallet.js\");\n const { registerExactSvmScheme } = await import(\"@x402/svm/exact/client\");\n const { createKeyPairSignerFromPrivateKeyBytes } = await import(\"@solana/kit\");\n const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);\n const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(solanaKeyBytes);\n registerExactSvmScheme(x402, { signer: solanaSigner });\n } catch (err) {\n console.log(\n ` ⚠ Could not register Solana signer: ${err instanceof Error ? err.message : String(err)}`,\n );\n console.log(` ⚠ Falling back to Base (EVM) — doctor request may fail on Solana chain\\n`);\n }\n }\n\n const paymentFetch = wrapFetchWithPayment(fetch, x402);\n const apiUrl =\n paymentChain === \"solana\"\n ? \"https://sol.blockrun.ai/api/v1/chat/completions\"\n : \"https://blockrun.ai/api/v1/chat/completions\";\n\n const response = await paymentFetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: modelConfig.id,\n stream: false,\n messages: [\n {\n role: \"system\",\n content: `You are a technical support expert for BlockRun and XClawRouter.\nAnalyze the diagnostics and:\n1. Identify the root cause of any issues\n2. Provide specific, actionable fix commands (bash)\n3. Explain why the issue occurred briefly\n4. Be concise but thorough\n5. Format commands in code blocks`,\n },\n {\n role: \"user\",\n content: userQuestion\n ? `Here are my system diagnostics:\\n\\n${JSON.stringify(diagnostics, null, 2)}\\n\\nUser's question: ${userQuestion}`\n : `Here are my system diagnostics:\\n\\n${JSON.stringify(diagnostics, null, 2)}\\n\\nPlease analyze and help me fix any issues.`,\n },\n ],\n max_tokens: 1000,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n console.log(`Error: ${response.status} - ${text}`);\n return;\n }\n\n const data = await response.json();\n const content = data.choices?.[0]?.message?.content;\n\n if (content) {\n console.log(\"🤖 AI Analysis:\\n\");\n console.log(content);\n console.log();\n } else {\n console.log(\"Error: No response from AI\");\n }\n } catch (err) {\n console.log(`\\nError calling AI: ${err instanceof Error ? err.message : String(err)}`);\n console.log(\"Try again or check your wallet balance.\\n\");\n }\n}\n\n// Main entry point\nexport async function runDoctor(\n userQuestion?: string,\n model: \"sonnet\" | \"opus\" = \"sonnet\",\n): Promise {\n console.log(`\\n🩺 BlockRun Doctor v${VERSION}\\n`);\n\n // Collect all diagnostics\n const [system, wallet, network, logs, latestVersion] = await Promise.all([\n collectSystemInfo(),\n collectWalletInfo(),\n collectNetworkInfo(),\n collectLogInfo(),\n fetchLatestVersion(),\n ]);\n\n const result: DiagnosticResult = {\n version: VERSION,\n latestVersion,\n timestamp: new Date().toISOString(),\n system,\n wallet,\n network,\n logs,\n issues: [],\n };\n\n // Identify issues\n result.issues = identifyIssues(result);\n\n // Print to terminal\n printDiagnostics(result);\n\n // Send to AI for analysis\n await analyzeWithAI(result, userQuestion, model);\n}\n","/**\n * Partner Service Registry\n *\n * Defines available partner APIs that can be called through ClawRouter's proxy.\n * Partners cover prediction-market data, realtime market quotes, and image/video\n * generation — all paid via x402 micropayments on the same wallet as LLM calls.\n */\n\nexport type PartnerServiceParam = {\n name: string;\n type: \"string\" | \"string[]\" | \"number\";\n description: string;\n required: boolean;\n};\n\nexport type PartnerCategory = \"Prediction markets\" | \"Market data\" | \"Image & Video\";\n\nexport type PartnerServiceDefinition = {\n /** Unique service ID used in tool names: blockrun_{id} */\n id: string;\n /** Human-readable name */\n name: string;\n /** Partner providing this service */\n partner: string;\n /** Category used for grouping in the `/partners` list view */\n category: PartnerCategory;\n /** Compact one-liner used in the `/partners` list (≤ 40 chars ideal) */\n shortDescription: string;\n /** Full description used for the tool's JSON Schema (LLM sees this) */\n description: string;\n /** Proxy path (relative to /v1) */\n proxyPath: string;\n /** HTTP method */\n method: \"GET\" | \"POST\";\n /** Parameters for the tool's JSON Schema */\n params: PartnerServiceParam[];\n /** Pricing info for display */\n pricing: {\n perUnit: string;\n unit: string;\n minimum: string;\n maximum: string;\n };\n /** Example usage for help text */\n example: {\n input: Record;\n description: string;\n };\n};\n\n/**\n * All registered partner services.\n * New partners are added here — the rest of the system picks them up automatically.\n */\nexport const PARTNER_SERVICES: PartnerServiceDefinition[] = [\n // ---------------------------------------------------------------------------\n // Predexon — Prediction Market Data\n // ---------------------------------------------------------------------------\n {\n id: \"predexon_events\",\n name: \"Polymarket Events\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Live Polymarket events\",\n description:\n \"Get live Polymarket prediction market events with current odds, volume, and liquidity. \" +\n \"Call this for ANY request about prediction markets, Polymarket markets, current odds, \" +\n \"what people are betting on, or market sentiment. \" +\n \"Do NOT use browser or web scraping — this returns structured real-time data directly. \" +\n \"Returns: event title, YES/NO prices (implied probability), volume, liquidity, end date.\",\n proxyPath: \"/pm/polymarket/events\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of events to return (default: 20, max: 100)\",\n required: false,\n },\n {\n name: \"tag\",\n type: \"string\",\n description: \"Filter by category: crypto, politics, sports, science, economics, etc.\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { limit: 20 },\n description: \"Get top 20 live Polymarket events\",\n },\n },\n {\n id: \"predexon_leaderboard\",\n name: \"Polymarket Leaderboard\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Top traders ranked by profit\",\n description:\n \"Get the Polymarket leaderboard of top traders ranked by profit. \" +\n \"Call this for ANY request about top Polymarket traders, whale wallets, best performers, \" +\n \"richest traders, or who is making the most money on Polymarket. \" +\n \"Do NOT use browser or web scraping — this returns structured data directly. \" +\n \"Returns: wallet address/username, total profit, total volume, win rate.\",\n proxyPath: \"/pm/polymarket/leaderboard\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of wallets to return (default: 20, max: 100)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { limit: 20 },\n description: \"Get top 20 Polymarket whale wallets by profit\",\n },\n },\n {\n id: \"predexon_markets\",\n name: \"Polymarket Markets Search\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Market search by keyword\",\n description:\n \"Search and filter Polymarket markets. Use this to find a market by keyword and get its conditionId \" +\n \"for follow-up calls (smart money, top holders, etc.). \" +\n \"Returns: question, conditionId, YES/NO prices, volume.\",\n proxyPath: \"/pm/polymarket/markets\",\n method: \"GET\",\n params: [\n {\n name: \"search\",\n type: \"string\",\n description: \"Keyword to search for (e.g. 'bitcoin', 'election', 'fed rate')\",\n required: false,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of markets to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { search: \"bitcoin\", limit: 10 },\n description: \"Search for Bitcoin-related prediction markets\",\n },\n },\n {\n id: \"predexon_smart_money\",\n name: \"Polymarket Smart Money\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Smart-money positions on a market\",\n description:\n \"See how high-performing wallets are positioned on a specific Polymarket market. \" +\n \"Use this after finding a market's conditionId via predexon_markets or predexon_events. \" +\n \"Returns: wallet addresses, their YES/NO positions, size, P&L, win rate.\",\n proxyPath: \"/pm/polymarket/market/:condition_id/smart-money\",\n method: \"GET\",\n params: [\n {\n name: \"condition_id\",\n type: \"string\",\n description: \"The market's conditionId (get this from predexon_markets or predexon_events)\",\n required: true,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of positions to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { condition_id: \"0xabc123...\", limit: 10 },\n description: \"See smart money positioning on a specific market\",\n },\n },\n {\n id: \"predexon_smart_activity\",\n name: \"Polymarket Smart Activity\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Where smart money is flowing now\",\n description:\n \"Discover which Polymarket markets high-performing wallets are currently active in. \" +\n \"Use this to find where smart money is flowing right now. \" +\n \"Returns: market titles, smart money volume, number of smart wallets active.\",\n proxyPath: \"/pm/polymarket/markets/smart-activity\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of markets to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { limit: 10 },\n description: \"Find markets where smart money is most active\",\n },\n },\n {\n id: \"predexon_wallet\",\n name: \"Polymarket Wallet Profile\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Wallet profile (PnL, winrate, positions)\",\n description:\n \"Get a complete profile for a Polymarket wallet address: profit, volume, win rate, markets traded, open positions. \" +\n \"Use this when the user asks to analyze or look up a specific wallet address.\",\n proxyPath: \"/pm/polymarket/wallet/:wallet\",\n method: \"GET\",\n params: [\n {\n name: \"wallet\",\n type: \"string\",\n description: \"Ethereum wallet address (0x...)\",\n required: true,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { wallet: \"0x1234...abcd\" },\n description: \"Get complete profile for a Polymarket wallet\",\n },\n },\n {\n id: \"predexon_wallet_pnl\",\n name: \"Polymarket Wallet P&L\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Wallet P&L time series\",\n description:\n \"Get P&L history and realized profit/loss time series for a Polymarket wallet. \" +\n \"Use this when the user wants to see how a wallet has performed over time.\",\n proxyPath: \"/pm/polymarket/wallet/pnl/:wallet\",\n method: \"GET\",\n params: [\n {\n name: \"wallet\",\n type: \"string\",\n description: \"Ethereum wallet address (0x...)\",\n required: true,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { wallet: \"0x1234...abcd\" },\n description: \"Get P&L history for a Polymarket wallet\",\n },\n },\n {\n id: \"predexon_matching_markets\",\n name: \"Cross-Market Matching (Polymarket vs Kalshi)\",\n partner: \"Predexon\",\n category: \"Prediction markets\",\n shortDescription: \"Polymarket ↔ Kalshi market pairs\",\n description:\n \"Find equivalent markets across Polymarket and Kalshi to compare odds and spot arbitrage. \" +\n \"Use this when the user wants to compare prediction market prices across platforms.\",\n proxyPath: \"/pm/matching-markets\",\n method: \"GET\",\n params: [\n {\n name: \"limit\",\n type: \"number\",\n description: \"Number of matched pairs to return (default: 20)\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.005\", unit: \"request\", minimum: \"$0.005\", maximum: \"$0.005\" },\n example: {\n input: { limit: 10 },\n description: \"Compare equivalent markets on Polymarket vs Kalshi\",\n },\n },\n // ---------------------------------------------------------------------------\n // BlockRun Markets — Realtime market data (stocks, crypto, FX, commodities)\n // ---------------------------------------------------------------------------\n {\n id: \"stock_price\",\n name: \"Global Stock Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime stock quote (12 markets)\",\n description:\n \"Get realtime price for a listed equity across 12 global markets. \" +\n \"Call this for ANY request about a specific stock price, quote, or current trading value \" +\n \"on NYSE/Nasdaq, HKEX, TSE, KRX, LSE, XETRA, Euronext, Shanghai/Shenzhen, or Toronto. \" +\n \"Do NOT use browser or web scraping — this returns structured real-time data directly. \" +\n \"Returns: symbol, price, confidence interval, publish time, feed ID.\",\n proxyPath: \"/stocks/:market/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"market\",\n type: \"string\",\n description:\n \"Market code (lowercase): us (NYSE/Nasdaq/AMEX), hk (HKEX), jp (TSE), kr (KRX), \" +\n \"gb (LSE), de (XETRA), fr (Euronext Paris), nl (Euronext Amsterdam), ie (Irish SE), \" +\n \"lu (Luxembourg SE), cn (Shanghai/Shenzhen ETFs), ca (TSX).\",\n required: true,\n },\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Ticker for the given market. Examples: AAPL (us), 0700-HK (hk), 7203 (jp), \" +\n \"005930 (kr), HSBA (gb), SAP (de), MC (fr), AIR (nl), VUSA (ie), MT (lu), 510310 (cn), HODL (ca).\",\n required: true,\n },\n {\n name: \"session\",\n type: \"string\",\n description: \"Optional session hint: pre, post, or on (regular hours).\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { market: \"us\", symbol: \"AAPL\" },\n description: \"Get realtime Apple stock price\",\n },\n },\n {\n id: \"stock_history\",\n name: \"Global Stock OHLC History\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"OHLC bars (1m–monthly)\",\n description:\n \"Get historical OHLC (candlestick) bars for a listed equity across 12 global markets. \" +\n \"Use this for charting, backtesting, or any request about a stock's past price action. \" +\n \"Supports resolutions: 1, 5, 15, 60, 240 (minutes) and D, W, M (daily/weekly/monthly). \" +\n \"Returns: OHLC arrays (open, high, low, close, volume, timestamps).\",\n proxyPath: \"/stocks/:market/history/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"market\",\n type: \"string\",\n description:\n \"Market code (lowercase): us, hk, jp, kr, gb, de, fr, nl, ie, lu, cn, ca. \" +\n \"See stock_price for full market descriptions.\",\n required: true,\n },\n {\n name: \"symbol\",\n type: \"string\",\n description: \"Ticker for the given market (e.g. AAPL for us, 0700-HK for hk).\",\n required: true,\n },\n {\n name: \"resolution\",\n type: \"string\",\n description:\n \"Bar resolution: 1, 5, 15, 60, 240 (minutes) or D, W, M (daily/weekly/monthly). Default: D.\",\n required: false,\n },\n {\n name: \"from\",\n type: \"number\",\n description: \"Start time as Unix epoch seconds (required).\",\n required: true,\n },\n {\n name: \"to\",\n type: \"number\",\n description: \"End time as Unix epoch seconds. Default: now.\",\n required: false,\n },\n ],\n pricing: { perUnit: \"$0.001\", unit: \"request\", minimum: \"$0.001\", maximum: \"$0.001\" },\n example: {\n input: { market: \"us\", symbol: \"AAPL\", resolution: \"D\", from: 1704067200 },\n description: \"Get daily OHLC bars for AAPL starting Jan 1 2024\",\n },\n },\n {\n id: \"stock_list\",\n name: \"Global Stock Ticker List\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Ticker search — free\",\n description:\n \"List and search supported tickers for a given stock market. Use this to resolve a company \" +\n \"name to a ticker before calling stock_price or stock_history. FREE — no x402 payment.\",\n proxyPath: \"/stocks/:market/list\",\n method: \"GET\",\n params: [\n {\n name: \"market\",\n type: \"string\",\n description: \"Market code: us, hk, jp, kr, gb, de, fr, nl, ie, lu, cn, ca.\",\n required: true,\n },\n {\n name: \"q\",\n type: \"string\",\n description: \"Optional search query to filter tickers by symbol or description.\",\n required: false,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Max results to return (default: 100, max: 2000).\",\n required: false,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { market: \"us\", q: \"apple\", limit: 5 },\n description: \"Search US market for 'apple' tickers\",\n },\n },\n {\n id: \"crypto_price\",\n name: \"Crypto Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime crypto price — free\",\n description:\n \"Get realtime crypto price. Call this for ANY request about current crypto \" +\n \"prices (BTC, ETH, SOL, etc.). FREE — no x402 payment. Quote is always USD. \" +\n \"Do NOT use browser or web scraping — this returns structured real-time data directly.\",\n proxyPath: \"/crypto/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Crypto pair in BASE-QUOTE form. Examples: BTC-USD, ETH-USD, SOL-USD, DOGE-USD. \" +\n \"Quote is always USD.\",\n required: true,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { symbol: \"BTC-USD\" },\n description: \"Get realtime Bitcoin price\",\n },\n },\n {\n id: \"fx_price\",\n name: \"Foreign Exchange Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime FX rate — free\",\n description:\n \"Get realtime FX rate. Call this for ANY request about currency exchange rates. \" +\n \"FREE — no x402 payment. Do NOT use browser or web scraping.\",\n proxyPath: \"/fx/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Currency pair in BASE-QUOTE form. Examples: EUR-USD, GBP-USD, JPY-USD, CNY-USD.\",\n required: true,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { symbol: \"EUR-USD\" },\n description: \"Get realtime EUR/USD exchange rate\",\n },\n },\n {\n id: \"commodity_price\",\n name: \"Commodity Realtime Price\",\n partner: \"BlockRun\",\n category: \"Market data\",\n shortDescription: \"Realtime commodity spot — free\",\n description:\n \"Get realtime commodity spot price (gold, silver, platinum, etc.). \" +\n \"FREE — no x402 payment. Do NOT use browser or web scraping.\",\n proxyPath: \"/commodity/price/:symbol\",\n method: \"GET\",\n params: [\n {\n name: \"symbol\",\n type: \"string\",\n description:\n \"Commodity code in BASE-USD form. Examples: XAU-USD (gold), XAG-USD (silver), XPT-USD (platinum).\",\n required: true,\n },\n ],\n pricing: { perUnit: \"free\", unit: \"request\", minimum: \"$0\", maximum: \"$0\" },\n example: {\n input: { symbol: \"XAU-USD\" },\n description: \"Get realtime gold spot price\",\n },\n },\n // ---------------------------------------------------------------------------\n // BlockRun — Image & Video generation\n // ---------------------------------------------------------------------------\n {\n id: \"image_generation\",\n name: \"Image Generation\",\n partner: \"BlockRun\",\n category: \"Image & Video\",\n shortDescription: \"8 image models (DALL-E, Flux, Grok, ...)\",\n description:\n \"Generate an image from a text prompt. Models available: google/nano-banana (default), \" +\n \"google/nano-banana-pro (up to 4K), openai/gpt-image-1, openai/dall-e-3, \" +\n \"black-forest/flux-1.1-pro, xai/grok-imagine-image, xai/grok-imagine-image-pro, \" +\n \"zai/cogview-4. Returns a local http://localhost:8402/images/.png URL.\",\n proxyPath: \"/images/generations\",\n method: \"POST\",\n params: [\n {\n name: \"prompt\",\n type: \"string\",\n description: \"Text prompt describing the desired image.\",\n required: true,\n },\n {\n name: \"model\",\n type: \"string\",\n description:\n \"Full model ID (e.g. 'google/nano-banana', 'openai/dall-e-3'). Default: google/nano-banana.\",\n required: false,\n },\n {\n name: \"size\",\n type: \"string\",\n description:\n \"Image size, e.g. '1024x1024', '1792x1024', '4096x4096'. Model-dependent — see image model table.\",\n required: false,\n },\n {\n name: \"n\",\n type: \"number\",\n description: \"Number of images to generate (default 1, max 4).\",\n required: false,\n },\n ],\n pricing: {\n perUnit: \"$0.015–$0.15\",\n unit: \"image\",\n minimum: \"$0.015 (cogview-4)\",\n maximum: \"$0.15 (nano-banana-pro 4K)\",\n },\n example: {\n input: { model: \"google/nano-banana\", prompt: \"a golden retriever surfing on a wave\" },\n description: \"Generate an image with Nano Banana\",\n },\n },\n {\n id: \"image_edit\",\n name: \"Image Edit / Inpainting\",\n partner: \"BlockRun\",\n category: \"Image & Video\",\n shortDescription: \"Edit existing image (gpt-image-1)\",\n description:\n \"Edit or re-style an existing image via openai/gpt-image-1. \" +\n \"Supply `image` as a data URI, https URL, or local file path; optional `mask` for inpainting.\",\n proxyPath: \"/images/image2image\",\n method: \"POST\",\n params: [\n {\n name: \"prompt\",\n type: \"string\",\n description: \"Text prompt describing how to edit the image.\",\n required: true,\n },\n {\n name: \"image\",\n type: \"string\",\n description: \"Source image — data URI, https URL, or local path (~/... or /abs/path).\",\n required: true,\n },\n {\n name: \"mask\",\n type: \"string\",\n description: \"Optional inpainting mask in the same formats as `image`.\",\n required: false,\n },\n ],\n pricing: {\n perUnit: \"$0.02–$0.04\",\n unit: \"image\",\n minimum: \"$0.02\",\n maximum: \"$0.04 (1536x1024)\",\n },\n example: {\n input: { prompt: \"make the sky sunset orange\", image: \"~/Pictures/beach.png\" },\n description: \"Edit a local image with gpt-image-1\",\n },\n },\n {\n id: \"video_generation\",\n name: \"Video Generation\",\n partner: \"BlockRun\",\n category: \"Image & Video\",\n shortDescription: \"Grok Imagine + Seedance, 5–10s\",\n description:\n \"Generate a short video (5–10s) via xai/grok-imagine-video or bytedance/seedance-1.5-pro \" +\n \"(default, cheapest) / seedance-2.0-fast / seedance-2.0. Async — upstream polling takes \" +\n \"30–120 seconds. Returns a local http://localhost:8402/videos/.mp4 URL.\",\n proxyPath: \"/videos/generations\",\n method: \"POST\",\n params: [\n {\n name: \"prompt\",\n type: \"string\",\n description: \"Text prompt describing the video.\",\n required: true,\n },\n {\n name: \"model\",\n type: \"string\",\n description:\n \"Full model ID. Options: bytedance/seedance-1.5-pro (default), bytedance/seedance-2.0-fast, \" +\n \"bytedance/seedance-2.0, xai/grok-imagine-video.\",\n required: false,\n },\n {\n name: \"duration_seconds\",\n type: \"number\",\n description: \"Clip length in seconds. Supported: 5, 8, 10. Default depends on model.\",\n required: false,\n },\n ],\n pricing: {\n perUnit: \"$0.03–$0.30\",\n unit: \"second\",\n minimum: \"$0.15 (seedance-1.5-pro 5s)\",\n maximum: \"$3.00 (seedance-2.0 10s)\",\n },\n example: {\n input: { model: \"bytedance/seedance-1.5-pro\", prompt: \"a cat waving\", duration_seconds: 5 },\n description: \"Generate a 5-second Seedance video\",\n },\n },\n];\n\n/**\n * Get a partner service by ID.\n */\nexport function getPartnerService(id: string): PartnerServiceDefinition | undefined {\n return PARTNER_SERVICES.find((s) => s.id === id);\n}\n"],"mappings":"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QAAQ,MAAK,CAAE;AACvC,YAAM,IAAI,oBAAoB,EAAE,SAAAA,SAAO,CAAE;AAC3C,QAAI,iBAAiBA,QAAO;AAC1B,YAAM,IAAI,0BAA0B,EAAE,SAASA,SAAO,CAAE;AAC1D,qBAAiBA,QAAO,IAAI,8BAA8B,YAAY;EACxE;AACA,SAAO;AACT;AApGA,IAAAC,sBAAA;;;;AAIA;AAIA;AAYA;AACA;;;;;ACrBA,IAAa,SACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,UACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA;AAjGb;;;AAAO,IAAM,UAAU,OAAO,KAAK,MAAM;AAClC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,WAAW,OAAO,MAAM,MAAM;AACpC,IAAM,YAAY,OAAO,OAAO,MAAM;AACtC,IAAM,YAAY,OAAO,OAAO,MAAM;AACtC,IAAM,YAAY,OAAO,OAAO,MAAM;AACtC,IAAM,YA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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,QAC1B,aAAa,yBACb,OAAO,sBAAsB,YAAY,WACnC,sBAAsB,UACtB;AACV,UAAM,IAAI,YAAY,wCAAwC,EAAE,OAAO,uBAAuB,QAAA,CAAS;EAC3G;AACA,wBAAsB,KAAK,8BAA8B;AACzD,SAAO;AACX;AAEA,SAAS,mBAAmB,OAA2C;AACnE,SACI,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,aAAa,UACZ,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,SAAS,aACzD,OAAO,MAAM,YAAY;AAEjC;AC5HO,SAAS,sBAAsB,OAAyB;AAC3D,QAAM,kBAAqC;IACvC;IACA;EAAA;AAEJ,MAAI,cAAc,KAAK,KAAK,CAAC,CAAC,MAAM,SAAS,gBAAgB,SAAS,MAAM,QAAQ,MAAM,GAAG;AACzF,WAAO,MAAM;EACjB;AACA,SAAO;AACX;IVnBa,qCACA,6BACA,uCACA,oDACA,6CACA,qCACA,uCACA,uCACA,sCACA,wCAKA,qCACA,wCACA,wCACA,0CACA,yCACA,oEACA,8DACA,kEACA,mEACA,sEACA,qEACA,yEACA,oCACA,wEACA,wEACA,qEACA,kDACA,mDACA,kFACA,qDACA,0DACA,iFACA,yEACA,uDAIA,8CACA,qDACA,yDACA,qDACA,wCACA,qDACA,2DACA,uDACA,uDACA,8DACA,mDACA,oDAIA,2CACA,wDACA,kDACA,kDACA,6DAIA,6DACA,mDACA,8DACA,4DACA,8DACA,0DACA,4DACA,gEAIA,4DAIA,kDACA,qDACA,mDACA,0DACA,uDAIA,sDACA,kDACA,gDAKA,0CACA,gDACA,mDACA,2DACA,uDACA,yDACA,qDACA,uDACA,6DACA,8DACA,wDACA,yDACA,sDACA,iEACA,iEACA,0DACA,yDACA,0DACA,sDACA,sDACA,0DACA,4DACA,yDACA,wDACA,6DACA,gEACA,yCACA,gDACA,2DACA,4DACA,qEACA,yDACA,6CACA,kDACA,yDACA,2DACA,gDACA,kDACA,gEACA,uDACA,oEACA,6DACA,4DACA,4CACA,sDACA,iDACA,0DACA,wDACA,sDACA,qDACA,gDACA,yEACA,wDACA,wEACA,8EAIA,4DACA,gDACA,+CACA,yDACA,uDACA,mDACA,6DACA,2DACA,2DACA,wEACA,0DACA,sDAIA,yDACA,8EACA,+EACA,wEACA,yDACA,qEACA,8DACA,yDACA,yDACA,2DACA,wEACA,oDACA,2DACA,wEACA,oDACA,4DACA,4DACA,gEAIA,6DACA,kEACA,wDACA,oDACA,wDACA,sFACA,wFACA,sFACA,kEACA,+CACA,4CACA,8CACA,wDACA,2EACA,8FACA,8DACA,gEACA,wDACA,6DACA,6EACA,+CACA,yDACA,oEAKA,0CACA,iDACA,uDACA,oDACA,4DACA,6DACA,0DACA,oDACA,sDAEA,sDACA,4DACA,wDACA,oDACA,gEACA,mDACA,sDACA,6DACA,oEACA,sDACA,2DACA,sEACA,wEACA,yDACA,iEACA,qEACA,oEACA,qEACA,8DACA,mEACA,wEACA,wDACA,8DACA,yEACA,0EACA,wDACA,2EACA,yDAIA,kEACA,kEACA,yDACA,qEACA,gFACA,kFACA,8DACA,8DACA,qEACA,8EAIA,sDACA,2CACA,6CACA,gDACA,mEACA,2DACA,yDACA,+CACA,uDACA,2DACA,4CACA,2CACA,+CACA,qDACA,2CACA,qDACA,gEACA,kDACA,wCACA,oEACA,+DACA,yDACA,wEACA,qEAIA,qCACA,oDACA,yCACA,oDAIA,kEACA,kEACA,yEACA,4DACA,4DAMA,wEACA,kHACA,kFACA,8DACA,yEACA,kEACA,kEEnEA,qBC1QP,aACA,MCsFO,aGhGP,qBCaAA;;;;ARUC,IAAM,sCAAsC;AAC5C,IAAM,8BAA8B;AACpC,IAAM,wCAAwC;AAC9C,IAAM,qDAAqD;AAC3D,IAAM,8CAA8C;AACpD,IAAM,sCAAsC;AAC5C,IAAM,wCAAwC;AAC9C,IAAM,wCAAwC;AAC9C,IAAM,uCAAuC;AAC7C,IAAM,yCAAyC;AAK/C,IAAM,sCAAsC;AAC5C,IAAM,yCAAyC;AAC/C,IAAM,yCAAyC;AAC/C,IAAM,2CAA2C;AACjD,IAAM,0CAA0C;AAChD,IAAM,qEAAqE;AAC3E,IAAM,+DAA+D;AACrE,IA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CAAyC,MAAM;AAC1E,QAAM,sBAAsB,uDAAuD;IAC/E,wBAAwBC,2BAAA;EAA0B,CACrD;AACD,SAAO,0BAAgC;IACnC,aAAa,EAAE,SAAS,GAAG,KAAA,GAAQ;AAC/B,aAAO,iCAAiC;QACpC,GAAG;QACH;QACA,kBAAkB,EAAE,GAAG,SAAS,YAAY,QAAQ,WAAW,QAAQ,kBAAkB,WAAW,EAAA;QACpG,uBAAuB,QAAQ,WAAW,QAAQ,kBAAkB,aAAa;MAAA,CACpF;IACL;IACA;EAAA,CACH;AACL;AAEO,SAAS,gCACZ,QACyB;AACzB,SAAO,yCAA+C,MAAM;AAChE;AAEO,SAAS,yCAAyC,QAAiB;AACtE,SAAO;IACH;EAAA;AAER;AAUA,SAASA,6BAEP;AACE,MAAI,CAACC,mBAAkB;AACnB,IAAAA,oBAAmB;MACf,sBAAsB,0BAA0B,IAAI,CAAAC,OAAK,CAAC,SAAS,GAAGA,EAAC,CAAC;MACxE,oBAAoB;QAChB;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ,CAAC,SAAS,SAAS,gBAAgB,kBAAkB,QAAQ,WAAW,kBAAkB,YAAY;QACtG;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;QAAA;QAEJ;UACI;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA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;AACjC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;AC5dA,IAAAG,qBAAA;AAAA;AAAA;AAKA,QAAM;AAAA;AAAA,MAA6C;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,Q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AG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,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,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SA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A,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA;AAAA,MAEd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA;AAAA,MAEjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA;AAAA,MAEhB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAGA,iBAAiB;AAAA;AAAA,MAEf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,sBAAsB;AAAA;AAAA,MAEpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,sBAAsB;AAAA;AAAA,MAEpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA;AAAA,MAEjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA;AAAA,MAEhB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,wBAAwB;AAAA;AAAA,MAEtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAA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","names":["docsPath","signature","signature","signature","signature","signature","abi","signature","signature","signature","length","formatAbiItem","init_formatAbiItem","version","init_version","BaseError","init_version","docsPath","version","init_formatAbiItem","BaseError","docsPath","size","signature","formatAbiItem","BaseError","BaseError","size","size","BaseError","size","size","size","index","BaseError","encoder","l","s","crypto","toBytes","pad","crypto","init_utils","s","init_utils","l","toBytes","signature","BaseError","BaseError","address","size","hash","address","address","cacheKey","concatBytes","bytesRegex","integerRegex","init_regex","size","integerRegex","length","BaseError","index","init_regex","abi","index","abi","formatAbiItem","signature","init_formatAbiItem","address","abi","abi","docsPath","formatAbiItem","init_formatAbiItem","abi","signature","BaseError","init_cursor","size","data","length","consumed","value","size","init_cursor","abi","signature","formatAbiItem","init_formatAbiItem","value","address","BaseError","BaseError","docsPath","chain","hash","index","init_utils","address","init_formatAbiItem","init_utils","BaseError","docsPath","chain","abi","formatAbiItem","signature","init_utils","BaseError","BaseError","docsPath","abi","address","docsPath","BaseError","err","address","isLE","_32n","l","c","init_utils","toBytes","buffer","finished","init_utils","D","init_utils","hash","toBytes","pad","finished","isBytes","abytes","num","hexToNumber","_0n","bytesToHex","hexes","hexToBytes","e","concatBytes","pad","utf8ToBytes","_1n","gen","init_utils","_0n","modulo","_1n","gcd","_2n","P","c","num","bitLen","isLE","init_utils","_1n","c","s","P","_0n","base","wbits","init_utils","num","size","bytesToHex","Fn","toBytes","concatBytes","fromBytes","_3n","_4n","_1n","isBytes","Point","P","endo","_0n","a","modN","s","from","l","hexToBytes","utils","hash","randomBytes","e","sign","signature","isHex","o","_2n","tv5","c1","c2","isValid","init_utils","hash","create","init_utils","abytes","concatBytes","utf8ToBytes","hash","e","createHasher","Point","num","P","init_utils","P","_3n","_2n","c","concatBytes","_1n","_0n","e","signature","s","init_utils","createHasher","hash","signature","secp256k1","s","yParityOrV","recoveryBit","hash","signature","encode","BaseError","init_cursor","address","hash","signature","BaseError","docsPath","chain","BaseError","BaseError","e","docsPath","cause","formatted","address","init_stateOverride","BaseError","BaseError","formatAuthorizationList","init_transaction","init_block","init_transaction","init_block","chain","chain","base","address","sha256","sha256","init_sha256","version","sha256","init_sha256","version","init_blob","BaseError","size","hash","version","size","init_blob","init_cursor","docsPath","cause","chain","format","base","init_transaction","chain","prepareTransactionRequest","getChainId","chainId","from","gas","nonce","type","e","error","getBlock","block","init_estimateGas","BaseError","init_estimateGas","init_stateOverride","abi","address","init_estimateGas","init_log","abi","signature","docsPath","formatAbiItem","init_formatAbiItem","abi","isEqual","index","value","input","init_log","address","event","init_log","abi","address","abi","docsPath","isBytes","abytes","abool","numberToHexUnpadded","num","hexToNumber","_0n","bytesToHex","hasHexBuiltin","hexes","asciiToBase16","asciis","hexToBytes","bytesToNumberBE","bytesToNumberLE","numberToBytesBE","numberToBytesLE","ensureBytes","e","concatBytes","pad","inRange","isPosBig","aInRange","bitLen","_1n","createHmacDrbg","u8n","u8fr","gen","validateObject","validatorFns","memoized","bitMask","init_utils","version","init_version","version","init_errors","init_version","walk","BaseError","init_errors","docsPath","version","assertSize","size","SizeOverflowError","assertStartOffset","SliceOffsetOutOfBoundsError","assertEndOffset","charCodeToBase16","charCodeMap","pad","SizeExceedsPaddingSizeError","trim","assertSize","size","SizeOverflowError","assertStartOffset","SliceOffsetOutOfBoundsError","assertEndOffset","pad","SizeExceedsPaddingSizeError","trim","stringify","value","size","assertSize","index","charCodeToBase16","BaseError","encoder","padRight","pad","slice","assertStartOffset","assertEndOffset","toBigInt","InvalidBytesBooleanError","toNumber","trim","SizeOverflowError","SliceOffsetOutOfBoundsError","SizeExceedsPaddingSizeError","stringify","assert","concat","from","assertSize","hexes","size","IntegerOutOfRangeError","fromString","encoder","pad","slice","assertStartOffset","assertEndOffset","trimLeft","trim","validate","SizeOverflowError","SliceOffsetOutOfBoundsError","SizeExceedsPaddingSizeError","BaseError","stringify","toRpc","init_contract","BaseError","chain","abi","docsPath","chain","docsPath","cause","wait","args","split","init_utils","BaseError","abi","signature","formatAbiItem","init_formatAbiItem","abi","docsPath","formatAbiItem","signature","init_formatAbiItem","abi","docsPath","ccipRequest","init_ccip","BaseError","toRpc","base","data","offchainLookup","offchainLookupSignature","wait","args","size","init_contract","init_stateOverride","abi","address","abi","address","listeners","cleanup","poll","cacheKey","cache","init_log","abi","address","transport","eventName","args","init_log","shouldRetry","init_log","init_transaction","size","chain","base","key","BaseError","e","init_errors","hash","hash","chain","address","init_errors","BaseError","custom","res","init_utils","init_utils","chain","init_errors","address","chain","init_errors","chain","address","event","address","address","address","BaseError","address","address","version","e","init_log","address","hash","version","BaseError","init_blob","address","signature","blobs","commitments","proofs","v","s","signature","address","signature","promiseCache","uid","BaseError","chain","base","body","response","BaseError","integerRegex","base","bytesRegex","struct","init_typedData","init_regex","init_typedData","LruMap","init_lru","size","init_lru","LruMap","keccak256","assert","from","validate","fromHex","fromBytes","x","slice","prefix","toHex","concat","BaseError","stringify","size","assert","addressRegex","InvalidAddressError","checksum","address","hash","keccak256","from","toHex","validate","BaseError","bytesRegex","integerRegex","maxInt8","maxInt16","maxInt24","maxInt32","maxInt40","maxInt48","maxInt56","maxInt64","maxInt72","maxInt80","maxInt88","maxInt96","maxInt104","maxInt112","maxInt120","maxInt128","maxInt136","maxInt144","maxInt152","maxInt160","maxInt168","maxInt176","maxInt184","maxInt192","maxInt200","maxInt208","maxInt216","maxInt224","maxInt232","maxInt240","maxInt248","maxInt256","minInt8","minInt16","minInt24","minInt32","minInt40","minInt48","minInt56","minInt64","minInt72","minInt80","minInt88","minInt96","minInt104","minInt112","minInt120","minInt128","minInt136","minInt144","minInt152","minInt160","minInt168","minInt176","minInt184","minInt192","minInt200","minInt208","minInt216","minInt224","minInt232","minInt240","minInt248","minInt256","maxUint8","maxUint16","maxUint24","maxUint32","maxUint40","maxUint48","maxUint56","maxUint64","maxUint72","maxUint80","maxUint88","maxUint96","maxUint104","maxUint112","maxUint120","maxUint128","maxUint136","maxUint144","maxUint152","maxUint160","maxUint168","maxUint176","maxUint184","maxUint192","maxUint200","maxUint208","maxUint216","maxUint224","maxUint232","maxUint240","maxUint248","maxUint256","decodeParameter","checksumAddress","getArrayComponents","decodeArray","decodeTuple","decodeAddress","decodeBool","decodeBytes","decodeNumber","decodeString","checksum","wrap","address","slice","toNumber","sizeOfOffset","sizeOfLength","length","hasDynamicChild","consumed","value","size","toBigInt","encodeArray","encodeTuple","encodeAddress","integerRegex","encodeNumber","encodeBytes","encodeString","concat","assert","InvalidArrayError","BytesSizeMismatchError","BaseError","IntegerOutOfRangeError","fromString","index","staticCursor","NegativeOffsetError","PositionOutOfBoundsError","RecursiveReadLimitExceededError","init_cursor","size","BaseError","checksumAddress","size","data","decodeParameter","encode","concat","from","BytesSizeMismatchError","InvalidArrayError","init_cursor","encodePacked","address","assert","fromString","integerRegex","bytesRegex","BaseError","from","getEncodable","fromHex","getEncodableList","getEncodableBytes","getSizeOfLength","encode","BaseError","init_cursor","mod","_0n","pow2","modulo","invert","_1n","gcd","sqrt3mod4","_4n","sqrt5mod8","_5n","_8n","_2n","tonelliShanks","P","Field","FpLegendre","c","FpSqrt","_3n","validateField","FIELD_FIELDS","validateObject","FpPow","num","FpInvertBatch","nLength","bitLen","isLE","bitMask","numberToBytesLE","numberToBytesBE","bytesToNumberLE","bytesToNumberBE","getFieldBytesLength","getMinHashLength","mapHashToField","init_modular","init_utils","constTimeNegate","validateW","calcWOpts","bitMask","calcOffsets","_1n","validateMSMPoints","c","validateMSMScalars","s","getW","P","pointWindowSizes","wNAF","_0n","base","pointPrecomputes","pippenger","bitLen","wbits","validateBasic","validateField","validateObject","nLength","init_curve","init_modular","init_utils","validateSigVerOpts","abool","validatePointOpts","validateBasic","validateObject","numToSizedHex","num","size","bytesToHex","numberToBytesBE","weierstrassPoints","Fn","Field","toBytes","concatBytes","fromBytes","_3n","_4n","inRange","_1n","isBytes","bytesToNumberBE","ensureBytes","mod","aInRange","Point","memoized","FpInvertBatch","P","pippenger","endo","_0n","a","wNAF","validateOpts","weierstrass","modN","invert","s","from","l","DER","hexToBytes","utils","getMinHashLength","mapHashToField","bitMask","hash","randomBytes","e","sign","createHmacDrbg","signature","isHex","DERErr","_2n","init_weierstrass","init_curve","init_modular","init_utils","numberToHexUnpadded","getHash","hash","createCurve","create","weierstrass","init_shortw_utils","init_utils","init_weierstrass","sqrtMod","P","secp256k1P","_3n","pow2","_2n","Fpk1","secp256k1N","_0n","_1n","divNearest","secp256k1","init_secp256k1","init_shortw_utils","init_modular","Field","createCurve","mod","assert","signature","maxUint256","fromBytes","fromHex","InvalidSerializedSizeError","slice","s","yParity","extract","from","fromRpc","trimLeft","BaseError","size","stringify","from","fromRpc","address","signature","extract","hash","keccak256","concat","fromHex","toTuple","recoverAddress","recoverPublicKey","signature","s","secp256k1","from","init_secp256k1","assert","from","validate","slice","signature","recoverAddress","encode","size","concat","BaseError","init_utils","init_utils","address","address","hash","index","init_transaction","hash","hash","contracts","abi","address","result","BaseError","block","toRpc","call","abi","result","error","e","init_block","init_log","init_stateOverride","normalizeSignature","signature","BaseError","isArgOfType","validate","index","getAmbiguousTypes","init_abiItem","from","abi","validate","abiItem","slice","index","isArgOfType","getAmbiguousTypes","signature","normalizeSignature","keccak256","fromString","init_abiItem","BaseError","encode","abi","options","fromAbi","concat","from","item","encodeData","abi","args","fromAbi","abiFunction","getSelector","encode","concat","from","init_address","BaseError","encode","from","encodeData","call","address","init_address","init_utils","InvalidWrappedSignatureError","assert","from","magicBytes","unwrap","validate","wrap","slice","signature","concat","encode","BaseError","s","signature","address","chain","hash","signature","address","signature","hash","address","signature","hash","transport","hash","from","block","transport","address","transport","event","args","init_log","hash","address","address","signature","isValid","hash","init_estimateGas","uid","BaseError","chain","wait","body","init_http","init_http","init_contracts","init_block","init_transaction","serializeTransaction","signature","from","init_contracts","init_base","init_base","isBytes","anumber","wrap","c","encode","decode","l","from","padding","num","checksum","init_esm","hash","c","init_utils","wordlist","e","init_esm","init_utils","hash","s","signature","address","signature","signature","address","hash","size","RpcError","init_errors","init_errors","RpcError","isBytes","anumber","abytes","ahash","aexists","aoutput","clean","createView","rotr","bytesToHex","hasHexBuiltin","hexes","asciiToBase16","asciis","hexToBytes","concatBytes","pad","createHasher","randomBytes","init_utils","Chi","c","Maj","HashMD","SHA256_IV","init_md","init_utils","isLE","createView","aexists","abytes","buffer","aoutput","clean","finished","SHA256_K","SHA256_W","sha256","init_sha2","init_md","init_utils","HashMD","D","rotr","Chi","Maj","clean","SHA256_IV","createHasher","abool","isPosBig","anumber","numberToHexUnpadded","num","hexToNumber","_0n","bytesToNumberBE","bytesToHex","bytesToNumberLE","abytes","numberToBytesBE","hexToBytes","numberToBytesLE","inRange","aInRange","bitLen","_1n","createHmacDrbg","u8n","concatBytes","gen","validateObject","memoized","bitMask","init_utils","mod","_0n","pow2","modulo","invert","_1n","gcd","sqrt3mod4","_4n","sqrt5mod8","_5n","_8n","_2n","P","Field","tonelliShanks","_7n","e2","e3","_3n","FpLegendre","c","FpSqrt","validateField","FIELD_FIELDS","validateObject","FpPow","num","FpInvertBatch","nLength","anumber","getFieldBytesLength","getMinHashLength","mapHashToField","isLE","abytes","bytesToNumberLE","bytesToNumberBE","numberToBytesLE","numberToBytesBE","init_modular","init_utils","c","FpInvertBatch","validateW","calcWOpts","bitMask","calcOffsets","_1n","getW","P","pointWindowSizes","_0n","Point","isLE","validateField","Field","Fn","pointPrecomputes","wNAF","init_curve","init_utils","init_modular","base","hmac","init_hmac","init_utils","hash","ahash","abytes","pad","clean","aexists","finished","divNearest","_0n","bitMask","bitLen","_1n","abool","weierstrass","Fn","validateObject","pointToBytes","concatBytes","abytes","_3n","_4n","Point","memoized","P","hexToBytes","endo","bytesToHex","wNAF","randomBytes","getMinHashLength","num","l","mapHashToField","isBytes","s","utils","hash","ahash","hmac","_2n","size","r","DER","bytesToNumberBE","aInRange","extraEntropy","e","sign","createHmacDrbg","signature","recoverPublicKey","DERErr","init_weierstrass","init_hmac","init_utils","init_curve","init_modular","numberToHexUnpadded","sqrtMod","P","_3n","pow2","_2n","Fpk1","secp256k1","init_secp256k1","init_sha2","init_modular","init_weierstrass","Field","weierstrass","sha256","isBytes","anumber","abytes","ahash","aexists","aoutput","clean","createView","rotr","concatBytes","pad","createHasher","oidNist","init_utils","_HMAC","hmac","init_hmac","init_utils","hash","ahash","abytes","pad","clean","aexists","finished","Chi","c","Maj","HashMD","SHA256_IV","SHA512_IV","init_md","init_utils","isLE","createView","aexists","abytes","buffer","aoutput","clean","finished","init_md","init_utils","HashMD","clean","createHasher","fromBig","U32_MASK64","_32n","split","l","add","shrSH","shrSL","rotrSH","rotrSL","rotrBH","rotrBL","add3L","add3H","add4L","add4H","add5L","add5H","init_u64","s","SHA256_K","SHA256_W","SHA2_32B","_SHA256","K512","SHA512_Kh","SHA512_Kl","SHA512_W_H","SHA512_W_L","sha256","sha512","init_sha2","init_md","init_u64","init_utils","HashMD","D","rotr","Chi","Maj","clean","SHA256_IV","split","rotrSH","shrSH","rotrSL","shrSL","rotrBH","rotrBL","add4L","add4H","add5L","add5H","add","add3L","add3H","SHA512_IV","createHasher","oidNist","isBytes","isArrayOf","afn","astr","anumber","aArr","astrArr","anumArr","chain","wrap","c","encode","decode","alphabet","l","join","from","convertRadix","radix","num","checksum","init_base","sha256","Point","init_secp256k1","init_hmac","init_sha2","init_utils","init_base","secp256k1","sha256","createView","concatBytes","abytes","hmac","sha512","version","c","index","hash","signature","e","isSolanaError","index","ORDERED_ERROR_NAMES","padBytes","slice","index","encoder","decoder","SolanaError","size","buffer","alphabet","base","charCodeToBase16","TextDecoder","TextEncoder","createEncoder","c","SolanaError","SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE","hexBytes","createDecoder","combineCodec","buffer","decoder","address","index","SolanaError","SolanaError","isAddress","base58Encoder","mod","pow2","SolanaError","address","e","encode","decode","Endian","combineCodec","createEncoder","createDecoder","size","newOffset","createEncoder","createDecoder","slice","combineCodec","getBase16Decoder","SolanaError","index","getEncodedSize","isFixedSize","getU8Encoder","transformEncoder","getU8Decoder","transformDecoder","l","encoder","decoder","containsBytes","init_index_node","AccountRole","isAddress","SolanaError","combineCodec","assertValidBaseString","alphabet","SolanaError","partitionLeadingZeroes","getBigIntFromBaseX","base","getBaseXFromBigInt","getU8Encoder","getU8Decoder","getStructEncoder","getStructDecoder","getArrayEncoder","getShortU16Encoder","getArrayDecoder","getShortU16Decoder","createEncoder","createDecoder","version","combineCodec","transformEncoder","getBase58Encoder","getAddressEncoder","getAddressDecoder","getBase58Decoder","transformDecoder","address","TYPE","index","AccountRole","getAddressComparator","isWritableRole","isSignerRole","l","getBaseXEncoder","getBaseXDecoder","SolanaError","signature","randomBytes","isValid","privateKey","signature","getBytesEncoder","SolanaError","address","index","SYSTEM_PROGRAM_ADDRESS","isAdvanceNonceAccountInstructionData","isAddress","signatureBytes","signTransaction","SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT","index","appendTransactionMessageInstruction","SolanaError","signature","context","traverse","traverseSequential","traverseParallel","traverseSingle","SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_INSTRUCTION_PLAN_KIND","candidate","message","appendTransactionMessageInstructions","getAbortablePromise","getTransactionMessageSize","TRANSACTION_SIZE_LIMIT","isSolanaError","SOLANA_ERROR__INSTRUCTION_PLANS__MESSAGE_CANNOT_ACCOMMODATE_PLAN","SOLANA_ERROR__INVARIANT_VIOLATION__INVALID_TRANSACTION_PLAN_KIND","isAddress","version","SolanaError","transformEncoder","getAddressDecoder","getSignaturesToEncode","signature","getSignaturesEncoder","getU8Encoder","getStructEncoder","getBytesEncoder","SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO","address","transformDecoder","getStructDecoder","getArrayDecoder","getBytesDecoder","getU8Decoder","combineCodec","index","SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO","getArrayEncoder","getAddressEncoder","getUtf8Encoder","fixDecoderSize","getTupleDecoder","getUtf8Decoder","SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY","getTupleEncoder","getHiddenPrefixDecoder","SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED","encoder","SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE","signatureBytes","OffchainMessageContentFormat","unwrapBigIntValueObject","wrapBigIntValueObject","traverse","c","pipe","c","SolanaError","stringify","e","normalizeHeaders","AbortController","args","setMaxListeners","init_index_node","createExplicitAbortToken","e","EXPLICIT_ABORT_TOKEN","AbortController","EventTarget","args","setMaxListeners","e","SolanaError","AbortController","args","setMaxListeners","getAllowedNumericKeypaths","memoizedKeypaths","c","concat","buffer","toArrayBuffer","e","PerMessageDeflate","num","data","e","PerMessageDeflate","concat","toArrayBuffer","Receiver","num","PerMessageDeflate","Sender","Event","EventTarget","extension","http","randomBytes","createHash","URL","PerMessageDeflate","Receiver","Sender","WebSocket","address","key","e","WebSocket","createWebSocketStream","err","open","protocol","http","createHash","extension","PerMessageDeflate","subprotocol","WebSocket","WebSocketServer","index","version","WebSocket","s","EventTarget","index_node_default","args","setMaxListeners","WebSocketImpl","createSolanaJsonRpcIntegerOverflowError","e","index","c","pipe","transformChannelInboundMessages","transformChannelOutboundMessages","cache","AbortController","args","setMaxListeners","SolanaError","address","isAddress","offchainMessageEnvelope","SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING","signature","transaction","o","TextEncoder","e","base58Decoder","SolanaError","signature","safeRace","getTimeoutPromise","AbortController","args","setMaxListeners","lamports","l","createRecentSignatureConfirmationPromiseFactory","signature","e","commitmentComparator","index","createKeyPairSignerFromPrivateKeyBytes","init_esm","homedir","e","mkdir","join","homedir","chain","require_constants","buffer","index","assert","stringify","idx","stream","buffer","c","err","s2","util","version","address","assert","Request","err","assert","util","session","require_constants","c","Buffer","Buffer","require_constants","buffer","assert","buffer","assert","encoder","assert","c","o","index","keys","require_util","performance","assert","c","isAborted","index","e","FormData","entry","assert","decoder","buffer","util","FormData","assert","c","chunk","value","e","assert","util","mod","exports","finished","buffer","assert","util","headers","pipe","buffer","assert","http","util","Request","connect","err","client","size","util","origin","util","pool","dispatcher","util","origin","util","result","origin","Buffer","address","buffer","Buffer","version","address","URL","origin","protocol","opts","assert","shouldRetry","size","assert","util","consume","buffer","assert","util","assert","finished","util","res","opaque","assert","util","body","assert","util","assert","util","index","mockDispatch","replyParameters","newMockDispatch","promisify","promisify","result","crypto","normalizeHeaders","writeFile","readFile","mkdir","dirname","setTimeout","clearTimeout","normalizeHeaders","hash","util","require_global","assert","util","assert","normalizeHeaders","normalizeHeaders","cacheKey","util","cacheKey","index","key","entries","entry","assert","require_cache","assert","util","normalizeHeaders","cacheKey","isStale","handleResult","headers","opts","result","util","normalizeHeaders","opts","cacheKey","VERSION","size","assert","util","size","Headers","o","Headers","util","isAborted","assert","Response","require_request","Headers","util","assert","setMaxListeners","Request","assert","crypto","metadata","Request","isAborted","assert","finished","fetch","e","buffer","body","require_util","assert","require_cache","assert","Request","index","e","request","cache","cache","require_constants","require_util","stringify","assert","stringify","Headers","require_constants","uid","require_util","e","toArrayBuffer","buffer","num","buffer","randomFillSync","uid","Headers","assert","crypto","validate","require_permessage_deflate","PerMessageDeflate","require_receiver","assert","PerMessageDeflate","buffer","body","require_sender","node","require_websocket","toArrayBuffer","WebSocket","buffer","e","require_util","e","util","fetch","WebSocket","CACHE_TTL_MS","init_index_node","fixDecoderSize","getBytesDecoder","getStructDecoder","getU64Decoder","getU16Decoder","getOptionDecoder","getAddressDecoder","getU32Decoder","getBooleanDecoder","address","isTransactionSigner","kitIsTransactionSigner","getAddressEncoder","transformEncoder","getStructEncoder","getU8Encoder","getU64Encoder","AccountRole","ASSOCIATED_TOKEN_ERROR__INVALID_OWNER","associatedTokenErrorMessages","AccountState","init_index_node","transformEncoder","getStructEncoder","getU8Encoder","getU32Encoder","appendTransactionMessageInstruction","init_src","init_index_node","x402Version","tx","NETWORKS","init_src","init_index_node","x402Version","tx","NETWORKS","homedir","join","mkdir","writeFile","readFileSync","existsSync","util","e","objectUtil","s","errorUtil","errorMap","base64Regex","version","ctx","result","index","issues","elements","size","e","processed","base","result","r","ZodFirstPartyTypeKind","decoder","x402Version","extension","fetch","cache","cacheKey","payload","response","randomBytes","x402Version","signature","version","x402Version","getAddress","signature","x402Version","getAddress","signature","from","encodeFunctionData","x402Version","signature","version","readContract","signTransaction","getTransactionCount","estimateFeesPerGas","confidence","supportsToolCalling","supportsVision","decision","join","join","homedir","join","__filename","require","LOG_DIR","join","homedir","e","join","LOG_DIR","e","DEFAULT_TTL_MS","createHash","canonicalize","TIMESTAMP_PATTERN","crypto","hashMessage","hash","l","c","escapeRegex","originalChars","createHash","hash","join","dirname","homedir","join","homedir","DEFAULT_CONFIG","e","randomBytes","join","homedir","chain","sanitized","size","existsSync","readFileSync","buffer","baseUrl","createKeyPairSignerFromPrivateKeyBytes","balanceMonitor","SolanaBalanceMonitor","registerExactSvmScheme","responseCache","s","mkdir","port","writeFile","c","normalizedModel","cacheKey","bodyChunks","index","execFileSync","homedir","existsSync","readFileSync","address","SolanaBalanceMonitor","chain","existsSync","readFileSync","deriveSolanaKeyBytes","registerExactSvmScheme","createKeyPairSignerFromPrivateKeyBytes","s","address","l","pad","BalanceMonitor","homedir","execFileSync","existsSync","MNEMONIC_FILE","setupSolana","deriveSolanaKeyBytes","getSolanaAddress","readFileSync"]} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index 5764060..7615763 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -259,7 +259,22 @@ function printSetupHeader(): void { console.log(); } -function printSetupSummary(address: string, email: string | undefined): void { +/** + * Live USDC balance on Base for the wallet — queried via BalanceMonitor. + * Optional: if the network is unavailable we render the box without it + * rather than blocking setup completion. + */ +type SetupBalanceSnapshot = { + balanceUSD: string; + isLow: boolean; + isEmpty: boolean; +}; + +function printSetupSummary( + address: string, + email: string | undefined, + balance: SetupBalanceSnapshot | undefined, +): void { const lines = [ c(ANSI.bold + ANSI.green, "✓ Wallet ready"), "", @@ -272,18 +287,53 @@ function printSetupSummary(address: string, email: string | undefined): void { } lines.push(c(ANSI.dim, "Signing ") + "OKX TEE " + c(ANSI.dim, "(no local private key)")); - // Funding hint. OKX onchainos x402 signing currently only supports Base - // (Solana support hasn't shipped yet — see src/proxy.ts warning). USDC on - // Base is the only thing that actually unlocks paid models, so name the - // chain explicitly instead of saying "USDC" alone, which led users to - // bridge to the wrong network. + // Live balance row, severity-tagged. Three buckets: + // empty (< $0.0001) → red ⚠, explicit "fund to unlock paid models" + // low ($0.0001..$1) → yellow ⚠, suggested top-up + // ok (≥ $1) → green ✓ + // Solana support isn't shipped yet on OKX onchainos (see src/proxy.ts), + // so the balance shown is the Base-chain USDC only — name the chain + // explicitly so users don't bridge USDC to the wrong network. lines.push(""); - lines.push( - c(ANSI.dim, "Fund ") + "send " + c(ANSI.bold, "USDC on Base") + " to the address above", - ); - lines.push( - c(ANSI.dim, " ") + c(ANSI.dim, "(free models work at $0; $5 unlocks paid tier)"), - ); + if (!balance) { + lines.push( + c(ANSI.dim, "Balance ") + c(ANSI.dim, "(could not query Base RPC — check your network)"), + ); + } else if (balance.isEmpty) { + lines.push( + c(ANSI.dim, "Balance ") + + c(ANSI.bold, "$0.00 USDC on Base") + + " " + + c(ANSI.yellow, "⚠ empty — fund to unlock paid models"), + ); + } else if (balance.isLow) { + lines.push( + c(ANSI.dim, "Balance ") + + c(ANSI.bold, balance.balanceUSD + " USDC on Base") + + " " + + c(ANSI.yellow, "⚠ low (recommend $5+ for stable paid usage)"), + ); + } else { + lines.push( + c(ANSI.dim, "Balance ") + + c(ANSI.bold, balance.balanceUSD + " USDC on Base") + + " " + + c(ANSI.green, "✓ ready for paid models"), + ); + } + + // Only show the funding walkthrough when the user actually needs to fund. + // Avoids cluttering the box for already-funded users on every setup run. + const needsFunding = !balance || balance.isEmpty || balance.isLow; + if (needsFunding) { + lines.push(""); + lines.push(c(ANSI.dim, "Fund via OKX (Base network, USDC):")); + lines.push(c(ANSI.dim, " 1. ") + "Open the OKX app → Wallet"); + lines.push( + c(ANSI.dim, " 2. ") + "Send USDC on " + c(ANSI.bold, "Base") + " to the address above", + ); + lines.push(c(ANSI.dim, " 3. ") + c(ANSI.dim, "~$5 covers thousands of paid requests")); + } const width = Math.max(...lines.map((l) => stripAnsi(l).length)); const horiz = "─".repeat(width + 2); @@ -295,6 +345,30 @@ function printSetupSummary(address: string, email: string | undefined): void { console.log(" └" + horiz + "┘"); } +/** + * Query the wallet's Base-chain USDC balance via BalanceMonitor. Returns + * undefined on any failure (network, RPC, contract read) so the caller can + * fall back to a "could not query" notice rather than aborting setup. + * + * Imported lazily to keep the cli.ts import graph slim and avoid loading + * viem until we actually need it. + */ +async function fetchSetupBalanceSnapshot( + address: string, +): Promise { + try { + const { BalanceMonitor } = await import("./balance.js"); + const info = await new BalanceMonitor(address).checkBalance(); + return { + balanceUSD: info.balanceUSD, + isLow: info.isLow, + isEmpty: info.isEmpty, + }; + } catch { + return undefined; + } +} + async function cmdSetup(): Promise { printSetupHeader(); @@ -324,8 +398,13 @@ async function cmdSetup(): Promise { const detection = await detectOnchainosWallet(); if (detection.kind === "ok") { console.log(" " + c(ANSI.green, "✓") + " Already signed in"); + process.stdout.write(" " + c(ANSI.yellow, "⏳") + " Checking USDC balance on Base…"); + const bal = await fetchSetupBalanceSnapshot(detection.address); + process.stdout.write( + "\r " + c(ANSI.green, "✓") + " Balance checked \n", + ); console.log(); - printSetupSummary(detection.address, detection.email); + printSetupSummary(detection.address, detection.email, bal); console.log(); console.log( " " + c(ANSI.cyan, "→") + " Restart OpenClaw: " + c(ANSI.bold, "openclaw gateway restart"), @@ -405,8 +484,11 @@ async function cmdSetup(): Promise { process.exit(1); } + process.stdout.write(" " + c(ANSI.yellow, "⏳") + " Checking USDC balance on Base…"); + const balanceAfter = await fetchSetupBalanceSnapshot(after.address); + process.stdout.write("\r " + c(ANSI.green, "✓") + " Balance checked \n"); console.log(); - printSetupSummary(after.address, after.email); + printSetupSummary(after.address, after.email, balanceAfter); console.log(); console.log( " " + c(ANSI.cyan, "→") + " Restart OpenClaw: " + c(ANSI.bold, "openclaw gateway restart"),